<?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>45521</bug_id>
          
          <creation_ts>2010-09-09 21:59:43 -0700</creation_ts>
          <short_desc>Incorporate algorithm for processing paths into GPU-renderable triangle meshes</short_desc>
          <delta_ts>2011-02-10 14:24:41 -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>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>44729</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Kenneth Russell">kbr</reporter>
          <assigned_to name="Kenneth Russell">kbr</assigned_to>
          <cc>abarth</cc>
    
    <cc>bsalomon</cc>
    
    <cc>cmarrin</cc>
    
    <cc>dglazkov</cc>
    
    <cc>eric</cc>
    
    <cc>fishd</cc>
    
    <cc>gman</cc>
    
    <cc>jamesr</cc>
    
    <cc>jmuizelaar</cc>
    
    <cc>reed</cc>
    
    <cc>senorblanco</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>vangelis</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>277012</commentid>
    <comment_count>0</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-09 21:59:43 -0700</bug_when>
    <thetext>The main algorithm for transforming paths into triangle meshes which can be efficiently rendered on the GPU needs to be integrated. This is the last step in initial integration of Loop and Blinn&apos;s algorithm; the rest involves invoking this algorithm and drawing the results via GraphicsContext3D, which will be integrated separately.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>277033</commentid>
    <comment_count>1</comment_count>
      <attachid>67158</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-09 22:38:26 -0700</bug_when>
    <thetext>Created attachment 67158
Patch

From the ChangeLog:

Adding an implementation of Loop and Blinn&apos;s GPU accelerated path rendering algorithm from GPU Gems 3. This implementation pays particular attention to the efficiency of the curve subdivision phase needed for correct rendering. It utilizes the OpenGL utility library tessellator for triangulation of the interior of the shape. The regions handled by Loop and Blinn&apos;s algorithm are handled by the local triangulator previously incorporated.

No tests yet; pixel tests will eventually be used to verify this algorithm and prevent regressions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>279849</commentid>
    <comment_count>2</comment_count>
      <attachid>67158</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-09-15 17:39:39 -0700</bug_when>
    <thetext>Comment on attachment 67158
Patch

I&apos;ve looked through everything here except for:
determineSidesToFill()
determineOrientation()
subdivideCurves()
conditionallySubdivide()
subdivideCurvesSlow()

I think we should go through those together, the math looks tricky.  Otherwise this patch is looking great.

One higher level comment - could we move Contour and Triangle to their own file or files?  I see that they are internal and not exposed API, but LoopBlinnPathProcessor.cpp is pretty big.  One option would be to move them to *Internal.h/cpp.

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

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:184
&gt; +        // Try to set up a link between &quot;this-&gt;prev()&quot; and &quot;left&quot;.
&gt; +        if (prev()) {
&gt; +            left-&gt;setPrev(prev());
&gt; +            prev()-&gt;setNext(left);
&gt; +        }
&gt; +        // Try to set up a link between &quot;this-&gt;next()&quot; and &quot;right&quot;.
&gt; +        Segment* n = next();
&gt; +        if (n) {
I&apos;m pretty sure prev() and next() can never be null here, since Contour uses a sentinel value.

Can this just call m_contour-&gt;add(right) ?

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:347
&gt; +            // m_first-&gt;prev() is the sentinel.
&gt; +            Segment* sentinel = m_first-&gt;prev();
&gt; +            Segment* last = sentinel-&gt;prev();
Why not use m_sentinel?

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:388
&gt; +    Segment* end() const { return m_first-&gt;prev(); }
m_first-&gt;prev() should always == sentinel, right?  Adding an ASSERT() and returning &amp;m_sentinel seems a bit better.

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:393
&gt; +    const FloatRect&amp; boundingBox() const
This doesn&apos;t need to be const (and thus m_boundingBox(Dirty)? don&apos;t need to be mutable).

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:516
&gt; +    for (Vector&lt;Contour*&gt;::iterator iter = m_contours.begin();
&gt; +         iter != m_contours.end();
&gt; +         iter++) {
nit: could be a one-liner

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:548
&gt; +                                cache.addVertex(vert-&gt;xyCoordinates().x(),
&gt; +                                                vert-&gt;xyCoordinates().y(),
&gt; +                                                vert-&gt;klmCoordinates().x(),
&gt; +                                                vert-&gt;klmCoordinates().y(),
&gt; +                                                vert-&gt;klmCoordinates().z());
Maybe LoopBlinnPathCache::addVertex should just take a LoopBlinnLocalTriangulator::Vertex*

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:670
&gt; +Vector&lt;Segment*&gt; LoopBlinnPathProcessor::allSegmentsOverlappingY(Contour* queryContour, float x, float y)
should this be behind #ifndef NDEBUG?

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:675
&gt; +    for (Vector&lt;Contour*&gt;::iterator iter = m_contours.begin();
&gt; +         iter != m_contours.end();
&gt; +         iter++) {
nit: one line

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:693
&gt; +inline String valueToString(const float&amp; value)
nit: I think you want static here instead of inline

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:698
&gt; +inline String valueToString(void* const&amp; value)
s/inline/static/

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:720
&gt; +    for (Vector&lt;Contour*&gt;::iterator iter = m_contours.begin();
&gt; +         iter != m_contours.end();
&gt; +         iter++) {
nit: one line

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:739
&gt; +    for (Vector&lt;Contour*&gt;::iterator iter = m_contours.begin();
&gt; +         iter != m_contours.end();
&gt; +         iter++) {
nit: one line

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:755
&gt; +        for (Segment* seg = cur-&gt;begin();
&gt; +             ambiguous &amp;&amp; seg != cur-&gt;end();
&gt; +             seg = seg-&gt;next()) {
nit: one line

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:1144
&gt; +    GLdouble* outVertex = static_cast&lt;GLdouble*&gt;(malloc(3 * sizeof(GLdouble)));
I think you should use fastMalloc() here.  It&apos;s #defined to system malloc in chromium (which is tcmalloc on windows/linux) but can also be #defined to debug allocators in some configs, which is handy.

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:1154
&gt; +    // No-op just to prevent triangle strips and fans from being passed to us.
I had to do some googling to figure out what this meant.  Guessing this is because of this text from http://glprogramming.com/red/chapter11.html:
&quot;Since edge flags make no sense in a triangle fan or triangle strip, if there is a callback associated with GLU_TESS_EDGE_FLAG that enables edge flags, the GLU_TESS_BEGIN callback is called only with GL_TRIANGLES. The GLU_TESS_EDGE_FLAG callback works exactly analogously to the OpenGL glEdgeFlag*() call.&quot;?

Could you add a reference to some canonical source of info for this?

Don&apos;t name the GLboolean flag if it is unused, this will avoid unusued variable warnings.

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:1170
&gt; +    for (Vector&lt;Contour*&gt;::iterator iter = m_contours.begin();
&gt; +         iter != m_contours.end();
&gt; +         iter++) {
nit: one line

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:1220
&gt; +        free(state.allocatedPointers[i]);
fastFree() here

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.h:66
&gt; +    LoopBlinnPathProcessor();
&gt; +    explicit LoopBlinnPathProcessor(PassRefPtr&lt;PODArena&gt; arena);
Should this class just take a Path in the constructor?  It looks like it&apos;s tied to the path object itself and not used for multiple paths (at least currently).

nit: don&apos;t name this parameter (same with path, cache, contour, seg, queryContour below)

&gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.h:104
&gt; +    // For debugging the orientation computation. Returns all of the
&gt; +    // segments overlapping the given Y coordinate.
&gt; +    Vector&lt;LoopBlinnPathProcessorImplementation::Segment*&gt; allSegmentsOverlappingY(LoopBlinnPathProcessorImplementation::Contour* queryContour, float x, float y);
should this move behind the #ifndef NDEBUG guard?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>325953</commentid>
    <comment_count>3</comment_count>
      <attachid>67158</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-12-23 00:37:29 -0800</bug_when>
    <thetext>Comment on attachment 67158
Patch

Can you upload a new version of this patch that addresses James comments?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>326076</commentid>
    <comment_count>4</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-12-23 08:05:07 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 67158 [details])
&gt; Can you upload a new version of this patch that addresses James comments?

Eventually, yes. I have been swamped for the past three months.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>347904</commentid>
    <comment_count>5</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-02-08 19:38:34 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 67158 [details])
&gt; I&apos;ve looked through everything here except for:
&gt; determineSidesToFill()
&gt; determineOrientation()
&gt; subdivideCurves()
&gt; conditionallySubdivide()
&gt; subdivideCurvesSlow()
&gt; 
&gt; I think we should go through those together, the math looks tricky.  Otherwise this patch is looking great.

We can certainly go through those methods together. Agreed, the math is tricky, and you can see from the FIXME in process() that it isn&apos;t 100% bug-free yet.

&gt; One higher level comment - could we move Contour and Triangle to their own file or files?  I see that they are internal and not exposed API, but LoopBlinnPathProcessor.cpp is pretty big.  One option would be to move them to *Internal.h/cpp.

Let&apos;s discuss this. I&apos;d like to avoid creating too many new files, and WebKit style is one top-level class per file.

&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=67158&amp;action=prettypatch
&gt; 
&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:184
&gt; &gt; +        // Try to set up a link between &quot;this-&gt;prev()&quot; and &quot;left&quot;.
&gt; &gt; +        if (prev()) {
&gt; &gt; +            left-&gt;setPrev(prev());
&gt; &gt; +            prev()-&gt;setNext(left);
&gt; &gt; +        }
&gt; &gt; +        // Try to set up a link between &quot;this-&gt;next()&quot; and &quot;right&quot;.
&gt; &gt; +        Segment* n = next();
&gt; &gt; +        if (n) {
&gt; I&apos;m pretty sure prev() and next() can never be null here, since Contour uses a sentinel value.

The guards are there to allow the Segment to be subdivided before it&apos;s in the Contour&apos;s chain, in case we ever need that to work.

&gt; Can this just call m_contour-&gt;add(right) ?

No. The key here is that the segment subdivides itself, adding the new second half immediately after itself in the segment chain.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:347
&gt; &gt; +            // m_first-&gt;prev() is the sentinel.
&gt; &gt; +            Segment* sentinel = m_first-&gt;prev();
&gt; &gt; +            Segment* last = sentinel-&gt;prev();
&gt; Why not use m_sentinel?

Good point. ASSERT added, and code changed to use m_sentinel.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:388
&gt; &gt; +    Segment* end() const { return m_first-&gt;prev(); }
&gt; m_first-&gt;prev() should always == sentinel, right?  Adding an ASSERT() and returning &amp;m_sentinel seems a bit better.

Good point. Changed.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:393
&gt; &gt; +    const FloatRect&amp; boundingBox() const
&gt; This doesn&apos;t need to be const (and thus m_boundingBox(Dirty)? don&apos;t need to be mutable).

Fair point. Changed.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:516
&gt; &gt; +    for (Vector&lt;Contour*&gt;::iterator iter = m_contours.begin();
&gt; &gt; +         iter != m_contours.end();
&gt; &gt; +         iter++) {
&gt; nit: could be a one-liner

Changed.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:548
&gt; &gt; +                                cache.addVertex(vert-&gt;xyCoordinates().x(),
&gt; &gt; +                                                vert-&gt;xyCoordinates().y(),
&gt; &gt; +                                                vert-&gt;klmCoordinates().x(),
&gt; &gt; +                                                vert-&gt;klmCoordinates().y(),
&gt; &gt; +                                                vert-&gt;klmCoordinates().z());
&gt; Maybe LoopBlinnPathCache::addVertex should just take a LoopBlinnLocalTriangulator::Vertex*

For the case of handling stroked shapes, we will want the flexibility of not using the LoopBlinnLocalTriangulator::Vertex data structure.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:670
&gt; &gt; +Vector&lt;Segment*&gt; LoopBlinnPathProcessor::allSegmentsOverlappingY(Contour* queryContour, float x, float y)
&gt; should this be behind #ifndef NDEBUG?

Yes. Fixed.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:675
&gt; &gt; +    for (Vector&lt;Contour*&gt;::iterator iter = m_contours.begin();
&gt; &gt; +         iter != m_contours.end();
&gt; &gt; +         iter++) {
&gt; nit: one line

Done.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:693
&gt; &gt; +inline String valueToString(const float&amp; value)
&gt; nit: I think you want static here instead of inline

These printing helpers changed structure after Nico&apos;s clang cleanups.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:698
&gt; &gt; +inline String valueToString(void* const&amp; value)
&gt; s/inline/static/

Same here.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:720
&gt; &gt; +    for (Vector&lt;Contour*&gt;::iterator iter = m_contours.begin();
&gt; &gt; +         iter != m_contours.end();
&gt; &gt; +         iter++) {
&gt; nit: one line

Done.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:739
&gt; &gt; +    for (Vector&lt;Contour*&gt;::iterator iter = m_contours.begin();
&gt; &gt; +         iter != m_contours.end();
&gt; &gt; +         iter++) {
&gt; nit: one line

Done.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:755
&gt; &gt; +        for (Segment* seg = cur-&gt;begin();
&gt; &gt; +             ambiguous &amp;&amp; seg != cur-&gt;end();
&gt; &gt; +             seg = seg-&gt;next()) {
&gt; nit: one line

Done.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:1144
&gt; &gt; +    GLdouble* outVertex = static_cast&lt;GLdouble*&gt;(malloc(3 * sizeof(GLdouble)));
&gt; I think you should use fastMalloc() here.  It&apos;s #defined to system malloc in chromium (which is tcmalloc on windows/linux) but can also be #defined to debug allocators in some configs, which is handy.

Agreed. Fixed.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:1154
&gt; &gt; +    // No-op just to prevent triangle strips and fans from being passed to us.
&gt; I had to do some googling to figure out what this meant.  Guessing this is because of this text from http://glprogramming.com/red/chapter11.html:
&gt; &quot;Since edge flags make no sense in a triangle fan or triangle strip, if there is a callback associated with GLU_TESS_EDGE_FLAG that enables edge flags, the GLU_TESS_BEGIN callback is called only with GL_TRIANGLES. The GLU_TESS_EDGE_FLAG callback works exactly analogously to the OpenGL glEdgeFlag*() call.&quot;?
&gt; 
&gt; Could you add a reference to some canonical source of info for this?

Added a comment referencing that chapter in the OpenGL Programming Guide.

&gt; Don&apos;t name the GLboolean flag if it is unused, this will avoid unusued variable warnings.

Done.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:1170
&gt; &gt; +    for (Vector&lt;Contour*&gt;::iterator iter = m_contours.begin();
&gt; &gt; +         iter != m_contours.end();
&gt; &gt; +         iter++) {
&gt; nit: one line

Done.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:1220
&gt; &gt; +        free(state.allocatedPointers[i]);
&gt; fastFree() here

Changed.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.h:66
&gt; &gt; +    LoopBlinnPathProcessor();
&gt; &gt; +    explicit LoopBlinnPathProcessor(PassRefPtr&lt;PODArena&gt; arena);
&gt; Should this class just take a Path in the constructor?  It looks like it&apos;s tied to the path object itself and not used for multiple paths (at least currently).

We&apos;ll want the flexibility of reusing the path processor. It isn&apos;t tied to the path; it builds up and throws away data structures while it processes each path.

&gt; nit: don&apos;t name this parameter (same with path, cache, contour, seg, queryContour below)

All removed.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.h:104
&gt; &gt; +    // For debugging the orientation computation. Returns all of the
&gt; &gt; +    // segments overlapping the given Y coordinate.
&gt; &gt; +    Vector&lt;LoopBlinnPathProcessorImplementation::Segment*&gt; allSegmentsOverlappingY(LoopBlinnPathProcessorImplementation::Contour* queryContour, float x, float y);
&gt; should this move behind the #ifndef NDEBUG guard?

Yes. Moved.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>347906</commentid>
    <comment_count>6</comment_count>
      <attachid>81734</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-02-08 19:42:11 -0800</bug_when>
    <thetext>Created attachment 81734
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>349198</commentid>
    <comment_count>7</comment_count>
    <who name="Brian Salomon">bsalomon</who>
    <bug_when>2011-02-10 11:04:44 -0800</bug_when>
    <thetext>test comment by request from KBR</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>349257</commentid>
    <comment_count>8</comment_count>
    <who name="Brian Salomon">bsalomon</who>
    <bug_when>2011-02-10 12:09:16 -0800</bug_when>
    <thetext>I did an unofficial review of the functions James didn&apos;t get to. Some minor points but nothing that should block submission. LGTM.

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

&gt; Source/WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:980
&gt; +            if (seg-&gt;kind() == Segment::Cubic) {

test is redundant with first loop&apos;s filtering, make assert?

&gt; Source/WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:1017
&gt; +                tree.add(event.interval());

Add after we have the query result?

&gt; Source/WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:1029
&gt; +                            if (trianglesOverlap(event.interval().data()-&gt;triangle,

Depending on whether you&apos;re gpu or cpu bound, could consider skipping the exact test

&gt; Source/WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:1095
&gt; +            if (seg-&gt;kind() == Segment::Cubic) {

again, redundant with first loop</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>349267</commentid>
    <comment_count>9</comment_count>
    <who name="Brian Salomon">bsalomon</who>
    <bug_when>2011-02-10 12:23:55 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; I did an unofficial review of the functions James didn&apos;t get to. Some minor points but nothing that should block submission. LGTM.
&gt; 
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=81734&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:980
&gt; &gt; +            if (seg-&gt;kind() == Segment::Cubic) {
&gt; 
&gt; test is redundant with first loop&apos;s filtering, make assert?
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:1017
&gt; &gt; +                tree.add(event.interval());
&gt; 
&gt; Add after we have the query result?
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:1029
&gt; &gt; +                            if (trianglesOverlap(event.interval().data()-&gt;triangle,
&gt; 
&gt; Depending on whether you&apos;re gpu or cpu bound, could consider skipping the exact test
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:1095
&gt; &gt; +            if (seg-&gt;kind() == Segment::Cubic) {
&gt; 
&gt; again, redundant with first loop

Two more comments I forgot to add:
Can&apos;t the ray-cast be used to do the winding rule since you have counted the number of intersections?

&gt; Source/WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:1116
&gt; +        curSegments = nextSegments;

It would nice if we could do a swap to avoid memcpys here</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>349331</commentid>
    <comment_count>10</comment_count>
      <attachid>82037</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-02-10 13:37:31 -0800</bug_when>
    <thetext>Created attachment 82037
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>349334</commentid>
    <comment_count>11</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-02-10 13:39:11 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; I did an unofficial review of the functions James didn&apos;t get to. Some minor points but nothing that should block submission. LGTM.
&gt; 
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=81734&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:980
&gt; &gt; +            if (seg-&gt;kind() == Segment::Cubic) {
&gt; 
&gt; test is redundant with first loop&apos;s filtering, make assert?

Done.

&gt; &gt; Source/WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:1017
&gt; &gt; +                tree.add(event.interval());
&gt; 
&gt; Add after we have the query result?

Done.

&gt; &gt; Source/WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:1029
&gt; &gt; +                            if (trianglesOverlap(event.interval().data()-&gt;triangle,
&gt; 
&gt; Depending on whether you&apos;re gpu or cpu bound, could consider skipping the exact test

Agreed. I&apos;ll leave this precise for the moment, and once we&apos;re running more complex content through the algorithm we can benchmark it. My prior experience was that once the algorithmic complexity of the overlap test was reduced (using the plane-sweep algorithm), the cost of the individual triangles&apos; overlap tests was negligible.

&gt; &gt; Source/WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:1095
&gt; &gt; +            if (seg-&gt;kind() == Segment::Cubic) {
&gt; 
&gt; again, redundant with first loop

Changed to an ASSERT.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>349339</commentid>
    <comment_count>12</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-02-10 13:41:38 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; Two more comments I forgot to add:
&gt; Can&apos;t the ray-cast be used to do the winding rule since you have counted the number of intersections?

It is. The only &quot;knob&quot; on the Loop/Blinn shader is whether it fills the left or right side of the curve. This has to be set based on a combination of (1) the number of intersections of the surrounding contours, and (2) the clockwise / counterclockwise orientation of the contour.

&gt; &gt; Source/WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp:1116
&gt; &gt; +        curSegments = nextSegments;
&gt; 
&gt; It would nice if we could do a swap to avoid memcpys here

Good point. Changed both instances of this in the code to use Vector::swap().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>349341</commentid>
    <comment_count>13</comment_count>
      <attachid>82037</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-02-10 13:43:56 -0800</bug_when>
    <thetext>Comment on attachment 82037
Patch

Looks good to me!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>349346</commentid>
    <comment_count>14</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-02-10 13:49:36 -0800</bug_when>
    <thetext>Committed r78264: &lt;http://trac.webkit.org/changeset/78264&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>349379</commentid>
    <comment_count>15</comment_count>
    <who name="Mike Reed">reed</who>
    <bug_when>2011-02-10 14:24:41 -0800</bug_when>
    <thetext>LGTM</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>67158</attachid>
            <date>2010-09-09 22:38:26 -0700</date>
            <delta_ts>2011-02-08 19:42:08 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>path-processor.patch</filename>
            <type>text/plain</type>
            <size>58089</size>
            <attacher name="Kenneth Russell">kbr</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NzE2OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNzcgQEAKKzIwMTAtMDktMDkgIEtlbm5ldGggUnVzc2VsbCAgPGtickBnb29nbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIElu
Y29ycG9yYXRlIGFsZ29yaXRobSBmb3IgcHJvY2Vzc2luZyBwYXRocyBpbnRvIEdQVS1yZW5kZXJh
YmxlIHRyaWFuZ2xlIG1lc2hlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9NDU1MjEKKworICAgICAgICBBZGRpbmcgYW4gaW1wbGVtZW50YXRpb24gb2Yg
TG9vcCBhbmQgQmxpbm4ncyBHUFUgYWNjZWxlcmF0ZWQgcGF0aAorICAgICAgICByZW5kZXJpbmcg
YWxnb3JpdGhtIGZyb20gR1BVIEdlbXMgMy4gVGhpcyBpbXBsZW1lbnRhdGlvbiBwYXlzCisgICAg
ICAgIHBhcnRpY3VsYXIgYXR0ZW50aW9uIHRvIHRoZSBlZmZpY2llbmN5IG9mIHRoZSBjdXJ2ZSBz
dWJkaXZpc2lvbgorICAgICAgICBwaGFzZSBuZWVkZWQgZm9yIGNvcnJlY3QgcmVuZGVyaW5nLiBJ
dCB1dGlsaXplcyB0aGUgT3BlbkdMIHV0aWxpdHkKKyAgICAgICAgbGlicmFyeSB0ZXNzZWxsYXRv
ciBmb3IgdHJpYW5ndWxhdGlvbiBvZiB0aGUgaW50ZXJpb3Igb2YgdGhlCisgICAgICAgIHNoYXBl
LiBUaGUgcmVnaW9ucyBoYW5kbGVkIGJ5IExvb3AgYW5kIEJsaW5uJ3MgYWxnb3JpdGhtIGFyZQor
ICAgICAgICBoYW5kbGVkIGJ5IHRoZSBsb2NhbCB0cmlhbmd1bGF0b3IgcHJldmlvdXNseSBpbmNv
cnBvcmF0ZWQuCisKKyAgICAgICAgTm8gdGVzdHMgeWV0OyBwaXhlbCB0ZXN0cyB3aWxsIGV2ZW50
dWFsbHkgYmUgdXNlZCB0byB2ZXJpZnkgdGhpcworICAgICAgICBhbGdvcml0aG0gYW5kIHByZXZl
bnQgcmVncmVzc2lvbnMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJs
aW5uUGF0aFByb2Nlc3Nvci5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5u
UGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpTZWdtZW50OjpTZWdtZW50KToKKyAgICAgICAg
KFdlYkNvcmU6Okxvb3BCbGlublBhdGhQcm9jZXNzb3JJbXBsZW1lbnRhdGlvbjo6U2VnbWVudDo6
c2V0dXApOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVu
dGF0aW9uOjpTZWdtZW50OjpraW5kKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhQ
cm9jZXNzb3JJbXBsZW1lbnRhdGlvbjo6U2VnbWVudDo6Z2V0UG9pbnQpOgorICAgICAgICAoV2Vi
Q29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpTZWdtZW50OjpuZXh0
KToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhQcm9jZXNzb3JJbXBsZW1lbnRhdGlv
bjo6U2VnbWVudDo6cHJldik6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vz
c29ySW1wbGVtZW50YXRpb246OlNlZ21lbnQ6OnNldE5leHQpOgorICAgICAgICAoV2ViQ29yZTo6
TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpTZWdtZW50OjpzZXRQcmV2KToK
KyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhQcm9jZXNzb3JJbXBsZW1lbnRhdGlvbjo6
U2VnbWVudDo6Y29udG91cik6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vz
c29ySW1wbGVtZW50YXRpb246OlNlZ21lbnQ6OnN1YmRpdmlkZSk6CisgICAgICAgIChXZWJDb3Jl
OjpMb29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRpb246OlNlZ21lbnQ6OmJvdW5kaW5n
Qm94KToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhQcm9jZXNzb3JJbXBsZW1lbnRh
dGlvbjo6U2VnbWVudDo6bnVtQ3Jvc3NpbmdzRm9yWFJheSk6CisgICAgICAgIChXZWJDb3JlOjpM
b29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRpb246OlNlZ21lbnQ6Om51bWJlck9mVHJp
YW5nbGVzKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhQcm9jZXNzb3JJbXBsZW1l
bnRhdGlvbjo6U2VnbWVudDo6Z2V0VHJpYW5nbGUpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJs
aW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpTZWdtZW50OjpudW1iZXJPZkludGVyaW9y
VmVydGljZXMpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxl
bWVudGF0aW9uOjpTZWdtZW50OjpnZXRJbnRlcmlvclZlcnRleCk6CisgICAgICAgIChXZWJDb3Jl
OjpMb29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRpb246OlNlZ21lbnQ6Om1hcmtlZEZv
clN1YmRpdmlzaW9uKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhQcm9jZXNzb3JJ
bXBsZW1lbnRhdGlvbjo6U2VnbWVudDo6c2V0TWFya2VkRm9yU3ViZGl2aXNpb24pOgorICAgICAg
ICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpTZWdtZW50
Ojp0b1N0cmluZyk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29ySW1w
bGVtZW50YXRpb246OlNlZ21lbnQ6OmNvbXB1dGVCb3VuZGluZ0JveCk6CisgICAgICAgIChXZWJD
b3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRpb246OkNvbnRvdXI6OkNvbnRv
dXIpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0
aW9uOjpDb250b3VyOjphZGQpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nl
c3NvckltcGxlbWVudGF0aW9uOjpDb250b3VyOjpzdWJkaXZpZGUpOgorICAgICAgICAoV2ViQ29y
ZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpDb250b3VyOjpiZWdpbik6
CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRpb246
OkNvbnRvdXI6OmVuZCk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29y
SW1wbGVtZW50YXRpb246OkNvbnRvdXI6OmlzT3JpZW50ZWRDb3VudGVyQ2xvY2t3aXNlKToKKyAg
ICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhQcm9jZXNzb3JJbXBsZW1lbnRhdGlvbjo6Q29u
dG91cjo6c2V0SXNPcmllbnRlZENvdW50ZXJDbG9ja3dpc2UpOgorICAgICAgICAoV2ViQ29yZTo6
TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpDb250b3VyOjpib3VuZGluZ0Jv
eCk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRp
b246OkNvbnRvdXI6OmZpbGxTaWRlKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhQ
cm9jZXNzb3JJbXBsZW1lbnRhdGlvbjo6Q29udG91cjo6c2V0RmlsbFNpZGUpOgorICAgICAgICAo
V2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpTZWdtZW50Ojp0
cmlhbmd1bGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29yOjpM
b29wQmxpbm5QYXRoUHJvY2Vzc29yKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhQ
cm9jZXNzb3I6On5Mb29wQmxpbm5QYXRoUHJvY2Vzc29yKToKKyAgICAgICAgKFdlYkNvcmU6Okxv
b3BCbGlublBhdGhQcm9jZXNzb3I6OnByb2Nlc3MpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJs
aW5uUGF0aFByb2Nlc3Nvcjo6YnVpbGRDb250b3Vycyk6CisgICAgICAgIChXZWJDb3JlOjpMb29w
Qmxpbm5QYXRoUHJvY2Vzc29yOjphbGxTZWdtZW50c092ZXJsYXBwaW5nWSk6CisgICAgICAgIChX
ZWJDb3JlOjp2YWx1ZVRvU3RyaW5nKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhQ
cm9jZXNzb3I6OmRldGVybWluZVNpZGVzVG9GaWxsKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BC
bGlublBhdGhQcm9jZXNzb3I6OmRldGVybWluZU9yaWVudGF0aW9uKToKKyAgICAgICAgKFdlYkNv
cmU6OlN3ZWVwRGF0YTo6U3dlZXBFdmVudDo6U3dlZXBFdmVudCk6CisgICAgICAgIChXZWJDb3Jl
OjpTd2VlcERhdGE6OlN3ZWVwRXZlbnQ6OnNldHVwKToKKyAgICAgICAgKFdlYkNvcmU6OlN3ZWVw
RGF0YTo6U3dlZXBFdmVudDo6eCk6CisgICAgICAgIChXZWJDb3JlOjpTd2VlcERhdGE6OlN3ZWVw
RXZlbnQ6OmVudHJ5KToKKyAgICAgICAgKFdlYkNvcmU6OlN3ZWVwRGF0YTo6U3dlZXBFdmVudDo6
aW50ZXJ2YWwpOgorICAgICAgICAoV2ViQ29yZTo6U3dlZXBEYXRhOjpTd2VlcEV2ZW50OjpvcGVy
YXRvcjwpOgorICAgICAgICAoV2ViQ29yZTo6U3dlZXBEYXRhOjp0cmlhbmdsZXNPdmVybGFwKToK
KyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhQcm9jZXNzb3I6OnN1YmRpdmlkZUN1cnZl
cyk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29yOjpjb25kaXRpb25h
bGx5U3ViZGl2aWRlKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhQcm9jZXNzb3I6
OnN1YmRpdmlkZUN1cnZlc1Nsb3cpOgorICAgICAgICAoV2ViQ29yZTo6VGVzc2VsbGF0aW9uU3Rh
dGU6OnZlcnRleENhbGxiYWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlRlc3NlbGxhdGlvblN0YXRl
Ojpjb21iaW5lQ2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6VGVzc2VsbGF0aW9uU3RhdGU6
OmVkZ2VGbGFnQ2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nl
c3Nvcjo6dGVzc2VsbGF0ZUludGVyaW9yKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9n
cHUvTG9vcEJsaW5uUGF0aFByb2Nlc3Nvci5oOiBBZGRlZC4KKwogMjAxMC0wOS0wOSAgS2VudCBU
YW11cmEgIDx0a2VudEBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgVW5yZXZpZXdlZCwgYnVpbGQg
Zml4IGZvciBRdC4KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BCbGlu
blBhdGhQcm9jZXNzb3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvZ3B1L0xvb3BCbGlublBhdGhQcm9jZXNzb3IuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uUGF0aFByb2Nlc3Nvci5jcHAJKHJldmlz
aW9uIDApCkBAIC0wLDAgKzEsMTIyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29n
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFT
IElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKwor
I2luY2x1ZGUgIkxvb3BCbGlublBhdGhQcm9jZXNzb3IuaCIKKworI2luY2x1ZGUgIkZsb2F0UG9p
bnQuaCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJMb29wQmxpbm5DbGFzc2lm
aWVyLmgiCisjaW5jbHVkZSAiTG9vcEJsaW5uQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAiTG9vcEJs
aW5uTG9jYWxUcmlhbmd1bGF0b3IuaCIKKyNpbmNsdWRlICJMb29wQmxpbm5NYXRoVXRpbHMuaCIK
KyNpbmNsdWRlICJMb29wQmxpbm5QYXRoQ2FjaGUuaCIKKyNpbmNsdWRlICJMb29wQmxpbm5UZXh0
dXJlQ29vcmRzLmgiCisjaW5jbHVkZSAiUE9EQXJlbmEuaCIKKyNpbmNsdWRlICJQT0RJbnRlcnZh
bFRyZWUuaCIKKyNpbmNsdWRlICJQYXRoLmgiCisjaW5jbHVkZSAidGhpcmRwYXJ0eS9nbHUvaW50
ZXJuYWxfZ2x1LmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHd0Zi9Bc3NlcnRp
b25zLmg+CisKKyNpZiBQTEFURk9STShTS0lBKQorI2luY2x1ZGUgIlNrR2VvbWV0cnkuaCIKKyNp
bmNsdWRlICJTa1BhdGguaCIKKyNpbmNsdWRlICJTa1NjYWxhci5oIgorI2Vsc2UKKy8vIE11c3Qg
cG9ydCB0byB5b3VyIHBsYXRmb3JtLgorI2VuZGlmCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
dXNpbmcgTG9vcEJsaW5uTWF0aFV0aWxzOjpYUmF5OwordXNpbmcgTG9vcEJsaW5uTWF0aFV0aWxz
OjpjaG9wQ3ViaWNBdDsKK3VzaW5nIExvb3BCbGlubk1hdGhVdGlsczo6bnVtWFJheUNyb3NzaW5n
c0ZvckN1YmljOwordXNpbmcgTG9vcEJsaW5uTWF0aFV0aWxzOjp0cmlhbmdsZXNPdmVybGFwOwor
dXNpbmcgTG9vcEJsaW5uTWF0aFV0aWxzOjp4UmF5Q3Jvc3Nlc0xpbmU7Cit1c2luZyBMb29wQmxp
bm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRpb246OkNvbnRvdXI7Cit1c2luZyBMb29wQmxpbm5Q
YXRoUHJvY2Vzc29ySW1wbGVtZW50YXRpb246OlNlZ21lbnQ7CisKK25hbWVzcGFjZSB7CisKKyNp
Zm5kZWYgTkRFQlVHCitpbmxpbmUgU3RyaW5nIHZhbHVlVG9TdHJpbmcoY29uc3QgRmxvYXRSZWN0
JiBhcmcpCit7CisgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyOworICAgIGJ1aWxkZXIuYXBwZW5k
KCJbRmxvYXRSZWN0IGxlZnQ9Iik7CisgICAgYnVpbGRlci5hcHBlbmQoU3RyaW5nOjpudW1iZXIo
YXJnLmxlZnQoKSkpOworICAgIGJ1aWxkZXIuYXBwZW5kKCIgdG9wPSIpOworICAgIGJ1aWxkZXIu
YXBwZW5kKFN0cmluZzo6bnVtYmVyKGFyZy50b3AoKSkpOworICAgIGJ1aWxkZXIuYXBwZW5kKCIg
cmlnaHQ9Iik7CisgICAgYnVpbGRlci5hcHBlbmQoU3RyaW5nOjpudW1iZXIoYXJnLnJpZ2h0KCkp
KTsKKyAgICBidWlsZGVyLmFwcGVuZCgiIGJvdHRvbT0iKTsKKyAgICBidWlsZGVyLmFwcGVuZChT
dHJpbmc6Om51bWJlcihhcmcuYm90dG9tKCkpKTsKKyAgICBidWlsZGVyLmFwcGVuZCgiXSIpOwor
ICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Cit9CisjZW5kaWYKKworfSAvLyBhbm9ueW1v
dXMgbmFtZXNwYWNlCisKK25hbWVzcGFjZSBMb29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50
YXRpb24geworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNlZ21lbnQKKy8vCisKKy8vIERlc2NyaWJl
cyBhIHNlZ21lbnQgb2YgdGhlIHBhdGg6IGVpdGhlciBhIGN1YmljIG9yIGEgbGluZSBzZWdtZW50
LgorLy8gVGhlc2UgYXJlIHN0b3JlZCBpbiBhIGRvdWJseSBsaW5rZWQgbGlzdCB0byBzcGVlZCB1
cCBjdXJ2ZQorLy8gc3ViZGl2aXNpb24sIHdoaWNoIG9jY3VycyBkdWUgdG8gZWl0aGVyIHJlbmRl
cmluZyBhcnRpZmFjdHMgaW4gdGhlCisvLyBsb29wIGNhc2Ugb3IgZHVlIHRvIG92ZXJsYXBwaW5n
IHRyaWFuZ2xlcy4KK2NsYXNzIFNlZ21lbnQgOiBwdWJsaWMgTm9uY29weWFibGUgeworcHVibGlj
OgorICAgIGVudW0gS2luZCB7CisgICAgICAgIEN1YmljLAorICAgICAgICBMaW5lCisgICAgfTsK
KworICAgIC8vIE5vLWFyZ3VtZW50IGNvbnN0cnVjdG9yIGFsbG93cyBjb25zdHJ1Y3Rpb24gYnkg
dGhlIFBPREFyZW5hIGNsYXNzLgorICAgIFNlZ21lbnQoKQorICAgICAgICAgOiBtX2FyZW5hKDAp
CisgICAgICAgICAsIG1fa2luZChDdWJpYykKKyAgICAgICAgICwgbV9wcmV2KDApCisgICAgICAg
ICAsIG1fbmV4dCgwKQorICAgICAgICAgLCBtX2NvbnRvdXIoMCkKKyAgICAgICAgICwgbV90cmlh
bmd1bGF0b3IoMCkKKyAgICAgICAgICwgbV9tYXJrZWRGb3JTdWJkaXZpc2lvbihmYWxzZSkKKyAg
ICB7CisgICAgfQorCisgICAgLy8gSW5pdGlhbGl6ZXIgZm9yIGN1YmljIGN1cnZlIHNlZ21lbnRz
LgorICAgIHZvaWQgc2V0dXAoUE9EQXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgQ29udG91
ciogY29udG91ciwKKyAgICAgICAgICAgICAgIEZsb2F0UG9pbnQgY3AwLAorICAgICAgICAgICAg
ICAgRmxvYXRQb2ludCBjcDEsCisgICAgICAgICAgICAgICBGbG9hdFBvaW50IGNwMiwKKyAgICAg
ICAgICAgICAgIEZsb2F0UG9pbnQgY3AzKQorICAgIHsKKyAgICAgICAgbV9hcmVuYSA9IGFyZW5h
OworICAgICAgICBtX2NvbnRvdXIgPSBjb250b3VyOworICAgICAgICBtX2tpbmQgPSBDdWJpYzsK
KyAgICAgICAgbV9wb2ludHNbMF0gPSBjcDA7CisgICAgICAgIG1fcG9pbnRzWzFdID0gY3AxOwor
ICAgICAgICBtX3BvaW50c1syXSA9IGNwMjsKKyAgICAgICAgbV9wb2ludHNbM10gPSBjcDM7Cisg
ICAgICAgIGNvbXB1dGVCb3VuZGluZ0JveCgpOworICAgIH0KKworICAgIC8vIEluaXRpYWxpemVy
IGZvciBsaW5lIHNlZ21lbnRzLgorICAgIHZvaWQgc2V0dXAoUE9EQXJlbmEqIGFyZW5hLAorICAg
ICAgICAgICAgICAgQ29udG91ciogY29udG91ciwKKyAgICAgICAgICAgICAgIEZsb2F0UG9pbnQg
cDAsCisgICAgICAgICAgICAgICBGbG9hdFBvaW50IHAxKQorICAgIHsKKyAgICAgICAgbV9hcmVu
YSA9IGFyZW5hOworICAgICAgICBtX2NvbnRvdXIgPSBjb250b3VyOworICAgICAgICBtX2tpbmQg
PSBMaW5lOworICAgICAgICBtX3BvaW50c1swXSA9IHAwOworICAgICAgICBtX3BvaW50c1sxXSA9
IHAxOworICAgICAgICBjb21wdXRlQm91bmRpbmdCb3goKTsKKyAgICB9CisKKyAgICBLaW5kIGtp
bmQoKSBjb25zdCB7IHJldHVybiBtX2tpbmQ7IH0KKworICAgIC8vIFJldHVybnMgdGhlIGkndGgg
Y29udHJvbCBwb2ludCwgMCA8PSBpIDwgNC4KKyAgICBjb25zdCBGbG9hdFBvaW50JiBnZXRQb2lu
dChpbnQgaSkKKyAgICB7CisgICAgICAgIEFTU0VSVChpID49IDAgJiYgaSA8IDQpOworICAgICAg
ICByZXR1cm4gbV9wb2ludHNbaV07CisgICAgfQorCisgICAgU2VnbWVudCogbmV4dCgpIGNvbnN0
IHsgcmV0dXJuIG1fbmV4dDsgfQorICAgIFNlZ21lbnQqIHByZXYoKSBjb25zdCB7IHJldHVybiBt
X3ByZXY7IH0KKworICAgIHZvaWQgc2V0TmV4dChTZWdtZW50KiBuZXh0KSB7IG1fbmV4dCA9IG5l
eHQ7IH0KKyAgICB2b2lkIHNldFByZXYoU2VnbWVudCogcHJldikgeyBtX3ByZXYgPSBwcmV2OyB9
CisKKyAgICAvLyBUaGUgY29udG91ciB0aGlzIHNlZ21lbnQgYmVsb25ncyB0by4KKyAgICBDb250
b3VyKiBjb250b3VyKCkgY29uc3QgeyByZXR1cm4gbV9jb250b3VyOyB9CisKKyAgICAvLyBTdWJk
aXZpZGVzIHRoZSBjdXJyZW50IHNlZ21lbnQgYXQgdGhlIGdpdmVuIHBhcmFtZXRlciB2YWx1ZSAo
MCA8PQorICAgIC8vIHQgPD0gMSkgYW5kIHJlcGxhY2VzIGl0IHdpdGggdGhlIHR3byBuZXdseSBj
cmVhdGVkIFNlZ21lbnRzIGluCisgICAgLy8gdGhlIGxpbmtlZCBsaXN0LCBpZiBwb3NzaWJsZS4g
UmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGxlZnRtb3N0CisgICAgLy8gU2VnbWVudC4KKyAgICBT
ZWdtZW50KiBzdWJkaXZpZGUoZmxvYXQgcGFyYW0pCisgICAgeworICAgICAgICBGbG9hdFBvaW50
IGRzdFs3XTsKKyAgICAgICAgY2hvcEN1YmljQXQobV9wb2ludHMsIGRzdCwgcGFyYW0pOworICAg
ICAgICBTZWdtZW50KiBsZWZ0ID0gbV9hcmVuYS0+YWxsb2NhdGVPYmplY3Q8U2VnbWVudD4oKTsK
KyAgICAgICAgU2VnbWVudCogcmlnaHQgPSBtX2FyZW5hLT5hbGxvY2F0ZU9iamVjdDxTZWdtZW50
PigpOworICAgICAgICBsZWZ0LT5zZXR1cChtX2FyZW5hLCBtX2NvbnRvdXIsIGRzdFswXSwgZHN0
WzFdLCBkc3RbMl0sIGRzdFszXSk7CisgICAgICAgIHJpZ2h0LT5zZXR1cChtX2FyZW5hLCBtX2Nv
bnRvdXIsIGRzdFszXSwgZHN0WzRdLCBkc3RbNV0sIGRzdFs2XSk7CisgICAgICAgIGxlZnQtPnNl
dE5leHQocmlnaHQpOworICAgICAgICByaWdodC0+c2V0UHJldihsZWZ0KTsKKyAgICAgICAgLy8g
VHJ5IHRvIHNldCB1cCBhIGxpbmsgYmV0d2VlbiAidGhpcy0+cHJldigpIiBhbmQgImxlZnQiLgor
ICAgICAgICBpZiAocHJldigpKSB7CisgICAgICAgICAgICBsZWZ0LT5zZXRQcmV2KHByZXYoKSk7
CisgICAgICAgICAgICBwcmV2KCktPnNldE5leHQobGVmdCk7CisgICAgICAgIH0KKyAgICAgICAg
Ly8gVHJ5IHRvIHNldCB1cCBhIGxpbmsgYmV0d2VlbiAidGhpcy0+bmV4dCgpIiBhbmQgInJpZ2h0
Ii4KKyAgICAgICAgU2VnbWVudCogbiA9IG5leHQoKTsKKyAgICAgICAgaWYgKG4pIHsKKyAgICAg
ICAgICAgIHJpZ2h0LT5zZXROZXh0KG4pOworICAgICAgICAgICAgbi0+c2V0UHJldihyaWdodCk7
CisgICAgICAgIH0KKyAgICAgICAgLy8gU2V0IHVwIGEgbGluayBiZXR3ZWVuICJ0aGlzIiBhbmQg
ImxlZnQiOyB0aGlzIGlzIG9ubHkgdG8KKyAgICAgICAgLy8gcHJvdmlkZSBhIGNlcnRhaW4gYW1v
dW50IG9mIGNvbnRpbnVpdHkgZHVyaW5nIGZvcndhcmQgaXRlcmF0aW9uLgorICAgICAgICBzZXRO
ZXh0KGxlZnQpOworICAgICAgICByZXR1cm4gbGVmdDsKKyAgICB9CisKKyAgICAvLyBTdWJkaXZp
ZGVzIHRoZSBjdXJyZW50IHNlZ21lbnQgYXQgdGhlIGhhbGZ3YXkgcG9pbnQgYW5kIHJlcGxhY2Vz
CisgICAgLy8gaXQgd2l0aCB0aGUgdHdvIG5ld2x5IGNyZWF0ZWQgU2VnbWVudHMgaW4gdGhlIGxp
bmtlZCBsaXN0LCBpZgorICAgIC8vIHBvc3NpYmxlLiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUg
bGVmdG1vc3QgU2VnbWVudC4KKyAgICBTZWdtZW50KiBzdWJkaXZpZGUoKSB7IHJldHVybiBzdWJk
aXZpZGUoMC41Zik7IH0KKworICAgIGNvbnN0IEZsb2F0UmVjdCYgYm91bmRpbmdCb3goKSBjb25z
dCB7IHJldHVybiBtX2JvdW5kaW5nQm94OyB9CisKKyAgICAvLyBDb21wdXRlcyB0aGUgbnVtYmVy
IG9mIHRpbWVzIGEgcXVlcnkgbGluZSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4KKyAgICAvLyBwb2lu
dCBhbmQgZXh0ZW5kaW5nIHRvIHg9K2luZmluaXR5IGNyb3NzZXMgdGhpcyBzZWdtZW50LiBPdXRn
b2luZworICAgIC8vICJhbWJpZ3VvdXMiIGFyZ3VtZW50IGluZGljYXRlcyB3aGV0aGVyIHRoZSBx
dWVyeSBpbnRlcnNlY3RlZCBhbgorICAgIC8vIGVuZHBvaW50IG9yIHRhbmdlbnQgcG9pbnQgb2Yg
dGhlIHNlZ21lbnQsIGluZGljYXRpbmcgdGhhdCBhbm90aGVyCisgICAgLy8gcXVlcnkgcG9pbnQg
aXMgcHJlZmVycmVkLgorICAgIGludCBudW1Dcm9zc2luZ3NGb3JYUmF5KGNvbnN0IFhSYXkmIHhS
YXksIGJvb2wmIGFtYmlndW91cykgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtX2tpbmQgPT0g
Q3ViaWMpCisgICAgICAgICAgICAvLyBTaG91bGQgY29uc2lkZXIgY2FjaGluZyB0aGUgbW9ub3Rv
bmljIGN1Ymljcy4KKyAgICAgICAgICAgIHJldHVybiBudW1YUmF5Q3Jvc3NpbmdzRm9yQ3ViaWMo
eFJheSwgbV9wb2ludHMsIGFtYmlndW91cyk7CisKKyAgICAgICAgcmV0dXJuIHhSYXlDcm9zc2Vz
TGluZSh4UmF5LCBtX3BvaW50cywgYW1iaWd1b3VzKSA/IDEgOiAwOworICAgIH0KKworICAgIC8v
IFBlcmZvcm1zIGEgbG9jYWwgdHJpYW5ndWxhdGlvbiBvZiB0aGUgY29udHJvbCBwb2ludHMgaW4g
dGhpcworICAgIC8vIHNlZ21lbnQuIFRoaXMgb3BlcmF0aW9uIG9ubHkgbWFrZXMgc2Vuc2UgZm9y
IGN1YmljIHR5cGUgc2VnbWVudHMuCisgICAgLy8gdGV4Q29vcmRzIG1heSBiZSBudWxsIHdoZW4g
dGhlIGtsbSBjb29yZGluYXRlcyBoYXZlIG5vdCBiZWVuCisgICAgLy8gY29tcHV0ZWQgeWV0Lgor
ICAgIHZvaWQgdHJpYW5ndWxhdGUoTG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6Okluc2lkZUVk
Z2VDb21wdXRhdGlvbiBjb21wdXRlSW5zaWRlRWRnZXMsCisgICAgICAgICAgICAgICAgICAgICBj
b25zdCBMb29wQmxpbm5UZXh0dXJlQ29vcmRzOjpSZXN1bHQqIHRleENvb3Jkcyk7CisKKyAgICAv
LyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY29udHJvbCBwb2ludCB0cmlhbmdsZXMgYXNzb2NpYXRl
ZCB3aXRoCisgICAgLy8gdGhpcyBzZWdtZW50LgorICAgIGludCBudW1iZXJPZlRyaWFuZ2xlcygp
IGNvbnN0CisgICAgeworICAgICAgICBpZiAoIW1fdHJpYW5ndWxhdG9yKQorICAgICAgICAgICAg
cmV0dXJuIDA7CisgICAgICAgIHJldHVybiBtX3RyaWFuZ3VsYXRvci0+bnVtYmVyT2ZUcmlhbmds
ZXMoKTsKKyAgICB9CisKKyAgICAvLyBGZXRjaGVzIHRoZSBnaXZlbiBjb250cm9sIHBvaW50IHRy
aWFuZ2xlIGZvciB0aGlzIHNlZ21lbnQuCisgICAgTG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6
OlRyaWFuZ2xlKiBnZXRUcmlhbmdsZShpbnQgaW5kZXgpCisgICAgeworICAgICAgICBBU1NFUlQo
bV90cmlhbmd1bGF0b3IpOworICAgICAgICByZXR1cm4gbV90cmlhbmd1bGF0b3ItPmdldFRyaWFu
Z2xlKGluZGV4KTsKKyAgICB9CisKKyAgICAvLyBOdW1iZXIgb2YgdmVydGljZXMgYWxvbmcgdGhl
IGluc2lkZSBlZGdlIG9mIHRoaXMgc2VnbWVudC4gVGhpcworICAgIC8vIGNhbiBiZSBjYWxsZWQg
ZWl0aGVyIGZvciBsaW5lIG9yIGN1YmljIHR5cGUgc2VnbWVudHMuCisgICAgaW50IG51bWJlck9m
SW50ZXJpb3JWZXJ0aWNlcygpIGNvbnN0CisgICAgeworICAgICAgICBpZiAobV9raW5kID09IEN1
YmljKSB7CisgICAgICAgICAgICBpZiAobV90cmlhbmd1bGF0b3IpCisgICAgICAgICAgICAgICAg
cmV0dXJuIG1fdHJpYW5ndWxhdG9yLT5udW1iZXJPZkludGVyaW9yVmVydGljZXMoKTsKKworICAg
ICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMjsKKyAgICB9
CisKKyAgICAvLyBSZXR1cm5zIHRoZSBnaXZlbiBpbnRlcmlvciB2ZXJ0ZXgsIDAgPD0gaW5kZXgg
PCBudW1iZXJPZkludGVyaW9yVmVydGljZXMoKS4KKyAgICBGbG9hdFBvaW50IGdldEludGVyaW9y
VmVydGV4KGludCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChpbmRleCA+PSAw
ICYmIGluZGV4IDwgbnVtYmVyT2ZJbnRlcmlvclZlcnRpY2VzKCkpOworICAgICAgICBpZiAobV9r
aW5kID09IEN1YmljKSB7CisgICAgICAgICAgICBGbG9hdFBvaW50IHJlczsKKyAgICAgICAgICAg
IGlmIChtX3RyaWFuZ3VsYXRvcikgeworICAgICAgICAgICAgICAgIExvb3BCbGlubkxvY2FsVHJp
YW5ndWxhdG9yOjpWZXJ0ZXgqIHZlcnRleCA9IG1fdHJpYW5ndWxhdG9yLT5nZXRJbnRlcmlvclZl
cnRleChpbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKHZlcnRleCkKKyAgICAgICAgICAgICAg
ICAgICAgcmVzLnNldCh2ZXJ0ZXgtPnh5Q29vcmRpbmF0ZXMoKS54KCksIHZlcnRleC0+eHlDb29y
ZGluYXRlcygpLnkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzOwor
ICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1fcG9pbnRzW2luZGV4XTsKKyAgICB9CisKKyAg
ICAvLyBTdGF0ZSB0byBhc3Npc3Qgd2l0aCBjdXJ2ZSBzdWJkaXZpc2lvbi4KKyAgICBib29sIG1h
cmtlZEZvclN1YmRpdmlzaW9uKCkgY29uc3QgeyByZXR1cm4gbV9tYXJrZWRGb3JTdWJkaXZpc2lv
bjsgfQorICAgIHZvaWQgc2V0TWFya2VkRm9yU3ViZGl2aXNpb24oYm9vbCBtYXJrZWRGb3JTdWJk
aXZpc2lvbikgeyBtX21hcmtlZEZvclN1YmRpdmlzaW9uID0gbWFya2VkRm9yU3ViZGl2aXNpb247
IH0KKworI2lmbmRlZiBOREVCVUcKKyAgICAvLyBTdXBwcG9ydCBmb3IgcHJpbnRpbmcgU2VnbWVu
dHMuCisgICAgU3RyaW5nIHRvU3RyaW5nKCkgY29uc3QKKyAgICB7CisgICAgICAgIFN0cmluZ0J1
aWxkZXIgYnVpbGRlcjsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIltTZWdtZW50IGtpbmQ9Iik7
CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGtpbmQoKSA9PSBMaW5lID8gImxpbmUiIDogImN1Ymlj
Iik7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgYm91bmRpbmdCb3g9Iik7CisgICAgICAgIGJ1
aWxkZXIuYXBwZW5kKHZhbHVlVG9TdHJpbmcoYm91bmRpbmdCb3goKSkpOworICAgICAgICBidWls
ZGVyLmFwcGVuZCgiIGNvbnRvdXI9MHgiKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoU3RyaW5n
Ojpmb3JtYXQoIiVwIiwgY29udG91cigpKSk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgbWFy
a2VkRm9yU3ViZGl2aXNpb249Iik7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG1hcmtlZEZvclN1
YmRpdmlzaW9uKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQo
Il0iKTsKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICB9CisjZW5kaWYK
KworIHByaXZhdGU6CisgICAgLy8gQ29tcHV0ZXMgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGlzIFNl
Z21lbnQuCisgICAgdm9pZCBjb21wdXRlQm91bmRpbmdCb3goKQorICAgIHsKKyAgICAgICAgc3dp
dGNoIChtX2tpbmQpIHsKKyAgICAgICAgY2FzZSBDdWJpYzoKKyAgICAgICAgICAgIG1fYm91bmRp
bmdCb3guZml0VG9Qb2ludHMobV9wb2ludHNbMF0sIG1fcG9pbnRzWzFdLCBtX3BvaW50c1syXSwg
bV9wb2ludHNbM10pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBMaW5lOgor
ICAgICAgICAgICAgbV9ib3VuZGluZ0JveC5maXRUb1BvaW50cyhtX3BvaW50c1swXSwgbV9wb2lu
dHNbMV0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBQT0RB
cmVuYSogbV9hcmVuYTsKKyAgICBLaW5kIG1fa2luZDsKKyAgICBGbG9hdFBvaW50IG1fcG9pbnRz
WzRdOworICAgIFNlZ21lbnQqIG1fcHJldjsKKyAgICBTZWdtZW50KiBtX25leHQ7CisgICAgQ29u
dG91ciogbV9jb250b3VyOworICAgIEZsb2F0UmVjdCBtX2JvdW5kaW5nQm94OworICAgIExvb3BC
bGlubkxvY2FsVHJpYW5ndWxhdG9yKiBtX3RyaWFuZ3VsYXRvcjsKKyAgICBib29sIG1fbWFya2Vk
Rm9yU3ViZGl2aXNpb247Cit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbnRvdXIKKy8vCisK
Ky8vIERlc2NyaWJlcyBhIGNsb3NlZCBjb250b3VyIG9mIHRoZSBwYXRoLgorY2xhc3MgQ29udG91
ciA6IHB1YmxpYyBOb25jb3B5YWJsZSB7CitwdWJsaWM6CisgICAgQ29udG91cigpCisgICAgewor
ICAgICAgICBtX2ZpcnN0ID0gJm1fc2VudGluZWw7CisgICAgICAgIG1fZmlyc3QtPnNldE5leHQo
bV9maXJzdCk7CisgICAgICAgIG1fZmlyc3QtPnNldFByZXYobV9maXJzdCk7CisgICAgICAgIG1f
aXNPcmllbnRlZENvdW50ZXJDbG9ja3dpc2UgPSB0cnVlOworICAgICAgICBtX2JvdW5kaW5nQm94
RGlydHkgPSBmYWxzZTsKKyAgICAgICAgbV9maWxsU2lkZSA9IExvb3BCbGlubkNvbnN0YW50czo6
UmlnaHRTaWRlOworICAgIH0KKworICAgIHZvaWQgYWRkKFNlZ21lbnQqIHNlZ21lbnQpCisgICAg
eworICAgICAgICBpZiAobV9maXJzdCA9PSAmbV9zZW50aW5lbCkgeworICAgICAgICAgICAgLy8g
Rmlyc3QgZWxlbWVudCBpcyB0aGUgc2VudGluZWwuIFJlcGxhY2UgaXQgd2l0aCB0aGUgaW5jb21p
bmcKKyAgICAgICAgICAgIC8vIHNlZ21lbnQuCisgICAgICAgICAgICBzZWdtZW50LT5zZXROZXh0
KG1fZmlyc3QpOworICAgICAgICAgICAgc2VnbWVudC0+c2V0UHJldihtX2ZpcnN0KTsKKyAgICAg
ICAgICAgIG1fZmlyc3QtPnNldE5leHQoc2VnbWVudCk7CisgICAgICAgICAgICBtX2ZpcnN0LT5z
ZXRQcmV2KHNlZ21lbnQpOworICAgICAgICAgICAgbV9maXJzdCA9IHNlZ21lbnQ7CisgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICAvLyBtX2ZpcnN0LT5wcmV2KCkgaXMgdGhlIHNlbnRpbmVs
LgorICAgICAgICAgICAgU2VnbWVudCogc2VudGluZWwgPSBtX2ZpcnN0LT5wcmV2KCk7CisgICAg
ICAgICAgICBTZWdtZW50KiBsYXN0ID0gc2VudGluZWwtPnByZXYoKTsKKyAgICAgICAgICAgIGxh
c3QtPnNldE5leHQoc2VnbWVudCk7CisgICAgICAgICAgICBzZWdtZW50LT5zZXRQcmV2KGxhc3Qp
OworICAgICAgICAgICAgc2VnbWVudC0+c2V0TmV4dChzZW50aW5lbCk7CisgICAgICAgICAgICBz
ZW50aW5lbC0+c2V0UHJldihzZWdtZW50KTsKKyAgICAgICAgfQorICAgICAgICBtX2JvdW5kaW5n
Qm94RGlydHkgPSB0cnVlOworICAgIH0KKworICAgIC8vIFN1YmRpdmlkZXMgdGhlIGdpdmVuIHNl
Z21lbnQgYXQgdGhlIGdpdmVuIHBhcmFtZXRyaWMgdmFsdWUuCisgICAgLy8gUmV0dXJucyBhIHBv
aW50ZXIgdG8gdGhlIGZpcnN0IG9mIHRoZSB0d28gcG9ydGlvbnMgb2YgdGhlCisgICAgLy8gc3Vi
ZGl2aWRlZCBzZWdtZW50LgorICAgIFNlZ21lbnQqIHN1YmRpdmlkZShTZWdtZW50KiBzZWdtZW50
LCBmbG9hdCBwYXJhbSkKKyAgICB7CisgICAgICAgIFNlZ21lbnQqIGxlZnQgPSBzZWdtZW50LT5z
dWJkaXZpZGUocGFyYW0pOworICAgICAgICBpZiAobV9maXJzdCA9PSBzZWdtZW50KQorICAgICAg
ICAgICAgbV9maXJzdCA9IGxlZnQ7CisgICAgICAgIHJldHVybiBsZWZ0OworICAgIH0KKworICAg
IC8vIFN1YmRpdmlkZXMgdGhlIGdpdmVuIHNlZ21lbnQgYXQgdGhlIGhhbGZ3YXkgcG9pbnQuIFJl
dHVybnMgYQorICAgIC8vIHBvaW50ZXIgdG8gdGhlIGZpcnN0IG9mIHRoZSB0d28gcG9ydGlvbnMg
b2YgdGhlIHN1YmRpdmlkZWQKKyAgICAvLyBzZWdtZW50LgorICAgIFNlZ21lbnQqIHN1YmRpdmlk
ZShTZWdtZW50KiBzZWdtZW50KQorICAgIHsKKyAgICAgICAgU2VnbWVudCogbGVmdCA9IHNlZ21l
bnQtPnN1YmRpdmlkZSgpOworICAgICAgICBpZiAobV9maXJzdCA9PSBzZWdtZW50KQorICAgICAg
ICAgICAgbV9maXJzdCA9IGxlZnQ7CisgICAgICAgIHJldHVybiBsZWZ0OworICAgIH0KKworICAg
IC8vIFJldHVybnMgdGhlIGZpcnN0IHNlZ21lbnQgaW4gdGhlIGNvbnRvdXIgZm9yIGl0ZXJhdGlv
bi4KKyAgICBTZWdtZW50KiBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fZmlyc3Q7IH0KKworICAg
IC8vIFJldHVybnMgdGhlIGxhc3Qgc2VnbWVudCBpbiB0aGUgY29udG91ciBmb3IgaXRlcmF0aW9u
LiBDYWxsZXJzCisgICAgLy8gc2hvdWxkIG5vdCBpdGVyYXRlIG92ZXIgdGhpcyBzZWdtZW50LiBJ
biBvdGhlciB3b3JkczoKKyAgICAvLyAgZm9yIChTZWdtZW50KiBjdXIgPSBjb250b3VyLT5iZWdp
bigpOworICAgIC8vICAgICAgIGN1ciAhPSBjb250b3VyLT5lbmQoKTsKKyAgICAvLyAgICAgICBj
dXIgPSBjdXItPm5leHQoKSkgeworICAgIC8vICAgIC8vIC4uIHByb2Nlc3MgY3VyIC4uLgorICAg
IC8vICB9CisgICAgU2VnbWVudCogZW5kKCkgY29uc3QgeyByZXR1cm4gbV9maXJzdC0+cHJldigp
OyB9CisKKyAgICBib29sIGlzT3JpZW50ZWRDb3VudGVyQ2xvY2t3aXNlKCkgY29uc3QgeyByZXR1
cm4gbV9pc09yaWVudGVkQ291bnRlckNsb2Nrd2lzZTsgfQorICAgIHZvaWQgc2V0SXNPcmllbnRl
ZENvdW50ZXJDbG9ja3dpc2UoYm9vbCBpc09yaWVudGVkQ291bnRlckNsb2Nrd2lzZSkgeyBtX2lz
T3JpZW50ZWRDb3VudGVyQ2xvY2t3aXNlID0gaXNPcmllbnRlZENvdW50ZXJDbG9ja3dpc2U7IH0K
KworICAgIGNvbnN0IEZsb2F0UmVjdCYgYm91bmRpbmdCb3goKSBjb25zdAorICAgIHsKKyAgICAg
ICAgaWYgKG1fYm91bmRpbmdCb3hEaXJ0eSkgeworICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRy
dWU7CisgICAgICAgICAgICBmb3IgKFNlZ21lbnQqIGN1ciA9IGJlZ2luKCk7IGN1ciAhPSBlbmQo
KTsgY3VyID0gY3VyLT5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAg
ICAgICAgICAgICAgICAgIG1fYm91bmRpbmdCb3ggPSBjdXItPmJvdW5kaW5nQm94KCk7CisgICAg
ICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBtX2JvdW5kaW5nQm94LnVuaXRl
KGN1ci0+Ym91bmRpbmdCb3goKSk7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgbV9ib3VuZGluZ0JveERpcnR5ID0gZmFsc2U7Cisg
ICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1fYm91bmRpbmdCb3g7CisgICAgfQorCisgICAgLy8g
UmV0dXJucyB3aGljaCBzaWRlIG9mIHRoaXMgY29udG91ciBpcyBmaWxsZWQuCisgICAgTG9vcEJs
aW5uQ29uc3RhbnRzOjpGaWxsU2lkZSBmaWxsU2lkZSgpIGNvbnN0CisgICAgeworICAgICAgICBy
ZXR1cm4gbV9maWxsU2lkZTsKKyAgICB9CisKKyAgICB2b2lkIHNldEZpbGxTaWRlKExvb3BCbGlu
bkNvbnN0YW50czo6RmlsbFNpZGUgZmlsbFNpZGUpCisgICAgeworICAgICAgICBtX2ZpbGxTaWRl
ID0gZmlsbFNpZGU7CisgICAgfQorCitwcml2YXRlOgorICAgIC8vIFRoZSBzdGFydCBvZiB0aGUg
c2VnbWVudCBjaGFpbi4gVGhlIHNlZ21lbnRzIGFyZSBrZXB0IGluIGEKKyAgICAvLyBjaXJjdWxh
ciBkb3VibHkgbGlua2VkIGxpc3QgZm9yIHJhcGlkIGFjY2VzcyB0byB0aGUgYmVnaW5uaW5nIGFu
ZAorICAgIC8vIGVuZC4KKyAgICBTZWdtZW50KiBtX2ZpcnN0OworCisgICAgLy8gVGhlIHNlbnRp
bmVsIGVsZW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUgY2hhaW4sIG5lZWRlZCBmb3IKKyAgICAvLyBy
ZWFzb25hYmxlIGl0ZXJhdGlvbiBzZW1hbnRpY3MuCisgICAgU2VnbWVudCBtX3NlbnRpbmVsOwor
CisgICAgYm9vbCBtX2lzT3JpZW50ZWRDb3VudGVyQ2xvY2t3aXNlOworCisgICAgbXV0YWJsZSBG
bG9hdFJlY3QgbV9ib3VuZGluZ0JveDsKKyAgICBtdXRhYmxlIGJvb2wgbV9ib3VuZGluZ0JveERp
cnR5OworCisgICAgLy8gV2hpY2ggc2lkZSBvZiB0aGlzIGNvbnRvdXIgc2hvdWxkIGJlIGZpbGxl
ZC4KKyAgICBMb29wQmxpbm5Db25zdGFudHM6OkZpbGxTaWRlIG1fZmlsbFNpZGU7Cit9OworCisv
Ly0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KKy8vIFNlZ21lbnQKKy8vCisKKy8vIERlZmluaXRpb24gb2YgU2VnbWVu
dDo6dHJpYW5ndWxhdGUoKSwgd2hpY2ggbXVzdCBjb21lIGFmdGVyCisvLyBkZWNsYXJhdGlvbiBv
ZiBDb250b3VyLgordm9pZCBTZWdtZW50Ojp0cmlhbmd1bGF0ZShMb29wQmxpbm5Mb2NhbFRyaWFu
Z3VsYXRvcjo6SW5zaWRlRWRnZUNvbXB1dGF0aW9uIGNvbXB1dGVJbnNpZGVFZGdlcywKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcEJsaW5uVGV4dHVyZUNvb3Jkczo6UmVzdWx0
KiB0ZXhDb29yZHMpCit7CisgICAgQVNTRVJUKG1fa2luZCA9PSBDdWJpYyk7CisgICAgaWYgKCFt
X3RyaWFuZ3VsYXRvcikKKyAgICAgICAgbV90cmlhbmd1bGF0b3IgPSBtX2FyZW5hLT5hbGxvY2F0
ZU9iamVjdDxMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcj4oKTsKKyAgICBtX3RyaWFuZ3VsYXRv
ci0+cmVzZXQoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBM
b29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6VmVydGV4KiB2ZXJ0ZXggPSBtX3RyaWFuZ3VsYXRv
ci0+Z2V0VmVydGV4KGkpOworICAgICAgICBpZiAodGV4Q29vcmRzKSB7CisgICAgICAgICAgICB2
ZXJ0ZXgtPnNldChnZXRQb2ludChpKS54KCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRQ
b2ludChpKS55KCksCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXhDb29yZHMtPmtsbUNvb3Jk
aW5hdGVzW2ldLngoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleENvb3Jkcy0+a2xtQ29v
cmRpbmF0ZXNbaV0ueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgdGV4Q29vcmRzLT5rbG1D
b29yZGluYXRlc1tpXS56KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmVydGV4
LT5zZXQoZ2V0UG9pbnQoaSkueCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UG9pbnQo
aSkueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gdGV4dHVyZSBjb29yZGluYXRl
cyB5ZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDApOworICAgICAgICB9CisgICAg
fQorICAgIG1fdHJpYW5ndWxhdG9yLT50cmlhbmd1bGF0ZShjb21wdXRlSW5zaWRlRWRnZXMsIGNv
bnRvdXIoKS0+ZmlsbFNpZGUoKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIExvb3BCbGlublBhdGhQ
cm9jZXNzb3JJbXBsZW1lbnRhdGlvbgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExvb3BCbGlublBh
dGhQcm9jZXNzb3IKKy8vCisKK0xvb3BCbGlublBhdGhQcm9jZXNzb3I6Okxvb3BCbGlublBhdGhQ
cm9jZXNzb3IoKQorICAgIDogbV9hcmVuYShQT0RBcmVuYTo6Y3JlYXRlKCkpCisjaWZuZGVmIE5E
RUJVRworICAgICwgbV92ZXJib3NlTG9nZ2luZyhmYWxzZSkKKyNlbmRpZgoreworfQorCitMb29w
Qmxpbm5QYXRoUHJvY2Vzc29yOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29yKFBhc3NSZWZQdHI8UE9E
QXJlbmE+IGFyZW5hKQorICAgIDogbV9hcmVuYShhcmVuYSkKKyNpZm5kZWYgTkRFQlVHCisgICAg
LCBtX3ZlcmJvc2VMb2dnaW5nKGZhbHNlKQorI2VuZGlmCit7Cit9CisKK0xvb3BCbGlublBhdGhQ
cm9jZXNzb3I6On5Mb29wQmxpbm5QYXRoUHJvY2Vzc29yKCkKK3sKK30KKwordm9pZCBMb29wQmxp
bm5QYXRoUHJvY2Vzc29yOjpwcm9jZXNzKGNvbnN0IFBhdGgmIHBhdGgsIExvb3BCbGlublBhdGhD
YWNoZSYgY2FjaGUpCit7CisgICAgYnVpbGRDb250b3VycyhwYXRoKTsKKworICAgIC8vIFJ1biBw
bGFuZS1zd2VlcCBhbGdvcml0aG0gdG8gZGV0ZXJtaW5lIG92ZXJsYXBzIG9mIGNvbnRyb2wgcG9p
bnQKKyAgICAvLyBjdXJ2ZXMgYW5kIHN1YmRpdmlkZSBjdXJ2ZXMgYXBwcm9wcmlhdGVseS4KKyAg
ICBzdWJkaXZpZGVDdXJ2ZXMoKTsKKworICAgIC8vIERldGVybWluZSBvcmllbnRhdGlvbnMgb2Yg
Y291bnRvdXJzLiBCYXNlZCBvbiBvcmllbnRhdGlvbiBhbmQgdGhlCisgICAgLy8gbnVtYmVyIG9m
IGN1cnZlIGNyb3NzaW5ncyBhdCBhIHJhbmRvbSBwb2ludCBvbiB0aGUgY29udG91ciwKKyAgICAv
LyBkZXRlcm1pbmUgd2hldGhlciB0byBmaWxsIHRoZSBsZWZ0IG9yIHJpZ2h0IHNpZGUgb2YgdGhl
IGNvbnRvdXIuCisgICAgZGV0ZXJtaW5lU2lkZXNUb0ZpbGwoKTsKKworICAgIC8vIENsYXNzaWZ5
IGN1cnZlcywgY29tcHV0ZSB0ZXh0dXJlIGNvb3JkaW5hdGVzIGFuZCBzdWJkaXZpZGUgYXMKKyAg
ICAvLyBuZWNlc3NhcnkgdG8gZWxpbWluYXRlIHJlbmRlcmluZyBhcnRpZmFjdHMuIERvIHRoZSBm
aW5hbAorICAgIC8vIHRyaWFuZ3VsYXRpb24gb2YgdGhlIGN1cnZlIHNlZ21lbnRzLCBkZXRlcm1p
bmluZyB0aGUgcGF0aCBhbG9uZworICAgIC8vIHRoZSBpbnRlcmlvciBvZiB0aGUgc2hhcGUuCisg
ICAgZm9yIChWZWN0b3I8Q29udG91cio+OjppdGVyYXRvciBpdGVyID0gbV9jb250b3Vycy5iZWdp
bigpOworICAgICAgICAgaXRlciAhPSBtX2NvbnRvdXJzLmVuZCgpOworICAgICAgICAgaXRlcisr
KSB7CisgICAgICAgIENvbnRvdXIqIGN1ciA9ICppdGVyOworICAgICAgICBmb3IgKFNlZ21lbnQq
IHNlZyA9IGN1ci0+YmVnaW4oKTsgc2VnICE9IGN1ci0+ZW5kKCk7IHNlZyA9IHNlZy0+bmV4dCgp
KSB7CisgICAgICAgICAgICBpZiAoc2VnLT5raW5kKCkgPT0gU2VnbWVudDo6Q3ViaWMpIHsKKyAg
ICAgICAgICAgICAgICBMb29wQmxpbm5DbGFzc2lmaWVyOjpSZXN1bHQgY2xhc3NpZmljYXRpb24g
PSBMb29wQmxpbm5DbGFzc2lmaWVyOjpjbGFzc2lmeShzZWctPmdldFBvaW50KDApLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZy0+Z2V0UG9pbnQoMSksCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgc2VnLT5nZXRQb2ludCgyKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzZWctPmdldFBvaW50KDMpKTsKKyNpZm5kZWYgTkRFQlVHCisg
ICAgICAgICAgICAgICAgaWYgKG1fdmVyYm9zZUxvZ2dpbmcpCisgICAgICAgICAgICAgICAgICAg
IExPR19FUlJPUigiQ2xhc3NpZmljYXRpb246ICVkIiwgKGludCkgY2xhc3NpZmljYXRpb24uY3Vy
dmVUeXBlKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIExvb3BCbGlublRleHR1cmVDb29yZHM6
OlJlc3VsdCB0ZXhDb29yZHMgPQorICAgICAgICAgICAgICAgICAgICBMb29wQmxpbm5UZXh0dXJl
Q29vcmRzOjpjb21wdXRlKGNsYXNzaWZpY2F0aW9uLCBjdXItPmZpbGxTaWRlKCkpOworICAgICAg
ICAgICAgICAgIGlmICh0ZXhDb29yZHMuaGFzUmVuZGVyaW5nQXJ0aWZhY3QpIHsKKyAgICAgICAg
ICAgICAgICAgICAgLy8gRklYTUU6IHRoZXJlIGlzIGEgcHJvYmxlbSB3aGVyZSB0aGUgYWxnb3Jp
dGhtCisgICAgICAgICAgICAgICAgICAgIC8vIHNvbWV0aW1lcyBmYWlscyB0byBjb252ZXJnZSB3
aGVuIHNwbGl0dGluZyBhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gc3ViZGl2aXNpb24g
cGFyYW1ldGVyIHZhbHVlLiBGb3IgdGhlIHRpbWUgYmVpbmcsCisgICAgICAgICAgICAgICAgICAg
IC8vIHNwbGl0IGhhbGZ3YXkuCisgICAgICAgICAgICAgICAgICAgIGN1ci0+c3ViZGl2aWRlKHNl
Zyk7CisgICAgICAgICAgICAgICAgICAgIC8vIE5leHQgaXRlcmF0aW9uIHdpbGwgaGFuZGxlIHRo
ZSBuZXdseSBzdWJkaXZpZGVkIGN1cnZlcworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgICAgICAgICAgIGlmICghdGV4Q29vcmRzLmlzTGluZU9yUG9pbnQpIHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHNlZy0+dHJpYW5ndWxhdGUoTG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0
b3I6OkNvbXB1dGVJbnNpZGVFZGdlcywgJnRleENvb3Jkcyk7CisgICAgICAgICAgICAgICAgICAg
ICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlZy0+bnVtYmVyT2ZUcmlhbmdsZXMoKTsgaSsrKSB7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6
OlRyaWFuZ2xlKiB0cmlhbmdsZSA9IHNlZy0+Z2V0VHJpYW5nbGUoaSk7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyBqKyspIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgTG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OlZlcnRleCog
dmVydCA9IHRyaWFuZ2xlLT5nZXRWZXJ0ZXgoaik7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNhY2hlLmFkZFZlcnRleCh2ZXJ0LT54eUNvb3JkaW5hdGVzKCkueCgpLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydC0+eHlDb29yZGlu
YXRlcygpLnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHZlcnQtPmtsbUNvb3JkaW5hdGVzKCkueCgpLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgdmVydC0+a2xtQ29vcmRpbmF0ZXMoKS55KCksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0LT5rbG1Db29y
ZGluYXRlcygpLnooKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgICAgICAgICAgfQorI2lmZGVmIExPT1BfQkxJTk5fUEFUSF9DQUNIRV9ERUJVR19JTlRF
UklPUl9FREdFUworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyB0aGUgZW5kIHVzZXIg
dGhlIGludGVyaW9yIGVkZ2VzIGFzIHdlbGwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAo
aW50IGkgPSAxOyBpIDwgc2VnLT5udW1iZXJPZkludGVyaW9yVmVydGljZXMoKTsgaSsrKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvYXRQb2ludCB2ZXJ0ID0gc2VnLT5nZXRJbnRl
cmlvclZlcnRleChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEdXBsaWNhdGUg
cHJldmlvdXMgdmVydGV4IHRvIGJlIGFibGUgdG8gZHJhdyBHTF9MSU5FUworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIEZsb2F0UG9pbnQgcHJldiA9IHNlZy0+Z2V0SW50ZXJpb3JWZXJ0ZXgo
aSAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLmFkZEludGVyaW9yRWRn
ZVZlcnRleChwcmV2LngoKSwgcHJldi55KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNhY2hlLmFkZEludGVyaW9yRWRnZVZlcnRleCh2ZXJ0LngoKSwgdmVydC55KCkpOworICAgICAg
ICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8vIExPT1BfQkxJTk5fUEFUSF9DQUNIRV9ERUJV
R19JTlRFUklPUl9FREdFUworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gUnVuIHRoZSBpbnRl
cmlvciBwYXRocyB0aHJvdWdoIGEgdGVzc2VsbGF0aW9uIGFsZ29yaXRobQorICAgIC8vIHN1cHBv
cnRpbmcgbXVsdGlwbGUgY29udG91cnMuCisgICAgdGVzc2VsbGF0ZUludGVyaW9yKGNhY2hlKTsK
K30KKwordm9pZCBMb29wQmxpbm5QYXRoUHJvY2Vzc29yOjpidWlsZENvbnRvdXJzKGNvbnN0IFBh
dGgmIHBhdGgpCit7CisgICAgLy8gQ2xlYXIgb3V0IHRoZSBjb250b3VycworICAgIG1fY29udG91
cnMuY2xlYXIoKTsKKyNpZiBQTEFURk9STShTS0lBKQorICAgIFNrUGF0aDo6SXRlciBpdGVyKCpw
YXRoLnBsYXRmb3JtUGF0aCgpLCBmYWxzZSk7CisgICAgU2tQb2ludCBwb2ludHNbNF07CisgICAg
U2tQYXRoOjpWZXJiIHZlcmI7CisgICAgQ29udG91ciogY29udG91ciA9IDA7CisgICAgU2tQb2lu
dCBjdXJQb2ludCA9IHsgMCB9OworICAgIFNrUG9pbnQgbW92ZVRvUG9pbnQgPSB7IDAgfTsKKyAg
ICBkbyB7CisgICAgICAgIHZlcmIgPSBpdGVyLm5leHQocG9pbnRzKTsKKyAgICAgICAgaWYgKHZl
cmIgIT0gU2tQYXRoOjprTW92ZV9WZXJiKSB7CisgICAgICAgICAgICBpZiAoIWNvbnRvdXIpIHsK
KyAgICAgICAgICAgICAgICBjb250b3VyID0gbV9hcmVuYS0+YWxsb2NhdGVPYmplY3Q8Q29udG91
cj4oKTsKKyAgICAgICAgICAgICAgICBtX2NvbnRvdXJzLmFwcGVuZChjb250b3VyKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKHZlcmIpIHsKKyAgICAgICAgY2Fz
ZSBTa1BhdGg6OmtNb3ZlX1ZlcmI6IHsKKyAgICAgICAgICAgIGNvbnRvdXIgPSBtX2FyZW5hLT5h
bGxvY2F0ZU9iamVjdDxDb250b3VyPigpOworICAgICAgICAgICAgbV9jb250b3Vycy5hcHBlbmQo
Y29udG91cik7CisgICAgICAgICAgICBjdXJQb2ludCA9IHBvaW50c1swXTsKKyAgICAgICAgICAg
IG1vdmVUb1BvaW50ID0gcG9pbnRzWzBdOworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgICAgIGlm
IChtX3ZlcmJvc2VMb2dnaW5nKQorICAgICAgICAgICAgICAgIExPR19FUlJPUigiTW92ZVRvICgl
ZiwgJWYpIiwgcG9pbnRzWzBdLmZYLCBwb2ludHNbMF0uZlkpOworI2VuZGlmCisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNrUGF0aDo6a0xpbmVfVmVyYjogewor
ICAgICAgICAgICAgU2VnbWVudCogc2VnbWVudCA9IG1fYXJlbmEtPmFsbG9jYXRlT2JqZWN0PFNl
Z21lbnQ+KCk7CisgICAgICAgICAgICBpZiAoaXRlci5pc0Nsb3NlTGluZSgpKSB7CisgICAgICAg
ICAgICAgICAgc2VnbWVudC0+c2V0dXAobV9hcmVuYS5nZXQoKSwgY29udG91ciwgY3VyUG9pbnQs
IHBvaW50c1sxXSk7CisjaWZuZGVmIE5ERUJVRworICAgICAgICAgICAgICAgIGlmIChtX3ZlcmJv
c2VMb2dnaW5nKQorICAgICAgICAgICAgICAgICAgICBMT0dfRVJST1IoIkNsb3NlTGluZVRvICgl
ZiwgJWYpLCAoJWYsICVmKSIsIGN1clBvaW50LmZYLCBjdXJQb2ludC5mWSwgcG9pbnRzWzFdLmZY
LCBwb2ludHNbMV0uZlkpOworI2VuZGlmCisgICAgICAgICAgICAgICAgY29udG91ci0+YWRkKHNl
Z21lbnQpOworICAgICAgICAgICAgICAgIGNvbnRvdXIgPSAwOworICAgICAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgICAgICBzZWdtZW50LT5zZXR1cChtX2FyZW5hLmdldCgpLCBjb250b3Vy
LCBwb2ludHNbMF0sIHBvaW50c1sxXSk7CisjaWZuZGVmIE5ERUJVRworICAgICAgICAgICAgICAg
IGlmIChtX3ZlcmJvc2VMb2dnaW5nKQorICAgICAgICAgICAgICAgICAgICBMT0dfRVJST1IoIkxp
bmVUbyAoJWYsICVmKSwgKCVmLCAlZikiLCBwb2ludHNbMF0uZlgsIHBvaW50c1swXS5mWSwgcG9p
bnRzWzFdLmZYLCBwb2ludHNbMV0uZlkpOworI2VuZGlmCisgICAgICAgICAgICAgICAgY29udG91
ci0+YWRkKHNlZ21lbnQpOworICAgICAgICAgICAgICAgIGN1clBvaW50ID0gcG9pbnRzWzFdOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2Fz
ZSBTa1BhdGg6OmtRdWFkX1ZlcmI6IHsKKyAgICAgICAgICAgIC8vIE5lZWQgdG8gZGVncmVlIGVs
ZXZhdGUgdGhlIHF1YWRyYXRpYyBpbnRvIGEgY3ViaWMKKyAgICAgICAgICAgIFNrUG9pbnQgY3Vi
aWNbNF07CisgICAgICAgICAgICBTa0NvbnZlcnRRdWFkVG9DdWJpYyhwb2ludHMsIGN1YmljKTsK
KyAgICAgICAgICAgIFNlZ21lbnQqIHNlZ21lbnQgPSBtX2FyZW5hLT5hbGxvY2F0ZU9iamVjdDxT
ZWdtZW50PigpOworICAgICAgICAgICAgc2VnbWVudC0+c2V0dXAobV9hcmVuYS5nZXQoKSwgY29u
dG91ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1YmljWzBdLCBjdWJpY1sxXSwgY3Vi
aWNbMl0sIGN1YmljWzNdKTsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgICAgICBpZiAobV92ZXJi
b3NlTG9nZ2luZykKKyAgICAgICAgICAgICAgICBMT0dfRVJST1IoIlF1YWQtPkN1YmljVG8gKCVm
LCAlZiksICglZiwgJWYpLCAoJWYsICVmKSwgKCVmLCAlZikiLCBjdWJpY1swXS5mWCwgY3ViaWNb
MF0uZlksIGN1YmljWzFdLmZYLCBjdWJpY1sxXS5mWSwgY3ViaWNbMl0uZlgsIGN1YmljWzJdLmZZ
LCBjdWJpY1szXS5mWCwgY3ViaWNbM10uZlkpOworI2VuZGlmCisgICAgICAgICAgICBjb250b3Vy
LT5hZGQoc2VnbWVudCk7CisgICAgICAgICAgICBjdXJQb2ludCA9IGN1YmljWzNdOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTa1BhdGg6OmtDdWJpY19WZXJi
OiB7CisgICAgICAgICAgICBTZWdtZW50KiBzZWdtZW50ID0gbV9hcmVuYS0+YWxsb2NhdGVPYmpl
Y3Q8U2VnbWVudD4oKTsKKyAgICAgICAgICAgIHNlZ21lbnQtPnNldHVwKG1fYXJlbmEuZ2V0KCks
IGNvbnRvdXIsIHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSk7Cisj
aWZuZGVmIE5ERUJVRworICAgICAgICAgICAgaWYgKG1fdmVyYm9zZUxvZ2dpbmcpCisgICAgICAg
ICAgICAgICAgTE9HX0VSUk9SKCJDdWJpY1RvICglZiwgJWYpLCAoJWYsICVmKSwgKCVmLCAlZiks
ICglZiwgJWYpIiwgcG9pbnRzWzBdLmZYLCBwb2ludHNbMF0uZlksIHBvaW50c1sxXS5mWCwgcG9p
bnRzWzFdLmZZLCBwb2ludHNbMl0uZlgsIHBvaW50c1syXS5mWSwgcG9pbnRzWzNdLmZYLCBwb2lu
dHNbM10uZlkpOworI2VuZGlmCisgICAgICAgICAgICBjb250b3VyLT5hZGQoc2VnbWVudCk7Cisg
ICAgICAgICAgICBjdXJQb2ludCA9IHBvaW50c1szXTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICB9CisgICAgICAgIGNhc2UgU2tQYXRoOjprQ2xvc2VfVmVyYjogeworICAgICAgICAgICAg
U2VnbWVudCogc2VnbWVudCA9IG1fYXJlbmEtPmFsbG9jYXRlT2JqZWN0PFNlZ21lbnQ+KCk7Cisg
ICAgICAgICAgICBzZWdtZW50LT5zZXR1cChtX2FyZW5hLmdldCgpLCBjb250b3VyLCBjdXJQb2lu
dCwgbW92ZVRvUG9pbnQpOworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgICAgIGlmIChtX3ZlcmJv
c2VMb2dnaW5nKQorICAgICAgICAgICAgICAgIExPR19FUlJPUigiQ2xvc2UgKCVmLCAlZikgLT4g
KCVmLCAlZikiLCBjdXJQb2ludC5mWCwgY3VyUG9pbnQuZlksIG1vdmVUb1BvaW50LmZYLCBtb3Zl
VG9Qb2ludC5mWSk7CisjZW5kaWYKKyAgICAgICAgICAgIGNvbnRvdXItPmFkZChzZWdtZW50KTsK
KyAgICAgICAgICAgIGNvbnRvdXIgPSAwOworICAgICAgICB9CisgICAgICAgIGNhc2UgU2tQYXRo
OjprRG9uZV9WZXJiOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IHdoaWxl
ICh2ZXJiICE9IFNrUGF0aDo6a0RvbmVfVmVyYik7CisjZWxzZSAvLyAhUExBVEZPUk0oU0tJQSkK
KyAgICAvLyBNdXN0IHBvcnQgdG8geW91ciBwbGF0Zm9ybS4KKyAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyNlbmRpZgorfQorCitWZWN0b3I8U2VnbWVudCo+IExvb3BCbGlublBhdGhQcm9jZXNz
b3I6OmFsbFNlZ21lbnRzT3ZlcmxhcHBpbmdZKENvbnRvdXIqIHF1ZXJ5Q29udG91ciwgZmxvYXQg
eCwgZmxvYXQgeSkKK3sKKyAgICBWZWN0b3I8U2VnbWVudCo+IHJlczsKKyAgICBmb3IgKFZlY3Rv
cjxDb250b3VyKj46Oml0ZXJhdG9yIGl0ZXIgPSBtX2NvbnRvdXJzLmJlZ2luKCk7CisgICAgICAg
ICBpdGVyICE9IG1fY29udG91cnMuZW5kKCk7CisgICAgICAgICBpdGVyKyspIHsKKyAgICAgICAg
Q29udG91ciogY3VyID0gKml0ZXI7CisgICAgICAgIGZvciAoU2VnbWVudCogc2VnID0gY3VyLT5i
ZWdpbigpOyBzZWcgIT0gY3VyLT5lbmQoKTsgc2VnID0gc2VnLT5uZXh0KCkpIHsKKyAgICAgICAg
ICAgIGNvbnN0IEZsb2F0UmVjdCYgYm91bmRpbmdCb3ggPSBzZWctPmJvdW5kaW5nQm94KCk7Cisg
ICAgICAgICAgICBpZiAoYm91bmRpbmdCb3gudG9wKCkgPD0geSAmJiB5IDw9IGJvdW5kaW5nQm94
LmJvdHRvbSgpKQorICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQoc2VnKTsKKyAgICAgICAgfQor
ICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvLyBVbmNvbW1lbnQgdGhpcyB0byBkZWJ1ZyB0
aGUgb3JpZW50YXRpb24gY29tcHV0YXRpb24uCisvLyAjZGVmaW5lIEdQVV9QQVRIX1BST0NFU1NP
Ul9ERUJVR19PUklFTlRBVElPTgorCisjaWZuZGVmIE5ERUJVRworLy8gUm91dGluZXMgbmVlZGVk
IHRvIHByaW50IHRoZSB0eXBlcyBvZiBJbnRlcnZhbE5vZGVzIHdlIGluc3RhbnRpYXRlCisvLyBp
biB0aGlzIGZpbGUuCisKK2lubGluZSBTdHJpbmcgdmFsdWVUb1N0cmluZyhjb25zdCBmbG9hdCYg
dmFsdWUpCit7CisgICAgcmV0dXJuIFN0cmluZzo6bnVtYmVyKHZhbHVlKTsKK30KKworaW5saW5l
IFN0cmluZyB2YWx1ZVRvU3RyaW5nKHZvaWQqIGNvbnN0JiB2YWx1ZSkKK3sKKyAgICByZXR1cm4g
U3RyaW5nOjpmb3JtYXQoIjB4JXAiLCB2YWx1ZSk7Cit9CisjZW5kaWYKKwordm9pZCBMb29wQmxp
bm5QYXRoUHJvY2Vzc29yOjpkZXRlcm1pbmVTaWRlc1RvRmlsbCgpCit7CisgICAgLy8gTG9vcCBh
bmQgQmxpbm4ncyBhbGdvcml0aG0gY2FuIG9ubHkgZWFzaWx5IGVtdWxhdGUgdGhlIGV2ZW4vb2Rk
CisgICAgLy8gZmlsbCBydWxlLCBhbmQgb25seSBmb3Igbm9uLWludGVyc2VjdGluZyBjdXJ2ZXMu
IFdlIGNhbiBkZXRlcm1pbmUKKyAgICAvLyB3aGljaCBzaWRlIG9mIGVhY2ggY3VydmUgc2VnbWVu
dCB0byBmaWxsIGJhc2VkIG9uIGl0cworICAgIC8vIGNsb2Nrd2lzZS9jb3VudGVyY2xvY2t3aXNl
IG9yaWVudGF0aW9uIGFuZCBob3cgbWFueSBvdGhlcgorICAgIC8vIGNvbnRvdXJzIHN1cnJvdW5k
IGl0LgorCisgICAgLy8gVG8gb3B0aW1pemUgdGhlIHF1ZXJ5IG9mIGFsbCBjdXJ2ZSBzZWdtZW50
cyBpbnRlcnNlY3RpbmcgYQorICAgIC8vIGhvcml6b250YWwgbGluZSBnb2luZyB0byB4PStpbmZp
bml0eSwgd2UgYnVpbGQgdXAgYW4gaW50ZXJ2YWwKKyAgICAvLyB0cmVlIHdob3NlIGtleXMgYXJl
IHRoZSB5IGV4dGVudHMgb2YgdGhlIHNlZ21lbnRzLgorICAgIFBPREludGVydmFsVHJlZTxmbG9h
dCwgU2VnbWVudCo+IHRyZWUobV9hcmVuYSk7CisgICAgdHlwZWRlZiBQT0RJbnRlcnZhbFRyZWU8
ZmxvYXQsIFNlZ21lbnQqPjo6SW50ZXJ2YWxUeXBlIEludGVydmFsVHlwZTsKKworICAgIGZvciAo
VmVjdG9yPENvbnRvdXIqPjo6aXRlcmF0b3IgaXRlciA9IG1fY29udG91cnMuYmVnaW4oKTsKKyAg
ICAgICAgIGl0ZXIgIT0gbV9jb250b3Vycy5lbmQoKTsKKyAgICAgICAgIGl0ZXIrKykgeworICAg
ICAgICBDb250b3VyKiBjdXIgPSAqaXRlcjsKKyAgICAgICAgZGV0ZXJtaW5lT3JpZW50YXRpb24o
Y3VyKTsKKyAgICAgICAgZm9yIChTZWdtZW50KiBzZWcgPSBjdXItPmJlZ2luKCk7IHNlZyAhPSBj
dXItPmVuZCgpOyBzZWcgPSBzZWctPm5leHQoKSkgeworICAgICAgICAgICAgY29uc3QgRmxvYXRS
ZWN0JiBib3VuZGluZ0JveCA9IHNlZy0+Ym91bmRpbmdCb3goKTsKKyAgICAgICAgICAgIHRyZWUu
YWRkKHRyZWUuY3JlYXRlSW50ZXJ2YWwoYm91bmRpbmdCb3gudG9wKCksIGJvdW5kaW5nQm94LmJv
dHRvbSgpLCBzZWcpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE5vdyBpdGVyYXRlIHRo
cm91Z2ggdGhlIGNvbnRvdXJzIGFuZCBwaWNrIGEgcmFuZG9tIHNlZ21lbnQgKGluCisgICAgLy8g
dGhpcyBjYXNlIHdlIHVzZSB0aGUgZmlyc3QpIGFuZCBhIHJhbmRvbSBwb2ludCBvbiB0aGF0IHNl
Z21lbnQuCisgICAgLy8gRmluZCBhbGwgc2VnbWVudHMgZnJvbSBvdGhlciBjb250b3VycyB3aGlj
aCBpbnRlcnNlY3QgdGhpcyBvbmUKKyAgICAvLyBhbmQgY291bnQgdGhlIG51bWJlciBvZiBjcm9z
c2luZ3MgYSBob3Jpem9udGFsIGxpbmUgdG8KKyAgICAvLyB4PStpbmZpbml0eSBtYWtlcyB3aXRo
IHRob3NlIGNvbnRvdXJzLiBUaGlzIGNvbWJpbmVkIHdpdGggdGhlCisgICAgLy8gb3JpZW50YXRp
b24gb2YgdGhlIGN1cnZlIHRlbGxzIHVzIHdoaWNoIHNpZGUgdG8gZmlsbCAtLSBhZ2FpbiwKKyAg
ICAvLyBhc3N1bWluZyBhbiBldmVuL29kZCBmaWxsIHJ1bGUsIHdoaWNoIGlzIGFsbCB3ZSBjYW4g
ZWFzaWx5CisgICAgLy8gaGFuZGxlLgorICAgIGZvciAoVmVjdG9yPENvbnRvdXIqPjo6aXRlcmF0
b3IgaXRlciA9IG1fY29udG91cnMuYmVnaW4oKTsKKyAgICAgICAgIGl0ZXIgIT0gbV9jb250b3Vy
cy5lbmQoKTsKKyAgICAgICAgIGl0ZXIrKykgeworICAgICAgICBDb250b3VyKiBjdXIgPSAqaXRl
cjsKKworICAgICAgICBib29sIGFtYmlndW91cyA9IHRydWU7CisgICAgICAgIGludCBudW1Dcm9z
c2luZ3MgPSAwOworCisgICAgICAgIC8vIEZvciBlYWNoIGNvbnRvdXIsIGF0dGVtcHQgdG8gZmlu
ZCBhIHBvaW50IG9uIHRoZSBjb250b3VyIHdoaWNoLAorICAgICAgICAvLyB3aGVuIHdlIGNhc3Qg
YW4gWFJheSwgZG9lcyBub3QgaW50ZXJzZWN0IHRoZSBvdGhlciBjb250b3VycyBhdAorICAgICAg
ICAvLyBhbiBhbWJpZ3VvdXMgcG9pbnQgKHRoZSBqdW5jdGlvbiBiZXR3ZWVuIHR3byBjdXJ2ZXMg
b3IgYXQgYQorICAgICAgICAvLyB0YW5nZW50IHBvaW50KS4gQW1iaWd1b3VzIHBvaW50cyBtYWtl
IHRoZSBkZXRlcm1pbmF0aW9uIG9mCisgICAgICAgIC8vIHdoZXRoZXIgdGhpcyBjb250b3VyIGlz
IGNvbnRhaW5lZCB3aXRoaW4gYW5vdGhlciBmcmFnaWxlLiBOb3RlCisgICAgICAgIC8vIHRoYXQg
dGhpcyBsb29wIGlzIG9ubHkgYW4gYXBwcm94aW1hdGlvbiB0byB0aGUgc2VsZWN0aW9uIG9mIGEK
KyAgICAgICAgLy8gZ29vZCBjYXN0aW5nIHBvaW50LiBXZSBjb3VsZCBhcyB3ZWxsIGV2YWx1YXRl
IGEgc2VnbWVudCB0bworICAgICAgICAvLyBkZXRlcm1pbmUgYSBwb2ludCB1cG9uIGl0LgorICAg
ICAgICBmb3IgKFNlZ21lbnQqIHNlZyA9IGN1ci0+YmVnaW4oKTsKKyAgICAgICAgICAgICBhbWJp
Z3VvdXMgJiYgc2VnICE9IGN1ci0+ZW5kKCk7CisgICAgICAgICAgICAgc2VnID0gc2VnLT5uZXh0
KCkpIHsKKyAgICAgICAgICAgIG51bUNyb3NzaW5ncyA9IDA7CisgICAgICAgICAgICAvLyBXZSB1
c2UgYSB6ZXJvLXNpemVkIHZlcnRpY2FsIGludGVydmFsIGZvciB0aGUgcXVlcnkuCisgICAgICAg
ICAgICBWZWN0b3I8SW50ZXJ2YWxUeXBlPiBvdmVybGFwcyA9IHRyZWUuYWxsT3ZlcmxhcHModHJl
ZS5jcmVhdGVJbnRlcnZhbChzZWctPmdldFBvaW50KDApLnkoKSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHNlZy0+Z2V0UG9pbnQoMCkueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkp
OworI2lmIGRlZmluZWQoR1BVX1BBVEhfUFJPQ0VTU09SX0RFQlVHX09SSUVOVEFUSU9OKSAmJiAh
ZGVmaW5lZChOREVCVUcpCisgICAgICAgICAgICBWZWN0b3I8U2VnbWVudCo+IHNsb3dPdmVybGFw
cyA9IGFsbFNlZ21lbnRzT3ZlcmxhcHBpbmdZKGN1ciwgc2VnLT5nZXRQb2ludCgwKS54KCksIHNl
Zy0+Z2V0UG9pbnQoMCkueSgpKTsKKyAgICAgICAgICAgIGlmIChvdmVybGFwcy5zaXplKCkgIT0g
c2xvd092ZXJsYXBzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIExPR19FUlJPUigiRm9yIHF1
ZXJ5IHBvaW50ICglZiwgJWYpIG9uIGNvbnRvdXIgMHglcDoiLCBzZWctPmdldFBvaW50KDApLngo
KSwgc2VnLT5nZXRQb2ludCgwKS55KCksIGN1cik7CisgICAgICAgICAgICAgICAgTE9HX0VSUk9S
KCIgb3ZlcmxhcHM6Iik7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBv
dmVybGFwcy5zaXplKCk7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCIgICVk
OiAlcyIsIGkrMSwgb3ZlcmxhcHNbaV0uZGF0YSgpLT50b1N0cmluZygpLmFzY2lpKCkuZGF0YSgp
KTsKKyAgICAgICAgICAgICAgICBMT0dfRVJST1IoIiBzbG93T3ZlcmxhcHM6Iik7CisgICAgICAg
ICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzbG93T3ZlcmxhcHMuc2l6ZSgpOyBpKysp
CisgICAgICAgICAgICAgICAgICAgIExPR19FUlJPUigiICAlZDogJXMiLCAoaSsxKSBzbG93T3Zl
cmxhcHNbaV0tPnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIExPR19FUlJPUigiSW50ZXJ2
YWwgdHJlZToiKTsKKyAgICAgICAgICAgICAgICB0cmVlLmR1bXAoKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIEFTU0VSVChvdmVybGFwcy5zaXplKCkgPT0gc2xvd092ZXJsYXBzLnNpemUo
KSk7CisjZW5kaWYgLy8gZGVmaW5lZChHUFVfUEFUSF9QUk9DRVNTT1JfREVCVUdfT1JJRU5UQVRJ
T04pICYmICFkZWZpbmVkKE5ERUJVRykKKyAgICAgICAgICAgIGZvciAoVmVjdG9yPEludGVydmFs
VHlwZT46Oml0ZXJhdG9yIGl0ZXIgPSBvdmVybGFwcy5iZWdpbigpOworICAgICAgICAgICAgICAg
ICBpdGVyICE9IG92ZXJsYXBzLmVuZCgpOworICAgICAgICAgICAgICAgICBpdGVyKyspIHsKKyAg
ICAgICAgICAgICAgICBjb25zdCBJbnRlcnZhbFR5cGUmIGludGVydmFsID0gKml0ZXI7CisgICAg
ICAgICAgICAgICAgU2VnbWVudCogcXVlcnlTZWdtZW50ID0gaW50ZXJ2YWwuZGF0YSgpOworICAg
ICAgICAgICAgICAgIC8vIElnbm9yZSBzZWdtZW50cyBjb21pbmcgZnJvbSB0aGUgc2FtZSBjb250
b3VyLgorICAgICAgICAgICAgICAgIGlmIChxdWVyeVNlZ21lbnQtPmNvbnRvdXIoKSAhPSBjdXIp
IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gT25seSBwZXJmb3JtIHF1ZXJpZXMgdGhhdCBjYW4g
YWZmZWN0IHRoZSBjb21wdXRhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRS
ZWN0JiBib3VuZGluZ0JveCA9IHF1ZXJ5U2VnbWVudC0+Y29udG91cigpLT5ib3VuZGluZ0JveCgp
OworICAgICAgICAgICAgICAgICAgICBpZiAoc2VnLT5nZXRQb2ludCgwKS54KCkgPj0gYm91bmRp
bmdCb3gubGVmdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBzZWctPmdldFBvaW50KDAp
LngoKSA8PSBib3VuZGluZ0JveC5yaWdodCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBu
dW1Dcm9zc2luZ3MgKz0gcXVlcnlTZWdtZW50LT5udW1Dcm9zc2luZ3NGb3JYUmF5KHNlZy0+Z2V0
UG9pbnQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtYmlndW91cyk7CisgICAgICAgICAgICAgICAg
ICAgICAgICBpZiAoYW1iaWd1b3VzKSB7CisjaWZuZGVmIE5ERUJVRworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGlmIChtX3ZlcmJvc2VMb2dnaW5nKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIExPR19FUlJPUigiQW1iaWd1b3VzIGludGVyc2VjdGlvbiBxdWVyeSBhdCBw
b2ludCAoJWYsICVmKSIsIHNlZy0+Z2V0UG9pbnQoMCkueCgpLCBzZWctPmdldFBvaW50KDApLnko
KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR19FUlJPUigiUXVlcnkgc2Vn
bWVudDogJXMiLCBxdWVyeVNlZ21lbnQtPnRvU3RyaW5nKCkuYXNjaWkoKS5kYXRhKCkpOworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGJyZWFrOyAvLyBBYm9ydCBpdGVyYXRpb24gb3ZlciBvdmVybGFwcy4KKyAgICAgICAg
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvLyBmb3IgKFNlZ21lbnQqIHNlZyA9IGN1ci0+
YmVnaW4oKTsgLi4uCisKKyAgICAgICAgY3VyLT5zZXRGaWxsU2lkZSgoY3VyLT5pc09yaWVudGVk
Q291bnRlckNsb2Nrd2lzZSgpIF4gKG51bUNyb3NzaW5ncyAmIDEpKSA/IExvb3BCbGlubkNvbnN0
YW50czo6TGVmdFNpZGUgOiBMb29wQmxpbm5Db25zdGFudHM6OlJpZ2h0U2lkZSk7CisgICAgfQor
fQorCit2b2lkIExvb3BCbGlublBhdGhQcm9jZXNzb3I6OmRldGVybWluZU9yaWVudGF0aW9uKENv
bnRvdXIqIGNvbnRvdXIpCit7CisgICAgLy8gRGV0ZXJtaW5lIHNpZ25lZCBhcmVhIG9mIHRoZSBw
b2x5Z29uIHJlcHJlc2VudGVkIGJ5IHRoZSBwb2ludHMKKyAgICAvLyBhbG9uZyB0aGUgc2VnbWVu
dHMuIENvbnNpZGVyIHRoaXMgYW4gYXBwcm94aW1hdGlvbiB0byB0aGUgdHJ1ZQorICAgIC8vIG9y
aWVudGF0aW9uIG9mIHRoZSBwb2x5Z29uOyBpdCBwcm9iYWJseSB3b24ndCBoYW5kbGUKKyAgICAv
LyBzZWxmLWludGVyc2VjdGluZyBjdXJ2ZXMgY29ycmVjdGx5LgorICAgIC8vCisgICAgLy8gVGhl
cmUgaXMgYWxzbyBhIHByZXR0eSBiYXNpYyBhc3N1bXB0aW9uIGhlcmUgdGhhdCB0aGUgY29udG91
ciBpcworICAgIC8vIGNsb3NlZC4KKyAgICBmbG9hdCBzaWduZWRBcmVhID0gMDsKKyAgICBmb3Ig
KFNlZ21lbnQqIHNlZyA9IGNvbnRvdXItPmJlZ2luKCk7CisgICAgICAgICBzZWcgIT0gY29udG91
ci0+ZW5kKCk7CisgICAgICAgICBzZWcgPSBzZWctPm5leHQoKSkgeworICAgICAgICBpbnQgbGlt
aXQgPSAoc2VnLT5raW5kKCkgPT0gU2VnbWVudDo6Q3ViaWMpID8gNCA6IDI7CisgICAgICAgIGZv
ciAoaW50IGkgPSAxOyBpIDwgbGltaXQ7IGkrKykgeworICAgICAgICAgICAgY29uc3QgRmxvYXRQ
b2ludCYgcHJldlBvaW50ID0gc2VnLT5nZXRQb2ludChpIC0gMSk7CisgICAgICAgICAgICBjb25z
dCBGbG9hdFBvaW50JiBwb2ludCA9IHNlZy0+Z2V0UG9pbnQoaSk7CisgICAgICAgICAgICBmbG9h
dCBjdXJBcmVhID0gcHJldlBvaW50LngoKSAqIHBvaW50LnkoKSAtIHByZXZQb2ludC55KCkgKiBw
b2ludC54KCk7CisjaWZuZGVmIE5ERUJVRworICAgICAgICAgICAgaWYgKG1fdmVyYm9zZUxvZ2dp
bmcpCisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJBZGRpbmcgdG8gc2lnbmVkIGFyZWEgKCVm
LCAlZikgLT4gKCVmLCAlZikgPSAlZiIsIHByZXZQb2ludC54KCksIHByZXZQb2ludC55KCksIHBv
aW50LngoKSwgcG9pbnQueSgpLCBjdXJBcmVhKTsKKyNlbmRpZgorICAgICAgICAgICAgc2lnbmVk
QXJlYSArPSBjdXJBcmVhOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNpZ25lZEFyZWEg
PiAwKQorICAgICAgICBjb250b3VyLT5zZXRJc09yaWVudGVkQ291bnRlckNsb2Nrd2lzZSh0cnVl
KTsKKyAgICBlbHNlCisgICAgICAgIGNvbnRvdXItPnNldElzT3JpZW50ZWRDb3VudGVyQ2xvY2t3
aXNlKGZhbHNlKTsKK30KKworbmFtZXNwYWNlIHsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDbGFz
c2VzIGFuZCB0eXBlZGVmcyBuZWVkZWQgZm9yIGN1cnZlIHN1YmRpdmlzaW9uLiBUaGVzZSBjYW4n
dCBiZSBzY29wZWQKKy8vIHdpdGhpbiB0aGUgc3ViZGl2aWRlQ3VydmVzKCkgbWV0aG9kIGl0c2Vs
ZiwgYmVjYXVzZSB0ZW1wbGF0ZXMgdGhlbiBmYWlsCisvLyB0byBpbnN0YW50aWF0ZS4KKworLy8g
VGhlIHVzZXIgZGF0YSB3aGljaCBpcyBwbGFjZWQgaW4gdGhlIFBPREludGVydmFsVHJlZS4KK3N0
cnVjdCBTd2VlcERhdGEgeworICAgIFN3ZWVwRGF0YSgpCisgICAgICAgIDogdHJpYW5nbGUoMCkK
KyAgICAgICAgLCBzZWdtZW50KDApCisgICAgeworICAgIH0KKworICAgIC8vIFRoZSB0cmlhbmds
ZSB0aGlzIGludGVydmFsIGlzIGFzc29jaWF0ZWQgd2l0aAorICAgIExvb3BCbGlubkxvY2FsVHJp
YW5ndWxhdG9yOjpUcmlhbmdsZSogdHJpYW5nbGU7CisgICAgLy8gVGhlIHNlZ21lbnQgdGhlIHRy
aWFuZ2xlIGlzIGFzc29jaWF0ZWQgd2l0aAorICAgIFNlZ21lbnQqIHNlZ21lbnQ7Cit9OworCit0
eXBlZGVmIFBPREludGVydmFsVHJlZTxmbG9hdCwgU3dlZXBEYXRhKj4gU3dlZXBUcmVlOwordHlw
ZWRlZiBTd2VlcFRyZWU6OkludGVydmFsVHlwZSBTd2VlcEludGVydmFsOworCisvLyBUaGUgZW50
cnkgLyBleGl0IGV2ZW50cyB3aGljaCBvY2N1ciBhdCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB4
CisvLyBjb29yZGluYXRlcyBvZiB0aGUgY29udHJvbCBwb2ludCB0cmlhbmdsZXMnIGJvdW5kaW5n
IGJveGVzLgorLy8KKy8vIE5vdGUgdGhhdCB0aGlzIGNsYXNzIHJlcXVpcmVzIGl0cyBjb3B5IGNv
bnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50CisvLyBvcGVyYXRvciBzaW5jZSBpdCBuZWVkcyB0byBi
ZSBzdG9yZWQgaW4gYSBWZWN0b3IuCitjbGFzcyBTd2VlcEV2ZW50IHsKK3B1YmxpYzoKKyAgICBT
d2VlcEV2ZW50KCkKKyAgICAgICAgOiBtX3goMCkKKyAgICAgICAgLCBtX2VudHJ5KGZhbHNlKQor
ICAgICAgICAsIG1faW50ZXJ2YWwoMCwgMCwgMCkKKyAgICB7CisgICAgfQorCisgICAgLy8gSW5p
dGlhbGl6ZXMgdGhlIFN3ZWVwRXZlbnQuCisgICAgdm9pZCBzZXR1cChmbG9hdCB4LCBib29sIGVu
dHJ5LCBTd2VlcEludGVydmFsIGludGVydmFsKQorICAgIHsKKyAgICAgICAgbV94ID0geDsKKyAg
ICAgICAgbV9lbnRyeSA9IGVudHJ5OworICAgICAgICBtX2ludGVydmFsID0gaW50ZXJ2YWw7Cisg
ICAgfQorCisgICAgZmxvYXQgeCgpIGNvbnN0IHsgcmV0dXJuIG1feDsgfQorICAgIGJvb2wgZW50
cnkoKSBjb25zdCB7IHJldHVybiBtX2VudHJ5OyB9CisgICAgY29uc3QgU3dlZXBJbnRlcnZhbCYg
aW50ZXJ2YWwoKSBjb25zdCB7IHJldHVybiBtX2ludGVydmFsOyB9CisKKyAgICBib29sIG9wZXJh
dG9yPChjb25zdCBTd2VlcEV2ZW50JiBvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVy
biBtX3ggPCBvdGhlci5tX3g7CisgICAgfQorCitwcml2YXRlOgorICAgIGZsb2F0IG1feDsKKyAg
ICBib29sIG1fZW50cnk7CisgICAgU3dlZXBJbnRlcnZhbCBtX2ludGVydmFsOworfTsKKworYm9v
bCB0cmlhbmdsZXNPdmVybGFwKExvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpUcmlhbmdsZSog
dDAsCisgICAgICAgICAgICAgICAgICAgICAgTG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OlRy
aWFuZ2xlKiB0MSkKK3sKKyAgICByZXR1cm4gdHJpYW5nbGVzT3ZlcmxhcCh0MC0+Z2V0VmVydGV4
KDApLT54eUNvb3JkaW5hdGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDAtPmdl
dFZlcnRleCgxKS0+eHlDb29yZGluYXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHQwLT5nZXRWZXJ0ZXgoMiktPnh5Q29vcmRpbmF0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB0MS0+Z2V0VmVydGV4KDApLT54eUNvb3JkaW5hdGVzKCksCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdDEtPmdldFZlcnRleCgxKS0+eHlDb29yZGluYXRlcygpLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHQxLT5nZXRWZXJ0ZXgoMiktPnh5Q29vcmRpbmF0ZXMoKSk7
Cit9CisKK30gLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCit2b2lkIExvb3BCbGlublBhdGhQcm9j
ZXNzb3I6OnN1YmRpdmlkZUN1cnZlcygpCit7CisgICAgLy8gV2UgbmVlZCB0byBkZXRlcm1pbmUg
YWxsIG92ZXJsYXBzIG9mIGFsbCBjb250cm9sIHBvaW50IHRyaWFuZ2xlcworICAgIC8vIChmcm9t
IGRpZmZlcmVudCBzZWdtZW50cywgbm90IHRoZSBzYW1lIHNlZ21lbnQpIGFuZCwgaWYgYW55Cisg
ICAgLy8gZXhpc3QsIHN1YmRpdmlkZSB0aGUgYXNzb2NpYXRlZCBjdXJ2ZXMuCisgICAgLy8KKyAg
ICAvLyBUaGUgcGxhbmUtc3dlZXAgYWxnb3JpdGhtIGRldGVybWluZXMgYWxsIG92ZXJsYXBzIG9m
IGEgc2V0IG9mCisgICAgLy8gcmVjdGFuZ2xlcyBpbiB0aGUgMkQgcGxhbmUuIE91ciBwcm9ibGVt
IG1hcHMgdmVyeSB3ZWxsIHRvIHRoaXMKKyAgICAvLyBhbGdvcml0aG0gYW5kIHNpZ25pZmljYW50
bHkgcmVkdWNlcyB0aGUgY29tcGxleGl0eSBjb21wYXJlZCB0byBhCisgICAgLy8gbmFpdmUgaW1w
bGVtZW50YXRpb24uCisgICAgLy8KKyAgICAvLyBFYWNoIGJvdW5kaW5nIGJveCBvZiBhIGNvbnRy
b2wgcG9pbnQgdHJpYW5nbGUgaXMgY29udmVydGVkIGludG8KKyAgICAvLyBhbiAiZW50cnkiIGV2
ZW50IGF0IGl0cyBzbWFsbGVzdCBYIGNvb3JkaW5hdGUgYW5kIGFuICJleGl0IiBldmVudAorICAg
IC8vIGF0IGl0cyBsYXJnZXN0IFggY29vcmRpbmF0ZS4gRWFjaCBldmVudCBoYXMgYW4gYXNzb2Np
YXRlZAorICAgIC8vIG9uZS1kaW1lbnNpb25hbCBpbnRlcnZhbCByZXByZXNlbnRpbmcgdGhlIFkg
c3BhbiBvZiB0aGUgYm91bmRpbmcKKyAgICAvLyBib3guIFdlIHNvcnQgdGhlc2UgZXZlbnRzIGJ5
IGluY3JlYXNpbmcgWCBjb29yZGluYXRlLiBXZSB0aGVuCisgICAgLy8gaXRlcmF0ZSB0aHJvdWdo
IHRoZW0uIEZvciBlYWNoIGVudHJ5IGV2ZW50IHdlIGFkZCB0aGUgaW50ZXJ2YWwgdG8KKyAgICAv
LyBhIHNpZGUgaW50ZXJ2YWwgdHJlZSwgYW5kIHF1ZXJ5IHRoaXMgdHJlZSBmb3Igb3ZlcmxhcHBp
bmcKKyAgICAvLyBpbnRlcnZhbHMuIEFueSBvdmVybGFwcGluZyBpbnRlcnZhbCBjb3JyZXNwb25k
cyB0byBhbiBvdmVybGFwcGluZworICAgIC8vIGJvdW5kaW5nIGJveC4gRm9yIGVhY2ggZXhpdCBl
dmVudCB3ZSByZW1vdmUgdGhlIGFzc29jaWF0ZWQKKyAgICAvLyBpbnRlcnZhbCBmcm9tIHRoZSBp
bnRlcnZhbCB0cmVlLgorCisgICAgVmVjdG9yPFNlZ21lbnQqPiBjdXJTZWdtZW50czsKKyAgICBW
ZWN0b3I8U2VnbWVudCo+IG5leHRTZWdtZW50czsKKworICAgIC8vIFN0YXJ0IHRoaW5ncyBvZmYg
YnkgY29uc2lkZXJpbmcgYWxsIG9mIHRoZSBzZWdtZW50cworICAgIGZvciAoVmVjdG9yPENvbnRv
dXIqPjo6aXRlcmF0b3IgaXRlciA9IG1fY29udG91cnMuYmVnaW4oKTsKKyAgICAgICAgIGl0ZXIg
IT0gbV9jb250b3Vycy5lbmQoKTsKKyAgICAgICAgIGl0ZXIrKykgeworICAgICAgICBDb250b3Vy
KiBjdXIgPSAqaXRlcjsKKyAgICAgICAgZm9yIChTZWdtZW50KiBzZWcgPSBjdXItPmJlZ2luKCk7
IHNlZyAhPSBjdXItPmVuZCgpOyBzZWcgPSBzZWctPm5leHQoKSkgeworICAgICAgICAgICAgaWYg
KHNlZy0+a2luZCgpID09IFNlZ21lbnQ6OkN1YmljKSB7CisgICAgICAgICAgICAgICAgc2VnLT50
cmlhbmd1bGF0ZShMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6RG9udENvbXB1dGVJbnNpZGVF
ZGdlcywgMCk7CisgICAgICAgICAgICAgICAgY3VyU2VnbWVudHMuYXBwZW5kKHNlZyk7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTdWJkaXZpZGUgY3VydmVzIGF0
IG1vc3QgdGhpcyBtYW55IHRpbWVzCisgICAgY29uc3QgaW50IE1heEl0ZXJhdGlvbnMgPSA1Owor
ICAgIFZlY3RvcjxTd2VlcEludGVydmFsPiBvdmVybGFwczsKKworICAgIGZvciAoaW50IGN1cnJl
bnRJdGVyYXRpb24gPSAwOyBjdXJyZW50SXRlcmF0aW9uIDwgTWF4SXRlcmF0aW9uczsgKytjdXJy
ZW50SXRlcmF0aW9uKSB7CisgICAgICAgIGlmICghY3VyU2VnbWVudHMuc2l6ZSgpKQorICAgICAg
ICAgICAgLy8gRG9uZQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgVmVjdG9yPFN3ZWVw
RXZlbnQ+IGV2ZW50czsKKyAgICAgICAgU3dlZXBUcmVlIHRyZWUobV9hcmVuYSk7CisgICAgICAg
IGZvciAoVmVjdG9yPFNlZ21lbnQqPjo6aXRlcmF0b3IgaXRlciA9IGN1clNlZ21lbnRzLmJlZ2lu
KCk7CisgICAgICAgICAgICAgaXRlciAhPSBjdXJTZWdtZW50cy5lbmQoKTsKKyAgICAgICAgICAg
ICBpdGVyKyspIHsKKyAgICAgICAgICAgIFNlZ21lbnQqIHNlZyA9ICppdGVyOworICAgICAgICAg
ICAgaWYgKHNlZy0+a2luZCgpID09IFNlZ21lbnQ6OkN1YmljKSB7CisgICAgICAgICAgICAgICAg
Zm9yIChpbnQgaSA9IDA7IGkgPCBzZWctPm51bWJlck9mVHJpYW5nbGVzKCk7IGkrKykgeworICAg
ICAgICAgICAgICAgICAgICBMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6VHJpYW5nbGUqIHRy
aWFuZ2xlID0gc2VnLT5nZXRUcmlhbmdsZShpKTsKKyAgICAgICAgICAgICAgICAgICAgRmxvYXRS
ZWN0IGJvdW5kaW5nQm94OworICAgICAgICAgICAgICAgICAgICBib3VuZGluZ0JveC5maXRUb1Bv
aW50cyh0cmlhbmdsZS0+Z2V0VmVydGV4KDApLT54eUNvb3JkaW5hdGVzKCksCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpYW5nbGUtPmdldFZlcnRleCgxKS0+eHlDb29y
ZGluYXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWFuZ2xl
LT5nZXRWZXJ0ZXgoMiktPnh5Q29vcmRpbmF0ZXMoKSk7CisgICAgICAgICAgICAgICAgICAgIC8v
IElnbm9yZSB6ZXJvLXdpZHRoIHRyaWFuZ2xlcyB0byBhdm9pZCBpc3N1ZXMgd2l0aAorICAgICAg
ICAgICAgICAgICAgICAvLyBjb2luY2lkZW50IGVudHJ5IGFuZCBleGl0IGV2ZW50cyBmb3IgdGhl
IHNhbWUgdHJpYW5nbGUKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJvdW5kaW5nQm94LnJpZ2h0
KCkgPiBib3VuZGluZ0JveC5sZWZ0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN3ZWVw
RGF0YSogZGF0YSA9IG1fYXJlbmEtPmFsbG9jYXRlT2JqZWN0PFN3ZWVwRGF0YT4oKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGRhdGEtPnRyaWFuZ2xlID0gdHJpYW5nbGU7CisgICAgICAgICAg
ICAgICAgICAgICAgICBkYXRhLT5zZWdtZW50ID0gc2VnOworICAgICAgICAgICAgICAgICAgICAg
ICAgU3dlZXBJbnRlcnZhbCBpbnRlcnZhbCA9IHRyZWUuY3JlYXRlSW50ZXJ2YWwoYm91bmRpbmdC
b3gudG9wKCksIGJvdW5kaW5nQm94LmJvdHRvbSgpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIEFkZCBlbnRyeSBhbmQgZXhpdCBldmVudHMKKyAgICAgICAgICAgICAgICAgICAg
ICAgIFN3ZWVwRXZlbnQgZXZlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zZXR1
cChib3VuZGluZ0JveC5sZWZ0KCksIHRydWUsIGludGVydmFsKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGV2ZW50cy5hcHBlbmQoZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgZXZl
bnQuc2V0dXAoYm91bmRpbmdCb3gucmlnaHQoKSwgZmFsc2UsIGludGVydmFsKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGV2ZW50cy5hcHBlbmQoZXZlbnQpOworICAgICAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAg
ICAgLy8gU29ydCBldmVudHMgYnkgaW5jcmVhc2luZyBYIGNvb3JkaW5hdGUKKyAgICAgICAgc3Rk
Ojpzb3J0KGV2ZW50cy5iZWdpbigpLCBldmVudHMuZW5kKCkpOworI2lmbmRlZiBOREVCVUcKKyAg
ICAgICAgZm9yIChzaXplX3QgaWkgPSAxOyBpaSA8IGV2ZW50cy5zaXplKCk7ICsraWkpCisgICAg
ICAgICAgICBBU1NFUlQoZXZlbnRzW2lpIC0gMV0ueCgpIDw9IGV2ZW50c1tpaV0ueCgpKTsKKyNl
bmRpZgorCisgICAgICAgIC8vIE5vdyBpdGVyYXRlIHRocm91Z2ggdGhlIGV2ZW50cworICAgICAg
ICBmb3IgKFZlY3RvcjxTd2VlcEV2ZW50Pjo6aXRlcmF0b3IgaXRlciA9IGV2ZW50cy5iZWdpbigp
OworICAgICAgICAgICAgIGl0ZXIgIT0gZXZlbnRzLmVuZCgpOworICAgICAgICAgICAgIGl0ZXIr
KykgeworICAgICAgICAgICAgU3dlZXBFdmVudCBldmVudCA9ICppdGVyOworICAgICAgICAgICAg
aWYgKGV2ZW50LmVudHJ5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhpcyBpbnRlcnZh
bCBpbnRvIHRoZSB0cmVlCisgICAgICAgICAgICAgICAgdHJlZS5hZGQoZXZlbnQuaW50ZXJ2YWwo
KSk7CisgICAgICAgICAgICAgICAgLy8gU2VlIHdoZXRoZXIgdGhlIGFzc29jaWF0ZWQgc2VnbWVu
dCBoYXMgYmVlbiBzdWJkaXZpZGVkIHlldAorICAgICAgICAgICAgICAgIGlmICghZXZlbnQuaW50
ZXJ2YWwoKS5kYXRhKCktPnNlZ21lbnQtPm1hcmtlZEZvclN1YmRpdmlzaW9uKCkpIHsKKyAgICAg
ICAgICAgICAgICAgICAgLy8gUXVlcnkgdGhlIHRyZWUKKyAgICAgICAgICAgICAgICAgICAgb3Zl
cmxhcHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJlZS5hbGxPdmVybGFwcyhldmVu
dC5pbnRlcnZhbCgpLCBvdmVybGFwcyk7CisgICAgICAgICAgICAgICAgICAgIC8vIE5vdyBzZWUg
ZXhhY3RseSB3aGljaCB0cmlhbmdsZXMgb3ZlcmxhcCB0aGlzIG9uZQorICAgICAgICAgICAgICAg
ICAgICBmb3IgKFZlY3RvcjxTd2VlcEludGVydmFsPjo6aXRlcmF0b3IgaXRlciA9IG92ZXJsYXBz
LmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgaXRlciAhPSBvdmVybGFwcy5lbmQo
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyKyspIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIFN3ZWVwSW50ZXJ2YWwgb3ZlcmxhcCA9ICppdGVyOworICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIG92ZXJsYXBzIGZyb20gYSBkaWZmZXJlbnQg
U2VnbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmludGVydmFsKCkuZGF0
YSgpLT5zZWdtZW50ICE9IG92ZXJsYXAuZGF0YSgpLT5zZWdtZW50KSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgLy8gU2VlIHdoZXRoZXIgdGhlIHRyaWFuZ2xlcyBhY3R1YWxseSBvdmVy
bGFwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyaWFuZ2xlc092ZXJsYXAoZXZl
bnQuaW50ZXJ2YWwoKS5kYXRhKCktPnRyaWFuZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXAuZGF0YSgpLT50cmlhbmdsZSkpIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWN0dWFsbHkgc3ViZGl2aWRlIHRoZSBz
ZWdtZW50cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWFjaCBvbmUgbWln
aHQgYWxyZWFkeSBoYXZlIGJlZW4gc3ViZGl2aWRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgU2VnbWVudCogc2VnID0gZXZlbnQuaW50ZXJ2YWwoKS5kYXRhKCktPnNlZ21lbnQ7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsbHlTdWJkaXZpZGUo
c2VnLCBuZXh0U2VnbWVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWcg
PSBvdmVybGFwLmRhdGEoKS0+c2VnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY29uZGl0aW9uYWxseVN1YmRpdmlkZShzZWcsIG5leHRTZWdtZW50cyk7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhpcyBpbnRlcnZhbCBmcm9tIHRoZSB0cmVlCisgICAg
ICAgICAgICAgICAgdHJlZS5yZW1vdmUoZXZlbnQuaW50ZXJ2YWwoKSk7CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKworICAgICAgICBjdXJTZWdtZW50cyA9IG5leHRTZWdtZW50czsKKyAgICAg
ICAgbmV4dFNlZ21lbnRzLmNsZWFyKCk7CisgICAgfQorfQorCit2b2lkIExvb3BCbGlublBhdGhQ
cm9jZXNzb3I6OmNvbmRpdGlvbmFsbHlTdWJkaXZpZGUoU2VnbWVudCogc2VnLCBWZWN0b3I8U2Vn
bWVudCo+JiBuZXh0U2VnbWVudHMpCit7CisgICAgaWYgKCFzZWctPm1hcmtlZEZvclN1YmRpdmlz
aW9uKCkpIHsKKyAgICAgICAgc2VnLT5zZXRNYXJrZWRGb3JTdWJkaXZpc2lvbih0cnVlKTsKKyAg
ICAgICAgU2VnbWVudCogbmV4dCA9IHNlZy0+Y29udG91cigpLT5zdWJkaXZpZGUoc2VnKTsKKyAg
ICAgICAgLy8gVHJpYW5ndWxhdGUgdGhlIG5ld2x5IHN1YmRpdmlkZWQgc2VnbWVudHMuCisgICAg
ICAgIG5leHQtPnRyaWFuZ3VsYXRlKExvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpEb250Q29t
cHV0ZUluc2lkZUVkZ2VzLCAwKTsKKyAgICAgICAgbmV4dC0+bmV4dCgpLT50cmlhbmd1bGF0ZShM
b29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6RG9udENvbXB1dGVJbnNpZGVFZGdlcywgMCk7Cisg
ICAgICAgIC8vIEFkZCB0aGVtIGZvciB0aGUgbmV4dCBpdGVyYXRpb24uCisgICAgICAgIG5leHRT
ZWdtZW50cy5hcHBlbmQobmV4dCk7CisgICAgICAgIG5leHRTZWdtZW50cy5hcHBlbmQobmV4dC0+
bmV4dCgpKTsKKyAgICB9Cit9CisKKyNpZm5kZWYgTkRFQlVHCit2b2lkIExvb3BCbGlublBhdGhQ
cm9jZXNzb3I6OnN1YmRpdmlkZUN1cnZlc1Nsb3coKQoreworICAgIC8vIEFsdGVybmF0ZSwgc2ln
bmlmaWNhbnRseSBzbG93ZXIgYWxnb3JpdGhtIGZvciBjdXJ2ZSBzdWJkaXZpc2lvbgorICAgIC8v
IGZvciB1c2UgaW4gZGVidWdnaW5nLgorICAgIFZlY3RvcjxTZWdtZW50Kj4gY3VyU2VnbWVudHM7
CisgICAgVmVjdG9yPFNlZ21lbnQqPiBuZXh0U2VnbWVudHM7CisKKyAgICAvLyBTdGFydCB0aGlu
Z3Mgb2ZmIGJ5IGNvbnNpZGVyaW5nIGFsbCBvZiB0aGUgc2VnbWVudHMKKyAgICBmb3IgKFZlY3Rv
cjxDb250b3VyKj46Oml0ZXJhdG9yIGl0ZXIgPSBtX2NvbnRvdXJzLmJlZ2luKCk7CisgICAgICAg
ICBpdGVyICE9IG1fY29udG91cnMuZW5kKCk7CisgICAgICAgICBpdGVyKyspIHsKKyAgICAgICAg
Q29udG91ciogY3VyID0gKml0ZXI7CisgICAgICAgIGZvciAoU2VnbWVudCogc2VnID0gY3VyLT5i
ZWdpbigpOyBzZWcgIT0gY3VyLT5lbmQoKTsgc2VnID0gc2VnLT5uZXh0KCkpIHsKKyAgICAgICAg
ICAgIGlmIChzZWctPmtpbmQoKSA9PSBTZWdtZW50OjpDdWJpYykgeworICAgICAgICAgICAgICAg
IHNlZy0+dHJpYW5ndWxhdGUoTG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OkRvbnRDb21wdXRl
SW5zaWRlRWRnZXMsIDApOworICAgICAgICAgICAgICAgIGN1clNlZ21lbnRzLmFwcGVuZChzZWcp
OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gU3ViZGl2aWRlIGN1
cnZlcyBhdCBtb3N0IHRoaXMgbWFueSB0aW1lcworICAgIGNvbnN0IGludCBNYXhJdGVyYXRpb25z
ID0gNTsKKworICAgIGZvciAoaW50IGN1cnJlbnRJdGVyYXRpb24gPSAwOyBjdXJyZW50SXRlcmF0
aW9uIDwgTWF4SXRlcmF0aW9uczsgKytjdXJyZW50SXRlcmF0aW9uKSB7CisgICAgICAgIGlmICgh
Y3VyU2VnbWVudHMuc2l6ZSgpKQorICAgICAgICAgICAgLy8gRG9uZQorICAgICAgICAgICAgYnJl
YWs7CisKKyAgICAgICAgZm9yIChWZWN0b3I8U2VnbWVudCo+OjppdGVyYXRvciBpdGVyID0gY3Vy
U2VnbWVudHMuYmVnaW4oKTsKKyAgICAgICAgICAgICBpdGVyICE9IGN1clNlZ21lbnRzLmVuZCgp
OworICAgICAgICAgICAgIGl0ZXIrKykgeworICAgICAgICAgICAgU2VnbWVudCogc2VnID0gKml0
ZXI7CisgICAgICAgICAgICBpZiAoc2VnLT5raW5kKCkgPT0gU2VnbWVudDo6Q3ViaWMpIHsKKyAg
ICAgICAgICAgICAgICBmb3IgKFZlY3RvcjxTZWdtZW50Kj46Oml0ZXJhdG9yIGl0ZXIyID0gY3Vy
U2VnbWVudHMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgIGl0ZXIyICE9IGN1clNlZ21l
bnRzLmVuZCgpOworICAgICAgICAgICAgICAgICAgICAgaXRlcjIrKykgeworICAgICAgICAgICAg
ICAgICAgICBTZWdtZW50KiBzZWcyID0gKml0ZXIyOworICAgICAgICAgICAgICAgICAgICBpZiAo
c2VnMi0+a2luZCgpID09IFNlZ21lbnQ6OkN1YmljICYmIHNlZyAhPSBzZWcyKSB7CisgICAgICAg
ICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlZy0+bnVtYmVyT2ZUcmlhbmds
ZXMoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcEJsaW5uTG9jYWxU
cmlhbmd1bGF0b3I6OlRyaWFuZ2xlKiB0cmlhbmdsZSA9IHNlZy0+Z2V0VHJpYW5nbGUoaSk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzZWcyLT5udW1i
ZXJPZlRyaWFuZ2xlcygpOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
TG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OlRyaWFuZ2xlKiB0cmlhbmdsZTIgPSBzZWcyLT5n
ZXRUcmlhbmdsZShqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyaWFu
Z2xlc092ZXJsYXAodHJpYW5nbGUsIHRyaWFuZ2xlMikpIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsbHlTdWJkaXZpZGUoc2VnLCBuZXh0U2VnbWVudHMp
OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uYWxseVN1YmRp
dmlkZShzZWcyLCBuZXh0U2VnbWVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgfQorICAgICAgICB9CisKKyAgICAgICAgY3VyU2VnbWVudHMgPSBuZXh0U2VnbWVudHM7Cisg
ICAgICAgIG5leHRTZWdtZW50cy5jbGVhcigpOworICAgIH0KK30KKyNlbmRpZgorCituYW1lc3Bh
Y2UgeworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN0cnVjdHVyZXMgYW5kIGNhbGxiYWNrcyBmb3Ig
dGVzc2VsbGF0aW9uIG9mIHRoZSBpbnRlcmlvciByZWdpb24gb2YKKy8vIHRoZSBjb250b3Vycy4K
KworLy8gVGhlIHVzZXIgZGF0YSBmb3IgdGhlIEdMVSB0ZXNzZWxsYXRvci4KK3N0cnVjdCBUZXNz
ZWxsYXRpb25TdGF0ZSB7CisgICAgVGVzc2VsbGF0aW9uU3RhdGUoTG9vcEJsaW5uUGF0aENhY2hl
JiBpbnB1dENhY2hlKQorICAgICAgICA6IGNhY2hlKGlucHV0Q2FjaGUpIHsgfQorCisgICAgTG9v
cEJsaW5uUGF0aENhY2hlJiBjYWNoZTsKKyAgICBWZWN0b3I8dm9pZCo+IGFsbG9jYXRlZFBvaW50
ZXJzOworfTsKKworc3RhdGljIHZvaWQgdmVydGV4Q2FsbGJhY2sodm9pZCogdmVydGV4RGF0YSwg
dm9pZCogZGF0YSkKK3sKKyAgICBUZXNzZWxsYXRpb25TdGF0ZSogc3RhdGUgPSBzdGF0aWNfY2Fz
dDxUZXNzZWxsYXRpb25TdGF0ZSo+KGRhdGEpOworICAgIEdMZG91YmxlKiBsb2NhdGlvbiA9IHN0
YXRpY19jYXN0PEdMZG91YmxlKj4odmVydGV4RGF0YSk7CisgICAgc3RhdGUtPmNhY2hlLmFkZElu
dGVyaW9yVmVydGV4KHN0YXRpY19jYXN0PGZsb2F0Pihsb2NhdGlvblswXSksCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0Pihsb2NhdGlvblsxXSkp
OworfQorCitzdGF0aWMgdm9pZCBjb21iaW5lQ2FsbGJhY2soR0xkb3VibGUgY29vcmRzWzNdLCB2
b2lkKiB2ZXJ0ZXhEYXRhWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZmxvYXQg
d2VpZ2h0WzRdLCB2b2lkKiogb3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2
b2lkKiBwb2x5Z29uRGF0YSkKK3sKKyAgICBUZXNzZWxsYXRpb25TdGF0ZSogc3RhdGUgPSBzdGF0
aWNfY2FzdDxUZXNzZWxsYXRpb25TdGF0ZSo+KHBvbHlnb25EYXRhKTsKKyAgICBHTGRvdWJsZSog
b3V0VmVydGV4ID0gc3RhdGljX2Nhc3Q8R0xkb3VibGUqPihtYWxsb2MoMyAqIHNpemVvZihHTGRv
dWJsZSkpKTsKKyAgICBzdGF0ZS0+YWxsb2NhdGVkUG9pbnRlcnMuYXBwZW5kKG91dFZlcnRleCk7
CisgICAgb3V0VmVydGV4WzBdID0gY29vcmRzWzBdOworICAgIG91dFZlcnRleFsxXSA9IGNvb3Jk
c1sxXTsKKyAgICBvdXRWZXJ0ZXhbMl0gPSBjb29yZHNbMl07CisgICAgKm91dERhdGEgPSBvdXRW
ZXJ0ZXg7Cit9CisKK3N0YXRpYyB2b2lkIGVkZ2VGbGFnQ2FsbGJhY2soR0xib29sZWFuIGZsYWcp
Cit7CisgICAgLy8gTm8tb3AganVzdCB0byBwcmV2ZW50IHRyaWFuZ2xlIHN0cmlwcyBhbmQgZmFu
cyBmcm9tIGJlaW5nIHBhc3NlZCB0byB1cy4KK30KKworfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNl
CisKK3ZvaWQgTG9vcEJsaW5uUGF0aFByb2Nlc3Nvcjo6dGVzc2VsbGF0ZUludGVyaW9yKExvb3BC
bGlublBhdGhDYWNoZSYgY2FjaGUpCit7CisgICAgLy8gQmVjYXVzZSB0aGUgR0xVIHRlc3NlbGxh
dG9yIHJlcXVpcmVzIGl0cyBpbnB1dCBpbgorICAgIC8vIGRvdWJsZS1wcmVjaXNpb24gZm9ybWF0
LCB3ZSBuZWVkIHRvIG1ha2UgYSBzZXBhcmF0ZSBjb3B5IG9mIHRoZQorICAgIC8vIGRhdGEuCisg
ICAgVmVjdG9yPEdMZG91YmxlPiB2ZXJ0ZXhEYXRhOworICAgIFZlY3RvcjxzaXplX3Q+IGNvbnRv
dXJFbmRpbmdzOworICAgIC8vIEZvciBhdm9pZGluZyBhZGRpbmcgY29pbmNpZGVudCB2ZXJ0aWNl
cy4KKyAgICBmbG9hdCBjdXJYID0gMCwgY3VyWSA9IDA7CisgICAgZm9yIChWZWN0b3I8Q29udG91
cio+OjppdGVyYXRvciBpdGVyID0gbV9jb250b3Vycy5iZWdpbigpOworICAgICAgICAgaXRlciAh
PSBtX2NvbnRvdXJzLmVuZCgpOworICAgICAgICAgaXRlcisrKSB7CisgICAgICAgIENvbnRvdXIq
IGN1ciA9ICppdGVyOworICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChT
ZWdtZW50KiBzZWcgPSBjdXItPmJlZ2luKCk7IHNlZyAhPSBjdXItPmVuZCgpOyBzZWcgPSBzZWct
Pm5leHQoKSkgeworICAgICAgICAgICAgaW50IG51bWJlck9mSW50ZXJpb3JWZXJ0aWNlcyA9IHNl
Zy0+bnVtYmVyT2ZJbnRlcmlvclZlcnRpY2VzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0g
MDsgaSA8IG51bWJlck9mSW50ZXJpb3JWZXJ0aWNlcyAtIDE7IGkrKykgeworICAgICAgICAgICAg
ICAgIEZsb2F0UG9pbnQgcG9pbnQgPSBzZWctPmdldEludGVyaW9yVmVydGV4KGkpOworICAgICAg
ICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNl
OworICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhEYXRhLmFwcGVuZChwb2ludC54KCkpOworICAg
ICAgICAgICAgICAgICAgICB2ZXJ0ZXhEYXRhLmFwcGVuZChwb2ludC55KCkpOworICAgICAgICAg
ICAgICAgICAgICB2ZXJ0ZXhEYXRhLmFwcGVuZCgwKTsKKyAgICAgICAgICAgICAgICAgICAgY3Vy
WCA9IHBvaW50LngoKTsKKyAgICAgICAgICAgICAgICAgICAgY3VyWSA9IHBvaW50LnkoKTsKKyAg
ICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBvaW50LngoKSAhPSBjdXJYIHx8IHBvaW50LnkoKSAh
PSBjdXJZKSAgeworICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhEYXRhLmFwcGVuZChwb2ludC54
KCkpOworICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhEYXRhLmFwcGVuZChwb2ludC55KCkpOwor
ICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhEYXRhLmFwcGVuZCgwKTsKKyAgICAgICAgICAgICAg
ICAgICAgY3VyWCA9IHBvaW50LngoKTsKKyAgICAgICAgICAgICAgICAgICAgY3VyWSA9IHBvaW50
LnkoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAg
ICAgY29udG91ckVuZGluZ3MuYXBwZW5kKHZlcnRleERhdGEuc2l6ZSgpKTsKKyAgICB9CisgICAg
Ly8gTm93IHRoYXQgd2UgaGF2ZSBhbGwgb2YgdGhlIHZlcnRleCBkYXRhIGluIGEgc3RhYmxlIGxv
Y2F0aW9uIGluCisgICAgLy8gbWVtb3J5LCBjYWxsIHRoZSB0ZXNzZWxsYXRvci4KKyAgICBHTFV0
ZXNzZWxhdG9yKiB0ZXNzID0gaW50ZXJuYWxfZ2x1TmV3VGVzcygpOworICAgIFRlc3NlbGxhdGlv
blN0YXRlIHN0YXRlKGNhY2hlKTsKKyAgICBpbnRlcm5hbF9nbHVUZXNzQ2FsbGJhY2sodGVzcywg
R0xVX1RFU1NfVkVSVEVYX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50
ZXJwcmV0X2Nhc3Q8R0x2b2lkICgqKSgpPih2ZXJ0ZXhDYWxsYmFjaykpOworICAgIGludGVybmFs
X2dsdVRlc3NDYWxsYmFjayh0ZXNzLCBHTFVfVEVTU19DT01CSU5FX0RBVEEsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8R0x2b2lkICgqKSgpPihjb21iaW5l
Q2FsbGJhY2spKTsKKyAgICBpbnRlcm5hbF9nbHVUZXNzQ2FsbGJhY2sodGVzcywgR0xVX1RFU1Nf
RURHRV9GTEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0
PEdMdm9pZCAoKikoKT4oZWRnZUZsYWdDYWxsYmFjaykpOworICAgIGludGVybmFsX2dsdVRlc3NC
ZWdpblBvbHlnb24odGVzcywgJnN0YXRlKTsKKyAgICBpbnRlcm5hbF9nbHVUZXNzQmVnaW5Db250
b3VyKHRlc3MpOworICAgIEdMZG91YmxlKiBiYXNlID0gdmVydGV4RGF0YS5kYXRhKCk7CisgICAg
aW50IGNvbnRvdXJJbmRleCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2ZXJ0ZXhE
YXRhLnNpemUoKTsgaSArPSAzKSB7CisgICAgICAgIGlmIChpID09IGNvbnRvdXJFbmRpbmdzW2Nv
bnRvdXJJbmRleF0pIHsKKyAgICAgICAgICAgIGludGVybmFsX2dsdVRlc3NFbmRDb250b3VyKHRl
c3MpOworICAgICAgICAgICAgaW50ZXJuYWxfZ2x1VGVzc0JlZ2luQ29udG91cih0ZXNzKTsKKyAg
ICAgICAgICAgICsrY29udG91ckluZGV4OworICAgICAgICB9CisgICAgICAgIGludGVybmFsX2ds
dVRlc3NWZXJ0ZXgodGVzcywgJmJhc2VbaV0sICZiYXNlW2ldKTsKKyAgICB9CisgICAgaW50ZXJu
YWxfZ2x1VGVzc0VuZENvbnRvdXIodGVzcyk7CisgICAgaW50ZXJuYWxfZ2x1VGVzc0VuZFBvbHln
b24odGVzcyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0ZS5hbGxvY2F0ZWRQb2lu
dGVycy5zaXplKCk7IGkrKykKKyAgICAgICAgZnJlZShzdGF0ZS5hbGxvY2F0ZWRQb2ludGVyc1tp
XSk7CisgICAgaW50ZXJuYWxfZ2x1RGVsZXRlVGVzcyh0ZXNzKTsKK30KKworfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5u
UGF0aFByb2Nlc3Nvci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Z3B1L0xvb3BCbGlublBhdGhQcm9jZXNzb3IuaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BCbGlublBhdGhQcm9jZXNzb3IuaAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAq
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvLyBUaGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgTG9v
cCBhbmQgQmxpbm4ncyBHUFUgYWNjZWxlcmF0ZWQgY3VydmUKKy8vIHJlbmRlcmluZyBhbGdvcml0
aG0uCisKKyNpZm5kZWYgTG9vcEJsaW5uUGF0aFByb2Nlc3Nvcl9oCisjZGVmaW5lIExvb3BCbGlu
blBhdGhQcm9jZXNzb3JfaAorCisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CisjaW5jbHVk
ZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CisjaW5jbHVkZSA8
d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIFdlIHVzZSBhIG5hbWVz
cGFjZSBmb3IgY2xhc3NlcyB3aGljaCBhcmUgc2ltcGx5IGltcGxlbWVudGF0aW9uCisvLyBkZXRh
aWxzIG9mIHRoZSBhbGdvcml0aG0gYnV0IHdoaWNoIHdlIG5lZWQgdG8gcmVmZXJlbmNlIGZyb20g
dGhlCisvLyBjbGFzcyBkZWZpbml0aW9uLgorbmFtZXNwYWNlIExvb3BCbGlublBhdGhQcm9jZXNz
b3JJbXBsZW1lbnRhdGlvbiB7CisKK2NsYXNzIENvbnRvdXI7CitjbGFzcyBTZWdtZW50OworCit9
IC8vIG5hbWVzcGFjZSBMb29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRpb24KKworY2xh
c3MgUGF0aDsKK2NsYXNzIExvb3BCbGlublBhdGhDYWNoZTsKK2NsYXNzIFBPREFyZW5hOworCisv
LyBUaGUgTG9vcEJsaW5uUGF0aFByb2Nlc3NvciB0dXJucyBhIFBhdGggKGFzc3VtZWQgdG8gY29u
dGFpbiBvbmUgb3IKKy8vIG1vcmUgY2xvc2VkIHJlZ2lvbnMpIGludG8gYSBzZXQgb2YgZXh0ZXJp
b3IgYW5kIGludGVyaW9yIHRyaWFuZ2xlcywKKy8vIHN0b3JlZCBpbiB0aGUgTG9vcEJsaW5uUGF0
aENhY2hlLiBUaGUgZXh0ZXJpb3IgdHJpYW5nbGVzIGhhdmUKKy8vIGFzc29jaWF0ZWQgM0QgdGV4
dHVyZSBjb29yZGluYXRlcyB3aGljaCBhcmUgdXNlZCB0byBldmFsdWF0ZSB0aGUKKy8vIGN1cnZl
J3MgaW5zaWRlL291dHNpZGUgZnVuY3Rpb24gb24gYSBwZXItcGl4ZWwgYmFzaXMuIFRoZSBpbnRl
cmlvcgorLy8gdHJpYW5nbGVzIGFyZSBmaWxsZWQgd2l0aCAxMDAlIG9wYWNpdHkuCisvLworLy8g
Tm90ZSB0aGF0IHRoZSBmaWxsIHN0eWxlIGFuZCBtYW5hZ2VtZW50IG9mIG11bHRpcGxlIGxheWVy
cyBhcmUKKy8vIHNlcGFyYXRlIGNvbmNlcm5zLCBoYW5kbGVkIGF0IGEgaGlnaGVyIGxldmVsIHdp
dGggc2hhZGVycyBhbmQKKy8vIHBvbHlnb24gb2Zmc2V0cy4KK2NsYXNzIExvb3BCbGlublBhdGhQ
cm9jZXNzb3IgeworcHVibGljOgorICAgIExvb3BCbGlublBhdGhQcm9jZXNzb3IoKTsKKyAgICBl
eHBsaWNpdCBMb29wQmxpbm5QYXRoUHJvY2Vzc29yKFBhc3NSZWZQdHI8UE9EQXJlbmE+IGFyZW5h
KTsKKyAgICB+TG9vcEJsaW5uUGF0aFByb2Nlc3NvcigpOworCisgICAgLy8gVHJhbnNmb3JtcyB0
aGUgZ2l2ZW4gcGF0aCBpbnRvIGEgdHJpYW5nbGUgbWVzaCBmb3IgcmVuZGVyaW5nCisgICAgLy8g
dXNpbmcgTG9vcCBhbmQgQmxpbm4ncyBzaGFkZXIsIHBsYWNpbmcgdGhlIHJlc3VsdCBpbnRvIHRo
ZSBnaXZlbgorICAgIC8vIExvb3BCbGlublBhdGhDYWNoZS4KKyAgICB2b2lkIHByb2Nlc3MoY29u
c3QgUGF0aCYgcGF0aCwgTG9vcEJsaW5uUGF0aENhY2hlJiBjYWNoZSk7CisKKyNpZm5kZWYgTkRF
QlVHCisgICAgLy8gRW5hYmxlcyBvciBkaXNhYmxlcyB2ZXJib3NlIGxvZ2dpbmcgaW4gZGVidWcg
bW9kZS4KKyAgICB2b2lkIHNldFZlcmJvc2VMb2dnaW5nKGJvb2wgb25Pck9mZik7CisjZW5kaWYK
KworcHJpdmF0ZToKKyAgICAvLyBCdWlsZHMgYSBsaXN0IG9mIGNvbnRvdXJzIGZvciB0aGUgZ2l2
ZW4gcGF0aC4KKyAgICB2b2lkIGJ1aWxkQ29udG91cnMoY29uc3QgUGF0aCYgcGF0aCk7CisKKyAg
ICAvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGxlZnQgb3IgcmlnaHQgc2lkZSBvZiBlYWNoIGNv
bnRvdXIgc2hvdWxkCisgICAgLy8gYmUgZmlsbGVkLgorICAgIHZvaWQgZGV0ZXJtaW5lU2lkZXNU
b0ZpbGwoKTsKKworICAgIC8vIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gKGNsb3NlZCkg
Y29udG91ciBpcyBvcmllbnRlZAorICAgIC8vIGNsb2Nrd2lzZSBvciBjb3VudGVyY2xvY2t3aXNl
LgorICAgIHZvaWQgZGV0ZXJtaW5lT3JpZW50YXRpb24oTG9vcEJsaW5uUGF0aFByb2Nlc3Nvcklt
cGxlbWVudGF0aW9uOjpDb250b3VyKiBjb250b3VyKTsKKworICAgIC8vIFN1YmRpdmlkZXMgdGhl
IGN1cnZlcyBzbyB0aGF0IHRoZXJlIGFyZSBubyBvdmVybGFwcyBvZiB0aGUKKyAgICAvLyB0cmlh
bmdsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJ2ZXMnIGNvbnRyb2wgcG9pbnRzLgorICAgIHZv
aWQgc3ViZGl2aWRlQ3VydmVzKCk7CisKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdXNlZCBkdXJp
bmcgY3VydmUgc3ViZGl2aXNpb24uCisgICAgdm9pZCBjb25kaXRpb25hbGx5U3ViZGl2aWRlKExv
b3BCbGlublBhdGhQcm9jZXNzb3JJbXBsZW1lbnRhdGlvbjo6U2VnbWVudCogc2VnLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8TG9vcEJsaW5uUGF0aFByb2Nlc3Nvcklt
cGxlbWVudGF0aW9uOjpTZWdtZW50Kj4mIG5leHRTZWdtZW50cyk7CisKKyAgICAvLyBUZXNzZWxs
YXRlcyB0aGUgaW50ZXJpb3IgcmVnaW9ucyBvZiB0aGUgY29udG91cnMuCisgICAgdm9pZCB0ZXNz
ZWxsYXRlSW50ZXJpb3IoTG9vcEJsaW5uUGF0aENhY2hlJiBjYWNoZSk7CisKKyAgICAvLyBGb3Ig
ZGVidWdnaW5nIHRoZSBvcmllbnRhdGlvbiBjb21wdXRhdGlvbi4gUmV0dXJucyBhbGwgb2YgdGhl
CisgICAgLy8gc2VnbWVudHMgb3ZlcmxhcHBpbmcgdGhlIGdpdmVuIFkgY29vcmRpbmF0ZS4KKyAg
ICBWZWN0b3I8TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpTZWdtZW50Kj4g
YWxsU2VnbWVudHNPdmVybGFwcGluZ1koTG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0
aW9uOjpDb250b3VyKiBxdWVyeUNvbnRvdXIsIGZsb2F0IHgsIGZsb2F0IHkpOworCisjaWZuZGVm
IE5ERUJVRworICAgIC8vIEZvciBkZWJ1Z2dpbmcgdGhlIGN1cnZlIHN1YmRpdmlzaW9uIGFsZ29y
aXRobS4gU3ViZGl2aWRlcyB0aGUKKyAgICAvLyBjdXJ2ZXMgdXNpbmcgYW4gYWx0ZXJuYXRlLCBz
bG93IChPKG5eMykpIGFsZ29yaXRobS4KKyAgICB2b2lkIHN1YmRpdmlkZUN1cnZlc1Nsb3coKTsK
KyNlbmRpZgorCisgICAgLy8gUE9EQXJlbmEgZnJvbSB3aGljaCB0byBhbGxvY2F0ZSB0ZW1wb3Jh
cnkgb2JqZWN0cy4KKyAgICBSZWZQdHI8UE9EQXJlbmE+IG1fYXJlbmE7CisKKyAgICAvLyBUaGUg
Y29udG91cnMgZGVzY3JpYmVkIGJ5IHRoZSBwYXRoLgorICAgIFZlY3RvcjxMb29wQmxpbm5QYXRo
UHJvY2Vzc29ySW1wbGVtZW50YXRpb246OkNvbnRvdXIqPiBtX2NvbnRvdXJzOworCisjaWZuZGVm
IE5ERUJVRworICAgIC8vIFdoZXRoZXIgb3Igbm90IHRvIHBlcmZvcm0gdmVyYm9zZSBsb2dnaW5n
IGluIGRlYnVnIG1vZGUuCisgICAgYm9vbCBtX3ZlcmJvc2VMb2dnaW5nOworI2VuZGlmCit9Owor
Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBMb29wQmxpbm5QYXRoUHJvY2Vz
c29yX2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>81734</attachid>
            <date>2011-02-08 19:42:11 -0800</date>
            <delta_ts>2011-02-10 13:37:28 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-45521-20110208194210.patch</filename>
            <type>text/plain</type>
            <size>58352</size>
            <attacher name="Kenneth Russell">kbr</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDc4MDA5KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNzYgQEAKKzIwMTEtMDItMDggIEtlbm5ldGgg
UnVzc2VsbCAgPGtickBnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIEluY29ycG9yYXRlIGFsZ29yaXRobSBmb3IgcHJvY2Vzc2luZyBw
YXRocyBpbnRvIEdQVS1yZW5kZXJhYmxlIHRyaWFuZ2xlIG1lc2hlcworICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDU1MjEKKworICAgICAgICBBZGRpbmcg
YW4gaW1wbGVtZW50YXRpb24gb2YgTG9vcCBhbmQgQmxpbm4ncyBHUFUgYWNjZWxlcmF0ZWQgcGF0
aAorICAgICAgICByZW5kZXJpbmcgYWxnb3JpdGhtIGZyb20gR1BVIEdlbXMgMy4gVGhpcyBpbXBs
ZW1lbnRhdGlvbiBwYXlzCisgICAgICAgIHBhcnRpY3VsYXIgYXR0ZW50aW9uIHRvIHRoZSBlZmZp
Y2llbmN5IG9mIHRoZSBjdXJ2ZSBzdWJkaXZpc2lvbgorICAgICAgICBwaGFzZSBuZWVkZWQgZm9y
IGNvcnJlY3QgcmVuZGVyaW5nLiBJdCB1dGlsaXplcyB0aGUgT3BlbkdMIHV0aWxpdHkKKyAgICAg
ICAgbGlicmFyeSB0ZXNzZWxsYXRvciBmb3IgdHJpYW5ndWxhdGlvbiBvZiB0aGUgaW50ZXJpb3Ig
b2YgdGhlCisgICAgICAgIHNoYXBlLiBUaGUgcmVnaW9ucyBoYW5kbGVkIGJ5IExvb3AgYW5kIEJs
aW5uJ3MgYWxnb3JpdGhtIGFyZQorICAgICAgICBoYW5kbGVkIGJ5IHRoZSBsb2NhbCB0cmlhbmd1
bGF0b3IgcHJldmlvdXNseSBpbmNvcnBvcmF0ZWQuCisKKyAgICAgICAgTm8gdGVzdHMgeWV0OyBw
aXhlbCB0ZXN0cyB3aWxsIGV2ZW50dWFsbHkgYmUgdXNlZCB0byB2ZXJpZnkgdGhpcworICAgICAg
ICBhbGdvcml0aG0gYW5kIHByZXZlbnQgcmVncmVzc2lvbnMuCisKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uUGF0aFByb2Nlc3Nvci5jcHA6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpTZWdtZW50
OjpTZWdtZW50KToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhQcm9jZXNzb3JJbXBs
ZW1lbnRhdGlvbjo6U2VnbWVudDo6c2V0dXApOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5u
UGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpTZWdtZW50OjpraW5kKToKKyAgICAgICAgKFdl
YkNvcmU6Okxvb3BCbGlublBhdGhQcm9jZXNzb3JJbXBsZW1lbnRhdGlvbjo6U2VnbWVudDo6Z2V0
UG9pbnQpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVu
dGF0aW9uOjpTZWdtZW50OjpuZXh0KToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhQ
cm9jZXNzb3JJbXBsZW1lbnRhdGlvbjo6U2VnbWVudDo6cHJldik6CisgICAgICAgIChXZWJDb3Jl
OjpMb29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRpb246OlNlZ21lbnQ6OnNldE5leHQp
OgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9u
OjpTZWdtZW50OjpzZXRQcmV2KToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhQcm9j
ZXNzb3JJbXBsZW1lbnRhdGlvbjo6U2VnbWVudDo6Y29udG91cik6CisgICAgICAgIChXZWJDb3Jl
OjpMb29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRpb246OlNlZ21lbnQ6OnN1YmRpdmlk
ZSk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRp
b246OlNlZ21lbnQ6OmJvdW5kaW5nQm94KToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBh
dGhQcm9jZXNzb3JJbXBsZW1lbnRhdGlvbjo6U2VnbWVudDo6bnVtQ3Jvc3NpbmdzRm9yWFJheSk6
CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRpb246
OlNlZ21lbnQ6Om51bWJlck9mVHJpYW5nbGVzKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlu
blBhdGhQcm9jZXNzb3JJbXBsZW1lbnRhdGlvbjo6U2VnbWVudDo6Z2V0VHJpYW5nbGUpOgorICAg
ICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpTZWdt
ZW50OjpudW1iZXJPZkludGVyaW9yVmVydGljZXMpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJs
aW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpTZWdtZW50OjpnZXRJbnRlcmlvclZlcnRl
eCk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRp
b246OlNlZ21lbnQ6Om1hcmtlZEZvclN1YmRpdmlzaW9uKToKKyAgICAgICAgKFdlYkNvcmU6Okxv
b3BCbGlublBhdGhQcm9jZXNzb3JJbXBsZW1lbnRhdGlvbjo6U2VnbWVudDo6c2V0TWFya2VkRm9y
U3ViZGl2aXNpb24pOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3Nvcklt
cGxlbWVudGF0aW9uOjpTZWdtZW50Ojp0b1N0cmluZyk6CisgICAgICAgIChXZWJDb3JlOjpMb29w
Qmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRpb246OlNlZ21lbnQ6OmNvbXB1dGVCb3VuZGlu
Z0JveCk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50
YXRpb246OkNvbnRvdXI6OkNvbnRvdXIpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0
aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpDb250b3VyOjphZGQpOgorICAgICAgICAoV2ViQ29y
ZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpDb250b3VyOjpzdWJkaXZp
ZGUpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0
aW9uOjpDb250b3VyOjpiZWdpbik6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJv
Y2Vzc29ySW1wbGVtZW50YXRpb246OkNvbnRvdXI6OmVuZCk6CisgICAgICAgIChXZWJDb3JlOjpM
b29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRpb246OkNvbnRvdXI6OmlzT3JpZW50ZWRD
b3VudGVyQ2xvY2t3aXNlKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhQcm9jZXNz
b3JJbXBsZW1lbnRhdGlvbjo6Q29udG91cjo6c2V0SXNPcmllbnRlZENvdW50ZXJDbG9ja3dpc2Up
OgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9u
OjpDb250b3VyOjpib3VuZGluZ0JveCk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRo
UHJvY2Vzc29ySW1wbGVtZW50YXRpb246OkNvbnRvdXI6OmZpbGxTaWRlKToKKyAgICAgICAgKFdl
YkNvcmU6Okxvb3BCbGlublBhdGhQcm9jZXNzb3JJbXBsZW1lbnRhdGlvbjo6Q29udG91cjo6c2V0
RmlsbFNpZGUpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxl
bWVudGF0aW9uOjpTZWdtZW50Ojp0cmlhbmd1bGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpMb29w
Qmxpbm5QYXRoUHJvY2Vzc29yOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29yKToKKyAgICAgICAgKFdl
YkNvcmU6Okxvb3BCbGlublBhdGhQcm9jZXNzb3I6On5Mb29wQmxpbm5QYXRoUHJvY2Vzc29yKToK
KyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhQcm9jZXNzb3I6OnByb2Nlc3MpOgorICAg
ICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3Nvcjo6YnVpbGRDb250b3Vycyk6Cisg
ICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29yOjphbGxTZWdtZW50c092ZXJs
YXBwaW5nWSk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29yOjpkZXRl
cm1pbmVTaWRlc1RvRmlsbCk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vz
c29yOjpkZXRlcm1pbmVPcmllbnRhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpTd2VlcERhdGE6
OlN3ZWVwRXZlbnQ6OlN3ZWVwRXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6U3dlZXBEYXRhOjpT
d2VlcEV2ZW50OjpzZXR1cCk6CisgICAgICAgIChXZWJDb3JlOjpTd2VlcERhdGE6OlN3ZWVwRXZl
bnQ6OngpOgorICAgICAgICAoV2ViQ29yZTo6U3dlZXBEYXRhOjpTd2VlcEV2ZW50OjplbnRyeSk6
CisgICAgICAgIChXZWJDb3JlOjpTd2VlcERhdGE6OlN3ZWVwRXZlbnQ6OmludGVydmFsKToKKyAg
ICAgICAgKFdlYkNvcmU6OlN3ZWVwRGF0YTo6U3dlZXBFdmVudDo6b3BlcmF0b3I8KToKKyAgICAg
ICAgKFdlYkNvcmU6OlN3ZWVwRGF0YTo6dHJpYW5nbGVzT3ZlcmxhcCk6CisgICAgICAgIChXZWJD
b3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29yOjpzdWJkaXZpZGVDdXJ2ZXMpOgorICAgICAgICAo
V2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3Nvcjo6Y29uZGl0aW9uYWxseVN1YmRpdmlkZSk6
CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29yOjpzdWJkaXZpZGVDdXJ2
ZXNTbG93KToKKyAgICAgICAgKFdlYkNvcmU6OlRlc3NlbGxhdGlvblN0YXRlOjp2ZXJ0ZXhDYWxs
YmFjayk6CisgICAgICAgIChXZWJDb3JlOjpUZXNzZWxsYXRpb25TdGF0ZTo6Y29tYmluZUNhbGxi
YWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlRlc3NlbGxhdGlvblN0YXRlOjplZGdlRmxhZ0NhbGxi
YWNrKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhQcm9jZXNzb3I6OnRlc3NlbGxh
dGVJbnRlcmlvcik6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BCbGlublBh
dGhQcm9jZXNzb3IuaDogQWRkZWQuCisKIDIwMTEtMDItMDggIFNhbSBXZWluaWcgIDxzYW1Ad2Vi
a2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBNYWNpZWogU3RhY2hvd2lhay4KSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5QYXRoUHJvY2Vz
c29yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9n
cHUvTG9vcEJsaW5uUGF0aFByb2Nlc3Nvci5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uUGF0aFByb2Nlc3Nvci5jcHAJKHJl
dmlzaW9uIDApCkBAIC0wLDAgKzEsMTIyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBH
b29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
ICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMg
IkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisg
KiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KworI2luY2x1ZGUgIkxvb3BCbGlublBhdGhQcm9jZXNzb3IuaCIKKworI2luY2x1ZGUgIkZsb2F0
UG9pbnQuaCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJMb29wQmxpbm5DbGFz
c2lmaWVyLmgiCisjaW5jbHVkZSAiTG9vcEJsaW5uQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAiTG9v
cEJsaW5uTG9jYWxUcmlhbmd1bGF0b3IuaCIKKyNpbmNsdWRlICJMb29wQmxpbm5NYXRoVXRpbHMu
aCIKKyNpbmNsdWRlICJMb29wQmxpbm5QYXRoQ2FjaGUuaCIKKyNpbmNsdWRlICJMb29wQmxpbm5U
ZXh0dXJlQ29vcmRzLmgiCisjaW5jbHVkZSAiUE9EQXJlbmEuaCIKKyNpbmNsdWRlICJQT0RJbnRl
cnZhbFRyZWUuaCIKKyNpbmNsdWRlICJQYXRoLmgiCisjaW5jbHVkZSAiaW50ZXJuYWxfZ2x1Lmgi
CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CisjaW5j
bHVkZSA8d3RmL0Zhc3RNYWxsb2MuaD4KKworI2lmIFBMQVRGT1JNKFNLSUEpCisjaW5jbHVkZSAi
U2tHZW9tZXRyeS5oIgorI2luY2x1ZGUgIlNrUGF0aC5oIgorI2luY2x1ZGUgIlNrU2NhbGFyLmgi
CisjZWxzZQorLy8gTXVzdCBwb3J0IHRvIHlvdXIgcGxhdGZvcm0uCisjZW5kaWYKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCit1c2luZyBMb29wQmxpbm5NYXRoVXRpbHM6OlhSYXk7Cit1c2luZyBM
b29wQmxpbm5NYXRoVXRpbHM6OmNob3BDdWJpY0F0OwordXNpbmcgTG9vcEJsaW5uTWF0aFV0aWxz
OjpudW1YUmF5Q3Jvc3NpbmdzRm9yQ3ViaWM7Cit1c2luZyBMb29wQmxpbm5NYXRoVXRpbHM6OnRy
aWFuZ2xlc092ZXJsYXA7Cit1c2luZyBMb29wQmxpbm5NYXRoVXRpbHM6OnhSYXlDcm9zc2VzTGlu
ZTsKK3VzaW5nIExvb3BCbGlublBhdGhQcm9jZXNzb3JJbXBsZW1lbnRhdGlvbjo6Q29udG91cjsK
K3VzaW5nIExvb3BCbGlublBhdGhQcm9jZXNzb3JJbXBsZW1lbnRhdGlvbjo6U2VnbWVudDsKKwor
bmFtZXNwYWNlIHsKKworI2lmbmRlZiBOREVCVUcKK1N0cmluZyB2YWx1ZVRvU3RyaW5nKGNvbnN0
IEZsb2F0UmVjdCYgYXJnKQoreworICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlcjsKKyAgICBidWls
ZGVyLmFwcGVuZCgiW0Zsb2F0UmVjdCB4PSIpOworICAgIGJ1aWxkZXIuYXBwZW5kKFN0cmluZzo6
bnVtYmVyKGFyZy54KCkpKTsKKyAgICBidWlsZGVyLmFwcGVuZCgiIHk9Iik7CisgICAgYnVpbGRl
ci5hcHBlbmQoU3RyaW5nOjpudW1iZXIoYXJnLnkoKSkpOworICAgIGJ1aWxkZXIuYXBwZW5kKCIg
bWF4WD0iKTsKKyAgICBidWlsZGVyLmFwcGVuZChTdHJpbmc6Om51bWJlcihhcmcubWF4WCgpKSk7
CisgICAgYnVpbGRlci5hcHBlbmQoIiBtYXhZPSIpOworICAgIGJ1aWxkZXIuYXBwZW5kKFN0cmlu
Zzo6bnVtYmVyKGFyZy5tYXhZKCkpKTsKKyAgICBidWlsZGVyLmFwcGVuZCgiXSIpOworICAgIHJl
dHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Cit9CisjZW5kaWYKKworc3RydWN0IFN3ZWVwRGF0YTsK
KworfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK25hbWVzcGFjZSBMb29wQmxpbm5QYXRoUHJv
Y2Vzc29ySW1wbGVtZW50YXRpb24geworY2xhc3MgU2VnbWVudDsKK30KKworI2lmbmRlZiBOREVC
VUcKKy8vIFJvdXRpbmVzIG5lZWRlZCB0byBwcmludCB0aGUgdHlwZXMgb2YgSW50ZXJ2YWxOb2Rl
cyB3ZSBpbnN0YW50aWF0ZQorLy8gaW4gdGhpcyBmaWxlLgordGVtcGxhdGUgPD4KK3N0cnVjdCBW
YWx1ZVRvU3RyaW5nPGZsb2F0PiB7CisgICAgc3RhdGljIFN0cmluZyBzdHJpbmcoY29uc3QgZmxv
YXQmIHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzo6bnVtYmVyKHZhbHVlKTsK
KyAgICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFZhbHVlVG9TdHJpbmc8U3dlZXBEYXRh
Kj4geworICAgIHN0YXRpYyBTdHJpbmcgc3RyaW5nKFN3ZWVwRGF0YSogY29uc3QmIHZhbHVlKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzo6Zm9ybWF0KCIweCVwIiwgdmFsdWUpOworICAg
IH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgVmFsdWVUb1N0cmluZzxMb29wQmxpbm5QYXRo
UHJvY2Vzc29ySW1wbGVtZW50YXRpb246OlNlZ21lbnQqPiB7CisgICAgc3RhdGljIFN0cmluZyBz
dHJpbmcoTG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpTZWdtZW50KiBjb25z
dCYgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gU3RyaW5nOjpmb3JtYXQoIjB4JXAiLCB2
YWx1ZSk7CisgICAgfQorfTsKKyNlbmRpZgorCituYW1lc3BhY2UgTG9vcEJsaW5uUGF0aFByb2Nl
c3NvckltcGxlbWVudGF0aW9uIHsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTZWdtZW50CisvLwor
CisvLyBEZXNjcmliZXMgYSBzZWdtZW50IG9mIHRoZSBwYXRoOiBlaXRoZXIgYSBjdWJpYyBvciBh
IGxpbmUgc2VnbWVudC4KKy8vIFRoZXNlIGFyZSBzdG9yZWQgaW4gYSBkb3VibHkgbGlua2VkIGxp
c3QgdG8gc3BlZWQgdXAgY3VydmUKKy8vIHN1YmRpdmlzaW9uLCB3aGljaCBvY2N1cnMgZHVlIHRv
IGVpdGhlciByZW5kZXJpbmcgYXJ0aWZhY3RzIGluIHRoZQorLy8gbG9vcCBjYXNlIG9yIGR1ZSB0
byBvdmVybGFwcGluZyB0cmlhbmdsZXMuCitjbGFzcyBTZWdtZW50IHsKKyAgICBXVEZfTUFLRV9O
T05DT1BZQUJMRShTZWdtZW50KTsKK3B1YmxpYzoKKyAgICBlbnVtIEtpbmQgeworICAgICAgICBD
dWJpYywKKyAgICAgICAgTGluZQorICAgIH07CisKKyAgICAvLyBOby1hcmd1bWVudCBjb25zdHJ1
Y3RvciBhbGxvd3MgY29uc3RydWN0aW9uIGJ5IHRoZSBQT0RBcmVuYSBjbGFzcy4KKyAgICBTZWdt
ZW50KCkKKyAgICAgICAgIDogbV9hcmVuYSgwKQorICAgICAgICAgLCBtX2tpbmQoQ3ViaWMpCisg
ICAgICAgICAsIG1fcHJldigwKQorICAgICAgICAgLCBtX25leHQoMCkKKyAgICAgICAgICwgbV9j
b250b3VyKDApCisgICAgICAgICAsIG1fdHJpYW5ndWxhdG9yKDApCisgICAgICAgICAsIG1fbWFy
a2VkRm9yU3ViZGl2aXNpb24oZmFsc2UpCisgICAgeworICAgIH0KKworICAgIC8vIEluaXRpYWxp
emVyIGZvciBjdWJpYyBjdXJ2ZSBzZWdtZW50cy4KKyAgICB2b2lkIHNldHVwKFBPREFyZW5hKiBh
cmVuYSwKKyAgICAgICAgICAgICAgIENvbnRvdXIqIGNvbnRvdXIsCisgICAgICAgICAgICAgICBG
bG9hdFBvaW50IGNwMCwKKyAgICAgICAgICAgICAgIEZsb2F0UG9pbnQgY3AxLAorICAgICAgICAg
ICAgICAgRmxvYXRQb2ludCBjcDIsCisgICAgICAgICAgICAgICBGbG9hdFBvaW50IGNwMykKKyAg
ICB7CisgICAgICAgIG1fYXJlbmEgPSBhcmVuYTsKKyAgICAgICAgbV9jb250b3VyID0gY29udG91
cjsKKyAgICAgICAgbV9raW5kID0gQ3ViaWM7CisgICAgICAgIG1fcG9pbnRzWzBdID0gY3AwOwor
ICAgICAgICBtX3BvaW50c1sxXSA9IGNwMTsKKyAgICAgICAgbV9wb2ludHNbMl0gPSBjcDI7Cisg
ICAgICAgIG1fcG9pbnRzWzNdID0gY3AzOworICAgICAgICBjb21wdXRlQm91bmRpbmdCb3goKTsK
KyAgICB9CisKKyAgICAvLyBJbml0aWFsaXplciBmb3IgbGluZSBzZWdtZW50cy4KKyAgICB2b2lk
IHNldHVwKFBPREFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgIENvbnRvdXIqIGNvbnRvdXIs
CisgICAgICAgICAgICAgICBGbG9hdFBvaW50IHAwLAorICAgICAgICAgICAgICAgRmxvYXRQb2lu
dCBwMSkKKyAgICB7CisgICAgICAgIG1fYXJlbmEgPSBhcmVuYTsKKyAgICAgICAgbV9jb250b3Vy
ID0gY29udG91cjsKKyAgICAgICAgbV9raW5kID0gTGluZTsKKyAgICAgICAgbV9wb2ludHNbMF0g
PSBwMDsKKyAgICAgICAgbV9wb2ludHNbMV0gPSBwMTsKKyAgICAgICAgY29tcHV0ZUJvdW5kaW5n
Qm94KCk7CisgICAgfQorCisgICAgS2luZCBraW5kKCkgY29uc3QgeyByZXR1cm4gbV9raW5kOyB9
CisKKyAgICAvLyBSZXR1cm5zIHRoZSBpJ3RoIGNvbnRyb2wgcG9pbnQsIDAgPD0gaSA8IDQuCisg
ICAgY29uc3QgRmxvYXRQb2ludCYgZ2V0UG9pbnQoaW50IGkpCisgICAgeworICAgICAgICBBU1NF
UlQoaSA+PSAwICYmIGkgPCA0KTsKKyAgICAgICAgcmV0dXJuIG1fcG9pbnRzW2ldOworICAgIH0K
KworICAgIFNlZ21lbnQqIG5leHQoKSBjb25zdCB7IHJldHVybiBtX25leHQ7IH0KKyAgICBTZWdt
ZW50KiBwcmV2KCkgY29uc3QgeyByZXR1cm4gbV9wcmV2OyB9CisKKyAgICB2b2lkIHNldE5leHQo
U2VnbWVudCogbmV4dCkgeyBtX25leHQgPSBuZXh0OyB9CisgICAgdm9pZCBzZXRQcmV2KFNlZ21l
bnQqIHByZXYpIHsgbV9wcmV2ID0gcHJldjsgfQorCisgICAgLy8gVGhlIGNvbnRvdXIgdGhpcyBz
ZWdtZW50IGJlbG9uZ3MgdG8uCisgICAgQ29udG91ciogY29udG91cigpIGNvbnN0IHsgcmV0dXJu
IG1fY29udG91cjsgfQorCisgICAgLy8gU3ViZGl2aWRlcyB0aGUgY3VycmVudCBzZWdtZW50IGF0
IHRoZSBnaXZlbiBwYXJhbWV0ZXIgdmFsdWUgKDAgPD0KKyAgICAvLyB0IDw9IDEpIGFuZCByZXBs
YWNlcyBpdCB3aXRoIHRoZSB0d28gbmV3bHkgY3JlYXRlZCBTZWdtZW50cyBpbgorICAgIC8vIHRo
ZSBsaW5rZWQgbGlzdCwgaWYgcG9zc2libGUuIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBsZWZ0
bW9zdAorICAgIC8vIFNlZ21lbnQuCisgICAgU2VnbWVudCogc3ViZGl2aWRlKGZsb2F0IHBhcmFt
KQorICAgIHsKKyAgICAgICAgRmxvYXRQb2ludCBkc3RbN107CisgICAgICAgIGNob3BDdWJpY0F0
KG1fcG9pbnRzLCBkc3QsIHBhcmFtKTsKKyAgICAgICAgU2VnbWVudCogbGVmdCA9IG1fYXJlbmEt
PmFsbG9jYXRlT2JqZWN0PFNlZ21lbnQ+KCk7CisgICAgICAgIFNlZ21lbnQqIHJpZ2h0ID0gbV9h
cmVuYS0+YWxsb2NhdGVPYmplY3Q8U2VnbWVudD4oKTsKKyAgICAgICAgbGVmdC0+c2V0dXAobV9h
cmVuYSwgbV9jb250b3VyLCBkc3RbMF0sIGRzdFsxXSwgZHN0WzJdLCBkc3RbM10pOworICAgICAg
ICByaWdodC0+c2V0dXAobV9hcmVuYSwgbV9jb250b3VyLCBkc3RbM10sIGRzdFs0XSwgZHN0WzVd
LCBkc3RbNl0pOworICAgICAgICBsZWZ0LT5zZXROZXh0KHJpZ2h0KTsKKyAgICAgICAgcmlnaHQt
PnNldFByZXYobGVmdCk7CisgICAgICAgIC8vIFRyeSB0byBzZXQgdXAgYSBsaW5rIGJldHdlZW4g
InRoaXMtPnByZXYoKSIgYW5kICJsZWZ0Ii4KKyAgICAgICAgaWYgKHByZXYoKSkgeworICAgICAg
ICAgICAgbGVmdC0+c2V0UHJldihwcmV2KCkpOworICAgICAgICAgICAgcHJldigpLT5zZXROZXh0
KGxlZnQpOworICAgICAgICB9CisgICAgICAgIC8vIFRyeSB0byBzZXQgdXAgYSBsaW5rIGJldHdl
ZW4gInRoaXMtPm5leHQoKSIgYW5kICJyaWdodCIuCisgICAgICAgIFNlZ21lbnQqIG4gPSBuZXh0
KCk7CisgICAgICAgIGlmIChuKSB7CisgICAgICAgICAgICByaWdodC0+c2V0TmV4dChuKTsKKyAg
ICAgICAgICAgIG4tPnNldFByZXYocmlnaHQpOworICAgICAgICB9CisgICAgICAgIC8vIFNldCB1
cCBhIGxpbmsgYmV0d2VlbiAidGhpcyIgYW5kICJsZWZ0IjsgdGhpcyBpcyBvbmx5IHRvCisgICAg
ICAgIC8vIHByb3ZpZGUgYSBjZXJ0YWluIGFtb3VudCBvZiBjb250aW51aXR5IGR1cmluZyBmb3J3
YXJkIGl0ZXJhdGlvbi4KKyAgICAgICAgc2V0TmV4dChsZWZ0KTsKKyAgICAgICAgcmV0dXJuIGxl
ZnQ7CisgICAgfQorCisgICAgLy8gU3ViZGl2aWRlcyB0aGUgY3VycmVudCBzZWdtZW50IGF0IHRo
ZSBoYWxmd2F5IHBvaW50IGFuZCByZXBsYWNlcworICAgIC8vIGl0IHdpdGggdGhlIHR3byBuZXds
eSBjcmVhdGVkIFNlZ21lbnRzIGluIHRoZSBsaW5rZWQgbGlzdCwgaWYKKyAgICAvLyBwb3NzaWJs
ZS4gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGxlZnRtb3N0IFNlZ21lbnQuCisgICAgU2VnbWVu
dCogc3ViZGl2aWRlKCkgeyByZXR1cm4gc3ViZGl2aWRlKDAuNWYpOyB9CisKKyAgICBjb25zdCBG
bG9hdFJlY3QmIGJvdW5kaW5nQm94KCkgY29uc3QgeyByZXR1cm4gbV9ib3VuZGluZ0JveDsgfQor
CisgICAgLy8gQ29tcHV0ZXMgdGhlIG51bWJlciBvZiB0aW1lcyBhIHF1ZXJ5IGxpbmUgc3RhcnRp
bmcgYXQgdGhlIGdpdmVuCisgICAgLy8gcG9pbnQgYW5kIGV4dGVuZGluZyB0byB4PStpbmZpbml0
eSBjcm9zc2VzIHRoaXMgc2VnbWVudC4gT3V0Z29pbmcKKyAgICAvLyAiYW1iaWd1b3VzIiBhcmd1
bWVudCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgcXVlcnkgaW50ZXJzZWN0ZWQgYW4KKyAgICAvLyBl
bmRwb2ludCBvciB0YW5nZW50IHBvaW50IG9mIHRoZSBzZWdtZW50LCBpbmRpY2F0aW5nIHRoYXQg
YW5vdGhlcgorICAgIC8vIHF1ZXJ5IHBvaW50IGlzIHByZWZlcnJlZC4KKyAgICBpbnQgbnVtQ3Jv
c3NpbmdzRm9yWFJheShjb25zdCBYUmF5JiB4UmF5LCBib29sJiBhbWJpZ3VvdXMpIGNvbnN0Cisg
ICAgeworICAgICAgICBpZiAobV9raW5kID09IEN1YmljKQorICAgICAgICAgICAgLy8gU2hvdWxk
IGNvbnNpZGVyIGNhY2hpbmcgdGhlIG1vbm90b25pYyBjdWJpY3MuCisgICAgICAgICAgICByZXR1
cm4gbnVtWFJheUNyb3NzaW5nc0ZvckN1YmljKHhSYXksIG1fcG9pbnRzLCBhbWJpZ3VvdXMpOwor
CisgICAgICAgIHJldHVybiB4UmF5Q3Jvc3Nlc0xpbmUoeFJheSwgbV9wb2ludHMsIGFtYmlndW91
cykgPyAxIDogMDsKKyAgICB9CisKKyAgICAvLyBQZXJmb3JtcyBhIGxvY2FsIHRyaWFuZ3VsYXRp
b24gb2YgdGhlIGNvbnRyb2wgcG9pbnRzIGluIHRoaXMKKyAgICAvLyBzZWdtZW50LiBUaGlzIG9w
ZXJhdGlvbiBvbmx5IG1ha2VzIHNlbnNlIGZvciBjdWJpYyB0eXBlIHNlZ21lbnRzLgorICAgIC8v
IHRleENvb3JkcyBtYXkgYmUgbnVsbCB3aGVuIHRoZSBrbG0gY29vcmRpbmF0ZXMgaGF2ZSBub3Qg
YmVlbgorICAgIC8vIGNvbXB1dGVkIHlldC4KKyAgICB2b2lkIHRyaWFuZ3VsYXRlKExvb3BCbGlu
bkxvY2FsVHJpYW5ndWxhdG9yOjpJbnNpZGVFZGdlQ29tcHV0YXRpb24gY29tcHV0ZUluc2lkZUVk
Z2VzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcEJsaW5uVGV4dHVyZUNvb3Jkczo6
UmVzdWx0KiB0ZXhDb29yZHMpOworCisgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbnRy
b2wgcG9pbnQgdHJpYW5nbGVzIGFzc29jaWF0ZWQgd2l0aAorICAgIC8vIHRoaXMgc2VnbWVudC4K
KyAgICBpbnQgbnVtYmVyT2ZUcmlhbmdsZXMoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKCFt
X3RyaWFuZ3VsYXRvcikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gbV90
cmlhbmd1bGF0b3ItPm51bWJlck9mVHJpYW5nbGVzKCk7CisgICAgfQorCisgICAgLy8gRmV0Y2hl
cyB0aGUgZ2l2ZW4gY29udHJvbCBwb2ludCB0cmlhbmdsZSBmb3IgdGhpcyBzZWdtZW50LgorICAg
IExvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpUcmlhbmdsZSogZ2V0VHJpYW5nbGUoaW50IGlu
ZGV4KQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fdHJpYW5ndWxhdG9yKTsKKyAgICAgICAgcmV0
dXJuIG1fdHJpYW5ndWxhdG9yLT5nZXRUcmlhbmdsZShpbmRleCk7CisgICAgfQorCisgICAgLy8g
TnVtYmVyIG9mIHZlcnRpY2VzIGFsb25nIHRoZSBpbnNpZGUgZWRnZSBvZiB0aGlzIHNlZ21lbnQu
IFRoaXMKKyAgICAvLyBjYW4gYmUgY2FsbGVkIGVpdGhlciBmb3IgbGluZSBvciBjdWJpYyB0eXBl
IHNlZ21lbnRzLgorICAgIGludCBudW1iZXJPZkludGVyaW9yVmVydGljZXMoKSBjb25zdAorICAg
IHsKKyAgICAgICAgaWYgKG1fa2luZCA9PSBDdWJpYykgeworICAgICAgICAgICAgaWYgKG1fdHJp
YW5ndWxhdG9yKQorICAgICAgICAgICAgICAgIHJldHVybiBtX3RyaWFuZ3VsYXRvci0+bnVtYmVy
T2ZJbnRlcmlvclZlcnRpY2VzKCk7CisKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9
CisKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorCisgICAgLy8gUmV0dXJucyB0aGUgZ2l2ZW4g
aW50ZXJpb3IgdmVydGV4LCAwIDw9IGluZGV4IDwgbnVtYmVyT2ZJbnRlcmlvclZlcnRpY2VzKCku
CisgICAgRmxvYXRQb2ludCBnZXRJbnRlcmlvclZlcnRleChpbnQgaW5kZXgpIGNvbnN0CisgICAg
eworICAgICAgICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IG51bWJlck9mSW50ZXJpb3JW
ZXJ0aWNlcygpKTsKKyAgICAgICAgaWYgKG1fa2luZCA9PSBDdWJpYykgeworICAgICAgICAgICAg
RmxvYXRQb2ludCByZXM7CisgICAgICAgICAgICBpZiAobV90cmlhbmd1bGF0b3IpIHsKKyAgICAg
ICAgICAgICAgICBMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6VmVydGV4KiB2ZXJ0ZXggPSBt
X3RyaWFuZ3VsYXRvci0+Z2V0SW50ZXJpb3JWZXJ0ZXgoaW5kZXgpOworICAgICAgICAgICAgICAg
IGlmICh2ZXJ0ZXgpCisgICAgICAgICAgICAgICAgICAgIHJlcy5zZXQodmVydGV4LT54eUNvb3Jk
aW5hdGVzKCkueCgpLCB2ZXJ0ZXgtPnh5Q29vcmRpbmF0ZXMoKS55KCkpOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBt
X3BvaW50c1tpbmRleF07CisgICAgfQorCisgICAgLy8gU3RhdGUgdG8gYXNzaXN0IHdpdGggY3Vy
dmUgc3ViZGl2aXNpb24uCisgICAgYm9vbCBtYXJrZWRGb3JTdWJkaXZpc2lvbigpIGNvbnN0IHsg
cmV0dXJuIG1fbWFya2VkRm9yU3ViZGl2aXNpb247IH0KKyAgICB2b2lkIHNldE1hcmtlZEZvclN1
YmRpdmlzaW9uKGJvb2wgbWFya2VkRm9yU3ViZGl2aXNpb24pIHsgbV9tYXJrZWRGb3JTdWJkaXZp
c2lvbiA9IG1hcmtlZEZvclN1YmRpdmlzaW9uOyB9CisKKyNpZm5kZWYgTkRFQlVHCisgICAgLy8g
U3VwcHBvcnQgZm9yIHByaW50aW5nIFNlZ21lbnRzLgorICAgIFN0cmluZyB0b1N0cmluZygpIGNv
bnN0CisgICAgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXI7CisgICAgICAgIGJ1aWxk
ZXIuYXBwZW5kKCJbU2VnbWVudCBraW5kPSIpOworICAgICAgICBidWlsZGVyLmFwcGVuZChraW5k
KCkgPT0gTGluZSA/ICJsaW5lIiA6ICJjdWJpYyIpOworICAgICAgICBidWlsZGVyLmFwcGVuZCgi
IGJvdW5kaW5nQm94PSIpOworICAgICAgICBidWlsZGVyLmFwcGVuZCh2YWx1ZVRvU3RyaW5nKGJv
dW5kaW5nQm94KCkpKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIiBjb250b3VyPTB4Iik7Cisg
ICAgICAgIGJ1aWxkZXIuYXBwZW5kKFN0cmluZzo6Zm9ybWF0KCIlcCIsIGNvbnRvdXIoKSkpOwor
ICAgICAgICBidWlsZGVyLmFwcGVuZCgiIG1hcmtlZEZvclN1YmRpdmlzaW9uPSIpOworICAgICAg
ICBidWlsZGVyLmFwcGVuZChtYXJrZWRGb3JTdWJkaXZpc2lvbigpID8gInRydWUiIDogImZhbHNl
Iik7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiBidWlsZGVy
LnRvU3RyaW5nKCk7CisgICAgfQorI2VuZGlmCisKKyBwcml2YXRlOgorICAgIC8vIENvbXB1dGVz
IHRoZSBib3VuZGluZyBib3ggb2YgdGhpcyBTZWdtZW50LgorICAgIHZvaWQgY29tcHV0ZUJvdW5k
aW5nQm94KCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAobV9raW5kKSB7CisgICAgICAgIGNhc2Ug
Q3ViaWM6CisgICAgICAgICAgICBtX2JvdW5kaW5nQm94LmZpdFRvUG9pbnRzKG1fcG9pbnRzWzBd
LCBtX3BvaW50c1sxXSwgbV9wb2ludHNbMl0sIG1fcG9pbnRzWzNdKTsKKyAgICAgICAgICAgIGJy
ZWFrOworCisgICAgICAgIGNhc2UgTGluZToKKyAgICAgICAgICAgIG1fYm91bmRpbmdCb3guZml0
VG9Qb2ludHMobV9wb2ludHNbMF0sIG1fcG9pbnRzWzFdKTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICB9CisgICAgfQorCisgICAgUE9EQXJlbmEqIG1fYXJlbmE7CisgICAgS2luZCBtX2tp
bmQ7CisgICAgRmxvYXRQb2ludCBtX3BvaW50c1s0XTsKKyAgICBTZWdtZW50KiBtX3ByZXY7Cisg
ICAgU2VnbWVudCogbV9uZXh0OworICAgIENvbnRvdXIqIG1fY29udG91cjsKKyAgICBGbG9hdFJl
Y3QgbV9ib3VuZGluZ0JveDsKKyAgICBMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvciogbV90cmlh
bmd1bGF0b3I7CisgICAgYm9vbCBtX21hcmtlZEZvclN1YmRpdmlzaW9uOworfTsKKworLy8tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCisvLyBDb250b3VyCisvLworCisvLyBEZXNjcmliZXMgYSBjbG9zZWQgY29udG91
ciBvZiB0aGUgcGF0aC4KK2NsYXNzIENvbnRvdXIgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxF
KENvbnRvdXIpOworcHVibGljOgorICAgIENvbnRvdXIoKQorICAgIHsKKyAgICAgICAgbV9maXJz
dCA9ICZtX3NlbnRpbmVsOworICAgICAgICBtX2ZpcnN0LT5zZXROZXh0KG1fZmlyc3QpOworICAg
ICAgICBtX2ZpcnN0LT5zZXRQcmV2KG1fZmlyc3QpOworICAgICAgICBtX2lzT3JpZW50ZWRDb3Vu
dGVyQ2xvY2t3aXNlID0gdHJ1ZTsKKyAgICAgICAgbV9ib3VuZGluZ0JveERpcnR5ID0gZmFsc2U7
CisgICAgICAgIG1fZmlsbFNpZGUgPSBMb29wQmxpbm5Db25zdGFudHM6OlJpZ2h0U2lkZTsKKyAg
ICB9CisKKyAgICB2b2lkIGFkZChTZWdtZW50KiBzZWdtZW50KQorICAgIHsKKyAgICAgICAgaWYg
KG1fZmlyc3QgPT0gJm1fc2VudGluZWwpIHsKKyAgICAgICAgICAgIC8vIEZpcnN0IGVsZW1lbnQg
aXMgdGhlIHNlbnRpbmVsLiBSZXBsYWNlIGl0IHdpdGggdGhlIGluY29taW5nCisgICAgICAgICAg
ICAvLyBzZWdtZW50LgorICAgICAgICAgICAgc2VnbWVudC0+c2V0TmV4dChtX2ZpcnN0KTsKKyAg
ICAgICAgICAgIHNlZ21lbnQtPnNldFByZXYobV9maXJzdCk7CisgICAgICAgICAgICBtX2ZpcnN0
LT5zZXROZXh0KHNlZ21lbnQpOworICAgICAgICAgICAgbV9maXJzdC0+c2V0UHJldihzZWdtZW50
KTsKKyAgICAgICAgICAgIG1fZmlyc3QgPSBzZWdtZW50OworICAgICAgICB9IGVsc2UgeworICAg
ICAgICAgICAgLy8gbV9maXJzdC0+cHJldigpIGlzIHRoZSBzZW50aW5lbC4KKyAgICAgICAgICAg
IEFTU0VSVChtX2ZpcnN0LT5wcmV2KCkgPT0gJm1fc2VudGluZWwpOworICAgICAgICAgICAgU2Vn
bWVudCogbGFzdCA9IG1fc2VudGluZWwucHJldigpOworICAgICAgICAgICAgbGFzdC0+c2V0TmV4
dChzZWdtZW50KTsKKyAgICAgICAgICAgIHNlZ21lbnQtPnNldFByZXYobGFzdCk7CisgICAgICAg
ICAgICBzZWdtZW50LT5zZXROZXh0KCZtX3NlbnRpbmVsKTsKKyAgICAgICAgICAgIG1fc2VudGlu
ZWwuc2V0UHJldihzZWdtZW50KTsKKyAgICAgICAgfQorICAgICAgICBtX2JvdW5kaW5nQm94RGly
dHkgPSB0cnVlOworICAgIH0KKworICAgIC8vIFN1YmRpdmlkZXMgdGhlIGdpdmVuIHNlZ21lbnQg
YXQgdGhlIGdpdmVuIHBhcmFtZXRyaWMgdmFsdWUuCisgICAgLy8gUmV0dXJucyBhIHBvaW50ZXIg
dG8gdGhlIGZpcnN0IG9mIHRoZSB0d28gcG9ydGlvbnMgb2YgdGhlCisgICAgLy8gc3ViZGl2aWRl
ZCBzZWdtZW50LgorICAgIFNlZ21lbnQqIHN1YmRpdmlkZShTZWdtZW50KiBzZWdtZW50LCBmbG9h
dCBwYXJhbSkKKyAgICB7CisgICAgICAgIFNlZ21lbnQqIGxlZnQgPSBzZWdtZW50LT5zdWJkaXZp
ZGUocGFyYW0pOworICAgICAgICBpZiAobV9maXJzdCA9PSBzZWdtZW50KQorICAgICAgICAgICAg
bV9maXJzdCA9IGxlZnQ7CisgICAgICAgIHJldHVybiBsZWZ0OworICAgIH0KKworICAgIC8vIFN1
YmRpdmlkZXMgdGhlIGdpdmVuIHNlZ21lbnQgYXQgdGhlIGhhbGZ3YXkgcG9pbnQuIFJldHVybnMg
YQorICAgIC8vIHBvaW50ZXIgdG8gdGhlIGZpcnN0IG9mIHRoZSB0d28gcG9ydGlvbnMgb2YgdGhl
IHN1YmRpdmlkZWQKKyAgICAvLyBzZWdtZW50LgorICAgIFNlZ21lbnQqIHN1YmRpdmlkZShTZWdt
ZW50KiBzZWdtZW50KQorICAgIHsKKyAgICAgICAgU2VnbWVudCogbGVmdCA9IHNlZ21lbnQtPnN1
YmRpdmlkZSgpOworICAgICAgICBpZiAobV9maXJzdCA9PSBzZWdtZW50KQorICAgICAgICAgICAg
bV9maXJzdCA9IGxlZnQ7CisgICAgICAgIHJldHVybiBsZWZ0OworICAgIH0KKworICAgIC8vIFJl
dHVybnMgdGhlIGZpcnN0IHNlZ21lbnQgaW4gdGhlIGNvbnRvdXIgZm9yIGl0ZXJhdGlvbi4KKyAg
ICBTZWdtZW50KiBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fZmlyc3Q7IH0KKworICAgIC8vIFJl
dHVybnMgdGhlIGxhc3Qgc2VnbWVudCBpbiB0aGUgY29udG91ciBmb3IgaXRlcmF0aW9uLiBDYWxs
ZXJzCisgICAgLy8gc2hvdWxkIG5vdCBpdGVyYXRlIG92ZXIgdGhpcyBzZWdtZW50LiBJbiBvdGhl
ciB3b3JkczoKKyAgICAvLyAgZm9yIChTZWdtZW50KiBjdXIgPSBjb250b3VyLT5iZWdpbigpOwor
ICAgIC8vICAgICAgIGN1ciAhPSBjb250b3VyLT5lbmQoKTsKKyAgICAvLyAgICAgICBjdXIgPSBj
dXItPm5leHQoKSkgeworICAgIC8vICAgIC8vIC4uIHByb2Nlc3MgY3VyIC4uLgorICAgIC8vICB9
CisgICAgU2VnbWVudCogZW5kKCkKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2ZpcnN0LT5wcmV2
KCkgPT0gJm1fc2VudGluZWwpOworICAgICAgICByZXR1cm4gJm1fc2VudGluZWw7CisgICAgfQor
CisgICAgYm9vbCBpc09yaWVudGVkQ291bnRlckNsb2Nrd2lzZSgpIGNvbnN0IHsgcmV0dXJuIG1f
aXNPcmllbnRlZENvdW50ZXJDbG9ja3dpc2U7IH0KKyAgICB2b2lkIHNldElzT3JpZW50ZWRDb3Vu
dGVyQ2xvY2t3aXNlKGJvb2wgaXNPcmllbnRlZENvdW50ZXJDbG9ja3dpc2UpIHsgbV9pc09yaWVu
dGVkQ291bnRlckNsb2Nrd2lzZSA9IGlzT3JpZW50ZWRDb3VudGVyQ2xvY2t3aXNlOyB9CisKKyAg
ICBjb25zdCBGbG9hdFJlY3QmIGJvdW5kaW5nQm94KCkKKyAgICB7CisgICAgICAgIGlmIChtX2Jv
dW5kaW5nQm94RGlydHkpIHsKKyAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAg
ICAgICAgZm9yIChTZWdtZW50KiBjdXIgPSBiZWdpbigpOyBjdXIgIT0gZW5kKCk7IGN1ciA9IGN1
ci0+bmV4dCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAg
ICAgICBtX2JvdW5kaW5nQm94ID0gY3VyLT5ib3VuZGluZ0JveCgpOworICAgICAgICAgICAgICAg
IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbV9ib3VuZGluZ0JveC51bml0ZShjdXItPmJvdW5k
aW5nQm94KCkpOworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIG1fYm91bmRpbmdCb3hEaXJ0eSA9IGZhbHNlOworICAgICAgICB9Cisg
ICAgICAgIHJldHVybiBtX2JvdW5kaW5nQm94OworICAgIH0KKworICAgIC8vIFJldHVybnMgd2hp
Y2ggc2lkZSBvZiB0aGlzIGNvbnRvdXIgaXMgZmlsbGVkLgorICAgIExvb3BCbGlubkNvbnN0YW50
czo6RmlsbFNpZGUgZmlsbFNpZGUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fZmls
bFNpZGU7CisgICAgfQorCisgICAgdm9pZCBzZXRGaWxsU2lkZShMb29wQmxpbm5Db25zdGFudHM6
OkZpbGxTaWRlIGZpbGxTaWRlKQorICAgIHsKKyAgICAgICAgbV9maWxsU2lkZSA9IGZpbGxTaWRl
OworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLyBUaGUgc3RhcnQgb2YgdGhlIHNlZ21lbnQgY2hh
aW4uIFRoZSBzZWdtZW50cyBhcmUga2VwdCBpbiBhCisgICAgLy8gY2lyY3VsYXIgZG91Ymx5IGxp
bmtlZCBsaXN0IGZvciByYXBpZCBhY2Nlc3MgdG8gdGhlIGJlZ2lubmluZyBhbmQKKyAgICAvLyBl
bmQuCisgICAgU2VnbWVudCogbV9maXJzdDsKKworICAgIC8vIFRoZSBzZW50aW5lbCBlbGVtZW50
IGF0IHRoZSBlbmQgb2YgdGhlIGNoYWluLCBuZWVkZWQgZm9yCisgICAgLy8gcmVhc29uYWJsZSBp
dGVyYXRpb24gc2VtYW50aWNzLgorICAgIFNlZ21lbnQgbV9zZW50aW5lbDsKKworICAgIGJvb2wg
bV9pc09yaWVudGVkQ291bnRlckNsb2Nrd2lzZTsKKworICAgIEZsb2F0UmVjdCBtX2JvdW5kaW5n
Qm94OworICAgIGJvb2wgbV9ib3VuZGluZ0JveERpcnR5OworCisgICAgLy8gV2hpY2ggc2lkZSBv
ZiB0aGlzIGNvbnRvdXIgc2hvdWxkIGJlIGZpbGxlZC4KKyAgICBMb29wQmxpbm5Db25zdGFudHM6
OkZpbGxTaWRlIG1fZmlsbFNpZGU7Cit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNlZ21lbnQK
Ky8vCisKKy8vIERlZmluaXRpb24gb2YgU2VnbWVudDo6dHJpYW5ndWxhdGUoKSwgd2hpY2ggbXVz
dCBjb21lIGFmdGVyCisvLyBkZWNsYXJhdGlvbiBvZiBDb250b3VyLgordm9pZCBTZWdtZW50Ojp0
cmlhbmd1bGF0ZShMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6SW5zaWRlRWRnZUNvbXB1dGF0
aW9uIGNvbXB1dGVJbnNpZGVFZGdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg
TG9vcEJsaW5uVGV4dHVyZUNvb3Jkczo6UmVzdWx0KiB0ZXhDb29yZHMpCit7CisgICAgQVNTRVJU
KG1fa2luZCA9PSBDdWJpYyk7CisgICAgaWYgKCFtX3RyaWFuZ3VsYXRvcikKKyAgICAgICAgbV90
cmlhbmd1bGF0b3IgPSBtX2FyZW5hLT5hbGxvY2F0ZU9iamVjdDxMb29wQmxpbm5Mb2NhbFRyaWFu
Z3VsYXRvcj4oKTsKKyAgICBtX3RyaWFuZ3VsYXRvci0+cmVzZXQoKTsKKyAgICBmb3IgKGludCBp
ID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6
VmVydGV4KiB2ZXJ0ZXggPSBtX3RyaWFuZ3VsYXRvci0+Z2V0VmVydGV4KGkpOworICAgICAgICBp
ZiAodGV4Q29vcmRzKSB7CisgICAgICAgICAgICB2ZXJ0ZXgtPnNldChnZXRQb2ludChpKS54KCks
CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRQb2ludChpKS55KCksCisgICAgICAgICAgICAg
ICAgICAgICAgICB0ZXhDb29yZHMtPmtsbUNvb3JkaW5hdGVzW2ldLngoKSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHRleENvb3Jkcy0+a2xtQ29vcmRpbmF0ZXNbaV0ueSgpLAorICAgICAgICAg
ICAgICAgICAgICAgICAgdGV4Q29vcmRzLT5rbG1Db29yZGluYXRlc1tpXS56KCkpOworICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgdmVydGV4LT5zZXQoZ2V0UG9pbnQoaSkueCgpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgZ2V0UG9pbnQoaSkueSgpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gTm8gdGV4dHVyZSBjb29yZGluYXRlcyB5ZXQKKyAgICAgICAgICAgICAgICAgICAg
ICAgIDAsIDAsIDApOworICAgICAgICB9CisgICAgfQorICAgIG1fdHJpYW5ndWxhdG9yLT50cmlh
bmd1bGF0ZShjb21wdXRlSW5zaWRlRWRnZXMsIGNvbnRvdXIoKS0+ZmlsbFNpZGUoKSk7Cit9CisK
K30gLy8gbmFtZXNwYWNlIExvb3BCbGlublBhdGhQcm9jZXNzb3JJbXBsZW1lbnRhdGlvbgorCisv
Ly0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KKy8vIExvb3BCbGlublBhdGhQcm9jZXNzb3IKKy8vCisKK0xvb3BCbGlu
blBhdGhQcm9jZXNzb3I6Okxvb3BCbGlublBhdGhQcm9jZXNzb3IoKQorICAgIDogbV9hcmVuYShQ
T0RBcmVuYTo6Y3JlYXRlKCkpCisjaWZuZGVmIE5ERUJVRworICAgICwgbV92ZXJib3NlTG9nZ2lu
ZyhmYWxzZSkKKyNlbmRpZgoreworfQorCitMb29wQmxpbm5QYXRoUHJvY2Vzc29yOjpMb29wQmxp
bm5QYXRoUHJvY2Vzc29yKFBhc3NSZWZQdHI8UE9EQXJlbmE+IGFyZW5hKQorICAgIDogbV9hcmVu
YShhcmVuYSkKKyNpZm5kZWYgTkRFQlVHCisgICAgLCBtX3ZlcmJvc2VMb2dnaW5nKGZhbHNlKQor
I2VuZGlmCit7Cit9CisKK0xvb3BCbGlublBhdGhQcm9jZXNzb3I6On5Mb29wQmxpbm5QYXRoUHJv
Y2Vzc29yKCkKK3sKK30KKwordm9pZCBMb29wQmxpbm5QYXRoUHJvY2Vzc29yOjpwcm9jZXNzKGNv
bnN0IFBhdGgmIHBhdGgsIExvb3BCbGlublBhdGhDYWNoZSYgY2FjaGUpCit7CisgICAgYnVpbGRD
b250b3VycyhwYXRoKTsKKworICAgIC8vIFJ1biBwbGFuZS1zd2VlcCBhbGdvcml0aG0gdG8gZGV0
ZXJtaW5lIG92ZXJsYXBzIG9mIGNvbnRyb2wgcG9pbnQKKyAgICAvLyBjdXJ2ZXMgYW5kIHN1YmRp
dmlkZSBjdXJ2ZXMgYXBwcm9wcmlhdGVseS4KKyAgICBzdWJkaXZpZGVDdXJ2ZXMoKTsKKworICAg
IC8vIERldGVybWluZSBvcmllbnRhdGlvbnMgb2YgY291bnRvdXJzLiBCYXNlZCBvbiBvcmllbnRh
dGlvbiBhbmQgdGhlCisgICAgLy8gbnVtYmVyIG9mIGN1cnZlIGNyb3NzaW5ncyBhdCBhIHJhbmRv
bSBwb2ludCBvbiB0aGUgY29udG91ciwKKyAgICAvLyBkZXRlcm1pbmUgd2hldGhlciB0byBmaWxs
IHRoZSBsZWZ0IG9yIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbnRvdXIuCisgICAgZGV0ZXJtaW5lU2lk
ZXNUb0ZpbGwoKTsKKworICAgIC8vIENsYXNzaWZ5IGN1cnZlcywgY29tcHV0ZSB0ZXh0dXJlIGNv
b3JkaW5hdGVzIGFuZCBzdWJkaXZpZGUgYXMKKyAgICAvLyBuZWNlc3NhcnkgdG8gZWxpbWluYXRl
IHJlbmRlcmluZyBhcnRpZmFjdHMuIERvIHRoZSBmaW5hbAorICAgIC8vIHRyaWFuZ3VsYXRpb24g
b2YgdGhlIGN1cnZlIHNlZ21lbnRzLCBkZXRlcm1pbmluZyB0aGUgcGF0aCBhbG9uZworICAgIC8v
IHRoZSBpbnRlcmlvciBvZiB0aGUgc2hhcGUuCisgICAgZm9yIChWZWN0b3I8Q29udG91cio+Ojpp
dGVyYXRvciBpdGVyID0gbV9jb250b3Vycy5iZWdpbigpOyBpdGVyICE9IG1fY29udG91cnMuZW5k
KCk7ICsraXRlcikgeworICAgICAgICBDb250b3VyKiBjdXIgPSAqaXRlcjsKKyAgICAgICAgZm9y
IChTZWdtZW50KiBzZWcgPSBjdXItPmJlZ2luKCk7IHNlZyAhPSBjdXItPmVuZCgpOyBzZWcgPSBz
ZWctPm5leHQoKSkgeworICAgICAgICAgICAgaWYgKHNlZy0+a2luZCgpID09IFNlZ21lbnQ6OkN1
YmljKSB7CisgICAgICAgICAgICAgICAgTG9vcEJsaW5uQ2xhc3NpZmllcjo6UmVzdWx0IGNsYXNz
aWZpY2F0aW9uID0gTG9vcEJsaW5uQ2xhc3NpZmllcjo6Y2xhc3NpZnkoc2VnLT5nZXRQb2ludCgw
KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWctPmdldFBvaW50KDEpLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZy0+Z2V0UG9pbnQoMiksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnLT5nZXRQb2ludCgzKSk7CisjaWZuZGVm
IE5ERUJVRworICAgICAgICAgICAgICAgIGlmIChtX3ZlcmJvc2VMb2dnaW5nKQorICAgICAgICAg
ICAgICAgICAgICBMT0dfRVJST1IoIkNsYXNzaWZpY2F0aW9uOiAlZCIsIChpbnQpIGNsYXNzaWZp
Y2F0aW9uLmN1cnZlVHlwZSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBMb29wQmxpbm5UZXh0
dXJlQ29vcmRzOjpSZXN1bHQgdGV4Q29vcmRzID0KKyAgICAgICAgICAgICAgICAgICAgTG9vcEJs
aW5uVGV4dHVyZUNvb3Jkczo6Y29tcHV0ZShjbGFzc2lmaWNhdGlvbiwgY3VyLT5maWxsU2lkZSgp
KTsKKyAgICAgICAgICAgICAgICBpZiAodGV4Q29vcmRzLmhhc1JlbmRlcmluZ0FydGlmYWN0KSB7
CisgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB0aGVyZSBpcyBhIHByb2JsZW0gd2hlcmUg
dGhlIGFsZ29yaXRobQorICAgICAgICAgICAgICAgICAgICAvLyBzb21ldGltZXMgZmFpbHMgdG8g
Y29udmVyZ2Ugd2hlbiBzcGxpdHRpbmcgYXQgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIHN1
YmRpdmlzaW9uIHBhcmFtZXRlciB2YWx1ZS4gRm9yIHRoZSB0aW1lIGJlaW5nLAorICAgICAgICAg
ICAgICAgICAgICAvLyBzcGxpdCBoYWxmd2F5LgorICAgICAgICAgICAgICAgICAgICBjdXItPnN1
YmRpdmlkZShzZWcpOworICAgICAgICAgICAgICAgICAgICAvLyBOZXh0IGl0ZXJhdGlvbiB3aWxs
IGhhbmRsZSB0aGUgbmV3bHkgc3ViZGl2aWRlZCBjdXJ2ZXMKKyAgICAgICAgICAgICAgICB9IGVs
c2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXRleENvb3Jkcy5pc0xpbmVPclBvaW50KSB7
CisgICAgICAgICAgICAgICAgICAgICAgICBzZWctPnRyaWFuZ3VsYXRlKExvb3BCbGlubkxvY2Fs
VHJpYW5ndWxhdG9yOjpDb21wdXRlSW5zaWRlRWRnZXMsICZ0ZXhDb29yZHMpOworICAgICAgICAg
ICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWctPm51bWJlck9mVHJpYW5nbGVz
KCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BCbGlubkxvY2FsVHJp
YW5ndWxhdG9yOjpUcmlhbmdsZSogdHJpYW5nbGUgPSBzZWctPmdldFRyaWFuZ2xlKGkpOworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgaisrKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9y
OjpWZXJ0ZXgqIHZlcnQgPSB0cmlhbmdsZS0+Z2V0VmVydGV4KGopOworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjYWNoZS5hZGRWZXJ0ZXgodmVydC0+eHlDb29yZGluYXRlcygpLngo
KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnQt
Pnh5Q29vcmRpbmF0ZXMoKS55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB2ZXJ0LT5rbG1Db29yZGluYXRlcygpLngoKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnQtPmtsbUNvb3JkaW5hdGVzKCku
eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVy
dC0+a2xtQ29vcmRpbmF0ZXMoKS56KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBMT09QX0JMSU5OX1BBVEhfQ0FDSEVf
REVCVUdfSU5URVJJT1JfRURHRVMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3cgdGhl
IGVuZCB1c2VyIHRoZSBpbnRlcmlvciBlZGdlcyBhcyB3ZWxsCisgICAgICAgICAgICAgICAgICAg
ICAgICBmb3IgKGludCBpID0gMTsgaSA8IHNlZy0+bnVtYmVyT2ZJbnRlcmlvclZlcnRpY2VzKCk7
IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb2F0UG9pbnQgdmVydCA9IHNl
Zy0+Z2V0SW50ZXJpb3JWZXJ0ZXgoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g
RHVwbGljYXRlIHByZXZpb3VzIHZlcnRleCB0byBiZSBhYmxlIHRvIGRyYXcgR0xfTElORVMKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBGbG9hdFBvaW50IHByZXYgPSBzZWctPmdldEludGVy
aW9yVmVydGV4KGkgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5hZGRJ
bnRlcmlvckVkZ2VWZXJ0ZXgocHJldi54KCksIHByZXYueSgpKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjYWNoZS5hZGRJbnRlcmlvckVkZ2VWZXJ0ZXgodmVydC54KCksIHZlcnQueSgp
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBMT09QX0JMSU5OX1BBVEhf
Q0FDSEVfREVCVUdfSU5URVJJT1JfRURHRVMKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJ1
biB0aGUgaW50ZXJpb3IgcGF0aHMgdGhyb3VnaCBhIHRlc3NlbGxhdGlvbiBhbGdvcml0aG0KKyAg
ICAvLyBzdXBwb3J0aW5nIG11bHRpcGxlIGNvbnRvdXJzLgorICAgIHRlc3NlbGxhdGVJbnRlcmlv
cihjYWNoZSk7Cit9CisKK3ZvaWQgTG9vcEJsaW5uUGF0aFByb2Nlc3Nvcjo6YnVpbGRDb250b3Vy
cyhjb25zdCBQYXRoJiBwYXRoKQoreworICAgIC8vIENsZWFyIG91dCB0aGUgY29udG91cnMKKyAg
ICBtX2NvbnRvdXJzLmNsZWFyKCk7CisjaWYgUExBVEZPUk0oU0tJQSkKKyAgICBTa1BhdGg6Okl0
ZXIgaXRlcigqcGF0aC5wbGF0Zm9ybVBhdGgoKSwgZmFsc2UpOworICAgIFNrUG9pbnQgcG9pbnRz
WzRdOworICAgIFNrUGF0aDo6VmVyYiB2ZXJiOworICAgIENvbnRvdXIqIGNvbnRvdXIgPSAwOwor
ICAgIFNrUG9pbnQgY3VyUG9pbnQgPSB7IDAgfTsKKyAgICBTa1BvaW50IG1vdmVUb1BvaW50ID0g
eyAwIH07CisgICAgZG8geworICAgICAgICB2ZXJiID0gaXRlci5uZXh0KHBvaW50cyk7CisgICAg
ICAgIGlmICh2ZXJiICE9IFNrUGF0aDo6a01vdmVfVmVyYikgeworICAgICAgICAgICAgaWYgKCFj
b250b3VyKSB7CisgICAgICAgICAgICAgICAgY29udG91ciA9IG1fYXJlbmEtPmFsbG9jYXRlT2Jq
ZWN0PENvbnRvdXI+KCk7CisgICAgICAgICAgICAgICAgbV9jb250b3Vycy5hcHBlbmQoY29udG91
cik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoICh2ZXJiKSB7Cisg
ICAgICAgIGNhc2UgU2tQYXRoOjprTW92ZV9WZXJiOiB7CisgICAgICAgICAgICBjb250b3VyID0g
bV9hcmVuYS0+YWxsb2NhdGVPYmplY3Q8Q29udG91cj4oKTsKKyAgICAgICAgICAgIG1fY29udG91
cnMuYXBwZW5kKGNvbnRvdXIpOworICAgICAgICAgICAgY3VyUG9pbnQgPSBwb2ludHNbMF07Cisg
ICAgICAgICAgICBtb3ZlVG9Qb2ludCA9IHBvaW50c1swXTsKKyNpZm5kZWYgTkRFQlVHCisgICAg
ICAgICAgICBpZiAobV92ZXJib3NlTG9nZ2luZykKKyAgICAgICAgICAgICAgICBMT0dfRVJST1Io
Ik1vdmVUbyAoJWYsICVmKSIsIHBvaW50c1swXS5mWCwgcG9pbnRzWzBdLmZZKTsKKyNlbmRpZgor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTa1BhdGg6OmtMaW5l
X1ZlcmI6IHsKKyAgICAgICAgICAgIFNlZ21lbnQqIHNlZ21lbnQgPSBtX2FyZW5hLT5hbGxvY2F0
ZU9iamVjdDxTZWdtZW50PigpOworICAgICAgICAgICAgaWYgKGl0ZXIuaXNDbG9zZUxpbmUoKSkg
eworICAgICAgICAgICAgICAgIHNlZ21lbnQtPnNldHVwKG1fYXJlbmEuZ2V0KCksIGNvbnRvdXIs
IGN1clBvaW50LCBwb2ludHNbMV0pOworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgICAgICAgICBp
ZiAobV92ZXJib3NlTG9nZ2luZykKKyAgICAgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJDbG9z
ZUxpbmVUbyAoJWYsICVmKSwgKCVmLCAlZikiLCBjdXJQb2ludC5mWCwgY3VyUG9pbnQuZlksIHBv
aW50c1sxXS5mWCwgcG9pbnRzWzFdLmZZKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGNvbnRv
dXItPmFkZChzZWdtZW50KTsKKyAgICAgICAgICAgICAgICBjb250b3VyID0gMDsKKyAgICAgICAg
ICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2VnbWVudC0+c2V0dXAobV9hcmVuYS5nZXQo
KSwgY29udG91ciwgcG9pbnRzWzBdLCBwb2ludHNbMV0pOworI2lmbmRlZiBOREVCVUcKKyAgICAg
ICAgICAgICAgICBpZiAobV92ZXJib3NlTG9nZ2luZykKKyAgICAgICAgICAgICAgICAgICAgTE9H
X0VSUk9SKCJMaW5lVG8gKCVmLCAlZiksICglZiwgJWYpIiwgcG9pbnRzWzBdLmZYLCBwb2ludHNb
MF0uZlksIHBvaW50c1sxXS5mWCwgcG9pbnRzWzFdLmZZKTsKKyNlbmRpZgorICAgICAgICAgICAg
ICAgIGNvbnRvdXItPmFkZChzZWdtZW50KTsKKyAgICAgICAgICAgICAgICBjdXJQb2ludCA9IHBv
aW50c1sxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cisg
ICAgICAgIGNhc2UgU2tQYXRoOjprUXVhZF9WZXJiOiB7CisgICAgICAgICAgICAvLyBOZWVkIHRv
IGRlZ3JlZSBlbGV2YXRlIHRoZSBxdWFkcmF0aWMgaW50byBhIGN1YmljCisgICAgICAgICAgICBT
a1BvaW50IGN1YmljWzRdOworICAgICAgICAgICAgU2tDb252ZXJ0UXVhZFRvQ3ViaWMocG9pbnRz
LCBjdWJpYyk7CisgICAgICAgICAgICBTZWdtZW50KiBzZWdtZW50ID0gbV9hcmVuYS0+YWxsb2Nh
dGVPYmplY3Q8U2VnbWVudD4oKTsKKyAgICAgICAgICAgIHNlZ21lbnQtPnNldHVwKG1fYXJlbmEu
Z2V0KCksIGNvbnRvdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjdWJpY1swXSwgY3Vi
aWNbMV0sIGN1YmljWzJdLCBjdWJpY1szXSk7CisjaWZuZGVmIE5ERUJVRworICAgICAgICAgICAg
aWYgKG1fdmVyYm9zZUxvZ2dpbmcpCisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJRdWFkLT5D
dWJpY1RvICglZiwgJWYpLCAoJWYsICVmKSwgKCVmLCAlZiksICglZiwgJWYpIiwgY3ViaWNbMF0u
ZlgsIGN1YmljWzBdLmZZLCBjdWJpY1sxXS5mWCwgY3ViaWNbMV0uZlksIGN1YmljWzJdLmZYLCBj
dWJpY1syXS5mWSwgY3ViaWNbM10uZlgsIGN1YmljWzNdLmZZKTsKKyNlbmRpZgorICAgICAgICAg
ICAgY29udG91ci0+YWRkKHNlZ21lbnQpOworICAgICAgICAgICAgY3VyUG9pbnQgPSBjdWJpY1sz
XTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgU2tQYXRoOjpr
Q3ViaWNfVmVyYjogeworICAgICAgICAgICAgU2VnbWVudCogc2VnbWVudCA9IG1fYXJlbmEtPmFs
bG9jYXRlT2JqZWN0PFNlZ21lbnQ+KCk7CisgICAgICAgICAgICBzZWdtZW50LT5zZXR1cChtX2Fy
ZW5hLmdldCgpLCBjb250b3VyLCBwb2ludHNbMF0sIHBvaW50c1sxXSwgcG9pbnRzWzJdLCBwb2lu
dHNbM10pOworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgICAgIGlmIChtX3ZlcmJvc2VMb2dnaW5n
KQorICAgICAgICAgICAgICAgIExPR19FUlJPUigiQ3ViaWNUbyAoJWYsICVmKSwgKCVmLCAlZiks
ICglZiwgJWYpLCAoJWYsICVmKSIsIHBvaW50c1swXS5mWCwgcG9pbnRzWzBdLmZZLCBwb2ludHNb
MV0uZlgsIHBvaW50c1sxXS5mWSwgcG9pbnRzWzJdLmZYLCBwb2ludHNbMl0uZlksIHBvaW50c1sz
XS5mWCwgcG9pbnRzWzNdLmZZKTsKKyNlbmRpZgorICAgICAgICAgICAgY29udG91ci0+YWRkKHNl
Z21lbnQpOworICAgICAgICAgICAgY3VyUG9pbnQgPSBwb2ludHNbM107CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNrUGF0aDo6a0Nsb3NlX1ZlcmI6IHsKKyAg
ICAgICAgICAgIFNlZ21lbnQqIHNlZ21lbnQgPSBtX2FyZW5hLT5hbGxvY2F0ZU9iamVjdDxTZWdt
ZW50PigpOworICAgICAgICAgICAgc2VnbWVudC0+c2V0dXAobV9hcmVuYS5nZXQoKSwgY29udG91
ciwgY3VyUG9pbnQsIG1vdmVUb1BvaW50KTsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgICAgICBp
ZiAobV92ZXJib3NlTG9nZ2luZykKKyAgICAgICAgICAgICAgICBMT0dfRVJST1IoIkNsb3NlICgl
ZiwgJWYpIC0+ICglZiwgJWYpIiwgY3VyUG9pbnQuZlgsIGN1clBvaW50LmZZLCBtb3ZlVG9Qb2lu
dC5mWCwgbW92ZVRvUG9pbnQuZlkpOworI2VuZGlmCisgICAgICAgICAgICBjb250b3VyLT5hZGQo
c2VnbWVudCk7CisgICAgICAgICAgICBjb250b3VyID0gMDsKKyAgICAgICAgfQorICAgICAgICBj
YXNlIFNrUGF0aDo6a0RvbmVfVmVyYjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cisg
ICAgfSB3aGlsZSAodmVyYiAhPSBTa1BhdGg6OmtEb25lX1ZlcmIpOworI2Vsc2UgLy8gIVBMQVRG
T1JNKFNLSUEpCisgICAgLy8gTXVzdCBwb3J0IHRvIHlvdXIgcGxhdGZvcm0uCisgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisjZW5kaWYKK30KKworI2lmbmRlZiBOREVCVUcKK1ZlY3RvcjxTZWdt
ZW50Kj4gTG9vcEJsaW5uUGF0aFByb2Nlc3Nvcjo6YWxsU2VnbWVudHNPdmVybGFwcGluZ1koQ29u
dG91ciogcXVlcnlDb250b3VyLCBmbG9hdCB4LCBmbG9hdCB5KQoreworICAgIFZlY3RvcjxTZWdt
ZW50Kj4gcmVzOworICAgIGZvciAoVmVjdG9yPENvbnRvdXIqPjo6aXRlcmF0b3IgaXRlciA9IG1f
Y29udG91cnMuYmVnaW4oKTsgaXRlciAhPSBtX2NvbnRvdXJzLmVuZCgpOyArK2l0ZXIpIHsKKyAg
ICAgICAgQ29udG91ciogY3VyID0gKml0ZXI7CisgICAgICAgIGZvciAoU2VnbWVudCogc2VnID0g
Y3VyLT5iZWdpbigpOyBzZWcgIT0gY3VyLT5lbmQoKTsgc2VnID0gc2VnLT5uZXh0KCkpIHsKKyAg
ICAgICAgICAgIGNvbnN0IEZsb2F0UmVjdCYgYm91bmRpbmdCb3ggPSBzZWctPmJvdW5kaW5nQm94
KCk7CisgICAgICAgICAgICBpZiAoYm91bmRpbmdCb3gueSgpIDw9IHkgJiYgeSA8PSBib3VuZGlu
Z0JveC5tYXhZKCkpCisgICAgICAgICAgICAgICAgcmVzLmFwcGVuZChzZWcpOworICAgICAgICB9
CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisjZW5kaWYKKworLy8gVW5jb21tZW50IHRoaXMg
dG8gZGVidWcgdGhlIG9yaWVudGF0aW9uIGNvbXB1dGF0aW9uLgorLy8gI2RlZmluZSBHUFVfUEFU
SF9QUk9DRVNTT1JfREVCVUdfT1JJRU5UQVRJT04KKwordm9pZCBMb29wQmxpbm5QYXRoUHJvY2Vz
c29yOjpkZXRlcm1pbmVTaWRlc1RvRmlsbCgpCit7CisgICAgLy8gTG9vcCBhbmQgQmxpbm4ncyBh
bGdvcml0aG0gY2FuIG9ubHkgZWFzaWx5IGVtdWxhdGUgdGhlIGV2ZW4vb2RkCisgICAgLy8gZmls
bCBydWxlLCBhbmQgb25seSBmb3Igbm9uLWludGVyc2VjdGluZyBjdXJ2ZXMuIFdlIGNhbiBkZXRl
cm1pbmUKKyAgICAvLyB3aGljaCBzaWRlIG9mIGVhY2ggY3VydmUgc2VnbWVudCB0byBmaWxsIGJh
c2VkIG9uIGl0cworICAgIC8vIGNsb2Nrd2lzZS9jb3VudGVyY2xvY2t3aXNlIG9yaWVudGF0aW9u
IGFuZCBob3cgbWFueSBvdGhlcgorICAgIC8vIGNvbnRvdXJzIHN1cnJvdW5kIGl0LgorCisgICAg
Ly8gVG8gb3B0aW1pemUgdGhlIHF1ZXJ5IG9mIGFsbCBjdXJ2ZSBzZWdtZW50cyBpbnRlcnNlY3Rp
bmcgYQorICAgIC8vIGhvcml6b250YWwgbGluZSBnb2luZyB0byB4PStpbmZpbml0eSwgd2UgYnVp
bGQgdXAgYW4gaW50ZXJ2YWwKKyAgICAvLyB0cmVlIHdob3NlIGtleXMgYXJlIHRoZSB5IGV4dGVu
dHMgb2YgdGhlIHNlZ21lbnRzLgorICAgIFBPREludGVydmFsVHJlZTxmbG9hdCwgU2VnbWVudCo+
IHRyZWUobV9hcmVuYSk7CisgICAgdHlwZWRlZiBQT0RJbnRlcnZhbFRyZWU8ZmxvYXQsIFNlZ21l
bnQqPjo6SW50ZXJ2YWxUeXBlIEludGVydmFsVHlwZTsKKworICAgIGZvciAoVmVjdG9yPENvbnRv
dXIqPjo6aXRlcmF0b3IgaXRlciA9IG1fY29udG91cnMuYmVnaW4oKTsgaXRlciAhPSBtX2NvbnRv
dXJzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgICAgQ29udG91ciogY3VyID0gKml0ZXI7CisgICAg
ICAgIGRldGVybWluZU9yaWVudGF0aW9uKGN1cik7CisgICAgICAgIGZvciAoU2VnbWVudCogc2Vn
ID0gY3VyLT5iZWdpbigpOyBzZWcgIT0gY3VyLT5lbmQoKTsgc2VnID0gc2VnLT5uZXh0KCkpIHsK
KyAgICAgICAgICAgIGNvbnN0IEZsb2F0UmVjdCYgYm91bmRpbmdCb3ggPSBzZWctPmJvdW5kaW5n
Qm94KCk7CisgICAgICAgICAgICB0cmVlLmFkZCh0cmVlLmNyZWF0ZUludGVydmFsKGJvdW5kaW5n
Qm94LnkoKSwgYm91bmRpbmdCb3gubWF4WSgpLCBzZWcpKTsKKyAgICAgICAgfQorICAgIH0KKwor
ICAgIC8vIE5vdyBpdGVyYXRlIHRocm91Z2ggdGhlIGNvbnRvdXJzIGFuZCBwaWNrIGEgcmFuZG9t
IHNlZ21lbnQgKGluCisgICAgLy8gdGhpcyBjYXNlIHdlIHVzZSB0aGUgZmlyc3QpIGFuZCBhIHJh
bmRvbSBwb2ludCBvbiB0aGF0IHNlZ21lbnQuCisgICAgLy8gRmluZCBhbGwgc2VnbWVudHMgZnJv
bSBvdGhlciBjb250b3VycyB3aGljaCBpbnRlcnNlY3QgdGhpcyBvbmUKKyAgICAvLyBhbmQgY291
bnQgdGhlIG51bWJlciBvZiBjcm9zc2luZ3MgYSBob3Jpem9udGFsIGxpbmUgdG8KKyAgICAvLyB4
PStpbmZpbml0eSBtYWtlcyB3aXRoIHRob3NlIGNvbnRvdXJzLiBUaGlzIGNvbWJpbmVkIHdpdGgg
dGhlCisgICAgLy8gb3JpZW50YXRpb24gb2YgdGhlIGN1cnZlIHRlbGxzIHVzIHdoaWNoIHNpZGUg
dG8gZmlsbCAtLSBhZ2FpbiwKKyAgICAvLyBhc3N1bWluZyBhbiBldmVuL29kZCBmaWxsIHJ1bGUs
IHdoaWNoIGlzIGFsbCB3ZSBjYW4gZWFzaWx5CisgICAgLy8gaGFuZGxlLgorICAgIGZvciAoVmVj
dG9yPENvbnRvdXIqPjo6aXRlcmF0b3IgaXRlciA9IG1fY29udG91cnMuYmVnaW4oKTsgaXRlciAh
PSBtX2NvbnRvdXJzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgICAgQ29udG91ciogY3VyID0gKml0
ZXI7CisKKyAgICAgICAgYm9vbCBhbWJpZ3VvdXMgPSB0cnVlOworICAgICAgICBpbnQgbnVtQ3Jv
c3NpbmdzID0gMDsKKworICAgICAgICAvLyBGb3IgZWFjaCBjb250b3VyLCBhdHRlbXB0IHRvIGZp
bmQgYSBwb2ludCBvbiB0aGUgY29udG91ciB3aGljaCwKKyAgICAgICAgLy8gd2hlbiB3ZSBjYXN0
IGFuIFhSYXksIGRvZXMgbm90IGludGVyc2VjdCB0aGUgb3RoZXIgY29udG91cnMgYXQKKyAgICAg
ICAgLy8gYW4gYW1iaWd1b3VzIHBvaW50ICh0aGUganVuY3Rpb24gYmV0d2VlbiB0d28gY3VydmVz
IG9yIGF0IGEKKyAgICAgICAgLy8gdGFuZ2VudCBwb2ludCkuIEFtYmlndW91cyBwb2ludHMgbWFr
ZSB0aGUgZGV0ZXJtaW5hdGlvbiBvZgorICAgICAgICAvLyB3aGV0aGVyIHRoaXMgY29udG91ciBp
cyBjb250YWluZWQgd2l0aGluIGFub3RoZXIgZnJhZ2lsZS4gTm90ZQorICAgICAgICAvLyB0aGF0
IHRoaXMgbG9vcCBpcyBvbmx5IGFuIGFwcHJveGltYXRpb24gdG8gdGhlIHNlbGVjdGlvbiBvZiBh
CisgICAgICAgIC8vIGdvb2QgY2FzdGluZyBwb2ludC4gV2UgY291bGQgYXMgd2VsbCBldmFsdWF0
ZSBhIHNlZ21lbnQgdG8KKyAgICAgICAgLy8gZGV0ZXJtaW5lIGEgcG9pbnQgdXBvbiBpdC4KKyAg
ICAgICAgZm9yIChTZWdtZW50KiBzZWcgPSBjdXItPmJlZ2luKCk7CisgICAgICAgICAgICAgYW1i
aWd1b3VzICYmIHNlZyAhPSBjdXItPmVuZCgpOworICAgICAgICAgICAgIHNlZyA9IHNlZy0+bmV4
dCgpKSB7CisgICAgICAgICAgICBudW1Dcm9zc2luZ3MgPSAwOworICAgICAgICAgICAgLy8gV2Ug
dXNlIGEgemVyby1zaXplZCB2ZXJ0aWNhbCBpbnRlcnZhbCBmb3IgdGhlIHF1ZXJ5LgorICAgICAg
ICAgICAgVmVjdG9yPEludGVydmFsVHlwZT4gb3ZlcmxhcHMgPSB0cmVlLmFsbE92ZXJsYXBzKHRy
ZWUuY3JlYXRlSW50ZXJ2YWwoc2VnLT5nZXRQb2ludCgwKS55KCksCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBzZWctPmdldFBvaW50KDApLnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAp
KTsKKyNpZiBkZWZpbmVkKEdQVV9QQVRIX1BST0NFU1NPUl9ERUJVR19PUklFTlRBVElPTikgJiYg
IWRlZmluZWQoTkRFQlVHKQorICAgICAgICAgICAgVmVjdG9yPFNlZ21lbnQqPiBzbG93T3Zlcmxh
cHMgPSBhbGxTZWdtZW50c092ZXJsYXBwaW5nWShjdXIsIHNlZy0+Z2V0UG9pbnQoMCkueCgpLCBz
ZWctPmdldFBvaW50KDApLnkoKSk7CisgICAgICAgICAgICBpZiAob3ZlcmxhcHMuc2l6ZSgpICE9
IHNsb3dPdmVybGFwcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBMT0dfRVJST1IoIkZvciBx
dWVyeSBwb2ludCAoJWYsICVmKSBvbiBjb250b3VyIDB4JXA6Iiwgc2VnLT5nZXRQb2ludCgwKS54
KCksIHNlZy0+Z2V0UG9pbnQoMCkueSgpLCBjdXIpOworICAgICAgICAgICAgICAgIExPR19FUlJP
UigiIG92ZXJsYXBzOiIpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
b3ZlcmxhcHMuc2l6ZSgpOyBpKyspCisgICAgICAgICAgICAgICAgICAgIExPR19FUlJPUigiICAl
ZDogJXMiLCBpKzEsIG92ZXJsYXBzW2ldLmRhdGEoKS0+dG9TdHJpbmcoKS5hc2NpaSgpLmRhdGEo
KSk7CisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCIgc2xvd092ZXJsYXBzOiIpOworICAgICAg
ICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2xvd092ZXJsYXBzLnNpemUoKTsgaSsr
KQorICAgICAgICAgICAgICAgICAgICBMT0dfRVJST1IoIiAgJWQ6ICVzIiwgKGkrMSkgc2xvd092
ZXJsYXBzW2ldLT50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBMT0dfRVJST1IoIkludGVy
dmFsIHRyZWU6Iik7CisgICAgICAgICAgICAgICAgdHJlZS5kdW1wKCk7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBBU1NFUlQob3ZlcmxhcHMuc2l6ZSgpID09IHNsb3dPdmVybGFwcy5zaXpl
KCkpOworI2VuZGlmIC8vIGRlZmluZWQoR1BVX1BBVEhfUFJPQ0VTU09SX0RFQlVHX09SSUVOVEFU
SU9OKSAmJiAhZGVmaW5lZChOREVCVUcpCisgICAgICAgICAgICBmb3IgKFZlY3RvcjxJbnRlcnZh
bFR5cGU+OjppdGVyYXRvciBpdGVyID0gb3ZlcmxhcHMuYmVnaW4oKTsgaXRlciAhPSBvdmVybGFw
cy5lbmQoKTsgKytpdGVyKSB7CisgICAgICAgICAgICAgICAgY29uc3QgSW50ZXJ2YWxUeXBlJiBp
bnRlcnZhbCA9ICppdGVyOworICAgICAgICAgICAgICAgIFNlZ21lbnQqIHF1ZXJ5U2VnbWVudCA9
IGludGVydmFsLmRhdGEoKTsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUgc2VnbWVudHMgY29t
aW5nIGZyb20gdGhlIHNhbWUgY29udG91ci4KKyAgICAgICAgICAgICAgICBpZiAocXVlcnlTZWdt
ZW50LT5jb250b3VyKCkgIT0gY3VyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgcGVy
Zm9ybSBxdWVyaWVzIHRoYXQgY2FuIGFmZmVjdCB0aGUgY29tcHV0YXRpb24uCisgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IEZsb2F0UmVjdCYgYm91bmRpbmdCb3ggPSBxdWVyeVNlZ21lbnQtPmNv
bnRvdXIoKS0+Ym91bmRpbmdCb3goKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlZy0+Z2V0
UG9pbnQoMCkueCgpID49IGJvdW5kaW5nQm94LngoKQorICAgICAgICAgICAgICAgICAgICAgICAg
JiYgc2VnLT5nZXRQb2ludCgwKS54KCkgPD0gYm91bmRpbmdCb3gubWF4WCgpKSB7CisgICAgICAg
ICAgICAgICAgICAgICAgICBudW1Dcm9zc2luZ3MgKz0gcXVlcnlTZWdtZW50LT5udW1Dcm9zc2lu
Z3NGb3JYUmF5KHNlZy0+Z2V0UG9pbnQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtYmlndW91cyk7
CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW1iaWd1b3VzKSB7CisjaWZuZGVmIE5ERUJV
RworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZlcmJvc2VMb2dnaW5nKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR19FUlJPUigiQW1iaWd1b3VzIGludGVy
c2VjdGlvbiBxdWVyeSBhdCBwb2ludCAoJWYsICVmKSIsIHNlZy0+Z2V0UG9pbnQoMCkueCgpLCBz
ZWctPmdldFBvaW50KDApLnkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExP
R19FUlJPUigiUXVlcnkgc2VnbWVudDogJXMiLCBxdWVyeVNlZ21lbnQtPnRvU3RyaW5nKCkuYXNj
aWkoKS5kYXRhKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBBYm9ydCBpdGVyYXRpb24gb3ZlciBv
dmVybGFwcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvLyBmb3IgKFNl
Z21lbnQqIHNlZyA9IGN1ci0+YmVnaW4oKTsgLi4uCisKKyAgICAgICAgY3VyLT5zZXRGaWxsU2lk
ZSgoY3VyLT5pc09yaWVudGVkQ291bnRlckNsb2Nrd2lzZSgpIF4gKG51bUNyb3NzaW5ncyAmIDEp
KSA/IExvb3BCbGlubkNvbnN0YW50czo6TGVmdFNpZGUgOiBMb29wQmxpbm5Db25zdGFudHM6OlJp
Z2h0U2lkZSk7CisgICAgfQorfQorCit2b2lkIExvb3BCbGlublBhdGhQcm9jZXNzb3I6OmRldGVy
bWluZU9yaWVudGF0aW9uKENvbnRvdXIqIGNvbnRvdXIpCit7CisgICAgLy8gRGV0ZXJtaW5lIHNp
Z25lZCBhcmVhIG9mIHRoZSBwb2x5Z29uIHJlcHJlc2VudGVkIGJ5IHRoZSBwb2ludHMKKyAgICAv
LyBhbG9uZyB0aGUgc2VnbWVudHMuIENvbnNpZGVyIHRoaXMgYW4gYXBwcm94aW1hdGlvbiB0byB0
aGUgdHJ1ZQorICAgIC8vIG9yaWVudGF0aW9uIG9mIHRoZSBwb2x5Z29uOyBpdCBwcm9iYWJseSB3
b24ndCBoYW5kbGUKKyAgICAvLyBzZWxmLWludGVyc2VjdGluZyBjdXJ2ZXMgY29ycmVjdGx5Lgor
ICAgIC8vCisgICAgLy8gVGhlcmUgaXMgYWxzbyBhIHByZXR0eSBiYXNpYyBhc3N1bXB0aW9uIGhl
cmUgdGhhdCB0aGUgY29udG91ciBpcworICAgIC8vIGNsb3NlZC4KKyAgICBmbG9hdCBzaWduZWRB
cmVhID0gMDsKKyAgICBmb3IgKFNlZ21lbnQqIHNlZyA9IGNvbnRvdXItPmJlZ2luKCk7CisgICAg
ICAgICBzZWcgIT0gY29udG91ci0+ZW5kKCk7CisgICAgICAgICBzZWcgPSBzZWctPm5leHQoKSkg
eworICAgICAgICBpbnQgbGltaXQgPSAoc2VnLT5raW5kKCkgPT0gU2VnbWVudDo6Q3ViaWMpID8g
NCA6IDI7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGltaXQ7IGkrKykgeworICAgICAg
ICAgICAgY29uc3QgRmxvYXRQb2ludCYgcHJldlBvaW50ID0gc2VnLT5nZXRQb2ludChpIC0gMSk7
CisgICAgICAgICAgICBjb25zdCBGbG9hdFBvaW50JiBwb2ludCA9IHNlZy0+Z2V0UG9pbnQoaSk7
CisgICAgICAgICAgICBmbG9hdCBjdXJBcmVhID0gcHJldlBvaW50LngoKSAqIHBvaW50LnkoKSAt
IHByZXZQb2ludC55KCkgKiBwb2ludC54KCk7CisjaWZuZGVmIE5ERUJVRworICAgICAgICAgICAg
aWYgKG1fdmVyYm9zZUxvZ2dpbmcpCisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJBZGRpbmcg
dG8gc2lnbmVkIGFyZWEgKCVmLCAlZikgLT4gKCVmLCAlZikgPSAlZiIsIHByZXZQb2ludC54KCks
IHByZXZQb2ludC55KCksIHBvaW50LngoKSwgcG9pbnQueSgpLCBjdXJBcmVhKTsKKyNlbmRpZgor
ICAgICAgICAgICAgc2lnbmVkQXJlYSArPSBjdXJBcmVhOworICAgICAgICB9CisgICAgfQorCisg
ICAgaWYgKHNpZ25lZEFyZWEgPiAwKQorICAgICAgICBjb250b3VyLT5zZXRJc09yaWVudGVkQ291
bnRlckNsb2Nrd2lzZSh0cnVlKTsKKyAgICBlbHNlCisgICAgICAgIGNvbnRvdXItPnNldElzT3Jp
ZW50ZWRDb3VudGVyQ2xvY2t3aXNlKGZhbHNlKTsKK30KKworbmFtZXNwYWNlIHsKKworLy8tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCisvLyBDbGFzc2VzIGFuZCB0eXBlZGVmcyBuZWVkZWQgZm9yIGN1cnZlIHN1YmRp
dmlzaW9uLiBUaGVzZSBjYW4ndCBiZSBzY29wZWQKKy8vIHdpdGhpbiB0aGUgc3ViZGl2aWRlQ3Vy
dmVzKCkgbWV0aG9kIGl0c2VsZiwgYmVjYXVzZSB0ZW1wbGF0ZXMgdGhlbiBmYWlsCisvLyB0byBp
bnN0YW50aWF0ZS4KKworLy8gVGhlIHVzZXIgZGF0YSB3aGljaCBpcyBwbGFjZWQgaW4gdGhlIFBP
REludGVydmFsVHJlZS4KK3N0cnVjdCBTd2VlcERhdGEgeworICAgIFN3ZWVwRGF0YSgpCisgICAg
ICAgIDogdHJpYW5nbGUoMCkKKyAgICAgICAgLCBzZWdtZW50KDApCisgICAgeworICAgIH0KKwor
ICAgIC8vIFRoZSB0cmlhbmdsZSB0aGlzIGludGVydmFsIGlzIGFzc29jaWF0ZWQgd2l0aAorICAg
IExvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpUcmlhbmdsZSogdHJpYW5nbGU7CisgICAgLy8g
VGhlIHNlZ21lbnQgdGhlIHRyaWFuZ2xlIGlzIGFzc29jaWF0ZWQgd2l0aAorICAgIFNlZ21lbnQq
IHNlZ21lbnQ7Cit9OworCit0eXBlZGVmIFBPREludGVydmFsVHJlZTxmbG9hdCwgU3dlZXBEYXRh
Kj4gU3dlZXBUcmVlOwordHlwZWRlZiBTd2VlcFRyZWU6OkludGVydmFsVHlwZSBTd2VlcEludGVy
dmFsOworCisvLyBUaGUgZW50cnkgLyBleGl0IGV2ZW50cyB3aGljaCBvY2N1ciBhdCB0aGUgbWlu
aW11bSBhbmQgbWF4aW11bSB4CisvLyBjb29yZGluYXRlcyBvZiB0aGUgY29udHJvbCBwb2ludCB0
cmlhbmdsZXMnIGJvdW5kaW5nIGJveGVzLgorLy8KKy8vIE5vdGUgdGhhdCB0aGlzIGNsYXNzIHJl
cXVpcmVzIGl0cyBjb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50CisvLyBvcGVyYXRvciBz
aW5jZSBpdCBuZWVkcyB0byBiZSBzdG9yZWQgaW4gYSBWZWN0b3IuCitjbGFzcyBTd2VlcEV2ZW50
IHsKK3B1YmxpYzoKKyAgICBTd2VlcEV2ZW50KCkKKyAgICAgICAgOiBtX3goMCkKKyAgICAgICAg
LCBtX2VudHJ5KGZhbHNlKQorICAgICAgICAsIG1faW50ZXJ2YWwoMCwgMCwgMCkKKyAgICB7Cisg
ICAgfQorCisgICAgLy8gSW5pdGlhbGl6ZXMgdGhlIFN3ZWVwRXZlbnQuCisgICAgdm9pZCBzZXR1
cChmbG9hdCB4LCBib29sIGVudHJ5LCBTd2VlcEludGVydmFsIGludGVydmFsKQorICAgIHsKKyAg
ICAgICAgbV94ID0geDsKKyAgICAgICAgbV9lbnRyeSA9IGVudHJ5OworICAgICAgICBtX2ludGVy
dmFsID0gaW50ZXJ2YWw7CisgICAgfQorCisgICAgZmxvYXQgeCgpIGNvbnN0IHsgcmV0dXJuIG1f
eDsgfQorICAgIGJvb2wgZW50cnkoKSBjb25zdCB7IHJldHVybiBtX2VudHJ5OyB9CisgICAgY29u
c3QgU3dlZXBJbnRlcnZhbCYgaW50ZXJ2YWwoKSBjb25zdCB7IHJldHVybiBtX2ludGVydmFsOyB9
CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBTd2VlcEV2ZW50JiBvdGhlcikgY29uc3QKKyAg
ICB7CisgICAgICAgIHJldHVybiBtX3ggPCBvdGhlci5tX3g7CisgICAgfQorCitwcml2YXRlOgor
ICAgIGZsb2F0IG1feDsKKyAgICBib29sIG1fZW50cnk7CisgICAgU3dlZXBJbnRlcnZhbCBtX2lu
dGVydmFsOworfTsKKworYm9vbCB0cmlhbmdsZXNPdmVybGFwKExvb3BCbGlubkxvY2FsVHJpYW5n
dWxhdG9yOjpUcmlhbmdsZSogdDAsCisgICAgICAgICAgICAgICAgICAgICAgTG9vcEJsaW5uTG9j
YWxUcmlhbmd1bGF0b3I6OlRyaWFuZ2xlKiB0MSkKK3sKKyAgICByZXR1cm4gdHJpYW5nbGVzT3Zl
cmxhcCh0MC0+Z2V0VmVydGV4KDApLT54eUNvb3JkaW5hdGVzKCksCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdDAtPmdldFZlcnRleCgxKS0+eHlDb29yZGluYXRlcygpLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHQwLT5nZXRWZXJ0ZXgoMiktPnh5Q29vcmRpbmF0ZXMoKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB0MS0+Z2V0VmVydGV4KDApLT54eUNvb3JkaW5hdGVz
KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDEtPmdldFZlcnRleCgxKS0+eHlDb29y
ZGluYXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxLT5nZXRWZXJ0ZXgoMikt
Pnh5Q29vcmRpbmF0ZXMoKSk7Cit9CisKK30gLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCit2b2lk
IExvb3BCbGlublBhdGhQcm9jZXNzb3I6OnN1YmRpdmlkZUN1cnZlcygpCit7CisgICAgLy8gV2Ug
bmVlZCB0byBkZXRlcm1pbmUgYWxsIG92ZXJsYXBzIG9mIGFsbCBjb250cm9sIHBvaW50IHRyaWFu
Z2xlcworICAgIC8vIChmcm9tIGRpZmZlcmVudCBzZWdtZW50cywgbm90IHRoZSBzYW1lIHNlZ21l
bnQpIGFuZCwgaWYgYW55CisgICAgLy8gZXhpc3QsIHN1YmRpdmlkZSB0aGUgYXNzb2NpYXRlZCBj
dXJ2ZXMuCisgICAgLy8KKyAgICAvLyBUaGUgcGxhbmUtc3dlZXAgYWxnb3JpdGhtIGRldGVybWlu
ZXMgYWxsIG92ZXJsYXBzIG9mIGEgc2V0IG9mCisgICAgLy8gcmVjdGFuZ2xlcyBpbiB0aGUgMkQg
cGxhbmUuIE91ciBwcm9ibGVtIG1hcHMgdmVyeSB3ZWxsIHRvIHRoaXMKKyAgICAvLyBhbGdvcml0
aG0gYW5kIHNpZ25pZmljYW50bHkgcmVkdWNlcyB0aGUgY29tcGxleGl0eSBjb21wYXJlZCB0byBh
CisgICAgLy8gbmFpdmUgaW1wbGVtZW50YXRpb24uCisgICAgLy8KKyAgICAvLyBFYWNoIGJvdW5k
aW5nIGJveCBvZiBhIGNvbnRyb2wgcG9pbnQgdHJpYW5nbGUgaXMgY29udmVydGVkIGludG8KKyAg
ICAvLyBhbiAiZW50cnkiIGV2ZW50IGF0IGl0cyBzbWFsbGVzdCBYIGNvb3JkaW5hdGUgYW5kIGFu
ICJleGl0IiBldmVudAorICAgIC8vIGF0IGl0cyBsYXJnZXN0IFggY29vcmRpbmF0ZS4gRWFjaCBl
dmVudCBoYXMgYW4gYXNzb2NpYXRlZAorICAgIC8vIG9uZS1kaW1lbnNpb25hbCBpbnRlcnZhbCBy
ZXByZXNlbnRpbmcgdGhlIFkgc3BhbiBvZiB0aGUgYm91bmRpbmcKKyAgICAvLyBib3guIFdlIHNv
cnQgdGhlc2UgZXZlbnRzIGJ5IGluY3JlYXNpbmcgWCBjb29yZGluYXRlLiBXZSB0aGVuCisgICAg
Ly8gaXRlcmF0ZSB0aHJvdWdoIHRoZW0uIEZvciBlYWNoIGVudHJ5IGV2ZW50IHdlIGFkZCB0aGUg
aW50ZXJ2YWwgdG8KKyAgICAvLyBhIHNpZGUgaW50ZXJ2YWwgdHJlZSwgYW5kIHF1ZXJ5IHRoaXMg
dHJlZSBmb3Igb3ZlcmxhcHBpbmcKKyAgICAvLyBpbnRlcnZhbHMuIEFueSBvdmVybGFwcGluZyBp
bnRlcnZhbCBjb3JyZXNwb25kcyB0byBhbiBvdmVybGFwcGluZworICAgIC8vIGJvdW5kaW5nIGJv
eC4gRm9yIGVhY2ggZXhpdCBldmVudCB3ZSByZW1vdmUgdGhlIGFzc29jaWF0ZWQKKyAgICAvLyBp
bnRlcnZhbCBmcm9tIHRoZSBpbnRlcnZhbCB0cmVlLgorCisgICAgVmVjdG9yPFNlZ21lbnQqPiBj
dXJTZWdtZW50czsKKyAgICBWZWN0b3I8U2VnbWVudCo+IG5leHRTZWdtZW50czsKKworICAgIC8v
IFN0YXJ0IHRoaW5ncyBvZmYgYnkgY29uc2lkZXJpbmcgYWxsIG9mIHRoZSBzZWdtZW50cworICAg
IGZvciAoVmVjdG9yPENvbnRvdXIqPjo6aXRlcmF0b3IgaXRlciA9IG1fY29udG91cnMuYmVnaW4o
KTsgaXRlciAhPSBtX2NvbnRvdXJzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgICAgQ29udG91ciog
Y3VyID0gKml0ZXI7CisgICAgICAgIGZvciAoU2VnbWVudCogc2VnID0gY3VyLT5iZWdpbigpOyBz
ZWcgIT0gY3VyLT5lbmQoKTsgc2VnID0gc2VnLT5uZXh0KCkpIHsKKyAgICAgICAgICAgIGlmIChz
ZWctPmtpbmQoKSA9PSBTZWdtZW50OjpDdWJpYykgeworICAgICAgICAgICAgICAgIHNlZy0+dHJp
YW5ndWxhdGUoTG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OkRvbnRDb21wdXRlSW5zaWRlRWRn
ZXMsIDApOworICAgICAgICAgICAgICAgIGN1clNlZ21lbnRzLmFwcGVuZChzZWcpOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gU3ViZGl2aWRlIGN1cnZlcyBhdCBt
b3N0IHRoaXMgbWFueSB0aW1lcworICAgIGNvbnN0IGludCBNYXhJdGVyYXRpb25zID0gNTsKKyAg
ICBWZWN0b3I8U3dlZXBJbnRlcnZhbD4gb3ZlcmxhcHM7CisKKyAgICBmb3IgKGludCBjdXJyZW50
SXRlcmF0aW9uID0gMDsgY3VycmVudEl0ZXJhdGlvbiA8IE1heEl0ZXJhdGlvbnM7ICsrY3VycmVu
dEl0ZXJhdGlvbikgeworICAgICAgICBpZiAoIWN1clNlZ21lbnRzLnNpemUoKSkKKyAgICAgICAg
ICAgIC8vIERvbmUKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIFZlY3RvcjxTd2VlcEV2
ZW50PiBldmVudHM7CisgICAgICAgIFN3ZWVwVHJlZSB0cmVlKG1fYXJlbmEpOworICAgICAgICBm
b3IgKFZlY3RvcjxTZWdtZW50Kj46Oml0ZXJhdG9yIGl0ZXIgPSBjdXJTZWdtZW50cy5iZWdpbigp
OyBpdGVyICE9IGN1clNlZ21lbnRzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgICAgICAgIFNlZ21l
bnQqIHNlZyA9ICppdGVyOworICAgICAgICAgICAgaWYgKHNlZy0+a2luZCgpID09IFNlZ21lbnQ6
OkN1YmljKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWctPm51bWJl
ck9mVHJpYW5nbGVzKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBMb29wQmxpbm5Mb2Nh
bFRyaWFuZ3VsYXRvcjo6VHJpYW5nbGUqIHRyaWFuZ2xlID0gc2VnLT5nZXRUcmlhbmdsZShpKTsK
KyAgICAgICAgICAgICAgICAgICAgRmxvYXRSZWN0IGJvdW5kaW5nQm94OworICAgICAgICAgICAg
ICAgICAgICBib3VuZGluZ0JveC5maXRUb1BvaW50cyh0cmlhbmdsZS0+Z2V0VmVydGV4KDApLT54
eUNvb3JkaW5hdGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJp
YW5nbGUtPmdldFZlcnRleCgxKS0+eHlDb29yZGluYXRlcygpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlLT5nZXRWZXJ0ZXgoMiktPnh5Q29vcmRpbmF0ZXMo
KSk7CisgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSB6ZXJvLXdpZHRoIHRyaWFuZ2xlcyB0
byBhdm9pZCBpc3N1ZXMgd2l0aAorICAgICAgICAgICAgICAgICAgICAvLyBjb2luY2lkZW50IGVu
dHJ5IGFuZCBleGl0IGV2ZW50cyBmb3IgdGhlIHNhbWUgdHJpYW5nbGUKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKGJvdW5kaW5nQm94Lm1heFgoKSA+IGJvdW5kaW5nQm94LngoKSkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgU3dlZXBEYXRhKiBkYXRhID0gbV9hcmVuYS0+YWxsb2NhdGVPYmpl
Y3Q8U3dlZXBEYXRhPigpOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+dHJpYW5nbGUg
PSB0cmlhbmdsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnNlZ21lbnQgPSBzZWc7
CisgICAgICAgICAgICAgICAgICAgICAgICBTd2VlcEludGVydmFsIGludGVydmFsID0gdHJlZS5j
cmVhdGVJbnRlcnZhbChib3VuZGluZ0JveC55KCksIGJvdW5kaW5nQm94Lm1heFkoKSwgZGF0YSk7
CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgZW50cnkgYW5kIGV4aXQgZXZlbnRzCisg
ICAgICAgICAgICAgICAgICAgICAgICBTd2VlcEV2ZW50IGV2ZW50OworICAgICAgICAgICAgICAg
ICAgICAgICAgZXZlbnQuc2V0dXAoYm91bmRpbmdCb3gueCgpLCB0cnVlLCBpbnRlcnZhbCk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBldmVudHMuYXBwZW5kKGV2ZW50KTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGV2ZW50LnNldHVwKGJvdW5kaW5nQm94Lm1heFgoKSwgZmFsc2UsIGludGVy
dmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5hcHBlbmQoZXZlbnQpOworICAg
ICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAg
ICAgICB9CisKKyAgICAgICAgLy8gU29ydCBldmVudHMgYnkgaW5jcmVhc2luZyBYIGNvb3JkaW5h
dGUKKyAgICAgICAgc3RkOjpzb3J0KGV2ZW50cy5iZWdpbigpLCBldmVudHMuZW5kKCkpOworI2lm
bmRlZiBOREVCVUcKKyAgICAgICAgZm9yIChzaXplX3QgaWkgPSAxOyBpaSA8IGV2ZW50cy5zaXpl
KCk7ICsraWkpCisgICAgICAgICAgICBBU1NFUlQoZXZlbnRzW2lpIC0gMV0ueCgpIDw9IGV2ZW50
c1tpaV0ueCgpKTsKKyNlbmRpZgorCisgICAgICAgIC8vIE5vdyBpdGVyYXRlIHRocm91Z2ggdGhl
IGV2ZW50cworICAgICAgICBmb3IgKFZlY3RvcjxTd2VlcEV2ZW50Pjo6aXRlcmF0b3IgaXRlciA9
IGV2ZW50cy5iZWdpbigpOyBpdGVyICE9IGV2ZW50cy5lbmQoKTsgKytpdGVyKSB7CisgICAgICAg
ICAgICBTd2VlcEV2ZW50IGV2ZW50ID0gKml0ZXI7CisgICAgICAgICAgICBpZiAoZXZlbnQuZW50
cnkoKSkgeworICAgICAgICAgICAgICAgIC8vIEFkZCB0aGlzIGludGVydmFsIGludG8gdGhlIHRy
ZWUKKyAgICAgICAgICAgICAgICB0cmVlLmFkZChldmVudC5pbnRlcnZhbCgpKTsKKyAgICAgICAg
ICAgICAgICAvLyBTZWUgd2hldGhlciB0aGUgYXNzb2NpYXRlZCBzZWdtZW50IGhhcyBiZWVuIHN1
YmRpdmlkZWQgeWV0CisgICAgICAgICAgICAgICAgaWYgKCFldmVudC5pbnRlcnZhbCgpLmRhdGEo
KS0+c2VnbWVudC0+bWFya2VkRm9yU3ViZGl2aXNpb24oKSkgeworICAgICAgICAgICAgICAgICAg
ICAvLyBRdWVyeSB0aGUgdHJlZQorICAgICAgICAgICAgICAgICAgICBvdmVybGFwcy5jbGVhcigp
OworICAgICAgICAgICAgICAgICAgICB0cmVlLmFsbE92ZXJsYXBzKGV2ZW50LmludGVydmFsKCks
IG92ZXJsYXBzKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gTm93IHNlZSBleGFjdGx5IHdoaWNo
IHRyaWFuZ2xlcyBvdmVybGFwIHRoaXMgb25lCisgICAgICAgICAgICAgICAgICAgIGZvciAoVmVj
dG9yPFN3ZWVwSW50ZXJ2YWw+OjppdGVyYXRvciBpdGVyID0gb3ZlcmxhcHMuYmVnaW4oKTsgaXRl
ciAhPSBvdmVybGFwcy5lbmQoKTsgKytpdGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBT
d2VlcEludGVydmFsIG92ZXJsYXAgPSAqaXRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8v
IE9ubHkgcGF5IGF0dGVudGlvbiB0byBvdmVybGFwcyBmcm9tIGEgZGlmZmVyZW50IFNlZ21lbnQK
KyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5pbnRlcnZhbCgpLmRhdGEoKS0+c2Vn
bWVudCAhPSBvdmVybGFwLmRhdGEoKS0+c2VnbWVudCkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIFNlZSB3aGV0aGVyIHRoZSB0cmlhbmdsZXMgYWN0dWFsbHkgb3ZlcmxhcAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmlhbmdsZXNPdmVybGFwKGV2ZW50LmludGVy
dmFsKCkuZGF0YSgpLT50cmlhbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBvdmVybGFwLmRhdGEoKS0+dHJpYW5nbGUpKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIC8vIEFjdHVhbGx5IHN1YmRpdmlkZSB0aGUgc2VnbWVudHMu
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVhY2ggb25lIG1pZ2h0IGFscmVh
ZHkgaGF2ZSBiZWVuIHN1YmRpdmlkZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFNlZ21lbnQqIHNlZyA9IGV2ZW50LmludGVydmFsKCkuZGF0YSgpLT5zZWdtZW50OworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25hbGx5U3ViZGl2aWRlKHNlZywgbmV4
dFNlZ21lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnID0gb3Zlcmxh
cC5kYXRhKCktPnNlZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRp
dGlvbmFsbHlTdWJkaXZpZGUoc2VnLCBuZXh0U2VnbWVudHMpOworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICAgICAgLy8gUmVtb3ZlIHRoaXMgaW50ZXJ2YWwgZnJvbSB0aGUgdHJlZQorICAgICAgICAgICAg
ICAgIHRyZWUucmVtb3ZlKGV2ZW50LmludGVydmFsKCkpOworICAgICAgICAgICAgfQorICAgICAg
ICB9CisKKyAgICAgICAgY3VyU2VnbWVudHMgPSBuZXh0U2VnbWVudHM7CisgICAgICAgIG5leHRT
ZWdtZW50cy5jbGVhcigpOworICAgIH0KK30KKwordm9pZCBMb29wQmxpbm5QYXRoUHJvY2Vzc29y
Ojpjb25kaXRpb25hbGx5U3ViZGl2aWRlKFNlZ21lbnQqIHNlZywgVmVjdG9yPFNlZ21lbnQqPiYg
bmV4dFNlZ21lbnRzKQoreworICAgIGlmICghc2VnLT5tYXJrZWRGb3JTdWJkaXZpc2lvbigpKSB7
CisgICAgICAgIHNlZy0+c2V0TWFya2VkRm9yU3ViZGl2aXNpb24odHJ1ZSk7CisgICAgICAgIFNl
Z21lbnQqIG5leHQgPSBzZWctPmNvbnRvdXIoKS0+c3ViZGl2aWRlKHNlZyk7CisgICAgICAgIC8v
IFRyaWFuZ3VsYXRlIHRoZSBuZXdseSBzdWJkaXZpZGVkIHNlZ21lbnRzLgorICAgICAgICBuZXh0
LT50cmlhbmd1bGF0ZShMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6RG9udENvbXB1dGVJbnNp
ZGVFZGdlcywgMCk7CisgICAgICAgIG5leHQtPm5leHQoKS0+dHJpYW5ndWxhdGUoTG9vcEJsaW5u
TG9jYWxUcmlhbmd1bGF0b3I6OkRvbnRDb21wdXRlSW5zaWRlRWRnZXMsIDApOworICAgICAgICAv
LyBBZGQgdGhlbSBmb3IgdGhlIG5leHQgaXRlcmF0aW9uLgorICAgICAgICBuZXh0U2VnbWVudHMu
YXBwZW5kKG5leHQpOworICAgICAgICBuZXh0U2VnbWVudHMuYXBwZW5kKG5leHQtPm5leHQoKSk7
CisgICAgfQorfQorCisjaWZuZGVmIE5ERUJVRwordm9pZCBMb29wQmxpbm5QYXRoUHJvY2Vzc29y
OjpzdWJkaXZpZGVDdXJ2ZXNTbG93KCkKK3sKKyAgICAvLyBBbHRlcm5hdGUsIHNpZ25pZmljYW50
bHkgc2xvd2VyIGFsZ29yaXRobSBmb3IgY3VydmUgc3ViZGl2aXNpb24KKyAgICAvLyBmb3IgdXNl
IGluIGRlYnVnZ2luZy4KKyAgICBWZWN0b3I8U2VnbWVudCo+IGN1clNlZ21lbnRzOworICAgIFZl
Y3RvcjxTZWdtZW50Kj4gbmV4dFNlZ21lbnRzOworCisgICAgLy8gU3RhcnQgdGhpbmdzIG9mZiBi
eSBjb25zaWRlcmluZyBhbGwgb2YgdGhlIHNlZ21lbnRzCisgICAgZm9yIChWZWN0b3I8Q29udG91
cio+OjppdGVyYXRvciBpdGVyID0gbV9jb250b3Vycy5iZWdpbigpOyBpdGVyICE9IG1fY29udG91
cnMuZW5kKCk7ICsraXRlcikgeworICAgICAgICBDb250b3VyKiBjdXIgPSAqaXRlcjsKKyAgICAg
ICAgZm9yIChTZWdtZW50KiBzZWcgPSBjdXItPmJlZ2luKCk7IHNlZyAhPSBjdXItPmVuZCgpOyBz
ZWcgPSBzZWctPm5leHQoKSkgeworICAgICAgICAgICAgaWYgKHNlZy0+a2luZCgpID09IFNlZ21l
bnQ6OkN1YmljKSB7CisgICAgICAgICAgICAgICAgc2VnLT50cmlhbmd1bGF0ZShMb29wQmxpbm5M
b2NhbFRyaWFuZ3VsYXRvcjo6RG9udENvbXB1dGVJbnNpZGVFZGdlcywgMCk7CisgICAgICAgICAg
ICAgICAgY3VyU2VnbWVudHMuYXBwZW5kKHNlZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICB9CisKKyAgICAvLyBTdWJkaXZpZGUgY3VydmVzIGF0IG1vc3QgdGhpcyBtYW55IHRpbWVz
CisgICAgY29uc3QgaW50IE1heEl0ZXJhdGlvbnMgPSA1OworCisgICAgZm9yIChpbnQgY3VycmVu
dEl0ZXJhdGlvbiA9IDA7IGN1cnJlbnRJdGVyYXRpb24gPCBNYXhJdGVyYXRpb25zOyArK2N1cnJl
bnRJdGVyYXRpb24pIHsKKyAgICAgICAgaWYgKCFjdXJTZWdtZW50cy5zaXplKCkpCisgICAgICAg
ICAgICAvLyBEb25lCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBmb3IgKFZlY3RvcjxT
ZWdtZW50Kj46Oml0ZXJhdG9yIGl0ZXIgPSBjdXJTZWdtZW50cy5iZWdpbigpOyBpdGVyICE9IGN1
clNlZ21lbnRzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgICAgICAgIFNlZ21lbnQqIHNlZyA9ICpp
dGVyOworICAgICAgICAgICAgaWYgKHNlZy0+a2luZCgpID09IFNlZ21lbnQ6OkN1YmljKSB7Cisg
ICAgICAgICAgICAgICAgZm9yIChWZWN0b3I8U2VnbWVudCo+OjppdGVyYXRvciBpdGVyMiA9IGN1
clNlZ21lbnRzLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICBpdGVyMiAhPSBjdXJTZWdt
ZW50cy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgIGl0ZXIyKyspIHsKKyAgICAgICAgICAg
ICAgICAgICAgU2VnbWVudCogc2VnMiA9ICppdGVyMjsKKyAgICAgICAgICAgICAgICAgICAgaWYg
KHNlZzItPmtpbmQoKSA9PSBTZWdtZW50OjpDdWJpYyAmJiBzZWcgIT0gc2VnMikgeworICAgICAg
ICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWctPm51bWJlck9mVHJpYW5n
bGVzKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BCbGlubkxvY2Fs
VHJpYW5ndWxhdG9yOjpUcmlhbmdsZSogdHJpYW5nbGUgPSBzZWctPmdldFRyaWFuZ2xlKGkpOwor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2VnMi0+bnVt
YmVyT2ZUcmlhbmdsZXMoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IExvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpUcmlhbmdsZSogdHJpYW5nbGUyID0gc2VnMi0+
Z2V0VHJpYW5nbGUoaik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmlh
bmdsZXNPdmVybGFwKHRyaWFuZ2xlLCB0cmlhbmdsZTIpKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjb25kaXRpb25hbGx5U3ViZGl2aWRlKHNlZywgbmV4dFNlZ21lbnRz
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsbHlTdWJk
aXZpZGUoc2VnMiwgbmV4dFNlZ21lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGN1clNlZ21lbnRzID0gbmV4dFNlZ21lbnRzOwor
ICAgICAgICBuZXh0U2VnbWVudHMuY2xlYXIoKTsKKyAgICB9Cit9CisjZW5kaWYKKworbmFtZXNw
YWNlIHsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTdHJ1Y3R1cmVzIGFuZCBjYWxsYmFja3MgZm9y
IHRlc3NlbGxhdGlvbiBvZiB0aGUgaW50ZXJpb3IgcmVnaW9uIG9mCisvLyB0aGUgY29udG91cnMu
CisKKy8vIFRoZSB1c2VyIGRhdGEgZm9yIHRoZSBHTFUgdGVzc2VsbGF0b3IuCitzdHJ1Y3QgVGVz
c2VsbGF0aW9uU3RhdGUgeworICAgIFRlc3NlbGxhdGlvblN0YXRlKExvb3BCbGlublBhdGhDYWNo
ZSYgaW5wdXRDYWNoZSkKKyAgICAgICAgOiBjYWNoZShpbnB1dENhY2hlKSB7IH0KKworICAgIExv
b3BCbGlublBhdGhDYWNoZSYgY2FjaGU7CisgICAgVmVjdG9yPHZvaWQqPiBhbGxvY2F0ZWRQb2lu
dGVyczsKK307CisKK3N0YXRpYyB2b2lkIHZlcnRleENhbGxiYWNrKHZvaWQqIHZlcnRleERhdGEs
IHZvaWQqIGRhdGEpCit7CisgICAgVGVzc2VsbGF0aW9uU3RhdGUqIHN0YXRlID0gc3RhdGljX2Nh
c3Q8VGVzc2VsbGF0aW9uU3RhdGUqPihkYXRhKTsKKyAgICBHTGRvdWJsZSogbG9jYXRpb24gPSBz
dGF0aWNfY2FzdDxHTGRvdWJsZSo+KHZlcnRleERhdGEpOworICAgIHN0YXRlLT5jYWNoZS5hZGRJ
bnRlcmlvclZlcnRleChzdGF0aWNfY2FzdDxmbG9hdD4obG9jYXRpb25bMF0pLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4obG9jYXRpb25bMV0p
KTsKK30KKworc3RhdGljIHZvaWQgY29tYmluZUNhbGxiYWNrKEdMZG91YmxlIGNvb3Jkc1szXSwg
dm9pZCogdmVydGV4RGF0YVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZsb2F0
IHdlaWdodFs0XSwgdm9pZCoqIG91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
dm9pZCogcG9seWdvbkRhdGEpCit7CisgICAgVGVzc2VsbGF0aW9uU3RhdGUqIHN0YXRlID0gc3Rh
dGljX2Nhc3Q8VGVzc2VsbGF0aW9uU3RhdGUqPihwb2x5Z29uRGF0YSk7CisgICAgR0xkb3VibGUq
IG91dFZlcnRleCA9IHN0YXRpY19jYXN0PEdMZG91YmxlKj4oZmFzdE1hbGxvYygzICogc2l6ZW9m
KEdMZG91YmxlKSkpOworICAgIHN0YXRlLT5hbGxvY2F0ZWRQb2ludGVycy5hcHBlbmQob3V0VmVy
dGV4KTsKKyAgICBvdXRWZXJ0ZXhbMF0gPSBjb29yZHNbMF07CisgICAgb3V0VmVydGV4WzFdID0g
Y29vcmRzWzFdOworICAgIG91dFZlcnRleFsyXSA9IGNvb3Jkc1syXTsKKyAgICAqb3V0RGF0YSA9
IG91dFZlcnRleDsKK30KKworc3RhdGljIHZvaWQgZWRnZUZsYWdDYWxsYmFjayhHTGJvb2xlYW4p
Cit7CisgICAgLy8gTm8tb3AganVzdCB0byBwcmV2ZW50IHRyaWFuZ2xlIHN0cmlwcyBhbmQgZmFu
cyBmcm9tIGJlaW5nIHBhc3NlZCB0byB1cy4KKyAgICAvLyBTZWUgdGhlIE9wZW5HTCBQcm9ncmFt
bWluZyBHdWlkZSwgQ2hhcHRlciAxMSwgIlRlc3NlbGxhdG9ycyBhbmQgUXVhZHJpY3MiLgorfQor
Cit9IC8vIGFub255bW91cyBuYW1lc3BhY2UKKwordm9pZCBMb29wQmxpbm5QYXRoUHJvY2Vzc29y
Ojp0ZXNzZWxsYXRlSW50ZXJpb3IoTG9vcEJsaW5uUGF0aENhY2hlJiBjYWNoZSkKK3sKKyAgICAv
LyBCZWNhdXNlIHRoZSBHTFUgdGVzc2VsbGF0b3IgcmVxdWlyZXMgaXRzIGlucHV0IGluCisgICAg
Ly8gZG91YmxlLXByZWNpc2lvbiBmb3JtYXQsIHdlIG5lZWQgdG8gbWFrZSBhIHNlcGFyYXRlIGNv
cHkgb2YgdGhlCisgICAgLy8gZGF0YS4KKyAgICBWZWN0b3I8R0xkb3VibGU+IHZlcnRleERhdGE7
CisgICAgVmVjdG9yPHNpemVfdD4gY29udG91ckVuZGluZ3M7CisgICAgLy8gRm9yIGF2b2lkaW5n
IGFkZGluZyBjb2luY2lkZW50IHZlcnRpY2VzLgorICAgIGZsb2F0IGN1clggPSAwLCBjdXJZID0g
MDsKKyAgICBmb3IgKFZlY3RvcjxDb250b3VyKj46Oml0ZXJhdG9yIGl0ZXIgPSBtX2NvbnRvdXJz
LmJlZ2luKCk7IGl0ZXIgIT0gbV9jb250b3Vycy5lbmQoKTsgKytpdGVyKSB7CisgICAgICAgIENv
bnRvdXIqIGN1ciA9ICppdGVyOworICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAg
Zm9yIChTZWdtZW50KiBzZWcgPSBjdXItPmJlZ2luKCk7IHNlZyAhPSBjdXItPmVuZCgpOyBzZWcg
PSBzZWctPm5leHQoKSkgeworICAgICAgICAgICAgaW50IG51bWJlck9mSW50ZXJpb3JWZXJ0aWNl
cyA9IHNlZy0+bnVtYmVyT2ZJbnRlcmlvclZlcnRpY2VzKCk7CisgICAgICAgICAgICBmb3IgKGlu
dCBpID0gMDsgaSA8IG51bWJlck9mSW50ZXJpb3JWZXJ0aWNlcyAtIDE7IGkrKykgeworICAgICAg
ICAgICAgICAgIEZsb2F0UG9pbnQgcG9pbnQgPSBzZWctPmdldEludGVyaW9yVmVydGV4KGkpOwor
ICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9
IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhEYXRhLmFwcGVuZChwb2ludC54KCkp
OworICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhEYXRhLmFwcGVuZChwb2ludC55KCkpOworICAg
ICAgICAgICAgICAgICAgICB2ZXJ0ZXhEYXRhLmFwcGVuZCgwKTsKKyAgICAgICAgICAgICAgICAg
ICAgY3VyWCA9IHBvaW50LngoKTsKKyAgICAgICAgICAgICAgICAgICAgY3VyWSA9IHBvaW50Lnko
KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBvaW50LngoKSAhPSBjdXJYIHx8IHBvaW50
LnkoKSAhPSBjdXJZKSAgeworICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhEYXRhLmFwcGVuZChw
b2ludC54KCkpOworICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhEYXRhLmFwcGVuZChwb2ludC55
KCkpOworICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhEYXRhLmFwcGVuZCgwKTsKKyAgICAgICAg
ICAgICAgICAgICAgY3VyWCA9IHBvaW50LngoKTsKKyAgICAgICAgICAgICAgICAgICAgY3VyWSA9
IHBvaW50LnkoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICAgICAgY29udG91ckVuZGluZ3MuYXBwZW5kKHZlcnRleERhdGEuc2l6ZSgpKTsKKyAgICB9
CisgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhbGwgb2YgdGhlIHZlcnRleCBkYXRhIGluIGEgc3Rh
YmxlIGxvY2F0aW9uIGluCisgICAgLy8gbWVtb3J5LCBjYWxsIHRoZSB0ZXNzZWxsYXRvci4KKyAg
ICBHTFV0ZXNzZWxhdG9yKiB0ZXNzID0gaW50ZXJuYWxfZ2x1TmV3VGVzcygpOworICAgIFRlc3Nl
bGxhdGlvblN0YXRlIHN0YXRlKGNhY2hlKTsKKyAgICBpbnRlcm5hbF9nbHVUZXNzQ2FsbGJhY2so
dGVzcywgR0xVX1RFU1NfVkVSVEVYX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHJlaW50ZXJwcmV0X2Nhc3Q8R0x2b2lkICgqKSgpPih2ZXJ0ZXhDYWxsYmFjaykpOworICAgIGlu
dGVybmFsX2dsdVRlc3NDYWxsYmFjayh0ZXNzLCBHTFVfVEVTU19DT01CSU5FX0RBVEEsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8R0x2b2lkICgqKSgpPihj
b21iaW5lQ2FsbGJhY2spKTsKKyAgICBpbnRlcm5hbF9nbHVUZXNzQ2FsbGJhY2sodGVzcywgR0xV
X1RFU1NfRURHRV9GTEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJl
dF9jYXN0PEdMdm9pZCAoKikoKT4oZWRnZUZsYWdDYWxsYmFjaykpOworICAgIGludGVybmFsX2ds
dVRlc3NCZWdpblBvbHlnb24odGVzcywgJnN0YXRlKTsKKyAgICBpbnRlcm5hbF9nbHVUZXNzQmVn
aW5Db250b3VyKHRlc3MpOworICAgIEdMZG91YmxlKiBiYXNlID0gdmVydGV4RGF0YS5kYXRhKCk7
CisgICAgaW50IGNvbnRvdXJJbmRleCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2
ZXJ0ZXhEYXRhLnNpemUoKTsgaSArPSAzKSB7CisgICAgICAgIGlmIChpID09IGNvbnRvdXJFbmRp
bmdzW2NvbnRvdXJJbmRleF0pIHsKKyAgICAgICAgICAgIGludGVybmFsX2dsdVRlc3NFbmRDb250
b3VyKHRlc3MpOworICAgICAgICAgICAgaW50ZXJuYWxfZ2x1VGVzc0JlZ2luQ29udG91cih0ZXNz
KTsKKyAgICAgICAgICAgICsrY29udG91ckluZGV4OworICAgICAgICB9CisgICAgICAgIGludGVy
bmFsX2dsdVRlc3NWZXJ0ZXgodGVzcywgJmJhc2VbaV0sICZiYXNlW2ldKTsKKyAgICB9CisgICAg
aW50ZXJuYWxfZ2x1VGVzc0VuZENvbnRvdXIodGVzcyk7CisgICAgaW50ZXJuYWxfZ2x1VGVzc0Vu
ZFBvbHlnb24odGVzcyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0ZS5hbGxvY2F0
ZWRQb2ludGVycy5zaXplKCk7IGkrKykKKyAgICAgICAgZmFzdEZyZWUoc3RhdGUuYWxsb2NhdGVk
UG9pbnRlcnNbaV0pOworICAgIGludGVybmFsX2dsdURlbGV0ZVRlc3ModGVzcyk7Cit9CisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2dwdS9Mb29wQmxpbm5QYXRoUHJvY2Vzc29yLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BCbGlublBhdGhQcm9jZXNzb3IuaAkocmV2
aXNpb24gMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxp
bm5QYXRoUHJvY2Vzc29yLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBB
TkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQK
KyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
Ly8gVGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIExvb3AgYW5kIEJsaW5uJ3MgR1BVIGFjY2VsZXJh
dGVkIGN1cnZlCisvLyByZW5kZXJpbmcgYWxnb3JpdGhtLgorCisjaWZuZGVmIExvb3BCbGlublBh
dGhQcm9jZXNzb3JfaAorI2RlZmluZSBMb29wQmxpbm5QYXRoUHJvY2Vzc29yX2gKKworI2luY2x1
ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CisjaW5j
bHVkZSA8d3RmL1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCisvLyBXZSB1c2UgYSBuYW1lc3BhY2UgZm9yIGNsYXNzZXMgd2hpY2ggYXJl
IHNpbXBseSBpbXBsZW1lbnRhdGlvbgorLy8gZGV0YWlscyBvZiB0aGUgYWxnb3JpdGhtIGJ1dCB3
aGljaCB3ZSBuZWVkIHRvIHJlZmVyZW5jZSBmcm9tIHRoZQorLy8gY2xhc3MgZGVmaW5pdGlvbi4K
K25hbWVzcGFjZSBMb29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRpb24geworCitjbGFz
cyBDb250b3VyOworY2xhc3MgU2VnbWVudDsKKworfSAvLyBuYW1lc3BhY2UgTG9vcEJsaW5uUGF0
aFByb2Nlc3NvckltcGxlbWVudGF0aW9uCisKK2NsYXNzIFBhdGg7CitjbGFzcyBMb29wQmxpbm5Q
YXRoQ2FjaGU7CitjbGFzcyBQT0RBcmVuYTsKKworLy8gVGhlIExvb3BCbGlublBhdGhQcm9jZXNz
b3IgdHVybnMgYSBQYXRoIChhc3N1bWVkIHRvIGNvbnRhaW4gb25lIG9yCisvLyBtb3JlIGNsb3Nl
ZCByZWdpb25zKSBpbnRvIGEgc2V0IG9mIGV4dGVyaW9yIGFuZCBpbnRlcmlvciB0cmlhbmdsZXMs
CisvLyBzdG9yZWQgaW4gdGhlIExvb3BCbGlublBhdGhDYWNoZS4gVGhlIGV4dGVyaW9yIHRyaWFu
Z2xlcyBoYXZlCisvLyBhc3NvY2lhdGVkIDNEIHRleHR1cmUgY29vcmRpbmF0ZXMgd2hpY2ggYXJl
IHVzZWQgdG8gZXZhbHVhdGUgdGhlCisvLyBjdXJ2ZSdzIGluc2lkZS9vdXRzaWRlIGZ1bmN0aW9u
IG9uIGEgcGVyLXBpeGVsIGJhc2lzLiBUaGUgaW50ZXJpb3IKKy8vIHRyaWFuZ2xlcyBhcmUgZmls
bGVkIHdpdGggMTAwJSBvcGFjaXR5LgorLy8KKy8vIE5vdGUgdGhhdCB0aGUgZmlsbCBzdHlsZSBh
bmQgbWFuYWdlbWVudCBvZiBtdWx0aXBsZSBsYXllcnMgYXJlCisvLyBzZXBhcmF0ZSBjb25jZXJu
cywgaGFuZGxlZCBhdCBhIGhpZ2hlciBsZXZlbCB3aXRoIHNoYWRlcnMgYW5kCisvLyBwb2x5Z29u
IG9mZnNldHMuCitjbGFzcyBMb29wQmxpbm5QYXRoUHJvY2Vzc29yIHsKK3B1YmxpYzoKKyAgICBM
b29wQmxpbm5QYXRoUHJvY2Vzc29yKCk7CisgICAgZXhwbGljaXQgTG9vcEJsaW5uUGF0aFByb2Nl
c3NvcihQYXNzUmVmUHRyPFBPREFyZW5hPik7CisgICAgfkxvb3BCbGlublBhdGhQcm9jZXNzb3Io
KTsKKworICAgIC8vIFRyYW5zZm9ybXMgdGhlIGdpdmVuIHBhdGggaW50byBhIHRyaWFuZ2xlIG1l
c2ggZm9yIHJlbmRlcmluZworICAgIC8vIHVzaW5nIExvb3AgYW5kIEJsaW5uJ3Mgc2hhZGVyLCBw
bGFjaW5nIHRoZSByZXN1bHQgaW50byB0aGUgZ2l2ZW4KKyAgICAvLyBMb29wQmxpbm5QYXRoQ2Fj
aGUuCisgICAgdm9pZCBwcm9jZXNzKGNvbnN0IFBhdGgmLCBMb29wQmxpbm5QYXRoQ2FjaGUmKTsK
KworI2lmbmRlZiBOREVCVUcKKyAgICAvLyBFbmFibGVzIG9yIGRpc2FibGVzIHZlcmJvc2UgbG9n
Z2luZyBpbiBkZWJ1ZyBtb2RlLgorICAgIHZvaWQgc2V0VmVyYm9zZUxvZ2dpbmcoYm9vbCBvbk9y
T2ZmKTsKKyNlbmRpZgorCitwcml2YXRlOgorICAgIC8vIEJ1aWxkcyBhIGxpc3Qgb2YgY29udG91
cnMgZm9yIHRoZSBnaXZlbiBwYXRoLgorICAgIHZvaWQgYnVpbGRDb250b3Vycyhjb25zdCBQYXRo
Jik7CisKKyAgICAvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGxlZnQgb3IgcmlnaHQgc2lkZSBv
ZiBlYWNoIGNvbnRvdXIgc2hvdWxkCisgICAgLy8gYmUgZmlsbGVkLgorICAgIHZvaWQgZGV0ZXJt
aW5lU2lkZXNUb0ZpbGwoKTsKKworICAgIC8vIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4g
KGNsb3NlZCkgY29udG91ciBpcyBvcmllbnRlZAorICAgIC8vIGNsb2Nrd2lzZSBvciBjb3VudGVy
Y2xvY2t3aXNlLgorICAgIHZvaWQgZGV0ZXJtaW5lT3JpZW50YXRpb24oTG9vcEJsaW5uUGF0aFBy
b2Nlc3NvckltcGxlbWVudGF0aW9uOjpDb250b3VyKik7CisKKyAgICAvLyBTdWJkaXZpZGVzIHRo
ZSBjdXJ2ZXMgc28gdGhhdCB0aGVyZSBhcmUgbm8gb3ZlcmxhcHMgb2YgdGhlCisgICAgLy8gdHJp
YW5nbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VydmVzJyBjb250cm9sIHBvaW50cy4KKyAgICB2
b2lkIHN1YmRpdmlkZUN1cnZlcygpOworCisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHVzZWQgZHVy
aW5nIGN1cnZlIHN1YmRpdmlzaW9uLgorICAgIHZvaWQgY29uZGl0aW9uYWxseVN1YmRpdmlkZShM
b29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRpb246OlNlZ21lbnQqLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxl
bWVudGF0aW9uOjpTZWdtZW50Kj4mIG5leHRTZWdtZW50cyk7CisKKyAgICAvLyBUZXNzZWxsYXRl
cyB0aGUgaW50ZXJpb3IgcmVnaW9ucyBvZiB0aGUgY29udG91cnMuCisgICAgdm9pZCB0ZXNzZWxs
YXRlSW50ZXJpb3IoTG9vcEJsaW5uUGF0aENhY2hlJik7CisKKyNpZm5kZWYgTkRFQlVHCisgICAg
Ly8gRm9yIGRlYnVnZ2luZyB0aGUgb3JpZW50YXRpb24gY29tcHV0YXRpb24uIFJldHVybnMgYWxs
IG9mIHRoZQorICAgIC8vIHNlZ21lbnRzIG92ZXJsYXBwaW5nIHRoZSBnaXZlbiBZIGNvb3JkaW5h
dGUuCisgICAgVmVjdG9yPExvb3BCbGlublBhdGhQcm9jZXNzb3JJbXBsZW1lbnRhdGlvbjo6U2Vn
bWVudCo+IGFsbFNlZ21lbnRzT3ZlcmxhcHBpbmdZKExvb3BCbGlublBhdGhQcm9jZXNzb3JJbXBs
ZW1lbnRhdGlvbjo6Q29udG91ciosIGZsb2F0IHgsIGZsb2F0IHkpOworCisgICAgLy8gRm9yIGRl
YnVnZ2luZyB0aGUgY3VydmUgc3ViZGl2aXNpb24gYWxnb3JpdGhtLiBTdWJkaXZpZGVzIHRoZQor
ICAgIC8vIGN1cnZlcyB1c2luZyBhbiBhbHRlcm5hdGUsIHNsb3cgKE8obl4zKSkgYWxnb3JpdGht
LgorICAgIHZvaWQgc3ViZGl2aWRlQ3VydmVzU2xvdygpOworI2VuZGlmCisKKyAgICAvLyBQT0RB
cmVuYSBmcm9tIHdoaWNoIHRvIGFsbG9jYXRlIHRlbXBvcmFyeSBvYmplY3RzLgorICAgIFJlZlB0
cjxQT0RBcmVuYT4gbV9hcmVuYTsKKworICAgIC8vIFRoZSBjb250b3VycyBkZXNjcmliZWQgYnkg
dGhlIHBhdGguCisgICAgVmVjdG9yPExvb3BCbGlublBhdGhQcm9jZXNzb3JJbXBsZW1lbnRhdGlv
bjo6Q29udG91cio+IG1fY29udG91cnM7CisKKyNpZm5kZWYgTkRFQlVHCisgICAgLy8gV2hldGhl
ciBvciBub3QgdG8gcGVyZm9ybSB2ZXJib3NlIGxvZ2dpbmcgaW4gZGVidWcgbW9kZS4KKyAgICBi
b29sIG1fdmVyYm9zZUxvZ2dpbmc7CisjZW5kaWYKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKKworI2VuZGlmIC8vIExvb3BCbGlublBhdGhQcm9jZXNzb3JfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>82037</attachid>
            <date>2011-02-10 13:37:31 -0800</date>
            <delta_ts>2011-02-10 13:43:56 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-45521-20110210133730.patch</filename>
            <type>text/plain</type>
            <size>58219</size>
            <attacher name="Kenneth Russell">kbr</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDc4MDA5KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNzYgQEAKKzIwMTEtMDItMDggIEtlbm5ldGgg
UnVzc2VsbCAgPGtickBnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIEluY29ycG9yYXRlIGFsZ29yaXRobSBmb3IgcHJvY2Vzc2luZyBw
YXRocyBpbnRvIEdQVS1yZW5kZXJhYmxlIHRyaWFuZ2xlIG1lc2hlcworICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDU1MjEKKworICAgICAgICBBZGRpbmcg
YW4gaW1wbGVtZW50YXRpb24gb2YgTG9vcCBhbmQgQmxpbm4ncyBHUFUgYWNjZWxlcmF0ZWQgcGF0
aAorICAgICAgICByZW5kZXJpbmcgYWxnb3JpdGhtIGZyb20gR1BVIEdlbXMgMy4gVGhpcyBpbXBs
ZW1lbnRhdGlvbiBwYXlzCisgICAgICAgIHBhcnRpY3VsYXIgYXR0ZW50aW9uIHRvIHRoZSBlZmZp
Y2llbmN5IG9mIHRoZSBjdXJ2ZSBzdWJkaXZpc2lvbgorICAgICAgICBwaGFzZSBuZWVkZWQgZm9y
IGNvcnJlY3QgcmVuZGVyaW5nLiBJdCB1dGlsaXplcyB0aGUgT3BlbkdMIHV0aWxpdHkKKyAgICAg
ICAgbGlicmFyeSB0ZXNzZWxsYXRvciBmb3IgdHJpYW5ndWxhdGlvbiBvZiB0aGUgaW50ZXJpb3Ig
b2YgdGhlCisgICAgICAgIHNoYXBlLiBUaGUgcmVnaW9ucyBoYW5kbGVkIGJ5IExvb3AgYW5kIEJs
aW5uJ3MgYWxnb3JpdGhtIGFyZQorICAgICAgICBoYW5kbGVkIGJ5IHRoZSBsb2NhbCB0cmlhbmd1
bGF0b3IgcHJldmlvdXNseSBpbmNvcnBvcmF0ZWQuCisKKyAgICAgICAgTm8gdGVzdHMgeWV0OyBw
aXhlbCB0ZXN0cyB3aWxsIGV2ZW50dWFsbHkgYmUgdXNlZCB0byB2ZXJpZnkgdGhpcworICAgICAg
ICBhbGdvcml0aG0gYW5kIHByZXZlbnQgcmVncmVzc2lvbnMuCisKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uUGF0aFByb2Nlc3Nvci5jcHA6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpTZWdtZW50
OjpTZWdtZW50KToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhQcm9jZXNzb3JJbXBs
ZW1lbnRhdGlvbjo6U2VnbWVudDo6c2V0dXApOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5u
UGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpTZWdtZW50OjpraW5kKToKKyAgICAgICAgKFdl
YkNvcmU6Okxvb3BCbGlublBhdGhQcm9jZXNzb3JJbXBsZW1lbnRhdGlvbjo6U2VnbWVudDo6Z2V0
UG9pbnQpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVu
dGF0aW9uOjpTZWdtZW50OjpuZXh0KToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhQ
cm9jZXNzb3JJbXBsZW1lbnRhdGlvbjo6U2VnbWVudDo6cHJldik6CisgICAgICAgIChXZWJDb3Jl
OjpMb29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRpb246OlNlZ21lbnQ6OnNldE5leHQp
OgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9u
OjpTZWdtZW50OjpzZXRQcmV2KToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhQcm9j
ZXNzb3JJbXBsZW1lbnRhdGlvbjo6U2VnbWVudDo6Y29udG91cik6CisgICAgICAgIChXZWJDb3Jl
OjpMb29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRpb246OlNlZ21lbnQ6OnN1YmRpdmlk
ZSk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRp
b246OlNlZ21lbnQ6OmJvdW5kaW5nQm94KToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBh
dGhQcm9jZXNzb3JJbXBsZW1lbnRhdGlvbjo6U2VnbWVudDo6bnVtQ3Jvc3NpbmdzRm9yWFJheSk6
CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRpb246
OlNlZ21lbnQ6Om51bWJlck9mVHJpYW5nbGVzKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlu
blBhdGhQcm9jZXNzb3JJbXBsZW1lbnRhdGlvbjo6U2VnbWVudDo6Z2V0VHJpYW5nbGUpOgorICAg
ICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpTZWdt
ZW50OjpudW1iZXJPZkludGVyaW9yVmVydGljZXMpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJs
aW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpTZWdtZW50OjpnZXRJbnRlcmlvclZlcnRl
eCk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRp
b246OlNlZ21lbnQ6Om1hcmtlZEZvclN1YmRpdmlzaW9uKToKKyAgICAgICAgKFdlYkNvcmU6Okxv
b3BCbGlublBhdGhQcm9jZXNzb3JJbXBsZW1lbnRhdGlvbjo6U2VnbWVudDo6c2V0TWFya2VkRm9y
U3ViZGl2aXNpb24pOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3Nvcklt
cGxlbWVudGF0aW9uOjpTZWdtZW50Ojp0b1N0cmluZyk6CisgICAgICAgIChXZWJDb3JlOjpMb29w
Qmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRpb246OlNlZ21lbnQ6OmNvbXB1dGVCb3VuZGlu
Z0JveCk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50
YXRpb246OkNvbnRvdXI6OkNvbnRvdXIpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0
aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpDb250b3VyOjphZGQpOgorICAgICAgICAoV2ViQ29y
ZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpDb250b3VyOjpzdWJkaXZp
ZGUpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0
aW9uOjpDb250b3VyOjpiZWdpbik6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJv
Y2Vzc29ySW1wbGVtZW50YXRpb246OkNvbnRvdXI6OmVuZCk6CisgICAgICAgIChXZWJDb3JlOjpM
b29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRpb246OkNvbnRvdXI6OmlzT3JpZW50ZWRD
b3VudGVyQ2xvY2t3aXNlKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhQcm9jZXNz
b3JJbXBsZW1lbnRhdGlvbjo6Q29udG91cjo6c2V0SXNPcmllbnRlZENvdW50ZXJDbG9ja3dpc2Up
OgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9u
OjpDb250b3VyOjpib3VuZGluZ0JveCk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRo
UHJvY2Vzc29ySW1wbGVtZW50YXRpb246OkNvbnRvdXI6OmZpbGxTaWRlKToKKyAgICAgICAgKFdl
YkNvcmU6Okxvb3BCbGlublBhdGhQcm9jZXNzb3JJbXBsZW1lbnRhdGlvbjo6Q29udG91cjo6c2V0
RmlsbFNpZGUpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxl
bWVudGF0aW9uOjpTZWdtZW50Ojp0cmlhbmd1bGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpMb29w
Qmxpbm5QYXRoUHJvY2Vzc29yOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29yKToKKyAgICAgICAgKFdl
YkNvcmU6Okxvb3BCbGlublBhdGhQcm9jZXNzb3I6On5Mb29wQmxpbm5QYXRoUHJvY2Vzc29yKToK
KyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhQcm9jZXNzb3I6OnByb2Nlc3MpOgorICAg
ICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3Nvcjo6YnVpbGRDb250b3Vycyk6Cisg
ICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29yOjphbGxTZWdtZW50c092ZXJs
YXBwaW5nWSk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29yOjpkZXRl
cm1pbmVTaWRlc1RvRmlsbCk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vz
c29yOjpkZXRlcm1pbmVPcmllbnRhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpTd2VlcERhdGE6
OlN3ZWVwRXZlbnQ6OlN3ZWVwRXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6U3dlZXBEYXRhOjpT
d2VlcEV2ZW50OjpzZXR1cCk6CisgICAgICAgIChXZWJDb3JlOjpTd2VlcERhdGE6OlN3ZWVwRXZl
bnQ6OngpOgorICAgICAgICAoV2ViQ29yZTo6U3dlZXBEYXRhOjpTd2VlcEV2ZW50OjplbnRyeSk6
CisgICAgICAgIChXZWJDb3JlOjpTd2VlcERhdGE6OlN3ZWVwRXZlbnQ6OmludGVydmFsKToKKyAg
ICAgICAgKFdlYkNvcmU6OlN3ZWVwRGF0YTo6U3dlZXBFdmVudDo6b3BlcmF0b3I8KToKKyAgICAg
ICAgKFdlYkNvcmU6OlN3ZWVwRGF0YTo6dHJpYW5nbGVzT3ZlcmxhcCk6CisgICAgICAgIChXZWJD
b3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29yOjpzdWJkaXZpZGVDdXJ2ZXMpOgorICAgICAgICAo
V2ViQ29yZTo6TG9vcEJsaW5uUGF0aFByb2Nlc3Nvcjo6Y29uZGl0aW9uYWxseVN1YmRpdmlkZSk6
CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5QYXRoUHJvY2Vzc29yOjpzdWJkaXZpZGVDdXJ2
ZXNTbG93KToKKyAgICAgICAgKFdlYkNvcmU6OlRlc3NlbGxhdGlvblN0YXRlOjp2ZXJ0ZXhDYWxs
YmFjayk6CisgICAgICAgIChXZWJDb3JlOjpUZXNzZWxsYXRpb25TdGF0ZTo6Y29tYmluZUNhbGxi
YWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlRlc3NlbGxhdGlvblN0YXRlOjplZGdlRmxhZ0NhbGxi
YWNrKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlublBhdGhQcm9jZXNzb3I6OnRlc3NlbGxh
dGVJbnRlcmlvcik6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BCbGlublBh
dGhQcm9jZXNzb3IuaDogQWRkZWQuCisKIDIwMTEtMDItMDggIFNhbSBXZWluaWcgIDxzYW1Ad2Vi
a2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBNYWNpZWogU3RhY2hvd2lhay4KSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5QYXRoUHJvY2Vz
c29yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9n
cHUvTG9vcEJsaW5uUGF0aFByb2Nlc3Nvci5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uUGF0aFByb2Nlc3Nvci5jcHAJKHJl
dmlzaW9uIDApCkBAIC0wLDAgKzEsMTIyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBH
b29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
ICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMg
IkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisg
KiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KworI2luY2x1ZGUgIkxvb3BCbGlublBhdGhQcm9jZXNzb3IuaCIKKworI2luY2x1ZGUgIkZsb2F0
UG9pbnQuaCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJMb29wQmxpbm5DbGFz
c2lmaWVyLmgiCisjaW5jbHVkZSAiTG9vcEJsaW5uQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAiTG9v
cEJsaW5uTG9jYWxUcmlhbmd1bGF0b3IuaCIKKyNpbmNsdWRlICJMb29wQmxpbm5NYXRoVXRpbHMu
aCIKKyNpbmNsdWRlICJMb29wQmxpbm5QYXRoQ2FjaGUuaCIKKyNpbmNsdWRlICJMb29wQmxpbm5U
ZXh0dXJlQ29vcmRzLmgiCisjaW5jbHVkZSAiUE9EQXJlbmEuaCIKKyNpbmNsdWRlICJQT0RJbnRl
cnZhbFRyZWUuaCIKKyNpbmNsdWRlICJQYXRoLmgiCisjaW5jbHVkZSAiaW50ZXJuYWxfZ2x1Lmgi
CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CisjaW5j
bHVkZSA8d3RmL0Zhc3RNYWxsb2MuaD4KKworI2lmIFBMQVRGT1JNKFNLSUEpCisjaW5jbHVkZSAi
U2tHZW9tZXRyeS5oIgorI2luY2x1ZGUgIlNrUGF0aC5oIgorI2luY2x1ZGUgIlNrU2NhbGFyLmgi
CisjZWxzZQorLy8gTXVzdCBwb3J0IHRvIHlvdXIgcGxhdGZvcm0uCisjZW5kaWYKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCit1c2luZyBMb29wQmxpbm5NYXRoVXRpbHM6OlhSYXk7Cit1c2luZyBM
b29wQmxpbm5NYXRoVXRpbHM6OmNob3BDdWJpY0F0OwordXNpbmcgTG9vcEJsaW5uTWF0aFV0aWxz
OjpudW1YUmF5Q3Jvc3NpbmdzRm9yQ3ViaWM7Cit1c2luZyBMb29wQmxpbm5NYXRoVXRpbHM6OnRy
aWFuZ2xlc092ZXJsYXA7Cit1c2luZyBMb29wQmxpbm5NYXRoVXRpbHM6OnhSYXlDcm9zc2VzTGlu
ZTsKK3VzaW5nIExvb3BCbGlublBhdGhQcm9jZXNzb3JJbXBsZW1lbnRhdGlvbjo6Q29udG91cjsK
K3VzaW5nIExvb3BCbGlublBhdGhQcm9jZXNzb3JJbXBsZW1lbnRhdGlvbjo6U2VnbWVudDsKKwor
bmFtZXNwYWNlIHsKKworI2lmbmRlZiBOREVCVUcKK1N0cmluZyB2YWx1ZVRvU3RyaW5nKGNvbnN0
IEZsb2F0UmVjdCYgYXJnKQoreworICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlcjsKKyAgICBidWls
ZGVyLmFwcGVuZCgiW0Zsb2F0UmVjdCB4PSIpOworICAgIGJ1aWxkZXIuYXBwZW5kKFN0cmluZzo6
bnVtYmVyKGFyZy54KCkpKTsKKyAgICBidWlsZGVyLmFwcGVuZCgiIHk9Iik7CisgICAgYnVpbGRl
ci5hcHBlbmQoU3RyaW5nOjpudW1iZXIoYXJnLnkoKSkpOworICAgIGJ1aWxkZXIuYXBwZW5kKCIg
bWF4WD0iKTsKKyAgICBidWlsZGVyLmFwcGVuZChTdHJpbmc6Om51bWJlcihhcmcubWF4WCgpKSk7
CisgICAgYnVpbGRlci5hcHBlbmQoIiBtYXhZPSIpOworICAgIGJ1aWxkZXIuYXBwZW5kKFN0cmlu
Zzo6bnVtYmVyKGFyZy5tYXhZKCkpKTsKKyAgICBidWlsZGVyLmFwcGVuZCgiXSIpOworICAgIHJl
dHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Cit9CisjZW5kaWYKKworc3RydWN0IFN3ZWVwRGF0YTsK
KworfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK25hbWVzcGFjZSBMb29wQmxpbm5QYXRoUHJv
Y2Vzc29ySW1wbGVtZW50YXRpb24geworY2xhc3MgU2VnbWVudDsKK30KKworI2lmbmRlZiBOREVC
VUcKKy8vIFJvdXRpbmVzIG5lZWRlZCB0byBwcmludCB0aGUgdHlwZXMgb2YgSW50ZXJ2YWxOb2Rl
cyB3ZSBpbnN0YW50aWF0ZQorLy8gaW4gdGhpcyBmaWxlLgordGVtcGxhdGUgPD4KK3N0cnVjdCBW
YWx1ZVRvU3RyaW5nPGZsb2F0PiB7CisgICAgc3RhdGljIFN0cmluZyBzdHJpbmcoY29uc3QgZmxv
YXQmIHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzo6bnVtYmVyKHZhbHVlKTsK
KyAgICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFZhbHVlVG9TdHJpbmc8U3dlZXBEYXRh
Kj4geworICAgIHN0YXRpYyBTdHJpbmcgc3RyaW5nKFN3ZWVwRGF0YSogY29uc3QmIHZhbHVlKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzo6Zm9ybWF0KCIweCVwIiwgdmFsdWUpOworICAg
IH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgVmFsdWVUb1N0cmluZzxMb29wQmxpbm5QYXRo
UHJvY2Vzc29ySW1wbGVtZW50YXRpb246OlNlZ21lbnQqPiB7CisgICAgc3RhdGljIFN0cmluZyBz
dHJpbmcoTG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpTZWdtZW50KiBjb25z
dCYgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gU3RyaW5nOjpmb3JtYXQoIjB4JXAiLCB2
YWx1ZSk7CisgICAgfQorfTsKKyNlbmRpZgorCituYW1lc3BhY2UgTG9vcEJsaW5uUGF0aFByb2Nl
c3NvckltcGxlbWVudGF0aW9uIHsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTZWdtZW50CisvLwor
CisvLyBEZXNjcmliZXMgYSBzZWdtZW50IG9mIHRoZSBwYXRoOiBlaXRoZXIgYSBjdWJpYyBvciBh
IGxpbmUgc2VnbWVudC4KKy8vIFRoZXNlIGFyZSBzdG9yZWQgaW4gYSBkb3VibHkgbGlua2VkIGxp
c3QgdG8gc3BlZWQgdXAgY3VydmUKKy8vIHN1YmRpdmlzaW9uLCB3aGljaCBvY2N1cnMgZHVlIHRv
IGVpdGhlciByZW5kZXJpbmcgYXJ0aWZhY3RzIGluIHRoZQorLy8gbG9vcCBjYXNlIG9yIGR1ZSB0
byBvdmVybGFwcGluZyB0cmlhbmdsZXMuCitjbGFzcyBTZWdtZW50IHsKKyAgICBXVEZfTUFLRV9O
T05DT1BZQUJMRShTZWdtZW50KTsKK3B1YmxpYzoKKyAgICBlbnVtIEtpbmQgeworICAgICAgICBD
dWJpYywKKyAgICAgICAgTGluZQorICAgIH07CisKKyAgICAvLyBOby1hcmd1bWVudCBjb25zdHJ1
Y3RvciBhbGxvd3MgY29uc3RydWN0aW9uIGJ5IHRoZSBQT0RBcmVuYSBjbGFzcy4KKyAgICBTZWdt
ZW50KCkKKyAgICAgICAgIDogbV9hcmVuYSgwKQorICAgICAgICAgLCBtX2tpbmQoQ3ViaWMpCisg
ICAgICAgICAsIG1fcHJldigwKQorICAgICAgICAgLCBtX25leHQoMCkKKyAgICAgICAgICwgbV9j
b250b3VyKDApCisgICAgICAgICAsIG1fdHJpYW5ndWxhdG9yKDApCisgICAgICAgICAsIG1fbWFy
a2VkRm9yU3ViZGl2aXNpb24oZmFsc2UpCisgICAgeworICAgIH0KKworICAgIC8vIEluaXRpYWxp
emVyIGZvciBjdWJpYyBjdXJ2ZSBzZWdtZW50cy4KKyAgICB2b2lkIHNldHVwKFBPREFyZW5hKiBh
cmVuYSwKKyAgICAgICAgICAgICAgIENvbnRvdXIqIGNvbnRvdXIsCisgICAgICAgICAgICAgICBG
bG9hdFBvaW50IGNwMCwKKyAgICAgICAgICAgICAgIEZsb2F0UG9pbnQgY3AxLAorICAgICAgICAg
ICAgICAgRmxvYXRQb2ludCBjcDIsCisgICAgICAgICAgICAgICBGbG9hdFBvaW50IGNwMykKKyAg
ICB7CisgICAgICAgIG1fYXJlbmEgPSBhcmVuYTsKKyAgICAgICAgbV9jb250b3VyID0gY29udG91
cjsKKyAgICAgICAgbV9raW5kID0gQ3ViaWM7CisgICAgICAgIG1fcG9pbnRzWzBdID0gY3AwOwor
ICAgICAgICBtX3BvaW50c1sxXSA9IGNwMTsKKyAgICAgICAgbV9wb2ludHNbMl0gPSBjcDI7Cisg
ICAgICAgIG1fcG9pbnRzWzNdID0gY3AzOworICAgICAgICBjb21wdXRlQm91bmRpbmdCb3goKTsK
KyAgICB9CisKKyAgICAvLyBJbml0aWFsaXplciBmb3IgbGluZSBzZWdtZW50cy4KKyAgICB2b2lk
IHNldHVwKFBPREFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgIENvbnRvdXIqIGNvbnRvdXIs
CisgICAgICAgICAgICAgICBGbG9hdFBvaW50IHAwLAorICAgICAgICAgICAgICAgRmxvYXRQb2lu
dCBwMSkKKyAgICB7CisgICAgICAgIG1fYXJlbmEgPSBhcmVuYTsKKyAgICAgICAgbV9jb250b3Vy
ID0gY29udG91cjsKKyAgICAgICAgbV9raW5kID0gTGluZTsKKyAgICAgICAgbV9wb2ludHNbMF0g
PSBwMDsKKyAgICAgICAgbV9wb2ludHNbMV0gPSBwMTsKKyAgICAgICAgY29tcHV0ZUJvdW5kaW5n
Qm94KCk7CisgICAgfQorCisgICAgS2luZCBraW5kKCkgY29uc3QgeyByZXR1cm4gbV9raW5kOyB9
CisKKyAgICAvLyBSZXR1cm5zIHRoZSBpJ3RoIGNvbnRyb2wgcG9pbnQsIDAgPD0gaSA8IDQuCisg
ICAgY29uc3QgRmxvYXRQb2ludCYgZ2V0UG9pbnQoaW50IGkpCisgICAgeworICAgICAgICBBU1NF
UlQoaSA+PSAwICYmIGkgPCA0KTsKKyAgICAgICAgcmV0dXJuIG1fcG9pbnRzW2ldOworICAgIH0K
KworICAgIFNlZ21lbnQqIG5leHQoKSBjb25zdCB7IHJldHVybiBtX25leHQ7IH0KKyAgICBTZWdt
ZW50KiBwcmV2KCkgY29uc3QgeyByZXR1cm4gbV9wcmV2OyB9CisKKyAgICB2b2lkIHNldE5leHQo
U2VnbWVudCogbmV4dCkgeyBtX25leHQgPSBuZXh0OyB9CisgICAgdm9pZCBzZXRQcmV2KFNlZ21l
bnQqIHByZXYpIHsgbV9wcmV2ID0gcHJldjsgfQorCisgICAgLy8gVGhlIGNvbnRvdXIgdGhpcyBz
ZWdtZW50IGJlbG9uZ3MgdG8uCisgICAgQ29udG91ciogY29udG91cigpIGNvbnN0IHsgcmV0dXJu
IG1fY29udG91cjsgfQorCisgICAgLy8gU3ViZGl2aWRlcyB0aGUgY3VycmVudCBzZWdtZW50IGF0
IHRoZSBnaXZlbiBwYXJhbWV0ZXIgdmFsdWUgKDAgPD0KKyAgICAvLyB0IDw9IDEpIGFuZCByZXBs
YWNlcyBpdCB3aXRoIHRoZSB0d28gbmV3bHkgY3JlYXRlZCBTZWdtZW50cyBpbgorICAgIC8vIHRo
ZSBsaW5rZWQgbGlzdCwgaWYgcG9zc2libGUuIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBsZWZ0
bW9zdAorICAgIC8vIFNlZ21lbnQuCisgICAgU2VnbWVudCogc3ViZGl2aWRlKGZsb2F0IHBhcmFt
KQorICAgIHsKKyAgICAgICAgRmxvYXRQb2ludCBkc3RbN107CisgICAgICAgIGNob3BDdWJpY0F0
KG1fcG9pbnRzLCBkc3QsIHBhcmFtKTsKKyAgICAgICAgU2VnbWVudCogbGVmdCA9IG1fYXJlbmEt
PmFsbG9jYXRlT2JqZWN0PFNlZ21lbnQ+KCk7CisgICAgICAgIFNlZ21lbnQqIHJpZ2h0ID0gbV9h
cmVuYS0+YWxsb2NhdGVPYmplY3Q8U2VnbWVudD4oKTsKKyAgICAgICAgbGVmdC0+c2V0dXAobV9h
cmVuYSwgbV9jb250b3VyLCBkc3RbMF0sIGRzdFsxXSwgZHN0WzJdLCBkc3RbM10pOworICAgICAg
ICByaWdodC0+c2V0dXAobV9hcmVuYSwgbV9jb250b3VyLCBkc3RbM10sIGRzdFs0XSwgZHN0WzVd
LCBkc3RbNl0pOworICAgICAgICBsZWZ0LT5zZXROZXh0KHJpZ2h0KTsKKyAgICAgICAgcmlnaHQt
PnNldFByZXYobGVmdCk7CisgICAgICAgIC8vIFRyeSB0byBzZXQgdXAgYSBsaW5rIGJldHdlZW4g
InRoaXMtPnByZXYoKSIgYW5kICJsZWZ0Ii4KKyAgICAgICAgaWYgKHByZXYoKSkgeworICAgICAg
ICAgICAgbGVmdC0+c2V0UHJldihwcmV2KCkpOworICAgICAgICAgICAgcHJldigpLT5zZXROZXh0
KGxlZnQpOworICAgICAgICB9CisgICAgICAgIC8vIFRyeSB0byBzZXQgdXAgYSBsaW5rIGJldHdl
ZW4gInRoaXMtPm5leHQoKSIgYW5kICJyaWdodCIuCisgICAgICAgIFNlZ21lbnQqIG4gPSBuZXh0
KCk7CisgICAgICAgIGlmIChuKSB7CisgICAgICAgICAgICByaWdodC0+c2V0TmV4dChuKTsKKyAg
ICAgICAgICAgIG4tPnNldFByZXYocmlnaHQpOworICAgICAgICB9CisgICAgICAgIC8vIFNldCB1
cCBhIGxpbmsgYmV0d2VlbiAidGhpcyIgYW5kICJsZWZ0IjsgdGhpcyBpcyBvbmx5IHRvCisgICAg
ICAgIC8vIHByb3ZpZGUgYSBjZXJ0YWluIGFtb3VudCBvZiBjb250aW51aXR5IGR1cmluZyBmb3J3
YXJkIGl0ZXJhdGlvbi4KKyAgICAgICAgc2V0TmV4dChsZWZ0KTsKKyAgICAgICAgcmV0dXJuIGxl
ZnQ7CisgICAgfQorCisgICAgLy8gU3ViZGl2aWRlcyB0aGUgY3VycmVudCBzZWdtZW50IGF0IHRo
ZSBoYWxmd2F5IHBvaW50IGFuZCByZXBsYWNlcworICAgIC8vIGl0IHdpdGggdGhlIHR3byBuZXds
eSBjcmVhdGVkIFNlZ21lbnRzIGluIHRoZSBsaW5rZWQgbGlzdCwgaWYKKyAgICAvLyBwb3NzaWJs
ZS4gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGxlZnRtb3N0IFNlZ21lbnQuCisgICAgU2VnbWVu
dCogc3ViZGl2aWRlKCkgeyByZXR1cm4gc3ViZGl2aWRlKDAuNWYpOyB9CisKKyAgICBjb25zdCBG
bG9hdFJlY3QmIGJvdW5kaW5nQm94KCkgY29uc3QgeyByZXR1cm4gbV9ib3VuZGluZ0JveDsgfQor
CisgICAgLy8gQ29tcHV0ZXMgdGhlIG51bWJlciBvZiB0aW1lcyBhIHF1ZXJ5IGxpbmUgc3RhcnRp
bmcgYXQgdGhlIGdpdmVuCisgICAgLy8gcG9pbnQgYW5kIGV4dGVuZGluZyB0byB4PStpbmZpbml0
eSBjcm9zc2VzIHRoaXMgc2VnbWVudC4gT3V0Z29pbmcKKyAgICAvLyAiYW1iaWd1b3VzIiBhcmd1
bWVudCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgcXVlcnkgaW50ZXJzZWN0ZWQgYW4KKyAgICAvLyBl
bmRwb2ludCBvciB0YW5nZW50IHBvaW50IG9mIHRoZSBzZWdtZW50LCBpbmRpY2F0aW5nIHRoYXQg
YW5vdGhlcgorICAgIC8vIHF1ZXJ5IHBvaW50IGlzIHByZWZlcnJlZC4KKyAgICBpbnQgbnVtQ3Jv
c3NpbmdzRm9yWFJheShjb25zdCBYUmF5JiB4UmF5LCBib29sJiBhbWJpZ3VvdXMpIGNvbnN0Cisg
ICAgeworICAgICAgICBpZiAobV9raW5kID09IEN1YmljKQorICAgICAgICAgICAgLy8gU2hvdWxk
IGNvbnNpZGVyIGNhY2hpbmcgdGhlIG1vbm90b25pYyBjdWJpY3MuCisgICAgICAgICAgICByZXR1
cm4gbnVtWFJheUNyb3NzaW5nc0ZvckN1YmljKHhSYXksIG1fcG9pbnRzLCBhbWJpZ3VvdXMpOwor
CisgICAgICAgIHJldHVybiB4UmF5Q3Jvc3Nlc0xpbmUoeFJheSwgbV9wb2ludHMsIGFtYmlndW91
cykgPyAxIDogMDsKKyAgICB9CisKKyAgICAvLyBQZXJmb3JtcyBhIGxvY2FsIHRyaWFuZ3VsYXRp
b24gb2YgdGhlIGNvbnRyb2wgcG9pbnRzIGluIHRoaXMKKyAgICAvLyBzZWdtZW50LiBUaGlzIG9w
ZXJhdGlvbiBvbmx5IG1ha2VzIHNlbnNlIGZvciBjdWJpYyB0eXBlIHNlZ21lbnRzLgorICAgIC8v
IHRleENvb3JkcyBtYXkgYmUgbnVsbCB3aGVuIHRoZSBrbG0gY29vcmRpbmF0ZXMgaGF2ZSBub3Qg
YmVlbgorICAgIC8vIGNvbXB1dGVkIHlldC4KKyAgICB2b2lkIHRyaWFuZ3VsYXRlKExvb3BCbGlu
bkxvY2FsVHJpYW5ndWxhdG9yOjpJbnNpZGVFZGdlQ29tcHV0YXRpb24gY29tcHV0ZUluc2lkZUVk
Z2VzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcEJsaW5uVGV4dHVyZUNvb3Jkczo6
UmVzdWx0KiB0ZXhDb29yZHMpOworCisgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbnRy
b2wgcG9pbnQgdHJpYW5nbGVzIGFzc29jaWF0ZWQgd2l0aAorICAgIC8vIHRoaXMgc2VnbWVudC4K
KyAgICBpbnQgbnVtYmVyT2ZUcmlhbmdsZXMoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKCFt
X3RyaWFuZ3VsYXRvcikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gbV90
cmlhbmd1bGF0b3ItPm51bWJlck9mVHJpYW5nbGVzKCk7CisgICAgfQorCisgICAgLy8gRmV0Y2hl
cyB0aGUgZ2l2ZW4gY29udHJvbCBwb2ludCB0cmlhbmdsZSBmb3IgdGhpcyBzZWdtZW50LgorICAg
IExvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpUcmlhbmdsZSogZ2V0VHJpYW5nbGUoaW50IGlu
ZGV4KQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fdHJpYW5ndWxhdG9yKTsKKyAgICAgICAgcmV0
dXJuIG1fdHJpYW5ndWxhdG9yLT5nZXRUcmlhbmdsZShpbmRleCk7CisgICAgfQorCisgICAgLy8g
TnVtYmVyIG9mIHZlcnRpY2VzIGFsb25nIHRoZSBpbnNpZGUgZWRnZSBvZiB0aGlzIHNlZ21lbnQu
IFRoaXMKKyAgICAvLyBjYW4gYmUgY2FsbGVkIGVpdGhlciBmb3IgbGluZSBvciBjdWJpYyB0eXBl
IHNlZ21lbnRzLgorICAgIGludCBudW1iZXJPZkludGVyaW9yVmVydGljZXMoKSBjb25zdAorICAg
IHsKKyAgICAgICAgaWYgKG1fa2luZCA9PSBDdWJpYykgeworICAgICAgICAgICAgaWYgKG1fdHJp
YW5ndWxhdG9yKQorICAgICAgICAgICAgICAgIHJldHVybiBtX3RyaWFuZ3VsYXRvci0+bnVtYmVy
T2ZJbnRlcmlvclZlcnRpY2VzKCk7CisKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9
CisKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorCisgICAgLy8gUmV0dXJucyB0aGUgZ2l2ZW4g
aW50ZXJpb3IgdmVydGV4LCAwIDw9IGluZGV4IDwgbnVtYmVyT2ZJbnRlcmlvclZlcnRpY2VzKCku
CisgICAgRmxvYXRQb2ludCBnZXRJbnRlcmlvclZlcnRleChpbnQgaW5kZXgpIGNvbnN0CisgICAg
eworICAgICAgICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IG51bWJlck9mSW50ZXJpb3JW
ZXJ0aWNlcygpKTsKKyAgICAgICAgaWYgKG1fa2luZCA9PSBDdWJpYykgeworICAgICAgICAgICAg
RmxvYXRQb2ludCByZXM7CisgICAgICAgICAgICBpZiAobV90cmlhbmd1bGF0b3IpIHsKKyAgICAg
ICAgICAgICAgICBMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6VmVydGV4KiB2ZXJ0ZXggPSBt
X3RyaWFuZ3VsYXRvci0+Z2V0SW50ZXJpb3JWZXJ0ZXgoaW5kZXgpOworICAgICAgICAgICAgICAg
IGlmICh2ZXJ0ZXgpCisgICAgICAgICAgICAgICAgICAgIHJlcy5zZXQodmVydGV4LT54eUNvb3Jk
aW5hdGVzKCkueCgpLCB2ZXJ0ZXgtPnh5Q29vcmRpbmF0ZXMoKS55KCkpOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBt
X3BvaW50c1tpbmRleF07CisgICAgfQorCisgICAgLy8gU3RhdGUgdG8gYXNzaXN0IHdpdGggY3Vy
dmUgc3ViZGl2aXNpb24uCisgICAgYm9vbCBtYXJrZWRGb3JTdWJkaXZpc2lvbigpIGNvbnN0IHsg
cmV0dXJuIG1fbWFya2VkRm9yU3ViZGl2aXNpb247IH0KKyAgICB2b2lkIHNldE1hcmtlZEZvclN1
YmRpdmlzaW9uKGJvb2wgbWFya2VkRm9yU3ViZGl2aXNpb24pIHsgbV9tYXJrZWRGb3JTdWJkaXZp
c2lvbiA9IG1hcmtlZEZvclN1YmRpdmlzaW9uOyB9CisKKyNpZm5kZWYgTkRFQlVHCisgICAgLy8g
U3VwcHBvcnQgZm9yIHByaW50aW5nIFNlZ21lbnRzLgorICAgIFN0cmluZyB0b1N0cmluZygpIGNv
bnN0CisgICAgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXI7CisgICAgICAgIGJ1aWxk
ZXIuYXBwZW5kKCJbU2VnbWVudCBraW5kPSIpOworICAgICAgICBidWlsZGVyLmFwcGVuZChraW5k
KCkgPT0gTGluZSA/ICJsaW5lIiA6ICJjdWJpYyIpOworICAgICAgICBidWlsZGVyLmFwcGVuZCgi
IGJvdW5kaW5nQm94PSIpOworICAgICAgICBidWlsZGVyLmFwcGVuZCh2YWx1ZVRvU3RyaW5nKGJv
dW5kaW5nQm94KCkpKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIiBjb250b3VyPTB4Iik7Cisg
ICAgICAgIGJ1aWxkZXIuYXBwZW5kKFN0cmluZzo6Zm9ybWF0KCIlcCIsIGNvbnRvdXIoKSkpOwor
ICAgICAgICBidWlsZGVyLmFwcGVuZCgiIG1hcmtlZEZvclN1YmRpdmlzaW9uPSIpOworICAgICAg
ICBidWlsZGVyLmFwcGVuZChtYXJrZWRGb3JTdWJkaXZpc2lvbigpID8gInRydWUiIDogImZhbHNl
Iik7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiBidWlsZGVy
LnRvU3RyaW5nKCk7CisgICAgfQorI2VuZGlmCisKKyBwcml2YXRlOgorICAgIC8vIENvbXB1dGVz
IHRoZSBib3VuZGluZyBib3ggb2YgdGhpcyBTZWdtZW50LgorICAgIHZvaWQgY29tcHV0ZUJvdW5k
aW5nQm94KCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAobV9raW5kKSB7CisgICAgICAgIGNhc2Ug
Q3ViaWM6CisgICAgICAgICAgICBtX2JvdW5kaW5nQm94LmZpdFRvUG9pbnRzKG1fcG9pbnRzWzBd
LCBtX3BvaW50c1sxXSwgbV9wb2ludHNbMl0sIG1fcG9pbnRzWzNdKTsKKyAgICAgICAgICAgIGJy
ZWFrOworCisgICAgICAgIGNhc2UgTGluZToKKyAgICAgICAgICAgIG1fYm91bmRpbmdCb3guZml0
VG9Qb2ludHMobV9wb2ludHNbMF0sIG1fcG9pbnRzWzFdKTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICB9CisgICAgfQorCisgICAgUE9EQXJlbmEqIG1fYXJlbmE7CisgICAgS2luZCBtX2tp
bmQ7CisgICAgRmxvYXRQb2ludCBtX3BvaW50c1s0XTsKKyAgICBTZWdtZW50KiBtX3ByZXY7Cisg
ICAgU2VnbWVudCogbV9uZXh0OworICAgIENvbnRvdXIqIG1fY29udG91cjsKKyAgICBGbG9hdFJl
Y3QgbV9ib3VuZGluZ0JveDsKKyAgICBMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvciogbV90cmlh
bmd1bGF0b3I7CisgICAgYm9vbCBtX21hcmtlZEZvclN1YmRpdmlzaW9uOworfTsKKworLy8tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCisvLyBDb250b3VyCisvLworCisvLyBEZXNjcmliZXMgYSBjbG9zZWQgY29udG91
ciBvZiB0aGUgcGF0aC4KK2NsYXNzIENvbnRvdXIgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxF
KENvbnRvdXIpOworcHVibGljOgorICAgIENvbnRvdXIoKQorICAgIHsKKyAgICAgICAgbV9maXJz
dCA9ICZtX3NlbnRpbmVsOworICAgICAgICBtX2ZpcnN0LT5zZXROZXh0KG1fZmlyc3QpOworICAg
ICAgICBtX2ZpcnN0LT5zZXRQcmV2KG1fZmlyc3QpOworICAgICAgICBtX2lzT3JpZW50ZWRDb3Vu
dGVyQ2xvY2t3aXNlID0gdHJ1ZTsKKyAgICAgICAgbV9ib3VuZGluZ0JveERpcnR5ID0gZmFsc2U7
CisgICAgICAgIG1fZmlsbFNpZGUgPSBMb29wQmxpbm5Db25zdGFudHM6OlJpZ2h0U2lkZTsKKyAg
ICB9CisKKyAgICB2b2lkIGFkZChTZWdtZW50KiBzZWdtZW50KQorICAgIHsKKyAgICAgICAgaWYg
KG1fZmlyc3QgPT0gJm1fc2VudGluZWwpIHsKKyAgICAgICAgICAgIC8vIEZpcnN0IGVsZW1lbnQg
aXMgdGhlIHNlbnRpbmVsLiBSZXBsYWNlIGl0IHdpdGggdGhlIGluY29taW5nCisgICAgICAgICAg
ICAvLyBzZWdtZW50LgorICAgICAgICAgICAgc2VnbWVudC0+c2V0TmV4dChtX2ZpcnN0KTsKKyAg
ICAgICAgICAgIHNlZ21lbnQtPnNldFByZXYobV9maXJzdCk7CisgICAgICAgICAgICBtX2ZpcnN0
LT5zZXROZXh0KHNlZ21lbnQpOworICAgICAgICAgICAgbV9maXJzdC0+c2V0UHJldihzZWdtZW50
KTsKKyAgICAgICAgICAgIG1fZmlyc3QgPSBzZWdtZW50OworICAgICAgICB9IGVsc2UgeworICAg
ICAgICAgICAgLy8gbV9maXJzdC0+cHJldigpIGlzIHRoZSBzZW50aW5lbC4KKyAgICAgICAgICAg
IEFTU0VSVChtX2ZpcnN0LT5wcmV2KCkgPT0gJm1fc2VudGluZWwpOworICAgICAgICAgICAgU2Vn
bWVudCogbGFzdCA9IG1fc2VudGluZWwucHJldigpOworICAgICAgICAgICAgbGFzdC0+c2V0TmV4
dChzZWdtZW50KTsKKyAgICAgICAgICAgIHNlZ21lbnQtPnNldFByZXYobGFzdCk7CisgICAgICAg
ICAgICBzZWdtZW50LT5zZXROZXh0KCZtX3NlbnRpbmVsKTsKKyAgICAgICAgICAgIG1fc2VudGlu
ZWwuc2V0UHJldihzZWdtZW50KTsKKyAgICAgICAgfQorICAgICAgICBtX2JvdW5kaW5nQm94RGly
dHkgPSB0cnVlOworICAgIH0KKworICAgIC8vIFN1YmRpdmlkZXMgdGhlIGdpdmVuIHNlZ21lbnQg
YXQgdGhlIGdpdmVuIHBhcmFtZXRyaWMgdmFsdWUuCisgICAgLy8gUmV0dXJucyBhIHBvaW50ZXIg
dG8gdGhlIGZpcnN0IG9mIHRoZSB0d28gcG9ydGlvbnMgb2YgdGhlCisgICAgLy8gc3ViZGl2aWRl
ZCBzZWdtZW50LgorICAgIFNlZ21lbnQqIHN1YmRpdmlkZShTZWdtZW50KiBzZWdtZW50LCBmbG9h
dCBwYXJhbSkKKyAgICB7CisgICAgICAgIFNlZ21lbnQqIGxlZnQgPSBzZWdtZW50LT5zdWJkaXZp
ZGUocGFyYW0pOworICAgICAgICBpZiAobV9maXJzdCA9PSBzZWdtZW50KQorICAgICAgICAgICAg
bV9maXJzdCA9IGxlZnQ7CisgICAgICAgIHJldHVybiBsZWZ0OworICAgIH0KKworICAgIC8vIFN1
YmRpdmlkZXMgdGhlIGdpdmVuIHNlZ21lbnQgYXQgdGhlIGhhbGZ3YXkgcG9pbnQuIFJldHVybnMg
YQorICAgIC8vIHBvaW50ZXIgdG8gdGhlIGZpcnN0IG9mIHRoZSB0d28gcG9ydGlvbnMgb2YgdGhl
IHN1YmRpdmlkZWQKKyAgICAvLyBzZWdtZW50LgorICAgIFNlZ21lbnQqIHN1YmRpdmlkZShTZWdt
ZW50KiBzZWdtZW50KQorICAgIHsKKyAgICAgICAgU2VnbWVudCogbGVmdCA9IHNlZ21lbnQtPnN1
YmRpdmlkZSgpOworICAgICAgICBpZiAobV9maXJzdCA9PSBzZWdtZW50KQorICAgICAgICAgICAg
bV9maXJzdCA9IGxlZnQ7CisgICAgICAgIHJldHVybiBsZWZ0OworICAgIH0KKworICAgIC8vIFJl
dHVybnMgdGhlIGZpcnN0IHNlZ21lbnQgaW4gdGhlIGNvbnRvdXIgZm9yIGl0ZXJhdGlvbi4KKyAg
ICBTZWdtZW50KiBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fZmlyc3Q7IH0KKworICAgIC8vIFJl
dHVybnMgdGhlIGxhc3Qgc2VnbWVudCBpbiB0aGUgY29udG91ciBmb3IgaXRlcmF0aW9uLiBDYWxs
ZXJzCisgICAgLy8gc2hvdWxkIG5vdCBpdGVyYXRlIG92ZXIgdGhpcyBzZWdtZW50LiBJbiBvdGhl
ciB3b3JkczoKKyAgICAvLyAgZm9yIChTZWdtZW50KiBjdXIgPSBjb250b3VyLT5iZWdpbigpOwor
ICAgIC8vICAgICAgIGN1ciAhPSBjb250b3VyLT5lbmQoKTsKKyAgICAvLyAgICAgICBjdXIgPSBj
dXItPm5leHQoKSkgeworICAgIC8vICAgIC8vIC4uIHByb2Nlc3MgY3VyIC4uLgorICAgIC8vICB9
CisgICAgU2VnbWVudCogZW5kKCkKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2ZpcnN0LT5wcmV2
KCkgPT0gJm1fc2VudGluZWwpOworICAgICAgICByZXR1cm4gJm1fc2VudGluZWw7CisgICAgfQor
CisgICAgYm9vbCBpc09yaWVudGVkQ291bnRlckNsb2Nrd2lzZSgpIGNvbnN0IHsgcmV0dXJuIG1f
aXNPcmllbnRlZENvdW50ZXJDbG9ja3dpc2U7IH0KKyAgICB2b2lkIHNldElzT3JpZW50ZWRDb3Vu
dGVyQ2xvY2t3aXNlKGJvb2wgaXNPcmllbnRlZENvdW50ZXJDbG9ja3dpc2UpIHsgbV9pc09yaWVu
dGVkQ291bnRlckNsb2Nrd2lzZSA9IGlzT3JpZW50ZWRDb3VudGVyQ2xvY2t3aXNlOyB9CisKKyAg
ICBjb25zdCBGbG9hdFJlY3QmIGJvdW5kaW5nQm94KCkKKyAgICB7CisgICAgICAgIGlmIChtX2Jv
dW5kaW5nQm94RGlydHkpIHsKKyAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAg
ICAgICAgZm9yIChTZWdtZW50KiBjdXIgPSBiZWdpbigpOyBjdXIgIT0gZW5kKCk7IGN1ciA9IGN1
ci0+bmV4dCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAg
ICAgICBtX2JvdW5kaW5nQm94ID0gY3VyLT5ib3VuZGluZ0JveCgpOworICAgICAgICAgICAgICAg
IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbV9ib3VuZGluZ0JveC51bml0ZShjdXItPmJvdW5k
aW5nQm94KCkpOworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIG1fYm91bmRpbmdCb3hEaXJ0eSA9IGZhbHNlOworICAgICAgICB9Cisg
ICAgICAgIHJldHVybiBtX2JvdW5kaW5nQm94OworICAgIH0KKworICAgIC8vIFJldHVybnMgd2hp
Y2ggc2lkZSBvZiB0aGlzIGNvbnRvdXIgaXMgZmlsbGVkLgorICAgIExvb3BCbGlubkNvbnN0YW50
czo6RmlsbFNpZGUgZmlsbFNpZGUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fZmls
bFNpZGU7CisgICAgfQorCisgICAgdm9pZCBzZXRGaWxsU2lkZShMb29wQmxpbm5Db25zdGFudHM6
OkZpbGxTaWRlIGZpbGxTaWRlKQorICAgIHsKKyAgICAgICAgbV9maWxsU2lkZSA9IGZpbGxTaWRl
OworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLyBUaGUgc3RhcnQgb2YgdGhlIHNlZ21lbnQgY2hh
aW4uIFRoZSBzZWdtZW50cyBhcmUga2VwdCBpbiBhCisgICAgLy8gY2lyY3VsYXIgZG91Ymx5IGxp
bmtlZCBsaXN0IGZvciByYXBpZCBhY2Nlc3MgdG8gdGhlIGJlZ2lubmluZyBhbmQKKyAgICAvLyBl
bmQuCisgICAgU2VnbWVudCogbV9maXJzdDsKKworICAgIC8vIFRoZSBzZW50aW5lbCBlbGVtZW50
IGF0IHRoZSBlbmQgb2YgdGhlIGNoYWluLCBuZWVkZWQgZm9yCisgICAgLy8gcmVhc29uYWJsZSBp
dGVyYXRpb24gc2VtYW50aWNzLgorICAgIFNlZ21lbnQgbV9zZW50aW5lbDsKKworICAgIGJvb2wg
bV9pc09yaWVudGVkQ291bnRlckNsb2Nrd2lzZTsKKworICAgIEZsb2F0UmVjdCBtX2JvdW5kaW5n
Qm94OworICAgIGJvb2wgbV9ib3VuZGluZ0JveERpcnR5OworCisgICAgLy8gV2hpY2ggc2lkZSBv
ZiB0aGlzIGNvbnRvdXIgc2hvdWxkIGJlIGZpbGxlZC4KKyAgICBMb29wQmxpbm5Db25zdGFudHM6
OkZpbGxTaWRlIG1fZmlsbFNpZGU7Cit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNlZ21lbnQK
Ky8vCisKKy8vIERlZmluaXRpb24gb2YgU2VnbWVudDo6dHJpYW5ndWxhdGUoKSwgd2hpY2ggbXVz
dCBjb21lIGFmdGVyCisvLyBkZWNsYXJhdGlvbiBvZiBDb250b3VyLgordm9pZCBTZWdtZW50Ojp0
cmlhbmd1bGF0ZShMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6SW5zaWRlRWRnZUNvbXB1dGF0
aW9uIGNvbXB1dGVJbnNpZGVFZGdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg
TG9vcEJsaW5uVGV4dHVyZUNvb3Jkczo6UmVzdWx0KiB0ZXhDb29yZHMpCit7CisgICAgQVNTRVJU
KG1fa2luZCA9PSBDdWJpYyk7CisgICAgaWYgKCFtX3RyaWFuZ3VsYXRvcikKKyAgICAgICAgbV90
cmlhbmd1bGF0b3IgPSBtX2FyZW5hLT5hbGxvY2F0ZU9iamVjdDxMb29wQmxpbm5Mb2NhbFRyaWFu
Z3VsYXRvcj4oKTsKKyAgICBtX3RyaWFuZ3VsYXRvci0+cmVzZXQoKTsKKyAgICBmb3IgKGludCBp
ID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6
VmVydGV4KiB2ZXJ0ZXggPSBtX3RyaWFuZ3VsYXRvci0+Z2V0VmVydGV4KGkpOworICAgICAgICBp
ZiAodGV4Q29vcmRzKSB7CisgICAgICAgICAgICB2ZXJ0ZXgtPnNldChnZXRQb2ludChpKS54KCks
CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRQb2ludChpKS55KCksCisgICAgICAgICAgICAg
ICAgICAgICAgICB0ZXhDb29yZHMtPmtsbUNvb3JkaW5hdGVzW2ldLngoKSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHRleENvb3Jkcy0+a2xtQ29vcmRpbmF0ZXNbaV0ueSgpLAorICAgICAgICAg
ICAgICAgICAgICAgICAgdGV4Q29vcmRzLT5rbG1Db29yZGluYXRlc1tpXS56KCkpOworICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgdmVydGV4LT5zZXQoZ2V0UG9pbnQoaSkueCgpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgZ2V0UG9pbnQoaSkueSgpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gTm8gdGV4dHVyZSBjb29yZGluYXRlcyB5ZXQKKyAgICAgICAgICAgICAgICAgICAg
ICAgIDAsIDAsIDApOworICAgICAgICB9CisgICAgfQorICAgIG1fdHJpYW5ndWxhdG9yLT50cmlh
bmd1bGF0ZShjb21wdXRlSW5zaWRlRWRnZXMsIGNvbnRvdXIoKS0+ZmlsbFNpZGUoKSk7Cit9CisK
K30gLy8gbmFtZXNwYWNlIExvb3BCbGlublBhdGhQcm9jZXNzb3JJbXBsZW1lbnRhdGlvbgorCisv
Ly0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KKy8vIExvb3BCbGlublBhdGhQcm9jZXNzb3IKKy8vCisKK0xvb3BCbGlu
blBhdGhQcm9jZXNzb3I6Okxvb3BCbGlublBhdGhQcm9jZXNzb3IoKQorICAgIDogbV9hcmVuYShQ
T0RBcmVuYTo6Y3JlYXRlKCkpCisjaWZuZGVmIE5ERUJVRworICAgICwgbV92ZXJib3NlTG9nZ2lu
ZyhmYWxzZSkKKyNlbmRpZgoreworfQorCitMb29wQmxpbm5QYXRoUHJvY2Vzc29yOjpMb29wQmxp
bm5QYXRoUHJvY2Vzc29yKFBhc3NSZWZQdHI8UE9EQXJlbmE+IGFyZW5hKQorICAgIDogbV9hcmVu
YShhcmVuYSkKKyNpZm5kZWYgTkRFQlVHCisgICAgLCBtX3ZlcmJvc2VMb2dnaW5nKGZhbHNlKQor
I2VuZGlmCit7Cit9CisKK0xvb3BCbGlublBhdGhQcm9jZXNzb3I6On5Mb29wQmxpbm5QYXRoUHJv
Y2Vzc29yKCkKK3sKK30KKwordm9pZCBMb29wQmxpbm5QYXRoUHJvY2Vzc29yOjpwcm9jZXNzKGNv
bnN0IFBhdGgmIHBhdGgsIExvb3BCbGlublBhdGhDYWNoZSYgY2FjaGUpCit7CisgICAgYnVpbGRD
b250b3VycyhwYXRoKTsKKworICAgIC8vIFJ1biBwbGFuZS1zd2VlcCBhbGdvcml0aG0gdG8gZGV0
ZXJtaW5lIG92ZXJsYXBzIG9mIGNvbnRyb2wgcG9pbnQKKyAgICAvLyBjdXJ2ZXMgYW5kIHN1YmRp
dmlkZSBjdXJ2ZXMgYXBwcm9wcmlhdGVseS4KKyAgICBzdWJkaXZpZGVDdXJ2ZXMoKTsKKworICAg
IC8vIERldGVybWluZSBvcmllbnRhdGlvbnMgb2YgY291bnRvdXJzLiBCYXNlZCBvbiBvcmllbnRh
dGlvbiBhbmQgdGhlCisgICAgLy8gbnVtYmVyIG9mIGN1cnZlIGNyb3NzaW5ncyBhdCBhIHJhbmRv
bSBwb2ludCBvbiB0aGUgY29udG91ciwKKyAgICAvLyBkZXRlcm1pbmUgd2hldGhlciB0byBmaWxs
IHRoZSBsZWZ0IG9yIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbnRvdXIuCisgICAgZGV0ZXJtaW5lU2lk
ZXNUb0ZpbGwoKTsKKworICAgIC8vIENsYXNzaWZ5IGN1cnZlcywgY29tcHV0ZSB0ZXh0dXJlIGNv
b3JkaW5hdGVzIGFuZCBzdWJkaXZpZGUgYXMKKyAgICAvLyBuZWNlc3NhcnkgdG8gZWxpbWluYXRl
IHJlbmRlcmluZyBhcnRpZmFjdHMuIERvIHRoZSBmaW5hbAorICAgIC8vIHRyaWFuZ3VsYXRpb24g
b2YgdGhlIGN1cnZlIHNlZ21lbnRzLCBkZXRlcm1pbmluZyB0aGUgcGF0aCBhbG9uZworICAgIC8v
IHRoZSBpbnRlcmlvciBvZiB0aGUgc2hhcGUuCisgICAgZm9yIChWZWN0b3I8Q29udG91cio+Ojpp
dGVyYXRvciBpdGVyID0gbV9jb250b3Vycy5iZWdpbigpOyBpdGVyICE9IG1fY29udG91cnMuZW5k
KCk7ICsraXRlcikgeworICAgICAgICBDb250b3VyKiBjdXIgPSAqaXRlcjsKKyAgICAgICAgZm9y
IChTZWdtZW50KiBzZWcgPSBjdXItPmJlZ2luKCk7IHNlZyAhPSBjdXItPmVuZCgpOyBzZWcgPSBz
ZWctPm5leHQoKSkgeworICAgICAgICAgICAgaWYgKHNlZy0+a2luZCgpID09IFNlZ21lbnQ6OkN1
YmljKSB7CisgICAgICAgICAgICAgICAgTG9vcEJsaW5uQ2xhc3NpZmllcjo6UmVzdWx0IGNsYXNz
aWZpY2F0aW9uID0gTG9vcEJsaW5uQ2xhc3NpZmllcjo6Y2xhc3NpZnkoc2VnLT5nZXRQb2ludCgw
KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWctPmdldFBvaW50KDEpLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZy0+Z2V0UG9pbnQoMiksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnLT5nZXRQb2ludCgzKSk7CisjaWZuZGVm
IE5ERUJVRworICAgICAgICAgICAgICAgIGlmIChtX3ZlcmJvc2VMb2dnaW5nKQorICAgICAgICAg
ICAgICAgICAgICBMT0dfRVJST1IoIkNsYXNzaWZpY2F0aW9uOiAlZCIsIChpbnQpIGNsYXNzaWZp
Y2F0aW9uLmN1cnZlVHlwZSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBMb29wQmxpbm5UZXh0
dXJlQ29vcmRzOjpSZXN1bHQgdGV4Q29vcmRzID0KKyAgICAgICAgICAgICAgICAgICAgTG9vcEJs
aW5uVGV4dHVyZUNvb3Jkczo6Y29tcHV0ZShjbGFzc2lmaWNhdGlvbiwgY3VyLT5maWxsU2lkZSgp
KTsKKyAgICAgICAgICAgICAgICBpZiAodGV4Q29vcmRzLmhhc1JlbmRlcmluZ0FydGlmYWN0KSB7
CisgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB0aGVyZSBpcyBhIHByb2JsZW0gd2hlcmUg
dGhlIGFsZ29yaXRobQorICAgICAgICAgICAgICAgICAgICAvLyBzb21ldGltZXMgZmFpbHMgdG8g
Y29udmVyZ2Ugd2hlbiBzcGxpdHRpbmcgYXQgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIHN1
YmRpdmlzaW9uIHBhcmFtZXRlciB2YWx1ZS4gRm9yIHRoZSB0aW1lIGJlaW5nLAorICAgICAgICAg
ICAgICAgICAgICAvLyBzcGxpdCBoYWxmd2F5LgorICAgICAgICAgICAgICAgICAgICBjdXItPnN1
YmRpdmlkZShzZWcpOworICAgICAgICAgICAgICAgICAgICAvLyBOZXh0IGl0ZXJhdGlvbiB3aWxs
IGhhbmRsZSB0aGUgbmV3bHkgc3ViZGl2aWRlZCBjdXJ2ZXMKKyAgICAgICAgICAgICAgICB9IGVs
c2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXRleENvb3Jkcy5pc0xpbmVPclBvaW50KSB7
CisgICAgICAgICAgICAgICAgICAgICAgICBzZWctPnRyaWFuZ3VsYXRlKExvb3BCbGlubkxvY2Fs
VHJpYW5ndWxhdG9yOjpDb21wdXRlSW5zaWRlRWRnZXMsICZ0ZXhDb29yZHMpOworICAgICAgICAg
ICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWctPm51bWJlck9mVHJpYW5nbGVz
KCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BCbGlubkxvY2FsVHJp
YW5ndWxhdG9yOjpUcmlhbmdsZSogdHJpYW5nbGUgPSBzZWctPmdldFRyaWFuZ2xlKGkpOworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgaisrKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9y
OjpWZXJ0ZXgqIHZlcnQgPSB0cmlhbmdsZS0+Z2V0VmVydGV4KGopOworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjYWNoZS5hZGRWZXJ0ZXgodmVydC0+eHlDb29yZGluYXRlcygpLngo
KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnQt
Pnh5Q29vcmRpbmF0ZXMoKS55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB2ZXJ0LT5rbG1Db29yZGluYXRlcygpLngoKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnQtPmtsbUNvb3JkaW5hdGVzKCku
eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVy
dC0+a2xtQ29vcmRpbmF0ZXMoKS56KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBMT09QX0JMSU5OX1BBVEhfQ0FDSEVf
REVCVUdfSU5URVJJT1JfRURHRVMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3cgdGhl
IGVuZCB1c2VyIHRoZSBpbnRlcmlvciBlZGdlcyBhcyB3ZWxsCisgICAgICAgICAgICAgICAgICAg
ICAgICBmb3IgKGludCBpID0gMTsgaSA8IHNlZy0+bnVtYmVyT2ZJbnRlcmlvclZlcnRpY2VzKCk7
IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb2F0UG9pbnQgdmVydCA9IHNl
Zy0+Z2V0SW50ZXJpb3JWZXJ0ZXgoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g
RHVwbGljYXRlIHByZXZpb3VzIHZlcnRleCB0byBiZSBhYmxlIHRvIGRyYXcgR0xfTElORVMKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBGbG9hdFBvaW50IHByZXYgPSBzZWctPmdldEludGVy
aW9yVmVydGV4KGkgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5hZGRJ
bnRlcmlvckVkZ2VWZXJ0ZXgocHJldi54KCksIHByZXYueSgpKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjYWNoZS5hZGRJbnRlcmlvckVkZ2VWZXJ0ZXgodmVydC54KCksIHZlcnQueSgp
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBMT09QX0JMSU5OX1BBVEhf
Q0FDSEVfREVCVUdfSU5URVJJT1JfRURHRVMKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJ1
biB0aGUgaW50ZXJpb3IgcGF0aHMgdGhyb3VnaCBhIHRlc3NlbGxhdGlvbiBhbGdvcml0aG0KKyAg
ICAvLyBzdXBwb3J0aW5nIG11bHRpcGxlIGNvbnRvdXJzLgorICAgIHRlc3NlbGxhdGVJbnRlcmlv
cihjYWNoZSk7Cit9CisKK3ZvaWQgTG9vcEJsaW5uUGF0aFByb2Nlc3Nvcjo6YnVpbGRDb250b3Vy
cyhjb25zdCBQYXRoJiBwYXRoKQoreworICAgIC8vIENsZWFyIG91dCB0aGUgY29udG91cnMKKyAg
ICBtX2NvbnRvdXJzLmNsZWFyKCk7CisjaWYgUExBVEZPUk0oU0tJQSkKKyAgICBTa1BhdGg6Okl0
ZXIgaXRlcigqcGF0aC5wbGF0Zm9ybVBhdGgoKSwgZmFsc2UpOworICAgIFNrUG9pbnQgcG9pbnRz
WzRdOworICAgIFNrUGF0aDo6VmVyYiB2ZXJiOworICAgIENvbnRvdXIqIGNvbnRvdXIgPSAwOwor
ICAgIFNrUG9pbnQgY3VyUG9pbnQgPSB7IDAgfTsKKyAgICBTa1BvaW50IG1vdmVUb1BvaW50ID0g
eyAwIH07CisgICAgZG8geworICAgICAgICB2ZXJiID0gaXRlci5uZXh0KHBvaW50cyk7CisgICAg
ICAgIGlmICh2ZXJiICE9IFNrUGF0aDo6a01vdmVfVmVyYikgeworICAgICAgICAgICAgaWYgKCFj
b250b3VyKSB7CisgICAgICAgICAgICAgICAgY29udG91ciA9IG1fYXJlbmEtPmFsbG9jYXRlT2Jq
ZWN0PENvbnRvdXI+KCk7CisgICAgICAgICAgICAgICAgbV9jb250b3Vycy5hcHBlbmQoY29udG91
cik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoICh2ZXJiKSB7Cisg
ICAgICAgIGNhc2UgU2tQYXRoOjprTW92ZV9WZXJiOiB7CisgICAgICAgICAgICBjb250b3VyID0g
bV9hcmVuYS0+YWxsb2NhdGVPYmplY3Q8Q29udG91cj4oKTsKKyAgICAgICAgICAgIG1fY29udG91
cnMuYXBwZW5kKGNvbnRvdXIpOworICAgICAgICAgICAgY3VyUG9pbnQgPSBwb2ludHNbMF07Cisg
ICAgICAgICAgICBtb3ZlVG9Qb2ludCA9IHBvaW50c1swXTsKKyNpZm5kZWYgTkRFQlVHCisgICAg
ICAgICAgICBpZiAobV92ZXJib3NlTG9nZ2luZykKKyAgICAgICAgICAgICAgICBMT0dfRVJST1Io
Ik1vdmVUbyAoJWYsICVmKSIsIHBvaW50c1swXS5mWCwgcG9pbnRzWzBdLmZZKTsKKyNlbmRpZgor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTa1BhdGg6OmtMaW5l
X1ZlcmI6IHsKKyAgICAgICAgICAgIFNlZ21lbnQqIHNlZ21lbnQgPSBtX2FyZW5hLT5hbGxvY2F0
ZU9iamVjdDxTZWdtZW50PigpOworICAgICAgICAgICAgaWYgKGl0ZXIuaXNDbG9zZUxpbmUoKSkg
eworICAgICAgICAgICAgICAgIHNlZ21lbnQtPnNldHVwKG1fYXJlbmEuZ2V0KCksIGNvbnRvdXIs
IGN1clBvaW50LCBwb2ludHNbMV0pOworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgICAgICAgICBp
ZiAobV92ZXJib3NlTG9nZ2luZykKKyAgICAgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJDbG9z
ZUxpbmVUbyAoJWYsICVmKSwgKCVmLCAlZikiLCBjdXJQb2ludC5mWCwgY3VyUG9pbnQuZlksIHBv
aW50c1sxXS5mWCwgcG9pbnRzWzFdLmZZKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGNvbnRv
dXItPmFkZChzZWdtZW50KTsKKyAgICAgICAgICAgICAgICBjb250b3VyID0gMDsKKyAgICAgICAg
ICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2VnbWVudC0+c2V0dXAobV9hcmVuYS5nZXQo
KSwgY29udG91ciwgcG9pbnRzWzBdLCBwb2ludHNbMV0pOworI2lmbmRlZiBOREVCVUcKKyAgICAg
ICAgICAgICAgICBpZiAobV92ZXJib3NlTG9nZ2luZykKKyAgICAgICAgICAgICAgICAgICAgTE9H
X0VSUk9SKCJMaW5lVG8gKCVmLCAlZiksICglZiwgJWYpIiwgcG9pbnRzWzBdLmZYLCBwb2ludHNb
MF0uZlksIHBvaW50c1sxXS5mWCwgcG9pbnRzWzFdLmZZKTsKKyNlbmRpZgorICAgICAgICAgICAg
ICAgIGNvbnRvdXItPmFkZChzZWdtZW50KTsKKyAgICAgICAgICAgICAgICBjdXJQb2ludCA9IHBv
aW50c1sxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cisg
ICAgICAgIGNhc2UgU2tQYXRoOjprUXVhZF9WZXJiOiB7CisgICAgICAgICAgICAvLyBOZWVkIHRv
IGRlZ3JlZSBlbGV2YXRlIHRoZSBxdWFkcmF0aWMgaW50byBhIGN1YmljCisgICAgICAgICAgICBT
a1BvaW50IGN1YmljWzRdOworICAgICAgICAgICAgU2tDb252ZXJ0UXVhZFRvQ3ViaWMocG9pbnRz
LCBjdWJpYyk7CisgICAgICAgICAgICBTZWdtZW50KiBzZWdtZW50ID0gbV9hcmVuYS0+YWxsb2Nh
dGVPYmplY3Q8U2VnbWVudD4oKTsKKyAgICAgICAgICAgIHNlZ21lbnQtPnNldHVwKG1fYXJlbmEu
Z2V0KCksIGNvbnRvdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjdWJpY1swXSwgY3Vi
aWNbMV0sIGN1YmljWzJdLCBjdWJpY1szXSk7CisjaWZuZGVmIE5ERUJVRworICAgICAgICAgICAg
aWYgKG1fdmVyYm9zZUxvZ2dpbmcpCisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJRdWFkLT5D
dWJpY1RvICglZiwgJWYpLCAoJWYsICVmKSwgKCVmLCAlZiksICglZiwgJWYpIiwgY3ViaWNbMF0u
ZlgsIGN1YmljWzBdLmZZLCBjdWJpY1sxXS5mWCwgY3ViaWNbMV0uZlksIGN1YmljWzJdLmZYLCBj
dWJpY1syXS5mWSwgY3ViaWNbM10uZlgsIGN1YmljWzNdLmZZKTsKKyNlbmRpZgorICAgICAgICAg
ICAgY29udG91ci0+YWRkKHNlZ21lbnQpOworICAgICAgICAgICAgY3VyUG9pbnQgPSBjdWJpY1sz
XTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgU2tQYXRoOjpr
Q3ViaWNfVmVyYjogeworICAgICAgICAgICAgU2VnbWVudCogc2VnbWVudCA9IG1fYXJlbmEtPmFs
bG9jYXRlT2JqZWN0PFNlZ21lbnQ+KCk7CisgICAgICAgICAgICBzZWdtZW50LT5zZXR1cChtX2Fy
ZW5hLmdldCgpLCBjb250b3VyLCBwb2ludHNbMF0sIHBvaW50c1sxXSwgcG9pbnRzWzJdLCBwb2lu
dHNbM10pOworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgICAgIGlmIChtX3ZlcmJvc2VMb2dnaW5n
KQorICAgICAgICAgICAgICAgIExPR19FUlJPUigiQ3ViaWNUbyAoJWYsICVmKSwgKCVmLCAlZiks
ICglZiwgJWYpLCAoJWYsICVmKSIsIHBvaW50c1swXS5mWCwgcG9pbnRzWzBdLmZZLCBwb2ludHNb
MV0uZlgsIHBvaW50c1sxXS5mWSwgcG9pbnRzWzJdLmZYLCBwb2ludHNbMl0uZlksIHBvaW50c1sz
XS5mWCwgcG9pbnRzWzNdLmZZKTsKKyNlbmRpZgorICAgICAgICAgICAgY29udG91ci0+YWRkKHNl
Z21lbnQpOworICAgICAgICAgICAgY3VyUG9pbnQgPSBwb2ludHNbM107CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNrUGF0aDo6a0Nsb3NlX1ZlcmI6IHsKKyAg
ICAgICAgICAgIFNlZ21lbnQqIHNlZ21lbnQgPSBtX2FyZW5hLT5hbGxvY2F0ZU9iamVjdDxTZWdt
ZW50PigpOworICAgICAgICAgICAgc2VnbWVudC0+c2V0dXAobV9hcmVuYS5nZXQoKSwgY29udG91
ciwgY3VyUG9pbnQsIG1vdmVUb1BvaW50KTsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgICAgICBp
ZiAobV92ZXJib3NlTG9nZ2luZykKKyAgICAgICAgICAgICAgICBMT0dfRVJST1IoIkNsb3NlICgl
ZiwgJWYpIC0+ICglZiwgJWYpIiwgY3VyUG9pbnQuZlgsIGN1clBvaW50LmZZLCBtb3ZlVG9Qb2lu
dC5mWCwgbW92ZVRvUG9pbnQuZlkpOworI2VuZGlmCisgICAgICAgICAgICBjb250b3VyLT5hZGQo
c2VnbWVudCk7CisgICAgICAgICAgICBjb250b3VyID0gMDsKKyAgICAgICAgfQorICAgICAgICBj
YXNlIFNrUGF0aDo6a0RvbmVfVmVyYjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cisg
ICAgfSB3aGlsZSAodmVyYiAhPSBTa1BhdGg6OmtEb25lX1ZlcmIpOworI2Vsc2UgLy8gIVBMQVRG
T1JNKFNLSUEpCisgICAgLy8gTXVzdCBwb3J0IHRvIHlvdXIgcGxhdGZvcm0uCisgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisjZW5kaWYKK30KKworI2lmbmRlZiBOREVCVUcKK1ZlY3RvcjxTZWdt
ZW50Kj4gTG9vcEJsaW5uUGF0aFByb2Nlc3Nvcjo6YWxsU2VnbWVudHNPdmVybGFwcGluZ1koQ29u
dG91ciogcXVlcnlDb250b3VyLCBmbG9hdCB4LCBmbG9hdCB5KQoreworICAgIFZlY3RvcjxTZWdt
ZW50Kj4gcmVzOworICAgIGZvciAoVmVjdG9yPENvbnRvdXIqPjo6aXRlcmF0b3IgaXRlciA9IG1f
Y29udG91cnMuYmVnaW4oKTsgaXRlciAhPSBtX2NvbnRvdXJzLmVuZCgpOyArK2l0ZXIpIHsKKyAg
ICAgICAgQ29udG91ciogY3VyID0gKml0ZXI7CisgICAgICAgIGZvciAoU2VnbWVudCogc2VnID0g
Y3VyLT5iZWdpbigpOyBzZWcgIT0gY3VyLT5lbmQoKTsgc2VnID0gc2VnLT5uZXh0KCkpIHsKKyAg
ICAgICAgICAgIGNvbnN0IEZsb2F0UmVjdCYgYm91bmRpbmdCb3ggPSBzZWctPmJvdW5kaW5nQm94
KCk7CisgICAgICAgICAgICBpZiAoYm91bmRpbmdCb3gueSgpIDw9IHkgJiYgeSA8PSBib3VuZGlu
Z0JveC5tYXhZKCkpCisgICAgICAgICAgICAgICAgcmVzLmFwcGVuZChzZWcpOworICAgICAgICB9
CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisjZW5kaWYKKworLy8gVW5jb21tZW50IHRoaXMg
dG8gZGVidWcgdGhlIG9yaWVudGF0aW9uIGNvbXB1dGF0aW9uLgorLy8gI2RlZmluZSBHUFVfUEFU
SF9QUk9DRVNTT1JfREVCVUdfT1JJRU5UQVRJT04KKwordm9pZCBMb29wQmxpbm5QYXRoUHJvY2Vz
c29yOjpkZXRlcm1pbmVTaWRlc1RvRmlsbCgpCit7CisgICAgLy8gTG9vcCBhbmQgQmxpbm4ncyBh
bGdvcml0aG0gY2FuIG9ubHkgZWFzaWx5IGVtdWxhdGUgdGhlIGV2ZW4vb2RkCisgICAgLy8gZmls
bCBydWxlLCBhbmQgb25seSBmb3Igbm9uLWludGVyc2VjdGluZyBjdXJ2ZXMuIFdlIGNhbiBkZXRl
cm1pbmUKKyAgICAvLyB3aGljaCBzaWRlIG9mIGVhY2ggY3VydmUgc2VnbWVudCB0byBmaWxsIGJh
c2VkIG9uIGl0cworICAgIC8vIGNsb2Nrd2lzZS9jb3VudGVyY2xvY2t3aXNlIG9yaWVudGF0aW9u
IGFuZCBob3cgbWFueSBvdGhlcgorICAgIC8vIGNvbnRvdXJzIHN1cnJvdW5kIGl0LgorCisgICAg
Ly8gVG8gb3B0aW1pemUgdGhlIHF1ZXJ5IG9mIGFsbCBjdXJ2ZSBzZWdtZW50cyBpbnRlcnNlY3Rp
bmcgYQorICAgIC8vIGhvcml6b250YWwgbGluZSBnb2luZyB0byB4PStpbmZpbml0eSwgd2UgYnVp
bGQgdXAgYW4gaW50ZXJ2YWwKKyAgICAvLyB0cmVlIHdob3NlIGtleXMgYXJlIHRoZSB5IGV4dGVu
dHMgb2YgdGhlIHNlZ21lbnRzLgorICAgIFBPREludGVydmFsVHJlZTxmbG9hdCwgU2VnbWVudCo+
IHRyZWUobV9hcmVuYSk7CisgICAgdHlwZWRlZiBQT0RJbnRlcnZhbFRyZWU8ZmxvYXQsIFNlZ21l
bnQqPjo6SW50ZXJ2YWxUeXBlIEludGVydmFsVHlwZTsKKworICAgIGZvciAoVmVjdG9yPENvbnRv
dXIqPjo6aXRlcmF0b3IgaXRlciA9IG1fY29udG91cnMuYmVnaW4oKTsgaXRlciAhPSBtX2NvbnRv
dXJzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgICAgQ29udG91ciogY3VyID0gKml0ZXI7CisgICAg
ICAgIGRldGVybWluZU9yaWVudGF0aW9uKGN1cik7CisgICAgICAgIGZvciAoU2VnbWVudCogc2Vn
ID0gY3VyLT5iZWdpbigpOyBzZWcgIT0gY3VyLT5lbmQoKTsgc2VnID0gc2VnLT5uZXh0KCkpIHsK
KyAgICAgICAgICAgIGNvbnN0IEZsb2F0UmVjdCYgYm91bmRpbmdCb3ggPSBzZWctPmJvdW5kaW5n
Qm94KCk7CisgICAgICAgICAgICB0cmVlLmFkZCh0cmVlLmNyZWF0ZUludGVydmFsKGJvdW5kaW5n
Qm94LnkoKSwgYm91bmRpbmdCb3gubWF4WSgpLCBzZWcpKTsKKyAgICAgICAgfQorICAgIH0KKwor
ICAgIC8vIE5vdyBpdGVyYXRlIHRocm91Z2ggdGhlIGNvbnRvdXJzIGFuZCBwaWNrIGEgcmFuZG9t
IHNlZ21lbnQgKGluCisgICAgLy8gdGhpcyBjYXNlIHdlIHVzZSB0aGUgZmlyc3QpIGFuZCBhIHJh
bmRvbSBwb2ludCBvbiB0aGF0IHNlZ21lbnQuCisgICAgLy8gRmluZCBhbGwgc2VnbWVudHMgZnJv
bSBvdGhlciBjb250b3VycyB3aGljaCBpbnRlcnNlY3QgdGhpcyBvbmUKKyAgICAvLyBhbmQgY291
bnQgdGhlIG51bWJlciBvZiBjcm9zc2luZ3MgYSBob3Jpem9udGFsIGxpbmUgdG8KKyAgICAvLyB4
PStpbmZpbml0eSBtYWtlcyB3aXRoIHRob3NlIGNvbnRvdXJzLiBUaGlzIGNvbWJpbmVkIHdpdGgg
dGhlCisgICAgLy8gb3JpZW50YXRpb24gb2YgdGhlIGN1cnZlIHRlbGxzIHVzIHdoaWNoIHNpZGUg
dG8gZmlsbCAtLSBhZ2FpbiwKKyAgICAvLyBhc3N1bWluZyBhbiBldmVuL29kZCBmaWxsIHJ1bGUs
IHdoaWNoIGlzIGFsbCB3ZSBjYW4gZWFzaWx5CisgICAgLy8gaGFuZGxlLgorICAgIGZvciAoVmVj
dG9yPENvbnRvdXIqPjo6aXRlcmF0b3IgaXRlciA9IG1fY29udG91cnMuYmVnaW4oKTsgaXRlciAh
PSBtX2NvbnRvdXJzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgICAgQ29udG91ciogY3VyID0gKml0
ZXI7CisKKyAgICAgICAgYm9vbCBhbWJpZ3VvdXMgPSB0cnVlOworICAgICAgICBpbnQgbnVtQ3Jv
c3NpbmdzID0gMDsKKworICAgICAgICAvLyBGb3IgZWFjaCBjb250b3VyLCBhdHRlbXB0IHRvIGZp
bmQgYSBwb2ludCBvbiB0aGUgY29udG91ciB3aGljaCwKKyAgICAgICAgLy8gd2hlbiB3ZSBjYXN0
IGFuIFhSYXksIGRvZXMgbm90IGludGVyc2VjdCB0aGUgb3RoZXIgY29udG91cnMgYXQKKyAgICAg
ICAgLy8gYW4gYW1iaWd1b3VzIHBvaW50ICh0aGUganVuY3Rpb24gYmV0d2VlbiB0d28gY3VydmVz
IG9yIGF0IGEKKyAgICAgICAgLy8gdGFuZ2VudCBwb2ludCkuIEFtYmlndW91cyBwb2ludHMgbWFr
ZSB0aGUgZGV0ZXJtaW5hdGlvbiBvZgorICAgICAgICAvLyB3aGV0aGVyIHRoaXMgY29udG91ciBp
cyBjb250YWluZWQgd2l0aGluIGFub3RoZXIgZnJhZ2lsZS4gTm90ZQorICAgICAgICAvLyB0aGF0
IHRoaXMgbG9vcCBpcyBvbmx5IGFuIGFwcHJveGltYXRpb24gdG8gdGhlIHNlbGVjdGlvbiBvZiBh
CisgICAgICAgIC8vIGdvb2QgY2FzdGluZyBwb2ludC4gV2UgY291bGQgYXMgd2VsbCBldmFsdWF0
ZSBhIHNlZ21lbnQgdG8KKyAgICAgICAgLy8gZGV0ZXJtaW5lIGEgcG9pbnQgdXBvbiBpdC4KKyAg
ICAgICAgZm9yIChTZWdtZW50KiBzZWcgPSBjdXItPmJlZ2luKCk7CisgICAgICAgICAgICAgYW1i
aWd1b3VzICYmIHNlZyAhPSBjdXItPmVuZCgpOworICAgICAgICAgICAgIHNlZyA9IHNlZy0+bmV4
dCgpKSB7CisgICAgICAgICAgICBudW1Dcm9zc2luZ3MgPSAwOworICAgICAgICAgICAgLy8gV2Ug
dXNlIGEgemVyby1zaXplZCB2ZXJ0aWNhbCBpbnRlcnZhbCBmb3IgdGhlIHF1ZXJ5LgorICAgICAg
ICAgICAgVmVjdG9yPEludGVydmFsVHlwZT4gb3ZlcmxhcHMgPSB0cmVlLmFsbE92ZXJsYXBzKHRy
ZWUuY3JlYXRlSW50ZXJ2YWwoc2VnLT5nZXRQb2ludCgwKS55KCksCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBzZWctPmdldFBvaW50KDApLnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAp
KTsKKyNpZiBkZWZpbmVkKEdQVV9QQVRIX1BST0NFU1NPUl9ERUJVR19PUklFTlRBVElPTikgJiYg
IWRlZmluZWQoTkRFQlVHKQorICAgICAgICAgICAgVmVjdG9yPFNlZ21lbnQqPiBzbG93T3Zlcmxh
cHMgPSBhbGxTZWdtZW50c092ZXJsYXBwaW5nWShjdXIsIHNlZy0+Z2V0UG9pbnQoMCkueCgpLCBz
ZWctPmdldFBvaW50KDApLnkoKSk7CisgICAgICAgICAgICBpZiAob3ZlcmxhcHMuc2l6ZSgpICE9
IHNsb3dPdmVybGFwcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBMT0dfRVJST1IoIkZvciBx
dWVyeSBwb2ludCAoJWYsICVmKSBvbiBjb250b3VyIDB4JXA6Iiwgc2VnLT5nZXRQb2ludCgwKS54
KCksIHNlZy0+Z2V0UG9pbnQoMCkueSgpLCBjdXIpOworICAgICAgICAgICAgICAgIExPR19FUlJP
UigiIG92ZXJsYXBzOiIpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
b3ZlcmxhcHMuc2l6ZSgpOyBpKyspCisgICAgICAgICAgICAgICAgICAgIExPR19FUlJPUigiICAl
ZDogJXMiLCBpKzEsIG92ZXJsYXBzW2ldLmRhdGEoKS0+dG9TdHJpbmcoKS5hc2NpaSgpLmRhdGEo
KSk7CisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCIgc2xvd092ZXJsYXBzOiIpOworICAgICAg
ICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2xvd092ZXJsYXBzLnNpemUoKTsgaSsr
KQorICAgICAgICAgICAgICAgICAgICBMT0dfRVJST1IoIiAgJWQ6ICVzIiwgKGkrMSkgc2xvd092
ZXJsYXBzW2ldLT50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBMT0dfRVJST1IoIkludGVy
dmFsIHRyZWU6Iik7CisgICAgICAgICAgICAgICAgdHJlZS5kdW1wKCk7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBBU1NFUlQob3ZlcmxhcHMuc2l6ZSgpID09IHNsb3dPdmVybGFwcy5zaXpl
KCkpOworI2VuZGlmIC8vIGRlZmluZWQoR1BVX1BBVEhfUFJPQ0VTU09SX0RFQlVHX09SSUVOVEFU
SU9OKSAmJiAhZGVmaW5lZChOREVCVUcpCisgICAgICAgICAgICBmb3IgKFZlY3RvcjxJbnRlcnZh
bFR5cGU+OjppdGVyYXRvciBpdGVyID0gb3ZlcmxhcHMuYmVnaW4oKTsgaXRlciAhPSBvdmVybGFw
cy5lbmQoKTsgKytpdGVyKSB7CisgICAgICAgICAgICAgICAgY29uc3QgSW50ZXJ2YWxUeXBlJiBp
bnRlcnZhbCA9ICppdGVyOworICAgICAgICAgICAgICAgIFNlZ21lbnQqIHF1ZXJ5U2VnbWVudCA9
IGludGVydmFsLmRhdGEoKTsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUgc2VnbWVudHMgY29t
aW5nIGZyb20gdGhlIHNhbWUgY29udG91ci4KKyAgICAgICAgICAgICAgICBpZiAocXVlcnlTZWdt
ZW50LT5jb250b3VyKCkgIT0gY3VyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgcGVy
Zm9ybSBxdWVyaWVzIHRoYXQgY2FuIGFmZmVjdCB0aGUgY29tcHV0YXRpb24uCisgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IEZsb2F0UmVjdCYgYm91bmRpbmdCb3ggPSBxdWVyeVNlZ21lbnQtPmNv
bnRvdXIoKS0+Ym91bmRpbmdCb3goKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlZy0+Z2V0
UG9pbnQoMCkueCgpID49IGJvdW5kaW5nQm94LngoKQorICAgICAgICAgICAgICAgICAgICAgICAg
JiYgc2VnLT5nZXRQb2ludCgwKS54KCkgPD0gYm91bmRpbmdCb3gubWF4WCgpKSB7CisgICAgICAg
ICAgICAgICAgICAgICAgICBudW1Dcm9zc2luZ3MgKz0gcXVlcnlTZWdtZW50LT5udW1Dcm9zc2lu
Z3NGb3JYUmF5KHNlZy0+Z2V0UG9pbnQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtYmlndW91cyk7
CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW1iaWd1b3VzKSB7CisjaWZuZGVmIE5ERUJV
RworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZlcmJvc2VMb2dnaW5nKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR19FUlJPUigiQW1iaWd1b3VzIGludGVy
c2VjdGlvbiBxdWVyeSBhdCBwb2ludCAoJWYsICVmKSIsIHNlZy0+Z2V0UG9pbnQoMCkueCgpLCBz
ZWctPmdldFBvaW50KDApLnkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExP
R19FUlJPUigiUXVlcnkgc2VnbWVudDogJXMiLCBxdWVyeVNlZ21lbnQtPnRvU3RyaW5nKCkuYXNj
aWkoKS5kYXRhKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBBYm9ydCBpdGVyYXRpb24gb3ZlciBv
dmVybGFwcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvLyBmb3IgKFNl
Z21lbnQqIHNlZyA9IGN1ci0+YmVnaW4oKTsgLi4uCisKKyAgICAgICAgY3VyLT5zZXRGaWxsU2lk
ZSgoY3VyLT5pc09yaWVudGVkQ291bnRlckNsb2Nrd2lzZSgpIF4gKG51bUNyb3NzaW5ncyAmIDEp
KSA/IExvb3BCbGlubkNvbnN0YW50czo6TGVmdFNpZGUgOiBMb29wQmxpbm5Db25zdGFudHM6OlJp
Z2h0U2lkZSk7CisgICAgfQorfQorCit2b2lkIExvb3BCbGlublBhdGhQcm9jZXNzb3I6OmRldGVy
bWluZU9yaWVudGF0aW9uKENvbnRvdXIqIGNvbnRvdXIpCit7CisgICAgLy8gRGV0ZXJtaW5lIHNp
Z25lZCBhcmVhIG9mIHRoZSBwb2x5Z29uIHJlcHJlc2VudGVkIGJ5IHRoZSBwb2ludHMKKyAgICAv
LyBhbG9uZyB0aGUgc2VnbWVudHMuIENvbnNpZGVyIHRoaXMgYW4gYXBwcm94aW1hdGlvbiB0byB0
aGUgdHJ1ZQorICAgIC8vIG9yaWVudGF0aW9uIG9mIHRoZSBwb2x5Z29uOyBpdCBwcm9iYWJseSB3
b24ndCBoYW5kbGUKKyAgICAvLyBzZWxmLWludGVyc2VjdGluZyBjdXJ2ZXMgY29ycmVjdGx5Lgor
ICAgIC8vCisgICAgLy8gVGhlcmUgaXMgYWxzbyBhIHByZXR0eSBiYXNpYyBhc3N1bXB0aW9uIGhl
cmUgdGhhdCB0aGUgY29udG91ciBpcworICAgIC8vIGNsb3NlZC4KKyAgICBmbG9hdCBzaWduZWRB
cmVhID0gMDsKKyAgICBmb3IgKFNlZ21lbnQqIHNlZyA9IGNvbnRvdXItPmJlZ2luKCk7CisgICAg
ICAgICBzZWcgIT0gY29udG91ci0+ZW5kKCk7CisgICAgICAgICBzZWcgPSBzZWctPm5leHQoKSkg
eworICAgICAgICBpbnQgbGltaXQgPSAoc2VnLT5raW5kKCkgPT0gU2VnbWVudDo6Q3ViaWMpID8g
NCA6IDI7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGltaXQ7IGkrKykgeworICAgICAg
ICAgICAgY29uc3QgRmxvYXRQb2ludCYgcHJldlBvaW50ID0gc2VnLT5nZXRQb2ludChpIC0gMSk7
CisgICAgICAgICAgICBjb25zdCBGbG9hdFBvaW50JiBwb2ludCA9IHNlZy0+Z2V0UG9pbnQoaSk7
CisgICAgICAgICAgICBmbG9hdCBjdXJBcmVhID0gcHJldlBvaW50LngoKSAqIHBvaW50LnkoKSAt
IHByZXZQb2ludC55KCkgKiBwb2ludC54KCk7CisjaWZuZGVmIE5ERUJVRworICAgICAgICAgICAg
aWYgKG1fdmVyYm9zZUxvZ2dpbmcpCisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJBZGRpbmcg
dG8gc2lnbmVkIGFyZWEgKCVmLCAlZikgLT4gKCVmLCAlZikgPSAlZiIsIHByZXZQb2ludC54KCks
IHByZXZQb2ludC55KCksIHBvaW50LngoKSwgcG9pbnQueSgpLCBjdXJBcmVhKTsKKyNlbmRpZgor
ICAgICAgICAgICAgc2lnbmVkQXJlYSArPSBjdXJBcmVhOworICAgICAgICB9CisgICAgfQorCisg
ICAgaWYgKHNpZ25lZEFyZWEgPiAwKQorICAgICAgICBjb250b3VyLT5zZXRJc09yaWVudGVkQ291
bnRlckNsb2Nrd2lzZSh0cnVlKTsKKyAgICBlbHNlCisgICAgICAgIGNvbnRvdXItPnNldElzT3Jp
ZW50ZWRDb3VudGVyQ2xvY2t3aXNlKGZhbHNlKTsKK30KKworbmFtZXNwYWNlIHsKKworLy8tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCisvLyBDbGFzc2VzIGFuZCB0eXBlZGVmcyBuZWVkZWQgZm9yIGN1cnZlIHN1YmRp
dmlzaW9uLiBUaGVzZSBjYW4ndCBiZSBzY29wZWQKKy8vIHdpdGhpbiB0aGUgc3ViZGl2aWRlQ3Vy
dmVzKCkgbWV0aG9kIGl0c2VsZiwgYmVjYXVzZSB0ZW1wbGF0ZXMgdGhlbiBmYWlsCisvLyB0byBp
bnN0YW50aWF0ZS4KKworLy8gVGhlIHVzZXIgZGF0YSB3aGljaCBpcyBwbGFjZWQgaW4gdGhlIFBP
REludGVydmFsVHJlZS4KK3N0cnVjdCBTd2VlcERhdGEgeworICAgIFN3ZWVwRGF0YSgpCisgICAg
ICAgIDogdHJpYW5nbGUoMCkKKyAgICAgICAgLCBzZWdtZW50KDApCisgICAgeworICAgIH0KKwor
ICAgIC8vIFRoZSB0cmlhbmdsZSB0aGlzIGludGVydmFsIGlzIGFzc29jaWF0ZWQgd2l0aAorICAg
IExvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpUcmlhbmdsZSogdHJpYW5nbGU7CisgICAgLy8g
VGhlIHNlZ21lbnQgdGhlIHRyaWFuZ2xlIGlzIGFzc29jaWF0ZWQgd2l0aAorICAgIFNlZ21lbnQq
IHNlZ21lbnQ7Cit9OworCit0eXBlZGVmIFBPREludGVydmFsVHJlZTxmbG9hdCwgU3dlZXBEYXRh
Kj4gU3dlZXBUcmVlOwordHlwZWRlZiBTd2VlcFRyZWU6OkludGVydmFsVHlwZSBTd2VlcEludGVy
dmFsOworCisvLyBUaGUgZW50cnkgLyBleGl0IGV2ZW50cyB3aGljaCBvY2N1ciBhdCB0aGUgbWlu
aW11bSBhbmQgbWF4aW11bSB4CisvLyBjb29yZGluYXRlcyBvZiB0aGUgY29udHJvbCBwb2ludCB0
cmlhbmdsZXMnIGJvdW5kaW5nIGJveGVzLgorLy8KKy8vIE5vdGUgdGhhdCB0aGlzIGNsYXNzIHJl
cXVpcmVzIGl0cyBjb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50CisvLyBvcGVyYXRvciBz
aW5jZSBpdCBuZWVkcyB0byBiZSBzdG9yZWQgaW4gYSBWZWN0b3IuCitjbGFzcyBTd2VlcEV2ZW50
IHsKK3B1YmxpYzoKKyAgICBTd2VlcEV2ZW50KCkKKyAgICAgICAgOiBtX3goMCkKKyAgICAgICAg
LCBtX2VudHJ5KGZhbHNlKQorICAgICAgICAsIG1faW50ZXJ2YWwoMCwgMCwgMCkKKyAgICB7Cisg
ICAgfQorCisgICAgLy8gSW5pdGlhbGl6ZXMgdGhlIFN3ZWVwRXZlbnQuCisgICAgdm9pZCBzZXR1
cChmbG9hdCB4LCBib29sIGVudHJ5LCBTd2VlcEludGVydmFsIGludGVydmFsKQorICAgIHsKKyAg
ICAgICAgbV94ID0geDsKKyAgICAgICAgbV9lbnRyeSA9IGVudHJ5OworICAgICAgICBtX2ludGVy
dmFsID0gaW50ZXJ2YWw7CisgICAgfQorCisgICAgZmxvYXQgeCgpIGNvbnN0IHsgcmV0dXJuIG1f
eDsgfQorICAgIGJvb2wgZW50cnkoKSBjb25zdCB7IHJldHVybiBtX2VudHJ5OyB9CisgICAgY29u
c3QgU3dlZXBJbnRlcnZhbCYgaW50ZXJ2YWwoKSBjb25zdCB7IHJldHVybiBtX2ludGVydmFsOyB9
CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBTd2VlcEV2ZW50JiBvdGhlcikgY29uc3QKKyAg
ICB7CisgICAgICAgIHJldHVybiBtX3ggPCBvdGhlci5tX3g7CisgICAgfQorCitwcml2YXRlOgor
ICAgIGZsb2F0IG1feDsKKyAgICBib29sIG1fZW50cnk7CisgICAgU3dlZXBJbnRlcnZhbCBtX2lu
dGVydmFsOworfTsKKworYm9vbCB0cmlhbmdsZXNPdmVybGFwKExvb3BCbGlubkxvY2FsVHJpYW5n
dWxhdG9yOjpUcmlhbmdsZSogdDAsCisgICAgICAgICAgICAgICAgICAgICAgTG9vcEJsaW5uTG9j
YWxUcmlhbmd1bGF0b3I6OlRyaWFuZ2xlKiB0MSkKK3sKKyAgICByZXR1cm4gdHJpYW5nbGVzT3Zl
cmxhcCh0MC0+Z2V0VmVydGV4KDApLT54eUNvb3JkaW5hdGVzKCksCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdDAtPmdldFZlcnRleCgxKS0+eHlDb29yZGluYXRlcygpLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHQwLT5nZXRWZXJ0ZXgoMiktPnh5Q29vcmRpbmF0ZXMoKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB0MS0+Z2V0VmVydGV4KDApLT54eUNvb3JkaW5hdGVz
KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDEtPmdldFZlcnRleCgxKS0+eHlDb29y
ZGluYXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxLT5nZXRWZXJ0ZXgoMikt
Pnh5Q29vcmRpbmF0ZXMoKSk7Cit9CisKK30gLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCit2b2lk
IExvb3BCbGlublBhdGhQcm9jZXNzb3I6OnN1YmRpdmlkZUN1cnZlcygpCit7CisgICAgLy8gV2Ug
bmVlZCB0byBkZXRlcm1pbmUgYWxsIG92ZXJsYXBzIG9mIGFsbCBjb250cm9sIHBvaW50IHRyaWFu
Z2xlcworICAgIC8vIChmcm9tIGRpZmZlcmVudCBzZWdtZW50cywgbm90IHRoZSBzYW1lIHNlZ21l
bnQpIGFuZCwgaWYgYW55CisgICAgLy8gZXhpc3QsIHN1YmRpdmlkZSB0aGUgYXNzb2NpYXRlZCBj
dXJ2ZXMuCisgICAgLy8KKyAgICAvLyBUaGUgcGxhbmUtc3dlZXAgYWxnb3JpdGhtIGRldGVybWlu
ZXMgYWxsIG92ZXJsYXBzIG9mIGEgc2V0IG9mCisgICAgLy8gcmVjdGFuZ2xlcyBpbiB0aGUgMkQg
cGxhbmUuIE91ciBwcm9ibGVtIG1hcHMgdmVyeSB3ZWxsIHRvIHRoaXMKKyAgICAvLyBhbGdvcml0
aG0gYW5kIHNpZ25pZmljYW50bHkgcmVkdWNlcyB0aGUgY29tcGxleGl0eSBjb21wYXJlZCB0byBh
CisgICAgLy8gbmFpdmUgaW1wbGVtZW50YXRpb24uCisgICAgLy8KKyAgICAvLyBFYWNoIGJvdW5k
aW5nIGJveCBvZiBhIGNvbnRyb2wgcG9pbnQgdHJpYW5nbGUgaXMgY29udmVydGVkIGludG8KKyAg
ICAvLyBhbiAiZW50cnkiIGV2ZW50IGF0IGl0cyBzbWFsbGVzdCBYIGNvb3JkaW5hdGUgYW5kIGFu
ICJleGl0IiBldmVudAorICAgIC8vIGF0IGl0cyBsYXJnZXN0IFggY29vcmRpbmF0ZS4gRWFjaCBl
dmVudCBoYXMgYW4gYXNzb2NpYXRlZAorICAgIC8vIG9uZS1kaW1lbnNpb25hbCBpbnRlcnZhbCBy
ZXByZXNlbnRpbmcgdGhlIFkgc3BhbiBvZiB0aGUgYm91bmRpbmcKKyAgICAvLyBib3guIFdlIHNv
cnQgdGhlc2UgZXZlbnRzIGJ5IGluY3JlYXNpbmcgWCBjb29yZGluYXRlLiBXZSB0aGVuCisgICAg
Ly8gaXRlcmF0ZSB0aHJvdWdoIHRoZW0uIEZvciBlYWNoIGVudHJ5IGV2ZW50IHdlIGFkZCB0aGUg
aW50ZXJ2YWwgdG8KKyAgICAvLyBhIHNpZGUgaW50ZXJ2YWwgdHJlZSwgYW5kIHF1ZXJ5IHRoaXMg
dHJlZSBmb3Igb3ZlcmxhcHBpbmcKKyAgICAvLyBpbnRlcnZhbHMuIEFueSBvdmVybGFwcGluZyBp
bnRlcnZhbCBjb3JyZXNwb25kcyB0byBhbiBvdmVybGFwcGluZworICAgIC8vIGJvdW5kaW5nIGJv
eC4gRm9yIGVhY2ggZXhpdCBldmVudCB3ZSByZW1vdmUgdGhlIGFzc29jaWF0ZWQKKyAgICAvLyBp
bnRlcnZhbCBmcm9tIHRoZSBpbnRlcnZhbCB0cmVlLgorCisgICAgVmVjdG9yPFNlZ21lbnQqPiBj
dXJTZWdtZW50czsKKyAgICBWZWN0b3I8U2VnbWVudCo+IG5leHRTZWdtZW50czsKKworICAgIC8v
IFN0YXJ0IHRoaW5ncyBvZmYgYnkgY29uc2lkZXJpbmcgYWxsIG9mIHRoZSBzZWdtZW50cworICAg
IGZvciAoVmVjdG9yPENvbnRvdXIqPjo6aXRlcmF0b3IgaXRlciA9IG1fY29udG91cnMuYmVnaW4o
KTsgaXRlciAhPSBtX2NvbnRvdXJzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgICAgQ29udG91ciog
Y3VyID0gKml0ZXI7CisgICAgICAgIGZvciAoU2VnbWVudCogc2VnID0gY3VyLT5iZWdpbigpOyBz
ZWcgIT0gY3VyLT5lbmQoKTsgc2VnID0gc2VnLT5uZXh0KCkpIHsKKyAgICAgICAgICAgIGlmIChz
ZWctPmtpbmQoKSA9PSBTZWdtZW50OjpDdWJpYykgeworICAgICAgICAgICAgICAgIHNlZy0+dHJp
YW5ndWxhdGUoTG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OkRvbnRDb21wdXRlSW5zaWRlRWRn
ZXMsIDApOworICAgICAgICAgICAgICAgIGN1clNlZ21lbnRzLmFwcGVuZChzZWcpOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gU3ViZGl2aWRlIGN1cnZlcyBhdCBt
b3N0IHRoaXMgbWFueSB0aW1lcworICAgIGNvbnN0IGludCBNYXhJdGVyYXRpb25zID0gNTsKKyAg
ICBWZWN0b3I8U3dlZXBJbnRlcnZhbD4gb3ZlcmxhcHM7CisKKyAgICBmb3IgKGludCBjdXJyZW50
SXRlcmF0aW9uID0gMDsgY3VycmVudEl0ZXJhdGlvbiA8IE1heEl0ZXJhdGlvbnM7ICsrY3VycmVu
dEl0ZXJhdGlvbikgeworICAgICAgICBpZiAoIWN1clNlZ21lbnRzLnNpemUoKSkKKyAgICAgICAg
ICAgIC8vIERvbmUKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIFZlY3RvcjxTd2VlcEV2
ZW50PiBldmVudHM7CisgICAgICAgIFN3ZWVwVHJlZSB0cmVlKG1fYXJlbmEpOworICAgICAgICBm
b3IgKFZlY3RvcjxTZWdtZW50Kj46Oml0ZXJhdG9yIGl0ZXIgPSBjdXJTZWdtZW50cy5iZWdpbigp
OyBpdGVyICE9IGN1clNlZ21lbnRzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgICAgICAgIFNlZ21l
bnQqIHNlZyA9ICppdGVyOworICAgICAgICAgICAgQVNTRVJUKHNlZy0+a2luZCgpID09IFNlZ21l
bnQ6OkN1YmljKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VnLT5udW1iZXJP
ZlRyaWFuZ2xlcygpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBMb29wQmxpbm5Mb2NhbFRyaWFu
Z3VsYXRvcjo6VHJpYW5nbGUqIHRyaWFuZ2xlID0gc2VnLT5nZXRUcmlhbmdsZShpKTsKKyAgICAg
ICAgICAgICAgICBGbG9hdFJlY3QgYm91bmRpbmdCb3g7CisgICAgICAgICAgICAgICAgYm91bmRp
bmdCb3guZml0VG9Qb2ludHModHJpYW5nbGUtPmdldFZlcnRleCgwKS0+eHlDb29yZGluYXRlcygp
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlLT5nZXRW
ZXJ0ZXgoMSktPnh5Q29vcmRpbmF0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB0cmlhbmdsZS0+Z2V0VmVydGV4KDIpLT54eUNvb3JkaW5hdGVzKCkpOworICAg
ICAgICAgICAgICAgIC8vIElnbm9yZSB6ZXJvLXdpZHRoIHRyaWFuZ2xlcyB0byBhdm9pZCBpc3N1
ZXMgd2l0aAorICAgICAgICAgICAgICAgIC8vIGNvaW5jaWRlbnQgZW50cnkgYW5kIGV4aXQgZXZl
bnRzIGZvciB0aGUgc2FtZSB0cmlhbmdsZQorICAgICAgICAgICAgICAgIGlmIChib3VuZGluZ0Jv
eC5tYXhYKCkgPiBib3VuZGluZ0JveC54KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3dlZXBE
YXRhKiBkYXRhID0gbV9hcmVuYS0+YWxsb2NhdGVPYmplY3Q8U3dlZXBEYXRhPigpOworICAgICAg
ICAgICAgICAgICAgICBkYXRhLT50cmlhbmdsZSA9IHRyaWFuZ2xlOworICAgICAgICAgICAgICAg
ICAgICBkYXRhLT5zZWdtZW50ID0gc2VnOworICAgICAgICAgICAgICAgICAgICBTd2VlcEludGVy
dmFsIGludGVydmFsID0gdHJlZS5jcmVhdGVJbnRlcnZhbChib3VuZGluZ0JveC55KCksIGJvdW5k
aW5nQm94Lm1heFkoKSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIC8vIEFkZCBlbnRyeSBh
bmQgZXhpdCBldmVudHMKKyAgICAgICAgICAgICAgICAgICAgU3dlZXBFdmVudCBldmVudDsKKyAg
ICAgICAgICAgICAgICAgICAgZXZlbnQuc2V0dXAoYm91bmRpbmdCb3gueCgpLCB0cnVlLCBpbnRl
cnZhbCk7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5hcHBlbmQoZXZlbnQpOworICAgICAg
ICAgICAgICAgICAgICBldmVudC5zZXR1cChib3VuZGluZ0JveC5tYXhYKCksIGZhbHNlLCBpbnRl
cnZhbCk7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5hcHBlbmQoZXZlbnQpOworICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFNvcnQg
ZXZlbnRzIGJ5IGluY3JlYXNpbmcgWCBjb29yZGluYXRlCisgICAgICAgIHN0ZDo6c29ydChldmVu
dHMuYmVnaW4oKSwgZXZlbnRzLmVuZCgpKTsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgIGZvciAo
c2l6ZV90IGlpID0gMTsgaWkgPCBldmVudHMuc2l6ZSgpOyArK2lpKQorICAgICAgICAgICAgQVNT
RVJUKGV2ZW50c1tpaSAtIDFdLngoKSA8PSBldmVudHNbaWldLngoKSk7CisjZW5kaWYKKworICAg
ICAgICAvLyBOb3cgaXRlcmF0ZSB0aHJvdWdoIHRoZSBldmVudHMKKyAgICAgICAgZm9yIChWZWN0
b3I8U3dlZXBFdmVudD46Oml0ZXJhdG9yIGl0ZXIgPSBldmVudHMuYmVnaW4oKTsgaXRlciAhPSBl
dmVudHMuZW5kKCk7ICsraXRlcikgeworICAgICAgICAgICAgU3dlZXBFdmVudCBldmVudCA9ICpp
dGVyOworICAgICAgICAgICAgaWYgKGV2ZW50LmVudHJ5KCkpIHsKKyAgICAgICAgICAgICAgICAv
LyBTZWUgd2hldGhlciB0aGUgYXNzb2NpYXRlZCBzZWdtZW50IGhhcyBiZWVuIHN1YmRpdmlkZWQg
eWV0CisgICAgICAgICAgICAgICAgaWYgKCFldmVudC5pbnRlcnZhbCgpLmRhdGEoKS0+c2VnbWVu
dC0+bWFya2VkRm9yU3ViZGl2aXNpb24oKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBRdWVy
eSB0aGUgdHJlZQorICAgICAgICAgICAgICAgICAgICBvdmVybGFwcy5jbGVhcigpOworICAgICAg
ICAgICAgICAgICAgICB0cmVlLmFsbE92ZXJsYXBzKGV2ZW50LmludGVydmFsKCksIG92ZXJsYXBz
KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gTm93IHNlZSBleGFjdGx5IHdoaWNoIHRyaWFuZ2xl
cyBvdmVybGFwIHRoaXMgb25lCisgICAgICAgICAgICAgICAgICAgIGZvciAoVmVjdG9yPFN3ZWVw
SW50ZXJ2YWw+OjppdGVyYXRvciBpdGVyID0gb3ZlcmxhcHMuYmVnaW4oKTsgaXRlciAhPSBvdmVy
bGFwcy5lbmQoKTsgKytpdGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTd2VlcEludGVy
dmFsIG92ZXJsYXAgPSAqaXRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgcGF5
IGF0dGVudGlvbiB0byBvdmVybGFwcyBmcm9tIGEgZGlmZmVyZW50IFNlZ21lbnQKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGlmIChldmVudC5pbnRlcnZhbCgpLmRhdGEoKS0+c2VnbWVudCAhPSBv
dmVybGFwLmRhdGEoKS0+c2VnbWVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v
IFNlZSB3aGV0aGVyIHRoZSB0cmlhbmdsZXMgYWN0dWFsbHkgb3ZlcmxhcAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGlmICh0cmlhbmdsZXNPdmVybGFwKGV2ZW50LmludGVydmFsKCkuZGF0
YSgpLT50cmlhbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBvdmVybGFwLmRhdGEoKS0+dHJpYW5nbGUpKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIC8vIEFjdHVhbGx5IHN1YmRpdmlkZSB0aGUgc2VnbWVudHMuCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVhY2ggb25lIG1pZ2h0IGFscmVhZHkgaGF2ZSBi
ZWVuIHN1YmRpdmlkZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZ21lbnQq
IHNlZyA9IGV2ZW50LmludGVydmFsKCkuZGF0YSgpLT5zZWdtZW50OworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjb25kaXRpb25hbGx5U3ViZGl2aWRlKHNlZywgbmV4dFNlZ21lbnRz
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnID0gb3ZlcmxhcC5kYXRhKCkt
PnNlZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsbHlT
dWJkaXZpZGUoc2VnLCBuZXh0U2VnbWVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhpcyBpbnRlcnZhbCBpbnRv
IHRoZSB0cmVlCisgICAgICAgICAgICAgICAgdHJlZS5hZGQoZXZlbnQuaW50ZXJ2YWwoKSk7Cisg
ICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGlzIGludGVy
dmFsIGZyb20gdGhlIHRyZWUKKyAgICAgICAgICAgICAgICB0cmVlLnJlbW92ZShldmVudC5pbnRl
cnZhbCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGN1clNlZ21lbnRz
LnN3YXAobmV4dFNlZ21lbnRzKTsKKyAgICAgICAgbmV4dFNlZ21lbnRzLmNsZWFyKCk7CisgICAg
fQorfQorCit2b2lkIExvb3BCbGlublBhdGhQcm9jZXNzb3I6OmNvbmRpdGlvbmFsbHlTdWJkaXZp
ZGUoU2VnbWVudCogc2VnLCBWZWN0b3I8U2VnbWVudCo+JiBuZXh0U2VnbWVudHMpCit7CisgICAg
aWYgKCFzZWctPm1hcmtlZEZvclN1YmRpdmlzaW9uKCkpIHsKKyAgICAgICAgc2VnLT5zZXRNYXJr
ZWRGb3JTdWJkaXZpc2lvbih0cnVlKTsKKyAgICAgICAgU2VnbWVudCogbmV4dCA9IHNlZy0+Y29u
dG91cigpLT5zdWJkaXZpZGUoc2VnKTsKKyAgICAgICAgLy8gVHJpYW5ndWxhdGUgdGhlIG5ld2x5
IHN1YmRpdmlkZWQgc2VnbWVudHMuCisgICAgICAgIG5leHQtPnRyaWFuZ3VsYXRlKExvb3BCbGlu
bkxvY2FsVHJpYW5ndWxhdG9yOjpEb250Q29tcHV0ZUluc2lkZUVkZ2VzLCAwKTsKKyAgICAgICAg
bmV4dC0+bmV4dCgpLT50cmlhbmd1bGF0ZShMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6RG9u
dENvbXB1dGVJbnNpZGVFZGdlcywgMCk7CisgICAgICAgIC8vIEFkZCB0aGVtIGZvciB0aGUgbmV4
dCBpdGVyYXRpb24uCisgICAgICAgIG5leHRTZWdtZW50cy5hcHBlbmQobmV4dCk7CisgICAgICAg
IG5leHRTZWdtZW50cy5hcHBlbmQobmV4dC0+bmV4dCgpKTsKKyAgICB9Cit9CisKKyNpZm5kZWYg
TkRFQlVHCit2b2lkIExvb3BCbGlublBhdGhQcm9jZXNzb3I6OnN1YmRpdmlkZUN1cnZlc1Nsb3co
KQoreworICAgIC8vIEFsdGVybmF0ZSwgc2lnbmlmaWNhbnRseSBzbG93ZXIgYWxnb3JpdGhtIGZv
ciBjdXJ2ZSBzdWJkaXZpc2lvbgorICAgIC8vIGZvciB1c2UgaW4gZGVidWdnaW5nLgorICAgIFZl
Y3RvcjxTZWdtZW50Kj4gY3VyU2VnbWVudHM7CisgICAgVmVjdG9yPFNlZ21lbnQqPiBuZXh0U2Vn
bWVudHM7CisKKyAgICAvLyBTdGFydCB0aGluZ3Mgb2ZmIGJ5IGNvbnNpZGVyaW5nIGFsbCBvZiB0
aGUgc2VnbWVudHMKKyAgICBmb3IgKFZlY3RvcjxDb250b3VyKj46Oml0ZXJhdG9yIGl0ZXIgPSBt
X2NvbnRvdXJzLmJlZ2luKCk7IGl0ZXIgIT0gbV9jb250b3Vycy5lbmQoKTsgKytpdGVyKSB7Cisg
ICAgICAgIENvbnRvdXIqIGN1ciA9ICppdGVyOworICAgICAgICBmb3IgKFNlZ21lbnQqIHNlZyA9
IGN1ci0+YmVnaW4oKTsgc2VnICE9IGN1ci0+ZW5kKCk7IHNlZyA9IHNlZy0+bmV4dCgpKSB7Cisg
ICAgICAgICAgICBpZiAoc2VnLT5raW5kKCkgPT0gU2VnbWVudDo6Q3ViaWMpIHsKKyAgICAgICAg
ICAgICAgICBzZWctPnRyaWFuZ3VsYXRlKExvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpEb250
Q29tcHV0ZUluc2lkZUVkZ2VzLCAwKTsKKyAgICAgICAgICAgICAgICBjdXJTZWdtZW50cy5hcHBl
bmQoc2VnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFN1YmRp
dmlkZSBjdXJ2ZXMgYXQgbW9zdCB0aGlzIG1hbnkgdGltZXMKKyAgICBjb25zdCBpbnQgTWF4SXRl
cmF0aW9ucyA9IDU7CisKKyAgICBmb3IgKGludCBjdXJyZW50SXRlcmF0aW9uID0gMDsgY3VycmVu
dEl0ZXJhdGlvbiA8IE1heEl0ZXJhdGlvbnM7ICsrY3VycmVudEl0ZXJhdGlvbikgeworICAgICAg
ICBpZiAoIWN1clNlZ21lbnRzLnNpemUoKSkKKyAgICAgICAgICAgIC8vIERvbmUKKyAgICAgICAg
ICAgIGJyZWFrOworCisgICAgICAgIGZvciAoVmVjdG9yPFNlZ21lbnQqPjo6aXRlcmF0b3IgaXRl
ciA9IGN1clNlZ21lbnRzLmJlZ2luKCk7IGl0ZXIgIT0gY3VyU2VnbWVudHMuZW5kKCk7ICsraXRl
cikgeworICAgICAgICAgICAgU2VnbWVudCogc2VnID0gKml0ZXI7CisgICAgICAgICAgICBBU1NF
UlQoc2VnLT5raW5kKCkgPT0gU2VnbWVudDo6Q3ViaWMpOworICAgICAgICAgICAgZm9yIChWZWN0
b3I8U2VnbWVudCo+OjppdGVyYXRvciBpdGVyMiA9IGN1clNlZ21lbnRzLmJlZ2luKCk7CisgICAg
ICAgICAgICAgICAgIGl0ZXIyICE9IGN1clNlZ21lbnRzLmVuZCgpOworICAgICAgICAgICAgICAg
ICBpdGVyMisrKSB7CisgICAgICAgICAgICAgICAgU2VnbWVudCogc2VnMiA9ICppdGVyMjsKKyAg
ICAgICAgICAgICAgICBBU1NFUlQoc2VnMi0+a2luZCgpID09IFNlZ21lbnQ6OkN1YmljKTsKKyAg
ICAgICAgICAgICAgICBpZiAoc2VnICE9IHNlZzIpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9y
IChpbnQgaSA9IDA7IGkgPCBzZWctPm51bWJlck9mVHJpYW5nbGVzKCk7IGkrKykgeworICAgICAg
ICAgICAgICAgICAgICAgICAgTG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OlRyaWFuZ2xlKiB0
cmlhbmdsZSA9IHNlZy0+Z2V0VHJpYW5nbGUoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBm
b3IgKGludCBqID0gMDsgaiA8IHNlZzItPm51bWJlck9mVHJpYW5nbGVzKCk7IGorKykgeworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpUcmlh
bmdsZSogdHJpYW5nbGUyID0gc2VnMi0+Z2V0VHJpYW5nbGUoaik7CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKHRyaWFuZ2xlc092ZXJsYXAodHJpYW5nbGUsIHRyaWFuZ2xlMikpIHsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uYWxseVN1YmRpdmlkZShz
ZWcsIG5leHRTZWdtZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRp
dGlvbmFsbHlTdWJkaXZpZGUoc2VnMiwgbmV4dFNlZ21lbnRzKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAg
ICAgICBjdXJTZWdtZW50cy5zd2FwKG5leHRTZWdtZW50cyk7CisgICAgICAgIG5leHRTZWdtZW50
cy5jbGVhcigpOworICAgIH0KK30KKyNlbmRpZgorCituYW1lc3BhY2UgeworCisvLy0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KKy8vIFN0cnVjdHVyZXMgYW5kIGNhbGxiYWNrcyBmb3IgdGVzc2VsbGF0aW9uIG9mIHRo
ZSBpbnRlcmlvciByZWdpb24gb2YKKy8vIHRoZSBjb250b3Vycy4KKworLy8gVGhlIHVzZXIgZGF0
YSBmb3IgdGhlIEdMVSB0ZXNzZWxsYXRvci4KK3N0cnVjdCBUZXNzZWxsYXRpb25TdGF0ZSB7Cisg
ICAgVGVzc2VsbGF0aW9uU3RhdGUoTG9vcEJsaW5uUGF0aENhY2hlJiBpbnB1dENhY2hlKQorICAg
ICAgICA6IGNhY2hlKGlucHV0Q2FjaGUpIHsgfQorCisgICAgTG9vcEJsaW5uUGF0aENhY2hlJiBj
YWNoZTsKKyAgICBWZWN0b3I8dm9pZCo+IGFsbG9jYXRlZFBvaW50ZXJzOworfTsKKworc3RhdGlj
IHZvaWQgdmVydGV4Q2FsbGJhY2sodm9pZCogdmVydGV4RGF0YSwgdm9pZCogZGF0YSkKK3sKKyAg
ICBUZXNzZWxsYXRpb25TdGF0ZSogc3RhdGUgPSBzdGF0aWNfY2FzdDxUZXNzZWxsYXRpb25TdGF0
ZSo+KGRhdGEpOworICAgIEdMZG91YmxlKiBsb2NhdGlvbiA9IHN0YXRpY19jYXN0PEdMZG91Ymxl
Kj4odmVydGV4RGF0YSk7CisgICAgc3RhdGUtPmNhY2hlLmFkZEludGVyaW9yVmVydGV4KHN0YXRp
Y19jYXN0PGZsb2F0Pihsb2NhdGlvblswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHN0YXRpY19jYXN0PGZsb2F0Pihsb2NhdGlvblsxXSkpOworfQorCitzdGF0aWMgdm9p
ZCBjb21iaW5lQ2FsbGJhY2soR0xkb3VibGUgY29vcmRzWzNdLCB2b2lkKiB2ZXJ0ZXhEYXRhWzRd
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZmxvYXQgd2VpZ2h0WzRdLCB2b2lkKiog
b3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwb2x5Z29uRGF0YSkK
K3sKKyAgICBUZXNzZWxsYXRpb25TdGF0ZSogc3RhdGUgPSBzdGF0aWNfY2FzdDxUZXNzZWxsYXRp
b25TdGF0ZSo+KHBvbHlnb25EYXRhKTsKKyAgICBHTGRvdWJsZSogb3V0VmVydGV4ID0gc3RhdGlj
X2Nhc3Q8R0xkb3VibGUqPihmYXN0TWFsbG9jKDMgKiBzaXplb2YoR0xkb3VibGUpKSk7CisgICAg
c3RhdGUtPmFsbG9jYXRlZFBvaW50ZXJzLmFwcGVuZChvdXRWZXJ0ZXgpOworICAgIG91dFZlcnRl
eFswXSA9IGNvb3Jkc1swXTsKKyAgICBvdXRWZXJ0ZXhbMV0gPSBjb29yZHNbMV07CisgICAgb3V0
VmVydGV4WzJdID0gY29vcmRzWzJdOworICAgICpvdXREYXRhID0gb3V0VmVydGV4OworfQorCitz
dGF0aWMgdm9pZCBlZGdlRmxhZ0NhbGxiYWNrKEdMYm9vbGVhbikKK3sKKyAgICAvLyBOby1vcCBq
dXN0IHRvIHByZXZlbnQgdHJpYW5nbGUgc3RyaXBzIGFuZCBmYW5zIGZyb20gYmVpbmcgcGFzc2Vk
IHRvIHVzLgorICAgIC8vIFNlZSB0aGUgT3BlbkdMIFByb2dyYW1taW5nIEd1aWRlLCBDaGFwdGVy
IDExLCAiVGVzc2VsbGF0b3JzIGFuZCBRdWFkcmljcyIuCit9CisKK30gLy8gYW5vbnltb3VzIG5h
bWVzcGFjZQorCit2b2lkIExvb3BCbGlublBhdGhQcm9jZXNzb3I6OnRlc3NlbGxhdGVJbnRlcmlv
cihMb29wQmxpbm5QYXRoQ2FjaGUmIGNhY2hlKQoreworICAgIC8vIEJlY2F1c2UgdGhlIEdMVSB0
ZXNzZWxsYXRvciByZXF1aXJlcyBpdHMgaW5wdXQgaW4KKyAgICAvLyBkb3VibGUtcHJlY2lzaW9u
IGZvcm1hdCwgd2UgbmVlZCB0byBtYWtlIGEgc2VwYXJhdGUgY29weSBvZiB0aGUKKyAgICAvLyBk
YXRhLgorICAgIFZlY3RvcjxHTGRvdWJsZT4gdmVydGV4RGF0YTsKKyAgICBWZWN0b3I8c2l6ZV90
PiBjb250b3VyRW5kaW5nczsKKyAgICAvLyBGb3IgYXZvaWRpbmcgYWRkaW5nIGNvaW5jaWRlbnQg
dmVydGljZXMuCisgICAgZmxvYXQgY3VyWCA9IDAsIGN1clkgPSAwOworICAgIGZvciAoVmVjdG9y
PENvbnRvdXIqPjo6aXRlcmF0b3IgaXRlciA9IG1fY29udG91cnMuYmVnaW4oKTsgaXRlciAhPSBt
X2NvbnRvdXJzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgICAgQ29udG91ciogY3VyID0gKml0ZXI7
CisgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKFNlZ21lbnQqIHNlZyA9
IGN1ci0+YmVnaW4oKTsgc2VnICE9IGN1ci0+ZW5kKCk7IHNlZyA9IHNlZy0+bmV4dCgpKSB7Cisg
ICAgICAgICAgICBpbnQgbnVtYmVyT2ZJbnRlcmlvclZlcnRpY2VzID0gc2VnLT5udW1iZXJPZklu
dGVyaW9yVmVydGljZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVy
T2ZJbnRlcmlvclZlcnRpY2VzIC0gMTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRmxvYXRQb2lu
dCBwb2ludCA9IHNlZy0+Z2V0SW50ZXJpb3JWZXJ0ZXgoaSk7CisgICAgICAgICAgICAgICAgaWYg
KGZpcnN0KSB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAg
ICAgICAgICAgIHZlcnRleERhdGEuYXBwZW5kKHBvaW50LngoKSk7CisgICAgICAgICAgICAgICAg
ICAgIHZlcnRleERhdGEuYXBwZW5kKHBvaW50LnkoKSk7CisgICAgICAgICAgICAgICAgICAgIHZl
cnRleERhdGEuYXBwZW5kKDApOworICAgICAgICAgICAgICAgICAgICBjdXJYID0gcG9pbnQueCgp
OworICAgICAgICAgICAgICAgICAgICBjdXJZID0gcG9pbnQueSgpOworICAgICAgICAgICAgICAg
IH0gZWxzZSBpZiAocG9pbnQueCgpICE9IGN1clggfHwgcG9pbnQueSgpICE9IGN1clkpICB7Cisg
ICAgICAgICAgICAgICAgICAgIHZlcnRleERhdGEuYXBwZW5kKHBvaW50LngoKSk7CisgICAgICAg
ICAgICAgICAgICAgIHZlcnRleERhdGEuYXBwZW5kKHBvaW50LnkoKSk7CisgICAgICAgICAgICAg
ICAgICAgIHZlcnRleERhdGEuYXBwZW5kKDApOworICAgICAgICAgICAgICAgICAgICBjdXJYID0g
cG9pbnQueCgpOworICAgICAgICAgICAgICAgICAgICBjdXJZID0gcG9pbnQueSgpOworICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb250b3VyRW5k
aW5ncy5hcHBlbmQodmVydGV4RGF0YS5zaXplKCkpOworICAgIH0KKyAgICAvLyBOb3cgdGhhdCB3
ZSBoYXZlIGFsbCBvZiB0aGUgdmVydGV4IGRhdGEgaW4gYSBzdGFibGUgbG9jYXRpb24gaW4KKyAg
ICAvLyBtZW1vcnksIGNhbGwgdGhlIHRlc3NlbGxhdG9yLgorICAgIEdMVXRlc3NlbGF0b3IqIHRl
c3MgPSBpbnRlcm5hbF9nbHVOZXdUZXNzKCk7CisgICAgVGVzc2VsbGF0aW9uU3RhdGUgc3RhdGUo
Y2FjaGUpOworICAgIGludGVybmFsX2dsdVRlc3NDYWxsYmFjayh0ZXNzLCBHTFVfVEVTU19WRVJU
RVhfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxH
THZvaWQgKCopKCk+KHZlcnRleENhbGxiYWNrKSk7CisgICAgaW50ZXJuYWxfZ2x1VGVzc0NhbGxi
YWNrKHRlc3MsIEdMVV9URVNTX0NPTUJJTkVfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcmVpbnRlcnByZXRfY2FzdDxHTHZvaWQgKCopKCk+KGNvbWJpbmVDYWxsYmFjaykpOwor
ICAgIGludGVybmFsX2dsdVRlc3NDYWxsYmFjayh0ZXNzLCBHTFVfVEVTU19FREdFX0ZMQUcsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8R0x2b2lkICgqKSgp
PihlZGdlRmxhZ0NhbGxiYWNrKSk7CisgICAgaW50ZXJuYWxfZ2x1VGVzc0JlZ2luUG9seWdvbih0
ZXNzLCAmc3RhdGUpOworICAgIGludGVybmFsX2dsdVRlc3NCZWdpbkNvbnRvdXIodGVzcyk7Cisg
ICAgR0xkb3VibGUqIGJhc2UgPSB2ZXJ0ZXhEYXRhLmRhdGEoKTsKKyAgICBpbnQgY29udG91cklu
ZGV4ID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZlcnRleERhdGEuc2l6ZSgpOyBp
ICs9IDMpIHsKKyAgICAgICAgaWYgKGkgPT0gY29udG91ckVuZGluZ3NbY29udG91ckluZGV4XSkg
eworICAgICAgICAgICAgaW50ZXJuYWxfZ2x1VGVzc0VuZENvbnRvdXIodGVzcyk7CisgICAgICAg
ICAgICBpbnRlcm5hbF9nbHVUZXNzQmVnaW5Db250b3VyKHRlc3MpOworICAgICAgICAgICAgKytj
b250b3VySW5kZXg7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJuYWxfZ2x1VGVzc1ZlcnRleCh0
ZXNzLCAmYmFzZVtpXSwgJmJhc2VbaV0pOworICAgIH0KKyAgICBpbnRlcm5hbF9nbHVUZXNzRW5k
Q29udG91cih0ZXNzKTsKKyAgICBpbnRlcm5hbF9nbHVUZXNzRW5kUG9seWdvbih0ZXNzKTsKKyAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRlLmFsbG9jYXRlZFBvaW50ZXJzLnNpemUoKTsg
aSsrKQorICAgICAgICBmYXN0RnJlZShzdGF0ZS5hbGxvY2F0ZWRQb2ludGVyc1tpXSk7CisgICAg
aW50ZXJuYWxfZ2x1RGVsZXRlVGVzcyh0ZXNzKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BCbGlublBh
dGhQcm9jZXNzb3IuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9ncHUvTG9vcEJsaW5uUGF0aFByb2Nlc3Nvci5oCShyZXZpc2lvbiAwKQorKysgU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BCbGlublBhdGhQcm9jZXNzb3IuaAko
cmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEg
R29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JT
ICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQor
ICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvLyBUaGUgbWFpbiBlbnRyeSBw
b2ludCBmb3IgTG9vcCBhbmQgQmxpbm4ncyBHUFUgYWNjZWxlcmF0ZWQgY3VydmUKKy8vIHJlbmRl
cmluZyBhbGdvcml0aG0uCisKKyNpZm5kZWYgTG9vcEJsaW5uUGF0aFByb2Nlc3Nvcl9oCisjZGVm
aW5lIExvb3BCbGlublBhdGhQcm9jZXNzb3JfaAorCisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxl
Lmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+
CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIFdl
IHVzZSBhIG5hbWVzcGFjZSBmb3IgY2xhc3NlcyB3aGljaCBhcmUgc2ltcGx5IGltcGxlbWVudGF0
aW9uCisvLyBkZXRhaWxzIG9mIHRoZSBhbGdvcml0aG0gYnV0IHdoaWNoIHdlIG5lZWQgdG8gcmVm
ZXJlbmNlIGZyb20gdGhlCisvLyBjbGFzcyBkZWZpbml0aW9uLgorbmFtZXNwYWNlIExvb3BCbGlu
blBhdGhQcm9jZXNzb3JJbXBsZW1lbnRhdGlvbiB7CisKK2NsYXNzIENvbnRvdXI7CitjbGFzcyBT
ZWdtZW50OworCit9IC8vIG5hbWVzcGFjZSBMb29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50
YXRpb24KKworY2xhc3MgUGF0aDsKK2NsYXNzIExvb3BCbGlublBhdGhDYWNoZTsKK2NsYXNzIFBP
REFyZW5hOworCisvLyBUaGUgTG9vcEJsaW5uUGF0aFByb2Nlc3NvciB0dXJucyBhIFBhdGggKGFz
c3VtZWQgdG8gY29udGFpbiBvbmUgb3IKKy8vIG1vcmUgY2xvc2VkIHJlZ2lvbnMpIGludG8gYSBz
ZXQgb2YgZXh0ZXJpb3IgYW5kIGludGVyaW9yIHRyaWFuZ2xlcywKKy8vIHN0b3JlZCBpbiB0aGUg
TG9vcEJsaW5uUGF0aENhY2hlLiBUaGUgZXh0ZXJpb3IgdHJpYW5nbGVzIGhhdmUKKy8vIGFzc29j
aWF0ZWQgM0QgdGV4dHVyZSBjb29yZGluYXRlcyB3aGljaCBhcmUgdXNlZCB0byBldmFsdWF0ZSB0
aGUKKy8vIGN1cnZlJ3MgaW5zaWRlL291dHNpZGUgZnVuY3Rpb24gb24gYSBwZXItcGl4ZWwgYmFz
aXMuIFRoZSBpbnRlcmlvcgorLy8gdHJpYW5nbGVzIGFyZSBmaWxsZWQgd2l0aCAxMDAlIG9wYWNp
dHkuCisvLworLy8gTm90ZSB0aGF0IHRoZSBmaWxsIHN0eWxlIGFuZCBtYW5hZ2VtZW50IG9mIG11
bHRpcGxlIGxheWVycyBhcmUKKy8vIHNlcGFyYXRlIGNvbmNlcm5zLCBoYW5kbGVkIGF0IGEgaGln
aGVyIGxldmVsIHdpdGggc2hhZGVycyBhbmQKKy8vIHBvbHlnb24gb2Zmc2V0cy4KK2NsYXNzIExv
b3BCbGlublBhdGhQcm9jZXNzb3IgeworcHVibGljOgorICAgIExvb3BCbGlublBhdGhQcm9jZXNz
b3IoKTsKKyAgICBleHBsaWNpdCBMb29wQmxpbm5QYXRoUHJvY2Vzc29yKFBhc3NSZWZQdHI8UE9E
QXJlbmE+KTsKKyAgICB+TG9vcEJsaW5uUGF0aFByb2Nlc3NvcigpOworCisgICAgLy8gVHJhbnNm
b3JtcyB0aGUgZ2l2ZW4gcGF0aCBpbnRvIGEgdHJpYW5nbGUgbWVzaCBmb3IgcmVuZGVyaW5nCisg
ICAgLy8gdXNpbmcgTG9vcCBhbmQgQmxpbm4ncyBzaGFkZXIsIHBsYWNpbmcgdGhlIHJlc3VsdCBp
bnRvIHRoZSBnaXZlbgorICAgIC8vIExvb3BCbGlublBhdGhDYWNoZS4KKyAgICB2b2lkIHByb2Nl
c3MoY29uc3QgUGF0aCYsIExvb3BCbGlublBhdGhDYWNoZSYpOworCisjaWZuZGVmIE5ERUJVRwor
ICAgIC8vIEVuYWJsZXMgb3IgZGlzYWJsZXMgdmVyYm9zZSBsb2dnaW5nIGluIGRlYnVnIG1vZGUu
CisgICAgdm9pZCBzZXRWZXJib3NlTG9nZ2luZyhib29sIG9uT3JPZmYpOworI2VuZGlmCisKK3By
aXZhdGU6CisgICAgLy8gQnVpbGRzIGEgbGlzdCBvZiBjb250b3VycyBmb3IgdGhlIGdpdmVuIHBh
dGguCisgICAgdm9pZCBidWlsZENvbnRvdXJzKGNvbnN0IFBhdGgmKTsKKworICAgIC8vIERldGVy
bWluZXMgd2hldGhlciB0aGUgbGVmdCBvciByaWdodCBzaWRlIG9mIGVhY2ggY29udG91ciBzaG91
bGQKKyAgICAvLyBiZSBmaWxsZWQuCisgICAgdm9pZCBkZXRlcm1pbmVTaWRlc1RvRmlsbCgpOwor
CisgICAgLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiAoY2xvc2VkKSBjb250b3VyIGlz
IG9yaWVudGVkCisgICAgLy8gY2xvY2t3aXNlIG9yIGNvdW50ZXJjbG9ja3dpc2UuCisgICAgdm9p
ZCBkZXRlcm1pbmVPcmllbnRhdGlvbihMb29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRp
b246OkNvbnRvdXIqKTsKKworICAgIC8vIFN1YmRpdmlkZXMgdGhlIGN1cnZlcyBzbyB0aGF0IHRo
ZXJlIGFyZSBubyBvdmVybGFwcyBvZiB0aGUKKyAgICAvLyB0cmlhbmdsZXMgYXNzb2NpYXRlZCB3
aXRoIHRoZSBjdXJ2ZXMnIGNvbnRyb2wgcG9pbnRzLgorICAgIHZvaWQgc3ViZGl2aWRlQ3VydmVz
KCk7CisKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdXNlZCBkdXJpbmcgY3VydmUgc3ViZGl2aXNp
b24uCisgICAgdm9pZCBjb25kaXRpb25hbGx5U3ViZGl2aWRlKExvb3BCbGlublBhdGhQcm9jZXNz
b3JJbXBsZW1lbnRhdGlvbjo6U2VnbWVudCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIFZlY3RvcjxMb29wQmxpbm5QYXRoUHJvY2Vzc29ySW1wbGVtZW50YXRpb246OlNlZ21lbnQq
PiYgbmV4dFNlZ21lbnRzKTsKKworICAgIC8vIFRlc3NlbGxhdGVzIHRoZSBpbnRlcmlvciByZWdp
b25zIG9mIHRoZSBjb250b3Vycy4KKyAgICB2b2lkIHRlc3NlbGxhdGVJbnRlcmlvcihMb29wQmxp
bm5QYXRoQ2FjaGUmKTsKKworI2lmbmRlZiBOREVCVUcKKyAgICAvLyBGb3IgZGVidWdnaW5nIHRo
ZSBvcmllbnRhdGlvbiBjb21wdXRhdGlvbi4gUmV0dXJucyBhbGwgb2YgdGhlCisgICAgLy8gc2Vn
bWVudHMgb3ZlcmxhcHBpbmcgdGhlIGdpdmVuIFkgY29vcmRpbmF0ZS4KKyAgICBWZWN0b3I8TG9v
cEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpTZWdtZW50Kj4gYWxsU2VnbWVudHNP
dmVybGFwcGluZ1koTG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpDb250b3Vy
KiwgZmxvYXQgeCwgZmxvYXQgeSk7CisKKyAgICAvLyBGb3IgZGVidWdnaW5nIHRoZSBjdXJ2ZSBz
dWJkaXZpc2lvbiBhbGdvcml0aG0uIFN1YmRpdmlkZXMgdGhlCisgICAgLy8gY3VydmVzIHVzaW5n
IGFuIGFsdGVybmF0ZSwgc2xvdyAoTyhuXjMpKSBhbGdvcml0aG0uCisgICAgdm9pZCBzdWJkaXZp
ZGVDdXJ2ZXNTbG93KCk7CisjZW5kaWYKKworICAgIC8vIFBPREFyZW5hIGZyb20gd2hpY2ggdG8g
YWxsb2NhdGUgdGVtcG9yYXJ5IG9iamVjdHMuCisgICAgUmVmUHRyPFBPREFyZW5hPiBtX2FyZW5h
OworCisgICAgLy8gVGhlIGNvbnRvdXJzIGRlc2NyaWJlZCBieSB0aGUgcGF0aC4KKyAgICBWZWN0
b3I8TG9vcEJsaW5uUGF0aFByb2Nlc3NvckltcGxlbWVudGF0aW9uOjpDb250b3VyKj4gbV9jb250
b3VyczsKKworI2lmbmRlZiBOREVCVUcKKyAgICAvLyBXaGV0aGVyIG9yIG5vdCB0byBwZXJmb3Jt
IHZlcmJvc2UgbG9nZ2luZyBpbiBkZWJ1ZyBtb2RlLgorICAgIGJvb2wgbV92ZXJib3NlTG9nZ2lu
ZzsKKyNlbmRpZgorfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gTG9v
cEJsaW5uUGF0aFByb2Nlc3Nvcl9oCg==
</data>
<flag name="review"
          id="73671"
          type_id="1"
          status="+"
          setter="jamesr"
    />
          </attachment>
      

    </bug>

</bugzilla>