<?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>24101</bug_id>
          
          <creation_ts>2009-02-23 13:34:02 -0800</creation_ts>
          <short_desc>Chromium Windows port should support semitransparent ClearType fonts</short_desc>
          <delta_ts>2009-04-09 12:44:41 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Windows XP</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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Brett Wilson (Google)">brettw</reporter>
          <assigned_to name="Brett Wilson (Google)">brettw</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>110626</commentid>
    <comment_count>0</comment_count>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2009-02-23 13:34:02 -0800</bug_when>
    <thetext>Our incorrect handling of transparency on Windows causes a number of bugs, most notably incorrect semitransparet text handling.:
 http://code.google.com/p/chromium/issues/detail?id=559
 http://code.google.com/p/chromium/issues/detail?id=2791
 http://code.google.com/p/chromium/issues/detail?id=3229

Patch forthcoming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>110632</commentid>
    <comment_count>1</comment_count>
      <attachid>27891</attachid>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2009-02-23 13:53:27 -0800</bug_when>
    <thetext>Created attachment 27891
Patch

Fix Windows transparency for the Chromium port. Implement a helper class for handling transparency on Windows. It allows semitransparent ClearType and semitransparent form controls by making new layers in the background. 

It also replaces the &quot;ThemeHelper&quot; which allows better scaling and transforms on Windows form controls. In addition to the functionality that the ThemeHelper did, but additionally handles the antialiasing properly so that the form controls aren&apos;t composited on a white square.

This is covered by layout tests that previously had wrong results (requires re-baselining 71 Chromium-specific results, note that the Chromium layout test results are currently only in the Chromium tree). However, the majority of the layout test changes are a result of me now enabling filtering for more types of bitmap drawing that previously looked bad (this is what this patch uses to draw form controls transformed).

There is also a Google-style unit test for some of the basic functionality. This is a lower-level test than the layout tests that I used when developing this patch. You can see it here: http://codereview.chromium.org/21201/diff/5121/5140</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>110844</commentid>
    <comment_count>2</comment_count>
      <attachid>27891</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-02-24 15:49:42 -0800</bug_when>
    <thetext>Comment on attachment 27891
Patch

It looks like TransparencyAwareFontPainter should be NonCopyable&lt;T&gt;

&quot;Iterator is so hard to type&quot; ;) SkCanvas::LayerIter  (yes, I know that&apos;s not your class name).

estimateTextBounds?  Is this a high-estimate? low estimate?  What cases is it safe to use this function?  For example, it doesn&apos;t look like it&apos;s safe to use for repainting... since it averages the ascent/descent, which would be too small in some cases, no?

It seems things like these:
 139         m_graphicsContext-&gt;beginTransparencyLayer(SkColorGetA(color) / 255.0f);

Should be abstracted into functions so that people can&apos;t get them wrong.  Converting from int to float is easy, but float to int conversions always go wrong. ;)  Again, not really a comment on your change...

It seems the whole initialization block should be broken out into a separate function outside the constructor.  That way if we later want to add stuff to the constructor it&apos;s less confusing where &quot;normal&quot; initialziation ends.

Also determineLayerModeAndLayerRect(m_platformContext, mode, rect) would be a static inline if I were writing this.

It seems maybe m_createdLayer should be m_createdTransparencyLayer, since then it&apos;s not confused with any other type of layer in WebKit.

I would have written this:
194         SkPoint origin = { SkFloatToScalar(m_point.x() + startAdvance),
 195                            SkFloatToScalar(m_point.y()) };
as:
SkPoint origin = m_point;
origin.x += startAdvance;


I&apos;m surprised you called the variable &quot;helper&quot; when the class is a &quot;painter&quot;. ;)
 222     TransparencyAwareFontPainter helper(graphicsContext, font, glyphBuffer, from, numGlyphs, point);

{ goes on the same line as struct:
struct StaticBuffer
 51 {

Don&apos;t you need &quot;static&quot; before the struct to prevent staticBuffer from being exported from the .o?  I think so.

C++ code in WK uses 0 instead of NULL.

I generally us &quot;static&quot; instead of inline for small functions and let the compiler decide.
 66 inline skia::PlatformCanvas* canvasForContext(GraphicsContext* context)
The compiler of course doesn&apos;t always respect your &quot;inline&quot; hint either, so they&apos;re probably equivalent.

Why not use const GraphicsContext&amp; instead of GraphicsContext* to make clear that you don&apos;t need to worry about NULL in all these functions? (yes, I know &amp;&apos;s can still be NULL, but not intentionally).

WK generally uses one variable-per-line in declarations.

DeviceInfo

What are the x, y for?  I assume those coords are relative to the screen or something?

No need to wrap to 80col here:
     return canvasForContext(context)-&gt;
 74         getTopPlatformDevice().accessBitmap(false);

It seems TransparencyWin should also be NonCopyable&lt;T&gt;

I would break the:
// Compute the size of the layer we&apos;re making.
block out into its own static inline, making setupLayer shorter and more readable, IMPO.

Seems this should just be a real class:
306     // Create a new cached buffer.
 307     delete staticBuffer.destBitmap;
 308     delete staticBuffer.referenceBitmap;

with destructor, instead of a struct with this ad-hoc memory management burried in down in this &quot;initialize new context&quot; function.  Also, shouldn&apos;t this be a class-static variable, instead of a file static?

No need to wrap:
 325     SkBitmap* bitmap = const_cast&lt;SkBitmap*&gt;(
 326         &amp;bitmapForContext(m_layerBuffer-&gt;context()));

No need for {}
1     } else {
 362         destRect.set(m_sourceRect.x(), m_sourceRect.y(), m_sourceRect.right(), m_sourceRect.bottom());
 363     }

I think this code could all be made more readable by abstracting more into small static functions.  functions which individually have to handle these if/switch statements for the 3 or 4 different cases which you&apos;re trying to handle here.

Another great example of this:
68         // Compute the transform mode.
 69         TransformMode transformMode;
 70         const TransformationMatrix&amp; matrix = context-&gt;getCTM();
 71         if (matrix.b() != 0 || matrix.c() != 0)  // Skew.
 72             transformMode = Untransform;
 73         else if (matrix.a() != 1.0 || matrix.d() != 1.0)  // Scale.
 74             transformMode = ScaleTransform;
 75         else  // Nothing interesting.
 76             transformMode = KeepTransform;

I would have made a transformModeForMatrix() static, same for layerMode.  Then I, as a reviewer can more easily prove to myself that the individual &quot;transformModeForMatrix()&quot; function makes sense w/o having to keep the question of &quot;does this constructor do what I expect it to&quot; in my head. ;)

I assume this is covered by existing tests?

I think the patch in the end is probably fine.  But I think it can be worked over more to be more readable.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>111029</commentid>
    <comment_count>3</comment_count>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2009-02-25 13:59:01 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; estimateTextBounds?  Is this a high-estimate? low estimate?  What cases is it
&gt; safe to use this function?  For example, it doesn&apos;t look like it&apos;s safe to use
&gt; for repainting... since it averages the ascent/descent, which would be too
&gt; small in some cases, no?

It should be a pretty safe estimate. The ascent and decent don&apos;t change, so I don&apos;t see why this would affect partial painting. This is copied from http://trac.webkit.org/browser/trunk/WebCore/platform/graphics/win/FontCGWin.cpp#L168


&gt; Seems this should just be a real class:
&gt; 306     // Create a new cached buffer.
&gt;  307     delete staticBuffer.destBitmap;
&gt;  308     delete staticBuffer.referenceBitmap;
&gt;
&gt; with destructor, instead of a struct with this ad-hoc memory management burried
&gt; in down in this &quot;initialize new context&quot; function.  Also, shouldn&apos;t this be a
&gt; class-static variable, instead of a file static?
&gt;
&gt; I think this code could all be made more readable by abstracting more into
&gt; small static functions.  functions which individually have to handle these
&gt; if/switch statements for the 3 or 4 different cases which you&apos;re trying to
&gt; handle here.
&gt;
&gt; I would have made a transformModeForMatrix() static, same for layerMode.  Then
&gt; I, as a reviewer can more easily prove to myself that the individual
&gt; &quot;transformModeForMatrix()&quot; function makes sense w/o having to keep the question
&gt; of &quot;does this constructor do what I expect it to&quot; in my head. ;)

Good ideas, I did all 3 suggestions and it improves things.


&gt; I assume this is covered by existing tests?

Yes, see comment 1.

&gt; I think the patch in the end is probably fine.  But I think it can be worked
&gt; over more to be more readable.

Ha! You should have seen it two cleanups ago.

I did all your other comments. New snap coming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>111033</commentid>
    <comment_count>4</comment_count>
      <attachid>27982</attachid>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2009-02-25 14:14:32 -0800</bug_when>
    <thetext>Created attachment 27982
Patch v2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>111254</commentid>
    <comment_count>5</comment_count>
      <attachid>27982</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-02-26 11:44:26 -0800</bug_when>
    <thetext>Comment on attachment 27982
Patch v2

Unless I&apos;m reading this wrong, there is no savings in the m_cachedBuffers logic.  I would suggest just removing it.  It seems you blast away the m_cachedBuffers every time, and never re-use them.  So might as well just always use m_ownedBuffers.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>111274</commentid>
    <comment_count>6</comment_count>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2009-02-26 12:39:18 -0800</bug_when>
    <thetext>This line and its block
  if (m_ownedBuffers &amp;&amp; m_ownedBuffers-&gt;canHandleSize(m_layerSize)) {
should have been m_cachedBuffers instead of m_ownedBuffers.

Do you have any other comments for the next round</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>111276</commentid>
    <comment_count>7</comment_count>
      <attachid>27982</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-02-26 12:45:53 -0800</bug_when>
    <thetext>Comment on attachment 27982
Patch v2

You also duplicated the ChangeLog.  You don&apos;t actually need to run prepare-ChagneLog more than once, it just for adding the initial boiler-plate.  You can run it again if you change a bunch more files or functions, but generally I only ever run it once per patch.

I would have broken the layerMode, layerRect detection off into its own static inline, but it&apos;s not a huge deal either way.

I&apos;m surprised no one has written a SkiaBackToFrontLayerIterator and that you have to write your own reversal.

In general this patch looks fine.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>111284</commentid>
    <comment_count>8</comment_count>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2009-02-26 12:55:22 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; (From update of attachment 27982 [review])
&gt; You also duplicated the ChangeLog.  You don&apos;t actually need to run
&gt; prepare-ChagneLog more than once, it just for adding the initial boiler-plate. 
&gt; You can run it again if you change a bunch more files or functions, but
&gt; generally I only ever run it once per patch.

I added a whole bunch of functions that you asked for, so I wanted to get the updated function list.


&gt; I would have broken the layerMode, layerRect detection off into its own static
&gt; inline, but it&apos;s not a huge deal either way.

I assume you mean for the TransparencyAwareFontPainter? I did it this way because the layer mode and layer rect computation in this case go hand-in-hand, at least the way I think about it.


&gt; I&apos;m surprised no one has written a SkiaBackToFrontLayerIterator and that you
&gt; have to write your own reversal.

Actually, the Skia LayerIterator was written specifically for this patch. It does front to back since that&apos;s the way Skia internally keeps the list, it&apos;s just a public wrapper around this API. If it comes up again (which I doubt), we should put it into Skia.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>111285</commentid>
    <comment_count>9</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-02-26 12:58:50 -0800</bug_when>
    <thetext>(In reply to comment #8)

&gt; &gt; I would have broken the layerMode, layerRect detection off into its own static
&gt; &gt; inline, but it&apos;s not a huge deal either way.
&gt; 
&gt; I assume you mean for the TransparencyAwareFontPainter? I did it this way
&gt; because the layer mode and layer rect computation in this case go hand-in-hand,
&gt; at least the way I think about it.

Yes, sorry I wasn&apos;t more clear.  That&apos;s what I meant.  That a single function would handle both computations, just that the computation as a whole woudl be broken out into its own separate function instead of part of initializeForGDI.  Again, not mission critical, but I personally am a huge fan of tiny, well-named functions. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>111300</commentid>
    <comment_count>10</comment_count>
      <attachid>28038</attachid>
    <who name="Brett Wilson (Google)">brettw</who>
    <bug_when>2009-02-26 14:13:43 -0800</bug_when>
    <thetext>Created attachment 28038
Patch v3</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>111304</commentid>
    <comment_count>11</comment_count>
      <attachid>28038</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-02-26 14:19:02 -0800</bug_when>
    <thetext>Comment on attachment 28038
Patch v3

So it looks like you removed the whole OwnedBuffers thing.  I skimmed it again, looks fine.  Your ChangeLog is now out of date, but you can fix that when landing.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>27891</attachid>
            <date>2009-02-23 13:53:27 -0800</date>
            <delta_ts>2009-02-25 14:14:32 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>trans1.diff</filename>
            <type>text/plain</type>
            <size>58228</size>
            <attacher name="Brett Wilson (Google)">brettw</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
YjBlZmEzNy4uZWIyZWYwZCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw2MSBAQAorMjAwOS0wMi0yMyAgQnJldHQgV2lsc29u
ICA8YnJldHR3QGNocm9taXVtLm9yZz4KKworICAgICAgICBGaXggV2luZG93cyB0cmFuc3BhcmVu
Y3kgZm9yIHRoZSBDaHJvbWl1bSBwb3J0LiBJbXBsZW1lbnQgYSBoZWxwZXIKKyAgICAgICAgY2xh
c3MgZm9yIGhhbmRsaW5nIHRyYW5zcGFyZW5jeSBvbiBXaW5kb3dzLiBJdCBhbGxvd3Mgc2VtaXRy
YW5zcGFyZW50CisgICAgICAgIENsZWFyVHlwZSBhbmQgc2VtaXRyYW5zcGFyZW50IGZvcm0gY29u
dHJvbHMgYnkgbWFraW5nIG5ldyBsYXllcnMgaW4gdGhlCisgICAgICAgIGJhY2tncm91bmQuIAor
CisgICAgICAgIEl0IGFsc28gcmVwbGFjZXMgdGhlICJUaGVtZUhlbHBlciIgd2hpY2ggYWxsb3dz
IGJldHRlcgorICAgICAgICBzY2FsaW5nIGFuZCB0cmFuc2Zvcm1zIG9uIFdpbmRvd3MgZm9ybSBj
b250cm9scy4gSW4gYWRkaXRpb24gdG8gdGhlCisgICAgICAgIGZ1bmN0aW9uYWxpdHkgdGhhdCB0
aGUgVGhlbWVIZWxwZXIgZGlkLCBidXQgYWRkaXRpb25hbGx5IGhhbmRsZXMgdGhlCisgICAgICAg
IGFudGlhbGlhc2luZyBwcm9wZXJseSBzbyB0aGF0IHRoZSBmb3JtIGNvbnRyb2xzIGFyZW4ndCBj
b21wb3NpdGVkIG9uIGEKKyAgICAgICAgd2hpdGUgc3F1YXJlLgorCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNDEwMQorCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vRm9udENocm9taXVtV2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Oik6CisgICAgICAgIChX
ZWJDb3JlOjpUcmFuc3BhcmVuY3lBd2FyZUZvbnRQYWludGVyOjpUcmFuc3BhcmVuY3lBd2FyZUZv
bnRQYWludGVyOjpUcmFuc3BhcmVuY3lBd2FyZUZvbnRQYWludGVyKToKKyAgICAgICAgKFdlYkNv
cmU6OlRyYW5zcGFyZW5jeUF3YXJlRm9udFBhaW50ZXI6OlRyYW5zcGFyZW5jeUF3YXJlRm9udFBh
aW50ZXI6On5UcmFuc3BhcmVuY3lBd2FyZUZvbnRQYWludGVyKToKKyAgICAgICAgKFdlYkNvcmU6
OlRyYW5zcGFyZW5jeUF3YXJlRm9udFBhaW50ZXI6OlRyYW5zcGFyZW5jeUF3YXJlRm9udFBhaW50
ZXI6OmRyYXdHbHlwaHMpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZHJhd0dseXBocyk6Cisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vVGhlbWVIZWxwZXJDaHJvbWl1bVdp
bi5jcHA6IFJlbW92ZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vVGhl
bWVIZWxwZXJDaHJvbWl1bVdpbi5oOiBSZW1vdmVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBo
aWNzL2Nocm9taXVtL1RyYW5zcGFyZW5jeVdpbi5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29y
ZTo6KToKKyAgICAgICAgKFdlYkNvcmU6OlN0YXRpY0J1ZmZlcjo6KToKKyAgICAgICAgKFdlYkNv
cmU6OlN0YXRpY0J1ZmZlcjo6Y2FudmFzRm9yQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpT
dGF0aWNCdWZmZXI6OmJpdG1hcEZvckNvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6U3RhdGlj
QnVmZmVyOjpjb21wb3NpdGVUb0NvcHkpOgorICAgICAgICAoV2ViQ29yZTo6U3RhdGljQnVmZmVy
OjpEZXZpY2VJbmZvOjp3aGlsZSk6CisgICAgICAgIChXZWJDb3JlOjpTdGF0aWNCdWZmZXI6OkRl
dmljZUluZm86Oik6CisgICAgICAgIChXZWJDb3JlOjpUcmFuc3BhcmVuY3lXaW46OlRyYW5zcGFy
ZW5jeVdpbik6CisgICAgICAgIChXZWJDb3JlOjpUcmFuc3BhcmVuY3lXaW46On5UcmFuc3BhcmVu
Y3lXaW4pOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNwYXJlbmN5V2luOjppbml0KToKKyAgICAg
ICAgKFdlYkNvcmU6OlRyYW5zcGFyZW5jeVdpbjo6c2V0dXBMYXllcik6CisgICAgICAgIChXZWJD
b3JlOjpUcmFuc3BhcmVuY3lXaW46OnNldHVwVHJhbnNmb3JtKToKKyAgICAgICAgKFdlYkNvcmU6
OlRyYW5zcGFyZW5jeVdpbjo6c2V0VGV4dENvbXBvc2l0ZUNvbG9yKToKKyAgICAgICAgKFdlYkNv
cmU6OlRyYW5zcGFyZW5jeVdpbjo6aW5pdGlhbGl6ZU5ld0NvbnRleHQpOgorICAgICAgICAoV2Vi
Q29yZTo6VHJhbnNwYXJlbmN5V2luOjpjb21wb3NpdGVPcGFxdWVDb21wb3NpdGUpOgorICAgICAg
ICAoV2ViQ29yZTo6VHJhbnNwYXJlbmN5V2luOjpjb21wb3NpdGVUZXh0Q29tcG9zaXRlKToKKyAg
ICAgICAgKFdlYkNvcmU6OlRyYW5zcGFyZW5jeVdpbjo6bWFrZUxheWVyT3BhcXVlKToKKyAgICAg
ICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9UcmFuc3BhcmVuY3lXaW4uaDogQWRkZWQu
CisgICAgICAgIChXZWJDb3JlOjpUcmFuc3BhcmVuY3lXaW46Oik6CisgICAgICAgIChXZWJDb3Jl
OjpUcmFuc3BhcmVuY3lXaW46OmNvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNwYXJl
bmN5V2luOjpwbGF0Zm9ybUNvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNwYXJlbmN5
V2luOjpkcmF3UmVjdCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGlj
c0NvbnRleHRTa2lhLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6ZW5k
VHJhbnNwYXJlbmN5TGF5ZXIpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvSW1h
Z2VTa2lhLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OnBhaW50U2tCaXRtYXApOgorICAgICAgICAq
IHJlbmRlcmluZy9SZW5kZXJUaGVtZUNocm9taXVtV2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
Oik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUNocm9taXVtV2luOjpwYWludEJ1dHRv
bik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUNocm9taXVtV2luOjpwYWludE1lbnVM
aXN0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQ2hyb21pdW1XaW46OnBhaW50VGV4
dEZpZWxkSW50ZXJuYWwpOgorCiAyMDA5LTAyLTIzICBEYXZpZCBIeWF0dCAgPGh5YXR0QGFwcGxl
LmNvbT4KIAogICAgICAgICBJbiBwcmVwYXJhdGlvbiBmb3IgbWFraW5nIGxheWVycyBmb3IgbXVs
dGljb2wgb2JqZWN0cyAoc28gdGhhdCB0aGV5IGNhbiBwcm9wZXJseSBzcGxpdCBjaGlsZCBsYXll
cnMKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udENo
cm9taXVtV2luLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udENo
cm9taXVtV2luLmNwcAppbmRleCBkNTYyNmE0Li4yNWQ0ZDNmIDEwMDY0NAotLS0gYS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRDaHJvbWl1bVdpbi5jcHAKKysrIGIvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250Q2hyb21pdW1XaW4uY3BwCkBAIC0z
OSw2ICszOSw3IEBACiAjaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIKICNpbmNsdWRlICJTa2lh
Rm9udFdpbi5oIgogI2luY2x1ZGUgIlNraWFVdGlscy5oIgorI2luY2x1ZGUgIlRyYW5zcGFyZW5j
eVdpbi5oIgogI2luY2x1ZGUgIlVuaXNjcmliZUhlbHBlclRleHRSdW4uaCIKIAogI2luY2x1ZGUg
InNraWEvZXh0L3BsYXRmb3JtX2NhbnZhc193aW4uaCIKQEAgLTQ4LDYgKzQ5LDE2MyBAQAogCiBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAKK25hbWVzcGFjZSB7CisKK2Jvb2wgY2FudmFzSGFzTXVsdGlw
bGVMYXllcnMoY29uc3QgU2tDYW52YXMqIGNhbnZhcykKK3sKKyAgICBTa0NhbnZhczo6TGF5ZXJJ
dGVyIGl0ZXIoY29uc3RfY2FzdDxTa0NhbnZhcyo+KGNhbnZhcyksIGZhbHNlKTsKKyAgICBpdGVy
Lm5leHQoKTsgIC8vIFRoZXJlIGlzIGFsd2F5cyBhdCBsZWFzdCBvbmUgbGF5ZXIuCisgICAgcmV0
dXJuICFpdGVyLmRvbmUoKTsgIC8vIFRoZXJlIGlzID4gMSBsYXllciBpZiB0aGUgdGhlIGl0ZXJh
dG9yIGNhbiBzdGlsIGFkdmFuY2UuCit9CisKKy8vIEVzdGltYXRlcyB0aGUgYm91bmRpbmcgYm94
IG9mIHRoZSBnaXZlbiB0ZXh0LiBUaGlzIGlzIGNvcGllZCBmcm9tCisvLyBGb250Q0dXaW4uY3Bw
LCBpdCBpcyBwb3NzaWJsZSwgYnV0IGEgbG90IG1vcmUgd29yaywgdG8gZ2V0IHRoZSBwcmVjaWRl
CisvLyBib3VuZHMuCitJbnRSZWN0IGVzdGltYXRlVGV4dEJvdW5kcyhjb25zdCBTaW1wbGVGb250
RGF0YSogZm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdseXBoQnVmZmVy
JiBnbHlwaEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcm9tLCBpbnQg
bnVtR2x5cGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYg
cG9pbnQpCit7CisgICAgaW50IHRvdGFsV2lkdGggPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgbnVtR2x5cGhzOyBpKyspCisgICAgICAgIHRvdGFsV2lkdGggKz0gbHJvdW5kZihnbHlwaEJ1
ZmZlci5hZHZhbmNlQXQoZnJvbSArIGkpKTsKKworICAgIHJldHVybiBJbnRSZWN0KHBvaW50Lngo
KSAtIChmb250LT5hc2NlbnQoKSArIGZvbnQtPmRlc2NlbnQoKSkgLyAyLAorICAgICAgICAgICAg
ICAgICAgIHBvaW50LnkoKSAtIGZvbnQtPmFzY2VudCgpIC0gZm9udC0+bGluZUdhcCgpLAorICAg
ICAgICAgICAgICAgICAgIHRvdGFsV2lkdGggKyBmb250LT5hc2NlbnQoKSArIGZvbnQtPmRlc2Nl
bnQoKSwKKyAgICAgICAgICAgICAgICAgICBmb250LT5saW5lU3BhY2luZygpKTsgCit9CisKK2Ns
YXNzIFRyYW5zcGFyZW5jeUF3YXJlRm9udFBhaW50ZXIgeworcHVibGljOgorICAgIFRyYW5zcGFy
ZW5jeUF3YXJlRm9udFBhaW50ZXIoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnQsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZm
ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IG51bUds
eXBocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQm
IHBvaW50KTsKKyAgICBUcmFuc3BhcmVuY3lBd2FyZUZvbnRQYWludGVyKEdyYXBoaWNzQ29udGV4
dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNpbXBs
ZUZvbnREYXRhKiBmb250KTsKKyAgICB+VHJhbnNwYXJlbmN5QXdhcmVGb250UGFpbnRlcigpOwor
CisgICAgLy8gRHJhd3MgdGhlIHBhcnRpYWwgc3RyaW5nIG9mIGdseXBocywgc3RhcnRpbmcgYXQg
fHN0YXJ0QWR2YW5jZXwgdG8gdGhlCisgICAgLy8gbGVmdCBvZiBtX3BvaW50LiBXZSBleHByZXNz
IGl0IHRoaXMgd2F5IHNvIHRoYXQgaWYgd2UncmUgdXNpbmcgdGhlIFNraWEKKyAgICAvLyBkcmF3
aW5nIHBhdGggd2UgY2FuIHVzZSBmbG9hdGluZy1wb2ludCBwb3NpdGlvbmluZywgZXZlbiB0aG91
Z2ggd2UgaGF2ZQorICAgIC8vIHRvIHVzZSBpbnRlZ2VyIHBvc2l0aW9uaW5nIGluIHRoZSBHREkg
cGF0aC4KKyAgICBib29sIGRyYXdHbHlwaHMoaW50IG51bUdseXBocywgY29uc3QgV09SRCogZ2x5
cGhzLCBjb25zdCBpbnQqIGFkdmFuY2VzLAorICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRB
ZHZhbmNlKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICAvLyBVc2UgdGhlIGNvbnRleHQgZnJvbSB0
aGUgdHJhbnNwYXJlbmN5IGhlbHBlciB3aGVuIGRyYXdpbmcgd2l0aCBHREkuIEl0CisgICAgLy8g
bWF5IHBvaW50IHRvIGEgdGVtcG9yYXJ5IG9uZS4KKyAgICBHcmFwaGljc0NvbnRleHQqIG1fZ3Jh
cGhpY3NDb250ZXh0OworICAgIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiBtX3BsYXRmb3JtQ29u
dGV4dDsKKworICAgIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBtX2ZvbnQ7CisgICAgRmxvYXRQb2lu
dCBtX3BvaW50OworCisgICAgLy8gU2V0IHdoZW4gV2luZG93cyBjYW4gaGFuZGxlIHRoZSB0eXBl
IG9mIGRyYXdpbmcgd2UncmUgZG9pbmcuCisgICAgYm9vbCBtX3VzZUdESTsKKworICAgIC8vIFRo
ZXNlIG1lbWJlcnMgYXJlIHZhbGlkIG9ubHkgd2hlbiBtX3VzZUdESSBpcyBzZXQuCisgICAgSERD
IG1faGRjOworICAgIEhHRElPQkogbV9vbGRGb250OyAgLy8gRm9yIHJlc3RvcmluZyB0aGUgREMg
dG8gaXRzIG9yaWdpbmFsIHN0YXRlLgorICAgIFRyYW5zcGFyZW5jeVdpbiBtX3RyYW5zcGFyZW5j
eTsKKyAgICBib29sIG1fY3JlYXRlZExheWVyOyAgLy8gV2UgY3JlYXRlZCBhIGxheWVyIHRvIGdp
dmUgdGhlIGZvbnQgc29tZSBhbHBoYS4KK307CisKK1RyYW5zcGFyZW5jeUF3YXJlRm9udFBhaW50
ZXI6OlRyYW5zcGFyZW5jeUF3YXJlRm9udFBhaW50ZXIoCisgICAgR3JhcGhpY3NDb250ZXh0KiBj
b250ZXh0LAorICAgIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250LAorICAgIGNvbnN0IEdseXBo
QnVmZmVyJiBnbHlwaEJ1ZmZlciwKKyAgICBpbnQgZnJvbSwgaW50IG51bUdseXBocywKKyAgICBj
b25zdCBGbG9hdFBvaW50JiBwb2ludCkKKyAgICA6IG1fZ3JhcGhpY3NDb250ZXh0KGNvbnRleHQp
CisgICAgLCBtX3BsYXRmb3JtQ29udGV4dChjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSkKKyAg
ICAsIG1fZm9udChmb250KQorICAgICwgbV9wb2ludChwb2ludCkKKyAgICAsIG1fdXNlR0RJKHdp
bmRvd3NDYW5IYW5kbGVUZXh0RHJhd2luZyhjb250ZXh0KSkKKyAgICAsIG1faGRjKDApCisgICAg
LCBtX29sZEZvbnQoMCkKKyAgICAsIG1fY3JlYXRlZExheWVyKGZhbHNlKQoreworICAgIGlmICgh
bV91c2VHREkpCisgICAgICAgIHJldHVybjsgIC8vIE5vdGhpbmcgdG8gZG8uCisKKyAgICBTa0Nv
bG9yIGNvbG9yID0gbV9wbGF0Zm9ybUNvbnRleHQtPmVmZmVjdGl2ZUZpbGxDb2xvcigpOworICAg
IGlmIChTa0NvbG9yR2V0QShjb2xvcikgIT0gMHhGRikgeworICAgICAgICAvLyBXaGVuIHRoZSBm
b250IGhhcyBzb21lIHRyYW5zcGFyZW5jeSwgYXBwbHkgaXQgYnkgY3JlYXRpbmcgYSBuZXcKKyAg
ICAgICAgLy8gdHJhbnNwYXJlbmN5IGxheWVyIHdpdGggdGhhdCBvcGFjaXR5IGFwcGxpZWQuCisg
ICAgICAgIG1fY3JlYXRlZExheWVyID0gdHJ1ZTsKKyAgICAgICAgbV9ncmFwaGljc0NvbnRleHQt
PmJlZ2luVHJhbnNwYXJlbmN5TGF5ZXIoU2tDb2xvckdldEEoY29sb3IpIC8gMjU1LjBmKTsKKyAg
ICAgICAgLy8gVGhlIGNvbG9yIHNob3VsZCBiZSBvcGFxdWUgbm93LgorICAgICAgICBjb2xvciA9
IFNrQ29sb3JTZXRSR0IoU2tDb2xvckdldFIoY29sb3IpLCBTa0NvbG9yR2V0Ryhjb2xvciksIFNr
Q29sb3JHZXRCKGNvbG9yKSk7CisgICAgfQorCisgICAgVHJhbnNwYXJlbmN5V2luOjpMYXllck1v
ZGUgbGF5ZXJNb2RlOworICAgIEludFJlY3QgbGF5ZXJSZWN0OworICAgIGlmIChtX3BsYXRmb3Jt
Q29udGV4dC0+aXNEcmF3aW5nVG9JbWFnZUJ1ZmZlcigpKSB7CisgICAgICAgIC8vIEFzc3VtZSBp
ZiB3ZSdyZSBkcmF3aW5nIHRvIGFuIGltYWdlIGJ1ZmZlciB0aGF0IHRoZSBiYWNrZ3JvdW5kCisg
ICAgICAgIC8vIGlzIG5vdCBvcGFxdWUgYW5kIHdlIGhhdmUgdG8gdW5kbyBDbGVhclR5cGUuIFdl
IG1heSB3YW50IHRvCisgICAgICAgIC8vIGVuaGFuY2UgdGhpcyB0byBhY3R1YWxseSBjaGVjaywg
c2luY2UgaXQgd2lsbCBvZnRlbiBiZSBvcGFxdWUKKyAgICAgICAgLy8gYW5kIHdlIGNvdWxkIGRv
IENsZWFyVHlwZSBpbiB0aGF0IGNhc2UuCisgICAgICAgIGxheWVyTW9kZSA9IFRyYW5zcGFyZW5j
eVdpbjo6VGV4dENvbXBvc2l0ZTsKKyAgICAgICAgbGF5ZXJSZWN0ID0gZXN0aW1hdGVUZXh0Qm91
bmRzKG1fZm9udCwgZ2x5cGhCdWZmZXIsIGZyb20sIG51bUdseXBocywgcG9pbnQpOworCisgICAg
ICAgIC8vIFRoZSB0cmFuc3BhcmVuY3kgaGVscGVyIHJlcXVpcmVzIHRoYXQgd2UgZHJhdyB0ZXh0
IGluIGJsYWNrIGluCisgICAgICAgIC8vIHRoaXMgbW9kZSBhbmQgaXQgd2lsbCBhcHBseSB0aGUg
Y29sb3IuCisgICAgICAgIG1fdHJhbnNwYXJlbmN5LnNldFRleHRDb21wb3NpdGVDb2xvcihjb2xv
cik7CisgICAgICAgIGNvbG9yID0gU2tDb2xvclNldFJHQigwLCAwLCAwKTsKKyAgICB9IGVsc2Ug
aWYgKGNhbnZhc0hhc011bHRpcGxlTGF5ZXJzKG1fcGxhdGZvcm1Db250ZXh0LT5jYW52YXMoKSkp
IHsKKyAgICAgICAgLy8gV2hlbiB3ZSdyZSBkcmF3aW5nIGEgd2ViIHBhZ2UsIHdlIGtub3cgdGhl
IGJhY2tncm91bmQgaXMgb3BhcXVlLAorICAgICAgICAvLyBidXQgaWYgd2UncmUgZHJhd2luZyB0
byBhIGxheWVyLCB3ZSBzdGlsbCBuZWVkIGV4dHJhIHdvcmsuCisgICAgICAgIGxheWVyTW9kZSA9
IFRyYW5zcGFyZW5jeVdpbjo6T3BhcXVlQ29tcG9zaXRlTGF5ZXI7CisgICAgICAgIGxheWVyUmVj
dCA9IGVzdGltYXRlVGV4dEJvdW5kcyhtX2ZvbnQsIGdseXBoQnVmZmVyLCBmcm9tLCBudW1HbHlw
aHMsIHBvaW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBDb21tb24gY2FzZSBvZiBkcmF3
aW5nIG9udG8gdGhlIGJvdHRvbSBsYXllciBvZiBhIHdlYiBwYWdlOiB3ZQorICAgICAgICAvLyBr
bm93IGV2ZXJ5dGhpbmcgaXMgb3BhcXVlIHNvIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgc3Bl
Y2lhbC4KKyAgICAgICAgbGF5ZXJNb2RlID0gVHJhbnNwYXJlbmN5V2luOjpOb0xheWVyOworICAg
IH0KKyAgICBtX3RyYW5zcGFyZW5jeS5pbml0KG1fZ3JhcGhpY3NDb250ZXh0LCBsYXllck1vZGUs
IFRyYW5zcGFyZW5jeVdpbjo6S2VlcFRyYW5zZm9ybSwgbGF5ZXJSZWN0KTsKKworICAgIC8vIFNl
dCB1cCB0aGUgREMsIHVzaW5nIHRoZSBvbmUgZnJvbSB0aGUgdHJhbnNwYXJlbmN5IGhlbHBlci4K
KyAgICBtX2hkYyA9IG1fdHJhbnNwYXJlbmN5LnBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKS0+
YmVnaW5QbGF0Zm9ybVBhaW50KCk7CisgICAgbV9vbGRGb250ID0gOjpTZWxlY3RPYmplY3QobV9o
ZGMsIG1fZm9udC0+cGxhdGZvcm1EYXRhKCkuaGZvbnQoKSk7CisgICAgU2V0VGV4dENvbG9yKG1f
aGRjLCBza2lhOjpTa0NvbG9yVG9DT0xPUlJFRihjb2xvcikpOworICAgIFNldEJrTW9kZShtX2hk
YywgVFJBTlNQQVJFTlQpOworfQorCitUcmFuc3BhcmVuY3lBd2FyZUZvbnRQYWludGVyOjp+VHJh
bnNwYXJlbmN5QXdhcmVGb250UGFpbnRlcigpCit7CisgICAgaWYgKCFtX3VzZUdESSkKKyAgICAg
ICAgcmV0dXJuOyAgLy8gTm90aGluZyB0byBkby4KKyAgICBpZiAobV9jcmVhdGVkTGF5ZXIpCisg
ICAgICAgIG1fZ3JhcGhpY3NDb250ZXh0LT5lbmRUcmFuc3BhcmVuY3lMYXllcigpOworCisgICAg
OjpTZWxlY3RPYmplY3QobV9oZGMsIG1fb2xkRm9udCk7CisgICAgbV9wbGF0Zm9ybUNvbnRleHQt
PmNhbnZhcygpLT5lbmRQbGF0Zm9ybVBhaW50KCk7Cit9CisKK2Jvb2wgVHJhbnNwYXJlbmN5QXdh
cmVGb250UGFpbnRlcjo6ZHJhd0dseXBocyhpbnQgbnVtR2x5cGhzLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdPUkQqIGdseXBocywKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQqIGFkdmFu
Y2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBz
dGFydEFkdmFuY2UpIGNvbnN0Cit7CisgICAgaWYgKCFtX3VzZUdESSkgeworICAgICAgICBTa1Bv
aW50IG9yaWdpbiA9IHsgU2tGbG9hdFRvU2NhbGFyKG1fcG9pbnQueCgpICsgc3RhcnRBZHZhbmNl
KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrRmxvYXRUb1NjYWxhcihtX3BvaW50Lnko
KSkgfTsKKyAgICAgICAgcmV0dXJuIHBhaW50U2tpYVRleHQobV9wbGF0Zm9ybUNvbnRleHQsIG1f
Zm9udC0+cGxhdGZvcm1EYXRhKCkuaGZvbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbnVtR2x5cGhzLCBnbHlwaHMsIGFkdmFuY2VzLCAwLCAmb3JpZ2luKTsKKyAgICB9CisKKyAg
ICAvLyBXaW5kb3dzJyBvcmlnaW4gaXMgdGhlIHRvcC1sZWZ0IG9mIHRoZSBib3VuZGluZyBib3gs
IHNvIHdlIGhhdmUKKyAgICAvLyB0byBzdWJ0cmFjdCBvZmYgdGhlIGZvbnQgYXNjZW50IHRvIGdl
dCBpdC4KKyAgICBpbnQgeCA9IGxyb3VuZGYobV9wb2ludC54KCkgKyBzdGFydEFkdmFuY2UpOwor
ICAgIGludCB5ID0gbHJvdW5kZihtX3BvaW50LnkoKSAtIG1fZm9udC0+YXNjZW50KCkpOworICAg
IHJldHVybiAhIUV4dFRleHRPdXQobV9oZGMsIHgsIHksIEVUT19HTFlQSF9JTkRFWCwgMCwgcmVp
bnRlcnByZXRfY2FzdDxjb25zdCB3Y2hhcl90Kj4oJmdseXBoc1swXSksIG51bUdseXBocywgJmFk
dmFuY2VzWzBdKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKIHZvaWQgRm9udDo6ZHJhd0dseXBo
cyhHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAg
ICBjb25zdCBTaW1wbGVGb250RGF0YSogZm9udCwKICAgICAgICAgICAgICAgICAgICAgICBjb25z
dCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZmZXIsCkBAIC01NSw2MiArMjEzLDI3IEBAIHZvaWQgRm9u
dDo6ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwKICAgICAgICAg
ICAgICAgICAgICAgICBpbnQgbnVtR2x5cGhzLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0
IEZsb2F0UG9pbnQmIHBvaW50KSBjb25zdAogewotICAgIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0
KiBjb250ZXh0ID0gZ3JhcGhpY3NDb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKLQotICAgIGJv
b2wgY2FuVXNlR0RJID0gd2luZG93c0NhbkhhbmRsZVRleHREcmF3aW5nKGdyYXBoaWNzQ29udGV4
dCk7Ci0gICAgYm9vbCBjcmVhdGVkTGF5ZXIgPSBmYWxzZTsKLQotICAgIGlmIChjYW5Vc2VHREkg
JiYgY29udGV4dC0+aXNEcmF3aW5nVG9JbWFnZUJ1ZmZlcigpKSB7Ci0gICAgICAgIC8vIFdlJ3Jl
IGRyYXdpbmcgdG8gYW4gaW1hZ2UgYnVmZmVyIGFuZCBhYm91dCB0byByZW5kZXIgdGV4dCB3aXRo
IEdESS4KLSAgICAgICAgLy8gV2UgbmVlZCB0byBzdGFydCBhIGxheWVyIGhlcmUsIG90aGVyd2lz
ZSB0aGUgYWxwaGEgdmFsdWVzIHJlbmRlcmVkCi0gICAgICAgIC8vIGJ5IEdESSBhcmUgbmV2ZXIg
Y29ycmVjdGx5IHVwZGF0ZWQuCi0gICAgICAgIC8vIE5PVEU6IHRoaXMgZG9lc24ndCBoYW5kbGUg
Y2xlYXIgdHlwZSB3ZWxsIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuCi0gICAgICAgIC8vIHdl
IGhhdmUgYmV0dGVyIHRleHQgaGFuZGxpbmcgY29kZS4KLSAgICAgICAgZ3JhcGhpY3NDb250ZXh0
LT5iZWdpblRyYW5zcGFyZW5jeUxheWVyKDEuMCk7Ci0gICAgICAgIGNyZWF0ZWRMYXllciA9IHRy
dWU7Ci0gICAgfQotCi0gICAgLy8gTWF4IGJ1ZmZlciBsZW5ndGggcGFzc2VkIHRvIHRoZSB1bmRl
cmx5aW5nIHdpbmRvd3MgQVBJLgotICAgIGNvbnN0IGludCBrTWF4QnVmZmVyTGVuZ3RoID0gMTAy
NDsKLSAgICAvLyBEZWZhdWx0IHNpemUgZm9yIHRoZSBidWZmZXIuIEl0IHNob3VsZCBiZSBlbm91
Z2ggZm9yIG1vc3Qgb2YgY2FzZXMuCi0gICAgY29uc3QgaW50IGtEZWZhdWx0QnVmZmVyTGVuZ3Ro
ID0gMjU2OwotCi0gICAgU2tDb2xvciBjb2xvciA9IGNvbnRleHQtPmVmZmVjdGl2ZUZpbGxDb2xv
cigpOworICAgIFNrQ29sb3IgY29sb3IgPSBncmFwaGljc0NvbnRleHQtPnBsYXRmb3JtQ29udGV4
dCgpLT5lZmZlY3RpdmVGaWxsQ29sb3IoKTsKICAgICB1bnNpZ25lZCBjaGFyIGFscGhhID0gU2tD
b2xvckdldEEoY29sb3IpOwogICAgIC8vIFNraXAgMTAwJSB0cmFuc3BhcmVudCB0ZXh0OyBubyBu
ZWVkIHRvIGRyYXcgYW55dGhpbmcuCi0gICAgaWYgKCFhbHBoYSAmJiBjb250ZXh0LT5nZXRTdHJv
a2VTdHlsZSgpID09IE5vU3Ryb2tlKQorICAgIGlmICghYWxwaGEgJiYgZ3JhcGhpY3NDb250ZXh0
LT5wbGF0Zm9ybUNvbnRleHQoKS0+Z2V0U3Ryb2tlU3R5bGUoKSA9PSBOb1N0cm9rZSkKICAgICAg
ICAgcmV0dXJuOwogCi0gICAgLy8gU2V0IHVwIG91ciBncmFwaGljcyBjb250ZXh0LgotICAgIEhE
QyBoZGMgPSBjb250ZXh0LT5jYW52YXMoKS0+YmVnaW5QbGF0Zm9ybVBhaW50KCk7Ci0gICAgSEdE
SU9CSiBvbGRGb250ID0gU2VsZWN0T2JqZWN0KGhkYywgZm9udC0+cGxhdGZvcm1EYXRhKCkuaGZv
bnQoKSk7Ci0KLSAgICAvLyBUT0RPKG1hcnVlbCk6IGh0dHA6Ly9iLzcwMDQ2NCBTZXRUZXh0Q29s
b3IgZG9lc24ndCBzdXBwb3J0IHRyYW5zcGFyZW5jeS4KLSAgICAvLyBFbmZvcmNlIG5vbi10cmFu
c3BhcmVudCBjb2xvci4KLSAgICBjb2xvciA9IFNrQ29sb3JTZXRSR0IoU2tDb2xvckdldFIoY29s
b3IpLCBTa0NvbG9yR2V0Ryhjb2xvciksIFNrQ29sb3JHZXRCKGNvbG9yKSk7Ci0gICAgU2V0VGV4
dENvbG9yKGhkYywgc2tpYTo6U2tDb2xvclRvQ09MT1JSRUYoY29sb3IpKTsKLSAgICBTZXRCa01v
ZGUoaGRjLCBUUkFOU1BBUkVOVCk7Ci0KLSAgICAvLyBXaW5kb3dzIG5lZWRzIHRoZSBjaGFyYWN0
ZXJzIGFuZCB0aGUgYWR2YW5jZXMgaW4gbmljZSBjb250aWd1b3VzCi0gICAgLy8gYnVmZmVycywg
d2hpY2ggd2UgYnVpbGQgaGVyZS4KLSAgICBWZWN0b3I8V09SRCwga0RlZmF1bHRCdWZmZXJMZW5n
dGg+IGdseXBoczsKLSAgICBWZWN0b3I8aW50LCBrRGVmYXVsdEJ1ZmZlckxlbmd0aD4gYWR2YW5j
ZXM7Ci0KLSAgICAvLyBDb21wdXRlIHRoZSBjb29yZGluYXRlLiBUaGUgJ29yaWdpbicgcmVwcmVz
ZW50cyB0aGUgYmFzZWxpbmUsIHNvIHdlIG5lZWQKLSAgICAvLyB0byBtb3ZlIGl0IHVwIHRvIHRo
ZSB0b3Agb2YgdGhlIGJvdW5kaW5nIHNxdWFyZS4KLSAgICBpbnQgeCA9IHN0YXRpY19jYXN0PGlu
dD4ocG9pbnQueCgpKTsKLSAgICBpbnQgbGluZVRvcCA9IHN0YXRpY19jYXN0PGludD4ocG9pbnQu
eSgpKSAtIGZvbnQtPmFzY2VudCgpOworICAgIFRyYW5zcGFyZW5jeUF3YXJlRm9udFBhaW50ZXIg
aGVscGVyKGdyYXBoaWNzQ29udGV4dCwgZm9udCwgZ2x5cGhCdWZmZXIsIGZyb20sIG51bUdseXBo
cywgcG9pbnQpOwogCiAgICAgLy8gV2UgZHJhdyB0aGUgZ2x5cGhzIGluIGNodW5rcyB0byBhdm9p
ZCBoYXZpbmcgdG8gZG8gYSBoZWFwIGFsbG9jYXRpb24gZm9yCiAgICAgLy8gdGhlIGFycmF5cyBv
ZiBjaGFyYWN0ZXJzIGFuZCBhZHZhbmNlcy4gU2luY2UgRXh0VGV4dE91dCBpcyB0aGUKICAgICAv
LyBsb3dlc3QtbGV2ZWwgdGV4dCBvdXRwdXQgZnVuY3Rpb24gb24gV2luZG93cywgdGhlcmUgc2hv
dWxkIGJlIGxpdHRsZQogICAgIC8vIHBlbmFsdHkgZm9yIHNwbGl0dGluZyB1cCB0aGUgdGV4dC4g
T24gdGhlIG90aGVyIGhhbmQsIHRoZSBidWZmZXIgY2Fubm90CiAgICAgLy8gYmUgYmlnZ2VyIHRo
YW4gNDA5NCBvciB0aGUgZnVuY3Rpb24gd2lsbCBmYWlsLgotICAgIGludCBnbHlwaEluZGV4ID0g
MDsKKyAgICBjb25zdCBpbnQga01heEJ1ZmZlckxlbmd0aCA9IDI1NjsKKyAgICBWZWN0b3I8V09S
RCwga01heEJ1ZmZlckxlbmd0aD4gZ2x5cGhzOworICAgIFZlY3RvcjxpbnQsIGtNYXhCdWZmZXJM
ZW5ndGg+IGFkdmFuY2VzOworICAgIGludCBnbHlwaEluZGV4ID0gMDsgIC8vIFRoZSBzdGFydGlu
ZyBnbHlwaCBvZiB0aGUgY3VycmVudCBjaHVuay4KKyAgICBpbnQgY3VyQWR2YW5jZSA9IDA7ICAv
LyBIb3cgZmFyIGZyb20gdGhlIGxlZnQgdGhlIGN1cnJlbnQgY2h1bmsgaXMuCiAgICAgd2hpbGUg
KGdseXBoSW5kZXggPCBudW1HbHlwaHMpIHsKLSAgICAgICAgLy8gaG93IG1hbnkgY2hhcnMgd2ls
bCBiZSBpbiB0aGlzIGNodW5rPworICAgICAgICAvLyBIb3cgbWFueSBjaGFycyB3aWxsIGJlIGlu
IHRoaXMgY2h1bms/CiAgICAgICAgIGludCBjdXJMZW4gPSBzdGQ6Om1pbihrTWF4QnVmZmVyTGVu
Z3RoLCBudW1HbHlwaHMgLSBnbHlwaEluZGV4KTsKLQogICAgICAgICBnbHlwaHMucmVzaXplKGN1
ckxlbik7CiAgICAgICAgIGFkdmFuY2VzLnJlc2l6ZShjdXJMZW4pOwogCkBAIC0xMjEsMjEgKzI0
NCwxMCBAQCB2b2lkIEZvbnQ6OmRyYXdHbHlwaHMoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0Nv
bnRleHQsCiAgICAgICAgICAgICBjdXJXaWR0aCArPSBhZHZhbmNlc1tpXTsKICAgICAgICAgfQog
CisgICAgICAgIC8vIEFjdHVhbGx5IGRyYXcgdGhlIGdseXBocyAod2l0aCByZXRyeSBvbiBmYWls
dXJlKS4KICAgICAgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CiAgICAgICAgIGZvciAoaW50IGV4
ZWN1dGlvbnMgPSAwOyBleGVjdXRpb25zIDwgMjsgKytleGVjdXRpb25zKSB7Ci0gICAgICAgICAg
ICBpZiAoY2FuVXNlR0RJKQotICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSAhIUV4dFRleHRPdXQo
aGRjLCB4LCBsaW5lVG9wLCBFVE9fR0xZUEhfSU5ERVgsIDAsCi0gICAgICAgICAgICAgICAgICAg
ICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHdjaGFyX3QqPigmZ2x5cGhzWzBdKSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGN1ckxlbiwgJmFkdmFuY2VzWzBdKTsKLSAgICAgICAgICAgIGVs
c2UgewotICAgICAgICAgICAgICAgIC8vIFNraWEncyB0ZXh0IGRyYXdpbmcgb3JpZ2luIGlzIHRo
ZSBiYXNlbGluZSwgbGlrZSBXZWJLaXQsIG5vdAotICAgICAgICAgICAgICAgIC8vIHRoZSB0b3As
IGxpa2UgV2luZG93cy4KLSAgICAgICAgICAgICAgICBTa1BvaW50IG9yaWdpbiA9IHsgeCwgcG9p
bnQueSgpIH07Ci0gICAgICAgICAgICAgICAgc3VjY2VzcyA9IHBhaW50U2tpYVRleHQoY29udGV4
dCwgZm9udC0+cGxhdGZvcm1EYXRhKCkuaGZvbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAg
IG51bUdseXBocywgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBXT1JEKj4oJmdseXBoc1swXSksCi0g
ICAgICAgICAgICAgICAgICAgICAgICAmYWR2YW5jZXNbMF0sIDAsICZvcmlnaW4pOwotICAgICAg
ICAgICAgfQotCisgICAgICAgICAgICBzdWNjZXNzID0gaGVscGVyLmRyYXdHbHlwaHMoY3VyTGVu
LCAmZ2x5cGhzWzBdLCAmYWR2YW5jZXNbMF0sIGN1ckFkdmFuY2UpOwogICAgICAgICAgICAgaWYg
KCFzdWNjZXNzICYmIGV4ZWN1dGlvbnMgPT0gMCkgewogICAgICAgICAgICAgICAgIC8vIEFzayB0
aGUgYnJvd3NlciB0byBsb2FkIHRoZSBmb250IGZvciB1cyBhbmQgcmV0cnkuCiAgICAgICAgICAg
ICAgICAgQ2hyb21pdW1CcmlkZ2U6OmVuc3VyZUZvbnRMb2FkZWQoZm9udC0+cGxhdGZvcm1EYXRh
KCkuaGZvbnQoKSk7CkBAIC0xNDUsMTQgKzI1Nyw4IEBAIHZvaWQgRm9udDo6ZHJhd0dseXBocyhH
cmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwKICAgICAgICAgfQogCiAgICAgICAgIEFT
U0VSVChzdWNjZXNzKTsKLQotICAgICAgICB4ICs9IGN1cldpZHRoOworICAgICAgICBjdXJBZHZh
bmNlICs9IGN1cldpZHRoOwogICAgIH0KLQotICAgIFNlbGVjdE9iamVjdChoZGMsIG9sZEZvbnQp
OwotICAgIGlmIChjcmVhdGVkTGF5ZXIpCi0gICAgICAgIGdyYXBoaWNzQ29udGV4dC0+ZW5kVHJh
bnNwYXJlbmN5TGF5ZXIoKTsKLSAgICBjb250ZXh0LT5jYW52YXMoKS0+ZW5kUGxhdGZvcm1QYWlu
dCgpOwogfQogCiBGbG9hdFJlY3QgRm9udDo6c2VsZWN0aW9uUmVjdEZvckNvbXBsZXhUZXh0KGNv
bnN0IFRleHRSdW4mIHJ1biwKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Y2hyb21pdW0vVGhlbWVIZWxwZXJDaHJvbWl1bVdpbi5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL1RoZW1lSGVscGVyQ2hyb21pdW1XaW4uY3BwCmRlbGV0ZWQgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCA3OThlZTMyLi4wMDAwMDAwCi0tLSBhL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vVGhlbWVIZWxwZXJDaHJvbWl1bVdpbi5jcHAKKysrIC9kZXYvbnVs
bApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSwgR29v
Z2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
Ci0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBO
ZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBj
b250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl
cml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0
ZW4gcGVybWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUg
Q09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlU
RUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICog
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVk
ZSAiVGhlbWVIZWxwZXJDaHJvbWl1bVdpbi5oIgotCi0jaW5jbHVkZSAiRmxvYXRSZWN0LmgiCi0j
aW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotVGhl
bWVIZWxwZXJXaW46OlRoZW1lSGVscGVyV2luKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29u
c3QgSW50UmVjdCYgcmVjdCkKLSAgICA6IG1fb3JnQ29udGV4dChjb250ZXh0KQotICAgICwgbV9v
cmdNYXRyaXgoY29udGV4dC0+Z2V0Q1RNKCkpCi0gICAgLCBtX29yZ1JlY3QocmVjdCkKLXsKLSAg
ICBpZiAobV9vcmdNYXRyaXguYigpICE9IDAgfHwgbV9vcmdNYXRyaXguYygpICE9IDApIHsgIC8v
IENoZWNrIGZvciBza2V3LgotICAgICAgICAvLyBDb21wbGljYXRlZCBlZmZlY3RzLCBtYWtlIGEg
Y29weSBhbmQgZHJhdyB0aGUgYml0bWFwIHRoZXJlLgotICAgICAgICBtX3R5cGUgPSBDT1BZOwot
ICAgICAgICBtX3JlY3Quc2V0U2l6ZShyZWN0LnNpemUoKSk7Ci0KLSAgICAgICAgbV9uZXdCdWZm
ZXIuc2V0KEltYWdlQnVmZmVyOjpjcmVhdGUocmVjdC5zaXplKCksIGZhbHNlKS5yZWxlYXNlKCkp
OwotCi0gICAgICAgIC8vIFRoZW1lIGRyYXdpbmcgbWVzc2VzIHdpdGggdGhlIHRyYW5zcGFyZW5j
eS4KLSAgICAgICAgLy8gRklYTUU6IElkZWFsbHksIHdlIHdvdWxkIGxlYXZlIHRoaXMgdHJhbnNw
YXJlbnQsIGJ1dCBJIHdhcwotICAgICAgICAvLyBoYXZpbmcgcHJvYmxlbXMgd2l0aCBidXR0b24g
ZHJhd2luZywgc28gd2UgZmlsbCB3aXRoIHdoaXRlLiBCdXR0b25zCi0gICAgICAgIC8vIGxvb2tl
ZCBnb29kIHdpdGggdHJhbnNwYXJlbnQgaGVyZSBhbmQgbm8gZml4aW5nIHVwIG9mIHRoZSBhbHBo
YQotICAgICAgICAvLyBsYXRlciwgYnV0IHRleHQgYXJlYXMgZGlkbid0LiBUaGlzIG1ha2VzIHRl
eHQgYXJlYXMgbG9vayBnb29kIGJ1dAotICAgICAgICAvLyBnaXZlcyBidXR0b25zIGEgd2hpdGUg
aGFsby4gSXMgdGhlcmUgYSB3YXkgdG8gZml4IHRoaXM/IEkgdGhpbmsKLSAgICAgICAgLy8gYnV0
dG9ucyBhY3R1YWxseSBoYXZlIGFudGlhbGlzZWQgZWRnZXMgd2hpY2ggaXMganVzdCBub3QgcG9z
c2libGUKLSAgICAgICAgLy8gdG8gaGFuZGxlIG9uIGEgdHJhbnNwYXJlbnQgYmFja2dyb3VuZCBn
aXZlbiB0aGF0IGl0IG1lc3NlcyB3aXRoIHRoZQotICAgICAgICAvLyBhbHBoYSBjaGFubmVsLgot
ICAgICAgICBGbG9hdFJlY3QgbmV3Q29udGV4dFJlY3QoMCwgMCwgcmVjdC53aWR0aCgpLCByZWN0
LmhlaWdodCgpKTsKLSAgICAgICAgR3JhcGhpY3NDb250ZXh0KiBuZXdDb250ZXh0ID0gbV9uZXdC
dWZmZXItPmNvbnRleHQoKTsKLSAgICAgICAgbmV3Q29udGV4dC0+c2V0RmlsbENvbG9yKENvbG9y
Ojp3aGl0ZSk7Ci0gICAgICAgIG5ld0NvbnRleHQtPmZpbGxSZWN0KG5ld0NvbnRleHRSZWN0KTsK
LQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1fb3JnTWF0cml4LmEoKSAhPSAx
LjAgfHwgbV9vcmdNYXRyaXguZCgpICE9IDEuMCkgeyAgLy8gQ2hlY2sgZm9yIHNjYWxlLgotICAg
ICAgICAvLyBPbmx5IGEgc2NhbGluZyBpcyBhcHBsaWVkLgotICAgICAgICBtX3R5cGUgPSBTQ0FM
RTsKLQotICAgICAgICAvLyBTYXZlIHRoZSB0cmFuc2Zvcm1lZCBjb29yZGluYXRlcyB0byBkcmF3
LgotICAgICAgICBtX3JlY3QgPSBtX29yZ01hdHJpeC5tYXBSZWN0KHJlY3QpOwotICAgICAgICAK
LSAgICAgICAgbV9vcmdDb250ZXh0LT5zYXZlKCk7Ci0gICAgICAgIG1fb3JnQ29udGV4dC0+Y29u
Y2F0Q1RNKG1fb3JnQ29udGV4dC0+Z2V0Q1RNKCkuaW52ZXJzZSgpKTsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KLQotICAgIC8vIE5vdGhpbmcgaW50ZXJlc3RpbmcuCi0gICAgbV9yZWN0ID0gcmVj
dDsKLSAgICBtX3R5cGUgPSBPUklHSU5BTDsKLX0KLQotVGhlbWVIZWxwZXJXaW46On5UaGVtZUhl
bHBlcldpbigpCi17Ci0gICAgc3dpdGNoIChtX3R5cGUpIHsKLSAgICBjYXNlIFNDQUxFOgotICAg
ICAgICBtX29yZ0NvbnRleHQtPnJlc3RvcmUoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBD
T1BZOiB7Ci0gICAgICAgIC8vIENvcHkgdGhlIGR1cGxpY2F0ZSBiaXRtYXAgd2l0aCBvdXIgY29u
dHJvbCB0byB0aGUgb3JpZ2luYWwgY2FudmFzLgotICAgICAgICBGbG9hdFJlY3QgZGVzdFJlY3Qo
bV9vcmdSZWN0KTsKLSAgICAgICAgbV9uZXdCdWZmZXItPmNvbnRleHQoKS0+cGxhdGZvcm1Db250
ZXh0KCktPmNhbnZhcygpLT4KLSAgICAgICAgICAgIGdldFRvcFBsYXRmb3JtRGV2aWNlKCkuZml4
dXBBbHBoYUJlZm9yZUNvbXBvc2l0aW5nKCk7Ci0gICAgICAgIG1fb3JnQ29udGV4dC0+ZHJhd0lt
YWdlKG1fbmV3QnVmZmVyLT5pbWFnZSgpLCBkZXN0UmVjdCk7Ci0gICAgICAgIGJyZWFrOwotICAg
IH0KLSAgICBjYXNlIE9SSUdJTkFMOgotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLX0gIC8v
IG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2Nocm9taXVtL1RoZW1lSGVscGVyQ2hyb21pdW1XaW4uaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvY2hyb21pdW0vVGhlbWVIZWxwZXJDaHJvbWl1bVdpbi5oCmRlbGV0ZWQgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAxNzcxZmI0Li4wMDAwMDAwCi0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvY2hyb21pdW0vVGhlbWVIZWxwZXJDaHJvbWl1bVdpbi5oCisrKyAvZGV2L251bGwKQEAg
LTEsOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSwgR29vZ2xlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMg
YXJlCi0gKiBtZXQ6Ci0gKiAKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBj
b3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVy
IHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmli
dXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQg
ZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVy
bWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJ
R0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQot
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIFRoZW1lSGVscGVyV2luX2gKLSNkZWZpbmUg
VGhlbWVIZWxwZXJXaW5faAotCi0jaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKLSNp
bmNsdWRlICJJbWFnZUJ1ZmZlci5oIgotI2luY2x1ZGUgIkludFJlY3QuaCIKLSNpbmNsdWRlIDx3
dGYvT3duUHRyLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotY2xhc3MgR3JhcGhpY3NDb250
ZXh0OwotY2xhc3MgSW50UmVjdDsKLQotLy8gSGVscHMgZHJhd2luZyB0aGVtZSBlbGVtZW50cyBs
aWtlIGJ1dHRvbnMgYW5kIHNjcm9sbCBiYXJzLiBUaGlzIHdpbGwgaGFuZGxlCi0vLyB0cmFuc2xh
dGlvbnMgYW5kIHNjYWxpbmdzIHRoYXQgV2luZG93cyBtaWdodCBub3QsIGJ5IGVpdGhlciBtYWtp
bmcgV2luZG93cwotLy8gZHJhdyB0aGUgYXBwcm9wcmlhdGUgc2l6ZWQgY29udHJvbCwgb3IgYnkg
cmVuZGVyaW5nIGl0IGludG8gYW4gb2ZmLXNjcmVlbgotLy8gY29udGV4dCBhbmQgdHJhbnNmb3Jt
aW5nIGl0IG91cnNlbHZlcy4KLWNsYXNzIFRoZW1lSGVscGVyV2luIHsKLSAgICBlbnVtIFR5cGUg
ewotICAgICAgICAvLyBVc2UgdGhlIG9yaWdpbmFsIGNhbnZhcyB3aXRoIG5vIGNoYW5nZXMuIFRo
aXMgaXMgdGhlIG5vcm1hbCBtb2RlLgotICAgICAgICBPUklHSU5BTCwKLQotICAgICAgICAvLyBV
c2UgdGhlIG9yaWdpbmFsIGNhbnZhcyBidXQgc2NhbGUgdGhlIHJlY3RhbmdsZSBvZiB0aGUgY29u
dHJvbCBzbwotICAgICAgICAvLyB0aGF0IGl0IHdpbGwgYmUgdGhlIGNvcnJlY3Qgc2l6ZSwgdW5k
b2luZyBhbnkgc2NhbGUgYWxyZWFkeSBvbiB0aGUKLSAgICAgICAgLy8gY2FudmFzLiBUaGlzIHdp
bGwgaGF2ZSB0aGUgZWZmZWN0IG9mIGp1c3QgZHJhd2luZyB0aGUgY29udHJvbCBiaWdnZXIKLSAg
ICAgICAgLy8gb3Igc21hbGxlciBhbmQgbm90IGFjdHVhbGx5IGV4cGFuZGluZyBvciBjb250cmFj
dGluZyB0aGUgcGl4ZWxzIGluCi0gICAgICAgIC8vIGl0LiBUaGlzIHVzdWFsbHkgbG9va3MgYmV0
dGVyLgotICAgICAgICBTQ0FMRSwKLQotICAgICAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgY29u
dHJvbCBhbmQgdGhlbiB0cmFuc2Zvcm0gaXQgb3Vyc2VsdmVzIGFmdGVyCi0gICAgICAgIC8vIFdp
bmRvd3MgZHJhd3MgaXQuIFRoaXMgYWxsb3dzIHVzIHRvIGdldCBjb21wbGV4IGVmZmVjdHMuCi0g
ICAgICAgIENPUFksCi0gICAgfTsKLQotcHVibGljOgotICAgIC8vIFByZXBhcmVzIGRyYXdpbmcg
YSBjb250cm9sIHdpdGggdGhlIGdpdmVuIHJlY3QgdG8gdGhlIGdpdmVuIGNvbnRleHQuCi0gICAg
VGhlbWVIZWxwZXJXaW4oR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiBy
ZWN0KTsKLSAgICB+VGhlbWVIZWxwZXJXaW4oKTsKLQotICAgIC8vIFJldHVybnMgdGhlIGNvbnRl
eHQgdG8gZHJhdyB0aGUgY29udHJvbCBpbnRvLCB3aGljaCBtYXkgYmUgdGhlIG9yaWdpbmFsCi0g
ICAgLy8gb3IgdGhlIGNvcHksIGRlcGVuZGluZyBvbiB0aGUgbW9kZS4KLSAgICBHcmFwaGljc0Nv
bnRleHQqIGNvbnRleHQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbmV3QnVmZmVyLmdldCgp
ID8gbV9uZXdCdWZmZXItPmNvbnRleHQoKSA6IG1fb3JnQ29udGV4dDsKLSAgICB9Ci0KLSAgICAv
LyBSZXR1cm5zIHRoZSByZWN0YW5nbGUgaW4gd2hpY2ggdG8gZHJhdyBpbnRvIHRoZSBjYW52YXMo
KSBieSBXaW5kb3dzLgotICAgIGNvbnN0IEludFJlY3QmIHJlY3QoKSB7IHJldHVybiBtX3JlY3Q7
IH0KLQotcHJpdmF0ZToKLSAgICBUeXBlIG1fdHlwZTsKLQotICAgIC8vIFRoZSBvcmlnaW5hbCBj
YW52YXMgdG8gd3JvdGUgdG8uIE5vdCBvd25lZCBieSB0aGlzIGNsYXNzLgotICAgIEdyYXBoaWNz
Q29udGV4dCogbV9vcmdDb250ZXh0OwotICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IG1fb3JnTWF0
cml4OwotICAgIEludFJlY3QgbV9vcmdSZWN0OwotCi0gICAgLy8gV2hlbiBtX3R5cGUgPT0gQ09Q
WSwgdGhpcyB3aWxsIGJlIGEgbmV3IHN1cmZhY2Ugb3duZWQgYnkgdGhpcyBjbGFzcyB0aGF0Ci0g
ICAgLy8gcmVwcmVzZW50cyB0aGUgY29weS4KLSAgICBPd25QdHI8SW1hZ2VCdWZmZXI+IG1fbmV3
QnVmZmVyOwotCi0gICAgLy8gVGhlIGNvbnRyb2wgcmVjdGFuZ2xlIGluIHRoZSBjb29yZGluYXRl
IHNwYWNlIG9mIGNhbnZhcygpLgotICAgIEludFJlY3QgbV9yZWN0OwotfTsKLQotfSAgLy8gbmFt
ZXNwYWNlIFdlYkNvcmUKLQotI2VuZGlmICAvLyBUaGVtZUhlbHBlcldpbl9oCmRpZmYgLS1naXQg
YS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1RyYW5zcGFyZW5jeVdpbi5jcHAg
Yi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1RyYW5zcGFyZW5jeVdpbi5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3NjhjNQotLS0gL2Rldi9udWxs
CisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vVHJhbnNwYXJlbmN5V2lu
LmNwcApAQCAtMCwwICsxLDQyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAq
IGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRo
ZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRy
aWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZl
ZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBw
ZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZ
UklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBU
TywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlIDx3
aW5kb3dzLmg+CisKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbWFn
ZUJ1ZmZlci5oIgorI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dFNraWEuaCIKKyNpbmNsdWRlICJT
aW1wbGVGb250RGF0YS5oIgorI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCisjaW5j
bHVkZSAiVHJhbnNwYXJlbmN5V2luLmgiCisKKyNpbmNsdWRlICJTa0NvbG9yUHJpdi5oIgorI2lu
Y2x1ZGUgInNraWEvZXh0L3BsYXRmb3JtX2NhbnZhcy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK25hbWVzcGFjZSB7CisKKy8vIElmIGVpdGhlciBvZiB0aGVzZSBwb2ludGVycyBpcyBub24t
TlVMTCwgYm90aCBtdXN0IGJlIHZhbGlkIGFuZCBwb2ludCB0bworLy8gYml0bWFwcyBvZiB0aGUg
c2FtZSBzaXplLgorc3RydWN0IFN0YXRpY0J1ZmZlcgoreworICAgIC8vIFRoZSBkZXN0aW5hdGlv
biBiaXRtYXAgd2UncmUgZHJhd2luZyBpbnRvLgorICAgIEltYWdlQnVmZmVyKiBkZXN0Qml0bWFw
OworCisgICAgLy8gVGhpcyBjb3VsZCBiZSBhbiBJbWFnZUJ1ZmZlciBidXQgdGhpcyBpcyBhbiBv
cHRpbWl6YXRpb24uIFNpbmNlIHRoaXMgaXMKKyAgICAvLyBvbmx5IGV2ZXIgdXNlZCBhcyBhIHJl
ZmVyZW5jZSwgd2UgZG9uJ3QgbmVlZCB0byBtYWtlIGEgZnVsbAorICAgIC8vIFBsYXRmb3JtQ2Fu
dmFzIHVzaW5nIFNraWEgb24gV2luZG93cy4gSnVzdCBhbGxvY2F0aW5nIGEgcmVndWxhciBTa0Jp
dG1hcAorICAgIC8vIGlzIG11Y2ggZmFzdGVyIHNpbmNlIGl0J3MganVzdCBhIE1hbGxvYyByYXRo
ZXIgdGhhbiBhIEdESSBjYWxsLgorICAgIFNrQml0bWFwKiByZWZlcmVuY2VCaXRtYXA7Cit9IHN0
YXRpY0J1ZmZlciA9IHtOVUxMLCBOVUxMfTsKKworLy8gVGhlIG1heGltdW0gc2l6ZSBpbiBwaXhl
bHMgb2YgdGhlIGJ1ZmZlciB3ZSdsbCBrZWVwIGFyb3VuZCBmb3IgZHJhd2luZyB0ZXh0CisvLyBp
bnRvLiBCdWZmZXJzIGxhcmdlciB0aGFuIHRoaXMgd2lsbCBiZSBkZXN0cm95ZWQgd2hlbiB3ZSdy
ZSBkb25lIHdpdGggdGhlbS4KK2NvbnN0IGludCBtYXhDYWNoZWRCdWZmZXJQaXhlbFNpemUgPSA2
NTUzNjsKKworaW5saW5lIHNraWE6OlBsYXRmb3JtQ2FudmFzKiBjYW52YXNGb3JDb250ZXh0KEdy
YXBoaWNzQ29udGV4dCogY29udGV4dCkKK3sKKyAgICByZXR1cm4gY29udGV4dC0+cGxhdGZvcm1D
b250ZXh0KCktPmNhbnZhcygpOworfQorCitpbmxpbmUgY29uc3QgU2tCaXRtYXAmIGJpdG1hcEZv
ckNvbnRleHQoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0KQoreworICAgIHJldHVybiBjYW52YXNG
b3JDb250ZXh0KGNvbnRleHQpLT4KKyAgICAgICAgZ2V0VG9wUGxhdGZvcm1EZXZpY2UoKS5hY2Nl
c3NCaXRtYXAoZmFsc2UpOworfQorCit2b2lkIGNvbXBvc2l0ZVRvQ29weShHcmFwaGljc0NvbnRl
eHQqIHNvdXJjZUxheWVycywKKyAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzQ29udGV4dCog
ZGVzdENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBUcmFuc2Zvcm1hdGlvbk1h
dHJpeCYgbWF0cml4KQoreworICAgIC8vIE1ha2UgYSBsaXN0IG9mIGFsbCBkZXZpY2VzLiBUaGUg
aXRlcmF0b3IgZ29lcyB0b3AtZG93biwgYW5kIHdlIHdhbnQKKyAgICAvLyBib3R0b20tdXAuCisg
ICAgc3RydWN0IERldmljZUluZm8geworICAgICAgICBEZXZpY2VJbmZvKFNrRGV2aWNlKiBkLCBp
bnQgbHgsIGludCBseSkKKyAgICAgICAgICAgIDogZGV2aWNlKGQpCisgICAgICAgICAgICAsIHgo
bHgpCisgICAgICAgICAgICAsIHkobHkpIHt9CisgICAgICAgIFNrRGV2aWNlKiBkZXZpY2U7Cisg
ICAgICAgIGludCB4LCB5OworICAgIH07CisgICAgVmVjdG9yPERldmljZUluZm8+IGRldmljZXM7
CisgICAgU2tDYW52YXMqIHNvdXJjZUNhbnZhcyA9IGNhbnZhc0ZvckNvbnRleHQoc291cmNlTGF5
ZXJzKTsKKyAgICBTa0NhbnZhczo6TGF5ZXJJdGVyIGl0ZXIoc291cmNlQ2FudmFzLCBmYWxzZSk7
CisgICAgd2hpbGUgKCFpdGVyLmRvbmUoKSkgeworICAgICAgICBkZXZpY2VzLmFwcGVuZChEZXZp
Y2VJbmZvKGl0ZXIuZGV2aWNlKCksIGl0ZXIueCgpLCBpdGVyLnkoKSkpOworICAgICAgICBpdGVy
Lm5leHQoKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSB0ZW1wb3JhcnkgY2FudmFzIGZvciB0
aGUgY29tcG9zaXRpbmcgaW50byB0aGUgZGVzdGluYXRpb24uCisgICAgU2tCaXRtYXAqIGRlc3RC
bXAgPSBjb25zdF9jYXN0PFNrQml0bWFwKj4oJmJpdG1hcEZvckNvbnRleHQoZGVzdENvbnRleHQp
KTsKKyAgICBTa0NhbnZhcyBkZXN0Q2FudmFzKCpkZXN0Qm1wKTsKKyAgICBkZXN0Q2FudmFzLnNl
dE1hdHJpeChtYXRyaXgpOworCisgICAgZm9yIChpbnQgaSA9IGRldmljZXMuc2l6ZSgpIC0gMTsg
aSA+PSAwOyBpLS0pIHsKKyAgICAgICAgY29uc3QgU2tCaXRtYXAmIHNyY0JtcCA9IGRldmljZXNb
aV0uZGV2aWNlLT5hY2Nlc3NCaXRtYXAoZmFsc2UpOworCisgICAgICAgIFNrUmVjdCBkZXN0UmVj
dDsKKyAgICAgICAgZGVzdFJlY3QuZkxlZnQgPSBkZXZpY2VzW2ldLng7CisgICAgICAgIGRlc3RS
ZWN0LmZUb3AgPSBkZXZpY2VzW2ldLnk7CisgICAgICAgIGRlc3RSZWN0LmZSaWdodCA9IGRlc3RS
ZWN0LmZMZWZ0ICsgc3JjQm1wLndpZHRoKCk7CisgICAgICAgIGRlc3RSZWN0LmZCb3R0b20gPSBk
ZXN0UmVjdC5mVG9wICsgc3JjQm1wLmhlaWdodCgpOworCisgICAgICAgIGRlc3RDYW52YXMuZHJh
d0JpdG1hcFJlY3Qoc3JjQm1wLCBOVUxMLCBkZXN0UmVjdCk7CisgICAgfQorfQorCit9ICAvLyBu
YW1lc3BhY2UKKworVHJhbnNwYXJlbmN5V2luOjpUcmFuc3BhcmVuY3lXaW4oKQorICAgIDogbV9k
ZXN0Q29udGV4dCgwKQorICAgICwgbV9vcmdUcmFuc2Zvcm0oKQorICAgICwgbV9sYXllck1vZGUo
Tm9MYXllcikKKyAgICAsIG1fdHJhbnNmb3JtTW9kZShLZWVwVHJhbnNmb3JtKQorICAgICwgbV9k
cmF3Q29udGV4dCgwKQorICAgICwgbV9zYXZlZE9uRHJhd0NvbnRleHQoZmFsc2UpCisgICAgLCBt
X2xheWVyQnVmZmVyKDApCisgICAgLCBtX3JlZmVyZW5jZUJpdG1hcCgwKQoreworfQorCitUcmFu
c3BhcmVuY3lXaW46On5UcmFuc3BhcmVuY3lXaW4oKQoreworICAgIC8vIE1hdGNoZXMgdGhlIHNh
dmUoKSBpbiBpbml0aWFsaXplTmV3VGV4dENvbnRleHQgKG9yIHRoZSBjb25zdHJ1Y3RvciBmb3IK
KyAgICAvLyBTQ0FMRSkgdG8gcHV0IHRoZSBjb250ZXh0IGJhY2sgaW50byB0aGUgc2FtZSBzdGF0
ZSB3ZSBmb3VuZCBpdC4KKyAgICBpZiAobV9zYXZlZE9uRHJhd0NvbnRleHQpCisgICAgICAgIG1f
ZHJhd0NvbnRleHQtPnJlc3RvcmUoKTsKKworICAgIHN3aXRjaCAobV9sYXllck1vZGUpIHsKKyAg
ICBjYXNlIE5vTGF5ZXI6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT3BhcXVlQ29tcG9zaXRl
TGF5ZXI6CisgICAgY2FzZSBXaGl0ZUxheWVyOgorICAgICAgICBjb21wb3NpdGVPcGFxdWVDb21w
b3NpdGUoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUZXh0Q29tcG9zaXRlOgorICAgICAg
ICBjb21wb3NpdGVUZXh0Q29tcG9zaXRlKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwor
dm9pZCBUcmFuc3BhcmVuY3lXaW46OmluaXQoR3JhcGhpY3NDb250ZXh0KiBkZXN0LAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgTGF5ZXJNb2RlIGxheWVyTW9kZSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFRyYW5zZm9ybU1vZGUgdHJhbnNmb3JtTW9kZSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbnN0IEludFJlY3QmIHJlZ2lvbikgeworICAgIG1fZGVzdENvbnRleHQg
PSBkZXN0OworICAgIG1fb3JnVHJhbnNmb3JtID0gZGVzdC0+Z2V0Q1RNKCk7CisgICAgbV9sYXll
ck1vZGUgPSBsYXllck1vZGU7CisgICAgbV90cmFuc2Zvcm1Nb2RlID0gdHJhbnNmb3JtTW9kZTsK
KyAgICBtX3NvdXJjZVJlY3QgPSByZWdpb247CisKKyAgICBzZXR1cExheWVyKHJlZ2lvbik7Cisg
ICAgc2V0dXBUcmFuc2Zvcm0ocmVnaW9uKTsKK30KKwordm9pZCBUcmFuc3BhcmVuY3lXaW46OnNl
dHVwTGF5ZXIoY29uc3QgSW50UmVjdCYgcmVnaW9uKQoreworICAgIC8vIENvbXB1dGUgdGhlIHNp
emUgb2YgdGhlIGxheWVyIHdlJ3JlIG1ha2luZy4KKyAgICBpZiAobV90cmFuc2Zvcm1Nb2RlID09
IFVudHJhbnNmb3JtKSB7CisgICAgICAgIC8vIFRoZSBtZWFuaW5nIG9mIHRoZSAidHJhbnNmb3Jt
ZWQiIHNvdXJjZSByZWN0IGlzIGEgbGl0dGxlIGFtYmlnb3VzCisgICAgICAgIC8vIGhlcmUuIFRo
ZSByZXN0IG9mIHRoZSBjb2RlIGRvZXNuJ3QgY2FyZSBhYm91dCBpdCBpbiB0aGUgVW50cmFuc2Zv
cm0KKyAgICAgICAgLy8gY2FzZSBzaW5jZSB3ZSdyZSB1c2luZyBvdXIgb3duIGhhcHB5IGNvb3Jk
aW5hdGUgc3lzdGVtLiBTbyB3ZSBzZXQgaXQKKyAgICAgICAgLy8gdG8gYmUgdGhlIHNvdXJjZSBy
ZWN0IHNpbmNlIHRoYXQgbWF0Y2hlcyBob3cgdGhlIGNvZGUgYmVsb3cgYWN0dWFsbHkKKyAgICAg
ICAgLy8gdXNlcyB0aGUgdmFyaWFibGU6IHRvIGRldGVybWluZSBob3cgdG8gdHJhbnNsYXRlIHRo
aW5ncyB0byBhY2NvdW50CisgICAgICAgIC8vIGZvciB0aGUgb2Zmc2V0IG9mIHRoZSBsYXllci4K
KyAgICAgICAgbV90cmFuc2Zvcm1lZFNvdXJjZVJlY3QgPSBtX3NvdXJjZVJlY3Q7CisgICAgICAg
IG1fbGF5ZXJTaXplID0gSW50U2l6ZShtX3NvdXJjZVJlY3Qud2lkdGgoKSwgbV9zb3VyY2VSZWN0
LmhlaWdodCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX3RyYW5zZm9ybWVkU291cmNlUmVj
dCA9IG1fb3JnVHJhbnNmb3JtLm1hcFJlY3QobV9zb3VyY2VSZWN0KTsKKyAgICAgICAgbV9sYXll
clNpemUgPSBJbnRTaXplKG1fdHJhbnNmb3JtZWRTb3VyY2VSZWN0LndpZHRoKCksIG1fdHJhbnNm
b3JtZWRTb3VyY2VSZWN0LmhlaWdodCgpKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1fbGF5ZXJN
b2RlKSB7CisgICAgY2FzZSBOb0xheWVyOgorICAgICAgICBtX2RyYXdDb250ZXh0ID0gbV9kZXN0
Q29udGV4dDsgIC8vIERyYXcgdG8gdGhlIHNvdXJjZSBjb250ZXh0LgorICAgICAgICBicmVhazsK
KyAgICBjYXNlIE9wYXF1ZUNvbXBvc2l0ZUxheWVyOiB7CisgICAgICAgIGluaXRpYWxpemVOZXdD
b250ZXh0KCk7CisKKyAgICAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbWFwcGluZzsKKyAgICAg
ICAgbWFwcGluZy50cmFuc2xhdGUoLW1fdHJhbnNmb3JtZWRTb3VyY2VSZWN0LngoKSwgLW1fdHJh
bnNmb3JtZWRTb3VyY2VSZWN0LnkoKSk7CisgICAgICAgIGlmIChtX3RyYW5zZm9ybU1vZGUgPT0g
VW50cmFuc2Zvcm0peyAKKyAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIGludmVyc2UgbWFwcGlu
ZyBmcm9tIHRoZSBjYW52YXMgc3BhY2UgdG8gdGhlCisgICAgICAgICAgICAvLyBjb29yZGluYXRl
IHNwYWNlIG9mIG91ciBiaXRtYXAuCisgICAgICAgICAgICBtYXBwaW5nID0gbV9vcmdUcmFuc2Zv
cm0uaW52ZXJzZSgpICogbWFwcGluZzsKKyAgICAgICAgfQorICAgICAgICBjb21wb3NpdGVUb0Nv
cHkobV9kZXN0Q29udGV4dCwgbV9kcmF3Q29udGV4dCwgbWFwcGluZyk7CisKKyAgICAgICAgLy8g
U2F2ZSB0aGUgcmVmZXJlbmNlIGxheWVyIHNvIHdlIGNhbiB0ZWxsIHdoYXQgY2hhbmdlZC4KKyAg
ICAgICAgU2tDYW52YXMgcmVmZXJlbmNlQ2FudmFzKCptX3JlZmVyZW5jZUJpdG1hcCk7CisgICAg
ICAgIHJlZmVyZW5jZUNhbnZhcy5kcmF3Qml0bWFwKGJpdG1hcEZvckNvbnRleHQobV9kcmF3Q29u
dGV4dCksIDAsIDApOworICAgICAgICAvLyBMYXllciByZWN0IHJlcHJlc2VudHMgdGhlIHBhcnQg
b2YgdGhlIG9yaWdpbmFsIGxheWVyLgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBU
ZXh0Q29tcG9zaXRlOgorICAgICAgICBBU1NFUlQobV90cmFuc2Zvcm1Nb2RlID09IEtlZXBUcmFu
c2Zvcm0pOworICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gZmlsbGluZyB3aXRoIHdoaXRlLgor
ICAgIGNhc2UgV2hpdGVMYXllcjoKKyAgICAgICAgaW5pdGlhbGl6ZU5ld0NvbnRleHQoKTsKKyAg
ICAgICAgbV9kcmF3Q29udGV4dC0+ZmlsbFJlY3QoSW50UmVjdChJbnRQb2ludCgwLCAwKSwgbV9s
YXllclNpemUpLCBDb2xvcjo6d2hpdGUpOworICAgICAgICAvLyBMYXllciByZWN0IHJlcHJlc2Vu
dHMgdGhlIHBhcnQgb2YgdGhlIG9yaWdpbmFsIGxheWVyLgorICAgICAgICBicmVhazsKKyAgICB9
Cit9CisKK3ZvaWQgVHJhbnNwYXJlbmN5V2luOjpzZXR1cFRyYW5zZm9ybShjb25zdCBJbnRSZWN0
JiByZWdpb24pCit7CisgICAgc3dpdGNoIChtX3RyYW5zZm9ybU1vZGUpIHsKKyAgICBjYXNlIEtl
ZXBUcmFuc2Zvcm06CisgICAgICAgIGlmIChtX2xheWVyTW9kZSAhPSBOb0xheWVyKSB7CisgICAg
ICAgICAgICAvLyBOZWVkIHRvIHNhdmUgdGhpbmdzIHNpbmNlIHdlJ3JlIG1vZGlmeWluZyB0aGUg
dHJhbnNmb3JtLgorICAgICAgICAgICAgbV9kcmF3Q29udGV4dC0+c2F2ZSgpOworICAgICAgICAg
ICAgbV9zYXZlZE9uRHJhd0NvbnRleHQgPSB0cnVlOworCisgICAgICAgICAgICAvLyBBY2NvdW50
IGZvciB0aGUgZmFjdCB0aGF0IHRoZSBsYXllciBtYXkgYmUgb2Zmc2V0IGZyb20gdGhlCisgICAg
ICAgICAgICAvLyBvcmlnaW5hbC4gVGhpcyBvbmx5IGhhcHBlbnMgd2hlbiB3ZSBjcmVhdGUgYSBs
YXllciB0aGF0IGhhcyB0aGUKKyAgICAgICAgICAgIC8vIHNhbWUgY29vcmRpbmF0ZSBzcGFjZSBh
cyB0aGUgcGFyZW50LgorICAgICAgICAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggeGZvcm07Cisg
ICAgICAgICAgICB4Zm9ybS50cmFuc2xhdGUoLW1fdHJhbnNmb3JtZWRTb3VyY2VSZWN0LngoKSwg
LW1fdHJhbnNmb3JtZWRTb3VyY2VSZWN0LnkoKSk7CisKKyAgICAgICAgICAgIC8vIFdlJ3JlIG1h
a2luZyBhIGxheWVyLCBzbyBhcHBseSB0aGUgb2xkIHRyYW5zZm9ybSB0byB0aGUgbmV3IG9uZQor
ICAgICAgICAgICAgLy8gc28gaXQncyBtYWludGFpbmVkLiBXZSBrbm93IHRoZSBuZXcgbGF5ZXIg
aGFzIHRoZSBpZGVudGl0eQorICAgICAgICAgICAgLy8gdHJhbnNmb3JtIG5vdywgd2Ugd2UgY2Fu
IGp1c3QgbXVsdGlwbHkgaXQuCisgICAgICAgICAgICB4Zm9ybSA9IG1fb3JnVHJhbnNmb3JtICog
eGZvcm07CisgICAgICAgICAgICBtX2RyYXdDb250ZXh0LT5jb25jYXRDVE0oeGZvcm0pOworICAg
ICAgICB9CisgICAgICAgIG1fZHJhd1JlY3QgPSBtX3NvdXJjZVJlY3Q7CisgICAgICAgIGJyZWFr
OworICAgIGNhc2UgVW50cmFuc2Zvcm06CisgICAgICAgIEFTU0VSVChtX2xheWVyTW9kZSAhPSBO
b0xheWVyKTsKKyAgICAgICAgLy8gV2Ugbm93IGhhdmUgYSBuZXcgbGF5ZXIgd2l0aCB0aGUgaWRl
bnRpdHkgdHJhbnNmb3JtLCB3aGljaCBpcyB0aGUKKyAgICAgICAgLy8gVW50cmFuc2Zvcm1lZCBz
cGFjZSB3ZSdsbCB1c2UgZm9yIGRyYXdpbmcuCisgICAgICAgIG1fZHJhd1JlY3QgPSBJbnRSZWN0
KEludFBvaW50KDAsIDApLCBtX2xheWVyU2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
U2NhbGVUcmFuc2Zvcm06CisgICAgICAgIGlmIChtX2xheWVyTW9kZSA9PSBOb0xheWVyKSB7Cisg
ICAgICAgICAgICAvLyBOZWVkIHRvIHNhdmUgdGhpbmdzIHNpbmNlIHdlJ3JlIG1vZGlmeWluZyB0
aGUgbGF5ZXIuCisgICAgICAgICAgICBtX2RyYXdDb250ZXh0LT5zYXZlKCk7CisgICAgICAgICAg
ICBtX3NhdmVkT25EcmF3Q29udGV4dCA9IHRydWU7CisKKyAgICAgICAgICAgIC8vIFVuZG8gdGhl
IHRyYW5zZm9ybSBvbiB0aGUgY3VycmVudCBsYXllciB3aGVuIHdlJ3JlIHJlLXVzaW5nIHRoZQor
ICAgICAgICAgICAgLy8gY3VycmVudCBvbmUuCisgICAgICAgICAgICBtX2RyYXdDb250ZXh0LT5j
b25jYXRDVE0obV9kcmF3Q29udGV4dC0+Z2V0Q1RNKCkuaW52ZXJzZSgpKTsKKworICAgICAgICAg
ICAgLy8gV2UncmUgZHJhd2luZyB0byB0aGUgb3JpZ2luYWwgbGF5ZXIgd2l0aCBqdXN0IGEgZGlm
ZmVyZW50IHNpemUuCisgICAgICAgICAgICBtX2RyYXdSZWN0ID0gbV90cmFuc2Zvcm1lZFNvdXJj
ZVJlY3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBKdXN0IGdvIGFoZWFkIGFu
ZCB1c2UgdGhlIGxheWVyJ3MgY29vcmRpbmF0ZSBzcGFjZSB0byBkcmF3IGludG8uCisgICAgICAg
ICAgICAvLyBJdCB3aWxsIGhhdmUgdGhlIHNjYWxlZCBzaXplLCBhbmQgYW4gaWRlbnRpdHkgdHJh
bnNmb3JtIGxvYWRlZC4KKyAgICAgICAgICAgIG1fZHJhd1JlY3QgPSBJbnRSZWN0KEludFBvaW50
KDAsIDApLCBtX2xheWVyU2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQor
fQorCit2b2lkIFRyYW5zcGFyZW5jeVdpbjo6c2V0VGV4dENvbXBvc2l0ZUNvbG9yKENvbG9yIGNv
bG9yKQoreworICAgIG1fdGV4dENvbXBvc2l0ZUNvbG9yID0gY29sb3I7Cit9CisKK3ZvaWQgVHJh
bnNwYXJlbmN5V2luOjppbml0aWFsaXplTmV3Q29udGV4dCgpCit7CisgICAgaW50IHBpeGVsU2l6
ZSA9IG1fbGF5ZXJTaXplLndpZHRoKCkgKiBtX2xheWVyU2l6ZS5oZWlnaHQoKTsKKyAgICBpZiAo
cGl4ZWxTaXplID4gbWF4Q2FjaGVkQnVmZmVyUGl4ZWxTaXplKSB7CisgICAgICAgIC8vIENyZWF0
ZSBhIDEtb2ZmIGJ1ZmZlciBmb3IgZHJhd2luZyBpbnRvLgorICAgICAgICBtX293bmVkQnVmZmVy
LmFkb3B0KEltYWdlQnVmZmVyOjpjcmVhdGUobV9sYXllclNpemUsIGZhbHNlKSk7CisgICAgICAg
IG1fbGF5ZXJCdWZmZXIgPSBtX293bmVkQnVmZmVyLmdldCgpOworCisgICAgICAgIGlmIChtX2xh
eWVyTW9kZSA9PSBPcGFxdWVDb21wb3NpdGVMYXllcikgeworICAgICAgICAgICAgLy8gT25seSBj
cmVhdGUgdGhlIHJlZmVyZW5jZSBidWZmZXIgaWYgbmVlZGVkLiBCZWxvdywgd2UgYWx3YXlzCisg
ICAgICAgICAgICAvLyBjcmVhdGUgdGhlIGJ1ZmZlciB0byByZWR1Y2UgY29tcGxleGl0eSB3aGVu
IHVzaW5nIHRoZSBjYWNoZWQKKyAgICAgICAgICAgIC8vIGJpdG1hcCBieSBrZWVwaW5nIGV2ZXJ5
dGhpbmcgaW4gc3luYy4KKyAgICAgICAgICAgIG1fb3duZWRSZWZlcmVuY2VCdWZmZXIuc2V0KG5l
dyBTa0JpdG1hcCk7CisgICAgICAgICAgICBtX293bmVkUmVmZXJlbmNlQnVmZmVyLT5zZXRDb25m
aWcoU2tCaXRtYXA6OmtBUkdCXzg4ODhfQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG1fbGF5ZXJTaXplLndpZHRoKCksCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9sYXllclNpemUuaGVpZ2h0KCkpOwor
ICAgICAgICAgICAgbV9vd25lZFJlZmVyZW5jZUJ1ZmZlci0+YWxsb2NQaXhlbHMoKTsKKyAgICAg
ICAgICAgIG1fcmVmZXJlbmNlQml0bWFwID0gbV9vd25lZFJlZmVyZW5jZUJ1ZmZlci5nZXQoKTsK
KyAgICAgICAgfQorCisgICAgICAgIG1fZHJhd0NvbnRleHQgPSBtX293bmVkQnVmZmVyLT5jb250
ZXh0KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoc3RhdGljQnVmZmVyLmRl
c3RCaXRtYXAgJiYKKyAgICAgICAgc3RhdGljQnVmZmVyLmRlc3RCaXRtYXAtPnNpemUoKS53aWR0
aCgpID49IG1fbGF5ZXJTaXplLndpZHRoKCkgJiYKKyAgICAgICAgc3RhdGljQnVmZmVyLmRlc3RC
aXRtYXAtPnNpemUoKS5oZWlnaHQoKSA+PSBtX2xheWVyU2l6ZS5oZWlnaHQoKSkgeworICAgICAg
ICAvLyBXZSBjYW4gcmUtdXNlIHRoZSBleGlzdGluZyBidWZmZXIuIFdlIGRvbid0IG5lZWQgdG8g
Y2xlYXIgaXQgc2luY2UKKyAgICAgICAgLy8gYWxsIGxheWVyIG1vZGVzIHdpbGwgY2xlYXIgaXQg
aW4gdGhlaXIgaW5pdGlhbGl6YXRpb24uCisgICAgICAgIG1fZHJhd0NvbnRleHQgPSBzdGF0aWNC
dWZmZXIuZGVzdEJpdG1hcC0+Y29udGV4dCgpOworICAgICAgICBtX2xheWVyQnVmZmVyID0gc3Rh
dGljQnVmZmVyLmRlc3RCaXRtYXA7CisKKyAgICAgICAgbV9yZWZlcmVuY2VCaXRtYXAgPSBzdGF0
aWNCdWZmZXIucmVmZXJlbmNlQml0bWFwOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
Ly8gQ3JlYXRlIGEgbmV3IGNhY2hlZCBidWZmZXIuCisgICAgZGVsZXRlIHN0YXRpY0J1ZmZlci5k
ZXN0Qml0bWFwOworICAgIGRlbGV0ZSBzdGF0aWNCdWZmZXIucmVmZXJlbmNlQml0bWFwOworCisg
ICAgc3RhdGljQnVmZmVyLmRlc3RCaXRtYXAgPSBJbWFnZUJ1ZmZlcjo6Y3JlYXRlKG1fbGF5ZXJT
aXplLCBmYWxzZSkucmVsZWFzZSgpOworICAgIHN0YXRpY0J1ZmZlci5yZWZlcmVuY2VCaXRtYXAg
PSBuZXcgU2tCaXRtYXA7CisgICAgc3RhdGljQnVmZmVyLnJlZmVyZW5jZUJpdG1hcC0+c2V0Q29u
ZmlnKFNrQml0bWFwOjprQVJHQl84ODg4X0NvbmZpZywgbV9sYXllclNpemUud2lkdGgoKSwgbV9s
YXllclNpemUuaGVpZ2h0KCkpOworICAgIHN0YXRpY0J1ZmZlci5yZWZlcmVuY2VCaXRtYXAtPmFs
bG9jUGl4ZWxzKCk7CisKKyAgICBtX2xheWVyQnVmZmVyID0gc3RhdGljQnVmZmVyLmRlc3RCaXRt
YXA7CisgICAgbV9yZWZlcmVuY2VCaXRtYXAgPSBzdGF0aWNCdWZmZXIucmVmZXJlbmNlQml0bWFw
OworICAgIG1fZHJhd0NvbnRleHQgPSBzdGF0aWNCdWZmZXIuZGVzdEJpdG1hcC0+Y29udGV4dCgp
OworfQorCit2b2lkIFRyYW5zcGFyZW5jeVdpbjo6Y29tcG9zaXRlT3BhcXVlQ29tcG9zaXRlKCkK
K3sKKyAgICBTa0NhbnZhcyogZGVzdENhbnZhcyA9IGNhbnZhc0ZvckNvbnRleHQobV9kZXN0Q29u
dGV4dCk7CisgICAgZGVzdENhbnZhcy0+c2F2ZSgpOworCisgICAgU2tCaXRtYXAqIGJpdG1hcCA9
IGNvbnN0X2Nhc3Q8U2tCaXRtYXAqPigKKyAgICAgICAgJmJpdG1hcEZvckNvbnRleHQobV9sYXll
ckJ1ZmZlci0+Y29udGV4dCgpKSk7CisgICAgCisgICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJl
IGNhbGxlZCBmb3IgV2hpdGVMYXllciBhcyB3ZWxsLCB3aGljaCB3ZSBkb24ndCB3YW50CisgICAg
Ly8gdG8gY2hhbmdlLgorICAgIGlmIChtX2xheWVyTW9kZSA9PSBPcGFxdWVDb21wb3NpdGVMYXll
cikgeworICAgICAgICAvLyBGaXggdXAgb3VyIGJpdG1hcCwgbWFraW5nIGl0IGNvbnRhaW4gb25s
eSB0aGUgcGl4ZWxzIHdoaWNoIGNoYW5nZWQKKyAgICAgICAgLy8gYW5kIHRyYW5zcGFyZW50IGV2
ZXJ5d2hlcmUgZWxzZS4KKyAgICAgICAgU2tBdXRvTG9ja1BpeGVscyBzb3VyY2VMb2NrKCptX3Jl
ZmVyZW5jZUJpdG1hcCk7CisgICAgICAgIFNrQXV0b0xvY2tQaXhlbHMgbG9jaygqYml0bWFwKTsK
KyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBiaXRtYXAtPmhlaWdodCgpOyB5KyspIHsKKyAg
ICAgICAgICAgIHVpbnQzMl90KiBzb3VyY2UgPSBtX3JlZmVyZW5jZUJpdG1hcC0+Z2V0QWRkcjMy
KDAsIHkpOworICAgICAgICAgICAgdWludDMyX3QqIGRlc3QgPSBiaXRtYXAtPmdldEFkZHIzMigw
LCB5KTsKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgYml0bWFwLT53aWR0aCgpOyB4
KyspIHsKKyAgICAgICAgICAgICAgICAvLyBDbGVhciBvdXQgYW55IHBpeGVscyB0aGF0IHdlcmUg
dW50b3VjaGVkLgorICAgICAgICAgICAgICAgIGlmIChkZXN0W3hdID09IHNvdXJjZVt4XSkKKyAg
ICAgICAgICAgICAgICAgICAgZGVzdFt4XSA9IDA7CisgICAgICAgICAgICAgICAgZWxzZQorICAg
ICAgICAgICAgICAgICAgICBkZXN0W3hdIHw9ICgweEZGIDw8IFNLX0EzMl9TSElGVCk7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgbWFrZUxheWVyT3BhcXVl
KCk7CisKKyAgICBTa1JlY3QgZGVzdFJlY3Q7CisgICAgaWYgKG1fdHJhbnNmb3JtTW9kZSAhPSBV
bnRyYW5zZm9ybSkgeworICAgICAgICAvLyBXZSB3YW50IHRvIHVzZSBVbnRyYW5zZm9ybWVkIHNw
YWNlLgorICAgICAgICAvLworICAgICAgICAvLyBOb3RlIHRoYXQgd2UgRE9OJ1QgY2FsbCBtX2xh
eWVyQnVmZmVyLT5pbWFnZSgpIGhlcmUuIFRoaXMgYWN0dWFsbHkKKyAgICAgICAgLy8gbWFrZXMg
YSBjb3B5IG9mIHRoZSBpbWFnZSwgd2hpY2ggaXMgdW5uZWNlc3NhcnkgYW5kIHNsb3cuIEluc3Rl
YWQsIHdlCisgICAgICAgIC8vIGp1c3QgZHJhdyB0aGUgaW1hZ2UgZnJvbSBpbnNpZGUgdGhlIGRl
c3RpbmF0aW9uIGNvbnRleHQuCisgICAgICAgIFNrTWF0cml4IGlkZW50aXR5OworICAgICAgICBp
ZGVudGl0eS5yZXNldCgpOworICAgICAgICBkZXN0Q2FudmFzLT5zZXRNYXRyaXgoaWRlbnRpdHkp
OworCisgICAgICAgIGRlc3RSZWN0LnNldChtX3RyYW5zZm9ybWVkU291cmNlUmVjdC54KCksIG1f
dHJhbnNmb3JtZWRTb3VyY2VSZWN0LnkoKSwgbV90cmFuc2Zvcm1lZFNvdXJjZVJlY3QucmlnaHQo
KSwgbV90cmFuc2Zvcm1lZFNvdXJjZVJlY3QuYm90dG9tKCkpOworICAgIH0gZWxzZSB7CisgICAg
ICAgIGRlc3RSZWN0LnNldChtX3NvdXJjZVJlY3QueCgpLCBtX3NvdXJjZVJlY3QueSgpLCBtX3Nv
dXJjZVJlY3QucmlnaHQoKSwgbV9zb3VyY2VSZWN0LmJvdHRvbSgpKTsKKyAgICB9CisKKyAgICBT
a1BhaW50IHBhaW50OworICAgIHBhaW50LnNldEZpbHRlckJpdG1hcCh0cnVlKTsKKyAgICBwYWlu
dC5zZXRBbnRpQWxpYXModHJ1ZSk7CisKKyAgICAvLyBOb3RlIHRoYXQgd2UgbmVlZCB0byBzcGVj
aWZ5IHRoZSBzb3VyY2UgbGF5ZXIgc3Vic2V0LCBzaW5jZSB0aGUgYml0bWFwCisgICAgLy8gbWF5
IGhhdmUgYmVlbiBjYWNoZWQgYW5kIGl0IGNvdWxkIGJlIGxhcmdlciB0aGFuIHdoYXQgd2UncmUg
dXNpbmcuCisgICAgU2tJUmVjdCBzb3VyY2VSZWN0ID0geyAwLCAwLCBtX2xheWVyU2l6ZS53aWR0
aCgpLCBtX2xheWVyU2l6ZS5oZWlnaHQoKSB9OworICAgIGRlc3RDYW52YXMtPmRyYXdCaXRtYXBS
ZWN0KCpiaXRtYXAsICZzb3VyY2VSZWN0LCBkZXN0UmVjdCwgJnBhaW50KTsKKyAgICBkZXN0Q2Fu
dmFzLT5yZXN0b3JlKCk7Cit9CisKK3ZvaWQgVHJhbnNwYXJlbmN5V2luOjpjb21wb3NpdGVUZXh0
Q29tcG9zaXRlKCkKK3sKKyAgICBjb25zdCBTa0JpdG1hcCYgYml0bWFwID0gbV9sYXllckJ1ZmZl
ci0+Y29udGV4dCgpLT5wbGF0Zm9ybUNvbnRleHQoKS0+CisgICAgICAgIGNhbnZhcygpLT5nZXRU
b3BQbGF0Zm9ybURldmljZSgpLmFjY2Vzc0JpdG1hcCh0cnVlKTsKKyAgICBTa0NvbG9yIHRleHRD
b2xvciA9IG1fdGV4dENvbXBvc2l0ZUNvbG9yLnJnYigpOworICAgIGZvciAoaW50IHkgPSAwOyB5
IDwgbV9sYXllclNpemUuaGVpZ2h0KCk7IHkrKykgeworICAgICAgICB1aW50MzJfdCogcm93ID0g
Yml0bWFwLmdldEFkZHIzMigwLCB5KTsKKyAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBtX2xh
eWVyU2l6ZS53aWR0aCgpOyB4KyspIHsKKyAgICAgICAgICAgIC8vIFRoZSBhbHBoYSBpcyB0aGUg
YXZlcmFnZSBvZiB0aGUgUiwgRywgYW5kIEIgY2hhbm5lbHMuCisgICAgICAgICAgICBpbnQgYWxw
aGEgPSAoU2tHZXRQYWNrZWRSMzIocm93W3hdKSArIFNrR2V0UGFja2VkRzMyKHJvd1t4XSkgKwor
ICAgICAgICAgICAgICAgICAgICAgICAgIFNrR2V0UGFja2VkQjMyKHJvd1t4XSkpIC8gMzsKKwor
ICAgICAgICAgICAgLy8gQXBwbHkgdGhhdCBhbHBoYSB0byB0aGUgdGV4dCBjb2xvciBhbmQgd3Jp
dGUgdGhlIHJlc3VsdC4KKyAgICAgICAgICAgIHJvd1t4XSA9IFNrQWxwaGFNdWxRKHRleHRDb2xv
ciwgU2tBbHBoYTI1NVRvMjU2KDI1NSAtIGFscGhhKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICAvLyBOb3cgdGhlIGxheWVyIGhhcyB0ZXh0IHdpdGggdGhlIHByb3BlciBjb2xvciBhbmQgb3Bh
Y2l0eS4KKyAgICBTa0NhbnZhcyogZGVzdENhbnZhcyA9IGNhbnZhc0ZvckNvbnRleHQobV9kZXN0
Q29udGV4dCk7CisKKyAgICAvLyBXZSB3YW50IHRvIHVzZSBVbnRyYW5zZm9ybWVkIHNwYWNlIChz
ZWUgYWJvdmUpCisgICAgU2tNYXRyaXggaWRlbnRpdHk7CisgICAgaWRlbnRpdHkucmVzZXQoKTsK
KyAgICBkZXN0Q2FudmFzLT5zZXRNYXRyaXgoaWRlbnRpdHkpOworICAgIFNrUmVjdCBkZXN0UmVj
dCA9IHsgbV90cmFuc2Zvcm1lZFNvdXJjZVJlY3QueCgpLCBtX3RyYW5zZm9ybWVkU291cmNlUmVj
dC55KCksIG1fdHJhbnNmb3JtZWRTb3VyY2VSZWN0LnJpZ2h0KCksIG1fdHJhbnNmb3JtZWRTb3Vy
Y2VSZWN0LmJvdHRvbSgpIH07CisKKyAgICAvLyBOb3RlIHRoYXQgd2UgbmVlZCB0byBzcGVjaWZ5
IHRoZSBzb3VyY2UgbGF5ZXIgc3Vic2V0LCBzaW5jZSB0aGUgYml0bWFwCisgICAgLy8gbWF5IGhh
dmUgYmVlbiBjYWNoZWQgYW5kIGl0IGNvdWxkIGJlIGxhcmdlciB0aGFuIHdoYXQgd2UncmUgdXNp
bmcuCisgICAgU2tJUmVjdCBzb3VyY2VSZWN0ID0geyAwLCAwLCBtX2xheWVyU2l6ZS53aWR0aCgp
LCBtX2xheWVyU2l6ZS5oZWlnaHQoKSB9OworICAgIGRlc3RDYW52YXMtPmRyYXdCaXRtYXBSZWN0
KGJpdG1hcCwgJnNvdXJjZVJlY3QsIGRlc3RSZWN0LCBOVUxMKTsKKyAgICBkZXN0Q2FudmFzLT5y
ZXN0b3JlKCk7Cit9CisKK3ZvaWQgVHJhbnNwYXJlbmN5V2luOjptYWtlTGF5ZXJPcGFxdWUoKQor
eworICAgIFNrQml0bWFwJiBiaXRtYXAgPSBjb25zdF9jYXN0PFNrQml0bWFwJj4obV9kcmF3Q29u
dGV4dC0+cGxhdGZvcm1Db250ZXh0KCktPgorICAgICAgICBjYW52YXMoKS0+Z2V0VG9wUGxhdGZv
cm1EZXZpY2UoKS5hY2Nlc3NCaXRtYXAodHJ1ZSkpOworICAgIGZvciAoaW50IHkgPSAwOyB5IDwg
bV9sYXllclNpemUuaGVpZ2h0KCk7IHkrKykgeworICAgICAgICB1aW50MzJfdCogcm93ID0gYml0
bWFwLmdldEFkZHIzMigwLCB5KTsKKyAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBtX2xheWVy
U2l6ZS53aWR0aCgpOyB4KyspCisgICAgICAgICAgICByb3dbeF0gfD0gMHhGRjAwMDAwMDsKKyAg
ICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9UcmFuc3BhcmVuY3lXaW4uaCBiL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vVHJhbnNwYXJlbmN5V2luLmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMC4uZDEwMDM1YgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vVHJhbnNwYXJlbmN5V2luLmgKQEAgLTAsMCArMSwy
MjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6Cisg
KiAKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisg
KiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdv
b2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVz
ZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBz
b2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5E
IENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklH
SFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjaWZuZGVmIFRyYW5zcGFyZW5jeVdpbl9oCisjZGVmaW5lIFRyYW5zcGFyZW5jeVdp
bl9oCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJJbWFnZUJ1ZmZlci5oIgor
I2luY2x1ZGUgIk5vbmNvcHlhYmxlLmgiCisjaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXgu
aCIKKyNpbmNsdWRlICJ3dGYvT3duUHRyLmgiCisKK2NsYXNzIFNrQml0bWFwOworY2xhc3MgU2tD
YW52YXM7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgR3JhcGhpY3NDb250ZXh0Owor
Y2xhc3MgVHJhbnNwYXJlbmN5V2luX05vTGF5ZXJfVGVzdDsKK2NsYXNzIFRyYW5zcGFyZW5jeVdp
bl9XaGl0ZUxheWVyX1Rlc3Q7CitjbGFzcyBUcmFuc3BhcmVuY3lXaW5fVGV4dENvbXBvc2l0ZV9U
ZXN0OworY2xhc3MgVHJhbnNwYXJlbmN5V2luX09wYXF1ZUNvbXBvc2l0ZUxheWVyX1Rlc3Q7CisK
Ky8vIEhlbHBlciBjbGFzcyB0aGF0IGFic3RyYWN0cyBhd2F5IGRyYXdpbmcgQ2xlYXJUeXBlIHRl
eHQgYW5kIFdpbmRvd3MgZm9ybQorLy8gY29udHJvbHMgZWl0aGVyIHRvIHRoZSBvcmlnaW5hbCBj
b250ZXh0IGRpcmVjdGx5LCBvciB0byBhbiBvZmZzY3JlZW4gY29udGV4dAorLy8gdGhhdCBpcyBj
b21wb3NpdGVkIGxhdGVyIG1hbnVhbGx5LiBUaGlzIGlzIHRvIGdldCBhcm91bmQgV2luZG93cycg
aW5hYmlsaXR5CisvLyB0byBoYW5kbGUgdGhlIGFscGhhIGNoYW5uZWwsIHNlbWl0cmFuc3BhcmVu
dCB0ZXh0LCBhbmQgdHJhbnNmb3JtZWQgZm9ybQorLy8gY29udHJvbHMuCitjbGFzcyBUcmFuc3Bh
cmVuY3lXaW4geworcHVibGljOgorICAgIGVudW0gTGF5ZXJNb2RlIHsKKyAgICAgICAgLy8gTm8g
ZXh0cmEgbGF5ZXIgaXMgY3JlYXRlZC4gRHJhd2luZyB3aWxsIGhhcHBlbiB0byB0aGUgc291cmNl
LgorICAgICAgICAvLyBWYWxpZCBvbmx5IHdpdGggS2VlcFRyYW5zZm9ybSBhbmQgU2NhbGVUcmFu
c2Zvcm0uIFRoZSByZWdpb24gYmVpbmcKKyAgICAgICAgLy8gZHJhd24gb250byBtdXN0IGJlIG9w
YXF1ZSwgc2luY2UgdGhlIG1vZGlmaWVkIHJlZ2lvbiB3aWxsIGJlIGZvcmNlZAorICAgICAgICAv
LyB0byBvcGFxdWUgd2hlbiBkcmF3aW5nIGlzIGNvbXBsZXRlLgorICAgICAgICBOb0xheWVyLAor
CisgICAgICAgIC8vIE1ha2VzIGEgdGVtcG9yYXJ5IGxheWVyIGNvbnNpc3Rpbmcgb2YgdGhlIGNv
bXBvc2l0ZWQgbGF5ZXJzIGJlbG93CisgICAgICAgIC8vIGl0LiBUaGlzIHJlc3VsdCBtdXN0IGJl
IG9wYXF1ZS4gV2hlbiBjb21wbGV0ZSwgdGhlIHJlc3VsdCB3aWxsIGJlCisgICAgICAgIC8vIGNv
bXBhcmVkIHRvIHRoZSBvcmlnaW5hbCwgYW5kIHRoZSBkaWZmZXJlbmNlIHdpbGwgYmUgYWRkZWQg
dG8gYSB0aGVlCisgICAgICAgIC8vIGRlc3RpbmF0aW9uIGxheWVyLgorICAgICAgICAvLworICAg
ICAgICAvLyBUaGlzIG1vZGUgb25seSB3b3JrcyBpZiB0aGUgbG93ZXIgbGF5ZXJzIGFyZSBvcHF1
ZSAobm9ybWFsbHkgdGhlCisgICAgICAgIC8vIGNhc2UgZm9yIGEgd2ViIHBhZ2UpIGFuZCBsYXll
cnMgYXJlIG9ubHkgZHJhd24gaW4gdGhlIHN0YWNrIG9yZGVyLAorICAgICAgICAvLyBtZWFuaW5n
IHlvdSBjYW4gbmV2ZXIgZHJhdyB1bmRlcm5lYXRoIGEgbGF5ZXIuCisgICAgICAgIC8vCisgICAg
ICAgIC8vIFRoaXMgZG9lc24ndCB0ZWNobmljYWxseSBwcm9kdWNlIHRoZSBjb3JyZWN0IGFuc3dl
ciBpbiBhbGwgY2FzZXMuIElmCisgICAgICAgIC8vIHlvdSBoYXZlIGFuIG9wYXF1ZSBiYXNlLCBh
IHRyYW5zcGFyZW5jeSBsYXllciwgdGhhbiBhIHNlbWl0cmFuc3BhcmVudAorICAgICAgICAvLyBk
cmF3aW5nIG9uIHRvcCwgdGhlIHJlc3VsdCB3aWxsIGFjdHVhbGx5IGJlIGJsZW5kZWQgaW4gdHdp
Y2UuIEJ1dAorICAgICAgICAvLyB0aGlzIGlzbid0IGEgdmVyeSBpbXBvcnRhbnQgY2FzZS4gVGhp
cyBtb2RlIGlzIHVzZWQgZm9yIGZvcm0KKyAgICAgICAgLy8gY29udHJvbHMgd2hpY2ggYXJlIGFs
d2F5cyBvcGFxdWUgZXhjZXB0IGZvciBvY2NhdGlvbmFsbHkgc29tZQorICAgICAgICAvLyBhbnRp
YWxpYXNpbmcuIEl0IG1lYW5zIGZvcm0gY29udHJvbCBhbnRpYWxpYXNpbmcgd2lsbCBiZSB0b28g
bGlnaHQgaW4KKyAgICAgICAgLy8gc29tZSBjYXNlcywgYnV0IG9ubHkgaWYgeW91IGhhdmUgZXh0
cmEgbGF5ZXJzLgorICAgICAgICBPcGFxdWVDb21wb3NpdGVMYXllciwKKworICAgICAgICAvLyBB
bGxvd3Mgc2VtaXRyYW5zcGFyZW50IHRleHQgdG8gYmUgZHJhd24gb24gYW55IGJhY2tncm91bmQg
KGV2ZW4gaWYgaXQKKyAgICAgICAgLy8gaXMgaXRzZWxmIHNlbWl0cmFuc3BhcmVudCksIGJ1dCBk
aXNhYmxlcyBDbGVhclR5cGUuCisgICAgICAgIC8vCisgICAgICAgIC8vIEl0IG1ha2VzIGEgdHJt
cG9yYXJ5IGxheWVyIGZpbGxlZCB3aXRoIHdoaXRlLiBUaGlzIGlzIGNvbXBvc2l0ZWQgd2l0aAor
ICAgICAgICAvLyB0aGUgbG93ZXIgbGF5ZXIgd2l0aCBhIGN1c3RvbSBjb2xvciBhcHBsaWVkIHRv
IHByb2R1Y2UgdGhlIHJlc3VsdC4KKyAgICAgICAgLy8gVGhlIGNhbGxlciBtdXN0IGRyYXcgdGhl
IHRleHQgaW4gYmxhY2ssIGFuZCBzZXQgdGhlIGRlc2lyZWQgZmluYWwKKyAgICAgICAgLy8gdGV4
dCBjb2xvciBieSBjYWxsaW5nIHNldFRleHRDb21wb3NpdGVDb2xvcigpLgorICAgICAgICAvLwor
ICAgICAgICAvLyBPbmx5IHZhbGlkIHdpdGggS2VlcFRyYW5zZm9ybSwgd2hpY2ggaXMgdGhlIG9u
bHkgbW9kZSB3aGVyZSBkcmF3aW5nCisgICAgICAgIC8vIHRleHQgaW4gdGhpcyBmYXNoaW9uIG1h
a2VzIHNlbnNlLgorICAgICAgICBUZXh0Q29tcG9zaXRlLAorCisgICAgICAgIC8vIE1ha2VzIGEg
dGVtcG9yYXJ5IGxheWVyIGZpbGxlZCB3aXRoIHdoaXRlLiBXaGVuIGNvbXBsZXRlLCB0aGUgbGF5
ZXIKKyAgICAgICAgLy8gd2lsbCBiZSBmb3JjZWQgdG8gYmUgb3BxYXVlIChzaW5jZSBXaW5kb3dz
IG1heSBoYXZlIG1lc3NlZCB1cCB0aGUKKyAgICAgICAgLy8gYWxwaGEgY2hhbm5lbCkgYW5kIGNv
bXBvc2l0ZWQgZG93bi4gQW55IGFyZWFzIG5vdCBkcmF3biBpbnRvIHdpbGwKKyAgICAgICAgLy8g
cmVtYWluIHdoaXRlLgorICAgICAgICAvLworICAgICAgICAvLyBUaGlzIGlzIHRoZSBtb2RlIG9m
IGxhc3QgcmVzb3J0LiBJZiB0aGUgb3BhY2l0eSBvZiB0aGUgZmluYWwgaW1hZ2UKKyAgICAgICAg
Ly8gaXMgdW5rbm93biBhbmQgd2UgY2FuJ3QgZG8gdGhlIHRleHQgdHJpY2sgKHNpbmNlIHdlIGtu
b3cgaXRzIGNvbG9yKSwKKyAgICAgICAgLy8gdGhlbiB3ZSBoYXZlIHRvIGxpdmUgd2l0aCBwb3Rl
bnRpYWwgd2hpdGUgaGFsb3MuIFRoaXMgaXMgdXNlZCBmb3IKKyAgICAgICAgLy8gZm9ybSBjb250
cm9sIGRyYXdpbmcsIGZvciBleGFtcGxlLgorICAgICAgICBXaGl0ZUxheWVyLAorICAgIH07CisK
KyAgICBlbnVtIFRyYW5zZm9ybU1vZGUgeworICAgICAgICAvLyBUaGVyZSBhcmUgbm8gY2hhbmdl
cyB0byB0aGUgdHJhbnNmb3JtLiBVc2UgdGhpcyB3aGVuIGRyYXdpbmcKKyAgICAgICAgLy8gaG9y
aXpvbnRhbCB0ZXh0LiBUaGUgY3VycmVudCB0cmFuc2Zvcm0gbXVzdCBub3QgaGF2ZSByb3RhdGlv
bi4KKyAgICAgICAgS2VlcFRyYW5zZm9ybSwKKworICAgICAgICAvLyBEcmF3aW5nIGhhcHBlbnMg
aW4gYW4gVW50cmFuc2Zvcm1lZCBzcGFjZSwgYW5kIHRoZW4gdGhhdCBiaXRtYXAgaXMKKyAgICAg
ICAgLy8gdHJhbnNmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGNvbnRleHQgd2hlbiBp
dCBpcyBjb3BpZWQgZG93bi4KKyAgICAgICAgLy8gUmVxdWlyZXMgdGhhdCBhIGxheWVyIGJlIGNy
ZWF0ZWQgKGxheWVyIG1vZGUgaXMgbm90IE5vTGF5ZXIpLgorICAgICAgICBVbnRyYW5zZm9ybSwK
KworICAgICAgICAvLyBXaGVuIHRoZSBjdXJyZW50IHRyYW5zZm9ybSBvbmx5IGhhcyBhIHNjYWxp
bmcgZmFjdG9yIGFwcGxpZWQgYW5kCisgICAgICAgIC8vIHlvdSdyZSBkcmF3aW5nIGZvcm0gZWxl
bWVudHMsIHVzZSB0aGlzIHBhcmFtZXRlci4gVGhpcyB3aWxsIHVuc2NhbGUKKyAgICAgICAgLy8g
dGhlIGNvb3JkaW5hdGUgc3BhY2UsIHNvIHRoZSBPUyB3aWxsIGp1c3QgZHJhdyB0aGUgZm9ybSBj
b250cm9scworICAgICAgICAvLyBsYXJnZXIgb3Igc21hbGxlciBkZXBlbmRpbmcgb24gdGhlIGRl
c3RpbmF0aW9uIHNpemUuCisgICAgICAgIFNjYWxlVHJhbnNmb3JtLAorICAgIH07CisKKyAgICAv
LyBZb3UgTVVTVCBjYWxsIGluaXQoKSBiZWxvdy4KKyAgICAvLyB8cmVnaW9ufCBpcyBleHByZXNz
ZWQgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgdHJhbnNmb3JtYXRpb24uCisgICAgVHJhbnNwYXJl
bmN5V2luKCk7CisgICAgflRyYW5zcGFyZW5jeVdpbigpOworCisgICAgLy8gSW5pdGlhbGl6ZXMg
dGhlIG1lbWJlcnMgaWYgeW91IHVzZSB0aGUgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4gRG9uJ3Qg
Y2FsbAorICAgIC8vIHRoaXMgaWYgeW91IHVzZSB0aGUgbXVsdGlwbGUtYXJndW1lbnQgY29uc3Ry
dWN0b3IuCisgICAgdm9pZCBpbml0KEdyYXBoaWNzQ29udGV4dCogZGVzdCwKKyAgICAgICAgICAg
ICAgTGF5ZXJNb2RlIGxheWVyTW9kZSwKKyAgICAgICAgICAgICAgVHJhbnNmb3JtTW9kZSB0cmFu
c2Zvcm1Nb2RlLAorICAgICAgICAgICAgICBjb25zdCBJbnRSZWN0JiByZWdpb24pOworCisgICAg
Ly8gUmV0dXJucyB0aGUgY29udGV4dCBmb3IgZHJhd2luZyBpbnRvLCB3aGljaCBtYXkgYmUgdGhl
IGRlc3RpbmF0aW9uCisgICAgLy8gY29udGV4dCwgb3IgYSB0ZW1wb3Jhcnkgb25lLgorICAgIEdy
YXBoaWNzQ29udGV4dCogY29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fZHJhd0NvbnRleHQ7IH0K
KworICAgIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiBwbGF0Zm9ybUNvbnRleHQoKSBjb25zdCB7
IHJldHVybiBtX2RyYXdDb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsgfQorCisgICAgLy8gV2hl
biB0aGUgbW9kZSBpcyBUZXh0Q29tcG9zaXRlLCB0aGlzIHNldHMgdGhlIGNvbG9yIHRoYXQgdGhl
IHRleHQgd2lsbAorICAgIC8vIGdldC4gU2VlIHRoZSBlbnVtIGFib3ZlIGZvciBtb3JlLgorICAg
IHZvaWQgc2V0VGV4dENvbXBvc2l0ZUNvbG9yKENvbG9yIGNvbG9yKTsKKworICAgIC8vIFJldHVy
bnMgdGhlIGlucHV0IGJvdW5kcyB0cmFuc2xhdGVkIGludG8gdGhlIGRlc3RpbmF0aW9uIHNwYWNl
LiBUaGlzIGlzCisgICAgLy8gbm90IG5lY2Vzc2FyeSBmb3IgS2VlcFRyYW5zZm9ybSBzaW5jZSB0
aGUgcmVjdGFuZ2xlIHdpbGwgYmUgdW5jaGFuZ2VkLgorICAgIGNvbnN0IEludFJlY3QmIGRyYXdS
ZWN0KCkgeyByZXR1cm4gbV9kcmF3UmVjdDsgfQorCitwcml2YXRlOgorICAgIGZyaWVuZCBUcmFu
c3BhcmVuY3lXaW5fTm9MYXllcl9UZXN0OworICAgIGZyaWVuZCBUcmFuc3BhcmVuY3lXaW5fV2hp
dGVMYXllcl9UZXN0OworICAgIGZyaWVuZCBUcmFuc3BhcmVuY3lXaW5fVGV4dENvbXBvc2l0ZV9U
ZXN0OworICAgIGZyaWVuZCBUcmFuc3BhcmVuY3lXaW5fT3BhcXVlQ29tcG9zaXRlTGF5ZXJfVGVz
dDsKKworICAgIHZvaWQgc2V0dXBMYXllcihjb25zdCBJbnRSZWN0JiByZWdpb24pOworICAgIHZv
aWQgc2V0dXBUcmFuc2Zvcm0oY29uc3QgSW50UmVjdCYgcmVnaW9uKTsKKworICAgIHZvaWQgaW5p
dGlhbGl6ZU5ld0NvbnRleHQoKTsKKworICAgIHZvaWQgY29tcG9zaXRlT3BhcXVlQ29tcG9zaXRl
KCk7CisgICAgdm9pZCBjb21wb3NpdGVUZXh0Q29tcG9zaXRlKCk7CisKKyAgICAvLyBGaXhlcyB0
aGUgYWxwaGEgY2hhbm5lbCB0byBtYWtlIHRoZSByZWdpb24gaW5zaWRlIG1fdHJhbnNmb3JtZWRS
ZWN0CisgICAgLy8gb3BhcXVlLgorICAgIHZvaWQgbWFrZUxheWVyT3BhcXVlKCk7CisKKyAgICAv
LyBUaGUgY29udGV4dCBvdXIgZHJhd2luZyB3aWxsIGV2ZW50dWFsbHkgZW5kIHVwIGluLgorICAg
IEdyYXBoaWNzQ29udGV4dCogbV9kZXN0Q29udGV4dDsKKworICAgIC8vIFRoZSBvcmlnaW5hbCB0
cmFuc2Zvcm0gZnJvbSB0aGUgZGVzdGluYXRpb24gY29udGV4dC4KKyAgICBUcmFuc2Zvcm1hdGlv
bk1hdHJpeCBtX29yZ1RyYW5zZm9ybTsKKworICAgIExheWVyTW9kZSBtX2xheWVyTW9kZTsKKyAg
ICBUcmFuc2Zvcm1Nb2RlIG1fdHJhbnNmb3JtTW9kZTsKKworICAgIC8vIFRoZSByZWN0YW5nbGUg
d2UncmUgZHJhd2luZyBpbiB0aGUgZGVzdGluYXRpb24ncyBjb29yZGluYXRlIHNwYWNlCisgICAg
SW50UmVjdCBtX3NvdXJjZVJlY3Q7CisKKyAgICAvLyBUaGUgc291cmNlIHJlY3RhbmdsZSB0cmFu
c2Zvcm1lZCBpbnRvIHBpeGVscyBpbiB0aGUgZmluYWwgaW1hZ2UuIEZvcgorICAgIC8vIFVudHJh
bnNmb3JtIHRoaXMgaGFzIG5vIG1lYW5pbmcsIHNpbmNlIHRoZSBkZXN0aW5hdGlvbiBtaWdodCBu
b3QgYmUgYQorICAgIC8vIHJlY3RhbmdsZS4KKyAgICBJbnRSZWN0IG1fdHJhbnNmb3JtZWRTb3Vy
Y2VSZWN0OworCisgICAgLy8gVGhlIHNpemUgb2YgdGhlIGxheWVyIHdlIGNyZWF0ZWQuIElmIHRo
ZXJlJ3Mgbm8gbGF5ZXIsIHRoaXMgaXMgdGhlIHNpemUKKyAgICAvLyBvZiB0aGUgcmVnaW9uIHdl
J3JlIHVzaW5nIGluIHRoZSBzb3VyY2UuCisgICAgSW50U2l6ZSBtX2xheWVyU2l6ZTsKKworICAg
IC8vIFRoZSByZWN0YW5nbGUgd2UncmUgZHJhd2luZyB0byBpbiB0aGUgZHJhdyBjb250ZXh0J3Mg
Y29vcmRpbmF0ZSBzcGFjZS4KKyAgICAvLyBUaGlzIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIHNv
dXJjZSByZWN0YW5nbGUgZXhjZXB0IGZvciBTY2FsZVRyYW5zZm9ybQorICAgIC8vIHdoZXJlIHdl
IGNyZWF0ZSBhIG5ldyB2aXJ0dWFsIGNvb3JkaW5hdGUgc3BhY2UgZm9yIHRoZSBsYXllci4KKyAg
ICBJbnRSZWN0IG1fZHJhd1JlY3Q7CisKKyAgICAvLyBQb2ludHMgdG8gdGhlIGdyYXBoaWNzIGNv
bnRleHQgdG8gZHJhdyB0ZXh0IHRvLCB3aGljaCB3aWxsIGVpdGhlciBiZQorICAgIC8vIHRoZSBv
cmlnaW5hbCBjb250ZXh0IG9yIHRoZSBjb3B5LCBkZXBlbmRpbmcgb24gb3VyIG1vZGUuCisgICAg
R3JhcGhpY3NDb250ZXh0KiBtX2RyYXdDb250ZXh0OworCisgICAgLy8gVGhpcyBmbGFnIGlzIHNl
dCB3aGVuIHdlIGNhbGwgc2F2ZSgpIG9uIHRoZSBkcmF3IGNvbnRleHQgZHVyaW5nCisgICAgLy8g
aW5pdGlhbGl6YXRpb24uIEl0IGFsbG93cyB1cyB0byBhdm9pZCBkb2luZyBhbiBleHRyYSBzYXZl
KCkvcmVzdG9yZSgpCisgICAgLy8gd2hlbiBvbmUgaXMgdW5uZWNlc3NhcnkuCisgICAgYm9vbCBt
X3NhdmVkT25EcmF3Q29udGV4dDsKKworICAgIC8vIFVzZWQgb25seSB3aGVuIG1fbW9kZSA9IFRl
eHRDb21wb3NpdGUsIHRoaXMgaXMgdGhlIGNvbG9yIHRoYXQgdGhlIHRleHQKKyAgICAvLyB3aWxs
IGVuZCB1cCBiZWluZyBvbmNlIHdlIGZpZ3VyZSBvdXQgdGhlIHRyYW5zcGFyZW5jeS4KKyAgICBD
b2xvciBtX3RleHRDb21wb3NpdGVDb2xvcjsKKworICAgIC8vIExheWVyIHdlJ3JlIGRyYXdpbmcg
dG8uCisgICAgSW1hZ2VCdWZmZXIqIG1fbGF5ZXJCdWZmZXI7CisKKyAgICAvLyBXaGVuIHRoZSBs
YXllciB0eXBlIGlzIE9wYXF1ZUNvbXBvc2l0ZUxheWVyLCB0aGlzIHdpbGwgY29udGFpbiBhIGNv
cHkKKyAgICAvLyBvZiB0aGUgb3JpZ2luYWwgY29udGVudHMgb2YgdGhlIG1fbGF5ZXJCdWZmZXIg
YmVmb3JlIFdpbmRvd3MgZHJldyBvbiBpdC4KKyAgICAvLyBJdCBhbGxvd3MgdXMgdG8gcmUtY3Jl
YXRlIHdoYXQgV2luZG93cyBkaWQgdG8gdGhlIGxheWVyLiBJdCBpcyBhbgorICAgIC8vIFNrQml0
bWFwIGluc3RlYWQgb2YgYW4gSW1hZ2VCdWZmZXIgYmVjYXVzZSBhbiBTa0JpdG1hcCBpcyBsaWdo
dGVyLXdlaWdodAorICAgIC8vIChJbWFnZUJ1ZmZlcnMgYXJlIGFsc28gR0RJIHN1cmZhY2VzLCB3
aGljaCB3ZSBkb24ndCBuZWVkIGhlcmUpLgorICAgIFNrQml0bWFwKiBtX3JlZmVyZW5jZUJpdG1h
cDsKKworICAgIC8vIERvbid0IGFjY2VzcyBkaXJlY3RseS4gSWYgYSBidWZmZXIgd2FzIHRvbyBi
aWcgdG8gYmUgY2FjaGVkLCBpdCB3aWxsIGJlCisgICAgLy8gY3JlYXRlZCB0ZW1wb3JhcmlseSwg
YW5kIHRoaXMgbWVtYmVyIHRyYWNrcyBpdHMgc2NvcGUgdG8gbWFrZSBzdXJlIGl0CisgICAgLy8g
Z2V0cyBkZWxldGVkLiBBbHdheXMgdXNlIG1fbGF5ZXJCdWZmZXIsIHdoaWNoIHdpbGwgZWl0aGVy
IHBvaW50IHRvIHRoaXMKKyAgICAvLyBvYmplY3QsIG9yIHRoZSBzdGF0aWNhbGx5IGNhY2hlZCBv
bmUuCisgICAgT3duUHRyPEltYWdlQnVmZmVyPiBtX293bmVkQnVmZmVyOworICAgIE93blB0cjxT
a0JpdG1hcD4gbV9vd25lZFJlZmVyZW5jZUJ1ZmZlcjsKK307CisKK30gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKKworI2VuZGlmIC8vIFRyYW5zYXByZW5jeVdpbl9oCmRpZmYgLS1naXQgYS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NDb250ZXh0U2tpYS5jcHAgYi9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NDb250ZXh0U2tpYS5jcHAKaW5kZXggMzRl
NGExMS4uYjEyODU5OSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lh
L0dyYXBoaWNzQ29udGV4dFNraWEuY3BwCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
c2tpYS9HcmFwaGljc0NvbnRleHRTa2lhLmNwcApAQCAtMjc1LDExICsyNzUsNiBAQCB2b2lkIEdy
YXBoaWNzQ29udGV4dDo6ZW5kVHJhbnNwYXJlbmN5TGF5ZXIoKQogewogICAgIGlmIChwYWludGlu
Z0Rpc2FibGVkKCkpCiAgICAgICAgIHJldHVybjsKLQotI2lmIFBMQVRGT1JNKFdJTl9PUykKLSAg
ICBwbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCktPmdldFRvcFBsYXRmb3JtRGV2aWNlKCkuCi0g
ICAgICAgIGZpeHVwQWxwaGFCZWZvcmVDb21wb3NpdGluZygpOwotI2VuZGlmCiAgICAgcGxhdGZv
cm1Db250ZXh0KCktPmNhbnZhcygpLT5yZXN0b3JlKCk7CiB9CiAKZGlmZiAtLWdpdCBhL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZVNraWEuY3BwIGIvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9za2lhL0ltYWdlU2tpYS5jcHAKaW5kZXggMTEyM2ZlOS4uMzUyMGU4ZCAxMDA2
NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ltYWdlU2tpYS5jcHAKKysr
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ltYWdlU2tpYS5jcHAKQEAgLTIyNSw2
ICsyMjUsNyBAQCBzdGF0aWMgdm9pZCBwYWludFNrQml0bWFwKFBsYXRmb3JtQ29udGV4dFNraWEq
IHBsYXRmb3JtQ29udGV4dCwgY29uc3QgTmF0aXZlSW1hZwogewogICAgIFNrUGFpbnQgcGFpbnQ7
CiAgICAgcGFpbnQuc2V0UG9ydGVyRHVmZlhmZXJtb2RlKGNvbXBPcCk7CisgICAgcGFpbnQuc2V0
RmlsdGVyQml0bWFwKHRydWUpOwogCiAgICAgc2tpYTo6UGxhdGZvcm1DYW52YXMqIGNhbnZhcyA9
IHBsYXRmb3JtQ29udGV4dC0+Y2FudmFzKCk7CiAKQEAgLTIzMyw3ICsyMzQsNiBAQCBzdGF0aWMg
dm9pZCBwYWludFNrQml0bWFwKFBsYXRmb3JtQ29udGV4dFNraWEqIHBsYXRmb3JtQ29udGV4dCwg
Y29uc3QgTmF0aXZlSW1hZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tTY2FsYXJU
b0Zsb2F0KGRlc3RSZWN0LndpZHRoKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
U2tTY2FsYXJUb0Zsb2F0KGRlc3RSZWN0LmhlaWdodCgpKSk7CiAgICAgaWYgKHJlc2FtcGxpbmcg
PT0gUkVTQU1QTEVfQVdFU09NRSkgewotICAgICAgICBwYWludC5zZXRGaWx0ZXJCaXRtYXAoZmFs
c2UpOwogICAgICAgICBkcmF3UmVzYW1wbGVkQml0bWFwKCpjYW52YXMsIHBhaW50LCBiaXRtYXAs
IHNyY1JlY3QsIGRlc3RSZWN0KTsKICAgICB9IGVsc2UgewogICAgICAgICAvLyBObyByZXNhbXBs
aW5nIG5lY2Vzc2FyeSwgd2UgY2FuIGp1c3QgZHJhdyB0aGUgYml0bWFwLiBXZSB3YW50IHRvCkBA
IC0yNDEsNyArMjQxLDYgQEAgc3RhdGljIHZvaWQgcGFpbnRTa0JpdG1hcChQbGF0Zm9ybUNvbnRl
eHRTa2lhKiBwbGF0Zm9ybUNvbnRleHQsIGNvbnN0IE5hdGl2ZUltYWcKICAgICAgICAgLy8gaXMg
c29tZXRoaW5nIGludGVyZXN0aW5nIGdvaW5nIG9uIHdpdGggdGhlIG1hdHJpeCAobGlrZSBhIHJv
dGF0aW9uKS4KICAgICAgICAgLy8gTm90ZTogZm9yIHNlcmlhbGl6YXRpb24sIHdlIHdpbGwgd2Fu
dCB0byBzdWJzZXQgdGhlIGJpdG1hcCBmaXJzdCBzbwogICAgICAgICAvLyB3ZSBkb24ndCBzZW5k
IGV4dHJhIHBpeGVscy4KLSAgICAgICAgcGFpbnQuc2V0RmlsdGVyQml0bWFwKHJlc2FtcGxpbmcg
PT0gUkVTQU1QTEVfTElORUFSKTsKICAgICAgICAgY2FudmFzLT5kcmF3Qml0bWFwUmVjdChiaXRt
YXAsICZzcmNSZWN0LCBkZXN0UmVjdCwgJnBhaW50KTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9X
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZUNocm9taXVtV2luLmNwcCBiL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlclRoZW1lQ2hyb21pdW1XaW4uY3BwCmluZGV4IDllNTlhYzkuLjdkZDQ0MTMg
MTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lQ2hyb21pdW1XaW4uY3Bw
CisrKyBiL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lQ2hyb21pdW1XaW4uY3BwCkBAIC0z
OCw3ICszOCw3IEBACiAjaW5jbHVkZSAiUmVuZGVyQm94LmgiCiAjaW5jbHVkZSAiU2Nyb2xsYmFy
VGhlbWUuaCIKICNpbmNsdWRlICJTa2lhVXRpbHMuaCIKLSNpbmNsdWRlICJUaGVtZUhlbHBlckNo
cm9taXVtV2luLmgiCisjaW5jbHVkZSAiVHJhbnNwYXJlbmN5V2luLmgiCiAjaW5jbHVkZSAiVXNl
ckFnZW50U3R5bGVTaGVldHMuaCIKICNpbmNsdWRlICJXaW5kb3dzVmVyc2lvbi5oIgogCkBAIC01
Myw2ICs1Myw0MyBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKK25hbWVzcGFjZSB7CisKK2Jv
b2wgY2FudmFzSGFzTXVsdGlwbGVMYXllcnMoY29uc3QgU2tDYW52YXMqIGNhbnZhcykKK3sKKyAg
ICBTa0NhbnZhczo6TGF5ZXJJdGVyIGl0ZXIoY29uc3RfY2FzdDxTa0NhbnZhcyo+KGNhbnZhcyks
IGZhbHNlKTsKKyAgICBpdGVyLm5leHQoKTsgIC8vIFRoZXJlIGlzIGFsd2F5cyBhdCBsZWFzdCBv
bmUgbGF5ZXIuCisgICAgcmV0dXJuICFpdGVyLmRvbmUoKTsgIC8vIFRoZXJlIGlzID4gMSBsYXll
ciBpZiB0aGUgdGhlIGl0ZXJhdG9yIGNhbiBzdGlsIGFkdmFuY2UuCit9CisKK2NsYXNzIFRoZW1l
UGFpbnRlciA6IHB1YmxpYyBUcmFuc3BhcmVuY3lXaW4geworcHVibGljOgorICAgIFRoZW1lUGFp
bnRlcihHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEludFJlY3QmIHIpIHsKKyAgICAg
ICAgLy8gQ29tcHV0ZSB0aGUgdHJhbnNmb3JtIG1vZGUuCisgICAgICAgIFRyYW5zZm9ybU1vZGUg
dHJhbnNmb3JtTW9kZTsKKyAgICAgICAgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIG1hdHJp
eCA9IGNvbnRleHQtPmdldENUTSgpOworICAgICAgICBpZiAobWF0cml4LmIoKSAhPSAwIHx8IG1h
dHJpeC5jKCkgIT0gMCkgIC8vIFNrZXcuCisgICAgICAgICAgICB0cmFuc2Zvcm1Nb2RlID0gVW50
cmFuc2Zvcm07CisgICAgICAgIGVsc2UgaWYgKG1hdHJpeC5hKCkgIT0gMS4wIHx8IG1hdHJpeC5k
KCkgIT0gMS4wKSAgLy8gU2NhbGUuCisgICAgICAgICAgICB0cmFuc2Zvcm1Nb2RlID0gU2NhbGVU
cmFuc2Zvcm07CisgICAgICAgIGVsc2UgIC8vIE5vdGhpbmcgaW50ZXJlc3RpbmcuCisgICAgICAg
ICAgICB0cmFuc2Zvcm1Nb2RlID0gS2VlcFRyYW5zZm9ybTsKKworICAgICAgICAvLyBDb21wdXRl
IHRoZSBsYXllciBtb2RlLgorICAgICAgICBMYXllck1vZGUgbGF5ZXJNb2RlOworICAgICAgICBp
ZiAoY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCktPmlzRHJhd2luZ1RvSW1hZ2VCdWZmZXIoKSkg
IC8vIE1pZ2h0IGhhdmUgdHJhbnNwYXJlbnQgYmFja2dyb3VuZC4KKyAgICAgICAgICAgIGxheWVy
TW9kZSA9IFdoaXRlTGF5ZXI7CisgICAgICAgIGVsc2UgaWYgKGNhbnZhc0hhc011bHRpcGxlTGF5
ZXJzKGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKSkpICAvLyBOZWVkcyBhbnRp
YWxpYXNpbmcgaGVscC4KKyAgICAgICAgICAgIGxheWVyTW9kZSA9IE9wYXF1ZUNvbXBvc2l0ZUxh
eWVyOworICAgICAgICBlbHNlICAvLyBOb3RoaW5nIGludGVyZXN0aW5nLgorICAgICAgICAgICAg
bGF5ZXJNb2RlID0gdHJhbnNmb3JtTW9kZSA9PSBLZWVwVHJhbnNmb3JtID8gTm9MYXllciA6IE9w
YXF1ZUNvbXBvc2l0ZUxheWVyOworCisgICAgICAgIGluaXQoY29udGV4dCwgbGF5ZXJNb2RlLCB0
cmFuc2Zvcm1Nb2RlLCByKTsKKyAgICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKwogc3RhdGlj
IHZvaWQgZ2V0Tm9uQ2xpZW50TWV0cmljcyhOT05DTElFTlRNRVRSSUNTKiBtZXRyaWNzKSB7CiAg
ICAgc3RhdGljIFVJTlQgc2l6ZSA9IFdlYkNvcmU6OmlzVmlzdGFPck5ld2VyKCkgPwogICAgICAg
ICBzaXplb2YoTk9OQ0xJRU5UTUVUUklDUykgOiBOT05DTElFTlRNRVRSSUNTX1NJWkVfUFJFX1ZJ
U1RBOwpAQCAtMzczLDEyICs0MTAsMTIgQEAgYm9vbCBSZW5kZXJUaGVtZUNocm9taXVtV2luOjpw
YWludEJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGEKIHsKICAg
ICBjb25zdCBUaGVtZURhdGEmIHRoZW1lRGF0YSA9IGdldFRoZW1lRGF0YShvKTsKIAotICAgIFdl
YkNvcmU6OlRoZW1lSGVscGVyV2luIGhlbHBlcihpLmNvbnRleHQsIHIpOwotICAgIENocm9taXVt
QnJpZGdlOjpwYWludEJ1dHRvbihoZWxwZXIuY29udGV4dCgpLAorICAgIFdlYkNvcmU6OlRoZW1l
UGFpbnRlciBwYWludGVyKGkuY29udGV4dCwgcik7CisgICAgQ2hyb21pdW1CcmlkZ2U6OnBhaW50
QnV0dG9uKHBhaW50ZXIuY29udGV4dCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB0aGVtZURhdGEubV9wYXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVt
ZURhdGEubV9zdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWVEYXRh
Lm1fY2xhc3NpY1N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZXIu
cmVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnRlci5kcmF3UmVj
dCgpKTsKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTQ0MSwxMiArNDc4LDEyIEBAIGJvb2wg
UmVuZGVyVGhlbWVDaHJvbWl1bVdpbjo6cGFpbnRNZW51TGlzdChSZW5kZXJPYmplY3QqIG8sIGNv
bnN0IFJlbmRlck9iamVjdDo6CiAgICAgICAgICAgICAgICAgIHIuaGVpZ2h0KCkgLSAoc3BhY2lu
Z1RvcCArIHNwYWNpbmdCb3R0b20pKTsKIAogICAgIC8vIEdldCB0aGUgY29ycmVjdCB0aGVtZSBk
YXRhIGZvciBhIHRleHRmaWVsZCBhbmQgcGFpbnQgdGhlIG1lbnUuCi0gICAgV2ViQ29yZTo6VGhl
bWVIZWxwZXJXaW4gaGVscGVyKGkuY29udGV4dCwgcmVjdCk7Ci0gICAgQ2hyb21pdW1CcmlkZ2U6
OnBhaW50TWVudUxpc3QoaGVscGVyLmNvbnRleHQoKSwKKyAgICBXZWJDb3JlOjpUaGVtZVBhaW50
ZXIgcGFpbnRlcihpLmNvbnRleHQsIHJlY3QpOworICAgIENocm9taXVtQnJpZGdlOjpwYWludE1l
bnVMaXN0KHBhaW50ZXIuY29udGV4dCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIENQX0RST1BET1dOQlVUVE9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGRldGVybWluZVN0YXRlKG8pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRl
dGVybWluZUNsYXNzaWNTdGF0ZShvKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBoZWxwZXIucmVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWlu
dGVyLmRyYXdSZWN0KCkpOwogICAgIHJldHVybiBmYWxzZTsKIH0KIApAQCAtNTYzLDkgKzYwMCw5
IEBAIFRoZW1lRGF0YSBSZW5kZXJUaGVtZUNocm9taXVtV2luOjpnZXRUaGVtZURhdGEoUmVuZGVy
T2JqZWN0KiBvKQogfQogCiBib29sIFJlbmRlclRoZW1lQ2hyb21pdW1XaW46OnBhaW50VGV4dEZp
ZWxkSW50ZXJuYWwoUmVuZGVyT2JqZWN0KiBvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgaSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW50UmVjdCYgciwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkcmF3RWRn
ZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIGksCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW50UmVjdCYgciwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRyYXdFZGdl
cykKIHsKICAgICAvLyBOYXN0eSBoYWNrIHRvIG1ha2UgdXMgbm90IHBhaW50IHRoZSBib3JkZXIg
b24gdGV4dCBmaWVsZHMgd2l0aCBhCiAgICAgLy8gYm9yZGVyLXJhZGl1cy4gV2Via2l0IHBhaW50
cyBlbGVtZW50cyB3aXRoIGJvcmRlci1yYWRpdXMgZm9yIHVzLgpAQCAtNTc3LDEyICs2MTQsMTIg
QEAgYm9vbCBSZW5kZXJUaGVtZUNocm9taXVtV2luOjpwYWludFRleHRGaWVsZEludGVybmFsKFJl
bmRlck9iamVjdCogbywKIAogICAgIGNvbnN0IFRoZW1lRGF0YSYgdGhlbWVEYXRhID0gZ2V0VGhl
bWVEYXRhKG8pOwogCi0gICAgV2ViQ29yZTo6VGhlbWVIZWxwZXJXaW4gaGVscGVyKGkuY29udGV4
dCwgcik7Ci0gICAgQ2hyb21pdW1CcmlkZ2U6OnBhaW50VGV4dEZpZWxkKGhlbHBlci5jb250ZXh0
KCksCisgICAgV2ViQ29yZTo6VGhlbWVQYWludGVyIHBhaW50ZXIoaS5jb250ZXh0LCByKTsKKyAg
ICBDaHJvbWl1bUJyaWRnZTo6cGFpbnRUZXh0RmllbGQocGFpbnRlci5jb250ZXh0KCksCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lRGF0YS5tX3BhcnQsCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lRGF0YS5tX3N0YXRlLAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZURhdGEubV9jbGFzc2ljU3RhdGUsCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBlci5yZWN0KCksCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50ZXIuZHJhd1JlY3QoKSwKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgby0+c3R5bGUoKS0+YmFja2dyb3VuZENvbG9yKCksCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGRyYXdFZGdlcyk7Cg==
</data>
<flag name="review"
          id="13575"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>27982</attachid>
            <date>2009-02-25 14:14:32 -0800</date>
            <delta_ts>2009-02-26 14:13:43 -0800</delta_ts>
            <desc>Patch v2</desc>
            <filename>trans2.diff</filename>
            <type>text/plain</type>
            <size>63889</size>
            <attacher name="Brett Wilson (Google)">brettw</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
YmNmYjcxYS4uZWY0ZjFhZCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMjIgQEAKKzIwMDktMDItMjUgIEJyZXR0IFdpbHNv
biAgPGJyZXR0d0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgRml4IFdpbmRvd3MgdHJhbnNwYXJl
bmN5IGZvciB0aGUgQ2hyb21pdW0gcG9ydC4gSW1wbGVtZW50IGEgaGVscGVyCisgICAgICAgIGNs
YXNzIGZvciBoYW5kbGluZyB0cmFuc3BhcmVuY3kgb24gV2luZG93cy4gSXQgYWxsb3dzIHNlbWl0
cmFuc3BhcmVudAorICAgICAgICBDbGVhclR5cGUgYW5kIHNlbWl0cmFuc3BhcmVudCBmb3JtIGNv
bnRyb2xzIGJ5IG1ha2luZyBuZXcgbGF5ZXJzIGluIHRoZQorICAgICAgICBiYWNrZ3JvdW5kLiAK
KworICAgICAgICBJdCBhbHNvIHJlcGxhY2VzIHRoZSAiVGhlbWVIZWxwZXIiIHdoaWNoIGFsbG93
cyBiZXR0ZXIKKyAgICAgICAgc2NhbGluZyBhbmQgdHJhbnNmb3JtcyBvbiBXaW5kb3dzIGZvcm0g
Y29udHJvbHMuIEluIGFkZGl0aW9uIHRvIHRoZQorICAgICAgICBmdW5jdGlvbmFsaXR5IHRoYXQg
dGhlIFRoZW1lSGVscGVyIGRpZCwgYnV0IGFkZGl0aW9uYWxseSBoYW5kbGVzIHRoZQorICAgICAg
ICBhbnRpYWxpYXNpbmcgcHJvcGVybHkgc28gdGhhdCB0aGUgZm9ybSBjb250cm9scyBhcmVuJ3Qg
Y29tcG9zaXRlZCBvbiBhCisgICAgICAgIHdoaXRlIHNxdWFyZS4KKworICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjQxMDEKKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL0ZvbnRDaHJvbWl1bVdpbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjopOgorICAgICAgICAo
V2ViQ29yZTo6VHJhbnNwYXJlbmN5QXdhcmVGb250UGFpbnRlcjo6VHJhbnNwYXJlbmN5QXdhcmVG
b250UGFpbnRlcjo6VHJhbnNwYXJlbmN5QXdhcmVGb250UGFpbnRlcik6CisgICAgICAgIChXZWJD
b3JlOjpUcmFuc3BhcmVuY3lBd2FyZUZvbnRQYWludGVyOjpUcmFuc3BhcmVuY3lBd2FyZUZvbnRQ
YWludGVyOjppbml0aWFsaXplRm9yR0RJKToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zcGFyZW5j
eUF3YXJlRm9udFBhaW50ZXI6OlRyYW5zcGFyZW5jeUF3YXJlRm9udFBhaW50ZXI6On5UcmFuc3Bh
cmVuY3lBd2FyZUZvbnRQYWludGVyKToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zcGFyZW5jeUF3
YXJlRm9udFBhaW50ZXI6OlRyYW5zcGFyZW5jeUF3YXJlRm9udFBhaW50ZXI6OmRyYXdHbHlwaHMp
OgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZHJhd0dseXBocyk6CisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vVGhlbWVIZWxwZXJDaHJvbWl1bVdpbi5jcHA6CisgICAgICAg
ICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vVGhlbWVIZWxwZXJDaHJvbWl1bVdpbi5oOgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1RyYW5zcGFyZW5jeVdpbi5jcHA6
IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6KToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zcGFy
ZW5jeVdpbjo6T3duZWRCdWZmZXJzOjpPd25lZEJ1ZmZlcnMpOgorICAgICAgICAoV2ViQ29yZTo6
VHJhbnNwYXJlbmN5V2luOjpPd25lZEJ1ZmZlcnM6OmRlc3RCaXRtYXApOgorICAgICAgICAoV2Vi
Q29yZTo6VHJhbnNwYXJlbmN5V2luOjpPd25lZEJ1ZmZlcnM6OnJlZmVyZW5jZUJpdG1hcCk6Cisg
ICAgICAgIChXZWJDb3JlOjpUcmFuc3BhcmVuY3lXaW46Ok93bmVkQnVmZmVyczo6Y2FuSGFuZGxl
U2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpUcmFuc3BhcmVuY3lXaW46OlRyYW5zcGFyZW5jeVdp
bik6CisgICAgICAgIChXZWJDb3JlOjpUcmFuc3BhcmVuY3lXaW46On5UcmFuc3BhcmVuY3lXaW4p
OgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNwYXJlbmN5V2luOjppbml0KToKKyAgICAgICAgKFdl
YkNvcmU6OlRyYW5zcGFyZW5jeVdpbjo6Y29tcHV0ZUxheWVyU2l6ZSk6CisgICAgICAgIChXZWJD
b3JlOjpUcmFuc3BhcmVuY3lXaW46OnNldHVwTGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6VHJh
bnNwYXJlbmN5V2luOjpzZXR1cExheWVyRm9yTm9MYXllcik6CisgICAgICAgIChXZWJDb3JlOjpU
cmFuc3BhcmVuY3lXaW46OnNldHVwTGF5ZXJGb3JPcGFxdWVDb21wb3NpdGVMYXllcik6CisgICAg
ICAgIChXZWJDb3JlOjpUcmFuc3BhcmVuY3lXaW46OnNldHVwTGF5ZXJGb3JUZXh0Q29tcG9zaXRl
KToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zcGFyZW5jeVdpbjo6c2V0dXBMYXllckZvcldoaXRl
TGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNwYXJlbmN5V2luOjpzZXR1cFRyYW5zZm9y
bSk6CisgICAgICAgIChXZWJDb3JlOjpUcmFuc3BhcmVuY3lXaW46OnNldHVwVHJhbnNmb3JtRm9y
S2VlcFRyYW5zZm9ybSk6CisgICAgICAgIChXZWJDb3JlOjpUcmFuc3BhcmVuY3lXaW46OnNldHVw
VHJhbnNmb3JtRm9yVW50cmFuc2Zvcm0pOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNwYXJlbmN5
V2luOjpzZXR1cFRyYW5zZm9ybUZvclNjYWxlVHJhbnNmb3JtKToKKyAgICAgICAgKFdlYkNvcmU6
OlRyYW5zcGFyZW5jeVdpbjo6c2V0VGV4dENvbXBvc2l0ZUNvbG9yKToKKyAgICAgICAgKFdlYkNv
cmU6OlRyYW5zcGFyZW5jeVdpbjo6aW5pdGlhbGl6ZU5ld0NvbnRleHQpOgorICAgICAgICAoV2Vi
Q29yZTo6VHJhbnNwYXJlbmN5V2luOjpjb21wb3NpdGVPcGFxdWVDb21wb3NpdGUpOgorICAgICAg
ICAoV2ViQ29yZTo6VHJhbnNwYXJlbmN5V2luOjpjb21wb3NpdGVUZXh0Q29tcG9zaXRlKToKKyAg
ICAgICAgKFdlYkNvcmU6OlRyYW5zcGFyZW5jeVdpbjo6bWFrZUxheWVyT3BhcXVlKToKKyAgICAg
ICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9UcmFuc3BhcmVuY3lXaW4uaDogQWRkZWQu
CisgICAgICAgIChXZWJDb3JlOjpUcmFuc3BhcmVuY3lXaW46Oik6CisgICAgICAgIChXZWJDb3Jl
OjpUcmFuc3BhcmVuY3lXaW46OmNvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNwYXJl
bmN5V2luOjpwbGF0Zm9ybUNvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNwYXJlbmN5
V2luOjpkcmF3UmVjdCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGlj
c0NvbnRleHRTa2lhLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6ZW5k
VHJhbnNwYXJlbmN5TGF5ZXIpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvSW1h
Z2VTa2lhLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OnBhaW50U2tCaXRtYXApOgorICAgICAgICAq
IHJlbmRlcmluZy9SZW5kZXJUaGVtZUNocm9taXVtV2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
Oik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUNocm9taXVtV2luOjpwYWludEJ1dHRv
bik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUNocm9taXVtV2luOjpwYWludE1lbnVM
aXN0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQ2hyb21pdW1XaW46OnBhaW50VGV4
dEZpZWxkSW50ZXJuYWwpOgorCisyMDA5LTAyLTI1ICBCcmV0dCBXaWxzb24gIDxicmV0dHdAY2hy
b21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIFdBUk5JTkc6IE5PIFRFU1QgQ0FTRVMgQURERUQgT1IgQ0hBTkdFRAorCisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udENocm9taXVtV2luLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6Oik6CisgICAgICAgIChXZWJDb3JlOjpUcmFuc3BhcmVuY3lBd2FyZUZvbnRQYWlu
dGVyOjpUcmFuc3BhcmVuY3lBd2FyZUZvbnRQYWludGVyOjpUcmFuc3BhcmVuY3lBd2FyZUZvbnRQ
YWludGVyKToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zcGFyZW5jeUF3YXJlRm9udFBhaW50ZXI6
OlRyYW5zcGFyZW5jeUF3YXJlRm9udFBhaW50ZXI6OmluaXRpYWxpemVGb3JHREkpOgorICAgICAg
ICAoV2ViQ29yZTo6VHJhbnNwYXJlbmN5QXdhcmVGb250UGFpbnRlcjo6VHJhbnNwYXJlbmN5QXdh
cmVGb250UGFpbnRlcjo6flRyYW5zcGFyZW5jeUF3YXJlRm9udFBhaW50ZXIpOgorICAgICAgICAo
V2ViQ29yZTo6VHJhbnNwYXJlbmN5QXdhcmVGb250UGFpbnRlcjo6VHJhbnNwYXJlbmN5QXdhcmVG
b250UGFpbnRlcjo6ZHJhd0dseXBocyk6CisgICAgICAgIChXZWJDb3JlOjpGb250OjpkcmF3R2x5
cGhzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9UaGVtZUhlbHBlckNo
cm9taXVtV2luLmNwcDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9UaGVt
ZUhlbHBlckNocm9taXVtV2luLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vVHJhbnNwYXJlbmN5V2luLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjopOgorICAg
ICAgICAoV2ViQ29yZTo6VHJhbnNwYXJlbmN5V2luOjpPd25lZEJ1ZmZlcnM6Ok93bmVkQnVmZmVy
cyk6CisgICAgICAgIChXZWJDb3JlOjpUcmFuc3BhcmVuY3lXaW46Ok93bmVkQnVmZmVyczo6ZGVz
dEJpdG1hcCk6CisgICAgICAgIChXZWJDb3JlOjpUcmFuc3BhcmVuY3lXaW46Ok93bmVkQnVmZmVy
czo6cmVmZXJlbmNlQml0bWFwKToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zcGFyZW5jeVdpbjo6
T3duZWRCdWZmZXJzOjpjYW5IYW5kbGVTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zcGFy
ZW5jeVdpbjo6VHJhbnNwYXJlbmN5V2luKToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zcGFyZW5j
eVdpbjo6flRyYW5zcGFyZW5jeVdpbik6CisgICAgICAgIChXZWJDb3JlOjpUcmFuc3BhcmVuY3lX
aW46OmluaXQpOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNwYXJlbmN5V2luOjpjb21wdXRlTGF5
ZXJTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zcGFyZW5jeVdpbjo6c2V0dXBMYXllcik6
CisgICAgICAgIChXZWJDb3JlOjpUcmFuc3BhcmVuY3lXaW46OnNldHVwTGF5ZXJGb3JOb0xheWVy
KToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zcGFyZW5jeVdpbjo6c2V0dXBMYXllckZvck9wYXF1
ZUNvbXBvc2l0ZUxheWVyKToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zcGFyZW5jeVdpbjo6c2V0
dXBMYXllckZvclRleHRDb21wb3NpdGUpOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNwYXJlbmN5
V2luOjpzZXR1cExheWVyRm9yV2hpdGVMYXllcik6CisgICAgICAgIChXZWJDb3JlOjpUcmFuc3Bh
cmVuY3lXaW46OnNldHVwVHJhbnNmb3JtKToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zcGFyZW5j
eVdpbjo6c2V0dXBUcmFuc2Zvcm1Gb3JLZWVwVHJhbnNmb3JtKToKKyAgICAgICAgKFdlYkNvcmU6
OlRyYW5zcGFyZW5jeVdpbjo6c2V0dXBUcmFuc2Zvcm1Gb3JVbnRyYW5zZm9ybSk6CisgICAgICAg
IChXZWJDb3JlOjpUcmFuc3BhcmVuY3lXaW46OnNldHVwVHJhbnNmb3JtRm9yU2NhbGVUcmFuc2Zv
cm0pOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNwYXJlbmN5V2luOjpzZXRUZXh0Q29tcG9zaXRl
Q29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNwYXJlbmN5V2luOjppbml0aWFsaXplTmV3
Q29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpUcmFuc3BhcmVuY3lXaW46OmNvbXBvc2l0ZU9w
YXF1ZUNvbXBvc2l0ZSk6CisgICAgICAgIChXZWJDb3JlOjpUcmFuc3BhcmVuY3lXaW46OmNvbXBv
c2l0ZVRleHRDb21wb3NpdGUpOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNwYXJlbmN5V2luOjpt
YWtlTGF5ZXJPcGFxdWUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1Ry
YW5zcGFyZW5jeVdpbi5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zcGFyZW5jeVdp
bjo6KToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zcGFyZW5jeVdpbjo6Y29udGV4dCk6CisgICAg
ICAgIChXZWJDb3JlOjpUcmFuc3BhcmVuY3lXaW46OnBsYXRmb3JtQ29udGV4dCk6CisgICAgICAg
IChXZWJDb3JlOjpUcmFuc3BhcmVuY3lXaW46OmRyYXdSZWN0KToKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy9za2lhL0dyYXBoaWNzQ29udGV4dFNraWEuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0OjplbmRUcmFuc3BhcmVuY3lMYXllcik6CisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZVNraWEuY3BwOgorICAgICAgICAoV2ViQ29yZTo6cGFp
bnRTa0JpdG1hcCk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlclRoZW1lQ2hyb21pdW1XaW4u
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1l
Q2hyb21pdW1XaW46OnBhaW50QnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1l
Q2hyb21pdW1XaW46OnBhaW50TWVudUxpc3QpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhl
bWVDaHJvbWl1bVdpbjo6cGFpbnRUZXh0RmllbGRJbnRlcm5hbCk6CisKIDIwMDktMDItMjUgIEFk
YW0gVHJlYXQgIDxhZGFtLnRyZWF0QHRvcmNobW9iaWxlLmNvbT4KIAogICAgICAgICBGaXggdGhl
IFF0IGJ1aWxkLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9Gb250Q2hyb21pdW1XaW4uY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9Gb250Q2hyb21pdW1XaW4uY3BwCmluZGV4IGQ1NjI2YTQuLjQzYzA2OGIgMTAwNjQ0Ci0tLSBh
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udENocm9taXVtV2luLmNwcAor
KysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRDaHJvbWl1bVdpbi5j
cHAKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlICJTaW1wbGVGb250RGF0YS5oIgogI2luY2x1
ZGUgIlNraWFGb250V2luLmgiCiAjaW5jbHVkZSAiU2tpYVV0aWxzLmgiCisjaW5jbHVkZSAiVHJh
bnNwYXJlbmN5V2luLmgiCiAjaW5jbHVkZSAiVW5pc2NyaWJlSGVscGVyVGV4dFJ1bi5oIgogCiAj
aW5jbHVkZSAic2tpYS9leHQvcGxhdGZvcm1fY2FudmFzX3dpbi5oIgpAQCAtNDgsNiArNDksMTcx
IEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorbmFtZXNwYWNlIHsKKworYm9vbCBjYW52YXNI
YXNNdWx0aXBsZUxheWVycyhjb25zdCBTa0NhbnZhcyogY2FudmFzKQoreworICAgIFNrQ2FudmFz
OjpMYXllckl0ZXIgaXRlcihjb25zdF9jYXN0PFNrQ2FudmFzKj4oY2FudmFzKSwgZmFsc2UpOwor
ICAgIGl0ZXIubmV4dCgpOyAgLy8gVGhlcmUgaXMgYWx3YXlzIGF0IGxlYXN0IG9uZSBsYXllci4K
KyAgICByZXR1cm4gIWl0ZXIuZG9uZSgpOyAgLy8gVGhlcmUgaXMgPiAxIGxheWVyIGlmIHRoZSB0
aGUgaXRlcmF0b3IgY2FuIHN0aWwgYWR2YW5jZS4KK30KKworLy8gRXN0aW1hdGVzIHRoZSBib3Vu
ZGluZyBib3ggb2YgdGhlIGdpdmVuIHRleHQuIFRoaXMgaXMgY29waWVkIGZyb20KKy8vIEZvbnRD
R1dpbi5jcHAsIGl0IGlzIHBvc3NpYmxlLCBidXQgYSBsb3QgbW9yZSB3b3JrLCB0byBnZXQgdGhl
IHByZWNpZGUKKy8vIGJvdW5kcy4KK0ludFJlY3QgZXN0aW1hdGVUZXh0Qm91bmRzKGNvbnN0IFNp
bXBsZUZvbnREYXRhKiBmb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR2x5
cGhCdWZmZXImIGdseXBoQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZy
b20sIGludCBudW1HbHlwaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbG9h
dFBvaW50JiBwb2ludCkKK3sKKyAgICBpbnQgdG90YWxXaWR0aCA9IDA7CisgICAgZm9yIChpbnQg
aSA9IDA7IGkgPCBudW1HbHlwaHM7IGkrKykKKyAgICAgICAgdG90YWxXaWR0aCArPSBscm91bmRm
KGdseXBoQnVmZmVyLmFkdmFuY2VBdChmcm9tICsgaSkpOworCisgICAgcmV0dXJuIEludFJlY3Qo
cG9pbnQueCgpIC0gKGZvbnQtPmFzY2VudCgpICsgZm9udC0+ZGVzY2VudCgpKSAvIDIsCisgICAg
ICAgICAgICAgICAgICAgcG9pbnQueSgpIC0gZm9udC0+YXNjZW50KCkgLSBmb250LT5saW5lR2Fw
KCksCisgICAgICAgICAgICAgICAgICAgdG90YWxXaWR0aCArIGZvbnQtPmFzY2VudCgpICsgZm9u
dC0+ZGVzY2VudCgpLAorICAgICAgICAgICAgICAgICAgIGZvbnQtPmxpbmVTcGFjaW5nKCkpOyAK
K30KKworY2xhc3MgVHJhbnNwYXJlbmN5QXdhcmVGb250UGFpbnRlciB7CitwdWJsaWM6CisgICAg
VHJhbnNwYXJlbmN5QXdhcmVGb250UGFpbnRlcihHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaW1wbGVGb250RGF0YSogZm9u
dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdseXBoQnVmZmVyJiBn
bHlwaEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcm9tLCBp
bnQgbnVtR2x5cGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxv
YXRQb2ludCYgcG9pbnQpOworICAgIFRyYW5zcGFyZW5jeUF3YXJlRm9udFBhaW50ZXIoR3JhcGhp
Y3NDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29u
c3QgU2ltcGxlRm9udERhdGEqIGZvbnQpOworICAgIH5UcmFuc3BhcmVuY3lBd2FyZUZvbnRQYWlu
dGVyKCk7CisKKyAgICAvLyBEcmF3cyB0aGUgcGFydGlhbCBzdHJpbmcgb2YgZ2x5cGhzLCBzdGFy
dGluZyBhdCB8c3RhcnRBZHZhbmNlfCB0byB0aGUKKyAgICAvLyBsZWZ0IG9mIG1fcG9pbnQuIFdl
IGV4cHJlc3MgaXQgdGhpcyB3YXkgc28gdGhhdCBpZiB3ZSdyZSB1c2luZyB0aGUgU2tpYQorICAg
IC8vIGRyYXdpbmcgcGF0aCB3ZSBjYW4gdXNlIGZsb2F0aW5nLXBvaW50IHBvc2l0aW9uaW5nLCBl
dmVuIHRob3VnaCB3ZSBoYXZlCisgICAgLy8gdG8gdXNlIGludGVnZXIgcG9zaXRpb25pbmcgaW4g
dGhlIEdESSBwYXRoLgorICAgIGJvb2wgZHJhd0dseXBocyhpbnQgbnVtR2x5cGhzLCBjb25zdCBX
T1JEKiBnbHlwaHMsIGNvbnN0IGludCogYWR2YW5jZXMsCisgICAgICAgICAgICAgICAgICAgIGlu
dCBzdGFydEFkdmFuY2UpIGNvbnN0OworCitwcml2YXRlOgorICAgIC8vIENhbGwgd2hlbiB3ZSdy
ZSB1c2luZyBHREkgbW9kZSB0byBpbml0aWFsaXplIHRoZSBUcmFuc3BhcmVuY3lXaW4gdG8gaGVs
cAorICAgIC8vIHVzIGRyYXcgR0RJIHRleHQuCisgICAgdm9pZCBpbml0aWFsaXplRm9yR0RJKGNv
bnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZlciwgaW50IGZyb20sIGludCBudW1HbHlwaHMpOwor
CisgICAgLy8gVXNlIHRoZSBjb250ZXh0IGZyb20gdGhlIHRyYW5zcGFyZW5jeSBoZWxwZXIgd2hl
biBkcmF3aW5nIHdpdGggR0RJLiBJdAorICAgIC8vIG1heSBwb2ludCB0byBhIHRlbXBvcmFyeSBv
bmUuCisgICAgR3JhcGhpY3NDb250ZXh0KiBtX2dyYXBoaWNzQ29udGV4dDsKKyAgICBQbGF0Zm9y
bUdyYXBoaWNzQ29udGV4dCogbV9wbGF0Zm9ybUNvbnRleHQ7CisKKyAgICBjb25zdCBTaW1wbGVG
b250RGF0YSogbV9mb250OworICAgIEZsb2F0UG9pbnQgbV9wb2ludDsKKworICAgIC8vIFNldCB3
aGVuIFdpbmRvd3MgY2FuIGhhbmRsZSB0aGUgdHlwZSBvZiBkcmF3aW5nIHdlJ3JlIGRvaW5nLgor
ICAgIGJvb2wgbV91c2VHREk7CisKKyAgICAvLyBUaGVzZSBtZW1iZXJzIGFyZSB2YWxpZCBvbmx5
IHdoZW4gbV91c2VHREkgaXMgc2V0LgorICAgIEhEQyBtX2hkYzsKKyAgICBIR0RJT0JKIG1fb2xk
Rm9udDsgIC8vIEZvciByZXN0b3JpbmcgdGhlIERDIHRvIGl0cyBvcmlnaW5hbCBzdGF0ZS4KKyAg
ICBUcmFuc3BhcmVuY3lXaW4gbV90cmFuc3BhcmVuY3k7CisgICAgYm9vbCBtX2NyZWF0ZWRUcmFu
c3BhcmVuY3lMYXllcjsgIC8vIFdlIGNyZWF0ZWQgYSBsYXllciB0byBnaXZlIHRoZSBmb250IHNv
bWUgYWxwaGEuCit9OworCitUcmFuc3BhcmVuY3lBd2FyZUZvbnRQYWludGVyOjpUcmFuc3BhcmVu
Y3lBd2FyZUZvbnRQYWludGVyKAorICAgIEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwKKyAgICBj
b25zdCBTaW1wbGVGb250RGF0YSogZm9udCwKKyAgICBjb25zdCBHbHlwaEJ1ZmZlciYgZ2x5cGhC
dWZmZXIsCisgICAgaW50IGZyb20sIGludCBudW1HbHlwaHMsCisgICAgY29uc3QgRmxvYXRQb2lu
dCYgcG9pbnQpCisgICAgOiBtX2dyYXBoaWNzQ29udGV4dChjb250ZXh0KQorICAgICwgbV9wbGF0
Zm9ybUNvbnRleHQoY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCkpCisgICAgLCBtX2ZvbnQoZm9u
dCkKKyAgICAsIG1fcG9pbnQocG9pbnQpCisgICAgLCBtX3VzZUdESSh3aW5kb3dzQ2FuSGFuZGxl
VGV4dERyYXdpbmcoY29udGV4dCkpCisgICAgLCBtX2hkYygwKQorICAgICwgbV9vbGRGb250KDAp
CisgICAgLCBtX2NyZWF0ZWRUcmFuc3BhcmVuY3lMYXllcihmYWxzZSkKK3sKKyAgICBpZiAobV91
c2VHREkpCisgICAgICAgIGluaXRpYWxpemVGb3JHREkoZ2x5cGhCdWZmZXIsIGZyb20sIG51bUds
eXBocyk7Cit9CisKK3ZvaWQgVHJhbnNwYXJlbmN5QXdhcmVGb250UGFpbnRlcjo6aW5pdGlhbGl6
ZUZvckdESShjb25zdCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZmZXIsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyb20sIGludCBudW1HbHlw
aHMpCit7CisgICAgU2tDb2xvciBjb2xvciA9IG1fcGxhdGZvcm1Db250ZXh0LT5lZmZlY3RpdmVG
aWxsQ29sb3IoKTsKKyAgICBpZiAoU2tDb2xvckdldEEoY29sb3IpICE9IDB4RkYpIHsKKyAgICAg
ICAgLy8gV2hlbiB0aGUgZm9udCBoYXMgc29tZSB0cmFuc3BhcmVuY3ksIGFwcGx5IGl0IGJ5IGNy
ZWF0aW5nIGEgbmV3CisgICAgICAgIC8vIHRyYW5zcGFyZW5jeSBsYXllciB3aXRoIHRoYXQgb3Bh
Y2l0eSBhcHBsaWVkLgorICAgICAgICBtX2NyZWF0ZWRUcmFuc3BhcmVuY3lMYXllciA9IHRydWU7
CisgICAgICAgIG1fZ3JhcGhpY3NDb250ZXh0LT5iZWdpblRyYW5zcGFyZW5jeUxheWVyKFNrQ29s
b3JHZXRBKGNvbG9yKSAvIDI1NS4wZik7CisgICAgICAgIC8vIFRoZSBjb2xvciBzaG91bGQgYmUg
b3BhcXVlIG5vdy4KKyAgICAgICAgY29sb3IgPSBTa0NvbG9yU2V0UkdCKFNrQ29sb3JHZXRSKGNv
bG9yKSwgU2tDb2xvckdldEcoY29sb3IpLCBTa0NvbG9yR2V0Qihjb2xvcikpOworICAgIH0KKwor
ICAgIFRyYW5zcGFyZW5jeVdpbjo6TGF5ZXJNb2RlIGxheWVyTW9kZTsKKyAgICBJbnRSZWN0IGxh
eWVyUmVjdDsKKyAgICBpZiAobV9wbGF0Zm9ybUNvbnRleHQtPmlzRHJhd2luZ1RvSW1hZ2VCdWZm
ZXIoKSkgeworICAgICAgICAvLyBBc3N1bWUgaWYgd2UncmUgZHJhd2luZyB0byBhbiBpbWFnZSBi
dWZmZXIgdGhhdCB0aGUgYmFja2dyb3VuZAorICAgICAgICAvLyBpcyBub3Qgb3BhcXVlIGFuZCB3
ZSBoYXZlIHRvIHVuZG8gQ2xlYXJUeXBlLiBXZSBtYXkgd2FudCB0bworICAgICAgICAvLyBlbmhh
bmNlIHRoaXMgdG8gYWN0dWFsbHkgY2hlY2ssIHNpbmNlIGl0IHdpbGwgb2Z0ZW4gYmUgb3BhcXVl
CisgICAgICAgIC8vIGFuZCB3ZSBjb3VsZCBkbyBDbGVhclR5cGUgaW4gdGhhdCBjYXNlLgorICAg
ICAgICBsYXllck1vZGUgPSBUcmFuc3BhcmVuY3lXaW46OlRleHRDb21wb3NpdGU7CisgICAgICAg
IGxheWVyUmVjdCA9IGVzdGltYXRlVGV4dEJvdW5kcyhtX2ZvbnQsIGdseXBoQnVmZmVyLCBmcm9t
LCBudW1HbHlwaHMsIG1fcG9pbnQpOworCisgICAgICAgIC8vIFRoZSB0cmFuc3BhcmVuY3kgaGVs
cGVyIHJlcXVpcmVzIHRoYXQgd2UgZHJhdyB0ZXh0IGluIGJsYWNrIGluCisgICAgICAgIC8vIHRo
aXMgbW9kZSBhbmQgaXQgd2lsbCBhcHBseSB0aGUgY29sb3IuCisgICAgICAgIG1fdHJhbnNwYXJl
bmN5LnNldFRleHRDb21wb3NpdGVDb2xvcihjb2xvcik7CisgICAgICAgIGNvbG9yID0gU2tDb2xv
clNldFJHQigwLCAwLCAwKTsKKyAgICB9IGVsc2UgaWYgKGNhbnZhc0hhc011bHRpcGxlTGF5ZXJz
KG1fcGxhdGZvcm1Db250ZXh0LT5jYW52YXMoKSkpIHsKKyAgICAgICAgLy8gV2hlbiB3ZSdyZSBk
cmF3aW5nIGEgd2ViIHBhZ2UsIHdlIGtub3cgdGhlIGJhY2tncm91bmQgaXMgb3BhcXVlLAorICAg
ICAgICAvLyBidXQgaWYgd2UncmUgZHJhd2luZyB0byBhIGxheWVyLCB3ZSBzdGlsbCBuZWVkIGV4
dHJhIHdvcmsuCisgICAgICAgIGxheWVyTW9kZSA9IFRyYW5zcGFyZW5jeVdpbjo6T3BhcXVlQ29t
cG9zaXRlTGF5ZXI7CisgICAgICAgIGxheWVyUmVjdCA9IGVzdGltYXRlVGV4dEJvdW5kcyhtX2Zv
bnQsIGdseXBoQnVmZmVyLCBmcm9tLCBudW1HbHlwaHMsIG1fcG9pbnQpOworICAgIH0gZWxzZSB7
CisgICAgICAgIC8vIENvbW1vbiBjYXNlIG9mIGRyYXdpbmcgb250byB0aGUgYm90dG9tIGxheWVy
IG9mIGEgd2ViIHBhZ2U6IHdlCisgICAgICAgIC8vIGtub3cgZXZlcnl0aGluZyBpcyBvcGFxdWUg
c28gZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgorICAgICAgICBsYXllck1vZGUg
PSBUcmFuc3BhcmVuY3lXaW46Ok5vTGF5ZXI7CisgICAgfQorICAgIG1fdHJhbnNwYXJlbmN5Lmlu
aXQobV9ncmFwaGljc0NvbnRleHQsIGxheWVyTW9kZSwgVHJhbnNwYXJlbmN5V2luOjpLZWVwVHJh
bnNmb3JtLCBsYXllclJlY3QpOworCisgICAgLy8gU2V0IHVwIHRoZSBEQywgdXNpbmcgdGhlIG9u
ZSBmcm9tIHRoZSB0cmFuc3BhcmVuY3kgaGVscGVyLgorICAgIG1faGRjID0gbV90cmFuc3BhcmVu
Y3kucGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpLT5iZWdpblBsYXRmb3JtUGFpbnQoKTsKKyAg
ICBtX29sZEZvbnQgPSA6OlNlbGVjdE9iamVjdChtX2hkYywgbV9mb250LT5wbGF0Zm9ybURhdGEo
KS5oZm9udCgpKTsKKyAgICBTZXRUZXh0Q29sb3IobV9oZGMsIHNraWE6OlNrQ29sb3JUb0NPTE9S
UkVGKGNvbG9yKSk7CisgICAgU2V0QmtNb2RlKG1faGRjLCBUUkFOU1BBUkVOVCk7Cit9CisKK1Ry
YW5zcGFyZW5jeUF3YXJlRm9udFBhaW50ZXI6On5UcmFuc3BhcmVuY3lBd2FyZUZvbnRQYWludGVy
KCkKK3sKKyAgICBpZiAoIW1fdXNlR0RJKQorICAgICAgICByZXR1cm47ICAvLyBOb3RoaW5nIHRv
IGRvLgorICAgIGlmIChtX2NyZWF0ZWRUcmFuc3BhcmVuY3lMYXllcikKKyAgICAgICAgbV9ncmFw
aGljc0NvbnRleHQtPmVuZFRyYW5zcGFyZW5jeUxheWVyKCk7CisKKyAgICA6OlNlbGVjdE9iamVj
dChtX2hkYywgbV9vbGRGb250KTsKKyAgICBtX3BsYXRmb3JtQ29udGV4dC0+Y2FudmFzKCktPmVu
ZFBsYXRmb3JtUGFpbnQoKTsKK30KKworYm9vbCBUcmFuc3BhcmVuY3lBd2FyZUZvbnRQYWludGVy
OjpkcmF3R2x5cGhzKGludCBudW1HbHlwaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgY29uc3QgV09SRCogZ2x5cGhzLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCogYWR2YW5jZXMsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0QWR2YW5jZSkg
Y29uc3QKK3sKKyAgICBpZiAoIW1fdXNlR0RJKSB7CisgICAgICAgIFNrUG9pbnQgb3JpZ2luID0g
bV9wb2ludDsKKyAgICAgICAgb3JpZ2luLmZYICs9IHN0YXJ0QWR2YW5jZTsKKyAgICAgICAgcmV0
dXJuIHBhaW50U2tpYVRleHQobV9wbGF0Zm9ybUNvbnRleHQsIG1fZm9udC0+cGxhdGZvcm1EYXRh
KCkuaGZvbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtR2x5cGhzLCBnbHlw
aHMsIGFkdmFuY2VzLCAwLCAmb3JpZ2luKTsKKyAgICB9CisKKyAgICAvLyBXaW5kb3dzJyBvcmln
aW4gaXMgdGhlIHRvcC1sZWZ0IG9mIHRoZSBib3VuZGluZyBib3gsIHNvIHdlIGhhdmUKKyAgICAv
LyB0byBzdWJ0cmFjdCBvZmYgdGhlIGZvbnQgYXNjZW50IHRvIGdldCBpdC4KKyAgICBpbnQgeCA9
IGxyb3VuZGYobV9wb2ludC54KCkgKyBzdGFydEFkdmFuY2UpOworICAgIGludCB5ID0gbHJvdW5k
ZihtX3BvaW50LnkoKSAtIG1fZm9udC0+YXNjZW50KCkpOworICAgIHJldHVybiAhIUV4dFRleHRP
dXQobV9oZGMsIHgsIHksIEVUT19HTFlQSF9JTkRFWCwgMCwgcmVpbnRlcnByZXRfY2FzdDxjb25z
dCB3Y2hhcl90Kj4oJmdseXBoc1swXSksIG51bUdseXBocywgJmFkdmFuY2VzWzBdKTsKK30KKwor
fSAgLy8gbmFtZXNwYWNlCisKIHZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQq
IGdyYXBoaWNzQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaW1wbGVGb250
RGF0YSogZm9udCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHbHlwaEJ1ZmZlciYgZ2x5
cGhCdWZmZXIsCkBAIC01NSw2MiArMjIxLDI3IEBAIHZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFw
aGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQg
bnVtR2x5cGhzLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50
KSBjb25zdAogewotICAgIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0ID0gZ3JhcGhp
Y3NDb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKLQotICAgIGJvb2wgY2FuVXNlR0RJID0gd2lu
ZG93c0NhbkhhbmRsZVRleHREcmF3aW5nKGdyYXBoaWNzQ29udGV4dCk7Ci0gICAgYm9vbCBjcmVh
dGVkTGF5ZXIgPSBmYWxzZTsKLQotICAgIGlmIChjYW5Vc2VHREkgJiYgY29udGV4dC0+aXNEcmF3
aW5nVG9JbWFnZUJ1ZmZlcigpKSB7Ci0gICAgICAgIC8vIFdlJ3JlIGRyYXdpbmcgdG8gYW4gaW1h
Z2UgYnVmZmVyIGFuZCBhYm91dCB0byByZW5kZXIgdGV4dCB3aXRoIEdESS4KLSAgICAgICAgLy8g
V2UgbmVlZCB0byBzdGFydCBhIGxheWVyIGhlcmUsIG90aGVyd2lzZSB0aGUgYWxwaGEgdmFsdWVz
IHJlbmRlcmVkCi0gICAgICAgIC8vIGJ5IEdESSBhcmUgbmV2ZXIgY29ycmVjdGx5IHVwZGF0ZWQu
Ci0gICAgICAgIC8vIE5PVEU6IHRoaXMgZG9lc24ndCBoYW5kbGUgY2xlYXIgdHlwZSB3ZWxsIGFu
ZCBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuCi0gICAgICAgIC8vIHdlIGhhdmUgYmV0dGVyIHRleHQg
aGFuZGxpbmcgY29kZS4KLSAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5iZWdpblRyYW5zcGFyZW5j
eUxheWVyKDEuMCk7Ci0gICAgICAgIGNyZWF0ZWRMYXllciA9IHRydWU7Ci0gICAgfQotCi0gICAg
Ly8gTWF4IGJ1ZmZlciBsZW5ndGggcGFzc2VkIHRvIHRoZSB1bmRlcmx5aW5nIHdpbmRvd3MgQVBJ
LgotICAgIGNvbnN0IGludCBrTWF4QnVmZmVyTGVuZ3RoID0gMTAyNDsKLSAgICAvLyBEZWZhdWx0
IHNpemUgZm9yIHRoZSBidWZmZXIuIEl0IHNob3VsZCBiZSBlbm91Z2ggZm9yIG1vc3Qgb2YgY2Fz
ZXMuCi0gICAgY29uc3QgaW50IGtEZWZhdWx0QnVmZmVyTGVuZ3RoID0gMjU2OwotCi0gICAgU2tD
b2xvciBjb2xvciA9IGNvbnRleHQtPmVmZmVjdGl2ZUZpbGxDb2xvcigpOworICAgIFNrQ29sb3Ig
Y29sb3IgPSBncmFwaGljc0NvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5lZmZlY3RpdmVGaWxs
Q29sb3IoKTsKICAgICB1bnNpZ25lZCBjaGFyIGFscGhhID0gU2tDb2xvckdldEEoY29sb3IpOwog
ICAgIC8vIFNraXAgMTAwJSB0cmFuc3BhcmVudCB0ZXh0OyBubyBuZWVkIHRvIGRyYXcgYW55dGhp
bmcuCi0gICAgaWYgKCFhbHBoYSAmJiBjb250ZXh0LT5nZXRTdHJva2VTdHlsZSgpID09IE5vU3Ry
b2tlKQorICAgIGlmICghYWxwaGEgJiYgZ3JhcGhpY3NDb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQo
KS0+Z2V0U3Ryb2tlU3R5bGUoKSA9PSBOb1N0cm9rZSkKICAgICAgICAgcmV0dXJuOwogCi0gICAg
Ly8gU2V0IHVwIG91ciBncmFwaGljcyBjb250ZXh0LgotICAgIEhEQyBoZGMgPSBjb250ZXh0LT5j
YW52YXMoKS0+YmVnaW5QbGF0Zm9ybVBhaW50KCk7Ci0gICAgSEdESU9CSiBvbGRGb250ID0gU2Vs
ZWN0T2JqZWN0KGhkYywgZm9udC0+cGxhdGZvcm1EYXRhKCkuaGZvbnQoKSk7Ci0KLSAgICAvLyBU
T0RPKG1hcnVlbCk6IGh0dHA6Ly9iLzcwMDQ2NCBTZXRUZXh0Q29sb3IgZG9lc24ndCBzdXBwb3J0
IHRyYW5zcGFyZW5jeS4KLSAgICAvLyBFbmZvcmNlIG5vbi10cmFuc3BhcmVudCBjb2xvci4KLSAg
ICBjb2xvciA9IFNrQ29sb3JTZXRSR0IoU2tDb2xvckdldFIoY29sb3IpLCBTa0NvbG9yR2V0Ryhj
b2xvciksIFNrQ29sb3JHZXRCKGNvbG9yKSk7Ci0gICAgU2V0VGV4dENvbG9yKGhkYywgc2tpYTo6
U2tDb2xvclRvQ09MT1JSRUYoY29sb3IpKTsKLSAgICBTZXRCa01vZGUoaGRjLCBUUkFOU1BBUkVO
VCk7Ci0KLSAgICAvLyBXaW5kb3dzIG5lZWRzIHRoZSBjaGFyYWN0ZXJzIGFuZCB0aGUgYWR2YW5j
ZXMgaW4gbmljZSBjb250aWd1b3VzCi0gICAgLy8gYnVmZmVycywgd2hpY2ggd2UgYnVpbGQgaGVy
ZS4KLSAgICBWZWN0b3I8V09SRCwga0RlZmF1bHRCdWZmZXJMZW5ndGg+IGdseXBoczsKLSAgICBW
ZWN0b3I8aW50LCBrRGVmYXVsdEJ1ZmZlckxlbmd0aD4gYWR2YW5jZXM7Ci0KLSAgICAvLyBDb21w
dXRlIHRoZSBjb29yZGluYXRlLiBUaGUgJ29yaWdpbicgcmVwcmVzZW50cyB0aGUgYmFzZWxpbmUs
IHNvIHdlIG5lZWQKLSAgICAvLyB0byBtb3ZlIGl0IHVwIHRvIHRoZSB0b3Agb2YgdGhlIGJvdW5k
aW5nIHNxdWFyZS4KLSAgICBpbnQgeCA9IHN0YXRpY19jYXN0PGludD4ocG9pbnQueCgpKTsKLSAg
ICBpbnQgbGluZVRvcCA9IHN0YXRpY19jYXN0PGludD4ocG9pbnQueSgpKSAtIGZvbnQtPmFzY2Vu
dCgpOworICAgIFRyYW5zcGFyZW5jeUF3YXJlRm9udFBhaW50ZXIgcGFpbnRlcihncmFwaGljc0Nv
bnRleHQsIGZvbnQsIGdseXBoQnVmZmVyLCBmcm9tLCBudW1HbHlwaHMsIHBvaW50KTsKIAogICAg
IC8vIFdlIGRyYXcgdGhlIGdseXBocyBpbiBjaHVua3MgdG8gYXZvaWQgaGF2aW5nIHRvIGRvIGEg
aGVhcCBhbGxvY2F0aW9uIGZvcgogICAgIC8vIHRoZSBhcnJheXMgb2YgY2hhcmFjdGVycyBhbmQg
YWR2YW5jZXMuIFNpbmNlIEV4dFRleHRPdXQgaXMgdGhlCiAgICAgLy8gbG93ZXN0LWxldmVsIHRl
eHQgb3V0cHV0IGZ1bmN0aW9uIG9uIFdpbmRvd3MsIHRoZXJlIHNob3VsZCBiZSBsaXR0bGUKICAg
ICAvLyBwZW5hbHR5IGZvciBzcGxpdHRpbmcgdXAgdGhlIHRleHQuIE9uIHRoZSBvdGhlciBoYW5k
LCB0aGUgYnVmZmVyIGNhbm5vdAogICAgIC8vIGJlIGJpZ2dlciB0aGFuIDQwOTQgb3IgdGhlIGZ1
bmN0aW9uIHdpbGwgZmFpbC4KLSAgICBpbnQgZ2x5cGhJbmRleCA9IDA7CisgICAgY29uc3QgaW50
IGtNYXhCdWZmZXJMZW5ndGggPSAyNTY7CisgICAgVmVjdG9yPFdPUkQsIGtNYXhCdWZmZXJMZW5n
dGg+IGdseXBoczsKKyAgICBWZWN0b3I8aW50LCBrTWF4QnVmZmVyTGVuZ3RoPiBhZHZhbmNlczsK
KyAgICBpbnQgZ2x5cGhJbmRleCA9IDA7ICAvLyBUaGUgc3RhcnRpbmcgZ2x5cGggb2YgdGhlIGN1
cnJlbnQgY2h1bmsuCisgICAgaW50IGN1ckFkdmFuY2UgPSAwOyAgLy8gSG93IGZhciBmcm9tIHRo
ZSBsZWZ0IHRoZSBjdXJyZW50IGNodW5rIGlzLgogICAgIHdoaWxlIChnbHlwaEluZGV4IDwgbnVt
R2x5cGhzKSB7Ci0gICAgICAgIC8vIGhvdyBtYW55IGNoYXJzIHdpbGwgYmUgaW4gdGhpcyBjaHVu
az8KKyAgICAgICAgLy8gSG93IG1hbnkgY2hhcnMgd2lsbCBiZSBpbiB0aGlzIGNodW5rPwogICAg
ICAgICBpbnQgY3VyTGVuID0gc3RkOjptaW4oa01heEJ1ZmZlckxlbmd0aCwgbnVtR2x5cGhzIC0g
Z2x5cGhJbmRleCk7Ci0KICAgICAgICAgZ2x5cGhzLnJlc2l6ZShjdXJMZW4pOwogICAgICAgICBh
ZHZhbmNlcy5yZXNpemUoY3VyTGVuKTsKIApAQCAtMTIxLDIxICsyNTIsMTAgQEAgdm9pZCBGb250
OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3NDb250ZXh0LAogICAgICAgICAg
ICAgY3VyV2lkdGggKz0gYWR2YW5jZXNbaV07CiAgICAgICAgIH0KIAorICAgICAgICAvLyBBY3R1
YWxseSBkcmF3IHRoZSBnbHlwaHMgKHdpdGggcmV0cnkgb24gZmFpbHVyZSkuCiAgICAgICAgIGJv
b2wgc3VjY2VzcyA9IGZhbHNlOwogICAgICAgICBmb3IgKGludCBleGVjdXRpb25zID0gMDsgZXhl
Y3V0aW9ucyA8IDI7ICsrZXhlY3V0aW9ucykgewotICAgICAgICAgICAgaWYgKGNhblVzZUdESSkK
LSAgICAgICAgICAgICAgICBzdWNjZXNzID0gISFFeHRUZXh0T3V0KGhkYywgeCwgbGluZVRvcCwg
RVRPX0dMWVBIX0lOREVYLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRf
Y2FzdDxjb25zdCB3Y2hhcl90Kj4oJmdseXBoc1swXSksCi0gICAgICAgICAgICAgICAgICAgICAg
ICBjdXJMZW4sICZhZHZhbmNlc1swXSk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAg
ICAgICAvLyBTa2lhJ3MgdGV4dCBkcmF3aW5nIG9yaWdpbiBpcyB0aGUgYmFzZWxpbmUsIGxpa2Ug
V2ViS2l0LCBub3QKLSAgICAgICAgICAgICAgICAvLyB0aGUgdG9wLCBsaWtlIFdpbmRvd3MuCi0g
ICAgICAgICAgICAgICAgU2tQb2ludCBvcmlnaW4gPSB7IHgsIHBvaW50LnkoKSB9OwotICAgICAg
ICAgICAgICAgIHN1Y2Nlc3MgPSBwYWludFNraWFUZXh0KGNvbnRleHQsIGZvbnQtPnBsYXRmb3Jt
RGF0YSgpLmhmb250KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1HbHlwaHMsIHJlaW50
ZXJwcmV0X2Nhc3Q8Y29uc3QgV09SRCo+KCZnbHlwaHNbMF0pLAotICAgICAgICAgICAgICAgICAg
ICAgICAgJmFkdmFuY2VzWzBdLCAwLCAmb3JpZ2luKTsKLSAgICAgICAgICAgIH0KLQorICAgICAg
ICAgICAgc3VjY2VzcyA9IHBhaW50ZXIuZHJhd0dseXBocyhjdXJMZW4sICZnbHlwaHNbMF0sICZh
ZHZhbmNlc1swXSwgY3VyQWR2YW5jZSk7CiAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MgJiYgZXhl
Y3V0aW9ucyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gQXNrIHRoZSBicm93c2VyIHRvIGxv
YWQgdGhlIGZvbnQgZm9yIHVzIGFuZCByZXRyeS4KICAgICAgICAgICAgICAgICBDaHJvbWl1bUJy
aWRnZTo6ZW5zdXJlRm9udExvYWRlZChmb250LT5wbGF0Zm9ybURhdGEoKS5oZm9udCgpKTsKQEAg
LTE0NSwxNCArMjY1LDggQEAgdm9pZCBGb250OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCog
Z3JhcGhpY3NDb250ZXh0LAogICAgICAgICB9CiAKICAgICAgICAgQVNTRVJUKHN1Y2Nlc3MpOwot
Ci0gICAgICAgIHggKz0gY3VyV2lkdGg7CisgICAgICAgIGN1ckFkdmFuY2UgKz0gY3VyV2lkdGg7
CiAgICAgfQotCi0gICAgU2VsZWN0T2JqZWN0KGhkYywgb2xkRm9udCk7Ci0gICAgaWYgKGNyZWF0
ZWRMYXllcikKLSAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5lbmRUcmFuc3BhcmVuY3lMYXllcigp
OwotICAgIGNvbnRleHQtPmNhbnZhcygpLT5lbmRQbGF0Zm9ybVBhaW50KCk7CiB9CiAKIEZsb2F0
UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVu
LApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9UaGVtZUhl
bHBlckNocm9taXVtV2luLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
VGhlbWVIZWxwZXJDaHJvbWl1bVdpbi5jcHAKaW5kZXggNzk4ZWUzMi4uZTY5ZGUyOSAxMDA2NDQK
LS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9UaGVtZUhlbHBlckNocm9t
aXVtV2luLmNwcAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1RoZW1l
SGVscGVyQ2hyb21pdW1XaW4uY3BwCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0
IChjKSAyMDA4LCAyMDA5LCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0g
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqIAotICogICAgICogUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3Ry
aWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRo
ZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9y
IHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0g
KiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1Ig
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRl
ICJjb25maWcuaCIKLSNpbmNsdWRlICJUaGVtZUhlbHBlckNocm9taXVtV2luLmgiCi0KLSNpbmNs
dWRlICJGbG9hdFJlY3QuaCIKLSNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKLQotbmFtZXNw
YWNlIFdlYkNvcmUgewotCi1UaGVtZUhlbHBlcldpbjo6VGhlbWVIZWxwZXJXaW4oR3JhcGhpY3ND
b250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0KQotICAgIDogbV9vcmdDb250ZXh0
KGNvbnRleHQpCi0gICAgLCBtX29yZ01hdHJpeChjb250ZXh0LT5nZXRDVE0oKSkKLSAgICAsIG1f
b3JnUmVjdChyZWN0KQotewotICAgIGlmIChtX29yZ01hdHJpeC5iKCkgIT0gMCB8fCBtX29yZ01h
dHJpeC5jKCkgIT0gMCkgeyAgLy8gQ2hlY2sgZm9yIHNrZXcuCi0gICAgICAgIC8vIENvbXBsaWNh
dGVkIGVmZmVjdHMsIG1ha2UgYSBjb3B5IGFuZCBkcmF3IHRoZSBiaXRtYXAgdGhlcmUuCi0gICAg
ICAgIG1fdHlwZSA9IENPUFk7Ci0gICAgICAgIG1fcmVjdC5zZXRTaXplKHJlY3Quc2l6ZSgpKTsK
LQotICAgICAgICBtX25ld0J1ZmZlci5zZXQoSW1hZ2VCdWZmZXI6OmNyZWF0ZShyZWN0LnNpemUo
KSwgZmFsc2UpLnJlbGVhc2UoKSk7Ci0KLSAgICAgICAgLy8gVGhlbWUgZHJhd2luZyBtZXNzZXMg
d2l0aCB0aGUgdHJhbnNwYXJlbmN5LgotICAgICAgICAvLyBGSVhNRTogSWRlYWxseSwgd2Ugd291
bGQgbGVhdmUgdGhpcyB0cmFuc3BhcmVudCwgYnV0IEkgd2FzCi0gICAgICAgIC8vIGhhdmluZyBw
cm9ibGVtcyB3aXRoIGJ1dHRvbiBkcmF3aW5nLCBzbyB3ZSBmaWxsIHdpdGggd2hpdGUuIEJ1dHRv
bnMKLSAgICAgICAgLy8gbG9va2VkIGdvb2Qgd2l0aCB0cmFuc3BhcmVudCBoZXJlIGFuZCBubyBm
aXhpbmcgdXAgb2YgdGhlIGFscGhhCi0gICAgICAgIC8vIGxhdGVyLCBidXQgdGV4dCBhcmVhcyBk
aWRuJ3QuIFRoaXMgbWFrZXMgdGV4dCBhcmVhcyBsb29rIGdvb2QgYnV0Ci0gICAgICAgIC8vIGdp
dmVzIGJ1dHRvbnMgYSB3aGl0ZSBoYWxvLiBJcyB0aGVyZSBhIHdheSB0byBmaXggdGhpcz8gSSB0
aGluawotICAgICAgICAvLyBidXR0b25zIGFjdHVhbGx5IGhhdmUgYW50aWFsaXNlZCBlZGdlcyB3
aGljaCBpcyBqdXN0IG5vdCBwb3NzaWJsZQotICAgICAgICAvLyB0byBoYW5kbGUgb24gYSB0cmFu
c3BhcmVudCBiYWNrZ3JvdW5kIGdpdmVuIHRoYXQgaXQgbWVzc2VzIHdpdGggdGhlCi0gICAgICAg
IC8vIGFscGhhIGNoYW5uZWwuCi0gICAgICAgIEZsb2F0UmVjdCBuZXdDb250ZXh0UmVjdCgwLCAw
LCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOwotICAgICAgICBHcmFwaGljc0NvbnRleHQq
IG5ld0NvbnRleHQgPSBtX25ld0J1ZmZlci0+Y29udGV4dCgpOwotICAgICAgICBuZXdDb250ZXh0
LT5zZXRGaWxsQ29sb3IoQ29sb3I6OndoaXRlKTsKLSAgICAgICAgbmV3Q29udGV4dC0+ZmlsbFJl
Y3QobmV3Q29udGV4dFJlY3QpOwotCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAo
bV9vcmdNYXRyaXguYSgpICE9IDEuMCB8fCBtX29yZ01hdHJpeC5kKCkgIT0gMS4wKSB7ICAvLyBD
aGVjayBmb3Igc2NhbGUuCi0gICAgICAgIC8vIE9ubHkgYSBzY2FsaW5nIGlzIGFwcGxpZWQuCi0g
ICAgICAgIG1fdHlwZSA9IFNDQUxFOwotCi0gICAgICAgIC8vIFNhdmUgdGhlIHRyYW5zZm9ybWVk
IGNvb3JkaW5hdGVzIHRvIGRyYXcuCi0gICAgICAgIG1fcmVjdCA9IG1fb3JnTWF0cml4Lm1hcFJl
Y3QocmVjdCk7Ci0gICAgICAgIAotICAgICAgICBtX29yZ0NvbnRleHQtPnNhdmUoKTsKLSAgICAg
ICAgbV9vcmdDb250ZXh0LT5jb25jYXRDVE0obV9vcmdDb250ZXh0LT5nZXRDVE0oKS5pbnZlcnNl
KCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gTm90aGluZyBpbnRlcmVzdGlu
Zy4KLSAgICBtX3JlY3QgPSByZWN0OwotICAgIG1fdHlwZSA9IE9SSUdJTkFMOwotfQotCi1UaGVt
ZUhlbHBlcldpbjo6flRoZW1lSGVscGVyV2luKCkKLXsKLSAgICBzd2l0Y2ggKG1fdHlwZSkgewot
ICAgIGNhc2UgU0NBTEU6Ci0gICAgICAgIG1fb3JnQ29udGV4dC0+cmVzdG9yZSgpOwotICAgICAg
ICBicmVhazsKLSAgICBjYXNlIENPUFk6IHsKLSAgICAgICAgLy8gQ29weSB0aGUgZHVwbGljYXRl
IGJpdG1hcCB3aXRoIG91ciBjb250cm9sIHRvIHRoZSBvcmlnaW5hbCBjYW52YXMuCi0gICAgICAg
IEZsb2F0UmVjdCBkZXN0UmVjdChtX29yZ1JlY3QpOwotICAgICAgICBtX25ld0J1ZmZlci0+Y29u
dGV4dCgpLT5wbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCktPgotICAgICAgICAgICAgZ2V0VG9w
UGxhdGZvcm1EZXZpY2UoKS5maXh1cEFscGhhQmVmb3JlQ29tcG9zaXRpbmcoKTsKLSAgICAgICAg
bV9vcmdDb250ZXh0LT5kcmF3SW1hZ2UobV9uZXdCdWZmZXItPmltYWdlKCksIGRlc3RSZWN0KTsK
LSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT1JJR0lOQUw6Ci0gICAgICAgIGJyZWFr
OwotICAgIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vVGhlbWVIZWxwZXJDaHJvbWl1bVdpbi5oIGIv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9UaGVtZUhlbHBlckNocm9taXVtV2lu
LmgKaW5kZXggMTc3MWZiNC4uZTY5ZGUyOSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9jaHJvbWl1bS9UaGVtZUhlbHBlckNocm9taXVtV2luLmgKKysrIGIvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9UaGVtZUhlbHBlckNocm9taXVtV2luLmgKQEAgLTEs
OTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSwgR29vZ2xlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJl
Ci0gKiBtZXQ6Ci0gKiAKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5
cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRo
ZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRv
cnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJv
bQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz
c2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hU
IEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgot
ICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIFRoZW1lSGVscGVyV2luX2gKLSNkZWZpbmUgVGhl
bWVIZWxwZXJXaW5faAotCi0jaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKLSNpbmNs
dWRlICJJbWFnZUJ1ZmZlci5oIgotI2luY2x1ZGUgIkludFJlY3QuaCIKLSNpbmNsdWRlIDx3dGYv
T3duUHRyLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotY2xhc3MgR3JhcGhpY3NDb250ZXh0
OwotY2xhc3MgSW50UmVjdDsKLQotLy8gSGVscHMgZHJhd2luZyB0aGVtZSBlbGVtZW50cyBsaWtl
IGJ1dHRvbnMgYW5kIHNjcm9sbCBiYXJzLiBUaGlzIHdpbGwgaGFuZGxlCi0vLyB0cmFuc2xhdGlv
bnMgYW5kIHNjYWxpbmdzIHRoYXQgV2luZG93cyBtaWdodCBub3QsIGJ5IGVpdGhlciBtYWtpbmcg
V2luZG93cwotLy8gZHJhdyB0aGUgYXBwcm9wcmlhdGUgc2l6ZWQgY29udHJvbCwgb3IgYnkgcmVu
ZGVyaW5nIGl0IGludG8gYW4gb2ZmLXNjcmVlbgotLy8gY29udGV4dCBhbmQgdHJhbnNmb3JtaW5n
IGl0IG91cnNlbHZlcy4KLWNsYXNzIFRoZW1lSGVscGVyV2luIHsKLSAgICBlbnVtIFR5cGUgewot
ICAgICAgICAvLyBVc2UgdGhlIG9yaWdpbmFsIGNhbnZhcyB3aXRoIG5vIGNoYW5nZXMuIFRoaXMg
aXMgdGhlIG5vcm1hbCBtb2RlLgotICAgICAgICBPUklHSU5BTCwKLQotICAgICAgICAvLyBVc2Ug
dGhlIG9yaWdpbmFsIGNhbnZhcyBidXQgc2NhbGUgdGhlIHJlY3RhbmdsZSBvZiB0aGUgY29udHJv
bCBzbwotICAgICAgICAvLyB0aGF0IGl0IHdpbGwgYmUgdGhlIGNvcnJlY3Qgc2l6ZSwgdW5kb2lu
ZyBhbnkgc2NhbGUgYWxyZWFkeSBvbiB0aGUKLSAgICAgICAgLy8gY2FudmFzLiBUaGlzIHdpbGwg
aGF2ZSB0aGUgZWZmZWN0IG9mIGp1c3QgZHJhd2luZyB0aGUgY29udHJvbCBiaWdnZXIKLSAgICAg
ICAgLy8gb3Igc21hbGxlciBhbmQgbm90IGFjdHVhbGx5IGV4cGFuZGluZyBvciBjb250cmFjdGlu
ZyB0aGUgcGl4ZWxzIGluCi0gICAgICAgIC8vIGl0LiBUaGlzIHVzdWFsbHkgbG9va3MgYmV0dGVy
LgotICAgICAgICBTQ0FMRSwKLQotICAgICAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgY29udHJv
bCBhbmQgdGhlbiB0cmFuc2Zvcm0gaXQgb3Vyc2VsdmVzIGFmdGVyCi0gICAgICAgIC8vIFdpbmRv
d3MgZHJhd3MgaXQuIFRoaXMgYWxsb3dzIHVzIHRvIGdldCBjb21wbGV4IGVmZmVjdHMuCi0gICAg
ICAgIENPUFksCi0gICAgfTsKLQotcHVibGljOgotICAgIC8vIFByZXBhcmVzIGRyYXdpbmcgYSBj
b250cm9sIHdpdGggdGhlIGdpdmVuIHJlY3QgdG8gdGhlIGdpdmVuIGNvbnRleHQuCi0gICAgVGhl
bWVIZWxwZXJXaW4oR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0
KTsKLSAgICB+VGhlbWVIZWxwZXJXaW4oKTsKLQotICAgIC8vIFJldHVybnMgdGhlIGNvbnRleHQg
dG8gZHJhdyB0aGUgY29udHJvbCBpbnRvLCB3aGljaCBtYXkgYmUgdGhlIG9yaWdpbmFsCi0gICAg
Ly8gb3IgdGhlIGNvcHksIGRlcGVuZGluZyBvbiB0aGUgbW9kZS4KLSAgICBHcmFwaGljc0NvbnRl
eHQqIGNvbnRleHQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbmV3QnVmZmVyLmdldCgpID8g
bV9uZXdCdWZmZXItPmNvbnRleHQoKSA6IG1fb3JnQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvLyBS
ZXR1cm5zIHRoZSByZWN0YW5nbGUgaW4gd2hpY2ggdG8gZHJhdyBpbnRvIHRoZSBjYW52YXMoKSBi
eSBXaW5kb3dzLgotICAgIGNvbnN0IEludFJlY3QmIHJlY3QoKSB7IHJldHVybiBtX3JlY3Q7IH0K
LQotcHJpdmF0ZToKLSAgICBUeXBlIG1fdHlwZTsKLQotICAgIC8vIFRoZSBvcmlnaW5hbCBjYW52
YXMgdG8gd3JvdGUgdG8uIE5vdCBvd25lZCBieSB0aGlzIGNsYXNzLgotICAgIEdyYXBoaWNzQ29u
dGV4dCogbV9vcmdDb250ZXh0OwotICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IG1fb3JnTWF0cml4
OwotICAgIEludFJlY3QgbV9vcmdSZWN0OwotCi0gICAgLy8gV2hlbiBtX3R5cGUgPT0gQ09QWSwg
dGhpcyB3aWxsIGJlIGEgbmV3IHN1cmZhY2Ugb3duZWQgYnkgdGhpcyBjbGFzcyB0aGF0Ci0gICAg
Ly8gcmVwcmVzZW50cyB0aGUgY29weS4KLSAgICBPd25QdHI8SW1hZ2VCdWZmZXI+IG1fbmV3QnVm
ZmVyOwotCi0gICAgLy8gVGhlIGNvbnRyb2wgcmVjdGFuZ2xlIGluIHRoZSBjb29yZGluYXRlIHNw
YWNlIG9mIGNhbnZhcygpLgotICAgIEludFJlY3QgbV9yZWN0OwotfTsKLQotfSAgLy8gbmFtZXNw
YWNlIFdlYkNvcmUKLQotI2VuZGlmICAvLyBUaGVtZUhlbHBlcldpbl9oCmRpZmYgLS1naXQgYS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1RyYW5zcGFyZW5jeVdpbi5jcHAgYi9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1RyYW5zcGFyZW5jeVdpbi5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVjZDhhOAotLS0gL2Rldi9udWxsCisr
KyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vVHJhbnNwYXJlbmN5V2luLmNw
cApAQCAtMCwwICsxLDQ2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBh
cmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNv
cHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIg
dGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1
dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBm
cm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJt
aXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklH
SFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywg
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
CisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlIDx3aW5k
b3dzLmg+CisKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbWFnZUJ1
ZmZlci5oIgorI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dFNraWEuaCIKKyNpbmNsdWRlICJTaW1w
bGVGb250RGF0YS5oIgorI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCisjaW5jbHVk
ZSAiVHJhbnNwYXJlbmN5V2luLmgiCisKKyNpbmNsdWRlICJTa0NvbG9yUHJpdi5oIgorI2luY2x1
ZGUgInNraWEvZXh0L3BsYXRmb3JtX2NhbnZhcy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K25hbWVzcGFjZSB7CisKKy8vIFRoZSBtYXhpbXVtIHNpemUgaW4gcGl4ZWxzIG9mIHRoZSBidWZm
ZXIgd2UnbGwga2VlcCBhcm91bmQgZm9yIGRyYXdpbmcgdGV4dAorLy8gaW50by4gQnVmZmVycyBs
YXJnZXIgdGhhbiB0aGlzIHdpbGwgYmUgZGVzdHJveWVkIHdoZW4gd2UncmUgZG9uZSB3aXRoIHRo
ZW0uCitjb25zdCBpbnQgbWF4Q2FjaGVkQnVmZmVyUGl4ZWxTaXplID0gNjU1MzY7CisKK2lubGlu
ZSBza2lhOjpQbGF0Zm9ybUNhbnZhcyogY2FudmFzRm9yQ29udGV4dChjb25zdCBHcmFwaGljc0Nv
bnRleHQmIGNvbnRleHQpCit7CisgICAgcmV0dXJuIGNvbnRleHQucGxhdGZvcm1Db250ZXh0KCkt
PmNhbnZhcygpOworfQorCitpbmxpbmUgY29uc3QgU2tCaXRtYXAmIGJpdG1hcEZvckNvbnRleHQo
Y29uc3QgR3JhcGhpY3NDb250ZXh0JiBjb250ZXh0KQoreworICAgIHJldHVybiBjYW52YXNGb3JD
b250ZXh0KGNvbnRleHQpLT5nZXRUb3BQbGF0Zm9ybURldmljZSgpLmFjY2Vzc0JpdG1hcChmYWxz
ZSk7Cit9CisKK3ZvaWQgY29tcG9zaXRlVG9Db3B5KGNvbnN0IEdyYXBoaWNzQ29udGV4dCYgc291
cmNlTGF5ZXJzLAorICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3NDb250ZXh0JiBkZXN0Q29u
dGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBt
YXRyaXgpCit7CisgICAgLy8gTWFrZSBhIGxpc3Qgb2YgYWxsIGRldmljZXMuIFRoZSBpdGVyYXRv
ciBnb2VzIHRvcC1kb3duLCBhbmQgd2Ugd2FudAorICAgIC8vIGJvdHRvbS11cC4gTm90ZSB0aGF0
IGVhY2ggbGF5ZXIgY2FuIGFsc28gaGF2ZSBhbiBvZmZzZXQgaW4gY2FudmFzCisgICAgLy8gY29v
cmRpbmF0ZXMsIHdoaWNoIGlzIHRoZSAoeCwgeSkgcG9zaXRpb24uCisgICAgc3RydWN0IERldmlj
ZUluZm8geworICAgICAgICBEZXZpY2VJbmZvKFNrRGV2aWNlKiBkLCBpbnQgbHgsIGludCBseSkK
KyAgICAgICAgICAgIDogZGV2aWNlKGQpCisgICAgICAgICAgICAsIHgobHgpCisgICAgICAgICAg
ICAsIHkobHkpIHt9CisgICAgICAgIFNrRGV2aWNlKiBkZXZpY2U7CisgICAgICAgIGludCB4Owor
ICAgICAgICBpbnQgeTsKKyAgICB9OworICAgIFZlY3RvcjxEZXZpY2VJbmZvPiBkZXZpY2VzOwor
ICAgIFNrQ2FudmFzKiBzb3VyY2VDYW52YXMgPSBjYW52YXNGb3JDb250ZXh0KHNvdXJjZUxheWVy
cyk7CisgICAgU2tDYW52YXM6OkxheWVySXRlciBpdGVyKHNvdXJjZUNhbnZhcywgZmFsc2UpOwor
ICAgIHdoaWxlICghaXRlci5kb25lKCkpIHsKKyAgICAgICAgZGV2aWNlcy5hcHBlbmQoRGV2aWNl
SW5mbyhpdGVyLmRldmljZSgpLCBpdGVyLngoKSwgaXRlci55KCkpKTsKKyAgICAgICAgaXRlci5u
ZXh0KCk7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IGNhbnZhcyBmb3IgdGhl
IGNvbXBvc2l0aW5nIGludG8gdGhlIGRlc3RpbmF0aW9uLgorICAgIFNrQml0bWFwKiBkZXN0Qm1w
ID0gY29uc3RfY2FzdDxTa0JpdG1hcCo+KCZiaXRtYXBGb3JDb250ZXh0KGRlc3RDb250ZXh0KSk7
CisgICAgU2tDYW52YXMgZGVzdENhbnZhcygqZGVzdEJtcCk7CisgICAgZGVzdENhbnZhcy5zZXRN
YXRyaXgobWF0cml4KTsKKworICAgIGZvciAoaW50IGkgPSBkZXZpY2VzLnNpemUoKSAtIDE7IGkg
Pj0gMDsgaS0tKSB7CisgICAgICAgIGNvbnN0IFNrQml0bWFwJiBzcmNCbXAgPSBkZXZpY2VzW2ld
LmRldmljZS0+YWNjZXNzQml0bWFwKGZhbHNlKTsKKworICAgICAgICBTa1JlY3QgZGVzdFJlY3Q7
CisgICAgICAgIGRlc3RSZWN0LmZMZWZ0ID0gZGV2aWNlc1tpXS54OworICAgICAgICBkZXN0UmVj
dC5mVG9wID0gZGV2aWNlc1tpXS55OworICAgICAgICBkZXN0UmVjdC5mUmlnaHQgPSBkZXN0UmVj
dC5mTGVmdCArIHNyY0JtcC53aWR0aCgpOworICAgICAgICBkZXN0UmVjdC5mQm90dG9tID0gZGVz
dFJlY3QuZlRvcCArIHNyY0JtcC5oZWlnaHQoKTsKKworICAgICAgICBkZXN0Q2FudmFzLmRyYXdC
aXRtYXBSZWN0KHNyY0JtcCwgMCwgZGVzdFJlY3QpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNw
YWNlCisKKy8vIElmIGVpdGhlciBvZiB0aGVzZSBwb2ludGVycyBpcyBub24tbnVsbCwgYm90aCBt
dXN0IGJlIHZhbGlkIGFuZCBwb2ludCB0bworLy8gYml0bWFwcyBvZiB0aGUgc2FtZSBzaXplLgor
Y2xhc3MgVHJhbnNwYXJlbmN5V2luOjpPd25lZEJ1ZmZlcnMgeworcHVibGljOgorICAgIE93bmVk
QnVmZmVycyhjb25zdCBJbnRTaXplJiBzaXplLCBib29sIG5lZWRSZWZlcmVuY2VCdWZmZXIpCisg
ICAgeworICAgICAgICBtX2Rlc3RCaXRtYXAuYWRvcHQoSW1hZ2VCdWZmZXI6OmNyZWF0ZShzaXpl
LCBmYWxzZSkpOworCisgICAgICAgIGlmIChuZWVkUmVmZXJlbmNlQnVmZmVyKSB7CisgICAgICAg
ICAgICBtX3JlZmVyZW5jZUJpdG1hcC5zZXRDb25maWcoU2tCaXRtYXA6OmtBUkdCXzg4ODhfQ29u
ZmlnLCBzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCkpOworICAgICAgICAgICAgbV9yZWZlcmVu
Y2VCaXRtYXAuYWxsb2NQaXhlbHMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEltYWdlQnVm
ZmVyKiBkZXN0Qml0bWFwKCkgeyByZXR1cm4gbV9kZXN0Qml0bWFwLmdldCgpOyB9CisKKyAgICAv
LyBUaGlzIGJpdG1hcCB3aWxsIGJlIGVtcHR5IGlmIHlvdSBkb24ndCBzcGVjaWZ5IG5lZWRSZWZl
cmVuY2VCdWZmZXIgdG8gdGhlCisgICAgLy8gY29uc3RydWN0b3IuCisgICAgU2tCaXRtYXAqIHJl
ZmVyZW5jZUJpdG1hcCgpIHsgcmV0dXJuICZtX3JlZmVyZW5jZUJpdG1hcDsgfQorCisgICAgLy8g
UmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IGxheWVyIHdpbGwgZml4IGEgYnVmZmVyIG9mIHRo
ZSBnaXZlbiBzaXplLgorICAgIGJvb2wgY2FuSGFuZGxlU2l6ZShjb25zdCBJbnRTaXplJiBzaXpl
KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fZGVzdEJpdG1hcC0+c2l6ZSgpLndpZHRo
KCkgPj0gc2l6ZS53aWR0aCgpICYmIG1fZGVzdEJpdG1hcC0+c2l6ZSgpLmhlaWdodCgpID49IHNp
emUuaGVpZ2h0KCk7CisgICAgfQorCitwcml2YXRlOgorICAgIC8vIFRoZSBkZXN0aW5hdGlvbiBi
aXRtYXAgd2UncmUgZHJhd2luZyBpbnRvLgorICAgIE93blB0cjxJbWFnZUJ1ZmZlcj4gbV9kZXN0
Qml0bWFwOworCisgICAgLy8gVGhpcyBjb3VsZCBiZSBhbiBJbWFnZUJ1ZmZlciBidXQgdGhpcyBp
cyBhbiBvcHRpbWl6YXRpb24uIFNpbmNlIHRoaXMgaXMKKyAgICAvLyBvbmx5IGV2ZXIgdXNlZCBh
cyBhIHJlZmVyZW5jZSwgd2UgZG9uJ3QgbmVlZCB0byBtYWtlIGEgZnVsbAorICAgIC8vIFBsYXRm
b3JtQ2FudmFzIHVzaW5nIFNraWEgb24gV2luZG93cy4gSnVzdCBhbGxvY2F0aW5nIGEgcmVndWxh
ciBTa0JpdG1hcAorICAgIC8vIGlzIG11Y2ggZmFzdGVyIHNpbmNlIGl0J3MganVzdCBhIE1hbGxv
YyByYXRoZXIgdGhhbiBhIEdESSBjYWxsLgorICAgIFNrQml0bWFwIG1fcmVmZXJlbmNlQml0bWFw
OworfTsKKworVHJhbnNwYXJlbmN5V2luOjpPd25lZEJ1ZmZlcnMqIFRyYW5zcGFyZW5jeVdpbjo6
bV9jYWNoZWRCdWZmZXJzID0gMDsKKworVHJhbnNwYXJlbmN5V2luOjpUcmFuc3BhcmVuY3lXaW4o
KQorICAgIDogbV9kZXN0Q29udGV4dCgwKQorICAgICwgbV9vcmdUcmFuc2Zvcm0oKQorICAgICwg
bV9sYXllck1vZGUoTm9MYXllcikKKyAgICAsIG1fdHJhbnNmb3JtTW9kZShLZWVwVHJhbnNmb3Jt
KQorICAgICwgbV9kcmF3Q29udGV4dCgwKQorICAgICwgbV9zYXZlZE9uRHJhd0NvbnRleHQoZmFs
c2UpCisgICAgLCBtX2xheWVyQnVmZmVyKDApCisgICAgLCBtX3JlZmVyZW5jZUJpdG1hcCgwKQor
eworfQorCitUcmFuc3BhcmVuY3lXaW46On5UcmFuc3BhcmVuY3lXaW4oKQoreworICAgIC8vIE1h
dGNoZXMgdGhlIHNhdmUoKSBpbiBpbml0aWFsaXplTmV3VGV4dENvbnRleHQgKG9yIHRoZSBjb25z
dHJ1Y3RvciBmb3IKKyAgICAvLyBTQ0FMRSkgdG8gcHV0IHRoZSBjb250ZXh0IGJhY2sgaW50byB0
aGUgc2FtZSBzdGF0ZSB3ZSBmb3VuZCBpdC4KKyAgICBpZiAobV9zYXZlZE9uRHJhd0NvbnRleHQp
CisgICAgICAgIG1fZHJhd0NvbnRleHQtPnJlc3RvcmUoKTsKKworICAgIHN3aXRjaCAobV9sYXll
ck1vZGUpIHsKKyAgICBjYXNlIE5vTGF5ZXI6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT3Bh
cXVlQ29tcG9zaXRlTGF5ZXI6CisgICAgY2FzZSBXaGl0ZUxheWVyOgorICAgICAgICBjb21wb3Np
dGVPcGFxdWVDb21wb3NpdGUoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUZXh0Q29tcG9z
aXRlOgorICAgICAgICBjb21wb3NpdGVUZXh0Q29tcG9zaXRlKCk7CisgICAgICAgIGJyZWFrOwor
ICAgIH0KK30KKwordm9pZCBUcmFuc3BhcmVuY3lXaW46OmluaXQoR3JhcGhpY3NDb250ZXh0KiBk
ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF5ZXJNb2RlIGxheWVyTW9kZSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybU1vZGUgdHJhbnNmb3JtTW9kZSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludFJlY3QmIHJlZ2lvbikgeworICAgIG1f
ZGVzdENvbnRleHQgPSBkZXN0OworICAgIG1fb3JnVHJhbnNmb3JtID0gZGVzdC0+Z2V0Q1RNKCk7
CisgICAgbV9sYXllck1vZGUgPSBsYXllck1vZGU7CisgICAgbV90cmFuc2Zvcm1Nb2RlID0gdHJh
bnNmb3JtTW9kZTsKKyAgICBtX3NvdXJjZVJlY3QgPSByZWdpb247CisKKyAgICBjb21wdXRlTGF5
ZXJTaXplKCk7CisgICAgc2V0dXBMYXllcigpOworICAgIHNldHVwVHJhbnNmb3JtKHJlZ2lvbik7
Cit9CisKK3ZvaWQgVHJhbnNwYXJlbmN5V2luOjpjb21wdXRlTGF5ZXJTaXplKCkKK3sKKyAgICBp
ZiAobV90cmFuc2Zvcm1Nb2RlID09IFVudHJhbnNmb3JtKSB7CisgICAgICAgIC8vIFRoZSBtZWFu
aW5nIG9mIHRoZSAidHJhbnNmb3JtZWQiIHNvdXJjZSByZWN0IGlzIGEgbGl0dGxlIGFtYmlnb3Vz
CisgICAgICAgIC8vIGhlcmUuIFRoZSByZXN0IG9mIHRoZSBjb2RlIGRvZXNuJ3QgY2FyZSBhYm91
dCBpdCBpbiB0aGUgVW50cmFuc2Zvcm0KKyAgICAgICAgLy8gY2FzZSBzaW5jZSB3ZSdyZSB1c2lu
ZyBvdXIgb3duIGhhcHB5IGNvb3JkaW5hdGUgc3lzdGVtLiBTbyB3ZSBzZXQgaXQKKyAgICAgICAg
Ly8gdG8gYmUgdGhlIHNvdXJjZSByZWN0IHNpbmNlIHRoYXQgbWF0Y2hlcyBob3cgdGhlIGNvZGUg
YmVsb3cgYWN0dWFsbHkKKyAgICAgICAgLy8gdXNlcyB0aGUgdmFyaWFibGU6IHRvIGRldGVybWlu
ZSBob3cgdG8gdHJhbnNsYXRlIHRoaW5ncyB0byBhY2NvdW50CisgICAgICAgIC8vIGZvciB0aGUg
b2Zmc2V0IG9mIHRoZSBsYXllci4KKyAgICAgICAgbV90cmFuc2Zvcm1lZFNvdXJjZVJlY3QgPSBt
X3NvdXJjZVJlY3Q7CisgICAgICAgIG1fbGF5ZXJTaXplID0gSW50U2l6ZShtX3NvdXJjZVJlY3Qu
d2lkdGgoKSwgbV9zb3VyY2VSZWN0LmhlaWdodCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBt
X3RyYW5zZm9ybWVkU291cmNlUmVjdCA9IG1fb3JnVHJhbnNmb3JtLm1hcFJlY3QobV9zb3VyY2VS
ZWN0KTsKKyAgICAgICAgbV9sYXllclNpemUgPSBJbnRTaXplKG1fdHJhbnNmb3JtZWRTb3VyY2VS
ZWN0LndpZHRoKCksIG1fdHJhbnNmb3JtZWRTb3VyY2VSZWN0LmhlaWdodCgpKTsKKyAgICB9Cit9
CisKK3ZvaWQgVHJhbnNwYXJlbmN5V2luOjpzZXR1cExheWVyKCkKK3sKKyAgICBzd2l0Y2ggKG1f
bGF5ZXJNb2RlKSB7CisgICAgY2FzZSBOb0xheWVyOgorICAgICAgICBzZXR1cExheWVyRm9yTm9M
YXllcigpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9wYXF1ZUNvbXBvc2l0ZUxheWVyOgor
ICAgICAgICBzZXR1cExheWVyRm9yT3BhcXVlQ29tcG9zaXRlTGF5ZXIoKTsKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBUZXh0Q29tcG9zaXRlOgorICAgICAgICBzZXR1cExheWVyRm9yVGV4dENv
bXBvc2l0ZSgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFdoaXRlTGF5ZXI6CisgICAgICAg
IHNldHVwTGF5ZXJGb3JXaGl0ZUxheWVyKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwor
dm9pZCBUcmFuc3BhcmVuY3lXaW46OnNldHVwTGF5ZXJGb3JOb0xheWVyKCkKK3sKKyAgICBtX2Ry
YXdDb250ZXh0ID0gbV9kZXN0Q29udGV4dDsgIC8vIERyYXcgdG8gdGhlIHNvdXJjZSBjb250ZXh0
LgorfQorCit2b2lkIFRyYW5zcGFyZW5jeVdpbjo6c2V0dXBMYXllckZvck9wYXF1ZUNvbXBvc2l0
ZUxheWVyKCkKK3sKKyAgICBpbml0aWFsaXplTmV3Q29udGV4dCgpOworCisgICAgVHJhbnNmb3Jt
YXRpb25NYXRyaXggbWFwcGluZzsKKyAgICBtYXBwaW5nLnRyYW5zbGF0ZSgtbV90cmFuc2Zvcm1l
ZFNvdXJjZVJlY3QueCgpLCAtbV90cmFuc2Zvcm1lZFNvdXJjZVJlY3QueSgpKTsKKyAgICBpZiAo
bV90cmFuc2Zvcm1Nb2RlID09IFVudHJhbnNmb3JtKXsgCisgICAgICAgIC8vIENvbXB1dGUgdGhl
IGludmVyc2UgbWFwcGluZyBmcm9tIHRoZSBjYW52YXMgc3BhY2UgdG8gdGhlCisgICAgICAgIC8v
IGNvb3JkaW5hdGUgc3BhY2Ugb2Ygb3VyIGJpdG1hcC4KKyAgICAgICAgbWFwcGluZyA9IG1fb3Jn
VHJhbnNmb3JtLmludmVyc2UoKSAqIG1hcHBpbmc7CisgICAgfQorICAgIGNvbXBvc2l0ZVRvQ29w
eSgqbV9kZXN0Q29udGV4dCwgKm1fZHJhd0NvbnRleHQsIG1hcHBpbmcpOworCisgICAgLy8gU2F2
ZSB0aGUgcmVmZXJlbmNlIGxheWVyIHNvIHdlIGNhbiB0ZWxsIHdoYXQgY2hhbmdlZC4KKyAgICBT
a0NhbnZhcyByZWZlcmVuY2VDYW52YXMoKm1fcmVmZXJlbmNlQml0bWFwKTsKKyAgICByZWZlcmVu
Y2VDYW52YXMuZHJhd0JpdG1hcChiaXRtYXBGb3JDb250ZXh0KCptX2RyYXdDb250ZXh0KSwgMCwg
MCk7CisgICAgLy8gTGF5ZXIgcmVjdCByZXByZXNlbnRzIHRoZSBwYXJ0IG9mIHRoZSBvcmlnaW5h
bCBsYXllci4KK30KKwordm9pZCBUcmFuc3BhcmVuY3lXaW46OnNldHVwTGF5ZXJGb3JUZXh0Q29t
cG9zaXRlKCkKK3sKKyAgICBBU1NFUlQobV90cmFuc2Zvcm1Nb2RlID09IEtlZXBUcmFuc2Zvcm0p
OworICAgIC8vIEZhbGwgdGhyb3VnaCB0byBmaWxsaW5nIHdpdGggd2hpdGUuCisgICAgc2V0dXBM
YXllckZvcldoaXRlTGF5ZXIoKTsKK30KKwordm9pZCBUcmFuc3BhcmVuY3lXaW46OnNldHVwTGF5
ZXJGb3JXaGl0ZUxheWVyKCkKK3sKKyAgICBpbml0aWFsaXplTmV3Q29udGV4dCgpOworICAgIG1f
ZHJhd0NvbnRleHQtPmZpbGxSZWN0KEludFJlY3QoSW50UG9pbnQoMCwgMCksIG1fbGF5ZXJTaXpl
KSwgQ29sb3I6OndoaXRlKTsKKyAgICAvLyBMYXllciByZWN0IHJlcHJlc2VudHMgdGhlIHBhcnQg
b2YgdGhlIG9yaWdpbmFsIGxheWVyLgorfQorCit2b2lkIFRyYW5zcGFyZW5jeVdpbjo6c2V0dXBU
cmFuc2Zvcm0oY29uc3QgSW50UmVjdCYgcmVnaW9uKQoreworICAgIHN3aXRjaCAobV90cmFuc2Zv
cm1Nb2RlKSB7CisgICAgY2FzZSBLZWVwVHJhbnNmb3JtOgorICAgICAgICBzZXR1cFRyYW5zZm9y
bUZvcktlZXBUcmFuc2Zvcm0ocmVnaW9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBVbnRy
YW5zZm9ybToKKyAgICAgICAgc2V0dXBUcmFuc2Zvcm1Gb3JVbnRyYW5zZm9ybSgpOworICAgICAg
ICBicmVhazsKKyAgICBjYXNlIFNjYWxlVHJhbnNmb3JtOgorICAgICAgICBzZXR1cFRyYW5zZm9y
bUZvclNjYWxlVHJhbnNmb3JtKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBU
cmFuc3BhcmVuY3lXaW46OnNldHVwVHJhbnNmb3JtRm9yS2VlcFRyYW5zZm9ybShjb25zdCBJbnRS
ZWN0JiByZWdpb24pCit7CisgICAgaWYgKG1fbGF5ZXJNb2RlICE9IE5vTGF5ZXIpIHsKKyAgICAg
ICAgLy8gTmVlZCB0byBzYXZlIHRoaW5ncyBzaW5jZSB3ZSdyZSBtb2RpZnlpbmcgdGhlIHRyYW5z
Zm9ybS4KKyAgICAgICAgbV9kcmF3Q29udGV4dC0+c2F2ZSgpOworICAgICAgICBtX3NhdmVkT25E
cmF3Q29udGV4dCA9IHRydWU7CisKKyAgICAgICAgLy8gQWNjb3VudCBmb3IgdGhlIGZhY3QgdGhh
dCB0aGUgbGF5ZXIgbWF5IGJlIG9mZnNldCBmcm9tIHRoZQorICAgICAgICAvLyBvcmlnaW5hbC4g
VGhpcyBvbmx5IGhhcHBlbnMgd2hlbiB3ZSBjcmVhdGUgYSBsYXllciB0aGF0IGhhcyB0aGUKKyAg
ICAgICAgLy8gc2FtZSBjb29yZGluYXRlIHNwYWNlIGFzIHRoZSBwYXJlbnQuCisgICAgICAgIFRy
YW5zZm9ybWF0aW9uTWF0cml4IHhmb3JtOworICAgICAgICB4Zm9ybS50cmFuc2xhdGUoLW1fdHJh
bnNmb3JtZWRTb3VyY2VSZWN0LngoKSwgLW1fdHJhbnNmb3JtZWRTb3VyY2VSZWN0LnkoKSk7CisK
KyAgICAgICAgLy8gV2UncmUgbWFraW5nIGEgbGF5ZXIsIHNvIGFwcGx5IHRoZSBvbGQgdHJhbnNm
b3JtIHRvIHRoZSBuZXcgb25lCisgICAgICAgIC8vIHNvIGl0J3MgbWFpbnRhaW5lZC4gV2Uga25v
dyB0aGUgbmV3IGxheWVyIGhhcyB0aGUgaWRlbnRpdHkKKyAgICAgICAgLy8gdHJhbnNmb3JtIG5v
dywgd2Ugd2UgY2FuIGp1c3QgbXVsdGlwbHkgaXQuCisgICAgICAgIHhmb3JtID0gbV9vcmdUcmFu
c2Zvcm0gKiB4Zm9ybTsKKyAgICAgICAgbV9kcmF3Q29udGV4dC0+Y29uY2F0Q1RNKHhmb3JtKTsK
KyAgICB9CisgICAgbV9kcmF3UmVjdCA9IG1fc291cmNlUmVjdDsKK30KKwordm9pZCBUcmFuc3Bh
cmVuY3lXaW46OnNldHVwVHJhbnNmb3JtRm9yVW50cmFuc2Zvcm0oKQoreworICAgIEFTU0VSVCht
X2xheWVyTW9kZSAhPSBOb0xheWVyKTsKKyAgICAvLyBXZSBub3cgaGF2ZSBhIG5ldyBsYXllciB3
aXRoIHRoZSBpZGVudGl0eSB0cmFuc2Zvcm0sIHdoaWNoIGlzIHRoZQorICAgIC8vIFVudHJhbnNm
b3JtZWQgc3BhY2Ugd2UnbGwgdXNlIGZvciBkcmF3aW5nLgorICAgIG1fZHJhd1JlY3QgPSBJbnRS
ZWN0KEludFBvaW50KDAsIDApLCBtX2xheWVyU2l6ZSk7Cit9CisKK3ZvaWQgVHJhbnNwYXJlbmN5
V2luOjpzZXR1cFRyYW5zZm9ybUZvclNjYWxlVHJhbnNmb3JtKCkKK3sKKyAgICBpZiAobV9sYXll
ck1vZGUgPT0gTm9MYXllcikgeworICAgICAgICAvLyBOZWVkIHRvIHNhdmUgdGhpbmdzIHNpbmNl
IHdlJ3JlIG1vZGlmeWluZyB0aGUgbGF5ZXIuCisgICAgICAgIG1fZHJhd0NvbnRleHQtPnNhdmUo
KTsKKyAgICAgICAgbV9zYXZlZE9uRHJhd0NvbnRleHQgPSB0cnVlOworCisgICAgICAgIC8vIFVu
ZG8gdGhlIHRyYW5zZm9ybSBvbiB0aGUgY3VycmVudCBsYXllciB3aGVuIHdlJ3JlIHJlLXVzaW5n
IHRoZQorICAgICAgICAvLyBjdXJyZW50IG9uZS4KKyAgICAgICAgbV9kcmF3Q29udGV4dC0+Y29u
Y2F0Q1RNKG1fZHJhd0NvbnRleHQtPmdldENUTSgpLmludmVyc2UoKSk7CisKKyAgICAgICAgLy8g
V2UncmUgZHJhd2luZyB0byB0aGUgb3JpZ2luYWwgbGF5ZXIgd2l0aCBqdXN0IGEgZGlmZmVyZW50
IHNpemUuCisgICAgICAgIG1fZHJhd1JlY3QgPSBtX3RyYW5zZm9ybWVkU291cmNlUmVjdDsKKyAg
ICB9IGVsc2UgeworICAgICAgICAvLyBKdXN0IGdvIGFoZWFkIGFuZCB1c2UgdGhlIGxheWVyJ3Mg
Y29vcmRpbmF0ZSBzcGFjZSB0byBkcmF3IGludG8uCisgICAgICAgIC8vIEl0IHdpbGwgaGF2ZSB0
aGUgc2NhbGVkIHNpemUsIGFuZCBhbiBpZGVudGl0eSB0cmFuc2Zvcm0gbG9hZGVkLgorICAgICAg
ICBtX2RyYXdSZWN0ID0gSW50UmVjdChJbnRQb2ludCgwLCAwKSwgbV9sYXllclNpemUpOworICAg
IH0KK30KKwordm9pZCBUcmFuc3BhcmVuY3lXaW46OnNldFRleHRDb21wb3NpdGVDb2xvcihDb2xv
ciBjb2xvcikKK3sKKyAgICBtX3RleHRDb21wb3NpdGVDb2xvciA9IGNvbG9yOworfQorCit2b2lk
IFRyYW5zcGFyZW5jeVdpbjo6aW5pdGlhbGl6ZU5ld0NvbnRleHQoKQoreworICAgIGludCBwaXhl
bFNpemUgPSBtX2xheWVyU2l6ZS53aWR0aCgpICogbV9sYXllclNpemUuaGVpZ2h0KCk7CisgICAg
aWYgKHBpeGVsU2l6ZSA+IG1heENhY2hlZEJ1ZmZlclBpeGVsU2l6ZSkgeworICAgICAgICAvLyBD
cmVhdGUgYSAxLW9mZiBidWZmZXIgZm9yIGRyYXdpbmcgaW50by4gV2Ugb25seSBuZWVkIHRoZSBy
ZWZlcmVuY2UKKyAgICAgICAgLy8gYnVmZmVyIGlmIHdlJ3JlIG1ha2luZyBhbiBPcGFxdWVDb21w
b3NpdGVMYXllci4KKyAgICAgICAgYm9vbCBuZWVkUmVmZXJlbmNlQml0bWFwID0gbV9sYXllck1v
ZGUgPT0gT3BhcXVlQ29tcG9zaXRlTGF5ZXI7CisgICAgICAgIG1fb3duZWRCdWZmZXJzLnNldChu
ZXcgT3duZWRCdWZmZXJzKG1fbGF5ZXJTaXplLCBuZWVkUmVmZXJlbmNlQml0bWFwKSk7CisKKyAg
ICAgICAgbV9sYXllckJ1ZmZlciA9IG1fb3duZWRCdWZmZXJzLT5kZXN0Qml0bWFwKCk7CisgICAg
ICAgIG1fZHJhd0NvbnRleHQgPSBtX2xheWVyQnVmZmVyLT5jb250ZXh0KCk7CisgICAgICAgIGlm
IChuZWVkUmVmZXJlbmNlQml0bWFwKQorICAgICAgICAgICAgbV9yZWZlcmVuY2VCaXRtYXAgPSBt
X293bmVkQnVmZmVycy0+cmVmZXJlbmNlQml0bWFwKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9
CisKKyAgICBpZiAobV9vd25lZEJ1ZmZlcnMgJiYgbV9vd25lZEJ1ZmZlcnMtPmNhbkhhbmRsZVNp
emUobV9sYXllclNpemUpKSB7CisgICAgICAgIC8vIFdlIGNhbiByZS11c2UgdGhlIGV4aXN0aW5n
IGJ1ZmZlci4gV2UgZG9uJ3QgbmVlZCB0byBjbGVhciBpdCBzaW5jZQorICAgICAgICAvLyBhbGwg
bGF5ZXIgbW9kZXMgd2lsbCBjbGVhciBpdCBpbiB0aGVpciBpbml0aWFsaXphdGlvbi4KKyAgICAg
ICAgbV9sYXllckJ1ZmZlciA9IG1fb3duZWRCdWZmZXJzLT5kZXN0Qml0bWFwKCk7CisgICAgICAg
IG1fZHJhd0NvbnRleHQgPSBtX293bmVkQnVmZmVycy0+ZGVzdEJpdG1hcCgpLT5jb250ZXh0KCk7
CisgICAgICAgIG1fcmVmZXJlbmNlQml0bWFwID0gbV9vd25lZEJ1ZmZlcnMtPnJlZmVyZW5jZUJp
dG1hcCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgbmV3IGNh
Y2hlZCBidWZmZXIuCisgICAgaWYgKG1fY2FjaGVkQnVmZmVycykKKyAgICAgIGRlbGV0ZSBtX2Nh
Y2hlZEJ1ZmZlcnM7CisgICAgbV9jYWNoZWRCdWZmZXJzID0gbmV3IE93bmVkQnVmZmVycyhtX2xh
eWVyU2l6ZSwgdHJ1ZSk7CisKKyAgICBtX2xheWVyQnVmZmVyID0gbV9jYWNoZWRCdWZmZXJzLT5k
ZXN0Qml0bWFwKCk7CisgICAgbV9kcmF3Q29udGV4dCA9IG1fY2FjaGVkQnVmZmVycy0+ZGVzdEJp
dG1hcCgpLT5jb250ZXh0KCk7CisgICAgbV9yZWZlcmVuY2VCaXRtYXAgPSBtX2NhY2hlZEJ1ZmZl
cnMtPnJlZmVyZW5jZUJpdG1hcCgpOworfQorCit2b2lkIFRyYW5zcGFyZW5jeVdpbjo6Y29tcG9z
aXRlT3BhcXVlQ29tcG9zaXRlKCkKK3sKKyAgICBTa0NhbnZhcyogZGVzdENhbnZhcyA9IGNhbnZh
c0ZvckNvbnRleHQoKm1fZGVzdENvbnRleHQpOworICAgIGRlc3RDYW52YXMtPnNhdmUoKTsKKwor
ICAgIFNrQml0bWFwKiBiaXRtYXAgPSBjb25zdF9jYXN0PFNrQml0bWFwKj4oCisgICAgICAgICZi
aXRtYXBGb3JDb250ZXh0KCptX2xheWVyQnVmZmVyLT5jb250ZXh0KCkpKTsKKyAgICAKKyAgICAv
LyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGZvciBXaGl0ZUxheWVyIGFzIHdlbGwsIHdo
aWNoIHdlIGRvbid0IHdhbnQKKyAgICAvLyB0byBjaGFuZ2UuCisgICAgaWYgKG1fbGF5ZXJNb2Rl
ID09IE9wYXF1ZUNvbXBvc2l0ZUxheWVyKSB7CisgICAgICAgIC8vIEZpeCB1cCBvdXIgYml0bWFw
LCBtYWtpbmcgaXQgY29udGFpbiBvbmx5IHRoZSBwaXhlbHMgd2hpY2ggY2hhbmdlZAorICAgICAg
ICAvLyBhbmQgdHJhbnNwYXJlbnQgZXZlcnl3aGVyZSBlbHNlLgorICAgICAgICBTa0F1dG9Mb2Nr
UGl4ZWxzIHNvdXJjZUxvY2soKm1fcmVmZXJlbmNlQml0bWFwKTsKKyAgICAgICAgU2tBdXRvTG9j
a1BpeGVscyBsb2NrKCpiaXRtYXApOworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGJpdG1h
cC0+aGVpZ2h0KCk7IHkrKykgeworICAgICAgICAgICAgdWludDMyX3QqIHNvdXJjZSA9IG1fcmVm
ZXJlbmNlQml0bWFwLT5nZXRBZGRyMzIoMCwgeSk7CisgICAgICAgICAgICB1aW50MzJfdCogZGVz
dCA9IGJpdG1hcC0+Z2V0QWRkcjMyKDAsIHkpOworICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7
IHggPCBiaXRtYXAtPndpZHRoKCk7IHgrKykgeworICAgICAgICAgICAgICAgIC8vIENsZWFyIG91
dCBhbnkgcGl4ZWxzIHRoYXQgd2VyZSB1bnRvdWNoZWQuCisgICAgICAgICAgICAgICAgaWYgKGRl
c3RbeF0gPT0gc291cmNlW3hdKQorICAgICAgICAgICAgICAgICAgICBkZXN0W3hdID0gMDsKKyAg
ICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGRlc3RbeF0gfD0gKDB4RkYg
PDwgU0tfQTMyX1NISUZUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZQor
ICAgICAgICBtYWtlTGF5ZXJPcGFxdWUoKTsKKworICAgIFNrUmVjdCBkZXN0UmVjdDsKKyAgICBp
ZiAobV90cmFuc2Zvcm1Nb2RlICE9IFVudHJhbnNmb3JtKSB7CisgICAgICAgIC8vIFdlIHdhbnQg
dG8gdXNlIFVudHJhbnNmb3JtZWQgc3BhY2UuCisgICAgICAgIC8vCisgICAgICAgIC8vIE5vdGUg
dGhhdCB3ZSBET04nVCBjYWxsIG1fbGF5ZXJCdWZmZXItPmltYWdlKCkgaGVyZS4gVGhpcyBhY3R1
YWxseQorICAgICAgICAvLyBtYWtlcyBhIGNvcHkgb2YgdGhlIGltYWdlLCB3aGljaCBpcyB1bm5l
Y2Vzc2FyeSBhbmQgc2xvdy4gSW5zdGVhZCwgd2UKKyAgICAgICAgLy8ganVzdCBkcmF3IHRoZSBp
bWFnZSBmcm9tIGluc2lkZSB0aGUgZGVzdGluYXRpb24gY29udGV4dC4KKyAgICAgICAgU2tNYXRy
aXggaWRlbnRpdHk7CisgICAgICAgIGlkZW50aXR5LnJlc2V0KCk7CisgICAgICAgIGRlc3RDYW52
YXMtPnNldE1hdHJpeChpZGVudGl0eSk7CisKKyAgICAgICAgZGVzdFJlY3Quc2V0KG1fdHJhbnNm
b3JtZWRTb3VyY2VSZWN0LngoKSwgbV90cmFuc2Zvcm1lZFNvdXJjZVJlY3QueSgpLCBtX3RyYW5z
Zm9ybWVkU291cmNlUmVjdC5yaWdodCgpLCBtX3RyYW5zZm9ybWVkU291cmNlUmVjdC5ib3R0b20o
KSk7CisgICAgfSBlbHNlCisgICAgICAgIGRlc3RSZWN0LnNldChtX3NvdXJjZVJlY3QueCgpLCBt
X3NvdXJjZVJlY3QueSgpLCBtX3NvdXJjZVJlY3QucmlnaHQoKSwgbV9zb3VyY2VSZWN0LmJvdHRv
bSgpKTsKKworICAgIFNrUGFpbnQgcGFpbnQ7CisgICAgcGFpbnQuc2V0RmlsdGVyQml0bWFwKHRy
dWUpOworICAgIHBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKworICAgIC8vIE5vdGUgdGhhdCB3
ZSBuZWVkIHRvIHNwZWNpZnkgdGhlIHNvdXJjZSBsYXllciBzdWJzZXQsIHNpbmNlIHRoZSBiaXRt
YXAKKyAgICAvLyBtYXkgaGF2ZSBiZWVuIGNhY2hlZCBhbmQgaXQgY291bGQgYmUgbGFyZ2VyIHRo
YW4gd2hhdCB3ZSdyZSB1c2luZy4KKyAgICBTa0lSZWN0IHNvdXJjZVJlY3QgPSB7IDAsIDAsIG1f
bGF5ZXJTaXplLndpZHRoKCksIG1fbGF5ZXJTaXplLmhlaWdodCgpIH07CisgICAgZGVzdENhbnZh
cy0+ZHJhd0JpdG1hcFJlY3QoKmJpdG1hcCwgJnNvdXJjZVJlY3QsIGRlc3RSZWN0LCAmcGFpbnQp
OworICAgIGRlc3RDYW52YXMtPnJlc3RvcmUoKTsKK30KKwordm9pZCBUcmFuc3BhcmVuY3lXaW46
OmNvbXBvc2l0ZVRleHRDb21wb3NpdGUoKQoreworICAgIGNvbnN0IFNrQml0bWFwJiBiaXRtYXAg
PSBtX2xheWVyQnVmZmVyLT5jb250ZXh0KCktPnBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKS0+
Z2V0VG9wUGxhdGZvcm1EZXZpY2UoKS5hY2Nlc3NCaXRtYXAodHJ1ZSk7CisgICAgU2tDb2xvciB0
ZXh0Q29sb3IgPSBtX3RleHRDb21wb3NpdGVDb2xvci5yZ2IoKTsKKyAgICBmb3IgKGludCB5ID0g
MDsgeSA8IG1fbGF5ZXJTaXplLmhlaWdodCgpOyB5KyspIHsKKyAgICAgICAgdWludDMyX3QqIHJv
dyA9IGJpdG1hcC5nZXRBZGRyMzIoMCwgeSk7CisgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwg
bV9sYXllclNpemUud2lkdGgoKTsgeCsrKSB7CisgICAgICAgICAgICAvLyBUaGUgYWxwaGEgaXMg
dGhlIGF2ZXJhZ2Ugb2YgdGhlIFIsIEcsIGFuZCBCIGNoYW5uZWxzLgorICAgICAgICAgICAgaW50
IGFscGhhID0gKFNrR2V0UGFja2VkUjMyKHJvd1t4XSkgKyBTa0dldFBhY2tlZEczMihyb3dbeF0p
ICsgU2tHZXRQYWNrZWRCMzIocm93W3hdKSkgLyAzOworCisgICAgICAgICAgICAvLyBBcHBseSB0
aGF0IGFscGhhIHRvIHRoZSB0ZXh0IGNvbG9yIGFuZCB3cml0ZSB0aGUgcmVzdWx0LgorICAgICAg
ICAgICAgcm93W3hdID0gU2tBbHBoYU11bFEodGV4dENvbG9yLCBTa0FscGhhMjU1VG8yNTYoMjU1
IC0gYWxwaGEpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE5vdyB0aGUgbGF5ZXIgaGFz
IHRleHQgd2l0aCB0aGUgcHJvcGVyIGNvbG9yIGFuZCBvcGFjaXR5LgorICAgIFNrQ2FudmFzKiBk
ZXN0Q2FudmFzID0gY2FudmFzRm9yQ29udGV4dCgqbV9kZXN0Q29udGV4dCk7CisKKyAgICAvLyBX
ZSB3YW50IHRvIHVzZSBVbnRyYW5zZm9ybWVkIHNwYWNlIChzZWUgYWJvdmUpCisgICAgU2tNYXRy
aXggaWRlbnRpdHk7CisgICAgaWRlbnRpdHkucmVzZXQoKTsKKyAgICBkZXN0Q2FudmFzLT5zZXRN
YXRyaXgoaWRlbnRpdHkpOworICAgIFNrUmVjdCBkZXN0UmVjdCA9IHsgbV90cmFuc2Zvcm1lZFNv
dXJjZVJlY3QueCgpLCBtX3RyYW5zZm9ybWVkU291cmNlUmVjdC55KCksIG1fdHJhbnNmb3JtZWRT
b3VyY2VSZWN0LnJpZ2h0KCksIG1fdHJhbnNmb3JtZWRTb3VyY2VSZWN0LmJvdHRvbSgpIH07CisK
KyAgICAvLyBOb3RlIHRoYXQgd2UgbmVlZCB0byBzcGVjaWZ5IHRoZSBzb3VyY2UgbGF5ZXIgc3Vi
c2V0LCBzaW5jZSB0aGUgYml0bWFwCisgICAgLy8gbWF5IGhhdmUgYmVlbiBjYWNoZWQgYW5kIGl0
IGNvdWxkIGJlIGxhcmdlciB0aGFuIHdoYXQgd2UncmUgdXNpbmcuCisgICAgU2tJUmVjdCBzb3Vy
Y2VSZWN0ID0geyAwLCAwLCBtX2xheWVyU2l6ZS53aWR0aCgpLCBtX2xheWVyU2l6ZS5oZWlnaHQo
KSB9OworICAgIGRlc3RDYW52YXMtPmRyYXdCaXRtYXBSZWN0KGJpdG1hcCwgJnNvdXJjZVJlY3Qs
IGRlc3RSZWN0LCAwKTsKKyAgICBkZXN0Q2FudmFzLT5yZXN0b3JlKCk7Cit9CisKK3ZvaWQgVHJh
bnNwYXJlbmN5V2luOjptYWtlTGF5ZXJPcGFxdWUoKQoreworICAgIFNrQml0bWFwJiBiaXRtYXAg
PSBjb25zdF9jYXN0PFNrQml0bWFwJj4obV9kcmF3Q29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCkt
PgorICAgICAgICBjYW52YXMoKS0+Z2V0VG9wUGxhdGZvcm1EZXZpY2UoKS5hY2Nlc3NCaXRtYXAo
dHJ1ZSkpOworICAgIGZvciAoaW50IHkgPSAwOyB5IDwgbV9sYXllclNpemUuaGVpZ2h0KCk7IHkr
KykgeworICAgICAgICB1aW50MzJfdCogcm93ID0gYml0bWFwLmdldEFkZHIzMigwLCB5KTsKKyAg
ICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBtX2xheWVyU2l6ZS53aWR0aCgpOyB4KyspCisgICAg
ICAgICAgICByb3dbeF0gfD0gMHhGRjAwMDAwMDsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKKwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9UcmFuc3BhcmVuY3lXaW4uaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
VHJhbnNwYXJlbmN5V2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg5
NzYxMwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vVHJhbnNwYXJlbmN5V2luLmgKQEAgLTAsMCArMSwyNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24u
CisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMg
b2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3Rl
IHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmlj
IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElT
IiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICog
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFRyYW5zcGFy
ZW5jeVdpbl9oCisjZGVmaW5lIFRyYW5zcGFyZW5jeVdpbl9oCisKKyNpbmNsdWRlIDx3aW5kb3dz
Lmg+CisKKyNpbmNsdWRlICJJbWFnZUJ1ZmZlci5oIgorI2luY2x1ZGUgIk5vbmNvcHlhYmxlLmgi
CisjaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKKyNpbmNsdWRlICJ3dGYvT3duUHRy
LmgiCisKK2NsYXNzIFNrQml0bWFwOworY2xhc3MgU2tDYW52YXM7CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworY2xhc3MgR3JhcGhpY3NDb250ZXh0OworY2xhc3MgVHJhbnNwYXJlbmN5V2luX05v
TGF5ZXJfVGVzdDsKK2NsYXNzIFRyYW5zcGFyZW5jeVdpbl9XaGl0ZUxheWVyX1Rlc3Q7CitjbGFz
cyBUcmFuc3BhcmVuY3lXaW5fVGV4dENvbXBvc2l0ZV9UZXN0OworY2xhc3MgVHJhbnNwYXJlbmN5
V2luX09wYXF1ZUNvbXBvc2l0ZUxheWVyX1Rlc3Q7CisKKy8vIEhlbHBlciBjbGFzcyB0aGF0IGFi
c3RyYWN0cyBhd2F5IGRyYXdpbmcgQ2xlYXJUeXBlIHRleHQgYW5kIFdpbmRvd3MgZm9ybQorLy8g
Y29udHJvbHMgZWl0aGVyIHRvIHRoZSBvcmlnaW5hbCBjb250ZXh0IGRpcmVjdGx5LCBvciB0byBh
biBvZmZzY3JlZW4gY29udGV4dAorLy8gdGhhdCBpcyBjb21wb3NpdGVkIGxhdGVyIG1hbnVhbGx5
LiBUaGlzIGlzIHRvIGdldCBhcm91bmQgV2luZG93cycgaW5hYmlsaXR5CisvLyB0byBoYW5kbGUg
dGhlIGFscGhhIGNoYW5uZWwsIHNlbWl0cmFuc3BhcmVudCB0ZXh0LCBhbmQgdHJhbnNmb3JtZWQg
Zm9ybQorLy8gY29udHJvbHMuCitjbGFzcyBUcmFuc3BhcmVuY3lXaW4gOiBwdWJsaWMgTm9uY29w
eWFibGUgeworcHVibGljOgorICAgIGVudW0gTGF5ZXJNb2RlIHsKKyAgICAgICAgLy8gTm8gZXh0
cmEgbGF5ZXIgaXMgY3JlYXRlZC4gRHJhd2luZyB3aWxsIGhhcHBlbiB0byB0aGUgc291cmNlLgor
ICAgICAgICAvLyBWYWxpZCBvbmx5IHdpdGggS2VlcFRyYW5zZm9ybSBhbmQgU2NhbGVUcmFuc2Zv
cm0uIFRoZSByZWdpb24gYmVpbmcKKyAgICAgICAgLy8gZHJhd24gb250byBtdXN0IGJlIG9wYXF1
ZSwgc2luY2UgdGhlIG1vZGlmaWVkIHJlZ2lvbiB3aWxsIGJlIGZvcmNlZAorICAgICAgICAvLyB0
byBvcGFxdWUgd2hlbiBkcmF3aW5nIGlzIGNvbXBsZXRlLgorICAgICAgICBOb0xheWVyLAorCisg
ICAgICAgIC8vIE1ha2VzIGEgdGVtcG9yYXJ5IGxheWVyIGNvbnNpc3Rpbmcgb2YgdGhlIGNvbXBv
c2l0ZWQgbGF5ZXJzIGJlbG93CisgICAgICAgIC8vIGl0LiBUaGlzIHJlc3VsdCBtdXN0IGJlIG9w
YXF1ZS4gV2hlbiBjb21wbGV0ZSwgdGhlIHJlc3VsdCB3aWxsIGJlCisgICAgICAgIC8vIGNvbXBh
cmVkIHRvIHRoZSBvcmlnaW5hbCwgYW5kIHRoZSBkaWZmZXJlbmNlIHdpbGwgYmUgYWRkZWQgdG8g
YSB0aGVlCisgICAgICAgIC8vIGRlc3RpbmF0aW9uIGxheWVyLgorICAgICAgICAvLworICAgICAg
ICAvLyBUaGlzIG1vZGUgb25seSB3b3JrcyBpZiB0aGUgbG93ZXIgbGF5ZXJzIGFyZSBvcHF1ZSAo
bm9ybWFsbHkgdGhlCisgICAgICAgIC8vIGNhc2UgZm9yIGEgd2ViIHBhZ2UpIGFuZCBsYXllcnMg
YXJlIG9ubHkgZHJhd24gaW4gdGhlIHN0YWNrIG9yZGVyLAorICAgICAgICAvLyBtZWFuaW5nIHlv
dSBjYW4gbmV2ZXIgZHJhdyB1bmRlcm5lYXRoIGEgbGF5ZXIuCisgICAgICAgIC8vCisgICAgICAg
IC8vIFRoaXMgZG9lc24ndCB0ZWNobmljYWxseSBwcm9kdWNlIHRoZSBjb3JyZWN0IGFuc3dlciBp
biBhbGwgY2FzZXMuIElmCisgICAgICAgIC8vIHlvdSBoYXZlIGFuIG9wYXF1ZSBiYXNlLCBhIHRy
YW5zcGFyZW5jeSBsYXllciwgdGhhbiBhIHNlbWl0cmFuc3BhcmVudAorICAgICAgICAvLyBkcmF3
aW5nIG9uIHRvcCwgdGhlIHJlc3VsdCB3aWxsIGFjdHVhbGx5IGJlIGJsZW5kZWQgaW4gdHdpY2Uu
IEJ1dAorICAgICAgICAvLyB0aGlzIGlzbid0IGEgdmVyeSBpbXBvcnRhbnQgY2FzZS4gVGhpcyBt
b2RlIGlzIHVzZWQgZm9yIGZvcm0KKyAgICAgICAgLy8gY29udHJvbHMgd2hpY2ggYXJlIGFsd2F5
cyBvcGFxdWUgZXhjZXB0IGZvciBvY2NhdGlvbmFsbHkgc29tZQorICAgICAgICAvLyBhbnRpYWxp
YXNpbmcuIEl0IG1lYW5zIGZvcm0gY29udHJvbCBhbnRpYWxpYXNpbmcgd2lsbCBiZSB0b28gbGln
aHQgaW4KKyAgICAgICAgLy8gc29tZSBjYXNlcywgYnV0IG9ubHkgaWYgeW91IGhhdmUgZXh0cmEg
bGF5ZXJzLgorICAgICAgICBPcGFxdWVDb21wb3NpdGVMYXllciwKKworICAgICAgICAvLyBBbGxv
d3Mgc2VtaXRyYW5zcGFyZW50IHRleHQgdG8gYmUgZHJhd24gb24gYW55IGJhY2tncm91bmQgKGV2
ZW4gaWYgaXQKKyAgICAgICAgLy8gaXMgaXRzZWxmIHNlbWl0cmFuc3BhcmVudCksIGJ1dCBkaXNh
YmxlcyBDbGVhclR5cGUuCisgICAgICAgIC8vCisgICAgICAgIC8vIEl0IG1ha2VzIGEgdHJtcG9y
YXJ5IGxheWVyIGZpbGxlZCB3aXRoIHdoaXRlLiBUaGlzIGlzIGNvbXBvc2l0ZWQgd2l0aAorICAg
ICAgICAvLyB0aGUgbG93ZXIgbGF5ZXIgd2l0aCBhIGN1c3RvbSBjb2xvciBhcHBsaWVkIHRvIHBy
b2R1Y2UgdGhlIHJlc3VsdC4KKyAgICAgICAgLy8gVGhlIGNhbGxlciBtdXN0IGRyYXcgdGhlIHRl
eHQgaW4gYmxhY2ssIGFuZCBzZXQgdGhlIGRlc2lyZWQgZmluYWwKKyAgICAgICAgLy8gdGV4dCBj
b2xvciBieSBjYWxsaW5nIHNldFRleHRDb21wb3NpdGVDb2xvcigpLgorICAgICAgICAvLworICAg
ICAgICAvLyBPbmx5IHZhbGlkIHdpdGggS2VlcFRyYW5zZm9ybSwgd2hpY2ggaXMgdGhlIG9ubHkg
bW9kZSB3aGVyZSBkcmF3aW5nCisgICAgICAgIC8vIHRleHQgaW4gdGhpcyBmYXNoaW9uIG1ha2Vz
IHNlbnNlLgorICAgICAgICBUZXh0Q29tcG9zaXRlLAorCisgICAgICAgIC8vIE1ha2VzIGEgdGVt
cG9yYXJ5IGxheWVyIGZpbGxlZCB3aXRoIHdoaXRlLiBXaGVuIGNvbXBsZXRlLCB0aGUgbGF5ZXIK
KyAgICAgICAgLy8gd2lsbCBiZSBmb3JjZWQgdG8gYmUgb3BxYXVlIChzaW5jZSBXaW5kb3dzIG1h
eSBoYXZlIG1lc3NlZCB1cCB0aGUKKyAgICAgICAgLy8gYWxwaGEgY2hhbm5lbCkgYW5kIGNvbXBv
c2l0ZWQgZG93bi4gQW55IGFyZWFzIG5vdCBkcmF3biBpbnRvIHdpbGwKKyAgICAgICAgLy8gcmVt
YWluIHdoaXRlLgorICAgICAgICAvLworICAgICAgICAvLyBUaGlzIGlzIHRoZSBtb2RlIG9mIGxh
c3QgcmVzb3J0LiBJZiB0aGUgb3BhY2l0eSBvZiB0aGUgZmluYWwgaW1hZ2UKKyAgICAgICAgLy8g
aXMgdW5rbm93biBhbmQgd2UgY2FuJ3QgZG8gdGhlIHRleHQgdHJpY2sgKHNpbmNlIHdlIGtub3cg
aXRzIGNvbG9yKSwKKyAgICAgICAgLy8gdGhlbiB3ZSBoYXZlIHRvIGxpdmUgd2l0aCBwb3RlbnRp
YWwgd2hpdGUgaGFsb3MuIFRoaXMgaXMgdXNlZCBmb3IKKyAgICAgICAgLy8gZm9ybSBjb250cm9s
IGRyYXdpbmcsIGZvciBleGFtcGxlLgorICAgICAgICBXaGl0ZUxheWVyLAorICAgIH07CisKKyAg
ICBlbnVtIFRyYW5zZm9ybU1vZGUgeworICAgICAgICAvLyBUaGVyZSBhcmUgbm8gY2hhbmdlcyB0
byB0aGUgdHJhbnNmb3JtLiBVc2UgdGhpcyB3aGVuIGRyYXdpbmcKKyAgICAgICAgLy8gaG9yaXpv
bnRhbCB0ZXh0LiBUaGUgY3VycmVudCB0cmFuc2Zvcm0gbXVzdCBub3QgaGF2ZSByb3RhdGlvbi4K
KyAgICAgICAgS2VlcFRyYW5zZm9ybSwKKworICAgICAgICAvLyBEcmF3aW5nIGhhcHBlbnMgaW4g
YW4gVW50cmFuc2Zvcm1lZCBzcGFjZSwgYW5kIHRoZW4gdGhhdCBiaXRtYXAgaXMKKyAgICAgICAg
Ly8gdHJhbnNmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGNvbnRleHQgd2hlbiBpdCBp
cyBjb3BpZWQgZG93bi4KKyAgICAgICAgLy8gUmVxdWlyZXMgdGhhdCBhIGxheWVyIGJlIGNyZWF0
ZWQgKGxheWVyIG1vZGUgaXMgbm90IE5vTGF5ZXIpLgorICAgICAgICBVbnRyYW5zZm9ybSwKKwor
ICAgICAgICAvLyBXaGVuIHRoZSBjdXJyZW50IHRyYW5zZm9ybSBvbmx5IGhhcyBhIHNjYWxpbmcg
ZmFjdG9yIGFwcGxpZWQgYW5kCisgICAgICAgIC8vIHlvdSdyZSBkcmF3aW5nIGZvcm0gZWxlbWVu
dHMsIHVzZSB0aGlzIHBhcmFtZXRlci4gVGhpcyB3aWxsIHVuc2NhbGUKKyAgICAgICAgLy8gdGhl
IGNvb3JkaW5hdGUgc3BhY2UsIHNvIHRoZSBPUyB3aWxsIGp1c3QgZHJhdyB0aGUgZm9ybSBjb250
cm9scworICAgICAgICAvLyBsYXJnZXIgb3Igc21hbGxlciBkZXBlbmRpbmcgb24gdGhlIGRlc3Rp
bmF0aW9uIHNpemUuCisgICAgICAgIFNjYWxlVHJhbnNmb3JtLAorICAgIH07CisKKyAgICAvLyBZ
b3UgTVVTVCBjYWxsIGluaXQoKSBiZWxvdy4KKyAgICAvLyB8cmVnaW9ufCBpcyBleHByZXNzZWQg
cmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgdHJhbnNmb3JtYXRpb24uCisgICAgVHJhbnNwYXJlbmN5
V2luKCk7CisgICAgflRyYW5zcGFyZW5jeVdpbigpOworCisgICAgLy8gSW5pdGlhbGl6ZXMgdGhl
IG1lbWJlcnMgaWYgeW91IHVzZSB0aGUgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4gRG9uJ3QgY2Fs
bAorICAgIC8vIHRoaXMgaWYgeW91IHVzZSB0aGUgbXVsdGlwbGUtYXJndW1lbnQgY29uc3RydWN0
b3IuCisgICAgdm9pZCBpbml0KEdyYXBoaWNzQ29udGV4dCogZGVzdCwKKyAgICAgICAgICAgICAg
TGF5ZXJNb2RlIGxheWVyTW9kZSwKKyAgICAgICAgICAgICAgVHJhbnNmb3JtTW9kZSB0cmFuc2Zv
cm1Nb2RlLAorICAgICAgICAgICAgICBjb25zdCBJbnRSZWN0JiByZWdpb24pOworCisgICAgLy8g
UmV0dXJucyB0aGUgY29udGV4dCBmb3IgZHJhd2luZyBpbnRvLCB3aGljaCBtYXkgYmUgdGhlIGRl
c3RpbmF0aW9uCisgICAgLy8gY29udGV4dCwgb3IgYSB0ZW1wb3Jhcnkgb25lLgorICAgIEdyYXBo
aWNzQ29udGV4dCogY29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fZHJhd0NvbnRleHQ7IH0KKwor
ICAgIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiBwbGF0Zm9ybUNvbnRleHQoKSBjb25zdCB7IHJl
dHVybiBtX2RyYXdDb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsgfQorCisgICAgLy8gV2hlbiB0
aGUgbW9kZSBpcyBUZXh0Q29tcG9zaXRlLCB0aGlzIHNldHMgdGhlIGNvbG9yIHRoYXQgdGhlIHRl
eHQgd2lsbAorICAgIC8vIGdldC4gU2VlIHRoZSBlbnVtIGFib3ZlIGZvciBtb3JlLgorICAgIHZv
aWQgc2V0VGV4dENvbXBvc2l0ZUNvbG9yKENvbG9yIGNvbG9yKTsKKworICAgIC8vIFJldHVybnMg
dGhlIGlucHV0IGJvdW5kcyB0cmFuc2xhdGVkIGludG8gdGhlIGRlc3RpbmF0aW9uIHNwYWNlLiBU
aGlzIGlzCisgICAgLy8gbm90IG5lY2Vzc2FyeSBmb3IgS2VlcFRyYW5zZm9ybSBzaW5jZSB0aGUg
cmVjdGFuZ2xlIHdpbGwgYmUgdW5jaGFuZ2VkLgorICAgIGNvbnN0IEludFJlY3QmIGRyYXdSZWN0
KCkgeyByZXR1cm4gbV9kcmF3UmVjdDsgfQorCitwcml2YXRlOgorICAgIGZyaWVuZCBUcmFuc3Bh
cmVuY3lXaW5fTm9MYXllcl9UZXN0OworICAgIGZyaWVuZCBUcmFuc3BhcmVuY3lXaW5fV2hpdGVM
YXllcl9UZXN0OworICAgIGZyaWVuZCBUcmFuc3BhcmVuY3lXaW5fVGV4dENvbXBvc2l0ZV9UZXN0
OworICAgIGZyaWVuZCBUcmFuc3BhcmVuY3lXaW5fT3BhcXVlQ29tcG9zaXRlTGF5ZXJfVGVzdDsK
KworICAgIGNsYXNzIE93bmVkQnVmZmVyczsKKworICAgIHZvaWQgY29tcHV0ZUxheWVyU2l6ZSgp
OworCisgICAgLy8gU2V0cyB1cCBhIG5ldyBsYXllciwgaWYgYW55LiBzZXR1cExheWVyKCkgd2ls
bCBjYWxsIHRoZSBhcHBvcHJpYXRlIGxheWVyLQorICAgIC8vIHNwZWNpZmljIGhlbHBlci4gTXVz
dCBiZSBjYWxsZWQgYWZ0ZXIgY29tcHV0ZUxheWVyU2l6ZSgpOworICAgIHZvaWQgc2V0dXBMYXll
cigpOworICAgIHZvaWQgc2V0dXBMYXllckZvck5vTGF5ZXIoKTsKKyAgICB2b2lkIHNldHVwTGF5
ZXJGb3JPcGFxdWVDb21wb3NpdGVMYXllcigpOworICAgIHZvaWQgc2V0dXBMYXllckZvclRleHRD
b21wb3NpdGUoKTsKKyAgICB2b2lkIHNldHVwTGF5ZXJGb3JXaGl0ZUxheWVyKCk7CisKKyAgICAv
LyBTZXRzIHVwIHRoZSB0cmFuc2Zvcm1hdGlvbiBvbiB0aGUgbmV3bHkgY3JlYXRlZCBsYXllci4g
c2V0dXBUcmFuc2Zvcm0oKQorICAgIC8vIHdpbGwgY2FsbCB0aGUgYXBwcm9wcmlhdGUgdHJhbnNm
b3JtLXNwZWNpZmljIGhlbHBlci4gTXVzdCBiZSBjYWxsZWQgYWZ0ZXIKKyAgICAvLyBzZXR1cExh
eWVyKCkuCisgICAgdm9pZCBzZXR1cFRyYW5zZm9ybShjb25zdCBJbnRSZWN0JiByZWdpb24pOwor
ICAgIHZvaWQgc2V0dXBUcmFuc2Zvcm1Gb3JLZWVwVHJhbnNmb3JtKGNvbnN0IEludFJlY3QmIHJl
Z2lvbik7CisgICAgdm9pZCBzZXR1cFRyYW5zZm9ybUZvclVudHJhbnNmb3JtKCk7CisgICAgdm9p
ZCBzZXR1cFRyYW5zZm9ybUZvclNjYWxlVHJhbnNmb3JtKCk7CisKKyAgICB2b2lkIGluaXRpYWxp
emVOZXdDb250ZXh0KCk7CisKKyAgICB2b2lkIGNvbXBvc2l0ZU9wYXF1ZUNvbXBvc2l0ZSgpOwor
ICAgIHZvaWQgY29tcG9zaXRlVGV4dENvbXBvc2l0ZSgpOworCisgICAgLy8gRml4ZXMgdGhlIGFs
cGhhIGNoYW5uZWwgdG8gbWFrZSB0aGUgcmVnaW9uIGluc2lkZSBtX3RyYW5zZm9ybWVkUmVjdAor
ICAgIC8vIG9wYXF1ZS4KKyAgICB2b2lkIG1ha2VMYXllck9wYXF1ZSgpOworCisgICAgLy8gVGhl
IGNvbnRleHQgb3VyIGRyYXdpbmcgd2lsbCBldmVudHVhbGx5IGVuZCB1cCBpbi4KKyAgICBHcmFw
aGljc0NvbnRleHQqIG1fZGVzdENvbnRleHQ7CisKKyAgICAvLyBUaGUgb3JpZ2luYWwgdHJhbnNm
b3JtIGZyb20gdGhlIGRlc3RpbmF0aW9uIGNvbnRleHQuCisgICAgVHJhbnNmb3JtYXRpb25NYXRy
aXggbV9vcmdUcmFuc2Zvcm07CisKKyAgICBMYXllck1vZGUgbV9sYXllck1vZGU7CisgICAgVHJh
bnNmb3JtTW9kZSBtX3RyYW5zZm9ybU1vZGU7CisKKyAgICAvLyBUaGUgcmVjdGFuZ2xlIHdlJ3Jl
IGRyYXdpbmcgaW4gdGhlIGRlc3RpbmF0aW9uJ3MgY29vcmRpbmF0ZSBzcGFjZQorICAgIEludFJl
Y3QgbV9zb3VyY2VSZWN0OworCisgICAgLy8gVGhlIHNvdXJjZSByZWN0YW5nbGUgdHJhbnNmb3Jt
ZWQgaW50byBwaXhlbHMgaW4gdGhlIGZpbmFsIGltYWdlLiBGb3IKKyAgICAvLyBVbnRyYW5zZm9y
bSB0aGlzIGhhcyBubyBtZWFuaW5nLCBzaW5jZSB0aGUgZGVzdGluYXRpb24gbWlnaHQgbm90IGJl
IGEKKyAgICAvLyByZWN0YW5nbGUuCisgICAgSW50UmVjdCBtX3RyYW5zZm9ybWVkU291cmNlUmVj
dDsKKworICAgIC8vIFRoZSBzaXplIG9mIHRoZSBsYXllciB3ZSBjcmVhdGVkLiBJZiB0aGVyZSdz
IG5vIGxheWVyLCB0aGlzIGlzIHRoZSBzaXplCisgICAgLy8gb2YgdGhlIHJlZ2lvbiB3ZSdyZSB1
c2luZyBpbiB0aGUgc291cmNlLgorICAgIEludFNpemUgbV9sYXllclNpemU7CisKKyAgICAvLyBU
aGUgcmVjdGFuZ2xlIHdlJ3JlIGRyYXdpbmcgdG8gaW4gdGhlIGRyYXcgY29udGV4dCdzIGNvb3Jk
aW5hdGUgc3BhY2UuCisgICAgLy8gVGhpcyB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBzb3VyY2Ug
cmVjdGFuZ2xlIGV4Y2VwdCBmb3IgU2NhbGVUcmFuc2Zvcm0KKyAgICAvLyB3aGVyZSB3ZSBjcmVh
dGUgYSBuZXcgdmlydHVhbCBjb29yZGluYXRlIHNwYWNlIGZvciB0aGUgbGF5ZXIuCisgICAgSW50
UmVjdCBtX2RyYXdSZWN0OworCisgICAgLy8gUG9pbnRzIHRvIHRoZSBncmFwaGljcyBjb250ZXh0
IHRvIGRyYXcgdGV4dCB0bywgd2hpY2ggd2lsbCBlaXRoZXIgYmUKKyAgICAvLyB0aGUgb3JpZ2lu
YWwgY29udGV4dCBvciB0aGUgY29weSwgZGVwZW5kaW5nIG9uIG91ciBtb2RlLgorICAgIEdyYXBo
aWNzQ29udGV4dCogbV9kcmF3Q29udGV4dDsKKworICAgIC8vIFRoaXMgZmxhZyBpcyBzZXQgd2hl
biB3ZSBjYWxsIHNhdmUoKSBvbiB0aGUgZHJhdyBjb250ZXh0IGR1cmluZworICAgIC8vIGluaXRp
YWxpemF0aW9uLiBJdCBhbGxvd3MgdXMgdG8gYXZvaWQgZG9pbmcgYW4gZXh0cmEgc2F2ZSgpL3Jl
c3RvcmUoKQorICAgIC8vIHdoZW4gb25lIGlzIHVubmVjZXNzYXJ5LgorICAgIGJvb2wgbV9zYXZl
ZE9uRHJhd0NvbnRleHQ7CisKKyAgICAvLyBVc2VkIG9ubHkgd2hlbiBtX21vZGUgPSBUZXh0Q29t
cG9zaXRlLCB0aGlzIGlzIHRoZSBjb2xvciB0aGF0IHRoZSB0ZXh0CisgICAgLy8gd2lsbCBlbmQg
dXAgYmVpbmcgb25jZSB3ZSBmaWd1cmUgb3V0IHRoZSB0cmFuc3BhcmVuY3kuCisgICAgQ29sb3Ig
bV90ZXh0Q29tcG9zaXRlQ29sb3I7CisKKyAgICAvLyBMYXllciB3ZSdyZSBkcmF3aW5nIHRvLgor
ICAgIEltYWdlQnVmZmVyKiBtX2xheWVyQnVmZmVyOworCisgICAgLy8gV2hlbiB0aGUgbGF5ZXIg
dHlwZSBpcyBPcGFxdWVDb21wb3NpdGVMYXllciwgdGhpcyB3aWxsIGNvbnRhaW4gYSBjb3B5Cisg
ICAgLy8gb2YgdGhlIG9yaWdpbmFsIGNvbnRlbnRzIG9mIHRoZSBtX2xheWVyQnVmZmVyIGJlZm9y
ZSBXaW5kb3dzIGRyZXcgb24gaXQuCisgICAgLy8gSXQgYWxsb3dzIHVzIHRvIHJlLWNyZWF0ZSB3
aGF0IFdpbmRvd3MgZGlkIHRvIHRoZSBsYXllci4gSXQgaXMgYW4KKyAgICAvLyBTa0JpdG1hcCBp
bnN0ZWFkIG9mIGFuIEltYWdlQnVmZmVyIGJlY2F1c2UgYW4gU2tCaXRtYXAgaXMgbGlnaHRlci13
ZWlnaHQKKyAgICAvLyAoSW1hZ2VCdWZmZXJzIGFyZSBhbHNvIEdESSBzdXJmYWNlcywgd2hpY2gg
d2UgZG9uJ3QgbmVlZCBoZXJlKS4KKyAgICBTa0JpdG1hcCogbV9yZWZlcmVuY2VCaXRtYXA7CisK
KyAgICAvLyBJZiB0aGUgZ2l2ZW4gc2l6ZSBvZiBiaXRtYXAgY2FuIGJlIGNhY2hlZCwgdGhleSB3
aWxsIGJlIHN0b3JlZCBoZXJlLiBCb3RoCisgICAgLy8gdGhlIGJpdG1hcCBhbmQgdGhlIHJlZmVy
ZW5jZSBhcmUgZ3VhcmFudGVlZCB0byBiZSBhbGxvY2F0ZWQgaWYgdGhpcworICAgIC8vIG1lbWJl
ciBpcyBub24tbnVsbC4KKyAgICBzdGF0aWMgT3duZWRCdWZmZXJzKiBtX2NhY2hlZEJ1ZmZlcnM7
CisKKyAgICAvLyBJZiBhIGJ1ZmZlciB3YXMgdG9vIGJpZyB0byBiZSBjYWNoZWQsIGl0IHdpbGwg
YmUgY3JlYXRlZCB0ZW1wb3JhcmlseSwgYW5kCisgICAgLy8gdGhpcyBtZW1iZXIgdHJhY2tzIGl0
cyBzY29wZSB0byBtYWtlIHN1cmUgaXQgZ2V0cyBkZWxldGVkLiBBbHdheXMgdXNlCisgICAgLy8g
bV9sYXllckJ1ZmZlciwgd2hpY2ggd2lsbCBlaXRoZXIgcG9pbnQgdG8gdGhpcyBvYmplY3QsIG9y
IHRoZSBzdGF0aWNhbGx5CisgICAgLy8gY2FjaGVkIG9uZS4gRG9uJ3QgYWNjZXNzIGRpcmVjdGx5
LgorICAgIE93blB0cjxPd25lZEJ1ZmZlcnM+IG1fb3duZWRCdWZmZXJzOworfTsKKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVHJhbnNhcHJlbmN5V2luX2gKZGlmZiAtLWdp
dCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGljc0NvbnRleHRTa2lhLmNw
cCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGljc0NvbnRleHRTa2lhLmNw
cAppbmRleCAzNGU0YTExLi5iMTI4NTk5IDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3NraWEvR3JhcGhpY3NDb250ZXh0U2tpYS5jcHAKKysrIGIvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9za2lhL0dyYXBoaWNzQ29udGV4dFNraWEuY3BwCkBAIC0yNzUsMTEgKzI3NSw2
IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjplbmRUcmFuc3BhcmVuY3lMYXllcigpCiB7CiAgICAg
aWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKICAgICAgICAgcmV0dXJuOwotCi0jaWYgUExBVEZPUk0o
V0lOX09TKQotICAgIHBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKS0+Z2V0VG9wUGxhdGZvcm1E
ZXZpY2UoKS4KLSAgICAgICAgZml4dXBBbHBoYUJlZm9yZUNvbXBvc2l0aW5nKCk7Ci0jZW5kaWYK
ICAgICBwbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCktPnJlc3RvcmUoKTsKIH0KIApkaWZmIC0t
Z2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ltYWdlU2tpYS5jcHAgYi9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvSW1hZ2VTa2lhLmNwcAppbmRleCAxMTIzZmU5Li4z
NTIwZThkIDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvSW1hZ2VT
a2lhLmNwcAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvSW1hZ2VTa2lhLmNw
cApAQCAtMjI1LDYgKzIyNSw3IEBAIHN0YXRpYyB2b2lkIHBhaW50U2tCaXRtYXAoUGxhdGZvcm1D
b250ZXh0U2tpYSogcGxhdGZvcm1Db250ZXh0LCBjb25zdCBOYXRpdmVJbWFnCiB7CiAgICAgU2tQ
YWludCBwYWludDsKICAgICBwYWludC5zZXRQb3J0ZXJEdWZmWGZlcm1vZGUoY29tcE9wKTsKKyAg
ICBwYWludC5zZXRGaWx0ZXJCaXRtYXAodHJ1ZSk7CiAKICAgICBza2lhOjpQbGF0Zm9ybUNhbnZh
cyogY2FudmFzID0gcGxhdGZvcm1Db250ZXh0LT5jYW52YXMoKTsKIApAQCAtMjMzLDcgKzIzNCw2
IEBAIHN0YXRpYyB2b2lkIHBhaW50U2tCaXRtYXAoUGxhdGZvcm1Db250ZXh0U2tpYSogcGxhdGZv
cm1Db250ZXh0LCBjb25zdCBOYXRpdmVJbWFnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBTa1NjYWxhclRvRmxvYXQoZGVzdFJlY3Qud2lkdGgoKSksCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBTa1NjYWxhclRvRmxvYXQoZGVzdFJlY3QuaGVpZ2h0KCkpKTsKICAgICBpZiAo
cmVzYW1wbGluZyA9PSBSRVNBTVBMRV9BV0VTT01FKSB7Ci0gICAgICAgIHBhaW50LnNldEZpbHRl
ckJpdG1hcChmYWxzZSk7CiAgICAgICAgIGRyYXdSZXNhbXBsZWRCaXRtYXAoKmNhbnZhcywgcGFp
bnQsIGJpdG1hcCwgc3JjUmVjdCwgZGVzdFJlY3QpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8v
IE5vIHJlc2FtcGxpbmcgbmVjZXNzYXJ5LCB3ZSBjYW4ganVzdCBkcmF3IHRoZSBiaXRtYXAuIFdl
IHdhbnQgdG8KQEAgLTI0MSw3ICsyNDEsNiBAQCBzdGF0aWMgdm9pZCBwYWludFNrQml0bWFwKFBs
YXRmb3JtQ29udGV4dFNraWEqIHBsYXRmb3JtQ29udGV4dCwgY29uc3QgTmF0aXZlSW1hZwogICAg
ICAgICAvLyBpcyBzb21ldGhpbmcgaW50ZXJlc3RpbmcgZ29pbmcgb24gd2l0aCB0aGUgbWF0cml4
IChsaWtlIGEgcm90YXRpb24pLgogICAgICAgICAvLyBOb3RlOiBmb3Igc2VyaWFsaXphdGlvbiwg
d2Ugd2lsbCB3YW50IHRvIHN1YnNldCB0aGUgYml0bWFwIGZpcnN0IHNvCiAgICAgICAgIC8vIHdl
IGRvbid0IHNlbmQgZXh0cmEgcGl4ZWxzLgotICAgICAgICBwYWludC5zZXRGaWx0ZXJCaXRtYXAo
cmVzYW1wbGluZyA9PSBSRVNBTVBMRV9MSU5FQVIpOwogICAgICAgICBjYW52YXMtPmRyYXdCaXRt
YXBSZWN0KGJpdG1hcCwgJnNyY1JlY3QsIGRlc3RSZWN0LCAmcGFpbnQpOwogICAgIH0KIH0KZGlm
ZiAtLWdpdCBhL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lQ2hyb21pdW1XaW4uY3BwIGIv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVDaHJvbWl1bVdpbi5jcHAKaW5kZXggOWU1OWFj
OS4uYmU3NzIwNCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVDaHJv
bWl1bVdpbi5jcHAKKysrIGIvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVDaHJvbWl1bVdp
bi5jcHAKQEAgLTM4LDcgKzM4LDcgQEAKICNpbmNsdWRlICJSZW5kZXJCb3guaCIKICNpbmNsdWRl
ICJTY3JvbGxiYXJUaGVtZS5oIgogI2luY2x1ZGUgIlNraWFVdGlscy5oIgotI2luY2x1ZGUgIlRo
ZW1lSGVscGVyQ2hyb21pdW1XaW4uaCIKKyNpbmNsdWRlICJUcmFuc3BhcmVuY3lXaW4uaCIKICNp
bmNsdWRlICJVc2VyQWdlbnRTdHlsZVNoZWV0cy5oIgogI2luY2x1ZGUgIldpbmRvd3NWZXJzaW9u
LmgiCiAKQEAgLTUzLDYgKzUzLDQ3IEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorbmFtZXNw
YWNlIHsKKworYm9vbCBjYW52YXNIYXNNdWx0aXBsZUxheWVycyhjb25zdCBTa0NhbnZhcyogY2Fu
dmFzKQoreworICAgIFNrQ2FudmFzOjpMYXllckl0ZXIgaXRlcihjb25zdF9jYXN0PFNrQ2FudmFz
Kj4oY2FudmFzKSwgZmFsc2UpOworICAgIGl0ZXIubmV4dCgpOyAgLy8gVGhlcmUgaXMgYWx3YXlz
IGF0IGxlYXN0IG9uZSBsYXllci4KKyAgICByZXR1cm4gIWl0ZXIuZG9uZSgpOyAgLy8gVGhlcmUg
aXMgPiAxIGxheWVyIGlmIHRoZSB0aGUgaXRlcmF0b3IgY2FuIHN0aWwgYWR2YW5jZS4KK30KKwor
Y2xhc3MgVGhlbWVQYWludGVyIDogcHVibGljIFRyYW5zcGFyZW5jeVdpbiB7CitwdWJsaWM6Cisg
ICAgVGhlbWVQYWludGVyKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgSW50UmVjdCYg
cikKKyAgICB7CisgICAgICAgIFRyYW5zZm9ybU1vZGUgdHJhbnNmb3JtTW9kZSA9IGdldFRyYW5z
Zm9ybU1vZGUoY29udGV4dC0+Z2V0Q1RNKCkpOworICAgICAgICBpbml0KGNvbnRleHQsIGdldExh
eWVyTW9kZShjb250ZXh0LCB0cmFuc2Zvcm1Nb2RlKSwgdHJhbnNmb3JtTW9kZSwgcik7CisgICAg
fQorCitwcml2YXRlOgorICAgIHN0YXRpYyBMYXllck1vZGUgZ2V0TGF5ZXJNb2RlKEdyYXBoaWNz
Q29udGV4dCogY29udGV4dCwgVHJhbnNmb3JtTW9kZSB0cmFuc2Zvcm1Nb2RlKQorICAgIHsKKyAg
ICAgICAgaWYgKGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5pc0RyYXdpbmdUb0ltYWdlQnVm
ZmVyKCkpICAvLyBNaWdodCBoYXZlIHRyYW5zcGFyZW50IGJhY2tncm91bmQuCisgICAgICAgICAg
ICByZXR1cm4gV2hpdGVMYXllcjsKKyAgICAgICAgZWxzZSBpZiAoY2FudmFzSGFzTXVsdGlwbGVM
YXllcnMoY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpKSkgIC8vIE5lZWRzIGFu
dGlhbGlhc2luZyBoZWxwLgorICAgICAgICAgICAgcmV0dXJuIE9wYXF1ZUNvbXBvc2l0ZUxheWVy
OworICAgICAgICBlbHNlICAvLyBOb3RoaW5nIGludGVyZXN0aW5nLgorICAgICAgICAgICAgcmV0
dXJuIHRyYW5zZm9ybU1vZGUgPT0gS2VlcFRyYW5zZm9ybSA/IE5vTGF5ZXIgOiBPcGFxdWVDb21w
b3NpdGVMYXllcjsKKyAgICB9CisKKyAgICBzdGF0aWMgVHJhbnNmb3JtTW9kZSBnZXRUcmFuc2Zv
cm1Nb2RlKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBtYXRyaXgpCisgICAgeworICAgICAg
ICBpZiAobWF0cml4LmIoKSAhPSAwIHx8IG1hdHJpeC5jKCkgIT0gMCkgIC8vIFNrZXcuCisgICAg
ICAgICAgICByZXR1cm4gVW50cmFuc2Zvcm07CisgICAgICAgIGVsc2UgaWYgKG1hdHJpeC5hKCkg
IT0gMS4wIHx8IG1hdHJpeC5kKCkgIT0gMS4wKSAgLy8gU2NhbGUuCisgICAgICAgICAgICByZXR1
cm4gU2NhbGVUcmFuc2Zvcm07CisgICAgICAgIGVsc2UgIC8vIE5vdGhpbmcgaW50ZXJlc3Rpbmcu
CisgICAgICAgICAgICByZXR1cm4gS2VlcFRyYW5zZm9ybTsKKyAgICB9Cit9OworCit9ICAvLyBu
YW1lc3BhY2UKKwogc3RhdGljIHZvaWQgZ2V0Tm9uQ2xpZW50TWV0cmljcyhOT05DTElFTlRNRVRS
SUNTKiBtZXRyaWNzKSB7CiAgICAgc3RhdGljIFVJTlQgc2l6ZSA9IFdlYkNvcmU6OmlzVmlzdGFP
ck5ld2VyKCkgPwogICAgICAgICBzaXplb2YoTk9OQ0xJRU5UTUVUUklDUykgOiBOT05DTElFTlRN
RVRSSUNTX1NJWkVfUFJFX1ZJU1RBOwpAQCAtMzczLDEyICs0MTQsMTIgQEAgYm9vbCBSZW5kZXJU
aGVtZUNocm9taXVtV2luOjpwYWludEJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRl
ck9iamVjdDo6UGEKIHsKICAgICBjb25zdCBUaGVtZURhdGEmIHRoZW1lRGF0YSA9IGdldFRoZW1l
RGF0YShvKTsKIAotICAgIFdlYkNvcmU6OlRoZW1lSGVscGVyV2luIGhlbHBlcihpLmNvbnRleHQs
IHIpOwotICAgIENocm9taXVtQnJpZGdlOjpwYWludEJ1dHRvbihoZWxwZXIuY29udGV4dCgpLAor
ICAgIFdlYkNvcmU6OlRoZW1lUGFpbnRlciBwYWludGVyKGkuY29udGV4dCwgcik7CisgICAgQ2hy
b21pdW1CcmlkZ2U6OnBhaW50QnV0dG9uKHBhaW50ZXIuY29udGV4dCgpLAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB0aGVtZURhdGEubV9wYXJ0LAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB0aGVtZURhdGEubV9zdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdGhlbWVEYXRhLm1fY2xhc3NpY1N0YXRlLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBoZWxwZXIucmVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgcGFpbnRlci5kcmF3UmVjdCgpKTsKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTQ0MSwx
MiArNDgyLDEyIEBAIGJvb2wgUmVuZGVyVGhlbWVDaHJvbWl1bVdpbjo6cGFpbnRNZW51TGlzdChS
ZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6CiAgICAgICAgICAgICAgICAgIHIu
aGVpZ2h0KCkgLSAoc3BhY2luZ1RvcCArIHNwYWNpbmdCb3R0b20pKTsKIAogICAgIC8vIEdldCB0
aGUgY29ycmVjdCB0aGVtZSBkYXRhIGZvciBhIHRleHRmaWVsZCBhbmQgcGFpbnQgdGhlIG1lbnUu
Ci0gICAgV2ViQ29yZTo6VGhlbWVIZWxwZXJXaW4gaGVscGVyKGkuY29udGV4dCwgcmVjdCk7Ci0g
ICAgQ2hyb21pdW1CcmlkZ2U6OnBhaW50TWVudUxpc3QoaGVscGVyLmNvbnRleHQoKSwKKyAgICBX
ZWJDb3JlOjpUaGVtZVBhaW50ZXIgcGFpbnRlcihpLmNvbnRleHQsIHJlY3QpOworICAgIENocm9t
aXVtQnJpZGdlOjpwYWludE1lbnVMaXN0KHBhaW50ZXIuY29udGV4dCgpLAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIENQX0RST1BET1dOQlVUVE9OLAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGRldGVybWluZVN0YXRlKG8pLAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGRldGVybWluZUNsYXNzaWNTdGF0ZShvKSwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBoZWxwZXIucmVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBwYWludGVyLmRyYXdSZWN0KCkpOwogICAgIHJldHVybiBmYWxzZTsKIH0K
IApAQCAtNTYzLDkgKzYwNCw5IEBAIFRoZW1lRGF0YSBSZW5kZXJUaGVtZUNocm9taXVtV2luOjpn
ZXRUaGVtZURhdGEoUmVuZGVyT2JqZWN0KiBvKQogfQogCiBib29sIFJlbmRlclRoZW1lQ2hyb21p
dW1XaW46OnBhaW50VGV4dEZpZWxkSW50ZXJuYWwoUmVuZGVyT2JqZWN0KiBvLAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZW5kZXJPYmplY3Q6OlBh
aW50SW5mbyYgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y29uc3QgSW50UmVjdCYgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgYm9vbCBkcmF3RWRnZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIGksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW50
UmVjdCYgciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBib29sIGRyYXdFZGdlcykKIHsKICAgICAvLyBOYXN0eSBoYWNrIHRvIG1ha2UgdXMgbm90
IHBhaW50IHRoZSBib3JkZXIgb24gdGV4dCBmaWVsZHMgd2l0aCBhCiAgICAgLy8gYm9yZGVyLXJh
ZGl1cy4gV2Via2l0IHBhaW50cyBlbGVtZW50cyB3aXRoIGJvcmRlci1yYWRpdXMgZm9yIHVzLgpA
QCAtNTc3LDEyICs2MTgsMTIgQEAgYm9vbCBSZW5kZXJUaGVtZUNocm9taXVtV2luOjpwYWludFRl
eHRGaWVsZEludGVybmFsKFJlbmRlck9iamVjdCogbywKIAogICAgIGNvbnN0IFRoZW1lRGF0YSYg
dGhlbWVEYXRhID0gZ2V0VGhlbWVEYXRhKG8pOwogCi0gICAgV2ViQ29yZTo6VGhlbWVIZWxwZXJX
aW4gaGVscGVyKGkuY29udGV4dCwgcik7Ci0gICAgQ2hyb21pdW1CcmlkZ2U6OnBhaW50VGV4dEZp
ZWxkKGhlbHBlci5jb250ZXh0KCksCisgICAgV2ViQ29yZTo6VGhlbWVQYWludGVyIHBhaW50ZXIo
aS5jb250ZXh0LCByKTsKKyAgICBDaHJvbWl1bUJyaWRnZTo6cGFpbnRUZXh0RmllbGQocGFpbnRl
ci5jb250ZXh0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lRGF0
YS5tX3BhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lRGF0YS5t
X3N0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZURhdGEubV9j
bGFzc2ljU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBlci5y
ZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50ZXIuZHJhd1Jl
Y3QoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby0+c3R5bGUoKS0+YmFj
a2dyb3VuZENvbG9yKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUs
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdFZGdlcyk7Cg==
</data>
<flag name="review"
          id="13660"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>28038</attachid>
            <date>2009-02-26 14:13:43 -0800</date>
            <delta_ts>2009-02-26 14:19:02 -0800</delta_ts>
            <desc>Patch v3</desc>
            <filename>trans3.diff</filename>
            <type>text/plain</type>
            <size>32309</size>
            <attacher name="Brett Wilson (Google)">brettw</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
NGNkZTFlMC4uOGMzZmQ1NCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw2OCBAQAorMjAwOS0wMi0yNiAgQnJldHQgV2lsc29u
ICA8YnJldHR3QGNocm9taXVtLm9yZz4KKworICAgICAgICBGaXggV2luZG93cyB0cmFuc3BhcmVu
Y3kgZm9yIHRoZSBDaHJvbWl1bSBwb3J0LiBJbXBsZW1lbnQgYSBoZWxwZXIKKyAgICAgICAgY2xh
c3MgZm9yIGhhbmRsaW5nIHRyYW5zcGFyZW5jeSBvbiBXaW5kb3dzLiBJdCBhbGxvd3Mgc2VtaXRy
YW5zcGFyZW50CisgICAgICAgIENsZWFyVHlwZSBhbmQgc2VtaXRyYW5zcGFyZW50IGZvcm0gY29u
dHJvbHMgYnkgbWFraW5nIG5ldyBsYXllcnMgaW4gdGhlCisgICAgICAgIGJhY2tncm91bmQuCisK
KyAgICAgICAgSXQgYWxzbyByZXBsYWNlcyB0aGUgIlRoZW1lSGVscGVyIiB3aGljaCBhbGxvd3Mg
YmV0dGVyCisgICAgICAgIHNjYWxpbmcgYW5kIHRyYW5zZm9ybXMgb24gV2luZG93cyBmb3JtIGNv
bnRyb2xzLiBJbiBhZGRpdGlvbiB0byB0aGUKKyAgICAgICAgZnVuY3Rpb25hbGl0eSB0aGF0IHRo
ZSBUaGVtZUhlbHBlciBkaWQsIGJ1dCBhZGRpdGlvbmFsbHkgaGFuZGxlcyB0aGUKKyAgICAgICAg
YW50aWFsaWFzaW5nIHByb3Blcmx5IHNvIHRoYXQgdGhlIGZvcm0gY29udHJvbHMgYXJlbid0IGNv
bXBvc2l0ZWQgb24gYQorICAgICAgICB3aGl0ZSBzcXVhcmUuCisKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI0MTAxCisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgRXJpYyBTZWlkZWwuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9G
b250Q2hyb21pdW1XaW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6KToKKyAgICAgICAgKFdlYkNv
cmU6OlRyYW5zcGFyZW5jeUF3YXJlRm9udFBhaW50ZXI6OlRyYW5zcGFyZW5jeUF3YXJlRm9udFBh
aW50ZXI6OlRyYW5zcGFyZW5jeUF3YXJlRm9udFBhaW50ZXIpOgorICAgICAgICAoV2ViQ29yZTo6
VHJhbnNwYXJlbmN5QXdhcmVGb250UGFpbnRlcjo6VHJhbnNwYXJlbmN5QXdhcmVGb250UGFpbnRl
cjo6aW5pdGlhbGl6ZUZvckdESSk6CisgICAgICAgIChXZWJDb3JlOjpUcmFuc3BhcmVuY3lBd2Fy
ZUZvbnRQYWludGVyOjpUcmFuc3BhcmVuY3lBd2FyZUZvbnRQYWludGVyOjp+VHJhbnNwYXJlbmN5
QXdhcmVGb250UGFpbnRlcik6CisgICAgICAgIChXZWJDb3JlOjpUcmFuc3BhcmVuY3lBd2FyZUZv
bnRQYWludGVyOjpUcmFuc3BhcmVuY3lBd2FyZUZvbnRQYWludGVyOjpkcmF3R2x5cGhzKToKKyAg
ICAgICAgKFdlYkNvcmU6OkZvbnQ6OmRyYXdHbHlwaHMpOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL1RoZW1lSGVscGVyQ2hyb21pdW1XaW4uY3BwOgorICAgICAgICAqIHBs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1RoZW1lSGVscGVyQ2hyb21pdW1XaW4uaDoKKyAgICAg
ICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9UcmFuc3BhcmVuY3lXaW4uY3BwOiBBZGRl
ZC4KKyAgICAgICAgKFdlYkNvcmU6Oik6CisgICAgICAgIChXZWJDb3JlOjpUcmFuc3BhcmVuY3lX
aW46Ok93bmVkQnVmZmVyczo6T3duZWRCdWZmZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5z
cGFyZW5jeVdpbjo6T3duZWRCdWZmZXJzOjpkZXN0Qml0bWFwKToKKyAgICAgICAgKFdlYkNvcmU6
OlRyYW5zcGFyZW5jeVdpbjo6T3duZWRCdWZmZXJzOjpyZWZlcmVuY2VCaXRtYXApOgorICAgICAg
ICAoV2ViQ29yZTo6VHJhbnNwYXJlbmN5V2luOjpPd25lZEJ1ZmZlcnM6OmNhbkhhbmRsZVNpemUp
OgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNwYXJlbmN5V2luOjpUcmFuc3BhcmVuY3lXaW4pOgor
ICAgICAgICAoV2ViQ29yZTo6VHJhbnNwYXJlbmN5V2luOjp+VHJhbnNwYXJlbmN5V2luKToKKyAg
ICAgICAgKFdlYkNvcmU6OlRyYW5zcGFyZW5jeVdpbjo6aW5pdCk6CisgICAgICAgIChXZWJDb3Jl
OjpUcmFuc3BhcmVuY3lXaW46OmNvbXB1dGVMYXllclNpemUpOgorICAgICAgICAoV2ViQ29yZTo6
VHJhbnNwYXJlbmN5V2luOjpzZXR1cExheWVyKToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zcGFy
ZW5jeVdpbjo6c2V0dXBMYXllckZvck5vTGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNw
YXJlbmN5V2luOjpzZXR1cExheWVyRm9yT3BhcXVlQ29tcG9zaXRlTGF5ZXIpOgorICAgICAgICAo
V2ViQ29yZTo6VHJhbnNwYXJlbmN5V2luOjpzZXR1cExheWVyRm9yVGV4dENvbXBvc2l0ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpUcmFuc3BhcmVuY3lXaW46OnNldHVwTGF5ZXJGb3JXaGl0ZUxheWVy
KToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zcGFyZW5jeVdpbjo6c2V0dXBUcmFuc2Zvcm0pOgor
ICAgICAgICAoV2ViQ29yZTo6VHJhbnNwYXJlbmN5V2luOjpzZXR1cFRyYW5zZm9ybUZvcktlZXBU
cmFuc2Zvcm0pOgorICAgICAgICAoV2ViQ29yZTo6VHJhbnNwYXJlbmN5V2luOjpzZXR1cFRyYW5z
Zm9ybUZvclVudHJhbnNmb3JtKToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zcGFyZW5jeVdpbjo6
c2V0dXBUcmFuc2Zvcm1Gb3JTY2FsZVRyYW5zZm9ybSk6CisgICAgICAgIChXZWJDb3JlOjpUcmFu
c3BhcmVuY3lXaW46OnNldFRleHRDb21wb3NpdGVDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpU
cmFuc3BhcmVuY3lXaW46OmluaXRpYWxpemVOZXdDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6
OlRyYW5zcGFyZW5jeVdpbjo6Y29tcG9zaXRlT3BhcXVlQ29tcG9zaXRlKToKKyAgICAgICAgKFdl
YkNvcmU6OlRyYW5zcGFyZW5jeVdpbjo6Y29tcG9zaXRlVGV4dENvbXBvc2l0ZSk6CisgICAgICAg
IChXZWJDb3JlOjpUcmFuc3BhcmVuY3lXaW46Om1ha2VMYXllck9wYXF1ZSk6CisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vVHJhbnNwYXJlbmN5V2luLmg6IEFkZGVkLgorICAg
ICAgICAoV2ViQ29yZTo6VHJhbnNwYXJlbmN5V2luOjopOgorICAgICAgICAoV2ViQ29yZTo6VHJh
bnNwYXJlbmN5V2luOjpjb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zcGFyZW5jeVdp
bjo6cGxhdGZvcm1Db250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OlRyYW5zcGFyZW5jeVdpbjo6
ZHJhd1JlY3QpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NDb250
ZXh0U2tpYS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmVuZFRyYW5z
cGFyZW5jeUxheWVyKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ltYWdlU2tp
YS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpwYWludFNrQml0bWFwKToKKyAgICAgICAgKiByZW5k
ZXJpbmcvUmVuZGVyVGhlbWVDaHJvbWl1bVdpbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjopOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVDaHJvbWl1bVdpbjo6cGFpbnRCdXR0b24pOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVDaHJvbWl1bVdpbjo6cGFpbnRNZW51TGlzdCk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUNocm9taXVtV2luOjpwYWludFRleHRGaWVs
ZEludGVybmFsKToKKwogMjAwOS0wMi0yNSAgT2phbiBWYWZhaSAgPG9qYW5AY2hyb21pdW0ub3Jn
PiBhbmQgRXJpYyBTZWlkZWwgPGVyaWNAd2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBi
eSBEYXZlIEh5YXR0LgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJv
bWl1bS9Gb250Q2hyb21pdW1XaW4uY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJv
bWl1bS9Gb250Q2hyb21pdW1XaW4uY3BwCmluZGV4IGQ1NjI2YTQuLjQzYzA2OGIgMTAwNjQ0Ci0t
LSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udENocm9taXVtV2luLmNw
cAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRDaHJvbWl1bVdp
bi5jcHAKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlICJTaW1wbGVGb250RGF0YS5oIgogI2lu
Y2x1ZGUgIlNraWFGb250V2luLmgiCiAjaW5jbHVkZSAiU2tpYVV0aWxzLmgiCisjaW5jbHVkZSAi
VHJhbnNwYXJlbmN5V2luLmgiCiAjaW5jbHVkZSAiVW5pc2NyaWJlSGVscGVyVGV4dFJ1bi5oIgog
CiAjaW5jbHVkZSAic2tpYS9leHQvcGxhdGZvcm1fY2FudmFzX3dpbi5oIgpAQCAtNDgsNiArNDks
MTcxIEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorbmFtZXNwYWNlIHsKKworYm9vbCBjYW52
YXNIYXNNdWx0aXBsZUxheWVycyhjb25zdCBTa0NhbnZhcyogY2FudmFzKQoreworICAgIFNrQ2Fu
dmFzOjpMYXllckl0ZXIgaXRlcihjb25zdF9jYXN0PFNrQ2FudmFzKj4oY2FudmFzKSwgZmFsc2Up
OworICAgIGl0ZXIubmV4dCgpOyAgLy8gVGhlcmUgaXMgYWx3YXlzIGF0IGxlYXN0IG9uZSBsYXll
ci4KKyAgICByZXR1cm4gIWl0ZXIuZG9uZSgpOyAgLy8gVGhlcmUgaXMgPiAxIGxheWVyIGlmIHRo
ZSB0aGUgaXRlcmF0b3IgY2FuIHN0aWwgYWR2YW5jZS4KK30KKworLy8gRXN0aW1hdGVzIHRoZSBi
b3VuZGluZyBib3ggb2YgdGhlIGdpdmVuIHRleHQuIFRoaXMgaXMgY29waWVkIGZyb20KKy8vIEZv
bnRDR1dpbi5jcHAsIGl0IGlzIHBvc3NpYmxlLCBidXQgYSBsb3QgbW9yZSB3b3JrLCB0byBnZXQg
dGhlIHByZWNpZGUKKy8vIGJvdW5kcy4KK0ludFJlY3QgZXN0aW1hdGVUZXh0Qm91bmRzKGNvbnN0
IFNpbXBsZUZvbnREYXRhKiBmb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg
R2x5cGhCdWZmZXImIGdseXBoQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50
IGZyb20sIGludCBudW1HbHlwaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBG
bG9hdFBvaW50JiBwb2ludCkKK3sKKyAgICBpbnQgdG90YWxXaWR0aCA9IDA7CisgICAgZm9yIChp
bnQgaSA9IDA7IGkgPCBudW1HbHlwaHM7IGkrKykKKyAgICAgICAgdG90YWxXaWR0aCArPSBscm91
bmRmKGdseXBoQnVmZmVyLmFkdmFuY2VBdChmcm9tICsgaSkpOworCisgICAgcmV0dXJuIEludFJl
Y3QocG9pbnQueCgpIC0gKGZvbnQtPmFzY2VudCgpICsgZm9udC0+ZGVzY2VudCgpKSAvIDIsCisg
ICAgICAgICAgICAgICAgICAgcG9pbnQueSgpIC0gZm9udC0+YXNjZW50KCkgLSBmb250LT5saW5l
R2FwKCksCisgICAgICAgICAgICAgICAgICAgdG90YWxXaWR0aCArIGZvbnQtPmFzY2VudCgpICsg
Zm9udC0+ZGVzY2VudCgpLAorICAgICAgICAgICAgICAgICAgIGZvbnQtPmxpbmVTcGFjaW5nKCkp
OyAKK30KKworY2xhc3MgVHJhbnNwYXJlbmN5QXdhcmVGb250UGFpbnRlciB7CitwdWJsaWM6Cisg
ICAgVHJhbnNwYXJlbmN5QXdhcmVGb250UGFpbnRlcihHcmFwaGljc0NvbnRleHQqIGNvbnRleHQs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaW1wbGVGb250RGF0YSog
Zm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdseXBoQnVmZmVy
JiBnbHlwaEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcm9t
LCBpbnQgbnVtR2x5cGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg
RmxvYXRQb2ludCYgcG9pbnQpOworICAgIFRyYW5zcGFyZW5jeUF3YXJlRm9udFBhaW50ZXIoR3Jh
cGhpY3NDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnQpOworICAgIH5UcmFuc3BhcmVuY3lBd2FyZUZvbnRQ
YWludGVyKCk7CisKKyAgICAvLyBEcmF3cyB0aGUgcGFydGlhbCBzdHJpbmcgb2YgZ2x5cGhzLCBz
dGFydGluZyBhdCB8c3RhcnRBZHZhbmNlfCB0byB0aGUKKyAgICAvLyBsZWZ0IG9mIG1fcG9pbnQu
IFdlIGV4cHJlc3MgaXQgdGhpcyB3YXkgc28gdGhhdCBpZiB3ZSdyZSB1c2luZyB0aGUgU2tpYQor
ICAgIC8vIGRyYXdpbmcgcGF0aCB3ZSBjYW4gdXNlIGZsb2F0aW5nLXBvaW50IHBvc2l0aW9uaW5n
LCBldmVuIHRob3VnaCB3ZSBoYXZlCisgICAgLy8gdG8gdXNlIGludGVnZXIgcG9zaXRpb25pbmcg
aW4gdGhlIEdESSBwYXRoLgorICAgIGJvb2wgZHJhd0dseXBocyhpbnQgbnVtR2x5cGhzLCBjb25z
dCBXT1JEKiBnbHlwaHMsIGNvbnN0IGludCogYWR2YW5jZXMsCisgICAgICAgICAgICAgICAgICAg
IGludCBzdGFydEFkdmFuY2UpIGNvbnN0OworCitwcml2YXRlOgorICAgIC8vIENhbGwgd2hlbiB3
ZSdyZSB1c2luZyBHREkgbW9kZSB0byBpbml0aWFsaXplIHRoZSBUcmFuc3BhcmVuY3lXaW4gdG8g
aGVscAorICAgIC8vIHVzIGRyYXcgR0RJIHRleHQuCisgICAgdm9pZCBpbml0aWFsaXplRm9yR0RJ
KGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZlciwgaW50IGZyb20sIGludCBudW1HbHlwaHMp
OworCisgICAgLy8gVXNlIHRoZSBjb250ZXh0IGZyb20gdGhlIHRyYW5zcGFyZW5jeSBoZWxwZXIg
d2hlbiBkcmF3aW5nIHdpdGggR0RJLiBJdAorICAgIC8vIG1heSBwb2ludCB0byBhIHRlbXBvcmFy
eSBvbmUuCisgICAgR3JhcGhpY3NDb250ZXh0KiBtX2dyYXBoaWNzQ29udGV4dDsKKyAgICBQbGF0
Zm9ybUdyYXBoaWNzQ29udGV4dCogbV9wbGF0Zm9ybUNvbnRleHQ7CisKKyAgICBjb25zdCBTaW1w
bGVGb250RGF0YSogbV9mb250OworICAgIEZsb2F0UG9pbnQgbV9wb2ludDsKKworICAgIC8vIFNl
dCB3aGVuIFdpbmRvd3MgY2FuIGhhbmRsZSB0aGUgdHlwZSBvZiBkcmF3aW5nIHdlJ3JlIGRvaW5n
LgorICAgIGJvb2wgbV91c2VHREk7CisKKyAgICAvLyBUaGVzZSBtZW1iZXJzIGFyZSB2YWxpZCBv
bmx5IHdoZW4gbV91c2VHREkgaXMgc2V0LgorICAgIEhEQyBtX2hkYzsKKyAgICBIR0RJT0JKIG1f
b2xkRm9udDsgIC8vIEZvciByZXN0b3JpbmcgdGhlIERDIHRvIGl0cyBvcmlnaW5hbCBzdGF0ZS4K
KyAgICBUcmFuc3BhcmVuY3lXaW4gbV90cmFuc3BhcmVuY3k7CisgICAgYm9vbCBtX2NyZWF0ZWRU
cmFuc3BhcmVuY3lMYXllcjsgIC8vIFdlIGNyZWF0ZWQgYSBsYXllciB0byBnaXZlIHRoZSBmb250
IHNvbWUgYWxwaGEuCit9OworCitUcmFuc3BhcmVuY3lBd2FyZUZvbnRQYWludGVyOjpUcmFuc3Bh
cmVuY3lBd2FyZUZvbnRQYWludGVyKAorICAgIEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwKKyAg
ICBjb25zdCBTaW1wbGVGb250RGF0YSogZm9udCwKKyAgICBjb25zdCBHbHlwaEJ1ZmZlciYgZ2x5
cGhCdWZmZXIsCisgICAgaW50IGZyb20sIGludCBudW1HbHlwaHMsCisgICAgY29uc3QgRmxvYXRQ
b2ludCYgcG9pbnQpCisgICAgOiBtX2dyYXBoaWNzQ29udGV4dChjb250ZXh0KQorICAgICwgbV9w
bGF0Zm9ybUNvbnRleHQoY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCkpCisgICAgLCBtX2ZvbnQo
Zm9udCkKKyAgICAsIG1fcG9pbnQocG9pbnQpCisgICAgLCBtX3VzZUdESSh3aW5kb3dzQ2FuSGFu
ZGxlVGV4dERyYXdpbmcoY29udGV4dCkpCisgICAgLCBtX2hkYygwKQorICAgICwgbV9vbGRGb250
KDApCisgICAgLCBtX2NyZWF0ZWRUcmFuc3BhcmVuY3lMYXllcihmYWxzZSkKK3sKKyAgICBpZiAo
bV91c2VHREkpCisgICAgICAgIGluaXRpYWxpemVGb3JHREkoZ2x5cGhCdWZmZXIsIGZyb20sIG51
bUdseXBocyk7Cit9CisKK3ZvaWQgVHJhbnNwYXJlbmN5QXdhcmVGb250UGFpbnRlcjo6aW5pdGlh
bGl6ZUZvckdESShjb25zdCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZmZXIsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyb20sIGludCBudW1H
bHlwaHMpCit7CisgICAgU2tDb2xvciBjb2xvciA9IG1fcGxhdGZvcm1Db250ZXh0LT5lZmZlY3Rp
dmVGaWxsQ29sb3IoKTsKKyAgICBpZiAoU2tDb2xvckdldEEoY29sb3IpICE9IDB4RkYpIHsKKyAg
ICAgICAgLy8gV2hlbiB0aGUgZm9udCBoYXMgc29tZSB0cmFuc3BhcmVuY3ksIGFwcGx5IGl0IGJ5
IGNyZWF0aW5nIGEgbmV3CisgICAgICAgIC8vIHRyYW5zcGFyZW5jeSBsYXllciB3aXRoIHRoYXQg
b3BhY2l0eSBhcHBsaWVkLgorICAgICAgICBtX2NyZWF0ZWRUcmFuc3BhcmVuY3lMYXllciA9IHRy
dWU7CisgICAgICAgIG1fZ3JhcGhpY3NDb250ZXh0LT5iZWdpblRyYW5zcGFyZW5jeUxheWVyKFNr
Q29sb3JHZXRBKGNvbG9yKSAvIDI1NS4wZik7CisgICAgICAgIC8vIFRoZSBjb2xvciBzaG91bGQg
YmUgb3BhcXVlIG5vdy4KKyAgICAgICAgY29sb3IgPSBTa0NvbG9yU2V0UkdCKFNrQ29sb3JHZXRS
KGNvbG9yKSwgU2tDb2xvckdldEcoY29sb3IpLCBTa0NvbG9yR2V0Qihjb2xvcikpOworICAgIH0K
KworICAgIFRyYW5zcGFyZW5jeVdpbjo6TGF5ZXJNb2RlIGxheWVyTW9kZTsKKyAgICBJbnRSZWN0
IGxheWVyUmVjdDsKKyAgICBpZiAobV9wbGF0Zm9ybUNvbnRleHQtPmlzRHJhd2luZ1RvSW1hZ2VC
dWZmZXIoKSkgeworICAgICAgICAvLyBBc3N1bWUgaWYgd2UncmUgZHJhd2luZyB0byBhbiBpbWFn
ZSBidWZmZXIgdGhhdCB0aGUgYmFja2dyb3VuZAorICAgICAgICAvLyBpcyBub3Qgb3BhcXVlIGFu
ZCB3ZSBoYXZlIHRvIHVuZG8gQ2xlYXJUeXBlLiBXZSBtYXkgd2FudCB0bworICAgICAgICAvLyBl
bmhhbmNlIHRoaXMgdG8gYWN0dWFsbHkgY2hlY2ssIHNpbmNlIGl0IHdpbGwgb2Z0ZW4gYmUgb3Bh
cXVlCisgICAgICAgIC8vIGFuZCB3ZSBjb3VsZCBkbyBDbGVhclR5cGUgaW4gdGhhdCBjYXNlLgor
ICAgICAgICBsYXllck1vZGUgPSBUcmFuc3BhcmVuY3lXaW46OlRleHRDb21wb3NpdGU7CisgICAg
ICAgIGxheWVyUmVjdCA9IGVzdGltYXRlVGV4dEJvdW5kcyhtX2ZvbnQsIGdseXBoQnVmZmVyLCBm
cm9tLCBudW1HbHlwaHMsIG1fcG9pbnQpOworCisgICAgICAgIC8vIFRoZSB0cmFuc3BhcmVuY3kg
aGVscGVyIHJlcXVpcmVzIHRoYXQgd2UgZHJhdyB0ZXh0IGluIGJsYWNrIGluCisgICAgICAgIC8v
IHRoaXMgbW9kZSBhbmQgaXQgd2lsbCBhcHBseSB0aGUgY29sb3IuCisgICAgICAgIG1fdHJhbnNw
YXJlbmN5LnNldFRleHRDb21wb3NpdGVDb2xvcihjb2xvcik7CisgICAgICAgIGNvbG9yID0gU2tD
b2xvclNldFJHQigwLCAwLCAwKTsKKyAgICB9IGVsc2UgaWYgKGNhbnZhc0hhc011bHRpcGxlTGF5
ZXJzKG1fcGxhdGZvcm1Db250ZXh0LT5jYW52YXMoKSkpIHsKKyAgICAgICAgLy8gV2hlbiB3ZSdy
ZSBkcmF3aW5nIGEgd2ViIHBhZ2UsIHdlIGtub3cgdGhlIGJhY2tncm91bmQgaXMgb3BhcXVlLAor
ICAgICAgICAvLyBidXQgaWYgd2UncmUgZHJhd2luZyB0byBhIGxheWVyLCB3ZSBzdGlsbCBuZWVk
IGV4dHJhIHdvcmsuCisgICAgICAgIGxheWVyTW9kZSA9IFRyYW5zcGFyZW5jeVdpbjo6T3BhcXVl
Q29tcG9zaXRlTGF5ZXI7CisgICAgICAgIGxheWVyUmVjdCA9IGVzdGltYXRlVGV4dEJvdW5kcyht
X2ZvbnQsIGdseXBoQnVmZmVyLCBmcm9tLCBudW1HbHlwaHMsIG1fcG9pbnQpOworICAgIH0gZWxz
ZSB7CisgICAgICAgIC8vIENvbW1vbiBjYXNlIG9mIGRyYXdpbmcgb250byB0aGUgYm90dG9tIGxh
eWVyIG9mIGEgd2ViIHBhZ2U6IHdlCisgICAgICAgIC8vIGtub3cgZXZlcnl0aGluZyBpcyBvcGFx
dWUgc28gZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgorICAgICAgICBsYXllck1v
ZGUgPSBUcmFuc3BhcmVuY3lXaW46Ok5vTGF5ZXI7CisgICAgfQorICAgIG1fdHJhbnNwYXJlbmN5
LmluaXQobV9ncmFwaGljc0NvbnRleHQsIGxheWVyTW9kZSwgVHJhbnNwYXJlbmN5V2luOjpLZWVw
VHJhbnNmb3JtLCBsYXllclJlY3QpOworCisgICAgLy8gU2V0IHVwIHRoZSBEQywgdXNpbmcgdGhl
IG9uZSBmcm9tIHRoZSB0cmFuc3BhcmVuY3kgaGVscGVyLgorICAgIG1faGRjID0gbV90cmFuc3Bh
cmVuY3kucGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpLT5iZWdpblBsYXRmb3JtUGFpbnQoKTsK
KyAgICBtX29sZEZvbnQgPSA6OlNlbGVjdE9iamVjdChtX2hkYywgbV9mb250LT5wbGF0Zm9ybURh
dGEoKS5oZm9udCgpKTsKKyAgICBTZXRUZXh0Q29sb3IobV9oZGMsIHNraWE6OlNrQ29sb3JUb0NP
TE9SUkVGKGNvbG9yKSk7CisgICAgU2V0QmtNb2RlKG1faGRjLCBUUkFOU1BBUkVOVCk7Cit9CisK
K1RyYW5zcGFyZW5jeUF3YXJlRm9udFBhaW50ZXI6On5UcmFuc3BhcmVuY3lBd2FyZUZvbnRQYWlu
dGVyKCkKK3sKKyAgICBpZiAoIW1fdXNlR0RJKQorICAgICAgICByZXR1cm47ICAvLyBOb3RoaW5n
IHRvIGRvLgorICAgIGlmIChtX2NyZWF0ZWRUcmFuc3BhcmVuY3lMYXllcikKKyAgICAgICAgbV9n
cmFwaGljc0NvbnRleHQtPmVuZFRyYW5zcGFyZW5jeUxheWVyKCk7CisKKyAgICA6OlNlbGVjdE9i
amVjdChtX2hkYywgbV9vbGRGb250KTsKKyAgICBtX3BsYXRmb3JtQ29udGV4dC0+Y2FudmFzKCkt
PmVuZFBsYXRmb3JtUGFpbnQoKTsKK30KKworYm9vbCBUcmFuc3BhcmVuY3lBd2FyZUZvbnRQYWlu
dGVyOjpkcmF3R2x5cGhzKGludCBudW1HbHlwaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgY29uc3QgV09SRCogZ2x5cGhzLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCogYWR2YW5jZXMsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0QWR2YW5j
ZSkgY29uc3QKK3sKKyAgICBpZiAoIW1fdXNlR0RJKSB7CisgICAgICAgIFNrUG9pbnQgb3JpZ2lu
ID0gbV9wb2ludDsKKyAgICAgICAgb3JpZ2luLmZYICs9IHN0YXJ0QWR2YW5jZTsKKyAgICAgICAg
cmV0dXJuIHBhaW50U2tpYVRleHQobV9wbGF0Zm9ybUNvbnRleHQsIG1fZm9udC0+cGxhdGZvcm1E
YXRhKCkuaGZvbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtR2x5cGhzLCBn
bHlwaHMsIGFkdmFuY2VzLCAwLCAmb3JpZ2luKTsKKyAgICB9CisKKyAgICAvLyBXaW5kb3dzJyBv
cmlnaW4gaXMgdGhlIHRvcC1sZWZ0IG9mIHRoZSBib3VuZGluZyBib3gsIHNvIHdlIGhhdmUKKyAg
ICAvLyB0byBzdWJ0cmFjdCBvZmYgdGhlIGZvbnQgYXNjZW50IHRvIGdldCBpdC4KKyAgICBpbnQg
eCA9IGxyb3VuZGYobV9wb2ludC54KCkgKyBzdGFydEFkdmFuY2UpOworICAgIGludCB5ID0gbHJv
dW5kZihtX3BvaW50LnkoKSAtIG1fZm9udC0+YXNjZW50KCkpOworICAgIHJldHVybiAhIUV4dFRl
eHRPdXQobV9oZGMsIHgsIHksIEVUT19HTFlQSF9JTkRFWCwgMCwgcmVpbnRlcnByZXRfY2FzdDxj
b25zdCB3Y2hhcl90Kj4oJmdseXBoc1swXSksIG51bUdseXBocywgJmFkdmFuY2VzWzBdKTsKK30K
KworfSAgLy8gbmFtZXNwYWNlCisKIHZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFwaGljc0NvbnRl
eHQqIGdyYXBoaWNzQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaW1wbGVG
b250RGF0YSogZm9udCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHbHlwaEJ1ZmZlciYg
Z2x5cGhCdWZmZXIsCkBAIC01NSw2MiArMjIxLDI3IEBAIHZvaWQgRm9udDo6ZHJhd0dseXBocyhH
cmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICBp
bnQgbnVtR2x5cGhzLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIHBv
aW50KSBjb25zdAogewotICAgIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0ID0gZ3Jh
cGhpY3NDb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKLQotICAgIGJvb2wgY2FuVXNlR0RJID0g
d2luZG93c0NhbkhhbmRsZVRleHREcmF3aW5nKGdyYXBoaWNzQ29udGV4dCk7Ci0gICAgYm9vbCBj
cmVhdGVkTGF5ZXIgPSBmYWxzZTsKLQotICAgIGlmIChjYW5Vc2VHREkgJiYgY29udGV4dC0+aXNE
cmF3aW5nVG9JbWFnZUJ1ZmZlcigpKSB7Ci0gICAgICAgIC8vIFdlJ3JlIGRyYXdpbmcgdG8gYW4g
aW1hZ2UgYnVmZmVyIGFuZCBhYm91dCB0byByZW5kZXIgdGV4dCB3aXRoIEdESS4KLSAgICAgICAg
Ly8gV2UgbmVlZCB0byBzdGFydCBhIGxheWVyIGhlcmUsIG90aGVyd2lzZSB0aGUgYWxwaGEgdmFs
dWVzIHJlbmRlcmVkCi0gICAgICAgIC8vIGJ5IEdESSBhcmUgbmV2ZXIgY29ycmVjdGx5IHVwZGF0
ZWQuCi0gICAgICAgIC8vIE5PVEU6IHRoaXMgZG9lc24ndCBoYW5kbGUgY2xlYXIgdHlwZSB3ZWxs
IGFuZCBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuCi0gICAgICAgIC8vIHdlIGhhdmUgYmV0dGVyIHRl
eHQgaGFuZGxpbmcgY29kZS4KLSAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5iZWdpblRyYW5zcGFy
ZW5jeUxheWVyKDEuMCk7Ci0gICAgICAgIGNyZWF0ZWRMYXllciA9IHRydWU7Ci0gICAgfQotCi0g
ICAgLy8gTWF4IGJ1ZmZlciBsZW5ndGggcGFzc2VkIHRvIHRoZSB1bmRlcmx5aW5nIHdpbmRvd3Mg
QVBJLgotICAgIGNvbnN0IGludCBrTWF4QnVmZmVyTGVuZ3RoID0gMTAyNDsKLSAgICAvLyBEZWZh
dWx0IHNpemUgZm9yIHRoZSBidWZmZXIuIEl0IHNob3VsZCBiZSBlbm91Z2ggZm9yIG1vc3Qgb2Yg
Y2FzZXMuCi0gICAgY29uc3QgaW50IGtEZWZhdWx0QnVmZmVyTGVuZ3RoID0gMjU2OwotCi0gICAg
U2tDb2xvciBjb2xvciA9IGNvbnRleHQtPmVmZmVjdGl2ZUZpbGxDb2xvcigpOworICAgIFNrQ29s
b3IgY29sb3IgPSBncmFwaGljc0NvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5lZmZlY3RpdmVG
aWxsQ29sb3IoKTsKICAgICB1bnNpZ25lZCBjaGFyIGFscGhhID0gU2tDb2xvckdldEEoY29sb3Ip
OwogICAgIC8vIFNraXAgMTAwJSB0cmFuc3BhcmVudCB0ZXh0OyBubyBuZWVkIHRvIGRyYXcgYW55
dGhpbmcuCi0gICAgaWYgKCFhbHBoYSAmJiBjb250ZXh0LT5nZXRTdHJva2VTdHlsZSgpID09IE5v
U3Ryb2tlKQorICAgIGlmICghYWxwaGEgJiYgZ3JhcGhpY3NDb250ZXh0LT5wbGF0Zm9ybUNvbnRl
eHQoKS0+Z2V0U3Ryb2tlU3R5bGUoKSA9PSBOb1N0cm9rZSkKICAgICAgICAgcmV0dXJuOwogCi0g
ICAgLy8gU2V0IHVwIG91ciBncmFwaGljcyBjb250ZXh0LgotICAgIEhEQyBoZGMgPSBjb250ZXh0
LT5jYW52YXMoKS0+YmVnaW5QbGF0Zm9ybVBhaW50KCk7Ci0gICAgSEdESU9CSiBvbGRGb250ID0g
U2VsZWN0T2JqZWN0KGhkYywgZm9udC0+cGxhdGZvcm1EYXRhKCkuaGZvbnQoKSk7Ci0KLSAgICAv
LyBUT0RPKG1hcnVlbCk6IGh0dHA6Ly9iLzcwMDQ2NCBTZXRUZXh0Q29sb3IgZG9lc24ndCBzdXBw
b3J0IHRyYW5zcGFyZW5jeS4KLSAgICAvLyBFbmZvcmNlIG5vbi10cmFuc3BhcmVudCBjb2xvci4K
LSAgICBjb2xvciA9IFNrQ29sb3JTZXRSR0IoU2tDb2xvckdldFIoY29sb3IpLCBTa0NvbG9yR2V0
Ryhjb2xvciksIFNrQ29sb3JHZXRCKGNvbG9yKSk7Ci0gICAgU2V0VGV4dENvbG9yKGhkYywgc2tp
YTo6U2tDb2xvclRvQ09MT1JSRUYoY29sb3IpKTsKLSAgICBTZXRCa01vZGUoaGRjLCBUUkFOU1BB
UkVOVCk7Ci0KLSAgICAvLyBXaW5kb3dzIG5lZWRzIHRoZSBjaGFyYWN0ZXJzIGFuZCB0aGUgYWR2
YW5jZXMgaW4gbmljZSBjb250aWd1b3VzCi0gICAgLy8gYnVmZmVycywgd2hpY2ggd2UgYnVpbGQg
aGVyZS4KLSAgICBWZWN0b3I8V09SRCwga0RlZmF1bHRCdWZmZXJMZW5ndGg+IGdseXBoczsKLSAg
ICBWZWN0b3I8aW50LCBrRGVmYXVsdEJ1ZmZlckxlbmd0aD4gYWR2YW5jZXM7Ci0KLSAgICAvLyBD
b21wdXRlIHRoZSBjb29yZGluYXRlLiBUaGUgJ29yaWdpbicgcmVwcmVzZW50cyB0aGUgYmFzZWxp
bmUsIHNvIHdlIG5lZWQKLSAgICAvLyB0byBtb3ZlIGl0IHVwIHRvIHRoZSB0b3Agb2YgdGhlIGJv
dW5kaW5nIHNxdWFyZS4KLSAgICBpbnQgeCA9IHN0YXRpY19jYXN0PGludD4ocG9pbnQueCgpKTsK
LSAgICBpbnQgbGluZVRvcCA9IHN0YXRpY19jYXN0PGludD4ocG9pbnQueSgpKSAtIGZvbnQtPmFz
Y2VudCgpOworICAgIFRyYW5zcGFyZW5jeUF3YXJlRm9udFBhaW50ZXIgcGFpbnRlcihncmFwaGlj
c0NvbnRleHQsIGZvbnQsIGdseXBoQnVmZmVyLCBmcm9tLCBudW1HbHlwaHMsIHBvaW50KTsKIAog
ICAgIC8vIFdlIGRyYXcgdGhlIGdseXBocyBpbiBjaHVua3MgdG8gYXZvaWQgaGF2aW5nIHRvIGRv
IGEgaGVhcCBhbGxvY2F0aW9uIGZvcgogICAgIC8vIHRoZSBhcnJheXMgb2YgY2hhcmFjdGVycyBh
bmQgYWR2YW5jZXMuIFNpbmNlIEV4dFRleHRPdXQgaXMgdGhlCiAgICAgLy8gbG93ZXN0LWxldmVs
IHRleHQgb3V0cHV0IGZ1bmN0aW9uIG9uIFdpbmRvd3MsIHRoZXJlIHNob3VsZCBiZSBsaXR0bGUK
ICAgICAvLyBwZW5hbHR5IGZvciBzcGxpdHRpbmcgdXAgdGhlIHRleHQuIE9uIHRoZSBvdGhlciBo
YW5kLCB0aGUgYnVmZmVyIGNhbm5vdAogICAgIC8vIGJlIGJpZ2dlciB0aGFuIDQwOTQgb3IgdGhl
IGZ1bmN0aW9uIHdpbGwgZmFpbC4KLSAgICBpbnQgZ2x5cGhJbmRleCA9IDA7CisgICAgY29uc3Qg
aW50IGtNYXhCdWZmZXJMZW5ndGggPSAyNTY7CisgICAgVmVjdG9yPFdPUkQsIGtNYXhCdWZmZXJM
ZW5ndGg+IGdseXBoczsKKyAgICBWZWN0b3I8aW50LCBrTWF4QnVmZmVyTGVuZ3RoPiBhZHZhbmNl
czsKKyAgICBpbnQgZ2x5cGhJbmRleCA9IDA7ICAvLyBUaGUgc3RhcnRpbmcgZ2x5cGggb2YgdGhl
IGN1cnJlbnQgY2h1bmsuCisgICAgaW50IGN1ckFkdmFuY2UgPSAwOyAgLy8gSG93IGZhciBmcm9t
IHRoZSBsZWZ0IHRoZSBjdXJyZW50IGNodW5rIGlzLgogICAgIHdoaWxlIChnbHlwaEluZGV4IDwg
bnVtR2x5cGhzKSB7Ci0gICAgICAgIC8vIGhvdyBtYW55IGNoYXJzIHdpbGwgYmUgaW4gdGhpcyBj
aHVuaz8KKyAgICAgICAgLy8gSG93IG1hbnkgY2hhcnMgd2lsbCBiZSBpbiB0aGlzIGNodW5rPwog
ICAgICAgICBpbnQgY3VyTGVuID0gc3RkOjptaW4oa01heEJ1ZmZlckxlbmd0aCwgbnVtR2x5cGhz
IC0gZ2x5cGhJbmRleCk7Ci0KICAgICAgICAgZ2x5cGhzLnJlc2l6ZShjdXJMZW4pOwogICAgICAg
ICBhZHZhbmNlcy5yZXNpemUoY3VyTGVuKTsKIApAQCAtMTIxLDIxICsyNTIsMTAgQEAgdm9pZCBG
b250OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3NDb250ZXh0LAogICAgICAg
ICAgICAgY3VyV2lkdGggKz0gYWR2YW5jZXNbaV07CiAgICAgICAgIH0KIAorICAgICAgICAvLyBB
Y3R1YWxseSBkcmF3IHRoZSBnbHlwaHMgKHdpdGggcmV0cnkgb24gZmFpbHVyZSkuCiAgICAgICAg
IGJvb2wgc3VjY2VzcyA9IGZhbHNlOwogICAgICAgICBmb3IgKGludCBleGVjdXRpb25zID0gMDsg
ZXhlY3V0aW9ucyA8IDI7ICsrZXhlY3V0aW9ucykgewotICAgICAgICAgICAgaWYgKGNhblVzZUdE
SSkKLSAgICAgICAgICAgICAgICBzdWNjZXNzID0gISFFeHRUZXh0T3V0KGhkYywgeCwgbGluZVRv
cCwgRVRPX0dMWVBIX0lOREVYLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCB3Y2hhcl90Kj4oJmdseXBoc1swXSksCi0gICAgICAgICAgICAgICAgICAg
ICAgICBjdXJMZW4sICZhZHZhbmNlc1swXSk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAg
ICAgICAgICAvLyBTa2lhJ3MgdGV4dCBkcmF3aW5nIG9yaWdpbiBpcyB0aGUgYmFzZWxpbmUsIGxp
a2UgV2ViS2l0LCBub3QKLSAgICAgICAgICAgICAgICAvLyB0aGUgdG9wLCBsaWtlIFdpbmRvd3Mu
Ci0gICAgICAgICAgICAgICAgU2tQb2ludCBvcmlnaW4gPSB7IHgsIHBvaW50LnkoKSB9OwotICAg
ICAgICAgICAgICAgIHN1Y2Nlc3MgPSBwYWludFNraWFUZXh0KGNvbnRleHQsIGZvbnQtPnBsYXRm
b3JtRGF0YSgpLmhmb250KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1HbHlwaHMsIHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgV09SRCo+KCZnbHlwaHNbMF0pLAotICAgICAgICAgICAgICAg
ICAgICAgICAgJmFkdmFuY2VzWzBdLCAwLCAmb3JpZ2luKTsKLSAgICAgICAgICAgIH0KLQorICAg
ICAgICAgICAgc3VjY2VzcyA9IHBhaW50ZXIuZHJhd0dseXBocyhjdXJMZW4sICZnbHlwaHNbMF0s
ICZhZHZhbmNlc1swXSwgY3VyQWR2YW5jZSk7CiAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MgJiYg
ZXhlY3V0aW9ucyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gQXNrIHRoZSBicm93c2VyIHRv
IGxvYWQgdGhlIGZvbnQgZm9yIHVzIGFuZCByZXRyeS4KICAgICAgICAgICAgICAgICBDaHJvbWl1
bUJyaWRnZTo6ZW5zdXJlRm9udExvYWRlZChmb250LT5wbGF0Zm9ybURhdGEoKS5oZm9udCgpKTsK
QEAgLTE0NSwxNCArMjY1LDggQEAgdm9pZCBGb250OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4
dCogZ3JhcGhpY3NDb250ZXh0LAogICAgICAgICB9CiAKICAgICAgICAgQVNTRVJUKHN1Y2Nlc3Mp
OwotCi0gICAgICAgIHggKz0gY3VyV2lkdGg7CisgICAgICAgIGN1ckFkdmFuY2UgKz0gY3VyV2lk
dGg7CiAgICAgfQotCi0gICAgU2VsZWN0T2JqZWN0KGhkYywgb2xkRm9udCk7Ci0gICAgaWYgKGNy
ZWF0ZWRMYXllcikKLSAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5lbmRUcmFuc3BhcmVuY3lMYXll
cigpOwotICAgIGNvbnRleHQtPmNhbnZhcygpLT5lbmRQbGF0Zm9ybVBhaW50KCk7CiB9CiAKIEZs
b2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYg
cnVuLApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9UaGVt
ZUhlbHBlckNocm9taXVtV2luLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vVGhlbWVIZWxwZXJDaHJvbWl1bVdpbi5jcHAKaW5kZXggNzk4ZWUzMi4uZTY5ZGUyOSAxMDA2
NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9UaGVtZUhlbHBlckNo
cm9taXVtV2luLmNwcAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1Ro
ZW1lSGVscGVyQ2hyb21pdW1XaW4uY3BwCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogQ29weXJp
Z2h0IChjKSAyMDA4LCAyMDA5LCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICog
Ci0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqIAotICogICAgICog
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRp
c3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9y
IHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNl
IG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhv
dXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JT
Ci0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIg
T1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICog
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNs
dWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJUaGVtZUhlbHBlckNocm9taXVtV2luLmgiCi0KLSNp
bmNsdWRlICJGbG9hdFJlY3QuaCIKLSNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKLQotbmFt
ZXNwYWNlIFdlYkNvcmUgewotCi1UaGVtZUhlbHBlcldpbjo6VGhlbWVIZWxwZXJXaW4oR3JhcGhp
Y3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0KQotICAgIDogbV9vcmdDb250
ZXh0KGNvbnRleHQpCi0gICAgLCBtX29yZ01hdHJpeChjb250ZXh0LT5nZXRDVE0oKSkKLSAgICAs
IG1fb3JnUmVjdChyZWN0KQotewotICAgIGlmIChtX29yZ01hdHJpeC5iKCkgIT0gMCB8fCBtX29y
Z01hdHJpeC5jKCkgIT0gMCkgeyAgLy8gQ2hlY2sgZm9yIHNrZXcuCi0gICAgICAgIC8vIENvbXBs
aWNhdGVkIGVmZmVjdHMsIG1ha2UgYSBjb3B5IGFuZCBkcmF3IHRoZSBiaXRtYXAgdGhlcmUuCi0g
ICAgICAgIG1fdHlwZSA9IENPUFk7Ci0gICAgICAgIG1fcmVjdC5zZXRTaXplKHJlY3Quc2l6ZSgp
KTsKLQotICAgICAgICBtX25ld0J1ZmZlci5zZXQoSW1hZ2VCdWZmZXI6OmNyZWF0ZShyZWN0LnNp
emUoKSwgZmFsc2UpLnJlbGVhc2UoKSk7Ci0KLSAgICAgICAgLy8gVGhlbWUgZHJhd2luZyBtZXNz
ZXMgd2l0aCB0aGUgdHJhbnNwYXJlbmN5LgotICAgICAgICAvLyBGSVhNRTogSWRlYWxseSwgd2Ug
d291bGQgbGVhdmUgdGhpcyB0cmFuc3BhcmVudCwgYnV0IEkgd2FzCi0gICAgICAgIC8vIGhhdmlu
ZyBwcm9ibGVtcyB3aXRoIGJ1dHRvbiBkcmF3aW5nLCBzbyB3ZSBmaWxsIHdpdGggd2hpdGUuIEJ1
dHRvbnMKLSAgICAgICAgLy8gbG9va2VkIGdvb2Qgd2l0aCB0cmFuc3BhcmVudCBoZXJlIGFuZCBu
byBmaXhpbmcgdXAgb2YgdGhlIGFscGhhCi0gICAgICAgIC8vIGxhdGVyLCBidXQgdGV4dCBhcmVh
cyBkaWRuJ3QuIFRoaXMgbWFrZXMgdGV4dCBhcmVhcyBsb29rIGdvb2QgYnV0Ci0gICAgICAgIC8v
IGdpdmVzIGJ1dHRvbnMgYSB3aGl0ZSBoYWxvLiBJcyB0aGVyZSBhIHdheSB0byBmaXggdGhpcz8g
SSB0aGluawotICAgICAgICAvLyBidXR0b25zIGFjdHVhbGx5IGhhdmUgYW50aWFsaXNlZCBlZGdl
cyB3aGljaCBpcyBqdXN0IG5vdCBwb3NzaWJsZQotICAgICAgICAvLyB0byBoYW5kbGUgb24gYSB0
cmFuc3BhcmVudCBiYWNrZ3JvdW5kIGdpdmVuIHRoYXQgaXQgbWVzc2VzIHdpdGggdGhlCi0gICAg
ICAgIC8vIGFscGhhIGNoYW5uZWwuCi0gICAgICAgIEZsb2F0UmVjdCBuZXdDb250ZXh0UmVjdCgw
LCAwLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOwotICAgICAgICBHcmFwaGljc0NvbnRl
eHQqIG5ld0NvbnRleHQgPSBtX25ld0J1ZmZlci0+Y29udGV4dCgpOwotICAgICAgICBuZXdDb250
ZXh0LT5zZXRGaWxsQ29sb3IoQ29sb3I6OndoaXRlKTsKLSAgICAgICAgbmV3Q29udGV4dC0+Zmls
bFJlY3QobmV3Q29udGV4dFJlY3QpOwotCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBp
ZiAobV9vcmdNYXRyaXguYSgpICE9IDEuMCB8fCBtX29yZ01hdHJpeC5kKCkgIT0gMS4wKSB7ICAv
LyBDaGVjayBmb3Igc2NhbGUuCi0gICAgICAgIC8vIE9ubHkgYSBzY2FsaW5nIGlzIGFwcGxpZWQu
Ci0gICAgICAgIG1fdHlwZSA9IFNDQUxFOwotCi0gICAgICAgIC8vIFNhdmUgdGhlIHRyYW5zZm9y
bWVkIGNvb3JkaW5hdGVzIHRvIGRyYXcuCi0gICAgICAgIG1fcmVjdCA9IG1fb3JnTWF0cml4Lm1h
cFJlY3QocmVjdCk7Ci0gICAgICAgIAotICAgICAgICBtX29yZ0NvbnRleHQtPnNhdmUoKTsKLSAg
ICAgICAgbV9vcmdDb250ZXh0LT5jb25jYXRDVE0obV9vcmdDb250ZXh0LT5nZXRDVE0oKS5pbnZl
cnNlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gTm90aGluZyBpbnRlcmVz
dGluZy4KLSAgICBtX3JlY3QgPSByZWN0OwotICAgIG1fdHlwZSA9IE9SSUdJTkFMOwotfQotCi1U
aGVtZUhlbHBlcldpbjo6flRoZW1lSGVscGVyV2luKCkKLXsKLSAgICBzd2l0Y2ggKG1fdHlwZSkg
ewotICAgIGNhc2UgU0NBTEU6Ci0gICAgICAgIG1fb3JnQ29udGV4dC0+cmVzdG9yZSgpOwotICAg
ICAgICBicmVhazsKLSAgICBjYXNlIENPUFk6IHsKLSAgICAgICAgLy8gQ29weSB0aGUgZHVwbGlj
YXRlIGJpdG1hcCB3aXRoIG91ciBjb250cm9sIHRvIHRoZSBvcmlnaW5hbCBjYW52YXMuCi0gICAg
ICAgIEZsb2F0UmVjdCBkZXN0UmVjdChtX29yZ1JlY3QpOwotICAgICAgICBtX25ld0J1ZmZlci0+
Y29udGV4dCgpLT5wbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCktPgotICAgICAgICAgICAgZ2V0
VG9wUGxhdGZvcm1EZXZpY2UoKS5maXh1cEFscGhhQmVmb3JlQ29tcG9zaXRpbmcoKTsKLSAgICAg
ICAgbV9vcmdDb250ZXh0LT5kcmF3SW1hZ2UobV9uZXdCdWZmZXItPmltYWdlKCksIGRlc3RSZWN0
KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT1JJR0lOQUw6Ci0gICAgICAgIGJy
ZWFrOwotICAgIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vVGhlbWVIZWxwZXJDaHJvbWl1bVdpbi5o
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9UaGVtZUhlbHBlckNocm9taXVt
V2luLmgKaW5kZXggMTc3MWZiNC4uZTY5ZGUyOSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9jaHJvbWl1bS9UaGVtZUhlbHBlckNocm9taXVtV2luLmgKKysrIGIvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9UaGVtZUhlbHBlckNocm9taXVtV2luLmgKQEAg
LTEsOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSwgR29vZ2xlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMg
YXJlCi0gKiBtZXQ6Ci0gKiAKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBj
b3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVy
IHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmli
dXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQg
ZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVy
bWlzc2lvbi4KLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJ
R0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQot
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIFRoZW1lSGVscGVyV2luX2gKLSNkZWZpbmUg
VGhlbWVIZWxwZXJXaW5faAotCi0jaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKLSNp
bmNsdWRlICJJbWFnZUJ1ZmZlci5oIgotI2luY2x1ZGUgIkludFJlY3QuaCIKLSNpbmNsdWRlIDx3
dGYvT3duUHRyLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotY2xhc3MgR3JhcGhpY3NDb250
ZXh0OwotY2xhc3MgSW50UmVjdDsKLQotLy8gSGVscHMgZHJhd2luZyB0aGVtZSBlbGVtZW50cyBs
aWtlIGJ1dHRvbnMgYW5kIHNjcm9sbCBiYXJzLiBUaGlzIHdpbGwgaGFuZGxlCi0vLyB0cmFuc2xh
dGlvbnMgYW5kIHNjYWxpbmdzIHRoYXQgV2luZG93cyBtaWdodCBub3QsIGJ5IGVpdGhlciBtYWtp
bmcgV2luZG93cwotLy8gZHJhdyB0aGUgYXBwcm9wcmlhdGUgc2l6ZWQgY29udHJvbCwgb3IgYnkg
cmVuZGVyaW5nIGl0IGludG8gYW4gb2ZmLXNjcmVlbgotLy8gY29udGV4dCBhbmQgdHJhbnNmb3Jt
aW5nIGl0IG91cnNlbHZlcy4KLWNsYXNzIFRoZW1lSGVscGVyV2luIHsKLSAgICBlbnVtIFR5cGUg
ewotICAgICAgICAvLyBVc2UgdGhlIG9yaWdpbmFsIGNhbnZhcyB3aXRoIG5vIGNoYW5nZXMuIFRo
aXMgaXMgdGhlIG5vcm1hbCBtb2RlLgotICAgICAgICBPUklHSU5BTCwKLQotICAgICAgICAvLyBV
c2UgdGhlIG9yaWdpbmFsIGNhbnZhcyBidXQgc2NhbGUgdGhlIHJlY3RhbmdsZSBvZiB0aGUgY29u
dHJvbCBzbwotICAgICAgICAvLyB0aGF0IGl0IHdpbGwgYmUgdGhlIGNvcnJlY3Qgc2l6ZSwgdW5k
b2luZyBhbnkgc2NhbGUgYWxyZWFkeSBvbiB0aGUKLSAgICAgICAgLy8gY2FudmFzLiBUaGlzIHdp
bGwgaGF2ZSB0aGUgZWZmZWN0IG9mIGp1c3QgZHJhd2luZyB0aGUgY29udHJvbCBiaWdnZXIKLSAg
ICAgICAgLy8gb3Igc21hbGxlciBhbmQgbm90IGFjdHVhbGx5IGV4cGFuZGluZyBvciBjb250cmFj
dGluZyB0aGUgcGl4ZWxzIGluCi0gICAgICAgIC8vIGl0LiBUaGlzIHVzdWFsbHkgbG9va3MgYmV0
dGVyLgotICAgICAgICBTQ0FMRSwKLQotICAgICAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgY29u
dHJvbCBhbmQgdGhlbiB0cmFuc2Zvcm0gaXQgb3Vyc2VsdmVzIGFmdGVyCi0gICAgICAgIC8vIFdp
bmRvd3MgZHJhd3MgaXQuIFRoaXMgYWxsb3dzIHVzIHRvIGdldCBjb21wbGV4IGVmZmVjdHMuCi0g
ICAgICAgIENPUFksCi0gICAgfTsKLQotcHVibGljOgotICAgIC8vIFByZXBhcmVzIGRyYXdpbmcg
YSBjb250cm9sIHdpdGggdGhlIGdpdmVuIHJlY3QgdG8gdGhlIGdpdmVuIGNvbnRleHQuCi0gICAg
VGhlbWVIZWxwZXJXaW4oR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiBy
ZWN0KTsKLSAgICB+VGhlbWVIZWxwZXJXaW4oKTsKLQotICAgIC8vIFJldHVybnMgdGhlIGNvbnRl
eHQgdG8gZHJhdyB0aGUgY29udHJvbCBpbnRvLCB3aGljaCBtYXkgYmUgdGhlIG9yaWdpbmFsCi0g
ICAgLy8gb3IgdGhlIGNvcHksIGRlcGVuZGluZyBvbiB0aGUgbW9kZS4KLSAgICBHcmFwaGljc0Nv
bnRleHQqIGNvbnRleHQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbmV3QnVmZmVyLmdldCgp
ID8gbV9uZXdCdWZmZXItPmNvbnRleHQoKSA6IG1fb3JnQ29udGV4dDsKLSAgICB9Ci0KLSAgICAv
LyBSZXR1cm5zIHRoZSByZWN0YW5nbGUgaW4gd2hpY2ggdG8gZHJhdyBpbnRvIHRoZSBjYW52YXMo
KSBieSBXaW5kb3dzLgotICAgIGNvbnN0IEludFJlY3QmIHJlY3QoKSB7IHJldHVybiBtX3JlY3Q7
IH0KLQotcHJpdmF0ZToKLSAgICBUeXBlIG1fdHlwZTsKLQotICAgIC8vIFRoZSBvcmlnaW5hbCBj
YW52YXMgdG8gd3JvdGUgdG8uIE5vdCBvd25lZCBieSB0aGlzIGNsYXNzLgotICAgIEdyYXBoaWNz
Q29udGV4dCogbV9vcmdDb250ZXh0OwotICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IG1fb3JnTWF0
cml4OwotICAgIEludFJlY3QgbV9vcmdSZWN0OwotCi0gICAgLy8gV2hlbiBtX3R5cGUgPT0gQ09Q
WSwgdGhpcyB3aWxsIGJlIGEgbmV3IHN1cmZhY2Ugb3duZWQgYnkgdGhpcyBjbGFzcyB0aGF0Ci0g
ICAgLy8gcmVwcmVzZW50cyB0aGUgY29weS4KLSAgICBPd25QdHI8SW1hZ2VCdWZmZXI+IG1fbmV3
QnVmZmVyOwotCi0gICAgLy8gVGhlIGNvbnRyb2wgcmVjdGFuZ2xlIGluIHRoZSBjb29yZGluYXRl
IHNwYWNlIG9mIGNhbnZhcygpLgotICAgIEludFJlY3QgbV9yZWN0OwotfTsKLQotfSAgLy8gbmFt
ZXNwYWNlIFdlYkNvcmUKLQotI2VuZGlmICAvLyBUaGVtZUhlbHBlcldpbl9oCmRpZmYgLS1naXQg
YS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NDb250ZXh0U2tpYS5jcHAg
Yi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NDb250ZXh0U2tpYS5jcHAK
aW5kZXggMzRlNGExMS4uYjEyODU5OSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9za2lhL0dyYXBoaWNzQ29udGV4dFNraWEuY3BwCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvc2tpYS9HcmFwaGljc0NvbnRleHRTa2lhLmNwcApAQCAtMjc1LDExICsyNzUsNiBA
QCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZW5kVHJhbnNwYXJlbmN5TGF5ZXIoKQogewogICAgIGlm
IChwYWludGluZ0Rpc2FibGVkKCkpCiAgICAgICAgIHJldHVybjsKLQotI2lmIFBMQVRGT1JNKFdJ
Tl9PUykKLSAgICBwbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCktPmdldFRvcFBsYXRmb3JtRGV2
aWNlKCkuCi0gICAgICAgIGZpeHVwQWxwaGFCZWZvcmVDb21wb3NpdGluZygpOwotI2VuZGlmCiAg
ICAgcGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpLT5yZXN0b3JlKCk7CiB9CiAKZGlmZiAtLWdp
dCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZVNraWEuY3BwIGIvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ltYWdlU2tpYS5jcHAKaW5kZXggMTEyM2ZlOS4uMzUy
MGU4ZCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ltYWdlU2tp
YS5jcHAKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ltYWdlU2tpYS5jcHAK
QEAgLTIyNSw2ICsyMjUsNyBAQCBzdGF0aWMgdm9pZCBwYWludFNrQml0bWFwKFBsYXRmb3JtQ29u
dGV4dFNraWEqIHBsYXRmb3JtQ29udGV4dCwgY29uc3QgTmF0aXZlSW1hZwogewogICAgIFNrUGFp
bnQgcGFpbnQ7CiAgICAgcGFpbnQuc2V0UG9ydGVyRHVmZlhmZXJtb2RlKGNvbXBPcCk7CisgICAg
cGFpbnQuc2V0RmlsdGVyQml0bWFwKHRydWUpOwogCiAgICAgc2tpYTo6UGxhdGZvcm1DYW52YXMq
IGNhbnZhcyA9IHBsYXRmb3JtQ29udGV4dC0+Y2FudmFzKCk7CiAKQEAgLTIzMyw3ICsyMzQsNiBA
QCBzdGF0aWMgdm9pZCBwYWludFNrQml0bWFwKFBsYXRmb3JtQ29udGV4dFNraWEqIHBsYXRmb3Jt
Q29udGV4dCwgY29uc3QgTmF0aXZlSW1hZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
U2tTY2FsYXJUb0Zsb2F0KGRlc3RSZWN0LndpZHRoKCkpLAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgU2tTY2FsYXJUb0Zsb2F0KGRlc3RSZWN0LmhlaWdodCgpKSk7CiAgICAgaWYgKHJl
c2FtcGxpbmcgPT0gUkVTQU1QTEVfQVdFU09NRSkgewotICAgICAgICBwYWludC5zZXRGaWx0ZXJC
aXRtYXAoZmFsc2UpOwogICAgICAgICBkcmF3UmVzYW1wbGVkQml0bWFwKCpjYW52YXMsIHBhaW50
LCBiaXRtYXAsIHNyY1JlY3QsIGRlc3RSZWN0KTsKICAgICB9IGVsc2UgewogICAgICAgICAvLyBO
byByZXNhbXBsaW5nIG5lY2Vzc2FyeSwgd2UgY2FuIGp1c3QgZHJhdyB0aGUgYml0bWFwLiBXZSB3
YW50IHRvCkBAIC0yNDEsNyArMjQxLDYgQEAgc3RhdGljIHZvaWQgcGFpbnRTa0JpdG1hcChQbGF0
Zm9ybUNvbnRleHRTa2lhKiBwbGF0Zm9ybUNvbnRleHQsIGNvbnN0IE5hdGl2ZUltYWcKICAgICAg
ICAgLy8gaXMgc29tZXRoaW5nIGludGVyZXN0aW5nIGdvaW5nIG9uIHdpdGggdGhlIG1hdHJpeCAo
bGlrZSBhIHJvdGF0aW9uKS4KICAgICAgICAgLy8gTm90ZTogZm9yIHNlcmlhbGl6YXRpb24sIHdl
IHdpbGwgd2FudCB0byBzdWJzZXQgdGhlIGJpdG1hcCBmaXJzdCBzbwogICAgICAgICAvLyB3ZSBk
b24ndCBzZW5kIGV4dHJhIHBpeGVscy4KLSAgICAgICAgcGFpbnQuc2V0RmlsdGVyQml0bWFwKHJl
c2FtcGxpbmcgPT0gUkVTQU1QTEVfTElORUFSKTsKICAgICAgICAgY2FudmFzLT5kcmF3Qml0bWFw
UmVjdChiaXRtYXAsICZzcmNSZWN0LCBkZXN0UmVjdCwgJnBhaW50KTsKICAgICB9CiB9CmRpZmYg
LS1naXQgYS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZUNocm9taXVtV2luLmNwcCBiL1dl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lQ2hyb21pdW1XaW4uY3BwCmluZGV4IDllNTlhYzku
LmJlNzcyMDQgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lQ2hyb21p
dW1XaW4uY3BwCisrKyBiL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lQ2hyb21pdW1XaW4u
Y3BwCkBAIC0zOCw3ICszOCw3IEBACiAjaW5jbHVkZSAiUmVuZGVyQm94LmgiCiAjaW5jbHVkZSAi
U2Nyb2xsYmFyVGhlbWUuaCIKICNpbmNsdWRlICJTa2lhVXRpbHMuaCIKLSNpbmNsdWRlICJUaGVt
ZUhlbHBlckNocm9taXVtV2luLmgiCisjaW5jbHVkZSAiVHJhbnNwYXJlbmN5V2luLmgiCiAjaW5j
bHVkZSAiVXNlckFnZW50U3R5bGVTaGVldHMuaCIKICNpbmNsdWRlICJXaW5kb3dzVmVyc2lvbi5o
IgogCkBAIC01Myw2ICs1Myw0NyBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKK25hbWVzcGFj
ZSB7CisKK2Jvb2wgY2FudmFzSGFzTXVsdGlwbGVMYXllcnMoY29uc3QgU2tDYW52YXMqIGNhbnZh
cykKK3sKKyAgICBTa0NhbnZhczo6TGF5ZXJJdGVyIGl0ZXIoY29uc3RfY2FzdDxTa0NhbnZhcyo+
KGNhbnZhcyksIGZhbHNlKTsKKyAgICBpdGVyLm5leHQoKTsgIC8vIFRoZXJlIGlzIGFsd2F5cyBh
dCBsZWFzdCBvbmUgbGF5ZXIuCisgICAgcmV0dXJuICFpdGVyLmRvbmUoKTsgIC8vIFRoZXJlIGlz
ID4gMSBsYXllciBpZiB0aGUgdGhlIGl0ZXJhdG9yIGNhbiBzdGlsIGFkdmFuY2UuCit9CisKK2Ns
YXNzIFRoZW1lUGFpbnRlciA6IHB1YmxpYyBUcmFuc3BhcmVuY3lXaW4geworcHVibGljOgorICAg
IFRoZW1lUGFpbnRlcihHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEludFJlY3QmIHIp
CisgICAgeworICAgICAgICBUcmFuc2Zvcm1Nb2RlIHRyYW5zZm9ybU1vZGUgPSBnZXRUcmFuc2Zv
cm1Nb2RlKGNvbnRleHQtPmdldENUTSgpKTsKKyAgICAgICAgaW5pdChjb250ZXh0LCBnZXRMYXll
ck1vZGUoY29udGV4dCwgdHJhbnNmb3JtTW9kZSksIHRyYW5zZm9ybU1vZGUsIHIpOworICAgIH0K
KworcHJpdmF0ZToKKyAgICBzdGF0aWMgTGF5ZXJNb2RlIGdldExheWVyTW9kZShHcmFwaGljc0Nv
bnRleHQqIGNvbnRleHQsIFRyYW5zZm9ybU1vZGUgdHJhbnNmb3JtTW9kZSkKKyAgICB7CisgICAg
ICAgIGlmIChjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKS0+aXNEcmF3aW5nVG9JbWFnZUJ1ZmZl
cigpKSAgLy8gTWlnaHQgaGF2ZSB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kLgorICAgICAgICAgICAg
cmV0dXJuIFdoaXRlTGF5ZXI7CisgICAgICAgIGVsc2UgaWYgKGNhbnZhc0hhc011bHRpcGxlTGF5
ZXJzKGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKSkpICAvLyBOZWVkcyBhbnRp
YWxpYXNpbmcgaGVscC4KKyAgICAgICAgICAgIHJldHVybiBPcGFxdWVDb21wb3NpdGVMYXllcjsK
KyAgICAgICAgZWxzZSAgLy8gTm90aGluZyBpbnRlcmVzdGluZy4KKyAgICAgICAgICAgIHJldHVy
biB0cmFuc2Zvcm1Nb2RlID09IEtlZXBUcmFuc2Zvcm0gPyBOb0xheWVyIDogT3BhcXVlQ29tcG9z
aXRlTGF5ZXI7CisgICAgfQorCisgICAgc3RhdGljIFRyYW5zZm9ybU1vZGUgZ2V0VHJhbnNmb3Jt
TW9kZShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgbWF0cml4KQorICAgIHsKKyAgICAgICAg
aWYgKG1hdHJpeC5iKCkgIT0gMCB8fCBtYXRyaXguYygpICE9IDApICAvLyBTa2V3LgorICAgICAg
ICAgICAgcmV0dXJuIFVudHJhbnNmb3JtOworICAgICAgICBlbHNlIGlmIChtYXRyaXguYSgpICE9
IDEuMCB8fCBtYXRyaXguZCgpICE9IDEuMCkgIC8vIFNjYWxlLgorICAgICAgICAgICAgcmV0dXJu
IFNjYWxlVHJhbnNmb3JtOworICAgICAgICBlbHNlICAvLyBOb3RoaW5nIGludGVyZXN0aW5nLgor
ICAgICAgICAgICAgcmV0dXJuIEtlZXBUcmFuc2Zvcm07CisgICAgfQorfTsKKworfSAgLy8gbmFt
ZXNwYWNlCisKIHN0YXRpYyB2b2lkIGdldE5vbkNsaWVudE1ldHJpY3MoTk9OQ0xJRU5UTUVUUklD
UyogbWV0cmljcykgewogICAgIHN0YXRpYyBVSU5UIHNpemUgPSBXZWJDb3JlOjppc1Zpc3RhT3JO
ZXdlcigpID8KICAgICAgICAgc2l6ZW9mKE5PTkNMSUVOVE1FVFJJQ1MpIDogTk9OQ0xJRU5UTUVU
UklDU19TSVpFX1BSRV9WSVNUQTsKQEAgLTM3MywxMiArNDE0LDEyIEBAIGJvb2wgUmVuZGVyVGhl
bWVDaHJvbWl1bVdpbjo6cGFpbnRCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJP
YmplY3Q6OlBhCiB7CiAgICAgY29uc3QgVGhlbWVEYXRhJiB0aGVtZURhdGEgPSBnZXRUaGVtZURh
dGEobyk7CiAKLSAgICBXZWJDb3JlOjpUaGVtZUhlbHBlcldpbiBoZWxwZXIoaS5jb250ZXh0LCBy
KTsKLSAgICBDaHJvbWl1bUJyaWRnZTo6cGFpbnRCdXR0b24oaGVscGVyLmNvbnRleHQoKSwKKyAg
ICBXZWJDb3JlOjpUaGVtZVBhaW50ZXIgcGFpbnRlcihpLmNvbnRleHQsIHIpOworICAgIENocm9t
aXVtQnJpZGdlOjpwYWludEJ1dHRvbihwYWludGVyLmNvbnRleHQoKSwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdGhlbWVEYXRhLm1fcGFydCwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdGhlbWVEYXRhLm1fc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHRoZW1lRGF0YS5tX2NsYXNzaWNTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaGVscGVyLnJlY3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHBhaW50ZXIuZHJhd1JlY3QoKSk7CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCkBAIC00NDEsMTIg
KzQ4MiwxMiBAQCBib29sIFJlbmRlclRoZW1lQ2hyb21pdW1XaW46OnBhaW50TWVudUxpc3QoUmVu
ZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OgogICAgICAgICAgICAgICAgICByLmhl
aWdodCgpIC0gKHNwYWNpbmdUb3AgKyBzcGFjaW5nQm90dG9tKSk7CiAKICAgICAvLyBHZXQgdGhl
IGNvcnJlY3QgdGhlbWUgZGF0YSBmb3IgYSB0ZXh0ZmllbGQgYW5kIHBhaW50IHRoZSBtZW51Lgot
ICAgIFdlYkNvcmU6OlRoZW1lSGVscGVyV2luIGhlbHBlcihpLmNvbnRleHQsIHJlY3QpOwotICAg
IENocm9taXVtQnJpZGdlOjpwYWludE1lbnVMaXN0KGhlbHBlci5jb250ZXh0KCksCisgICAgV2Vi
Q29yZTo6VGhlbWVQYWludGVyIHBhaW50ZXIoaS5jb250ZXh0LCByZWN0KTsKKyAgICBDaHJvbWl1
bUJyaWRnZTo6cGFpbnRNZW51TGlzdChwYWludGVyLmNvbnRleHQoKSwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBDUF9EUk9QRE9XTkJVVFRPTiwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBkZXRlcm1pbmVTdGF0ZShvKSwKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBkZXRlcm1pbmVDbGFzc2ljU3RhdGUobyksCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaGVscGVyLnJlY3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgcGFpbnRlci5kcmF3UmVjdCgpKTsKICAgICByZXR1cm4gZmFsc2U7CiB9CiAK
QEAgLTU2Myw5ICs2MDQsOSBAQCBUaGVtZURhdGEgUmVuZGVyVGhlbWVDaHJvbWl1bVdpbjo6Z2V0
VGhlbWVEYXRhKFJlbmRlck9iamVjdCogbykKIH0KIAogYm9vbCBSZW5kZXJUaGVtZUNocm9taXVt
V2luOjpwYWludFRleHRGaWVsZEludGVybmFsKFJlbmRlck9iamVjdCogbywKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWlu
dEluZm8mIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnN0IEludFJlY3QmIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGJvb2wgZHJhd0VkZ2VzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBpLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludFJl
Y3QmIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgYm9vbCBkcmF3RWRnZXMpCiB7CiAgICAgLy8gTmFzdHkgaGFjayB0byBtYWtlIHVzIG5vdCBw
YWludCB0aGUgYm9yZGVyIG9uIHRleHQgZmllbGRzIHdpdGggYQogICAgIC8vIGJvcmRlci1yYWRp
dXMuIFdlYmtpdCBwYWludHMgZWxlbWVudHMgd2l0aCBib3JkZXItcmFkaXVzIGZvciB1cy4KQEAg
LTU3NywxMiArNjE4LDEyIEBAIGJvb2wgUmVuZGVyVGhlbWVDaHJvbWl1bVdpbjo6cGFpbnRUZXh0
RmllbGRJbnRlcm5hbChSZW5kZXJPYmplY3QqIG8sCiAKICAgICBjb25zdCBUaGVtZURhdGEmIHRo
ZW1lRGF0YSA9IGdldFRoZW1lRGF0YShvKTsKIAotICAgIFdlYkNvcmU6OlRoZW1lSGVscGVyV2lu
IGhlbHBlcihpLmNvbnRleHQsIHIpOwotICAgIENocm9taXVtQnJpZGdlOjpwYWludFRleHRGaWVs
ZChoZWxwZXIuY29udGV4dCgpLAorICAgIFdlYkNvcmU6OlRoZW1lUGFpbnRlciBwYWludGVyKGku
Y29udGV4dCwgcik7CisgICAgQ2hyb21pdW1CcmlkZ2U6OnBhaW50VGV4dEZpZWxkKHBhaW50ZXIu
Y29udGV4dCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZURhdGEu
bV9wYXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZURhdGEubV9z
dGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWVEYXRhLm1fY2xh
c3NpY1N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZXIucmVj
dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludGVyLmRyYXdSZWN0
KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8tPnN0eWxlKCktPmJhY2tn
cm91bmRDb2xvcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3RWRnZXMpOwo=
</data>
<flag name="review"
          id="13668"
          type_id="1"
          status="+"
          setter="eric"
    />
          </attachment>
      

    </bug>

</bugzilla>