<?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>23356</bug_id>
          
          <creation_ts>2009-01-15 14:52:22 -0800</creation_ts>
          <short_desc>Land new files in WebCore/platform related to accelerated compositing</short_desc>
          <delta_ts>2009-03-02 11:51:52 -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>Layout and Rendering</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>P1</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>23359</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Simon Fraser (smfr)">simon.fraser</reporter>
          <assigned_to name="Simon Fraser (smfr)">simon.fraser</assigned_to>
          <cc>cmarrin</cc>
    
    <cc>dino</cc>
    
    <cc>hyatt</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>105968</commentid>
    <comment_count>0</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-01-15 14:52:22 -0800</bug_when>
    <thetext>Bug to track the landing of new files in platform/ related to accelerate compositing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>105979</commentid>
    <comment_count>1</comment_count>
      <attachid>26773</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-01-15 15:11:47 -0800</bug_when>
    <thetext>Created attachment 26773
Patch, changelog</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106008</commentid>
    <comment_count>2</comment_count>
      <attachid>26773</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2009-01-15 18:48:24 -0800</bug_when>
    <thetext>Comment on attachment 26773
Patch, changelog

In my first pass, I just commented on style issue.

General issues:
- We like using the 2 clause BSD license for new code.
- I am not a fan of the WK prefix, especially in WebCore.  I would prefer using &quot;WebCore&quot;, so, WKLayer would become WebCoreLayer.


&gt; +/*
&gt; + * Copyright (C) 2009 Apple Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer. 
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution. 
&gt; + * 3.  Neither the name of Apple Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission. 
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */

We prefer to use a 2 clause license these days.

&gt; +namespace WebCore {
&gt; +
&gt; +struct LayerHitTestData* GraphicsLayer::sHitTestData = 0;

The = 0 is not necessary here.

&gt; +void
&gt; +GraphicsLayer::FloatValueList::insert(float key, float value, const TimingFunction* timingFunction)

The void should be on the same line as the rest of the declaration.

&gt; +
&gt; +GraphicsLayer::GraphicsLayer(GraphicsLayerClient* client)
&gt; +: m_client(client)
&gt; +, m_anchorPoint(0.5f, 0.5f)
&gt; +, m_opacity(1.0f)
&gt; +, m_anchorZ(0.0f)
&gt; +#ifndef NDEBUG
&gt; +, m_zPosition(0.0f)
&gt; +#endif
&gt; +, m_backgroundColorSet(false)
&gt; +, m_contentsOpaque(false)
&gt; +, m_preserves3D(false)
&gt; +, m_backfaceVisibility(true)
&gt; +, m_usingTiledLayer(false)
&gt; +, m_masksToBounds(false)
&gt; +, m_drawsContent(false)
&gt; +, m_paintingPhase(GraphicsLayerPaintAllMask)
&gt; +, m_parent(0)
&gt; +#ifndef NDEBUG
&gt; +, m_repaintCount(0)
&gt; +#endif
&gt; +{
&gt; +}

The initialization list should be indented.


&gt; +bool
&gt; +GraphicsLayer::animateFloat(AnimatedPropertyID, const FloatValueList&amp;, const Animation*, double /*beginTime*/)

bool should be on the same line as the declaration.


&gt; +String GraphicsLayer::propertyIdToString(AnimatedPropertyID property)
&gt; +{
&gt; +    switch(property) {

Needs a space between the switch and the (.

&gt; +        case AnimatedPropertyWebkitTransform: return &quot;transform&quot;;
&gt; +        case AnimatedPropertyBackgroundColor: return &quot;backgroundColor&quot;;
&gt; +        case AnimatedPropertyOpacity: return &quot;opacity&quot;;
&gt; +        default: return &quot;&quot;;

The return bodies should be on their own lines.


&gt; +    }
&gt; +}
&gt; +
&gt; +int GraphicsLayer::findAnimationEntry(AnimatedPropertyID property, short index) const
&gt; +{
&gt; +    for (size_t i = 0; i &lt; m_animations.size(); ++i)
&gt; +        if (m_animations[i].property == property &amp;&amp; m_animations[i].index == index)
&gt; +            return (int) i;

Please use a c++ style cast.

&gt; +    if (i &gt;= 0) {
&gt; +        m_animations[i].isCurrent = true;
&gt; +        m_animations[i].beginTime = beginTime;
&gt; +    }
&gt; +    else {

else should be on the same line as the }

&gt; +        // no animation yet, add it
&gt; +        i = (int) m_animations.size();

C++ style cast.

&gt; +            --size;
&gt; +        }
&gt; +        else

else should be on the same line.

&gt; +            --size;
&gt; +        }
&gt; +        else

else should be on the same line.

&gt; +
&gt; +    int x = (int)roundf(contentPoint.x());
&gt; +    int y = (int)roundf(contentPoint.y());

Please use c++ style casts.

&gt; +
&gt; +    ASSERT(sHitTestData);
&gt; +    return m_client-&gt;contentsContainPoint(this, IntPoint(x, y), m_paintingPhase, sHitTestData);
&gt; +}

&gt; +void GraphicsLayer::dumpProperties(TextStream&amp; ts, int indent) const
&gt; +{
&gt; +    writeIndent(ts, indent+1);
&gt; +//    ts &lt;&lt; &quot;(CALayer &quot; &lt;&lt; (void*)m_layer.get() &lt;&lt; &quot;, transformlayer &quot; &lt;&lt; (void*)m_transformLayer.get() &lt;&lt; &quot;)\n&quot;;

Please don&apos;t check in commented out code.

The indent+1&apos;s should have spaces around + and the casts to void* should use c++ style casts.


&gt; +++ b/WebCore/platform/graphics/GraphicsLayer.h
&gt; @@ -0,0 +1,402 @@
&gt; +/*
&gt; + * Copyright (C) 2009 Apple Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer. 
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution. 
&gt; + * 3.  Neither the name of Apple Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission. 
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */

2 clause please.

&gt; +
&gt; +    private:
&gt; +        float mKey;
&gt; +        float mVal;
&gt; +        OwnPtr&lt;TimingFunction&gt; mTF;
&gt; +    };

We use m_. You can also make these names longer, m_value and m_timingFunction. 

&gt; +    class FloatValueList : public Vector&lt;FloatValue&gt; {
&gt; +    public:
&gt; +        void insert(float key, float val, const TimingFunction* tf);
&gt; +    };

We tend to prefer composition over inheritance for basic data structures. 

&gt; +    private:
&gt; +        float mKey;
&gt; +        OwnPtr&lt;TransformOperations&gt; mVal;
&gt; +        OwnPtr&lt;TimingFunction&gt; mTF;

Same m_ issue.

&gt; +    };
&gt; +    
&gt; +    // Used to store a series of transforms in a keyframe list.
&gt; +    class TransformValueList : public Vector&lt;TransformValue&gt; {
&gt; +    public:
&gt; +        typedef Vector&lt;TransformOperation::OperationType&gt; FunctionList;
&gt; +        
&gt; +        void insert(float key, const TransformOperations* value, const TimingFunction* timingFunction);
&gt; +        
&gt; +        // return a list of the required functions. List is empty if keyframes are not valid
&gt; +        // If return value is true, functions contain rotations of &gt;= 180 degrees
&gt; +        void makeFunctionList(FunctionList&amp; list, bool&amp; isValid, bool&amp; hasBigRotation) const;
&gt; +    };

Same composition over inheritance issue.

&gt; +
&gt; +    static GraphicsLayer* createGraphicsLayer(GraphicsLayerClient*);    // factory function

I don&apos;t think the comment is necessary.

&gt; +protected:
&gt; +    GraphicsLayer(GraphicsLayerClient*);
&gt; +
&gt; +    void dumpProperties(TextStream&amp; ts, int indent) const;
&gt; +    String dumpName() const { return String(&quot;GraphicsLayer&quot;); }
&gt; +
&gt; +    // returns -1 if not found
&gt; +    int findAnimationEntry(AnimatedPropertyID property, short index) const;
&gt; +    bool addAnimationEntry(AnimatedPropertyID property, short index, double beginTime, 
&gt; +                            bool isTransition, const Animation* transition);
&gt; +
&gt; +    virtual void removeAnimation(int /*inAnimIndex*/, bool /*reset*/) {}
&gt; +    void removeAllAnimationsForProperty(AnimatedPropertyID property);
&gt; +
&gt; +protected:

No need to have a second protected: label here.

&gt; +enum {
&gt; +    GraphicsLayerPaintBackgroundMask     = (1 &lt;&lt; 0),
&gt; +    GraphicsLayerPaintForegroundMask     = (1 &lt;&lt; 1),
&gt; +    GraphicsLayerPaintAllMask            = (unsigned int)-1

Please use a c++ style cast.


&gt; +namespace WebCore {
&gt; +
&gt; +class GraphicsLayerCA : public GraphicsLayer
&gt; +{

{ should be on the line with the class declaration.

&gt; +    GraphicsLayerCA(GraphicsLayerClient* client);

no need for the parameter name.

&gt; +
&gt; +    virtual void setTransform(const TransformationMatrix&amp; t);
&gt; +
&gt; +    virtual void setChildrenTransform(const TransformationMatrix&amp; t);

No need for parameter name.

&gt; +static NSValue* createTransformFunctionValue(const GraphicsLayer::TransformValue&amp; transformValue, size_t index,
&gt; +                                                     const IntSize&amp; size, TransformOperation::OperationType transformType)
&gt; +{
&gt; +    TransformOperation* op = (index &gt;= transformValue.value()-&gt;operations().size()) ? 0 : transformValue.value()-&gt;operations()[index].get();
&gt; +    
&gt; +    switch (transformType) {
&gt; +        case TransformOperation::ROTATE:
&gt; +            return [NSNumber numberWithFloat:op ? (float) (static_cast&lt;RotateTransformOperation*&gt;(op)-&gt;angle() * M_PI / 180) : 0];
&gt; +
&gt; +        case TransformOperation::SCALE_X:
&gt; +            return [NSNumber numberWithFloat:op ? (float) static_cast&lt;ScaleTransformOperation*&gt;(op)-&gt;x() : 0];
&gt; +        case TransformOperation::SCALE_Y:
&gt; +            return [NSNumber numberWithFloat:op ? (float) static_cast&lt;ScaleTransformOperation*&gt;(op)-&gt;y() : 0];
&gt; +
&gt; +        case TransformOperation::TRANSLATE_X:
&gt; +            return [NSNumber numberWithFloat:op ? (float) static_cast&lt;TranslateTransformOperation*&gt;(op)-&gt;x(size) : 0];
&gt; +        case TransformOperation::TRANSLATE_Y:
&gt; +            return [NSNumber numberWithFloat:op ? (float) static_cast&lt;TranslateTransformOperation*&gt;(op)-&gt;x(size) : 0];
&gt; +        
&gt; +        case TransformOperation::SCALE:
&gt; +        case TransformOperation::TRANSLATE:
&gt; +        case TransformOperation::SKEW_X:
&gt; +        case TransformOperation::SKEW_Y:
&gt; +        case TransformOperation::SKEW:
&gt; +        case TransformOperation::MATRIX:
&gt; +        case TransformOperation::IDENTITY:
&gt; +        case TransformOperation::NONE:
&gt; +        {
&gt; +            TransformationMatrix t;
&gt; +            if (op)
&gt; +                op-&gt;apply(t, size);
&gt; +            CATransform3D cat;
&gt; +            copyTransform(cat, t);
&gt; +            return [NSValue valueWithCATransform3D:cat];
&gt; +        }
&gt; +    }
&gt; +    
&gt; +    return 0;
&gt; +}
&gt; +
&gt; +static String getAnimationValueFunction(TransformOperation::OperationType transformType)
&gt; +{
&gt; +    switch (transformType) {
&gt; +        case TransformOperation::ROTATE: return String(&quot;rotateZ&quot;);
&gt; +        case TransformOperation::SCALE_X: return String(&quot;scaleX&quot;);
&gt; +        case TransformOperation::SCALE_Y: return String(&quot;scaleY&quot;);
&gt; +        case TransformOperation::TRANSLATE_X: return String(&quot;translateX&quot;);
&gt; +        case TransformOperation::TRANSLATE_Y: return String(&quot;translateY&quot;);
&gt; +        default: return String(&quot;&quot;);
&gt; +    }
&gt; +}
&gt; +

&gt; +    GraphicsLayerCA* childLayerCA = static_cast&lt;GraphicsLayerCA*&gt;(childLayer);
&gt; +    GraphicsLayerCA* siblingLayerCA = static_cast&lt;GraphicsLayerCA*&gt;(sibling);
&gt; +    if (found) {
&gt; +        [hostLayerForSublayers() insertSublayer:childLayerCA-&gt;layerForSuperlayer() below:siblingLayerCA-&gt;layerForSuperlayer()];
&gt; +    } else {

The braces around the if are not necessary.

&gt; +    if (found) {
&gt; +        [hostLayerForSublayers() insertSublayer:childLayerCA-&gt;layerForSuperlayer() above:siblingLayerCA-&gt;layerForSuperlayer()];
&gt; +    } else {

Same here.

&gt; +bool
&gt; +GraphicsLayerCA::animateFloat(AnimatedPropertyID property, const FloatValueList&amp; values, const Animation* animation, double beginTime)

bool should be on the same line.

&gt; +void
&gt; +GraphicsLayerCA::setBasicAnimation(AnimatedPropertyID property, const String&amp; valueFunction, short index, void* fromVal, void* toVal, 
&gt; +                            bool isTransition, const Animation* transition, double beginTime)

void on the same line.

&gt; +void
&gt; +GraphicsLayerCA::setKeyframeAnimation(AnimatedPropertyID property, const String&amp; valueFunction, short index, void* keys, void* values, void* timingFunctions, 
&gt; +                                    bool isTransition, const Animation* anim, double beginTime)

Same issue.

&gt; +        id val = [layer valueForKeyPath:keyPath];
&gt; +        switch(property) {

Space needed after switch. 

&gt; +#import &lt;QuartzCore/QuartzCore.h&gt;
&gt; +
&gt; +namespace WebCore {
&gt; +class GraphicsLayer;
&gt; +}

class should be indented.

&gt; +@interface WKLayer : CALayer 
&gt; +{
&gt; +    WebCore::GraphicsLayer* _layerOwner;
&gt; +    float _contentsScale;
&gt; +}
&gt; +
&gt; +// implements WKLayerAdditions
&gt; +// implements ExtendedDescription

I don&apos;t think these comments are necessary.

&gt; +        // smaller than the layer bounds (e.g. tiled layers)
&gt; +        CGRect clipBounds = CGContextGetClipBoundingBox(ctx);
&gt; +        IntRect clip(enclosingIntRect(clipBounds));
&gt; +        layerContents-&gt;paintGraphicsLayerContents(context, clip);
&gt; +
&gt; +        context.setUseFontSmoothing(wasSmoothing);
&gt; +
&gt; +        [NSGraphicsContext restoreGraphicsState];
&gt; +    }
&gt; +    else {

Either the else should be on the same line as the }, the #ifndef should surround the entire else block.

&gt; +#ifndef NDEBUG
&gt; +        ASSERT_NOT_REACHED();
&gt; +
&gt; +        // FIXME: ideally we&apos;d avoid calling -setNeedsDisplay on a layer that is a plain color,
&gt; +        // so CA never makes backing store for it (which is what -setNeedsDisplay will do above).
&gt; +        CGContextSetRGBFillColor(ctx, 0.0f, 1.0f, 0.0f, 1.0f);
&gt; +        CGRect aBounds = [layer bounds];
&gt; +        CGContextFillRect(ctx, aBounds);
&gt; +#endif
&gt; +    }
&gt; +

&gt; +@implementation CALayer(ExtendedDescription)
&gt; +
&gt; +- (NSString*)_descriptionWithPrefix:(NSString*)inPrefix
&gt; +{
&gt; +    CGRect aBounds  = [self bounds];
&gt; +    CGPoint aPos    = [self position];
&gt; +    CATransform3D t = [self transform];

We ususally don&apos;t line up the =&apos;s.

&gt; +    CALayer* curLayer;
&gt; +    while ((curLayer = [sublayersEnum nextObject]))
&gt; +    {
&gt; +        [curDesc appendString:[curLayer _descriptionWithPrefix:sublayerPrefix]];
&gt; +        //[curDesc appendString:@&quot;\n&quot;];

{ should be on the same line as the while, and the commented out code should be removed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106156</commentid>
    <comment_count>3</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-01-16 18:10:17 -0800</bug_when>
    <thetext>I&apos;ll fix all these issues.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106812</commentid>
    <comment_count>4</comment_count>
      <attachid>26773</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-01-23 15:55:48 -0800</bug_when>
    <thetext>Comment on attachment 26773
Patch, changelog

&gt; +struct LayerHitTestData* GraphicsLayer::sHitTestData = 0;

The use of a global here seems like a really ugly thing. Is there any way around it?

&gt; +void
&gt; +GraphicsLayer::FloatValueList::insert(float key, float value, const TimingFunction* timingFunction)

Having the void on a separate line is not our usual formatting.

&gt; +GraphicsLayer::GraphicsLayer(GraphicsLayerClient* client)
&gt; +: m_client(client)

We normally indent one tab stop of these initialization lists.

&gt; +, m_anchorPoint(0.5f, 0.5f)
&gt; +, m_opacity(1.0f)
&gt; +, m_anchorZ(0.0f)
&gt; +#ifndef NDEBUG
&gt; +, m_zPosition(0.0f)
&gt; +#endif

Mitz and I and a few others talked about cases like this, and our consensus is that in cases like this where the &quot;f&quot; doesn&apos;t matter and a conversion would be done correctly and quietly, we don&apos;t use the &quot;f&quot;. So we&apos;d use &quot;0.5&quot;, &quot;1&quot;, and &quot;0&quot; rather than &quot;0.5f&quot;, &quot;1.0f&quot;, and &quot;0.0f&quot;.

&gt; +void GraphicsLayer::setPosition(const FloatPoint&amp; point)
&gt; +{
&gt; +    m_position = point;
&gt; +}
&gt; +
&gt; +void GraphicsLayer::setAnchorPoint(const FloatPoint&amp; point, float anchorZ)
&gt; +{
&gt; +    m_anchorPoint = point;
&gt; +    m_anchorZ = anchorZ;
&gt; +}
&gt; +
&gt; +void GraphicsLayer::setSize(const FloatSize&amp; size)
&gt; +{
&gt; +    m_size = size;
&gt; +}
&gt; +
&gt; +void GraphicsLayer::setTransform(const TransformationMatrix&amp; t)
&gt; +{
&gt; +    m_transform = t;
&gt; +}
&gt; +
&gt; +void GraphicsLayer::setChildrenTransform(const TransformationMatrix&amp; t)
&gt; +{
&gt; +    m_childrenTransform = t;
&gt; +}
&gt; +
&gt; +void GraphicsLayer::setPreserves3D(bool preserves3D)
&gt; +{
&gt; +    m_preserves3D = preserves3D;
&gt; +}
&gt; +
&gt; +void GraphicsLayer::setMasksToBounds(bool masksToBounds)
&gt; +{
&gt; +    m_masksToBounds = masksToBounds;
&gt; +}
&gt; +
&gt; +void GraphicsLayer::setDrawsContent(bool drawsContent)
&gt; +{
&gt; +    m_drawsContent = drawsContent;
&gt; +}
&gt; +
&gt; +void GraphicsLayer::setBackgroundColor(const Color&amp; inColor, const Animation*, double /*beginTime*/)
&gt; +{
&gt; +    m_backgroundColor = inColor;
&gt; +    m_backgroundColorSet = true;
&gt; +}
&gt; +
&gt; +void GraphicsLayer::clearBackgroundColor()
&gt; +{
&gt; +    m_backgroundColor = Color();
&gt; +    m_backgroundColorSet = false;
&gt; +}
&gt; +
&gt; +void GraphicsLayer::setContentsOpaque(bool opaque)
&gt; +{
&gt; +    m_contentsOpaque = opaque;
&gt; +}
&gt; +
&gt; +void GraphicsLayer::setBackfaceVisibility(bool visible)
&gt; +{
&gt; +    m_backfaceVisibility = visible;
&gt; +}
&gt; +
&gt; +bool GraphicsLayer::setOpacity(float opacity, const Animation*, double)
&gt; +{
&gt; +    m_opacity = opacity;
&gt; +    return false;       // not animating
&gt; +}
&gt; +
&gt; +void GraphicsLayer::setDrawingPhase(GraphicsLayerPaintingPhase phase)
&gt; +{
&gt; +    m_paintingPhase = phase;
&gt; +}
&gt; +
&gt; +void GraphicsLayer::setNeedsDisplay()
&gt; +{
&gt; +}
&gt; +
&gt; +void GraphicsLayer::setNeedsDisplayInRect(const FloatRect&amp;)
&gt; +{
&gt; +}
&gt; +
&gt; +bool GraphicsLayer::animateTransform(const TransformValueList&amp;, const IntSize&amp;, const Animation*, double /*beginTime*/, bool /*isTransition*/)
&gt; +{
&gt; +    return false;
&gt; +}
&gt; +
&gt; +bool
&gt; +GraphicsLayer::animateFloat(AnimatedPropertyID, const FloatValueList&amp;, const Animation*, double /*beginTime*/)
&gt; +{
&gt; +    return false;
&gt; +}
&gt; +
&gt; +void GraphicsLayer::paintGraphicsLayerContents(GraphicsContext&amp; context, const IntRect&amp; clip)
&gt; +{
&gt; +    m_client-&gt;paintContents(this, context, m_paintingPhase, clip);
&gt; +}
&gt; +
&gt; +GraphicsLayer* GraphicsLayer::hitTest(const FloatPoint&amp;, struct LayerHitTestData*) const
&gt; +{
&gt; +    return 0;
&gt; +}
&gt; +
&gt; +bool GraphicsLayer::layerContainsPoint(const FloatPoint&amp;) const
&gt; +{
&gt; +    return false;
&gt; +}

Unless these are all virtual, they seem like good candidates for inlines. If they are all virtual, are any of them good candidates for to be pure virtual?

&gt; +String GraphicsLayer::propertyIdToString(AnimatedPropertyID property)
&gt; +{
&gt; +    switch(property) {
&gt; +        case AnimatedPropertyWebkitTransform: return &quot;transform&quot;;
&gt; +        case AnimatedPropertyBackgroundColor: return &quot;backgroundColor&quot;;
&gt; +        case AnimatedPropertyOpacity: return &quot;opacity&quot;;
&gt; +        default: return &quot;&quot;;
&gt; +    }

The switch should have a space after it before the parenthesis.

Maybe this could use conventional formatting instead of the &quot;every case on one line&quot; formatting.

We normally omit &quot;default&quot; so we can take advantage of the gcc warning about missing enum values in switch statements, which is disabled for switch statements that have a default. For a case like this we&apos;d put the return for the default case after the function. But also, shouldn&apos;t there be an ASSERT_NOT_REACHED, or is it legal to call this with a property ID that&apos;s not one of the known ones?

&gt; +    for (size_t i = 0; i &lt; m_animations.size(); ++i)
&gt; +        if (m_animations[i].property == property &amp;&amp; m_animations[i].index == index)
&gt; +            return (int) i;

We use braces around the body of multi-line for statements. We use C++ style casts, not C-style.

&gt; +    }
&gt; +    else {

Closing brace goes on same line as else.

&gt; +        i = (int) m_animations.size();

We use C++ style casts, not C-style.

&gt; +        m_animations.append(AnimationEntry());
&gt; +        m_animations[i].beginTime = beginTime;
&gt; +        m_animations[i].property = property;
&gt; +        m_animations[i].index = index;

This seems to cry out for a constructor that has an argument or two.

&gt; +}
&gt; +
&gt; +
&gt; +void GraphicsLayer::removeAllAnimationsForProperty(AnimatedPropertyID property)

Extra blank line here.

&gt; +        }
&gt; +        else
&gt; +            ++i;

We put the brace on the same line as the else.

&gt; +            --size;
&gt; +        }
&gt; +        else

Ditto.

&gt; +    int x = (int)roundf(contentPoint.x());
&gt; +    int y = (int)roundf(contentPoint.y());

Normally it&apos;s better to use lroundf in a case like this instead of calling roundf and casting. Also, C++ style casts are the norm.

&gt; +    ASSERT(sHitTestData);
&gt; +    return m_client-&gt;contentsContainPoint(this, IntPoint(x, y), m_paintingPhase, sHitTestData);

Is that assertion really helpful?

&gt; +        if (drawsContent())
&gt; +            if (m_usingTiledLayer)
&gt; +                setDebugBorder(Color(0, 255, 0, 204), 2.0f);    // tiled layer: green
&gt; +            else
&gt; +                setDebugBorder(Color(255, 0, 0, 204), 2.0f);    // normal layer: red
&gt; +        else if (masksToBounds()) {
&gt; +            setDebugBorder(Color(128, 255, 255, 178), 2.0f);    // masking layer: pale blue
&gt; +            if (GraphicsLayer::showDebugBorders())
&gt; +                setDebugBackgroundColor(Color(128, 255, 255, 52));
&gt; +        } else
&gt; +            setDebugBorder(Color(255, 255, 0, 204), 2.0f);      // container: yellow

The if should have braces around its multiple-line body.

&gt; +#include &quot;Animation.h&quot;
&gt; +#include &quot;Color.h&quot;
&gt; +#include &quot;FloatPoint.h&quot;
&gt; +#include &quot;FloatRect.h&quot;
&gt; +#include &quot;FloatQuad.h&quot;
&gt; +#include &quot;GraphicsLayerClient.h&quot;
&gt; +#include &quot;IntRect.h&quot;
&gt; +#include &quot;PlatformString.h&quot;
&gt; +#include &quot;TextStream.h&quot;
&gt; +#include &quot;TimingFunction.h&quot;
&gt; +#include &quot;TransformationMatrix.h&quot;
&gt; +#include &quot;TransformOperations.h&quot;
&gt; +
&gt; +#include &lt;wtf/OwnPtr.h&gt;

Is there anything we can do to reduce the number of includes here? Is every one of these needed?

&gt; +
&gt; +#if PLATFORM(MAC)
&gt; +#ifdef __OBJC__
&gt; +@class WKLayer;
&gt; +@class CALayer;
&gt; +typedef WKLayer PlatformLayer;
&gt; +typedef CALayer* NativeLayer;
&gt; +#else
&gt; +typedef void* PlatformLayer;
&gt; +typedef void* NativeLayer;
&gt; +#endif
&gt; +#else
&gt; +typedef void* PlatformLayer;
&gt; +typedef void* NativeLayer;
&gt; +#endif
&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +class GraphicsContext;
&gt; +class Image;
&gt; +class TimingFunction;
&gt; +
&gt; +// GraphicsLayer is an abstraction for a rendering surface with backing store,
&gt; +// which may have associated transformation and animations.
&gt; +
&gt; +// FIXME: inherit from TreeShared?

I don&apos;t think that FIXME is clear enough. Why would we want to inherit from TreeShared?

&gt; +        FloatValue(float key = nanf(0), float value = 0, const TimingFunction* timingFunction = 0)

I&apos;ve never seen that nanf syntax before. Is that portable?

&gt; +    class FloatValueList : public Vector&lt;FloatValue&gt; {
&gt; +    public:
&gt; +        void insert(float key, float val, const TimingFunction* tf);
&gt; +    };

We usually consider deriving from a Vector to be an anti-pattern. Could this just be a helper function rather than a class? Also, we&apos;d omit that &quot;tf&quot; identifier.

&gt; +        float mKey;

We use m_key.

&gt; +        OwnPtr&lt;TransformOperations&gt; mVal;

And m_value;

&gt; +        OwnPtr&lt;TimingFunction&gt; mTF;

And m_timingFunction.

&gt; +    String name() const { return m_name; }

This should return a const String&amp; for better efficiency.

&gt; +    FloatPoint position() const { return m_position; }

This could return a const FloatPoint&amp; for better efficiency.

&gt; +    FloatPoint anchorPoint() const { return m_anchorPoint; }

Ditto.

&gt; +    FloatSize size() const { return m_size; }

Ditto.

&gt; +    TransformationMatrix transform() const { return m_transform; }

Ditto.

&gt; +    TransformationMatrix childrenTransform() const { return m_childrenTransform; }

Ditto.

&gt; +    Color backgroundColor() const { return m_backgroundColor; }

Ditto.

&gt; +    virtual void setBackgroundColor(const Color&amp;, const Animation* anim = 0, double beginTime = 0);

We&apos;d normally omit the name &quot;anim&quot; here.

&gt; +    virtual bool setOpacity(float o, const Animation* anim = 0, double beginTime = 0);

We&apos;d normally use the word &quot;opacity&quot; not &quot;o&quot; and omit the name anim here.

&gt; +    void setDrawingPhase(GraphicsLayerPaintingPhase phase);

We&apos;d normally omit the name &quot;phase&quot; here. I may have missed other cases like this in setters above.

&gt; +    virtual void setNeedsDisplayInRect(const FloatRect&amp; inRect);

We&apos;d normally omit the name &quot;inRect&quot; here. I may have missed other cases like this in setters above.

&gt; +    virtual bool animateTransform(const TransformValueList&amp; values, const IntSize&amp; size,
&gt; +                                  const Animation* anim, double beginTime, bool isTransition);

We&apos;d omit &quot;values&quot;, &quot;size&quot;, and &quot;anim&quot; here.

&gt; +    virtual bool animateFloat(AnimatedPropertyID property, const FloatValueList&amp; values,
&gt; +                                  const Animation* transition, double beginTime);

We&apos;d omit &quot;property&quot;, &quot;values&quot;, and &quot;transition&quot; here.

&gt; +    virtual void setContentsToImage(Image*) {}
&gt; +    virtual void setContentsToVideo(PlatformLayer*) {}
&gt; +    virtual void setContentsBackgroundColor(const Color&amp;) {}
&gt; +    virtual void clearContents() {}
&gt; +    
&gt; +    virtual void updateContentsRect() {}

Should any of these be &quot;= 0&quot; instead of &quot;{}&quot;? Also, we normally use &quot;{ }&quot;.

&gt; +    void paintGraphicsLayerContents(GraphicsContext&amp; context, const IntRect&amp; clip);

We&apos;d normally omit &quot;context&quot; here.

&gt; +    virtual GraphicsLayer* hitTest(const FloatPoint&amp; point, struct LayerHitTestData* inData) const;

We&apos;d omit &quot;point&quot;, &quot;struct&quot;, and &quot;inData&quot; here.

&gt; +    virtual bool layerContainsPoint(const FloatPoint&amp; point) const;

We&apos;d normally omit &quot;point&quot; here.

&gt; +    virtual FloatPoint convertPointToLayer(const FloatPoint&amp; point, GraphicsLayer* targetLayer) const;
&gt; +    virtual FloatPoint convertPointFromLayer(const FloatPoint&amp; point, GraphicsLayer* sourceLayer) const;

And here.

&gt; +    virtual void convertQuadToLayer(FloatQuad&amp; quad, const GraphicsLayer* targetLayer) const;

And omit &quot;quad&quot; here.

&gt; +    void dumpLayer(TextStream&amp; ts, int indent = 0) const;

And omit &quot;ts&quot; here.

&gt; +    static bool graphicsContextsFlipped();

We worked hard to keep the &quot;flipped&quot; concept entirely out of WebCore until now. Does this really need to be here? And if it does, are we using the Cocoa sense, where &quot;flipped&quot; means what everyone else seems to call &quot;normal&quot;? Can we use our own term for this, perhaps, that&apos;s less ambiguous?

&gt; +    static String propertyIdToString(AnimatedPropertyID property);

We&apos;d omit &quot;property&quot; here.

&gt; +    void dumpProperties(TextStream&amp; ts, int indent) const;

And &quot;ts&quot; here.

&gt; +    String dumpName() const { return String(&quot;GraphicsLayer&quot;); }

If this is a non-virtual function, that&apos;s quite strange. If it&apos;s virtual, we normally repeat the word virtual. You should not need the explicit String() here.

&gt; +    int findAnimationEntry(AnimatedPropertyID property, short index) const;

We&apos;d omit the word &quot;property&quot; here.

&gt; +    bool addAnimationEntry(AnimatedPropertyID property, short index, double beginTime, 
&gt; +                            bool isTransition, const Animation* transition);

We&apos;d omit &quot;property&quot; and &quot;transition&quot; here.

&gt; +    void removeAllAnimationsForProperty(AnimatedPropertyID property);

We&apos;d omit the word &quot;property&quot; here.

&gt; +protected:
&gt; +    GraphicsLayerClient* m_client;

Can any of the stuff below be private instead of protected?

&gt; +    FloatPoint m_position;
&gt; +    FloatPoint m_anchorPoint;
&gt; +    FloatSize  m_size;

We normally wouldn&apos;t try to line things up here. So please leave out that extra space.

&gt; +    class AnimationEntry {
&gt; +        public:
&gt; +        AnimationEntry()
&gt; +        : beginTime(-1)
&gt; +        , pauseTime(-2)
&gt; +        , endTime(-1)
&gt; +        , property(AnimatedPropertyInvalid)
&gt; +        , isCurrent(true)
&gt; +        , isTransition(true) { }

Indentation and formatting here is not the normal we use in WebKit. The public should not be indented. The constructor should be indented from where the public is. The initialization list should be indented from the constructor. The braces should be on separate lines and below since this is not the special case of an entire definition one one line.

&gt; +        RefPtr&lt;Animation&gt; animLayer;

The abbreviation here seems unneeded. It should either be named layer, animation, or animationLayer, not animLayer.

&gt; +    static struct LayerHitTestData* sHitTestData;      // temporarily assigned while hit testing

There&apos;s no need for the &quot;struct&quot;. That&apos;s never needed in C++; it&apos;s a C-ism. In the rare cases we are forced to use globals we try to use internal linkage rather than static data members if possible.

&gt; +enum {
&gt; +    GraphicsLayerPaintBackgroundMask     = (1 &lt;&lt; 0),
&gt; +    GraphicsLayerPaintForegroundMask     = (1 &lt;&lt; 1),
&gt; +    GraphicsLayerPaintAllMask            = (unsigned int)-1

Seems unnecessary to use the negative number here; I think that UINT_MAX or 0xFFFFFFFFU would both be better.

&gt; +typedef unsigned int GraphicsLayerPaintingPhase;

We don&apos;t use enum/typedef pairs in WebKit. This should just be the name of the enum. Or the constants could just be static constants and not an enum. In any case, we use &quot;unsigned&quot;, not &quot;unsigned int&quot;.

&gt; +class GraphicsContext;
&gt; +class GraphicsLayer;
&gt; +class IntPoint;
&gt; +class IntRect;

Forward declarations of classes from outside the file should come first, before any definitions in the file.

&gt; +    virtual void notifyTransitionStarted(const GraphicsLayer* layer, AnimatedPropertyID property, double time) = 0;

We&apos;d normally omit the names &quot;layer&quot; and &quot;property&quot; here.

&gt; +    virtual void notifyAnimationStarted(const GraphicsLayer* layer, double time) = 0;

And &quot;layer&quot; here.

&gt; +    virtual void paintContents(const GraphicsLayer* layer, GraphicsContext&amp; context, GraphicsLayerPaintingPhase compositePhase, const IntRect&amp; inClip) = 0;

And &quot;layer&quot;, &quot;context&quot;, and &quot;compositePhase&quot; here. And call it &quot;clipRect&quot; or &quot;clip&quot; instead of &quot;inClip&quot;.

&gt; +    virtual bool contentsContainPoint(const GraphicsLayer* layer, const IntPoint&amp; point, GraphicsLayerPaintingPhase compositePhase, struct LayerHitTestData* hitTestData) = 0;

We&apos;d normally omit the names &quot;layer&quot;, &quot;point&quot;, &quot;compositePhase&quot; and &quot;hitTestData&quot; here. Also &quot;struct&quot;.

&gt; +    virtual FloatPoint convertToContentsCoordinates(const GraphicsLayer* layer, const FloatPoint&amp; point) = 0;

We&apos;d normally omit the names &quot;layer&quot; and &quot;point&quot; here.

&gt; +    virtual IntRect contentsBox(const GraphicsLayer* layer) = 0;

And &quot;layer&quot; here.

&gt; +#ifndef GraphicsLayerCA_h_
&gt; +#define GraphicsLayerCA_h_

No trailing underscore.

&gt; +#import &quot;config.h&quot;

Header files must not include &quot;config.h&quot;.

&gt; +#import &quot;GraphicsLayer.h&quot;
&gt; +
&gt; +#include &lt;wtf/RetainPtr.h&gt;

No spaces between the &quot;&quot; and the &lt;&gt; includes; just a sorted list.

&gt; +@class WKLayer;
&gt; +@class AnimationDidStartCB;

Normally we sort alphabetically. AnimationDidStartCB is an Objective-C class name, and they are in a global namespace, so it needs a prefix, typically &quot;Web&quot;. Our prefix is not &quot;WK&quot;, it&apos;s &quot;Web&quot;. So it should be &quot;WebLayer&quot;, not &quot;WKLayer&quot;.

&gt; +class GraphicsLayerCA : public GraphicsLayer
&gt; +{

Brace goes on the same line as class name.

&gt; +public:
&gt; +
&gt; +    GraphicsLayerCA(GraphicsLayerClient* client);

Extra blank line here. We&apos;d omit the word &quot;client&quot; here.

&gt; +    virtual void setName(const String&amp; name);

We&apos;d omit the name &quot;name&quot; here.

&gt; +    virtual void addChildAbove(GraphicsLayer* layer, GraphicsLayer* sibling);
&gt; +    virtual void addChildBelow(GraphicsLayer* layer, GraphicsLayer* sibling);

We&apos;d normally omit the name &quot;layer&quot;. I suggest using the name &quot;parent&quot; instead of using no name at all.

&gt; +    virtual void setAnchorPoint(const FloatPoint&amp;, float anchorZ);

No 3D point class?

&gt; +    virtual void setTransform(const TransformationMatrix&amp; t);
&gt; +
&gt; +    virtual void setChildrenTransform(const TransformationMatrix&amp; t);

We&apos;d omit the name &quot;t&quot; here.

&gt; +    virtual void setBackgroundColor(const Color&amp;, const Animation* anim = 0, double beginTime = 0);

We&apos;d omit the name &quot;anim&quot; here.

&gt; +    virtual bool setOpacity(float, const Animation* anim = 0, double beginTime = 0);

We&apos;d omit the name &quot;anim&quot; here.

&gt; +    // mark the given rect (in layer coords) as needing dispay
&gt; +    virtual void setNeedsDisplayInRect(const FloatRect&amp;);

Comment doesn&apos;t seem helpful here. We&apos;re just overriding it. We shouldn&apos;t cut and paste all the comments.

&gt; +    virtual bool animateTransform(const TransformValueList&amp; values, const IntSize&amp; size,
&gt; +                                  const Animation* anim, double beginTime, bool isTransition);

We&apos;d omit &quot;values&quot;, &quot;size&quot;, and &quot;anim&quot; here.

&gt; +    virtual bool animateFloat(AnimatedPropertyID property, const FloatValueList&amp; values,
&gt; +                                  const Animation* transition, double beginTime);

We&apos;d omit &quot;property&quot;, &quot;values&quot;, and &quot;transition&quot; here. This also shows how it&apos;s not good to try to line up parentheses, because they get unaligned when you rename things. That&apos;s one reason I prefer indenting one tab stop, but all the text editors seems to be trying to line things up (yuck).

&gt; +    virtual GraphicsLayer* hitTest(const FloatPoint&amp; point, struct LayerHitTestData* data) const;
&gt; +    virtual bool layerContainsPoint(const FloatPoint&amp; point) const;

We&apos;d omit &quot;point&quot;, and &quot;data&quot; here.

&gt; +    virtual FloatPoint convertPointToLayer(const FloatPoint&amp; point, GraphicsLayer* targetLayer) const;
&gt; +    virtual FloatPoint convertPointFromLayer(const FloatPoint&amp; point, GraphicsLayer* sourceLayer) const;

We&apos;d omit &quot;point&quot; here.

&gt; +    virtual void convertQuadToLayer(FloatQuad&amp; ioQuad, const GraphicsLayer* targetLayer) const;

I think it&apos;s confusing that the quad one modifies the quad in place, and the point ones don&apos;t. Can&apos;t we pick one style or the other?

We&apos;d omit &quot;ioQuad&quot; here, and we don&apos;t use &quot;in&quot; &quot;out&quot; and &quot;io&quot; prefixes, although here I see it could be helpful.

&gt; +    void setBasicAnimation(AnimatedPropertyID property, const String&amp; component, short index, void* fromVal, void* toVal, 
&gt; +                                bool isTransition, const Animation* transition, double time);

The use of void* here seems like a poor way to do the polymorphism, but maybe that&apos;s already baked in to how we do these things elsewhere in the animation machinery.

We&apos;d normally omit the words &quot;property&quot; and &quot;transition&quot; here.

&gt; +    void setKeyframeAnimation(AnimatedPropertyID property, const String&amp; component, short index, void* keys, void* values, void* timingFunctions, 
&gt; +                                bool isTransition, const Animation* transition, double time);

We&apos;d normally omit the words &quot;property&quot; and &quot;transition&quot; here.

The use of void* here seems poor; we should find a better way to do this.

&gt; +    void setAnimation(AnimatedPropertyID property);

We&apos;d normally omit the word &quot;property&quot; here.

&gt; +    void animDone(AnimatedPropertyID property, short index);

We&apos;d normally omit the words &quot;property&quot; here. Why the abbreviation anim here, when all the other functions call it animation.

&gt; +    virtual void removeAnimation(int inAnimIndex, bool reset);

We&apos;d use &quot;index&quot; or &quot;animationIndex&quot;, rather than &quot;inAnimIndex&quot;. The use of bool for arguments like this is normally discouraged. One alternative is an enum.

&gt; +protected:

Should be private, not protected. Also, should only say it once, and should have no blank line.

&gt; +    RetainPtr&lt;WKLayer&gt; m_layer;
&gt; +    RetainPtr&lt;WKLayer&gt; m_transformLayer;
&gt; +    RetainPtr&lt;WKLayer&gt; m_contentsLayer;
&gt; +
&gt; +    RetainPtr&lt;AnimationDidStartCB&gt; m_animationDidStartCB;

I&apos;m not fond of the use of &quot;CB&quot; here to mean &quot;callback&quot;. Is that our terminology or something from CoreAnimation? We have a lot of other objects like this in our Objective-C++ code and we never use the CB prefix for any of them.

&gt; +#import &lt;QuartzCore/QuartzCore.h&gt;
&gt; +
&gt; +#import &lt;QuartzCore/CAAnimationPrivate.h&gt;
&gt; +#import &lt;QuartzCore/CAValueFunction.h&gt;
&gt; +
&gt; +#import &quot;Animation.h&quot;
&gt; +#import &quot;BlockExceptions.h&quot;
&gt; +#import &quot;CString.h&quot;
&gt; +#import &quot;Image.h&quot;
&gt; +#import &quot;PlatformString.h&quot;
&gt; +#import &quot;RotateTransformOperation.h&quot;
&gt; +#import &quot;ScaleTransformOperation.h&quot;
&gt; +#import &quot;SystemTime.h&quot;
&gt; +#import &quot;TranslateTransformOperation.h&quot;
&gt; +#import &quot;WKLayer.h&quot;
&gt; +#import &quot;WKTiledLayer.h&quot;
&gt; +#import &lt;wtf/CurrentTime.h&gt;

Includes should be in a single paragraph, and sorted as with the sort tool.

We can&apos;t include a header like &lt;QuartzCore/CAAnimationPrivate.h&gt;; people outside Apple won&apos;t have that on their computers. So we need an alternate strategy for a file like that.

&gt; +static NSString* const kAnimationCSSPropertyKey = @&quot;GraphicsLayerCA_property&quot;;

We don&apos;t use &quot;k&quot; for this sort of thing, normally. Why do we need this? It has no WebKit prefix, so I assume it&apos;s some part of CA&apos;s interface?

&gt; +static const int kMaxPixelDimension = 2000;
&gt; +static const int kTiledLayerTileSize = 512; // This is arbitrary and not empirical

I&apos;d like to see some more extensive comments explaining these.

&gt; +static double unixTimeToCATime(double t)
&gt; +{
&gt; +    return CACurrentMediaTime() - WTF::currentTime() + t;
&gt; +}

Can&apos;t we determine the conversion factor at compile time instead? It seems bad to calculate the current time twice every single time we convert a time from one to the other! Also, the WTF time isn&apos;t necessarily &quot;Unix&quot; time. Maybe CA time is just the same as CF time?

&gt; +- (void)animationDidStart:(CAAnimation *)anim

Not a fan of &quot;anim&quot;.

&gt; +static NSValue* createTransformFunctionValue(const GraphicsLayer::TransformValue&amp; transformValue, size_t index,
&gt; +                                                     const IntSize&amp; size, TransformOperation::OperationType transformType)

Another case of the &quot;pointless to try to line things up&quot;, in my opinion.

&gt; +            return [NSNumber numberWithFloat:op ? (float) (static_cast&lt;RotateTransformOperation*&gt;(op)-&gt;angle() * M_PI / 180) : 0];

We use C++ casts, not C casts. But is the cast to float actually helpful?

&gt; +        case TransformOperation::ROTATE: return String(&quot;rotateZ&quot;);
&gt; +        case TransformOperation::SCALE_X: return String(&quot;scaleX&quot;);
&gt; +        case TransformOperation::SCALE_Y: return String(&quot;scaleY&quot;);
&gt; +        case TransformOperation::TRANSLATE_X: return String(&quot;translateX&quot;);
&gt; +        case TransformOperation::TRANSLATE_Y: return String(&quot;translateY&quot;);
&gt; +        default: return String(&quot;&quot;);

Should not need the explicit String() on these. Should not have a default (see my comment above).

&gt; +    CGColorRef borderColor = cgColor(color);
&gt; +    [layer setBorderColor:borderColor];
&gt; +    CGColorRelease(borderColor);

You didn&apos;t do this, but it&apos;s *terrible* that cgColor returns a newly-created CGColor! It doesn&apos;t have the word &quot;Create&quot; or &quot;Copy&quot; in its name, nor does it return a RetainPtr. We need to fix that!!

&gt; +    static int showDebugBorders = -1;
&gt; +
&gt; +    if (showDebugBorders &lt; 0) {
&gt; +        BEGIN_BLOCK_OBJC_EXCEPTIONS
&gt; +        showDebugBorders = [[NSUserDefaults standardUserDefaults] boolForKey:@&quot;WebCoreLayerBorders&quot;];
&gt; +        END_BLOCK_OBJC_EXCEPTIONS
&gt; +    }

There is a more-elegant way to do this in C++ without the special magic value. Also, I don&apos;t think we need to block exceptions. There&apos;s no reason to expect an exception here and it&apos;s debug-only code. We can write it like this:

    static bool showDebugBorders = [[NSUserDefaults standardUserDefaults] boolForKey:@&quot;WebCoreLayerBorders&quot;];
    return showDebugBorders;

&gt; +    if (showRepaintCounter &lt; 0) {
&gt; +        BEGIN_BLOCK_OBJC_EXCEPTIONS
&gt; +        showRepaintCounter = [[NSUserDefaults standardUserDefaults] boolForKey:@&quot;WebCoreLayerRepaintCounter&quot;];
&gt; +        END_BLOCK_OBJC_EXCEPTIONS
&gt; +    }

Ditto.

&gt; +void GraphicsLayerCA::setAnchorPoint(const FloatPoint&amp; point, float inZ)

&quot;inZ&quot; is really awkward. How about just &quot;z&quot; or &quot;anchorZ&quot;?

&gt; +        setBasicAnimation(AnimatedPropertyBackgroundColor, &quot;&quot;, 0, (id)fromBackgroundColor, (id)bgColor, true, transition, beginTime);

We use C++ casts, not C casts.

Notice how mysterious that &quot;true&quot; is? I hate boolean arguments!

&gt; +    float clampedOpacity = std::max(std::min(opacity, 1.0f), 0.0f);

I like to write the clamping like this:

    float clampedOpacity = max(0.0f, min(opacity, 1.0f));

So you can see that it&apos;s going to be &quot;between&quot; 0 and 1. Also, we normally put using namespace std at the top of .cpp files and leave out the &quot;std::&quot; within the file, unless there&apos;s a problem with ambiguity.
    
&gt; +    BEGIN_BLOCK_OBJC_EXCEPTIONS
&gt; +    TransformationMatrix t;
&gt; +    CATransform3D toT3D;
&gt; +    copyTransform(toT3D, t);
&gt; +    [primaryLayer() setTransform:toT3D];
&gt; +    END_BLOCK_OBJC_EXCEPTIONS

We really don&apos;t want multiple sections of BEGIN_BLOCK_OBJC_EXCEPTIONS in the same function. Just one wrapping more of the function would be better.

&gt; +bool
&gt; +GraphicsLayerCA::animateFloat(AnimatedPropertyID property, const FloatValueList&amp; values, const Animation* animation, double beginTime)

Return type on same line.

&gt; +        [animatedLayer(property) setValue: 0 forKeyPath:propertyIdToString(property)];

No space after colon.

&gt; +        setBasicAnimation(property, &quot;&quot;, 0, 
&gt; +                          isnan(fromVal) ? nil : [NSNumber numberWithFloat:fromVal], 
&gt; +                          isnan(toVal) ?   nil : [NSNumber numberWithFloat:toVal],
&gt; +                          false, animation, beginTime);

Don&apos;t believe in lining things up.

&gt; +    NSMutableArray* timesArray  = [[NSMutableArray alloc] init];
&gt; +    NSMutableArray* valArray    = [[NSMutableArray alloc] init];
&gt; +    NSMutableArray* tfArray     = [[NSMutableArray alloc] init];

Ditto.

&gt; +    for (FloatValueList::const_iterator it = values.begin(); it != values.end(); ++it) {

We normally suggest iterating vectors with indices. Iterators are provided to help use them with generic algorithms, but are a bit more awkward, and also more fragile since they fail if vector is enlarged while iterating.

&gt; +        const FloatValue&amp; curValue = (*it);

No parentheses needed.

&gt; +        [timesArray addObject: [NSNumber numberWithFloat:curValue.key()]];
&gt; +        [valArray addObject: [NSNumber numberWithFloat:curValue.value()]];

No spaces after colons.

&gt; +            [tfArray addObject: [CAMediaTimingFunction functionWithControlPoints:0.25f:0.1f:0.25f:1.0f]];

Add spaces before those colons?

&gt; +             [tfArray addObject:[CAMediaTimingFunction functionWithControlPoints:
&gt; +                                            (float)tf-&gt;x1():(float)tf-&gt;y1():(float)tf-&gt;x2():(float)tf-&gt;y2()]];

C++ style is preferred for casts. No casts at all is even better. Very strange to have the first colon on a different line. Spaces before colons?

&gt; +        // FIXME: is image flipping really a property of the graphics context?
&gt; +        bool needToFlip = GraphicsLayer::graphicsContextsFlipped();
&gt; +        CGPoint anchorPoint = needToFlip ? CGPointMake(0.0f, 1.0f) : CGPointMake(0.0f, 0.0f);

This seems mixed up. Also, CGPointZero is available.

&gt; +        IntRect  contentRect = m_client-&gt;contentsBox(this);

Extra space here, not needed.

&gt; +void
&gt; +GraphicsLayerCA::setBasicAnimation(AnimatedPropertyID property, const String&amp; valueFunction, short index, void* fromVal, void* toVal, 
&gt; +                            bool isTransition, const Animation* transition, double beginTime)

The void should be on the same line as the function name. Again, the vain effort to line things up.

&gt; +    if (!fromVal &amp;&amp; !toVal)
&gt; +        return;

Are 0 values legal and to be silently ignored? Or should there be two assertions in addition to or instead of that check?

&gt; +    String animName = keyPath + &quot;_&quot; + String::number(index);

Strings do this very inefficiently. This will cause multiple memory allocations every time. More efficient would be to call a helper function that uses Vector&lt;UChar&gt;. Probably OK for now.

&gt; +        // If we send a duration of 0 to CA, then it will use the default duration
&gt; +        // of 250ms. So send a very small value instead.
&gt; +        double duration = transition-&gt;duration();
&gt; +        if (duration &lt;= 0)
&gt; +            duration = 1e-3;

The 1e-3 should be a named constant. The constant could have this comment instead.

&gt; +        float repeatCount = transition-&gt;iterationCount();
&gt; +        if (repeatCount &lt; 0)
&gt; +            repeatCount = FLT_MAX;
&gt; +        else if (transition-&gt;direction())
&gt; +            repeatCount /= 2;

Need a comment explaining why direction() being true makes the repeat count divide by two. I think I know why, but the person reading the code won&apos;t necessarily see it. Might be clearer if it was a local variable named autoreverses that was being looked at.

&gt; +        // TODO: currently we don&apos;t have any component animations for more than one
&gt; +        // function. So for now we will always use additive NO.

We use FIXME for this, never TODO.

&gt; +        [anim setAdditive:(property == AnimatedPropertyWebkitTransform) ? YES : NO];

A bool expression can be used directly. No need for &quot;? YES : NO&quot;.

&gt; +        [anim setValue:[NSNumber numberWithInt: prop] forKey:kAnimationCSSPropertyKey];

Extra space after colon here.

&gt; +        if (fromVal != nil)
&gt; +            [anim setFromValue:(id)fromVal];
&gt; +        if (toVal != nil)
&gt; +            [anim setToValue:(id)toVal];

Why are those casts to (id) needed? We normally use C++ casts.

&gt; +        CALayer* presLayer = [layer presentationLayer];
&gt; +        if (presLayer)
&gt; +            [layer setValue: [presLayer valueForKeyPath:keyPath] forKeyPath:keyPath];

Space after colon.

&gt; +        // If we send a duration of 0 to CA, then it will use the default duration
&gt; +        // of 250ms. So send a very small value instead.
&gt; +        double duration = anim-&gt;duration();
&gt; +        if (duration &lt;= 0)
&gt; +            duration = 1e-3;

Lots of repeated code. Can we refactor to reduce the cut and paste-y ness of this?

&gt; +    String animName = keyPath + &quot;_&quot; + String::number(m_animations[animIndex].index);

I see this over and over again. Should call a helper function for it.

&gt; +        switch(property) {

Missing space here.

&gt; +            case AnimatedPropertyWebkitTransform:
&gt; +                // We don&apos;t save the current transform, so we will have to rely on it being passed in.
&gt; +                break;

I don&apos;t understand this comment. What does &quot;will have to rely&quot; mean. Why is the transform different from other properties in this respect? Does this comment reflect a problem, or is it just a half-hearted explanation of a good design?

&gt; +            case AnimatedPropertyBackgroundColor:
&gt; +                m_backgroundColor = Color(val);
&gt; +                break;
&gt; +            case AnimatedPropertyOpacity:
&gt; +                m_opacity = [val floatValue];
&gt; +                break;
&gt; +            default:
&gt; +                break;

See comments above about &quot;default&quot; in switch statements.

&gt; +static inline bool handlesHitTest(CALayer* layer)
&gt; +{
&gt; +    return layer &amp;&amp; ([layer isKindOfClass:[WKLayer self]] || [layer isKindOfClass:[WKTiledLayer self]]) &amp;&amp;
&gt; +                    [layer layerOwner] &amp;&amp;
&gt; +                    [layer layerOwner]-&gt;client();
&gt; +}

Looks like this is lined up off by one character. I think earlier returns would make this easier to read and then you wouldn&apos;t have the lining up problem.

&gt; +    if (color.isValid())
&gt; +        setLayerBackgroundColor(m_layer.get(), color);
&gt; +    else
&gt; +        clearLayerBackgroundColor(m_layer.get());

I don&apos;t think an invalid color should be a special case. In my opinion any background color with alpha of 0 should have the same behavior. It&apos;s almost never helpful to handle an invalid color as a special case unless you have some need for a lack of color separate from transparent color.

&gt; +    return (size.width() &gt; kMaxPixelDimension || size.height() &gt; kMaxPixelDimension);

Extra unneeded parentheses here. Do we really want a layer for a 1-pixel-tall thing that&apos;s really wide? Or a 0-pixel-tall thing?

&gt; +    CALayer* oldLayer = m_layer.get();
&gt; +    [oldLayer retain];      // keep it around after the RetainPtr is assigned the new layer. balanced by -release below.

Instead make oldLayer be a RetainPtr and then you don&apos;t need these comments to explain the retain and release.

&gt; +    CGPoint anchorPoint = CGPointMake(0.0f, 0.0f);

CGZeroPoint

&gt; +namespace WebCore {
&gt; +class GraphicsLayer;
&gt; +}

We indent these.

&gt; +@interface CALayer(WKLayerAdditions)
&gt; +
&gt; +- (void)setLayerOwner:(WebCore::GraphicsLayer*)aLayer;
&gt; +- (WebCore::GraphicsLayer*)layerOwner;
&gt; +
&gt; +@end

Does this need to be in the header?

&gt; +#ifndef NDEBUG
&gt; +// for debug logging
&gt; +@interface CALayer(ExtendedDescription)
&gt; +
&gt; +- (NSString*)extendedDescription;
&gt; +
&gt; +@end
&gt; +#endif

Does this need to be in the header?

&gt; +#import &lt;QuartzCore/QuartzCore.h&gt;
&gt; +
&gt; +#import &quot;WKLayer.h&quot;
&gt; +
&gt; +#import &quot;GraphicsContext.h&quot;
&gt; +#import &quot;GraphicsLayer.h&quot;
&gt; +#import &quot;WebCoreTextRenderer.h&quot;
&gt; +#import &lt;wtf/UnusedParam.h&gt;

WKLayer.h needs to be included first, before QuartzCore.h. Other includes should be sorted.

&gt; ++ (void)drawContents:(WebCore::GraphicsLayer*)layerContents ofLayer:(CALayer*)layer intoContext:(CGContextRef)ctx

Should be &quot;context&quot;, not &quot;ctx&quot;.

&gt; +    if (layerContents &amp;&amp; layerContents-&gt;client()) {
&gt; +
&gt; +        [NSGraphicsContext saveGraphicsState];

Extra blank line here. Should leave it out.

&gt; +        PlatformGraphicsContext* platformContext = static_cast&lt;PlatformGraphicsContext*&gt;(ctx);

There should be no need for a type cast here. Please don&apos;t cast it. In fact, you should be able to just pass the context to the GraphicsContext constructor.

&gt; +        // Turn off text smoothing
&gt; +        bool wasSmoothing = context.usingFontSmoothing();
&gt; +        context.setUseFontSmoothing(false);

The comment says the same thing as the code. This is a perfect opportunity to explain *why* we&apos;re doing this instead of restating what we&apos;re doing. Also, capitalized comments should also have periods.

&gt; +    }
&gt; +    else {

Brace goes on same line.

&gt; +- (void)drawInContext:(CGContextRef)ctx

&quot;context&quot;, not &quot;ctx&quot;

&gt; +- (BOOL)containsPoint:(CGPoint)inPoint

&quot;point&quot;, not &quot;inPoint&quot;

&gt; +        IntPoint    thePoint(inPoint.x, inPoint.y);
&gt; +        BOOL layerOwnerContainsPoint =  _layerOwner-&gt;contentsContainPoint(thePoint);
&gt; +        return layerOwnerContainsPoint;

Should just say _layerOwner-&gt;contentsContainPoint(IntPoint(point)) here -- no point in having a two named local variables.

&gt; +        IntPoint thePoint(inPoint.x, inPoint.y);
&gt; +        return _layerOwner-&gt;contentsContainPoint(thePoint);

Same here. More copy and paste code.

Enough comments that I&apos;ll say review- for now. Seems in good shape, though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106882</commentid>
    <comment_count>5</comment_count>
      <attachid>27000</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-01-24 14:27:48 -0800</bug_when>
    <thetext>Created attachment 27000
Revised patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106884</commentid>
    <comment_count>6</comment_count>
      <attachid>27000</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-01-24 15:13:20 -0800</bug_when>
    <thetext>Comment on attachment 27000
Revised patch


&gt; +String GraphicsLayer::propertyIdToString(AnimatedPropertyID property)
&gt; +{
&gt; +    switch (property) {
&gt; +        case AnimatedPropertyWebkitTransform:
&gt; +            return &quot;transform&quot;;
&gt; +        case AnimatedPropertyOpacity:
&gt; +            return &quot;opacity&quot;;
&gt; +        case AnimatedPropertyBackgroundColor:
&gt; +            return &quot;backgroundColor&quot;;
&gt; +        case AnimatedPropertyInvalid:
&gt; +            ASSERT_NOT_REACHED();
&gt; +    }
&gt; +    return &quot;&quot;;
&gt; +}

You need an ASSERT_NOT_REACHED() outside the switch statement too, in case the property is a value not in the enum at all.

&gt; +        FloatValue(float key = NAN, float value = 0, const TimingFunction* timingFunction = 0)

I believe that elsewhere we fund that the portable value was:

    std::numeric_limits&lt;float&gt;::quiet_nan()

And that NAN was not consistently available on platforms other than Mac OS X. Sorry I wasn&apos;t more specific in my last round of review.

&gt; +enum GraphicsLayerPaintingPhase {
&gt; +    GraphicsLayerPaintBackgroundMask = (1 &lt;&lt; 0),
&gt; +    GraphicsLayerPaintForegroundMask = (1 &lt;&lt; 1),
&gt; +    GraphicsLayerPaintAllMask = UINT_MAX
&gt; +};

To use UINT_MAX you need to include the appropriate header. I believe it&apos;s &lt;limits.h&gt;.

This generally looks good but I don&apos;t have time to read it all right now. It&apos;s particularly challenging to collate the new patch with my old questions. I&apos;ll get to it as soon as I can but it&apos;s challenging!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107549</commentid>
    <comment_count>7</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-01-29 11:20:56 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; (From update of attachment 27000 [review])

&gt; &gt; +        FloatValue(float key = NAN, float value = 0, const TimingFunction* timingFunction = 0)
&gt; 
&gt; I believe that elsewhere we fund that the portable value was:
&gt; 
&gt;     std::numeric_limits&lt;float&gt;::quiet_nan()

JSCore uses NaN:
http://trac.webkit.org/browser/trunk/JavaScriptCore/runtime/JSCell.cpp#L35</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107552</commentid>
    <comment_count>8</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-01-29 11:26:41 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; (In reply to comment #6)
&gt; &gt; (From update of attachment 27000 [review] [review])
&gt; 
&gt; &gt; &gt; +        FloatValue(float key = NAN, float value = 0, const TimingFunction* timingFunction = 0)
&gt; &gt; 
&gt; &gt; I believe that elsewhere we fund that the portable value was:
&gt; &gt; 
&gt; &gt;     std::numeric_limits&lt;float&gt;::quiet_nan()
&gt; 
&gt; JSCore uses NaN:
&gt; http://trac.webkit.org/browser/trunk/JavaScriptCore/runtime/JSCell.cpp#L35

Oh, never mind, I see that&apos;s inside an #if defined(NaN)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107554</commentid>
    <comment_count>9</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-01-29 11:28:05 -0800</bug_when>
    <thetext>Filed bug 23624 to expose a NaN we can use.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107576</commentid>
    <comment_count>10</comment_count>
      <attachid>27159</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-01-29 13:52:39 -0800</bug_when>
    <thetext>Created attachment 27159
Final patch.

There was no need for the NaN, so no problem there. Other minor cleanup in response to comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107582</commentid>
    <comment_count>11</comment_count>
      <attachid>27161</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-01-29 14:23:40 -0800</bug_when>
    <thetext>Created attachment 27161
Fixed, final</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107744</commentid>
    <comment_count>12</comment_count>
      <attachid>27161</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2009-01-30 12:08:27 -0800</bug_when>
    <thetext>Comment on attachment 27161
Fixed, final

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107807</commentid>
    <comment_count>13</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-01-30 17:43:06 -0800</bug_when>
    <thetext>Committing to http://svn.webkit.org/repository/webkit/trunk ...
	M	WebCore/ChangeLog
	M	WebCore/WebCore.xcodeproj/project.pbxproj
	A	WebCore/platform/graphics/GraphicsLayer.cpp
	A	WebCore/platform/graphics/GraphicsLayer.h
	A	WebCore/platform/graphics/GraphicsLayerClient.h
	A	WebCore/platform/graphics/mac/GraphicsLayerCA.h
	A	WebCore/platform/graphics/mac/GraphicsLayerCA.mm
	A	WebCore/platform/graphics/mac/WebLayer.h
	A	WebCore/platform/graphics/mac/WebLayer.mm
	A	WebCore/platform/graphics/mac/WebTiledLayer.h
	A	WebCore/platform/graphics/mac/WebTiledLayer.mm
Committed r40433
</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26773</attachid>
            <date>2009-01-15 15:11:47 -0800</date>
            <delta_ts>2009-01-24 14:27:48 -0800</delta_ts>
            <desc>Patch, changelog</desc>
            <filename>23356_patch.txt</filename>
            <type>text/plain</type>
            <size>131072</size>
            <attacher name="Simon Fraser (smfr)">simon.fraser</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
N2UwZmU2ZC4uOTkyYzM0OSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzNCBAQAorMjAwOS0wMS0xNSAgU2ltb24gRnJhc2Vy
ICA8c2ltb24uZnJhc2VyQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MjMzNTYKKyAgICAgICAgCisgICAgICAgIEFkZCBuZXcgZmlsZXMgcmVsYXRlZCB0byBhY2Nl
bGVyYXRlZCBjb21wb3NpdGluZzoKKyAgICAgICAgCisgICAgICAgICogV2ViQ29yZS54Y29kZXBy
b2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICBBZGQgdGhlIGZpbGVzIHRvIHRoZSBwcm9qZWN0
LgorICAgICAgICAKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0xheWVyLmNw
cDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllci5oOiBB
ZGRlZC4KKyAgICAgICAgR3JhcGhpY3NMYXllciBpcyBhIHBsYXRmb3JtIGFic3RyYWN0aW9uIGZv
ciBhIGhhcmR3YXJlLWJhY2tlZAorICAgICAgICBsYXllci4KKyAgICAgICAgCisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllckNsaWVudC5oOiBBZGRlZC4KKyAgICAgICAg
Q2xpZW50IG9mIEdyYXBoaWNzTGF5ZXIsIGFsbG93aW5nIEdyYXBoaWNzTGF5ZXIgdG8gY2FsbCBv
dXQKKyAgICAgICAgdG8gV2ViQ29yZSBjb2RlLgorICAgICAgICAKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy9tYWMvR3JhcGhpY3NMYXllckNBLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0xheWVyQ0EubW06IEFkZGVkLgorICAgICAgICBNYWMg
Q29yZS1BbmltYXRpb24gaW1wbGVtZW50YXRpb24gb2YgR3JhcGhpY3NMYXllci4KKyAgICAgICAg
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1dLTGF5ZXIuaDogQWRkZWQuCisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1dLTGF5ZXIubW06IEFkZGVkLgorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL21hYy9XS1RpbGVkTGF5ZXIuaDogQWRkZWQuCisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1dLVGlsZWRMYXllci5tbTogQWRkZWQuCisgICAgICAgIFN1
YmNsYXNzZXMgb2YgQ0FMYXllciBhbmQgQ0FUaWxlZExheWVyOyBoZWxwZXJzIGZvciB0aGUKKyAg
ICAgICAgR3JhcGhpY3NMYXllckNBIGltcGxlbWVudGF0aW9uLgorCiAyMDA5LTAxLTE1ICBEaW1p
dHJpIEdsYXprb3YgIDxkZ2xhemtvdkBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQg
YnkgRGFyaW4gQWRsZXIuCmRpZmYgLS1naXQgYS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3By
b2plY3QucGJ4cHJvaiBiL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9q
CmluZGV4IDY5NmYyMGUuLjUyYzUyN2EgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvV2ViQ29yZS54Y29k
ZXByb2ovcHJvamVjdC5wYnhwcm9qCisrKyBiL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJv
amVjdC5wYnhwcm9qCkBAIC0xMTcsNiArMTE3LDE1IEBACiAJCTBBNDg0NDk5MENBNDRDQjIwMEI3
QkQ0OCAvKiBTb2Z0TGlua2luZy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gMEE0ODQ0OTgwQ0E0NENCMjAwQjdCRDQ4IC8qIFNvZnRMaW5raW5nLmggKi87
IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJMEY1NjAyOEYw
RTRCNzY1ODAwNjVCMDM4IC8qIFJlbmRlck1hcnF1ZWUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGNTYwMjhEMEU0Qjc2NTgwMDY1QjAzOCAvKiBSZW5k
ZXJNYXJxdWVlLmggKi87IH07CiAJCTBGNTYwMjkwMEU0Qjc2NTgwMDY1QjAzOCAvKiBSZW5kZXJN
YXJxdWVlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IDBGNTYwMjhFMEU0Qjc2NTgwMDY1QjAzOCAvKiBSZW5kZXJNYXJxdWVlLmNwcCAqLzsgfTsKKwkJ
MEY1ODBCMDUwRjEyQTI1NTAwNTFENjg5IC8qIEdyYXBoaWNzTGF5ZXJDQS5tbSBpbiBTb3VyY2Vz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGNTgwQjAzMEYxMkEyNTQwMDUx
RDY4OSAvKiBHcmFwaGljc0xheWVyQ0EubW0gKi87IH07CisJCTBGNTgwQjA2MEYxMkEyNTUwMDUx
RDY4OSAvKiBHcmFwaGljc0xheWVyQ0EuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDBGNTgwQjA0MEYxMkEyNTUwMDUxRDY4OSAvKiBHcmFwaGljc0xheWVy
Q0EuaCAqLzsgfTsKKwkJMEY1ODBCMEMwRjEyQTI2OTAwNTFENjg5IC8qIEdyYXBoaWNzTGF5ZXIu
Y3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY1ODBC
MDkwRjEyQTI2OTAwNTFENjg5IC8qIEdyYXBoaWNzTGF5ZXIuY3BwICovOyB9OworCQkwRjU4MEIw
RDBGMTJBMjY5MDA1MUQ2ODkgLyogR3JhcGhpY3NMYXllci5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY1ODBCMEEwRjEyQTI2OTAwNTFENjg5IC8qIEdy
YXBoaWNzTGF5ZXIuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9
OyB9OworCQkwRjU4MEIwRTBGMTJBMjY5MDA1MUQ2ODkgLyogR3JhcGhpY3NMYXllckNsaWVudC5o
IGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY1ODBCMEIw
RjEyQTI2OTAwNTFENjg5IC8qIEdyYXBoaWNzTGF5ZXJDbGllbnQuaCAqLzsgc2V0dGluZ3MgPSB7
QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OworCQkwRjU4MEQ5NjBGMTJFOTRFMDA1MUQ2
ODkgLyogV0tMYXllci5tbSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IDBGNTgwRDkyMEYxMkU5NEUwMDUxRDY4OSAvKiBXS0xheWVyLm1tICovOyB9OworCQkw
RjU4MEQ5NzBGMTJFOTRFMDA1MUQ2ODkgLyogV0tUaWxlZExheWVyLm1tIGluIFNvdXJjZXMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY1ODBEOTMwRjEyRTk0RTAwNTFENjg5
IC8qIFdLVGlsZWRMYXllci5tbSAqLzsgfTsKKwkJMEY1ODBEOTgwRjEyRTk0RTAwNTFENjg5IC8q
IFdLTGF5ZXIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IDBGNTgwRDk0MEYxMkU5NEUwMDUxRDY4OSAvKiBXS0xheWVyLmggKi87IH07CisJCTBGNTgwRDk5
MEYxMkU5NEUwMDUxRDY4OSAvKiBXS1RpbGVkTGF5ZXIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGNTgwRDk1MEYxMkU5NEUwMDUxRDY4OSAvKiBXS1Rp
bGVkTGF5ZXIuaCAqLzsgfTsKIAkJMEZDNzA1MjEwRUIxODE1NjAwQjkwQUQ4IC8qIEF0b21pY1N0
cmluZ0hhc2guaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IDBGQzcwNTIwMEVCMTgxNTYwMEI5MEFEOCAvKiBBdG9taWNTdHJpbmdIYXNoLmggKi87IHNldHRp
bmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJMEZENzIzODIwRUM4QkQ5
MzAwQ0E1REQ3IC8qIEZsb2F0UXVhZC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gMEZENzIzODAwRUM4QkQ5MzAwQ0E1REQ3IC8qIEZsb2F0UXVhZC5oICov
OyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTBGRDcyMzgz
MEVDOEJEOTMwMENBNURENyAvKiBGbG9hdFF1YWQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEZENzIzODEwRUM4QkQ5MzAwQ0E1REQ3IC8qIEZsb2F0
UXVhZC5jcHAgKi87IH07CkBAIC00OTMxLDYgKzQ5NDAsMTUgQEAKIAkJMEE0ODQ0OTgwQ0E0NENC
MjAwQjdCRDQ4IC8qIFNvZnRMaW5raW5nLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0
aCA9IFNvZnRMaW5raW5nLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGNTYwMjhE
MEU0Qjc2NTgwMDY1QjAzOCAvKiBSZW5kZXJNYXJxdWVlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMuaDsgcGF0aCA9IFJlbmRlck1hcnF1ZWUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
IAkJMEY1NjAyOEUwRTRCNzY1ODAwNjVCMDM4IC8qIFJlbmRlck1hcnF1ZWUuY3BwICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUmVuZGVyTWFycXVlZS5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CisJCTBGNTgwQjAzMEYxMkEyNTQwMDUxRDY4OSAvKiBHcmFwaGlj
c0xheWVyQ0EubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5vYmpjcHA7IHBhdGggPSBHcmFw
aGljc0xheWVyQ0EubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTBGNTgwQjA0MEYx
MkEyNTUwMDUxRDY4OSAvKiBHcmFwaGljc0xheWVyQ0EuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Yy5oOyBwYXRoID0gR3JhcGhpY3NMYXllckNBLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CisJCTBGNTgwQjA5MEYxMkEyNjkwMDUxRDY4OSAvKiBHcmFwaGljc0xheWVyLmNwcCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEdyYXBoaWNzTGF5ZXIuY3BwOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OworCQkwRjU4MEIwQTBGMTJBMjY5MDA1MUQ2ODkgLyogR3JhcGhp
Y3NMYXllci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBHcmFwaGljc0xheWVy
Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTBGNTgwQjBCMEYxMkEyNjkwMDUxRDY4
OSAvKiBHcmFwaGljc0xheWVyQ2xpZW50LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0
aCA9IEdyYXBoaWNzTGF5ZXJDbGllbnQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJ
MEY1ODBEOTIwRjEyRTk0RTAwNTFENjg5IC8qIFdLTGF5ZXIubW0gKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmNwcC5vYmpjcHA7IHBhdGggPSBXS0xheWVyLm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OworCQkwRjU4MEQ5MzBGMTJFOTRFMDA1MUQ2ODkgLyogV0tUaWxlZExheWVyLm1tICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRoID0gV0tUaWxlZExheWVyLm1tOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwRjU4MEQ5NDBGMTJFOTRFMDA1MUQ2ODkgLyogV0tM
YXllci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBXS0xheWVyLmg7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTBGNTgwRDk1MEYxMkU5NEUwMDUxRDY4OSAvKiBXS1Rp
bGVkTGF5ZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gV0tUaWxlZExheWVy
Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGQzcwNTIwMEVCMTgxNTYwMEI5MEFE
OCAvKiBBdG9taWNTdHJpbmdIYXNoLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IEF0b21pY1N0cmluZ0hhc2guaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEZENzIz
ODAwRUM4QkQ5MzAwQ0E1REQ3IC8qIEZsb2F0UXVhZC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IHBhdGggPSBGbG9hdFF1YWQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEZE
NzIzODEwRUM4QkQ5MzAwQ0E1REQ3IC8qIEZsb2F0UXVhZC5jcHAgKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmNwcC5jcHA7IHBhdGggPSBGbG9hdFF1YWQuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwpAQCAtMTI5MDMsNiArMTI5MjEsOCBAQAogCQkJCUIyQUZGQzdBMEQwMEE1QzEwMDMwMDc0
RCAvKiBGb250UGxhdGZvcm1EYXRhTWFjLm1tICovLAogCQkJCUIyQUZGQzdCMEQwMEE1QzEwMDMw
MDc0RCAvKiBHbHlwaFBhZ2VUcmVlTm9kZU1hYy5jcHAgKi8sCiAJCQkJQjI3N0I0MDMwQjIyRjM3
QzAwMDRCRUM2IC8qIEdyYXBoaWNzQ29udGV4dE1hYy5tbSAqLywKKwkJCQkwRjU4MEIwMzBGMTJB
MjU0MDA1MUQ2ODkgLyogR3JhcGhpY3NMYXllckNBLm1tICovLAorCQkJCTBGNTgwQjA0MEYxMkEy
NTUwMDUxRDY4OSAvKiBHcmFwaGljc0xheWVyQ0EuaCAqLywKIAkJCQlCMjc1MzU4RDBCMDUzQTY2
MDAyQ0U2NEYgLyogSWNvbk1hYy5tbSAqLywKIAkJCQlCMjc1MzU0RTBCMDUzODE0MDAyQ0U2NEYg
LyogSW1hZ2VNYWMubW0gKi8sCiAJCQkJQjI3NTM1NEYwQjA1MzgxNDAwMkNFNjRGIC8qIEludFBv
aW50TWFjLm1tICovLApAQCAtMTI5MTEsNiArMTI5MzEsMTAgQEAKIAkJCQlFNEI0MUUxMDBDQkY5
MEVGMDBBRjJFQ0UgLyogTWVkaWFQbGF5ZXJQcml2YXRlUVRLaXQuaCAqLywKIAkJCQlFNEI0MUUx
MTBDQkY5MEVGMDBBRjJFQ0UgLyogTWVkaWFQbGF5ZXJQcml2YXRlUVRLaXQubW0gKi8sCiAJCQkJ
QjJBRkZDNzcwRDAwQTVDMTAwMzAwNzREIC8qIFNpbXBsZUZvbnREYXRhTWFjLm1tICovLAorCQkJ
CTBGNTgwRDk0MEYxMkU5NEUwMDUxRDY4OSAvKiBXS0xheWVyLmggKi8sCisJCQkJMEY1ODBEOTIw
RjEyRTk0RTAwNTFENjg5IC8qIFdLTGF5ZXIubW0gKi8sCisJCQkJMEY1ODBEOTUwRjEyRTk0RTAw
NTFENjg5IC8qIFdLVGlsZWRMYXllci5oICovLAorCQkJCTBGNTgwRDkzMEYxMkU5NEUwMDUxRDY4
OSAvKiBXS1RpbGVkTGF5ZXIubW0gKi8sCiAJCQkpOwogCQkJcGF0aCA9IG1hYzsKIAkJCXNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7CkBAIC0xMjk2Niw2ICsxMjk5MCw5IEBACiAJCQkJQjJBMDE1OTIw
QUY2Q0Q1MzAwNkJDRTBFIC8qIEdyYXBoaWNzQ29udGV4dC5jcHAgKi8sCiAJCQkJQjJBMDE1OTMw
QUY2Q0Q1MzAwNkJDRTBFIC8qIEdyYXBoaWNzQ29udGV4dC5oICovLAogCQkJCUE4OEZFMzMzMEU1
RUVFODcwMDhEOEMwRiAvKiBHcmFwaGljc0NvbnRleHRQcml2YXRlLmggKi8sCisJCQkJMEY1ODBC
MDkwRjEyQTI2OTAwNTFENjg5IC8qIEdyYXBoaWNzTGF5ZXIuY3BwICovLAorCQkJCTBGNTgwQjBB
MEYxMkEyNjkwMDUxRDY4OSAvKiBHcmFwaGljc0xheWVyLmggKi8sCisJCQkJMEY1ODBCMEIwRjEy
QTI2OTAwNTFENjg5IC8qIEdyYXBoaWNzTGF5ZXJDbGllbnQuaCAqLywKIAkJCQlCMkEwMTU5NDBB
RjZDRDUzMDA2QkNFMEUgLyogR3JhcGhpY3NUeXBlcy5jcHAgKi8sCiAJCQkJQjJBMDE1OTUwQUY2
Q0Q1MzAwNkJDRTBFIC8qIEdyYXBoaWNzVHlwZXMuaCAqLywKIAkJCQlCMjc1MzU0MDBCMDUzODE0
MDAyQ0U2NEYgLyogSWNvbi5oICovLApAQCAtMTY1NDIsNiArMTY1NjksMTEgQEAKIAkJCQk0OTgz
OTE1MjBGMUU3NkI0MDBDMjM3ODIgLyogRE9NV2ViS2l0Q1NTTWF0cml4SW50ZXJuYWwuaCBpbiBI
ZWFkZXJzICovLAogCQkJCTQ5ODM5MTU5MEYxRTc3NjkwMEMyMzc4MiAvKiBXZWJLaXRDU1NNYXRy
aXguaCBpbiBIZWFkZXJzICovLAogCQkJCTQ5ODM5MTY0MEYxRThFRTEwMEMyMzc4MiAvKiBKU1dl
YktpdENTU01hdHJpeENvbnN0cnVjdG9yLmggaW4gSGVhZGVycyAqLywKKwkJCQkwRjU4MEIwNjBG
MTJBMjU1MDA1MUQ2ODkgLyogR3JhcGhpY3NMYXllckNBLmggaW4gSGVhZGVycyAqLywKKwkJCQkw
RjU4MEIwRDBGMTJBMjY5MDA1MUQ2ODkgLyogR3JhcGhpY3NMYXllci5oIGluIEhlYWRlcnMgKi8s
CisJCQkJMEY1ODBCMEUwRjEyQTI2OTAwNTFENjg5IC8qIEdyYXBoaWNzTGF5ZXJDbGllbnQuaCBp
biBIZWFkZXJzICovLAorCQkJCTBGNTgwRDk4MEYxMkU5NEUwMDUxRDY4OSAvKiBXS0xheWVyLmgg
aW4gSGVhZGVycyAqLywKKwkJCQkwRjU4MEQ5OTBGMTJFOTRFMDA1MUQ2ODkgLyogV0tUaWxlZExh
eWVyLmggaW4gSGVhZGVycyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rw
cm9jZXNzaW5nID0gMDsKIAkJfTsKQEAgLTE4NTAxLDYgKzE4NTMzLDEwIEBACiAJCQkJNDk4Mzkx
NTEwRjFFNzZCNDAwQzIzNzgyIC8qIERPTVdlYktpdENTU01hdHJpeC5tbSBpbiBTb3VyY2VzICov
LAogCQkJCTQ5ODM5MTU4MEYxRTc3NjkwMEMyMzc4MiAvKiBXZWJLaXRDU1NNYXRyaXguY3BwIGlu
IFNvdXJjZXMgKi8sCiAJCQkJNDk4MzkxNjMwRjFFOEVFMTAwQzIzNzgyIC8qIEpTV2ViS2l0Q1NT
TWF0cml4Q29uc3RydWN0b3IuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJMEY1ODBCMDUwRjEyQTI1
NTAwNTFENjg5IC8qIEdyYXBoaWNzTGF5ZXJDQS5tbSBpbiBTb3VyY2VzICovLAorCQkJCTBGNTgw
QjBDMEYxMkEyNjkwMDUxRDY4OSAvKiBHcmFwaGljc0xheWVyLmNwcCBpbiBTb3VyY2VzICovLAor
CQkJCTBGNTgwRDk2MEYxMkU5NEUwMDUxRDY4OSAvKiBXS0xheWVyLm1tIGluIFNvdXJjZXMgKi8s
CisJCQkJMEY1ODBEOTcwRjEyRTk0RTAwNTFENjg5IC8qIFdLVGlsZWRMYXllci5tbSBpbiBTb3Vy
Y2VzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAw
OwogCQl9OwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0xh
eWVyLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllci5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBiMzBkNAotLS0gL2Rldi9udWxsCisr
KyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllci5jcHAKQEAgLTAsMCAr
MSw2OTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBv
ZiBBcHBsZSBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRy
aWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZl
ZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0
ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJ
RUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAq
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5H
KQorCisjaW5jbHVkZSAiR3JhcGhpY3NMYXllci5oIgorCisjaW5jbHVkZSAiUm90YXRlVHJhbnNm
b3JtT3BlcmF0aW9uLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RydWN0IExheWVySGl0
VGVzdERhdGEqIEdyYXBoaWNzTGF5ZXI6OnNIaXRUZXN0RGF0YSA9IDA7CisKK3ZvaWQgR3JhcGhp
Y3NMYXllcjo6RmxvYXRWYWx1ZTo6c2V0KGZsb2F0IGtleSwgZmxvYXQgdmFsdWUsIGNvbnN0IFRp
bWluZ0Z1bmN0aW9uKiB0aW1pbmdGdW5jdGlvbikKK3sKKyAgICBtS2V5ID0ga2V5OworICAgIG1W
YWwgPSB2YWx1ZTsKKyAgICBpZiAodGltaW5nRnVuY3Rpb24gIT0gbVRGKSB7CisgICAgICAgIGlm
ICh0aW1pbmdGdW5jdGlvbikKKyAgICAgICAgICAgIG1URi5zZXQobmV3IFRpbWluZ0Z1bmN0aW9u
KCp0aW1pbmdGdW5jdGlvbikpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtVEYuY2xlYXIo
KTsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllcjo6VHJhbnNmb3JtVmFsdWU6OnNldChm
bG9hdCBrZXksIGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMqIHZhbHVlLCBjb25zdCBUaW1pbmdG
dW5jdGlvbiogdGltaW5nRnVuY3Rpb24pCit7CisgICAgbUtleSA9IGtleTsKKyAgICBpZiAodmFs
dWUgIT0gbVZhbCkgeworICAgICAgICBpZiAodmFsdWUpCisgICAgICAgICAgICBtVmFsLnNldChu
ZXcgVHJhbnNmb3JtT3BlcmF0aW9ucygqdmFsdWUpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgbVZhbC5jbGVhcigpOworICAgIH0KKyAgICBpZiAodGltaW5nRnVuY3Rpb24gIT0gbVRGKSB7
CisgICAgICAgIGlmICh0aW1pbmdGdW5jdGlvbikKKyAgICAgICAgICAgIG1URi5zZXQobmV3IFRp
bWluZ0Z1bmN0aW9uKCp0aW1pbmdGdW5jdGlvbikpOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICBtVEYuY2xlYXIoKTsKKyAgICB9Cit9CisKK3ZvaWQKK0dyYXBoaWNzTGF5ZXI6OkZsb2F0VmFs
dWVMaXN0OjppbnNlcnQoZmxvYXQga2V5LCBmbG9hdCB2YWx1ZSwgY29uc3QgVGltaW5nRnVuY3Rp
b24qIHRpbWluZ0Z1bmN0aW9uKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgp
OyArK2kpIHsKKyAgICAgICAgRmxvYXRWYWx1ZSYgY3VyRmxvYXRWYWx1ZSA9ICgqdGhpcylbaV07
CisgICAgICAgIGlmIChjdXJGbG9hdFZhbHVlLmtleSgpID09IGtleSkgeworICAgICAgICAgICAg
Y3VyRmxvYXRWYWx1ZS5zZXQoa2V5LCB2YWx1ZSwgdGltaW5nRnVuY3Rpb24pOworICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChjdXJGbG9hdFZhbHVlLmtleSgpID4g
a2V5KSB7CisgICAgICAgICAgICAvLyBpbnNlcnQgYmVmb3JlCisgICAgICAgICAgICBWZWN0b3I8
RmxvYXRWYWx1ZT46Omluc2VydChpLCBGbG9hdFZhbHVlKGtleSwgdmFsdWUsIHRpbWluZ0Z1bmN0
aW9uKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAg
Ly8gYXBwZW5kCisgICAgYXBwZW5kKEZsb2F0VmFsdWUoa2V5LCB2YWx1ZSwgdGltaW5nRnVuY3Rp
b24pKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyOjpUcmFuc2Zvcm1WYWx1ZUxpc3Q6Omluc2Vy
dChmbG9hdCBrZXksIGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMqIHZhbHVlLCBjb25zdCBUaW1p
bmdGdW5jdGlvbiogdGltaW5nRnVuY3Rpb24pCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBzaXplKCk7ICsraSkgeworICAgICAgICBUcmFuc2Zvcm1WYWx1ZSYgY3VyVHJhbnNWYWx1ZSA9
ICgqdGhpcylbaV07CisgICAgICAgIGlmIChjdXJUcmFuc1ZhbHVlLmtleSgpID09IGtleSkgewor
ICAgICAgICAgICAgY3VyVHJhbnNWYWx1ZS5zZXQoa2V5LCB2YWx1ZSwgdGltaW5nRnVuY3Rpb24p
OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChjdXJUcmFuc1Zh
bHVlLmtleSgpID4ga2V5KSB7CisgICAgICAgICAgICAvLyBpbnNlcnQgYmVmb3JlCisgICAgICAg
ICAgICBWZWN0b3I8VHJhbnNmb3JtVmFsdWU+OjppbnNlcnQoaSwgVHJhbnNmb3JtVmFsdWUoa2V5
LCB2YWx1ZSwgdGltaW5nRnVuY3Rpb24pKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
fQorICAgIH0KKyAgICAKKyAgICAvLyBhcHBlbmQKKyAgICBhcHBlbmQoVHJhbnNmb3JtVmFsdWUo
a2V5LCB2YWx1ZSwgdGltaW5nRnVuY3Rpb24pKTsKK30KKworLy8gQW4gImludmFsaWQiIGxpc3Qg
aXMgb25lIHdob3NlIGZ1bmN0aW9ucyBkb24ndCBtYXRjaCwgYW5kIHRoZXJlZm9yZSBoYXMgdG8g
YmUgYW5pbWF0ZWQgYXMgYSBNYXRyaXgKKy8vIFRoZSBoYXNCaWdSb3RhdGlvbiBmbGFnIHdpbGwg
YWx3YXlzIHJldHVybiBmYWxzZSBpZiBpc1ZhbGlkIGlzIGZhbHNlLiBPdGhlcndpc2UgaGFzQmln
Um90YXRpb24gaXMgCisvLyB0cnVlIGlmIHRoZSByb3RhdGlvbiBiZXR3ZWVuIGFueSB0d28ga2V5
ZnJhbWVzIGlzID49IDE4MCBkZWdyZWVzLgordm9pZCBHcmFwaGljc0xheWVyOjpUcmFuc2Zvcm1W
YWx1ZUxpc3Q6Om1ha2VGdW5jdGlvbkxpc3QoRnVuY3Rpb25MaXN0JiBsaXN0LCBib29sJiBpc1Zh
bGlkLCBib29sJiBoYXNCaWdSb3RhdGlvbikgY29uc3QKK3sKKyAgICBsaXN0LmNsZWFyKCk7Cisg
ICAgaXNWYWxpZCA9IGZhbHNlOworICAgIGhhc0JpZ1JvdGF0aW9uID0gZmFsc2U7CisgICAgCisg
ICAgaWYgKHNpemUoKSA8IDIpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICAvLyBlbXB0eSB0
cmFuc2Zvcm1zIG1hdGNoIGFueXRoaW5nLCBzbyBmaW5kIHRoZSBmaXJzdCBub24tZW1wdHkgZW50
cnkgYXMgdGhlIHJlZmVyZW5jZQorICAgIHNpemVfdCBmaXJzdEluZGV4ID0gMDsKKyAgICBmb3Ig
KCA7IGZpcnN0SW5kZXggPCBzaXplKCk7ICsrZmlyc3RJbmRleCkgeworICAgICAgICBpZiAoYXQo
Zmlyc3RJbmRleCkudmFsdWUoKS0+b3BlcmF0aW9ucygpLnNpemUoKSA+IDApCisgICAgICAgICAg
ICBicmVhazsKKyAgICB9CisgICAgCisgICAgaWYgKGZpcnN0SW5kZXggPj0gc2l6ZSgpKQorICAg
ICAgICByZXR1cm47CisgICAgICAgIAorICAgIGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMqIGZp
cnN0VmFsID0gYXQoZmlyc3RJbmRleCkudmFsdWUoKTsKKyAgICAKKyAgICAvLyBzZWUgaWYgdGhl
IGtleWZyYW1lcyBhcmUgdmFsaWQKKyAgICBmb3IgKHNpemVfdCBpID0gZmlyc3RJbmRleCArIDE7
IGkgPCBzaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBUcmFuc2Zvcm1PcGVyYXRpb25zKiB2
YWwgPSBhdChpKS52YWx1ZSgpOworICAgICAgICAKKyAgICAgICAgLy8gYSBudWxsIHRyYW5zZm9y
bSBtYXRjaGVzIGFueXRoaW5nCisgICAgICAgIGlmICh2YWwtPm9wZXJhdGlvbnMoKS5pc0VtcHR5
KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAoZmly
c3RWYWwtPm9wZXJhdGlvbnMoKS5zaXplKCkgIT0gdmFsLT5vcGVyYXRpb25zKCkuc2l6ZSgpKQor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgCisgICAgICAgIGZvciAoc2l6ZV90IGog
PSAwOyBqIDwgZmlyc3RWYWwtPm9wZXJhdGlvbnMoKS5zaXplKCk7ICsraikgeworICAgICAgICAg
ICAgaWYgKCFmaXJzdFZhbC0+b3BlcmF0aW9ucygpLmF0KGopLT5pc1NhbWVUeXBlKCp2YWwtPm9w
ZXJhdGlvbnMoKS5hdChqKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9Cisg
ICAgfQorCisgICAgLy8ga2V5ZnJhbWVzIGFyZSB2YWxpZCwgZmlsbCBpbiB0aGUgbGlzdAorICAg
IGlzVmFsaWQgPSB0cnVlOworICAgIAorICAgIGRvdWJsZSBsYXN0Um90QW5nbGUgPSAwLjA7Cisg
ICAgZG91YmxlIG1heFJvdEFuZ2xlID0gLTEuMDsKKyAgICAgICAgCisgICAgbGlzdC5yZXNpemUo
Zmlyc3RWYWwtPm9wZXJhdGlvbnMoKS5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGogPSAwOyBq
IDwgZmlyc3RWYWwtPm9wZXJhdGlvbnMoKS5zaXplKCk7ICsraikgeworICAgICAgICBUcmFuc2Zv
cm1PcGVyYXRpb246Ok9wZXJhdGlvblR5cGUgdHlwZSA9IGZpcnN0VmFsLT5vcGVyYXRpb25zKCku
YXQoaiktPmdldE9wZXJhdGlvblR5cGUoKTsKKyAgICAgICAgbGlzdFtqXSA9IHR5cGU7CisgICAg
ICAgIAorICAgICAgICAvLyBpZiB0aGlzIGlzIGEgcm90YXRpb24gZW50cnksIHdlIG5lZWQgdG8g
c2VlIGlmIGFueSBhbmdsZSBkaWZmZXJlbmNlcyBhcmUgPj0gMTgwIGRlZworICAgICAgICBpZiAo
dHlwZSA9PSBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURSkgeworICAgICAgICAgICAgbGFzdFJv
dEFuZ2xlID0gc3RhdGljX2Nhc3Q8Um90YXRlVHJhbnNmb3JtT3BlcmF0aW9uKj4oZmlyc3RWYWwt
Pm9wZXJhdGlvbnMoKS5hdChqKS5nZXQoKSktPmFuZ2xlKCk7CisgICAgICAgICAgICAKKyAgICAg
ICAgICAgIGlmIChtYXhSb3RBbmdsZSA8IDApCisgICAgICAgICAgICAgICAgbWF4Um90QW5nbGUg
PSBmYWJzKGxhc3RSb3RBbmdsZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoc2l6
ZV90IGkgPSBmaXJzdEluZGV4ICsgMTsgaSA8IHNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAg
ICAgY29uc3QgVHJhbnNmb3JtT3BlcmF0aW9ucyogdmFsID0gYXQoaSkudmFsdWUoKTsKKyAgICAg
ICAgICAgICAgICBkb3VibGUgcm90QW5nbGUgPSB2YWwtPm9wZXJhdGlvbnMoKS5pc0VtcHR5KCkg
PyAwIDogKHN0YXRpY19jYXN0PFJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbio+KHZhbC0+b3BlcmF0
aW9ucygpLmF0KGopLmdldCgpKS0+YW5nbGUoKSk7CisgICAgICAgICAgICAgICAgZG91YmxlIGRp
ZmZBbmdsZSA9IGZhYnMocm90QW5nbGUgLSBsYXN0Um90QW5nbGUpOworICAgICAgICAgICAgICAg
IGlmIChkaWZmQW5nbGUgPiBtYXhSb3RBbmdsZSkKKyAgICAgICAgICAgICAgICAgICAgbWF4Um90
QW5nbGUgPSBkaWZmQW5nbGU7CisgICAgICAgICAgICAgICAgbGFzdFJvdEFuZ2xlID0gcm90QW5n
bGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaGFzQmlnUm90
YXRpb24gPSBtYXhSb3RBbmdsZSA+PSAxODAuMDsKK30KKworR3JhcGhpY3NMYXllcjo6R3JhcGhp
Y3NMYXllcihHcmFwaGljc0xheWVyQ2xpZW50KiBjbGllbnQpCis6IG1fY2xpZW50KGNsaWVudCkK
KywgbV9hbmNob3JQb2ludCgwLjVmLCAwLjVmKQorLCBtX29wYWNpdHkoMS4wZikKKywgbV9hbmNo
b3JaKDAuMGYpCisjaWZuZGVmIE5ERUJVRworLCBtX3pQb3NpdGlvbigwLjBmKQorI2VuZGlmCiss
IG1fYmFja2dyb3VuZENvbG9yU2V0KGZhbHNlKQorLCBtX2NvbnRlbnRzT3BhcXVlKGZhbHNlKQor
LCBtX3ByZXNlcnZlczNEKGZhbHNlKQorLCBtX2JhY2tmYWNlVmlzaWJpbGl0eSh0cnVlKQorLCBt
X3VzaW5nVGlsZWRMYXllcihmYWxzZSkKKywgbV9tYXNrc1RvQm91bmRzKGZhbHNlKQorLCBtX2Ry
YXdzQ29udGVudChmYWxzZSkKKywgbV9wYWludGluZ1BoYXNlKEdyYXBoaWNzTGF5ZXJQYWludEFs
bE1hc2spCissIG1fcGFyZW50KDApCisjaWZuZGVmIE5ERUJVRworLCBtX3JlcGFpbnRDb3VudCgw
KQorI2VuZGlmCit7Cit9CisKK0dyYXBoaWNzTGF5ZXI6On5HcmFwaGljc0xheWVyKCkKK3sKKyAg
ICByZW1vdmVBbGxBbmltYXRpb25zKCk7ICAgIAorCisgICAgcmVtb3ZlQWxsQ2hpbGRyZW4oKTsK
KyAgICByZW1vdmVGcm9tUGFyZW50KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllcjo6c2V0TmFt
ZShjb25zdCBTdHJpbmcmIG5hbWUpCit7CisgICAgbV9uYW1lID0gbmFtZTsKK30KKwordm9pZCBH
cmFwaGljc0xheWVyOjpzZXRQYXJlbnQoR3JhcGhpY3NMYXllciogbGF5ZXIpCit7CisgICAgbV9w
YXJlbnQgPSBsYXllcjsKK30KKwordm9pZCBHcmFwaGljc0xheWVyOjphZGRDaGlsZChHcmFwaGlj
c0xheWVyKiBjaGlsZExheWVyKQoreworICAgIEFTU0VSVChjaGlsZExheWVyICE9IHRoaXMpOwor
ICAgIAorICAgIGlmIChjaGlsZExheWVyLT5wYXJlbnQoKSkKKyAgICAgICAgY2hpbGRMYXllci0+
cmVtb3ZlRnJvbVBhcmVudCgpOworCisgICAgY2hpbGRMYXllci0+c2V0UGFyZW50KHRoaXMpOwor
ICAgIG1fY2hpbGRyZW4uYXBwZW5kKGNoaWxkTGF5ZXIpOworfQorCit2b2lkIEdyYXBoaWNzTGF5
ZXI6OmFkZENoaWxkQXRJbmRleChHcmFwaGljc0xheWVyKiBjaGlsZExheWVyLCBpbnQgaW5kZXgp
Cit7CisgICAgQVNTRVJUKGNoaWxkTGF5ZXIgIT0gdGhpcyk7CisKKyAgICBpZiAoY2hpbGRMYXll
ci0+cGFyZW50KCkpCisgICAgICAgIGNoaWxkTGF5ZXItPnJlbW92ZUZyb21QYXJlbnQoKTsKKwor
ICAgIGNoaWxkTGF5ZXItPnNldFBhcmVudCh0aGlzKTsKKyAgICBtX2NoaWxkcmVuLmluc2VydChp
bmRleCwgY2hpbGRMYXllcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllcjo6YWRkQ2hpbGRCZWxv
dyhHcmFwaGljc0xheWVyKiBjaGlsZExheWVyLCBHcmFwaGljc0xheWVyKiBzaWJsaW5nKQorewor
ICAgIEFTU0VSVChjaGlsZExheWVyICE9IHRoaXMpOworICAgIGNoaWxkTGF5ZXItPnJlbW92ZUZy
b21QYXJlbnQoKTsKKworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgbV9jaGlsZHJlbi5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoc2libGlu
ZyA9PSBtX2NoaWxkcmVuW2ldKSB7CisgICAgICAgICAgICBtX2NoaWxkcmVuLmluc2VydChpLCBj
aGlsZExheWVyKTsKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICB9CisgICAgfQorCisgICAgY2hpbGRMYXllci0+c2V0UGFyZW50KHRoaXMpOwor
CisgICAgaWYgKCFmb3VuZCkKKyAgICAgICAgbV9jaGlsZHJlbi5hcHBlbmQoY2hpbGRMYXllcik7
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllcjo6YWRkQ2hpbGRBYm92ZShHcmFwaGljc0xheWVyKiBj
aGlsZExheWVyLCBHcmFwaGljc0xheWVyKiBzaWJsaW5nKQoreworICAgIGNoaWxkTGF5ZXItPnJl
bW92ZUZyb21QYXJlbnQoKTsKKyAgICBBU1NFUlQoY2hpbGRMYXllciAhPSB0aGlzKTsKKworICAg
IGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9jaGls
ZHJlbi5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoc2libGluZyA9PSBtX2NoaWxkcmVuW2ld
KSB7CisgICAgICAgICAgICBtX2NoaWxkcmVuLmluc2VydChpKzEsIGNoaWxkTGF5ZXIpOworICAg
ICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICBjaGlsZExheWVyLT5zZXRQYXJlbnQodGhpcyk7CisKKyAgICBpZiAoIWZvdW5k
KQorICAgICAgICBtX2NoaWxkcmVuLmFwcGVuZChjaGlsZExheWVyKTsKK30KKworYm9vbCBHcmFw
aGljc0xheWVyOjpyZXBsYWNlQ2hpbGQoR3JhcGhpY3NMYXllciogb2xkQ2hpbGQsIEdyYXBoaWNz
TGF5ZXIqIG5ld0NoaWxkKQoreworICAgIEFTU0VSVCghbmV3Q2hpbGQtPnBhcmVudCgpKTsKKyAg
ICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fY2hp
bGRyZW4uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG9sZENoaWxkID09IG1fY2hpbGRyZW5b
aV0pIHsKKyAgICAgICAgICAgIG1fY2hpbGRyZW5baV0gPSBuZXdDaGlsZDsKKyAgICAgICAgICAg
IGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAg
IGlmIChmb3VuZCkgeworICAgICAgICBvbGRDaGlsZC0+c2V0UGFyZW50KDApOworCisgICAgICAg
IG5ld0NoaWxkLT5yZW1vdmVGcm9tUGFyZW50KCk7CisgICAgICAgIG5ld0NoaWxkLT5zZXRQYXJl
bnQodGhpcyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllcjo6cmVtb3ZlQWxsQ2hpbGRyZW4oKQoreworICAgIHdo
aWxlIChtX2NoaWxkcmVuLnNpemUoKSkgeworICAgICAgICBHcmFwaGljc0xheWVyKiBjdXJMYXll
ciA9IG1fY2hpbGRyZW5bMF07CisgICAgICAgIEFTU0VSVChjdXJMYXllci0+cGFyZW50KCkpOwor
ICAgICAgICBjdXJMYXllci0+cmVtb3ZlRnJvbVBhcmVudCgpOworICAgIH0KK30KKwordm9pZCBH
cmFwaGljc0xheWVyOjpyZW1vdmVGcm9tUGFyZW50KCkKK3sKKyAgICBpZiAobV9wYXJlbnQpIHsK
KyAgICAgICAgdW5zaWduZWQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1fcGFyZW50LT5t
X2NoaWxkcmVuLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBtX3BhcmVu
dC0+bV9jaGlsZHJlbltpXSkgeworICAgICAgICAgICAgICAgIG1fcGFyZW50LT5tX2NoaWxkcmVu
LnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorCisgICAgICAgIHNldFBhcmVudCgwKTsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NM
YXllcjo6c2V0UG9zaXRpb24oY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpCit7CisgICAgbV9wb3Np
dGlvbiA9IHBvaW50OworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXI6OnNldEFuY2hvclBvaW50KGNv
bnN0IEZsb2F0UG9pbnQmIHBvaW50LCBmbG9hdCBhbmNob3JaKQoreworICAgIG1fYW5jaG9yUG9p
bnQgPSBwb2ludDsKKyAgICBtX2FuY2hvclogPSBhbmNob3JaOworfQorCit2b2lkIEdyYXBoaWNz
TGF5ZXI6OnNldFNpemUoY29uc3QgRmxvYXRTaXplJiBzaXplKQoreworICAgIG1fc2l6ZSA9IHNp
emU7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllcjo6c2V0VHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9y
bWF0aW9uTWF0cml4JiB0KQoreworICAgIG1fdHJhbnNmb3JtID0gdDsKK30KKwordm9pZCBHcmFw
aGljc0xheWVyOjpzZXRDaGlsZHJlblRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCYgdCkKK3sKKyAgICBtX2NoaWxkcmVuVHJhbnNmb3JtID0gdDsKK30KKwordm9pZCBHcmFwaGlj
c0xheWVyOjpzZXRQcmVzZXJ2ZXMzRChib29sIHByZXNlcnZlczNEKQoreworICAgIG1fcHJlc2Vy
dmVzM0QgPSBwcmVzZXJ2ZXMzRDsKK30KKwordm9pZCBHcmFwaGljc0xheWVyOjpzZXRNYXNrc1Rv
Qm91bmRzKGJvb2wgbWFza3NUb0JvdW5kcykKK3sKKyAgICBtX21hc2tzVG9Cb3VuZHMgPSBtYXNr
c1RvQm91bmRzOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXI6OnNldERyYXdzQ29udGVudChib29s
IGRyYXdzQ29udGVudCkKK3sKKyAgICBtX2RyYXdzQ29udGVudCA9IGRyYXdzQ29udGVudDsKK30K
Kwordm9pZCBHcmFwaGljc0xheWVyOjpzZXRCYWNrZ3JvdW5kQ29sb3IoY29uc3QgQ29sb3ImIGlu
Q29sb3IsIGNvbnN0IEFuaW1hdGlvbiosIGRvdWJsZSAvKmJlZ2luVGltZSovKQoreworICAgIG1f
YmFja2dyb3VuZENvbG9yID0gaW5Db2xvcjsKKyAgICBtX2JhY2tncm91bmRDb2xvclNldCA9IHRy
dWU7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllcjo6Y2xlYXJCYWNrZ3JvdW5kQ29sb3IoKQorewor
ICAgIG1fYmFja2dyb3VuZENvbG9yID0gQ29sb3IoKTsKKyAgICBtX2JhY2tncm91bmRDb2xvclNl
dCA9IGZhbHNlOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXI6OnNldENvbnRlbnRzT3BhcXVlKGJv
b2wgb3BhcXVlKQoreworICAgIG1fY29udGVudHNPcGFxdWUgPSBvcGFxdWU7Cit9CisKK3ZvaWQg
R3JhcGhpY3NMYXllcjo6c2V0QmFja2ZhY2VWaXNpYmlsaXR5KGJvb2wgdmlzaWJsZSkKK3sKKyAg
ICBtX2JhY2tmYWNlVmlzaWJpbGl0eSA9IHZpc2libGU7Cit9CisKK2Jvb2wgR3JhcGhpY3NMYXll
cjo6c2V0T3BhY2l0eShmbG9hdCBvcGFjaXR5LCBjb25zdCBBbmltYXRpb24qLCBkb3VibGUpCit7
CisgICAgbV9vcGFjaXR5ID0gb3BhY2l0eTsKKyAgICByZXR1cm4gZmFsc2U7ICAgICAgIC8vIG5v
dCBhbmltYXRpbmcKK30KKwordm9pZCBHcmFwaGljc0xheWVyOjpzZXREcmF3aW5nUGhhc2UoR3Jh
cGhpY3NMYXllclBhaW50aW5nUGhhc2UgcGhhc2UpCit7CisgICAgbV9wYWludGluZ1BoYXNlID0g
cGhhc2U7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllcjo6c2V0TmVlZHNEaXNwbGF5KCkKK3sKK30K
Kwordm9pZCBHcmFwaGljc0xheWVyOjpzZXROZWVkc0Rpc3BsYXlJblJlY3QoY29uc3QgRmxvYXRS
ZWN0JikKK3sKK30KKworYm9vbCBHcmFwaGljc0xheWVyOjphbmltYXRlVHJhbnNmb3JtKGNvbnN0
IFRyYW5zZm9ybVZhbHVlTGlzdCYsIGNvbnN0IEludFNpemUmLCBjb25zdCBBbmltYXRpb24qLCBk
b3VibGUgLypiZWdpblRpbWUqLywgYm9vbCAvKmlzVHJhbnNpdGlvbiovKQoreworICAgIHJldHVy
biBmYWxzZTsKK30KKworYm9vbAorR3JhcGhpY3NMYXllcjo6YW5pbWF0ZUZsb2F0KEFuaW1hdGVk
UHJvcGVydHlJRCwgY29uc3QgRmxvYXRWYWx1ZUxpc3QmLCBjb25zdCBBbmltYXRpb24qLCBkb3Vi
bGUgLypiZWdpblRpbWUqLykKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NMYXllcjo6cGFpbnRHcmFwaGljc0xheWVyQ29udGVudHMoR3JhcGhpY3NDb250ZXh0JiBjb250
ZXh0LCBjb25zdCBJbnRSZWN0JiBjbGlwKQoreworICAgIG1fY2xpZW50LT5wYWludENvbnRlbnRz
KHRoaXMsIGNvbnRleHQsIG1fcGFpbnRpbmdQaGFzZSwgY2xpcCk7Cit9CisKK0dyYXBoaWNzTGF5
ZXIqIEdyYXBoaWNzTGF5ZXI6OmhpdFRlc3QoY29uc3QgRmxvYXRQb2ludCYsIHN0cnVjdCBMYXll
ckhpdFRlc3REYXRhKikgY29uc3QKK3sKKyAgICByZXR1cm4gMDsKK30KKworYm9vbCBHcmFwaGlj
c0xheWVyOjpsYXllckNvbnRhaW5zUG9pbnQoY29uc3QgRmxvYXRQb2ludCYpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIGZhbHNlOworfQorCitTdHJpbmcgR3JhcGhpY3NMYXllcjo6cHJvcGVydHlJZFRv
U3RyaW5nKEFuaW1hdGVkUHJvcGVydHlJRCBwcm9wZXJ0eSkKK3sKKyAgICBzd2l0Y2gocHJvcGVy
dHkpIHsKKyAgICAgICAgY2FzZSBBbmltYXRlZFByb3BlcnR5V2Via2l0VHJhbnNmb3JtOiByZXR1
cm4gInRyYW5zZm9ybSI7CisgICAgICAgIGNhc2UgQW5pbWF0ZWRQcm9wZXJ0eUJhY2tncm91bmRD
b2xvcjogcmV0dXJuICJiYWNrZ3JvdW5kQ29sb3IiOworICAgICAgICBjYXNlIEFuaW1hdGVkUHJv
cGVydHlPcGFjaXR5OiByZXR1cm4gIm9wYWNpdHkiOworICAgICAgICBkZWZhdWx0OiByZXR1cm4g
IiI7CisgICAgfQorfQorCitpbnQgR3JhcGhpY3NMYXllcjo6ZmluZEFuaW1hdGlvbkVudHJ5KEFu
aW1hdGVkUHJvcGVydHlJRCBwcm9wZXJ0eSwgc2hvcnQgaW5kZXgpIGNvbnN0Cit7CisgICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCBtX2FuaW1hdGlvbnMuc2l6ZSgpOyArK2kpCisgICAgICAgIGlm
IChtX2FuaW1hdGlvbnNbaV0ucHJvcGVydHkgPT0gcHJvcGVydHkgJiYgbV9hbmltYXRpb25zW2ld
LmluZGV4ID09IGluZGV4KQorICAgICAgICAgICAgcmV0dXJuIChpbnQpIGk7CisgICAgICAgICAg
ICAKKyAgICByZXR1cm4gLTE7Cit9CisKK2Jvb2wgR3JhcGhpY3NMYXllcjo6YWRkQW5pbWF0aW9u
RW50cnkoQW5pbWF0ZWRQcm9wZXJ0eUlEIHByb3BlcnR5LCBzaG9ydCBpbmRleCwgZG91YmxlIGJl
Z2luVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlz
VHJhbnNpdGlvbiwgY29uc3QgQW5pbWF0aW9uKiB0cmFuc2l0aW9uKQoreworICAgIC8vIEFkZCBh
biBlbnRyeSB0byB0aGUgYWN0aXZlIGFuaW1hdGlvbiBsaXN0IChtX2FuaW1hdGlvbnMpIHdpdGgg
dGhlIHBhc3NlZCBwYXJhbXMuIFJldHVybiB0cnVlIGlmIGFuCisgICAgLy8gYW5pbWF0aW9uIHNo
b3VsZCBiZSBzZW50IHRvIENBIChhbmltYXRpb24gaXMgbm90IHBhdXNlZCkuIFRoZSBiZWdpblRp
bWUgdmFsdWUgaXMgcGFzc2VkIGluIGFzICJub3ciLgorICAgIC8vIElmIHJldHVybiB2YWx1ZSBp
cyB0cnVlLCBiZWdpblRpbWUgaXMgcmV0dXJuZWQgd2l0aCB0aGUgdmFsdWUgdGhhdCBzaG91bGQg
YmUgc2VudCB0byBDQS4gSWYgdGhlIGFuaW1hdGlvbiAKKyAgICAvLyBoYWQgYmVlbiBwYXVzZWQs
IHRoaXMgdmFsdWUgd2lsbCBiZSBtb2RpZmllZCB0byBhZGp1c3QgZm9yIHRoZSBwYXVzZS4KKyAg
ICBpbnQgaSA9IGZpbmRBbmltYXRpb25FbnRyeShwcm9wZXJ0eSwgaW5kZXgpOworICAgIAorICAg
IGlmIChpID49IDApIHsKKyAgICAgICAgbV9hbmltYXRpb25zW2ldLmlzQ3VycmVudCA9IHRydWU7
CisgICAgICAgIG1fYW5pbWF0aW9uc1tpXS5iZWdpblRpbWUgPSBiZWdpblRpbWU7CisgICAgfQor
ICAgIGVsc2UgeworICAgICAgICAvLyBubyBhbmltYXRpb24geWV0LCBhZGQgaXQKKyAgICAgICAg
aSA9IChpbnQpIG1fYW5pbWF0aW9ucy5zaXplKCk7CisgICAgICAgIG1fYW5pbWF0aW9ucy5hcHBl
bmQoQW5pbWF0aW9uRW50cnkoKSk7CisgICAgICAgIG1fYW5pbWF0aW9uc1tpXS5iZWdpblRpbWUg
PSBiZWdpblRpbWU7CisgICAgICAgIG1fYW5pbWF0aW9uc1tpXS5wcm9wZXJ0eSA9IHByb3BlcnR5
OworICAgICAgICBtX2FuaW1hdGlvbnNbaV0uaW5kZXggPSBpbmRleDsKKyAgICB9CisgICAgCisg
ICAgbV9hbmltYXRpb25zW2ldLmlzVHJhbnNpdGlvbiA9IGlzVHJhbnNpdGlvbjsKKyAgICBtX2Fu
aW1hdGlvbnNbaV0uYW5pbUxheWVyID0gY29uc3RfY2FzdDxBbmltYXRpb24qPih0cmFuc2l0aW9u
KTsKKyAgICAKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyOjpyZW1v
dmVBbGxBbmltYXRpb25zKCkKK3sKKyAgICBzaXplX3Qgc2l6ZSA9IG1fYW5pbWF0aW9ucy5zaXpl
KCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpCisgICAgICAgIHJlbW92
ZUFuaW1hdGlvbigwLCB0cnVlKTsKK30KKworCit2b2lkIEdyYXBoaWNzTGF5ZXI6OnJlbW92ZUFs
bEFuaW1hdGlvbnNGb3JQcm9wZXJ0eShBbmltYXRlZFByb3BlcnR5SUQgcHJvcGVydHkpCit7Cisg
ICAgZm9yIChzaG9ydCBqID0gMDsgOyArK2opIHsKKyAgICAgICAgaW50IGkgPSBmaW5kQW5pbWF0
aW9uRW50cnkocHJvcGVydHksIGopOworICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgcmVtb3ZlQW5pbWF0aW9uKGksIGZhbHNlKTsKKyAgICB9Cit9CisKK3Zv
aWQgR3JhcGhpY3NMYXllcjo6cmVtb3ZlRmluaXNoZWRBbmltYXRpb25zKGNvbnN0IFN0cmluZyYg
bmFtZSwgaW50IC8qaW5kZXgqLywgYm9vbCByZXNldCkKK3sKKyAgICBzaXplX3Qgc2l6ZSA9IG1f
YW5pbWF0aW9ucy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyApIHsK
KyAgICAgICAgQW5pbWF0aW9uRW50cnkmIGFuaW0gPSBtX2FuaW1hdGlvbnNbaV07CisgICAgICAg
IGlmICghYW5pbS5pc1RyYW5zaXRpb24gJiYgYW5pbS5hbmltTGF5ZXItPm5hbWUoKSA9PSBuYW1l
KSB7CisgICAgICAgICAgICByZW1vdmVBbmltYXRpb24oaSwgcmVzZXQpOworICAgICAgICAgICAg
LS1zaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICsraTsKKyAgICB9
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllcjo6cmVtb3ZlRmluaXNoZWRUcmFuc2l0aW9ucyhpbnQg
cHJvcGVydHkpCit7CisgICAgc2l6ZV90IHNpemUgPSBtX2FuaW1hdGlvbnMuc2l6ZSgpOworICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKSB7CisgICAgICAgIEFuaW1hdGlvbkVudHJ5
JiBhbmltID0gbV9hbmltYXRpb25zW2ldOworICAgICAgICBpZiAoYW5pbS5pc1RyYW5zaXRpb24g
JiYgKHByb3BlcnR5ID09IGNBbmltYXRlQWxsIHx8IChpbnQpIGFuaW0ucHJvcGVydHkgID09IHBy
b3BlcnR5KSkgeworICAgICAgICAgICAgcmVtb3ZlQW5pbWF0aW9uKGksIGZhbHNlKTsKKyAgICAg
ICAgICAgIC0tc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICArK2k7
CisgICAgfQorfQorCit2b2lkIEdyYXBoaWNzTGF5ZXI6OnN1c3BlbmRBbmltYXRpb25zKCkKK3sK
K30KKwordm9pZCBHcmFwaGljc0xheWVyOjpyZXN1bWVBbmltYXRpb25zKCkKK3sKK30KKworYm9v
bCBHcmFwaGljc0xheWVyOjpjb250ZW50c0NvbnRhaW5Qb2ludChjb25zdCBJbnRQb2ludCYgcG9p
bnQpIGNvbnN0CisgeworICAgIGlmICghbV9jbGllbnQpIHsKKyAgICAgICAgLy8gTWFza2luZyBs
YXllcnMgaGF2ZSB0byByZXR1cm4gdHJ1ZSBpZiB0aGVpciBjaGlsZCBsYXllcnMgYXJlIHRvIGJl
IGNvbnNpZGVyZWQgZm9yCisgICAgICAgIC8vIGhpdCB0ZXN0aW5nCisgICAgICAgIEZsb2F0UmVj
dCBib3VuZHMoRmxvYXRQb2ludCgpLCBzaXplKCkpOworICAgICAgICByZXR1cm4gbV9tYXNrc1Rv
Qm91bmRzID8gYm91bmRzLmNvbnRhaW5zKHBvaW50KSA6IGZhbHNlOworICAgIH0KKyAgICAgCisg
ICAgLy8gQ29udmVydCBmcm9tIEdyYXBoaWNzTGF5ZXIgdG8gUmVuZGVyTGF5ZXIgY29vcmRzCisg
ICAgRmxvYXRQb2ludCBjb250ZW50UG9pbnQgPSBtX2NsaWVudC0+Y29udmVydFRvQ29udGVudHND
b29yZGluYXRlcyh0aGlzLCBwb2ludCk7CisKKyAgICBpbnQgeCA9IChpbnQpcm91bmRmKGNvbnRl
bnRQb2ludC54KCkpOworICAgIGludCB5ID0gKGludClyb3VuZGYoY29udGVudFBvaW50LnkoKSk7
CisKKyAgICBBU1NFUlQoc0hpdFRlc3REYXRhKTsKKyAgICByZXR1cm4gbV9jbGllbnQtPmNvbnRl
bnRzQ29udGFpblBvaW50KHRoaXMsIEludFBvaW50KHgsIHkpLCBtX3BhaW50aW5nUGhhc2UsIHNI
aXRUZXN0RGF0YSk7Cit9CisKK0Zsb2F0UG9pbnQgR3JhcGhpY3NMYXllcjo6Y29udmVydFBvaW50
VG9MYXllcihjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgR3JhcGhpY3NMYXllciopIGNvbnN0Cit7
CisgICAgcmV0dXJuIHBvaW50OworfQorCitGbG9hdFBvaW50IEdyYXBoaWNzTGF5ZXI6OmNvbnZl
cnRQb2ludEZyb21MYXllcihjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgR3JhcGhpY3NMYXllciop
IGNvbnN0Cit7CisgICAgcmV0dXJuIHBvaW50OworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXI6OmNv
bnZlcnRRdWFkVG9MYXllcihGbG9hdFF1YWQmLCBjb25zdCBHcmFwaGljc0xheWVyKikgY29uc3QK
K3sKK30KKworI2lmbmRlZiBOREVCVUcKK3ZvaWQgR3JhcGhpY3NMYXllcjo6dXBkYXRlRGVidWdJ
bmRpY2F0b3JzKCkKK3sKKyAgICBpZiAoR3JhcGhpY3NMYXllcjo6c2hvd0xheWVySGllcmFyY2h5
KCkgfHwgR3JhcGhpY3NMYXllcjo6c2hvd0RlYnVnQm9yZGVycygpKSB7CisgICAgICAgIGlmIChk
cmF3c0NvbnRlbnQoKSkKKyAgICAgICAgICAgIGlmIChtX3VzaW5nVGlsZWRMYXllcikKKyAgICAg
ICAgICAgICAgICBzZXREZWJ1Z0JvcmRlcihDb2xvcigwLCAyNTUsIDAsIDIwNCksIDIuMGYpOyAg
ICAvLyB0aWxlZCBsYXllcjogZ3JlZW4KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAg
ICBzZXREZWJ1Z0JvcmRlcihDb2xvcigyNTUsIDAsIDAsIDIwNCksIDIuMGYpOyAgICAvLyBub3Jt
YWwgbGF5ZXI6IHJlZAorICAgICAgICBlbHNlIGlmIChtYXNrc1RvQm91bmRzKCkpIHsKKyAgICAg
ICAgICAgIHNldERlYnVnQm9yZGVyKENvbG9yKDEyOCwgMjU1LCAyNTUsIDE3OCksIDIuMGYpOyAg
ICAvLyBtYXNraW5nIGxheWVyOiBwYWxlIGJsdWUKKyAgICAgICAgICAgIGlmIChHcmFwaGljc0xh
eWVyOjpzaG93RGVidWdCb3JkZXJzKCkpCisgICAgICAgICAgICAgICAgc2V0RGVidWdCYWNrZ3Jv
dW5kQ29sb3IoQ29sb3IoMTI4LCAyNTUsIDI1NSwgNTIpKTsKKyAgICAgICAgfSBlbHNlCisgICAg
ICAgICAgICBzZXREZWJ1Z0JvcmRlcihDb2xvcigyNTUsIDI1NSwgMCwgMjA0KSwgMi4wZik7ICAg
ICAgLy8gY29udGFpbmVyOiB5ZWxsb3cKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllcjo6
c2V0WlBvc2l0aW9uKGZsb2F0IHBvc2l0aW9uKQoreworICAgIG1felBvc2l0aW9uID0gcG9zaXRp
b247Cit9CisjZW5kaWYKKwordm9pZCB3cml0ZUluZGVudChUZXh0U3RyZWFtJiB0cywgaW50IGlu
ZGVudCkKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSAhPSBpbmRlbnQ7ICsraSkKKyAgICAgICAg
dHMgPDwgIiAgIjsKK30KKwordm9pZCBHcmFwaGljc0xheWVyOjpkdW1wTGF5ZXIoVGV4dFN0cmVh
bSYgdHMsIGludCBpbmRlbnQpIGNvbnN0Cit7CisgICAgd3JpdGVJbmRlbnQodHMsIGluZGVudCk7
CisgICAgdHMgPDwgIigiIDw8IGR1bXBOYW1lKCkgPDwgIiAiIDw8ICh2b2lkKil0aGlzOworICAg
IHRzIDw8ICIgXCIiIDw8IG1fbmFtZSA8PCAiXCJcbiI7CisgICAgZHVtcFByb3BlcnRpZXModHMs
IGluZGVudCk7CisgICAgd3JpdGVJbmRlbnQodHMsIGluZGVudCk7CisgICAgdHMgPDwgIilcbiI7
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllcjo6ZHVtcFByb3BlcnRpZXMoVGV4dFN0cmVhbSYgdHMs
IGludCBpbmRlbnQpIGNvbnN0Cit7CisgICAgd3JpdGVJbmRlbnQodHMsIGluZGVudCsxKTsKKy8v
ICAgIHRzIDw8ICIoQ0FMYXllciAiIDw8ICh2b2lkKiltX2xheWVyLmdldCgpIDw8ICIsIHRyYW5z
Zm9ybWxheWVyICIgPDwgKHZvaWQqKW1fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkgPDwgIilcbiI7CisK
KyAgICB3cml0ZUluZGVudCh0cywgaW5kZW50KzEpOworICAgIHRzIDw8ICIocG9zaXRpb24gIiA8
PCBtX3Bvc2l0aW9uLngoKSA8PCAiICIgPDwgbV9wb3NpdGlvbi55KCkgPDwgIilcbiI7CisKKyAg
ICB3cml0ZUluZGVudCh0cywgaW5kZW50KzEpOworICAgIHRzIDw8ICIoYW5jaG9yICIgPDwgbV9h
bmNob3JQb2ludC54KCkgPDwgIiAiIDw8IG1fYW5jaG9yUG9pbnQueSgpIDw8ICIpXG4iOworCisg
ICAgd3JpdGVJbmRlbnQodHMsIGluZGVudCsxKTsKKyAgICB0cyA8PCAiKGJvdW5kcyAiIDw8IG1f
c2l6ZS53aWR0aCgpIDw8ICIgIiA8PCBtX3NpemUuaGVpZ2h0KCkgPDwgIilcbiI7CisKKyAgICB3
cml0ZUluZGVudCh0cywgaW5kZW50KzEpOworICAgIHRzIDw8ICIob3BhY2l0eSAiIDw8IG1fb3Bh
Y2l0eSA8PCAiKVxuIjsKKyAgICAKKyAgICB3cml0ZUluZGVudCh0cywgaW5kZW50KzEpOworICAg
IHRzIDw8ICIodXNpbmdUaWxlZExheWVyICIgPDwgbV91c2luZ1RpbGVkTGF5ZXIgPDwgIilcbiI7
CisKKyAgICB3cml0ZUluZGVudCh0cywgaW5kZW50KzEpOworICAgIHRzIDw8ICIobV9wcmVzZXJ2
ZXMzRCAiIDw8IG1fcHJlc2VydmVzM0QgPDwgIilcbiI7CisKKyAgICB3cml0ZUluZGVudCh0cywg
aW5kZW50KzEpOworICAgIHRzIDw8ICIoZHJhd3NDb250ZW50ICIgPDwgbV9kcmF3c0NvbnRlbnQg
PDwgIilcbiI7CisKKyAgICB3cml0ZUluZGVudCh0cywgaW5kZW50KzEpOworICAgIHRzIDw8ICIo
bV9iYWNrZmFjZVZpc2liaWxpdHkgIiA8PCAobV9iYWNrZmFjZVZpc2liaWxpdHkgPyAidmlzaWJs
ZSIgOiAiaGlkZGVuIikgPDwgIilcbiI7CisKKyAgICB3cml0ZUluZGVudCh0cywgaW5kZW50KzEp
OworICAgIHRzIDw8ICIoY2xpZW50ICI7CisgICAgaWYgKG1fY2xpZW50KQorICAgICAgICB0cyA8
PCAodm9pZCopbV9jbGllbnQ7CisgICAgZWxzZQorICAgICAgICB0cyA8PCAibm9uZSI7CisgICAg
dHMgPDwgIilcbiI7CisKKyAgICB3cml0ZUluZGVudCh0cywgaW5kZW50KzEpOworICAgIHRzIDw8
ICIoYmFja2dyb3VuZENvbG9yICI7CisgICAgaWYgKCFtX2JhY2tncm91bmRDb2xvclNldCkKKyAg
ICAgICAgdHMgPDwgIm5vbmUiOworICAgIGVsc2UKKyAgICAgICAgdHMgPDwgbV9iYWNrZ3JvdW5k
Q29sb3IubmFtZSgpOworICAgIHRzIDw8ICIpXG4iOworCisgICAgd3JpdGVJbmRlbnQodHMsIGlu
ZGVudCsxKTsKKyAgICB0cyA8PCAiKHRyYW5zZm9ybSAiOworICAgIGlmIChtX3RyYW5zZm9ybS5p
c0lkZW50aXR5KCkpCisgICAgICAgIHRzIDw8ICJpZGVudGl0eSI7CisgICAgZWxzZSB7CisgICAg
ICAgIHRzIDw8ICJbIiA8PCBtX3RyYW5zZm9ybS5hKCkgPDwgIiAiIDw8IG1fdHJhbnNmb3JtLmIo
KSA8PCAiXSAiOworICAgICAgICB0cyA8PCAiWyIgPDwgbV90cmFuc2Zvcm0uYygpIDw8ICIgIiA8
PCBtX3RyYW5zZm9ybS5kKCkgPDwgIl0gIjsKKyAgICAgICAgdHMgPDwgIlsiIDw8IG1fdHJhbnNm
b3JtLmUoKSA8PCAiICIgPDwgbV90cmFuc2Zvcm0uZigpIDw8ICJdICI7CisgICAgfQorICAgIHRz
IDw8ICIpXG4iOworCisgICAgd3JpdGVJbmRlbnQodHMsIGluZGVudCsxKTsKKyAgICB0cyA8PCAi
KGNoaWxkcmVuVHJhbnNmb3JtICI7CisgICAgaWYgKG1fY2hpbGRyZW5UcmFuc2Zvcm0uaXNJZGVu
dGl0eSgpKQorICAgICAgICB0cyA8PCAiaWRlbnRpdHkiOworICAgIGVsc2UgeworICAgICAgICB0
cyA8PCAiWyIgPDwgbV9jaGlsZHJlblRyYW5zZm9ybS5hKCkgPDwgIiAiIDw8IG1fY2hpbGRyZW5U
cmFuc2Zvcm0uYigpIDw8ICJdICI7CisgICAgICAgIHRzIDw8ICJbIiA8PCBtX2NoaWxkcmVuVHJh
bnNmb3JtLmMoKSA8PCAiICIgPDwgbV9jaGlsZHJlblRyYW5zZm9ybS5kKCkgPDwgIl0gIjsKKyAg
ICAgICAgdHMgPDwgIlsiIDw8IG1fY2hpbGRyZW5UcmFuc2Zvcm0uZSgpIDw8ICIgIiA8PCBtX2No
aWxkcmVuVHJhbnNmb3JtLmYoKSA8PCAiXSAiOworICAgIH0KKyAgICB0cyA8PCAiKVxuIjsKKwor
ICAgIHdyaXRlSW5kZW50KHRzLCBpbmRlbnQrMSk7CisgICAgdHMgPDwgIihjaGlsZHJlbiAiIDw8
IG1fY2hpbGRyZW4uc2l6ZSgpIDw8ICJcbiI7CisgICAgCisgICAgdW5zaWduZWQgaTsKKyAgICBm
b3IgKGkgPSAwOyBpIDwgbV9jaGlsZHJlbi5zaXplKCk7IGkrKykKKyAgICAgICAgbV9jaGlsZHJl
bltpXS0+ZHVtcExheWVyKHRzLCBpbmRlbnQrMik7CisgICAgd3JpdGVJbmRlbnQodHMsIGluZGVu
dCsxKTsKKyAgICB0cyA8PCAiKVxuIjsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisj
ZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQpkaWZmIC0tZ2l0IGEvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0xheWVyLmggYi9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL0dyYXBoaWNzTGF5ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
Li40MDBiYmM3Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9H
cmFwaGljc0xheWVyLmgKQEAgLTAsMCArMSw0MDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisg
KiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisg
KiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5h
bWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9y
IHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRo
b3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Cisg
KiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBHcmFwaGljc0xheWVyX2gKKyNkZWZp
bmUgR3JhcGhpY3NMYXllcl9oCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisK
KyNpbmNsdWRlICJBbmltYXRpb24uaCIKKyNpbmNsdWRlICJDb2xvci5oIgorI2luY2x1ZGUgIkZs
b2F0UG9pbnQuaCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJGbG9hdFF1YWQu
aCIKKyNpbmNsdWRlICJHcmFwaGljc0xheWVyQ2xpZW50LmgiCisjaW5jbHVkZSAiSW50UmVjdC5o
IgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiVGV4dFN0cmVhbS5oIgor
I2luY2x1ZGUgIlRpbWluZ0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRy
aXguaCIKKyNpbmNsdWRlICJUcmFuc2Zvcm1PcGVyYXRpb25zLmgiCisKKyNpbmNsdWRlIDx3dGYv
T3duUHRyLmg+CisKKyNpZiBQTEFURk9STShNQUMpCisjaWZkZWYgX19PQkpDX18KK0BjbGFzcyBX
S0xheWVyOworQGNsYXNzIENBTGF5ZXI7Cit0eXBlZGVmIFdLTGF5ZXIgUGxhdGZvcm1MYXllcjsK
K3R5cGVkZWYgQ0FMYXllciogTmF0aXZlTGF5ZXI7CisjZWxzZQordHlwZWRlZiB2b2lkKiBQbGF0
Zm9ybUxheWVyOwordHlwZWRlZiB2b2lkKiBOYXRpdmVMYXllcjsKKyNlbmRpZgorI2Vsc2UKK3R5
cGVkZWYgdm9pZCogUGxhdGZvcm1MYXllcjsKK3R5cGVkZWYgdm9pZCogTmF0aXZlTGF5ZXI7Cisj
ZW5kaWYKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBHcmFwaGljc0NvbnRleHQ7Citj
bGFzcyBJbWFnZTsKK2NsYXNzIFRpbWluZ0Z1bmN0aW9uOworCisvLyBHcmFwaGljc0xheWVyIGlz
IGFuIGFic3RyYWN0aW9uIGZvciBhIHJlbmRlcmluZyBzdXJmYWNlIHdpdGggYmFja2luZyBzdG9y
ZSwKKy8vIHdoaWNoIG1heSBoYXZlIGFzc29jaWF0ZWQgdHJhbnNmb3JtYXRpb24gYW5kIGFuaW1h
dGlvbnMuCisKKy8vIEZJWE1FOiBpbmhlcml0IGZyb20gVHJlZVNoYXJlZD8KK2NsYXNzIEdyYXBo
aWNzTGF5ZXIgeworcHVibGljOgorICAgIC8vIFVzZWQgdG8gc3RvcmUgb25lIGZsb2F0IHZhbHVl
IG9mIGEga2V5ZnJhbWUgYW5pbWF0aW9uLgorICAgIGNsYXNzIEZsb2F0VmFsdWUgeworICAgIHB1
YmxpYzoKKyAgICAgICAgRmxvYXRWYWx1ZShmbG9hdCBrZXkgPSBuYW5mKDApLCBmbG9hdCB2YWx1
ZSA9IDAsIGNvbnN0IFRpbWluZ0Z1bmN0aW9uKiB0aW1pbmdGdW5jdGlvbiA9IDApCisgICAgICAg
ICAgICA6IG1LZXkoa2V5KSwgbVZhbCh2YWx1ZSksIG1URigwKQorICAgICAgICB7CisgICAgICAg
ICAgICBpZiAodGltaW5nRnVuY3Rpb24pCisgICAgICAgICAgICAgICAgbVRGLnNldChuZXcgVGlt
aW5nRnVuY3Rpb24oKnRpbWluZ0Z1bmN0aW9uKSk7CisgICAgICAgIH0KKworICAgICAgICBGbG9h
dFZhbHVlKGNvbnN0IEZsb2F0VmFsdWUmIG90aGVyKQorICAgICAgICAgICAgOiBtS2V5KG90aGVy
LmtleSgpKSwgbVZhbChvdGhlci52YWx1ZSgpKSwgbVRGKDApCisgICAgICAgIHsKKyAgICAgICAg
ICAgIGlmIChvdGhlci50aW1pbmdGdW5jdGlvbigpKQorICAgICAgICAgICAgICAgIG1URi5zZXQo
bmV3IFRpbWluZ0Z1bmN0aW9uKCpvdGhlci50aW1pbmdGdW5jdGlvbigpKSk7CisgICAgICAgIH0K
KworICAgICAgICBjb25zdCBGbG9hdFZhbHVlJiBvcGVyYXRvcj0oY29uc3QgRmxvYXRWYWx1ZSYg
b3RoZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgmb3RoZXIgIT0gdGhpcykKKyAgICAg
ICAgICAgICAgICBzZXQob3RoZXIua2V5KCksIG90aGVyLnZhbHVlKCksIG90aGVyLnRpbWluZ0Z1
bmN0aW9uKCkpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAg
ICAgdm9pZCBzZXQoZmxvYXQga2V5LCBmbG9hdCB2YWx1ZSwgY29uc3QgVGltaW5nRnVuY3Rpb24q
KTsKKyAgICAgICAgCisgICAgICAgIGZsb2F0IGtleSgpIGNvbnN0IHsgcmV0dXJuIG1LZXk7IH0K
KyAgICAgICAgZmxvYXQgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtVmFsOyB9CisgICAgICAgIGNv
bnN0IFRpbWluZ0Z1bmN0aW9uKiB0aW1pbmdGdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1URi5n
ZXQoKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgZmxvYXQgbUtleTsKKyAgICAgICAgZmxv
YXQgbVZhbDsKKyAgICAgICAgT3duUHRyPFRpbWluZ0Z1bmN0aW9uPiBtVEY7CisgICAgfTsKKyAg
ICAKKyAgICAKKyAgICBjbGFzcyBGbG9hdFZhbHVlTGlzdCA6IHB1YmxpYyBWZWN0b3I8RmxvYXRW
YWx1ZT4geworICAgIHB1YmxpYzoKKyAgICAgICAgdm9pZCBpbnNlcnQoZmxvYXQga2V5LCBmbG9h
dCB2YWwsIGNvbnN0IFRpbWluZ0Z1bmN0aW9uKiB0Zik7CisgICAgfTsKKworICAgIC8vIFVzZWQg
dG8gc3RvcmUgb25lIHRyYW5zZm9ybSBpbiBhIGtleWZyYW1lIGxpc3QuCisgICAgY2xhc3MgVHJh
bnNmb3JtVmFsdWUgeworICAgIHB1YmxpYzoKKyAgICAgICAgVHJhbnNmb3JtVmFsdWUoZmxvYXQg
a2V5ID0gbmFuZigwKSwgY29uc3QgVHJhbnNmb3JtT3BlcmF0aW9ucyogdmFsdWUgPSAwLCBjb25z
dCBUaW1pbmdGdW5jdGlvbiogdGltaW5nRnVuY3Rpb24gPSAwKQorICAgICAgICAgICAgOiBtS2V5
KGtleSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZhbHVlKQorICAgICAgICAgICAgICAg
IG1WYWwuc2V0KG5ldyBUcmFuc2Zvcm1PcGVyYXRpb25zKCp2YWx1ZSkpOworICAgICAgICAgICAg
aWYgKHRpbWluZ0Z1bmN0aW9uKQorICAgICAgICAgICAgICAgIG1URi5zZXQobmV3IFRpbWluZ0Z1
bmN0aW9uKCp0aW1pbmdGdW5jdGlvbikpOworICAgICAgICB9CisKKyAgICAgICAgVHJhbnNmb3Jt
VmFsdWUoY29uc3QgVHJhbnNmb3JtVmFsdWUmIG90aGVyKQorICAgICAgICAgICAgOiBtS2V5KG90
aGVyLmtleSgpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAob3RoZXIudmFsdWUoKSkKKyAg
ICAgICAgICAgICAgICBtVmFsLnNldChuZXcgVHJhbnNmb3JtT3BlcmF0aW9ucygqb3RoZXIudmFs
dWUoKSkpOworICAgICAgICAgICAgaWYgKG90aGVyLnRpbWluZ0Z1bmN0aW9uKCkpCisgICAgICAg
ICAgICAgICAgbVRGLnNldChuZXcgVGltaW5nRnVuY3Rpb24oKm90aGVyLnRpbWluZ0Z1bmN0aW9u
KCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IFRyYW5zZm9ybVZhbHVlJiBvcGVyYXRv
cj0oY29uc3QgVHJhbnNmb3JtVmFsdWUmIG90aGVyKQorICAgICAgICB7CisgICAgICAgICAgICBp
ZiAoJm90aGVyICE9IHRoaXMpCisgICAgICAgICAgICAgICAgc2V0KG90aGVyLmtleSgpLCBvdGhl
ci52YWx1ZSgpLCBvdGhlci50aW1pbmdGdW5jdGlvbigpKTsKKyAgICAgICAgICAgIHJldHVybiAq
dGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0KGZsb2F0IGtleSwgY29uc3QgVHJh
bnNmb3JtT3BlcmF0aW9ucyogdmFsdWUsIGNvbnN0IFRpbWluZ0Z1bmN0aW9uKiB0aW1pbmdGdW5j
dGlvbik7CisKKyAgICAgICAgZmxvYXQga2V5KCkgY29uc3QgeyByZXR1cm4gbUtleTsgfQorICAg
ICAgICBjb25zdCBUcmFuc2Zvcm1PcGVyYXRpb25zKiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1W
YWwuZ2V0KCk7IH0KKyAgICAgICAgY29uc3QgVGltaW5nRnVuY3Rpb24qIHRpbWluZ0Z1bmN0aW9u
KCkgY29uc3QgeyByZXR1cm4gbVRGLmdldCgpOyB9CisgICAgICAgIAorICAgIHByaXZhdGU6Cisg
ICAgICAgIGZsb2F0IG1LZXk7CisgICAgICAgIE93blB0cjxUcmFuc2Zvcm1PcGVyYXRpb25zPiBt
VmFsOworICAgICAgICBPd25QdHI8VGltaW5nRnVuY3Rpb24+IG1URjsKKyAgICB9OworICAgIAor
ICAgIC8vIFVzZWQgdG8gc3RvcmUgYSBzZXJpZXMgb2YgdHJhbnNmb3JtcyBpbiBhIGtleWZyYW1l
IGxpc3QuCisgICAgY2xhc3MgVHJhbnNmb3JtVmFsdWVMaXN0IDogcHVibGljIFZlY3RvcjxUcmFu
c2Zvcm1WYWx1ZT4geworICAgIHB1YmxpYzoKKyAgICAgICAgdHlwZWRlZiBWZWN0b3I8VHJhbnNm
b3JtT3BlcmF0aW9uOjpPcGVyYXRpb25UeXBlPiBGdW5jdGlvbkxpc3Q7CisgICAgICAgIAorICAg
ICAgICB2b2lkIGluc2VydChmbG9hdCBrZXksIGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMqIHZh
bHVlLCBjb25zdCBUaW1pbmdGdW5jdGlvbiogdGltaW5nRnVuY3Rpb24pOworICAgICAgICAKKyAg
ICAgICAgLy8gcmV0dXJuIGEgbGlzdCBvZiB0aGUgcmVxdWlyZWQgZnVuY3Rpb25zLiBMaXN0IGlz
IGVtcHR5IGlmIGtleWZyYW1lcyBhcmUgbm90IHZhbGlkCisgICAgICAgIC8vIElmIHJldHVybiB2
YWx1ZSBpcyB0cnVlLCBmdW5jdGlvbnMgY29udGFpbiByb3RhdGlvbnMgb2YgPj0gMTgwIGRlZ3Jl
ZXMKKyAgICAgICAgdm9pZCBtYWtlRnVuY3Rpb25MaXN0KEZ1bmN0aW9uTGlzdCYgbGlzdCwgYm9v
bCYgaXNWYWxpZCwgYm9vbCYgaGFzQmlnUm90YXRpb24pIGNvbnN0OworICAgIH07CisKKyAgICBz
dGF0aWMgR3JhcGhpY3NMYXllciogY3JlYXRlR3JhcGhpY3NMYXllcihHcmFwaGljc0xheWVyQ2xp
ZW50Kik7ICAgIC8vIGZhY3RvcnkgZnVuY3Rpb24KKyAgICAKKyAgICB2aXJ0dWFsIH5HcmFwaGlj
c0xheWVyKCk7CisKKyAgICBHcmFwaGljc0xheWVyQ2xpZW50KiBjbGllbnQoKSBjb25zdCB7IHJl
dHVybiBtX2NsaWVudDsgfQorCisgICAgLy8gTGF5ZXIgbmFtZS4gT25seSB1c2VkIHRvIGlkZW50
aWZ5IGxheWVycyBpbiBkZWJ1ZyBvdXRwdXQKKyAgICBTdHJpbmcgbmFtZSgpIGNvbnN0IHsgcmV0
dXJuIG1fbmFtZTsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXROYW1lKGNvbnN0IFN0cmluZyYpOwor
CisgICAgLy8gRm9yIGhvc3RpbmcgdGhpcyBHcmFwaGljc0xheWVyIGluIGEgbmF0aXZlIGxheWVy
IGhpZXJhcmNoeS4KKyAgICB2aXJ0dWFsIE5hdGl2ZUxheWVyIG5hdGl2ZUxheWVyKCkgY29uc3Qg
eyByZXR1cm4gMDsgfQorCisgICAgR3JhcGhpY3NMYXllciogcGFyZW50KCkgY29uc3QgeyByZXR1
cm4gbV9wYXJlbnQ7IH07CisgICAgdm9pZCBzZXRQYXJlbnQoR3JhcGhpY3NMYXllciopOyAvLyBJ
bnRlcm5hbCB1c2Ugb25seS4KKyAgICAKKyAgICBjb25zdCBWZWN0b3I8R3JhcGhpY3NMYXllcio+
JiBjaGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIG1fY2hpbGRyZW47IH0KKworICAgIC8vIEFkZCBj
aGlsZCBsYXllcnMuIElmIHRoZSBjaGlsZCBpcyBhbHJlYWR5IHBhcmVudGVkLCBpdCB3aWxsIGJl
IHJlbW92ZWQgZnJvbSBpdHMgb2xkIHBhcmVudC4KKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGQo
R3JhcGhpY3NMYXllciopOworICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZEF0SW5kZXgoR3JhcGhp
Y3NMYXllciosIGludCBpbmRleCk7CisgICAgdmlydHVhbCB2b2lkIGFkZENoaWxkQWJvdmUoR3Jh
cGhpY3NMYXllciogbGF5ZXIsIEdyYXBoaWNzTGF5ZXIqIHNpYmxpbmcpOworICAgIHZpcnR1YWwg
dm9pZCBhZGRDaGlsZEJlbG93KEdyYXBoaWNzTGF5ZXIqIGxheWVyLCBHcmFwaGljc0xheWVyKiBz
aWJsaW5nKTsKKyAgICB2aXJ0dWFsIGJvb2wgcmVwbGFjZUNoaWxkKEdyYXBoaWNzTGF5ZXIqIG9s
ZENoaWxkLCBHcmFwaGljc0xheWVyKiBuZXdDaGlsZCk7CisKKyAgICB2b2lkIHJlbW92ZUFsbENo
aWxkcmVuKCk7CisgICAgdmlydHVhbCB2b2lkIHJlbW92ZUZyb21QYXJlbnQoKTsKKworICAgIC8v
IFRoZSBwb3NpdGlvbiBvZiB0aGUgbGF5ZXIgKHRoZSBsb2NhdGlvbiBvZiBpdHMgdG9wLWxlZnQg
Y29ybmVyIGluIGl0cyBwYXJlbnQpCisgICAgRmxvYXRQb2ludCBwb3NpdGlvbigpIGNvbnN0IHsg
cmV0dXJuIG1fcG9zaXRpb247IH0KKyAgICB2aXJ0dWFsIHZvaWQgc2V0UG9zaXRpb24oY29uc3Qg
RmxvYXRQb2ludCYpOworICAgIAorICAgIC8vIEFuY2hvciBwb2ludDogKDAsIDApIGlzIHRvcCBs
ZWZ0LCAoMSwgMSkgaXMgYm90dG9tIHJpZ2h0LiBUaGUgYW5jaG9yIHBvaW50CisgICAgLy8gYWZm
ZWN0cyB0aGUgb3JpZ2luIG9mIHRoZSB0cmFuc2Zvcm1zLgorICAgIEZsb2F0UG9pbnQgYW5jaG9y
UG9pbnQoKSBjb25zdCB7IHJldHVybiBtX2FuY2hvclBvaW50OyB9CisgICAgdmlydHVhbCB2b2lk
IHNldEFuY2hvclBvaW50KGNvbnN0IEZsb2F0UG9pbnQmLCBmbG9hdCBhbmNob3JaKTsKKworICAg
IC8vIFRoZSBib3VuZHMgb2YgdGhlIGxheWVyCisgICAgRmxvYXRTaXplIHNpemUoKSBjb25zdCB7
IHJldHVybiBtX3NpemU7IH0KKyAgICB2aXJ0dWFsIHZvaWQgc2V0U2l6ZShjb25zdCBGbG9hdFNp
emUmKTsKKworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHRyYW5zZm9ybSgpIGNvbnN0IHsgcmV0
dXJuIG1fdHJhbnNmb3JtOyB9CisgICAgdmlydHVhbCB2b2lkIHNldFRyYW5zZm9ybShjb25zdCBU
cmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCk7CisKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBjaGls
ZHJlblRyYW5zZm9ybSgpIGNvbnN0IHsgcmV0dXJuIG1fY2hpbGRyZW5UcmFuc2Zvcm07IH0KKyAg
ICB2aXJ0dWFsIHZvaWQgc2V0Q2hpbGRyZW5UcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25N
YXRyaXgmIHQpOworCisgICAgYm9vbCBwcmVzZXJ2ZXMzRCgpIGNvbnN0IHsgcmV0dXJuIG1fcHJl
c2VydmVzM0Q7IH0KKyAgICB2aXJ0dWFsIHZvaWQgc2V0UHJlc2VydmVzM0QoYm9vbCk7CisgICAg
CisgICAgYm9vbCBtYXNrc1RvQm91bmRzKCkgY29uc3QgeyByZXR1cm4gbV9tYXNrc1RvQm91bmRz
OyB9CisgICAgdmlydHVhbCB2b2lkIHNldE1hc2tzVG9Cb3VuZHMoYm9vbCk7CisgICAgCisgICAg
Ym9vbCBkcmF3c0NvbnRlbnQoKSBjb25zdCB7IHJldHVybiBtX2RyYXdzQ29udGVudDsgfQorICAg
IHZpcnR1YWwgdm9pZCBzZXREcmF3c0NvbnRlbnQoYm9vbCk7CisKKyAgICAvLyBUaGUgY29sb3Ig
dXNlZCB0byBwYWludCB0aGUgbGF5ZXIgYmFja2dyb3VuZHMKKyAgICBDb2xvciBiYWNrZ3JvdW5k
Q29sb3IoKSBjb25zdCB7IHJldHVybiBtX2JhY2tncm91bmRDb2xvcjsgfQorICAgIHZpcnR1YWwg
dm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoY29uc3QgQ29sb3ImLCBjb25zdCBBbmltYXRpb24qIGFu
aW0gPSAwLCBkb3VibGUgYmVnaW5UaW1lID0gMCk7CisgICAgdmlydHVhbCB2b2lkIGNsZWFyQmFj
a2dyb3VuZENvbG9yKCk7CisgICAgYm9vbCBiYWNrZ3JvdW5kQ29sb3JTZXQoKSBjb25zdCB7IHJl
dHVybiBtX2JhY2tncm91bmRDb2xvclNldDsgfQorCisgICAgLy8gb3BhcXVlIG1lYW5zIHRoYXQg
d2Uga25vdyB0aGUgbGF5ZXIgY29udGVudHMgaGF2ZSBubyBhbHBoYQorICAgIGJvb2wgY29udGVu
dHNPcGFxdWUoKSBjb25zdCB7IHJldHVybiBtX2NvbnRlbnRzT3BhcXVlOyB9CisgICAgdmlydHVh
bCB2b2lkIHNldENvbnRlbnRzT3BhcXVlKGJvb2wpOworCisgICAgYm9vbCBiYWNrZmFjZVZpc2li
aWxpdHkoKSBjb25zdCB7IHJldHVybiBtX2JhY2tmYWNlVmlzaWJpbGl0eTsgfQorICAgIHZpcnR1
YWwgdm9pZCBzZXRCYWNrZmFjZVZpc2liaWxpdHkoYm9vbCk7CisKKyAgICBmbG9hdCBvcGFjaXR5
KCkgY29uc3QgeyByZXR1cm4gbV9vcGFjaXR5OyB9CisgICAgLy8gcmV0dXJuIHRydWUgaWYgd2Ug
c3RhcnRlZCBhbiBhbmltYXRpb24KKyAgICB2aXJ0dWFsIGJvb2wgc2V0T3BhY2l0eShmbG9hdCBv
LCBjb25zdCBBbmltYXRpb24qIGFuaW0gPSAwLCBkb3VibGUgYmVnaW5UaW1lID0gMCk7CisKKyAg
ICAvLyBTb21lIEdyYXBoaWNzTGF5ZXJzIHBhaW50IG9ubHkgdGhlIGZvcmVncm91bmQgb3IgdGhl
IGJhY2tncm91bmQgY29udGVudAorICAgIEdyYXBoaWNzTGF5ZXJQYWludGluZ1BoYXNlIGRyYXdp
bmdQaGFzZSgpIGNvbnN0IHsgcmV0dXJuIG1fcGFpbnRpbmdQaGFzZTsgfQorICAgIHZvaWQgc2V0
RHJhd2luZ1BoYXNlKEdyYXBoaWNzTGF5ZXJQYWludGluZ1BoYXNlIHBoYXNlKTsKKworICAgIHZp
cnR1YWwgdm9pZCBzZXROZWVkc0Rpc3BsYXkoKTsKKyAgICAvLyBtYXJrIHRoZSBnaXZlbiByZWN0
IChpbiBsYXllciBjb29yZHMpIGFzIG5lZWRpbmcgZGlzcGF5LiBOZXZlciBnb2VzIGRlZXAuCisg
ICAgdmlydHVhbCB2b2lkIHNldE5lZWRzRGlzcGxheUluUmVjdChjb25zdCBGbG9hdFJlY3QmIGlu
UmVjdCk7CisgICAgCisKKyAgICB2aXJ0dWFsIGJvb2wgYW5pbWF0ZVRyYW5zZm9ybShjb25zdCBU
cmFuc2Zvcm1WYWx1ZUxpc3QmIHZhbHVlcywgY29uc3QgSW50U2l6ZSYgc2l6ZSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbmltYXRpb24qIGFuaW0sIGRvdWJsZSBi
ZWdpblRpbWUsIGJvb2wgaXNUcmFuc2l0aW9uKTsKKyAgICB2aXJ0dWFsIGJvb2wgYW5pbWF0ZUZs
b2F0KEFuaW1hdGVkUHJvcGVydHlJRCBwcm9wZXJ0eSwgY29uc3QgRmxvYXRWYWx1ZUxpc3QmIHZh
bHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbmltYXRpb24q
IHRyYW5zaXRpb24sIGRvdWJsZSBiZWdpblRpbWUpOworICAgIAorICAgIHZvaWQgcmVtb3ZlRmlu
aXNoZWRBbmltYXRpb25zKGNvbnN0IFN0cmluZyYgbmFtZSwgaW50IGluZGV4LCBib29sIHJlc2V0
KTsKKyAgICB2b2lkIHJlbW92ZUZpbmlzaGVkVHJhbnNpdGlvbnMoaW50IHByb3BlcnR5KTsKKyAg
ICB2b2lkIHJlbW92ZUFsbEFuaW1hdGlvbnMoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzdXNwZW5k
QW5pbWF0aW9ucygpOworICAgIHZpcnR1YWwgdm9pZCByZXN1bWVBbmltYXRpb25zKCk7CisgICAg
CisgICAgLy8gTGF5ZXIgY29udGVudHMKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNUb0lt
YWdlKEltYWdlKikge30KKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNUb1ZpZGVvKFBsYXRm
b3JtTGF5ZXIqKSB7fQorICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c0JhY2tncm91bmRDb2xv
cihjb25zdCBDb2xvciYpIHt9CisgICAgdmlydHVhbCB2b2lkIGNsZWFyQ29udGVudHMoKSB7fQor
ICAgIAorICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVDb250ZW50c1JlY3QoKSB7fQorCisgICAgLy8g
Q2FsbGJhY2sgZnJvbSB0aGUgdW5kZXJseWluZyBncmFwaGljcyBzeXN0ZW0gdG8gZHJhdyBsYXll
ciBjb250ZW50cy4KKyAgICB2b2lkIHBhaW50R3JhcGhpY3NMYXllckNvbnRlbnRzKEdyYXBoaWNz
Q29udGV4dCYgY29udGV4dCwgY29uc3QgSW50UmVjdCYgY2xpcCk7CisgICAgCisgICAgLy8gUmV0
dXJuIHRoZSBsYXllciBjb250YWluaW5nIHRoZSBnaXZlbiBwb2ludCwgd2hpY2ggaXMgaW4gdGhl
IHRoZSBjb29yZGluYXRlIHN5c3RlbQorICAgIC8vIG9mIHRoaXMgbGF5ZXIncyBwYXJlbnQgbGF5
ZXIuIEhpdFRlc3REYXRhIGlzIGFuIG9wYXF1ZSBzZXQgb2YgZGF0YSB0aGF0IGlzIHBhc3NlZAor
ICAgIC8vIGJhY2sgdG8gdGhlIFJlbmRlckxheWVyIGZvciBoaXRUZXN0TGF5ZXJDb250ZW50cwor
ICAgIHZpcnR1YWwgR3JhcGhpY3NMYXllciogaGl0VGVzdChjb25zdCBGbG9hdFBvaW50JiBwb2lu
dCwgc3RydWN0IExheWVySGl0VGVzdERhdGEqIGluRGF0YSkgY29uc3Q7CisgICAgCisgICAgLy8g
UmV0dXJuIHRydWUgaWYgdGhpcyBsYXllciBjb250YWlucyB0aGUgZ2l2ZW4gcG9pbnQgKHdoaWNo
IGlzIGluIGxheWVyIGNvb3JkaW5hdGVzKS4KKyAgICAvLyBDYWxscyBkb3duIHRvIHRoZSBuYXRp
dmUgbGF5ZXIuCisgICAgdmlydHVhbCBib29sIGxheWVyQ29udGFpbnNQb2ludChjb25zdCBGbG9h
dFBvaW50JiBwb2ludCkgY29uc3Q7CisKKyAgICAvLyBVcC1jYWxsIHVzZWQgYnkgdGhlIG5hdGl2
ZSBsYXllciBoaXQgdGVzdGluZyB0byBzZWUgaWYgdGhlIGdpdmVuIHBvaW50CisgICAgLy8gc2hv
dWxkIGJlIG9wYXF1ZSBmb3IgaGl0IHRlc3RpbmcuCisgICAgYm9vbCBjb250ZW50c0NvbnRhaW5Q
b2ludChjb25zdCBJbnRQb2ludCYgcG9pbnQpIGNvbnN0OworICAgIAorICAgIHZpcnR1YWwgRmxv
YXRQb2ludCBjb252ZXJ0UG9pbnRUb0xheWVyKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBHcmFw
aGljc0xheWVyKiB0YXJnZXRMYXllcikgY29uc3Q7CisgICAgdmlydHVhbCBGbG9hdFBvaW50IGNv
bnZlcnRQb2ludEZyb21MYXllcihjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgR3JhcGhpY3NMYXll
ciogc291cmNlTGF5ZXIpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIGNvbnZlcnRRdWFkVG9M
YXllcihGbG9hdFF1YWQmIHF1YWQsIGNvbnN0IEdyYXBoaWNzTGF5ZXIqIHRhcmdldExheWVyKSBj
b25zdDsKKworICAgIHZpcnR1YWwgUGxhdGZvcm1MYXllciogcGxhdGZvcm1MYXllcigpIGNvbnN0
IHsgcmV0dXJuIDA7IH0KKyAgICAKKyAgICB2b2lkIGR1bXBMYXllcihUZXh0U3RyZWFtJiB0cywg
aW50IGluZGVudCA9IDApIGNvbnN0OworCisjaWZuZGVmIE5ERUJVRworICAgIGludCByZXBhaW50
Q291bnQoKSBjb25zdCB7IHJldHVybiBtX3JlcGFpbnRDb3VudDsgfQorICAgIGludCBpbmNyZW1l
bnRSZXBhaW50Q291bnQoKSB7IHJldHVybiArK21fcmVwYWludENvdW50OyB9CisjZW5kaWYKKwor
ICAgIC8vIFBsYXRmb3JtIGJlaGF2aW9ycworICAgIHN0YXRpYyBib29sIGdyYXBoaWNzQ29udGV4
dHNGbGlwcGVkKCk7CisKKyNpZm5kZWYgTkRFQlVHCisgICAgc3RhdGljIGJvb2wgc2hvd0RlYnVn
Qm9yZGVycygpOworICAgIHN0YXRpYyBib29sIHNob3dSZXBhaW50Q291bnRlcigpOworICAgIHN0
YXRpYyBib29sIHNob3dMYXllckhpZXJhcmNoeSgpOworICAgIAorICAgIHZvaWQgdXBkYXRlRGVi
dWdJbmRpY2F0b3JzKCk7CisgICAgCisgICAgdmlydHVhbCB2b2lkIHNldERlYnVnQmFja2dyb3Vu
ZENvbG9yKGNvbnN0IENvbG9yJikge30KKyAgICB2aXJ0dWFsIHZvaWQgc2V0RGVidWdCb3JkZXIo
Y29uc3QgQ29sb3ImLCBmbG9hdCAvKmJvcmRlcldpZHRoKi8pIHt9CisgICAgLy8gei1wb3NpdGlv
biBpcyB0aGUgei1lcXVpdmFsZW50IG9mIHBvc2l0aW9uKCkuIEl0J3Mgb25seSB1c2VkIGZvciBk
ZWJ1Z2dpbmcgcHVycG9zZXMuCisgICAgdmlydHVhbCBmbG9hdCB6UG9zaXRpb24oKSBjb25zdCB7
IHJldHVybiBtX3pQb3NpdGlvbjsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRaUG9zaXRpb24oZmxv
YXQgcG9zaXRpb24pOworI2VuZGlmCisKKyAgICBzdGF0aWMgU3RyaW5nIHByb3BlcnR5SWRUb1N0
cmluZyhBbmltYXRlZFByb3BlcnR5SUQgcHJvcGVydHkpOworICAgIAorcHJvdGVjdGVkOgorICAg
IEdyYXBoaWNzTGF5ZXIoR3JhcGhpY3NMYXllckNsaWVudCopOworCisgICAgdm9pZCBkdW1wUHJv
cGVydGllcyhUZXh0U3RyZWFtJiB0cywgaW50IGluZGVudCkgY29uc3Q7CisgICAgU3RyaW5nIGR1
bXBOYW1lKCkgY29uc3QgeyByZXR1cm4gU3RyaW5nKCJHcmFwaGljc0xheWVyIik7IH0KKworICAg
IC8vIHJldHVybnMgLTEgaWYgbm90IGZvdW5kCisgICAgaW50IGZpbmRBbmltYXRpb25FbnRyeShB
bmltYXRlZFByb3BlcnR5SUQgcHJvcGVydHksIHNob3J0IGluZGV4KSBjb25zdDsKKyAgICBib29s
IGFkZEFuaW1hdGlvbkVudHJ5KEFuaW1hdGVkUHJvcGVydHlJRCBwcm9wZXJ0eSwgc2hvcnQgaW5k
ZXgsIGRvdWJsZSBiZWdpblRpbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wg
aXNUcmFuc2l0aW9uLCBjb25zdCBBbmltYXRpb24qIHRyYW5zaXRpb24pOworCisgICAgdmlydHVh
bCB2b2lkIHJlbW92ZUFuaW1hdGlvbihpbnQgLyppbkFuaW1JbmRleCovLCBib29sIC8qcmVzZXQq
Lykge30KKyAgICB2b2lkIHJlbW92ZUFsbEFuaW1hdGlvbnNGb3JQcm9wZXJ0eShBbmltYXRlZFBy
b3BlcnR5SUQgcHJvcGVydHkpOworCitwcm90ZWN0ZWQ6CisgICAgR3JhcGhpY3NMYXllckNsaWVu
dCogbV9jbGllbnQ7CisKKyAgICBTdHJpbmcgbV9uYW1lOworICAgIAorICAgIEZsb2F0UG9pbnQg
bV9wb3NpdGlvbjsKKyAgICBGbG9hdFBvaW50IG1fYW5jaG9yUG9pbnQ7CisgICAgRmxvYXRTaXpl
ICBtX3NpemU7CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbV90cmFuc2Zvcm07CisgICAgVHJh
bnNmb3JtYXRpb25NYXRyaXggbV9jaGlsZHJlblRyYW5zZm9ybTsKKworICAgIENvbG9yIG1fYmFj
a2dyb3VuZENvbG9yOworICAgIGZsb2F0IG1fb3BhY2l0eTsKKyAgICBmbG9hdCBtX2FuY2hvclo7
CisjaWZuZGVmIE5ERUJVRworICAgIGZsb2F0IG1felBvc2l0aW9uOworI2VuZGlmCisKKyAgICBi
b29sIG1fYmFja2dyb3VuZENvbG9yU2V0IDogMTsKKyAgICBib29sIG1fY29udGVudHNPcGFxdWUg
OiAxOworICAgIGJvb2wgbV9wcmVzZXJ2ZXMzRDogMTsKKyAgICBib29sIG1fYmFja2ZhY2VWaXNp
YmlsaXR5IDogMTsKKyAgICBib29sIG1fdXNpbmdUaWxlZExheWVyIDogMTsKKyAgICBib29sIG1f
bWFza3NUb0JvdW5kcyA6IDE7CisgICAgYm9vbCBtX2RyYXdzQ29udGVudCA6IDE7CisKKyAgICBH
cmFwaGljc0xheWVyUGFpbnRpbmdQaGFzZSBtX3BhaW50aW5nUGhhc2U7CisKKyAgICBWZWN0b3I8
R3JhcGhpY3NMYXllcio+IG1fY2hpbGRyZW47CisgICAgR3JhcGhpY3NMYXllciogbV9wYXJlbnQ7
CisgICAgCisgICAgLy8gQW5pbWF0aW9uRW50cnkgcmVwcmVzZW50cyBhbiBhbmltYXRpb24gb2Yg
YSBwcm9wZXJ0eSBvbiB0aGlzIGxheWVyLgorICAgIC8vIEZvciB0cmFuc2Zvcm0gb25seSwgdGhl
cmUgbWF5IGJlIG1vcmUgdGhhbiBvbmUsIGluIHdoaWNoIGNhc2UgJ2luZGV4JworICAgIC8vIGlz
IGFuIGluZGV4IGludG8gdGhlIGxpc3Qgb2YgdHJhbnNmb3Jtcy4gCisgICAgY2xhc3MgQW5pbWF0
aW9uRW50cnkgeworICAgICAgICBwdWJsaWM6CisgICAgICAgIEFuaW1hdGlvbkVudHJ5KCkKKyAg
ICAgICAgOiBiZWdpblRpbWUoLTEpCisgICAgICAgICwgcGF1c2VUaW1lKC0yKQorICAgICAgICAs
IGVuZFRpbWUoLTEpCisgICAgICAgICwgcHJvcGVydHkoQW5pbWF0ZWRQcm9wZXJ0eUludmFsaWQp
CisgICAgICAgICwgaXNDdXJyZW50KHRydWUpCisgICAgICAgICwgaXNUcmFuc2l0aW9uKHRydWUp
IHsgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBkb3VibGUgYmVnaW5U
aW1lLCBwYXVzZVRpbWUsIGVuZFRpbWU7CisgICAgICAgIFJlZlB0cjxBbmltYXRpb24+IGFuaW1M
YXllcjsKKyAgICAgICAgQW5pbWF0ZWRQcm9wZXJ0eUlEIHByb3BlcnR5IDogMTQ7CisgICAgICAg
IHNob3J0IGluZGV4IDogMTY7CisgICAgICAgIGJvb2wgaXNDdXJyZW50IDogMTsKKyAgICAgICAg
Ym9vbCBpc1RyYW5zaXRpb24gOiAxOworICAgIH07CisgICAgCisgICAgVmVjdG9yPEFuaW1hdGlv
bkVudHJ5PiBtX2FuaW1hdGlvbnM7ICAgICAgLy8gcnVubmluZyBhbmltYXRpb25zL3RyYW5zaXRp
b25zCisgICAgCisgICAgc3RhdGljIHN0cnVjdCBMYXllckhpdFRlc3REYXRhKiBzSGl0VGVzdERh
dGE7ICAgICAgLy8gdGVtcG9yYXJpbHkgYXNzaWduZWQgd2hpbGUgaGl0IHRlc3RpbmcKKyAgICAK
KyNpZm5kZWYgTkRFQlVHCisgICAgaW50IG1fcmVwYWludENvdW50OworI2VuZGlmCit9OworCisK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01Q
T1NJVElORykKKworI2VuZGlmIC8vIEdyYXBoaWNzTGF5ZXJfaAorCmRpZmYgLS1naXQgYS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXJDbGllbnQuaCBiL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllckNsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAuLjk5MDJjNzIKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXJDbGllbnQuaApAQCAtMCwwICsxLDc3IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uIAorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgSW5jLiAo
IkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJl
IHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9t
IHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24u
IAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05U
UklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgR3Jh
cGhpY3NMYXllckNsaWVudF9oCisjZGVmaW5lIEdyYXBoaWNzTGF5ZXJDbGllbnRfaAorCisjaWYg
VVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2Vu
dW0geworICAgIEdyYXBoaWNzTGF5ZXJQYWludEJhY2tncm91bmRNYXNrICAgICA9ICgxIDw8IDAp
LAorICAgIEdyYXBoaWNzTGF5ZXJQYWludEZvcmVncm91bmRNYXNrICAgICA9ICgxIDw8IDEpLAor
ICAgIEdyYXBoaWNzTGF5ZXJQYWludEFsbE1hc2sgICAgICAgICAgICA9ICh1bnNpZ25lZCBpbnQp
LTEKK307Cit0eXBlZGVmIHVuc2lnbmVkIGludCBHcmFwaGljc0xheWVyUGFpbnRpbmdQaGFzZTsK
KworZW51bSBBbmltYXRlZFByb3BlcnR5SUQgeworICAgIEFuaW1hdGVkUHJvcGVydHlJbnZhbGlk
LAorICAgIEFuaW1hdGVkUHJvcGVydHlXZWJraXRUcmFuc2Zvcm0sCisgICAgQW5pbWF0ZWRQcm9w
ZXJ0eU9wYWNpdHksCisgICAgQW5pbWF0ZWRQcm9wZXJ0eUJhY2tncm91bmRDb2xvcgorfTsKKwor
Y2xhc3MgR3JhcGhpY3NDb250ZXh0OworY2xhc3MgR3JhcGhpY3NMYXllcjsKK2NsYXNzIEludFBv
aW50OworY2xhc3MgSW50UmVjdDsKKworY2xhc3MgR3JhcGhpY3NMYXllckNsaWVudCB7CitwdWJs
aWM6CisgICAgdmlydHVhbCB+R3JhcGhpY3NMYXllckNsaWVudCgpIHt9CisKKyAgICAvLyBDYWxs
YmFja3MgZm9yIHdoZW4gaGFyZHdhcmUtYWNjZWxlcmF0ZWQgdHJhbnNpdGlvbnMgYW5kIGFuaW1h
dGlvbiBzdGFydGVkCisgICAgdmlydHVhbCB2b2lkIG5vdGlmeVRyYW5zaXRpb25TdGFydGVkKGNv
bnN0IEdyYXBoaWNzTGF5ZXIqIGxheWVyLCBBbmltYXRlZFByb3BlcnR5SUQgcHJvcGVydHksIGRv
dWJsZSB0aW1lKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG5vdGlmeUFuaW1hdGlvblN0YXJ0ZWQo
Y29uc3QgR3JhcGhpY3NMYXllciogbGF5ZXIsIGRvdWJsZSB0aW1lKSA9IDA7CisgICAgCisgICAg
dmlydHVhbCB2b2lkIHBhaW50Q29udGVudHMoY29uc3QgR3JhcGhpY3NMYXllciogbGF5ZXIsIEdy
YXBoaWNzQ29udGV4dCYgY29udGV4dCwgR3JhcGhpY3NMYXllclBhaW50aW5nUGhhc2UgY29tcG9z
aXRlUGhhc2UsIGNvbnN0IEludFJlY3QmIGluQ2xpcCkgPSAwOworICAgIC8vIHBvaW50IGlzIGlu
IHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgR3JhcGhpY3NMYXllciBjb250ZW50CisgICAg
dmlydHVhbCBib29sIGNvbnRlbnRzQ29udGFpblBvaW50KGNvbnN0IEdyYXBoaWNzTGF5ZXIqIGxh
eWVyLCBjb25zdCBJbnRQb2ludCYgcG9pbnQsIEdyYXBoaWNzTGF5ZXJQYWludGluZ1BoYXNlIGNv
bXBvc2l0ZVBoYXNlLCBzdHJ1Y3QgTGF5ZXJIaXRUZXN0RGF0YSogaGl0VGVzdERhdGEpID0gMDsK
KworICAgIC8vIENvbnZlcnQgdGhlIGdpdmVuIHBvaW50IGZyb20gdGhlIGNvb3JkaW5hdGUgc3Bh
Y2Ugb2YgdGhlIEdyYXBoaWNMYXllciB0byB0aGF0IG9mIGl0cyBjb250ZW50cy4KKyAgICB2aXJ0
dWFsIEZsb2F0UG9pbnQgY29udmVydFRvQ29udGVudHNDb29yZGluYXRlcyhjb25zdCBHcmFwaGlj
c0xheWVyKiBsYXllciwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpID0gMDsKKyAgICAvLyBSZXR1
cm4gYSByZWN0IGZvciB0aGUgImNvbnRlbnRzIiBvZiB0aGUgZ3JhcGhpY3MgbGF5ZXIsIGkuZS4g
dmlkZW8gb3IgaW1hZ2UgY29udGVudCwgaW4gR3JhcGhpY3NMYXllciBjb29yZGluYXRlcy4KKyAg
ICB2aXJ0dWFsIEludFJlY3QgY29udGVudHNCb3goY29uc3QgR3JhcGhpY3NMYXllciogbGF5ZXIp
ID0gMDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVTRShBQ0NF
TEVSQVRFRF9DT01QT1NJVElORykKKworI2VuZGlmIC8vIEdyYXBoaWNzTGF5ZXJDbGllbnRfaApk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NMYXllckNB
LmggYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0xheWVyQ0EuaApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjU2NmI4Ci0tLSAvZGV2L251bGwKKysr
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NMYXllckNBLmgKQEAgLTAs
MCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKiAyLiAgUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAzLiAgTmVpdGhlciB0aGUgbmFt
ZSBvZiBBcHBsZSBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNv
bnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVy
aXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdy
aXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElN
UExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQK
KyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2lmbmRlZiBHcmFwaGljc0xheWVyQ0FfaF8KKyNkZWZpbmUgR3JhcGhpY3NMYXllckNB
X2hfCisKKyNpbXBvcnQgImNvbmZpZy5oIgorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lU
SU5HKQorCisjaW1wb3J0ICJHcmFwaGljc0xheWVyLmgiCisKKyNpbmNsdWRlIDx3dGYvUmV0YWlu
UHRyLmg+CisKK0BjbGFzcyBXS0xheWVyOworQGNsYXNzIEFuaW1hdGlvbkRpZFN0YXJ0Q0I7CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgR3JhcGhpY3NMYXllckNBIDogcHVibGljIEdy
YXBoaWNzTGF5ZXIKK3sKK3B1YmxpYzoKKworICAgIEdyYXBoaWNzTGF5ZXJDQShHcmFwaGljc0xh
eWVyQ2xpZW50KiBjbGllbnQpOworICAgIHZpcnR1YWwgfkdyYXBoaWNzTGF5ZXJDQSgpOworCisg
ICAgdmlydHVhbCB2b2lkIHNldE5hbWUoY29uc3QgU3RyaW5nJiBuYW1lKTsKKworICAgIC8vIGZv
ciBob3N0aW5nIHRoaXMgR3JhcGhpY3NMYXllciBpbiBhIG5hdGl2ZSBsYXllciBoaWVyYXJjaHkK
KyAgICB2aXJ0dWFsIE5hdGl2ZUxheWVyIG5hdGl2ZUxheWVyKCkgY29uc3Q7CisKKyAgICB2aXJ0
dWFsIHZvaWQgYWRkQ2hpbGQoR3JhcGhpY3NMYXllciopOworICAgIHZpcnR1YWwgdm9pZCBhZGRD
aGlsZEF0SW5kZXgoR3JhcGhpY3NMYXllciosIGludCBpbmRleCk7CisgICAgdmlydHVhbCB2b2lk
IGFkZENoaWxkQWJvdmUoR3JhcGhpY3NMYXllciogbGF5ZXIsIEdyYXBoaWNzTGF5ZXIqIHNpYmxp
bmcpOworICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZEJlbG93KEdyYXBoaWNzTGF5ZXIqIGxheWVy
LCBHcmFwaGljc0xheWVyKiBzaWJsaW5nKTsKKyAgICB2aXJ0dWFsIGJvb2wgcmVwbGFjZUNoaWxk
KEdyYXBoaWNzTGF5ZXIqIG9sZENoaWxkLCBHcmFwaGljc0xheWVyKiBuZXdDaGlsZCk7CisKKyAg
ICB2aXJ0dWFsIHZvaWQgcmVtb3ZlRnJvbVBhcmVudCgpOworCisgICAgdmlydHVhbCB2b2lkIHNl
dFBvc2l0aW9uKGNvbnN0IEZsb2F0UG9pbnQmKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QW5jaG9y
UG9pbnQoY29uc3QgRmxvYXRQb2ludCYsIGZsb2F0IGFuY2hvclopOworICAgIHZpcnR1YWwgdm9p
ZCBzZXRTaXplKGNvbnN0IEZsb2F0U2l6ZSYpOworCisgICAgdmlydHVhbCB2b2lkIHNldFRyYW5z
Zm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCk7CisKKyAgICB2aXJ0dWFsIHZvaWQg
c2V0Q2hpbGRyZW5UcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHQpOworCisg
ICAgdmlydHVhbCB2b2lkIHNldFByZXNlcnZlczNEKGJvb2wpOworICAgIHZpcnR1YWwgdm9pZCBz
ZXRNYXNrc1RvQm91bmRzKGJvb2wpOworICAgIHZpcnR1YWwgdm9pZCBzZXREcmF3c0NvbnRlbnQo
Ym9vbCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKGNvbnN0IENvbG9y
JiwgY29uc3QgQW5pbWF0aW9uKiBhbmltID0gMCwgZG91YmxlIGJlZ2luVGltZSA9IDApOworICAg
IHZpcnR1YWwgdm9pZCBjbGVhckJhY2tncm91bmRDb2xvcigpOworCisgICAgdmlydHVhbCB2b2lk
IHNldENvbnRlbnRzT3BhcXVlKGJvb2wpOworICAgIHZpcnR1YWwgdm9pZCBzZXRCYWNrZmFjZVZp
c2liaWxpdHkoYm9vbCk7CisKKyAgICAvLyByZXR1cm4gdHJ1ZSBpZiB3ZSBzdGFydGVkIGFuIGFu
aW1hdGlvbgorICAgIHZpcnR1YWwgYm9vbCBzZXRPcGFjaXR5KGZsb2F0LCBjb25zdCBBbmltYXRp
b24qIGFuaW0gPSAwLCBkb3VibGUgYmVnaW5UaW1lID0gMCk7CisKKyAgICB2aXJ0dWFsIHZvaWQg
c2V0TmVlZHNEaXNwbGF5KCk7CisgICAgLy8gbWFyayB0aGUgZ2l2ZW4gcmVjdCAoaW4gbGF5ZXIg
Y29vcmRzKSBhcyBuZWVkaW5nIGRpc3BheQorICAgIHZpcnR1YWwgdm9pZCBzZXROZWVkc0Rpc3Bs
YXlJblJlY3QoY29uc3QgRmxvYXRSZWN0Jik7CisKKyAgICB2aXJ0dWFsIHZvaWQgc3VzcGVuZEFu
aW1hdGlvbnMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzdW1lQW5pbWF0aW9ucygpOworCisgICAg
dmlydHVhbCBib29sIGFuaW1hdGVUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtVmFsdWVMaXN0JiB2
YWx1ZXMsIGNvbnN0IEludFNpemUmIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY29uc3QgQW5pbWF0aW9uKiBhbmltLCBkb3VibGUgYmVnaW5UaW1lLCBib29sIGlzVHJh
bnNpdGlvbik7CisgICAgdmlydHVhbCBib29sIGFuaW1hdGVGbG9hdChBbmltYXRlZFByb3BlcnR5
SUQgcHJvcGVydHksIGNvbnN0IEZsb2F0VmFsdWVMaXN0JiB2YWx1ZXMsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgY29uc3QgQW5pbWF0aW9uKiB0cmFuc2l0aW9uLCBkb3VibGUg
YmVnaW5UaW1lKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c1RvSW1hZ2UoSW1hZ2Uq
KTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNUb1ZpZGVvKFBsYXRmb3JtTGF5ZXIqKTsK
KyAgICB2aXJ0dWFsIHZvaWQgY2xlYXJDb250ZW50cygpOworICAgIAorICAgIHZpcnR1YWwgdm9p
ZCB1cGRhdGVDb250ZW50c1JlY3QoKTsKKworICAgIHZpcnR1YWwgR3JhcGhpY3NMYXllciogaGl0
VGVzdChjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgc3RydWN0IExheWVySGl0VGVzdERhdGEqIGRh
dGEpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBsYXllckNvbnRhaW5zUG9pbnQoY29uc3QgRmxv
YXRQb2ludCYgcG9pbnQpIGNvbnN0OworCisKKyAgICB2aXJ0dWFsIEZsb2F0UG9pbnQgY29udmVy
dFBvaW50VG9MYXllcihjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgR3JhcGhpY3NMYXllciogdGFy
Z2V0TGF5ZXIpIGNvbnN0OworICAgIHZpcnR1YWwgRmxvYXRQb2ludCBjb252ZXJ0UG9pbnRGcm9t
TGF5ZXIoY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIEdyYXBoaWNzTGF5ZXIqIHNvdXJjZUxheWVy
KSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBjb252ZXJ0UXVhZFRvTGF5ZXIoRmxvYXRRdWFk
JiBpb1F1YWQsIGNvbnN0IEdyYXBoaWNzTGF5ZXIqIHRhcmdldExheWVyKSBjb25zdDsKKworICAg
IHZpcnR1YWwgUGxhdGZvcm1MYXllciogcGxhdGZvcm1MYXllcigpIGNvbnN0OworCisjaWZuZGVm
IE5ERUJVRworICAgIHZpcnR1YWwgdm9pZCBzZXREZWJ1Z0JhY2tncm91bmRDb2xvcihjb25zdCBD
b2xvciYpOworICAgIHZpcnR1YWwgdm9pZCBzZXREZWJ1Z0JvcmRlcihjb25zdCBDb2xvciYsIGZs
b2F0IGJvcmRlcldpZHRoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0WlBvc2l0aW9uKGZsb2F0KTsK
KyNlbmRpZgorCitwcm90ZWN0ZWQ6CisgICAgV0tMYXllciogcHJpbWFyeUxheWVyKCkgY29uc3Qg
IHsgcmV0dXJuIG1fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkgPyBtX3RyYW5zZm9ybUxheWVyLmdldCgp
IDogbV9sYXllci5nZXQoKTsgfQorICAgIFdLTGF5ZXIqIGhvc3RMYXllckZvclN1YmxheWVycygp
IGNvbnN0OworICAgIFdLTGF5ZXIqIGxheWVyRm9yU3VwZXJsYXllcigpIGNvbnN0OworCisgICAg
V0tMYXllciogYW5pbWF0ZWRMYXllcihBbmltYXRlZFByb3BlcnR5SUQgcHJvcGVydHkpIGNvbnN0
CisgICAgeworICAgICAgICByZXR1cm4gKHByb3BlcnR5ID09IEFuaW1hdGVkUHJvcGVydHlCYWNr
Z3JvdW5kQ29sb3IpID8gbV9jb250ZW50c0xheWVyLmdldCgpIDogcHJpbWFyeUxheWVyKCk7Cisg
ICAgfQorCisgICAgdm9pZCBzZXRCYXNpY0FuaW1hdGlvbihBbmltYXRlZFByb3BlcnR5SUQgcHJv
cGVydHksIGNvbnN0IFN0cmluZyYgY29tcG9uZW50LCBzaG9ydCBpbmRleCwgdm9pZCogZnJvbVZh
bCwgdm9pZCogdG9WYWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlz
VHJhbnNpdGlvbiwgY29uc3QgQW5pbWF0aW9uKiB0cmFuc2l0aW9uLCBkb3VibGUgdGltZSk7Cisg
ICAgdm9pZCBzZXRLZXlmcmFtZUFuaW1hdGlvbihBbmltYXRlZFByb3BlcnR5SUQgcHJvcGVydHks
IGNvbnN0IFN0cmluZyYgY29tcG9uZW50LCBzaG9ydCBpbmRleCwgdm9pZCoga2V5cywgdm9pZCog
dmFsdWVzLCB2b2lkKiB0aW1pbmdGdW5jdGlvbnMsIAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBib29sIGlzVHJhbnNpdGlvbiwgY29uc3QgQW5pbWF0aW9uKiB0cmFuc2l0aW9uLCBk
b3VibGUgdGltZSk7CisKKyAgICB2b2lkIHNldEFuaW1hdGlvbihBbmltYXRlZFByb3BlcnR5SUQg
cHJvcGVydHkpOworICAgIHZvaWQgc2V0QWxsQW5pbWF0aW9ucygpOworICAgIHZvaWQgYW5pbURv
bmUoQW5pbWF0ZWRQcm9wZXJ0eUlEIHByb3BlcnR5LCBzaG9ydCBpbmRleCk7CisgICAgdmlydHVh
bCB2b2lkIHJlbW92ZUFuaW1hdGlvbihpbnQgaW5BbmltSW5kZXgsIGJvb2wgcmVzZXQpOworCisg
ICAgYm9vbCByZXF1aXJlc1RpbGVkTGF5ZXIoY29uc3QgRmxvYXRTaXplJikgY29uc3Q7CisgICAg
dm9pZCBzd2FwRnJvbU9yVG9UaWxlZExheWVyKGJvb2wgdXNlVGlsZWRMYXllcik7CisKKyAgICB2
b2lkIHNldEhhc0NvbnRlbnRzTGF5ZXIoYm9vbCk7CisgICAgdm9pZCBzZXRDb250ZW50c0xheWVy
KFdLTGF5ZXIqKTsKKyAgICB2b2lkIHNldENvbnRlbnRzTGF5ZXJGbGlwcGVkKGJvb2wpOworICAg
IAorcHJvdGVjdGVkOgorCisgICAgUmV0YWluUHRyPFdLTGF5ZXI+IG1fbGF5ZXI7CisgICAgUmV0
YWluUHRyPFdLTGF5ZXI+IG1fdHJhbnNmb3JtTGF5ZXI7CisgICAgUmV0YWluUHRyPFdLTGF5ZXI+
IG1fY29udGVudHNMYXllcjsKKworICAgIFJldGFpblB0cjxBbmltYXRpb25EaWRTdGFydENCPiBt
X2FuaW1hdGlvbkRpZFN0YXJ0Q0I7CisKKyAgICBib29sIG1fY29udGVudExheWVyRm9ySW1hZ2VP
clZpZGVvOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisKKyNlbmRpZiAvLyBVU0Uo
QUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNlbmRpZiAvLyBHcmFwaGljc0xheWVyQ0FfaF8K
ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzTGF5ZXJD
QS5tbSBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzTGF5ZXJDQS5tbQpu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmNkYjlmCi0tLSAvZGV2L251bGwK
KysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NMYXllckNBLm1tCkBA
IC0wLDAgKzEsMTYwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRo
ZSBuYW1lIG9mIEFwcGxlIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBp
dHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0
cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJp
b3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisjaW1wb3J0ICJjb25maWcuaCIKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01Q
T1NJVElORykKKworI2ltcG9ydCAiR3JhcGhpY3NMYXllckNBLmgiCisKKyNpbXBvcnQgPFF1YXJ0
ekNvcmUvUXVhcnR6Q29yZS5oPgorCisjaW1wb3J0IDxRdWFydHpDb3JlL0NBQW5pbWF0aW9uUHJp
dmF0ZS5oPgorI2ltcG9ydCA8UXVhcnR6Q29yZS9DQVZhbHVlRnVuY3Rpb24uaD4KKworI2ltcG9y
dCAiQW5pbWF0aW9uLmgiCisjaW1wb3J0ICJCbG9ja0V4Y2VwdGlvbnMuaCIKKyNpbXBvcnQgIkNT
dHJpbmcuaCIKKyNpbXBvcnQgIkltYWdlLmgiCisjaW1wb3J0ICJQbGF0Zm9ybVN0cmluZy5oIgor
I2ltcG9ydCAiUm90YXRlVHJhbnNmb3JtT3BlcmF0aW9uLmgiCisjaW1wb3J0ICJTY2FsZVRyYW5z
Zm9ybU9wZXJhdGlvbi5oIgorI2ltcG9ydCAiU3lzdGVtVGltZS5oIgorI2ltcG9ydCAiVHJhbnNs
YXRlVHJhbnNmb3JtT3BlcmF0aW9uLmgiCisjaW1wb3J0ICJXS0xheWVyLmgiCisjaW1wb3J0ICJX
S1RpbGVkTGF5ZXIuaCIKKyNpbXBvcnQgPHd0Zi9DdXJyZW50VGltZS5oPgorCitzdGF0aWMgTlNT
dHJpbmcqIGNvbnN0IGtBbmltYXRpb25DU1NQcm9wZXJ0eUtleSA9IEAiR3JhcGhpY3NMYXllckNB
X3Byb3BlcnR5IjsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgY29uc3QgaW50IGtN
YXhQaXhlbERpbWVuc2lvbiA9IDIwMDA7CitzdGF0aWMgY29uc3QgaW50IGtUaWxlZExheWVyVGls
ZVNpemUgPSA1MTI7IC8vIFRoaXMgaXMgYXJiaXRyYXJ5IGFuZCBub3QgZW1waXJpY2FsCisKK3N0
YXRpYyBkb3VibGUgdW5peFRpbWVUb0NBVGltZShkb3VibGUgdCkKK3sKKyAgICByZXR1cm4gQ0FD
dXJyZW50TWVkaWFUaW1lKCkgLSBXVEY6OmN1cnJlbnRUaW1lKCkgKyB0OworfQorCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCisKK0BpbnRlcmZhY2UgQW5pbWF0aW9uRGlkU3RhcnRDQiA6IE5TT2Jq
ZWN0IHsKKyAgICBXZWJDb3JlOjpHcmFwaGljc0xheWVyQ0EqIG1fZ3JhcGhpY3NMYXllcjsKK30K
KworLSAodm9pZClhbmltYXRpb25EaWRTdGFydDooQ0FBbmltYXRpb24gKilhbmltOworLSAoV2Vi
Q29yZTo6R3JhcGhpY3NMYXllckNBKilncmFwaGljc0xheWVyOworLSAodm9pZClzZXRMYXllcjoo
V2ViQ29yZTo6R3JhcGhpY3NMYXllckNBKilncmFwaGljc0xheWVyOworCitAZW5kCisKK0BpbXBs
ZW1lbnRhdGlvbiBBbmltYXRpb25EaWRTdGFydENCCisKKy0gKHZvaWQpYW5pbWF0aW9uRGlkU3Rh
cnQ6KENBQW5pbWF0aW9uICopYW5pbQoreworICAgIGlmICghbV9ncmFwaGljc0xheWVyKQorICAg
ICAgICByZXR1cm47CisKKyAgICBkb3VibGUgc3RhcnRUaW1lID0gY3VycmVudFRpbWUoKSAtIENB
Q3VycmVudE1lZGlhVGltZSgpICsgW2FuaW0gYmVnaW5UaW1lXTsKKyAgICBXZWJDb3JlOjpBbmlt
YXRlZFByb3BlcnR5SUQgcHJvcCA9IHN0YXRpY19jYXN0PFdlYkNvcmU6OkFuaW1hdGVkUHJvcGVy
dHlJRD4oW1thbmltIHZhbHVlRm9yS2V5OmtBbmltYXRpb25DU1NQcm9wZXJ0eUtleV0gaW50VmFs
dWVdKTsKKyAgICBpZiAocHJvcCAhPSBXZWJDb3JlOjpBbmltYXRlZFByb3BlcnR5SW52YWxpZCkK
KyAgICAgICAgbV9ncmFwaGljc0xheWVyLT5jbGllbnQoKS0+bm90aWZ5VHJhbnNpdGlvblN0YXJ0
ZWQobV9ncmFwaGljc0xheWVyLCBwcm9wLCBzdGFydFRpbWUpOworICAgIGVsc2UKKyAgICAgICAg
bV9ncmFwaGljc0xheWVyLT5jbGllbnQoKS0+bm90aWZ5QW5pbWF0aW9uU3RhcnRlZChtX2dyYXBo
aWNzTGF5ZXIsIHN0YXJ0VGltZSk7Cit9CisKKy0gKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJDQSop
Z3JhcGhpY3NMYXllcgoreworICAgIHJldHVybiBtX2dyYXBoaWNzTGF5ZXI7Cit9CisKKy0gKHZv
aWQpc2V0TGF5ZXI6KFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJDQSopZ3JhcGhpY3NMYXllcgorewor
ICAgIG1fZ3JhcGhpY3NMYXllciA9IGdyYXBoaWNzTGF5ZXI7Cit9CisKK0BlbmQKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitpbmxpbmUgdm9pZCBjb3B5VHJhbnNmb3JtKENBVHJhbnNmb3JtM0Qm
IHRvVDNELCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCkKK3sKKyAgICB0b1QzRCA9IENB
VHJhbnNmb3JtM0RNYWtlQWZmaW5lVHJhbnNmb3JtKHQpOworfQorCitUcmFuc2Zvcm1hdGlvbk1h
dHJpeCBDQVRvVHJhbnNmb3JtM0QoY29uc3QgQ0FUcmFuc2Zvcm0zRCYgZnJvbVQzRCkKK3sKKyAg
ICByZXR1cm4gVHJhbnNmb3JtYXRpb25NYXRyaXgoQ0FUcmFuc2Zvcm0zREdldEFmZmluZVRyYW5z
Zm9ybShmcm9tVDNEKSk7Cit9CisKK3N0YXRpYyBOU1ZhbHVlKiBjcmVhdGVUcmFuc2Zvcm1GdW5j
dGlvblZhbHVlKGNvbnN0IEdyYXBoaWNzTGF5ZXI6OlRyYW5zZm9ybVZhbHVlJiB0cmFuc2Zvcm1W
YWx1ZSwgc2l6ZV90IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBJbnRTaXplJiBzaXplLCBUcmFuc2Zvcm1PcGVyYXRpb246
Ok9wZXJhdGlvblR5cGUgdHJhbnNmb3JtVHlwZSkKK3sKKyAgICBUcmFuc2Zvcm1PcGVyYXRpb24q
IG9wID0gKGluZGV4ID49IHRyYW5zZm9ybVZhbHVlLnZhbHVlKCktPm9wZXJhdGlvbnMoKS5zaXpl
KCkpID8gMCA6IHRyYW5zZm9ybVZhbHVlLnZhbHVlKCktPm9wZXJhdGlvbnMoKVtpbmRleF0uZ2V0
KCk7CisgICAgCisgICAgc3dpdGNoICh0cmFuc2Zvcm1UeXBlKSB7CisgICAgICAgIGNhc2UgVHJh
bnNmb3JtT3BlcmF0aW9uOjpST1RBVEU6CisgICAgICAgICAgICByZXR1cm4gW05TTnVtYmVyIG51
bWJlcldpdGhGbG9hdDpvcCA/IChmbG9hdCkgKHN0YXRpY19jYXN0PFJvdGF0ZVRyYW5zZm9ybU9w
ZXJhdGlvbio+KG9wKS0+YW5nbGUoKSAqIE1fUEkgLyAxODApIDogMF07CisKKyAgICAgICAgY2Fz
ZSBUcmFuc2Zvcm1PcGVyYXRpb246OlNDQUxFX1g6CisgICAgICAgICAgICByZXR1cm4gW05TTnVt
YmVyIG51bWJlcldpdGhGbG9hdDpvcCA/IChmbG9hdCkgc3RhdGljX2Nhc3Q8U2NhbGVUcmFuc2Zv
cm1PcGVyYXRpb24qPihvcCktPngoKSA6IDBdOworICAgICAgICBjYXNlIFRyYW5zZm9ybU9wZXJh
dGlvbjo6U0NBTEVfWToKKyAgICAgICAgICAgIHJldHVybiBbTlNOdW1iZXIgbnVtYmVyV2l0aEZs
b2F0Om9wID8gKGZsb2F0KSBzdGF0aWNfY2FzdDxTY2FsZVRyYW5zZm9ybU9wZXJhdGlvbio+KG9w
KS0+eSgpIDogMF07CisKKyAgICAgICAgY2FzZSBUcmFuc2Zvcm1PcGVyYXRpb246OlRSQU5TTEFU
RV9YOgorICAgICAgICAgICAgcmV0dXJuIFtOU051bWJlciBudW1iZXJXaXRoRmxvYXQ6b3AgPyAo
ZmxvYXQpIHN0YXRpY19jYXN0PFRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbio+KG9wKS0+eChz
aXplKSA6IDBdOworICAgICAgICBjYXNlIFRyYW5zZm9ybU9wZXJhdGlvbjo6VFJBTlNMQVRFX1k6
CisgICAgICAgICAgICByZXR1cm4gW05TTnVtYmVyIG51bWJlcldpdGhGbG9hdDpvcCA/IChmbG9h
dCkgc3RhdGljX2Nhc3Q8VHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uKj4ob3ApLT54KHNpemUp
IDogMF07CisgICAgICAgIAorICAgICAgICBjYXNlIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0NBTEU6
CisgICAgICAgIGNhc2UgVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEU6CisgICAgICAgIGNh
c2UgVHJhbnNmb3JtT3BlcmF0aW9uOjpTS0VXX1g6CisgICAgICAgIGNhc2UgVHJhbnNmb3JtT3Bl
cmF0aW9uOjpTS0VXX1k6CisgICAgICAgIGNhc2UgVHJhbnNmb3JtT3BlcmF0aW9uOjpTS0VXOgor
ICAgICAgICBjYXNlIFRyYW5zZm9ybU9wZXJhdGlvbjo6TUFUUklYOgorICAgICAgICBjYXNlIFRy
YW5zZm9ybU9wZXJhdGlvbjo6SURFTlRJVFk6CisgICAgICAgIGNhc2UgVHJhbnNmb3JtT3BlcmF0
aW9uOjpOT05FOgorICAgICAgICB7CisgICAgICAgICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0
OworICAgICAgICAgICAgaWYgKG9wKQorICAgICAgICAgICAgICAgIG9wLT5hcHBseSh0LCBzaXpl
KTsKKyAgICAgICAgICAgIENBVHJhbnNmb3JtM0QgY2F0OworICAgICAgICAgICAgY29weVRyYW5z
Zm9ybShjYXQsIHQpOworICAgICAgICAgICAgcmV0dXJuIFtOU1ZhbHVlIHZhbHVlV2l0aENBVHJh
bnNmb3JtM0Q6Y2F0XTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gMDsKK30K
Kworc3RhdGljIFN0cmluZyBnZXRBbmltYXRpb25WYWx1ZUZ1bmN0aW9uKFRyYW5zZm9ybU9wZXJh
dGlvbjo6T3BlcmF0aW9uVHlwZSB0cmFuc2Zvcm1UeXBlKQoreworICAgIHN3aXRjaCAodHJhbnNm
b3JtVHlwZSkgeworICAgICAgICBjYXNlIFRyYW5zZm9ybU9wZXJhdGlvbjo6Uk9UQVRFOiByZXR1
cm4gU3RyaW5nKCJyb3RhdGVaIik7CisgICAgICAgIGNhc2UgVHJhbnNmb3JtT3BlcmF0aW9uOjpT
Q0FMRV9YOiByZXR1cm4gU3RyaW5nKCJzY2FsZVgiKTsKKyAgICAgICAgY2FzZSBUcmFuc2Zvcm1P
cGVyYXRpb246OlNDQUxFX1k6IHJldHVybiBTdHJpbmcoInNjYWxlWSIpOworICAgICAgICBjYXNl
IFRyYW5zZm9ybU9wZXJhdGlvbjo6VFJBTlNMQVRFX1g6IHJldHVybiBTdHJpbmcoInRyYW5zbGF0
ZVgiKTsKKyAgICAgICAgY2FzZSBUcmFuc2Zvcm1PcGVyYXRpb246OlRSQU5TTEFURV9ZOiByZXR1
cm4gU3RyaW5nKCJ0cmFuc2xhdGVZIik7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiBTdHJpbmco
IiIpOworICAgIH0KK30KKworI2lmbmRlZiBOREVCVUcKK3N0YXRpYyB2b2lkIHNldExheWVyQm9y
ZGVyQ29sb3IoUGxhdGZvcm1MYXllciogbGF5ZXIsIGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAg
ICBDR0NvbG9yUmVmIGJvcmRlckNvbG9yID0gY2dDb2xvcihjb2xvcik7CisgICAgW2xheWVyIHNl
dEJvcmRlckNvbG9yOmJvcmRlckNvbG9yXTsKKyAgICBDR0NvbG9yUmVsZWFzZShib3JkZXJDb2xv
cik7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyQm9yZGVyQ29sb3IoUGxhdGZvcm1MYXllciogbGF5
ZXIpCit7CisgICAgW2xheWVyIHNldEJvcmRlckNvbG9yOm5pbF07Cit9CisjZW5kaWYKKworc3Rh
dGljIHZvaWQgc2V0TGF5ZXJCYWNrZ3JvdW5kQ29sb3IoUGxhdGZvcm1MYXllciogbGF5ZXIsIGNv
bnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBDR0NvbG9yUmVmIGJnQ29sb3IgPSBjZ0NvbG9yKGNv
bG9yKTsKKyAgICBbbGF5ZXIgc2V0QmFja2dyb3VuZENvbG9yOmJnQ29sb3JdOworICAgIENHQ29s
b3JSZWxlYXNlKGJnQ29sb3IpOworfQorCitzdGF0aWMgdm9pZCBjbGVhckxheWVyQmFja2dyb3Vu
ZENvbG9yKFBsYXRmb3JtTGF5ZXIqIGxheWVyKQoreworICAgIFtsYXllciBzZXRCYWNrZ3JvdW5k
Q29sb3I6MF07Cit9CisKK3N0YXRpYyBDQUxheWVyKiBnZXRQcmVzZW50YXRpb25MYXllcihDQUxh
eWVyKiBsYXllcikKK3sKKyAgICBDQUxheWVyKiAgcHJlc0xheWVyID0gW2xheWVyIHByZXNlbnRh
dGlvbkxheWVyXTsKKyAgICBpZiAoIXByZXNMYXllcikKKyAgICAgICAgcHJlc0xheWVyID0gbGF5
ZXI7CisKKyAgICByZXR1cm4gcHJlc0xheWVyOworfQorCitib29sIEdyYXBoaWNzTGF5ZXI6Omdy
YXBoaWNzQ29udGV4dHNGbGlwcGVkKCkKK3sKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworI2lmbmRl
ZiBOREVCVUcKK2Jvb2wgR3JhcGhpY3NMYXllcjo6c2hvd0RlYnVnQm9yZGVycygpCit7CisgICAg
c3RhdGljIGludCBzaG93RGVidWdCb3JkZXJzID0gLTE7CisKKyAgICBpZiAoc2hvd0RlYnVnQm9y
ZGVycyA8IDApIHsKKyAgICAgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgICAg
IHNob3dEZWJ1Z0JvcmRlcnMgPSBbW05TVXNlckRlZmF1bHRzIHN0YW5kYXJkVXNlckRlZmF1bHRz
XSBib29sRm9yS2V5OkAiV2ViQ29yZUxheWVyQm9yZGVycyJdOworICAgICAgICBFTkRfQkxPQ0tf
T0JKQ19FWENFUFRJT05TCisgICAgfQorCisgICAgcmV0dXJuIHNob3dEZWJ1Z0JvcmRlcnM7Cit9
CisKK2Jvb2wgR3JhcGhpY3NMYXllcjo6c2hvd1JlcGFpbnRDb3VudGVyKCkKK3sKKyAgICBzdGF0
aWMgaW50IHNob3dSZXBhaW50Q291bnRlciA9IC0xOworCisgICAgaWYgKHNob3dSZXBhaW50Q291
bnRlciA8IDApIHsKKyAgICAgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgICAg
IHNob3dSZXBhaW50Q291bnRlciA9IFtbTlNVc2VyRGVmYXVsdHMgc3RhbmRhcmRVc2VyRGVmYXVs
dHNdIGJvb2xGb3JLZXk6QCJXZWJDb3JlTGF5ZXJSZXBhaW50Q291bnRlciJdOworICAgICAgICBF
TkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgfQorCisgICAgcmV0dXJuIHNob3dSZXBhaW50
Q291bnRlcjsKK30KKworYm9vbCBHcmFwaGljc0xheWVyOjpzaG93TGF5ZXJIaWVyYXJjaHkoKQor
eworICAgIHN0YXRpYyBpbnQgc2hvd0xheWVySGllcmFyY2h5ID0gLTE7CisKKyAgICBpZiAoc2hv
d0xheWVySGllcmFyY2h5IDwgMCkgeworICAgICAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElP
TlMKKyAgICAgICAgc2hvd0xheWVySGllcmFyY2h5ID0gW1tOU1VzZXJEZWZhdWx0cyBzdGFuZGFy
ZFVzZXJEZWZhdWx0c10gYm9vbEZvcktleTpAIldlYkNvcmVMYXllckhpZXJhcmNoeSJdOworICAg
ICAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgfQorCisgICAgcmV0dXJuIHNob3dM
YXllckhpZXJhcmNoeTsKK30KKyNlbmRpZgorCitzdGF0aWMgTlNEaWN0aW9uYXJ5KiBudWxsQWN0
aW9uc0RpY3Rpb25hcnkoKQoreworICAgIE5TTnVsbCogbnVsbFZhbHVlID0gW05TTnVsbCBudWxs
XTsKKyAgICBOU0RpY3Rpb25hcnkqIGFjdGlvbnMgPSBbTlNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlX
aXRoT2JqZWN0c0FuZEtleXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxWYWx1
ZSwgQCJhbmNob3JQb2ludCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxWYWx1
ZSwgQCJib3VuZHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsVmFsdWUsIEAi
Y29udGVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsVmFsdWUsIEAiY29u
dGVudHNSZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbFZhbHVlLCBAIm9w
YWNpdHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsVmFsdWUsIEAicG9zaXRp
b24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsVmFsdWUsIEAic2hhZG93Q29s
b3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsVmFsdWUsIEAic3VibGF5ZXJU
cmFuc2Zvcm0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsVmFsdWUsIEAic3Vi
bGF5ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbFZhbHVlLCBAInRyYW5z
Zm9ybSIsCisjaWZuZGVmIE5ERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxs
VmFsdWUsIEAielBvc2l0aW9uIiwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBuaWxdOworICAgIHJldHVybiBhY3Rpb25zOworfQorCitHcmFwaGljc0xheWVyKiBHcmFwaGlj
c0xheWVyOjpjcmVhdGVHcmFwaGljc0xheWVyKEdyYXBoaWNzTGF5ZXJDbGllbnQqIGNsaWVudCkK
K3sKKyAgICByZXR1cm4gbmV3IEdyYXBoaWNzTGF5ZXJDQShjbGllbnQpOworfQorCitHcmFwaGlj
c0xheWVyQ0E6OkdyYXBoaWNzTGF5ZXJDQShHcmFwaGljc0xheWVyQ2xpZW50KiBjbGllbnQpCis6
IEdyYXBoaWNzTGF5ZXIoY2xpZW50KQorLCBtX2NvbnRlbnRMYXllckZvckltYWdlT3JWaWRlbyhm
YWxzZSkKK3sKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICBtX2xheWVyLmFk
b3B0TlMoW1tXS0xheWVyIGFsbG9jXSBpbml0XSk7CisgICAgW21fbGF5ZXIuZ2V0KCkgc2V0TGF5
ZXJPd25lcjp0aGlzXTsKKworI2lmbmRlZiBOREVCVUcKKyAgICB1cGRhdGVEZWJ1Z0luZGljYXRv
cnMoKTsKKyNlbmRpZgorCisgICAgbV9hbmltYXRpb25EaWRTdGFydENCLmFkb3B0TlMoW1tBbmlt
YXRpb25EaWRTdGFydENCIGFsbG9jXSBpbml0XSk7CisgICAgW21fYW5pbWF0aW9uRGlkU3RhcnRD
Qi5nZXQoKSBzZXRMYXllcjp0aGlzXTsKKyAgICAKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJ
T05TCit9CisKK0dyYXBoaWNzTGF5ZXJDQTo6fkdyYXBoaWNzTGF5ZXJDQSgpCit7CisgICAgLy8g
UmVtb3ZlIGEgaW5uZXIgbGF5ZXIgaWYgdGhlcmUgaXMgb25lLgorICAgIGNsZWFyQ29udGVudHMo
KTsKKworICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworCisgICAgLy8gQ2xlYW4gdXAg
dGhlIFdLIGxheWVyLgorICAgIGlmIChtX2xheWVyKSB7CisgICAgICAgIFdLTGF5ZXIqIGxheWVy
ID0gbV9sYXllci5nZXQoKTsKKyAgICAgICAgW2xheWVyIHNldExheWVyT3duZXI6bmlsXTsKKyAg
ICAgICAgW2xheWVyIHJlbW92ZUZyb21TdXBlcmxheWVyXTsKKyAgICB9CisgICAgCisgICAgaWYg
KG1fdHJhbnNmb3JtTGF5ZXIpCisgICAgICAgIFttX3RyYW5zZm9ybUxheWVyLmdldCgpIHJlbW92
ZUZyb21TdXBlcmxheWVyXTsKKworICAgIC8vIGFuaW1hdGlvbkRpZFN0YXJ0OiBjYW4gZmlyZSBh
ZnRlciB0aGlzLCBzbyB3ZSBuZWVkIHRvIGNsZWFyIG91dCB0aGUgbGF5ZXIgb24gdGhlIGRlbGVn
YXRlLgorICAgIFttX2FuaW1hdGlvbkRpZFN0YXJ0Q0IuZ2V0KCkgc2V0TGF5ZXI6MF07CisKKyAg
ICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjpz
ZXROYW1lKGNvbnN0IFN0cmluZyYgbmFtZSkKK3sKKyAgICBTdHJpbmcgbG9uZ05hbWUgPSBTdHJp
bmc6OmZvcm1hdCgiQ0FMYXllciglcCkgR3JhcGhpY3NMYXllciglcCkgIiwgbV9sYXllci5nZXQo
KSwgdGhpcykgKyBuYW1lOworICAgIEdyYXBoaWNzTGF5ZXI6OnNldE5hbWUobG9uZ05hbWUpOwor
ICAgIAorICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgIFttX2xheWVyLmdldCgp
IHNldE5hbWU6bmFtZV07CisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUworfQorCitOYXRp
dmVMYXllciBHcmFwaGljc0xheWVyQ0E6Om5hdGl2ZUxheWVyKCkgY29uc3QKK3sKKyAgICByZXR1
cm4gbV9sYXllci5nZXQoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0E6OmFkZENoaWxkKEdy
YXBoaWNzTGF5ZXIqIGNoaWxkTGF5ZXIpCit7CisgICAgR3JhcGhpY3NMYXllcjo6YWRkQ2hpbGQo
Y2hpbGRMYXllcik7CisKKyAgICBHcmFwaGljc0xheWVyQ0EqIGNoaWxkTGF5ZXJDQSA9IHN0YXRp
Y19jYXN0PEdyYXBoaWNzTGF5ZXJDQSo+KGNoaWxkTGF5ZXIpOworICAgIEJFR0lOX0JMT0NLX09C
SkNfRVhDRVBUSU9OUworICAgIFtob3N0TGF5ZXJGb3JTdWJsYXllcnMoKSBhZGRTdWJsYXllcjpj
aGlsZExheWVyQ0EtPmxheWVyRm9yU3VwZXJsYXllcigpXTsKKyAgICBFTkRfQkxPQ0tfT0JKQ19F
WENFUFRJT05TCit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjphZGRDaGlsZEF0SW5kZXgoR3Jh
cGhpY3NMYXllciogY2hpbGRMYXllciwgaW50IGluZGV4KQoreworICAgIEdyYXBoaWNzTGF5ZXI6
OmFkZENoaWxkQXRJbmRleChjaGlsZExheWVyLCBpbmRleCk7CisKKyAgICBHcmFwaGljc0xheWVy
Q0EqIGNoaWxkTGF5ZXJDQSA9IHN0YXRpY19jYXN0PEdyYXBoaWNzTGF5ZXJDQSo+KGNoaWxkTGF5
ZXIpOworICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgIFtob3N0TGF5ZXJGb3JT
dWJsYXllcnMoKSBpbnNlcnRTdWJsYXllcjpjaGlsZExheWVyQ0EtPmxheWVyRm9yU3VwZXJsYXll
cigpIGF0SW5kZXg6aW5kZXhdOworICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKK30KKwor
dm9pZCBHcmFwaGljc0xheWVyQ0E6OmFkZENoaWxkQmVsb3coR3JhcGhpY3NMYXllciogY2hpbGRM
YXllciwgR3JhcGhpY3NMYXllciogc2libGluZykKK3sKKyAgICAvLyBGSVhNRTogc2hhcmUgY29k
ZSB3aXRoIGJhc2UgY2xhc3MKKyAgICBBU1NFUlQoY2hpbGRMYXllciAhPSB0aGlzKTsKKyAgICBj
aGlsZExheWVyLT5yZW1vdmVGcm9tUGFyZW50KCk7CisKKyAgICBib29sIGZvdW5kID0gZmFsc2U7
CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsK
KyAgICAgICAgaWYgKHNpYmxpbmcgPT0gbV9jaGlsZHJlbltpXSkgeworICAgICAgICAgICAgbV9j
aGlsZHJlbi5pbnNlcnQoaSwgY2hpbGRMYXllcik7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBjaGlsZExheWVyLT5z
ZXRQYXJlbnQodGhpcyk7CisKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKworICAg
IEdyYXBoaWNzTGF5ZXJDQSogY2hpbGRMYXllckNBID0gc3RhdGljX2Nhc3Q8R3JhcGhpY3NMYXll
ckNBKj4oY2hpbGRMYXllcik7CisgICAgR3JhcGhpY3NMYXllckNBKiBzaWJsaW5nTGF5ZXJDQSA9
IHN0YXRpY19jYXN0PEdyYXBoaWNzTGF5ZXJDQSo+KHNpYmxpbmcpOworICAgIGlmIChmb3VuZCkg
eworICAgICAgICBbaG9zdExheWVyRm9yU3VibGF5ZXJzKCkgaW5zZXJ0U3VibGF5ZXI6Y2hpbGRM
YXllckNBLT5sYXllckZvclN1cGVybGF5ZXIoKSBiZWxvdzpzaWJsaW5nTGF5ZXJDQS0+bGF5ZXJG
b3JTdXBlcmxheWVyKCldOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fY2hpbGRyZW4uYXBwZW5k
KGNoaWxkTGF5ZXIpOworICAgICAgICBbaG9zdExheWVyRm9yU3VibGF5ZXJzKCkgYWRkU3VibGF5
ZXI6Y2hpbGRMYXllckNBLT5sYXllckZvclN1cGVybGF5ZXIoKV07CisgICAgfQorCisgICAgRU5E
X0JMT0NLX09CSkNfRVhDRVBUSU9OUworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6YWRkQ2hp
bGRBYm92ZShHcmFwaGljc0xheWVyKiBjaGlsZExheWVyLCBHcmFwaGljc0xheWVyKiBzaWJsaW5n
KQoreworICAgIC8vIEZJWE1FOiBzaGFyZSBjb2RlIHdpdGggYmFzZSBjbGFzcworICAgIEFTU0VS
VChjaGlsZExheWVyICE9IHRoaXMpOworICAgIGNoaWxkTGF5ZXItPnJlbW92ZUZyb21QYXJlbnQo
KTsKKworICAgIHVuc2lnbmVkIGk7CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgIGZvciAo
aSA9IDA7IGkgPCBtX2NoaWxkcmVuLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChzaWJsaW5n
ID09IG1fY2hpbGRyZW5baV0pIHsKKyAgICAgICAgICAgIG1fY2hpbGRyZW4uaW5zZXJ0KGkrMSwg
Y2hpbGRMYXllcik7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgIH0KKyAgICBjaGlsZExheWVyLT5zZXRQYXJlbnQodGhpcyk7CisK
KyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKworICAgIEdyYXBoaWNzTGF5ZXJDQSog
Y2hpbGRMYXllckNBID0gc3RhdGljX2Nhc3Q8R3JhcGhpY3NMYXllckNBKj4oY2hpbGRMYXllcik7
CisgICAgR3JhcGhpY3NMYXllckNBKiBzaWJsaW5nTGF5ZXJDQSA9IHN0YXRpY19jYXN0PEdyYXBo
aWNzTGF5ZXJDQSo+KHNpYmxpbmcpOworICAgIGlmIChmb3VuZCkgeworICAgICAgICBbaG9zdExh
eWVyRm9yU3VibGF5ZXJzKCkgaW5zZXJ0U3VibGF5ZXI6Y2hpbGRMYXllckNBLT5sYXllckZvclN1
cGVybGF5ZXIoKSBhYm92ZTpzaWJsaW5nTGF5ZXJDQS0+bGF5ZXJGb3JTdXBlcmxheWVyKCldOwor
ICAgIH0gZWxzZSB7CisgICAgICAgIG1fY2hpbGRyZW4uYXBwZW5kKGNoaWxkTGF5ZXIpOworICAg
ICAgICBbaG9zdExheWVyRm9yU3VibGF5ZXJzKCkgYWRkU3VibGF5ZXI6Y2hpbGRMYXllckNBLT5s
YXllckZvclN1cGVybGF5ZXIoKV07CisgICAgfQorCisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBU
SU9OUworfQorCitib29sIEdyYXBoaWNzTGF5ZXJDQTo6cmVwbGFjZUNoaWxkKEdyYXBoaWNzTGF5
ZXIqIG9sZENoaWxkLCBHcmFwaGljc0xheWVyKiBuZXdDaGlsZCkKK3sKKyAgICAvLyBGSVhNRTog
c2hhcmUgY29kZSB3aXRoIGJhc2UgY2xhc3MKKyAgICBBU1NFUlQoIW5ld0NoaWxkLT5wYXJlbnQo
KSk7CisKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IG1fY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG9sZENoaWxkID09IG1f
Y2hpbGRyZW5baV0pIHsKKyAgICAgICAgICAgIG1fY2hpbGRyZW5baV0gPSBuZXdDaGlsZDsKKyAg
ICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cisg
ICAgfQorCisgICAgaWYgKGZvdW5kKSB7CisgICAgICAgIG9sZENoaWxkLT5zZXRQYXJlbnQoMCk7
CisKKyAgICAgICAgbmV3Q2hpbGQtPnJlbW92ZUZyb21QYXJlbnQoKTsKKyAgICAgICAgbmV3Q2hp
bGQtPnNldFBhcmVudCh0aGlzKTsKKworICAgICAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElP
TlMKKyAgICAgICAgR3JhcGhpY3NMYXllckNBKiBvbGRDaGlsZENBID0gc3RhdGljX2Nhc3Q8R3Jh
cGhpY3NMYXllckNBKj4ob2xkQ2hpbGQpOworICAgICAgICBHcmFwaGljc0xheWVyQ0EqIG5ld0No
aWxkQ0EgPSBzdGF0aWNfY2FzdDxHcmFwaGljc0xheWVyQ0EqPihuZXdDaGlsZCk7CisgICAgICAg
IFtob3N0TGF5ZXJGb3JTdWJsYXllcnMoKSByZXBsYWNlU3VibGF5ZXI6b2xkQ2hpbGRDQS0+bGF5
ZXJGb3JTdXBlcmxheWVyKCkgd2l0aDpuZXdDaGlsZENBLT5sYXllckZvclN1cGVybGF5ZXIoKV07
CisgICAgICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0E6OnJl
bW92ZUZyb21QYXJlbnQoKQoreworICAgIEdyYXBoaWNzTGF5ZXI6OnJlbW92ZUZyb21QYXJlbnQo
KTsKKworICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgIFtsYXllckZvclN1cGVy
bGF5ZXIoKSByZW1vdmVGcm9tU3VwZXJsYXllcl07ICAgICAgICAgICAgCisgICAgRU5EX0JMT0NL
X09CSkNfRVhDRVBUSU9OUworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6c2V0UG9zaXRpb24o
Y29uc3QgRmxvYXRQb2ludCYgcG9pbnQpCit7CisgICAgLy8gRG9uJ3Qgc2hvcnQtY2lyY3VpdCBo
ZXJlLCBiZWNhdXNlIHBvc2l0aW9uIGFuZCBhbmNob3IgcG9pbnQgYXJlIGludGVyLWRlcGVuZGVu
dC4KKyAgICBHcmFwaGljc0xheWVyOjpzZXRQb3NpdGlvbihwb2ludCk7CisKKyAgICAvLyBQb3Np
dGlvbiBpcyBvZmZzZXQgb24gdGhlIGxheWVyIGJ5IHRoZSBsYXllciBhbmNob3IgcG9pbnQuCisg
ICAgQ0dQb2ludCBwb3NQb2ludCA9IENHUG9pbnRNYWtlKG1fcG9zaXRpb24ueCgpICsgbV9hbmNo
b3JQb2ludC54KCkgKiBtX3NpemUud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbV9wb3NpdGlvbi55KCkgKyBtX2FuY2hvclBvaW50LnkoKSAqIG1fc2l6ZS5oZWln
aHQoKSk7CisgICAgCisgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgW3ByaW1h
cnlMYXllcigpIHNldFBvc2l0aW9uOnBvc1BvaW50XTsKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENF
UFRJT05TCit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjpzZXRBbmNob3JQb2ludChjb25zdCBG
bG9hdFBvaW50JiBwb2ludCwgZmxvYXQgaW5aKQoreworICAgIC8vIERvbid0IHNob3J0LWNpcmN1
aXQgaGVyZSwgYmVjYXVzZSBwb3NpdGlvbiBhbmQgYW5jaG9yIHBvaW50IGFyZSBpbnRlci1kZXBl
bmRlbnQuCisgICAgYm9vbCB6Q2hhbmdlZCA9IChpblogIT0gbV9hbmNob3JaKTsKKyAgICBHcmFw
aGljc0xheWVyOjpzZXRBbmNob3JQb2ludChwb2ludCwgaW5aKTsKKworICAgIEJFR0lOX0JMT0NL
X09CSkNfRVhDRVBUSU9OUworICAgIC8vIHNldCB0aGUgdmFsdWUgb24gdGhlIGxheWVyIHRvIHRo
ZSBuZXcgdHJhbnNmb3JtLgorICAgIFtwcmltYXJ5TGF5ZXIoKSBzZXRBbmNob3JQb2ludDpwb2lu
dF07CisKKyAgICBpZiAoekNoYW5nZWQpIAorICAgICAgICBbcHJpbWFyeUxheWVyKCkgc2V0QW5j
aG9yUG9pbnRaOm1fYW5jaG9yWl07CisKKyAgICAvLyBQb3NpdGlvbiBkZXBlbmRzIG9uIGFuY2hv
ciBwb2ludCwgc28gdXBkYXRlIGl0IG5vdy4KKyAgICBzZXRQb3NpdGlvbihtX3Bvc2l0aW9uKTsK
KyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNB
OjpzZXRTaXplKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sKKyAgICBHcmFwaGljc0xheWVyOjpz
ZXRTaXplKHNpemUpOworCisgICAgQ0dSZWN0IHJlY3QgPSBDR1JlY3RNYWtlKDAuMGYsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIDAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG1fc2l6ZS53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NpemUu
aGVpZ2h0KCkpOworICAgIAorICAgIENHUG9pbnQgY2VudGVyUG9pbnQgPSBDR1BvaW50TWFrZSht
X3NpemUud2lkdGgoKSAvIDIuMGYsIG1fc2l6ZS5oZWlnaHQoKSAvIDIuMGYpOworICAgIAorICAg
IEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworCisgICAgaWYgKG1fdHJhbnNmb3JtTGF5ZXIp
IHsKKyAgICAgICAgW21fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkgc2V0Qm91bmRzOnJlY3RdOworICAg
IAorICAgICAgICAvLyB0aGUgYW5jaG9yIG9mIHRoZSBjb250ZW50cyBsYXllciBpcyBhbHdheXMg
YXQgMC41LCAwLjUsIHNvIHRoZSBwb3NpdGlvbgorICAgICAgICAvLyBpcyBjZW50ZXItcmVsYXRp
dmUKKyAgICAgICAgW21fbGF5ZXIuZ2V0KCkgc2V0UG9zaXRpb246Y2VudGVyUG9pbnRdOworICAg
IH0KKyAgICAKKyAgICBib29sIG5lZWRUaWxlZExheWVyID0gcmVxdWlyZXNUaWxlZExheWVyKG1f
c2l6ZSk7CisgICAgaWYgKG5lZWRUaWxlZExheWVyICE9IG1fdXNpbmdUaWxlZExheWVyKQorICAg
ICAgICBzd2FwRnJvbU9yVG9UaWxlZExheWVyKG5lZWRUaWxlZExheWVyKTsKKyAgICAKKyAgICBb
bV9sYXllci5nZXQoKSBzZXRCb3VuZHM6cmVjdF07CisKKyAgICAvLyBOb3RlIHRoYXQgd2UgZG9u
J3QgcmVzaXplIG1fY29udGVudHNMYXllci4gSXQncyB1cCB0aGUgY2FsbGVyIHRvIGRvIHRoYXQu
CisKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCisKKyAgICAvLyBpZiB3ZSd2ZSBjaGFu
Z2VkIHRoZSBib3VuZHMsIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIHBvc2l0aW9uCisgICAg
Ly8gb2YgdGhlIGxheWVyLCB0YWtpbmcgYW5jaG9yIHBvaW50IGludG8gYWNjb3VudAorICAgIHNl
dFBvc2l0aW9uKG1fcG9zaXRpb24pOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6c2V0VHJh
bnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KQoreworICAgIEdyYXBoaWNzTGF5
ZXI6OnNldFRyYW5zZm9ybSh0KTsKKyAgICAKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElP
TlMKKyAgICBDQVRyYW5zZm9ybTNEIHRyYW5zZm9ybTsKKyAgICBjb3B5VHJhbnNmb3JtKHRyYW5z
Zm9ybSwgdCk7CisgICAgW3ByaW1hcnlMYXllcigpIHNldFRyYW5zZm9ybTp0cmFuc2Zvcm1dOwor
ICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICAKKyAgICAvLyBSZW1vdmUgYW55IG9s
ZCB0cmFuc2l0aW9uIGVudHJpZXMgZm9yIHRyYW5zZm9ybS4KKyAgICByZW1vdmVBbGxBbmltYXRp
b25zRm9yUHJvcGVydHkoQW5pbWF0ZWRQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybSk7CisKKyAgICAv
LyBFdmVuIGlmIHdlIGRvbid0IGhhdmUgYSB0cmFuc2l0aW9uIGluIHRoZSBsaXN0LCB0aGUgbGF5
ZXIgbWF5IHN0aWxsIGhhdmUgb25lLgorICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIHdlIGFyZSBz
ZXR0aW5nIHRoZSBmaW5hbCB0cmFuc2Zvcm0gdmFsdWUgYWZ0ZXIgYW4gYW5pbWF0aW9uIG9yCisg
ICAgLy8gdHJhbnNpdGlvbiBoYXMgZW5kZWQuIEluIHJlbW92ZUFuaW1hdGlvbiB3ZSB0b3NzIHRo
ZSBlbnRyeSBmcm9tIHRoZSBsaXN0IGJ1dCBkb24ndAorICAgIC8vIHJlbW92ZSBpdCBmcm9tIHRo
ZSBsaXN0LiBUaGF0IHdheSB3ZSBhcmVuJ3QgaW4gZGFuZ2VyIG9mIGRpc3BsYXlpbmcgYSBzdGFs
ZSB0cmFuc2Zvcm0KKyAgICAvLyBpbiB0aGUgdGltZSBiZXR3ZWVuIHJlbW92aW5nIHRoZSBhbmlt
YXRpb24gYW5kIHNldHRpbmcgdGhlIG5ldyB1bmFuaW1hdGVkIHZhbHVlLiBXZSAKKyAgICAvLyBj
YW4ndCBkbyB0aGlzIGluIHJlbW92ZUFuaW1hdGlvbiBiZWNhdXNlIHdlIGRvbid0IGtub3cgdGhl
IG5ldyB0cmFuc2Zvcm0gdmFsdWUgdGhlcmUuCisgICAgU3RyaW5nIGtleVBhdGggPSBwcm9wZXJ0
eUlkVG9TdHJpbmcoQW5pbWF0ZWRQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybSk7CisgICAgQ0FMYXll
ciogbGF5ZXIgPSBhbmltYXRlZExheWVyKEFuaW1hdGVkUHJvcGVydHlXZWJraXRUcmFuc2Zvcm0p
OworICAgIAorICAgIGZvciAoaW50IGkgPSAwOyA7ICsraSkgeworICAgICAgICBTdHJpbmcgYW5p
bU5hbWUgPSBrZXlQYXRoICsgIl8iICsgU3RyaW5nOjpudW1iZXIoaSk7CisgICAgICAgIGlmICgh
W2xheWVyIGFuaW1hdGlvbkZvcktleTogYW5pbU5hbWVdKQorICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIFtsYXllciByZW1vdmVBbmltYXRpb25Gb3JLZXk6YW5pbU5hbWVdOworICAgIH0KK30K
Kwordm9pZCBHcmFwaGljc0xheWVyQ0E6OnNldENoaWxkcmVuVHJhbnNmb3JtKGNvbnN0IFRyYW5z
Zm9ybWF0aW9uTWF0cml4JiB0KQoreworICAgIGlmICh0ID09IG1fY2hpbGRyZW5UcmFuc2Zvcm0p
CisgICAgICAgIHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldENoaWxkcmVuVHJhbnNm
b3JtKHQpOworCisgICAgQ0FUcmFuc2Zvcm0zRCB0cmFuc2Zvcm07CisgICAgY29weVRyYW5zZm9y
bSh0cmFuc2Zvcm0sIHQpOworCisgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAg
Ly8gU2V0IHRoZSB2YWx1ZSBvbiB0aGUgbGF5ZXIgdG8gdGhlIG5ldyB0cmFuc2Zvcm0uCisgICAg
W3ByaW1hcnlMYXllcigpIHNldFN1YmxheWVyVHJhbnNmb3JtOnRyYW5zZm9ybV07CisgICAgRU5E
X0JMT0NLX09CSkNfRVhDRVBUSU9OUworfQorCitzdGF0aWMgdm9pZCBtb3ZlQW5pbWF0aW9uKEFu
aW1hdGVkUHJvcGVydHlJRCBwcm9wZXJ0eSwgQ0FMYXllciogZnJvbUxheWVyLCBDQUxheWVyKiB0
b0xheWVyKQoreworICAgIFN0cmluZyBrZXlQYXRoID0gR3JhcGhpY3NMYXllcjo6cHJvcGVydHlJ
ZFRvU3RyaW5nKHByb3BlcnR5KTsKKyAgICBmb3IgKHNob3J0IGluZGV4ID0gMDsgOyArK2luZGV4
KSB7CisgICAgICAgIFN0cmluZyBhbmltTmFtZSA9IGtleVBhdGggKyAiXyIgKyBTdHJpbmc6Om51
bWJlcihpbmRleCk7CisgICAgICAgIENBQW5pbWF0aW9uKiBhbmltID0gW2Zyb21MYXllciBhbmlt
YXRpb25Gb3JLZXk6YW5pbU5hbWVdOworICAgICAgICBpZiAoIWFuaW0pCisgICAgICAgICAgICBi
cmVhazsKKworICAgICAgICBbYW5pbSByZXRhaW5dOworICAgICAgICBbZnJvbUxheWVyIHJlbW92
ZUFuaW1hdGlvbkZvcktleTphbmltTmFtZV07CisgICAgICAgIFt0b0xheWVyIGFkZEFuaW1hdGlv
bjphbmltIGZvcktleTphbmltTmFtZV07CisgICAgICAgIFthbmltIHJlbGVhc2VdOworICAgIH0K
K30KKworc3RhdGljIHZvaWQgbW92ZVN1YmxheWVycyhDQUxheWVyKiBmcm9tTGF5ZXIsIENBTGF5
ZXIqIHRvTGF5ZXIpCit7CisgICAgTlNBcnJheSogc3VibGF5ZXJzQ29weSA9IFtbZnJvbUxheWVy
IHN1YmxheWVyc10gY29weV07IC8vIEF2b2lkIG11dGF0aW9uIHdoaWxlIGVudW1lcmF0aW5nLCBh
bmQga2VlcCB0aGUgc3VibGF5ZXJzIGFsaXZlLgorICAgIE5TRW51bWVyYXRvciogY2hpbGRyZW5F
bnVtZXJhdG9yID0gW3N1YmxheWVyc0NvcHkgb2JqZWN0RW51bWVyYXRvcl07CisKKyAgICBDQUxh
eWVyKiBsYXllcjsKKyAgICB3aGlsZSAoKGxheWVyID0gW2NoaWxkcmVuRW51bWVyYXRvciBuZXh0
T2JqZWN0XSkgIT0gbmlsKSB7CisgICAgICAgIFtsYXllciByZW1vdmVGcm9tU3VwZXJsYXllcl07
CisgICAgICAgIFt0b0xheWVyIGFkZFN1YmxheWVyOmxheWVyXTsKKyAgICB9CisgICAgW3N1Ymxh
eWVyc0NvcHkgcmVsZWFzZV07Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjpzZXRQcmVzZXJ2
ZXMzRChib29sIHByZXNlcnZlczNEKQoreworICAgIEdyYXBoaWNzTGF5ZXI6OnNldFByZXNlcnZl
czNEKHByZXNlcnZlczNEKTsKKworICAgIENHUG9pbnQgcG9pbnQgPSBDR1BvaW50TWFrZShtX3Np
emUud2lkdGgoKSAvIDIuMGYsIG1fc2l6ZS5oZWlnaHQoKSAvIDIuMGYpOworICAgIENHUG9pbnQg
Y2VudGVyUG9pbnQgPSBDR1BvaW50TWFrZSgwLjVmLCAwLjVmKTsKKyAgICAKKyAgICBCRUdJTl9C
TE9DS19PQkpDX0VYQ0VQVElPTlMKKworICAgIGlmIChwcmVzZXJ2ZXMzRCAmJiAhbV90cmFuc2Zv
cm1MYXllcikgeworICAgICAgICAvLyBDcmVhdGUgdGhlIHRyYW5zZm9ybSBsYXllci4KKyAgICAg
ICAgbV90cmFuc2Zvcm1MYXllci5hZG9wdE5TKFtbQ0FUcmFuc2Zvcm1MYXllciBhbGxvY10gaW5p
dF0pOworCisgICAgICAgIC8vIFR1cm4gb2ZmIGRlZmF1bHQgYW5pbWF0aW9ucy4KKyAgICAgICAg
W21fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkgc2V0U3R5bGU6W05TRGljdGlvbmFyeSBkaWN0aW9uYXJ5
V2l0aE9iamVjdDpudWxsQWN0aW9uc0RpY3Rpb25hcnkoKSBmb3JLZXk6QCJhY3Rpb25zIl1dOwor
ICAgICAgICAKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgIFttX3RyYW5zZm9ybUxheWVyLmdldCgp
IHNldE5hbWU6W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJUcmFuc2Zvcm0gTGF5ZXIgQ0FU
cmFuc2Zvcm1MYXllciglcCkgR3JhcGhpY3NMYXllciglcCkiLCBtX3RyYW5zZm9ybUxheWVyLmdl
dCgpLCB0aGlzXV07CisjZW5kaWYKKyAgICAgICAgLy8gQ29weSB0aGUgcG9zaXRpb24gZnJvbSB0
aGlzIGxheWVyLgorICAgICAgICBbbV90cmFuc2Zvcm1MYXllci5nZXQoKSBzZXRCb3VuZHM6W21f
bGF5ZXIuZ2V0KCkgYm91bmRzXV07CisgICAgICAgIFttX3RyYW5zZm9ybUxheWVyLmdldCgpIHNl
dFBvc2l0aW9uOlttX2xheWVyLmdldCgpIHBvc2l0aW9uXV07CisgICAgICAgIFttX3RyYW5zZm9y
bUxheWVyLmdldCgpIHNldEFuY2hvclBvaW50OlttX2xheWVyLmdldCgpIGFuY2hvclBvaW50XV07
CisgICAgICAgIFttX3RyYW5zZm9ybUxheWVyLmdldCgpIHNldEFuY2hvclBvaW50WjpbbV9sYXll
ci5nZXQoKSBhbmNob3JQb2ludFpdXTsKKyAgICAgICAgW21fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkg
c2V0Q29udGVudHNSZWN0OlttX2xheWVyLmdldCgpIGNvbnRlbnRzUmVjdF1dOworI2lmbmRlZiBO
REVCVUcKKyAgICAgICAgW21fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkgc2V0WlBvc2l0aW9uOlttX2xh
eWVyLmdldCgpIHpQb3NpdGlvbl1dOworI2VuZGlmCisgICAgICAgIAorICAgICAgICAvLyBUaGUg
Y29udGVudHMgbGF5ZXIgaXMgcG9zaXRpb25lZCBhdCAoMCwwKSByZWxhdGl2ZSB0byB0aGUgdHJh
bnNmb3JtTGF5ZXIuCisgICAgICAgIFttX2xheWVyLmdldCgpIHNldFBvc2l0aW9uOnBvaW50XTsK
KyAgICAgICAgW21fbGF5ZXIuZ2V0KCkgc2V0QW5jaG9yUG9pbnQ6Y2VudGVyUG9pbnRdOworI2lm
bmRlZiBOREVCVUcKKyAgICAgICAgW21fbGF5ZXIuZ2V0KCkgc2V0WlBvc2l0aW9uOjAuMGZdOwor
I2VuZGlmCisgICAgICAgIAorICAgICAgICAvLyBUcmFuc2ZlciB0aGUgdHJhbnNmb3JtIG92ZXIu
CisgICAgICAgIFttX3RyYW5zZm9ybUxheWVyLmdldCgpIHNldFRyYW5zZm9ybTpbbV9sYXllci5n
ZXQoKSB0cmFuc2Zvcm1dXTsKKyAgICAgICAgW21fbGF5ZXIuZ2V0KCkgc2V0VHJhbnNmb3JtOkNB
VHJhbnNmb3JtM0RJZGVudGl0eV07CisgICAgICAgIAorICAgICAgICAvLyBUcmFuc2ZlciB0aGUg
b3BhY2l0eSBmcm9tIHRoZSBvbGQgbGF5ZXIgdG8gdGhlIHRyYW5zZm9ybSBsYXllci4KKyAgICAg
ICAgW21fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkgc2V0T3BhY2l0eTptX29wYWNpdHldOworICAgICAg
ICBbbV9sYXllci5nZXQoKSBzZXRPcGFjaXR5OjFdOworCisgICAgICAgIC8vIE1vdmUgdGhpcyBs
YXllciB0byBiZSBhIGNoaWxkIG9mIHRoZSB0cmFuc2Zvcm0gbGF5ZXIuCisgICAgICAgIFtbbV9s
YXllci5nZXQoKSBzdXBlcmxheWVyXSByZXBsYWNlU3VibGF5ZXI6bV9sYXllci5nZXQoKSB3aXRo
Om1fdHJhbnNmb3JtTGF5ZXIuZ2V0KCldOworICAgICAgICBbbV90cmFuc2Zvcm1MYXllci5nZXQo
KSBhZGRTdWJsYXllcjptX2xheWVyLmdldCgpXTsKKworICAgICAgICBtb3ZlQW5pbWF0aW9uKEFu
aW1hdGVkUHJvcGVydHlXZWJraXRUcmFuc2Zvcm0sIG1fbGF5ZXIuZ2V0KCksIG1fdHJhbnNmb3Jt
TGF5ZXIuZ2V0KCkpOworICAgICAgICBtb3ZlU3VibGF5ZXJzKG1fbGF5ZXIuZ2V0KCksIG1fdHJh
bnNmb3JtTGF5ZXIuZ2V0KCkpOworCisgICAgfSBlbHNlIGlmICghcHJlc2VydmVzM0QgJiYgbV90
cmFuc2Zvcm1MYXllcikgeworICAgICAgICAvLyBSZWxhY2UgdGhlIHRyYW5zZm9ybUxheWVyIGlu
IHRoZSBwYXJlbnQgd2l0aCB0aGlzIGxheWVyLgorICAgICAgICBbbV9sYXllci5nZXQoKSByZW1v
dmVGcm9tU3VwZXJsYXllcl07CisgICAgICAgIFtbbV90cmFuc2Zvcm1MYXllci5nZXQoKSBzdXBl
cmxheWVyXSByZXBsYWNlU3VibGF5ZXI6bV90cmFuc2Zvcm1MYXllci5nZXQoKSB3aXRoOm1fbGF5
ZXIuZ2V0KCldOworCisgICAgICAgIG1vdmVBbmltYXRpb24oQW5pbWF0ZWRQcm9wZXJ0eVdlYmtp
dFRyYW5zZm9ybSwgbV90cmFuc2Zvcm1MYXllci5nZXQoKSwgbV9sYXllci5nZXQoKSk7CisgICAg
ICAgIG1vdmVTdWJsYXllcnMobV90cmFuc2Zvcm1MYXllci5nZXQoKSwgbV9sYXllci5nZXQoKSk7
CisKKyAgICAgICAgLy8gUmVzZXQgdGhlIGxheWVyIHBvc2l0aW9uIGFuZCB0cmFuc2Zvcm0uCisg
ICAgICAgIFttX2xheWVyLmdldCgpIHNldFBvc2l0aW9uOlttX3RyYW5zZm9ybUxheWVyLmdldCgp
IHBvc2l0aW9uXV07CisgICAgICAgIFttX2xheWVyLmdldCgpIHNldEFuY2hvclBvaW50OlttX3Ry
YW5zZm9ybUxheWVyLmdldCgpIGFuY2hvclBvaW50XV07CisgICAgICAgIFttX2xheWVyLmdldCgp
IHNldEFuY2hvclBvaW50WjpbbV90cmFuc2Zvcm1MYXllci5nZXQoKSBhbmNob3JQb2ludFpdXTsK
KyAgICAgICAgW21fbGF5ZXIuZ2V0KCkgc2V0Q29udGVudHNSZWN0OlttX3RyYW5zZm9ybUxheWVy
LmdldCgpIGNvbnRlbnRzUmVjdF1dOworICAgICAgICBbbV9sYXllci5nZXQoKSBzZXRUcmFuc2Zv
cm06W21fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkgdHJhbnNmb3JtXV07CisgICAgICAgIFttX2xheWVy
LmdldCgpIHNldE9wYWNpdHk6W21fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkgb3BhY2l0eV1dOworI2lm
bmRlZiBOREVCVUcKKyAgICAgICAgW21fbGF5ZXIuZ2V0KCkgc2V0WlBvc2l0aW9uOlttX3RyYW5z
Zm9ybUxheWVyLmdldCgpIHpQb3NpdGlvbl1dOworI2VuZGlmCisKKyAgICAgICAgLy8gUmVsZWFz
ZSB0aGUgdHJhbnNmb3JtIGxheWVyLgorICAgICAgICBtX3RyYW5zZm9ybUxheWVyID0gMDsKKyAg
ICB9CisKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCit9CisKK3ZvaWQgR3JhcGhpY3NM
YXllckNBOjpzZXRNYXNrc1RvQm91bmRzKGJvb2wgbWFza3NUb0JvdW5kcykKK3sKKyAgICBpZiAo
bWFza3NUb0JvdW5kcyA9PSBtX21hc2tzVG9Cb3VuZHMpCisgICAgICAgIHJldHVybjsKKworICAg
IEdyYXBoaWNzTGF5ZXI6OnNldE1hc2tzVG9Cb3VuZHMobWFza3NUb0JvdW5kcyk7CisKKyAgICBC
RUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICBbbV9sYXllci5nZXQoKSBzZXRNYXNrc1Rv
Qm91bmRzOm1hc2tzVG9Cb3VuZHNdOworICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKwor
I2lmbmRlZiBOREVCVUcKKyAgICB1cGRhdGVEZWJ1Z0luZGljYXRvcnMoKTsKKyNlbmRpZgorfQor
Cit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6c2V0RHJhd3NDb250ZW50KGJvb2wgZHJhd3NDb250ZW50
KQoreworICAgIGlmIChkcmF3c0NvbnRlbnQgIT0gbV9kcmF3c0NvbnRlbnQpIHsKKyAgICAgICAg
R3JhcGhpY3NMYXllcjo6c2V0RHJhd3NDb250ZW50KGRyYXdzQ29udGVudCk7CisKKyAgICAgICAg
Ym9vbCBuZWVkVGlsZWRMYXllciA9IHJlcXVpcmVzVGlsZWRMYXllcihtX3NpemUpOworICAgICAg
ICBpZiAobmVlZFRpbGVkTGF5ZXIgIT0gbV91c2luZ1RpbGVkTGF5ZXIpCisgICAgICAgICAgICBz
d2FwRnJvbU9yVG9UaWxlZExheWVyKG5lZWRUaWxlZExheWVyKTsKKworICAgICAgICBCRUdJTl9C
TE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICAgICAgLy8gQ2xvYmJlciBhbnkgZXhpc3RpbmcgY29u
dGVudC4gSWYgbmVjZXNzYXJ5LCBDQSB3aWxsIGNyZWF0ZSBiYWNraW5nIHN0b3JlIG9uIHRoZSBu
ZXh0IGRpc3BsYXkuCisgICAgICAgIFttX2xheWVyLmdldCgpIHNldENvbnRlbnRzOm5pbF07Cisg
ICAgICAgIAorI2lmbmRlZiBOREVCVUcKKyAgICAgICAgdXBkYXRlRGVidWdJbmRpY2F0b3JzKCk7
CisjZW5kaWYKKyAgICAgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgIH0KK30KKwor
dm9pZCBHcmFwaGljc0xheWVyQ0E6OnNldEJhY2tncm91bmRDb2xvcihjb25zdCBDb2xvciYgY29s
b3IsIGNvbnN0IEFuaW1hdGlvbiogdHJhbnNpdGlvbiwgZG91YmxlIGJlZ2luVGltZSkKK3sKKyAg
ICBHcmFwaGljc0xheWVyOjpzZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IsIHRyYW5zaXRpb24sIGJl
Z2luVGltZSk7CisKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICBzZXRIYXND
b250ZW50c0xheWVyKHRydWUpOworICAgIAorICAgIGlmICh0cmFuc2l0aW9uICYmICF0cmFuc2l0
aW9uLT5pc0VtcHR5T3JaZXJvRHVyYXRpb24oKSkgeworICAgICAgICBDQUxheWVyKiBwcmVzTGF5
ZXIgPSBbbV9jb250ZW50c0xheWVyLmdldCgpIHByZXNlbnRhdGlvbkxheWVyXTsKKyAgICAgICAg
Ly8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHByZXNlbnRhdGlvbkxheWVyLCBqdXN0IHVzZSB0aGUgQ0FM
YXllcgorICAgICAgICBpZiAoIXByZXNMYXllcikKKyAgICAgICAgICAgIHByZXNMYXllciA9IG1f
Y29udGVudHNMYXllci5nZXQoKTsKKworICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgdmFsdWUg
b2YgdGhlIGJhY2tncm91bmQgY29sb3IgZnJvbSB0aGUgbGF5ZXIKKyAgICAgICAgQ0dDb2xvclJl
ZiBmcm9tQmFja2dyb3VuZENvbG9yID0gW3ByZXNMYXllciBiYWNrZ3JvdW5kQ29sb3JdOworCisg
ICAgICAgIENHQ29sb3JSZWYgYmdDb2xvciA9IGNnQ29sb3IoY29sb3IpOworICAgICAgICBzZXRC
YXNpY0FuaW1hdGlvbihBbmltYXRlZFByb3BlcnR5QmFja2dyb3VuZENvbG9yLCAiIiwgMCwgKGlk
KWZyb21CYWNrZ3JvdW5kQ29sb3IsIChpZCliZ0NvbG9yLCB0cnVlLCB0cmFuc2l0aW9uLCBiZWdp
blRpbWUpOworICAgICAgICBDR0NvbG9yUmVsZWFzZShiZ0NvbG9yKTsKKyAgICB9IGVsc2Ugewor
ICAgICAgICByZW1vdmVBbGxBbmltYXRpb25zRm9yUHJvcGVydHkoQW5pbWF0ZWRQcm9wZXJ0eUJh
Y2tncm91bmRDb2xvcik7ICAgIAorICAgICAgICBzZXRIYXNDb250ZW50c0xheWVyKHRydWUpOwor
ICAgICAgICBzZXRMYXllckJhY2tncm91bmRDb2xvcihtX2NvbnRlbnRzTGF5ZXIuZ2V0KCksIG1f
YmFja2dyb3VuZENvbG9yKTsKKyAgICB9CisKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05T
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjpjbGVhckJhY2tncm91bmRDb2xvcigpCit7Cisg
ICAgaWYgKCFtX2NvbnRlbnRMYXllckZvckltYWdlT3JWaWRlbykKKyAgICAgICAgc2V0SGFzQ29u
dGVudHNMYXllcihmYWxzZSk7CisgICAgZWxzZQorICAgICAgICBjbGVhckxheWVyQmFja2dyb3Vu
ZENvbG9yKG1fY29udGVudHNMYXllci5nZXQoKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNB
OjpzZXRDb250ZW50c09wYXF1ZShib29sIG9wYXF1ZSkKK3sKKyAgICBHcmFwaGljc0xheWVyOjpz
ZXRDb250ZW50c09wYXF1ZShvcGFxdWUpOworCisgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJ
T05TCisgICAgW21fbGF5ZXIuZ2V0KCkgc2V0T3BhcXVlOm1fY29udGVudHNPcGFxdWVdOworICAg
IEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0E6OnNl
dEJhY2tmYWNlVmlzaWJpbGl0eShib29sIHZpc2libGUpCit7CisgICAgaWYgKG1fYmFja2ZhY2VW
aXNpYmlsaXR5ID09IHZpc2libGUpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBHcmFwaGlj
c0xheWVyOjpzZXRCYWNrZmFjZVZpc2liaWxpdHkodmlzaWJsZSk7CisgICAgCisgICAgQkVHSU5f
QkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgW21fbGF5ZXIuZ2V0KCkgc2V0RG91YmxlU2lkZWQ6
dmlzaWJsZV07CisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUworfQorCitib29sIEdyYXBo
aWNzTGF5ZXJDQTo6c2V0T3BhY2l0eShmbG9hdCBvcGFjaXR5LCBjb25zdCBBbmltYXRpb24qIHRy
YW5zaXRpb24sIGRvdWJsZSBiZWdpblRpbWUpCit7CisgICAgZmxvYXQgY2xhbXBlZE9wYWNpdHkg
PSBzdGQ6Om1heChzdGQ6Om1pbihvcGFjaXR5LCAxLjBmKSwgMC4wZik7CisgICAgCisgICAgYm9v
bCBvcGFjaXRpZXNEaWZmZXIgPSAobV9vcGFjaXR5ICE9IGNsYW1wZWRPcGFjaXR5KTsKKyAgICAK
KyAgICBHcmFwaGljc0xheWVyOjpzZXRPcGFjaXR5KGNsYW1wZWRPcGFjaXR5LCB0cmFuc2l0aW9u
LCBiZWdpblRpbWUpOworICAgIAorICAgIGludCBhbmltSW5kZXggPSBmaW5kQW5pbWF0aW9uRW50
cnkoQW5pbWF0ZWRQcm9wZXJ0eU9wYWNpdHksIDApOworICAgICAgICAKKyAgICAvLyBJZiB3ZSBk
b24ndCBoYXZlIGEgdHJhbnNpdGlvbiBqdXN0IHNldCB0aGUgb3BhY2l0eQorICAgIGlmICghdHJh
bnNpdGlvbiB8fCB0cmFuc2l0aW9uLT5pc0VtcHR5T3JaZXJvRHVyYXRpb24oKSkgeworICAgICAg
ICAvLyBUaHJlZSBjYXNlczoKKyAgICAgICAgLy8gIDEpIG5vIGV4aXN0aW5nIGFuaW1hdGlvbiBv
ciB0cmFuc2l0aW9uOiBqdXN0IHNldCBvcGFjaXR5CisgICAgICAgIC8vICAyKSBleGlzdGluZyB0
cmFuc2l0aW9uOiBjbGVhciBpdCBhbmQgc2V0IG9wYWNpdHkKKyAgICAgICAgLy8gIDMpIGV4aXN0
aW5nIGFuaW1hdGlvbjoganVzdCByZXR1cm4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKGFuaW1J
bmRleCA8IDAgfHwgbV9hbmltYXRpb25zW2FuaW1JbmRleF0uaXNUcmFuc2l0aW9uKSB7CisgICAg
ICAgICAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICAgICAgICAgIFtwcmltYXJ5
TGF5ZXIoKSBzZXRPcGFjaXR5Om9wYWNpdHldOworICAgICAgICAgICAgaWYgKGFuaW1JbmRleCA+
PSAwKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlQWxsQW5pbWF0aW9uc0ZvclByb3BlcnR5KEFu
aW1hdGVkUHJvcGVydHlPcGFjaXR5KTsKKyAgICAgICAgICAgICAgICBhbmltSW5kZXggPSAtMTsK
KyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGtleVBhdGggPSBw
cm9wZXJ0eUlkVG9TdHJpbmcoQW5pbWF0ZWRQcm9wZXJ0eU9wYWNpdHkpOworICAgICAgICAgICAg
ICAgIAorICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB1c2luZyBoYXJkY29kZWQgJzAnIGhlcmUu
IFdlIHNob3VsZCBiZSBjbGVhcmluZyBhbGwgYW5pbWF0aW9ucy4gRm9yIG5vdyB0aGVyZSBpcyBv
bmx5IDEuCisgICAgICAgICAgICAgICAgU3RyaW5nIGFuaW1OYW1lID0ga2V5UGF0aCArICJfMCI7
CisgICAgICAgICAgICAgICAgW2FuaW1hdGVkTGF5ZXIoQW5pbWF0ZWRQcm9wZXJ0eU9wYWNpdHkp
IHJlbW92ZUFuaW1hdGlvbkZvcktleTphbmltTmFtZV07CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgICAgIH0gZWxzZSB7CisgICAgICAg
ICAgICAvLyBXZSBoYXZlIGFuIGFuaW1hdGlvbiwgc28gZG9uJ3Qgc2V0IHRoZSBvcGFjaXR5IGRp
cmVjdGx5LgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNl
IHsKKyAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2Uga25vdyB3ZSBoYXZlIGEgdHJhbnNpdGlv
bi4gQnV0IGlmIGl0IGlzIHRoZSBzYW1lIGFuZAorICAgICAgICAvLyB0aGUgb3BhY2l0eSB2YWx1
ZSBoYXMgbm90IGNoYW5nZWQsIGRvbid0IGRvIGFueXRoaW5nLgorICAgICAgICBpZiAoIW9wYWNp
dGllc0RpZmZlciAmJgorICAgICAgICAgICAgICAgICgoYW5pbUluZGV4ID09IC0xKSB8fCAgICAK
KyAgICAgICAgICAgICAgICAgKG1fYW5pbWF0aW9uc1thbmltSW5kZXhdLmlzVHJhbnNpdGlvbiAm
JiAqKG1fYW5pbWF0aW9uc1thbmltSW5kZXhdLmFuaW1MYXllcikgPT0gKnRyYW5zaXRpb24pKSkg
eworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIAorICAg
IC8vIElmIGFuIGFuaW1hdGlvbiBpcyBydW5uaW5nLCBpZ25vcmUgdGhpcyB0cmFuc2l0aW9uLCBi
dXQgc3RpbGwgc2F2ZSB0aGUgdmFsdWUuCisgICAgaWYgKGFuaW1JbmRleCA+PSAwICYmICFtX2Fu
aW1hdGlvbnNbYW5pbUluZGV4XS5pc1RyYW5zaXRpb24pCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIGJvb2wgZGlkQW5pbWF0ZSA9IGZhbHNlOworICAgIAorICAgIEJFR0lOX0JMT0NLX09C
SkNfRVhDRVBUSU9OUworICAgIAorICAgIE5TTnVtYmVyKiBmcm9tT3BhY2l0eVZhbHVlID0gbmls
OworICAgIE5TTnVtYmVyKiB0b09wYWNpdHlWYWx1ZSA9IFtOU051bWJlciBudW1iZXJXaXRoRmxv
YXQ6b3BhY2l0eV07CisgICAgCisgICAgaWYgKHRyYW5zaXRpb24gJiYgIXRyYW5zaXRpb24tPmlz
RW1wdHlPclplcm9EdXJhdGlvbigpKSB7CisgICAgICAgIENBTGF5ZXIqIHByZXNMYXllciA9IGdl
dFByZXNlbnRhdGlvbkxheWVyKHByaW1hcnlMYXllcigpKTsKKyAgICAgICAgZmxvYXQgZnJvbU9w
YWNpdHkgPSBbcHJlc0xheWVyIG9wYWNpdHldOworICAgICAgICBmcm9tT3BhY2l0eVZhbHVlID0g
W05TTnVtYmVyIG51bWJlcldpdGhGbG9hdDpmcm9tT3BhY2l0eV07CisgICAgICAgIHNldEJhc2lj
QW5pbWF0aW9uKEFuaW1hdGVkUHJvcGVydHlPcGFjaXR5LCAiIiwgMCwgZnJvbU9wYWNpdHlWYWx1
ZSwgdG9PcGFjaXR5VmFsdWUsIHRydWUsIHRyYW5zaXRpb24sIGJlZ2luVGltZSk7CisgICAgICAg
IGRpZEFuaW1hdGUgPSB0cnVlOworICAgIH0KKworICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElP
TlMKKyAgICAKKyAgICByZXR1cm4gZGlkQW5pbWF0ZTsKK30KKwordm9pZCBHcmFwaGljc0xheWVy
Q0E6OnNldE5lZWRzRGlzcGxheSgpCit7CisgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05T
CisgICAgCisgICAgaWYgKGRyYXdzQ29udGVudCgpKQorICAgICAgICBbbV9sYXllci5nZXQoKSBz
ZXROZWVkc0Rpc3BsYXldOworCisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUworfQorCit2
b2lkIEdyYXBoaWNzTGF5ZXJDQTo6c2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IEZsb2F0UmVj
dCYgcmVjdCkKK3sKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICAKKyAgICBp
ZiAoZHJhd3NDb250ZW50KCkpCisgICAgICAgIFttX2xheWVyLmdldCgpIHNldE5lZWRzRGlzcGxh
eUluUmVjdDpyZWN0XTsKKworICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKK30KKworCiti
b29sIEdyYXBoaWNzTGF5ZXJDQTo6YW5pbWF0ZVRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1WYWx1
ZUxpc3QmIHZhbHVlcywgY29uc3QgSW50U2l6ZSYgc2l6ZSwgY29uc3QgQW5pbWF0aW9uKiBhbmlt
LCBkb3VibGUgYmVnaW5UaW1lLCBib29sIGlzVHJhbnNpdGlvbikKK3sKKyAgICBpZiAoIWFuaW0g
fHwgYW5pbS0+aXNFbXB0eU9yWmVyb0R1cmF0aW9uKCkgfHwgdmFsdWVzLnNpemUoKSA8IDIpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgCisgICAgVHJhbnNmb3JtVmFsdWVMaXN0OjpG
dW5jdGlvbkxpc3QgZnVuY3Rpb25MaXN0OworICAgIGJvb2wgaXNWYWxpZCwgaGFzQmlnUm90YXRp
b247CisgICAgdmFsdWVzLm1ha2VGdW5jdGlvbkxpc3QoZnVuY3Rpb25MaXN0LCBpc1ZhbGlkLCBo
YXNCaWdSb3RhdGlvbik7CisgICAgCisgICAgLy8gUnVsZXMgZm9yIGFuaW1hdGlvbjoKKyAgICAv
LworICAgIC8vICAxKSAgSWYgZnVuY3Rpb25MaXN0IGlzIGVtcHR5IG9yIHdlIGRvbid0IGhhdmUg
YSBiaWcgcm90YXRpb24sIHdlIGRvIGEgbWF0cml4IGFuaW1hdGlvbi4gV2UgY291bGQKKyAgICAv
LyAgICAgIHVzZSBjb21wb25lbnQgYW5pbWF0aW9uIGZvciBsaXN0cyB3aXRob3V0IGEgYmlnIHJv
dGF0aW9uLCBidXQgdGhlcmUgaXMgbm8gbmVlZCB0bywgYW5kIHRoaXMKKyAgICAvLyAgICAgIGlz
IG1vcmUgZWZmaWNpZW50LgorICAgIC8vCisgICAgLy8gIDIpICBPdGhlcndpc2Ugd2UgZG8gYSBj
b21wb25lbnQgaGFyZHdhcmUgYW5pbWF0aW9uLgorICAgIGJvb2wgaXNNYXRyaXhBbmltYXRpb24g
PSAhaXNWYWxpZCB8fCAhaGFzQmlnUm90YXRpb247CisgICAgICAgIAorICAgIC8vIFNldCB0cmFu
c2Zvcm0gdG8gaWRlbnRpdHkgc2luY2Ugd2UgYXJlIGFuaW1hdGluZyBjb21wb25lbnRzIGFuZCB3
ZSBuZWVkIHRoZSBiYXNlCisgICAgLy8gdG8gYmUgdGhlIGlkZW50aXR5IHRyYW5zZm9ybS4KKyAg
ICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0
OworICAgIENBVHJhbnNmb3JtM0QgdG9UM0Q7CisgICAgY29weVRyYW5zZm9ybSh0b1QzRCwgdCk7
CisgICAgW3ByaW1hcnlMYXllcigpIHNldFRyYW5zZm9ybTp0b1QzRF07CisgICAgRU5EX0JMT0NL
X09CSkNfRVhDRVBUSU9OUworICAgICAgICAKKyAgICBib29sIGlzS2V5ZnJhbWUgPSB2YWx1ZXMu
c2l6ZSgpID4gMjsKKyAgICAgICAgCisgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisg
ICAgCisgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSB0cmFuc2Zvcm0gZnVuY3Rpb25zLCBzZW5k
aW5nIGFuIGFuaW1hdGlvbiBmb3IgZWFjaCBvbmUuCisgICAgZm9yIChpbnQgZnVuY3Rpb25JbmRl
eCA9IDA7IDsgKytmdW5jdGlvbkluZGV4KSB7CisgICAgICAgIGlmIChmdW5jdGlvbkluZGV4ID49
IHN0YXRpY19jYXN0PGludD4oZnVuY3Rpb25MaXN0LnNpemUoKSkgJiYgIWlzTWF0cml4QW5pbWF0
aW9uKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgVHJhbnNmb3Jt
T3BlcmF0aW9uOjpPcGVyYXRpb25UeXBlIG9wVHlwZSA9IAorI2lmIEVOQUJMRSgzRF9UUkFOU0ZP
Uk1TKQorICAgICAgICAgICAgaXNNYXRyaXhBbmltYXRpb24gPyBUcmFuc2Zvcm1PcGVyYXRpb246
Ok1BVFJJWF8zRCA6IGZ1bmN0aW9uTGlzdFtmdW5jdGlvbkluZGV4XTsKKyNlbHNlCisgICAgICAg
ICAgICBpc01hdHJpeEFuaW1hdGlvbiA/IFRyYW5zZm9ybU9wZXJhdGlvbjo6TUFUUklYIDogZnVu
Y3Rpb25MaXN0W2Z1bmN0aW9uSW5kZXhdOworI2VuZGlmICAgICAgICAKKworICAgICAgICBpZiAo
aXNLZXlmcmFtZSkgeworICAgICAgICAgICAgTlNNdXRhYmxlQXJyYXkqIHRpbWVzQXJyYXkgPSBb
W05TTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0XTsKKyAgICAgICAgICAgIE5TTXV0YWJsZUFycmF5
KiB2YWxBcnJheSA9IFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRdOworICAgICAgICAgICAg
TlNNdXRhYmxlQXJyYXkqIHRmQXJyYXkgPSBbW05TTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0XTsK
KyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBrZXlmcmFt
ZXMsIGJ1aWxkaW5nIGFycmF5cyBmb3IgdGhlIGFuaW1hdGlvbi4KKyAgICAgICAgICAgIGZvciAo
VHJhbnNmb3JtVmFsdWVMaXN0Ojpjb25zdF9pdGVyYXRvciBpdCA9IHZhbHVlcy5iZWdpbigpOyBp
dCAhPSB2YWx1ZXMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBUcmFuc2Zv
cm1WYWx1ZSYgY3VyVmFsdWUgPSAoKml0KTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAg
ICAgICAvLyBmaWxsIGluIHRoZSBrZXkgdGltZSBhbmQgdGltaW5nIGZ1bmN0aW9uCisgICAgICAg
ICAgICAgICAgW3RpbWVzQXJyYXkgYWRkT2JqZWN0OltOU051bWJlciBudW1iZXJXaXRoRmxvYXQ6
Y3VyVmFsdWUua2V5KCldXTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjb25z
dCBUaW1pbmdGdW5jdGlvbiogdGYgPSAwOworICAgICAgICAgICAgICAgIGlmIChjdXJWYWx1ZS50
aW1pbmdGdW5jdGlvbigpKQorICAgICAgICAgICAgICAgICAgICB0ZiA9IGN1clZhbHVlLnRpbWlu
Z0Z1bmN0aW9uKCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYW5pbS0+aXNUaW1pbmdGdW5j
dGlvblNldCgpKQorICAgICAgICAgICAgICAgICAgICB0ZiA9ICZhbmltLT50aW1pbmdGdW5jdGlv
bigpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICghdGYgfHwgdGYtPnR5
cGUoKSAhPSBDdWJpY0JlemllclRpbWluZ0Z1bmN0aW9uKQorICAgICAgICAgICAgICAgICAgICBb
dGZBcnJheSBhZGRPYmplY3Q6W0NBTWVkaWFUaW1pbmdGdW5jdGlvbiBmdW5jdGlvbldpdGhOYW1l
OkAibGluZWFyIl1dOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAg
W3RmQXJyYXkgYWRkT2JqZWN0OltDQU1lZGlhVGltaW5nRnVuY3Rpb24gZnVuY3Rpb25XaXRoQ29u
dHJvbFBvaW50czoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpdGYtPngxKCk6
KGZsb2F0KXRmLT55MSgpOihmbG9hdCl0Zi0+eDIoKTooZmxvYXQpdGYtPnkyKCldXTsKKyAgICAg
ICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBmaWxsIGluIHRoZSBmdW5jdGlvbgorICAg
ICAgICAgICAgICAgIGlmIChpc01hdHJpeEFuaW1hdGlvbikgeworICAgICAgICAgICAgICAgICAg
ICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0OworICAgICAgICAgICAgICAgICAgICBjdXJWYWx1ZS52
YWx1ZSgpLT5hcHBseShzaXplLCB0KTsKKyAgICAgICAgICAgICAgICAgICAgQ0FUcmFuc2Zvcm0z
RCBjYXQ7CisgICAgICAgICAgICAgICAgICAgIGNvcHlUcmFuc2Zvcm0oY2F0LCB0KTsKKyAgICAg
ICAgICAgICAgICAgICAgW3ZhbEFycmF5IGFkZE9iamVjdDpbTlNWYWx1ZSB2YWx1ZVdpdGhDQVRy
YW5zZm9ybTNEOmNhdF1dOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAg
ICAgICBbdmFsQXJyYXkgYWRkT2JqZWN0OmNyZWF0ZVRyYW5zZm9ybUZ1bmN0aW9uVmFsdWUoY3Vy
VmFsdWUsIGZ1bmN0aW9uSW5kZXgsIHNpemUsIG9wVHlwZSldOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgCisgICAgICAgICAgICAvLyBXZSB0b3NzIHRoZSBsYXN0IHRmQXJyYXkgdmFsdWUg
YmVjYXVzZSBpdCBoYXMgdG8gb25lIHNob3J0ZXIgdGhhbiB0aGUgb3RoZXJzLgorICAgICAgICAg
ICAgW3RmQXJyYXkgcmVtb3ZlTGFzdE9iamVjdF07CisgICAgICAgICAgICAKKyAgICAgICAgICAg
IHNldEtleWZyYW1lQW5pbWF0aW9uKEFuaW1hdGVkUHJvcGVydHlXZWJraXRUcmFuc2Zvcm0sIGdl
dEFuaW1hdGlvblZhbHVlRnVuY3Rpb24ob3BUeXBlKSwgZnVuY3Rpb25JbmRleCwgdGltZXNBcnJh
eSwgdmFsQXJyYXksIHRmQXJyYXksIGlzVHJhbnNpdGlvbiwgYW5pbSwgYmVnaW5UaW1lKTsKKyAg
ICAgICAgICAgIAorICAgICAgICAgICAgW3RpbWVzQXJyYXkgcmVsZWFzZV07CisgICAgICAgICAg
ICBbdmFsQXJyYXkgcmVsZWFzZV07CisgICAgICAgICAgICBbdGZBcnJheSByZWxlYXNlXTsKKyAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIElzIGEgdHJhbnNpdGlvbgorICAgICAgICAg
ICAgaWQgZnJvbVZhbHVlLCB0b1ZhbHVlOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAo
aXNNYXRyaXhBbmltYXRpb24pIHsKKyAgICAgICAgICAgICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCBmcm9tdCwgdG90OworICAgICAgICAgICAgICAgIHZhbHVlc1swXS52YWx1ZSgpLT5hcHBseShz
aXplLCBmcm9tdCk7CisgICAgICAgICAgICAgICAgdmFsdWVzWzFdLnZhbHVlKCktPmFwcGx5KHNp
emUsIHRvdCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQ0FUcmFuc2Zvcm0z
RCBjYXQ7CisgICAgICAgICAgICAgICAgY29weVRyYW5zZm9ybShjYXQsIGZyb210KTsKKyAgICAg
ICAgICAgICAgICBmcm9tVmFsdWUgPSBbTlNWYWx1ZSB2YWx1ZVdpdGhDQVRyYW5zZm9ybTNEOmNh
dF07CisgICAgICAgICAgICAgICAgY29weVRyYW5zZm9ybShjYXQsIHRvdCk7CisgICAgICAgICAg
ICAgICAgdG9WYWx1ZSA9IFtOU1ZhbHVlIHZhbHVlV2l0aENBVHJhbnNmb3JtM0Q6Y2F0XTsKKyAg
ICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZnJvbVZhbHVlID0gY3JlYXRlVHJh
bnNmb3JtRnVuY3Rpb25WYWx1ZSh2YWx1ZXNbMF0sIGZ1bmN0aW9uSW5kZXgsIHNpemUsIG9wVHlw
ZSk7CisgICAgICAgICAgICAgICAgdG9WYWx1ZSA9IGNyZWF0ZVRyYW5zZm9ybUZ1bmN0aW9uVmFs
dWUodmFsdWVzWzFdLCBmdW5jdGlvbkluZGV4LCBzaXplLCBvcFR5cGUpOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgCisgICAgICAgICAgICBzZXRCYXNpY0FuaW1hdGlvbihBbmltYXRlZFBy
b3BlcnR5V2Via2l0VHJhbnNmb3JtLCBnZXRBbmltYXRpb25WYWx1ZUZ1bmN0aW9uKG9wVHlwZSks
IGZ1bmN0aW9uSW5kZXgsIGZyb21WYWx1ZSwgdG9WYWx1ZSwgaXNUcmFuc2l0aW9uLCBhbmltLCBi
ZWdpblRpbWUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoaXNNYXRyaXhBbmlt
YXRpb24pCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBFTkRfQkxPQ0tfT0JKQ19F
WENFUFRJT05TCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wKK0dyYXBoaWNzTGF5ZXJDQTo6
YW5pbWF0ZUZsb2F0KEFuaW1hdGVkUHJvcGVydHlJRCBwcm9wZXJ0eSwgY29uc3QgRmxvYXRWYWx1
ZUxpc3QmIHZhbHVlcywgY29uc3QgQW5pbWF0aW9uKiBhbmltYXRpb24sIGRvdWJsZSBiZWdpblRp
bWUpCit7CisgICAgaWYgKHZhbHVlcy5zaXplKCkgPCAyKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgIAorICAgIC8vIGlmIHRoZXJlIGlzIGFscmVhZHkgaXMgYW4gYW5pbWF0aW9uIGZv
ciB0aGlzIHByb3BlcnR5IGFuZCBpdCBoYXNuJ3QgY2hhbmdlZCwgaWdub3JlIGl0LgorICAgIGlu
dCBpID0gZmluZEFuaW1hdGlvbkVudHJ5KHByb3BlcnR5LCAwKTsKKyAgICBpZiAoaSA+PSAwICYm
ICptX2FuaW1hdGlvbnNbaV0uYW5pbUxheWVyID09ICphbmltYXRpb24pIHsKKyAgICAgICAgbV9h
bmltYXRpb25zW2ldLmlzQ3VycmVudCA9IHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICB9CisKKyAgICBpZiAodmFsdWVzLnNpemUoKSA9PSAyKSB7CisgICAgICAgIGZsb2F0IGZyb21W
YWwgPSB2YWx1ZXNbMF0udmFsdWUoKTsKKyAgICAgICAgZmxvYXQgdG9WYWwgICA9IHZhbHVlc1sx
XS52YWx1ZSgpOworICAgICAgICBpZiAoaXNuYW4odG9WYWwpICYmIGlzbmFuKGZyb21WYWwpKQor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgICAgICAvLyBpbml0aWFsaXplIHRo
ZSBwcm9wZXJ0eSB0byAwCisgICAgICAgIFthbmltYXRlZExheWVyKHByb3BlcnR5KSBzZXRWYWx1
ZTogMCBmb3JLZXlQYXRoOnByb3BlcnR5SWRUb1N0cmluZyhwcm9wZXJ0eSldOworICAgICAgICBz
ZXRCYXNpY0FuaW1hdGlvbihwcm9wZXJ0eSwgIiIsIDAsIAorICAgICAgICAgICAgICAgICAgICAg
ICAgICBpc25hbihmcm9tVmFsKSA/IG5pbCA6IFtOU051bWJlciBudW1iZXJXaXRoRmxvYXQ6ZnJv
bVZhbF0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICBpc25hbih0b1ZhbCkgPyAgIG5pbCA6
IFtOU051bWJlciBudW1iZXJXaXRoRmxvYXQ6dG9WYWxdLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICBmYWxzZSwgYW5pbWF0aW9uLCBiZWdpblRpbWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICB9CisKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICAKKyAgICBOU011
dGFibGVBcnJheSogdGltZXNBcnJheSAgPSBbW05TTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0XTsK
KyAgICBOU011dGFibGVBcnJheSogdmFsQXJyYXkgICAgPSBbW05TTXV0YWJsZUFycmF5IGFsbG9j
XSBpbml0XTsKKyAgICBOU011dGFibGVBcnJheSogdGZBcnJheSAgICAgPSBbW05TTXV0YWJsZUFy
cmF5IGFsbG9jXSBpbml0XTsKKworICAgIGZvciAoRmxvYXRWYWx1ZUxpc3Q6OmNvbnN0X2l0ZXJh
dG9yIGl0ID0gdmFsdWVzLmJlZ2luKCk7IGl0ICE9IHZhbHVlcy5lbmQoKTsgKytpdCkgeworICAg
ICAgICBjb25zdCBGbG9hdFZhbHVlJiBjdXJWYWx1ZSA9ICgqaXQpOworICAgICAgICBbdGltZXNB
cnJheSBhZGRPYmplY3Q6IFtOU051bWJlciBudW1iZXJXaXRoRmxvYXQ6Y3VyVmFsdWUua2V5KCld
XTsKKyAgICAgICAgW3ZhbEFycmF5IGFkZE9iamVjdDogW05TTnVtYmVyIG51bWJlcldpdGhGbG9h
dDpjdXJWYWx1ZS52YWx1ZSgpXV07CisKKyAgICAgICAgY29uc3QgVGltaW5nRnVuY3Rpb24qIHRm
ID0gMDsKKyAgICAgICAgaWYgKGN1clZhbHVlLnRpbWluZ0Z1bmN0aW9uKCkpCisgICAgICAgICAg
ICB0ZiA9IGN1clZhbHVlLnRpbWluZ0Z1bmN0aW9uKCk7CisgICAgICAgIGVsc2UgaWYgKGFuaW1h
dGlvbi0+aXNUaW1pbmdGdW5jdGlvblNldCgpKQorICAgICAgICAgICAgdGYgPSAmYW5pbWF0aW9u
LT50aW1pbmdGdW5jdGlvbigpOworICAgICAgICAKKyAgICAgICAgaWYgKCF0ZikKKyAgICAgICAg
ICAgIFt0ZkFycmF5IGFkZE9iamVjdDogW0NBTWVkaWFUaW1pbmdGdW5jdGlvbiBmdW5jdGlvbldp
dGhDb250cm9sUG9pbnRzOjAuMjVmOjAuMWY6MC4yNWY6MS4wZl1dOworICAgICAgICBlbHNlIGlm
ICh0Zi0+dHlwZSgpID09IExpbmVhclRpbWluZ0Z1bmN0aW9uKQorICAgICAgICAgICAgW3RmQXJy
YXkgYWRkT2JqZWN0OltDQU1lZGlhVGltaW5nRnVuY3Rpb24gZnVuY3Rpb25XaXRoTmFtZTpAImxp
bmVhciJdXTsKKyAgICAgICAgZWxzZSBpZiAodGYtPnR5cGUoKSA9PSBDdWJpY0JlemllclRpbWlu
Z0Z1bmN0aW9uKQorICAgICAgICAgICAgIFt0ZkFycmF5IGFkZE9iamVjdDpbQ0FNZWRpYVRpbWlu
Z0Z1bmN0aW9uIGZ1bmN0aW9uV2l0aENvbnRyb2xQb2ludHM6CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCl0Zi0+eDEoKTooZmxvYXQpdGYtPnkxKCk6
KGZsb2F0KXRmLT54MigpOihmbG9hdCl0Zi0+eTIoKV1dOworICAgIH0KKyAgICAKKyAgICAvLyBX
ZSB0b3NzIHRoZSBsYXN0IHRmQXJyYXkgdmFsdWUgYmVjYXVzZSBpdCBoYXMgdG8gb25lIHNob3J0
ZXIgdGhhbiB0aGUgb3RoZXJzLgorICAgIFt0ZkFycmF5IHJlbW92ZUxhc3RPYmplY3RdOworICAg
IAorICAgIC8vIEluaXRpYWxpemUgdGhlIHByb3BlcnR5IHRvIDAuCisgICAgW2FuaW1hdGVkTGF5
ZXIocHJvcGVydHkpIHNldFZhbHVlOjAgZm9yS2V5UGF0aDpwcm9wZXJ0eUlkVG9TdHJpbmcocHJv
cGVydHkpXTsKKyAgICAvLyBUaGVuIHNldCB0aGUgYW5pbWF0aW9uLgorICAgIHNldEtleWZyYW1l
QW5pbWF0aW9uKHByb3BlcnR5LCAiIiwgMCwgdGltZXNBcnJheSwgdmFsQXJyYXksIHRmQXJyYXks
IGZhbHNlLCBhbmltYXRpb24sIGJlZ2luVGltZSk7CisKKyAgICBbdGltZXNBcnJheSByZWxlYXNl
XTsKKyAgICBbdmFsQXJyYXkgcmVsZWFzZV07CisgICAgW3RmQXJyYXkgcmVsZWFzZV07CisKKyAg
ICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQg
R3JhcGhpY3NMYXllckNBOjpzZXRDb250ZW50c1RvSW1hZ2UoSW1hZ2UqIGltYWdlKQoreworICAg
IGlmIChpbWFnZSkgeworICAgICAgICBzZXRIYXNDb250ZW50c0xheWVyKHRydWUpOworCisgICAg
ICAgIC8vIEZJWE1FOiBpcyBpbWFnZSBmbGlwcGluZyByZWFsbHkgYSBwcm9wZXJ0eSBvZiB0aGUg
Z3JhcGhpY3MgY29udGV4dD8KKyAgICAgICAgYm9vbCBuZWVkVG9GbGlwID0gR3JhcGhpY3NMYXll
cjo6Z3JhcGhpY3NDb250ZXh0c0ZsaXBwZWQoKTsKKyAgICAgICAgQ0dQb2ludCBhbmNob3JQb2lu
dCA9IG5lZWRUb0ZsaXAgPyBDR1BvaW50TWFrZSgwLjBmLCAxLjBmKSA6IENHUG9pbnRNYWtlKDAu
MGYsIDAuMGYpOworCisgICAgICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgICAg
ICB7CisgICAgICAgICAgICBDR0ltYWdlUmVmIHRoZUltYWdlID0gaW1hZ2UtPm5hdGl2ZUltYWdl
Rm9yQ3VycmVudEZyYW1lKCk7CisgICAgICAgICAgICAvLyBGSVhNRTogbWF5YmUgb25seSBkbyB0
cmlsaW5lYXIgaWYgdGhlIGltYWdlIGlzIGJlaW5nIHNjYWxlZCBkb3duLAorICAgICAgICAgICAg
Ly8gYnV0IHRoZW4gd2hhdCBpZiB0aGUgbGF5ZXIgc2l6ZSBjaGFuZ2VzPworI2lmICFkZWZpbmVk
KEJVSUxESU5HX09OX1RJR0VSKSAmJiAhZGVmaW5lZChCVUlMRElOR19PTl9MRU9QQVJEKQorICAg
ICAgICAgICAgW21fY29udGVudHNMYXllci5nZXQoKSBzZXRNaW5pZmljYXRpb25GaWx0ZXI6a0NB
RmlsdGVyVHJpbGluZWFyXTsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKG5lZWRUb0ZsaXApIHsK
KyAgICAgICAgICAgICAgICBDQVRyYW5zZm9ybTNEIGZsaXBwZXIgPSB7CisgICAgICAgICAgICAg
ICAgICAgIDEuMGYsIDAuMGYsIDAuMGYsIDAuMGYsCisgICAgICAgICAgICAgICAgICAgIDAuMGYs
IC0xLjBmLCAwLjBmLCAwLjBmLAorICAgICAgICAgICAgICAgICAgICAwLjBmLCAwLjBmLCAxLjBm
LCAwLjBmLAorICAgICAgICAgICAgICAgICAgICAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmfTsKKyAg
ICAgICAgICAgICAgICBbbV9jb250ZW50c0xheWVyLmdldCgpIHNldFRyYW5zZm9ybTpmbGlwcGVy
XTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgW21fY29udGVudHNMYXllci5nZXQoKSBz
ZXRBbmNob3JQb2ludDphbmNob3JQb2ludF07CisgICAgICAgICAgICBbbV9jb250ZW50c0xheWVy
LmdldCgpIHNldENvbnRlbnRzOihpZCl0aGVJbWFnZV07CisgICAgICAgIH0KKyAgICAgICAgRU5E
X0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgIH0gZWxzZQorICAgICAgICBzZXRIYXNDb250ZW50
c0xheWVyKGZhbHNlKTsKKworICAgIG1fY29udGVudExheWVyRm9ySW1hZ2VPclZpZGVvID0gKGlt
YWdlICE9IDApOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6c2V0Q29udGVudHNUb1ZpZGVv
KFBsYXRmb3JtTGF5ZXIqIHZpZGVvTGF5ZXIpCit7CisgICAgc2V0Q29udGVudHNMYXllcih2aWRl
b0xheWVyKTsKKyAgICBtX2NvbnRlbnRMYXllckZvckltYWdlT3JWaWRlbyA9ICh2aWRlb0xheWVy
ICE9IDApOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6Y2xlYXJDb250ZW50cygpCit7Cisg
ICAgaWYgKG1fY29udGVudExheWVyRm9ySW1hZ2VPclZpZGVvKSB7CisgICAgICAgIHNldEhhc0Nv
bnRlbnRzTGF5ZXIoZmFsc2UpOworICAgICAgICBtX2NvbnRlbnRMYXllckZvckltYWdlT3JWaWRl
byA9IGZhbHNlOworICAgIH0KK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0E6OnVwZGF0ZUNvbnRl
bnRzUmVjdCgpCit7CisgICAgaWYgKG1fY2xpZW50ICYmIG1fY29udGVudHNMYXllcikgeworICAg
ICAgICBJbnRSZWN0ICBjb250ZW50UmVjdCA9IG1fY2xpZW50LT5jb250ZW50c0JveCh0aGlzKTsK
KyAgICAgICAgCisgICAgICAgIENHUG9pbnQgcG9pbnQgPSBDR1BvaW50TWFrZShjb250ZW50UmVj
dC54KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50UmVjdC55
KCkpOworICAgICAgICBDR1JlY3QgcmVjdCA9IENHUmVjdE1ha2UoMC4wZiwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIDAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjb250ZW50UmVjdC53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY29udGVudFJlY3QuaGVpZ2h0KCkpOworCisgICAgICAgIEJFR0lOX0JMT0NLX09CSkNfRVhD
RVBUSU9OUworICAgICAgICBbbV9jb250ZW50c0xheWVyLmdldCgpIHNldFBvc2l0aW9uOnBvaW50
XTsKKyAgICAgICAgW21fY29udGVudHNMYXllci5nZXQoKSBzZXRCb3VuZHM6cmVjdF07CisgICAg
ICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICB9Cit9CisKK3ZvaWQKK0dyYXBoaWNz
TGF5ZXJDQTo6c2V0QmFzaWNBbmltYXRpb24oQW5pbWF0ZWRQcm9wZXJ0eUlEIHByb3BlcnR5LCBj
b25zdCBTdHJpbmcmIHZhbHVlRnVuY3Rpb24sIHNob3J0IGluZGV4LCB2b2lkKiBmcm9tVmFsLCB2
b2lkKiB0b1ZhbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1RyYW5zaXRp
b24sIGNvbnN0IEFuaW1hdGlvbiogdHJhbnNpdGlvbiwgZG91YmxlIGJlZ2luVGltZSkKK3sKKyAg
ICBpZiAoIWZyb21WYWwgJiYgIXRvVmFsKQorICAgICAgICByZXR1cm47CisKKyAgICBXS0xheWVy
KiBsYXllciA9IGFuaW1hdGVkTGF5ZXIocHJvcGVydHkpOworICAgIAorICAgIEJFR0lOX0JMT0NL
X09CSkNfRVhDRVBUSU9OUworCisgICAgLy8gYWRkIGFuIGVudHJ5IGZvciB0aGlzIGFuaW1hdGlv
bgorICAgIGJvb2wgaXNSdW5uaW5nID0gYWRkQW5pbWF0aW9uRW50cnkocHJvcGVydHksIGluZGV4
LCBiZWdpblRpbWUsIGlzVHJhbnNpdGlvbiwgdHJhbnNpdGlvbik7CisKKyAgICBTdHJpbmcga2V5
UGF0aCA9IHByb3BlcnR5SWRUb1N0cmluZyhwcm9wZXJ0eSk7CisgICAgU3RyaW5nIGFuaW1OYW1l
ID0ga2V5UGF0aCArICJfIiArIFN0cmluZzo6bnVtYmVyKGluZGV4KTsKKworICAgIGlmIChpc1J1
bm5pbmcpIHsKKyAgICAgICAgQ0FCYXNpY0FuaW1hdGlvbiAqYW5pbSA9IFtDQUJhc2ljQW5pbWF0
aW9uIGFuaW1hdGlvbldpdGhLZXlQYXRoOmtleVBhdGhdOworICAgICAgICAKKyAgICAgICAgLy8g
SWYgd2Ugc2VuZCBhIGR1cmF0aW9uIG9mIDAgdG8gQ0EsIHRoZW4gaXQgd2lsbCB1c2UgdGhlIGRl
ZmF1bHQgZHVyYXRpb24KKyAgICAgICAgLy8gb2YgMjUwbXMuIFNvIHNlbmQgYSB2ZXJ5IHNtYWxs
IHZhbHVlIGluc3RlYWQuCisgICAgICAgIGRvdWJsZSBkdXJhdGlvbiA9IHRyYW5zaXRpb24tPmR1
cmF0aW9uKCk7CisgICAgICAgIGlmIChkdXJhdGlvbiA8PSAwKQorICAgICAgICAgICAgZHVyYXRp
b24gPSAxZS0zOworICAgICAgICAgICAgCisgICAgICAgIGZsb2F0IHJlcGVhdENvdW50ID0gdHJh
bnNpdGlvbi0+aXRlcmF0aW9uQ291bnQoKTsKKyAgICAgICAgaWYgKHJlcGVhdENvdW50IDwgMCkK
KyAgICAgICAgICAgIHJlcGVhdENvdW50ID0gRkxUX01BWDsKKyAgICAgICAgZWxzZSBpZiAodHJh
bnNpdGlvbi0+ZGlyZWN0aW9uKCkpCisgICAgICAgICAgICByZXBlYXRDb3VudCAvPSAyOworICAg
ICAgICAgICAgCisgICAgICAgIFthbmltIHNldER1cmF0aW9uOmR1cmF0aW9uXTsKKyAgICAgICAg
W2FuaW0gc2V0UmVwZWF0Q291bnQ6cmVwZWF0Q291bnRdOworICAgICAgICBbYW5pbSBzZXRBdXRv
cmV2ZXJzZXM6dHJhbnNpdGlvbi0+ZGlyZWN0aW9uKCldOworICAgICAgICBbYW5pbSBzZXRSZW1v
dmVkT25Db21wbGV0aW9uOk5PXTsKKworICAgICAgICAvLyBOb3RlIHRoYXQgY3VycmVudGx5IHRy
YW5zZm9ybSBpcyB0aGUgb25seSBwcm9wZXJ0eSB3aGljaCBoYXMgYW5pbWF0aW9ucworICAgICAg
ICAvLyB3aXRoIGFuIGluZGV4ID4gMC4KKyAgICAgICAgLy8gVE9ETzogY3VycmVudGx5IHdlIGRv
bid0IGhhdmUgYW55IGNvbXBvbmVudCBhbmltYXRpb25zIGZvciBtb3JlIHRoYW4gb25lCisgICAg
ICAgIC8vIGZ1bmN0aW9uLiBTbyBmb3Igbm93IHdlIHdpbGwgYWx3YXlzIHVzZSBhZGRpdGl2ZSBO
Ty4KKyAgICAgICAgW2FuaW0gc2V0QWRkaXRpdmU6KHByb3BlcnR5ID09IEFuaW1hdGVkUHJvcGVy
dHlXZWJraXRUcmFuc2Zvcm0pID8gWUVTIDogTk9dOworICAgICAgICBbYW5pbSBzZXRGaWxsTW9k
ZTpAImV4dGVuZGVkIl07CisgICAgICAgIFthbmltIHNldFZhbHVlRnVuY3Rpb246W0NBVmFsdWVG
dW5jdGlvbiBmdW5jdGlvbldpdGhOYW1lOnZhbHVlRnVuY3Rpb25dXTsKKyAgICAgICAgCisgICAg
ICAgIC8vIFNldCB0aGUgZGVsZWdhdGUgKGFuZCBwcm9wZXJ0eSB2YWx1ZSkuCisgICAgICAgIGlu
dCBwcm9wID0gaXNUcmFuc2l0aW9uID8gcHJvcGVydHkgOiBBbmltYXRlZFByb3BlcnR5SW52YWxp
ZDsKKyAgICAgICAgW2FuaW0gc2V0VmFsdWU6W05TTnVtYmVyIG51bWJlcldpdGhJbnQ6IHByb3Bd
IGZvcktleTprQW5pbWF0aW9uQ1NTUHJvcGVydHlLZXldOworICAgICAgICBbYW5pbSBzZXREZWxl
Z2F0ZTptX2FuaW1hdGlvbkRpZFN0YXJ0Q0IuZ2V0KCldOworCisgICAgICAgIE5TVGltZUludGVy
dmFsIGJ0ID0gYmVnaW5UaW1lID8gW2xheWVyIGNvbnZlcnRUaW1lOnVuaXhUaW1lVG9DQVRpbWUo
YmVnaW5UaW1lKSBmcm9tTGF5ZXI6bmlsXSA6IDA7CisgICAgICAgIFthbmltIHNldEJlZ2luVGlt
ZTpidF07CisgICAgICAgIAorICAgICAgICBpZiAoZnJvbVZhbCAhPSBuaWwpCisgICAgICAgICAg
ICBbYW5pbSBzZXRGcm9tVmFsdWU6KGlkKWZyb21WYWxdOworICAgICAgICBpZiAodG9WYWwgIT0g
bmlsKQorICAgICAgICAgICAgW2FuaW0gc2V0VG9WYWx1ZTooaWQpdG9WYWxdOworICAgICAgICAK
KyAgICAgICAgaWYgKHRyYW5zaXRpb24tPmlzVGltaW5nRnVuY3Rpb25TZXQoKSkgeworICAgICAg
ICAgICAgY29uc3QgVGltaW5nRnVuY3Rpb24mIHRmID0gdHJhbnNpdGlvbi0+dGltaW5nRnVuY3Rp
b24oKTsKKyAgICAgICAgICAgIGlmICh0Zi50eXBlKCkgPT0gTGluZWFyVGltaW5nRnVuY3Rpb24p
CisgICAgICAgICAgICAgICAgW2FuaW0gc2V0VGltaW5nRnVuY3Rpb246W0NBTWVkaWFUaW1pbmdG
dW5jdGlvbiBmdW5jdGlvbldpdGhOYW1lOkAibGluZWFyIl1dOworICAgICAgICAgICAgZWxzZSBp
ZiAodGYudHlwZSgpID09IEN1YmljQmV6aWVyVGltaW5nRnVuY3Rpb24pCisgICAgICAgICAgICAg
ICAgW2FuaW0gc2V0VGltaW5nRnVuY3Rpb246W0NBTWVkaWFUaW1pbmdGdW5jdGlvbiBmdW5jdGlv
bldpdGhDb250cm9sUG9pbnRzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCl0
Zi54MSgpOihmbG9hdCl0Zi55MSgpOihmbG9hdCl0Zi54MigpOihmbG9hdCl0Zi55MigpXV07Cisg
ICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgW2FuaW0gc2V0VGltaW5nRnVuY3Rp
b246W0NBTWVkaWFUaW1pbmdGdW5jdGlvbiBmdW5jdGlvbldpdGhDb250cm9sUG9pbnRzOjAuMjVm
OjAuMWY6MC4yNWY6MS4wZl1dOworCisgICAgICAgIC8vIFNlbmQgb3ZlciB0aGUgYW5pbWF0aW9u
LgorICAgICAgICBbbGF5ZXIgcmVtb3ZlQW5pbWF0aW9uRm9yS2V5OmFuaW1OYW1lXTsKKyAgICAg
ICAgW2xheWVyIGFkZEFuaW1hdGlvbjphbmltIGZvcktleTphbmltTmFtZV07CisgICAgfSBlbHNl
IHsKKyAgICAgICAgLy8gUHVsbCB0aGUgY3VycmVudCBwcmVzZW50YXRpb24gdmFsdWUgaW50byB0
aGUgY3VycmVudCB2YWx1ZS4KKyAgICAgICAgQ0FMYXllciogcHJlc0xheWVyID0gW2xheWVyIHBy
ZXNlbnRhdGlvbkxheWVyXTsKKyAgICAgICAgaWYgKHByZXNMYXllcikKKyAgICAgICAgICAgIFts
YXllciBzZXRWYWx1ZTogW3ByZXNMYXllciB2YWx1ZUZvcktleVBhdGg6a2V5UGF0aF0gZm9yS2V5
UGF0aDprZXlQYXRoXTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgbm8gYW5pbWF0aW9uIGlzIHJ1
bm5pbmcuCisgICAgICAgIFtsYXllciByZW1vdmVBbmltYXRpb25Gb3JLZXk6YW5pbU5hbWVdOwor
ICAgIH0KKyAgICAKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCit9CisKK3ZvaWQKK0dy
YXBoaWNzTGF5ZXJDQTo6c2V0S2V5ZnJhbWVBbmltYXRpb24oQW5pbWF0ZWRQcm9wZXJ0eUlEIHBy
b3BlcnR5LCBjb25zdCBTdHJpbmcmIHZhbHVlRnVuY3Rpb24sIHNob3J0IGluZGV4LCB2b2lkKiBr
ZXlzLCB2b2lkKiB2YWx1ZXMsIHZvaWQqIHRpbWluZ0Z1bmN0aW9ucywgCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVHJhbnNpdGlvbiwgY29uc3QgQW5pbWF0aW9u
KiBhbmltLCBkb3VibGUgYmVnaW5UaW1lKQoreworICAgIFBsYXRmb3JtTGF5ZXIqIGxheWVyID0g
YW5pbWF0ZWRMYXllcihwcm9wZXJ0eSk7CisKKyAgICAvLyBBZGQgYW4gZW50cnkgZm9yIHRoaXMg
YW5pbWF0aW9uICh3aGljaCBtYXkgY2hhbmdlIGJlZ2luVGltZSkuCisgICAgYm9vbCBpc1J1bm5p
bmcgPSBhZGRBbmltYXRpb25FbnRyeShwcm9wZXJ0eSwgaW5kZXgsIGJlZ2luVGltZSwgaXNUcmFu
c2l0aW9uLCBhbmltKTsKKworICAgIFN0cmluZyBrZXlQYXRoID0gcHJvcGVydHlJZFRvU3RyaW5n
KHByb3BlcnR5KTsKKyAgICBTdHJpbmcgYW5pbU5hbWUgPSBrZXlQYXRoICsgIl8iICsgU3RyaW5n
OjpudW1iZXIoaW5kZXgpOworCisgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisKKyAg
ICBpZiAoaXNSdW5uaW5nKSB7CisgICAgICAgIENBS2V5ZnJhbWVBbmltYXRpb24qIGNhQW5pbSA9
IFtDQUtleWZyYW1lQW5pbWF0aW9uIGFuaW1hdGlvbldpdGhLZXlQYXRoOmtleVBhdGhdOworCisg
ICAgICAgIC8vIElmIHdlIHNlbmQgYSBkdXJhdGlvbiBvZiAwIHRvIENBLCB0aGVuIGl0IHdpbGwg
dXNlIHRoZSBkZWZhdWx0IGR1cmF0aW9uCisgICAgICAgIC8vIG9mIDI1MG1zLiBTbyBzZW5kIGEg
dmVyeSBzbWFsbCB2YWx1ZSBpbnN0ZWFkLgorICAgICAgICBkb3VibGUgZHVyYXRpb24gPSBhbmlt
LT5kdXJhdGlvbigpOworICAgICAgICBpZiAoZHVyYXRpb24gPD0gMCkKKyAgICAgICAgICAgIGR1
cmF0aW9uID0gMWUtMzsKKworICAgICAgICBmbG9hdCByZXBlYXRDb3VudCA9IGFuaW0tPml0ZXJh
dGlvbkNvdW50KCk7CisgICAgICAgIGlmIChyZXBlYXRDb3VudCA8IDApCisgICAgICAgICAgICBy
ZXBlYXRDb3VudCA9IEZMVF9NQVg7CisgICAgICAgIGVsc2UgaWYgKGFuaW0tPmRpcmVjdGlvbigp
KQorICAgICAgICAgICAgcmVwZWF0Q291bnQgLz0gMjsKKworICAgICAgICBbY2FBbmltIHNldER1
cmF0aW9uOmR1cmF0aW9uXTsKKyAgICAgICAgW2NhQW5pbSBzZXRSZXBlYXRDb3VudDpyZXBlYXRD
b3VudF07CisgICAgICAgIFtjYUFuaW0gc2V0QXV0b3JldmVyc2VzOmFuaW0tPmRpcmVjdGlvbigp
XTsKKyAgICAgICAgW2NhQW5pbSBzZXRSZW1vdmVkT25Db21wbGV0aW9uOk5PXTsKKworICAgICAg
ICAvLyBUaGUgZmlyc3QgYW5pbWF0aW9uIGlzIG5vbi1hZGRpdGl2ZSwgYWxsIHRoZSByZXN0IGFy
ZSBhZGRpdGl2ZS4KKyAgICAgICAgLy8gTm90ZSB0aGF0IGN1cnJlbnRseSB0cmFuc2Zvcm0gaXMg
dGhlIG9ubHkgcHJvcGVydHkgd2hpY2ggaGFzIGFuaW1hdGlvbnMKKyAgICAgICAgLy8gd2l0aCBh
biBpbmRleCA+IDAKKyAgICAgICAgLy8gRklYTUU6IGFkZGl0aXZlIGFuaW1hdGlvbnMgYXJlIG5v
dCBzdXBwcm90ZWQsIHNvIHdoeSB0aGlzPworICAgICAgICBbY2FBbmltIHNldEFkZGl0aXZlOihw
cm9wZXJ0eSA9PSBBbmltYXRlZFByb3BlcnR5V2Via2l0VHJhbnNmb3JtKSA/IFlFUyA6IE5PXTsK
KyAgICAgICAgW2NhQW5pbSBzZXRGaWxsTW9kZTpAImV4dGVuZGVkIl07CisgICAgICAgIFtjYUFu
aW0gc2V0VmFsdWVGdW5jdGlvbjpbQ0FWYWx1ZUZ1bmN0aW9uIGZ1bmN0aW9uV2l0aE5hbWU6dmFs
dWVGdW5jdGlvbl1dOworICAgICAgICAKKyAgICAgICAgW2NhQW5pbSBzZXRLZXlUaW1lczooaWQp
a2V5c107CisgICAgICAgIFtjYUFuaW0gc2V0VmFsdWVzOihpZCl2YWx1ZXNdOworICAgICAgICAK
KyAgICAgICAgLy8gU2V0IHRoZSBkZWxlZ2F0ZSAoYW5kIHByb3BlcnR5IHZhbHVlKS4KKyAgICAg
ICAgaW50IHByb3AgPSBpc1RyYW5zaXRpb24gPyBwcm9wZXJ0eSA6IEFuaW1hdGVkUHJvcGVydHlJ
bnZhbGlkOworICAgICAgICBbY2FBbmltIHNldFZhbHVlOltOU051bWJlciBudW1iZXJXaXRoSW50
OiBwcm9wXSBmb3JLZXk6a0FuaW1hdGlvbkNTU1Byb3BlcnR5S2V5XTsKKyAgICAgICAgW2NhQW5p
bSBzZXREZWxlZ2F0ZTptX2FuaW1hdGlvbkRpZFN0YXJ0Q0IuZ2V0KCldOworCisgICAgICAgIE5T
VGltZUludGVydmFsIGJ0ID0gYmVnaW5UaW1lID8gW2xheWVyIGNvbnZlcnRUaW1lOnVuaXhUaW1l
VG9DQVRpbWUoYmVnaW5UaW1lKSBmcm9tTGF5ZXI6bmlsXSA6IDA7CisgICAgICAgIFtjYUFuaW0g
c2V0QmVnaW5UaW1lOmJ0XTsKKyAgICAgICAgCisgICAgICAgIC8vIFNldCB0aGUgdGltaW5nIGZ1
bmN0aW9ucywgaWYgYW55LgorICAgICAgICBpZiAodGltaW5nRnVuY3Rpb25zICE9IG5pbCkKKyAg
ICAgICAgICAgIFtjYUFuaW0gc2V0VGltaW5nRnVuY3Rpb25zOihpZCl0aW1pbmdGdW5jdGlvbnNd
OworICAgICAgICAgICAgCisgICAgICAgIC8vIFNlbmQgb3ZlciB0aGUgYW5pbWF0aW9uLgorICAg
ICAgICBbbGF5ZXIgcmVtb3ZlQW5pbWF0aW9uRm9yS2V5OmFuaW1OYW1lXTsKKyAgICAgICAgW2xh
eWVyIGFkZEFuaW1hdGlvbjpjYUFuaW0gZm9yS2V5OmFuaW1OYW1lXTsKKyAgICB9IGVsc2Ugewor
ICAgICAgICAvLyBQdWxsIHRoZSBjdXJyZW50IHByZXNlbnRhdGlvbiB2YWx1ZSBpbnRvIHRoZSBj
dXJyZW50IHZhbHVlLgorICAgICAgICBDQUxheWVyKiBwcmVzTGF5ZXIgPSBbbGF5ZXIgcHJlc2Vu
dGF0aW9uTGF5ZXJdOworICAgICAgICBpZiAocHJlc0xheWVyKQorICAgICAgICAgICAgW2xheWVy
IHNldFZhbHVlOltwcmVzTGF5ZXIgdmFsdWVGb3JLZXlQYXRoOmtleVBhdGhdIGZvcktleVBhdGg6
a2V5UGF0aF07CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIG5vIGFuaW1hdGlvbiBpcyBydW5uaW5n
LgorICAgICAgICBbbGF5ZXIgcmVtb3ZlQW5pbWF0aW9uRm9yS2V5OmFuaW1OYW1lXTsKKyAgICB9
CisgICAgICAgIAorICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKK30KKwordm9pZCBHcmFw
aGljc0xheWVyQ0E6OnN1c3BlbmRBbmltYXRpb25zKCkKK3sKKyAgICBkb3VibGUgdCA9IHVuaXhU
aW1lVG9DQVRpbWUoY3VycmVudFRpbWUoKSk7CisgICAgW3ByaW1hcnlMYXllcigpIHNldFNwZWVk
OjBdOworICAgIFtwcmltYXJ5TGF5ZXIoKSBzZXRUaW1lT2Zmc2V0OnRdOworfQorCit2b2lkIEdy
YXBoaWNzTGF5ZXJDQTo6cmVzdW1lQW5pbWF0aW9ucygpCit7CisgICAgW3ByaW1hcnlMYXllcigp
IHNldFNwZWVkOjFdOworICAgIFtwcmltYXJ5TGF5ZXIoKSBzZXRUaW1lT2Zmc2V0OjBdOworfQor
Cit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6cmVtb3ZlQW5pbWF0aW9uKGludCBhbmltSW5kZXgsIGJv
b2wgcmVzZXQpCit7CisgICAgQVNTRVJUKGFuaW1JbmRleCA+PSAwKTsKKworICAgIEFuaW1hdGVk
UHJvcGVydHlJRCBwcm9wZXJ0eSA9IG1fYW5pbWF0aW9uc1thbmltSW5kZXhdLnByb3BlcnR5Owor
ICAgIAorICAgIC8vIFNldCB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGFuZCByZW1vdmUgdGhl
IGFuaW1hdGlvbi4KKyAgICBTdHJpbmcga2V5UGF0aCA9IHByb3BlcnR5SWRUb1N0cmluZyhwcm9w
ZXJ0eSk7CisgICAgU3RyaW5nIGFuaW1OYW1lID0ga2V5UGF0aCArICJfIiArIFN0cmluZzo6bnVt
YmVyKG1fYW5pbWF0aW9uc1thbmltSW5kZXhdLmluZGV4KTsKKyAgICBDQUxheWVyKiBsYXllciA9
IGFuaW1hdGVkTGF5ZXIocHJvcGVydHkpOworCisgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJ
T05TCisKKyAgICAvLyBJZiB3ZSBhcmUgbm90IHJlc2V0dGluZywgaXQgbWVhbnMgd2UgYXJlIHBh
dXNpbmcuIFNvIHdlIG5lZWQgdG8gZ2V0IHRoZSBjdXJyZW50IHByZXNlbnRhdGlvbgorICAgIC8v
IHZhbHVlIGludG8gdGhlIHByb3BlcnR5IGJlZm9yZSB3ZSByZW1vdmUgdGhlIGFuaW1hdGlvbi4K
KyAgICBpZiAoIXJlc2V0KSB7CisgICAgICAgIC8vIFB1dCB0aGUgY3VycmVudCB2YWx1ZSBpbnRv
IHRoZSBwcm9wZXJ0eS4KKyAgICAgICAgQ0FMYXllciogcHJlc0xheWVyID0gW2xheWVyIHByZXNl
bnRhdGlvbkxheWVyXTsKKyAgICAgICAgaWYgKHByZXNMYXllcikKKyAgICAgICAgICAgIFtsYXll
ciBzZXRWYWx1ZTpbcHJlc0xheWVyIHZhbHVlRm9yS2V5UGF0aDprZXlQYXRoXSBmb3JLZXlQYXRo
OmtleVBhdGhdOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgc2F2ZWQgdmFsdWVzIGFjY3Vy
YXRlbHkgcmVmbGVjdCB0aGUgdmFsdWUgaW4gdGhlIGxheWVyLgorICAgICAgICBpZCB2YWwgPSBb
bGF5ZXIgdmFsdWVGb3JLZXlQYXRoOmtleVBhdGhdOworICAgICAgICBzd2l0Y2gocHJvcGVydHkp
IHsKKyAgICAgICAgICAgIGNhc2UgQW5pbWF0ZWRQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybToKKyAg
ICAgICAgICAgICAgICAvLyBXZSBkb24ndCBzYXZlIHRoZSBjdXJyZW50IHRyYW5zZm9ybSwgc28g
d2Ugd2lsbCBoYXZlIHRvIHJlbHkgb24gaXQgYmVpbmcgcGFzc2VkIGluLgorICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBbmltYXRlZFByb3BlcnR5QmFja2dyb3VuZENv
bG9yOgorICAgICAgICAgICAgICAgIG1fYmFja2dyb3VuZENvbG9yID0gQ29sb3IodmFsKTsKKyAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQW5pbWF0ZWRQcm9wZXJ0eU9w
YWNpdHk6CisgICAgICAgICAgICAgICAgbV9vcGFjaXR5ID0gW3ZhbCBmbG9hdFZhbHVlXTsKKyAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8gSWYgd2UgaGF2ZSByZWFj
aGVkIHRoZSBlbmQgb2YgYW4gYW5pbWF0aW9uLCB3ZSBkb24ndCB3YW50IHRvIGFjdHVhbGx5IHJl
bW92ZSB0aGUgCisgICAgLy8gYW5pbWF0aW9uIGZyb20gdGhlIENBTGF5ZXIuIEF0IHNvbWUgcG9p
bnQgd2Ugd2lsbCBiZSBzZXR0aW5nIHRoZSBwcm9wZXJ0eSB0byBpdHMKKyAgICAvLyB1bmFuaW1h
dGVkIHZhbHVlIGFuZCBhdCB0aGF0IHBvaW50IHdlIHdpbGwgcmVtb3ZlIHRoZSBhbmltYXRpb24u
IFRoYXQgd2lsbCBhdm9pZAorICAgIC8vIGFueSBmbGFzaGluZyBiZXR3ZWVuIHRoZSB0aW1lIHRo
ZSBhbmltYXRpb24gaXMgcmVtb3ZlZCBhbmQgdGhlIHByb3BlcnR5IGlzIHNldC4KKyAgICBpZiAo
IXJlc2V0IHx8IG1fYW5pbWF0aW9uc1thbmltSW5kZXhdLmlzVHJhbnNpdGlvbikKKyAgICAgICAg
W2xheWVyIHJlbW92ZUFuaW1hdGlvbkZvcktleTphbmltTmFtZV07CisKKyAgICBFTkRfQkxPQ0tf
T0JKQ19FWENFUFRJT05TCisKKyAgICAvLyBSZW1vdmUgdGhlIGFuaW1hdGlvbiBlbnRyeS4KKyAg
ICBtX2FuaW1hdGlvbnNbYW5pbUluZGV4XS5hbmltTGF5ZXIgPSAwOworICAgIG1fYW5pbWF0aW9u
cy5yZW1vdmUoYW5pbUluZGV4KTsKK30KKworUGxhdGZvcm1MYXllciogR3JhcGhpY3NMYXllckNB
Ojpob3N0TGF5ZXJGb3JTdWJsYXllcnMoKSBjb25zdAoreworICAgIHJldHVybiBtX3RyYW5zZm9y
bUxheWVyID8gbV90cmFuc2Zvcm1MYXllci5nZXQoKSA6IG1fbGF5ZXIuZ2V0KCk7Cit9CisKK1Bs
YXRmb3JtTGF5ZXIqIEdyYXBoaWNzTGF5ZXJDQTo6bGF5ZXJGb3JTdXBlcmxheWVyKCkgY29uc3QK
K3sKKyAgICBpZiAobV90cmFuc2Zvcm1MYXllcikKKyAgICAgICAgcmV0dXJuIG1fdHJhbnNmb3Jt
TGF5ZXIuZ2V0KCk7CisKKyAgICByZXR1cm4gbV9sYXllci5nZXQoKTsKK30KKworc3RhdGljIGlu
bGluZSBib29sIGhhbmRsZXNIaXRUZXN0KENBTGF5ZXIqIGxheWVyKQoreworICAgIHJldHVybiBs
YXllciAmJiAoW2xheWVyIGlzS2luZE9mQ2xhc3M6W1dLTGF5ZXIgc2VsZl1dIHx8IFtsYXllciBp
c0tpbmRPZkNsYXNzOltXS1RpbGVkTGF5ZXIgc2VsZl1dKSAmJgorICAgICAgICAgICAgICAgICAg
ICBbbGF5ZXIgbGF5ZXJPd25lcl0gJiYKKyAgICAgICAgICAgICAgICAgICAgW2xheWVyIGxheWVy
T3duZXJdLT5jbGllbnQoKTsKK30KKworR3JhcGhpY3NMYXllciogR3JhcGhpY3NMYXllckNBOjpo
aXRUZXN0KGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBzdHJ1Y3QgTGF5ZXJIaXRUZXN0RGF0YSog
aGl0VGVzdERhdGEpIGNvbnN0Cit7CisgICAgQ0FMYXllciogaGl0TGF5ZXIgPSBuaWw7CisgICAg
CisgICAgc0hpdFRlc3REYXRhID0gaGl0VGVzdERhdGE7CisgICAgCisgICAgQkVHSU5fQkxPQ0tf
T0JKQ19FWENFUFRJT05TCisgICAgaGl0TGF5ZXIgPSBbZ2V0UHJlc2VudGF0aW9uTGF5ZXIocHJp
bWFyeUxheWVyKCkpIGhpdFRlc3Q6cG9pbnRdOworICAgIGhpdExheWVyID0gW2hpdExheWVyIG1v
ZGVsTGF5ZXJdOworCisgICAgLy8gV2FsayB1cCB0byB0aGUgYW5jZXN0b3IgbGF5ZXIgdGhhdCBp
cyBhY3R1YWxseSBob29rZWQgdXAgdG8gYSBHcmFwaGljc0xheWVyLCB3aXRoIGEgY2xpZW50Lgor
ICAgIHdoaWxlIChoaXRMYXllciAmJiAhaGFuZGxlc0hpdFRlc3QoaGl0TGF5ZXIpKQorICAgICAg
ICBoaXRMYXllciA9IFtoaXRMYXllciBzdXBlcmxheWVyXTsKKworICAgIEVORF9CTE9DS19PQkpD
X0VYQ0VQVElPTlMKKworICAgIHNIaXRUZXN0RGF0YSA9IDA7CisgICAgCisgICAgaWYgKCFoaXRM
YXllcikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gWyhpZCloaXRMYXllciBsYXll
ck93bmVyXTsKK30KKworLy8gRG93bi1jYWxsCitib29sIEdyYXBoaWNzTGF5ZXJDQTo6bGF5ZXJD
b250YWluc1BvaW50KGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KSBjb25zdAoreworICAgIHJldHVy
biBbZ2V0UHJlc2VudGF0aW9uTGF5ZXIocHJpbWFyeUxheWVyKCkpIGNvbnRhaW5zUG9pbnQ6cG9p
bnRdOworfQorCitGbG9hdFBvaW50IEdyYXBoaWNzTGF5ZXJDQTo6Y29udmVydFBvaW50VG9MYXll
cihjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgR3JhcGhpY3NMYXllciogdGFyZ2V0TGF5ZXIpIGNv
bnN0Cit7CisgICAgRmxvYXRQb2ludCByZXN1bHQ7CisgICAgR3JhcGhpY3NMYXllckNBKiB0YXJn
ZXRMYXllckNBID0gc3RhdGljX2Nhc3Q8R3JhcGhpY3NMYXllckNBKj4odGFyZ2V0TGF5ZXIpOwor
ICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgIHJlc3VsdCA9IFtnZXRQcmVzZW50
YXRpb25MYXllcihwcmltYXJ5TGF5ZXIoKSkgY29udmVydFBvaW50OnBvaW50IHRvTGF5ZXI6Z2V0
UHJlc2VudGF0aW9uTGF5ZXIodGFyZ2V0TGF5ZXJDQS0+cHJpbWFyeUxheWVyKCkpXTsKKyAgICBF
TkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworRmxvYXRQ
b2ludCBHcmFwaGljc0xheWVyQ0E6OmNvbnZlcnRQb2ludEZyb21MYXllcihjb25zdCBGbG9hdFBv
aW50JiBwb2ludCwgR3JhcGhpY3NMYXllciogc291cmNlTGF5ZXIpIGNvbnN0Cit7CisgICAgRmxv
YXRQb2ludCByZXN1bHQ7CisgICAgR3JhcGhpY3NMYXllckNBKiBzb3VyY2VMYXllckNBID0gc3Rh
dGljX2Nhc3Q8R3JhcGhpY3NMYXllckNBKj4oc291cmNlTGF5ZXIpOworICAgIEJFR0lOX0JMT0NL
X09CSkNfRVhDRVBUSU9OUworICAgIHJlc3VsdCA9IFtnZXRQcmVzZW50YXRpb25MYXllcihwcmlt
YXJ5TGF5ZXIoKSkgY29udmVydFBvaW50OnBvaW50IGZyb21MYXllcjpnZXRQcmVzZW50YXRpb25M
YXllcihzb3VyY2VMYXllckNBLT5wcmltYXJ5TGF5ZXIoKSldOworICAgIEVORF9CTE9DS19PQkpD
X0VYQ0VQVElPTlMKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJD
QTo6Y29udmVydFF1YWRUb0xheWVyKEZsb2F0UXVhZCYgcXVhZCwgY29uc3QgR3JhcGhpY3NMYXll
ciogdGFyZ2V0TGF5ZXIpIGNvbnN0Cit7CisgICAgQVNTRVJUKHRhcmdldExheWVyKTsKKyAgICBj
b25zdCBHcmFwaGljc0xheWVyQ0EqIHRhcmdldExheWVyQ0EgPSBzdGF0aWNfY2FzdDxjb25zdCBH
cmFwaGljc0xheWVyQ0EqPih0YXJnZXRMYXllcik7CisKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VY
Q0VQVElPTlMKKworICAgIENBTGF5ZXIqIHNyY0xheWVyID0gZ2V0UHJlc2VudGF0aW9uTGF5ZXIo
cHJpbWFyeUxheWVyKCkpOworICAgIENBTGF5ZXIqIGRzdExheWVyID0gZ2V0UHJlc2VudGF0aW9u
TGF5ZXIodGFyZ2V0TGF5ZXJDQS0+cHJpbWFyeUxheWVyKCkpOworICAgIAorICAgIHF1YWQuc2V0
UDEoW3NyY0xheWVyIGNvbnZlcnRQb2ludDpxdWFkLnAxKCkgdG9MYXllcjpkc3RMYXllcl0pOwor
ICAgIHF1YWQuc2V0UDIoW3NyY0xheWVyIGNvbnZlcnRQb2ludDpxdWFkLnAyKCkgdG9MYXllcjpk
c3RMYXllcl0pOworICAgIHF1YWQuc2V0UDMoW3NyY0xheWVyIGNvbnZlcnRQb2ludDpxdWFkLnAz
KCkgdG9MYXllcjpkc3RMYXllcl0pOworICAgIHF1YWQuc2V0UDQoW3NyY0xheWVyIGNvbnZlcnRQ
b2ludDpxdWFkLnA0KCkgdG9MYXllcjpkc3RMYXllcl0pOworCisgICAgRU5EX0JMT0NLX09CSkNf
RVhDRVBUSU9OUworfQorCitQbGF0Zm9ybUxheWVyKiBHcmFwaGljc0xheWVyQ0E6OnBsYXRmb3Jt
TGF5ZXIoKSBjb25zdAoreworICAgIHJldHVybiBwcmltYXJ5TGF5ZXIoKTsKK30KKworI2lmbmRl
ZiBOREVCVUcKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjpzZXREZWJ1Z0JhY2tncm91bmRDb2xvcihj
b25zdCBDb2xvciYgY29sb3IpCit7CisgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisg
ICAgCisgICAgaWYgKGNvbG9yLmlzVmFsaWQoKSkKKyAgICAgICAgc2V0TGF5ZXJCYWNrZ3JvdW5k
Q29sb3IobV9sYXllci5nZXQoKSwgY29sb3IpOworICAgIGVsc2UKKyAgICAgICAgY2xlYXJMYXll
ckJhY2tncm91bmRDb2xvcihtX2xheWVyLmdldCgpKTsKKyAgICAKKyAgICBFTkRfQkxPQ0tfT0JK
Q19FWENFUFRJT05TCit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjpzZXREZWJ1Z0JvcmRlcihj
b25zdCBDb2xvciYgY29sb3IsIGZsb2F0IGJvcmRlcldpZHRoKQoreworICAgIEJFR0lOX0JMT0NL
X09CSkNfRVhDRVBUSU9OUworICAgIAorICAgIGlmIChjb2xvci5pc1ZhbGlkKCkpIHsKKyAgICAg
ICAgc2V0TGF5ZXJCb3JkZXJDb2xvcihtX2xheWVyLmdldCgpLCBjb2xvcik7CisgICAgICAgIFtt
X2xheWVyLmdldCgpIHNldEJvcmRlcldpZHRoOmJvcmRlcldpZHRoXTsKKyAgICB9IGVsc2Ugewor
ICAgICAgICBjbGVhckJvcmRlckNvbG9yKG1fbGF5ZXIuZ2V0KCkpOworICAgICAgICBbbV9sYXll
ci5nZXQoKSBzZXRCb3JkZXJXaWR0aDowXTsKKyAgICB9CisgICAgCisgICAgRU5EX0JMT0NLX09C
SkNfRVhDRVBUSU9OUworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6c2V0WlBvc2l0aW9uKGZs
b2F0IHBvc2l0aW9uKQoreworICAgIEdyYXBoaWNzTGF5ZXI6OnNldFpQb3NpdGlvbihwb3NpdGlv
bik7CisgICAgCisgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgW3ByaW1hcnlM
YXllcigpIHNldFpQb3NpdGlvbjpwb3NpdGlvbl07CisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBU
SU9OUworfQorI2VuZGlmCisKK2Jvb2wgR3JhcGhpY3NMYXllckNBOjpyZXF1aXJlc1RpbGVkTGF5
ZXIoY29uc3QgRmxvYXRTaXplJiBzaXplKSBjb25zdAoreworICAgIGlmICghbV9kcmF3c0NvbnRl
bnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiAoc2l6ZS53aWR0aCgpID4g
a01heFBpeGVsRGltZW5zaW9uIHx8IHNpemUuaGVpZ2h0KCkgPiBrTWF4UGl4ZWxEaW1lbnNpb24p
OworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6c3dhcEZyb21PclRvVGlsZWRMYXllcihib29s
IHVzZXJUaWxlZExheWVyKQoreworICAgIGlmICh1c2VyVGlsZWRMYXllciA9PSBtX3VzaW5nVGls
ZWRMYXllcikKKyAgICAgICAgcmV0dXJuOworCisgICAgQ0dTaXplIHRpbGVTaXplID0gQ0dTaXpl
TWFrZShrVGlsZWRMYXllclRpbGVTaXplLCBrVGlsZWRMYXllclRpbGVTaXplKTsKKworICAgIEJF
R0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgIAorICAgIENBTGF5ZXIqIG9sZExheWVyID0g
bV9sYXllci5nZXQoKTsKKyAgICBbb2xkTGF5ZXIgcmV0YWluXTsgICAgICAvLyBrZWVwIGl0IGFy
b3VuZCBhZnRlciB0aGUgUmV0YWluUHRyIGlzIGFzc2lnbmVkIHRoZSBuZXcgbGF5ZXIuIGJhbGFu
Y2VkIGJ5IC1yZWxlYXNlIGJlbG93LgorICAgIAorICAgIENsYXNzIGxheWVyQ2xhc3MgPSB1c2Vy
VGlsZWRMYXllciA/IFtXS1RpbGVkTGF5ZXIgc2VsZl0gOiBbV0tMYXllciBzZWxmXTsKKyAgICBt
X2xheWVyLmFkb3B0TlMoW1tsYXllckNsYXNzIGFsbG9jXSBpbml0XSk7CisKKyAgICBpZiAodXNl
clRpbGVkTGF5ZXIpIHsKKyAgICAgICAgV0tUaWxlZExheWVyKiB0aWxlZExheWVyID0gKFdLVGls
ZWRMYXllciopbV9sYXllci5nZXQoKTsKKyAgICAgICAgW3RpbGVkTGF5ZXIgc2V0VGlsZVNpemU6
dGlsZVNpemVdOworICAgICAgICBbdGlsZWRMYXllciBzZXRMZXZlbHNPZkRldGFpbDoxXTsKKyAg
ICAgICAgW3RpbGVkTGF5ZXIgc2V0TGV2ZWxzT2ZEZXRhaWxCaWFzOjBdOworCisgICAgICAgIGlm
IChHcmFwaGljc0xheWVyOjpncmFwaGljc0NvbnRleHRzRmxpcHBlZCgpKQorICAgICAgICAgICAg
W3RpbGVkTGF5ZXIgc2V0Q29udGVudHNHcmF2aXR5OkAiYm90dG9tTGVmdCJdOworICAgICAgICBl
bHNlCisgICAgICAgICAgICBbdGlsZWRMYXllciBzZXRDb250ZW50c0dyYXZpdHk6QCJ0b3BMZWZ0
Il07CisgICAgfQorICAgIAorICAgIFttX2xheWVyLmdldCgpIHNldExheWVyT3duZXI6dGhpc107
CisgICAgW21fbGF5ZXIuZ2V0KCkgc2V0U3VibGF5ZXJzOltvbGRMYXllciBzdWJsYXllcnNdXTsK
KyAgICAKKyAgICBbW29sZExheWVyIHN1cGVybGF5ZXJdIHJlcGxhY2VTdWJsYXllcjpvbGRMYXll
ciB3aXRoOm1fbGF5ZXIuZ2V0KCldOworICAgIAorICAgIFttX2xheWVyLmdldCgpIHNldEJvdW5k
czpbb2xkTGF5ZXIgYm91bmRzXV07CisgICAgW21fbGF5ZXIuZ2V0KCkgc2V0UG9zaXRpb246W29s
ZExheWVyIHBvc2l0aW9uXV07CisgICAgW21fbGF5ZXIuZ2V0KCkgc2V0QW5jaG9yUG9pbnQ6W29s
ZExheWVyIGFuY2hvclBvaW50XV07CisgICAgW21fbGF5ZXIuZ2V0KCkgc2V0T3BhcXVlOltvbGRM
YXllciBpc09wYXF1ZV1dOworICAgIFttX2xheWVyLmdldCgpIHNldE9wYWNpdHk6W29sZExheWVy
IG9wYWNpdHldXTsKKyAgICBbbV9sYXllci5nZXQoKSBzZXRUcmFuc2Zvcm06W29sZExheWVyIHRy
YW5zZm9ybV1dOworICAgIFttX2xheWVyLmdldCgpIHNldFN1YmxheWVyVHJhbnNmb3JtOltvbGRM
YXllciBzdWJsYXllclRyYW5zZm9ybV1dOworICAgIFttX2xheWVyLmdldCgpIHNldERvdWJsZVNp
ZGVkOltvbGRMYXllciBpc0RvdWJsZVNpZGVkXV07CisjaWZuZGVmIE5ERUJVRworICAgIFttX2xh
eWVyLmdldCgpIHNldFpQb3NpdGlvbjpbb2xkTGF5ZXIgelBvc2l0aW9uXV07CisjZW5kaWYKKyAg
ICAKKyNpZm5kZWYgTkRFQlVHCisgICAgU3RyaW5nIG5hbWUgPSBTdHJpbmc6OmZvcm1hdCgiQ0FM
YXllciglcCkgR3JhcGhpY3NMYXllciglcCkgIiwgbV9sYXllci5nZXQoKSwgdGhpcykgKyBtX25h
bWU7CisgICAgW21fbGF5ZXIuZ2V0KCkgc2V0TmFtZTpuYW1lXTsKKyNlbmRpZgorCisgICAgLy8g
bW92ZSBvdmVyIGFuaW1hdGlvbnMKKyAgICBtb3ZlQW5pbWF0aW9uKEFuaW1hdGVkUHJvcGVydHlX
ZWJraXRUcmFuc2Zvcm0sIG9sZExheWVyLCBtX2xheWVyLmdldCgpKTsKKyAgICBtb3ZlQW5pbWF0
aW9uKEFuaW1hdGVkUHJvcGVydHlPcGFjaXR5LCBvbGRMYXllciwgbV9sYXllci5nZXQoKSk7Cisg
ICAgbW92ZUFuaW1hdGlvbihBbmltYXRlZFByb3BlcnR5QmFja2dyb3VuZENvbG9yLCBvbGRMYXll
ciwgbV9sYXllci5nZXQoKSk7CisgICAgCisgICAgLy8gbmVlZCB0byB0ZWxsIG5ldyBsYXllciB0
byBkcmF3IGl0c2VsZgorICAgIHNldE5lZWRzRGlzcGxheSgpOworICAgIAorICAgIFtvbGRMYXll
ciByZWxlYXNlXTsKKyAgICAKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgCisg
ICAgbV91c2luZ1RpbGVkTGF5ZXIgPSB1c2VyVGlsZWRMYXllcjsKKyAgICAKKyNpZm5kZWYgTkRF
QlVHCisgICAgdXBkYXRlRGVidWdJbmRpY2F0b3JzKCk7CisjZW5kaWYKK30KKwordm9pZCBHcmFw
aGljc0xheWVyQ0E6OnNldEhhc0NvbnRlbnRzTGF5ZXIoYm9vbCBoYXNMYXllcikKK3sKKyAgICBC
RUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKworICAgIGlmIChoYXNMYXllciAmJiAhbV9jb250
ZW50c0xheWVyKSB7CisgICAgICAgIC8vIGNyZWF0ZSB0aGUgaW5uZXIgbGF5ZXIKKyAgICAgICAg
V0tMYXllciogY29udGVudHNMYXllciA9IFtXS0xheWVyIGxheWVyXTsKKyNpZm5kZWYgTkRFQlVH
CisgICAgICAgIFtjb250ZW50c0xheWVyIHNldE5hbWU6QCJDb250ZW50cyBMYXllciJdOworI2Vu
ZGlmCisgICAgICAgIHNldENvbnRlbnRzTGF5ZXIoY29udGVudHNMYXllcik7CisKKyAgICB9IGVs
c2UgaWYgKCFoYXNMYXllciAmJiBtX2NvbnRlbnRzTGF5ZXIpCisgICAgICAgIHNldENvbnRlbnRz
TGF5ZXIoMCk7CisKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCit9CisKK3ZvaWQgR3Jh
cGhpY3NMYXllckNBOjpzZXRDb250ZW50c0xheWVyKFdLTGF5ZXIqIGNvbnRlbnRzTGF5ZXIpCit7
CisgICAgaWYgKGNvbnRlbnRzTGF5ZXIgPT0gbV9jb250ZW50c0xheWVyKQorICAgICAgICByZXR1
cm47CisKKyAgICBDR1BvaW50IGFuY2hvclBvaW50ID0gQ0dQb2ludE1ha2UoMC4wZiwgMC4wZik7
CisKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKworICAgIGlmIChtX2NvbnRlbnRz
TGF5ZXIpIHsKKyAgICAgICAgW21fY29udGVudHNMYXllci5nZXQoKSByZW1vdmVGcm9tU3VwZXJs
YXllcl07CisgICAgICAgIG1fY29udGVudHNMYXllciA9IDA7CisgICAgfQorICAgIAorICAgIGlm
IChjb250ZW50c0xheWVyKSB7CisgICAgICAgIC8vIFR1cm4gb2ZmIGltcGxpY2l0IGFuaW1hdGlv
bnMgb24gdGhlIGlubmVyIGxheWVyLgorICAgICAgICBbY29udGVudHNMYXllciBzZXRTdHlsZTpb
TlNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2JqZWN0Om51bGxBY3Rpb25zRGljdGlvbmFyeSgp
IGZvcktleTpAImFjdGlvbnMiXV07CisKKyAgICAgICAgbV9jb250ZW50c0xheWVyLmFkb3B0TlMo
W2NvbnRlbnRzTGF5ZXIgcmV0YWluXSk7CisgICAgICAgIFttX2NvbnRlbnRzTGF5ZXIuZ2V0KCkg
c2V0QW5jaG9yUG9pbnQ6YW5jaG9yUG9pbnRdOworICAgICAgICBbbV9sYXllci5nZXQoKSBhZGRT
dWJsYXllcjptX2NvbnRlbnRzTGF5ZXIuZ2V0KCldOworCisgICAgICAgIHVwZGF0ZUNvbnRlbnRz
UmVjdCgpOworCisgICAgICAgIC8vIFNldCBjb250ZW50cyB0byBuaWwgaWYgdGhlIGxheWVyIGRv
ZXMgbm90IGRyYXcgaXRzIG93biBjb250ZW50LgorICAgICAgICBpZiAobV9jbGllbnQgJiYgIWRy
YXdzQ29udGVudCgpKQorICAgICAgICAgICAgW21fbGF5ZXIuZ2V0KCkgc2V0Q29udGVudHM6bmls
XTsKKworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgaWYgKHNob3dEZWJ1Z0JvcmRlcnMoKSkgewor
ICAgICAgICAgICAgc2V0TGF5ZXJCb3JkZXJDb2xvcihtX2NvbnRlbnRzTGF5ZXIuZ2V0KCksIENv
bG9yKDAsIDAsIDEyOCwgMTgwKSk7CisgICAgICAgICAgICBbbV9jb250ZW50c0xheWVyLmdldCgp
IHNldEJvcmRlcldpZHRoOjEuMGZdOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisjaWZuZGVm
IE5ERUJVRworICAgIHVwZGF0ZURlYnVnSW5kaWNhdG9ycygpOworI2VuZGlmCisKKyAgICBFTkRf
QkxPQ0tfT0JKQ19FWENFUFRJT05TCit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworCisj
ZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQpkaWZmIC0tZ2l0IGEvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvV0tMYXllci5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9tYWMvV0tMYXllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5
MzBiNzEKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9X
S0xheWVyLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBO
ZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YK
KyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90
ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1Mg
T0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgor
ICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFdLTGF5ZXJfaAorI2RlZmluZSBXS0xheWVyX2gK
KworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2ltcG9ydCA8UXVhcnR6Q29y
ZS9RdWFydHpDb3JlLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIEdyYXBoaWNzTGF5
ZXI7Cit9CisKK0BpbnRlcmZhY2UgQ0FMYXllcihXS0xheWVyQWRkaXRpb25zKQorCistICh2b2lk
KXNldExheWVyT3duZXI6KFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXIqKWFMYXllcjsKKy0gKFdlYkNv
cmU6OkdyYXBoaWNzTGF5ZXIqKWxheWVyT3duZXI7CisKK0BlbmQKKworCisjaWZuZGVmIE5ERUJV
RworLy8gZm9yIGRlYnVnIGxvZ2dpbmcKK0BpbnRlcmZhY2UgQ0FMYXllcihFeHRlbmRlZERlc2Ny
aXB0aW9uKQorCistIChOU1N0cmluZyopZXh0ZW5kZWREZXNjcmlwdGlvbjsKKworQGVuZAorI2Vu
ZGlmCisKKworQGludGVyZmFjZSBXS0xheWVyIDogQ0FMYXllciAKK3sKKyAgICBXZWJDb3JlOjpH
cmFwaGljc0xheWVyKiBfbGF5ZXJPd25lcjsKKyAgICBmbG9hdCBfY29udGVudHNTY2FsZTsKK30K
KworLy8gaW1wbGVtZW50cyBXS0xheWVyQWRkaXRpb25zCisvLyBpbXBsZW1lbnRzIEV4dGVuZGVk
RGVzY3JpcHRpb24KKworLy8gQ2xhc3MgbWV0aG9kIGFsbG93cyB1cyB0byBzaGFyZSBpbXBsZW1l
bnRhdGlvbiBhY3Jvc3MgV0tUaWxlZExheWVyIGFuZCBXS0xheWVyCisrICh2b2lkKWRyYXdDb250
ZW50czooV2ViQ29yZTo6R3JhcGhpY3NMYXllciopbGF5ZXJDb250ZW50cyBvZkxheWVyOihDQUxh
eWVyKilsYXllciBpbnRvQ29udGV4dDooQ0dDb250ZXh0UmVmKWN0eDsKKworQGVuZAorCisjZW5k
aWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjZW5kaWYgLy8gV0tMYXllcl9o
CisKKwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvV0tMYXllci5t
bSBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1dLTGF5ZXIubW0KbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhkYzk3YQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1dLTGF5ZXIubW0KQEAgLTAsMCArMSwyNjAgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4gCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBJbmMu
ICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkg
YmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZy
b20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lv
bi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENP
TlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjaW1wb3J0
IDxRdWFydHpDb3JlL1F1YXJ0ekNvcmUuaD4KKworI2ltcG9ydCAiV0tMYXllci5oIgorCisjaW1w
b3J0ICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbXBvcnQgIkdyYXBoaWNzTGF5ZXIuaCIKKyNpbXBv
cnQgIldlYkNvcmVUZXh0UmVuZGVyZXIuaCIKKyNpbXBvcnQgPHd0Zi9VbnVzZWRQYXJhbS5oPgor
Cit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworQGltcGxlbWVudGF0aW9uIFdLTGF5ZXIKKwor
KyAodm9pZClkcmF3Q29udGVudHM6KFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXIqKWxheWVyQ29udGVu
dHMgb2ZMYXllcjooQ0FMYXllciopbGF5ZXIgaW50b0NvbnRleHQ6KENHQ29udGV4dFJlZiljdHgK
K3sKKyAgICBVTlVTRURfUEFSQU0obGF5ZXIpOworICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY3R4
KTsKKyAgICAKKyAgICBpZiAobGF5ZXJDb250ZW50cyAmJiBsYXllckNvbnRlbnRzLT5jbGllbnQo
KSkgeworCisgICAgICAgIFtOU0dyYXBoaWNzQ29udGV4dCBzYXZlR3JhcGhpY3NTdGF0ZV07CisK
KyAgICAgICAgLy8gU2V0IHVwIGFuIE5TR3JhcGhpY3NDb250ZXh0IGZvciB0aGUgY3R4LCBzbyB0
aGF0IHBhcnRzIG9mIEFwcEtpdCB0aGF0IHJlbHkgb24KKyAgICAgICAgLy8gdGhlIGN1cnJlbnQg
TlNHcmFwaGljc0NvbnRleHQgKGUuZy4gTlNDZWxsIGRyYXdpbmcpIGdldCB0aGUgcmlnaHQgb25l
LgorICAgICAgICBOU0dyYXBoaWNzQ29udGV4dCogbGF5ZXJDb250ZXh0ID0gW05TR3JhcGhpY3ND
b250ZXh0IGdyYXBoaWNzQ29udGV4dFdpdGhHcmFwaGljc1BvcnQ6Y3R4IGZsaXBwZWQ6WUVTXTsK
KyAgICAgICAgW05TR3JhcGhpY3NDb250ZXh0IHNldEN1cnJlbnRDb250ZXh0OmxheWVyQ29udGV4
dF07CisKKyAgICAgICAgUGxhdGZvcm1HcmFwaGljc0NvbnRleHQqIHBsYXRmb3JtQ29udGV4dCA9
IHN0YXRpY19jYXN0PFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0Kj4oY3R4KTsKKyAgICAgICAgR3Jh
cGhpY3NDb250ZXh0IGNvbnRleHQocGxhdGZvcm1Db250ZXh0KTsKKworICAgICAgICAvLyBUdXJu
IG9mZiB0ZXh0IHNtb290aGluZworICAgICAgICBib29sIHdhc1Ntb290aGluZyA9IGNvbnRleHQu
dXNpbmdGb250U21vb3RoaW5nKCk7CisgICAgICAgIGNvbnRleHQuc2V0VXNlRm9udFNtb290aGlu
ZyhmYWxzZSk7CisKKyAgICAgICAgLy8gSXQncyBpbXBvcnRhbnQgdG8gZ2V0IHRoZSBjbGlwIGZy
b20gdGhlIGNvbnRleHQsIGJlY2F1c2UgaXQgbWF5IGJlIHNpZ25pZmljYW50bHkKKyAgICAgICAg
Ly8gc21hbGxlciB0aGFuIHRoZSBsYXllciBib3VuZHMgKGUuZy4gdGlsZWQgbGF5ZXJzKQorICAg
ICAgICBDR1JlY3QgY2xpcEJvdW5kcyA9IENHQ29udGV4dEdldENsaXBCb3VuZGluZ0JveChjdHgp
OworICAgICAgICBJbnRSZWN0IGNsaXAoZW5jbG9zaW5nSW50UmVjdChjbGlwQm91bmRzKSk7Cisg
ICAgICAgIGxheWVyQ29udGVudHMtPnBhaW50R3JhcGhpY3NMYXllckNvbnRlbnRzKGNvbnRleHQs
IGNsaXApOworCisgICAgICAgIGNvbnRleHQuc2V0VXNlRm9udFNtb290aGluZyh3YXNTbW9vdGhp
bmcpOworCisgICAgICAgIFtOU0dyYXBoaWNzQ29udGV4dCByZXN0b3JlR3JhcGhpY3NTdGF0ZV07
CisgICAgfQorICAgIGVsc2UgeworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7CisKKyAgICAgICAgLy8gRklYTUU6IGlkZWFsbHkgd2UnZCBhdm9pZCBjYWxsaW5n
IC1zZXROZWVkc0Rpc3BsYXkgb24gYSBsYXllciB0aGF0IGlzIGEgcGxhaW4gY29sb3IsCisgICAg
ICAgIC8vIHNvIENBIG5ldmVyIG1ha2VzIGJhY2tpbmcgc3RvcmUgZm9yIGl0ICh3aGljaCBpcyB3
aGF0IC1zZXROZWVkc0Rpc3BsYXkgd2lsbCBkbyBhYm92ZSkuCisgICAgICAgIENHQ29udGV4dFNl
dFJHQkZpbGxDb2xvcihjdHgsIDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYpOworICAgICAgICBDR1Jl
Y3QgYUJvdW5kcyA9IFtsYXllciBib3VuZHNdOworICAgICAgICBDR0NvbnRleHRGaWxsUmVjdChj
dHgsIGFCb3VuZHMpOworI2VuZGlmCisgICAgfQorCisgICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0
ZShjdHgpOworCisjaWZuZGVmIE5ERUJVRworICAgIGlmIChsYXllckNvbnRlbnRzICYmIGxheWVy
Q29udGVudHMtPnNob3dSZXBhaW50Q291bnRlcigpKSB7CisgICAgICAgIGJvb2wgaXNUaWxlZExh
eWVyID0gW2xheWVyIGlzS2luZE9mQ2xhc3M6W0NBVGlsZWRMYXllciBjbGFzc11dOworCisgICAg
ICAgIGNoYXIgdGV4dFsxNl07IC8vIHRoYXQncyBhIGxvdCBvZiByZXBhaW50cworICAgICAgICBz
bnByaW50Zih0ZXh0LCBzaXplb2YodGV4dCksICIlZCIsIGxheWVyQ29udGVudHMtPmluY3JlbWVu
dFJlcGFpbnRDb3VudCgpKTsKKworICAgICAgICBDR0FmZmluZVRyYW5zZm9ybSBhID0gQ0dDb250
ZXh0R2V0Q1RNKGN0eCk7CisgICAgICAgIAorICAgICAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGN0
eCk7CisgICAgICAgIGlmIChpc1RpbGVkTGF5ZXIpCisgICAgICAgICAgICBDR0NvbnRleHRTZXRS
R0JGaWxsQ29sb3IoY3R4LCAwLjBmLCAxLjBmLCAwLjBmLCAwLjhmKTsKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgQ0dDb250ZXh0U2V0UkdCRmlsbENvbG9yKGN0eCwgMS4wZiwgMC4wZiwgMC4w
ZiwgMC44Zik7CisgICAgICAgIAorICAgICAgICBDR1JlY3QgYUJvdW5kcyA9IFtsYXllciBib3Vu
ZHNdOworCisgICAgICAgIGFCb3VuZHMuc2l6ZS53aWR0aCA9IDEwICsgMTIgKiBzdHJsZW4odGV4
dCk7CisgICAgICAgIGFCb3VuZHMuc2l6ZS5oZWlnaHQgPSAyNTsKKyAgICAgICAgQ0dDb250ZXh0
RmlsbFJlY3QoY3R4LCBhQm91bmRzKTsKKyAgICAgICAgCisgICAgICAgIENHQ29udGV4dFNldFJH
QkZpbGxDb2xvcihjdHgsIDAuMGYsIDAuMGYsIDAuMGYsIDEuMGYpOworCisgICAgICAgIENHQ29u
dGV4dFNldFRleHRNYXRyaXgoY3R4LCBDR0FmZmluZVRyYW5zZm9ybU1ha2VTY2FsZSgxLjBmLCAt
MS4wZikpOworICAgICAgICBDR0NvbnRleHRTZWxlY3RGb250KGN0eCwgIkhlbHZldGljYSIsIDI1
LCBrQ0dFbmNvZGluZ01hY1JvbWFuKTsKKyAgICAgICAgQ0dDb250ZXh0U2hvd1RleHRBdFBvaW50
KGN0eCwgYUJvdW5kcy5vcmlnaW4ueCArIDMuMGYsIGFCb3VuZHMub3JpZ2luLnkgKyAyMC4wZiwg
dGV4dCwgc3RybGVuKHRleHQpKTsKKyAgICAgICAgCisgICAgICAgIENHQ29udGV4dFJlc3RvcmVH
U3RhdGUoY3R4KTsgICAgICAgIAorICAgIH0KKyNlbmRpZgorfQorCistIChpZClpbml0Cit7Cisg
ICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSkKKyAgICAgICAgX2NvbnRlbnRzU2NhbGUgPSAx
LjBmOworCisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8vIERpc2FibGUgZGVmYXVsdCBhbmltYXRp
b25zCistIChpZDxDQUFjdGlvbj4pYWN0aW9uRm9yS2V5OihOU1N0cmluZyAqKWtleQoreworICAg
IFVOVVNFRF9QQVJBTShrZXkpOworICAgIHJldHVybiBuaWw7Cit9CisKKy8vIEltcGxlbWVudCB0
aGlzIHNvIHByZXNlbnRhdGlvbkxheWVyIGNhbiBnZXQgb3VyIGN1c3RvbSBhdHRyaWJ1dGVzCist
IChpZClpbml0V2l0aExheWVyOihpZClsYXllcgoreworICAgIGlmICgoc2VsZiA9IFtzdXBlciBp
bml0V2l0aExheWVyOmxheWVyXSkpCisgICAgICAgIF9sYXllck93bmVyID0gWyhXS0xheWVyKils
YXllciBsYXllck93bmVyXTsKKworICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKXNldE5l
ZWRzRGlzcGxheQoreworICAgIGlmIChfbGF5ZXJPd25lciAmJiBfbGF5ZXJPd25lci0+Y2xpZW50
KCkgJiYgX2xheWVyT3duZXItPmRyYXdzQ29udGVudCgpKQorICAgICAgICBbc3VwZXIgc2V0TmVl
ZHNEaXNwbGF5XTsKK30KKworLSAodm9pZClzZXROZWVkc0Rpc3BsYXlJblJlY3Q6KENHUmVjdClp
bkRpcnR5UmVjdAoreworICAgIGlmIChfbGF5ZXJPd25lciAmJiBfbGF5ZXJPd25lci0+Y2xpZW50
KCkgJiYgX2xheWVyT3duZXItPmRyYXdzQ29udGVudCgpKSB7CisgICAgICAgIFtzdXBlciBzZXRO
ZWVkc0Rpc3BsYXlJblJlY3Q6aW5EaXJ0eVJlY3RdOworCisjaWZuZGVmIE5ERUJVRworICAgICAg
ICBpZiAoX2xheWVyT3duZXItPnNob3dSZXBhaW50Q291bnRlcigpKSB7CisgICAgICAgICAgICBD
R1JlY3QgYUJvdW5kcyA9IFtzZWxmIGJvdW5kc107CisgICAgICAgICAgICBbc3VwZXIgc2V0TmVl
ZHNEaXNwbGF5SW5SZWN0OkNHUmVjdE1ha2UoYUJvdW5kcy5vcmlnaW4ueCwgYUJvdW5kcy5vcmln
aW4ueSwgNDYsIDI1KV07CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KK30KKworLSAodm9pZClk
cmF3SW5Db250ZXh0OihDR0NvbnRleHRSZWYpY3R4Cit7CisgICAgW1dLTGF5ZXIgZHJhd0NvbnRl
bnRzOl9sYXllck93bmVyIG9mTGF5ZXI6c2VsZiBpbnRvQ29udGV4dDpjdHhdOworfQorCistIChC
T09MKWNvbnRhaW5zUG9pbnQ6KENHUG9pbnQpaW5Qb2ludAoreworICAgIGlmICghW3N1cGVyIGNv
bnRhaW5zUG9pbnQ6aW5Qb2ludF0pCisgICAgICAgIHJldHVybiBOTzsKKworICAgIGlmIChfbGF5
ZXJPd25lcikgeworICAgICAgICBJbnRQb2ludCAgICB0aGVQb2ludChpblBvaW50LngsIGluUG9p
bnQueSk7CisgICAgICAgIEJPT0wgbGF5ZXJPd25lckNvbnRhaW5zUG9pbnQgPSAgX2xheWVyT3du
ZXItPmNvbnRlbnRzQ29udGFpblBvaW50KHRoZVBvaW50KTsKKyAgICAgICAgcmV0dXJuIGxheWVy
T3duZXJDb250YWluc1BvaW50OworICAgIH0KKyAgICByZXR1cm4gWUVTOworfQorCisvLyBvdmVy
cmlkZSBDQUxheWVyJ3MgaWdub3Jlc0hpdFRlc3RpbmcgYmVjYXVzZSB3ZSB3YW50IG9wYWNpdHkg
MCBsYXllcnMgdG8gaGl0IHRlc3QKKy0gKEJPT0wpaWdub3Jlc0hpdFRlc3RpbmcKK3sKKyAgICBy
ZXR1cm4gW3NlbGYgaXNIaWRkZW5dOworfQorCitAZW5kIC8vIGltcGxlbWVudGF0aW9uIFdLTGF5
ZXIKKworI3ByYWdtYSBtYXJrIC0KKworQGltcGxlbWVudGF0aW9uIFdLTGF5ZXIoV0tMYXllckFk
ZGl0aW9ucykKKworLSAodm9pZClzZXRMYXllck93bmVyOihHcmFwaGljc0xheWVyKilhTGF5ZXIK
K3sKKyAgICBfbGF5ZXJPd25lciA9IGFMYXllcjsKK30KKworLSAoR3JhcGhpY3NMYXllciopbGF5
ZXJPd25lcgoreworICAgIHJldHVybiBfbGF5ZXJPd25lcjsKK30KKworQGVuZAorCisjcHJhZ21h
IG1hcmsgLQorCisjaWZuZGVmIE5ERUJVRworCitAaW1wbGVtZW50YXRpb24gQ0FMYXllcihFeHRl
bmRlZERlc2NyaXB0aW9uKQorCistIChOU1N0cmluZyopX2Rlc2NyaXB0aW9uV2l0aFByZWZpeDoo
TlNTdHJpbmcqKWluUHJlZml4Cit7CisgICAgQ0dSZWN0IGFCb3VuZHMgID0gW3NlbGYgYm91bmRz
XTsKKyAgICBDR1BvaW50IGFQb3MgICAgPSBbc2VsZiBwb3NpdGlvbl07CisgICAgQ0FUcmFuc2Zv
cm0zRCB0ID0gW3NlbGYgdHJhbnNmb3JtXTsKKworICAgIE5TU3RyaW5nKiBzZWxmU3RyaW5nID0g
W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlQDwlQCAweCUwOHg+IGJvdW5kcyglLjFmLCAl
LjFmLCAlLjFmLCAlLjFmKSBwb3MoJS4xZiwgJS4xZiksIHN1YmxheWVycz0lZCBtYXNraW5nPSVk
IiwKKyAgICAgICAgICAgIGluUHJlZml4LAorICAgICAgICAgICAgW3NlbGYgY2xhc3NdLAorICAg
ICAgICAgICAgc2VsZiwKKyAgICAgICAgICAgIGFCb3VuZHMub3JpZ2luLngsIGFCb3VuZHMub3Jp
Z2luLnksIGFCb3VuZHMuc2l6ZS53aWR0aCwgYUJvdW5kcy5zaXplLmhlaWdodCwgCisgICAgICAg
ICAgICBhUG9zLngsIGFQb3MueSwKKyAgICAgICAgICAgIFtbc2VsZiBzdWJsYXllcnNdIGNvdW50
XSwKKyAgICAgICAgICAgIFtzZWxmIG1hc2tzVG9Cb3VuZHNdXTsKKyAgICAKKyAgICBOU011dGFi
bGVTdHJpbmcqIGN1ckRlc2MgPSBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6c2Vs
ZlN0cmluZ107CisgICAgCisgICAgaWYgKFtbc2VsZiBzdWJsYXllcnNdIGNvdW50XSA+IDApCisg
ICAgICAgIFtjdXJEZXNjIGFwcGVuZFN0cmluZzpAIlxuIl07CisKKyAgICBOU1N0cmluZyogc3Vi
bGF5ZXJQcmVmaXggPSBbaW5QcmVmaXggc3RyaW5nQnlBcHBlbmRpbmdTdHJpbmc6QCJcdCJdOwor
CisgICAgTlNFbnVtZXJhdG9yKiBzdWJsYXllcnNFbnVtID0gW1tzZWxmIHN1YmxheWVyc10gb2Jq
ZWN0RW51bWVyYXRvcl07CisgICAgQ0FMYXllciogY3VyTGF5ZXI7CisgICAgd2hpbGUgKChjdXJM
YXllciA9IFtzdWJsYXllcnNFbnVtIG5leHRPYmplY3RdKSkKKyAgICB7CisgICAgICAgIFtjdXJE
ZXNjIGFwcGVuZFN0cmluZzpbY3VyTGF5ZXIgX2Rlc2NyaXB0aW9uV2l0aFByZWZpeDpzdWJsYXll
clByZWZpeF1dOworICAgICAgICAvL1tjdXJEZXNjIGFwcGVuZFN0cmluZzpAIlxuIl07CisgICAg
fQorCisgICAgaWYgKFtbc2VsZiBzdWJsYXllcnNdIGNvdW50XSA9PSAwKQorICAgICAgICBbY3Vy
RGVzYyBhcHBlbmRTdHJpbmc6QCJcbiJdOworCisgICAgcmV0dXJuIGN1ckRlc2M7Cit9CisKKy0g
KE5TU3RyaW5nKilleHRlbmRlZERlc2NyaXB0aW9uCit7CisgICAgcmV0dXJuIFtzZWxmIF9kZXNj
cmlwdGlvbldpdGhQcmVmaXg6QCIiXTsKK30KKworQGVuZCAgLy8gaW1wbGVtZW50YXRpb24gV0tM
YXllcihFeHRlbmRlZERlc2NyaXB0aW9uKQorCisjZW5kaWYgLy8gTkRFQlVHCisKKyNlbmRpZiAv
LyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL21hYy9XS1RpbGVkTGF5ZXIuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvbWFjL1dLVGlsZWRMYXllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu
LjU5OGVmNWUKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21h
Yy9XS1RpbGVkTGF5ZXIuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAor
ICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAor
ICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBu
YW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBv
ciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0
aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwor
ICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgV0tUaWxlZExheWVyX2gKKyNkZWZp
bmUgV0tUaWxlZExheWVyX2gKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKwor
I2RlZmluZSBIQVZFX0NBVElMRURfTEFZRVIgICAgMQorCisjaWYgSEFWRV9DQVRJTEVEX0xBWUVS
CisKKyNpbXBvcnQgPFF1YXJ0ekNvcmUvUXVhcnR6Q29yZS5oPgorCisjaW1wb3J0ICJXS0xheWVy
LmgiCisKK0BpbnRlcmZhY2UgV0tUaWxlZExheWVyIDogQ0FUaWxlZExheWVyIAoreworICAgIFdl
YkNvcmU6OkdyYXBoaWNzTGF5ZXIqICAgICAgIF9sYXllck93bmVyOworfQorCisvLyBpbXBsZW1l
bnRzIFdLTGF5ZXJBZGRpdGlvbnMKKy8vIGltcGxlbWVudHMgRXh0ZW5kZWREZXNjcmlwdGlvbgor
CitAZW5kCisKKyNlbmRpZiAvLyBIQVZFX0NBVElMRURfTEFZRVIKKworI2VuZGlmIC8vIFVTRShB
Q0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2VuZGlmIC8vIFdLVGlsZWRMYXllcl9oCisKZGlm
ZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1dLVGlsZWRMYXllci5tbSBi
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1dLVGlsZWRMYXllci5tbQpuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjg4ZjE3Ci0tLSAvZGV2L251bGwKKysrIGIvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvV0tUaWxlZExheWVyLm1tCkBAIC0wLDAgKzEsMTM4
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisg
KiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBw
bGUgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRv
cnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAq
ICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBl
cm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5E
IElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisg
KiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBP
UiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKwor
I2ltcG9ydCAiV0tUaWxlZExheWVyLmgiCisKKyNpZiBIQVZFX0NBVElMRURfTEFZRVIKKworI2lt
cG9ydCAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW1wb3J0ICJHcmFwaGljc0xheWVyLmgiCisjaW1w
b3J0ICJXZWJDb3JlVGV4dFJlbmRlcmVyLmgiCisjaW1wb3J0IDx3dGYvVW51c2VkUGFyYW0uaD4K
KwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK0BpbXBsZW1lbnRhdGlvbiBXS1RpbGVkTGF5
ZXIKKworLy8gU2V0IGEgemVybyBkdXJhdGlvbiBmb3IgdGhlIGZhZGUgaW4gb2YgdGlsZXMKKysg
KENGVGltZUludGVydmFsKWZhZGVEdXJhdGlvbgoreworICAgIHJldHVybiAwOworfQorCisvLyBN
YWtlIHN1cmUgdGhhdCB0aWxlcyBhcmUgZHJhd24gb24gdGhlIG1haW4gdGhyZWFkCisrIChCT09M
KXNob3VsZERyYXdPbk1haW5UaHJlYWQKK3sKKyAgICByZXR1cm4gWUVTOworfQorCisvLyBEaXNh
YmxlIGRlZmF1bHQgYW5pbWF0aW9ucworLSAoaWQ8Q0FBY3Rpb24+KWFjdGlvbkZvcktleTooTlNT
dHJpbmcgKilrZXkKK3sKKyAgICBVTlVTRURfUEFSQU0oa2V5KTsKKyAgICByZXR1cm4gbmlsOwor
fQorCisvLyBJbXBsZW1lbnQgdGhpcyBzbyBwcmVzZW50YXRpb25MYXllciBjYW4gZ2V0IG91ciBj
dXN0b20gYXR0cmlidXRlcworLSAoaWQpaW5pdFdpdGhMYXllcjooaWQpbGF5ZXIKK3sKKyAgICBp
ZiAoKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhMYXllcjpsYXllcl0pKQorICAgICAgICBfbGF5ZXJP
d25lciA9IFsoV0tMYXllciopbGF5ZXIgbGF5ZXJPd25lcl07CisKKyAgICByZXR1cm4gc2VsZjsK
K30KKworLSAodm9pZClzZXROZWVkc0Rpc3BsYXkKK3sKKyAgICBpZiAoX2xheWVyT3duZXIgJiYg
X2xheWVyT3duZXItPmNsaWVudCgpICYmIF9sYXllck93bmVyLT5kcmF3c0NvbnRlbnQoKSkKKyAg
ICAgICAgW3N1cGVyIHNldE5lZWRzRGlzcGxheV07Cit9CisKKy0gKHZvaWQpc2V0TmVlZHNEaXNw
bGF5SW5SZWN0OihDR1JlY3QpaW5EaXJ0eVJlY3QKK3sKKyAgICBpZiAoX2xheWVyT3duZXIgJiYg
X2xheWVyT3duZXItPmNsaWVudCgpICYmIF9sYXllck93bmVyLT5kcmF3c0NvbnRlbnQoKSkgewor
ICAgICAgICBbc3VwZXIgc2V0TmVlZHNEaXNwbGF5SW5SZWN0OmluRGlydHlSZWN0XTsKKworI2lm
bmRlZiBOREVCVUcKKyAgICAgICAgaWYgKF9sYXllck93bmVyLT5zaG93UmVwYWludENvdW50ZXIo
KSkgeworICAgICAgICAgICAgQ0dSZWN0IGFCb3VuZHMgPSBbc2VsZiBib3VuZHNdOworICAgICAg
ICAgICAgW3N1cGVyIHNldE5lZWRzRGlzcGxheUluUmVjdDpDR1JlY3RNYWtlKGFCb3VuZHMub3Jp
Z2luLngsIGFCb3VuZHMub3JpZ2luLnksIDQ2LCAyNSldOworICAgICAgICB9CisjZW5kaWYKKyAg
ICB9Cit9CisKKy0gKHZvaWQpZHJhd0luQ29udGV4dDooQ0dDb250ZXh0UmVmKWN0eAoreworICAg
IFtXS0xheWVyIGRyYXdDb250ZW50czpfbGF5ZXJPd25lciBvZkxheWVyOnNlbGYgaW50b0NvbnRl
eHQ6Y3R4XTsKK30KKworLSAoQk9PTCljb250YWluc1BvaW50OihDR1BvaW50KWluUG9pbnQKK3sK
KyAgICBpZiAoIVtzdXBlciBjb250YWluc1BvaW50OmluUG9pbnRdKQorICAgICAgICByZXR1cm4g
Tk87CisKKyAgICBpZiAoX2xheWVyT3duZXIpIHsKKyAgICAgICAgSW50UG9pbnQgdGhlUG9pbnQo
aW5Qb2ludC54LCBpblBvaW50LnkpOworICAgICAgICByZXR1cm4gX2xheWVyT3duZXItPmNvbnRl
bnRzQ29udGFpblBvaW50KHRoZVBvaW50KTsKKyAgICB9ICAgCisKKyAgICByZXR1cm4gWUVTOwor
fQorCisvLyBvdmVycmlkZSBDQUxheWVyJ3MgaWdub3Jlc0hpdFRlc3RpbmcgYmVjYXVzZSB3ZSB3
YW50IG9wYWNpdHkgMCBsYXllcnMgdG8gaGl0IHRlc3QKKy0gKEJPT0wpaWdub3Jlc0hpdFRlc3Rp
bmcKK3sKKyAgICByZXR1cm4gW3NlbGYgaXNIaWRkZW5dOworfQorCitAZW5kIC8vIGltcGxlbWVu
dGF0aW9uIFdLVGlsZWRMYXllcgorCisjcHJhZ21hIG1hcmsgLQorCitAaW1wbGVtZW50YXRpb24g
V0tUaWxlZExheWVyKFdLTGF5ZXJBZGRpdGlvbnMpCisKKy0gKHZvaWQpc2V0TGF5ZXJPd25lcjoo
R3JhcGhpY3NMYXllciopYUxheWVyCit7CisgICAgX2xheWVyT3duZXIgPSBhTGF5ZXI7Cit9CisK
Ky0gKEdyYXBoaWNzTGF5ZXIqKWxheWVyT3duZXIKK3sKKyAgICByZXR1cm4gX2xheWVyT3duZXI7
Cit9CisKK0BlbmQKKworI2VuZGlmIC8vIEhBVkVfQ0FUSUxFRF9MQVlFUgorCisjZW5kaWYgLy8g
VVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQo=
</data>
<flag name="review"
          id="12774"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>27000</attachid>
            <date>2009-01-24 14:27:48 -0800</date>
            <delta_ts>2009-01-29 13:53:39 -0800</delta_ts>
            <desc>Revised patch</desc>
            <filename>23356_patch.txt</filename>
            <type>text/plain</type>
            <size>117596</size>
            <attacher name="Simon Fraser (smfr)">simon.fraser</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MmI1ZTViNC4uZTBiZjFiYiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzNSBAQAorMjAwOS0wMS0yNCAgU2ltb24gRnJhc2Vy
ICA8c2ltb24uZnJhc2VyQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MjMzNTYKKyAgICAgICAgCisgICAgICAgIEFkZCBuZXcgZmlsZXMgcmVsYXRlZCB0byBhY2Nl
bGVyYXRlZCBjb21wb3NpdGluZzoKKyAgICAgICAgCisgICAgICAgICogV2ViQ29yZS54Y29kZXBy
b2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICBBZGQgdGhlIGZpbGVzIHRvIHRoZSBwcm9qZWN0
LiBBbHNvIGFkZCBDb2xvckNHLmNwcCwgZm9yIHRoZQorICAgICAgICBDb2xvcihDR0NvbG9yUmVm
KSBjb25zdHJ1Y3Rvci4KKyAgICAgICAgCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvR3Jh
cGhpY3NMYXllci5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBo
aWNzTGF5ZXIuaDogQWRkZWQuCisgICAgICAgIEdyYXBoaWNzTGF5ZXIgaXMgYSBwbGF0Zm9ybSBh
YnN0cmFjdGlvbiBmb3IgYSBoYXJkd2FyZS1iYWNrZWQKKyAgICAgICAgbGF5ZXIuCisgICAgICAg
IAorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXJDbGllbnQuaDogQWRk
ZWQuCisgICAgICAgIENsaWVudCBvZiBHcmFwaGljc0xheWVyLCBhbGxvd2luZyBHcmFwaGljc0xh
eWVyIHRvIGNhbGwgb3V0CisgICAgICAgIHRvIFdlYkNvcmUgY29kZS4KKyAgICAgICAgCisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzTGF5ZXJDQS5oOiBBZGRlZC4KKyAg
ICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NMYXllckNBLm1tOiBBZGRlZC4K
KyAgICAgICAgTWFjIENvcmUgQW5pbWF0aW9uIGltcGxlbWVudGF0aW9uIG9mIEdyYXBoaWNzTGF5
ZXIuCisgICAgICAgIAorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9XS0xheWVyLmg6
IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9XS0xheWVyLm1tOiBBZGRl
ZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMvV0tUaWxlZExheWVyLmg6IEFkZGVk
LgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9XS1RpbGVkTGF5ZXIubW06IEFkZGVk
LgorICAgICAgICBTdWJjbGFzc2VzIG9mIENBTGF5ZXIgYW5kIENBVGlsZWRMYXllciAtLSBoZWxw
ZXJzIGZvciB0aGUKKyAgICAgICAgR3JhcGhpY3NMYXllckNBIGltcGxlbWVudGF0aW9uLgorCiAy
MDA5LTAxLTI0ICBEYXJpbiBBZGxlciAgPGRhcmluQGFwcGxlLmNvbT4KIAogICAgICAgICBUcnkg
dG8gZml4IFF0IGJ1aWxkLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9w
cm9qZWN0LnBieHByb2ogYi9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJv
agppbmRleCA4YjIyZDc4Li5mMmZhYmQ5IDEwMDY0NAotLS0gYS9XZWJDb3JlL1dlYkNvcmUueGNv
ZGVwcm9qL3Byb2plY3QucGJ4cHJvagorKysgYi9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3By
b2plY3QucGJ4cHJvagpAQCAtMTQ0LDYgKzE0NCwxMiBAQAogCQkwRjZFQ0Q0NTBGMjUyRjM3MDBC
REUyNzEgLyogQ1NTUHJvcGVydHlMb25naGFuZC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gMEY2RUNENDMwRjI1MkYzNzAwQkRFMjcxIC8qIENTU1Byb3Bl
cnR5TG9uZ2hhbmQuaCAqLzsgfTsKIAkJMEY2RUNENDYwRjI1MkYzNzAwQkRFMjcxIC8qIENTU1By
b3BlcnR5TG9uZ2hhbmQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gMEY2RUNENDQwRjI1MkYzNzAwQkRFMjcxIC8qIENTU1Byb3BlcnR5TG9uZ2hhbmQu
Y3BwICovOyB9OwogCQkwRkM3MDUyMTBFQjE4MTU2MDBCOTBBRDggLyogQXRvbWljU3RyaW5nSGFz
aC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEZDNzA1
MjAwRUIxODE1NjAwQjkwQUQ4IC8qIEF0b21pY1N0cmluZ0hhc2guaCAqLzsgc2V0dGluZ3MgPSB7
QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OworCQkwRkNGMzUyOTBGMkJDNTdFMDA0QjY3
OTUgLyogQ29sb3JDRy5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSAwRkNGMzUyODBGMkJDNTdFMDA0QjY3OTUgLyogQ29sb3JDRy5jcHAgKi87IH07CisJ
CTBGQ0YzNTMyMEYyQkM1OTMwMDRCNjc5NSAvKiBHcmFwaGljc0xheWVyQ2xpZW50LmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkNGMzUyRjBGMkJDNTkz
MDA0QjY3OTUgLyogR3JhcGhpY3NMYXllckNsaWVudC5oICovOyB9OworCQkwRkNGMzUzMzBGMkJD
NTkzMDA0QjY3OTUgLyogR3JhcGhpY3NMYXllci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gMEZDRjM1MzAwRjJCQzU5MzAwNEI2Nzk1IC8qIEdyYXBoaWNz
TGF5ZXIuaCAqLzsgfTsKKwkJMEZDRjM1MzQwRjJCQzU5MzAwNEI2Nzk1IC8qIEdyYXBoaWNzTGF5
ZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEZD
RjM1MzEwRjJCQzU5MzAwNEI2Nzk1IC8qIEdyYXBoaWNzTGF5ZXIuY3BwICovOyB9OworCQkwRkNG
MzUzNzBGMkJDNUIwMDA0QjY3OTUgLyogR3JhcGhpY3NMYXllckNBLmggaW4gSGVhZGVycyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkNGMzUzNTBGMkJDNUIwMDA0QjY3OTUg
LyogR3JhcGhpY3NMYXllckNBLmggKi87IH07CisJCTBGQ0YzNTM4MEYyQkM1QjAwMDRCNjc5NSAv
KiBHcmFwaGljc0xheWVyQ0EubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSAwRkNGMzUzNjBGMkJDNUIwMDA0QjY3OTUgLyogR3JhcGhpY3NMYXllckNBLm1t
ICovOyB9OwogCQkwRkQ3MjM4MjBFQzhCRDkzMDBDQTVERDcgLyogRmxvYXRRdWFkLmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkQ3MjM4MDBFQzhCRDkz
MDBDQTVERDcgLyogRmxvYXRRdWFkLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJp
dmF0ZSwgKTsgfTsgfTsKIAkJMEZENzIzODMwRUM4QkQ5MzAwQ0E1REQ3IC8qIEZsb2F0UXVhZC5j
cHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkQ3MjM4
MTBFQzhCRDkzMDBDQTVERDcgLyogRmxvYXRRdWFkLmNwcCAqLzsgfTsKIAkJMTQwMjY0NUUwQUZE
QzE5QjAwNTkxOUUyIC8qIExvZ2dpbmdNYWMubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSAxNDAyNjQ1RDBBRkRDMTlCMDA1OTE5RTIgLyogTG9nZ2luZ01h
Yy5tbSAqLzsgfTsKQEAgLTQ5ODcsNiArNDk5MywxMiBAQAogCQkwRjZFQ0Q0MzBGMjUyRjM3MDBC
REUyNzEgLyogQ1NTUHJvcGVydHlMb25naGFuZC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IHBhdGggPSBDU1NQcm9wZXJ0eUxvbmdoYW5kLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CiAJCTBGNkVDRDQ0MEYyNTJGMzcwMEJERTI3MSAvKiBDU1NQcm9wZXJ0eUxvbmdoYW5kLmNwcCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IENTU1Byb3BlcnR5TG9uZ2hhbmQu
Y3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkwRkM3MDUyMDBFQjE4MTU2MDBCOTBB
RDggLyogQXRvbWljU3RyaW5nSGFzaC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGgg
PSBBdG9taWNTdHJpbmdIYXNoLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTBGQ0Yz
NTI4MEYyQkM1N0UwMDRCNjc5NSAvKiBDb2xvckNHLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Y3BwLmNwcDsgcGF0aCA9IENvbG9yQ0cuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owor
CQkwRkNGMzUyRjBGMkJDNTkzMDA0QjY3OTUgLyogR3JhcGhpY3NMYXllckNsaWVudC5oICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBHcmFwaGljc0xheWVyQ2xpZW50Lmg7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTBGQ0YzNTMwMEYyQkM1OTMwMDRCNjc5NSAvKiBHcmFw
aGljc0xheWVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEdyYXBoaWNzTGF5
ZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMEZDRjM1MzEwRjJCQzU5MzAwNEI2
Nzk1IC8qIEdyYXBoaWNzTGF5ZXIuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBw
YXRoID0gR3JhcGhpY3NMYXllci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTBG
Q0YzNTM1MEYyQkM1QjAwMDRCNjc5NSAvKiBHcmFwaGljc0xheWVyQ0EuaCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuYy5oOyBwYXRoID0gR3JhcGhpY3NMYXllckNBLmg7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CisJCTBGQ0YzNTM2MEYyQkM1QjAwMDRCNjc5NSAvKiBHcmFwaGljc0xheWVyQ0Eu
bW0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5vYmpjcHA7IHBhdGggPSBHcmFwaGljc0xheWVy
Q0EubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGRDcyMzgwMEVDOEJEOTMwMENB
NURENyAvKiBGbG9hdFF1YWQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRmxv
YXRRdWFkLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGRDcyMzgxMEVDOEJEOTMw
MENBNURENyAvKiBGbG9hdFF1YWQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBw
YXRoID0gRmxvYXRRdWFkLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMTQwMjY0
NUQwQUZEQzE5QjAwNTkxOUUyIC8qIExvZ2dpbmdNYWMubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jcHAub2JqY3BwOyBwYXRoID0gTG9nZ2luZ01hYy5tbTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKQEAgLTEyOTI3LDYgKzEyOTM5LDcgQEAKIAkJQjI3NTM1MjkwQjA1MzgxNDAwMkNFNjRG
IC8qIGNnICovID0gewogCQkJaXNhID0gUEJYR3JvdXA7CiAJCQljaGlsZHJlbiA9ICgKKwkJCQkw
RkNGMzUyODBGMkJDNTdFMDA0QjY3OTUgLyogQ29sb3JDRy5jcHAgKi8sCiAJCQkJQjI3NTM1MkIw
QjA1MzgxNDAwMkNFNjRGIC8qIEZsb2F0UG9pbnRDRy5jcHAgKi8sCiAJCQkJQjI3NTM1MkMwQjA1
MzgxNDAwMkNFNjRGIC8qIEZsb2F0UmVjdENHLmNwcCAqLywKIAkJCQlCMjc1MzUyRDBCMDUzODE0
MDAyQ0U2NEYgLyogRmxvYXRTaXplQ0cuY3BwICovLApAQCAtMTI5NzAsNiArMTI5ODMsOCBAQAog
CQkJCUIyQUZGQzdBMEQwMEE1QzEwMDMwMDc0RCAvKiBGb250UGxhdGZvcm1EYXRhTWFjLm1tICov
LAogCQkJCUIyQUZGQzdCMEQwMEE1QzEwMDMwMDc0RCAvKiBHbHlwaFBhZ2VUcmVlTm9kZU1hYy5j
cHAgKi8sCiAJCQkJQjI3N0I0MDMwQjIyRjM3QzAwMDRCRUM2IC8qIEdyYXBoaWNzQ29udGV4dE1h
Yy5tbSAqLywKKwkJCQkwRkNGMzUzNjBGMkJDNUIwMDA0QjY3OTUgLyogR3JhcGhpY3NMYXllckNB
Lm1tICovLAorCQkJCTBGQ0YzNTM1MEYyQkM1QjAwMDRCNjc5NSAvKiBHcmFwaGljc0xheWVyQ0Eu
aCAqLywKIAkJCQlCMjc1MzU4RDBCMDUzQTY2MDAyQ0U2NEYgLyogSWNvbk1hYy5tbSAqLywKIAkJ
CQlCMjc1MzU0RTBCMDUzODE0MDAyQ0U2NEYgLyogSW1hZ2VNYWMubW0gKi8sCiAJCQkJQjI3NTM1
NEYwQjA1MzgxNDAwMkNFNjRGIC8qIEludFBvaW50TWFjLm1tICovLApAQCAtMTMwMzMsNiArMTMw
NDgsOSBAQAogCQkJCUIyQTAxNTkyMEFGNkNENTMwMDZCQ0UwRSAvKiBHcmFwaGljc0NvbnRleHQu
Y3BwICovLAogCQkJCUIyQTAxNTkzMEFGNkNENTMwMDZCQ0UwRSAvKiBHcmFwaGljc0NvbnRleHQu
aCAqLywKIAkJCQlBODhGRTMzMzBFNUVFRTg3MDA4RDhDMEYgLyogR3JhcGhpY3NDb250ZXh0UHJp
dmF0ZS5oICovLAorCQkJCTBGQ0YzNTMxMEYyQkM1OTMwMDRCNjc5NSAvKiBHcmFwaGljc0xheWVy
LmNwcCAqLywKKwkJCQkwRkNGMzUzMDBGMkJDNTkzMDA0QjY3OTUgLyogR3JhcGhpY3NMYXllci5o
ICovLAorCQkJCTBGQ0YzNTJGMEYyQkM1OTMwMDRCNjc5NSAvKiBHcmFwaGljc0xheWVyQ2xpZW50
LmggKi8sCiAJCQkJQjJBMDE1OTQwQUY2Q0Q1MzAwNkJDRTBFIC8qIEdyYXBoaWNzVHlwZXMuY3Bw
ICovLAogCQkJCUIyQTAxNTk1MEFGNkNENTMwMDZCQ0UwRSAvKiBHcmFwaGljc1R5cGVzLmggKi8s
CiAJCQkJQjI3NTM1NDAwQjA1MzgxNDAwMkNFNjRGIC8qIEljb24uaCAqLywKQEAgLTE2NjUyLDYg
KzE2NjcwLDkgQEAKIAkJCQk5MzMwOUUxRTA5OUU2NDkyMDA1NkU1ODEgLyogdmlzaWJsZV91bml0
cy5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMThBMDUzN0QwRjI2ODU5QzAwQTUxNzA1IC8qIFdvcmtl
clJ1bkxvb3AuaCBpbiBIZWFkZXJzICovLAogCQkJCTUxQzBBQTM5MEYyQUExMEEwMDE2NDhDMiAv
KiBDYWNoZWRGcmFtZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMEZDRjM1MzIwRjJCQzU5MzAwNEI2
Nzk1IC8qIEdyYXBoaWNzTGF5ZXJDbGllbnQuaCBpbiBIZWFkZXJzICovLAorCQkJCTBGQ0YzNTMz
MEYyQkM1OTMwMDRCNjc5NSAvKiBHcmFwaGljc0xheWVyLmggaW4gSGVhZGVycyAqLywKKwkJCQkw
RkNGMzUzNzBGMkJDNUIwMDA0QjY3OTUgLyogR3JhcGhpY3NMYXllckNBLmggaW4gSGVhZGVycyAq
LywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJ
fTsKQEAgLTE4NjI1LDYgKzE4NjQ2LDkgQEAKIAkJCQk5MzMwOUUxRDA5OUU2NDkyMDA1NkU1ODEg
LyogdmlzaWJsZV91bml0cy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk1MUMwQUE0MTBGMkFBMTVF
MDAxNjQ4QzIgLyogQ2FjaGVkRnJhbWUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJOTNCQTU5QjIw
RjJBQTVGRTAwOEU4RTk5IC8qIEpTQ0RBVEFTZWN0aW9uQ3VzdG9tLmNwcCBpbiBTb3VyY2VzICov
LAorCQkJCTBGQ0YzNTI5MEYyQkM1N0UwMDRCNjc5NSAvKiBDb2xvckNHLmNwcCBpbiBTb3VyY2Vz
ICovLAorCQkJCTBGQ0YzNTM0MEYyQkM1OTMwMDRCNjc5NSAvKiBHcmFwaGljc0xheWVyLmNwcCBp
biBTb3VyY2VzICovLAorCQkJCTBGQ0YzNTM4MEYyQkM1QjAwMDRCNjc5NSAvKiBHcmFwaGljc0xh
eWVyQ0EubW0gaW4gU291cmNlcyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBv
c3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvR3JhcGhpY3NMYXllci5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBo
aWNzTGF5ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5Y2I3MDcK
LS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5
ZXIuY3BwCkBAIC0wLDAgKzEsNTM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBVU0Uo
QUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJHcmFwaGljc0xheWVyLmgiCisK
KyNpbmNsdWRlICJGbG9hdFBvaW50LmgiCisjaW5jbHVkZSAiUm90YXRlVHJhbnNmb3JtT3BlcmF0
aW9uLmgiCisjaW5jbHVkZSAiVGV4dFN0cmVhbS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K3ZvaWQgR3JhcGhpY3NMYXllcjo6RmxvYXRWYWx1ZTo6c2V0KGZsb2F0IGtleSwgZmxvYXQgdmFs
dWUsIGNvbnN0IFRpbWluZ0Z1bmN0aW9uKiB0aW1pbmdGdW5jdGlvbikKK3sKKyAgICBtX2tleSA9
IGtleTsKKyAgICBtX3ZhbHVlID0gdmFsdWU7CisgICAgaWYgKHRpbWluZ0Z1bmN0aW9uICE9IG1f
dGltaW5nRnVuY3Rpb24pIHsKKyAgICAgICAgaWYgKHRpbWluZ0Z1bmN0aW9uKQorICAgICAgICAg
ICAgbV90aW1pbmdGdW5jdGlvbi5zZXQobmV3IFRpbWluZ0Z1bmN0aW9uKCp0aW1pbmdGdW5jdGlv
bikpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtX3RpbWluZ0Z1bmN0aW9uLmNsZWFyKCk7
CisgICAgfQorfQorCit2b2lkIEdyYXBoaWNzTGF5ZXI6OlRyYW5zZm9ybVZhbHVlOjpzZXQoZmxv
YXQga2V5LCBjb25zdCBUcmFuc2Zvcm1PcGVyYXRpb25zKiB2YWx1ZSwgY29uc3QgVGltaW5nRnVu
Y3Rpb24qIHRpbWluZ0Z1bmN0aW9uKQoreworICAgIG1fa2V5ID0ga2V5OworICAgIGlmICh2YWx1
ZSAhPSBtX3ZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSkKKyAgICAgICAgICAgIG1fdmFsdWUu
c2V0KG5ldyBUcmFuc2Zvcm1PcGVyYXRpb25zKCp2YWx1ZSkpOworICAgICAgICBlbHNlCisgICAg
ICAgICAgICBtX3ZhbHVlLmNsZWFyKCk7CisgICAgfQorICAgIGlmICh0aW1pbmdGdW5jdGlvbiAh
PSBtX3RpbWluZ0Z1bmN0aW9uKSB7CisgICAgICAgIGlmICh0aW1pbmdGdW5jdGlvbikKKyAgICAg
ICAgICAgIG1fdGltaW5nRnVuY3Rpb24uc2V0KG5ldyBUaW1pbmdGdW5jdGlvbigqdGltaW5nRnVu
Y3Rpb24pKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbV90aW1pbmdGdW5jdGlvbi5jbGVh
cigpOworICAgIH0KK30KKwordm9pZCBHcmFwaGljc0xheWVyOjpGbG9hdFZhbHVlTGlzdDo6aW5z
ZXJ0KGZsb2F0IGtleSwgZmxvYXQgdmFsdWUsIGNvbnN0IFRpbWluZ0Z1bmN0aW9uKiB0aW1pbmdG
dW5jdGlvbikKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fdmFsdWVzLnNpemUoKTsg
KytpKSB7CisgICAgICAgIEZsb2F0VmFsdWUmIGN1ckZsb2F0VmFsdWUgPSBtX3ZhbHVlc1tpXTsK
KyAgICAgICAgaWYgKGN1ckZsb2F0VmFsdWUua2V5KCkgPT0ga2V5KSB7CisgICAgICAgICAgICBj
dXJGbG9hdFZhbHVlLnNldChrZXksIHZhbHVlLCB0aW1pbmdGdW5jdGlvbik7CisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1ckZsb2F0VmFsdWUua2V5KCkgPiBr
ZXkpIHsKKyAgICAgICAgICAgIC8vIGluc2VydCBiZWZvcmUKKyAgICAgICAgICAgIG1fdmFsdWVz
Lmluc2VydChpLCBGbG9hdFZhbHVlKGtleSwgdmFsdWUsIHRpbWluZ0Z1bmN0aW9uKSk7CisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8gYXBwZW5kCisg
ICAgbV92YWx1ZXMuYXBwZW5kKEZsb2F0VmFsdWUoa2V5LCB2YWx1ZSwgdGltaW5nRnVuY3Rpb24p
KTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyOjpUcmFuc2Zvcm1WYWx1ZUxpc3Q6Omluc2VydChm
bG9hdCBrZXksIGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMqIHZhbHVlLCBjb25zdCBUaW1pbmdG
dW5jdGlvbiogdGltaW5nRnVuY3Rpb24pCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBt
X3ZhbHVlcy5zaXplKCk7ICsraSkgeworICAgICAgICBUcmFuc2Zvcm1WYWx1ZSYgY3VyVHJhbnNW
YWx1ZSA9IG1fdmFsdWVzW2ldOworICAgICAgICBpZiAoY3VyVHJhbnNWYWx1ZS5rZXkoKSA9PSBr
ZXkpIHsKKyAgICAgICAgICAgIGN1clRyYW5zVmFsdWUuc2V0KGtleSwgdmFsdWUsIHRpbWluZ0Z1
bmN0aW9uKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3Vy
VHJhbnNWYWx1ZS5rZXkoKSA+IGtleSkgeworICAgICAgICAgICAgLy8gaW5zZXJ0IGJlZm9yZQor
ICAgICAgICAgICAgbV92YWx1ZXMuaW5zZXJ0KGksIFRyYW5zZm9ybVZhbHVlKGtleSwgdmFsdWUs
IHRpbWluZ0Z1bmN0aW9uKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9
CisgICAgCisgICAgLy8gYXBwZW5kCisgICAgbV92YWx1ZXMuYXBwZW5kKFRyYW5zZm9ybVZhbHVl
KGtleSwgdmFsdWUsIHRpbWluZ0Z1bmN0aW9uKSk7Cit9CisKKy8vIEFuICJpbnZhbGlkIiBsaXN0
IGlzIG9uZSB3aG9zZSBmdW5jdGlvbnMgZG9uJ3QgbWF0Y2gsIGFuZCB0aGVyZWZvcmUgaGFzIHRv
IGJlIGFuaW1hdGVkIGFzIGEgTWF0cml4CisvLyBUaGUgaGFzQmlnUm90YXRpb24gZmxhZyB3aWxs
IGFsd2F5cyByZXR1cm4gZmFsc2UgaWYgaXNWYWxpZCBpcyBmYWxzZS4gT3RoZXJ3aXNlIGhhc0Jp
Z1JvdGF0aW9uIGlzIAorLy8gdHJ1ZSBpZiB0aGUgcm90YXRpb24gYmV0d2VlbiBhbnkgdHdvIGtl
eWZyYW1lcyBpcyA+PSAxODAgZGVncmVlcy4KK3ZvaWQgR3JhcGhpY3NMYXllcjo6VHJhbnNmb3Jt
VmFsdWVMaXN0OjptYWtlRnVuY3Rpb25MaXN0KEZ1bmN0aW9uTGlzdCYgbGlzdCwgYm9vbCYgaXNW
YWxpZCwgYm9vbCYgaGFzQmlnUm90YXRpb24pIGNvbnN0Cit7CisgICAgbGlzdC5jbGVhcigpOwor
ICAgIGlzVmFsaWQgPSBmYWxzZTsKKyAgICBoYXNCaWdSb3RhdGlvbiA9IGZhbHNlOworICAgIAor
ICAgIGlmIChtX3ZhbHVlcy5zaXplKCkgPCAyKQorICAgICAgICByZXR1cm47CisgICAgCisgICAg
Ly8gZW1wdHkgdHJhbnNmb3JtcyBtYXRjaCBhbnl0aGluZywgc28gZmluZCB0aGUgZmlyc3Qgbm9u
LWVtcHR5IGVudHJ5IGFzIHRoZSByZWZlcmVuY2UKKyAgICBzaXplX3QgZmlyc3RJbmRleCA9IDA7
CisgICAgZm9yICggOyBmaXJzdEluZGV4IDwgbV92YWx1ZXMuc2l6ZSgpOyArK2ZpcnN0SW5kZXgp
IHsKKyAgICAgICAgaWYgKG1fdmFsdWVzW2ZpcnN0SW5kZXhdLnZhbHVlKCktPm9wZXJhdGlvbnMo
KS5zaXplKCkgPiAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIGlmIChm
aXJzdEluZGV4ID49IG1fdmFsdWVzLnNpemUoKSkKKyAgICAgICAgcmV0dXJuOworICAgICAgICAK
KyAgICBjb25zdCBUcmFuc2Zvcm1PcGVyYXRpb25zKiBmaXJzdFZhbCA9IG1fdmFsdWVzW2ZpcnN0
SW5kZXhdLnZhbHVlKCk7CisgICAgCisgICAgLy8gc2VlIGlmIHRoZSBrZXlmcmFtZXMgYXJlIHZh
bGlkCisgICAgZm9yIChzaXplX3QgaSA9IGZpcnN0SW5kZXggKyAxOyBpIDwgbV92YWx1ZXMuc2l6
ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgVHJhbnNmb3JtT3BlcmF0aW9ucyogdmFsID0gbV92
YWx1ZXNbaV0udmFsdWUoKTsKKyAgICAgICAgCisgICAgICAgIC8vIGEgbnVsbCB0cmFuc2Zvcm0g
bWF0Y2hlcyBhbnl0aGluZworICAgICAgICBpZiAodmFsLT5vcGVyYXRpb25zKCkuaXNFbXB0eSgp
KQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAKKyAgICAgICAgaWYgKGZpcnN0
VmFsLT5vcGVyYXRpb25zKCkuc2l6ZSgpICE9IHZhbC0+b3BlcmF0aW9ucygpLnNpemUoKSkKKyAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIAorICAgICAgICBmb3IgKHNpemVfdCBqID0g
MDsgaiA8IGZpcnN0VmFsLT5vcGVyYXRpb25zKCkuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAg
IGlmICghZmlyc3RWYWwtPm9wZXJhdGlvbnMoKS5hdChqKS0+aXNTYW1lVHlwZSgqdmFsLT5vcGVy
YXRpb25zKCkuYXQoaikpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAg
IH0KKworICAgIC8vIGtleWZyYW1lcyBhcmUgdmFsaWQsIGZpbGwgaW4gdGhlIGxpc3QKKyAgICBp
c1ZhbGlkID0gdHJ1ZTsKKyAgICAKKyAgICBkb3VibGUgbGFzdFJvdEFuZ2xlID0gMC4wOworICAg
IGRvdWJsZSBtYXhSb3RBbmdsZSA9IC0xLjA7CisgICAgICAgIAorICAgIGxpc3QucmVzaXplKGZp
cnN0VmFsLT5vcGVyYXRpb25zKCkuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8
IGZpcnN0VmFsLT5vcGVyYXRpb25zKCkuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgVHJhbnNmb3Jt
T3BlcmF0aW9uOjpPcGVyYXRpb25UeXBlIHR5cGUgPSBmaXJzdFZhbC0+b3BlcmF0aW9ucygpLmF0
KGopLT5nZXRPcGVyYXRpb25UeXBlKCk7CisgICAgICAgIGxpc3Rbal0gPSB0eXBlOworICAgICAg
ICAKKyAgICAgICAgLy8gaWYgdGhpcyBpcyBhIHJvdGF0aW9uIGVudHJ5LCB3ZSBuZWVkIHRvIHNl
ZSBpZiBhbnkgYW5nbGUgZGlmZmVyZW5jZXMgYXJlID49IDE4MCBkZWcKKyAgICAgICAgaWYgKHR5
cGUgPT0gVHJhbnNmb3JtT3BlcmF0aW9uOjpST1RBVEUpIHsKKyAgICAgICAgICAgIGxhc3RSb3RB
bmdsZSA9IHN0YXRpY19jYXN0PFJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbio+KGZpcnN0VmFsLT5v
cGVyYXRpb25zKCkuYXQoaikuZ2V0KCkpLT5hbmdsZSgpOworICAgICAgICAgICAgCisgICAgICAg
ICAgICBpZiAobWF4Um90QW5nbGUgPCAwKQorICAgICAgICAgICAgICAgIG1heFJvdEFuZ2xlID0g
ZmFicyhsYXN0Um90QW5nbGUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKHNpemVf
dCBpID0gZmlyc3RJbmRleCArIDE7IGkgPCBtX3ZhbHVlcy5zaXplKCk7ICsraSkgeworICAgICAg
ICAgICAgICAgIGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMqIHZhbCA9IG1fdmFsdWVzW2ldLnZh
bHVlKCk7CisgICAgICAgICAgICAgICAgZG91YmxlIHJvdEFuZ2xlID0gdmFsLT5vcGVyYXRpb25z
KCkuaXNFbXB0eSgpID8gMCA6IChzdGF0aWNfY2FzdDxSb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb24q
Pih2YWwtPm9wZXJhdGlvbnMoKS5hdChqKS5nZXQoKSktPmFuZ2xlKCkpOworICAgICAgICAgICAg
ICAgIGRvdWJsZSBkaWZmQW5nbGUgPSBmYWJzKHJvdEFuZ2xlIC0gbGFzdFJvdEFuZ2xlKTsKKyAg
ICAgICAgICAgICAgICBpZiAoZGlmZkFuZ2xlID4gbWF4Um90QW5nbGUpCisgICAgICAgICAgICAg
ICAgICAgIG1heFJvdEFuZ2xlID0gZGlmZkFuZ2xlOworICAgICAgICAgICAgICAgIGxhc3RSb3RB
bmdsZSA9IHJvdEFuZ2xlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAor
ICAgIGhhc0JpZ1JvdGF0aW9uID0gbWF4Um90QW5nbGUgPj0gMTgwLjA7Cit9CisKK0dyYXBoaWNz
TGF5ZXI6OkdyYXBoaWNzTGF5ZXIoR3JhcGhpY3NMYXllckNsaWVudCogY2xpZW50KQorICAgIDog
bV9jbGllbnQoY2xpZW50KQorICAgICwgbV9hbmNob3JQb2ludCgwLjVmLCAwLjVmLCAwKQorICAg
ICwgbV9vcGFjaXR5KDEpCisjaWZuZGVmIE5ERUJVRworICAgICwgbV96UG9zaXRpb24oMCkKKyNl
bmRpZgorICAgICwgbV9iYWNrZ3JvdW5kQ29sb3JTZXQoZmFsc2UpCisgICAgLCBtX2NvbnRlbnRz
T3BhcXVlKGZhbHNlKQorICAgICwgbV9wcmVzZXJ2ZXMzRChmYWxzZSkKKyAgICAsIG1fYmFja2Zh
Y2VWaXNpYmlsaXR5KHRydWUpCisgICAgLCBtX3VzaW5nVGlsZWRMYXllcihmYWxzZSkKKyAgICAs
IG1fbWFza3NUb0JvdW5kcyhmYWxzZSkKKyAgICAsIG1fZHJhd3NDb250ZW50KGZhbHNlKQorICAg
ICwgbV9wYWludGluZ1BoYXNlKEdyYXBoaWNzTGF5ZXJQYWludEFsbE1hc2spCisgICAgLCBtX3Bh
cmVudCgwKQorI2lmbmRlZiBOREVCVUcKKyAgICAsIG1fcmVwYWludENvdW50KDApCisjZW5kaWYK
K3sKK30KKworR3JhcGhpY3NMYXllcjo6fkdyYXBoaWNzTGF5ZXIoKQoreworICAgIHJlbW92ZUFs
bEFuaW1hdGlvbnMoKTsgICAgCisKKyAgICByZW1vdmVBbGxDaGlsZHJlbigpOworICAgIHJlbW92
ZUZyb21QYXJlbnQoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyOjphZGRDaGlsZChHcmFwaGlj
c0xheWVyKiBjaGlsZExheWVyKQoreworICAgIEFTU0VSVChjaGlsZExheWVyICE9IHRoaXMpOwor
ICAgIAorICAgIGlmIChjaGlsZExheWVyLT5wYXJlbnQoKSkKKyAgICAgICAgY2hpbGRMYXllci0+
cmVtb3ZlRnJvbVBhcmVudCgpOworCisgICAgY2hpbGRMYXllci0+c2V0UGFyZW50KHRoaXMpOwor
ICAgIG1fY2hpbGRyZW4uYXBwZW5kKGNoaWxkTGF5ZXIpOworfQorCit2b2lkIEdyYXBoaWNzTGF5
ZXI6OmFkZENoaWxkQXRJbmRleChHcmFwaGljc0xheWVyKiBjaGlsZExheWVyLCBpbnQgaW5kZXgp
Cit7CisgICAgQVNTRVJUKGNoaWxkTGF5ZXIgIT0gdGhpcyk7CisKKyAgICBpZiAoY2hpbGRMYXll
ci0+cGFyZW50KCkpCisgICAgICAgIGNoaWxkTGF5ZXItPnJlbW92ZUZyb21QYXJlbnQoKTsKKwor
ICAgIGNoaWxkTGF5ZXItPnNldFBhcmVudCh0aGlzKTsKKyAgICBtX2NoaWxkcmVuLmluc2VydChp
bmRleCwgY2hpbGRMYXllcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllcjo6YWRkQ2hpbGRCZWxv
dyhHcmFwaGljc0xheWVyKiBjaGlsZExheWVyLCBHcmFwaGljc0xheWVyKiBzaWJsaW5nKQorewor
ICAgIEFTU0VSVChjaGlsZExheWVyICE9IHRoaXMpOworICAgIGNoaWxkTGF5ZXItPnJlbW92ZUZy
b21QYXJlbnQoKTsKKworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgbV9jaGlsZHJlbi5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoc2libGlu
ZyA9PSBtX2NoaWxkcmVuW2ldKSB7CisgICAgICAgICAgICBtX2NoaWxkcmVuLmluc2VydChpLCBj
aGlsZExheWVyKTsKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICB9CisgICAgfQorCisgICAgY2hpbGRMYXllci0+c2V0UGFyZW50KHRoaXMpOwor
CisgICAgaWYgKCFmb3VuZCkKKyAgICAgICAgbV9jaGlsZHJlbi5hcHBlbmQoY2hpbGRMYXllcik7
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllcjo6YWRkQ2hpbGRBYm92ZShHcmFwaGljc0xheWVyKiBj
aGlsZExheWVyLCBHcmFwaGljc0xheWVyKiBzaWJsaW5nKQoreworICAgIGNoaWxkTGF5ZXItPnJl
bW92ZUZyb21QYXJlbnQoKTsKKyAgICBBU1NFUlQoY2hpbGRMYXllciAhPSB0aGlzKTsKKworICAg
IGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9jaGls
ZHJlbi5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoc2libGluZyA9PSBtX2NoaWxkcmVuW2ld
KSB7CisgICAgICAgICAgICBtX2NoaWxkcmVuLmluc2VydChpKzEsIGNoaWxkTGF5ZXIpOworICAg
ICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICBjaGlsZExheWVyLT5zZXRQYXJlbnQodGhpcyk7CisKKyAgICBpZiAoIWZvdW5k
KQorICAgICAgICBtX2NoaWxkcmVuLmFwcGVuZChjaGlsZExheWVyKTsKK30KKworYm9vbCBHcmFw
aGljc0xheWVyOjpyZXBsYWNlQ2hpbGQoR3JhcGhpY3NMYXllciogb2xkQ2hpbGQsIEdyYXBoaWNz
TGF5ZXIqIG5ld0NoaWxkKQoreworICAgIEFTU0VSVCghbmV3Q2hpbGQtPnBhcmVudCgpKTsKKyAg
ICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fY2hp
bGRyZW4uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG9sZENoaWxkID09IG1fY2hpbGRyZW5b
aV0pIHsKKyAgICAgICAgICAgIG1fY2hpbGRyZW5baV0gPSBuZXdDaGlsZDsKKyAgICAgICAgICAg
IGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAg
IGlmIChmb3VuZCkgeworICAgICAgICBvbGRDaGlsZC0+c2V0UGFyZW50KDApOworCisgICAgICAg
IG5ld0NoaWxkLT5yZW1vdmVGcm9tUGFyZW50KCk7CisgICAgICAgIG5ld0NoaWxkLT5zZXRQYXJl
bnQodGhpcyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllcjo6cmVtb3ZlQWxsQ2hpbGRyZW4oKQoreworICAgIHdo
aWxlIChtX2NoaWxkcmVuLnNpemUoKSkgeworICAgICAgICBHcmFwaGljc0xheWVyKiBjdXJMYXll
ciA9IG1fY2hpbGRyZW5bMF07CisgICAgICAgIEFTU0VSVChjdXJMYXllci0+cGFyZW50KCkpOwor
ICAgICAgICBjdXJMYXllci0+cmVtb3ZlRnJvbVBhcmVudCgpOworICAgIH0KK30KKwordm9pZCBH
cmFwaGljc0xheWVyOjpyZW1vdmVGcm9tUGFyZW50KCkKK3sKKyAgICBpZiAobV9wYXJlbnQpIHsK
KyAgICAgICAgdW5zaWduZWQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1fcGFyZW50LT5t
X2NoaWxkcmVuLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBtX3BhcmVu
dC0+bV9jaGlsZHJlbltpXSkgeworICAgICAgICAgICAgICAgIG1fcGFyZW50LT5tX2NoaWxkcmVu
LnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorCisgICAgICAgIHNldFBhcmVudCgwKTsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NM
YXllcjo6c2V0QmFja2dyb3VuZENvbG9yKGNvbnN0IENvbG9yJiBpbkNvbG9yLCBjb25zdCBBbmlt
YXRpb24qLCBkb3VibGUgLypiZWdpblRpbWUqLykKK3sKKyAgICBtX2JhY2tncm91bmRDb2xvciA9
IGluQ29sb3I7CisgICAgbV9iYWNrZ3JvdW5kQ29sb3JTZXQgPSB0cnVlOworfQorCit2b2lkIEdy
YXBoaWNzTGF5ZXI6OmNsZWFyQmFja2dyb3VuZENvbG9yKCkKK3sKKyAgICBtX2JhY2tncm91bmRD
b2xvciA9IENvbG9yKCk7CisgICAgbV9iYWNrZ3JvdW5kQ29sb3JTZXQgPSBmYWxzZTsKK30KKwor
Ym9vbCBHcmFwaGljc0xheWVyOjpzZXRPcGFjaXR5KGZsb2F0IG9wYWNpdHksIGNvbnN0IEFuaW1h
dGlvbiosIGRvdWJsZSkKK3sKKyAgICBtX29wYWNpdHkgPSBvcGFjaXR5OworICAgIHJldHVybiBm
YWxzZTsgICAgICAgLy8gbm90IGFuaW1hdGluZworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXI6OnBh
aW50R3JhcGhpY3NMYXllckNvbnRlbnRzKEdyYXBoaWNzQ29udGV4dCYgY29udGV4dCwgY29uc3Qg
SW50UmVjdCYgY2xpcCkKK3sKKyAgICBtX2NsaWVudC0+cGFpbnRDb250ZW50cyh0aGlzLCBjb250
ZXh0LCBtX3BhaW50aW5nUGhhc2UsIGNsaXApOworfQorCitTdHJpbmcgR3JhcGhpY3NMYXllcjo6
cHJvcGVydHlJZFRvU3RyaW5nKEFuaW1hdGVkUHJvcGVydHlJRCBwcm9wZXJ0eSkKK3sKKyAgICBz
d2l0Y2ggKHByb3BlcnR5KSB7CisgICAgICAgIGNhc2UgQW5pbWF0ZWRQcm9wZXJ0eVdlYmtpdFRy
YW5zZm9ybToKKyAgICAgICAgICAgIHJldHVybiAidHJhbnNmb3JtIjsKKyAgICAgICAgY2FzZSBB
bmltYXRlZFByb3BlcnR5T3BhY2l0eToKKyAgICAgICAgICAgIHJldHVybiAib3BhY2l0eSI7Cisg
ICAgICAgIGNhc2UgQW5pbWF0ZWRQcm9wZXJ0eUJhY2tncm91bmRDb2xvcjoKKyAgICAgICAgICAg
IHJldHVybiAiYmFja2dyb3VuZENvbG9yIjsKKyAgICAgICAgY2FzZSBBbmltYXRlZFByb3BlcnR5
SW52YWxpZDoKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KKyAgICBy
ZXR1cm4gIiI7Cit9CisKK2ludCBHcmFwaGljc0xheWVyOjpmaW5kQW5pbWF0aW9uRW50cnkoQW5p
bWF0ZWRQcm9wZXJ0eUlEIHByb3BlcnR5LCBzaG9ydCBpbmRleCkgY29uc3QKK3sKKyAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IG1fYW5pbWF0aW9ucy5zaXplKCk7ICsraSkgeworICAgICAgICBp
ZiAobV9hbmltYXRpb25zW2ldLm1hdGNoZXMocHJvcGVydHksIGluZGV4KSkKKyAgICAgICAgICAg
IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGkpOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisK
K3ZvaWQgR3JhcGhpY3NMYXllcjo6YWRkQW5pbWF0aW9uRW50cnkoQW5pbWF0ZWRQcm9wZXJ0eUlE
IHByb3BlcnR5LCBzaG9ydCBpbmRleCwgYm9vbCBpc1RyYW5zaXRpb24sIGNvbnN0IEFuaW1hdGlv
biogdHJhbnNpdGlvbikKK3sKKyAgICBpbnQgaSA9IGZpbmRBbmltYXRpb25FbnRyeShwcm9wZXJ0
eSwgaW5kZXgpOworICAgIAorICAgIGlmIChpID49IDApCisgICAgICAgIG1fYW5pbWF0aW9uc1tp
XS5yZXNldCh0cmFuc2l0aW9uLCBpc1RyYW5zaXRpb24pOworICAgIGVsc2UKKyAgICAgICAgbV9h
bmltYXRpb25zLmFwcGVuZChBbmltYXRpb25FbnRyeSh0cmFuc2l0aW9uLCBwcm9wZXJ0eSwgaW5k
ZXgsIGlzVHJhbnNpdGlvbikpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXI6OnJlbW92ZUFsbEFu
aW1hdGlvbnMoKQoreworICAgIHNpemVfdCBzaXplID0gbV9hbmltYXRpb25zLnNpemUoKTsKKyAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkKKyAgICAgICAgcmVtb3ZlQW5pbWF0
aW9uKDAsIHRydWUpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXI6OnJlbW92ZUFsbEFuaW1hdGlv
bnNGb3JQcm9wZXJ0eShBbmltYXRlZFByb3BlcnR5SUQgcHJvcGVydHkpCit7CisgICAgZm9yIChz
aG9ydCBqID0gMDsgOyArK2opIHsKKyAgICAgICAgaW50IGkgPSBmaW5kQW5pbWF0aW9uRW50cnko
cHJvcGVydHksIGopOworICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgcmVtb3ZlQW5pbWF0aW9uKGksIGZhbHNlKTsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhp
Y3NMYXllcjo6cmVtb3ZlRmluaXNoZWRBbmltYXRpb25zKGNvbnN0IFN0cmluZyYgbmFtZSwgaW50
IC8qaW5kZXgqLywgYm9vbCByZXNldCkKK3sKKyAgICBzaXplX3Qgc2l6ZSA9IG1fYW5pbWF0aW9u
cy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyApIHsKKyAgICAgICAg
QW5pbWF0aW9uRW50cnkmIGFuaW0gPSBtX2FuaW1hdGlvbnNbaV07CisgICAgICAgIGlmICghYW5p
bS5pc1RyYW5zaXRpb24oKSAmJiBhbmltLmFuaW1hdGlvbigpLT5uYW1lKCkgPT0gbmFtZSkgewor
ICAgICAgICAgICAgcmVtb3ZlQW5pbWF0aW9uKGksIHJlc2V0KTsKKyAgICAgICAgICAgIC0tc2l6
ZTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICArK2k7CisgICAgfQorfQorCit2b2lkIEdy
YXBoaWNzTGF5ZXI6OnJlbW92ZUZpbmlzaGVkVHJhbnNpdGlvbnMoQW5pbWF0ZWRQcm9wZXJ0eUlE
IHByb3BlcnR5KQoreworICAgIHNpemVfdCBzaXplID0gbV9hbmltYXRpb25zLnNpemUoKTsKKyAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICkgeworICAgICAgICBBbmltYXRpb25FbnRy
eSYgYW5pbSA9IG1fYW5pbWF0aW9uc1tpXTsKKyAgICAgICAgaWYgKGFuaW0uaXNUcmFuc2l0aW9u
KCkgJiYgcHJvcGVydHkgPT0gYW5pbS5wcm9wZXJ0eSgpKSB7CisgICAgICAgICAgICByZW1vdmVB
bmltYXRpb24oaSwgZmFsc2UpOworICAgICAgICAgICAgLS1zaXplOworICAgICAgICB9IGVsc2UK
KyAgICAgICAgICAgICsraTsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllcjo6c3VzcGVu
ZEFuaW1hdGlvbnMoKQoreworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXI6OnJlc3VtZUFuaW1hdGlv
bnMoKQoreworfQorCisjaWZuZGVmIE5ERUJVRwordm9pZCBHcmFwaGljc0xheWVyOjp1cGRhdGVE
ZWJ1Z0luZGljYXRvcnMoKQoreworICAgIGlmIChHcmFwaGljc0xheWVyOjpzaG93RGVidWdCb3Jk
ZXJzKCkpIHsKKyAgICAgICAgaWYgKGRyYXdzQ29udGVudCgpKSB7CisgICAgICAgICAgICBpZiAo
bV91c2luZ1RpbGVkTGF5ZXIpCisgICAgICAgICAgICAgICAgc2V0RGVidWdCb3JkZXIoQ29sb3Io
MCwgMjU1LCAwLCAyMDQpLCAyLjBmKTsgICAgLy8gdGlsZWQgbGF5ZXI6IGdyZWVuCisgICAgICAg
ICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2V0RGVidWdCb3JkZXIoQ29sb3IoMjU1LCAwLCAw
LCAyMDQpLCAyLjBmKTsgICAgLy8gbm9ybWFsIGxheWVyOiByZWQKKyAgICAgICAgfSBlbHNlIGlm
IChtYXNrc1RvQm91bmRzKCkpIHsKKyAgICAgICAgICAgIHNldERlYnVnQm9yZGVyKENvbG9yKDEy
OCwgMjU1LCAyNTUsIDE3OCksIDIuMGYpOyAgICAvLyBtYXNraW5nIGxheWVyOiBwYWxlIGJsdWUK
KyAgICAgICAgICAgIGlmIChHcmFwaGljc0xheWVyOjpzaG93RGVidWdCb3JkZXJzKCkpCisgICAg
ICAgICAgICAgICAgc2V0RGVidWdCYWNrZ3JvdW5kQ29sb3IoQ29sb3IoMTI4LCAyNTUsIDI1NSwg
NTIpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBzZXREZWJ1Z0JvcmRlcihDb2xvcigy
NTUsIDI1NSwgMCwgMjA0KSwgMi4wZik7ICAgICAgLy8gY29udGFpbmVyOiB5ZWxsb3cKKyAgICB9
Cit9CisjZW5kaWYKKwordm9pZCB3cml0ZUluZGVudChUZXh0U3RyZWFtJiB0cywgaW50IGluZGVu
dCkKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSAhPSBpbmRlbnQ7ICsraSkKKyAgICAgICAgdHMg
PDwgIiAgIjsKK30KKwordm9pZCBHcmFwaGljc0xheWVyOjpkdW1wTGF5ZXIoVGV4dFN0cmVhbSYg
dHMsIGludCBpbmRlbnQpIGNvbnN0Cit7CisgICAgd3JpdGVJbmRlbnQodHMsIGluZGVudCk7Cisg
ICAgdHMgPDwgIigiIDw8ICJHcmFwaGljc0xheWVyIiA8PCAiICIgPDwgc3RhdGljX2Nhc3Q8dm9p
ZCo+KGNvbnN0X2Nhc3Q8R3JhcGhpY3NMYXllcio+KHRoaXMpKTsKKyAgICB0cyA8PCAiIFwiIiA8
PCBtX25hbWUgPDwgIlwiXG4iOworICAgIGR1bXBQcm9wZXJ0aWVzKHRzLCBpbmRlbnQpOworICAg
IHdyaXRlSW5kZW50KHRzLCBpbmRlbnQpOworICAgIHRzIDw8ICIpXG4iOworfQorCit2b2lkIEdy
YXBoaWNzTGF5ZXI6OmR1bXBQcm9wZXJ0aWVzKFRleHRTdHJlYW0mIHRzLCBpbnQgaW5kZW50KSBj
b25zdAoreworICAgIHdyaXRlSW5kZW50KHRzLCBpbmRlbnQgKyAxKTsKKyAgICB0cyA8PCAiKHBv
c2l0aW9uICIgPDwgbV9wb3NpdGlvbi54KCkgPDwgIiAiIDw8IG1fcG9zaXRpb24ueSgpIDw8ICIp
XG4iOworCisgICAgd3JpdGVJbmRlbnQodHMsIGluZGVudCArIDEpOworICAgIHRzIDw8ICIoYW5j
aG9yICIgPDwgbV9hbmNob3JQb2ludC54KCkgPDwgIiAiIDw8IG1fYW5jaG9yUG9pbnQueSgpIDw8
ICIpXG4iOworCisgICAgd3JpdGVJbmRlbnQodHMsIGluZGVudCArIDEpOworICAgIHRzIDw8ICIo
Ym91bmRzICIgPDwgbV9zaXplLndpZHRoKCkgPDwgIiAiIDw8IG1fc2l6ZS5oZWlnaHQoKSA8PCAi
KVxuIjsKKworICAgIHdyaXRlSW5kZW50KHRzLCBpbmRlbnQgKyAxKTsKKyAgICB0cyA8PCAiKG9w
YWNpdHkgIiA8PCBtX29wYWNpdHkgPDwgIilcbiI7CisgICAgCisgICAgd3JpdGVJbmRlbnQodHMs
IGluZGVudCArIDEpOworICAgIHRzIDw8ICIodXNpbmdUaWxlZExheWVyICIgPDwgbV91c2luZ1Rp
bGVkTGF5ZXIgPDwgIilcbiI7CisKKyAgICB3cml0ZUluZGVudCh0cywgaW5kZW50ICsgMSk7Cisg
ICAgdHMgPDwgIihtX3ByZXNlcnZlczNEICIgPDwgbV9wcmVzZXJ2ZXMzRCA8PCAiKVxuIjsKKwor
ICAgIHdyaXRlSW5kZW50KHRzLCBpbmRlbnQgKyAxKTsKKyAgICB0cyA8PCAiKGRyYXdzQ29udGVu
dCAiIDw8IG1fZHJhd3NDb250ZW50IDw8ICIpXG4iOworCisgICAgd3JpdGVJbmRlbnQodHMsIGlu
ZGVudCArIDEpOworICAgIHRzIDw8ICIobV9iYWNrZmFjZVZpc2liaWxpdHkgIiA8PCAobV9iYWNr
ZmFjZVZpc2liaWxpdHkgPyAidmlzaWJsZSIgOiAiaGlkZGVuIikgPDwgIilcbiI7CisKKyAgICB3
cml0ZUluZGVudCh0cywgaW5kZW50ICsgMSk7CisgICAgdHMgPDwgIihjbGllbnQgIjsKKyAgICBp
ZiAobV9jbGllbnQpCisgICAgICAgIHRzIDw8IHN0YXRpY19jYXN0PHZvaWQqPihtX2NsaWVudCk7
CisgICAgZWxzZQorICAgICAgICB0cyA8PCAibm9uZSI7CisgICAgdHMgPDwgIilcbiI7CisKKyAg
ICB3cml0ZUluZGVudCh0cywgaW5kZW50ICsgMSk7CisgICAgdHMgPDwgIihiYWNrZ3JvdW5kQ29s
b3IgIjsKKyAgICBpZiAoIW1fYmFja2dyb3VuZENvbG9yU2V0KQorICAgICAgICB0cyA8PCAibm9u
ZSI7CisgICAgZWxzZQorICAgICAgICB0cyA8PCBtX2JhY2tncm91bmRDb2xvci5uYW1lKCk7Cisg
ICAgdHMgPDwgIilcbiI7CisKKyAgICB3cml0ZUluZGVudCh0cywgaW5kZW50ICsgMSk7CisgICAg
dHMgPDwgIih0cmFuc2Zvcm0gIjsKKyAgICBpZiAobV90cmFuc2Zvcm0uaXNJZGVudGl0eSgpKQor
ICAgICAgICB0cyA8PCAiaWRlbnRpdHkiOworICAgIGVsc2UgeworICAgICAgICB0cyA8PCAiWyIg
PDwgbV90cmFuc2Zvcm0uYSgpIDw8ICIgIiA8PCBtX3RyYW5zZm9ybS5iKCkgPDwgIl0gIjsKKyAg
ICAgICAgdHMgPDwgIlsiIDw8IG1fdHJhbnNmb3JtLmMoKSA8PCAiICIgPDwgbV90cmFuc2Zvcm0u
ZCgpIDw8ICJdICI7CisgICAgICAgIHRzIDw8ICJbIiA8PCBtX3RyYW5zZm9ybS5lKCkgPDwgIiAi
IDw8IG1fdHJhbnNmb3JtLmYoKSA8PCAiXSAiOworICAgIH0KKyAgICB0cyA8PCAiKVxuIjsKKwor
ICAgIHdyaXRlSW5kZW50KHRzLCBpbmRlbnQgKyAxKTsKKyAgICB0cyA8PCAiKGNoaWxkcmVuVHJh
bnNmb3JtICI7CisgICAgaWYgKG1fY2hpbGRyZW5UcmFuc2Zvcm0uaXNJZGVudGl0eSgpKQorICAg
ICAgICB0cyA8PCAiaWRlbnRpdHkiOworICAgIGVsc2UgeworICAgICAgICB0cyA8PCAiWyIgPDwg
bV9jaGlsZHJlblRyYW5zZm9ybS5hKCkgPDwgIiAiIDw8IG1fY2hpbGRyZW5UcmFuc2Zvcm0uYigp
IDw8ICJdICI7CisgICAgICAgIHRzIDw8ICJbIiA8PCBtX2NoaWxkcmVuVHJhbnNmb3JtLmMoKSA8
PCAiICIgPDwgbV9jaGlsZHJlblRyYW5zZm9ybS5kKCkgPDwgIl0gIjsKKyAgICAgICAgdHMgPDwg
IlsiIDw8IG1fY2hpbGRyZW5UcmFuc2Zvcm0uZSgpIDw8ICIgIiA8PCBtX2NoaWxkcmVuVHJhbnNm
b3JtLmYoKSA8PCAiXSAiOworICAgIH0KKyAgICB0cyA8PCAiKVxuIjsKKworICAgIHdyaXRlSW5k
ZW50KHRzLCBpbmRlbnQgKyAxKTsKKyAgICB0cyA8PCAiKGNoaWxkcmVuICIgPDwgbV9jaGlsZHJl
bi5zaXplKCkgPDwgIlxuIjsKKyAgICAKKyAgICB1bnNpZ25lZCBpOworICAgIGZvciAoaSA9IDA7
IGkgPCBtX2NoaWxkcmVuLnNpemUoKTsgaSsrKQorICAgICAgICBtX2NoaWxkcmVuW2ldLT5kdW1w
TGF5ZXIodHMsIGluZGVudCsyKTsKKyAgICB3cml0ZUluZGVudCh0cywgaW5kZW50ICsgMSk7Cisg
ICAgdHMgPDwgIilcbiI7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8v
IFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllci5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9H
cmFwaGljc0xheWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRjMWY4
MgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NM
YXllci5oCkBAIC0wLDAgKzEsNDA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEdyYXBoaWNzTGF5ZXJfaAorI2RlZmlu
ZSBHcmFwaGljc0xheWVyX2gKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKwor
I2luY2x1ZGUgIkFuaW1hdGlvbi5oIgorI2luY2x1ZGUgIkNvbG9yLmgiCisjaW5jbHVkZSAiRmxv
YXRQb2ludC5oIgorI2luY2x1ZGUgIkZsb2F0UG9pbnQzRC5oIgorI2luY2x1ZGUgIkZsb2F0U2l6
ZS5oIgorI2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXJDbGllbnQuaCIKKyNpbmNsdWRlICJUcmFuc2Zv
cm1hdGlvbk1hdHJpeC5oIgorI2luY2x1ZGUgIlRyYW5zZm9ybU9wZXJhdGlvbnMuaCIKKyNpbmNs
dWRlIDx3dGYvT3duUHRyLmg+CisKKyNpZiBQTEFURk9STShNQUMpCisjaWZkZWYgX19PQkpDX18K
K0BjbGFzcyBXZWJMYXllcjsKK0BjbGFzcyBDQUxheWVyOwordHlwZWRlZiBXZWJMYXllciBQbGF0
Zm9ybUxheWVyOwordHlwZWRlZiBDQUxheWVyKiBOYXRpdmVMYXllcjsKKyNlbHNlCit0eXBlZGVm
IHZvaWQqIFBsYXRmb3JtTGF5ZXI7Cit0eXBlZGVmIHZvaWQqIE5hdGl2ZUxheWVyOworI2VuZGlm
CisjZWxzZQordHlwZWRlZiB2b2lkKiBQbGF0Zm9ybUxheWVyOwordHlwZWRlZiB2b2lkKiBOYXRp
dmVMYXllcjsKKyNlbmRpZgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEdyYXBoaWNz
Q29udGV4dDsKK2NsYXNzIEltYWdlOworY2xhc3MgVGV4dFN0cmVhbTsKK2NsYXNzIFRpbWluZ0Z1
bmN0aW9uOworCisvLyBHcmFwaGljc0xheWVyIGlzIGFuIGFic3RyYWN0aW9uIGZvciBhIHJlbmRl
cmluZyBzdXJmYWNlIHdpdGggYmFja2luZyBzdG9yZSwKKy8vIHdoaWNoIG1heSBoYXZlIGFzc29j
aWF0ZWQgdHJhbnNmb3JtYXRpb24gYW5kIGFuaW1hdGlvbnMuCisKK2NsYXNzIEdyYXBoaWNzTGF5
ZXIgeworcHVibGljOgorICAgIC8vIFVzZWQgdG8gc3RvcmUgb25lIGZsb2F0IHZhbHVlIG9mIGEg
a2V5ZnJhbWUgYW5pbWF0aW9uLgorICAgIGNsYXNzIEZsb2F0VmFsdWUgeworICAgIHB1YmxpYzoK
KyAgICAgICAgRmxvYXRWYWx1ZShmbG9hdCBrZXkgPSBOQU4sIGZsb2F0IHZhbHVlID0gMCwgY29u
c3QgVGltaW5nRnVuY3Rpb24qIHRpbWluZ0Z1bmN0aW9uID0gMCkKKyAgICAgICAgICAgIDogbV9r
ZXkoa2V5KSwgbV92YWx1ZSh2YWx1ZSksIG1fdGltaW5nRnVuY3Rpb24oMCkKKyAgICAgICAgewor
ICAgICAgICAgICAgaWYgKHRpbWluZ0Z1bmN0aW9uKQorICAgICAgICAgICAgICAgIG1fdGltaW5n
RnVuY3Rpb24uc2V0KG5ldyBUaW1pbmdGdW5jdGlvbigqdGltaW5nRnVuY3Rpb24pKTsKKyAgICAg
ICAgfQorCisgICAgICAgIEZsb2F0VmFsdWUoY29uc3QgRmxvYXRWYWx1ZSYgb3RoZXIpCisgICAg
ICAgICAgICA6IG1fa2V5KG90aGVyLmtleSgpKSwgbV92YWx1ZShvdGhlci52YWx1ZSgpKSwgbV90
aW1pbmdGdW5jdGlvbigwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAob3RoZXIudGltaW5n
RnVuY3Rpb24oKSkKKyAgICAgICAgICAgICAgICBtX3RpbWluZ0Z1bmN0aW9uLnNldChuZXcgVGlt
aW5nRnVuY3Rpb24oKm90aGVyLnRpbWluZ0Z1bmN0aW9uKCkpKTsKKyAgICAgICAgfQorCisgICAg
ICAgIGNvbnN0IEZsb2F0VmFsdWUmIG9wZXJhdG9yPShjb25zdCBGbG9hdFZhbHVlJiBvdGhlcikK
KyAgICAgICAgeworICAgICAgICAgICAgaWYgKCZvdGhlciAhPSB0aGlzKQorICAgICAgICAgICAg
ICAgIHNldChvdGhlci5rZXkoKSwgb3RoZXIudmFsdWUoKSwgb3RoZXIudGltaW5nRnVuY3Rpb24o
KSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICB2b2lk
IHNldChmbG9hdCBrZXksIGZsb2F0IHZhbHVlLCBjb25zdCBUaW1pbmdGdW5jdGlvbiopOworICAg
ICAgICAKKyAgICAgICAgZmxvYXQga2V5KCkgY29uc3QgeyByZXR1cm4gbV9rZXk7IH0KKyAgICAg
ICAgZmxvYXQgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9CisgICAgICAgIGNvbnN0
IFRpbWluZ0Z1bmN0aW9uKiB0aW1pbmdGdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fdGltaW5n
RnVuY3Rpb24uZ2V0KCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGZsb2F0IG1fa2V5Owor
ICAgICAgICBmbG9hdCBtX3ZhbHVlOworICAgICAgICBPd25QdHI8VGltaW5nRnVuY3Rpb24+IG1f
dGltaW5nRnVuY3Rpb247CisgICAgfTsKKyAgICAKKyAgICAKKyAgICBjbGFzcyBGbG9hdFZhbHVl
TGlzdCB7CisgICAgcHVibGljOgorICAgICAgICB2b2lkIGluc2VydChmbG9hdCBrZXksIGZsb2F0
IHZhbHVlLCBjb25zdCBUaW1pbmdGdW5jdGlvbiogdGltaW5nRnVuY3Rpb24pOworCisgICAgICAg
IHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXMuc2l6ZSgpOyB9CisgICAgICAg
IGNvbnN0IEZsb2F0VmFsdWUmIGF0KHNpemVfdCBpKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlcy5h
dChpKTsgfQorICAgICAgICBjb25zdCBWZWN0b3I8RmxvYXRWYWx1ZT4mIHZhbHVlcygpIGNvbnN0
IHsgcmV0dXJuIG1fdmFsdWVzOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBWZWN0b3I8Rmxv
YXRWYWx1ZT4gbV92YWx1ZXM7CisgICAgfTsKKworICAgIC8vIFVzZWQgdG8gc3RvcmUgb25lIHRy
YW5zZm9ybSBpbiBhIGtleWZyYW1lIGxpc3QuCisgICAgY2xhc3MgVHJhbnNmb3JtVmFsdWUgewor
ICAgIHB1YmxpYzoKKyAgICAgICAgVHJhbnNmb3JtVmFsdWUoZmxvYXQga2V5ID0gTkFOLCBjb25z
dCBUcmFuc2Zvcm1PcGVyYXRpb25zKiB2YWx1ZSA9IDAsIGNvbnN0IFRpbWluZ0Z1bmN0aW9uKiB0
aW1pbmdGdW5jdGlvbiA9IDApCisgICAgICAgICAgICA6IG1fa2V5KGtleSkKKyAgICAgICAgewor
ICAgICAgICAgICAgaWYgKHZhbHVlKQorICAgICAgICAgICAgICAgIG1fdmFsdWUuc2V0KG5ldyBU
cmFuc2Zvcm1PcGVyYXRpb25zKCp2YWx1ZSkpOworICAgICAgICAgICAgaWYgKHRpbWluZ0Z1bmN0
aW9uKQorICAgICAgICAgICAgICAgIG1fdGltaW5nRnVuY3Rpb24uc2V0KG5ldyBUaW1pbmdGdW5j
dGlvbigqdGltaW5nRnVuY3Rpb24pKTsKKyAgICAgICAgfQorCisgICAgICAgIFRyYW5zZm9ybVZh
bHVlKGNvbnN0IFRyYW5zZm9ybVZhbHVlJiBvdGhlcikKKyAgICAgICAgICAgIDogbV9rZXkob3Ro
ZXIua2V5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChvdGhlci52YWx1ZSgpKQorICAg
ICAgICAgICAgICAgIG1fdmFsdWUuc2V0KG5ldyBUcmFuc2Zvcm1PcGVyYXRpb25zKCpvdGhlci52
YWx1ZSgpKSk7CisgICAgICAgICAgICBpZiAob3RoZXIudGltaW5nRnVuY3Rpb24oKSkKKyAgICAg
ICAgICAgICAgICBtX3RpbWluZ0Z1bmN0aW9uLnNldChuZXcgVGltaW5nRnVuY3Rpb24oKm90aGVy
LnRpbWluZ0Z1bmN0aW9uKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IFRyYW5zZm9y
bVZhbHVlJiBvcGVyYXRvcj0oY29uc3QgVHJhbnNmb3JtVmFsdWUmIG90aGVyKQorICAgICAgICB7
CisgICAgICAgICAgICBpZiAoJm90aGVyICE9IHRoaXMpCisgICAgICAgICAgICAgICAgc2V0KG90
aGVyLmtleSgpLCBvdGhlci52YWx1ZSgpLCBvdGhlci50aW1pbmdGdW5jdGlvbigpKTsKKyAgICAg
ICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0KGZsb2F0
IGtleSwgY29uc3QgVHJhbnNmb3JtT3BlcmF0aW9ucyogdmFsdWUsIGNvbnN0IFRpbWluZ0Z1bmN0
aW9uKiB0aW1pbmdGdW5jdGlvbik7CisKKyAgICAgICAgZmxvYXQga2V5KCkgY29uc3QgeyByZXR1
cm4gbV9rZXk7IH0KKyAgICAgICAgY29uc3QgVHJhbnNmb3JtT3BlcmF0aW9ucyogdmFsdWUoKSBj
b25zdCB7IHJldHVybiBtX3ZhbHVlLmdldCgpOyB9CisgICAgICAgIGNvbnN0IFRpbWluZ0Z1bmN0
aW9uKiB0aW1pbmdGdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fdGltaW5nRnVuY3Rpb24uZ2V0
KCk7IH0KKyAgICAgICAgCisgICAgcHJpdmF0ZToKKyAgICAgICAgZmxvYXQgbV9rZXk7CisgICAg
ICAgIE93blB0cjxUcmFuc2Zvcm1PcGVyYXRpb25zPiBtX3ZhbHVlOworICAgICAgICBPd25QdHI8
VGltaW5nRnVuY3Rpb24+IG1fdGltaW5nRnVuY3Rpb247CisgICAgfTsKKyAgICAKKyAgICAvLyBV
c2VkIHRvIHN0b3JlIGEgc2VyaWVzIG9mIHRyYW5zZm9ybXMgaW4gYSBrZXlmcmFtZSBsaXN0Lgor
ICAgIGNsYXNzIFRyYW5zZm9ybVZhbHVlTGlzdCB7CisgICAgcHVibGljOgorICAgICAgICB0eXBl
ZGVmIFZlY3RvcjxUcmFuc2Zvcm1PcGVyYXRpb246Ok9wZXJhdGlvblR5cGU+IEZ1bmN0aW9uTGlz
dDsKKworICAgICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzLnNpemUo
KTsgfQorICAgICAgICBjb25zdCBUcmFuc2Zvcm1WYWx1ZSYgYXQoc2l6ZV90IGkpIGNvbnN0IHsg
cmV0dXJuIG1fdmFsdWVzLmF0KGkpOyB9CisgICAgICAgIGNvbnN0IFZlY3RvcjxUcmFuc2Zvcm1W
YWx1ZT4mIHZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzOyB9CisgICAgICAgIAorICAg
ICAgICB2b2lkIGluc2VydChmbG9hdCBrZXksIGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMqIHZh
bHVlLCBjb25zdCBUaW1pbmdGdW5jdGlvbiogdGltaW5nRnVuY3Rpb24pOworICAgICAgICAKKyAg
ICAgICAgLy8gcmV0dXJuIGEgbGlzdCBvZiB0aGUgcmVxdWlyZWQgZnVuY3Rpb25zLiBMaXN0IGlz
IGVtcHR5IGlmIGtleWZyYW1lcyBhcmUgbm90IHZhbGlkCisgICAgICAgIC8vIElmIHJldHVybiB2
YWx1ZSBpcyB0cnVlLCBmdW5jdGlvbnMgY29udGFpbiByb3RhdGlvbnMgb2YgPj0gMTgwIGRlZ3Jl
ZXMKKyAgICAgICAgdm9pZCBtYWtlRnVuY3Rpb25MaXN0KEZ1bmN0aW9uTGlzdCYgbGlzdCwgYm9v
bCYgaXNWYWxpZCwgYm9vbCYgaGFzQmlnUm90YXRpb24pIGNvbnN0OworICAgIHByaXZhdGU6Cisg
ICAgICAgIFZlY3RvcjxUcmFuc2Zvcm1WYWx1ZT4gbV92YWx1ZXM7CisgICAgfTsKKworICAgIHN0
YXRpYyBHcmFwaGljc0xheWVyKiBjcmVhdGVHcmFwaGljc0xheWVyKEdyYXBoaWNzTGF5ZXJDbGll
bnQqKTsKKyAgICAKKyAgICB2aXJ0dWFsIH5HcmFwaGljc0xheWVyKCk7CisKKyAgICBHcmFwaGlj
c0xheWVyQ2xpZW50KiBjbGllbnQoKSBjb25zdCB7IHJldHVybiBtX2NsaWVudDsgfQorCisgICAg
Ly8gTGF5ZXIgbmFtZS4gT25seSB1c2VkIHRvIGlkZW50aWZ5IGxheWVycyBpbiBkZWJ1ZyBvdXRw
dXQKKyAgICBjb25zdCBTdHJpbmcmIG5hbWUoKSBjb25zdCB7IHJldHVybiBtX25hbWU7IH0KKyAg
ICB2aXJ0dWFsIHZvaWQgc2V0TmFtZShjb25zdCBTdHJpbmcmIG5hbWUpIHsgbV9uYW1lID0gbmFt
ZTsgfQorCisgICAgLy8gRm9yIGhvc3RpbmcgdGhpcyBHcmFwaGljc0xheWVyIGluIGEgbmF0aXZl
IGxheWVyIGhpZXJhcmNoeS4KKyAgICB2aXJ0dWFsIE5hdGl2ZUxheWVyIG5hdGl2ZUxheWVyKCkg
Y29uc3QgeyByZXR1cm4gMDsgfQorCisgICAgR3JhcGhpY3NMYXllciogcGFyZW50KCkgY29uc3Qg
eyByZXR1cm4gbV9wYXJlbnQ7IH07CisgICAgdm9pZCBzZXRQYXJlbnQoR3JhcGhpY3NMYXllciog
bGF5ZXIpIHsgbV9wYXJlbnQgPSBsYXllcjsgfSAvLyBJbnRlcm5hbCB1c2Ugb25seS4KKyAgICAK
KyAgICBjb25zdCBWZWN0b3I8R3JhcGhpY3NMYXllcio+JiBjaGlsZHJlbigpIGNvbnN0IHsgcmV0
dXJuIG1fY2hpbGRyZW47IH0KKworICAgIC8vIEFkZCBjaGlsZCBsYXllcnMuIElmIHRoZSBjaGls
ZCBpcyBhbHJlYWR5IHBhcmVudGVkLCBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSBpdHMgb2xkIHBh
cmVudC4KKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGQoR3JhcGhpY3NMYXllciopOworICAgIHZp
cnR1YWwgdm9pZCBhZGRDaGlsZEF0SW5kZXgoR3JhcGhpY3NMYXllciosIGludCBpbmRleCk7Cisg
ICAgdmlydHVhbCB2b2lkIGFkZENoaWxkQWJvdmUoR3JhcGhpY3NMYXllciogbGF5ZXIsIEdyYXBo
aWNzTGF5ZXIqIHNpYmxpbmcpOworICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZEJlbG93KEdyYXBo
aWNzTGF5ZXIqIGxheWVyLCBHcmFwaGljc0xheWVyKiBzaWJsaW5nKTsKKyAgICB2aXJ0dWFsIGJv
b2wgcmVwbGFjZUNoaWxkKEdyYXBoaWNzTGF5ZXIqIG9sZENoaWxkLCBHcmFwaGljc0xheWVyKiBu
ZXdDaGlsZCk7CisKKyAgICB2b2lkIHJlbW92ZUFsbENoaWxkcmVuKCk7CisgICAgdmlydHVhbCB2
b2lkIHJlbW92ZUZyb21QYXJlbnQoKTsKKworICAgIC8vIE9mZnNldCBpcyBvcmlnaW4gb2YgdGhl
IHJlbmRlcmVyIG1pbnVzIG9yaWdpbiBvZiB0aGUgZ3JhcGhpY3MgbGF5ZXIgKHNvIGVpdGhlciB6
ZXJvIG9yIG5lZ2F0aXZlKS4KKyAgICBJbnRTaXplIG9mZnNldEZyb21SZW5kZXJlcigpIGNvbnN0
IHsgcmV0dXJuIG1fb2Zmc2V0RnJvbVJlbmRlcmVyOyB9CisgICAgdm9pZCBzZXRPZmZzZXRGcm9t
UmVuZGVyZXIoY29uc3QgSW50U2l6ZSYgb2Zmc2V0KSB7IG1fb2Zmc2V0RnJvbVJlbmRlcmVyID0g
b2Zmc2V0OyB9CisKKyAgICAvLyBUaGUgcG9zaXRpb24gb2YgdGhlIGxheWVyICh0aGUgbG9jYXRp
b24gb2YgaXRzIHRvcC1sZWZ0IGNvcm5lciBpbiBpdHMgcGFyZW50KQorICAgIGNvbnN0IEZsb2F0
UG9pbnQmIHBvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9wb3NpdGlvbjsgfQorICAgIHZpcnR1
YWwgdm9pZCBzZXRQb3NpdGlvbihjb25zdCBGbG9hdFBvaW50JiBwKSB7IG1fcG9zaXRpb24gPSBw
OyB9CisgICAgCisgICAgLy8gQW5jaG9yIHBvaW50OiAoMCwgMCkgaXMgdG9wIGxlZnQsICgxLCAx
KSBpcyBib3R0b20gcmlnaHQuIFRoZSBhbmNob3IgcG9pbnQKKyAgICAvLyBhZmZlY3RzIHRoZSBv
cmlnaW4gb2YgdGhlIHRyYW5zZm9ybXMuCisgICAgY29uc3QgRmxvYXRQb2ludDNEJiBhbmNob3JQ
b2ludCgpIGNvbnN0IHsgcmV0dXJuIG1fYW5jaG9yUG9pbnQ7IH0KKyAgICB2aXJ0dWFsIHZvaWQg
c2V0QW5jaG9yUG9pbnQoY29uc3QgRmxvYXRQb2ludDNEJiBwKSB7IG1fYW5jaG9yUG9pbnQgPSBw
OyB9CisKKyAgICAvLyBUaGUgYm91bmRzIG9mIHRoZSBsYXllcgorICAgIGNvbnN0IEZsb2F0U2l6
ZSYgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2l6ZTsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRT
aXplKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkgeyBtX3NpemUgPSBzaXplOyB9CisKKyAgICBjb25z
dCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtKCkgY29uc3QgeyByZXR1cm4gbV90cmFu
c2Zvcm07IH0KKyAgICB2aXJ0dWFsIHZvaWQgc2V0VHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0
aW9uTWF0cml4JiB0KSB7IG1fdHJhbnNmb3JtID0gdDsgfQorCisgICAgY29uc3QgVHJhbnNmb3Jt
YXRpb25NYXRyaXgmIGNoaWxkcmVuVHJhbnNmb3JtKCkgY29uc3QgeyByZXR1cm4gbV9jaGlsZHJl
blRyYW5zZm9ybTsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRDaGlsZHJlblRyYW5zZm9ybShjb25z
dCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCkgeyBtX2NoaWxkcmVuVHJhbnNmb3JtID0gdDsgfQor
CisgICAgYm9vbCBwcmVzZXJ2ZXMzRCgpIGNvbnN0IHsgcmV0dXJuIG1fcHJlc2VydmVzM0Q7IH0K
KyAgICB2aXJ0dWFsIHZvaWQgc2V0UHJlc2VydmVzM0QoYm9vbCBiKSB7IG1fcHJlc2VydmVzM0Qg
PSBiOyB9CisgICAgCisgICAgYm9vbCBtYXNrc1RvQm91bmRzKCkgY29uc3QgeyByZXR1cm4gbV9t
YXNrc1RvQm91bmRzOyB9CisgICAgdmlydHVhbCB2b2lkIHNldE1hc2tzVG9Cb3VuZHMoYm9vbCBi
KSB7IG1fbWFza3NUb0JvdW5kcyA9IGI7IH0KKyAgICAKKyAgICBib29sIGRyYXdzQ29udGVudCgp
IGNvbnN0IHsgcmV0dXJuIG1fZHJhd3NDb250ZW50OyB9CisgICAgdmlydHVhbCB2b2lkIHNldERy
YXdzQ29udGVudChib29sIGIpIHsgbV9kcmF3c0NvbnRlbnQgPSBiOyB9CisKKyAgICAvLyBUaGUg
Y29sb3IgdXNlZCB0byBwYWludCB0aGUgbGF5ZXIgYmFja2dyb3VuZHMKKyAgICBjb25zdCBDb2xv
ciYgYmFja2dyb3VuZENvbG9yKCkgY29uc3QgeyByZXR1cm4gbV9iYWNrZ3JvdW5kQ29sb3I7IH0K
KyAgICB2aXJ0dWFsIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKGNvbnN0IENvbG9yJiwgY29uc3Qg
QW5pbWF0aW9uKiA9IDAsIGRvdWJsZSBiZWdpblRpbWUgPSAwKTsKKyAgICB2aXJ0dWFsIHZvaWQg
Y2xlYXJCYWNrZ3JvdW5kQ29sb3IoKTsKKyAgICBib29sIGJhY2tncm91bmRDb2xvclNldCgpIGNv
bnN0IHsgcmV0dXJuIG1fYmFja2dyb3VuZENvbG9yU2V0OyB9CisKKyAgICAvLyBvcGFxdWUgbWVh
bnMgdGhhdCB3ZSBrbm93IHRoZSBsYXllciBjb250ZW50cyBoYXZlIG5vIGFscGhhCisgICAgYm9v
bCBjb250ZW50c09wYXF1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGVudHNPcGFxdWU7IH0KKyAg
ICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNPcGFxdWUoYm9vbCBiKSB7IG1fY29udGVudHNPcGFx
dWUgPSBiOyB9CisKKyAgICBib29sIGJhY2tmYWNlVmlzaWJpbGl0eSgpIGNvbnN0IHsgcmV0dXJu
IG1fYmFja2ZhY2VWaXNpYmlsaXR5OyB9CisgICAgdmlydHVhbCB2b2lkIHNldEJhY2tmYWNlVmlz
aWJpbGl0eShib29sIGIpIHsgbV9iYWNrZmFjZVZpc2liaWxpdHkgPSBiOyB9CisKKyAgICBmbG9h
dCBvcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gbV9vcGFjaXR5OyB9CisgICAgLy8gcmV0dXJuIHRy
dWUgaWYgd2Ugc3RhcnRlZCBhbiBhbmltYXRpb24KKyAgICB2aXJ0dWFsIGJvb2wgc2V0T3BhY2l0
eShmbG9hdCBvLCBjb25zdCBBbmltYXRpb24qID0gMCwgZG91YmxlIGJlZ2luVGltZSA9IDApOwor
CisgICAgLy8gU29tZSBHcmFwaGljc0xheWVycyBwYWludCBvbmx5IHRoZSBmb3JlZ3JvdW5kIG9y
IHRoZSBiYWNrZ3JvdW5kIGNvbnRlbnQKKyAgICBHcmFwaGljc0xheWVyUGFpbnRpbmdQaGFzZSBk
cmF3aW5nUGhhc2UoKSBjb25zdCB7IHJldHVybiBtX3BhaW50aW5nUGhhc2U7IH0KKyAgICB2b2lk
IHNldERyYXdpbmdQaGFzZShHcmFwaGljc0xheWVyUGFpbnRpbmdQaGFzZSBwaGFzZSkgeyBtX3Bh
aW50aW5nUGhhc2UgPSBwaGFzZTsgfQorCisgICAgdmlydHVhbCB2b2lkIHNldE5lZWRzRGlzcGxh
eSgpID0gMDsKKyAgICAvLyBtYXJrIHRoZSBnaXZlbiByZWN0IChpbiBsYXllciBjb29yZHMpIGFz
IG5lZWRpbmcgZGlzcGF5LiBOZXZlciBnb2VzIGRlZXAuCisgICAgdmlydHVhbCB2b2lkIHNldE5l
ZWRzRGlzcGxheUluUmVjdChjb25zdCBGbG9hdFJlY3QmKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJv
b2wgYW5pbWF0ZVRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1WYWx1ZUxpc3QmLCBjb25zdCBJbnRT
aXplJiwgY29uc3QgQW5pbWF0aW9uKiwgZG91YmxlIGJlZ2luVGltZSwgYm9vbCBpc1RyYW5zaXRp
b24pID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgYW5pbWF0ZUZsb2F0KEFuaW1hdGVkUHJvcGVydHlJ
RCwgY29uc3QgRmxvYXRWYWx1ZUxpc3QmLCBjb25zdCBBbmltYXRpb24qLCBkb3VibGUgYmVnaW5U
aW1lKSA9IDA7CisgICAgCisgICAgdm9pZCByZW1vdmVGaW5pc2hlZEFuaW1hdGlvbnMoY29uc3Qg
U3RyaW5nJiBuYW1lLCBpbnQgaW5kZXgsIGJvb2wgcmVzZXQpOworICAgIHZvaWQgcmVtb3ZlRmlu
aXNoZWRUcmFuc2l0aW9ucyhBbmltYXRlZFByb3BlcnR5SUQpOworICAgIHZvaWQgcmVtb3ZlQWxs
QW5pbWF0aW9ucygpOworCisgICAgdmlydHVhbCB2b2lkIHN1c3BlbmRBbmltYXRpb25zKCk7Cisg
ICAgdmlydHVhbCB2b2lkIHJlc3VtZUFuaW1hdGlvbnMoKTsKKyAgICAKKyAgICAvLyBMYXllciBj
b250ZW50cworICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c1RvSW1hZ2UoSW1hZ2UqKSB7IH0K
KyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNUb1ZpZGVvKFBsYXRmb3JtTGF5ZXIqKSB7IH0K
KyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNCYWNrZ3JvdW5kQ29sb3IoY29uc3QgQ29sb3Im
KSB7IH0KKyAgICB2aXJ0dWFsIHZvaWQgY2xlYXJDb250ZW50cygpIHsgfQorICAgIAorICAgIHZp
cnR1YWwgdm9pZCB1cGRhdGVDb250ZW50c1JlY3QoKSB7IH0KKworICAgIC8vIENhbGxiYWNrIGZy
b20gdGhlIHVuZGVybHlpbmcgZ3JhcGhpY3Mgc3lzdGVtIHRvIGRyYXcgbGF5ZXIgY29udGVudHMu
CisgICAgdm9pZCBwYWludEdyYXBoaWNzTGF5ZXJDb250ZW50cyhHcmFwaGljc0NvbnRleHQmLCBj
b25zdCBJbnRSZWN0JiBjbGlwKTsKKyAgICAKKyAgICB2aXJ0dWFsIFBsYXRmb3JtTGF5ZXIqIHBs
YXRmb3JtTGF5ZXIoKSBjb25zdCB7IHJldHVybiAwOyB9CisgICAgCisgICAgdm9pZCBkdW1wTGF5
ZXIoVGV4dFN0cmVhbSYsIGludCBpbmRlbnQgPSAwKSBjb25zdDsKKworI2lmbmRlZiBOREVCVUcK
KyAgICBpbnQgcmVwYWludENvdW50KCkgY29uc3QgeyByZXR1cm4gbV9yZXBhaW50Q291bnQ7IH0K
KyAgICBpbnQgaW5jcmVtZW50UmVwYWludENvdW50KCkgeyByZXR1cm4gKyttX3JlcGFpbnRDb3Vu
dDsgfQorI2VuZGlmCisKKyAgICAvLyBQbGF0Zm9ybSBiZWhhdmlvcnMKKyAgICBzdGF0aWMgYm9v
bCBncmFwaGljc0NvbnRleHRzRmxpcHBlZCgpOworCisjaWZuZGVmIE5ERUJVRworICAgIHN0YXRp
YyBib29sIHNob3dEZWJ1Z0JvcmRlcnMoKTsKKyAgICBzdGF0aWMgYm9vbCBzaG93UmVwYWludENv
dW50ZXIoKTsKKyAgICAKKyAgICB2b2lkIHVwZGF0ZURlYnVnSW5kaWNhdG9ycygpOworICAgIAor
ICAgIHZpcnR1YWwgdm9pZCBzZXREZWJ1Z0JhY2tncm91bmRDb2xvcihjb25zdCBDb2xvciYpIHsg
fQorICAgIHZpcnR1YWwgdm9pZCBzZXREZWJ1Z0JvcmRlcihjb25zdCBDb2xvciYsIGZsb2F0IC8q
Ym9yZGVyV2lkdGgqLykgeyB9CisgICAgLy8gei1wb3NpdGlvbiBpcyB0aGUgei1lcXVpdmFsZW50
IG9mIHBvc2l0aW9uKCkuIEl0J3Mgb25seSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisg
ICAgdmlydHVhbCBmbG9hdCB6UG9zaXRpb24oKSBjb25zdCB7IHJldHVybiBtX3pQb3NpdGlvbjsg
fQorICAgIHZpcnR1YWwgdm9pZCBzZXRaUG9zaXRpb24oZmxvYXQgeikgeyBtX3pQb3NpdGlvbiA9
IHo7IH0KKyNlbmRpZgorCisgICAgc3RhdGljIFN0cmluZyBwcm9wZXJ0eUlkVG9TdHJpbmcoQW5p
bWF0ZWRQcm9wZXJ0eUlEKTsKKyAgICAKK3Byb3RlY3RlZDoKKyAgICBHcmFwaGljc0xheWVyKEdy
YXBoaWNzTGF5ZXJDbGllbnQqKTsKKworICAgIHZvaWQgZHVtcFByb3BlcnRpZXMoVGV4dFN0cmVh
bSYsIGludCBpbmRlbnQpIGNvbnN0OworCisgICAgLy8gcmV0dXJucyAtMSBpZiBub3QgZm91bmQK
KyAgICBpbnQgZmluZEFuaW1hdGlvbkVudHJ5KEFuaW1hdGVkUHJvcGVydHlJRCwgc2hvcnQgaW5k
ZXgpIGNvbnN0OworICAgIHZvaWQgYWRkQW5pbWF0aW9uRW50cnkoQW5pbWF0ZWRQcm9wZXJ0eUlE
LCBzaG9ydCBpbmRleCwgYm9vbCBpc1RyYW5zaXRpb24sIGNvbnN0IEFuaW1hdGlvbiopOworCisg
ICAgdmlydHVhbCB2b2lkIHJlbW92ZUFuaW1hdGlvbihpbnQgLyppbmRleCovLCBib29sIC8qcmVz
ZXQqLykge30KKyAgICB2b2lkIHJlbW92ZUFsbEFuaW1hdGlvbnNGb3JQcm9wZXJ0eShBbmltYXRl
ZFByb3BlcnR5SUQpOworCisgICAgR3JhcGhpY3NMYXllckNsaWVudCogbV9jbGllbnQ7CisgICAg
U3RyaW5nIG1fbmFtZTsKKyAgICAKKyAgICAvLyBPZmZzZXQgZnJvbSB0aGUgb3duaW5nIHJlbmRl
cmVyCisgICAgSW50U2l6ZSBtX29mZnNldEZyb21SZW5kZXJlcjsKKyAgICAKKyAgICAvLyBQb3Np
dGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgcGFyZW50IEdyYXBoaWNzTGF5ZXIKKyAgICBGbG9hdFBv
aW50IG1fcG9zaXRpb247CisgICAgRmxvYXRQb2ludDNEIG1fYW5jaG9yUG9pbnQ7CisgICAgRmxv
YXRTaXplIG1fc2l6ZTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBtX3RyYW5zZm9ybTsKKyAg
ICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBtX2NoaWxkcmVuVHJhbnNmb3JtOworCisgICAgQ29sb3Ig
bV9iYWNrZ3JvdW5kQ29sb3I7CisgICAgZmxvYXQgbV9vcGFjaXR5OworI2lmbmRlZiBOREVCVUcK
KyAgICBmbG9hdCBtX3pQb3NpdGlvbjsKKyNlbmRpZgorCisgICAgYm9vbCBtX2JhY2tncm91bmRD
b2xvclNldCA6IDE7CisgICAgYm9vbCBtX2NvbnRlbnRzT3BhcXVlIDogMTsKKyAgICBib29sIG1f
cHJlc2VydmVzM0Q6IDE7CisgICAgYm9vbCBtX2JhY2tmYWNlVmlzaWJpbGl0eSA6IDE7CisgICAg
Ym9vbCBtX3VzaW5nVGlsZWRMYXllciA6IDE7CisgICAgYm9vbCBtX21hc2tzVG9Cb3VuZHMgOiAx
OworICAgIGJvb2wgbV9kcmF3c0NvbnRlbnQgOiAxOworCisgICAgR3JhcGhpY3NMYXllclBhaW50
aW5nUGhhc2UgbV9wYWludGluZ1BoYXNlOworCisgICAgVmVjdG9yPEdyYXBoaWNzTGF5ZXIqPiBt
X2NoaWxkcmVuOworICAgIEdyYXBoaWNzTGF5ZXIqIG1fcGFyZW50OworICAgIAorICAgIC8vIEFu
aW1hdGlvbkVudHJ5IHJlcHJlc2VudHMgYW4gYW5pbWF0aW9uIG9mIGEgcHJvcGVydHkgb24gdGhp
cyBsYXllci4KKyAgICAvLyBGb3IgdHJhbnNmb3JtIG9ubHksIHRoZXJlIG1heSBiZSBtb3JlIHRo
YW4gb25lLCBpbiB3aGljaCBjYXNlICdpbmRleCcKKyAgICAvLyBpcyBhbiBpbmRleCBpbnRvIHRo
ZSBsaXN0IG9mIHRyYW5zZm9ybXMuIAorICAgIGNsYXNzIEFuaW1hdGlvbkVudHJ5IHsKKyAgICBw
dWJsaWM6CisgICAgICAgIEFuaW1hdGlvbkVudHJ5KGNvbnN0IEFuaW1hdGlvbiogYW5pbWF0aW9u
LCBBbmltYXRlZFByb3BlcnR5SUQgcHJvcGVydHksIHNob3J0IGluZGV4LCBib29sIGlzVHJhbnNp
dGlvbikKKyAgICAgICAgICAgIDogbV9hbmltYXRpb24oY29uc3RfY2FzdDxBbmltYXRpb24qPihh
bmltYXRpb24pKQorICAgICAgICAgICAgLCBtX3Byb3BlcnR5KHByb3BlcnR5KQorICAgICAgICAg
ICAgLCBtX2luZGV4KGluZGV4KQorICAgICAgICAgICAgLCBtX2lzQ3VycmVudCh0cnVlKQorICAg
ICAgICAgICAgLCBtX2lzVHJhbnNpdGlvbihpc1RyYW5zaXRpb24pCisgICAgICAgIHsKKyAgICAg
ICAgfQorICAgICAgICAKKyAgICAgICAgY29uc3QgQW5pbWF0aW9uKiBhbmltYXRpb24oKSBjb25z
dCB7IHJldHVybiBtX2FuaW1hdGlvbi5nZXQoKTsgfQorICAgICAgICBBbmltYXRlZFByb3BlcnR5
SUQgcHJvcGVydHkoKSBjb25zdCB7IHJldHVybiBtX3Byb3BlcnR5OyB9CisgICAgICAgIGludCBp
bmRleCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXg7IH0KKyAgICAgICAgYm9vbCBpc0N1cnJlbnQo
KSBjb25zdCB7IHJldHVybiBtX2lzQ3VycmVudDsgfQorICAgICAgICB2b2lkIHNldElzQ3VycmVu
dChib29sIGIgPSB0cnVlKSB7IG1faXNDdXJyZW50ID0gYjsgfQorICAgICAgICBib29sIGlzVHJh
bnNpdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1faXNUcmFuc2l0aW9uOyB9CisKKyAgICAgICAgYm9v
bCBtYXRjaGVzKEFuaW1hdGVkUHJvcGVydHlJRCBwcm9wZXJ0eSwgc2hvcnQgaW5kZXgpIGNvbnN0
CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX3Byb3BlcnR5ID09IHByb3BlcnR5ICYm
IG1faW5kZXggPT0gaW5kZXg7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHZvaWQgcmVz
ZXQoY29uc3QgQW5pbWF0aW9uKiBhbmltYXRpb24sIGJvb2wgaXNUcmFuc2l0aW9uKQorICAgICAg
ICB7CisgICAgICAgICAgICBtX2FuaW1hdGlvbiA9IGNvbnN0X2Nhc3Q8QW5pbWF0aW9uKj4oYW5p
bWF0aW9uKTsKKyAgICAgICAgICAgIG1faXNUcmFuc2l0aW9uID0gaXNUcmFuc2l0aW9uOworICAg
ICAgICAgICAgbV9pc0N1cnJlbnQgPSB0cnVlOworICAgICAgICB9CisgICAgCisgICAgcHJpdmF0
ZToKKyAgICAgICAgUmVmUHRyPEFuaW1hdGlvbj4gbV9hbmltYXRpb247CisgICAgICAgIEFuaW1h
dGVkUHJvcGVydHlJRCBtX3Byb3BlcnR5IDogMTQ7CisgICAgICAgIHNob3J0IG1faW5kZXggOiAx
NjsKKyAgICAgICAgYm9vbCBtX2lzQ3VycmVudCA6IDE7CisgICAgICAgIGJvb2wgbV9pc1RyYW5z
aXRpb24gOiAxOworICAgIH07CisgICAgCisgICAgVmVjdG9yPEFuaW1hdGlvbkVudHJ5PiBtX2Fu
aW1hdGlvbnM7ICAgICAgLy8gcnVubmluZyBhbmltYXRpb25zL3RyYW5zaXRpb25zCisgICAgICAg
IAorI2lmbmRlZiBOREVCVUcKKyAgICBpbnQgbV9yZXBhaW50Q291bnQ7CisjZW5kaWYKK307CisK
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQorCisjZW5kaWYgLy8gR3JhcGhpY3NMYXllcl9oCisKZGlmZiAtLWdpdCBhL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllckNsaWVudC5oIGIvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0xheWVyQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uM2Y1MTVjOAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllckNsaWVudC5oCkBAIC0wLDAgKzEsNzEgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
Zm5kZWYgR3JhcGhpY3NMYXllckNsaWVudF9oCisjZGVmaW5lIEdyYXBoaWNzTGF5ZXJDbGllbnRf
aAorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK2NsYXNzIEdyYXBoaWNzQ29udGV4dDsKK2NsYXNzIEdyYXBoaWNzTGF5ZXI7CitjbGFz
cyBJbnRQb2ludDsKK2NsYXNzIEludFJlY3Q7CitjbGFzcyBGbG9hdFBvaW50OworCitlbnVtIEdy
YXBoaWNzTGF5ZXJQYWludGluZ1BoYXNlIHsKKyAgICBHcmFwaGljc0xheWVyUGFpbnRCYWNrZ3Jv
dW5kTWFzayA9ICgxIDw8IDApLAorICAgIEdyYXBoaWNzTGF5ZXJQYWludEZvcmVncm91bmRNYXNr
ID0gKDEgPDwgMSksCisgICAgR3JhcGhpY3NMYXllclBhaW50QWxsTWFzayA9IFVJTlRfTUFYCit9
OworCitlbnVtIEFuaW1hdGVkUHJvcGVydHlJRCB7CisgICAgQW5pbWF0ZWRQcm9wZXJ0eUludmFs
aWQsCisgICAgQW5pbWF0ZWRQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybSwKKyAgICBBbmltYXRlZFBy
b3BlcnR5T3BhY2l0eSwKKyAgICBBbmltYXRlZFByb3BlcnR5QmFja2dyb3VuZENvbG9yCit9Owor
CitjbGFzcyBHcmFwaGljc0xheWVyQ2xpZW50IHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5HcmFw
aGljc0xheWVyQ2xpZW50KCkge30KKworICAgIC8vIENhbGxiYWNrcyBmb3Igd2hlbiBoYXJkd2Fy
ZS1hY2NlbGVyYXRlZCB0cmFuc2l0aW9ucyBhbmQgYW5pbWF0aW9uIHN0YXJ0ZWQuCisgICAgdmly
dHVhbCB2b2lkIG5vdGlmeVRyYW5zaXRpb25TdGFydGVkKGNvbnN0IEdyYXBoaWNzTGF5ZXIqLCBB
bmltYXRlZFByb3BlcnR5SUQsIGRvdWJsZSB0aW1lKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG5v
dGlmeUFuaW1hdGlvblN0YXJ0ZWQoY29uc3QgR3JhcGhpY3NMYXllciosIGRvdWJsZSB0aW1lKSA9
IDA7CisgICAgCisgICAgLy8gQ2FsbGJhY2sgdG8gcGFpbnQgdGhlIGNvbnRlbnRzIG9mIHRoZSBs
YXllciBmb3IgdGhlIGdpdmVuIHBhaW50aW5nIHBoYXNlLgorICAgIHZpcnR1YWwgdm9pZCBwYWlu
dENvbnRlbnRzKGNvbnN0IEdyYXBoaWNzTGF5ZXIqLCBHcmFwaGljc0NvbnRleHQmLCBHcmFwaGlj
c0xheWVyUGFpbnRpbmdQaGFzZSwgY29uc3QgSW50UmVjdCYgY2xpcCkgPSAwOworCisgICAgLy8g
UmV0dXJuIGEgcmVjdCBmb3IgdGhlICJjb250ZW50cyIgb2YgdGhlIGdyYXBoaWNzIGxheWVyLCBp
LmUuIHZpZGVvIG9yIGltYWdlIGNvbnRlbnQsIGluIEdyYXBoaWNzTGF5ZXIgY29vcmRpbmF0ZXMu
CisgICAgdmlydHVhbCBJbnRSZWN0IGNvbnRlbnRzQm94KGNvbnN0IEdyYXBoaWNzTGF5ZXIqKSA9
IDA7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoQUNDRUxF
UkFURURfQ09NUE9TSVRJTkcpCisKKyNlbmRpZiAvLyBHcmFwaGljc0xheWVyQ2xpZW50X2gKZGlm
ZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzTGF5ZXJDQS5o
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NMYXllckNBLmgKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMzMjE4MgotLS0gL2Rldi9udWxsCisrKyBi
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzTGF5ZXJDQS5oCkBAIC0wLDAg
KzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01Q
VVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworCisjaWZuZGVmIEdyYXBoaWNzTGF5ZXJDQV9oCisjZGVmaW5lIEdyYXBoaWNzTGF5
ZXJDQV9oCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJH
cmFwaGljc0xheWVyLmgiCisjaW5jbHVkZSA8d3RmL1JldGFpblB0ci5oPgorCitAY2xhc3MgV2Vi
QW5pbWF0aW9uRGVsZWdhdGU7CitAY2xhc3MgV2ViTGF5ZXI7CisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworY2xhc3MgR3JhcGhpY3NMYXllckNBIDogcHVibGljIEdyYXBoaWNzTGF5ZXIgeworcHVi
bGljOgorCisgICAgR3JhcGhpY3NMYXllckNBKEdyYXBoaWNzTGF5ZXJDbGllbnQqKTsKKyAgICB2
aXJ0dWFsIH5HcmFwaGljc0xheWVyQ0EoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXROYW1lKGNv
bnN0IFN0cmluZyYpOworCisgICAgLy8gZm9yIGhvc3RpbmcgdGhpcyBHcmFwaGljc0xheWVyIGlu
IGEgbmF0aXZlIGxheWVyIGhpZXJhcmNoeQorICAgIHZpcnR1YWwgTmF0aXZlTGF5ZXIgbmF0aXZl
TGF5ZXIoKSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZChHcmFwaGljc0xheWVy
Kik7CisgICAgdmlydHVhbCB2b2lkIGFkZENoaWxkQXRJbmRleChHcmFwaGljc0xheWVyKiwgaW50
IGluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGRBYm92ZShHcmFwaGljc0xheWVyKiBs
YXllciwgR3JhcGhpY3NMYXllciogc2libGluZyk7CisgICAgdmlydHVhbCB2b2lkIGFkZENoaWxk
QmVsb3coR3JhcGhpY3NMYXllciogbGF5ZXIsIEdyYXBoaWNzTGF5ZXIqIHNpYmxpbmcpOworICAg
IHZpcnR1YWwgYm9vbCByZXBsYWNlQ2hpbGQoR3JhcGhpY3NMYXllciogb2xkQ2hpbGQsIEdyYXBo
aWNzTGF5ZXIqIG5ld0NoaWxkKTsKKworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVGcm9tUGFyZW50
KCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UG9zaXRpb24oY29uc3QgRmxvYXRQb2ludCYpOwor
ICAgIHZpcnR1YWwgdm9pZCBzZXRBbmNob3JQb2ludChjb25zdCBGbG9hdFBvaW50M0QmKTsKKyAg
ICB2aXJ0dWFsIHZvaWQgc2V0U2l6ZShjb25zdCBGbG9hdFNpemUmKTsKKworICAgIHZpcnR1YWwg
dm9pZCBzZXRUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmKTsKKworICAgIHZp
cnR1YWwgdm9pZCBzZXRDaGlsZHJlblRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCYpOworCisgICAgdmlydHVhbCB2b2lkIHNldFByZXNlcnZlczNEKGJvb2wpOworICAgIHZpcnR1
YWwgdm9pZCBzZXRNYXNrc1RvQm91bmRzKGJvb2wpOworICAgIHZpcnR1YWwgdm9pZCBzZXREcmF3
c0NvbnRlbnQoYm9vbCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKGNv
bnN0IENvbG9yJiwgY29uc3QgQW5pbWF0aW9uKiBhbmltID0gMCwgZG91YmxlIGJlZ2luVGltZSA9
IDApOworICAgIHZpcnR1YWwgdm9pZCBjbGVhckJhY2tncm91bmRDb2xvcigpOworCisgICAgdmly
dHVhbCB2b2lkIHNldENvbnRlbnRzT3BhcXVlKGJvb2wpOworICAgIHZpcnR1YWwgdm9pZCBzZXRC
YWNrZmFjZVZpc2liaWxpdHkoYm9vbCk7CisKKyAgICAvLyByZXR1cm4gdHJ1ZSBpZiB3ZSBzdGFy
dGVkIGFuIGFuaW1hdGlvbgorICAgIHZpcnR1YWwgYm9vbCBzZXRPcGFjaXR5KGZsb2F0LCBjb25z
dCBBbmltYXRpb24qIGFuaW0gPSAwLCBkb3VibGUgYmVnaW5UaW1lID0gMCk7CisKKyAgICB2aXJ0
dWFsIHZvaWQgc2V0TmVlZHNEaXNwbGF5KCk7CisgICAgdmlydHVhbCB2b2lkIHNldE5lZWRzRGlz
cGxheUluUmVjdChjb25zdCBGbG9hdFJlY3QmKTsKKworICAgIHZpcnR1YWwgdm9pZCBzdXNwZW5k
QW5pbWF0aW9ucygpOworICAgIHZpcnR1YWwgdm9pZCByZXN1bWVBbmltYXRpb25zKCk7CisKKyAg
ICB2aXJ0dWFsIGJvb2wgYW5pbWF0ZVRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1WYWx1ZUxpc3Qm
LCBjb25zdCBJbnRTaXplJiwgY29uc3QgQW5pbWF0aW9uKiwgZG91YmxlIGJlZ2luVGltZSwgYm9v
bCBpc1RyYW5zaXRpb24pOworICAgIHZpcnR1YWwgYm9vbCBhbmltYXRlRmxvYXQoQW5pbWF0ZWRQ
cm9wZXJ0eUlELCBjb25zdCBGbG9hdFZhbHVlTGlzdCYsIGNvbnN0IEFuaW1hdGlvbiosIGRvdWJs
ZSBiZWdpblRpbWUpOworCisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzVG9JbWFnZShJbWFn
ZSopOworICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c1RvVmlkZW8oUGxhdGZvcm1MYXllciop
OworICAgIHZpcnR1YWwgdm9pZCBjbGVhckNvbnRlbnRzKCk7CisgICAgCisgICAgdmlydHVhbCB2
b2lkIHVwZGF0ZUNvbnRlbnRzUmVjdCgpOworCisgICAgdmlydHVhbCBQbGF0Zm9ybUxheWVyKiBw
bGF0Zm9ybUxheWVyKCkgY29uc3Q7CisKKyNpZm5kZWYgTkRFQlVHCisgICAgdmlydHVhbCB2b2lk
IHNldERlYnVnQmFja2dyb3VuZENvbG9yKGNvbnN0IENvbG9yJik7CisgICAgdmlydHVhbCB2b2lk
IHNldERlYnVnQm9yZGVyKGNvbnN0IENvbG9yJiwgZmxvYXQgYm9yZGVyV2lkdGgpOworICAgIHZp
cnR1YWwgdm9pZCBzZXRaUG9zaXRpb24oZmxvYXQpOworI2VuZGlmCisKK3ByaXZhdGU6CisgICAg
V2ViTGF5ZXIqIHByaW1hcnlMYXllcigpIGNvbnN0ICB7IHJldHVybiBtX3RyYW5zZm9ybUxheWVy
LmdldCgpID8gbV90cmFuc2Zvcm1MYXllci5nZXQoKSA6IG1fbGF5ZXIuZ2V0KCk7IH0KKyAgICBX
ZWJMYXllciogaG9zdExheWVyRm9yU3VibGF5ZXJzKCkgY29uc3Q7CisgICAgV2ViTGF5ZXIqIGxh
eWVyRm9yU3VwZXJsYXllcigpIGNvbnN0OworCisgICAgV2ViTGF5ZXIqIGFuaW1hdGVkTGF5ZXIo
QW5pbWF0ZWRQcm9wZXJ0eUlEIHByb3BlcnR5KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJu
IChwcm9wZXJ0eSA9PSBBbmltYXRlZFByb3BlcnR5QmFja2dyb3VuZENvbG9yKSA/IG1fY29udGVu
dHNMYXllci5nZXQoKSA6IHByaW1hcnlMYXllcigpOworICAgIH0KKworICAgIHZvaWQgc2V0QmFz
aWNBbmltYXRpb24oQW5pbWF0ZWRQcm9wZXJ0eUlELCBjb25zdCBTdHJpbmcmIGNvbXBvbmVudCwg
c2hvcnQgaW5kZXgsIHZvaWQqIGZyb21WYWwsIHZvaWQqIHRvVmFsLCBib29sIGlzVHJhbnNpdGlv
biwgY29uc3QgQW5pbWF0aW9uKiwgZG91YmxlIHRpbWUpOworICAgIHZvaWQgc2V0S2V5ZnJhbWVB
bmltYXRpb24oQW5pbWF0ZWRQcm9wZXJ0eUlELCBjb25zdCBTdHJpbmcmIGNvbXBvbmVudCwgc2hv
cnQgaW5kZXgsIHZvaWQqIGtleXMsIHZvaWQqIHZhbHVlcywgdm9pZCogdGltaW5nRnVuY3Rpb25z
LCBib29sIGlzVHJhbnNpdGlvbiwgY29uc3QgQW5pbWF0aW9uKiwgZG91YmxlIHRpbWUpOworCisg
ICAgdmlydHVhbCB2b2lkIHJlbW92ZUFuaW1hdGlvbihpbnQgaW5kZXgsIGJvb2wgcmVzZXQpOwor
CisgICAgYm9vbCByZXF1aXJlc1RpbGVkTGF5ZXIoY29uc3QgRmxvYXRTaXplJikgY29uc3Q7Cisg
ICAgdm9pZCBzd2FwRnJvbU9yVG9UaWxlZExheWVyKGJvb2wgdXNlVGlsZWRMYXllcik7CisKKyAg
ICB2b2lkIHNldEhhc0NvbnRlbnRzTGF5ZXIoYm9vbCk7CisgICAgdm9pZCBzZXRDb250ZW50c0xh
eWVyKFdlYkxheWVyKik7CisgICAgdm9pZCBzZXRDb250ZW50c0xheWVyRmxpcHBlZChib29sKTsK
KyAgICAKKyAgICBSZXRhaW5QdHI8V2ViTGF5ZXI+IG1fbGF5ZXI7CisgICAgUmV0YWluUHRyPFdl
YkxheWVyPiBtX3RyYW5zZm9ybUxheWVyOworICAgIFJldGFpblB0cjxXZWJMYXllcj4gbV9jb250
ZW50c0xheWVyOworCisgICAgUmV0YWluUHRyPFdlYkFuaW1hdGlvbkRlbGVnYXRlPiBtX2FuaW1h
dGlvbkRlbGVnYXRlOworCisgICAgYm9vbCBtX2NvbnRlbnRMYXllckZvckltYWdlT3JWaWRlbzsK
K307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJB
VEVEX0NPTVBPU0lUSU5HKQorCisjZW5kaWYgLy8gR3JhcGhpY3NMYXllckNBX2gKZGlmZiAtLWdp
dCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzTGF5ZXJDQS5tbSBiL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzTGF5ZXJDQS5tbQpuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTRjMDg2Ci0tLSAvZGV2L251bGwKKysrIGIvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NMYXllckNBLm1tCkBAIC0wLDAgKzEs
MTQ4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVU
RVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKworI2ltcG9ydCAiY29uZmlnLmgiCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9T
SVRJTkcpCisKKyNpbXBvcnQgIkdyYXBoaWNzTGF5ZXJDQS5oIgorCisvLyBUZW1wb3JhcnkKKyNp
bXBvcnQgPFF1YXJ0ekNvcmUvQ0FBbmltYXRpb25Qcml2YXRlLmg+CisjaW1wb3J0IDxRdWFydHpD
b3JlL0NBVmFsdWVGdW5jdGlvbi5oPgorCisjaW1wb3J0ICJBbmltYXRpb24uaCIKKyNpbXBvcnQg
IkJsb2NrRXhjZXB0aW9ucy5oIgorI2ltcG9ydCAiQ1N0cmluZy5oIgorI2ltcG9ydCAiRmxvYXRS
ZWN0LmgiCisjaW1wb3J0ICJJbWFnZS5oIgorI2ltcG9ydCAiUGxhdGZvcm1TdHJpbmcuaCIKKyNp
bXBvcnQgPFF1YXJ0ekNvcmUvUXVhcnR6Q29yZS5oPgorI2ltcG9ydCAiUm90YXRlVHJhbnNmb3Jt
T3BlcmF0aW9uLmgiCisjaW1wb3J0ICJTY2FsZVRyYW5zZm9ybU9wZXJhdGlvbi5oIgorI2ltcG9y
dCAiU3lzdGVtVGltZS5oIgorI2ltcG9ydCAiVHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uLmgi
CisjaW1wb3J0ICJXZWJMYXllci5oIgorI2ltcG9ydCAiV2ViVGlsZWRMYXllci5oIgorI2ltcG9y
dCA8d3RmL0N1cnJlbnRUaW1lLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworLy8gVGhlIHRocmVzaG9sZCB3aWR0aCBvciBoZWlnaHQgYWJvdmUgd2hp
Y2ggYSB0aWxlZCBsYXllciB3aWxsIGJlIHVzZWQuIFRoaXMgc2hvdWxkIGJlCisvLyBsYXJnZSBl
bm91Z2ggdG8gYXZvaWQgdGlsZWQgbGF5ZXJzIGZvciBtb3N0IEdyYXBoaWNzTGF5ZXJzLCBidXQg
bGVzcyB0aGFuIHRoZSBPcGVuR0wKKy8vIHRleHR1cmUgc2l6ZSBsaW1pdCBvbiBhbGwgc3VwcG9y
dGVkIGhhcmR3YXJlLgorc3RhdGljIGNvbnN0IGludCBjTWF4UGl4ZWxEaW1lbnNpb24gPSAyMDAw
OworCisvLyBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiBhIHNpbmdsZSB0aWxlIGluIGEgdGlsZWQg
bGF5ZXIuIFNob3VsZCBiZSBsYXJnZSBlbm91Z2ggdG8KKy8vIGF2b2lkIGxvdHMgb2Ygc21hbGwg
dGlsZXMgKGFuZCB0aGVyZWZvcmUgbG90cyBvZiBkcmF3aW5nIGNhbGxiYWNrcyksIGJ1dCBzbWFs
bCBlbm91Z2gKKy8vIHRvIGtlZXAgdGhlIG92ZXJhbGwgdGlsZSBjb3N0IGxvdy4KK3N0YXRpYyBj
b25zdCBpbnQgY1RpbGVkTGF5ZXJUaWxlU2l6ZSA9IDUxMjsKKworLy8gSWYgd2Ugc2VuZCBhIGR1
cmF0aW9uIG9mIDAgdG8gQ0EsIHRoZW4gaXQgd2lsbCB1c2UgdGhlIGRlZmF1bHQgZHVyYXRpb24K
Ky8vIG9mIDI1MG1zLiBTbyBzZW5kIGEgdmVyeSBzbWFsbCB2YWx1ZSBpbnN0ZWFkLgorc3RhdGlj
IGNvbnN0IGZsb2F0IGNBbmltYXRpb25BbG1vc3RaZXJvRHVyYXRpb24gPSAxZS0zZjsKKworLy8g
Q0FDdXJyZW50TWVkaWFUaW1lKCkgaXMgYSB0aW1lIHNpbmNlIGJvb3QuIFRoZXNlIG1ldGhvZHMg
Y29udmVydCBiZXR3ZWVuIHRoYXQgYW5kCisvLyBXZWJDb3JlIHRpbWUsIHdoaWNoIGlzIHN5c3Rl
bSB0aW1lIChVVEMpLgorc3RhdGljIENGVGltZUludGVydmFsIGN1cnJlbnRUaW1lVG9NZWRpYVRp
bWUoZG91YmxlIHQpCit7CisgICAgcmV0dXJuIENBQ3VycmVudE1lZGlhVGltZSgpICsgdCAtIFdU
Rjo6Y3VycmVudFRpbWUoKTsKK30KKworc3RhdGljIGRvdWJsZSBtZWRpYVRpbWVUb0N1cnJlbnRU
aW1lKENGVGltZUludGVydmFsIHQpCit7CisgICAgcmV0dXJuIFdURjo6Y3VycmVudFRpbWUoKSAr
IHQgLSBDQUN1cnJlbnRNZWRpYVRpbWUoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQor
CitzdGF0aWMgTlNTdHJpbmcqIGNvbnN0IFdlYkFuaW1hdGlvbkNTU1Byb3BlcnR5S2V5ID0gQCJH
cmFwaGljc0xheWVyQ0FfcHJvcGVydHkiOworCitAaW50ZXJmYWNlIFdlYkFuaW1hdGlvbkRlbGVn
YXRlIDogTlNPYmplY3QgeworICAgIFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJDQSogbV9ncmFwaGlj
c0xheWVyOworfQorCistICh2b2lkKWFuaW1hdGlvbkRpZFN0YXJ0OihDQUFuaW1hdGlvbiAqKWFu
aW07CistIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQ0EqKWdyYXBoaWNzTGF5ZXI7CistICh2b2lk
KXNldExheWVyOihXZWJDb3JlOjpHcmFwaGljc0xheWVyQ0EqKWdyYXBoaWNzTGF5ZXI7CisKK0Bl
bmQKKworQGltcGxlbWVudGF0aW9uIFdlYkFuaW1hdGlvbkRlbGVnYXRlCisKKy0gKHZvaWQpYW5p
bWF0aW9uRGlkU3RhcnQ6KENBQW5pbWF0aW9uICopYW5pbWF0aW9uCit7CisgICAgaWYgKCFtX2dy
YXBoaWNzTGF5ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIGRvdWJsZSBzdGFydFRpbWUgPSBX
ZWJDb3JlOjptZWRpYVRpbWVUb0N1cnJlbnRUaW1lKFthbmltYXRpb24gYmVnaW5UaW1lXSk7Cisg
ICAgV2ViQ29yZTo6QW5pbWF0ZWRQcm9wZXJ0eUlEIHByb3AgPSBzdGF0aWNfY2FzdDxXZWJDb3Jl
OjpBbmltYXRlZFByb3BlcnR5SUQ+KFtbYW5pbWF0aW9uIHZhbHVlRm9yS2V5OldlYkFuaW1hdGlv
bkNTU1Byb3BlcnR5S2V5XSBpbnRWYWx1ZV0pOworICAgIGlmIChwcm9wICE9IFdlYkNvcmU6OkFu
aW1hdGVkUHJvcGVydHlJbnZhbGlkKQorICAgICAgICBtX2dyYXBoaWNzTGF5ZXItPmNsaWVudCgp
LT5ub3RpZnlUcmFuc2l0aW9uU3RhcnRlZChtX2dyYXBoaWNzTGF5ZXIsIHByb3AsIHN0YXJ0VGlt
ZSk7CisgICAgZWxzZQorICAgICAgICBtX2dyYXBoaWNzTGF5ZXItPmNsaWVudCgpLT5ub3RpZnlB
bmltYXRpb25TdGFydGVkKG1fZ3JhcGhpY3NMYXllciwgc3RhcnRUaW1lKTsKK30KKworLSAoV2Vi
Q29yZTo6R3JhcGhpY3NMYXllckNBKilncmFwaGljc0xheWVyCit7CisgICAgcmV0dXJuIG1fZ3Jh
cGhpY3NMYXllcjsKK30KKworLSAodm9pZClzZXRMYXllcjooV2ViQ29yZTo6R3JhcGhpY3NMYXll
ckNBKilncmFwaGljc0xheWVyCit7CisgICAgbV9ncmFwaGljc0xheWVyID0gZ3JhcGhpY3NMYXll
cjsKK30KKworQGVuZAorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2lubGluZSB2b2lkIGNvcHlU
cmFuc2Zvcm0oQ0FUcmFuc2Zvcm0zRCYgdG9UM0QsIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4
JiB0KQoreworICAgIHRvVDNEID0gQ0FUcmFuc2Zvcm0zRE1ha2VBZmZpbmVUcmFuc2Zvcm0odCk7
Cit9CisKK1RyYW5zZm9ybWF0aW9uTWF0cml4IENBVG9UcmFuc2Zvcm0zRChjb25zdCBDQVRyYW5z
Zm9ybTNEJiBmcm9tVDNEKQoreworICAgIHJldHVybiBUcmFuc2Zvcm1hdGlvbk1hdHJpeChDQVRy
YW5zZm9ybTNER2V0QWZmaW5lVHJhbnNmb3JtKGZyb21UM0QpKTsKK30KKworc3RhdGljIE5TVmFs
dWUqIGdldFRyYW5zZm9ybUZ1bmN0aW9uVmFsdWUoY29uc3QgR3JhcGhpY3NMYXllcjo6VHJhbnNm
b3JtVmFsdWUmIHRyYW5zZm9ybVZhbHVlLCBzaXplX3QgaW5kZXgsIGNvbnN0IEludFNpemUmIHNp
emUsIFRyYW5zZm9ybU9wZXJhdGlvbjo6T3BlcmF0aW9uVHlwZSB0cmFuc2Zvcm1UeXBlKQorewor
ICAgIFRyYW5zZm9ybU9wZXJhdGlvbiogb3AgPSAoaW5kZXggPj0gdHJhbnNmb3JtVmFsdWUudmFs
dWUoKS0+b3BlcmF0aW9ucygpLnNpemUoKSkgPyAwIDogdHJhbnNmb3JtVmFsdWUudmFsdWUoKS0+
b3BlcmF0aW9ucygpW2luZGV4XS5nZXQoKTsKKyAgICAKKyAgICBzd2l0Y2ggKHRyYW5zZm9ybVR5
cGUpIHsKKyAgICAgICAgY2FzZSBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURToKKyAgICAgICAg
ICAgIHJldHVybiBbTlNOdW1iZXIgbnVtYmVyV2l0aERvdWJsZTpvcCA/IChzdGF0aWNfY2FzdDxS
b3RhdGVUcmFuc2Zvcm1PcGVyYXRpb24qPihvcCktPmFuZ2xlKCkgKiBNX1BJIC8gMTgwKSA6IDBd
OworCisgICAgICAgIGNhc2UgVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV9YOgorICAgICAgICAg
ICAgcmV0dXJuIFtOU051bWJlciBudW1iZXJXaXRoRG91YmxlOm9wID8gc3RhdGljX2Nhc3Q8U2Nh
bGVUcmFuc2Zvcm1PcGVyYXRpb24qPihvcCktPngoKSA6IDBdOworICAgICAgICBjYXNlIFRyYW5z
Zm9ybU9wZXJhdGlvbjo6U0NBTEVfWToKKyAgICAgICAgICAgIHJldHVybiBbTlNOdW1iZXIgbnVt
YmVyV2l0aERvdWJsZTpvcCA/IHN0YXRpY19jYXN0PFNjYWxlVHJhbnNmb3JtT3BlcmF0aW9uKj4o
b3ApLT55KCkgOiAwXTsKKworICAgICAgICBjYXNlIFRyYW5zZm9ybU9wZXJhdGlvbjo6VFJBTlNM
QVRFX1g6CisgICAgICAgICAgICByZXR1cm4gW05TTnVtYmVyIG51bWJlcldpdGhEb3VibGU6b3Ag
PyBzdGF0aWNfY2FzdDxUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb24qPihvcCktPngoc2l6ZSkg
OiAwXTsKKyAgICAgICAgY2FzZSBUcmFuc2Zvcm1PcGVyYXRpb246OlRSQU5TTEFURV9ZOgorICAg
ICAgICAgICAgcmV0dXJuIFtOU051bWJlciBudW1iZXJXaXRoRG91YmxlOm9wID8gc3RhdGljX2Nh
c3Q8VHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uKj4ob3ApLT54KHNpemUpIDogMF07CisgICAg
ICAgIAorICAgICAgICBjYXNlIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0NBTEU6CisgICAgICAgIGNh
c2UgVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEU6CisgICAgICAgIGNhc2UgVHJhbnNmb3Jt
T3BlcmF0aW9uOjpTS0VXX1g6CisgICAgICAgIGNhc2UgVHJhbnNmb3JtT3BlcmF0aW9uOjpTS0VX
X1k6CisgICAgICAgIGNhc2UgVHJhbnNmb3JtT3BlcmF0aW9uOjpTS0VXOgorICAgICAgICBjYXNl
IFRyYW5zZm9ybU9wZXJhdGlvbjo6TUFUUklYOgorICAgICAgICBjYXNlIFRyYW5zZm9ybU9wZXJh
dGlvbjo6SURFTlRJVFk6CisgICAgICAgIGNhc2UgVHJhbnNmb3JtT3BlcmF0aW9uOjpOT05FOiB7
CisgICAgICAgICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0OworICAgICAgICAgICAgaWYgKG9w
KQorICAgICAgICAgICAgICAgIG9wLT5hcHBseSh0LCBzaXplKTsKKyAgICAgICAgICAgIENBVHJh
bnNmb3JtM0QgY2F0OworICAgICAgICAgICAgY29weVRyYW5zZm9ybShjYXQsIHQpOworICAgICAg
ICAgICAgcmV0dXJuIFtOU1ZhbHVlIHZhbHVlV2l0aENBVHJhbnNmb3JtM0Q6Y2F0XTsKKyAgICAg
ICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIFN0cmluZyBnZXRB
bmltYXRpb25WYWx1ZUZ1bmN0aW9uKFRyYW5zZm9ybU9wZXJhdGlvbjo6T3BlcmF0aW9uVHlwZSB0
cmFuc2Zvcm1UeXBlKQoreworICAgIHN3aXRjaCAodHJhbnNmb3JtVHlwZSkgeworICAgICAgICBj
YXNlIFRyYW5zZm9ybU9wZXJhdGlvbjo6Uk9UQVRFOgorICAgICAgICAgICAgcmV0dXJuICJyb3Rh
dGVaIjsKKyAgICAgICAgY2FzZSBUcmFuc2Zvcm1PcGVyYXRpb246OlNDQUxFX1g6CisgICAgICAg
ICAgICByZXR1cm4gInNjYWxlWCI7CisgICAgICAgIGNhc2UgVHJhbnNmb3JtT3BlcmF0aW9uOjpT
Q0FMRV9ZOgorICAgICAgICAgICAgcmV0dXJuICJzY2FsZVkiOworICAgICAgICBjYXNlIFRyYW5z
Zm9ybU9wZXJhdGlvbjo6VFJBTlNMQVRFX1g6CisgICAgICAgICAgICByZXR1cm4gInRyYW5zbGF0
ZVgiOworICAgICAgICBjYXNlIFRyYW5zZm9ybU9wZXJhdGlvbjo6VFJBTlNMQVRFX1k6CisgICAg
ICAgICAgICByZXR1cm4gInRyYW5zbGF0ZVkiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAg
ICAgcmV0dXJuIFN0cmluZygpOworICAgIH0KK30KKworc3RhdGljIENBTWVkaWFUaW1pbmdGdW5j
dGlvbiogZ2V0Q0FNZWRpYVRpbWluZ0Z1bmN0aW9uKGNvbnN0IFRpbWluZ0Z1bmN0aW9uJiB0aW1p
bmdGdW5jdGlvbikKK3sKKyAgICBzd2l0Y2ggKHRpbWluZ0Z1bmN0aW9uLnR5cGUoKSkgeworICAg
ICAgICBjYXNlIExpbmVhclRpbWluZ0Z1bmN0aW9uOgorICAgICAgICAgICAgcmV0dXJuIFtDQU1l
ZGlhVGltaW5nRnVuY3Rpb24gZnVuY3Rpb25XaXRoTmFtZTpAImxpbmVhciJdOworICAgICAgICBj
YXNlIEN1YmljQmV6aWVyVGltaW5nRnVuY3Rpb246CisgICAgICAgICAgICByZXR1cm4gW0NBTWVk
aWFUaW1pbmdGdW5jdGlvbiBmdW5jdGlvbldpdGhDb250cm9sUG9pbnRzOnN0YXRpY19jYXN0PGZs
b2F0Pih0aW1pbmdGdW5jdGlvbi54MSgpKSA6c3RhdGljX2Nhc3Q8ZmxvYXQ+KHRpbWluZ0Z1bmN0
aW9uLnkxKCkpCisgICAgICAgICAgICAgICAgICAgICAgICA6c3RhdGljX2Nhc3Q8ZmxvYXQ+KHRp
bWluZ0Z1bmN0aW9uLngyKCkpIDpzdGF0aWNfY2FzdDxmbG9hdD4odGltaW5nRnVuY3Rpb24ueTIo
KSldOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2lmbmRlZiBOREVCVUcKK3N0YXRpYyB2
b2lkIHNldExheWVyQm9yZGVyQ29sb3IoUGxhdGZvcm1MYXllciogbGF5ZXIsIGNvbnN0IENvbG9y
JiBjb2xvcikKK3sKKyAgICBDR0NvbG9yUmVmIGJvcmRlckNvbG9yID0gY2dDb2xvcihjb2xvcik7
CisgICAgW2xheWVyIHNldEJvcmRlckNvbG9yOmJvcmRlckNvbG9yXTsKKyAgICBDR0NvbG9yUmVs
ZWFzZShib3JkZXJDb2xvcik7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyQm9yZGVyQ29sb3IoUGxh
dGZvcm1MYXllciogbGF5ZXIpCit7CisgICAgW2xheWVyIHNldEJvcmRlckNvbG9yOm5pbF07Cit9
CisjZW5kaWYKKworc3RhdGljIHZvaWQgc2V0TGF5ZXJCYWNrZ3JvdW5kQ29sb3IoUGxhdGZvcm1M
YXllciogbGF5ZXIsIGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBDR0NvbG9yUmVmIGJnQ29s
b3IgPSBjZ0NvbG9yKGNvbG9yKTsKKyAgICBbbGF5ZXIgc2V0QmFja2dyb3VuZENvbG9yOmJnQ29s
b3JdOworICAgIENHQ29sb3JSZWxlYXNlKGJnQ29sb3IpOworfQorCitzdGF0aWMgdm9pZCBjbGVh
ckxheWVyQmFja2dyb3VuZENvbG9yKFBsYXRmb3JtTGF5ZXIqIGxheWVyKQoreworICAgIFtsYXll
ciBzZXRCYWNrZ3JvdW5kQ29sb3I6MF07Cit9CisKK3N0YXRpYyBDQUxheWVyKiBnZXRQcmVzZW50
YXRpb25MYXllcihDQUxheWVyKiBsYXllcikKK3sKKyAgICBDQUxheWVyKiAgcHJlc0xheWVyID0g
W2xheWVyIHByZXNlbnRhdGlvbkxheWVyXTsKKyAgICBpZiAoIXByZXNMYXllcikKKyAgICAgICAg
cHJlc0xheWVyID0gbGF5ZXI7CisKKyAgICByZXR1cm4gcHJlc0xheWVyOworfQorCitib29sIEdy
YXBoaWNzTGF5ZXI6OmdyYXBoaWNzQ29udGV4dHNGbGlwcGVkKCkKK3sKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKworI2lmbmRlZiBOREVCVUcKK2Jvb2wgR3JhcGhpY3NMYXllcjo6c2hvd0RlYnVnQm9y
ZGVycygpCit7CisgICAgc3RhdGljIGludCBzaG93RGVidWdCb3JkZXJzID0gW1tOU1VzZXJEZWZh
dWx0cyBzdGFuZGFyZFVzZXJEZWZhdWx0c10gYm9vbEZvcktleTpAIldlYkNvcmVMYXllckJvcmRl
cnMiXTsKKyAgICByZXR1cm4gc2hvd0RlYnVnQm9yZGVyczsKK30KKworYm9vbCBHcmFwaGljc0xh
eWVyOjpzaG93UmVwYWludENvdW50ZXIoKQoreworICAgIHN0YXRpYyBpbnQgc2hvd1JlcGFpbnRD
b3VudGVyID0gW1tOU1VzZXJEZWZhdWx0cyBzdGFuZGFyZFVzZXJEZWZhdWx0c10gYm9vbEZvcktl
eTpAIldlYkNvcmVMYXllclJlcGFpbnRDb3VudGVyIl07CisgICAgcmV0dXJuIHNob3dSZXBhaW50
Q291bnRlcjsKK30KKyNlbmRpZgorCitzdGF0aWMgTlNEaWN0aW9uYXJ5KiBudWxsQWN0aW9uc0Rp
Y3Rpb25hcnkoKQoreworICAgIE5TTnVsbCogbnVsbFZhbHVlID0gW05TTnVsbCBudWxsXTsKKyAg
ICBOU0RpY3Rpb25hcnkqIGFjdGlvbnMgPSBbTlNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2Jq
ZWN0c0FuZEtleXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxWYWx1ZSwgQCJh
bmNob3JQb2ludCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxWYWx1ZSwgQCJi
b3VuZHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsVmFsdWUsIEAiY29udGVu
dHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsVmFsdWUsIEAiY29udGVudHNS
ZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbFZhbHVlLCBAIm9wYWNpdHki
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsVmFsdWUsIEAicG9zaXRpb24iLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsVmFsdWUsIEAic2hhZG93Q29sb3IiLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsVmFsdWUsIEAic3VibGF5ZXJUcmFuc2Zv
cm0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsVmFsdWUsIEAic3VibGF5ZXJz
IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbFZhbHVlLCBAInRyYW5zZm9ybSIs
CisjaWZuZGVmIE5ERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsVmFsdWUs
IEAielBvc2l0aW9uIiwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWxd
OworICAgIHJldHVybiBhY3Rpb25zOworfQorCitHcmFwaGljc0xheWVyKiBHcmFwaGljc0xheWVy
OjpjcmVhdGVHcmFwaGljc0xheWVyKEdyYXBoaWNzTGF5ZXJDbGllbnQqIGNsaWVudCkKK3sKKyAg
ICByZXR1cm4gbmV3IEdyYXBoaWNzTGF5ZXJDQShjbGllbnQpOworfQorCitHcmFwaGljc0xheWVy
Q0E6OkdyYXBoaWNzTGF5ZXJDQShHcmFwaGljc0xheWVyQ2xpZW50KiBjbGllbnQpCis6IEdyYXBo
aWNzTGF5ZXIoY2xpZW50KQorLCBtX2NvbnRlbnRMYXllckZvckltYWdlT3JWaWRlbyhmYWxzZSkK
K3sKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICBtX2xheWVyLmFkb3B0TlMo
W1tXZWJMYXllciBhbGxvY10gaW5pdF0pOworICAgIFttX2xheWVyLmdldCgpIHNldExheWVyT3du
ZXI6dGhpc107CisKKyNpZm5kZWYgTkRFQlVHCisgICAgdXBkYXRlRGVidWdJbmRpY2F0b3JzKCk7
CisjZW5kaWYKKworICAgIG1fYW5pbWF0aW9uRGVsZWdhdGUuYWRvcHROUyhbW1dlYkFuaW1hdGlv
bkRlbGVnYXRlIGFsbG9jXSBpbml0XSk7CisgICAgW21fYW5pbWF0aW9uRGVsZWdhdGUuZ2V0KCkg
c2V0TGF5ZXI6dGhpc107CisgICAgCisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUworfQor
CitHcmFwaGljc0xheWVyQ0E6On5HcmFwaGljc0xheWVyQ0EoKQoreworICAgIC8vIFJlbW92ZSBh
IGlubmVyIGxheWVyIGlmIHRoZXJlIGlzIG9uZS4KKyAgICBjbGVhckNvbnRlbnRzKCk7CisKKyAg
ICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKworICAgIC8vIENsZWFuIHVwIHRoZSBXSyBs
YXllci4KKyAgICBpZiAobV9sYXllcikgeworICAgICAgICBXZWJMYXllciogbGF5ZXIgPSBtX2xh
eWVyLmdldCgpOworICAgICAgICBbbGF5ZXIgc2V0TGF5ZXJPd25lcjpuaWxdOworICAgICAgICBb
bGF5ZXIgcmVtb3ZlRnJvbVN1cGVybGF5ZXJdOworICAgIH0KKyAgICAKKyAgICBpZiAobV90cmFu
c2Zvcm1MYXllcikKKyAgICAgICAgW21fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkgcmVtb3ZlRnJvbVN1
cGVybGF5ZXJdOworCisgICAgLy8gYW5pbWF0aW9uRGlkU3RhcnQ6IGNhbiBmaXJlIGFmdGVyIHRo
aXMsIHNvIHdlIG5lZWQgdG8gY2xlYXIgb3V0IHRoZSBsYXllciBvbiB0aGUgZGVsZWdhdGUuCisg
ICAgW21fYW5pbWF0aW9uRGVsZWdhdGUuZ2V0KCkgc2V0TGF5ZXI6MF07CisKKyAgICBFTkRfQkxP
Q0tfT0JKQ19FWENFUFRJT05TCit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjpzZXROYW1lKGNv
bnN0IFN0cmluZyYgbmFtZSkKK3sKKyAgICBTdHJpbmcgbG9uZ05hbWUgPSBTdHJpbmc6OmZvcm1h
dCgiQ0FMYXllciglcCkgR3JhcGhpY3NMYXllciglcCkgIiwgbV9sYXllci5nZXQoKSwgdGhpcykg
KyBuYW1lOworICAgIEdyYXBoaWNzTGF5ZXI6OnNldE5hbWUobG9uZ05hbWUpOworICAgIAorICAg
IEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgIFttX2xheWVyLmdldCgpIHNldE5hbWU6
bmFtZV07CisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUworfQorCitOYXRpdmVMYXllciBH
cmFwaGljc0xheWVyQ0E6Om5hdGl2ZUxheWVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9sYXll
ci5nZXQoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0E6OmFkZENoaWxkKEdyYXBoaWNzTGF5
ZXIqIGNoaWxkTGF5ZXIpCit7CisgICAgR3JhcGhpY3NMYXllcjo6YWRkQ2hpbGQoY2hpbGRMYXll
cik7CisKKyAgICBHcmFwaGljc0xheWVyQ0EqIGNoaWxkTGF5ZXJDQSA9IHN0YXRpY19jYXN0PEdy
YXBoaWNzTGF5ZXJDQSo+KGNoaWxkTGF5ZXIpOworICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBU
SU9OUworICAgIFtob3N0TGF5ZXJGb3JTdWJsYXllcnMoKSBhZGRTdWJsYXllcjpjaGlsZExheWVy
Q0EtPmxheWVyRm9yU3VwZXJsYXllcigpXTsKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05T
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjphZGRDaGlsZEF0SW5kZXgoR3JhcGhpY3NMYXll
ciogY2hpbGRMYXllciwgaW50IGluZGV4KQoreworICAgIEdyYXBoaWNzTGF5ZXI6OmFkZENoaWxk
QXRJbmRleChjaGlsZExheWVyLCBpbmRleCk7CisKKyAgICBHcmFwaGljc0xheWVyQ0EqIGNoaWxk
TGF5ZXJDQSA9IHN0YXRpY19jYXN0PEdyYXBoaWNzTGF5ZXJDQSo+KGNoaWxkTGF5ZXIpOworICAg
IEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgIFtob3N0TGF5ZXJGb3JTdWJsYXllcnMo
KSBpbnNlcnRTdWJsYXllcjpjaGlsZExheWVyQ0EtPmxheWVyRm9yU3VwZXJsYXllcigpIGF0SW5k
ZXg6aW5kZXhdOworICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKK30KKwordm9pZCBHcmFw
aGljc0xheWVyQ0E6OmFkZENoaWxkQmVsb3coR3JhcGhpY3NMYXllciogY2hpbGRMYXllciwgR3Jh
cGhpY3NMYXllciogc2libGluZykKK3sKKyAgICAvLyBGSVhNRTogc2hhcmUgY29kZSB3aXRoIGJh
c2UgY2xhc3MKKyAgICBBU1NFUlQoY2hpbGRMYXllciAhPSB0aGlzKTsKKyAgICBjaGlsZExheWVy
LT5yZW1vdmVGcm9tUGFyZW50KCk7CisKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgZm9y
ICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAg
aWYgKHNpYmxpbmcgPT0gbV9jaGlsZHJlbltpXSkgeworICAgICAgICAgICAgbV9jaGlsZHJlbi5p
bnNlcnQoaSwgY2hpbGRMYXllcik7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBjaGlsZExheWVyLT5zZXRQYXJlbnQo
dGhpcyk7CisKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKworICAgIEdyYXBoaWNz
TGF5ZXJDQSogY2hpbGRMYXllckNBID0gc3RhdGljX2Nhc3Q8R3JhcGhpY3NMYXllckNBKj4oY2hp
bGRMYXllcik7CisgICAgR3JhcGhpY3NMYXllckNBKiBzaWJsaW5nTGF5ZXJDQSA9IHN0YXRpY19j
YXN0PEdyYXBoaWNzTGF5ZXJDQSo+KHNpYmxpbmcpOworICAgIGlmIChmb3VuZCkKKyAgICAgICAg
W2hvc3RMYXllckZvclN1YmxheWVycygpIGluc2VydFN1YmxheWVyOmNoaWxkTGF5ZXJDQS0+bGF5
ZXJGb3JTdXBlcmxheWVyKCkgYmVsb3c6c2libGluZ0xheWVyQ0EtPmxheWVyRm9yU3VwZXJsYXll
cigpXTsKKyAgICBlbHNlIHsKKyAgICAgICAgbV9jaGlsZHJlbi5hcHBlbmQoY2hpbGRMYXllcik7
CisgICAgICAgIFtob3N0TGF5ZXJGb3JTdWJsYXllcnMoKSBhZGRTdWJsYXllcjpjaGlsZExheWVy
Q0EtPmxheWVyRm9yU3VwZXJsYXllcigpXTsKKyAgICB9CisKKyAgICBFTkRfQkxPQ0tfT0JKQ19F
WENFUFRJT05TCit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjphZGRDaGlsZEFib3ZlKEdyYXBo
aWNzTGF5ZXIqIGNoaWxkTGF5ZXIsIEdyYXBoaWNzTGF5ZXIqIHNpYmxpbmcpCit7CisgICAgLy8g
RklYTUU6IHNoYXJlIGNvZGUgd2l0aCBiYXNlIGNsYXNzCisgICAgQVNTRVJUKGNoaWxkTGF5ZXIg
IT0gdGhpcyk7CisgICAgY2hpbGRMYXllci0+cmVtb3ZlRnJvbVBhcmVudCgpOworCisgICAgdW5z
aWduZWQgaTsKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgZm9yIChpID0gMDsgaSA8IG1f
Y2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKHNpYmxpbmcgPT0gbV9jaGlsZHJl
bltpXSkgeworICAgICAgICAgICAgbV9jaGlsZHJlbi5pbnNlcnQoaSsxLCBjaGlsZExheWVyKTsK
KyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9
CisgICAgfQorICAgIGNoaWxkTGF5ZXItPnNldFBhcmVudCh0aGlzKTsKKworICAgIEJFR0lOX0JM
T0NLX09CSkNfRVhDRVBUSU9OUworCisgICAgR3JhcGhpY3NMYXllckNBKiBjaGlsZExheWVyQ0Eg
PSBzdGF0aWNfY2FzdDxHcmFwaGljc0xheWVyQ0EqPihjaGlsZExheWVyKTsKKyAgICBHcmFwaGlj
c0xheWVyQ0EqIHNpYmxpbmdMYXllckNBID0gc3RhdGljX2Nhc3Q8R3JhcGhpY3NMYXllckNBKj4o
c2libGluZyk7CisgICAgaWYgKGZvdW5kKSB7CisgICAgICAgIFtob3N0TGF5ZXJGb3JTdWJsYXll
cnMoKSBpbnNlcnRTdWJsYXllcjpjaGlsZExheWVyQ0EtPmxheWVyRm9yU3VwZXJsYXllcigpIGFi
b3ZlOnNpYmxpbmdMYXllckNBLT5sYXllckZvclN1cGVybGF5ZXIoKV07CisgICAgfSBlbHNlIHsK
KyAgICAgICAgbV9jaGlsZHJlbi5hcHBlbmQoY2hpbGRMYXllcik7CisgICAgICAgIFtob3N0TGF5
ZXJGb3JTdWJsYXllcnMoKSBhZGRTdWJsYXllcjpjaGlsZExheWVyQ0EtPmxheWVyRm9yU3VwZXJs
YXllcigpXTsKKyAgICB9CisKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCit9CisKK2Jv
b2wgR3JhcGhpY3NMYXllckNBOjpyZXBsYWNlQ2hpbGQoR3JhcGhpY3NMYXllciogb2xkQ2hpbGQs
IEdyYXBoaWNzTGF5ZXIqIG5ld0NoaWxkKQoreworICAgIC8vIEZJWE1FOiBzaGFyZSBjb2RlIHdp
dGggYmFzZSBjbGFzcworICAgIEFTU0VSVCghbmV3Q2hpbGQtPnBhcmVudCgpKTsKKworICAgIGJv
b2wgZm91bmQgPSBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9jaGlsZHJl
bi5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAob2xkQ2hpbGQgPT0gbV9jaGlsZHJlbltpXSkg
eworICAgICAgICAgICAgbV9jaGlsZHJlbltpXSA9IG5ld0NoaWxkOworICAgICAgICAgICAgZm91
bmQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBp
ZiAoZm91bmQpIHsKKyAgICAgICAgb2xkQ2hpbGQtPnNldFBhcmVudCgwKTsKKworICAgICAgICBu
ZXdDaGlsZC0+cmVtb3ZlRnJvbVBhcmVudCgpOworICAgICAgICBuZXdDaGlsZC0+c2V0UGFyZW50
KHRoaXMpOworCisgICAgICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgICAgICBH
cmFwaGljc0xheWVyQ0EqIG9sZENoaWxkQ0EgPSBzdGF0aWNfY2FzdDxHcmFwaGljc0xheWVyQ0Eq
PihvbGRDaGlsZCk7CisgICAgICAgIEdyYXBoaWNzTGF5ZXJDQSogbmV3Q2hpbGRDQSA9IHN0YXRp
Y19jYXN0PEdyYXBoaWNzTGF5ZXJDQSo+KG5ld0NoaWxkKTsKKyAgICAgICAgW2hvc3RMYXllckZv
clN1YmxheWVycygpIHJlcGxhY2VTdWJsYXllcjpvbGRDaGlsZENBLT5sYXllckZvclN1cGVybGF5
ZXIoKSB3aXRoOm5ld0NoaWxkQ0EtPmxheWVyRm9yU3VwZXJsYXllcigpXTsKKyAgICAgICAgRU5E
X0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAg
cmV0dXJuIGZhbHNlOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6cmVtb3ZlRnJvbVBhcmVu
dCgpCit7CisgICAgR3JhcGhpY3NMYXllcjo6cmVtb3ZlRnJvbVBhcmVudCgpOworCisgICAgQkVH
SU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgW2xheWVyRm9yU3VwZXJsYXllcigpIHJlbW92
ZUZyb21TdXBlcmxheWVyXTsgICAgICAgICAgICAKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJ
T05TCit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjpzZXRQb3NpdGlvbihjb25zdCBGbG9hdFBv
aW50JiBwb2ludCkKK3sKKyAgICAvLyBEb24ndCBzaG9ydC1jaXJjdWl0IGhlcmUsIGJlY2F1c2Ug
cG9zaXRpb24gYW5kIGFuY2hvciBwb2ludCBhcmUgaW50ZXItZGVwZW5kZW50LgorICAgIEdyYXBo
aWNzTGF5ZXI6OnNldFBvc2l0aW9uKHBvaW50KTsKKworICAgIC8vIFBvc2l0aW9uIGlzIG9mZnNl
dCBvbiB0aGUgbGF5ZXIgYnkgdGhlIGxheWVyIGFuY2hvciBwb2ludC4KKyAgICBDR1BvaW50IHBv
c1BvaW50ID0gQ0dQb2ludE1ha2UobV9wb3NpdGlvbi54KCkgKyBtX2FuY2hvclBvaW50LngoKSAq
IG1fc2l6ZS53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3Bv
c2l0aW9uLnkoKSArIG1fYW5jaG9yUG9pbnQueSgpICogbV9zaXplLmhlaWdodCgpKTsKKyAgICAK
KyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICBbcHJpbWFyeUxheWVyKCkgc2V0
UG9zaXRpb246cG9zUG9pbnRdOworICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKK30KKwor
dm9pZCBHcmFwaGljc0xheWVyQ0E6OnNldEFuY2hvclBvaW50KGNvbnN0IEZsb2F0UG9pbnQzRCYg
cG9pbnQpCit7CisgICAgLy8gRG9uJ3Qgc2hvcnQtY2lyY3VpdCBoZXJlLCBiZWNhdXNlIHBvc2l0
aW9uIGFuZCBhbmNob3IgcG9pbnQgYXJlIGludGVyLWRlcGVuZGVudC4KKyAgICBib29sIHpDaGFu
Z2VkID0gKHBvaW50LnooKSAhPSBtX2FuY2hvclBvaW50LnooKSk7CisgICAgR3JhcGhpY3NMYXll
cjo6c2V0QW5jaG9yUG9pbnQocG9pbnQpOworCisgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJ
T05TCisgICAgLy8gc2V0IHRoZSB2YWx1ZSBvbiB0aGUgbGF5ZXIgdG8gdGhlIG5ldyB0cmFuc2Zv
cm0uCisgICAgW3ByaW1hcnlMYXllcigpIHNldEFuY2hvclBvaW50OkZsb2F0UG9pbnQocG9pbnQu
eCgpLCBwb2ludC55KCkpXTsKKworICAgIGlmICh6Q2hhbmdlZCkgCisgICAgICAgIFtwcmltYXJ5
TGF5ZXIoKSBzZXRBbmNob3JQb2ludFo6bV9hbmNob3JQb2ludC56KCldOworCisgICAgLy8gUG9z
aXRpb24gZGVwZW5kcyBvbiBhbmNob3IgcG9pbnQsIHNvIHVwZGF0ZSBpdCBub3cuCisgICAgc2V0
UG9zaXRpb24obV9wb3NpdGlvbik7CisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUworfQor
Cit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6c2V0U2l6ZShjb25zdCBGbG9hdFNpemUmIHNpemUpCit7
CisgICAgR3JhcGhpY3NMYXllcjo6c2V0U2l6ZShzaXplKTsKKworICAgIENHUmVjdCByZWN0ID0g
Q0dSZWN0TWFrZSgwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjBmLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NpemUud2lkdGgoKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgbV9zaXplLmhlaWdodCgpKTsKKyAgICAKKyAgICBDR1BvaW50IGNlbnRl
clBvaW50ID0gQ0dQb2ludE1ha2UobV9zaXplLndpZHRoKCkgLyAyLjBmLCBtX3NpemUuaGVpZ2h0
KCkgLyAyLjBmKTsKKyAgICAKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKworICAg
IGlmIChtX3RyYW5zZm9ybUxheWVyKSB7CisgICAgICAgIFttX3RyYW5zZm9ybUxheWVyLmdldCgp
IHNldEJvdW5kczpyZWN0XTsKKyAgICAKKyAgICAgICAgLy8gdGhlIGFuY2hvciBvZiB0aGUgY29u
dGVudHMgbGF5ZXIgaXMgYWx3YXlzIGF0IDAuNSwgMC41LCBzbyB0aGUgcG9zaXRpb24KKyAgICAg
ICAgLy8gaXMgY2VudGVyLXJlbGF0aXZlCisgICAgICAgIFttX2xheWVyLmdldCgpIHNldFBvc2l0
aW9uOmNlbnRlclBvaW50XTsKKyAgICB9CisgICAgCisgICAgYm9vbCBuZWVkVGlsZWRMYXllciA9
IHJlcXVpcmVzVGlsZWRMYXllcihtX3NpemUpOworICAgIGlmIChuZWVkVGlsZWRMYXllciAhPSBt
X3VzaW5nVGlsZWRMYXllcikKKyAgICAgICAgc3dhcEZyb21PclRvVGlsZWRMYXllcihuZWVkVGls
ZWRMYXllcik7CisgICAgCisgICAgW21fbGF5ZXIuZ2V0KCkgc2V0Qm91bmRzOnJlY3RdOworCisg
ICAgLy8gTm90ZSB0aGF0IHdlIGRvbid0IHJlc2l6ZSBtX2NvbnRlbnRzTGF5ZXIuIEl0J3MgdXAg
dGhlIGNhbGxlciB0byBkbyB0aGF0LgorCisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUwor
CisgICAgLy8gaWYgd2UndmUgY2hhbmdlZCB0aGUgYm91bmRzLCB3ZSBuZWVkIHRvIHJlY2FsY3Vs
YXRlIHRoZSBwb3NpdGlvbgorICAgIC8vIG9mIHRoZSBsYXllciwgdGFraW5nIGFuY2hvciBwb2lu
dCBpbnRvIGFjY291bnQKKyAgICBzZXRQb3NpdGlvbihtX3Bvc2l0aW9uKTsKK30KKwordm9pZCBH
cmFwaGljc0xheWVyQ0E6OnNldFRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYg
dCkKK3sKKyAgICBHcmFwaGljc0xheWVyOjpzZXRUcmFuc2Zvcm0odCk7CisgICAgCisgICAgQkVH
SU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgQ0FUcmFuc2Zvcm0zRCB0cmFuc2Zvcm07Cisg
ICAgY29weVRyYW5zZm9ybSh0cmFuc2Zvcm0sIHQpOworICAgIFtwcmltYXJ5TGF5ZXIoKSBzZXRU
cmFuc2Zvcm06dHJhbnNmb3JtXTsKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAg
CisgICAgLy8gUmVtb3ZlIGFueSBvbGQgdHJhbnNpdGlvbiBlbnRyaWVzIGZvciB0cmFuc2Zvcm0u
CisgICAgcmVtb3ZlQWxsQW5pbWF0aW9uc0ZvclByb3BlcnR5KEFuaW1hdGVkUHJvcGVydHlXZWJr
aXRUcmFuc2Zvcm0pOworCisgICAgLy8gRXZlbiBpZiB3ZSBkb24ndCBoYXZlIGEgdHJhbnNpdGlv
biBpbiB0aGUgbGlzdCwgdGhlIGxheWVyIG1heSBzdGlsbCBoYXZlIG9uZS4KKyAgICAvLyBUaGlz
IGhhcHBlbnMgd2hlbiB3ZSBhcmUgc2V0dGluZyB0aGUgZmluYWwgdHJhbnNmb3JtIHZhbHVlIGFm
dGVyIGFuIGFuaW1hdGlvbiBvcgorICAgIC8vIHRyYW5zaXRpb24gaGFzIGVuZGVkLiBJbiByZW1v
dmVBbmltYXRpb24gd2UgdG9zcyB0aGUgZW50cnkgZnJvbSB0aGUgbGlzdCBidXQgZG9uJ3QKKyAg
ICAvLyByZW1vdmUgaXQgZnJvbSB0aGUgbGlzdC4gVGhhdCB3YXkgd2UgYXJlbid0IGluIGRhbmdl
ciBvZiBkaXNwbGF5aW5nIGEgc3RhbGUgdHJhbnNmb3JtCisgICAgLy8gaW4gdGhlIHRpbWUgYmV0
d2VlbiByZW1vdmluZyB0aGUgYW5pbWF0aW9uIGFuZCBzZXR0aW5nIHRoZSBuZXcgdW5hbmltYXRl
ZCB2YWx1ZS4gV2UgCisgICAgLy8gY2FuJ3QgZG8gdGhpcyBpbiByZW1vdmVBbmltYXRpb24gYmVj
YXVzZSB3ZSBkb24ndCBrbm93IHRoZSBuZXcgdHJhbnNmb3JtIHZhbHVlIHRoZXJlLgorICAgIFN0
cmluZyBrZXlQYXRoID0gcHJvcGVydHlJZFRvU3RyaW5nKEFuaW1hdGVkUHJvcGVydHlXZWJraXRU
cmFuc2Zvcm0pOworICAgIENBTGF5ZXIqIGxheWVyID0gYW5pbWF0ZWRMYXllcihBbmltYXRlZFBy
b3BlcnR5V2Via2l0VHJhbnNmb3JtKTsKKyAgICAKKyAgICBmb3IgKGludCBpID0gMDsgOyArK2kp
IHsKKyAgICAgICAgU3RyaW5nIGFuaW1OYW1lID0ga2V5UGF0aCArICJfIiArIFN0cmluZzo6bnVt
YmVyKGkpOworICAgICAgICBpZiAoIVtsYXllciBhbmltYXRpb25Gb3JLZXk6IGFuaW1OYW1lXSkK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBbbGF5ZXIgcmVtb3ZlQW5pbWF0aW9uRm9yS2V5
OmFuaW1OYW1lXTsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjpzZXRDaGlsZHJl
blRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCkKK3sKKyAgICBpZiAodCA9
PSBtX2NoaWxkcmVuVHJhbnNmb3JtKQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xh
eWVyOjpzZXRDaGlsZHJlblRyYW5zZm9ybSh0KTsKKworICAgIENBVHJhbnNmb3JtM0QgdHJhbnNm
b3JtOworICAgIGNvcHlUcmFuc2Zvcm0odHJhbnNmb3JtLCB0KTsKKworICAgIEJFR0lOX0JMT0NL
X09CSkNfRVhDRVBUSU9OUworICAgIC8vIFNldCB0aGUgdmFsdWUgb24gdGhlIGxheWVyIHRvIHRo
ZSBuZXcgdHJhbnNmb3JtLgorICAgIFtwcmltYXJ5TGF5ZXIoKSBzZXRTdWJsYXllclRyYW5zZm9y
bTp0cmFuc2Zvcm1dOworICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKK30KKworc3RhdGlj
IHZvaWQgbW92ZUFuaW1hdGlvbihBbmltYXRlZFByb3BlcnR5SUQgcHJvcGVydHksIENBTGF5ZXIq
IGZyb21MYXllciwgQ0FMYXllciogdG9MYXllcikKK3sKKyAgICBTdHJpbmcga2V5UGF0aCA9IEdy
YXBoaWNzTGF5ZXI6OnByb3BlcnR5SWRUb1N0cmluZyhwcm9wZXJ0eSk7CisgICAgZm9yIChzaG9y
dCBpbmRleCA9IDA7IDsgKytpbmRleCkgeworICAgICAgICBTdHJpbmcgYW5pbU5hbWUgPSBrZXlQ
YXRoICsgIl8iICsgU3RyaW5nOjpudW1iZXIoaW5kZXgpOworICAgICAgICBDQUFuaW1hdGlvbiog
YW5pbSA9IFtmcm9tTGF5ZXIgYW5pbWF0aW9uRm9yS2V5OmFuaW1OYW1lXTsKKyAgICAgICAgaWYg
KCFhbmltKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgW2FuaW0gcmV0YWluXTsKKyAg
ICAgICAgW2Zyb21MYXllciByZW1vdmVBbmltYXRpb25Gb3JLZXk6YW5pbU5hbWVdOworICAgICAg
ICBbdG9MYXllciBhZGRBbmltYXRpb246YW5pbSBmb3JLZXk6YW5pbU5hbWVdOworICAgICAgICBb
YW5pbSByZWxlYXNlXTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG1vdmVTdWJsYXllcnMoQ0FM
YXllciogZnJvbUxheWVyLCBDQUxheWVyKiB0b0xheWVyKQoreworICAgIE5TQXJyYXkqIHN1Ymxh
eWVyc0NvcHkgPSBbW2Zyb21MYXllciBzdWJsYXllcnNdIGNvcHldOyAvLyBBdm9pZCBtdXRhdGlv
biB3aGlsZSBlbnVtZXJhdGluZywgYW5kIGtlZXAgdGhlIHN1YmxheWVycyBhbGl2ZS4KKyAgICBO
U0VudW1lcmF0b3IqIGNoaWxkcmVuRW51bWVyYXRvciA9IFtzdWJsYXllcnNDb3B5IG9iamVjdEVu
dW1lcmF0b3JdOworCisgICAgQ0FMYXllciogbGF5ZXI7CisgICAgd2hpbGUgKChsYXllciA9IFtj
aGlsZHJlbkVudW1lcmF0b3IgbmV4dE9iamVjdF0pICE9IG5pbCkgeworICAgICAgICBbbGF5ZXIg
cmVtb3ZlRnJvbVN1cGVybGF5ZXJdOworICAgICAgICBbdG9MYXllciBhZGRTdWJsYXllcjpsYXll
cl07CisgICAgfQorICAgIFtzdWJsYXllcnNDb3B5IHJlbGVhc2VdOworfQorCit2b2lkIEdyYXBo
aWNzTGF5ZXJDQTo6c2V0UHJlc2VydmVzM0QoYm9vbCBwcmVzZXJ2ZXMzRCkKK3sKKyAgICBHcmFw
aGljc0xheWVyOjpzZXRQcmVzZXJ2ZXMzRChwcmVzZXJ2ZXMzRCk7CisKKyAgICBDR1BvaW50IHBv
aW50ID0gQ0dQb2ludE1ha2UobV9zaXplLndpZHRoKCkgLyAyLjBmLCBtX3NpemUuaGVpZ2h0KCkg
LyAyLjBmKTsKKyAgICBDR1BvaW50IGNlbnRlclBvaW50ID0gQ0dQb2ludE1ha2UoMC41ZiwgMC41
Zik7CisgICAgCisgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisKKyAgICBpZiAocHJl
c2VydmVzM0QgJiYgIW1fdHJhbnNmb3JtTGF5ZXIpIHsKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSB0
cmFuc2Zvcm0gbGF5ZXIuCisgICAgICAgIG1fdHJhbnNmb3JtTGF5ZXIuYWRvcHROUyhbW0NBVHJh
bnNmb3JtTGF5ZXIgYWxsb2NdIGluaXRdKTsKKworICAgICAgICAvLyBUdXJuIG9mZiBkZWZhdWx0
IGFuaW1hdGlvbnMuCisgICAgICAgIFttX3RyYW5zZm9ybUxheWVyLmdldCgpIHNldFN0eWxlOltO
U0RpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhPYmplY3Q6bnVsbEFjdGlvbnNEaWN0aW9uYXJ5KCkg
Zm9yS2V5OkAiYWN0aW9ucyJdXTsKKyAgICAgICAgCisjaWZuZGVmIE5ERUJVRworICAgICAgICBb
bV90cmFuc2Zvcm1MYXllci5nZXQoKSBzZXROYW1lOltOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0
OkAiVHJhbnNmb3JtIExheWVyIENBVHJhbnNmb3JtTGF5ZXIoJXApIEdyYXBoaWNzTGF5ZXIoJXAp
IiwgbV90cmFuc2Zvcm1MYXllci5nZXQoKSwgdGhpc11dOworI2VuZGlmCisgICAgICAgIC8vIENv
cHkgdGhlIHBvc2l0aW9uIGZyb20gdGhpcyBsYXllci4KKyAgICAgICAgW21fdHJhbnNmb3JtTGF5
ZXIuZ2V0KCkgc2V0Qm91bmRzOlttX2xheWVyLmdldCgpIGJvdW5kc11dOworICAgICAgICBbbV90
cmFuc2Zvcm1MYXllci5nZXQoKSBzZXRQb3NpdGlvbjpbbV9sYXllci5nZXQoKSBwb3NpdGlvbl1d
OworICAgICAgICBbbV90cmFuc2Zvcm1MYXllci5nZXQoKSBzZXRBbmNob3JQb2ludDpbbV9sYXll
ci5nZXQoKSBhbmNob3JQb2ludF1dOworICAgICAgICBbbV90cmFuc2Zvcm1MYXllci5nZXQoKSBz
ZXRBbmNob3JQb2ludFo6W21fbGF5ZXIuZ2V0KCkgYW5jaG9yUG9pbnRaXV07CisgICAgICAgIFtt
X3RyYW5zZm9ybUxheWVyLmdldCgpIHNldENvbnRlbnRzUmVjdDpbbV9sYXllci5nZXQoKSBjb250
ZW50c1JlY3RdXTsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgIFttX3RyYW5zZm9ybUxheWVyLmdl
dCgpIHNldFpQb3NpdGlvbjpbbV9sYXllci5nZXQoKSB6UG9zaXRpb25dXTsKKyNlbmRpZgorICAg
ICAgICAKKyAgICAgICAgLy8gVGhlIGNvbnRlbnRzIGxheWVyIGlzIHBvc2l0aW9uZWQgYXQgKDAs
MCkgcmVsYXRpdmUgdG8gdGhlIHRyYW5zZm9ybUxheWVyLgorICAgICAgICBbbV9sYXllci5nZXQo
KSBzZXRQb3NpdGlvbjpwb2ludF07CisgICAgICAgIFttX2xheWVyLmdldCgpIHNldEFuY2hvclBv
aW50OmNlbnRlclBvaW50XTsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgIFttX2xheWVyLmdldCgp
IHNldFpQb3NpdGlvbjowLjBmXTsKKyNlbmRpZgorICAgICAgICAKKyAgICAgICAgLy8gVHJhbnNm
ZXIgdGhlIHRyYW5zZm9ybSBvdmVyLgorICAgICAgICBbbV90cmFuc2Zvcm1MYXllci5nZXQoKSBz
ZXRUcmFuc2Zvcm06W21fbGF5ZXIuZ2V0KCkgdHJhbnNmb3JtXV07CisgICAgICAgIFttX2xheWVy
LmdldCgpIHNldFRyYW5zZm9ybTpDQVRyYW5zZm9ybTNESWRlbnRpdHldOworICAgICAgICAKKyAg
ICAgICAgLy8gVHJhbnNmZXIgdGhlIG9wYWNpdHkgZnJvbSB0aGUgb2xkIGxheWVyIHRvIHRoZSB0
cmFuc2Zvcm0gbGF5ZXIuCisgICAgICAgIFttX3RyYW5zZm9ybUxheWVyLmdldCgpIHNldE9wYWNp
dHk6bV9vcGFjaXR5XTsKKyAgICAgICAgW21fbGF5ZXIuZ2V0KCkgc2V0T3BhY2l0eToxXTsKKwor
ICAgICAgICAvLyBNb3ZlIHRoaXMgbGF5ZXIgdG8gYmUgYSBjaGlsZCBvZiB0aGUgdHJhbnNmb3Jt
IGxheWVyLgorICAgICAgICBbW21fbGF5ZXIuZ2V0KCkgc3VwZXJsYXllcl0gcmVwbGFjZVN1Ymxh
eWVyOm1fbGF5ZXIuZ2V0KCkgd2l0aDptX3RyYW5zZm9ybUxheWVyLmdldCgpXTsKKyAgICAgICAg
W21fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkgYWRkU3VibGF5ZXI6bV9sYXllci5nZXQoKV07CisKKyAg
ICAgICAgbW92ZUFuaW1hdGlvbihBbmltYXRlZFByb3BlcnR5V2Via2l0VHJhbnNmb3JtLCBtX2xh
eWVyLmdldCgpLCBtX3RyYW5zZm9ybUxheWVyLmdldCgpKTsKKyAgICAgICAgbW92ZVN1YmxheWVy
cyhtX2xheWVyLmdldCgpLCBtX3RyYW5zZm9ybUxheWVyLmdldCgpKTsKKworICAgIH0gZWxzZSBp
ZiAoIXByZXNlcnZlczNEICYmIG1fdHJhbnNmb3JtTGF5ZXIpIHsKKyAgICAgICAgLy8gUmVsYWNl
IHRoZSB0cmFuc2Zvcm1MYXllciBpbiB0aGUgcGFyZW50IHdpdGggdGhpcyBsYXllci4KKyAgICAg
ICAgW21fbGF5ZXIuZ2V0KCkgcmVtb3ZlRnJvbVN1cGVybGF5ZXJdOworICAgICAgICBbW21fdHJh
bnNmb3JtTGF5ZXIuZ2V0KCkgc3VwZXJsYXllcl0gcmVwbGFjZVN1YmxheWVyOm1fdHJhbnNmb3Jt
TGF5ZXIuZ2V0KCkgd2l0aDptX2xheWVyLmdldCgpXTsKKworICAgICAgICBtb3ZlQW5pbWF0aW9u
KEFuaW1hdGVkUHJvcGVydHlXZWJraXRUcmFuc2Zvcm0sIG1fdHJhbnNmb3JtTGF5ZXIuZ2V0KCks
IG1fbGF5ZXIuZ2V0KCkpOworICAgICAgICBtb3ZlU3VibGF5ZXJzKG1fdHJhbnNmb3JtTGF5ZXIu
Z2V0KCksIG1fbGF5ZXIuZ2V0KCkpOworCisgICAgICAgIC8vIFJlc2V0IHRoZSBsYXllciBwb3Np
dGlvbiBhbmQgdHJhbnNmb3JtLgorICAgICAgICBbbV9sYXllci5nZXQoKSBzZXRQb3NpdGlvbjpb
bV90cmFuc2Zvcm1MYXllci5nZXQoKSBwb3NpdGlvbl1dOworICAgICAgICBbbV9sYXllci5nZXQo
KSBzZXRBbmNob3JQb2ludDpbbV90cmFuc2Zvcm1MYXllci5nZXQoKSBhbmNob3JQb2ludF1dOwor
ICAgICAgICBbbV9sYXllci5nZXQoKSBzZXRBbmNob3JQb2ludFo6W21fdHJhbnNmb3JtTGF5ZXIu
Z2V0KCkgYW5jaG9yUG9pbnRaXV07CisgICAgICAgIFttX2xheWVyLmdldCgpIHNldENvbnRlbnRz
UmVjdDpbbV90cmFuc2Zvcm1MYXllci5nZXQoKSBjb250ZW50c1JlY3RdXTsKKyAgICAgICAgW21f
bGF5ZXIuZ2V0KCkgc2V0VHJhbnNmb3JtOlttX3RyYW5zZm9ybUxheWVyLmdldCgpIHRyYW5zZm9y
bV1dOworICAgICAgICBbbV9sYXllci5nZXQoKSBzZXRPcGFjaXR5OlttX3RyYW5zZm9ybUxheWVy
LmdldCgpIG9wYWNpdHldXTsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgIFttX2xheWVyLmdldCgp
IHNldFpQb3NpdGlvbjpbbV90cmFuc2Zvcm1MYXllci5nZXQoKSB6UG9zaXRpb25dXTsKKyNlbmRp
ZgorCisgICAgICAgIC8vIFJlbGVhc2UgdGhlIHRyYW5zZm9ybSBsYXllci4KKyAgICAgICAgbV90
cmFuc2Zvcm1MYXllciA9IDA7CisgICAgfQorCisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9O
UworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6c2V0TWFza3NUb0JvdW5kcyhib29sIG1hc2tz
VG9Cb3VuZHMpCit7CisgICAgaWYgKG1hc2tzVG9Cb3VuZHMgPT0gbV9tYXNrc1RvQm91bmRzKQor
ICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRNYXNrc1RvQm91bmRzKG1h
c2tzVG9Cb3VuZHMpOworCisgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgW21f
bGF5ZXIuZ2V0KCkgc2V0TWFza3NUb0JvdW5kczptYXNrc1RvQm91bmRzXTsKKyAgICBFTkRfQkxP
Q0tfT0JKQ19FWENFUFRJT05TCisKKyNpZm5kZWYgTkRFQlVHCisgICAgdXBkYXRlRGVidWdJbmRp
Y2F0b3JzKCk7CisjZW5kaWYKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0E6OnNldERyYXdzQ29u
dGVudChib29sIGRyYXdzQ29udGVudCkKK3sKKyAgICBpZiAoZHJhd3NDb250ZW50ICE9IG1fZHJh
d3NDb250ZW50KSB7CisgICAgICAgIEdyYXBoaWNzTGF5ZXI6OnNldERyYXdzQ29udGVudChkcmF3
c0NvbnRlbnQpOworCisgICAgICAgIGJvb2wgbmVlZFRpbGVkTGF5ZXIgPSByZXF1aXJlc1RpbGVk
TGF5ZXIobV9zaXplKTsKKyAgICAgICAgaWYgKG5lZWRUaWxlZExheWVyICE9IG1fdXNpbmdUaWxl
ZExheWVyKQorICAgICAgICAgICAgc3dhcEZyb21PclRvVGlsZWRMYXllcihuZWVkVGlsZWRMYXll
cik7CisKKyAgICAgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgICAgIC8vIENs
b2JiZXIgYW55IGV4aXN0aW5nIGNvbnRlbnQuIElmIG5lY2Vzc2FyeSwgQ0Egd2lsbCBjcmVhdGUg
YmFja2luZyBzdG9yZSBvbiB0aGUgbmV4dCBkaXNwbGF5LgorICAgICAgICBbbV9sYXllci5nZXQo
KSBzZXRDb250ZW50czpuaWxdOworICAgICAgICAKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgIHVw
ZGF0ZURlYnVnSW5kaWNhdG9ycygpOworI2VuZGlmCisgICAgICAgIEVORF9CTE9DS19PQkpDX0VY
Q0VQVElPTlMKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjpzZXRCYWNrZ3JvdW5k
Q29sb3IoY29uc3QgQ29sb3ImIGNvbG9yLCBjb25zdCBBbmltYXRpb24qIHRyYW5zaXRpb24sIGRv
dWJsZSBiZWdpblRpbWUpCit7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0QmFja2dyb3VuZENvbG9y
KGNvbG9yLCB0cmFuc2l0aW9uLCBiZWdpblRpbWUpOworCisgICAgQkVHSU5fQkxPQ0tfT0JKQ19F
WENFUFRJT05TCisgICAgc2V0SGFzQ29udGVudHNMYXllcih0cnVlKTsKKyAgICAKKyAgICBpZiAo
dHJhbnNpdGlvbiAmJiAhdHJhbnNpdGlvbi0+aXNFbXB0eU9yWmVyb0R1cmF0aW9uKCkpIHsKKyAg
ICAgICAgQ0FMYXllciogcHJlc0xheWVyID0gW21fY29udGVudHNMYXllci5nZXQoKSBwcmVzZW50
YXRpb25MYXllcl07CisgICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYSBwcmVzZW50YXRpb25M
YXllciwganVzdCB1c2UgdGhlIENBTGF5ZXIKKyAgICAgICAgaWYgKCFwcmVzTGF5ZXIpCisgICAg
ICAgICAgICBwcmVzTGF5ZXIgPSBtX2NvbnRlbnRzTGF5ZXIuZ2V0KCk7CisKKyAgICAgICAgLy8g
R2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGZyb20gdGhlIGxh
eWVyCisgICAgICAgIENHQ29sb3JSZWYgZnJvbUJhY2tncm91bmRDb2xvciA9IFtwcmVzTGF5ZXIg
YmFja2dyb3VuZENvbG9yXTsKKworICAgICAgICBDR0NvbG9yUmVmIGJnQ29sb3IgPSBjZ0NvbG9y
KGNvbG9yKTsKKyAgICAgICAgc2V0QmFzaWNBbmltYXRpb24oQW5pbWF0ZWRQcm9wZXJ0eUJhY2tn
cm91bmRDb2xvciwgIiIsIDAsIGZyb21CYWNrZ3JvdW5kQ29sb3IsIGJnQ29sb3IsIHRydWUsIHRy
YW5zaXRpb24sIGJlZ2luVGltZSk7CisgICAgICAgIENHQ29sb3JSZWxlYXNlKGJnQ29sb3IpOwor
ICAgIH0gZWxzZSB7CisgICAgICAgIHJlbW92ZUFsbEFuaW1hdGlvbnNGb3JQcm9wZXJ0eShBbmlt
YXRlZFByb3BlcnR5QmFja2dyb3VuZENvbG9yKTsgICAgCisgICAgICAgIHNldEhhc0NvbnRlbnRz
TGF5ZXIodHJ1ZSk7CisgICAgICAgIHNldExheWVyQmFja2dyb3VuZENvbG9yKG1fY29udGVudHNM
YXllci5nZXQoKSwgbV9iYWNrZ3JvdW5kQ29sb3IpOworICAgIH0KKworICAgIEVORF9CTE9DS19P
QkpDX0VYQ0VQVElPTlMKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0E6OmNsZWFyQmFja2dyb3Vu
ZENvbG9yKCkKK3sKKyAgICBpZiAoIW1fY29udGVudExheWVyRm9ySW1hZ2VPclZpZGVvKQorICAg
ICAgICBzZXRIYXNDb250ZW50c0xheWVyKGZhbHNlKTsKKyAgICBlbHNlCisgICAgICAgIGNsZWFy
TGF5ZXJCYWNrZ3JvdW5kQ29sb3IobV9jb250ZW50c0xheWVyLmdldCgpKTsKK30KKwordm9pZCBH
cmFwaGljc0xheWVyQ0E6OnNldENvbnRlbnRzT3BhcXVlKGJvb2wgb3BhcXVlKQoreworICAgIEdy
YXBoaWNzTGF5ZXI6OnNldENvbnRlbnRzT3BhcXVlKG9wYXF1ZSk7CisKKyAgICBCRUdJTl9CTE9D
S19PQkpDX0VYQ0VQVElPTlMKKyAgICBbbV9sYXllci5nZXQoKSBzZXRPcGFxdWU6bV9jb250ZW50
c09wYXF1ZV07CisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUworfQorCit2b2lkIEdyYXBo
aWNzTGF5ZXJDQTo6c2V0QmFja2ZhY2VWaXNpYmlsaXR5KGJvb2wgdmlzaWJsZSkKK3sKKyAgICBp
ZiAobV9iYWNrZmFjZVZpc2liaWxpdHkgPT0gdmlzaWJsZSkKKyAgICAgICAgcmV0dXJuOworICAg
IAorICAgIEdyYXBoaWNzTGF5ZXI6OnNldEJhY2tmYWNlVmlzaWJpbGl0eSh2aXNpYmxlKTsKKyAg
ICAKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICBbbV9sYXllci5nZXQoKSBz
ZXREb3VibGVTaWRlZDp2aXNpYmxlXTsKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCit9
CisKK2Jvb2wgR3JhcGhpY3NMYXllckNBOjpzZXRPcGFjaXR5KGZsb2F0IG9wYWNpdHksIGNvbnN0
IEFuaW1hdGlvbiogdHJhbnNpdGlvbiwgZG91YmxlIGJlZ2luVGltZSkKK3sKKyAgICBmbG9hdCBj
bGFtcGVkT3BhY2l0eSA9IG1heCgwLjBmLCBtaW4ob3BhY2l0eSwgMS4wZikpOworICAgIAorICAg
IGJvb2wgb3BhY2l0aWVzRGlmZmVyID0gKG1fb3BhY2l0eSAhPSBjbGFtcGVkT3BhY2l0eSk7Cisg
ICAgCisgICAgR3JhcGhpY3NMYXllcjo6c2V0T3BhY2l0eShjbGFtcGVkT3BhY2l0eSwgdHJhbnNp
dGlvbiwgYmVnaW5UaW1lKTsKKyAgICAKKyAgICBpbnQgYW5pbUluZGV4ID0gZmluZEFuaW1hdGlv
bkVudHJ5KEFuaW1hdGVkUHJvcGVydHlPcGFjaXR5LCAwKTsKKyAgICAgICAgCisgICAgLy8gSWYg
d2UgZG9uJ3QgaGF2ZSBhIHRyYW5zaXRpb24ganVzdCBzZXQgdGhlIG9wYWNpdHkKKyAgICBpZiAo
IXRyYW5zaXRpb24gfHwgdHJhbnNpdGlvbi0+aXNFbXB0eU9yWmVyb0R1cmF0aW9uKCkpIHsKKyAg
ICAgICAgLy8gVGhyZWUgY2FzZXM6CisgICAgICAgIC8vICAxKSBubyBleGlzdGluZyBhbmltYXRp
b24gb3IgdHJhbnNpdGlvbjoganVzdCBzZXQgb3BhY2l0eQorICAgICAgICAvLyAgMikgZXhpc3Rp
bmcgdHJhbnNpdGlvbjogY2xlYXIgaXQgYW5kIHNldCBvcGFjaXR5CisgICAgICAgIC8vICAzKSBl
eGlzdGluZyBhbmltYXRpb246IGp1c3QgcmV0dXJuCisgICAgICAgIC8vCisgICAgICAgIGlmIChh
bmltSW5kZXggPCAwIHx8IG1fYW5pbWF0aW9uc1thbmltSW5kZXhdLmlzVHJhbnNpdGlvbigpKSB7
CisgICAgICAgICAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICAgICAgICAgIFtw
cmltYXJ5TGF5ZXIoKSBzZXRPcGFjaXR5Om9wYWNpdHldOworICAgICAgICAgICAgaWYgKGFuaW1J
bmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlQWxsQW5pbWF0aW9uc0ZvclByb3Bl
cnR5KEFuaW1hdGVkUHJvcGVydHlPcGFjaXR5KTsKKyAgICAgICAgICAgICAgICBhbmltSW5kZXgg
PSAtMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGtleVBh
dGggPSBwcm9wZXJ0eUlkVG9TdHJpbmcoQW5pbWF0ZWRQcm9wZXJ0eU9wYWNpdHkpOworICAgICAg
ICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB1c2luZyBoYXJkY29kZWQgJzAn
IGhlcmUuIFdlIHNob3VsZCBiZSBjbGVhcmluZyBhbGwgYW5pbWF0aW9ucy4gRm9yIG5vdyB0aGVy
ZSBpcyBvbmx5IDEuCisgICAgICAgICAgICAgICAgU3RyaW5nIGFuaW1OYW1lID0ga2V5UGF0aCAr
ICJfMCI7CisgICAgICAgICAgICAgICAgW2FuaW1hdGVkTGF5ZXIoQW5pbWF0ZWRQcm9wZXJ0eU9w
YWNpdHkpIHJlbW92ZUFuaW1hdGlvbkZvcktleTphbmltTmFtZV07CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICAvLyBXZSBoYXZlIGFuIGFuaW1hdGlvbiwgc28gZG9uJ3Qgc2V0IHRoZSBvcGFj
aXR5IGRpcmVjdGx5LgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAg
fSBlbHNlIHsKKyAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2Uga25vdyB3ZSBoYXZlIGEgdHJh
bnNpdGlvbi4gQnV0IGlmIGl0IGlzIHRoZSBzYW1lIGFuZAorICAgICAgICAvLyB0aGUgb3BhY2l0
eSB2YWx1ZSBoYXMgbm90IGNoYW5nZWQsIGRvbid0IGRvIGFueXRoaW5nLgorICAgICAgICBpZiAo
IW9wYWNpdGllc0RpZmZlciAmJgorICAgICAgICAgICAgICAgICgoYW5pbUluZGV4ID09IC0xKSB8
fCAgICAKKyAgICAgICAgICAgICAgICAgKG1fYW5pbWF0aW9uc1thbmltSW5kZXhdLmlzVHJhbnNp
dGlvbigpICYmICoobV9hbmltYXRpb25zW2FuaW1JbmRleF0uYW5pbWF0aW9uKCkpID09ICp0cmFu
c2l0aW9uKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0K
KyAgICAKKyAgICAvLyBJZiBhbiBhbmltYXRpb24gaXMgcnVubmluZywgaWdub3JlIHRoaXMgdHJh
bnNpdGlvbiwgYnV0IHN0aWxsIHNhdmUgdGhlIHZhbHVlLgorICAgIGlmIChhbmltSW5kZXggPj0g
MCAmJiAhbV9hbmltYXRpb25zW2FuaW1JbmRleF0uaXNUcmFuc2l0aW9uKCkpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIGJvb2wgZGlkQW5pbWF0ZSA9IGZhbHNlOworICAgIAorICAgIEJF
R0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgIAorICAgIE5TTnVtYmVyKiBmcm9tT3BhY2l0
eVZhbHVlID0gbmlsOworICAgIE5TTnVtYmVyKiB0b09wYWNpdHlWYWx1ZSA9IFtOU051bWJlciBu
dW1iZXJXaXRoRmxvYXQ6b3BhY2l0eV07CisgICAgCisgICAgaWYgKHRyYW5zaXRpb24gJiYgIXRy
YW5zaXRpb24tPmlzRW1wdHlPclplcm9EdXJhdGlvbigpKSB7CisgICAgICAgIENBTGF5ZXIqIHBy
ZXNMYXllciA9IGdldFByZXNlbnRhdGlvbkxheWVyKHByaW1hcnlMYXllcigpKTsKKyAgICAgICAg
ZmxvYXQgZnJvbU9wYWNpdHkgPSBbcHJlc0xheWVyIG9wYWNpdHldOworICAgICAgICBmcm9tT3Bh
Y2l0eVZhbHVlID0gW05TTnVtYmVyIG51bWJlcldpdGhGbG9hdDpmcm9tT3BhY2l0eV07CisgICAg
ICAgIHNldEJhc2ljQW5pbWF0aW9uKEFuaW1hdGVkUHJvcGVydHlPcGFjaXR5LCAiIiwgMCwgZnJv
bU9wYWNpdHlWYWx1ZSwgdG9PcGFjaXR5VmFsdWUsIHRydWUsIHRyYW5zaXRpb24sIGJlZ2luVGlt
ZSk7CisgICAgICAgIGRpZEFuaW1hdGUgPSB0cnVlOworICAgIH0KKworICAgIEVORF9CTE9DS19P
QkpDX0VYQ0VQVElPTlMKKyAgICAKKyAgICByZXR1cm4gZGlkQW5pbWF0ZTsKK30KKwordm9pZCBH
cmFwaGljc0xheWVyQ0E6OnNldE5lZWRzRGlzcGxheSgpCit7CisgICAgQkVHSU5fQkxPQ0tfT0JK
Q19FWENFUFRJT05TCisgICAgCisgICAgaWYgKGRyYXdzQ29udGVudCgpKQorICAgICAgICBbbV9s
YXllci5nZXQoKSBzZXROZWVkc0Rpc3BsYXldOworCisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBU
SU9OUworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6c2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNv
bnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMK
KyAgICAKKyAgICBpZiAoZHJhd3NDb250ZW50KCkpCisgICAgICAgIFttX2xheWVyLmdldCgpIHNl
dE5lZWRzRGlzcGxheUluUmVjdDpyZWN0XTsKKworICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElP
TlMKK30KKworCitib29sIEdyYXBoaWNzTGF5ZXJDQTo6YW5pbWF0ZVRyYW5zZm9ybShjb25zdCBU
cmFuc2Zvcm1WYWx1ZUxpc3QmIHZhbHVlTGlzdCwgY29uc3QgSW50U2l6ZSYgc2l6ZSwgY29uc3Qg
QW5pbWF0aW9uKiBhbmltLCBkb3VibGUgYmVnaW5UaW1lLCBib29sIGlzVHJhbnNpdGlvbikKK3sK
KyAgICBpZiAoIWFuaW0gfHwgYW5pbS0+aXNFbXB0eU9yWmVyb0R1cmF0aW9uKCkgfHwgdmFsdWVM
aXN0LnNpemUoKSA8IDIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgCisgICAgVHJh
bnNmb3JtVmFsdWVMaXN0OjpGdW5jdGlvbkxpc3QgZnVuY3Rpb25MaXN0OworICAgIGJvb2wgaXNW
YWxpZCwgaGFzQmlnUm90YXRpb247CisgICAgdmFsdWVMaXN0Lm1ha2VGdW5jdGlvbkxpc3QoZnVu
Y3Rpb25MaXN0LCBpc1ZhbGlkLCBoYXNCaWdSb3RhdGlvbik7CisKKyAgICBCRUdJTl9CTE9DS19P
QkpDX0VYQ0VQVElPTlMKKyAgICAKKyAgICAvLyBSdWxlcyBmb3IgYW5pbWF0aW9uOgorICAgIC8v
CisgICAgLy8gIDEpICBJZiBmdW5jdGlvbkxpc3QgaXMgZW1wdHkgb3Igd2UgZG9uJ3QgaGF2ZSBh
IGJpZyByb3RhdGlvbiwgd2UgZG8gYSBtYXRyaXggYW5pbWF0aW9uLiBXZSBjb3VsZAorICAgIC8v
ICAgICAgdXNlIGNvbXBvbmVudCBhbmltYXRpb24gZm9yIGxpc3RzIHdpdGhvdXQgYSBiaWcgcm90
YXRpb24sIGJ1dCB0aGVyZSBpcyBubyBuZWVkIHRvLCBhbmQgdGhpcworICAgIC8vICAgICAgaXMg
bW9yZSBlZmZpY2llbnQuCisgICAgLy8KKyAgICAvLyAgMikgIE90aGVyd2lzZSB3ZSBkbyBhIGNv
bXBvbmVudCBoYXJkd2FyZSBhbmltYXRpb24uCisgICAgYm9vbCBpc01hdHJpeEFuaW1hdGlvbiA9
ICFpc1ZhbGlkIHx8ICFoYXNCaWdSb3RhdGlvbjsKKyAgICAgICAgCisgICAgLy8gU2V0IHRyYW5z
Zm9ybSB0byBpZGVudGl0eSBzaW5jZSB3ZSBhcmUgYW5pbWF0aW5nIGNvbXBvbmVudHMgYW5kIHdl
IG5lZWQgdGhlIGJhc2UKKyAgICAvLyB0byBiZSB0aGUgaWRlbnRpdHkgdHJhbnNmb3JtLgorICAg
IFRyYW5zZm9ybWF0aW9uTWF0cml4IHQ7CisgICAgQ0FUcmFuc2Zvcm0zRCB0b1QzRDsKKyAgICBj
b3B5VHJhbnNmb3JtKHRvVDNELCB0KTsKKyAgICBbcHJpbWFyeUxheWVyKCkgc2V0VHJhbnNmb3Jt
OnRvVDNEXTsKKyAgICAgICAgCisgICAgYm9vbCBpc0tleWZyYW1lID0gdmFsdWVMaXN0LnNpemUo
KSA+IDI7CisgICAgICAgIAorICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgdHJhbnNmb3JtIGZ1
bmN0aW9ucywgc2VuZGluZyBhbiBhbmltYXRpb24gZm9yIGVhY2ggb25lLgorICAgIGZvciAoaW50
IGZ1bmN0aW9uSW5kZXggPSAwOyA7ICsrZnVuY3Rpb25JbmRleCkgeworICAgICAgICBpZiAoZnVu
Y3Rpb25JbmRleCA+PSBzdGF0aWNfY2FzdDxpbnQ+KGZ1bmN0aW9uTGlzdC5zaXplKCkpICYmICFp
c01hdHJpeEFuaW1hdGlvbikKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAg
ICAgIFRyYW5zZm9ybU9wZXJhdGlvbjo6T3BlcmF0aW9uVHlwZSBvcFR5cGUgPSAKKyNpZiBFTkFC
TEUoM0RfVFJBTlNGT1JNUykKKyAgICAgICAgICAgIGlzTWF0cml4QW5pbWF0aW9uID8gVHJhbnNm
b3JtT3BlcmF0aW9uOjpNQVRSSVhfM0QgOiBmdW5jdGlvbkxpc3RbZnVuY3Rpb25JbmRleF07Cisj
ZWxzZQorICAgICAgICAgICAgaXNNYXRyaXhBbmltYXRpb24gPyBUcmFuc2Zvcm1PcGVyYXRpb246
Ok1BVFJJWCA6IGZ1bmN0aW9uTGlzdFtmdW5jdGlvbkluZGV4XTsKKyNlbmRpZiAgICAgICAgCisK
KyAgICAgICAgaWYgKGlzS2V5ZnJhbWUpIHsKKyAgICAgICAgICAgIE5TTXV0YWJsZUFycmF5KiB0
aW1lc0FycmF5ID0gW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdF07CisgICAgICAgICAgICBO
U011dGFibGVBcnJheSogdmFsQXJyYXkgPSBbW05TTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0XTsK
KyAgICAgICAgICAgIE5TTXV0YWJsZUFycmF5KiB0ZkFycmF5ID0gW1tOU011dGFibGVBcnJheSBh
bGxvY10gaW5pdF07CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEl0ZXJhdGUgdGhyb3Vn
aCB0aGUga2V5ZnJhbWVzLCBidWlsZGluZyBhcnJheXMgZm9yIHRoZSBhbmltYXRpb24uCisgICAg
ICAgICAgICBmb3IgKFZlY3RvcjxUcmFuc2Zvcm1WYWx1ZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0g
dmFsdWVMaXN0LnZhbHVlcygpLmJlZ2luKCk7IGl0ICE9IHZhbHVlTGlzdC52YWx1ZXMoKS5lbmQo
KTsgKytpdCkgeworICAgICAgICAgICAgICAgIGNvbnN0IFRyYW5zZm9ybVZhbHVlJiBjdXJWYWx1
ZSA9ICgqaXQpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIGZpbGwgaW4g
dGhlIGtleSB0aW1lIGFuZCB0aW1pbmcgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICBbdGltZXNB
cnJheSBhZGRPYmplY3Q6W05TTnVtYmVyIG51bWJlcldpdGhGbG9hdDpjdXJWYWx1ZS5rZXkoKV1d
OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGNvbnN0IFRpbWluZ0Z1bmN0aW9u
KiB0ZiA9IDA7CisgICAgICAgICAgICAgICAgaWYgKGN1clZhbHVlLnRpbWluZ0Z1bmN0aW9uKCkp
CisgICAgICAgICAgICAgICAgICAgIHRmID0gY3VyVmFsdWUudGltaW5nRnVuY3Rpb24oKTsKKyAg
ICAgICAgICAgICAgICBlbHNlIGlmIChhbmltLT5pc1RpbWluZ0Z1bmN0aW9uU2V0KCkpCisgICAg
ICAgICAgICAgICAgICAgIHRmID0gJmFuaW0tPnRpbWluZ0Z1bmN0aW9uKCk7CisgICAgICAgICAg
ICAgICAgCisgICAgICAgICAgICAgICAgQ0FNZWRpYVRpbWluZ0Z1bmN0aW9uKiB0aW1pbmdGdW5j
dGlvbiA9IGdldENBTWVkaWFUaW1pbmdGdW5jdGlvbih0ZiA/ICp0ZiA6IFRpbWluZ0Z1bmN0aW9u
KExpbmVhclRpbWluZ0Z1bmN0aW9uKSk7CisgICAgICAgICAgICAgICAgW3RmQXJyYXkgYWRkT2Jq
ZWN0OnRpbWluZ0Z1bmN0aW9uXTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAv
LyBmaWxsIGluIHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgICAgIGlmIChpc01hdHJpeEFuaW1h
dGlvbikgeworICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0OworICAg
ICAgICAgICAgICAgICAgICBjdXJWYWx1ZS52YWx1ZSgpLT5hcHBseShzaXplLCB0KTsKKyAgICAg
ICAgICAgICAgICAgICAgQ0FUcmFuc2Zvcm0zRCBjYXQ7CisgICAgICAgICAgICAgICAgICAgIGNv
cHlUcmFuc2Zvcm0oY2F0LCB0KTsKKyAgICAgICAgICAgICAgICAgICAgW3ZhbEFycmF5IGFkZE9i
amVjdDpbTlNWYWx1ZSB2YWx1ZVdpdGhDQVRyYW5zZm9ybTNEOmNhdF1dOworICAgICAgICAgICAg
ICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBbdmFsQXJyYXkgYWRkT2JqZWN0OmdldFRy
YW5zZm9ybUZ1bmN0aW9uVmFsdWUoY3VyVmFsdWUsIGZ1bmN0aW9uSW5kZXgsIHNpemUsIG9wVHlw
ZSldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBXZSB0b3Nz
IHRoZSBsYXN0IHRmQXJyYXkgdmFsdWUgYmVjYXVzZSBpdCBoYXMgdG8gb25lIHNob3J0ZXIgdGhh
biB0aGUgb3RoZXJzLgorICAgICAgICAgICAgW3RmQXJyYXkgcmVtb3ZlTGFzdE9iamVjdF07Cisg
ICAgICAgICAgICAKKyAgICAgICAgICAgIHNldEtleWZyYW1lQW5pbWF0aW9uKEFuaW1hdGVkUHJv
cGVydHlXZWJraXRUcmFuc2Zvcm0sIGdldEFuaW1hdGlvblZhbHVlRnVuY3Rpb24ob3BUeXBlKSwg
ZnVuY3Rpb25JbmRleCwgdGltZXNBcnJheSwgdmFsQXJyYXksIHRmQXJyYXksIGlzVHJhbnNpdGlv
biwgYW5pbSwgYmVnaW5UaW1lKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgW3RpbWVzQXJy
YXkgcmVsZWFzZV07CisgICAgICAgICAgICBbdmFsQXJyYXkgcmVsZWFzZV07CisgICAgICAgICAg
ICBbdGZBcnJheSByZWxlYXNlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIElz
IGEgdHJhbnNpdGlvbgorICAgICAgICAgICAgaWQgZnJvbVZhbHVlLCB0b1ZhbHVlOworICAgICAg
ICAgICAgCisgICAgICAgICAgICBpZiAoaXNNYXRyaXhBbmltYXRpb24pIHsKKyAgICAgICAgICAg
ICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBmcm9tdCwgdG90OworICAgICAgICAgICAgICAgIHZh
bHVlTGlzdC5hdCgwKS52YWx1ZSgpLT5hcHBseShzaXplLCBmcm9tdCk7CisgICAgICAgICAgICAg
ICAgdmFsdWVMaXN0LmF0KDEpLnZhbHVlKCktPmFwcGx5KHNpemUsIHRvdCk7CisgICAgICAgICAg
ICAgICAgCisgICAgICAgICAgICAgICAgQ0FUcmFuc2Zvcm0zRCBjYXQ7CisgICAgICAgICAgICAg
ICAgY29weVRyYW5zZm9ybShjYXQsIGZyb210KTsKKyAgICAgICAgICAgICAgICBmcm9tVmFsdWUg
PSBbTlNWYWx1ZSB2YWx1ZVdpdGhDQVRyYW5zZm9ybTNEOmNhdF07CisgICAgICAgICAgICAgICAg
Y29weVRyYW5zZm9ybShjYXQsIHRvdCk7CisgICAgICAgICAgICAgICAgdG9WYWx1ZSA9IFtOU1Zh
bHVlIHZhbHVlV2l0aENBVHJhbnNmb3JtM0Q6Y2F0XTsKKyAgICAgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICAgICAgZnJvbVZhbHVlID0gZ2V0VHJhbnNmb3JtRnVuY3Rpb25WYWx1ZSh2YWx1
ZUxpc3QuYXQoMCksIGZ1bmN0aW9uSW5kZXgsIHNpemUsIG9wVHlwZSk7CisgICAgICAgICAgICAg
ICAgdG9WYWx1ZSA9IGdldFRyYW5zZm9ybUZ1bmN0aW9uVmFsdWUodmFsdWVMaXN0LmF0KDEpLCBm
dW5jdGlvbkluZGV4LCBzaXplLCBvcFR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
CisgICAgICAgICAgICBzZXRCYXNpY0FuaW1hdGlvbihBbmltYXRlZFByb3BlcnR5V2Via2l0VHJh
bnNmb3JtLCBnZXRBbmltYXRpb25WYWx1ZUZ1bmN0aW9uKG9wVHlwZSksIGZ1bmN0aW9uSW5kZXgs
IGZyb21WYWx1ZSwgdG9WYWx1ZSwgaXNUcmFuc2l0aW9uLCBhbmltLCBiZWdpblRpbWUpOworICAg
ICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoaXNNYXRyaXhBbmltYXRpb24pCisgICAgICAg
ICAgICBicmVhazsKKyAgICB9CisKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAg
cmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgR3JhcGhpY3NMYXllckNBOjphbmltYXRlRmxvYXQoQW5p
bWF0ZWRQcm9wZXJ0eUlEIHByb3BlcnR5LCBjb25zdCBGbG9hdFZhbHVlTGlzdCYgdmFsdWVMaXN0
LCBjb25zdCBBbmltYXRpb24qIGFuaW1hdGlvbiwgZG91YmxlIGJlZ2luVGltZSkKK3sKKyAgICBp
ZiAodmFsdWVMaXN0LnNpemUoKSA8IDIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
CisgICAgLy8gaWYgdGhlcmUgaXMgYWxyZWFkeSBpcyBhbiBhbmltYXRpb24gZm9yIHRoaXMgcHJv
cGVydHkgYW5kIGl0IGhhc24ndCBjaGFuZ2VkLCBpZ25vcmUgaXQuCisgICAgaW50IGkgPSBmaW5k
QW5pbWF0aW9uRW50cnkocHJvcGVydHksIDApOworICAgIGlmIChpID49IDAgJiYgKm1fYW5pbWF0
aW9uc1tpXS5hbmltYXRpb24oKSA9PSAqYW5pbWF0aW9uKSB7CisgICAgICAgIG1fYW5pbWF0aW9u
c1tpXS5zZXRJc0N1cnJlbnQoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAg
IGlmICh2YWx1ZUxpc3Quc2l6ZSgpID09IDIpIHsKKyAgICAgICAgZmxvYXQgZnJvbVZhbCA9IHZh
bHVlTGlzdC5hdCgwKS52YWx1ZSgpOworICAgICAgICBmbG9hdCB0b1ZhbCAgID0gdmFsdWVMaXN0
LmF0KDEpLnZhbHVlKCk7CisgICAgICAgIGlmIChpc25hbih0b1ZhbCkgJiYgaXNuYW4oZnJvbVZh
bCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgICAgIC8vIGluaXRpYWxp
emUgdGhlIHByb3BlcnR5IHRvIDAKKyAgICAgICAgW2FuaW1hdGVkTGF5ZXIocHJvcGVydHkpIHNl
dFZhbHVlOjAgZm9yS2V5UGF0aDpwcm9wZXJ0eUlkVG9TdHJpbmcocHJvcGVydHkpXTsKKyAgICAg
ICAgc2V0QmFzaWNBbmltYXRpb24ocHJvcGVydHksICIiLCAwLCBpc25hbihmcm9tVmFsKSA/IG5p
bCA6IFtOU051bWJlciBudW1iZXJXaXRoRmxvYXQ6ZnJvbVZhbF0sIGlzbmFuKHRvVmFsKSA/IG5p
bCA6IFtOU051bWJlciBudW1iZXJXaXRoRmxvYXQ6dG9WYWxdLCBmYWxzZSwgYW5pbWF0aW9uLCBi
ZWdpblRpbWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBCRUdJTl9CTE9D
S19PQkpDX0VYQ0VQVElPTlMKKyAgICAKKyAgICBOU011dGFibGVBcnJheSogdGltZXNBcnJheSA9
IFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRdOworICAgIE5TTXV0YWJsZUFycmF5KiB2YWxB
cnJheSA9IFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRdOworICAgIE5TTXV0YWJsZUFycmF5
KiB0ZkFycmF5ID0gW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdF07CisKKyAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgdmFsdWVMaXN0LnZhbHVlcygpLnNpemUoKTsgKytpKSB7CisgICAg
ICAgIGNvbnN0IEZsb2F0VmFsdWUmIGN1clZhbHVlID0gdmFsdWVMaXN0LnZhbHVlcygpW2ldOwor
ICAgICAgICBbdGltZXNBcnJheSBhZGRPYmplY3Q6W05TTnVtYmVyIG51bWJlcldpdGhGbG9hdDpj
dXJWYWx1ZS5rZXkoKV1dOworICAgICAgICBbdmFsQXJyYXkgYWRkT2JqZWN0OltOU051bWJlciBu
dW1iZXJXaXRoRmxvYXQ6Y3VyVmFsdWUudmFsdWUoKV1dOworCisgICAgICAgIGNvbnN0IFRpbWlu
Z0Z1bmN0aW9uKiB0ZiA9IDA7CisgICAgICAgIGlmIChjdXJWYWx1ZS50aW1pbmdGdW5jdGlvbigp
KQorICAgICAgICAgICAgdGYgPSBjdXJWYWx1ZS50aW1pbmdGdW5jdGlvbigpOworICAgICAgICBl
bHNlIGlmIChhbmltYXRpb24tPmlzVGltaW5nRnVuY3Rpb25TZXQoKSkKKyAgICAgICAgICAgIHRm
ID0gJmFuaW1hdGlvbi0+dGltaW5nRnVuY3Rpb24oKTsKKworICAgICAgICBDQU1lZGlhVGltaW5n
RnVuY3Rpb24qIHRpbWluZ0Z1bmN0aW9uID0gZ2V0Q0FNZWRpYVRpbWluZ0Z1bmN0aW9uKHRmID8g
KnRmIDogVGltaW5nRnVuY3Rpb24oKSk7CisgICAgICAgIFt0ZkFycmF5IGFkZE9iamVjdDp0aW1p
bmdGdW5jdGlvbl07CisgICAgfQorICAgIAorICAgIC8vIFdlIHRvc3MgdGhlIGxhc3QgdGZBcnJh
eSB2YWx1ZSBiZWNhdXNlIGl0IGhhcyB0byBvbmUgc2hvcnRlciB0aGFuIHRoZSBvdGhlcnMuCisg
ICAgW3RmQXJyYXkgcmVtb3ZlTGFzdE9iamVjdF07CisgICAgCisgICAgLy8gSW5pdGlhbGl6ZSB0
aGUgcHJvcGVydHkgdG8gMC4KKyAgICBbYW5pbWF0ZWRMYXllcihwcm9wZXJ0eSkgc2V0VmFsdWU6
MCBmb3JLZXlQYXRoOnByb3BlcnR5SWRUb1N0cmluZyhwcm9wZXJ0eSldOworICAgIC8vIFRoZW4g
c2V0IHRoZSBhbmltYXRpb24uCisgICAgc2V0S2V5ZnJhbWVBbmltYXRpb24ocHJvcGVydHksICIi
LCAwLCB0aW1lc0FycmF5LCB2YWxBcnJheSwgdGZBcnJheSwgZmFsc2UsIGFuaW1hdGlvbiwgYmVn
aW5UaW1lKTsKKworICAgIFt0aW1lc0FycmF5IHJlbGVhc2VdOworICAgIFt2YWxBcnJheSByZWxl
YXNlXTsKKyAgICBbdGZBcnJheSByZWxlYXNlXTsKKworICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQ
VElPTlMKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0E6OnNldENv
bnRlbnRzVG9JbWFnZShJbWFnZSogaW1hZ2UpCit7CisgICAgaWYgKGltYWdlKSB7CisgICAgICAg
IHNldEhhc0NvbnRlbnRzTGF5ZXIodHJ1ZSk7CisKKyAgICAgICAgLy8gRklYTUU6IGlzIGltYWdl
IGZsaXBwaW5nIHJlYWxseSBhIHByb3BlcnR5IG9mIHRoZSBncmFwaGljcyBjb250ZXh0PworICAg
ICAgICBib29sIG5lZWRUb0ZsaXAgPSBHcmFwaGljc0xheWVyOjpncmFwaGljc0NvbnRleHRzRmxp
cHBlZCgpOworICAgICAgICBDR1BvaW50IGFuY2hvclBvaW50ID0gbmVlZFRvRmxpcCA/IENHUG9p
bnRNYWtlKDAuMGYsIDEuMGYpIDogQ0dQb2ludFplcm87CisKKyAgICAgICAgQkVHSU5fQkxPQ0tf
T0JKQ19FWENFUFRJT05TCisgICAgICAgIHsKKyAgICAgICAgICAgIENHSW1hZ2VSZWYgdGhlSW1h
Z2UgPSBpbWFnZS0+bmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKTsKKyAgICAgICAgICAgIC8v
IEZJWE1FOiBtYXliZSBvbmx5IGRvIHRyaWxpbmVhciBpZiB0aGUgaW1hZ2UgaXMgYmVpbmcgc2Nh
bGVkIGRvd24sCisgICAgICAgICAgICAvLyBidXQgdGhlbiB3aGF0IGlmIHRoZSBsYXllciBzaXpl
IGNoYW5nZXM/CisjaWYgIWRlZmluZWQoQlVJTERJTkdfT05fVElHRVIpICYmICFkZWZpbmVkKEJV
SUxESU5HX09OX0xFT1BBUkQpCisgICAgICAgICAgICBbbV9jb250ZW50c0xheWVyLmdldCgpIHNl
dE1pbmlmaWNhdGlvbkZpbHRlcjprQ0FGaWx0ZXJUcmlsaW5lYXJdOworI2VuZGlmCisgICAgICAg
ICAgICBpZiAobmVlZFRvRmxpcCkgeworICAgICAgICAgICAgICAgIENBVHJhbnNmb3JtM0QgZmxp
cHBlciA9IHsKKyAgICAgICAgICAgICAgICAgICAgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwKKyAg
ICAgICAgICAgICAgICAgICAgMC4wZiwgLTEuMGYsIDAuMGYsIDAuMGYsCisgICAgICAgICAgICAg
ICAgICAgIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsCisgICAgICAgICAgICAgICAgICAgIDAuMGYs
IDAuMGYsIDAuMGYsIDEuMGZ9OworICAgICAgICAgICAgICAgIFttX2NvbnRlbnRzTGF5ZXIuZ2V0
KCkgc2V0VHJhbnNmb3JtOmZsaXBwZXJdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBb
bV9jb250ZW50c0xheWVyLmdldCgpIHNldEFuY2hvclBvaW50OmFuY2hvclBvaW50XTsKKyAgICAg
ICAgICAgIFttX2NvbnRlbnRzTGF5ZXIuZ2V0KCkgc2V0Q29udGVudHM6KGlkKXRoZUltYWdlXTsK
KyAgICAgICAgfQorICAgICAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgfSBlbHNl
CisgICAgICAgIHNldEhhc0NvbnRlbnRzTGF5ZXIoZmFsc2UpOworCisgICAgbV9jb250ZW50TGF5
ZXJGb3JJbWFnZU9yVmlkZW8gPSAoaW1hZ2UgIT0gMCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXll
ckNBOjpzZXRDb250ZW50c1RvVmlkZW8oUGxhdGZvcm1MYXllciogdmlkZW9MYXllcikKK3sKKyAg
ICBzZXRDb250ZW50c0xheWVyKHZpZGVvTGF5ZXIpOworICAgIG1fY29udGVudExheWVyRm9ySW1h
Z2VPclZpZGVvID0gKHZpZGVvTGF5ZXIgIT0gMCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNB
OjpjbGVhckNvbnRlbnRzKCkKK3sKKyAgICBpZiAobV9jb250ZW50TGF5ZXJGb3JJbWFnZU9yVmlk
ZW8pIHsKKyAgICAgICAgc2V0SGFzQ29udGVudHNMYXllcihmYWxzZSk7CisgICAgICAgIG1fY29u
dGVudExheWVyRm9ySW1hZ2VPclZpZGVvID0gZmFsc2U7CisgICAgfQorfQorCit2b2lkIEdyYXBo
aWNzTGF5ZXJDQTo6dXBkYXRlQ29udGVudHNSZWN0KCkKK3sKKyAgICBpZiAobV9jbGllbnQgJiYg
bV9jb250ZW50c0xheWVyKSB7CisgICAgICAgIEludFJlY3QgY29udGVudFJlY3QgPSBtX2NsaWVu
dC0+Y29udGVudHNCb3godGhpcyk7CisgICAgICAgIAorICAgICAgICBDR1BvaW50IHBvaW50ID0g
Q0dQb2ludE1ha2UoY29udGVudFJlY3QueCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY29udGVudFJlY3QueSgpKTsKKyAgICAgICAgQ0dSZWN0IHJlY3QgPSBDR1JlY3RN
YWtlKDAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjBmLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFJlY3Qud2lkdGgoKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRSZWN0LmhlaWdodCgpKTsKKworICAgICAg
ICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICAgICAgW21fY29udGVudHNMYXllci5n
ZXQoKSBzZXRQb3NpdGlvbjpwb2ludF07CisgICAgICAgIFttX2NvbnRlbnRzTGF5ZXIuZ2V0KCkg
c2V0Qm91bmRzOnJlY3RdOworICAgICAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAg
fQorfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6c2V0QmFzaWNBbmltYXRpb24oQW5pbWF0ZWRQ
cm9wZXJ0eUlEIHByb3BlcnR5LCBjb25zdCBTdHJpbmcmIHZhbHVlRnVuY3Rpb24sIHNob3J0IGlu
ZGV4LCB2b2lkKiBmcm9tVmFsLCB2b2lkKiB0b1ZhbCwgYm9vbCBpc1RyYW5zaXRpb24sIGNvbnN0
IEFuaW1hdGlvbiogdHJhbnNpdGlvbiwgZG91YmxlIGJlZ2luVGltZSkKK3sKKyAgICBBU1NFUlQo
ZnJvbVZhbCB8fCB0b1ZhbCk7CisKKyAgICBXZWJMYXllciogbGF5ZXIgPSBhbmltYXRlZExheWVy
KHByb3BlcnR5KTsKKyAgICAKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKworICAg
IC8vIGFkZCBhbiBlbnRyeSBmb3IgdGhpcyBhbmltYXRpb24KKyAgICBhZGRBbmltYXRpb25FbnRy
eShwcm9wZXJ0eSwgaW5kZXgsIGlzVHJhbnNpdGlvbiwgdHJhbnNpdGlvbik7CisKKyAgICBTdHJp
bmcga2V5UGF0aCA9IHByb3BlcnR5SWRUb1N0cmluZyhwcm9wZXJ0eSk7CisgICAgU3RyaW5nIGFu
aW1OYW1lID0ga2V5UGF0aCArICJfIiArIFN0cmluZzo6bnVtYmVyKGluZGV4KTsKKworICAgIENB
QmFzaWNBbmltYXRpb24qIGJhc2ljQW5pbSA9IFtDQUJhc2ljQW5pbWF0aW9uIGFuaW1hdGlvbldp
dGhLZXlQYXRoOmtleVBhdGhdOworICAgIAorICAgIGRvdWJsZSBkdXJhdGlvbiA9IHRyYW5zaXRp
b24tPmR1cmF0aW9uKCk7CisgICAgaWYgKGR1cmF0aW9uIDw9IDApCisgICAgICAgIGR1cmF0aW9u
ID0gY0FuaW1hdGlvbkFsbW9zdFplcm9EdXJhdGlvbjsKKyAgICAgICAgCisgICAgZmxvYXQgcmVw
ZWF0Q291bnQgPSB0cmFuc2l0aW9uLT5pdGVyYXRpb25Db3VudCgpOworICAgIGlmIChyZXBlYXRD
b3VudCA8IDApCisgICAgICAgIHJlcGVhdENvdW50ID0gRkxUX01BWDsKKyAgICBlbHNlIGlmICh0
cmFuc2l0aW9uLT5kaXJlY3Rpb24oKSkgICAvLyBJZiB3ZSBhbHRlcm5hdGUsIHRoZSBudW1iZXIg
b2YgY3ljbGVzIGlzIGhhbHZlZAorICAgICAgICByZXBlYXRDb3VudCAvPSAyOworICAgICAgICAK
KyAgICBbYmFzaWNBbmltIHNldER1cmF0aW9uOmR1cmF0aW9uXTsKKyAgICBbYmFzaWNBbmltIHNl
dFJlcGVhdENvdW50OnJlcGVhdENvdW50XTsKKyAgICBbYmFzaWNBbmltIHNldEF1dG9yZXZlcnNl
czp0cmFuc2l0aW9uLT5kaXJlY3Rpb24oKV07CisgICAgW2Jhc2ljQW5pbSBzZXRSZW1vdmVkT25D
b21wbGV0aW9uOk5PXTsKKworICAgIC8vIE5vdGUgdGhhdCBjdXJyZW50bHkgdHJhbnNmb3JtIGlz
IHRoZSBvbmx5IHByb3BlcnR5IHdoaWNoIGhhcyBhbmltYXRpb25zCisgICAgLy8gd2l0aCBhbiBp
bmRleCA+IDAuCisgICAgW2Jhc2ljQW5pbSBzZXRBZGRpdGl2ZTpwcm9wZXJ0eSA9PSBBbmltYXRl
ZFByb3BlcnR5V2Via2l0VHJhbnNmb3JtXTsKKyAgICBbYmFzaWNBbmltIHNldEZpbGxNb2RlOkAi
ZXh0ZW5kZWQiXTsKKyAgICBbYmFzaWNBbmltIHNldFZhbHVlRnVuY3Rpb246W0NBVmFsdWVGdW5j
dGlvbiBmdW5jdGlvbldpdGhOYW1lOnZhbHVlRnVuY3Rpb25dXTsKKyAgICAKKyAgICAvLyBTZXQg
dGhlIGRlbGVnYXRlIChhbmQgcHJvcGVydHkgdmFsdWUpLgorICAgIGludCBwcm9wID0gaXNUcmFu
c2l0aW9uID8gcHJvcGVydHkgOiBBbmltYXRlZFByb3BlcnR5SW52YWxpZDsKKyAgICBbYmFzaWNB
bmltIHNldFZhbHVlOltOU051bWJlciBudW1iZXJXaXRoSW50OnByb3BdIGZvcktleTpXZWJBbmlt
YXRpb25DU1NQcm9wZXJ0eUtleV07CisgICAgW2Jhc2ljQW5pbSBzZXREZWxlZ2F0ZTptX2FuaW1h
dGlvbkRlbGVnYXRlLmdldCgpXTsKKworICAgIE5TVGltZUludGVydmFsIGJ0ID0gYmVnaW5UaW1l
ID8gW2xheWVyIGNvbnZlcnRUaW1lOmN1cnJlbnRUaW1lVG9NZWRpYVRpbWUoYmVnaW5UaW1lKSBm
cm9tTGF5ZXI6bmlsXSA6IDA7CisgICAgW2Jhc2ljQW5pbSBzZXRCZWdpblRpbWU6YnRdOworICAg
IAorICAgIGlmIChmcm9tVmFsKQorICAgICAgICBbYmFzaWNBbmltIHNldEZyb21WYWx1ZTpyZWlu
dGVycHJldF9jYXN0PGlkPihmcm9tVmFsKV07CisgICAgaWYgKHRvVmFsKQorICAgICAgICBbYmFz
aWNBbmltIHNldFRvVmFsdWU6cmVpbnRlcnByZXRfY2FzdDxpZD4odG9WYWwpXTsKKworICAgIGNv
bnN0IFRpbWluZ0Z1bmN0aW9uKiB0ZiA9IDA7CisgICAgaWYgKHRyYW5zaXRpb24tPmlzVGltaW5n
RnVuY3Rpb25TZXQoKSkKKyAgICAgICAgdGYgPSAmdHJhbnNpdGlvbi0+dGltaW5nRnVuY3Rpb24o
KTsKKworICAgIENBTWVkaWFUaW1pbmdGdW5jdGlvbiogdGltaW5nRnVuY3Rpb24gPSBnZXRDQU1l
ZGlhVGltaW5nRnVuY3Rpb24odGYgPyAqdGYgOiBUaW1pbmdGdW5jdGlvbigpKTsKKyAgICBbYmFz
aWNBbmltIHNldFRpbWluZ0Z1bmN0aW9uOnRpbWluZ0Z1bmN0aW9uXTsKKworICAgIC8vIFNlbmQg
b3ZlciB0aGUgYW5pbWF0aW9uLgorICAgIFtsYXllciByZW1vdmVBbmltYXRpb25Gb3JLZXk6YW5p
bU5hbWVdOworICAgIFtsYXllciBhZGRBbmltYXRpb246YmFzaWNBbmltIGZvcktleTphbmltTmFt
ZV07CisgICAgCisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUworfQorCit2b2lkIEdyYXBo
aWNzTGF5ZXJDQTo6c2V0S2V5ZnJhbWVBbmltYXRpb24oQW5pbWF0ZWRQcm9wZXJ0eUlEIHByb3Bl
cnR5LCBjb25zdCBTdHJpbmcmIHZhbHVlRnVuY3Rpb24sIHNob3J0IGluZGV4LCB2b2lkKiBrZXlz
LCB2b2lkKiB2YWx1ZXMsIHZvaWQqIHRpbWluZ0Z1bmN0aW9ucywgCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBib29sIGlzVHJhbnNpdGlvbiwgY29uc3QgQW5pbWF0aW9uKiBh
bmltLCBkb3VibGUgYmVnaW5UaW1lKQoreworICAgIFBsYXRmb3JtTGF5ZXIqIGxheWVyID0gYW5p
bWF0ZWRMYXllcihwcm9wZXJ0eSk7CisKKyAgICAvLyBBZGQgYW4gZW50cnkgZm9yIHRoaXMgYW5p
bWF0aW9uICh3aGljaCBtYXkgY2hhbmdlIGJlZ2luVGltZSkuCisgICAgYWRkQW5pbWF0aW9uRW50
cnkocHJvcGVydHksIGluZGV4LCBpc1RyYW5zaXRpb24sIGFuaW0pOworCisgICAgU3RyaW5nIGtl
eVBhdGggPSBwcm9wZXJ0eUlkVG9TdHJpbmcocHJvcGVydHkpOworICAgIFN0cmluZyBhbmltTmFt
ZSA9IGtleVBhdGggKyAiXyIgKyBTdHJpbmc6Om51bWJlcihpbmRleCk7CisKKyAgICBCRUdJTl9C
TE9DS19PQkpDX0VYQ0VQVElPTlMKKworICAgIENBS2V5ZnJhbWVBbmltYXRpb24qIGtleWZyYW1l
QW5pbSA9IFtDQUtleWZyYW1lQW5pbWF0aW9uIGFuaW1hdGlvbldpdGhLZXlQYXRoOmtleVBhdGhd
OworCisgICAgZG91YmxlIGR1cmF0aW9uID0gYW5pbS0+ZHVyYXRpb24oKTsKKyAgICBpZiAoZHVy
YXRpb24gPD0gMCkKKyAgICAgICAgZHVyYXRpb24gPSBjQW5pbWF0aW9uQWxtb3N0WmVyb0R1cmF0
aW9uOworCisgICAgZmxvYXQgcmVwZWF0Q291bnQgPSBhbmltLT5pdGVyYXRpb25Db3VudCgpOwor
ICAgIGlmIChyZXBlYXRDb3VudCA8IDApCisgICAgICAgIHJlcGVhdENvdW50ID0gRkxUX01BWDsK
KyAgICBlbHNlIGlmIChhbmltLT5kaXJlY3Rpb24oKSkKKyAgICAgICAgcmVwZWF0Q291bnQgLz0g
MjsKKworICAgIFtrZXlmcmFtZUFuaW0gc2V0RHVyYXRpb246ZHVyYXRpb25dOworICAgIFtrZXlm
cmFtZUFuaW0gc2V0UmVwZWF0Q291bnQ6cmVwZWF0Q291bnRdOworICAgIFtrZXlmcmFtZUFuaW0g
c2V0QXV0b3JldmVyc2VzOmFuaW0tPmRpcmVjdGlvbigpXTsKKyAgICBba2V5ZnJhbWVBbmltIHNl
dFJlbW92ZWRPbkNvbXBsZXRpb246Tk9dOworCisgICAgLy8gVGhlIGZpcnN0IGFuaW1hdGlvbiBp
cyBub24tYWRkaXRpdmUsIGFsbCB0aGUgcmVzdCBhcmUgYWRkaXRpdmUuCisgICAgLy8gTm90ZSB0
aGF0IGN1cnJlbnRseSB0cmFuc2Zvcm0gaXMgdGhlIG9ubHkgcHJvcGVydHkgd2hpY2ggaGFzIGFu
aW1hdGlvbnMKKyAgICAvLyB3aXRoIGFuIGluZGV4ID4gMAorICAgIC8vIEZJWE1FOiBhZGRpdGl2
ZSBhbmltYXRpb25zIGFyZSBub3Qgc3VwcHJvdGVkLCBzbyB3aHkgdGhpcz8KKyAgICBba2V5ZnJh
bWVBbmltIHNldEFkZGl0aXZlOihwcm9wZXJ0eSA9PSBBbmltYXRlZFByb3BlcnR5V2Via2l0VHJh
bnNmb3JtKSA/IFlFUyA6IE5PXTsKKyAgICBba2V5ZnJhbWVBbmltIHNldEZpbGxNb2RlOkAiZXh0
ZW5kZWQiXTsKKyAgICBba2V5ZnJhbWVBbmltIHNldFZhbHVlRnVuY3Rpb246W0NBVmFsdWVGdW5j
dGlvbiBmdW5jdGlvbldpdGhOYW1lOnZhbHVlRnVuY3Rpb25dXTsKKyAgICAKKyAgICBba2V5ZnJh
bWVBbmltIHNldEtleVRpbWVzOnJlaW50ZXJwcmV0X2Nhc3Q8aWQ+KGtleXMpXTsKKyAgICBba2V5
ZnJhbWVBbmltIHNldFZhbHVlczpyZWludGVycHJldF9jYXN0PGlkPih2YWx1ZXMpXTsKKyAgICAK
KyAgICAvLyBTZXQgdGhlIGRlbGVnYXRlIChhbmQgcHJvcGVydHkgdmFsdWUpLgorICAgIGludCBw
cm9wID0gaXNUcmFuc2l0aW9uID8gcHJvcGVydHkgOiBBbmltYXRlZFByb3BlcnR5SW52YWxpZDsK
KyAgICBba2V5ZnJhbWVBbmltIHNldFZhbHVlOltOU051bWJlciBudW1iZXJXaXRoSW50OiBwcm9w
XSBmb3JLZXk6V2ViQW5pbWF0aW9uQ1NTUHJvcGVydHlLZXldOworICAgIFtrZXlmcmFtZUFuaW0g
c2V0RGVsZWdhdGU6bV9hbmltYXRpb25EZWxlZ2F0ZS5nZXQoKV07CisKKyAgICBOU1RpbWVJbnRl
cnZhbCBidCA9IGJlZ2luVGltZSA/IFtsYXllciBjb252ZXJ0VGltZTpjdXJyZW50VGltZVRvTWVk
aWFUaW1lKGJlZ2luVGltZSkgZnJvbUxheWVyOm5pbF0gOiAwOworICAgIFtrZXlmcmFtZUFuaW0g
c2V0QmVnaW5UaW1lOmJ0XTsKKyAgICAKKyAgICAvLyBTZXQgdGhlIHRpbWluZyBmdW5jdGlvbnMs
IGlmIGFueS4KKyAgICBpZiAodGltaW5nRnVuY3Rpb25zICE9IG5pbCkKKyAgICAgICAgW2tleWZy
YW1lQW5pbSBzZXRUaW1pbmdGdW5jdGlvbnM6KGlkKXRpbWluZ0Z1bmN0aW9uc107CisgICAgICAg
IAorICAgIC8vIFNlbmQgb3ZlciB0aGUgYW5pbWF0aW9uLgorICAgIFtsYXllciByZW1vdmVBbmlt
YXRpb25Gb3JLZXk6YW5pbU5hbWVdOworICAgIFtsYXllciBhZGRBbmltYXRpb246a2V5ZnJhbWVB
bmltIGZvcktleTphbmltTmFtZV07CisgICAgICAgIAorICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQ
VElPTlMKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0E6OnN1c3BlbmRBbmltYXRpb25zKCkKK3sK
KyAgICBkb3VibGUgdCA9IGN1cnJlbnRUaW1lVG9NZWRpYVRpbWUoY3VycmVudFRpbWUoKSk7Cisg
ICAgW3ByaW1hcnlMYXllcigpIHNldFNwZWVkOjBdOworICAgIFtwcmltYXJ5TGF5ZXIoKSBzZXRU
aW1lT2Zmc2V0OnRdOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6cmVzdW1lQW5pbWF0aW9u
cygpCit7CisgICAgW3ByaW1hcnlMYXllcigpIHNldFNwZWVkOjFdOworICAgIFtwcmltYXJ5TGF5
ZXIoKSBzZXRUaW1lT2Zmc2V0OjBdOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6cmVtb3Zl
QW5pbWF0aW9uKGludCBpbmRleCwgYm9vbCByZXNldCkKK3sKKyAgICBBU1NFUlQoaW5kZXggPj0g
MCk7CisKKyAgICBBbmltYXRlZFByb3BlcnR5SUQgcHJvcGVydHkgPSBtX2FuaW1hdGlvbnNbaW5k
ZXhdLnByb3BlcnR5KCk7CisgICAgCisgICAgLy8gU2V0IHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVy
dHkgYW5kIHJlbW92ZSB0aGUgYW5pbWF0aW9uLgorICAgIFN0cmluZyBrZXlQYXRoID0gcHJvcGVy
dHlJZFRvU3RyaW5nKHByb3BlcnR5KTsKKyAgICBTdHJpbmcgYW5pbU5hbWUgPSBrZXlQYXRoICsg
Il8iICsgU3RyaW5nOjpudW1iZXIobV9hbmltYXRpb25zW2luZGV4XS5pbmRleCgpKTsKKyAgICBD
QUxheWVyKiBsYXllciA9IGFuaW1hdGVkTGF5ZXIocHJvcGVydHkpOworCisgICAgQkVHSU5fQkxP
Q0tfT0JKQ19FWENFUFRJT05TCisKKyAgICAvLyBJZiB3ZSBhcmUgbm90IHJlc2V0dGluZywgaXQg
bWVhbnMgd2UgYXJlIHBhdXNpbmcuIFNvIHdlIG5lZWQgdG8gZ2V0IHRoZSBjdXJyZW50IHByZXNl
bnRhdGlvbgorICAgIC8vIHZhbHVlIGludG8gdGhlIHByb3BlcnR5IGJlZm9yZSB3ZSByZW1vdmUg
dGhlIGFuaW1hdGlvbi4KKyAgICBpZiAoIXJlc2V0KSB7CisgICAgICAgIC8vIFB1dCB0aGUgY3Vy
cmVudCB2YWx1ZSBpbnRvIHRoZSBwcm9wZXJ0eS4KKyAgICAgICAgQ0FMYXllciogcHJlc0xheWVy
ID0gW2xheWVyIHByZXNlbnRhdGlvbkxheWVyXTsKKyAgICAgICAgaWYgKHByZXNMYXllcikKKyAg
ICAgICAgICAgIFtsYXllciBzZXRWYWx1ZTpbcHJlc0xheWVyIHZhbHVlRm9yS2V5UGF0aDprZXlQ
YXRoXSBmb3JLZXlQYXRoOmtleVBhdGhdOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgc2F2
ZWQgdmFsdWVzIGFjY3VyYXRlbHkgcmVmbGVjdCB0aGUgdmFsdWUgaW4gdGhlIGxheWVyLgorICAg
ICAgICBpZCB2YWwgPSBbbGF5ZXIgdmFsdWVGb3JLZXlQYXRoOmtleVBhdGhdOworICAgICAgICBz
d2l0Y2ggKHByb3BlcnR5KSB7CisgICAgICAgICAgICBjYXNlIEFuaW1hdGVkUHJvcGVydHlXZWJr
aXRUcmFuc2Zvcm06CisgICAgICAgICAgICAgICAgLy8gRklYTUU6IG5lZWRzIGNvbW1lbnQgZXhw
bGFpbmluZyB3aHkgdGhlIG1fdHJhbnNmb3JtIGlzIG5vdCBvYnRhaW5lZCBmcm9tIHRoZSBsYXll
cgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBbmltYXRlZFByb3Bl
cnR5QmFja2dyb3VuZENvbG9yOgorICAgICAgICAgICAgICAgIG1fYmFja2dyb3VuZENvbG9yID0g
Q29sb3IocmVpbnRlcnByZXRfY2FzdDxDR0NvbG9yUmVmPih2YWwpKTsKKyAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQW5pbWF0ZWRQcm9wZXJ0eU9wYWNpdHk6CisgICAg
ICAgICAgICAgICAgbV9vcGFjaXR5ID0gW3ZhbCBmbG9hdFZhbHVlXTsKKyAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQW5pbWF0ZWRQcm9wZXJ0eUludmFsaWQ6CisgICAg
ICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8gSWYgd2UgaGF2ZSByZWFjaGVkIHRoZSBl
bmQgb2YgYW4gYW5pbWF0aW9uLCB3ZSBkb24ndCB3YW50IHRvIGFjdHVhbGx5IHJlbW92ZSB0aGUg
CisgICAgLy8gYW5pbWF0aW9uIGZyb20gdGhlIENBTGF5ZXIuIEF0IHNvbWUgcG9pbnQgd2Ugd2ls
bCBiZSBzZXR0aW5nIHRoZSBwcm9wZXJ0eSB0byBpdHMKKyAgICAvLyB1bmFuaW1hdGVkIHZhbHVl
IGFuZCBhdCB0aGF0IHBvaW50IHdlIHdpbGwgcmVtb3ZlIHRoZSBhbmltYXRpb24uIFRoYXQgd2ls
bCBhdm9pZAorICAgIC8vIGFueSBmbGFzaGluZyBiZXR3ZWVuIHRoZSB0aW1lIHRoZSBhbmltYXRp
b24gaXMgcmVtb3ZlZCBhbmQgdGhlIHByb3BlcnR5IGlzIHNldC4KKyAgICBpZiAoIXJlc2V0IHx8
IG1fYW5pbWF0aW9uc1tpbmRleF0uaXNUcmFuc2l0aW9uKCkpCisgICAgICAgIFtsYXllciByZW1v
dmVBbmltYXRpb25Gb3JLZXk6YW5pbU5hbWVdOworCisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBU
SU9OUworCisgICAgLy8gUmVtb3ZlIHRoZSBhbmltYXRpb24gZW50cnkuCisgICAgbV9hbmltYXRp
b25zLnJlbW92ZShpbmRleCk7Cit9CisKK1BsYXRmb3JtTGF5ZXIqIEdyYXBoaWNzTGF5ZXJDQTo6
aG9zdExheWVyRm9yU3VibGF5ZXJzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90cmFuc2Zvcm1M
YXllciA/IG1fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkgOiBtX2xheWVyLmdldCgpOworfQorCitQbGF0
Zm9ybUxheWVyKiBHcmFwaGljc0xheWVyQ0E6OmxheWVyRm9yU3VwZXJsYXllcigpIGNvbnN0Cit7
CisgICAgaWYgKG1fdHJhbnNmb3JtTGF5ZXIpCisgICAgICAgIHJldHVybiBtX3RyYW5zZm9ybUxh
eWVyLmdldCgpOworCisgICAgcmV0dXJuIG1fbGF5ZXIuZ2V0KCk7Cit9CisKK1BsYXRmb3JtTGF5
ZXIqIEdyYXBoaWNzTGF5ZXJDQTo6cGxhdGZvcm1MYXllcigpIGNvbnN0Cit7CisgICAgcmV0dXJu
IHByaW1hcnlMYXllcigpOworfQorCisjaWZuZGVmIE5ERUJVRwordm9pZCBHcmFwaGljc0xheWVy
Q0E6OnNldERlYnVnQmFja2dyb3VuZENvbG9yKGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBC
RUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICAKKyAgICBpZiAoY29sb3IuaXNWYWxpZCgp
KQorICAgICAgICBzZXRMYXllckJhY2tncm91bmRDb2xvcihtX2xheWVyLmdldCgpLCBjb2xvcik7
CisgICAgZWxzZQorICAgICAgICBjbGVhckxheWVyQmFja2dyb3VuZENvbG9yKG1fbGF5ZXIuZ2V0
KCkpOworICAgIAorICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKK30KKwordm9pZCBHcmFw
aGljc0xheWVyQ0E6OnNldERlYnVnQm9yZGVyKGNvbnN0IENvbG9yJiBjb2xvciwgZmxvYXQgYm9y
ZGVyV2lkdGgpCit7CisgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgCisgICAg
aWYgKGNvbG9yLmlzVmFsaWQoKSkgeworICAgICAgICBzZXRMYXllckJvcmRlckNvbG9yKG1fbGF5
ZXIuZ2V0KCksIGNvbG9yKTsKKyAgICAgICAgW21fbGF5ZXIuZ2V0KCkgc2V0Qm9yZGVyV2lkdGg6
Ym9yZGVyV2lkdGhdOworICAgIH0gZWxzZSB7CisgICAgICAgIGNsZWFyQm9yZGVyQ29sb3IobV9s
YXllci5nZXQoKSk7CisgICAgICAgIFttX2xheWVyLmdldCgpIHNldEJvcmRlcldpZHRoOjBdOwor
ICAgIH0KKyAgICAKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCit9CisKK3ZvaWQgR3Jh
cGhpY3NMYXllckNBOjpzZXRaUG9zaXRpb24oZmxvYXQgcG9zaXRpb24pCit7CisgICAgR3JhcGhp
Y3NMYXllcjo6c2V0WlBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAKKyAgICBCRUdJTl9CTE9DS19P
QkpDX0VYQ0VQVElPTlMKKyAgICBbcHJpbWFyeUxheWVyKCkgc2V0WlBvc2l0aW9uOnBvc2l0aW9u
XTsKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCit9CisjZW5kaWYKKworYm9vbCBHcmFw
aGljc0xheWVyQ0E6OnJlcXVpcmVzVGlsZWRMYXllcihjb25zdCBGbG9hdFNpemUmIHNpemUpIGNv
bnN0Cit7CisgICAgaWYgKCFtX2RyYXdzQ29udGVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgLy8gRklYTUU6IGNhdGNoIHplcm8tc2l6ZSBoZWlnaHQgb3Igd2lkdGggaGVyZSAob3Ig
ZWFybGllcik/CisgICAgcmV0dXJuIHNpemUud2lkdGgoKSA+IGNNYXhQaXhlbERpbWVuc2lvbiB8
fCBzaXplLmhlaWdodCgpID4gY01heFBpeGVsRGltZW5zaW9uOworfQorCit2b2lkIEdyYXBoaWNz
TGF5ZXJDQTo6c3dhcEZyb21PclRvVGlsZWRMYXllcihib29sIHVzZXJUaWxlZExheWVyKQorewor
ICAgIGlmICh1c2VyVGlsZWRMYXllciA9PSBtX3VzaW5nVGlsZWRMYXllcikKKyAgICAgICAgcmV0
dXJuOworCisgICAgQ0dTaXplIHRpbGVTaXplID0gQ0dTaXplTWFrZShjVGlsZWRMYXllclRpbGVT
aXplLCBjVGlsZWRMYXllclRpbGVTaXplKTsKKworICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBU
SU9OUworICAgIAorICAgIFJldGFpblB0cjxDQUxheWVyPiBvbGRMYXllciA9IG1fbGF5ZXIuZ2V0
KCk7CisgICAgCisgICAgQ2xhc3MgbGF5ZXJDbGFzcyA9IHVzZXJUaWxlZExheWVyID8gW1dlYlRp
bGVkTGF5ZXIgc2VsZl0gOiBbV2ViTGF5ZXIgc2VsZl07CisgICAgbV9sYXllci5hZG9wdE5TKFtb
bGF5ZXJDbGFzcyBhbGxvY10gaW5pdF0pOworCisgICAgaWYgKHVzZXJUaWxlZExheWVyKSB7Cisg
ICAgICAgIFdlYlRpbGVkTGF5ZXIqIHRpbGVkTGF5ZXIgPSAoV2ViVGlsZWRMYXllciopbV9sYXll
ci5nZXQoKTsKKyAgICAgICAgW3RpbGVkTGF5ZXIgc2V0VGlsZVNpemU6dGlsZVNpemVdOworICAg
ICAgICBbdGlsZWRMYXllciBzZXRMZXZlbHNPZkRldGFpbDoxXTsKKyAgICAgICAgW3RpbGVkTGF5
ZXIgc2V0TGV2ZWxzT2ZEZXRhaWxCaWFzOjBdOworCisgICAgICAgIGlmIChHcmFwaGljc0xheWVy
OjpncmFwaGljc0NvbnRleHRzRmxpcHBlZCgpKQorICAgICAgICAgICAgW3RpbGVkTGF5ZXIgc2V0
Q29udGVudHNHcmF2aXR5OkAiYm90dG9tTGVmdCJdOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICBbdGlsZWRMYXllciBzZXRDb250ZW50c0dyYXZpdHk6QCJ0b3BMZWZ0Il07CisgICAgfQorICAg
IAorICAgIFttX2xheWVyLmdldCgpIHNldExheWVyT3duZXI6dGhpc107CisgICAgW21fbGF5ZXIu
Z2V0KCkgc2V0U3VibGF5ZXJzOltvbGRMYXllci5nZXQoKSBzdWJsYXllcnNdXTsKKyAgICAKKyAg
ICBbW29sZExheWVyLmdldCgpIHN1cGVybGF5ZXJdIHJlcGxhY2VTdWJsYXllcjpvbGRMYXllci5n
ZXQoKSB3aXRoOm1fbGF5ZXIuZ2V0KCldOworICAgIAorICAgIFttX2xheWVyLmdldCgpIHNldEJv
dW5kczpbb2xkTGF5ZXIuZ2V0KCkgYm91bmRzXV07CisgICAgW21fbGF5ZXIuZ2V0KCkgc2V0UG9z
aXRpb246W29sZExheWVyLmdldCgpIHBvc2l0aW9uXV07CisgICAgW21fbGF5ZXIuZ2V0KCkgc2V0
QW5jaG9yUG9pbnQ6W29sZExheWVyLmdldCgpIGFuY2hvclBvaW50XV07CisgICAgW21fbGF5ZXIu
Z2V0KCkgc2V0T3BhcXVlOltvbGRMYXllci5nZXQoKSBpc09wYXF1ZV1dOworICAgIFttX2xheWVy
LmdldCgpIHNldE9wYWNpdHk6W29sZExheWVyLmdldCgpIG9wYWNpdHldXTsKKyAgICBbbV9sYXll
ci5nZXQoKSBzZXRUcmFuc2Zvcm06W29sZExheWVyLmdldCgpIHRyYW5zZm9ybV1dOworICAgIFtt
X2xheWVyLmdldCgpIHNldFN1YmxheWVyVHJhbnNmb3JtOltvbGRMYXllci5nZXQoKSBzdWJsYXll
clRyYW5zZm9ybV1dOworICAgIFttX2xheWVyLmdldCgpIHNldERvdWJsZVNpZGVkOltvbGRMYXll
ci5nZXQoKSBpc0RvdWJsZVNpZGVkXV07CisjaWZuZGVmIE5ERUJVRworICAgIFttX2xheWVyLmdl
dCgpIHNldFpQb3NpdGlvbjpbb2xkTGF5ZXIuZ2V0KCkgelBvc2l0aW9uXV07CisjZW5kaWYKKyAg
ICAKKyNpZm5kZWYgTkRFQlVHCisgICAgU3RyaW5nIG5hbWUgPSBTdHJpbmc6OmZvcm1hdCgiQ0FM
YXllciglcCkgR3JhcGhpY3NMYXllciglcCkgIiwgbV9sYXllci5nZXQoKSwgdGhpcykgKyBtX25h
bWU7CisgICAgW21fbGF5ZXIuZ2V0KCkgc2V0TmFtZTpuYW1lXTsKKyNlbmRpZgorCisgICAgLy8g
bW92ZSBvdmVyIGFuaW1hdGlvbnMKKyAgICBtb3ZlQW5pbWF0aW9uKEFuaW1hdGVkUHJvcGVydHlX
ZWJraXRUcmFuc2Zvcm0sIG9sZExheWVyLmdldCgpLCBtX2xheWVyLmdldCgpKTsKKyAgICBtb3Zl
QW5pbWF0aW9uKEFuaW1hdGVkUHJvcGVydHlPcGFjaXR5LCBvbGRMYXllci5nZXQoKSwgbV9sYXll
ci5nZXQoKSk7CisgICAgbW92ZUFuaW1hdGlvbihBbmltYXRlZFByb3BlcnR5QmFja2dyb3VuZENv
bG9yLCBvbGRMYXllci5nZXQoKSwgbV9sYXllci5nZXQoKSk7CisgICAgCisgICAgLy8gbmVlZCB0
byB0ZWxsIG5ldyBsYXllciB0byBkcmF3IGl0c2VsZgorICAgIHNldE5lZWRzRGlzcGxheSgpOwor
ICAgIAorICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICAKKyAgICBtX3VzaW5nVGls
ZWRMYXllciA9IHVzZXJUaWxlZExheWVyOworICAgIAorI2lmbmRlZiBOREVCVUcKKyAgICB1cGRh
dGVEZWJ1Z0luZGljYXRvcnMoKTsKKyNlbmRpZgorfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6
c2V0SGFzQ29udGVudHNMYXllcihib29sIGhhc0xheWVyKQoreworICAgIEJFR0lOX0JMT0NLX09C
SkNfRVhDRVBUSU9OUworCisgICAgaWYgKGhhc0xheWVyICYmICFtX2NvbnRlbnRzTGF5ZXIpIHsK
KyAgICAgICAgLy8gY3JlYXRlIHRoZSBpbm5lciBsYXllcgorICAgICAgICBXZWJMYXllciogY29u
dGVudHNMYXllciA9IFtXZWJMYXllciBsYXllcl07CisjaWZuZGVmIE5ERUJVRworICAgICAgICBb
Y29udGVudHNMYXllciBzZXROYW1lOkAiQ29udGVudHMgTGF5ZXIiXTsKKyNlbmRpZgorICAgICAg
ICBzZXRDb250ZW50c0xheWVyKGNvbnRlbnRzTGF5ZXIpOworCisgICAgfSBlbHNlIGlmICghaGFz
TGF5ZXIgJiYgbV9jb250ZW50c0xheWVyKQorICAgICAgICBzZXRDb250ZW50c0xheWVyKDApOwor
CisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJD
QTo6c2V0Q29udGVudHNMYXllcihXZWJMYXllciogY29udGVudHNMYXllcikKK3sKKyAgICBpZiAo
Y29udGVudHNMYXllciA9PSBtX2NvbnRlbnRzTGF5ZXIpCisgICAgICAgIHJldHVybjsKKworICAg
IEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworCisgICAgaWYgKG1fY29udGVudHNMYXllcikg
eworICAgICAgICBbbV9jb250ZW50c0xheWVyLmdldCgpIHJlbW92ZUZyb21TdXBlcmxheWVyXTsK
KyAgICAgICAgbV9jb250ZW50c0xheWVyID0gMDsKKyAgICB9CisgICAgCisgICAgaWYgKGNvbnRl
bnRzTGF5ZXIpIHsKKyAgICAgICAgLy8gVHVybiBvZmYgaW1wbGljaXQgYW5pbWF0aW9ucyBvbiB0
aGUgaW5uZXIgbGF5ZXIuCisgICAgICAgIFtjb250ZW50c0xheWVyIHNldFN0eWxlOltOU0RpY3Rp
b25hcnkgZGljdGlvbmFyeVdpdGhPYmplY3Q6bnVsbEFjdGlvbnNEaWN0aW9uYXJ5KCkgZm9yS2V5
OkAiYWN0aW9ucyJdXTsKKworICAgICAgICBtX2NvbnRlbnRzTGF5ZXIuYWRvcHROUyhbY29udGVu
dHNMYXllciByZXRhaW5dKTsKKyAgICAgICAgW21fY29udGVudHNMYXllci5nZXQoKSBzZXRBbmNo
b3JQb2ludDpDR1BvaW50WmVyb107CisgICAgICAgIFttX2xheWVyLmdldCgpIGFkZFN1YmxheWVy
Om1fY29udGVudHNMYXllci5nZXQoKV07CisKKyAgICAgICAgdXBkYXRlQ29udGVudHNSZWN0KCk7
CisKKyAgICAgICAgLy8gU2V0IGNvbnRlbnRzIHRvIG5pbCBpZiB0aGUgbGF5ZXIgZG9lcyBub3Qg
ZHJhdyBpdHMgb3duIGNvbnRlbnQuCisgICAgICAgIGlmIChtX2NsaWVudCAmJiAhZHJhd3NDb250
ZW50KCkpCisgICAgICAgICAgICBbbV9sYXllci5nZXQoKSBzZXRDb250ZW50czpuaWxdOworCisj
aWZuZGVmIE5ERUJVRworICAgICAgICBpZiAoc2hvd0RlYnVnQm9yZGVycygpKSB7CisgICAgICAg
ICAgICBzZXRMYXllckJvcmRlckNvbG9yKG1fY29udGVudHNMYXllci5nZXQoKSwgQ29sb3IoMCwg
MCwgMTI4LCAxODApKTsKKyAgICAgICAgICAgIFttX2NvbnRlbnRzTGF5ZXIuZ2V0KCkgc2V0Qm9y
ZGVyV2lkdGg6MS4wZl07CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyNpZm5kZWYgTkRFQlVH
CisgICAgdXBkYXRlRGVidWdJbmRpY2F0b3JzKCk7CisjZW5kaWYKKworICAgIEVORF9CTE9DS19P
QkpDX0VYQ0VQVElPTlMKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisKKyNlbmRpZiAv
LyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL21hYy9XZWJMYXllci5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9t
YWMvV2ViTGF5ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGI0NmVk
Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvV2ViTGF5
ZXIuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIFdlYkxheWVyX2gKKyNkZWZpbmUgV2ViTGF5
ZXJfaAorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjaW1wb3J0IDxRdWFy
dHpDb3JlL1F1YXJ0ekNvcmUuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworICAgIGNsYXNzIEdy
YXBoaWNzTGF5ZXI7Cit9CisKKy8vIENhdGVnb3J5IGltcGxlbWVudGVkIGJ5IFdlYkxheWVyIGFu
ZCBXZWJUaWxlZExheWVyLgorQGludGVyZmFjZSBDQUxheWVyKFdlYkxheWVyQWRkaXRpb25zKQor
CistICh2b2lkKXNldExheWVyT3duZXI6KFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXIqKWxheWVyOwor
LSAoV2ViQ29yZTo6R3JhcGhpY3NMYXllciopbGF5ZXJPd25lcjsKKworQGVuZAorCitAaW50ZXJm
YWNlIFdlYkxheWVyIDogQ0FMYXllciAKK3sKKyAgICBXZWJDb3JlOjpHcmFwaGljc0xheWVyKiBt
X2xheWVyT3duZXI7Cit9CisKKy8vIENsYXNzIG1ldGhvZCBhbGxvd3MgdXMgdG8gc2hhcmUgaW1w
bGVtZW50YXRpb24gYWNyb3NzIFRpbGVkTGF5ZXJNYWMgYW5kIFdlYkxheWVyCisrICh2b2lkKWRy
YXdDb250ZW50czooV2ViQ29yZTo6R3JhcGhpY3NMYXllciopbGF5ZXJDb250ZW50cyBvZkxheWVy
OihDQUxheWVyKilsYXllciBpbnRvQ29udGV4dDooQ0dDb250ZXh0UmVmKWNvbnRleHQ7CisKK0Bl
bmQKKworI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2VuZGlmIC8v
IFdlYkxheWVyX2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1dl
YkxheWVyLm1tIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvV2ViTGF5ZXIubW0KbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg5MjVkMQotLS0gL2Rldi9udWxsCisr
KyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1dlYkxheWVyLm1tCkBAIC0wLDAgKzEs
MjI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRF
UiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9T
SVRJTkcpCisKKyNpbXBvcnQgIldlYkxheWVyLmgiCisKKyNpbXBvcnQgIkdyYXBoaWNzQ29udGV4
dC5oIgorI2ltcG9ydCAiR3JhcGhpY3NMYXllci5oIgorI2ltcG9ydCA8UXVhcnR6Q29yZS9RdWFy
dHpDb3JlLmg+CisjaW1wb3J0ICJXZWJDb3JlVGV4dFJlbmRlcmVyLmgiCisjaW1wb3J0IDx3dGYv
VW51c2VkUGFyYW0uaD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK0BpbXBsZW1lbnRh
dGlvbiBXZWJMYXllcgorCisrICh2b2lkKWRyYXdDb250ZW50czooV2ViQ29yZTo6R3JhcGhpY3NM
YXllciopbGF5ZXJDb250ZW50cyBvZkxheWVyOihDQUxheWVyKilsYXllciBpbnRvQ29udGV4dDoo
Q0dDb250ZXh0UmVmKWNvbnRleHQKK3sKKyAgICBVTlVTRURfUEFSQU0obGF5ZXIpOworICAgIENH
Q29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7CisgICAgCisgICAgaWYgKGxheWVyQ29udGVudHMg
JiYgbGF5ZXJDb250ZW50cy0+Y2xpZW50KCkpIHsKKyAgICAgICAgW05TR3JhcGhpY3NDb250ZXh0
IHNhdmVHcmFwaGljc1N0YXRlXTsKKworICAgICAgICAvLyBTZXQgdXAgYW4gTlNHcmFwaGljc0Nv
bnRleHQgZm9yIHRoZSBjb250ZXh0LCBzbyB0aGF0IHBhcnRzIG9mIEFwcEtpdCB0aGF0IHJlbHkg
b24KKyAgICAgICAgLy8gdGhlIGN1cnJlbnQgTlNHcmFwaGljc0NvbnRleHQgKGUuZy4gTlNDZWxs
IGRyYXdpbmcpIGdldCB0aGUgcmlnaHQgb25lLgorICAgICAgICBOU0dyYXBoaWNzQ29udGV4dCog
bGF5ZXJDb250ZXh0ID0gW05TR3JhcGhpY3NDb250ZXh0IGdyYXBoaWNzQ29udGV4dFdpdGhHcmFw
aGljc1BvcnQ6Y29udGV4dCBmbGlwcGVkOllFU107CisgICAgICAgIFtOU0dyYXBoaWNzQ29udGV4
dCBzZXRDdXJyZW50Q29udGV4dDpsYXllckNvbnRleHRdOworCisgICAgICAgIEdyYXBoaWNzQ29u
dGV4dCBncmFwaGljc0NvbnRleHQoY29udGV4dCk7CisKKyAgICAgICAgLy8gV2hlbiBkcmF3aW5n
IGludG8gQ0FMYXllcnMsIHdlIG5lZWQgdG8gdHVybiBvZmYgZm9udCBzbW9vdGhpbmcgKGFrYSBM
Q0QgYW50aWFsaWFzaW5nKS4KKyAgICAgICAgYm9vbCB3YXNTbW9vdGhpbmcgPSBncmFwaGljc0Nv
bnRleHQudXNpbmdGb250U21vb3RoaW5nKCk7CisgICAgICAgIGdyYXBoaWNzQ29udGV4dC5zZXRV
c2VGb250U21vb3RoaW5nKGZhbHNlKTsKKworICAgICAgICAvLyBJdCdzIGltcG9ydGFudCB0byBn
ZXQgdGhlIGNsaXAgZnJvbSB0aGUgY29udGV4dCwgYmVjYXVzZSBpdCBtYXkgYmUgc2lnbmlmaWNh
bnRseQorICAgICAgICAvLyBzbWFsbGVyIHRoYW4gdGhlIGxheWVyIGJvdW5kcyAoZS5nLiB0aWxl
ZCBsYXllcnMpCisgICAgICAgIENHUmVjdCBjbGlwQm91bmRzID0gQ0dDb250ZXh0R2V0Q2xpcEJv
dW5kaW5nQm94KGNvbnRleHQpOworICAgICAgICBJbnRSZWN0IGNsaXAoZW5jbG9zaW5nSW50UmVj
dChjbGlwQm91bmRzKSk7CisgICAgICAgIGxheWVyQ29udGVudHMtPnBhaW50R3JhcGhpY3NMYXll
ckNvbnRlbnRzKGdyYXBoaWNzQ29udGV4dCwgY2xpcCk7CisKKyAgICAgICAgZ3JhcGhpY3NDb250
ZXh0LnNldFVzZUZvbnRTbW9vdGhpbmcod2FzU21vb3RoaW5nKTsKKworICAgICAgICBbTlNHcmFw
aGljc0NvbnRleHQgcmVzdG9yZUdyYXBoaWNzU3RhdGVdOworICAgIH0KKyNpZm5kZWYgTkRFQlVH
CisgICAgZWxzZSB7CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworCisgICAgICAgIC8v
IEZJWE1FOiBpZGVhbGx5IHdlJ2QgYXZvaWQgY2FsbGluZyAtc2V0TmVlZHNEaXNwbGF5IG9uIGEg
bGF5ZXIgdGhhdCBpcyBhIHBsYWluIGNvbG9yLAorICAgICAgICAvLyBzbyBDQSBuZXZlciBtYWtl
cyBiYWNraW5nIHN0b3JlIGZvciBpdCAod2hpY2ggaXMgd2hhdCAtc2V0TmVlZHNEaXNwbGF5IHdp
bGwgZG8gYWJvdmUpLgorICAgICAgICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoY29udGV4dCwg
MC4wZiwgMS4wZiwgMC4wZiwgMS4wZik7CisgICAgICAgIENHUmVjdCBhQm91bmRzID0gW2xheWVy
IGJvdW5kc107CisgICAgICAgIENHQ29udGV4dEZpbGxSZWN0KGNvbnRleHQsIGFCb3VuZHMpOwor
ICAgIH0KKyNlbmRpZgorCisgICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShjb250ZXh0KTsKKwor
I2lmbmRlZiBOREVCVUcKKyAgICBpZiAobGF5ZXJDb250ZW50cyAmJiBsYXllckNvbnRlbnRzLT5z
aG93UmVwYWludENvdW50ZXIoKSkgeworICAgICAgICBib29sIGlzVGlsZWRMYXllciA9IFtsYXll
ciBpc0tpbmRPZkNsYXNzOltDQVRpbGVkTGF5ZXIgY2xhc3NdXTsKKworICAgICAgICBjaGFyIHRl
eHRbMTZdOyAvLyB0aGF0J3MgYSBsb3Qgb2YgcmVwYWludHMKKyAgICAgICAgc25wcmludGYodGV4
dCwgc2l6ZW9mKHRleHQpLCAiJWQiLCBsYXllckNvbnRlbnRzLT5pbmNyZW1lbnRSZXBhaW50Q291
bnQoKSk7CisKKyAgICAgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gYSA9IENHQ29udGV4dEdldENUTShj
b250ZXh0KTsKKyAgICAgICAgCisgICAgICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7
CisgICAgICAgIGlmIChpc1RpbGVkTGF5ZXIpCisgICAgICAgICAgICBDR0NvbnRleHRTZXRSR0JG
aWxsQ29sb3IoY29udGV4dCwgMC4wZiwgMS4wZiwgMC4wZiwgMC44Zik7CisgICAgICAgIGVsc2UK
KyAgICAgICAgICAgIENHQ29udGV4dFNldFJHQkZpbGxDb2xvcihjb250ZXh0LCAxLjBmLCAwLjBm
LCAwLjBmLCAwLjhmKTsKKyAgICAgICAgCisgICAgICAgIENHUmVjdCBhQm91bmRzID0gW2xheWVy
IGJvdW5kc107CisKKyAgICAgICAgYUJvdW5kcy5zaXplLndpZHRoID0gMTAgKyAxMiAqIHN0cmxl
bih0ZXh0KTsKKyAgICAgICAgYUJvdW5kcy5zaXplLmhlaWdodCA9IDI1OworICAgICAgICBDR0Nv
bnRleHRGaWxsUmVjdChjb250ZXh0LCBhQm91bmRzKTsKKyAgICAgICAgCisgICAgICAgIENHQ29u
dGV4dFNldFJHQkZpbGxDb2xvcihjb250ZXh0LCAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmKTsKKwor
ICAgICAgICBDR0NvbnRleHRTZXRUZXh0TWF0cml4KGNvbnRleHQsIENHQWZmaW5lVHJhbnNmb3Jt
TWFrZVNjYWxlKDEuMGYsIC0xLjBmKSk7CisgICAgICAgIENHQ29udGV4dFNlbGVjdEZvbnQoY29u
dGV4dCwgIkhlbHZldGljYSIsIDI1LCBrQ0dFbmNvZGluZ01hY1JvbWFuKTsKKyAgICAgICAgQ0dD
b250ZXh0U2hvd1RleHRBdFBvaW50KGNvbnRleHQsIGFCb3VuZHMub3JpZ2luLnggKyAzLjBmLCBh
Qm91bmRzLm9yaWdpbi55ICsgMjAuMGYsIHRleHQsIHN0cmxlbih0ZXh0KSk7CisgICAgICAgIAor
ICAgICAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOyAgICAgICAgCisgICAgfQor
I2VuZGlmCit9CisKKy8vIERpc2FibGUgZGVmYXVsdCBhbmltYXRpb25zCistIChpZDxDQUFjdGlv
bj4pYWN0aW9uRm9yS2V5OihOU1N0cmluZyAqKWtleQoreworICAgIFVOVVNFRF9QQVJBTShrZXkp
OworICAgIHJldHVybiBuaWw7Cit9CisKKy8vIEltcGxlbWVudCB0aGlzIHNvIHByZXNlbnRhdGlv
bkxheWVyIGNhbiBnZXQgb3VyIGN1c3RvbSBhdHRyaWJ1dGVzCistIChpZClpbml0V2l0aExheWVy
OihpZClsYXllcgoreworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aExheWVyOmxheWVy
XSkpCisgICAgICAgIG1fbGF5ZXJPd25lciA9IFsoV2ViTGF5ZXIqKWxheWVyIGxheWVyT3duZXJd
OworCisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpc2V0TmVlZHNEaXNwbGF5Cit7Cisg
ICAgaWYgKG1fbGF5ZXJPd25lciAmJiBtX2xheWVyT3duZXItPmNsaWVudCgpICYmIG1fbGF5ZXJP
d25lci0+ZHJhd3NDb250ZW50KCkpCisgICAgICAgIFtzdXBlciBzZXROZWVkc0Rpc3BsYXldOwor
fQorCistICh2b2lkKXNldE5lZWRzRGlzcGxheUluUmVjdDooQ0dSZWN0KWRpcnR5UmVjdAorewor
ICAgIGlmIChtX2xheWVyT3duZXIgJiYgbV9sYXllck93bmVyLT5jbGllbnQoKSAmJiBtX2xheWVy
T3duZXItPmRyYXdzQ29udGVudCgpKSB7CisgICAgICAgIFtzdXBlciBzZXROZWVkc0Rpc3BsYXlJ
blJlY3Q6ZGlydHlSZWN0XTsKKworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgaWYgKG1fbGF5ZXJP
d25lci0+c2hvd1JlcGFpbnRDb3VudGVyKCkpIHsKKyAgICAgICAgICAgIENHUmVjdCBib3VuZHMg
PSBbc2VsZiBib3VuZHNdOworICAgICAgICAgICAgW3N1cGVyIHNldE5lZWRzRGlzcGxheUluUmVj
dDpDR1JlY3RNYWtlKGJvdW5kcy5vcmlnaW4ueCwgYm91bmRzLm9yaWdpbi55LCA0NiwgMjUpXTsK
KyAgICAgICAgfQorI2VuZGlmCisgICAgfQorfQorCistICh2b2lkKWRyYXdJbkNvbnRleHQ6KENH
Q29udGV4dFJlZiljb250ZXh0Cit7CisgICAgW1dlYkxheWVyIGRyYXdDb250ZW50czptX2xheWVy
T3duZXIgb2ZMYXllcjpzZWxmIGludG9Db250ZXh0OmNvbnRleHRdOworfQorCitAZW5kIC8vIGlt
cGxlbWVudGF0aW9uIFdlYkxheWVyCisKKyNwcmFnbWEgbWFyayAtCisKK0BpbXBsZW1lbnRhdGlv
biBXZWJMYXllcihXZWJMYXllckFkZGl0aW9ucykKKworLSAodm9pZClzZXRMYXllck93bmVyOihH
cmFwaGljc0xheWVyKilhTGF5ZXIKK3sKKyAgICBtX2xheWVyT3duZXIgPSBhTGF5ZXI7Cit9CisK
Ky0gKEdyYXBoaWNzTGF5ZXIqKWxheWVyT3duZXIKK3sKKyAgICByZXR1cm4gbV9sYXllck93bmVy
OworfQorCitAZW5kCisKKyNwcmFnbWEgbWFyayAtCisKKyNpZm5kZWYgTkRFQlVHCisKK0BpbXBs
ZW1lbnRhdGlvbiBDQUxheWVyKEV4dGVuZGVkRGVzY3JpcHRpb24pCisKKy0gKE5TU3RyaW5nKilf
ZGVzY3JpcHRpb25XaXRoUHJlZml4OihOU1N0cmluZyopaW5QcmVmaXgKK3sKKyAgICBDR1JlY3Qg
YUJvdW5kcyA9IFtzZWxmIGJvdW5kc107CisgICAgQ0dQb2ludCBhUG9zID0gW3NlbGYgcG9zaXRp
b25dOworICAgIENBVHJhbnNmb3JtM0QgdCA9IFtzZWxmIHRyYW5zZm9ybV07CisKKyAgICBOU1N0
cmluZyogc2VsZlN0cmluZyA9IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJUA8JUAgMHgl
MDh4PiBcIiVAXCIgYm91bmRzKCUuMWYsICUuMWYsICUuMWYsICUuMWYpIHBvcyglLjFmLCAlLjFm
KSwgc3VibGF5ZXJzPSVkIG1hc2tpbmc9JWQiLAorICAgICAgICAgICAgaW5QcmVmaXgsCisgICAg
ICAgICAgICBbc2VsZiBjbGFzc10sCisgICAgICAgICAgICBzZWxmLAorICAgICAgICAgICAgW3Nl
bGYgbmFtZV0sCisgICAgICAgICAgICBhQm91bmRzLm9yaWdpbi54LCBhQm91bmRzLm9yaWdpbi55
LCBhQm91bmRzLnNpemUud2lkdGgsIGFCb3VuZHMuc2l6ZS5oZWlnaHQsIAorICAgICAgICAgICAg
YVBvcy54LCBhUG9zLnksCisgICAgICAgICAgICBbW3NlbGYgc3VibGF5ZXJzXSBjb3VudF0sCisg
ICAgICAgICAgICBbc2VsZiBtYXNrc1RvQm91bmRzXV07CisgICAgCisgICAgTlNNdXRhYmxlU3Ry
aW5nKiBjdXJEZXNjID0gW05TTXV0YWJsZVN0cmluZyBzdHJpbmdXaXRoU3RyaW5nOnNlbGZTdHJp
bmddOworICAgIAorICAgIGlmIChbW3NlbGYgc3VibGF5ZXJzXSBjb3VudF0gPiAwKQorICAgICAg
ICBbY3VyRGVzYyBhcHBlbmRTdHJpbmc6QCJcbiJdOworCisgICAgTlNTdHJpbmcqIHN1YmxheWVy
UHJlZml4ID0gW2luUHJlZml4IHN0cmluZ0J5QXBwZW5kaW5nU3RyaW5nOkAiXHQiXTsKKworICAg
IE5TRW51bWVyYXRvciogc3VibGF5ZXJzRW51bSA9IFtbc2VsZiBzdWJsYXllcnNdIG9iamVjdEVu
dW1lcmF0b3JdOworICAgIENBTGF5ZXIqIGN1ckxheWVyOworICAgIHdoaWxlICgoY3VyTGF5ZXIg
PSBbc3VibGF5ZXJzRW51bSBuZXh0T2JqZWN0XSkpCisgICAgICAgIFtjdXJEZXNjIGFwcGVuZFN0
cmluZzpbY3VyTGF5ZXIgX2Rlc2NyaXB0aW9uV2l0aFByZWZpeDpzdWJsYXllclByZWZpeF1dOwor
CisgICAgaWYgKFtbc2VsZiBzdWJsYXllcnNdIGNvdW50XSA9PSAwKQorICAgICAgICBbY3VyRGVz
YyBhcHBlbmRTdHJpbmc6QCJcbiJdOworCisgICAgcmV0dXJuIGN1ckRlc2M7Cit9CisKKy0gKE5T
U3RyaW5nKilleHRlbmRlZERlc2NyaXB0aW9uCit7CisgICAgcmV0dXJuIFtzZWxmIF9kZXNjcmlw
dGlvbldpdGhQcmVmaXg6QCIiXTsKK30KKworQGVuZCAgLy8gaW1wbGVtZW50YXRpb24gV2ViTGF5
ZXIoRXh0ZW5kZWREZXNjcmlwdGlvbikKKworI2VuZGlmIC8vIE5ERUJVRworCisjZW5kaWYgLy8g
VVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9tYWMvV2ViVGlsZWRMYXllci5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9tYWMvV2ViVGlsZWRMYXllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu
LjFjOTE0NGQKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21h
Yy9XZWJUaWxlZExheWVyLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBXZWJUaWxlZExheWVy
X2gKKyNkZWZpbmUgV2ViVGlsZWRMYXllcl9oCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9T
SVRJTkcpCisKKyNpbXBvcnQgIldlYkxheWVyLmgiCisKK0BpbnRlcmZhY2UgV2ViVGlsZWRMYXll
ciA6IENBVGlsZWRMYXllciAKK3sKKyAgICBXZWJDb3JlOjpHcmFwaGljc0xheWVyKiBtX2xheWVy
T3duZXI7Cit9CisKKy8vIGltcGxlbWVudHMgV2ViTGF5ZXJBZGRpdGlvbnMKKworQGVuZAorCisj
ZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjZW5kaWYgLy8gV2ViVGls
ZWRMYXllcl9oCisKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1dl
YlRpbGVkTGF5ZXIubW0gYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9XZWJUaWxlZExh
eWVyLm1tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZDAwYmEKLS0tIC9k
ZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9XZWJUaWxlZExheWVy
Lm1tCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBVU0UoQUND
RUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNpbXBvcnQgIldlYlRpbGVkTGF5ZXIuaCIKKworI2lt
cG9ydCAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW1wb3J0ICJHcmFwaGljc0xheWVyLmgiCisjaW1w
b3J0IDx3dGYvVW51c2VkUGFyYW0uaD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK0Bp
bXBsZW1lbnRhdGlvbiBXZWJUaWxlZExheWVyCisKKy8vIFNldCBhIHplcm8gZHVyYXRpb24gZm9y
IHRoZSBmYWRlIGluIG9mIHRpbGVzCisrIChDRlRpbWVJbnRlcnZhbClmYWRlRHVyYXRpb24KK3sK
KyAgICByZXR1cm4gMDsKK30KKworLy8gTWFrZSBzdXJlIHRoYXQgdGlsZXMgYXJlIGRyYXduIG9u
IHRoZSBtYWluIHRocmVhZAorKyAoQk9PTClzaG91bGREcmF3T25NYWluVGhyZWFkCit7CisgICAg
cmV0dXJuIFlFUzsKK30KKworLy8gRGlzYWJsZSBkZWZhdWx0IGFuaW1hdGlvbnMKKy0gKGlkPENB
QWN0aW9uPilhY3Rpb25Gb3JLZXk6KE5TU3RyaW5nICopa2V5Cit7CisgICAgVU5VU0VEX1BBUkFN
KGtleSk7CisgICAgcmV0dXJuIG5pbDsKK30KKworLy8gSW1wbGVtZW50IHRoaXMgc28gcHJlc2Vu
dGF0aW9uTGF5ZXIgY2FuIGdldCBvdXIgY3VzdG9tIGF0dHJpYnV0ZXMKKy0gKGlkKWluaXRXaXRo
TGF5ZXI6KGlkKWxheWVyCit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRXaXRoTGF5ZXI6
bGF5ZXJdKSkKKyAgICAgICAgbV9sYXllck93bmVyID0gWyhXZWJMYXllciopbGF5ZXIgbGF5ZXJP
d25lcl07CisKKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAodm9pZClzZXROZWVkc0Rpc3BsYXkK
K3sKKyAgICBpZiAobV9sYXllck93bmVyICYmIG1fbGF5ZXJPd25lci0+Y2xpZW50KCkgJiYgbV9s
YXllck93bmVyLT5kcmF3c0NvbnRlbnQoKSkKKyAgICAgICAgW3N1cGVyIHNldE5lZWRzRGlzcGxh
eV07Cit9CisKKy0gKHZvaWQpc2V0TmVlZHNEaXNwbGF5SW5SZWN0OihDR1JlY3QpZGlydHlSZWN0
Cit7CisgICAgaWYgKG1fbGF5ZXJPd25lciAmJiBtX2xheWVyT3duZXItPmNsaWVudCgpICYmIG1f
bGF5ZXJPd25lci0+ZHJhd3NDb250ZW50KCkpIHsKKyAgICAgICAgW3N1cGVyIHNldE5lZWRzRGlz
cGxheUluUmVjdDpkaXJ0eVJlY3RdOworCisjaWZuZGVmIE5ERUJVRworICAgICAgICBpZiAobV9s
YXllck93bmVyLT5zaG93UmVwYWludENvdW50ZXIoKSkgeworICAgICAgICAgICAgQ0dSZWN0IGJv
dW5kcyA9IFtzZWxmIGJvdW5kc107CisgICAgICAgICAgICBbc3VwZXIgc2V0TmVlZHNEaXNwbGF5
SW5SZWN0OkNHUmVjdE1ha2UoYm91bmRzLm9yaWdpbi54LCBib3VuZHMub3JpZ2luLnksIDQ2LCAy
NSldOworICAgICAgICB9CisjZW5kaWYKKyAgICB9Cit9CisKKy0gKHZvaWQpZHJhd0luQ29udGV4
dDooQ0dDb250ZXh0UmVmKWN0eAoreworICAgIFtXZWJMYXllciBkcmF3Q29udGVudHM6bV9sYXll
ck93bmVyIG9mTGF5ZXI6c2VsZiBpbnRvQ29udGV4dDpjdHhdOworfQorCitAZW5kIC8vIGltcGxl
bWVudGF0aW9uIFdlYlRpbGVkTGF5ZXIKKworI3ByYWdtYSBtYXJrIC0KKworQGltcGxlbWVudGF0
aW9uIFdlYlRpbGVkTGF5ZXIoTGF5ZXJNYWNBZGRpdGlvbnMpCisKKy0gKHZvaWQpc2V0TGF5ZXJP
d25lcjooR3JhcGhpY3NMYXllciopYUxheWVyCit7CisgICAgbV9sYXllck93bmVyID0gYUxheWVy
OworfQorCistIChHcmFwaGljc0xheWVyKilsYXllck93bmVyCit7CisgICAgcmV0dXJuIG1fbGF5
ZXJPd25lcjsKK30KKworQGVuZAorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lU
SU5HKQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>27159</attachid>
            <date>2009-01-29 13:52:39 -0800</date>
            <delta_ts>2009-01-29 14:23:40 -0800</delta_ts>
            <desc>Final patch.</desc>
            <filename>23356_final.txt</filename>
            <type>text/plain</type>
            <size>53115</size>
            <attacher name="Simon Fraser (smfr)">simon.fraser</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzTGF5ZXJD
QS5tbSBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzTGF5ZXJDQS5tbQpu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWFiMWJlCi0tLSAvZGV2L251bGwK
KysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NMYXllckNBLm1tCkBA
IC0wLDAgKzEsMTQ4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKworI2ltcG9ydCAiY29uZmlnLmgiCisKKyNpZiBVU0UoQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcpCisKKyNpbXBvcnQgIkdyYXBoaWNzTGF5ZXJDQS5oIgorCisvLyBUZW1w
b3JhcnkKKyNpbXBvcnQgPFF1YXJ0ekNvcmUvQ0FBbmltYXRpb25Qcml2YXRlLmg+CisjaW1wb3J0
IDxRdWFydHpDb3JlL0NBVmFsdWVGdW5jdGlvbi5oPgorCisjaW1wb3J0ICJBbmltYXRpb24uaCIK
KyNpbXBvcnQgIkJsb2NrRXhjZXB0aW9ucy5oIgorI2ltcG9ydCAiQ1N0cmluZy5oIgorI2ltcG9y
dCAiRmxvYXRSZWN0LmgiCisjaW1wb3J0ICJJbWFnZS5oIgorI2ltcG9ydCAiUGxhdGZvcm1TdHJp
bmcuaCIKKyNpbXBvcnQgPFF1YXJ0ekNvcmUvUXVhcnR6Q29yZS5oPgorI2ltcG9ydCAiUm90YXRl
VHJhbnNmb3JtT3BlcmF0aW9uLmgiCisjaW1wb3J0ICJTY2FsZVRyYW5zZm9ybU9wZXJhdGlvbi5o
IgorI2ltcG9ydCAiU3lzdGVtVGltZS5oIgorI2ltcG9ydCAiVHJhbnNsYXRlVHJhbnNmb3JtT3Bl
cmF0aW9uLmgiCisjaW1wb3J0ICJXZWJMYXllci5oIgorI2ltcG9ydCAiV2ViVGlsZWRMYXllci5o
IgorI2ltcG9ydCA8d3RmL0N1cnJlbnRUaW1lLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gVGhlIHRocmVzaG9sZCB3aWR0aCBvciBoZWlnaHQg
YWJvdmUgd2hpY2ggYSB0aWxlZCBsYXllciB3aWxsIGJlIHVzZWQuIFRoaXMgc2hvdWxkIGJlCisv
LyBsYXJnZSBlbm91Z2ggdG8gYXZvaWQgdGlsZWQgbGF5ZXJzIGZvciBtb3N0IEdyYXBoaWNzTGF5
ZXJzLCBidXQgbGVzcyB0aGFuIHRoZSBPcGVuR0wKKy8vIHRleHR1cmUgc2l6ZSBsaW1pdCBvbiBh
bGwgc3VwcG9ydGVkIGhhcmR3YXJlLgorc3RhdGljIGNvbnN0IGludCBjTWF4UGl4ZWxEaW1lbnNp
b24gPSAyMDAwOworCisvLyBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiBhIHNpbmdsZSB0aWxlIGlu
IGEgdGlsZWQgbGF5ZXIuIFNob3VsZCBiZSBsYXJnZSBlbm91Z2ggdG8KKy8vIGF2b2lkIGxvdHMg
b2Ygc21hbGwgdGlsZXMgKGFuZCB0aGVyZWZvcmUgbG90cyBvZiBkcmF3aW5nIGNhbGxiYWNrcyks
IGJ1dCBzbWFsbCBlbm91Z2gKKy8vIHRvIGtlZXAgdGhlIG92ZXJhbGwgdGlsZSBjb3N0IGxvdy4K
K3N0YXRpYyBjb25zdCBpbnQgY1RpbGVkTGF5ZXJUaWxlU2l6ZSA9IDUxMjsKKworLy8gSWYgd2Ug
c2VuZCBhIGR1cmF0aW9uIG9mIDAgdG8gQ0EsIHRoZW4gaXQgd2lsbCB1c2UgdGhlIGRlZmF1bHQg
ZHVyYXRpb24KKy8vIG9mIDI1MG1zLiBTbyBzZW5kIGEgdmVyeSBzbWFsbCB2YWx1ZSBpbnN0ZWFk
Lgorc3RhdGljIGNvbnN0IGZsb2F0IGNBbmltYXRpb25BbG1vc3RaZXJvRHVyYXRpb24gPSAxZS0z
ZjsKKworLy8gQ0FDdXJyZW50TWVkaWFUaW1lKCkgaXMgYSB0aW1lIHNpbmNlIGJvb3QuIFRoZXNl
IG1ldGhvZHMgY29udmVydCBiZXR3ZWVuIHRoYXQgYW5kCisvLyBXZWJDb3JlIHRpbWUsIHdoaWNo
IGlzIHN5c3RlbSB0aW1lIChVVEMpLgorc3RhdGljIENGVGltZUludGVydmFsIGN1cnJlbnRUaW1l
VG9NZWRpYVRpbWUoZG91YmxlIHQpCit7CisgICAgcmV0dXJuIENBQ3VycmVudE1lZGlhVGltZSgp
ICsgdCAtIFdURjo6Y3VycmVudFRpbWUoKTsKK30KKworc3RhdGljIGRvdWJsZSBtZWRpYVRpbWVU
b0N1cnJlbnRUaW1lKENGVGltZUludGVydmFsIHQpCit7CisgICAgcmV0dXJuIFdURjo6Y3VycmVu
dFRpbWUoKSArIHQgLSBDQUN1cnJlbnRNZWRpYVRpbWUoKTsKK30KKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQorCitzdGF0aWMgTlNTdHJpbmcqIGNvbnN0IFdlYkFuaW1hdGlvbkNTU1Byb3BlcnR5
S2V5ID0gQCJHcmFwaGljc0xheWVyQ0FfcHJvcGVydHkiOworCitAaW50ZXJmYWNlIFdlYkFuaW1h
dGlvbkRlbGVnYXRlIDogTlNPYmplY3QgeworICAgIFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJDQSog
bV9ncmFwaGljc0xheWVyOworfQorCistICh2b2lkKWFuaW1hdGlvbkRpZFN0YXJ0OihDQUFuaW1h
dGlvbiAqKWFuaW07CistIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQ0EqKWdyYXBoaWNzTGF5ZXI7
CistICh2b2lkKXNldExheWVyOihXZWJDb3JlOjpHcmFwaGljc0xheWVyQ0EqKWdyYXBoaWNzTGF5
ZXI7CisKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIFdlYkFuaW1hdGlvbkRlbGVnYXRlCisKKy0g
KHZvaWQpYW5pbWF0aW9uRGlkU3RhcnQ6KENBQW5pbWF0aW9uICopYW5pbWF0aW9uCit7CisgICAg
aWYgKCFtX2dyYXBoaWNzTGF5ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIGRvdWJsZSBzdGFy
dFRpbWUgPSBXZWJDb3JlOjptZWRpYVRpbWVUb0N1cnJlbnRUaW1lKFthbmltYXRpb24gYmVnaW5U
aW1lXSk7CisgICAgV2ViQ29yZTo6QW5pbWF0ZWRQcm9wZXJ0eUlEIHByb3AgPSBzdGF0aWNfY2Fz
dDxXZWJDb3JlOjpBbmltYXRlZFByb3BlcnR5SUQ+KFtbYW5pbWF0aW9uIHZhbHVlRm9yS2V5Oldl
YkFuaW1hdGlvbkNTU1Byb3BlcnR5S2V5XSBpbnRWYWx1ZV0pOworICAgIGlmIChwcm9wICE9IFdl
YkNvcmU6OkFuaW1hdGVkUHJvcGVydHlJbnZhbGlkKQorICAgICAgICBtX2dyYXBoaWNzTGF5ZXIt
PmNsaWVudCgpLT5ub3RpZnlUcmFuc2l0aW9uU3RhcnRlZChtX2dyYXBoaWNzTGF5ZXIsIHByb3As
IHN0YXJ0VGltZSk7CisgICAgZWxzZQorICAgICAgICBtX2dyYXBoaWNzTGF5ZXItPmNsaWVudCgp
LT5ub3RpZnlBbmltYXRpb25TdGFydGVkKG1fZ3JhcGhpY3NMYXllciwgc3RhcnRUaW1lKTsKK30K
KworLSAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckNBKilncmFwaGljc0xheWVyCit7CisgICAgcmV0
dXJuIG1fZ3JhcGhpY3NMYXllcjsKK30KKworLSAodm9pZClzZXRMYXllcjooV2ViQ29yZTo6R3Jh
cGhpY3NMYXllckNBKilncmFwaGljc0xheWVyCit7CisgICAgbV9ncmFwaGljc0xheWVyID0gZ3Jh
cGhpY3NMYXllcjsKK30KKworQGVuZAorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2lubGluZSB2
b2lkIGNvcHlUcmFuc2Zvcm0oQ0FUcmFuc2Zvcm0zRCYgdG9UM0QsIGNvbnN0IFRyYW5zZm9ybWF0
aW9uTWF0cml4JiB0KQoreworICAgIHRvVDNEID0gQ0FUcmFuc2Zvcm0zRE1ha2VBZmZpbmVUcmFu
c2Zvcm0odCk7Cit9CisKK1RyYW5zZm9ybWF0aW9uTWF0cml4IENBVG9UcmFuc2Zvcm0zRChjb25z
dCBDQVRyYW5zZm9ybTNEJiBmcm9tVDNEKQoreworICAgIHJldHVybiBUcmFuc2Zvcm1hdGlvbk1h
dHJpeChDQVRyYW5zZm9ybTNER2V0QWZmaW5lVHJhbnNmb3JtKGZyb21UM0QpKTsKK30KKworc3Rh
dGljIE5TVmFsdWUqIGdldFRyYW5zZm9ybUZ1bmN0aW9uVmFsdWUoY29uc3QgR3JhcGhpY3NMYXll
cjo6VHJhbnNmb3JtVmFsdWUmIHRyYW5zZm9ybVZhbHVlLCBzaXplX3QgaW5kZXgsIGNvbnN0IElu
dFNpemUmIHNpemUsIFRyYW5zZm9ybU9wZXJhdGlvbjo6T3BlcmF0aW9uVHlwZSB0cmFuc2Zvcm1U
eXBlKQoreworICAgIFRyYW5zZm9ybU9wZXJhdGlvbiogb3AgPSAoaW5kZXggPj0gdHJhbnNmb3Jt
VmFsdWUudmFsdWUoKS0+b3BlcmF0aW9ucygpLnNpemUoKSkgPyAwIDogdHJhbnNmb3JtVmFsdWUu
dmFsdWUoKS0+b3BlcmF0aW9ucygpW2luZGV4XS5nZXQoKTsKKyAgICAKKyAgICBzd2l0Y2ggKHRy
YW5zZm9ybVR5cGUpIHsKKyAgICAgICAgY2FzZSBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURToK
KyAgICAgICAgICAgIHJldHVybiBbTlNOdW1iZXIgbnVtYmVyV2l0aERvdWJsZTpvcCA/IChmbG9h
dCkgKHN0YXRpY19jYXN0PFJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbio+KG9wKS0+YW5nbGUoKSAq
IE1fUEkgLyAxODApIDogMF07CisKKyAgICAgICAgY2FzZSBUcmFuc2Zvcm1PcGVyYXRpb246OlND
QUxFX1g6CisgICAgICAgICAgICByZXR1cm4gW05TTnVtYmVyIG51bWJlcldpdGhEb3VibGU6b3Ag
PyBzdGF0aWNfY2FzdDxTY2FsZVRyYW5zZm9ybU9wZXJhdGlvbio+KG9wKS0+eCgpIDogMF07Cisg
ICAgICAgIGNhc2UgVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV9ZOgorICAgICAgICAgICAgcmV0
dXJuIFtOU051bWJlciBudW1iZXJXaXRoRG91YmxlOm9wID8gc3RhdGljX2Nhc3Q8U2NhbGVUcmFu
c2Zvcm1PcGVyYXRpb24qPihvcCktPnkoKSA6IDBdOworCisgICAgICAgIGNhc2UgVHJhbnNmb3Jt
T3BlcmF0aW9uOjpUUkFOU0xBVEVfWDoKKyAgICAgICAgICAgIHJldHVybiBbTlNOdW1iZXIgbnVt
YmVyV2l0aERvdWJsZTpvcCA/IHN0YXRpY19jYXN0PFRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlv
bio+KG9wKS0+eChzaXplKSA6IDBdOworICAgICAgICBjYXNlIFRyYW5zZm9ybU9wZXJhdGlvbjo6
VFJBTlNMQVRFX1k6CisgICAgICAgICAgICByZXR1cm4gW05TTnVtYmVyIG51bWJlcldpdGhEb3Vi
bGU6b3AgPyBzdGF0aWNfY2FzdDxUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb24qPihvcCktPngo
c2l6ZSkgOiAwXTsKKyAgICAgICAgCisgICAgICAgIGNhc2UgVHJhbnNmb3JtT3BlcmF0aW9uOjpT
Q0FMRToKKyAgICAgICAgY2FzZSBUcmFuc2Zvcm1PcGVyYXRpb246OlRSQU5TTEFURToKKyAgICAg
ICAgY2FzZSBUcmFuc2Zvcm1PcGVyYXRpb246OlNLRVdfWDoKKyAgICAgICAgY2FzZSBUcmFuc2Zv
cm1PcGVyYXRpb246OlNLRVdfWToKKyAgICAgICAgY2FzZSBUcmFuc2Zvcm1PcGVyYXRpb246OlNL
RVc6CisgICAgICAgIGNhc2UgVHJhbnNmb3JtT3BlcmF0aW9uOjpNQVRSSVg6CisgICAgICAgIGNh
c2UgVHJhbnNmb3JtT3BlcmF0aW9uOjpJREVOVElUWToKKyAgICAgICAgY2FzZSBUcmFuc2Zvcm1P
cGVyYXRpb246Ok5PTkU6IHsKKyAgICAgICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHQ7Cisg
ICAgICAgICAgICBpZiAob3ApCisgICAgICAgICAgICAgICAgb3AtPmFwcGx5KHQsIHNpemUpOwor
ICAgICAgICAgICAgQ0FUcmFuc2Zvcm0zRCBjYXQ7CisgICAgICAgICAgICBjb3B5VHJhbnNmb3Jt
KGNhdCwgdCk7CisgICAgICAgICAgICByZXR1cm4gW05TVmFsdWUgdmFsdWVXaXRoQ0FUcmFuc2Zv
cm0zRDpjYXRdOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHJldHVybiAwOworfQorCitz
dGF0aWMgU3RyaW5nIGdldEFuaW1hdGlvblZhbHVlRnVuY3Rpb24oVHJhbnNmb3JtT3BlcmF0aW9u
OjpPcGVyYXRpb25UeXBlIHRyYW5zZm9ybVR5cGUpCit7CisgICAgc3dpdGNoICh0cmFuc2Zvcm1U
eXBlKSB7CisgICAgICAgIGNhc2UgVHJhbnNmb3JtT3BlcmF0aW9uOjpST1RBVEU6CisgICAgICAg
ICAgICByZXR1cm4gInJvdGF0ZVoiOworICAgICAgICBjYXNlIFRyYW5zZm9ybU9wZXJhdGlvbjo6
U0NBTEVfWDoKKyAgICAgICAgICAgIHJldHVybiAic2NhbGVYIjsKKyAgICAgICAgY2FzZSBUcmFu
c2Zvcm1PcGVyYXRpb246OlNDQUxFX1k6CisgICAgICAgICAgICByZXR1cm4gInNjYWxlWSI7Cisg
ICAgICAgIGNhc2UgVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEVfWDoKKyAgICAgICAgICAg
IHJldHVybiAidHJhbnNsYXRlWCI7CisgICAgICAgIGNhc2UgVHJhbnNmb3JtT3BlcmF0aW9uOjpU
UkFOU0xBVEVfWToKKyAgICAgICAgICAgIHJldHVybiAidHJhbnNsYXRlWSI7CisgICAgICAgIGRl
ZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisgICAgfQorfQorCitzdGF0aWMg
Q0FNZWRpYVRpbWluZ0Z1bmN0aW9uKiBnZXRDQU1lZGlhVGltaW5nRnVuY3Rpb24oY29uc3QgVGlt
aW5nRnVuY3Rpb24mIHRpbWluZ0Z1bmN0aW9uKQoreworICAgIHN3aXRjaCAodGltaW5nRnVuY3Rp
b24udHlwZSgpKSB7CisgICAgICAgIGNhc2UgTGluZWFyVGltaW5nRnVuY3Rpb246CisgICAgICAg
ICAgICByZXR1cm4gW0NBTWVkaWFUaW1pbmdGdW5jdGlvbiBmdW5jdGlvbldpdGhOYW1lOkAibGlu
ZWFyIl07CisgICAgICAgIGNhc2UgQ3ViaWNCZXppZXJUaW1pbmdGdW5jdGlvbjoKKyAgICAgICAg
ICAgIHJldHVybiBbQ0FNZWRpYVRpbWluZ0Z1bmN0aW9uIGZ1bmN0aW9uV2l0aENvbnRyb2xQb2lu
dHM6c3RhdGljX2Nhc3Q8ZmxvYXQ+KHRpbWluZ0Z1bmN0aW9uLngxKCkpIDpzdGF0aWNfY2FzdDxm
bG9hdD4odGltaW5nRnVuY3Rpb24ueTEoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDpzdGF0
aWNfY2FzdDxmbG9hdD4odGltaW5nRnVuY3Rpb24ueDIoKSkgOnN0YXRpY19jYXN0PGZsb2F0Pih0
aW1pbmdGdW5jdGlvbi55MigpKV07CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjaWZuZGVm
IE5ERUJVRworc3RhdGljIHZvaWQgc2V0TGF5ZXJCb3JkZXJDb2xvcihQbGF0Zm9ybUxheWVyKiBs
YXllciwgY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIENHQ29sb3JSZWYgYm9yZGVyQ29sb3Ig
PSBjZ0NvbG9yKGNvbG9yKTsKKyAgICBbbGF5ZXIgc2V0Qm9yZGVyQ29sb3I6Ym9yZGVyQ29sb3Jd
OworICAgIENHQ29sb3JSZWxlYXNlKGJvcmRlckNvbG9yKTsKK30KKworc3RhdGljIHZvaWQgY2xl
YXJCb3JkZXJDb2xvcihQbGF0Zm9ybUxheWVyKiBsYXllcikKK3sKKyAgICBbbGF5ZXIgc2V0Qm9y
ZGVyQ29sb3I6bmlsXTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzZXRMYXllckJhY2tncm91
bmRDb2xvcihQbGF0Zm9ybUxheWVyKiBsYXllciwgY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAg
IENHQ29sb3JSZWYgYmdDb2xvciA9IGNnQ29sb3IoY29sb3IpOworICAgIFtsYXllciBzZXRCYWNr
Z3JvdW5kQ29sb3I6YmdDb2xvcl07CisgICAgQ0dDb2xvclJlbGVhc2UoYmdDb2xvcik7Cit9CisK
K3N0YXRpYyB2b2lkIGNsZWFyTGF5ZXJCYWNrZ3JvdW5kQ29sb3IoUGxhdGZvcm1MYXllciogbGF5
ZXIpCit7CisgICAgW2xheWVyIHNldEJhY2tncm91bmRDb2xvcjowXTsKK30KKworc3RhdGljIENB
TGF5ZXIqIGdldFByZXNlbnRhdGlvbkxheWVyKENBTGF5ZXIqIGxheWVyKQoreworICAgIENBTGF5
ZXIqICBwcmVzTGF5ZXIgPSBbbGF5ZXIgcHJlc2VudGF0aW9uTGF5ZXJdOworICAgIGlmICghcHJl
c0xheWVyKQorICAgICAgICBwcmVzTGF5ZXIgPSBsYXllcjsKKworICAgIHJldHVybiBwcmVzTGF5
ZXI7Cit9CisKK2Jvb2wgR3JhcGhpY3NMYXllcjo6Z3JhcGhpY3NDb250ZXh0c0ZsaXBwZWQoKQor
eworICAgIHJldHVybiB0cnVlOworfQorCisjaWZuZGVmIE5ERUJVRworYm9vbCBHcmFwaGljc0xh
eWVyOjpzaG93RGVidWdCb3JkZXJzKCkKK3sKKyAgICBzdGF0aWMgaW50IHNob3dEZWJ1Z0JvcmRl
cnMgPSBbW05TVXNlckRlZmF1bHRzIHN0YW5kYXJkVXNlckRlZmF1bHRzXSBib29sRm9yS2V5OkAi
V2ViQ29yZUxheWVyQm9yZGVycyJdOworICAgIHJldHVybiBzaG93RGVidWdCb3JkZXJzOworfQor
Citib29sIEdyYXBoaWNzTGF5ZXI6OnNob3dSZXBhaW50Q291bnRlcigpCit7CisgICAgc3RhdGlj
IGludCBzaG93UmVwYWludENvdW50ZXIgPSBbW05TVXNlckRlZmF1bHRzIHN0YW5kYXJkVXNlckRl
ZmF1bHRzXSBib29sRm9yS2V5OkAiV2ViQ29yZUxheWVyUmVwYWludENvdW50ZXIiXTsKKyAgICBy
ZXR1cm4gc2hvd1JlcGFpbnRDb3VudGVyOworfQorI2VuZGlmCisKK3N0YXRpYyBOU0RpY3Rpb25h
cnkqIG51bGxBY3Rpb25zRGljdGlvbmFyeSgpCit7CisgICAgTlNOdWxsKiBudWxsVmFsdWUgPSBb
TlNOdWxsIG51bGxdOworICAgIE5TRGljdGlvbmFyeSogYWN0aW9ucyA9IFtOU0RpY3Rpb25hcnkg
ZGljdGlvbmFyeVdpdGhPYmplY3RzQW5kS2V5czoKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbnVsbFZhbHVlLCBAImFuY2hvclBvaW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbnVsbFZhbHVlLCBAImJvdW5kcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51
bGxWYWx1ZSwgQCJjb250ZW50cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxW
YWx1ZSwgQCJjb250ZW50c1JlY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxs
VmFsdWUsIEAib3BhY2l0eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxWYWx1
ZSwgQCJwb3NpdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxWYWx1ZSwg
QCJzaGFkb3dDb2xvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxWYWx1ZSwg
QCJzdWJsYXllclRyYW5zZm9ybSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxW
YWx1ZSwgQCJzdWJsYXllcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsVmFs
dWUsIEAidHJhbnNmb3JtIiwKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIG51bGxWYWx1ZSwgQCJ6UG9zaXRpb24iLAorI2VuZGlmCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG5pbF07CisgICAgcmV0dXJuIGFjdGlvbnM7Cit9CisKK0dyYXBoaWNzTGF5
ZXIqIEdyYXBoaWNzTGF5ZXI6OmNyZWF0ZUdyYXBoaWNzTGF5ZXIoR3JhcGhpY3NMYXllckNsaWVu
dCogY2xpZW50KQoreworICAgIHJldHVybiBuZXcgR3JhcGhpY3NMYXllckNBKGNsaWVudCk7Cit9
CisKK0dyYXBoaWNzTGF5ZXJDQTo6R3JhcGhpY3NMYXllckNBKEdyYXBoaWNzTGF5ZXJDbGllbnQq
IGNsaWVudCkKKzogR3JhcGhpY3NMYXllcihjbGllbnQpCissIG1fY29udGVudExheWVyRm9ySW1h
Z2VPclZpZGVvKGZhbHNlKQoreworICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAg
IG1fbGF5ZXIuYWRvcHROUyhbW1dlYkxheWVyIGFsbG9jXSBpbml0XSk7CisgICAgW21fbGF5ZXIu
Z2V0KCkgc2V0TGF5ZXJPd25lcjp0aGlzXTsKKworI2lmbmRlZiBOREVCVUcKKyAgICB1cGRhdGVE
ZWJ1Z0luZGljYXRvcnMoKTsKKyNlbmRpZgorCisgICAgbV9hbmltYXRpb25EZWxlZ2F0ZS5hZG9w
dE5TKFtbV2ViQW5pbWF0aW9uRGVsZWdhdGUgYWxsb2NdIGluaXRdKTsKKyAgICBbbV9hbmltYXRp
b25EZWxlZ2F0ZS5nZXQoKSBzZXRMYXllcjp0aGlzXTsKKyAgICAKKyAgICBFTkRfQkxPQ0tfT0JK
Q19FWENFUFRJT05TCit9CisKK0dyYXBoaWNzTGF5ZXJDQTo6fkdyYXBoaWNzTGF5ZXJDQSgpCit7
CisgICAgLy8gUmVtb3ZlIGEgaW5uZXIgbGF5ZXIgaWYgdGhlcmUgaXMgb25lLgorICAgIGNsZWFy
Q29udGVudHMoKTsKKworICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworCisgICAgLy8g
Q2xlYW4gdXAgdGhlIFdLIGxheWVyLgorICAgIGlmIChtX2xheWVyKSB7CisgICAgICAgIFdlYkxh
eWVyKiBsYXllciA9IG1fbGF5ZXIuZ2V0KCk7CisgICAgICAgIFtsYXllciBzZXRMYXllck93bmVy
Om5pbF07CisgICAgICAgIFtsYXllciByZW1vdmVGcm9tU3VwZXJsYXllcl07CisgICAgfQorICAg
IAorICAgIGlmIChtX3RyYW5zZm9ybUxheWVyKQorICAgICAgICBbbV90cmFuc2Zvcm1MYXllci5n
ZXQoKSByZW1vdmVGcm9tU3VwZXJsYXllcl07CisKKyAgICAvLyBhbmltYXRpb25EaWRTdGFydDog
Y2FuIGZpcmUgYWZ0ZXIgdGhpcywgc28gd2UgbmVlZCB0byBjbGVhciBvdXQgdGhlIGxheWVyIG9u
IHRoZSBkZWxlZ2F0ZS4KKyAgICBbbV9hbmltYXRpb25EZWxlZ2F0ZS5nZXQoKSBzZXRMYXllcjow
XTsKKworICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKK30KKwordm9pZCBHcmFwaGljc0xh
eWVyQ0E6OnNldE5hbWUoY29uc3QgU3RyaW5nJiBuYW1lKQoreworICAgIFN0cmluZyBsb25nTmFt
ZSA9IFN0cmluZzo6Zm9ybWF0KCJDQUxheWVyKCVwKSBHcmFwaGljc0xheWVyKCVwKSAiLCBtX2xh
eWVyLmdldCgpLCB0aGlzKSArIG5hbWU7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0TmFtZShsb25n
TmFtZSk7CisgICAgCisgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgW21fbGF5
ZXIuZ2V0KCkgc2V0TmFtZTpuYW1lXTsKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCit9
CisKK05hdGl2ZUxheWVyIEdyYXBoaWNzTGF5ZXJDQTo6bmF0aXZlTGF5ZXIoKSBjb25zdAorewor
ICAgIHJldHVybiBtX2xheWVyLmdldCgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6YWRk
Q2hpbGQoR3JhcGhpY3NMYXllciogY2hpbGRMYXllcikKK3sKKyAgICBHcmFwaGljc0xheWVyOjph
ZGRDaGlsZChjaGlsZExheWVyKTsKKworICAgIEdyYXBoaWNzTGF5ZXJDQSogY2hpbGRMYXllckNB
ID0gc3RhdGljX2Nhc3Q8R3JhcGhpY3NMYXllckNBKj4oY2hpbGRMYXllcik7CisgICAgQkVHSU5f
QkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgW2hvc3RMYXllckZvclN1YmxheWVycygpIGFkZFN1
YmxheWVyOmNoaWxkTGF5ZXJDQS0+bGF5ZXJGb3JTdXBlcmxheWVyKCldOworICAgIEVORF9CTE9D
S19PQkpDX0VYQ0VQVElPTlMKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0E6OmFkZENoaWxkQXRJ
bmRleChHcmFwaGljc0xheWVyKiBjaGlsZExheWVyLCBpbnQgaW5kZXgpCit7CisgICAgR3JhcGhp
Y3NMYXllcjo6YWRkQ2hpbGRBdEluZGV4KGNoaWxkTGF5ZXIsIGluZGV4KTsKKworICAgIEdyYXBo
aWNzTGF5ZXJDQSogY2hpbGRMYXllckNBID0gc3RhdGljX2Nhc3Q8R3JhcGhpY3NMYXllckNBKj4o
Y2hpbGRMYXllcik7CisgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgW2hvc3RM
YXllckZvclN1YmxheWVycygpIGluc2VydFN1YmxheWVyOmNoaWxkTGF5ZXJDQS0+bGF5ZXJGb3JT
dXBlcmxheWVyKCkgYXRJbmRleDppbmRleF07CisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9O
UworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6YWRkQ2hpbGRCZWxvdyhHcmFwaGljc0xheWVy
KiBjaGlsZExheWVyLCBHcmFwaGljc0xheWVyKiBzaWJsaW5nKQoreworICAgIC8vIEZJWE1FOiBz
aGFyZSBjb2RlIHdpdGggYmFzZSBjbGFzcworICAgIEFTU0VSVChjaGlsZExheWVyICE9IHRoaXMp
OworICAgIGNoaWxkTGF5ZXItPnJlbW92ZUZyb21QYXJlbnQoKTsKKworICAgIGJvb2wgZm91bmQg
PSBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9jaGlsZHJlbi5zaXplKCk7
IGkrKykgeworICAgICAgICBpZiAoc2libGluZyA9PSBtX2NoaWxkcmVuW2ldKSB7CisgICAgICAg
ICAgICBtX2NoaWxkcmVuLmluc2VydChpLCBjaGlsZExheWVyKTsKKyAgICAgICAgICAgIGZvdW5k
ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGNoaWxk
TGF5ZXItPnNldFBhcmVudCh0aGlzKTsKKworICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9O
UworCisgICAgR3JhcGhpY3NMYXllckNBKiBjaGlsZExheWVyQ0EgPSBzdGF0aWNfY2FzdDxHcmFw
aGljc0xheWVyQ0EqPihjaGlsZExheWVyKTsKKyAgICBHcmFwaGljc0xheWVyQ0EqIHNpYmxpbmdM
YXllckNBID0gc3RhdGljX2Nhc3Q8R3JhcGhpY3NMYXllckNBKj4oc2libGluZyk7CisgICAgaWYg
KGZvdW5kKQorICAgICAgICBbaG9zdExheWVyRm9yU3VibGF5ZXJzKCkgaW5zZXJ0U3VibGF5ZXI6
Y2hpbGRMYXllckNBLT5sYXllckZvclN1cGVybGF5ZXIoKSBiZWxvdzpzaWJsaW5nTGF5ZXJDQS0+
bGF5ZXJGb3JTdXBlcmxheWVyKCldOworICAgIGVsc2UgeworICAgICAgICBtX2NoaWxkcmVuLmFw
cGVuZChjaGlsZExheWVyKTsKKyAgICAgICAgW2hvc3RMYXllckZvclN1YmxheWVycygpIGFkZFN1
YmxheWVyOmNoaWxkTGF5ZXJDQS0+bGF5ZXJGb3JTdXBlcmxheWVyKCldOworICAgIH0KKworICAg
IEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0E6OmFk
ZENoaWxkQWJvdmUoR3JhcGhpY3NMYXllciogY2hpbGRMYXllciwgR3JhcGhpY3NMYXllciogc2li
bGluZykKK3sKKyAgICAvLyBGSVhNRTogc2hhcmUgY29kZSB3aXRoIGJhc2UgY2xhc3MKKyAgICBB
U1NFUlQoY2hpbGRMYXllciAhPSB0aGlzKTsKKyAgICBjaGlsZExheWVyLT5yZW1vdmVGcm9tUGFy
ZW50KCk7CisKKyAgICB1bnNpZ25lZCBpOworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICBm
b3IgKGkgPSAwOyBpIDwgbV9jaGlsZHJlbi5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoc2li
bGluZyA9PSBtX2NoaWxkcmVuW2ldKSB7CisgICAgICAgICAgICBtX2NoaWxkcmVuLmluc2VydChp
KzEsIGNoaWxkTGF5ZXIpOworICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgY2hpbGRMYXllci0+c2V0UGFyZW50KHRoaXMp
OworCisgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisKKyAgICBHcmFwaGljc0xheWVy
Q0EqIGNoaWxkTGF5ZXJDQSA9IHN0YXRpY19jYXN0PEdyYXBoaWNzTGF5ZXJDQSo+KGNoaWxkTGF5
ZXIpOworICAgIEdyYXBoaWNzTGF5ZXJDQSogc2libGluZ0xheWVyQ0EgPSBzdGF0aWNfY2FzdDxH
cmFwaGljc0xheWVyQ0EqPihzaWJsaW5nKTsKKyAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgW2hv
c3RMYXllckZvclN1YmxheWVycygpIGluc2VydFN1YmxheWVyOmNoaWxkTGF5ZXJDQS0+bGF5ZXJG
b3JTdXBlcmxheWVyKCkgYWJvdmU6c2libGluZ0xheWVyQ0EtPmxheWVyRm9yU3VwZXJsYXllcigp
XTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX2NoaWxkcmVuLmFwcGVuZChjaGlsZExheWVyKTsK
KyAgICAgICAgW2hvc3RMYXllckZvclN1YmxheWVycygpIGFkZFN1YmxheWVyOmNoaWxkTGF5ZXJD
QS0+bGF5ZXJGb3JTdXBlcmxheWVyKCldOworICAgIH0KKworICAgIEVORF9CTE9DS19PQkpDX0VY
Q0VQVElPTlMKK30KKworYm9vbCBHcmFwaGljc0xheWVyQ0E6OnJlcGxhY2VDaGlsZChHcmFwaGlj
c0xheWVyKiBvbGRDaGlsZCwgR3JhcGhpY3NMYXllciogbmV3Q2hpbGQpCit7CisgICAgLy8gRklY
TUU6IHNoYXJlIGNvZGUgd2l0aCBiYXNlIGNsYXNzCisgICAgQVNTRVJUKCFuZXdDaGlsZC0+cGFy
ZW50KCkpOworCisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBtX2NoaWxkcmVuLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChvbGRDaGlsZCA9
PSBtX2NoaWxkcmVuW2ldKSB7CisgICAgICAgICAgICBtX2NoaWxkcmVuW2ldID0gbmV3Q2hpbGQ7
CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
fQorICAgIH0KKworICAgIGlmIChmb3VuZCkgeworICAgICAgICBvbGRDaGlsZC0+c2V0UGFyZW50
KDApOworCisgICAgICAgIG5ld0NoaWxkLT5yZW1vdmVGcm9tUGFyZW50KCk7CisgICAgICAgIG5l
d0NoaWxkLT5zZXRQYXJlbnQodGhpcyk7CisKKyAgICAgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENF
UFRJT05TCisgICAgICAgIEdyYXBoaWNzTGF5ZXJDQSogb2xkQ2hpbGRDQSA9IHN0YXRpY19jYXN0
PEdyYXBoaWNzTGF5ZXJDQSo+KG9sZENoaWxkKTsKKyAgICAgICAgR3JhcGhpY3NMYXllckNBKiBu
ZXdDaGlsZENBID0gc3RhdGljX2Nhc3Q8R3JhcGhpY3NMYXllckNBKj4obmV3Q2hpbGQpOworICAg
ICAgICBbaG9zdExheWVyRm9yU3VibGF5ZXJzKCkgcmVwbGFjZVN1YmxheWVyOm9sZENoaWxkQ0Et
PmxheWVyRm9yU3VwZXJsYXllcigpIHdpdGg6bmV3Q2hpbGRDQS0+bGF5ZXJGb3JTdXBlcmxheWVy
KCldOworICAgICAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgICAgIHJldHVybiB0
cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNB
OjpyZW1vdmVGcm9tUGFyZW50KCkKK3sKKyAgICBHcmFwaGljc0xheWVyOjpyZW1vdmVGcm9tUGFy
ZW50KCk7CisKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICBbbGF5ZXJGb3JT
dXBlcmxheWVyKCkgcmVtb3ZlRnJvbVN1cGVybGF5ZXJdOyAgICAgICAgICAgIAorICAgIEVORF9C
TE9DS19PQkpDX0VYQ0VQVElPTlMKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0E6OnNldFBvc2l0
aW9uKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KQoreworICAgIC8vIERvbid0IHNob3J0LWNpcmN1
aXQgaGVyZSwgYmVjYXVzZSBwb3NpdGlvbiBhbmQgYW5jaG9yIHBvaW50IGFyZSBpbnRlci1kZXBl
bmRlbnQuCisgICAgR3JhcGhpY3NMYXllcjo6c2V0UG9zaXRpb24ocG9pbnQpOworCisgICAgLy8g
UG9zaXRpb24gaXMgb2Zmc2V0IG9uIHRoZSBsYXllciBieSB0aGUgbGF5ZXIgYW5jaG9yIHBvaW50
LgorICAgIENHUG9pbnQgcG9zUG9pbnQgPSBDR1BvaW50TWFrZShtX3Bvc2l0aW9uLngoKSArIG1f
YW5jaG9yUG9pbnQueCgpICogbV9zaXplLndpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG1fcG9zaXRpb24ueSgpICsgbV9hbmNob3JQb2ludC55KCkgKiBtX3NpemUu
aGVpZ2h0KCkpOworICAgIAorICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgIFtw
cmltYXJ5TGF5ZXIoKSBzZXRQb3NpdGlvbjpwb3NQb2ludF07CisgICAgRU5EX0JMT0NLX09CSkNf
RVhDRVBUSU9OUworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6c2V0QW5jaG9yUG9pbnQoY29u
c3QgRmxvYXRQb2ludDNEJiBwb2ludCkKK3sKKyAgICAvLyBEb24ndCBzaG9ydC1jaXJjdWl0IGhl
cmUsIGJlY2F1c2UgcG9zaXRpb24gYW5kIGFuY2hvciBwb2ludCBhcmUgaW50ZXItZGVwZW5kZW50
LgorICAgIGJvb2wgekNoYW5nZWQgPSAocG9pbnQueigpICE9IG1fYW5jaG9yUG9pbnQueigpKTsK
KyAgICBHcmFwaGljc0xheWVyOjpzZXRBbmNob3JQb2ludChwb2ludCk7CisKKyAgICBCRUdJTl9C
TE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICAvLyBzZXQgdGhlIHZhbHVlIG9uIHRoZSBsYXllciB0
byB0aGUgbmV3IHRyYW5zZm9ybS4KKyAgICBbcHJpbWFyeUxheWVyKCkgc2V0QW5jaG9yUG9pbnQ6
RmxvYXRQb2ludChwb2ludC54KCksIHBvaW50LnkoKSldOworCisgICAgaWYgKHpDaGFuZ2VkKSAK
KyAgICAgICAgW3ByaW1hcnlMYXllcigpIHNldEFuY2hvclBvaW50WjptX2FuY2hvclBvaW50Lnoo
KV07CisKKyAgICAvLyBQb3NpdGlvbiBkZXBlbmRzIG9uIGFuY2hvciBwb2ludCwgc28gdXBkYXRl
IGl0IG5vdy4KKyAgICBzZXRQb3NpdGlvbihtX3Bvc2l0aW9uKTsKKyAgICBFTkRfQkxPQ0tfT0JK
Q19FWENFUFRJT05TCit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjpzZXRTaXplKGNvbnN0IEZs
b2F0U2l6ZSYgc2l6ZSkKK3sKKyAgICBHcmFwaGljc0xheWVyOjpzZXRTaXplKHNpemUpOworCisg
ICAgQ0dSZWN0IHJlY3QgPSBDR1JlY3RNYWtlKDAuMGYsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIDAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc2l6ZS53aWR0aCgp
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NpemUuaGVpZ2h0KCkpOworICAgIAor
ICAgIENHUG9pbnQgY2VudGVyUG9pbnQgPSBDR1BvaW50TWFrZShtX3NpemUud2lkdGgoKSAvIDIu
MGYsIG1fc2l6ZS5oZWlnaHQoKSAvIDIuMGYpOworICAgIAorICAgIEJFR0lOX0JMT0NLX09CSkNf
RVhDRVBUSU9OUworCisgICAgaWYgKG1fdHJhbnNmb3JtTGF5ZXIpIHsKKyAgICAgICAgW21fdHJh
bnNmb3JtTGF5ZXIuZ2V0KCkgc2V0Qm91bmRzOnJlY3RdOworICAgIAorICAgICAgICAvLyB0aGUg
YW5jaG9yIG9mIHRoZSBjb250ZW50cyBsYXllciBpcyBhbHdheXMgYXQgMC41LCAwLjUsIHNvIHRo
ZSBwb3NpdGlvbgorICAgICAgICAvLyBpcyBjZW50ZXItcmVsYXRpdmUKKyAgICAgICAgW21fbGF5
ZXIuZ2V0KCkgc2V0UG9zaXRpb246Y2VudGVyUG9pbnRdOworICAgIH0KKyAgICAKKyAgICBib29s
IG5lZWRUaWxlZExheWVyID0gcmVxdWlyZXNUaWxlZExheWVyKG1fc2l6ZSk7CisgICAgaWYgKG5l
ZWRUaWxlZExheWVyICE9IG1fdXNpbmdUaWxlZExheWVyKQorICAgICAgICBzd2FwRnJvbU9yVG9U
aWxlZExheWVyKG5lZWRUaWxlZExheWVyKTsKKyAgICAKKyAgICBbbV9sYXllci5nZXQoKSBzZXRC
b3VuZHM6cmVjdF07CisKKyAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgcmVzaXplIG1fY29udGVu
dHNMYXllci4gSXQncyB1cCB0aGUgY2FsbGVyIHRvIGRvIHRoYXQuCisKKyAgICBFTkRfQkxPQ0tf
T0JKQ19FWENFUFRJT05TCisKKyAgICAvLyBpZiB3ZSd2ZSBjaGFuZ2VkIHRoZSBib3VuZHMsIHdl
IG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIHBvc2l0aW9uCisgICAgLy8gb2YgdGhlIGxheWVyLCB0
YWtpbmcgYW5jaG9yIHBvaW50IGludG8gYWNjb3VudAorICAgIHNldFBvc2l0aW9uKG1fcG9zaXRp
b24pOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6c2V0VHJhbnNmb3JtKGNvbnN0IFRyYW5z
Zm9ybWF0aW9uTWF0cml4JiB0KQoreworICAgIEdyYXBoaWNzTGF5ZXI6OnNldFRyYW5zZm9ybSh0
KTsKKyAgICAKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICBDQVRyYW5zZm9y
bTNEIHRyYW5zZm9ybTsKKyAgICBjb3B5VHJhbnNmb3JtKHRyYW5zZm9ybSwgdCk7CisgICAgW3By
aW1hcnlMYXllcigpIHNldFRyYW5zZm9ybTp0cmFuc2Zvcm1dOworICAgIEVORF9CTE9DS19PQkpD
X0VYQ0VQVElPTlMKKyAgICAKKyAgICAvLyBSZW1vdmUgYW55IG9sZCB0cmFuc2l0aW9uIGVudHJp
ZXMgZm9yIHRyYW5zZm9ybS4KKyAgICByZW1vdmVBbGxBbmltYXRpb25zRm9yUHJvcGVydHkoQW5p
bWF0ZWRQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybSk7CisKKyAgICAvLyBFdmVuIGlmIHdlIGRvbid0
IGhhdmUgYSB0cmFuc2l0aW9uIGluIHRoZSBsaXN0LCB0aGUgbGF5ZXIgbWF5IHN0aWxsIGhhdmUg
b25lLgorICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIHdlIGFyZSBzZXR0aW5nIHRoZSBmaW5hbCB0
cmFuc2Zvcm0gdmFsdWUgYWZ0ZXIgYW4gYW5pbWF0aW9uIG9yCisgICAgLy8gdHJhbnNpdGlvbiBo
YXMgZW5kZWQuIEluIHJlbW92ZUFuaW1hdGlvbiB3ZSB0b3NzIHRoZSBlbnRyeSBmcm9tIHRoZSBs
aXN0IGJ1dCBkb24ndAorICAgIC8vIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0LiBUaGF0IHdheSB3
ZSBhcmVuJ3QgaW4gZGFuZ2VyIG9mIGRpc3BsYXlpbmcgYSBzdGFsZSB0cmFuc2Zvcm0KKyAgICAv
LyBpbiB0aGUgdGltZSBiZXR3ZWVuIHJlbW92aW5nIHRoZSBhbmltYXRpb24gYW5kIHNldHRpbmcg
dGhlIG5ldyB1bmFuaW1hdGVkIHZhbHVlLiBXZSAKKyAgICAvLyBjYW4ndCBkbyB0aGlzIGluIHJl
bW92ZUFuaW1hdGlvbiBiZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIG5ldyB0cmFuc2Zvcm0gdmFs
dWUgdGhlcmUuCisgICAgU3RyaW5nIGtleVBhdGggPSBwcm9wZXJ0eUlkVG9TdHJpbmcoQW5pbWF0
ZWRQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybSk7CisgICAgQ0FMYXllciogbGF5ZXIgPSBhbmltYXRl
ZExheWVyKEFuaW1hdGVkUHJvcGVydHlXZWJraXRUcmFuc2Zvcm0pOworICAgIAorICAgIGZvciAo
aW50IGkgPSAwOyA7ICsraSkgeworICAgICAgICBTdHJpbmcgYW5pbU5hbWUgPSBrZXlQYXRoICsg
Il8iICsgU3RyaW5nOjpudW1iZXIoaSk7CisgICAgICAgIGlmICghW2xheWVyIGFuaW1hdGlvbkZv
cktleTogYW5pbU5hbWVdKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIFtsYXllciByZW1v
dmVBbmltYXRpb25Gb3JLZXk6YW5pbU5hbWVdOworICAgIH0KK30KKwordm9pZCBHcmFwaGljc0xh
eWVyQ0E6OnNldENoaWxkcmVuVHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0
KQoreworICAgIGlmICh0ID09IG1fY2hpbGRyZW5UcmFuc2Zvcm0pCisgICAgICAgIHJldHVybjsK
KworICAgIEdyYXBoaWNzTGF5ZXI6OnNldENoaWxkcmVuVHJhbnNmb3JtKHQpOworCisgICAgQ0FU
cmFuc2Zvcm0zRCB0cmFuc2Zvcm07CisgICAgY29weVRyYW5zZm9ybSh0cmFuc2Zvcm0sIHQpOwor
CisgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgLy8gU2V0IHRoZSB2YWx1ZSBv
biB0aGUgbGF5ZXIgdG8gdGhlIG5ldyB0cmFuc2Zvcm0uCisgICAgW3ByaW1hcnlMYXllcigpIHNl
dFN1YmxheWVyVHJhbnNmb3JtOnRyYW5zZm9ybV07CisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBU
SU9OUworfQorCitzdGF0aWMgdm9pZCBtb3ZlQW5pbWF0aW9uKEFuaW1hdGVkUHJvcGVydHlJRCBw
cm9wZXJ0eSwgQ0FMYXllciogZnJvbUxheWVyLCBDQUxheWVyKiB0b0xheWVyKQoreworICAgIFN0
cmluZyBrZXlQYXRoID0gR3JhcGhpY3NMYXllcjo6cHJvcGVydHlJZFRvU3RyaW5nKHByb3BlcnR5
KTsKKyAgICBmb3IgKHNob3J0IGluZGV4ID0gMDsgOyArK2luZGV4KSB7CisgICAgICAgIFN0cmlu
ZyBhbmltTmFtZSA9IGtleVBhdGggKyAiXyIgKyBTdHJpbmc6Om51bWJlcihpbmRleCk7CisgICAg
ICAgIENBQW5pbWF0aW9uKiBhbmltID0gW2Zyb21MYXllciBhbmltYXRpb25Gb3JLZXk6YW5pbU5h
bWVdOworICAgICAgICBpZiAoIWFuaW0pCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBb
YW5pbSByZXRhaW5dOworICAgICAgICBbZnJvbUxheWVyIHJlbW92ZUFuaW1hdGlvbkZvcktleTph
bmltTmFtZV07CisgICAgICAgIFt0b0xheWVyIGFkZEFuaW1hdGlvbjphbmltIGZvcktleTphbmlt
TmFtZV07CisgICAgICAgIFthbmltIHJlbGVhc2VdOworICAgIH0KK30KKworc3RhdGljIHZvaWQg
bW92ZVN1YmxheWVycyhDQUxheWVyKiBmcm9tTGF5ZXIsIENBTGF5ZXIqIHRvTGF5ZXIpCit7Cisg
ICAgTlNBcnJheSogc3VibGF5ZXJzQ29weSA9IFtbZnJvbUxheWVyIHN1YmxheWVyc10gY29weV07
IC8vIEF2b2lkIG11dGF0aW9uIHdoaWxlIGVudW1lcmF0aW5nLCBhbmQga2VlcCB0aGUgc3VibGF5
ZXJzIGFsaXZlLgorICAgIE5TRW51bWVyYXRvciogY2hpbGRyZW5FbnVtZXJhdG9yID0gW3N1Ymxh
eWVyc0NvcHkgb2JqZWN0RW51bWVyYXRvcl07CisKKyAgICBDQUxheWVyKiBsYXllcjsKKyAgICB3
aGlsZSAoKGxheWVyID0gW2NoaWxkcmVuRW51bWVyYXRvciBuZXh0T2JqZWN0XSkgIT0gbmlsKSB7
CisgICAgICAgIFtsYXllciByZW1vdmVGcm9tU3VwZXJsYXllcl07CisgICAgICAgIFt0b0xheWVy
IGFkZFN1YmxheWVyOmxheWVyXTsKKyAgICB9CisgICAgW3N1YmxheWVyc0NvcHkgcmVsZWFzZV07
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjpzZXRQcmVzZXJ2ZXMzRChib29sIHByZXNlcnZl
czNEKQoreworICAgIEdyYXBoaWNzTGF5ZXI6OnNldFByZXNlcnZlczNEKHByZXNlcnZlczNEKTsK
KworICAgIENHUG9pbnQgcG9pbnQgPSBDR1BvaW50TWFrZShtX3NpemUud2lkdGgoKSAvIDIuMGYs
IG1fc2l6ZS5oZWlnaHQoKSAvIDIuMGYpOworICAgIENHUG9pbnQgY2VudGVyUG9pbnQgPSBDR1Bv
aW50TWFrZSgwLjVmLCAwLjVmKTsKKyAgICAKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElP
TlMKKworICAgIGlmIChwcmVzZXJ2ZXMzRCAmJiAhbV90cmFuc2Zvcm1MYXllcikgeworICAgICAg
ICAvLyBDcmVhdGUgdGhlIHRyYW5zZm9ybSBsYXllci4KKyAgICAgICAgbV90cmFuc2Zvcm1MYXll
ci5hZG9wdE5TKFtbQ0FUcmFuc2Zvcm1MYXllciBhbGxvY10gaW5pdF0pOworCisgICAgICAgIC8v
IFR1cm4gb2ZmIGRlZmF1bHQgYW5pbWF0aW9ucy4KKyAgICAgICAgW21fdHJhbnNmb3JtTGF5ZXIu
Z2V0KCkgc2V0U3R5bGU6W05TRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aE9iamVjdDpudWxsQWN0
aW9uc0RpY3Rpb25hcnkoKSBmb3JLZXk6QCJhY3Rpb25zIl1dOworICAgICAgICAKKyNpZm5kZWYg
TkRFQlVHCisgICAgICAgIFttX3RyYW5zZm9ybUxheWVyLmdldCgpIHNldE5hbWU6W05TU3RyaW5n
IHN0cmluZ1dpdGhGb3JtYXQ6QCJUcmFuc2Zvcm0gTGF5ZXIgQ0FUcmFuc2Zvcm1MYXllciglcCkg
R3JhcGhpY3NMYXllciglcCkiLCBtX3RyYW5zZm9ybUxheWVyLmdldCgpLCB0aGlzXV07CisjZW5k
aWYKKyAgICAgICAgLy8gQ29weSB0aGUgcG9zaXRpb24gZnJvbSB0aGlzIGxheWVyLgorICAgICAg
ICBbbV90cmFuc2Zvcm1MYXllci5nZXQoKSBzZXRCb3VuZHM6W21fbGF5ZXIuZ2V0KCkgYm91bmRz
XV07CisgICAgICAgIFttX3RyYW5zZm9ybUxheWVyLmdldCgpIHNldFBvc2l0aW9uOlttX2xheWVy
LmdldCgpIHBvc2l0aW9uXV07CisgICAgICAgIFttX3RyYW5zZm9ybUxheWVyLmdldCgpIHNldEFu
Y2hvclBvaW50OlttX2xheWVyLmdldCgpIGFuY2hvclBvaW50XV07CisgICAgICAgIFttX3RyYW5z
Zm9ybUxheWVyLmdldCgpIHNldEFuY2hvclBvaW50WjpbbV9sYXllci5nZXQoKSBhbmNob3JQb2lu
dFpdXTsKKyAgICAgICAgW21fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkgc2V0Q29udGVudHNSZWN0Oltt
X2xheWVyLmdldCgpIGNvbnRlbnRzUmVjdF1dOworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgW21f
dHJhbnNmb3JtTGF5ZXIuZ2V0KCkgc2V0WlBvc2l0aW9uOlttX2xheWVyLmdldCgpIHpQb3NpdGlv
bl1dOworI2VuZGlmCisgICAgICAgIAorICAgICAgICAvLyBUaGUgY29udGVudHMgbGF5ZXIgaXMg
cG9zaXRpb25lZCBhdCAoMCwwKSByZWxhdGl2ZSB0byB0aGUgdHJhbnNmb3JtTGF5ZXIuCisgICAg
ICAgIFttX2xheWVyLmdldCgpIHNldFBvc2l0aW9uOnBvaW50XTsKKyAgICAgICAgW21fbGF5ZXIu
Z2V0KCkgc2V0QW5jaG9yUG9pbnQ6Y2VudGVyUG9pbnRdOworI2lmbmRlZiBOREVCVUcKKyAgICAg
ICAgW21fbGF5ZXIuZ2V0KCkgc2V0WlBvc2l0aW9uOjAuMGZdOworI2VuZGlmCisgICAgICAgIAor
ICAgICAgICAvLyBUcmFuc2ZlciB0aGUgdHJhbnNmb3JtIG92ZXIuCisgICAgICAgIFttX3RyYW5z
Zm9ybUxheWVyLmdldCgpIHNldFRyYW5zZm9ybTpbbV9sYXllci5nZXQoKSB0cmFuc2Zvcm1dXTsK
KyAgICAgICAgW21fbGF5ZXIuZ2V0KCkgc2V0VHJhbnNmb3JtOkNBVHJhbnNmb3JtM0RJZGVudGl0
eV07CisgICAgICAgIAorICAgICAgICAvLyBUcmFuc2ZlciB0aGUgb3BhY2l0eSBmcm9tIHRoZSBv
bGQgbGF5ZXIgdG8gdGhlIHRyYW5zZm9ybSBsYXllci4KKyAgICAgICAgW21fdHJhbnNmb3JtTGF5
ZXIuZ2V0KCkgc2V0T3BhY2l0eTptX29wYWNpdHldOworICAgICAgICBbbV9sYXllci5nZXQoKSBz
ZXRPcGFjaXR5OjFdOworCisgICAgICAgIC8vIE1vdmUgdGhpcyBsYXllciB0byBiZSBhIGNoaWxk
IG9mIHRoZSB0cmFuc2Zvcm0gbGF5ZXIuCisgICAgICAgIFtbbV9sYXllci5nZXQoKSBzdXBlcmxh
eWVyXSByZXBsYWNlU3VibGF5ZXI6bV9sYXllci5nZXQoKSB3aXRoOm1fdHJhbnNmb3JtTGF5ZXIu
Z2V0KCldOworICAgICAgICBbbV90cmFuc2Zvcm1MYXllci5nZXQoKSBhZGRTdWJsYXllcjptX2xh
eWVyLmdldCgpXTsKKworICAgICAgICBtb3ZlQW5pbWF0aW9uKEFuaW1hdGVkUHJvcGVydHlXZWJr
aXRUcmFuc2Zvcm0sIG1fbGF5ZXIuZ2V0KCksIG1fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkpOworICAg
ICAgICBtb3ZlU3VibGF5ZXJzKG1fbGF5ZXIuZ2V0KCksIG1fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkp
OworCisgICAgfSBlbHNlIGlmICghcHJlc2VydmVzM0QgJiYgbV90cmFuc2Zvcm1MYXllcikgewor
ICAgICAgICAvLyBSZWxhY2UgdGhlIHRyYW5zZm9ybUxheWVyIGluIHRoZSBwYXJlbnQgd2l0aCB0
aGlzIGxheWVyLgorICAgICAgICBbbV9sYXllci5nZXQoKSByZW1vdmVGcm9tU3VwZXJsYXllcl07
CisgICAgICAgIFtbbV90cmFuc2Zvcm1MYXllci5nZXQoKSBzdXBlcmxheWVyXSByZXBsYWNlU3Vi
bGF5ZXI6bV90cmFuc2Zvcm1MYXllci5nZXQoKSB3aXRoOm1fbGF5ZXIuZ2V0KCldOworCisgICAg
ICAgIG1vdmVBbmltYXRpb24oQW5pbWF0ZWRQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybSwgbV90cmFu
c2Zvcm1MYXllci5nZXQoKSwgbV9sYXllci5nZXQoKSk7CisgICAgICAgIG1vdmVTdWJsYXllcnMo
bV90cmFuc2Zvcm1MYXllci5nZXQoKSwgbV9sYXllci5nZXQoKSk7CisKKyAgICAgICAgLy8gUmVz
ZXQgdGhlIGxheWVyIHBvc2l0aW9uIGFuZCB0cmFuc2Zvcm0uCisgICAgICAgIFttX2xheWVyLmdl
dCgpIHNldFBvc2l0aW9uOlttX3RyYW5zZm9ybUxheWVyLmdldCgpIHBvc2l0aW9uXV07CisgICAg
ICAgIFttX2xheWVyLmdldCgpIHNldEFuY2hvclBvaW50OlttX3RyYW5zZm9ybUxheWVyLmdldCgp
IGFuY2hvclBvaW50XV07CisgICAgICAgIFttX2xheWVyLmdldCgpIHNldEFuY2hvclBvaW50Wjpb
bV90cmFuc2Zvcm1MYXllci5nZXQoKSBhbmNob3JQb2ludFpdXTsKKyAgICAgICAgW21fbGF5ZXIu
Z2V0KCkgc2V0Q29udGVudHNSZWN0OlttX3RyYW5zZm9ybUxheWVyLmdldCgpIGNvbnRlbnRzUmVj
dF1dOworICAgICAgICBbbV9sYXllci5nZXQoKSBzZXRUcmFuc2Zvcm06W21fdHJhbnNmb3JtTGF5
ZXIuZ2V0KCkgdHJhbnNmb3JtXV07CisgICAgICAgIFttX2xheWVyLmdldCgpIHNldE9wYWNpdHk6
W21fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkgb3BhY2l0eV1dOworI2lmbmRlZiBOREVCVUcKKyAgICAg
ICAgW21fbGF5ZXIuZ2V0KCkgc2V0WlBvc2l0aW9uOlttX3RyYW5zZm9ybUxheWVyLmdldCgpIHpQ
b3NpdGlvbl1dOworI2VuZGlmCisKKyAgICAgICAgLy8gUmVsZWFzZSB0aGUgdHJhbnNmb3JtIGxh
eWVyLgorICAgICAgICBtX3RyYW5zZm9ybUxheWVyID0gMDsKKyAgICB9CisKKyAgICBFTkRfQkxP
Q0tfT0JKQ19FWENFUFRJT05TCit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjpzZXRNYXNrc1Rv
Qm91bmRzKGJvb2wgbWFza3NUb0JvdW5kcykKK3sKKyAgICBpZiAobWFza3NUb0JvdW5kcyA9PSBt
X21hc2tzVG9Cb3VuZHMpCisgICAgICAgIHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNl
dE1hc2tzVG9Cb3VuZHMobWFza3NUb0JvdW5kcyk7CisKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VY
Q0VQVElPTlMKKyAgICBbbV9sYXllci5nZXQoKSBzZXRNYXNrc1RvQm91bmRzOm1hc2tzVG9Cb3Vu
ZHNdOworICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKworI2lmbmRlZiBOREVCVUcKKyAg
ICB1cGRhdGVEZWJ1Z0luZGljYXRvcnMoKTsKKyNlbmRpZgorfQorCit2b2lkIEdyYXBoaWNzTGF5
ZXJDQTo6c2V0RHJhd3NDb250ZW50KGJvb2wgZHJhd3NDb250ZW50KQoreworICAgIGlmIChkcmF3
c0NvbnRlbnQgIT0gbV9kcmF3c0NvbnRlbnQpIHsKKyAgICAgICAgR3JhcGhpY3NMYXllcjo6c2V0
RHJhd3NDb250ZW50KGRyYXdzQ29udGVudCk7CisKKyAgICAgICAgYm9vbCBuZWVkVGlsZWRMYXll
ciA9IHJlcXVpcmVzVGlsZWRMYXllcihtX3NpemUpOworICAgICAgICBpZiAobmVlZFRpbGVkTGF5
ZXIgIT0gbV91c2luZ1RpbGVkTGF5ZXIpCisgICAgICAgICAgICBzd2FwRnJvbU9yVG9UaWxlZExh
eWVyKG5lZWRUaWxlZExheWVyKTsKKworICAgICAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElP
TlMKKyAgICAgICAgLy8gQ2xvYmJlciBhbnkgZXhpc3RpbmcgY29udGVudC4gSWYgbmVjZXNzYXJ5
LCBDQSB3aWxsIGNyZWF0ZSBiYWNraW5nIHN0b3JlIG9uIHRoZSBuZXh0IGRpc3BsYXkuCisgICAg
ICAgIFttX2xheWVyLmdldCgpIHNldENvbnRlbnRzOm5pbF07CisgICAgICAgIAorI2lmbmRlZiBO
REVCVUcKKyAgICAgICAgdXBkYXRlRGVidWdJbmRpY2F0b3JzKCk7CisjZW5kaWYKKyAgICAgICAg
RU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgIH0KK30KKwordm9pZCBHcmFwaGljc0xheWVy
Q0E6OnNldEJhY2tncm91bmRDb2xvcihjb25zdCBDb2xvciYgY29sb3IsIGNvbnN0IEFuaW1hdGlv
biogdHJhbnNpdGlvbiwgZG91YmxlIGJlZ2luVGltZSkKK3sKKyAgICBHcmFwaGljc0xheWVyOjpz
ZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IsIHRyYW5zaXRpb24sIGJlZ2luVGltZSk7CisKKyAgICBC
RUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICBzZXRIYXNDb250ZW50c0xheWVyKHRydWUp
OworICAgIAorICAgIGlmICh0cmFuc2l0aW9uICYmICF0cmFuc2l0aW9uLT5pc0VtcHR5T3JaZXJv
RHVyYXRpb24oKSkgeworICAgICAgICBDQUxheWVyKiBwcmVzTGF5ZXIgPSBbbV9jb250ZW50c0xh
eWVyLmdldCgpIHByZXNlbnRhdGlvbkxheWVyXTsKKyAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2
ZSBhIHByZXNlbnRhdGlvbkxheWVyLCBqdXN0IHVzZSB0aGUgQ0FMYXllcgorICAgICAgICBpZiAo
IXByZXNMYXllcikKKyAgICAgICAgICAgIHByZXNMYXllciA9IG1fY29udGVudHNMYXllci5nZXQo
KTsKKworICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGJhY2tncm91bmQg
Y29sb3IgZnJvbSB0aGUgbGF5ZXIKKyAgICAgICAgQ0dDb2xvclJlZiBmcm9tQmFja2dyb3VuZENv
bG9yID0gW3ByZXNMYXllciBiYWNrZ3JvdW5kQ29sb3JdOworCisgICAgICAgIENHQ29sb3JSZWYg
YmdDb2xvciA9IGNnQ29sb3IoY29sb3IpOworICAgICAgICBzZXRCYXNpY0FuaW1hdGlvbihBbmlt
YXRlZFByb3BlcnR5QmFja2dyb3VuZENvbG9yLCAiIiwgMCwgZnJvbUJhY2tncm91bmRDb2xvciwg
YmdDb2xvciwgdHJ1ZSwgdHJhbnNpdGlvbiwgYmVnaW5UaW1lKTsKKyAgICAgICAgQ0dDb2xvclJl
bGVhc2UoYmdDb2xvcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVtb3ZlQWxsQW5pbWF0aW9u
c0ZvclByb3BlcnR5KEFuaW1hdGVkUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3IpOyAgICAKKyAgICAg
ICAgc2V0SGFzQ29udGVudHNMYXllcih0cnVlKTsKKyAgICAgICAgc2V0TGF5ZXJCYWNrZ3JvdW5k
Q29sb3IobV9jb250ZW50c0xheWVyLmdldCgpLCBtX2JhY2tncm91bmRDb2xvcik7CisgICAgfQor
CisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJD
QTo6Y2xlYXJCYWNrZ3JvdW5kQ29sb3IoKQoreworICAgIGlmICghbV9jb250ZW50TGF5ZXJGb3JJ
bWFnZU9yVmlkZW8pCisgICAgICAgIHNldEhhc0NvbnRlbnRzTGF5ZXIoZmFsc2UpOworICAgIGVs
c2UKKyAgICAgICAgY2xlYXJMYXllckJhY2tncm91bmRDb2xvcihtX2NvbnRlbnRzTGF5ZXIuZ2V0
KCkpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6c2V0Q29udGVudHNPcGFxdWUoYm9vbCBv
cGFxdWUpCit7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0Q29udGVudHNPcGFxdWUob3BhcXVlKTsK
KworICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgIFttX2xheWVyLmdldCgpIHNl
dE9wYXF1ZTptX2NvbnRlbnRzT3BhcXVlXTsKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05T
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjpzZXRCYWNrZmFjZVZpc2liaWxpdHkoYm9vbCB2
aXNpYmxlKQoreworICAgIGlmIChtX2JhY2tmYWNlVmlzaWJpbGl0eSA9PSB2aXNpYmxlKQorICAg
ICAgICByZXR1cm47CisgICAgCisgICAgR3JhcGhpY3NMYXllcjo6c2V0QmFja2ZhY2VWaXNpYmls
aXR5KHZpc2libGUpOworICAgIAorICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAg
IFttX2xheWVyLmdldCgpIHNldERvdWJsZVNpZGVkOnZpc2libGVdOworICAgIEVORF9CTE9DS19P
QkpDX0VYQ0VQVElPTlMKK30KKworYm9vbCBHcmFwaGljc0xheWVyQ0E6OnNldE9wYWNpdHkoZmxv
YXQgb3BhY2l0eSwgY29uc3QgQW5pbWF0aW9uKiB0cmFuc2l0aW9uLCBkb3VibGUgYmVnaW5UaW1l
KQoreworICAgIGZsb2F0IGNsYW1wZWRPcGFjaXR5ID0gbWF4KDAuMGYsIG1pbihvcGFjaXR5LCAx
LjBmKSk7CisgICAgCisgICAgYm9vbCBvcGFjaXRpZXNEaWZmZXIgPSAobV9vcGFjaXR5ICE9IGNs
YW1wZWRPcGFjaXR5KTsKKyAgICAKKyAgICBHcmFwaGljc0xheWVyOjpzZXRPcGFjaXR5KGNsYW1w
ZWRPcGFjaXR5LCB0cmFuc2l0aW9uLCBiZWdpblRpbWUpOworICAgIAorICAgIGludCBhbmltSW5k
ZXggPSBmaW5kQW5pbWF0aW9uRW50cnkoQW5pbWF0ZWRQcm9wZXJ0eU9wYWNpdHksIDApOworICAg
ICAgICAKKyAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgdHJhbnNpdGlvbiBqdXN0IHNldCB0aGUg
b3BhY2l0eQorICAgIGlmICghdHJhbnNpdGlvbiB8fCB0cmFuc2l0aW9uLT5pc0VtcHR5T3JaZXJv
RHVyYXRpb24oKSkgeworICAgICAgICAvLyBUaHJlZSBjYXNlczoKKyAgICAgICAgLy8gIDEpIG5v
IGV4aXN0aW5nIGFuaW1hdGlvbiBvciB0cmFuc2l0aW9uOiBqdXN0IHNldCBvcGFjaXR5CisgICAg
ICAgIC8vICAyKSBleGlzdGluZyB0cmFuc2l0aW9uOiBjbGVhciBpdCBhbmQgc2V0IG9wYWNpdHkK
KyAgICAgICAgLy8gIDMpIGV4aXN0aW5nIGFuaW1hdGlvbjoganVzdCByZXR1cm4KKyAgICAgICAg
Ly8KKyAgICAgICAgaWYgKGFuaW1JbmRleCA8IDAgfHwgbV9hbmltYXRpb25zW2FuaW1JbmRleF0u
aXNUcmFuc2l0aW9uKCkpIHsKKyAgICAgICAgICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9O
UworICAgICAgICAgICAgW3ByaW1hcnlMYXllcigpIHNldE9wYWNpdHk6b3BhY2l0eV07CisgICAg
ICAgICAgICBpZiAoYW5pbUluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICByZW1vdmVBbGxB
bmltYXRpb25zRm9yUHJvcGVydHkoQW5pbWF0ZWRQcm9wZXJ0eU9wYWNpdHkpOworICAgICAgICAg
ICAgICAgIGFuaW1JbmRleCA9IC0xOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
ICAgICBTdHJpbmcga2V5UGF0aCA9IHByb3BlcnR5SWRUb1N0cmluZyhBbmltYXRlZFByb3BlcnR5
T3BhY2l0eSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gRklYTUU6IHVz
aW5nIGhhcmRjb2RlZCAnMCcgaGVyZS4gV2Ugc2hvdWxkIGJlIGNsZWFyaW5nIGFsbCBhbmltYXRp
b25zLiBGb3Igbm93IHRoZXJlIGlzIG9ubHkgMS4KKyAgICAgICAgICAgICAgICBTdHJpbmcgYW5p
bU5hbWUgPSBrZXlQYXRoICsgIl8wIjsKKyAgICAgICAgICAgICAgICBbYW5pbWF0ZWRMYXllcihB
bmltYXRlZFByb3BlcnR5T3BhY2l0eSkgcmVtb3ZlQW5pbWF0aW9uRm9yS2V5OmFuaW1OYW1lXTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFdlIGhhdmUgYW4gYW5pbWF0aW9uLCBzbyBk
b24ndCBzZXQgdGhlIG9wYWNpdHkgZGlyZWN0bHkuCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBr
bm93IHdlIGhhdmUgYSB0cmFuc2l0aW9uLiBCdXQgaWYgaXQgaXMgdGhlIHNhbWUgYW5kCisgICAg
ICAgIC8vIHRoZSBvcGFjaXR5IHZhbHVlIGhhcyBub3QgY2hhbmdlZCwgZG9uJ3QgZG8gYW55dGhp
bmcuCisgICAgICAgIGlmICghb3BhY2l0aWVzRGlmZmVyICYmCisgICAgICAgICAgICAgICAgKChh
bmltSW5kZXggPT0gLTEpIHx8ICAgIAorICAgICAgICAgICAgICAgICAobV9hbmltYXRpb25zW2Fu
aW1JbmRleF0uaXNUcmFuc2l0aW9uKCkgJiYgKihtX2FuaW1hdGlvbnNbYW5pbUluZGV4XS5hbmlt
YXRpb24oKSkgPT0gKnRyYW5zaXRpb24pKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIElmIGFuIGFuaW1hdGlvbiBpcyBydW5uaW5n
LCBpZ25vcmUgdGhpcyB0cmFuc2l0aW9uLCBidXQgc3RpbGwgc2F2ZSB0aGUgdmFsdWUuCisgICAg
aWYgKGFuaW1JbmRleCA+PSAwICYmICFtX2FuaW1hdGlvbnNbYW5pbUluZGV4XS5pc1RyYW5zaXRp
b24oKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbCBkaWRBbmltYXRlID0gZmFs
c2U7CisgICAgCisgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgCisgICAgTlNO
dW1iZXIqIGZyb21PcGFjaXR5VmFsdWUgPSBuaWw7CisgICAgTlNOdW1iZXIqIHRvT3BhY2l0eVZh
bHVlID0gW05TTnVtYmVyIG51bWJlcldpdGhGbG9hdDpvcGFjaXR5XTsKKyAgICAKKyAgICBpZiAo
dHJhbnNpdGlvbiAmJiAhdHJhbnNpdGlvbi0+aXNFbXB0eU9yWmVyb0R1cmF0aW9uKCkpIHsKKyAg
ICAgICAgQ0FMYXllciogcHJlc0xheWVyID0gZ2V0UHJlc2VudGF0aW9uTGF5ZXIocHJpbWFyeUxh
eWVyKCkpOworICAgICAgICBmbG9hdCBmcm9tT3BhY2l0eSA9IFtwcmVzTGF5ZXIgb3BhY2l0eV07
CisgICAgICAgIGZyb21PcGFjaXR5VmFsdWUgPSBbTlNOdW1iZXIgbnVtYmVyV2l0aEZsb2F0OmZy
b21PcGFjaXR5XTsKKyAgICAgICAgc2V0QmFzaWNBbmltYXRpb24oQW5pbWF0ZWRQcm9wZXJ0eU9w
YWNpdHksICIiLCAwLCBmcm9tT3BhY2l0eVZhbHVlLCB0b09wYWNpdHlWYWx1ZSwgdHJ1ZSwgdHJh
bnNpdGlvbiwgYmVnaW5UaW1lKTsKKyAgICAgICAgZGlkQW5pbWF0ZSA9IHRydWU7CisgICAgfQor
CisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgIAorICAgIHJldHVybiBkaWRBbmlt
YXRlOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6c2V0TmVlZHNEaXNwbGF5KCkKK3sKKyAg
ICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICAKKyAgICBpZiAoZHJhd3NDb250ZW50
KCkpCisgICAgICAgIFttX2xheWVyLmdldCgpIHNldE5lZWRzRGlzcGxheV07CisKKyAgICBFTkRf
QkxPQ0tfT0JKQ19FWENFUFRJT05TCit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjpzZXROZWVk
c0Rpc3BsYXlJblJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIEJFR0lOX0JMT0NL
X09CSkNfRVhDRVBUSU9OUworICAgIAorICAgIGlmIChkcmF3c0NvbnRlbnQoKSkKKyAgICAgICAg
W21fbGF5ZXIuZ2V0KCkgc2V0TmVlZHNEaXNwbGF5SW5SZWN0OnJlY3RdOworCisgICAgRU5EX0JM
T0NLX09CSkNfRVhDRVBUSU9OUworfQorCisKK2Jvb2wgR3JhcGhpY3NMYXllckNBOjphbmltYXRl
VHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybVZhbHVlTGlzdCYgdmFsdWVMaXN0LCBjb25zdCBJbnRT
aXplJiBzaXplLCBjb25zdCBBbmltYXRpb24qIGFuaW0sIGRvdWJsZSBiZWdpblRpbWUsIGJvb2wg
aXNUcmFuc2l0aW9uKQoreworICAgIGlmICghYW5pbSB8fCBhbmltLT5pc0VtcHR5T3JaZXJvRHVy
YXRpb24oKSB8fCB2YWx1ZUxpc3Quc2l6ZSgpIDwgMikKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICAKKyAgICBUcmFuc2Zvcm1WYWx1ZUxpc3Q6OkZ1bmN0aW9uTGlzdCBmdW5jdGlvbkxp
c3Q7CisgICAgYm9vbCBpc1ZhbGlkLCBoYXNCaWdSb3RhdGlvbjsKKyAgICB2YWx1ZUxpc3QubWFr
ZUZ1bmN0aW9uTGlzdChmdW5jdGlvbkxpc3QsIGlzVmFsaWQsIGhhc0JpZ1JvdGF0aW9uKTsKKwor
ICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgIAorICAgIC8vIFJ1bGVzIGZvciBh
bmltYXRpb246CisgICAgLy8KKyAgICAvLyAgMSkgIElmIGZ1bmN0aW9uTGlzdCBpcyBlbXB0eSBv
ciB3ZSBkb24ndCBoYXZlIGEgYmlnIHJvdGF0aW9uLCB3ZSBkbyBhIG1hdHJpeCBhbmltYXRpb24u
IFdlIGNvdWxkCisgICAgLy8gICAgICB1c2UgY29tcG9uZW50IGFuaW1hdGlvbiBmb3IgbGlzdHMg
d2l0aG91dCBhIGJpZyByb3RhdGlvbiwgYnV0IHRoZXJlIGlzIG5vIG5lZWQgdG8sIGFuZCB0aGlz
CisgICAgLy8gICAgICBpcyBtb3JlIGVmZmljaWVudC4KKyAgICAvLworICAgIC8vICAyKSAgT3Ro
ZXJ3aXNlIHdlIGRvIGEgY29tcG9uZW50IGhhcmR3YXJlIGFuaW1hdGlvbi4KKyAgICBib29sIGlz
TWF0cml4QW5pbWF0aW9uID0gIWlzVmFsaWQgfHwgIWhhc0JpZ1JvdGF0aW9uOworICAgICAgICAK
KyAgICAvLyBTZXQgdHJhbnNmb3JtIHRvIGlkZW50aXR5IHNpbmNlIHdlIGFyZSBhbmltYXRpbmcg
Y29tcG9uZW50cyBhbmQgd2UgbmVlZCB0aGUgYmFzZQorICAgIC8vIHRvIGJlIHRoZSBpZGVudGl0
eSB0cmFuc2Zvcm0uCisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggdDsKKyAgICBDQVRyYW5zZm9y
bTNEIHRvVDNEOworICAgIGNvcHlUcmFuc2Zvcm0odG9UM0QsIHQpOworICAgIFtwcmltYXJ5TGF5
ZXIoKSBzZXRUcmFuc2Zvcm06dG9UM0RdOworICAgICAgICAKKyAgICBib29sIGlzS2V5ZnJhbWUg
PSB2YWx1ZUxpc3Quc2l6ZSgpID4gMjsKKyAgICAgICAgCisgICAgLy8gSXRlcmF0ZSB0aHJvdWdo
IHRoZSB0cmFuc2Zvcm0gZnVuY3Rpb25zLCBzZW5kaW5nIGFuIGFuaW1hdGlvbiBmb3IgZWFjaCBv
bmUuCisgICAgZm9yIChpbnQgZnVuY3Rpb25JbmRleCA9IDA7IDsgKytmdW5jdGlvbkluZGV4KSB7
CisgICAgICAgIGlmIChmdW5jdGlvbkluZGV4ID49IHN0YXRpY19jYXN0PGludD4oZnVuY3Rpb25M
aXN0LnNpemUoKSkgJiYgIWlzTWF0cml4QW5pbWF0aW9uKQorICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICAKKyAgICAgICAgVHJhbnNmb3JtT3BlcmF0aW9uOjpPcGVyYXRpb25UeXBlIG9w
VHlwZSA9IAorI2lmIEVOQUJMRSgzRF9UUkFOU0ZPUk1TKQorICAgICAgICAgICAgaXNNYXRyaXhB
bmltYXRpb24gPyBUcmFuc2Zvcm1PcGVyYXRpb246Ok1BVFJJWF8zRCA6IGZ1bmN0aW9uTGlzdFtm
dW5jdGlvbkluZGV4XTsKKyNlbHNlCisgICAgICAgICAgICBpc01hdHJpeEFuaW1hdGlvbiA/IFRy
YW5zZm9ybU9wZXJhdGlvbjo6TUFUUklYIDogZnVuY3Rpb25MaXN0W2Z1bmN0aW9uSW5kZXhdOwor
I2VuZGlmICAgICAgICAKKworICAgICAgICBpZiAoaXNLZXlmcmFtZSkgeworICAgICAgICAgICAg
TlNNdXRhYmxlQXJyYXkqIHRpbWVzQXJyYXkgPSBbW05TTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0
XTsKKyAgICAgICAgICAgIE5TTXV0YWJsZUFycmF5KiB2YWxBcnJheSA9IFtbTlNNdXRhYmxlQXJy
YXkgYWxsb2NdIGluaXRdOworICAgICAgICAgICAgTlNNdXRhYmxlQXJyYXkqIHRmQXJyYXkgPSBb
W05TTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0XTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAg
Ly8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBrZXlmcmFtZXMsIGJ1aWxkaW5nIGFycmF5cyBmb3IgdGhl
IGFuaW1hdGlvbi4KKyAgICAgICAgICAgIGZvciAoVmVjdG9yPFRyYW5zZm9ybVZhbHVlPjo6Y29u
c3RfaXRlcmF0b3IgaXQgPSB2YWx1ZUxpc3QudmFsdWVzKCkuYmVnaW4oKTsgaXQgIT0gdmFsdWVM
aXN0LnZhbHVlcygpLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgY29uc3QgVHJhbnNm
b3JtVmFsdWUmIGN1clZhbHVlID0gKCppdCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAg
ICAgICAgLy8gZmlsbCBpbiB0aGUga2V5IHRpbWUgYW5kIHRpbWluZyBmdW5jdGlvbgorICAgICAg
ICAgICAgICAgIFt0aW1lc0FycmF5IGFkZE9iamVjdDpbTlNOdW1iZXIgbnVtYmVyV2l0aEZsb2F0
OmN1clZhbHVlLmtleSgpXV07CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY29u
c3QgVGltaW5nRnVuY3Rpb24qIHRmID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoY3VyVmFsdWUu
dGltaW5nRnVuY3Rpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgdGYgPSBjdXJWYWx1ZS50aW1p
bmdGdW5jdGlvbigpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFuaW0tPmlzVGltaW5nRnVu
Y3Rpb25TZXQoKSkKKyAgICAgICAgICAgICAgICAgICAgdGYgPSAmYW5pbS0+dGltaW5nRnVuY3Rp
b24oKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBDQU1lZGlhVGltaW5nRnVu
Y3Rpb24qIHRpbWluZ0Z1bmN0aW9uID0gZ2V0Q0FNZWRpYVRpbWluZ0Z1bmN0aW9uKHRmID8gKnRm
IDogVGltaW5nRnVuY3Rpb24oTGluZWFyVGltaW5nRnVuY3Rpb24pKTsKKyAgICAgICAgICAgICAg
ICBbdGZBcnJheSBhZGRPYmplY3Q6dGltaW5nRnVuY3Rpb25dOworICAgICAgICAgICAgICAgIAor
ICAgICAgICAgICAgICAgIC8vIGZpbGwgaW4gdGhlIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAg
aWYgKGlzTWF0cml4QW5pbWF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybWF0
aW9uTWF0cml4IHQ7CisgICAgICAgICAgICAgICAgICAgIGN1clZhbHVlLnZhbHVlKCktPmFwcGx5
KHNpemUsIHQpOworICAgICAgICAgICAgICAgICAgICBDQVRyYW5zZm9ybTNEIGNhdDsKKyAgICAg
ICAgICAgICAgICAgICAgY29weVRyYW5zZm9ybShjYXQsIHQpOworICAgICAgICAgICAgICAgICAg
ICBbdmFsQXJyYXkgYWRkT2JqZWN0OltOU1ZhbHVlIHZhbHVlV2l0aENBVHJhbnNmb3JtM0Q6Y2F0
XV07CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIFt2YWxBcnJh
eSBhZGRPYmplY3Q6Z2V0VHJhbnNmb3JtRnVuY3Rpb25WYWx1ZShjdXJWYWx1ZSwgZnVuY3Rpb25J
bmRleCwgc2l6ZSwgb3BUeXBlKV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAg
ICAgICAgIC8vIFdlIHRvc3MgdGhlIGxhc3QgdGZBcnJheSB2YWx1ZSBiZWNhdXNlIGl0IGhhcyB0
byBvbmUgc2hvcnRlciB0aGFuIHRoZSBvdGhlcnMuCisgICAgICAgICAgICBbdGZBcnJheSByZW1v
dmVMYXN0T2JqZWN0XTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc2V0S2V5ZnJhbWVBbmlt
YXRpb24oQW5pbWF0ZWRQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybSwgZ2V0QW5pbWF0aW9uVmFsdWVG
dW5jdGlvbihvcFR5cGUpLCBmdW5jdGlvbkluZGV4LCB0aW1lc0FycmF5LCB2YWxBcnJheSwgdGZB
cnJheSwgaXNUcmFuc2l0aW9uLCBhbmltLCBiZWdpblRpbWUpOworICAgICAgICAgICAgCisgICAg
ICAgICAgICBbdGltZXNBcnJheSByZWxlYXNlXTsKKyAgICAgICAgICAgIFt2YWxBcnJheSByZWxl
YXNlXTsKKyAgICAgICAgICAgIFt0ZkFycmF5IHJlbGVhc2VdOworICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgLy8gSXMgYSB0cmFuc2l0aW9uCisgICAgICAgICAgICBpZCBmcm9tVmFsdWUs
IHRvVmFsdWU7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChpc01hdHJpeEFuaW1hdGlv
bikgeworICAgICAgICAgICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGZyb210LCB0b3Q7Cisg
ICAgICAgICAgICAgICAgdmFsdWVMaXN0LmF0KDApLnZhbHVlKCktPmFwcGx5KHNpemUsIGZyb210
KTsKKyAgICAgICAgICAgICAgICB2YWx1ZUxpc3QuYXQoMSkudmFsdWUoKS0+YXBwbHkoc2l6ZSwg
dG90KTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBDQVRyYW5zZm9ybTNEIGNh
dDsKKyAgICAgICAgICAgICAgICBjb3B5VHJhbnNmb3JtKGNhdCwgZnJvbXQpOworICAgICAgICAg
ICAgICAgIGZyb21WYWx1ZSA9IFtOU1ZhbHVlIHZhbHVlV2l0aENBVHJhbnNmb3JtM0Q6Y2F0XTsK
KyAgICAgICAgICAgICAgICBjb3B5VHJhbnNmb3JtKGNhdCwgdG90KTsKKyAgICAgICAgICAgICAg
ICB0b1ZhbHVlID0gW05TVmFsdWUgdmFsdWVXaXRoQ0FUcmFuc2Zvcm0zRDpjYXRdOworICAgICAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmcm9tVmFsdWUgPSBnZXRUcmFuc2Zvcm1G
dW5jdGlvblZhbHVlKHZhbHVlTGlzdC5hdCgwKSwgZnVuY3Rpb25JbmRleCwgc2l6ZSwgb3BUeXBl
KTsKKyAgICAgICAgICAgICAgICB0b1ZhbHVlID0gZ2V0VHJhbnNmb3JtRnVuY3Rpb25WYWx1ZSh2
YWx1ZUxpc3QuYXQoMSksIGZ1bmN0aW9uSW5kZXgsIHNpemUsIG9wVHlwZSk7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHNldEJhc2ljQW5pbWF0aW9uKEFuaW1hdGVk
UHJvcGVydHlXZWJraXRUcmFuc2Zvcm0sIGdldEFuaW1hdGlvblZhbHVlRnVuY3Rpb24ob3BUeXBl
KSwgZnVuY3Rpb25JbmRleCwgZnJvbVZhbHVlLCB0b1ZhbHVlLCBpc1RyYW5zaXRpb24sIGFuaW0s
IGJlZ2luVGltZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChpc01hdHJpeEFu
aW1hdGlvbikKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIEVORF9CTE9DS19PQkpD
X0VYQ0VQVElPTlMKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBHcmFwaGljc0xheWVyQ0E6
OmFuaW1hdGVGbG9hdChBbmltYXRlZFByb3BlcnR5SUQgcHJvcGVydHksIGNvbnN0IEZsb2F0VmFs
dWVMaXN0JiB2YWx1ZUxpc3QsIGNvbnN0IEFuaW1hdGlvbiogYW5pbWF0aW9uLCBkb3VibGUgYmVn
aW5UaW1lKQoreworICAgIGlmICh2YWx1ZUxpc3Quc2l6ZSgpIDwgMikKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICAKKyAgICAvLyBpZiB0aGVyZSBpcyBhbHJlYWR5IGlzIGFuIGFuaW1h
dGlvbiBmb3IgdGhpcyBwcm9wZXJ0eSBhbmQgaXQgaGFzbid0IGNoYW5nZWQsIGlnbm9yZSBpdC4K
KyAgICBpbnQgaSA9IGZpbmRBbmltYXRpb25FbnRyeShwcm9wZXJ0eSwgMCk7CisgICAgaWYgKGkg
Pj0gMCAmJiAqbV9hbmltYXRpb25zW2ldLmFuaW1hdGlvbigpID09ICphbmltYXRpb24pIHsKKyAg
ICAgICAgbV9hbmltYXRpb25zW2ldLnNldElzQ3VycmVudCgpOworICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgfQorCisgICAgaWYgKHZhbHVlTGlzdC5zaXplKCkgPT0gMikgeworICAgICAgICBm
bG9hdCBmcm9tVmFsID0gdmFsdWVMaXN0LmF0KDApLnZhbHVlKCk7CisgICAgICAgIGZsb2F0IHRv
VmFsICAgPSB2YWx1ZUxpc3QuYXQoMSkudmFsdWUoKTsKKyAgICAgICAgaWYgKGlzbmFuKHRvVmFs
KSAmJiBpc25hbihmcm9tVmFsKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAg
ICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgcHJvcGVydHkgdG8gMAorICAgICAgICBbYW5pbWF0ZWRM
YXllcihwcm9wZXJ0eSkgc2V0VmFsdWU6MCBmb3JLZXlQYXRoOnByb3BlcnR5SWRUb1N0cmluZyhw
cm9wZXJ0eSldOworICAgICAgICBzZXRCYXNpY0FuaW1hdGlvbihwcm9wZXJ0eSwgIiIsIDAsIGlz
bmFuKGZyb21WYWwpID8gbmlsIDogW05TTnVtYmVyIG51bWJlcldpdGhGbG9hdDpmcm9tVmFsXSwg
aXNuYW4odG9WYWwpID8gbmlsIDogW05TTnVtYmVyIG51bWJlcldpdGhGbG9hdDp0b1ZhbF0sIGZh
bHNlLCBhbmltYXRpb24sIGJlZ2luVGltZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0K
KworICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgIAorICAgIE5TTXV0YWJsZUFy
cmF5KiB0aW1lc0FycmF5ID0gW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdF07CisgICAgTlNN
dXRhYmxlQXJyYXkqIHZhbEFycmF5ID0gW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdF07Cisg
ICAgTlNNdXRhYmxlQXJyYXkqIHRmQXJyYXkgPSBbW05TTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0
XTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB2YWx1ZUxpc3QudmFsdWVzKCkuc2l6
ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgRmxvYXRWYWx1ZSYgY3VyVmFsdWUgPSB2YWx1ZUxp
c3QudmFsdWVzKClbaV07CisgICAgICAgIFt0aW1lc0FycmF5IGFkZE9iamVjdDpbTlNOdW1iZXIg
bnVtYmVyV2l0aEZsb2F0OmN1clZhbHVlLmtleSgpXV07CisgICAgICAgIFt2YWxBcnJheSBhZGRP
YmplY3Q6W05TTnVtYmVyIG51bWJlcldpdGhGbG9hdDpjdXJWYWx1ZS52YWx1ZSgpXV07CisKKyAg
ICAgICAgY29uc3QgVGltaW5nRnVuY3Rpb24qIHRmID0gMDsKKyAgICAgICAgaWYgKGN1clZhbHVl
LnRpbWluZ0Z1bmN0aW9uKCkpCisgICAgICAgICAgICB0ZiA9IGN1clZhbHVlLnRpbWluZ0Z1bmN0
aW9uKCk7CisgICAgICAgIGVsc2UgaWYgKGFuaW1hdGlvbi0+aXNUaW1pbmdGdW5jdGlvblNldCgp
KQorICAgICAgICAgICAgdGYgPSAmYW5pbWF0aW9uLT50aW1pbmdGdW5jdGlvbigpOworCisgICAg
ICAgIENBTWVkaWFUaW1pbmdGdW5jdGlvbiogdGltaW5nRnVuY3Rpb24gPSBnZXRDQU1lZGlhVGlt
aW5nRnVuY3Rpb24odGYgPyAqdGYgOiBUaW1pbmdGdW5jdGlvbigpKTsKKyAgICAgICAgW3RmQXJy
YXkgYWRkT2JqZWN0OnRpbWluZ0Z1bmN0aW9uXTsKKyAgICB9CisgICAgCisgICAgLy8gV2UgdG9z
cyB0aGUgbGFzdCB0ZkFycmF5IHZhbHVlIGJlY2F1c2UgaXQgaGFzIHRvIG9uZSBzaG9ydGVyIHRo
YW4gdGhlIG90aGVycy4KKyAgICBbdGZBcnJheSByZW1vdmVMYXN0T2JqZWN0XTsKKyAgICAKKyAg
ICAvLyBJbml0aWFsaXplIHRoZSBwcm9wZXJ0eSB0byAwLgorICAgIFthbmltYXRlZExheWVyKHBy
b3BlcnR5KSBzZXRWYWx1ZTowIGZvcktleVBhdGg6cHJvcGVydHlJZFRvU3RyaW5nKHByb3BlcnR5
KV07CisgICAgLy8gVGhlbiBzZXQgdGhlIGFuaW1hdGlvbi4KKyAgICBzZXRLZXlmcmFtZUFuaW1h
dGlvbihwcm9wZXJ0eSwgIiIsIDAsIHRpbWVzQXJyYXksIHZhbEFycmF5LCB0ZkFycmF5LCBmYWxz
ZSwgYW5pbWF0aW9uLCBiZWdpblRpbWUpOworCisgICAgW3RpbWVzQXJyYXkgcmVsZWFzZV07Cisg
ICAgW3ZhbEFycmF5IHJlbGVhc2VdOworICAgIFt0ZkFycmF5IHJlbGVhc2VdOworCisgICAgRU5E
X0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEdyYXBo
aWNzTGF5ZXJDQTo6c2V0Q29udGVudHNUb0ltYWdlKEltYWdlKiBpbWFnZSkKK3sKKyAgICBpZiAo
aW1hZ2UpIHsKKyAgICAgICAgc2V0SGFzQ29udGVudHNMYXllcih0cnVlKTsKKworICAgICAgICAv
LyBGSVhNRTogaXMgaW1hZ2UgZmxpcHBpbmcgcmVhbGx5IGEgcHJvcGVydHkgb2YgdGhlIGdyYXBo
aWNzIGNvbnRleHQ/CisgICAgICAgIGJvb2wgbmVlZFRvRmxpcCA9IEdyYXBoaWNzTGF5ZXI6Omdy
YXBoaWNzQ29udGV4dHNGbGlwcGVkKCk7CisgICAgICAgIENHUG9pbnQgYW5jaG9yUG9pbnQgPSBu
ZWVkVG9GbGlwID8gQ0dQb2ludE1ha2UoMC4wZiwgMS4wZikgOiBDR1BvaW50WmVybzsKKworICAg
ICAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICAgICAgeworICAgICAgICAgICAg
Q0dJbWFnZVJlZiB0aGVJbWFnZSA9IGltYWdlLT5uYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgp
OworICAgICAgICAgICAgLy8gRklYTUU6IG1heWJlIG9ubHkgZG8gdHJpbGluZWFyIGlmIHRoZSBp
bWFnZSBpcyBiZWluZyBzY2FsZWQgZG93biwKKyAgICAgICAgICAgIC8vIGJ1dCB0aGVuIHdoYXQg
aWYgdGhlIGxheWVyIHNpemUgY2hhbmdlcz8KKyNpZiAhZGVmaW5lZChCVUlMRElOR19PTl9USUdF
UikgJiYgIWRlZmluZWQoQlVJTERJTkdfT05fTEVPUEFSRCkKKyAgICAgICAgICAgIFttX2NvbnRl
bnRzTGF5ZXIuZ2V0KCkgc2V0TWluaWZpY2F0aW9uRmlsdGVyOmtDQUZpbHRlclRyaWxpbmVhcl07
CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChuZWVkVG9GbGlwKSB7CisgICAgICAgICAgICAgICAg
Q0FUcmFuc2Zvcm0zRCBmbGlwcGVyID0geworICAgICAgICAgICAgICAgICAgICAxLjBmLCAwLjBm
LCAwLjBmLCAwLjBmLAorICAgICAgICAgICAgICAgICAgICAwLjBmLCAtMS4wZiwgMC4wZiwgMC4w
ZiwKKyAgICAgICAgICAgICAgICAgICAgMC4wZiwgMC4wZiwgMS4wZiwgMC4wZiwKKyAgICAgICAg
ICAgICAgICAgICAgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZn07CisgICAgICAgICAgICAgICAgW21f
Y29udGVudHNMYXllci5nZXQoKSBzZXRUcmFuc2Zvcm06ZmxpcHBlcl07CisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIFttX2NvbnRlbnRzTGF5ZXIuZ2V0KCkgc2V0QW5jaG9yUG9pbnQ6YW5j
aG9yUG9pbnRdOworICAgICAgICAgICAgW21fY29udGVudHNMYXllci5nZXQoKSBzZXRDb250ZW50
czooaWQpdGhlSW1hZ2VdOworICAgICAgICB9CisgICAgICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQ
VElPTlMKKyAgICB9IGVsc2UKKyAgICAgICAgc2V0SGFzQ29udGVudHNMYXllcihmYWxzZSk7CisK
KyAgICBtX2NvbnRlbnRMYXllckZvckltYWdlT3JWaWRlbyA9IChpbWFnZSAhPSAwKTsKK30KKwor
dm9pZCBHcmFwaGljc0xheWVyQ0E6OnNldENvbnRlbnRzVG9WaWRlbyhQbGF0Zm9ybUxheWVyKiB2
aWRlb0xheWVyKQoreworICAgIHNldENvbnRlbnRzTGF5ZXIodmlkZW9MYXllcik7CisgICAgbV9j
b250ZW50TGF5ZXJGb3JJbWFnZU9yVmlkZW8gPSAodmlkZW9MYXllciAhPSAwKTsKK30KKwordm9p
ZCBHcmFwaGljc0xheWVyQ0E6OmNsZWFyQ29udGVudHMoKQoreworICAgIGlmIChtX2NvbnRlbnRM
YXllckZvckltYWdlT3JWaWRlbykgeworICAgICAgICBzZXRIYXNDb250ZW50c0xheWVyKGZhbHNl
KTsKKyAgICAgICAgbV9jb250ZW50TGF5ZXJGb3JJbWFnZU9yVmlkZW8gPSBmYWxzZTsKKyAgICB9
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjp1cGRhdGVDb250ZW50c1JlY3QoKQoreworICAg
IGlmIChtX2NsaWVudCAmJiBtX2NvbnRlbnRzTGF5ZXIpIHsKKyAgICAgICAgSW50UmVjdCBjb250
ZW50UmVjdCA9IG1fY2xpZW50LT5jb250ZW50c0JveCh0aGlzKTsKKyAgICAgICAgCisgICAgICAg
IENHUG9pbnQgcG9pbnQgPSBDR1BvaW50TWFrZShjb250ZW50UmVjdC54KCksCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50UmVjdC55KCkpOworICAgICAgICBDR1Jl
Y3QgcmVjdCA9IENHUmVjdE1ha2UoMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIDAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50UmVjdC53
aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFJlY3QuaGVp
Z2h0KCkpOworCisgICAgICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgICAgICBb
bV9jb250ZW50c0xheWVyLmdldCgpIHNldFBvc2l0aW9uOnBvaW50XTsKKyAgICAgICAgW21fY29u
dGVudHNMYXllci5nZXQoKSBzZXRCb3VuZHM6cmVjdF07CisgICAgICAgIEVORF9CTE9DS19PQkpD
X0VYQ0VQVElPTlMKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjpzZXRCYXNpY0Fu
aW1hdGlvbihBbmltYXRlZFByb3BlcnR5SUQgcHJvcGVydHksIGNvbnN0IFN0cmluZyYgdmFsdWVG
dW5jdGlvbiwgc2hvcnQgaW5kZXgsIHZvaWQqIGZyb21WYWwsIHZvaWQqIHRvVmFsLCBib29sIGlz
VHJhbnNpdGlvbiwgY29uc3QgQW5pbWF0aW9uKiB0cmFuc2l0aW9uLCBkb3VibGUgYmVnaW5UaW1l
KQoreworICAgIEFTU0VSVChmcm9tVmFsIHx8IHRvVmFsKTsKKworICAgIFdlYkxheWVyKiBsYXll
ciA9IGFuaW1hdGVkTGF5ZXIocHJvcGVydHkpOworICAgIAorICAgIEJFR0lOX0JMT0NLX09CSkNf
RVhDRVBUSU9OUworCisgICAgLy8gYWRkIGFuIGVudHJ5IGZvciB0aGlzIGFuaW1hdGlvbgorICAg
IGFkZEFuaW1hdGlvbkVudHJ5KHByb3BlcnR5LCBpbmRleCwgaXNUcmFuc2l0aW9uLCB0cmFuc2l0
aW9uKTsKKworICAgIFN0cmluZyBrZXlQYXRoID0gcHJvcGVydHlJZFRvU3RyaW5nKHByb3BlcnR5
KTsKKyAgICBTdHJpbmcgYW5pbU5hbWUgPSBrZXlQYXRoICsgIl8iICsgU3RyaW5nOjpudW1iZXIo
aW5kZXgpOworCisgICAgQ0FCYXNpY0FuaW1hdGlvbiogYmFzaWNBbmltID0gW0NBQmFzaWNBbmlt
YXRpb24gYW5pbWF0aW9uV2l0aEtleVBhdGg6a2V5UGF0aF07CisgICAgCisgICAgZG91YmxlIGR1
cmF0aW9uID0gdHJhbnNpdGlvbi0+ZHVyYXRpb24oKTsKKyAgICBpZiAoZHVyYXRpb24gPD0gMCkK
KyAgICAgICAgZHVyYXRpb24gPSBjQW5pbWF0aW9uQWxtb3N0WmVyb0R1cmF0aW9uOworICAgICAg
ICAKKyAgICBmbG9hdCByZXBlYXRDb3VudCA9IHRyYW5zaXRpb24tPml0ZXJhdGlvbkNvdW50KCk7
CisgICAgaWYgKHJlcGVhdENvdW50IDwgMCkKKyAgICAgICAgcmVwZWF0Q291bnQgPSBGTFRfTUFY
OworICAgIGVsc2UgaWYgKHRyYW5zaXRpb24tPmRpcmVjdGlvbigpKSAgIC8vIElmIHdlIGFsdGVy
bmF0ZSwgdGhlIG51bWJlciBvZiBjeWNsZXMgaXMgaGFsdmVkCisgICAgICAgIHJlcGVhdENvdW50
IC89IDI7CisgICAgICAgIAorICAgIFtiYXNpY0FuaW0gc2V0RHVyYXRpb246ZHVyYXRpb25dOwor
ICAgIFtiYXNpY0FuaW0gc2V0UmVwZWF0Q291bnQ6cmVwZWF0Q291bnRdOworICAgIFtiYXNpY0Fu
aW0gc2V0QXV0b3JldmVyc2VzOnRyYW5zaXRpb24tPmRpcmVjdGlvbigpXTsKKyAgICBbYmFzaWNB
bmltIHNldFJlbW92ZWRPbkNvbXBsZXRpb246Tk9dOworCisgICAgLy8gTm90ZSB0aGF0IGN1cnJl
bnRseSB0cmFuc2Zvcm0gaXMgdGhlIG9ubHkgcHJvcGVydHkgd2hpY2ggaGFzIGFuaW1hdGlvbnMK
KyAgICAvLyB3aXRoIGFuIGluZGV4ID4gMC4KKyAgICBbYmFzaWNBbmltIHNldEFkZGl0aXZlOnBy
b3BlcnR5ID09IEFuaW1hdGVkUHJvcGVydHlXZWJraXRUcmFuc2Zvcm1dOworICAgIFtiYXNpY0Fu
aW0gc2V0RmlsbE1vZGU6QCJleHRlbmRlZCJdOworICAgIFtiYXNpY0FuaW0gc2V0VmFsdWVGdW5j
dGlvbjpbQ0FWYWx1ZUZ1bmN0aW9uIGZ1bmN0aW9uV2l0aE5hbWU6dmFsdWVGdW5jdGlvbl1dOwor
ICAgIAorICAgIC8vIFNldCB0aGUgZGVsZWdhdGUgKGFuZCBwcm9wZXJ0eSB2YWx1ZSkuCisgICAg
aW50IHByb3AgPSBpc1RyYW5zaXRpb24gPyBwcm9wZXJ0eSA6IEFuaW1hdGVkUHJvcGVydHlJbnZh
bGlkOworICAgIFtiYXNpY0FuaW0gc2V0VmFsdWU6W05TTnVtYmVyIG51bWJlcldpdGhJbnQ6cHJv
cF0gZm9yS2V5OldlYkFuaW1hdGlvbkNTU1Byb3BlcnR5S2V5XTsKKyAgICBbYmFzaWNBbmltIHNl
dERlbGVnYXRlOm1fYW5pbWF0aW9uRGVsZWdhdGUuZ2V0KCldOworCisgICAgTlNUaW1lSW50ZXJ2
YWwgYnQgPSBiZWdpblRpbWUgPyBbbGF5ZXIgY29udmVydFRpbWU6Y3VycmVudFRpbWVUb01lZGlh
VGltZShiZWdpblRpbWUpIGZyb21MYXllcjpuaWxdIDogMDsKKyAgICBbYmFzaWNBbmltIHNldEJl
Z2luVGltZTpidF07CisgICAgCisgICAgaWYgKGZyb21WYWwpCisgICAgICAgIFtiYXNpY0FuaW0g
c2V0RnJvbVZhbHVlOnJlaW50ZXJwcmV0X2Nhc3Q8aWQ+KGZyb21WYWwpXTsKKyAgICBpZiAodG9W
YWwpCisgICAgICAgIFtiYXNpY0FuaW0gc2V0VG9WYWx1ZTpyZWludGVycHJldF9jYXN0PGlkPih0
b1ZhbCldOworCisgICAgY29uc3QgVGltaW5nRnVuY3Rpb24qIHRmID0gMDsKKyAgICBpZiAodHJh
bnNpdGlvbi0+aXNUaW1pbmdGdW5jdGlvblNldCgpKQorICAgICAgICB0ZiA9ICZ0cmFuc2l0aW9u
LT50aW1pbmdGdW5jdGlvbigpOworCisgICAgQ0FNZWRpYVRpbWluZ0Z1bmN0aW9uKiB0aW1pbmdG
dW5jdGlvbiA9IGdldENBTWVkaWFUaW1pbmdGdW5jdGlvbih0ZiA/ICp0ZiA6IFRpbWluZ0Z1bmN0
aW9uKCkpOworICAgIFtiYXNpY0FuaW0gc2V0VGltaW5nRnVuY3Rpb246dGltaW5nRnVuY3Rpb25d
OworCisgICAgLy8gU2VuZCBvdmVyIHRoZSBhbmltYXRpb24uCisgICAgW2xheWVyIHJlbW92ZUFu
aW1hdGlvbkZvcktleTphbmltTmFtZV07CisgICAgW2xheWVyIGFkZEFuaW1hdGlvbjpiYXNpY0Fu
aW0gZm9yS2V5OmFuaW1OYW1lXTsKKyAgICAKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05T
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjpzZXRLZXlmcmFtZUFuaW1hdGlvbihBbmltYXRl
ZFByb3BlcnR5SUQgcHJvcGVydHksIGNvbnN0IFN0cmluZyYgdmFsdWVGdW5jdGlvbiwgc2hvcnQg
aW5kZXgsIHZvaWQqIGtleXMsIHZvaWQqIHZhbHVlcywgdm9pZCogdGltaW5nRnVuY3Rpb25zLCAK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNUcmFuc2l0aW9uLCBj
b25zdCBBbmltYXRpb24qIGFuaW0sIGRvdWJsZSBiZWdpblRpbWUpCit7CisgICAgUGxhdGZvcm1M
YXllciogbGF5ZXIgPSBhbmltYXRlZExheWVyKHByb3BlcnR5KTsKKworICAgIC8vIEFkZCBhbiBl
bnRyeSBmb3IgdGhpcyBhbmltYXRpb24gKHdoaWNoIG1heSBjaGFuZ2UgYmVnaW5UaW1lKS4KKyAg
ICBhZGRBbmltYXRpb25FbnRyeShwcm9wZXJ0eSwgaW5kZXgsIGlzVHJhbnNpdGlvbiwgYW5pbSk7
CisKKyAgICBTdHJpbmcga2V5UGF0aCA9IHByb3BlcnR5SWRUb1N0cmluZyhwcm9wZXJ0eSk7Cisg
ICAgU3RyaW5nIGFuaW1OYW1lID0ga2V5UGF0aCArICJfIiArIFN0cmluZzo6bnVtYmVyKGluZGV4
KTsKKworICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworCisgICAgQ0FLZXlmcmFtZUFu
aW1hdGlvbioga2V5ZnJhbWVBbmltID0gW0NBS2V5ZnJhbWVBbmltYXRpb24gYW5pbWF0aW9uV2l0
aEtleVBhdGg6a2V5UGF0aF07CisKKyAgICBkb3VibGUgZHVyYXRpb24gPSBhbmltLT5kdXJhdGlv
bigpOworICAgIGlmIChkdXJhdGlvbiA8PSAwKQorICAgICAgICBkdXJhdGlvbiA9IGNBbmltYXRp
b25BbG1vc3RaZXJvRHVyYXRpb247CisKKyAgICBmbG9hdCByZXBlYXRDb3VudCA9IGFuaW0tPml0
ZXJhdGlvbkNvdW50KCk7CisgICAgaWYgKHJlcGVhdENvdW50IDwgMCkKKyAgICAgICAgcmVwZWF0
Q291bnQgPSBGTFRfTUFYOworICAgIGVsc2UgaWYgKGFuaW0tPmRpcmVjdGlvbigpKQorICAgICAg
ICByZXBlYXRDb3VudCAvPSAyOworCisgICAgW2tleWZyYW1lQW5pbSBzZXREdXJhdGlvbjpkdXJh
dGlvbl07CisgICAgW2tleWZyYW1lQW5pbSBzZXRSZXBlYXRDb3VudDpyZXBlYXRDb3VudF07Cisg
ICAgW2tleWZyYW1lQW5pbSBzZXRBdXRvcmV2ZXJzZXM6YW5pbS0+ZGlyZWN0aW9uKCldOworICAg
IFtrZXlmcmFtZUFuaW0gc2V0UmVtb3ZlZE9uQ29tcGxldGlvbjpOT107CisKKyAgICAvLyBUaGUg
Zmlyc3QgYW5pbWF0aW9uIGlzIG5vbi1hZGRpdGl2ZSwgYWxsIHRoZSByZXN0IGFyZSBhZGRpdGl2
ZS4KKyAgICAvLyBOb3RlIHRoYXQgY3VycmVudGx5IHRyYW5zZm9ybSBpcyB0aGUgb25seSBwcm9w
ZXJ0eSB3aGljaCBoYXMgYW5pbWF0aW9ucworICAgIC8vIHdpdGggYW4gaW5kZXggPiAwCisgICAg
Ly8gRklYTUU6IGFkZGl0aXZlIGFuaW1hdGlvbnMgYXJlIG5vdCBzdXBwcm90ZWQsIHNvIHdoeSB0
aGlzPworICAgIFtrZXlmcmFtZUFuaW0gc2V0QWRkaXRpdmU6KHByb3BlcnR5ID09IEFuaW1hdGVk
UHJvcGVydHlXZWJraXRUcmFuc2Zvcm0pID8gWUVTIDogTk9dOworICAgIFtrZXlmcmFtZUFuaW0g
c2V0RmlsbE1vZGU6QCJleHRlbmRlZCJdOworICAgIFtrZXlmcmFtZUFuaW0gc2V0VmFsdWVGdW5j
dGlvbjpbQ0FWYWx1ZUZ1bmN0aW9uIGZ1bmN0aW9uV2l0aE5hbWU6dmFsdWVGdW5jdGlvbl1dOwor
ICAgIAorICAgIFtrZXlmcmFtZUFuaW0gc2V0S2V5VGltZXM6cmVpbnRlcnByZXRfY2FzdDxpZD4o
a2V5cyldOworICAgIFtrZXlmcmFtZUFuaW0gc2V0VmFsdWVzOnJlaW50ZXJwcmV0X2Nhc3Q8aWQ+
KHZhbHVlcyldOworICAgIAorICAgIC8vIFNldCB0aGUgZGVsZWdhdGUgKGFuZCBwcm9wZXJ0eSB2
YWx1ZSkuCisgICAgaW50IHByb3AgPSBpc1RyYW5zaXRpb24gPyBwcm9wZXJ0eSA6IEFuaW1hdGVk
UHJvcGVydHlJbnZhbGlkOworICAgIFtrZXlmcmFtZUFuaW0gc2V0VmFsdWU6W05TTnVtYmVyIG51
bWJlcldpdGhJbnQ6IHByb3BdIGZvcktleTpXZWJBbmltYXRpb25DU1NQcm9wZXJ0eUtleV07Cisg
ICAgW2tleWZyYW1lQW5pbSBzZXREZWxlZ2F0ZTptX2FuaW1hdGlvbkRlbGVnYXRlLmdldCgpXTsK
KworICAgIE5TVGltZUludGVydmFsIGJ0ID0gYmVnaW5UaW1lID8gW2xheWVyIGNvbnZlcnRUaW1l
OmN1cnJlbnRUaW1lVG9NZWRpYVRpbWUoYmVnaW5UaW1lKSBmcm9tTGF5ZXI6bmlsXSA6IDA7Cisg
ICAgW2tleWZyYW1lQW5pbSBzZXRCZWdpblRpbWU6YnRdOworICAgIAorICAgIC8vIFNldCB0aGUg
dGltaW5nIGZ1bmN0aW9ucywgaWYgYW55LgorICAgIGlmICh0aW1pbmdGdW5jdGlvbnMgIT0gbmls
KQorICAgICAgICBba2V5ZnJhbWVBbmltIHNldFRpbWluZ0Z1bmN0aW9uczooaWQpdGltaW5nRnVu
Y3Rpb25zXTsKKyAgICAgICAgCisgICAgLy8gU2VuZCBvdmVyIHRoZSBhbmltYXRpb24uCisgICAg
W2xheWVyIHJlbW92ZUFuaW1hdGlvbkZvcktleTphbmltTmFtZV07CisgICAgW2xheWVyIGFkZEFu
aW1hdGlvbjprZXlmcmFtZUFuaW0gZm9yS2V5OmFuaW1OYW1lXTsKKyAgICAgICAgCisgICAgRU5E
X0JMT0NLX09CSkNfRVhDRVBUSU9OUworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6c3VzcGVu
ZEFuaW1hdGlvbnMoKQoreworICAgIGRvdWJsZSB0ID0gY3VycmVudFRpbWVUb01lZGlhVGltZShj
dXJyZW50VGltZSgpKTsKKyAgICBbcHJpbWFyeUxheWVyKCkgc2V0U3BlZWQ6MF07CisgICAgW3By
aW1hcnlMYXllcigpIHNldFRpbWVPZmZzZXQ6dF07Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNB
OjpyZXN1bWVBbmltYXRpb25zKCkKK3sKKyAgICBbcHJpbWFyeUxheWVyKCkgc2V0U3BlZWQ6MV07
CisgICAgW3ByaW1hcnlMYXllcigpIHNldFRpbWVPZmZzZXQ6MF07Cit9CisKK3ZvaWQgR3JhcGhp
Y3NMYXllckNBOjpyZW1vdmVBbmltYXRpb24oaW50IGluZGV4LCBib29sIHJlc2V0KQoreworICAg
IEFTU0VSVChpbmRleCA+PSAwKTsKKworICAgIEFuaW1hdGVkUHJvcGVydHlJRCBwcm9wZXJ0eSA9
IG1fYW5pbWF0aW9uc1tpbmRleF0ucHJvcGVydHkoKTsKKyAgICAKKyAgICAvLyBTZXQgdGhlIHZh
bHVlIG9mIHRoZSBwcm9wZXJ0eSBhbmQgcmVtb3ZlIHRoZSBhbmltYXRpb24uCisgICAgU3RyaW5n
IGtleVBhdGggPSBwcm9wZXJ0eUlkVG9TdHJpbmcocHJvcGVydHkpOworICAgIFN0cmluZyBhbmlt
TmFtZSA9IGtleVBhdGggKyAiXyIgKyBTdHJpbmc6Om51bWJlcihtX2FuaW1hdGlvbnNbaW5kZXhd
LmluZGV4KCkpOworICAgIENBTGF5ZXIqIGxheWVyID0gYW5pbWF0ZWRMYXllcihwcm9wZXJ0eSk7
CisKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKworICAgIC8vIElmIHdlIGFyZSBu
b3QgcmVzZXR0aW5nLCBpdCBtZWFucyB3ZSBhcmUgcGF1c2luZy4gU28gd2UgbmVlZCB0byBnZXQg
dGhlIGN1cnJlbnQgcHJlc2VudGF0aW9uCisgICAgLy8gdmFsdWUgaW50byB0aGUgcHJvcGVydHkg
YmVmb3JlIHdlIHJlbW92ZSB0aGUgYW5pbWF0aW9uLgorICAgIGlmICghcmVzZXQpIHsKKyAgICAg
ICAgLy8gUHV0IHRoZSBjdXJyZW50IHZhbHVlIGludG8gdGhlIHByb3BlcnR5LgorICAgICAgICBD
QUxheWVyKiBwcmVzTGF5ZXIgPSBbbGF5ZXIgcHJlc2VudGF0aW9uTGF5ZXJdOworICAgICAgICBp
ZiAocHJlc0xheWVyKQorICAgICAgICAgICAgW2xheWVyIHNldFZhbHVlOltwcmVzTGF5ZXIgdmFs
dWVGb3JLZXlQYXRoOmtleVBhdGhdIGZvcktleVBhdGg6a2V5UGF0aF07CisKKyAgICAgICAgLy8g
TWFrZSBzdXJlIHRoZSBzYXZlZCB2YWx1ZXMgYWNjdXJhdGVseSByZWZsZWN0IHRoZSB2YWx1ZSBp
biB0aGUgbGF5ZXIuCisgICAgICAgIGlkIHZhbCA9IFtsYXllciB2YWx1ZUZvcktleVBhdGg6a2V5
UGF0aF07CisgICAgICAgIHN3aXRjaCAocHJvcGVydHkpIHsKKyAgICAgICAgICAgIGNhc2UgQW5p
bWF0ZWRQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybToKKyAgICAgICAgICAgICAgICAvLyBGSVhNRTog
bmVlZHMgY29tbWVudCBleHBsYWluaW5nIHdoeSB0aGUgbV90cmFuc2Zvcm0gaXMgbm90IG9idGFp
bmVkIGZyb20gdGhlIGxheWVyCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBj
YXNlIEFuaW1hdGVkUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3I6CisgICAgICAgICAgICAgICAgbV9i
YWNrZ3JvdW5kQ29sb3IgPSBDb2xvcihyZWludGVycHJldF9jYXN0PENHQ29sb3JSZWY+KHZhbCkp
OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBbmltYXRlZFByb3Bl
cnR5T3BhY2l0eToKKyAgICAgICAgICAgICAgICBtX29wYWNpdHkgPSBbdmFsIGZsb2F0VmFsdWVd
OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBbmltYXRlZFByb3Bl
cnR5SW52YWxpZDoKKyAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyBJZiB3ZSBo
YXZlIHJlYWNoZWQgdGhlIGVuZCBvZiBhbiBhbmltYXRpb24sIHdlIGRvbid0IHdhbnQgdG8gYWN0
dWFsbHkgcmVtb3ZlIHRoZSAKKyAgICAvLyBhbmltYXRpb24gZnJvbSB0aGUgQ0FMYXllci4gQXQg
c29tZSBwb2ludCB3ZSB3aWxsIGJlIHNldHRpbmcgdGhlIHByb3BlcnR5IHRvIGl0cworICAgIC8v
IHVuYW5pbWF0ZWQgdmFsdWUgYW5kIGF0IHRoYXQgcG9pbnQgd2Ugd2lsbCByZW1vdmUgdGhlIGFu
aW1hdGlvbi4gVGhhdCB3aWxsIGF2b2lkCisgICAgLy8gYW55IGZsYXNoaW5nIGJldHdlZW4gdGhl
IHRpbWUgdGhlIGFuaW1hdGlvbiBpcyByZW1vdmVkIGFuZCB0aGUgcHJvcGVydHkgaXMgc2V0Lgor
ICAgIGlmICghcmVzZXQgfHwgbV9hbmltYXRpb25zW2luZGV4XS5pc1RyYW5zaXRpb24oKSkKKyAg
ICAgICAgW2xheWVyIHJlbW92ZUFuaW1hdGlvbkZvcktleTphbmltTmFtZV07CisKKyAgICBFTkRf
QkxPQ0tfT0JKQ19FWENFUFRJT05TCisKKyAgICAvLyBSZW1vdmUgdGhlIGFuaW1hdGlvbiBlbnRy
eS4KKyAgICBtX2FuaW1hdGlvbnMucmVtb3ZlKGluZGV4KTsKK30KKworUGxhdGZvcm1MYXllciog
R3JhcGhpY3NMYXllckNBOjpob3N0TGF5ZXJGb3JTdWJsYXllcnMoKSBjb25zdAoreworICAgIHJl
dHVybiBtX3RyYW5zZm9ybUxheWVyID8gbV90cmFuc2Zvcm1MYXllci5nZXQoKSA6IG1fbGF5ZXIu
Z2V0KCk7Cit9CisKK1BsYXRmb3JtTGF5ZXIqIEdyYXBoaWNzTGF5ZXJDQTo6bGF5ZXJGb3JTdXBl
cmxheWVyKCkgY29uc3QKK3sKKyAgICBpZiAobV90cmFuc2Zvcm1MYXllcikKKyAgICAgICAgcmV0
dXJuIG1fdHJhbnNmb3JtTGF5ZXIuZ2V0KCk7CisKKyAgICByZXR1cm4gbV9sYXllci5nZXQoKTsK
K30KKworUGxhdGZvcm1MYXllciogR3JhcGhpY3NMYXllckNBOjpwbGF0Zm9ybUxheWVyKCkgY29u
c3QKK3sKKyAgICByZXR1cm4gcHJpbWFyeUxheWVyKCk7Cit9CisKKyNpZm5kZWYgTkRFQlVHCit2
b2lkIEdyYXBoaWNzTGF5ZXJDQTo6c2V0RGVidWdCYWNrZ3JvdW5kQ29sb3IoY29uc3QgQ29sb3Im
IGNvbG9yKQoreworICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgIAorICAgIGlm
IChjb2xvci5pc1ZhbGlkKCkpCisgICAgICAgIHNldExheWVyQmFja2dyb3VuZENvbG9yKG1fbGF5
ZXIuZ2V0KCksIGNvbG9yKTsKKyAgICBlbHNlCisgICAgICAgIGNsZWFyTGF5ZXJCYWNrZ3JvdW5k
Q29sb3IobV9sYXllci5nZXQoKSk7CisgICAgCisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9O
UworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6c2V0RGVidWdCb3JkZXIoY29uc3QgQ29sb3Im
IGNvbG9yLCBmbG9hdCBib3JkZXJXaWR0aCkKK3sKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQ
VElPTlMKKyAgICAKKyAgICBpZiAoY29sb3IuaXNWYWxpZCgpKSB7CisgICAgICAgIHNldExheWVy
Qm9yZGVyQ29sb3IobV9sYXllci5nZXQoKSwgY29sb3IpOworICAgICAgICBbbV9sYXllci5nZXQo
KSBzZXRCb3JkZXJXaWR0aDpib3JkZXJXaWR0aF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2xl
YXJCb3JkZXJDb2xvcihtX2xheWVyLmdldCgpKTsKKyAgICAgICAgW21fbGF5ZXIuZ2V0KCkgc2V0
Qm9yZGVyV2lkdGg6MF07CisgICAgfQorICAgIAorICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElP
TlMKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0E6OnNldFpQb3NpdGlvbihmbG9hdCBwb3NpdGlv
bikKK3sKKyAgICBHcmFwaGljc0xheWVyOjpzZXRaUG9zaXRpb24ocG9zaXRpb24pOworICAgIAor
ICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgIFtwcmltYXJ5TGF5ZXIoKSBzZXRa
UG9zaXRpb246cG9zaXRpb25dOworICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKK30KKyNl
bmRpZgorCitib29sIEdyYXBoaWNzTGF5ZXJDQTo6cmVxdWlyZXNUaWxlZExheWVyKGNvbnN0IEZs
b2F0U2l6ZSYgc2l6ZSkgY29uc3QKK3sKKyAgICBpZiAoIW1fZHJhd3NDb250ZW50KQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBGSVhNRTogY2F0Y2ggemVyby1zaXplIGhlaWdodCBv
ciB3aWR0aCBoZXJlIChvciBlYXJsaWVyKT8KKyAgICByZXR1cm4gc2l6ZS53aWR0aCgpID4gY01h
eFBpeGVsRGltZW5zaW9uIHx8IHNpemUuaGVpZ2h0KCkgPiBjTWF4UGl4ZWxEaW1lbnNpb247Cit9
CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjpzd2FwRnJvbU9yVG9UaWxlZExheWVyKGJvb2wgdXNl
clRpbGVkTGF5ZXIpCit7CisgICAgaWYgKHVzZXJUaWxlZExheWVyID09IG1fdXNpbmdUaWxlZExh
eWVyKQorICAgICAgICByZXR1cm47CisKKyAgICBDR1NpemUgdGlsZVNpemUgPSBDR1NpemVNYWtl
KGNUaWxlZExheWVyVGlsZVNpemUsIGNUaWxlZExheWVyVGlsZVNpemUpOworCisgICAgQkVHSU5f
QkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgCisgICAgUmV0YWluUHRyPENBTGF5ZXI+IG9sZExh
eWVyID0gbV9sYXllci5nZXQoKTsKKyAgICAKKyAgICBDbGFzcyBsYXllckNsYXNzID0gdXNlclRp
bGVkTGF5ZXIgPyBbV2ViVGlsZWRMYXllciBzZWxmXSA6IFtXZWJMYXllciBzZWxmXTsKKyAgICBt
X2xheWVyLmFkb3B0TlMoW1tsYXllckNsYXNzIGFsbG9jXSBpbml0XSk7CisKKyAgICBpZiAodXNl
clRpbGVkTGF5ZXIpIHsKKyAgICAgICAgV2ViVGlsZWRMYXllciogdGlsZWRMYXllciA9IChXZWJU
aWxlZExheWVyKiltX2xheWVyLmdldCgpOworICAgICAgICBbdGlsZWRMYXllciBzZXRUaWxlU2l6
ZTp0aWxlU2l6ZV07CisgICAgICAgIFt0aWxlZExheWVyIHNldExldmVsc09mRGV0YWlsOjFdOwor
ICAgICAgICBbdGlsZWRMYXllciBzZXRMZXZlbHNPZkRldGFpbEJpYXM6MF07CisKKyAgICAgICAg
aWYgKEdyYXBoaWNzTGF5ZXI6OmdyYXBoaWNzQ29udGV4dHNGbGlwcGVkKCkpCisgICAgICAgICAg
ICBbdGlsZWRMYXllciBzZXRDb250ZW50c0dyYXZpdHk6QCJib3R0b21MZWZ0Il07CisgICAgICAg
IGVsc2UKKyAgICAgICAgICAgIFt0aWxlZExheWVyIHNldENvbnRlbnRzR3Jhdml0eTpAInRvcExl
ZnQiXTsKKyAgICB9CisgICAgCisgICAgW21fbGF5ZXIuZ2V0KCkgc2V0TGF5ZXJPd25lcjp0aGlz
XTsKKyAgICBbbV9sYXllci5nZXQoKSBzZXRTdWJsYXllcnM6W29sZExheWVyLmdldCgpIHN1Ymxh
eWVyc11dOworICAgIAorICAgIFtbb2xkTGF5ZXIuZ2V0KCkgc3VwZXJsYXllcl0gcmVwbGFjZVN1
YmxheWVyOm9sZExheWVyLmdldCgpIHdpdGg6bV9sYXllci5nZXQoKV07CisgICAgCisgICAgW21f
bGF5ZXIuZ2V0KCkgc2V0Qm91bmRzOltvbGRMYXllci5nZXQoKSBib3VuZHNdXTsKKyAgICBbbV9s
YXllci5nZXQoKSBzZXRQb3NpdGlvbjpbb2xkTGF5ZXIuZ2V0KCkgcG9zaXRpb25dXTsKKyAgICBb
bV9sYXllci5nZXQoKSBzZXRBbmNob3JQb2ludDpbb2xkTGF5ZXIuZ2V0KCkgYW5jaG9yUG9pbnRd
XTsKKyAgICBbbV9sYXllci5nZXQoKSBzZXRPcGFxdWU6W29sZExheWVyLmdldCgpIGlzT3BhcXVl
XV07CisgICAgW21fbGF5ZXIuZ2V0KCkgc2V0T3BhY2l0eTpbb2xkTGF5ZXIuZ2V0KCkgb3BhY2l0
eV1dOworICAgIFttX2xheWVyLmdldCgpIHNldFRyYW5zZm9ybTpbb2xkTGF5ZXIuZ2V0KCkgdHJh
bnNmb3JtXV07CisgICAgW21fbGF5ZXIuZ2V0KCkgc2V0U3VibGF5ZXJUcmFuc2Zvcm06W29sZExh
eWVyLmdldCgpIHN1YmxheWVyVHJhbnNmb3JtXV07CisgICAgW21fbGF5ZXIuZ2V0KCkgc2V0RG91
YmxlU2lkZWQ6W29sZExheWVyLmdldCgpIGlzRG91YmxlU2lkZWRdXTsKKyNpZm5kZWYgTkRFQlVH
CisgICAgW21fbGF5ZXIuZ2V0KCkgc2V0WlBvc2l0aW9uOltvbGRMYXllci5nZXQoKSB6UG9zaXRp
b25dXTsKKyNlbmRpZgorICAgIAorI2lmbmRlZiBOREVCVUcKKyAgICBTdHJpbmcgbmFtZSA9IFN0
cmluZzo6Zm9ybWF0KCJDQUxheWVyKCVwKSBHcmFwaGljc0xheWVyKCVwKSAiLCBtX2xheWVyLmdl
dCgpLCB0aGlzKSArIG1fbmFtZTsKKyAgICBbbV9sYXllci5nZXQoKSBzZXROYW1lOm5hbWVdOwor
I2VuZGlmCisKKyAgICAvLyBtb3ZlIG92ZXIgYW5pbWF0aW9ucworICAgIG1vdmVBbmltYXRpb24o
QW5pbWF0ZWRQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybSwgb2xkTGF5ZXIuZ2V0KCksIG1fbGF5ZXIu
Z2V0KCkpOworICAgIG1vdmVBbmltYXRpb24oQW5pbWF0ZWRQcm9wZXJ0eU9wYWNpdHksIG9sZExh
eWVyLmdldCgpLCBtX2xheWVyLmdldCgpKTsKKyAgICBtb3ZlQW5pbWF0aW9uKEFuaW1hdGVkUHJv
cGVydHlCYWNrZ3JvdW5kQ29sb3IsIG9sZExheWVyLmdldCgpLCBtX2xheWVyLmdldCgpKTsKKyAg
ICAKKyAgICAvLyBuZWVkIHRvIHRlbGwgbmV3IGxheWVyIHRvIGRyYXcgaXRzZWxmCisgICAgc2V0
TmVlZHNEaXNwbGF5KCk7CisgICAgCisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAg
IAorICAgIG1fdXNpbmdUaWxlZExheWVyID0gdXNlclRpbGVkTGF5ZXI7CisgICAgCisjaWZuZGVm
IE5ERUJVRworICAgIHVwZGF0ZURlYnVnSW5kaWNhdG9ycygpOworI2VuZGlmCit9CisKK3ZvaWQg
R3JhcGhpY3NMYXllckNBOjpzZXRIYXNDb250ZW50c0xheWVyKGJvb2wgaGFzTGF5ZXIpCit7Cisg
ICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisKKyAgICBpZiAoaGFzTGF5ZXIgJiYgIW1f
Y29udGVudHNMYXllcikgeworICAgICAgICAvLyBjcmVhdGUgdGhlIGlubmVyIGxheWVyCisgICAg
ICAgIFdlYkxheWVyKiBjb250ZW50c0xheWVyID0gW1dlYkxheWVyIGxheWVyXTsKKyNpZm5kZWYg
TkRFQlVHCisgICAgICAgIFtjb250ZW50c0xheWVyIHNldE5hbWU6QCJDb250ZW50cyBMYXllciJd
OworI2VuZGlmCisgICAgICAgIHNldENvbnRlbnRzTGF5ZXIoY29udGVudHNMYXllcik7CisKKyAg
ICB9IGVsc2UgaWYgKCFoYXNMYXllciAmJiBtX2NvbnRlbnRzTGF5ZXIpCisgICAgICAgIHNldENv
bnRlbnRzTGF5ZXIoMCk7CisKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCit9CisKK3Zv
aWQgR3JhcGhpY3NMYXllckNBOjpzZXRDb250ZW50c0xheWVyKFdlYkxheWVyKiBjb250ZW50c0xh
eWVyKQoreworICAgIGlmIChjb250ZW50c0xheWVyID09IG1fY29udGVudHNMYXllcikKKyAgICAg
ICAgcmV0dXJuOworCisgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisKKyAgICBpZiAo
bV9jb250ZW50c0xheWVyKSB7CisgICAgICAgIFttX2NvbnRlbnRzTGF5ZXIuZ2V0KCkgcmVtb3Zl
RnJvbVN1cGVybGF5ZXJdOworICAgICAgICBtX2NvbnRlbnRzTGF5ZXIgPSAwOworICAgIH0KKyAg
ICAKKyAgICBpZiAoY29udGVudHNMYXllcikgeworICAgICAgICAvLyBUdXJuIG9mZiBpbXBsaWNp
dCBhbmltYXRpb25zIG9uIHRoZSBpbm5lciBsYXllci4KKyAgICAgICAgW2NvbnRlbnRzTGF5ZXIg
c2V0U3R5bGU6W05TRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aE9iamVjdDpudWxsQWN0aW9uc0Rp
Y3Rpb25hcnkoKSBmb3JLZXk6QCJhY3Rpb25zIl1dOworCisgICAgICAgIG1fY29udGVudHNMYXll
ci5hZG9wdE5TKFtjb250ZW50c0xheWVyIHJldGFpbl0pOworICAgICAgICBbbV9jb250ZW50c0xh
eWVyLmdldCgpIHNldEFuY2hvclBvaW50OkNHUG9pbnRaZXJvXTsKKyAgICAgICAgW21fbGF5ZXIu
Z2V0KCkgYWRkU3VibGF5ZXI6bV9jb250ZW50c0xheWVyLmdldCgpXTsKKworICAgICAgICB1cGRh
dGVDb250ZW50c1JlY3QoKTsKKworICAgICAgICAvLyBTZXQgY29udGVudHMgdG8gbmlsIGlmIHRo
ZSBsYXllciBkb2VzIG5vdCBkcmF3IGl0cyBvd24gY29udGVudC4KKyAgICAgICAgaWYgKG1fY2xp
ZW50ICYmICFkcmF3c0NvbnRlbnQoKSkKKyAgICAgICAgICAgIFttX2xheWVyLmdldCgpIHNldENv
bnRlbnRzOm5pbF07CisKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgIGlmIChzaG93RGVidWdCb3Jk
ZXJzKCkpIHsKKyAgICAgICAgICAgIHNldExheWVyQm9yZGVyQ29sb3IobV9jb250ZW50c0xheWVy
LmdldCgpLCBDb2xvcigwLCAwLCAxMjgsIDE4MCkpOworICAgICAgICAgICAgW21fY29udGVudHNM
YXllci5nZXQoKSBzZXRCb3JkZXJXaWR0aDoxLjBmXTsKKyAgICAgICAgfQorI2VuZGlmCisgICAg
fQorI2lmbmRlZiBOREVCVUcKKyAgICB1cGRhdGVEZWJ1Z0luZGljYXRvcnMoKTsKKyNlbmRpZgor
CisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCisKKworI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>27161</attachid>
            <date>2009-01-29 14:23:40 -0800</date>
            <delta_ts>2009-01-30 12:08:27 -0800</delta_ts>
            <desc>Fixed, final</desc>
            <filename>23356_final.txt</filename>
            <type>text/plain</type>
            <size>122714</size>
            <attacher name="Simon Fraser (smfr)">simon.fraser</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
YmM3NTY5Zi4uMGJlNTVlNSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzNSBAQAorMjAwOS0wMS0yOSAgU2ltb24gRnJhc2Vy
ICA8c2ltb24uZnJhc2VyQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MjMzNTYKKyAgICAgICAgCisgICAgICAgIEFkZCBuZXcgZmlsZXMgcmVsYXRlZCB0byBhY2Nl
bGVyYXRlZCBjb21wb3NpdGluZzoKKyAgICAgICAgCisgICAgICAgICogV2ViQ29yZS54Y29kZXBy
b2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICBBZGQgdGhlIGZpbGVzIHRvIHRoZSBwcm9qZWN0
LiBBbHNvIGFkZCBDb2xvckNHLmNwcCwgZm9yIHRoZQorICAgICAgICBDb2xvcihDR0NvbG9yUmVm
KSBjb25zdHJ1Y3Rvci4KKyAgICAgICAgCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvR3Jh
cGhpY3NMYXllci5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBo
aWNzTGF5ZXIuaDogQWRkZWQuCisgICAgICAgIEdyYXBoaWNzTGF5ZXIgaXMgYSBwbGF0Zm9ybSBh
YnN0cmFjdGlvbiBmb3IgYSBoYXJkd2FyZS1iYWNrZWQKKyAgICAgICAgbGF5ZXIuCisgICAgICAg
IAorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXJDbGllbnQuaDogQWRk
ZWQuCisgICAgICAgIENsaWVudCBvZiBHcmFwaGljc0xheWVyLCBhbGxvd2luZyBHcmFwaGljc0xh
eWVyIHRvIGNhbGwgb3V0CisgICAgICAgIHRvIFdlYkNvcmUgY29kZS4KKyAgICAgICAgCisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzTGF5ZXJDQS5oOiBBZGRlZC4KKyAg
ICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NMYXllckNBLm1tOiBBZGRlZC4K
KyAgICAgICAgTWFjIENvcmUgQW5pbWF0aW9uIGltcGxlbWVudGF0aW9uIG9mIEdyYXBoaWNzTGF5
ZXIuCisgICAgICAgIAorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9XZWJMYXllci5o
OiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMvV2ViTGF5ZXIubW06IEFk
ZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9XZWJUaWxlZExheWVyLmg6IEFk
ZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9XZWJUaWxlZExheWVyLm1tOiBB
ZGRlZC4KKyAgICAgICAgU3ViY2xhc3NlcyBvZiBDQUxheWVyIGFuZCBDQVRpbGVkTGF5ZXIgLS0g
aGVscGVycyBmb3IgdGhlCisgICAgICAgIEdyYXBoaWNzTGF5ZXJDQSBpbXBsZW1lbnRhdGlvbi4K
KwogMjAwOS0wMS0yOSAgRGF2aWQgSHlhdHQgIDxoeWF0dEBhcHBsZS5jb20+CiAKICAgICAgICAg
TW92ZSBSZW5kZXJGbG93OjpkZXN0cm95IGRvd24gaW50byBSZW5kZXJCbG9jayBhbmQgUmVuZGVy
SW5saW5lLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBi
eHByb2ogYi9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagppbmRleCAx
OThlZTBlLi5lOTY3NjA0IDEwMDY0NAotLS0gYS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3By
b2plY3QucGJ4cHJvagorKysgYi9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4
cHJvagpAQCAtMTQyLDkgKzE0MiwxOSBAQAogCQkwQkUwMzBBMjBGMzExMkZCMDAzQzFBNDYgLyog
UmVuZGVyTGluZUJveExpc3QuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IDBCRTAzMEExMEYzMTEyRkIwMDNDMUE0NiAvKiBSZW5kZXJMaW5lQm94TGlzdC5o
ICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTBGNTYw
MjhGMEU0Qjc2NTgwMDY1QjAzOCAvKiBSZW5kZXJNYXJxdWVlLmggaW4gSGVhZGVycyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRjU2MDI4RDBFNEI3NjU4MDA2NUIwMzggLyog
UmVuZGVyTWFycXVlZS5oICovOyB9OwogCQkwRjU2MDI5MDBFNEI3NjU4MDA2NUIwMzggLyogUmVu
ZGVyTWFycXVlZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSAwRjU2MDI4RTBFNEI3NjU4MDA2NUIwMzggLyogUmVuZGVyTWFycXVlZS5jcHAgKi87IH07
CisJCTBGNTgwQjA1MEYxMkEyNTUwMDUxRDY4OSAvKiBHcmFwaGljc0xheWVyQ0EubW0gaW4gU291
cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRjU4MEIwMzBGMTJBMjU0
MDA1MUQ2ODkgLyogR3JhcGhpY3NMYXllckNBLm1tICovOyB9OworCQkwRjU4MEIwNjBGMTJBMjU1
MDA1MUQ2ODkgLyogR3JhcGhpY3NMYXllckNBLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSAwRjU4MEIwNDBGMTJBMjU1MDA1MUQ2ODkgLyogR3JhcGhpY3NM
YXllckNBLmggKi87IH07CisJCTBGNTgwQjBDMEYxMkEyNjkwMDUxRDY4OSAvKiBHcmFwaGljc0xh
eWVyLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBG
NTgwQjA5MEYxMkEyNjkwMDUxRDY4OSAvKiBHcmFwaGljc0xheWVyLmNwcCAqLzsgfTsKKwkJMEY1
ODBCMEQwRjEyQTI2OTAwNTFENjg5IC8qIEdyYXBoaWNzTGF5ZXIuaCBpbiBIZWFkZXJzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGNTgwQjBBMEYxMkEyNjkwMDUxRDY4OSAv
KiBHcmFwaGljc0xheWVyLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwg
KTsgfTsgfTsKKwkJMEY1ODBCMEUwRjEyQTI2OTAwNTFENjg5IC8qIEdyYXBoaWNzTGF5ZXJDbGll
bnQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGNTgw
QjBCMEYxMkEyNjkwMDUxRDY4OSAvKiBHcmFwaGljc0xheWVyQ2xpZW50LmggKi87IHNldHRpbmdz
ID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJMEY2RUNENDUwRjI1MkYzNzAw
QkRFMjcxIC8qIENTU1Byb3BlcnR5TG9uZ2hhbmQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGNkVDRDQzMEYyNTJGMzcwMEJERTI3MSAvKiBDU1NQcm9w
ZXJ0eUxvbmdoYW5kLmggKi87IH07CiAJCTBGNkVDRDQ2MEYyNTJGMzcwMEJERTI3MSAvKiBDU1NQ
cm9wZXJ0eUxvbmdoYW5kLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IDBGNkVDRDQ0MEYyNTJGMzcwMEJERTI3MSAvKiBDU1NQcm9wZXJ0eUxvbmdoYW5k
LmNwcCAqLzsgfTsKIAkJMEZDNzA1MjEwRUIxODE1NjAwQjkwQUQ4IC8qIEF0b21pY1N0cmluZ0hh
c2guaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGQzcw
NTIwMEVCMTgxNTYwMEI5MEFEOCAvKiBBdG9taWNTdHJpbmdIYXNoLmggKi87IHNldHRpbmdzID0g
e0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKKwkJMEZDRjMzMjQwRjJCOTcxNTAwNEI2
Nzk1IC8qIENvbG9yQ0cuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gMEZDRjMzMjMwRjJCOTcxNTAwNEI2Nzk1IC8qIENvbG9yQ0cuY3BwICovOyB9Owor
CQkwRkNGMzMyQzBGMkI5QTI1MDA0QjY3OTUgLyogV2ViVGlsZWRMYXllci5tbSBpbiBTb3VyY2Vz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGQ0YzMzI4MEYyQjlBMjUwMDRC
Njc5NSAvKiBXZWJUaWxlZExheWVyLm1tICovOyB9OworCQkwRkNGMzMyRDBGMkI5QTI1MDA0QjY3
OTUgLyogV2ViVGlsZWRMYXllci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gMEZDRjMzMjkwRjJCOUEyNTAwNEI2Nzk1IC8qIFdlYlRpbGVkTGF5ZXIuaCAq
LzsgfTsKKwkJMEZDRjMzMkUwRjJCOUEyNTAwNEI2Nzk1IC8qIFdlYkxheWVyLm1tIGluIFNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEZDRjMzMkEwRjJCOUEyNTAw
NEI2Nzk1IC8qIFdlYkxheWVyLm1tICovOyB9OworCQkwRkNGMzMyRjBGMkI5QTI1MDA0QjY3OTUg
LyogV2ViTGF5ZXIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IDBGQ0YzMzJCMEYyQjlBMjUwMDRCNjc5NSAvKiBXZWJMYXllci5oICovOyB9OwogCQkwRkQ3
MjM4MjBFQzhCRDkzMDBDQTVERDcgLyogRmxvYXRRdWFkLmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkQ3MjM4MDBFQzhCRDkzMDBDQTVERDcgLyogRmxv
YXRRdWFkLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsK
IAkJMEZENzIzODMwRUM4QkQ5MzAwQ0E1REQ3IC8qIEZsb2F0UXVhZC5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRkQ3MjM4MTBFQzhCRDkzMDBDQTVE
RDcgLyogRmxvYXRRdWFkLmNwcCAqLzsgfTsKIAkJMTQwMjY0NUUwQUZEQzE5QjAwNTkxOUUyIC8q
IExvZ2dpbmdNYWMubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSAxNDAyNjQ1RDBBRkRDMTlCMDA1OTE5RTIgLyogTG9nZ2luZ01hYy5tbSAqLzsgfTsKQEAg
LTQ5ODcsOSArNDk5NywxOSBAQAogCQkwQkUwMzBBMTBGMzExMkZCMDAzQzFBNDYgLyogUmVuZGVy
TGluZUJveExpc3QuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUmVuZGVyTGlu
ZUJveExpc3QuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEY1NjAyOEQwRTRCNzY1
ODAwNjVCMDM4IC8qIFJlbmRlck1hcnF1ZWUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBw
YXRoID0gUmVuZGVyTWFycXVlZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkwRjU2
MDI4RTBFNEI3NjU4MDA2NUIwMzggLyogUmVuZGVyTWFycXVlZS5jcHAgKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBSZW5kZXJNYXJxdWVlLmNwcDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKKwkJMEY1ODBCMDMwRjEyQTI1NDAwNTFENjg5IC8qIEdyYXBoaWNzTGF5ZXJD
QS5tbSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNwcDsgcGF0aCA9IEdyYXBoaWNzTGF5
ZXJDQS5tbTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMEY1ODBCMDQwRjEyQTI1NTAw
NTFENjg5IC8qIEdyYXBoaWNzTGF5ZXJDQS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBh
dGggPSBHcmFwaGljc0xheWVyQ0EuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMEY1
ODBCMDkwRjEyQTI2OTAwNTFENjg5IC8qIEdyYXBoaWNzTGF5ZXIuY3BwICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gR3JhcGhpY3NMYXllci5jcHA7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CisJCTBGNTgwQjBBMEYxMkEyNjkwMDUxRDY4OSAvKiBHcmFwaGljc0xheWVy
LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEdyYXBoaWNzTGF5ZXIuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMEY1ODBCMEIwRjEyQTI2OTAwNTFENjg5IC8qIEdy
YXBoaWNzTGF5ZXJDbGllbnQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gR3Jh
cGhpY3NMYXllckNsaWVudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkwRjZFQ0Q0
MzBGMjUyRjM3MDBCREUyNzEgLyogQ1NTUHJvcGVydHlMb25naGFuZC5oICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IHBhdGggPSBDU1NQcm9wZXJ0eUxvbmdoYW5kLmg7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CiAJCTBGNkVDRDQ0MEYyNTJGMzcwMEJERTI3MSAvKiBDU1NQcm9wZXJ0eUxv
bmdoYW5kLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IENTU1Byb3Bl
cnR5TG9uZ2hhbmQuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkwRkM3MDUyMDBF
QjE4MTU2MDBCOTBBRDggLyogQXRvbWljU3RyaW5nSGFzaC5oICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jLmg7IHBhdGggPSBBdG9taWNTdHJpbmdIYXNoLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CisJCTBGQ0YzMzIzMEYyQjk3MTUwMDRCNjc5NSAvKiBDb2xvckNHLmNwcCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IENvbG9yQ0cuY3BwOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OworCQkwRkNGMzMyODBGMkI5QTI1MDA0QjY3OTUgLyogV2ViVGlsZWRMYXllci5t
bSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25v
d25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNwcDsgcGF0aCA9IFdlYlRpbGVkTGF5ZXIu
bW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTBGQ0YzMzI5MEYyQjlBMjUwMDRCNjc5
NSAvKiBXZWJUaWxlZExheWVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFdl
YlRpbGVkTGF5ZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMEZDRjMzMkEwRjJC
OUEyNTAwNEI2Nzk1IC8qIFdlYkxheWVyLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2Jq
Y3BwOyBwYXRoID0gV2ViTGF5ZXIubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTBG
Q0YzMzJCMEYyQjlBMjUwMDRCNjc5NSAvKiBXZWJMYXllci5oICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jLmg7IHBhdGggPSBXZWJMYXllci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkw
RkQ3MjM4MDBFQzhCRDkzMDBDQTVERDcgLyogRmxvYXRRdWFkLmggKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmMuaDsgcGF0aCA9IEZsb2F0UXVhZC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owog
CQkwRkQ3MjM4MTBFQzhCRDkzMDBDQTVERDcgLyogRmxvYXRRdWFkLmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEZsb2F0UXVhZC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CiAJCTE0MDI2NDVEMEFGREMxOUIwMDU5MTlFMiAvKiBMb2dnaW5nTWFjLm1tICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNwcDsgcGF0aCA9IExvZ2dpbmdNYWMubW07IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0xMjkzMyw2ICsxMjk1Myw3IEBACiAJCUIyNzUz
NTI5MEIwNTM4MTQwMDJDRTY0RiAvKiBjZyAqLyA9IHsKIAkJCWlzYSA9IFBCWEdyb3VwOwogCQkJ
Y2hpbGRyZW4gPSAoCisJCQkJMEZDRjMzMjMwRjJCOTcxNTAwNEI2Nzk1IC8qIENvbG9yQ0cuY3Bw
ICovLAogCQkJCUIyNzUzNTJCMEIwNTM4MTQwMDJDRTY0RiAvKiBGbG9hdFBvaW50Q0cuY3BwICov
LAogCQkJCUIyNzUzNTJDMEIwNTM4MTQwMDJDRTY0RiAvKiBGbG9hdFJlY3RDRy5jcHAgKi8sCiAJ
CQkJQjI3NTM1MkQwQjA1MzgxNDAwMkNFNjRGIC8qIEZsb2F0U2l6ZUNHLmNwcCAqLywKQEAgLTEy
OTc2LDYgKzEyOTk3LDggQEAKIAkJCQlCMkFGRkM3QTBEMDBBNUMxMDAzMDA3NEQgLyogRm9udFBs
YXRmb3JtRGF0YU1hYy5tbSAqLywKIAkJCQlCMkFGRkM3QjBEMDBBNUMxMDAzMDA3NEQgLyogR2x5
cGhQYWdlVHJlZU5vZGVNYWMuY3BwICovLAogCQkJCUIyNzdCNDAzMEIyMkYzN0MwMDA0QkVDNiAv
KiBHcmFwaGljc0NvbnRleHRNYWMubW0gKi8sCisJCQkJMEY1ODBCMDQwRjEyQTI1NTAwNTFENjg5
IC8qIEdyYXBoaWNzTGF5ZXJDQS5oICovLAorCQkJCTBGNTgwQjAzMEYxMkEyNTQwMDUxRDY4OSAv
KiBHcmFwaGljc0xheWVyQ0EubW0gKi8sCiAJCQkJQjI3NTM1OEQwQjA1M0E2NjAwMkNFNjRGIC8q
IEljb25NYWMubW0gKi8sCiAJCQkJQjI3NTM1NEUwQjA1MzgxNDAwMkNFNjRGIC8qIEltYWdlTWFj
Lm1tICovLAogCQkJCUIyNzUzNTRGMEIwNTM4MTQwMDJDRTY0RiAvKiBJbnRQb2ludE1hYy5tbSAq
LywKQEAgLTEyOTg0LDYgKzEzMDA3LDEwIEBACiAJCQkJRTRCNDFFMTAwQ0JGOTBFRjAwQUYyRUNF
IC8qIE1lZGlhUGxheWVyUHJpdmF0ZVFUS2l0LmggKi8sCiAJCQkJRTRCNDFFMTEwQ0JGOTBFRjAw
QUYyRUNFIC8qIE1lZGlhUGxheWVyUHJpdmF0ZVFUS2l0Lm1tICovLAogCQkJCUIyQUZGQzc3MEQw
MEE1QzEwMDMwMDc0RCAvKiBTaW1wbGVGb250RGF0YU1hYy5tbSAqLywKKwkJCQkwRkNGMzMyQjBG
MkI5QTI1MDA0QjY3OTUgLyogV2ViTGF5ZXIuaCAqLywKKwkJCQkwRkNGMzMyQTBGMkI5QTI1MDA0
QjY3OTUgLyogV2ViTGF5ZXIubW0gKi8sCisJCQkJMEZDRjMzMjkwRjJCOUEyNTAwNEI2Nzk1IC8q
IFdlYlRpbGVkTGF5ZXIuaCAqLywKKwkJCQkwRkNGMzMyODBGMkI5QTI1MDA0QjY3OTUgLyogV2Vi
VGlsZWRMYXllci5tbSAqLywKIAkJCSk7CiAJCQlwYXRoID0gbWFjOwogCQkJc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsKQEAgLTEzMDM5LDYgKzEzMDY2LDkgQEAKIAkJCQlCMkEwMTU5MjBBRjZDRDUz
MDA2QkNFMEUgLyogR3JhcGhpY3NDb250ZXh0LmNwcCAqLywKIAkJCQlCMkEwMTU5MzBBRjZDRDUz
MDA2QkNFMEUgLyogR3JhcGhpY3NDb250ZXh0LmggKi8sCiAJCQkJQTg4RkUzMzMwRTVFRUU4NzAw
OEQ4QzBGIC8qIEdyYXBoaWNzQ29udGV4dFByaXZhdGUuaCAqLywKKwkJCQkwRjU4MEIwOTBGMTJB
MjY5MDA1MUQ2ODkgLyogR3JhcGhpY3NMYXllci5jcHAgKi8sCisJCQkJMEY1ODBCMEEwRjEyQTI2
OTAwNTFENjg5IC8qIEdyYXBoaWNzTGF5ZXIuaCAqLywKKwkJCQkwRjU4MEIwQjBGMTJBMjY5MDA1
MUQ2ODkgLyogR3JhcGhpY3NMYXllckNsaWVudC5oICovLAogCQkJCUIyQTAxNTk0MEFGNkNENTMw
MDZCQ0UwRSAvKiBHcmFwaGljc1R5cGVzLmNwcCAqLywKIAkJCQlCMkEwMTU5NTBBRjZDRDUzMDA2
QkNFMEUgLyogR3JhcGhpY3NUeXBlcy5oICovLAogCQkJCUIyNzUzNTQwMEIwNTM4MTQwMDJDRTY0
RiAvKiBJY29uLmggKi8sCkBAIC0xNTQ3Myw2ICsxNTUwMyw5IEBACiAJCQkJQjJBMDE1QTkwQUY2
Q0Q1MzAwNkJDRTBFIC8qIEdyYXBoaWNzQ29udGV4dC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQTgw
RDY3MDgwRTlFOURFQjAwRTQyMEYwIC8qIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZUNH
LmggaW4gSGVhZGVycyAqLywKIAkJCQlBODhGRTMzNDBFNUVFRTg3MDA4RDhDMEYgLyogR3JhcGhp
Y3NDb250ZXh0UHJpdmF0ZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMEY1ODBCMEQwRjEyQTI2OTAw
NTFENjg5IC8qIEdyYXBoaWNzTGF5ZXIuaCBpbiBIZWFkZXJzICovLAorCQkJCTBGNTgwQjA2MEYx
MkEyNTUwMDUxRDY4OSAvKiBHcmFwaGljc0xheWVyQ0EuaCBpbiBIZWFkZXJzICovLAorCQkJCTBG
NTgwQjBFMEYxMkEyNjkwMDUxRDY4OSAvKiBHcmFwaGljc0xheWVyQ2xpZW50LmggaW4gSGVhZGVy
cyAqLywKIAkJCQlCMkEwMTVBQjBBRjZDRDUzMDA2QkNFMEUgLyogR3JhcGhpY3NUeXBlcy5oIGlu
IEhlYWRlcnMgKi8sCiAJCQkJQThDRkY3QUIwQTE1Njk3ODAwMEE0MjM0IC8qIEhUTUxBbmNob3JF
bGVtZW50LmggaW4gSGVhZGVycyAqLywKIAkJCQlBODcxRDQ1RDBBMTI3Q0JDMDBCMTJBNjggLyog
SFRNTEFwcGxldEVsZW1lbnQuaCBpbiBIZWFkZXJzICovLApAQCAtMTY1ODAsOSArMTY2MTMsMTEg
QEAKIAkJCQk0OTgzOTE1OTBGMUU3NzY5MDBDMjM3ODIgLyogV2ViS2l0Q1NTTWF0cml4LmggaW4g
SGVhZGVycyAqLywKIAkJCQlCQzlBREQyMzBDQzQwMzI2MDAwOThDNEMgLyogV2ViS2l0Q1NTVHJh
bnNmb3JtVmFsdWUuaCBpbiBIZWFkZXJzICovLAogCQkJCTMxQzBGRjI1MEU0Q0VCNkUwMDdENkZF
NSAvKiBXZWJLaXRUcmFuc2l0aW9uRXZlbnQuaCBpbiBIZWFkZXJzICovLAorCQkJCTBGQ0YzMzJG
MEYyQjlBMjUwMDRCNjc5NSAvKiBXZWJMYXllci5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMUNBRjM0
ODEwQTZDNDA1MjAwQUJFMDZFIC8qIFdlYlNjcmlwdE9iamVjdC5oIGluIEhlYWRlcnMgKi8sCiAJ
CQkJMUE1NjlEMUIwRDdFMkI4MjAwN0MzOTgzIC8qIFdlYlNjcmlwdE9iamVjdC5oIGluIEhlYWRl
cnMgKi8sCiAJCQkJMUNBRjM0ODMwQTZDNDA1MjAwQUJFMDZFIC8qIFdlYlNjcmlwdE9iamVjdFBy
aXZhdGUuaCBpbiBIZWFkZXJzICovLAorCQkJCTBGQ0YzMzJEMEYyQjlBMjUwMDRCNjc5NSAvKiBX
ZWJUaWxlZExheWVyLmggaW4gSGVhZGVycyAqLywKIAkJCQk4NTAzMUI1MTBBNDRFRkM3MDBGOTky
RTAgLyogV2hlZWxFdmVudC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTM4MEY0NzQwOUExMUFCNDAw
MUZEQjM0IC8qIFdpZGdldC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTM5QjAyRUYwRUEyREJDNDAw
QzU0NTcwIC8qIFdpZHRoSXRlcmF0b3IuaCBpbiBIZWFkZXJzICovLApAQCAtMTcwNDYsNiArMTcw
ODEsNyBAQAogCQkJCTg1MDMxQjNGMEE0NEVGQzcwMEY5OTJFMCAvKiBDbGlwYm9hcmRFdmVudC5j
cHAgaW4gU291cmNlcyAqLywKIAkJCQk5M0YxOUFGRjA4MjQ1RTU5MDAxRTlBQkMgLyogQ2xpcGJv
YXJkTWFjLm1tIGluIFNvdXJjZXMgKi8sCiAJCQkJQjI3NTM1NjYwQjA1MzgxNDAwMkNFNjRGIC8q
IENvbG9yLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTBGQ0YzMzI0MEYyQjk3MTUwMDRCNjc5NSAv
KiBDb2xvckNHLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUIyMjI3OTYyMEQwMEJGMjIwMDcxQjc4
MiAvKiBDb2xvckRpc3RhbmNlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUIyNzUzNTc3MEIwNTM4
MTQwMDJDRTY0RiAvKiBDb2xvck1hYy5tbSBpbiBTb3VyY2VzICovLAogCQkJCTY1NTBCNkExMDk5
REYwMjcwMDkwRDc4MSAvKiBDb21tZW50LmNwcCBpbiBTb3VyY2VzICovLApAQCAtMTc0NTIsNiAr
MTc0ODgsOCBAQAogCQkJCUIyQTAxNUE4MEFGNkNENTMwMDZCQ0UwRSAvKiBHcmFwaGljc0NvbnRl
eHQuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQjJFRDk3NzEwQjFGNTVDRTAwMjU3RDBGIC8qIEdy
YXBoaWNzQ29udGV4dENHLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUIyNzdCNDA0MEIyMkYzN0Mw
MDA0QkVDNiAvKiBHcmFwaGljc0NvbnRleHRNYWMubW0gaW4gU291cmNlcyAqLywKKwkJCQkwRjU4
MEIwQzBGMTJBMjY5MDA1MUQ2ODkgLyogR3JhcGhpY3NMYXllci5jcHAgaW4gU291cmNlcyAqLywK
KwkJCQkwRjU4MEIwNTBGMTJBMjU1MDA1MUQ2ODkgLyogR3JhcGhpY3NMYXllckNBLm1tIGluIFNv
dXJjZXMgKi8sCiAJCQkJQjJBMDE1QUEwQUY2Q0Q1MzAwNkJDRTBFIC8qIEdyYXBoaWNzVHlwZXMu
Y3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQThDRkY3QTQwQTE1Njk3ODAwMEE0MjM0IC8qIEhUTUxB
bmNob3JFbGVtZW50LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUE4NzFENDVFMEExMjdDQkMwMEIx
MkE2OCAvKiBIVE1MQXBwbGV0RWxlbWVudC5jcHAgaW4gU291cmNlcyAqLywKQEAgLTE4NTYyLDcg
KzE4NjAwLDkgQEAKIAkJCQk0OTgzOTE1ODBGMUU3NzY5MDBDMjM3ODIgLyogV2ViS2l0Q1NTTWF0
cml4LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUJDOUFERDgwMENDNDA5MjIwMDA5OEM0QyAvKiBX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkzMUMwRkYyNDBF
NENFQjZFMDA3RDZGRTUgLyogV2ViS2l0VHJhbnNpdGlvbkV2ZW50LmNwcCBpbiBTb3VyY2VzICov
LAorCQkJCTBGQ0YzMzJFMEYyQjlBMjUwMDRCNjc5NSAvKiBXZWJMYXllci5tbSBpbiBTb3VyY2Vz
ICovLAogCQkJCTFDQUYzNDgyMEE2QzQwNTIwMEFCRTA2RSAvKiBXZWJTY3JpcHRPYmplY3QubW0g
aW4gU291cmNlcyAqLywKKwkJCQkwRkNGMzMyQzBGMkI5QTI1MDA0QjY3OTUgLyogV2ViVGlsZWRM
YXllci5tbSBpbiBTb3VyY2VzICovLAogCQkJCTg1MDMxQjUwMEE0NEVGQzcwMEY5OTJFMCAvKiBX
aGVlbEV2ZW50LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTkzNUM0NzczMDlBQzRENzcwMEE2QUFC
NCAvKiBXaGVlbEV2ZW50TWFjLm1tIGluIFNvdXJjZXMgKi8sCiAJCQkJOTM4MEY0NzMwOUExMUFC
NDAwMUZEQjM0IC8qIFdpZGdldC5jcHAgaW4gU291cmNlcyAqLywKZGlmZiAtLWdpdCBhL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllci5jcHAgYi9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAuLjNmZGE0MzkKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL0dyYXBoaWNzTGF5ZXIuY3BwCkBAIC0wLDAgKzEsNTQwIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJHcmFw
aGljc0xheWVyLmgiCisKKyNpbmNsdWRlICJGbG9hdFBvaW50LmgiCisjaW5jbHVkZSAiUm90YXRl
VHJhbnNmb3JtT3BlcmF0aW9uLmgiCisjaW5jbHVkZSAiVGV4dFN0cmVhbS5oIgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKK3ZvaWQgR3JhcGhpY3NMYXllcjo6RmxvYXRWYWx1ZTo6c2V0KGZsb2F0
IGtleSwgZmxvYXQgdmFsdWUsIGNvbnN0IFRpbWluZ0Z1bmN0aW9uKiB0aW1pbmdGdW5jdGlvbikK
K3sKKyAgICBtX2tleSA9IGtleTsKKyAgICBtX3ZhbHVlID0gdmFsdWU7CisgICAgaWYgKHRpbWlu
Z0Z1bmN0aW9uICE9IG1fdGltaW5nRnVuY3Rpb24pIHsKKyAgICAgICAgaWYgKHRpbWluZ0Z1bmN0
aW9uKQorICAgICAgICAgICAgbV90aW1pbmdGdW5jdGlvbi5zZXQobmV3IFRpbWluZ0Z1bmN0aW9u
KCp0aW1pbmdGdW5jdGlvbikpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtX3RpbWluZ0Z1
bmN0aW9uLmNsZWFyKCk7CisgICAgfQorfQorCit2b2lkIEdyYXBoaWNzTGF5ZXI6OlRyYW5zZm9y
bVZhbHVlOjpzZXQoZmxvYXQga2V5LCBjb25zdCBUcmFuc2Zvcm1PcGVyYXRpb25zKiB2YWx1ZSwg
Y29uc3QgVGltaW5nRnVuY3Rpb24qIHRpbWluZ0Z1bmN0aW9uKQoreworICAgIG1fa2V5ID0ga2V5
OworICAgIGlmICh2YWx1ZSAhPSBtX3ZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSkKKyAgICAg
ICAgICAgIG1fdmFsdWUuc2V0KG5ldyBUcmFuc2Zvcm1PcGVyYXRpb25zKCp2YWx1ZSkpOworICAg
ICAgICBlbHNlCisgICAgICAgICAgICBtX3ZhbHVlLmNsZWFyKCk7CisgICAgfQorICAgIGlmICh0
aW1pbmdGdW5jdGlvbiAhPSBtX3RpbWluZ0Z1bmN0aW9uKSB7CisgICAgICAgIGlmICh0aW1pbmdG
dW5jdGlvbikKKyAgICAgICAgICAgIG1fdGltaW5nRnVuY3Rpb24uc2V0KG5ldyBUaW1pbmdGdW5j
dGlvbigqdGltaW5nRnVuY3Rpb24pKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbV90aW1p
bmdGdW5jdGlvbi5jbGVhcigpOworICAgIH0KK30KKwordm9pZCBHcmFwaGljc0xheWVyOjpGbG9h
dFZhbHVlTGlzdDo6aW5zZXJ0KGZsb2F0IGtleSwgZmxvYXQgdmFsdWUsIGNvbnN0IFRpbWluZ0Z1
bmN0aW9uKiB0aW1pbmdGdW5jdGlvbikKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1f
dmFsdWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIEZsb2F0VmFsdWUmIGN1ckZsb2F0VmFsdWUg
PSBtX3ZhbHVlc1tpXTsKKyAgICAgICAgaWYgKGN1ckZsb2F0VmFsdWUua2V5KCkgPT0ga2V5KSB7
CisgICAgICAgICAgICBjdXJGbG9hdFZhbHVlLnNldChrZXksIHZhbHVlLCB0aW1pbmdGdW5jdGlv
bik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1ckZsb2F0
VmFsdWUua2V5KCkgPiBrZXkpIHsKKyAgICAgICAgICAgIC8vIGluc2VydCBiZWZvcmUKKyAgICAg
ICAgICAgIG1fdmFsdWVzLmluc2VydChpLCBGbG9hdFZhbHVlKGtleSwgdmFsdWUsIHRpbWluZ0Z1
bmN0aW9uKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgCisg
ICAgLy8gYXBwZW5kCisgICAgbV92YWx1ZXMuYXBwZW5kKEZsb2F0VmFsdWUoa2V5LCB2YWx1ZSwg
dGltaW5nRnVuY3Rpb24pKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyOjpUcmFuc2Zvcm1WYWx1
ZUxpc3Q6Omluc2VydChmbG9hdCBrZXksIGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMqIHZhbHVl
LCBjb25zdCBUaW1pbmdGdW5jdGlvbiogdGltaW5nRnVuY3Rpb24pCit7CisgICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCBtX3ZhbHVlcy5zaXplKCk7ICsraSkgeworICAgICAgICBUcmFuc2Zvcm1W
YWx1ZSYgY3VyVHJhbnNWYWx1ZSA9IG1fdmFsdWVzW2ldOworICAgICAgICBpZiAoY3VyVHJhbnNW
YWx1ZS5rZXkoKSA9PSBrZXkpIHsKKyAgICAgICAgICAgIGN1clRyYW5zVmFsdWUuc2V0KGtleSwg
dmFsdWUsIHRpbWluZ0Z1bmN0aW9uKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQor
ICAgICAgICBpZiAoY3VyVHJhbnNWYWx1ZS5rZXkoKSA+IGtleSkgeworICAgICAgICAgICAgLy8g
aW5zZXJ0IGJlZm9yZQorICAgICAgICAgICAgbV92YWx1ZXMuaW5zZXJ0KGksIFRyYW5zZm9ybVZh
bHVlKGtleSwgdmFsdWUsIHRpbWluZ0Z1bmN0aW9uKSk7CisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8gYXBwZW5kCisgICAgbV92YWx1ZXMuYXBwZW5k
KFRyYW5zZm9ybVZhbHVlKGtleSwgdmFsdWUsIHRpbWluZ0Z1bmN0aW9uKSk7Cit9CisKKy8vIEFu
ICJpbnZhbGlkIiBsaXN0IGlzIG9uZSB3aG9zZSBmdW5jdGlvbnMgZG9uJ3QgbWF0Y2gsIGFuZCB0
aGVyZWZvcmUgaGFzIHRvIGJlIGFuaW1hdGVkIGFzIGEgTWF0cml4CisvLyBUaGUgaGFzQmlnUm90
YXRpb24gZmxhZyB3aWxsIGFsd2F5cyByZXR1cm4gZmFsc2UgaWYgaXNWYWxpZCBpcyBmYWxzZS4g
T3RoZXJ3aXNlIGhhc0JpZ1JvdGF0aW9uIGlzIAorLy8gdHJ1ZSBpZiB0aGUgcm90YXRpb24gYmV0
d2VlbiBhbnkgdHdvIGtleWZyYW1lcyBpcyA+PSAxODAgZGVncmVlcy4KK3ZvaWQgR3JhcGhpY3NM
YXllcjo6VHJhbnNmb3JtVmFsdWVMaXN0OjptYWtlRnVuY3Rpb25MaXN0KEZ1bmN0aW9uTGlzdCYg
bGlzdCwgYm9vbCYgaXNWYWxpZCwgYm9vbCYgaGFzQmlnUm90YXRpb24pIGNvbnN0Cit7CisgICAg
bGlzdC5jbGVhcigpOworICAgIGlzVmFsaWQgPSBmYWxzZTsKKyAgICBoYXNCaWdSb3RhdGlvbiA9
IGZhbHNlOworICAgIAorICAgIGlmIChtX3ZhbHVlcy5zaXplKCkgPCAyKQorICAgICAgICByZXR1
cm47CisgICAgCisgICAgLy8gZW1wdHkgdHJhbnNmb3JtcyBtYXRjaCBhbnl0aGluZywgc28gZmlu
ZCB0aGUgZmlyc3Qgbm9uLWVtcHR5IGVudHJ5IGFzIHRoZSByZWZlcmVuY2UKKyAgICBzaXplX3Qg
Zmlyc3RJbmRleCA9IDA7CisgICAgZm9yICggOyBmaXJzdEluZGV4IDwgbV92YWx1ZXMuc2l6ZSgp
OyArK2ZpcnN0SW5kZXgpIHsKKyAgICAgICAgaWYgKG1fdmFsdWVzW2ZpcnN0SW5kZXhdLnZhbHVl
KCktPm9wZXJhdGlvbnMoKS5zaXplKCkgPiAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQor
ICAgIAorICAgIGlmIChmaXJzdEluZGV4ID49IG1fdmFsdWVzLnNpemUoKSkKKyAgICAgICAgcmV0
dXJuOworICAgICAgICAKKyAgICBjb25zdCBUcmFuc2Zvcm1PcGVyYXRpb25zKiBmaXJzdFZhbCA9
IG1fdmFsdWVzW2ZpcnN0SW5kZXhdLnZhbHVlKCk7CisgICAgCisgICAgLy8gc2VlIGlmIHRoZSBr
ZXlmcmFtZXMgYXJlIHZhbGlkCisgICAgZm9yIChzaXplX3QgaSA9IGZpcnN0SW5kZXggKyAxOyBp
IDwgbV92YWx1ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgVHJhbnNmb3JtT3BlcmF0
aW9ucyogdmFsID0gbV92YWx1ZXNbaV0udmFsdWUoKTsKKyAgICAgICAgCisgICAgICAgIC8vIGEg
bnVsbCB0cmFuc2Zvcm0gbWF0Y2hlcyBhbnl0aGluZworICAgICAgICBpZiAodmFsLT5vcGVyYXRp
b25zKCkuaXNFbXB0eSgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAKKyAg
ICAgICAgaWYgKGZpcnN0VmFsLT5vcGVyYXRpb25zKCkuc2l6ZSgpICE9IHZhbC0+b3BlcmF0aW9u
cygpLnNpemUoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIAorICAgICAgICBm
b3IgKHNpemVfdCBqID0gMDsgaiA8IGZpcnN0VmFsLT5vcGVyYXRpb25zKCkuc2l6ZSgpOyArK2op
IHsKKyAgICAgICAgICAgIGlmICghZmlyc3RWYWwtPm9wZXJhdGlvbnMoKS5hdChqKS0+aXNTYW1l
VHlwZSgqdmFsLT5vcGVyYXRpb25zKCkuYXQoaikpKQorICAgICAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGtleWZyYW1lcyBhcmUgdmFsaWQsIGZpbGwgaW4g
dGhlIGxpc3QKKyAgICBpc1ZhbGlkID0gdHJ1ZTsKKyAgICAKKyAgICBkb3VibGUgbGFzdFJvdEFu
Z2xlID0gMC4wOworICAgIGRvdWJsZSBtYXhSb3RBbmdsZSA9IC0xLjA7CisgICAgICAgIAorICAg
IGxpc3QucmVzaXplKGZpcnN0VmFsLT5vcGVyYXRpb25zKCkuc2l6ZSgpKTsKKyAgICBmb3IgKHNp
emVfdCBqID0gMDsgaiA8IGZpcnN0VmFsLT5vcGVyYXRpb25zKCkuc2l6ZSgpOyArK2opIHsKKyAg
ICAgICAgVHJhbnNmb3JtT3BlcmF0aW9uOjpPcGVyYXRpb25UeXBlIHR5cGUgPSBmaXJzdFZhbC0+
b3BlcmF0aW9ucygpLmF0KGopLT5nZXRPcGVyYXRpb25UeXBlKCk7CisgICAgICAgIGxpc3Rbal0g
PSB0eXBlOworICAgICAgICAKKyAgICAgICAgLy8gaWYgdGhpcyBpcyBhIHJvdGF0aW9uIGVudHJ5
LCB3ZSBuZWVkIHRvIHNlZSBpZiBhbnkgYW5nbGUgZGlmZmVyZW5jZXMgYXJlID49IDE4MCBkZWcK
KyAgICAgICAgaWYgKHR5cGUgPT0gVHJhbnNmb3JtT3BlcmF0aW9uOjpST1RBVEUpIHsKKyAgICAg
ICAgICAgIGxhc3RSb3RBbmdsZSA9IHN0YXRpY19jYXN0PFJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlv
bio+KGZpcnN0VmFsLT5vcGVyYXRpb25zKCkuYXQoaikuZ2V0KCkpLT5hbmdsZSgpOworICAgICAg
ICAgICAgCisgICAgICAgICAgICBpZiAobWF4Um90QW5nbGUgPCAwKQorICAgICAgICAgICAgICAg
IG1heFJvdEFuZ2xlID0gZmFicyhsYXN0Um90QW5nbGUpOworICAgICAgICAgICAgCisgICAgICAg
ICAgICBmb3IgKHNpemVfdCBpID0gZmlyc3RJbmRleCArIDE7IGkgPCBtX3ZhbHVlcy5zaXplKCk7
ICsraSkgeworICAgICAgICAgICAgICAgIGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMqIHZhbCA9
IG1fdmFsdWVzW2ldLnZhbHVlKCk7CisgICAgICAgICAgICAgICAgZG91YmxlIHJvdEFuZ2xlID0g
dmFsLT5vcGVyYXRpb25zKCkuaXNFbXB0eSgpID8gMCA6IChzdGF0aWNfY2FzdDxSb3RhdGVUcmFu
c2Zvcm1PcGVyYXRpb24qPih2YWwtPm9wZXJhdGlvbnMoKS5hdChqKS5nZXQoKSktPmFuZ2xlKCkp
OworICAgICAgICAgICAgICAgIGRvdWJsZSBkaWZmQW5nbGUgPSBmYWJzKHJvdEFuZ2xlIC0gbGFz
dFJvdEFuZ2xlKTsKKyAgICAgICAgICAgICAgICBpZiAoZGlmZkFuZ2xlID4gbWF4Um90QW5nbGUp
CisgICAgICAgICAgICAgICAgICAgIG1heFJvdEFuZ2xlID0gZGlmZkFuZ2xlOworICAgICAgICAg
ICAgICAgIGxhc3RSb3RBbmdsZSA9IHJvdEFuZ2xlOworICAgICAgICAgICAgfQorICAgICAgICB9
CisgICAgfQorICAgIAorICAgIGhhc0JpZ1JvdGF0aW9uID0gbWF4Um90QW5nbGUgPj0gMTgwLjA7
Cit9CisKK0dyYXBoaWNzTGF5ZXI6OkdyYXBoaWNzTGF5ZXIoR3JhcGhpY3NMYXllckNsaWVudCog
Y2xpZW50KQorICAgIDogbV9jbGllbnQoY2xpZW50KQorICAgICwgbV9hbmNob3JQb2ludCgwLjVm
LCAwLjVmLCAwKQorICAgICwgbV9vcGFjaXR5KDEpCisjaWZuZGVmIE5ERUJVRworICAgICwgbV96
UG9zaXRpb24oMCkKKyNlbmRpZgorICAgICwgbV9iYWNrZ3JvdW5kQ29sb3JTZXQoZmFsc2UpCisg
ICAgLCBtX2NvbnRlbnRzT3BhcXVlKGZhbHNlKQorICAgICwgbV9wcmVzZXJ2ZXMzRChmYWxzZSkK
KyAgICAsIG1fYmFja2ZhY2VWaXNpYmlsaXR5KHRydWUpCisgICAgLCBtX3VzaW5nVGlsZWRMYXll
cihmYWxzZSkKKyAgICAsIG1fbWFza3NUb0JvdW5kcyhmYWxzZSkKKyAgICAsIG1fZHJhd3NDb250
ZW50KGZhbHNlKQorICAgICwgbV9wYWludGluZ1BoYXNlKEdyYXBoaWNzTGF5ZXJQYWludEFsbE1h
c2spCisgICAgLCBtX3BhcmVudCgwKQorI2lmbmRlZiBOREVCVUcKKyAgICAsIG1fcmVwYWludENv
dW50KDApCisjZW5kaWYKK3sKK30KKworR3JhcGhpY3NMYXllcjo6fkdyYXBoaWNzTGF5ZXIoKQor
eworICAgIHJlbW92ZUFsbEFuaW1hdGlvbnMoKTsgICAgCisKKyAgICByZW1vdmVBbGxDaGlsZHJl
bigpOworICAgIHJlbW92ZUZyb21QYXJlbnQoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyOjph
ZGRDaGlsZChHcmFwaGljc0xheWVyKiBjaGlsZExheWVyKQoreworICAgIEFTU0VSVChjaGlsZExh
eWVyICE9IHRoaXMpOworICAgIAorICAgIGlmIChjaGlsZExheWVyLT5wYXJlbnQoKSkKKyAgICAg
ICAgY2hpbGRMYXllci0+cmVtb3ZlRnJvbVBhcmVudCgpOworCisgICAgY2hpbGRMYXllci0+c2V0
UGFyZW50KHRoaXMpOworICAgIG1fY2hpbGRyZW4uYXBwZW5kKGNoaWxkTGF5ZXIpOworfQorCit2
b2lkIEdyYXBoaWNzTGF5ZXI6OmFkZENoaWxkQXRJbmRleChHcmFwaGljc0xheWVyKiBjaGlsZExh
eWVyLCBpbnQgaW5kZXgpCit7CisgICAgQVNTRVJUKGNoaWxkTGF5ZXIgIT0gdGhpcyk7CisKKyAg
ICBpZiAoY2hpbGRMYXllci0+cGFyZW50KCkpCisgICAgICAgIGNoaWxkTGF5ZXItPnJlbW92ZUZy
b21QYXJlbnQoKTsKKworICAgIGNoaWxkTGF5ZXItPnNldFBhcmVudCh0aGlzKTsKKyAgICBtX2No
aWxkcmVuLmluc2VydChpbmRleCwgY2hpbGRMYXllcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXll
cjo6YWRkQ2hpbGRCZWxvdyhHcmFwaGljc0xheWVyKiBjaGlsZExheWVyLCBHcmFwaGljc0xheWVy
KiBzaWJsaW5nKQoreworICAgIEFTU0VSVChjaGlsZExheWVyICE9IHRoaXMpOworICAgIGNoaWxk
TGF5ZXItPnJlbW92ZUZyb21QYXJlbnQoKTsKKworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9jaGlsZHJlbi5zaXplKCk7IGkrKykgeworICAg
ICAgICBpZiAoc2libGluZyA9PSBtX2NoaWxkcmVuW2ldKSB7CisgICAgICAgICAgICBtX2NoaWxk
cmVuLmluc2VydChpLCBjaGlsZExheWVyKTsKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgY2hpbGRMYXllci0+c2V0
UGFyZW50KHRoaXMpOworCisgICAgaWYgKCFmb3VuZCkKKyAgICAgICAgbV9jaGlsZHJlbi5hcHBl
bmQoY2hpbGRMYXllcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllcjo6YWRkQ2hpbGRBYm92ZShH
cmFwaGljc0xheWVyKiBjaGlsZExheWVyLCBHcmFwaGljc0xheWVyKiBzaWJsaW5nKQoreworICAg
IGNoaWxkTGF5ZXItPnJlbW92ZUZyb21QYXJlbnQoKTsKKyAgICBBU1NFUlQoY2hpbGRMYXllciAh
PSB0aGlzKTsKKworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgbV9jaGlsZHJlbi5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoc2libGluZyA9
PSBtX2NoaWxkcmVuW2ldKSB7CisgICAgICAgICAgICBtX2NoaWxkcmVuLmluc2VydChpKzEsIGNo
aWxkTGF5ZXIpOworICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjaGlsZExheWVyLT5zZXRQYXJlbnQodGhpcyk7CisK
KyAgICBpZiAoIWZvdW5kKQorICAgICAgICBtX2NoaWxkcmVuLmFwcGVuZChjaGlsZExheWVyKTsK
K30KKworYm9vbCBHcmFwaGljc0xheWVyOjpyZXBsYWNlQ2hpbGQoR3JhcGhpY3NMYXllciogb2xk
Q2hpbGQsIEdyYXBoaWNzTGF5ZXIqIG5ld0NoaWxkKQoreworICAgIEFTU0VSVCghbmV3Q2hpbGQt
PnBhcmVudCgpKTsKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IG1fY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG9sZENoaWxk
ID09IG1fY2hpbGRyZW5baV0pIHsKKyAgICAgICAgICAgIG1fY2hpbGRyZW5baV0gPSBuZXdDaGls
ZDsKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICB9CisgICAgfQorICAgIGlmIChmb3VuZCkgeworICAgICAgICBvbGRDaGlsZC0+c2V0UGFyZW50
KDApOworCisgICAgICAgIG5ld0NoaWxkLT5yZW1vdmVGcm9tUGFyZW50KCk7CisgICAgICAgIG5l
d0NoaWxkLT5zZXRQYXJlbnQodGhpcyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAg
ICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllcjo6cmVtb3ZlQWxsQ2hpbGRy
ZW4oKQoreworICAgIHdoaWxlIChtX2NoaWxkcmVuLnNpemUoKSkgeworICAgICAgICBHcmFwaGlj
c0xheWVyKiBjdXJMYXllciA9IG1fY2hpbGRyZW5bMF07CisgICAgICAgIEFTU0VSVChjdXJMYXll
ci0+cGFyZW50KCkpOworICAgICAgICBjdXJMYXllci0+cmVtb3ZlRnJvbVBhcmVudCgpOworICAg
IH0KK30KKwordm9pZCBHcmFwaGljc0xheWVyOjpyZW1vdmVGcm9tUGFyZW50KCkKK3sKKyAgICBp
ZiAobV9wYXJlbnQpIHsKKyAgICAgICAgdW5zaWduZWQgaTsKKyAgICAgICAgZm9yIChpID0gMDsg
aSA8IG1fcGFyZW50LT5tX2NoaWxkcmVuLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAo
dGhpcyA9PSBtX3BhcmVudC0+bV9jaGlsZHJlbltpXSkgeworICAgICAgICAgICAgICAgIG1fcGFy
ZW50LT5tX2NoaWxkcmVuLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNldFBhcmVudCgwKTsKKyAgICB9Cit9CisK
K3ZvaWQgR3JhcGhpY3NMYXllcjo6c2V0QmFja2dyb3VuZENvbG9yKGNvbnN0IENvbG9yJiBpbkNv
bG9yLCBjb25zdCBBbmltYXRpb24qLCBkb3VibGUgLypiZWdpblRpbWUqLykKK3sKKyAgICBtX2Jh
Y2tncm91bmRDb2xvciA9IGluQ29sb3I7CisgICAgbV9iYWNrZ3JvdW5kQ29sb3JTZXQgPSB0cnVl
OworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXI6OmNsZWFyQmFja2dyb3VuZENvbG9yKCkKK3sKKyAg
ICBtX2JhY2tncm91bmRDb2xvciA9IENvbG9yKCk7CisgICAgbV9iYWNrZ3JvdW5kQ29sb3JTZXQg
PSBmYWxzZTsKK30KKworYm9vbCBHcmFwaGljc0xheWVyOjpzZXRPcGFjaXR5KGZsb2F0IG9wYWNp
dHksIGNvbnN0IEFuaW1hdGlvbiosIGRvdWJsZSkKK3sKKyAgICBtX29wYWNpdHkgPSBvcGFjaXR5
OworICAgIHJldHVybiBmYWxzZTsgICAgICAgLy8gbm90IGFuaW1hdGluZworfQorCit2b2lkIEdy
YXBoaWNzTGF5ZXI6OnBhaW50R3JhcGhpY3NMYXllckNvbnRlbnRzKEdyYXBoaWNzQ29udGV4dCYg
Y29udGV4dCwgY29uc3QgSW50UmVjdCYgY2xpcCkKK3sKKyAgICBtX2NsaWVudC0+cGFpbnRDb250
ZW50cyh0aGlzLCBjb250ZXh0LCBtX3BhaW50aW5nUGhhc2UsIGNsaXApOworfQorCitTdHJpbmcg
R3JhcGhpY3NMYXllcjo6cHJvcGVydHlJZFRvU3RyaW5nKEFuaW1hdGVkUHJvcGVydHlJRCBwcm9w
ZXJ0eSkKK3sKKyAgICBzd2l0Y2ggKHByb3BlcnR5KSB7CisgICAgICAgIGNhc2UgQW5pbWF0ZWRQ
cm9wZXJ0eVdlYmtpdFRyYW5zZm9ybToKKyAgICAgICAgICAgIHJldHVybiAidHJhbnNmb3JtIjsK
KyAgICAgICAgY2FzZSBBbmltYXRlZFByb3BlcnR5T3BhY2l0eToKKyAgICAgICAgICAgIHJldHVy
biAib3BhY2l0eSI7CisgICAgICAgIGNhc2UgQW5pbWF0ZWRQcm9wZXJ0eUJhY2tncm91bmRDb2xv
cjoKKyAgICAgICAgICAgIHJldHVybiAiYmFja2dyb3VuZENvbG9yIjsKKyAgICAgICAgY2FzZSBB
bmltYXRlZFByb3BlcnR5SW52YWxpZDoKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OworICAgIH0KKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gIiI7Cit9CisK
K2ludCBHcmFwaGljc0xheWVyOjpmaW5kQW5pbWF0aW9uRW50cnkoQW5pbWF0ZWRQcm9wZXJ0eUlE
IHByb3BlcnR5LCBzaG9ydCBpbmRleCkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsg
aSA8IG1fYW5pbWF0aW9ucy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAobV9hbmltYXRpb25z
W2ldLm1hdGNoZXMocHJvcGVydHksIGluZGV4KSkKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNf
Y2FzdDxpbnQ+KGkpOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK3ZvaWQgR3JhcGhpY3NM
YXllcjo6YWRkQW5pbWF0aW9uRW50cnkoQW5pbWF0ZWRQcm9wZXJ0eUlEIHByb3BlcnR5LCBzaG9y
dCBpbmRleCwgYm9vbCBpc1RyYW5zaXRpb24sIGNvbnN0IEFuaW1hdGlvbiogdHJhbnNpdGlvbikK
K3sKKyAgICBpbnQgaSA9IGZpbmRBbmltYXRpb25FbnRyeShwcm9wZXJ0eSwgaW5kZXgpOworICAg
IAorICAgIGlmIChpID49IDApCisgICAgICAgIG1fYW5pbWF0aW9uc1tpXS5yZXNldCh0cmFuc2l0
aW9uLCBpc1RyYW5zaXRpb24pOworICAgIGVsc2UKKyAgICAgICAgbV9hbmltYXRpb25zLmFwcGVu
ZChBbmltYXRpb25FbnRyeSh0cmFuc2l0aW9uLCBwcm9wZXJ0eSwgaW5kZXgsIGlzVHJhbnNpdGlv
bikpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXI6OnJlbW92ZUFsbEFuaW1hdGlvbnMoKQorewor
ICAgIHNpemVfdCBzaXplID0gbV9hbmltYXRpb25zLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IHNpemU7ICsraSkKKyAgICAgICAgcmVtb3ZlQW5pbWF0aW9uKDAsIHRydWUpOwor
fQorCit2b2lkIEdyYXBoaWNzTGF5ZXI6OnJlbW92ZUFsbEFuaW1hdGlvbnNGb3JQcm9wZXJ0eShB
bmltYXRlZFByb3BlcnR5SUQgcHJvcGVydHkpCit7CisgICAgZm9yIChzaG9ydCBqID0gMDsgOyAr
K2opIHsKKyAgICAgICAgaW50IGkgPSBmaW5kQW5pbWF0aW9uRW50cnkocHJvcGVydHksIGopOwor
ICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcmVtb3ZlQW5p
bWF0aW9uKGksIGZhbHNlKTsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllcjo6cmVtb3Zl
RmluaXNoZWRBbmltYXRpb25zKGNvbnN0IFN0cmluZyYgbmFtZSwgaW50IC8qaW5kZXgqLywgYm9v
bCByZXNldCkKK3sKKyAgICBzaXplX3Qgc2l6ZSA9IG1fYW5pbWF0aW9ucy5zaXplKCk7CisgICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyApIHsKKyAgICAgICAgQW5pbWF0aW9uRW50cnkm
IGFuaW0gPSBtX2FuaW1hdGlvbnNbaV07CisgICAgICAgIGlmICghYW5pbS5pc1RyYW5zaXRpb24o
KSAmJiBhbmltLmFuaW1hdGlvbigpLT5uYW1lKCkgPT0gbmFtZSkgeworICAgICAgICAgICAgcmVt
b3ZlQW5pbWF0aW9uKGksIHJlc2V0KTsKKyAgICAgICAgICAgIC0tc2l6ZTsKKyAgICAgICAgfSBl
bHNlCisgICAgICAgICAgICArK2k7CisgICAgfQorfQorCit2b2lkIEdyYXBoaWNzTGF5ZXI6OnJl
bW92ZUZpbmlzaGVkVHJhbnNpdGlvbnMoQW5pbWF0ZWRQcm9wZXJ0eUlEIHByb3BlcnR5KQorewor
ICAgIHNpemVfdCBzaXplID0gbV9hbmltYXRpb25zLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IHNpemU7ICkgeworICAgICAgICBBbmltYXRpb25FbnRyeSYgYW5pbSA9IG1fYW5p
bWF0aW9uc1tpXTsKKyAgICAgICAgaWYgKGFuaW0uaXNUcmFuc2l0aW9uKCkgJiYgcHJvcGVydHkg
PT0gYW5pbS5wcm9wZXJ0eSgpKSB7CisgICAgICAgICAgICByZW1vdmVBbmltYXRpb24oaSwgZmFs
c2UpOworICAgICAgICAgICAgLS1zaXplOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICsr
aTsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllcjo6c3VzcGVuZEFuaW1hdGlvbnMoKQor
eworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXI6OnJlc3VtZUFuaW1hdGlvbnMoKQoreworfQorCisj
aWZuZGVmIE5ERUJVRwordm9pZCBHcmFwaGljc0xheWVyOjp1cGRhdGVEZWJ1Z0luZGljYXRvcnMo
KQoreworICAgIGlmIChHcmFwaGljc0xheWVyOjpzaG93RGVidWdCb3JkZXJzKCkpIHsKKyAgICAg
ICAgaWYgKGRyYXdzQ29udGVudCgpKSB7CisgICAgICAgICAgICBpZiAobV91c2luZ1RpbGVkTGF5
ZXIpCisgICAgICAgICAgICAgICAgc2V0RGVidWdCb3JkZXIoQ29sb3IoMCwgMjU1LCAwLCAyMDQp
LCAyLjBmKTsgICAgLy8gdGlsZWQgbGF5ZXI6IGdyZWVuCisgICAgICAgICAgICBlbHNlCisgICAg
ICAgICAgICAgICAgc2V0RGVidWdCb3JkZXIoQ29sb3IoMjU1LCAwLCAwLCAyMDQpLCAyLjBmKTsg
ICAgLy8gbm9ybWFsIGxheWVyOiByZWQKKyAgICAgICAgfSBlbHNlIGlmIChtYXNrc1RvQm91bmRz
KCkpIHsKKyAgICAgICAgICAgIHNldERlYnVnQm9yZGVyKENvbG9yKDEyOCwgMjU1LCAyNTUsIDE3
OCksIDIuMGYpOyAgICAvLyBtYXNraW5nIGxheWVyOiBwYWxlIGJsdWUKKyAgICAgICAgICAgIGlm
IChHcmFwaGljc0xheWVyOjpzaG93RGVidWdCb3JkZXJzKCkpCisgICAgICAgICAgICAgICAgc2V0
RGVidWdCYWNrZ3JvdW5kQ29sb3IoQ29sb3IoMTI4LCAyNTUsIDI1NSwgNTIpKTsKKyAgICAgICAg
fSBlbHNlCisgICAgICAgICAgICBzZXREZWJ1Z0JvcmRlcihDb2xvcigyNTUsIDI1NSwgMCwgMjA0
KSwgMi4wZik7ICAgICAgLy8gY29udGFpbmVyOiB5ZWxsb3cKKyAgICB9Cit9CisKK3ZvaWQgR3Jh
cGhpY3NMYXllcjo6c2V0WlBvc2l0aW9uKGZsb2F0IHBvc2l0aW9uKQoreworICAgIG1felBvc2l0
aW9uID0gcG9zaXRpb247Cit9CisjZW5kaWYKKwordm9pZCB3cml0ZUluZGVudChUZXh0U3RyZWFt
JiB0cywgaW50IGluZGVudCkKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSAhPSBpbmRlbnQ7ICsr
aSkKKyAgICAgICAgdHMgPDwgIiAgIjsKK30KKwordm9pZCBHcmFwaGljc0xheWVyOjpkdW1wTGF5
ZXIoVGV4dFN0cmVhbSYgdHMsIGludCBpbmRlbnQpIGNvbnN0Cit7CisgICAgd3JpdGVJbmRlbnQo
dHMsIGluZGVudCk7CisgICAgdHMgPDwgIigiIDw8ICJHcmFwaGljc0xheWVyIiA8PCAiICIgPDwg
c3RhdGljX2Nhc3Q8dm9pZCo+KGNvbnN0X2Nhc3Q8R3JhcGhpY3NMYXllcio+KHRoaXMpKTsKKyAg
ICB0cyA8PCAiIFwiIiA8PCBtX25hbWUgPDwgIlwiXG4iOworICAgIGR1bXBQcm9wZXJ0aWVzKHRz
LCBpbmRlbnQpOworICAgIHdyaXRlSW5kZW50KHRzLCBpbmRlbnQpOworICAgIHRzIDw8ICIpXG4i
OworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXI6OmR1bXBQcm9wZXJ0aWVzKFRleHRTdHJlYW0mIHRz
LCBpbnQgaW5kZW50KSBjb25zdAoreworICAgIHdyaXRlSW5kZW50KHRzLCBpbmRlbnQgKyAxKTsK
KyAgICB0cyA8PCAiKHBvc2l0aW9uICIgPDwgbV9wb3NpdGlvbi54KCkgPDwgIiAiIDw8IG1fcG9z
aXRpb24ueSgpIDw8ICIpXG4iOworCisgICAgd3JpdGVJbmRlbnQodHMsIGluZGVudCArIDEpOwor
ICAgIHRzIDw8ICIoYW5jaG9yICIgPDwgbV9hbmNob3JQb2ludC54KCkgPDwgIiAiIDw8IG1fYW5j
aG9yUG9pbnQueSgpIDw8ICIpXG4iOworCisgICAgd3JpdGVJbmRlbnQodHMsIGluZGVudCArIDEp
OworICAgIHRzIDw8ICIoYm91bmRzICIgPDwgbV9zaXplLndpZHRoKCkgPDwgIiAiIDw8IG1fc2l6
ZS5oZWlnaHQoKSA8PCAiKVxuIjsKKworICAgIHdyaXRlSW5kZW50KHRzLCBpbmRlbnQgKyAxKTsK
KyAgICB0cyA8PCAiKG9wYWNpdHkgIiA8PCBtX29wYWNpdHkgPDwgIilcbiI7CisgICAgCisgICAg
d3JpdGVJbmRlbnQodHMsIGluZGVudCArIDEpOworICAgIHRzIDw8ICIodXNpbmdUaWxlZExheWVy
ICIgPDwgbV91c2luZ1RpbGVkTGF5ZXIgPDwgIilcbiI7CisKKyAgICB3cml0ZUluZGVudCh0cywg
aW5kZW50ICsgMSk7CisgICAgdHMgPDwgIihtX3ByZXNlcnZlczNEICIgPDwgbV9wcmVzZXJ2ZXMz
RCA8PCAiKVxuIjsKKworICAgIHdyaXRlSW5kZW50KHRzLCBpbmRlbnQgKyAxKTsKKyAgICB0cyA8
PCAiKGRyYXdzQ29udGVudCAiIDw8IG1fZHJhd3NDb250ZW50IDw8ICIpXG4iOworCisgICAgd3Jp
dGVJbmRlbnQodHMsIGluZGVudCArIDEpOworICAgIHRzIDw8ICIobV9iYWNrZmFjZVZpc2liaWxp
dHkgIiA8PCAobV9iYWNrZmFjZVZpc2liaWxpdHkgPyAidmlzaWJsZSIgOiAiaGlkZGVuIikgPDwg
IilcbiI7CisKKyAgICB3cml0ZUluZGVudCh0cywgaW5kZW50ICsgMSk7CisgICAgdHMgPDwgIihj
bGllbnQgIjsKKyAgICBpZiAobV9jbGllbnQpCisgICAgICAgIHRzIDw8IHN0YXRpY19jYXN0PHZv
aWQqPihtX2NsaWVudCk7CisgICAgZWxzZQorICAgICAgICB0cyA8PCAibm9uZSI7CisgICAgdHMg
PDwgIilcbiI7CisKKyAgICB3cml0ZUluZGVudCh0cywgaW5kZW50ICsgMSk7CisgICAgdHMgPDwg
IihiYWNrZ3JvdW5kQ29sb3IgIjsKKyAgICBpZiAoIW1fYmFja2dyb3VuZENvbG9yU2V0KQorICAg
ICAgICB0cyA8PCAibm9uZSI7CisgICAgZWxzZQorICAgICAgICB0cyA8PCBtX2JhY2tncm91bmRD
b2xvci5uYW1lKCk7CisgICAgdHMgPDwgIilcbiI7CisKKyAgICB3cml0ZUluZGVudCh0cywgaW5k
ZW50ICsgMSk7CisgICAgdHMgPDwgIih0cmFuc2Zvcm0gIjsKKyAgICBpZiAobV90cmFuc2Zvcm0u
aXNJZGVudGl0eSgpKQorICAgICAgICB0cyA8PCAiaWRlbnRpdHkiOworICAgIGVsc2UgeworICAg
ICAgICB0cyA8PCAiWyIgPDwgbV90cmFuc2Zvcm0uYSgpIDw8ICIgIiA8PCBtX3RyYW5zZm9ybS5i
KCkgPDwgIl0gIjsKKyAgICAgICAgdHMgPDwgIlsiIDw8IG1fdHJhbnNmb3JtLmMoKSA8PCAiICIg
PDwgbV90cmFuc2Zvcm0uZCgpIDw8ICJdICI7CisgICAgICAgIHRzIDw8ICJbIiA8PCBtX3RyYW5z
Zm9ybS5lKCkgPDwgIiAiIDw8IG1fdHJhbnNmb3JtLmYoKSA8PCAiXSAiOworICAgIH0KKyAgICB0
cyA8PCAiKVxuIjsKKworICAgIHdyaXRlSW5kZW50KHRzLCBpbmRlbnQgKyAxKTsKKyAgICB0cyA8
PCAiKGNoaWxkcmVuVHJhbnNmb3JtICI7CisgICAgaWYgKG1fY2hpbGRyZW5UcmFuc2Zvcm0uaXNJ
ZGVudGl0eSgpKQorICAgICAgICB0cyA8PCAiaWRlbnRpdHkiOworICAgIGVsc2UgeworICAgICAg
ICB0cyA8PCAiWyIgPDwgbV9jaGlsZHJlblRyYW5zZm9ybS5hKCkgPDwgIiAiIDw8IG1fY2hpbGRy
ZW5UcmFuc2Zvcm0uYigpIDw8ICJdICI7CisgICAgICAgIHRzIDw8ICJbIiA8PCBtX2NoaWxkcmVu
VHJhbnNmb3JtLmMoKSA8PCAiICIgPDwgbV9jaGlsZHJlblRyYW5zZm9ybS5kKCkgPDwgIl0gIjsK
KyAgICAgICAgdHMgPDwgIlsiIDw8IG1fY2hpbGRyZW5UcmFuc2Zvcm0uZSgpIDw8ICIgIiA8PCBt
X2NoaWxkcmVuVHJhbnNmb3JtLmYoKSA8PCAiXSAiOworICAgIH0KKyAgICB0cyA8PCAiKVxuIjsK
KworICAgIHdyaXRlSW5kZW50KHRzLCBpbmRlbnQgKyAxKTsKKyAgICB0cyA8PCAiKGNoaWxkcmVu
ICIgPDwgbV9jaGlsZHJlbi5zaXplKCkgPDwgIlxuIjsKKyAgICAKKyAgICB1bnNpZ25lZCBpOwor
ICAgIGZvciAoaSA9IDA7IGkgPCBtX2NoaWxkcmVuLnNpemUoKTsgaSsrKQorICAgICAgICBtX2No
aWxkcmVuW2ldLT5kdW1wTGF5ZXIodHMsIGluZGVudCsyKTsKKyAgICB3cml0ZUluZGVudCh0cywg
aW5kZW50ICsgMSk7CisgICAgdHMgPDwgIilcbiI7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKKworI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKZGlmZiAtLWdpdCBh
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllci5oIGIvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9HcmFwaGljc0xheWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMC4uZjkyOGNlOAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvR3JhcGhpY3NMYXllci5oCkBAIC0wLDAgKzEsNDA3IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEdyYXBoaWNz
TGF5ZXJfaAorI2RlZmluZSBHcmFwaGljc0xheWVyX2gKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9D
T01QT1NJVElORykKKworI2luY2x1ZGUgIkFuaW1hdGlvbi5oIgorI2luY2x1ZGUgIkNvbG9yLmgi
CisjaW5jbHVkZSAiRmxvYXRQb2ludC5oIgorI2luY2x1ZGUgIkZsb2F0UG9pbnQzRC5oIgorI2lu
Y2x1ZGUgIkZsb2F0U2l6ZS5oIgorI2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXJDbGllbnQuaCIKKyNp
bmNsdWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgorI2luY2x1ZGUgIlRyYW5zZm9ybU9wZXJh
dGlvbnMuaCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisKKyNpZiBQTEFURk9STShNQUMpCisj
aWZkZWYgX19PQkpDX18KK0BjbGFzcyBXZWJMYXllcjsKK0BjbGFzcyBDQUxheWVyOwordHlwZWRl
ZiBXZWJMYXllciBQbGF0Zm9ybUxheWVyOwordHlwZWRlZiBDQUxheWVyKiBOYXRpdmVMYXllcjsK
KyNlbHNlCit0eXBlZGVmIHZvaWQqIFBsYXRmb3JtTGF5ZXI7Cit0eXBlZGVmIHZvaWQqIE5hdGl2
ZUxheWVyOworI2VuZGlmCisjZWxzZQordHlwZWRlZiB2b2lkKiBQbGF0Zm9ybUxheWVyOwordHlw
ZWRlZiB2b2lkKiBOYXRpdmVMYXllcjsKKyNlbmRpZgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K2NsYXNzIEZsb2F0UG9pbnQzRDsKK2NsYXNzIEdyYXBoaWNzQ29udGV4dDsKK2NsYXNzIEltYWdl
OworY2xhc3MgVGV4dFN0cmVhbTsKK2NsYXNzIFRpbWluZ0Z1bmN0aW9uOworCisvLyBHcmFwaGlj
c0xheWVyIGlzIGFuIGFic3RyYWN0aW9uIGZvciBhIHJlbmRlcmluZyBzdXJmYWNlIHdpdGggYmFj
a2luZyBzdG9yZSwKKy8vIHdoaWNoIG1heSBoYXZlIGFzc29jaWF0ZWQgdHJhbnNmb3JtYXRpb24g
YW5kIGFuaW1hdGlvbnMuCisKK2NsYXNzIEdyYXBoaWNzTGF5ZXIgeworcHVibGljOgorICAgIC8v
IFVzZWQgdG8gc3RvcmUgb25lIGZsb2F0IHZhbHVlIG9mIGEga2V5ZnJhbWUgYW5pbWF0aW9uLgor
ICAgIGNsYXNzIEZsb2F0VmFsdWUgeworICAgIHB1YmxpYzoKKyAgICAgICAgRmxvYXRWYWx1ZShm
bG9hdCBrZXksIGZsb2F0IHZhbHVlLCBjb25zdCBUaW1pbmdGdW5jdGlvbiogdGltaW5nRnVuY3Rp
b24gPSAwKQorICAgICAgICAgICAgOiBtX2tleShrZXkpLCBtX3ZhbHVlKHZhbHVlKSwgbV90aW1p
bmdGdW5jdGlvbigwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGltaW5nRnVuY3Rpb24p
CisgICAgICAgICAgICAgICAgbV90aW1pbmdGdW5jdGlvbi5zZXQobmV3IFRpbWluZ0Z1bmN0aW9u
KCp0aW1pbmdGdW5jdGlvbikpOworICAgICAgICB9CisKKyAgICAgICAgRmxvYXRWYWx1ZShjb25z
dCBGbG9hdFZhbHVlJiBvdGhlcikKKyAgICAgICAgICAgIDogbV9rZXkob3RoZXIua2V5KCkpLCBt
X3ZhbHVlKG90aGVyLnZhbHVlKCkpLCBtX3RpbWluZ0Z1bmN0aW9uKDApCisgICAgICAgIHsKKyAg
ICAgICAgICAgIGlmIChvdGhlci50aW1pbmdGdW5jdGlvbigpKQorICAgICAgICAgICAgICAgIG1f
dGltaW5nRnVuY3Rpb24uc2V0KG5ldyBUaW1pbmdGdW5jdGlvbigqb3RoZXIudGltaW5nRnVuY3Rp
b24oKSkpOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgRmxvYXRWYWx1ZSYgb3BlcmF0b3I9
KGNvbnN0IEZsb2F0VmFsdWUmIG90aGVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoJm90
aGVyICE9IHRoaXMpCisgICAgICAgICAgICAgICAgc2V0KG90aGVyLmtleSgpLCBvdGhlci52YWx1
ZSgpLCBvdGhlci50aW1pbmdGdW5jdGlvbigpKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsK
KyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0KGZsb2F0IGtleSwgZmxvYXQgdmFsdWUsIGNv
bnN0IFRpbWluZ0Z1bmN0aW9uKik7CisgICAgICAgIAorICAgICAgICBmbG9hdCBrZXkoKSBjb25z
dCB7IHJldHVybiBtX2tleTsgfQorICAgICAgICBmbG9hdCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJu
IG1fdmFsdWU7IH0KKyAgICAgICAgY29uc3QgVGltaW5nRnVuY3Rpb24qIHRpbWluZ0Z1bmN0aW9u
KCkgY29uc3QgeyByZXR1cm4gbV90aW1pbmdGdW5jdGlvbi5nZXQoKTsgfQorCisgICAgcHJpdmF0
ZToKKyAgICAgICAgZmxvYXQgbV9rZXk7CisgICAgICAgIGZsb2F0IG1fdmFsdWU7CisgICAgICAg
IE93blB0cjxUaW1pbmdGdW5jdGlvbj4gbV90aW1pbmdGdW5jdGlvbjsKKyAgICB9OworICAgIAor
ICAgIAorICAgIGNsYXNzIEZsb2F0VmFsdWVMaXN0IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZv
aWQgaW5zZXJ0KGZsb2F0IGtleSwgZmxvYXQgdmFsdWUsIGNvbnN0IFRpbWluZ0Z1bmN0aW9uKiB0
aW1pbmdGdW5jdGlvbik7CisKKyAgICAgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBt
X3ZhbHVlcy5zaXplKCk7IH0KKyAgICAgICAgY29uc3QgRmxvYXRWYWx1ZSYgYXQoc2l6ZV90IGkp
IGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzLmF0KGkpOyB9CisgICAgICAgIGNvbnN0IFZlY3RvcjxG
bG9hdFZhbHVlPiYgdmFsdWVzKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXM7IH0KKworICAgIHBy
aXZhdGU6CisgICAgICAgIFZlY3RvcjxGbG9hdFZhbHVlPiBtX3ZhbHVlczsKKyAgICB9OworCisg
ICAgLy8gVXNlZCB0byBzdG9yZSBvbmUgdHJhbnNmb3JtIGluIGEga2V5ZnJhbWUgbGlzdC4KKyAg
ICBjbGFzcyBUcmFuc2Zvcm1WYWx1ZSB7CisgICAgcHVibGljOgorICAgICAgICBUcmFuc2Zvcm1W
YWx1ZShmbG9hdCBrZXkgPSBOQU4sIGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMqIHZhbHVlID0g
MCwgY29uc3QgVGltaW5nRnVuY3Rpb24qIHRpbWluZ0Z1bmN0aW9uID0gMCkKKyAgICAgICAgICAg
IDogbV9rZXkoa2V5KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmFsdWUpCisgICAgICAg
ICAgICAgICAgbV92YWx1ZS5zZXQobmV3IFRyYW5zZm9ybU9wZXJhdGlvbnMoKnZhbHVlKSk7Cisg
ICAgICAgICAgICBpZiAodGltaW5nRnVuY3Rpb24pCisgICAgICAgICAgICAgICAgbV90aW1pbmdG
dW5jdGlvbi5zZXQobmV3IFRpbWluZ0Z1bmN0aW9uKCp0aW1pbmdGdW5jdGlvbikpOworICAgICAg
ICB9CisKKyAgICAgICAgVHJhbnNmb3JtVmFsdWUoY29uc3QgVHJhbnNmb3JtVmFsdWUmIG90aGVy
KQorICAgICAgICAgICAgOiBtX2tleShvdGhlci5rZXkoKSkKKyAgICAgICAgeworICAgICAgICAg
ICAgaWYgKG90aGVyLnZhbHVlKCkpCisgICAgICAgICAgICAgICAgbV92YWx1ZS5zZXQobmV3IFRy
YW5zZm9ybU9wZXJhdGlvbnMoKm90aGVyLnZhbHVlKCkpKTsKKyAgICAgICAgICAgIGlmIChvdGhl
ci50aW1pbmdGdW5jdGlvbigpKQorICAgICAgICAgICAgICAgIG1fdGltaW5nRnVuY3Rpb24uc2V0
KG5ldyBUaW1pbmdGdW5jdGlvbigqb3RoZXIudGltaW5nRnVuY3Rpb24oKSkpOworICAgICAgICB9
CisKKyAgICAgICAgY29uc3QgVHJhbnNmb3JtVmFsdWUmIG9wZXJhdG9yPShjb25zdCBUcmFuc2Zv
cm1WYWx1ZSYgb3RoZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgmb3RoZXIgIT0gdGhp
cykKKyAgICAgICAgICAgICAgICBzZXQob3RoZXIua2V5KCksIG90aGVyLnZhbHVlKCksIG90aGVy
LnRpbWluZ0Z1bmN0aW9uKCkpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9
CisKKyAgICAgICAgdm9pZCBzZXQoZmxvYXQga2V5LCBjb25zdCBUcmFuc2Zvcm1PcGVyYXRpb25z
KiB2YWx1ZSwgY29uc3QgVGltaW5nRnVuY3Rpb24qIHRpbWluZ0Z1bmN0aW9uKTsKKworICAgICAg
ICBmbG9hdCBrZXkoKSBjb25zdCB7IHJldHVybiBtX2tleTsgfQorICAgICAgICBjb25zdCBUcmFu
c2Zvcm1PcGVyYXRpb25zKiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWUuZ2V0KCk7IH0K
KyAgICAgICAgY29uc3QgVGltaW5nRnVuY3Rpb24qIHRpbWluZ0Z1bmN0aW9uKCkgY29uc3QgeyBy
ZXR1cm4gbV90aW1pbmdGdW5jdGlvbi5nZXQoKTsgfQorICAgICAgICAKKyAgICBwcml2YXRlOgor
ICAgICAgICBmbG9hdCBtX2tleTsKKyAgICAgICAgT3duUHRyPFRyYW5zZm9ybU9wZXJhdGlvbnM+
IG1fdmFsdWU7CisgICAgICAgIE93blB0cjxUaW1pbmdGdW5jdGlvbj4gbV90aW1pbmdGdW5jdGlv
bjsKKyAgICB9OworICAgIAorICAgIC8vIFVzZWQgdG8gc3RvcmUgYSBzZXJpZXMgb2YgdHJhbnNm
b3JtcyBpbiBhIGtleWZyYW1lIGxpc3QuCisgICAgY2xhc3MgVHJhbnNmb3JtVmFsdWVMaXN0IHsK
KyAgICBwdWJsaWM6CisgICAgICAgIHR5cGVkZWYgVmVjdG9yPFRyYW5zZm9ybU9wZXJhdGlvbjo6
T3BlcmF0aW9uVHlwZT4gRnVuY3Rpb25MaXN0OworCisgICAgICAgIHNpemVfdCBzaXplKCkgY29u
c3QgeyByZXR1cm4gbV92YWx1ZXMuc2l6ZSgpOyB9CisgICAgICAgIGNvbnN0IFRyYW5zZm9ybVZh
bHVlJiBhdChzaXplX3QgaSkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXMuYXQoaSk7IH0KKyAgICAg
ICAgY29uc3QgVmVjdG9yPFRyYW5zZm9ybVZhbHVlPiYgdmFsdWVzKCkgY29uc3QgeyByZXR1cm4g
bV92YWx1ZXM7IH0KKyAgICAgICAgCisgICAgICAgIHZvaWQgaW5zZXJ0KGZsb2F0IGtleSwgY29u
c3QgVHJhbnNmb3JtT3BlcmF0aW9ucyogdmFsdWUsIGNvbnN0IFRpbWluZ0Z1bmN0aW9uKiB0aW1p
bmdGdW5jdGlvbik7CisgICAgICAgIAorICAgICAgICAvLyByZXR1cm4gYSBsaXN0IG9mIHRoZSBy
ZXF1aXJlZCBmdW5jdGlvbnMuIExpc3QgaXMgZW1wdHkgaWYga2V5ZnJhbWVzIGFyZSBub3QgdmFs
aWQKKyAgICAgICAgLy8gSWYgcmV0dXJuIHZhbHVlIGlzIHRydWUsIGZ1bmN0aW9ucyBjb250YWlu
IHJvdGF0aW9ucyBvZiA+PSAxODAgZGVncmVlcworICAgICAgICB2b2lkIG1ha2VGdW5jdGlvbkxp
c3QoRnVuY3Rpb25MaXN0JiBsaXN0LCBib29sJiBpc1ZhbGlkLCBib29sJiBoYXNCaWdSb3RhdGlv
bikgY29uc3Q7CisgICAgcHJpdmF0ZToKKyAgICAgICAgVmVjdG9yPFRyYW5zZm9ybVZhbHVlPiBt
X3ZhbHVlczsKKyAgICB9OworCisgICAgc3RhdGljIEdyYXBoaWNzTGF5ZXIqIGNyZWF0ZUdyYXBo
aWNzTGF5ZXIoR3JhcGhpY3NMYXllckNsaWVudCopOworICAgIAorICAgIHZpcnR1YWwgfkdyYXBo
aWNzTGF5ZXIoKTsKKworICAgIEdyYXBoaWNzTGF5ZXJDbGllbnQqIGNsaWVudCgpIGNvbnN0IHsg
cmV0dXJuIG1fY2xpZW50OyB9CisKKyAgICAvLyBMYXllciBuYW1lLiBPbmx5IHVzZWQgdG8gaWRl
bnRpZnkgbGF5ZXJzIGluIGRlYnVnIG91dHB1dAorICAgIGNvbnN0IFN0cmluZyYgbmFtZSgpIGNv
bnN0IHsgcmV0dXJuIG1fbmFtZTsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXROYW1lKGNvbnN0IFN0
cmluZyYgbmFtZSkgeyBtX25hbWUgPSBuYW1lOyB9CisKKyAgICAvLyBGb3IgaG9zdGluZyB0aGlz
IEdyYXBoaWNzTGF5ZXIgaW4gYSBuYXRpdmUgbGF5ZXIgaGllcmFyY2h5LgorICAgIHZpcnR1YWwg
TmF0aXZlTGF5ZXIgbmF0aXZlTGF5ZXIoKSBjb25zdCB7IHJldHVybiAwOyB9CisKKyAgICBHcmFw
aGljc0xheWVyKiBwYXJlbnQoKSBjb25zdCB7IHJldHVybiBtX3BhcmVudDsgfTsKKyAgICB2b2lk
IHNldFBhcmVudChHcmFwaGljc0xheWVyKiBsYXllcikgeyBtX3BhcmVudCA9IGxheWVyOyB9IC8v
IEludGVybmFsIHVzZSBvbmx5LgorICAgIAorICAgIGNvbnN0IFZlY3RvcjxHcmFwaGljc0xheWVy
Kj4mIGNoaWxkcmVuKCkgY29uc3QgeyByZXR1cm4gbV9jaGlsZHJlbjsgfQorCisgICAgLy8gQWRk
IGNoaWxkIGxheWVycy4gSWYgdGhlIGNoaWxkIGlzIGFscmVhZHkgcGFyZW50ZWQsIGl0IHdpbGwg
YmUgcmVtb3ZlZCBmcm9tIGl0cyBvbGQgcGFyZW50LgorICAgIHZpcnR1YWwgdm9pZCBhZGRDaGls
ZChHcmFwaGljc0xheWVyKik7CisgICAgdmlydHVhbCB2b2lkIGFkZENoaWxkQXRJbmRleChHcmFw
aGljc0xheWVyKiwgaW50IGluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGRBYm92ZShH
cmFwaGljc0xheWVyKiBsYXllciwgR3JhcGhpY3NMYXllciogc2libGluZyk7CisgICAgdmlydHVh
bCB2b2lkIGFkZENoaWxkQmVsb3coR3JhcGhpY3NMYXllciogbGF5ZXIsIEdyYXBoaWNzTGF5ZXIq
IHNpYmxpbmcpOworICAgIHZpcnR1YWwgYm9vbCByZXBsYWNlQ2hpbGQoR3JhcGhpY3NMYXllciog
b2xkQ2hpbGQsIEdyYXBoaWNzTGF5ZXIqIG5ld0NoaWxkKTsKKworICAgIHZvaWQgcmVtb3ZlQWxs
Q2hpbGRyZW4oKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlRnJvbVBhcmVudCgpOworCisgICAg
Ly8gT2Zmc2V0IGlzIG9yaWdpbiBvZiB0aGUgcmVuZGVyZXIgbWludXMgb3JpZ2luIG9mIHRoZSBn
cmFwaGljcyBsYXllciAoc28gZWl0aGVyIHplcm8gb3IgbmVnYXRpdmUpLgorICAgIEludFNpemUg
b2Zmc2V0RnJvbVJlbmRlcmVyKCkgY29uc3QgeyByZXR1cm4gbV9vZmZzZXRGcm9tUmVuZGVyZXI7
IH0KKyAgICB2b2lkIHNldE9mZnNldEZyb21SZW5kZXJlcihjb25zdCBJbnRTaXplJiBvZmZzZXQp
IHsgbV9vZmZzZXRGcm9tUmVuZGVyZXIgPSBvZmZzZXQ7IH0KKworICAgIC8vIFRoZSBwb3NpdGlv
biBvZiB0aGUgbGF5ZXIgKHRoZSBsb2NhdGlvbiBvZiBpdHMgdG9wLWxlZnQgY29ybmVyIGluIGl0
cyBwYXJlbnQpCisgICAgY29uc3QgRmxvYXRQb2ludCYgcG9zaXRpb24oKSBjb25zdCB7IHJldHVy
biBtX3Bvc2l0aW9uOyB9CisgICAgdmlydHVhbCB2b2lkIHNldFBvc2l0aW9uKGNvbnN0IEZsb2F0
UG9pbnQmIHApIHsgbV9wb3NpdGlvbiA9IHA7IH0KKyAgICAKKyAgICAvLyBBbmNob3IgcG9pbnQ6
ICgwLCAwKSBpcyB0b3AgbGVmdCwgKDEsIDEpIGlzIGJvdHRvbSByaWdodC4gVGhlIGFuY2hvciBw
b2ludAorICAgIC8vIGFmZmVjdHMgdGhlIG9yaWdpbiBvZiB0aGUgdHJhbnNmb3Jtcy4KKyAgICBj
b25zdCBGbG9hdFBvaW50M0QmIGFuY2hvclBvaW50KCkgY29uc3QgeyByZXR1cm4gbV9hbmNob3JQ
b2ludDsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRBbmNob3JQb2ludChjb25zdCBGbG9hdFBvaW50
M0QmIHApIHsgbV9hbmNob3JQb2ludCA9IHA7IH0KKworICAgIC8vIFRoZSBib3VuZHMgb2YgdGhl
IGxheWVyCisgICAgY29uc3QgRmxvYXRTaXplJiBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9zaXpl
OyB9CisgICAgdmlydHVhbCB2b2lkIHNldFNpemUoY29uc3QgRmxvYXRTaXplJiBzaXplKSB7IG1f
c2l6ZSA9IHNpemU7IH0KKworICAgIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0cmFuc2Zv
cm0oKSBjb25zdCB7IHJldHVybiBtX3RyYW5zZm9ybTsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRU
cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHQpIHsgbV90cmFuc2Zvcm0gPSB0
OyB9CisKKyAgICBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgY2hpbGRyZW5UcmFuc2Zvcm0o
KSBjb25zdCB7IHJldHVybiBtX2NoaWxkcmVuVHJhbnNmb3JtOyB9CisgICAgdmlydHVhbCB2b2lk
IHNldENoaWxkcmVuVHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KSB7IG1f
Y2hpbGRyZW5UcmFuc2Zvcm0gPSB0OyB9CisKKyAgICBib29sIHByZXNlcnZlczNEKCkgY29uc3Qg
eyByZXR1cm4gbV9wcmVzZXJ2ZXMzRDsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRQcmVzZXJ2ZXMz
RChib29sIGIpIHsgbV9wcmVzZXJ2ZXMzRCA9IGI7IH0KKyAgICAKKyAgICBib29sIG1hc2tzVG9C
b3VuZHMoKSBjb25zdCB7IHJldHVybiBtX21hc2tzVG9Cb3VuZHM7IH0KKyAgICB2aXJ0dWFsIHZv
aWQgc2V0TWFza3NUb0JvdW5kcyhib29sIGIpIHsgbV9tYXNrc1RvQm91bmRzID0gYjsgfQorICAg
IAorICAgIGJvb2wgZHJhd3NDb250ZW50KCkgY29uc3QgeyByZXR1cm4gbV9kcmF3c0NvbnRlbnQ7
IH0KKyAgICB2aXJ0dWFsIHZvaWQgc2V0RHJhd3NDb250ZW50KGJvb2wgYikgeyBtX2RyYXdzQ29u
dGVudCA9IGI7IH0KKworICAgIC8vIFRoZSBjb2xvciB1c2VkIHRvIHBhaW50IHRoZSBsYXllciBi
YWNrZ3JvdW5kcworICAgIGNvbnN0IENvbG9yJiBiYWNrZ3JvdW5kQ29sb3IoKSBjb25zdCB7IHJl
dHVybiBtX2JhY2tncm91bmRDb2xvcjsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRCYWNrZ3JvdW5k
Q29sb3IoY29uc3QgQ29sb3ImLCBjb25zdCBBbmltYXRpb24qID0gMCwgZG91YmxlIGJlZ2luVGlt
ZSA9IDApOworICAgIHZpcnR1YWwgdm9pZCBjbGVhckJhY2tncm91bmRDb2xvcigpOworICAgIGJv
b2wgYmFja2dyb3VuZENvbG9yU2V0KCkgY29uc3QgeyByZXR1cm4gbV9iYWNrZ3JvdW5kQ29sb3JT
ZXQ7IH0KKworICAgIC8vIG9wYXF1ZSBtZWFucyB0aGF0IHdlIGtub3cgdGhlIGxheWVyIGNvbnRl
bnRzIGhhdmUgbm8gYWxwaGEKKyAgICBib29sIGNvbnRlbnRzT3BhcXVlKCkgY29uc3QgeyByZXR1
cm4gbV9jb250ZW50c09wYXF1ZTsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c09wYXF1
ZShib29sIGIpIHsgbV9jb250ZW50c09wYXF1ZSA9IGI7IH0KKworICAgIGJvb2wgYmFja2ZhY2VW
aXNpYmlsaXR5KCkgY29uc3QgeyByZXR1cm4gbV9iYWNrZmFjZVZpc2liaWxpdHk7IH0KKyAgICB2
aXJ0dWFsIHZvaWQgc2V0QmFja2ZhY2VWaXNpYmlsaXR5KGJvb2wgYikgeyBtX2JhY2tmYWNlVmlz
aWJpbGl0eSA9IGI7IH0KKworICAgIGZsb2F0IG9wYWNpdHkoKSBjb25zdCB7IHJldHVybiBtX29w
YWNpdHk7IH0KKyAgICAvLyByZXR1cm4gdHJ1ZSBpZiB3ZSBzdGFydGVkIGFuIGFuaW1hdGlvbgor
ICAgIHZpcnR1YWwgYm9vbCBzZXRPcGFjaXR5KGZsb2F0IG8sIGNvbnN0IEFuaW1hdGlvbiogPSAw
LCBkb3VibGUgYmVnaW5UaW1lID0gMCk7CisKKyAgICAvLyBTb21lIEdyYXBoaWNzTGF5ZXJzIHBh
aW50IG9ubHkgdGhlIGZvcmVncm91bmQgb3IgdGhlIGJhY2tncm91bmQgY29udGVudAorICAgIEdy
YXBoaWNzTGF5ZXJQYWludGluZ1BoYXNlIGRyYXdpbmdQaGFzZSgpIGNvbnN0IHsgcmV0dXJuIG1f
cGFpbnRpbmdQaGFzZTsgfQorICAgIHZvaWQgc2V0RHJhd2luZ1BoYXNlKEdyYXBoaWNzTGF5ZXJQ
YWludGluZ1BoYXNlIHBoYXNlKSB7IG1fcGFpbnRpbmdQaGFzZSA9IHBoYXNlOyB9CisKKyAgICB2
aXJ0dWFsIHZvaWQgc2V0TmVlZHNEaXNwbGF5KCkgPSAwOworICAgIC8vIG1hcmsgdGhlIGdpdmVu
IHJlY3QgKGluIGxheWVyIGNvb3JkcykgYXMgbmVlZGluZyBkaXNwYXkuIE5ldmVyIGdvZXMgZGVl
cC4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IEZsb2F0UmVj
dCYpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBhbmltYXRlVHJhbnNmb3JtKGNvbnN0IFRyYW5z
Zm9ybVZhbHVlTGlzdCYsIGNvbnN0IEludFNpemUmLCBjb25zdCBBbmltYXRpb24qLCBkb3VibGUg
YmVnaW5UaW1lLCBib29sIGlzVHJhbnNpdGlvbikgPSAwOworICAgIHZpcnR1YWwgYm9vbCBhbmlt
YXRlRmxvYXQoQW5pbWF0ZWRQcm9wZXJ0eUlELCBjb25zdCBGbG9hdFZhbHVlTGlzdCYsIGNvbnN0
IEFuaW1hdGlvbiosIGRvdWJsZSBiZWdpblRpbWUpID0gMDsKKyAgICAKKyAgICB2b2lkIHJlbW92
ZUZpbmlzaGVkQW5pbWF0aW9ucyhjb25zdCBTdHJpbmcmIG5hbWUsIGludCBpbmRleCwgYm9vbCBy
ZXNldCk7CisgICAgdm9pZCByZW1vdmVGaW5pc2hlZFRyYW5zaXRpb25zKEFuaW1hdGVkUHJvcGVy
dHlJRCk7CisgICAgdm9pZCByZW1vdmVBbGxBbmltYXRpb25zKCk7CisKKyAgICB2aXJ0dWFsIHZv
aWQgc3VzcGVuZEFuaW1hdGlvbnMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzdW1lQW5pbWF0aW9u
cygpOworICAgIAorICAgIC8vIExheWVyIGNvbnRlbnRzCisgICAgdmlydHVhbCB2b2lkIHNldENv
bnRlbnRzVG9JbWFnZShJbWFnZSopIHsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c1Rv
VmlkZW8oUGxhdGZvcm1MYXllciopIHsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c0Jh
Y2tncm91bmRDb2xvcihjb25zdCBDb2xvciYpIHsgfQorICAgIHZpcnR1YWwgdm9pZCBjbGVhckNv
bnRlbnRzKCkgeyB9CisgICAgCisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZUNvbnRlbnRzUmVjdCgp
IHsgfQorCisgICAgLy8gQ2FsbGJhY2sgZnJvbSB0aGUgdW5kZXJseWluZyBncmFwaGljcyBzeXN0
ZW0gdG8gZHJhdyBsYXllciBjb250ZW50cy4KKyAgICB2b2lkIHBhaW50R3JhcGhpY3NMYXllckNv
bnRlbnRzKEdyYXBoaWNzQ29udGV4dCYsIGNvbnN0IEludFJlY3QmIGNsaXApOworICAgIAorICAg
IHZpcnR1YWwgUGxhdGZvcm1MYXllciogcGxhdGZvcm1MYXllcigpIGNvbnN0IHsgcmV0dXJuIDA7
IH0KKyAgICAKKyAgICB2b2lkIGR1bXBMYXllcihUZXh0U3RyZWFtJiwgaW50IGluZGVudCA9IDAp
IGNvbnN0OworCisjaWZuZGVmIE5ERUJVRworICAgIGludCByZXBhaW50Q291bnQoKSBjb25zdCB7
IHJldHVybiBtX3JlcGFpbnRDb3VudDsgfQorICAgIGludCBpbmNyZW1lbnRSZXBhaW50Q291bnQo
KSB7IHJldHVybiArK21fcmVwYWludENvdW50OyB9CisjZW5kaWYKKworICAgIC8vIFBsYXRmb3Jt
IGJlaGF2aW9ycworICAgIHN0YXRpYyBib29sIGdyYXBoaWNzQ29udGV4dHNGbGlwcGVkKCk7CisK
KyNpZm5kZWYgTkRFQlVHCisgICAgc3RhdGljIGJvb2wgc2hvd0RlYnVnQm9yZGVycygpOworICAg
IHN0YXRpYyBib29sIHNob3dSZXBhaW50Q291bnRlcigpOworICAgIAorICAgIHZvaWQgdXBkYXRl
RGVidWdJbmRpY2F0b3JzKCk7CisgICAgCisgICAgdmlydHVhbCB2b2lkIHNldERlYnVnQmFja2dy
b3VuZENvbG9yKGNvbnN0IENvbG9yJikgeyB9CisgICAgdmlydHVhbCB2b2lkIHNldERlYnVnQm9y
ZGVyKGNvbnN0IENvbG9yJiwgZmxvYXQgLypib3JkZXJXaWR0aCovKSB7IH0KKyAgICAvLyB6LXBv
c2l0aW9uIGlzIHRoZSB6LWVxdWl2YWxlbnQgb2YgcG9zaXRpb24oKS4gSXQncyBvbmx5IHVzZWQg
Zm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKyAgICB2aXJ0dWFsIGZsb2F0IHpQb3NpdGlvbigpIGNv
bnN0IHsgcmV0dXJuIG1felBvc2l0aW9uOyB9CisgICAgdmlydHVhbCB2b2lkIHNldFpQb3NpdGlv
bihmbG9hdCk7CisjZW5kaWYKKworICAgIHN0YXRpYyBTdHJpbmcgcHJvcGVydHlJZFRvU3RyaW5n
KEFuaW1hdGVkUHJvcGVydHlJRCk7CisgICAgCitwcm90ZWN0ZWQ6CisgICAgR3JhcGhpY3NMYXll
cihHcmFwaGljc0xheWVyQ2xpZW50Kik7CisKKyAgICB2b2lkIGR1bXBQcm9wZXJ0aWVzKFRleHRT
dHJlYW0mLCBpbnQgaW5kZW50KSBjb25zdDsKKworICAgIC8vIHJldHVybnMgLTEgaWYgbm90IGZv
dW5kCisgICAgaW50IGZpbmRBbmltYXRpb25FbnRyeShBbmltYXRlZFByb3BlcnR5SUQsIHNob3J0
IGluZGV4KSBjb25zdDsKKyAgICB2b2lkIGFkZEFuaW1hdGlvbkVudHJ5KEFuaW1hdGVkUHJvcGVy
dHlJRCwgc2hvcnQgaW5kZXgsIGJvb2wgaXNUcmFuc2l0aW9uLCBjb25zdCBBbmltYXRpb24qKTsK
KworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVBbmltYXRpb24oaW50IC8qaW5kZXgqLywgYm9vbCAv
KnJlc2V0Ki8pIHt9CisgICAgdm9pZCByZW1vdmVBbGxBbmltYXRpb25zRm9yUHJvcGVydHkoQW5p
bWF0ZWRQcm9wZXJ0eUlEKTsKKworICAgIEdyYXBoaWNzTGF5ZXJDbGllbnQqIG1fY2xpZW50Owor
ICAgIFN0cmluZyBtX25hbWU7CisgICAgCisgICAgLy8gT2Zmc2V0IGZyb20gdGhlIG93bmluZyBy
ZW5kZXJlcgorICAgIEludFNpemUgbV9vZmZzZXRGcm9tUmVuZGVyZXI7CisgICAgCisgICAgLy8g
UG9zaXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIHBhcmVudCBHcmFwaGljc0xheWVyCisgICAgRmxv
YXRQb2ludCBtX3Bvc2l0aW9uOworICAgIEZsb2F0UG9pbnQzRCBtX2FuY2hvclBvaW50OworICAg
IEZsb2F0U2l6ZSBtX3NpemU7CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbV90cmFuc2Zvcm07
CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbV9jaGlsZHJlblRyYW5zZm9ybTsKKworICAgIENv
bG9yIG1fYmFja2dyb3VuZENvbG9yOworICAgIGZsb2F0IG1fb3BhY2l0eTsKKyNpZm5kZWYgTkRF
QlVHCisgICAgZmxvYXQgbV96UG9zaXRpb247CisjZW5kaWYKKworICAgIGJvb2wgbV9iYWNrZ3Jv
dW5kQ29sb3JTZXQgOiAxOworICAgIGJvb2wgbV9jb250ZW50c09wYXF1ZSA6IDE7CisgICAgYm9v
bCBtX3ByZXNlcnZlczNEOiAxOworICAgIGJvb2wgbV9iYWNrZmFjZVZpc2liaWxpdHkgOiAxOwor
ICAgIGJvb2wgbV91c2luZ1RpbGVkTGF5ZXIgOiAxOworICAgIGJvb2wgbV9tYXNrc1RvQm91bmRz
IDogMTsKKyAgICBib29sIG1fZHJhd3NDb250ZW50IDogMTsKKworICAgIEdyYXBoaWNzTGF5ZXJQ
YWludGluZ1BoYXNlIG1fcGFpbnRpbmdQaGFzZTsKKworICAgIFZlY3RvcjxHcmFwaGljc0xheWVy
Kj4gbV9jaGlsZHJlbjsKKyAgICBHcmFwaGljc0xheWVyKiBtX3BhcmVudDsKKyAgICAKKyAgICAv
LyBBbmltYXRpb25FbnRyeSByZXByZXNlbnRzIGFuIGFuaW1hdGlvbiBvZiBhIHByb3BlcnR5IG9u
IHRoaXMgbGF5ZXIuCisgICAgLy8gRm9yIHRyYW5zZm9ybSBvbmx5LCB0aGVyZSBtYXkgYmUgbW9y
ZSB0aGFuIG9uZSwgaW4gd2hpY2ggY2FzZSAnaW5kZXgnCisgICAgLy8gaXMgYW4gaW5kZXggaW50
byB0aGUgbGlzdCBvZiB0cmFuc2Zvcm1zLiAKKyAgICBjbGFzcyBBbmltYXRpb25FbnRyeSB7Cisg
ICAgcHVibGljOgorICAgICAgICBBbmltYXRpb25FbnRyeShjb25zdCBBbmltYXRpb24qIGFuaW1h
dGlvbiwgQW5pbWF0ZWRQcm9wZXJ0eUlEIHByb3BlcnR5LCBzaG9ydCBpbmRleCwgYm9vbCBpc1Ry
YW5zaXRpb24pCisgICAgICAgICAgICA6IG1fYW5pbWF0aW9uKGNvbnN0X2Nhc3Q8QW5pbWF0aW9u
Kj4oYW5pbWF0aW9uKSkKKyAgICAgICAgICAgICwgbV9wcm9wZXJ0eShwcm9wZXJ0eSkKKyAgICAg
ICAgICAgICwgbV9pbmRleChpbmRleCkKKyAgICAgICAgICAgICwgbV9pc0N1cnJlbnQodHJ1ZSkK
KyAgICAgICAgICAgICwgbV9pc1RyYW5zaXRpb24oaXNUcmFuc2l0aW9uKQorICAgICAgICB7Cisg
ICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGNvbnN0IEFuaW1hdGlvbiogYW5pbWF0aW9uKCkg
Y29uc3QgeyByZXR1cm4gbV9hbmltYXRpb24uZ2V0KCk7IH0KKyAgICAgICAgQW5pbWF0ZWRQcm9w
ZXJ0eUlEIHByb3BlcnR5KCkgY29uc3QgeyByZXR1cm4gbV9wcm9wZXJ0eTsgfQorICAgICAgICBp
bnQgaW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2luZGV4OyB9CisgICAgICAgIGJvb2wgaXNDdXJy
ZW50KCkgY29uc3QgeyByZXR1cm4gbV9pc0N1cnJlbnQ7IH0KKyAgICAgICAgdm9pZCBzZXRJc0N1
cnJlbnQoYm9vbCBiID0gdHJ1ZSkgeyBtX2lzQ3VycmVudCA9IGI7IH0KKyAgICAgICAgYm9vbCBp
c1RyYW5zaXRpb24oKSBjb25zdCB7IHJldHVybiBtX2lzVHJhbnNpdGlvbjsgfQorCisgICAgICAg
IGJvb2wgbWF0Y2hlcyhBbmltYXRlZFByb3BlcnR5SUQgcHJvcGVydHksIHNob3J0IGluZGV4KSBj
b25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9wcm9wZXJ0eSA9PSBwcm9wZXJ0
eSAmJiBtX2luZGV4ID09IGluZGV4OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB2b2lk
IHJlc2V0KGNvbnN0IEFuaW1hdGlvbiogYW5pbWF0aW9uLCBib29sIGlzVHJhbnNpdGlvbikKKyAg
ICAgICAgeworICAgICAgICAgICAgbV9hbmltYXRpb24gPSBjb25zdF9jYXN0PEFuaW1hdGlvbio+
KGFuaW1hdGlvbik7CisgICAgICAgICAgICBtX2lzVHJhbnNpdGlvbiA9IGlzVHJhbnNpdGlvbjsK
KyAgICAgICAgICAgIG1faXNDdXJyZW50ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIAorICAgIHBy
aXZhdGU6CisgICAgICAgIFJlZlB0cjxBbmltYXRpb24+IG1fYW5pbWF0aW9uOworICAgICAgICBB
bmltYXRlZFByb3BlcnR5SUQgbV9wcm9wZXJ0eSA6IDE0OworICAgICAgICBzaG9ydCBtX2luZGV4
IDogMTY7CisgICAgICAgIGJvb2wgbV9pc0N1cnJlbnQgOiAxOworICAgICAgICBib29sIG1faXNU
cmFuc2l0aW9uIDogMTsKKyAgICB9OworICAgIAorICAgIFZlY3RvcjxBbmltYXRpb25FbnRyeT4g
bV9hbmltYXRpb25zOyAgICAgIC8vIHJ1bm5pbmcgYW5pbWF0aW9ucy90cmFuc2l0aW9ucworICAg
IAorI2lmbmRlZiBOREVCVUcKKyAgICBpbnQgbV9yZXBhaW50Q291bnQ7CisjZW5kaWYKK307CisK
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQorCisjZW5kaWYgLy8gR3JhcGhpY3NMYXllcl9oCisKZGlmZiAtLWdpdCBhL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllckNsaWVudC5oIGIvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0xheWVyQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uZTcwNWQxNgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NMYXllckNsaWVudC5oCkBAIC0wLDAgKzEsNzAgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
Zm5kZWYgR3JhcGhpY3NMYXllckNsaWVudF9oCisjZGVmaW5lIEdyYXBoaWNzTGF5ZXJDbGllbnRf
aAorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK2NsYXNzIEdyYXBoaWNzQ29udGV4dDsKK2NsYXNzIEdyYXBoaWNzTGF5ZXI7CitjbGFz
cyBJbnRQb2ludDsKK2NsYXNzIEludFJlY3Q7CitjbGFzcyBGbG9hdFBvaW50OworCitlbnVtIEdy
YXBoaWNzTGF5ZXJQYWludGluZ1BoYXNlIHsKKyAgICBHcmFwaGljc0xheWVyUGFpbnRCYWNrZ3Jv
dW5kTWFzayA9ICgxIDw8IDApLAorICAgIEdyYXBoaWNzTGF5ZXJQYWludEZvcmVncm91bmRNYXNr
ID0gKDEgPDwgMSksCisgICAgR3JhcGhpY3NMYXllclBhaW50QWxsTWFzayA9IChHcmFwaGljc0xh
eWVyUGFpbnRCYWNrZ3JvdW5kTWFzayB8IEdyYXBoaWNzTGF5ZXJQYWludEZvcmVncm91bmRNYXNr
KQorfTsKKworZW51bSBBbmltYXRlZFByb3BlcnR5SUQgeworICAgIEFuaW1hdGVkUHJvcGVydHlJ
bnZhbGlkLAorICAgIEFuaW1hdGVkUHJvcGVydHlXZWJraXRUcmFuc2Zvcm0sCisgICAgQW5pbWF0
ZWRQcm9wZXJ0eU9wYWNpdHksCisgICAgQW5pbWF0ZWRQcm9wZXJ0eUJhY2tncm91bmRDb2xvcgor
fTsKKworY2xhc3MgR3JhcGhpY3NMYXllckNsaWVudCB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+
R3JhcGhpY3NMYXllckNsaWVudCgpIHt9CisKKyAgICAvLyBDYWxsYmFja3MgZm9yIHdoZW4gaGFy
ZHdhcmUtYWNjZWxlcmF0ZWQgdHJhbnNpdGlvbnMgYW5kIGFuaW1hdGlvbiBzdGFydGVkCisgICAg
dmlydHVhbCB2b2lkIG5vdGlmeVRyYW5zaXRpb25TdGFydGVkKGNvbnN0IEdyYXBoaWNzTGF5ZXIq
LCBBbmltYXRlZFByb3BlcnR5SUQsIGRvdWJsZSB0aW1lKSA9IDA7CisgICAgdmlydHVhbCB2b2lk
IG5vdGlmeUFuaW1hdGlvblN0YXJ0ZWQoY29uc3QgR3JhcGhpY3NMYXllciosIGRvdWJsZSB0aW1l
KSA9IDA7CisgICAgCisgICAgdmlydHVhbCB2b2lkIHBhaW50Q29udGVudHMoY29uc3QgR3JhcGhp
Y3NMYXllciosIEdyYXBoaWNzQ29udGV4dCYsIEdyYXBoaWNzTGF5ZXJQYWludGluZ1BoYXNlLCBj
b25zdCBJbnRSZWN0JiBpbkNsaXApID0gMDsKKworICAgIC8vIFJldHVybiBhIHJlY3QgZm9yIHRo
ZSAiY29udGVudHMiIG9mIHRoZSBncmFwaGljcyBsYXllciwgaS5lLiB2aWRlbyBvciBpbWFnZSBj
b250ZW50LCBpbiBHcmFwaGljc0xheWVyIGNvb3JkaW5hdGVzLgorICAgIHZpcnR1YWwgSW50UmVj
dCBjb250ZW50c0JveChjb25zdCBHcmFwaGljc0xheWVyKikgPSAwOworfTsKKworfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQor
CisjZW5kaWYgLy8gR3JhcGhpY3NMYXllckNsaWVudF9oCmRpZmYgLS1naXQgYS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0xheWVyQ0EuaCBiL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvbWFjL0dyYXBoaWNzTGF5ZXJDQS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLjUzMzIxODIKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL21hYy9HcmFwaGljc0xheWVyQ0EuaApAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBH
cmFwaGljc0xheWVyQ0FfaAorI2RlZmluZSBHcmFwaGljc0xheWVyQ0FfaAorCisjaWYgVVNFKEFD
Q0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjaW5jbHVkZSAiR3JhcGhpY3NMYXllci5oIgorI2lu
Y2x1ZGUgPHd0Zi9SZXRhaW5QdHIuaD4KKworQGNsYXNzIFdlYkFuaW1hdGlvbkRlbGVnYXRlOwor
QGNsYXNzIFdlYkxheWVyOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEdyYXBoaWNz
TGF5ZXJDQSA6IHB1YmxpYyBHcmFwaGljc0xheWVyIHsKK3B1YmxpYzoKKworICAgIEdyYXBoaWNz
TGF5ZXJDQShHcmFwaGljc0xheWVyQ2xpZW50Kik7CisgICAgdmlydHVhbCB+R3JhcGhpY3NMYXll
ckNBKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TmFtZShjb25zdCBTdHJpbmcmKTsKKworICAg
IC8vIGZvciBob3N0aW5nIHRoaXMgR3JhcGhpY3NMYXllciBpbiBhIG5hdGl2ZSBsYXllciBoaWVy
YXJjaHkKKyAgICB2aXJ0dWFsIE5hdGl2ZUxheWVyIG5hdGl2ZUxheWVyKCkgY29uc3Q7CisKKyAg
ICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGQoR3JhcGhpY3NMYXllciopOworICAgIHZpcnR1YWwgdm9p
ZCBhZGRDaGlsZEF0SW5kZXgoR3JhcGhpY3NMYXllciosIGludCBpbmRleCk7CisgICAgdmlydHVh
bCB2b2lkIGFkZENoaWxkQWJvdmUoR3JhcGhpY3NMYXllciogbGF5ZXIsIEdyYXBoaWNzTGF5ZXIq
IHNpYmxpbmcpOworICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZEJlbG93KEdyYXBoaWNzTGF5ZXIq
IGxheWVyLCBHcmFwaGljc0xheWVyKiBzaWJsaW5nKTsKKyAgICB2aXJ0dWFsIGJvb2wgcmVwbGFj
ZUNoaWxkKEdyYXBoaWNzTGF5ZXIqIG9sZENoaWxkLCBHcmFwaGljc0xheWVyKiBuZXdDaGlsZCk7
CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlRnJvbVBhcmVudCgpOworCisgICAgdmlydHVhbCB2
b2lkIHNldFBvc2l0aW9uKGNvbnN0IEZsb2F0UG9pbnQmKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0
QW5jaG9yUG9pbnQoY29uc3QgRmxvYXRQb2ludDNEJik7CisgICAgdmlydHVhbCB2b2lkIHNldFNp
emUoY29uc3QgRmxvYXRTaXplJik7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0VHJhbnNmb3JtKGNv
bnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4Jik7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q2hpbGRy
ZW5UcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmKTsKKworICAgIHZpcnR1YWwg
dm9pZCBzZXRQcmVzZXJ2ZXMzRChib29sKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TWFza3NUb0Jv
dW5kcyhib29sKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0RHJhd3NDb250ZW50KGJvb2wpOworCisg
ICAgdmlydHVhbCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihjb25zdCBDb2xvciYsIGNvbnN0IEFu
aW1hdGlvbiogYW5pbSA9IDAsIGRvdWJsZSBiZWdpblRpbWUgPSAwKTsKKyAgICB2aXJ0dWFsIHZv
aWQgY2xlYXJCYWNrZ3JvdW5kQ29sb3IoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50
c09wYXF1ZShib29sKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QmFja2ZhY2VWaXNpYmlsaXR5KGJv
b2wpOworCisgICAgLy8gcmV0dXJuIHRydWUgaWYgd2Ugc3RhcnRlZCBhbiBhbmltYXRpb24KKyAg
ICB2aXJ0dWFsIGJvb2wgc2V0T3BhY2l0eShmbG9hdCwgY29uc3QgQW5pbWF0aW9uKiBhbmltID0g
MCwgZG91YmxlIGJlZ2luVGltZSA9IDApOworCisgICAgdmlydHVhbCB2b2lkIHNldE5lZWRzRGlz
cGxheSgpOworICAgIHZpcnR1YWwgdm9pZCBzZXROZWVkc0Rpc3BsYXlJblJlY3QoY29uc3QgRmxv
YXRSZWN0Jik7CisKKyAgICB2aXJ0dWFsIHZvaWQgc3VzcGVuZEFuaW1hdGlvbnMoKTsKKyAgICB2
aXJ0dWFsIHZvaWQgcmVzdW1lQW5pbWF0aW9ucygpOworCisgICAgdmlydHVhbCBib29sIGFuaW1h
dGVUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtVmFsdWVMaXN0JiwgY29uc3QgSW50U2l6ZSYsIGNv
bnN0IEFuaW1hdGlvbiosIGRvdWJsZSBiZWdpblRpbWUsIGJvb2wgaXNUcmFuc2l0aW9uKTsKKyAg
ICB2aXJ0dWFsIGJvb2wgYW5pbWF0ZUZsb2F0KEFuaW1hdGVkUHJvcGVydHlJRCwgY29uc3QgRmxv
YXRWYWx1ZUxpc3QmLCBjb25zdCBBbmltYXRpb24qLCBkb3VibGUgYmVnaW5UaW1lKTsKKworICAg
IHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c1RvSW1hZ2UoSW1hZ2UqKTsKKyAgICB2aXJ0dWFsIHZv
aWQgc2V0Q29udGVudHNUb1ZpZGVvKFBsYXRmb3JtTGF5ZXIqKTsKKyAgICB2aXJ0dWFsIHZvaWQg
Y2xlYXJDb250ZW50cygpOworICAgIAorICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVDb250ZW50c1Jl
Y3QoKTsKKworICAgIHZpcnR1YWwgUGxhdGZvcm1MYXllciogcGxhdGZvcm1MYXllcigpIGNvbnN0
OworCisjaWZuZGVmIE5ERUJVRworICAgIHZpcnR1YWwgdm9pZCBzZXREZWJ1Z0JhY2tncm91bmRD
b2xvcihjb25zdCBDb2xvciYpOworICAgIHZpcnR1YWwgdm9pZCBzZXREZWJ1Z0JvcmRlcihjb25z
dCBDb2xvciYsIGZsb2F0IGJvcmRlcldpZHRoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0WlBvc2l0
aW9uKGZsb2F0KTsKKyNlbmRpZgorCitwcml2YXRlOgorICAgIFdlYkxheWVyKiBwcmltYXJ5TGF5
ZXIoKSBjb25zdCAgeyByZXR1cm4gbV90cmFuc2Zvcm1MYXllci5nZXQoKSA/IG1fdHJhbnNmb3Jt
TGF5ZXIuZ2V0KCkgOiBtX2xheWVyLmdldCgpOyB9CisgICAgV2ViTGF5ZXIqIGhvc3RMYXllckZv
clN1YmxheWVycygpIGNvbnN0OworICAgIFdlYkxheWVyKiBsYXllckZvclN1cGVybGF5ZXIoKSBj
b25zdDsKKworICAgIFdlYkxheWVyKiBhbmltYXRlZExheWVyKEFuaW1hdGVkUHJvcGVydHlJRCBw
cm9wZXJ0eSkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAocHJvcGVydHkgPT0gQW5pbWF0
ZWRQcm9wZXJ0eUJhY2tncm91bmRDb2xvcikgPyBtX2NvbnRlbnRzTGF5ZXIuZ2V0KCkgOiBwcmlt
YXJ5TGF5ZXIoKTsKKyAgICB9CisKKyAgICB2b2lkIHNldEJhc2ljQW5pbWF0aW9uKEFuaW1hdGVk
UHJvcGVydHlJRCwgY29uc3QgU3RyaW5nJiBjb21wb25lbnQsIHNob3J0IGluZGV4LCB2b2lkKiBm
cm9tVmFsLCB2b2lkKiB0b1ZhbCwgYm9vbCBpc1RyYW5zaXRpb24sIGNvbnN0IEFuaW1hdGlvbios
IGRvdWJsZSB0aW1lKTsKKyAgICB2b2lkIHNldEtleWZyYW1lQW5pbWF0aW9uKEFuaW1hdGVkUHJv
cGVydHlJRCwgY29uc3QgU3RyaW5nJiBjb21wb25lbnQsIHNob3J0IGluZGV4LCB2b2lkKiBrZXlz
LCB2b2lkKiB2YWx1ZXMsIHZvaWQqIHRpbWluZ0Z1bmN0aW9ucywgYm9vbCBpc1RyYW5zaXRpb24s
IGNvbnN0IEFuaW1hdGlvbiosIGRvdWJsZSB0aW1lKTsKKworICAgIHZpcnR1YWwgdm9pZCByZW1v
dmVBbmltYXRpb24oaW50IGluZGV4LCBib29sIHJlc2V0KTsKKworICAgIGJvb2wgcmVxdWlyZXNU
aWxlZExheWVyKGNvbnN0IEZsb2F0U2l6ZSYpIGNvbnN0OworICAgIHZvaWQgc3dhcEZyb21PclRv
VGlsZWRMYXllcihib29sIHVzZVRpbGVkTGF5ZXIpOworCisgICAgdm9pZCBzZXRIYXNDb250ZW50
c0xheWVyKGJvb2wpOworICAgIHZvaWQgc2V0Q29udGVudHNMYXllcihXZWJMYXllciopOworICAg
IHZvaWQgc2V0Q29udGVudHNMYXllckZsaXBwZWQoYm9vbCk7CisgICAgCisgICAgUmV0YWluUHRy
PFdlYkxheWVyPiBtX2xheWVyOworICAgIFJldGFpblB0cjxXZWJMYXllcj4gbV90cmFuc2Zvcm1M
YXllcjsKKyAgICBSZXRhaW5QdHI8V2ViTGF5ZXI+IG1fY29udGVudHNMYXllcjsKKworICAgIFJl
dGFpblB0cjxXZWJBbmltYXRpb25EZWxlZ2F0ZT4gbV9hbmltYXRpb25EZWxlZ2F0ZTsKKworICAg
IGJvb2wgbV9jb250ZW50TGF5ZXJGb3JJbWFnZU9yVmlkZW87Cit9OworCit9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCisKKworI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKwor
I2VuZGlmIC8vIEdyYXBoaWNzTGF5ZXJDQV9oCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL21hYy9HcmFwaGljc0xheWVyQ0EubW0gYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL21hYy9HcmFwaGljc0xheWVyQ0EubW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMC4uNTVhYjFiZQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvbWFjL0dyYXBoaWNzTGF5ZXJDQS5tbQpAQCAtMCwwICsxLDE0ODIgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbXBvcnQgImNv
bmZpZy5oIgorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjaW1wb3J0ICJH
cmFwaGljc0xheWVyQ0EuaCIKKworLy8gVGVtcG9yYXJ5CisjaW1wb3J0IDxRdWFydHpDb3JlL0NB
QW5pbWF0aW9uUHJpdmF0ZS5oPgorI2ltcG9ydCA8UXVhcnR6Q29yZS9DQVZhbHVlRnVuY3Rpb24u
aD4KKworI2ltcG9ydCAiQW5pbWF0aW9uLmgiCisjaW1wb3J0ICJCbG9ja0V4Y2VwdGlvbnMuaCIK
KyNpbXBvcnQgIkNTdHJpbmcuaCIKKyNpbXBvcnQgIkZsb2F0UmVjdC5oIgorI2ltcG9ydCAiSW1h
Z2UuaCIKKyNpbXBvcnQgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW1wb3J0IDxRdWFydHpDb3JlL1F1
YXJ0ekNvcmUuaD4KKyNpbXBvcnQgIlJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbi5oIgorI2ltcG9y
dCAiU2NhbGVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKKyNpbXBvcnQgIlN5c3RlbVRpbWUuaCIKKyNp
bXBvcnQgIlRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbi5oIgorI2ltcG9ydCAiV2ViTGF5ZXIu
aCIKKyNpbXBvcnQgIldlYlRpbGVkTGF5ZXIuaCIKKyNpbXBvcnQgPHd0Zi9DdXJyZW50VGltZS5o
PgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIFRo
ZSB0aHJlc2hvbGQgd2lkdGggb3IgaGVpZ2h0IGFib3ZlIHdoaWNoIGEgdGlsZWQgbGF5ZXIgd2ls
bCBiZSB1c2VkLiBUaGlzIHNob3VsZCBiZQorLy8gbGFyZ2UgZW5vdWdoIHRvIGF2b2lkIHRpbGVk
IGxheWVycyBmb3IgbW9zdCBHcmFwaGljc0xheWVycywgYnV0IGxlc3MgdGhhbiB0aGUgT3BlbkdM
CisvLyB0ZXh0dXJlIHNpemUgbGltaXQgb24gYWxsIHN1cHBvcnRlZCBoYXJkd2FyZS4KK3N0YXRp
YyBjb25zdCBpbnQgY01heFBpeGVsRGltZW5zaW9uID0gMjAwMDsKKworLy8gVGhlIHdpZHRoIGFu
ZCBoZWlnaHQgb2YgYSBzaW5nbGUgdGlsZSBpbiBhIHRpbGVkIGxheWVyLiBTaG91bGQgYmUgbGFy
Z2UgZW5vdWdoIHRvCisvLyBhdm9pZCBsb3RzIG9mIHNtYWxsIHRpbGVzIChhbmQgdGhlcmVmb3Jl
IGxvdHMgb2YgZHJhd2luZyBjYWxsYmFja3MpLCBidXQgc21hbGwgZW5vdWdoCisvLyB0byBrZWVw
IHRoZSBvdmVyYWxsIHRpbGUgY29zdCBsb3cuCitzdGF0aWMgY29uc3QgaW50IGNUaWxlZExheWVy
VGlsZVNpemUgPSA1MTI7CisKKy8vIElmIHdlIHNlbmQgYSBkdXJhdGlvbiBvZiAwIHRvIENBLCB0
aGVuIGl0IHdpbGwgdXNlIHRoZSBkZWZhdWx0IGR1cmF0aW9uCisvLyBvZiAyNTBtcy4gU28gc2Vu
ZCBhIHZlcnkgc21hbGwgdmFsdWUgaW5zdGVhZC4KK3N0YXRpYyBjb25zdCBmbG9hdCBjQW5pbWF0
aW9uQWxtb3N0WmVyb0R1cmF0aW9uID0gMWUtM2Y7CisKKy8vIENBQ3VycmVudE1lZGlhVGltZSgp
IGlzIGEgdGltZSBzaW5jZSBib290LiBUaGVzZSBtZXRob2RzIGNvbnZlcnQgYmV0d2VlbiB0aGF0
IGFuZAorLy8gV2ViQ29yZSB0aW1lLCB3aGljaCBpcyBzeXN0ZW0gdGltZSAoVVRDKS4KK3N0YXRp
YyBDRlRpbWVJbnRlcnZhbCBjdXJyZW50VGltZVRvTWVkaWFUaW1lKGRvdWJsZSB0KQoreworICAg
IHJldHVybiBDQUN1cnJlbnRNZWRpYVRpbWUoKSArIHQgLSBXVEY6OmN1cnJlbnRUaW1lKCk7Cit9
CisKK3N0YXRpYyBkb3VibGUgbWVkaWFUaW1lVG9DdXJyZW50VGltZShDRlRpbWVJbnRlcnZhbCB0
KQoreworICAgIHJldHVybiBXVEY6OmN1cnJlbnRUaW1lKCkgKyB0IC0gQ0FDdXJyZW50TWVkaWFU
aW1lKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworc3RhdGljIE5TU3RyaW5nKiBj
b25zdCBXZWJBbmltYXRpb25DU1NQcm9wZXJ0eUtleSA9IEAiR3JhcGhpY3NMYXllckNBX3Byb3Bl
cnR5IjsKKworQGludGVyZmFjZSBXZWJBbmltYXRpb25EZWxlZ2F0ZSA6IE5TT2JqZWN0IHsKKyAg
ICBXZWJDb3JlOjpHcmFwaGljc0xheWVyQ0EqIG1fZ3JhcGhpY3NMYXllcjsKK30KKworLSAodm9p
ZClhbmltYXRpb25EaWRTdGFydDooQ0FBbmltYXRpb24gKilhbmltOworLSAoV2ViQ29yZTo6R3Jh
cGhpY3NMYXllckNBKilncmFwaGljc0xheWVyOworLSAodm9pZClzZXRMYXllcjooV2ViQ29yZTo6
R3JhcGhpY3NMYXllckNBKilncmFwaGljc0xheWVyOworCitAZW5kCisKK0BpbXBsZW1lbnRhdGlv
biBXZWJBbmltYXRpb25EZWxlZ2F0ZQorCistICh2b2lkKWFuaW1hdGlvbkRpZFN0YXJ0OihDQUFu
aW1hdGlvbiAqKWFuaW1hdGlvbgoreworICAgIGlmICghbV9ncmFwaGljc0xheWVyKQorICAgICAg
ICByZXR1cm47CisKKyAgICBkb3VibGUgc3RhcnRUaW1lID0gV2ViQ29yZTo6bWVkaWFUaW1lVG9D
dXJyZW50VGltZShbYW5pbWF0aW9uIGJlZ2luVGltZV0pOworICAgIFdlYkNvcmU6OkFuaW1hdGVk
UHJvcGVydHlJRCBwcm9wID0gc3RhdGljX2Nhc3Q8V2ViQ29yZTo6QW5pbWF0ZWRQcm9wZXJ0eUlE
PihbW2FuaW1hdGlvbiB2YWx1ZUZvcktleTpXZWJBbmltYXRpb25DU1NQcm9wZXJ0eUtleV0gaW50
VmFsdWVdKTsKKyAgICBpZiAocHJvcCAhPSBXZWJDb3JlOjpBbmltYXRlZFByb3BlcnR5SW52YWxp
ZCkKKyAgICAgICAgbV9ncmFwaGljc0xheWVyLT5jbGllbnQoKS0+bm90aWZ5VHJhbnNpdGlvblN0
YXJ0ZWQobV9ncmFwaGljc0xheWVyLCBwcm9wLCBzdGFydFRpbWUpOworICAgIGVsc2UKKyAgICAg
ICAgbV9ncmFwaGljc0xheWVyLT5jbGllbnQoKS0+bm90aWZ5QW5pbWF0aW9uU3RhcnRlZChtX2dy
YXBoaWNzTGF5ZXIsIHN0YXJ0VGltZSk7Cit9CisKKy0gKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJD
QSopZ3JhcGhpY3NMYXllcgoreworICAgIHJldHVybiBtX2dyYXBoaWNzTGF5ZXI7Cit9CisKKy0g
KHZvaWQpc2V0TGF5ZXI6KFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJDQSopZ3JhcGhpY3NMYXllcgor
eworICAgIG1fZ3JhcGhpY3NMYXllciA9IGdyYXBoaWNzTGF5ZXI7Cit9CisKK0BlbmQKKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworCitpbmxpbmUgdm9pZCBjb3B5VHJhbnNmb3JtKENBVHJhbnNmb3Jt
M0QmIHRvVDNELCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCkKK3sKKyAgICB0b1QzRCA9
IENBVHJhbnNmb3JtM0RNYWtlQWZmaW5lVHJhbnNmb3JtKHQpOworfQorCitUcmFuc2Zvcm1hdGlv
bk1hdHJpeCBDQVRvVHJhbnNmb3JtM0QoY29uc3QgQ0FUcmFuc2Zvcm0zRCYgZnJvbVQzRCkKK3sK
KyAgICByZXR1cm4gVHJhbnNmb3JtYXRpb25NYXRyaXgoQ0FUcmFuc2Zvcm0zREdldEFmZmluZVRy
YW5zZm9ybShmcm9tVDNEKSk7Cit9CisKK3N0YXRpYyBOU1ZhbHVlKiBnZXRUcmFuc2Zvcm1GdW5j
dGlvblZhbHVlKGNvbnN0IEdyYXBoaWNzTGF5ZXI6OlRyYW5zZm9ybVZhbHVlJiB0cmFuc2Zvcm1W
YWx1ZSwgc2l6ZV90IGluZGV4LCBjb25zdCBJbnRTaXplJiBzaXplLCBUcmFuc2Zvcm1PcGVyYXRp
b246Ok9wZXJhdGlvblR5cGUgdHJhbnNmb3JtVHlwZSkKK3sKKyAgICBUcmFuc2Zvcm1PcGVyYXRp
b24qIG9wID0gKGluZGV4ID49IHRyYW5zZm9ybVZhbHVlLnZhbHVlKCktPm9wZXJhdGlvbnMoKS5z
aXplKCkpID8gMCA6IHRyYW5zZm9ybVZhbHVlLnZhbHVlKCktPm9wZXJhdGlvbnMoKVtpbmRleF0u
Z2V0KCk7CisgICAgCisgICAgc3dpdGNoICh0cmFuc2Zvcm1UeXBlKSB7CisgICAgICAgIGNhc2Ug
VHJhbnNmb3JtT3BlcmF0aW9uOjpST1RBVEU6CisgICAgICAgICAgICByZXR1cm4gW05TTnVtYmVy
IG51bWJlcldpdGhEb3VibGU6b3AgPyAoZmxvYXQpIChzdGF0aWNfY2FzdDxSb3RhdGVUcmFuc2Zv
cm1PcGVyYXRpb24qPihvcCktPmFuZ2xlKCkgKiBNX1BJIC8gMTgwKSA6IDBdOworCisgICAgICAg
IGNhc2UgVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV9YOgorICAgICAgICAgICAgcmV0dXJuIFtO
U051bWJlciBudW1iZXJXaXRoRG91YmxlOm9wID8gc3RhdGljX2Nhc3Q8U2NhbGVUcmFuc2Zvcm1P
cGVyYXRpb24qPihvcCktPngoKSA6IDBdOworICAgICAgICBjYXNlIFRyYW5zZm9ybU9wZXJhdGlv
bjo6U0NBTEVfWToKKyAgICAgICAgICAgIHJldHVybiBbTlNOdW1iZXIgbnVtYmVyV2l0aERvdWJs
ZTpvcCA/IHN0YXRpY19jYXN0PFNjYWxlVHJhbnNmb3JtT3BlcmF0aW9uKj4ob3ApLT55KCkgOiAw
XTsKKworICAgICAgICBjYXNlIFRyYW5zZm9ybU9wZXJhdGlvbjo6VFJBTlNMQVRFX1g6CisgICAg
ICAgICAgICByZXR1cm4gW05TTnVtYmVyIG51bWJlcldpdGhEb3VibGU6b3AgPyBzdGF0aWNfY2Fz
dDxUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb24qPihvcCktPngoc2l6ZSkgOiAwXTsKKyAgICAg
ICAgY2FzZSBUcmFuc2Zvcm1PcGVyYXRpb246OlRSQU5TTEFURV9ZOgorICAgICAgICAgICAgcmV0
dXJuIFtOU051bWJlciBudW1iZXJXaXRoRG91YmxlOm9wID8gc3RhdGljX2Nhc3Q8VHJhbnNsYXRl
VHJhbnNmb3JtT3BlcmF0aW9uKj4ob3ApLT54KHNpemUpIDogMF07CisgICAgICAgIAorICAgICAg
ICBjYXNlIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0NBTEU6CisgICAgICAgIGNhc2UgVHJhbnNmb3Jt
T3BlcmF0aW9uOjpUUkFOU0xBVEU6CisgICAgICAgIGNhc2UgVHJhbnNmb3JtT3BlcmF0aW9uOjpT
S0VXX1g6CisgICAgICAgIGNhc2UgVHJhbnNmb3JtT3BlcmF0aW9uOjpTS0VXX1k6CisgICAgICAg
IGNhc2UgVHJhbnNmb3JtT3BlcmF0aW9uOjpTS0VXOgorICAgICAgICBjYXNlIFRyYW5zZm9ybU9w
ZXJhdGlvbjo6TUFUUklYOgorICAgICAgICBjYXNlIFRyYW5zZm9ybU9wZXJhdGlvbjo6SURFTlRJ
VFk6CisgICAgICAgIGNhc2UgVHJhbnNmb3JtT3BlcmF0aW9uOjpOT05FOiB7CisgICAgICAgICAg
ICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0OworICAgICAgICAgICAgaWYgKG9wKQorICAgICAgICAg
ICAgICAgIG9wLT5hcHBseSh0LCBzaXplKTsKKyAgICAgICAgICAgIENBVHJhbnNmb3JtM0QgY2F0
OworICAgICAgICAgICAgY29weVRyYW5zZm9ybShjYXQsIHQpOworICAgICAgICAgICAgcmV0dXJu
IFtOU1ZhbHVlIHZhbHVlV2l0aENBVHJhbnNmb3JtM0Q6Y2F0XTsKKyAgICAgICAgfQorICAgIH0K
KyAgICAKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIFN0cmluZyBnZXRBbmltYXRpb25WYWx1
ZUZ1bmN0aW9uKFRyYW5zZm9ybU9wZXJhdGlvbjo6T3BlcmF0aW9uVHlwZSB0cmFuc2Zvcm1UeXBl
KQoreworICAgIHN3aXRjaCAodHJhbnNmb3JtVHlwZSkgeworICAgICAgICBjYXNlIFRyYW5zZm9y
bU9wZXJhdGlvbjo6Uk9UQVRFOgorICAgICAgICAgICAgcmV0dXJuICJyb3RhdGVaIjsKKyAgICAg
ICAgY2FzZSBUcmFuc2Zvcm1PcGVyYXRpb246OlNDQUxFX1g6CisgICAgICAgICAgICByZXR1cm4g
InNjYWxlWCI7CisgICAgICAgIGNhc2UgVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV9ZOgorICAg
ICAgICAgICAgcmV0dXJuICJzY2FsZVkiOworICAgICAgICBjYXNlIFRyYW5zZm9ybU9wZXJhdGlv
bjo6VFJBTlNMQVRFX1g6CisgICAgICAgICAgICByZXR1cm4gInRyYW5zbGF0ZVgiOworICAgICAg
ICBjYXNlIFRyYW5zZm9ybU9wZXJhdGlvbjo6VFJBTlNMQVRFX1k6CisgICAgICAgICAgICByZXR1
cm4gInRyYW5zbGF0ZVkiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFN0
cmluZygpOworICAgIH0KK30KKworc3RhdGljIENBTWVkaWFUaW1pbmdGdW5jdGlvbiogZ2V0Q0FN
ZWRpYVRpbWluZ0Z1bmN0aW9uKGNvbnN0IFRpbWluZ0Z1bmN0aW9uJiB0aW1pbmdGdW5jdGlvbikK
K3sKKyAgICBzd2l0Y2ggKHRpbWluZ0Z1bmN0aW9uLnR5cGUoKSkgeworICAgICAgICBjYXNlIExp
bmVhclRpbWluZ0Z1bmN0aW9uOgorICAgICAgICAgICAgcmV0dXJuIFtDQU1lZGlhVGltaW5nRnVu
Y3Rpb24gZnVuY3Rpb25XaXRoTmFtZTpAImxpbmVhciJdOworICAgICAgICBjYXNlIEN1YmljQmV6
aWVyVGltaW5nRnVuY3Rpb246CisgICAgICAgICAgICByZXR1cm4gW0NBTWVkaWFUaW1pbmdGdW5j
dGlvbiBmdW5jdGlvbldpdGhDb250cm9sUG9pbnRzOnN0YXRpY19jYXN0PGZsb2F0Pih0aW1pbmdG
dW5jdGlvbi54MSgpKSA6c3RhdGljX2Nhc3Q8ZmxvYXQ+KHRpbWluZ0Z1bmN0aW9uLnkxKCkpCisg
ICAgICAgICAgICAgICAgICAgICAgICA6c3RhdGljX2Nhc3Q8ZmxvYXQ+KHRpbWluZ0Z1bmN0aW9u
LngyKCkpIDpzdGF0aWNfY2FzdDxmbG9hdD4odGltaW5nRnVuY3Rpb24ueTIoKSldOworICAgIH0K
KyAgICByZXR1cm4gMDsKK30KKworI2lmbmRlZiBOREVCVUcKK3N0YXRpYyB2b2lkIHNldExheWVy
Qm9yZGVyQ29sb3IoUGxhdGZvcm1MYXllciogbGF5ZXIsIGNvbnN0IENvbG9yJiBjb2xvcikKK3sK
KyAgICBDR0NvbG9yUmVmIGJvcmRlckNvbG9yID0gY2dDb2xvcihjb2xvcik7CisgICAgW2xheWVy
IHNldEJvcmRlckNvbG9yOmJvcmRlckNvbG9yXTsKKyAgICBDR0NvbG9yUmVsZWFzZShib3JkZXJD
b2xvcik7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyQm9yZGVyQ29sb3IoUGxhdGZvcm1MYXllciog
bGF5ZXIpCit7CisgICAgW2xheWVyIHNldEJvcmRlckNvbG9yOm5pbF07Cit9CisjZW5kaWYKKwor
c3RhdGljIHZvaWQgc2V0TGF5ZXJCYWNrZ3JvdW5kQ29sb3IoUGxhdGZvcm1MYXllciogbGF5ZXIs
IGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBDR0NvbG9yUmVmIGJnQ29sb3IgPSBjZ0NvbG9y
KGNvbG9yKTsKKyAgICBbbGF5ZXIgc2V0QmFja2dyb3VuZENvbG9yOmJnQ29sb3JdOworICAgIENH
Q29sb3JSZWxlYXNlKGJnQ29sb3IpOworfQorCitzdGF0aWMgdm9pZCBjbGVhckxheWVyQmFja2dy
b3VuZENvbG9yKFBsYXRmb3JtTGF5ZXIqIGxheWVyKQoreworICAgIFtsYXllciBzZXRCYWNrZ3Jv
dW5kQ29sb3I6MF07Cit9CisKK3N0YXRpYyBDQUxheWVyKiBnZXRQcmVzZW50YXRpb25MYXllcihD
QUxheWVyKiBsYXllcikKK3sKKyAgICBDQUxheWVyKiAgcHJlc0xheWVyID0gW2xheWVyIHByZXNl
bnRhdGlvbkxheWVyXTsKKyAgICBpZiAoIXByZXNMYXllcikKKyAgICAgICAgcHJlc0xheWVyID0g
bGF5ZXI7CisKKyAgICByZXR1cm4gcHJlc0xheWVyOworfQorCitib29sIEdyYXBoaWNzTGF5ZXI6
OmdyYXBoaWNzQ29udGV4dHNGbGlwcGVkKCkKK3sKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworI2lm
bmRlZiBOREVCVUcKK2Jvb2wgR3JhcGhpY3NMYXllcjo6c2hvd0RlYnVnQm9yZGVycygpCit7Cisg
ICAgc3RhdGljIGludCBzaG93RGVidWdCb3JkZXJzID0gW1tOU1VzZXJEZWZhdWx0cyBzdGFuZGFy
ZFVzZXJEZWZhdWx0c10gYm9vbEZvcktleTpAIldlYkNvcmVMYXllckJvcmRlcnMiXTsKKyAgICBy
ZXR1cm4gc2hvd0RlYnVnQm9yZGVyczsKK30KKworYm9vbCBHcmFwaGljc0xheWVyOjpzaG93UmVw
YWludENvdW50ZXIoKQoreworICAgIHN0YXRpYyBpbnQgc2hvd1JlcGFpbnRDb3VudGVyID0gW1tO
U1VzZXJEZWZhdWx0cyBzdGFuZGFyZFVzZXJEZWZhdWx0c10gYm9vbEZvcktleTpAIldlYkNvcmVM
YXllclJlcGFpbnRDb3VudGVyIl07CisgICAgcmV0dXJuIHNob3dSZXBhaW50Q291bnRlcjsKK30K
KyNlbmRpZgorCitzdGF0aWMgTlNEaWN0aW9uYXJ5KiBudWxsQWN0aW9uc0RpY3Rpb25hcnkoKQor
eworICAgIE5TTnVsbCogbnVsbFZhbHVlID0gW05TTnVsbCBudWxsXTsKKyAgICBOU0RpY3Rpb25h
cnkqIGFjdGlvbnMgPSBbTlNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2JqZWN0c0FuZEtleXM6
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxWYWx1ZSwgQCJhbmNob3JQb2ludCIs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxWYWx1ZSwgQCJib3VuZHMiLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsVmFsdWUsIEAiY29udGVudHMiLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBudWxsVmFsdWUsIEAiY29udGVudHNSZWN0IiwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgbnVsbFZhbHVlLCBAIm9wYWNpdHkiLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBudWxsVmFsdWUsIEAicG9zaXRpb24iLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBudWxsVmFsdWUsIEAic2hhZG93Q29sb3IiLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBudWxsVmFsdWUsIEAic3VibGF5ZXJUcmFuc2Zvcm0iLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBudWxsVmFsdWUsIEAic3VibGF5ZXJzIiwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgbnVsbFZhbHVlLCBAInRyYW5zZm9ybSIsCisjaWZuZGVmIE5E
RUJVRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsVmFsdWUsIEAielBvc2l0aW9u
IiwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWxdOworICAgIHJldHVy
biBhY3Rpb25zOworfQorCitHcmFwaGljc0xheWVyKiBHcmFwaGljc0xheWVyOjpjcmVhdGVHcmFw
aGljc0xheWVyKEdyYXBoaWNzTGF5ZXJDbGllbnQqIGNsaWVudCkKK3sKKyAgICByZXR1cm4gbmV3
IEdyYXBoaWNzTGF5ZXJDQShjbGllbnQpOworfQorCitHcmFwaGljc0xheWVyQ0E6OkdyYXBoaWNz
TGF5ZXJDQShHcmFwaGljc0xheWVyQ2xpZW50KiBjbGllbnQpCis6IEdyYXBoaWNzTGF5ZXIoY2xp
ZW50KQorLCBtX2NvbnRlbnRMYXllckZvckltYWdlT3JWaWRlbyhmYWxzZSkKK3sKKyAgICBCRUdJ
Tl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICBtX2xheWVyLmFkb3B0TlMoW1tXZWJMYXllciBh
bGxvY10gaW5pdF0pOworICAgIFttX2xheWVyLmdldCgpIHNldExheWVyT3duZXI6dGhpc107CisK
KyNpZm5kZWYgTkRFQlVHCisgICAgdXBkYXRlRGVidWdJbmRpY2F0b3JzKCk7CisjZW5kaWYKKwor
ICAgIG1fYW5pbWF0aW9uRGVsZWdhdGUuYWRvcHROUyhbW1dlYkFuaW1hdGlvbkRlbGVnYXRlIGFs
bG9jXSBpbml0XSk7CisgICAgW21fYW5pbWF0aW9uRGVsZWdhdGUuZ2V0KCkgc2V0TGF5ZXI6dGhp
c107CisgICAgCisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUworfQorCitHcmFwaGljc0xh
eWVyQ0E6On5HcmFwaGljc0xheWVyQ0EoKQoreworICAgIC8vIFJlbW92ZSBhIGlubmVyIGxheWVy
IGlmIHRoZXJlIGlzIG9uZS4KKyAgICBjbGVhckNvbnRlbnRzKCk7CisKKyAgICBCRUdJTl9CTE9D
S19PQkpDX0VYQ0VQVElPTlMKKworICAgIC8vIENsZWFuIHVwIHRoZSBXSyBsYXllci4KKyAgICBp
ZiAobV9sYXllcikgeworICAgICAgICBXZWJMYXllciogbGF5ZXIgPSBtX2xheWVyLmdldCgpOwor
ICAgICAgICBbbGF5ZXIgc2V0TGF5ZXJPd25lcjpuaWxdOworICAgICAgICBbbGF5ZXIgcmVtb3Zl
RnJvbVN1cGVybGF5ZXJdOworICAgIH0KKyAgICAKKyAgICBpZiAobV90cmFuc2Zvcm1MYXllcikK
KyAgICAgICAgW21fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkgcmVtb3ZlRnJvbVN1cGVybGF5ZXJdOwor
CisgICAgLy8gYW5pbWF0aW9uRGlkU3RhcnQ6IGNhbiBmaXJlIGFmdGVyIHRoaXMsIHNvIHdlIG5l
ZWQgdG8gY2xlYXIgb3V0IHRoZSBsYXllciBvbiB0aGUgZGVsZWdhdGUuCisgICAgW21fYW5pbWF0
aW9uRGVsZWdhdGUuZ2V0KCkgc2V0TGF5ZXI6MF07CisKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENF
UFRJT05TCit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjpzZXROYW1lKGNvbnN0IFN0cmluZyYg
bmFtZSkKK3sKKyAgICBTdHJpbmcgbG9uZ05hbWUgPSBTdHJpbmc6OmZvcm1hdCgiQ0FMYXllcigl
cCkgR3JhcGhpY3NMYXllciglcCkgIiwgbV9sYXllci5nZXQoKSwgdGhpcykgKyBuYW1lOworICAg
IEdyYXBoaWNzTGF5ZXI6OnNldE5hbWUobG9uZ05hbWUpOworICAgIAorICAgIEJFR0lOX0JMT0NL
X09CSkNfRVhDRVBUSU9OUworICAgIFttX2xheWVyLmdldCgpIHNldE5hbWU6bmFtZV07CisgICAg
RU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUworfQorCitOYXRpdmVMYXllciBHcmFwaGljc0xheWVy
Q0E6Om5hdGl2ZUxheWVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9sYXllci5nZXQoKTsKK30K
Kwordm9pZCBHcmFwaGljc0xheWVyQ0E6OmFkZENoaWxkKEdyYXBoaWNzTGF5ZXIqIGNoaWxkTGF5
ZXIpCit7CisgICAgR3JhcGhpY3NMYXllcjo6YWRkQ2hpbGQoY2hpbGRMYXllcik7CisKKyAgICBH
cmFwaGljc0xheWVyQ0EqIGNoaWxkTGF5ZXJDQSA9IHN0YXRpY19jYXN0PEdyYXBoaWNzTGF5ZXJD
QSo+KGNoaWxkTGF5ZXIpOworICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgIFto
b3N0TGF5ZXJGb3JTdWJsYXllcnMoKSBhZGRTdWJsYXllcjpjaGlsZExheWVyQ0EtPmxheWVyRm9y
U3VwZXJsYXllcigpXTsKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCit9CisKK3ZvaWQg
R3JhcGhpY3NMYXllckNBOjphZGRDaGlsZEF0SW5kZXgoR3JhcGhpY3NMYXllciogY2hpbGRMYXll
ciwgaW50IGluZGV4KQoreworICAgIEdyYXBoaWNzTGF5ZXI6OmFkZENoaWxkQXRJbmRleChjaGls
ZExheWVyLCBpbmRleCk7CisKKyAgICBHcmFwaGljc0xheWVyQ0EqIGNoaWxkTGF5ZXJDQSA9IHN0
YXRpY19jYXN0PEdyYXBoaWNzTGF5ZXJDQSo+KGNoaWxkTGF5ZXIpOworICAgIEJFR0lOX0JMT0NL
X09CSkNfRVhDRVBUSU9OUworICAgIFtob3N0TGF5ZXJGb3JTdWJsYXllcnMoKSBpbnNlcnRTdWJs
YXllcjpjaGlsZExheWVyQ0EtPmxheWVyRm9yU3VwZXJsYXllcigpIGF0SW5kZXg6aW5kZXhdOwor
ICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0E6
OmFkZENoaWxkQmVsb3coR3JhcGhpY3NMYXllciogY2hpbGRMYXllciwgR3JhcGhpY3NMYXllciog
c2libGluZykKK3sKKyAgICAvLyBGSVhNRTogc2hhcmUgY29kZSB3aXRoIGJhc2UgY2xhc3MKKyAg
ICBBU1NFUlQoY2hpbGRMYXllciAhPSB0aGlzKTsKKyAgICBjaGlsZExheWVyLT5yZW1vdmVGcm9t
UGFyZW50KCk7CisKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IG1fY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKHNpYmxpbmcg
PT0gbV9jaGlsZHJlbltpXSkgeworICAgICAgICAgICAgbV9jaGlsZHJlbi5pbnNlcnQoaSwgY2hp
bGRMYXllcik7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgIH0KKyAgICBjaGlsZExheWVyLT5zZXRQYXJlbnQodGhpcyk7CisKKyAg
ICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKworICAgIEdyYXBoaWNzTGF5ZXJDQSogY2hp
bGRMYXllckNBID0gc3RhdGljX2Nhc3Q8R3JhcGhpY3NMYXllckNBKj4oY2hpbGRMYXllcik7Cisg
ICAgR3JhcGhpY3NMYXllckNBKiBzaWJsaW5nTGF5ZXJDQSA9IHN0YXRpY19jYXN0PEdyYXBoaWNz
TGF5ZXJDQSo+KHNpYmxpbmcpOworICAgIGlmIChmb3VuZCkKKyAgICAgICAgW2hvc3RMYXllckZv
clN1YmxheWVycygpIGluc2VydFN1YmxheWVyOmNoaWxkTGF5ZXJDQS0+bGF5ZXJGb3JTdXBlcmxh
eWVyKCkgYmVsb3c6c2libGluZ0xheWVyQ0EtPmxheWVyRm9yU3VwZXJsYXllcigpXTsKKyAgICBl
bHNlIHsKKyAgICAgICAgbV9jaGlsZHJlbi5hcHBlbmQoY2hpbGRMYXllcik7CisgICAgICAgIFto
b3N0TGF5ZXJGb3JTdWJsYXllcnMoKSBhZGRTdWJsYXllcjpjaGlsZExheWVyQ0EtPmxheWVyRm9y
U3VwZXJsYXllcigpXTsKKyAgICB9CisKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCit9
CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjphZGRDaGlsZEFib3ZlKEdyYXBoaWNzTGF5ZXIqIGNo
aWxkTGF5ZXIsIEdyYXBoaWNzTGF5ZXIqIHNpYmxpbmcpCit7CisgICAgLy8gRklYTUU6IHNoYXJl
IGNvZGUgd2l0aCBiYXNlIGNsYXNzCisgICAgQVNTRVJUKGNoaWxkTGF5ZXIgIT0gdGhpcyk7Cisg
ICAgY2hpbGRMYXllci0+cmVtb3ZlRnJvbVBhcmVudCgpOworCisgICAgdW5zaWduZWQgaTsKKyAg
ICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgZm9yIChpID0gMDsgaSA8IG1fY2hpbGRyZW4uc2l6
ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKHNpYmxpbmcgPT0gbV9jaGlsZHJlbltpXSkgeworICAg
ICAgICAgICAgbV9jaGlsZHJlbi5pbnNlcnQoaSsxLCBjaGlsZExheWVyKTsKKyAgICAgICAgICAg
IGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAg
IGNoaWxkTGF5ZXItPnNldFBhcmVudCh0aGlzKTsKKworICAgIEJFR0lOX0JMT0NLX09CSkNfRVhD
RVBUSU9OUworCisgICAgR3JhcGhpY3NMYXllckNBKiBjaGlsZExheWVyQ0EgPSBzdGF0aWNfY2Fz
dDxHcmFwaGljc0xheWVyQ0EqPihjaGlsZExheWVyKTsKKyAgICBHcmFwaGljc0xheWVyQ0EqIHNp
YmxpbmdMYXllckNBID0gc3RhdGljX2Nhc3Q8R3JhcGhpY3NMYXllckNBKj4oc2libGluZyk7Cisg
ICAgaWYgKGZvdW5kKSB7CisgICAgICAgIFtob3N0TGF5ZXJGb3JTdWJsYXllcnMoKSBpbnNlcnRT
dWJsYXllcjpjaGlsZExheWVyQ0EtPmxheWVyRm9yU3VwZXJsYXllcigpIGFib3ZlOnNpYmxpbmdM
YXllckNBLT5sYXllckZvclN1cGVybGF5ZXIoKV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV9j
aGlsZHJlbi5hcHBlbmQoY2hpbGRMYXllcik7CisgICAgICAgIFtob3N0TGF5ZXJGb3JTdWJsYXll
cnMoKSBhZGRTdWJsYXllcjpjaGlsZExheWVyQ0EtPmxheWVyRm9yU3VwZXJsYXllcigpXTsKKyAg
ICB9CisKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCit9CisKK2Jvb2wgR3JhcGhpY3NM
YXllckNBOjpyZXBsYWNlQ2hpbGQoR3JhcGhpY3NMYXllciogb2xkQ2hpbGQsIEdyYXBoaWNzTGF5
ZXIqIG5ld0NoaWxkKQoreworICAgIC8vIEZJWE1FOiBzaGFyZSBjb2RlIHdpdGggYmFzZSBjbGFz
cworICAgIEFTU0VSVCghbmV3Q2hpbGQtPnBhcmVudCgpKTsKKworICAgIGJvb2wgZm91bmQgPSBm
YWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9jaGlsZHJlbi5zaXplKCk7IGkr
KykgeworICAgICAgICBpZiAob2xkQ2hpbGQgPT0gbV9jaGlsZHJlbltpXSkgeworICAgICAgICAg
ICAgbV9jaGlsZHJlbltpXSA9IG5ld0NoaWxkOworICAgICAgICAgICAgZm91bmQgPSB0cnVlOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZm91bmQpIHsK
KyAgICAgICAgb2xkQ2hpbGQtPnNldFBhcmVudCgwKTsKKworICAgICAgICBuZXdDaGlsZC0+cmVt
b3ZlRnJvbVBhcmVudCgpOworICAgICAgICBuZXdDaGlsZC0+c2V0UGFyZW50KHRoaXMpOworCisg
ICAgICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgICAgICBHcmFwaGljc0xheWVy
Q0EqIG9sZENoaWxkQ0EgPSBzdGF0aWNfY2FzdDxHcmFwaGljc0xheWVyQ0EqPihvbGRDaGlsZCk7
CisgICAgICAgIEdyYXBoaWNzTGF5ZXJDQSogbmV3Q2hpbGRDQSA9IHN0YXRpY19jYXN0PEdyYXBo
aWNzTGF5ZXJDQSo+KG5ld0NoaWxkKTsKKyAgICAgICAgW2hvc3RMYXllckZvclN1YmxheWVycygp
IHJlcGxhY2VTdWJsYXllcjpvbGRDaGlsZENBLT5sYXllckZvclN1cGVybGF5ZXIoKSB3aXRoOm5l
d0NoaWxkQ0EtPmxheWVyRm9yU3VwZXJsYXllcigpXTsKKyAgICAgICAgRU5EX0JMT0NLX09CSkNf
RVhDRVBUSU9OUworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNl
OworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6cmVtb3ZlRnJvbVBhcmVudCgpCit7CisgICAg
R3JhcGhpY3NMYXllcjo6cmVtb3ZlRnJvbVBhcmVudCgpOworCisgICAgQkVHSU5fQkxPQ0tfT0JK
Q19FWENFUFRJT05TCisgICAgW2xheWVyRm9yU3VwZXJsYXllcigpIHJlbW92ZUZyb21TdXBlcmxh
eWVyXTsgICAgICAgICAgICAKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCit9CisKK3Zv
aWQgR3JhcGhpY3NMYXllckNBOjpzZXRQb3NpdGlvbihjb25zdCBGbG9hdFBvaW50JiBwb2ludCkK
K3sKKyAgICAvLyBEb24ndCBzaG9ydC1jaXJjdWl0IGhlcmUsIGJlY2F1c2UgcG9zaXRpb24gYW5k
IGFuY2hvciBwb2ludCBhcmUgaW50ZXItZGVwZW5kZW50LgorICAgIEdyYXBoaWNzTGF5ZXI6OnNl
dFBvc2l0aW9uKHBvaW50KTsKKworICAgIC8vIFBvc2l0aW9uIGlzIG9mZnNldCBvbiB0aGUgbGF5
ZXIgYnkgdGhlIGxheWVyIGFuY2hvciBwb2ludC4KKyAgICBDR1BvaW50IHBvc1BvaW50ID0gQ0dQ
b2ludE1ha2UobV9wb3NpdGlvbi54KCkgKyBtX2FuY2hvclBvaW50LngoKSAqIG1fc2l6ZS53aWR0
aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3Bvc2l0aW9uLnkoKSAr
IG1fYW5jaG9yUG9pbnQueSgpICogbV9zaXplLmhlaWdodCgpKTsKKyAgICAKKyAgICBCRUdJTl9C
TE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICBbcHJpbWFyeUxheWVyKCkgc2V0UG9zaXRpb246cG9z
UG9pbnRdOworICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKK30KKwordm9pZCBHcmFwaGlj
c0xheWVyQ0E6OnNldEFuY2hvclBvaW50KGNvbnN0IEZsb2F0UG9pbnQzRCYgcG9pbnQpCit7Cisg
ICAgLy8gRG9uJ3Qgc2hvcnQtY2lyY3VpdCBoZXJlLCBiZWNhdXNlIHBvc2l0aW9uIGFuZCBhbmNo
b3IgcG9pbnQgYXJlIGludGVyLWRlcGVuZGVudC4KKyAgICBib29sIHpDaGFuZ2VkID0gKHBvaW50
LnooKSAhPSBtX2FuY2hvclBvaW50LnooKSk7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0QW5jaG9y
UG9pbnQocG9pbnQpOworCisgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgLy8g
c2V0IHRoZSB2YWx1ZSBvbiB0aGUgbGF5ZXIgdG8gdGhlIG5ldyB0cmFuc2Zvcm0uCisgICAgW3By
aW1hcnlMYXllcigpIHNldEFuY2hvclBvaW50OkZsb2F0UG9pbnQocG9pbnQueCgpLCBwb2ludC55
KCkpXTsKKworICAgIGlmICh6Q2hhbmdlZCkgCisgICAgICAgIFtwcmltYXJ5TGF5ZXIoKSBzZXRB
bmNob3JQb2ludFo6bV9hbmNob3JQb2ludC56KCldOworCisgICAgLy8gUG9zaXRpb24gZGVwZW5k
cyBvbiBhbmNob3IgcG9pbnQsIHNvIHVwZGF0ZSBpdCBub3cuCisgICAgc2V0UG9zaXRpb24obV9w
b3NpdGlvbik7CisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUworfQorCit2b2lkIEdyYXBo
aWNzTGF5ZXJDQTo6c2V0U2l6ZShjb25zdCBGbG9hdFNpemUmIHNpemUpCit7CisgICAgR3JhcGhp
Y3NMYXllcjo6c2V0U2l6ZShzaXplKTsKKworICAgIENHUmVjdCByZWN0ID0gQ0dSZWN0TWFrZSgw
LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjBmLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBtX3NpemUud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbV9zaXplLmhlaWdodCgpKTsKKyAgICAKKyAgICBDR1BvaW50IGNlbnRlclBvaW50ID0gQ0dQ
b2ludE1ha2UobV9zaXplLndpZHRoKCkgLyAyLjBmLCBtX3NpemUuaGVpZ2h0KCkgLyAyLjBmKTsK
KyAgICAKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKworICAgIGlmIChtX3RyYW5z
Zm9ybUxheWVyKSB7CisgICAgICAgIFttX3RyYW5zZm9ybUxheWVyLmdldCgpIHNldEJvdW5kczpy
ZWN0XTsKKyAgICAKKyAgICAgICAgLy8gdGhlIGFuY2hvciBvZiB0aGUgY29udGVudHMgbGF5ZXIg
aXMgYWx3YXlzIGF0IDAuNSwgMC41LCBzbyB0aGUgcG9zaXRpb24KKyAgICAgICAgLy8gaXMgY2Vu
dGVyLXJlbGF0aXZlCisgICAgICAgIFttX2xheWVyLmdldCgpIHNldFBvc2l0aW9uOmNlbnRlclBv
aW50XTsKKyAgICB9CisgICAgCisgICAgYm9vbCBuZWVkVGlsZWRMYXllciA9IHJlcXVpcmVzVGls
ZWRMYXllcihtX3NpemUpOworICAgIGlmIChuZWVkVGlsZWRMYXllciAhPSBtX3VzaW5nVGlsZWRM
YXllcikKKyAgICAgICAgc3dhcEZyb21PclRvVGlsZWRMYXllcihuZWVkVGlsZWRMYXllcik7Cisg
ICAgCisgICAgW21fbGF5ZXIuZ2V0KCkgc2V0Qm91bmRzOnJlY3RdOworCisgICAgLy8gTm90ZSB0
aGF0IHdlIGRvbid0IHJlc2l6ZSBtX2NvbnRlbnRzTGF5ZXIuIEl0J3MgdXAgdGhlIGNhbGxlciB0
byBkbyB0aGF0LgorCisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUworCisgICAgLy8gaWYg
d2UndmUgY2hhbmdlZCB0aGUgYm91bmRzLCB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIHRoZSBwb3Np
dGlvbgorICAgIC8vIG9mIHRoZSBsYXllciwgdGFraW5nIGFuY2hvciBwb2ludCBpbnRvIGFjY291
bnQKKyAgICBzZXRQb3NpdGlvbihtX3Bvc2l0aW9uKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVy
Q0E6OnNldFRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCkKK3sKKyAgICBH
cmFwaGljc0xheWVyOjpzZXRUcmFuc2Zvcm0odCk7CisgICAgCisgICAgQkVHSU5fQkxPQ0tfT0JK
Q19FWENFUFRJT05TCisgICAgQ0FUcmFuc2Zvcm0zRCB0cmFuc2Zvcm07CisgICAgY29weVRyYW5z
Zm9ybSh0cmFuc2Zvcm0sIHQpOworICAgIFtwcmltYXJ5TGF5ZXIoKSBzZXRUcmFuc2Zvcm06dHJh
bnNmb3JtXTsKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgCisgICAgLy8gUmVt
b3ZlIGFueSBvbGQgdHJhbnNpdGlvbiBlbnRyaWVzIGZvciB0cmFuc2Zvcm0uCisgICAgcmVtb3Zl
QWxsQW5pbWF0aW9uc0ZvclByb3BlcnR5KEFuaW1hdGVkUHJvcGVydHlXZWJraXRUcmFuc2Zvcm0p
OworCisgICAgLy8gRXZlbiBpZiB3ZSBkb24ndCBoYXZlIGEgdHJhbnNpdGlvbiBpbiB0aGUgbGlz
dCwgdGhlIGxheWVyIG1heSBzdGlsbCBoYXZlIG9uZS4KKyAgICAvLyBUaGlzIGhhcHBlbnMgd2hl
biB3ZSBhcmUgc2V0dGluZyB0aGUgZmluYWwgdHJhbnNmb3JtIHZhbHVlIGFmdGVyIGFuIGFuaW1h
dGlvbiBvcgorICAgIC8vIHRyYW5zaXRpb24gaGFzIGVuZGVkLiBJbiByZW1vdmVBbmltYXRpb24g
d2UgdG9zcyB0aGUgZW50cnkgZnJvbSB0aGUgbGlzdCBidXQgZG9uJ3QKKyAgICAvLyByZW1vdmUg
aXQgZnJvbSB0aGUgbGlzdC4gVGhhdCB3YXkgd2UgYXJlbid0IGluIGRhbmdlciBvZiBkaXNwbGF5
aW5nIGEgc3RhbGUgdHJhbnNmb3JtCisgICAgLy8gaW4gdGhlIHRpbWUgYmV0d2VlbiByZW1vdmlu
ZyB0aGUgYW5pbWF0aW9uIGFuZCBzZXR0aW5nIHRoZSBuZXcgdW5hbmltYXRlZCB2YWx1ZS4gV2Ug
CisgICAgLy8gY2FuJ3QgZG8gdGhpcyBpbiByZW1vdmVBbmltYXRpb24gYmVjYXVzZSB3ZSBkb24n
dCBrbm93IHRoZSBuZXcgdHJhbnNmb3JtIHZhbHVlIHRoZXJlLgorICAgIFN0cmluZyBrZXlQYXRo
ID0gcHJvcGVydHlJZFRvU3RyaW5nKEFuaW1hdGVkUHJvcGVydHlXZWJraXRUcmFuc2Zvcm0pOwor
ICAgIENBTGF5ZXIqIGxheWVyID0gYW5pbWF0ZWRMYXllcihBbmltYXRlZFByb3BlcnR5V2Via2l0
VHJhbnNmb3JtKTsKKyAgICAKKyAgICBmb3IgKGludCBpID0gMDsgOyArK2kpIHsKKyAgICAgICAg
U3RyaW5nIGFuaW1OYW1lID0ga2V5UGF0aCArICJfIiArIFN0cmluZzo6bnVtYmVyKGkpOworICAg
ICAgICBpZiAoIVtsYXllciBhbmltYXRpb25Gb3JLZXk6IGFuaW1OYW1lXSkKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICBbbGF5ZXIgcmVtb3ZlQW5pbWF0aW9uRm9yS2V5OmFuaW1OYW1lXTsK
KyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjpzZXRDaGlsZHJlblRyYW5zZm9ybShj
b25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCkKK3sKKyAgICBpZiAodCA9PSBtX2NoaWxkcmVu
VHJhbnNmb3JtKQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRDaGls
ZHJlblRyYW5zZm9ybSh0KTsKKworICAgIENBVHJhbnNmb3JtM0QgdHJhbnNmb3JtOworICAgIGNv
cHlUcmFuc2Zvcm0odHJhbnNmb3JtLCB0KTsKKworICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBU
SU9OUworICAgIC8vIFNldCB0aGUgdmFsdWUgb24gdGhlIGxheWVyIHRvIHRoZSBuZXcgdHJhbnNm
b3JtLgorICAgIFtwcmltYXJ5TGF5ZXIoKSBzZXRTdWJsYXllclRyYW5zZm9ybTp0cmFuc2Zvcm1d
OworICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKK30KKworc3RhdGljIHZvaWQgbW92ZUFu
aW1hdGlvbihBbmltYXRlZFByb3BlcnR5SUQgcHJvcGVydHksIENBTGF5ZXIqIGZyb21MYXllciwg
Q0FMYXllciogdG9MYXllcikKK3sKKyAgICBTdHJpbmcga2V5UGF0aCA9IEdyYXBoaWNzTGF5ZXI6
OnByb3BlcnR5SWRUb1N0cmluZyhwcm9wZXJ0eSk7CisgICAgZm9yIChzaG9ydCBpbmRleCA9IDA7
IDsgKytpbmRleCkgeworICAgICAgICBTdHJpbmcgYW5pbU5hbWUgPSBrZXlQYXRoICsgIl8iICsg
U3RyaW5nOjpudW1iZXIoaW5kZXgpOworICAgICAgICBDQUFuaW1hdGlvbiogYW5pbSA9IFtmcm9t
TGF5ZXIgYW5pbWF0aW9uRm9yS2V5OmFuaW1OYW1lXTsKKyAgICAgICAgaWYgKCFhbmltKQorICAg
ICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgW2FuaW0gcmV0YWluXTsKKyAgICAgICAgW2Zyb21M
YXllciByZW1vdmVBbmltYXRpb25Gb3JLZXk6YW5pbU5hbWVdOworICAgICAgICBbdG9MYXllciBh
ZGRBbmltYXRpb246YW5pbSBmb3JLZXk6YW5pbU5hbWVdOworICAgICAgICBbYW5pbSByZWxlYXNl
XTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG1vdmVTdWJsYXllcnMoQ0FMYXllciogZnJvbUxh
eWVyLCBDQUxheWVyKiB0b0xheWVyKQoreworICAgIE5TQXJyYXkqIHN1YmxheWVyc0NvcHkgPSBb
W2Zyb21MYXllciBzdWJsYXllcnNdIGNvcHldOyAvLyBBdm9pZCBtdXRhdGlvbiB3aGlsZSBlbnVt
ZXJhdGluZywgYW5kIGtlZXAgdGhlIHN1YmxheWVycyBhbGl2ZS4KKyAgICBOU0VudW1lcmF0b3Iq
IGNoaWxkcmVuRW51bWVyYXRvciA9IFtzdWJsYXllcnNDb3B5IG9iamVjdEVudW1lcmF0b3JdOwor
CisgICAgQ0FMYXllciogbGF5ZXI7CisgICAgd2hpbGUgKChsYXllciA9IFtjaGlsZHJlbkVudW1l
cmF0b3IgbmV4dE9iamVjdF0pICE9IG5pbCkgeworICAgICAgICBbbGF5ZXIgcmVtb3ZlRnJvbVN1
cGVybGF5ZXJdOworICAgICAgICBbdG9MYXllciBhZGRTdWJsYXllcjpsYXllcl07CisgICAgfQor
ICAgIFtzdWJsYXllcnNDb3B5IHJlbGVhc2VdOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6
c2V0UHJlc2VydmVzM0QoYm9vbCBwcmVzZXJ2ZXMzRCkKK3sKKyAgICBHcmFwaGljc0xheWVyOjpz
ZXRQcmVzZXJ2ZXMzRChwcmVzZXJ2ZXMzRCk7CisKKyAgICBDR1BvaW50IHBvaW50ID0gQ0dQb2lu
dE1ha2UobV9zaXplLndpZHRoKCkgLyAyLjBmLCBtX3NpemUuaGVpZ2h0KCkgLyAyLjBmKTsKKyAg
ICBDR1BvaW50IGNlbnRlclBvaW50ID0gQ0dQb2ludE1ha2UoMC41ZiwgMC41Zik7CisgICAgCisg
ICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisKKyAgICBpZiAocHJlc2VydmVzM0QgJiYg
IW1fdHJhbnNmb3JtTGF5ZXIpIHsKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSB0cmFuc2Zvcm0gbGF5
ZXIuCisgICAgICAgIG1fdHJhbnNmb3JtTGF5ZXIuYWRvcHROUyhbW0NBVHJhbnNmb3JtTGF5ZXIg
YWxsb2NdIGluaXRdKTsKKworICAgICAgICAvLyBUdXJuIG9mZiBkZWZhdWx0IGFuaW1hdGlvbnMu
CisgICAgICAgIFttX3RyYW5zZm9ybUxheWVyLmdldCgpIHNldFN0eWxlOltOU0RpY3Rpb25hcnkg
ZGljdGlvbmFyeVdpdGhPYmplY3Q6bnVsbEFjdGlvbnNEaWN0aW9uYXJ5KCkgZm9yS2V5OkAiYWN0
aW9ucyJdXTsKKyAgICAgICAgCisjaWZuZGVmIE5ERUJVRworICAgICAgICBbbV90cmFuc2Zvcm1M
YXllci5nZXQoKSBzZXROYW1lOltOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiVHJhbnNmb3Jt
IExheWVyIENBVHJhbnNmb3JtTGF5ZXIoJXApIEdyYXBoaWNzTGF5ZXIoJXApIiwgbV90cmFuc2Zv
cm1MYXllci5nZXQoKSwgdGhpc11dOworI2VuZGlmCisgICAgICAgIC8vIENvcHkgdGhlIHBvc2l0
aW9uIGZyb20gdGhpcyBsYXllci4KKyAgICAgICAgW21fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkgc2V0
Qm91bmRzOlttX2xheWVyLmdldCgpIGJvdW5kc11dOworICAgICAgICBbbV90cmFuc2Zvcm1MYXll
ci5nZXQoKSBzZXRQb3NpdGlvbjpbbV9sYXllci5nZXQoKSBwb3NpdGlvbl1dOworICAgICAgICBb
bV90cmFuc2Zvcm1MYXllci5nZXQoKSBzZXRBbmNob3JQb2ludDpbbV9sYXllci5nZXQoKSBhbmNo
b3JQb2ludF1dOworICAgICAgICBbbV90cmFuc2Zvcm1MYXllci5nZXQoKSBzZXRBbmNob3JQb2lu
dFo6W21fbGF5ZXIuZ2V0KCkgYW5jaG9yUG9pbnRaXV07CisgICAgICAgIFttX3RyYW5zZm9ybUxh
eWVyLmdldCgpIHNldENvbnRlbnRzUmVjdDpbbV9sYXllci5nZXQoKSBjb250ZW50c1JlY3RdXTsK
KyNpZm5kZWYgTkRFQlVHCisgICAgICAgIFttX3RyYW5zZm9ybUxheWVyLmdldCgpIHNldFpQb3Np
dGlvbjpbbV9sYXllci5nZXQoKSB6UG9zaXRpb25dXTsKKyNlbmRpZgorICAgICAgICAKKyAgICAg
ICAgLy8gVGhlIGNvbnRlbnRzIGxheWVyIGlzIHBvc2l0aW9uZWQgYXQgKDAsMCkgcmVsYXRpdmUg
dG8gdGhlIHRyYW5zZm9ybUxheWVyLgorICAgICAgICBbbV9sYXllci5nZXQoKSBzZXRQb3NpdGlv
bjpwb2ludF07CisgICAgICAgIFttX2xheWVyLmdldCgpIHNldEFuY2hvclBvaW50OmNlbnRlclBv
aW50XTsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgIFttX2xheWVyLmdldCgpIHNldFpQb3NpdGlv
bjowLjBmXTsKKyNlbmRpZgorICAgICAgICAKKyAgICAgICAgLy8gVHJhbnNmZXIgdGhlIHRyYW5z
Zm9ybSBvdmVyLgorICAgICAgICBbbV90cmFuc2Zvcm1MYXllci5nZXQoKSBzZXRUcmFuc2Zvcm06
W21fbGF5ZXIuZ2V0KCkgdHJhbnNmb3JtXV07CisgICAgICAgIFttX2xheWVyLmdldCgpIHNldFRy
YW5zZm9ybTpDQVRyYW5zZm9ybTNESWRlbnRpdHldOworICAgICAgICAKKyAgICAgICAgLy8gVHJh
bnNmZXIgdGhlIG9wYWNpdHkgZnJvbSB0aGUgb2xkIGxheWVyIHRvIHRoZSB0cmFuc2Zvcm0gbGF5
ZXIuCisgICAgICAgIFttX3RyYW5zZm9ybUxheWVyLmdldCgpIHNldE9wYWNpdHk6bV9vcGFjaXR5
XTsKKyAgICAgICAgW21fbGF5ZXIuZ2V0KCkgc2V0T3BhY2l0eToxXTsKKworICAgICAgICAvLyBN
b3ZlIHRoaXMgbGF5ZXIgdG8gYmUgYSBjaGlsZCBvZiB0aGUgdHJhbnNmb3JtIGxheWVyLgorICAg
ICAgICBbW21fbGF5ZXIuZ2V0KCkgc3VwZXJsYXllcl0gcmVwbGFjZVN1YmxheWVyOm1fbGF5ZXIu
Z2V0KCkgd2l0aDptX3RyYW5zZm9ybUxheWVyLmdldCgpXTsKKyAgICAgICAgW21fdHJhbnNmb3Jt
TGF5ZXIuZ2V0KCkgYWRkU3VibGF5ZXI6bV9sYXllci5nZXQoKV07CisKKyAgICAgICAgbW92ZUFu
aW1hdGlvbihBbmltYXRlZFByb3BlcnR5V2Via2l0VHJhbnNmb3JtLCBtX2xheWVyLmdldCgpLCBt
X3RyYW5zZm9ybUxheWVyLmdldCgpKTsKKyAgICAgICAgbW92ZVN1YmxheWVycyhtX2xheWVyLmdl
dCgpLCBtX3RyYW5zZm9ybUxheWVyLmdldCgpKTsKKworICAgIH0gZWxzZSBpZiAoIXByZXNlcnZl
czNEICYmIG1fdHJhbnNmb3JtTGF5ZXIpIHsKKyAgICAgICAgLy8gUmVsYWNlIHRoZSB0cmFuc2Zv
cm1MYXllciBpbiB0aGUgcGFyZW50IHdpdGggdGhpcyBsYXllci4KKyAgICAgICAgW21fbGF5ZXIu
Z2V0KCkgcmVtb3ZlRnJvbVN1cGVybGF5ZXJdOworICAgICAgICBbW21fdHJhbnNmb3JtTGF5ZXIu
Z2V0KCkgc3VwZXJsYXllcl0gcmVwbGFjZVN1YmxheWVyOm1fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkg
d2l0aDptX2xheWVyLmdldCgpXTsKKworICAgICAgICBtb3ZlQW5pbWF0aW9uKEFuaW1hdGVkUHJv
cGVydHlXZWJraXRUcmFuc2Zvcm0sIG1fdHJhbnNmb3JtTGF5ZXIuZ2V0KCksIG1fbGF5ZXIuZ2V0
KCkpOworICAgICAgICBtb3ZlU3VibGF5ZXJzKG1fdHJhbnNmb3JtTGF5ZXIuZ2V0KCksIG1fbGF5
ZXIuZ2V0KCkpOworCisgICAgICAgIC8vIFJlc2V0IHRoZSBsYXllciBwb3NpdGlvbiBhbmQgdHJh
bnNmb3JtLgorICAgICAgICBbbV9sYXllci5nZXQoKSBzZXRQb3NpdGlvbjpbbV90cmFuc2Zvcm1M
YXllci5nZXQoKSBwb3NpdGlvbl1dOworICAgICAgICBbbV9sYXllci5nZXQoKSBzZXRBbmNob3JQ
b2ludDpbbV90cmFuc2Zvcm1MYXllci5nZXQoKSBhbmNob3JQb2ludF1dOworICAgICAgICBbbV9s
YXllci5nZXQoKSBzZXRBbmNob3JQb2ludFo6W21fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkgYW5jaG9y
UG9pbnRaXV07CisgICAgICAgIFttX2xheWVyLmdldCgpIHNldENvbnRlbnRzUmVjdDpbbV90cmFu
c2Zvcm1MYXllci5nZXQoKSBjb250ZW50c1JlY3RdXTsKKyAgICAgICAgW21fbGF5ZXIuZ2V0KCkg
c2V0VHJhbnNmb3JtOlttX3RyYW5zZm9ybUxheWVyLmdldCgpIHRyYW5zZm9ybV1dOworICAgICAg
ICBbbV9sYXllci5nZXQoKSBzZXRPcGFjaXR5OlttX3RyYW5zZm9ybUxheWVyLmdldCgpIG9wYWNp
dHldXTsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgIFttX2xheWVyLmdldCgpIHNldFpQb3NpdGlv
bjpbbV90cmFuc2Zvcm1MYXllci5nZXQoKSB6UG9zaXRpb25dXTsKKyNlbmRpZgorCisgICAgICAg
IC8vIFJlbGVhc2UgdGhlIHRyYW5zZm9ybSBsYXllci4KKyAgICAgICAgbV90cmFuc2Zvcm1MYXll
ciA9IDA7CisgICAgfQorCisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUworfQorCit2b2lk
IEdyYXBoaWNzTGF5ZXJDQTo6c2V0TWFza3NUb0JvdW5kcyhib29sIG1hc2tzVG9Cb3VuZHMpCit7
CisgICAgaWYgKG1hc2tzVG9Cb3VuZHMgPT0gbV9tYXNrc1RvQm91bmRzKQorICAgICAgICByZXR1
cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRNYXNrc1RvQm91bmRzKG1hc2tzVG9Cb3VuZHMp
OworCisgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgW21fbGF5ZXIuZ2V0KCkg
c2V0TWFza3NUb0JvdW5kczptYXNrc1RvQm91bmRzXTsKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENF
UFRJT05TCisKKyNpZm5kZWYgTkRFQlVHCisgICAgdXBkYXRlRGVidWdJbmRpY2F0b3JzKCk7Cisj
ZW5kaWYKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0E6OnNldERyYXdzQ29udGVudChib29sIGRy
YXdzQ29udGVudCkKK3sKKyAgICBpZiAoZHJhd3NDb250ZW50ICE9IG1fZHJhd3NDb250ZW50KSB7
CisgICAgICAgIEdyYXBoaWNzTGF5ZXI6OnNldERyYXdzQ29udGVudChkcmF3c0NvbnRlbnQpOwor
CisgICAgICAgIGJvb2wgbmVlZFRpbGVkTGF5ZXIgPSByZXF1aXJlc1RpbGVkTGF5ZXIobV9zaXpl
KTsKKyAgICAgICAgaWYgKG5lZWRUaWxlZExheWVyICE9IG1fdXNpbmdUaWxlZExheWVyKQorICAg
ICAgICAgICAgc3dhcEZyb21PclRvVGlsZWRMYXllcihuZWVkVGlsZWRMYXllcik7CisKKyAgICAg
ICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgICAgIC8vIENsb2JiZXIgYW55IGV4
aXN0aW5nIGNvbnRlbnQuIElmIG5lY2Vzc2FyeSwgQ0Egd2lsbCBjcmVhdGUgYmFja2luZyBzdG9y
ZSBvbiB0aGUgbmV4dCBkaXNwbGF5LgorICAgICAgICBbbV9sYXllci5nZXQoKSBzZXRDb250ZW50
czpuaWxdOworICAgICAgICAKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgIHVwZGF0ZURlYnVnSW5k
aWNhdG9ycygpOworI2VuZGlmCisgICAgICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAg
ICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjpzZXRCYWNrZ3JvdW5kQ29sb3IoY29uc3Qg
Q29sb3ImIGNvbG9yLCBjb25zdCBBbmltYXRpb24qIHRyYW5zaXRpb24sIGRvdWJsZSBiZWdpblRp
bWUpCit7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0QmFja2dyb3VuZENvbG9yKGNvbG9yLCB0cmFu
c2l0aW9uLCBiZWdpblRpbWUpOworCisgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisg
ICAgc2V0SGFzQ29udGVudHNMYXllcih0cnVlKTsKKyAgICAKKyAgICBpZiAodHJhbnNpdGlvbiAm
JiAhdHJhbnNpdGlvbi0+aXNFbXB0eU9yWmVyb0R1cmF0aW9uKCkpIHsKKyAgICAgICAgQ0FMYXll
ciogcHJlc0xheWVyID0gW21fY29udGVudHNMYXllci5nZXQoKSBwcmVzZW50YXRpb25MYXllcl07
CisgICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYSBwcmVzZW50YXRpb25MYXllciwganVzdCB1
c2UgdGhlIENBTGF5ZXIKKyAgICAgICAgaWYgKCFwcmVzTGF5ZXIpCisgICAgICAgICAgICBwcmVz
TGF5ZXIgPSBtX2NvbnRlbnRzTGF5ZXIuZ2V0KCk7CisKKyAgICAgICAgLy8gR2V0IHRoZSBjdXJy
ZW50IHZhbHVlIG9mIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGZyb20gdGhlIGxheWVyCisgICAgICAg
IENHQ29sb3JSZWYgZnJvbUJhY2tncm91bmRDb2xvciA9IFtwcmVzTGF5ZXIgYmFja2dyb3VuZENv
bG9yXTsKKworICAgICAgICBDR0NvbG9yUmVmIGJnQ29sb3IgPSBjZ0NvbG9yKGNvbG9yKTsKKyAg
ICAgICAgc2V0QmFzaWNBbmltYXRpb24oQW5pbWF0ZWRQcm9wZXJ0eUJhY2tncm91bmRDb2xvciwg
IiIsIDAsIGZyb21CYWNrZ3JvdW5kQ29sb3IsIGJnQ29sb3IsIHRydWUsIHRyYW5zaXRpb24sIGJl
Z2luVGltZSk7CisgICAgICAgIENHQ29sb3JSZWxlYXNlKGJnQ29sb3IpOworICAgIH0gZWxzZSB7
CisgICAgICAgIHJlbW92ZUFsbEFuaW1hdGlvbnNGb3JQcm9wZXJ0eShBbmltYXRlZFByb3BlcnR5
QmFja2dyb3VuZENvbG9yKTsgICAgCisgICAgICAgIHNldEhhc0NvbnRlbnRzTGF5ZXIodHJ1ZSk7
CisgICAgICAgIHNldExheWVyQmFja2dyb3VuZENvbG9yKG1fY29udGVudHNMYXllci5nZXQoKSwg
bV9iYWNrZ3JvdW5kQ29sb3IpOworICAgIH0KKworICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElP
TlMKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0E6OmNsZWFyQmFja2dyb3VuZENvbG9yKCkKK3sK
KyAgICBpZiAoIW1fY29udGVudExheWVyRm9ySW1hZ2VPclZpZGVvKQorICAgICAgICBzZXRIYXND
b250ZW50c0xheWVyKGZhbHNlKTsKKyAgICBlbHNlCisgICAgICAgIGNsZWFyTGF5ZXJCYWNrZ3Jv
dW5kQ29sb3IobV9jb250ZW50c0xheWVyLmdldCgpKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVy
Q0E6OnNldENvbnRlbnRzT3BhcXVlKGJvb2wgb3BhcXVlKQoreworICAgIEdyYXBoaWNzTGF5ZXI6
OnNldENvbnRlbnRzT3BhcXVlKG9wYXF1ZSk7CisKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQ
VElPTlMKKyAgICBbbV9sYXllci5nZXQoKSBzZXRPcGFxdWU6bV9jb250ZW50c09wYXF1ZV07Cisg
ICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6
c2V0QmFja2ZhY2VWaXNpYmlsaXR5KGJvb2wgdmlzaWJsZSkKK3sKKyAgICBpZiAobV9iYWNrZmFj
ZVZpc2liaWxpdHkgPT0gdmlzaWJsZSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIEdyYXBo
aWNzTGF5ZXI6OnNldEJhY2tmYWNlVmlzaWJpbGl0eSh2aXNpYmxlKTsKKyAgICAKKyAgICBCRUdJ
Tl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICBbbV9sYXllci5nZXQoKSBzZXREb3VibGVTaWRl
ZDp2aXNpYmxlXTsKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCit9CisKK2Jvb2wgR3Jh
cGhpY3NMYXllckNBOjpzZXRPcGFjaXR5KGZsb2F0IG9wYWNpdHksIGNvbnN0IEFuaW1hdGlvbiog
dHJhbnNpdGlvbiwgZG91YmxlIGJlZ2luVGltZSkKK3sKKyAgICBmbG9hdCBjbGFtcGVkT3BhY2l0
eSA9IG1heCgwLjBmLCBtaW4ob3BhY2l0eSwgMS4wZikpOworICAgIAorICAgIGJvb2wgb3BhY2l0
aWVzRGlmZmVyID0gKG1fb3BhY2l0eSAhPSBjbGFtcGVkT3BhY2l0eSk7CisgICAgCisgICAgR3Jh
cGhpY3NMYXllcjo6c2V0T3BhY2l0eShjbGFtcGVkT3BhY2l0eSwgdHJhbnNpdGlvbiwgYmVnaW5U
aW1lKTsKKyAgICAKKyAgICBpbnQgYW5pbUluZGV4ID0gZmluZEFuaW1hdGlvbkVudHJ5KEFuaW1h
dGVkUHJvcGVydHlPcGFjaXR5LCAwKTsKKyAgICAgICAgCisgICAgLy8gSWYgd2UgZG9uJ3QgaGF2
ZSBhIHRyYW5zaXRpb24ganVzdCBzZXQgdGhlIG9wYWNpdHkKKyAgICBpZiAoIXRyYW5zaXRpb24g
fHwgdHJhbnNpdGlvbi0+aXNFbXB0eU9yWmVyb0R1cmF0aW9uKCkpIHsKKyAgICAgICAgLy8gVGhy
ZWUgY2FzZXM6CisgICAgICAgIC8vICAxKSBubyBleGlzdGluZyBhbmltYXRpb24gb3IgdHJhbnNp
dGlvbjoganVzdCBzZXQgb3BhY2l0eQorICAgICAgICAvLyAgMikgZXhpc3RpbmcgdHJhbnNpdGlv
bjogY2xlYXIgaXQgYW5kIHNldCBvcGFjaXR5CisgICAgICAgIC8vICAzKSBleGlzdGluZyBhbmlt
YXRpb246IGp1c3QgcmV0dXJuCisgICAgICAgIC8vCisgICAgICAgIGlmIChhbmltSW5kZXggPCAw
IHx8IG1fYW5pbWF0aW9uc1thbmltSW5kZXhdLmlzVHJhbnNpdGlvbigpKSB7CisgICAgICAgICAg
ICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICAgICAgICAgIFtwcmltYXJ5TGF5ZXIo
KSBzZXRPcGFjaXR5Om9wYWNpdHldOworICAgICAgICAgICAgaWYgKGFuaW1JbmRleCA+PSAwKSB7
CisgICAgICAgICAgICAgICAgcmVtb3ZlQWxsQW5pbWF0aW9uc0ZvclByb3BlcnR5KEFuaW1hdGVk
UHJvcGVydHlPcGFjaXR5KTsKKyAgICAgICAgICAgICAgICBhbmltSW5kZXggPSAtMTsKKyAgICAg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGtleVBhdGggPSBwcm9wZXJ0
eUlkVG9TdHJpbmcoQW5pbWF0ZWRQcm9wZXJ0eU9wYWNpdHkpOworICAgICAgICAgICAgICAgIAor
ICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB1c2luZyBoYXJkY29kZWQgJzAnIGhlcmUuIFdlIHNo
b3VsZCBiZSBjbGVhcmluZyBhbGwgYW5pbWF0aW9ucy4gRm9yIG5vdyB0aGVyZSBpcyBvbmx5IDEu
CisgICAgICAgICAgICAgICAgU3RyaW5nIGFuaW1OYW1lID0ga2V5UGF0aCArICJfMCI7CisgICAg
ICAgICAgICAgICAgW2FuaW1hdGVkTGF5ZXIoQW5pbWF0ZWRQcm9wZXJ0eU9wYWNpdHkpIHJlbW92
ZUFuaW1hdGlvbkZvcktleTphbmltTmFtZV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBF
TkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAv
LyBXZSBoYXZlIGFuIGFuaW1hdGlvbiwgc28gZG9uJ3Qgc2V0IHRoZSBvcGFjaXR5IGRpcmVjdGx5
LgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAg
ICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2Uga25vdyB3ZSBoYXZlIGEgdHJhbnNpdGlvbi4gQnV0
IGlmIGl0IGlzIHRoZSBzYW1lIGFuZAorICAgICAgICAvLyB0aGUgb3BhY2l0eSB2YWx1ZSBoYXMg
bm90IGNoYW5nZWQsIGRvbid0IGRvIGFueXRoaW5nLgorICAgICAgICBpZiAoIW9wYWNpdGllc0Rp
ZmZlciAmJgorICAgICAgICAgICAgICAgICgoYW5pbUluZGV4ID09IC0xKSB8fCAgICAKKyAgICAg
ICAgICAgICAgICAgKG1fYW5pbWF0aW9uc1thbmltSW5kZXhdLmlzVHJhbnNpdGlvbigpICYmICoo
bV9hbmltYXRpb25zW2FuaW1JbmRleF0uYW5pbWF0aW9uKCkpID09ICp0cmFuc2l0aW9uKSkpIHsK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAv
LyBJZiBhbiBhbmltYXRpb24gaXMgcnVubmluZywgaWdub3JlIHRoaXMgdHJhbnNpdGlvbiwgYnV0
IHN0aWxsIHNhdmUgdGhlIHZhbHVlLgorICAgIGlmIChhbmltSW5kZXggPj0gMCAmJiAhbV9hbmlt
YXRpb25zW2FuaW1JbmRleF0uaXNUcmFuc2l0aW9uKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIGJvb2wgZGlkQW5pbWF0ZSA9IGZhbHNlOworICAgIAorICAgIEJFR0lOX0JMT0NLX09C
SkNfRVhDRVBUSU9OUworICAgIAorICAgIE5TTnVtYmVyKiBmcm9tT3BhY2l0eVZhbHVlID0gbmls
OworICAgIE5TTnVtYmVyKiB0b09wYWNpdHlWYWx1ZSA9IFtOU051bWJlciBudW1iZXJXaXRoRmxv
YXQ6b3BhY2l0eV07CisgICAgCisgICAgaWYgKHRyYW5zaXRpb24gJiYgIXRyYW5zaXRpb24tPmlz
RW1wdHlPclplcm9EdXJhdGlvbigpKSB7CisgICAgICAgIENBTGF5ZXIqIHByZXNMYXllciA9IGdl
dFByZXNlbnRhdGlvbkxheWVyKHByaW1hcnlMYXllcigpKTsKKyAgICAgICAgZmxvYXQgZnJvbU9w
YWNpdHkgPSBbcHJlc0xheWVyIG9wYWNpdHldOworICAgICAgICBmcm9tT3BhY2l0eVZhbHVlID0g
W05TTnVtYmVyIG51bWJlcldpdGhGbG9hdDpmcm9tT3BhY2l0eV07CisgICAgICAgIHNldEJhc2lj
QW5pbWF0aW9uKEFuaW1hdGVkUHJvcGVydHlPcGFjaXR5LCAiIiwgMCwgZnJvbU9wYWNpdHlWYWx1
ZSwgdG9PcGFjaXR5VmFsdWUsIHRydWUsIHRyYW5zaXRpb24sIGJlZ2luVGltZSk7CisgICAgICAg
IGRpZEFuaW1hdGUgPSB0cnVlOworICAgIH0KKworICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElP
TlMKKyAgICAKKyAgICByZXR1cm4gZGlkQW5pbWF0ZTsKK30KKwordm9pZCBHcmFwaGljc0xheWVy
Q0E6OnNldE5lZWRzRGlzcGxheSgpCit7CisgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05T
CisgICAgCisgICAgaWYgKGRyYXdzQ29udGVudCgpKQorICAgICAgICBbbV9sYXllci5nZXQoKSBz
ZXROZWVkc0Rpc3BsYXldOworCisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUworfQorCit2
b2lkIEdyYXBoaWNzTGF5ZXJDQTo6c2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IEZsb2F0UmVj
dCYgcmVjdCkKK3sKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICAKKyAgICBp
ZiAoZHJhd3NDb250ZW50KCkpCisgICAgICAgIFttX2xheWVyLmdldCgpIHNldE5lZWRzRGlzcGxh
eUluUmVjdDpyZWN0XTsKKworICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKK30KKworCiti
b29sIEdyYXBoaWNzTGF5ZXJDQTo6YW5pbWF0ZVRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1WYWx1
ZUxpc3QmIHZhbHVlTGlzdCwgY29uc3QgSW50U2l6ZSYgc2l6ZSwgY29uc3QgQW5pbWF0aW9uKiBh
bmltLCBkb3VibGUgYmVnaW5UaW1lLCBib29sIGlzVHJhbnNpdGlvbikKK3sKKyAgICBpZiAoIWFu
aW0gfHwgYW5pbS0+aXNFbXB0eU9yWmVyb0R1cmF0aW9uKCkgfHwgdmFsdWVMaXN0LnNpemUoKSA8
IDIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgCisgICAgVHJhbnNmb3JtVmFsdWVM
aXN0OjpGdW5jdGlvbkxpc3QgZnVuY3Rpb25MaXN0OworICAgIGJvb2wgaXNWYWxpZCwgaGFzQmln
Um90YXRpb247CisgICAgdmFsdWVMaXN0Lm1ha2VGdW5jdGlvbkxpc3QoZnVuY3Rpb25MaXN0LCBp
c1ZhbGlkLCBoYXNCaWdSb3RhdGlvbik7CisKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElP
TlMKKyAgICAKKyAgICAvLyBSdWxlcyBmb3IgYW5pbWF0aW9uOgorICAgIC8vCisgICAgLy8gIDEp
ICBJZiBmdW5jdGlvbkxpc3QgaXMgZW1wdHkgb3Igd2UgZG9uJ3QgaGF2ZSBhIGJpZyByb3RhdGlv
biwgd2UgZG8gYSBtYXRyaXggYW5pbWF0aW9uLiBXZSBjb3VsZAorICAgIC8vICAgICAgdXNlIGNv
bXBvbmVudCBhbmltYXRpb24gZm9yIGxpc3RzIHdpdGhvdXQgYSBiaWcgcm90YXRpb24sIGJ1dCB0
aGVyZSBpcyBubyBuZWVkIHRvLCBhbmQgdGhpcworICAgIC8vICAgICAgaXMgbW9yZSBlZmZpY2ll
bnQuCisgICAgLy8KKyAgICAvLyAgMikgIE90aGVyd2lzZSB3ZSBkbyBhIGNvbXBvbmVudCBoYXJk
d2FyZSBhbmltYXRpb24uCisgICAgYm9vbCBpc01hdHJpeEFuaW1hdGlvbiA9ICFpc1ZhbGlkIHx8
ICFoYXNCaWdSb3RhdGlvbjsKKyAgICAgICAgCisgICAgLy8gU2V0IHRyYW5zZm9ybSB0byBpZGVu
dGl0eSBzaW5jZSB3ZSBhcmUgYW5pbWF0aW5nIGNvbXBvbmVudHMgYW5kIHdlIG5lZWQgdGhlIGJh
c2UKKyAgICAvLyB0byBiZSB0aGUgaWRlbnRpdHkgdHJhbnNmb3JtLgorICAgIFRyYW5zZm9ybWF0
aW9uTWF0cml4IHQ7CisgICAgQ0FUcmFuc2Zvcm0zRCB0b1QzRDsKKyAgICBjb3B5VHJhbnNmb3Jt
KHRvVDNELCB0KTsKKyAgICBbcHJpbWFyeUxheWVyKCkgc2V0VHJhbnNmb3JtOnRvVDNEXTsKKyAg
ICAgICAgCisgICAgYm9vbCBpc0tleWZyYW1lID0gdmFsdWVMaXN0LnNpemUoKSA+IDI7CisgICAg
ICAgIAorICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgdHJhbnNmb3JtIGZ1bmN0aW9ucywgc2Vu
ZGluZyBhbiBhbmltYXRpb24gZm9yIGVhY2ggb25lLgorICAgIGZvciAoaW50IGZ1bmN0aW9uSW5k
ZXggPSAwOyA7ICsrZnVuY3Rpb25JbmRleCkgeworICAgICAgICBpZiAoZnVuY3Rpb25JbmRleCA+
PSBzdGF0aWNfY2FzdDxpbnQ+KGZ1bmN0aW9uTGlzdC5zaXplKCkpICYmICFpc01hdHJpeEFuaW1h
dGlvbikKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgIFRyYW5zZm9y
bU9wZXJhdGlvbjo6T3BlcmF0aW9uVHlwZSBvcFR5cGUgPSAKKyNpZiBFTkFCTEUoM0RfVFJBTlNG
T1JNUykKKyAgICAgICAgICAgIGlzTWF0cml4QW5pbWF0aW9uID8gVHJhbnNmb3JtT3BlcmF0aW9u
OjpNQVRSSVhfM0QgOiBmdW5jdGlvbkxpc3RbZnVuY3Rpb25JbmRleF07CisjZWxzZQorICAgICAg
ICAgICAgaXNNYXRyaXhBbmltYXRpb24gPyBUcmFuc2Zvcm1PcGVyYXRpb246Ok1BVFJJWCA6IGZ1
bmN0aW9uTGlzdFtmdW5jdGlvbkluZGV4XTsKKyNlbmRpZiAgICAgICAgCisKKyAgICAgICAgaWYg
KGlzS2V5ZnJhbWUpIHsKKyAgICAgICAgICAgIE5TTXV0YWJsZUFycmF5KiB0aW1lc0FycmF5ID0g
W1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdF07CisgICAgICAgICAgICBOU011dGFibGVBcnJh
eSogdmFsQXJyYXkgPSBbW05TTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0XTsKKyAgICAgICAgICAg
IE5TTXV0YWJsZUFycmF5KiB0ZkFycmF5ID0gW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdF07
CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUga2V5ZnJh
bWVzLCBidWlsZGluZyBhcnJheXMgZm9yIHRoZSBhbmltYXRpb24uCisgICAgICAgICAgICBmb3Ig
KFZlY3RvcjxUcmFuc2Zvcm1WYWx1ZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdmFsdWVMaXN0LnZh
bHVlcygpLmJlZ2luKCk7IGl0ICE9IHZhbHVlTGlzdC52YWx1ZXMoKS5lbmQoKTsgKytpdCkgewor
ICAgICAgICAgICAgICAgIGNvbnN0IFRyYW5zZm9ybVZhbHVlJiBjdXJWYWx1ZSA9ICgqaXQpOwor
ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIGZpbGwgaW4gdGhlIGtleSB0aW1l
IGFuZCB0aW1pbmcgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICBbdGltZXNBcnJheSBhZGRPYmpl
Y3Q6W05TTnVtYmVyIG51bWJlcldpdGhGbG9hdDpjdXJWYWx1ZS5rZXkoKV1dOworICAgICAgICAg
ICAgICAgIAorICAgICAgICAgICAgICAgIGNvbnN0IFRpbWluZ0Z1bmN0aW9uKiB0ZiA9IDA7Cisg
ICAgICAgICAgICAgICAgaWYgKGN1clZhbHVlLnRpbWluZ0Z1bmN0aW9uKCkpCisgICAgICAgICAg
ICAgICAgICAgIHRmID0gY3VyVmFsdWUudGltaW5nRnVuY3Rpb24oKTsKKyAgICAgICAgICAgICAg
ICBlbHNlIGlmIChhbmltLT5pc1RpbWluZ0Z1bmN0aW9uU2V0KCkpCisgICAgICAgICAgICAgICAg
ICAgIHRmID0gJmFuaW0tPnRpbWluZ0Z1bmN0aW9uKCk7CisgICAgICAgICAgICAgICAgCisgICAg
ICAgICAgICAgICAgQ0FNZWRpYVRpbWluZ0Z1bmN0aW9uKiB0aW1pbmdGdW5jdGlvbiA9IGdldENB
TWVkaWFUaW1pbmdGdW5jdGlvbih0ZiA/ICp0ZiA6IFRpbWluZ0Z1bmN0aW9uKExpbmVhclRpbWlu
Z0Z1bmN0aW9uKSk7CisgICAgICAgICAgICAgICAgW3RmQXJyYXkgYWRkT2JqZWN0OnRpbWluZ0Z1
bmN0aW9uXTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBmaWxsIGluIHRo
ZSBmdW5jdGlvbgorICAgICAgICAgICAgICAgIGlmIChpc01hdHJpeEFuaW1hdGlvbikgeworICAg
ICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0OworICAgICAgICAgICAgICAg
ICAgICBjdXJWYWx1ZS52YWx1ZSgpLT5hcHBseShzaXplLCB0KTsKKyAgICAgICAgICAgICAgICAg
ICAgQ0FUcmFuc2Zvcm0zRCBjYXQ7CisgICAgICAgICAgICAgICAgICAgIGNvcHlUcmFuc2Zvcm0o
Y2F0LCB0KTsKKyAgICAgICAgICAgICAgICAgICAgW3ZhbEFycmF5IGFkZE9iamVjdDpbTlNWYWx1
ZSB2YWx1ZVdpdGhDQVRyYW5zZm9ybTNEOmNhdF1dOworICAgICAgICAgICAgICAgIH0gZWxzZQor
ICAgICAgICAgICAgICAgICAgICBbdmFsQXJyYXkgYWRkT2JqZWN0OmdldFRyYW5zZm9ybUZ1bmN0
aW9uVmFsdWUoY3VyVmFsdWUsIGZ1bmN0aW9uSW5kZXgsIHNpemUsIG9wVHlwZSldOworICAgICAg
ICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBXZSB0b3NzIHRoZSBsYXN0IHRm
QXJyYXkgdmFsdWUgYmVjYXVzZSBpdCBoYXMgdG8gb25lIHNob3J0ZXIgdGhhbiB0aGUgb3RoZXJz
LgorICAgICAgICAgICAgW3RmQXJyYXkgcmVtb3ZlTGFzdE9iamVjdF07CisgICAgICAgICAgICAK
KyAgICAgICAgICAgIHNldEtleWZyYW1lQW5pbWF0aW9uKEFuaW1hdGVkUHJvcGVydHlXZWJraXRU
cmFuc2Zvcm0sIGdldEFuaW1hdGlvblZhbHVlRnVuY3Rpb24ob3BUeXBlKSwgZnVuY3Rpb25JbmRl
eCwgdGltZXNBcnJheSwgdmFsQXJyYXksIHRmQXJyYXksIGlzVHJhbnNpdGlvbiwgYW5pbSwgYmVn
aW5UaW1lKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgW3RpbWVzQXJyYXkgcmVsZWFzZV07
CisgICAgICAgICAgICBbdmFsQXJyYXkgcmVsZWFzZV07CisgICAgICAgICAgICBbdGZBcnJheSBy
ZWxlYXNlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIElzIGEgdHJhbnNpdGlv
bgorICAgICAgICAgICAgaWQgZnJvbVZhbHVlLCB0b1ZhbHVlOworICAgICAgICAgICAgCisgICAg
ICAgICAgICBpZiAoaXNNYXRyaXhBbmltYXRpb24pIHsKKyAgICAgICAgICAgICAgICBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCBmcm9tdCwgdG90OworICAgICAgICAgICAgICAgIHZhbHVlTGlzdC5hdCgw
KS52YWx1ZSgpLT5hcHBseShzaXplLCBmcm9tdCk7CisgICAgICAgICAgICAgICAgdmFsdWVMaXN0
LmF0KDEpLnZhbHVlKCktPmFwcGx5KHNpemUsIHRvdCk7CisgICAgICAgICAgICAgICAgCisgICAg
ICAgICAgICAgICAgQ0FUcmFuc2Zvcm0zRCBjYXQ7CisgICAgICAgICAgICAgICAgY29weVRyYW5z
Zm9ybShjYXQsIGZyb210KTsKKyAgICAgICAgICAgICAgICBmcm9tVmFsdWUgPSBbTlNWYWx1ZSB2
YWx1ZVdpdGhDQVRyYW5zZm9ybTNEOmNhdF07CisgICAgICAgICAgICAgICAgY29weVRyYW5zZm9y
bShjYXQsIHRvdCk7CisgICAgICAgICAgICAgICAgdG9WYWx1ZSA9IFtOU1ZhbHVlIHZhbHVlV2l0
aENBVHJhbnNmb3JtM0Q6Y2F0XTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAg
ICAgZnJvbVZhbHVlID0gZ2V0VHJhbnNmb3JtRnVuY3Rpb25WYWx1ZSh2YWx1ZUxpc3QuYXQoMCks
IGZ1bmN0aW9uSW5kZXgsIHNpemUsIG9wVHlwZSk7CisgICAgICAgICAgICAgICAgdG9WYWx1ZSA9
IGdldFRyYW5zZm9ybUZ1bmN0aW9uVmFsdWUodmFsdWVMaXN0LmF0KDEpLCBmdW5jdGlvbkluZGV4
LCBzaXplLCBvcFR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAg
ICBzZXRCYXNpY0FuaW1hdGlvbihBbmltYXRlZFByb3BlcnR5V2Via2l0VHJhbnNmb3JtLCBnZXRB
bmltYXRpb25WYWx1ZUZ1bmN0aW9uKG9wVHlwZSksIGZ1bmN0aW9uSW5kZXgsIGZyb21WYWx1ZSwg
dG9WYWx1ZSwgaXNUcmFuc2l0aW9uLCBhbmltLCBiZWdpblRpbWUpOworICAgICAgICB9CisgICAg
ICAgIAorICAgICAgICBpZiAoaXNNYXRyaXhBbmltYXRpb24pCisgICAgICAgICAgICBicmVhazsK
KyAgICB9CisKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgcmV0dXJuIHRydWU7
Cit9CisKK2Jvb2wgR3JhcGhpY3NMYXllckNBOjphbmltYXRlRmxvYXQoQW5pbWF0ZWRQcm9wZXJ0
eUlEIHByb3BlcnR5LCBjb25zdCBGbG9hdFZhbHVlTGlzdCYgdmFsdWVMaXN0LCBjb25zdCBBbmlt
YXRpb24qIGFuaW1hdGlvbiwgZG91YmxlIGJlZ2luVGltZSkKK3sKKyAgICBpZiAodmFsdWVMaXN0
LnNpemUoKSA8IDIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgCisgICAgLy8gaWYg
dGhlcmUgaXMgYWxyZWFkeSBpcyBhbiBhbmltYXRpb24gZm9yIHRoaXMgcHJvcGVydHkgYW5kIGl0
IGhhc24ndCBjaGFuZ2VkLCBpZ25vcmUgaXQuCisgICAgaW50IGkgPSBmaW5kQW5pbWF0aW9uRW50
cnkocHJvcGVydHksIDApOworICAgIGlmIChpID49IDAgJiYgKm1fYW5pbWF0aW9uc1tpXS5hbmlt
YXRpb24oKSA9PSAqYW5pbWF0aW9uKSB7CisgICAgICAgIG1fYW5pbWF0aW9uc1tpXS5zZXRJc0N1
cnJlbnQoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICh2YWx1ZUxp
c3Quc2l6ZSgpID09IDIpIHsKKyAgICAgICAgZmxvYXQgZnJvbVZhbCA9IHZhbHVlTGlzdC5hdCgw
KS52YWx1ZSgpOworICAgICAgICBmbG9hdCB0b1ZhbCAgID0gdmFsdWVMaXN0LmF0KDEpLnZhbHVl
KCk7CisgICAgICAgIGlmIChpc25hbih0b1ZhbCkgJiYgaXNuYW4oZnJvbVZhbCkpCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgICAgIC8vIGluaXRpYWxpemUgdGhlIHByb3Bl
cnR5IHRvIDAKKyAgICAgICAgW2FuaW1hdGVkTGF5ZXIocHJvcGVydHkpIHNldFZhbHVlOjAgZm9y
S2V5UGF0aDpwcm9wZXJ0eUlkVG9TdHJpbmcocHJvcGVydHkpXTsKKyAgICAgICAgc2V0QmFzaWNB
bmltYXRpb24ocHJvcGVydHksICIiLCAwLCBpc25hbihmcm9tVmFsKSA/IG5pbCA6IFtOU051bWJl
ciBudW1iZXJXaXRoRmxvYXQ6ZnJvbVZhbF0sIGlzbmFuKHRvVmFsKSA/IG5pbCA6IFtOU051bWJl
ciBudW1iZXJXaXRoRmxvYXQ6dG9WYWxdLCBmYWxzZSwgYW5pbWF0aW9uLCBiZWdpblRpbWUpOwor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQ
VElPTlMKKyAgICAKKyAgICBOU011dGFibGVBcnJheSogdGltZXNBcnJheSA9IFtbTlNNdXRhYmxl
QXJyYXkgYWxsb2NdIGluaXRdOworICAgIE5TTXV0YWJsZUFycmF5KiB2YWxBcnJheSA9IFtbTlNN
dXRhYmxlQXJyYXkgYWxsb2NdIGluaXRdOworICAgIE5TTXV0YWJsZUFycmF5KiB0ZkFycmF5ID0g
W1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdF07CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgdmFsdWVMaXN0LnZhbHVlcygpLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IEZs
b2F0VmFsdWUmIGN1clZhbHVlID0gdmFsdWVMaXN0LnZhbHVlcygpW2ldOworICAgICAgICBbdGlt
ZXNBcnJheSBhZGRPYmplY3Q6W05TTnVtYmVyIG51bWJlcldpdGhGbG9hdDpjdXJWYWx1ZS5rZXko
KV1dOworICAgICAgICBbdmFsQXJyYXkgYWRkT2JqZWN0OltOU051bWJlciBudW1iZXJXaXRoRmxv
YXQ6Y3VyVmFsdWUudmFsdWUoKV1dOworCisgICAgICAgIGNvbnN0IFRpbWluZ0Z1bmN0aW9uKiB0
ZiA9IDA7CisgICAgICAgIGlmIChjdXJWYWx1ZS50aW1pbmdGdW5jdGlvbigpKQorICAgICAgICAg
ICAgdGYgPSBjdXJWYWx1ZS50aW1pbmdGdW5jdGlvbigpOworICAgICAgICBlbHNlIGlmIChhbmlt
YXRpb24tPmlzVGltaW5nRnVuY3Rpb25TZXQoKSkKKyAgICAgICAgICAgIHRmID0gJmFuaW1hdGlv
bi0+dGltaW5nRnVuY3Rpb24oKTsKKworICAgICAgICBDQU1lZGlhVGltaW5nRnVuY3Rpb24qIHRp
bWluZ0Z1bmN0aW9uID0gZ2V0Q0FNZWRpYVRpbWluZ0Z1bmN0aW9uKHRmID8gKnRmIDogVGltaW5n
RnVuY3Rpb24oKSk7CisgICAgICAgIFt0ZkFycmF5IGFkZE9iamVjdDp0aW1pbmdGdW5jdGlvbl07
CisgICAgfQorICAgIAorICAgIC8vIFdlIHRvc3MgdGhlIGxhc3QgdGZBcnJheSB2YWx1ZSBiZWNh
dXNlIGl0IGhhcyB0byBvbmUgc2hvcnRlciB0aGFuIHRoZSBvdGhlcnMuCisgICAgW3RmQXJyYXkg
cmVtb3ZlTGFzdE9iamVjdF07CisgICAgCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcHJvcGVydHkg
dG8gMC4KKyAgICBbYW5pbWF0ZWRMYXllcihwcm9wZXJ0eSkgc2V0VmFsdWU6MCBmb3JLZXlQYXRo
OnByb3BlcnR5SWRUb1N0cmluZyhwcm9wZXJ0eSldOworICAgIC8vIFRoZW4gc2V0IHRoZSBhbmlt
YXRpb24uCisgICAgc2V0S2V5ZnJhbWVBbmltYXRpb24ocHJvcGVydHksICIiLCAwLCB0aW1lc0Fy
cmF5LCB2YWxBcnJheSwgdGZBcnJheSwgZmFsc2UsIGFuaW1hdGlvbiwgYmVnaW5UaW1lKTsKKwor
ICAgIFt0aW1lc0FycmF5IHJlbGVhc2VdOworICAgIFt2YWxBcnJheSByZWxlYXNlXTsKKyAgICBb
dGZBcnJheSByZWxlYXNlXTsKKworICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0E6OnNldENvbnRlbnRzVG9JbWFn
ZShJbWFnZSogaW1hZ2UpCit7CisgICAgaWYgKGltYWdlKSB7CisgICAgICAgIHNldEhhc0NvbnRl
bnRzTGF5ZXIodHJ1ZSk7CisKKyAgICAgICAgLy8gRklYTUU6IGlzIGltYWdlIGZsaXBwaW5nIHJl
YWxseSBhIHByb3BlcnR5IG9mIHRoZSBncmFwaGljcyBjb250ZXh0PworICAgICAgICBib29sIG5l
ZWRUb0ZsaXAgPSBHcmFwaGljc0xheWVyOjpncmFwaGljc0NvbnRleHRzRmxpcHBlZCgpOworICAg
ICAgICBDR1BvaW50IGFuY2hvclBvaW50ID0gbmVlZFRvRmxpcCA/IENHUG9pbnRNYWtlKDAuMGYs
IDEuMGYpIDogQ0dQb2ludFplcm87CisKKyAgICAgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJ
T05TCisgICAgICAgIHsKKyAgICAgICAgICAgIENHSW1hZ2VSZWYgdGhlSW1hZ2UgPSBpbWFnZS0+
bmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKTsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBtYXli
ZSBvbmx5IGRvIHRyaWxpbmVhciBpZiB0aGUgaW1hZ2UgaXMgYmVpbmcgc2NhbGVkIGRvd24sCisg
ICAgICAgICAgICAvLyBidXQgdGhlbiB3aGF0IGlmIHRoZSBsYXllciBzaXplIGNoYW5nZXM/Cisj
aWYgIWRlZmluZWQoQlVJTERJTkdfT05fVElHRVIpICYmICFkZWZpbmVkKEJVSUxESU5HX09OX0xF
T1BBUkQpCisgICAgICAgICAgICBbbV9jb250ZW50c0xheWVyLmdldCgpIHNldE1pbmlmaWNhdGlv
bkZpbHRlcjprQ0FGaWx0ZXJUcmlsaW5lYXJdOworI2VuZGlmCisgICAgICAgICAgICBpZiAobmVl
ZFRvRmxpcCkgeworICAgICAgICAgICAgICAgIENBVHJhbnNmb3JtM0QgZmxpcHBlciA9IHsKKyAg
ICAgICAgICAgICAgICAgICAgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwKKyAgICAgICAgICAgICAg
ICAgICAgMC4wZiwgLTEuMGYsIDAuMGYsIDAuMGYsCisgICAgICAgICAgICAgICAgICAgIDAuMGYs
IDAuMGYsIDEuMGYsIDAuMGYsCisgICAgICAgICAgICAgICAgICAgIDAuMGYsIDAuMGYsIDAuMGYs
IDEuMGZ9OworICAgICAgICAgICAgICAgIFttX2NvbnRlbnRzTGF5ZXIuZ2V0KCkgc2V0VHJhbnNm
b3JtOmZsaXBwZXJdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBbbV9jb250ZW50c0xh
eWVyLmdldCgpIHNldEFuY2hvclBvaW50OmFuY2hvclBvaW50XTsKKyAgICAgICAgICAgIFttX2Nv
bnRlbnRzTGF5ZXIuZ2V0KCkgc2V0Q29udGVudHM6KGlkKXRoZUltYWdlXTsKKyAgICAgICAgfQor
ICAgICAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgfSBlbHNlCisgICAgICAgIHNl
dEhhc0NvbnRlbnRzTGF5ZXIoZmFsc2UpOworCisgICAgbV9jb250ZW50TGF5ZXJGb3JJbWFnZU9y
VmlkZW8gPSAoaW1hZ2UgIT0gMCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjpzZXRDb250
ZW50c1RvVmlkZW8oUGxhdGZvcm1MYXllciogdmlkZW9MYXllcikKK3sKKyAgICBzZXRDb250ZW50
c0xheWVyKHZpZGVvTGF5ZXIpOworICAgIG1fY29udGVudExheWVyRm9ySW1hZ2VPclZpZGVvID0g
KHZpZGVvTGF5ZXIgIT0gMCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjpjbGVhckNvbnRl
bnRzKCkKK3sKKyAgICBpZiAobV9jb250ZW50TGF5ZXJGb3JJbWFnZU9yVmlkZW8pIHsKKyAgICAg
ICAgc2V0SGFzQ29udGVudHNMYXllcihmYWxzZSk7CisgICAgICAgIG1fY29udGVudExheWVyRm9y
SW1hZ2VPclZpZGVvID0gZmFsc2U7CisgICAgfQorfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6
dXBkYXRlQ29udGVudHNSZWN0KCkKK3sKKyAgICBpZiAobV9jbGllbnQgJiYgbV9jb250ZW50c0xh
eWVyKSB7CisgICAgICAgIEludFJlY3QgY29udGVudFJlY3QgPSBtX2NsaWVudC0+Y29udGVudHNC
b3godGhpcyk7CisgICAgICAgIAorICAgICAgICBDR1BvaW50IHBvaW50ID0gQ0dQb2ludE1ha2Uo
Y29udGVudFJlY3QueCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29u
dGVudFJlY3QueSgpKTsKKyAgICAgICAgQ0dSZWN0IHJlY3QgPSBDR1JlY3RNYWtlKDAuMGYsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjBmLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgY29udGVudFJlY3Qud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbnRlbnRSZWN0LmhlaWdodCgpKTsKKworICAgICAgICBCRUdJTl9CTE9D
S19PQkpDX0VYQ0VQVElPTlMKKyAgICAgICAgW21fY29udGVudHNMYXllci5nZXQoKSBzZXRQb3Np
dGlvbjpwb2ludF07CisgICAgICAgIFttX2NvbnRlbnRzTGF5ZXIuZ2V0KCkgc2V0Qm91bmRzOnJl
Y3RdOworICAgICAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgfQorfQorCit2b2lk
IEdyYXBoaWNzTGF5ZXJDQTo6c2V0QmFzaWNBbmltYXRpb24oQW5pbWF0ZWRQcm9wZXJ0eUlEIHBy
b3BlcnR5LCBjb25zdCBTdHJpbmcmIHZhbHVlRnVuY3Rpb24sIHNob3J0IGluZGV4LCB2b2lkKiBm
cm9tVmFsLCB2b2lkKiB0b1ZhbCwgYm9vbCBpc1RyYW5zaXRpb24sIGNvbnN0IEFuaW1hdGlvbiog
dHJhbnNpdGlvbiwgZG91YmxlIGJlZ2luVGltZSkKK3sKKyAgICBBU1NFUlQoZnJvbVZhbCB8fCB0
b1ZhbCk7CisKKyAgICBXZWJMYXllciogbGF5ZXIgPSBhbmltYXRlZExheWVyKHByb3BlcnR5KTsK
KyAgICAKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKworICAgIC8vIGFkZCBhbiBl
bnRyeSBmb3IgdGhpcyBhbmltYXRpb24KKyAgICBhZGRBbmltYXRpb25FbnRyeShwcm9wZXJ0eSwg
aW5kZXgsIGlzVHJhbnNpdGlvbiwgdHJhbnNpdGlvbik7CisKKyAgICBTdHJpbmcga2V5UGF0aCA9
IHByb3BlcnR5SWRUb1N0cmluZyhwcm9wZXJ0eSk7CisgICAgU3RyaW5nIGFuaW1OYW1lID0ga2V5
UGF0aCArICJfIiArIFN0cmluZzo6bnVtYmVyKGluZGV4KTsKKworICAgIENBQmFzaWNBbmltYXRp
b24qIGJhc2ljQW5pbSA9IFtDQUJhc2ljQW5pbWF0aW9uIGFuaW1hdGlvbldpdGhLZXlQYXRoOmtl
eVBhdGhdOworICAgIAorICAgIGRvdWJsZSBkdXJhdGlvbiA9IHRyYW5zaXRpb24tPmR1cmF0aW9u
KCk7CisgICAgaWYgKGR1cmF0aW9uIDw9IDApCisgICAgICAgIGR1cmF0aW9uID0gY0FuaW1hdGlv
bkFsbW9zdFplcm9EdXJhdGlvbjsKKyAgICAgICAgCisgICAgZmxvYXQgcmVwZWF0Q291bnQgPSB0
cmFuc2l0aW9uLT5pdGVyYXRpb25Db3VudCgpOworICAgIGlmIChyZXBlYXRDb3VudCA8IDApCisg
ICAgICAgIHJlcGVhdENvdW50ID0gRkxUX01BWDsKKyAgICBlbHNlIGlmICh0cmFuc2l0aW9uLT5k
aXJlY3Rpb24oKSkgICAvLyBJZiB3ZSBhbHRlcm5hdGUsIHRoZSBudW1iZXIgb2YgY3ljbGVzIGlz
IGhhbHZlZAorICAgICAgICByZXBlYXRDb3VudCAvPSAyOworICAgICAgICAKKyAgICBbYmFzaWNB
bmltIHNldER1cmF0aW9uOmR1cmF0aW9uXTsKKyAgICBbYmFzaWNBbmltIHNldFJlcGVhdENvdW50
OnJlcGVhdENvdW50XTsKKyAgICBbYmFzaWNBbmltIHNldEF1dG9yZXZlcnNlczp0cmFuc2l0aW9u
LT5kaXJlY3Rpb24oKV07CisgICAgW2Jhc2ljQW5pbSBzZXRSZW1vdmVkT25Db21wbGV0aW9uOk5P
XTsKKworICAgIC8vIE5vdGUgdGhhdCBjdXJyZW50bHkgdHJhbnNmb3JtIGlzIHRoZSBvbmx5IHBy
b3BlcnR5IHdoaWNoIGhhcyBhbmltYXRpb25zCisgICAgLy8gd2l0aCBhbiBpbmRleCA+IDAuCisg
ICAgW2Jhc2ljQW5pbSBzZXRBZGRpdGl2ZTpwcm9wZXJ0eSA9PSBBbmltYXRlZFByb3BlcnR5V2Vi
a2l0VHJhbnNmb3JtXTsKKyAgICBbYmFzaWNBbmltIHNldEZpbGxNb2RlOkAiZXh0ZW5kZWQiXTsK
KyAgICBbYmFzaWNBbmltIHNldFZhbHVlRnVuY3Rpb246W0NBVmFsdWVGdW5jdGlvbiBmdW5jdGlv
bldpdGhOYW1lOnZhbHVlRnVuY3Rpb25dXTsKKyAgICAKKyAgICAvLyBTZXQgdGhlIGRlbGVnYXRl
IChhbmQgcHJvcGVydHkgdmFsdWUpLgorICAgIGludCBwcm9wID0gaXNUcmFuc2l0aW9uID8gcHJv
cGVydHkgOiBBbmltYXRlZFByb3BlcnR5SW52YWxpZDsKKyAgICBbYmFzaWNBbmltIHNldFZhbHVl
OltOU051bWJlciBudW1iZXJXaXRoSW50OnByb3BdIGZvcktleTpXZWJBbmltYXRpb25DU1NQcm9w
ZXJ0eUtleV07CisgICAgW2Jhc2ljQW5pbSBzZXREZWxlZ2F0ZTptX2FuaW1hdGlvbkRlbGVnYXRl
LmdldCgpXTsKKworICAgIE5TVGltZUludGVydmFsIGJ0ID0gYmVnaW5UaW1lID8gW2xheWVyIGNv
bnZlcnRUaW1lOmN1cnJlbnRUaW1lVG9NZWRpYVRpbWUoYmVnaW5UaW1lKSBmcm9tTGF5ZXI6bmls
XSA6IDA7CisgICAgW2Jhc2ljQW5pbSBzZXRCZWdpblRpbWU6YnRdOworICAgIAorICAgIGlmIChm
cm9tVmFsKQorICAgICAgICBbYmFzaWNBbmltIHNldEZyb21WYWx1ZTpyZWludGVycHJldF9jYXN0
PGlkPihmcm9tVmFsKV07CisgICAgaWYgKHRvVmFsKQorICAgICAgICBbYmFzaWNBbmltIHNldFRv
VmFsdWU6cmVpbnRlcnByZXRfY2FzdDxpZD4odG9WYWwpXTsKKworICAgIGNvbnN0IFRpbWluZ0Z1
bmN0aW9uKiB0ZiA9IDA7CisgICAgaWYgKHRyYW5zaXRpb24tPmlzVGltaW5nRnVuY3Rpb25TZXQo
KSkKKyAgICAgICAgdGYgPSAmdHJhbnNpdGlvbi0+dGltaW5nRnVuY3Rpb24oKTsKKworICAgIENB
TWVkaWFUaW1pbmdGdW5jdGlvbiogdGltaW5nRnVuY3Rpb24gPSBnZXRDQU1lZGlhVGltaW5nRnVu
Y3Rpb24odGYgPyAqdGYgOiBUaW1pbmdGdW5jdGlvbigpKTsKKyAgICBbYmFzaWNBbmltIHNldFRp
bWluZ0Z1bmN0aW9uOnRpbWluZ0Z1bmN0aW9uXTsKKworICAgIC8vIFNlbmQgb3ZlciB0aGUgYW5p
bWF0aW9uLgorICAgIFtsYXllciByZW1vdmVBbmltYXRpb25Gb3JLZXk6YW5pbU5hbWVdOworICAg
IFtsYXllciBhZGRBbmltYXRpb246YmFzaWNBbmltIGZvcktleTphbmltTmFtZV07CisgICAgCisg
ICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6
c2V0S2V5ZnJhbWVBbmltYXRpb24oQW5pbWF0ZWRQcm9wZXJ0eUlEIHByb3BlcnR5LCBjb25zdCBT
dHJpbmcmIHZhbHVlRnVuY3Rpb24sIHNob3J0IGluZGV4LCB2b2lkKiBrZXlzLCB2b2lkKiB2YWx1
ZXMsIHZvaWQqIHRpbWluZ0Z1bmN0aW9ucywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBib29sIGlzVHJhbnNpdGlvbiwgY29uc3QgQW5pbWF0aW9uKiBhbmltLCBkb3VibGUg
YmVnaW5UaW1lKQoreworICAgIFBsYXRmb3JtTGF5ZXIqIGxheWVyID0gYW5pbWF0ZWRMYXllcihw
cm9wZXJ0eSk7CisKKyAgICAvLyBBZGQgYW4gZW50cnkgZm9yIHRoaXMgYW5pbWF0aW9uICh3aGlj
aCBtYXkgY2hhbmdlIGJlZ2luVGltZSkuCisgICAgYWRkQW5pbWF0aW9uRW50cnkocHJvcGVydHks
IGluZGV4LCBpc1RyYW5zaXRpb24sIGFuaW0pOworCisgICAgU3RyaW5nIGtleVBhdGggPSBwcm9w
ZXJ0eUlkVG9TdHJpbmcocHJvcGVydHkpOworICAgIFN0cmluZyBhbmltTmFtZSA9IGtleVBhdGgg
KyAiXyIgKyBTdHJpbmc6Om51bWJlcihpbmRleCk7CisKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VY
Q0VQVElPTlMKKworICAgIENBS2V5ZnJhbWVBbmltYXRpb24qIGtleWZyYW1lQW5pbSA9IFtDQUtl
eWZyYW1lQW5pbWF0aW9uIGFuaW1hdGlvbldpdGhLZXlQYXRoOmtleVBhdGhdOworCisgICAgZG91
YmxlIGR1cmF0aW9uID0gYW5pbS0+ZHVyYXRpb24oKTsKKyAgICBpZiAoZHVyYXRpb24gPD0gMCkK
KyAgICAgICAgZHVyYXRpb24gPSBjQW5pbWF0aW9uQWxtb3N0WmVyb0R1cmF0aW9uOworCisgICAg
ZmxvYXQgcmVwZWF0Q291bnQgPSBhbmltLT5pdGVyYXRpb25Db3VudCgpOworICAgIGlmIChyZXBl
YXRDb3VudCA8IDApCisgICAgICAgIHJlcGVhdENvdW50ID0gRkxUX01BWDsKKyAgICBlbHNlIGlm
IChhbmltLT5kaXJlY3Rpb24oKSkKKyAgICAgICAgcmVwZWF0Q291bnQgLz0gMjsKKworICAgIFtr
ZXlmcmFtZUFuaW0gc2V0RHVyYXRpb246ZHVyYXRpb25dOworICAgIFtrZXlmcmFtZUFuaW0gc2V0
UmVwZWF0Q291bnQ6cmVwZWF0Q291bnRdOworICAgIFtrZXlmcmFtZUFuaW0gc2V0QXV0b3JldmVy
c2VzOmFuaW0tPmRpcmVjdGlvbigpXTsKKyAgICBba2V5ZnJhbWVBbmltIHNldFJlbW92ZWRPbkNv
bXBsZXRpb246Tk9dOworCisgICAgLy8gVGhlIGZpcnN0IGFuaW1hdGlvbiBpcyBub24tYWRkaXRp
dmUsIGFsbCB0aGUgcmVzdCBhcmUgYWRkaXRpdmUuCisgICAgLy8gTm90ZSB0aGF0IGN1cnJlbnRs
eSB0cmFuc2Zvcm0gaXMgdGhlIG9ubHkgcHJvcGVydHkgd2hpY2ggaGFzIGFuaW1hdGlvbnMKKyAg
ICAvLyB3aXRoIGFuIGluZGV4ID4gMAorICAgIC8vIEZJWE1FOiBhZGRpdGl2ZSBhbmltYXRpb25z
IGFyZSBub3Qgc3VwcHJvdGVkLCBzbyB3aHkgdGhpcz8KKyAgICBba2V5ZnJhbWVBbmltIHNldEFk
ZGl0aXZlOihwcm9wZXJ0eSA9PSBBbmltYXRlZFByb3BlcnR5V2Via2l0VHJhbnNmb3JtKSA/IFlF
UyA6IE5PXTsKKyAgICBba2V5ZnJhbWVBbmltIHNldEZpbGxNb2RlOkAiZXh0ZW5kZWQiXTsKKyAg
ICBba2V5ZnJhbWVBbmltIHNldFZhbHVlRnVuY3Rpb246W0NBVmFsdWVGdW5jdGlvbiBmdW5jdGlv
bldpdGhOYW1lOnZhbHVlRnVuY3Rpb25dXTsKKyAgICAKKyAgICBba2V5ZnJhbWVBbmltIHNldEtl
eVRpbWVzOnJlaW50ZXJwcmV0X2Nhc3Q8aWQ+KGtleXMpXTsKKyAgICBba2V5ZnJhbWVBbmltIHNl
dFZhbHVlczpyZWludGVycHJldF9jYXN0PGlkPih2YWx1ZXMpXTsKKyAgICAKKyAgICAvLyBTZXQg
dGhlIGRlbGVnYXRlIChhbmQgcHJvcGVydHkgdmFsdWUpLgorICAgIGludCBwcm9wID0gaXNUcmFu
c2l0aW9uID8gcHJvcGVydHkgOiBBbmltYXRlZFByb3BlcnR5SW52YWxpZDsKKyAgICBba2V5ZnJh
bWVBbmltIHNldFZhbHVlOltOU051bWJlciBudW1iZXJXaXRoSW50OiBwcm9wXSBmb3JLZXk6V2Vi
QW5pbWF0aW9uQ1NTUHJvcGVydHlLZXldOworICAgIFtrZXlmcmFtZUFuaW0gc2V0RGVsZWdhdGU6
bV9hbmltYXRpb25EZWxlZ2F0ZS5nZXQoKV07CisKKyAgICBOU1RpbWVJbnRlcnZhbCBidCA9IGJl
Z2luVGltZSA/IFtsYXllciBjb252ZXJ0VGltZTpjdXJyZW50VGltZVRvTWVkaWFUaW1lKGJlZ2lu
VGltZSkgZnJvbUxheWVyOm5pbF0gOiAwOworICAgIFtrZXlmcmFtZUFuaW0gc2V0QmVnaW5UaW1l
OmJ0XTsKKyAgICAKKyAgICAvLyBTZXQgdGhlIHRpbWluZyBmdW5jdGlvbnMsIGlmIGFueS4KKyAg
ICBpZiAodGltaW5nRnVuY3Rpb25zICE9IG5pbCkKKyAgICAgICAgW2tleWZyYW1lQW5pbSBzZXRU
aW1pbmdGdW5jdGlvbnM6KGlkKXRpbWluZ0Z1bmN0aW9uc107CisgICAgICAgIAorICAgIC8vIFNl
bmQgb3ZlciB0aGUgYW5pbWF0aW9uLgorICAgIFtsYXllciByZW1vdmVBbmltYXRpb25Gb3JLZXk6
YW5pbU5hbWVdOworICAgIFtsYXllciBhZGRBbmltYXRpb246a2V5ZnJhbWVBbmltIGZvcktleTph
bmltTmFtZV07CisgICAgICAgIAorICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKK30KKwor
dm9pZCBHcmFwaGljc0xheWVyQ0E6OnN1c3BlbmRBbmltYXRpb25zKCkKK3sKKyAgICBkb3VibGUg
dCA9IGN1cnJlbnRUaW1lVG9NZWRpYVRpbWUoY3VycmVudFRpbWUoKSk7CisgICAgW3ByaW1hcnlM
YXllcigpIHNldFNwZWVkOjBdOworICAgIFtwcmltYXJ5TGF5ZXIoKSBzZXRUaW1lT2Zmc2V0OnRd
OworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6cmVzdW1lQW5pbWF0aW9ucygpCit7CisgICAg
W3ByaW1hcnlMYXllcigpIHNldFNwZWVkOjFdOworICAgIFtwcmltYXJ5TGF5ZXIoKSBzZXRUaW1l
T2Zmc2V0OjBdOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6cmVtb3ZlQW5pbWF0aW9uKGlu
dCBpbmRleCwgYm9vbCByZXNldCkKK3sKKyAgICBBU1NFUlQoaW5kZXggPj0gMCk7CisKKyAgICBB
bmltYXRlZFByb3BlcnR5SUQgcHJvcGVydHkgPSBtX2FuaW1hdGlvbnNbaW5kZXhdLnByb3BlcnR5
KCk7CisgICAgCisgICAgLy8gU2V0IHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgYW5kIHJlbW92
ZSB0aGUgYW5pbWF0aW9uLgorICAgIFN0cmluZyBrZXlQYXRoID0gcHJvcGVydHlJZFRvU3RyaW5n
KHByb3BlcnR5KTsKKyAgICBTdHJpbmcgYW5pbU5hbWUgPSBrZXlQYXRoICsgIl8iICsgU3RyaW5n
OjpudW1iZXIobV9hbmltYXRpb25zW2luZGV4XS5pbmRleCgpKTsKKyAgICBDQUxheWVyKiBsYXll
ciA9IGFuaW1hdGVkTGF5ZXIocHJvcGVydHkpOworCisgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENF
UFRJT05TCisKKyAgICAvLyBJZiB3ZSBhcmUgbm90IHJlc2V0dGluZywgaXQgbWVhbnMgd2UgYXJl
IHBhdXNpbmcuIFNvIHdlIG5lZWQgdG8gZ2V0IHRoZSBjdXJyZW50IHByZXNlbnRhdGlvbgorICAg
IC8vIHZhbHVlIGludG8gdGhlIHByb3BlcnR5IGJlZm9yZSB3ZSByZW1vdmUgdGhlIGFuaW1hdGlv
bi4KKyAgICBpZiAoIXJlc2V0KSB7CisgICAgICAgIC8vIFB1dCB0aGUgY3VycmVudCB2YWx1ZSBp
bnRvIHRoZSBwcm9wZXJ0eS4KKyAgICAgICAgQ0FMYXllciogcHJlc0xheWVyID0gW2xheWVyIHBy
ZXNlbnRhdGlvbkxheWVyXTsKKyAgICAgICAgaWYgKHByZXNMYXllcikKKyAgICAgICAgICAgIFts
YXllciBzZXRWYWx1ZTpbcHJlc0xheWVyIHZhbHVlRm9yS2V5UGF0aDprZXlQYXRoXSBmb3JLZXlQ
YXRoOmtleVBhdGhdOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgc2F2ZWQgdmFsdWVzIGFj
Y3VyYXRlbHkgcmVmbGVjdCB0aGUgdmFsdWUgaW4gdGhlIGxheWVyLgorICAgICAgICBpZCB2YWwg
PSBbbGF5ZXIgdmFsdWVGb3JLZXlQYXRoOmtleVBhdGhdOworICAgICAgICBzd2l0Y2ggKHByb3Bl
cnR5KSB7CisgICAgICAgICAgICBjYXNlIEFuaW1hdGVkUHJvcGVydHlXZWJraXRUcmFuc2Zvcm06
CisgICAgICAgICAgICAgICAgLy8gRklYTUU6IG5lZWRzIGNvbW1lbnQgZXhwbGFpbmluZyB3aHkg
dGhlIG1fdHJhbnNmb3JtIGlzIG5vdCBvYnRhaW5lZCBmcm9tIHRoZSBsYXllcgorICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBbmltYXRlZFByb3BlcnR5QmFja2dyb3Vu
ZENvbG9yOgorICAgICAgICAgICAgICAgIG1fYmFja2dyb3VuZENvbG9yID0gQ29sb3IocmVpbnRl
cnByZXRfY2FzdDxDR0NvbG9yUmVmPih2YWwpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgIGNhc2UgQW5pbWF0ZWRQcm9wZXJ0eU9wYWNpdHk6CisgICAgICAgICAgICAgICAg
bV9vcGFjaXR5ID0gW3ZhbCBmbG9hdFZhbHVlXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgIGNhc2UgQW5pbWF0ZWRQcm9wZXJ0eUludmFsaWQ6CisgICAgICAgICAgICAgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0K
KyAgICB9CisgICAgCisgICAgLy8gSWYgd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgYW4gYW5p
bWF0aW9uLCB3ZSBkb24ndCB3YW50IHRvIGFjdHVhbGx5IHJlbW92ZSB0aGUgCisgICAgLy8gYW5p
bWF0aW9uIGZyb20gdGhlIENBTGF5ZXIuIEF0IHNvbWUgcG9pbnQgd2Ugd2lsbCBiZSBzZXR0aW5n
IHRoZSBwcm9wZXJ0eSB0byBpdHMKKyAgICAvLyB1bmFuaW1hdGVkIHZhbHVlIGFuZCBhdCB0aGF0
IHBvaW50IHdlIHdpbGwgcmVtb3ZlIHRoZSBhbmltYXRpb24uIFRoYXQgd2lsbCBhdm9pZAorICAg
IC8vIGFueSBmbGFzaGluZyBiZXR3ZWVuIHRoZSB0aW1lIHRoZSBhbmltYXRpb24gaXMgcmVtb3Zl
ZCBhbmQgdGhlIHByb3BlcnR5IGlzIHNldC4KKyAgICBpZiAoIXJlc2V0IHx8IG1fYW5pbWF0aW9u
c1tpbmRleF0uaXNUcmFuc2l0aW9uKCkpCisgICAgICAgIFtsYXllciByZW1vdmVBbmltYXRpb25G
b3JLZXk6YW5pbU5hbWVdOworCisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUworCisgICAg
Ly8gUmVtb3ZlIHRoZSBhbmltYXRpb24gZW50cnkuCisgICAgbV9hbmltYXRpb25zLnJlbW92ZShp
bmRleCk7Cit9CisKK1BsYXRmb3JtTGF5ZXIqIEdyYXBoaWNzTGF5ZXJDQTo6aG9zdExheWVyRm9y
U3VibGF5ZXJzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90cmFuc2Zvcm1MYXllciA/IG1fdHJh
bnNmb3JtTGF5ZXIuZ2V0KCkgOiBtX2xheWVyLmdldCgpOworfQorCitQbGF0Zm9ybUxheWVyKiBH
cmFwaGljc0xheWVyQ0E6OmxheWVyRm9yU3VwZXJsYXllcigpIGNvbnN0Cit7CisgICAgaWYgKG1f
dHJhbnNmb3JtTGF5ZXIpCisgICAgICAgIHJldHVybiBtX3RyYW5zZm9ybUxheWVyLmdldCgpOwor
CisgICAgcmV0dXJuIG1fbGF5ZXIuZ2V0KCk7Cit9CisKK1BsYXRmb3JtTGF5ZXIqIEdyYXBoaWNz
TGF5ZXJDQTo6cGxhdGZvcm1MYXllcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIHByaW1hcnlMYXll
cigpOworfQorCisjaWZuZGVmIE5ERUJVRwordm9pZCBHcmFwaGljc0xheWVyQ0E6OnNldERlYnVn
QmFja2dyb3VuZENvbG9yKGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBCRUdJTl9CTE9DS19P
QkpDX0VYQ0VQVElPTlMKKyAgICAKKyAgICBpZiAoY29sb3IuaXNWYWxpZCgpKQorICAgICAgICBz
ZXRMYXllckJhY2tncm91bmRDb2xvcihtX2xheWVyLmdldCgpLCBjb2xvcik7CisgICAgZWxzZQor
ICAgICAgICBjbGVhckxheWVyQmFja2dyb3VuZENvbG9yKG1fbGF5ZXIuZ2V0KCkpOworICAgIAor
ICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKK30KKwordm9pZCBHcmFwaGljc0xheWVyQ0E6
OnNldERlYnVnQm9yZGVyKGNvbnN0IENvbG9yJiBjb2xvciwgZmxvYXQgYm9yZGVyV2lkdGgpCit7
CisgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgCisgICAgaWYgKGNvbG9yLmlz
VmFsaWQoKSkgeworICAgICAgICBzZXRMYXllckJvcmRlckNvbG9yKG1fbGF5ZXIuZ2V0KCksIGNv
bG9yKTsKKyAgICAgICAgW21fbGF5ZXIuZ2V0KCkgc2V0Qm9yZGVyV2lkdGg6Ym9yZGVyV2lkdGhd
OworICAgIH0gZWxzZSB7CisgICAgICAgIGNsZWFyQm9yZGVyQ29sb3IobV9sYXllci5nZXQoKSk7
CisgICAgICAgIFttX2xheWVyLmdldCgpIHNldEJvcmRlcldpZHRoOjBdOworICAgIH0KKyAgICAK
KyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckNB
OjpzZXRaUG9zaXRpb24oZmxvYXQgcG9zaXRpb24pCit7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0
WlBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAKKyAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElP
TlMKKyAgICBbcHJpbWFyeUxheWVyKCkgc2V0WlBvc2l0aW9uOnBvc2l0aW9uXTsKKyAgICBFTkRf
QkxPQ0tfT0JKQ19FWENFUFRJT05TCit9CisjZW5kaWYKKworYm9vbCBHcmFwaGljc0xheWVyQ0E6
OnJlcXVpcmVzVGlsZWRMYXllcihjb25zdCBGbG9hdFNpemUmIHNpemUpIGNvbnN0Cit7CisgICAg
aWYgKCFtX2RyYXdzQ29udGVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gRklY
TUU6IGNhdGNoIHplcm8tc2l6ZSBoZWlnaHQgb3Igd2lkdGggaGVyZSAob3IgZWFybGllcik/Cisg
ICAgcmV0dXJuIHNpemUud2lkdGgoKSA+IGNNYXhQaXhlbERpbWVuc2lvbiB8fCBzaXplLmhlaWdo
dCgpID4gY01heFBpeGVsRGltZW5zaW9uOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6c3dh
cEZyb21PclRvVGlsZWRMYXllcihib29sIHVzZXJUaWxlZExheWVyKQoreworICAgIGlmICh1c2Vy
VGlsZWRMYXllciA9PSBtX3VzaW5nVGlsZWRMYXllcikKKyAgICAgICAgcmV0dXJuOworCisgICAg
Q0dTaXplIHRpbGVTaXplID0gQ0dTaXplTWFrZShjVGlsZWRMYXllclRpbGVTaXplLCBjVGlsZWRM
YXllclRpbGVTaXplKTsKKworICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgIAor
ICAgIFJldGFpblB0cjxDQUxheWVyPiBvbGRMYXllciA9IG1fbGF5ZXIuZ2V0KCk7CisgICAgCisg
ICAgQ2xhc3MgbGF5ZXJDbGFzcyA9IHVzZXJUaWxlZExheWVyID8gW1dlYlRpbGVkTGF5ZXIgc2Vs
Zl0gOiBbV2ViTGF5ZXIgc2VsZl07CisgICAgbV9sYXllci5hZG9wdE5TKFtbbGF5ZXJDbGFzcyBh
bGxvY10gaW5pdF0pOworCisgICAgaWYgKHVzZXJUaWxlZExheWVyKSB7CisgICAgICAgIFdlYlRp
bGVkTGF5ZXIqIHRpbGVkTGF5ZXIgPSAoV2ViVGlsZWRMYXllciopbV9sYXllci5nZXQoKTsKKyAg
ICAgICAgW3RpbGVkTGF5ZXIgc2V0VGlsZVNpemU6dGlsZVNpemVdOworICAgICAgICBbdGlsZWRM
YXllciBzZXRMZXZlbHNPZkRldGFpbDoxXTsKKyAgICAgICAgW3RpbGVkTGF5ZXIgc2V0TGV2ZWxz
T2ZEZXRhaWxCaWFzOjBdOworCisgICAgICAgIGlmIChHcmFwaGljc0xheWVyOjpncmFwaGljc0Nv
bnRleHRzRmxpcHBlZCgpKQorICAgICAgICAgICAgW3RpbGVkTGF5ZXIgc2V0Q29udGVudHNHcmF2
aXR5OkAiYm90dG9tTGVmdCJdOworICAgICAgICBlbHNlCisgICAgICAgICAgICBbdGlsZWRMYXll
ciBzZXRDb250ZW50c0dyYXZpdHk6QCJ0b3BMZWZ0Il07CisgICAgfQorICAgIAorICAgIFttX2xh
eWVyLmdldCgpIHNldExheWVyT3duZXI6dGhpc107CisgICAgW21fbGF5ZXIuZ2V0KCkgc2V0U3Vi
bGF5ZXJzOltvbGRMYXllci5nZXQoKSBzdWJsYXllcnNdXTsKKyAgICAKKyAgICBbW29sZExheWVy
LmdldCgpIHN1cGVybGF5ZXJdIHJlcGxhY2VTdWJsYXllcjpvbGRMYXllci5nZXQoKSB3aXRoOm1f
bGF5ZXIuZ2V0KCldOworICAgIAorICAgIFttX2xheWVyLmdldCgpIHNldEJvdW5kczpbb2xkTGF5
ZXIuZ2V0KCkgYm91bmRzXV07CisgICAgW21fbGF5ZXIuZ2V0KCkgc2V0UG9zaXRpb246W29sZExh
eWVyLmdldCgpIHBvc2l0aW9uXV07CisgICAgW21fbGF5ZXIuZ2V0KCkgc2V0QW5jaG9yUG9pbnQ6
W29sZExheWVyLmdldCgpIGFuY2hvclBvaW50XV07CisgICAgW21fbGF5ZXIuZ2V0KCkgc2V0T3Bh
cXVlOltvbGRMYXllci5nZXQoKSBpc09wYXF1ZV1dOworICAgIFttX2xheWVyLmdldCgpIHNldE9w
YWNpdHk6W29sZExheWVyLmdldCgpIG9wYWNpdHldXTsKKyAgICBbbV9sYXllci5nZXQoKSBzZXRU
cmFuc2Zvcm06W29sZExheWVyLmdldCgpIHRyYW5zZm9ybV1dOworICAgIFttX2xheWVyLmdldCgp
IHNldFN1YmxheWVyVHJhbnNmb3JtOltvbGRMYXllci5nZXQoKSBzdWJsYXllclRyYW5zZm9ybV1d
OworICAgIFttX2xheWVyLmdldCgpIHNldERvdWJsZVNpZGVkOltvbGRMYXllci5nZXQoKSBpc0Rv
dWJsZVNpZGVkXV07CisjaWZuZGVmIE5ERUJVRworICAgIFttX2xheWVyLmdldCgpIHNldFpQb3Np
dGlvbjpbb2xkTGF5ZXIuZ2V0KCkgelBvc2l0aW9uXV07CisjZW5kaWYKKyAgICAKKyNpZm5kZWYg
TkRFQlVHCisgICAgU3RyaW5nIG5hbWUgPSBTdHJpbmc6OmZvcm1hdCgiQ0FMYXllciglcCkgR3Jh
cGhpY3NMYXllciglcCkgIiwgbV9sYXllci5nZXQoKSwgdGhpcykgKyBtX25hbWU7CisgICAgW21f
bGF5ZXIuZ2V0KCkgc2V0TmFtZTpuYW1lXTsKKyNlbmRpZgorCisgICAgLy8gbW92ZSBvdmVyIGFu
aW1hdGlvbnMKKyAgICBtb3ZlQW5pbWF0aW9uKEFuaW1hdGVkUHJvcGVydHlXZWJraXRUcmFuc2Zv
cm0sIG9sZExheWVyLmdldCgpLCBtX2xheWVyLmdldCgpKTsKKyAgICBtb3ZlQW5pbWF0aW9uKEFu
aW1hdGVkUHJvcGVydHlPcGFjaXR5LCBvbGRMYXllci5nZXQoKSwgbV9sYXllci5nZXQoKSk7Cisg
ICAgbW92ZUFuaW1hdGlvbihBbmltYXRlZFByb3BlcnR5QmFja2dyb3VuZENvbG9yLCBvbGRMYXll
ci5nZXQoKSwgbV9sYXllci5nZXQoKSk7CisgICAgCisgICAgLy8gbmVlZCB0byB0ZWxsIG5ldyBs
YXllciB0byBkcmF3IGl0c2VsZgorICAgIHNldE5lZWRzRGlzcGxheSgpOworICAgIAorICAgIEVO
RF9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICAKKyAgICBtX3VzaW5nVGlsZWRMYXllciA9IHVz
ZXJUaWxlZExheWVyOworICAgIAorI2lmbmRlZiBOREVCVUcKKyAgICB1cGRhdGVEZWJ1Z0luZGlj
YXRvcnMoKTsKKyNlbmRpZgorfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6c2V0SGFzQ29udGVu
dHNMYXllcihib29sIGhhc0xheWVyKQoreworICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9O
UworCisgICAgaWYgKGhhc0xheWVyICYmICFtX2NvbnRlbnRzTGF5ZXIpIHsKKyAgICAgICAgLy8g
Y3JlYXRlIHRoZSBpbm5lciBsYXllcgorICAgICAgICBXZWJMYXllciogY29udGVudHNMYXllciA9
IFtXZWJMYXllciBsYXllcl07CisjaWZuZGVmIE5ERUJVRworICAgICAgICBbY29udGVudHNMYXll
ciBzZXROYW1lOkAiQ29udGVudHMgTGF5ZXIiXTsKKyNlbmRpZgorICAgICAgICBzZXRDb250ZW50
c0xheWVyKGNvbnRlbnRzTGF5ZXIpOworCisgICAgfSBlbHNlIGlmICghaGFzTGF5ZXIgJiYgbV9j
b250ZW50c0xheWVyKQorICAgICAgICBzZXRDb250ZW50c0xheWVyKDApOworCisgICAgRU5EX0JM
T0NLX09CSkNfRVhDRVBUSU9OUworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6c2V0Q29udGVu
dHNMYXllcihXZWJMYXllciogY29udGVudHNMYXllcikKK3sKKyAgICBpZiAoY29udGVudHNMYXll
ciA9PSBtX2NvbnRlbnRzTGF5ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIEJFR0lOX0JMT0NL
X09CSkNfRVhDRVBUSU9OUworCisgICAgaWYgKG1fY29udGVudHNMYXllcikgeworICAgICAgICBb
bV9jb250ZW50c0xheWVyLmdldCgpIHJlbW92ZUZyb21TdXBlcmxheWVyXTsKKyAgICAgICAgbV9j
b250ZW50c0xheWVyID0gMDsKKyAgICB9CisgICAgCisgICAgaWYgKGNvbnRlbnRzTGF5ZXIpIHsK
KyAgICAgICAgLy8gVHVybiBvZmYgaW1wbGljaXQgYW5pbWF0aW9ucyBvbiB0aGUgaW5uZXIgbGF5
ZXIuCisgICAgICAgIFtjb250ZW50c0xheWVyIHNldFN0eWxlOltOU0RpY3Rpb25hcnkgZGljdGlv
bmFyeVdpdGhPYmplY3Q6bnVsbEFjdGlvbnNEaWN0aW9uYXJ5KCkgZm9yS2V5OkAiYWN0aW9ucyJd
XTsKKworICAgICAgICBtX2NvbnRlbnRzTGF5ZXIuYWRvcHROUyhbY29udGVudHNMYXllciByZXRh
aW5dKTsKKyAgICAgICAgW21fY29udGVudHNMYXllci5nZXQoKSBzZXRBbmNob3JQb2ludDpDR1Bv
aW50WmVyb107CisgICAgICAgIFttX2xheWVyLmdldCgpIGFkZFN1YmxheWVyOm1fY29udGVudHNM
YXllci5nZXQoKV07CisKKyAgICAgICAgdXBkYXRlQ29udGVudHNSZWN0KCk7CisKKyAgICAgICAg
Ly8gU2V0IGNvbnRlbnRzIHRvIG5pbCBpZiB0aGUgbGF5ZXIgZG9lcyBub3QgZHJhdyBpdHMgb3du
IGNvbnRlbnQuCisgICAgICAgIGlmIChtX2NsaWVudCAmJiAhZHJhd3NDb250ZW50KCkpCisgICAg
ICAgICAgICBbbV9sYXllci5nZXQoKSBzZXRDb250ZW50czpuaWxdOworCisjaWZuZGVmIE5ERUJV
RworICAgICAgICBpZiAoc2hvd0RlYnVnQm9yZGVycygpKSB7CisgICAgICAgICAgICBzZXRMYXll
ckJvcmRlckNvbG9yKG1fY29udGVudHNMYXllci5nZXQoKSwgQ29sb3IoMCwgMCwgMTI4LCAxODAp
KTsKKyAgICAgICAgICAgIFttX2NvbnRlbnRzTGF5ZXIuZ2V0KCkgc2V0Qm9yZGVyV2lkdGg6MS4w
Zl07CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyNpZm5kZWYgTkRFQlVHCisgICAgdXBkYXRl
RGVidWdJbmRpY2F0b3JzKCk7CisjZW5kaWYKKworICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElP
TlMKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisKKyNlbmRpZiAvLyBVU0UoQUNDRUxF
UkFURURfQ09NUE9TSVRJTkcpCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L21hYy9XZWJMYXllci5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvV2ViTGF5ZXIu
aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGI0NmVkCi0tLSAvZGV2L251
bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvV2ViTGF5ZXIuaApAQCAtMCww
ICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01Q
VVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworCisjaWZuZGVmIFdlYkxheWVyX2gKKyNkZWZpbmUgV2ViTGF5ZXJfaAorCisjaWYg
VVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjaW1wb3J0IDxRdWFydHpDb3JlL1F1YXJ0
ekNvcmUuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworICAgIGNsYXNzIEdyYXBoaWNzTGF5ZXI7
Cit9CisKKy8vIENhdGVnb3J5IGltcGxlbWVudGVkIGJ5IFdlYkxheWVyIGFuZCBXZWJUaWxlZExh
eWVyLgorQGludGVyZmFjZSBDQUxheWVyKFdlYkxheWVyQWRkaXRpb25zKQorCistICh2b2lkKXNl
dExheWVyT3duZXI6KFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXIqKWxheWVyOworLSAoV2ViQ29yZTo6
R3JhcGhpY3NMYXllciopbGF5ZXJPd25lcjsKKworQGVuZAorCitAaW50ZXJmYWNlIFdlYkxheWVy
IDogQ0FMYXllciAKK3sKKyAgICBXZWJDb3JlOjpHcmFwaGljc0xheWVyKiBtX2xheWVyT3duZXI7
Cit9CisKKy8vIENsYXNzIG1ldGhvZCBhbGxvd3MgdXMgdG8gc2hhcmUgaW1wbGVtZW50YXRpb24g
YWNyb3NzIFRpbGVkTGF5ZXJNYWMgYW5kIFdlYkxheWVyCisrICh2b2lkKWRyYXdDb250ZW50czoo
V2ViQ29yZTo6R3JhcGhpY3NMYXllciopbGF5ZXJDb250ZW50cyBvZkxheWVyOihDQUxheWVyKils
YXllciBpbnRvQ29udGV4dDooQ0dDb250ZXh0UmVmKWNvbnRleHQ7CisKK0BlbmQKKworI2VuZGlm
IC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2VuZGlmIC8vIFdlYkxheWVyX2gK
ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1dlYkxheWVyLm1tIGIv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvV2ViTGF5ZXIubW0KbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMC4uODg5MjVkMQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1dlYkxheWVyLm1tCkBAIC0wLDAgKzEsMjI1IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNp
bXBvcnQgIldlYkxheWVyLmgiCisKKyNpbXBvcnQgIkdyYXBoaWNzQ29udGV4dC5oIgorI2ltcG9y
dCAiR3JhcGhpY3NMYXllci5oIgorI2ltcG9ydCA8UXVhcnR6Q29yZS9RdWFydHpDb3JlLmg+Cisj
aW1wb3J0ICJXZWJDb3JlVGV4dFJlbmRlcmVyLmgiCisjaW1wb3J0IDx3dGYvVW51c2VkUGFyYW0u
aD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK0BpbXBsZW1lbnRhdGlvbiBXZWJMYXll
cgorCisrICh2b2lkKWRyYXdDb250ZW50czooV2ViQ29yZTo6R3JhcGhpY3NMYXllciopbGF5ZXJD
b250ZW50cyBvZkxheWVyOihDQUxheWVyKilsYXllciBpbnRvQ29udGV4dDooQ0dDb250ZXh0UmVm
KWNvbnRleHQKK3sKKyAgICBVTlVTRURfUEFSQU0obGF5ZXIpOworICAgIENHQ29udGV4dFNhdmVH
U3RhdGUoY29udGV4dCk7CisgICAgCisgICAgaWYgKGxheWVyQ29udGVudHMgJiYgbGF5ZXJDb250
ZW50cy0+Y2xpZW50KCkpIHsKKyAgICAgICAgW05TR3JhcGhpY3NDb250ZXh0IHNhdmVHcmFwaGlj
c1N0YXRlXTsKKworICAgICAgICAvLyBTZXQgdXAgYW4gTlNHcmFwaGljc0NvbnRleHQgZm9yIHRo
ZSBjb250ZXh0LCBzbyB0aGF0IHBhcnRzIG9mIEFwcEtpdCB0aGF0IHJlbHkgb24KKyAgICAgICAg
Ly8gdGhlIGN1cnJlbnQgTlNHcmFwaGljc0NvbnRleHQgKGUuZy4gTlNDZWxsIGRyYXdpbmcpIGdl
dCB0aGUgcmlnaHQgb25lLgorICAgICAgICBOU0dyYXBoaWNzQ29udGV4dCogbGF5ZXJDb250ZXh0
ID0gW05TR3JhcGhpY3NDb250ZXh0IGdyYXBoaWNzQ29udGV4dFdpdGhHcmFwaGljc1BvcnQ6Y29u
dGV4dCBmbGlwcGVkOllFU107CisgICAgICAgIFtOU0dyYXBoaWNzQ29udGV4dCBzZXRDdXJyZW50
Q29udGV4dDpsYXllckNvbnRleHRdOworCisgICAgICAgIEdyYXBoaWNzQ29udGV4dCBncmFwaGlj
c0NvbnRleHQoY29udGV4dCk7CisKKyAgICAgICAgLy8gV2hlbiBkcmF3aW5nIGludG8gQ0FMYXll
cnMsIHdlIG5lZWQgdG8gdHVybiBvZmYgZm9udCBzbW9vdGhpbmcgKGFrYSBMQ0QgYW50aWFsaWFz
aW5nKS4KKyAgICAgICAgYm9vbCB3YXNTbW9vdGhpbmcgPSBncmFwaGljc0NvbnRleHQudXNpbmdG
b250U21vb3RoaW5nKCk7CisgICAgICAgIGdyYXBoaWNzQ29udGV4dC5zZXRVc2VGb250U21vb3Ro
aW5nKGZhbHNlKTsKKworICAgICAgICAvLyBJdCdzIGltcG9ydGFudCB0byBnZXQgdGhlIGNsaXAg
ZnJvbSB0aGUgY29udGV4dCwgYmVjYXVzZSBpdCBtYXkgYmUgc2lnbmlmaWNhbnRseQorICAgICAg
ICAvLyBzbWFsbGVyIHRoYW4gdGhlIGxheWVyIGJvdW5kcyAoZS5nLiB0aWxlZCBsYXllcnMpCisg
ICAgICAgIENHUmVjdCBjbGlwQm91bmRzID0gQ0dDb250ZXh0R2V0Q2xpcEJvdW5kaW5nQm94KGNv
bnRleHQpOworICAgICAgICBJbnRSZWN0IGNsaXAoZW5jbG9zaW5nSW50UmVjdChjbGlwQm91bmRz
KSk7CisgICAgICAgIGxheWVyQ29udGVudHMtPnBhaW50R3JhcGhpY3NMYXllckNvbnRlbnRzKGdy
YXBoaWNzQ29udGV4dCwgY2xpcCk7CisKKyAgICAgICAgZ3JhcGhpY3NDb250ZXh0LnNldFVzZUZv
bnRTbW9vdGhpbmcod2FzU21vb3RoaW5nKTsKKworICAgICAgICBbTlNHcmFwaGljc0NvbnRleHQg
cmVzdG9yZUdyYXBoaWNzU3RhdGVdOworICAgIH0KKyNpZm5kZWYgTkRFQlVHCisgICAgZWxzZSB7
CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworCisgICAgICAgIC8vIEZJWE1FOiBpZGVh
bGx5IHdlJ2QgYXZvaWQgY2FsbGluZyAtc2V0TmVlZHNEaXNwbGF5IG9uIGEgbGF5ZXIgdGhhdCBp
cyBhIHBsYWluIGNvbG9yLAorICAgICAgICAvLyBzbyBDQSBuZXZlciBtYWtlcyBiYWNraW5nIHN0
b3JlIGZvciBpdCAod2hpY2ggaXMgd2hhdCAtc2V0TmVlZHNEaXNwbGF5IHdpbGwgZG8gYWJvdmUp
LgorICAgICAgICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoY29udGV4dCwgMC4wZiwgMS4wZiwg
MC4wZiwgMS4wZik7CisgICAgICAgIENHUmVjdCBhQm91bmRzID0gW2xheWVyIGJvdW5kc107Cisg
ICAgICAgIENHQ29udGV4dEZpbGxSZWN0KGNvbnRleHQsIGFCb3VuZHMpOworICAgIH0KKyNlbmRp
ZgorCisgICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShjb250ZXh0KTsKKworI2lmbmRlZiBOREVC
VUcKKyAgICBpZiAobGF5ZXJDb250ZW50cyAmJiBsYXllckNvbnRlbnRzLT5zaG93UmVwYWludENv
dW50ZXIoKSkgeworICAgICAgICBib29sIGlzVGlsZWRMYXllciA9IFtsYXllciBpc0tpbmRPZkNs
YXNzOltDQVRpbGVkTGF5ZXIgY2xhc3NdXTsKKworICAgICAgICBjaGFyIHRleHRbMTZdOyAvLyB0
aGF0J3MgYSBsb3Qgb2YgcmVwYWludHMKKyAgICAgICAgc25wcmludGYodGV4dCwgc2l6ZW9mKHRl
eHQpLCAiJWQiLCBsYXllckNvbnRlbnRzLT5pbmNyZW1lbnRSZXBhaW50Q291bnQoKSk7CisKKyAg
ICAgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gYSA9IENHQ29udGV4dEdldENUTShjb250ZXh0KTsKKyAg
ICAgICAgCisgICAgICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7CisgICAgICAgIGlm
IChpc1RpbGVkTGF5ZXIpCisgICAgICAgICAgICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoY29u
dGV4dCwgMC4wZiwgMS4wZiwgMC4wZiwgMC44Zik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IENHQ29udGV4dFNldFJHQkZpbGxDb2xvcihjb250ZXh0LCAxLjBmLCAwLjBmLCAwLjBmLCAwLjhm
KTsKKyAgICAgICAgCisgICAgICAgIENHUmVjdCBhQm91bmRzID0gW2xheWVyIGJvdW5kc107CisK
KyAgICAgICAgYUJvdW5kcy5zaXplLndpZHRoID0gMTAgKyAxMiAqIHN0cmxlbih0ZXh0KTsKKyAg
ICAgICAgYUJvdW5kcy5zaXplLmhlaWdodCA9IDI1OworICAgICAgICBDR0NvbnRleHRGaWxsUmVj
dChjb250ZXh0LCBhQm91bmRzKTsKKyAgICAgICAgCisgICAgICAgIENHQ29udGV4dFNldFJHQkZp
bGxDb2xvcihjb250ZXh0LCAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmKTsKKworICAgICAgICBDR0Nv
bnRleHRTZXRUZXh0TWF0cml4KGNvbnRleHQsIENHQWZmaW5lVHJhbnNmb3JtTWFrZVNjYWxlKDEu
MGYsIC0xLjBmKSk7CisgICAgICAgIENHQ29udGV4dFNlbGVjdEZvbnQoY29udGV4dCwgIkhlbHZl
dGljYSIsIDI1LCBrQ0dFbmNvZGluZ01hY1JvbWFuKTsKKyAgICAgICAgQ0dDb250ZXh0U2hvd1Rl
eHRBdFBvaW50KGNvbnRleHQsIGFCb3VuZHMub3JpZ2luLnggKyAzLjBmLCBhQm91bmRzLm9yaWdp
bi55ICsgMjAuMGYsIHRleHQsIHN0cmxlbih0ZXh0KSk7CisgICAgICAgIAorICAgICAgICBDR0Nv
bnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOyAgICAgICAgCisgICAgfQorI2VuZGlmCit9CisK
Ky8vIERpc2FibGUgZGVmYXVsdCBhbmltYXRpb25zCistIChpZDxDQUFjdGlvbj4pYWN0aW9uRm9y
S2V5OihOU1N0cmluZyAqKWtleQoreworICAgIFVOVVNFRF9QQVJBTShrZXkpOworICAgIHJldHVy
biBuaWw7Cit9CisKKy8vIEltcGxlbWVudCB0aGlzIHNvIHByZXNlbnRhdGlvbkxheWVyIGNhbiBn
ZXQgb3VyIGN1c3RvbSBhdHRyaWJ1dGVzCistIChpZClpbml0V2l0aExheWVyOihpZClsYXllcgor
eworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aExheWVyOmxheWVyXSkpCisgICAgICAg
IG1fbGF5ZXJPd25lciA9IFsoV2ViTGF5ZXIqKWxheWVyIGxheWVyT3duZXJdOworCisgICAgcmV0
dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpc2V0TmVlZHNEaXNwbGF5Cit7CisgICAgaWYgKG1fbGF5
ZXJPd25lciAmJiBtX2xheWVyT3duZXItPmNsaWVudCgpICYmIG1fbGF5ZXJPd25lci0+ZHJhd3ND
b250ZW50KCkpCisgICAgICAgIFtzdXBlciBzZXROZWVkc0Rpc3BsYXldOworfQorCistICh2b2lk
KXNldE5lZWRzRGlzcGxheUluUmVjdDooQ0dSZWN0KWRpcnR5UmVjdAoreworICAgIGlmIChtX2xh
eWVyT3duZXIgJiYgbV9sYXllck93bmVyLT5jbGllbnQoKSAmJiBtX2xheWVyT3duZXItPmRyYXdz
Q29udGVudCgpKSB7CisgICAgICAgIFtzdXBlciBzZXROZWVkc0Rpc3BsYXlJblJlY3Q6ZGlydHlS
ZWN0XTsKKworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgaWYgKG1fbGF5ZXJPd25lci0+c2hvd1Jl
cGFpbnRDb3VudGVyKCkpIHsKKyAgICAgICAgICAgIENHUmVjdCBib3VuZHMgPSBbc2VsZiBib3Vu
ZHNdOworICAgICAgICAgICAgW3N1cGVyIHNldE5lZWRzRGlzcGxheUluUmVjdDpDR1JlY3RNYWtl
KGJvdW5kcy5vcmlnaW4ueCwgYm91bmRzLm9yaWdpbi55LCA0NiwgMjUpXTsKKyAgICAgICAgfQor
I2VuZGlmCisgICAgfQorfQorCistICh2b2lkKWRyYXdJbkNvbnRleHQ6KENHQ29udGV4dFJlZilj
b250ZXh0Cit7CisgICAgW1dlYkxheWVyIGRyYXdDb250ZW50czptX2xheWVyT3duZXIgb2ZMYXll
cjpzZWxmIGludG9Db250ZXh0OmNvbnRleHRdOworfQorCitAZW5kIC8vIGltcGxlbWVudGF0aW9u
IFdlYkxheWVyCisKKyNwcmFnbWEgbWFyayAtCisKK0BpbXBsZW1lbnRhdGlvbiBXZWJMYXllcihX
ZWJMYXllckFkZGl0aW9ucykKKworLSAodm9pZClzZXRMYXllck93bmVyOihHcmFwaGljc0xheWVy
KilhTGF5ZXIKK3sKKyAgICBtX2xheWVyT3duZXIgPSBhTGF5ZXI7Cit9CisKKy0gKEdyYXBoaWNz
TGF5ZXIqKWxheWVyT3duZXIKK3sKKyAgICByZXR1cm4gbV9sYXllck93bmVyOworfQorCitAZW5k
CisKKyNwcmFnbWEgbWFyayAtCisKKyNpZm5kZWYgTkRFQlVHCisKK0BpbXBsZW1lbnRhdGlvbiBD
QUxheWVyKEV4dGVuZGVkRGVzY3JpcHRpb24pCisKKy0gKE5TU3RyaW5nKilfZGVzY3JpcHRpb25X
aXRoUHJlZml4OihOU1N0cmluZyopaW5QcmVmaXgKK3sKKyAgICBDR1JlY3QgYUJvdW5kcyA9IFtz
ZWxmIGJvdW5kc107CisgICAgQ0dQb2ludCBhUG9zID0gW3NlbGYgcG9zaXRpb25dOworICAgIENB
VHJhbnNmb3JtM0QgdCA9IFtzZWxmIHRyYW5zZm9ybV07CisKKyAgICBOU1N0cmluZyogc2VsZlN0
cmluZyA9IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJUA8JUAgMHglMDh4PiBcIiVAXCIg
Ym91bmRzKCUuMWYsICUuMWYsICUuMWYsICUuMWYpIHBvcyglLjFmLCAlLjFmKSwgc3VibGF5ZXJz
PSVkIG1hc2tpbmc9JWQiLAorICAgICAgICAgICAgaW5QcmVmaXgsCisgICAgICAgICAgICBbc2Vs
ZiBjbGFzc10sCisgICAgICAgICAgICBzZWxmLAorICAgICAgICAgICAgW3NlbGYgbmFtZV0sCisg
ICAgICAgICAgICBhQm91bmRzLm9yaWdpbi54LCBhQm91bmRzLm9yaWdpbi55LCBhQm91bmRzLnNp
emUud2lkdGgsIGFCb3VuZHMuc2l6ZS5oZWlnaHQsIAorICAgICAgICAgICAgYVBvcy54LCBhUG9z
LnksCisgICAgICAgICAgICBbW3NlbGYgc3VibGF5ZXJzXSBjb3VudF0sCisgICAgICAgICAgICBb
c2VsZiBtYXNrc1RvQm91bmRzXV07CisgICAgCisgICAgTlNNdXRhYmxlU3RyaW5nKiBjdXJEZXNj
ID0gW05TTXV0YWJsZVN0cmluZyBzdHJpbmdXaXRoU3RyaW5nOnNlbGZTdHJpbmddOworICAgIAor
ICAgIGlmIChbW3NlbGYgc3VibGF5ZXJzXSBjb3VudF0gPiAwKQorICAgICAgICBbY3VyRGVzYyBh
cHBlbmRTdHJpbmc6QCJcbiJdOworCisgICAgTlNTdHJpbmcqIHN1YmxheWVyUHJlZml4ID0gW2lu
UHJlZml4IHN0cmluZ0J5QXBwZW5kaW5nU3RyaW5nOkAiXHQiXTsKKworICAgIE5TRW51bWVyYXRv
ciogc3VibGF5ZXJzRW51bSA9IFtbc2VsZiBzdWJsYXllcnNdIG9iamVjdEVudW1lcmF0b3JdOwor
ICAgIENBTGF5ZXIqIGN1ckxheWVyOworICAgIHdoaWxlICgoY3VyTGF5ZXIgPSBbc3VibGF5ZXJz
RW51bSBuZXh0T2JqZWN0XSkpCisgICAgICAgIFtjdXJEZXNjIGFwcGVuZFN0cmluZzpbY3VyTGF5
ZXIgX2Rlc2NyaXB0aW9uV2l0aFByZWZpeDpzdWJsYXllclByZWZpeF1dOworCisgICAgaWYgKFtb
c2VsZiBzdWJsYXllcnNdIGNvdW50XSA9PSAwKQorICAgICAgICBbY3VyRGVzYyBhcHBlbmRTdHJp
bmc6QCJcbiJdOworCisgICAgcmV0dXJuIGN1ckRlc2M7Cit9CisKKy0gKE5TU3RyaW5nKilleHRl
bmRlZERlc2NyaXB0aW9uCit7CisgICAgcmV0dXJuIFtzZWxmIF9kZXNjcmlwdGlvbldpdGhQcmVm
aXg6QCIiXTsKK30KKworQGVuZCAgLy8gaW1wbGVtZW50YXRpb24gV2ViTGF5ZXIoRXh0ZW5kZWRE
ZXNjcmlwdGlvbikKKworI2VuZGlmIC8vIE5ERUJVRworCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJB
VEVEX0NPTVBPU0lUSU5HKQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9t
YWMvV2ViVGlsZWRMYXllci5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvV2ViVGls
ZWRMYXllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOTE0NGQKLS0t
IC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9XZWJUaWxlZExh
eWVyLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBXZWJUaWxlZExheWVyX2gKKyNkZWZpbmUg
V2ViVGlsZWRMYXllcl9oCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNp
bXBvcnQgIldlYkxheWVyLmgiCisKK0BpbnRlcmZhY2UgV2ViVGlsZWRMYXllciA6IENBVGlsZWRM
YXllciAKK3sKKyAgICBXZWJDb3JlOjpHcmFwaGljc0xheWVyKiBtX2xheWVyT3duZXI7Cit9CisK
Ky8vIGltcGxlbWVudHMgV2ViTGF5ZXJBZGRpdGlvbnMKKworQGVuZAorCisjZW5kaWYgLy8gVVNF
KEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjZW5kaWYgLy8gV2ViVGlsZWRMYXllcl9oCisK
ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1dlYlRpbGVkTGF5ZXIu
bW0gYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9XZWJUaWxlZExheWVyLm1tCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZDAwYmEKLS0tIC9kZXYvbnVsbAorKysg
Yi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9XZWJUaWxlZExheWVyLm1tCkBAIC0wLDAg
KzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01Q
VVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09N
UE9TSVRJTkcpCisKKyNpbXBvcnQgIldlYlRpbGVkTGF5ZXIuaCIKKworI2ltcG9ydCAiR3JhcGhp
Y3NDb250ZXh0LmgiCisjaW1wb3J0ICJHcmFwaGljc0xheWVyLmgiCisjaW1wb3J0IDx3dGYvVW51
c2VkUGFyYW0uaD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK0BpbXBsZW1lbnRhdGlv
biBXZWJUaWxlZExheWVyCisKKy8vIFNldCBhIHplcm8gZHVyYXRpb24gZm9yIHRoZSBmYWRlIGlu
IG9mIHRpbGVzCisrIChDRlRpbWVJbnRlcnZhbClmYWRlRHVyYXRpb24KK3sKKyAgICByZXR1cm4g
MDsKK30KKworLy8gTWFrZSBzdXJlIHRoYXQgdGlsZXMgYXJlIGRyYXduIG9uIHRoZSBtYWluIHRo
cmVhZAorKyAoQk9PTClzaG91bGREcmF3T25NYWluVGhyZWFkCit7CisgICAgcmV0dXJuIFlFUzsK
K30KKworLy8gRGlzYWJsZSBkZWZhdWx0IGFuaW1hdGlvbnMKKy0gKGlkPENBQWN0aW9uPilhY3Rp
b25Gb3JLZXk6KE5TU3RyaW5nICopa2V5Cit7CisgICAgVU5VU0VEX1BBUkFNKGtleSk7CisgICAg
cmV0dXJuIG5pbDsKK30KKworLy8gSW1wbGVtZW50IHRoaXMgc28gcHJlc2VudGF0aW9uTGF5ZXIg
Y2FuIGdldCBvdXIgY3VzdG9tIGF0dHJpYnV0ZXMKKy0gKGlkKWluaXRXaXRoTGF5ZXI6KGlkKWxh
eWVyCit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRXaXRoTGF5ZXI6bGF5ZXJdKSkKKyAg
ICAgICAgbV9sYXllck93bmVyID0gWyhXZWJMYXllciopbGF5ZXIgbGF5ZXJPd25lcl07CisKKyAg
ICByZXR1cm4gc2VsZjsKK30KKworLSAodm9pZClzZXROZWVkc0Rpc3BsYXkKK3sKKyAgICBpZiAo
bV9sYXllck93bmVyICYmIG1fbGF5ZXJPd25lci0+Y2xpZW50KCkgJiYgbV9sYXllck93bmVyLT5k
cmF3c0NvbnRlbnQoKSkKKyAgICAgICAgW3N1cGVyIHNldE5lZWRzRGlzcGxheV07Cit9CisKKy0g
KHZvaWQpc2V0TmVlZHNEaXNwbGF5SW5SZWN0OihDR1JlY3QpZGlydHlSZWN0Cit7CisgICAgaWYg
KG1fbGF5ZXJPd25lciAmJiBtX2xheWVyT3duZXItPmNsaWVudCgpICYmIG1fbGF5ZXJPd25lci0+
ZHJhd3NDb250ZW50KCkpIHsKKyAgICAgICAgW3N1cGVyIHNldE5lZWRzRGlzcGxheUluUmVjdDpk
aXJ0eVJlY3RdOworCisjaWZuZGVmIE5ERUJVRworICAgICAgICBpZiAobV9sYXllck93bmVyLT5z
aG93UmVwYWludENvdW50ZXIoKSkgeworICAgICAgICAgICAgQ0dSZWN0IGJvdW5kcyA9IFtzZWxm
IGJvdW5kc107CisgICAgICAgICAgICBbc3VwZXIgc2V0TmVlZHNEaXNwbGF5SW5SZWN0OkNHUmVj
dE1ha2UoYm91bmRzLm9yaWdpbi54LCBib3VuZHMub3JpZ2luLnksIDQ2LCAyNSldOworICAgICAg
ICB9CisjZW5kaWYKKyAgICB9Cit9CisKKy0gKHZvaWQpZHJhd0luQ29udGV4dDooQ0dDb250ZXh0
UmVmKWN0eAoreworICAgIFtXZWJMYXllciBkcmF3Q29udGVudHM6bV9sYXllck93bmVyIG9mTGF5
ZXI6c2VsZiBpbnRvQ29udGV4dDpjdHhdOworfQorCitAZW5kIC8vIGltcGxlbWVudGF0aW9uIFdl
YlRpbGVkTGF5ZXIKKworI3ByYWdtYSBtYXJrIC0KKworQGltcGxlbWVudGF0aW9uIFdlYlRpbGVk
TGF5ZXIoTGF5ZXJNYWNBZGRpdGlvbnMpCisKKy0gKHZvaWQpc2V0TGF5ZXJPd25lcjooR3JhcGhp
Y3NMYXllciopYUxheWVyCit7CisgICAgbV9sYXllck93bmVyID0gYUxheWVyOworfQorCistIChH
cmFwaGljc0xheWVyKilsYXllck93bmVyCit7CisgICAgcmV0dXJuIG1fbGF5ZXJPd25lcjsKK30K
KworQGVuZAorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQo=
</data>
<flag name="review"
          id="13061"
          type_id="1"
          status="+"
          setter="hyatt"
    />
          </attachment>
      

    </bug>

</bugzilla>