<?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>16979</bug_id>
          
          <creation_ts>2008-01-22 17:27:37 -0800</creation_ts>
          <short_desc>Patch to conditionalize some CG/Cairo support in win32</short_desc>
          <delta_ts>2008-02-06 17:54:53 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKit Misc.</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>
          
          <blocked>14107</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Brent Fulgham">bfulgham</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>alp</cc>
    
    <cc>aroben</cc>
    
    <cc>christian</cc>
    
    <cc>darin</cc>
    
    <cc>jeffschiller</cc>
    
    <cc>tofu.linden</cc>
    
    <cc>zucker</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>67990</commentid>
    <comment_count>0</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-01-22 17:27:37 -0800</bug_when>
    <thetext>This is a fairly contained patch that excludes various CoreGraphics and CoreFoundation-based implementations in the win32 build.  Some Cairo support is added (based on older WebKit builds).

A second bug will be filed with changes to the vcproj structure to avoid compiling unsupported files under a &apos;pure&apos; win32 build.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>67993</commentid>
    <comment_count>1</comment_count>
      <attachid>18613</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-01-22 17:45:11 -0800</bug_when>
    <thetext>Created attachment 18613
Initial patch to WebKit to support building without CG/CF.

Note that this patch builds cleanly using the normal win32 target.  It is not complete for a &apos;pure&apos; win32 target, but this patch removes a large number of compiler errors when compiling without CG.  A future patch to correct the vcproj files will be filed as a separate bug to allow a full build under win32.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68026</commentid>
    <comment_count>2</comment_count>
      <attachid>18613</attachid>
    <who name="Alp Toker">alp</who>
    <bug_when>2008-01-23 06:21:07 -0800</bug_when>
    <thetext>Comment on attachment 18613
Initial patch to WebKit to support building without CG/CF.

This is looking good. One issue with your approach to conditional that I think needs cleanup described below. I&apos;d also like a quick second opinion from a Win port hacker before landing this since I don&apos;t maintain this module.

&gt;Index: platform/graphics/win/GraphicsContextWin.cpp
&gt;===================================================================
&gt;--- platform/graphics/win/GraphicsContextWin.cpp	(revision 29726)
&gt;+++ platform/graphics/win/GraphicsContextWin.cpp	(working copy)
&gt;@@ -29,11 +29,15 @@
&gt; #include &quot;AffineTransform.h&quot;
&gt; #include &quot;NotImplemented.h&quot;
&gt; #include &quot;Path.h&quot;
&gt;-#include &lt;CoreGraphics/CGBitmapContext.h&gt;
&gt;-#include &lt;WebKitSystemInterface/WebKitSystemInterface.h&gt;
&gt; #include &lt;wtf/MathExtras.h&gt;
&gt; 
&gt;+#if PLATFORM(CG)
&gt;+#include &lt;CoreGraphics/CGBitmapContext.h&gt;
&gt;+#include &lt;WebKitSystemInterface/WebKitSystemInterface.h&gt;
&gt; #include &quot;GraphicsContextPlatformPrivate.h&quot;
&gt;+#else
&gt;+#include &lt;cairo-win32.h&gt;
&gt;+#endif

Please make this #elif PLATFORM(CAIRO)

&gt; 
&gt; using namespace std;
&gt; 
&gt;@@ -41,6 +45,7 @@ namespace WebCore {
&gt; 
&gt; class SVGResourceImage;
&gt; 
&gt;+#if PLATFORM(CG)
&gt; static CGContextRef CGContextWithHDC(HDC hdc)
&gt; {
&gt;     HBITMAP bitmap = (HBITMAP)GetCurrentObject(hdc, OBJ_BITMAP);
&gt;@@ -76,9 +81,11 @@ GraphicsContext::GraphicsContext(HDC hdc
&gt;         setPlatformStrokeColor(strokeColor());
&gt;     }
&gt; }
&gt;+#endif
&gt; 
&gt; HDC GraphicsContext::getWindowsContext(const IntRect&amp; dstRect, bool supportAlphaBlend)
&gt; {
&gt;+#if PLATFORM(CG)
&gt;     if (inTransparencyLayer()) {
&gt;         if (dstRect.isEmpty())
&gt;             return 0;
&gt;@@ -132,12 +139,37 @@ HDC GraphicsContext::getWindowsContext(c
&gt;     CGContextFlush(platformContext());
&gt;     m_data-&gt;save();
&gt;     return m_data-&gt;m_hdc;
&gt;+#else
&gt;+    // This is probably wrong, and definitely out of date.  Pulled from old SVN
&gt;+    cairo_surface_t* surface = cairo_get_target(platformContext());
&gt;+    HDC hdc = cairo_win32_surface_get_dc(surface);   
&gt;+    SaveDC(hdc);
&gt;+
&gt;+    // FIXME: We need to make sure a clip is really set on the HDC.
&gt;+    // Call SetWorldTransform to honor the current Cairo transform.
&gt;+    SetGraphicsMode(hdc, GM_ADVANCED); // We need this call for themes to honor world transforms.
&gt;+    cairo_matrix_t mat;
&gt;+    cairo_get_matrix(platformContext(), &amp;mat);
&gt;+    XFORM xform;
&gt;+    xform.eM11 = mat.xx;
&gt;+    xform.eM12 = mat.xy;
&gt;+    xform.eM21 = mat.yx;
&gt;+    xform.eM22 = mat.yy;
&gt;+    xform.eDx = mat.x0;
&gt;+    xform.eDy = mat.y0;
&gt;+    SetWorldTransform(hdc, &amp;xform);
&gt;+
&gt;+    return hdc;
&gt;+#endif

#elif PLATFORM(CAIRO) again. In this case, also add _another_ #else with a notImplemented() after the CAIRO case.

&gt; }
&gt; 
&gt;+#if PLATFORM(CG)
&gt; bool GraphicsContext::inTransparencyLayer() const { return m_data-&gt;m_transparencyCount; }
&gt;+#endif
&gt; 
&gt; void GraphicsContext::releaseWindowsContext(HDC hdc, const IntRect&amp; dstRect, bool supportAlphaBlend)
&gt; {
&gt;+#if PLATFORM(CG)
&gt;     if (hdc &amp;&amp; inTransparencyLayer()) {
&gt;         if (dstRect.isEmpty())
&gt;             return;
&gt;@@ -169,8 +201,15 @@ void GraphicsContext::releaseWindowsCont
&gt;     }
&gt; 
&gt;     m_data-&gt;restore();
&gt;+#else
&gt;+    cairo_surface_t* surface = cairo_get_target(platformContext());
&gt;+    HDC hdc2 = cairo_win32_surface_get_dc(surface);
&gt;+    RestoreDC(hdc2, -1);
&gt;+    cairo_surface_mark_dirty(surface);
&gt;+#endif

Ditto here and all the other places.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68028</commentid>
    <comment_count>3</comment_count>
    <who name="Alp Toker">alp</who>
    <bug_when>2008-01-23 06:52:46 -0800</bug_when>
    <thetext>On second thought, the &quot;#else with a notImplemented() after the CAIRO case&quot; may be overkill. At your discretion.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68031</commentid>
    <comment_count>4</comment_count>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-01-23 08:34:13 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; On second thought, the &quot;#else with a notImplemented() after the CAIRO case&quot; may
&gt; be overkill. At your discretion.

Yeah, I think a build failure is as good as or better than all those notImplemented()s.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68032</commentid>
    <comment_count>5</comment_count>
      <attachid>18613</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-01-23 08:39:53 -0800</bug_when>
    <thetext>Comment on attachment 18613
Initial patch to WebKit to support building without CG/CF.

I don&apos;t think it&apos;s so great to have all these #ifdefs within each &quot;Win&quot; file. I think we&apos;re taking &quot;Win&quot; too literally here -- it doesn&apos;t (and shouldn&apos;t) mean &quot;any port building on Windows&quot; (for example, Qt/win doesn&apos;t use these files). Right now &quot;Win&quot; means &quot;the Windows port which depends on CG, CF, CFNetwork, etc.&quot;. Clearly &quot;Win&quot; is not a great name for this. We should try to come up with a better name for the current port and a good name for the port you&apos;re starting to create. Then we can separate the implementations into separate files for each port, instead of tossing all these #ifdefs in.

I&apos;ve CCed Darin because I know he&apos;s been thinking about this naming issue as well.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68035</commentid>
    <comment_count>6</comment_count>
    <who name="Alp Toker">alp</who>
    <bug_when>2008-01-23 09:05:45 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 18613 [edit])
&gt; I don&apos;t think it&apos;s so great to have all these #ifdefs within each &quot;Win&quot; file. I
&gt; think we&apos;re taking &quot;Win&quot; too literally here -- it doesn&apos;t (and shouldn&apos;t) mean
&gt; &quot;any port building on Windows&quot; (for example, Qt/win doesn&apos;t use these files).
&gt; Right now &quot;Win&quot; means &quot;the Windows port which depends on CG, CF, CFNetwork,
&gt; etc.&quot;. Clearly &quot;Win&quot; is not a great name for this. We should try to come up
&gt; with a better name for the current port and a good name for the port you&apos;re
&gt; starting to create. Then we can separate the implementations into separate
&gt; files for each port, instead of tossing all these #ifdefs in.

I don&apos;t think the conditionals hurt readability here, but obviously you spend more time working with this code, so you may disagree.

I think there are benefits in sharing the code rather than forking it into a new port. WIN should probably be made to only the &quot;native&quot; parts of the Windows ports, which is a slight semantic change, but can be introduced incrementally without vast search and replace or build system changes.

Which source files are you worried about, specifically?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68036</commentid>
    <comment_count>7</comment_count>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-01-23 09:19:13 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; I think there are benefits in sharing the code rather than forking it into a
&gt; new port. WIN should probably be made to only the &quot;native&quot; parts of the Windows
&gt; ports, which is a slight semantic change, but can be introduced incrementally
&gt; without vast search and replace or build system changes.

(I&apos;m not sure what &quot;native&quot; really means here. Is Cairo a &quot;native&quot; Win32 library? It doesn&apos;t seem to be any more so than CoreGraphics, for example. So we&apos;ll probably need a more descriptive name than &quot;native&quot; for whatever this port becomes.)

I&apos;m not suggesting that we abandon all code sharing. But there are many places in this patch where the entire body of a function is #ifdef&apos;d, which I think is much less readable than splitting the two versions of the function into separate files. Places where only parts of a function body are #ifdef&apos;d are probably good candidates for refactoring, perhaps by splitting out the #ifdef&apos;d parts into a helper function.

&gt; Which source files are you worried about, specifically?

For example, SearchPopupMenuWin.cpp is not really useful if you don&apos;t have CF, as the entire implementation is based on it, so I don&apos;t see any benefit to sharing this file with a port that doesn&apos;t use CF.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68039</commentid>
    <comment_count>8</comment_count>
    <who name="Alp Toker">alp</who>
    <bug_when>2008-01-23 09:45:43 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; (In reply to comment #6)
&gt; &gt; I think there are benefits in sharing the code rather than forking it into a
&gt; &gt; new port. WIN should probably be made to only the &quot;native&quot; parts of the Windows
&gt; &gt; ports, which is a slight semantic change, but can be introduced incrementally
&gt; &gt; without vast search and replace or build system changes.
&gt; 
&gt; (I&apos;m not sure what &quot;native&quot; really means here. Is Cairo a &quot;native&quot; Win32

By &quot;native&quot;, I mean the code that uses Win32 API directly, for example places where we use GDI directly. I&apos;m suggesting that WIN can refer to these bits.

Cairo or CG certainly don&apos;t fall into the &quot;native&quot; category -- they have their own platform defines.

&gt; &gt; Which source files are you worried about, specifically?
&gt; 
&gt; For example, SearchPopupMenuWin.cpp is not really useful if you don&apos;t have CF,
&gt; as the entire implementation is based on it, so I don&apos;t see any benefit to
&gt; sharing this file with a port that doesn&apos;t use CF.
&gt; 

Many of the *Win source files only use Win32 directly and aren&apos;t Apple-specific at all, so it makes sense to continue to use Win as an umbrella port name here.

Files which are mostly Apple-Win should probably be given a new name. I&apos;d propose moving SearchPopupMenuWin.cpp to SearchPopupMenuAWin.cpp and creating a new SearchPopupMenuWin.cpp that uses native Win32 (Cairo doesn&apos;t come into the picture here) for now. I actually suspect there won&apos;t be all that many files that need renaming to AWin.

My AWin proposal is just to get the debate going, you may have better ideas :-)

I think it&apos;ll become more clear how to elegantly split the code modules as the port develops and starts to work.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68047</commentid>
    <comment_count>9</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-01-23 11:53:45 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; (I&apos;m not sure what &quot;native&quot; really means here. Is Cairo a &quot;native&quot; Win32
&gt; library? It doesn&apos;t seem to be any more so than CoreGraphics, for example. So
&gt; we&apos;ll probably need a more descriptive name than &quot;native&quot; for whatever this
&gt; port becomes.)

It&apos;s more &apos;native&apos; in that someone could legally take the code and do something with it.  At the moment, I can&apos;t use a CG-based WebKit to do anything but play at home.

And for all practical purposes, a Cairo back-end is probably as close to a &apos;native&apos; win32 build as we are likely to get, as replicating the Cairo functionality in GDI/GDI+/etc. seems like a waste of time.  The only reason I am pursuing the Cairo work is that I can&apos;t ship WebKit with my application using the CG-based backend.

</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68053</commentid>
    <comment_count>10</comment_count>
      <attachid>18624</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-01-23 12:52:33 -0800</bug_when>
    <thetext>Created attachment 18624
Revised patch based on Alp&apos;s comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68055</commentid>
    <comment_count>11</comment_count>
      <attachid>18624</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-01-23 12:58:05 -0800</bug_when>
    <thetext>Comment on attachment 18624
Revised patch based on Alp&apos;s comments.

Looks like this contains some Drosera changes you didn&apos;t intend to include.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68056</commentid>
    <comment_count>12</comment_count>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-01-23 13:07:21 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; By &quot;native&quot;, I mean the code that uses Win32 API directly, for example places
&gt; where we use GDI directly. I&apos;m suggesting that WIN can refer to these bits.

That seems OK. &quot;Win32&quot; might be even more explicit, but I&apos;m not sure I prefer it.

&gt; Many of the *Win source files only use Win32 directly and aren&apos;t Apple-specific
&gt; at all, so it makes sense to continue to use Win as an umbrella port name here.
&gt; 
&gt; Files which are mostly Apple-Win should probably be given a new name. I&apos;d
&gt; propose moving SearchPopupMenuWin.cpp to SearchPopupMenuAWin.cpp and creating a
&gt; new SearchPopupMenuWin.cpp that uses native Win32 (Cairo doesn&apos;t come into the
&gt; picture here) for now.

Probably SearchPopupMenuCF.cpp is more appropriate (see below).

&gt; My AWin proposal is just to get the debate going, you may have better ideas :-)
&gt; 
&gt; I think it&apos;ll become more clear how to elegantly split the code modules as the
&gt; port develops and starts to work.

It seems like we need to have a distinction between configuration options and ports. I think of configuration options as things like &quot;enable SVG as image support&quot;, &quot;use Cairo for the graphics library&quot;, etc. The configuration options generally map to our preprocessor macros like PLATFORM() and ENABLE(). Ports I think of as bundles of configuration options, and the configuration options used for a particular port may change over time.

So, I think that something like an AWin suffix is too port-oriented, when it should really be configuration-option-based. We already have a lot of configuration-option-based filenames (*CG.cpp, *Cairo.cpp, etc.), so I think we should stick with that method.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68060</commentid>
    <comment_count>13</comment_count>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-01-23 13:11:08 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; (In reply to comment #7)
&gt; &gt; (I&apos;m not sure what &quot;native&quot; really means here. Is Cairo a &quot;native&quot; Win32
&gt; &gt; library? It doesn&apos;t seem to be any more so than CoreGraphics, for example. So
&gt; &gt; we&apos;ll probably need a more descriptive name than &quot;native&quot; for whatever this
&gt; &gt; port becomes.)
&gt; 
&gt; It&apos;s more &apos;native&apos; in that someone could legally take the code and do something
&gt; with it.  At the moment, I can&apos;t use a CG-based WebKit to do anything but play
&gt; at home.

I wouldn&apos;t really consider that a definition of the word &quot;native&quot;. But I don&apos;t want to mince words too much. I just don&apos;t think &quot;native&quot; is really a meaningful name for a port, since all ports on a particular platform could be considered more or less &quot;native&quot; depending on how many libraries they use to abstract away the underlying OS.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68065</commentid>
    <comment_count>14</comment_count>
    <who name="Alp Toker">alp</who>
    <bug_when>2008-01-23 13:43:17 -0800</bug_when>
    <thetext>Adam,

Agreed on all points. SearchPopupMenuCF.cpp is fine, and probably better than introducing a new port-oriented suffix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68071</commentid>
    <comment_count>15</comment_count>
      <attachid>18629</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-01-23 15:00:08 -0800</bug_when>
    <thetext>Created attachment 18629
Second revision based on Alp and Aroben&apos;s comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68075</commentid>
    <comment_count>16</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-01-23 15:45:18 -0800</bug_when>
    <thetext>(In reply to comment #14)
&gt; Agreed on all points. SearchPopupMenuCF.cpp is fine, and probably better than
&gt; introducing a new port-oriented suffix.

I think this sounds great, too.  It makes more sense to talk about win-cg, win-cairo, mac-cg, mac-cairo, etc...

In that case, the various files and even the PLATFORM(CG/CAIRO/whatever) are probably fine as-is, with the glaring exception of figuring out what to do with th e vcproj files...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68300</commentid>
    <comment_count>17</comment_count>
      <attachid>18629</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2008-01-26 08:40:37 -0800</bug_when>
    <thetext>Comment on attachment 18629
Second revision based on Alp and Aroben&apos;s comments.

+        First step of fully native win32 build.

I object to this description of what you&apos;re doing. There&apos;s nothing &quot;fully native&quot; about Cairo in my opinion.

I would say &quot;First step of getting Cairo-based WebKit working on Windows again&quot; or something like that.

The imageFromSelection function looks improperly ifdef&apos;d here. You&apos;ve put the entire body of the function inside and if and not provided an else case. I suggest putting the #if around the entire function, including the function name and arguments, or providing at least a call to notImplemented().

Also, it would be a lot better to move a function like this into its own file, one with a CGWin.cpp suffix, rather than have it sitting in a shared file with an #if around it.

Putting an #if around the body of a function starts us out going in the wrong direction for platform code. What we try to do is to share declarations in header files, and have implementations with separate functions in separate files without sprinkling them with #ifs. Actually using #if inside the implementations of files is our method of last resort and should only be used when our platform portability strategy has broken down.

 36 #if PLATFORM(CG)
3537 #include &lt;WebKitSystemInterface/WebKitSystemInterface.h&gt;
 38 #endif

This include should be moved out of the shared includes list into a separate section below. Please do that when adding #if to an includes list. That&apos;s how we format them.

Also, the if here is PLATFORM(CG), but the if below if PLATFORM(CF). I suggest using PLATFORM(CG) exclusively for these ifdefs. Since CG is based on CF, you are guaranteed to have CF if you have CG, and these bits of code are only helpful if you do have CG. I&apos;m not going to comment individually on each PLATFORM(CF), but I think they&apos;re all wrong.

I think it&apos;s a little strange to just #if out a function and leave it doing nothing when CG is not defined, but you&apos;re doing that in a number of places here. I strongly prefer at least putting #else notImplemented() in these places.

I really think it doesn&apos;t make sense to create a single heavily ifdef&apos;d GraphicsContextWin.cpp. Instead we should have GraphicsContextCairoWin.cpp and GraphicsContextCGWin.cpp and put only shared code into GraphicsContextWin.cpp.

 125 #if PLATFORM(CG)
 126 	imageHeight = CGImageGetHeight(image);
 127 	imageWidth = CGImageGetWidth(image);
 128 #elif PLATFORM(CAIRO)
 129 	imageHeight = cairo_image_surface_get_height(image);
 130 	imageWidth = cairo_image_surface_get_width(image);
 131 #endif

This code is indented wrong.

While there are no major problems with this patch, there are enough small mistakes that I&apos;m going to say review- for this round.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68395</commentid>
    <comment_count>18</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-01-27 16:09:14 -0800</bug_when>
    <thetext>From comment #4 From Adam Roben 2008-01-23 08:34 PDT [reply]
&gt; &gt; On second thought, the &quot;#else with a notImplemented() after the CAIRO case&quot; may
&gt; &gt; be overkill. At your discretion.
&gt;
&gt; Yeah, I think a build failure is as good as or better than all those
&gt; notImplemented()s.

(In reply to comment #17)
&gt; The imageFromSelection function looks improperly ifdef&apos;d here. You&apos;ve put the
&gt; entire body of the function inside and if and not provided an else case. I
&gt; suggest putting the #if around the entire function, including the function name
&gt; and arguments, or providing at least a call to notImplemented().

Okay guys, I&apos;ve been asked to removed the &apos;notImplemented&apos; calls in one review, and now am asked to  add them back in for the current review.  Could the Apple folks at least be consistent with how this should work?

As for the other comments, I&apos;m revising the patch to break into multiple files as you suggest (and as discussed in the earlier comments and IRC discussion).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68404</commentid>
    <comment_count>19</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2008-01-27 19:28:04 -0800</bug_when>
    <thetext>(In reply to comment #18)
&gt; Okay guys, I&apos;ve been asked to removed the &apos;notImplemented&apos; calls in one review,
&gt; and now am asked to add them back in for the current review.

I don&apos;t think I asked you to add them back. I told you to put the #if around the entire function.

My take:

    - A build failure is OK.
    - A notImplemented() is OK.
    - A broken function that compiles but does the wrong thing at runtime is much less OK.

If the function isn&apos;t implemented, either #if it so it&apos;s entirely omitted, or put something there to indicate it&apos;s not implemented. The imageFromSelection looks to me it will compile, but just do the wrong thing. It would be better to put the #if *around* imageFromSelection rathe than compiling an empty function.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68410</commentid>
    <comment_count>20</comment_count>
      <attachid>18731</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-01-27 20:18:20 -0800</bug_when>
    <thetext>Created attachment 18731
Third revision based on Darin and Alp&apos;s comments.

New patch that breaks implementation files into CG/Cairo-specific components.  Also uses the CGWin/CairoWin naming conventions.

Patch removes PLATFORM(CF) guards, since our first step is building with CF/CFNetwork, but Cairo instead of CG.  Therefore, those changes were out of scope for this change.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68434</commentid>
    <comment_count>21</comment_count>
      <attachid>18731</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-01-28 08:22:44 -0800</bug_when>
    <thetext>Comment on attachment 18731
Third revision based on Darin and Alp&apos;s comments.

This is really staring to look nice. I think breaking these methods up into separate files is really a good way to go.

It looks like some of your new files have the svn:executable property set on them. You should remove that by running

svn propdel svn:exectuable file1 file2 file3...

I&apos;ll post more review comments soon.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68447</commentid>
    <comment_count>22</comment_count>
      <attachid>18731</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-01-28 09:16:36 -0800</bug_when>
    <thetext>Comment on attachment 18731
Third revision based on Darin and Alp&apos;s comments.

I think it would be nicer to use &apos;svn cp&apos; when creating the *CGWin.cpp files. For example:

svn cp FrameWin.cpp FrameCGWin.cpp

That way it&apos;ll be easier to track the changes to the methods defined in the *CGWin.cpp files across the split in history.

The #includes in FrameCairoWin.cpp could probably be reduced quite a bit.

A number of your new methods in the *CairoWin.cpp files throughout this patch are missing return statements.

+GraphicsContext::GraphicsContext(HDC hdc)
+//    : m_common(createGraphicsContextPrivate())
+//    , m_data(new GraphicsContextPlatformPrivate(CGContextWithHDC(hdc)))
+{
+//    CGContextRelease(m_data-&gt;m_cgContext);

We generally don&apos;t like to commit commented-out code.

I think this is very close to being ready to go in to Subversion.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68470</commentid>
    <comment_count>23</comment_count>
      <attachid>18740</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-01-28 12:17:56 -0800</bug_when>
    <thetext>Created attachment 18740
Fourth revision based on Adam&apos;s comments.

* Uses &apos;svn cp&apos; to create CG-based files
* Added missing return statements in Cairo stub implementations.
* Removes unnecessary header includes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68535</commentid>
    <comment_count>24</comment_count>
      <attachid>18740</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2008-01-28 23:21:12 -0800</bug_when>
    <thetext>Comment on attachment 18740
Fourth revision based on Adam&apos;s comments.

Once you&apos;re inside a CG file, there is no need to conditionalize the header include (see FrameCGWin.cpp).

What&apos;s
// FIXME: Ideally we&apos;d have an isPluginView() here but we can&apos;t add that to the open source tree right now.
?

We use static_cast in c++ code instead of c-style casts:
(float)printRect.height()

Unnecessary float-double conversion here:
float printedPagesHeight = 0.0;
0.0f instead.

Spaces after commas:
pages.append(IntRect(0,printedPagesHeight,currPageWidth,currPageHeight));

Again:
IntRect ir((int)fr.x(), (int)fr.y(),(int)fr.width(),(int)fr.height());

If I&apos;m picking on you about existing code that&apos;s somehow showing up as + lines, my apologies... I should be picking on aroben or whatever Apple windows hacker violated their own published guidelines. :)

We don&apos;t generally commit commented out code:
71         /*if (fillColor.hasAlpha() || graphicsContext-&gt;inTransparencyLayer()) {
 72             // GDI can&apos;t handle drawing transparent text.  We have to draw into a mask.  We draw black text on a white-filled background.
 73             // We also do this when inside transparency layers, since GDI also can&apos;t draw onto a surface with alpha.
 74             graphicsContext-&gt;save();
 75             graphicsContext-&gt;setFillColor(Color::white);
 76             textDrawingDC = graphicsContext-&gt;getWindowsBitmapContext(textRect);
 77             SetTextColor(hdc, RGB(0, 0, 0));
 78         } else*/

braces are on the same line as the if:
    if (platformData.syntheticOblique())
 143     {

No commented out code:
//#include &quot;FontFallbackList.h&quot;

It looks like someone could come by with a second pass and push more code down into a shared GraphicsContextCG between the Mac impl and the Win impl.

Our naming style is:
setShouldApplyMacAscentHack(bool)
bool shouldApplyMacAscentHack()
not &quot;get&quot;

In general this patch looks great!

I&apos;ll let aroben or darin comment once more, but I think you&apos;re just about ready to go.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68586</commentid>
    <comment_count>25</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-01-29 09:16:30 -0800</bug_when>
    <thetext>(In reply to comment #24)
&gt; (From update of attachment 18740 [edit])
&gt; Once you&apos;re inside a CG file, there is no need to conditionalize the header
&gt; include (see FrameCGWin.cpp).

Some of these issues are caused by the use of &apos;svn cp&apos; to generate the initial &quot;CG&quot; variant files.  The final version of FrameCGWin.cpp does *not* have any conditionalization around the Core Graphics headers.

&gt; If I&apos;m picking on you about existing code that&apos;s somehow showing up as + lines,
&gt; my apologies... I should be picking on aroben or whatever Apple windows hacker
&gt; violated their own published guidelines. :)
&gt; 

Most of the items you mention are from existing code that was copied over from the &apos;parent&apos; class; however, it&apos;s good to get it right now (it may be a while before anyone looks at this again).

I&apos;ll make these changes and update the patch.
 

</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68684</commentid>
    <comment_count>26</comment_count>
      <attachid>18768</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-01-29 12:27:09 -0800</bug_when>
    <thetext>Created attachment 18768
Fifth revision based on Eric&apos;s comments

- Better use of &apos;float&apos; declarations.
- Change C-style casts to static_cast
- Remove commented-out code
- Rename &quot;getShouldApplyMacAscentHack&quot; to &quot;shouldApplyMacAscentHack&quot;
- Correct brace position on some if statements</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68687</commentid>
    <comment_count>27</comment_count>
      <attachid>18768</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-01-29 12:47:00 -0800</bug_when>
    <thetext>Comment on attachment 18768
Fifth revision based on Eric&apos;s comments

- * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
+ * Copyright (C) 2008 Apple Inc.  All rights reserved.

I think you need to retain the &quot;2006, 2007&quot; for the new *CGWin.cpp files, since the code in them (which is what the copyright pertains to) dates back to 2006.

+HBITMAP imageFromSelection(Frame* frame, bool forceBlackText)
+{
+    notImplemented();
+}

You&apos;re missing a return statement here.

+    setPaintingDisabled(!m_data-&gt;m_cgContext);
+    if (m_data-&gt;m_cgContext) {

Seems strange to have a member called m_cgContext in GraphicsContextCairoWin.cpp.

+    size_t imageHeight = 0;
+    size_t imageWidth = 0;
     for (int i = 0; i &lt; frames; ++i) {
-        CGImageRef image = frameAtIndex(i);
-        if (CGImageGetHeight(image) == (size_t)srcSize.height() &amp;&amp; CGImageGetWidth(image) == (size_t)srcSize.width()) {
+        NativeImagePtr image = frameAtIndex(i);
+        imageHeight = CGImageGetHeight(image);
+        imageWidth = CGImageGetWidth(image);
+        if (imageHeight == static_cast&lt;size_t&gt;(srcSize.height()) &amp;&amp; imageWidth == static_cast&lt;size_t&gt;(srcSize.width())) {

I don&apos;t think there&apos;s any reason to move the imageHeight and imageWidth declarations out of the for loop. We also don&apos;t tend to use typedefs like NativeImagePtr within the source files, just in the headers, so you should change that back to CGImageRef. Ditto for ImageCairoWin.cpp.

+    SelectObject(tempDC, bmp);
+    GraphicsContext gc(tempDC);
+#endif

I don&apos;t see what #if or #ifdef this #endif is matching.

Are the *CairoWin.cpp files supposed to compile yet? Or is this just an initial non-compiling-but-close version? I think landing a compiling version is vastly preferable to a non-compiling one.

I&apos;m going to r- so that we can get these last few niggling details worked out, but then this should be good to go!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68875</commentid>
    <comment_count>28</comment_count>
      <attachid>18805</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-01-30 17:52:32 -0800</bug_when>
    <thetext>Created attachment 18805
Sixth revision based on Adam&apos;s comments.

Another round of revisions.  This version is known to build under Cairo on Windows, but this patch does not touch several other files that need to be updated (RenderThemeSafari, PlatformScrollBarSafari).

I would really like to get this first series of changes committed before attacking the other stuff outside platform/graphics.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68876</commentid>
    <comment_count>29</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-01-30 17:54:45 -0800</bug_when>
    <thetext>Fixing things so that the *CairoWin stuff builds cleanly required touching the GraphicsContextCairo, so I would like a GTK user (e.g., alp) to confirm this doesn&apos;t break anything.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68887</commentid>
    <comment_count>30</comment_count>
    <who name="Alp Toker">alp</who>
    <bug_when>2008-01-30 21:10:31 -0800</bug_when>
    <thetext>(In reply to comment #24)
&gt; (From update of attachment 18740 [edit])
&gt; Once you&apos;re inside a CG file, there is no need to conditionalize the header
&gt; include (see FrameCGWin.cpp).
&gt; 
&gt; What&apos;s
&gt; // FIXME: Ideally we&apos;d have an isPluginView() here but we can&apos;t add that to the
&gt; open source tree right now.
&gt; ?
&gt; 
&gt; We use static_cast in c++ code instead of c-style casts:
&gt; (float)printRect.height()
&gt; 
&gt; Unnecessary float-double conversion here:
&gt; float printedPagesHeight = 0.0;
&gt; 0.0f instead.
&gt; 
&gt; Spaces after commas:
&gt; pages.append(IntRect(0,printedPagesHeight,currPageWidth,currPageHeight));
&gt; 
&gt; Again:
&gt; IntRect ir((int)fr.x(), (int)fr.y(),(int)fr.width(),(int)fr.height());
&gt; 
&gt; If I&apos;m picking on you about existing code that&apos;s somehow showing up as + lines,
&gt; my apologies... I should be picking on aroben or whatever Apple windows hacker
&gt; violated their own published guidelines. :)
&gt; 

It&apos;s probably not worth trying to clean up this code. The print spooler has already been abstracted and just needs to be svn mv&apos;d down into WebCore before we can kill the Win implementation completely. Fixing trivial style violations in existing code, especially code that&apos;s near end of life, makes the important parts of this patch harder to review.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68889</commentid>
    <comment_count>31</comment_count>
    <who name="Alp Toker">alp</who>
    <bug_when>2008-01-30 21:43:15 -0800</bug_when>
    <thetext>(In reply to comment #30)
&gt; It&apos;s probably not worth trying to clean up this code. The print spooler has
&gt; already been abstracted and just needs to be svn mv&apos;d down into WebCore before
&gt; we can kill the Win implementation completely. Fixing trivial style violations
&gt; in existing code, especially code that&apos;s near end of life, makes the important
&gt; parts of this patch harder to review.
&gt; 

Now that the coding style changes have been done, it&apos;s probably not worth removing them. Just worth noting this for future reference.

The WebCore/platform/graphics/cairo/GraphicsContextPlatformPrivate.h changes look spurious in the patch. Is this just an artifact of git/svn cp? I see the whole content of the file is added and then removed.

Patch looks good apart from these and some nit-picks (I think it&apos;s a bit too early to split some of these files -- I have a feeling they&apos;re going to merge back in a few commits as platform-specific code is removed.) Still, best to get this landed now and continue to develop it in tree.

Looks fine on the GTK+ side.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68893</commentid>
    <comment_count>32</comment_count>
      <attachid>18811</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-01-30 22:44:45 -0800</bug_when>
    <thetext>Created attachment 18811
Correct typo to Sixth patch

I manually edited the patch because the VCProj changes are a total mess right now, so I wanted to limit it to the original set of CG-only file additions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68912</commentid>
    <comment_count>33</comment_count>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-01-31 06:16:09 -0800</bug_when>
    <thetext>(In reply to comment #31)
&gt; The WebCore/platform/graphics/cairo/GraphicsContextPlatformPrivate.h changes
&gt; look spurious in the patch. Is this just an artifact of git/svn cp? I see the
&gt; whole content of the file is added and then removed.

I think you&apos;re getting confused by the (admittedly confusing) output from svn-create-patch. When there&apos;s an &apos;svn cp&apos; done followed by modifications to the new file, svn-create-patch creates two diffs for the file, one that adds it, and one that applies the modifications.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68913</commentid>
    <comment_count>34</comment_count>
      <attachid>18811</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-01-31 06:33:19 -0800</bug_when>
    <thetext>Comment on attachment 18811
Correct typo to Sixth patch

+    if (dc) {
+        cairo_surface_t* surface = cairo_win32_surface_create(dc);
+        m_data-&gt;cr = cairo_create(surface);
+	m_data-&gt;m_hdc = dc;
+    } else {
+        setPaintingDisabled(true);
+        m_data-&gt;cr = 0;
+	m_data-&gt;m_hdc = 0;
+    }

There are some tabs here that will have to be removed before landing.

 void BitmapImage::drawFrameMatchingSourceSize(GraphicsContext* ctxt, const FloatRect&amp; dstRect, const IntSize&amp; srcSize, CompositeOperator compositeOp)
 {
     int frames = frameCount();
+    size_t imageHeight = 0;
+    size_t imageWidth = 0;
     for (int i = 0; i &lt; frames; ++i) {
-        CGImageRef image = frameAtIndex(i);
-        if (CGImageGetHeight(image) == (size_t)srcSize.height() &amp;&amp; CGImageGetWidth(image) == (size_t)srcSize.width()) {
+        NativeImagePtr image = frameAtIndex(i);
+        imageHeight = CGImageGetHeight(image);
+        imageWidth = CGImageGetWidth(image);
+        if (imageHeight == static_cast&lt;size_t&gt;(srcSize.height()) &amp;&amp; imageWidth == static_cast&lt;size_t&gt;(srcSize.width())) {

I still don&apos;t think imageHeight and imageWidth should be moved out of the loop like this, and we should be using CGImageRef instead of NativeImagePtr. Similar comments apply to ImageCairoWin.cpp.

It&apos;s great that this builds now! These last couple of issues are the only problems I see.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68960</commentid>
    <comment_count>35</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-01-31 13:09:05 -0800</bug_when>
    <thetext>(In reply to comment #34)
&gt;  void BitmapImage::drawFrameMatchingSourceSize(GraphicsContext* ctxt, const
&gt; FloatRect&amp; dstRect, const IntSize&amp; srcSize, CompositeOperator compositeOp)
&gt;  {
&gt;      int frames = frameCount();
&gt; +    size_t imageHeight = 0;
&gt; +    size_t imageWidth = 0;
&gt;      for (int i = 0; i &lt; frames; ++i) {
&gt; -        CGImageRef image = frameAtIndex(i);
&gt; -        if (CGImageGetHeight(image) == (size_t)srcSize.height() &amp;&amp;
&gt; CGImageGetWidth(image) == (size_t)srcSize.width()) {
&gt; +        NativeImagePtr image = frameAtIndex(i);
&gt; +        imageHeight = CGImageGetHeight(image);
&gt; +        imageWidth = CGImageGetWidth(image);
&gt; +        if (imageHeight == static_cast&lt;size_t&gt;(srcSize.height()) &amp;&amp; imageWidth
&gt; == static_cast&lt;size_t&gt;(srcSize.width())) {
&gt; 
&gt; I still don&apos;t think imageHeight and imageWidth should be moved out of the loop
&gt; like this, and we should be using CGImageRef instead of NativeImagePtr. Similar
&gt; comments apply to ImageCairoWin.cpp.

Oh -- I forgot about this change.  I had done this when I was trying to fit Ciaro and CG code in the same file, so by lifting the height/width calculation out, I could #if/def around just those two lines and handle both cases.

It&apos;s not needed now, and I have now returned it to the original form. </thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68961</commentid>
    <comment_count>36</comment_count>
      <attachid>18829</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-01-31 13:09:15 -0800</bug_when>
    <thetext>Created attachment 18829
Seventh revision based on Adam&apos;s comments.

* Corrected drawFrameMatchingSourceSize implementations (in CG and Cairo code).
* Added path &quot;cg/&quot; and &quot;cairo/&quot; to include of Graphic
* Removed tabs.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68964</commentid>
    <comment_count>37</comment_count>
      <attachid>18829</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-01-31 14:06:20 -0800</bug_when>
    <thetext>Comment on attachment 18829
Seventh revision based on Adam&apos;s comments.

-#include &quot;GraphicsContextPlatformPrivate.h&quot;
+#include &quot;cg/GraphicsContextPlatformPrivate.h&quot;

While this works, it&apos;s not the way we do it. Instead of adding &quot;cg/&quot; to the header path, you should add the cg directory to the project&apos;s include path (defined in the .vcproj file).

Otherwise looks good, though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>68978</commentid>
    <comment_count>38</comment_count>
      <attachid>18835</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-01-31 16:25:51 -0800</bug_when>
    <thetext>Created attachment 18835
Eighth revision based on Adam&apos;s comments.

- Changed name of GraphicsContextPlatformPrivate.h to GraphicsContextPlatformPrivateCG.h and GraphicsContextPlatformPrivateCairo.h to avoid name conflict.
- Removed use of &quot;cg/&quot; and &quot;cairo/&quot; path specifiers in include statements.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>69367</commentid>
    <comment_count>39</comment_count>
      <attachid>18835</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-02-04 11:41:01 -0800</bug_when>
    <thetext>Comment on attachment 18835
Eighth revision based on Adam&apos;s comments.

Index: WebCore/platform/graphics/cg/GraphicsContextPlatformPrivateCG.h
===================================================================
--- WebCore/platform/graphics/cg/GraphicsContextPlatformPrivateCG.h	(revision 29726)
+++ WebCore/platform/graphics/cg/GraphicsContextPlatformPrivateCG.h	(working copy)
@@ -23,6 +23,10 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
  */
 
+#include &quot;config.h&quot;

This is wrong. We only include config.h from source files, not from header files. I don&apos;t think the #if PLATFORM(CG) in this file is needed anymore now that it has a CG-specific name. Ditto for GraphicsContextPlatformPrivateCairo.h.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>69374</commentid>
    <comment_count>40</comment_count>
      <attachid>18914</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-02-04 12:25:27 -0800</bug_when>
    <thetext>Created attachment 18914
Ninth patch based on Adam&apos;s comments.

* Removed &quot;config.h&quot; includes from GraphicsContexPlatformPrivate[CG|Cairo].h&quot;.
* Removed PLATFORM(CG)/PLATFORM(CAIRO) from GraphicsContexPlatformPrivate[CG|Cairo].h&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>69378</commentid>
    <comment_count>41</comment_count>
      <attachid>18914</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-02-04 12:40:54 -0800</bug_when>
    <thetext>Comment on attachment 18914
Ninth patch based on Adam&apos;s comments.

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>69622</commentid>
    <comment_count>42</comment_count>
      <attachid>18975</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-02-06 16:08:55 -0800</bug_when>
    <thetext>Created attachment 18975
Tenth revision to patch cleanly against today&apos;s SVN.

Regenerated patch against today&apos;s SVN.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>69632</commentid>
    <comment_count>43</comment_count>
      <attachid>18976</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-02-06 17:42:42 -0800</bug_when>
    <thetext>Created attachment 18976
Try #11 -- redo &apos;svn cp&apos; events to allow clean patch.

Update to build against current svn rev.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>69634</commentid>
    <comment_count>44</comment_count>
    <who name="Mark Rowe (bdash)">mrowe</who>
    <bug_when>2008-02-06 17:54:53 -0800</bug_when>
    <thetext>Landed in r30056.  Thanks for your patience and persistence with this!</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>18613</attachid>
            <date>2008-01-22 17:45:11 -0800</date>
            <delta_ts>2008-01-23 12:52:33 -0800</delta_ts>
            <desc>Initial patch to WebKit to support building without CG/CF.</desc>
            <filename>webcore-win32.patch</filename>
            <type>text/plain</type>
            <size>23403</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDI5NzI3
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDcgQEAKKzIwMDgtMDEt
MjIgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBnbWFpbC5jb20+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKwlGaXJzdCBzdGVwIG9mIGZ1bGx5IG5hdGl2ZSB3aW4z
MiBidWlsZC4gIFRoaXMgcGF0Y2g6CisJLSBhZGRzIHZhcmlvdXMgUExBVEZPUk0gZ3VhcmRzIHRv
IGNvZGUgdGhhdCB3aWxsIG5vdCBidWlsZCB1bmRlcgorCSAgc3RyaWN0IHdpbjMyIGxpYnJhcmll
cy4KKwktIHByb3ZpZGVzIHNvbWUgaW1wbGVtZW50YXRpb25zIG9mIHdpbjMyL0NhaXJvIHN1cHBv
cnQuCisKKyAgICAgICAgV0FSTklORzogTk8gVEVTVCBDQVNFUyBBRERFRCBPUiBDSEFOR0VECisK
KyAgICAgICAgKiBicmlkZ2Uvd2luL0ZyYW1lV2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Omlt
YWdlRnJvbVNlbGVjdGlvbik6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRE
YXRhYmFzZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpwb3B1bGF0ZUZvbnREYXRhYmFzZSk6Cisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRQbGF0Zm9ybURhdGFXaW4uY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6Rm9udFBsYXRmb3JtRGF0YTo6Rm9udFBsYXRmb3JtRGF0YSk6Cisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRXaW4uY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6Rm9udDo6ZHJhd0dseXBocyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0dyYXBoaWNzQ29udGV4dFdpbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQ6OmdldFdpbmRvd3NDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dDo6cmVsZWFzZVdpbmRvd3NDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y29uY2F0Q1RNKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dDo6ZHJhd0ZvY3VzUmluZyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQ6OmRyYXdMaW5lRm9yTWlzc3BlbGxpbmdPckJhZEdyYW1tYXIpOgorICAgICAgICAqIHBs
YXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZVdpbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpCaXRt
YXBJbWFnZTo6Z2V0SEJJVE1BUE9mU2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpCaXRtYXBJbWFn
ZTo6ZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXplKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy93aW4vU2ltcGxlRm9udERhdGFXaW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxl
Rm9udERhdGE6OnBsYXRmb3JtSW5pdCk6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0
YTo6cGxhdGZvcm1XaWR0aEZvckdseXBoKToKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL3dp
bi9Db29raWVKYXJXaW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6Y29va2llc0VuYWJsZWQpOgor
ICAgICAgICAqIHBsYXRmb3JtL3dpbi9DbGlwYm9hcmRVdGlsaXRpZXNXaW4uY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6Z2V0VVJMKToKKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vRHJhZ0ltYWdlV2lu
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OnNjYWxlRHJhZ0ltYWdlKToKKyAgICAgICAgKFdlYkNv
cmU6OmNyZWF0ZURyYWdJbWFnZUZyb21JbWFnZSk6CisgICAgICAgICogcGxhdGZvcm0vd2luL0Zp
bGVTeXN0ZW1XaW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6YnVuZGxlTmFtZSk6CisgICAgICAg
ICogcGxhdGZvcm0vd2luL1NlYXJjaFBvcHVwTWVudVdpbi5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpTZWFyY2hQb3B1cE1lbnU6OnNhdmVSZWNlbnRTZWFyY2hlcyk6CisgICAgICAgIChXZWJDb3Jl
OjpTZWFyY2hQb3B1cE1lbnU6OmxvYWRSZWNlbnRTZWFyY2hlcyk6CisKIDIwMDgtMDEtMjIgIERh
cmluIEFkbGVyICA8ZGFyaW5AYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IE9saXZl
ciBIdW50LgpJbmRleDogYnJpZGdlL3dpbi9GcmFtZVdpbi5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gYnJp
ZGdlL3dpbi9GcmFtZVdpbi5jcHAJKHJldmlzaW9uIDI5NzI2KQorKysgYnJpZGdlL3dpbi9GcmFt
ZVdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE1MCw2ICsxNTAsNyBAQCBzdGF0aWMgdm9pZCBk
cmF3UmVjdEludG9Db250ZXh0KEludFJlY3QgCiAKIEhCSVRNQVAgaW1hZ2VGcm9tU2VsZWN0aW9u
KEZyYW1lKiBmcmFtZSwgYm9vbCBmb3JjZUJsYWNrVGV4dCkKIHsKKyNpZiBQTEFURk9STShDRykK
ICAgICBmcmFtZS0+c2V0UGFpbnRSZXN0cmljdGlvbihmb3JjZUJsYWNrVGV4dCA/IFBhaW50UmVz
dHJpY3Rpb25TZWxlY3Rpb25Pbmx5QmxhY2tUZXh0IDogUGFpbnRSZXN0cmljdGlvblNlbGVjdGlv
bk9ubHkpOwogICAgIEZsb2F0UmVjdCBmciA9IGZyYW1lLT5zZWxlY3Rpb25SZWN0KCk7CiAgICAg
SW50UmVjdCBpcigoaW50KWZyLngoKSwgKGludClmci55KCksKGludClmci53aWR0aCgpLChpbnQp
ZnIuaGVpZ2h0KCkpOwpAQCAtMTgwLDYgKzE4MSwxMCBAQCBIQklUTUFQIGltYWdlRnJvbVNlbGVj
dGlvbihGcmFtZSogZnJhbWUsCiAgICAgZnJhbWUtPnNldFBhaW50UmVzdHJpY3Rpb24oUGFpbnRS
ZXN0cmljdGlvbk5vbmUpOwogCiAgICAgcmV0dXJuIGhibXA7CisjZWxzZQorICAgIG5vdEltcGxl
bWVudGVkKCk7CisgICAgcmV0dXJuIDA7CisjZW5kaWYKIH0KIAogRHJhZ0ltYWdlUmVmIEZyYW1l
OjpkcmFnSW1hZ2VGb3JTZWxlY3Rpb24oKQpJbmRleDogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0Zv
bnREYXRhYmFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRE
YXRhYmFzZS5jcHAJKHJldmlzaW9uIDI5NzI2KQorKysgcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0Zv
bnREYXRhYmFzZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMxLDggKzMxLDExIEBACiAKICNpbmNs
dWRlICJDU3RyaW5nLmgiCiAjaW5jbHVkZSAiRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgIk5vdElt
cGxlbWVudGVkLmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpZiBQTEFURk9STShD
RykKICNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNl
Lmg+CisjZW5kaWYKICNpbmNsdWRlIDxzaGxvYmouaD4KICNpbmNsdWRlIDx3dGYvUmV0YWluUHRy
Lmg+CiAKQEAgLTc2LDYgKzc5LDcgQEAgc3RhdGljIGJvb2wgc3lzdGVtSGFzRm9udHNOZXdlclRo
YW5Gb250cwogICAgIHJldHVybiBDb21wYXJlRmlsZVRpbWUoJnBsaXN0QXR0cmlidXRlcy5mdExh
c3RXcml0ZVRpbWUsICZmb250c0RpcmVjdG9yeUF0dHJpYnV0ZXMuZnRMYXN0V3JpdGVUaW1lKSA8
IDA7CiB9CiAKKyNpZiBQTEFURk9STShDRikKIHN0YXRpYyBSZXRhaW5QdHI8Q0ZQcm9wZXJ0eUxp
c3RSZWY+IHJlYWRGb250UGxpc3QoKQogewogICAgIENTdHJpbmcgcGxpc3RQYXRoID0gZm9udHNQ
bGlzdFBhdGgoKS51dGY4KCk7CkBAIC0xMzEsNiArMTM1LDcgQEAgc3RhdGljIHZvaWQgd3JpdGVG
b250RGF0YWJhc2VUb1BsaXN0KCkKIAogICAgIHNhZmVDcmVhdGVGaWxlKGZvbnRzUGxpc3RQYXRo
KCksIGRhdGEuZ2V0KCkpOwogfQorI2VuZGlmCiAKIHZvaWQgcG9wdWxhdGVGb250RGF0YWJhc2Uo
KQogewpAQCAtMTM5LDEyICsxNDQsMTYgQEAgdm9pZCBwb3B1bGF0ZUZvbnREYXRhYmFzZSgpCiAg
ICAgICAgIHJldHVybjsKICAgICBpbml0aWFsaXplZCA9IHRydWU7CiAKKyNpZiBQTEFURk9STShD
RikKICAgICBpZiAoIXN5c3RlbUhhc0ZvbnRzTmV3ZXJUaGFuRm9udHNQbGlzdCgpKQogICAgICAg
ICBpZiAocG9wdWxhdGVGb250RGF0YWJhc2VGcm9tUGxpc3QoKSkKICAgICAgICAgICAgIHJldHVy
bjsKIAogICAgIGlmIChwb3B1bGF0ZUZvbnREYXRhYmFzZUZyb21GaWxlU3lzdGVtKCkpCiAgICAg
ICAgIHdyaXRlRm9udERhdGFiYXNlVG9QbGlzdCgpOworI2Vsc2UKKyAgICBub3RJbXBsZW1lbnRl
ZCgpOworI2VuZGlmCiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IHBsYXRmb3Jt
L2dyYXBoaWNzL3dpbi9Gb250UGxhdGZvcm1EYXRhV2luLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBwbGF0
Zm9ybS9ncmFwaGljcy93aW4vRm9udFBsYXRmb3JtRGF0YVdpbi5jcHAJKHJldmlzaW9uIDI5NzI2
KQorKysgcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRQbGF0Zm9ybURhdGFXaW4uY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC00MSw2ICs0MSw3IEBAIHN0YXRpYyBjb25zdCBpbnQgQm9sZE9ibGlxdWUg
PSAoMSA8PCAyKTsKIAogc3RhdGljIGlubGluZSBVU0hPUlQgcmVhZEJpZ0VuZGlhbldvcmQoY29u
c3QgQllURSogd29yZCkgeyByZXR1cm4gKHdvcmRbMF0gPDwgOCkgfCB3b3JkWzFdOyB9CiAKKyNp
ZiBQTEFURk9STShDRikKIHN0YXRpYyBDRlN0cmluZ1JlZiBnZXRQb3N0U2NyaXB0TmFtZShDRlN0
cmluZ1JlZiBmYWNlTmFtZSwgSERDIGRjKQogewogICAgIGNvbnN0IERXT1JEIGNNYXhOYW1lVGFi
bGVTaXplID0gMTAyNCAqIDEwMjQ7CkBAIC0xMDksNiArMTEwLDcgQEAgc3RhdGljIENGU3RyaW5n
UmVmIGdldFBvc3RTY3JpcHROYW1lKENGUwogICAgICAgICBuYW1lTWFwLnNldChmYWNlU3RyaW5n
LCByZXN1bHQpOwogICAgIHJldHVybiByZXN1bHQuZ2V0KCk7CiB9CisjZW5kaWYKIAogc3RhdGlj
IGludCBDQUxMQkFDSyBlbnVtU3R5bGVzQ2FsbGJhY2soY29uc3QgTE9HRk9OVCogbG9nRm9udCwg
Y29uc3QgVEVYVE1FVFJJQyogbWV0cmljcywgRFdPUkQgZm9udFR5cGUsIExQQVJBTSBsUGFyYW0p
CiB7CkBAIC0xNzksNiArMTgxLDcgQEAgRm9udFBsYXRmb3JtRGF0YTo6Rm9udFBsYXRmb3JtRGF0
YShIRk9OVAogICAgICAgICAgICAgICAgICAgICBtX3N5bnRoZXRpY09ibGlxdWUgPSB0cnVlOwog
ICAgICAgICB9CiAKKyNpZiBQTEFURk9STShDRykKICAgICAgICAgLy8gVHJ5IHRoZSBmYWNlIG5h
bWUgZmlyc3QuICBXaW5kb3dzIG1heSBlbmQgdXAgbG9jYWxpemluZyB0aGlzIG5hbWUsIGFuZCBD
RyBkb2Vzbid0IGtub3cgYWJvdXQKICAgICAgICAgLy8gdGhlIGxvY2FsaXphdGlvbi4gIElmIHRo
ZSBjcmVhdGUgZmFpbHMsIHdlJ2xsIHRyeSB0aGUgUG9zdFNjcmlwdCBuYW1lLgogICAgICAgICBS
ZXRhaW5QdHI8Q0ZTdHJpbmdSZWY+IGZ1bGxOYW1lKEFkb3B0Q0YsIENGU3RyaW5nQ3JlYXRlV2l0
aENoYXJhY3RlcnMoTlVMTCwgKGNvbnN0IFVuaUNoYXIqKWZhY2VOYW1lLCB3Y3NsZW4oZmFjZU5h
bWUpKSk7CkBAIC0xOTAsNiArMTkzLDcgQEAgRm9udFBsYXRmb3JtRGF0YTo6Rm9udFBsYXRmb3Jt
RGF0YShIRk9OVAogICAgICAgICAgICAgICAgIEFTU0VSVChtX2NnRm9udCk7CiAgICAgICAgICAg
ICB9CiAgICAgICAgIH0KKyNlbmRpZgogICAgICAgICBmcmVlKG1ldHJpY3MpOwogICAgIH0KIApJ
bmRleDogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRXaW4uY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHBs
YXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250V2luLmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBwbGF0
Zm9ybS9ncmFwaGljcy93aW4vRm9udFdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMzLDggKzMz
LDEwIEBACiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRlICJTaW1wbGVGb250
RGF0YS5oIgogI2luY2x1ZGUgIlVuaXNjcmliZUNvbnRyb2xsZXIuaCIKKyNpZiBQTEFURk9STShD
RykKICNpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4K
ICNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+
CisjZW5kaWYKICNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgogCiBuYW1lc3BhY2UgV2ViQ29y
ZSB7CkBAIC0xMjcsNiArMTI5LDcgQEAgdm9pZCBGb250OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29u
dGV4dCogZwogICAgICAgICByZXR1cm47CiAgICAgfQogCisjaWYgUExBVEZPUk0oQ0cpCiAgICAg
Q0dDb250ZXh0UmVmIGNnQ29udGV4dCA9IGdyYXBoaWNzQ29udGV4dC0+cGxhdGZvcm1Db250ZXh0
KCk7CiAKICAgICB1aW50MzJfdCBvbGRGb250U21vb3RoaW5nU3R5bGUgPSB3a1NldEZvbnRTbW9v
dGhpbmdTdHlsZShjZ0NvbnRleHQpOwpAQCAtMTYxLDYgKzE2NCw5IEBAIHZvaWQgRm9udDo6ZHJh
d0dseXBocyhHcmFwaGljc0NvbnRleHQqIGcKICAgICB9CiAKICAgICB3a1Jlc3RvcmVGb250U21v
b3RoaW5nU3R5bGUoY2dDb250ZXh0LCBvbGRGb250U21vb3RoaW5nU3R5bGUpOworI2Vsc2UKKyAg
ICBub3RJbXBsZW1lbnRlZCgpOworI2VuZGlmCiB9CiAKIEZsb2F0UmVjdCBGb250OjpzZWxlY3Rp
b25SZWN0Rm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBJbnRQb2ludCYg
cG9pbnQsIGludCBoLApJbmRleDogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4
dFdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29u
dGV4dFdpbi5jcHAJKHJldmlzaW9uIDI5NzI2KQorKysgcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dy
YXBoaWNzQ29udGV4dFdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI5LDExICsyOSwxNSBAQAog
I2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgogI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgi
CiAjaW5jbHVkZSAiUGF0aC5oIgotI2luY2x1ZGUgPENvcmVHcmFwaGljcy9DR0JpdG1hcENvbnRl
eHQuaD4KLSNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJm
YWNlLmg+CiAjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KIAorI2lmIFBMQVRGT1JNKENHKQor
I2luY2x1ZGUgPENvcmVHcmFwaGljcy9DR0JpdG1hcENvbnRleHQuaD4KKyNpbmNsdWRlIDxXZWJL
aXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSAiR3Jh
cGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmgiCisjZWxzZQorI2luY2x1ZGUgPGNhaXJvLXdp
bjMyLmg+CisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIApAQCAtNDEsNiArNDUsNyBA
QCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIGNsYXNzIFNWR1Jlc291cmNlSW1hZ2U7CiAKKyNpZiBQ
TEFURk9STShDRykKIHN0YXRpYyBDR0NvbnRleHRSZWYgQ0dDb250ZXh0V2l0aEhEQyhIREMgaGRj
KQogewogICAgIEhCSVRNQVAgYml0bWFwID0gKEhCSVRNQVApR2V0Q3VycmVudE9iamVjdChoZGMs
IE9CSl9CSVRNQVApOwpAQCAtNzYsOSArODEsMTEgQEAgR3JhcGhpY3NDb250ZXh0OjpHcmFwaGlj
c0NvbnRleHQoSERDIGhkYwogICAgICAgICBzZXRQbGF0Zm9ybVN0cm9rZUNvbG9yKHN0cm9rZUNv
bG9yKCkpOwogICAgIH0KIH0KKyNlbmRpZgogCiBIREMgR3JhcGhpY3NDb250ZXh0OjpnZXRXaW5k
b3dzQ29udGV4dChjb25zdCBJbnRSZWN0JiBkc3RSZWN0LCBib29sIHN1cHBvcnRBbHBoYUJsZW5k
KQogeworI2lmIFBMQVRGT1JNKENHKQogICAgIGlmIChpblRyYW5zcGFyZW5jeUxheWVyKCkpIHsK
ICAgICAgICAgaWYgKGRzdFJlY3QuaXNFbXB0eSgpKQogICAgICAgICAgICAgcmV0dXJuIDA7CkBA
IC0xMzIsMTIgKzEzOSwzNyBAQCBIREMgR3JhcGhpY3NDb250ZXh0OjpnZXRXaW5kb3dzQ29udGV4
dChjCiAgICAgQ0dDb250ZXh0Rmx1c2gocGxhdGZvcm1Db250ZXh0KCkpOwogICAgIG1fZGF0YS0+
c2F2ZSgpOwogICAgIHJldHVybiBtX2RhdGEtPm1faGRjOworI2Vsc2UKKyAgICAvLyBUaGlzIGlz
IHByb2JhYmx5IHdyb25nLCBhbmQgZGVmaW5pdGVseSBvdXQgb2YgZGF0ZS4gIFB1bGxlZCBmcm9t
IG9sZCBTVk4KKyAgICBjYWlyb19zdXJmYWNlX3QqIHN1cmZhY2UgPSBjYWlyb19nZXRfdGFyZ2V0
KHBsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBIREMgaGRjID0gY2Fpcm9fd2luMzJfc3VyZmFjZV9n
ZXRfZGMoc3VyZmFjZSk7ICAgCisgICAgU2F2ZURDKGhkYyk7CisKKyAgICAvLyBGSVhNRTogV2Ug
bmVlZCB0byBtYWtlIHN1cmUgYSBjbGlwIGlzIHJlYWxseSBzZXQgb24gdGhlIEhEQy4KKyAgICAv
LyBDYWxsIFNldFdvcmxkVHJhbnNmb3JtIHRvIGhvbm9yIHRoZSBjdXJyZW50IENhaXJvIHRyYW5z
Zm9ybS4KKyAgICBTZXRHcmFwaGljc01vZGUoaGRjLCBHTV9BRFZBTkNFRCk7IC8vIFdlIG5lZWQg
dGhpcyBjYWxsIGZvciB0aGVtZXMgdG8gaG9ub3Igd29ybGQgdHJhbnNmb3Jtcy4KKyAgICBjYWly
b19tYXRyaXhfdCBtYXQ7CisgICAgY2Fpcm9fZ2V0X21hdHJpeChwbGF0Zm9ybUNvbnRleHQoKSwg
Jm1hdCk7CisgICAgWEZPUk0geGZvcm07CisgICAgeGZvcm0uZU0xMSA9IG1hdC54eDsKKyAgICB4
Zm9ybS5lTTEyID0gbWF0Lnh5OworICAgIHhmb3JtLmVNMjEgPSBtYXQueXg7CisgICAgeGZvcm0u
ZU0yMiA9IG1hdC55eTsKKyAgICB4Zm9ybS5lRHggPSBtYXQueDA7CisgICAgeGZvcm0uZUR5ID0g
bWF0LnkwOworICAgIFNldFdvcmxkVHJhbnNmb3JtKGhkYywgJnhmb3JtKTsKKworICAgIHJldHVy
biBoZGM7CisjZW5kaWYKIH0KIAorI2lmIFBMQVRGT1JNKENHKQogYm9vbCBHcmFwaGljc0NvbnRl
eHQ6OmluVHJhbnNwYXJlbmN5TGF5ZXIoKSBjb25zdCB7IHJldHVybiBtX2RhdGEtPm1fdHJhbnNw
YXJlbmN5Q291bnQ7IH0KKyNlbmRpZgogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6cmVsZWFzZVdp
bmRvd3NDb250ZXh0KEhEQyBoZGMsIGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGJvb2wgc3VwcG9y
dEFscGhhQmxlbmQpCiB7CisjaWYgUExBVEZPUk0oQ0cpCiAgICAgaWYgKGhkYyAmJiBpblRyYW5z
cGFyZW5jeUxheWVyKCkpIHsKICAgICAgICAgaWYgKGRzdFJlY3QuaXNFbXB0eSgpKQogICAgICAg
ICAgICAgcmV0dXJuOwpAQCAtMTY5LDggKzIwMSwxNSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6
cmVsZWFzZVdpbmRvd3NDb250CiAgICAgfQogCiAgICAgbV9kYXRhLT5yZXN0b3JlKCk7CisjZWxz
ZQorICAgIGNhaXJvX3N1cmZhY2VfdCogc3VyZmFjZSA9IGNhaXJvX2dldF90YXJnZXQocGxhdGZv
cm1Db250ZXh0KCkpOworICAgIEhEQyBoZGMyID0gY2Fpcm9fd2luMzJfc3VyZmFjZV9nZXRfZGMo
c3VyZmFjZSk7CisgICAgUmVzdG9yZURDKGhkYzIsIC0xKTsKKyAgICBjYWlyb19zdXJmYWNlX21h
cmtfZGlydHkoc3VyZmFjZSk7CisjZW5kaWYKIH0KIAorI2lmIFBMQVRGT1JNKENHKQogdm9pZCBH
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnNhdmUoKQogewogICAgIGlmICghbV9oZGMp
CkBAIC0yNDYsNiArMjg1LDggQEAgdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6
OmNvbgogewogICAgIGlmICghbV9oZGMpCiAgICAgICAgIHJldHVybjsKKworI2lmIFBMQVRGT1JN
KENHKQogICAgIENHQWZmaW5lVHJhbnNmb3JtIG1hdCA9IHRyYW5zZm9ybTsKICAgICBYRk9STSB4
Zm9ybTsKICAgICB4Zm9ybS5lTTExID0gbWF0LmE7CkBAIC0yNTQsMTQgKzI5NSwyOCBAQCB2b2lk
IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y29uCiAgICAgeGZvcm0uZU0yMiA9IG1h
dC5kOwogICAgIHhmb3JtLmVEeCA9IG1hdC50eDsKICAgICB4Zm9ybS5lRHkgPSBtYXQudHk7Cisj
ZWxzZQorICAgIGNhaXJvX21hdHJpeF90IG1hdDsKKyAgICBjYWlyb19nZXRfbWF0cml4KHBsYXRm
b3JtQ29udGV4dCgpLCAmbWF0KTsKKyAgICBYRk9STSB4Zm9ybTsKKyAgICB4Zm9ybS5lTTExID0g
bWF0Lnh4OworICAgIHhmb3JtLmVNMTIgPSBtYXQueHk7CisgICAgeGZvcm0uZU0yMSA9IG1hdC55
eDsKKyAgICB4Zm9ybS5lTTIyID0gbWF0Lnl5OworICAgIHhmb3JtLmVEeCA9IG1hdC54MDsKKyAg
ICB4Zm9ybS5lRHkgPSBtYXQueTA7CisjZW5kaWYKKwogICAgIE1vZGlmeVdvcmxkVHJhbnNmb3Jt
KG1faGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOwogfQorI2VuZGlmCiAKIHZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpkcmF3Rm9jdXNSaW5nKGNvbnN0IENvbG9yJiBjb2xvcikKIHsKICAgICBp
ZiAocGFpbnRpbmdEaXNhYmxlZCgpKQogICAgICAgICByZXR1cm47CiAKKyNpZiBQTEFURk9STShD
RykKICAgICBmbG9hdCByYWRpdXMgPSAoZm9jdXNSaW5nV2lkdGgoKSAtIDEpIC8gMi4wZjsKICAg
ICBpbnQgb2Zmc2V0ID0gcmFkaXVzICsgZm9jdXNSaW5nT2Zmc2V0KCk7CiAgICAgQ0dDb2xvclJl
ZiBjb2xvclJlZiA9IGNvbG9yLmlzVmFsaWQoKSA/IGNnQ29sb3IoY29sb3IpIDogMDsKQEAgLTI4
NSw2ICszNDAsOSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0ZvY3VzUmluZyhjb25zCiAg
ICAgQ0dQYXRoUmVsZWFzZShmb2N1c1JpbmdQYXRoKTsKIAogICAgIENHQ29udGV4dFJlc3RvcmVH
U3RhdGUoY29udGV4dCk7CisjZWxzZQorICAgIG5vdEltcGxlbWVudGVkKCk7CisjZW5kaWYKIH0K
IAogc3RhdGljIGNvbnN0IENvbG9yJiBzcGVsbGluZ1BhdHRlcm5Db2xvcigpIHsKQEAgLTI5Nyw2
ICszNTUsNyBAQCBzdGF0aWMgY29uc3QgQ29sb3ImIGdyYW1tYXJQYXR0ZXJuQ29sb3IoCiAgICAg
cmV0dXJuIGdyYW1tYXJDb2xvcjsKIH0KIAorI2lmIFBMQVRGT1JNKENHKQogLy8gUHVsbGVkIGZy
b20gR3JhcGhpY3NDb250ZXh0Q0cKIHN0YXRpYyB2b2lkIHNldENHU3Ryb2tlQ29sb3IoQ0dDb250
ZXh0UmVmIGNvbnRleHQsIGNvbnN0IENvbG9yJiBjb2xvcikKIHsKQEAgLTMwNCwxMiArMzYzLDE0
IEBAIHN0YXRpYyB2b2lkIHNldENHU3Ryb2tlQ29sb3IoQ0dDb250ZXh0UmUKICAgICBjb2xvci5n
ZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKICAgICBDR0NvbnRleHRTZXRSR0JTdHJv
a2VDb2xvcihjb250ZXh0LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CiB9CisjZW5kaWYKIAog
dm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yTWlzc3BlbGxpbmdPckJhZEdyYW1tYXIo
Y29uc3QgSW50UG9pbnQmIHBvaW50LCBpbnQgd2lkdGgsIGJvb2wgZ3JhbW1hcikKIHsKICAgICBp
ZiAocGFpbnRpbmdEaXNhYmxlZCgpKQogICAgICAgICByZXR1cm47Ci0gICAgCisKKyNpZiBQTEFU
Rk9STShDRykKICAgICAvLyBUaGVzZSBhcmUgdGhlIHNhbWUgZm9yIG1pc3NwZWxsaW5nIG9yIGJh
ZCBncmFtbWFyCiAgICAgY29uc3QgaW50IHBhdHRlcm5IZWlnaHQgPSAzOyAvLyAzIHJvd3MKICAg
ICBBU1NFUlQoY01pc3NwZWxsaW5nTGluZVRoaWNrbmVzcyA9PSBwYXR0ZXJuSGVpZ2h0KTsKQEAg
LTM3Miw2ICs0MzMsOSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JNaXNzcGVs
CiAgICAgQ0dDb250ZXh0U3Ryb2tlTGluZVNlZ21lbnRzKGNvbnRleHQsIGxvd2VyUG9pbnRzLCAy
KTsKIAogICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29udGV4dCk7CisjZWxzZQorICAgIG5v
dEltcGxlbWVudGVkKCk7CisjZW5kaWYKIH0KIAogI2lmIEVOQUJMRShTVkcpCkluZGV4OiBwbGF0
Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHBsYXRmb3JtL2dy
YXBoaWNzL3dpbi9JbWFnZVdpbi5jcHAJKHJldmlzaW9uIDI5NzI2KQorKysgcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL0ltYWdlV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcsNyArMjcsMTEgQEAK
ICNpbmNsdWRlICJJbWFnZS5oIgogI2luY2x1ZGUgIkJpdG1hcEltYWdlLmgiCiAjaW5jbHVkZSAi
R3JhcGhpY3NDb250ZXh0LmgiCisjaWYgUExBVEZPUk0oQ0cpCiAjaW5jbHVkZSA8QXBwbGljYXRp
b25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CisjZWxpZiBQTEFURk9STShDQUlSTykK
KyNpbmNsdWRlIDxjYWlyby5oPgorI2VuZGlmCiAKICNpbmNsdWRlIDx3aW5zb2NrMi5oPgogI2lu
Y2x1ZGUgPHdpbmRvd3MuaD4KQEAgLTY4LDYgKzcyLDcgQEAgYm9vbCBCaXRtYXBJbWFnZTo6Z2V0
SEJJVE1BUE9mU2l6ZShIQklUTQogICAgIEJJVE1BUCBibXBJbmZvOwogICAgIEdldE9iamVjdChi
bXAsIHNpemVvZihCSVRNQVApLCAmYm1wSW5mbyk7CiAKKyNpZiBQTEFURk9STShDRykKICAgICBB
U1NFUlQoYm1wSW5mby5ibUJpdHNQaXhlbCA9PSAzMik7CiAgICAgaW50IGJ1ZmZlclNpemUgPSBi
bXBJbmZvLmJtV2lkdGhCeXRlcyAqIGJtcEluZm8uYm1IZWlnaHQ7CiAgICAgCkBAIC03Niw2ICs4
MSwyMiBAQCBib29sIEJpdG1hcEltYWdlOjpnZXRIQklUTUFQT2ZTaXplKEhCSVRNCiAgICAgICAg
IDgsIGJtcEluZm8uYm1XaWR0aEJ5dGVzLCBkZXZpY2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMy
TGl0dGxlIHwga0NHSW1hZ2VBbHBoYVByZW11bHRpcGxpZWRGaXJzdCk7CiAgIAogICAgIEdyYXBo
aWNzQ29udGV4dCBnYyhjZ0NvbnRleHQpOworI2Vsc2UKKyAgICAvLyBJZiB0aGlzIGlzIGEgMzJi
cHAgYml0bWFwLCB3aGljaCBpdCBhbHdheXMgc2hvdWxkIGJlLCB3ZSdsbCBjbGVhciBpdCBzbyBh
bHBoYS13aXNlIGl0IHdpbGwgYmUgdmlzaWJsZQorICAgIGlmIChibXBJbmZvLmJtQml0c1BpeGVs
ID09IDMyKSB7CisgICAgICAgIGludCBidWZmZXJTaXplID0gYm1wSW5mby5ibVdpZHRoQnl0ZXMg
KiBibXBJbmZvLmJtSGVpZ2h0OworICAgICAgICBtZW1zZXQoYm1wSW5mby5ibUJpdHMsIDI1NSwg
YnVmZmVyU2l6ZSk7CisgICAgfQorIAkKKyAgICBIREMgdGVtcERDID0gQ3JlYXRlQ29tcGF0aWJs
ZURDKDApOworICAgIGlmICghdGVtcERDKSB7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRv
IGNyZWF0ZSBpbi1tZW1vcnkgREMgZm9yIEltYWdlOjpibGl0KCkiKTsKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIH0KKyAgICBTZWxlY3RPYmplY3QodGVtcERDLCBibXApOworICAgIEdyYXBo
aWNzQ29udGV4dCBnYyh0ZW1wREMpOworI2VuZGlmCisKICAgICBJbnRTaXplIGltYWdlU2l6ZSA9
IEJpdG1hcEltYWdlOjpzaXplKCk7CiAgICAgaWYgKHNpemUpCiAgICAgICAgIGRyYXdGcmFtZU1h
dGNoaW5nU291cmNlU2l6ZSgmZ2MsIEZsb2F0UmVjdCgwLCAwLCBibXBJbmZvLmJtV2lkdGgsIGJt
cEluZm8uYm1IZWlnaHQpLCBJbnRTaXplKCpzaXplKSwgQ29tcG9zaXRlQ29weSk7CkBAIC04Mywx
NyArMTA0LDMyIEBAIGJvb2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVBPZlNpemUoSEJJVE0KICAg
ICAgICAgZHJhdygmZ2MsIEZsb2F0UmVjdCgwLCAwLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8u
Ym1IZWlnaHQpLCBGbG9hdFJlY3QoMCwgMCwgaW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5o
ZWlnaHQoKSksIENvbXBvc2l0ZUNvcHkpOwogCiAgICAgLy8gRG8gY2xlYW51cAorI2lmIFBMQVRG
T1JNKENHKQogICAgIENHQ29udGV4dFJlbGVhc2UoY2dDb250ZXh0KTsKICAgICBDR0NvbG9yU3Bh
Y2VSZWxlYXNlKGRldmljZVJHQik7CisjZWxzZQorICAgIC8vIERvIGNsZWFudXAKKyAgICBEZWxl
dGVEQyh0ZW1wREMpOworI2VuZGlmCisKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBCaXRt
YXBJbWFnZTo6ZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXplKEdyYXBoaWNzQ29udGV4dCogY3R4
dCwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBjb25zdCBJbnRTaXplJiBzcmNTaXplLCBDb21w
b3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCkKIHsKICAgICBpbnQgZnJhbWVzID0gZnJhbWVDb3Vu
dCgpOworICAgIHNpemVfdCBpbWFnZUhlaWdodCA9IDA7CisgICAgc2l6ZV90IGltYWdlV2lkdGgg
PSAwOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVzOyArK2kpIHsKLSAgICAgICAgQ0dJ
bWFnZVJlZiBpbWFnZSA9IGZyYW1lQXRJbmRleChpKTsKLSAgICAgICAgaWYgKENHSW1hZ2VHZXRI
ZWlnaHQoaW1hZ2UpID09IChzaXplX3Qpc3JjU2l6ZS5oZWlnaHQoKSAmJiBDR0ltYWdlR2V0V2lk
dGgoaW1hZ2UpID09IChzaXplX3Qpc3JjU2l6ZS53aWR0aCgpKSB7CisgICAgICAgIE5hdGl2ZUlt
YWdlUHRyIGltYWdlID0gZnJhbWVBdEluZGV4KGkpOworI2lmIFBMQVRGT1JNKENHKQorCWltYWdl
SGVpZ2h0ID0gQ0dJbWFnZUdldEhlaWdodChpbWFnZSk7CisJaW1hZ2VXaWR0aCA9IENHSW1hZ2VH
ZXRXaWR0aChpbWFnZSk7CisjZWxzZQorCWltYWdlSGVpZ2h0ID0gY2Fpcm9faW1hZ2Vfc3VyZmFj
ZV9nZXRfaGVpZ2h0KGltYWdlKTsKKwlpbWFnZVdpZHRoID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9n
ZXRfd2lkdGgoaW1hZ2UpOworI2VuZGlmCisgICAgICAgIGlmIChpbWFnZUhlaWdodCA9PSAoc2l6
ZV90KXNyY1NpemUuaGVpZ2h0KCkgJiYgaW1hZ2VXaWR0aCA9PSAoc2l6ZV90KXNyY1NpemUud2lk
dGgoKSkgewogICAgICAgICAgICAgc2l6ZV90IGN1cnJlbnRGcmFtZSA9IG1fY3VycmVudEZyYW1l
OwogICAgICAgICAgICAgbV9jdXJyZW50RnJhbWUgPSBpOwogICAgICAgICAgICAgZHJhdyhjdHh0
LCBkc3RSZWN0LCBGbG9hdFJlY3QoMCwgMCwgc3JjU2l6ZS53aWR0aCgpLCBzcmNTaXplLmhlaWdo
dCgpKSwgY29tcG9zaXRlT3ApOwpJbmRleDogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZv
bnREYXRhV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBwbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxl
Rm9udERhdGFXaW4uY3BwCShyZXZpc2lvbiAyOTcyNikKKysrIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bi9TaW1wbGVGb250RGF0YVdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM0LDEzICszNCwxNiBA
QAogI2luY2x1ZGUgIkZvbnRDYWNoZS5oIgogI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgogI2luY2x1
ZGUgIkZvbnREZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCiAjaW5j
bHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KICNpbmNsdWRlIDx1bmljb2RlL3VjaGFyLmg+CiAjaW5j
bHVkZSA8dW5pY29kZS91bm9ybS5oPgorI2lmIFBMQVRGT1JNKENHKQogI2luY2x1ZGUgPEFwcGxp
Y2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgorI2luY2x1ZGUgPFdlYktpdFN5
c3RlbUludGVyZmFjZS9XZWJLaXRTeXN0ZW1JbnRlcmZhY2UuaD4KKyNlbmRpZgogI2luY2x1ZGUg
PG1sYW5nLmg+CiAjaW5jbHVkZSA8dGNoYXIuaD4KLSNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRl
cmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIApA
QCAtNTgsOCArNjEsMTAgQEAgdm9pZCBTaW1wbGVGb250RGF0YTo6c2V0U2hvdWxkQXBwbHlNYWNB
cwogfQogCiB2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUluaXQoKQoteyAgICAKK3sKKyNp
ZiBQTEFURk9STShDRykKICAgICBtX3N5bnRoZXRpY0JvbGRPZmZzZXQgPSBtX2ZvbnQuc3ludGhl
dGljQm9sZCgpID8gMS4wZiA6IDAuZjsKKyNlbmRpZgogICAgIG1fc2NyaXB0Q2FjaGUgPSAwOwog
ICAgIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMgPSAwOwogICAgIG1faXNTeXN0ZW1Gb250ID0gZmFs
c2U7CkBAIC0yNDksMTQgKzI1NCwyNCBAQCBmbG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1X
aWR0aEZvckdsCiAgICAgICAgIHJldHVybiB3aWR0aDsKICAgICB9CiAKKyNpZiBQTEFURk9STShD
RykKICAgICBDR0ZvbnRSZWYgZm9udCA9IG1fZm9udC5jZ0ZvbnQoKTsKICAgICBmbG9hdCBwb2lu
dFNpemUgPSBtX2ZvbnQuc2l6ZSgpOwogICAgIENHU2l6ZSBhZHZhbmNlOwogICAgIENHQWZmaW5l
VHJhbnNmb3JtIG0gPSBDR0FmZmluZVRyYW5zZm9ybU1ha2VTY2FsZShwb2ludFNpemUsIHBvaW50
U2l6ZSk7CisjZWxzZQorICAgIG5vdEltcGxlbWVudGVkKCk7CisjZW5kaWYKKyAKICAgICAvLyBG
SVhNRTogTmVlZCB0byBhZGQgcmVhbCBzdXBwb3J0IGZvciBwcmludGVyIGZvbnRzLgogICAgIGJv
b2wgaXNQcmludGVyRm9udCA9IGZhbHNlOwogICAgIHdrR2V0R2x5cGhBZHZhbmNlcyhmb250LCBt
LCBtX2lzU3lzdGVtRm9udCwgaXNQcmludGVyRm9udCwgZ2x5cGgsIGFkdmFuY2UpOworCisjaWYg
UExBVEZPUk0oQ0cpCiAgICAgcmV0dXJuIGFkdmFuY2Uud2lkdGggKyBtX3N5bnRoZXRpY0JvbGRP
ZmZzZXQ7CisjZWxzZQorICAgIHJldHVybiBhZHZhbmNlLndpZHRoOworI2VuZGlmCiB9CiAKIFND
UklQVF9GT05UUFJPUEVSVElFUyogU2ltcGxlRm9udERhdGE6OnNjcmlwdEZvbnRQcm9wZXJ0aWVz
KCkgY29uc3QKSW5kZXg6IHBsYXRmb3JtL25ldHdvcmsvd2luL0Nvb2tpZUphcldpbi5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gcGxhdGZvcm0vbmV0d29yay93aW4vQ29va2llSmFyV2luLmNwcAkocmV2aXNp
b24gMjk3MjYpCisrKyBwbGF0Zm9ybS9uZXR3b3JrL3dpbi9Db29raWVKYXJXaW4uY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xMjgsMTAgKzEyOCwxNiBAQCBTdHJpbmcgY29va2llcyhjb25zdCBEb2N1
bWVudCogLypkb2N1bWVuCiAKIGJvb2wgY29va2llc0VuYWJsZWQoY29uc3QgRG9jdW1lbnQqIC8q
ZG9jdW1lbnQqLykKIHsKKyNpZiBVU0UoQ0ZORVRXT1JLKQogICAgIENGSFRUUENvb2tpZVN0b3Jh
Z2VBY2NlcHRQb2xpY3kgcG9saWN5ID0gQ0ZIVFRQQ29va2llU3RvcmFnZUFjY2VwdFBvbGljeU9u
bHlGcm9tTWFpbkRvY3VtZW50RG9tYWluOwogICAgIGlmIChDRkhUVFBDb29raWVTdG9yYWdlUmVm
IGRlZmF1bHRDb29raWVTdG9yYWdlID0gd2tHZXREZWZhdWx0SFRUUENvb2tpZVN0b3JhZ2UoKSkK
ICAgICAgICAgcG9saWN5ID0gQ0ZIVFRQQ29va2llU3RvcmFnZUdldENvb2tpZUFjY2VwdFBvbGlj
eShkZWZhdWx0Q29va2llU3RvcmFnZSk7CiAgICAgcmV0dXJuIHBvbGljeSA9PSBDRkhUVFBDb29r
aWVTdG9yYWdlQWNjZXB0UG9saWN5T25seUZyb21NYWluRG9jdW1lbnREb21haW4gfHwgcG9saWN5
ID09IENGSFRUUENvb2tpZVN0b3JhZ2VBY2NlcHRQb2xpY3lBbHdheXM7CisjZWxzZQorICAgIC8v
IEZJWE1FOiBGb3Igbm93IGp1c3QgYXNzdW1lIGNvb2tpZXMgYXJlIGFsd2F5cyBvbi4gIFRoZXJl
IGlzIG5vIG9idmlvdXMgV2luZG93cyBBUEkgdG8gZ2V0IHRoaXMKKyAgICAvLyBzZXR0aW5nLgor
ICAgIHJldHVybiB0cnVlOworI2VuZGlmCiB9CiAKIH0KSW5kZXg6IHBsYXRmb3JtL3dpbi9DbGlw
Ym9hcmRVdGlsaXRpZXNXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHBsYXRmb3JtL3dpbi9DbGlwYm9h
cmRVdGlsaXRpZXNXaW4uY3BwCShyZXZpc2lvbiAyOTcyNikKKysrIHBsYXRmb3JtL3dpbi9DbGlw
Ym9hcmRVdGlsaXRpZXNXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMTEsMTIgKzMxMSwxNiBA
QCBTdHJpbmcgZ2V0VVJMKElEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBiCiAgICAgICAgIC8vZmls
ZSB1c2luZyB1bmljb2RlCiAgICAgICAgIHdjaGFyX3QqIGRhdGEgPSAod2NoYXJfdCopR2xvYmFs
TG9jayhzdG9yZS5oR2xvYmFsKTsKICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YVswXSAmJiAoUGF0
aEZpbGVFeGlzdHMoZGF0YSkgfHwgUGF0aElzVU5DKGRhdGEpKSkgeworI2lmIFBMQVRGT1JNKENG
KQogICAgICAgICAgICAgUmV0YWluUHRyPENGU3RyaW5nUmVmPiBwYXRoQXNDRlN0cmluZyhBZG9w
dENGLCBDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKGtDRkFsbG9jYXRvckRlZmF1bHQsIChj
b25zdCBVbmlDaGFyKilkYXRhLCB3Y3NsZW4oZGF0YSkpKTsKICAgICAgICAgICAgIGlmICh1cmxG
cm9tUGF0aChwYXRoQXNDRlN0cmluZy5nZXQoKSwgdXJsKSkgewogICAgICAgICAgICAgICAgIGlm
ICh0aXRsZSkKICAgICAgICAgICAgICAgICAgICAgKnRpdGxlID0gdXJsOwogICAgICAgICAgICAg
ICAgIHN1Y2Nlc3MgPSB0cnVlOwogICAgICAgICAgICAgfQorI2Vsc2UKKwkgICAgbm90SW1wbGVt
ZW50ZWQoKTsKKyNlbmRpZgogICAgICAgICB9CiAgICAgICAgIEdsb2JhbFVubG9jayhzdG9yZS5o
R2xvYmFsKTsgICAgICAKICAgICAgICAgUmVsZWFzZVN0Z01lZGl1bSgmc3RvcmUpOwpAQCAtMzI0
LDEyICszMjgsMTYgQEAgU3RyaW5nIGdldFVSTChJRGF0YU9iamVjdCogZGF0YU9iamVjdCwgYgog
ICAgICAgICAvL2ZpbGVuYW1lIHVzaW5nIGFzY2lpCiAgICAgICAgIGNoYXIqIGRhdGEgPSAoY2hh
ciopR2xvYmFsTG9jayhzdG9yZS5oR2xvYmFsKTsgICAgICAgCiAgICAgICAgIGlmIChkYXRhICYm
IGRhdGFbMF0gJiYgKFBhdGhGaWxlRXhpc3RzQShkYXRhKSB8fCBQYXRoSXNVTkNBKGRhdGEpKSkg
eworI2lmIFBMQVRGT1JNKENGKQogICAgICAgICAgICAgUmV0YWluUHRyPENGU3RyaW5nUmVmPiBw
YXRoQXNDRlN0cmluZyhBZG9wdENGLCBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKGtDRkFsbG9j
YXRvckRlZmF1bHQsIGRhdGEsIGtDRlN0cmluZ0VuY29kaW5nQVNDSUkpKTsKICAgICAgICAgICAg
IGlmICh1cmxGcm9tUGF0aChwYXRoQXNDRlN0cmluZy5nZXQoKSwgdXJsKSkgewogICAgICAgICAg
ICAgICAgIGlmICh0aXRsZSkKICAgICAgICAgICAgICAgICAgICAgKnRpdGxlID0gdXJsOwogICAg
ICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwogICAgICAgICAgICAgfQorI2Vsc2UKKwkgICAg
bm90SW1wbGVtZW50ZWQoKTsKKyNlbmRpZgogICAgICAgICB9CiAgICAgICAgIEdsb2JhbFVubG9j
ayhzdG9yZS5oR2xvYmFsKTsgICAgICAKICAgICAgICAgUmVsZWFzZVN0Z01lZGl1bSgmc3RvcmUp
OwpJbmRleDogcGxhdGZvcm0vd2luL0RyYWdJbWFnZVdpbi5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcGxh
dGZvcm0vd2luL0RyYWdJbWFnZVdpbi5jcHAJKHJldmlzaW9uIDI5NzI2KQorKysgcGxhdGZvcm0v
d2luL0RyYWdJbWFnZVdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI5LDkgKzI5LDEyIEBACiAj
aW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNp
bmNsdWRlICJJbWFnZS5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCiAjaW5jbHVkZSAi
UmV0YWluUHRyLmgiCiAKKyNpZiBQTEFURk9STShDRykKICNpbmNsdWRlIDxDb3JlR3JhcGhpY3Mv
Q29yZUdyYXBoaWNzLmg+CisjZW5kaWYKIAogI2luY2x1ZGUgPHdpbmRvd3MuaD4KIApAQCAtNTIs
NiArNTUsNyBAQCB2b2lkIGRlbGV0ZURyYWdJbWFnZShEcmFnSW1hZ2VSZWYgaW1hZ2UpCiAgICAg
ICAgIDo6RGVsZXRlT2JqZWN0KGltYWdlKTsKIH0KIAorI2lmIFBMQVRGT1JNKENHKQogSEJJVE1B
UCBhbGxvY0ltYWdlKEhEQyBkYywgSW50U2l6ZSBzaXplLCBDR0NvbnRleHRSZWYgKnRhcmdldFJl
ZikKIHsKICAgICBIQklUTUFQIGhibXA7CkBAIC05NCw5ICs5OCwxMSBAQCBzdGF0aWMgQ0dDb250
ZXh0UmVmIGNyZWF0ZUNnQ29udGV4dEZyb21CCiAgICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZp
Y2VSR0IpOwogICAgIHJldHVybiBiaXRtYXBDb250ZXh0OwogfQorI2VuZGlmCiAKIERyYWdJbWFn
ZVJlZiBzY2FsZURyYWdJbWFnZShEcmFnSW1hZ2VSZWYgaW1hZ2UsIEZsb2F0U2l6ZSBzY2FsZSkK
IHsKKyNpZiBQTEFURk9STShDRykKICAgICAvLyBGSVhNRTogZHVlIHRvIHRoZSB3YXkgZHJhZyBp
bWFnZXMgYXJlIGRvbmUgb24gd2luZG93cyB3ZSBuZWVkIAogICAgIC8vIHRvIHByZXByb2Nlc3Mg
dGhlIGFscGhhIGNoYW5uZWwgPHJkYXI6Ly9wcm9ibGVtLzUwMTU5NDY+CiAKQEAgLTEzNyw2ICsx
NDMsMTAgQEAgZXhpdDoKICAgICAgICAgRGVsZXRlREMoZHN0REMpOwogICAgIFJlbGVhc2VEQygw
LCBkYyk7CiAgICAgcmV0dXJuIGhibXA7CisjZWxzZQorICAgIG5vdEltcGxlbWVudGVkKCk7Cisg
ICAgcmV0dXJuIGltYWdlOworI2VuZGlmCiB9CiAgICAgCiBEcmFnSW1hZ2VSZWYgZGlzc29sdmVE
cmFnSW1hZ2VUb0ZyYWN0aW9uKERyYWdJbWFnZVJlZiBpbWFnZSwgZmxvYXQpCkBAIC0xNDYsNyAr
MTU2LDggQEAgRHJhZ0ltYWdlUmVmIGRpc3NvbHZlRHJhZ0ltYWdlVG9GcmFjdGlvbgogfQogICAg
ICAgICAKIERyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2UoSW1hZ2UqIGltZykK
LXsgICAgCit7CisjaWYgUExBVEZPUk0oQ0cpCQogICAgIEhCSVRNQVAgaGJtcCA9IDA7CiAgICAg
SERDIGRjID0gR2V0REMoMCk7CiAgICAgSERDIHdvcmtpbmdEQyA9IENyZWF0ZUNvbXBhdGlibGVE
QyhkYyk7CkBAIC0xODIsNiArMTkzLDEwIEBAIGV4aXQ6CiAgICAgICAgIERlbGV0ZURDKHdvcmtp
bmdEQyk7CiAgICAgUmVsZWFzZURDKDAsIGRjKTsKICAgICByZXR1cm4gaGJtcDsKKyNlbHNlCisg
ICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gaW1hZ2U7CisjZW5kaWYKIH0KICAgICAK
IERyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VJY29uRm9yQ2FjaGVkSW1hZ2UoQ2FjaGVkSW1h
Z2UqKQpJbmRleDogcGxhdGZvcm0vd2luL0ZpbGVTeXN0ZW1XaW4uY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IHBsYXRmb3JtL3dpbi9GaWxlU3lzdGVtV2luLmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBwbGF0
Zm9ybS93aW4vRmlsZVN5c3RlbVdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEyMiwxMCArMTIy
LDE0IEBAIHN0YXRpYyBTdHJpbmcgYnVuZGxlTmFtZSgpCiAgICAgaWYgKCFpbml0aWFsaXplZCkg
ewogICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7CiAKKyNpZiBQTEFURk9STShDRikKICAgICAg
ICAgaWYgKENGQnVuZGxlUmVmIGJ1bmRsZSA9IENGQnVuZGxlR2V0TWFpbkJ1bmRsZSgpKQogICAg
ICAgICAgICAgaWYgKENGVHlwZVJlZiBidW5kbGVFeGVjdXRhYmxlID0gQ0ZCdW5kbGVHZXRWYWx1
ZUZvckluZm9EaWN0aW9uYXJ5S2V5KGJ1bmRsZSwga0NGQnVuZGxlRXhlY3V0YWJsZUtleSkpCiAg
ICAgICAgICAgICAgICAgaWYgKENGR2V0VHlwZUlEKGJ1bmRsZUV4ZWN1dGFibGUpID09IENGU3Ry
aW5nR2V0VHlwZUlEKCkpCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSByZWludGVycHJldF9j
YXN0PENGU3RyaW5nUmVmPihidW5kbGVFeGVjdXRhYmxlKTsKKyNlbHNlCisgICAgbm90SW1wbGVt
ZW50ZWQoKTsKKyNlbmRpZgogICAgIH0KIAogICAgIHJldHVybiBuYW1lOwpJbmRleDogcGxhdGZv
cm0vd2luL1NlYXJjaFBvcHVwTWVudVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcGxhdGZvcm0vd2lu
L1NlYXJjaFBvcHVwTWVudVdpbi5jcHAJKHJldmlzaW9uIDI5NzI2KQorKysgcGxhdGZvcm0vd2lu
L1NlYXJjaFBvcHVwTWVudVdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIxLDYgKzIxLDcgQEAK
ICNpbmNsdWRlICJTZWFyY2hQb3B1cE1lbnUuaCIKIAogI2luY2x1ZGUgIkF0b21pY1N0cmluZy5o
IgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCiAjaW5jbHVkZSA8d3RmL1JldGFpblB0ci5o
PgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CkBAIC0zNSwxNyArMzYsMjAgQEAgYm9vbCBTZWFyY2hQ
b3B1cE1lbnU6OmVuYWJsZWQoKQogICAgIHJldHVybiB0cnVlOwogfQogCisjaWYgUExBVEZPUk0o
Q0YpCiBzdGF0aWMgUmV0YWluUHRyPENGU3RyaW5nUmVmPiBhdXRvc2F2ZUtleShjb25zdCBTdHJp
bmcmIG5hbWUpCiB7CiAgICAgU3RyaW5nIGtleSA9ICJjb20uYXBwbGUuV2ViS2l0LnNlYXJjaEZp
ZWxkOiIgKyBuYW1lOwogICAgIHJldHVybiBSZXRhaW5QdHI8Q0ZTdHJpbmdSZWY+KEFkb3B0Q0Ys
IGtleS5jcmVhdGVDRlN0cmluZygpKTsKIH0KKyNlbmRpZgogCiB2b2lkIFNlYXJjaFBvcHVwTWVu
dTo6c2F2ZVJlY2VudFNlYXJjaGVzKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSwgY29uc3QgVmVj
dG9yPFN0cmluZz4mIHNlYXJjaEl0ZW1zKQogewogICAgIGlmIChuYW1lLmlzRW1wdHkoKSkKICAg
ICAgICAgcmV0dXJuOwogCisjaWYgUExBVEZPUk0oQ0YpCiAgICAgUmV0YWluUHRyPENGTXV0YWJs
ZUFycmF5UmVmPiBpdGVtczsKIAogICAgIHNpemVfdCBzaXplID0gc2VhcmNoSXRlbXMuc2l6ZSgp
OwpAQCAtNTksNiArNjMsOSBAQCB2b2lkIFNlYXJjaFBvcHVwTWVudTo6c2F2ZVJlY2VudFNlYXJj
aGVzCiAKICAgICBDRlByZWZlcmVuY2VzU2V0QXBwVmFsdWUoYXV0b3NhdmVLZXkobmFtZSkuZ2V0
KCksIGl0ZW1zLmdldCgpLCBrQ0ZQcmVmZXJlbmNlc0N1cnJlbnRBcHBsaWNhdGlvbik7CiAgICAg
Q0ZQcmVmZXJlbmNlc0FwcFN5bmNocm9uaXplKGtDRlByZWZlcmVuY2VzQ3VycmVudEFwcGxpY2F0
aW9uKTsKKyNlbHNlCisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyNlbmRpZgogfQogCiB2b2lkIFNl
YXJjaFBvcHVwTWVudTo6bG9hZFJlY2VudFNlYXJjaGVzKGNvbnN0IEF0b21pY1N0cmluZyYgbmFt
ZSwgVmVjdG9yPFN0cmluZz4mIHNlYXJjaEl0ZW1zKQpAQCAtNjYsNiArNzMsNyBAQCB2b2lkIFNl
YXJjaFBvcHVwTWVudTo6bG9hZFJlY2VudFNlYXJjaGVzCiAgICAgaWYgKG5hbWUuaXNFbXB0eSgp
KQogICAgICAgICByZXR1cm47CiAKKyNpZiBQTEFURk9STShDRikKICAgICBzZWFyY2hJdGVtcy5j
bGVhcigpOwogICAgIFJldGFpblB0cjxDRkFycmF5UmVmPiBpdGVtcyhBZG9wdENGLCByZWludGVy
cHJldF9jYXN0PENGQXJyYXlSZWY+KENGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUoYXV0b3NhdmVL
ZXkobmFtZSkuZ2V0KCksIGtDRlByZWZlcmVuY2VzQ3VycmVudEFwcGxpY2F0aW9uKSkpOwogCkBA
IC03OCw2ICs4Niw5IEBAIHZvaWQgU2VhcmNoUG9wdXBNZW51Ojpsb2FkUmVjZW50U2VhcmNoZXMK
ICAgICAgICAgaWYgKENGR2V0VHlwZUlEKGl0ZW0pID09IENGU3RyaW5nR2V0VHlwZUlEKCkpCiAg
ICAgICAgICAgICBzZWFyY2hJdGVtcy5hcHBlbmQoaXRlbSk7CiAgICAgfQorI2Vsc2UKKyAgICBu
b3RJbXBsZW1lbnRlZCgpOworI2VuZGlmCiB9CiAKIH0K
</data>
<flag name="review"
          id="8142"
          type_id="1"
          status="-"
          setter="alp"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>18624</attachid>
            <date>2008-01-23 12:52:33 -0800</date>
            <delta_ts>2008-01-23 15:00:08 -0800</delta_ts>
            <desc>Revised patch based on Alp&apos;s comments.</desc>
            <filename>webcore-win32.patch</filename>
            <type>text/plain</type>
            <size>27530</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyOTcyNykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNDcgQEAKKzIwMDgtMDEtMjIgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBnbWFp
bC5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
Rmlyc3Qgc3RlcCBvZiBmdWxseSBuYXRpdmUgd2luMzIgYnVpbGQuICBUaGlzIHBhdGNoOgorICAg
ICAgICAtIGFkZHMgdmFyaW91cyBQTEFURk9STSBndWFyZHMgdG8gY29kZSB0aGF0IHdpbGwgbm90
IGJ1aWxkIHVuZGVyCisgICAgICAgICAgc3RyaWN0IHdpbjMyIGxpYnJhcmllcy4KKyAgICAgICAg
LSBwcm92aWRlcyBzb21lIGltcGxlbWVudGF0aW9ucyBvZiB3aW4zMi9DYWlybyBzdXBwb3J0Lgor
CisgICAgICAgIFdBUk5JTkc6IE5PIFRFU1QgQ0FTRVMgQURERUQgT1IgQ0hBTkdFRAorCisgICAg
ICAgICogYnJpZGdlL3dpbi9GcmFtZVdpbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjppbWFnZUZy
b21TZWxlY3Rpb24pOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250RGF0YWJh
c2UuY3BwOgorICAgICAgICAoV2ViQ29yZTo6cG9wdWxhdGVGb250RGF0YWJhc2UpOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250UGxhdGZvcm1EYXRhV2luLmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6OkZvbnRQbGF0Zm9ybURhdGE6OkZvbnRQbGF0Zm9ybURhdGEpOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250V2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OkZvbnQ6OmRyYXdHbHlwaHMpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFw
aGljc0NvbnRleHRXaW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0Ojpn
ZXRXaW5kb3dzQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnJl
bGVhc2VXaW5kb3dzQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHRQ
bGF0Zm9ybVByaXZhdGU6OmNvbmNhdENUTSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQ6OmRyYXdGb2N1c1JpbmcpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
OjpkcmF3TGluZUZvck1pc3NwZWxsaW5nT3JCYWRHcmFtbWFyKToKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy93aW4vSW1hZ2VXaW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6Qml0bWFwSW1h
Z2U6OmdldEhCSVRNQVBPZlNpemUpOgorICAgICAgICAoV2ViQ29yZTo6Qml0bWFwSW1hZ2U6OmRy
YXdGcmFtZU1hdGNoaW5nU291cmNlU2l6ZSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luL1NpbXBsZUZvbnREYXRhV2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnRE
YXRhOjpwbGF0Zm9ybUluaXQpOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnBs
YXRmb3JtV2lkdGhGb3JHbHlwaCk6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay93aW4vQ29v
a2llSmFyV2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmNvb2tpZXNFbmFibGVkKToKKyAgICAg
ICAgKiBwbGF0Zm9ybS93aW4vQ2xpcGJvYXJkVXRpbGl0aWVzV2luLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OmdldFVSTCk6CisgICAgICAgICogcGxhdGZvcm0vd2luL0RyYWdJbWFnZVdpbi5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpzY2FsZURyYWdJbWFnZSk6CisgICAgICAgIChXZWJDb3JlOjpj
cmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2UpOgorICAgICAgICAqIHBsYXRmb3JtL3dpbi9GaWxlU3lz
dGVtV2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmJ1bmRsZU5hbWUpOgorICAgICAgICAqIHBs
YXRmb3JtL3dpbi9TZWFyY2hQb3B1cE1lbnVXaW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6U2Vh
cmNoUG9wdXBNZW51OjpzYXZlUmVjZW50U2VhcmNoZXMpOgorICAgICAgICAoV2ViQ29yZTo6U2Vh
cmNoUG9wdXBNZW51Ojpsb2FkUmVjZW50U2VhcmNoZXMpOgorCiAyMDA4LTAxLTIyICBEYXJpbiBB
ZGxlciAgPGRhcmluQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBPbGl2ZXIgSHVu
dC4KSW5kZXg6IFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZVdpbi5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lV2luLmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJD
b3JlL2JyaWRnZS93aW4vRnJhbWVXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNTAsNiArMTUw
LDcgQEAgc3RhdGljIHZvaWQgZHJhd1JlY3RJbnRvQ29udGV4dChJbnRSZWN0IAogCiBIQklUTUFQ
IGltYWdlRnJvbVNlbGVjdGlvbihGcmFtZSogZnJhbWUsIGJvb2wgZm9yY2VCbGFja1RleHQpCiB7
CisjaWYgUExBVEZPUk0oQ0cpCiAgICAgZnJhbWUtPnNldFBhaW50UmVzdHJpY3Rpb24oZm9yY2VC
bGFja1RleHQgPyBQYWludFJlc3RyaWN0aW9uU2VsZWN0aW9uT25seUJsYWNrVGV4dCA6IFBhaW50
UmVzdHJpY3Rpb25TZWxlY3Rpb25Pbmx5KTsKICAgICBGbG9hdFJlY3QgZnIgPSBmcmFtZS0+c2Vs
ZWN0aW9uUmVjdCgpOwogICAgIEludFJlY3QgaXIoKGludClmci54KCksIChpbnQpZnIueSgpLChp
bnQpZnIud2lkdGgoKSwoaW50KWZyLmhlaWdodCgpKTsKQEAgLTE4MCw2ICsxODEsNyBAQCBIQklU
TUFQIGltYWdlRnJvbVNlbGVjdGlvbihGcmFtZSogZnJhbWUsCiAgICAgZnJhbWUtPnNldFBhaW50
UmVzdHJpY3Rpb24oUGFpbnRSZXN0cmljdGlvbk5vbmUpOwogCiAgICAgcmV0dXJuIGhibXA7Cisj
ZW5kaWYKIH0KIAogRHJhZ0ltYWdlUmVmIEZyYW1lOjpkcmFnSW1hZ2VGb3JTZWxlY3Rpb24oKQpJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udERhdGFiYXNlLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250RGF0YWJhc2UuY3Bw
CShyZXZpc2lvbiAyOTcyNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRE
YXRhYmFzZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMxLDggKzMxLDExIEBACiAKICNpbmNsdWRl
ICJDU3RyaW5nLmgiCiAjaW5jbHVkZSAiRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgIk5vdEltcGxl
bWVudGVkLmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpZiBQTEFURk9STShDRykK
ICNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+
CisjZW5kaWYKICNpbmNsdWRlIDxzaGxvYmouaD4KICNpbmNsdWRlIDx3dGYvUmV0YWluUHRyLmg+
CiAKQEAgLTc2LDYgKzc5LDcgQEAgc3RhdGljIGJvb2wgc3lzdGVtSGFzRm9udHNOZXdlclRoYW5G
b250cwogICAgIHJldHVybiBDb21wYXJlRmlsZVRpbWUoJnBsaXN0QXR0cmlidXRlcy5mdExhc3RX
cml0ZVRpbWUsICZmb250c0RpcmVjdG9yeUF0dHJpYnV0ZXMuZnRMYXN0V3JpdGVUaW1lKSA8IDA7
CiB9CiAKKyNpZiBQTEFURk9STShDRikKIHN0YXRpYyBSZXRhaW5QdHI8Q0ZQcm9wZXJ0eUxpc3RS
ZWY+IHJlYWRGb250UGxpc3QoKQogewogICAgIENTdHJpbmcgcGxpc3RQYXRoID0gZm9udHNQbGlz
dFBhdGgoKS51dGY4KCk7CkBAIC0xMzEsNiArMTM1LDcgQEAgc3RhdGljIHZvaWQgd3JpdGVGb250
RGF0YWJhc2VUb1BsaXN0KCkKIAogICAgIHNhZmVDcmVhdGVGaWxlKGZvbnRzUGxpc3RQYXRoKCks
IGRhdGEuZ2V0KCkpOwogfQorI2VuZGlmCiAKIHZvaWQgcG9wdWxhdGVGb250RGF0YWJhc2UoKQog
ewpAQCAtMTM5LDEyICsxNDQsMTYgQEAgdm9pZCBwb3B1bGF0ZUZvbnREYXRhYmFzZSgpCiAgICAg
ICAgIHJldHVybjsKICAgICBpbml0aWFsaXplZCA9IHRydWU7CiAKKyNpZiBQTEFURk9STShDRikK
ICAgICBpZiAoIXN5c3RlbUhhc0ZvbnRzTmV3ZXJUaGFuRm9udHNQbGlzdCgpKQogICAgICAgICBp
ZiAocG9wdWxhdGVGb250RGF0YWJhc2VGcm9tUGxpc3QoKSkKICAgICAgICAgICAgIHJldHVybjsK
IAogICAgIGlmIChwb3B1bGF0ZUZvbnREYXRhYmFzZUZyb21GaWxlU3lzdGVtKCkpCiAgICAgICAg
IHdyaXRlRm9udERhdGFiYXNlVG9QbGlzdCgpOworI2Vsc2UKKyAgICBub3RJbXBsZW1lbnRlZCgp
OworI2VuZGlmCiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRQbGF0Zm9ybURhdGFXaW4uY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRQbGF0Zm9ybURhdGFXaW4uY3BwCShy
ZXZpc2lvbiAyOTcyNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRQbGF0
Zm9ybURhdGFXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MSw2ICs0MSw3IEBAIHN0YXRpYyBj
b25zdCBpbnQgQm9sZE9ibGlxdWUgPSAoMSA8PCAyKTsKIAogc3RhdGljIGlubGluZSBVU0hPUlQg
cmVhZEJpZ0VuZGlhbldvcmQoY29uc3QgQllURSogd29yZCkgeyByZXR1cm4gKHdvcmRbMF0gPDwg
OCkgfCB3b3JkWzFdOyB9CiAKKyNpZiBQTEFURk9STShDRikKIHN0YXRpYyBDRlN0cmluZ1JlZiBn
ZXRQb3N0U2NyaXB0TmFtZShDRlN0cmluZ1JlZiBmYWNlTmFtZSwgSERDIGRjKQogewogICAgIGNv
bnN0IERXT1JEIGNNYXhOYW1lVGFibGVTaXplID0gMTAyNCAqIDEwMjQ7CkBAIC0xMDksNiArMTEw
LDcgQEAgc3RhdGljIENGU3RyaW5nUmVmIGdldFBvc3RTY3JpcHROYW1lKENGUwogICAgICAgICBu
YW1lTWFwLnNldChmYWNlU3RyaW5nLCByZXN1bHQpOwogICAgIHJldHVybiByZXN1bHQuZ2V0KCk7
CiB9CisjZW5kaWYKIAogc3RhdGljIGludCBDQUxMQkFDSyBlbnVtU3R5bGVzQ2FsbGJhY2soY29u
c3QgTE9HRk9OVCogbG9nRm9udCwgY29uc3QgVEVYVE1FVFJJQyogbWV0cmljcywgRFdPUkQgZm9u
dFR5cGUsIExQQVJBTSBsUGFyYW0pCiB7CkBAIC0xNzksNiArMTgxLDcgQEAgRm9udFBsYXRmb3Jt
RGF0YTo6Rm9udFBsYXRmb3JtRGF0YShIRk9OVAogICAgICAgICAgICAgICAgICAgICBtX3N5bnRo
ZXRpY09ibGlxdWUgPSB0cnVlOwogICAgICAgICB9CiAKKyNpZiBQTEFURk9STShDRykKICAgICAg
ICAgLy8gVHJ5IHRoZSBmYWNlIG5hbWUgZmlyc3QuICBXaW5kb3dzIG1heSBlbmQgdXAgbG9jYWxp
emluZyB0aGlzIG5hbWUsIGFuZCBDRyBkb2Vzbid0IGtub3cgYWJvdXQKICAgICAgICAgLy8gdGhl
IGxvY2FsaXphdGlvbi4gIElmIHRoZSBjcmVhdGUgZmFpbHMsIHdlJ2xsIHRyeSB0aGUgUG9zdFNj
cmlwdCBuYW1lLgogICAgICAgICBSZXRhaW5QdHI8Q0ZTdHJpbmdSZWY+IGZ1bGxOYW1lKEFkb3B0
Q0YsIENGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnMoTlVMTCwgKGNvbnN0IFVuaUNoYXIqKWZh
Y2VOYW1lLCB3Y3NsZW4oZmFjZU5hbWUpKSk7CkBAIC0xOTAsNiArMTkzLDcgQEAgRm9udFBsYXRm
b3JtRGF0YTo6Rm9udFBsYXRmb3JtRGF0YShIRk9OVAogICAgICAgICAgICAgICAgIEFTU0VSVCht
X2NnRm9udCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyNlbmRpZgogICAgICAgICBmcmVl
KG1ldHJpY3MpOwogICAgIH0KIApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4v
Rm9udFdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4v
Rm9udFdpbi5jcHAJKHJldmlzaW9uIDI5NzI2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW4vRm9udFdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMzLDggKzMzLDEwIEBACiAjaW5j
bHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRlICJTaW1wbGVGb250RGF0YS5oIgogI2lu
Y2x1ZGUgIlVuaXNjcmliZUNvbnRyb2xsZXIuaCIKKyNpZiBQTEFURk9STShDRykKICNpbmNsdWRl
IDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KICNpbmNsdWRlIDxX
ZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+CisjZW5kaWYKICNp
bmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CkBAIC0xMjcs
NiArMTI5LDcgQEAgdm9pZCBGb250OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCogZwogICAg
ICAgICByZXR1cm47CiAgICAgfQogCisjaWYgUExBVEZPUk0oQ0cpCiAgICAgQ0dDb250ZXh0UmVm
IGNnQ29udGV4dCA9IGdyYXBoaWNzQ29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCk7CiAKICAgICB1
aW50MzJfdCBvbGRGb250U21vb3RoaW5nU3R5bGUgPSB3a1NldEZvbnRTbW9vdGhpbmdTdHlsZShj
Z0NvbnRleHQpOwpAQCAtMTYxLDYgKzE2NCw5IEBAIHZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFw
aGljc0NvbnRleHQqIGcKICAgICB9CiAKICAgICB3a1Jlc3RvcmVGb250U21vb3RoaW5nU3R5bGUo
Y2dDb250ZXh0LCBvbGRGb250U21vb3RoaW5nU3R5bGUpOworI2Vsc2UKKyAgICBub3RJbXBsZW1l
bnRlZCgpOworI2VuZGlmCiB9CiAKIEZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29t
cGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCBo
LApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0V2lu
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGlj
c0NvbnRleHRXaW4uY3BwCShyZXZpc2lvbiAyOTcyNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dFdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI5LDEx
ICsyOSwxNSBAQAogI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgogI2luY2x1ZGUgIk5vdElt
cGxlbWVudGVkLmgiCiAjaW5jbHVkZSAiUGF0aC5oIgotI2luY2x1ZGUgPENvcmVHcmFwaGljcy9D
R0JpdG1hcENvbnRleHQuaD4KLSNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0
U3lzdGVtSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KIAorI2lmIFBM
QVRGT1JNKENHKQorI2luY2x1ZGUgPENvcmVHcmFwaGljcy9DR0JpdG1hcENvbnRleHQuaD4KKyNp
bmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+CiAj
aW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmgiCisjZWxpZiBQTEFURk9S
TShDQUlSTykKKyNpbmNsdWRlIDxjYWlyby13aW4zMi5oPgorI2VuZGlmCiAKIHVzaW5nIG5hbWVz
cGFjZSBzdGQ7CiAKQEAgLTQxLDYgKzQ1LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiBjbGFz
cyBTVkdSZXNvdXJjZUltYWdlOwogCisjaWYgUExBVEZPUk0oQ0cpCiBzdGF0aWMgQ0dDb250ZXh0
UmVmIENHQ29udGV4dFdpdGhIREMoSERDIGhkYykKIHsKICAgICBIQklUTUFQIGJpdG1hcCA9IChI
QklUTUFQKUdldEN1cnJlbnRPYmplY3QoaGRjLCBPQkpfQklUTUFQKTsKQEAgLTc2LDkgKzgxLDEx
IEBAIEdyYXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0KEhEQyBoZGMKICAgICAgICAgc2V0
UGxhdGZvcm1TdHJva2VDb2xvcihzdHJva2VDb2xvcigpKTsKICAgICB9CiB9CisjZW5kaWYKIAog
SERDIEdyYXBoaWNzQ29udGV4dDo6Z2V0V2luZG93c0NvbnRleHQoY29uc3QgSW50UmVjdCYgZHN0
UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVuZCkKIHsKKyNpZiBQTEFURk9STShDRykKICAgICBp
ZiAoaW5UcmFuc3BhcmVuY3lMYXllcigpKSB7CiAgICAgICAgIGlmIChkc3RSZWN0LmlzRW1wdHko
KSkKICAgICAgICAgICAgIHJldHVybiAwOwpAQCAtMTMyLDEyICsxMzksNDAgQEAgSERDIEdyYXBo
aWNzQ29udGV4dDo6Z2V0V2luZG93c0NvbnRleHQoYwogICAgIENHQ29udGV4dEZsdXNoKHBsYXRm
b3JtQ29udGV4dCgpKTsKICAgICBtX2RhdGEtPnNhdmUoKTsKICAgICByZXR1cm4gbV9kYXRhLT5t
X2hkYzsKKyNlbGlmIFBMQVRGT1JNKENBSVJPKQorICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgd3Jv
bmcsIGFuZCBkZWZpbml0ZWx5IG91dCBvZiBkYXRlLiAgUHVsbGVkIGZyb20gb2xkIFNWTgorICAg
IGNhaXJvX3N1cmZhY2VfdCogc3VyZmFjZSA9IGNhaXJvX2dldF90YXJnZXQocGxhdGZvcm1Db250
ZXh0KCkpOworICAgIEhEQyBoZGMgPSBjYWlyb193aW4zMl9zdXJmYWNlX2dldF9kYyhzdXJmYWNl
KTsgICAKKyAgICBTYXZlREMoaGRjKTsKKworICAgIC8vIEZJWE1FOiBXZSBuZWVkIHRvIG1ha2Ug
c3VyZSBhIGNsaXAgaXMgcmVhbGx5IHNldCBvbiB0aGUgSERDLgorICAgIC8vIENhbGwgU2V0V29y
bGRUcmFuc2Zvcm0gdG8gaG9ub3IgdGhlIGN1cnJlbnQgQ2Fpcm8gdHJhbnNmb3JtLgorICAgIFNl
dEdyYXBoaWNzTW9kZShoZGMsIEdNX0FEVkFOQ0VEKTsgLy8gV2UgbmVlZCB0aGlzIGNhbGwgZm9y
IHRoZW1lcyB0byBob25vciB3b3JsZCB0cmFuc2Zvcm1zLgorICAgIGNhaXJvX21hdHJpeF90IG1h
dDsKKyAgICBjYWlyb19nZXRfbWF0cml4KHBsYXRmb3JtQ29udGV4dCgpLCAmbWF0KTsKKyAgICBY
Rk9STSB4Zm9ybTsKKyAgICB4Zm9ybS5lTTExID0gbWF0Lnh4OworICAgIHhmb3JtLmVNMTIgPSBt
YXQueHk7CisgICAgeGZvcm0uZU0yMSA9IG1hdC55eDsKKyAgICB4Zm9ybS5lTTIyID0gbWF0Lnl5
OworICAgIHhmb3JtLmVEeCA9IG1hdC54MDsKKyAgICB4Zm9ybS5lRHkgPSBtYXQueTA7CisgICAg
U2V0V29ybGRUcmFuc2Zvcm0oaGRjLCAmeGZvcm0pOworCisgICAgcmV0dXJuIGhkYzsKKyNlbHNl
CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gMDsKKyNlbmRpZgogfQogCisjaWYg
UExBVEZPUk0oQ0cpCiBib29sIEdyYXBoaWNzQ29udGV4dDo6aW5UcmFuc3BhcmVuY3lMYXllcigp
IGNvbnN0IHsgcmV0dXJuIG1fZGF0YS0+bV90cmFuc3BhcmVuY3lDb3VudDsgfQorI2VuZGlmCiAK
IHZvaWQgR3JhcGhpY3NDb250ZXh0OjpyZWxlYXNlV2luZG93c0NvbnRleHQoSERDIGhkYywgY29u
c3QgSW50UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVuZCkKIHsKKyNpZiBQTEFU
Rk9STShDRykKICAgICBpZiAoaGRjICYmIGluVHJhbnNwYXJlbmN5TGF5ZXIoKSkgewogICAgICAg
ICBpZiAoZHN0UmVjdC5pc0VtcHR5KCkpCiAgICAgICAgICAgICByZXR1cm47CkBAIC0xNjksOCAr
MjA0LDE3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpyZWxlYXNlV2luZG93c0NvbnQKICAgICB9
CiAKICAgICBtX2RhdGEtPnJlc3RvcmUoKTsKKyNlbGlmIFBMQVRGT1JNKENBSVJPKQorICAgIGNh
aXJvX3N1cmZhY2VfdCogc3VyZmFjZSA9IGNhaXJvX2dldF90YXJnZXQocGxhdGZvcm1Db250ZXh0
KCkpOworICAgIEhEQyBoZGMyID0gY2Fpcm9fd2luMzJfc3VyZmFjZV9nZXRfZGMoc3VyZmFjZSk7
CisgICAgUmVzdG9yZURDKGhkYzIsIC0xKTsKKyAgICBjYWlyb19zdXJmYWNlX21hcmtfZGlydHko
c3VyZmFjZSk7CisjZWxzZQorICAgIG5vdEltcGxlbWVudGVkKCk7CisjZW5kaWYKIH0KIAorI2lm
IFBMQVRGT1JNKENHKQogdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnNhdmUo
KQogewogICAgIGlmICghbV9oZGMpCkBAIC0yNDYsNiArMjkwLDggQEAgdm9pZCBHcmFwaGljc0Nv
bnRleHRQbGF0Zm9ybVByaXZhdGU6OmNvbgogewogICAgIGlmICghbV9oZGMpCiAgICAgICAgIHJl
dHVybjsKKworI2lmIFBMQVRGT1JNKENHKQogICAgIENHQWZmaW5lVHJhbnNmb3JtIG1hdCA9IHRy
YW5zZm9ybTsKICAgICBYRk9STSB4Zm9ybTsKICAgICB4Zm9ybS5lTTExID0gbWF0LmE7CkBAIC0y
NTQsMTQgKzMwMCwzMCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y29u
CiAgICAgeGZvcm0uZU0yMiA9IG1hdC5kOwogICAgIHhmb3JtLmVEeCA9IG1hdC50eDsKICAgICB4
Zm9ybS5lRHkgPSBtYXQudHk7CisjZWxpZiBQTEFURk9STShDQUlSTykKKyAgICBjYWlyb19tYXRy
aXhfdCBtYXQ7CisgICAgY2Fpcm9fZ2V0X21hdHJpeChwbGF0Zm9ybUNvbnRleHQoKSwgJm1hdCk7
CisgICAgWEZPUk0geGZvcm07CisgICAgeGZvcm0uZU0xMSA9IG1hdC54eDsKKyAgICB4Zm9ybS5l
TTEyID0gbWF0Lnh5OworICAgIHhmb3JtLmVNMjEgPSBtYXQueXg7CisgICAgeGZvcm0uZU0yMiA9
IG1hdC55eTsKKyAgICB4Zm9ybS5lRHggPSBtYXQueDA7CisgICAgeGZvcm0uZUR5ID0gbWF0Lnkw
OworI2Vsc2UKKyAgICBub3RJbXBsZW1lbnRlZCgpOworI2VuZGlmCisKICAgICBNb2RpZnlXb3Js
ZFRyYW5zZm9ybShtX2hkYywgJnhmb3JtLCBNV1RfTEVGVE1VTFRJUExZKTsKIH0KKyNlbmRpZgog
CiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0ZvY3VzUmluZyhjb25zdCBDb2xvciYgY29sb3Ip
CiB7CiAgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKICAgICAgICAgcmV0dXJuOwogCisjaWYg
UExBVEZPUk0oQ0cpCiAgICAgZmxvYXQgcmFkaXVzID0gKGZvY3VzUmluZ1dpZHRoKCkgLSAxKSAv
IDIuMGY7CiAgICAgaW50IG9mZnNldCA9IHJhZGl1cyArIGZvY3VzUmluZ09mZnNldCgpOwogICAg
IENHQ29sb3JSZWYgY29sb3JSZWYgPSBjb2xvci5pc1ZhbGlkKCkgPyBjZ0NvbG9yKGNvbG9yKSA6
IDA7CkBAIC0yODUsNiArMzQ3LDkgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1c1Jp
bmcoY29ucwogICAgIENHUGF0aFJlbGVhc2UoZm9jdXNSaW5nUGF0aCk7CiAKICAgICBDR0NvbnRl
eHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOworI2Vsc2UKKyAgICBub3RJbXBsZW1lbnRlZCgpOwor
I2VuZGlmCiB9CiAKIHN0YXRpYyBjb25zdCBDb2xvciYgc3BlbGxpbmdQYXR0ZXJuQ29sb3IoKSB7
CkBAIC0yOTcsNiArMzYyLDcgQEAgc3RhdGljIGNvbnN0IENvbG9yJiBncmFtbWFyUGF0dGVybkNv
bG9yKAogICAgIHJldHVybiBncmFtbWFyQ29sb3I7CiB9CiAKKyNpZiBQTEFURk9STShDRykKIC8v
IFB1bGxlZCBmcm9tIEdyYXBoaWNzQ29udGV4dENHCiBzdGF0aWMgdm9pZCBzZXRDR1N0cm9rZUNv
bG9yKENHQ29udGV4dFJlZiBjb250ZXh0LCBjb25zdCBDb2xvciYgY29sb3IpCiB7CkBAIC0zMDQs
MTIgKzM3MCwxNCBAQCBzdGF0aWMgdm9pZCBzZXRDR1N0cm9rZUNvbG9yKENHQ29udGV4dFJlCiAg
ICAgY29sb3IuZ2V0UkdCQShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CiAgICAgQ0dDb250ZXh0
U2V0UkdCU3Ryb2tlQ29sb3IoY29udGV4dCwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwogfQor
I2VuZGlmCiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvck1pc3NwZWxsaW5nT3JC
YWRHcmFtbWFyKGNvbnN0IEludFBvaW50JiBwb2ludCwgaW50IHdpZHRoLCBib29sIGdyYW1tYXIp
CiB7CiAgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKICAgICAgICAgcmV0dXJuOwotICAgIAor
CisjaWYgUExBVEZPUk0oQ0cpCiAgICAgLy8gVGhlc2UgYXJlIHRoZSBzYW1lIGZvciBtaXNzcGVs
bGluZyBvciBiYWQgZ3JhbW1hcgogICAgIGNvbnN0IGludCBwYXR0ZXJuSGVpZ2h0ID0gMzsgLy8g
MyByb3dzCiAgICAgQVNTRVJUKGNNaXNzcGVsbGluZ0xpbmVUaGlja25lc3MgPT0gcGF0dGVybkhl
aWdodCk7CkBAIC0zNzIsNiArNDQwLDkgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5l
Rm9yTWlzc3BlbAogICAgIENHQ29udGV4dFN0cm9rZUxpbmVTZWdtZW50cyhjb250ZXh0LCBsb3dl
clBvaW50cywgMik7CiAKICAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOworI2Vs
c2UKKyAgICBub3RJbXBsZW1lbnRlZCgpOworI2VuZGlmCiB9CiAKICNpZiBFTkFCTEUoU1ZHKQpJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VXaW4uY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlV2luLmNwcAkocmV2aXNp
b24gMjk3MjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZVdpbi5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTI3LDcgKzI3LDExIEBACiAjaW5jbHVkZSAiSW1hZ2UuaCIKICNp
bmNsdWRlICJCaXRtYXBJbWFnZS5oIgogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2lm
IFBMQVRGT1JNKENHKQogI2luY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25T
ZXJ2aWNlcy5oPgorI2VsaWYgUExBVEZPUk0oQ0FJUk8pCisjaW5jbHVkZSA8Y2Fpcm8uaD4KKyNl
bmRpZgogCiAjaW5jbHVkZSA8d2luc29jazIuaD4KICNpbmNsdWRlIDx3aW5kb3dzLmg+CkBAIC02
OCw2ICs3Miw3IEBAIGJvb2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVBPZlNpemUoSEJJVE0KICAg
ICBCSVRNQVAgYm1wSW5mbzsKICAgICBHZXRPYmplY3QoYm1wLCBzaXplb2YoQklUTUFQKSwgJmJt
cEluZm8pOwogCisjaWYgUExBVEZPUk0oQ0cpCiAgICAgQVNTRVJUKGJtcEluZm8uYm1CaXRzUGl4
ZWwgPT0gMzIpOwogICAgIGludCBidWZmZXJTaXplID0gYm1wSW5mby5ibVdpZHRoQnl0ZXMgKiBi
bXBJbmZvLmJtSGVpZ2h0OwogICAgIApAQCAtNzYsNiArODEsMjQgQEAgYm9vbCBCaXRtYXBJbWFn
ZTo6Z2V0SEJJVE1BUE9mU2l6ZShIQklUTQogICAgICAgICA4LCBibXBJbmZvLmJtV2lkdGhCeXRl
cywgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFQ
cmVtdWx0aXBsaWVkRmlyc3QpOwogICAKICAgICBHcmFwaGljc0NvbnRleHQgZ2MoY2dDb250ZXh0
KTsKKyNlbGlmIFBMQVRGT1JNKENBSVJPKQorICAgIC8vIElmIHRoaXMgaXMgYSAzMmJwcCBiaXRt
YXAsIHdoaWNoIGl0IGFsd2F5cyBzaG91bGQgYmUsIHdlJ2xsIGNsZWFyIGl0IHNvIGFscGhhLXdp
c2UgaXQgd2lsbCBiZSB2aXNpYmxlCisgICAgaWYgKGJtcEluZm8uYm1CaXRzUGl4ZWwgPT0gMzIp
IHsKKyAgICAgICAgaW50IGJ1ZmZlclNpemUgPSBibXBJbmZvLmJtV2lkdGhCeXRlcyAqIGJtcElu
Zm8uYm1IZWlnaHQ7CisgICAgICAgIG1lbXNldChibXBJbmZvLmJtQml0cywgMjU1LCBidWZmZXJT
aXplKTsKKyAgICB9CisgCQorICAgIEhEQyB0ZW1wREMgPSBDcmVhdGVDb21wYXRpYmxlREMoMCk7
CisgICAgaWYgKCF0ZW1wREMpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRl
IGluLW1lbW9yeSBEQyBmb3IgSW1hZ2U6OmJsaXQoKSIpOworICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorICAgIFNlbGVjdE9iamVjdCh0ZW1wREMsIGJtcCk7CisgICAgR3JhcGhpY3NDb250
ZXh0IGdjKHRlbXBEQyk7CisjZWxzZQorICAgIG5vdEltcGxlbWVudGVkKCk7CisjZW5kaWYKKwog
ICAgIEludFNpemUgaW1hZ2VTaXplID0gQml0bWFwSW1hZ2U6OnNpemUoKTsKICAgICBpZiAoc2l6
ZSkKICAgICAgICAgZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXplKCZnYywgRmxvYXRSZWN0KDAs
IDAsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCksIEludFNpemUoKnNpemUpLCBD
b21wb3NpdGVDb3B5KTsKQEAgLTgzLDE3ICsxMDYsMzQgQEAgYm9vbCBCaXRtYXBJbWFnZTo6Z2V0
SEJJVE1BUE9mU2l6ZShIQklUTQogICAgICAgICBkcmF3KCZnYywgRmxvYXRSZWN0KDAsIDAsIGJt
cEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCksIEZsb2F0UmVjdCgwLCAwLCBpbWFnZVNp
emUud2lkdGgoKSwgaW1hZ2VTaXplLmhlaWdodCgpKSwgQ29tcG9zaXRlQ29weSk7CiAKICAgICAv
LyBEbyBjbGVhbnVwCisjaWYgUExBVEZPUk0oQ0cpCiAgICAgQ0dDb250ZXh0UmVsZWFzZShjZ0Nv
bnRleHQpOwogICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKKyNlbGlmIFBMQVRG
T1JNKENBSVJPKQorICAgIC8vIERvIGNsZWFudXAKKyAgICBEZWxldGVEQyh0ZW1wREMpOworI2Vu
ZGlmCisKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBCaXRtYXBJbWFnZTo6ZHJhd0ZyYW1l
TWF0Y2hpbmdTb3VyY2VTaXplKEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29uc3QgRmxvYXRSZWN0
JiBkc3RSZWN0LCBjb25zdCBJbnRTaXplJiBzcmNTaXplLCBDb21wb3NpdGVPcGVyYXRvciBjb21w
b3NpdGVPcCkKIHsKICAgICBpbnQgZnJhbWVzID0gZnJhbWVDb3VudCgpOworICAgIHNpemVfdCBp
bWFnZUhlaWdodCA9IDA7CisgICAgc2l6ZV90IGltYWdlV2lkdGggPSAwOwogICAgIGZvciAoaW50
IGkgPSAwOyBpIDwgZnJhbWVzOyArK2kpIHsKLSAgICAgICAgQ0dJbWFnZVJlZiBpbWFnZSA9IGZy
YW1lQXRJbmRleChpKTsKLSAgICAgICAgaWYgKENHSW1hZ2VHZXRIZWlnaHQoaW1hZ2UpID09IChz
aXplX3Qpc3JjU2l6ZS5oZWlnaHQoKSAmJiBDR0ltYWdlR2V0V2lkdGgoaW1hZ2UpID09IChzaXpl
X3Qpc3JjU2l6ZS53aWR0aCgpKSB7CisgICAgICAgIE5hdGl2ZUltYWdlUHRyIGltYWdlID0gZnJh
bWVBdEluZGV4KGkpOworI2lmIFBMQVRGT1JNKENHKQorCWltYWdlSGVpZ2h0ID0gQ0dJbWFnZUdl
dEhlaWdodChpbWFnZSk7CisJaW1hZ2VXaWR0aCA9IENHSW1hZ2VHZXRXaWR0aChpbWFnZSk7Cisj
ZWxpZiBQTEFURk9STShDQUlSTykKKwlpbWFnZUhlaWdodCA9IGNhaXJvX2ltYWdlX3N1cmZhY2Vf
Z2V0X2hlaWdodChpbWFnZSk7CisJaW1hZ2VXaWR0aCA9IGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0
X3dpZHRoKGltYWdlKTsKKyNlbHNlCisJbm90SW1wbGVtZW50ZWQoKTsKKyNlbmRpZgorICAgICAg
ICBpZiAoaW1hZ2VIZWlnaHQgPT0gKHNpemVfdClzcmNTaXplLmhlaWdodCgpICYmIGltYWdlV2lk
dGggPT0gKHNpemVfdClzcmNTaXplLndpZHRoKCkpIHsKICAgICAgICAgICAgIHNpemVfdCBjdXJy
ZW50RnJhbWUgPSBtX2N1cnJlbnRGcmFtZTsKICAgICAgICAgICAgIG1fY3VycmVudEZyYW1lID0g
aTsKICAgICAgICAgICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRSZWN0KDAsIDAsIHNyY1Np
emUud2lkdGgoKSwgc3JjU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsKSW5kZXg6IFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhV2luLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YVdpbi5jcHAJ
KHJldmlzaW9uIDI5NzI2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxl
Rm9udERhdGFXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNCwxMyArMzQsMTYgQEAKICNpbmNs
dWRlICJGb250Q2FjaGUuaCIKICNpbmNsdWRlICJGbG9hdFJlY3QuaCIKICNpbmNsdWRlICJGb250
RGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1ZGUgPHd0
Zi9NYXRoRXh0cmFzLmg+CiAjaW5jbHVkZSA8dW5pY29kZS91Y2hhci5oPgogI2luY2x1ZGUgPHVu
aWNvZGUvdW5vcm0uaD4KKyNpZiBQTEFURk9STShDRykKICNpbmNsdWRlIDxBcHBsaWNhdGlvblNl
cnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KKyNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRl
cmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+CisjZW5kaWYKICNpbmNsdWRlIDxtbGFuZy5o
PgogI2luY2x1ZGUgPHRjaGFyLmg+Ci0jaW5jbHVkZSA8V2ViS2l0U3lzdGVtSW50ZXJmYWNlL1dl
YktpdFN5c3RlbUludGVyZmFjZS5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKQEAgLTU4LDgg
KzYxLDEwIEBAIHZvaWQgU2ltcGxlRm9udERhdGE6OnNldFNob3VsZEFwcGx5TWFjQXMKIH0KIAog
dm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKLXsgICAgCit7CisjaWYgUExBVEZP
Uk0oQ0cpCiAgICAgbV9zeW50aGV0aWNCb2xkT2Zmc2V0ID0gbV9mb250LnN5bnRoZXRpY0JvbGQo
KSA/IDEuMGYgOiAwLmY7CisjZW5kaWYKICAgICBtX3NjcmlwdENhY2hlID0gMDsKICAgICBtX3Nj
cmlwdEZvbnRQcm9wZXJ0aWVzID0gMDsKICAgICBtX2lzU3lzdGVtRm9udCA9IGZhbHNlOwpAQCAt
MjQ5LDE0ICsyNTQsMjQgQEAgZmxvYXQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtV2lkdGhGb3JH
bAogICAgICAgICByZXR1cm4gd2lkdGg7CiAgICAgfQogCisjaWYgUExBVEZPUk0oQ0cpCiAgICAg
Q0dGb250UmVmIGZvbnQgPSBtX2ZvbnQuY2dGb250KCk7CiAgICAgZmxvYXQgcG9pbnRTaXplID0g
bV9mb250LnNpemUoKTsKICAgICBDR1NpemUgYWR2YW5jZTsKICAgICBDR0FmZmluZVRyYW5zZm9y
bSBtID0gQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlU2NhbGUocG9pbnRTaXplLCBwb2ludFNpemUpOwor
I2Vsc2UKKyAgICBub3RJbXBsZW1lbnRlZCgpOworI2VuZGlmCisgCiAgICAgLy8gRklYTUU6IE5l
ZWQgdG8gYWRkIHJlYWwgc3VwcG9ydCBmb3IgcHJpbnRlciBmb250cy4KICAgICBib29sIGlzUHJp
bnRlckZvbnQgPSBmYWxzZTsKICAgICB3a0dldEdseXBoQWR2YW5jZXMoZm9udCwgbSwgbV9pc1N5
c3RlbUZvbnQsIGlzUHJpbnRlckZvbnQsIGdseXBoLCBhZHZhbmNlKTsKKworI2lmIFBMQVRGT1JN
KENHKQogICAgIHJldHVybiBhZHZhbmNlLndpZHRoICsgbV9zeW50aGV0aWNCb2xkT2Zmc2V0Owor
I2Vsc2UKKyAgICByZXR1cm4gYWR2YW5jZS53aWR0aDsKKyNlbmRpZgogfQogCiBTQ1JJUFRfRk9O
VFBST1BFUlRJRVMqIFNpbXBsZUZvbnREYXRhOjpzY3JpcHRGb250UHJvcGVydGllcygpIGNvbnN0
CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvd2luL0Nvb2tpZUphcldpbi5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL3dpbi9Db29raWVKYXJXaW4uY3Bw
CShyZXZpc2lvbiAyOTcyNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay93aW4vQ29va2ll
SmFyV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTI4LDEwICsxMjgsMTYgQEAgU3RyaW5nIGNv
b2tpZXMoY29uc3QgRG9jdW1lbnQqIC8qZG9jdW1lbgogCiBib29sIGNvb2tpZXNFbmFibGVkKGNv
bnN0IERvY3VtZW50KiAvKmRvY3VtZW50Ki8pCiB7CisjaWYgVVNFKENGTkVUV09SSykKICAgICBD
RkhUVFBDb29raWVTdG9yYWdlQWNjZXB0UG9saWN5IHBvbGljeSA9IENGSFRUUENvb2tpZVN0b3Jh
Z2VBY2NlcHRQb2xpY3lPbmx5RnJvbU1haW5Eb2N1bWVudERvbWFpbjsKICAgICBpZiAoQ0ZIVFRQ
Q29va2llU3RvcmFnZVJlZiBkZWZhdWx0Q29va2llU3RvcmFnZSA9IHdrR2V0RGVmYXVsdEhUVFBD
b29raWVTdG9yYWdlKCkpCiAgICAgICAgIHBvbGljeSA9IENGSFRUUENvb2tpZVN0b3JhZ2VHZXRD
b29raWVBY2NlcHRQb2xpY3koZGVmYXVsdENvb2tpZVN0b3JhZ2UpOwogICAgIHJldHVybiBwb2xp
Y3kgPT0gQ0ZIVFRQQ29va2llU3RvcmFnZUFjY2VwdFBvbGljeU9ubHlGcm9tTWFpbkRvY3VtZW50
RG9tYWluIHx8IHBvbGljeSA9PSBDRkhUVFBDb29raWVTdG9yYWdlQWNjZXB0UG9saWN5QWx3YXlz
OworI2Vsc2UKKyAgICAvLyBGSVhNRTogRm9yIG5vdyBqdXN0IGFzc3VtZSBjb29raWVzIGFyZSBh
bHdheXMgb24uICBUaGVyZSBpcyBubyBvYnZpb3VzIFdpbmRvd3MgQVBJIHRvIGdldCB0aGlzCisg
ICAgLy8gc2V0dGluZy4KKyAgICByZXR1cm4gdHJ1ZTsKKyNlbmRpZgogfQogCiB9CkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL3dpbi9DbGlwYm9hcmRVdGlsaXRpZXNXaW4uY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luL0NsaXBib2FyZFV0aWxpdGllc1dpbi5jcHAJKHJldmlz
aW9uIDI5NzI2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJvYXJkVXRpbGl0aWVzV2lu
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzExLDEyICszMTEsMTYgQEAgU3RyaW5nIGdldFVSTChJ
RGF0YU9iamVjdCogZGF0YU9iamVjdCwgYgogICAgICAgICAvL2ZpbGUgdXNpbmcgdW5pY29kZQog
ICAgICAgICB3Y2hhcl90KiBkYXRhID0gKHdjaGFyX3QqKUdsb2JhbExvY2soc3RvcmUuaEdsb2Jh
bCk7CiAgICAgICAgIGlmIChkYXRhICYmIGRhdGFbMF0gJiYgKFBhdGhGaWxlRXhpc3RzKGRhdGEp
IHx8IFBhdGhJc1VOQyhkYXRhKSkpIHsKKyNpZiBQTEFURk9STShDRikKICAgICAgICAgICAgIFJl
dGFpblB0cjxDRlN0cmluZ1JlZj4gcGF0aEFzQ0ZTdHJpbmcoQWRvcHRDRiwgQ0ZTdHJpbmdDcmVh
dGVXaXRoQ2hhcmFjdGVycyhrQ0ZBbGxvY2F0b3JEZWZhdWx0LCAoY29uc3QgVW5pQ2hhciopZGF0
YSwgd2NzbGVuKGRhdGEpKSk7CiAgICAgICAgICAgICBpZiAodXJsRnJvbVBhdGgocGF0aEFzQ0ZT
dHJpbmcuZ2V0KCksIHVybCkpIHsKICAgICAgICAgICAgICAgICBpZiAodGl0bGUpCiAgICAgICAg
ICAgICAgICAgICAgICp0aXRsZSA9IHVybDsKICAgICAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1
ZTsKICAgICAgICAgICAgIH0KKyNlbHNlCisJICAgIG5vdEltcGxlbWVudGVkKCk7CisjZW5kaWYK
ICAgICAgICAgfQogICAgICAgICBHbG9iYWxVbmxvY2soc3RvcmUuaEdsb2JhbCk7ICAgICAgCiAg
ICAgICAgIFJlbGVhc2VTdGdNZWRpdW0oJnN0b3JlKTsKQEAgLTMyNCwxMiArMzI4LDE2IEBAIFN0
cmluZyBnZXRVUkwoSURhdGFPYmplY3QqIGRhdGFPYmplY3QsIGIKICAgICAgICAgLy9maWxlbmFt
ZSB1c2luZyBhc2NpaQogICAgICAgICBjaGFyKiBkYXRhID0gKGNoYXIqKUdsb2JhbExvY2soc3Rv
cmUuaEdsb2JhbCk7ICAgICAgIAogICAgICAgICBpZiAoZGF0YSAmJiBkYXRhWzBdICYmIChQYXRo
RmlsZUV4aXN0c0EoZGF0YSkgfHwgUGF0aElzVU5DQShkYXRhKSkpIHsKKyNpZiBQTEFURk9STShD
RikKICAgICAgICAgICAgIFJldGFpblB0cjxDRlN0cmluZ1JlZj4gcGF0aEFzQ0ZTdHJpbmcoQWRv
cHRDRiwgQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZyhrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBkYXRh
LCBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJKSk7CiAgICAgICAgICAgICBpZiAodXJsRnJvbVBhdGgo
cGF0aEFzQ0ZTdHJpbmcuZ2V0KCksIHVybCkpIHsKICAgICAgICAgICAgICAgICBpZiAodGl0bGUp
CiAgICAgICAgICAgICAgICAgICAgICp0aXRsZSA9IHVybDsKICAgICAgICAgICAgICAgICBzdWNj
ZXNzID0gdHJ1ZTsKICAgICAgICAgICAgIH0KKyNlbHNlCisJICAgIG5vdEltcGxlbWVudGVkKCk7
CisjZW5kaWYKICAgICAgICAgfQogICAgICAgICBHbG9iYWxVbmxvY2soc3RvcmUuaEdsb2JhbCk7
ICAgICAgCiAgICAgICAgIFJlbGVhc2VTdGdNZWRpdW0oJnN0b3JlKTsKSW5kZXg6IFdlYkNvcmUv
cGxhdGZvcm0vd2luL0RyYWdJbWFnZVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0
Zm9ybS93aW4vRHJhZ0ltYWdlV2luLmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3Bs
YXRmb3JtL3dpbi9EcmFnSW1hZ2VXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw5ICsyOSwx
MiBAQAogI2luY2x1ZGUgIkNhY2hlZEltYWdlLmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0
LmgiCiAjaW5jbHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2lu
Y2x1ZGUgIlJldGFpblB0ci5oIgogCisjaWYgUExBVEZPUk0oQ0cpCiAjaW5jbHVkZSA8Q29yZUdy
YXBoaWNzL0NvcmVHcmFwaGljcy5oPgorI2VuZGlmCiAKICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAK
QEAgLTUyLDYgKzU1LDcgQEAgdm9pZCBkZWxldGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVmIGltYWdl
KQogICAgICAgICA6OkRlbGV0ZU9iamVjdChpbWFnZSk7CiB9CiAKKyNpZiBQTEFURk9STShDRykK
IEhCSVRNQVAgYWxsb2NJbWFnZShIREMgZGMsIEludFNpemUgc2l6ZSwgQ0dDb250ZXh0UmVmICp0
YXJnZXRSZWYpCiB7CiAgICAgSEJJVE1BUCBoYm1wOwpAQCAtOTQsOSArOTgsMTEgQEAgc3RhdGlj
IENHQ29udGV4dFJlZiBjcmVhdGVDZ0NvbnRleHRGcm9tQgogICAgIENHQ29sb3JTcGFjZVJlbGVh
c2UoZGV2aWNlUkdCKTsKICAgICByZXR1cm4gYml0bWFwQ29udGV4dDsKIH0KKyNlbmRpZgogCiBE
cmFnSW1hZ2VSZWYgc2NhbGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVmIGltYWdlLCBGbG9hdFNpemUg
c2NhbGUpCiB7CisjaWYgUExBVEZPUk0oQ0cpCiAgICAgLy8gRklYTUU6IGR1ZSB0byB0aGUgd2F5
IGRyYWcgaW1hZ2VzIGFyZSBkb25lIG9uIHdpbmRvd3Mgd2UgbmVlZCAKICAgICAvLyB0byBwcmVw
cm9jZXNzIHRoZSBhbHBoYSBjaGFubmVsIDxyZGFyOi8vcHJvYmxlbS81MDE1OTQ2PgogCkBAIC0x
MzcsNiArMTQzLDEwIEBAIGV4aXQ6CiAgICAgICAgIERlbGV0ZURDKGRzdERDKTsKICAgICBSZWxl
YXNlREMoMCwgZGMpOwogICAgIHJldHVybiBoYm1wOworI2Vsc2UKKyAgICBub3RJbXBsZW1lbnRl
ZCgpOworICAgIHJldHVybiBpbWFnZTsKKyNlbmRpZgogfQogICAgIAogRHJhZ0ltYWdlUmVmIGRp
c3NvbHZlRHJhZ0ltYWdlVG9GcmFjdGlvbihEcmFnSW1hZ2VSZWYgaW1hZ2UsIGZsb2F0KQpAQCAt
MTQ2LDcgKzE1Niw4IEBAIERyYWdJbWFnZVJlZiBkaXNzb2x2ZURyYWdJbWFnZVRvRnJhY3Rpb24K
IH0KICAgICAgICAgCiBEcmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlRnJvbUltYWdlKEltYWdl
KiBpbWcpCi17ICAgIAoreworI2lmIFBMQVRGT1JNKENHKQkKICAgICBIQklUTUFQIGhibXAgPSAw
OwogICAgIEhEQyBkYyA9IEdldERDKDApOwogICAgIEhEQyB3b3JraW5nREMgPSBDcmVhdGVDb21w
YXRpYmxlREMoZGMpOwpAQCAtMTgyLDYgKzE5MywxMCBAQCBleGl0OgogICAgICAgICBEZWxldGVE
Qyh3b3JraW5nREMpOwogICAgIFJlbGVhc2VEQygwLCBkYyk7CiAgICAgcmV0dXJuIGhibXA7Cisj
ZWxzZQorICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIGltYWdlOworI2VuZGlmCiB9
CiAgICAgCiBEcmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlSWNvbkZvckNhY2hlZEltYWdlKENh
Y2hlZEltYWdlKikKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luL0ZpbGVTeXN0ZW1XaW4uY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luL0ZpbGVTeXN0ZW1XaW4uY3BwCShy
ZXZpc2lvbiAyOTcyNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luL0ZpbGVTeXN0ZW1XaW4uY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0xMjIsMTAgKzEyMiwxNCBAQCBzdGF0aWMgU3RyaW5nIGJ1bmRs
ZU5hbWUoKQogICAgIGlmICghaW5pdGlhbGl6ZWQpIHsKICAgICAgICAgaW5pdGlhbGl6ZWQgPSB0
cnVlOwogCisjaWYgUExBVEZPUk0oQ0YpCiAgICAgICAgIGlmIChDRkJ1bmRsZVJlZiBidW5kbGUg
PSBDRkJ1bmRsZUdldE1haW5CdW5kbGUoKSkKICAgICAgICAgICAgIGlmIChDRlR5cGVSZWYgYnVu
ZGxlRXhlY3V0YWJsZSA9IENGQnVuZGxlR2V0VmFsdWVGb3JJbmZvRGljdGlvbmFyeUtleShidW5k
bGUsIGtDRkJ1bmRsZUV4ZWN1dGFibGVLZXkpKQogICAgICAgICAgICAgICAgIGlmIChDRkdldFR5
cGVJRChidW5kbGVFeGVjdXRhYmxlKSA9PSBDRlN0cmluZ0dldFR5cGVJRCgpKQogICAgICAgICAg
ICAgICAgICAgICBuYW1lID0gcmVpbnRlcnByZXRfY2FzdDxDRlN0cmluZ1JlZj4oYnVuZGxlRXhl
Y3V0YWJsZSk7CisjZWxzZQorICAgIG5vdEltcGxlbWVudGVkKCk7CisjZW5kaWYKICAgICB9CiAK
ICAgICByZXR1cm4gbmFtZTsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luL1NlYXJjaFBvcHVw
TWVudVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4vU2VhcmNoUG9w
dXBNZW51V2luLmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbi9T
ZWFyY2hQb3B1cE1lbnVXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMSw2ICsyMSw3IEBACiAj
aW5jbHVkZSAiU2VhcmNoUG9wdXBNZW51LmgiCiAKICNpbmNsdWRlICJBdG9taWNTdHJpbmcuaCIK
KyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1ZGUgPHd0Zi9SZXRhaW5QdHIuaD4K
IAogbmFtZXNwYWNlIFdlYkNvcmUgewpAQCAtMzUsMTcgKzM2LDIwIEBAIGJvb2wgU2VhcmNoUG9w
dXBNZW51OjplbmFibGVkKCkKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorI2lmIFBMQVRGT1JNKENG
KQogc3RhdGljIFJldGFpblB0cjxDRlN0cmluZ1JlZj4gYXV0b3NhdmVLZXkoY29uc3QgU3RyaW5n
JiBuYW1lKQogewogICAgIFN0cmluZyBrZXkgPSAiY29tLmFwcGxlLldlYktpdC5zZWFyY2hGaWVs
ZDoiICsgbmFtZTsKICAgICByZXR1cm4gUmV0YWluUHRyPENGU3RyaW5nUmVmPihBZG9wdENGLCBr
ZXkuY3JlYXRlQ0ZTdHJpbmcoKSk7CiB9CisjZW5kaWYKIAogdm9pZCBTZWFyY2hQb3B1cE1lbnU6
OnNhdmVSZWNlbnRTZWFyY2hlcyhjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUsIGNvbnN0IFZlY3Rv
cjxTdHJpbmc+JiBzZWFyY2hJdGVtcykKIHsKICAgICBpZiAobmFtZS5pc0VtcHR5KCkpCiAgICAg
ICAgIHJldHVybjsKIAorI2lmIFBMQVRGT1JNKENGKQogICAgIFJldGFpblB0cjxDRk11dGFibGVB
cnJheVJlZj4gaXRlbXM7CiAKICAgICBzaXplX3Qgc2l6ZSA9IHNlYXJjaEl0ZW1zLnNpemUoKTsK
QEAgLTU5LDYgKzYzLDkgQEAgdm9pZCBTZWFyY2hQb3B1cE1lbnU6OnNhdmVSZWNlbnRTZWFyY2hl
cwogCiAgICAgQ0ZQcmVmZXJlbmNlc1NldEFwcFZhbHVlKGF1dG9zYXZlS2V5KG5hbWUpLmdldCgp
LCBpdGVtcy5nZXQoKSwga0NGUHJlZmVyZW5jZXNDdXJyZW50QXBwbGljYXRpb24pOwogICAgIENG
UHJlZmVyZW5jZXNBcHBTeW5jaHJvbml6ZShrQ0ZQcmVmZXJlbmNlc0N1cnJlbnRBcHBsaWNhdGlv
bik7CisjZWxzZQorICAgIG5vdEltcGxlbWVudGVkKCk7CisjZW5kaWYKIH0KIAogdm9pZCBTZWFy
Y2hQb3B1cE1lbnU6OmxvYWRSZWNlbnRTZWFyY2hlcyhjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUs
IFZlY3RvcjxTdHJpbmc+JiBzZWFyY2hJdGVtcykKQEAgLTY2LDYgKzczLDcgQEAgdm9pZCBTZWFy
Y2hQb3B1cE1lbnU6OmxvYWRSZWNlbnRTZWFyY2hlcwogICAgIGlmIChuYW1lLmlzRW1wdHkoKSkK
ICAgICAgICAgcmV0dXJuOwogCisjaWYgUExBVEZPUk0oQ0YpCiAgICAgc2VhcmNoSXRlbXMuY2xl
YXIoKTsKICAgICBSZXRhaW5QdHI8Q0ZBcnJheVJlZj4gaXRlbXMoQWRvcHRDRiwgcmVpbnRlcnBy
ZXRfY2FzdDxDRkFycmF5UmVmPihDRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlKGF1dG9zYXZlS2V5
KG5hbWUpLmdldCgpLCBrQ0ZQcmVmZXJlbmNlc0N1cnJlbnRBcHBsaWNhdGlvbikpKTsKIApAQCAt
NzgsNiArODYsOSBAQCB2b2lkIFNlYXJjaFBvcHVwTWVudTo6bG9hZFJlY2VudFNlYXJjaGVzCiAg
ICAgICAgIGlmIChDRkdldFR5cGVJRChpdGVtKSA9PSBDRlN0cmluZ0dldFR5cGVJRCgpKQogICAg
ICAgICAgICAgc2VhcmNoSXRlbXMuYXBwZW5kKGl0ZW0pOwogICAgIH0KKyNlbHNlCisgICAgbm90
SW1wbGVtZW50ZWQoKTsKKyNlbmRpZgogfQogCiB9CkluZGV4OiBXZWJLaXRUb29scy9DaGFuZ2VM
b2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCShyZXZpc2lvbiAyOTcyNykK
KysrIFdlYktpdFRvb2xzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDkgQEAK
KzIwMDgtMDEtMjIgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBnbWFpbC5jb20+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBEcm9zZXJhL2RlYnVn
Z2VyLmpzOgorCiAyMDA4LTAxLTIyICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBhcHBsZS5j
b20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gYW5kIEFkYW0uCkluZGV4OiBXZWJLaXRU
b29scy9Ecm9zZXJhL2RlYnVnZ2VyLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL0Ryb3Nl
cmEvZGVidWdnZXIuanMJKHJldmlzaW9uIDI5NzI2KQorKysgV2ViS2l0VG9vbHMvRHJvc2VyYS9k
ZWJ1Z2dlci5qcwkod29ya2luZyBjb3B5KQpAQCAtNzEzLDYgKzcxMyw2MSBAQCBmdW5jdGlvbiBz
eW50YXhIaWdobGlnaHQoY29kZSwgZmlsZSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0K
IAorICAgIGZ1bmN0aW9uIG5leHROb25XU2lzQ2xvc2luZ0JyYWNlKGN1cnJMb2MpIHsKKyAgICAg
ICAgLy8gc2NhbiBmb3J3YXJkLiAgSWYgdGhlIGZpcnN0IHRoaW5nIHdlIGhpdCBpcyBhIGNsb3Np
bmcgYnJhY2UsIG11c3QgZGVjcmVtZW50IGluZGVudC4KKyAgICAgICAgdmFyIHN6ICA9ICgoY29k
ZS5sZW5ndGggLSBjdXJyTG9jKSA+IDgwKSA/IDgwIDogY29kZS5sZW5ndGggLSBjdXJyTG9jIC0g
MTsKKyAgICAgICAgdmFyIHN1YiA9IGNvZGUuc3Vic3RyKGN1cnJMb2MsIHN6KTsKKyAgICAgICAg
dmFyIHBhdCA9IC9cUy87CisgICAgICAgIHZhciBwb3MgPSBzdWIuc2VhcmNoKHBhdCk7CisgICAg
ICAgIGlmIChwb3MgPj0gMCAmJiBjb2RlLmNoYXJBdChwb3MgKyBjdXJyTG9jKSA9PSAifSIpIHsK
KyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIH0KKworICAgIHZhciBmaW5kRU9MID0gL1xzKlxuLzsKKyAgICB2YXIgaW5kZW50
TGV2ZWwgPSAwOworICAgIHZhciBpbmRlbnRTaXplID0gNDsgICAgICAgIC8vIDQgc3BhY2VzIHBl
ciBpbmRlbnQuICBTaG91bGQgYmUgY29uZmlndXJhYmxlIQorCisgICAgZnVuY3Rpb24gaW5kZW50
TGluZShjdXJyTG9jLCBpbmRlbnRMZXZlbCkgeworICAgICAgICB2YXIgYyA9IGNvZGUuY2hhckF0
KGN1cnJMb2MpOworICAgICAgICB2YXIgaW5kZW50Q291bnQgPSAwOworCisgICAgICAgIGlmIChu
ZXh0Tm9uV1Npc0Nsb3NpbmdCcmFjZShjdXJyTG9jKSkgeworICAgICAgICAgICAgaWYgKGluZGVu
dExldmVsID4gMCkKKyAgICAgICAgICAgICAgICAtLWluZGVudExldmVsOworICAgICAgICB9CisK
KyAgICAgICAgaWYgKDAgPT0gaW5kZW50TGV2ZWwpCisgICAgICAgICAgICByZXR1cm4gY3Vyckxv
YzsKKworICAgICAgICB3aGlsZSAoYyA9PSAiICIgfHwgYyA9PSAiXHQiIHx8IGMgPT0gIlxuIikg
eworICAgICAgICAgICAgaWYgKGluZGVudENvdW50IDwgaW5kZW50TGV2ZWwgKiBpbmRlbnRTaXpl
KSB7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gIlx0IikgeworICAgICAgICAgICAgICAgICAg
ICBmb3IgKHZhciBqID0gMDsgaiA8IGluZGVudFNpemU7ICsraikKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGVjaG9DaGFyKCIgIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICJc
biIpIHsKKyAgICAgICAgICAgICAgICAgICAgZWNob0NoYXIoIiAiKTsKKyAgICAgICAgICAgICAg
ICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZWNob0NoYXIoYyk7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBjdXJyTG9jKys7CisgICAgICAgICAgICBjID0gY29kZS5jaGFyQXQoY3Vy
ckxvYyk7CisgICAgICAgICAgICBpZiAoYyA9PSAiXHQiKQorICAgICAgICAgICAgICAgIGluZGVu
dENvdW50ICs9IGluZGVudFNpemU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAg
aW5kZW50Q291bnQrKzsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChpbmRlbnRDb3VudCA8
IGluZGVudExldmVsICogaW5kZW50U2l6ZSkgeyAKKyAgICAgICAgICAgIGVjaG9DaGFyKCIgIik7
CisgICAgICAgICAgICBpbmRlbnRDb3VudCsrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJu
IGN1cnJMb2M7CisgICAgfQorCiAgICAgdmFyIHJlc3VsdCA9ICIiOwogICAgIHZhciBjUHJldiA9
ICIiOwogICAgIHZhciBjID0gIiI7CkBAIC03NTEsNiArODA2LDggQEAgZnVuY3Rpb24gc3ludGF4
SGlnaGxpZ2h0KGNvZGUsIGZpbGUpCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXN1bHQg
Kz0gIjwvc3Bhbj4iOwogICAgICAgICAgICAgZWNob0NoYXIoYyk7CisgICAgICAgICAgICAKKyAg
ICAgICAgICAgIGkgPSBpbmRlbnRMaW5lKGkrMSwgaW5kZW50TGV2ZWwpIC0gMTsKICAgICAgICAg
ICAgIGNvbnRpbnVlOwogICAgICAgICB9IGVsc2UgaWYgKGMgPT0gIlwiIiB8fCBjID09ICInIikg
ewogICAgICAgICAgICAgdmFyIGluc3RyaW5ndHlwZSA9IGM7CkBAIC04NjUsNiArOTIyLDI4IEBA
IGZ1bmN0aW9uIHN5bnRheEhpZ2hsaWdodChjb2RlLCBmaWxlKQogCiAgICAgICAgICAgICAgICAg
Y29udGludWU7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAieyIpIHsK
KyAgICAgICAgICAgIGluZGVudExldmVsKys7CisgICAgICAgICAgICBlY2hvQ2hhcihjKTsKKyAg
ICAgICAgICAgIGVjaG9DaGFyKCJcbiIpOworICAgICAgICAgICAgaSA9IGluZGVudExpbmUoaSsx
LCBpbmRlbnRMZXZlbCkgLSAxOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxz
ZSBpZiAoYyA9PSAifSIpIHsKKworICAgICAgICAgICAgaWYgKGNQcmV2ICE9ICIgIiAmJiBjUHJl
diAhPSAiXHQiICYmIGNQcmV2ICE9ICJcbiIgJiYgY1ByZXYgIT0gIjsiKSB7CisgICAgICAgICAg
ICAgICAgZWNob0NoYXIoIlxuIik7CisgICAgICAgICAgICAgICAgaSA9IGluZGVudExpbmUoaSwg
aW5kZW50TGV2ZWwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlY2hvQ2hhcihjKTsK
KyAgICAgICAgICAgIGlmIChpbmRlbnRMZXZlbCA+IDApCisgICAgICAgICAgICAgICAgaW5kZW50
TGV2ZWwtLTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgIH0gZWxzZSBpZiAoYyA9PSAi
OyIpIHsKKyAgICAgICAgICAgIGVjaG9DaGFyKGMpOworICAgICAgICAgICAgZWNob0NoYXIoIlxu
Iik7CisgICAgICAgICAgICBpID0gaW5kZW50TGluZShpKzEsIGluZGVudExldmVsKSAtIDE7Cisg
ICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCiAgICAgICAgIGVjaG9DaGFyKGMpOwo=
</data>
<flag name="review"
          id="8147"
          type_id="1"
          status="-"
          setter="aroben"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>18629</attachid>
            <date>2008-01-23 15:00:08 -0800</date>
            <delta_ts>2008-01-27 20:18:20 -0800</delta_ts>
            <desc>Second revision based on Alp and Aroben&apos;s comments.</desc>
            <filename>webcore-win32.patch</filename>
            <type>text/plain</type>
            <size>22011</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyOTcyNykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNDUgQEAKKzIwMDgtMDEtMjIgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBnbWFp
bC5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
Rmlyc3Qgc3RlcCBvZiBmdWxseSBuYXRpdmUgd2luMzIgYnVpbGQuICBUaGlzIHBhdGNoOgorICAg
ICAgICAtIGFkZHMgdmFyaW91cyBQTEFURk9STSBndWFyZHMgdG8gY29kZSB0aGF0IHdpbGwgbm90
IGJ1aWxkIHVuZGVyCisgICAgICAgICAgc3RyaWN0IHdpbjMyIGxpYnJhcmllcy4KKyAgICAgICAg
LSBwcm92aWRlcyBzb21lIGltcGxlbWVudGF0aW9ucyBvZiB3aW4zMi9DYWlybyBzdXBwb3J0Lgor
CisgICAgICAgIFdBUk5JTkc6IE5PIFRFU1QgQ0FTRVMgQURERUQgT1IgQ0hBTkdFRAorCisgICAg
ICAgICogYnJpZGdlL3dpbi9GcmFtZVdpbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjppbWFnZUZy
b21TZWxlY3Rpb24pOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250RGF0YWJh
c2UuY3BwOgorICAgICAgICAoV2ViQ29yZTo6cG9wdWxhdGVGb250RGF0YWJhc2UpOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250UGxhdGZvcm1EYXRhV2luLmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6OkZvbnRQbGF0Zm9ybURhdGE6OkZvbnRQbGF0Zm9ybURhdGEpOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250V2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OkZvbnQ6OmRyYXdHbHlwaHMpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFw
aGljc0NvbnRleHRXaW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0Ojpn
ZXRXaW5kb3dzQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnJl
bGVhc2VXaW5kb3dzQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHRQ
bGF0Zm9ybVByaXZhdGU6OmNvbmNhdENUTSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQ6OmRyYXdGb2N1c1JpbmcpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
OjpkcmF3TGluZUZvck1pc3NwZWxsaW5nT3JCYWRHcmFtbWFyKToKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy93aW4vSW1hZ2VXaW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6Qml0bWFwSW1h
Z2U6OmdldEhCSVRNQVBPZlNpemUpOgorICAgICAgICAoV2ViQ29yZTo6Qml0bWFwSW1hZ2U6OmRy
YXdGcmFtZU1hdGNoaW5nU291cmNlU2l6ZSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luL1NpbXBsZUZvbnREYXRhV2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnRE
YXRhOjpwbGF0Zm9ybUluaXQpOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnBs
YXRmb3JtV2lkdGhGb3JHbHlwaCk6CisgICAgICAgICogcGxhdGZvcm0vd2luL0NsaXBib2FyZFV0
aWxpdGllc1dpbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpnZXRVUkwpOgorICAgICAgICAqIHBs
YXRmb3JtL3dpbi9EcmFnSW1hZ2VXaW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6c2NhbGVEcmFn
SW1hZ2UpOgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRlRHJhZ0ltYWdlRnJvbUltYWdlKToKKyAg
ICAgICAgKiBwbGF0Zm9ybS93aW4vRmlsZVN5c3RlbVdpbi5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpidW5kbGVOYW1lKToKKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vU2VhcmNoUG9wdXBNZW51V2lu
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlNlYXJjaFBvcHVwTWVudTo6c2F2ZVJlY2VudFNlYXJj
aGVzKToKKyAgICAgICAgKFdlYkNvcmU6OlNlYXJjaFBvcHVwTWVudTo6bG9hZFJlY2VudFNlYXJj
aGVzKToKKwogMjAwOC0wMS0yMiAgRGFyaW4gQWRsZXIgIDxkYXJpbkBhcHBsZS5jb20+CiAKICAg
ICAgICAgUmV2aWV3ZWQgYnkgT2xpdmVyIEh1bnQuCkluZGV4OiBXZWJDb3JlL2JyaWRnZS93aW4v
RnJhbWVXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZVdpbi5j
cHAJKHJldmlzaW9uIDI5NzI2KQorKysgV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lV2luLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMTUwLDYgKzE1MCw3IEBAIHN0YXRpYyB2b2lkIGRyYXdSZWN0SW50
b0NvbnRleHQoSW50UmVjdCAKIAogSEJJVE1BUCBpbWFnZUZyb21TZWxlY3Rpb24oRnJhbWUqIGZy
YW1lLCBib29sIGZvcmNlQmxhY2tUZXh0KQogeworI2lmIFBMQVRGT1JNKENHKQogICAgIGZyYW1l
LT5zZXRQYWludFJlc3RyaWN0aW9uKGZvcmNlQmxhY2tUZXh0ID8gUGFpbnRSZXN0cmljdGlvblNl
bGVjdGlvbk9ubHlCbGFja1RleHQgOiBQYWludFJlc3RyaWN0aW9uU2VsZWN0aW9uT25seSk7CiAg
ICAgRmxvYXRSZWN0IGZyID0gZnJhbWUtPnNlbGVjdGlvblJlY3QoKTsKICAgICBJbnRSZWN0IGly
KChpbnQpZnIueCgpLCAoaW50KWZyLnkoKSwoaW50KWZyLndpZHRoKCksKGludClmci5oZWlnaHQo
KSk7CkBAIC0xODAsNiArMTgxLDcgQEAgSEJJVE1BUCBpbWFnZUZyb21TZWxlY3Rpb24oRnJhbWUq
IGZyYW1lLAogICAgIGZyYW1lLT5zZXRQYWludFJlc3RyaWN0aW9uKFBhaW50UmVzdHJpY3Rpb25O
b25lKTsKIAogICAgIHJldHVybiBoYm1wOworI2VuZGlmCiB9CiAKIERyYWdJbWFnZVJlZiBGcmFt
ZTo6ZHJhZ0ltYWdlRm9yU2VsZWN0aW9uKCkKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0ZvbnREYXRhYmFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW4vRm9udERhdGFiYXNlLmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250RGF0YWJhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0zMSw4ICszMSwxMSBAQAogCiAjaW5jbHVkZSAiQ1N0cmluZy5oIgogI2luY2x1ZGUgIkZpbGVT
eXN0ZW0uaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1ZGUgIlBsYXRmb3Jt
U3RyaW5nLmgiCisjaWYgUExBVEZPUk0oQ0cpCiAjaW5jbHVkZSA8V2ViS2l0U3lzdGVtSW50ZXJm
YWNlL1dlYktpdFN5c3RlbUludGVyZmFjZS5oPgorI2VuZGlmCiAjaW5jbHVkZSA8c2hsb2JqLmg+
CiAjaW5jbHVkZSA8d3RmL1JldGFpblB0ci5oPgogCkBAIC03Niw2ICs3OSw3IEBAIHN0YXRpYyBi
b29sIHN5c3RlbUhhc0ZvbnRzTmV3ZXJUaGFuRm9udHMKICAgICByZXR1cm4gQ29tcGFyZUZpbGVU
aW1lKCZwbGlzdEF0dHJpYnV0ZXMuZnRMYXN0V3JpdGVUaW1lLCAmZm9udHNEaXJlY3RvcnlBdHRy
aWJ1dGVzLmZ0TGFzdFdyaXRlVGltZSkgPCAwOwogfQogCisjaWYgUExBVEZPUk0oQ0YpCiBzdGF0
aWMgUmV0YWluUHRyPENGUHJvcGVydHlMaXN0UmVmPiByZWFkRm9udFBsaXN0KCkKIHsKICAgICBD
U3RyaW5nIHBsaXN0UGF0aCA9IGZvbnRzUGxpc3RQYXRoKCkudXRmOCgpOwpAQCAtMTMxLDYgKzEz
NSw3IEBAIHN0YXRpYyB2b2lkIHdyaXRlRm9udERhdGFiYXNlVG9QbGlzdCgpCiAKICAgICBzYWZl
Q3JlYXRlRmlsZShmb250c1BsaXN0UGF0aCgpLCBkYXRhLmdldCgpKTsKIH0KKyNlbmRpZgogCiB2
b2lkIHBvcHVsYXRlRm9udERhdGFiYXNlKCkKIHsKQEAgLTEzOSwxMiArMTQ0LDE0IEBAIHZvaWQg
cG9wdWxhdGVGb250RGF0YWJhc2UoKQogICAgICAgICByZXR1cm47CiAgICAgaW5pdGlhbGl6ZWQg
PSB0cnVlOwogCisjaWYgUExBVEZPUk0oQ0YpCiAgICAgaWYgKCFzeXN0ZW1IYXNGb250c05ld2Vy
VGhhbkZvbnRzUGxpc3QoKSkKICAgICAgICAgaWYgKHBvcHVsYXRlRm9udERhdGFiYXNlRnJvbVBs
aXN0KCkpCiAgICAgICAgICAgICByZXR1cm47CiAKICAgICBpZiAocG9wdWxhdGVGb250RGF0YWJh
c2VGcm9tRmlsZVN5c3RlbSgpKQogICAgICAgICB3cml0ZUZvbnREYXRhYmFzZVRvUGxpc3QoKTsK
KyNlbmRpZgogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbi9Gb250UGxhdGZvcm1EYXRhV2luLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250UGxhdGZvcm1EYXRhV2luLmNwcAkocmV2
aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250UGxhdGZv
cm1EYXRhV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDEsNiArNDEsNyBAQCBzdGF0aWMgY29u
c3QgaW50IEJvbGRPYmxpcXVlID0gKDEgPDwgMik7CiAKIHN0YXRpYyBpbmxpbmUgVVNIT1JUIHJl
YWRCaWdFbmRpYW5Xb3JkKGNvbnN0IEJZVEUqIHdvcmQpIHsgcmV0dXJuICh3b3JkWzBdIDw8IDgp
IHwgd29yZFsxXTsgfQogCisjaWYgUExBVEZPUk0oQ0YpCiBzdGF0aWMgQ0ZTdHJpbmdSZWYgZ2V0
UG9zdFNjcmlwdE5hbWUoQ0ZTdHJpbmdSZWYgZmFjZU5hbWUsIEhEQyBkYykKIHsKICAgICBjb25z
dCBEV09SRCBjTWF4TmFtZVRhYmxlU2l6ZSA9IDEwMjQgKiAxMDI0OwpAQCAtMTA5LDYgKzExMCw3
IEBAIHN0YXRpYyBDRlN0cmluZ1JlZiBnZXRQb3N0U2NyaXB0TmFtZShDRlMKICAgICAgICAgbmFt
ZU1hcC5zZXQoZmFjZVN0cmluZywgcmVzdWx0KTsKICAgICByZXR1cm4gcmVzdWx0LmdldCgpOwog
fQorI2VuZGlmCiAKIHN0YXRpYyBpbnQgQ0FMTEJBQ0sgZW51bVN0eWxlc0NhbGxiYWNrKGNvbnN0
IExPR0ZPTlQqIGxvZ0ZvbnQsIGNvbnN0IFRFWFRNRVRSSUMqIG1ldHJpY3MsIERXT1JEIGZvbnRU
eXBlLCBMUEFSQU0gbFBhcmFtKQogewpAQCAtMTc5LDYgKzE4MSw3IEBAIEZvbnRQbGF0Zm9ybURh
dGE6OkZvbnRQbGF0Zm9ybURhdGEoSEZPTlQKICAgICAgICAgICAgICAgICAgICAgbV9zeW50aGV0
aWNPYmxpcXVlID0gdHJ1ZTsKICAgICAgICAgfQogCisjaWYgUExBVEZPUk0oQ0cpCiAgICAgICAg
IC8vIFRyeSB0aGUgZmFjZSBuYW1lIGZpcnN0LiAgV2luZG93cyBtYXkgZW5kIHVwIGxvY2FsaXpp
bmcgdGhpcyBuYW1lLCBhbmQgQ0cgZG9lc24ndCBrbm93IGFib3V0CiAgICAgICAgIC8vIHRoZSBs
b2NhbGl6YXRpb24uICBJZiB0aGUgY3JlYXRlIGZhaWxzLCB3ZSdsbCB0cnkgdGhlIFBvc3RTY3Jp
cHQgbmFtZS4KICAgICAgICAgUmV0YWluUHRyPENGU3RyaW5nUmVmPiBmdWxsTmFtZShBZG9wdENG
LCBDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKE5VTEwsIChjb25zdCBVbmlDaGFyKilmYWNl
TmFtZSwgd2NzbGVuKGZhY2VOYW1lKSkpOwpAQCAtMTkwLDYgKzE5Myw3IEBAIEZvbnRQbGF0Zm9y
bURhdGE6OkZvbnRQbGF0Zm9ybURhdGEoSEZPTlQKICAgICAgICAgICAgICAgICBBU1NFUlQobV9j
Z0ZvbnQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisjZW5kaWYKICAgICAgICAgZnJlZSht
ZXRyaWNzKTsKICAgICB9CiAKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0Zv
bnRXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0Zv
bnRXaW4uY3BwCShyZXZpc2lvbiAyOTcyNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luL0ZvbnRXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMyw4ICszMywxMCBAQAogI2luY2x1
ZGUgIk5vdEltcGxlbWVudGVkLmgiCiAjaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIKICNpbmNs
dWRlICJVbmlzY3JpYmVDb250cm9sbGVyLmgiCisjaWYgUExBVEZPUk0oQ0cpCiAjaW5jbHVkZSA8
QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CiAjaW5jbHVkZSA8V2Vi
S2l0U3lzdGVtSW50ZXJmYWNlL1dlYktpdFN5c3RlbUludGVyZmFjZS5oPgorI2VuZGlmCiAjaW5j
bHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewpAQCAtMTI3LDYg
KzEyOSw3IEBAIHZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQqIGcKICAgICAg
ICAgcmV0dXJuOwogICAgIH0KIAorI2lmIFBMQVRGT1JNKENHKQogICAgIENHQ29udGV4dFJlZiBj
Z0NvbnRleHQgPSBncmFwaGljc0NvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpOwogCiAgICAgdWlu
dDMyX3Qgb2xkRm9udFNtb290aGluZ1N0eWxlID0gd2tTZXRGb250U21vb3RoaW5nU3R5bGUoY2dD
b250ZXh0KTsKQEAgLTE2MSw2ICsxNjQsNyBAQCB2b2lkIEZvbnQ6OmRyYXdHbHlwaHMoR3JhcGhp
Y3NDb250ZXh0KiBnCiAgICAgfQogCiAgICAgd2tSZXN0b3JlRm9udFNtb290aGluZ1N0eWxlKGNn
Q29udGV4dCwgb2xkRm9udFNtb290aGluZ1N0eWxlKTsKKyNlbmRpZgogfQogCiBGbG9hdFJlY3Qg
Rm9udDo6c2VsZWN0aW9uUmVjdEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29u
c3QgSW50UG9pbnQmIHBvaW50LCBpbnQgaCwKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0dyYXBoaWNzQ29udGV4dFdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0V2luLmNwcAkocmV2aXNpb24gMjk3MjYp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRXaW4uY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0yOSwxMSArMjksMTUgQEAKICNpbmNsdWRlICJBZmZpbmVUcmFu
c2Zvcm0uaCIKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1ZGUgIlBhdGguaCIK
LSNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ0dCaXRtYXBDb250ZXh0Lmg+Ci0jaW5jbHVkZSA8V2Vi
S2l0U3lzdGVtSW50ZXJmYWNlL1dlYktpdFN5c3RlbUludGVyZmFjZS5oPgogI2luY2x1ZGUgPHd0
Zi9NYXRoRXh0cmFzLmg+CiAKKyNpZiBQTEFURk9STShDRykKKyNpbmNsdWRlIDxDb3JlR3JhcGhp
Y3MvQ0dCaXRtYXBDb250ZXh0Lmg+CisjaW5jbHVkZSA8V2ViS2l0U3lzdGVtSW50ZXJmYWNlL1dl
YktpdFN5c3RlbUludGVyZmFjZS5oPgogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFBsYXRmb3Jt
UHJpdmF0ZS5oIgorI2VsaWYgUExBVEZPUk0oQ0FJUk8pCisjaW5jbHVkZSA8Y2Fpcm8td2luMzIu
aD4KKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCkBAIC00MSw2ICs0NSw3IEBAIG5h
bWVzcGFjZSBXZWJDb3JlIHsKIAogY2xhc3MgU1ZHUmVzb3VyY2VJbWFnZTsKIAorI2lmIFBMQVRG
T1JNKENHKQogc3RhdGljIENHQ29udGV4dFJlZiBDR0NvbnRleHRXaXRoSERDKEhEQyBoZGMpCiB7
CiAgICAgSEJJVE1BUCBiaXRtYXAgPSAoSEJJVE1BUClHZXRDdXJyZW50T2JqZWN0KGhkYywgT0JK
X0JJVE1BUCk7CkBAIC03Niw5ICs4MSwxMSBAQCBHcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29u
dGV4dChIREMgaGRjCiAgICAgICAgIHNldFBsYXRmb3JtU3Ryb2tlQ29sb3Ioc3Ryb2tlQ29sb3Io
KSk7CiAgICAgfQogfQorI2VuZGlmCiAKIEhEQyBHcmFwaGljc0NvbnRleHQ6OmdldFdpbmRvd3ND
b250ZXh0KGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGJvb2wgc3VwcG9ydEFscGhhQmxlbmQpCiB7
CisjaWYgUExBVEZPUk0oQ0cpCiAgICAgaWYgKGluVHJhbnNwYXJlbmN5TGF5ZXIoKSkgewogICAg
ICAgICBpZiAoZHN0UmVjdC5pc0VtcHR5KCkpCiAgICAgICAgICAgICByZXR1cm4gMDsKQEAgLTEz
MiwxMiArMTM5LDM3IEBAIEhEQyBHcmFwaGljc0NvbnRleHQ6OmdldFdpbmRvd3NDb250ZXh0KGMK
ICAgICBDR0NvbnRleHRGbHVzaChwbGF0Zm9ybUNvbnRleHQoKSk7CiAgICAgbV9kYXRhLT5zYXZl
KCk7CiAgICAgcmV0dXJuIG1fZGF0YS0+bV9oZGM7CisjZWxpZiBQTEFURk9STShDQUlSTykKKyAg
ICAvLyBUaGlzIGlzIHByb2JhYmx5IHdyb25nLCBhbmQgZGVmaW5pdGVseSBvdXQgb2YgZGF0ZS4g
IFB1bGxlZCBmcm9tIG9sZCBTVk4KKyAgICBjYWlyb19zdXJmYWNlX3QqIHN1cmZhY2UgPSBjYWly
b19nZXRfdGFyZ2V0KHBsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBIREMgaGRjID0gY2Fpcm9fd2lu
MzJfc3VyZmFjZV9nZXRfZGMoc3VyZmFjZSk7ICAgCisgICAgU2F2ZURDKGhkYyk7CisKKyAgICAv
LyBGSVhNRTogV2UgbmVlZCB0byBtYWtlIHN1cmUgYSBjbGlwIGlzIHJlYWxseSBzZXQgb24gdGhl
IEhEQy4KKyAgICAvLyBDYWxsIFNldFdvcmxkVHJhbnNmb3JtIHRvIGhvbm9yIHRoZSBjdXJyZW50
IENhaXJvIHRyYW5zZm9ybS4KKyAgICBTZXRHcmFwaGljc01vZGUoaGRjLCBHTV9BRFZBTkNFRCk7
IC8vIFdlIG5lZWQgdGhpcyBjYWxsIGZvciB0aGVtZXMgdG8gaG9ub3Igd29ybGQgdHJhbnNmb3Jt
cy4KKyAgICBjYWlyb19tYXRyaXhfdCBtYXQ7CisgICAgY2Fpcm9fZ2V0X21hdHJpeChwbGF0Zm9y
bUNvbnRleHQoKSwgJm1hdCk7CisgICAgWEZPUk0geGZvcm07CisgICAgeGZvcm0uZU0xMSA9IG1h
dC54eDsKKyAgICB4Zm9ybS5lTTEyID0gbWF0Lnh5OworICAgIHhmb3JtLmVNMjEgPSBtYXQueXg7
CisgICAgeGZvcm0uZU0yMiA9IG1hdC55eTsKKyAgICB4Zm9ybS5lRHggPSBtYXQueDA7CisgICAg
eGZvcm0uZUR5ID0gbWF0LnkwOworICAgIFNldFdvcmxkVHJhbnNmb3JtKGhkYywgJnhmb3JtKTsK
KworICAgIHJldHVybiBoZGM7CisjZW5kaWYKIH0KIAorI2lmIFBMQVRGT1JNKENHKQogYm9vbCBH
cmFwaGljc0NvbnRleHQ6OmluVHJhbnNwYXJlbmN5TGF5ZXIoKSBjb25zdCB7IHJldHVybiBtX2Rh
dGEtPm1fdHJhbnNwYXJlbmN5Q291bnQ7IH0KKyNlbmRpZgogCiB2b2lkIEdyYXBoaWNzQ29udGV4
dDo6cmVsZWFzZVdpbmRvd3NDb250ZXh0KEhEQyBoZGMsIGNvbnN0IEludFJlY3QmIGRzdFJlY3Qs
IGJvb2wgc3VwcG9ydEFscGhhQmxlbmQpCiB7CisjaWYgUExBVEZPUk0oQ0cpCiAgICAgaWYgKGhk
YyAmJiBpblRyYW5zcGFyZW5jeUxheWVyKCkpIHsKICAgICAgICAgaWYgKGRzdFJlY3QuaXNFbXB0
eSgpKQogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTY5LDggKzIwMSwxNSBAQCB2b2lkIEdyYXBo
aWNzQ29udGV4dDo6cmVsZWFzZVdpbmRvd3NDb250CiAgICAgfQogCiAgICAgbV9kYXRhLT5yZXN0
b3JlKCk7CisjZWxpZiBQTEFURk9STShDQUlSTykKKyAgICBjYWlyb19zdXJmYWNlX3QqIHN1cmZh
Y2UgPSBjYWlyb19nZXRfdGFyZ2V0KHBsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBIREMgaGRjMiA9
IGNhaXJvX3dpbjMyX3N1cmZhY2VfZ2V0X2RjKHN1cmZhY2UpOworICAgIFJlc3RvcmVEQyhoZGMy
LCAtMSk7CisgICAgY2Fpcm9fc3VyZmFjZV9tYXJrX2RpcnR5KHN1cmZhY2UpOworI2VuZGlmCiB9
CiAKKyNpZiBQTEFURk9STShDRykKIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRl
OjpzYXZlKCkKIHsKICAgICBpZiAoIW1faGRjKQpAQCAtMjQ2LDYgKzI4NSw4IEBAIHZvaWQgR3Jh
cGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpjb24KIHsKICAgICBpZiAoIW1faGRjKQogICAg
ICAgICByZXR1cm47CisKKyNpZiBQTEFURk9STShDRykKICAgICBDR0FmZmluZVRyYW5zZm9ybSBt
YXQgPSB0cmFuc2Zvcm07CiAgICAgWEZPUk0geGZvcm07CiAgICAgeGZvcm0uZU0xMSA9IG1hdC5h
OwpAQCAtMjU0LDE0ICsyOTUsMjggQEAgdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZh
dGU6OmNvbgogICAgIHhmb3JtLmVNMjIgPSBtYXQuZDsKICAgICB4Zm9ybS5lRHggPSBtYXQudHg7
CiAgICAgeGZvcm0uZUR5ID0gbWF0LnR5OworI2VsaWYgUExBVEZPUk0oQ0FJUk8pCisgICAgY2Fp
cm9fbWF0cml4X3QgbWF0OworICAgIGNhaXJvX2dldF9tYXRyaXgocGxhdGZvcm1Db250ZXh0KCks
ICZtYXQpOworICAgIFhGT1JNIHhmb3JtOworICAgIHhmb3JtLmVNMTEgPSBtYXQueHg7CisgICAg
eGZvcm0uZU0xMiA9IG1hdC54eTsKKyAgICB4Zm9ybS5lTTIxID0gbWF0Lnl4OworICAgIHhmb3Jt
LmVNMjIgPSBtYXQueXk7CisgICAgeGZvcm0uZUR4ID0gbWF0LngwOworICAgIHhmb3JtLmVEeSA9
IG1hdC55MDsKKyNlbmRpZgorCiAgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9y
bSwgTVdUX0xFRlRNVUxUSVBMWSk7CiB9CisjZW5kaWYKIAogdm9pZCBHcmFwaGljc0NvbnRleHQ6
OmRyYXdGb2N1c1JpbmcoY29uc3QgQ29sb3ImIGNvbG9yKQogewogICAgIGlmIChwYWludGluZ0Rp
c2FibGVkKCkpCiAgICAgICAgIHJldHVybjsKIAorI2lmIFBMQVRGT1JNKENHKQogICAgIGZsb2F0
IHJhZGl1cyA9IChmb2N1c1JpbmdXaWR0aCgpIC0gMSkgLyAyLjBmOwogICAgIGludCBvZmZzZXQg
PSByYWRpdXMgKyBmb2N1c1JpbmdPZmZzZXQoKTsKICAgICBDR0NvbG9yUmVmIGNvbG9yUmVmID0g
Y29sb3IuaXNWYWxpZCgpID8gY2dDb2xvcihjb2xvcikgOiAwOwpAQCAtMjg1LDYgKzM0MCw3IEBA
IHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3Rm9jdXNSaW5nKGNvbnMKICAgICBDR1BhdGhSZWxl
YXNlKGZvY3VzUmluZ1BhdGgpOwogCiAgICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShjb250ZXh0
KTsKKyNlbmRpZgogfQogCiBzdGF0aWMgY29uc3QgQ29sb3ImIHNwZWxsaW5nUGF0dGVybkNvbG9y
KCkgewpAQCAtMjk3LDYgKzM1Myw3IEBAIHN0YXRpYyBjb25zdCBDb2xvciYgZ3JhbW1hclBhdHRl
cm5Db2xvcigKICAgICByZXR1cm4gZ3JhbW1hckNvbG9yOwogfQogCisjaWYgUExBVEZPUk0oQ0cp
CiAvLyBQdWxsZWQgZnJvbSBHcmFwaGljc0NvbnRleHRDRwogc3RhdGljIHZvaWQgc2V0Q0dTdHJv
a2VDb2xvcihDR0NvbnRleHRSZWYgY29udGV4dCwgY29uc3QgQ29sb3ImIGNvbG9yKQogewpAQCAt
MzA0LDEyICszNjEsMTQgQEAgc3RhdGljIHZvaWQgc2V0Q0dTdHJva2VDb2xvcihDR0NvbnRleHRS
ZQogICAgIGNvbG9yLmdldFJHQkEocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwogICAgIENHQ29u
dGV4dFNldFJHQlN0cm9rZUNvbG9yKGNvbnRleHQsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsK
IH0KKyNlbmRpZgogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JNaXNzcGVsbGlu
Z09yQmFkR3JhbW1hcihjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCB3aWR0aCwgYm9vbCBncmFt
bWFyKQogewogICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCiAgICAgICAgIHJldHVybjsKLSAg
ICAKKworI2lmIFBMQVRGT1JNKENHKQogICAgIC8vIFRoZXNlIGFyZSB0aGUgc2FtZSBmb3IgbWlz
c3BlbGxpbmcgb3IgYmFkIGdyYW1tYXIKICAgICBjb25zdCBpbnQgcGF0dGVybkhlaWdodCA9IDM7
IC8vIDMgcm93cwogICAgIEFTU0VSVChjTWlzc3BlbGxpbmdMaW5lVGhpY2tuZXNzID09IHBhdHRl
cm5IZWlnaHQpOwpAQCAtMzcyLDYgKzQzMSw3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3
TGluZUZvck1pc3NwZWwKICAgICBDR0NvbnRleHRTdHJva2VMaW5lU2VnbWVudHMoY29udGV4dCwg
bG93ZXJQb2ludHMsIDIpOwogCiAgICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShjb250ZXh0KTsK
KyNlbmRpZgogfQogCiAjaWYgRU5BQkxFKFNWRykKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL0ltYWdlV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbi9JbWFnZVdpbi5jcHAJKHJldmlzaW9uIDI5NzI2KQorKysgV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNyw3ICsy
NywxMSBAQAogI2luY2x1ZGUgIkltYWdlLmgiCiAjaW5jbHVkZSAiQml0bWFwSW1hZ2UuaCIKICNp
bmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpZiBQTEFURk9STShDRykKICNpbmNsdWRlIDxB
cHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KKyNlbGlmIFBMQVRGT1JN
KENBSVJPKQorI2luY2x1ZGUgPGNhaXJvLmg+CisjZW5kaWYKIAogI2luY2x1ZGUgPHdpbnNvY2sy
Lmg+CiAjaW5jbHVkZSA8d2luZG93cy5oPgpAQCAtNjgsNiArNzIsNyBAQCBib29sIEJpdG1hcElt
YWdlOjpnZXRIQklUTUFQT2ZTaXplKEhCSVRNCiAgICAgQklUTUFQIGJtcEluZm87CiAgICAgR2V0
T2JqZWN0KGJtcCwgc2l6ZW9mKEJJVE1BUCksICZibXBJbmZvKTsKIAorI2lmIFBMQVRGT1JNKENH
KQogICAgIEFTU0VSVChibXBJbmZvLmJtQml0c1BpeGVsID09IDMyKTsKICAgICBpbnQgYnVmZmVy
U2l6ZSA9IGJtcEluZm8uYm1XaWR0aEJ5dGVzICogYm1wSW5mby5ibUhlaWdodDsKICAgICAKQEAg
LTc2LDYgKzgxLDIyIEBAIGJvb2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVBPZlNpemUoSEJJVE0K
ICAgICAgICAgOCwgYm1wSW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJHQiwga0NHQml0bWFwQnl0
ZU9yZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhhUHJlbXVsdGlwbGllZEZpcnN0KTsKICAgCiAg
ICAgR3JhcGhpY3NDb250ZXh0IGdjKGNnQ29udGV4dCk7CisjZWxpZiBQTEFURk9STShDQUlSTykK
KyAgICAvLyBJZiB0aGlzIGlzIGEgMzJicHAgYml0bWFwLCB3aGljaCBpdCBhbHdheXMgc2hvdWxk
IGJlLCB3ZSdsbCBjbGVhciBpdCBzbyBhbHBoYS13aXNlIGl0IHdpbGwgYmUgdmlzaWJsZQorICAg
IGlmIChibXBJbmZvLmJtQml0c1BpeGVsID09IDMyKSB7CisgICAgICAgIGludCBidWZmZXJTaXpl
ID0gYm1wSW5mby5ibVdpZHRoQnl0ZXMgKiBibXBJbmZvLmJtSGVpZ2h0OworICAgICAgICBtZW1z
ZXQoYm1wSW5mby5ibUJpdHMsIDI1NSwgYnVmZmVyU2l6ZSk7CisgICAgfQorIAkKKyAgICBIREMg
dGVtcERDID0gQ3JlYXRlQ29tcGF0aWJsZURDKDApOworICAgIGlmICghdGVtcERDKSB7CisgICAg
ICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSBpbi1tZW1vcnkgREMgZm9yIEltYWdlOjpi
bGl0KCkiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBTZWxlY3RPYmplY3Qo
dGVtcERDLCBibXApOworICAgIEdyYXBoaWNzQ29udGV4dCBnYyh0ZW1wREMpOworI2VuZGlmCisK
ICAgICBJbnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcEltYWdlOjpzaXplKCk7CiAgICAgaWYgKHNp
emUpCiAgICAgICAgIGRyYXdGcmFtZU1hdGNoaW5nU291cmNlU2l6ZSgmZ2MsIEZsb2F0UmVjdCgw
LCAwLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQpLCBJbnRTaXplKCpzaXplKSwg
Q29tcG9zaXRlQ29weSk7CkBAIC04MywxNyArMTA0LDMyIEBAIGJvb2wgQml0bWFwSW1hZ2U6Omdl
dEhCSVRNQVBPZlNpemUoSEJJVE0KICAgICAgICAgZHJhdygmZ2MsIEZsb2F0UmVjdCgwLCAwLCBi
bXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQpLCBGbG9hdFJlY3QoMCwgMCwgaW1hZ2VT
aXplLndpZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIENvbXBvc2l0ZUNvcHkpOwogCiAgICAg
Ly8gRG8gY2xlYW51cAorI2lmIFBMQVRGT1JNKENHKQogICAgIENHQ29udGV4dFJlbGVhc2UoY2dD
b250ZXh0KTsKICAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKGRldmljZVJHQik7CisjZWxpZiBQTEFU
Rk9STShDQUlSTykKKyAgICAvLyBEbyBjbGVhbnVwCisgICAgRGVsZXRlREModGVtcERDKTsKKyNl
bmRpZgorCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgQml0bWFwSW1hZ2U6OmRyYXdGcmFt
ZU1hdGNoaW5nU291cmNlU2l6ZShHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVj
dCYgZHN0UmVjdCwgY29uc3QgSW50U2l6ZSYgc3JjU2l6ZSwgQ29tcG9zaXRlT3BlcmF0b3IgY29t
cG9zaXRlT3ApCiB7CiAgICAgaW50IGZyYW1lcyA9IGZyYW1lQ291bnQoKTsKKyAgICBzaXplX3Qg
aW1hZ2VIZWlnaHQgPSAwOworICAgIHNpemVfdCBpbWFnZVdpZHRoID0gMDsKICAgICBmb3IgKGlu
dCBpID0gMDsgaSA8IGZyYW1lczsgKytpKSB7Ci0gICAgICAgIENHSW1hZ2VSZWYgaW1hZ2UgPSBm
cmFtZUF0SW5kZXgoaSk7Ci0gICAgICAgIGlmIChDR0ltYWdlR2V0SGVpZ2h0KGltYWdlKSA9PSAo
c2l6ZV90KXNyY1NpemUuaGVpZ2h0KCkgJiYgQ0dJbWFnZUdldFdpZHRoKGltYWdlKSA9PSAoc2l6
ZV90KXNyY1NpemUud2lkdGgoKSkgeworICAgICAgICBOYXRpdmVJbWFnZVB0ciBpbWFnZSA9IGZy
YW1lQXRJbmRleChpKTsKKyNpZiBQTEFURk9STShDRykKKwlpbWFnZUhlaWdodCA9IENHSW1hZ2VH
ZXRIZWlnaHQoaW1hZ2UpOworCWltYWdlV2lkdGggPSBDR0ltYWdlR2V0V2lkdGgoaW1hZ2UpOwor
I2VsaWYgUExBVEZPUk0oQ0FJUk8pCisJaW1hZ2VIZWlnaHQgPSBjYWlyb19pbWFnZV9zdXJmYWNl
X2dldF9oZWlnaHQoaW1hZ2UpOworCWltYWdlV2lkdGggPSBjYWlyb19pbWFnZV9zdXJmYWNlX2dl
dF93aWR0aChpbWFnZSk7CisjZW5kaWYKKyAgICAgICAgaWYgKGltYWdlSGVpZ2h0ID09IChzaXpl
X3Qpc3JjU2l6ZS5oZWlnaHQoKSAmJiBpbWFnZVdpZHRoID09IChzaXplX3Qpc3JjU2l6ZS53aWR0
aCgpKSB7CiAgICAgICAgICAgICBzaXplX3QgY3VycmVudEZyYW1lID0gbV9jdXJyZW50RnJhbWU7
CiAgICAgICAgICAgICBtX2N1cnJlbnRGcmFtZSA9IGk7CiAgICAgICAgICAgICBkcmF3KGN0eHQs
IGRzdFJlY3QsIEZsb2F0UmVjdCgwLCAwLCBzcmNTaXplLndpZHRoKCksIHNyY1NpemUuaGVpZ2h0
KCkpLCBjb21wb3NpdGVPcCk7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9T
aW1wbGVGb250RGF0YVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW4vU2ltcGxlRm9udERhdGFXaW4uY3BwCShyZXZpc2lvbiAyOTcyNikKKysrIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhV2luLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMzcsMTAgKzM3LDEyIEBACiAjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KICNp
bmNsdWRlIDx1bmljb2RlL3VjaGFyLmg+CiAjaW5jbHVkZSA8dW5pY29kZS91bm9ybS5oPgorI2lm
IFBMQVRGT1JNKENHKQogI2luY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25T
ZXJ2aWNlcy5oPgorI2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVyZmFjZS9XZWJLaXRTeXN0ZW1J
bnRlcmZhY2UuaD4KKyNlbmRpZgogI2luY2x1ZGUgPG1sYW5nLmg+CiAjaW5jbHVkZSA8dGNoYXIu
aD4KLSNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNl
Lmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIApAQCAtNTgsOCArNjAsMTAgQEAgdm9pZCBTaW1w
bGVGb250RGF0YTo6c2V0U2hvdWxkQXBwbHlNYWNBcwogfQogCiB2b2lkIFNpbXBsZUZvbnREYXRh
OjpwbGF0Zm9ybUluaXQoKQoteyAgICAKK3sKKyNpZiBQTEFURk9STShDRykKICAgICBtX3N5bnRo
ZXRpY0JvbGRPZmZzZXQgPSBtX2ZvbnQuc3ludGhldGljQm9sZCgpID8gMS4wZiA6IDAuZjsKKyNl
bmRpZgogICAgIG1fc2NyaXB0Q2FjaGUgPSAwOwogICAgIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMg
PSAwOwogICAgIG1faXNTeXN0ZW1Gb250ID0gZmFsc2U7CkBAIC0yNDksMTQgKzI1MywyMiBAQCBm
bG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZvckdsCiAgICAgICAgIHJldHVybiB3
aWR0aDsKICAgICB9CiAKKyNpZiBQTEFURk9STShDRykKICAgICBDR0ZvbnRSZWYgZm9udCA9IG1f
Zm9udC5jZ0ZvbnQoKTsKICAgICBmbG9hdCBwb2ludFNpemUgPSBtX2ZvbnQuc2l6ZSgpOwogICAg
IENHU2l6ZSBhZHZhbmNlOwogICAgIENHQWZmaW5lVHJhbnNmb3JtIG0gPSBDR0FmZmluZVRyYW5z
Zm9ybU1ha2VTY2FsZShwb2ludFNpemUsIHBvaW50U2l6ZSk7CisjZW5kaWYKKyAKICAgICAvLyBG
SVhNRTogTmVlZCB0byBhZGQgcmVhbCBzdXBwb3J0IGZvciBwcmludGVyIGZvbnRzLgogICAgIGJv
b2wgaXNQcmludGVyRm9udCA9IGZhbHNlOwogICAgIHdrR2V0R2x5cGhBZHZhbmNlcyhmb250LCBt
LCBtX2lzU3lzdGVtRm9udCwgaXNQcmludGVyRm9udCwgZ2x5cGgsIGFkdmFuY2UpOworCisjaWYg
UExBVEZPUk0oQ0cpCiAgICAgcmV0dXJuIGFkdmFuY2Uud2lkdGggKyBtX3N5bnRoZXRpY0JvbGRP
ZmZzZXQ7CisjZWxzZQorICAgIHJldHVybiBhZHZhbmNlLndpZHRoOworI2VuZGlmCiB9CiAKIFND
UklQVF9GT05UUFJPUEVSVElFUyogU2ltcGxlRm9udERhdGE6OnNjcmlwdEZvbnRQcm9wZXJ0aWVz
KCkgY29uc3QKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luL0NsaXBib2FyZFV0aWxpdGllc1dp
bi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJvYXJkVXRpbGl0
aWVzV2luLmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbi9DbGlw
Ym9hcmRVdGlsaXRpZXNXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMTEsMTIgKzMxMSwxNCBA
QCBTdHJpbmcgZ2V0VVJMKElEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBiCiAgICAgICAgIC8vZmls
ZSB1c2luZyB1bmljb2RlCiAgICAgICAgIHdjaGFyX3QqIGRhdGEgPSAod2NoYXJfdCopR2xvYmFs
TG9jayhzdG9yZS5oR2xvYmFsKTsKICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YVswXSAmJiAoUGF0
aEZpbGVFeGlzdHMoZGF0YSkgfHwgUGF0aElzVU5DKGRhdGEpKSkgeworI2lmIFBMQVRGT1JNKENG
KQogICAgICAgICAgICAgUmV0YWluUHRyPENGU3RyaW5nUmVmPiBwYXRoQXNDRlN0cmluZyhBZG9w
dENGLCBDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKGtDRkFsbG9jYXRvckRlZmF1bHQsIChj
b25zdCBVbmlDaGFyKilkYXRhLCB3Y3NsZW4oZGF0YSkpKTsKICAgICAgICAgICAgIGlmICh1cmxG
cm9tUGF0aChwYXRoQXNDRlN0cmluZy5nZXQoKSwgdXJsKSkgewogICAgICAgICAgICAgICAgIGlm
ICh0aXRsZSkKICAgICAgICAgICAgICAgICAgICAgKnRpdGxlID0gdXJsOwogICAgICAgICAgICAg
ICAgIHN1Y2Nlc3MgPSB0cnVlOwogICAgICAgICAgICAgfQorI2VuZGlmCiAgICAgICAgIH0KICAg
ICAgICAgR2xvYmFsVW5sb2NrKHN0b3JlLmhHbG9iYWwpOyAgICAgIAogICAgICAgICBSZWxlYXNl
U3RnTWVkaXVtKCZzdG9yZSk7CkBAIC0zMjQsMTIgKzMyNiwxNCBAQCBTdHJpbmcgZ2V0VVJMKElE
YXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBiCiAgICAgICAgIC8vZmlsZW5hbWUgdXNpbmcgYXNjaWkK
ICAgICAgICAgY2hhciogZGF0YSA9IChjaGFyKilHbG9iYWxMb2NrKHN0b3JlLmhHbG9iYWwpOyAg
ICAgICAKICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YVswXSAmJiAoUGF0aEZpbGVFeGlzdHNBKGRh
dGEpIHx8IFBhdGhJc1VOQ0EoZGF0YSkpKSB7CisjaWYgUExBVEZPUk0oQ0YpCiAgICAgICAgICAg
ICBSZXRhaW5QdHI8Q0ZTdHJpbmdSZWY+IHBhdGhBc0NGU3RyaW5nKEFkb3B0Q0YsIENGU3RyaW5n
Q3JlYXRlV2l0aENTdHJpbmcoa0NGQWxsb2NhdG9yRGVmYXVsdCwgZGF0YSwga0NGU3RyaW5nRW5j
b2RpbmdBU0NJSSkpOwogICAgICAgICAgICAgaWYgKHVybEZyb21QYXRoKHBhdGhBc0NGU3RyaW5n
LmdldCgpLCB1cmwpKSB7CiAgICAgICAgICAgICAgICAgaWYgKHRpdGxlKQogICAgICAgICAgICAg
ICAgICAgICAqdGl0bGUgPSB1cmw7CiAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7CiAg
ICAgICAgICAgICB9CisjZW5kaWYKICAgICAgICAgfQogICAgICAgICBHbG9iYWxVbmxvY2soc3Rv
cmUuaEdsb2JhbCk7ICAgICAgCiAgICAgICAgIFJlbGVhc2VTdGdNZWRpdW0oJnN0b3JlKTsKSW5k
ZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZVdpbi5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlV2luLmNwcAkocmV2aXNpb24gMjk3MjYpCisr
KyBXZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFnSW1hZ2VXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0zMSw3ICszMSw5IEBACiAjaW5jbHVkZSAiSW1hZ2UuaCIKICNpbmNsdWRlICJSZXRhaW5QdHIu
aCIKIAorI2lmIFBMQVRGT1JNKENHKQogI2luY2x1ZGUgPENvcmVHcmFwaGljcy9Db3JlR3JhcGhp
Y3MuaD4KKyNlbmRpZgogCiAjaW5jbHVkZSA8d2luZG93cy5oPgogCkBAIC01Miw2ICs1NCw3IEBA
IHZvaWQgZGVsZXRlRHJhZ0ltYWdlKERyYWdJbWFnZVJlZiBpbWFnZSkKICAgICAgICAgOjpEZWxl
dGVPYmplY3QoaW1hZ2UpOwogfQogCisjaWYgUExBVEZPUk0oQ0cpCiBIQklUTUFQIGFsbG9jSW1h
Z2UoSERDIGRjLCBJbnRTaXplIHNpemUsIENHQ29udGV4dFJlZiAqdGFyZ2V0UmVmKQogewogICAg
IEhCSVRNQVAgaGJtcDsKQEAgLTk0LDkgKzk3LDExIEBAIHN0YXRpYyBDR0NvbnRleHRSZWYgY3Jl
YXRlQ2dDb250ZXh0RnJvbUIKICAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKGRldmljZVJHQik7CiAg
ICAgcmV0dXJuIGJpdG1hcENvbnRleHQ7CiB9CisjZW5kaWYKIAogRHJhZ0ltYWdlUmVmIHNjYWxl
RHJhZ0ltYWdlKERyYWdJbWFnZVJlZiBpbWFnZSwgRmxvYXRTaXplIHNjYWxlKQogeworI2lmIFBM
QVRGT1JNKENHKQogICAgIC8vIEZJWE1FOiBkdWUgdG8gdGhlIHdheSBkcmFnIGltYWdlcyBhcmUg
ZG9uZSBvbiB3aW5kb3dzIHdlIG5lZWQgCiAgICAgLy8gdG8gcHJlcHJvY2VzcyB0aGUgYWxwaGEg
Y2hhbm5lbCA8cmRhcjovL3Byb2JsZW0vNTAxNTk0Nj4KIApAQCAtMTM3LDYgKzE0Miw3IEBAIGV4
aXQ6CiAgICAgICAgIERlbGV0ZURDKGRzdERDKTsKICAgICBSZWxlYXNlREMoMCwgZGMpOwogICAg
IHJldHVybiBoYm1wOworI2VuZGlmCiB9CiAgICAgCiBEcmFnSW1hZ2VSZWYgZGlzc29sdmVEcmFn
SW1hZ2VUb0ZyYWN0aW9uKERyYWdJbWFnZVJlZiBpbWFnZSwgZmxvYXQpCkBAIC0xNDYsNyArMTUy
LDggQEAgRHJhZ0ltYWdlUmVmIGRpc3NvbHZlRHJhZ0ltYWdlVG9GcmFjdGlvbgogfQogICAgICAg
ICAKIERyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2UoSW1hZ2UqIGltZykKLXsg
ICAgCit7CisjaWYgUExBVEZPUk0oQ0cpCQogICAgIEhCSVRNQVAgaGJtcCA9IDA7CiAgICAgSERD
IGRjID0gR2V0REMoMCk7CiAgICAgSERDIHdvcmtpbmdEQyA9IENyZWF0ZUNvbXBhdGlibGVEQyhk
Yyk7CkBAIC0xODIsNiArMTg5LDcgQEAgZXhpdDoKICAgICAgICAgRGVsZXRlREMod29ya2luZ0RD
KTsKICAgICBSZWxlYXNlREMoMCwgZGMpOwogICAgIHJldHVybiBoYm1wOworI2VuZGlmCiB9CiAg
ICAgCiBEcmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlSWNvbkZvckNhY2hlZEltYWdlKENhY2hl
ZEltYWdlKikKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luL0ZpbGVTeXN0ZW1XaW4uY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luL0ZpbGVTeXN0ZW1XaW4uY3BwCShyZXZp
c2lvbiAyOTcyNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luL0ZpbGVTeXN0ZW1XaW4uY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0xMjIsMTAgKzEyMiwxMiBAQCBzdGF0aWMgU3RyaW5nIGJ1bmRsZU5h
bWUoKQogICAgIGlmICghaW5pdGlhbGl6ZWQpIHsKICAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVl
OwogCisjaWYgUExBVEZPUk0oQ0YpCiAgICAgICAgIGlmIChDRkJ1bmRsZVJlZiBidW5kbGUgPSBD
RkJ1bmRsZUdldE1haW5CdW5kbGUoKSkKICAgICAgICAgICAgIGlmIChDRlR5cGVSZWYgYnVuZGxl
RXhlY3V0YWJsZSA9IENGQnVuZGxlR2V0VmFsdWVGb3JJbmZvRGljdGlvbmFyeUtleShidW5kbGUs
IGtDRkJ1bmRsZUV4ZWN1dGFibGVLZXkpKQogICAgICAgICAgICAgICAgIGlmIChDRkdldFR5cGVJ
RChidW5kbGVFeGVjdXRhYmxlKSA9PSBDRlN0cmluZ0dldFR5cGVJRCgpKQogICAgICAgICAgICAg
ICAgICAgICBuYW1lID0gcmVpbnRlcnByZXRfY2FzdDxDRlN0cmluZ1JlZj4oYnVuZGxlRXhlY3V0
YWJsZSk7CisjZW5kaWYKICAgICB9CiAKICAgICByZXR1cm4gbmFtZTsKSW5kZXg6IFdlYkNvcmUv
cGxhdGZvcm0vd2luL1NlYXJjaFBvcHVwTWVudVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9wbGF0Zm9ybS93aW4vU2VhcmNoUG9wdXBNZW51V2luLmNwcAkocmV2aXNpb24gMjk3MjYpCisr
KyBXZWJDb3JlL3BsYXRmb3JtL3dpbi9TZWFyY2hQb3B1cE1lbnVXaW4uY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0zNSwxNyArMzUsMjAgQEAgYm9vbCBTZWFyY2hQb3B1cE1lbnU6OmVuYWJsZWQoKQog
ICAgIHJldHVybiB0cnVlOwogfQogCisjaWYgUExBVEZPUk0oQ0YpCiBzdGF0aWMgUmV0YWluUHRy
PENGU3RyaW5nUmVmPiBhdXRvc2F2ZUtleShjb25zdCBTdHJpbmcmIG5hbWUpCiB7CiAgICAgU3Ry
aW5nIGtleSA9ICJjb20uYXBwbGUuV2ViS2l0LnNlYXJjaEZpZWxkOiIgKyBuYW1lOwogICAgIHJl
dHVybiBSZXRhaW5QdHI8Q0ZTdHJpbmdSZWY+KEFkb3B0Q0YsIGtleS5jcmVhdGVDRlN0cmluZygp
KTsKIH0KKyNlbmRpZgogCiB2b2lkIFNlYXJjaFBvcHVwTWVudTo6c2F2ZVJlY2VudFNlYXJjaGVz
KGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSwgY29uc3QgVmVjdG9yPFN0cmluZz4mIHNlYXJjaEl0
ZW1zKQogewogICAgIGlmIChuYW1lLmlzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuOwogCisjaWYg
UExBVEZPUk0oQ0YpCiAgICAgUmV0YWluUHRyPENGTXV0YWJsZUFycmF5UmVmPiBpdGVtczsKIAog
ICAgIHNpemVfdCBzaXplID0gc2VhcmNoSXRlbXMuc2l6ZSgpOwpAQCAtNTksNiArNjIsNyBAQCB2
b2lkIFNlYXJjaFBvcHVwTWVudTo6c2F2ZVJlY2VudFNlYXJjaGVzCiAKICAgICBDRlByZWZlcmVu
Y2VzU2V0QXBwVmFsdWUoYXV0b3NhdmVLZXkobmFtZSkuZ2V0KCksIGl0ZW1zLmdldCgpLCBrQ0ZQ
cmVmZXJlbmNlc0N1cnJlbnRBcHBsaWNhdGlvbik7CiAgICAgQ0ZQcmVmZXJlbmNlc0FwcFN5bmNo
cm9uaXplKGtDRlByZWZlcmVuY2VzQ3VycmVudEFwcGxpY2F0aW9uKTsKKyNlbmRpZgogfQogCiB2
b2lkIFNlYXJjaFBvcHVwTWVudTo6bG9hZFJlY2VudFNlYXJjaGVzKGNvbnN0IEF0b21pY1N0cmlu
ZyYgbmFtZSwgVmVjdG9yPFN0cmluZz4mIHNlYXJjaEl0ZW1zKQpAQCAtNjYsNiArNzAsNyBAQCB2
b2lkIFNlYXJjaFBvcHVwTWVudTo6bG9hZFJlY2VudFNlYXJjaGVzCiAgICAgaWYgKG5hbWUuaXNF
bXB0eSgpKQogICAgICAgICByZXR1cm47CiAKKyNpZiBQTEFURk9STShDRikKICAgICBzZWFyY2hJ
dGVtcy5jbGVhcigpOwogICAgIFJldGFpblB0cjxDRkFycmF5UmVmPiBpdGVtcyhBZG9wdENGLCBy
ZWludGVycHJldF9jYXN0PENGQXJyYXlSZWY+KENGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUoYXV0
b3NhdmVLZXkobmFtZSkuZ2V0KCksIGtDRlByZWZlcmVuY2VzQ3VycmVudEFwcGxpY2F0aW9uKSkp
OwogCkBAIC03OCw2ICs4Myw3IEBAIHZvaWQgU2VhcmNoUG9wdXBNZW51Ojpsb2FkUmVjZW50U2Vh
cmNoZXMKICAgICAgICAgaWYgKENGR2V0VHlwZUlEKGl0ZW0pID09IENGU3RyaW5nR2V0VHlwZUlE
KCkpCiAgICAgICAgICAgICBzZWFyY2hJdGVtcy5hcHBlbmQoaXRlbSk7CiAgICAgfQorI2VuZGlm
CiB9CiAKIH0K
</data>
<flag name="review"
          id="8148"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>18731</attachid>
            <date>2008-01-27 20:18:20 -0800</date>
            <delta_ts>2008-01-28 12:17:56 -0800</delta_ts>
            <desc>Third revision based on Darin and Alp&apos;s comments.</desc>
            <filename>webcore-win32.patch</filename>
            <type>text/plain</type>
            <size>103529</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyOTgyNSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNzkgQEAKKzIwMDgtMDEtMjcgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBnbWFp
bC5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
V0FSTklORzogTk8gVEVTVCBDQVNFUyBBRERFRCBPUiBDSEFOR0VECisKKyAgICAgICAgRmlyc3Qg
c3RlcCB0byByZWVuYWJsaW5nIENhaXJvIHN1cHBvcnQgdW5kZXIgV2luZG93cy4KKyAgICAgICAg
LSBhZGRzIHZhcmlvdXMgUExBVEZPUk0gZ3VhcmRzIHRvIGNvZGUgdGhhdCB3aWxsIG5vdCBidWls
ZAorICAgICAgICAgIHVuZGVyIENhaXJvLgorICAgICAgICAtIGJyZWFrcyBzb21lIGZpbGVzIGlu
dG8gQ0cgYW5kIENhaXJvLXNwZWNpZmljIGltcGxlbWVudGF0aW9ucy4KKyAgICAgICAgLSBwcm92
aWRlcyBzb21lIHdpbjMyL0NhaXJvIHN1cHBvcnQgKGJ1dCBieSBubyBtZWFucyBhIGNvbXBsZXRl
CisgICAgICAgICAgcG9ydCAoeWV0KS4KKworICAgICAgICAqIENoYW5nZUxvZzoKKyAgICAgICAg
KiBXZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvajoKKyAgICAgICAgKiBicmlkZ2Uvd2luL0Zy
YW1lQ0dXaW4uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OmRyYXdSZWN0SW50b0NvbnRl
eHQpOgorICAgICAgICAoV2ViQ29yZTo6aW1hZ2VGcm9tU2VsZWN0aW9uKToKKyAgICAgICAgKiBi
cmlkZ2Uvd2luL0ZyYW1lQ2Fpcm9XaW4uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6Omlt
YWdlRnJvbVNlbGVjdGlvbik6CisgICAgICAgICogYnJpZGdlL3dpbi9GcmFtZVdpbi5jcHA6Cisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuaDoKKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENHV2luLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJD
b3JlOjpGb250OjpkcmF3R2x5cGhzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4v
Rm9udENhaXJvV2luLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpGb250OjpkcmF3R2x5
cGhzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udFdpbi5jcHA6CisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENHV2luLmNwcDogQWRk
ZWQuCisgICAgICAgIChXZWJDb3JlOjpDR0NvbnRleHRXaXRoSERDKToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzQ29udGV4dDo6Z2V0V2luZG93c0NvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6
R3JhcGhpY3NDb250ZXh0OjpyZWxlYXNlV2luZG93c0NvbnRleHQpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpjb25jYXRDVE0pOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpkcmF3Rm9jdXNSaW5nKToKKyAgICAgICAgKFdlYkNv
cmU6OnNldENHU3Ryb2tlQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6c3BlbGxpbmdQYXR0ZXJu
Q29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6Z3JhbW1hclBhdHRlcm5Db2xvcik6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yTWlzc3BlbGxpbmdPckJhZEdy
YW1tYXIpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRD
YWlyb1dpbi5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpH
cmFwaGljc0NvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpnZXRX
aW5kb3dzQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmluVHJh
bnNwYXJlbmN5TGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpyZWxl
YXNlV2luZG93c0NvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0UGxh
dGZvcm1Qcml2YXRlOjpjb25jYXRDVE0pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250
ZXh0OjpkcmF3Rm9jdXNSaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6
ZHJhd0xpbmVGb3JNaXNzcGVsbGluZ09yQmFkR3JhbW1hcik6CisgICAgICAgICogcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dFdpbi5jcHA6CisgICAgICAgICogcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL0ltYWdlQ0dXaW4uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkJp
dG1hcEltYWdlOjpnZXRIQklUTUFQT2ZTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcElt
YWdlOjpkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUpOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL3dpbi9JbWFnZUNhaXJvV2luLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpC
aXRtYXBJbWFnZTo6Z2V0SEJJVE1BUE9mU2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpCaXRtYXBJ
bWFnZTo6ZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXplKToKKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy93aW4vSW1hZ2VXaW4uY3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bi9TaW1wbGVGb250RGF0YUNHV2luLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpzY2Fs
ZUVtVG9Vbml0cyk6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1J
bml0KToKKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3kp
OgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnBsYXRmb3JtV2lkdGhGb3JHbHlw
aCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ2Fpcm9X
aW4uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0Zm9y
bUluaXQpOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnBsYXRmb3JtRGVzdHJv
eSk6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZvckds
eXBoKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERhdGFXaW4u
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OmdldFNob3VsZEFwcGx5TWFj
QXNjZW50SGFjayk6CisgICAgICAgICogcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNHV2luLmNwcDog
QWRkZWQuCisgICAgICAgIChXZWJDb3JlOjphbGxvY0ltYWdlKToKKyAgICAgICAgKFdlYkNvcmU6
OmNyZWF0ZUNnQ29udGV4dEZyb21CaXRtYXApOgorICAgICAgICAoV2ViQ29yZTo6c2NhbGVEcmFn
SW1hZ2UpOgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRlRHJhZ0ltYWdlRnJvbUltYWdlKToKKyAg
ICAgICAgKiBwbGF0Zm9ybS93aW4vRHJhZ0ltYWdlQ2Fpcm9XaW4uY3BwOiBBZGRlZC4KKyAgICAg
ICAgKFdlYkNvcmU6OnNjYWxlRHJhZ0ltYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OmNyZWF0ZURy
YWdJbWFnZUZyb21JbWFnZSk6CisgICAgICAgICogcGxhdGZvcm0vd2luL0RyYWdJbWFnZVdpbi5j
cHA6CisKKwogMjAwOC0wMS0yNyAgQWxwIFRva2VyICA8YWxwQGF0b2tlci5jb20+CiAKICAgICAg
ICAgUmV2aWV3ZWQgYnkgTWFyayBSb3dlLgpJbmRleDogV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9X
ZWJDb3JlLnZjcHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNv
cmUudmNwcm9qCShyZXZpc2lvbiAyOTcyNikKKysrIFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2Vi
Q29yZS52Y3Byb2oJKHdvcmtpbmcgY29weSkKQEAgLTM0MTgsNiArMzQxOCwxMCBAQAogCQkJCQk+
DQogCQkJCTwvRmlsZT4NCiAJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZv
cm1cd2luXERyYWdJbWFnZUNHV2luLmNwcCINCisJCQkJCT4NCisJCQkJPC9GaWxlPg0KKwkJCQk8
RmlsZQ0KIAkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVx3aW5cRHJhZ0ltYWdlV2luLmNw
cCINCiAJCQkJCT4NCiAJCQkJPC9GaWxlPg0KQEAgLTM4NzYsNiArMzg4MCwxMCBAQAogCQkJCQkJ
Pg0KIAkJCQkJPC9GaWxlPg0KIAkJCQkJPEZpbGUNCisJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBs
YXRmb3JtXGdyYXBoaWNzXHdpblxGb250Q0dXaW4uY3BwIg0KKwkJCQkJCT4NCisJCQkJCTwvRmls
ZT4NCisJCQkJCTxGaWxlDQogCQkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGlj
c1x3aW5cRm9udEN1c3RvbVBsYXRmb3JtRGF0YS5jcHAiDQogCQkJCQkJPg0KIAkJCQkJPC9GaWxl
Pg0KQEAgLTM5MzIsNiArMzk0MCwxMCBAQAogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KIAkJCQkJ
PEZpbGUNCisJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxHcmFw
aGljc0NvbnRleHRDR1dpbi5jcHAiDQorCQkJCQkJPg0KKwkJCQkJPC9GaWxlPg0KKwkJCQkJPEZp
bGUNCiAJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxHcmFwaGlj
c0NvbnRleHRXaW4uY3BwIg0KIAkJCQkJCT4NCiAJCQkJCTwvRmlsZT4NCkBAIC0zOTQwLDYgKzM5
NTIsMTAgQEAKIAkJCQkJCT4NCiAJCQkJCTwvRmlsZT4NCiAJCQkJCTxGaWxlDQorCQkJCQkJUmVs
YXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1x3aW5cSW1hZ2VDR1dpbi5jcHAiDQorCQkJ
CQkJPg0KKwkJCQkJPC9GaWxlPg0KKwkJCQkJPEZpbGUNCiAJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4u
XHBsYXRmb3JtXGdyYXBoaWNzXHdpblxJbWFnZVdpbi5jcHAiDQogCQkJCQkJPg0KIAkJCQkJPC9G
aWxlPg0KQEAgLTM5NjQsNiArMzk4MCwxMCBAQAogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KIAkJ
CQkJPEZpbGUNCisJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxT
aW1wbGVGb250RGF0YUNHV2luLmNwcCINCisJCQkJCQk+DQorCQkJCQk8L0ZpbGU+DQorCQkJCQk8
RmlsZQ0KIAkJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cZ3JhcGhpY3Ncd2luXFNpbXBs
ZUZvbnREYXRhV2luLmNwcCINCiAJCQkJCQk+DQogCQkJCQk8L0ZpbGU+DQpAQCAtNjQwOCw2ICs2
NDI4LDEwIEBACiAJCQkJTmFtZT0id2luIg0KIAkJCQk+DQogCQkJCTxGaWxlDQorCQkJCQlSZWxh
dGl2ZVBhdGg9Ii4uXGJyaWRnZVx3aW5cRnJhbWVDR1dpbi5jcHAiDQorCQkJCQk+DQorCQkJCTwv
RmlsZT4NCisJCQkJPEZpbGUNCiAJCQkJCVJlbGF0aXZlUGF0aD0iLi5cYnJpZGdlXHdpblxGcmFt
ZVdpbi5jcHAiDQogCQkJCQk+DQogCQkJCTwvRmlsZT4NCkluZGV4OiBXZWJDb3JlL2JyaWRnZS93
aW4vRnJhbWVDR1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1l
Q0dXaW4uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lQ0dXaW4u
Y3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZyYW1lV2luLmgiCisKKyNpbmNsdWRlIDx3
aW5zb2NrMi5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2luY2x1ZGUgIkZsb2F0UmVjdC5o
IgorI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRnJhbWVMb2FkZXIuaCIKKyNpbmNs
dWRlICJGcmFtZUxvYWRSZXF1ZXN0LmgiCisjaW5jbHVkZSAiRnJhbWVQcml2YXRlLmgiCisjaW5j
bHVkZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiS2V5Ym9hcmRFdmVudC5oIgorI2luY2x1ZGUg
Ik5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGFnZS5oIgorI2luY2x1ZGUgIlJlbmRlckZy
YW1lLmgiCisjaW5jbHVkZSAiUmVuZGVyVmlldy5oIgorI2luY2x1ZGUgIlJlc291cmNlSGFuZGxl
LmgiCisjaW5jbHVkZSAiVGV4dFJlc291cmNlRGVjb2Rlci5oIgorI2luY2x1ZGUgIkdyYXBoaWNz
Q29udGV4dC5oIgorI2luY2x1ZGUgIlNldHRpbmdzLmgiCisKKyNpbmNsdWRlIDxDb3JlR3JhcGhp
Y3MvQ29yZUdyYXBoaWNzLmg+CisKK3VzaW5nIHN0ZDo6bWluOworCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK3N0YXRpYyB2b2lkIGRyYXdSZWN0SW50b0NvbnRleHQoSW50UmVjdCByZWN0LCBGcmFt
ZVZpZXcqIHZpZXcsIEdyYXBoaWNzQ29udGV4dCogZ2MpCit7CisgICAgSW50U2l6ZSBvZmZzZXQg
PSB2aWV3LT5zY3JvbGxPZmZzZXQoKTsKKyAgICByZWN0Lm1vdmUoLW9mZnNldC53aWR0aCgpLCAt
b2Zmc2V0LmhlaWdodCgpKTsKKyAgICByZWN0ID0gdmlldy0+Y29udmVydFRvQ29udGFpbmluZ1dp
bmRvdyhyZWN0KTsKKworICAgIGdjLT5jb25jYXRDVE0oQWZmaW5lVHJhbnNmb3JtKCkudHJhbnNs
YXRlKC1yZWN0LngoKSwgLXJlY3QueSgpKSk7CisKKyAgICB2aWV3LT5wYWludChnYywgcmVjdCk7
Cit9CisKK0hCSVRNQVAgaW1hZ2VGcm9tU2VsZWN0aW9uKEZyYW1lKiBmcmFtZSwgYm9vbCBmb3Jj
ZUJsYWNrVGV4dCkKK3sKKyAgICBmcmFtZS0+c2V0UGFpbnRSZXN0cmljdGlvbihmb3JjZUJsYWNr
VGV4dCA/IFBhaW50UmVzdHJpY3Rpb25TZWxlY3Rpb25Pbmx5QmxhY2tUZXh0IDogUGFpbnRSZXN0
cmljdGlvblNlbGVjdGlvbk9ubHkpOworICAgIEZsb2F0UmVjdCBmciA9IGZyYW1lLT5zZWxlY3Rp
b25SZWN0KCk7CisgICAgSW50UmVjdCBpcigoaW50KWZyLngoKSwgKGludClmci55KCksKGludClm
ci53aWR0aCgpLChpbnQpZnIuaGVpZ2h0KCkpOworCisgICAgdm9pZCogYml0czsKKyAgICBIREMg
aGRjID0gQ3JlYXRlQ29tcGF0aWJsZURDKDApOworICAgIGludCB3ID0gaXIud2lkdGgoKTsKKyAg
ICBpbnQgaCA9IGlyLmhlaWdodCgpOworICAgIEJJVE1BUElORk8gYm1wID0geyB7IHNpemVvZihC
SVRNQVBJTkZPSEVBREVSKSwgdywgaCwgMSwgMzIgfSB9OworCisgICAgSEJJVE1BUCBoYm1wID0g
Q3JlYXRlRElCU2VjdGlvbigwLCAmYm1wLCBESUJfUkdCX0NPTE9SUywgKHZvaWQqKikmYml0cywg
MCwgMCk7CisgICAgSEJJVE1BUCBoYm1wT2xkID0gKEhCSVRNQVApU2VsZWN0T2JqZWN0KGhkYywg
aGJtcCk7CisgICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0
ZURldmljZVJHQigpOworICAgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0
Q3JlYXRlKCh2b2lkKiliaXRzLCB3LCBoLAorICAgICAgICA4LCB3ICogc2l6ZW9mKFJHQlFVQUQp
LCBkZXZpY2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwga0NHSW1hZ2VBbHBoYVBy
ZW11bHRpcGxpZWRGaXJzdCk7CisgICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOwor
ICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7CisKKyAgICBHcmFwaGljc0NvbnRleHQg
Z2MoY29udGV4dCk7CisKKyAgICBmcmFtZS0+ZG9jdW1lbnQoKS0+dXBkYXRlTGF5b3V0KCk7Cisg
ICAgZHJhd1JlY3RJbnRvQ29udGV4dChpciwgZnJhbWUtPnZpZXcoKSwgJmdjKTsKKworICAgIENH
Q29udGV4dFJlbGVhc2UoY29udGV4dCk7CisgICAgU2VsZWN0T2JqZWN0KGhkYywgaGJtcE9sZCk7
CisgICAgRGVsZXRlREMoaGRjKTsKKworICAgIGZyYW1lLT5zZXRQYWludFJlc3RyaWN0aW9uKFBh
aW50UmVzdHJpY3Rpb25Ob25lKTsKKworICAgIHJldHVybiBoYm1wOworfQorCit9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBXZWJDb3JlL2JyaWRnZS93aW4vRnJh
bWVDR1dpbi5jcHAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fXwpOYW1lOiBzdm46ZXhlY3V0YWJsZQogICArICoKCkluZGV4
OiBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVDYWlyb1dpbi5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9icmlkZ2Uvd2luL0ZyYW1lQ2Fpcm9XaW4uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29y
ZS9icmlkZ2Uvd2luL0ZyYW1lQ2Fpcm9XaW4uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDU4
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IkZyYW1lV2luLmgiCisKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI2luY2x1ZGUgPHdpbmRvd3Mu
aD4KKworI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5j
bHVkZSAiRnJhbWVMb2FkZXIuaCIKKyNpbmNsdWRlICJGcmFtZUxvYWRSZXF1ZXN0LmgiCisjaW5j
bHVkZSAiRnJhbWVQcml2YXRlLmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVkZSAi
S2V5Ym9hcmRFdmVudC5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAi
UGFnZS5oIgorI2luY2x1ZGUgIlJlbmRlckZyYW1lLmgiCisjaW5jbHVkZSAiUmVuZGVyVGFibGVD
ZWxsLmgiCisjaW5jbHVkZSAiUmVuZGVyVmlldy5oIgorI2luY2x1ZGUgIlJlc291cmNlSGFuZGxl
LmgiCisjaW5jbHVkZSAiVGV4dFJlc291cmNlRGVjb2Rlci5oIgorI2luY2x1ZGUgIkdyYXBoaWNz
Q29udGV4dC5oIgorI2luY2x1ZGUgIlNldHRpbmdzLmgiCisKK3VzaW5nIHN0ZDo6bWluOworCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK0hCSVRNQVAgaW1hZ2VGcm9tU2VsZWN0aW9uKEZyYW1lKiBm
cmFtZSwgYm9vbCBmb3JjZUJsYWNrVGV4dCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQor
Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBXZWJDb3JlL2Jy
aWRnZS93aW4vRnJhbWVDYWlyb1dpbi5jcHAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpOYW1lOiBzdm46ZXhlY3V0YWJs
ZQogICArICoKCkluZGV4OiBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVXaW4uY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZVdpbi5jcHAJKHJldmlzaW9uIDI5NzI2KQor
KysgV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1
ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cwpAQCAtNjAsMTAgKzYwLDYgQEAKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNpbmNs
dWRlICJTZXR0aW5ncy5oIgogCi0jaWYgUExBVEZPUk0oQ0cpCi0jaW5jbHVkZSA8Q29yZUdyYXBo
aWNzL0NvcmVHcmFwaGljcy5oPgotI2VuZGlmCi0KIHVzaW5nIHN0ZDo6bWluOwogdXNpbmcgbmFt
ZXNwYWNlIEtKUzo6QmluZGluZ3M7CiAKQEAgLTg0LDcgKzgwLDYgQEAgS0pTOjpCaW5kaW5nczo6
SW5zdGFuY2UqIEZyYW1lOjpjcmVhdGVTYwogICAgIHJldHVybiBzdGF0aWNfY2FzdDxQbHVnaW5W
aWV3V2luKj4od2lkZ2V0KS0+YmluZGluZ0luc3RhbmNlKCk7CiB9CiAKLQogdm9pZCBjb21wdXRl
UGFnZVJlY3RzRm9yRnJhbWUoRnJhbWUqIGZyYW1lLCBjb25zdCBJbnRSZWN0JiBwcmludFJlY3Qs
IGZsb2F0IGhlYWRlckhlaWdodCwgZmxvYXQgZm9vdGVySGVpZ2h0LCBmbG9hdCB1c2VyU2NhbGVG
YWN0b3IsVmVjdG9yPEludFJlY3Q+JiBwYWdlcywgaW50JiBvdXRQYWdlSGVpZ2h0KQogewogICAg
IEFTU0VSVChmcmFtZSk7CkBAIC0xMzcsNTEgKzEzMiw2IEBAIHZvaWQgY29tcHV0ZVBhZ2VSZWN0
c0ZvckZyYW1lKEZyYW1lKiBmcmEKICAgICB9IHdoaWxlIChwcmludGVkUGFnZXNIZWlnaHQgPCBk
b2NIZWlnaHQpOwogfQogCi1zdGF0aWMgdm9pZCBkcmF3UmVjdEludG9Db250ZXh0KEludFJlY3Qg
cmVjdCwgRnJhbWVWaWV3KiB2aWV3LCBHcmFwaGljc0NvbnRleHQqIGdjKQotewotICAgIEludFNp
emUgb2Zmc2V0ID0gdmlldy0+c2Nyb2xsT2Zmc2V0KCk7Ci0gICAgcmVjdC5tb3ZlKC1vZmZzZXQu
d2lkdGgoKSwgLW9mZnNldC5oZWlnaHQoKSk7Ci0gICAgcmVjdCA9IHZpZXctPmNvbnZlcnRUb0Nv
bnRhaW5pbmdXaW5kb3cocmVjdCk7Ci0KLSAgICBnYy0+Y29uY2F0Q1RNKEFmZmluZVRyYW5zZm9y
bSgpLnRyYW5zbGF0ZSgtcmVjdC54KCksIC1yZWN0LnkoKSkpOwotCi0gICAgdmlldy0+cGFpbnQo
Z2MsIHJlY3QpOwotfQotCi1IQklUTUFQIGltYWdlRnJvbVNlbGVjdGlvbihGcmFtZSogZnJhbWUs
IGJvb2wgZm9yY2VCbGFja1RleHQpCi17Ci0gICAgZnJhbWUtPnNldFBhaW50UmVzdHJpY3Rpb24o
Zm9yY2VCbGFja1RleHQgPyBQYWludFJlc3RyaWN0aW9uU2VsZWN0aW9uT25seUJsYWNrVGV4dCA6
IFBhaW50UmVzdHJpY3Rpb25TZWxlY3Rpb25Pbmx5KTsKLSAgICBGbG9hdFJlY3QgZnIgPSBmcmFt
ZS0+c2VsZWN0aW9uUmVjdCgpOwotICAgIEludFJlY3QgaXIoKGludClmci54KCksIChpbnQpZnIu
eSgpLChpbnQpZnIud2lkdGgoKSwoaW50KWZyLmhlaWdodCgpKTsKLQotICAgIHZvaWQqIGJpdHM7
Ci0gICAgSERDIGhkYyA9IENyZWF0ZUNvbXBhdGlibGVEQygwKTsKLSAgICBpbnQgdyA9IGlyLndp
ZHRoKCk7Ci0gICAgaW50IGggPSBpci5oZWlnaHQoKTsKLSAgICBCSVRNQVBJTkZPIGJtcCA9IHsg
eyBzaXplb2YoQklUTUFQSU5GT0hFQURFUiksIHcsIGgsIDEsIDMyIH0gfTsKLQotICAgIEhCSVRN
QVAgaGJtcCA9IENyZWF0ZURJQlNlY3Rpb24oMCwgJmJtcCwgRElCX1JHQl9DT0xPUlMsICh2b2lk
KiopJmJpdHMsIDAsIDApOwotICAgIEhCSVRNQVAgaGJtcE9sZCA9IChIQklUTUFQKVNlbGVjdE9i
amVjdChoZGMsIGhibXApOwotICAgIENHQ29sb3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9y
U3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKLSAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IENHQml0
bWFwQ29udGV4dENyZWF0ZSgodm9pZCopYml0cywgdywgaCwKLSAgICAgICAgOCwgdyAqIHNpemVv
ZihSR0JRVUFEKSwgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IGtDR0lt
YWdlQWxwaGFQcmVtdWx0aXBsaWVkRmlyc3QpOwotICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2
aWNlUkdCKTsKLSAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQpOwotCi0gICAgR3JhcGhp
Y3NDb250ZXh0IGdjKGNvbnRleHQpOwotCi0gICAgZnJhbWUtPmRvY3VtZW50KCktPnVwZGF0ZUxh
eW91dCgpOwotICAgIGRyYXdSZWN0SW50b0NvbnRleHQoaXIsIGZyYW1lLT52aWV3KCksICZnYyk7
Ci0KLSAgICBDR0NvbnRleHRSZWxlYXNlKGNvbnRleHQpOwotICAgIFNlbGVjdE9iamVjdChoZGMs
IGhibXBPbGQpOwotICAgIERlbGV0ZURDKGhkYyk7Ci0KLSAgICBmcmFtZS0+c2V0UGFpbnRSZXN0
cmljdGlvbihQYWludFJlc3RyaWN0aW9uTm9uZSk7Ci0KLSAgICByZXR1cm4gaGJtcDsKLX0KLQog
RHJhZ0ltYWdlUmVmIEZyYW1lOjpkcmFnSW1hZ2VGb3JTZWxlY3Rpb24oKQogeyAgICAKICAgICBp
ZiAoc2VsZWN0aW9uQ29udHJvbGxlcigpLT5pc1JhbmdlKCkpCkluZGV4OiBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5oCShyZXZpc2lvbiAyOTcyNikKKysrIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuaAkod29ya2luZyBjb3B5KQpAQCAt
MTAzLDYgKzEwMyw3IEBAIHB1YmxpYzoKICAgICBTQ1JJUFRfQ0FDSEUqIHNjcmlwdENhY2hlKCkg
Y29uc3QgeyByZXR1cm4gJm1fc2NyaXB0Q2FjaGU7IH0KIAogICAgIHN0YXRpYyB2b2lkIHNldFNo
b3VsZEFwcGx5TWFjQXNjZW50SGFjayhib29sKTsKKyAgICBzdGF0aWMgYm9vbCBnZXRTaG91bGRB
cHBseU1hY0FzY2VudEhhY2soKTsKICNlbmRpZgogCiAjaWYgUExBVEZPUk0oR1RLKQpJbmRleDog
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENHV2luLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250Q0dXaW4uY3BwCShyZXZpc2lvbiAw
KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENHV2luLmNwcAkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcs
IDIwMDggQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkZvbnQuaCIKKworI2luY2x1ZGUgIkZvbnRGYWxsYmFja0xp
c3QuaCIKKyNpbmNsdWRlICJHbHlwaEJ1ZmZlci5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4
dC5oIgorI2luY2x1ZGUgIkludFJlY3QuaCIKKyNpbmNsdWRlICJTaW1wbGVGb250RGF0YS5oIgor
I2luY2x1ZGUgIlVuaXNjcmliZUNvbnRyb2xsZXIuaCIKKyNpbmNsdWRlIDxBcHBsaWNhdGlvblNl
cnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KKyNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRl
cmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMu
aD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjb25zdCBpbnQgc3ludGhldGljT2JsaXF1ZUFu
Z2xlID0gMTQ7CisKK3ZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQqIGdyYXBo
aWNzQ29udGV4dCwgY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnQsIGNvbnN0IEdseXBoQnVmZmVy
JiBnbHlwaEJ1ZmZlciwgCisgICAgICAgICAgICAgICAgICAgICAgaW50IGZyb20sIGludCBudW1H
bHlwaHMsIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KSBjb25zdAoreworICAgIGlmIChmb250LT5t
X2ZvbnQudXNlR0RJKCkpIHsKKyAgICAgICAgLy8gRklYTUU6IFN1cHBvcnQgYWxwaGEgYmxlbmRp
bmcuCisgICAgICAgIC8vIEZJWE1FOiBTdXBwb3J0IHRleHQgc3Ryb2tlL2ZpbGwuCisgICAgICAg
IC8vIEZJWE1FOiBTdXBwb3J0IHRleHQgc2hhZG93LgorICAgICAgICBDb2xvciBmaWxsQ29sb3Ig
PSBncmFwaGljc0NvbnRleHQtPmZpbGxDb2xvcigpOworICAgICAgICBpZiAoZmlsbENvbG9yLmFs
cGhhKCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBXZSBoYXZlIHRv
IGNvbnZlcnQgQ0cncyB0d28tZGltZW5zaW9uYWwgZmxvYXRpbmcgcG9pbnQgYWR2YW5jZXMgdG8g
anVzdCBob3Jpem9udGFsIGludGVnZXIgYWR2YW5jZXMuCisgICAgICAgIFZlY3RvcjxpbnQsIDIw
NDg+IGdkaUFkdmFuY2VzOworICAgICAgICBpbnQgdG90YWxXaWR0aCA9IDA7CisgICAgICAgIGZv
ciAoaW50IGkgPSAwOyBpIDwgbnVtR2x5cGhzOyBpKyspIHsKKyAgICAgICAgICAgIGdkaUFkdmFu
Y2VzLmFwcGVuZChscm91bmRmKGdseXBoQnVmZmVyLmFkdmFuY2VBdChmcm9tICsgaSkpKTsKKyAg
ICAgICAgICAgIHRvdGFsV2lkdGggKz0gZ2RpQWR2YW5jZXNbaV07CisgICAgICAgIH0KKworICAg
ICAgICAvLyBXZSBwdXQgc2xvcCBpbnRvIHRoaXMgcmVjdCwgc2luY2UgZ2x5cGhzIGNhbiBvdmVy
ZmxvdyB0aGUgYXNjZW50L2Rlc2NlbnQgYm91bmRzIGFuZCB0aGUgbGVmdC9yaWdodCBlZGdlcy4K
KyAgICAgICAgaW50IGxpbmVHYXAgPSBmb250LT5saW5lR2FwKCk7CisgICAgICAgIEludFJlY3Qg
dGV4dFJlY3QocG9pbnQueCgpIC0gbGluZUdhcCwgcG9pbnQueSgpIC0gZm9udC0+YXNjZW50KCkg
LSBsaW5lR2FwLCB0b3RhbFdpZHRoICsgMiAqIGxpbmVHYXAsIGZvbnQtPmxpbmVTcGFjaW5nKCkp
OworICAgICAgICBIREMgaGRjID0gZ3JhcGhpY3NDb250ZXh0LT5nZXRXaW5kb3dzQ29udGV4dCh0
ZXh0UmVjdCk7CisgICAgICAgIFNlbGVjdE9iamVjdChoZGMsIGZvbnQtPm1fZm9udC5oZm9udCgp
KTsKKworICAgICAgICAvLyBTZXQgdGhlIGNvcnJlY3QgY29sb3IuCisgICAgICAgIEhEQyB0ZXh0
RHJhd2luZ0RDID0gaGRjOworICAgICAgICAvKmlmIChmaWxsQ29sb3IuaGFzQWxwaGEoKSB8fCBn
cmFwaGljc0NvbnRleHQtPmluVHJhbnNwYXJlbmN5TGF5ZXIoKSkgeworICAgICAgICAgICAgLy8g
R0RJIGNhbid0IGhhbmRsZSBkcmF3aW5nIHRyYW5zcGFyZW50IHRleHQuICBXZSBoYXZlIHRvIGRy
YXcgaW50byBhIG1hc2suICBXZSBkcmF3IGJsYWNrIHRleHQgb24gYSB3aGl0ZS1maWxsZWQgYmFj
a2dyb3VuZC4KKyAgICAgICAgICAgIC8vIFdlIGFsc28gZG8gdGhpcyB3aGVuIGluc2lkZSB0cmFu
c3BhcmVuY3kgbGF5ZXJzLCBzaW5jZSBHREkgYWxzbyBjYW4ndCBkcmF3IG9udG8gYSBzdXJmYWNl
IHdpdGggYWxwaGEuCisgICAgICAgICAgICBncmFwaGljc0NvbnRleHQtPnNhdmUoKTsKKyAgICAg
ICAgICAgIGdyYXBoaWNzQ29udGV4dC0+c2V0RmlsbENvbG9yKENvbG9yOjp3aGl0ZSk7CisgICAg
ICAgICAgICB0ZXh0RHJhd2luZ0RDID0gZ3JhcGhpY3NDb250ZXh0LT5nZXRXaW5kb3dzQml0bWFw
Q29udGV4dCh0ZXh0UmVjdCk7CisgICAgICAgICAgICBTZXRUZXh0Q29sb3IoaGRjLCBSR0IoMCwg
MCwgMCkpOworICAgICAgICB9IGVsc2UqLworICAgICAgICAgICAgU2V0VGV4dENvbG9yKGhkYywg
UkdCKGZpbGxDb2xvci5yZWQoKSwgZmlsbENvbG9yLmdyZWVuKCksIGZpbGxDb2xvci5ibHVlKCkp
KTsKKworICAgICAgICBTZXRCa01vZGUoaGRjLCBUUkFOU1BBUkVOVCk7CisgICAgICAgIFNldFRl
eHRBbGlnbihoZGMsIFRBX0xFRlQgfCBUQV9CQVNFTElORSk7CisKKyAgICAgICAgLy8gVW5pc2Ny
aWJlIGdpdmVzIHVzIG9mZnNldHMgdG8gaGVscCByZWZpbmUgdGhlIHBvc2l0aW9uaW5nIG9mIGNv
bWJpbmluZyBnbHlwaHMuCisgICAgICAgIEZsb2F0U2l6ZSB0cmFuc2xhdGlvbiA9IGdseXBoQnVm
ZmVyLm9mZnNldEF0KGZyb20pOworICAgICAgICBpZiAodHJhbnNsYXRpb24ud2lkdGgoKSB8fCB0
cmFuc2xhdGlvbi5oZWlnaHQoKSkgeworICAgICAgICAgICAgWEZPUk0geGZvcm07CisgICAgICAg
ICAgICB4Zm9ybS5lTTExID0gMS4wOworICAgICAgICAgICAgeGZvcm0uZU0xMiA9IDA7CisgICAg
ICAgICAgICB4Zm9ybS5lTTIxID0gMDsKKyAgICAgICAgICAgIHhmb3JtLmVNMjIgPSAxLjA7Cisg
ICAgICAgICAgICB4Zm9ybS5lRHggPSB0cmFuc2xhdGlvbi53aWR0aCgpOworICAgICAgICAgICAg
eGZvcm0uZUR5ID0gdHJhbnNsYXRpb24uaGVpZ2h0KCk7CisgICAgICAgICAgICBNb2RpZnlXb3Js
ZFRyYW5zZm9ybShoZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7CisgICAgICAgIH0KKyAg
ICAgICAgRXh0VGV4dE91dChoZGMsIHBvaW50LngoKSwgcG9pbnQueSgpLCBFVE9fR0xZUEhfSU5E
RVgsIDAsIChXQ0hBUiopZ2x5cGhCdWZmZXIuZ2x5cGhzKGZyb20pLCBudW1HbHlwaHMsIGdkaUFk
dmFuY2VzLmRhdGEoKSk7CisKKyAgICAgICAgLyppZiAoZmlsbENvbG9yLmhhc0FscGhhKCkgfHwg
Z3JhcGhpY3NDb250ZXh0LT5pblRyYW5zcGFyZW5jeUxheWVyKCkpIHsKKyAgICAgICAgICAgIC8v
IFRPRE9EOiBXZSBoYXZlIHRvIHdhbGsgdGhlIGJpdHMgb2YgdGhlIGJpdG1hcCBhbmQgaW52ZXJ0
IHRoZW0uICBXZSBhbHNvIGNvcHkgb3ZlciB0aGUgZ3JlZW4gY29tcG9uZW50IHZhbHVlIGludG8g
dGhlIGFscGhhIHZhbHVlCisgICAgICAgICAgICAvLyB0byBrZWVwIENsZWFyVHlwZSBsb29raW5n
IHJlYXNvbmFibGUuCisKKyAgICAgICAgICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgZHJhd24gdGhl
IHRleHQgaW50byBhIGJpdG1hcCBhbmQgaW52ZXJ0ZWQgaXQsIG9idGFpbiBhIENHSW1hZ2VSZWYg
bWFzay4KKyAgICAgICAgICAgIENHSW1hZ2VSZWYgbWFzayA9IGdyYXBoaWNzQ29udGV4dC0+cmVs
ZWFzZVdpbmRvd3NCaXRtYXBDb250ZXh0SW50b01hc2sodGV4dERyYXdpbmdEQywgdGV4dFJlY3Qp
OworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBBcHBseSB0aGUgbWFzayB0byB0aGUgZmls
bCBjb2xvci4KKyAgICAgICAgICAgIENHQ29udGV4dFJlZiBiaXRtYXBDb250ZXh0ID0gZ3JhcGhp
Y3NDb250ZXh0LT5nZXRXaW5kb3dzQ29tcGF0aWJsZUNHQml0bWFwQ29udGV4dCh0ZXh0UmVjdC5z
aXplKCkpOworICAgICAgICAgICAgQ0dGbG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKKyAg
ICAgICAgICAgIGNvbG9yLmdldFJHQkEocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworICAgICAg
ICAgICAgQ0dDb250ZXh0U2V0UkdCRmlsbENvbG9yKGNvbnRleHQsIHJlZCwgZ3JlZW4sIGJsdWUs
IGFscGhhKTsKKyAgICAgICAgICAgIENHQ29udGV4dEZpbGxSZWN0KGJpdG1hcENvbnRleHQsIElu
dFJlY3QoMCwgMCwgdGV4dFJlY3Qud2lkdGgoKSwgdGV4dFJlY3QuaGVpZ2h0KCkpKTsKKyAgICAg
ICAgICAgIENHSW1hZ2VSZWYgZmlsbENvbG9ySW1hZ2UgPSBDR0JpdG1hcENvbnRleHRDcmVhdGVJ
bWFnZShiaXRtYXBDb250ZXh0KTsKKyAgICAgICAgCisgICAgICAgICAgICAvLyBBcHBseSB0aGUg
bWFzay4KKyAgICAgICAgICAgIENHSW1hZ2VSZWYgZmluYWxJbWFnZSA9IENHSW1hZ2VDcmVhdGVX
aXRoTWFzayhmaWxsQ29sb3JJbWFnZSwgbWFzayk7CisKKyAgICAgICAgICAgIC8vIFRoZSBiaXRt
YXAgaW1hZ2UgbmVlZHMgdG8gYmUgZHJhd24gaW50byB0aGUgSERDLgorICAgICAgICAgICAgZ3Jh
cGhpY3NDb250ZXh0LT5kcmF3SW1hZ2VJbnRvV2luZG93c0NvbnRleHQoaGRjLCBmaW5hbEltYWdl
KTsKKworICAgICAgICAgICAgLy8gUmVsZWFzZSBvdXIgaW1hZ2VzIGFuZCBjb250ZXh0cy4KKyAg
ICAgICAgICAgIENHSW1hZ2VSZWxlYXNlKG1hc2spOworICAgICAgICAgICAgQ0dJbWFnZVJlbGVh
c2UoZmlsbENvbG9ySW1hZ2UpOworICAgICAgICAgICAgQ0dJbWFnZVJlbGVhc2UoZmluYWxJbWFn
ZSk7CisgICAgICAgICAgICBDR0NvbnRleHRSZWxlYXNlKGJpdG1hcENvbnRleHQpOworICAgICAg
ICB9Ki8KKworICAgICAgICBncmFwaGljc0NvbnRleHQtPnJlbGVhc2VXaW5kb3dzQ29udGV4dCho
ZGMsIHRleHRSZWN0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENHQ29udGV4dFJl
ZiBjZ0NvbnRleHQgPSBncmFwaGljc0NvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpOworCisgICAg
dWludDMyX3Qgb2xkRm9udFNtb290aGluZ1N0eWxlID0gd2tTZXRGb250U21vb3RoaW5nU3R5bGUo
Y2dDb250ZXh0KTsKKworICAgIGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIHBsYXRmb3JtRGF0YSA9
IGZvbnQtPnBsYXRmb3JtRGF0YSgpOworCisgICAgQ0dDb250ZXh0U2V0Rm9udChjZ0NvbnRleHQs
IHBsYXRmb3JtRGF0YS5jZ0ZvbnQoKSk7CisKKyAgICBDR0FmZmluZVRyYW5zZm9ybSBtYXRyaXgg
PSBDR0FmZmluZVRyYW5zZm9ybUlkZW50aXR5OworICAgIG1hdHJpeC5iID0gLW1hdHJpeC5iOwor
ICAgIG1hdHJpeC5kID0gLW1hdHJpeC5kOworCisgICAgaWYgKHBsYXRmb3JtRGF0YS5zeW50aGV0
aWNPYmxpcXVlKCkpCisgICAgeworICAgICAgICBzdGF0aWMgZmxvYXQgc2tldyA9IC10YW5mKHN5
bnRoZXRpY09ibGlxdWVBbmdsZSAqIGFjb3NmKDApIC8gOTApOworICAgICAgICBtYXRyaXggPSBD
R0FmZmluZVRyYW5zZm9ybUNvbmNhdChtYXRyaXgsIENHQWZmaW5lVHJhbnNmb3JtTWFrZSgxLCAw
LCBza2V3LCAxLCAwLCAwKSk7CisgICAgfQorCisgICAgLy8gVW5pc2NyaWJlIGdpdmVzIHVzIG9m
ZnNldHMgdG8gaGVscCByZWZpbmUgdGhlIHBvc2l0aW9uaW5nIG9mIGNvbWJpbmluZyBnbHlwaHMu
CisgICAgRmxvYXRTaXplIHRyYW5zbGF0aW9uID0gZ2x5cGhCdWZmZXIub2Zmc2V0QXQoZnJvbSk7
CisgICAgaWYgKHRyYW5zbGF0aW9uLndpZHRoKCkgfHwgdHJhbnNsYXRpb24uaGVpZ2h0KCkpCisg
ICAgICAgIENHQWZmaW5lVHJhbnNmb3JtVHJhbnNsYXRlKG1hdHJpeCwgdHJhbnNsYXRpb24ud2lk
dGgoKSwgdHJhbnNsYXRpb24uaGVpZ2h0KCkpOworICAgIAorICAgIENHQ29udGV4dFNldFRleHRN
YXRyaXgoY2dDb250ZXh0LCBtYXRyaXgpOworCisgICAgQ0dDb250ZXh0U2V0Rm9udFNpemUoY2dD
b250ZXh0LCBwbGF0Zm9ybURhdGEuc2l6ZSgpKTsKKyAgICBDR0NvbnRleHRTZXRUZXh0UG9zaXRp
b24oY2dDb250ZXh0LCBwb2ludC54KCksIHBvaW50LnkoKSk7CisgICAgQ0dDb250ZXh0U2hvd0ds
eXBoc1dpdGhBZHZhbmNlcyhjZ0NvbnRleHQsIGdseXBoQnVmZmVyLmdseXBocyhmcm9tKSwgZ2x5
cGhCdWZmZXIuYWR2YW5jZXMoZnJvbSksIG51bUdseXBocyk7CisgICAgaWYgKGZvbnQtPm1fc3lu
dGhldGljQm9sZE9mZnNldCkgeworICAgICAgICBDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24oY2dD
b250ZXh0LCBwb2ludC54KCkgKyBmb250LT5tX3N5bnRoZXRpY0JvbGRPZmZzZXQsIHBvaW50Lnko
KSk7CisgICAgICAgIENHQ29udGV4dFNob3dHbHlwaHNXaXRoQWR2YW5jZXMoY2dDb250ZXh0LCBn
bHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSksIGdseXBoQnVmZmVyLmFkdmFuY2VzKGZyb20pLCBudW1H
bHlwaHMpOworICAgIH0KKworICAgIHdrUmVzdG9yZUZvbnRTbW9vdGhpbmdTdHlsZShjZ0NvbnRl
eHQsIG9sZEZvbnRTbW9vdGhpbmdTdHlsZSk7Cit9CisKK30KClByb3BlcnR5IGNoYW5nZXMgb246
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDR1dpbi5jcHAKX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpO
YW1lOiBzdm46ZXhlY3V0YWJsZQogICArICoKCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbi9Gb250Q2Fpcm9XaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL0ZvbnRDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250Q2Fpcm9XaW4uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIElu
Yy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJGb250LmgiCisKKyNpbmNsdWRlICJGb250RmFsbGJhY2tMaXN0LmgiCisjaW5jbHVk
ZSAiR2x5cGhCdWZmZXIuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRl
ICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJTaW1w
bGVGb250RGF0YS5oIgorI2luY2x1ZGUgIlVuaXNjcmliZUNvbnRyb2xsZXIuaCIKKyNpbmNsdWRl
IDx3dGYvTWF0aEV4dHJhcy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3ZvaWQgRm9udDo6
ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwgY29uc3QgU2ltcGxl
Rm9udERhdGEqIGZvbnQsIGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZlciwgCisgICAgICAg
ICAgICAgICAgICAgICAgaW50IGZyb20sIGludCBudW1HbHlwaHMsIGNvbnN0IEZsb2F0UG9pbnQm
IHBvaW50KSBjb25zdAoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK30KClByb3BlcnR5
IGNoYW5nZXMgb246IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDYWlyb1dpbi5j
cHAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fXwpOYW1lOiBzdm46ZXhlY3V0YWJsZQogICArICoKCkluZGV4OiBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250V2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250V2luLmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250V2luLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5j
LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAw
OCBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCkBAIC0zMywxMzYgKzMzLDEwIEBACiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQu
aCIKICNpbmNsdWRlICJTaW1wbGVGb250RGF0YS5oIgogI2luY2x1ZGUgIlVuaXNjcmliZUNvbnRy
b2xsZXIuaCIKLSNpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2Vydmlj
ZXMuaD4KLSNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJm
YWNlLmg+CiAjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUg
ewogCi1jb25zdCBpbnQgc3ludGhldGljT2JsaXF1ZUFuZ2xlID0gMTQ7Ci0KLXZvaWQgRm9udDo6
ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwgY29uc3QgU2ltcGxl
Rm9udERhdGEqIGZvbnQsIGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZlciwgCi0gICAgICAg
ICAgICAgICAgICAgICAgaW50IGZyb20sIGludCBudW1HbHlwaHMsIGNvbnN0IEZsb2F0UG9pbnQm
IHBvaW50KSBjb25zdAotewotICAgIGlmIChmb250LT5tX2ZvbnQudXNlR0RJKCkpIHsKLSAgICAg
ICAgLy8gRklYTUU6IFN1cHBvcnQgYWxwaGEgYmxlbmRpbmcuCi0gICAgICAgIC8vIEZJWE1FOiBT
dXBwb3J0IHRleHQgc3Ryb2tlL2ZpbGwuCi0gICAgICAgIC8vIEZJWE1FOiBTdXBwb3J0IHRleHQg
c2hhZG93LgotICAgICAgICBDb2xvciBmaWxsQ29sb3IgPSBncmFwaGljc0NvbnRleHQtPmZpbGxD
b2xvcigpOwotICAgICAgICBpZiAoZmlsbENvbG9yLmFscGhhKCkgPT0gMCkKLSAgICAgICAgICAg
IHJldHVybjsKLQotICAgICAgICAvLyBXZSBoYXZlIHRvIGNvbnZlcnQgQ0cncyB0d28tZGltZW5z
aW9uYWwgZmxvYXRpbmcgcG9pbnQgYWR2YW5jZXMgdG8ganVzdCBob3Jpem9udGFsIGludGVnZXIg
YWR2YW5jZXMuCi0gICAgICAgIFZlY3RvcjxpbnQsIDIwNDg+IGdkaUFkdmFuY2VzOwotICAgICAg
ICBpbnQgdG90YWxXaWR0aCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtR2x5
cGhzOyBpKyspIHsKLSAgICAgICAgICAgIGdkaUFkdmFuY2VzLmFwcGVuZChscm91bmRmKGdseXBo
QnVmZmVyLmFkdmFuY2VBdChmcm9tICsgaSkpKTsKLSAgICAgICAgICAgIHRvdGFsV2lkdGggKz0g
Z2RpQWR2YW5jZXNbaV07Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBwdXQgc2xvcCBpbnRv
IHRoaXMgcmVjdCwgc2luY2UgZ2x5cGhzIGNhbiBvdmVyZmxvdyB0aGUgYXNjZW50L2Rlc2NlbnQg
Ym91bmRzIGFuZCB0aGUgbGVmdC9yaWdodCBlZGdlcy4KLSAgICAgICAgaW50IGxpbmVHYXAgPSBm
b250LT5saW5lR2FwKCk7Ci0gICAgICAgIEludFJlY3QgdGV4dFJlY3QocG9pbnQueCgpIC0gbGlu
ZUdhcCwgcG9pbnQueSgpIC0gZm9udC0+YXNjZW50KCkgLSBsaW5lR2FwLCB0b3RhbFdpZHRoICsg
MiAqIGxpbmVHYXAsIGZvbnQtPmxpbmVTcGFjaW5nKCkpOwotICAgICAgICBIREMgaGRjID0gZ3Jh
cGhpY3NDb250ZXh0LT5nZXRXaW5kb3dzQ29udGV4dCh0ZXh0UmVjdCk7Ci0gICAgICAgIFNlbGVj
dE9iamVjdChoZGMsIGZvbnQtPm1fZm9udC5oZm9udCgpKTsKLQotICAgICAgICAvLyBTZXQgdGhl
IGNvcnJlY3QgY29sb3IuCi0gICAgICAgIEhEQyB0ZXh0RHJhd2luZ0RDID0gaGRjOwotICAgICAg
ICAvKmlmIChmaWxsQ29sb3IuaGFzQWxwaGEoKSB8fCBncmFwaGljc0NvbnRleHQtPmluVHJhbnNw
YXJlbmN5TGF5ZXIoKSkgewotICAgICAgICAgICAgLy8gR0RJIGNhbid0IGhhbmRsZSBkcmF3aW5n
IHRyYW5zcGFyZW50IHRleHQuICBXZSBoYXZlIHRvIGRyYXcgaW50byBhIG1hc2suICBXZSBkcmF3
IGJsYWNrIHRleHQgb24gYSB3aGl0ZS1maWxsZWQgYmFja2dyb3VuZC4KLSAgICAgICAgICAgIC8v
IFdlIGFsc28gZG8gdGhpcyB3aGVuIGluc2lkZSB0cmFuc3BhcmVuY3kgbGF5ZXJzLCBzaW5jZSBH
REkgYWxzbyBjYW4ndCBkcmF3IG9udG8gYSBzdXJmYWNlIHdpdGggYWxwaGEuCi0gICAgICAgICAg
ICBncmFwaGljc0NvbnRleHQtPnNhdmUoKTsKLSAgICAgICAgICAgIGdyYXBoaWNzQ29udGV4dC0+
c2V0RmlsbENvbG9yKENvbG9yOjp3aGl0ZSk7Ci0gICAgICAgICAgICB0ZXh0RHJhd2luZ0RDID0g
Z3JhcGhpY3NDb250ZXh0LT5nZXRXaW5kb3dzQml0bWFwQ29udGV4dCh0ZXh0UmVjdCk7Ci0gICAg
ICAgICAgICBTZXRUZXh0Q29sb3IoaGRjLCBSR0IoMCwgMCwgMCkpOwotICAgICAgICB9IGVsc2Uq
LwotICAgICAgICAgICAgU2V0VGV4dENvbG9yKGhkYywgUkdCKGZpbGxDb2xvci5yZWQoKSwgZmls
bENvbG9yLmdyZWVuKCksIGZpbGxDb2xvci5ibHVlKCkpKTsKLQotICAgICAgICBTZXRCa01vZGUo
aGRjLCBUUkFOU1BBUkVOVCk7Ci0gICAgICAgIFNldFRleHRBbGlnbihoZGMsIFRBX0xFRlQgfCBU
QV9CQVNFTElORSk7Ci0KLSAgICAgICAgLy8gVW5pc2NyaWJlIGdpdmVzIHVzIG9mZnNldHMgdG8g
aGVscCByZWZpbmUgdGhlIHBvc2l0aW9uaW5nIG9mIGNvbWJpbmluZyBnbHlwaHMuCi0gICAgICAg
IEZsb2F0U2l6ZSB0cmFuc2xhdGlvbiA9IGdseXBoQnVmZmVyLm9mZnNldEF0KGZyb20pOwotICAg
ICAgICBpZiAodHJhbnNsYXRpb24ud2lkdGgoKSB8fCB0cmFuc2xhdGlvbi5oZWlnaHQoKSkgewot
ICAgICAgICAgICAgWEZPUk0geGZvcm07Ci0gICAgICAgICAgICB4Zm9ybS5lTTExID0gMS4wOwot
ICAgICAgICAgICAgeGZvcm0uZU0xMiA9IDA7Ci0gICAgICAgICAgICB4Zm9ybS5lTTIxID0gMDsK
LSAgICAgICAgICAgIHhmb3JtLmVNMjIgPSAxLjA7Ci0gICAgICAgICAgICB4Zm9ybS5lRHggPSB0
cmFuc2xhdGlvbi53aWR0aCgpOwotICAgICAgICAgICAgeGZvcm0uZUR5ID0gdHJhbnNsYXRpb24u
aGVpZ2h0KCk7Ci0gICAgICAgICAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShoZGMsICZ4Zm9ybSwg
TVdUX0xFRlRNVUxUSVBMWSk7Ci0gICAgICAgIH0KLSAgICAgICAgRXh0VGV4dE91dChoZGMsIHBv
aW50LngoKSwgcG9pbnQueSgpLCBFVE9fR0xZUEhfSU5ERVgsIDAsIChXQ0hBUiopZ2x5cGhCdWZm
ZXIuZ2x5cGhzKGZyb20pLCBudW1HbHlwaHMsIGdkaUFkdmFuY2VzLmRhdGEoKSk7Ci0KLSAgICAg
ICAgLyppZiAoZmlsbENvbG9yLmhhc0FscGhhKCkgfHwgZ3JhcGhpY3NDb250ZXh0LT5pblRyYW5z
cGFyZW5jeUxheWVyKCkpIHsKLSAgICAgICAgICAgIC8vIFRPRE9EOiBXZSBoYXZlIHRvIHdhbGsg
dGhlIGJpdHMgb2YgdGhlIGJpdG1hcCBhbmQgaW52ZXJ0IHRoZW0uICBXZSBhbHNvIGNvcHkgb3Zl
ciB0aGUgZ3JlZW4gY29tcG9uZW50IHZhbHVlIGludG8gdGhlIGFscGhhIHZhbHVlCi0gICAgICAg
ICAgICAvLyB0byBrZWVwIENsZWFyVHlwZSBsb29raW5nIHJlYXNvbmFibGUuCi0KLSAgICAgICAg
ICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgZHJhd24gdGhlIHRleHQgaW50byBhIGJpdG1hcCBhbmQg
aW52ZXJ0ZWQgaXQsIG9idGFpbiBhIENHSW1hZ2VSZWYgbWFzay4KLSAgICAgICAgICAgIENHSW1h
Z2VSZWYgbWFzayA9IGdyYXBoaWNzQ29udGV4dC0+cmVsZWFzZVdpbmRvd3NCaXRtYXBDb250ZXh0
SW50b01hc2sodGV4dERyYXdpbmdEQywgdGV4dFJlY3QpOwotICAgICAgICAgICAgCi0gICAgICAg
ICAgICAvLyBBcHBseSB0aGUgbWFzayB0byB0aGUgZmlsbCBjb2xvci4KLSAgICAgICAgICAgIENH
Q29udGV4dFJlZiBiaXRtYXBDb250ZXh0ID0gZ3JhcGhpY3NDb250ZXh0LT5nZXRXaW5kb3dzQ29t
cGF0aWJsZUNHQml0bWFwQ29udGV4dCh0ZXh0UmVjdC5zaXplKCkpOwotICAgICAgICAgICAgQ0dG
bG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKLSAgICAgICAgICAgIGNvbG9yLmdldFJHQkEo
cmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotICAgICAgICAgICAgQ0dDb250ZXh0U2V0UkdCRmls
bENvbG9yKGNvbnRleHQsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLSAgICAgICAgICAgIENH
Q29udGV4dEZpbGxSZWN0KGJpdG1hcENvbnRleHQsIEludFJlY3QoMCwgMCwgdGV4dFJlY3Qud2lk
dGgoKSwgdGV4dFJlY3QuaGVpZ2h0KCkpKTsKLSAgICAgICAgICAgIENHSW1hZ2VSZWYgZmlsbENv
bG9ySW1hZ2UgPSBDR0JpdG1hcENvbnRleHRDcmVhdGVJbWFnZShiaXRtYXBDb250ZXh0KTsKLSAg
ICAgICAgCi0gICAgICAgICAgICAvLyBBcHBseSB0aGUgbWFzay4KLSAgICAgICAgICAgIENHSW1h
Z2VSZWYgZmluYWxJbWFnZSA9IENHSW1hZ2VDcmVhdGVXaXRoTWFzayhmaWxsQ29sb3JJbWFnZSwg
bWFzayk7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBiaXRtYXAgaW1hZ2UgbmVlZHMgdG8gYmUgZHJh
d24gaW50byB0aGUgSERDLgotICAgICAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5kcmF3SW1hZ2VJ
bnRvV2luZG93c0NvbnRleHQoaGRjLCBmaW5hbEltYWdlKTsKLQotICAgICAgICAgICAgLy8gUmVs
ZWFzZSBvdXIgaW1hZ2VzIGFuZCBjb250ZXh0cy4KLSAgICAgICAgICAgIENHSW1hZ2VSZWxlYXNl
KG1hc2spOwotICAgICAgICAgICAgQ0dJbWFnZVJlbGVhc2UoZmlsbENvbG9ySW1hZ2UpOwotICAg
ICAgICAgICAgQ0dJbWFnZVJlbGVhc2UoZmluYWxJbWFnZSk7Ci0gICAgICAgICAgICBDR0NvbnRl
eHRSZWxlYXNlKGJpdG1hcENvbnRleHQpOwotICAgICAgICB9Ki8KLQotICAgICAgICBncmFwaGlj
c0NvbnRleHQtPnJlbGVhc2VXaW5kb3dzQ29udGV4dChoZGMsIHRleHRSZWN0KTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLQotICAgIENHQ29udGV4dFJlZiBjZ0NvbnRleHQgPSBncmFwaGljc0Nv
bnRleHQtPnBsYXRmb3JtQ29udGV4dCgpOwotCi0gICAgdWludDMyX3Qgb2xkRm9udFNtb290aGlu
Z1N0eWxlID0gd2tTZXRGb250U21vb3RoaW5nU3R5bGUoY2dDb250ZXh0KTsKLQotICAgIGNvbnN0
IEZvbnRQbGF0Zm9ybURhdGEmIHBsYXRmb3JtRGF0YSA9IGZvbnQtPnBsYXRmb3JtRGF0YSgpOwot
Ci0gICAgQ0dDb250ZXh0U2V0Rm9udChjZ0NvbnRleHQsIHBsYXRmb3JtRGF0YS5jZ0ZvbnQoKSk7
Ci0KLSAgICBDR0FmZmluZVRyYW5zZm9ybSBtYXRyaXggPSBDR0FmZmluZVRyYW5zZm9ybUlkZW50
aXR5OwotICAgIG1hdHJpeC5iID0gLW1hdHJpeC5iOwotICAgIG1hdHJpeC5kID0gLW1hdHJpeC5k
OwotCi0gICAgaWYgKHBsYXRmb3JtRGF0YS5zeW50aGV0aWNPYmxpcXVlKCkpCi0gICAgewotICAg
ICAgICBzdGF0aWMgZmxvYXQgc2tldyA9IC10YW5mKHN5bnRoZXRpY09ibGlxdWVBbmdsZSAqIGFj
b3NmKDApIC8gOTApOwotICAgICAgICBtYXRyaXggPSBDR0FmZmluZVRyYW5zZm9ybUNvbmNhdCht
YXRyaXgsIENHQWZmaW5lVHJhbnNmb3JtTWFrZSgxLCAwLCBza2V3LCAxLCAwLCAwKSk7Ci0gICAg
fQotCi0gICAgLy8gVW5pc2NyaWJlIGdpdmVzIHVzIG9mZnNldHMgdG8gaGVscCByZWZpbmUgdGhl
IHBvc2l0aW9uaW5nIG9mIGNvbWJpbmluZyBnbHlwaHMuCi0gICAgRmxvYXRTaXplIHRyYW5zbGF0
aW9uID0gZ2x5cGhCdWZmZXIub2Zmc2V0QXQoZnJvbSk7Ci0gICAgaWYgKHRyYW5zbGF0aW9uLndp
ZHRoKCkgfHwgdHJhbnNsYXRpb24uaGVpZ2h0KCkpCi0gICAgICAgIENHQWZmaW5lVHJhbnNmb3Jt
VHJhbnNsYXRlKG1hdHJpeCwgdHJhbnNsYXRpb24ud2lkdGgoKSwgdHJhbnNsYXRpb24uaGVpZ2h0
KCkpOwotICAgIAotICAgIENHQ29udGV4dFNldFRleHRNYXRyaXgoY2dDb250ZXh0LCBtYXRyaXgp
OwotCi0gICAgQ0dDb250ZXh0U2V0Rm9udFNpemUoY2dDb250ZXh0LCBwbGF0Zm9ybURhdGEuc2l6
ZSgpKTsKLSAgICBDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24oY2dDb250ZXh0LCBwb2ludC54KCks
IHBvaW50LnkoKSk7Ci0gICAgQ0dDb250ZXh0U2hvd0dseXBoc1dpdGhBZHZhbmNlcyhjZ0NvbnRl
eHQsIGdseXBoQnVmZmVyLmdseXBocyhmcm9tKSwgZ2x5cGhCdWZmZXIuYWR2YW5jZXMoZnJvbSks
IG51bUdseXBocyk7Ci0gICAgaWYgKGZvbnQtPm1fc3ludGhldGljQm9sZE9mZnNldCkgewotICAg
ICAgICBDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24oY2dDb250ZXh0LCBwb2ludC54KCkgKyBmb250
LT5tX3N5bnRoZXRpY0JvbGRPZmZzZXQsIHBvaW50LnkoKSk7Ci0gICAgICAgIENHQ29udGV4dFNo
b3dHbHlwaHNXaXRoQWR2YW5jZXMoY2dDb250ZXh0LCBnbHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSks
IGdseXBoQnVmZmVyLmFkdmFuY2VzKGZyb20pLCBudW1HbHlwaHMpOwotICAgIH0KLQotICAgIHdr
UmVzdG9yZUZvbnRTbW9vdGhpbmdTdHlsZShjZ0NvbnRleHQsIG9sZEZvbnRTbW9vdGhpbmdTdHls
ZSk7Ci19Ci0KIEZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQoY29u
c3QgVGV4dFJ1biYgcnVuLCBjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCBoLAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IHRvKSBjb25z
dAogewpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0
Q0dXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dy
YXBoaWNzQ29udGV4dENHV2luLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENHV2luLmNwcAkocmV2aXNpb24gMCkKQEAgLTAs
MCArMSwzMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYs
IDIwMDcsIDIwMDggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisKKyNpbmNsdWRl
ICJBZmZpbmVUcmFuc2Zvcm0uaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1
ZGUgIlBhdGguaCIKKyNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgorCisjaW5jbHVkZSA8Q29y
ZUdyYXBoaWNzL0NHQml0bWFwQ29udGV4dC5oPgorI2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVy
ZmFjZS9XZWJLaXRTeXN0ZW1JbnRlcmZhY2UuaD4KKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHRQ
bGF0Zm9ybVByaXZhdGUuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitzdGF0aWMgQ0dDb250ZXh0UmVmIENHQ29udGV4dFdpdGhIREMoSERDIGhkYykK
K3sKKyAgICBIQklUTUFQIGJpdG1hcCA9IChIQklUTUFQKUdldEN1cnJlbnRPYmplY3QoaGRjLCBP
QkpfQklUTUFQKTsKKyAgICBDR0NvbG9yU3BhY2VSZWYgZGV2aWNlUkdCID0gQ0dDb2xvclNwYWNl
Q3JlYXRlRGV2aWNlUkdCKCk7CisgICAgQklUTUFQIGluZm87CisKKyAgICBHZXRPYmplY3QoYml0
bWFwLCBzaXplb2YoaW5mbyksICZpbmZvKTsKKyAgICBBU1NFUlQoaW5mby5ibUJpdHNQaXhlbCA9
PSAzMik7CisgICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUo
aW5mby5ibUJpdHMsIGluZm8uYm1XaWR0aCwgaW5mby5ibUhlaWdodCwgOCwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmJtV2lkdGhCeXRlcywg
ZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFOb25l
U2tpcEZpcnN0KTsKKyAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKGRldmljZVJHQik7CisKKyAgICAv
LyBGbGlwIGNvb3JkcworICAgIENHQ29udGV4dFRyYW5zbGF0ZUNUTShjb250ZXh0LCAwLCBpbmZv
LmJtSGVpZ2h0KTsKKyAgICBDR0NvbnRleHRTY2FsZUNUTShjb250ZXh0LCAxLCAtMSk7CisgICAg
CisgICAgLy8gUHV0IHRoZSBIREMgSW4gYWR2YW5jZWQgbW9kZSBzbyBpdCB3aWxsIGhvbm9yIGFm
ZmluZSB0cmFuc2Zvcm1zLgorICAgIFNldEdyYXBoaWNzTW9kZShoZGMsIEdNX0FEVkFOQ0VEKTsK
KyAgICAKKyAgICByZXR1cm4gY29udGV4dDsKK30KKworR3JhcGhpY3NDb250ZXh0OjpHcmFwaGlj
c0NvbnRleHQoSERDIGhkYykKKyAgICA6IG1fY29tbW9uKGNyZWF0ZUdyYXBoaWNzQ29udGV4dFBy
aXZhdGUoKSkKKyAgICAsIG1fZGF0YShuZXcgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRl
KENHQ29udGV4dFdpdGhIREMoaGRjKSkpCit7CisgICAgQ0dDb250ZXh0UmVsZWFzZShtX2RhdGEt
Pm1fY2dDb250ZXh0KTsKKyAgICBtX2RhdGEtPm1faGRjID0gaGRjOworICAgIHNldFBhaW50aW5n
RGlzYWJsZWQoIW1fZGF0YS0+bV9jZ0NvbnRleHQpOworICAgIGlmIChtX2RhdGEtPm1fY2dDb250
ZXh0KSB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGV4dCBzdGFydHMgaW4gc3luYyB3
aXRoIG91ciBzdGF0ZS4KKyAgICAgICAgc2V0UGxhdGZvcm1GaWxsQ29sb3IoZmlsbENvbG9yKCkp
OworICAgICAgICBzZXRQbGF0Zm9ybVN0cm9rZUNvbG9yKHN0cm9rZUNvbG9yKCkpOworICAgIH0K
K30KKworSERDIEdyYXBoaWNzQ29udGV4dDo6Z2V0V2luZG93c0NvbnRleHQoY29uc3QgSW50UmVj
dCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVuZCkKK3sKKyAgICBpZiAoaW5UcmFuc3Bh
cmVuY3lMYXllcigpKSB7CisgICAgICAgIGlmIChkc3RSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAg
ICAgIHJldHVybiAwOworCisgICAgICAgIC8vIENyZWF0ZSBhIGJpdG1hcCBEQyBpbiB3aGljaCB0
byBkcmF3LgorICAgICAgICBCSVRNQVBJTkZPIGJpdG1hcEluZm87CisgICAgICAgIGJpdG1hcElu
Zm8uYm1pSGVhZGVyLmJpU2l6ZSAgICAgICAgICA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsK
KyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlXaWR0aCAgICAgICAgID0gZHN0UmVjdC53
aWR0aCgpOyAKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlIZWlnaHQgICAgICAgID0g
ZHN0UmVjdC5oZWlnaHQoKTsKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlQbGFuZXMg
ICAgICAgID0gMTsKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlCaXRDb3VudCAgICAg
ID0gMzI7CisgICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpQ29tcHJlc3Npb24gICA9IEJJ
X1JHQjsKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlTaXplSW1hZ2UgICAgID0gMDsK
KyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlYUGVsc1Blck1ldGVyID0gMDsKKyAgICAg
ICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlZUGVsc1Blck1ldGVyID0gMDsKKyAgICAgICAgYml0
bWFwSW5mby5ibWlIZWFkZXIuYmlDbHJVc2VkICAgICAgID0gMDsKKyAgICAgICAgYml0bWFwSW5m
by5ibWlIZWFkZXIuYmlDbHJJbXBvcnRhbnQgID0gMDsKKworICAgICAgICB2b2lkKiBwaXhlbHMg
PSAwOworICAgICAgICBIQklUTUFQIGJpdG1hcCA9IDo6Q3JlYXRlRElCU2VjdGlvbihOVUxMLCAm
Yml0bWFwSW5mbywgRElCX1JHQl9DT0xPUlMsICZwaXhlbHMsIDAsIDApOworICAgICAgICBpZiAo
IWJpdG1hcCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIEhEQyBiaXRtYXBEQyA9
IDo6Q3JlYXRlQ29tcGF0aWJsZURDKG1fZGF0YS0+bV9oZGMpOworICAgICAgICA6OlNlbGVjdE9i
amVjdChiaXRtYXBEQywgYml0bWFwKTsKKworICAgICAgICAvLyBGaWxsIG91ciBidWZmZXIgd2l0
aCBjbGVhciBpZiB3ZSdyZSBnb2luZyB0byBhbHBoYSBibGVuZC4KKyAgICAgICAgaWYgKHN1cHBv
cnRBbHBoYUJsZW5kKSB7CisgICAgICAgICAgICBCSVRNQVAgYm1wSW5mbzsKKyAgICAgICAgICAg
IEdldE9iamVjdChiaXRtYXAsIHNpemVvZihibXBJbmZvKSwgJmJtcEluZm8pOworICAgICAgICAg
ICAgaW50IGJ1ZmZlclNpemUgPSBibXBJbmZvLmJtV2lkdGhCeXRlcyAqIGJtcEluZm8uYm1IZWln
aHQ7CisgICAgICAgICAgICBtZW1zZXQoYm1wSW5mby5ibUJpdHMsIDAsIGJ1ZmZlclNpemUpOwor
ICAgICAgICB9CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGNhbiBkbyB3b3JsZCB0cmFuc2Zv
cm1zLgorICAgICAgICBTZXRHcmFwaGljc01vZGUoYml0bWFwREMsIEdNX0FEVkFOQ0VEKTsKKwor
ICAgICAgICAvLyBBcHBseSBhIHRyYW5zbGF0aW9uIHRvIG91ciBjb250ZXh0IHNvIHRoYXQgdGhl
IGRyYXdpbmcgZG9uZSB3aWxsIGJlIGF0ICgwLDApIG9mIHRoZSBiaXRtYXAuCisgICAgICAgIFhG
T1JNIHhmb3JtOworICAgICAgICB4Zm9ybS5lTTExID0gMS4wOworICAgICAgICB4Zm9ybS5lTTEy
ID0gMDsKKyAgICAgICAgeGZvcm0uZU0yMSA9IDA7CisgICAgICAgIHhmb3JtLmVNMjIgPSAxLjA7
CisgICAgICAgIHhmb3JtLmVEeCA9IC1kc3RSZWN0LngoKTsKKyAgICAgICAgeGZvcm0uZUR5ID0g
LWRzdFJlY3QueSgpOworICAgICAgICA6OlNldFdvcmxkVHJhbnNmb3JtKGJpdG1hcERDLCAmeGZv
cm0pOworCisgICAgICAgIHJldHVybiBiaXRtYXBEQzsKKyAgICB9CisKKyAgICBDR0NvbnRleHRG
bHVzaChwbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgbV9kYXRhLT5zYXZlKCk7CisgICAgcmV0dXJu
IG1fZGF0YS0+bV9oZGM7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpyZWxlYXNlV2luZG93
c0NvbnRleHQoSERDIGhkYywgY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxw
aGFCbGVuZCkKK3sKKyAgICBpZiAoaGRjICYmIGluVHJhbnNwYXJlbmN5TGF5ZXIoKSkgeworICAg
ICAgICBpZiAoZHN0UmVjdC5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAg
ICAgSEJJVE1BUCBiaXRtYXAgPSAoSEJJVE1BUClHZXRDdXJyZW50T2JqZWN0KGhkYywgT0JKX0JJ
VE1BUCk7CisKKyAgICAgICAgLy8gTmVlZCB0byBtYWtlIGEgQ0dJbWFnZSBvdXQgb2YgdGhlIGJp
dG1hcCdzIHBpeGVsIGJ1ZmZlciBhbmQgdGhlbiBkcmF3CisgICAgICAgIC8vIGl0IGludG8gb3Vy
IGNvbnRleHQuCisgICAgICAgIEJJVE1BUCBpbmZvOworICAgICAgICBHZXRPYmplY3QoYml0bWFw
LCBzaXplb2YoaW5mbyksICZpbmZvKTsKKyAgICAgICAgQVNTRVJUKGluZm8uYm1CaXRzUGl4ZWwg
PT0gMzIpOworCisgICAgICAgIENHQ29sb3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3Bh
Y2VDcmVhdGVEZXZpY2VSR0IoKTsKKyAgICAgICAgQ0dDb250ZXh0UmVmIGJpdG1hcENvbnRleHQg
PSBDR0JpdG1hcENvbnRleHRDcmVhdGUoaW5mby5ibUJpdHMsIGluZm8uYm1XaWR0aCwgaW5mby5i
bUhlaWdodCwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJHQiwga0NHQml0bWFwQnl0
ZU9yZGVyMzJMaXR0bGUgfCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgKHN1cHBvcnRBbHBoYUJsZW5kID8ga0NHSW1hZ2VBbHBoYVBy
ZW11bHRpcGxpZWRGaXJzdCA6IGtDR0ltYWdlQWxwaGFOb25lU2tpcEZpcnN0KSk7CisgICAgICAg
IENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKKworICAgICAgICBDR0ltYWdlUmVmIGlt
YWdlID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlSW1hZ2UoYml0bWFwQ29udGV4dCk7CisgICAgICAg
IENHQ29udGV4dERyYXdJbWFnZShtX2RhdGEtPm1fY2dDb250ZXh0LCBkc3RSZWN0LCBpbWFnZSk7
CisgICAgICAgIAorICAgICAgICAvLyBEZWxldGUgYWxsIG91ciBqdW5rLgorICAgICAgICBDR0lt
YWdlUmVsZWFzZShpbWFnZSk7CisgICAgICAgIENHQ29udGV4dFJlbGVhc2UoYml0bWFwQ29udGV4
dCk7CisgICAgICAgIDo6RGVsZXRlREMoaGRjKTsKKyAgICAgICAgOjpEZWxldGVPYmplY3QoYml0
bWFwKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9kYXRhLT5yZXN0b3JlKCk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpjb25jYXRDVE0oY29u
c3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFuc2Zvcm0pCit7CisgICAgaWYgKCFtX2hkYykKKyAgICAg
ICAgcmV0dXJuOworCisgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbWF0ID0gdHJhbnNmb3JtOworICAg
IFhGT1JNIHhmb3JtOworICAgIHhmb3JtLmVNMTEgPSBtYXQuYTsKKyAgICB4Zm9ybS5lTTEyID0g
bWF0LmI7CisgICAgeGZvcm0uZU0yMSA9IG1hdC5jOworICAgIHhmb3JtLmVNMjIgPSBtYXQuZDsK
KyAgICB4Zm9ybS5lRHggPSBtYXQudHg7CisgICAgeGZvcm0uZUR5ID0gbWF0LnR5OworCisgICAg
TW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3Rm9jdXNSaW5nKGNvbnN0IENvbG9yJiBjb2xv
cikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBmbG9hdCByYWRpdXMgPSAoZm9jdXNSaW5nV2lkdGgoKSAtIDEpIC8gMi4wZjsKKyAgICBpbnQg
b2Zmc2V0ID0gcmFkaXVzICsgZm9jdXNSaW5nT2Zmc2V0KCk7CisgICAgQ0dDb2xvclJlZiBjb2xv
clJlZiA9IGNvbG9yLmlzVmFsaWQoKSA/IGNnQ29sb3IoY29sb3IpIDogMDsKKworICAgIENHTXV0
YWJsZVBhdGhSZWYgZm9jdXNSaW5nUGF0aCA9IENHUGF0aENyZWF0ZU11dGFibGUoKTsKKyAgICBj
b25zdCBWZWN0b3I8SW50UmVjdD4mIHJlY3RzID0gZm9jdXNSaW5nUmVjdHMoKTsKKyAgICB1bnNp
Z25lZCByZWN0Q291bnQgPSByZWN0cy5zaXplKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IHJlY3RDb3VudDsgaSsrKQorICAgICAgICBDR1BhdGhBZGRSZWN0KGZvY3VzUmluZ1BhdGgs
IDAsIENHUmVjdEluc2V0KHJlY3RzW2ldLCAtb2Zmc2V0LCAtb2Zmc2V0KSk7CisKKyAgICBDR0Nv
bnRleHRSZWYgY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOworICAgIENHQ29udGV4dFNhdmVH
U3RhdGUoY29udGV4dCk7CisKKyAgICBDR0NvbnRleHRCZWdpblBhdGgoY29udGV4dCk7CisgICAg
Q0dDb250ZXh0QWRkUGF0aChjb250ZXh0LCBmb2N1c1JpbmdQYXRoKTsKKworICAgIHdrRHJhd0Zv
Y3VzUmluZyhjb250ZXh0LCBjb2xvclJlZiwgcmFkaXVzKTsKKworICAgIENHQ29sb3JSZWxlYXNl
KGNvbG9yUmVmKTsKKworICAgIENHUGF0aFJlbGVhc2UoZm9jdXNSaW5nUGF0aCk7CisKKyAgICBD
R0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOworfQorCisvLyBQdWxsZWQgZnJvbSBHcmFw
aGljc0NvbnRleHRDRworc3RhdGljIHZvaWQgc2V0Q0dTdHJva2VDb2xvcihDR0NvbnRleHRSZWYg
Y29udGV4dCwgY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIENHRmxvYXQgcmVkLCBncmVlbiwg
Ymx1ZSwgYWxwaGE7CisgICAgY29sb3IuZ2V0UkdCQShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7
CisgICAgQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IoY29udGV4dCwgcmVkLCBncmVlbiwgYmx1
ZSwgYWxwaGEpOworfQorCitzdGF0aWMgY29uc3QgQ29sb3ImIHNwZWxsaW5nUGF0dGVybkNvbG9y
KCkgeworICAgIHN0YXRpYyBjb25zdCBDb2xvciBzcGVsbGluZ0NvbG9yKDI1NSwgMCwgMCk7Cisg
ICAgcmV0dXJuIHNwZWxsaW5nQ29sb3I7Cit9CisKK3N0YXRpYyBjb25zdCBDb2xvciYgZ3JhbW1h
clBhdHRlcm5Db2xvcigpIHsKKyAgICBzdGF0aWMgY29uc3QgQ29sb3IgZ3JhbW1hckNvbG9yKDAs
IDEyOCwgMCk7CisgICAgcmV0dXJuIGdyYW1tYXJDb2xvcjsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQ6OmRyYXdMaW5lRm9yTWlzc3BlbGxpbmdPckJhZEdyYW1tYXIoY29uc3QgSW50UG9pbnQm
IHBvaW50LCBpbnQgd2lkdGgsIGJvb2wgZ3JhbW1hcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNh
YmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBUaGVzZSBhcmUgdGhlIHNhbWUgZm9y
IG1pc3NwZWxsaW5nIG9yIGJhZCBncmFtbWFyCisgICAgY29uc3QgaW50IHBhdHRlcm5IZWlnaHQg
PSAzOyAvLyAzIHJvd3MKKyAgICBBU1NFUlQoY01pc3NwZWxsaW5nTGluZVRoaWNrbmVzcyA9PSBw
YXR0ZXJuSGVpZ2h0KTsKKyAgICBjb25zdCBpbnQgcGF0dGVybldpZHRoID0gNDsgLy8gNCBwaXhl
bHMKKyAgICBBU1NFUlQocGF0dGVybldpZHRoID09IGNNaXNzcGVsbGluZ0xpbmVQYXR0ZXJuV2lk
dGgpOworCisgICAgLy8gTWFrZSBzdXJlIHRvIGRyYXcgb25seSBjb21wbGV0ZSBkb3RzLgorICAg
IC8vIE5PVEU6IENvZGUgaGVyZSB1c2VkIHRvIHNoaWZ0IHRoZSB1bmRlcmxpbmUgdG8gdGhlIGxl
ZnQgYW5kIGluY3JlYXNlIHRoZSB3aWR0aAorICAgIC8vIHRvIG1ha2Ugc3VyZSBldmVyeXRoaW5n
IGdldHMgdW5kZXJsaW5lZCwgYnV0IHRoYXQgcmVzdWx0cyBpbiBkcmF3aW5nIG91dCBvZgorICAg
IC8vIGJvdW5kcyAoZS5nLiB3aGVuIGF0IHRoZSBlZGdlIG9mIGEgdmlldykgYW5kIGNvdWxkIG1h
a2UgaXQgYXBwZWFyIHRoYXQgdGhlCisgICAgLy8gc3BhY2UgYmV0d2VlbiBhZGphY2VudCBtaXNz
cGVsbGVkIHdvcmRzIHdhcyB1bmRlcmxpbmVkLgorICAgIC8vIGFsbG93IHNsaWdodGx5IG1vcmUg
Y29uc2lkZXJpbmcgdGhhdCB0aGUgcGF0dGVybiBlbmRzIHdpdGggYSB0cmFuc3BhcmVudCBwaXhl
bAorICAgIGludCB3aWR0aE1vZCA9IHdpZHRoICUgcGF0dGVybldpZHRoOworICAgIGlmIChwYXR0
ZXJuV2lkdGggLSB3aWR0aE1vZCA+IGNNaXNzcGVsbGluZ0xpbmVQYXR0ZXJuR2FwV2lkdGgpCisg
ICAgICAgIHdpZHRoIC09IHdpZHRoTW9kOworICAgICAgCisgICAgLy8gRHJhdyB0aGUgdW5kZXJs
aW5lCisgICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsKKyAgICBD
R0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQpOworCisgICAgY29uc3QgQ29sb3ImIHBhdHRlcm5D
b2xvciA9IGdyYW1tYXIgPyBncmFtbWFyUGF0dGVybkNvbG9yKCkgOiBzcGVsbGluZ1BhdHRlcm5D
b2xvcigpOworICAgIHNldENHU3Ryb2tlQ29sb3IoY29udGV4dCwgcGF0dGVybkNvbG9yKTsKKwor
ICAgIHdrU2V0UGF0dGVyblBoYXNlSW5Vc2VyU3BhY2UoY29udGV4dCwgcG9pbnQpOworICAgIENH
Q29udGV4dFNldEJsZW5kTW9kZShjb250ZXh0LCBrQ0dCbGVuZE1vZGVOb3JtYWwpOworICAgIAor
ICAgIC8vIDMgcm93cywgZWFjaCBvZmZzZXQgYnkgaGFsZiBhIHBpeGVsIGZvciBibGVuZGluZyBw
dXJwb3NlcworICAgIGNvbnN0IENHUG9pbnQgdXBwZXJQb2ludHMgW10gPSB7e3BvaW50LngoKSwg
cG9pbnQueSgpICsgcGF0dGVybkhlaWdodCAtIDIuNSB9LCB7cG9pbnQueCgpICsgd2lkdGgsIHBv
aW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAyLjV9fTsKKyAgICBjb25zdCBDR1BvaW50IG1pZGRs
ZVBvaW50cyBbXSA9IHt7cG9pbnQueCgpLCBwb2ludC55KCkgKyBwYXR0ZXJuSGVpZ2h0IC0gMS41
IH0sIHtwb2ludC54KCkgKyB3aWR0aCwgcG9pbnQueSgpICsgcGF0dGVybkhlaWdodCAtIDEuNX19
OworICAgIGNvbnN0IENHUG9pbnQgbG93ZXJQb2ludHMgW10gPSB7e3BvaW50LngoKSwgcG9pbnQu
eSgpICsgcGF0dGVybkhlaWdodCAtIDAuNSB9LCB7cG9pbnQueCgpICsgd2lkdGgsIHBvaW50Lnko
KSArIHBhdHRlcm5IZWlnaHQgLSAwLjUgfX07CisgICAgCisgICAgLy8gRGFzaCBsZW5ndGhzIGZv
ciB0aGUgdG9wIGFuZCBib3R0b20gb2YgdGhlIGVycm9yIHVuZGVybGluZSBhcmUgdGhlIHNhbWUu
CisgICAgLy8gVGhlc2UgYXJlIG1hZ2ljLgorICAgIHN0YXRpYyBjb25zdCBmbG9hdCBlZGdlX2Rh
c2hfbGVuZ3Roc1tdID0gezIsIDJ9OworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBtaWRkbGVfZGFz
aF9sZW5ndGhzW10gPSB7Mi43NmYsIDEuMjRmfTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgZWRn
ZV9vZmZzZXQgPSAtKGVkZ2VfZGFzaF9sZW5ndGhzWzFdIC0gMS4wZikgLyAyLjBmOworICAgIHN0
YXRpYyBjb25zdCBmbG9hdCBtaWRkbGVfb2Zmc2V0ID0gLShtaWRkbGVfZGFzaF9sZW5ndGhzWzFd
IC0gMS4wZikgLyAyLjBmOworCisgICAgLy8gTGluZSBvcGFjaXRpZXMuICBPbmNlIGFnYWluLCB0
aGVzZSBhcmUgbWFnaWMuCisgICAgY29uc3QgZmxvYXQgdXBwZXJPcGFjaXR5ID0gMC4zM2Y7Cisg
ICAgY29uc3QgZmxvYXQgbWlkZGxlT3BhY2l0eSA9IDAuNzVmOworICAgIGNvbnN0IGZsb2F0IGxv
d2VyT3BhY2l0eSA9IDAuODhmOworCisgICAgLy9Ub3AgbGluZQorICAgIENHQ29udGV4dFNldExp
bmVEYXNoKGNvbnRleHQsIGVkZ2Vfb2Zmc2V0LCBlZGdlX2Rhc2hfbGVuZ3RocywgCisgICAgICAg
ICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVkZ2VfZGFzaF9sZW5ndGhzKSAvIHNpemVvZihlZGdl
X2Rhc2hfbGVuZ3Roc1swXSkpOworICAgIENHQ29udGV4dFNldEFscGhhKGNvbnRleHQsIHVwcGVy
T3BhY2l0eSk7CisgICAgQ0dDb250ZXh0U3Ryb2tlTGluZVNlZ21lbnRzKGNvbnRleHQsIHVwcGVy
UG9pbnRzLCAyKTsKKyAKKyAgICAvLyBNaWRkbGUgbGluZQorICAgIENHQ29udGV4dFNldExpbmVE
YXNoKGNvbnRleHQsIG1pZGRsZV9vZmZzZXQsIG1pZGRsZV9kYXNoX2xlbmd0aHMsIAorICAgICAg
ICAgICAgICAgICAgICAgICAgIHNpemVvZihtaWRkbGVfZGFzaF9sZW5ndGhzKSAvIHNpemVvZiht
aWRkbGVfZGFzaF9sZW5ndGhzWzBdKSk7CisgICAgQ0dDb250ZXh0U2V0QWxwaGEoY29udGV4dCwg
bWlkZGxlT3BhY2l0eSk7CisgICAgQ0dDb250ZXh0U3Ryb2tlTGluZVNlZ21lbnRzKGNvbnRleHQs
IG1pZGRsZVBvaW50cywgMik7CisgICAgCisgICAgLy8gQm90dG9tIGxpbmUKKyAgICBDR0NvbnRl
eHRTZXRMaW5lRGFzaChjb250ZXh0LCBlZGdlX29mZnNldCwgZWRnZV9kYXNoX2xlbmd0aHMsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVkZ2VfZGFzaF9sZW5ndGhzKSAvIHNpemVv
ZihlZGdlX2Rhc2hfbGVuZ3Roc1swXSkpOworICAgIENHQ29udGV4dFNldEFscGhhKGNvbnRleHQs
IGxvd2VyT3BhY2l0eSk7CisgICAgQ0dDb250ZXh0U3Ryb2tlTGluZVNlZ21lbnRzKGNvbnRleHQs
IGxvd2VyUG9pbnRzLCAyKTsKKworICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29udGV4dCk7
Cit9CisKK30KClByb3BlcnR5IGNoYW5nZXMgb246IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luL0dyYXBoaWNzQ29udGV4dENHV2luLmNwcApfX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCk5hbWU6IHN2bjpleGVjdXRh
YmxlCiAgICsgKgoKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNz
Q29udGV4dENhaXJvV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbi9HcmFwaGljc0NvbnRleHRDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRDYWlyb1dpbi5jcHAJKHJl
dmlzaW9uIDApCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAy
MDA0LCAyMDA1LCAyMDA2LCAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVS
LCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIs
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgor
CisjaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQu
aCIKKyNpbmNsdWRlICJQYXRoLmgiCisjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KKworI2lu
Y2x1ZGUgPGNhaXJvLXdpbjMyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworR3JhcGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRleHQoSERDIGhkYykK
Ky8vICAgIDogbV9jb21tb24oY3JlYXRlR3JhcGhpY3NDb250ZXh0UHJpdmF0ZSgpKQorLy8gICAg
LCBtX2RhdGEobmV3IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZShDR0NvbnRleHRXaXRo
SERDKGhkYykpKQoreworLy8gICAgQ0dDb250ZXh0UmVsZWFzZShtX2RhdGEtPm1fY2dDb250ZXh0
KTsKKyAgICBtX2RhdGEtPm1faGRjID0gaGRjOworICAgIHNldFBhaW50aW5nRGlzYWJsZWQoIW1f
ZGF0YS0+bV9jZ0NvbnRleHQpOworICAgIGlmIChtX2RhdGEtPm1fY2dDb250ZXh0KSB7CisgICAg
ICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGV4dCBzdGFydHMgaW4gc3luYyB3aXRoIG91ciBzdGF0
ZS4KKyAgICAgICAgc2V0UGxhdGZvcm1GaWxsQ29sb3IoZmlsbENvbG9yKCkpOworICAgICAgICBz
ZXRQbGF0Zm9ybVN0cm9rZUNvbG9yKHN0cm9rZUNvbG9yKCkpOworICAgIH0KK30KKworSERDIEdy
YXBoaWNzQ29udGV4dDo6Z2V0V2luZG93c0NvbnRleHQoY29uc3QgSW50UmVjdCYgZHN0UmVjdCwg
Ym9vbCBzdXBwb3J0QWxwaGFCbGVuZCkKK3sKKyAgICAvLyBUaGlzIGlzIHByb2JhYmx5IHdyb25n
LCBhbmQgZGVmaW5pdGVseSBvdXQgb2YgZGF0ZS4gIFB1bGxlZCBmcm9tIG9sZCBTVk4KKyAgICBj
YWlyb19zdXJmYWNlX3QqIHN1cmZhY2UgPSBjYWlyb19nZXRfdGFyZ2V0KHBsYXRmb3JtQ29udGV4
dCgpKTsKKyAgICBIREMgaGRjID0gY2Fpcm9fd2luMzJfc3VyZmFjZV9nZXRfZGMoc3VyZmFjZSk7
ICAgCisgICAgU2F2ZURDKGhkYyk7CisKKyAgICAvLyBGSVhNRTogV2UgbmVlZCB0byBtYWtlIHN1
cmUgYSBjbGlwIGlzIHJlYWxseSBzZXQgb24gdGhlIEhEQy4KKyAgICAvLyBDYWxsIFNldFdvcmxk
VHJhbnNmb3JtIHRvIGhvbm9yIHRoZSBjdXJyZW50IENhaXJvIHRyYW5zZm9ybS4KKyAgICBTZXRH
cmFwaGljc01vZGUoaGRjLCBHTV9BRFZBTkNFRCk7IC8vIFdlIG5lZWQgdGhpcyBjYWxsIGZvciB0
aGVtZXMgdG8gaG9ub3Igd29ybGQgdHJhbnNmb3Jtcy4KKyAgICBjYWlyb19tYXRyaXhfdCBtYXQ7
CisgICAgY2Fpcm9fZ2V0X21hdHJpeChwbGF0Zm9ybUNvbnRleHQoKSwgJm1hdCk7CisgICAgWEZP
Uk0geGZvcm07CisgICAgeGZvcm0uZU0xMSA9IG1hdC54eDsKKyAgICB4Zm9ybS5lTTEyID0gbWF0
Lnh5OworICAgIHhmb3JtLmVNMjEgPSBtYXQueXg7CisgICAgeGZvcm0uZU0yMiA9IG1hdC55eTsK
KyAgICB4Zm9ybS5lRHggPSBtYXQueDA7CisgICAgeGZvcm0uZUR5ID0gbWF0LnkwOworICAgIFNl
dFdvcmxkVHJhbnNmb3JtKGhkYywgJnhmb3JtKTsKKworICAgIHJldHVybiBoZGM7Cit9CisKK2Jv
b2wgR3JhcGhpY3NDb250ZXh0OjppblRyYW5zcGFyZW5jeUxheWVyKCkgY29uc3QgeyByZXR1cm4g
bV9kYXRhLT5tX3RyYW5zcGFyZW5jeUNvdW50OyB9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpy
ZWxlYXNlV2luZG93c0NvbnRleHQoSERDIGhkYywgY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgYm9v
bCBzdXBwb3J0QWxwaGFCbGVuZCkKK3sKKyAgICBjYWlyb19zdXJmYWNlX3QqIHN1cmZhY2UgPSBj
YWlyb19nZXRfdGFyZ2V0KHBsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBIREMgaGRjMiA9IGNhaXJv
X3dpbjMyX3N1cmZhY2VfZ2V0X2RjKHN1cmZhY2UpOworICAgIFJlc3RvcmVEQyhoZGMyLCAtMSk7
CisgICAgY2Fpcm9fc3VyZmFjZV9tYXJrX2RpcnR5KHN1cmZhY2UpOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9y
bSYgdHJhbnNmb3JtKQoreworICAgIGlmICghbV9oZGMpCisgICAgICAgIHJldHVybjsKKworICAg
IGNhaXJvX21hdHJpeF90IG1hdDsKKyAgICBjYWlyb19nZXRfbWF0cml4KHBsYXRmb3JtQ29udGV4
dCgpLCAmbWF0KTsKKyAgICBYRk9STSB4Zm9ybTsKKyAgICB4Zm9ybS5lTTExID0gbWF0Lnh4Owor
ICAgIHhmb3JtLmVNMTIgPSBtYXQueHk7CisgICAgeGZvcm0uZU0yMSA9IG1hdC55eDsKKyAgICB4
Zm9ybS5lTTIyID0gbWF0Lnl5OworICAgIHhmb3JtLmVEeCA9IG1hdC54MDsKKyAgICB4Zm9ybS5l
RHkgPSBtYXQueTA7CisKKyAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShtX2hkYywgJnhmb3JtLCBN
V1RfTEVGVE1VTFRJUExZKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1c1Jp
bmcoY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0OjpkcmF3TGluZUZvck1pc3NwZWxsaW5nT3JCYWRHcmFtbWFyKGNvbnN0IEludFBv
aW50JiBwb2ludCwgaW50IHdpZHRoLCBib29sIGdyYW1tYXIpCit7CisgICAgaWYgKHBhaW50aW5n
RGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30K
KworfQoKUHJvcGVydHkgY2hhbmdlcyBvbjogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4v
R3JhcGhpY3NDb250ZXh0Q2Fpcm9XaW4uY3BwCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KTmFtZTogc3ZuOmV4ZWN1dGFi
bGUKICAgKyAqCgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3ND
b250ZXh0V2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bi9HcmFwaGljc0NvbnRleHRXaW4uY3BwCShyZXZpc2lvbiAyOTcyNikKKysrIFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dFdpbi5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAy
MDA2LCAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAo
QykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI5LDggKzI5
LDYgQEAKICNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKICNpbmNsdWRlICJOb3RJbXBsZW1l
bnRlZC5oIgogI2luY2x1ZGUgIlBhdGguaCIKLSNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ0dCaXRt
YXBDb250ZXh0Lmg+Ci0jaW5jbHVkZSA8V2ViS2l0U3lzdGVtSW50ZXJmYWNlL1dlYktpdFN5c3Rl
bUludGVyZmFjZS5oPgogI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CiAKICNpbmNsdWRlICJH
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUuaCIKQEAgLTQxLDEzNiArMzksOCBAQCBuYW1l
c3BhY2UgV2ViQ29yZSB7CiAKIGNsYXNzIFNWR1Jlc291cmNlSW1hZ2U7CiAKLXN0YXRpYyBDR0Nv
bnRleHRSZWYgQ0dDb250ZXh0V2l0aEhEQyhIREMgaGRjKQotewotICAgIEhCSVRNQVAgYml0bWFw
ID0gKEhCSVRNQVApR2V0Q3VycmVudE9iamVjdChoZGMsIE9CSl9CSVRNQVApOwotICAgIENHQ29s
b3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKLSAg
ICBCSVRNQVAgaW5mbzsKLQotICAgIEdldE9iamVjdChiaXRtYXAsIHNpemVvZihpbmZvKSwgJmlu
Zm8pOwotICAgIEFTU0VSVChpbmZvLmJtQml0c1BpeGVsID09IDMyKTsKLSAgICBDR0NvbnRleHRS
ZWYgY29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZShpbmZvLmJtQml0cywgaW5mby5ibVdp
ZHRoLCBpbmZvLmJtSGVpZ2h0LCA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGluZm8uYm1XaWR0aEJ5dGVzLCBkZXZpY2VSR0IsIGtDR0JpdG1hcEJ5
dGVPcmRlcjMyTGl0dGxlIHwga0NHSW1hZ2VBbHBoYU5vbmVTa2lwRmlyc3QpOwotICAgIENHQ29s
b3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKLQotICAgIC8vIEZsaXAgY29vcmRzCi0gICAgQ0dD
b250ZXh0VHJhbnNsYXRlQ1RNKGNvbnRleHQsIDAsIGluZm8uYm1IZWlnaHQpOwotICAgIENHQ29u
dGV4dFNjYWxlQ1RNKGNvbnRleHQsIDEsIC0xKTsKLSAgICAKLSAgICAvLyBQdXQgdGhlIEhEQyBJ
biBhZHZhbmNlZCBtb2RlIHNvIGl0IHdpbGwgaG9ub3IgYWZmaW5lIHRyYW5zZm9ybXMuCi0gICAg
U2V0R3JhcGhpY3NNb2RlKGhkYywgR01fQURWQU5DRUQpOwotICAgIAotICAgIHJldHVybiBjb250
ZXh0OwotfQotCi1HcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dChIREMgaGRjKQotICAg
IDogbV9jb21tb24oY3JlYXRlR3JhcGhpY3NDb250ZXh0UHJpdmF0ZSgpKQotICAgICwgbV9kYXRh
KG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoQ0dDb250ZXh0V2l0aEhEQyhoZGMp
KSkKLXsKLSAgICBDR0NvbnRleHRSZWxlYXNlKG1fZGF0YS0+bV9jZ0NvbnRleHQpOwotICAgIG1f
ZGF0YS0+bV9oZGMgPSBoZGM7Ci0gICAgc2V0UGFpbnRpbmdEaXNhYmxlZCghbV9kYXRhLT5tX2Nn
Q29udGV4dCk7Ci0gICAgaWYgKG1fZGF0YS0+bV9jZ0NvbnRleHQpIHsKLSAgICAgICAgLy8gTWFr
ZSBzdXJlIHRoZSBjb250ZXh0IHN0YXJ0cyBpbiBzeW5jIHdpdGggb3VyIHN0YXRlLgotICAgICAg
ICBzZXRQbGF0Zm9ybUZpbGxDb2xvcihmaWxsQ29sb3IoKSk7Ci0gICAgICAgIHNldFBsYXRmb3Jt
U3Ryb2tlQ29sb3Ioc3Ryb2tlQ29sb3IoKSk7Ci0gICAgfQotfQotCi1IREMgR3JhcGhpY3NDb250
ZXh0OjpnZXRXaW5kb3dzQ29udGV4dChjb25zdCBJbnRSZWN0JiBkc3RSZWN0LCBib29sIHN1cHBv
cnRBbHBoYUJsZW5kKQotewotICAgIGlmIChpblRyYW5zcGFyZW5jeUxheWVyKCkpIHsKLSAgICAg
ICAgaWYgKGRzdFJlY3QuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAg
ICAgLy8gQ3JlYXRlIGEgYml0bWFwIERDIGluIHdoaWNoIHRvIGRyYXcuCi0gICAgICAgIEJJVE1B
UElORk8gYml0bWFwSW5mbzsKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlTaXplICAg
ICAgICAgID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOwotICAgICAgICBiaXRtYXBJbmZvLmJt
aUhlYWRlci5iaVdpZHRoICAgICAgICAgPSBkc3RSZWN0LndpZHRoKCk7IAotICAgICAgICBiaXRt
YXBJbmZvLmJtaUhlYWRlci5iaUhlaWdodCAgICAgICAgPSBkc3RSZWN0LmhlaWdodCgpOwotICAg
ICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVBsYW5lcyAgICAgICAgPSAxOwotICAgICAgICBi
aXRtYXBJbmZvLmJtaUhlYWRlci5iaUJpdENvdW50ICAgICAgPSAzMjsKLSAgICAgICAgYml0bWFw
SW5mby5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiAgID0gQklfUkdCOwotICAgICAgICBiaXRtYXBJ
bmZvLmJtaUhlYWRlci5iaVNpemVJbWFnZSAgICAgPSAwOwotICAgICAgICBiaXRtYXBJbmZvLmJt
aUhlYWRlci5iaVhQZWxzUGVyTWV0ZXIgPSAwOwotICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRl
ci5iaVlQZWxzUGVyTWV0ZXIgPSAwOwotICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUNs
clVzZWQgICAgICAgPSAwOwotICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUNsckltcG9y
dGFudCAgPSAwOwotCi0gICAgICAgIHZvaWQqIHBpeGVscyA9IDA7Ci0gICAgICAgIEhCSVRNQVAg
Yml0bWFwID0gOjpDcmVhdGVESUJTZWN0aW9uKE5VTEwsICZiaXRtYXBJbmZvLCBESUJfUkdCX0NP
TE9SUywgJnBpeGVscywgMCwgMCk7Ci0gICAgICAgIGlmICghYml0bWFwKQotICAgICAgICAgICAg
cmV0dXJuIDA7Ci0KLSAgICAgICAgSERDIGJpdG1hcERDID0gOjpDcmVhdGVDb21wYXRpYmxlREMo
bV9kYXRhLT5tX2hkYyk7Ci0gICAgICAgIDo6U2VsZWN0T2JqZWN0KGJpdG1hcERDLCBiaXRtYXAp
OwotCi0gICAgICAgIC8vIEZpbGwgb3VyIGJ1ZmZlciB3aXRoIGNsZWFyIGlmIHdlJ3JlIGdvaW5n
IHRvIGFscGhhIGJsZW5kLgotICAgICAgICBpZiAoc3VwcG9ydEFscGhhQmxlbmQpIHsKLSAgICAg
ICAgICAgIEJJVE1BUCBibXBJbmZvOwotICAgICAgICAgICAgR2V0T2JqZWN0KGJpdG1hcCwgc2l6
ZW9mKGJtcEluZm8pLCAmYm1wSW5mbyk7Ci0gICAgICAgICAgICBpbnQgYnVmZmVyU2l6ZSA9IGJt
cEluZm8uYm1XaWR0aEJ5dGVzICogYm1wSW5mby5ibUhlaWdodDsKLSAgICAgICAgICAgIG1lbXNl
dChibXBJbmZvLmJtQml0cywgMCwgYnVmZmVyU2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAv
LyBNYWtlIHN1cmUgd2UgY2FuIGRvIHdvcmxkIHRyYW5zZm9ybXMuCi0gICAgICAgIFNldEdyYXBo
aWNzTW9kZShiaXRtYXBEQywgR01fQURWQU5DRUQpOwotCi0gICAgICAgIC8vIEFwcGx5IGEgdHJh
bnNsYXRpb24gdG8gb3VyIGNvbnRleHQgc28gdGhhdCB0aGUgZHJhd2luZyBkb25lIHdpbGwgYmUg
YXQgKDAsMCkgb2YgdGhlIGJpdG1hcC4KLSAgICAgICAgWEZPUk0geGZvcm07Ci0gICAgICAgIHhm
b3JtLmVNMTEgPSAxLjA7Ci0gICAgICAgIHhmb3JtLmVNMTIgPSAwOwotICAgICAgICB4Zm9ybS5l
TTIxID0gMDsKLSAgICAgICAgeGZvcm0uZU0yMiA9IDEuMDsKLSAgICAgICAgeGZvcm0uZUR4ID0g
LWRzdFJlY3QueCgpOwotICAgICAgICB4Zm9ybS5lRHkgPSAtZHN0UmVjdC55KCk7Ci0gICAgICAg
IDo6U2V0V29ybGRUcmFuc2Zvcm0oYml0bWFwREMsICZ4Zm9ybSk7Ci0KLSAgICAgICAgcmV0dXJu
IGJpdG1hcERDOwotICAgIH0KLQotICAgIENHQ29udGV4dEZsdXNoKHBsYXRmb3JtQ29udGV4dCgp
KTsKLSAgICBtX2RhdGEtPnNhdmUoKTsKLSAgICByZXR1cm4gbV9kYXRhLT5tX2hkYzsKLX0KLQog
Ym9vbCBHcmFwaGljc0NvbnRleHQ6OmluVHJhbnNwYXJlbmN5TGF5ZXIoKSBjb25zdCB7IHJldHVy
biBtX2RhdGEtPm1fdHJhbnNwYXJlbmN5Q291bnQ7IH0KIAotdm9pZCBHcmFwaGljc0NvbnRleHQ6
OnJlbGVhc2VXaW5kb3dzQ29udGV4dChIREMgaGRjLCBjb25zdCBJbnRSZWN0JiBkc3RSZWN0LCBi
b29sIHN1cHBvcnRBbHBoYUJsZW5kKQotewotICAgIGlmIChoZGMgJiYgaW5UcmFuc3BhcmVuY3lM
YXllcigpKSB7Ci0gICAgICAgIGlmIChkc3RSZWN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJl
dHVybjsKLQotICAgICAgICBIQklUTUFQIGJpdG1hcCA9IChIQklUTUFQKUdldEN1cnJlbnRPYmpl
Y3QoaGRjLCBPQkpfQklUTUFQKTsKLQotICAgICAgICAvLyBOZWVkIHRvIG1ha2UgYSBDR0ltYWdl
IG91dCBvZiB0aGUgYml0bWFwJ3MgcGl4ZWwgYnVmZmVyIGFuZCB0aGVuIGRyYXcKLSAgICAgICAg
Ly8gaXQgaW50byBvdXIgY29udGV4dC4KLSAgICAgICAgQklUTUFQIGluZm87Ci0gICAgICAgIEdl
dE9iamVjdChiaXRtYXAsIHNpemVvZihpbmZvKSwgJmluZm8pOwotICAgICAgICBBU1NFUlQoaW5m
by5ibUJpdHNQaXhlbCA9PSAzMik7Ci0KLSAgICAgICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJH
QiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwotICAgICAgICBDR0NvbnRleHRSZWYg
Yml0bWFwQ29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZShpbmZvLmJtQml0cywgaW5mby5i
bVdpZHRoLCBpbmZvLmJtSGVpZ2h0LCA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmJtV2lkdGhCeXRlcywgZGV2aWNlUkdC
LCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3VwcG9ydEFscGhhQmxlbmQgPyBr
Q0dJbWFnZUFscGhhUHJlbXVsdGlwbGllZEZpcnN0IDoga0NHSW1hZ2VBbHBoYU5vbmVTa2lwRmly
c3QpKTsKLSAgICAgICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOwotCi0gICAgICAg
IENHSW1hZ2VSZWYgaW1hZ2UgPSBDR0JpdG1hcENvbnRleHRDcmVhdGVJbWFnZShiaXRtYXBDb250
ZXh0KTsKLSAgICAgICAgQ0dDb250ZXh0RHJhd0ltYWdlKG1fZGF0YS0+bV9jZ0NvbnRleHQsIGRz
dFJlY3QsIGltYWdlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIERlbGV0ZSBhbGwgb3VyIGp1bmsu
Ci0gICAgICAgIENHSW1hZ2VSZWxlYXNlKGltYWdlKTsKLSAgICAgICAgQ0dDb250ZXh0UmVsZWFz
ZShiaXRtYXBDb250ZXh0KTsKLSAgICAgICAgOjpEZWxldGVEQyhoZGMpOwotICAgICAgICA6OkRl
bGV0ZU9iamVjdChiaXRtYXApOwotCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtX2Rh
dGEtPnJlc3RvcmUoKTsKLX0KLQogdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6
OnNhdmUoKQogewogICAgIGlmICghbV9oZGMpCkBAIC0yNDIsMTM4ICsxMTIsNiBAQCB2b2lkIEdy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6dHJhCiAgICAgTW9kaWZ5V29ybGRUcmFuc2Zv
cm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7CiB9CiAKLXZvaWQgR3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlOjpjb25jYXRDVE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0
cmFuc2Zvcm0pCi17Ci0gICAgaWYgKCFtX2hkYykKLSAgICAgICAgcmV0dXJuOwotICAgIENHQWZm
aW5lVHJhbnNmb3JtIG1hdCA9IHRyYW5zZm9ybTsKLSAgICBYRk9STSB4Zm9ybTsKLSAgICB4Zm9y
bS5lTTExID0gbWF0LmE7Ci0gICAgeGZvcm0uZU0xMiA9IG1hdC5iOwotICAgIHhmb3JtLmVNMjEg
PSBtYXQuYzsKLSAgICB4Zm9ybS5lTTIyID0gbWF0LmQ7Ci0gICAgeGZvcm0uZUR4ID0gbWF0LnR4
OwotICAgIHhmb3JtLmVEeSA9IG1hdC50eTsKLSAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShtX2hk
YywgJnhmb3JtLCBNV1RfTEVGVE1VTFRJUExZKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6
OmRyYXdGb2N1c1JpbmcoY29uc3QgQ29sb3ImIGNvbG9yKQotewotICAgIGlmIChwYWludGluZ0Rp
c2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGZsb2F0IHJhZGl1cyA9IChmb2N1c1Jp
bmdXaWR0aCgpIC0gMSkgLyAyLjBmOwotICAgIGludCBvZmZzZXQgPSByYWRpdXMgKyBmb2N1c1Jp
bmdPZmZzZXQoKTsKLSAgICBDR0NvbG9yUmVmIGNvbG9yUmVmID0gY29sb3IuaXNWYWxpZCgpID8g
Y2dDb2xvcihjb2xvcikgOiAwOwotCi0gICAgQ0dNdXRhYmxlUGF0aFJlZiBmb2N1c1JpbmdQYXRo
ID0gQ0dQYXRoQ3JlYXRlTXV0YWJsZSgpOwotICAgIGNvbnN0IFZlY3RvcjxJbnRSZWN0PiYgcmVj
dHMgPSBmb2N1c1JpbmdSZWN0cygpOwotICAgIHVuc2lnbmVkIHJlY3RDb3VudCA9IHJlY3RzLnNp
emUoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcmVjdENvdW50OyBpKyspCi0gICAg
ICAgIENHUGF0aEFkZFJlY3QoZm9jdXNSaW5nUGF0aCwgMCwgQ0dSZWN0SW5zZXQocmVjdHNbaV0s
IC1vZmZzZXQsIC1vZmZzZXQpKTsKLQotICAgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gcGxhdGZv
cm1Db250ZXh0KCk7Ci0gICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShjb250ZXh0KTsKLQotICAgIENH
Q29udGV4dEJlZ2luUGF0aChjb250ZXh0KTsKLSAgICBDR0NvbnRleHRBZGRQYXRoKGNvbnRleHQs
IGZvY3VzUmluZ1BhdGgpOwotCi0gICAgd2tEcmF3Rm9jdXNSaW5nKGNvbnRleHQsIGNvbG9yUmVm
LCByYWRpdXMpOwotCi0gICAgQ0dDb2xvclJlbGVhc2UoY29sb3JSZWYpOwotCi0gICAgQ0dQYXRo
UmVsZWFzZShmb2N1c1JpbmdQYXRoKTsKLQotICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29u
dGV4dCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBDb2xvciYgc3BlbGxpbmdQYXR0ZXJuQ29sb3IoKSB7
Ci0gICAgc3RhdGljIGNvbnN0IENvbG9yIHNwZWxsaW5nQ29sb3IoMjU1LCAwLCAwKTsKLSAgICBy
ZXR1cm4gc3BlbGxpbmdDb2xvcjsKLX0KLQotc3RhdGljIGNvbnN0IENvbG9yJiBncmFtbWFyUGF0
dGVybkNvbG9yKCkgewotICAgIHN0YXRpYyBjb25zdCBDb2xvciBncmFtbWFyQ29sb3IoMCwgMTI4
LCAwKTsKLSAgICByZXR1cm4gZ3JhbW1hckNvbG9yOwotfQotCi0vLyBQdWxsZWQgZnJvbSBHcmFw
aGljc0NvbnRleHRDRwotc3RhdGljIHZvaWQgc2V0Q0dTdHJva2VDb2xvcihDR0NvbnRleHRSZWYg
Y29udGV4dCwgY29uc3QgQ29sb3ImIGNvbG9yKQotewotICAgIENHRmxvYXQgcmVkLCBncmVlbiwg
Ymx1ZSwgYWxwaGE7Ci0gICAgY29sb3IuZ2V0UkdCQShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7
Ci0gICAgQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IoY29udGV4dCwgcmVkLCBncmVlbiwgYmx1
ZSwgYWxwaGEpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JNaXNzcGVs
bGluZ09yQmFkR3JhbW1hcihjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCB3aWR0aCwgYm9vbCBn
cmFtbWFyKQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsK
LSAgICAKLSAgICAvLyBUaGVzZSBhcmUgdGhlIHNhbWUgZm9yIG1pc3NwZWxsaW5nIG9yIGJhZCBn
cmFtbWFyCi0gICAgY29uc3QgaW50IHBhdHRlcm5IZWlnaHQgPSAzOyAvLyAzIHJvd3MKLSAgICBB
U1NFUlQoY01pc3NwZWxsaW5nTGluZVRoaWNrbmVzcyA9PSBwYXR0ZXJuSGVpZ2h0KTsKLSAgICBj
b25zdCBpbnQgcGF0dGVybldpZHRoID0gNDsgLy8gNCBwaXhlbHMKLSAgICBBU1NFUlQocGF0dGVy
bldpZHRoID09IGNNaXNzcGVsbGluZ0xpbmVQYXR0ZXJuV2lkdGgpOwotCi0gICAgLy8gTWFrZSBz
dXJlIHRvIGRyYXcgb25seSBjb21wbGV0ZSBkb3RzLgotICAgIC8vIE5PVEU6IENvZGUgaGVyZSB1
c2VkIHRvIHNoaWZ0IHRoZSB1bmRlcmxpbmUgdG8gdGhlIGxlZnQgYW5kIGluY3JlYXNlIHRoZSB3
aWR0aAotICAgIC8vIHRvIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGdldHMgdW5kZXJsaW5lZCwgYnV0
IHRoYXQgcmVzdWx0cyBpbiBkcmF3aW5nIG91dCBvZgotICAgIC8vIGJvdW5kcyAoZS5nLiB3aGVu
IGF0IHRoZSBlZGdlIG9mIGEgdmlldykgYW5kIGNvdWxkIG1ha2UgaXQgYXBwZWFyIHRoYXQgdGhl
Ci0gICAgLy8gc3BhY2UgYmV0d2VlbiBhZGphY2VudCBtaXNzcGVsbGVkIHdvcmRzIHdhcyB1bmRl
cmxpbmVkLgotICAgIC8vIGFsbG93IHNsaWdodGx5IG1vcmUgY29uc2lkZXJpbmcgdGhhdCB0aGUg
cGF0dGVybiBlbmRzIHdpdGggYSB0cmFuc3BhcmVudCBwaXhlbAotICAgIGludCB3aWR0aE1vZCA9
IHdpZHRoICUgcGF0dGVybldpZHRoOwotICAgIGlmIChwYXR0ZXJuV2lkdGggLSB3aWR0aE1vZCA+
IGNNaXNzcGVsbGluZ0xpbmVQYXR0ZXJuR2FwV2lkdGgpCi0gICAgICAgIHdpZHRoIC09IHdpZHRo
TW9kOwotICAgICAgCi0gICAgLy8gRHJhdyB0aGUgdW5kZXJsaW5lCi0gICAgQ0dDb250ZXh0UmVm
IGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsKLSAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNv
bnRleHQpOwotCi0gICAgY29uc3QgQ29sb3ImIHBhdHRlcm5Db2xvciA9IGdyYW1tYXIgPyBncmFt
bWFyUGF0dGVybkNvbG9yKCkgOiBzcGVsbGluZ1BhdHRlcm5Db2xvcigpOwotICAgIHNldENHU3Ry
b2tlQ29sb3IoY29udGV4dCwgcGF0dGVybkNvbG9yKTsKLQotICAgIHdrU2V0UGF0dGVyblBoYXNl
SW5Vc2VyU3BhY2UoY29udGV4dCwgcG9pbnQpOwotICAgIENHQ29udGV4dFNldEJsZW5kTW9kZShj
b250ZXh0LCBrQ0dCbGVuZE1vZGVOb3JtYWwpOwotICAgIAotICAgIC8vIDMgcm93cywgZWFjaCBv
ZmZzZXQgYnkgaGFsZiBhIHBpeGVsIGZvciBibGVuZGluZyBwdXJwb3NlcwotICAgIGNvbnN0IENH
UG9pbnQgdXBwZXJQb2ludHMgW10gPSB7e3BvaW50LngoKSwgcG9pbnQueSgpICsgcGF0dGVybkhl
aWdodCAtIDIuNSB9LCB7cG9pbnQueCgpICsgd2lkdGgsIHBvaW50LnkoKSArIHBhdHRlcm5IZWln
aHQgLSAyLjV9fTsKLSAgICBjb25zdCBDR1BvaW50IG1pZGRsZVBvaW50cyBbXSA9IHt7cG9pbnQu
eCgpLCBwb2ludC55KCkgKyBwYXR0ZXJuSGVpZ2h0IC0gMS41IH0sIHtwb2ludC54KCkgKyB3aWR0
aCwgcG9pbnQueSgpICsgcGF0dGVybkhlaWdodCAtIDEuNX19OwotICAgIGNvbnN0IENHUG9pbnQg
bG93ZXJQb2ludHMgW10gPSB7e3BvaW50LngoKSwgcG9pbnQueSgpICsgcGF0dGVybkhlaWdodCAt
IDAuNSB9LCB7cG9pbnQueCgpICsgd2lkdGgsIHBvaW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAw
LjUgfX07Ci0gICAgCi0gICAgLy8gRGFzaCBsZW5ndGhzIGZvciB0aGUgdG9wIGFuZCBib3R0b20g
b2YgdGhlIGVycm9yIHVuZGVybGluZSBhcmUgdGhlIHNhbWUuCi0gICAgLy8gVGhlc2UgYXJlIG1h
Z2ljLgotICAgIHN0YXRpYyBjb25zdCBmbG9hdCBlZGdlX2Rhc2hfbGVuZ3Roc1tdID0gezIsIDJ9
OwotICAgIHN0YXRpYyBjb25zdCBmbG9hdCBtaWRkbGVfZGFzaF9sZW5ndGhzW10gPSB7Mi43NmYs
IDEuMjRmfTsKLSAgICBzdGF0aWMgY29uc3QgZmxvYXQgZWRnZV9vZmZzZXQgPSAtKGVkZ2VfZGFz
aF9sZW5ndGhzWzFdIC0gMS4wZikgLyAyLjBmOwotICAgIHN0YXRpYyBjb25zdCBmbG9hdCBtaWRk
bGVfb2Zmc2V0ID0gLShtaWRkbGVfZGFzaF9sZW5ndGhzWzFdIC0gMS4wZikgLyAyLjBmOwotCi0g
ICAgLy8gTGluZSBvcGFjaXRpZXMuICBPbmNlIGFnYWluLCB0aGVzZSBhcmUgbWFnaWMuCi0gICAg
Y29uc3QgZmxvYXQgdXBwZXJPcGFjaXR5ID0gMC4zM2Y7Ci0gICAgY29uc3QgZmxvYXQgbWlkZGxl
T3BhY2l0eSA9IDAuNzVmOwotICAgIGNvbnN0IGZsb2F0IGxvd2VyT3BhY2l0eSA9IDAuODhmOwot
Ci0gICAgLy9Ub3AgbGluZQotICAgIENHQ29udGV4dFNldExpbmVEYXNoKGNvbnRleHQsIGVkZ2Vf
b2Zmc2V0LCBlZGdlX2Rhc2hfbGVuZ3RocywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6
ZW9mKGVkZ2VfZGFzaF9sZW5ndGhzKSAvIHNpemVvZihlZGdlX2Rhc2hfbGVuZ3Roc1swXSkpOwot
ICAgIENHQ29udGV4dFNldEFscGhhKGNvbnRleHQsIHVwcGVyT3BhY2l0eSk7Ci0gICAgQ0dDb250
ZXh0U3Ryb2tlTGluZVNlZ21lbnRzKGNvbnRleHQsIHVwcGVyUG9pbnRzLCAyKTsKLSAKLSAgICAv
LyBNaWRkbGUgbGluZQotICAgIENHQ29udGV4dFNldExpbmVEYXNoKGNvbnRleHQsIG1pZGRsZV9v
ZmZzZXQsIG1pZGRsZV9kYXNoX2xlbmd0aHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgIHNp
emVvZihtaWRkbGVfZGFzaF9sZW5ndGhzKSAvIHNpemVvZihtaWRkbGVfZGFzaF9sZW5ndGhzWzBd
KSk7Ci0gICAgQ0dDb250ZXh0U2V0QWxwaGEoY29udGV4dCwgbWlkZGxlT3BhY2l0eSk7Ci0gICAg
Q0dDb250ZXh0U3Ryb2tlTGluZVNlZ21lbnRzKGNvbnRleHQsIG1pZGRsZVBvaW50cywgMik7Ci0g
ICAgCi0gICAgLy8gQm90dG9tIGxpbmUKLSAgICBDR0NvbnRleHRTZXRMaW5lRGFzaChjb250ZXh0
LCBlZGdlX29mZnNldCwgZWRnZV9kYXNoX2xlbmd0aHMsCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgc2l6ZW9mKGVkZ2VfZGFzaF9sZW5ndGhzKSAvIHNpemVvZihlZGdlX2Rhc2hfbGVuZ3Roc1sw
XSkpOwotICAgIENHQ29udGV4dFNldEFscGhhKGNvbnRleHQsIGxvd2VyT3BhY2l0eSk7Ci0gICAg
Q0dDb250ZXh0U3Ryb2tlTGluZVNlZ21lbnRzKGNvbnRleHQsIGxvd2VyUG9pbnRzLCAyKTsKLQot
ICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29udGV4dCk7Ci19Ci0KICNpZiBFTkFCTEUoU1ZH
KQogR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0Rm9ySW1hZ2UoU1ZHUmVzb3VyY2VJbWFnZSopCiB7
CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZUNHV2luLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZUNHV2luLmNwcAko
cmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ0dXaW4u
Y3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkltYWdlLmgiCisjaW5jbHVkZSAiQml0bWFw
SW1hZ2UuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlIDxBcHBsaWNh
dGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KKworI2luY2x1ZGUgPHdpbmRvd3Mu
aD4KKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K2Jvb2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVBPZlNpemUoSEJJVE1BUCBibXAsIExQU0laRSBz
aXplKQoreworICAgIEFTU0VSVChibXApOworCisgICAgQklUTUFQIGJtcEluZm87CisgICAgR2V0
T2JqZWN0KGJtcCwgc2l6ZW9mKEJJVE1BUCksICZibXBJbmZvKTsKKworICAgIEFTU0VSVChibXBJ
bmZvLmJtQml0c1BpeGVsID09IDMyKTsKKyAgICBpbnQgYnVmZmVyU2l6ZSA9IGJtcEluZm8uYm1X
aWR0aEJ5dGVzICogYm1wSW5mby5ibUhlaWdodDsKKyAgICAKKyAgICBDR0NvbG9yU3BhY2VSZWYg
ZGV2aWNlUkdCID0gQ0dDb2xvclNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7CisgICAgQ0dDb250ZXh0
UmVmIGNnQ29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZShibXBJbmZvLmJtQml0cywgYm1w
SW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0LAorICAgICAgICA4LCBibXBJbmZvLmJtV2lk
dGhCeXRlcywgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IGtDR0ltYWdl
QWxwaGFQcmVtdWx0aXBsaWVkRmlyc3QpOworICAKKyAgICBHcmFwaGljc0NvbnRleHQgZ2MoY2dD
b250ZXh0KTsKKworICAgIEludFNpemUgaW1hZ2VTaXplID0gQml0bWFwSW1hZ2U6OnNpemUoKTsK
KyAgICBpZiAoc2l6ZSkKKyAgICAgICAgZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXplKCZnYywg
RmxvYXRSZWN0KDAsIDAsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCksIEludFNp
emUoKnNpemUpLCBDb21wb3NpdGVDb3B5KTsKKyAgICBlbHNlCisgICAgICAgIGRyYXcoJmdjLCBG
bG9hdFJlY3QoMCwgMCwgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwgRmxvYXRS
ZWN0KDAsIDAsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBDb21wb3Np
dGVDb3B5KTsKKworICAgIC8vIERvIGNsZWFudXAKKyAgICBDR0NvbnRleHRSZWxlYXNlKGNnQ29u
dGV4dCk7CisgICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOworCisgICAgcmV0dXJu
IHRydWU7Cit9CisKK3ZvaWQgQml0bWFwSW1hZ2U6OmRyYXdGcmFtZU1hdGNoaW5nU291cmNlU2l6
ZShHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgY29uc3Qg
SW50U2l6ZSYgc3JjU2l6ZSwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApCit7CisgICAg
aW50IGZyYW1lcyA9IGZyYW1lQ291bnQoKTsKKyAgICBzaXplX3QgaW1hZ2VIZWlnaHQgPSAwOwor
ICAgIHNpemVfdCBpbWFnZVdpZHRoID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1l
czsgKytpKSB7CisgICAgICAgIE5hdGl2ZUltYWdlUHRyIGltYWdlID0gZnJhbWVBdEluZGV4KGkp
OworICAgICAgICBpbWFnZUhlaWdodCA9IENHSW1hZ2VHZXRIZWlnaHQoaW1hZ2UpOworICAgICAg
ICBpbWFnZVdpZHRoID0gQ0dJbWFnZUdldFdpZHRoKGltYWdlKTsKKyAgICAgICAgaWYgKGltYWdl
SGVpZ2h0ID09IChzaXplX3Qpc3JjU2l6ZS5oZWlnaHQoKSAmJiBpbWFnZVdpZHRoID09IChzaXpl
X3Qpc3JjU2l6ZS53aWR0aCgpKSB7CisgICAgICAgICAgICBzaXplX3QgY3VycmVudEZyYW1lID0g
bV9jdXJyZW50RnJhbWU7CisgICAgICAgICAgICBtX2N1cnJlbnRGcmFtZSA9IGk7CisgICAgICAg
ICAgICBkcmF3KGN0eHQsIGRzdFJlY3QsIEZsb2F0UmVjdCgwLCAwLCBzcmNTaXplLndpZHRoKCks
IHNyY1NpemUuaGVpZ2h0KCkpLCBjb21wb3NpdGVPcCk7CisgICAgICAgICAgICBtX2N1cnJlbnRG
cmFtZSA9IGN1cnJlbnRGcmFtZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAg
IH0KKworICAgIC8vIE5vIGltYWdlIG9mIHRoZSBjb3JyZWN0IHNpemUgd2FzIGZvdW5kLCBmYWxs
YmFjayB0byBkcmF3aW5nIHRoZSBjdXJyZW50IGZyYW1lCisgICAgSW50U2l6ZSBpbWFnZVNpemUg
PSBCaXRtYXBJbWFnZTo6c2l6ZSgpOworICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRSZWN0
KDAsIDAsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBjb21wb3NpdGVP
cCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKClByb3BlcnR5IGNoYW5nZXMgb246IFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ0dXaW4uY3BwCl9fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KTmFt
ZTogc3ZuOmV4ZWN1dGFibGUKICAgKyAqCgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW4vSW1hZ2VDYWlyb1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW4vSW1hZ2VDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZUNhaXJvV2luLmNwcAkocmV2aXNpb24gMCkKQEAgLTAs
MCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJ
bmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJJbWFnZS5oIgorI2luY2x1ZGUgIkJpdG1hcEltYWdlLmgiCisjaW5jbHVkZSAiR3Jh
cGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSA8Y2Fpcm8uaD4KKworI2luY2x1ZGUgPHdpbmRvd3Mu
aD4KKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K2Jvb2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVBPZlNpemUoSEJJVE1BUCBibXAsIExQU0laRSBz
aXplKQoreworICAgIEFTU0VSVChibXApOworCisgICAgQklUTUFQIGJtcEluZm87CisgICAgR2V0
T2JqZWN0KGJtcCwgc2l6ZW9mKEJJVE1BUCksICZibXBJbmZvKTsKKworICAgIC8vIElmIHRoaXMg
aXMgYSAzMmJwcCBiaXRtYXAsIHdoaWNoIGl0IGFsd2F5cyBzaG91bGQgYmUsIHdlJ2xsIGNsZWFy
IGl0IHNvIGFscGhhLXdpc2UgaXQgd2lsbCBiZSB2aXNpYmxlCisgICAgaWYgKGJtcEluZm8uYm1C
aXRzUGl4ZWwgPT0gMzIpIHsKKyAgICAgICAgaW50IGJ1ZmZlclNpemUgPSBibXBJbmZvLmJtV2lk
dGhCeXRlcyAqIGJtcEluZm8uYm1IZWlnaHQ7CisgICAgICAgIG1lbXNldChibXBJbmZvLmJtQml0
cywgMjU1LCBidWZmZXJTaXplKTsKKyAgICB9CisgCQorICAgIEhEQyB0ZW1wREMgPSBDcmVhdGVD
b21wYXRpYmxlREMoMCk7CisgICAgaWYgKCF0ZW1wREMpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJG
YWlsZWQgdG8gY3JlYXRlIGluLW1lbW9yeSBEQyBmb3IgSW1hZ2U6OmJsaXQoKSIpOworICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFNlbGVjdE9iamVjdCh0ZW1wREMsIGJtcCk7Cisg
ICAgR3JhcGhpY3NDb250ZXh0IGdjKHRlbXBEQyk7CisjZW5kaWYKKworICAgIEludFNpemUgaW1h
Z2VTaXplID0gQml0bWFwSW1hZ2U6OnNpemUoKTsKKyAgICBpZiAoc2l6ZSkKKyAgICAgICAgZHJh
d0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXplKCZnYywgRmxvYXRSZWN0KDAsIDAsIGJtcEluZm8uYm1X
aWR0aCwgYm1wSW5mby5ibUhlaWdodCksIEludFNpemUoKnNpemUpLCBDb21wb3NpdGVDb3B5KTsK
KyAgICBlbHNlCisgICAgICAgIGRyYXcoJmdjLCBGbG9hdFJlY3QoMCwgMCwgYm1wSW5mby5ibVdp
ZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwgRmxvYXRSZWN0KDAsIDAsIGltYWdlU2l6ZS53aWR0aCgp
LCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBDb21wb3NpdGVDb3B5KTsKKworICAgIC8vIERvIGNsZWFu
dXAKKyAgICAvLyBEbyBjbGVhbnVwCisgICAgRGVsZXRlREModGVtcERDKTsKKworICAgIHJldHVy
biB0cnVlOworfQorCit2b2lkIEJpdG1hcEltYWdlOjpkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNp
emUoR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBGbG9hdFJlY3QmIGRzdFJlY3QsIGNvbnN0
IEludFNpemUmIHNyY1NpemUsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQoreworICAg
IGludCBmcmFtZXMgPSBmcmFtZUNvdW50KCk7CisgICAgc2l6ZV90IGltYWdlSGVpZ2h0ID0gMDsK
KyAgICBzaXplX3QgaW1hZ2VXaWR0aCA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFt
ZXM7ICsraSkgeworICAgICAgICBOYXRpdmVJbWFnZVB0ciBpbWFnZSA9IGZyYW1lQXRJbmRleChp
KTsKKyAgICAgICAgaW1hZ2VIZWlnaHQgPSBjYWlyb19pbWFnZV9zdXJmYWNlX2dldF9oZWlnaHQo
aW1hZ2UpOworICAgICAgICBpbWFnZVdpZHRoID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfd2lk
dGgoaW1hZ2UpOworICAgICAgICBpZiAoaW1hZ2VIZWlnaHQgPT0gKHNpemVfdClzcmNTaXplLmhl
aWdodCgpICYmIGltYWdlV2lkdGggPT0gKHNpemVfdClzcmNTaXplLndpZHRoKCkpIHsKKyAgICAg
ICAgICAgIHNpemVfdCBjdXJyZW50RnJhbWUgPSBtX2N1cnJlbnRGcmFtZTsKKyAgICAgICAgICAg
IG1fY3VycmVudEZyYW1lID0gaTsKKyAgICAgICAgICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxv
YXRSZWN0KDAsIDAsIHNyY1NpemUud2lkdGgoKSwgc3JjU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0
ZU9wKTsKKyAgICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gY3VycmVudEZyYW1lOworICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTm8gaW1hZ2Ugb2YgdGhl
IGNvcnJlY3Qgc2l6ZSB3YXMgZm91bmQsIGZhbGxiYWNrIHRvIGRyYXdpbmcgdGhlIGN1cnJlbnQg
ZnJhbWUKKyAgICBJbnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcEltYWdlOjpzaXplKCk7CisgICAg
ZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJlY3QoMCwgMCwgaW1hZ2VTaXplLndpZHRoKCksIGlt
YWdlU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQoKUHJvcGVydHkgY2hhbmdlcyBvbjogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4v
SW1hZ2VDYWlyb1dpbi5jcHAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fXwpOYW1lOiBzdm46ZXhlY3V0YWJsZQogICArICoK
CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZVdpbi5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VXaW4uY3BwCShyZXZp
c2lvbiAyOTcyNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlV2luLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIw
MDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAo
QykgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoK
ICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yNyw5ICsyNyw3IEBACiAjaW5jbHVkZSAi
SW1hZ2UuaCIKICNpbmNsdWRlICJCaXRtYXBJbWFnZS5oIgogI2luY2x1ZGUgIkdyYXBoaWNzQ29u
dGV4dC5oIgotI2luY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNl
cy5oPgogCi0jaW5jbHVkZSA8d2luc29jazIuaD4KICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAjaW5j
bHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKICNpbmNsdWRlICJNSU1FVHlwZVJlZ2lzdHJ5LmgiCkBA
IC02MSw1MCArNTksNCBAQCBib29sIEJpdG1hcEltYWdlOjpnZXRIQklUTUFQKEhCSVRNQVAgYm1w
CiAgICAgcmV0dXJuIGdldEhCSVRNQVBPZlNpemUoYm1wLCAwKTsKIH0KIAotYm9vbCBCaXRtYXBJ
bWFnZTo6Z2V0SEJJVE1BUE9mU2l6ZShIQklUTUFQIGJtcCwgTFBTSVpFIHNpemUpCi17Ci0gICAg
QVNTRVJUKGJtcCk7Ci0KLSAgICBCSVRNQVAgYm1wSW5mbzsKLSAgICBHZXRPYmplY3QoYm1wLCBz
aXplb2YoQklUTUFQKSwgJmJtcEluZm8pOwotCi0gICAgQVNTRVJUKGJtcEluZm8uYm1CaXRzUGl4
ZWwgPT0gMzIpOwotICAgIGludCBidWZmZXJTaXplID0gYm1wSW5mby5ibVdpZHRoQnl0ZXMgKiBi
bXBJbmZvLmJtSGVpZ2h0OwotICAgIAotICAgIENHQ29sb3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBD
R0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKLSAgICBDR0NvbnRleHRSZWYgY2dDb250ZXh0
ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGJtcEluZm8uYm1CaXRzLCBibXBJbmZvLmJtV2lkdGgs
IGJtcEluZm8uYm1IZWlnaHQsCi0gICAgICAgIDgsIGJtcEluZm8uYm1XaWR0aEJ5dGVzLCBkZXZp
Y2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwga0NHSW1hZ2VBbHBoYVByZW11bHRp
cGxpZWRGaXJzdCk7Ci0gIAotICAgIEdyYXBoaWNzQ29udGV4dCBnYyhjZ0NvbnRleHQpOwotICAg
IEludFNpemUgaW1hZ2VTaXplID0gQml0bWFwSW1hZ2U6OnNpemUoKTsKLSAgICBpZiAoc2l6ZSkK
LSAgICAgICAgZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXplKCZnYywgRmxvYXRSZWN0KDAsIDAs
IGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCksIEludFNpemUoKnNpemUpLCBDb21w
b3NpdGVDb3B5KTsKLSAgICBlbHNlCi0gICAgICAgIGRyYXcoJmdjLCBGbG9hdFJlY3QoMCwgMCwg
Ym1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwgRmxvYXRSZWN0KDAsIDAsIGltYWdl
U2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBDb21wb3NpdGVDb3B5KTsKLQotICAg
IC8vIERvIGNsZWFudXAKLSAgICBDR0NvbnRleHRSZWxlYXNlKGNnQ29udGV4dCk7Ci0gICAgQ0dD
b2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lk
IEJpdG1hcEltYWdlOjpkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUoR3JhcGhpY3NDb250ZXh0
KiBjdHh0LCBjb25zdCBGbG9hdFJlY3QmIGRzdFJlY3QsIGNvbnN0IEludFNpemUmIHNyY1NpemUs
IENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQotewotICAgIGludCBmcmFtZXMgPSBmcmFt
ZUNvdW50KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZXM7ICsraSkgewotICAgICAg
ICBDR0ltYWdlUmVmIGltYWdlID0gZnJhbWVBdEluZGV4KGkpOwotICAgICAgICBpZiAoQ0dJbWFn
ZUdldEhlaWdodChpbWFnZSkgPT0gKHNpemVfdClzcmNTaXplLmhlaWdodCgpICYmIENHSW1hZ2VH
ZXRXaWR0aChpbWFnZSkgPT0gKHNpemVfdClzcmNTaXplLndpZHRoKCkpIHsKLSAgICAgICAgICAg
IHNpemVfdCBjdXJyZW50RnJhbWUgPSBtX2N1cnJlbnRGcmFtZTsKLSAgICAgICAgICAgIG1fY3Vy
cmVudEZyYW1lID0gaTsKLSAgICAgICAgICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRSZWN0
KDAsIDAsIHNyY1NpemUud2lkdGgoKSwgc3JjU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsK
LSAgICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gY3VycmVudEZyYW1lOwotICAgICAgICAgICAg
cmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gTm8gaW1hZ2Ugb2YgdGhlIGNvcnJl
Y3Qgc2l6ZSB3YXMgZm91bmQsIGZhbGxiYWNrIHRvIGRyYXdpbmcgdGhlIGN1cnJlbnQgZnJhbWUK
LSAgICBJbnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcEltYWdlOjpzaXplKCk7Ci0gICAgZHJhdyhj
dHh0LCBkc3RSZWN0LCBGbG9hdFJlY3QoMCwgMCwgaW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6
ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsKLX0KLQogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERhdGFDR1dpbi5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9u
dERhdGFDR1dpbi5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbi9TaW1wbGVGb250RGF0YUNHV2luLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxNzgg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUgSW5jLiAgQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4gIE5laXRoZXIgdGhl
IG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YK
KyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90
ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1Mg
T0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgor
ICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU2ltcGxl
Rm9udERhdGEuaCIKKworI2luY2x1ZGUgPHdpbnNvY2syLmg+CisjaW5jbHVkZSAiRm9udC5oIgor
I2luY2x1ZGUgIkZvbnRDYWNoZS5oIgorI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUg
IkZvbnREZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CisjaW5jbHVk
ZSA8dW5pY29kZS91Y2hhci5oPgorI2luY2x1ZGUgPHVuaWNvZGUvdW5vcm0uaD4KKyNpbmNsdWRl
IDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KKyNpbmNsdWRlIDxX
ZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8
bWxhbmcuaD4KKyNpbmNsdWRlIDx0Y2hhci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3Vz
aW5nIHN0ZDo6bWF4OworCitzdGF0aWMgaW5saW5lIGZsb2F0IHNjYWxlRW1Ub1VuaXRzKGZsb2F0
IHgsIHVuc2lnbmVkIHVuaXRzUGVyRW0pIHsgcmV0dXJuIHVuaXRzUGVyRW0gPyB4IC8gKGZsb2F0
KXVuaXRzUGVyRW0gOiB4OyB9CisKK3ZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtSW5pdCgp
Cit7CisgICAgbV9zeW50aGV0aWNCb2xkT2Zmc2V0ID0gbV9mb250LnN5bnRoZXRpY0JvbGQoKSA/
IDEuMGYgOiAwLmY7CisgICAgbV9zY3JpcHRDYWNoZSA9IDA7CisgICAgbV9zY3JpcHRGb250UHJv
cGVydGllcyA9IDA7CisgICAgbV9pc1N5c3RlbUZvbnQgPSBmYWxzZTsKKyAgICAKKyAgICBpZiAo
bV9mb250LnVzZUdESSgpKSB7CisgICAgICAgIEhEQyBoZGMgPSBHZXREQygwKTsKKyAgICAgICAg
SEdESU9CSiBvbGRGb250ID0gU2VsZWN0T2JqZWN0KGhkYywgbV9mb250Lmhmb250KCkpOworICAg
ICAgICBPVVRMSU5FVEVYVE1FVFJJQyBtZXRyaWNzOworICAgICAgICBHZXRPdXRsaW5lVGV4dE1l
dHJpY3MoaGRjLCBzaXplb2YobWV0cmljcyksICZtZXRyaWNzKTsKKyAgICAgICAgVEVYVE1FVFJJ
QyYgdGV4dE1ldHJpY3MgPSBtZXRyaWNzLm90bVRleHRNZXRyaWNzOworICAgICAgICBtX2FzY2Vu
dCA9IHRleHRNZXRyaWNzLnRtQXNjZW50OworICAgICAgICBtX2Rlc2NlbnQgPSB0ZXh0TWV0cmlj
cy50bURlc2NlbnQ7CisgICAgICAgIG1fbGluZUdhcCA9IHRleHRNZXRyaWNzLnRtRXh0ZXJuYWxM
ZWFkaW5nOworICAgICAgICBtX2xpbmVTcGFjaW5nID0gbV9hc2NlbnQgKyBtX2Rlc2NlbnQgKyBt
X2xpbmVHYXA7CisgICAgICAgIG1feEhlaWdodCA9IG1fYXNjZW50ICogMC41NmY7IC8vIEJlc3Qg
Z3Vlc3MgZm9yIHhIZWlnaHQgaWYgbm8geCBnbHlwaCBpcyBwcmVzZW50LgorCisgICAgICAgIEdM
WVBITUVUUklDUyBnbTsKKyAgICAgICAgTUFUMiBtYXQgPSB7IDEsIDAsIDAsIDEgfTsKKyAgICAg
ICAgRFdPUkQgbGVuID0gR2V0R2x5cGhPdXRsaW5lKGhkYywgJ3gnLCBHR09fTUVUUklDUywgJmdt
LCAwLCAwLCAmbWF0KTsKKyAgICAgICAgaWYgKGxlbiAhPSBHRElfRVJST1IgJiYgZ20uZ21wdEds
eXBoT3JpZ2luLnkgPiAwKQorICAgICAgICAgICAgbV94SGVpZ2h0ID0gZ20uZ21wdEdseXBoT3Jp
Z2luLnk7CisKKyAgICAgICAgbV91bml0c1BlckVtID0gbWV0cmljcy5vdG1FTVNxdWFyZTsKKwor
ICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBvbGRGb250KTsKKyAgICAgICAgUmVsZWFzZURDKDAs
IGhkYyk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENHRm9udFJlZiBmb250ID0g
bV9mb250LmNnRm9udCgpOworICAgIGludCBpQXNjZW50ID0gQ0dGb250R2V0QXNjZW50KGZvbnQp
OworICAgIGludCBpRGVzY2VudCA9IENHRm9udEdldERlc2NlbnQoZm9udCk7CisgICAgaW50IGlM
aW5lR2FwID0gQ0dGb250R2V0TGVhZGluZyhmb250KTsKKyAgICBtX3VuaXRzUGVyRW0gPSBDR0Zv
bnRHZXRVbml0c1BlckVtKGZvbnQpOworICAgIGZsb2F0IHBvaW50U2l6ZSA9IG1fZm9udC5zaXpl
KCk7CisgICAgZmxvYXQgZkFzY2VudCA9IHNjYWxlRW1Ub1VuaXRzKGlBc2NlbnQsIG1fdW5pdHNQ
ZXJFbSkgKiBwb2ludFNpemU7CisgICAgZmxvYXQgZkRlc2NlbnQgPSAtc2NhbGVFbVRvVW5pdHMo
aURlc2NlbnQsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7CisgICAgZmxvYXQgZkxpbmVHYXAg
PSBzY2FsZUVtVG9Vbml0cyhpTGluZUdhcCwgbV91bml0c1BlckVtKSAqIHBvaW50U2l6ZTsKKwor
ICAgIGlmICghaXNDdXN0b21Gb250KCkpIHsKKyAgICAgICAgSERDIGRjID0gR2V0REMoMCk7Cisg
ICAgICAgIEhHRElPQkogb2xkRm9udCA9IFNlbGVjdE9iamVjdChkYywgbV9mb250Lmhmb250KCkp
OworICAgICAgICBpbnQgZmFjZUxlbmd0aCA9IEdldFRleHRGYWNlKGRjLCAwLCAwKTsKKyAgICAg
ICAgVmVjdG9yPFRDSEFSPiBmYWNlTmFtZShmYWNlTGVuZ3RoKTsKKyAgICAgICAgR2V0VGV4dEZh
Y2UoZGMsIGZhY2VMZW5ndGgsIGZhY2VOYW1lLmRhdGEoKSk7CisgICAgICAgIG1faXNTeXN0ZW1G
b250ID0gIV90Y3NjbXAoZmFjZU5hbWUuZGF0YSgpLCBfVCgiTHVjaWRhIEdyYW5kZSIpKTsKKyAg
ICAgICAgU2VsZWN0T2JqZWN0KGRjLCBvbGRGb250KTsKKyAgICAgICAgUmVsZWFzZURDKDAsIGRj
KTsKKworICAgICAgICBpZiAoZ2V0U2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrKCkpIHsKKyAgICAg
ICAgICAgIC8vIFRoaXMgY29kZSBjb21lcyBmcm9tIEZvbnREYXRhTWFjLm1tLiBXZSBvbmx5IGV2
ZXIgZG8gdGhpcyB3aGVuIHJ1bm5pbmcgcmVncmVzc2lvbiB0ZXN0cyBzbyB0aGF0IG91ciBtZXRy
aWNzIHdpbGwgbWF0Y2ggTWFjLgorCisgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGFkanVzdCBU
aW1lcywgSGVsdmV0aWNhLCBhbmQgQ291cmllciB0byBjbG9zZWx5IG1hdGNoIHRoZQorICAgICAg
ICAgICAgLy8gdmVydGljYWwgbWV0cmljcyBvZiB0aGVpciBNaWNyb3NvZnQgY291bnRlcnBhcnRz
IHRoYXQgYXJlIHRoZSBkZSBmYWN0bworICAgICAgICAgICAgLy8gd2ViIHN0YW5kYXJkLiBUaGUg
QXBwS2l0IGFkanVzdG1lbnQgb2YgMjAlIGlzIHRvbyBiaWcgYW5kIGlzCisgICAgICAgICAgICAv
LyBpbmNvcnJlY3RseSBhZGRlZCB0byBsaW5lIHNwYWNpbmcsIHNvIHdlIHVzZSBhIDE1JSBhZGp1
c3RtZW50IGluc3RlYWQKKyAgICAgICAgICAgIC8vIGFuZCBhZGQgaXQgdG8gdGhlIGFzY2VudC4K
KyAgICAgICAgICAgIGlmICghX3Rjc2NtcChmYWNlTmFtZS5kYXRhKCksIF9UKCJUaW1lcyIpKSB8
fCAhX3Rjc2NtcChmYWNlTmFtZS5kYXRhKCksIF9UKCJIZWx2ZXRpY2EiKSkgfHwgIV90Y3NjbXAo
ZmFjZU5hbWUuZGF0YSgpLCBfVCgiQ291cmllciIpKSkKKyAgICAgICAgICAgICAgICBmQXNjZW50
ICs9IGZsb29yZigoKGZBc2NlbnQgKyBmRGVzY2VudCkgKiAwLjE1ZikgKyAwLjVmKTsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIG1fYXNjZW50ID0gbHJvdW5kZihmQXNjZW50KTsKKyAgICBtX2Rl
c2NlbnQgPSBscm91bmRmKGZEZXNjZW50KTsKKyAgICBtX2xpbmVHYXAgPSBscm91bmRmKGZMaW5l
R2FwKTsKKyAgICBtX2xpbmVTcGFjaW5nID0gbV9hc2NlbnQgKyBtX2Rlc2NlbnQgKyBtX2xpbmVH
YXA7CisKKyAgICAvLyBNZWFzdXJlIHRoZSBhY3R1YWwgY2hhcmFjdGVyICJ4IiwgYmVjYXVzZSBB
cHBLaXQgc3ludGhlc2l6ZXMgWCBoZWlnaHQgcmF0aGVyIHRoYW4gZ2V0dGluZyBpdCBmcm9tIHRo
ZSBmb250LgorICAgIC8vIFVuZm9ydHVuYXRlbHksIE5TRm9udCB3aWxsIHJvdW5kIHRoaXMgZm9y
IHVzIHNvIHdlIGRvbid0IHF1aXRlIGdldCB0aGUgcmlnaHQgdmFsdWUuCisgICAgR2x5cGhQYWdl
KiBnbHlwaFBhZ2VaZXJvID0gR2x5cGhQYWdlVHJlZU5vZGU6OmdldFJvb3RDaGlsZCh0aGlzLCAw
KS0+cGFnZSgpOworICAgIEdseXBoIHhHbHlwaCA9IGdseXBoUGFnZVplcm8gPyBnbHlwaFBhZ2Va
ZXJvLT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoJ3gnKS5nbHlwaCA6IDA7CisgICAgaWYgKHhHbHlw
aCkgeworICAgICAgICBDR1JlY3QgeEJveDsKKyAgICAgICAgQ0dGb250R2V0R2x5cGhCQm94ZXMo
Zm9udCwgJnhHbHlwaCwgMSwgJnhCb3gpOworICAgICAgICAvLyBVc2UgdGhlIG1heGltdW0gb2Yg
ZWl0aGVyIHdpZHRoIG9yIGhlaWdodCBiZWNhdXNlICJ4IiBpcyBuZWFybHkgc3F1YXJlCisgICAg
ICAgIC8vIGFuZCB3ZWIgcGFnZXMgdGhhdCBmb29saXNobHkgdXNlIHRoaXMgbWV0cmljIGZvciB3
aWR0aCB3aWxsIGJlIGxhaWQgb3V0CisgICAgICAgIC8vIHBvb3JseSBpZiB3ZSByZXR1cm4gYW4g
YWNjdXJhdGUgaGVpZ2h0LiBDbGFzc2ljIGNhc2UgaXMgVGltZXMgMTMgcG9pbnQsCisgICAgICAg
IC8vIHdoaWNoIGhhcyBhbiAieCIgdGhhdCBpcyA3eDYgcGl4ZWxzLgorICAgICAgICBtX3hIZWln
aHQgPSBzY2FsZUVtVG9Vbml0cyhtYXgoQ0dSZWN0R2V0TWF4WCh4Qm94KSwgQ0dSZWN0R2V0TWF4
WSh4Qm94KSksIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7CisgICAgfSBlbHNlIHsKKyAgICAg
ICAgaW50IGlYSGVpZ2h0ID0gQ0dGb250R2V0WEhlaWdodChmb250KTsKKyAgICAgICAgbV94SGVp
Z2h0ID0gc2NhbGVFbVRvVW5pdHMoaVhIZWlnaHQsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7
CisgICAgfQorfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3koKQorewor
ICAgIGlmICghaXNDdXN0b21Gb250KCkpIHsKKyAgICAgICAgRGVsZXRlT2JqZWN0KG1fZm9udC5o
Zm9udCgpKTsKKyAgICAgICAgQ0dGb250UmVsZWFzZShtX2ZvbnQuY2dGb250KCkpOworICAgIH0K
KworICAgIC8vIFdlIGRvbid0IGhhc2ggdGhpcyBvbiBXaW4zMiwgc28gaXQncyBlZmZlY3RpdmVs
eSBvd25lZCBieSB1cy4KKyAgICBkZWxldGUgbV9zbWFsbENhcHNGb250RGF0YTsKKworICAgIFNj
cmlwdEZyZWVDYWNoZSgmbV9zY3JpcHRDYWNoZSk7CisgICAgZGVsZXRlIG1fc2NyaXB0Rm9udFBy
b3BlcnRpZXM7Cit9CisKK2Zsb2F0IFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybVdpZHRoRm9yR2x5
cGgoR2x5cGggZ2x5cGgpIGNvbnN0Cit7CisgICAgaWYgKG1fZm9udC51c2VHREkoKSkgeworICAg
ICAgICBIREMgaGRjID0gR2V0REMoMCk7CisgICAgICAgIEhHRElPQkogb2xkRm9udCA9IFNlbGVj
dE9iamVjdChoZGMsIG1fZm9udC5oZm9udCgpKTsKKyAgICAgICAgaW50IHdpZHRoOworICAgICAg
ICBHZXRDaGFyV2lkdGhJKGhkYywgZ2x5cGgsIDEsIDAsICZ3aWR0aCk7CisgICAgICAgIFNlbGVj
dE9iamVjdChoZGMsIG9sZEZvbnQpOworICAgICAgICBSZWxlYXNlREMoMCwgaGRjKTsKKyAgICAg
ICAgcmV0dXJuIHdpZHRoOworICAgIH0KKworICAgIENHRm9udFJlZiBmb250ID0gbV9mb250LmNn
Rm9udCgpOworICAgIGZsb2F0IHBvaW50U2l6ZSA9IG1fZm9udC5zaXplKCk7CisgICAgQ0dTaXpl
IGFkdmFuY2U7CisgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENHQWZmaW5lVHJhbnNmb3JtTWFr
ZVNjYWxlKHBvaW50U2l6ZSwgcG9pbnRTaXplKTsKKyAKKyAgICAvLyBGSVhNRTogTmVlZCB0byBh
ZGQgcmVhbCBzdXBwb3J0IGZvciBwcmludGVyIGZvbnRzLgorICAgIGJvb2wgaXNQcmludGVyRm9u
dCA9IGZhbHNlOworICAgIHdrR2V0R2x5cGhBZHZhbmNlcyhmb250LCBtLCBtX2lzU3lzdGVtRm9u
dCwgaXNQcmludGVyRm9udCwgZ2x5cGgsIGFkdmFuY2UpOworCisgICAgcmV0dXJuIGFkdmFuY2Uu
d2lkdGggKyBtX3N5bnRoZXRpY0JvbGRPZmZzZXQ7Cit9CisKK30KClByb3BlcnR5IGNoYW5nZXMg
b246IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ0dXaW4uY3Bw
Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX18KTmFtZTogc3ZuOmV4ZWN1dGFibGUKICAgKyAqCgpJbmRleDogV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERhdGFDYWlyb1dpbi5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERhdGFDYWlyb1dp
bi5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1w
bGVGb250RGF0YUNhaXJvV2luLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMDYgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisg
KiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBw
bGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMg
Y29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBk
ZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Ig
d3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIK
KworI2luY2x1ZGUgPHdpbnNvY2syLmg+CisjaW5jbHVkZSAiRm9udC5oIgorI2luY2x1ZGUgIkZv
bnRDYWNoZS5oIgorI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUgIkZvbnREZXNjcmlw
dGlvbi5oIgorI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CisjaW5jbHVkZSA8dW5pY29kZS91
Y2hhci5oPgorI2luY2x1ZGUgPHVuaWNvZGUvdW5vcm0uaD4KKyNpbmNsdWRlIDxtbGFuZy5oPgor
I2luY2x1ZGUgPHRjaGFyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordXNpbmcgc3RkOjpt
YXg7CisKK3ZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtSW5pdCgpCit7CisgICAgbV9zY3Jp
cHRDYWNoZSA9IDA7CisgICAgbV9zY3JpcHRGb250UHJvcGVydGllcyA9IDA7CisgICAgbV9pc1N5
c3RlbUZvbnQgPSBmYWxzZTsKKyAgICAKKyAgICBpZiAobV9mb250LnVzZUdESSgpKSB7CisgICAg
ICAgIEhEQyBoZGMgPSBHZXREQygwKTsKKyAgICAgICAgSEdESU9CSiBvbGRGb250ID0gU2VsZWN0
T2JqZWN0KGhkYywgbV9mb250Lmhmb250KCkpOworICAgICAgICBPVVRMSU5FVEVYVE1FVFJJQyBt
ZXRyaWNzOworICAgICAgICBHZXRPdXRsaW5lVGV4dE1ldHJpY3MoaGRjLCBzaXplb2YobWV0cmlj
cyksICZtZXRyaWNzKTsKKyAgICAgICAgVEVYVE1FVFJJQyYgdGV4dE1ldHJpY3MgPSBtZXRyaWNz
Lm90bVRleHRNZXRyaWNzOworICAgICAgICBtX2FzY2VudCA9IHRleHRNZXRyaWNzLnRtQXNjZW50
OworICAgICAgICBtX2Rlc2NlbnQgPSB0ZXh0TWV0cmljcy50bURlc2NlbnQ7CisgICAgICAgIG1f
bGluZUdhcCA9IHRleHRNZXRyaWNzLnRtRXh0ZXJuYWxMZWFkaW5nOworICAgICAgICBtX2xpbmVT
cGFjaW5nID0gbV9hc2NlbnQgKyBtX2Rlc2NlbnQgKyBtX2xpbmVHYXA7CisgICAgICAgIG1feEhl
aWdodCA9IG1fYXNjZW50ICogMC41NmY7IC8vIEJlc3QgZ3Vlc3MgZm9yIHhIZWlnaHQgaWYgbm8g
eCBnbHlwaCBpcyBwcmVzZW50LgorCisgICAgICAgIEdMWVBITUVUUklDUyBnbTsKKyAgICAgICAg
TUFUMiBtYXQgPSB7IDEsIDAsIDAsIDEgfTsKKyAgICAgICAgRFdPUkQgbGVuID0gR2V0R2x5cGhP
dXRsaW5lKGhkYywgJ3gnLCBHR09fTUVUUklDUywgJmdtLCAwLCAwLCAmbWF0KTsKKyAgICAgICAg
aWYgKGxlbiAhPSBHRElfRVJST1IgJiYgZ20uZ21wdEdseXBoT3JpZ2luLnkgPiAwKQorICAgICAg
ICAgICAgbV94SGVpZ2h0ID0gZ20uZ21wdEdseXBoT3JpZ2luLnk7CisKKyAgICAgICAgbV91bml0
c1BlckVtID0gbWV0cmljcy5vdG1FTVNxdWFyZTsKKworICAgICAgICBTZWxlY3RPYmplY3QoaGRj
LCBvbGRGb250KTsKKyAgICAgICAgUmVsZWFzZURDKDAsIGhkYyk7CisKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIC8vIEZJWE1FOiBUaGlzIHNlY3Rpb24gc2hvdWxkIGRldGVybWluZSBm
b250IGRpbWVuc2lvbnMgKHNlZSBDRyBpbXBsZW1lbnRhdGlvbikuCisgICAgbm90SW1wbGVtZW50
ZWQoKTsKK30KKwordm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1EZXN0cm95KCkKK3sKKyAg
ICBub3RJbXBsZW1lbnRlZCgpOworfQorCitmbG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1X
aWR0aEZvckdseXBoKEdseXBoIGdseXBoKSBjb25zdAoreworICAgIGlmIChtX2ZvbnQudXNlR0RJ
KCkpIHsKKyAgICAgICAgSERDIGhkYyA9IEdldERDKDApOworICAgICAgICBIR0RJT0JKIG9sZEZv
bnQgPSBTZWxlY3RPYmplY3QoaGRjLCBtX2ZvbnQuaGZvbnQoKSk7CisgICAgICAgIGludCB3aWR0
aDsKKyAgICAgICAgR2V0Q2hhcldpZHRoSShoZGMsIGdseXBoLCAxLCAwLCAmd2lkdGgpOworICAg
ICAgICBTZWxlY3RPYmplY3QoaGRjLCBvbGRGb250KTsKKyAgICAgICAgUmVsZWFzZURDKDAsIGhk
Yyk7CisgICAgICAgIHJldHVybiB3aWR0aDsKKyAgICB9CisKKyAgICAvLyBGSVhNRTogRmxlc2gg
b3V0IHdpdGggQ2Fpcm8vd2luMzIgZm9udCBpbXBsZW1lbnRhdGlvbgorICAgIG5vdEltcGxlbWVu
dGVkKCk7CisKKyAgICByZXR1cm4gMDsKK30KKworfQoKUHJvcGVydHkgY2hhbmdlcyBvbjogV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERhdGFDYWlyb1dpbi5jcHAKX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fXwpOYW1lOiBzdm46ZXhlY3V0YWJsZQogICArICoKCkluZGV4OiBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YVdpbi5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERhdGFXaW4uY3BwCShyZXZpc2lv
biAyOTcyNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRh
V2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQg
KEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHly
aWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVk
LgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0zNywxMCArMzcsOCBAQAogI2lu
Y2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CiAjaW5jbHVkZSA8dW5pY29kZS91Y2hhci5oPgogI2lu
Y2x1ZGUgPHVuaWNvZGUvdW5vcm0uaD4KLSNpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0Fw
cGxpY2F0aW9uU2VydmljZXMuaD4KICNpbmNsdWRlIDxtbGFuZy5oPgogI2luY2x1ZGUgPHRjaGFy
Lmg+Ci0jaW5jbHVkZSA8V2ViS2l0U3lzdGVtSW50ZXJmYWNlL1dlYktpdFN5c3RlbUludGVyZmFj
ZS5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKQEAgLTUwLDExNCArNDgsMTQgQEAgY29uc3Qg
ZmxvYXQgY1NtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllcgogCiBzdGF0aWMgYm9vbCBzaG91bGRB
cHBseU1hY0FzY2VudEhhY2s7CiAKLXN0YXRpYyBpbmxpbmUgZmxvYXQgc2NhbGVFbVRvVW5pdHMo
ZmxvYXQgeCwgdW5zaWduZWQgdW5pdHNQZXJFbSkgeyByZXR1cm4gdW5pdHNQZXJFbSA/IHggLyAo
ZmxvYXQpdW5pdHNQZXJFbSA6IHg7IH0KLQogdm9pZCBTaW1wbGVGb250RGF0YTo6c2V0U2hvdWxk
QXBwbHlNYWNBc2NlbnRIYWNrKGJvb2wgYikKIHsKICAgICBzaG91bGRBcHBseU1hY0FzY2VudEhh
Y2sgPSBiOwogfQogCi12b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUluaXQoKQoteyAgICAK
LSAgICBtX3N5bnRoZXRpY0JvbGRPZmZzZXQgPSBtX2ZvbnQuc3ludGhldGljQm9sZCgpID8gMS4w
ZiA6IDAuZjsKLSAgICBtX3NjcmlwdENhY2hlID0gMDsKLSAgICBtX3NjcmlwdEZvbnRQcm9wZXJ0
aWVzID0gMDsKLSAgICBtX2lzU3lzdGVtRm9udCA9IGZhbHNlOwotICAgIAotICAgIGlmIChtX2Zv
bnQudXNlR0RJKCkpIHsKLSAgICAgICAgSERDIGhkYyA9IEdldERDKDApOwotICAgICAgICBIR0RJ
T0JKIG9sZEZvbnQgPSBTZWxlY3RPYmplY3QoaGRjLCBtX2ZvbnQuaGZvbnQoKSk7Ci0gICAgICAg
IE9VVExJTkVURVhUTUVUUklDIG1ldHJpY3M7Ci0gICAgICAgIEdldE91dGxpbmVUZXh0TWV0cmlj
cyhoZGMsIHNpemVvZihtZXRyaWNzKSwgJm1ldHJpY3MpOwotICAgICAgICBURVhUTUVUUklDJiB0
ZXh0TWV0cmljcyA9IG1ldHJpY3Mub3RtVGV4dE1ldHJpY3M7Ci0gICAgICAgIG1fYXNjZW50ID0g
dGV4dE1ldHJpY3MudG1Bc2NlbnQ7Ci0gICAgICAgIG1fZGVzY2VudCA9IHRleHRNZXRyaWNzLnRt
RGVzY2VudDsKLSAgICAgICAgbV9saW5lR2FwID0gdGV4dE1ldHJpY3MudG1FeHRlcm5hbExlYWRp
bmc7Ci0gICAgICAgIG1fbGluZVNwYWNpbmcgPSBtX2FzY2VudCArIG1fZGVzY2VudCArIG1fbGlu
ZUdhcDsKLSAgICAgICAgbV94SGVpZ2h0ID0gbV9hc2NlbnQgKiAwLjU2ZjsgLy8gQmVzdCBndWVz
cyBmb3IgeEhlaWdodCBpZiBubyB4IGdseXBoIGlzIHByZXNlbnQuCi0KLSAgICAgICAgR0xZUEhN
RVRSSUNTIGdtOwotICAgICAgICBNQVQyIG1hdCA9IHsgMSwgMCwgMCwgMSB9OwotICAgICAgICBE
V09SRCBsZW4gPSBHZXRHbHlwaE91dGxpbmUoaGRjLCAneCcsIEdHT19NRVRSSUNTLCAmZ20sIDAs
IDAsICZtYXQpOwotICAgICAgICBpZiAobGVuICE9IEdESV9FUlJPUiAmJiBnbS5nbXB0R2x5cGhP
cmlnaW4ueSA+IDApCi0gICAgICAgICAgICBtX3hIZWlnaHQgPSBnbS5nbXB0R2x5cGhPcmlnaW4u
eTsKLQotICAgICAgICBtX3VuaXRzUGVyRW0gPSBtZXRyaWNzLm90bUVNU3F1YXJlOwotCi0gICAg
ICAgIFNlbGVjdE9iamVjdChoZGMsIG9sZEZvbnQpOwotICAgICAgICBSZWxlYXNlREMoMCwgaGRj
KTsKLQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQ0dGb250UmVmIGZvbnQgPSBtX2Zv
bnQuY2dGb250KCk7Ci0gICAgaW50IGlBc2NlbnQgPSBDR0ZvbnRHZXRBc2NlbnQoZm9udCk7Ci0g
ICAgaW50IGlEZXNjZW50ID0gQ0dGb250R2V0RGVzY2VudChmb250KTsKLSAgICBpbnQgaUxpbmVH
YXAgPSBDR0ZvbnRHZXRMZWFkaW5nKGZvbnQpOwotICAgIG1fdW5pdHNQZXJFbSA9IENHRm9udEdl
dFVuaXRzUGVyRW0oZm9udCk7Ci0gICAgZmxvYXQgcG9pbnRTaXplID0gbV9mb250LnNpemUoKTsK
LSAgICBmbG9hdCBmQXNjZW50ID0gc2NhbGVFbVRvVW5pdHMoaUFzY2VudCwgbV91bml0c1BlckVt
KSAqIHBvaW50U2l6ZTsKLSAgICBmbG9hdCBmRGVzY2VudCA9IC1zY2FsZUVtVG9Vbml0cyhpRGVz
Y2VudCwgbV91bml0c1BlckVtKSAqIHBvaW50U2l6ZTsKLSAgICBmbG9hdCBmTGluZUdhcCA9IHNj
YWxlRW1Ub1VuaXRzKGlMaW5lR2FwLCBtX3VuaXRzUGVyRW0pICogcG9pbnRTaXplOwotCi0gICAg
aWYgKCFpc0N1c3RvbUZvbnQoKSkgewotICAgICAgICBIREMgZGMgPSBHZXREQygwKTsKLSAgICAg
ICAgSEdESU9CSiBvbGRGb250ID0gU2VsZWN0T2JqZWN0KGRjLCBtX2ZvbnQuaGZvbnQoKSk7Ci0g
ICAgICAgIGludCBmYWNlTGVuZ3RoID0gR2V0VGV4dEZhY2UoZGMsIDAsIDApOwotICAgICAgICBW
ZWN0b3I8VENIQVI+IGZhY2VOYW1lKGZhY2VMZW5ndGgpOwotICAgICAgICBHZXRUZXh0RmFjZShk
YywgZmFjZUxlbmd0aCwgZmFjZU5hbWUuZGF0YSgpKTsKLSAgICAgICAgbV9pc1N5c3RlbUZvbnQg
PSAhX3Rjc2NtcChmYWNlTmFtZS5kYXRhKCksIF9UKCJMdWNpZGEgR3JhbmRlIikpOwotICAgICAg
ICBTZWxlY3RPYmplY3QoZGMsIG9sZEZvbnQpOwotICAgICAgICBSZWxlYXNlREMoMCwgZGMpOwot
Ci0gICAgICAgIGlmIChzaG91bGRBcHBseU1hY0FzY2VudEhhY2spIHsKLSAgICAgICAgICAgIC8v
IFRoaXMgY29kZSBjb21lcyBmcm9tIEZvbnREYXRhTWFjLm1tLiBXZSBvbmx5IGV2ZXIgZG8gdGhp
cyB3aGVuIHJ1bm5pbmcgcmVncmVzc2lvbiB0ZXN0cyBzbyB0aGF0IG91ciBtZXRyaWNzIHdpbGwg
bWF0Y2ggTWFjLgotCi0gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGFkanVzdCBUaW1lcywgSGVs
dmV0aWNhLCBhbmQgQ291cmllciB0byBjbG9zZWx5IG1hdGNoIHRoZQotICAgICAgICAgICAgLy8g
dmVydGljYWwgbWV0cmljcyBvZiB0aGVpciBNaWNyb3NvZnQgY291bnRlcnBhcnRzIHRoYXQgYXJl
IHRoZSBkZSBmYWN0bwotICAgICAgICAgICAgLy8gd2ViIHN0YW5kYXJkLiBUaGUgQXBwS2l0IGFk
anVzdG1lbnQgb2YgMjAlIGlzIHRvbyBiaWcgYW5kIGlzCi0gICAgICAgICAgICAvLyBpbmNvcnJl
Y3RseSBhZGRlZCB0byBsaW5lIHNwYWNpbmcsIHNvIHdlIHVzZSBhIDE1JSBhZGp1c3RtZW50IGlu
c3RlYWQKLSAgICAgICAgICAgIC8vIGFuZCBhZGQgaXQgdG8gdGhlIGFzY2VudC4KLSAgICAgICAg
ICAgIGlmICghX3Rjc2NtcChmYWNlTmFtZS5kYXRhKCksIF9UKCJUaW1lcyIpKSB8fCAhX3Rjc2Nt
cChmYWNlTmFtZS5kYXRhKCksIF9UKCJIZWx2ZXRpY2EiKSkgfHwgIV90Y3NjbXAoZmFjZU5hbWUu
ZGF0YSgpLCBfVCgiQ291cmllciIpKSkKLSAgICAgICAgICAgICAgICBmQXNjZW50ICs9IGZsb29y
ZigoKGZBc2NlbnQgKyBmRGVzY2VudCkgKiAwLjE1ZikgKyAwLjVmKTsKLSAgICAgICAgfQotICAg
IH0KLQotICAgIG1fYXNjZW50ID0gbHJvdW5kZihmQXNjZW50KTsKLSAgICBtX2Rlc2NlbnQgPSBs
cm91bmRmKGZEZXNjZW50KTsKLSAgICBtX2xpbmVHYXAgPSBscm91bmRmKGZMaW5lR2FwKTsKLSAg
ICBtX2xpbmVTcGFjaW5nID0gbV9hc2NlbnQgKyBtX2Rlc2NlbnQgKyBtX2xpbmVHYXA7Ci0KLSAg
ICAvLyBNZWFzdXJlIHRoZSBhY3R1YWwgY2hhcmFjdGVyICJ4IiwgYmVjYXVzZSBBcHBLaXQgc3lu
dGhlc2l6ZXMgWCBoZWlnaHQgcmF0aGVyIHRoYW4gZ2V0dGluZyBpdCBmcm9tIHRoZSBmb250Lgot
ICAgIC8vIFVuZm9ydHVuYXRlbHksIE5TRm9udCB3aWxsIHJvdW5kIHRoaXMgZm9yIHVzIHNvIHdl
IGRvbid0IHF1aXRlIGdldCB0aGUgcmlnaHQgdmFsdWUuCi0gICAgR2x5cGhQYWdlKiBnbHlwaFBh
Z2VaZXJvID0gR2x5cGhQYWdlVHJlZU5vZGU6OmdldFJvb3RDaGlsZCh0aGlzLCAwKS0+cGFnZSgp
OwotICAgIEdseXBoIHhHbHlwaCA9IGdseXBoUGFnZVplcm8gPyBnbHlwaFBhZ2VaZXJvLT5nbHlw
aERhdGFGb3JDaGFyYWN0ZXIoJ3gnKS5nbHlwaCA6IDA7Ci0gICAgaWYgKHhHbHlwaCkgewotICAg
ICAgICBDR1JlY3QgeEJveDsKLSAgICAgICAgQ0dGb250R2V0R2x5cGhCQm94ZXMoZm9udCwgJnhH
bHlwaCwgMSwgJnhCb3gpOwotICAgICAgICAvLyBVc2UgdGhlIG1heGltdW0gb2YgZWl0aGVyIHdp
ZHRoIG9yIGhlaWdodCBiZWNhdXNlICJ4IiBpcyBuZWFybHkgc3F1YXJlCi0gICAgICAgIC8vIGFu
ZCB3ZWIgcGFnZXMgdGhhdCBmb29saXNobHkgdXNlIHRoaXMgbWV0cmljIGZvciB3aWR0aCB3aWxs
IGJlIGxhaWQgb3V0Ci0gICAgICAgIC8vIHBvb3JseSBpZiB3ZSByZXR1cm4gYW4gYWNjdXJhdGUg
aGVpZ2h0LiBDbGFzc2ljIGNhc2UgaXMgVGltZXMgMTMgcG9pbnQsCi0gICAgICAgIC8vIHdoaWNo
IGhhcyBhbiAieCIgdGhhdCBpcyA3eDYgcGl4ZWxzLgotICAgICAgICBtX3hIZWlnaHQgPSBzY2Fs
ZUVtVG9Vbml0cyhtYXgoQ0dSZWN0R2V0TWF4WCh4Qm94KSwgQ0dSZWN0R2V0TWF4WSh4Qm94KSks
IG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IGlY
SGVpZ2h0ID0gQ0dGb250R2V0WEhlaWdodChmb250KTsKLSAgICAgICAgbV94SGVpZ2h0ID0gc2Nh
bGVFbVRvVW5pdHMoaVhIZWlnaHQsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7Ci0gICAgfQot
fQotCi12b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3koKQorYm9vbCBTaW1wbGVG
b250RGF0YTo6Z2V0U2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrKCkKIHsKLSAgICBpZiAoIWlzQ3Vz
dG9tRm9udCgpKSB7Ci0gICAgICAgIERlbGV0ZU9iamVjdChtX2ZvbnQuaGZvbnQoKSk7Ci0gICAg
ICAgIENHRm9udFJlbGVhc2UobV9mb250LmNnRm9udCgpKTsKLSAgICB9Ci0KLSAgICAvLyBXZSBk
b24ndCBoYXNoIHRoaXMgb24gV2luMzIsIHNvIGl0J3MgZWZmZWN0aXZlbHkgb3duZWQgYnkgdXMu
Ci0gICAgZGVsZXRlIG1fc21hbGxDYXBzRm9udERhdGE7Ci0KLSAgICBTY3JpcHRGcmVlQ2FjaGUo
Jm1fc2NyaXB0Q2FjaGUpOwotICAgIGRlbGV0ZSBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzOworICAg
IHJldHVybiBzaG91bGRBcHBseU1hY0FzY2VudEhhY2s7CiB9CiAKIFNpbXBsZUZvbnREYXRhKiBT
aW1wbGVGb250RGF0YTo6c21hbGxDYXBzRm9udERhdGEoY29uc3QgRm9udERlc2NyaXB0aW9uJiBm
b250RGVzY3JpcHRpb24pIGNvbnN0CkBAIC0yMzcsMjggKzEzNSw2IEBAIHZvaWQgU2ltcGxlRm9u
dERhdGE6OmRldGVybWluZVBpdGNoKCkKICAgICBSZWxlYXNlREMoMCwgZGMpOwogfQogCi1mbG9h
dCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZvckdseXBoKEdseXBoIGdseXBoKSBjb25z
dAotewotICAgIGlmIChtX2ZvbnQudXNlR0RJKCkpIHsKLSAgICAgICAgSERDIGhkYyA9IEdldERD
KDApOwotICAgICAgICBIR0RJT0JKIG9sZEZvbnQgPSBTZWxlY3RPYmplY3QoaGRjLCBtX2ZvbnQu
aGZvbnQoKSk7Ci0gICAgICAgIGludCB3aWR0aDsKLSAgICAgICAgR2V0Q2hhcldpZHRoSShoZGMs
IGdseXBoLCAxLCAwLCAmd2lkdGgpOwotICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBvbGRGb250
KTsKLSAgICAgICAgUmVsZWFzZURDKDAsIGhkYyk7Ci0gICAgICAgIHJldHVybiB3aWR0aDsKLSAg
ICB9Ci0KLSAgICBDR0ZvbnRSZWYgZm9udCA9IG1fZm9udC5jZ0ZvbnQoKTsKLSAgICBmbG9hdCBw
b2ludFNpemUgPSBtX2ZvbnQuc2l6ZSgpOwotICAgIENHU2l6ZSBhZHZhbmNlOwotICAgIENHQWZm
aW5lVHJhbnNmb3JtIG0gPSBDR0FmZmluZVRyYW5zZm9ybU1ha2VTY2FsZShwb2ludFNpemUsIHBv
aW50U2l6ZSk7Ci0gICAgLy8gRklYTUU6IE5lZWQgdG8gYWRkIHJlYWwgc3VwcG9ydCBmb3IgcHJp
bnRlciBmb250cy4KLSAgICBib29sIGlzUHJpbnRlckZvbnQgPSBmYWxzZTsKLSAgICB3a0dldEds
eXBoQWR2YW5jZXMoZm9udCwgbSwgbV9pc1N5c3RlbUZvbnQsIGlzUHJpbnRlckZvbnQsIGdseXBo
LCBhZHZhbmNlKTsKLSAgICByZXR1cm4gYWR2YW5jZS53aWR0aCArIG1fc3ludGhldGljQm9sZE9m
ZnNldDsKLX0KLQogU0NSSVBUX0ZPTlRQUk9QRVJUSUVTKiBTaW1wbGVGb250RGF0YTo6c2NyaXB0
Rm9udFByb3BlcnRpZXMoKSBjb25zdAogewogICAgIGlmICghbV9zY3JpcHRGb250UHJvcGVydGll
cykgewpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlQ0dXaW4uY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNHV2luLmNwcAkocmV2aXNp
b24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNHV2luLmNwcAkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDgg
QXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkRyYWdJbWFnZS5oIgorCisjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIK
KyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbWFnZS5oIgorI2luY2x1
ZGUgIlJldGFpblB0ci5oIgorCisjaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NvcmVHcmFwaGljcy5o
PgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0hCSVRN
QVAgYWxsb2NJbWFnZShIREMgZGMsIEludFNpemUgc2l6ZSwgQ0dDb250ZXh0UmVmICp0YXJnZXRS
ZWYpCit7CisgICAgSEJJVE1BUCBoYm1wOworICAgIEJJVE1BUElORk8gYm1wSW5mbyA9IHswfTsK
KyAgICBibXBJbmZvLmJtaUhlYWRlci5iaVNpemUgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7
CisgICAgYm1wSW5mby5ibWlIZWFkZXIuYmlXaWR0aCA9IHNpemUud2lkdGgoKTsKKyAgICBibXBJ
bmZvLmJtaUhlYWRlci5iaUhlaWdodCA9IHNpemUuaGVpZ2h0KCk7CisgICAgYm1wSW5mby5ibWlI
ZWFkZXIuYmlQbGFuZXMgPSAxOworICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpQml0Q291bnQgPSAz
MjsKKyAgICBibXBJbmZvLmJtaUhlYWRlci5iaUNvbXByZXNzaW9uID0gQklfUkdCOworICAgIExQ
Vk9JRCBiaXRzOworICAgIGhibXAgPSBDcmVhdGVESUJTZWN0aW9uKGRjLCAmYm1wSW5mbywgRElC
X1JHQl9DT0xPUlMsICZiaXRzLCAwLCAwKTsKKworICAgIGlmICghdGFyZ2V0UmVmKQorICAgICAg
ICByZXR1cm4gaGJtcDsKKworICAgIENHQ29sb3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9y
U3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKKyAgICBDR0NvbnRleHRSZWYgYml0bWFwQ29udGV4dCA9
IENHQml0bWFwQ29udGV4dENyZWF0ZShiaXRzLCBibXBJbmZvLmJtaUhlYWRlci5iaVdpZHRoLCBi
bXBJbmZvLmJtaUhlYWRlci5iaUhlaWdodCwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBJbmZvLmJtaUhlYWRlci5iaVdpZHRoICog
NCwgZGV2aWNlUkdCLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFO
b25lU2tpcEZpcnN0KTsKKyAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKGRldmljZVJHQik7CisgICAg
aWYgKCFiaXRtYXBDb250ZXh0KSB7CisgICAgICAgIERlbGV0ZU9iamVjdChoYm1wKTsKKyAgICAg
ICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgKnRhcmdldFJlZiA9IGJpdG1hcENvbnRleHQ7Cisg
ICAgcmV0dXJuIGhibXA7Cit9CisKK3N0YXRpYyBDR0NvbnRleHRSZWYgY3JlYXRlQ2dDb250ZXh0
RnJvbUJpdG1hcChIQklUTUFQIGJpdG1hcCkKK3sKKyAgICBCSVRNQVAgaW5mbzsKKyAgICBHZXRP
YmplY3QoYml0bWFwLCBzaXplb2YoaW5mbyksICZpbmZvKTsKKyAgICBBU1NFUlQoaW5mby5ibUJp
dHNQaXhlbCA9PSAzMik7CisKKyAgICBDR0NvbG9yU3BhY2VSZWYgZGV2aWNlUkdCID0gQ0dDb2xv
clNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7CisgICAgQ0dDb250ZXh0UmVmIGJpdG1hcENvbnRleHQg
PSBDR0JpdG1hcENvbnRleHRDcmVhdGUoaW5mby5ibUJpdHMsIGluZm8uYm1XaWR0aCwgaW5mby5i
bUhlaWdodCwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpbmZvLmJtV2lkdGhCeXRlcywgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3Jk
ZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFOb25lU2tpcEZpcnN0KTsKKyAgICBDR0NvbG9yU3Bh
Y2VSZWxlYXNlKGRldmljZVJHQik7CisgICAgcmV0dXJuIGJpdG1hcENvbnRleHQ7Cit9CisKK0Ry
YWdJbWFnZVJlZiBzY2FsZURyYWdJbWFnZShEcmFnSW1hZ2VSZWYgaW1hZ2UsIEZsb2F0U2l6ZSBz
Y2FsZSkKK3sKKyAgICAvLyBGSVhNRTogZHVlIHRvIHRoZSB3YXkgZHJhZyBpbWFnZXMgYXJlIGRv
bmUgb24gd2luZG93cyB3ZSBuZWVkIAorICAgIC8vIHRvIHByZXByb2Nlc3MgdGhlIGFscGhhIGNo
YW5uZWwgPHJkYXI6Ly9wcm9ibGVtLzUwMTU5NDY+CisKKyAgICBpZiAoIWltYWdlKQorICAgICAg
ICByZXR1cm4gMDsKKyAgICBDR0NvbnRleHRSZWYgdGFyZ2V0Q29udGV4dDsKKyAgICBDR0NvbnRl
eHRSZWYgc3JjQ29udGV4dDsKKyAgICBDR0ltYWdlUmVmIHNyY0ltYWdlOworICAgIEludFNpemUg
c3JjU2l6ZSA9IGRyYWdJbWFnZVNpemUoaW1hZ2UpOworICAgIEludFNpemUgZHN0U2l6ZSgoaW50
KShzcmNTaXplLndpZHRoKCkgKiBzY2FsZS53aWR0aCgpKSwgKGludCkoc3JjU2l6ZS5oZWlnaHQo
KSAqIHNjYWxlLmhlaWdodCgpKSk7CisgICAgSEJJVE1BUCBoYm1wID0gMDsKKyAgICBIREMgZGMg
PSBHZXREQygwKTsKKyAgICBIREMgZHN0REMgPSBDcmVhdGVDb21wYXRpYmxlREMoZGMpOworICAg
IGlmICghZHN0REMpCisgICAgICAgIGdvdG8gZXhpdDsKKworICAgIGhibXAgPSBhbGxvY0ltYWdl
KGRzdERDLCBkc3RTaXplLCAmdGFyZ2V0Q29udGV4dCk7CisgICAgaWYgKCFoYm1wKQorICAgICAg
ICBnb3RvIGV4aXQ7CisKKyAgICBzcmNDb250ZXh0ID0gY3JlYXRlQ2dDb250ZXh0RnJvbUJpdG1h
cChpbWFnZSk7CisgICAgc3JjSW1hZ2UgPSBDR0JpdG1hcENvbnRleHRDcmVhdGVJbWFnZShzcmND
b250ZXh0KTsKKyAgICBDR1JlY3QgcmVjdDsKKyAgICByZWN0Lm9yaWdpbi54ID0gMDsKKyAgICBy
ZWN0Lm9yaWdpbi55ID0gMDsKKyAgICByZWN0LnNpemUgPSBkc3RTaXplOworICAgIENHQ29udGV4
dERyYXdJbWFnZSh0YXJnZXRDb250ZXh0LCByZWN0LCBzcmNJbWFnZSk7CisgICAgQ0dJbWFnZVJl
bGVhc2Uoc3JjSW1hZ2UpOworICAgIENHQ29udGV4dFJlbGVhc2Uoc3JjQ29udGV4dCk7CisgICAg
Q0dDb250ZXh0UmVsZWFzZSh0YXJnZXRDb250ZXh0KTsKKyAgICA6OkRlbGV0ZU9iamVjdChpbWFn
ZSk7CisgICAgaW1hZ2UgPSAwOworCitleGl0OgorICAgIGlmICghaGJtcCkKKyAgICAgICAgaGJt
cCA9IGltYWdlOworICAgIGlmIChkc3REQykKKyAgICAgICAgRGVsZXRlREMoZHN0REMpOworICAg
IFJlbGVhc2VEQygwLCBkYyk7CisgICAgcmV0dXJuIGhibXA7Cit9CisgICAgCitEcmFnSW1hZ2VS
ZWYgY3JlYXRlRHJhZ0ltYWdlRnJvbUltYWdlKEltYWdlKiBpbWcpCit7CisgICAgSEJJVE1BUCBo
Ym1wID0gMDsKKyAgICBIREMgZGMgPSBHZXREQygwKTsKKyAgICBIREMgd29ya2luZ0RDID0gQ3Jl
YXRlQ29tcGF0aWJsZURDKGRjKTsKKyAgICBDR0NvbnRleHRSZWYgZHJhd0NvbnRleHQgPSAwOwor
ICAgIGlmICghd29ya2luZ0RDKQorICAgICAgICBnb3RvIGV4aXQ7CisKKyAgICBoYm1wID0gYWxs
b2NJbWFnZSh3b3JraW5nREMsIGltZy0+c2l6ZSgpLCAmZHJhd0NvbnRleHQpOworCisgICAgaWYg
KCFoYm1wKQorICAgICAgICBnb3RvIGV4aXQ7CisKKyAgICBpZiAoIWRyYXdDb250ZXh0KSB7Cisg
ICAgICAgIDo6RGVsZXRlT2JqZWN0KGhibXApOworICAgICAgICBoYm1wID0gMDsKKyAgICB9CisK
KyAgICBDR0ltYWdlUmVmIHNyY0ltYWdlID0gaW1nLT5nZXRDR0ltYWdlUmVmKCk7CisgICAgQ0dS
ZWN0IHJlY3Q7CisgICAgcmVjdC5zaXplID0gaW1nLT5zaXplKCk7CisgICAgcmVjdC5vcmlnaW4u
eCA9IDA7CisgICAgcmVjdC5vcmlnaW4ueSA9IC1yZWN0LnNpemUuaGVpZ2h0OworICAgIHN0YXRp
YyBjb25zdCBDR0Zsb2F0IHdoaXRlIFtdID0gezEuMCwgMS4wLCAxLjAsIDEuMH07CisgICAgQ0dD
b250ZXh0U2NhbGVDVE0oZHJhd0NvbnRleHQsIDEsIC0xKTsKKyAgICBDR0NvbnRleHRTZXRGaWxs
Q29sb3IoZHJhd0NvbnRleHQsIHdoaXRlKTsKKyAgICBDR0NvbnRleHRGaWxsUmVjdChkcmF3Q29u
dGV4dCwgcmVjdCk7CisgICAgQ0dDb250ZXh0U2V0QmxlbmRNb2RlKGRyYXdDb250ZXh0LCBrQ0dC
bGVuZE1vZGVOb3JtYWwpOworICAgIENHQ29udGV4dERyYXdJbWFnZShkcmF3Q29udGV4dCwgcmVj
dCwgc3JjSW1hZ2UpOworICAgIENHQ29udGV4dFJlbGVhc2UoZHJhd0NvbnRleHQpOworCitleGl0
OgorICAgIGlmICh3b3JraW5nREMpCisgICAgICAgIERlbGV0ZURDKHdvcmtpbmdEQyk7CisgICAg
UmVsZWFzZURDKDAsIGRjKTsKKyAgICByZXR1cm4gaGJtcDsKK30KKyAgICAKK30KClByb3BlcnR5
IGNoYW5nZXMgb246IFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNHV2luLmNwcApfX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fCk5hbWU6IHN2bjpleGVjdXRhYmxlCiAgICsgKgoKSW5kZXg6IFdlYkNvcmUvcGxhdGZv
cm0vd2luL0RyYWdJbWFnZUNhaXJvV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRm
b3JtL3dpbi9EcmFnSW1hZ2VDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3Bs
YXRmb3JtL3dpbi9EcmFnSW1hZ2VDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
NDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggQXBwbGUgSW5jLiAgQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkRy
YWdJbWFnZS5oIgorCisjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKKyNpbmNsdWRlICJHcmFwaGlj
c0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbWFnZS5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVk
LmgiCisjaW5jbHVkZSAiUmV0YWluUHRyLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworRHJhZ0ltYWdlUmVmIHNjYWxlRHJhZ0ltYWdlKERyYWdJbWFn
ZVJlZiBpbWFnZSwgRmxvYXRTaXplIHNjYWxlKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9
CisgICAgCitEcmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlRnJvbUltYWdlKEltYWdlKiBpbWcp
Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKyAgICAKK30KClByb3BlcnR5IGNoYW5nZXMg
b246IFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNhaXJvV2luLmNwcApfX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
Ck5hbWU6IHN2bjpleGVjdXRhYmxlCiAgICsgKgoKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2lu
L0RyYWdJbWFnZVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJh
Z0ltYWdlV2luLmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbi9E
cmFnSW1hZ2VXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENv
cHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29w
eXJpZ2h0IChDKSAyMDA3LCAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAg
KgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTMxLDggKzMxLDYgQEAKICNpbmNsdWRl
ICJJbWFnZS5oIgogI2luY2x1ZGUgIlJldGFpblB0ci5oIgogCi0jaW5jbHVkZSA8Q29yZUdyYXBo
aWNzL0NvcmVHcmFwaGljcy5oPgotCiAjaW5jbHVkZSA8d2luZG93cy5oPgogCiBuYW1lc3BhY2Ug
V2ViQ29yZSB7CkBAIC01MiwxMzggKzUwLDEyIEBAIHZvaWQgZGVsZXRlRHJhZ0ltYWdlKERyYWdJ
bWFnZVJlZiBpbWFnZSkKICAgICAgICAgOjpEZWxldGVPYmplY3QoaW1hZ2UpOwogfQogCi1IQklU
TUFQIGFsbG9jSW1hZ2UoSERDIGRjLCBJbnRTaXplIHNpemUsIENHQ29udGV4dFJlZiAqdGFyZ2V0
UmVmKQotewotICAgIEhCSVRNQVAgaGJtcDsKLSAgICBCSVRNQVBJTkZPIGJtcEluZm8gPSB7MH07
Ci0gICAgYm1wSW5mby5ibWlIZWFkZXIuYmlTaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIp
OwotICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpV2lkdGggPSBzaXplLndpZHRoKCk7Ci0gICAgYm1w
SW5mby5ibWlIZWFkZXIuYmlIZWlnaHQgPSBzaXplLmhlaWdodCgpOwotICAgIGJtcEluZm8uYm1p
SGVhZGVyLmJpUGxhbmVzID0gMTsKLSAgICBibXBJbmZvLmJtaUhlYWRlci5iaUJpdENvdW50ID0g
MzI7Ci0gICAgYm1wSW5mby5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiA9IEJJX1JHQjsKLSAgICBM
UFZPSUQgYml0czsKLSAgICBoYm1wID0gQ3JlYXRlRElCU2VjdGlvbihkYywgJmJtcEluZm8sIERJ
Ql9SR0JfQ09MT1JTLCAmYml0cywgMCwgMCk7Ci0KLSAgICBpZiAoIXRhcmdldFJlZikKLSAgICAg
ICAgcmV0dXJuIGhibXA7Ci0KLSAgICBDR0NvbG9yU3BhY2VSZWYgZGV2aWNlUkdCID0gQ0dDb2xv
clNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7Ci0gICAgQ0dDb250ZXh0UmVmIGJpdG1hcENvbnRleHQg
PSBDR0JpdG1hcENvbnRleHRDcmVhdGUoYml0cywgYm1wSW5mby5ibWlIZWFkZXIuYmlXaWR0aCwg
Ym1wSW5mby5ibWlIZWFkZXIuYmlIZWlnaHQsIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wSW5mby5ibWlIZWFkZXIuYmlXaWR0aCAq
IDQsIGRldmljZVJHQiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhh
Tm9uZVNraXBGaXJzdCk7Ci0gICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOwotICAg
IGlmICghYml0bWFwQ29udGV4dCkgewotICAgICAgICBEZWxldGVPYmplY3QoaGJtcCk7Ci0gICAg
ICAgIHJldHVybiAwOwotICAgIH0KLQotICAgICp0YXJnZXRSZWYgPSBiaXRtYXBDb250ZXh0Owot
ICAgIHJldHVybiBoYm1wOwotfQotCi1zdGF0aWMgQ0dDb250ZXh0UmVmIGNyZWF0ZUNnQ29udGV4
dEZyb21CaXRtYXAoSEJJVE1BUCBiaXRtYXApCi17Ci0gICAgQklUTUFQIGluZm87Ci0gICAgR2V0
T2JqZWN0KGJpdG1hcCwgc2l6ZW9mKGluZm8pLCAmaW5mbyk7Ci0gICAgQVNTRVJUKGluZm8uYm1C
aXRzUGl4ZWwgPT0gMzIpOwotCi0gICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29s
b3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwotICAgIENHQ29udGV4dFJlZiBiaXRtYXBDb250ZXh0
ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGluZm8uYm1CaXRzLCBpbmZvLmJtV2lkdGgsIGluZm8u
Ym1IZWlnaHQsIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9y
ZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhhTm9uZVNraXBGaXJzdCk7Ci0gICAgQ0dDb2xvclNw
YWNlUmVsZWFzZShkZXZpY2VSR0IpOwotICAgIHJldHVybiBiaXRtYXBDb250ZXh0OwotfQotCi1E
cmFnSW1hZ2VSZWYgc2NhbGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVmIGltYWdlLCBGbG9hdFNpemUg
c2NhbGUpCi17Ci0gICAgLy8gRklYTUU6IGR1ZSB0byB0aGUgd2F5IGRyYWcgaW1hZ2VzIGFyZSBk
b25lIG9uIHdpbmRvd3Mgd2UgbmVlZCAKLSAgICAvLyB0byBwcmVwcm9jZXNzIHRoZSBhbHBoYSBj
aGFubmVsIDxyZGFyOi8vcHJvYmxlbS81MDE1OTQ2PgotCi0gICAgaWYgKCFpbWFnZSkKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgQ0dDb250ZXh0UmVmIHRhcmdldENvbnRleHQ7Ci0gICAgQ0dDb250
ZXh0UmVmIHNyY0NvbnRleHQ7Ci0gICAgQ0dJbWFnZVJlZiBzcmNJbWFnZTsKLSAgICBJbnRTaXpl
IHNyY1NpemUgPSBkcmFnSW1hZ2VTaXplKGltYWdlKTsKLSAgICBJbnRTaXplIGRzdFNpemUoKGlu
dCkoc3JjU2l6ZS53aWR0aCgpICogc2NhbGUud2lkdGgoKSksIChpbnQpKHNyY1NpemUuaGVpZ2h0
KCkgKiBzY2FsZS5oZWlnaHQoKSkpOwotICAgIEhCSVRNQVAgaGJtcCA9IDA7Ci0gICAgSERDIGRj
ID0gR2V0REMoMCk7Ci0gICAgSERDIGRzdERDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGRjKTsKLSAg
ICBpZiAoIWRzdERDKQotICAgICAgICBnb3RvIGV4aXQ7Ci0KLSAgICBoYm1wID0gYWxsb2NJbWFn
ZShkc3REQywgZHN0U2l6ZSwgJnRhcmdldENvbnRleHQpOwotICAgIGlmICghaGJtcCkKLSAgICAg
ICAgZ290byBleGl0OwotCi0gICAgc3JjQ29udGV4dCA9IGNyZWF0ZUNnQ29udGV4dEZyb21CaXRt
YXAoaW1hZ2UpOwotICAgIHNyY0ltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlSW1hZ2Uoc3Jj
Q29udGV4dCk7Ci0gICAgQ0dSZWN0IHJlY3Q7Ci0gICAgcmVjdC5vcmlnaW4ueCA9IDA7Ci0gICAg
cmVjdC5vcmlnaW4ueSA9IDA7Ci0gICAgcmVjdC5zaXplID0gZHN0U2l6ZTsKLSAgICBDR0NvbnRl
eHREcmF3SW1hZ2UodGFyZ2V0Q29udGV4dCwgcmVjdCwgc3JjSW1hZ2UpOwotICAgIENHSW1hZ2VS
ZWxlYXNlKHNyY0ltYWdlKTsKLSAgICBDR0NvbnRleHRSZWxlYXNlKHNyY0NvbnRleHQpOwotICAg
IENHQ29udGV4dFJlbGVhc2UodGFyZ2V0Q29udGV4dCk7Ci0gICAgOjpEZWxldGVPYmplY3QoaW1h
Z2UpOwotICAgIGltYWdlID0gMDsKLQotZXhpdDoKLSAgICBpZiAoIWhibXApCi0gICAgICAgIGhi
bXAgPSBpbWFnZTsKLSAgICBpZiAoZHN0REMpCi0gICAgICAgIERlbGV0ZURDKGRzdERDKTsKLSAg
ICBSZWxlYXNlREMoMCwgZGMpOwotICAgIHJldHVybiBoYm1wOwotfQotICAgIAogRHJhZ0ltYWdl
UmVmIGRpc3NvbHZlRHJhZ0ltYWdlVG9GcmFjdGlvbihEcmFnSW1hZ2VSZWYgaW1hZ2UsIGZsb2F0
KQogewogICAgIC8vV2UgZG9uJ3QgZG8gdGhpcyBvbiB3aW5kb3dzIGFzIHRoZSBkcmFnaW1hZ2Ug
aXMgYmxlbmRlZCBieSB0aGUgT1MKICAgICByZXR1cm4gaW1hZ2U7CiB9CiAgICAgICAgIAotRHJh
Z0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZyb21JbWFnZShJbWFnZSogaW1nKQoteyAgICAKLSAg
ICBIQklUTUFQIGhibXAgPSAwOwotICAgIEhEQyBkYyA9IEdldERDKDApOwotICAgIEhEQyB3b3Jr
aW5nREMgPSBDcmVhdGVDb21wYXRpYmxlREMoZGMpOwotICAgIENHQ29udGV4dFJlZiBkcmF3Q29u
dGV4dCA9IDA7Ci0gICAgaWYgKCF3b3JraW5nREMpCi0gICAgICAgIGdvdG8gZXhpdDsKLQotICAg
IGhibXAgPSBhbGxvY0ltYWdlKHdvcmtpbmdEQywgaW1nLT5zaXplKCksICZkcmF3Q29udGV4dCk7
Ci0KLSAgICBpZiAoIWhibXApCi0gICAgICAgIGdvdG8gZXhpdDsKLQotICAgIGlmICghZHJhd0Nv
bnRleHQpIHsKLSAgICAgICAgOjpEZWxldGVPYmplY3QoaGJtcCk7Ci0gICAgICAgIGhibXAgPSAw
OwotICAgIH0KLQotICAgIENHSW1hZ2VSZWYgc3JjSW1hZ2UgPSBpbWctPmdldENHSW1hZ2VSZWYo
KTsKLSAgICBDR1JlY3QgcmVjdDsKLSAgICByZWN0LnNpemUgPSBpbWctPnNpemUoKTsKLSAgICBy
ZWN0Lm9yaWdpbi54ID0gMDsKLSAgICByZWN0Lm9yaWdpbi55ID0gLXJlY3Quc2l6ZS5oZWlnaHQ7
Ci0gICAgc3RhdGljIGNvbnN0IENHRmxvYXQgd2hpdGUgW10gPSB7MS4wLCAxLjAsIDEuMCwgMS4w
fTsKLSAgICBDR0NvbnRleHRTY2FsZUNUTShkcmF3Q29udGV4dCwgMSwgLTEpOwotICAgIENHQ29u
dGV4dFNldEZpbGxDb2xvcihkcmF3Q29udGV4dCwgd2hpdGUpOwotICAgIENHQ29udGV4dEZpbGxS
ZWN0KGRyYXdDb250ZXh0LCByZWN0KTsKLSAgICBDR0NvbnRleHRTZXRCbGVuZE1vZGUoZHJhd0Nv
bnRleHQsIGtDR0JsZW5kTW9kZU5vcm1hbCk7Ci0gICAgQ0dDb250ZXh0RHJhd0ltYWdlKGRyYXdD
b250ZXh0LCByZWN0LCBzcmNJbWFnZSk7Ci0gICAgQ0dDb250ZXh0UmVsZWFzZShkcmF3Q29udGV4
dCk7Ci0KLWV4aXQ6Ci0gICAgaWYgKHdvcmtpbmdEQykKLSAgICAgICAgRGVsZXRlREMod29ya2lu
Z0RDKTsKLSAgICBSZWxlYXNlREMoMCwgZGMpOwotICAgIHJldHVybiBoYm1wOwotfQotICAgIAog
RHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUljb25Gb3JDYWNoZWRJbWFnZShDYWNoZWRJbWFn
ZSopCiB7CiAgICAgLy9GSVhNRTogUHJvdmlkZSBpY29uIGZvciBpbWFnZSB0eXBlIDxyZGFyOi8v
cHJvYmxlbS81MDE1OTQ5Pgo=
</data>
<flag name="review"
          id="8182"
          type_id="1"
          status="-"
          setter="aroben"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>18740</attachid>
            <date>2008-01-28 12:17:56 -0800</date>
            <delta_ts>2008-01-29 12:27:09 -0800</delta_ts>
            <desc>Fourth revision based on Adam&apos;s comments.</desc>
            <filename>webkit-win32Cairo.patch</filename>
            <type>text/plain</type>
            <size>135120</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyOTgzNSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNjIgQEAKKzIwMDgtMDEtMjggIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBnbWFp
bC5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
Rmlyc3Qgc3RlcCB0b3dhcmRzIHJlZW5hYmxpbmcgQ2Fpcm8gc3VwcG9ydCB1bmRlciBXaW5kb3dz
LgorICAgICAgICAtIGFkZHMgdmFyaW91cyBQTEFURk9STSBndWFyZHMgdG8gY29kZSB0aGF0IHdp
bGwgbm90IGJ1aWxkCisgICAgICAgICAgdW5kZXIgQ2Fpcm8uCisgICAgICAgIC0gYnJlYWtzIHNv
bWUgZmlsZXMgaW50byBDRyBhbmQgQ2Fpcm8tc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zLgorICAg
ICAgICAtIHByb3ZpZGVzIHNvbWUgd2luMzIvQ2Fpcm8gc3VwcG9ydCAoYnV0IGJ5IG5vIG1lYW5z
IGEgY29tcGxldGUKKyAgICAgICAgICBwb3J0IC0tIHlldCkuCisKKyAgICAgICAgV0FSTklORzog
Tk8gVEVTVCBDQVNFUyBBRERFRCBPUiBDSEFOR0VECisKKyAgICAgICAgKiBXZWJDb3JlLnZjcHJv
ai9XZWJDb3JlLnZjcHJvajoKKyAgICAgICAgKiBicmlkZ2Uvd2luL0ZyYW1lQ0dXaW4uY3BwOiBD
b3BpZWQgZnJvbSBicmlkZ2Uvd2luL0ZyYW1lV2luLmNwcC4KKyAgICAgICAgKiBicmlkZ2Uvd2lu
L0ZyYW1lQ2Fpcm9XaW4uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OmltYWdlRnJvbVNl
bGVjdGlvbik6CisgICAgICAgICogYnJpZGdlL3dpbi9GcmFtZVdpbi5jcHA6CisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy93aW4vRm9udENHV2luLmNwcDogQ29waWVkIGZyb20gcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luL0ZvbnRXaW4uY3BwLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250Q2Fp
cm9XaW4uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OmRyYXdHbHlwaHMpOgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250V2luLmNwcDoKKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0Q0dXaW4uY3BwOiBDb3BpZWQgZnJv
bSBwbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0V2luLmNwcC4KKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y29uY2F0Q1RNKToKKyAg
ICAgICAgKFdlYkNvcmU6OnNldENHU3Ryb2tlQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0OjpkcmF3TGluZUZvck1pc3NwZWxsaW5nT3JCYWRHcmFtbWFyKToKKyAgICAg
ICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0Q2Fpcm9XaW4uY3BwOiBB
ZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6Z2V0V2luZG93c0NvbnRleHQp
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjppblRyYW5zcGFyZW5jeUxheWVy
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6cmVsZWFzZVdpbmRvd3NDb250
ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6
Y29uY2F0Q1RNKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6ZHJhd0ZvY3Vz
UmluZyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yTWlz
c3BlbGxpbmdPckJhZEdyYW1tYXIpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9H
cmFwaGljc0NvbnRleHRXaW4uY3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9J
bWFnZUNHV2luLmNwcDogQ29waWVkIGZyb20gcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlV2lu
LmNwcC4KKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdlOjpnZXRIQklUTUFQT2ZTaXplKToK
KyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdlOjpkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNp
emUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZUNhaXJvV2luLmNwcDog
QWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpCaXRtYXBJbWFnZTo6Z2V0SEJJVE1BUE9mU2l6ZSk6
CisgICAgICAgIChXZWJDb3JlOjpCaXRtYXBJbWFnZTo6ZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VT
aXplKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VXaW4uY3BwOgorICAg
ICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNHV2luLmNwcDogQ29w
aWVkIGZyb20gcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhV2luLmNwcC4KKyAg
ICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUluaXQpOgorICAgICAgICAo
V2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnBsYXRmb3JtV2lkdGhGb3JHbHlwaCk6CisgICAgICAg
ICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ2Fpcm9XaW4uY3BwOiBBZGRl
ZC4KKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUluaXQpOgorICAg
ICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnBsYXRmb3JtRGVzdHJveSk6CisgICAgICAg
IChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZvckdseXBoKToKKyAgICAg
ICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERhdGFXaW4uY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OmdldFNob3VsZEFwcGx5TWFjQXNjZW50SGFjayk6
CisgICAgICAgICogcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNHV2luLmNwcDogQ29waWVkIGZyb20g
cGxhdGZvcm0vd2luL0RyYWdJbWFnZVdpbi5jcHAuCisgICAgICAgIChXZWJDb3JlOjpjcmVhdGVE
cmFnSW1hZ2VGcm9tSW1hZ2UpOgorICAgICAgICAqIHBsYXRmb3JtL3dpbi9EcmFnSW1hZ2VDYWly
b1dpbi5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6c2NhbGVEcmFnSW1hZ2UpOgorICAg
ICAgICAoV2ViQ29yZTo6Y3JlYXRlRHJhZ0ltYWdlRnJvbUltYWdlKToKKyAgICAgICAgKiBwbGF0
Zm9ybS93aW4vRHJhZ0ltYWdlV2luLmNwcDoKKwogMjAwOC0wMS0yOCAgRGFuIEJlcm5zdGVpbiAg
PG1pdHpAYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhcmluIEFkbGVyLgpJbmRl
eDogV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvago9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCShyZXZpc2lvbiAyOTcyNikKKysr
IFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHdvcmtpbmcgY29weSkKQEAg
LTM0MTgsNiArMzQxOCwxMCBAQAogCQkJCQk+DQogCQkJCTwvRmlsZT4NCiAJCQkJPEZpbGUNCisJ
CQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cd2luXERyYWdJbWFnZUNHV2luLmNwcCINCisJ
CQkJCT4NCisJCQkJPC9GaWxlPg0KKwkJCQk8RmlsZQ0KIAkJCQkJUmVsYXRpdmVQYXRoPSIuLlxw
bGF0Zm9ybVx3aW5cRHJhZ0ltYWdlV2luLmNwcCINCiAJCQkJCT4NCiAJCQkJPC9GaWxlPg0KQEAg
LTM4NzYsNiArMzg4MCwxMCBAQAogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KIAkJCQkJPEZpbGUN
CisJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxGb250Q0dXaW4u
Y3BwIg0KKwkJCQkJCT4NCisJCQkJCTwvRmlsZT4NCisJCQkJCTxGaWxlDQogCQkJCQkJUmVsYXRp
dmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1x3aW5cRm9udEN1c3RvbVBsYXRmb3JtRGF0YS5j
cHAiDQogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KQEAgLTM5MzIsNiArMzk0MCwxMCBAQAogCQkJ
CQkJPg0KIAkJCQkJPC9GaWxlPg0KIAkJCQkJPEZpbGUNCisJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4u
XHBsYXRmb3JtXGdyYXBoaWNzXHdpblxHcmFwaGljc0NvbnRleHRDR1dpbi5jcHAiDQorCQkJCQkJ
Pg0KKwkJCQkJPC9GaWxlPg0KKwkJCQkJPEZpbGUNCiAJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBs
YXRmb3JtXGdyYXBoaWNzXHdpblxHcmFwaGljc0NvbnRleHRXaW4uY3BwIg0KIAkJCQkJCT4NCiAJ
CQkJCTwvRmlsZT4NCkBAIC0zOTQwLDYgKzM5NTIsMTAgQEAKIAkJCQkJCT4NCiAJCQkJCTwvRmls
ZT4NCiAJCQkJCTxGaWxlDQorCQkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGlj
c1x3aW5cSW1hZ2VDR1dpbi5jcHAiDQorCQkJCQkJPg0KKwkJCQkJPC9GaWxlPg0KKwkJCQkJPEZp
bGUNCiAJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxJbWFnZVdp
bi5jcHAiDQogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KQEAgLTM5NjQsNiArMzk4MCwxMCBAQAog
CQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KIAkJCQkJPEZpbGUNCisJCQkJCQlSZWxhdGl2ZVBhdGg9
Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxTaW1wbGVGb250RGF0YUNHV2luLmNwcCINCisJCQkJ
CQk+DQorCQkJCQk8L0ZpbGU+DQorCQkJCQk8RmlsZQ0KIAkJCQkJCVJlbGF0aXZlUGF0aD0iLi5c
cGxhdGZvcm1cZ3JhcGhpY3Ncd2luXFNpbXBsZUZvbnREYXRhV2luLmNwcCINCiAJCQkJCQk+DQog
CQkJCQk8L0ZpbGU+DQpAQCAtNjQwOCw2ICs2NDI4LDEwIEBACiAJCQkJTmFtZT0id2luIg0KIAkJ
CQk+DQogCQkJCTxGaWxlDQorCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGJyaWRnZVx3aW5cRnJhbWVD
R1dpbi5jcHAiDQorCQkJCQk+DQorCQkJCTwvRmlsZT4NCisJCQkJPEZpbGUNCiAJCQkJCVJlbGF0
aXZlUGF0aD0iLi5cYnJpZGdlXHdpblxGcmFtZVdpbi5jcHAiDQogCQkJCQk+DQogCQkJCTwvRmls
ZT4NCkluZGV4OiBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVDR1dpbi5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lQ0dXaW4uY3BwCShyZXZpc2lvbiAyOTgzNCkJKGZy
b20gV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lV2luLmNwcDoyOTgzNCkKKysrIFdlYkNvcmUvYnJp
ZGdlL3dpbi9GcmFtZUNHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE5NyBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJGcmFtZVdpbi5o
IgorCisjaW5jbHVkZSA8d2luc29jazIuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNs
dWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRl
ICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkVkaXRvckNsaWVudC5oIgorI2luY2x1ZGUgIkZyYW1l
TG9hZGVyLmgiCisjaW5jbHVkZSAiRnJhbWVMb2FkUmVxdWVzdC5oIgorI2luY2x1ZGUgIkZyYW1l
UHJpdmF0ZS5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhUTUxJRnJhbWVF
bGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCisjaW5jbHVkZSAiSFRNTFRhYmxlQ2Vs
bEVsZW1lbnQuaCIKKyNpbmNsdWRlICJLZXlib2FyZEV2ZW50LmgiCisjaW5jbHVkZSAiTlBfanNv
YmplY3QuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlBhZ2UuaCIK
KyNpbmNsdWRlICJQbHVnaW4uaCIKKyNpbmNsdWRlICJQbHVnaW5EYXRhYmFzZVdpbi5oIgorI2lu
Y2x1ZGUgIlBsdWdpblZpZXdXaW4uaCIKKyNpbmNsdWRlICJSZWd1bGFyRXhwcmVzc2lvbi5oIgor
I2luY2x1ZGUgIlJlbmRlckZyYW1lLmgiCisjaW5jbHVkZSAiUmVuZGVyVGFibGVDZWxsLmgiCisj
aW5jbHVkZSAiUmVuZGVyVmlldy5oIgorI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlLmgiCisjaW5j
bHVkZSAiVGV4dFJlc291cmNlRGVjb2Rlci5oIgorI2luY2x1ZGUgImtqc19wcm94eS5oIgorI2lu
Y2x1ZGUgImtqc193aW5kb3cuaCIKKyNpbmNsdWRlICJucHJ1bnRpbWVfaW1wbC5oIgorI2luY2x1
ZGUgInJ1bnRpbWVfcm9vdC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1
ZGUgIlNldHRpbmdzLmgiCisKKyNpZiBQTEFURk9STShDRykKKyNpbmNsdWRlIDxDb3JlR3JhcGhp
Y3MvQ29yZUdyYXBoaWNzLmg+CisjZW5kaWYKKwordXNpbmcgc3RkOjptaW47Cit1c2luZyBuYW1l
c3BhY2UgS0pTOjpCaW5kaW5nczsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit1c2luZyBuYW1l
c3BhY2UgSFRNTE5hbWVzOworCit2b2lkIEZyYW1lOjpjbGVhclBsYXRmb3JtU2NyaXB0T2JqZWN0
cygpCit7Cit9CisKK0tKUzo6QmluZGluZ3M6Okluc3RhbmNlKiBGcmFtZTo6Y3JlYXRlU2NyaXB0
SW5zdGFuY2VGb3JXaWRnZXQoV2lkZ2V0KiB3aWRnZXQpCit7CisgICAgLy8gRklYTUU6IElkZWFs
bHkgd2UnZCBoYXZlIGFuIGlzUGx1Z2luVmlldygpIGhlcmUgYnV0IHdlIGNhbid0IGFkZCB0aGF0
IHRvIHRoZSBvcGVuIHNvdXJjZSB0cmVlIHJpZ2h0IG5vdy4KKyAgICBpZiAod2lkZ2V0LT5pc0Zy
YW1lVmlldygpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQ
bHVnaW5WaWV3V2luKj4od2lkZ2V0KS0+YmluZGluZ0luc3RhbmNlKCk7Cit9CisKKwordm9pZCBj
b21wdXRlUGFnZVJlY3RzRm9yRnJhbWUoRnJhbWUqIGZyYW1lLCBjb25zdCBJbnRSZWN0JiBwcmlu
dFJlY3QsIGZsb2F0IGhlYWRlckhlaWdodCwgZmxvYXQgZm9vdGVySGVpZ2h0LCBmbG9hdCB1c2Vy
U2NhbGVGYWN0b3IsVmVjdG9yPEludFJlY3Q+JiBwYWdlcywgaW50JiBvdXRQYWdlSGVpZ2h0KQor
eworICAgIEFTU0VSVChmcmFtZSk7CisKKyAgICBwYWdlcy5jbGVhcigpOworICAgIG91dFBhZ2VI
ZWlnaHQgPSAwOworCisgICAgaWYgKCFmcmFtZS0+ZG9jdW1lbnQoKSB8fCAhZnJhbWUtPnZpZXco
KSB8fCAhZnJhbWUtPmRvY3VtZW50KCktPnJlbmRlcmVyKCkpCisgICAgICAgIHJldHVybjsKKyAK
KyAgICBSZW5kZXJWaWV3KiByb290ID0gc3RhdGljX2Nhc3Q8UmVuZGVyVmlldyAqPihmcmFtZS0+
ZG9jdW1lbnQoKS0+cmVuZGVyZXIoKSk7CisKKyAgICBpZiAoIXJvb3QpIHsKKyAgICAgICAgTE9H
X0VSUk9SKCJkb2N1bWVudCB0byBiZSBwcmludGVkIGhhcyBubyByZW5kZXJlciIpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHVzZXJTY2FsZUZhY3RvciA8PSAwKSB7CisgICAg
ICAgIExPR19FUlJPUigidXNlclNjYWxlRmFjdG9yIGhhcyBiYWQgdmFsdWUgJS4yZiIsIHVzZXJT
Y2FsZUZhY3Rvcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgZmxvYXQgcmF0
aW8gPSAoZmxvYXQpcHJpbnRSZWN0LmhlaWdodCgpIC8gKGZsb2F0KXByaW50UmVjdC53aWR0aCgp
OworIAorICAgIGZsb2F0IHBhZ2VXaWR0aCAgPSAoZmxvYXQpIHJvb3QtPmRvY1dpZHRoKCk7Cisg
ICAgZmxvYXQgcGFnZUhlaWdodCA9IHBhZ2VXaWR0aCAqIHJhdGlvOworICAgIG91dFBhZ2VIZWln
aHQgPSAoaW50KSBwYWdlSGVpZ2h0OyAgIC8vIHRoaXMgaXMgdGhlIGhlaWdodCBvZiB0aGUgcGFn
ZSBhZGp1c3RlZCBieSBtYXJnaW5zCisgICAgcGFnZUhlaWdodCAtPSAoaGVhZGVySGVpZ2h0ICsg
Zm9vdGVySGVpZ2h0KTsKKworICAgIGlmIChwYWdlSGVpZ2h0IDw9IDApIHsKKyAgICAgICAgTE9H
X0VSUk9SKCJwYWdlSGVpZ2h0IGhhcyBiYWQgdmFsdWUgJS4yZiIsIHBhZ2VIZWlnaHQpOworICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgZmxvYXQgY3VyclBhZ2VIZWlnaHQgPSBwYWdlSGVp
Z2h0IC8gdXNlclNjYWxlRmFjdG9yOworICAgIGZsb2F0IGRvY0hlaWdodCAgICAgID0gcm9vdC0+
bGF5ZXIoKS0+aGVpZ2h0KCk7CisgICAgZmxvYXQgZG9jV2lkdGggICAgICAgPSByb290LT5sYXll
cigpLT53aWR0aCgpOworICAgIGZsb2F0IGN1cnJQYWdlV2lkdGggID0gcGFnZVdpZHRoIC8gdXNl
clNjYWxlRmFjdG9yOworCisgICAgCisgICAgLy8gYWx3YXlzIHJldHVybiBhdCBsZWFzdCBvbmUg
cGFnZSwgc2luY2UgZW1wdHkgZmlsZXMgc2hvdWxkIHByaW50IGEgYmxhbmsgcGFnZQorICAgIGZs
b2F0IHByaW50ZWRQYWdlc0hlaWdodCA9IDAuMDsKKyAgICBkbyB7CisgICAgICAgIGZsb2F0IHBy
b3Bvc2VkQm90dG9tID0gbWluKGRvY0hlaWdodCwgcHJpbnRlZFBhZ2VzSGVpZ2h0ICsgcGFnZUhl
aWdodCk7CisgICAgICAgIGZyYW1lLT5hZGp1c3RQYWdlSGVpZ2h0KCZwcm9wb3NlZEJvdHRvbSwg
cHJpbnRlZFBhZ2VzSGVpZ2h0LCBwcm9wb3NlZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0KTsK
KyAgICAgICAgY3VyclBhZ2VIZWlnaHQgPSBtYXgoMS4wZiwgcHJvcG9zZWRCb3R0b20gLSBwcmlu
dGVkUGFnZXNIZWlnaHQpOworICAgICAgIAorICAgICAgICBwYWdlcy5hcHBlbmQoSW50UmVjdCgw
LHByaW50ZWRQYWdlc0hlaWdodCxjdXJyUGFnZVdpZHRoLGN1cnJQYWdlSGVpZ2h0KSk7CisgICAg
ICAgIHByaW50ZWRQYWdlc0hlaWdodCArPSBjdXJyUGFnZUhlaWdodDsKKyAgICB9IHdoaWxlIChw
cmludGVkUGFnZXNIZWlnaHQgPCBkb2NIZWlnaHQpOworfQorCitzdGF0aWMgdm9pZCBkcmF3UmVj
dEludG9Db250ZXh0KEludFJlY3QgcmVjdCwgRnJhbWVWaWV3KiB2aWV3LCBHcmFwaGljc0NvbnRl
eHQqIGdjKQoreworICAgIEludFNpemUgb2Zmc2V0ID0gdmlldy0+c2Nyb2xsT2Zmc2V0KCk7Cisg
ICAgcmVjdC5tb3ZlKC1vZmZzZXQud2lkdGgoKSwgLW9mZnNldC5oZWlnaHQoKSk7CisgICAgcmVj
dCA9IHZpZXctPmNvbnZlcnRUb0NvbnRhaW5pbmdXaW5kb3cocmVjdCk7CisKKyAgICBnYy0+Y29u
Y2F0Q1RNKEFmZmluZVRyYW5zZm9ybSgpLnRyYW5zbGF0ZSgtcmVjdC54KCksIC1yZWN0LnkoKSkp
OworCisgICAgdmlldy0+cGFpbnQoZ2MsIHJlY3QpOworfQorCitIQklUTUFQIGltYWdlRnJvbVNl
bGVjdGlvbihGcmFtZSogZnJhbWUsIGJvb2wgZm9yY2VCbGFja1RleHQpCit7CisgICAgZnJhbWUt
PnNldFBhaW50UmVzdHJpY3Rpb24oZm9yY2VCbGFja1RleHQgPyBQYWludFJlc3RyaWN0aW9uU2Vs
ZWN0aW9uT25seUJsYWNrVGV4dCA6IFBhaW50UmVzdHJpY3Rpb25TZWxlY3Rpb25Pbmx5KTsKKyAg
ICBGbG9hdFJlY3QgZnIgPSBmcmFtZS0+c2VsZWN0aW9uUmVjdCgpOworICAgIEludFJlY3QgaXIo
KGludClmci54KCksIChpbnQpZnIueSgpLChpbnQpZnIud2lkdGgoKSwoaW50KWZyLmhlaWdodCgp
KTsKKworICAgIHZvaWQqIGJpdHM7CisgICAgSERDIGhkYyA9IENyZWF0ZUNvbXBhdGlibGVEQygw
KTsKKyAgICBpbnQgdyA9IGlyLndpZHRoKCk7CisgICAgaW50IGggPSBpci5oZWlnaHQoKTsKKyAg
ICBCSVRNQVBJTkZPIGJtcCA9IHsgeyBzaXplb2YoQklUTUFQSU5GT0hFQURFUiksIHcsIGgsIDEs
IDMyIH0gfTsKKworICAgIEhCSVRNQVAgaGJtcCA9IENyZWF0ZURJQlNlY3Rpb24oMCwgJmJtcCwg
RElCX1JHQl9DT0xPUlMsICh2b2lkKiopJmJpdHMsIDAsIDApOworICAgIEhCSVRNQVAgaGJtcE9s
ZCA9IChIQklUTUFQKVNlbGVjdE9iamVjdChoZGMsIGhibXApOworICAgIENHQ29sb3JTcGFjZVJl
ZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKKyAgICBDR0NvbnRl
eHRSZWYgY29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZSgodm9pZCopYml0cywgdywgaCwK
KyAgICAgICAgOCwgdyAqIHNpemVvZihSR0JRVUFEKSwgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRl
T3JkZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFQcmVtdWx0aXBsaWVkRmlyc3QpOworICAgIENH
Q29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKKyAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNv
bnRleHQpOworCisgICAgR3JhcGhpY3NDb250ZXh0IGdjKGNvbnRleHQpOworCisgICAgZnJhbWUt
PmRvY3VtZW50KCktPnVwZGF0ZUxheW91dCgpOworICAgIGRyYXdSZWN0SW50b0NvbnRleHQoaXIs
IGZyYW1lLT52aWV3KCksICZnYyk7CisKKyAgICBDR0NvbnRleHRSZWxlYXNlKGNvbnRleHQpOwor
ICAgIFNlbGVjdE9iamVjdChoZGMsIGhibXBPbGQpOworICAgIERlbGV0ZURDKGhkYyk7CisKKyAg
ICBmcmFtZS0+c2V0UGFpbnRSZXN0cmljdGlvbihQYWludFJlc3RyaWN0aW9uTm9uZSk7CisKKyAg
ICByZXR1cm4gaGJtcDsKK30KKworRHJhZ0ltYWdlUmVmIEZyYW1lOjpkcmFnSW1hZ2VGb3JTZWxl
Y3Rpb24oKQoreyAgICAKKyAgICBpZiAoc2VsZWN0aW9uQ29udHJvbGxlcigpLT5pc1JhbmdlKCkp
CisgICAgICAgIHJldHVybiBpbWFnZUZyb21TZWxlY3Rpb24odGhpcywgZmFsc2UpOworCisgICAg
cmV0dXJuIDA7Cit9CisKK3ZvaWQgRnJhbWU6OmRhc2hib2FyZFJlZ2lvbnNDaGFuZ2VkKCkKK3sK
K30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9icmlkZ2Uvd2luL0Zy
YW1lQ0dXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZUNHV2lu
LmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVDR1dpbi5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAy
MDA2LCAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAo
QykgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgog
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI2LDExNyArMjYsMTggQEAKICNpbmNsdWRl
ICJjb25maWcuaCIKICNpbmNsdWRlICJGcmFtZVdpbi5oIgogCi0jaW5jbHVkZSA8d2luc29jazIu
aD4KICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAKLSNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIK
LSNpbmNsdWRlICJGbG9hdFJlY3QuaCIKLSNpbmNsdWRlICJEb2N1bWVudC5oIgotI2luY2x1ZGUg
IkVkaXRvckNsaWVudC5oIgotI2luY2x1ZGUgIkZyYW1lTG9hZGVyLmgiCi0jaW5jbHVkZSAiRnJh
bWVMb2FkUmVxdWVzdC5oIgotI2luY2x1ZGUgIkZyYW1lUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkZy
YW1lVmlldy5oIgotI2luY2x1ZGUgIkhUTUxJRnJhbWVFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRN
TE5hbWVzLmgiCi0jaW5jbHVkZSAiSFRNTFRhYmxlQ2VsbEVsZW1lbnQuaCIKLSNpbmNsdWRlICJL
ZXlib2FyZEV2ZW50LmgiCi0jaW5jbHVkZSAiTlBfanNvYmplY3QuaCIKLSNpbmNsdWRlICJOb3RJ
bXBsZW1lbnRlZC5oIgotI2luY2x1ZGUgIlBhZ2UuaCIKLSNpbmNsdWRlICJQbHVnaW4uaCIKLSNp
bmNsdWRlICJQbHVnaW5EYXRhYmFzZVdpbi5oIgotI2luY2x1ZGUgIlBsdWdpblZpZXdXaW4uaCIK
LSNpbmNsdWRlICJSZWd1bGFyRXhwcmVzc2lvbi5oIgotI2luY2x1ZGUgIlJlbmRlckZyYW1lLmgi
Ci0jaW5jbHVkZSAiUmVuZGVyVGFibGVDZWxsLmgiCi0jaW5jbHVkZSAiUmVuZGVyVmlldy5oIgot
I2luY2x1ZGUgIlJlc291cmNlSGFuZGxlLmgiCi0jaW5jbHVkZSAiVGV4dFJlc291cmNlRGVjb2Rl
ci5oIgotI2luY2x1ZGUgImtqc19wcm94eS5oIgotI2luY2x1ZGUgImtqc193aW5kb3cuaCIKLSNp
bmNsdWRlICJucHJ1bnRpbWVfaW1wbC5oIgotI2luY2x1ZGUgInJ1bnRpbWVfcm9vdC5oIgogI2lu
Y2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2luY2x1ZGUgIlNldHRpbmdzLmgiCiAKLSNpZiBQ
TEFURk9STShDRykKICNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ29yZUdyYXBoaWNzLmg+Ci0jZW5k
aWYKIAogdXNpbmcgc3RkOjptaW47Ci11c2luZyBuYW1lc3BhY2UgS0pTOjpCaW5kaW5nczsKIAog
bmFtZXNwYWNlIFdlYkNvcmUgewogCi11c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwotCi12b2lk
IEZyYW1lOjpjbGVhclBsYXRmb3JtU2NyaXB0T2JqZWN0cygpCi17Ci19Ci0KLUtKUzo6QmluZGlu
Z3M6Okluc3RhbmNlKiBGcmFtZTo6Y3JlYXRlU2NyaXB0SW5zdGFuY2VGb3JXaWRnZXQoV2lkZ2V0
KiB3aWRnZXQpCi17Ci0gICAgLy8gRklYTUU6IElkZWFsbHkgd2UnZCBoYXZlIGFuIGlzUGx1Z2lu
VmlldygpIGhlcmUgYnV0IHdlIGNhbid0IGFkZCB0aGF0IHRvIHRoZSBvcGVuIHNvdXJjZSB0cmVl
IHJpZ2h0IG5vdy4KLSAgICBpZiAod2lkZ2V0LT5pc0ZyYW1lVmlldygpKQotICAgICAgICByZXR1
cm4gMDsKLQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQbHVnaW5WaWV3V2luKj4od2lkZ2V0KS0+
YmluZGluZ0luc3RhbmNlKCk7Ci19Ci0KLQotdm9pZCBjb21wdXRlUGFnZVJlY3RzRm9yRnJhbWUo
RnJhbWUqIGZyYW1lLCBjb25zdCBJbnRSZWN0JiBwcmludFJlY3QsIGZsb2F0IGhlYWRlckhlaWdo
dCwgZmxvYXQgZm9vdGVySGVpZ2h0LCBmbG9hdCB1c2VyU2NhbGVGYWN0b3IsVmVjdG9yPEludFJl
Y3Q+JiBwYWdlcywgaW50JiBvdXRQYWdlSGVpZ2h0KQotewotICAgIEFTU0VSVChmcmFtZSk7Ci0K
LSAgICBwYWdlcy5jbGVhcigpOwotICAgIG91dFBhZ2VIZWlnaHQgPSAwOwotCi0gICAgaWYgKCFm
cmFtZS0+ZG9jdW1lbnQoKSB8fCAhZnJhbWUtPnZpZXcoKSB8fCAhZnJhbWUtPmRvY3VtZW50KCkt
PnJlbmRlcmVyKCkpCi0gICAgICAgIHJldHVybjsKLSAKLSAgICBSZW5kZXJWaWV3KiByb290ID0g
c3RhdGljX2Nhc3Q8UmVuZGVyVmlldyAqPihmcmFtZS0+ZG9jdW1lbnQoKS0+cmVuZGVyZXIoKSk7
Ci0KLSAgICBpZiAoIXJvb3QpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJkb2N1bWVudCB0byBiZSBw
cmludGVkIGhhcyBubyByZW5kZXJlciIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAg
aWYgKHVzZXJTY2FsZUZhY3RvciA8PSAwKSB7Ci0gICAgICAgIExPR19FUlJPUigidXNlclNjYWxl
RmFjdG9yIGhhcyBiYWQgdmFsdWUgJS4yZiIsIHVzZXJTY2FsZUZhY3Rvcik7Ci0gICAgICAgIHJl
dHVybjsKLSAgICB9Ci0gICAgCi0gICAgZmxvYXQgcmF0aW8gPSAoZmxvYXQpcHJpbnRSZWN0Lmhl
aWdodCgpIC8gKGZsb2F0KXByaW50UmVjdC53aWR0aCgpOwotIAotICAgIGZsb2F0IHBhZ2VXaWR0
aCAgPSAoZmxvYXQpIHJvb3QtPmRvY1dpZHRoKCk7Ci0gICAgZmxvYXQgcGFnZUhlaWdodCA9IHBh
Z2VXaWR0aCAqIHJhdGlvOwotICAgIG91dFBhZ2VIZWlnaHQgPSAoaW50KSBwYWdlSGVpZ2h0OyAg
IC8vIHRoaXMgaXMgdGhlIGhlaWdodCBvZiB0aGUgcGFnZSBhZGp1c3RlZCBieSBtYXJnaW5zCi0g
ICAgcGFnZUhlaWdodCAtPSAoaGVhZGVySGVpZ2h0ICsgZm9vdGVySGVpZ2h0KTsKLQotICAgIGlm
IChwYWdlSGVpZ2h0IDw9IDApIHsKLSAgICAgICAgTE9HX0VSUk9SKCJwYWdlSGVpZ2h0IGhhcyBi
YWQgdmFsdWUgJS4yZiIsIHBhZ2VIZWlnaHQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0g
ICAgZmxvYXQgY3VyclBhZ2VIZWlnaHQgPSBwYWdlSGVpZ2h0IC8gdXNlclNjYWxlRmFjdG9yOwot
ICAgIGZsb2F0IGRvY0hlaWdodCAgICAgID0gcm9vdC0+bGF5ZXIoKS0+aGVpZ2h0KCk7Ci0gICAg
ZmxvYXQgZG9jV2lkdGggICAgICAgPSByb290LT5sYXllcigpLT53aWR0aCgpOwotICAgIGZsb2F0
IGN1cnJQYWdlV2lkdGggID0gcGFnZVdpZHRoIC8gdXNlclNjYWxlRmFjdG9yOwotCi0gICAgCi0g
ICAgLy8gYWx3YXlzIHJldHVybiBhdCBsZWFzdCBvbmUgcGFnZSwgc2luY2UgZW1wdHkgZmlsZXMg
c2hvdWxkIHByaW50IGEgYmxhbmsgcGFnZQotICAgIGZsb2F0IHByaW50ZWRQYWdlc0hlaWdodCA9
IDAuMDsKLSAgICBkbyB7Ci0gICAgICAgIGZsb2F0IHByb3Bvc2VkQm90dG9tID0gbWluKGRvY0hl
aWdodCwgcHJpbnRlZFBhZ2VzSGVpZ2h0ICsgcGFnZUhlaWdodCk7Ci0gICAgICAgIGZyYW1lLT5h
ZGp1c3RQYWdlSGVpZ2h0KCZwcm9wb3NlZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0LCBwcm9w
b3NlZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0KTsKLSAgICAgICAgY3VyclBhZ2VIZWlnaHQg
PSBtYXgoMS4wZiwgcHJvcG9zZWRCb3R0b20gLSBwcmludGVkUGFnZXNIZWlnaHQpOwotICAgICAg
IAotICAgICAgICBwYWdlcy5hcHBlbmQoSW50UmVjdCgwLHByaW50ZWRQYWdlc0hlaWdodCxjdXJy
UGFnZVdpZHRoLGN1cnJQYWdlSGVpZ2h0KSk7Ci0gICAgICAgIHByaW50ZWRQYWdlc0hlaWdodCAr
PSBjdXJyUGFnZUhlaWdodDsKLSAgICB9IHdoaWxlIChwcmludGVkUGFnZXNIZWlnaHQgPCBkb2NI
ZWlnaHQpOwotfQotCiBzdGF0aWMgdm9pZCBkcmF3UmVjdEludG9Db250ZXh0KEludFJlY3QgcmVj
dCwgRnJhbWVWaWV3KiB2aWV3LCBHcmFwaGljc0NvbnRleHQqIGdjKQogewogICAgIEludFNpemUg
b2Zmc2V0ID0gdmlldy0+c2Nyb2xsT2Zmc2V0KCk7CkBAIC0xODIsMTYgKzgzLDQgQEAgSEJJVE1B
UCBpbWFnZUZyb21TZWxlY3Rpb24oRnJhbWUqIGZyYW1lLAogICAgIHJldHVybiBoYm1wOwogfQog
Ci1EcmFnSW1hZ2VSZWYgRnJhbWU6OmRyYWdJbWFnZUZvclNlbGVjdGlvbigpCi17ICAgIAotICAg
IGlmIChzZWxlY3Rpb25Db250cm9sbGVyKCktPmlzUmFuZ2UoKSkKLSAgICAgICAgcmV0dXJuIGlt
YWdlRnJvbVNlbGVjdGlvbih0aGlzLCBmYWxzZSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9p
ZCBGcmFtZTo6ZGFzaGJvYXJkUmVnaW9uc0NoYW5nZWQoKQotewotfQotCiB9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVDYWlyb1dpbi5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lQ2Fpcm9XaW4uY3BwCShyZXZpc2lv
biAwKQorKysgV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lQ2Fpcm9XaW4uY3BwCShyZXZpc2lvbiAw
KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkZyYW1lV2luLmgiCisKKyNpbmNsdWRlICJFZGl0b3JDbGllbnQuaCIK
KyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorCit1c2luZyBzdGQ6Om1pbjsKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitIQklUTUFQIGltYWdlRnJvbVNlbGVjdGlvbihGcmFtZSogZnJhbWUs
IGJvb2wgZm9yY2VCbGFja1RleHQpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lV2luLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVXaW4uY3BwCShyZXZpc2lv
biAyOTgzNCkKKysrIFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZVdpbi5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywg
MjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKQEAgLTYwLDEwICs2MCw2IEBACiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0
LmgiCiAjaW5jbHVkZSAiU2V0dGluZ3MuaCIKIAotI2lmIFBMQVRGT1JNKENHKQotI2luY2x1ZGUg
PENvcmVHcmFwaGljcy9Db3JlR3JhcGhpY3MuaD4KLSNlbmRpZgotCiB1c2luZyBzdGQ6Om1pbjsK
IHVzaW5nIG5hbWVzcGFjZSBLSlM6OkJpbmRpbmdzOwogCkBAIC04NCw3ICs4MCw2IEBAIEtKUzo6
QmluZGluZ3M6Okluc3RhbmNlKiBGcmFtZTo6Y3JlYXRlU2MKICAgICByZXR1cm4gc3RhdGljX2Nh
c3Q8UGx1Z2luVmlld1dpbio+KHdpZGdldCktPmJpbmRpbmdJbnN0YW5jZSgpOwogfQogCi0KIHZv
aWQgY29tcHV0ZVBhZ2VSZWN0c0ZvckZyYW1lKEZyYW1lKiBmcmFtZSwgY29uc3QgSW50UmVjdCYg
cHJpbnRSZWN0LCBmbG9hdCBoZWFkZXJIZWlnaHQsIGZsb2F0IGZvb3RlckhlaWdodCwgZmxvYXQg
dXNlclNjYWxlRmFjdG9yLFZlY3RvcjxJbnRSZWN0PiYgcGFnZXMsIGludCYgb3V0UGFnZUhlaWdo
dCkKIHsKICAgICBBU1NFUlQoZnJhbWUpOwpAQCAtMTM3LDUxICsxMzIsNiBAQCB2b2lkIGNvbXB1
dGVQYWdlUmVjdHNGb3JGcmFtZShGcmFtZSogZnJhCiAgICAgfSB3aGlsZSAocHJpbnRlZFBhZ2Vz
SGVpZ2h0IDwgZG9jSGVpZ2h0KTsKIH0KIAotc3RhdGljIHZvaWQgZHJhd1JlY3RJbnRvQ29udGV4
dChJbnRSZWN0IHJlY3QsIEZyYW1lVmlldyogdmlldywgR3JhcGhpY3NDb250ZXh0KiBnYykKLXsK
LSAgICBJbnRTaXplIG9mZnNldCA9IHZpZXctPnNjcm9sbE9mZnNldCgpOwotICAgIHJlY3QubW92
ZSgtb2Zmc2V0LndpZHRoKCksIC1vZmZzZXQuaGVpZ2h0KCkpOwotICAgIHJlY3QgPSB2aWV3LT5j
b252ZXJ0VG9Db250YWluaW5nV2luZG93KHJlY3QpOwotCi0gICAgZ2MtPmNvbmNhdENUTShBZmZp
bmVUcmFuc2Zvcm0oKS50cmFuc2xhdGUoLXJlY3QueCgpLCAtcmVjdC55KCkpKTsKLQotICAgIHZp
ZXctPnBhaW50KGdjLCByZWN0KTsKLX0KLQotSEJJVE1BUCBpbWFnZUZyb21TZWxlY3Rpb24oRnJh
bWUqIGZyYW1lLCBib29sIGZvcmNlQmxhY2tUZXh0KQotewotICAgIGZyYW1lLT5zZXRQYWludFJl
c3RyaWN0aW9uKGZvcmNlQmxhY2tUZXh0ID8gUGFpbnRSZXN0cmljdGlvblNlbGVjdGlvbk9ubHlC
bGFja1RleHQgOiBQYWludFJlc3RyaWN0aW9uU2VsZWN0aW9uT25seSk7Ci0gICAgRmxvYXRSZWN0
IGZyID0gZnJhbWUtPnNlbGVjdGlvblJlY3QoKTsKLSAgICBJbnRSZWN0IGlyKChpbnQpZnIueCgp
LCAoaW50KWZyLnkoKSwoaW50KWZyLndpZHRoKCksKGludClmci5oZWlnaHQoKSk7Ci0KLSAgICB2
b2lkKiBiaXRzOwotICAgIEhEQyBoZGMgPSBDcmVhdGVDb21wYXRpYmxlREMoMCk7Ci0gICAgaW50
IHcgPSBpci53aWR0aCgpOwotICAgIGludCBoID0gaXIuaGVpZ2h0KCk7Ci0gICAgQklUTUFQSU5G
TyBibXAgPSB7IHsgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpLCB3LCBoLCAxLCAzMiB9IH07Ci0K
LSAgICBIQklUTUFQIGhibXAgPSBDcmVhdGVESUJTZWN0aW9uKDAsICZibXAsIERJQl9SR0JfQ09M
T1JTLCAodm9pZCoqKSZiaXRzLCAwLCAwKTsKLSAgICBIQklUTUFQIGhibXBPbGQgPSAoSEJJVE1B
UClTZWxlY3RPYmplY3QoaGRjLCBoYm1wKTsKLSAgICBDR0NvbG9yU3BhY2VSZWYgZGV2aWNlUkdC
ID0gQ0dDb2xvclNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7Ci0gICAgQ0dDb250ZXh0UmVmIGNvbnRl
eHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUoKHZvaWQqKWJpdHMsIHcsIGgsCi0gICAgICAgIDgs
IHcgKiBzaXplb2YoUkdCUVVBRCksIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0
bGUgfCBrQ0dJbWFnZUFscGhhUHJlbXVsdGlwbGllZEZpcnN0KTsKLSAgICBDR0NvbG9yU3BhY2VS
ZWxlYXNlKGRldmljZVJHQik7Ci0gICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShjb250ZXh0KTsKLQot
ICAgIEdyYXBoaWNzQ29udGV4dCBnYyhjb250ZXh0KTsKLQotICAgIGZyYW1lLT5kb2N1bWVudCgp
LT51cGRhdGVMYXlvdXQoKTsKLSAgICBkcmF3UmVjdEludG9Db250ZXh0KGlyLCBmcmFtZS0+dmll
dygpLCAmZ2MpOwotCi0gICAgQ0dDb250ZXh0UmVsZWFzZShjb250ZXh0KTsKLSAgICBTZWxlY3RP
YmplY3QoaGRjLCBoYm1wT2xkKTsKLSAgICBEZWxldGVEQyhoZGMpOwotCi0gICAgZnJhbWUtPnNl
dFBhaW50UmVzdHJpY3Rpb24oUGFpbnRSZXN0cmljdGlvbk5vbmUpOwotCi0gICAgcmV0dXJuIGhi
bXA7Ci19Ci0KIERyYWdJbWFnZVJlZiBGcmFtZTo6ZHJhZ0ltYWdlRm9yU2VsZWN0aW9uKCkKIHsg
ICAgCiAgICAgaWYgKHNlbGVjdGlvbkNvbnRyb2xsZXIoKS0+aXNSYW5nZSgpKQpJbmRleDogV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuaAkocmV2aXNpb24gMjk3MjYp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTEwMyw2ICsxMDMsNyBAQCBwdWJsaWM6CiAgICAgU0NSSVBUX0NBQ0hFKiBzY3Jp
cHRDYWNoZSgpIGNvbnN0IHsgcmV0dXJuICZtX3NjcmlwdENhY2hlOyB9CiAKICAgICBzdGF0aWMg
dm9pZCBzZXRTaG91bGRBcHBseU1hY0FzY2VudEhhY2soYm9vbCk7CisgICAgc3RhdGljIGJvb2wg
Z2V0U2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrKCk7CiAjZW5kaWYKIAogI2lmIFBMQVRGT1JNKEdU
SykKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDR1dpbi5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENHV2luLmNwcAko
cmV2aXNpb24gMjk4MzQpCShmcm9tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRX
aW4uY3BwOjI5ODM0KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENHV2lu
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRm9udC5oIgorCisjaW5jbHVkZSAiRm9udEZh
bGxiYWNrTGlzdC5oIgorI2luY2x1ZGUgIkdseXBoQnVmZmVyLmgiCisjaW5jbHVkZSAiR3JhcGhp
Y3NDb250ZXh0LmgiCisjaW5jbHVkZSAiSW50UmVjdC5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVu
dGVkLmgiCisjaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIKKyNpbmNsdWRlICJVbmlzY3JpYmVD
b250cm9sbGVyLmgiCisjaW5jbHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNl
cnZpY2VzLmg+CisjaW5jbHVkZSA8V2ViS2l0U3lzdGVtSW50ZXJmYWNlL1dlYktpdFN5c3RlbUlu
dGVyZmFjZS5oPgorI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworY29uc3QgaW50IHN5bnRoZXRpY09ibGlxdWVBbmdsZSA9IDE0OworCit2b2lkIEZv
bnQ6OmRyYXdHbHlwaHMoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGNvbnN0IFNp
bXBsZUZvbnREYXRhKiBmb250LCBjb25zdCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZmZXIsIAorICAg
ICAgICAgICAgICAgICAgICAgIGludCBmcm9tLCBpbnQgbnVtR2x5cGhzLCBjb25zdCBGbG9hdFBv
aW50JiBwb2ludCkgY29uc3QKK3sKKyAgICBpZiAoZm9udC0+bV9mb250LnVzZUdESSgpKSB7Cisg
ICAgICAgIC8vIEZJWE1FOiBTdXBwb3J0IGFscGhhIGJsZW5kaW5nLgorICAgICAgICAvLyBGSVhN
RTogU3VwcG9ydCB0ZXh0IHN0cm9rZS9maWxsLgorICAgICAgICAvLyBGSVhNRTogU3VwcG9ydCB0
ZXh0IHNoYWRvdy4KKyAgICAgICAgQ29sb3IgZmlsbENvbG9yID0gZ3JhcGhpY3NDb250ZXh0LT5m
aWxsQ29sb3IoKTsKKyAgICAgICAgaWYgKGZpbGxDb2xvci5hbHBoYSgpID09IDApCisgICAgICAg
ICAgICByZXR1cm47CisKKyAgICAgICAgLy8gV2UgaGF2ZSB0byBjb252ZXJ0IENHJ3MgdHdvLWRp
bWVuc2lvbmFsIGZsb2F0aW5nIHBvaW50IGFkdmFuY2VzIHRvIGp1c3QgaG9yaXpvbnRhbCBpbnRl
Z2VyIGFkdmFuY2VzLgorICAgICAgICBWZWN0b3I8aW50LCAyMDQ4PiBnZGlBZHZhbmNlczsKKyAg
ICAgICAgaW50IHRvdGFsV2lkdGggPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51
bUdseXBoczsgaSsrKSB7CisgICAgICAgICAgICBnZGlBZHZhbmNlcy5hcHBlbmQobHJvdW5kZihn
bHlwaEJ1ZmZlci5hZHZhbmNlQXQoZnJvbSArIGkpKSk7CisgICAgICAgICAgICB0b3RhbFdpZHRo
ICs9IGdkaUFkdmFuY2VzW2ldOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2UgcHV0IHNsb3Ag
aW50byB0aGlzIHJlY3QsIHNpbmNlIGdseXBocyBjYW4gb3ZlcmZsb3cgdGhlIGFzY2VudC9kZXNj
ZW50IGJvdW5kcyBhbmQgdGhlIGxlZnQvcmlnaHQgZWRnZXMuCisgICAgICAgIGludCBsaW5lR2Fw
ID0gZm9udC0+bGluZUdhcCgpOworICAgICAgICBJbnRSZWN0IHRleHRSZWN0KHBvaW50LngoKSAt
IGxpbmVHYXAsIHBvaW50LnkoKSAtIGZvbnQtPmFzY2VudCgpIC0gbGluZUdhcCwgdG90YWxXaWR0
aCArIDIgKiBsaW5lR2FwLCBmb250LT5saW5lU3BhY2luZygpKTsKKyAgICAgICAgSERDIGhkYyA9
IGdyYXBoaWNzQ29udGV4dC0+Z2V0V2luZG93c0NvbnRleHQodGV4dFJlY3QpOworICAgICAgICBT
ZWxlY3RPYmplY3QoaGRjLCBmb250LT5tX2ZvbnQuaGZvbnQoKSk7CisKKyAgICAgICAgLy8gU2V0
IHRoZSBjb3JyZWN0IGNvbG9yLgorICAgICAgICBIREMgdGV4dERyYXdpbmdEQyA9IGhkYzsKKyAg
ICAgICAgLyppZiAoZmlsbENvbG9yLmhhc0FscGhhKCkgfHwgZ3JhcGhpY3NDb250ZXh0LT5pblRy
YW5zcGFyZW5jeUxheWVyKCkpIHsKKyAgICAgICAgICAgIC8vIEdESSBjYW4ndCBoYW5kbGUgZHJh
d2luZyB0cmFuc3BhcmVudCB0ZXh0LiAgV2UgaGF2ZSB0byBkcmF3IGludG8gYSBtYXNrLiAgV2Ug
ZHJhdyBibGFjayB0ZXh0IG9uIGEgd2hpdGUtZmlsbGVkIGJhY2tncm91bmQuCisgICAgICAgICAg
ICAvLyBXZSBhbHNvIGRvIHRoaXMgd2hlbiBpbnNpZGUgdHJhbnNwYXJlbmN5IGxheWVycywgc2lu
Y2UgR0RJIGFsc28gY2FuJ3QgZHJhdyBvbnRvIGEgc3VyZmFjZSB3aXRoIGFscGhhLgorICAgICAg
ICAgICAgZ3JhcGhpY3NDb250ZXh0LT5zYXZlKCk7CisgICAgICAgICAgICBncmFwaGljc0NvbnRl
eHQtPnNldEZpbGxDb2xvcihDb2xvcjo6d2hpdGUpOworICAgICAgICAgICAgdGV4dERyYXdpbmdE
QyA9IGdyYXBoaWNzQ29udGV4dC0+Z2V0V2luZG93c0JpdG1hcENvbnRleHQodGV4dFJlY3QpOwor
ICAgICAgICAgICAgU2V0VGV4dENvbG9yKGhkYywgUkdCKDAsIDAsIDApKTsKKyAgICAgICAgfSBl
bHNlKi8KKyAgICAgICAgICAgIFNldFRleHRDb2xvcihoZGMsIFJHQihmaWxsQ29sb3IucmVkKCks
IGZpbGxDb2xvci5ncmVlbigpLCBmaWxsQ29sb3IuYmx1ZSgpKSk7CisKKyAgICAgICAgU2V0QmtN
b2RlKGhkYywgVFJBTlNQQVJFTlQpOworICAgICAgICBTZXRUZXh0QWxpZ24oaGRjLCBUQV9MRUZU
IHwgVEFfQkFTRUxJTkUpOworCisgICAgICAgIC8vIFVuaXNjcmliZSBnaXZlcyB1cyBvZmZzZXRz
IHRvIGhlbHAgcmVmaW5lIHRoZSBwb3NpdGlvbmluZyBvZiBjb21iaW5pbmcgZ2x5cGhzLgorICAg
ICAgICBGbG9hdFNpemUgdHJhbnNsYXRpb24gPSBnbHlwaEJ1ZmZlci5vZmZzZXRBdChmcm9tKTsK
KyAgICAgICAgaWYgKHRyYW5zbGF0aW9uLndpZHRoKCkgfHwgdHJhbnNsYXRpb24uaGVpZ2h0KCkp
IHsKKyAgICAgICAgICAgIFhGT1JNIHhmb3JtOworICAgICAgICAgICAgeGZvcm0uZU0xMSA9IDEu
MDsKKyAgICAgICAgICAgIHhmb3JtLmVNMTIgPSAwOworICAgICAgICAgICAgeGZvcm0uZU0yMSA9
IDA7CisgICAgICAgICAgICB4Zm9ybS5lTTIyID0gMS4wOworICAgICAgICAgICAgeGZvcm0uZUR4
ID0gdHJhbnNsYXRpb24ud2lkdGgoKTsKKyAgICAgICAgICAgIHhmb3JtLmVEeSA9IHRyYW5zbGF0
aW9uLmhlaWdodCgpOworICAgICAgICAgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0oaGRjLCAmeGZv
cm0sIE1XVF9MRUZUTVVMVElQTFkpOworICAgICAgICB9CisgICAgICAgIEV4dFRleHRPdXQoaGRj
LCBwb2ludC54KCksIHBvaW50LnkoKSwgRVRPX0dMWVBIX0lOREVYLCAwLCAoV0NIQVIqKWdseXBo
QnVmZmVyLmdseXBocyhmcm9tKSwgbnVtR2x5cGhzLCBnZGlBZHZhbmNlcy5kYXRhKCkpOworCisg
ICAgICAgIC8qaWYgKGZpbGxDb2xvci5oYXNBbHBoYSgpIHx8IGdyYXBoaWNzQ29udGV4dC0+aW5U
cmFuc3BhcmVuY3lMYXllcigpKSB7CisgICAgICAgICAgICAvLyBUT0RPRDogV2UgaGF2ZSB0byB3
YWxrIHRoZSBiaXRzIG9mIHRoZSBiaXRtYXAgYW5kIGludmVydCB0aGVtLiAgV2UgYWxzbyBjb3B5
IG92ZXIgdGhlIGdyZWVuIGNvbXBvbmVudCB2YWx1ZSBpbnRvIHRoZSBhbHBoYSB2YWx1ZQorICAg
ICAgICAgICAgLy8gdG8ga2VlcCBDbGVhclR5cGUgbG9va2luZyByZWFzb25hYmxlLgorCisgICAg
ICAgICAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGRyYXduIHRoZSB0ZXh0IGludG8gYSBiaXRtYXAg
YW5kIGludmVydGVkIGl0LCBvYnRhaW4gYSBDR0ltYWdlUmVmIG1hc2suCisgICAgICAgICAgICBD
R0ltYWdlUmVmIG1hc2sgPSBncmFwaGljc0NvbnRleHQtPnJlbGVhc2VXaW5kb3dzQml0bWFwQ29u
dGV4dEludG9NYXNrKHRleHREcmF3aW5nREMsIHRleHRSZWN0KTsKKyAgICAgICAgICAgIAorICAg
ICAgICAgICAgLy8gQXBwbHkgdGhlIG1hc2sgdG8gdGhlIGZpbGwgY29sb3IuCisgICAgICAgICAg
ICBDR0NvbnRleHRSZWYgYml0bWFwQ29udGV4dCA9IGdyYXBoaWNzQ29udGV4dC0+Z2V0V2luZG93
c0NvbXBhdGlibGVDR0JpdG1hcENvbnRleHQodGV4dFJlY3Quc2l6ZSgpKTsKKyAgICAgICAgICAg
IENHRmxvYXQgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGE7CisgICAgICAgICAgICBjb2xvci5nZXRS
R0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAgICAgICAgICAgIENHQ29udGV4dFNldFJH
QkZpbGxDb2xvcihjb250ZXh0LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisgICAgICAgICAg
ICBDR0NvbnRleHRGaWxsUmVjdChiaXRtYXBDb250ZXh0LCBJbnRSZWN0KDAsIDAsIHRleHRSZWN0
LndpZHRoKCksIHRleHRSZWN0LmhlaWdodCgpKSk7CisgICAgICAgICAgICBDR0ltYWdlUmVmIGZp
bGxDb2xvckltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlSW1hZ2UoYml0bWFwQ29udGV4dCk7
CisgICAgICAgIAorICAgICAgICAgICAgLy8gQXBwbHkgdGhlIG1hc2suCisgICAgICAgICAgICBD
R0ltYWdlUmVmIGZpbmFsSW1hZ2UgPSBDR0ltYWdlQ3JlYXRlV2l0aE1hc2soZmlsbENvbG9ySW1h
Z2UsIG1hc2spOworCisgICAgICAgICAgICAvLyBUaGUgYml0bWFwIGltYWdlIG5lZWRzIHRvIGJl
IGRyYXduIGludG8gdGhlIEhEQy4KKyAgICAgICAgICAgIGdyYXBoaWNzQ29udGV4dC0+ZHJhd0lt
YWdlSW50b1dpbmRvd3NDb250ZXh0KGhkYywgZmluYWxJbWFnZSk7CisKKyAgICAgICAgICAgIC8v
IFJlbGVhc2Ugb3VyIGltYWdlcyBhbmQgY29udGV4dHMuCisgICAgICAgICAgICBDR0ltYWdlUmVs
ZWFzZShtYXNrKTsKKyAgICAgICAgICAgIENHSW1hZ2VSZWxlYXNlKGZpbGxDb2xvckltYWdlKTsK
KyAgICAgICAgICAgIENHSW1hZ2VSZWxlYXNlKGZpbmFsSW1hZ2UpOworICAgICAgICAgICAgQ0dD
b250ZXh0UmVsZWFzZShiaXRtYXBDb250ZXh0KTsKKyAgICAgICAgfSovCisKKyAgICAgICAgZ3Jh
cGhpY3NDb250ZXh0LT5yZWxlYXNlV2luZG93c0NvbnRleHQoaGRjLCB0ZXh0UmVjdCk7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDR0NvbnRleHRSZWYgY2dDb250ZXh0ID0gZ3JhcGhp
Y3NDb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKKworICAgIHVpbnQzMl90IG9sZEZvbnRTbW9v
dGhpbmdTdHlsZSA9IHdrU2V0Rm9udFNtb290aGluZ1N0eWxlKGNnQ29udGV4dCk7CisKKyAgICBj
b25zdCBGb250UGxhdGZvcm1EYXRhJiBwbGF0Zm9ybURhdGEgPSBmb250LT5wbGF0Zm9ybURhdGEo
KTsKKworICAgIENHQ29udGV4dFNldEZvbnQoY2dDb250ZXh0LCBwbGF0Zm9ybURhdGEuY2dGb250
KCkpOworCisgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbWF0cml4ID0gQ0dBZmZpbmVUcmFuc2Zvcm1J
ZGVudGl0eTsKKyAgICBtYXRyaXguYiA9IC1tYXRyaXguYjsKKyAgICBtYXRyaXguZCA9IC1tYXRy
aXguZDsKKworICAgIGlmIChwbGF0Zm9ybURhdGEuc3ludGhldGljT2JsaXF1ZSgpKQorICAgIHsK
KyAgICAgICAgc3RhdGljIGZsb2F0IHNrZXcgPSAtdGFuZihzeW50aGV0aWNPYmxpcXVlQW5nbGUg
KiBhY29zZigwKSAvIDkwKTsKKyAgICAgICAgbWF0cml4ID0gQ0dBZmZpbmVUcmFuc2Zvcm1Db25j
YXQobWF0cml4LCBDR0FmZmluZVRyYW5zZm9ybU1ha2UoMSwgMCwgc2tldywgMSwgMCwgMCkpOwor
ICAgIH0KKworICAgIC8vIFVuaXNjcmliZSBnaXZlcyB1cyBvZmZzZXRzIHRvIGhlbHAgcmVmaW5l
IHRoZSBwb3NpdGlvbmluZyBvZiBjb21iaW5pbmcgZ2x5cGhzLgorICAgIEZsb2F0U2l6ZSB0cmFu
c2xhdGlvbiA9IGdseXBoQnVmZmVyLm9mZnNldEF0KGZyb20pOworICAgIGlmICh0cmFuc2xhdGlv
bi53aWR0aCgpIHx8IHRyYW5zbGF0aW9uLmhlaWdodCgpKQorICAgICAgICBDR0FmZmluZVRyYW5z
Zm9ybVRyYW5zbGF0ZShtYXRyaXgsIHRyYW5zbGF0aW9uLndpZHRoKCksIHRyYW5zbGF0aW9uLmhl
aWdodCgpKTsKKyAgICAKKyAgICBDR0NvbnRleHRTZXRUZXh0TWF0cml4KGNnQ29udGV4dCwgbWF0
cml4KTsKKworICAgIENHQ29udGV4dFNldEZvbnRTaXplKGNnQ29udGV4dCwgcGxhdGZvcm1EYXRh
LnNpemUoKSk7CisgICAgQ0dDb250ZXh0U2V0VGV4dFBvc2l0aW9uKGNnQ29udGV4dCwgcG9pbnQu
eCgpLCBwb2ludC55KCkpOworICAgIENHQ29udGV4dFNob3dHbHlwaHNXaXRoQWR2YW5jZXMoY2dD
b250ZXh0LCBnbHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSksIGdseXBoQnVmZmVyLmFkdmFuY2VzKGZy
b20pLCBudW1HbHlwaHMpOworICAgIGlmIChmb250LT5tX3N5bnRoZXRpY0JvbGRPZmZzZXQpIHsK
KyAgICAgICAgQ0dDb250ZXh0U2V0VGV4dFBvc2l0aW9uKGNnQ29udGV4dCwgcG9pbnQueCgpICsg
Zm9udC0+bV9zeW50aGV0aWNCb2xkT2Zmc2V0LCBwb2ludC55KCkpOworICAgICAgICBDR0NvbnRl
eHRTaG93R2x5cGhzV2l0aEFkdmFuY2VzKGNnQ29udGV4dCwgZ2x5cGhCdWZmZXIuZ2x5cGhzKGZy
b20pLCBnbHlwaEJ1ZmZlci5hZHZhbmNlcyhmcm9tKSwgbnVtR2x5cGhzKTsKKyAgICB9CisKKyAg
ICB3a1Jlc3RvcmVGb250U21vb3RoaW5nU3R5bGUoY2dDb250ZXh0LCBvbGRGb250U21vb3RoaW5n
U3R5bGUpOworfQorCitGbG9hdFJlY3QgRm9udDo6c2VsZWN0aW9uUmVjdEZvckNvbXBsZXhUZXh0
KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgSW50UG9pbnQmIHBvaW50LCBpbnQgaCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyb20sIGludCB0bykg
Y29uc3QKK3sKKyAgICBVbmlzY3JpYmVDb250cm9sbGVyIGl0KHRoaXMsIHJ1bik7CisgICAgaXQu
YWR2YW5jZShmcm9tKTsKKyAgICBmbG9hdCBiZWZvcmVXaWR0aCA9IGl0LnJ1bldpZHRoU29GYXIo
KTsKKyAgICBpdC5hZHZhbmNlKHRvKTsKKyAgICBmbG9hdCBhZnRlcldpZHRoID0gaXQucnVuV2lk
dGhTb0ZhcigpOworCisgICAgLy8gVXNpbmcgcm91bmRmKCkgcmF0aGVyIHRoYW4gY2VpbGYoKSBm
b3IgdGhlIHJpZ2h0IGVkZ2UgYXMgYSBjb21wcm9taXNlIHRvIGVuc3VyZSBjb3JyZWN0IGNhcmV0
IHBvc2l0aW9uaW5nCisgICAgaWYgKHJ1bi5ydGwoKSkgeworICAgICAgICBpdC5hZHZhbmNlKHJ1
bi5sZW5ndGgoKSk7CisgICAgICAgIGZsb2F0IHRvdGFsV2lkdGggPSBpdC5ydW5XaWR0aFNvRmFy
KCk7CisgICAgICAgIHJldHVybiBGbG9hdFJlY3QocG9pbnQueCgpICsgZmxvb3JmKHRvdGFsV2lk
dGggLSBhZnRlcldpZHRoKSwgcG9pbnQueSgpLCByb3VuZGYodG90YWxXaWR0aCAtIGJlZm9yZVdp
ZHRoKSAtIGZsb29yZih0b3RhbFdpZHRoIC0gYWZ0ZXJXaWR0aCksIGgpOworICAgIH0gCisgICAg
CisgICAgcmV0dXJuIEZsb2F0UmVjdChwb2ludC54KCkgKyBmbG9vcmYoYmVmb3JlV2lkdGgpLCBw
b2ludC55KCksIHJvdW5kZihhZnRlcldpZHRoKSAtIGZsb29yZihiZWZvcmVXaWR0aCksIGgpOwor
fQorCit2b2lkIEZvbnQ6OmRyYXdDb21wbGV4VGV4dChHcmFwaGljc0NvbnRleHQqIGNvbnRleHQs
IGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAoreworICAgIC8vIFRoaXMg
Z2x5cGggYnVmZmVyIGhvbGRzIG91ciBnbHlwaHMgKyBhZHZhbmNlcyArIGZvbnQgZGF0YSBmb3Ig
ZWFjaCBnbHlwaC4KKyAgICBHbHlwaEJ1ZmZlciBnbHlwaEJ1ZmZlcjsKKworICAgIGZsb2F0IHN0
YXJ0WCA9IHBvaW50LngoKTsKKyAgICBVbmlzY3JpYmVDb250cm9sbGVyIGNvbnRyb2xsZXIodGhp
cywgcnVuKTsKKyAgICBjb250cm9sbGVyLmFkdmFuY2UoZnJvbSk7CisgICAgZmxvYXQgYmVmb3Jl
V2lkdGggPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKTsKKyAgICBjb250cm9sbGVyLmFkdmFu
Y2UodG8sICZnbHlwaEJ1ZmZlcik7CisgICAgCisgICAgLy8gV2UgY291bGRuJ3QgZ2VuZXJhdGUg
YW55IGdseXBocyBmb3IgdGhlIHJ1bi4gIEdpdmUgdXAuCisgICAgaWYgKGdseXBoQnVmZmVyLmlz
RW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIGZsb2F0IGFmdGVyV2lkdGggPSBj
b250cm9sbGVyLnJ1bldpZHRoU29GYXIoKTsKKworICAgIGlmIChydW4ucnRsKCkpIHsKKyAgICAg
ICAgY29udHJvbGxlci5hZHZhbmNlKHJ1bi5sZW5ndGgoKSk7CisgICAgICAgIHN0YXJ0WCArPSBj
b250cm9sbGVyLnJ1bldpZHRoU29GYXIoKSAtIGFmdGVyV2lkdGg7CisgICAgfSBlbHNlCisgICAg
ICAgIHN0YXJ0WCArPSBiZWZvcmVXaWR0aDsKKworICAgIC8vIERyYXcgdGhlIGdseXBoIGJ1ZmZl
ciBub3cgYXQgdGhlIHN0YXJ0aW5nIHBvaW50IHJldHVybmVkIGluIHN0YXJ0WC4KKyAgICBGbG9h
dFBvaW50IHN0YXJ0UG9pbnQoc3RhcnRYLCBwb2ludC55KCkpOworICAgIGRyYXdHbHlwaEJ1ZmZl
cihjb250ZXh0LCBnbHlwaEJ1ZmZlciwgcnVuLCBzdGFydFBvaW50KTsKK30KKworZmxvYXQgRm9u
dDo6ZmxvYXRXaWR0aEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1bikgY29uc3QKK3sK
KyAgICBVbmlzY3JpYmVDb250cm9sbGVyIGNvbnRyb2xsZXIodGhpcywgcnVuKTsKKyAgICBjb250
cm9sbGVyLmFkdmFuY2UocnVuLmxlbmd0aCgpKTsKKyAgICByZXR1cm4gY29udHJvbGxlci5ydW5X
aWR0aFNvRmFyKCk7Cit9CisKK2ludCBGb250OjpvZmZzZXRGb3JQb3NpdGlvbkZvckNvbXBsZXhU
ZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgaW50IHgsIGJvb2wgaW5jbHVkZVBhcnRpYWxHbHlwaHMp
IGNvbnN0Cit7CisgICAgVW5pc2NyaWJlQ29udHJvbGxlciBjb250cm9sbGVyKHRoaXMsIHJ1bik7
CisgICAgcmV0dXJuIGNvbnRyb2xsZXIub2Zmc2V0Rm9yUG9zaXRpb24oeCwgaW5jbHVkZVBhcnRp
YWxHbHlwaHMpOworfQorCit9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9G
b250Q0dXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0ZvbnRDR1dpbi5jcHAJKHJldmlzaW9uIDI5NzI2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW4vRm9udENHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8q
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuICBBbGwg
cmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yNiwx
MSArMjYsMTAgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJGb250LmgiCiAKLSNp
bmNsdWRlICJGb250RmFsbGJhY2tMaXN0LmgiCisvLyNpbmNsdWRlICJGb250RmFsbGJhY2tMaXN0
LmgiCiAjaW5jbHVkZSAiR2x5cGhCdWZmZXIuaCIKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQu
aCIKICNpbmNsdWRlICJJbnRSZWN0LmgiCi0jaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNp
bmNsdWRlICJTaW1wbGVGb250RGF0YS5oIgogI2luY2x1ZGUgIlVuaXNjcmliZUNvbnRyb2xsZXIu
aCIKICNpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4K
QEAgLTE2Myw2NSArMTYyLDQgQEAgdm9pZCBGb250OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4
dCogZwogICAgIHdrUmVzdG9yZUZvbnRTbW9vdGhpbmdTdHlsZShjZ0NvbnRleHQsIG9sZEZvbnRT
bW9vdGhpbmdTdHlsZSk7CiB9CiAKLUZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29t
cGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCBo
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwg
aW50IHRvKSBjb25zdAotewotICAgIFVuaXNjcmliZUNvbnRyb2xsZXIgaXQodGhpcywgcnVuKTsK
LSAgICBpdC5hZHZhbmNlKGZyb20pOwotICAgIGZsb2F0IGJlZm9yZVdpZHRoID0gaXQucnVuV2lk
dGhTb0ZhcigpOwotICAgIGl0LmFkdmFuY2UodG8pOwotICAgIGZsb2F0IGFmdGVyV2lkdGggPSBp
dC5ydW5XaWR0aFNvRmFyKCk7Ci0KLSAgICAvLyBVc2luZyByb3VuZGYoKSByYXRoZXIgdGhhbiBj
ZWlsZigpIGZvciB0aGUgcmlnaHQgZWRnZSBhcyBhIGNvbXByb21pc2UgdG8gZW5zdXJlIGNvcnJl
Y3QgY2FyZXQgcG9zaXRpb25pbmcKLSAgICBpZiAocnVuLnJ0bCgpKSB7Ci0gICAgICAgIGl0LmFk
dmFuY2UocnVuLmxlbmd0aCgpKTsKLSAgICAgICAgZmxvYXQgdG90YWxXaWR0aCA9IGl0LnJ1bldp
ZHRoU29GYXIoKTsKLSAgICAgICAgcmV0dXJuIEZsb2F0UmVjdChwb2ludC54KCkgKyBmbG9vcmYo
dG90YWxXaWR0aCAtIGFmdGVyV2lkdGgpLCBwb2ludC55KCksIHJvdW5kZih0b3RhbFdpZHRoIC0g
YmVmb3JlV2lkdGgpIC0gZmxvb3JmKHRvdGFsV2lkdGggLSBhZnRlcldpZHRoKSwgaCk7Ci0gICAg
fSAKLSAgICAKLSAgICByZXR1cm4gRmxvYXRSZWN0KHBvaW50LngoKSArIGZsb29yZihiZWZvcmVX
aWR0aCksIHBvaW50LnkoKSwgcm91bmRmKGFmdGVyV2lkdGgpIC0gZmxvb3JmKGJlZm9yZVdpZHRo
KSwgaCk7Ci19Ci0KLXZvaWQgRm9udDo6ZHJhd0NvbXBsZXhUZXh0KEdyYXBoaWNzQ29udGV4dCog
Y29udGV4dCwgY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0Ci17Ci0gICAg
Ly8gVGhpcyBnbHlwaCBidWZmZXIgaG9sZHMgb3VyIGdseXBocyArIGFkdmFuY2VzICsgZm9udCBk
YXRhIGZvciBlYWNoIGdseXBoLgotICAgIEdseXBoQnVmZmVyIGdseXBoQnVmZmVyOwotCi0gICAg
ZmxvYXQgc3RhcnRYID0gcG9pbnQueCgpOwotICAgIFVuaXNjcmliZUNvbnRyb2xsZXIgY29udHJv
bGxlcih0aGlzLCBydW4pOwotICAgIGNvbnRyb2xsZXIuYWR2YW5jZShmcm9tKTsKLSAgICBmbG9h
dCBiZWZvcmVXaWR0aCA9IGNvbnRyb2xsZXIucnVuV2lkdGhTb0ZhcigpOwotICAgIGNvbnRyb2xs
ZXIuYWR2YW5jZSh0bywgJmdseXBoQnVmZmVyKTsKLSAgICAKLSAgICAvLyBXZSBjb3VsZG4ndCBn
ZW5lcmF0ZSBhbnkgZ2x5cGhzIGZvciB0aGUgcnVuLiAgR2l2ZSB1cC4KLSAgICBpZiAoZ2x5cGhC
dWZmZXIuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgZmxvYXQgYWZ0ZXJX
aWR0aCA9IGNvbnRyb2xsZXIucnVuV2lkdGhTb0ZhcigpOwotCi0gICAgaWYgKHJ1bi5ydGwoKSkg
ewotICAgICAgICBjb250cm9sbGVyLmFkdmFuY2UocnVuLmxlbmd0aCgpKTsKLSAgICAgICAgc3Rh
cnRYICs9IGNvbnRyb2xsZXIucnVuV2lkdGhTb0ZhcigpIC0gYWZ0ZXJXaWR0aDsKLSAgICB9IGVs
c2UKLSAgICAgICAgc3RhcnRYICs9IGJlZm9yZVdpZHRoOwotCi0gICAgLy8gRHJhdyB0aGUgZ2x5
cGggYnVmZmVyIG5vdyBhdCB0aGUgc3RhcnRpbmcgcG9pbnQgcmV0dXJuZWQgaW4gc3RhcnRYLgot
ICAgIEZsb2F0UG9pbnQgc3RhcnRQb2ludChzdGFydFgsIHBvaW50LnkoKSk7Ci0gICAgZHJhd0ds
eXBoQnVmZmVyKGNvbnRleHQsIGdseXBoQnVmZmVyLCBydW4sIHN0YXJ0UG9pbnQpOwotfQotCi1m
bG9hdCBGb250OjpmbG9hdFdpZHRoRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuKSBj
b25zdAotewotICAgIFVuaXNjcmliZUNvbnRyb2xsZXIgY29udHJvbGxlcih0aGlzLCBydW4pOwot
ICAgIGNvbnRyb2xsZXIuYWR2YW5jZShydW4ubGVuZ3RoKCkpOwotICAgIHJldHVybiBjb250cm9s
bGVyLnJ1bldpZHRoU29GYXIoKTsKLX0KLQotaW50IEZvbnQ6Om9mZnNldEZvclBvc2l0aW9uRm9y
Q29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBpbnQgeCwgYm9vbCBpbmNsdWRlUGFydGlh
bEdseXBocykgY29uc3QKLXsKLSAgICBVbmlzY3JpYmVDb250cm9sbGVyIGNvbnRyb2xsZXIodGhp
cywgcnVuKTsKLSAgICByZXR1cm4gY29udHJvbGxlci5vZmZzZXRGb3JQb3NpdGlvbih4LCBpbmNs
dWRlUGFydGlhbEdseXBocyk7Ci19Ci0KIH0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0ZvbnRDYWlyb1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW4vRm9udENhaXJvV2luLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAg
KzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUgSW5j
LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkZvbnQuaCIKKworI2luY2x1ZGUgIkdseXBoQnVmZmVyLmgiCisjaW5jbHVkZSAiR3Jh
cGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJT
aW1wbGVGb250RGF0YS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3ZvaWQgRm9udDo6ZHJh
d0dseXBocyhHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwgY29uc3QgU2ltcGxlRm9u
dERhdGEqIGZvbnQsIGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZlciwgCisgICAgICAgICAg
ICAgICAgICAgICAgaW50IGZyb20sIGludCBudW1HbHlwaHMsIGNvbnN0IEZsb2F0UG9pbnQmIHBv
aW50KSBjb25zdAoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK30KSW5kZXg6IFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRXaW4uY3BwCShyZXZpc2lvbiAyOTgzNCkKKysr
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRXaW4uY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJ
bmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAy
MDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKQEAgLTMzLDEzNiArMzMsMTAgQEAKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRl
ZC5oIgogI2luY2x1ZGUgIlNpbXBsZUZvbnREYXRhLmgiCiAjaW5jbHVkZSAiVW5pc2NyaWJlQ29u
dHJvbGxlci5oIgotI2luY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2
aWNlcy5oPgotI2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVyZmFjZS9XZWJLaXRTeXN0ZW1JbnRl
cmZhY2UuaD4KICNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgogCiBuYW1lc3BhY2UgV2ViQ29y
ZSB7CiAKLWNvbnN0IGludCBzeW50aGV0aWNPYmxpcXVlQW5nbGUgPSAxNDsKLQotdm9pZCBGb250
OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3NDb250ZXh0LCBjb25zdCBTaW1w
bGVGb250RGF0YSogZm9udCwgY29uc3QgR2x5cGhCdWZmZXImIGdseXBoQnVmZmVyLCAKLSAgICAg
ICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IG51bUdseXBocywgY29uc3QgRmxvYXRQb2lu
dCYgcG9pbnQpIGNvbnN0Ci17Ci0gICAgaWYgKGZvbnQtPm1fZm9udC51c2VHREkoKSkgewotICAg
ICAgICAvLyBGSVhNRTogU3VwcG9ydCBhbHBoYSBibGVuZGluZy4KLSAgICAgICAgLy8gRklYTUU6
IFN1cHBvcnQgdGV4dCBzdHJva2UvZmlsbC4KLSAgICAgICAgLy8gRklYTUU6IFN1cHBvcnQgdGV4
dCBzaGFkb3cuCi0gICAgICAgIENvbG9yIGZpbGxDb2xvciA9IGdyYXBoaWNzQ29udGV4dC0+Zmls
bENvbG9yKCk7Ci0gICAgICAgIGlmIChmaWxsQ29sb3IuYWxwaGEoKSA9PSAwKQotICAgICAgICAg
ICAgcmV0dXJuOwotCi0gICAgICAgIC8vIFdlIGhhdmUgdG8gY29udmVydCBDRydzIHR3by1kaW1l
bnNpb25hbCBmbG9hdGluZyBwb2ludCBhZHZhbmNlcyB0byBqdXN0IGhvcml6b250YWwgaW50ZWdl
ciBhZHZhbmNlcy4KLSAgICAgICAgVmVjdG9yPGludCwgMjA0OD4gZ2RpQWR2YW5jZXM7Ci0gICAg
ICAgIGludCB0b3RhbFdpZHRoID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1H
bHlwaHM7IGkrKykgewotICAgICAgICAgICAgZ2RpQWR2YW5jZXMuYXBwZW5kKGxyb3VuZGYoZ2x5
cGhCdWZmZXIuYWR2YW5jZUF0KGZyb20gKyBpKSkpOwotICAgICAgICAgICAgdG90YWxXaWR0aCAr
PSBnZGlBZHZhbmNlc1tpXTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIHB1dCBzbG9wIGlu
dG8gdGhpcyByZWN0LCBzaW5jZSBnbHlwaHMgY2FuIG92ZXJmbG93IHRoZSBhc2NlbnQvZGVzY2Vu
dCBib3VuZHMgYW5kIHRoZSBsZWZ0L3JpZ2h0IGVkZ2VzLgotICAgICAgICBpbnQgbGluZUdhcCA9
IGZvbnQtPmxpbmVHYXAoKTsKLSAgICAgICAgSW50UmVjdCB0ZXh0UmVjdChwb2ludC54KCkgLSBs
aW5lR2FwLCBwb2ludC55KCkgLSBmb250LT5hc2NlbnQoKSAtIGxpbmVHYXAsIHRvdGFsV2lkdGgg
KyAyICogbGluZUdhcCwgZm9udC0+bGluZVNwYWNpbmcoKSk7Ci0gICAgICAgIEhEQyBoZGMgPSBn
cmFwaGljc0NvbnRleHQtPmdldFdpbmRvd3NDb250ZXh0KHRleHRSZWN0KTsKLSAgICAgICAgU2Vs
ZWN0T2JqZWN0KGhkYywgZm9udC0+bV9mb250Lmhmb250KCkpOwotCi0gICAgICAgIC8vIFNldCB0
aGUgY29ycmVjdCBjb2xvci4KLSAgICAgICAgSERDIHRleHREcmF3aW5nREMgPSBoZGM7Ci0gICAg
ICAgIC8qaWYgKGZpbGxDb2xvci5oYXNBbHBoYSgpIHx8IGdyYXBoaWNzQ29udGV4dC0+aW5UcmFu
c3BhcmVuY3lMYXllcigpKSB7Ci0gICAgICAgICAgICAvLyBHREkgY2FuJ3QgaGFuZGxlIGRyYXdp
bmcgdHJhbnNwYXJlbnQgdGV4dC4gIFdlIGhhdmUgdG8gZHJhdyBpbnRvIGEgbWFzay4gIFdlIGRy
YXcgYmxhY2sgdGV4dCBvbiBhIHdoaXRlLWZpbGxlZCBiYWNrZ3JvdW5kLgotICAgICAgICAgICAg
Ly8gV2UgYWxzbyBkbyB0aGlzIHdoZW4gaW5zaWRlIHRyYW5zcGFyZW5jeSBsYXllcnMsIHNpbmNl
IEdESSBhbHNvIGNhbid0IGRyYXcgb250byBhIHN1cmZhY2Ugd2l0aCBhbHBoYS4KLSAgICAgICAg
ICAgIGdyYXBoaWNzQ29udGV4dC0+c2F2ZSgpOwotICAgICAgICAgICAgZ3JhcGhpY3NDb250ZXh0
LT5zZXRGaWxsQ29sb3IoQ29sb3I6OndoaXRlKTsKLSAgICAgICAgICAgIHRleHREcmF3aW5nREMg
PSBncmFwaGljc0NvbnRleHQtPmdldFdpbmRvd3NCaXRtYXBDb250ZXh0KHRleHRSZWN0KTsKLSAg
ICAgICAgICAgIFNldFRleHRDb2xvcihoZGMsIFJHQigwLCAwLCAwKSk7Ci0gICAgICAgIH0gZWxz
ZSovCi0gICAgICAgICAgICBTZXRUZXh0Q29sb3IoaGRjLCBSR0IoZmlsbENvbG9yLnJlZCgpLCBm
aWxsQ29sb3IuZ3JlZW4oKSwgZmlsbENvbG9yLmJsdWUoKSkpOwotCi0gICAgICAgIFNldEJrTW9k
ZShoZGMsIFRSQU5TUEFSRU5UKTsKLSAgICAgICAgU2V0VGV4dEFsaWduKGhkYywgVEFfTEVGVCB8
IFRBX0JBU0VMSU5FKTsKLQotICAgICAgICAvLyBVbmlzY3JpYmUgZ2l2ZXMgdXMgb2Zmc2V0cyB0
byBoZWxwIHJlZmluZSB0aGUgcG9zaXRpb25pbmcgb2YgY29tYmluaW5nIGdseXBocy4KLSAgICAg
ICAgRmxvYXRTaXplIHRyYW5zbGF0aW9uID0gZ2x5cGhCdWZmZXIub2Zmc2V0QXQoZnJvbSk7Ci0g
ICAgICAgIGlmICh0cmFuc2xhdGlvbi53aWR0aCgpIHx8IHRyYW5zbGF0aW9uLmhlaWdodCgpKSB7
Ci0gICAgICAgICAgICBYRk9STSB4Zm9ybTsKLSAgICAgICAgICAgIHhmb3JtLmVNMTEgPSAxLjA7
Ci0gICAgICAgICAgICB4Zm9ybS5lTTEyID0gMDsKLSAgICAgICAgICAgIHhmb3JtLmVNMjEgPSAw
OwotICAgICAgICAgICAgeGZvcm0uZU0yMiA9IDEuMDsKLSAgICAgICAgICAgIHhmb3JtLmVEeCA9
IHRyYW5zbGF0aW9uLndpZHRoKCk7Ci0gICAgICAgICAgICB4Zm9ybS5lRHkgPSB0cmFuc2xhdGlv
bi5oZWlnaHQoKTsKLSAgICAgICAgICAgIE1vZGlmeVdvcmxkVHJhbnNmb3JtKGhkYywgJnhmb3Jt
LCBNV1RfTEVGVE1VTFRJUExZKTsKLSAgICAgICAgfQotICAgICAgICBFeHRUZXh0T3V0KGhkYywg
cG9pbnQueCgpLCBwb2ludC55KCksIEVUT19HTFlQSF9JTkRFWCwgMCwgKFdDSEFSKilnbHlwaEJ1
ZmZlci5nbHlwaHMoZnJvbSksIG51bUdseXBocywgZ2RpQWR2YW5jZXMuZGF0YSgpKTsKLQotICAg
ICAgICAvKmlmIChmaWxsQ29sb3IuaGFzQWxwaGEoKSB8fCBncmFwaGljc0NvbnRleHQtPmluVHJh
bnNwYXJlbmN5TGF5ZXIoKSkgewotICAgICAgICAgICAgLy8gVE9ET0Q6IFdlIGhhdmUgdG8gd2Fs
ayB0aGUgYml0cyBvZiB0aGUgYml0bWFwIGFuZCBpbnZlcnQgdGhlbS4gIFdlIGFsc28gY29weSBv
dmVyIHRoZSBncmVlbiBjb21wb25lbnQgdmFsdWUgaW50byB0aGUgYWxwaGEgdmFsdWUKLSAgICAg
ICAgICAgIC8vIHRvIGtlZXAgQ2xlYXJUeXBlIGxvb2tpbmcgcmVhc29uYWJsZS4KLQotICAgICAg
ICAgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBkcmF3biB0aGUgdGV4dCBpbnRvIGEgYml0bWFwIGFu
ZCBpbnZlcnRlZCBpdCwgb2J0YWluIGEgQ0dJbWFnZVJlZiBtYXNrLgotICAgICAgICAgICAgQ0dJ
bWFnZVJlZiBtYXNrID0gZ3JhcGhpY3NDb250ZXh0LT5yZWxlYXNlV2luZG93c0JpdG1hcENvbnRl
eHRJbnRvTWFzayh0ZXh0RHJhd2luZ0RDLCB0ZXh0UmVjdCk7Ci0gICAgICAgICAgICAKLSAgICAg
ICAgICAgIC8vIEFwcGx5IHRoZSBtYXNrIHRvIHRoZSBmaWxsIGNvbG9yLgotICAgICAgICAgICAg
Q0dDb250ZXh0UmVmIGJpdG1hcENvbnRleHQgPSBncmFwaGljc0NvbnRleHQtPmdldFdpbmRvd3ND
b21wYXRpYmxlQ0dCaXRtYXBDb250ZXh0KHRleHRSZWN0LnNpemUoKSk7Ci0gICAgICAgICAgICBD
R0Zsb2F0IHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhOwotICAgICAgICAgICAgY29sb3IuZ2V0UkdC
QShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci0gICAgICAgICAgICBDR0NvbnRleHRTZXRSR0JG
aWxsQ29sb3IoY29udGV4dCwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotICAgICAgICAgICAg
Q0dDb250ZXh0RmlsbFJlY3QoYml0bWFwQ29udGV4dCwgSW50UmVjdCgwLCAwLCB0ZXh0UmVjdC53
aWR0aCgpLCB0ZXh0UmVjdC5oZWlnaHQoKSkpOwotICAgICAgICAgICAgQ0dJbWFnZVJlZiBmaWxs
Q29sb3JJbWFnZSA9IENHQml0bWFwQ29udGV4dENyZWF0ZUltYWdlKGJpdG1hcENvbnRleHQpOwot
ICAgICAgICAKLSAgICAgICAgICAgIC8vIEFwcGx5IHRoZSBtYXNrLgotICAgICAgICAgICAgQ0dJ
bWFnZVJlZiBmaW5hbEltYWdlID0gQ0dJbWFnZUNyZWF0ZVdpdGhNYXNrKGZpbGxDb2xvckltYWdl
LCBtYXNrKTsKLQotICAgICAgICAgICAgLy8gVGhlIGJpdG1hcCBpbWFnZSBuZWVkcyB0byBiZSBk
cmF3biBpbnRvIHRoZSBIREMuCi0gICAgICAgICAgICBncmFwaGljc0NvbnRleHQtPmRyYXdJbWFn
ZUludG9XaW5kb3dzQ29udGV4dChoZGMsIGZpbmFsSW1hZ2UpOwotCi0gICAgICAgICAgICAvLyBS
ZWxlYXNlIG91ciBpbWFnZXMgYW5kIGNvbnRleHRzLgotICAgICAgICAgICAgQ0dJbWFnZVJlbGVh
c2UobWFzayk7Ci0gICAgICAgICAgICBDR0ltYWdlUmVsZWFzZShmaWxsQ29sb3JJbWFnZSk7Ci0g
ICAgICAgICAgICBDR0ltYWdlUmVsZWFzZShmaW5hbEltYWdlKTsKLSAgICAgICAgICAgIENHQ29u
dGV4dFJlbGVhc2UoYml0bWFwQ29udGV4dCk7Ci0gICAgICAgIH0qLwotCi0gICAgICAgIGdyYXBo
aWNzQ29udGV4dC0+cmVsZWFzZVdpbmRvd3NDb250ZXh0KGhkYywgdGV4dFJlY3QpOwotICAgICAg
ICByZXR1cm47Ci0gICAgfQotCi0gICAgQ0dDb250ZXh0UmVmIGNnQ29udGV4dCA9IGdyYXBoaWNz
Q29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCk7Ci0KLSAgICB1aW50MzJfdCBvbGRGb250U21vb3Ro
aW5nU3R5bGUgPSB3a1NldEZvbnRTbW9vdGhpbmdTdHlsZShjZ0NvbnRleHQpOwotCi0gICAgY29u
c3QgRm9udFBsYXRmb3JtRGF0YSYgcGxhdGZvcm1EYXRhID0gZm9udC0+cGxhdGZvcm1EYXRhKCk7
Ci0KLSAgICBDR0NvbnRleHRTZXRGb250KGNnQ29udGV4dCwgcGxhdGZvcm1EYXRhLmNnRm9udCgp
KTsKLQotICAgIENHQWZmaW5lVHJhbnNmb3JtIG1hdHJpeCA9IENHQWZmaW5lVHJhbnNmb3JtSWRl
bnRpdHk7Ci0gICAgbWF0cml4LmIgPSAtbWF0cml4LmI7Ci0gICAgbWF0cml4LmQgPSAtbWF0cml4
LmQ7Ci0KLSAgICBpZiAocGxhdGZvcm1EYXRhLnN5bnRoZXRpY09ibGlxdWUoKSkKLSAgICB7Ci0g
ICAgICAgIHN0YXRpYyBmbG9hdCBza2V3ID0gLXRhbmYoc3ludGhldGljT2JsaXF1ZUFuZ2xlICog
YWNvc2YoMCkgLyA5MCk7Ci0gICAgICAgIG1hdHJpeCA9IENHQWZmaW5lVHJhbnNmb3JtQ29uY2F0
KG1hdHJpeCwgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlKDEsIDAsIHNrZXcsIDEsIDAsIDApKTsKLSAg
ICB9Ci0KLSAgICAvLyBVbmlzY3JpYmUgZ2l2ZXMgdXMgb2Zmc2V0cyB0byBoZWxwIHJlZmluZSB0
aGUgcG9zaXRpb25pbmcgb2YgY29tYmluaW5nIGdseXBocy4KLSAgICBGbG9hdFNpemUgdHJhbnNs
YXRpb24gPSBnbHlwaEJ1ZmZlci5vZmZzZXRBdChmcm9tKTsKLSAgICBpZiAodHJhbnNsYXRpb24u
d2lkdGgoKSB8fCB0cmFuc2xhdGlvbi5oZWlnaHQoKSkKLSAgICAgICAgQ0dBZmZpbmVUcmFuc2Zv
cm1UcmFuc2xhdGUobWF0cml4LCB0cmFuc2xhdGlvbi53aWR0aCgpLCB0cmFuc2xhdGlvbi5oZWln
aHQoKSk7Ci0gICAgCi0gICAgQ0dDb250ZXh0U2V0VGV4dE1hdHJpeChjZ0NvbnRleHQsIG1hdHJp
eCk7Ci0KLSAgICBDR0NvbnRleHRTZXRGb250U2l6ZShjZ0NvbnRleHQsIHBsYXRmb3JtRGF0YS5z
aXplKCkpOwotICAgIENHQ29udGV4dFNldFRleHRQb3NpdGlvbihjZ0NvbnRleHQsIHBvaW50Lngo
KSwgcG9pbnQueSgpKTsKLSAgICBDR0NvbnRleHRTaG93R2x5cGhzV2l0aEFkdmFuY2VzKGNnQ29u
dGV4dCwgZ2x5cGhCdWZmZXIuZ2x5cGhzKGZyb20pLCBnbHlwaEJ1ZmZlci5hZHZhbmNlcyhmcm9t
KSwgbnVtR2x5cGhzKTsKLSAgICBpZiAoZm9udC0+bV9zeW50aGV0aWNCb2xkT2Zmc2V0KSB7Ci0g
ICAgICAgIENHQ29udGV4dFNldFRleHRQb3NpdGlvbihjZ0NvbnRleHQsIHBvaW50LngoKSArIGZv
bnQtPm1fc3ludGhldGljQm9sZE9mZnNldCwgcG9pbnQueSgpKTsKLSAgICAgICAgQ0dDb250ZXh0
U2hvd0dseXBoc1dpdGhBZHZhbmNlcyhjZ0NvbnRleHQsIGdseXBoQnVmZmVyLmdseXBocyhmcm9t
KSwgZ2x5cGhCdWZmZXIuYWR2YW5jZXMoZnJvbSksIG51bUdseXBocyk7Ci0gICAgfQotCi0gICAg
d2tSZXN0b3JlRm9udFNtb290aGluZ1N0eWxlKGNnQ29udGV4dCwgb2xkRm9udFNtb290aGluZ1N0
eWxlKTsKLX0KLQogRmxvYXRSZWN0IEZvbnQ6OnNlbGVjdGlvblJlY3RGb3JDb21wbGV4VGV4dChj
b25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEludFBvaW50JiBwb2ludCwgaW50IGgsCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcm9tLCBpbnQgdG8pIGNv
bnN0CiB7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRl
eHRDR1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4v
R3JhcGhpY3NDb250ZXh0Q0dXaW4uY3BwCShyZXZpc2lvbiAyOTgzNCkJKGZyb20gV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0V2luLmNwcDoyOTgzNCkKKysrIFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENHV2luLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDM4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMywg
MjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRF
UiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVS
LCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIK
KworI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVk
LmgiCisjaW5jbHVkZSAiUGF0aC5oIgorI2luY2x1ZGUgPENvcmVHcmFwaGljcy9DR0JpdG1hcENv
bnRleHQuaD4KKyNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50
ZXJmYWNlLmg+CisjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KKworI2luY2x1ZGUgIkdyYXBo
aWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZS5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFNWR1Jlc291cmNlSW1hZ2U7CisKK3N0YXRpYyBD
R0NvbnRleHRSZWYgQ0dDb250ZXh0V2l0aEhEQyhIREMgaGRjKQoreworICAgIEhCSVRNQVAgYml0
bWFwID0gKEhCSVRNQVApR2V0Q3VycmVudE9iamVjdChoZGMsIE9CSl9CSVRNQVApOworICAgIENH
Q29sb3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsK
KyAgICBCSVRNQVAgaW5mbzsKKworICAgIEdldE9iamVjdChiaXRtYXAsIHNpemVvZihpbmZvKSwg
JmluZm8pOworICAgIEFTU0VSVChpbmZvLmJtQml0c1BpeGVsID09IDMyKTsKKyAgICBDR0NvbnRl
eHRSZWYgY29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZShpbmZvLmJtQml0cywgaW5mby5i
bVdpZHRoLCBpbmZvLmJtSGVpZ2h0LCA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGluZm8uYm1XaWR0aEJ5dGVzLCBkZXZpY2VSR0IsIGtDR0JpdG1h
cEJ5dGVPcmRlcjMyTGl0dGxlIHwga0NHSW1hZ2VBbHBoYU5vbmVTa2lwRmlyc3QpOworICAgIENH
Q29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKKworICAgIC8vIEZsaXAgY29vcmRzCisgICAg
Q0dDb250ZXh0VHJhbnNsYXRlQ1RNKGNvbnRleHQsIDAsIGluZm8uYm1IZWlnaHQpOworICAgIENH
Q29udGV4dFNjYWxlQ1RNKGNvbnRleHQsIDEsIC0xKTsKKyAgICAKKyAgICAvLyBQdXQgdGhlIEhE
QyBJbiBhZHZhbmNlZCBtb2RlIHNvIGl0IHdpbGwgaG9ub3IgYWZmaW5lIHRyYW5zZm9ybXMuCisg
ICAgU2V0R3JhcGhpY3NNb2RlKGhkYywgR01fQURWQU5DRUQpOworICAgIAorICAgIHJldHVybiBj
b250ZXh0OworfQorCitHcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dChIREMgaGRjKQor
ICAgIDogbV9jb21tb24oY3JlYXRlR3JhcGhpY3NDb250ZXh0UHJpdmF0ZSgpKQorICAgICwgbV9k
YXRhKG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoQ0dDb250ZXh0V2l0aEhEQyho
ZGMpKSkKK3sKKyAgICBDR0NvbnRleHRSZWxlYXNlKG1fZGF0YS0+bV9jZ0NvbnRleHQpOworICAg
IG1fZGF0YS0+bV9oZGMgPSBoZGM7CisgICAgc2V0UGFpbnRpbmdEaXNhYmxlZCghbV9kYXRhLT5t
X2NnQ29udGV4dCk7CisgICAgaWYgKG1fZGF0YS0+bV9jZ0NvbnRleHQpIHsKKyAgICAgICAgLy8g
TWFrZSBzdXJlIHRoZSBjb250ZXh0IHN0YXJ0cyBpbiBzeW5jIHdpdGggb3VyIHN0YXRlLgorICAg
ICAgICBzZXRQbGF0Zm9ybUZpbGxDb2xvcihmaWxsQ29sb3IoKSk7CisgICAgICAgIHNldFBsYXRm
b3JtU3Ryb2tlQ29sb3Ioc3Ryb2tlQ29sb3IoKSk7CisgICAgfQorfQorCitIREMgR3JhcGhpY3ND
b250ZXh0OjpnZXRXaW5kb3dzQ29udGV4dChjb25zdCBJbnRSZWN0JiBkc3RSZWN0LCBib29sIHN1
cHBvcnRBbHBoYUJsZW5kKQoreworICAgIGlmIChpblRyYW5zcGFyZW5jeUxheWVyKCkpIHsKKyAg
ICAgICAgaWYgKGRzdFJlY3QuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAg
ICAgICAgLy8gQ3JlYXRlIGEgYml0bWFwIERDIGluIHdoaWNoIHRvIGRyYXcuCisgICAgICAgIEJJ
VE1BUElORk8gYml0bWFwSW5mbzsKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlTaXpl
ICAgICAgICAgID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOworICAgICAgICBiaXRtYXBJbmZv
LmJtaUhlYWRlci5iaVdpZHRoICAgICAgICAgPSBkc3RSZWN0LndpZHRoKCk7IAorICAgICAgICBi
aXRtYXBJbmZvLmJtaUhlYWRlci5iaUhlaWdodCAgICAgICAgPSBkc3RSZWN0LmhlaWdodCgpOwor
ICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVBsYW5lcyAgICAgICAgPSAxOworICAgICAg
ICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUJpdENvdW50ICAgICAgPSAzMjsKKyAgICAgICAgYml0
bWFwSW5mby5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiAgID0gQklfUkdCOworICAgICAgICBiaXRt
YXBJbmZvLmJtaUhlYWRlci5iaVNpemVJbWFnZSAgICAgPSAwOworICAgICAgICBiaXRtYXBJbmZv
LmJtaUhlYWRlci5iaVhQZWxzUGVyTWV0ZXIgPSAwOworICAgICAgICBiaXRtYXBJbmZvLmJtaUhl
YWRlci5iaVlQZWxzUGVyTWV0ZXIgPSAwOworICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5i
aUNsclVzZWQgICAgICAgPSAwOworICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUNscklt
cG9ydGFudCAgPSAwOworCisgICAgICAgIHZvaWQqIHBpeGVscyA9IDA7CisgICAgICAgIEhCSVRN
QVAgYml0bWFwID0gOjpDcmVhdGVESUJTZWN0aW9uKE5VTEwsICZiaXRtYXBJbmZvLCBESUJfUkdC
X0NPTE9SUywgJnBpeGVscywgMCwgMCk7CisgICAgICAgIGlmICghYml0bWFwKQorICAgICAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICAgICAgSERDIGJpdG1hcERDID0gOjpDcmVhdGVDb21wYXRpYmxl
REMobV9kYXRhLT5tX2hkYyk7CisgICAgICAgIDo6U2VsZWN0T2JqZWN0KGJpdG1hcERDLCBiaXRt
YXApOworCisgICAgICAgIC8vIEZpbGwgb3VyIGJ1ZmZlciB3aXRoIGNsZWFyIGlmIHdlJ3JlIGdv
aW5nIHRvIGFscGhhIGJsZW5kLgorICAgICAgICBpZiAoc3VwcG9ydEFscGhhQmxlbmQpIHsKKyAg
ICAgICAgICAgIEJJVE1BUCBibXBJbmZvOworICAgICAgICAgICAgR2V0T2JqZWN0KGJpdG1hcCwg
c2l6ZW9mKGJtcEluZm8pLCAmYm1wSW5mbyk7CisgICAgICAgICAgICBpbnQgYnVmZmVyU2l6ZSA9
IGJtcEluZm8uYm1XaWR0aEJ5dGVzICogYm1wSW5mby5ibUhlaWdodDsKKyAgICAgICAgICAgIG1l
bXNldChibXBJbmZvLmJtQml0cywgMCwgYnVmZmVyU2l6ZSk7CisgICAgICAgIH0KKworICAgICAg
ICAvLyBNYWtlIHN1cmUgd2UgY2FuIGRvIHdvcmxkIHRyYW5zZm9ybXMuCisgICAgICAgIFNldEdy
YXBoaWNzTW9kZShiaXRtYXBEQywgR01fQURWQU5DRUQpOworCisgICAgICAgIC8vIEFwcGx5IGEg
dHJhbnNsYXRpb24gdG8gb3VyIGNvbnRleHQgc28gdGhhdCB0aGUgZHJhd2luZyBkb25lIHdpbGwg
YmUgYXQgKDAsMCkgb2YgdGhlIGJpdG1hcC4KKyAgICAgICAgWEZPUk0geGZvcm07CisgICAgICAg
IHhmb3JtLmVNMTEgPSAxLjA7CisgICAgICAgIHhmb3JtLmVNMTIgPSAwOworICAgICAgICB4Zm9y
bS5lTTIxID0gMDsKKyAgICAgICAgeGZvcm0uZU0yMiA9IDEuMDsKKyAgICAgICAgeGZvcm0uZUR4
ID0gLWRzdFJlY3QueCgpOworICAgICAgICB4Zm9ybS5lRHkgPSAtZHN0UmVjdC55KCk7CisgICAg
ICAgIDo6U2V0V29ybGRUcmFuc2Zvcm0oYml0bWFwREMsICZ4Zm9ybSk7CisKKyAgICAgICAgcmV0
dXJuIGJpdG1hcERDOworICAgIH0KKworICAgIENHQ29udGV4dEZsdXNoKHBsYXRmb3JtQ29udGV4
dCgpKTsKKyAgICBtX2RhdGEtPnNhdmUoKTsKKyAgICByZXR1cm4gbV9kYXRhLT5tX2hkYzsKK30K
KworYm9vbCBHcmFwaGljc0NvbnRleHQ6OmluVHJhbnNwYXJlbmN5TGF5ZXIoKSBjb25zdCB7IHJl
dHVybiBtX2RhdGEtPm1fdHJhbnNwYXJlbmN5Q291bnQ7IH0KKwordm9pZCBHcmFwaGljc0NvbnRl
eHQ6OnJlbGVhc2VXaW5kb3dzQ29udGV4dChIREMgaGRjLCBjb25zdCBJbnRSZWN0JiBkc3RSZWN0
LCBib29sIHN1cHBvcnRBbHBoYUJsZW5kKQoreworICAgIGlmIChoZGMgJiYgaW5UcmFuc3BhcmVu
Y3lMYXllcigpKSB7CisgICAgICAgIGlmIChkc3RSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAg
IHJldHVybjsKKworICAgICAgICBIQklUTUFQIGJpdG1hcCA9IChIQklUTUFQKUdldEN1cnJlbnRP
YmplY3QoaGRjLCBPQkpfQklUTUFQKTsKKworICAgICAgICAvLyBOZWVkIHRvIG1ha2UgYSBDR0lt
YWdlIG91dCBvZiB0aGUgYml0bWFwJ3MgcGl4ZWwgYnVmZmVyIGFuZCB0aGVuIGRyYXcKKyAgICAg
ICAgLy8gaXQgaW50byBvdXIgY29udGV4dC4KKyAgICAgICAgQklUTUFQIGluZm87CisgICAgICAg
IEdldE9iamVjdChiaXRtYXAsIHNpemVvZihpbmZvKSwgJmluZm8pOworICAgICAgICBBU1NFUlQo
aW5mby5ibUJpdHNQaXhlbCA9PSAzMik7CisKKyAgICAgICAgQ0dDb2xvclNwYWNlUmVmIGRldmlj
ZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOworICAgICAgICBDR0NvbnRleHRS
ZWYgYml0bWFwQ29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZShpbmZvLmJtQml0cywgaW5m
by5ibVdpZHRoLCBpbmZvLmJtSGVpZ2h0LCA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmJtV2lkdGhCeXRlcywgZGV2aWNl
UkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3VwcG9ydEFscGhhQmxlbmQg
PyBrQ0dJbWFnZUFscGhhUHJlbXVsdGlwbGllZEZpcnN0IDoga0NHSW1hZ2VBbHBoYU5vbmVTa2lw
Rmlyc3QpKTsKKyAgICAgICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOworCisgICAg
ICAgIENHSW1hZ2VSZWYgaW1hZ2UgPSBDR0JpdG1hcENvbnRleHRDcmVhdGVJbWFnZShiaXRtYXBD
b250ZXh0KTsKKyAgICAgICAgQ0dDb250ZXh0RHJhd0ltYWdlKG1fZGF0YS0+bV9jZ0NvbnRleHQs
IGRzdFJlY3QsIGltYWdlKTsKKyAgICAgICAgCisgICAgICAgIC8vIERlbGV0ZSBhbGwgb3VyIGp1
bmsuCisgICAgICAgIENHSW1hZ2VSZWxlYXNlKGltYWdlKTsKKyAgICAgICAgQ0dDb250ZXh0UmVs
ZWFzZShiaXRtYXBDb250ZXh0KTsKKyAgICAgICAgOjpEZWxldGVEQyhoZGMpOworICAgICAgICA6
OkRlbGV0ZU9iamVjdChiaXRtYXApOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBt
X2RhdGEtPnJlc3RvcmUoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZh
dGU6OnNhdmUoKQoreworICAgIGlmICghbV9oZGMpCisgICAgICAgIHJldHVybjsKKyAgICBTYXZl
REMobV9oZGMpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6cmVz
dG9yZSgpCit7CisgICAgaWYgKCFtX2hkYykKKyAgICAgICAgcmV0dXJuOworICAgIFJlc3RvcmVE
QyhtX2hkYywgLTEpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6
Y2xpcChjb25zdCBJbnRSZWN0JiBjbGlwUmVjdCkKK3sKKyAgICBpZiAoIW1faGRjKQorICAgICAg
ICByZXR1cm47CisgICAgSW50ZXJzZWN0Q2xpcFJlY3QobV9oZGMsIGNsaXBSZWN0LngoKSwgY2xp
cFJlY3QueSgpLCBjbGlwUmVjdC5yaWdodCgpLCBjbGlwUmVjdC5ib3R0b20oKSk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpjbGlwKGNvbnN0IFBhdGgmKQorewor
ICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlOjpzY2FsZShjb25zdCBGbG9hdFNpemUmIHNpemUpCit7CisgICAgaWYgKCFtX2hkYykK
KyAgICAgICAgcmV0dXJuOworICAgIFhGT1JNIHhmb3JtOworICAgIHhmb3JtLmVNMTEgPSBzaXpl
LndpZHRoKCk7CisgICAgeGZvcm0uZU0xMiA9IDA7CisgICAgeGZvcm0uZU0yMSA9IDA7CisgICAg
eGZvcm0uZU0yMiA9IHNpemUuaGVpZ2h0KCk7CisgICAgeGZvcm0uZUR4ID0gMDsKKyAgICB4Zm9y
bS5lRHkgPSAwOworICAgIE1vZGlmeVdvcmxkVHJhbnNmb3JtKG1faGRjLCAmeGZvcm0sIE1XVF9M
RUZUTVVMVElQTFkpOworfQorCitzdGF0aWMgY29uc3QgZG91YmxlIGRlZzJyYWQgPSAwLjAxNzQ1
MzI5MjUxOTk0MzI5NTc2OTsgLy8gcGkvMTgwCisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZv
cm1Qcml2YXRlOjpyb3RhdGUoZmxvYXQgZGVncmVlc0FuZ2xlKQoreworICAgIGZsb2F0IHJhZGlh
bnNBbmdsZSA9IGRlZ3JlZXNBbmdsZSAqIGRlZzJyYWQ7CisgICAgZmxvYXQgY29zQW5nbGUgPSBj
b3NmKHJhZGlhbnNBbmdsZSk7CisgICAgZmxvYXQgc2luQW5nbGUgPSBzaW5mKHJhZGlhbnNBbmds
ZSk7CisgICAgWEZPUk0geGZvcm07CisgICAgeGZvcm0uZU0xMSA9IGNvc0FuZ2xlOworICAgIHhm
b3JtLmVNMTIgPSAtc2luQW5nbGU7CisgICAgeGZvcm0uZU0yMSA9IHNpbkFuZ2xlOworICAgIHhm
b3JtLmVNMjIgPSBjb3NBbmdsZTsKKyAgICB4Zm9ybS5lRHggPSAwOworICAgIHhmb3JtLmVEeSA9
IDA7CisgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxU
SVBMWSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjp0cmFuc2xh
dGUoZmxvYXQgeCAsIGZsb2F0IHkpCit7CisgICAgaWYgKCFtX2hkYykKKyAgICAgICAgcmV0dXJu
OworICAgIFhGT1JNIHhmb3JtOworICAgIHhmb3JtLmVNMTEgPSAxLjA7CisgICAgeGZvcm0uZU0x
MiA9IDA7CisgICAgeGZvcm0uZU0yMSA9IDA7CisgICAgeGZvcm0uZU0yMiA9IDEuMDsKKyAgICB4
Zm9ybS5lRHggPSB4OworICAgIHhmb3JtLmVEeSA9IHk7CisgICAgTW9kaWZ5V29ybGRUcmFuc2Zv
cm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7Cit9CisKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlOjpjb25jYXRDVE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0
cmFuc2Zvcm0pCit7CisgICAgaWYgKCFtX2hkYykKKyAgICAgICAgcmV0dXJuOworICAgIENHQWZm
aW5lVHJhbnNmb3JtIG1hdCA9IHRyYW5zZm9ybTsKKyAgICBYRk9STSB4Zm9ybTsKKyAgICB4Zm9y
bS5lTTExID0gbWF0LmE7CisgICAgeGZvcm0uZU0xMiA9IG1hdC5iOworICAgIHhmb3JtLmVNMjEg
PSBtYXQuYzsKKyAgICB4Zm9ybS5lTTIyID0gbWF0LmQ7CisgICAgeGZvcm0uZUR4ID0gbWF0LnR4
OworICAgIHhmb3JtLmVEeSA9IG1hdC50eTsKKyAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShtX2hk
YywgJnhmb3JtLCBNV1RfTEVGVE1VTFRJUExZKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6
OmRyYXdGb2N1c1JpbmcoY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIGlmIChwYWludGluZ0Rp
c2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGZsb2F0IHJhZGl1cyA9IChmb2N1c1Jp
bmdXaWR0aCgpIC0gMSkgLyAyLjBmOworICAgIGludCBvZmZzZXQgPSByYWRpdXMgKyBmb2N1c1Jp
bmdPZmZzZXQoKTsKKyAgICBDR0NvbG9yUmVmIGNvbG9yUmVmID0gY29sb3IuaXNWYWxpZCgpID8g
Y2dDb2xvcihjb2xvcikgOiAwOworCisgICAgQ0dNdXRhYmxlUGF0aFJlZiBmb2N1c1JpbmdQYXRo
ID0gQ0dQYXRoQ3JlYXRlTXV0YWJsZSgpOworICAgIGNvbnN0IFZlY3RvcjxJbnRSZWN0PiYgcmVj
dHMgPSBmb2N1c1JpbmdSZWN0cygpOworICAgIHVuc2lnbmVkIHJlY3RDb3VudCA9IHJlY3RzLnNp
emUoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcmVjdENvdW50OyBpKyspCisgICAg
ICAgIENHUGF0aEFkZFJlY3QoZm9jdXNSaW5nUGF0aCwgMCwgQ0dSZWN0SW5zZXQocmVjdHNbaV0s
IC1vZmZzZXQsIC1vZmZzZXQpKTsKKworICAgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gcGxhdGZv
cm1Db250ZXh0KCk7CisgICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShjb250ZXh0KTsKKworICAgIENH
Q29udGV4dEJlZ2luUGF0aChjb250ZXh0KTsKKyAgICBDR0NvbnRleHRBZGRQYXRoKGNvbnRleHQs
IGZvY3VzUmluZ1BhdGgpOworCisgICAgd2tEcmF3Rm9jdXNSaW5nKGNvbnRleHQsIGNvbG9yUmVm
LCByYWRpdXMpOworCisgICAgQ0dDb2xvclJlbGVhc2UoY29sb3JSZWYpOworCisgICAgQ0dQYXRo
UmVsZWFzZShmb2N1c1JpbmdQYXRoKTsKKworICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29u
dGV4dCk7Cit9CisKK3N0YXRpYyBjb25zdCBDb2xvciYgc3BlbGxpbmdQYXR0ZXJuQ29sb3IoKSB7
CisgICAgc3RhdGljIGNvbnN0IENvbG9yIHNwZWxsaW5nQ29sb3IoMjU1LCAwLCAwKTsKKyAgICBy
ZXR1cm4gc3BlbGxpbmdDb2xvcjsKK30KKworc3RhdGljIGNvbnN0IENvbG9yJiBncmFtbWFyUGF0
dGVybkNvbG9yKCkgeworICAgIHN0YXRpYyBjb25zdCBDb2xvciBncmFtbWFyQ29sb3IoMCwgMTI4
LCAwKTsKKyAgICByZXR1cm4gZ3JhbW1hckNvbG9yOworfQorCisvLyBQdWxsZWQgZnJvbSBHcmFw
aGljc0NvbnRleHRDRworc3RhdGljIHZvaWQgc2V0Q0dTdHJva2VDb2xvcihDR0NvbnRleHRSZWYg
Y29udGV4dCwgY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIENHRmxvYXQgcmVkLCBncmVlbiwg
Ymx1ZSwgYWxwaGE7CisgICAgY29sb3IuZ2V0UkdCQShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7
CisgICAgQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IoY29udGV4dCwgcmVkLCBncmVlbiwgYmx1
ZSwgYWxwaGEpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JNaXNzcGVs
bGluZ09yQmFkR3JhbW1hcihjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCB3aWR0aCwgYm9vbCBn
cmFtbWFyKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsK
KyAgICAKKyAgICAvLyBUaGVzZSBhcmUgdGhlIHNhbWUgZm9yIG1pc3NwZWxsaW5nIG9yIGJhZCBn
cmFtbWFyCisgICAgY29uc3QgaW50IHBhdHRlcm5IZWlnaHQgPSAzOyAvLyAzIHJvd3MKKyAgICBB
U1NFUlQoY01pc3NwZWxsaW5nTGluZVRoaWNrbmVzcyA9PSBwYXR0ZXJuSGVpZ2h0KTsKKyAgICBj
b25zdCBpbnQgcGF0dGVybldpZHRoID0gNDsgLy8gNCBwaXhlbHMKKyAgICBBU1NFUlQocGF0dGVy
bldpZHRoID09IGNNaXNzcGVsbGluZ0xpbmVQYXR0ZXJuV2lkdGgpOworCisgICAgLy8gTWFrZSBz
dXJlIHRvIGRyYXcgb25seSBjb21wbGV0ZSBkb3RzLgorICAgIC8vIE5PVEU6IENvZGUgaGVyZSB1
c2VkIHRvIHNoaWZ0IHRoZSB1bmRlcmxpbmUgdG8gdGhlIGxlZnQgYW5kIGluY3JlYXNlIHRoZSB3
aWR0aAorICAgIC8vIHRvIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGdldHMgdW5kZXJsaW5lZCwgYnV0
IHRoYXQgcmVzdWx0cyBpbiBkcmF3aW5nIG91dCBvZgorICAgIC8vIGJvdW5kcyAoZS5nLiB3aGVu
IGF0IHRoZSBlZGdlIG9mIGEgdmlldykgYW5kIGNvdWxkIG1ha2UgaXQgYXBwZWFyIHRoYXQgdGhl
CisgICAgLy8gc3BhY2UgYmV0d2VlbiBhZGphY2VudCBtaXNzcGVsbGVkIHdvcmRzIHdhcyB1bmRl
cmxpbmVkLgorICAgIC8vIGFsbG93IHNsaWdodGx5IG1vcmUgY29uc2lkZXJpbmcgdGhhdCB0aGUg
cGF0dGVybiBlbmRzIHdpdGggYSB0cmFuc3BhcmVudCBwaXhlbAorICAgIGludCB3aWR0aE1vZCA9
IHdpZHRoICUgcGF0dGVybldpZHRoOworICAgIGlmIChwYXR0ZXJuV2lkdGggLSB3aWR0aE1vZCA+
IGNNaXNzcGVsbGluZ0xpbmVQYXR0ZXJuR2FwV2lkdGgpCisgICAgICAgIHdpZHRoIC09IHdpZHRo
TW9kOworICAgICAgCisgICAgLy8gRHJhdyB0aGUgdW5kZXJsaW5lCisgICAgQ0dDb250ZXh0UmVm
IGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsKKyAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNv
bnRleHQpOworCisgICAgY29uc3QgQ29sb3ImIHBhdHRlcm5Db2xvciA9IGdyYW1tYXIgPyBncmFt
bWFyUGF0dGVybkNvbG9yKCkgOiBzcGVsbGluZ1BhdHRlcm5Db2xvcigpOworICAgIHNldENHU3Ry
b2tlQ29sb3IoY29udGV4dCwgcGF0dGVybkNvbG9yKTsKKworICAgIHdrU2V0UGF0dGVyblBoYXNl
SW5Vc2VyU3BhY2UoY29udGV4dCwgcG9pbnQpOworICAgIENHQ29udGV4dFNldEJsZW5kTW9kZShj
b250ZXh0LCBrQ0dCbGVuZE1vZGVOb3JtYWwpOworICAgIAorICAgIC8vIDMgcm93cywgZWFjaCBv
ZmZzZXQgYnkgaGFsZiBhIHBpeGVsIGZvciBibGVuZGluZyBwdXJwb3NlcworICAgIGNvbnN0IENH
UG9pbnQgdXBwZXJQb2ludHMgW10gPSB7e3BvaW50LngoKSwgcG9pbnQueSgpICsgcGF0dGVybkhl
aWdodCAtIDIuNSB9LCB7cG9pbnQueCgpICsgd2lkdGgsIHBvaW50LnkoKSArIHBhdHRlcm5IZWln
aHQgLSAyLjV9fTsKKyAgICBjb25zdCBDR1BvaW50IG1pZGRsZVBvaW50cyBbXSA9IHt7cG9pbnQu
eCgpLCBwb2ludC55KCkgKyBwYXR0ZXJuSGVpZ2h0IC0gMS41IH0sIHtwb2ludC54KCkgKyB3aWR0
aCwgcG9pbnQueSgpICsgcGF0dGVybkhlaWdodCAtIDEuNX19OworICAgIGNvbnN0IENHUG9pbnQg
bG93ZXJQb2ludHMgW10gPSB7e3BvaW50LngoKSwgcG9pbnQueSgpICsgcGF0dGVybkhlaWdodCAt
IDAuNSB9LCB7cG9pbnQueCgpICsgd2lkdGgsIHBvaW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAw
LjUgfX07CisgICAgCisgICAgLy8gRGFzaCBsZW5ndGhzIGZvciB0aGUgdG9wIGFuZCBib3R0b20g
b2YgdGhlIGVycm9yIHVuZGVybGluZSBhcmUgdGhlIHNhbWUuCisgICAgLy8gVGhlc2UgYXJlIG1h
Z2ljLgorICAgIHN0YXRpYyBjb25zdCBmbG9hdCBlZGdlX2Rhc2hfbGVuZ3Roc1tdID0gezIsIDJ9
OworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBtaWRkbGVfZGFzaF9sZW5ndGhzW10gPSB7Mi43NmYs
IDEuMjRmfTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgZWRnZV9vZmZzZXQgPSAtKGVkZ2VfZGFz
aF9sZW5ndGhzWzFdIC0gMS4wZikgLyAyLjBmOworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBtaWRk
bGVfb2Zmc2V0ID0gLShtaWRkbGVfZGFzaF9sZW5ndGhzWzFdIC0gMS4wZikgLyAyLjBmOworCisg
ICAgLy8gTGluZSBvcGFjaXRpZXMuICBPbmNlIGFnYWluLCB0aGVzZSBhcmUgbWFnaWMuCisgICAg
Y29uc3QgZmxvYXQgdXBwZXJPcGFjaXR5ID0gMC4zM2Y7CisgICAgY29uc3QgZmxvYXQgbWlkZGxl
T3BhY2l0eSA9IDAuNzVmOworICAgIGNvbnN0IGZsb2F0IGxvd2VyT3BhY2l0eSA9IDAuODhmOwor
CisgICAgLy9Ub3AgbGluZQorICAgIENHQ29udGV4dFNldExpbmVEYXNoKGNvbnRleHQsIGVkZ2Vf
b2Zmc2V0LCBlZGdlX2Rhc2hfbGVuZ3RocywgCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6
ZW9mKGVkZ2VfZGFzaF9sZW5ndGhzKSAvIHNpemVvZihlZGdlX2Rhc2hfbGVuZ3Roc1swXSkpOwor
ICAgIENHQ29udGV4dFNldEFscGhhKGNvbnRleHQsIHVwcGVyT3BhY2l0eSk7CisgICAgQ0dDb250
ZXh0U3Ryb2tlTGluZVNlZ21lbnRzKGNvbnRleHQsIHVwcGVyUG9pbnRzLCAyKTsKKyAKKyAgICAv
LyBNaWRkbGUgbGluZQorICAgIENHQ29udGV4dFNldExpbmVEYXNoKGNvbnRleHQsIG1pZGRsZV9v
ZmZzZXQsIG1pZGRsZV9kYXNoX2xlbmd0aHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHNp
emVvZihtaWRkbGVfZGFzaF9sZW5ndGhzKSAvIHNpemVvZihtaWRkbGVfZGFzaF9sZW5ndGhzWzBd
KSk7CisgICAgQ0dDb250ZXh0U2V0QWxwaGEoY29udGV4dCwgbWlkZGxlT3BhY2l0eSk7CisgICAg
Q0dDb250ZXh0U3Ryb2tlTGluZVNlZ21lbnRzKGNvbnRleHQsIG1pZGRsZVBvaW50cywgMik7Cisg
ICAgCisgICAgLy8gQm90dG9tIGxpbmUKKyAgICBDR0NvbnRleHRTZXRMaW5lRGFzaChjb250ZXh0
LCBlZGdlX29mZnNldCwgZWRnZV9kYXNoX2xlbmd0aHMsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgc2l6ZW9mKGVkZ2VfZGFzaF9sZW5ndGhzKSAvIHNpemVvZihlZGdlX2Rhc2hfbGVuZ3Roc1sw
XSkpOworICAgIENHQ29udGV4dFNldEFscGhhKGNvbnRleHQsIGxvd2VyT3BhY2l0eSk7CisgICAg
Q0dDb250ZXh0U3Ryb2tlTGluZVNlZ21lbnRzKGNvbnRleHQsIGxvd2VyUG9pbnRzLCAyKTsKKwor
ICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29udGV4dCk7Cit9CisKKyNpZiBFTkFCTEUoU1ZH
KQorR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0Rm9ySW1hZ2UoU1ZHUmVzb3VyY2VJbWFnZSopCit7
CisgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGdvIGluIEdyYXBoaWNzQ29udGV4dENHLmNwcAor
ICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworfQpJbmRl
eDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0Q0dXaW4uY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29u
dGV4dENHV2luLmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbi9HcmFwaGljc0NvbnRleHRDR1dpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSAr
MSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwMywg
MjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI5LDE4ICsyOSwxNSBAQAog
I2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgogI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgi
CiAjaW5jbHVkZSAiUGF0aC5oIgorCiAjaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NHQml0bWFwQ29u
dGV4dC5oPgogI2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVyZmFjZS9XZWJLaXRTeXN0ZW1JbnRl
cmZhY2UuaD4KLSNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgotCiAjaW5jbHVkZSAiR3JhcGhp
Y3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKIG5h
bWVzcGFjZSBXZWJDb3JlIHsKIAotY2xhc3MgU1ZHUmVzb3VyY2VJbWFnZTsKLQogc3RhdGljIENH
Q29udGV4dFJlZiBDR0NvbnRleHRXaXRoSERDKEhEQyBoZGMpCiB7CiAgICAgSEJJVE1BUCBiaXRt
YXAgPSAoSEJJVE1BUClHZXRDdXJyZW50T2JqZWN0KGhkYywgT0JKX0JJVE1BUCk7CkBAIC0xMzQs
OCArMTMxLDYgQEAgSERDIEdyYXBoaWNzQ29udGV4dDo6Z2V0V2luZG93c0NvbnRleHQoYwogICAg
IHJldHVybiBtX2RhdGEtPm1faGRjOwogfQogCi1ib29sIEdyYXBoaWNzQ29udGV4dDo6aW5UcmFu
c3BhcmVuY3lMYXllcigpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS0+bV90cmFuc3BhcmVuY3lDb3Vu
dDsgfQotCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6cmVsZWFzZVdpbmRvd3NDb250ZXh0KEhEQyBo
ZGMsIGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGJvb2wgc3VwcG9ydEFscGhhQmxlbmQpCiB7CiAg
ICAgaWYgKGhkYyAmJiBpblRyYW5zcGFyZW5jeUxheWVyKCkpIHsKQEAgLTE3MSw4MSArMTY2LDEx
IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpyZWxlYXNlV2luZG93c0NvbnQKICAgICBtX2RhdGEt
PnJlc3RvcmUoKTsKIH0KIAotdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnNh
dmUoKQotewotICAgIGlmICghbV9oZGMpCi0gICAgICAgIHJldHVybjsKLSAgICBTYXZlREMobV9o
ZGMpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6cmVzdG9yZSgp
Ci17Ci0gICAgaWYgKCFtX2hkYykKLSAgICAgICAgcmV0dXJuOwotICAgIFJlc3RvcmVEQyhtX2hk
YywgLTEpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y2xpcChj
b25zdCBJbnRSZWN0JiBjbGlwUmVjdCkKLXsKLSAgICBpZiAoIW1faGRjKQotICAgICAgICByZXR1
cm47Ci0gICAgSW50ZXJzZWN0Q2xpcFJlY3QobV9oZGMsIGNsaXBSZWN0LngoKSwgY2xpcFJlY3Qu
eSgpLCBjbGlwUmVjdC5yaWdodCgpLCBjbGlwUmVjdC5ib3R0b20oKSk7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpjbGlwKGNvbnN0IFBhdGgmKQotewotICAgIG5v
dEltcGxlbWVudGVkKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRl
OjpzY2FsZShjb25zdCBGbG9hdFNpemUmIHNpemUpCi17Ci0gICAgaWYgKCFtX2hkYykKLSAgICAg
ICAgcmV0dXJuOwotICAgIFhGT1JNIHhmb3JtOwotICAgIHhmb3JtLmVNMTEgPSBzaXplLndpZHRo
KCk7Ci0gICAgeGZvcm0uZU0xMiA9IDA7Ci0gICAgeGZvcm0uZU0yMSA9IDA7Ci0gICAgeGZvcm0u
ZU0yMiA9IHNpemUuaGVpZ2h0KCk7Ci0gICAgeGZvcm0uZUR4ID0gMDsKLSAgICB4Zm9ybS5lRHkg
PSAwOwotICAgIE1vZGlmeVdvcmxkVHJhbnNmb3JtKG1faGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVM
VElQTFkpOwotfQotCi1zdGF0aWMgY29uc3QgZG91YmxlIGRlZzJyYWQgPSAwLjAxNzQ1MzI5MjUx
OTk0MzI5NTc2OTsgLy8gcGkvMTgwCi0KLXZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2
YXRlOjpyb3RhdGUoZmxvYXQgZGVncmVlc0FuZ2xlKQotewotICAgIGZsb2F0IHJhZGlhbnNBbmds
ZSA9IGRlZ3JlZXNBbmdsZSAqIGRlZzJyYWQ7Ci0gICAgZmxvYXQgY29zQW5nbGUgPSBjb3NmKHJh
ZGlhbnNBbmdsZSk7Ci0gICAgZmxvYXQgc2luQW5nbGUgPSBzaW5mKHJhZGlhbnNBbmdsZSk7Ci0g
ICAgWEZPUk0geGZvcm07Ci0gICAgeGZvcm0uZU0xMSA9IGNvc0FuZ2xlOwotICAgIHhmb3JtLmVN
MTIgPSAtc2luQW5nbGU7Ci0gICAgeGZvcm0uZU0yMSA9IHNpbkFuZ2xlOwotICAgIHhmb3JtLmVN
MjIgPSBjb3NBbmdsZTsKLSAgICB4Zm9ybS5lRHggPSAwOwotICAgIHhmb3JtLmVEeSA9IDA7Ci0g
ICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjp0cmFuc2xhdGUoZmxv
YXQgeCAsIGZsb2F0IHkpCi17Ci0gICAgaWYgKCFtX2hkYykKLSAgICAgICAgcmV0dXJuOwotICAg
IFhGT1JNIHhmb3JtOwotICAgIHhmb3JtLmVNMTEgPSAxLjA7Ci0gICAgeGZvcm0uZU0xMiA9IDA7
Ci0gICAgeGZvcm0uZU0yMSA9IDA7Ci0gICAgeGZvcm0uZU0yMiA9IDEuMDsKLSAgICB4Zm9ybS5l
RHggPSB4OwotICAgIHhmb3JtLmVEeSA9IHk7Ci0gICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9o
ZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7Ci19Ci0KIHZvaWQgR3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlOjpjb25jYXRDVE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFuc2Zv
cm0pCiB7CiAgICAgaWYgKCFtX2hkYykKICAgICAgICAgcmV0dXJuOworCiAgICAgQ0dBZmZpbmVU
cmFuc2Zvcm0gbWF0ID0gdHJhbnNmb3JtOwogICAgIFhGT1JNIHhmb3JtOwogICAgIHhmb3JtLmVN
MTEgPSBtYXQuYTsKQEAgLTI1NCw2ICsxNzksNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRm
b3JtUHJpdmF0ZTo6Y29uCiAgICAgeGZvcm0uZU0yMiA9IG1hdC5kOwogICAgIHhmb3JtLmVEeCA9
IG1hdC50eDsKICAgICB4Zm9ybS5lRHkgPSBtYXQudHk7CisKICAgICBNb2RpZnlXb3JsZFRyYW5z
Zm9ybShtX2hkYywgJnhmb3JtLCBNV1RfTEVGVE1VTFRJUExZKTsKIH0KIApAQCAtMjg3LDYgKzIx
MywxNCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0ZvY3VzUmluZyhjb25zCiAgICAgQ0dD
b250ZXh0UmVzdG9yZUdTdGF0ZShjb250ZXh0KTsKIH0KIAorLy8gUHVsbGVkIGZyb20gR3JhcGhp
Y3NDb250ZXh0Q0cKK3N0YXRpYyB2b2lkIHNldENHU3Ryb2tlQ29sb3IoQ0dDb250ZXh0UmVmIGNv
bnRleHQsIGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBDR0Zsb2F0IHJlZCwgZ3JlZW4sIGJs
dWUsIGFscGhhOworICAgIGNvbG9yLmdldFJHQkEocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwor
ICAgIENHQ29udGV4dFNldFJHQlN0cm9rZUNvbG9yKGNvbnRleHQsIHJlZCwgZ3JlZW4sIGJsdWUs
IGFscGhhKTsKK30KKwogc3RhdGljIGNvbnN0IENvbG9yJiBzcGVsbGluZ1BhdHRlcm5Db2xvcigp
IHsKICAgICBzdGF0aWMgY29uc3QgQ29sb3Igc3BlbGxpbmdDb2xvcigyNTUsIDAsIDApOwogICAg
IHJldHVybiBzcGVsbGluZ0NvbG9yOwpAQCAtMjk3LDE5ICsyMzEsMTEgQEAgc3RhdGljIGNvbnN0
IENvbG9yJiBncmFtbWFyUGF0dGVybkNvbG9yKAogICAgIHJldHVybiBncmFtbWFyQ29sb3I7CiB9
CiAKLS8vIFB1bGxlZCBmcm9tIEdyYXBoaWNzQ29udGV4dENHCi1zdGF0aWMgdm9pZCBzZXRDR1N0
cm9rZUNvbG9yKENHQ29udGV4dFJlZiBjb250ZXh0LCBjb25zdCBDb2xvciYgY29sb3IpCi17Ci0g
ICAgQ0dGbG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKLSAgICBjb2xvci5nZXRSR0JBKHJl
ZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLSAgICBDR0NvbnRleHRTZXRSR0JTdHJva2VDb2xvcihj
b250ZXh0LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci19Ci0KIHZvaWQgR3JhcGhpY3NDb250
ZXh0OjpkcmF3TGluZUZvck1pc3NwZWxsaW5nT3JCYWRHcmFtbWFyKGNvbnN0IEludFBvaW50JiBw
b2ludCwgaW50IHdpZHRoLCBib29sIGdyYW1tYXIpCiB7CiAgICAgaWYgKHBhaW50aW5nRGlzYWJs
ZWQoKSkKICAgICAgICAgcmV0dXJuOwotICAgIAorCiAgICAgLy8gVGhlc2UgYXJlIHRoZSBzYW1l
IGZvciBtaXNzcGVsbGluZyBvciBiYWQgZ3JhbW1hcgogICAgIGNvbnN0IGludCBwYXR0ZXJuSGVp
Z2h0ID0gMzsgLy8gMyByb3dzCiAgICAgQVNTRVJUKGNNaXNzcGVsbGluZ0xpbmVUaGlja25lc3Mg
PT0gcGF0dGVybkhlaWdodCk7CkBAIC0zNzQsMTMgKzMwMCw0IEBAIHZvaWQgR3JhcGhpY3NDb250
ZXh0OjpkcmF3TGluZUZvck1pc3NwZWwKICAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRl
eHQpOwogfQogCi0jaWYgRU5BQkxFKFNWRykKLUdyYXBoaWNzQ29udGV4dCogY29udGV4dEZvcklt
YWdlKFNWR1Jlc291cmNlSW1hZ2UqKQotewotICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBnbyBp
biBHcmFwaGljc0NvbnRleHRDRy5jcHAKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotICAgIHJldHVy
biAwOwotfQotI2VuZGlmCi0KIH0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0dyYXBoaWNzQ29udGV4dENhaXJvV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDAp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRDYWlyb1dp
bi5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
Q09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29u
dGV4dC5oIgorCisjaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCisjaW5jbHVkZSAiTm90SW1w
bGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQYXRoLmgiCisKKyNpbmNsdWRlIDxjYWlyby13aW4zMi5o
PgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0dyYXBo
aWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0KEhEQyBoZGMpCit7CisgICAgbV9kYXRhLT5tX2hk
YyA9IGhkYzsKKyAgICBzZXRQYWludGluZ0Rpc2FibGVkKCFtX2RhdGEtPm1fY2dDb250ZXh0KTsK
KyAgICBpZiAobV9kYXRhLT5tX2NnQ29udGV4dCkgeworICAgICAgICAvLyBNYWtlIHN1cmUgdGhl
IGNvbnRleHQgc3RhcnRzIGluIHN5bmMgd2l0aCBvdXIgc3RhdGUuCisgICAgICAgIHNldFBsYXRm
b3JtRmlsbENvbG9yKGZpbGxDb2xvcigpKTsKKyAgICAgICAgc2V0UGxhdGZvcm1TdHJva2VDb2xv
cihzdHJva2VDb2xvcigpKTsKKyAgICB9Cit9CisKK0hEQyBHcmFwaGljc0NvbnRleHQ6OmdldFdp
bmRvd3NDb250ZXh0KGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGJvb2wgc3VwcG9ydEFscGhhQmxl
bmQpCit7CisgICAgLy8gVGhpcyBpcyBwcm9iYWJseSB3cm9uZywgYW5kIGRlZmluaXRlbHkgb3V0
IG9mIGRhdGUuICBQdWxsZWQgZnJvbSBvbGQgU1ZOCisgICAgY2Fpcm9fc3VyZmFjZV90KiBzdXJm
YWNlID0gY2Fpcm9fZ2V0X3RhcmdldChwbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgSERDIGhkYyA9
IGNhaXJvX3dpbjMyX3N1cmZhY2VfZ2V0X2RjKHN1cmZhY2UpOyAgIAorICAgIFNhdmVEQyhoZGMp
OworCisgICAgLy8gRklYTUU6IFdlIG5lZWQgdG8gbWFrZSBzdXJlIGEgY2xpcCBpcyByZWFsbHkg
c2V0IG9uIHRoZSBIREMuCisgICAgLy8gQ2FsbCBTZXRXb3JsZFRyYW5zZm9ybSB0byBob25vciB0
aGUgY3VycmVudCBDYWlybyB0cmFuc2Zvcm0uCisgICAgU2V0R3JhcGhpY3NNb2RlKGhkYywgR01f
QURWQU5DRUQpOyAvLyBXZSBuZWVkIHRoaXMgY2FsbCBmb3IgdGhlbWVzIHRvIGhvbm9yIHdvcmxk
IHRyYW5zZm9ybXMuCisgICAgY2Fpcm9fbWF0cml4X3QgbWF0OworICAgIGNhaXJvX2dldF9tYXRy
aXgocGxhdGZvcm1Db250ZXh0KCksICZtYXQpOworICAgIFhGT1JNIHhmb3JtOworICAgIHhmb3Jt
LmVNMTEgPSBtYXQueHg7CisgICAgeGZvcm0uZU0xMiA9IG1hdC54eTsKKyAgICB4Zm9ybS5lTTIx
ID0gbWF0Lnl4OworICAgIHhmb3JtLmVNMjIgPSBtYXQueXk7CisgICAgeGZvcm0uZUR4ID0gbWF0
LngwOworICAgIHhmb3JtLmVEeSA9IG1hdC55MDsKKyAgICBTZXRXb3JsZFRyYW5zZm9ybShoZGMs
ICZ4Zm9ybSk7CisKKyAgICByZXR1cm4gaGRjOworfQorCitib29sIEdyYXBoaWNzQ29udGV4dDo6
aW5UcmFuc3BhcmVuY3lMYXllcigpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS0+bV90cmFuc3BhcmVu
Y3lDb3VudDsgfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6cmVsZWFzZVdpbmRvd3NDb250ZXh0
KEhEQyBoZGMsIGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGJvb2wgc3VwcG9ydEFscGhhQmxlbmQp
Cit7CisgICAgY2Fpcm9fc3VyZmFjZV90KiBzdXJmYWNlID0gY2Fpcm9fZ2V0X3RhcmdldChwbGF0
Zm9ybUNvbnRleHQoKSk7CisgICAgSERDIGhkYzIgPSBjYWlyb193aW4zMl9zdXJmYWNlX2dldF9k
YyhzdXJmYWNlKTsKKyAgICBSZXN0b3JlREMoaGRjMiwgLTEpOworICAgIGNhaXJvX3N1cmZhY2Vf
bWFya19kaXJ0eShzdXJmYWNlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVBy
aXZhdGU6OmNvbmNhdENUTShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSkKK3sKKyAg
ICBpZiAoIW1faGRjKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb19tYXRyaXhfdCBtYXQ7
CisgICAgY2Fpcm9fZ2V0X21hdHJpeChwbGF0Zm9ybUNvbnRleHQoKSwgJm1hdCk7CisgICAgWEZP
Uk0geGZvcm07CisgICAgeGZvcm0uZU0xMSA9IG1hdC54eDsKKyAgICB4Zm9ybS5lTTEyID0gbWF0
Lnh5OworICAgIHhmb3JtLmVNMjEgPSBtYXQueXg7CisgICAgeGZvcm0uZU0yMiA9IG1hdC55eTsK
KyAgICB4Zm9ybS5lRHggPSBtYXQueDA7CisgICAgeGZvcm0uZUR5ID0gbWF0LnkwOworCisgICAg
TW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3Rm9jdXNSaW5nKGNvbnN0IENvbG9yJiBjb2xv
cikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVG
b3JNaXNzcGVsbGluZ09yQmFkR3JhbW1hcihjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCB3aWR0
aCwgYm9vbCBncmFtbWFyKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAg
IHJldHVybjsKKworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dFdpbi5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0V2luLmNwcAko
cmV2aXNpb24gMjk4MzQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGlj
c0NvbnRleHRXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENv
cHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYs
IDIwMDcsIDIwMDggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCkBAIC0yOSw4ICsyOSw2IEBACiAjaW5jbHVkZSAiQWZmaW5lVHJh
bnNmb3JtLmgiCiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRlICJQYXRoLmgi
Ci0jaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NHQml0bWFwQ29udGV4dC5oPgotI2luY2x1ZGUgPFdl
YktpdFN5c3RlbUludGVyZmFjZS9XZWJLaXRTeXN0ZW1JbnRlcmZhY2UuaD4KICNpbmNsdWRlIDx3
dGYvTWF0aEV4dHJhcy5oPgogCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2
YXRlLmgiCkBAIC00MSwxMzYgKzM5LDggQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiBjbGFzcyBT
VkdSZXNvdXJjZUltYWdlOwogCi1zdGF0aWMgQ0dDb250ZXh0UmVmIENHQ29udGV4dFdpdGhIREMo
SERDIGhkYykKLXsKLSAgICBIQklUTUFQIGJpdG1hcCA9IChIQklUTUFQKUdldEN1cnJlbnRPYmpl
Y3QoaGRjLCBPQkpfQklUTUFQKTsKLSAgICBDR0NvbG9yU3BhY2VSZWYgZGV2aWNlUkdCID0gQ0dD
b2xvclNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7Ci0gICAgQklUTUFQIGluZm87Ci0KLSAgICBHZXRP
YmplY3QoYml0bWFwLCBzaXplb2YoaW5mbyksICZpbmZvKTsKLSAgICBBU1NFUlQoaW5mby5ibUJp
dHNQaXhlbCA9PSAzMik7Ci0gICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBDR0JpdG1hcENvbnRl
eHRDcmVhdGUoaW5mby5ibUJpdHMsIGluZm8uYm1XaWR0aCwgaW5mby5ibUhlaWdodCwgOCwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmJtV2lk
dGhCeXRlcywgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IGtDR0ltYWdl
QWxwaGFOb25lU2tpcEZpcnN0KTsKLSAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKGRldmljZVJHQik7
Ci0KLSAgICAvLyBGbGlwIGNvb3JkcwotICAgIENHQ29udGV4dFRyYW5zbGF0ZUNUTShjb250ZXh0
LCAwLCBpbmZvLmJtSGVpZ2h0KTsKLSAgICBDR0NvbnRleHRTY2FsZUNUTShjb250ZXh0LCAxLCAt
MSk7Ci0gICAgCi0gICAgLy8gUHV0IHRoZSBIREMgSW4gYWR2YW5jZWQgbW9kZSBzbyBpdCB3aWxs
IGhvbm9yIGFmZmluZSB0cmFuc2Zvcm1zLgotICAgIFNldEdyYXBoaWNzTW9kZShoZGMsIEdNX0FE
VkFOQ0VEKTsKLSAgICAKLSAgICByZXR1cm4gY29udGV4dDsKLX0KLQotR3JhcGhpY3NDb250ZXh0
OjpHcmFwaGljc0NvbnRleHQoSERDIGhkYykKLSAgICA6IG1fY29tbW9uKGNyZWF0ZUdyYXBoaWNz
Q29udGV4dFByaXZhdGUoKSkKLSAgICAsIG1fZGF0YShuZXcgR3JhcGhpY3NDb250ZXh0UGxhdGZv
cm1Qcml2YXRlKENHQ29udGV4dFdpdGhIREMoaGRjKSkpCi17Ci0gICAgQ0dDb250ZXh0UmVsZWFz
ZShtX2RhdGEtPm1fY2dDb250ZXh0KTsKLSAgICBtX2RhdGEtPm1faGRjID0gaGRjOwotICAgIHNl
dFBhaW50aW5nRGlzYWJsZWQoIW1fZGF0YS0+bV9jZ0NvbnRleHQpOwotICAgIGlmIChtX2RhdGEt
Pm1fY2dDb250ZXh0KSB7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGV4dCBzdGFydHMg
aW4gc3luYyB3aXRoIG91ciBzdGF0ZS4KLSAgICAgICAgc2V0UGxhdGZvcm1GaWxsQ29sb3IoZmls
bENvbG9yKCkpOwotICAgICAgICBzZXRQbGF0Zm9ybVN0cm9rZUNvbG9yKHN0cm9rZUNvbG9yKCkp
OwotICAgIH0KLX0KLQotSERDIEdyYXBoaWNzQ29udGV4dDo6Z2V0V2luZG93c0NvbnRleHQoY29u
c3QgSW50UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVuZCkKLXsKLSAgICBpZiAo
aW5UcmFuc3BhcmVuY3lMYXllcigpKSB7Ci0gICAgICAgIGlmIChkc3RSZWN0LmlzRW1wdHkoKSkK
LSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIGJpdG1hcCBEQyBp
biB3aGljaCB0byBkcmF3LgotICAgICAgICBCSVRNQVBJTkZPIGJpdG1hcEluZm87Ci0gICAgICAg
IGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpU2l6ZSAgICAgICAgICA9IHNpemVvZihCSVRNQVBJTkZP
SEVBREVSKTsKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlXaWR0aCAgICAgICAgID0g
ZHN0UmVjdC53aWR0aCgpOyAKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlIZWlnaHQg
ICAgICAgID0gZHN0UmVjdC5oZWlnaHQoKTsKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIu
YmlQbGFuZXMgICAgICAgID0gMTsKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlCaXRD
b3VudCAgICAgID0gMzI7Ci0gICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpQ29tcHJlc3Np
b24gICA9IEJJX1JHQjsKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlTaXplSW1hZ2Ug
ICAgID0gMDsKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlYUGVsc1Blck1ldGVyID0g
MDsKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlZUGVsc1Blck1ldGVyID0gMDsKLSAg
ICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlDbHJVc2VkICAgICAgID0gMDsKLSAgICAgICAg
Yml0bWFwSW5mby5ibWlIZWFkZXIuYmlDbHJJbXBvcnRhbnQgID0gMDsKLQotICAgICAgICB2b2lk
KiBwaXhlbHMgPSAwOwotICAgICAgICBIQklUTUFQIGJpdG1hcCA9IDo6Q3JlYXRlRElCU2VjdGlv
bihOVUxMLCAmYml0bWFwSW5mbywgRElCX1JHQl9DT0xPUlMsICZwaXhlbHMsIDAsIDApOwotICAg
ICAgICBpZiAoIWJpdG1hcCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIEhEQyBi
aXRtYXBEQyA9IDo6Q3JlYXRlQ29tcGF0aWJsZURDKG1fZGF0YS0+bV9oZGMpOwotICAgICAgICA6
OlNlbGVjdE9iamVjdChiaXRtYXBEQywgYml0bWFwKTsKLQotICAgICAgICAvLyBGaWxsIG91ciBi
dWZmZXIgd2l0aCBjbGVhciBpZiB3ZSdyZSBnb2luZyB0byBhbHBoYSBibGVuZC4KLSAgICAgICAg
aWYgKHN1cHBvcnRBbHBoYUJsZW5kKSB7Ci0gICAgICAgICAgICBCSVRNQVAgYm1wSW5mbzsKLSAg
ICAgICAgICAgIEdldE9iamVjdChiaXRtYXAsIHNpemVvZihibXBJbmZvKSwgJmJtcEluZm8pOwot
ICAgICAgICAgICAgaW50IGJ1ZmZlclNpemUgPSBibXBJbmZvLmJtV2lkdGhCeXRlcyAqIGJtcElu
Zm8uYm1IZWlnaHQ7Ci0gICAgICAgICAgICBtZW1zZXQoYm1wSW5mby5ibUJpdHMsIDAsIGJ1ZmZl
clNpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGNhbiBkbyB3b3Js
ZCB0cmFuc2Zvcm1zLgotICAgICAgICBTZXRHcmFwaGljc01vZGUoYml0bWFwREMsIEdNX0FEVkFO
Q0VEKTsKLQotICAgICAgICAvLyBBcHBseSBhIHRyYW5zbGF0aW9uIHRvIG91ciBjb250ZXh0IHNv
IHRoYXQgdGhlIGRyYXdpbmcgZG9uZSB3aWxsIGJlIGF0ICgwLDApIG9mIHRoZSBiaXRtYXAuCi0g
ICAgICAgIFhGT1JNIHhmb3JtOwotICAgICAgICB4Zm9ybS5lTTExID0gMS4wOwotICAgICAgICB4
Zm9ybS5lTTEyID0gMDsKLSAgICAgICAgeGZvcm0uZU0yMSA9IDA7Ci0gICAgICAgIHhmb3JtLmVN
MjIgPSAxLjA7Ci0gICAgICAgIHhmb3JtLmVEeCA9IC1kc3RSZWN0LngoKTsKLSAgICAgICAgeGZv
cm0uZUR5ID0gLWRzdFJlY3QueSgpOwotICAgICAgICA6OlNldFdvcmxkVHJhbnNmb3JtKGJpdG1h
cERDLCAmeGZvcm0pOwotCi0gICAgICAgIHJldHVybiBiaXRtYXBEQzsKLSAgICB9Ci0KLSAgICBD
R0NvbnRleHRGbHVzaChwbGF0Zm9ybUNvbnRleHQoKSk7Ci0gICAgbV9kYXRhLT5zYXZlKCk7Ci0g
ICAgcmV0dXJuIG1fZGF0YS0+bV9oZGM7Ci19Ci0KIGJvb2wgR3JhcGhpY3NDb250ZXh0OjppblRy
YW5zcGFyZW5jeUxheWVyKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLT5tX3RyYW5zcGFyZW5jeUNv
dW50OyB9CiAKLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpyZWxlYXNlV2luZG93c0NvbnRleHQoSERD
IGhkYywgY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVuZCkKLXsK
LSAgICBpZiAoaGRjICYmIGluVHJhbnNwYXJlbmN5TGF5ZXIoKSkgewotICAgICAgICBpZiAoZHN0
UmVjdC5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgSEJJVE1BUCBi
aXRtYXAgPSAoSEJJVE1BUClHZXRDdXJyZW50T2JqZWN0KGhkYywgT0JKX0JJVE1BUCk7Ci0KLSAg
ICAgICAgLy8gTmVlZCB0byBtYWtlIGEgQ0dJbWFnZSBvdXQgb2YgdGhlIGJpdG1hcCdzIHBpeGVs
IGJ1ZmZlciBhbmQgdGhlbiBkcmF3Ci0gICAgICAgIC8vIGl0IGludG8gb3VyIGNvbnRleHQuCi0g
ICAgICAgIEJJVE1BUCBpbmZvOwotICAgICAgICBHZXRPYmplY3QoYml0bWFwLCBzaXplb2YoaW5m
byksICZpbmZvKTsKLSAgICAgICAgQVNTRVJUKGluZm8uYm1CaXRzUGl4ZWwgPT0gMzIpOwotCi0g
ICAgICAgIENHQ29sb3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZp
Y2VSR0IoKTsKLSAgICAgICAgQ0dDb250ZXh0UmVmIGJpdG1hcENvbnRleHQgPSBDR0JpdG1hcENv
bnRleHRDcmVhdGUoaW5mby5ibUJpdHMsIGluZm8uYm1XaWR0aCwgaW5mby5ibUhlaWdodCwgOCwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgaW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0
bGUgfCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKHN1cHBvcnRBbHBoYUJsZW5kID8ga0NHSW1hZ2VBbHBoYVByZW11bHRpcGxpZWRG
aXJzdCA6IGtDR0ltYWdlQWxwaGFOb25lU2tpcEZpcnN0KSk7Ci0gICAgICAgIENHQ29sb3JTcGFj
ZVJlbGVhc2UoZGV2aWNlUkdCKTsKLQotICAgICAgICBDR0ltYWdlUmVmIGltYWdlID0gQ0dCaXRt
YXBDb250ZXh0Q3JlYXRlSW1hZ2UoYml0bWFwQ29udGV4dCk7Ci0gICAgICAgIENHQ29udGV4dERy
YXdJbWFnZShtX2RhdGEtPm1fY2dDb250ZXh0LCBkc3RSZWN0LCBpbWFnZSk7Ci0gICAgICAgIAot
ICAgICAgICAvLyBEZWxldGUgYWxsIG91ciBqdW5rLgotICAgICAgICBDR0ltYWdlUmVsZWFzZShp
bWFnZSk7Ci0gICAgICAgIENHQ29udGV4dFJlbGVhc2UoYml0bWFwQ29udGV4dCk7Ci0gICAgICAg
IDo6RGVsZXRlREMoaGRjKTsKLSAgICAgICAgOjpEZWxldGVPYmplY3QoYml0bWFwKTsKLQotICAg
ICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbV9kYXRhLT5yZXN0b3JlKCk7Ci19Ci0KIHZvaWQg
R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpzYXZlKCkKIHsKICAgICBpZiAoIW1faGRj
KQpAQCAtMjQyLDEzOCArMTEyLDYgQEAgdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZh
dGU6OnRyYQogICAgIE1vZGlmeVdvcmxkVHJhbnNmb3JtKG1faGRjLCAmeGZvcm0sIE1XVF9MRUZU
TVVMVElQTFkpOwogfQogCi12b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y29u
Y2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdHJhbnNmb3JtKQotewotICAgIGlmICghbV9o
ZGMpCi0gICAgICAgIHJldHVybjsKLSAgICBDR0FmZmluZVRyYW5zZm9ybSBtYXQgPSB0cmFuc2Zv
cm07Ci0gICAgWEZPUk0geGZvcm07Ci0gICAgeGZvcm0uZU0xMSA9IG1hdC5hOwotICAgIHhmb3Jt
LmVNMTIgPSBtYXQuYjsKLSAgICB4Zm9ybS5lTTIxID0gbWF0LmM7Ci0gICAgeGZvcm0uZU0yMiA9
IG1hdC5kOwotICAgIHhmb3JtLmVEeCA9IG1hdC50eDsKLSAgICB4Zm9ybS5lRHkgPSBtYXQudHk7
Ci0gICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBM
WSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3Rm9jdXNSaW5nKGNvbnN0IENvbG9y
JiBjb2xvcikKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBmbG9hdCByYWRpdXMgPSAoZm9jdXNSaW5nV2lkdGgoKSAtIDEpIC8gMi4wZjsKLSAg
ICBpbnQgb2Zmc2V0ID0gcmFkaXVzICsgZm9jdXNSaW5nT2Zmc2V0KCk7Ci0gICAgQ0dDb2xvclJl
ZiBjb2xvclJlZiA9IGNvbG9yLmlzVmFsaWQoKSA/IGNnQ29sb3IoY29sb3IpIDogMDsKLQotICAg
IENHTXV0YWJsZVBhdGhSZWYgZm9jdXNSaW5nUGF0aCA9IENHUGF0aENyZWF0ZU11dGFibGUoKTsK
LSAgICBjb25zdCBWZWN0b3I8SW50UmVjdD4mIHJlY3RzID0gZm9jdXNSaW5nUmVjdHMoKTsKLSAg
ICB1bnNpZ25lZCByZWN0Q291bnQgPSByZWN0cy5zaXplKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IHJlY3RDb3VudDsgaSsrKQotICAgICAgICBDR1BhdGhBZGRSZWN0KGZvY3VzUmlu
Z1BhdGgsIDAsIENHUmVjdEluc2V0KHJlY3RzW2ldLCAtb2Zmc2V0LCAtb2Zmc2V0KSk7Ci0KLSAg
ICBDR0NvbnRleHRSZWYgY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOwotICAgIENHQ29udGV4
dFNhdmVHU3RhdGUoY29udGV4dCk7Ci0KLSAgICBDR0NvbnRleHRCZWdpblBhdGgoY29udGV4dCk7
Ci0gICAgQ0dDb250ZXh0QWRkUGF0aChjb250ZXh0LCBmb2N1c1JpbmdQYXRoKTsKLQotICAgIHdr
RHJhd0ZvY3VzUmluZyhjb250ZXh0LCBjb2xvclJlZiwgcmFkaXVzKTsKLQotICAgIENHQ29sb3JS
ZWxlYXNlKGNvbG9yUmVmKTsKLQotICAgIENHUGF0aFJlbGVhc2UoZm9jdXNSaW5nUGF0aCk7Ci0K
LSAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOwotfQotCi1zdGF0aWMgY29uc3Qg
Q29sb3ImIHNwZWxsaW5nUGF0dGVybkNvbG9yKCkgewotICAgIHN0YXRpYyBjb25zdCBDb2xvciBz
cGVsbGluZ0NvbG9yKDI1NSwgMCwgMCk7Ci0gICAgcmV0dXJuIHNwZWxsaW5nQ29sb3I7Ci19Ci0K
LXN0YXRpYyBjb25zdCBDb2xvciYgZ3JhbW1hclBhdHRlcm5Db2xvcigpIHsKLSAgICBzdGF0aWMg
Y29uc3QgQ29sb3IgZ3JhbW1hckNvbG9yKDAsIDEyOCwgMCk7Ci0gICAgcmV0dXJuIGdyYW1tYXJD
b2xvcjsKLX0KLQotLy8gUHVsbGVkIGZyb20gR3JhcGhpY3NDb250ZXh0Q0cKLXN0YXRpYyB2b2lk
IHNldENHU3Ryb2tlQ29sb3IoQ0dDb250ZXh0UmVmIGNvbnRleHQsIGNvbnN0IENvbG9yJiBjb2xv
cikKLXsKLSAgICBDR0Zsb2F0IHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhOwotICAgIGNvbG9yLmdl
dFJHQkEocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotICAgIENHQ29udGV4dFNldFJHQlN0cm9r
ZUNvbG9yKGNvbnRleHQsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yTWlzc3BlbGxpbmdPckJhZEdyYW1tYXIoY29uc3QgSW50
UG9pbnQmIHBvaW50LCBpbnQgd2lkdGgsIGJvb2wgZ3JhbW1hcikKLXsKLSAgICBpZiAocGFpbnRp
bmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgLy8gVGhlc2UgYXJlIHRo
ZSBzYW1lIGZvciBtaXNzcGVsbGluZyBvciBiYWQgZ3JhbW1hcgotICAgIGNvbnN0IGludCBwYXR0
ZXJuSGVpZ2h0ID0gMzsgLy8gMyByb3dzCi0gICAgQVNTRVJUKGNNaXNzcGVsbGluZ0xpbmVUaGlj
a25lc3MgPT0gcGF0dGVybkhlaWdodCk7Ci0gICAgY29uc3QgaW50IHBhdHRlcm5XaWR0aCA9IDQ7
IC8vIDQgcGl4ZWxzCi0gICAgQVNTRVJUKHBhdHRlcm5XaWR0aCA9PSBjTWlzc3BlbGxpbmdMaW5l
UGF0dGVybldpZHRoKTsKLQotICAgIC8vIE1ha2Ugc3VyZSB0byBkcmF3IG9ubHkgY29tcGxldGUg
ZG90cy4KLSAgICAvLyBOT1RFOiBDb2RlIGhlcmUgdXNlZCB0byBzaGlmdCB0aGUgdW5kZXJsaW5l
IHRvIHRoZSBsZWZ0IGFuZCBpbmNyZWFzZSB0aGUgd2lkdGgKLSAgICAvLyB0byBtYWtlIHN1cmUg
ZXZlcnl0aGluZyBnZXRzIHVuZGVybGluZWQsIGJ1dCB0aGF0IHJlc3VsdHMgaW4gZHJhd2luZyBv
dXQgb2YKLSAgICAvLyBib3VuZHMgKGUuZy4gd2hlbiBhdCB0aGUgZWRnZSBvZiBhIHZpZXcpIGFu
ZCBjb3VsZCBtYWtlIGl0IGFwcGVhciB0aGF0IHRoZQotICAgIC8vIHNwYWNlIGJldHdlZW4gYWRq
YWNlbnQgbWlzc3BlbGxlZCB3b3JkcyB3YXMgdW5kZXJsaW5lZC4KLSAgICAvLyBhbGxvdyBzbGln
aHRseSBtb3JlIGNvbnNpZGVyaW5nIHRoYXQgdGhlIHBhdHRlcm4gZW5kcyB3aXRoIGEgdHJhbnNw
YXJlbnQgcGl4ZWwKLSAgICBpbnQgd2lkdGhNb2QgPSB3aWR0aCAlIHBhdHRlcm5XaWR0aDsKLSAg
ICBpZiAocGF0dGVybldpZHRoIC0gd2lkdGhNb2QgPiBjTWlzc3BlbGxpbmdMaW5lUGF0dGVybkdh
cFdpZHRoKQotICAgICAgICB3aWR0aCAtPSB3aWR0aE1vZDsKLSAgICAgIAotICAgIC8vIERyYXcg
dGhlIHVuZGVybGluZQotICAgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0
KCk7Ci0gICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShjb250ZXh0KTsKLQotICAgIGNvbnN0IENvbG9y
JiBwYXR0ZXJuQ29sb3IgPSBncmFtbWFyID8gZ3JhbW1hclBhdHRlcm5Db2xvcigpIDogc3BlbGxp
bmdQYXR0ZXJuQ29sb3IoKTsKLSAgICBzZXRDR1N0cm9rZUNvbG9yKGNvbnRleHQsIHBhdHRlcm5D
b2xvcik7Ci0KLSAgICB3a1NldFBhdHRlcm5QaGFzZUluVXNlclNwYWNlKGNvbnRleHQsIHBvaW50
KTsKLSAgICBDR0NvbnRleHRTZXRCbGVuZE1vZGUoY29udGV4dCwga0NHQmxlbmRNb2RlTm9ybWFs
KTsKLSAgICAKLSAgICAvLyAzIHJvd3MsIGVhY2ggb2Zmc2V0IGJ5IGhhbGYgYSBwaXhlbCBmb3Ig
YmxlbmRpbmcgcHVycG9zZXMKLSAgICBjb25zdCBDR1BvaW50IHVwcGVyUG9pbnRzIFtdID0ge3tw
b2ludC54KCksIHBvaW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAyLjUgfSwge3BvaW50LngoKSAr
IHdpZHRoLCBwb2ludC55KCkgKyBwYXR0ZXJuSGVpZ2h0IC0gMi41fX07Ci0gICAgY29uc3QgQ0dQ
b2ludCBtaWRkbGVQb2ludHMgW10gPSB7e3BvaW50LngoKSwgcG9pbnQueSgpICsgcGF0dGVybkhl
aWdodCAtIDEuNSB9LCB7cG9pbnQueCgpICsgd2lkdGgsIHBvaW50LnkoKSArIHBhdHRlcm5IZWln
aHQgLSAxLjV9fTsKLSAgICBjb25zdCBDR1BvaW50IGxvd2VyUG9pbnRzIFtdID0ge3twb2ludC54
KCksIHBvaW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAwLjUgfSwge3BvaW50LngoKSArIHdpZHRo
LCBwb2ludC55KCkgKyBwYXR0ZXJuSGVpZ2h0IC0gMC41IH19OwotICAgIAotICAgIC8vIERhc2gg
bGVuZ3RocyBmb3IgdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBlcnJvciB1bmRlcmxpbmUgYXJl
IHRoZSBzYW1lLgotICAgIC8vIFRoZXNlIGFyZSBtYWdpYy4KLSAgICBzdGF0aWMgY29uc3QgZmxv
YXQgZWRnZV9kYXNoX2xlbmd0aHNbXSA9IHsyLCAyfTsKLSAgICBzdGF0aWMgY29uc3QgZmxvYXQg
bWlkZGxlX2Rhc2hfbGVuZ3Roc1tdID0gezIuNzZmLCAxLjI0Zn07Ci0gICAgc3RhdGljIGNvbnN0
IGZsb2F0IGVkZ2Vfb2Zmc2V0ID0gLShlZGdlX2Rhc2hfbGVuZ3Roc1sxXSAtIDEuMGYpIC8gMi4w
ZjsKLSAgICBzdGF0aWMgY29uc3QgZmxvYXQgbWlkZGxlX29mZnNldCA9IC0obWlkZGxlX2Rhc2hf
bGVuZ3Roc1sxXSAtIDEuMGYpIC8gMi4wZjsKLQotICAgIC8vIExpbmUgb3BhY2l0aWVzLiAgT25j
ZSBhZ2FpbiwgdGhlc2UgYXJlIG1hZ2ljLgotICAgIGNvbnN0IGZsb2F0IHVwcGVyT3BhY2l0eSA9
IDAuMzNmOwotICAgIGNvbnN0IGZsb2F0IG1pZGRsZU9wYWNpdHkgPSAwLjc1ZjsKLSAgICBjb25z
dCBmbG9hdCBsb3dlck9wYWNpdHkgPSAwLjg4ZjsKLQotICAgIC8vVG9wIGxpbmUKLSAgICBDR0Nv
bnRleHRTZXRMaW5lRGFzaChjb250ZXh0LCBlZGdlX29mZnNldCwgZWRnZV9kYXNoX2xlbmd0aHMs
IAotICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlZGdlX2Rhc2hfbGVuZ3RocykgLyBz
aXplb2YoZWRnZV9kYXNoX2xlbmd0aHNbMF0pKTsKLSAgICBDR0NvbnRleHRTZXRBbHBoYShjb250
ZXh0LCB1cHBlck9wYWNpdHkpOwotICAgIENHQ29udGV4dFN0cm9rZUxpbmVTZWdtZW50cyhjb250
ZXh0LCB1cHBlclBvaW50cywgMik7Ci0gCi0gICAgLy8gTWlkZGxlIGxpbmUKLSAgICBDR0NvbnRl
eHRTZXRMaW5lRGFzaChjb250ZXh0LCBtaWRkbGVfb2Zmc2V0LCBtaWRkbGVfZGFzaF9sZW5ndGhz
LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobWlkZGxlX2Rhc2hfbGVuZ3Rocykg
LyBzaXplb2YobWlkZGxlX2Rhc2hfbGVuZ3Roc1swXSkpOwotICAgIENHQ29udGV4dFNldEFscGhh
KGNvbnRleHQsIG1pZGRsZU9wYWNpdHkpOwotICAgIENHQ29udGV4dFN0cm9rZUxpbmVTZWdtZW50
cyhjb250ZXh0LCBtaWRkbGVQb2ludHMsIDIpOwotICAgIAotICAgIC8vIEJvdHRvbSBsaW5lCi0g
ICAgQ0dDb250ZXh0U2V0TGluZURhc2goY29udGV4dCwgZWRnZV9vZmZzZXQsIGVkZ2VfZGFzaF9s
ZW5ndGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlZGdlX2Rhc2hfbGVuZ3Ro
cykgLyBzaXplb2YoZWRnZV9kYXNoX2xlbmd0aHNbMF0pKTsKLSAgICBDR0NvbnRleHRTZXRBbHBo
YShjb250ZXh0LCBsb3dlck9wYWNpdHkpOwotICAgIENHQ29udGV4dFN0cm9rZUxpbmVTZWdtZW50
cyhjb250ZXh0LCBsb3dlclBvaW50cywgMik7Ci0KLSAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRl
KGNvbnRleHQpOwotfQotCiAjaWYgRU5BQkxFKFNWRykKIEdyYXBoaWNzQ29udGV4dCogY29udGV4
dEZvckltYWdlKFNWR1Jlc291cmNlSW1hZ2UqKQogewpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW4vSW1hZ2VDR1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vSW1hZ2VDR1dpbi5jcHAJKHJldmlzaW9uIDI5ODM0KQkoZnJvbSBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZVdpbi5jcHA6Mjk4MzQpCisrKyBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZUNHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMu
ICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJJbWFnZS5oIgorI2luY2x1ZGUgIkJpdG1hcEltYWdlLmgiCisjaW5jbHVkZSAiR3JhcGhp
Y3NDb250ZXh0LmgiCisjaW5jbHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNl
cnZpY2VzLmg+CisKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4K
KyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIk1JTUVUeXBlUmVnaXN0cnku
aCIKKyNpbmNsdWRlICJTaGFyZWRCdWZmZXIuaCIKKworLy8gVGhpcyBmdW5jdGlvbiBsb2FkcyBy
ZXNvdXJjZXMgZnJvbSBXZWJLaXQKK1Bhc3NSZWZQdHI8V2ViQ29yZTo6U2hhcmVkQnVmZmVyPiBs
b2FkUmVzb3VyY2VJbnRvQnVmZmVyKGNvbnN0IGNoYXIqKTsKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCit2b2lkIEJpdG1hcEltYWdlOjppbml0UGxhdGZvcm1EYXRhKCkKK3sKK30KKwordm9pZCBC
aXRtYXBJbWFnZTo6aW52YWxpZGF0ZVBsYXRmb3JtRGF0YSgpCit7Cit9CisKK0ltYWdlKiBJbWFn
ZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBSZWZQdHI8
U2hhcmVkQnVmZmVyPiBidWZmZXIgPSBsb2FkUmVzb3VyY2VJbnRvQnVmZmVyKG5hbWUpOworICAg
IEJpdG1hcEltYWdlKiBpbWcgPSBuZXcgQml0bWFwSW1hZ2U7CisgICAgaW1nLT5zZXREYXRhKGJ1
ZmZlci5yZWxlYXNlKCksIHRydWUpOworICAgIHJldHVybiBpbWc7Cit9CisKK2Jvb2wgQml0bWFw
SW1hZ2U6OmdldEhCSVRNQVAoSEJJVE1BUCBibXApCit7CisgICAgcmV0dXJuIGdldEhCSVRNQVBP
ZlNpemUoYm1wLCAwKTsKK30KKworYm9vbCBCaXRtYXBJbWFnZTo6Z2V0SEJJVE1BUE9mU2l6ZShI
QklUTUFQIGJtcCwgTFBTSVpFIHNpemUpCit7CisgICAgQVNTRVJUKGJtcCk7CisKKyAgICBCSVRN
QVAgYm1wSW5mbzsKKyAgICBHZXRPYmplY3QoYm1wLCBzaXplb2YoQklUTUFQKSwgJmJtcEluZm8p
OworCisgICAgQVNTRVJUKGJtcEluZm8uYm1CaXRzUGl4ZWwgPT0gMzIpOworICAgIGludCBidWZm
ZXJTaXplID0gYm1wSW5mby5ibVdpZHRoQnl0ZXMgKiBibXBJbmZvLmJtSGVpZ2h0OworICAgIAor
ICAgIENHQ29sb3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VS
R0IoKTsKKyAgICBDR0NvbnRleHRSZWYgY2dDb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRl
KGJtcEluZm8uYm1CaXRzLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQsCisgICAg
ICAgIDgsIGJtcEluZm8uYm1XaWR0aEJ5dGVzLCBkZXZpY2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRl
cjMyTGl0dGxlIHwga0NHSW1hZ2VBbHBoYVByZW11bHRpcGxpZWRGaXJzdCk7CisgIAorICAgIEdy
YXBoaWNzQ29udGV4dCBnYyhjZ0NvbnRleHQpOworICAgIEludFNpemUgaW1hZ2VTaXplID0gQml0
bWFwSW1hZ2U6OnNpemUoKTsKKyAgICBpZiAoc2l6ZSkKKyAgICAgICAgZHJhd0ZyYW1lTWF0Y2hp
bmdTb3VyY2VTaXplKCZnYywgRmxvYXRSZWN0KDAsIDAsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5m
by5ibUhlaWdodCksIEludFNpemUoKnNpemUpLCBDb21wb3NpdGVDb3B5KTsKKyAgICBlbHNlCisg
ICAgICAgIGRyYXcoJmdjLCBGbG9hdFJlY3QoMCwgMCwgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZv
LmJtSGVpZ2h0KSwgRmxvYXRSZWN0KDAsIDAsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUu
aGVpZ2h0KCkpLCBDb21wb3NpdGVDb3B5KTsKKworICAgIC8vIERvIGNsZWFudXAKKyAgICBDR0Nv
bnRleHRSZWxlYXNlKGNnQ29udGV4dCk7CisgICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VS
R0IpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEJpdG1hcEltYWdlOjpkcmF3RnJhbWVN
YXRjaGluZ1NvdXJjZVNpemUoR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBGbG9hdFJlY3Qm
IGRzdFJlY3QsIGNvbnN0IEludFNpemUmIHNyY1NpemUsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBv
c2l0ZU9wKQoreworICAgIGludCBmcmFtZXMgPSBmcmFtZUNvdW50KCk7CisgICAgZm9yIChpbnQg
aSA9IDA7IGkgPCBmcmFtZXM7ICsraSkgeworICAgICAgICBDR0ltYWdlUmVmIGltYWdlID0gZnJh
bWVBdEluZGV4KGkpOworICAgICAgICBpZiAoQ0dJbWFnZUdldEhlaWdodChpbWFnZSkgPT0gKHNp
emVfdClzcmNTaXplLmhlaWdodCgpICYmIENHSW1hZ2VHZXRXaWR0aChpbWFnZSkgPT0gKHNpemVf
dClzcmNTaXplLndpZHRoKCkpIHsKKyAgICAgICAgICAgIHNpemVfdCBjdXJyZW50RnJhbWUgPSBt
X2N1cnJlbnRGcmFtZTsKKyAgICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gaTsKKyAgICAgICAg
ICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRSZWN0KDAsIDAsIHNyY1NpemUud2lkdGgoKSwg
c3JjU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsKKyAgICAgICAgICAgIG1fY3VycmVudEZy
YW1lID0gY3VycmVudEZyYW1lOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAg
fQorCisgICAgLy8gTm8gaW1hZ2Ugb2YgdGhlIGNvcnJlY3Qgc2l6ZSB3YXMgZm91bmQsIGZhbGxi
YWNrIHRvIGRyYXdpbmcgdGhlIGN1cnJlbnQgZnJhbWUKKyAgICBJbnRTaXplIGltYWdlU2l6ZSA9
IEJpdG1hcEltYWdlOjpzaXplKCk7CisgICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJlY3Qo
MCwgMCwgaW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9w
KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW4vSW1hZ2VDR1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vSW1hZ2VDR1dpbi5jcHAJKHJldmlzaW9uIDI5NzI2KQorKysgV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VDR1dpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4g
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDgg
QXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucwpAQCAtMjksMzggKzI5LDExIEBACiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0Lmgi
CiAjaW5jbHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CiAK
LSNpbmNsdWRlIDx3aW5zb2NrMi5oPgogI2luY2x1ZGUgPHdpbmRvd3MuaD4KICNpbmNsdWRlICJQ
bGF0Zm9ybVN0cmluZy5oIgotI2luY2x1ZGUgIk1JTUVUeXBlUmVnaXN0cnkuaCIKLSNpbmNsdWRl
ICJTaGFyZWRCdWZmZXIuaCIKLQotLy8gVGhpcyBmdW5jdGlvbiBsb2FkcyByZXNvdXJjZXMgZnJv
bSBXZWJLaXQKLVBhc3NSZWZQdHI8V2ViQ29yZTo6U2hhcmVkQnVmZmVyPiBsb2FkUmVzb3VyY2VJ
bnRvQnVmZmVyKGNvbnN0IGNoYXIqKTsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi12b2lkIEJp
dG1hcEltYWdlOjppbml0UGxhdGZvcm1EYXRhKCkKLXsKLX0KLQotdm9pZCBCaXRtYXBJbWFnZTo6
aW52YWxpZGF0ZVBsYXRmb3JtRGF0YSgpCi17Ci19Ci0KLUltYWdlKiBJbWFnZTo6bG9hZFBsYXRm
b3JtUmVzb3VyY2UoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBSZWZQdHI8U2hhcmVkQnVmZmVy
PiBidWZmZXIgPSBsb2FkUmVzb3VyY2VJbnRvQnVmZmVyKG5hbWUpOwotICAgIEJpdG1hcEltYWdl
KiBpbWcgPSBuZXcgQml0bWFwSW1hZ2U7Ci0gICAgaW1nLT5zZXREYXRhKGJ1ZmZlci5yZWxlYXNl
KCksIHRydWUpOwotICAgIHJldHVybiBpbWc7Ci19Ci0KLWJvb2wgQml0bWFwSW1hZ2U6OmdldEhC
SVRNQVAoSEJJVE1BUCBibXApCi17Ci0gICAgcmV0dXJuIGdldEhCSVRNQVBPZlNpemUoYm1wLCAw
KTsKLX0KLQogYm9vbCBCaXRtYXBJbWFnZTo6Z2V0SEJJVE1BUE9mU2l6ZShIQklUTUFQIGJtcCwg
TFBTSVpFIHNpemUpCiB7CiAgICAgQVNTRVJUKGJtcCk7CkBAIC03Niw2ICs0OSw3IEBAIGJvb2wg
Qml0bWFwSW1hZ2U6OmdldEhCSVRNQVBPZlNpemUoSEJJVE0KICAgICAgICAgOCwgYm1wSW5mby5i
bVdpZHRoQnl0ZXMsIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBrQ0dJ
bWFnZUFscGhhUHJlbXVsdGlwbGllZEZpcnN0KTsKICAgCiAgICAgR3JhcGhpY3NDb250ZXh0IGdj
KGNnQ29udGV4dCk7CisKICAgICBJbnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcEltYWdlOjpzaXpl
KCk7CiAgICAgaWYgKHNpemUpCiAgICAgICAgIGRyYXdGcmFtZU1hdGNoaW5nU291cmNlU2l6ZSgm
Z2MsIEZsb2F0UmVjdCgwLCAwLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQpLCBJ
bnRTaXplKCpzaXplKSwgQ29tcG9zaXRlQ29weSk7CkBAIC04NSwxNSArNTksMjAgQEAgYm9vbCBC
aXRtYXBJbWFnZTo6Z2V0SEJJVE1BUE9mU2l6ZShIQklUTQogICAgIC8vIERvIGNsZWFudXAKICAg
ICBDR0NvbnRleHRSZWxlYXNlKGNnQ29udGV4dCk7CiAgICAgQ0dDb2xvclNwYWNlUmVsZWFzZShk
ZXZpY2VSR0IpOworCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgQml0bWFwSW1hZ2U6OmRy
YXdGcmFtZU1hdGNoaW5nU291cmNlU2l6ZShHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZs
b2F0UmVjdCYgZHN0UmVjdCwgY29uc3QgSW50U2l6ZSYgc3JjU2l6ZSwgQ29tcG9zaXRlT3BlcmF0
b3IgY29tcG9zaXRlT3ApCiB7CiAgICAgaW50IGZyYW1lcyA9IGZyYW1lQ291bnQoKTsKKyAgICBz
aXplX3QgaW1hZ2VIZWlnaHQgPSAwOworICAgIHNpemVfdCBpbWFnZVdpZHRoID0gMDsKICAgICBm
b3IgKGludCBpID0gMDsgaSA8IGZyYW1lczsgKytpKSB7Ci0gICAgICAgIENHSW1hZ2VSZWYgaW1h
Z2UgPSBmcmFtZUF0SW5kZXgoaSk7Ci0gICAgICAgIGlmIChDR0ltYWdlR2V0SGVpZ2h0KGltYWdl
KSA9PSAoc2l6ZV90KXNyY1NpemUuaGVpZ2h0KCkgJiYgQ0dJbWFnZUdldFdpZHRoKGltYWdlKSA9
PSAoc2l6ZV90KXNyY1NpemUud2lkdGgoKSkgeworICAgICAgICBOYXRpdmVJbWFnZVB0ciBpbWFn
ZSA9IGZyYW1lQXRJbmRleChpKTsKKyAgICAgICAgaW1hZ2VIZWlnaHQgPSBDR0ltYWdlR2V0SGVp
Z2h0KGltYWdlKTsKKyAgICAgICAgaW1hZ2VXaWR0aCA9IENHSW1hZ2VHZXRXaWR0aChpbWFnZSk7
CisgICAgICAgIGlmIChpbWFnZUhlaWdodCA9PSAoc2l6ZV90KXNyY1NpemUuaGVpZ2h0KCkgJiYg
aW1hZ2VXaWR0aCA9PSAoc2l6ZV90KXNyY1NpemUud2lkdGgoKSkgewogICAgICAgICAgICAgc2l6
ZV90IGN1cnJlbnRGcmFtZSA9IG1fY3VycmVudEZyYW1lOwogICAgICAgICAgICAgbV9jdXJyZW50
RnJhbWUgPSBpOwogICAgICAgICAgICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJlY3QoMCwg
MCwgc3JjU2l6ZS53aWR0aCgpLCBzcmNTaXplLmhlaWdodCgpKSwgY29tcG9zaXRlT3ApOwpJbmRl
eDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VDYWlyb1dpbi5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VDYWlyb1dpbi5jcHAJ
KHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZUNhaXJv
V2luLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIs
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJbWFnZS5oIgorI2luY2x1ZGUgIkJp
dG1hcEltYWdlLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSA8Y2Fp
cm8uaD4KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5o
IgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2Jvb2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVBP
ZlNpemUoSEJJVE1BUCBibXAsIExQU0laRSBzaXplKQoreworICAgIEFTU0VSVChibXApOworCisg
ICAgQklUTUFQIGJtcEluZm87CisgICAgR2V0T2JqZWN0KGJtcCwgc2l6ZW9mKEJJVE1BUCksICZi
bXBJbmZvKTsKKworICAgIC8vIElmIHRoaXMgaXMgYSAzMmJwcCBiaXRtYXAsIHdoaWNoIGl0IGFs
d2F5cyBzaG91bGQgYmUsIHdlJ2xsIGNsZWFyIGl0IHNvIGFscGhhLXdpc2UgaXQgd2lsbCBiZSB2
aXNpYmxlCisgICAgaWYgKGJtcEluZm8uYm1CaXRzUGl4ZWwgPT0gMzIpIHsKKyAgICAgICAgaW50
IGJ1ZmZlclNpemUgPSBibXBJbmZvLmJtV2lkdGhCeXRlcyAqIGJtcEluZm8uYm1IZWlnaHQ7Cisg
ICAgICAgIG1lbXNldChibXBJbmZvLmJtQml0cywgMjU1LCBidWZmZXJTaXplKTsKKyAgICB9Cisg
CQorICAgIEhEQyB0ZW1wREMgPSBDcmVhdGVDb21wYXRpYmxlREMoMCk7CisgICAgaWYgKCF0ZW1w
REMpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIGluLW1lbW9yeSBEQyBm
b3IgSW1hZ2U6OmJsaXQoKSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFNl
bGVjdE9iamVjdCh0ZW1wREMsIGJtcCk7CisgICAgR3JhcGhpY3NDb250ZXh0IGdjKHRlbXBEQyk7
CisjZW5kaWYKKworICAgIEludFNpemUgaW1hZ2VTaXplID0gQml0bWFwSW1hZ2U6OnNpemUoKTsK
KyAgICBpZiAoc2l6ZSkKKyAgICAgICAgZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXplKCZnYywg
RmxvYXRSZWN0KDAsIDAsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCksIEludFNp
emUoKnNpemUpLCBDb21wb3NpdGVDb3B5KTsKKyAgICBlbHNlCisgICAgICAgIGRyYXcoJmdjLCBG
bG9hdFJlY3QoMCwgMCwgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwgRmxvYXRS
ZWN0KDAsIDAsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBDb21wb3Np
dGVDb3B5KTsKKworICAgIC8vIERvIGNsZWFudXAKKyAgICAvLyBEbyBjbGVhbnVwCisgICAgRGVs
ZXRlREModGVtcERDKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEJpdG1hcEltYWdl
OjpkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUoR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25z
dCBGbG9hdFJlY3QmIGRzdFJlY3QsIGNvbnN0IEludFNpemUmIHNyY1NpemUsIENvbXBvc2l0ZU9w
ZXJhdG9yIGNvbXBvc2l0ZU9wKQoreworICAgIGludCBmcmFtZXMgPSBmcmFtZUNvdW50KCk7Cisg
ICAgc2l6ZV90IGltYWdlSGVpZ2h0ID0gMDsKKyAgICBzaXplX3QgaW1hZ2VXaWR0aCA9IDA7Cisg
ICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZXM7ICsraSkgeworICAgICAgICBOYXRpdmVJbWFn
ZVB0ciBpbWFnZSA9IGZyYW1lQXRJbmRleChpKTsKKyAgICAgICAgaW1hZ2VIZWlnaHQgPSBjYWly
b19pbWFnZV9zdXJmYWNlX2dldF9oZWlnaHQoaW1hZ2UpOworICAgICAgICBpbWFnZVdpZHRoID0g
Y2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfd2lkdGgoaW1hZ2UpOworICAgICAgICBpZiAoaW1hZ2VI
ZWlnaHQgPT0gKHNpemVfdClzcmNTaXplLmhlaWdodCgpICYmIGltYWdlV2lkdGggPT0gKHNpemVf
dClzcmNTaXplLndpZHRoKCkpIHsKKyAgICAgICAgICAgIHNpemVfdCBjdXJyZW50RnJhbWUgPSBt
X2N1cnJlbnRGcmFtZTsKKyAgICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gaTsKKyAgICAgICAg
ICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRSZWN0KDAsIDAsIHNyY1NpemUud2lkdGgoKSwg
c3JjU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsKKyAgICAgICAgICAgIG1fY3VycmVudEZy
YW1lID0gY3VycmVudEZyYW1lOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAg
fQorCisgICAgLy8gTm8gaW1hZ2Ugb2YgdGhlIGNvcnJlY3Qgc2l6ZSB3YXMgZm91bmQsIGZhbGxi
YWNrIHRvIGRyYXdpbmcgdGhlIGN1cnJlbnQgZnJhbWUKKyAgICBJbnRTaXplIGltYWdlU2l6ZSA9
IEJpdG1hcEltYWdlOjpzaXplKCk7CisgICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJlY3Qo
MCwgMCwgaW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9w
KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW4vSW1hZ2VXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL0ltYWdlV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCisrKyBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZVdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSAr
MSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUg
SW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cwpAQCAtMjYsMTMgKzI2LDcgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJJbWFn
ZS5oIgogI2luY2x1ZGUgIkJpdG1hcEltYWdlLmgiCi0jaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0
LmgiCi0jaW5jbHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+
CiAKLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRl
ICJQbGF0Zm9ybVN0cmluZy5oIgotI2luY2x1ZGUgIk1JTUVUeXBlUmVnaXN0cnkuaCIKICNpbmNs
dWRlICJTaGFyZWRCdWZmZXIuaCIKIAogLy8gVGhpcyBmdW5jdGlvbiBsb2FkcyByZXNvdXJjZXMg
ZnJvbSBXZWJLaXQKQEAgLTYxLDUwICs1NSw0IEBAIGJvb2wgQml0bWFwSW1hZ2U6OmdldEhCSVRN
QVAoSEJJVE1BUCBibXAKICAgICByZXR1cm4gZ2V0SEJJVE1BUE9mU2l6ZShibXAsIDApOwogfQog
Ci1ib29sIEJpdG1hcEltYWdlOjpnZXRIQklUTUFQT2ZTaXplKEhCSVRNQVAgYm1wLCBMUFNJWkUg
c2l6ZSkKLXsKLSAgICBBU1NFUlQoYm1wKTsKLQotICAgIEJJVE1BUCBibXBJbmZvOwotICAgIEdl
dE9iamVjdChibXAsIHNpemVvZihCSVRNQVApLCAmYm1wSW5mbyk7Ci0KLSAgICBBU1NFUlQoYm1w
SW5mby5ibUJpdHNQaXhlbCA9PSAzMik7Ci0gICAgaW50IGJ1ZmZlclNpemUgPSBibXBJbmZvLmJt
V2lkdGhCeXRlcyAqIGJtcEluZm8uYm1IZWlnaHQ7Ci0gICAgCi0gICAgQ0dDb2xvclNwYWNlUmVm
IGRldmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwotICAgIENHQ29udGV4
dFJlZiBjZ0NvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUoYm1wSW5mby5ibUJpdHMsIGJt
cEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCwKLSAgICAgICAgOCwgYm1wSW5mby5ibVdp
ZHRoQnl0ZXMsIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBrQ0dJbWFn
ZUFscGhhUHJlbXVsdGlwbGllZEZpcnN0KTsKLSAgCi0gICAgR3JhcGhpY3NDb250ZXh0IGdjKGNn
Q29udGV4dCk7Ci0gICAgSW50U2l6ZSBpbWFnZVNpemUgPSBCaXRtYXBJbWFnZTo6c2l6ZSgpOwot
ICAgIGlmIChzaXplKQotICAgICAgICBkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUoJmdjLCBG
bG9hdFJlY3QoMCwgMCwgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwgSW50U2l6
ZSgqc2l6ZSksIENvbXBvc2l0ZUNvcHkpOwotICAgIGVsc2UKLSAgICAgICAgZHJhdygmZ2MsIEZs
b2F0UmVjdCgwLCAwLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQpLCBGbG9hdFJl
Y3QoMCwgMCwgaW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIENvbXBvc2l0
ZUNvcHkpOwotCi0gICAgLy8gRG8gY2xlYW51cAotICAgIENHQ29udGV4dFJlbGVhc2UoY2dDb250
ZXh0KTsKLSAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKGRldmljZVJHQik7Ci0gICAgcmV0dXJuIHRy
dWU7Ci19Ci0KLXZvaWQgQml0bWFwSW1hZ2U6OmRyYXdGcmFtZU1hdGNoaW5nU291cmNlU2l6ZShH
cmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgY29uc3QgSW50
U2l6ZSYgc3JjU2l6ZSwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApCi17Ci0gICAgaW50
IGZyYW1lcyA9IGZyYW1lQ291bnQoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lczsg
KytpKSB7Ci0gICAgICAgIENHSW1hZ2VSZWYgaW1hZ2UgPSBmcmFtZUF0SW5kZXgoaSk7Ci0gICAg
ICAgIGlmIChDR0ltYWdlR2V0SGVpZ2h0KGltYWdlKSA9PSAoc2l6ZV90KXNyY1NpemUuaGVpZ2h0
KCkgJiYgQ0dJbWFnZUdldFdpZHRoKGltYWdlKSA9PSAoc2l6ZV90KXNyY1NpemUud2lkdGgoKSkg
ewotICAgICAgICAgICAgc2l6ZV90IGN1cnJlbnRGcmFtZSA9IG1fY3VycmVudEZyYW1lOwotICAg
ICAgICAgICAgbV9jdXJyZW50RnJhbWUgPSBpOwotICAgICAgICAgICAgZHJhdyhjdHh0LCBkc3RS
ZWN0LCBGbG9hdFJlY3QoMCwgMCwgc3JjU2l6ZS53aWR0aCgpLCBzcmNTaXplLmhlaWdodCgpKSwg
Y29tcG9zaXRlT3ApOwotICAgICAgICAgICAgbV9jdXJyZW50RnJhbWUgPSBjdXJyZW50RnJhbWU7
Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBObyBpbWFn
ZSBvZiB0aGUgY29ycmVjdCBzaXplIHdhcyBmb3VuZCwgZmFsbGJhY2sgdG8gZHJhd2luZyB0aGUg
Y3VycmVudCBmcmFtZQotICAgIEludFNpemUgaW1hZ2VTaXplID0gQml0bWFwSW1hZ2U6OnNpemUo
KTsKLSAgICBkcmF3KGN0eHQsIGRzdFJlY3QsIEZsb2F0UmVjdCgwLCAwLCBpbWFnZVNpemUud2lk
dGgoKSwgaW1hZ2VTaXplLmhlaWdodCgpKSwgY29tcG9zaXRlT3ApOwotfQotCiB9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVG
b250RGF0YUNHV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbi9TaW1wbGVGb250RGF0YUNHV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCShmcm9tIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhV2luLmNwcDoyOTgzNCkKKysr
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ0dXaW4uY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2
LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LiAKKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBw
bGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhp
cyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJV
VE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIlNpbXBsZUZvbnREYXRhLmgiCisKKyNpbmNsdWRlIDx3aW5zb2NrMi5o
PgorI2luY2x1ZGUgIkZvbnQuaCIKKyNpbmNsdWRlICJGb250Q2FjaGUuaCIKKyNpbmNsdWRlICJG
bG9hdFJlY3QuaCIKKyNpbmNsdWRlICJGb250RGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlIDx3dGYv
TWF0aEV4dHJhcy5oPgorI2luY2x1ZGUgPHVuaWNvZGUvdWNoYXIuaD4KKyNpbmNsdWRlIDx1bmlj
b2RlL3Vub3JtLmg+CisjaW5jbHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNl
cnZpY2VzLmg+CisjaW5jbHVkZSA8bWxhbmcuaD4KKyNpbmNsdWRlIDx0Y2hhci5oPgorI2luY2x1
ZGUgPFdlYktpdFN5c3RlbUludGVyZmFjZS9XZWJLaXRTeXN0ZW1JbnRlcmZhY2UuaD4KKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworCit1c2luZyBzdGQ6Om1heDsKKworY29uc3QgZmxvYXQgY1NtYWxs
Q2Fwc0ZvbnRTaXplTXVsdGlwbGllciA9IDAuN2Y7CisKK3N0YXRpYyBib29sIHNob3VsZEFwcGx5
TWFjQXNjZW50SGFjazsKKworc3RhdGljIGlubGluZSBmbG9hdCBzY2FsZUVtVG9Vbml0cyhmbG9h
dCB4LCB1bnNpZ25lZCB1bml0c1BlckVtKSB7IHJldHVybiB1bml0c1BlckVtID8geCAvIChmbG9h
dCl1bml0c1BlckVtIDogeDsgfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpzZXRTaG91bGRBcHBs
eU1hY0FzY2VudEhhY2soYm9vbCBiKQoreworICAgIHNob3VsZEFwcGx5TWFjQXNjZW50SGFjayA9
IGI7Cit9CisKK3ZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtSW5pdCgpCit7ICAgIAorICAg
IG1fc3ludGhldGljQm9sZE9mZnNldCA9IG1fZm9udC5zeW50aGV0aWNCb2xkKCkgPyAxLjBmIDog
MC5mOworICAgIG1fc2NyaXB0Q2FjaGUgPSAwOworICAgIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMg
PSAwOworICAgIG1faXNTeXN0ZW1Gb250ID0gZmFsc2U7CisgICAgCisgICAgaWYgKG1fZm9udC51
c2VHREkoKSkgeworICAgICAgICBIREMgaGRjID0gR2V0REMoMCk7CisgICAgICAgIEhHRElPQkog
b2xkRm9udCA9IFNlbGVjdE9iamVjdChoZGMsIG1fZm9udC5oZm9udCgpKTsKKyAgICAgICAgT1VU
TElORVRFWFRNRVRSSUMgbWV0cmljczsKKyAgICAgICAgR2V0T3V0bGluZVRleHRNZXRyaWNzKGhk
Yywgc2l6ZW9mKG1ldHJpY3MpLCAmbWV0cmljcyk7CisgICAgICAgIFRFWFRNRVRSSUMmIHRleHRN
ZXRyaWNzID0gbWV0cmljcy5vdG1UZXh0TWV0cmljczsKKyAgICAgICAgbV9hc2NlbnQgPSB0ZXh0
TWV0cmljcy50bUFzY2VudDsKKyAgICAgICAgbV9kZXNjZW50ID0gdGV4dE1ldHJpY3MudG1EZXNj
ZW50OworICAgICAgICBtX2xpbmVHYXAgPSB0ZXh0TWV0cmljcy50bUV4dGVybmFsTGVhZGluZzsK
KyAgICAgICAgbV9saW5lU3BhY2luZyA9IG1fYXNjZW50ICsgbV9kZXNjZW50ICsgbV9saW5lR2Fw
OworICAgICAgICBtX3hIZWlnaHQgPSBtX2FzY2VudCAqIDAuNTZmOyAvLyBCZXN0IGd1ZXNzIGZv
ciB4SGVpZ2h0IGlmIG5vIHggZ2x5cGggaXMgcHJlc2VudC4KKworICAgICAgICBHTFlQSE1FVFJJ
Q1MgZ207CisgICAgICAgIE1BVDIgbWF0ID0geyAxLCAwLCAwLCAxIH07CisgICAgICAgIERXT1JE
IGxlbiA9IEdldEdseXBoT3V0bGluZShoZGMsICd4JywgR0dPX01FVFJJQ1MsICZnbSwgMCwgMCwg
Jm1hdCk7CisgICAgICAgIGlmIChsZW4gIT0gR0RJX0VSUk9SICYmIGdtLmdtcHRHbHlwaE9yaWdp
bi55ID4gMCkKKyAgICAgICAgICAgIG1feEhlaWdodCA9IGdtLmdtcHRHbHlwaE9yaWdpbi55Owor
CisgICAgICAgIG1fdW5pdHNQZXJFbSA9IG1ldHJpY3Mub3RtRU1TcXVhcmU7CisKKyAgICAgICAg
U2VsZWN0T2JqZWN0KGhkYywgb2xkRm9udCk7CisgICAgICAgIFJlbGVhc2VEQygwLCBoZGMpOwor
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDR0ZvbnRSZWYgZm9udCA9IG1fZm9udC5j
Z0ZvbnQoKTsKKyAgICBpbnQgaUFzY2VudCA9IENHRm9udEdldEFzY2VudChmb250KTsKKyAgICBp
bnQgaURlc2NlbnQgPSBDR0ZvbnRHZXREZXNjZW50KGZvbnQpOworICAgIGludCBpTGluZUdhcCA9
IENHRm9udEdldExlYWRpbmcoZm9udCk7CisgICAgbV91bml0c1BlckVtID0gQ0dGb250R2V0VW5p
dHNQZXJFbShmb250KTsKKyAgICBmbG9hdCBwb2ludFNpemUgPSBtX2ZvbnQuc2l6ZSgpOworICAg
IGZsb2F0IGZBc2NlbnQgPSBzY2FsZUVtVG9Vbml0cyhpQXNjZW50LCBtX3VuaXRzUGVyRW0pICog
cG9pbnRTaXplOworICAgIGZsb2F0IGZEZXNjZW50ID0gLXNjYWxlRW1Ub1VuaXRzKGlEZXNjZW50
LCBtX3VuaXRzUGVyRW0pICogcG9pbnRTaXplOworICAgIGZsb2F0IGZMaW5lR2FwID0gc2NhbGVF
bVRvVW5pdHMoaUxpbmVHYXAsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7CisKKyAgICBpZiAo
IWlzQ3VzdG9tRm9udCgpKSB7CisgICAgICAgIEhEQyBkYyA9IEdldERDKDApOworICAgICAgICBI
R0RJT0JKIG9sZEZvbnQgPSBTZWxlY3RPYmplY3QoZGMsIG1fZm9udC5oZm9udCgpKTsKKyAgICAg
ICAgaW50IGZhY2VMZW5ndGggPSBHZXRUZXh0RmFjZShkYywgMCwgMCk7CisgICAgICAgIFZlY3Rv
cjxUQ0hBUj4gZmFjZU5hbWUoZmFjZUxlbmd0aCk7CisgICAgICAgIEdldFRleHRGYWNlKGRjLCBm
YWNlTGVuZ3RoLCBmYWNlTmFtZS5kYXRhKCkpOworICAgICAgICBtX2lzU3lzdGVtRm9udCA9ICFf
dGNzY21wKGZhY2VOYW1lLmRhdGEoKSwgX1QoIkx1Y2lkYSBHcmFuZGUiKSk7CisgICAgICAgIFNl
bGVjdE9iamVjdChkYywgb2xkRm9udCk7CisgICAgICAgIFJlbGVhc2VEQygwLCBkYyk7CisKKyAg
ICAgICAgaWYgKHNob3VsZEFwcGx5TWFjQXNjZW50SGFjaykgeworICAgICAgICAgICAgLy8gVGhp
cyBjb2RlIGNvbWVzIGZyb20gRm9udERhdGFNYWMubW0uIFdlIG9ubHkgZXZlciBkbyB0aGlzIHdo
ZW4gcnVubmluZyByZWdyZXNzaW9uIHRlc3RzIHNvIHRoYXQgb3VyIG1ldHJpY3Mgd2lsbCBtYXRj
aCBNYWMuCisKKyAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYWRqdXN0IFRpbWVzLCBIZWx2ZXRp
Y2EsIGFuZCBDb3VyaWVyIHRvIGNsb3NlbHkgbWF0Y2ggdGhlCisgICAgICAgICAgICAvLyB2ZXJ0
aWNhbCBtZXRyaWNzIG9mIHRoZWlyIE1pY3Jvc29mdCBjb3VudGVycGFydHMgdGhhdCBhcmUgdGhl
IGRlIGZhY3RvCisgICAgICAgICAgICAvLyB3ZWIgc3RhbmRhcmQuIFRoZSBBcHBLaXQgYWRqdXN0
bWVudCBvZiAyMCUgaXMgdG9vIGJpZyBhbmQgaXMKKyAgICAgICAgICAgIC8vIGluY29ycmVjdGx5
IGFkZGVkIHRvIGxpbmUgc3BhY2luZywgc28gd2UgdXNlIGEgMTUlIGFkanVzdG1lbnQgaW5zdGVh
ZAorICAgICAgICAgICAgLy8gYW5kIGFkZCBpdCB0byB0aGUgYXNjZW50LgorICAgICAgICAgICAg
aWYgKCFfdGNzY21wKGZhY2VOYW1lLmRhdGEoKSwgX1QoIlRpbWVzIikpIHx8ICFfdGNzY21wKGZh
Y2VOYW1lLmRhdGEoKSwgX1QoIkhlbHZldGljYSIpKSB8fCAhX3Rjc2NtcChmYWNlTmFtZS5kYXRh
KCksIF9UKCJDb3VyaWVyIikpKQorICAgICAgICAgICAgICAgIGZBc2NlbnQgKz0gZmxvb3JmKCgo
ZkFzY2VudCArIGZEZXNjZW50KSAqIDAuMTVmKSArIDAuNWYpOworICAgICAgICB9CisgICAgfQor
CisgICAgbV9hc2NlbnQgPSBscm91bmRmKGZBc2NlbnQpOworICAgIG1fZGVzY2VudCA9IGxyb3Vu
ZGYoZkRlc2NlbnQpOworICAgIG1fbGluZUdhcCA9IGxyb3VuZGYoZkxpbmVHYXApOworICAgIG1f
bGluZVNwYWNpbmcgPSBtX2FzY2VudCArIG1fZGVzY2VudCArIG1fbGluZUdhcDsKKworICAgIC8v
IE1lYXN1cmUgdGhlIGFjdHVhbCBjaGFyYWN0ZXIgIngiLCBiZWNhdXNlIEFwcEtpdCBzeW50aGVz
aXplcyBYIGhlaWdodCByYXRoZXIgdGhhbiBnZXR0aW5nIGl0IGZyb20gdGhlIGZvbnQuCisgICAg
Ly8gVW5mb3J0dW5hdGVseSwgTlNGb250IHdpbGwgcm91bmQgdGhpcyBmb3IgdXMgc28gd2UgZG9u
J3QgcXVpdGUgZ2V0IHRoZSByaWdodCB2YWx1ZS4KKyAgICBHbHlwaFBhZ2UqIGdseXBoUGFnZVpl
cm8gPSBHbHlwaFBhZ2VUcmVlTm9kZTo6Z2V0Um9vdENoaWxkKHRoaXMsIDApLT5wYWdlKCk7Cisg
ICAgR2x5cGggeEdseXBoID0gZ2x5cGhQYWdlWmVybyA/IGdseXBoUGFnZVplcm8tPmdseXBoRGF0
YUZvckNoYXJhY3RlcigneCcpLmdseXBoIDogMDsKKyAgICBpZiAoeEdseXBoKSB7CisgICAgICAg
IENHUmVjdCB4Qm94OworICAgICAgICBDR0ZvbnRHZXRHbHlwaEJCb3hlcyhmb250LCAmeEdseXBo
LCAxLCAmeEJveCk7CisgICAgICAgIC8vIFVzZSB0aGUgbWF4aW11bSBvZiBlaXRoZXIgd2lkdGgg
b3IgaGVpZ2h0IGJlY2F1c2UgIngiIGlzIG5lYXJseSBzcXVhcmUKKyAgICAgICAgLy8gYW5kIHdl
YiBwYWdlcyB0aGF0IGZvb2xpc2hseSB1c2UgdGhpcyBtZXRyaWMgZm9yIHdpZHRoIHdpbGwgYmUg
bGFpZCBvdXQKKyAgICAgICAgLy8gcG9vcmx5IGlmIHdlIHJldHVybiBhbiBhY2N1cmF0ZSBoZWln
aHQuIENsYXNzaWMgY2FzZSBpcyBUaW1lcyAxMyBwb2ludCwKKyAgICAgICAgLy8gd2hpY2ggaGFz
IGFuICJ4IiB0aGF0IGlzIDd4NiBwaXhlbHMuCisgICAgICAgIG1feEhlaWdodCA9IHNjYWxlRW1U
b1VuaXRzKG1heChDR1JlY3RHZXRNYXhYKHhCb3gpLCBDR1JlY3RHZXRNYXhZKHhCb3gpKSwgbV91
bml0c1BlckVtKSAqIHBvaW50U2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgaVhIZWln
aHQgPSBDR0ZvbnRHZXRYSGVpZ2h0KGZvbnQpOworICAgICAgICBtX3hIZWlnaHQgPSBzY2FsZUVt
VG9Vbml0cyhpWEhlaWdodCwgbV91bml0c1BlckVtKSAqIHBvaW50U2l6ZTsKKyAgICB9Cit9CisK
K3ZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtRGVzdHJveSgpCit7CisgICAgaWYgKCFpc0N1
c3RvbUZvbnQoKSkgeworICAgICAgICBEZWxldGVPYmplY3QobV9mb250Lmhmb250KCkpOworICAg
ICAgICBDR0ZvbnRSZWxlYXNlKG1fZm9udC5jZ0ZvbnQoKSk7CisgICAgfQorCisgICAgLy8gV2Ug
ZG9uJ3QgaGFzaCB0aGlzIG9uIFdpbjMyLCBzbyBpdCdzIGVmZmVjdGl2ZWx5IG93bmVkIGJ5IHVz
LgorICAgIGRlbGV0ZSBtX3NtYWxsQ2Fwc0ZvbnREYXRhOworCisgICAgU2NyaXB0RnJlZUNhY2hl
KCZtX3NjcmlwdENhY2hlKTsKKyAgICBkZWxldGUgbV9zY3JpcHRGb250UHJvcGVydGllczsKK30K
KworU2ltcGxlRm9udERhdGEqIFNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNGb250RGF0YShjb25z
dCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKK3sKKyAgICBpZiAoIW1f
c21hbGxDYXBzRm9udERhdGEpIHsKKyAgICAgICAgZmxvYXQgc21hbGxDYXBzSGVpZ2h0ID0gY1Nt
YWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllciAqIG1fZm9udC5zaXplKCk7CisgICAgICAgIGlmIChp
c0N1c3RvbUZvbnQoKSkgeworICAgICAgICAgICAgRm9udFBsYXRmb3JtRGF0YSBzbWFsbENhcHNG
b250RGF0YShtX2ZvbnQpOworICAgICAgICAgICAgc21hbGxDYXBzRm9udERhdGEuc2V0U2l6ZShz
bWFsbENhcHNIZWlnaHQpOworICAgICAgICAgICAgbV9zbWFsbENhcHNGb250RGF0YSA9IG5ldyBT
aW1wbGVGb250RGF0YShzbWFsbENhcHNGb250RGF0YSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICB9
IGVsc2UgeworICAgICAgICAgICAgTE9HRk9OVCB3aW5mb250OworICAgICAgICAgICAgR2V0T2Jq
ZWN0KG1fZm9udC5oZm9udCgpLCBzaXplb2YoTE9HRk9OVCksICZ3aW5mb250KTsKKyAgICAgICAg
ICAgIHdpbmZvbnQubGZIZWlnaHQgPSAtbHJvdW5kZihzbWFsbENhcHNIZWlnaHQgKiAobV9mb250
LnVzZUdESSgpID8gMSA6IDMyKSk7CisgICAgICAgICAgICBIRk9OVCBoZm9udCA9IENyZWF0ZUZv
bnRJbmRpcmVjdCgmd2luZm9udCk7CisgICAgICAgICAgICBtX3NtYWxsQ2Fwc0ZvbnREYXRhID0g
bmV3IFNpbXBsZUZvbnREYXRhKEZvbnRQbGF0Zm9ybURhdGEoaGZvbnQsIHNtYWxsQ2Fwc0hlaWdo
dCwgZm9udERlc2NyaXB0aW9uLmJvbGQoKSwgZm9udERlc2NyaXB0aW9uLml0YWxpYygpLCBtX2Zv
bnQudXNlR0RJKCkpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbV9zbWFsbENhcHNG
b250RGF0YTsKK30KKworYm9vbCBTaW1wbGVGb250RGF0YTo6Y29udGFpbnNDaGFyYWN0ZXJzKGNv
bnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3RoKSBjb25zdAoreworICAgIC8vIEZJWE1F
OiBTdXBwb3J0IGN1c3RvbSBmb250cy4KKyAgICBpZiAoaXNDdXN0b21Gb250KCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIC8vIEZJWE1FOiBNaWNyb3NvZnQgZG9jdW1lbnRhdGlvbiBz
ZWVtcyB0byBpbXBseSB0aGF0IGNoYXJhY3RlcnMgY2FuIGJlIG91dHB1dCB1c2luZyBhIGdpdmVu
IGZvbnQgYW5kIERDCisgICAgLy8gbWVyZWx5IGJ5IHRlc3RpbmcgY29kZSBwYWdlIGludGVyc2Vj
dGlvbi4gIFRoaXMgc2VlbXMgc3VzcGVjdCB0aG91Z2guICBDYW4ndCBhIGZvbnQgb25seSBwYXJ0
aWFsbHkKKyAgICAvLyBjb3ZlciBhIGdpdmVuIGNvZGUgcGFnZT8KKyAgICBJTUxhbmdGb250TGlu
azIqIGxhbmdGb250TGluayA9IEZvbnRDYWNoZTo6Z2V0Rm9udExpbmtJbnRlcmZhY2UoKTsKKyAg
ICBpZiAoIWxhbmdGb250TGluaykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgSERDIGRj
ID0gR2V0REMoMCk7CisgICAgCisgICAgRFdPUkQgYWNwQ29kZVBhZ2VzOworICAgIGxhbmdGb250
TGluay0+Q29kZVBhZ2VUb0NvZGVQYWdlcyhDUF9BQ1AsICZhY3BDb2RlUGFnZXMpOworCisgICAg
RFdPUkQgZm9udENvZGVQYWdlczsKKyAgICBsYW5nRm9udExpbmstPkdldEZvbnRDb2RlUGFnZXMo
ZGMsIG1fZm9udC5oZm9udCgpLCAmZm9udENvZGVQYWdlcyk7CisKKyAgICBEV09SRCBhY3R1YWxD
b2RlUGFnZXM7CisgICAgbG9uZyBudW1DaGFyYWN0ZXJzUHJvY2Vzc2VkOworICAgIGxvbmcgb2Zm
c2V0ID0gMDsKKyAgICB3aGlsZSAob2Zmc2V0IDwgbGVuZ3RoKSB7CisgICAgICAgIGxhbmdGb250
TGluay0+R2V0U3RyQ29kZVBhZ2VzKGNoYXJhY3RlcnMsIGxlbmd0aCwgYWNwQ29kZVBhZ2VzLCAm
YWN0dWFsQ29kZVBhZ2VzLCAmbnVtQ2hhcmFjdGVyc1Byb2Nlc3NlZCk7CisgICAgICAgIGlmICgo
YWN0dWFsQ29kZVBhZ2VzICYgZm9udENvZGVQYWdlcykgPT0gMCkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgb2Zmc2V0ICs9IG51bUNoYXJhY3RlcnNQcm9jZXNzZWQ7CisgICAg
fQorCisgICAgUmVsZWFzZURDKDAsIGRjKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lk
IFNpbXBsZUZvbnREYXRhOjpkZXRlcm1pbmVQaXRjaCgpCit7CisgICAgaWYgKGlzQ3VzdG9tRm9u
dCgpKSB7CisgICAgICAgIG1fdHJlYXRBc0ZpeGVkUGl0Y2ggPSBmYWxzZTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIC8vIFRFWFRNRVRSSUNTIGhhdmUgdGhpcy4gIFNldCBtX3RyZWF0
QXNGaXhlZFBpdGNoIGJhc2VkIG9mZiB0aGF0LgorICAgIEhEQyBkYyA9IEdldERDKDApOworICAg
IFNhdmVEQyhkYyk7CisgICAgU2VsZWN0T2JqZWN0KGRjLCBtX2ZvbnQuaGZvbnQoKSk7CisKKyAg
ICAvLyBZZXMsIHRoaXMgbG9va3MgYmFja3dhcmRzLCBidXQgdGhlIGZpeGVkIHBpdGNoIGJpdCBp
cyBhY3R1YWxseSBzZXQgaWYgdGhlIGZvbnQKKyAgICAvLyBpcyAqbm90KiBmaXhlZCBwaXRjaC4g
IFVuYmVsaWV2YWJsZSBidXQgdHJ1ZS4KKyAgICBURVhUTUVUUklDIHRtOworICAgIEdldFRleHRN
ZXRyaWNzKGRjLCAmdG0pOworICAgIG1fdHJlYXRBc0ZpeGVkUGl0Y2ggPSAoKHRtLnRtUGl0Y2hB
bmRGYW1pbHkgJiBUTVBGX0ZJWEVEX1BJVENIKSA9PSAwKTsKKworICAgIFJlc3RvcmVEQyhkYywg
LTEpOworICAgIFJlbGVhc2VEQygwLCBkYyk7Cit9CisKK2Zsb2F0IFNpbXBsZUZvbnREYXRhOjpw
bGF0Zm9ybVdpZHRoRm9yR2x5cGgoR2x5cGggZ2x5cGgpIGNvbnN0Cit7CisgICAgaWYgKG1fZm9u
dC51c2VHREkoKSkgeworICAgICAgICBIREMgaGRjID0gR2V0REMoMCk7CisgICAgICAgIEhHRElP
Qkogb2xkRm9udCA9IFNlbGVjdE9iamVjdChoZGMsIG1fZm9udC5oZm9udCgpKTsKKyAgICAgICAg
aW50IHdpZHRoOworICAgICAgICBHZXRDaGFyV2lkdGhJKGhkYywgZ2x5cGgsIDEsIDAsICZ3aWR0
aCk7CisgICAgICAgIFNlbGVjdE9iamVjdChoZGMsIG9sZEZvbnQpOworICAgICAgICBSZWxlYXNl
REMoMCwgaGRjKTsKKyAgICAgICAgcmV0dXJuIHdpZHRoOworICAgIH0KKworICAgIENHRm9udFJl
ZiBmb250ID0gbV9mb250LmNnRm9udCgpOworICAgIGZsb2F0IHBvaW50U2l6ZSA9IG1fZm9udC5z
aXplKCk7CisgICAgQ0dTaXplIGFkdmFuY2U7CisgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENH
QWZmaW5lVHJhbnNmb3JtTWFrZVNjYWxlKHBvaW50U2l6ZSwgcG9pbnRTaXplKTsKKyAgICAvLyBG
SVhNRTogTmVlZCB0byBhZGQgcmVhbCBzdXBwb3J0IGZvciBwcmludGVyIGZvbnRzLgorICAgIGJv
b2wgaXNQcmludGVyRm9udCA9IGZhbHNlOworICAgIHdrR2V0R2x5cGhBZHZhbmNlcyhmb250LCBt
LCBtX2lzU3lzdGVtRm9udCwgaXNQcmludGVyRm9udCwgZ2x5cGgsIGFkdmFuY2UpOworICAgIHJl
dHVybiBhZHZhbmNlLndpZHRoICsgbV9zeW50aGV0aWNCb2xkT2Zmc2V0OworfQorCitTQ1JJUFRf
Rk9OVFBST1BFUlRJRVMqIFNpbXBsZUZvbnREYXRhOjpzY3JpcHRGb250UHJvcGVydGllcygpIGNv
bnN0Cit7CisgICAgaWYgKCFtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzKSB7CisgICAgICAgIG1fc2Ny
aXB0Rm9udFByb3BlcnRpZXMgPSBuZXcgU0NSSVBUX0ZPTlRQUk9QRVJUSUVTOworICAgICAgICBt
ZW1zZXQobV9zY3JpcHRGb250UHJvcGVydGllcywgMCwgc2l6ZW9mKFNDUklQVF9GT05UUFJPUEVS
VElFUykpOworICAgICAgICBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzLT5jQnl0ZXMgPSBzaXplb2Yo
U0NSSVBUX0ZPTlRQUk9QRVJUSUVTKTsKKyAgICAgICAgSFJFU1VMVCByZXN1bHQgPSBTY3JpcHRH
ZXRGb250UHJvcGVydGllcygwLCBzY3JpcHRDYWNoZSgpLCBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVz
KTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBFX1BFTkRJTkcpIHsKKyAgICAgICAgICAgIEhEQyBk
YyA9IEdldERDKDApOworICAgICAgICAgICAgU2F2ZURDKGRjKTsKKyAgICAgICAgICAgIFNlbGVj
dE9iamVjdChkYywgbV9mb250Lmhmb250KCkpOworICAgICAgICAgICAgU2NyaXB0R2V0Rm9udFBy
b3BlcnRpZXMoZGMsIHNjcmlwdENhY2hlKCksIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMpOworICAg
ICAgICAgICAgUmVzdG9yZURDKGRjLCAtMSk7CisgICAgICAgICAgICBSZWxlYXNlREMoMCwgZGMp
OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzOwor
fQorCit9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0
YUNHV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9T
aW1wbGVGb250RGF0YUNHV2luLmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNHV2luLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5j
LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAw
OCBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCkBAIC0zOCwyNyArMzgsMTggQEAKICNpbmNsdWRlIDx1bmljb2RlL3VjaGFyLmg+
CiAjaW5jbHVkZSA8dW5pY29kZS91bm9ybS5oPgogI2luY2x1ZGUgPEFwcGxpY2F0aW9uU2Vydmlj
ZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgorI2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVyZmFj
ZS9XZWJLaXRTeXN0ZW1JbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtbGFuZy5oPgogI2luY2x1ZGUg
PHRjaGFyLmg+Ci0jaW5jbHVkZSA8V2ViS2l0U3lzdGVtSW50ZXJmYWNlL1dlYktpdFN5c3RlbUlu
dGVyZmFjZS5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIHVzaW5nIHN0ZDo6bWF4OwogCi1j
b25zdCBmbG9hdCBjU21hbGxDYXBzRm9udFNpemVNdWx0aXBsaWVyID0gMC43ZjsKLQotc3RhdGlj
IGJvb2wgc2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrOwotCiBzdGF0aWMgaW5saW5lIGZsb2F0IHNj
YWxlRW1Ub1VuaXRzKGZsb2F0IHgsIHVuc2lnbmVkIHVuaXRzUGVyRW0pIHsgcmV0dXJuIHVuaXRz
UGVyRW0gPyB4IC8gKGZsb2F0KXVuaXRzUGVyRW0gOiB4OyB9CiAKLXZvaWQgU2ltcGxlRm9udERh
dGE6OnNldFNob3VsZEFwcGx5TWFjQXNjZW50SGFjayhib29sIGIpCi17Ci0gICAgc2hvdWxkQXBw
bHlNYWNBc2NlbnRIYWNrID0gYjsKLX0KLQogdm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1J
bml0KCkKLXsgICAgCit7CiAgICAgbV9zeW50aGV0aWNCb2xkT2Zmc2V0ID0gbV9mb250LnN5bnRo
ZXRpY0JvbGQoKSA/IDEuMGYgOiAwLmY7CiAgICAgbV9zY3JpcHRDYWNoZSA9IDA7CiAgICAgbV9z
Y3JpcHRGb250UHJvcGVydGllcyA9IDA7CkBAIC0xMTAsNyArMTAxLDcgQEAgdm9pZCBTaW1wbGVG
b250RGF0YTo6cGxhdGZvcm1Jbml0KCkKICAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBvbGRGb250
KTsKICAgICAgICAgUmVsZWFzZURDKDAsIGRjKTsKIAotICAgICAgICBpZiAoc2hvdWxkQXBwbHlN
YWNBc2NlbnRIYWNrKSB7CisgICAgICAgIGlmIChnZXRTaG91bGRBcHBseU1hY0FzY2VudEhhY2so
KSkgewogICAgICAgICAgICAgLy8gVGhpcyBjb2RlIGNvbWVzIGZyb20gRm9udERhdGFNYWMubW0u
IFdlIG9ubHkgZXZlciBkbyB0aGlzIHdoZW4gcnVubmluZyByZWdyZXNzaW9uIHRlc3RzIHNvIHRo
YXQgb3VyIG1ldHJpY3Mgd2lsbCBtYXRjaCBNYWMuCiAKICAgICAgICAgICAgIC8vIFdlIG5lZWQg
dG8gYWRqdXN0IFRpbWVzLCBIZWx2ZXRpY2EsIGFuZCBDb3VyaWVyIHRvIGNsb3NlbHkgbWF0Y2gg
dGhlCkBAIC0xNjAsODMgKzE1MSw2IEBAIHZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtRGVz
dHJveSgpCiAgICAgZGVsZXRlIG1fc2NyaXB0Rm9udFByb3BlcnRpZXM7CiB9CiAKLVNpbXBsZUZv
bnREYXRhKiBTaW1wbGVGb250RGF0YTo6c21hbGxDYXBzRm9udERhdGEoY29uc3QgRm9udERlc2Ny
aXB0aW9uJiBmb250RGVzY3JpcHRpb24pIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3NtYWxsQ2Fwc0Zv
bnREYXRhKSB7Ci0gICAgICAgIGZsb2F0IHNtYWxsQ2Fwc0hlaWdodCA9IGNTbWFsbENhcHNGb250
U2l6ZU11bHRpcGxpZXIgKiBtX2ZvbnQuc2l6ZSgpOwotICAgICAgICBpZiAoaXNDdXN0b21Gb250
KCkpIHsKLSAgICAgICAgICAgIEZvbnRQbGF0Zm9ybURhdGEgc21hbGxDYXBzRm9udERhdGEobV9m
b250KTsKLSAgICAgICAgICAgIHNtYWxsQ2Fwc0ZvbnREYXRhLnNldFNpemUoc21hbGxDYXBzSGVp
Z2h0KTsKLSAgICAgICAgICAgIG1fc21hbGxDYXBzRm9udERhdGEgPSBuZXcgU2ltcGxlRm9udERh
dGEoc21hbGxDYXBzRm9udERhdGEsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgIExPR0ZPTlQgd2luZm9udDsKLSAgICAgICAgICAgIEdldE9iamVjdChtX2ZvbnQu
aGZvbnQoKSwgc2l6ZW9mKExPR0ZPTlQpLCAmd2luZm9udCk7Ci0gICAgICAgICAgICB3aW5mb250
LmxmSGVpZ2h0ID0gLWxyb3VuZGYoc21hbGxDYXBzSGVpZ2h0ICogKG1fZm9udC51c2VHREkoKSA/
IDEgOiAzMikpOwotICAgICAgICAgICAgSEZPTlQgaGZvbnQgPSBDcmVhdGVGb250SW5kaXJlY3Qo
JndpbmZvbnQpOwotICAgICAgICAgICAgbV9zbWFsbENhcHNGb250RGF0YSA9IG5ldyBTaW1wbGVG
b250RGF0YShGb250UGxhdGZvcm1EYXRhKGhmb250LCBzbWFsbENhcHNIZWlnaHQsIGZvbnREZXNj
cmlwdGlvbi5ib2xkKCksIGZvbnREZXNjcmlwdGlvbi5pdGFsaWMoKSwgbV9mb250LnVzZUdESSgp
KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1fc21hbGxDYXBzRm9udERhdGE7Ci19
Ci0KLWJvb2wgU2ltcGxlRm9udERhdGE6OmNvbnRhaW5zQ2hhcmFjdGVycyhjb25zdCBVQ2hhciog
Y2hhcmFjdGVycywgaW50IGxlbmd0aCkgY29uc3QKLXsKLSAgICAvLyBGSVhNRTogU3VwcG9ydCBj
dXN0b20gZm9udHMuCi0gICAgaWYgKGlzQ3VzdG9tRm9udCgpKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICAvLyBGSVhNRTogTWljcm9zb2Z0IGRvY3VtZW50YXRpb24gc2VlbXMgdG8gaW1w
bHkgdGhhdCBjaGFyYWN0ZXJzIGNhbiBiZSBvdXRwdXQgdXNpbmcgYSBnaXZlbiBmb250IGFuZCBE
QwotICAgIC8vIG1lcmVseSBieSB0ZXN0aW5nIGNvZGUgcGFnZSBpbnRlcnNlY3Rpb24uICBUaGlz
IHNlZW1zIHN1c3BlY3QgdGhvdWdoLiAgQ2FuJ3QgYSBmb250IG9ubHkgcGFydGlhbGx5Ci0gICAg
Ly8gY292ZXIgYSBnaXZlbiBjb2RlIHBhZ2U/Ci0gICAgSU1MYW5nRm9udExpbmsyKiBsYW5nRm9u
dExpbmsgPSBGb250Q2FjaGU6OmdldEZvbnRMaW5rSW50ZXJmYWNlKCk7Ci0gICAgaWYgKCFsYW5n
Rm9udExpbmspCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIEhEQyBkYyA9IEdldERDKDAp
OwotICAgIAotICAgIERXT1JEIGFjcENvZGVQYWdlczsKLSAgICBsYW5nRm9udExpbmstPkNvZGVQ
YWdlVG9Db2RlUGFnZXMoQ1BfQUNQLCAmYWNwQ29kZVBhZ2VzKTsKLQotICAgIERXT1JEIGZvbnRD
b2RlUGFnZXM7Ci0gICAgbGFuZ0ZvbnRMaW5rLT5HZXRGb250Q29kZVBhZ2VzKGRjLCBtX2ZvbnQu
aGZvbnQoKSwgJmZvbnRDb2RlUGFnZXMpOwotCi0gICAgRFdPUkQgYWN0dWFsQ29kZVBhZ2VzOwot
ICAgIGxvbmcgbnVtQ2hhcmFjdGVyc1Byb2Nlc3NlZDsKLSAgICBsb25nIG9mZnNldCA9IDA7Ci0g
ICAgd2hpbGUgKG9mZnNldCA8IGxlbmd0aCkgewotICAgICAgICBsYW5nRm9udExpbmstPkdldFN0
ckNvZGVQYWdlcyhjaGFyYWN0ZXJzLCBsZW5ndGgsIGFjcENvZGVQYWdlcywgJmFjdHVhbENvZGVQ
YWdlcywgJm51bUNoYXJhY3RlcnNQcm9jZXNzZWQpOwotICAgICAgICBpZiAoKGFjdHVhbENvZGVQ
YWdlcyAmIGZvbnRDb2RlUGFnZXMpID09IDApCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgICAgIG9mZnNldCArPSBudW1DaGFyYWN0ZXJzUHJvY2Vzc2VkOwotICAgIH0KLQotICAgIFJl
bGVhc2VEQygwLCBkYyk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBTaW1wbGVGb250
RGF0YTo6ZGV0ZXJtaW5lUGl0Y2goKQotewotICAgIGlmIChpc0N1c3RvbUZvbnQoKSkgewotICAg
ICAgICBtX3RyZWF0QXNGaXhlZFBpdGNoID0gZmFsc2U7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0KLSAgICAvLyBURVhUTUVUUklDUyBoYXZlIHRoaXMuICBTZXQgbV90cmVhdEFzRml4ZWRQaXRj
aCBiYXNlZCBvZmYgdGhhdC4KLSAgICBIREMgZGMgPSBHZXREQygwKTsKLSAgICBTYXZlREMoZGMp
OwotICAgIFNlbGVjdE9iamVjdChkYywgbV9mb250Lmhmb250KCkpOwotCi0gICAgLy8gWWVzLCB0
aGlzIGxvb2tzIGJhY2t3YXJkcywgYnV0IHRoZSBmaXhlZCBwaXRjaCBiaXQgaXMgYWN0dWFsbHkg
c2V0IGlmIHRoZSBmb250Ci0gICAgLy8gaXMgKm5vdCogZml4ZWQgcGl0Y2guICBVbmJlbGlldmFi
bGUgYnV0IHRydWUuCi0gICAgVEVYVE1FVFJJQyB0bTsKLSAgICBHZXRUZXh0TWV0cmljcyhkYywg
JnRtKTsKLSAgICBtX3RyZWF0QXNGaXhlZFBpdGNoID0gKCh0bS50bVBpdGNoQW5kRmFtaWx5ICYg
VE1QRl9GSVhFRF9QSVRDSCkgPT0gMCk7Ci0KLSAgICBSZXN0b3JlREMoZGMsIC0xKTsKLSAgICBS
ZWxlYXNlREMoMCwgZGMpOwotfQotCiBmbG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0
aEZvckdseXBoKEdseXBoIGdseXBoKSBjb25zdAogewogICAgIGlmIChtX2ZvbnQudXNlR0RJKCkp
IHsKQEAgLTI1MywyOSArMTY3LDEyIEBAIGZsb2F0IFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybVdp
ZHRoRm9yR2wKICAgICBmbG9hdCBwb2ludFNpemUgPSBtX2ZvbnQuc2l6ZSgpOwogICAgIENHU2l6
ZSBhZHZhbmNlOwogICAgIENHQWZmaW5lVHJhbnNmb3JtIG0gPSBDR0FmZmluZVRyYW5zZm9ybU1h
a2VTY2FsZShwb2ludFNpemUsIHBvaW50U2l6ZSk7CisgCiAgICAgLy8gRklYTUU6IE5lZWQgdG8g
YWRkIHJlYWwgc3VwcG9ydCBmb3IgcHJpbnRlciBmb250cy4KICAgICBib29sIGlzUHJpbnRlckZv
bnQgPSBmYWxzZTsKICAgICB3a0dldEdseXBoQWR2YW5jZXMoZm9udCwgbSwgbV9pc1N5c3RlbUZv
bnQsIGlzUHJpbnRlckZvbnQsIGdseXBoLCBhZHZhbmNlKTsKLSAgICByZXR1cm4gYWR2YW5jZS53
aWR0aCArIG1fc3ludGhldGljQm9sZE9mZnNldDsKLX0KIAotU0NSSVBUX0ZPTlRQUk9QRVJUSUVT
KiBTaW1wbGVGb250RGF0YTo6c2NyaXB0Rm9udFByb3BlcnRpZXMoKSBjb25zdAotewotICAgIGlm
ICghbV9zY3JpcHRGb250UHJvcGVydGllcykgewotICAgICAgICBtX3NjcmlwdEZvbnRQcm9wZXJ0
aWVzID0gbmV3IFNDUklQVF9GT05UUFJPUEVSVElFUzsKLSAgICAgICAgbWVtc2V0KG1fc2NyaXB0
Rm9udFByb3BlcnRpZXMsIDAsIHNpemVvZihTQ1JJUFRfRk9OVFBST1BFUlRJRVMpKTsKLSAgICAg
ICAgbV9zY3JpcHRGb250UHJvcGVydGllcy0+Y0J5dGVzID0gc2l6ZW9mKFNDUklQVF9GT05UUFJP
UEVSVElFUyk7Ci0gICAgICAgIEhSRVNVTFQgcmVzdWx0ID0gU2NyaXB0R2V0Rm9udFByb3BlcnRp
ZXMoMCwgc2NyaXB0Q2FjaGUoKSwgbV9zY3JpcHRGb250UHJvcGVydGllcyk7Ci0gICAgICAgIGlm
IChyZXN1bHQgPT0gRV9QRU5ESU5HKSB7Ci0gICAgICAgICAgICBIREMgZGMgPSBHZXREQygwKTsK
LSAgICAgICAgICAgIFNhdmVEQyhkYyk7Ci0gICAgICAgICAgICBTZWxlY3RPYmplY3QoZGMsIG1f
Zm9udC5oZm9udCgpKTsKLSAgICAgICAgICAgIFNjcmlwdEdldEZvbnRQcm9wZXJ0aWVzKGRjLCBz
Y3JpcHRDYWNoZSgpLCBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgIFJlc3Rv
cmVEQyhkYywgLTEpOwotICAgICAgICAgICAgUmVsZWFzZURDKDAsIGRjKTsKLSAgICAgICAgfQot
ICAgIH0KLSAgICByZXR1cm4gbV9zY3JpcHRGb250UHJvcGVydGllczsKKyAgICByZXR1cm4gYWR2
YW5jZS53aWR0aCArIG1fc3ludGhldGljQm9sZE9mZnNldDsKIH0KIAogfQpJbmRleDogV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERhdGFDYWlyb1dpbi5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERhdGFDYWly
b1dpbi5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9T
aW1wbGVGb250RGF0YUNhaXJvV2luLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMDEgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAx
LiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUg
Q29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29u
dHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJp
dmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3Jp
dHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAor
ICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIKKwor
I2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2luY2x1ZGUgIkZvbnQuaCIKKyNpbmNsdWRlICJGb250
Q2FjaGUuaCIKKyNpbmNsdWRlICJGb250RGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlIDxtbGFuZy5o
PgorI2luY2x1ZGUgPHRjaGFyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9pZCBTaW1w
bGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKK3sKKyAgICBtX3NjcmlwdENhY2hlID0gMDsKKyAg
ICBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzID0gMDsKKyAgICBtX2lzU3lzdGVtRm9udCA9IGZhbHNl
OworICAgIAorICAgIGlmIChtX2ZvbnQudXNlR0RJKCkpIHsKKyAgICAgICAgSERDIGhkYyA9IEdl
dERDKDApOworICAgICAgICBIR0RJT0JKIG9sZEZvbnQgPSBTZWxlY3RPYmplY3QoaGRjLCBtX2Zv
bnQuaGZvbnQoKSk7CisgICAgICAgIE9VVExJTkVURVhUTUVUUklDIG1ldHJpY3M7CisgICAgICAg
IEdldE91dGxpbmVUZXh0TWV0cmljcyhoZGMsIHNpemVvZihtZXRyaWNzKSwgJm1ldHJpY3MpOwor
ICAgICAgICBURVhUTUVUUklDJiB0ZXh0TWV0cmljcyA9IG1ldHJpY3Mub3RtVGV4dE1ldHJpY3M7
CisgICAgICAgIG1fYXNjZW50ID0gdGV4dE1ldHJpY3MudG1Bc2NlbnQ7CisgICAgICAgIG1fZGVz
Y2VudCA9IHRleHRNZXRyaWNzLnRtRGVzY2VudDsKKyAgICAgICAgbV9saW5lR2FwID0gdGV4dE1l
dHJpY3MudG1FeHRlcm5hbExlYWRpbmc7CisgICAgICAgIG1fbGluZVNwYWNpbmcgPSBtX2FzY2Vu
dCArIG1fZGVzY2VudCArIG1fbGluZUdhcDsKKyAgICAgICAgbV94SGVpZ2h0ID0gbV9hc2NlbnQg
KiAwLjU2ZjsgLy8gQmVzdCBndWVzcyBmb3IgeEhlaWdodCBpZiBubyB4IGdseXBoIGlzIHByZXNl
bnQuCisKKyAgICAgICAgR0xZUEhNRVRSSUNTIGdtOworICAgICAgICBNQVQyIG1hdCA9IHsgMSwg
MCwgMCwgMSB9OworICAgICAgICBEV09SRCBsZW4gPSBHZXRHbHlwaE91dGxpbmUoaGRjLCAneCcs
IEdHT19NRVRSSUNTLCAmZ20sIDAsIDAsICZtYXQpOworICAgICAgICBpZiAobGVuICE9IEdESV9F
UlJPUiAmJiBnbS5nbXB0R2x5cGhPcmlnaW4ueSA+IDApCisgICAgICAgICAgICBtX3hIZWlnaHQg
PSBnbS5nbXB0R2x5cGhPcmlnaW4ueTsKKworICAgICAgICBtX3VuaXRzUGVyRW0gPSBtZXRyaWNz
Lm90bUVNU3F1YXJlOworCisgICAgICAgIFNlbGVjdE9iamVjdChoZGMsIG9sZEZvbnQpOworICAg
ICAgICBSZWxlYXNlREMoMCwgaGRjKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
Ly8gRklYTUU6IFRoaXMgc2VjdGlvbiBzaG91bGQgZGV0ZXJtaW5lIGZvbnQgZGltZW5zaW9ucyAo
c2VlIENHIGltcGxlbWVudGF0aW9uKS4KKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lk
IFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3koKQoreworICAgIG5vdEltcGxlbWVudGVk
KCk7Cit9CisKK2Zsb2F0IFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybVdpZHRoRm9yR2x5cGgoR2x5
cGggZ2x5cGgpIGNvbnN0Cit7CisgICAgaWYgKG1fZm9udC51c2VHREkoKSkgeworICAgICAgICBI
REMgaGRjID0gR2V0REMoMCk7CisgICAgICAgIEhHRElPQkogb2xkRm9udCA9IFNlbGVjdE9iamVj
dChoZGMsIG1fZm9udC5oZm9udCgpKTsKKyAgICAgICAgaW50IHdpZHRoOworICAgICAgICBHZXRD
aGFyV2lkdGhJKGhkYywgZ2x5cGgsIDEsIDAsICZ3aWR0aCk7CisgICAgICAgIFNlbGVjdE9iamVj
dChoZGMsIG9sZEZvbnQpOworICAgICAgICBSZWxlYXNlREMoMCwgaGRjKTsKKyAgICAgICAgcmV0
dXJuIHdpZHRoOworICAgIH0KKworICAgIC8vIEZJWE1FOiBGbGVzaCBvdXQgd2l0aCBDYWlyby93
aW4zMiBmb250IGltcGxlbWVudGF0aW9uCisgICAgbm90SW1wbGVtZW50ZWQoKTsKKworICAgIHJl
dHVybiAwOworfQorCit9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1w
bGVGb250RGF0YVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW4vU2ltcGxlRm9udERhdGFXaW4uY3BwCShyZXZpc2lvbiAyOTgzNCkKKysrIFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhV2luLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNTcsMTA3ICs1Nyw5IEBAIHZvaWQgU2ltcGxlRm9udERhdGE6OnNldFNob3VsZEFwcGx5
TWFjQXMKICAgICBzaG91bGRBcHBseU1hY0FzY2VudEhhY2sgPSBiOwogfQogCi12b2lkIFNpbXBs
ZUZvbnREYXRhOjpwbGF0Zm9ybUluaXQoKQoteyAgICAKLSAgICBtX3N5bnRoZXRpY0JvbGRPZmZz
ZXQgPSBtX2ZvbnQuc3ludGhldGljQm9sZCgpID8gMS4wZiA6IDAuZjsKLSAgICBtX3NjcmlwdENh
Y2hlID0gMDsKLSAgICBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzID0gMDsKLSAgICBtX2lzU3lzdGVt
Rm9udCA9IGZhbHNlOwotICAgIAotICAgIGlmIChtX2ZvbnQudXNlR0RJKCkpIHsKLSAgICAgICAg
SERDIGhkYyA9IEdldERDKDApOwotICAgICAgICBIR0RJT0JKIG9sZEZvbnQgPSBTZWxlY3RPYmpl
Y3QoaGRjLCBtX2ZvbnQuaGZvbnQoKSk7Ci0gICAgICAgIE9VVExJTkVURVhUTUVUUklDIG1ldHJp
Y3M7Ci0gICAgICAgIEdldE91dGxpbmVUZXh0TWV0cmljcyhoZGMsIHNpemVvZihtZXRyaWNzKSwg
Jm1ldHJpY3MpOwotICAgICAgICBURVhUTUVUUklDJiB0ZXh0TWV0cmljcyA9IG1ldHJpY3Mub3Rt
VGV4dE1ldHJpY3M7Ci0gICAgICAgIG1fYXNjZW50ID0gdGV4dE1ldHJpY3MudG1Bc2NlbnQ7Ci0g
ICAgICAgIG1fZGVzY2VudCA9IHRleHRNZXRyaWNzLnRtRGVzY2VudDsKLSAgICAgICAgbV9saW5l
R2FwID0gdGV4dE1ldHJpY3MudG1FeHRlcm5hbExlYWRpbmc7Ci0gICAgICAgIG1fbGluZVNwYWNp
bmcgPSBtX2FzY2VudCArIG1fZGVzY2VudCArIG1fbGluZUdhcDsKLSAgICAgICAgbV94SGVpZ2h0
ID0gbV9hc2NlbnQgKiAwLjU2ZjsgLy8gQmVzdCBndWVzcyBmb3IgeEhlaWdodCBpZiBubyB4IGds
eXBoIGlzIHByZXNlbnQuCi0KLSAgICAgICAgR0xZUEhNRVRSSUNTIGdtOwotICAgICAgICBNQVQy
IG1hdCA9IHsgMSwgMCwgMCwgMSB9OwotICAgICAgICBEV09SRCBsZW4gPSBHZXRHbHlwaE91dGxp
bmUoaGRjLCAneCcsIEdHT19NRVRSSUNTLCAmZ20sIDAsIDAsICZtYXQpOwotICAgICAgICBpZiAo
bGVuICE9IEdESV9FUlJPUiAmJiBnbS5nbXB0R2x5cGhPcmlnaW4ueSA+IDApCi0gICAgICAgICAg
ICBtX3hIZWlnaHQgPSBnbS5nbXB0R2x5cGhPcmlnaW4ueTsKLQotICAgICAgICBtX3VuaXRzUGVy
RW0gPSBtZXRyaWNzLm90bUVNU3F1YXJlOwotCi0gICAgICAgIFNlbGVjdE9iamVjdChoZGMsIG9s
ZEZvbnQpOwotICAgICAgICBSZWxlYXNlREMoMCwgaGRjKTsKLQotICAgICAgICByZXR1cm47Ci0g
ICAgfQotCi0gICAgQ0dGb250UmVmIGZvbnQgPSBtX2ZvbnQuY2dGb250KCk7Ci0gICAgaW50IGlB
c2NlbnQgPSBDR0ZvbnRHZXRBc2NlbnQoZm9udCk7Ci0gICAgaW50IGlEZXNjZW50ID0gQ0dGb250
R2V0RGVzY2VudChmb250KTsKLSAgICBpbnQgaUxpbmVHYXAgPSBDR0ZvbnRHZXRMZWFkaW5nKGZv
bnQpOwotICAgIG1fdW5pdHNQZXJFbSA9IENHRm9udEdldFVuaXRzUGVyRW0oZm9udCk7Ci0gICAg
ZmxvYXQgcG9pbnRTaXplID0gbV9mb250LnNpemUoKTsKLSAgICBmbG9hdCBmQXNjZW50ID0gc2Nh
bGVFbVRvVW5pdHMoaUFzY2VudCwgbV91bml0c1BlckVtKSAqIHBvaW50U2l6ZTsKLSAgICBmbG9h
dCBmRGVzY2VudCA9IC1zY2FsZUVtVG9Vbml0cyhpRGVzY2VudCwgbV91bml0c1BlckVtKSAqIHBv
aW50U2l6ZTsKLSAgICBmbG9hdCBmTGluZUdhcCA9IHNjYWxlRW1Ub1VuaXRzKGlMaW5lR2FwLCBt
X3VuaXRzUGVyRW0pICogcG9pbnRTaXplOwotCi0gICAgaWYgKCFpc0N1c3RvbUZvbnQoKSkgewot
ICAgICAgICBIREMgZGMgPSBHZXREQygwKTsKLSAgICAgICAgSEdESU9CSiBvbGRGb250ID0gU2Vs
ZWN0T2JqZWN0KGRjLCBtX2ZvbnQuaGZvbnQoKSk7Ci0gICAgICAgIGludCBmYWNlTGVuZ3RoID0g
R2V0VGV4dEZhY2UoZGMsIDAsIDApOwotICAgICAgICBWZWN0b3I8VENIQVI+IGZhY2VOYW1lKGZh
Y2VMZW5ndGgpOwotICAgICAgICBHZXRUZXh0RmFjZShkYywgZmFjZUxlbmd0aCwgZmFjZU5hbWUu
ZGF0YSgpKTsKLSAgICAgICAgbV9pc1N5c3RlbUZvbnQgPSAhX3Rjc2NtcChmYWNlTmFtZS5kYXRh
KCksIF9UKCJMdWNpZGEgR3JhbmRlIikpOwotICAgICAgICBTZWxlY3RPYmplY3QoZGMsIG9sZEZv
bnQpOwotICAgICAgICBSZWxlYXNlREMoMCwgZGMpOwotCi0gICAgICAgIGlmIChzaG91bGRBcHBs
eU1hY0FzY2VudEhhY2spIHsKLSAgICAgICAgICAgIC8vIFRoaXMgY29kZSBjb21lcyBmcm9tIEZv
bnREYXRhTWFjLm1tLiBXZSBvbmx5IGV2ZXIgZG8gdGhpcyB3aGVuIHJ1bm5pbmcgcmVncmVzc2lv
biB0ZXN0cyBzbyB0aGF0IG91ciBtZXRyaWNzIHdpbGwgbWF0Y2ggTWFjLgotCi0gICAgICAgICAg
ICAvLyBXZSBuZWVkIHRvIGFkanVzdCBUaW1lcywgSGVsdmV0aWNhLCBhbmQgQ291cmllciB0byBj
bG9zZWx5IG1hdGNoIHRoZQotICAgICAgICAgICAgLy8gdmVydGljYWwgbWV0cmljcyBvZiB0aGVp
ciBNaWNyb3NvZnQgY291bnRlcnBhcnRzIHRoYXQgYXJlIHRoZSBkZSBmYWN0bwotICAgICAgICAg
ICAgLy8gd2ViIHN0YW5kYXJkLiBUaGUgQXBwS2l0IGFkanVzdG1lbnQgb2YgMjAlIGlzIHRvbyBi
aWcgYW5kIGlzCi0gICAgICAgICAgICAvLyBpbmNvcnJlY3RseSBhZGRlZCB0byBsaW5lIHNwYWNp
bmcsIHNvIHdlIHVzZSBhIDE1JSBhZGp1c3RtZW50IGluc3RlYWQKLSAgICAgICAgICAgIC8vIGFu
ZCBhZGQgaXQgdG8gdGhlIGFzY2VudC4KLSAgICAgICAgICAgIGlmICghX3Rjc2NtcChmYWNlTmFt
ZS5kYXRhKCksIF9UKCJUaW1lcyIpKSB8fCAhX3Rjc2NtcChmYWNlTmFtZS5kYXRhKCksIF9UKCJI
ZWx2ZXRpY2EiKSkgfHwgIV90Y3NjbXAoZmFjZU5hbWUuZGF0YSgpLCBfVCgiQ291cmllciIpKSkK
LSAgICAgICAgICAgICAgICBmQXNjZW50ICs9IGZsb29yZigoKGZBc2NlbnQgKyBmRGVzY2VudCkg
KiAwLjE1ZikgKyAwLjVmKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1fYXNjZW50ID0gbHJv
dW5kZihmQXNjZW50KTsKLSAgICBtX2Rlc2NlbnQgPSBscm91bmRmKGZEZXNjZW50KTsKLSAgICBt
X2xpbmVHYXAgPSBscm91bmRmKGZMaW5lR2FwKTsKLSAgICBtX2xpbmVTcGFjaW5nID0gbV9hc2Nl
bnQgKyBtX2Rlc2NlbnQgKyBtX2xpbmVHYXA7Ci0KLSAgICAvLyBNZWFzdXJlIHRoZSBhY3R1YWwg
Y2hhcmFjdGVyICJ4IiwgYmVjYXVzZSBBcHBLaXQgc3ludGhlc2l6ZXMgWCBoZWlnaHQgcmF0aGVy
IHRoYW4gZ2V0dGluZyBpdCBmcm9tIHRoZSBmb250LgotICAgIC8vIFVuZm9ydHVuYXRlbHksIE5T
Rm9udCB3aWxsIHJvdW5kIHRoaXMgZm9yIHVzIHNvIHdlIGRvbid0IHF1aXRlIGdldCB0aGUgcmln
aHQgdmFsdWUuCi0gICAgR2x5cGhQYWdlKiBnbHlwaFBhZ2VaZXJvID0gR2x5cGhQYWdlVHJlZU5v
ZGU6OmdldFJvb3RDaGlsZCh0aGlzLCAwKS0+cGFnZSgpOwotICAgIEdseXBoIHhHbHlwaCA9IGds
eXBoUGFnZVplcm8gPyBnbHlwaFBhZ2VaZXJvLT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoJ3gnKS5n
bHlwaCA6IDA7Ci0gICAgaWYgKHhHbHlwaCkgewotICAgICAgICBDR1JlY3QgeEJveDsKLSAgICAg
ICAgQ0dGb250R2V0R2x5cGhCQm94ZXMoZm9udCwgJnhHbHlwaCwgMSwgJnhCb3gpOwotICAgICAg
ICAvLyBVc2UgdGhlIG1heGltdW0gb2YgZWl0aGVyIHdpZHRoIG9yIGhlaWdodCBiZWNhdXNlICJ4
IiBpcyBuZWFybHkgc3F1YXJlCi0gICAgICAgIC8vIGFuZCB3ZWIgcGFnZXMgdGhhdCBmb29saXNo
bHkgdXNlIHRoaXMgbWV0cmljIGZvciB3aWR0aCB3aWxsIGJlIGxhaWQgb3V0Ci0gICAgICAgIC8v
IHBvb3JseSBpZiB3ZSByZXR1cm4gYW4gYWNjdXJhdGUgaGVpZ2h0LiBDbGFzc2ljIGNhc2UgaXMg
VGltZXMgMTMgcG9pbnQsCi0gICAgICAgIC8vIHdoaWNoIGhhcyBhbiAieCIgdGhhdCBpcyA3eDYg
cGl4ZWxzLgotICAgICAgICBtX3hIZWlnaHQgPSBzY2FsZUVtVG9Vbml0cyhtYXgoQ0dSZWN0R2V0
TWF4WCh4Qm94KSwgQ0dSZWN0R2V0TWF4WSh4Qm94KSksIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNp
emU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IGlYSGVpZ2h0ID0gQ0dGb250R2V0WEhlaWdo
dChmb250KTsKLSAgICAgICAgbV94SGVpZ2h0ID0gc2NhbGVFbVRvVW5pdHMoaVhIZWlnaHQsIG1f
dW5pdHNQZXJFbSkgKiBwb2ludFNpemU7Ci0gICAgfQotfQotCi12b2lkIFNpbXBsZUZvbnREYXRh
OjpwbGF0Zm9ybURlc3Ryb3koKQorYm9vbCBTaW1wbGVGb250RGF0YTo6Z2V0U2hvdWxkQXBwbHlN
YWNBc2NlbnRIYWNrKCkKIHsKLSAgICBpZiAoIWlzQ3VzdG9tRm9udCgpKSB7Ci0gICAgICAgIERl
bGV0ZU9iamVjdChtX2ZvbnQuaGZvbnQoKSk7Ci0gICAgICAgIENHRm9udFJlbGVhc2UobV9mb250
LmNnRm9udCgpKTsKLSAgICB9Ci0KLSAgICAvLyBXZSBkb24ndCBoYXNoIHRoaXMgb24gV2luMzIs
IHNvIGl0J3MgZWZmZWN0aXZlbHkgb3duZWQgYnkgdXMuCi0gICAgZGVsZXRlIG1fc21hbGxDYXBz
Rm9udERhdGE7Ci0KLSAgICBTY3JpcHRGcmVlQ2FjaGUoJm1fc2NyaXB0Q2FjaGUpOwotICAgIGRl
bGV0ZSBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzOworICAgIHJldHVybiBzaG91bGRBcHBseU1hY0Fz
Y2VudEhhY2s7CiB9CiAKIFNpbXBsZUZvbnREYXRhKiBTaW1wbGVGb250RGF0YTo6c21hbGxDYXBz
Rm9udERhdGEoY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIGNvbnN0CkBA
IC0yMzcsMjggKzEzOSw2IEBAIHZvaWQgU2ltcGxlRm9udERhdGE6OmRldGVybWluZVBpdGNoKCkK
ICAgICBSZWxlYXNlREMoMCwgZGMpOwogfQogCi1mbG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZv
cm1XaWR0aEZvckdseXBoKEdseXBoIGdseXBoKSBjb25zdAotewotICAgIGlmIChtX2ZvbnQudXNl
R0RJKCkpIHsKLSAgICAgICAgSERDIGhkYyA9IEdldERDKDApOwotICAgICAgICBIR0RJT0JKIG9s
ZEZvbnQgPSBTZWxlY3RPYmplY3QoaGRjLCBtX2ZvbnQuaGZvbnQoKSk7Ci0gICAgICAgIGludCB3
aWR0aDsKLSAgICAgICAgR2V0Q2hhcldpZHRoSShoZGMsIGdseXBoLCAxLCAwLCAmd2lkdGgpOwot
ICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBvbGRGb250KTsKLSAgICAgICAgUmVsZWFzZURDKDAs
IGhkYyk7Ci0gICAgICAgIHJldHVybiB3aWR0aDsKLSAgICB9Ci0KLSAgICBDR0ZvbnRSZWYgZm9u
dCA9IG1fZm9udC5jZ0ZvbnQoKTsKLSAgICBmbG9hdCBwb2ludFNpemUgPSBtX2ZvbnQuc2l6ZSgp
OwotICAgIENHU2l6ZSBhZHZhbmNlOwotICAgIENHQWZmaW5lVHJhbnNmb3JtIG0gPSBDR0FmZmlu
ZVRyYW5zZm9ybU1ha2VTY2FsZShwb2ludFNpemUsIHBvaW50U2l6ZSk7Ci0gICAgLy8gRklYTUU6
IE5lZWQgdG8gYWRkIHJlYWwgc3VwcG9ydCBmb3IgcHJpbnRlciBmb250cy4KLSAgICBib29sIGlz
UHJpbnRlckZvbnQgPSBmYWxzZTsKLSAgICB3a0dldEdseXBoQWR2YW5jZXMoZm9udCwgbSwgbV9p
c1N5c3RlbUZvbnQsIGlzUHJpbnRlckZvbnQsIGdseXBoLCBhZHZhbmNlKTsKLSAgICByZXR1cm4g
YWR2YW5jZS53aWR0aCArIG1fc3ludGhldGljQm9sZE9mZnNldDsKLX0KLQogU0NSSVBUX0ZPTlRQ
Uk9QRVJUSUVTKiBTaW1wbGVGb250RGF0YTo6c2NyaXB0Rm9udFByb3BlcnRpZXMoKSBjb25zdAog
ewogICAgIGlmICghbV9zY3JpcHRGb250UHJvcGVydGllcykgewpJbmRleDogV2ViQ29yZS9wbGF0
Zm9ybS93aW4vRHJhZ0ltYWdlQ0dXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZv
cm0vd2luL0RyYWdJbWFnZUNHV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCShmcm9tIFdlYkNvcmUv
cGxhdGZvcm0vd2luL0RyYWdJbWFnZVdpbi5jcHA6Mjk4MzQpCisrKyBXZWJDb3JlL3BsYXRmb3Jt
L3dpbi9EcmFnSW1hZ2VDR1dpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxOTMgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENP
TVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09N
UFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkRyYWdJbWFnZS5oIgor
CisjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIK
KyNpbmNsdWRlICJJbWFnZS5oIgorI2luY2x1ZGUgIlJldGFpblB0ci5oIgorCisjaW5jbHVkZSA8
Q29yZUdyYXBoaWNzL0NvcmVHcmFwaGljcy5oPgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK0ludFNpemUgZHJhZ0ltYWdlU2l6ZShEcmFnSW1hZ2VSZWYg
aW1hZ2UpCit7CisgICAgaWYgKCFpbWFnZSkKKyAgICAgICAgcmV0dXJuIEludFNpemUoKTsKKyAg
ICBCSVRNQVAgYjsKKyAgICBHZXRPYmplY3QoaW1hZ2UsIHNpemVvZihCSVRNQVApLCAmYik7Cisg
ICAgcmV0dXJuIEludFNpemUoYi5ibVdpZHRoLCBiLmJtSGVpZ2h0KTsKK30KKwordm9pZCBkZWxl
dGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVmIGltYWdlKQoreworICAgIGlmIChpbWFnZSkKKyAgICAg
ICAgOjpEZWxldGVPYmplY3QoaW1hZ2UpOworfQorCitIQklUTUFQIGFsbG9jSW1hZ2UoSERDIGRj
LCBJbnRTaXplIHNpemUsIENHQ29udGV4dFJlZiAqdGFyZ2V0UmVmKQoreworICAgIEhCSVRNQVAg
aGJtcDsKKyAgICBCSVRNQVBJTkZPIGJtcEluZm8gPSB7MH07CisgICAgYm1wSW5mby5ibWlIZWFk
ZXIuYmlTaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOworICAgIGJtcEluZm8uYm1pSGVh
ZGVyLmJpV2lkdGggPSBzaXplLndpZHRoKCk7CisgICAgYm1wSW5mby5ibWlIZWFkZXIuYmlIZWln
aHQgPSBzaXplLmhlaWdodCgpOworICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpUGxhbmVzID0gMTsK
KyAgICBibXBJbmZvLmJtaUhlYWRlci5iaUJpdENvdW50ID0gMzI7CisgICAgYm1wSW5mby5ibWlI
ZWFkZXIuYmlDb21wcmVzc2lvbiA9IEJJX1JHQjsKKyAgICBMUFZPSUQgYml0czsKKyAgICBoYm1w
ID0gQ3JlYXRlRElCU2VjdGlvbihkYywgJmJtcEluZm8sIERJQl9SR0JfQ09MT1JTLCAmYml0cywg
MCwgMCk7CisKKyAgICBpZiAoIXRhcmdldFJlZikKKyAgICAgICAgcmV0dXJuIGhibXA7CisKKyAg
ICBDR0NvbG9yU3BhY2VSZWYgZGV2aWNlUkdCID0gQ0dDb2xvclNwYWNlQ3JlYXRlRGV2aWNlUkdC
KCk7CisgICAgQ0dDb250ZXh0UmVmIGJpdG1hcENvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVh
dGUoYml0cywgYm1wSW5mby5ibWlIZWFkZXIuYmlXaWR0aCwgYm1wSW5mby5ibWlIZWFkZXIuYmlI
ZWlnaHQsIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgYm1wSW5mby5ibWlIZWFkZXIuYmlXaWR0aCAqIDQsIGRldmljZVJHQiwgCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NHQml0
bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhhTm9uZVNraXBGaXJzdCk7CisgICAg
Q0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOworICAgIGlmICghYml0bWFwQ29udGV4dCkg
eworICAgICAgICBEZWxldGVPYmplY3QoaGJtcCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0K
KworICAgICp0YXJnZXRSZWYgPSBiaXRtYXBDb250ZXh0OworICAgIHJldHVybiBoYm1wOworfQor
CitzdGF0aWMgQ0dDb250ZXh0UmVmIGNyZWF0ZUNnQ29udGV4dEZyb21CaXRtYXAoSEJJVE1BUCBi
aXRtYXApCit7CisgICAgQklUTUFQIGluZm87CisgICAgR2V0T2JqZWN0KGJpdG1hcCwgc2l6ZW9m
KGluZm8pLCAmaW5mbyk7CisgICAgQVNTRVJUKGluZm8uYm1CaXRzUGl4ZWwgPT0gMzIpOworCisg
ICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJH
QigpOworICAgIENHQ29udGV4dFJlZiBiaXRtYXBDb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3Jl
YXRlKGluZm8uYm1CaXRzLCBpbmZvLmJtV2lkdGgsIGluZm8uYm1IZWlnaHQsIDgsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5ibVdp
ZHRoQnl0ZXMsIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBrQ0dJbWFn
ZUFscGhhTm9uZVNraXBGaXJzdCk7CisgICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0Ip
OworICAgIHJldHVybiBiaXRtYXBDb250ZXh0OworfQorCitEcmFnSW1hZ2VSZWYgc2NhbGVEcmFn
SW1hZ2UoRHJhZ0ltYWdlUmVmIGltYWdlLCBGbG9hdFNpemUgc2NhbGUpCit7CisgICAgLy8gRklY
TUU6IGR1ZSB0byB0aGUgd2F5IGRyYWcgaW1hZ2VzIGFyZSBkb25lIG9uIHdpbmRvd3Mgd2UgbmVl
ZCAKKyAgICAvLyB0byBwcmVwcm9jZXNzIHRoZSBhbHBoYSBjaGFubmVsIDxyZGFyOi8vcHJvYmxl
bS81MDE1OTQ2PgorCisgICAgaWYgKCFpbWFnZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgQ0dD
b250ZXh0UmVmIHRhcmdldENvbnRleHQ7CisgICAgQ0dDb250ZXh0UmVmIHNyY0NvbnRleHQ7Cisg
ICAgQ0dJbWFnZVJlZiBzcmNJbWFnZTsKKyAgICBJbnRTaXplIHNyY1NpemUgPSBkcmFnSW1hZ2VT
aXplKGltYWdlKTsKKyAgICBJbnRTaXplIGRzdFNpemUoKGludCkoc3JjU2l6ZS53aWR0aCgpICog
c2NhbGUud2lkdGgoKSksIChpbnQpKHNyY1NpemUuaGVpZ2h0KCkgKiBzY2FsZS5oZWlnaHQoKSkp
OworICAgIEhCSVRNQVAgaGJtcCA9IDA7CisgICAgSERDIGRjID0gR2V0REMoMCk7CisgICAgSERD
IGRzdERDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGRjKTsKKyAgICBpZiAoIWRzdERDKQorICAgICAg
ICBnb3RvIGV4aXQ7CisKKyAgICBoYm1wID0gYWxsb2NJbWFnZShkc3REQywgZHN0U2l6ZSwgJnRh
cmdldENvbnRleHQpOworICAgIGlmICghaGJtcCkKKyAgICAgICAgZ290byBleGl0OworCisgICAg
c3JjQ29udGV4dCA9IGNyZWF0ZUNnQ29udGV4dEZyb21CaXRtYXAoaW1hZ2UpOworICAgIHNyY0lt
YWdlID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlSW1hZ2Uoc3JjQ29udGV4dCk7CisgICAgQ0dSZWN0
IHJlY3Q7CisgICAgcmVjdC5vcmlnaW4ueCA9IDA7CisgICAgcmVjdC5vcmlnaW4ueSA9IDA7Cisg
ICAgcmVjdC5zaXplID0gZHN0U2l6ZTsKKyAgICBDR0NvbnRleHREcmF3SW1hZ2UodGFyZ2V0Q29u
dGV4dCwgcmVjdCwgc3JjSW1hZ2UpOworICAgIENHSW1hZ2VSZWxlYXNlKHNyY0ltYWdlKTsKKyAg
ICBDR0NvbnRleHRSZWxlYXNlKHNyY0NvbnRleHQpOworICAgIENHQ29udGV4dFJlbGVhc2UodGFy
Z2V0Q29udGV4dCk7CisgICAgOjpEZWxldGVPYmplY3QoaW1hZ2UpOworICAgIGltYWdlID0gMDsK
KworZXhpdDoKKyAgICBpZiAoIWhibXApCisgICAgICAgIGhibXAgPSBpbWFnZTsKKyAgICBpZiAo
ZHN0REMpCisgICAgICAgIERlbGV0ZURDKGRzdERDKTsKKyAgICBSZWxlYXNlREMoMCwgZGMpOwor
ICAgIHJldHVybiBoYm1wOworfQorICAgIAorRHJhZ0ltYWdlUmVmIGRpc3NvbHZlRHJhZ0ltYWdl
VG9GcmFjdGlvbihEcmFnSW1hZ2VSZWYgaW1hZ2UsIGZsb2F0KQoreworICAgIC8vV2UgZG9uJ3Qg
ZG8gdGhpcyBvbiB3aW5kb3dzIGFzIHRoZSBkcmFnaW1hZ2UgaXMgYmxlbmRlZCBieSB0aGUgT1MK
KyAgICByZXR1cm4gaW1hZ2U7Cit9CisgICAgICAgIAorRHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJ
bWFnZUZyb21JbWFnZShJbWFnZSogaW1nKQoreyAgICAKKyAgICBIQklUTUFQIGhibXAgPSAwOwor
ICAgIEhEQyBkYyA9IEdldERDKDApOworICAgIEhEQyB3b3JraW5nREMgPSBDcmVhdGVDb21wYXRp
YmxlREMoZGMpOworICAgIENHQ29udGV4dFJlZiBkcmF3Q29udGV4dCA9IDA7CisgICAgaWYgKCF3
b3JraW5nREMpCisgICAgICAgIGdvdG8gZXhpdDsKKworICAgIGhibXAgPSBhbGxvY0ltYWdlKHdv
cmtpbmdEQywgaW1nLT5zaXplKCksICZkcmF3Q29udGV4dCk7CisKKyAgICBpZiAoIWhibXApCisg
ICAgICAgIGdvdG8gZXhpdDsKKworICAgIGlmICghZHJhd0NvbnRleHQpIHsKKyAgICAgICAgOjpE
ZWxldGVPYmplY3QoaGJtcCk7CisgICAgICAgIGhibXAgPSAwOworICAgIH0KKworICAgIENHSW1h
Z2VSZWYgc3JjSW1hZ2UgPSBpbWctPmdldENHSW1hZ2VSZWYoKTsKKyAgICBDR1JlY3QgcmVjdDsK
KyAgICByZWN0LnNpemUgPSBpbWctPnNpemUoKTsKKyAgICByZWN0Lm9yaWdpbi54ID0gMDsKKyAg
ICByZWN0Lm9yaWdpbi55ID0gLXJlY3Quc2l6ZS5oZWlnaHQ7CisgICAgc3RhdGljIGNvbnN0IENH
RmxvYXQgd2hpdGUgW10gPSB7MS4wLCAxLjAsIDEuMCwgMS4wfTsKKyAgICBDR0NvbnRleHRTY2Fs
ZUNUTShkcmF3Q29udGV4dCwgMSwgLTEpOworICAgIENHQ29udGV4dFNldEZpbGxDb2xvcihkcmF3
Q29udGV4dCwgd2hpdGUpOworICAgIENHQ29udGV4dEZpbGxSZWN0KGRyYXdDb250ZXh0LCByZWN0
KTsKKyAgICBDR0NvbnRleHRTZXRCbGVuZE1vZGUoZHJhd0NvbnRleHQsIGtDR0JsZW5kTW9kZU5v
cm1hbCk7CisgICAgQ0dDb250ZXh0RHJhd0ltYWdlKGRyYXdDb250ZXh0LCByZWN0LCBzcmNJbWFn
ZSk7CisgICAgQ0dDb250ZXh0UmVsZWFzZShkcmF3Q29udGV4dCk7CisKK2V4aXQ6CisgICAgaWYg
KHdvcmtpbmdEQykKKyAgICAgICAgRGVsZXRlREMod29ya2luZ0RDKTsKKyAgICBSZWxlYXNlREMo
MCwgZGMpOworICAgIHJldHVybiBoYm1wOworfQorICAgIAorRHJhZ0ltYWdlUmVmIGNyZWF0ZURy
YWdJbWFnZUljb25Gb3JDYWNoZWRJbWFnZShDYWNoZWRJbWFnZSopCit7CisgICAgLy9GSVhNRTog
UHJvdmlkZSBpY29uIGZvciBpbWFnZSB0eXBlIDxyZGFyOi8vcHJvYmxlbS81MDE1OTQ5PgorICAg
IHJldHVybiAwOyAgICAgCit9CisgICAgCit9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbi9E
cmFnSW1hZ2VDR1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJh
Z0ltYWdlQ0dXaW4uY3BwCShyZXZpc2lvbiAyOTcyNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2lu
L0RyYWdJbWFnZUNHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0g
KiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
IENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVk
LgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0zNywyMSArMzcsNiBAQAogCiBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAKLUludFNpemUgZHJhZ0ltYWdlU2l6ZShEcmFnSW1hZ2VSZWYg
aW1hZ2UpCi17Ci0gICAgaWYgKCFpbWFnZSkKLSAgICAgICAgcmV0dXJuIEludFNpemUoKTsKLSAg
ICBCSVRNQVAgYjsKLSAgICBHZXRPYmplY3QoaW1hZ2UsIHNpemVvZihCSVRNQVApLCAmYik7Ci0g
ICAgcmV0dXJuIEludFNpemUoYi5ibVdpZHRoLCBiLmJtSGVpZ2h0KTsKLX0KLQotdm9pZCBkZWxl
dGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVmIGltYWdlKQotewotICAgIGlmIChpbWFnZSkKLSAgICAg
ICAgOjpEZWxldGVPYmplY3QoaW1hZ2UpOwotfQotCiBIQklUTUFQIGFsbG9jSW1hZ2UoSERDIGRj
LCBJbnRTaXplIHNpemUsIENHQ29udGV4dFJlZiAqdGFyZ2V0UmVmKQogewogICAgIEhCSVRNQVAg
aGJtcDsKQEAgLTEzOSwxNCArMTI0LDggQEAgZXhpdDoKICAgICByZXR1cm4gaGJtcDsKIH0KICAg
ICAKLURyYWdJbWFnZVJlZiBkaXNzb2x2ZURyYWdJbWFnZVRvRnJhY3Rpb24oRHJhZ0ltYWdlUmVm
IGltYWdlLCBmbG9hdCkKLXsKLSAgICAvL1dlIGRvbid0IGRvIHRoaXMgb24gd2luZG93cyBhcyB0
aGUgZHJhZ2ltYWdlIGlzIGJsZW5kZWQgYnkgdGhlIE9TCi0gICAgcmV0dXJuIGltYWdlOwotfQot
ICAgICAgICAKIERyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2UoSW1hZ2UqIGlt
ZykKLXsgICAgCit7CiAgICAgSEJJVE1BUCBoYm1wID0gMDsKICAgICBIREMgZGMgPSBHZXREQygw
KTsKICAgICBIREMgd29ya2luZ0RDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGRjKTsKQEAgLTE4NCwx
MCArMTYzLDQgQEAgZXhpdDoKICAgICByZXR1cm4gaGJtcDsKIH0KICAgICAKLURyYWdJbWFnZVJl
ZiBjcmVhdGVEcmFnSW1hZ2VJY29uRm9yQ2FjaGVkSW1hZ2UoQ2FjaGVkSW1hZ2UqKQotewotICAg
IC8vRklYTUU6IFByb3ZpZGUgaWNvbiBmb3IgaW1hZ2UgdHlwZSA8cmRhcjovL3Byb2JsZW0vNTAx
NTk0OT4KLSAgICByZXR1cm4gMDsgICAgIAotfQotICAgIAogfQpJbmRleDogV2ViQ29yZS9wbGF0
Zm9ybS93aW4vRHJhZ0ltYWdlQ2Fpcm9XaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxh
dGZvcm0vd2luL0RyYWdJbWFnZUNhaXJvV2luLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUv
cGxhdGZvcm0vd2luL0RyYWdJbWFnZUNhaXJvV2luLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCAr
MSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBcHBsZSBJbmMuICBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRHJhZ0lt
YWdlLmgiCisKKyNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29u
dGV4dC5oIgorI2luY2x1ZGUgIkltYWdlLmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIK
KyNpbmNsdWRlICJSZXRhaW5QdHIuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitEcmFnSW1hZ2VSZWYgc2NhbGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVm
IGltYWdlLCBGbG9hdFNpemUgc2NhbGUpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKworICAg
IHJldHVybiBpbWFnZTsKK30KKyAgICAKK0RyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VGcm9t
SW1hZ2UoSW1hZ2UqIGltZykKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworCisgICAgRHJhZ0lt
YWdlUmVmIHRlbXA7CisgICAgcmV0dXJuIHRlbXA7Cit9CisgICAgCit9CkluZGV4OiBXZWJDb3Jl
L3BsYXRmb3JtL3dpbi9EcmFnSW1hZ2VXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxh
dGZvcm0vd2luL0RyYWdJbWFnZVdpbi5jcHAJKHJldmlzaW9uIDI5ODM0KQorKysgV2ViQ29yZS9w
bGF0Zm9ybS93aW4vRHJhZ0ltYWdlV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUg
QEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBBcHBsZSBJbmMuICBBbGwgcmlnaHRz
IHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0zMSw4ICszMSw2
IEBACiAjaW5jbHVkZSAiSW1hZ2UuaCIKICNpbmNsdWRlICJSZXRhaW5QdHIuaCIKIAotI2luY2x1
ZGUgPENvcmVHcmFwaGljcy9Db3JlR3JhcGhpY3MuaD4KLQogI2luY2x1ZGUgPHdpbmRvd3MuaD4K
IAogbmFtZXNwYWNlIFdlYkNvcmUgewpAQCAtNTIsMTM4ICs1MCwxMiBAQCB2b2lkIGRlbGV0ZURy
YWdJbWFnZShEcmFnSW1hZ2VSZWYgaW1hZ2UpCiAgICAgICAgIDo6RGVsZXRlT2JqZWN0KGltYWdl
KTsKIH0KIAotSEJJVE1BUCBhbGxvY0ltYWdlKEhEQyBkYywgSW50U2l6ZSBzaXplLCBDR0NvbnRl
eHRSZWYgKnRhcmdldFJlZikKLXsKLSAgICBIQklUTUFQIGhibXA7Ci0gICAgQklUTUFQSU5GTyBi
bXBJbmZvID0gezB9OwotICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpU2l6ZSA9IHNpemVvZihCSVRN
QVBJTkZPSEVBREVSKTsKLSAgICBibXBJbmZvLmJtaUhlYWRlci5iaVdpZHRoID0gc2l6ZS53aWR0
aCgpOwotICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpSGVpZ2h0ID0gc2l6ZS5oZWlnaHQoKTsKLSAg
ICBibXBJbmZvLmJtaUhlYWRlci5iaVBsYW5lcyA9IDE7Ci0gICAgYm1wSW5mby5ibWlIZWFkZXIu
YmlCaXRDb3VudCA9IDMyOwotICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpQ29tcHJlc3Npb24gPSBC
SV9SR0I7Ci0gICAgTFBWT0lEIGJpdHM7Ci0gICAgaGJtcCA9IENyZWF0ZURJQlNlY3Rpb24oZGMs
ICZibXBJbmZvLCBESUJfUkdCX0NPTE9SUywgJmJpdHMsIDAsIDApOwotCi0gICAgaWYgKCF0YXJn
ZXRSZWYpCi0gICAgICAgIHJldHVybiBoYm1wOwotCi0gICAgQ0dDb2xvclNwYWNlUmVmIGRldmlj
ZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwotICAgIENHQ29udGV4dFJlZiBi
aXRtYXBDb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGJpdHMsIGJtcEluZm8uYm1pSGVh
ZGVyLmJpV2lkdGgsIGJtcEluZm8uYm1pSGVhZGVyLmJpSGVpZ2h0LCA4LAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcEluZm8uYm1pSGVh
ZGVyLmJpV2lkdGggKiA0LCBkZXZpY2VSR0IsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwg
a0NHSW1hZ2VBbHBoYU5vbmVTa2lwRmlyc3QpOwotICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2
aWNlUkdCKTsKLSAgICBpZiAoIWJpdG1hcENvbnRleHQpIHsKLSAgICAgICAgRGVsZXRlT2JqZWN0
KGhibXApOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAqdGFyZ2V0UmVmID0gYml0
bWFwQ29udGV4dDsKLSAgICByZXR1cm4gaGJtcDsKLX0KLQotc3RhdGljIENHQ29udGV4dFJlZiBj
cmVhdGVDZ0NvbnRleHRGcm9tQml0bWFwKEhCSVRNQVAgYml0bWFwKQotewotICAgIEJJVE1BUCBp
bmZvOwotICAgIEdldE9iamVjdChiaXRtYXAsIHNpemVvZihpbmZvKSwgJmluZm8pOwotICAgIEFT
U0VSVChpbmZvLmJtQml0c1BpeGVsID09IDMyKTsKLQotICAgIENHQ29sb3JTcGFjZVJlZiBkZXZp
Y2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKLSAgICBDR0NvbnRleHRSZWYg
Yml0bWFwQ29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZShpbmZvLmJtQml0cywgaW5mby5i
bVdpZHRoLCBpbmZvLmJtSGVpZ2h0LCA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uYm1XaWR0aEJ5dGVzLCBkZXZpY2VSR0IsIGtD
R0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwga0NHSW1hZ2VBbHBoYU5vbmVTa2lwRmlyc3QpOwot
ICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKLSAgICByZXR1cm4gYml0bWFwQ29u
dGV4dDsKLX0KLQotRHJhZ0ltYWdlUmVmIHNjYWxlRHJhZ0ltYWdlKERyYWdJbWFnZVJlZiBpbWFn
ZSwgRmxvYXRTaXplIHNjYWxlKQotewotICAgIC8vIEZJWE1FOiBkdWUgdG8gdGhlIHdheSBkcmFn
IGltYWdlcyBhcmUgZG9uZSBvbiB3aW5kb3dzIHdlIG5lZWQgCi0gICAgLy8gdG8gcHJlcHJvY2Vz
cyB0aGUgYWxwaGEgY2hhbm5lbCA8cmRhcjovL3Byb2JsZW0vNTAxNTk0Nj4KLQotICAgIGlmICgh
aW1hZ2UpCi0gICAgICAgIHJldHVybiAwOwotICAgIENHQ29udGV4dFJlZiB0YXJnZXRDb250ZXh0
OwotICAgIENHQ29udGV4dFJlZiBzcmNDb250ZXh0OwotICAgIENHSW1hZ2VSZWYgc3JjSW1hZ2U7
Ci0gICAgSW50U2l6ZSBzcmNTaXplID0gZHJhZ0ltYWdlU2l6ZShpbWFnZSk7Ci0gICAgSW50U2l6
ZSBkc3RTaXplKChpbnQpKHNyY1NpemUud2lkdGgoKSAqIHNjYWxlLndpZHRoKCkpLCAoaW50KShz
cmNTaXplLmhlaWdodCgpICogc2NhbGUuaGVpZ2h0KCkpKTsKLSAgICBIQklUTUFQIGhibXAgPSAw
OwotICAgIEhEQyBkYyA9IEdldERDKDApOwotICAgIEhEQyBkc3REQyA9IENyZWF0ZUNvbXBhdGli
bGVEQyhkYyk7Ci0gICAgaWYgKCFkc3REQykKLSAgICAgICAgZ290byBleGl0OwotCi0gICAgaGJt
cCA9IGFsbG9jSW1hZ2UoZHN0REMsIGRzdFNpemUsICZ0YXJnZXRDb250ZXh0KTsKLSAgICBpZiAo
IWhibXApCi0gICAgICAgIGdvdG8gZXhpdDsKLQotICAgIHNyY0NvbnRleHQgPSBjcmVhdGVDZ0Nv
bnRleHRGcm9tQml0bWFwKGltYWdlKTsKLSAgICBzcmNJbWFnZSA9IENHQml0bWFwQ29udGV4dENy
ZWF0ZUltYWdlKHNyY0NvbnRleHQpOwotICAgIENHUmVjdCByZWN0OwotICAgIHJlY3Qub3JpZ2lu
LnggPSAwOwotICAgIHJlY3Qub3JpZ2luLnkgPSAwOwotICAgIHJlY3Quc2l6ZSA9IGRzdFNpemU7
Ci0gICAgQ0dDb250ZXh0RHJhd0ltYWdlKHRhcmdldENvbnRleHQsIHJlY3QsIHNyY0ltYWdlKTsK
LSAgICBDR0ltYWdlUmVsZWFzZShzcmNJbWFnZSk7Ci0gICAgQ0dDb250ZXh0UmVsZWFzZShzcmND
b250ZXh0KTsKLSAgICBDR0NvbnRleHRSZWxlYXNlKHRhcmdldENvbnRleHQpOwotICAgIDo6RGVs
ZXRlT2JqZWN0KGltYWdlKTsKLSAgICBpbWFnZSA9IDA7Ci0KLWV4aXQ6Ci0gICAgaWYgKCFoYm1w
KQotICAgICAgICBoYm1wID0gaW1hZ2U7Ci0gICAgaWYgKGRzdERDKQotICAgICAgICBEZWxldGVE
Qyhkc3REQyk7Ci0gICAgUmVsZWFzZURDKDAsIGRjKTsKLSAgICByZXR1cm4gaGJtcDsKLX0KLSAg
ICAKIERyYWdJbWFnZVJlZiBkaXNzb2x2ZURyYWdJbWFnZVRvRnJhY3Rpb24oRHJhZ0ltYWdlUmVm
IGltYWdlLCBmbG9hdCkKIHsKICAgICAvL1dlIGRvbid0IGRvIHRoaXMgb24gd2luZG93cyBhcyB0
aGUgZHJhZ2ltYWdlIGlzIGJsZW5kZWQgYnkgdGhlIE9TCiAgICAgcmV0dXJuIGltYWdlOwogfQog
ICAgICAgICAKLURyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2UoSW1hZ2UqIGlt
ZykKLXsgICAgCi0gICAgSEJJVE1BUCBoYm1wID0gMDsKLSAgICBIREMgZGMgPSBHZXREQygwKTsK
LSAgICBIREMgd29ya2luZ0RDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGRjKTsKLSAgICBDR0NvbnRl
eHRSZWYgZHJhd0NvbnRleHQgPSAwOwotICAgIGlmICghd29ya2luZ0RDKQotICAgICAgICBnb3Rv
IGV4aXQ7Ci0KLSAgICBoYm1wID0gYWxsb2NJbWFnZSh3b3JraW5nREMsIGltZy0+c2l6ZSgpLCAm
ZHJhd0NvbnRleHQpOwotCi0gICAgaWYgKCFoYm1wKQotICAgICAgICBnb3RvIGV4aXQ7Ci0KLSAg
ICBpZiAoIWRyYXdDb250ZXh0KSB7Ci0gICAgICAgIDo6RGVsZXRlT2JqZWN0KGhibXApOwotICAg
ICAgICBoYm1wID0gMDsKLSAgICB9Ci0KLSAgICBDR0ltYWdlUmVmIHNyY0ltYWdlID0gaW1nLT5n
ZXRDR0ltYWdlUmVmKCk7Ci0gICAgQ0dSZWN0IHJlY3Q7Ci0gICAgcmVjdC5zaXplID0gaW1nLT5z
aXplKCk7Ci0gICAgcmVjdC5vcmlnaW4ueCA9IDA7Ci0gICAgcmVjdC5vcmlnaW4ueSA9IC1yZWN0
LnNpemUuaGVpZ2h0OwotICAgIHN0YXRpYyBjb25zdCBDR0Zsb2F0IHdoaXRlIFtdID0gezEuMCwg
MS4wLCAxLjAsIDEuMH07Ci0gICAgQ0dDb250ZXh0U2NhbGVDVE0oZHJhd0NvbnRleHQsIDEsIC0x
KTsKLSAgICBDR0NvbnRleHRTZXRGaWxsQ29sb3IoZHJhd0NvbnRleHQsIHdoaXRlKTsKLSAgICBD
R0NvbnRleHRGaWxsUmVjdChkcmF3Q29udGV4dCwgcmVjdCk7Ci0gICAgQ0dDb250ZXh0U2V0Qmxl
bmRNb2RlKGRyYXdDb250ZXh0LCBrQ0dCbGVuZE1vZGVOb3JtYWwpOwotICAgIENHQ29udGV4dERy
YXdJbWFnZShkcmF3Q29udGV4dCwgcmVjdCwgc3JjSW1hZ2UpOwotICAgIENHQ29udGV4dFJlbGVh
c2UoZHJhd0NvbnRleHQpOwotCi1leGl0OgotICAgIGlmICh3b3JraW5nREMpCi0gICAgICAgIERl
bGV0ZURDKHdvcmtpbmdEQyk7Ci0gICAgUmVsZWFzZURDKDAsIGRjKTsKLSAgICByZXR1cm4gaGJt
cDsKLX0KLSAgICAKIERyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VJY29uRm9yQ2FjaGVkSW1h
Z2UoQ2FjaGVkSW1hZ2UqKQogewogICAgIC8vRklYTUU6IFByb3ZpZGUgaWNvbiBmb3IgaW1hZ2Ug
dHlwZSA8cmRhcjovL3Byb2JsZW0vNTAxNTk0OT4K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>18768</attachid>
            <date>2008-01-29 12:27:09 -0800</date>
            <delta_ts>2008-01-30 17:52:51 -0800</delta_ts>
            <desc>Fifth revision based on Eric&apos;s comments</desc>
            <filename>webcore-win32Cairo.patch</filename>
            <type>text/plain</type>
            <size>146430</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyOTg0NykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNzQgQEAKKzIwMDgtMDEtMjkgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBnbWFp
bC5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
Rmlyc3Qgc3RlcCB0b3dhcmRzIHJlZW5hYmxpbmcgQ2Fpcm8gc3VwcG9ydCB1bmRlciBXaW5kb3dz
LgorICAgICAgICAtIGFkZHMgdmFyaW91cyBQTEFURk9STSBndWFyZHMgdG8gY29kZSB0aGF0IHdp
bGwgbm90IGJ1aWxkCisgICAgICAgICAgdW5kZXIgQ2Fpcm8uCisgICAgICAgIC0gYnJlYWtzIHNv
bWUgZmlsZXMgaW50byBDRyBhbmQgQ2Fpcm8tc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zLgorICAg
ICAgICAtIHByb3ZpZGVzIHNvbWUgd2luMzIvQ2Fpcm8gc3VwcG9ydCAoYnV0IGJ5IG5vIG1lYW5z
IGEgY29tcGxldGUKKyAgICAgICAgICBwb3J0IC0tIHlldCkuCisKKyAgICAgICAgV0FSTklORzog
Tk8gVEVTVCBDQVNFUyBBRERFRCBPUiBDSEFOR0VECisKKyAgICAgICAgKiBXZWJDb3JlLnZjcHJv
ai9XZWJDb3JlLnZjcHJvajoKKyAgICAgICAgKiBicmlkZ2Uvd2luL0ZyYW1lQ0dXaW4uY3BwOiBD
b3BpZWQgZnJvbSBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVXaW4uY3BwLgorICAgICAgICAoV2Vi
Q29yZTo6aW1hZ2VGcm9tU2VsZWN0aW9uKToKKyAgICAgICAgKiBicmlkZ2Uvd2luL0ZyYW1lQ2Fp
cm9XaW4uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OmltYWdlRnJvbVNlbGVjdGlvbik6
CisgICAgICAgICogYnJpZGdlL3dpbi9GcmFtZVdpbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpj
b21wdXRlUGFnZVJlY3RzRm9yRnJhbWUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL1Np
bXBsZUZvbnREYXRhLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDR1dp
bi5jcHA6IENvcGllZCBmcm9tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRXaW4u
Y3BwLgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZHJhd0dseXBocyk6CisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDYWlyb1dpbi5jcHA6IEFkZGVkLgorICAgICAgICAoV2Vi
Q29yZTo6Rm9udDo6ZHJhd0dseXBocyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0ZvbnRXaW4uY3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0Nv
bnRleHRDR1dpbi5jcHA6IENvcGllZCBmcm9tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0dyYXBoaWNzQ29udGV4dFdpbi5jcHAuCisgICAgICAgIChXZWJDb3JlOjpDR0NvbnRleHRXaXRo
SERDKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6Z2V0V2luZG93c0NvbnRl
eHQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpyZWxlYXNlV2luZG93c0Nv
bnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRl
Ojpjb25jYXRDVE0pOgorICAgICAgICAoV2ViQ29yZTo6c2V0Q0dTdHJva2VDb2xvcik6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yTWlzc3BlbGxpbmdPckJh
ZEdyYW1tYXIpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRl
eHRDYWlyb1dpbi5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
OjpHcmFwaGljc0NvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0Ojpn
ZXRXaW5kb3dzQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6Omlu
VHJhbnNwYXJlbmN5TGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0Ojpy
ZWxlYXNlV2luZG93c0NvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlOjpjb25jYXRDVE0pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0OjpkcmF3Rm9jdXNSaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dDo6ZHJhd0xpbmVGb3JNaXNzcGVsbGluZ09yQmFkR3JhbW1hcik6CisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dFdpbi5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnNjYWxlKToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6cm90YXRlKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6dHJhbnNsYXRlKToKKyAgICAg
ICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VDR1dpbi5jcHA6IENvcGllZCBmcm9tIFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlV2luLmNwcC4KKyAgICAgICAgKFdlYkNv
cmU6OkJpdG1hcEltYWdlOjpnZXRIQklUTUFQT2ZTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkJp
dG1hcEltYWdlOjpkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUpOgorICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL3dpbi9JbWFnZUNhaXJvV2luLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJD
b3JlOjpCaXRtYXBJbWFnZTo6Z2V0SEJJVE1BUE9mU2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpC
aXRtYXBJbWFnZTo6ZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXplKToKKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VXaW4uY3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBo
aWNzL3dpbi9TaW1wbGVGb250RGF0YUNHV2luLmNwcDogQ29waWVkIGZyb20gV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERhdGFXaW4uY3BwLgorICAgICAgICAoV2ViQ29y
ZTo6c2NhbGVFbVRvVW5pdHMpOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnBs
YXRmb3JtSW5pdCk6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1X
aWR0aEZvckdseXBoKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9u
dERhdGFDYWlyb1dpbi5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERh
dGE6OnBsYXRmb3JtSW5pdCk6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxh
dGZvcm1EZXN0cm95KToKKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0Zm9y
bVdpZHRoRm9yR2x5cGgpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVG
b250RGF0YVdpbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6c2V0U2hv
dWxkQXBwbHlNYWNBc2NlbnRIYWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRh
OjpzaG91bGRBcHBseU1hY0FzY2VudEhhY2spOgorICAgICAgICAqIHBsYXRmb3JtL3dpbi9EcmFn
SW1hZ2VDR1dpbi5jcHA6IENvcGllZCBmcm9tIFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFn
ZVdpbi5jcHAuCisgICAgICAgIChXZWJDb3JlOjpzY2FsZURyYWdJbWFnZSk6CisgICAgICAgIChX
ZWJDb3JlOjpjcmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2UpOgorICAgICAgICAqIHBsYXRmb3JtL3dp
bi9EcmFnSW1hZ2VDYWlyb1dpbi5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6c2NhbGVE
cmFnSW1hZ2UpOgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRlRHJhZ0ltYWdlRnJvbUltYWdlKToK
KyAgICAgICAgKiBwbGF0Zm9ybS93aW4vRHJhZ0ltYWdlV2luLmNwcDoKKwogMjAwOC0wMS0yOSAg
QWRhbSBSb2JlbiAgPGFyb2JlbkBhcHBsZS5jb20+CiAKICAgICAgICAgRml4IDxyZGFyOi8vNTcx
MTEzNj4gRnVsbC1zY3JlZW4gRmxhc2ggb24gMXVwLmNvbSBpcyB1bnJlc3BvbnNpdmUKSW5kZXg6
IFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagkocmV2aXNpb24gMjk3MjYpCisrKyBX
ZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC0z
NDE4LDYgKzM0MTgsMTAgQEAKIAkJCQkJPg0KIAkJCQk8L0ZpbGU+DQogCQkJCTxGaWxlDQorCQkJ
CQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXHdpblxEcmFnSW1hZ2VDR1dpbi5jcHAiDQorCQkJ
CQk+DQorCQkJCTwvRmlsZT4NCisJCQkJPEZpbGUNCiAJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxh
dGZvcm1cd2luXERyYWdJbWFnZVdpbi5jcHAiDQogCQkJCQk+DQogCQkJCTwvRmlsZT4NCkBAIC0z
ODc2LDYgKzM4ODAsMTAgQEAKIAkJCQkJCT4NCiAJCQkJCTwvRmlsZT4NCiAJCQkJCTxGaWxlDQor
CQkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1x3aW5cRm9udENHV2luLmNw
cCINCisJCQkJCQk+DQorCQkJCQk8L0ZpbGU+DQorCQkJCQk8RmlsZQ0KIAkJCQkJCVJlbGF0aXZl
UGF0aD0iLi5ccGxhdGZvcm1cZ3JhcGhpY3Ncd2luXEZvbnRDdXN0b21QbGF0Zm9ybURhdGEuY3Bw
Ig0KIAkJCQkJCT4NCiAJCQkJCTwvRmlsZT4NCkBAIC0zOTMyLDYgKzM5NDAsMTAgQEAKIAkJCQkJ
CT4NCiAJCQkJCTwvRmlsZT4NCiAJCQkJCTxGaWxlDQorCQkJCQkJUmVsYXRpdmVQYXRoPSIuLlxw
bGF0Zm9ybVxncmFwaGljc1x3aW5cR3JhcGhpY3NDb250ZXh0Q0dXaW4uY3BwIg0KKwkJCQkJCT4N
CisJCQkJCTwvRmlsZT4NCisJCQkJCTxGaWxlDQogCQkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0
Zm9ybVxncmFwaGljc1x3aW5cR3JhcGhpY3NDb250ZXh0V2luLmNwcCINCiAJCQkJCQk+DQogCQkJ
CQk8L0ZpbGU+DQpAQCAtMzk0MCw2ICszOTUyLDEwIEBACiAJCQkJCQk+DQogCQkJCQk8L0ZpbGU+
DQogCQkJCQk8RmlsZQ0KKwkJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cZ3JhcGhpY3Nc
d2luXEltYWdlQ0dXaW4uY3BwIg0KKwkJCQkJCT4NCisJCQkJCTwvRmlsZT4NCisJCQkJCTxGaWxl
DQogCQkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1x3aW5cSW1hZ2VXaW4u
Y3BwIg0KIAkJCQkJCT4NCiAJCQkJCTwvRmlsZT4NCkBAIC0zOTY0LDYgKzM5ODAsMTAgQEAKIAkJ
CQkJCT4NCiAJCQkJCTwvRmlsZT4NCiAJCQkJCTxGaWxlDQorCQkJCQkJUmVsYXRpdmVQYXRoPSIu
LlxwbGF0Zm9ybVxncmFwaGljc1x3aW5cU2ltcGxlRm9udERhdGFDR1dpbi5jcHAiDQorCQkJCQkJ
Pg0KKwkJCQkJPC9GaWxlPg0KKwkJCQkJPEZpbGUNCiAJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBs
YXRmb3JtXGdyYXBoaWNzXHdpblxTaW1wbGVGb250RGF0YVdpbi5jcHAiDQogCQkJCQkJPg0KIAkJ
CQkJPC9GaWxlPg0KQEAgLTY0MDgsNiArNjQyOCwxMCBAQAogCQkJCU5hbWU9IndpbiINCiAJCQkJ
Pg0KIAkJCQk8RmlsZQ0KKwkJCQkJUmVsYXRpdmVQYXRoPSIuLlxicmlkZ2Vcd2luXEZyYW1lQ0dX
aW4uY3BwIg0KKwkJCQkJPg0KKwkJCQk8L0ZpbGU+DQorCQkJCTxGaWxlDQogCQkJCQlSZWxhdGl2
ZVBhdGg9Ii4uXGJyaWRnZVx3aW5cRnJhbWVXaW4uY3BwIg0KIAkJCQkJPg0KIAkJCQk8L0ZpbGU+
DQpJbmRleDogV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lQ0dXaW4uY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZUNHV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCShmcm9t
IFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZVdpbi5jcHA6Mjk4MzQpCisrKyBXZWJDb3JlL2JyaWRn
ZS93aW4vRnJhbWVDR1dpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxOTcgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
Q09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBD
T01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRnJhbWVXaW4uaCIK
KworI2luY2x1ZGUgPHdpbnNvY2syLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjaW5jbHVk
ZSAiQWZmaW5lVHJhbnNmb3JtLmgiCisjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVkZSAi
RG9jdW1lbnQuaCIKKyNpbmNsdWRlICJFZGl0b3JDbGllbnQuaCIKKyNpbmNsdWRlICJGcmFtZUxv
YWRlci5oIgorI2luY2x1ZGUgIkZyYW1lTG9hZFJlcXVlc3QuaCIKKyNpbmNsdWRlICJGcmFtZVBy
aXZhdGUuaCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJIVE1MSUZyYW1lRWxl
bWVudC5oIgorI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgorI2luY2x1ZGUgIkhUTUxUYWJsZUNlbGxF
bGVtZW50LmgiCisjaW5jbHVkZSAiS2V5Ym9hcmRFdmVudC5oIgorI2luY2x1ZGUgIk5QX2pzb2Jq
ZWN0LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisj
aW5jbHVkZSAiUGx1Z2luLmgiCisjaW5jbHVkZSAiUGx1Z2luRGF0YWJhc2VXaW4uaCIKKyNpbmNs
dWRlICJQbHVnaW5WaWV3V2luLmgiCisjaW5jbHVkZSAiUmVndWxhckV4cHJlc3Npb24uaCIKKyNp
bmNsdWRlICJSZW5kZXJGcmFtZS5oIgorI2luY2x1ZGUgIlJlbmRlclRhYmxlQ2VsbC5oIgorI2lu
Y2x1ZGUgIlJlbmRlclZpZXcuaCIKKyNpbmNsdWRlICJSZXNvdXJjZUhhbmRsZS5oIgorI2luY2x1
ZGUgIlRleHRSZXNvdXJjZURlY29kZXIuaCIKKyNpbmNsdWRlICJranNfcHJveHkuaCIKKyNpbmNs
dWRlICJranNfd2luZG93LmgiCisjaW5jbHVkZSAibnBydW50aW1lX2ltcGwuaCIKKyNpbmNsdWRl
ICJydW50aW1lX3Jvb3QuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRl
ICJTZXR0aW5ncy5oIgorCisjaWYgUExBVEZPUk0oQ0cpCisjaW5jbHVkZSA8Q29yZUdyYXBoaWNz
L0NvcmVHcmFwaGljcy5oPgorI2VuZGlmCisKK3VzaW5nIHN0ZDo6bWluOwordXNpbmcgbmFtZXNw
YWNlIEtKUzo6QmluZGluZ3M7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordXNpbmcgbmFtZXNw
YWNlIEhUTUxOYW1lczsKKwordm9pZCBGcmFtZTo6Y2xlYXJQbGF0Zm9ybVNjcmlwdE9iamVjdHMo
KQoreworfQorCitLSlM6OkJpbmRpbmdzOjpJbnN0YW5jZSogRnJhbWU6OmNyZWF0ZVNjcmlwdElu
c3RhbmNlRm9yV2lkZ2V0KFdpZGdldCogd2lkZ2V0KQoreworICAgIC8vIEZJWE1FOiBJZGVhbGx5
IHdlJ2QgaGF2ZSBhbiBpc1BsdWdpblZpZXcoKSBoZXJlIGJ1dCB3ZSBjYW4ndCBhZGQgdGhhdCB0
byB0aGUgb3BlbiBzb3VyY2UgdHJlZSByaWdodCBub3cuCisgICAgaWYgKHdpZGdldC0+aXNGcmFt
ZVZpZXcoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UGx1
Z2luVmlld1dpbio+KHdpZGdldCktPmJpbmRpbmdJbnN0YW5jZSgpOworfQorCisKK3ZvaWQgY29t
cHV0ZVBhZ2VSZWN0c0ZvckZyYW1lKEZyYW1lKiBmcmFtZSwgY29uc3QgSW50UmVjdCYgcHJpbnRS
ZWN0LCBmbG9hdCBoZWFkZXJIZWlnaHQsIGZsb2F0IGZvb3RlckhlaWdodCwgZmxvYXQgdXNlclNj
YWxlRmFjdG9yLFZlY3RvcjxJbnRSZWN0PiYgcGFnZXMsIGludCYgb3V0UGFnZUhlaWdodCkKK3sK
KyAgICBBU1NFUlQoZnJhbWUpOworCisgICAgcGFnZXMuY2xlYXIoKTsKKyAgICBvdXRQYWdlSGVp
Z2h0ID0gMDsKKworICAgIGlmICghZnJhbWUtPmRvY3VtZW50KCkgfHwgIWZyYW1lLT52aWV3KCkg
fHwgIWZyYW1lLT5kb2N1bWVudCgpLT5yZW5kZXJlcigpKQorICAgICAgICByZXR1cm47CisgCisg
ICAgUmVuZGVyVmlldyogcm9vdCA9IHN0YXRpY19jYXN0PFJlbmRlclZpZXcgKj4oZnJhbWUtPmRv
Y3VtZW50KCktPnJlbmRlcmVyKCkpOworCisgICAgaWYgKCFyb290KSB7CisgICAgICAgIExPR19F
UlJPUigiZG9jdW1lbnQgdG8gYmUgcHJpbnRlZCBoYXMgbm8gcmVuZGVyZXIiKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIGlmICh1c2VyU2NhbGVGYWN0b3IgPD0gMCkgeworICAgICAg
ICBMT0dfRVJST1IoInVzZXJTY2FsZUZhY3RvciBoYXMgYmFkIHZhbHVlICUuMmYiLCB1c2VyU2Nh
bGVGYWN0b3IpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIGZsb2F0IHJhdGlv
ID0gKGZsb2F0KXByaW50UmVjdC5oZWlnaHQoKSAvIChmbG9hdClwcmludFJlY3Qud2lkdGgoKTsK
KyAKKyAgICBmbG9hdCBwYWdlV2lkdGggID0gKGZsb2F0KSByb290LT5kb2NXaWR0aCgpOworICAg
IGZsb2F0IHBhZ2VIZWlnaHQgPSBwYWdlV2lkdGggKiByYXRpbzsKKyAgICBvdXRQYWdlSGVpZ2h0
ID0gKGludCkgcGFnZUhlaWdodDsgICAvLyB0aGlzIGlzIHRoZSBoZWlnaHQgb2YgdGhlIHBhZ2Ug
YWRqdXN0ZWQgYnkgbWFyZ2lucworICAgIHBhZ2VIZWlnaHQgLT0gKGhlYWRlckhlaWdodCArIGZv
b3RlckhlaWdodCk7CisKKyAgICBpZiAocGFnZUhlaWdodCA8PSAwKSB7CisgICAgICAgIExPR19F
UlJPUigicGFnZUhlaWdodCBoYXMgYmFkIHZhbHVlICUuMmYiLCBwYWdlSGVpZ2h0KTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIGZsb2F0IGN1cnJQYWdlSGVpZ2h0ID0gcGFnZUhlaWdo
dCAvIHVzZXJTY2FsZUZhY3RvcjsKKyAgICBmbG9hdCBkb2NIZWlnaHQgICAgICA9IHJvb3QtPmxh
eWVyKCktPmhlaWdodCgpOworICAgIGZsb2F0IGRvY1dpZHRoICAgICAgID0gcm9vdC0+bGF5ZXIo
KS0+d2lkdGgoKTsKKyAgICBmbG9hdCBjdXJyUGFnZVdpZHRoICA9IHBhZ2VXaWR0aCAvIHVzZXJT
Y2FsZUZhY3RvcjsKKworICAgIAorICAgIC8vIGFsd2F5cyByZXR1cm4gYXQgbGVhc3Qgb25lIHBh
Z2UsIHNpbmNlIGVtcHR5IGZpbGVzIHNob3VsZCBwcmludCBhIGJsYW5rIHBhZ2UKKyAgICBmbG9h
dCBwcmludGVkUGFnZXNIZWlnaHQgPSAwLjA7CisgICAgZG8geworICAgICAgICBmbG9hdCBwcm9w
b3NlZEJvdHRvbSA9IG1pbihkb2NIZWlnaHQsIHByaW50ZWRQYWdlc0hlaWdodCArIHBhZ2VIZWln
aHQpOworICAgICAgICBmcmFtZS0+YWRqdXN0UGFnZUhlaWdodCgmcHJvcG9zZWRCb3R0b20sIHBy
aW50ZWRQYWdlc0hlaWdodCwgcHJvcG9zZWRCb3R0b20sIHByaW50ZWRQYWdlc0hlaWdodCk7Cisg
ICAgICAgIGN1cnJQYWdlSGVpZ2h0ID0gbWF4KDEuMGYsIHByb3Bvc2VkQm90dG9tIC0gcHJpbnRl
ZFBhZ2VzSGVpZ2h0KTsKKyAgICAgICAKKyAgICAgICAgcGFnZXMuYXBwZW5kKEludFJlY3QoMCxw
cmludGVkUGFnZXNIZWlnaHQsY3VyclBhZ2VXaWR0aCxjdXJyUGFnZUhlaWdodCkpOworICAgICAg
ICBwcmludGVkUGFnZXNIZWlnaHQgKz0gY3VyclBhZ2VIZWlnaHQ7CisgICAgfSB3aGlsZSAocHJp
bnRlZFBhZ2VzSGVpZ2h0IDwgZG9jSGVpZ2h0KTsKK30KKworc3RhdGljIHZvaWQgZHJhd1JlY3RJ
bnRvQ29udGV4dChJbnRSZWN0IHJlY3QsIEZyYW1lVmlldyogdmlldywgR3JhcGhpY3NDb250ZXh0
KiBnYykKK3sKKyAgICBJbnRTaXplIG9mZnNldCA9IHZpZXctPnNjcm9sbE9mZnNldCgpOworICAg
IHJlY3QubW92ZSgtb2Zmc2V0LndpZHRoKCksIC1vZmZzZXQuaGVpZ2h0KCkpOworICAgIHJlY3Qg
PSB2aWV3LT5jb252ZXJ0VG9Db250YWluaW5nV2luZG93KHJlY3QpOworCisgICAgZ2MtPmNvbmNh
dENUTShBZmZpbmVUcmFuc2Zvcm0oKS50cmFuc2xhdGUoLXJlY3QueCgpLCAtcmVjdC55KCkpKTsK
KworICAgIHZpZXctPnBhaW50KGdjLCByZWN0KTsKK30KKworSEJJVE1BUCBpbWFnZUZyb21TZWxl
Y3Rpb24oRnJhbWUqIGZyYW1lLCBib29sIGZvcmNlQmxhY2tUZXh0KQoreworICAgIGZyYW1lLT5z
ZXRQYWludFJlc3RyaWN0aW9uKGZvcmNlQmxhY2tUZXh0ID8gUGFpbnRSZXN0cmljdGlvblNlbGVj
dGlvbk9ubHlCbGFja1RleHQgOiBQYWludFJlc3RyaWN0aW9uU2VsZWN0aW9uT25seSk7CisgICAg
RmxvYXRSZWN0IGZyID0gZnJhbWUtPnNlbGVjdGlvblJlY3QoKTsKKyAgICBJbnRSZWN0IGlyKChp
bnQpZnIueCgpLCAoaW50KWZyLnkoKSwoaW50KWZyLndpZHRoKCksKGludClmci5oZWlnaHQoKSk7
CisKKyAgICB2b2lkKiBiaXRzOworICAgIEhEQyBoZGMgPSBDcmVhdGVDb21wYXRpYmxlREMoMCk7
CisgICAgaW50IHcgPSBpci53aWR0aCgpOworICAgIGludCBoID0gaXIuaGVpZ2h0KCk7CisgICAg
QklUTUFQSU5GTyBibXAgPSB7IHsgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpLCB3LCBoLCAxLCAz
MiB9IH07CisKKyAgICBIQklUTUFQIGhibXAgPSBDcmVhdGVESUJTZWN0aW9uKDAsICZibXAsIERJ
Ql9SR0JfQ09MT1JTLCAodm9pZCoqKSZiaXRzLCAwLCAwKTsKKyAgICBIQklUTUFQIGhibXBPbGQg
PSAoSEJJVE1BUClTZWxlY3RPYmplY3QoaGRjLCBoYm1wKTsKKyAgICBDR0NvbG9yU3BhY2VSZWYg
ZGV2aWNlUkdCID0gQ0dDb2xvclNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7CisgICAgQ0dDb250ZXh0
UmVmIGNvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUoKHZvaWQqKWJpdHMsIHcsIGgsCisg
ICAgICAgIDgsIHcgKiBzaXplb2YoUkdCUVVBRCksIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9y
ZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhhUHJlbXVsdGlwbGllZEZpcnN0KTsKKyAgICBDR0Nv
bG9yU3BhY2VSZWxlYXNlKGRldmljZVJHQik7CisgICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShjb250
ZXh0KTsKKworICAgIEdyYXBoaWNzQ29udGV4dCBnYyhjb250ZXh0KTsKKworICAgIGZyYW1lLT5k
b2N1bWVudCgpLT51cGRhdGVMYXlvdXQoKTsKKyAgICBkcmF3UmVjdEludG9Db250ZXh0KGlyLCBm
cmFtZS0+dmlldygpLCAmZ2MpOworCisgICAgQ0dDb250ZXh0UmVsZWFzZShjb250ZXh0KTsKKyAg
ICBTZWxlY3RPYmplY3QoaGRjLCBoYm1wT2xkKTsKKyAgICBEZWxldGVEQyhoZGMpOworCisgICAg
ZnJhbWUtPnNldFBhaW50UmVzdHJpY3Rpb24oUGFpbnRSZXN0cmljdGlvbk5vbmUpOworCisgICAg
cmV0dXJuIGhibXA7Cit9CisKK0RyYWdJbWFnZVJlZiBGcmFtZTo6ZHJhZ0ltYWdlRm9yU2VsZWN0
aW9uKCkKK3sgICAgCisgICAgaWYgKHNlbGVjdGlvbkNvbnRyb2xsZXIoKS0+aXNSYW5nZSgpKQor
ICAgICAgICByZXR1cm4gaW1hZ2VGcm9tU2VsZWN0aW9uKHRoaXMsIGZhbHNlKTsKKworICAgIHJl
dHVybiAwOworfQorCit2b2lkIEZyYW1lOjpkYXNoYm9hcmRSZWdpb25zQ2hhbmdlZCgpCit7Cit9
CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFt
ZUNHV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVDR1dpbi5j
cHAJKHJldmlzaW9uIDI5NzI2KQorKysgV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lQ0dXaW4uY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAw
NiwgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDYsIDIwMDcsIDIwMDggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yNiwxMTcgKzI2LDE4IEBACiAjaW5jbHVkZSAi
Y29uZmlnLmgiCiAjaW5jbHVkZSAiRnJhbWVXaW4uaCIKIAotI2luY2x1ZGUgPHdpbnNvY2syLmg+
CiAjaW5jbHVkZSA8d2luZG93cy5oPgogCi0jaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCi0j
aW5jbHVkZSAiRmxvYXRSZWN0LmgiCi0jaW5jbHVkZSAiRG9jdW1lbnQuaCIKLSNpbmNsdWRlICJF
ZGl0b3JDbGllbnQuaCIKLSNpbmNsdWRlICJGcmFtZUxvYWRlci5oIgotI2luY2x1ZGUgIkZyYW1l
TG9hZFJlcXVlc3QuaCIKLSNpbmNsdWRlICJGcmFtZVByaXZhdGUuaCIKICNpbmNsdWRlICJGcmFt
ZVZpZXcuaCIKLSNpbmNsdWRlICJIVE1MSUZyYW1lRWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxO
YW1lcy5oIgotI2luY2x1ZGUgIkhUTUxUYWJsZUNlbGxFbGVtZW50LmgiCi0jaW5jbHVkZSAiS2V5
Ym9hcmRFdmVudC5oIgotI2luY2x1ZGUgIk5QX2pzb2JqZWN0LmgiCi0jaW5jbHVkZSAiTm90SW1w
bGVtZW50ZWQuaCIKLSNpbmNsdWRlICJQYWdlLmgiCi0jaW5jbHVkZSAiUGx1Z2luLmgiCi0jaW5j
bHVkZSAiUGx1Z2luRGF0YWJhc2VXaW4uaCIKLSNpbmNsdWRlICJQbHVnaW5WaWV3V2luLmgiCi0j
aW5jbHVkZSAiUmVndWxhckV4cHJlc3Npb24uaCIKLSNpbmNsdWRlICJSZW5kZXJGcmFtZS5oIgot
I2luY2x1ZGUgIlJlbmRlclRhYmxlQ2VsbC5oIgotI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKLSNp
bmNsdWRlICJSZXNvdXJjZUhhbmRsZS5oIgotI2luY2x1ZGUgIlRleHRSZXNvdXJjZURlY29kZXIu
aCIKLSNpbmNsdWRlICJranNfcHJveHkuaCIKLSNpbmNsdWRlICJranNfd2luZG93LmgiCi0jaW5j
bHVkZSAibnBydW50aW1lX2ltcGwuaCIKLSNpbmNsdWRlICJydW50aW1lX3Jvb3QuaCIKICNpbmNs
dWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNpbmNsdWRlICJTZXR0aW5ncy5oIgogCi0jaWYgUExB
VEZPUk0oQ0cpCiAjaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NvcmVHcmFwaGljcy5oPgotI2VuZGlm
CiAKIHVzaW5nIHN0ZDo6bWluOwotdXNpbmcgbmFtZXNwYWNlIEtKUzo6QmluZGluZ3M7CiAKIG5h
bWVzcGFjZSBXZWJDb3JlIHsKIAotdXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKLQotdm9pZCBG
cmFtZTo6Y2xlYXJQbGF0Zm9ybVNjcmlwdE9iamVjdHMoKQotewotfQotCi1LSlM6OkJpbmRpbmdz
OjpJbnN0YW5jZSogRnJhbWU6OmNyZWF0ZVNjcmlwdEluc3RhbmNlRm9yV2lkZ2V0KFdpZGdldCog
d2lkZ2V0KQotewotICAgIC8vIEZJWE1FOiBJZGVhbGx5IHdlJ2QgaGF2ZSBhbiBpc1BsdWdpblZp
ZXcoKSBoZXJlIGJ1dCB3ZSBjYW4ndCBhZGQgdGhhdCB0byB0aGUgb3BlbiBzb3VyY2UgdHJlZSBy
aWdodCBub3cuCi0gICAgaWYgKHdpZGdldC0+aXNGcmFtZVZpZXcoKSkKLSAgICAgICAgcmV0dXJu
IDA7Ci0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UGx1Z2luVmlld1dpbio+KHdpZGdldCktPmJp
bmRpbmdJbnN0YW5jZSgpOwotfQotCi0KLXZvaWQgY29tcHV0ZVBhZ2VSZWN0c0ZvckZyYW1lKEZy
YW1lKiBmcmFtZSwgY29uc3QgSW50UmVjdCYgcHJpbnRSZWN0LCBmbG9hdCBoZWFkZXJIZWlnaHQs
IGZsb2F0IGZvb3RlckhlaWdodCwgZmxvYXQgdXNlclNjYWxlRmFjdG9yLFZlY3RvcjxJbnRSZWN0
PiYgcGFnZXMsIGludCYgb3V0UGFnZUhlaWdodCkKLXsKLSAgICBBU1NFUlQoZnJhbWUpOwotCi0g
ICAgcGFnZXMuY2xlYXIoKTsKLSAgICBvdXRQYWdlSGVpZ2h0ID0gMDsKLQotICAgIGlmICghZnJh
bWUtPmRvY3VtZW50KCkgfHwgIWZyYW1lLT52aWV3KCkgfHwgIWZyYW1lLT5kb2N1bWVudCgpLT5y
ZW5kZXJlcigpKQotICAgICAgICByZXR1cm47Ci0gCi0gICAgUmVuZGVyVmlldyogcm9vdCA9IHN0
YXRpY19jYXN0PFJlbmRlclZpZXcgKj4oZnJhbWUtPmRvY3VtZW50KCktPnJlbmRlcmVyKCkpOwot
Ci0gICAgaWYgKCFyb290KSB7Ci0gICAgICAgIExPR19FUlJPUigiZG9jdW1lbnQgdG8gYmUgcHJp
bnRlZCBoYXMgbm8gcmVuZGVyZXIiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlm
ICh1c2VyU2NhbGVGYWN0b3IgPD0gMCkgewotICAgICAgICBMT0dfRVJST1IoInVzZXJTY2FsZUZh
Y3RvciBoYXMgYmFkIHZhbHVlICUuMmYiLCB1c2VyU2NhbGVGYWN0b3IpOwotICAgICAgICByZXR1
cm47Ci0gICAgfQotICAgIAotICAgIGZsb2F0IHJhdGlvID0gKGZsb2F0KXByaW50UmVjdC5oZWln
aHQoKSAvIChmbG9hdClwcmludFJlY3Qud2lkdGgoKTsKLSAKLSAgICBmbG9hdCBwYWdlV2lkdGgg
ID0gKGZsb2F0KSByb290LT5kb2NXaWR0aCgpOwotICAgIGZsb2F0IHBhZ2VIZWlnaHQgPSBwYWdl
V2lkdGggKiByYXRpbzsKLSAgICBvdXRQYWdlSGVpZ2h0ID0gKGludCkgcGFnZUhlaWdodDsgICAv
LyB0aGlzIGlzIHRoZSBoZWlnaHQgb2YgdGhlIHBhZ2UgYWRqdXN0ZWQgYnkgbWFyZ2lucwotICAg
IHBhZ2VIZWlnaHQgLT0gKGhlYWRlckhlaWdodCArIGZvb3RlckhlaWdodCk7Ci0KLSAgICBpZiAo
cGFnZUhlaWdodCA8PSAwKSB7Ci0gICAgICAgIExPR19FUlJPUigicGFnZUhlaWdodCBoYXMgYmFk
IHZhbHVlICUuMmYiLCBwYWdlSGVpZ2h0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAg
IGZsb2F0IGN1cnJQYWdlSGVpZ2h0ID0gcGFnZUhlaWdodCAvIHVzZXJTY2FsZUZhY3RvcjsKLSAg
ICBmbG9hdCBkb2NIZWlnaHQgICAgICA9IHJvb3QtPmxheWVyKCktPmhlaWdodCgpOwotICAgIGZs
b2F0IGRvY1dpZHRoICAgICAgID0gcm9vdC0+bGF5ZXIoKS0+d2lkdGgoKTsKLSAgICBmbG9hdCBj
dXJyUGFnZVdpZHRoICA9IHBhZ2VXaWR0aCAvIHVzZXJTY2FsZUZhY3RvcjsKLQotICAgIAotICAg
IC8vIGFsd2F5cyByZXR1cm4gYXQgbGVhc3Qgb25lIHBhZ2UsIHNpbmNlIGVtcHR5IGZpbGVzIHNo
b3VsZCBwcmludCBhIGJsYW5rIHBhZ2UKLSAgICBmbG9hdCBwcmludGVkUGFnZXNIZWlnaHQgPSAw
LjA7Ci0gICAgZG8gewotICAgICAgICBmbG9hdCBwcm9wb3NlZEJvdHRvbSA9IG1pbihkb2NIZWln
aHQsIHByaW50ZWRQYWdlc0hlaWdodCArIHBhZ2VIZWlnaHQpOwotICAgICAgICBmcmFtZS0+YWRq
dXN0UGFnZUhlaWdodCgmcHJvcG9zZWRCb3R0b20sIHByaW50ZWRQYWdlc0hlaWdodCwgcHJvcG9z
ZWRCb3R0b20sIHByaW50ZWRQYWdlc0hlaWdodCk7Ci0gICAgICAgIGN1cnJQYWdlSGVpZ2h0ID0g
bWF4KDEuMGYsIHByb3Bvc2VkQm90dG9tIC0gcHJpbnRlZFBhZ2VzSGVpZ2h0KTsKLSAgICAgICAK
LSAgICAgICAgcGFnZXMuYXBwZW5kKEludFJlY3QoMCxwcmludGVkUGFnZXNIZWlnaHQsY3VyclBh
Z2VXaWR0aCxjdXJyUGFnZUhlaWdodCkpOwotICAgICAgICBwcmludGVkUGFnZXNIZWlnaHQgKz0g
Y3VyclBhZ2VIZWlnaHQ7Ci0gICAgfSB3aGlsZSAocHJpbnRlZFBhZ2VzSGVpZ2h0IDwgZG9jSGVp
Z2h0KTsKLX0KLQogc3RhdGljIHZvaWQgZHJhd1JlY3RJbnRvQ29udGV4dChJbnRSZWN0IHJlY3Qs
IEZyYW1lVmlldyogdmlldywgR3JhcGhpY3NDb250ZXh0KiBnYykKIHsKICAgICBJbnRTaXplIG9m
ZnNldCA9IHZpZXctPnNjcm9sbE9mZnNldCgpOwpAQCAtMTUyLDcgKzUzLDggQEAgSEJJVE1BUCBp
bWFnZUZyb21TZWxlY3Rpb24oRnJhbWUqIGZyYW1lLAogewogICAgIGZyYW1lLT5zZXRQYWludFJl
c3RyaWN0aW9uKGZvcmNlQmxhY2tUZXh0ID8gUGFpbnRSZXN0cmljdGlvblNlbGVjdGlvbk9ubHlC
bGFja1RleHQgOiBQYWludFJlc3RyaWN0aW9uU2VsZWN0aW9uT25seSk7CiAgICAgRmxvYXRSZWN0
IGZyID0gZnJhbWUtPnNlbGVjdGlvblJlY3QoKTsKLSAgICBJbnRSZWN0IGlyKChpbnQpZnIueCgp
LCAoaW50KWZyLnkoKSwoaW50KWZyLndpZHRoKCksKGludClmci5oZWlnaHQoKSk7CisgICAgSW50
UmVjdCBpcihzdGF0aWNfY2FzdDxpbnQ+KGZyLngoKSksIHN0YXRpY19jYXN0PGludD4oZnIueSgp
KSwKKyAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oZnIud2lkdGgoKSksIHN0YXRpY19j
YXN0PGludD4oZnIuaGVpZ2h0KCkpKTsKIAogICAgIHZvaWQqIGJpdHM7CiAgICAgSERDIGhkYyA9
IENyZWF0ZUNvbXBhdGlibGVEQygwKTsKQEAgLTE2MCwxMCArNjIsMTAgQEAgSEJJVE1BUCBpbWFn
ZUZyb21TZWxlY3Rpb24oRnJhbWUqIGZyYW1lLAogICAgIGludCBoID0gaXIuaGVpZ2h0KCk7CiAg
ICAgQklUTUFQSU5GTyBibXAgPSB7IHsgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpLCB3LCBoLCAx
LCAzMiB9IH07CiAKLSAgICBIQklUTUFQIGhibXAgPSBDcmVhdGVESUJTZWN0aW9uKDAsICZibXAs
IERJQl9SR0JfQ09MT1JTLCAodm9pZCoqKSZiaXRzLCAwLCAwKTsKLSAgICBIQklUTUFQIGhibXBP
bGQgPSAoSEJJVE1BUClTZWxlY3RPYmplY3QoaGRjLCBoYm1wKTsKKyAgICBIQklUTUFQIGhibXAg
PSBDcmVhdGVESUJTZWN0aW9uKDAsICZibXAsIERJQl9SR0JfQ09MT1JTLCBzdGF0aWNfY2FzdDx2
b2lkKio+KCZiaXRzKSwgMCwgMCk7CisgICAgSEJJVE1BUCBoYm1wT2xkID0gc3RhdGljX2Nhc3Q8
SEJJVE1BUD4oU2VsZWN0T2JqZWN0KGhkYywgaGJtcCkpOwogICAgIENHQ29sb3JTcGFjZVJlZiBk
ZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKLSAgICBDR0NvbnRleHRS
ZWYgY29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZSgodm9pZCopYml0cywgdywgaCwKKyAg
ICBDR0NvbnRleHRSZWYgY29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZShzdGF0aWNfY2Fz
dDx2b2lkKj4oYml0cyksIHcsIGgsCiAgICAgICAgIDgsIHcgKiBzaXplb2YoUkdCUVVBRCksIGRl
dmljZVJHQiwga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhhUHJlbXVs
dGlwbGllZEZpcnN0KTsKICAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKGRldmljZVJHQik7CiAgICAg
Q0dDb250ZXh0U2F2ZUdTdGF0ZShjb250ZXh0KTsKQEAgLTE4MiwxNiArODQsNCBAQCBIQklUTUFQ
IGltYWdlRnJvbVNlbGVjdGlvbihGcmFtZSogZnJhbWUsCiAgICAgcmV0dXJuIGhibXA7CiB9CiAK
LURyYWdJbWFnZVJlZiBGcmFtZTo6ZHJhZ0ltYWdlRm9yU2VsZWN0aW9uKCkKLXsgICAgCi0gICAg
aWYgKHNlbGVjdGlvbkNvbnRyb2xsZXIoKS0+aXNSYW5nZSgpKQotICAgICAgICByZXR1cm4gaW1h
Z2VGcm9tU2VsZWN0aW9uKHRoaXMsIGZhbHNlKTsKLQotICAgIHJldHVybiAwOwotfQotCi12b2lk
IEZyYW1lOjpkYXNoYm9hcmRSZWdpb25zQ2hhbmdlZCgpCi17Ci19Ci0KIH0gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZUNhaXJvV2luLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVDYWlyb1dpbi5jcHAJKHJldmlzaW9u
IDApCisrKyBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDgg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiRnJhbWVXaW4uaCIKKworI2luY2x1ZGUgIkVkaXRvckNsaWVudC5oIgor
I2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisKK3VzaW5nIHN0ZDo6bWluOworCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKK0hCSVRNQVAgaW1hZ2VGcm9tU2VsZWN0aW9uKEZyYW1lKiBmcmFtZSwg
Ym9vbCBmb3JjZUJsYWNrVGV4dCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVXaW4uY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZVdpbi5jcHAJKHJldmlzaW9u
IDI5ODM0KQorKysgV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lV2luLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAy
MDA4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucwpAQCAtNjAsMTAgKzYwLDYgQEAKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQu
aCIKICNpbmNsdWRlICJTZXR0aW5ncy5oIgogCi0jaWYgUExBVEZPUk0oQ0cpCi0jaW5jbHVkZSA8
Q29yZUdyYXBoaWNzL0NvcmVHcmFwaGljcy5oPgotI2VuZGlmCi0KIHVzaW5nIHN0ZDo6bWluOwog
dXNpbmcgbmFtZXNwYWNlIEtKUzo6QmluZGluZ3M7CiAKQEAgLTg0LDcgKzgwLDYgQEAgS0pTOjpC
aW5kaW5nczo6SW5zdGFuY2UqIEZyYW1lOjpjcmVhdGVTYwogICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxQbHVnaW5WaWV3V2luKj4od2lkZ2V0KS0+YmluZGluZ0luc3RhbmNlKCk7CiB9CiAKLQogdm9p
ZCBjb21wdXRlUGFnZVJlY3RzRm9yRnJhbWUoRnJhbWUqIGZyYW1lLCBjb25zdCBJbnRSZWN0JiBw
cmludFJlY3QsIGZsb2F0IGhlYWRlckhlaWdodCwgZmxvYXQgZm9vdGVySGVpZ2h0LCBmbG9hdCB1
c2VyU2NhbGVGYWN0b3IsVmVjdG9yPEludFJlY3Q+JiBwYWdlcywgaW50JiBvdXRQYWdlSGVpZ2h0
KQogewogICAgIEFTU0VSVChmcmFtZSk7CkBAIC0xMDcsMTEgKzEwMiwxMSBAQCB2b2lkIGNvbXB1
dGVQYWdlUmVjdHNGb3JGcmFtZShGcmFtZSogZnJhCiAgICAgICAgIHJldHVybjsKICAgICB9CiAg
ICAgCi0gICAgZmxvYXQgcmF0aW8gPSAoZmxvYXQpcHJpbnRSZWN0LmhlaWdodCgpIC8gKGZsb2F0
KXByaW50UmVjdC53aWR0aCgpOworICAgIGZsb2F0IHJhdGlvID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+
KHByaW50UmVjdC5oZWlnaHQoKSkgLyBzdGF0aWNfY2FzdDxmbG9hdD4ocHJpbnRSZWN0LndpZHRo
KCkpOwogIAotICAgIGZsb2F0IHBhZ2VXaWR0aCAgPSAoZmxvYXQpIHJvb3QtPmRvY1dpZHRoKCk7
CisgICAgZmxvYXQgcGFnZVdpZHRoICA9IHN0YXRpY19jYXN0PGZsb2F0Pihyb290LT5kb2NXaWR0
aCgpKTsKICAgICBmbG9hdCBwYWdlSGVpZ2h0ID0gcGFnZVdpZHRoICogcmF0aW87Ci0gICAgb3V0
UGFnZUhlaWdodCA9IChpbnQpIHBhZ2VIZWlnaHQ7ICAgLy8gdGhpcyBpcyB0aGUgaGVpZ2h0IG9m
IHRoZSBwYWdlIGFkanVzdGVkIGJ5IG1hcmdpbnMKKyAgICBvdXRQYWdlSGVpZ2h0ID0gc3RhdGlj
X2Nhc3Q8aW50PihwYWdlSGVpZ2h0KTsgICAvLyB0aGlzIGlzIHRoZSBoZWlnaHQgb2YgdGhlIHBh
Z2UgYWRqdXN0ZWQgYnkgbWFyZ2lucwogICAgIHBhZ2VIZWlnaHQgLT0gKGhlYWRlckhlaWdodCAr
IGZvb3RlckhlaWdodCk7CiAKICAgICBpZiAocGFnZUhlaWdodCA8PSAwKSB7CkBAIC0xMjYsNjIg
KzEyMSwxNyBAQCB2b2lkIGNvbXB1dGVQYWdlUmVjdHNGb3JGcmFtZShGcmFtZSogZnJhCiAKICAg
ICAKICAgICAvLyBhbHdheXMgcmV0dXJuIGF0IGxlYXN0IG9uZSBwYWdlLCBzaW5jZSBlbXB0eSBm
aWxlcyBzaG91bGQgcHJpbnQgYSBibGFuayBwYWdlCi0gICAgZmxvYXQgcHJpbnRlZFBhZ2VzSGVp
Z2h0ID0gMC4wOworICAgIGZsb2F0IHByaW50ZWRQYWdlc0hlaWdodCA9IDAuMGY7CiAgICAgZG8g
ewogICAgICAgICBmbG9hdCBwcm9wb3NlZEJvdHRvbSA9IG1pbihkb2NIZWlnaHQsIHByaW50ZWRQ
YWdlc0hlaWdodCArIHBhZ2VIZWlnaHQpOwogICAgICAgICBmcmFtZS0+YWRqdXN0UGFnZUhlaWdo
dCgmcHJvcG9zZWRCb3R0b20sIHByaW50ZWRQYWdlc0hlaWdodCwgcHJvcG9zZWRCb3R0b20sIHBy
aW50ZWRQYWdlc0hlaWdodCk7CiAgICAgICAgIGN1cnJQYWdlSGVpZ2h0ID0gbWF4KDEuMGYsIHBy
b3Bvc2VkQm90dG9tIC0gcHJpbnRlZFBhZ2VzSGVpZ2h0KTsKICAgICAgICAKLSAgICAgICAgcGFn
ZXMuYXBwZW5kKEludFJlY3QoMCxwcmludGVkUGFnZXNIZWlnaHQsY3VyclBhZ2VXaWR0aCxjdXJy
UGFnZUhlaWdodCkpOworICAgICAgICBwYWdlcy5hcHBlbmQoSW50UmVjdCgwLCBwcmludGVkUGFn
ZXNIZWlnaHQsIGN1cnJQYWdlV2lkdGgsIGN1cnJQYWdlSGVpZ2h0KSk7CiAgICAgICAgIHByaW50
ZWRQYWdlc0hlaWdodCArPSBjdXJyUGFnZUhlaWdodDsKICAgICB9IHdoaWxlIChwcmludGVkUGFn
ZXNIZWlnaHQgPCBkb2NIZWlnaHQpOwogfQogCi1zdGF0aWMgdm9pZCBkcmF3UmVjdEludG9Db250
ZXh0KEludFJlY3QgcmVjdCwgRnJhbWVWaWV3KiB2aWV3LCBHcmFwaGljc0NvbnRleHQqIGdjKQot
ewotICAgIEludFNpemUgb2Zmc2V0ID0gdmlldy0+c2Nyb2xsT2Zmc2V0KCk7Ci0gICAgcmVjdC5t
b3ZlKC1vZmZzZXQud2lkdGgoKSwgLW9mZnNldC5oZWlnaHQoKSk7Ci0gICAgcmVjdCA9IHZpZXct
PmNvbnZlcnRUb0NvbnRhaW5pbmdXaW5kb3cocmVjdCk7Ci0KLSAgICBnYy0+Y29uY2F0Q1RNKEFm
ZmluZVRyYW5zZm9ybSgpLnRyYW5zbGF0ZSgtcmVjdC54KCksIC1yZWN0LnkoKSkpOwotCi0gICAg
dmlldy0+cGFpbnQoZ2MsIHJlY3QpOwotfQotCi1IQklUTUFQIGltYWdlRnJvbVNlbGVjdGlvbihG
cmFtZSogZnJhbWUsIGJvb2wgZm9yY2VCbGFja1RleHQpCi17Ci0gICAgZnJhbWUtPnNldFBhaW50
UmVzdHJpY3Rpb24oZm9yY2VCbGFja1RleHQgPyBQYWludFJlc3RyaWN0aW9uU2VsZWN0aW9uT25s
eUJsYWNrVGV4dCA6IFBhaW50UmVzdHJpY3Rpb25TZWxlY3Rpb25Pbmx5KTsKLSAgICBGbG9hdFJl
Y3QgZnIgPSBmcmFtZS0+c2VsZWN0aW9uUmVjdCgpOwotICAgIEludFJlY3QgaXIoKGludClmci54
KCksIChpbnQpZnIueSgpLChpbnQpZnIud2lkdGgoKSwoaW50KWZyLmhlaWdodCgpKTsKLQotICAg
IHZvaWQqIGJpdHM7Ci0gICAgSERDIGhkYyA9IENyZWF0ZUNvbXBhdGlibGVEQygwKTsKLSAgICBp
bnQgdyA9IGlyLndpZHRoKCk7Ci0gICAgaW50IGggPSBpci5oZWlnaHQoKTsKLSAgICBCSVRNQVBJ
TkZPIGJtcCA9IHsgeyBzaXplb2YoQklUTUFQSU5GT0hFQURFUiksIHcsIGgsIDEsIDMyIH0gfTsK
LQotICAgIEhCSVRNQVAgaGJtcCA9IENyZWF0ZURJQlNlY3Rpb24oMCwgJmJtcCwgRElCX1JHQl9D
T0xPUlMsICh2b2lkKiopJmJpdHMsIDAsIDApOwotICAgIEhCSVRNQVAgaGJtcE9sZCA9IChIQklU
TUFQKVNlbGVjdE9iamVjdChoZGMsIGhibXApOwotICAgIENHQ29sb3JTcGFjZVJlZiBkZXZpY2VS
R0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKLSAgICBDR0NvbnRleHRSZWYgY29u
dGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZSgodm9pZCopYml0cywgdywgaCwKLSAgICAgICAg
OCwgdyAqIHNpemVvZihSR0JRVUFEKSwgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxp
dHRsZSB8IGtDR0ltYWdlQWxwaGFQcmVtdWx0aXBsaWVkRmlyc3QpOwotICAgIENHQ29sb3JTcGFj
ZVJlbGVhc2UoZGV2aWNlUkdCKTsKLSAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQpOwot
Ci0gICAgR3JhcGhpY3NDb250ZXh0IGdjKGNvbnRleHQpOwotCi0gICAgZnJhbWUtPmRvY3VtZW50
KCktPnVwZGF0ZUxheW91dCgpOwotICAgIGRyYXdSZWN0SW50b0NvbnRleHQoaXIsIGZyYW1lLT52
aWV3KCksICZnYyk7Ci0KLSAgICBDR0NvbnRleHRSZWxlYXNlKGNvbnRleHQpOwotICAgIFNlbGVj
dE9iamVjdChoZGMsIGhibXBPbGQpOwotICAgIERlbGV0ZURDKGhkYyk7Ci0KLSAgICBmcmFtZS0+
c2V0UGFpbnRSZXN0cmljdGlvbihQYWludFJlc3RyaWN0aW9uTm9uZSk7Ci0KLSAgICByZXR1cm4g
aGJtcDsKLX0KLQogRHJhZ0ltYWdlUmVmIEZyYW1lOjpkcmFnSW1hZ2VGb3JTZWxlY3Rpb24oKQog
eyAgICAKICAgICBpZiAoc2VsZWN0aW9uQ29udHJvbGxlcigpLT5pc1JhbmdlKCkpCkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5oCShyZXZpc2lvbiAyOTcy
NikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMTAzLDYgKzEwMyw3IEBAIHB1YmxpYzoKICAgICBTQ1JJUFRfQ0FDSEUqIHNj
cmlwdENhY2hlKCkgY29uc3QgeyByZXR1cm4gJm1fc2NyaXB0Q2FjaGU7IH0KIAogICAgIHN0YXRp
YyB2b2lkIHNldFNob3VsZEFwcGx5TWFjQXNjZW50SGFjayhib29sKTsKKyAgICBzdGF0aWMgYm9v
bCBzaG91bGRBcHBseU1hY0FzY2VudEhhY2soKTsKICNlbmRpZgogCiAjaWYgUExBVEZPUk0oR1RL
KQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENHV2luLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250Q0dXaW4uY3BwCShy
ZXZpc2lvbiAyOTgzNCkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udFdp
bi5jcHA6Mjk4MzQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250Q0dXaW4u
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJGb250LmgiCisKKyNpbmNsdWRlICJGb250RmFs
bGJhY2tMaXN0LmgiCisjaW5jbHVkZSAiR2x5cGhCdWZmZXIuaCIKKyNpbmNsdWRlICJHcmFwaGlj
c0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50
ZWQuaCIKKyNpbmNsdWRlICJTaW1wbGVGb250RGF0YS5oIgorI2luY2x1ZGUgIlVuaXNjcmliZUNv
bnRyb2xsZXIuaCIKKyNpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2Vy
dmljZXMuaD4KKyNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50
ZXJmYWNlLmg+CisjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCitjb25zdCBpbnQgc3ludGhldGljT2JsaXF1ZUFuZ2xlID0gMTQ7CisKK3ZvaWQgRm9u
dDo6ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwgY29uc3QgU2lt
cGxlRm9udERhdGEqIGZvbnQsIGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZlciwgCisgICAg
ICAgICAgICAgICAgICAgICAgaW50IGZyb20sIGludCBudW1HbHlwaHMsIGNvbnN0IEZsb2F0UG9p
bnQmIHBvaW50KSBjb25zdAoreworICAgIGlmIChmb250LT5tX2ZvbnQudXNlR0RJKCkpIHsKKyAg
ICAgICAgLy8gRklYTUU6IFN1cHBvcnQgYWxwaGEgYmxlbmRpbmcuCisgICAgICAgIC8vIEZJWE1F
OiBTdXBwb3J0IHRleHQgc3Ryb2tlL2ZpbGwuCisgICAgICAgIC8vIEZJWE1FOiBTdXBwb3J0IHRl
eHQgc2hhZG93LgorICAgICAgICBDb2xvciBmaWxsQ29sb3IgPSBncmFwaGljc0NvbnRleHQtPmZp
bGxDb2xvcigpOworICAgICAgICBpZiAoZmlsbENvbG9yLmFscGhhKCkgPT0gMCkKKyAgICAgICAg
ICAgIHJldHVybjsKKworICAgICAgICAvLyBXZSBoYXZlIHRvIGNvbnZlcnQgQ0cncyB0d28tZGlt
ZW5zaW9uYWwgZmxvYXRpbmcgcG9pbnQgYWR2YW5jZXMgdG8ganVzdCBob3Jpem9udGFsIGludGVn
ZXIgYWR2YW5jZXMuCisgICAgICAgIFZlY3RvcjxpbnQsIDIwNDg+IGdkaUFkdmFuY2VzOworICAg
ICAgICBpbnQgdG90YWxXaWR0aCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVt
R2x5cGhzOyBpKyspIHsKKyAgICAgICAgICAgIGdkaUFkdmFuY2VzLmFwcGVuZChscm91bmRmKGds
eXBoQnVmZmVyLmFkdmFuY2VBdChmcm9tICsgaSkpKTsKKyAgICAgICAgICAgIHRvdGFsV2lkdGgg
Kz0gZ2RpQWR2YW5jZXNbaV07CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBwdXQgc2xvcCBp
bnRvIHRoaXMgcmVjdCwgc2luY2UgZ2x5cGhzIGNhbiBvdmVyZmxvdyB0aGUgYXNjZW50L2Rlc2Nl
bnQgYm91bmRzIGFuZCB0aGUgbGVmdC9yaWdodCBlZGdlcy4KKyAgICAgICAgaW50IGxpbmVHYXAg
PSBmb250LT5saW5lR2FwKCk7CisgICAgICAgIEludFJlY3QgdGV4dFJlY3QocG9pbnQueCgpIC0g
bGluZUdhcCwgcG9pbnQueSgpIC0gZm9udC0+YXNjZW50KCkgLSBsaW5lR2FwLCB0b3RhbFdpZHRo
ICsgMiAqIGxpbmVHYXAsIGZvbnQtPmxpbmVTcGFjaW5nKCkpOworICAgICAgICBIREMgaGRjID0g
Z3JhcGhpY3NDb250ZXh0LT5nZXRXaW5kb3dzQ29udGV4dCh0ZXh0UmVjdCk7CisgICAgICAgIFNl
bGVjdE9iamVjdChoZGMsIGZvbnQtPm1fZm9udC5oZm9udCgpKTsKKworICAgICAgICAvLyBTZXQg
dGhlIGNvcnJlY3QgY29sb3IuCisgICAgICAgIEhEQyB0ZXh0RHJhd2luZ0RDID0gaGRjOworICAg
ICAgICAvKmlmIChmaWxsQ29sb3IuaGFzQWxwaGEoKSB8fCBncmFwaGljc0NvbnRleHQtPmluVHJh
bnNwYXJlbmN5TGF5ZXIoKSkgeworICAgICAgICAgICAgLy8gR0RJIGNhbid0IGhhbmRsZSBkcmF3
aW5nIHRyYW5zcGFyZW50IHRleHQuICBXZSBoYXZlIHRvIGRyYXcgaW50byBhIG1hc2suICBXZSBk
cmF3IGJsYWNrIHRleHQgb24gYSB3aGl0ZS1maWxsZWQgYmFja2dyb3VuZC4KKyAgICAgICAgICAg
IC8vIFdlIGFsc28gZG8gdGhpcyB3aGVuIGluc2lkZSB0cmFuc3BhcmVuY3kgbGF5ZXJzLCBzaW5j
ZSBHREkgYWxzbyBjYW4ndCBkcmF3IG9udG8gYSBzdXJmYWNlIHdpdGggYWxwaGEuCisgICAgICAg
ICAgICBncmFwaGljc0NvbnRleHQtPnNhdmUoKTsKKyAgICAgICAgICAgIGdyYXBoaWNzQ29udGV4
dC0+c2V0RmlsbENvbG9yKENvbG9yOjp3aGl0ZSk7CisgICAgICAgICAgICB0ZXh0RHJhd2luZ0RD
ID0gZ3JhcGhpY3NDb250ZXh0LT5nZXRXaW5kb3dzQml0bWFwQ29udGV4dCh0ZXh0UmVjdCk7Cisg
ICAgICAgICAgICBTZXRUZXh0Q29sb3IoaGRjLCBSR0IoMCwgMCwgMCkpOworICAgICAgICB9IGVs
c2UqLworICAgICAgICAgICAgU2V0VGV4dENvbG9yKGhkYywgUkdCKGZpbGxDb2xvci5yZWQoKSwg
ZmlsbENvbG9yLmdyZWVuKCksIGZpbGxDb2xvci5ibHVlKCkpKTsKKworICAgICAgICBTZXRCa01v
ZGUoaGRjLCBUUkFOU1BBUkVOVCk7CisgICAgICAgIFNldFRleHRBbGlnbihoZGMsIFRBX0xFRlQg
fCBUQV9CQVNFTElORSk7CisKKyAgICAgICAgLy8gVW5pc2NyaWJlIGdpdmVzIHVzIG9mZnNldHMg
dG8gaGVscCByZWZpbmUgdGhlIHBvc2l0aW9uaW5nIG9mIGNvbWJpbmluZyBnbHlwaHMuCisgICAg
ICAgIEZsb2F0U2l6ZSB0cmFuc2xhdGlvbiA9IGdseXBoQnVmZmVyLm9mZnNldEF0KGZyb20pOwor
ICAgICAgICBpZiAodHJhbnNsYXRpb24ud2lkdGgoKSB8fCB0cmFuc2xhdGlvbi5oZWlnaHQoKSkg
eworICAgICAgICAgICAgWEZPUk0geGZvcm07CisgICAgICAgICAgICB4Zm9ybS5lTTExID0gMS4w
OworICAgICAgICAgICAgeGZvcm0uZU0xMiA9IDA7CisgICAgICAgICAgICB4Zm9ybS5lTTIxID0g
MDsKKyAgICAgICAgICAgIHhmb3JtLmVNMjIgPSAxLjA7CisgICAgICAgICAgICB4Zm9ybS5lRHgg
PSB0cmFuc2xhdGlvbi53aWR0aCgpOworICAgICAgICAgICAgeGZvcm0uZUR5ID0gdHJhbnNsYXRp
b24uaGVpZ2h0KCk7CisgICAgICAgICAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShoZGMsICZ4Zm9y
bSwgTVdUX0xFRlRNVUxUSVBMWSk7CisgICAgICAgIH0KKyAgICAgICAgRXh0VGV4dE91dChoZGMs
IHBvaW50LngoKSwgcG9pbnQueSgpLCBFVE9fR0xZUEhfSU5ERVgsIDAsIChXQ0hBUiopZ2x5cGhC
dWZmZXIuZ2x5cGhzKGZyb20pLCBudW1HbHlwaHMsIGdkaUFkdmFuY2VzLmRhdGEoKSk7CisKKyAg
ICAgICAgLyppZiAoZmlsbENvbG9yLmhhc0FscGhhKCkgfHwgZ3JhcGhpY3NDb250ZXh0LT5pblRy
YW5zcGFyZW5jeUxheWVyKCkpIHsKKyAgICAgICAgICAgIC8vIFRPRE9EOiBXZSBoYXZlIHRvIHdh
bGsgdGhlIGJpdHMgb2YgdGhlIGJpdG1hcCBhbmQgaW52ZXJ0IHRoZW0uICBXZSBhbHNvIGNvcHkg
b3ZlciB0aGUgZ3JlZW4gY29tcG9uZW50IHZhbHVlIGludG8gdGhlIGFscGhhIHZhbHVlCisgICAg
ICAgICAgICAvLyB0byBrZWVwIENsZWFyVHlwZSBsb29raW5nIHJlYXNvbmFibGUuCisKKyAgICAg
ICAgICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgZHJhd24gdGhlIHRleHQgaW50byBhIGJpdG1hcCBh
bmQgaW52ZXJ0ZWQgaXQsIG9idGFpbiBhIENHSW1hZ2VSZWYgbWFzay4KKyAgICAgICAgICAgIENH
SW1hZ2VSZWYgbWFzayA9IGdyYXBoaWNzQ29udGV4dC0+cmVsZWFzZVdpbmRvd3NCaXRtYXBDb250
ZXh0SW50b01hc2sodGV4dERyYXdpbmdEQywgdGV4dFJlY3QpOworICAgICAgICAgICAgCisgICAg
ICAgICAgICAvLyBBcHBseSB0aGUgbWFzayB0byB0aGUgZmlsbCBjb2xvci4KKyAgICAgICAgICAg
IENHQ29udGV4dFJlZiBiaXRtYXBDb250ZXh0ID0gZ3JhcGhpY3NDb250ZXh0LT5nZXRXaW5kb3dz
Q29tcGF0aWJsZUNHQml0bWFwQ29udGV4dCh0ZXh0UmVjdC5zaXplKCkpOworICAgICAgICAgICAg
Q0dGbG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKKyAgICAgICAgICAgIGNvbG9yLmdldFJH
QkEocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworICAgICAgICAgICAgQ0dDb250ZXh0U2V0UkdC
RmlsbENvbG9yKGNvbnRleHQsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAgICAgICAgICAg
IENHQ29udGV4dEZpbGxSZWN0KGJpdG1hcENvbnRleHQsIEludFJlY3QoMCwgMCwgdGV4dFJlY3Qu
d2lkdGgoKSwgdGV4dFJlY3QuaGVpZ2h0KCkpKTsKKyAgICAgICAgICAgIENHSW1hZ2VSZWYgZmls
bENvbG9ySW1hZ2UgPSBDR0JpdG1hcENvbnRleHRDcmVhdGVJbWFnZShiaXRtYXBDb250ZXh0KTsK
KyAgICAgICAgCisgICAgICAgICAgICAvLyBBcHBseSB0aGUgbWFzay4KKyAgICAgICAgICAgIENH
SW1hZ2VSZWYgZmluYWxJbWFnZSA9IENHSW1hZ2VDcmVhdGVXaXRoTWFzayhmaWxsQ29sb3JJbWFn
ZSwgbWFzayk7CisKKyAgICAgICAgICAgIC8vIFRoZSBiaXRtYXAgaW1hZ2UgbmVlZHMgdG8gYmUg
ZHJhd24gaW50byB0aGUgSERDLgorICAgICAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5kcmF3SW1h
Z2VJbnRvV2luZG93c0NvbnRleHQoaGRjLCBmaW5hbEltYWdlKTsKKworICAgICAgICAgICAgLy8g
UmVsZWFzZSBvdXIgaW1hZ2VzIGFuZCBjb250ZXh0cy4KKyAgICAgICAgICAgIENHSW1hZ2VSZWxl
YXNlKG1hc2spOworICAgICAgICAgICAgQ0dJbWFnZVJlbGVhc2UoZmlsbENvbG9ySW1hZ2UpOwor
ICAgICAgICAgICAgQ0dJbWFnZVJlbGVhc2UoZmluYWxJbWFnZSk7CisgICAgICAgICAgICBDR0Nv
bnRleHRSZWxlYXNlKGJpdG1hcENvbnRleHQpOworICAgICAgICB9Ki8KKworICAgICAgICBncmFw
aGljc0NvbnRleHQtPnJlbGVhc2VXaW5kb3dzQ29udGV4dChoZGMsIHRleHRSZWN0KTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIENHQ29udGV4dFJlZiBjZ0NvbnRleHQgPSBncmFwaGlj
c0NvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpOworCisgICAgdWludDMyX3Qgb2xkRm9udFNtb290
aGluZ1N0eWxlID0gd2tTZXRGb250U21vb3RoaW5nU3R5bGUoY2dDb250ZXh0KTsKKworICAgIGNv
bnN0IEZvbnRQbGF0Zm9ybURhdGEmIHBsYXRmb3JtRGF0YSA9IGZvbnQtPnBsYXRmb3JtRGF0YSgp
OworCisgICAgQ0dDb250ZXh0U2V0Rm9udChjZ0NvbnRleHQsIHBsYXRmb3JtRGF0YS5jZ0ZvbnQo
KSk7CisKKyAgICBDR0FmZmluZVRyYW5zZm9ybSBtYXRyaXggPSBDR0FmZmluZVRyYW5zZm9ybUlk
ZW50aXR5OworICAgIG1hdHJpeC5iID0gLW1hdHJpeC5iOworICAgIG1hdHJpeC5kID0gLW1hdHJp
eC5kOworCisgICAgaWYgKHBsYXRmb3JtRGF0YS5zeW50aGV0aWNPYmxpcXVlKCkpCisgICAgewor
ICAgICAgICBzdGF0aWMgZmxvYXQgc2tldyA9IC10YW5mKHN5bnRoZXRpY09ibGlxdWVBbmdsZSAq
IGFjb3NmKDApIC8gOTApOworICAgICAgICBtYXRyaXggPSBDR0FmZmluZVRyYW5zZm9ybUNvbmNh
dChtYXRyaXgsIENHQWZmaW5lVHJhbnNmb3JtTWFrZSgxLCAwLCBza2V3LCAxLCAwLCAwKSk7Cisg
ICAgfQorCisgICAgLy8gVW5pc2NyaWJlIGdpdmVzIHVzIG9mZnNldHMgdG8gaGVscCByZWZpbmUg
dGhlIHBvc2l0aW9uaW5nIG9mIGNvbWJpbmluZyBnbHlwaHMuCisgICAgRmxvYXRTaXplIHRyYW5z
bGF0aW9uID0gZ2x5cGhCdWZmZXIub2Zmc2V0QXQoZnJvbSk7CisgICAgaWYgKHRyYW5zbGF0aW9u
LndpZHRoKCkgfHwgdHJhbnNsYXRpb24uaGVpZ2h0KCkpCisgICAgICAgIENHQWZmaW5lVHJhbnNm
b3JtVHJhbnNsYXRlKG1hdHJpeCwgdHJhbnNsYXRpb24ud2lkdGgoKSwgdHJhbnNsYXRpb24uaGVp
Z2h0KCkpOworICAgIAorICAgIENHQ29udGV4dFNldFRleHRNYXRyaXgoY2dDb250ZXh0LCBtYXRy
aXgpOworCisgICAgQ0dDb250ZXh0U2V0Rm9udFNpemUoY2dDb250ZXh0LCBwbGF0Zm9ybURhdGEu
c2l6ZSgpKTsKKyAgICBDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24oY2dDb250ZXh0LCBwb2ludC54
KCksIHBvaW50LnkoKSk7CisgICAgQ0dDb250ZXh0U2hvd0dseXBoc1dpdGhBZHZhbmNlcyhjZ0Nv
bnRleHQsIGdseXBoQnVmZmVyLmdseXBocyhmcm9tKSwgZ2x5cGhCdWZmZXIuYWR2YW5jZXMoZnJv
bSksIG51bUdseXBocyk7CisgICAgaWYgKGZvbnQtPm1fc3ludGhldGljQm9sZE9mZnNldCkgewor
ICAgICAgICBDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24oY2dDb250ZXh0LCBwb2ludC54KCkgKyBm
b250LT5tX3N5bnRoZXRpY0JvbGRPZmZzZXQsIHBvaW50LnkoKSk7CisgICAgICAgIENHQ29udGV4
dFNob3dHbHlwaHNXaXRoQWR2YW5jZXMoY2dDb250ZXh0LCBnbHlwaEJ1ZmZlci5nbHlwaHMoZnJv
bSksIGdseXBoQnVmZmVyLmFkdmFuY2VzKGZyb20pLCBudW1HbHlwaHMpOworICAgIH0KKworICAg
IHdrUmVzdG9yZUZvbnRTbW9vdGhpbmdTdHlsZShjZ0NvbnRleHQsIG9sZEZvbnRTbW9vdGhpbmdT
dHlsZSk7Cit9CisKK0Zsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQo
Y29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCBoLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IHRvKSBj
b25zdAoreworICAgIFVuaXNjcmliZUNvbnRyb2xsZXIgaXQodGhpcywgcnVuKTsKKyAgICBpdC5h
ZHZhbmNlKGZyb20pOworICAgIGZsb2F0IGJlZm9yZVdpZHRoID0gaXQucnVuV2lkdGhTb0Zhcigp
OworICAgIGl0LmFkdmFuY2UodG8pOworICAgIGZsb2F0IGFmdGVyV2lkdGggPSBpdC5ydW5XaWR0
aFNvRmFyKCk7CisKKyAgICAvLyBVc2luZyByb3VuZGYoKSByYXRoZXIgdGhhbiBjZWlsZigpIGZv
ciB0aGUgcmlnaHQgZWRnZSBhcyBhIGNvbXByb21pc2UgdG8gZW5zdXJlIGNvcnJlY3QgY2FyZXQg
cG9zaXRpb25pbmcKKyAgICBpZiAocnVuLnJ0bCgpKSB7CisgICAgICAgIGl0LmFkdmFuY2UocnVu
Lmxlbmd0aCgpKTsKKyAgICAgICAgZmxvYXQgdG90YWxXaWR0aCA9IGl0LnJ1bldpZHRoU29GYXIo
KTsKKyAgICAgICAgcmV0dXJuIEZsb2F0UmVjdChwb2ludC54KCkgKyBmbG9vcmYodG90YWxXaWR0
aCAtIGFmdGVyV2lkdGgpLCBwb2ludC55KCksIHJvdW5kZih0b3RhbFdpZHRoIC0gYmVmb3JlV2lk
dGgpIC0gZmxvb3JmKHRvdGFsV2lkdGggLSBhZnRlcldpZHRoKSwgaCk7CisgICAgfSAKKyAgICAK
KyAgICByZXR1cm4gRmxvYXRSZWN0KHBvaW50LngoKSArIGZsb29yZihiZWZvcmVXaWR0aCksIHBv
aW50LnkoKSwgcm91bmRmKGFmdGVyV2lkdGgpIC0gZmxvb3JmKGJlZm9yZVdpZHRoKSwgaCk7Cit9
CisKK3ZvaWQgRm9udDo6ZHJhd0NvbXBsZXhUZXh0KEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwg
Y29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0Cit7CisgICAgLy8gVGhpcyBn
bHlwaCBidWZmZXIgaG9sZHMgb3VyIGdseXBocyArIGFkdmFuY2VzICsgZm9udCBkYXRhIGZvciBl
YWNoIGdseXBoLgorICAgIEdseXBoQnVmZmVyIGdseXBoQnVmZmVyOworCisgICAgZmxvYXQgc3Rh
cnRYID0gcG9pbnQueCgpOworICAgIFVuaXNjcmliZUNvbnRyb2xsZXIgY29udHJvbGxlcih0aGlz
LCBydW4pOworICAgIGNvbnRyb2xsZXIuYWR2YW5jZShmcm9tKTsKKyAgICBmbG9hdCBiZWZvcmVX
aWR0aCA9IGNvbnRyb2xsZXIucnVuV2lkdGhTb0ZhcigpOworICAgIGNvbnRyb2xsZXIuYWR2YW5j
ZSh0bywgJmdseXBoQnVmZmVyKTsKKyAgICAKKyAgICAvLyBXZSBjb3VsZG4ndCBnZW5lcmF0ZSBh
bnkgZ2x5cGhzIGZvciB0aGUgcnVuLiAgR2l2ZSB1cC4KKyAgICBpZiAoZ2x5cGhCdWZmZXIuaXNF
bXB0eSgpKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgZmxvYXQgYWZ0ZXJXaWR0aCA9IGNv
bnRyb2xsZXIucnVuV2lkdGhTb0ZhcigpOworCisgICAgaWYgKHJ1bi5ydGwoKSkgeworICAgICAg
ICBjb250cm9sbGVyLmFkdmFuY2UocnVuLmxlbmd0aCgpKTsKKyAgICAgICAgc3RhcnRYICs9IGNv
bnRyb2xsZXIucnVuV2lkdGhTb0ZhcigpIC0gYWZ0ZXJXaWR0aDsKKyAgICB9IGVsc2UKKyAgICAg
ICAgc3RhcnRYICs9IGJlZm9yZVdpZHRoOworCisgICAgLy8gRHJhdyB0aGUgZ2x5cGggYnVmZmVy
IG5vdyBhdCB0aGUgc3RhcnRpbmcgcG9pbnQgcmV0dXJuZWQgaW4gc3RhcnRYLgorICAgIEZsb2F0
UG9pbnQgc3RhcnRQb2ludChzdGFydFgsIHBvaW50LnkoKSk7CisgICAgZHJhd0dseXBoQnVmZmVy
KGNvbnRleHQsIGdseXBoQnVmZmVyLCBydW4sIHN0YXJ0UG9pbnQpOworfQorCitmbG9hdCBGb250
OjpmbG9hdFdpZHRoRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuKSBjb25zdAorewor
ICAgIFVuaXNjcmliZUNvbnRyb2xsZXIgY29udHJvbGxlcih0aGlzLCBydW4pOworICAgIGNvbnRy
b2xsZXIuYWR2YW5jZShydW4ubGVuZ3RoKCkpOworICAgIHJldHVybiBjb250cm9sbGVyLnJ1bldp
ZHRoU29GYXIoKTsKK30KKworaW50IEZvbnQ6Om9mZnNldEZvclBvc2l0aW9uRm9yQ29tcGxleFRl
eHQoY29uc3QgVGV4dFJ1biYgcnVuLCBpbnQgeCwgYm9vbCBpbmNsdWRlUGFydGlhbEdseXBocykg
Y29uc3QKK3sKKyAgICBVbmlzY3JpYmVDb250cm9sbGVyIGNvbnRyb2xsZXIodGhpcywgcnVuKTsK
KyAgICByZXR1cm4gY29udHJvbGxlci5vZmZzZXRGb3JQb3NpdGlvbih4LCBpbmNsdWRlUGFydGlh
bEdseXBocyk7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0Zv
bnRDR1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4v
Rm9udENHV2luLmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbi9Gb250Q0dXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoK
LSAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI2LDExICsyNiw5IEBACiAj
aW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiRm9udC5oIgogCi0jaW5jbHVkZSAiRm9udEZh
bGxiYWNrTGlzdC5oIgogI2luY2x1ZGUgIkdseXBoQnVmZmVyLmgiCiAjaW5jbHVkZSAiR3JhcGhp
Y3NDb250ZXh0LmgiCiAjaW5jbHVkZSAiSW50UmVjdC5oIgotI2luY2x1ZGUgIk5vdEltcGxlbWVu
dGVkLmgiCiAjaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIKICNpbmNsdWRlICJVbmlzY3JpYmVD
b250cm9sbGVyLmgiCiAjaW5jbHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNl
cnZpY2VzLmg+CkBAIC02OCwxNSArNjYsNyBAQCB2b2lkIEZvbnQ6OmRyYXdHbHlwaHMoR3JhcGhp
Y3NDb250ZXh0KiBnCiAKICAgICAgICAgLy8gU2V0IHRoZSBjb3JyZWN0IGNvbG9yLgogICAgICAg
ICBIREMgdGV4dERyYXdpbmdEQyA9IGhkYzsKLSAgICAgICAgLyppZiAoZmlsbENvbG9yLmhhc0Fs
cGhhKCkgfHwgZ3JhcGhpY3NDb250ZXh0LT5pblRyYW5zcGFyZW5jeUxheWVyKCkpIHsKLSAgICAg
ICAgICAgIC8vIEdESSBjYW4ndCBoYW5kbGUgZHJhd2luZyB0cmFuc3BhcmVudCB0ZXh0LiAgV2Ug
aGF2ZSB0byBkcmF3IGludG8gYSBtYXNrLiAgV2UgZHJhdyBibGFjayB0ZXh0IG9uIGEgd2hpdGUt
ZmlsbGVkIGJhY2tncm91bmQuCi0gICAgICAgICAgICAvLyBXZSBhbHNvIGRvIHRoaXMgd2hlbiBp
bnNpZGUgdHJhbnNwYXJlbmN5IGxheWVycywgc2luY2UgR0RJIGFsc28gY2FuJ3QgZHJhdyBvbnRv
IGEgc3VyZmFjZSB3aXRoIGFscGhhLgotICAgICAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5zYXZl
KCk7Ci0gICAgICAgICAgICBncmFwaGljc0NvbnRleHQtPnNldEZpbGxDb2xvcihDb2xvcjo6d2hp
dGUpOwotICAgICAgICAgICAgdGV4dERyYXdpbmdEQyA9IGdyYXBoaWNzQ29udGV4dC0+Z2V0V2lu
ZG93c0JpdG1hcENvbnRleHQodGV4dFJlY3QpOwotICAgICAgICAgICAgU2V0VGV4dENvbG9yKGhk
YywgUkdCKDAsIDAsIDApKTsKLSAgICAgICAgfSBlbHNlKi8KLSAgICAgICAgICAgIFNldFRleHRD
b2xvcihoZGMsIFJHQihmaWxsQ29sb3IucmVkKCksIGZpbGxDb2xvci5ncmVlbigpLCBmaWxsQ29s
b3IuYmx1ZSgpKSk7CisgICAgICAgIFNldFRleHRDb2xvcihoZGMsIFJHQihmaWxsQ29sb3IucmVk
KCksIGZpbGxDb2xvci5ncmVlbigpLCBmaWxsQ29sb3IuYmx1ZSgpKSk7CiAKICAgICAgICAgU2V0
QmtNb2RlKGhkYywgVFJBTlNQQVJFTlQpOwogICAgICAgICBTZXRUZXh0QWxpZ24oaGRjLCBUQV9M
RUZUIHwgVEFfQkFTRUxJTkUpOwpAQCAtOTUsMzQgKzg1LDYgQEAgdm9pZCBGb250OjpkcmF3R2x5
cGhzKEdyYXBoaWNzQ29udGV4dCogZwogICAgICAgICB9CiAgICAgICAgIEV4dFRleHRPdXQoaGRj
LCBwb2ludC54KCksIHBvaW50LnkoKSwgRVRPX0dMWVBIX0lOREVYLCAwLCAoV0NIQVIqKWdseXBo
QnVmZmVyLmdseXBocyhmcm9tKSwgbnVtR2x5cGhzLCBnZGlBZHZhbmNlcy5kYXRhKCkpOwogCi0g
ICAgICAgIC8qaWYgKGZpbGxDb2xvci5oYXNBbHBoYSgpIHx8IGdyYXBoaWNzQ29udGV4dC0+aW5U
cmFuc3BhcmVuY3lMYXllcigpKSB7Ci0gICAgICAgICAgICAvLyBUT0RPRDogV2UgaGF2ZSB0byB3
YWxrIHRoZSBiaXRzIG9mIHRoZSBiaXRtYXAgYW5kIGludmVydCB0aGVtLiAgV2UgYWxzbyBjb3B5
IG92ZXIgdGhlIGdyZWVuIGNvbXBvbmVudCB2YWx1ZSBpbnRvIHRoZSBhbHBoYSB2YWx1ZQotICAg
ICAgICAgICAgLy8gdG8ga2VlcCBDbGVhclR5cGUgbG9va2luZyByZWFzb25hYmxlLgotCi0gICAg
ICAgICAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGRyYXduIHRoZSB0ZXh0IGludG8gYSBiaXRtYXAg
YW5kIGludmVydGVkIGl0LCBvYnRhaW4gYSBDR0ltYWdlUmVmIG1hc2suCi0gICAgICAgICAgICBD
R0ltYWdlUmVmIG1hc2sgPSBncmFwaGljc0NvbnRleHQtPnJlbGVhc2VXaW5kb3dzQml0bWFwQ29u
dGV4dEludG9NYXNrKHRleHREcmF3aW5nREMsIHRleHRSZWN0KTsKLSAgICAgICAgICAgIAotICAg
ICAgICAgICAgLy8gQXBwbHkgdGhlIG1hc2sgdG8gdGhlIGZpbGwgY29sb3IuCi0gICAgICAgICAg
ICBDR0NvbnRleHRSZWYgYml0bWFwQ29udGV4dCA9IGdyYXBoaWNzQ29udGV4dC0+Z2V0V2luZG93
c0NvbXBhdGlibGVDR0JpdG1hcENvbnRleHQodGV4dFJlY3Quc2l6ZSgpKTsKLSAgICAgICAgICAg
IENHRmxvYXQgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGE7Ci0gICAgICAgICAgICBjb2xvci5nZXRS
R0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLSAgICAgICAgICAgIENHQ29udGV4dFNldFJH
QkZpbGxDb2xvcihjb250ZXh0LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci0gICAgICAgICAg
ICBDR0NvbnRleHRGaWxsUmVjdChiaXRtYXBDb250ZXh0LCBJbnRSZWN0KDAsIDAsIHRleHRSZWN0
LndpZHRoKCksIHRleHRSZWN0LmhlaWdodCgpKSk7Ci0gICAgICAgICAgICBDR0ltYWdlUmVmIGZp
bGxDb2xvckltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlSW1hZ2UoYml0bWFwQ29udGV4dCk7
Ci0gICAgICAgIAotICAgICAgICAgICAgLy8gQXBwbHkgdGhlIG1hc2suCi0gICAgICAgICAgICBD
R0ltYWdlUmVmIGZpbmFsSW1hZ2UgPSBDR0ltYWdlQ3JlYXRlV2l0aE1hc2soZmlsbENvbG9ySW1h
Z2UsIG1hc2spOwotCi0gICAgICAgICAgICAvLyBUaGUgYml0bWFwIGltYWdlIG5lZWRzIHRvIGJl
IGRyYXduIGludG8gdGhlIEhEQy4KLSAgICAgICAgICAgIGdyYXBoaWNzQ29udGV4dC0+ZHJhd0lt
YWdlSW50b1dpbmRvd3NDb250ZXh0KGhkYywgZmluYWxJbWFnZSk7Ci0KLSAgICAgICAgICAgIC8v
IFJlbGVhc2Ugb3VyIGltYWdlcyBhbmQgY29udGV4dHMuCi0gICAgICAgICAgICBDR0ltYWdlUmVs
ZWFzZShtYXNrKTsKLSAgICAgICAgICAgIENHSW1hZ2VSZWxlYXNlKGZpbGxDb2xvckltYWdlKTsK
LSAgICAgICAgICAgIENHSW1hZ2VSZWxlYXNlKGZpbmFsSW1hZ2UpOwotICAgICAgICAgICAgQ0dD
b250ZXh0UmVsZWFzZShiaXRtYXBDb250ZXh0KTsKLSAgICAgICAgfSovCi0KICAgICAgICAgZ3Jh
cGhpY3NDb250ZXh0LT5yZWxlYXNlV2luZG93c0NvbnRleHQoaGRjLCB0ZXh0UmVjdCk7CiAgICAg
ICAgIHJldHVybjsKICAgICB9CkBAIC0xMzksOSArMTAxLDggQEAgdm9pZCBGb250OjpkcmF3R2x5
cGhzKEdyYXBoaWNzQ29udGV4dCogZwogICAgIG1hdHJpeC5iID0gLW1hdHJpeC5iOwogICAgIG1h
dHJpeC5kID0gLW1hdHJpeC5kOwogCi0gICAgaWYgKHBsYXRmb3JtRGF0YS5zeW50aGV0aWNPYmxp
cXVlKCkpCi0gICAgewotICAgICAgICBzdGF0aWMgZmxvYXQgc2tldyA9IC10YW5mKHN5bnRoZXRp
Y09ibGlxdWVBbmdsZSAqIGFjb3NmKDApIC8gOTApOworICAgIGlmIChwbGF0Zm9ybURhdGEuc3lu
dGhldGljT2JsaXF1ZSgpKSB7CisgICAgICAgIHN0YXRpYyBmbG9hdCBza2V3ID0gLXRhbmYoc3lu
dGhldGljT2JsaXF1ZUFuZ2xlICogYWNvc2YoMCkgLyA5MC4wZik7CiAgICAgICAgIG1hdHJpeCA9
IENHQWZmaW5lVHJhbnNmb3JtQ29uY2F0KG1hdHJpeCwgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlKDEs
IDAsIHNrZXcsIDEsIDAsIDApKTsKICAgICB9CiAKQEAgLTE2Myw2NSArMTI0LDQgQEAgdm9pZCBG
b250OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCogZwogICAgIHdrUmVzdG9yZUZvbnRTbW9v
dGhpbmdTdHlsZShjZ0NvbnRleHQsIG9sZEZvbnRTbW9vdGhpbmdTdHlsZSk7CiB9CiAKLUZsb2F0
UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVu
LCBjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCBoLAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAotewotICAgIFVuaXNj
cmliZUNvbnRyb2xsZXIgaXQodGhpcywgcnVuKTsKLSAgICBpdC5hZHZhbmNlKGZyb20pOwotICAg
IGZsb2F0IGJlZm9yZVdpZHRoID0gaXQucnVuV2lkdGhTb0ZhcigpOwotICAgIGl0LmFkdmFuY2Uo
dG8pOwotICAgIGZsb2F0IGFmdGVyV2lkdGggPSBpdC5ydW5XaWR0aFNvRmFyKCk7Ci0KLSAgICAv
LyBVc2luZyByb3VuZGYoKSByYXRoZXIgdGhhbiBjZWlsZigpIGZvciB0aGUgcmlnaHQgZWRnZSBh
cyBhIGNvbXByb21pc2UgdG8gZW5zdXJlIGNvcnJlY3QgY2FyZXQgcG9zaXRpb25pbmcKLSAgICBp
ZiAocnVuLnJ0bCgpKSB7Ci0gICAgICAgIGl0LmFkdmFuY2UocnVuLmxlbmd0aCgpKTsKLSAgICAg
ICAgZmxvYXQgdG90YWxXaWR0aCA9IGl0LnJ1bldpZHRoU29GYXIoKTsKLSAgICAgICAgcmV0dXJu
IEZsb2F0UmVjdChwb2ludC54KCkgKyBmbG9vcmYodG90YWxXaWR0aCAtIGFmdGVyV2lkdGgpLCBw
b2ludC55KCksIHJvdW5kZih0b3RhbFdpZHRoIC0gYmVmb3JlV2lkdGgpIC0gZmxvb3JmKHRvdGFs
V2lkdGggLSBhZnRlcldpZHRoKSwgaCk7Ci0gICAgfSAKLSAgICAKLSAgICByZXR1cm4gRmxvYXRS
ZWN0KHBvaW50LngoKSArIGZsb29yZihiZWZvcmVXaWR0aCksIHBvaW50LnkoKSwgcm91bmRmKGFm
dGVyV2lkdGgpIC0gZmxvb3JmKGJlZm9yZVdpZHRoKSwgaCk7Ci19Ci0KLXZvaWQgRm9udDo6ZHJh
d0NvbXBsZXhUZXh0KEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgVGV4dFJ1biYgcnVu
LCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlu
dCBmcm9tLCBpbnQgdG8pIGNvbnN0Ci17Ci0gICAgLy8gVGhpcyBnbHlwaCBidWZmZXIgaG9sZHMg
b3VyIGdseXBocyArIGFkdmFuY2VzICsgZm9udCBkYXRhIGZvciBlYWNoIGdseXBoLgotICAgIEds
eXBoQnVmZmVyIGdseXBoQnVmZmVyOwotCi0gICAgZmxvYXQgc3RhcnRYID0gcG9pbnQueCgpOwot
ICAgIFVuaXNjcmliZUNvbnRyb2xsZXIgY29udHJvbGxlcih0aGlzLCBydW4pOwotICAgIGNvbnRy
b2xsZXIuYWR2YW5jZShmcm9tKTsKLSAgICBmbG9hdCBiZWZvcmVXaWR0aCA9IGNvbnRyb2xsZXIu
cnVuV2lkdGhTb0ZhcigpOwotICAgIGNvbnRyb2xsZXIuYWR2YW5jZSh0bywgJmdseXBoQnVmZmVy
KTsKLSAgICAKLSAgICAvLyBXZSBjb3VsZG4ndCBnZW5lcmF0ZSBhbnkgZ2x5cGhzIGZvciB0aGUg
cnVuLiAgR2l2ZSB1cC4KLSAgICBpZiAoZ2x5cGhCdWZmZXIuaXNFbXB0eSgpKQotICAgICAgICBy
ZXR1cm47Ci0gICAgCi0gICAgZmxvYXQgYWZ0ZXJXaWR0aCA9IGNvbnRyb2xsZXIucnVuV2lkdGhT
b0ZhcigpOwotCi0gICAgaWYgKHJ1bi5ydGwoKSkgewotICAgICAgICBjb250cm9sbGVyLmFkdmFu
Y2UocnVuLmxlbmd0aCgpKTsKLSAgICAgICAgc3RhcnRYICs9IGNvbnRyb2xsZXIucnVuV2lkdGhT
b0ZhcigpIC0gYWZ0ZXJXaWR0aDsKLSAgICB9IGVsc2UKLSAgICAgICAgc3RhcnRYICs9IGJlZm9y
ZVdpZHRoOwotCi0gICAgLy8gRHJhdyB0aGUgZ2x5cGggYnVmZmVyIG5vdyBhdCB0aGUgc3RhcnRp
bmcgcG9pbnQgcmV0dXJuZWQgaW4gc3RhcnRYLgotICAgIEZsb2F0UG9pbnQgc3RhcnRQb2ludChz
dGFydFgsIHBvaW50LnkoKSk7Ci0gICAgZHJhd0dseXBoQnVmZmVyKGNvbnRleHQsIGdseXBoQnVm
ZmVyLCBydW4sIHN0YXJ0UG9pbnQpOwotfQotCi1mbG9hdCBGb250OjpmbG9hdFdpZHRoRm9yQ29t
cGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuKSBjb25zdAotewotICAgIFVuaXNjcmliZUNvbnRy
b2xsZXIgY29udHJvbGxlcih0aGlzLCBydW4pOwotICAgIGNvbnRyb2xsZXIuYWR2YW5jZShydW4u
bGVuZ3RoKCkpOwotICAgIHJldHVybiBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKTsKLX0KLQot
aW50IEZvbnQ6Om9mZnNldEZvclBvc2l0aW9uRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYg
cnVuLCBpbnQgeCwgYm9vbCBpbmNsdWRlUGFydGlhbEdseXBocykgY29uc3QKLXsKLSAgICBVbmlz
Y3JpYmVDb250cm9sbGVyIGNvbnRyb2xsZXIodGhpcywgcnVuKTsKLSAgICByZXR1cm4gY29udHJv
bGxlci5vZmZzZXRGb3JQb3NpdGlvbih4LCBpbmNsdWRlUGFydGlhbEdseXBocyk7Ci19Ci0KIH0K
SW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDYWlyb1dpbi5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENhaXJvV2luLmNw
cAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDYWly
b1dpbi5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDggQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZvbnQuaCIKKworI2luY2x1ZGUgIkdseXBoQnVmZmVy
LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50
ZWQuaCIKKyNpbmNsdWRlICJTaW1wbGVGb250RGF0YS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK3ZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4
dCwgY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnQsIGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1
ZmZlciwgCisgICAgICAgICAgICAgICAgICAgICAgaW50IGZyb20sIGludCBudW1HbHlwaHMsIGNv
bnN0IEZsb2F0UG9pbnQmIHBvaW50KSBjb25zdAoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9
CisKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRXaW4uY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRXaW4uY3BwCShy
ZXZpc2lvbiAyOTgzNCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRXaW4u
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykg
MjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0
IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAg
KgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTMzLDEzNiArMzMsMTAgQEAKICNpbmNs
dWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1ZGUgIlNpbXBsZUZvbnREYXRhLmgiCiAjaW5j
bHVkZSAiVW5pc2NyaWJlQ29udHJvbGxlci5oIgotI2luY2x1ZGUgPEFwcGxpY2F0aW9uU2Vydmlj
ZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgotI2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVyZmFj
ZS9XZWJLaXRTeXN0ZW1JbnRlcmZhY2UuaD4KICNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgog
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLWNvbnN0IGludCBzeW50aGV0aWNPYmxpcXVlQW5nbGUg
PSAxNDsKLQotdm9pZCBGb250OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3ND
b250ZXh0LCBjb25zdCBTaW1wbGVGb250RGF0YSogZm9udCwgY29uc3QgR2x5cGhCdWZmZXImIGds
eXBoQnVmZmVyLCAKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IG51bUdseXBo
cywgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpIGNvbnN0Ci17Ci0gICAgaWYgKGZvbnQtPm1fZm9u
dC51c2VHREkoKSkgewotICAgICAgICAvLyBGSVhNRTogU3VwcG9ydCBhbHBoYSBibGVuZGluZy4K
LSAgICAgICAgLy8gRklYTUU6IFN1cHBvcnQgdGV4dCBzdHJva2UvZmlsbC4KLSAgICAgICAgLy8g
RklYTUU6IFN1cHBvcnQgdGV4dCBzaGFkb3cuCi0gICAgICAgIENvbG9yIGZpbGxDb2xvciA9IGdy
YXBoaWNzQ29udGV4dC0+ZmlsbENvbG9yKCk7Ci0gICAgICAgIGlmIChmaWxsQ29sb3IuYWxwaGEo
KSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIC8vIFdlIGhhdmUgdG8gY29u
dmVydCBDRydzIHR3by1kaW1lbnNpb25hbCBmbG9hdGluZyBwb2ludCBhZHZhbmNlcyB0byBqdXN0
IGhvcml6b250YWwgaW50ZWdlciBhZHZhbmNlcy4KLSAgICAgICAgVmVjdG9yPGludCwgMjA0OD4g
Z2RpQWR2YW5jZXM7Ci0gICAgICAgIGludCB0b3RhbFdpZHRoID0gMDsKLSAgICAgICAgZm9yIChp
bnQgaSA9IDA7IGkgPCBudW1HbHlwaHM7IGkrKykgewotICAgICAgICAgICAgZ2RpQWR2YW5jZXMu
YXBwZW5kKGxyb3VuZGYoZ2x5cGhCdWZmZXIuYWR2YW5jZUF0KGZyb20gKyBpKSkpOwotICAgICAg
ICAgICAgdG90YWxXaWR0aCArPSBnZGlBZHZhbmNlc1tpXTsKLSAgICAgICAgfQotCi0gICAgICAg
IC8vIFdlIHB1dCBzbG9wIGludG8gdGhpcyByZWN0LCBzaW5jZSBnbHlwaHMgY2FuIG92ZXJmbG93
IHRoZSBhc2NlbnQvZGVzY2VudCBib3VuZHMgYW5kIHRoZSBsZWZ0L3JpZ2h0IGVkZ2VzLgotICAg
ICAgICBpbnQgbGluZUdhcCA9IGZvbnQtPmxpbmVHYXAoKTsKLSAgICAgICAgSW50UmVjdCB0ZXh0
UmVjdChwb2ludC54KCkgLSBsaW5lR2FwLCBwb2ludC55KCkgLSBmb250LT5hc2NlbnQoKSAtIGxp
bmVHYXAsIHRvdGFsV2lkdGggKyAyICogbGluZUdhcCwgZm9udC0+bGluZVNwYWNpbmcoKSk7Ci0g
ICAgICAgIEhEQyBoZGMgPSBncmFwaGljc0NvbnRleHQtPmdldFdpbmRvd3NDb250ZXh0KHRleHRS
ZWN0KTsKLSAgICAgICAgU2VsZWN0T2JqZWN0KGhkYywgZm9udC0+bV9mb250Lmhmb250KCkpOwot
Ci0gICAgICAgIC8vIFNldCB0aGUgY29ycmVjdCBjb2xvci4KLSAgICAgICAgSERDIHRleHREcmF3
aW5nREMgPSBoZGM7Ci0gICAgICAgIC8qaWYgKGZpbGxDb2xvci5oYXNBbHBoYSgpIHx8IGdyYXBo
aWNzQ29udGV4dC0+aW5UcmFuc3BhcmVuY3lMYXllcigpKSB7Ci0gICAgICAgICAgICAvLyBHREkg
Y2FuJ3QgaGFuZGxlIGRyYXdpbmcgdHJhbnNwYXJlbnQgdGV4dC4gIFdlIGhhdmUgdG8gZHJhdyBp
bnRvIGEgbWFzay4gIFdlIGRyYXcgYmxhY2sgdGV4dCBvbiBhIHdoaXRlLWZpbGxlZCBiYWNrZ3Jv
dW5kLgotICAgICAgICAgICAgLy8gV2UgYWxzbyBkbyB0aGlzIHdoZW4gaW5zaWRlIHRyYW5zcGFy
ZW5jeSBsYXllcnMsIHNpbmNlIEdESSBhbHNvIGNhbid0IGRyYXcgb250byBhIHN1cmZhY2Ugd2l0
aCBhbHBoYS4KLSAgICAgICAgICAgIGdyYXBoaWNzQ29udGV4dC0+c2F2ZSgpOwotICAgICAgICAg
ICAgZ3JhcGhpY3NDb250ZXh0LT5zZXRGaWxsQ29sb3IoQ29sb3I6OndoaXRlKTsKLSAgICAgICAg
ICAgIHRleHREcmF3aW5nREMgPSBncmFwaGljc0NvbnRleHQtPmdldFdpbmRvd3NCaXRtYXBDb250
ZXh0KHRleHRSZWN0KTsKLSAgICAgICAgICAgIFNldFRleHRDb2xvcihoZGMsIFJHQigwLCAwLCAw
KSk7Ci0gICAgICAgIH0gZWxzZSovCi0gICAgICAgICAgICBTZXRUZXh0Q29sb3IoaGRjLCBSR0Io
ZmlsbENvbG9yLnJlZCgpLCBmaWxsQ29sb3IuZ3JlZW4oKSwgZmlsbENvbG9yLmJsdWUoKSkpOwot
Ci0gICAgICAgIFNldEJrTW9kZShoZGMsIFRSQU5TUEFSRU5UKTsKLSAgICAgICAgU2V0VGV4dEFs
aWduKGhkYywgVEFfTEVGVCB8IFRBX0JBU0VMSU5FKTsKLQotICAgICAgICAvLyBVbmlzY3JpYmUg
Z2l2ZXMgdXMgb2Zmc2V0cyB0byBoZWxwIHJlZmluZSB0aGUgcG9zaXRpb25pbmcgb2YgY29tYmlu
aW5nIGdseXBocy4KLSAgICAgICAgRmxvYXRTaXplIHRyYW5zbGF0aW9uID0gZ2x5cGhCdWZmZXIu
b2Zmc2V0QXQoZnJvbSk7Ci0gICAgICAgIGlmICh0cmFuc2xhdGlvbi53aWR0aCgpIHx8IHRyYW5z
bGF0aW9uLmhlaWdodCgpKSB7Ci0gICAgICAgICAgICBYRk9STSB4Zm9ybTsKLSAgICAgICAgICAg
IHhmb3JtLmVNMTEgPSAxLjA7Ci0gICAgICAgICAgICB4Zm9ybS5lTTEyID0gMDsKLSAgICAgICAg
ICAgIHhmb3JtLmVNMjEgPSAwOwotICAgICAgICAgICAgeGZvcm0uZU0yMiA9IDEuMDsKLSAgICAg
ICAgICAgIHhmb3JtLmVEeCA9IHRyYW5zbGF0aW9uLndpZHRoKCk7Ci0gICAgICAgICAgICB4Zm9y
bS5lRHkgPSB0cmFuc2xhdGlvbi5oZWlnaHQoKTsKLSAgICAgICAgICAgIE1vZGlmeVdvcmxkVHJh
bnNmb3JtKGhkYywgJnhmb3JtLCBNV1RfTEVGVE1VTFRJUExZKTsKLSAgICAgICAgfQotICAgICAg
ICBFeHRUZXh0T3V0KGhkYywgcG9pbnQueCgpLCBwb2ludC55KCksIEVUT19HTFlQSF9JTkRFWCwg
MCwgKFdDSEFSKilnbHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSksIG51bUdseXBocywgZ2RpQWR2YW5j
ZXMuZGF0YSgpKTsKLQotICAgICAgICAvKmlmIChmaWxsQ29sb3IuaGFzQWxwaGEoKSB8fCBncmFw
aGljc0NvbnRleHQtPmluVHJhbnNwYXJlbmN5TGF5ZXIoKSkgewotICAgICAgICAgICAgLy8gVE9E
T0Q6IFdlIGhhdmUgdG8gd2FsayB0aGUgYml0cyBvZiB0aGUgYml0bWFwIGFuZCBpbnZlcnQgdGhl
bS4gIFdlIGFsc28gY29weSBvdmVyIHRoZSBncmVlbiBjb21wb25lbnQgdmFsdWUgaW50byB0aGUg
YWxwaGEgdmFsdWUKLSAgICAgICAgICAgIC8vIHRvIGtlZXAgQ2xlYXJUeXBlIGxvb2tpbmcgcmVh
c29uYWJsZS4KLQotICAgICAgICAgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBkcmF3biB0aGUgdGV4
dCBpbnRvIGEgYml0bWFwIGFuZCBpbnZlcnRlZCBpdCwgb2J0YWluIGEgQ0dJbWFnZVJlZiBtYXNr
LgotICAgICAgICAgICAgQ0dJbWFnZVJlZiBtYXNrID0gZ3JhcGhpY3NDb250ZXh0LT5yZWxlYXNl
V2luZG93c0JpdG1hcENvbnRleHRJbnRvTWFzayh0ZXh0RHJhd2luZ0RDLCB0ZXh0UmVjdCk7Ci0g
ICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEFwcGx5IHRoZSBtYXNrIHRvIHRoZSBmaWxsIGNv
bG9yLgotICAgICAgICAgICAgQ0dDb250ZXh0UmVmIGJpdG1hcENvbnRleHQgPSBncmFwaGljc0Nv
bnRleHQtPmdldFdpbmRvd3NDb21wYXRpYmxlQ0dCaXRtYXBDb250ZXh0KHRleHRSZWN0LnNpemUo
KSk7Ci0gICAgICAgICAgICBDR0Zsb2F0IHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhOwotICAgICAg
ICAgICAgY29sb3IuZ2V0UkdCQShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci0gICAgICAgICAg
ICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoY29udGV4dCwgcmVkLCBncmVlbiwgYmx1ZSwgYWxw
aGEpOwotICAgICAgICAgICAgQ0dDb250ZXh0RmlsbFJlY3QoYml0bWFwQ29udGV4dCwgSW50UmVj
dCgwLCAwLCB0ZXh0UmVjdC53aWR0aCgpLCB0ZXh0UmVjdC5oZWlnaHQoKSkpOwotICAgICAgICAg
ICAgQ0dJbWFnZVJlZiBmaWxsQ29sb3JJbWFnZSA9IENHQml0bWFwQ29udGV4dENyZWF0ZUltYWdl
KGJpdG1hcENvbnRleHQpOwotICAgICAgICAKLSAgICAgICAgICAgIC8vIEFwcGx5IHRoZSBtYXNr
LgotICAgICAgICAgICAgQ0dJbWFnZVJlZiBmaW5hbEltYWdlID0gQ0dJbWFnZUNyZWF0ZVdpdGhN
YXNrKGZpbGxDb2xvckltYWdlLCBtYXNrKTsKLQotICAgICAgICAgICAgLy8gVGhlIGJpdG1hcCBp
bWFnZSBuZWVkcyB0byBiZSBkcmF3biBpbnRvIHRoZSBIREMuCi0gICAgICAgICAgICBncmFwaGlj
c0NvbnRleHQtPmRyYXdJbWFnZUludG9XaW5kb3dzQ29udGV4dChoZGMsIGZpbmFsSW1hZ2UpOwot
Ci0gICAgICAgICAgICAvLyBSZWxlYXNlIG91ciBpbWFnZXMgYW5kIGNvbnRleHRzLgotICAgICAg
ICAgICAgQ0dJbWFnZVJlbGVhc2UobWFzayk7Ci0gICAgICAgICAgICBDR0ltYWdlUmVsZWFzZShm
aWxsQ29sb3JJbWFnZSk7Ci0gICAgICAgICAgICBDR0ltYWdlUmVsZWFzZShmaW5hbEltYWdlKTsK
LSAgICAgICAgICAgIENHQ29udGV4dFJlbGVhc2UoYml0bWFwQ29udGV4dCk7Ci0gICAgICAgIH0q
LwotCi0gICAgICAgIGdyYXBoaWNzQ29udGV4dC0+cmVsZWFzZVdpbmRvd3NDb250ZXh0KGhkYywg
dGV4dFJlY3QpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQ0dDb250ZXh0UmVmIGNn
Q29udGV4dCA9IGdyYXBoaWNzQ29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCk7Ci0KLSAgICB1aW50
MzJfdCBvbGRGb250U21vb3RoaW5nU3R5bGUgPSB3a1NldEZvbnRTbW9vdGhpbmdTdHlsZShjZ0Nv
bnRleHQpOwotCi0gICAgY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgcGxhdGZvcm1EYXRhID0gZm9u
dC0+cGxhdGZvcm1EYXRhKCk7Ci0KLSAgICBDR0NvbnRleHRTZXRGb250KGNnQ29udGV4dCwgcGxh
dGZvcm1EYXRhLmNnRm9udCgpKTsKLQotICAgIENHQWZmaW5lVHJhbnNmb3JtIG1hdHJpeCA9IENH
QWZmaW5lVHJhbnNmb3JtSWRlbnRpdHk7Ci0gICAgbWF0cml4LmIgPSAtbWF0cml4LmI7Ci0gICAg
bWF0cml4LmQgPSAtbWF0cml4LmQ7Ci0KLSAgICBpZiAocGxhdGZvcm1EYXRhLnN5bnRoZXRpY09i
bGlxdWUoKSkKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBmbG9hdCBza2V3ID0gLXRhbmYoc3ludGhl
dGljT2JsaXF1ZUFuZ2xlICogYWNvc2YoMCkgLyA5MCk7Ci0gICAgICAgIG1hdHJpeCA9IENHQWZm
aW5lVHJhbnNmb3JtQ29uY2F0KG1hdHJpeCwgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlKDEsIDAsIHNr
ZXcsIDEsIDAsIDApKTsKLSAgICB9Ci0KLSAgICAvLyBVbmlzY3JpYmUgZ2l2ZXMgdXMgb2Zmc2V0
cyB0byBoZWxwIHJlZmluZSB0aGUgcG9zaXRpb25pbmcgb2YgY29tYmluaW5nIGdseXBocy4KLSAg
ICBGbG9hdFNpemUgdHJhbnNsYXRpb24gPSBnbHlwaEJ1ZmZlci5vZmZzZXRBdChmcm9tKTsKLSAg
ICBpZiAodHJhbnNsYXRpb24ud2lkdGgoKSB8fCB0cmFuc2xhdGlvbi5oZWlnaHQoKSkKLSAgICAg
ICAgQ0dBZmZpbmVUcmFuc2Zvcm1UcmFuc2xhdGUobWF0cml4LCB0cmFuc2xhdGlvbi53aWR0aCgp
LCB0cmFuc2xhdGlvbi5oZWlnaHQoKSk7Ci0gICAgCi0gICAgQ0dDb250ZXh0U2V0VGV4dE1hdHJp
eChjZ0NvbnRleHQsIG1hdHJpeCk7Ci0KLSAgICBDR0NvbnRleHRTZXRGb250U2l6ZShjZ0NvbnRl
eHQsIHBsYXRmb3JtRGF0YS5zaXplKCkpOwotICAgIENHQ29udGV4dFNldFRleHRQb3NpdGlvbihj
Z0NvbnRleHQsIHBvaW50LngoKSwgcG9pbnQueSgpKTsKLSAgICBDR0NvbnRleHRTaG93R2x5cGhz
V2l0aEFkdmFuY2VzKGNnQ29udGV4dCwgZ2x5cGhCdWZmZXIuZ2x5cGhzKGZyb20pLCBnbHlwaEJ1
ZmZlci5hZHZhbmNlcyhmcm9tKSwgbnVtR2x5cGhzKTsKLSAgICBpZiAoZm9udC0+bV9zeW50aGV0
aWNCb2xkT2Zmc2V0KSB7Ci0gICAgICAgIENHQ29udGV4dFNldFRleHRQb3NpdGlvbihjZ0NvbnRl
eHQsIHBvaW50LngoKSArIGZvbnQtPm1fc3ludGhldGljQm9sZE9mZnNldCwgcG9pbnQueSgpKTsK
LSAgICAgICAgQ0dDb250ZXh0U2hvd0dseXBoc1dpdGhBZHZhbmNlcyhjZ0NvbnRleHQsIGdseXBo
QnVmZmVyLmdseXBocyhmcm9tKSwgZ2x5cGhCdWZmZXIuYWR2YW5jZXMoZnJvbSksIG51bUdseXBo
cyk7Ci0gICAgfQotCi0gICAgd2tSZXN0b3JlRm9udFNtb290aGluZ1N0eWxlKGNnQ29udGV4dCwg
b2xkRm9udFNtb290aGluZ1N0eWxlKTsKLX0KLQogRmxvYXRSZWN0IEZvbnQ6OnNlbGVjdGlvblJl
Y3RGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEludFBvaW50JiBwb2lu
dCwgaW50IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlu
dCBmcm9tLCBpbnQgdG8pIGNvbnN0CiB7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbi9HcmFwaGljc0NvbnRleHRDR1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0Q0dXaW4uY3BwCShyZXZpc2lvbiAyOTgz
NCkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0V2lu
LmNwcDoyOTgzNCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29u
dGV4dENHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM4NiBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJH
cmFwaGljc0NvbnRleHQuaCIKKworI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgorI2luY2x1
ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGF0aC5oIgorI2luY2x1ZGUgPENvcmVH
cmFwaGljcy9DR0JpdG1hcENvbnRleHQuaD4KKyNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRlcmZh
Y2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4K
KworI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZS5oIgorCit1c2luZyBu
YW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFNWR1Jlc291cmNl
SW1hZ2U7CisKK3N0YXRpYyBDR0NvbnRleHRSZWYgQ0dDb250ZXh0V2l0aEhEQyhIREMgaGRjKQor
eworICAgIEhCSVRNQVAgYml0bWFwID0gKEhCSVRNQVApR2V0Q3VycmVudE9iamVjdChoZGMsIE9C
Sl9CSVRNQVApOworICAgIENHQ29sb3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VD
cmVhdGVEZXZpY2VSR0IoKTsKKyAgICBCSVRNQVAgaW5mbzsKKworICAgIEdldE9iamVjdChiaXRt
YXAsIHNpemVvZihpbmZvKSwgJmluZm8pOworICAgIEFTU0VSVChpbmZvLmJtQml0c1BpeGVsID09
IDMyKTsKKyAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZShp
bmZvLmJtQml0cywgaW5mby5ibVdpZHRoLCBpbmZvLmJtSGVpZ2h0LCA4LAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uYm1XaWR0aEJ5dGVzLCBk
ZXZpY2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwga0NHSW1hZ2VBbHBoYU5vbmVT
a2lwRmlyc3QpOworICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKKworICAgIC8v
IEZsaXAgY29vcmRzCisgICAgQ0dDb250ZXh0VHJhbnNsYXRlQ1RNKGNvbnRleHQsIDAsIGluZm8u
Ym1IZWlnaHQpOworICAgIENHQ29udGV4dFNjYWxlQ1RNKGNvbnRleHQsIDEsIC0xKTsKKyAgICAK
KyAgICAvLyBQdXQgdGhlIEhEQyBJbiBhZHZhbmNlZCBtb2RlIHNvIGl0IHdpbGwgaG9ub3IgYWZm
aW5lIHRyYW5zZm9ybXMuCisgICAgU2V0R3JhcGhpY3NNb2RlKGhkYywgR01fQURWQU5DRUQpOwor
ICAgIAorICAgIHJldHVybiBjb250ZXh0OworfQorCitHcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNz
Q29udGV4dChIREMgaGRjKQorICAgIDogbV9jb21tb24oY3JlYXRlR3JhcGhpY3NDb250ZXh0UHJp
dmF0ZSgpKQorICAgICwgbV9kYXRhKG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUo
Q0dDb250ZXh0V2l0aEhEQyhoZGMpKSkKK3sKKyAgICBDR0NvbnRleHRSZWxlYXNlKG1fZGF0YS0+
bV9jZ0NvbnRleHQpOworICAgIG1fZGF0YS0+bV9oZGMgPSBoZGM7CisgICAgc2V0UGFpbnRpbmdE
aXNhYmxlZCghbV9kYXRhLT5tX2NnQ29udGV4dCk7CisgICAgaWYgKG1fZGF0YS0+bV9jZ0NvbnRl
eHQpIHsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBjb250ZXh0IHN0YXJ0cyBpbiBzeW5jIHdp
dGggb3VyIHN0YXRlLgorICAgICAgICBzZXRQbGF0Zm9ybUZpbGxDb2xvcihmaWxsQ29sb3IoKSk7
CisgICAgICAgIHNldFBsYXRmb3JtU3Ryb2tlQ29sb3Ioc3Ryb2tlQ29sb3IoKSk7CisgICAgfQor
fQorCitIREMgR3JhcGhpY3NDb250ZXh0OjpnZXRXaW5kb3dzQ29udGV4dChjb25zdCBJbnRSZWN0
JiBkc3RSZWN0LCBib29sIHN1cHBvcnRBbHBoYUJsZW5kKQoreworICAgIGlmIChpblRyYW5zcGFy
ZW5jeUxheWVyKCkpIHsKKyAgICAgICAgaWYgKGRzdFJlY3QuaXNFbXB0eSgpKQorICAgICAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgYml0bWFwIERDIGluIHdoaWNoIHRv
IGRyYXcuCisgICAgICAgIEJJVE1BUElORk8gYml0bWFwSW5mbzsKKyAgICAgICAgYml0bWFwSW5m
by5ibWlIZWFkZXIuYmlTaXplICAgICAgICAgID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOwor
ICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVdpZHRoICAgICAgICAgPSBkc3RSZWN0Lndp
ZHRoKCk7IAorICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUhlaWdodCAgICAgICAgPSBk
c3RSZWN0LmhlaWdodCgpOworICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVBsYW5lcyAg
ICAgICAgPSAxOworICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUJpdENvdW50ICAgICAg
PSAzMjsKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiAgID0gQklf
UkdCOworICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVNpemVJbWFnZSAgICAgPSAwOwor
ICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVhQZWxzUGVyTWV0ZXIgPSAwOworICAgICAg
ICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVlQZWxzUGVyTWV0ZXIgPSAwOworICAgICAgICBiaXRt
YXBJbmZvLmJtaUhlYWRlci5iaUNsclVzZWQgICAgICAgPSAwOworICAgICAgICBiaXRtYXBJbmZv
LmJtaUhlYWRlci5iaUNsckltcG9ydGFudCAgPSAwOworCisgICAgICAgIHZvaWQqIHBpeGVscyA9
IDA7CisgICAgICAgIEhCSVRNQVAgYml0bWFwID0gOjpDcmVhdGVESUJTZWN0aW9uKE5VTEwsICZi
aXRtYXBJbmZvLCBESUJfUkdCX0NPTE9SUywgJnBpeGVscywgMCwgMCk7CisgICAgICAgIGlmICgh
Yml0bWFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgSERDIGJpdG1hcERDID0g
OjpDcmVhdGVDb21wYXRpYmxlREMobV9kYXRhLT5tX2hkYyk7CisgICAgICAgIDo6U2VsZWN0T2Jq
ZWN0KGJpdG1hcERDLCBiaXRtYXApOworCisgICAgICAgIC8vIEZpbGwgb3VyIGJ1ZmZlciB3aXRo
IGNsZWFyIGlmIHdlJ3JlIGdvaW5nIHRvIGFscGhhIGJsZW5kLgorICAgICAgICBpZiAoc3VwcG9y
dEFscGhhQmxlbmQpIHsKKyAgICAgICAgICAgIEJJVE1BUCBibXBJbmZvOworICAgICAgICAgICAg
R2V0T2JqZWN0KGJpdG1hcCwgc2l6ZW9mKGJtcEluZm8pLCAmYm1wSW5mbyk7CisgICAgICAgICAg
ICBpbnQgYnVmZmVyU2l6ZSA9IGJtcEluZm8uYm1XaWR0aEJ5dGVzICogYm1wSW5mby5ibUhlaWdo
dDsKKyAgICAgICAgICAgIG1lbXNldChibXBJbmZvLmJtQml0cywgMCwgYnVmZmVyU2l6ZSk7Cisg
ICAgICAgIH0KKworICAgICAgICAvLyBNYWtlIHN1cmUgd2UgY2FuIGRvIHdvcmxkIHRyYW5zZm9y
bXMuCisgICAgICAgIFNldEdyYXBoaWNzTW9kZShiaXRtYXBEQywgR01fQURWQU5DRUQpOworCisg
ICAgICAgIC8vIEFwcGx5IGEgdHJhbnNsYXRpb24gdG8gb3VyIGNvbnRleHQgc28gdGhhdCB0aGUg
ZHJhd2luZyBkb25lIHdpbGwgYmUgYXQgKDAsMCkgb2YgdGhlIGJpdG1hcC4KKyAgICAgICAgWEZP
Uk0geGZvcm07CisgICAgICAgIHhmb3JtLmVNMTEgPSAxLjA7CisgICAgICAgIHhmb3JtLmVNMTIg
PSAwOworICAgICAgICB4Zm9ybS5lTTIxID0gMDsKKyAgICAgICAgeGZvcm0uZU0yMiA9IDEuMDsK
KyAgICAgICAgeGZvcm0uZUR4ID0gLWRzdFJlY3QueCgpOworICAgICAgICB4Zm9ybS5lRHkgPSAt
ZHN0UmVjdC55KCk7CisgICAgICAgIDo6U2V0V29ybGRUcmFuc2Zvcm0oYml0bWFwREMsICZ4Zm9y
bSk7CisKKyAgICAgICAgcmV0dXJuIGJpdG1hcERDOworICAgIH0KKworICAgIENHQ29udGV4dEZs
dXNoKHBsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBtX2RhdGEtPnNhdmUoKTsKKyAgICByZXR1cm4g
bV9kYXRhLT5tX2hkYzsKK30KKworYm9vbCBHcmFwaGljc0NvbnRleHQ6OmluVHJhbnNwYXJlbmN5
TGF5ZXIoKSBjb25zdCB7IHJldHVybiBtX2RhdGEtPm1fdHJhbnNwYXJlbmN5Q291bnQ7IH0KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OnJlbGVhc2VXaW5kb3dzQ29udGV4dChIREMgaGRjLCBjb25z
dCBJbnRSZWN0JiBkc3RSZWN0LCBib29sIHN1cHBvcnRBbHBoYUJsZW5kKQoreworICAgIGlmICho
ZGMgJiYgaW5UcmFuc3BhcmVuY3lMYXllcigpKSB7CisgICAgICAgIGlmIChkc3RSZWN0LmlzRW1w
dHkoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBIQklUTUFQIGJpdG1hcCA9IChI
QklUTUFQKUdldEN1cnJlbnRPYmplY3QoaGRjLCBPQkpfQklUTUFQKTsKKworICAgICAgICAvLyBO
ZWVkIHRvIG1ha2UgYSBDR0ltYWdlIG91dCBvZiB0aGUgYml0bWFwJ3MgcGl4ZWwgYnVmZmVyIGFu
ZCB0aGVuIGRyYXcKKyAgICAgICAgLy8gaXQgaW50byBvdXIgY29udGV4dC4KKyAgICAgICAgQklU
TUFQIGluZm87CisgICAgICAgIEdldE9iamVjdChiaXRtYXAsIHNpemVvZihpbmZvKSwgJmluZm8p
OworICAgICAgICBBU1NFUlQoaW5mby5ibUJpdHNQaXhlbCA9PSAzMik7CisKKyAgICAgICAgQ0dD
b2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwor
ICAgICAgICBDR0NvbnRleHRSZWYgYml0bWFwQ29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0
ZShpbmZvLmJtQml0cywgaW5mby5ibVdpZHRoLCBpbmZvLmJtSGVpZ2h0LCA4LAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmJt
V2lkdGhCeXRlcywgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
c3VwcG9ydEFscGhhQmxlbmQgPyBrQ0dJbWFnZUFscGhhUHJlbXVsdGlwbGllZEZpcnN0IDoga0NH
SW1hZ2VBbHBoYU5vbmVTa2lwRmlyc3QpKTsKKyAgICAgICAgQ0dDb2xvclNwYWNlUmVsZWFzZShk
ZXZpY2VSR0IpOworCisgICAgICAgIENHSW1hZ2VSZWYgaW1hZ2UgPSBDR0JpdG1hcENvbnRleHRD
cmVhdGVJbWFnZShiaXRtYXBDb250ZXh0KTsKKyAgICAgICAgQ0dDb250ZXh0RHJhd0ltYWdlKG1f
ZGF0YS0+bV9jZ0NvbnRleHQsIGRzdFJlY3QsIGltYWdlKTsKKyAgICAgICAgCisgICAgICAgIC8v
IERlbGV0ZSBhbGwgb3VyIGp1bmsuCisgICAgICAgIENHSW1hZ2VSZWxlYXNlKGltYWdlKTsKKyAg
ICAgICAgQ0dDb250ZXh0UmVsZWFzZShiaXRtYXBDb250ZXh0KTsKKyAgICAgICAgOjpEZWxldGVE
QyhoZGMpOworICAgICAgICA6OkRlbGV0ZU9iamVjdChiaXRtYXApOworCisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBtX2RhdGEtPnJlc3RvcmUoKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHRQbGF0Zm9ybVByaXZhdGU6OnNhdmUoKQoreworICAgIGlmICghbV9oZGMpCisgICAgICAg
IHJldHVybjsKKyAgICBTYXZlREMobV9oZGMpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dFBs
YXRmb3JtUHJpdmF0ZTo6cmVzdG9yZSgpCit7CisgICAgaWYgKCFtX2hkYykKKyAgICAgICAgcmV0
dXJuOworICAgIFJlc3RvcmVEQyhtX2hkYywgLTEpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dFBsYXRmb3JtUHJpdmF0ZTo6Y2xpcChjb25zdCBJbnRSZWN0JiBjbGlwUmVjdCkKK3sKKyAgICBp
ZiAoIW1faGRjKQorICAgICAgICByZXR1cm47CisgICAgSW50ZXJzZWN0Q2xpcFJlY3QobV9oZGMs
IGNsaXBSZWN0LngoKSwgY2xpcFJlY3QueSgpLCBjbGlwUmVjdC5yaWdodCgpLCBjbGlwUmVjdC5i
b3R0b20oKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpjbGlw
KGNvbnN0IFBhdGgmKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpzY2FsZShjb25zdCBGbG9hdFNpemUmIHNpemUpCit7
CisgICAgaWYgKCFtX2hkYykKKyAgICAgICAgcmV0dXJuOworICAgIFhGT1JNIHhmb3JtOworICAg
IHhmb3JtLmVNMTEgPSBzaXplLndpZHRoKCk7CisgICAgeGZvcm0uZU0xMiA9IDA7CisgICAgeGZv
cm0uZU0yMSA9IDA7CisgICAgeGZvcm0uZU0yMiA9IHNpemUuaGVpZ2h0KCk7CisgICAgeGZvcm0u
ZUR4ID0gMDsKKyAgICB4Zm9ybS5lRHkgPSAwOworICAgIE1vZGlmeVdvcmxkVHJhbnNmb3JtKG1f
aGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOworfQorCitzdGF0aWMgY29uc3QgZG91Ymxl
IGRlZzJyYWQgPSAwLjAxNzQ1MzI5MjUxOTk0MzI5NTc2OTsgLy8gcGkvMTgwCisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpyb3RhdGUoZmxvYXQgZGVncmVlc0FuZ2xlKQor
eworICAgIGZsb2F0IHJhZGlhbnNBbmdsZSA9IGRlZ3JlZXNBbmdsZSAqIGRlZzJyYWQ7CisgICAg
ZmxvYXQgY29zQW5nbGUgPSBjb3NmKHJhZGlhbnNBbmdsZSk7CisgICAgZmxvYXQgc2luQW5nbGUg
PSBzaW5mKHJhZGlhbnNBbmdsZSk7CisgICAgWEZPUk0geGZvcm07CisgICAgeGZvcm0uZU0xMSA9
IGNvc0FuZ2xlOworICAgIHhmb3JtLmVNMTIgPSAtc2luQW5nbGU7CisgICAgeGZvcm0uZU0yMSA9
IHNpbkFuZ2xlOworICAgIHhmb3JtLmVNMjIgPSBjb3NBbmdsZTsKKyAgICB4Zm9ybS5lRHggPSAw
OworICAgIHhmb3JtLmVEeSA9IDA7CisgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4
Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZv
cm1Qcml2YXRlOjp0cmFuc2xhdGUoZmxvYXQgeCAsIGZsb2F0IHkpCit7CisgICAgaWYgKCFtX2hk
YykKKyAgICAgICAgcmV0dXJuOworICAgIFhGT1JNIHhmb3JtOworICAgIHhmb3JtLmVNMTEgPSAx
LjA7CisgICAgeGZvcm0uZU0xMiA9IDA7CisgICAgeGZvcm0uZU0yMSA9IDA7CisgICAgeGZvcm0u
ZU0yMiA9IDEuMDsKKyAgICB4Zm9ybS5lRHggPSB4OworICAgIHhmb3JtLmVEeSA9IHk7CisgICAg
TW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpjb25jYXRDVE0oY29uc3Qg
QWZmaW5lVHJhbnNmb3JtJiB0cmFuc2Zvcm0pCit7CisgICAgaWYgKCFtX2hkYykKKyAgICAgICAg
cmV0dXJuOworICAgIENHQWZmaW5lVHJhbnNmb3JtIG1hdCA9IHRyYW5zZm9ybTsKKyAgICBYRk9S
TSB4Zm9ybTsKKyAgICB4Zm9ybS5lTTExID0gbWF0LmE7CisgICAgeGZvcm0uZU0xMiA9IG1hdC5i
OworICAgIHhmb3JtLmVNMjEgPSBtYXQuYzsKKyAgICB4Zm9ybS5lTTIyID0gbWF0LmQ7CisgICAg
eGZvcm0uZUR4ID0gbWF0LnR4OworICAgIHhmb3JtLmVEeSA9IG1hdC50eTsKKyAgICBNb2RpZnlX
b3JsZFRyYW5zZm9ybShtX2hkYywgJnhmb3JtLCBNV1RfTEVGVE1VTFRJUExZKTsKK30KKwordm9p
ZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1c1JpbmcoY29uc3QgQ29sb3ImIGNvbG9yKQorewor
ICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGZsb2F0
IHJhZGl1cyA9IChmb2N1c1JpbmdXaWR0aCgpIC0gMSkgLyAyLjBmOworICAgIGludCBvZmZzZXQg
PSByYWRpdXMgKyBmb2N1c1JpbmdPZmZzZXQoKTsKKyAgICBDR0NvbG9yUmVmIGNvbG9yUmVmID0g
Y29sb3IuaXNWYWxpZCgpID8gY2dDb2xvcihjb2xvcikgOiAwOworCisgICAgQ0dNdXRhYmxlUGF0
aFJlZiBmb2N1c1JpbmdQYXRoID0gQ0dQYXRoQ3JlYXRlTXV0YWJsZSgpOworICAgIGNvbnN0IFZl
Y3RvcjxJbnRSZWN0PiYgcmVjdHMgPSBmb2N1c1JpbmdSZWN0cygpOworICAgIHVuc2lnbmVkIHJl
Y3RDb3VudCA9IHJlY3RzLnNpemUoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcmVj
dENvdW50OyBpKyspCisgICAgICAgIENHUGF0aEFkZFJlY3QoZm9jdXNSaW5nUGF0aCwgMCwgQ0dS
ZWN0SW5zZXQocmVjdHNbaV0sIC1vZmZzZXQsIC1vZmZzZXQpKTsKKworICAgIENHQ29udGV4dFJl
ZiBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCk7CisgICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShj
b250ZXh0KTsKKworICAgIENHQ29udGV4dEJlZ2luUGF0aChjb250ZXh0KTsKKyAgICBDR0NvbnRl
eHRBZGRQYXRoKGNvbnRleHQsIGZvY3VzUmluZ1BhdGgpOworCisgICAgd2tEcmF3Rm9jdXNSaW5n
KGNvbnRleHQsIGNvbG9yUmVmLCByYWRpdXMpOworCisgICAgQ0dDb2xvclJlbGVhc2UoY29sb3JS
ZWYpOworCisgICAgQ0dQYXRoUmVsZWFzZShmb2N1c1JpbmdQYXRoKTsKKworICAgIENHQ29udGV4
dFJlc3RvcmVHU3RhdGUoY29udGV4dCk7Cit9CisKK3N0YXRpYyBjb25zdCBDb2xvciYgc3BlbGxp
bmdQYXR0ZXJuQ29sb3IoKSB7CisgICAgc3RhdGljIGNvbnN0IENvbG9yIHNwZWxsaW5nQ29sb3Io
MjU1LCAwLCAwKTsKKyAgICByZXR1cm4gc3BlbGxpbmdDb2xvcjsKK30KKworc3RhdGljIGNvbnN0
IENvbG9yJiBncmFtbWFyUGF0dGVybkNvbG9yKCkgeworICAgIHN0YXRpYyBjb25zdCBDb2xvciBn
cmFtbWFyQ29sb3IoMCwgMTI4LCAwKTsKKyAgICByZXR1cm4gZ3JhbW1hckNvbG9yOworfQorCisv
LyBQdWxsZWQgZnJvbSBHcmFwaGljc0NvbnRleHRDRworc3RhdGljIHZvaWQgc2V0Q0dTdHJva2VD
b2xvcihDR0NvbnRleHRSZWYgY29udGV4dCwgY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIENH
RmxvYXQgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGE7CisgICAgY29sb3IuZ2V0UkdCQShyZWQsIGdy
ZWVuLCBibHVlLCBhbHBoYSk7CisgICAgQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IoY29udGV4
dCwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6
ZHJhd0xpbmVGb3JNaXNzcGVsbGluZ09yQmFkR3JhbW1hcihjb25zdCBJbnRQb2ludCYgcG9pbnQs
IGludCB3aWR0aCwgYm9vbCBncmFtbWFyKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkp
CisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICAvLyBUaGVzZSBhcmUgdGhlIHNhbWUgZm9yIG1p
c3NwZWxsaW5nIG9yIGJhZCBncmFtbWFyCisgICAgY29uc3QgaW50IHBhdHRlcm5IZWlnaHQgPSAz
OyAvLyAzIHJvd3MKKyAgICBBU1NFUlQoY01pc3NwZWxsaW5nTGluZVRoaWNrbmVzcyA9PSBwYXR0
ZXJuSGVpZ2h0KTsKKyAgICBjb25zdCBpbnQgcGF0dGVybldpZHRoID0gNDsgLy8gNCBwaXhlbHMK
KyAgICBBU1NFUlQocGF0dGVybldpZHRoID09IGNNaXNzcGVsbGluZ0xpbmVQYXR0ZXJuV2lkdGgp
OworCisgICAgLy8gTWFrZSBzdXJlIHRvIGRyYXcgb25seSBjb21wbGV0ZSBkb3RzLgorICAgIC8v
IE5PVEU6IENvZGUgaGVyZSB1c2VkIHRvIHNoaWZ0IHRoZSB1bmRlcmxpbmUgdG8gdGhlIGxlZnQg
YW5kIGluY3JlYXNlIHRoZSB3aWR0aAorICAgIC8vIHRvIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGdl
dHMgdW5kZXJsaW5lZCwgYnV0IHRoYXQgcmVzdWx0cyBpbiBkcmF3aW5nIG91dCBvZgorICAgIC8v
IGJvdW5kcyAoZS5nLiB3aGVuIGF0IHRoZSBlZGdlIG9mIGEgdmlldykgYW5kIGNvdWxkIG1ha2Ug
aXQgYXBwZWFyIHRoYXQgdGhlCisgICAgLy8gc3BhY2UgYmV0d2VlbiBhZGphY2VudCBtaXNzcGVs
bGVkIHdvcmRzIHdhcyB1bmRlcmxpbmVkLgorICAgIC8vIGFsbG93IHNsaWdodGx5IG1vcmUgY29u
c2lkZXJpbmcgdGhhdCB0aGUgcGF0dGVybiBlbmRzIHdpdGggYSB0cmFuc3BhcmVudCBwaXhlbAor
ICAgIGludCB3aWR0aE1vZCA9IHdpZHRoICUgcGF0dGVybldpZHRoOworICAgIGlmIChwYXR0ZXJu
V2lkdGggLSB3aWR0aE1vZCA+IGNNaXNzcGVsbGluZ0xpbmVQYXR0ZXJuR2FwV2lkdGgpCisgICAg
ICAgIHdpZHRoIC09IHdpZHRoTW9kOworICAgICAgCisgICAgLy8gRHJhdyB0aGUgdW5kZXJsaW5l
CisgICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsKKyAgICBDR0Nv
bnRleHRTYXZlR1N0YXRlKGNvbnRleHQpOworCisgICAgY29uc3QgQ29sb3ImIHBhdHRlcm5Db2xv
ciA9IGdyYW1tYXIgPyBncmFtbWFyUGF0dGVybkNvbG9yKCkgOiBzcGVsbGluZ1BhdHRlcm5Db2xv
cigpOworICAgIHNldENHU3Ryb2tlQ29sb3IoY29udGV4dCwgcGF0dGVybkNvbG9yKTsKKworICAg
IHdrU2V0UGF0dGVyblBoYXNlSW5Vc2VyU3BhY2UoY29udGV4dCwgcG9pbnQpOworICAgIENHQ29u
dGV4dFNldEJsZW5kTW9kZShjb250ZXh0LCBrQ0dCbGVuZE1vZGVOb3JtYWwpOworICAgIAorICAg
IC8vIDMgcm93cywgZWFjaCBvZmZzZXQgYnkgaGFsZiBhIHBpeGVsIGZvciBibGVuZGluZyBwdXJw
b3NlcworICAgIGNvbnN0IENHUG9pbnQgdXBwZXJQb2ludHMgW10gPSB7e3BvaW50LngoKSwgcG9p
bnQueSgpICsgcGF0dGVybkhlaWdodCAtIDIuNSB9LCB7cG9pbnQueCgpICsgd2lkdGgsIHBvaW50
LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAyLjV9fTsKKyAgICBjb25zdCBDR1BvaW50IG1pZGRsZVBv
aW50cyBbXSA9IHt7cG9pbnQueCgpLCBwb2ludC55KCkgKyBwYXR0ZXJuSGVpZ2h0IC0gMS41IH0s
IHtwb2ludC54KCkgKyB3aWR0aCwgcG9pbnQueSgpICsgcGF0dGVybkhlaWdodCAtIDEuNX19Owor
ICAgIGNvbnN0IENHUG9pbnQgbG93ZXJQb2ludHMgW10gPSB7e3BvaW50LngoKSwgcG9pbnQueSgp
ICsgcGF0dGVybkhlaWdodCAtIDAuNSB9LCB7cG9pbnQueCgpICsgd2lkdGgsIHBvaW50LnkoKSAr
IHBhdHRlcm5IZWlnaHQgLSAwLjUgfX07CisgICAgCisgICAgLy8gRGFzaCBsZW5ndGhzIGZvciB0
aGUgdG9wIGFuZCBib3R0b20gb2YgdGhlIGVycm9yIHVuZGVybGluZSBhcmUgdGhlIHNhbWUuCisg
ICAgLy8gVGhlc2UgYXJlIG1hZ2ljLgorICAgIHN0YXRpYyBjb25zdCBmbG9hdCBlZGdlX2Rhc2hf
bGVuZ3Roc1tdID0gezIsIDJ9OworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBtaWRkbGVfZGFzaF9s
ZW5ndGhzW10gPSB7Mi43NmYsIDEuMjRmfTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgZWRnZV9v
ZmZzZXQgPSAtKGVkZ2VfZGFzaF9sZW5ndGhzWzFdIC0gMS4wZikgLyAyLjBmOworICAgIHN0YXRp
YyBjb25zdCBmbG9hdCBtaWRkbGVfb2Zmc2V0ID0gLShtaWRkbGVfZGFzaF9sZW5ndGhzWzFdIC0g
MS4wZikgLyAyLjBmOworCisgICAgLy8gTGluZSBvcGFjaXRpZXMuICBPbmNlIGFnYWluLCB0aGVz
ZSBhcmUgbWFnaWMuCisgICAgY29uc3QgZmxvYXQgdXBwZXJPcGFjaXR5ID0gMC4zM2Y7CisgICAg
Y29uc3QgZmxvYXQgbWlkZGxlT3BhY2l0eSA9IDAuNzVmOworICAgIGNvbnN0IGZsb2F0IGxvd2Vy
T3BhY2l0eSA9IDAuODhmOworCisgICAgLy9Ub3AgbGluZQorICAgIENHQ29udGV4dFNldExpbmVE
YXNoKGNvbnRleHQsIGVkZ2Vfb2Zmc2V0LCBlZGdlX2Rhc2hfbGVuZ3RocywgCisgICAgICAgICAg
ICAgICAgICAgICAgICAgc2l6ZW9mKGVkZ2VfZGFzaF9sZW5ndGhzKSAvIHNpemVvZihlZGdlX2Rh
c2hfbGVuZ3Roc1swXSkpOworICAgIENHQ29udGV4dFNldEFscGhhKGNvbnRleHQsIHVwcGVyT3Bh
Y2l0eSk7CisgICAgQ0dDb250ZXh0U3Ryb2tlTGluZVNlZ21lbnRzKGNvbnRleHQsIHVwcGVyUG9p
bnRzLCAyKTsKKyAKKyAgICAvLyBNaWRkbGUgbGluZQorICAgIENHQ29udGV4dFNldExpbmVEYXNo
KGNvbnRleHQsIG1pZGRsZV9vZmZzZXQsIG1pZGRsZV9kYXNoX2xlbmd0aHMsIAorICAgICAgICAg
ICAgICAgICAgICAgICAgIHNpemVvZihtaWRkbGVfZGFzaF9sZW5ndGhzKSAvIHNpemVvZihtaWRk
bGVfZGFzaF9sZW5ndGhzWzBdKSk7CisgICAgQ0dDb250ZXh0U2V0QWxwaGEoY29udGV4dCwgbWlk
ZGxlT3BhY2l0eSk7CisgICAgQ0dDb250ZXh0U3Ryb2tlTGluZVNlZ21lbnRzKGNvbnRleHQsIG1p
ZGRsZVBvaW50cywgMik7CisgICAgCisgICAgLy8gQm90dG9tIGxpbmUKKyAgICBDR0NvbnRleHRT
ZXRMaW5lRGFzaChjb250ZXh0LCBlZGdlX29mZnNldCwgZWRnZV9kYXNoX2xlbmd0aHMsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVkZ2VfZGFzaF9sZW5ndGhzKSAvIHNpemVvZihl
ZGdlX2Rhc2hfbGVuZ3Roc1swXSkpOworICAgIENHQ29udGV4dFNldEFscGhhKGNvbnRleHQsIGxv
d2VyT3BhY2l0eSk7CisgICAgQ0dDb250ZXh0U3Ryb2tlTGluZVNlZ21lbnRzKGNvbnRleHQsIGxv
d2VyUG9pbnRzLCAyKTsKKworICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29udGV4dCk7Cit9
CisKKyNpZiBFTkFCTEUoU1ZHKQorR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0Rm9ySW1hZ2UoU1ZH
UmVzb3VyY2VJbWFnZSopCit7CisgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGdvIGluIEdyYXBo
aWNzQ29udGV4dENHLmNwcAorICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIDA7Cit9
CisjZW5kaWYKKworfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhp
Y3NDb250ZXh0Q0dXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0dyYXBoaWNzQ29udGV4dENHV2luLmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRDR1dpbi5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0
LCAyMDA1LCAyMDA2LCAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENv
cHlyaWdodCAoQykgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI5LDIxICsyOSwxOCBAQAogI2luY2x1ZGUgIkFm
ZmluZVRyYW5zZm9ybS5oIgogI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCiAjaW5jbHVkZSAi
UGF0aC5oIgorCiAjaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NHQml0bWFwQ29udGV4dC5oPgogI2lu
Y2x1ZGUgPFdlYktpdFN5c3RlbUludGVyZmFjZS9XZWJLaXRTeXN0ZW1JbnRlcmZhY2UuaD4KLSNp
bmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgotCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0UGxh
dGZvcm1Qcml2YXRlLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKIG5hbWVzcGFjZSBXZWJD
b3JlIHsKIAotY2xhc3MgU1ZHUmVzb3VyY2VJbWFnZTsKLQogc3RhdGljIENHQ29udGV4dFJlZiBD
R0NvbnRleHRXaXRoSERDKEhEQyBoZGMpCiB7Ci0gICAgSEJJVE1BUCBiaXRtYXAgPSAoSEJJVE1B
UClHZXRDdXJyZW50T2JqZWN0KGhkYywgT0JKX0JJVE1BUCk7CisgICAgSEJJVE1BUCBiaXRtYXAg
PSBzdGF0aWNfY2FzdDxIQklUTUFQPihHZXRDdXJyZW50T2JqZWN0KGhkYywgT0JKX0JJVE1BUCkp
OwogICAgIENHQ29sb3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZp
Y2VSR0IoKTsKICAgICBCSVRNQVAgaW5mbzsKIApAQCAtMTE4LDEwICsxMTUsMTAgQEAgSERDIEdy
YXBoaWNzQ29udGV4dDo6Z2V0V2luZG93c0NvbnRleHQoYwogCiAgICAgICAgIC8vIEFwcGx5IGEg
dHJhbnNsYXRpb24gdG8gb3VyIGNvbnRleHQgc28gdGhhdCB0aGUgZHJhd2luZyBkb25lIHdpbGwg
YmUgYXQgKDAsMCkgb2YgdGhlIGJpdG1hcC4KICAgICAgICAgWEZPUk0geGZvcm07Ci0gICAgICAg
IHhmb3JtLmVNMTEgPSAxLjA7Ci0gICAgICAgIHhmb3JtLmVNMTIgPSAwOwotICAgICAgICB4Zm9y
bS5lTTIxID0gMDsKLSAgICAgICAgeGZvcm0uZU0yMiA9IDEuMDsKKyAgICAgICAgeGZvcm0uZU0x
MSA9IDEuMGY7CisgICAgICAgIHhmb3JtLmVNMTIgPSAwLjBmOworICAgICAgICB4Zm9ybS5lTTIx
ID0gMC4wZjsKKyAgICAgICAgeGZvcm0uZU0yMiA9IDEuMGY7CiAgICAgICAgIHhmb3JtLmVEeCA9
IC1kc3RSZWN0LngoKTsKICAgICAgICAgeGZvcm0uZUR5ID0gLWRzdFJlY3QueSgpOwogICAgICAg
ICA6OlNldFdvcmxkVHJhbnNmb3JtKGJpdG1hcERDLCAmeGZvcm0pOwpAQCAtMTM0LDE1ICsxMzEs
MTMgQEAgSERDIEdyYXBoaWNzQ29udGV4dDo6Z2V0V2luZG93c0NvbnRleHQoYwogICAgIHJldHVy
biBtX2RhdGEtPm1faGRjOwogfQogCi1ib29sIEdyYXBoaWNzQ29udGV4dDo6aW5UcmFuc3BhcmVu
Y3lMYXllcigpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS0+bV90cmFuc3BhcmVuY3lDb3VudDsgfQot
CiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6cmVsZWFzZVdpbmRvd3NDb250ZXh0KEhEQyBoZGMsIGNv
bnN0IEludFJlY3QmIGRzdFJlY3QsIGJvb2wgc3VwcG9ydEFscGhhQmxlbmQpCiB7CiAgICAgaWYg
KGhkYyAmJiBpblRyYW5zcGFyZW5jeUxheWVyKCkpIHsKICAgICAgICAgaWYgKGRzdFJlY3QuaXNF
bXB0eSgpKQogICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIEhCSVRNQVAgYml0bWFwID0g
KEhCSVRNQVApR2V0Q3VycmVudE9iamVjdChoZGMsIE9CSl9CSVRNQVApOworICAgICAgICBIQklU
TUFQIGJpdG1hcCA9IHN0YXRpY19jYXN0PEhCSVRNQVA+KEdldEN1cnJlbnRPYmplY3QoaGRjLCBP
QkpfQklUTUFQKSk7CiAKICAgICAgICAgLy8gTmVlZCB0byBtYWtlIGEgQ0dJbWFnZSBvdXQgb2Yg
dGhlIGJpdG1hcCdzIHBpeGVsIGJ1ZmZlciBhbmQgdGhlbiBkcmF3CiAgICAgICAgIC8vIGl0IGlu
dG8gb3VyIGNvbnRleHQuCkBAIC0xNzEsODEgKzE2NiwxMSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4
dDo6cmVsZWFzZVdpbmRvd3NDb250CiAgICAgbV9kYXRhLT5yZXN0b3JlKCk7CiB9CiAKLXZvaWQg
R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpzYXZlKCkKLXsKLSAgICBpZiAoIW1faGRj
KQotICAgICAgICByZXR1cm47Ci0gICAgU2F2ZURDKG1faGRjKTsKLX0KLQotdm9pZCBHcmFwaGlj
c0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnJlc3RvcmUoKQotewotICAgIGlmICghbV9oZGMpCi0g
ICAgICAgIHJldHVybjsKLSAgICBSZXN0b3JlREMobV9oZGMsIC0xKTsKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNsaXAoY29uc3QgSW50UmVjdCYgY2xpcFJlY3Qp
Ci17Ci0gICAgaWYgKCFtX2hkYykKLSAgICAgICAgcmV0dXJuOwotICAgIEludGVyc2VjdENsaXBS
ZWN0KG1faGRjLCBjbGlwUmVjdC54KCksIGNsaXBSZWN0LnkoKSwgY2xpcFJlY3QucmlnaHQoKSwg
Y2xpcFJlY3QuYm90dG9tKCkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZTo6Y2xpcChjb25zdCBQYXRoJikKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6c2NhbGUoY29uc3QgRmxvYXRTaXpl
JiBzaXplKQotewotICAgIGlmICghbV9oZGMpCi0gICAgICAgIHJldHVybjsKLSAgICBYRk9STSB4
Zm9ybTsKLSAgICB4Zm9ybS5lTTExID0gc2l6ZS53aWR0aCgpOwotICAgIHhmb3JtLmVNMTIgPSAw
OwotICAgIHhmb3JtLmVNMjEgPSAwOwotICAgIHhmb3JtLmVNMjIgPSBzaXplLmhlaWdodCgpOwot
ICAgIHhmb3JtLmVEeCA9IDA7Ci0gICAgeGZvcm0uZUR5ID0gMDsKLSAgICBNb2RpZnlXb3JsZFRy
YW5zZm9ybShtX2hkYywgJnhmb3JtLCBNV1RfTEVGVE1VTFRJUExZKTsKLX0KLQotc3RhdGljIGNv
bnN0IGRvdWJsZSBkZWcycmFkID0gMC4wMTc0NTMyOTI1MTk5NDMyOTU3Njk7IC8vIHBpLzE4MAot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6cm90YXRlKGZsb2F0IGRlZ3Jl
ZXNBbmdsZSkKLXsKLSAgICBmbG9hdCByYWRpYW5zQW5nbGUgPSBkZWdyZWVzQW5nbGUgKiBkZWcy
cmFkOwotICAgIGZsb2F0IGNvc0FuZ2xlID0gY29zZihyYWRpYW5zQW5nbGUpOwotICAgIGZsb2F0
IHNpbkFuZ2xlID0gc2luZihyYWRpYW5zQW5nbGUpOwotICAgIFhGT1JNIHhmb3JtOwotICAgIHhm
b3JtLmVNMTEgPSBjb3NBbmdsZTsKLSAgICB4Zm9ybS5lTTEyID0gLXNpbkFuZ2xlOwotICAgIHhm
b3JtLmVNMjEgPSBzaW5BbmdsZTsKLSAgICB4Zm9ybS5lTTIyID0gY29zQW5nbGU7Ci0gICAgeGZv
cm0uZUR4ID0gMDsKLSAgICB4Zm9ybS5lRHkgPSAwOwotICAgIE1vZGlmeVdvcmxkVHJhbnNmb3Jt
KG1faGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZTo6dHJhbnNsYXRlKGZsb2F0IHggLCBmbG9hdCB5KQotewotICAg
IGlmICghbV9oZGMpCi0gICAgICAgIHJldHVybjsKLSAgICBYRk9STSB4Zm9ybTsKLSAgICB4Zm9y
bS5lTTExID0gMS4wOwotICAgIHhmb3JtLmVNMTIgPSAwOwotICAgIHhmb3JtLmVNMjEgPSAwOwot
ICAgIHhmb3JtLmVNMjIgPSAxLjA7Ci0gICAgeGZvcm0uZUR4ID0geDsKLSAgICB4Zm9ybS5lRHkg
PSB5OwotICAgIE1vZGlmeVdvcmxkVHJhbnNmb3JtKG1faGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVM
VElQTFkpOwotfQotCiB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y29uY2F0
Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdHJhbnNmb3JtKQogewogICAgIGlmICghbV9oZGMp
CiAgICAgICAgIHJldHVybjsKKwogICAgIENHQWZmaW5lVHJhbnNmb3JtIG1hdCA9IHRyYW5zZm9y
bTsKICAgICBYRk9STSB4Zm9ybTsKICAgICB4Zm9ybS5lTTExID0gbWF0LmE7CkBAIC0yNTQsNiAr
MTc5LDcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNvbgogICAgIHhm
b3JtLmVNMjIgPSBtYXQuZDsKICAgICB4Zm9ybS5lRHggPSBtYXQudHg7CiAgICAgeGZvcm0uZUR5
ID0gbWF0LnR5OworCiAgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdU
X0xFRlRNVUxUSVBMWSk7CiB9CiAKQEAgLTI4Nyw2ICsyMTMsMTQgQEAgdm9pZCBHcmFwaGljc0Nv
bnRleHQ6OmRyYXdGb2N1c1JpbmcoY29ucwogICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29u
dGV4dCk7CiB9CiAKKy8vIFB1bGxlZCBmcm9tIEdyYXBoaWNzQ29udGV4dENHCitzdGF0aWMgdm9p
ZCBzZXRDR1N0cm9rZUNvbG9yKENHQ29udGV4dFJlZiBjb250ZXh0LCBjb25zdCBDb2xvciYgY29s
b3IpCit7CisgICAgQ0dGbG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKKyAgICBjb2xvci5n
ZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAgICBDR0NvbnRleHRTZXRSR0JTdHJv
a2VDb2xvcihjb250ZXh0LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Cit9CisKIHN0YXRpYyBj
b25zdCBDb2xvciYgc3BlbGxpbmdQYXR0ZXJuQ29sb3IoKSB7CiAgICAgc3RhdGljIGNvbnN0IENv
bG9yIHNwZWxsaW5nQ29sb3IoMjU1LCAwLCAwKTsKICAgICByZXR1cm4gc3BlbGxpbmdDb2xvcjsK
QEAgLTI5NywxOSArMjMxLDExIEBAIHN0YXRpYyBjb25zdCBDb2xvciYgZ3JhbW1hclBhdHRlcm5D
b2xvcigKICAgICByZXR1cm4gZ3JhbW1hckNvbG9yOwogfQogCi0vLyBQdWxsZWQgZnJvbSBHcmFw
aGljc0NvbnRleHRDRwotc3RhdGljIHZvaWQgc2V0Q0dTdHJva2VDb2xvcihDR0NvbnRleHRSZWYg
Y29udGV4dCwgY29uc3QgQ29sb3ImIGNvbG9yKQotewotICAgIENHRmxvYXQgcmVkLCBncmVlbiwg
Ymx1ZSwgYWxwaGE7Ci0gICAgY29sb3IuZ2V0UkdCQShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7
Ci0gICAgQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IoY29udGV4dCwgcmVkLCBncmVlbiwgYmx1
ZSwgYWxwaGEpOwotfQotCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JNaXNzcGVs
bGluZ09yQmFkR3JhbW1hcihjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCB3aWR0aCwgYm9vbCBn
cmFtbWFyKQogewogICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCiAgICAgICAgIHJldHVybjsK
LSAgICAKKwogICAgIC8vIFRoZXNlIGFyZSB0aGUgc2FtZSBmb3IgbWlzc3BlbGxpbmcgb3IgYmFk
IGdyYW1tYXIKICAgICBjb25zdCBpbnQgcGF0dGVybkhlaWdodCA9IDM7IC8vIDMgcm93cwogICAg
IEFTU0VSVChjTWlzc3BlbGxpbmdMaW5lVGhpY2tuZXNzID09IHBhdHRlcm5IZWlnaHQpOwpAQCAt
MzQzLDcgKzI2OSw3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvck1pc3NwZWwK
ICAgICAKICAgICAvLyBEYXNoIGxlbmd0aHMgZm9yIHRoZSB0b3AgYW5kIGJvdHRvbSBvZiB0aGUg
ZXJyb3IgdW5kZXJsaW5lIGFyZSB0aGUgc2FtZS4KICAgICAvLyBUaGVzZSBhcmUgbWFnaWMuCi0g
ICAgc3RhdGljIGNvbnN0IGZsb2F0IGVkZ2VfZGFzaF9sZW5ndGhzW10gPSB7MiwgMn07CisgICAg
c3RhdGljIGNvbnN0IGZsb2F0IGVkZ2VfZGFzaF9sZW5ndGhzW10gPSB7Mi4wZiwgMi4wZn07CiAg
ICAgc3RhdGljIGNvbnN0IGZsb2F0IG1pZGRsZV9kYXNoX2xlbmd0aHNbXSA9IHsyLjc2ZiwgMS4y
NGZ9OwogICAgIHN0YXRpYyBjb25zdCBmbG9hdCBlZGdlX29mZnNldCA9IC0oZWRnZV9kYXNoX2xl
bmd0aHNbMV0gLSAxLjBmKSAvIDIuMGY7CiAgICAgc3RhdGljIGNvbnN0IGZsb2F0IG1pZGRsZV9v
ZmZzZXQgPSAtKG1pZGRsZV9kYXNoX2xlbmd0aHNbMV0gLSAxLjBmKSAvIDIuMGY7CkBAIC0zNzQs
MTMgKzMwMCw0IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvck1pc3NwZWwKICAg
ICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOwogfQogCi0jaWYgRU5BQkxFKFNWRykK
LUdyYXBoaWNzQ29udGV4dCogY29udGV4dEZvckltYWdlKFNWR1Jlc291cmNlSW1hZ2UqKQotewot
ICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBnbyBpbiBHcmFwaGljc0NvbnRleHRDRy5jcHAKLSAg
ICBub3RJbXBsZW1lbnRlZCgpOwotICAgIHJldHVybiAwOwotfQotI2VuZGlmCi0KIH0KSW5kZXg6
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENhaXJvV2luLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0Nv
bnRleHRDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbi9HcmFwaGljc0NvbnRleHRDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAg
KzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkdyYXBo
aWNzQ29udGV4dC5oIgorCisjaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCisjaW5jbHVkZSAi
Tm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQYXRoLmgiCisKKyNpbmNsdWRlIDxjYWlyby13
aW4zMi5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K0dyYXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0KEhEQyBoZGMpCit7CisgICAgbV9kYXRh
LT5tX2hkYyA9IGhkYzsKKyAgICBzZXRQYWludGluZ0Rpc2FibGVkKCFtX2RhdGEtPm1fY2dDb250
ZXh0KTsKKyAgICBpZiAobV9kYXRhLT5tX2NnQ29udGV4dCkgeworICAgICAgICAvLyBNYWtlIHN1
cmUgdGhlIGNvbnRleHQgc3RhcnRzIGluIHN5bmMgd2l0aCBvdXIgc3RhdGUuCisgICAgICAgIHNl
dFBsYXRmb3JtRmlsbENvbG9yKGZpbGxDb2xvcigpKTsKKyAgICAgICAgc2V0UGxhdGZvcm1TdHJv
a2VDb2xvcihzdHJva2VDb2xvcigpKTsKKyAgICB9Cit9CisKK0hEQyBHcmFwaGljc0NvbnRleHQ6
OmdldFdpbmRvd3NDb250ZXh0KGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGJvb2wgc3VwcG9ydEFs
cGhhQmxlbmQpCit7CisgICAgLy8gVGhpcyBpcyBwcm9iYWJseSB3cm9uZywgYW5kIGRlZmluaXRl
bHkgb3V0IG9mIGRhdGUuICBQdWxsZWQgZnJvbSBvbGQgU1ZOCisgICAgY2Fpcm9fc3VyZmFjZV90
KiBzdXJmYWNlID0gY2Fpcm9fZ2V0X3RhcmdldChwbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgSERD
IGhkYyA9IGNhaXJvX3dpbjMyX3N1cmZhY2VfZ2V0X2RjKHN1cmZhY2UpOyAgIAorICAgIFNhdmVE
QyhoZGMpOworCisgICAgLy8gRklYTUU6IFdlIG5lZWQgdG8gbWFrZSBzdXJlIGEgY2xpcCBpcyBy
ZWFsbHkgc2V0IG9uIHRoZSBIREMuCisgICAgLy8gQ2FsbCBTZXRXb3JsZFRyYW5zZm9ybSB0byBo
b25vciB0aGUgY3VycmVudCBDYWlybyB0cmFuc2Zvcm0uCisgICAgU2V0R3JhcGhpY3NNb2RlKGhk
YywgR01fQURWQU5DRUQpOyAvLyBXZSBuZWVkIHRoaXMgY2FsbCBmb3IgdGhlbWVzIHRvIGhvbm9y
IHdvcmxkIHRyYW5zZm9ybXMuCisgICAgY2Fpcm9fbWF0cml4X3QgbWF0OworICAgIGNhaXJvX2dl
dF9tYXRyaXgocGxhdGZvcm1Db250ZXh0KCksICZtYXQpOworICAgIFhGT1JNIHhmb3JtOworICAg
IHhmb3JtLmVNMTEgPSBtYXQueHg7CisgICAgeGZvcm0uZU0xMiA9IG1hdC54eTsKKyAgICB4Zm9y
bS5lTTIxID0gbWF0Lnl4OworICAgIHhmb3JtLmVNMjIgPSBtYXQueXk7CisgICAgeGZvcm0uZUR4
ID0gbWF0LngwOworICAgIHhmb3JtLmVEeSA9IG1hdC55MDsKKyAgICBTZXRXb3JsZFRyYW5zZm9y
bShoZGMsICZ4Zm9ybSk7CisKKyAgICByZXR1cm4gaGRjOworfQorCitib29sIEdyYXBoaWNzQ29u
dGV4dDo6aW5UcmFuc3BhcmVuY3lMYXllcigpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS0+bV90cmFu
c3BhcmVuY3lDb3VudDsgfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6cmVsZWFzZVdpbmRvd3ND
b250ZXh0KEhEQyBoZGMsIGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGJvb2wgc3VwcG9ydEFscGhh
QmxlbmQpCit7CisgICAgY2Fpcm9fc3VyZmFjZV90KiBzdXJmYWNlID0gY2Fpcm9fZ2V0X3Rhcmdl
dChwbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgSERDIGhkYzIgPSBjYWlyb193aW4zMl9zdXJmYWNl
X2dldF9kYyhzdXJmYWNlKTsKKyAgICBSZXN0b3JlREMoaGRjMiwgLTEpOworICAgIGNhaXJvX3N1
cmZhY2VfbWFya19kaXJ0eShzdXJmYWNlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGU6OmNvbmNhdENUTShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSkK
K3sKKyAgICBpZiAoIW1faGRjKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb19tYXRyaXhf
dCBtYXQ7CisgICAgY2Fpcm9fZ2V0X21hdHJpeChwbGF0Zm9ybUNvbnRleHQoKSwgJm1hdCk7Cisg
ICAgWEZPUk0geGZvcm07CisgICAgeGZvcm0uZU0xMSA9IG1hdC54eDsKKyAgICB4Zm9ybS5lTTEy
ID0gbWF0Lnh5OworICAgIHhmb3JtLmVNMjEgPSBtYXQueXg7CisgICAgeGZvcm0uZU0yMiA9IG1h
dC55eTsKKyAgICB4Zm9ybS5lRHggPSBtYXQueDA7CisgICAgeGZvcm0uZUR5ID0gbWF0LnkwOwor
CisgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBM
WSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3Rm9jdXNSaW5nKGNvbnN0IENvbG9y
JiBjb2xvcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJh
d0xpbmVGb3JNaXNzcGVsbGluZ09yQmFkR3JhbW1hcihjb25zdCBJbnRQb2ludCYgcG9pbnQsIGlu
dCB3aWR0aCwgYm9vbCBncmFtbWFyKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK30KSW5kZXg6IFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dFdpbi5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0V2lu
LmNwcAkocmV2aXNpb24gMjk4MzQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9H
cmFwaGljc0NvbnRleHRXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoK
LSAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUs
IDIwMDYsIDIwMDcsIDIwMDggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yOSw4ICsyOSw2IEBACiAjaW5jbHVkZSAiQWZm
aW5lVHJhbnNmb3JtLmgiCiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRlICJQ
YXRoLmgiCi0jaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NHQml0bWFwQ29udGV4dC5oPgotI2luY2x1
ZGUgPFdlYktpdFN5c3RlbUludGVyZmFjZS9XZWJLaXRTeXN0ZW1JbnRlcmZhY2UuaD4KICNpbmNs
dWRlIDx3dGYvTWF0aEV4dHJhcy5oPgogCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0UGxhdGZv
cm1Qcml2YXRlLmgiCkBAIC00MSwxMzYgKzM5LDggQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiBj
bGFzcyBTVkdSZXNvdXJjZUltYWdlOwogCi1zdGF0aWMgQ0dDb250ZXh0UmVmIENHQ29udGV4dFdp
dGhIREMoSERDIGhkYykKLXsKLSAgICBIQklUTUFQIGJpdG1hcCA9IChIQklUTUFQKUdldEN1cnJl
bnRPYmplY3QoaGRjLCBPQkpfQklUTUFQKTsKLSAgICBDR0NvbG9yU3BhY2VSZWYgZGV2aWNlUkdC
ID0gQ0dDb2xvclNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7Ci0gICAgQklUTUFQIGluZm87Ci0KLSAg
ICBHZXRPYmplY3QoYml0bWFwLCBzaXplb2YoaW5mbyksICZpbmZvKTsKLSAgICBBU1NFUlQoaW5m
by5ibUJpdHNQaXhlbCA9PSAzMik7Ci0gICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBDR0JpdG1h
cENvbnRleHRDcmVhdGUoaW5mby5ibUJpdHMsIGluZm8uYm1XaWR0aCwgaW5mby5ibUhlaWdodCwg
OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZv
LmJtV2lkdGhCeXRlcywgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IGtD
R0ltYWdlQWxwaGFOb25lU2tpcEZpcnN0KTsKLSAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKGRldmlj
ZVJHQik7Ci0KLSAgICAvLyBGbGlwIGNvb3JkcwotICAgIENHQ29udGV4dFRyYW5zbGF0ZUNUTShj
b250ZXh0LCAwLCBpbmZvLmJtSGVpZ2h0KTsKLSAgICBDR0NvbnRleHRTY2FsZUNUTShjb250ZXh0
LCAxLCAtMSk7Ci0gICAgCi0gICAgLy8gUHV0IHRoZSBIREMgSW4gYWR2YW5jZWQgbW9kZSBzbyBp
dCB3aWxsIGhvbm9yIGFmZmluZSB0cmFuc2Zvcm1zLgotICAgIFNldEdyYXBoaWNzTW9kZShoZGMs
IEdNX0FEVkFOQ0VEKTsKLSAgICAKLSAgICByZXR1cm4gY29udGV4dDsKLX0KLQotR3JhcGhpY3ND
b250ZXh0OjpHcmFwaGljc0NvbnRleHQoSERDIGhkYykKLSAgICA6IG1fY29tbW9uKGNyZWF0ZUdy
YXBoaWNzQ29udGV4dFByaXZhdGUoKSkKLSAgICAsIG1fZGF0YShuZXcgR3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlKENHQ29udGV4dFdpdGhIREMoaGRjKSkpCi17Ci0gICAgQ0dDb250ZXh0
UmVsZWFzZShtX2RhdGEtPm1fY2dDb250ZXh0KTsKLSAgICBtX2RhdGEtPm1faGRjID0gaGRjOwot
ICAgIHNldFBhaW50aW5nRGlzYWJsZWQoIW1fZGF0YS0+bV9jZ0NvbnRleHQpOwotICAgIGlmICht
X2RhdGEtPm1fY2dDb250ZXh0KSB7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGV4dCBz
dGFydHMgaW4gc3luYyB3aXRoIG91ciBzdGF0ZS4KLSAgICAgICAgc2V0UGxhdGZvcm1GaWxsQ29s
b3IoZmlsbENvbG9yKCkpOwotICAgICAgICBzZXRQbGF0Zm9ybVN0cm9rZUNvbG9yKHN0cm9rZUNv
bG9yKCkpOwotICAgIH0KLX0KLQotSERDIEdyYXBoaWNzQ29udGV4dDo6Z2V0V2luZG93c0NvbnRl
eHQoY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVuZCkKLXsKLSAg
ICBpZiAoaW5UcmFuc3BhcmVuY3lMYXllcigpKSB7Ci0gICAgICAgIGlmIChkc3RSZWN0LmlzRW1w
dHkoKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIGJpdG1h
cCBEQyBpbiB3aGljaCB0byBkcmF3LgotICAgICAgICBCSVRNQVBJTkZPIGJpdG1hcEluZm87Ci0g
ICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpU2l6ZSAgICAgICAgICA9IHNpemVvZihCSVRN
QVBJTkZPSEVBREVSKTsKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlXaWR0aCAgICAg
ICAgID0gZHN0UmVjdC53aWR0aCgpOyAKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlI
ZWlnaHQgICAgICAgID0gZHN0UmVjdC5oZWlnaHQoKTsKLSAgICAgICAgYml0bWFwSW5mby5ibWlI
ZWFkZXIuYmlQbGFuZXMgICAgICAgID0gMTsKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIu
YmlCaXRDb3VudCAgICAgID0gMzI7Ci0gICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpQ29t
cHJlc3Npb24gICA9IEJJX1JHQjsKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlTaXpl
SW1hZ2UgICAgID0gMDsKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlYUGVsc1Blck1l
dGVyID0gMDsKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlZUGVsc1Blck1ldGVyID0g
MDsKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlDbHJVc2VkICAgICAgID0gMDsKLSAg
ICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlDbHJJbXBvcnRhbnQgID0gMDsKLQotICAgICAg
ICB2b2lkKiBwaXhlbHMgPSAwOwotICAgICAgICBIQklUTUFQIGJpdG1hcCA9IDo6Q3JlYXRlRElC
U2VjdGlvbihOVUxMLCAmYml0bWFwSW5mbywgRElCX1JHQl9DT0xPUlMsICZwaXhlbHMsIDAsIDAp
OwotICAgICAgICBpZiAoIWJpdG1hcCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAg
IEhEQyBiaXRtYXBEQyA9IDo6Q3JlYXRlQ29tcGF0aWJsZURDKG1fZGF0YS0+bV9oZGMpOwotICAg
ICAgICA6OlNlbGVjdE9iamVjdChiaXRtYXBEQywgYml0bWFwKTsKLQotICAgICAgICAvLyBGaWxs
IG91ciBidWZmZXIgd2l0aCBjbGVhciBpZiB3ZSdyZSBnb2luZyB0byBhbHBoYSBibGVuZC4KLSAg
ICAgICAgaWYgKHN1cHBvcnRBbHBoYUJsZW5kKSB7Ci0gICAgICAgICAgICBCSVRNQVAgYm1wSW5m
bzsKLSAgICAgICAgICAgIEdldE9iamVjdChiaXRtYXAsIHNpemVvZihibXBJbmZvKSwgJmJtcElu
Zm8pOwotICAgICAgICAgICAgaW50IGJ1ZmZlclNpemUgPSBibXBJbmZvLmJtV2lkdGhCeXRlcyAq
IGJtcEluZm8uYm1IZWlnaHQ7Ci0gICAgICAgICAgICBtZW1zZXQoYm1wSW5mby5ibUJpdHMsIDAs
IGJ1ZmZlclNpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGNhbiBk
byB3b3JsZCB0cmFuc2Zvcm1zLgotICAgICAgICBTZXRHcmFwaGljc01vZGUoYml0bWFwREMsIEdN
X0FEVkFOQ0VEKTsKLQotICAgICAgICAvLyBBcHBseSBhIHRyYW5zbGF0aW9uIHRvIG91ciBjb250
ZXh0IHNvIHRoYXQgdGhlIGRyYXdpbmcgZG9uZSB3aWxsIGJlIGF0ICgwLDApIG9mIHRoZSBiaXRt
YXAuCi0gICAgICAgIFhGT1JNIHhmb3JtOwotICAgICAgICB4Zm9ybS5lTTExID0gMS4wOwotICAg
ICAgICB4Zm9ybS5lTTEyID0gMDsKLSAgICAgICAgeGZvcm0uZU0yMSA9IDA7Ci0gICAgICAgIHhm
b3JtLmVNMjIgPSAxLjA7Ci0gICAgICAgIHhmb3JtLmVEeCA9IC1kc3RSZWN0LngoKTsKLSAgICAg
ICAgeGZvcm0uZUR5ID0gLWRzdFJlY3QueSgpOwotICAgICAgICA6OlNldFdvcmxkVHJhbnNmb3Jt
KGJpdG1hcERDLCAmeGZvcm0pOwotCi0gICAgICAgIHJldHVybiBiaXRtYXBEQzsKLSAgICB9Ci0K
LSAgICBDR0NvbnRleHRGbHVzaChwbGF0Zm9ybUNvbnRleHQoKSk7Ci0gICAgbV9kYXRhLT5zYXZl
KCk7Ci0gICAgcmV0dXJuIG1fZGF0YS0+bV9oZGM7Ci19Ci0KIGJvb2wgR3JhcGhpY3NDb250ZXh0
OjppblRyYW5zcGFyZW5jeUxheWVyKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLT5tX3RyYW5zcGFy
ZW5jeUNvdW50OyB9CiAKLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpyZWxlYXNlV2luZG93c0NvbnRl
eHQoSERDIGhkYywgY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVu
ZCkKLXsKLSAgICBpZiAoaGRjICYmIGluVHJhbnNwYXJlbmN5TGF5ZXIoKSkgewotICAgICAgICBp
ZiAoZHN0UmVjdC5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgSEJJ
VE1BUCBiaXRtYXAgPSAoSEJJVE1BUClHZXRDdXJyZW50T2JqZWN0KGhkYywgT0JKX0JJVE1BUCk7
Ci0KLSAgICAgICAgLy8gTmVlZCB0byBtYWtlIGEgQ0dJbWFnZSBvdXQgb2YgdGhlIGJpdG1hcCdz
IHBpeGVsIGJ1ZmZlciBhbmQgdGhlbiBkcmF3Ci0gICAgICAgIC8vIGl0IGludG8gb3VyIGNvbnRl
eHQuCi0gICAgICAgIEJJVE1BUCBpbmZvOwotICAgICAgICBHZXRPYmplY3QoYml0bWFwLCBzaXpl
b2YoaW5mbyksICZpbmZvKTsKLSAgICAgICAgQVNTRVJUKGluZm8uYm1CaXRzUGl4ZWwgPT0gMzIp
OwotCi0gICAgICAgIENHQ29sb3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVh
dGVEZXZpY2VSR0IoKTsKLSAgICAgICAgQ0dDb250ZXh0UmVmIGJpdG1hcENvbnRleHQgPSBDR0Jp
dG1hcENvbnRleHRDcmVhdGUoaW5mby5ibUJpdHMsIGluZm8uYm1XaWR0aCwgaW5mby5ibUhlaWdo
dCwgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9yZGVy
MzJMaXR0bGUgfCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKHN1cHBvcnRBbHBoYUJsZW5kID8ga0NHSW1hZ2VBbHBoYVByZW11bHRp
cGxpZWRGaXJzdCA6IGtDR0ltYWdlQWxwaGFOb25lU2tpcEZpcnN0KSk7Ci0gICAgICAgIENHQ29s
b3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKLQotICAgICAgICBDR0ltYWdlUmVmIGltYWdlID0g
Q0dCaXRtYXBDb250ZXh0Q3JlYXRlSW1hZ2UoYml0bWFwQ29udGV4dCk7Ci0gICAgICAgIENHQ29u
dGV4dERyYXdJbWFnZShtX2RhdGEtPm1fY2dDb250ZXh0LCBkc3RSZWN0LCBpbWFnZSk7Ci0gICAg
ICAgIAotICAgICAgICAvLyBEZWxldGUgYWxsIG91ciBqdW5rLgotICAgICAgICBDR0ltYWdlUmVs
ZWFzZShpbWFnZSk7Ci0gICAgICAgIENHQ29udGV4dFJlbGVhc2UoYml0bWFwQ29udGV4dCk7Ci0g
ICAgICAgIDo6RGVsZXRlREMoaGRjKTsKLSAgICAgICAgOjpEZWxldGVPYmplY3QoYml0bWFwKTsK
LQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbV9kYXRhLT5yZXN0b3JlKCk7Ci19Ci0K
IHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpzYXZlKCkKIHsKICAgICBpZiAo
IW1faGRjKQpAQCAtMjAzLDExICs3MywxMSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3Jt
UHJpdmF0ZTo6c2NhCiAgICAgICAgIHJldHVybjsKICAgICBYRk9STSB4Zm9ybTsKICAgICB4Zm9y
bS5lTTExID0gc2l6ZS53aWR0aCgpOwotICAgIHhmb3JtLmVNMTIgPSAwOwotICAgIHhmb3JtLmVN
MjEgPSAwOworICAgIHhmb3JtLmVNMTIgPSAwLjBmOworICAgIHhmb3JtLmVNMjEgPSAwLjBmOwog
ICAgIHhmb3JtLmVNMjIgPSBzaXplLmhlaWdodCgpOwotICAgIHhmb3JtLmVEeCA9IDA7Ci0gICAg
eGZvcm0uZUR5ID0gMDsKKyAgICB4Zm9ybS5lRHggPSAwLjBmOworICAgIHhmb3JtLmVEeSA9IDAu
MGY7CiAgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxU
SVBMWSk7CiB9CiAKQEAgLTIyMyw4ICs5Myw4IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZv
cm1Qcml2YXRlOjpyb3QKICAgICB4Zm9ybS5lTTEyID0gLXNpbkFuZ2xlOwogICAgIHhmb3JtLmVN
MjEgPSBzaW5BbmdsZTsKICAgICB4Zm9ybS5lTTIyID0gY29zQW5nbGU7Ci0gICAgeGZvcm0uZUR4
ID0gMDsKLSAgICB4Zm9ybS5lRHkgPSAwOworICAgIHhmb3JtLmVEeCA9IDAuMGY7CisgICAgeGZv
cm0uZUR5ID0gMC4wZjsKICAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShtX2hkYywgJnhmb3JtLCBN
V1RfTEVGVE1VTFRJUExZKTsKIH0KIApAQCAtMjMzLDE0NyArMTAzLDE1IEBAIHZvaWQgR3JhcGhp
Y3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjp0cmEKICAgICBpZiAoIW1faGRjKQogICAgICAgICBy
ZXR1cm47CiAgICAgWEZPUk0geGZvcm07Ci0gICAgeGZvcm0uZU0xMSA9IDEuMDsKLSAgICB4Zm9y
bS5lTTEyID0gMDsKLSAgICB4Zm9ybS5lTTIxID0gMDsKLSAgICB4Zm9ybS5lTTIyID0gMS4wOwor
ICAgIHhmb3JtLmVNMTEgPSAxLjBmOworICAgIHhmb3JtLmVNMTIgPSAwLjBmOworICAgIHhmb3Jt
LmVNMjEgPSAwLjBmOworICAgIHhmb3JtLmVNMjIgPSAxLjBmOwogICAgIHhmb3JtLmVEeCA9IHg7
CiAgICAgeGZvcm0uZUR5ID0geTsKICAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShtX2hkYywgJnhm
b3JtLCBNV1RfTEVGVE1VTFRJUExZKTsKIH0KIAotdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9y
bVByaXZhdGU6OmNvbmNhdENUTShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSkKLXsK
LSAgICBpZiAoIW1faGRjKQotICAgICAgICByZXR1cm47Ci0gICAgQ0dBZmZpbmVUcmFuc2Zvcm0g
bWF0ID0gdHJhbnNmb3JtOwotICAgIFhGT1JNIHhmb3JtOwotICAgIHhmb3JtLmVNMTEgPSBtYXQu
YTsKLSAgICB4Zm9ybS5lTTEyID0gbWF0LmI7Ci0gICAgeGZvcm0uZU0yMSA9IG1hdC5jOwotICAg
IHhmb3JtLmVNMjIgPSBtYXQuZDsKLSAgICB4Zm9ybS5lRHggPSBtYXQudHg7Ci0gICAgeGZvcm0u
ZUR5ID0gbWF0LnR5OwotICAgIE1vZGlmeVdvcmxkVHJhbnNmb3JtKG1faGRjLCAmeGZvcm0sIE1X
VF9MRUZUTVVMVElQTFkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0ZvY3VzUmlu
Zyhjb25zdCBDb2xvciYgY29sb3IpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgZmxvYXQgcmFkaXVzID0gKGZvY3VzUmluZ1dpZHRoKCkgLSAx
KSAvIDIuMGY7Ci0gICAgaW50IG9mZnNldCA9IHJhZGl1cyArIGZvY3VzUmluZ09mZnNldCgpOwot
ICAgIENHQ29sb3JSZWYgY29sb3JSZWYgPSBjb2xvci5pc1ZhbGlkKCkgPyBjZ0NvbG9yKGNvbG9y
KSA6IDA7Ci0KLSAgICBDR011dGFibGVQYXRoUmVmIGZvY3VzUmluZ1BhdGggPSBDR1BhdGhDcmVh
dGVNdXRhYmxlKCk7Ci0gICAgY29uc3QgVmVjdG9yPEludFJlY3Q+JiByZWN0cyA9IGZvY3VzUmlu
Z1JlY3RzKCk7Ci0gICAgdW5zaWduZWQgcmVjdENvdW50ID0gcmVjdHMuc2l6ZSgpOwotICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCByZWN0Q291bnQ7IGkrKykKLSAgICAgICAgQ0dQYXRoQWRk
UmVjdChmb2N1c1JpbmdQYXRoLCAwLCBDR1JlY3RJbnNldChyZWN0c1tpXSwgLW9mZnNldCwgLW9m
ZnNldCkpOwotCi0gICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsK
LSAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQpOwotCi0gICAgQ0dDb250ZXh0QmVnaW5Q
YXRoKGNvbnRleHQpOwotICAgIENHQ29udGV4dEFkZFBhdGgoY29udGV4dCwgZm9jdXNSaW5nUGF0
aCk7Ci0KLSAgICB3a0RyYXdGb2N1c1JpbmcoY29udGV4dCwgY29sb3JSZWYsIHJhZGl1cyk7Ci0K
LSAgICBDR0NvbG9yUmVsZWFzZShjb2xvclJlZik7Ci0KLSAgICBDR1BhdGhSZWxlYXNlKGZvY3Vz
UmluZ1BhdGgpOwotCi0gICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShjb250ZXh0KTsKLX0KLQot
c3RhdGljIGNvbnN0IENvbG9yJiBzcGVsbGluZ1BhdHRlcm5Db2xvcigpIHsKLSAgICBzdGF0aWMg
Y29uc3QgQ29sb3Igc3BlbGxpbmdDb2xvcigyNTUsIDAsIDApOwotICAgIHJldHVybiBzcGVsbGlu
Z0NvbG9yOwotfQotCi1zdGF0aWMgY29uc3QgQ29sb3ImIGdyYW1tYXJQYXR0ZXJuQ29sb3IoKSB7
Ci0gICAgc3RhdGljIGNvbnN0IENvbG9yIGdyYW1tYXJDb2xvcigwLCAxMjgsIDApOwotICAgIHJl
dHVybiBncmFtbWFyQ29sb3I7Ci19Ci0KLS8vIFB1bGxlZCBmcm9tIEdyYXBoaWNzQ29udGV4dENH
Ci1zdGF0aWMgdm9pZCBzZXRDR1N0cm9rZUNvbG9yKENHQ29udGV4dFJlZiBjb250ZXh0LCBjb25z
dCBDb2xvciYgY29sb3IpCi17Ci0gICAgQ0dGbG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsK
LSAgICBjb2xvci5nZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLSAgICBDR0NvbnRl
eHRTZXRSR0JTdHJva2VDb2xvcihjb250ZXh0LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvck1pc3NwZWxsaW5nT3JCYWRHcmFt
bWFyKGNvbnN0IEludFBvaW50JiBwb2ludCwgaW50IHdpZHRoLCBib29sIGdyYW1tYXIpCi17Ci0g
ICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIC8v
IFRoZXNlIGFyZSB0aGUgc2FtZSBmb3IgbWlzc3BlbGxpbmcgb3IgYmFkIGdyYW1tYXIKLSAgICBj
b25zdCBpbnQgcGF0dGVybkhlaWdodCA9IDM7IC8vIDMgcm93cwotICAgIEFTU0VSVChjTWlzc3Bl
bGxpbmdMaW5lVGhpY2tuZXNzID09IHBhdHRlcm5IZWlnaHQpOwotICAgIGNvbnN0IGludCBwYXR0
ZXJuV2lkdGggPSA0OyAvLyA0IHBpeGVscwotICAgIEFTU0VSVChwYXR0ZXJuV2lkdGggPT0gY01p
c3NwZWxsaW5nTGluZVBhdHRlcm5XaWR0aCk7Ci0KLSAgICAvLyBNYWtlIHN1cmUgdG8gZHJhdyBv
bmx5IGNvbXBsZXRlIGRvdHMuCi0gICAgLy8gTk9URTogQ29kZSBoZXJlIHVzZWQgdG8gc2hpZnQg
dGhlIHVuZGVybGluZSB0byB0aGUgbGVmdCBhbmQgaW5jcmVhc2UgdGhlIHdpZHRoCi0gICAgLy8g
dG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgZ2V0cyB1bmRlcmxpbmVkLCBidXQgdGhhdCByZXN1bHRz
IGluIGRyYXdpbmcgb3V0IG9mCi0gICAgLy8gYm91bmRzIChlLmcuIHdoZW4gYXQgdGhlIGVkZ2Ug
b2YgYSB2aWV3KSBhbmQgY291bGQgbWFrZSBpdCBhcHBlYXIgdGhhdCB0aGUKLSAgICAvLyBzcGFj
ZSBiZXR3ZWVuIGFkamFjZW50IG1pc3NwZWxsZWQgd29yZHMgd2FzIHVuZGVybGluZWQuCi0gICAg
Ly8gYWxsb3cgc2xpZ2h0bHkgbW9yZSBjb25zaWRlcmluZyB0aGF0IHRoZSBwYXR0ZXJuIGVuZHMg
d2l0aCBhIHRyYW5zcGFyZW50IHBpeGVsCi0gICAgaW50IHdpZHRoTW9kID0gd2lkdGggJSBwYXR0
ZXJuV2lkdGg7Ci0gICAgaWYgKHBhdHRlcm5XaWR0aCAtIHdpZHRoTW9kID4gY01pc3NwZWxsaW5n
TGluZVBhdHRlcm5HYXBXaWR0aCkKLSAgICAgICAgd2lkdGggLT0gd2lkdGhNb2Q7Ci0gICAgICAK
LSAgICAvLyBEcmF3IHRoZSB1bmRlcmxpbmUKLSAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IHBs
YXRmb3JtQ29udGV4dCgpOwotICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7Ci0KLSAg
ICBjb25zdCBDb2xvciYgcGF0dGVybkNvbG9yID0gZ3JhbW1hciA/IGdyYW1tYXJQYXR0ZXJuQ29s
b3IoKSA6IHNwZWxsaW5nUGF0dGVybkNvbG9yKCk7Ci0gICAgc2V0Q0dTdHJva2VDb2xvcihjb250
ZXh0LCBwYXR0ZXJuQ29sb3IpOwotCi0gICAgd2tTZXRQYXR0ZXJuUGhhc2VJblVzZXJTcGFjZShj
b250ZXh0LCBwb2ludCk7Ci0gICAgQ0dDb250ZXh0U2V0QmxlbmRNb2RlKGNvbnRleHQsIGtDR0Js
ZW5kTW9kZU5vcm1hbCk7Ci0gICAgCi0gICAgLy8gMyByb3dzLCBlYWNoIG9mZnNldCBieSBoYWxm
IGEgcGl4ZWwgZm9yIGJsZW5kaW5nIHB1cnBvc2VzCi0gICAgY29uc3QgQ0dQb2ludCB1cHBlclBv
aW50cyBbXSA9IHt7cG9pbnQueCgpLCBwb2ludC55KCkgKyBwYXR0ZXJuSGVpZ2h0IC0gMi41IH0s
IHtwb2ludC54KCkgKyB3aWR0aCwgcG9pbnQueSgpICsgcGF0dGVybkhlaWdodCAtIDIuNX19Owot
ICAgIGNvbnN0IENHUG9pbnQgbWlkZGxlUG9pbnRzIFtdID0ge3twb2ludC54KCksIHBvaW50Lnko
KSArIHBhdHRlcm5IZWlnaHQgLSAxLjUgfSwge3BvaW50LngoKSArIHdpZHRoLCBwb2ludC55KCkg
KyBwYXR0ZXJuSGVpZ2h0IC0gMS41fX07Ci0gICAgY29uc3QgQ0dQb2ludCBsb3dlclBvaW50cyBb
XSA9IHt7cG9pbnQueCgpLCBwb2ludC55KCkgKyBwYXR0ZXJuSGVpZ2h0IC0gMC41IH0sIHtwb2lu
dC54KCkgKyB3aWR0aCwgcG9pbnQueSgpICsgcGF0dGVybkhlaWdodCAtIDAuNSB9fTsKLSAgICAK
LSAgICAvLyBEYXNoIGxlbmd0aHMgZm9yIHRoZSB0b3AgYW5kIGJvdHRvbSBvZiB0aGUgZXJyb3Ig
dW5kZXJsaW5lIGFyZSB0aGUgc2FtZS4KLSAgICAvLyBUaGVzZSBhcmUgbWFnaWMuCi0gICAgc3Rh
dGljIGNvbnN0IGZsb2F0IGVkZ2VfZGFzaF9sZW5ndGhzW10gPSB7MiwgMn07Ci0gICAgc3RhdGlj
IGNvbnN0IGZsb2F0IG1pZGRsZV9kYXNoX2xlbmd0aHNbXSA9IHsyLjc2ZiwgMS4yNGZ9OwotICAg
IHN0YXRpYyBjb25zdCBmbG9hdCBlZGdlX29mZnNldCA9IC0oZWRnZV9kYXNoX2xlbmd0aHNbMV0g
LSAxLjBmKSAvIDIuMGY7Ci0gICAgc3RhdGljIGNvbnN0IGZsb2F0IG1pZGRsZV9vZmZzZXQgPSAt
KG1pZGRsZV9kYXNoX2xlbmd0aHNbMV0gLSAxLjBmKSAvIDIuMGY7Ci0KLSAgICAvLyBMaW5lIG9w
YWNpdGllcy4gIE9uY2UgYWdhaW4sIHRoZXNlIGFyZSBtYWdpYy4KLSAgICBjb25zdCBmbG9hdCB1
cHBlck9wYWNpdHkgPSAwLjMzZjsKLSAgICBjb25zdCBmbG9hdCBtaWRkbGVPcGFjaXR5ID0gMC43
NWY7Ci0gICAgY29uc3QgZmxvYXQgbG93ZXJPcGFjaXR5ID0gMC44OGY7Ci0KLSAgICAvL1RvcCBs
aW5lCi0gICAgQ0dDb250ZXh0U2V0TGluZURhc2goY29udGV4dCwgZWRnZV9vZmZzZXQsIGVkZ2Vf
ZGFzaF9sZW5ndGhzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZWRnZV9kYXNo
X2xlbmd0aHMpIC8gc2l6ZW9mKGVkZ2VfZGFzaF9sZW5ndGhzWzBdKSk7Ci0gICAgQ0dDb250ZXh0
U2V0QWxwaGEoY29udGV4dCwgdXBwZXJPcGFjaXR5KTsKLSAgICBDR0NvbnRleHRTdHJva2VMaW5l
U2VnbWVudHMoY29udGV4dCwgdXBwZXJQb2ludHMsIDIpOwotIAotICAgIC8vIE1pZGRsZSBsaW5l
Ci0gICAgQ0dDb250ZXh0U2V0TGluZURhc2goY29udGV4dCwgbWlkZGxlX29mZnNldCwgbWlkZGxl
X2Rhc2hfbGVuZ3RocywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG1pZGRsZV9k
YXNoX2xlbmd0aHMpIC8gc2l6ZW9mKG1pZGRsZV9kYXNoX2xlbmd0aHNbMF0pKTsKLSAgICBDR0Nv
bnRleHRTZXRBbHBoYShjb250ZXh0LCBtaWRkbGVPcGFjaXR5KTsKLSAgICBDR0NvbnRleHRTdHJv
a2VMaW5lU2VnbWVudHMoY29udGV4dCwgbWlkZGxlUG9pbnRzLCAyKTsKLSAgICAKLSAgICAvLyBC
b3R0b20gbGluZQotICAgIENHQ29udGV4dFNldExpbmVEYXNoKGNvbnRleHQsIGVkZ2Vfb2Zmc2V0
LCBlZGdlX2Rhc2hfbGVuZ3RocywKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZWRn
ZV9kYXNoX2xlbmd0aHMpIC8gc2l6ZW9mKGVkZ2VfZGFzaF9sZW5ndGhzWzBdKSk7Ci0gICAgQ0dD
b250ZXh0U2V0QWxwaGEoY29udGV4dCwgbG93ZXJPcGFjaXR5KTsKLSAgICBDR0NvbnRleHRTdHJv
a2VMaW5lU2VnbWVudHMoY29udGV4dCwgbG93ZXJQb2ludHMsIDIpOwotCi0gICAgQ0dDb250ZXh0
UmVzdG9yZUdTdGF0ZShjb250ZXh0KTsKLX0KLQogI2lmIEVOQUJMRShTVkcpCiBHcmFwaGljc0Nv
bnRleHQqIGNvbnRleHRGb3JJbWFnZShTVkdSZXNvdXJjZUltYWdlKikKIHsKSW5kZXg6IFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ0dXaW4uY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ0dXaW4uY3BwCShyZXZpc2lvbiAyOTgz
NCkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VXaW4uY3BwOjI5ODM0
KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VDR1dpbi5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIw
MDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJCaXRtYXBJbWFnZS5oIgorI2lu
Y2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMv
QXBwbGljYXRpb25TZXJ2aWNlcy5oPgorCisjaW5jbHVkZSA8d2luc29jazIuaD4KKyNpbmNsdWRl
IDx3aW5kb3dzLmg+CisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJNSU1F
VHlwZVJlZ2lzdHJ5LmgiCisjaW5jbHVkZSAiU2hhcmVkQnVmZmVyLmgiCisKKy8vIFRoaXMgZnVu
Y3Rpb24gbG9hZHMgcmVzb3VyY2VzIGZyb20gV2ViS2l0CitQYXNzUmVmUHRyPFdlYkNvcmU6OlNo
YXJlZEJ1ZmZlcj4gbG9hZFJlc291cmNlSW50b0J1ZmZlcihjb25zdCBjaGFyKik7CisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKwordm9pZCBCaXRtYXBJbWFnZTo6aW5pdFBsYXRmb3JtRGF0YSgpCit7
Cit9CisKK3ZvaWQgQml0bWFwSW1hZ2U6OmludmFsaWRhdGVQbGF0Zm9ybURhdGEoKQoreworfQor
CitJbWFnZSogSW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNlKGNvbnN0IGNoYXIgKm5hbWUpCit7
CisgICAgUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gYnVmZmVyID0gbG9hZFJlc291cmNlSW50b0J1ZmZl
cihuYW1lKTsKKyAgICBCaXRtYXBJbWFnZSogaW1nID0gbmV3IEJpdG1hcEltYWdlOworICAgIGlt
Zy0+c2V0RGF0YShidWZmZXIucmVsZWFzZSgpLCB0cnVlKTsKKyAgICByZXR1cm4gaW1nOworfQor
Citib29sIEJpdG1hcEltYWdlOjpnZXRIQklUTUFQKEhCSVRNQVAgYm1wKQoreworICAgIHJldHVy
biBnZXRIQklUTUFQT2ZTaXplKGJtcCwgMCk7Cit9CisKK2Jvb2wgQml0bWFwSW1hZ2U6OmdldEhC
SVRNQVBPZlNpemUoSEJJVE1BUCBibXAsIExQU0laRSBzaXplKQoreworICAgIEFTU0VSVChibXAp
OworCisgICAgQklUTUFQIGJtcEluZm87CisgICAgR2V0T2JqZWN0KGJtcCwgc2l6ZW9mKEJJVE1B
UCksICZibXBJbmZvKTsKKworICAgIEFTU0VSVChibXBJbmZvLmJtQml0c1BpeGVsID09IDMyKTsK
KyAgICBpbnQgYnVmZmVyU2l6ZSA9IGJtcEluZm8uYm1XaWR0aEJ5dGVzICogYm1wSW5mby5ibUhl
aWdodDsKKyAgICAKKyAgICBDR0NvbG9yU3BhY2VSZWYgZGV2aWNlUkdCID0gQ0dDb2xvclNwYWNl
Q3JlYXRlRGV2aWNlUkdCKCk7CisgICAgQ0dDb250ZXh0UmVmIGNnQ29udGV4dCA9IENHQml0bWFw
Q29udGV4dENyZWF0ZShibXBJbmZvLmJtQml0cywgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJt
SGVpZ2h0LAorICAgICAgICA4LCBibXBJbmZvLmJtV2lkdGhCeXRlcywgZGV2aWNlUkdCLCBrQ0dC
aXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFQcmVtdWx0aXBsaWVkRmlyc3Qp
OworICAKKyAgICBHcmFwaGljc0NvbnRleHQgZ2MoY2dDb250ZXh0KTsKKyAgICBJbnRTaXplIGlt
YWdlU2l6ZSA9IEJpdG1hcEltYWdlOjpzaXplKCk7CisgICAgaWYgKHNpemUpCisgICAgICAgIGRy
YXdGcmFtZU1hdGNoaW5nU291cmNlU2l6ZSgmZ2MsIEZsb2F0UmVjdCgwLCAwLCBibXBJbmZvLmJt
V2lkdGgsIGJtcEluZm8uYm1IZWlnaHQpLCBJbnRTaXplKCpzaXplKSwgQ29tcG9zaXRlQ29weSk7
CisgICAgZWxzZQorICAgICAgICBkcmF3KCZnYywgRmxvYXRSZWN0KDAsIDAsIGJtcEluZm8uYm1X
aWR0aCwgYm1wSW5mby5ibUhlaWdodCksIEZsb2F0UmVjdCgwLCAwLCBpbWFnZVNpemUud2lkdGgo
KSwgaW1hZ2VTaXplLmhlaWdodCgpKSwgQ29tcG9zaXRlQ29weSk7CisKKyAgICAvLyBEbyBjbGVh
bnVwCisgICAgQ0dDb250ZXh0UmVsZWFzZShjZ0NvbnRleHQpOworICAgIENHQ29sb3JTcGFjZVJl
bGVhc2UoZGV2aWNlUkdCKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBCaXRtYXBJbWFn
ZTo6ZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXplKEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29u
c3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBjb25zdCBJbnRTaXplJiBzcmNTaXplLCBDb21wb3NpdGVP
cGVyYXRvciBjb21wb3NpdGVPcCkKK3sKKyAgICBpbnQgZnJhbWVzID0gZnJhbWVDb3VudCgpOwor
ICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVzOyArK2kpIHsKKyAgICAgICAgQ0dJbWFnZVJl
ZiBpbWFnZSA9IGZyYW1lQXRJbmRleChpKTsKKyAgICAgICAgaWYgKENHSW1hZ2VHZXRIZWlnaHQo
aW1hZ2UpID09IChzaXplX3Qpc3JjU2l6ZS5oZWlnaHQoKSAmJiBDR0ltYWdlR2V0V2lkdGgoaW1h
Z2UpID09IChzaXplX3Qpc3JjU2l6ZS53aWR0aCgpKSB7CisgICAgICAgICAgICBzaXplX3QgY3Vy
cmVudEZyYW1lID0gbV9jdXJyZW50RnJhbWU7CisgICAgICAgICAgICBtX2N1cnJlbnRGcmFtZSA9
IGk7CisgICAgICAgICAgICBkcmF3KGN0eHQsIGRzdFJlY3QsIEZsb2F0UmVjdCgwLCAwLCBzcmNT
aXplLndpZHRoKCksIHNyY1NpemUuaGVpZ2h0KCkpLCBjb21wb3NpdGVPcCk7CisgICAgICAgICAg
ICBtX2N1cnJlbnRGcmFtZSA9IGN1cnJlbnRGcmFtZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgfQorICAgIH0KKworICAgIC8vIE5vIGltYWdlIG9mIHRoZSBjb3JyZWN0IHNpemUgd2Fz
IGZvdW5kLCBmYWxsYmFjayB0byBkcmF3aW5nIHRoZSBjdXJyZW50IGZyYW1lCisgICAgSW50U2l6
ZSBpbWFnZVNpemUgPSBCaXRtYXBJbWFnZTo6c2l6ZSgpOworICAgIGRyYXcoY3R4dCwgZHN0UmVj
dCwgRmxvYXRSZWN0KDAsIDAsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkp
LCBjb21wb3NpdGVPcCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ0dXaW4uY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ0dXaW4uY3BwCShyZXZpc2lvbiAyOTcy
NikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ0dXaW4uY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAw
NyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4
IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKQEAgLTI5LDM4ICsyOSwxMSBAQAogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5o
IgogI2luY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgog
Ci0jaW5jbHVkZSA8d2luc29jazIuaD4KICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAjaW5jbHVkZSAi
UGxhdGZvcm1TdHJpbmcuaCIKLSNpbmNsdWRlICJNSU1FVHlwZVJlZ2lzdHJ5LmgiCi0jaW5jbHVk
ZSAiU2hhcmVkQnVmZmVyLmgiCi0KLS8vIFRoaXMgZnVuY3Rpb24gbG9hZHMgcmVzb3VyY2VzIGZy
b20gV2ViS2l0Ci1QYXNzUmVmUHRyPFdlYkNvcmU6OlNoYXJlZEJ1ZmZlcj4gbG9hZFJlc291cmNl
SW50b0J1ZmZlcihjb25zdCBjaGFyKik7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotdm9pZCBC
aXRtYXBJbWFnZTo6aW5pdFBsYXRmb3JtRGF0YSgpCi17Ci19Ci0KLXZvaWQgQml0bWFwSW1hZ2U6
OmludmFsaWRhdGVQbGF0Zm9ybURhdGEoKQotewotfQotCi1JbWFnZSogSW1hZ2U6OmxvYWRQbGF0
Zm9ybVJlc291cmNlKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgUmVmUHRyPFNoYXJlZEJ1ZmZl
cj4gYnVmZmVyID0gbG9hZFJlc291cmNlSW50b0J1ZmZlcihuYW1lKTsKLSAgICBCaXRtYXBJbWFn
ZSogaW1nID0gbmV3IEJpdG1hcEltYWdlOwotICAgIGltZy0+c2V0RGF0YShidWZmZXIucmVsZWFz
ZSgpLCB0cnVlKTsKLSAgICByZXR1cm4gaW1nOwotfQotCi1ib29sIEJpdG1hcEltYWdlOjpnZXRI
QklUTUFQKEhCSVRNQVAgYm1wKQotewotICAgIHJldHVybiBnZXRIQklUTUFQT2ZTaXplKGJtcCwg
MCk7Ci19Ci0KIGJvb2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVBPZlNpemUoSEJJVE1BUCBibXAs
IExQU0laRSBzaXplKQogewogICAgIEFTU0VSVChibXApOwpAQCAtNzYsMjcgKzQ5LDMzIEBAIGJv
b2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVBPZlNpemUoSEJJVE0KICAgICAgICAgOCwgYm1wSW5m
by5ibVdpZHRoQnl0ZXMsIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBr
Q0dJbWFnZUFscGhhUHJlbXVsdGlwbGllZEZpcnN0KTsKICAgCiAgICAgR3JhcGhpY3NDb250ZXh0
IGdjKGNnQ29udGV4dCk7CisKICAgICBJbnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcEltYWdlOjpz
aXplKCk7CiAgICAgaWYgKHNpemUpCi0gICAgICAgIGRyYXdGcmFtZU1hdGNoaW5nU291cmNlU2l6
ZSgmZ2MsIEZsb2F0UmVjdCgwLCAwLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQp
LCBJbnRTaXplKCpzaXplKSwgQ29tcG9zaXRlQ29weSk7CisgICAgICAgIGRyYXdGcmFtZU1hdGNo
aW5nU291cmNlU2l6ZSgmZ2MsIEZsb2F0UmVjdCgwLjBmLCAwLjBmLCBibXBJbmZvLmJtV2lkdGgs
IGJtcEluZm8uYm1IZWlnaHQpLCBJbnRTaXplKCpzaXplKSwgQ29tcG9zaXRlQ29weSk7CiAgICAg
ZWxzZQotICAgICAgICBkcmF3KCZnYywgRmxvYXRSZWN0KDAsIDAsIGJtcEluZm8uYm1XaWR0aCwg
Ym1wSW5mby5ibUhlaWdodCksIEZsb2F0UmVjdCgwLCAwLCBpbWFnZVNpemUud2lkdGgoKSwgaW1h
Z2VTaXplLmhlaWdodCgpKSwgQ29tcG9zaXRlQ29weSk7CisgICAgICAgIGRyYXcoJmdjLCBGbG9h
dFJlY3QoMC4wZiwgMC4wZiwgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwgRmxv
YXRSZWN0KDAuMGYsIDAuMGYsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkp
LCBDb21wb3NpdGVDb3B5KTsKIAogICAgIC8vIERvIGNsZWFudXAKICAgICBDR0NvbnRleHRSZWxl
YXNlKGNnQ29udGV4dCk7CiAgICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOworCiAg
ICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgQml0bWFwSW1hZ2U6OmRyYXdGcmFtZU1hdGNoaW5n
U291cmNlU2l6ZShHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVj
dCwgY29uc3QgSW50U2l6ZSYgc3JjU2l6ZSwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3Ap
CiB7CiAgICAgaW50IGZyYW1lcyA9IGZyYW1lQ291bnQoKTsKKyAgICBzaXplX3QgaW1hZ2VIZWln
aHQgPSAwOworICAgIHNpemVfdCBpbWFnZVdpZHRoID0gMDsKICAgICBmb3IgKGludCBpID0gMDsg
aSA8IGZyYW1lczsgKytpKSB7Ci0gICAgICAgIENHSW1hZ2VSZWYgaW1hZ2UgPSBmcmFtZUF0SW5k
ZXgoaSk7Ci0gICAgICAgIGlmIChDR0ltYWdlR2V0SGVpZ2h0KGltYWdlKSA9PSAoc2l6ZV90KXNy
Y1NpemUuaGVpZ2h0KCkgJiYgQ0dJbWFnZUdldFdpZHRoKGltYWdlKSA9PSAoc2l6ZV90KXNyY1Np
emUud2lkdGgoKSkgeworICAgICAgICBOYXRpdmVJbWFnZVB0ciBpbWFnZSA9IGZyYW1lQXRJbmRl
eChpKTsKKyAgICAgICAgaW1hZ2VIZWlnaHQgPSBDR0ltYWdlR2V0SGVpZ2h0KGltYWdlKTsKKyAg
ICAgICAgaW1hZ2VXaWR0aCA9IENHSW1hZ2VHZXRXaWR0aChpbWFnZSk7CisgICAgICAgIGlmIChp
bWFnZUhlaWdodCA9PSBzdGF0aWNfY2FzdDxzaXplX3Q+KHNyY1NpemUuaGVpZ2h0KCkpICYmIGlt
YWdlV2lkdGggPT0gc3RhdGljX2Nhc3Q8c2l6ZV90PihzcmNTaXplLndpZHRoKCkpKSB7CiAgICAg
ICAgICAgICBzaXplX3QgY3VycmVudEZyYW1lID0gbV9jdXJyZW50RnJhbWU7CiAgICAgICAgICAg
ICBtX2N1cnJlbnRGcmFtZSA9IGk7Ci0gICAgICAgICAgICBkcmF3KGN0eHQsIGRzdFJlY3QsIEZs
b2F0UmVjdCgwLCAwLCBzcmNTaXplLndpZHRoKCksIHNyY1NpemUuaGVpZ2h0KCkpLCBjb21wb3Np
dGVPcCk7CisgICAgICAgICAgICBkcmF3KGN0eHQsIGRzdFJlY3QsIEZsb2F0UmVjdCgwLjBmLCAw
LjBmLCBzcmNTaXplLndpZHRoKCksIHNyY1NpemUuaGVpZ2h0KCkpLCBjb21wb3NpdGVPcCk7CiAg
ICAgICAgICAgICBtX2N1cnJlbnRGcmFtZSA9IGN1cnJlbnRGcmFtZTsKICAgICAgICAgICAgIHJl
dHVybjsKICAgICAgICAgfQpAQCAtMTA0LDcgKzgzLDcgQEAgdm9pZCBCaXRtYXBJbWFnZTo6ZHJh
d0ZyYW1lTWF0Y2hpbmdTb3VyYwogCiAgICAgLy8gTm8gaW1hZ2Ugb2YgdGhlIGNvcnJlY3Qgc2l6
ZSB3YXMgZm91bmQsIGZhbGxiYWNrIHRvIGRyYXdpbmcgdGhlIGN1cnJlbnQgZnJhbWUKICAgICBJ
bnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcEltYWdlOjpzaXplKCk7Ci0gICAgZHJhdyhjdHh0LCBk
c3RSZWN0LCBGbG9hdFJlY3QoMCwgMCwgaW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5oZWln
aHQoKSksIGNvbXBvc2l0ZU9wKTsKKyAgICBkcmF3KGN0eHQsIGRzdFJlY3QsIEZsb2F0UmVjdCgw
LjBmLCAwLjBmLCBpbWFnZVNpemUud2lkdGgoKSwgaW1hZ2VTaXplLmhlaWdodCgpKSwgY29tcG9z
aXRlT3ApOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbi9JbWFnZUNhaXJvV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZUNhaXJvV2luLmNwcAkocmV2aXNpb24gMCkKKysr
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ2Fpcm9XaW4uY3BwCShyZXZpc2lv
biAwKQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIElu
Yy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkltYWdlLmgiCisjaW5jbHVkZSAiQml0bWFwSW1hZ2UuaCIKKyNpbmNsdWRlICJHcmFw
aGljc0NvbnRleHQuaCIKKyNpbmNsdWRlIDxjYWlyby5oPgorCisjaW5jbHVkZSA8d2luZG93cy5o
PgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
Ym9vbCBCaXRtYXBJbWFnZTo6Z2V0SEJJVE1BUE9mU2l6ZShIQklUTUFQIGJtcCwgTFBTSVpFIHNp
emUpCit7CisgICAgQVNTRVJUKGJtcCk7CisKKyAgICBCSVRNQVAgYm1wSW5mbzsKKyAgICBHZXRP
YmplY3QoYm1wLCBzaXplb2YoQklUTUFQKSwgJmJtcEluZm8pOworCisgICAgLy8gSWYgdGhpcyBp
cyBhIDMyYnBwIGJpdG1hcCwgd2hpY2ggaXQgYWx3YXlzIHNob3VsZCBiZSwgd2UnbGwgY2xlYXIg
aXQgc28gYWxwaGEtd2lzZSBpdCB3aWxsIGJlIHZpc2libGUKKyAgICBpZiAoYm1wSW5mby5ibUJp
dHNQaXhlbCA9PSAzMikgeworICAgICAgICBpbnQgYnVmZmVyU2l6ZSA9IGJtcEluZm8uYm1XaWR0
aEJ5dGVzICogYm1wSW5mby5ibUhlaWdodDsKKyAgICAgICAgbWVtc2V0KGJtcEluZm8uYm1CaXRz
LCAyNTUsIGJ1ZmZlclNpemUpOworICAgIH0KKyAJCisgICAgSERDIHRlbXBEQyA9IENyZWF0ZUNv
bXBhdGlibGVEQygwKTsKKyAgICBpZiAoIXRlbXBEQykgeworICAgICAgICBMT0dfRVJST1IoIkZh
aWxlZCB0byBjcmVhdGUgaW4tbWVtb3J5IERDIGZvciBJbWFnZTo6YmxpdCgpIik7CisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgU2VsZWN0T2JqZWN0KHRlbXBEQywgYm1wKTsKKyAg
ICBHcmFwaGljc0NvbnRleHQgZ2ModGVtcERDKTsKKyNlbmRpZgorCisgICAgSW50U2l6ZSBpbWFn
ZVNpemUgPSBCaXRtYXBJbWFnZTo6c2l6ZSgpOworICAgIGlmIChzaXplKQorICAgICAgICBkcmF3
RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUoJmdjLCBGbG9hdFJlY3QoMC4wZiwgMC4wZiwgYm1wSW5m
by5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwgSW50U2l6ZSgqc2l6ZSksIENvbXBvc2l0ZUNv
cHkpOworICAgIGVsc2UKKyAgICAgICAgZHJhdygmZ2MsIEZsb2F0UmVjdCgwLjBmLCAwLjBmLCBi
bXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQpLCBGbG9hdFJlY3QoMC4wZiwgMC4wZiwg
aW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIENvbXBvc2l0ZUNvcHkpOwor
CisgICAgLy8gRG8gY2xlYW51cAorICAgIERlbGV0ZURDKHRlbXBEQyk7CisKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKwordm9pZCBCaXRtYXBJbWFnZTo6ZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXpl
KEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBjb25zdCBJ
bnRTaXplJiBzcmNTaXplLCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCkKK3sKKyAgICBp
bnQgZnJhbWVzID0gZnJhbWVDb3VudCgpOworICAgIHNpemVfdCBpbWFnZUhlaWdodCA9IDA7Cisg
ICAgc2l6ZV90IGltYWdlV2lkdGggPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVz
OyArK2kpIHsKKyAgICAgICAgTmF0aXZlSW1hZ2VQdHIgaW1hZ2UgPSBmcmFtZUF0SW5kZXgoaSk7
CisgICAgICAgIGltYWdlSGVpZ2h0ID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfaGVpZ2h0KGlt
YWdlKTsKKyAgICAgICAgaW1hZ2VXaWR0aCA9IGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X3dpZHRo
KGltYWdlKTsKKyAgICAgICAgaWYgKGltYWdlSGVpZ2h0ID09IHN0YXRpY19jYXN0PHNpemVfdD4o
c3JjU2l6ZS5oZWlnaHQoKSkgJiYgaW1hZ2VXaWR0aCA9PSBzdGF0aWNfY2FzdDxzaXplX3Q+KHNy
Y1NpemUud2lkdGgoKSkpIHsKKyAgICAgICAgICAgIHNpemVfdCBjdXJyZW50RnJhbWUgPSBtX2N1
cnJlbnRGcmFtZTsKKyAgICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gaTsKKyAgICAgICAgICAg
IGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRSZWN0KDAuMGYsIDAuMGYsIHNyY1NpemUud2lkdGgo
KSwgc3JjU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsKKyAgICAgICAgICAgIG1fY3VycmVu
dEZyYW1lID0gY3VycmVudEZyYW1lOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9Cisg
ICAgfQorCisgICAgLy8gTm8gaW1hZ2Ugb2YgdGhlIGNvcnJlY3Qgc2l6ZSB3YXMgZm91bmQsIGZh
bGxiYWNrIHRvIGRyYXdpbmcgdGhlIGN1cnJlbnQgZnJhbWUKKyAgICBJbnRTaXplIGltYWdlU2l6
ZSA9IEJpdG1hcEltYWdlOjpzaXplKCk7CisgICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJl
Y3QoMC4wZiwgMC4wZiwgaW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIGNv
bXBvc2l0ZU9wKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZVdpbi5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIElu
Yy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIw
MDggQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucwpAQCAtMjYsMTMgKzI2LDcgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNs
dWRlICJJbWFnZS5oIgogI2luY2x1ZGUgIkJpdG1hcEltYWdlLmgiCi0jaW5jbHVkZSAiR3JhcGhp
Y3NDb250ZXh0LmgiCi0jaW5jbHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNl
cnZpY2VzLmg+CiAKLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgotI2luY2x1ZGUgPHdpbmRvd3MuaD4K
LSNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgotI2luY2x1ZGUgIk1JTUVUeXBlUmVnaXN0cnku
aCIKICNpbmNsdWRlICJTaGFyZWRCdWZmZXIuaCIKIAogLy8gVGhpcyBmdW5jdGlvbiBsb2FkcyBy
ZXNvdXJjZXMgZnJvbSBXZWJLaXQKQEAgLTYxLDUwICs1NSw0IEBAIGJvb2wgQml0bWFwSW1hZ2U6
OmdldEhCSVRNQVAoSEJJVE1BUCBibXAKICAgICByZXR1cm4gZ2V0SEJJVE1BUE9mU2l6ZShibXAs
IDApOwogfQogCi1ib29sIEJpdG1hcEltYWdlOjpnZXRIQklUTUFQT2ZTaXplKEhCSVRNQVAgYm1w
LCBMUFNJWkUgc2l6ZSkKLXsKLSAgICBBU1NFUlQoYm1wKTsKLQotICAgIEJJVE1BUCBibXBJbmZv
OwotICAgIEdldE9iamVjdChibXAsIHNpemVvZihCSVRNQVApLCAmYm1wSW5mbyk7Ci0KLSAgICBB
U1NFUlQoYm1wSW5mby5ibUJpdHNQaXhlbCA9PSAzMik7Ci0gICAgaW50IGJ1ZmZlclNpemUgPSBi
bXBJbmZvLmJtV2lkdGhCeXRlcyAqIGJtcEluZm8uYm1IZWlnaHQ7Ci0gICAgCi0gICAgQ0dDb2xv
clNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwotICAg
IENHQ29udGV4dFJlZiBjZ0NvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUoYm1wSW5mby5i
bUJpdHMsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCwKLSAgICAgICAgOCwgYm1w
SW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUg
fCBrQ0dJbWFnZUFscGhhUHJlbXVsdGlwbGllZEZpcnN0KTsKLSAgCi0gICAgR3JhcGhpY3NDb250
ZXh0IGdjKGNnQ29udGV4dCk7Ci0gICAgSW50U2l6ZSBpbWFnZVNpemUgPSBCaXRtYXBJbWFnZTo6
c2l6ZSgpOwotICAgIGlmIChzaXplKQotICAgICAgICBkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNp
emUoJmdjLCBGbG9hdFJlY3QoMCwgMCwgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0
KSwgSW50U2l6ZSgqc2l6ZSksIENvbXBvc2l0ZUNvcHkpOwotICAgIGVsc2UKLSAgICAgICAgZHJh
dygmZ2MsIEZsb2F0UmVjdCgwLCAwLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQp
LCBGbG9hdFJlY3QoMCwgMCwgaW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSks
IENvbXBvc2l0ZUNvcHkpOwotCi0gICAgLy8gRG8gY2xlYW51cAotICAgIENHQ29udGV4dFJlbGVh
c2UoY2dDb250ZXh0KTsKLSAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKGRldmljZVJHQik7Ci0gICAg
cmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQml0bWFwSW1hZ2U6OmRyYXdGcmFtZU1hdGNoaW5nU291
cmNlU2l6ZShHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwg
Y29uc3QgSW50U2l6ZSYgc3JjU2l6ZSwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApCi17
Ci0gICAgaW50IGZyYW1lcyA9IGZyYW1lQ291bnQoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8
IGZyYW1lczsgKytpKSB7Ci0gICAgICAgIENHSW1hZ2VSZWYgaW1hZ2UgPSBmcmFtZUF0SW5kZXgo
aSk7Ci0gICAgICAgIGlmIChDR0ltYWdlR2V0SGVpZ2h0KGltYWdlKSA9PSAoc2l6ZV90KXNyY1Np
emUuaGVpZ2h0KCkgJiYgQ0dJbWFnZUdldFdpZHRoKGltYWdlKSA9PSAoc2l6ZV90KXNyY1NpemUu
d2lkdGgoKSkgewotICAgICAgICAgICAgc2l6ZV90IGN1cnJlbnRGcmFtZSA9IG1fY3VycmVudEZy
YW1lOwotICAgICAgICAgICAgbV9jdXJyZW50RnJhbWUgPSBpOwotICAgICAgICAgICAgZHJhdyhj
dHh0LCBkc3RSZWN0LCBGbG9hdFJlY3QoMCwgMCwgc3JjU2l6ZS53aWR0aCgpLCBzcmNTaXplLmhl
aWdodCgpKSwgY29tcG9zaXRlT3ApOwotICAgICAgICAgICAgbV9jdXJyZW50RnJhbWUgPSBjdXJy
ZW50RnJhbWU7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAv
LyBObyBpbWFnZSBvZiB0aGUgY29ycmVjdCBzaXplIHdhcyBmb3VuZCwgZmFsbGJhY2sgdG8gZHJh
d2luZyB0aGUgY3VycmVudCBmcmFtZQotICAgIEludFNpemUgaW1hZ2VTaXplID0gQml0bWFwSW1h
Z2U6OnNpemUoKTsKLSAgICBkcmF3KGN0eHQsIGRzdFJlY3QsIEZsb2F0UmVjdCgwLCAwLCBpbWFn
ZVNpemUud2lkdGgoKSwgaW1hZ2VTaXplLmhlaWdodCgpKSwgY29tcG9zaXRlT3ApOwotfQotCiB9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bi9TaW1wbGVGb250RGF0YUNHV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNHV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCShm
cm9tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhV2luLmNwcDoy
OTgzNCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ0dX
aW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjgxIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJ
bmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBt
YXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAg
IGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz
c2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRT
IENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElU
UyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisg
KiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNpbXBsZUZvbnREYXRhLmgiCisKKyNpbmNsdWRlIDx3
aW5zb2NrMi5oPgorI2luY2x1ZGUgIkZvbnQuaCIKKyNpbmNsdWRlICJGb250Q2FjaGUuaCIKKyNp
bmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJGb250RGVzY3JpcHRpb24uaCIKKyNpbmNs
dWRlIDx3dGYvTWF0aEV4dHJhcy5oPgorI2luY2x1ZGUgPHVuaWNvZGUvdWNoYXIuaD4KKyNpbmNs
dWRlIDx1bmljb2RlL3Vub3JtLmg+CisjaW5jbHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBs
aWNhdGlvblNlcnZpY2VzLmg+CisjaW5jbHVkZSA8bWxhbmcuaD4KKyNpbmNsdWRlIDx0Y2hhci5o
PgorI2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVyZmFjZS9XZWJLaXRTeXN0ZW1JbnRlcmZhY2Uu
aD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit1c2luZyBzdGQ6Om1heDsKKworY29uc3QgZmxv
YXQgY1NtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllciA9IDAuN2Y7CisKK3N0YXRpYyBib29sIHNo
b3VsZEFwcGx5TWFjQXNjZW50SGFjazsKKworc3RhdGljIGlubGluZSBmbG9hdCBzY2FsZUVtVG9V
bml0cyhmbG9hdCB4LCB1bnNpZ25lZCB1bml0c1BlckVtKSB7IHJldHVybiB1bml0c1BlckVtID8g
eCAvIChmbG9hdCl1bml0c1BlckVtIDogeDsgfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpzZXRT
aG91bGRBcHBseU1hY0FzY2VudEhhY2soYm9vbCBiKQoreworICAgIHNob3VsZEFwcGx5TWFjQXNj
ZW50SGFjayA9IGI7Cit9CisKK3ZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtSW5pdCgpCit7
ICAgIAorICAgIG1fc3ludGhldGljQm9sZE9mZnNldCA9IG1fZm9udC5zeW50aGV0aWNCb2xkKCkg
PyAxLjBmIDogMC5mOworICAgIG1fc2NyaXB0Q2FjaGUgPSAwOworICAgIG1fc2NyaXB0Rm9udFBy
b3BlcnRpZXMgPSAwOworICAgIG1faXNTeXN0ZW1Gb250ID0gZmFsc2U7CisgICAgCisgICAgaWYg
KG1fZm9udC51c2VHREkoKSkgeworICAgICAgICBIREMgaGRjID0gR2V0REMoMCk7CisgICAgICAg
IEhHRElPQkogb2xkRm9udCA9IFNlbGVjdE9iamVjdChoZGMsIG1fZm9udC5oZm9udCgpKTsKKyAg
ICAgICAgT1VUTElORVRFWFRNRVRSSUMgbWV0cmljczsKKyAgICAgICAgR2V0T3V0bGluZVRleHRN
ZXRyaWNzKGhkYywgc2l6ZW9mKG1ldHJpY3MpLCAmbWV0cmljcyk7CisgICAgICAgIFRFWFRNRVRS
SUMmIHRleHRNZXRyaWNzID0gbWV0cmljcy5vdG1UZXh0TWV0cmljczsKKyAgICAgICAgbV9hc2Nl
bnQgPSB0ZXh0TWV0cmljcy50bUFzY2VudDsKKyAgICAgICAgbV9kZXNjZW50ID0gdGV4dE1ldHJp
Y3MudG1EZXNjZW50OworICAgICAgICBtX2xpbmVHYXAgPSB0ZXh0TWV0cmljcy50bUV4dGVybmFs
TGVhZGluZzsKKyAgICAgICAgbV9saW5lU3BhY2luZyA9IG1fYXNjZW50ICsgbV9kZXNjZW50ICsg
bV9saW5lR2FwOworICAgICAgICBtX3hIZWlnaHQgPSBtX2FzY2VudCAqIDAuNTZmOyAvLyBCZXN0
IGd1ZXNzIGZvciB4SGVpZ2h0IGlmIG5vIHggZ2x5cGggaXMgcHJlc2VudC4KKworICAgICAgICBH
TFlQSE1FVFJJQ1MgZ207CisgICAgICAgIE1BVDIgbWF0ID0geyAxLCAwLCAwLCAxIH07CisgICAg
ICAgIERXT1JEIGxlbiA9IEdldEdseXBoT3V0bGluZShoZGMsICd4JywgR0dPX01FVFJJQ1MsICZn
bSwgMCwgMCwgJm1hdCk7CisgICAgICAgIGlmIChsZW4gIT0gR0RJX0VSUk9SICYmIGdtLmdtcHRH
bHlwaE9yaWdpbi55ID4gMCkKKyAgICAgICAgICAgIG1feEhlaWdodCA9IGdtLmdtcHRHbHlwaE9y
aWdpbi55OworCisgICAgICAgIG1fdW5pdHNQZXJFbSA9IG1ldHJpY3Mub3RtRU1TcXVhcmU7CisK
KyAgICAgICAgU2VsZWN0T2JqZWN0KGhkYywgb2xkRm9udCk7CisgICAgICAgIFJlbGVhc2VEQygw
LCBoZGMpOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDR0ZvbnRSZWYgZm9udCA9
IG1fZm9udC5jZ0ZvbnQoKTsKKyAgICBpbnQgaUFzY2VudCA9IENHRm9udEdldEFzY2VudChmb250
KTsKKyAgICBpbnQgaURlc2NlbnQgPSBDR0ZvbnRHZXREZXNjZW50KGZvbnQpOworICAgIGludCBp
TGluZUdhcCA9IENHRm9udEdldExlYWRpbmcoZm9udCk7CisgICAgbV91bml0c1BlckVtID0gQ0dG
b250R2V0VW5pdHNQZXJFbShmb250KTsKKyAgICBmbG9hdCBwb2ludFNpemUgPSBtX2ZvbnQuc2l6
ZSgpOworICAgIGZsb2F0IGZBc2NlbnQgPSBzY2FsZUVtVG9Vbml0cyhpQXNjZW50LCBtX3VuaXRz
UGVyRW0pICogcG9pbnRTaXplOworICAgIGZsb2F0IGZEZXNjZW50ID0gLXNjYWxlRW1Ub1VuaXRz
KGlEZXNjZW50LCBtX3VuaXRzUGVyRW0pICogcG9pbnRTaXplOworICAgIGZsb2F0IGZMaW5lR2Fw
ID0gc2NhbGVFbVRvVW5pdHMoaUxpbmVHYXAsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7CisK
KyAgICBpZiAoIWlzQ3VzdG9tRm9udCgpKSB7CisgICAgICAgIEhEQyBkYyA9IEdldERDKDApOwor
ICAgICAgICBIR0RJT0JKIG9sZEZvbnQgPSBTZWxlY3RPYmplY3QoZGMsIG1fZm9udC5oZm9udCgp
KTsKKyAgICAgICAgaW50IGZhY2VMZW5ndGggPSBHZXRUZXh0RmFjZShkYywgMCwgMCk7CisgICAg
ICAgIFZlY3RvcjxUQ0hBUj4gZmFjZU5hbWUoZmFjZUxlbmd0aCk7CisgICAgICAgIEdldFRleHRG
YWNlKGRjLCBmYWNlTGVuZ3RoLCBmYWNlTmFtZS5kYXRhKCkpOworICAgICAgICBtX2lzU3lzdGVt
Rm9udCA9ICFfdGNzY21wKGZhY2VOYW1lLmRhdGEoKSwgX1QoIkx1Y2lkYSBHcmFuZGUiKSk7Cisg
ICAgICAgIFNlbGVjdE9iamVjdChkYywgb2xkRm9udCk7CisgICAgICAgIFJlbGVhc2VEQygwLCBk
Yyk7CisKKyAgICAgICAgaWYgKHNob3VsZEFwcGx5TWFjQXNjZW50SGFjaykgeworICAgICAgICAg
ICAgLy8gVGhpcyBjb2RlIGNvbWVzIGZyb20gRm9udERhdGFNYWMubW0uIFdlIG9ubHkgZXZlciBk
byB0aGlzIHdoZW4gcnVubmluZyByZWdyZXNzaW9uIHRlc3RzIHNvIHRoYXQgb3VyIG1ldHJpY3Mg
d2lsbCBtYXRjaCBNYWMuCisKKyAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYWRqdXN0IFRpbWVz
LCBIZWx2ZXRpY2EsIGFuZCBDb3VyaWVyIHRvIGNsb3NlbHkgbWF0Y2ggdGhlCisgICAgICAgICAg
ICAvLyB2ZXJ0aWNhbCBtZXRyaWNzIG9mIHRoZWlyIE1pY3Jvc29mdCBjb3VudGVycGFydHMgdGhh
dCBhcmUgdGhlIGRlIGZhY3RvCisgICAgICAgICAgICAvLyB3ZWIgc3RhbmRhcmQuIFRoZSBBcHBL
aXQgYWRqdXN0bWVudCBvZiAyMCUgaXMgdG9vIGJpZyBhbmQgaXMKKyAgICAgICAgICAgIC8vIGlu
Y29ycmVjdGx5IGFkZGVkIHRvIGxpbmUgc3BhY2luZywgc28gd2UgdXNlIGEgMTUlIGFkanVzdG1l
bnQgaW5zdGVhZAorICAgICAgICAgICAgLy8gYW5kIGFkZCBpdCB0byB0aGUgYXNjZW50LgorICAg
ICAgICAgICAgaWYgKCFfdGNzY21wKGZhY2VOYW1lLmRhdGEoKSwgX1QoIlRpbWVzIikpIHx8ICFf
dGNzY21wKGZhY2VOYW1lLmRhdGEoKSwgX1QoIkhlbHZldGljYSIpKSB8fCAhX3Rjc2NtcChmYWNl
TmFtZS5kYXRhKCksIF9UKCJDb3VyaWVyIikpKQorICAgICAgICAgICAgICAgIGZBc2NlbnQgKz0g
Zmxvb3JmKCgoZkFzY2VudCArIGZEZXNjZW50KSAqIDAuMTVmKSArIDAuNWYpOworICAgICAgICB9
CisgICAgfQorCisgICAgbV9hc2NlbnQgPSBscm91bmRmKGZBc2NlbnQpOworICAgIG1fZGVzY2Vu
dCA9IGxyb3VuZGYoZkRlc2NlbnQpOworICAgIG1fbGluZUdhcCA9IGxyb3VuZGYoZkxpbmVHYXAp
OworICAgIG1fbGluZVNwYWNpbmcgPSBtX2FzY2VudCArIG1fZGVzY2VudCArIG1fbGluZUdhcDsK
KworICAgIC8vIE1lYXN1cmUgdGhlIGFjdHVhbCBjaGFyYWN0ZXIgIngiLCBiZWNhdXNlIEFwcEtp
dCBzeW50aGVzaXplcyBYIGhlaWdodCByYXRoZXIgdGhhbiBnZXR0aW5nIGl0IGZyb20gdGhlIGZv
bnQuCisgICAgLy8gVW5mb3J0dW5hdGVseSwgTlNGb250IHdpbGwgcm91bmQgdGhpcyBmb3IgdXMg
c28gd2UgZG9uJ3QgcXVpdGUgZ2V0IHRoZSByaWdodCB2YWx1ZS4KKyAgICBHbHlwaFBhZ2UqIGds
eXBoUGFnZVplcm8gPSBHbHlwaFBhZ2VUcmVlTm9kZTo6Z2V0Um9vdENoaWxkKHRoaXMsIDApLT5w
YWdlKCk7CisgICAgR2x5cGggeEdseXBoID0gZ2x5cGhQYWdlWmVybyA/IGdseXBoUGFnZVplcm8t
PmdseXBoRGF0YUZvckNoYXJhY3RlcigneCcpLmdseXBoIDogMDsKKyAgICBpZiAoeEdseXBoKSB7
CisgICAgICAgIENHUmVjdCB4Qm94OworICAgICAgICBDR0ZvbnRHZXRHbHlwaEJCb3hlcyhmb250
LCAmeEdseXBoLCAxLCAmeEJveCk7CisgICAgICAgIC8vIFVzZSB0aGUgbWF4aW11bSBvZiBlaXRo
ZXIgd2lkdGggb3IgaGVpZ2h0IGJlY2F1c2UgIngiIGlzIG5lYXJseSBzcXVhcmUKKyAgICAgICAg
Ly8gYW5kIHdlYiBwYWdlcyB0aGF0IGZvb2xpc2hseSB1c2UgdGhpcyBtZXRyaWMgZm9yIHdpZHRo
IHdpbGwgYmUgbGFpZCBvdXQKKyAgICAgICAgLy8gcG9vcmx5IGlmIHdlIHJldHVybiBhbiBhY2N1
cmF0ZSBoZWlnaHQuIENsYXNzaWMgY2FzZSBpcyBUaW1lcyAxMyBwb2ludCwKKyAgICAgICAgLy8g
d2hpY2ggaGFzIGFuICJ4IiB0aGF0IGlzIDd4NiBwaXhlbHMuCisgICAgICAgIG1feEhlaWdodCA9
IHNjYWxlRW1Ub1VuaXRzKG1heChDR1JlY3RHZXRNYXhYKHhCb3gpLCBDR1JlY3RHZXRNYXhZKHhC
b3gpKSwgbV91bml0c1BlckVtKSAqIHBvaW50U2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBp
bnQgaVhIZWlnaHQgPSBDR0ZvbnRHZXRYSGVpZ2h0KGZvbnQpOworICAgICAgICBtX3hIZWlnaHQg
PSBzY2FsZUVtVG9Vbml0cyhpWEhlaWdodCwgbV91bml0c1BlckVtKSAqIHBvaW50U2l6ZTsKKyAg
ICB9Cit9CisKK3ZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtRGVzdHJveSgpCit7CisgICAg
aWYgKCFpc0N1c3RvbUZvbnQoKSkgeworICAgICAgICBEZWxldGVPYmplY3QobV9mb250Lmhmb250
KCkpOworICAgICAgICBDR0ZvbnRSZWxlYXNlKG1fZm9udC5jZ0ZvbnQoKSk7CisgICAgfQorCisg
ICAgLy8gV2UgZG9uJ3QgaGFzaCB0aGlzIG9uIFdpbjMyLCBzbyBpdCdzIGVmZmVjdGl2ZWx5IG93
bmVkIGJ5IHVzLgorICAgIGRlbGV0ZSBtX3NtYWxsQ2Fwc0ZvbnREYXRhOworCisgICAgU2NyaXB0
RnJlZUNhY2hlKCZtX3NjcmlwdENhY2hlKTsKKyAgICBkZWxldGUgbV9zY3JpcHRGb250UHJvcGVy
dGllczsKK30KKworU2ltcGxlRm9udERhdGEqIFNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNGb250
RGF0YShjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKK3sKKyAg
ICBpZiAoIW1fc21hbGxDYXBzRm9udERhdGEpIHsKKyAgICAgICAgZmxvYXQgc21hbGxDYXBzSGVp
Z2h0ID0gY1NtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllciAqIG1fZm9udC5zaXplKCk7CisgICAg
ICAgIGlmIChpc0N1c3RvbUZvbnQoKSkgeworICAgICAgICAgICAgRm9udFBsYXRmb3JtRGF0YSBz
bWFsbENhcHNGb250RGF0YShtX2ZvbnQpOworICAgICAgICAgICAgc21hbGxDYXBzRm9udERhdGEu
c2V0U2l6ZShzbWFsbENhcHNIZWlnaHQpOworICAgICAgICAgICAgbV9zbWFsbENhcHNGb250RGF0
YSA9IG5ldyBTaW1wbGVGb250RGF0YShzbWFsbENhcHNGb250RGF0YSwgdHJ1ZSwgZmFsc2UpOwor
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRk9OVCB3aW5mb250OworICAgICAgICAg
ICAgR2V0T2JqZWN0KG1fZm9udC5oZm9udCgpLCBzaXplb2YoTE9HRk9OVCksICZ3aW5mb250KTsK
KyAgICAgICAgICAgIHdpbmZvbnQubGZIZWlnaHQgPSAtbHJvdW5kZihzbWFsbENhcHNIZWlnaHQg
KiAobV9mb250LnVzZUdESSgpID8gMSA6IDMyKSk7CisgICAgICAgICAgICBIRk9OVCBoZm9udCA9
IENyZWF0ZUZvbnRJbmRpcmVjdCgmd2luZm9udCk7CisgICAgICAgICAgICBtX3NtYWxsQ2Fwc0Zv
bnREYXRhID0gbmV3IFNpbXBsZUZvbnREYXRhKEZvbnRQbGF0Zm9ybURhdGEoaGZvbnQsIHNtYWxs
Q2Fwc0hlaWdodCwgZm9udERlc2NyaXB0aW9uLmJvbGQoKSwgZm9udERlc2NyaXB0aW9uLml0YWxp
YygpLCBtX2ZvbnQudXNlR0RJKCkpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbV9z
bWFsbENhcHNGb250RGF0YTsKK30KKworYm9vbCBTaW1wbGVGb250RGF0YTo6Y29udGFpbnNDaGFy
YWN0ZXJzKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3RoKSBjb25zdAoreworICAg
IC8vIEZJWE1FOiBTdXBwb3J0IGN1c3RvbSBmb250cy4KKyAgICBpZiAoaXNDdXN0b21Gb250KCkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIEZJWE1FOiBNaWNyb3NvZnQgZG9jdW1l
bnRhdGlvbiBzZWVtcyB0byBpbXBseSB0aGF0IGNoYXJhY3RlcnMgY2FuIGJlIG91dHB1dCB1c2lu
ZyBhIGdpdmVuIGZvbnQgYW5kIERDCisgICAgLy8gbWVyZWx5IGJ5IHRlc3RpbmcgY29kZSBwYWdl
IGludGVyc2VjdGlvbi4gIFRoaXMgc2VlbXMgc3VzcGVjdCB0aG91Z2guICBDYW4ndCBhIGZvbnQg
b25seSBwYXJ0aWFsbHkKKyAgICAvLyBjb3ZlciBhIGdpdmVuIGNvZGUgcGFnZT8KKyAgICBJTUxh
bmdGb250TGluazIqIGxhbmdGb250TGluayA9IEZvbnRDYWNoZTo6Z2V0Rm9udExpbmtJbnRlcmZh
Y2UoKTsKKyAgICBpZiAoIWxhbmdGb250TGluaykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgSERDIGRjID0gR2V0REMoMCk7CisgICAgCisgICAgRFdPUkQgYWNwQ29kZVBhZ2VzOworICAg
IGxhbmdGb250TGluay0+Q29kZVBhZ2VUb0NvZGVQYWdlcyhDUF9BQ1AsICZhY3BDb2RlUGFnZXMp
OworCisgICAgRFdPUkQgZm9udENvZGVQYWdlczsKKyAgICBsYW5nRm9udExpbmstPkdldEZvbnRD
b2RlUGFnZXMoZGMsIG1fZm9udC5oZm9udCgpLCAmZm9udENvZGVQYWdlcyk7CisKKyAgICBEV09S
RCBhY3R1YWxDb2RlUGFnZXM7CisgICAgbG9uZyBudW1DaGFyYWN0ZXJzUHJvY2Vzc2VkOworICAg
IGxvbmcgb2Zmc2V0ID0gMDsKKyAgICB3aGlsZSAob2Zmc2V0IDwgbGVuZ3RoKSB7CisgICAgICAg
IGxhbmdGb250TGluay0+R2V0U3RyQ29kZVBhZ2VzKGNoYXJhY3RlcnMsIGxlbmd0aCwgYWNwQ29k
ZVBhZ2VzLCAmYWN0dWFsQ29kZVBhZ2VzLCAmbnVtQ2hhcmFjdGVyc1Byb2Nlc3NlZCk7CisgICAg
ICAgIGlmICgoYWN0dWFsQ29kZVBhZ2VzICYgZm9udENvZGVQYWdlcykgPT0gMCkKKyAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgb2Zmc2V0ICs9IG51bUNoYXJhY3RlcnNQcm9jZXNz
ZWQ7CisgICAgfQorCisgICAgUmVsZWFzZURDKDAsIGRjKTsKKworICAgIHJldHVybiB0cnVlOwor
fQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpkZXRlcm1pbmVQaXRjaCgpCit7CisgICAgaWYgKGlz
Q3VzdG9tRm9udCgpKSB7CisgICAgICAgIG1fdHJlYXRBc0ZpeGVkUGl0Y2ggPSBmYWxzZTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFRFWFRNRVRSSUNTIGhhdmUgdGhpcy4gIFNl
dCBtX3RyZWF0QXNGaXhlZFBpdGNoIGJhc2VkIG9mZiB0aGF0LgorICAgIEhEQyBkYyA9IEdldERD
KDApOworICAgIFNhdmVEQyhkYyk7CisgICAgU2VsZWN0T2JqZWN0KGRjLCBtX2ZvbnQuaGZvbnQo
KSk7CisKKyAgICAvLyBZZXMsIHRoaXMgbG9va3MgYmFja3dhcmRzLCBidXQgdGhlIGZpeGVkIHBp
dGNoIGJpdCBpcyBhY3R1YWxseSBzZXQgaWYgdGhlIGZvbnQKKyAgICAvLyBpcyAqbm90KiBmaXhl
ZCBwaXRjaC4gIFVuYmVsaWV2YWJsZSBidXQgdHJ1ZS4KKyAgICBURVhUTUVUUklDIHRtOworICAg
IEdldFRleHRNZXRyaWNzKGRjLCAmdG0pOworICAgIG1fdHJlYXRBc0ZpeGVkUGl0Y2ggPSAoKHRt
LnRtUGl0Y2hBbmRGYW1pbHkgJiBUTVBGX0ZJWEVEX1BJVENIKSA9PSAwKTsKKworICAgIFJlc3Rv
cmVEQyhkYywgLTEpOworICAgIFJlbGVhc2VEQygwLCBkYyk7Cit9CisKK2Zsb2F0IFNpbXBsZUZv
bnREYXRhOjpwbGF0Zm9ybVdpZHRoRm9yR2x5cGgoR2x5cGggZ2x5cGgpIGNvbnN0Cit7CisgICAg
aWYgKG1fZm9udC51c2VHREkoKSkgeworICAgICAgICBIREMgaGRjID0gR2V0REMoMCk7CisgICAg
ICAgIEhHRElPQkogb2xkRm9udCA9IFNlbGVjdE9iamVjdChoZGMsIG1fZm9udC5oZm9udCgpKTsK
KyAgICAgICAgaW50IHdpZHRoOworICAgICAgICBHZXRDaGFyV2lkdGhJKGhkYywgZ2x5cGgsIDEs
IDAsICZ3aWR0aCk7CisgICAgICAgIFNlbGVjdE9iamVjdChoZGMsIG9sZEZvbnQpOworICAgICAg
ICBSZWxlYXNlREMoMCwgaGRjKTsKKyAgICAgICAgcmV0dXJuIHdpZHRoOworICAgIH0KKworICAg
IENHRm9udFJlZiBmb250ID0gbV9mb250LmNnRm9udCgpOworICAgIGZsb2F0IHBvaW50U2l6ZSA9
IG1fZm9udC5zaXplKCk7CisgICAgQ0dTaXplIGFkdmFuY2U7CisgICAgQ0dBZmZpbmVUcmFuc2Zv
cm0gbSA9IENHQWZmaW5lVHJhbnNmb3JtTWFrZVNjYWxlKHBvaW50U2l6ZSwgcG9pbnRTaXplKTsK
KyAgICAvLyBGSVhNRTogTmVlZCB0byBhZGQgcmVhbCBzdXBwb3J0IGZvciBwcmludGVyIGZvbnRz
LgorICAgIGJvb2wgaXNQcmludGVyRm9udCA9IGZhbHNlOworICAgIHdrR2V0R2x5cGhBZHZhbmNl
cyhmb250LCBtLCBtX2lzU3lzdGVtRm9udCwgaXNQcmludGVyRm9udCwgZ2x5cGgsIGFkdmFuY2Up
OworICAgIHJldHVybiBhZHZhbmNlLndpZHRoICsgbV9zeW50aGV0aWNCb2xkT2Zmc2V0OworfQor
CitTQ1JJUFRfRk9OVFBST1BFUlRJRVMqIFNpbXBsZUZvbnREYXRhOjpzY3JpcHRGb250UHJvcGVy
dGllcygpIGNvbnN0Cit7CisgICAgaWYgKCFtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzKSB7CisgICAg
ICAgIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMgPSBuZXcgU0NSSVBUX0ZPTlRQUk9QRVJUSUVTOwor
ICAgICAgICBtZW1zZXQobV9zY3JpcHRGb250UHJvcGVydGllcywgMCwgc2l6ZW9mKFNDUklQVF9G
T05UUFJPUEVSVElFUykpOworICAgICAgICBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzLT5jQnl0ZXMg
PSBzaXplb2YoU0NSSVBUX0ZPTlRQUk9QRVJUSUVTKTsKKyAgICAgICAgSFJFU1VMVCByZXN1bHQg
PSBTY3JpcHRHZXRGb250UHJvcGVydGllcygwLCBzY3JpcHRDYWNoZSgpLCBtX3NjcmlwdEZvbnRQ
cm9wZXJ0aWVzKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBFX1BFTkRJTkcpIHsKKyAgICAgICAg
ICAgIEhEQyBkYyA9IEdldERDKDApOworICAgICAgICAgICAgU2F2ZURDKGRjKTsKKyAgICAgICAg
ICAgIFNlbGVjdE9iamVjdChkYywgbV9mb250Lmhmb250KCkpOworICAgICAgICAgICAgU2NyaXB0
R2V0Rm9udFByb3BlcnRpZXMoZGMsIHNjcmlwdENhY2hlKCksIG1fc2NyaXB0Rm9udFByb3BlcnRp
ZXMpOworICAgICAgICAgICAgUmVzdG9yZURDKGRjLCAtMSk7CisgICAgICAgICAgICBSZWxlYXNl
REMoMCwgZGMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtX3NjcmlwdEZvbnRQcm9w
ZXJ0aWVzOworfQorCit9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1w
bGVGb250RGF0YUNHV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbi9TaW1wbGVGb250RGF0YUNHV2luLmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNHV2luLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcg
QXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBB
cHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCkBAIC0zOCwyNyArMzgsMTggQEAKICNpbmNsdWRlIDx1bmljb2RlL3VjaGFyLmg+CiAj
aW5jbHVkZSA8dW5pY29kZS91bm9ybS5oPgogI2luY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMv
QXBwbGljYXRpb25TZXJ2aWNlcy5oPgorI2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVyZmFjZS9X
ZWJLaXRTeXN0ZW1JbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtbGFuZy5oPgogI2luY2x1ZGUgPHRj
aGFyLmg+Ci0jaW5jbHVkZSA8V2ViS2l0U3lzdGVtSW50ZXJmYWNlL1dlYktpdFN5c3RlbUludGVy
ZmFjZS5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIHVzaW5nIHN0ZDo6bWF4OwogCi1jb25z
dCBmbG9hdCBjU21hbGxDYXBzRm9udFNpemVNdWx0aXBsaWVyID0gMC43ZjsKLQotc3RhdGljIGJv
b2wgc2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrOwotCi1zdGF0aWMgaW5saW5lIGZsb2F0IHNjYWxl
RW1Ub1VuaXRzKGZsb2F0IHgsIHVuc2lnbmVkIHVuaXRzUGVyRW0pIHsgcmV0dXJuIHVuaXRzUGVy
RW0gPyB4IC8gKGZsb2F0KXVuaXRzUGVyRW0gOiB4OyB9Ci0KLXZvaWQgU2ltcGxlRm9udERhdGE6
OnNldFNob3VsZEFwcGx5TWFjQXNjZW50SGFjayhib29sIGIpCi17Ci0gICAgc2hvdWxkQXBwbHlN
YWNBc2NlbnRIYWNrID0gYjsKLX0KK3N0YXRpYyBpbmxpbmUgZmxvYXQgc2NhbGVFbVRvVW5pdHMo
ZmxvYXQgeCwgdW5zaWduZWQgdW5pdHNQZXJFbSkgeyByZXR1cm4gdW5pdHNQZXJFbSA/IHggLyBz
dGF0aWNfY2FzdDxmbG9hdD4odW5pdHNQZXJFbSkgOiB4OyB9CiAKIHZvaWQgU2ltcGxlRm9udERh
dGE6OnBsYXRmb3JtSW5pdCgpCi17ICAgIAorewogICAgIG1fc3ludGhldGljQm9sZE9mZnNldCA9
IG1fZm9udC5zeW50aGV0aWNCb2xkKCkgPyAxLjBmIDogMC5mOwogICAgIG1fc2NyaXB0Q2FjaGUg
PSAwOwogICAgIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMgPSAwOwpAQCAtMTEwLDcgKzEwMSw3IEBA
IHZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtSW5pdCgpCiAgICAgICAgIFNlbGVjdE9iamVj
dChkYywgb2xkRm9udCk7CiAgICAgICAgIFJlbGVhc2VEQygwLCBkYyk7CiAKLSAgICAgICAgaWYg
KHNob3VsZEFwcGx5TWFjQXNjZW50SGFjaykgeworICAgICAgICBpZiAoc2hvdWxkQXBwbHlNYWNB
c2NlbnRIYWNrKCkpIHsKICAgICAgICAgICAgIC8vIFRoaXMgY29kZSBjb21lcyBmcm9tIEZvbnRE
YXRhTWFjLm1tLiBXZSBvbmx5IGV2ZXIgZG8gdGhpcyB3aGVuIHJ1bm5pbmcgcmVncmVzc2lvbiB0
ZXN0cyBzbyB0aGF0IG91ciBtZXRyaWNzIHdpbGwgbWF0Y2ggTWFjLgogCiAgICAgICAgICAgICAv
LyBXZSBuZWVkIHRvIGFkanVzdCBUaW1lcywgSGVsdmV0aWNhLCBhbmQgQ291cmllciB0byBjbG9z
ZWx5IG1hdGNoIHRoZQpAQCAtMTYwLDgzICsxNTEsNiBAQCB2b2lkIFNpbXBsZUZvbnREYXRhOjpw
bGF0Zm9ybURlc3Ryb3koKQogICAgIGRlbGV0ZSBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzOwogfQog
Ci1TaW1wbGVGb250RGF0YSogU2ltcGxlRm9udERhdGE6OnNtYWxsQ2Fwc0ZvbnREYXRhKGNvbnN0
IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uKSBjb25zdAotewotICAgIGlmICghbV9z
bWFsbENhcHNGb250RGF0YSkgewotICAgICAgICBmbG9hdCBzbWFsbENhcHNIZWlnaHQgPSBjU21h
bGxDYXBzRm9udFNpemVNdWx0aXBsaWVyICogbV9mb250LnNpemUoKTsKLSAgICAgICAgaWYgKGlz
Q3VzdG9tRm9udCgpKSB7Ci0gICAgICAgICAgICBGb250UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0Zv
bnREYXRhKG1fZm9udCk7Ci0gICAgICAgICAgICBzbWFsbENhcHNGb250RGF0YS5zZXRTaXplKHNt
YWxsQ2Fwc0hlaWdodCk7Ci0gICAgICAgICAgICBtX3NtYWxsQ2Fwc0ZvbnREYXRhID0gbmV3IFNp
bXBsZUZvbnREYXRhKHNtYWxsQ2Fwc0ZvbnREYXRhLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgICAgICBMT0dGT05UIHdpbmZvbnQ7Ci0gICAgICAgICAgICBHZXRPYmpl
Y3QobV9mb250Lmhmb250KCksIHNpemVvZihMT0dGT05UKSwgJndpbmZvbnQpOwotICAgICAgICAg
ICAgd2luZm9udC5sZkhlaWdodCA9IC1scm91bmRmKHNtYWxsQ2Fwc0hlaWdodCAqIChtX2ZvbnQu
dXNlR0RJKCkgPyAxIDogMzIpKTsKLSAgICAgICAgICAgIEhGT05UIGhmb250ID0gQ3JlYXRlRm9u
dEluZGlyZWN0KCZ3aW5mb250KTsKLSAgICAgICAgICAgIG1fc21hbGxDYXBzRm9udERhdGEgPSBu
ZXcgU2ltcGxlRm9udERhdGEoRm9udFBsYXRmb3JtRGF0YShoZm9udCwgc21hbGxDYXBzSGVpZ2h0
LCBmb250RGVzY3JpcHRpb24uYm9sZCgpLCBmb250RGVzY3JpcHRpb24uaXRhbGljKCksIG1fZm9u
dC51c2VHREkoKSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtX3NtYWxsQ2Fwc0Zv
bnREYXRhOwotfQotCi1ib29sIFNpbXBsZUZvbnREYXRhOjpjb250YWluc0NoYXJhY3RlcnMoY29u
c3QgVUNoYXIqIGNoYXJhY3RlcnMsIGludCBsZW5ndGgpIGNvbnN0Ci17Ci0gICAgLy8gRklYTUU6
IFN1cHBvcnQgY3VzdG9tIGZvbnRzLgotICAgIGlmIChpc0N1c3RvbUZvbnQoKSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0gICAgLy8gRklYTUU6IE1pY3Jvc29mdCBkb2N1bWVudGF0aW9uIHNl
ZW1zIHRvIGltcGx5IHRoYXQgY2hhcmFjdGVycyBjYW4gYmUgb3V0cHV0IHVzaW5nIGEgZ2l2ZW4g
Zm9udCBhbmQgREMKLSAgICAvLyBtZXJlbHkgYnkgdGVzdGluZyBjb2RlIHBhZ2UgaW50ZXJzZWN0
aW9uLiAgVGhpcyBzZWVtcyBzdXNwZWN0IHRob3VnaC4gIENhbid0IGEgZm9udCBvbmx5IHBhcnRp
YWxseQotICAgIC8vIGNvdmVyIGEgZ2l2ZW4gY29kZSBwYWdlPwotICAgIElNTGFuZ0ZvbnRMaW5r
MiogbGFuZ0ZvbnRMaW5rID0gRm9udENhY2hlOjpnZXRGb250TGlua0ludGVyZmFjZSgpOwotICAg
IGlmICghbGFuZ0ZvbnRMaW5rKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBIREMgZGMg
PSBHZXREQygwKTsKLSAgICAKLSAgICBEV09SRCBhY3BDb2RlUGFnZXM7Ci0gICAgbGFuZ0ZvbnRM
aW5rLT5Db2RlUGFnZVRvQ29kZVBhZ2VzKENQX0FDUCwgJmFjcENvZGVQYWdlcyk7Ci0KLSAgICBE
V09SRCBmb250Q29kZVBhZ2VzOwotICAgIGxhbmdGb250TGluay0+R2V0Rm9udENvZGVQYWdlcyhk
YywgbV9mb250Lmhmb250KCksICZmb250Q29kZVBhZ2VzKTsKLQotICAgIERXT1JEIGFjdHVhbENv
ZGVQYWdlczsKLSAgICBsb25nIG51bUNoYXJhY3RlcnNQcm9jZXNzZWQ7Ci0gICAgbG9uZyBvZmZz
ZXQgPSAwOwotICAgIHdoaWxlIChvZmZzZXQgPCBsZW5ndGgpIHsKLSAgICAgICAgbGFuZ0ZvbnRM
aW5rLT5HZXRTdHJDb2RlUGFnZXMoY2hhcmFjdGVycywgbGVuZ3RoLCBhY3BDb2RlUGFnZXMsICZh
Y3R1YWxDb2RlUGFnZXMsICZudW1DaGFyYWN0ZXJzUHJvY2Vzc2VkKTsKLSAgICAgICAgaWYgKChh
Y3R1YWxDb2RlUGFnZXMgJiBmb250Q29kZVBhZ2VzKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgICAgICBvZmZzZXQgKz0gbnVtQ2hhcmFjdGVyc1Byb2Nlc3NlZDsKLSAgICB9
Ci0KLSAgICBSZWxlYXNlREMoMCwgZGMpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQg
U2ltcGxlRm9udERhdGE6OmRldGVybWluZVBpdGNoKCkKLXsKLSAgICBpZiAoaXNDdXN0b21Gb250
KCkpIHsKLSAgICAgICAgbV90cmVhdEFzRml4ZWRQaXRjaCA9IGZhbHNlOwotICAgICAgICByZXR1
cm47Ci0gICAgfQotCi0gICAgLy8gVEVYVE1FVFJJQ1MgaGF2ZSB0aGlzLiAgU2V0IG1fdHJlYXRB
c0ZpeGVkUGl0Y2ggYmFzZWQgb2ZmIHRoYXQuCi0gICAgSERDIGRjID0gR2V0REMoMCk7Ci0gICAg
U2F2ZURDKGRjKTsKLSAgICBTZWxlY3RPYmplY3QoZGMsIG1fZm9udC5oZm9udCgpKTsKLQotICAg
IC8vIFllcywgdGhpcyBsb29rcyBiYWNrd2FyZHMsIGJ1dCB0aGUgZml4ZWQgcGl0Y2ggYml0IGlz
IGFjdHVhbGx5IHNldCBpZiB0aGUgZm9udAotICAgIC8vIGlzICpub3QqIGZpeGVkIHBpdGNoLiAg
VW5iZWxpZXZhYmxlIGJ1dCB0cnVlLgotICAgIFRFWFRNRVRSSUMgdG07Ci0gICAgR2V0VGV4dE1l
dHJpY3MoZGMsICZ0bSk7Ci0gICAgbV90cmVhdEFzRml4ZWRQaXRjaCA9ICgodG0udG1QaXRjaEFu
ZEZhbWlseSAmIFRNUEZfRklYRURfUElUQ0gpID09IDApOwotCi0gICAgUmVzdG9yZURDKGRjLCAt
MSk7Ci0gICAgUmVsZWFzZURDKDAsIGRjKTsKLX0KLQogZmxvYXQgU2ltcGxlRm9udERhdGE6OnBs
YXRmb3JtV2lkdGhGb3JHbHlwaChHbHlwaCBnbHlwaCkgY29uc3QKIHsKICAgICBpZiAobV9mb250
LnVzZUdESSgpKSB7CkBAIC0yNTMsMjkgKzE2NywxMiBAQCBmbG9hdCBTaW1wbGVGb250RGF0YTo6
cGxhdGZvcm1XaWR0aEZvckdsCiAgICAgZmxvYXQgcG9pbnRTaXplID0gbV9mb250LnNpemUoKTsK
ICAgICBDR1NpemUgYWR2YW5jZTsKICAgICBDR0FmZmluZVRyYW5zZm9ybSBtID0gQ0dBZmZpbmVU
cmFuc2Zvcm1NYWtlU2NhbGUocG9pbnRTaXplLCBwb2ludFNpemUpOworIAogICAgIC8vIEZJWE1F
OiBOZWVkIHRvIGFkZCByZWFsIHN1cHBvcnQgZm9yIHByaW50ZXIgZm9udHMuCiAgICAgYm9vbCBp
c1ByaW50ZXJGb250ID0gZmFsc2U7CiAgICAgd2tHZXRHbHlwaEFkdmFuY2VzKGZvbnQsIG0sIG1f
aXNTeXN0ZW1Gb250LCBpc1ByaW50ZXJGb250LCBnbHlwaCwgYWR2YW5jZSk7Ci0gICAgcmV0dXJu
IGFkdmFuY2Uud2lkdGggKyBtX3N5bnRoZXRpY0JvbGRPZmZzZXQ7Ci19CiAKLVNDUklQVF9GT05U
UFJPUEVSVElFUyogU2ltcGxlRm9udERhdGE6OnNjcmlwdEZvbnRQcm9wZXJ0aWVzKCkgY29uc3QK
LXsKLSAgICBpZiAoIW1fc2NyaXB0Rm9udFByb3BlcnRpZXMpIHsKLSAgICAgICAgbV9zY3JpcHRG
b250UHJvcGVydGllcyA9IG5ldyBTQ1JJUFRfRk9OVFBST1BFUlRJRVM7Ci0gICAgICAgIG1lbXNl
dChtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzLCAwLCBzaXplb2YoU0NSSVBUX0ZPTlRQUk9QRVJUSUVT
KSk7Ci0gICAgICAgIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMtPmNCeXRlcyA9IHNpemVvZihTQ1JJ
UFRfRk9OVFBST1BFUlRJRVMpOwotICAgICAgICBIUkVTVUxUIHJlc3VsdCA9IFNjcmlwdEdldEZv
bnRQcm9wZXJ0aWVzKDAsIHNjcmlwdENhY2hlKCksIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMpOwot
ICAgICAgICBpZiAocmVzdWx0ID09IEVfUEVORElORykgewotICAgICAgICAgICAgSERDIGRjID0g
R2V0REMoMCk7Ci0gICAgICAgICAgICBTYXZlREMoZGMpOwotICAgICAgICAgICAgU2VsZWN0T2Jq
ZWN0KGRjLCBtX2ZvbnQuaGZvbnQoKSk7Ci0gICAgICAgICAgICBTY3JpcHRHZXRGb250UHJvcGVy
dGllcyhkYywgc2NyaXB0Q2FjaGUoKSwgbV9zY3JpcHRGb250UHJvcGVydGllcyk7Ci0gICAgICAg
ICAgICBSZXN0b3JlREMoZGMsIC0xKTsKLSAgICAgICAgICAgIFJlbGVhc2VEQygwLCBkYyk7Ci0g
ICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1fc2NyaXB0Rm9udFByb3BlcnRpZXM7CisgICAg
cmV0dXJuIGFkdmFuY2Uud2lkdGggKyBtX3N5bnRoZXRpY0JvbGRPZmZzZXQ7CiB9CiAKIH0KSW5k
ZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ2Fpcm9XaW4u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZv
bnREYXRhQ2Fpcm9XaW4uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW4vU2ltcGxlRm9udERhdGFDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAg
KzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1l
IG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAg
ICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJv
ZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmlj
IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAq
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNpbXBsZUZvbnRE
YXRhLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJGb250LmgiCisjaW5j
bHVkZSAiRm9udENhY2hlLmgiCisjaW5jbHVkZSAiRm9udERlc2NyaXB0aW9uLmgiCisjaW5jbHVk
ZSA8bWxhbmcuaD4KKyNpbmNsdWRlIDx0Y2hhci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K3ZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtSW5pdCgpCit7CisgICAgbV9zY3JpcHRDYWNo
ZSA9IDA7CisgICAgbV9zY3JpcHRGb250UHJvcGVydGllcyA9IDA7CisgICAgbV9pc1N5c3RlbUZv
bnQgPSBmYWxzZTsKKyAgICAKKyAgICBpZiAobV9mb250LnVzZUdESSgpKSB7CisgICAgICAgIEhE
QyBoZGMgPSBHZXREQygwKTsKKyAgICAgICAgSEdESU9CSiBvbGRGb250ID0gU2VsZWN0T2JqZWN0
KGhkYywgbV9mb250Lmhmb250KCkpOworICAgICAgICBPVVRMSU5FVEVYVE1FVFJJQyBtZXRyaWNz
OworICAgICAgICBHZXRPdXRsaW5lVGV4dE1ldHJpY3MoaGRjLCBzaXplb2YobWV0cmljcyksICZt
ZXRyaWNzKTsKKyAgICAgICAgVEVYVE1FVFJJQyYgdGV4dE1ldHJpY3MgPSBtZXRyaWNzLm90bVRl
eHRNZXRyaWNzOworICAgICAgICBtX2FzY2VudCA9IHRleHRNZXRyaWNzLnRtQXNjZW50OworICAg
ICAgICBtX2Rlc2NlbnQgPSB0ZXh0TWV0cmljcy50bURlc2NlbnQ7CisgICAgICAgIG1fbGluZUdh
cCA9IHRleHRNZXRyaWNzLnRtRXh0ZXJuYWxMZWFkaW5nOworICAgICAgICBtX2xpbmVTcGFjaW5n
ID0gbV9hc2NlbnQgKyBtX2Rlc2NlbnQgKyBtX2xpbmVHYXA7CisgICAgICAgIG1feEhlaWdodCA9
IG1fYXNjZW50ICogMC41NmY7IC8vIEJlc3QgZ3Vlc3MgZm9yIHhIZWlnaHQgaWYgbm8geCBnbHlw
aCBpcyBwcmVzZW50LgorCisgICAgICAgIEdMWVBITUVUUklDUyBnbTsKKyAgICAgICAgTUFUMiBt
YXQgPSB7IDEsIDAsIDAsIDEgfTsKKyAgICAgICAgRFdPUkQgbGVuID0gR2V0R2x5cGhPdXRsaW5l
KGhkYywgJ3gnLCBHR09fTUVUUklDUywgJmdtLCAwLCAwLCAmbWF0KTsKKyAgICAgICAgaWYgKGxl
biAhPSBHRElfRVJST1IgJiYgZ20uZ21wdEdseXBoT3JpZ2luLnkgPiAwKQorICAgICAgICAgICAg
bV94SGVpZ2h0ID0gZ20uZ21wdEdseXBoT3JpZ2luLnk7CisKKyAgICAgICAgbV91bml0c1BlckVt
ID0gbWV0cmljcy5vdG1FTVNxdWFyZTsKKworICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBvbGRG
b250KTsKKyAgICAgICAgUmVsZWFzZURDKDAsIGhkYyk7CisKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIC8vIEZJWE1FOiBUaGlzIHNlY3Rpb24gc2hvdWxkIGRldGVybWluZSBmb250IGRp
bWVuc2lvbnMgKHNlZSBDRyBpbXBsZW1lbnRhdGlvbikuCisgICAgbm90SW1wbGVtZW50ZWQoKTsK
K30KKwordm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1EZXN0cm95KCkKK3sKKyAgICBub3RJ
bXBsZW1lbnRlZCgpOworfQorCitmbG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZv
ckdseXBoKEdseXBoIGdseXBoKSBjb25zdAoreworICAgIGlmIChtX2ZvbnQudXNlR0RJKCkpIHsK
KyAgICAgICAgSERDIGhkYyA9IEdldERDKDApOworICAgICAgICBIR0RJT0JKIG9sZEZvbnQgPSBT
ZWxlY3RPYmplY3QoaGRjLCBtX2ZvbnQuaGZvbnQoKSk7CisgICAgICAgIGludCB3aWR0aDsKKyAg
ICAgICAgR2V0Q2hhcldpZHRoSShoZGMsIGdseXBoLCAxLCAwLCAmd2lkdGgpOworICAgICAgICBT
ZWxlY3RPYmplY3QoaGRjLCBvbGRGb250KTsKKyAgICAgICAgUmVsZWFzZURDKDAsIGhkYyk7Cisg
ICAgICAgIHJldHVybiB3aWR0aDsKKyAgICB9CisKKyAgICAvLyBGSVhNRTogRmxlc2ggb3V0IHdp
dGggQ2Fpcm8vd2luMzIgZm9udCBpbXBsZW1lbnRhdGlvbgorICAgIG5vdEltcGxlbWVudGVkKCk7
CisKKyAgICByZXR1cm4gMDsKK30KKworfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW4vU2ltcGxlRm9udERhdGFXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCisr
KyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YVdpbi5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAy
MDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDYsIDIwMDcsIDIwMDggQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtNDgsMTE2ICs0OCwxNiBAQCB1c2luZyBzdGQ6Om1h
eDsKIAogY29uc3QgZmxvYXQgY1NtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllciA9IDAuN2Y7CiAK
LXN0YXRpYyBib29sIHNob3VsZEFwcGx5TWFjQXNjZW50SGFjazsKLQotc3RhdGljIGlubGluZSBm
bG9hdCBzY2FsZUVtVG9Vbml0cyhmbG9hdCB4LCB1bnNpZ25lZCB1bml0c1BlckVtKSB7IHJldHVy
biB1bml0c1BlckVtID8geCAvIChmbG9hdCl1bml0c1BlckVtIDogeDsgfQorc3RhdGljIGJvb2wg
Z19zaG91bGRBcHBseU1hY0FzY2VudEhhY2s7CiAKIHZvaWQgU2ltcGxlRm9udERhdGE6OnNldFNo
b3VsZEFwcGx5TWFjQXNjZW50SGFjayhib29sIGIpCiB7Ci0gICAgc2hvdWxkQXBwbHlNYWNBc2Nl
bnRIYWNrID0gYjsKLX0KLQotdm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKLXsg
ICAgCi0gICAgbV9zeW50aGV0aWNCb2xkT2Zmc2V0ID0gbV9mb250LnN5bnRoZXRpY0JvbGQoKSA/
IDEuMGYgOiAwLmY7Ci0gICAgbV9zY3JpcHRDYWNoZSA9IDA7Ci0gICAgbV9zY3JpcHRGb250UHJv
cGVydGllcyA9IDA7Ci0gICAgbV9pc1N5c3RlbUZvbnQgPSBmYWxzZTsKLSAgICAKLSAgICBpZiAo
bV9mb250LnVzZUdESSgpKSB7Ci0gICAgICAgIEhEQyBoZGMgPSBHZXREQygwKTsKLSAgICAgICAg
SEdESU9CSiBvbGRGb250ID0gU2VsZWN0T2JqZWN0KGhkYywgbV9mb250Lmhmb250KCkpOwotICAg
ICAgICBPVVRMSU5FVEVYVE1FVFJJQyBtZXRyaWNzOwotICAgICAgICBHZXRPdXRsaW5lVGV4dE1l
dHJpY3MoaGRjLCBzaXplb2YobWV0cmljcyksICZtZXRyaWNzKTsKLSAgICAgICAgVEVYVE1FVFJJ
QyYgdGV4dE1ldHJpY3MgPSBtZXRyaWNzLm90bVRleHRNZXRyaWNzOwotICAgICAgICBtX2FzY2Vu
dCA9IHRleHRNZXRyaWNzLnRtQXNjZW50OwotICAgICAgICBtX2Rlc2NlbnQgPSB0ZXh0TWV0cmlj
cy50bURlc2NlbnQ7Ci0gICAgICAgIG1fbGluZUdhcCA9IHRleHRNZXRyaWNzLnRtRXh0ZXJuYWxM
ZWFkaW5nOwotICAgICAgICBtX2xpbmVTcGFjaW5nID0gbV9hc2NlbnQgKyBtX2Rlc2NlbnQgKyBt
X2xpbmVHYXA7Ci0gICAgICAgIG1feEhlaWdodCA9IG1fYXNjZW50ICogMC41NmY7IC8vIEJlc3Qg
Z3Vlc3MgZm9yIHhIZWlnaHQgaWYgbm8geCBnbHlwaCBpcyBwcmVzZW50LgotCi0gICAgICAgIEdM
WVBITUVUUklDUyBnbTsKLSAgICAgICAgTUFUMiBtYXQgPSB7IDEsIDAsIDAsIDEgfTsKLSAgICAg
ICAgRFdPUkQgbGVuID0gR2V0R2x5cGhPdXRsaW5lKGhkYywgJ3gnLCBHR09fTUVUUklDUywgJmdt
LCAwLCAwLCAmbWF0KTsKLSAgICAgICAgaWYgKGxlbiAhPSBHRElfRVJST1IgJiYgZ20uZ21wdEds
eXBoT3JpZ2luLnkgPiAwKQotICAgICAgICAgICAgbV94SGVpZ2h0ID0gZ20uZ21wdEdseXBoT3Jp
Z2luLnk7Ci0KLSAgICAgICAgbV91bml0c1BlckVtID0gbWV0cmljcy5vdG1FTVNxdWFyZTsKLQot
ICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBvbGRGb250KTsKLSAgICAgICAgUmVsZWFzZURDKDAs
IGhkYyk7Ci0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIENHRm9udFJlZiBmb250ID0g
bV9mb250LmNnRm9udCgpOwotICAgIGludCBpQXNjZW50ID0gQ0dGb250R2V0QXNjZW50KGZvbnQp
OwotICAgIGludCBpRGVzY2VudCA9IENHRm9udEdldERlc2NlbnQoZm9udCk7Ci0gICAgaW50IGlM
aW5lR2FwID0gQ0dGb250R2V0TGVhZGluZyhmb250KTsKLSAgICBtX3VuaXRzUGVyRW0gPSBDR0Zv
bnRHZXRVbml0c1BlckVtKGZvbnQpOwotICAgIGZsb2F0IHBvaW50U2l6ZSA9IG1fZm9udC5zaXpl
KCk7Ci0gICAgZmxvYXQgZkFzY2VudCA9IHNjYWxlRW1Ub1VuaXRzKGlBc2NlbnQsIG1fdW5pdHNQ
ZXJFbSkgKiBwb2ludFNpemU7Ci0gICAgZmxvYXQgZkRlc2NlbnQgPSAtc2NhbGVFbVRvVW5pdHMo
aURlc2NlbnQsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7Ci0gICAgZmxvYXQgZkxpbmVHYXAg
PSBzY2FsZUVtVG9Vbml0cyhpTGluZUdhcCwgbV91bml0c1BlckVtKSAqIHBvaW50U2l6ZTsKLQot
ICAgIGlmICghaXNDdXN0b21Gb250KCkpIHsKLSAgICAgICAgSERDIGRjID0gR2V0REMoMCk7Ci0g
ICAgICAgIEhHRElPQkogb2xkRm9udCA9IFNlbGVjdE9iamVjdChkYywgbV9mb250Lmhmb250KCkp
OwotICAgICAgICBpbnQgZmFjZUxlbmd0aCA9IEdldFRleHRGYWNlKGRjLCAwLCAwKTsKLSAgICAg
ICAgVmVjdG9yPFRDSEFSPiBmYWNlTmFtZShmYWNlTGVuZ3RoKTsKLSAgICAgICAgR2V0VGV4dEZh
Y2UoZGMsIGZhY2VMZW5ndGgsIGZhY2VOYW1lLmRhdGEoKSk7Ci0gICAgICAgIG1faXNTeXN0ZW1G
b250ID0gIV90Y3NjbXAoZmFjZU5hbWUuZGF0YSgpLCBfVCgiTHVjaWRhIEdyYW5kZSIpKTsKLSAg
ICAgICAgU2VsZWN0T2JqZWN0KGRjLCBvbGRGb250KTsKLSAgICAgICAgUmVsZWFzZURDKDAsIGRj
KTsKLQotICAgICAgICBpZiAoc2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrKSB7Ci0gICAgICAgICAg
ICAvLyBUaGlzIGNvZGUgY29tZXMgZnJvbSBGb250RGF0YU1hYy5tbS4gV2Ugb25seSBldmVyIGRv
IHRoaXMgd2hlbiBydW5uaW5nIHJlZ3Jlc3Npb24gdGVzdHMgc28gdGhhdCBvdXIgbWV0cmljcyB3
aWxsIG1hdGNoIE1hYy4KLQotICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBhZGp1c3QgVGltZXMs
IEhlbHZldGljYSwgYW5kIENvdXJpZXIgdG8gY2xvc2VseSBtYXRjaCB0aGUKLSAgICAgICAgICAg
IC8vIHZlcnRpY2FsIG1ldHJpY3Mgb2YgdGhlaXIgTWljcm9zb2Z0IGNvdW50ZXJwYXJ0cyB0aGF0
IGFyZSB0aGUgZGUgZmFjdG8KLSAgICAgICAgICAgIC8vIHdlYiBzdGFuZGFyZC4gVGhlIEFwcEtp
dCBhZGp1c3RtZW50IG9mIDIwJSBpcyB0b28gYmlnIGFuZCBpcwotICAgICAgICAgICAgLy8gaW5j
b3JyZWN0bHkgYWRkZWQgdG8gbGluZSBzcGFjaW5nLCBzbyB3ZSB1c2UgYSAxNSUgYWRqdXN0bWVu
dCBpbnN0ZWFkCi0gICAgICAgICAgICAvLyBhbmQgYWRkIGl0IHRvIHRoZSBhc2NlbnQuCi0gICAg
ICAgICAgICBpZiAoIV90Y3NjbXAoZmFjZU5hbWUuZGF0YSgpLCBfVCgiVGltZXMiKSkgfHwgIV90
Y3NjbXAoZmFjZU5hbWUuZGF0YSgpLCBfVCgiSGVsdmV0aWNhIikpIHx8ICFfdGNzY21wKGZhY2VO
YW1lLmRhdGEoKSwgX1QoIkNvdXJpZXIiKSkpCi0gICAgICAgICAgICAgICAgZkFzY2VudCArPSBm
bG9vcmYoKChmQXNjZW50ICsgZkRlc2NlbnQpICogMC4xNWYpICsgMC41Zik7Ci0gICAgICAgIH0K
LSAgICB9Ci0KLSAgICBtX2FzY2VudCA9IGxyb3VuZGYoZkFzY2VudCk7Ci0gICAgbV9kZXNjZW50
ID0gbHJvdW5kZihmRGVzY2VudCk7Ci0gICAgbV9saW5lR2FwID0gbHJvdW5kZihmTGluZUdhcCk7
Ci0gICAgbV9saW5lU3BhY2luZyA9IG1fYXNjZW50ICsgbV9kZXNjZW50ICsgbV9saW5lR2FwOwot
Ci0gICAgLy8gTWVhc3VyZSB0aGUgYWN0dWFsIGNoYXJhY3RlciAieCIsIGJlY2F1c2UgQXBwS2l0
IHN5bnRoZXNpemVzIFggaGVpZ2h0IHJhdGhlciB0aGFuIGdldHRpbmcgaXQgZnJvbSB0aGUgZm9u
dC4KLSAgICAvLyBVbmZvcnR1bmF0ZWx5LCBOU0ZvbnQgd2lsbCByb3VuZCB0aGlzIGZvciB1cyBz
byB3ZSBkb24ndCBxdWl0ZSBnZXQgdGhlIHJpZ2h0IHZhbHVlLgotICAgIEdseXBoUGFnZSogZ2x5
cGhQYWdlWmVybyA9IEdseXBoUGFnZVRyZWVOb2RlOjpnZXRSb290Q2hpbGQodGhpcywgMCktPnBh
Z2UoKTsKLSAgICBHbHlwaCB4R2x5cGggPSBnbHlwaFBhZ2VaZXJvID8gZ2x5cGhQYWdlWmVyby0+
Z2x5cGhEYXRhRm9yQ2hhcmFjdGVyKCd4JykuZ2x5cGggOiAwOwotICAgIGlmICh4R2x5cGgpIHsK
LSAgICAgICAgQ0dSZWN0IHhCb3g7Ci0gICAgICAgIENHRm9udEdldEdseXBoQkJveGVzKGZvbnQs
ICZ4R2x5cGgsIDEsICZ4Qm94KTsKLSAgICAgICAgLy8gVXNlIHRoZSBtYXhpbXVtIG9mIGVpdGhl
ciB3aWR0aCBvciBoZWlnaHQgYmVjYXVzZSAieCIgaXMgbmVhcmx5IHNxdWFyZQotICAgICAgICAv
LyBhbmQgd2ViIHBhZ2VzIHRoYXQgZm9vbGlzaGx5IHVzZSB0aGlzIG1ldHJpYyBmb3Igd2lkdGgg
d2lsbCBiZSBsYWlkIG91dAotICAgICAgICAvLyBwb29ybHkgaWYgd2UgcmV0dXJuIGFuIGFjY3Vy
YXRlIGhlaWdodC4gQ2xhc3NpYyBjYXNlIGlzIFRpbWVzIDEzIHBvaW50LAotICAgICAgICAvLyB3
aGljaCBoYXMgYW4gIngiIHRoYXQgaXMgN3g2IHBpeGVscy4KLSAgICAgICAgbV94SGVpZ2h0ID0g
c2NhbGVFbVRvVW5pdHMobWF4KENHUmVjdEdldE1heFgoeEJveCksIENHUmVjdEdldE1heFkoeEJv
eCkpLCBtX3VuaXRzUGVyRW0pICogcG9pbnRTaXplOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlu
dCBpWEhlaWdodCA9IENHRm9udEdldFhIZWlnaHQoZm9udCk7Ci0gICAgICAgIG1feEhlaWdodCA9
IHNjYWxlRW1Ub1VuaXRzKGlYSGVpZ2h0LCBtX3VuaXRzUGVyRW0pICogcG9pbnRTaXplOwotICAg
IH0KKyAgICBnX3Nob3VsZEFwcGx5TWFjQXNjZW50SGFjayA9IGI7CiB9CiAKLXZvaWQgU2ltcGxl
Rm9udERhdGE6OnBsYXRmb3JtRGVzdHJveSgpCitib29sIFNpbXBsZUZvbnREYXRhOjpzaG91bGRB
cHBseU1hY0FzY2VudEhhY2soKQogewotICAgIGlmICghaXNDdXN0b21Gb250KCkpIHsKLSAgICAg
ICAgRGVsZXRlT2JqZWN0KG1fZm9udC5oZm9udCgpKTsKLSAgICAgICAgQ0dGb250UmVsZWFzZSht
X2ZvbnQuY2dGb250KCkpOwotICAgIH0KLQotICAgIC8vIFdlIGRvbid0IGhhc2ggdGhpcyBvbiBX
aW4zMiwgc28gaXQncyBlZmZlY3RpdmVseSBvd25lZCBieSB1cy4KLSAgICBkZWxldGUgbV9zbWFs
bENhcHNGb250RGF0YTsKLQotICAgIFNjcmlwdEZyZWVDYWNoZSgmbV9zY3JpcHRDYWNoZSk7Ci0g
ICAgZGVsZXRlIG1fc2NyaXB0Rm9udFByb3BlcnRpZXM7CisgICAgcmV0dXJuIGdfc2hvdWxkQXBw
bHlNYWNBc2NlbnRIYWNrOwogfQogCiBTaW1wbGVGb250RGF0YSogU2ltcGxlRm9udERhdGE6OnNt
YWxsQ2Fwc0ZvbnREYXRhKGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uKSBj
b25zdApAQCAtMjM3LDI4ICsxMzcsNiBAQCB2b2lkIFNpbXBsZUZvbnREYXRhOjpkZXRlcm1pbmVQ
aXRjaCgpCiAgICAgUmVsZWFzZURDKDAsIGRjKTsKIH0KIAotZmxvYXQgU2ltcGxlRm9udERhdGE6
OnBsYXRmb3JtV2lkdGhGb3JHbHlwaChHbHlwaCBnbHlwaCkgY29uc3QKLXsKLSAgICBpZiAobV9m
b250LnVzZUdESSgpKSB7Ci0gICAgICAgIEhEQyBoZGMgPSBHZXREQygwKTsKLSAgICAgICAgSEdE
SU9CSiBvbGRGb250ID0gU2VsZWN0T2JqZWN0KGhkYywgbV9mb250Lmhmb250KCkpOwotICAgICAg
ICBpbnQgd2lkdGg7Ci0gICAgICAgIEdldENoYXJXaWR0aEkoaGRjLCBnbHlwaCwgMSwgMCwgJndp
ZHRoKTsKLSAgICAgICAgU2VsZWN0T2JqZWN0KGhkYywgb2xkRm9udCk7Ci0gICAgICAgIFJlbGVh
c2VEQygwLCBoZGMpOwotICAgICAgICByZXR1cm4gd2lkdGg7Ci0gICAgfQotCi0gICAgQ0dGb250
UmVmIGZvbnQgPSBtX2ZvbnQuY2dGb250KCk7Ci0gICAgZmxvYXQgcG9pbnRTaXplID0gbV9mb250
LnNpemUoKTsKLSAgICBDR1NpemUgYWR2YW5jZTsKLSAgICBDR0FmZmluZVRyYW5zZm9ybSBtID0g
Q0dBZmZpbmVUcmFuc2Zvcm1NYWtlU2NhbGUocG9pbnRTaXplLCBwb2ludFNpemUpOwotICAgIC8v
IEZJWE1FOiBOZWVkIHRvIGFkZCByZWFsIHN1cHBvcnQgZm9yIHByaW50ZXIgZm9udHMuCi0gICAg
Ym9vbCBpc1ByaW50ZXJGb250ID0gZmFsc2U7Ci0gICAgd2tHZXRHbHlwaEFkdmFuY2VzKGZvbnQs
IG0sIG1faXNTeXN0ZW1Gb250LCBpc1ByaW50ZXJGb250LCBnbHlwaCwgYWR2YW5jZSk7Ci0gICAg
cmV0dXJuIGFkdmFuY2Uud2lkdGggKyBtX3N5bnRoZXRpY0JvbGRPZmZzZXQ7Ci19Ci0KIFNDUklQ
VF9GT05UUFJPUEVSVElFUyogU2ltcGxlRm9udERhdGE6OnNjcmlwdEZvbnRQcm9wZXJ0aWVzKCkg
Y29uc3QKIHsKICAgICBpZiAoIW1fc2NyaXB0Rm9udFByb3BlcnRpZXMpIHsKSW5kZXg6IFdlYkNv
cmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNHV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL3dpbi9EcmFnSW1hZ2VDR1dpbi5jcHAJKHJldmlzaW9uIDI5ODM0KQkoZnJvbSBX
ZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFnSW1hZ2VXaW4uY3BwOjI5ODM0KQorKysgV2ViQ29yZS9w
bGF0Zm9ybS93aW4vRHJhZ0ltYWdlQ0dXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MTkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJEcmFnSW1h
Z2UuaCIKKworI2luY2x1ZGUgIkNhY2hlZEltYWdlLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250
ZXh0LmgiCisjaW5jbHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJSZXRhaW5QdHIuaCIKKworI2lu
Y2x1ZGUgPENvcmVHcmFwaGljcy9Db3JlR3JhcGhpY3MuaD4KKworI2luY2x1ZGUgPHdpbmRvd3Mu
aD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitJbnRTaXplIGRyYWdJbWFnZVNpemUoRHJhZ0lt
YWdlUmVmIGltYWdlKQoreworICAgIGlmICghaW1hZ2UpCisgICAgICAgIHJldHVybiBJbnRTaXpl
KCk7CisgICAgQklUTUFQIGI7CisgICAgR2V0T2JqZWN0KGltYWdlLCBzaXplb2YoQklUTUFQKSwg
JmIpOworICAgIHJldHVybiBJbnRTaXplKGIuYm1XaWR0aCwgYi5ibUhlaWdodCk7Cit9CisKK3Zv
aWQgZGVsZXRlRHJhZ0ltYWdlKERyYWdJbWFnZVJlZiBpbWFnZSkKK3sKKyAgICBpZiAoaW1hZ2Up
CisgICAgICAgIDo6RGVsZXRlT2JqZWN0KGltYWdlKTsKK30KKworSEJJVE1BUCBhbGxvY0ltYWdl
KEhEQyBkYywgSW50U2l6ZSBzaXplLCBDR0NvbnRleHRSZWYgKnRhcmdldFJlZikKK3sKKyAgICBI
QklUTUFQIGhibXA7CisgICAgQklUTUFQSU5GTyBibXBJbmZvID0gezB9OworICAgIGJtcEluZm8u
Ym1pSGVhZGVyLmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKKyAgICBibXBJbmZv
LmJtaUhlYWRlci5iaVdpZHRoID0gc2l6ZS53aWR0aCgpOworICAgIGJtcEluZm8uYm1pSGVhZGVy
LmJpSGVpZ2h0ID0gc2l6ZS5oZWlnaHQoKTsKKyAgICBibXBJbmZvLmJtaUhlYWRlci5iaVBsYW5l
cyA9IDE7CisgICAgYm1wSW5mby5ibWlIZWFkZXIuYmlCaXRDb3VudCA9IDMyOworICAgIGJtcElu
Zm8uYm1pSGVhZGVyLmJpQ29tcHJlc3Npb24gPSBCSV9SR0I7CisgICAgTFBWT0lEIGJpdHM7Cisg
ICAgaGJtcCA9IENyZWF0ZURJQlNlY3Rpb24oZGMsICZibXBJbmZvLCBESUJfUkdCX0NPTE9SUywg
JmJpdHMsIDAsIDApOworCisgICAgaWYgKCF0YXJnZXRSZWYpCisgICAgICAgIHJldHVybiBoYm1w
OworCisgICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURl
dmljZVJHQigpOworICAgIENHQ29udGV4dFJlZiBiaXRtYXBDb250ZXh0ID0gQ0dCaXRtYXBDb250
ZXh0Q3JlYXRlKGJpdHMsIGJtcEluZm8uYm1pSGVhZGVyLmJpV2lkdGgsIGJtcEluZm8uYm1pSGVh
ZGVyLmJpSGVpZ2h0LCA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpV2lkdGggKiA0LCBkZXZpY2VSR0Is
IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwga0NHSW1hZ2VBbHBoYU5vbmVTa2lwRmlyc3Qp
OworICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKKyAgICBpZiAoIWJpdG1hcENv
bnRleHQpIHsKKyAgICAgICAgRGVsZXRlT2JqZWN0KGhibXApOworICAgICAgICByZXR1cm4gMDsK
KyAgICB9CisKKyAgICAqdGFyZ2V0UmVmID0gYml0bWFwQ29udGV4dDsKKyAgICByZXR1cm4gaGJt
cDsKK30KKworc3RhdGljIENHQ29udGV4dFJlZiBjcmVhdGVDZ0NvbnRleHRGcm9tQml0bWFwKEhC
SVRNQVAgYml0bWFwKQoreworICAgIEJJVE1BUCBpbmZvOworICAgIEdldE9iamVjdChiaXRtYXAs
IHNpemVvZihpbmZvKSwgJmluZm8pOworICAgIEFTU0VSVChpbmZvLmJtQml0c1BpeGVsID09IDMy
KTsKKworICAgIENHQ29sb3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVE
ZXZpY2VSR0IoKTsKKyAgICBDR0NvbnRleHRSZWYgYml0bWFwQ29udGV4dCA9IENHQml0bWFwQ29u
dGV4dENyZWF0ZShpbmZvLmJtQml0cywgaW5mby5ibVdpZHRoLCBpbmZvLmJtSGVpZ2h0LCA4LAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlu
Zm8uYm1XaWR0aEJ5dGVzLCBkZXZpY2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwg
a0NHSW1hZ2VBbHBoYU5vbmVTa2lwRmlyc3QpOworICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2
aWNlUkdCKTsKKyAgICByZXR1cm4gYml0bWFwQ29udGV4dDsKK30KKworRHJhZ0ltYWdlUmVmIHNj
YWxlRHJhZ0ltYWdlKERyYWdJbWFnZVJlZiBpbWFnZSwgRmxvYXRTaXplIHNjYWxlKQoreworICAg
IC8vIEZJWE1FOiBkdWUgdG8gdGhlIHdheSBkcmFnIGltYWdlcyBhcmUgZG9uZSBvbiB3aW5kb3dz
IHdlIG5lZWQgCisgICAgLy8gdG8gcHJlcHJvY2VzcyB0aGUgYWxwaGEgY2hhbm5lbCA8cmRhcjov
L3Byb2JsZW0vNTAxNTk0Nj4KKworICAgIGlmICghaW1hZ2UpCisgICAgICAgIHJldHVybiAwOwor
ICAgIENHQ29udGV4dFJlZiB0YXJnZXRDb250ZXh0OworICAgIENHQ29udGV4dFJlZiBzcmNDb250
ZXh0OworICAgIENHSW1hZ2VSZWYgc3JjSW1hZ2U7CisgICAgSW50U2l6ZSBzcmNTaXplID0gZHJh
Z0ltYWdlU2l6ZShpbWFnZSk7CisgICAgSW50U2l6ZSBkc3RTaXplKChpbnQpKHNyY1NpemUud2lk
dGgoKSAqIHNjYWxlLndpZHRoKCkpLCAoaW50KShzcmNTaXplLmhlaWdodCgpICogc2NhbGUuaGVp
Z2h0KCkpKTsKKyAgICBIQklUTUFQIGhibXAgPSAwOworICAgIEhEQyBkYyA9IEdldERDKDApOwor
ICAgIEhEQyBkc3REQyA9IENyZWF0ZUNvbXBhdGlibGVEQyhkYyk7CisgICAgaWYgKCFkc3REQykK
KyAgICAgICAgZ290byBleGl0OworCisgICAgaGJtcCA9IGFsbG9jSW1hZ2UoZHN0REMsIGRzdFNp
emUsICZ0YXJnZXRDb250ZXh0KTsKKyAgICBpZiAoIWhibXApCisgICAgICAgIGdvdG8gZXhpdDsK
KworICAgIHNyY0NvbnRleHQgPSBjcmVhdGVDZ0NvbnRleHRGcm9tQml0bWFwKGltYWdlKTsKKyAg
ICBzcmNJbWFnZSA9IENHQml0bWFwQ29udGV4dENyZWF0ZUltYWdlKHNyY0NvbnRleHQpOworICAg
IENHUmVjdCByZWN0OworICAgIHJlY3Qub3JpZ2luLnggPSAwOworICAgIHJlY3Qub3JpZ2luLnkg
PSAwOworICAgIHJlY3Quc2l6ZSA9IGRzdFNpemU7CisgICAgQ0dDb250ZXh0RHJhd0ltYWdlKHRh
cmdldENvbnRleHQsIHJlY3QsIHNyY0ltYWdlKTsKKyAgICBDR0ltYWdlUmVsZWFzZShzcmNJbWFn
ZSk7CisgICAgQ0dDb250ZXh0UmVsZWFzZShzcmNDb250ZXh0KTsKKyAgICBDR0NvbnRleHRSZWxl
YXNlKHRhcmdldENvbnRleHQpOworICAgIDo6RGVsZXRlT2JqZWN0KGltYWdlKTsKKyAgICBpbWFn
ZSA9IDA7CisKK2V4aXQ6CisgICAgaWYgKCFoYm1wKQorICAgICAgICBoYm1wID0gaW1hZ2U7Cisg
ICAgaWYgKGRzdERDKQorICAgICAgICBEZWxldGVEQyhkc3REQyk7CisgICAgUmVsZWFzZURDKDAs
IGRjKTsKKyAgICByZXR1cm4gaGJtcDsKK30KKyAgICAKK0RyYWdJbWFnZVJlZiBkaXNzb2x2ZURy
YWdJbWFnZVRvRnJhY3Rpb24oRHJhZ0ltYWdlUmVmIGltYWdlLCBmbG9hdCkKK3sKKyAgICAvL1dl
IGRvbid0IGRvIHRoaXMgb24gd2luZG93cyBhcyB0aGUgZHJhZ2ltYWdlIGlzIGJsZW5kZWQgYnkg
dGhlIE9TCisgICAgcmV0dXJuIGltYWdlOworfQorICAgICAgICAKK0RyYWdJbWFnZVJlZiBjcmVh
dGVEcmFnSW1hZ2VGcm9tSW1hZ2UoSW1hZ2UqIGltZykKK3sgICAgCisgICAgSEJJVE1BUCBoYm1w
ID0gMDsKKyAgICBIREMgZGMgPSBHZXREQygwKTsKKyAgICBIREMgd29ya2luZ0RDID0gQ3JlYXRl
Q29tcGF0aWJsZURDKGRjKTsKKyAgICBDR0NvbnRleHRSZWYgZHJhd0NvbnRleHQgPSAwOworICAg
IGlmICghd29ya2luZ0RDKQorICAgICAgICBnb3RvIGV4aXQ7CisKKyAgICBoYm1wID0gYWxsb2NJ
bWFnZSh3b3JraW5nREMsIGltZy0+c2l6ZSgpLCAmZHJhd0NvbnRleHQpOworCisgICAgaWYgKCFo
Ym1wKQorICAgICAgICBnb3RvIGV4aXQ7CisKKyAgICBpZiAoIWRyYXdDb250ZXh0KSB7CisgICAg
ICAgIDo6RGVsZXRlT2JqZWN0KGhibXApOworICAgICAgICBoYm1wID0gMDsKKyAgICB9CisKKyAg
ICBDR0ltYWdlUmVmIHNyY0ltYWdlID0gaW1nLT5nZXRDR0ltYWdlUmVmKCk7CisgICAgQ0dSZWN0
IHJlY3Q7CisgICAgcmVjdC5zaXplID0gaW1nLT5zaXplKCk7CisgICAgcmVjdC5vcmlnaW4ueCA9
IDA7CisgICAgcmVjdC5vcmlnaW4ueSA9IC1yZWN0LnNpemUuaGVpZ2h0OworICAgIHN0YXRpYyBj
b25zdCBDR0Zsb2F0IHdoaXRlIFtdID0gezEuMCwgMS4wLCAxLjAsIDEuMH07CisgICAgQ0dDb250
ZXh0U2NhbGVDVE0oZHJhd0NvbnRleHQsIDEsIC0xKTsKKyAgICBDR0NvbnRleHRTZXRGaWxsQ29s
b3IoZHJhd0NvbnRleHQsIHdoaXRlKTsKKyAgICBDR0NvbnRleHRGaWxsUmVjdChkcmF3Q29udGV4
dCwgcmVjdCk7CisgICAgQ0dDb250ZXh0U2V0QmxlbmRNb2RlKGRyYXdDb250ZXh0LCBrQ0dCbGVu
ZE1vZGVOb3JtYWwpOworICAgIENHQ29udGV4dERyYXdJbWFnZShkcmF3Q29udGV4dCwgcmVjdCwg
c3JjSW1hZ2UpOworICAgIENHQ29udGV4dFJlbGVhc2UoZHJhd0NvbnRleHQpOworCitleGl0Ogor
ICAgIGlmICh3b3JraW5nREMpCisgICAgICAgIERlbGV0ZURDKHdvcmtpbmdEQyk7CisgICAgUmVs
ZWFzZURDKDAsIGRjKTsKKyAgICByZXR1cm4gaGJtcDsKK30KKyAgICAKK0RyYWdJbWFnZVJlZiBj
cmVhdGVEcmFnSW1hZ2VJY29uRm9yQ2FjaGVkSW1hZ2UoQ2FjaGVkSW1hZ2UqKQoreworICAgIC8v
RklYTUU6IFByb3ZpZGUgaWNvbiBmb3IgaW1hZ2UgdHlwZSA8cmRhcjovL3Byb2JsZW0vNTAxNTk0
OT4KKyAgICByZXR1cm4gMDsgICAgIAorfQorICAgIAorfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9y
bS93aW4vRHJhZ0ltYWdlQ0dXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0v
d2luL0RyYWdJbWFnZUNHV2luLmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL3dpbi9EcmFnSW1hZ2VDR1dpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBA
CiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMzcsMjEgKzM3LDYgQEAKIAog
bmFtZXNwYWNlIFdlYkNvcmUgewogCi1JbnRTaXplIGRyYWdJbWFnZVNpemUoRHJhZ0ltYWdlUmVm
IGltYWdlKQotewotICAgIGlmICghaW1hZ2UpCi0gICAgICAgIHJldHVybiBJbnRTaXplKCk7Ci0g
ICAgQklUTUFQIGI7Ci0gICAgR2V0T2JqZWN0KGltYWdlLCBzaXplb2YoQklUTUFQKSwgJmIpOwot
ICAgIHJldHVybiBJbnRTaXplKGIuYm1XaWR0aCwgYi5ibUhlaWdodCk7Ci19Ci0KLXZvaWQgZGVs
ZXRlRHJhZ0ltYWdlKERyYWdJbWFnZVJlZiBpbWFnZSkKLXsKLSAgICBpZiAoaW1hZ2UpCi0gICAg
ICAgIDo6RGVsZXRlT2JqZWN0KGltYWdlKTsKLX0KLQogSEJJVE1BUCBhbGxvY0ltYWdlKEhEQyBk
YywgSW50U2l6ZSBzaXplLCBDR0NvbnRleHRSZWYgKnRhcmdldFJlZikKIHsKICAgICBIQklUTUFQ
IGhibXA7CkBAIC0xMDYsNyArOTEsNyBAQCBEcmFnSW1hZ2VSZWYgc2NhbGVEcmFnSW1hZ2UoRHJh
Z0ltYWdlUmVmCiAgICAgQ0dDb250ZXh0UmVmIHNyY0NvbnRleHQ7CiAgICAgQ0dJbWFnZVJlZiBz
cmNJbWFnZTsKICAgICBJbnRTaXplIHNyY1NpemUgPSBkcmFnSW1hZ2VTaXplKGltYWdlKTsKLSAg
ICBJbnRTaXplIGRzdFNpemUoKGludCkoc3JjU2l6ZS53aWR0aCgpICogc2NhbGUud2lkdGgoKSks
IChpbnQpKHNyY1NpemUuaGVpZ2h0KCkgKiBzY2FsZS5oZWlnaHQoKSkpOworICAgIEludFNpemUg
ZHN0U2l6ZShzdGF0aWNfY2FzdDxpbnQ+KHNyY1NpemUud2lkdGgoKSAqIHNjYWxlLndpZHRoKCkp
LCBzdGF0aWNfY2FzdDxpbnQ+KHNyY1NpemUuaGVpZ2h0KCkgKiBzY2FsZS5oZWlnaHQoKSkpOwog
ICAgIEhCSVRNQVAgaGJtcCA9IDA7CiAgICAgSERDIGRjID0gR2V0REMoMCk7CiAgICAgSERDIGRz
dERDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGRjKTsKQEAgLTEzOSwxNCArMTI0LDggQEAgZXhpdDoK
ICAgICByZXR1cm4gaGJtcDsKIH0KICAgICAKLURyYWdJbWFnZVJlZiBkaXNzb2x2ZURyYWdJbWFn
ZVRvRnJhY3Rpb24oRHJhZ0ltYWdlUmVmIGltYWdlLCBmbG9hdCkKLXsKLSAgICAvL1dlIGRvbid0
IGRvIHRoaXMgb24gd2luZG93cyBhcyB0aGUgZHJhZ2ltYWdlIGlzIGJsZW5kZWQgYnkgdGhlIE9T
Ci0gICAgcmV0dXJuIGltYWdlOwotfQotICAgICAgICAKIERyYWdJbWFnZVJlZiBjcmVhdGVEcmFn
SW1hZ2VGcm9tSW1hZ2UoSW1hZ2UqIGltZykKLXsgICAgCit7CiAgICAgSEJJVE1BUCBoYm1wID0g
MDsKICAgICBIREMgZGMgPSBHZXREQygwKTsKICAgICBIREMgd29ya2luZ0RDID0gQ3JlYXRlQ29t
cGF0aWJsZURDKGRjKTsKQEAgLTE4NCwxMCArMTYzLDQgQEAgZXhpdDoKICAgICByZXR1cm4gaGJt
cDsKIH0KICAgICAKLURyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VJY29uRm9yQ2FjaGVkSW1h
Z2UoQ2FjaGVkSW1hZ2UqKQotewotICAgIC8vRklYTUU6IFByb3ZpZGUgaWNvbiBmb3IgaW1hZ2Ug
dHlwZSA8cmRhcjovL3Byb2JsZW0vNTAxNTk0OT4KLSAgICByZXR1cm4gMDsgICAgIAotfQotICAg
IAogfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlQ2Fpcm9XaW4uY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNhaXJvV2luLmNwcAko
cmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNhaXJvV2luLmNw
cAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
OCBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiRHJhZ0ltYWdlLmgiCisKKyNpbmNsdWRlICJDYWNoZWRJbWFnZS5o
IgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkltYWdlLmgiCisjaW5j
bHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJSZXRhaW5QdHIuaCIKKworI2luY2x1
ZGUgPHdpbmRvd3MuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitEcmFnSW1hZ2VSZWYgc2Nh
bGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVmIGltYWdlLCBGbG9hdFNpemUgc2NhbGUpCit7CisgICAg
bm90SW1wbGVtZW50ZWQoKTsKKworICAgIHJldHVybiBpbWFnZTsKK30KKyAgICAKK0RyYWdJbWFn
ZVJlZiBjcmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2UoSW1hZ2UqIGltZykKK3sKKyAgICBub3RJbXBs
ZW1lbnRlZCgpOworCisgICAgRHJhZ0ltYWdlUmVmIHRlbXA7CisgICAgcmV0dXJuIHRlbXA7Cit9
CisgICAgCit9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFnSW1hZ2VXaW4uY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZVdpbi5jcHAJKHJldmlz
aW9uIDI5ODM0KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlV2luLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBw
bGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNywgMjAw
OCBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCkBAIC0zMSw4ICszMSw2IEBACiAjaW5jbHVkZSAiSW1hZ2UuaCIKICNpbmNsdWRl
ICJSZXRhaW5QdHIuaCIKIAotI2luY2x1ZGUgPENvcmVHcmFwaGljcy9Db3JlR3JhcGhpY3MuaD4K
LQogI2luY2x1ZGUgPHdpbmRvd3MuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewpAQCAtNTIsMTM4
ICs1MCwxMiBAQCB2b2lkIGRlbGV0ZURyYWdJbWFnZShEcmFnSW1hZ2VSZWYgaW1hZ2UpCiAgICAg
ICAgIDo6RGVsZXRlT2JqZWN0KGltYWdlKTsKIH0KIAotSEJJVE1BUCBhbGxvY0ltYWdlKEhEQyBk
YywgSW50U2l6ZSBzaXplLCBDR0NvbnRleHRSZWYgKnRhcmdldFJlZikKLXsKLSAgICBIQklUTUFQ
IGhibXA7Ci0gICAgQklUTUFQSU5GTyBibXBJbmZvID0gezB9OwotICAgIGJtcEluZm8uYm1pSGVh
ZGVyLmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKLSAgICBibXBJbmZvLmJtaUhl
YWRlci5iaVdpZHRoID0gc2l6ZS53aWR0aCgpOwotICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpSGVp
Z2h0ID0gc2l6ZS5oZWlnaHQoKTsKLSAgICBibXBJbmZvLmJtaUhlYWRlci5iaVBsYW5lcyA9IDE7
Ci0gICAgYm1wSW5mby5ibWlIZWFkZXIuYmlCaXRDb3VudCA9IDMyOwotICAgIGJtcEluZm8uYm1p
SGVhZGVyLmJpQ29tcHJlc3Npb24gPSBCSV9SR0I7Ci0gICAgTFBWT0lEIGJpdHM7Ci0gICAgaGJt
cCA9IENyZWF0ZURJQlNlY3Rpb24oZGMsICZibXBJbmZvLCBESUJfUkdCX0NPTE9SUywgJmJpdHMs
IDAsIDApOwotCi0gICAgaWYgKCF0YXJnZXRSZWYpCi0gICAgICAgIHJldHVybiBoYm1wOwotCi0g
ICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJH
QigpOwotICAgIENHQ29udGV4dFJlZiBiaXRtYXBDb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3Jl
YXRlKGJpdHMsIGJtcEluZm8uYm1pSGVhZGVyLmJpV2lkdGgsIGJtcEluZm8uYm1pSGVhZGVyLmJp
SGVpZ2h0LCA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpV2lkdGggKiA0LCBkZXZpY2VSR0IsIAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDR0Jp
dG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwga0NHSW1hZ2VBbHBoYU5vbmVTa2lwRmlyc3QpOwotICAg
IENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKLSAgICBpZiAoIWJpdG1hcENvbnRleHQp
IHsKLSAgICAgICAgRGVsZXRlT2JqZWN0KGhibXApOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9
Ci0KLSAgICAqdGFyZ2V0UmVmID0gYml0bWFwQ29udGV4dDsKLSAgICByZXR1cm4gaGJtcDsKLX0K
LQotc3RhdGljIENHQ29udGV4dFJlZiBjcmVhdGVDZ0NvbnRleHRGcm9tQml0bWFwKEhCSVRNQVAg
Yml0bWFwKQotewotICAgIEJJVE1BUCBpbmZvOwotICAgIEdldE9iamVjdChiaXRtYXAsIHNpemVv
ZihpbmZvKSwgJmluZm8pOwotICAgIEFTU0VSVChpbmZvLmJtQml0c1BpeGVsID09IDMyKTsKLQot
ICAgIENHQ29sb3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VS
R0IoKTsKLSAgICBDR0NvbnRleHRSZWYgYml0bWFwQ29udGV4dCA9IENHQml0bWFwQ29udGV4dENy
ZWF0ZShpbmZvLmJtQml0cywgaW5mby5ibVdpZHRoLCBpbmZvLmJtSGVpZ2h0LCA4LAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uYm1X
aWR0aEJ5dGVzLCBkZXZpY2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwga0NHSW1h
Z2VBbHBoYU5vbmVTa2lwRmlyc3QpOwotICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdC
KTsKLSAgICByZXR1cm4gYml0bWFwQ29udGV4dDsKLX0KLQotRHJhZ0ltYWdlUmVmIHNjYWxlRHJh
Z0ltYWdlKERyYWdJbWFnZVJlZiBpbWFnZSwgRmxvYXRTaXplIHNjYWxlKQotewotICAgIC8vIEZJ
WE1FOiBkdWUgdG8gdGhlIHdheSBkcmFnIGltYWdlcyBhcmUgZG9uZSBvbiB3aW5kb3dzIHdlIG5l
ZWQgCi0gICAgLy8gdG8gcHJlcHJvY2VzcyB0aGUgYWxwaGEgY2hhbm5lbCA8cmRhcjovL3Byb2Js
ZW0vNTAxNTk0Nj4KLQotICAgIGlmICghaW1hZ2UpCi0gICAgICAgIHJldHVybiAwOwotICAgIENH
Q29udGV4dFJlZiB0YXJnZXRDb250ZXh0OwotICAgIENHQ29udGV4dFJlZiBzcmNDb250ZXh0Owot
ICAgIENHSW1hZ2VSZWYgc3JjSW1hZ2U7Ci0gICAgSW50U2l6ZSBzcmNTaXplID0gZHJhZ0ltYWdl
U2l6ZShpbWFnZSk7Ci0gICAgSW50U2l6ZSBkc3RTaXplKChpbnQpKHNyY1NpemUud2lkdGgoKSAq
IHNjYWxlLndpZHRoKCkpLCAoaW50KShzcmNTaXplLmhlaWdodCgpICogc2NhbGUuaGVpZ2h0KCkp
KTsKLSAgICBIQklUTUFQIGhibXAgPSAwOwotICAgIEhEQyBkYyA9IEdldERDKDApOwotICAgIEhE
QyBkc3REQyA9IENyZWF0ZUNvbXBhdGlibGVEQyhkYyk7Ci0gICAgaWYgKCFkc3REQykKLSAgICAg
ICAgZ290byBleGl0OwotCi0gICAgaGJtcCA9IGFsbG9jSW1hZ2UoZHN0REMsIGRzdFNpemUsICZ0
YXJnZXRDb250ZXh0KTsKLSAgICBpZiAoIWhibXApCi0gICAgICAgIGdvdG8gZXhpdDsKLQotICAg
IHNyY0NvbnRleHQgPSBjcmVhdGVDZ0NvbnRleHRGcm9tQml0bWFwKGltYWdlKTsKLSAgICBzcmNJ
bWFnZSA9IENHQml0bWFwQ29udGV4dENyZWF0ZUltYWdlKHNyY0NvbnRleHQpOwotICAgIENHUmVj
dCByZWN0OwotICAgIHJlY3Qub3JpZ2luLnggPSAwOwotICAgIHJlY3Qub3JpZ2luLnkgPSAwOwot
ICAgIHJlY3Quc2l6ZSA9IGRzdFNpemU7Ci0gICAgQ0dDb250ZXh0RHJhd0ltYWdlKHRhcmdldENv
bnRleHQsIHJlY3QsIHNyY0ltYWdlKTsKLSAgICBDR0ltYWdlUmVsZWFzZShzcmNJbWFnZSk7Ci0g
ICAgQ0dDb250ZXh0UmVsZWFzZShzcmNDb250ZXh0KTsKLSAgICBDR0NvbnRleHRSZWxlYXNlKHRh
cmdldENvbnRleHQpOwotICAgIDo6RGVsZXRlT2JqZWN0KGltYWdlKTsKLSAgICBpbWFnZSA9IDA7
Ci0KLWV4aXQ6Ci0gICAgaWYgKCFoYm1wKQotICAgICAgICBoYm1wID0gaW1hZ2U7Ci0gICAgaWYg
KGRzdERDKQotICAgICAgICBEZWxldGVEQyhkc3REQyk7Ci0gICAgUmVsZWFzZURDKDAsIGRjKTsK
LSAgICByZXR1cm4gaGJtcDsKLX0KLSAgICAKIERyYWdJbWFnZVJlZiBkaXNzb2x2ZURyYWdJbWFn
ZVRvRnJhY3Rpb24oRHJhZ0ltYWdlUmVmIGltYWdlLCBmbG9hdCkKIHsKICAgICAvL1dlIGRvbid0
IGRvIHRoaXMgb24gd2luZG93cyBhcyB0aGUgZHJhZ2ltYWdlIGlzIGJsZW5kZWQgYnkgdGhlIE9T
CiAgICAgcmV0dXJuIGltYWdlOwogfQogICAgICAgICAKLURyYWdJbWFnZVJlZiBjcmVhdGVEcmFn
SW1hZ2VGcm9tSW1hZ2UoSW1hZ2UqIGltZykKLXsgICAgCi0gICAgSEJJVE1BUCBoYm1wID0gMDsK
LSAgICBIREMgZGMgPSBHZXREQygwKTsKLSAgICBIREMgd29ya2luZ0RDID0gQ3JlYXRlQ29tcGF0
aWJsZURDKGRjKTsKLSAgICBDR0NvbnRleHRSZWYgZHJhd0NvbnRleHQgPSAwOwotICAgIGlmICgh
d29ya2luZ0RDKQotICAgICAgICBnb3RvIGV4aXQ7Ci0KLSAgICBoYm1wID0gYWxsb2NJbWFnZSh3
b3JraW5nREMsIGltZy0+c2l6ZSgpLCAmZHJhd0NvbnRleHQpOwotCi0gICAgaWYgKCFoYm1wKQot
ICAgICAgICBnb3RvIGV4aXQ7Ci0KLSAgICBpZiAoIWRyYXdDb250ZXh0KSB7Ci0gICAgICAgIDo6
RGVsZXRlT2JqZWN0KGhibXApOwotICAgICAgICBoYm1wID0gMDsKLSAgICB9Ci0KLSAgICBDR0lt
YWdlUmVmIHNyY0ltYWdlID0gaW1nLT5nZXRDR0ltYWdlUmVmKCk7Ci0gICAgQ0dSZWN0IHJlY3Q7
Ci0gICAgcmVjdC5zaXplID0gaW1nLT5zaXplKCk7Ci0gICAgcmVjdC5vcmlnaW4ueCA9IDA7Ci0g
ICAgcmVjdC5vcmlnaW4ueSA9IC1yZWN0LnNpemUuaGVpZ2h0OwotICAgIHN0YXRpYyBjb25zdCBD
R0Zsb2F0IHdoaXRlIFtdID0gezEuMCwgMS4wLCAxLjAsIDEuMH07Ci0gICAgQ0dDb250ZXh0U2Nh
bGVDVE0oZHJhd0NvbnRleHQsIDEsIC0xKTsKLSAgICBDR0NvbnRleHRTZXRGaWxsQ29sb3IoZHJh
d0NvbnRleHQsIHdoaXRlKTsKLSAgICBDR0NvbnRleHRGaWxsUmVjdChkcmF3Q29udGV4dCwgcmVj
dCk7Ci0gICAgQ0dDb250ZXh0U2V0QmxlbmRNb2RlKGRyYXdDb250ZXh0LCBrQ0dCbGVuZE1vZGVO
b3JtYWwpOwotICAgIENHQ29udGV4dERyYXdJbWFnZShkcmF3Q29udGV4dCwgcmVjdCwgc3JjSW1h
Z2UpOwotICAgIENHQ29udGV4dFJlbGVhc2UoZHJhd0NvbnRleHQpOwotCi1leGl0OgotICAgIGlm
ICh3b3JraW5nREMpCi0gICAgICAgIERlbGV0ZURDKHdvcmtpbmdEQyk7Ci0gICAgUmVsZWFzZURD
KDAsIGRjKTsKLSAgICByZXR1cm4gaGJtcDsKLX0KLSAgICAKIERyYWdJbWFnZVJlZiBjcmVhdGVE
cmFnSW1hZ2VJY29uRm9yQ2FjaGVkSW1hZ2UoQ2FjaGVkSW1hZ2UqKQogewogICAgIC8vRklYTUU6
IFByb3ZpZGUgaWNvbiBmb3IgaW1hZ2UgdHlwZSA8cmRhcjovL3Byb2JsZW0vNTAxNTk0OT4K
</data>
<flag name="review"
          id="8196"
          type_id="1"
          status="-"
          setter="aroben"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>18805</attachid>
            <date>2008-01-30 17:52:32 -0800</date>
            <delta_ts>2008-01-30 22:44:45 -0800</delta_ts>
            <desc>Sixth revision based on Adam&apos;s comments.</desc>
            <filename>webcore_win32.patch</filename>
            <type>text/plain</type>
            <size>200885</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyOTg0NykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNzQgQEAKKzIwMDgtMDEtMjkgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBnbWFp
bC5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
Rmlyc3Qgc3RlcCB0b3dhcmRzIHJlZW5hYmxpbmcgQ2Fpcm8gc3VwcG9ydCB1bmRlciBXaW5kb3dz
LgorICAgICAgICAtIGFkZHMgdmFyaW91cyBQTEFURk9STSBndWFyZHMgdG8gY29kZSB0aGF0IHdp
bGwgbm90IGJ1aWxkCisgICAgICAgICAgdW5kZXIgQ2Fpcm8uCisgICAgICAgIC0gYnJlYWtzIHNv
bWUgZmlsZXMgaW50byBDRyBhbmQgQ2Fpcm8tc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zLgorICAg
ICAgICAtIHByb3ZpZGVzIHNvbWUgd2luMzIvQ2Fpcm8gc3VwcG9ydCAoYnV0IGJ5IG5vIG1lYW5z
IGEgY29tcGxldGUKKyAgICAgICAgICBwb3J0IC0tIHlldCkuCisKKyAgICAgICAgV0FSTklORzog
Tk8gVEVTVCBDQVNFUyBBRERFRCBPUiBDSEFOR0VECisKKyAgICAgICAgKiBXZWJDb3JlLnZjcHJv
ai9XZWJDb3JlLnZjcHJvajoKKyAgICAgICAgKiBicmlkZ2Uvd2luL0ZyYW1lQ0dXaW4uY3BwOiBD
b3BpZWQgZnJvbSBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVXaW4uY3BwLgorICAgICAgICAoV2Vi
Q29yZTo6aW1hZ2VGcm9tU2VsZWN0aW9uKToKKyAgICAgICAgKiBicmlkZ2Uvd2luL0ZyYW1lQ2Fp
cm9XaW4uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OmltYWdlRnJvbVNlbGVjdGlvbik6
CisgICAgICAgICogYnJpZGdlL3dpbi9GcmFtZVdpbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpj
b21wdXRlUGFnZVJlY3RzRm9yRnJhbWUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL1Np
bXBsZUZvbnREYXRhLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhp
Y3NDb250ZXh0Q2Fpcm8uY3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZS5oOiBDb3BpZWQgZnJvbSBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4dENhaXJvLmNwcC4KKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENHV2luLmNwcDogQ29waWVkIGZyb20gV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udFdpbi5jcHAuCisgICAgICAgIChXZWJDb3JlOjpGb250
OjpkcmF3R2x5cGhzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENhaXJv
V2luLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpGb250OjpkcmF3R2x5cGhzKToKKyAg
ICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udFdpbi5jcHA6CisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENHV2luLmNwcDogQ29waWVkIGZyb20g
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0V2luLmNwcC4KKyAg
ICAgICAgKFdlYkNvcmU6OkNHQ29udGV4dFdpdGhIREMpOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0OjpnZXRXaW5kb3dzQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQ6OnJlbGVhc2VXaW5kb3dzQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNvbmNhdENUTSk6CisgICAgICAgIChXZWJD
b3JlOjpzZXRDR1N0cm9rZUNvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dDo6ZHJhd0xpbmVGb3JNaXNzcGVsbGluZ09yQmFkR3JhbW1hcik6CisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENhaXJvV2luLmNwcDogQWRkZWQuCisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dCk6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmdldFdpbmRvd3NDb250ZXh0KToKKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6aW5UcmFuc3BhcmVuY3lMYXllcik6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnJlbGVhc2VXaW5kb3dzQ29udGV4dCk6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNvbmNhdENUTSk6
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1c1JpbmcpOgorICAg
ICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvck1pc3NwZWxsaW5nT3JC
YWRHcmFtbWFyKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250
ZXh0V2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZTo6c2NhbGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlOjpyb3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0UGxhdGZv
cm1Qcml2YXRlOjp0cmFuc2xhdGUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9J
bWFnZUNHV2luLmNwcDogQ29waWVkIGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4v
SW1hZ2VXaW4uY3BwLgorICAgICAgICAoV2ViQ29yZTo6Qml0bWFwSW1hZ2U6OmdldEhCSVRNQVBP
ZlNpemUpOgorICAgICAgICAoV2ViQ29yZTo6Qml0bWFwSW1hZ2U6OmRyYXdGcmFtZU1hdGNoaW5n
U291cmNlU2l6ZSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ2Fpcm9X
aW4uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdlOjpnZXRIQklUTUFQ
T2ZTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdlOjpkcmF3RnJhbWVNYXRjaGlu
Z1NvdXJjZVNpemUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZVdpbi5j
cHA6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ0dXaW4u
Y3BwOiBDb3BpZWQgZnJvbSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250
RGF0YVdpbi5jcHAuCisgICAgICAgIChXZWJDb3JlOjpzY2FsZUVtVG9Vbml0cyk6CisgICAgICAg
IChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KToKKyAgICAgICAgKFdlYkNv
cmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybVdpZHRoRm9yR2x5cGgpOgorICAgICAgICAqIHBs
YXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNhaXJvV2luLmNwcDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KToKKyAgICAgICAg
KFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3kpOgorICAgICAgICAoV2Vi
Q29yZTo6U2ltcGxlRm9udERhdGE6OnBsYXRmb3JtV2lkdGhGb3JHbHlwaCk6CisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhV2luLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OlNpbXBsZUZvbnREYXRhOjpzZXRTaG91bGRBcHBseU1hY0FzY2VudEhhY2spOgorICAg
ICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnNob3VsZEFwcGx5TWFjQXNjZW50SGFjayk6
CisgICAgICAgICogcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNHV2luLmNwcDogQ29waWVkIGZyb20g
V2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlV2luLmNwcC4KKyAgICAgICAgKFdlYkNvcmU6
OnNjYWxlRHJhZ0ltYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OmNyZWF0ZURyYWdJbWFnZUZyb21J
bWFnZSk6CisgICAgICAgICogcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNhaXJvV2luLmNwcDogQWRk
ZWQuCisgICAgICAgIChXZWJDb3JlOjpzY2FsZURyYWdJbWFnZSk6CisgICAgICAgIChXZWJDb3Jl
OjpjcmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2UpOgorICAgICAgICAqIHBsYXRmb3JtL3dpbi9EcmFn
SW1hZ2VXaW4uY3BwOgorCiAyMDA4LTAxLTI5ICBBZGFtIFJvYmVuICA8YXJvYmVuQGFwcGxlLmNv
bT4KIAogICAgICAgICBGaXggPHJkYXI6Ly81NzExMTM2PiBGdWxsLXNjcmVlbiBGbGFzaCBvbiAx
dXAuY29tIGlzIHVucmVzcG9uc2l2ZQpJbmRleDogV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJD
b3JlLnZjcHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUu
dmNwcm9qCShyZXZpc2lvbiAyOTcyNikKKysrIFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29y
ZS52Y3Byb2oJKHdvcmtpbmcgY29weSkKQEAgLTM0MTgsNiArMzQxOCwxMCBAQAogCQkJCQk+DQog
CQkJCTwvRmlsZT4NCiAJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1c
d2luXERyYWdJbWFnZUNHV2luLmNwcCINCisJCQkJCT4NCisJCQkJPC9GaWxlPg0KKwkJCQk8Rmls
ZQ0KIAkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVx3aW5cRHJhZ0ltYWdlV2luLmNwcCIN
CiAJCQkJCT4NCiAJCQkJPC9GaWxlPg0KQEAgLTM4NzYsNiArMzg4MCwxMCBAQAogCQkJCQkJPg0K
IAkJCQkJPC9GaWxlPg0KIAkJCQkJPEZpbGUNCisJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRm
b3JtXGdyYXBoaWNzXHdpblxGb250Q0dXaW4uY3BwIg0KKwkJCQkJCT4NCisJCQkJCTwvRmlsZT4N
CisJCQkJCTxGaWxlDQogCQkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1x3
aW5cRm9udEN1c3RvbVBsYXRmb3JtRGF0YS5jcHAiDQogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0K
QEAgLTM5MzIsNiArMzk0MCwxMCBAQAogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KIAkJCQkJPEZp
bGUNCisJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxHcmFwaGlj
c0NvbnRleHRDR1dpbi5jcHAiDQorCQkJCQkJPg0KKwkJCQkJPC9GaWxlPg0KKwkJCQkJPEZpbGUN
CiAJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxHcmFwaGljc0Nv
bnRleHRXaW4uY3BwIg0KIAkJCQkJCT4NCiAJCQkJCTwvRmlsZT4NCkBAIC0zOTQwLDYgKzM5NTIs
MTAgQEAKIAkJCQkJCT4NCiAJCQkJCTwvRmlsZT4NCiAJCQkJCTxGaWxlDQorCQkJCQkJUmVsYXRp
dmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1x3aW5cSW1hZ2VDR1dpbi5jcHAiDQorCQkJCQkJ
Pg0KKwkJCQkJPC9GaWxlPg0KKwkJCQkJPEZpbGUNCiAJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBs
YXRmb3JtXGdyYXBoaWNzXHdpblxJbWFnZVdpbi5jcHAiDQogCQkJCQkJPg0KIAkJCQkJPC9GaWxl
Pg0KQEAgLTM5NjQsNiArMzk4MCwxMCBAQAogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KIAkJCQkJ
PEZpbGUNCisJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxTaW1w
bGVGb250RGF0YUNHV2luLmNwcCINCisJCQkJCQk+DQorCQkJCQk8L0ZpbGU+DQorCQkJCQk8Rmls
ZQ0KIAkJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cZ3JhcGhpY3Ncd2luXFNpbXBsZUZv
bnREYXRhV2luLmNwcCINCiAJCQkJCQk+DQogCQkJCQk8L0ZpbGU+DQpAQCAtNjQwOCw2ICs2NDI4
LDEwIEBACiAJCQkJTmFtZT0id2luIg0KIAkJCQk+DQogCQkJCTxGaWxlDQorCQkJCQlSZWxhdGl2
ZVBhdGg9Ii4uXGJyaWRnZVx3aW5cRnJhbWVDR1dpbi5jcHAiDQorCQkJCQk+DQorCQkJCTwvRmls
ZT4NCisJCQkJPEZpbGUNCiAJCQkJCVJlbGF0aXZlUGF0aD0iLi5cYnJpZGdlXHdpblxGcmFtZVdp
bi5jcHAiDQogCQkJCQk+DQogCQkJCTwvRmlsZT4NCkluZGV4OiBXZWJDb3JlL2JyaWRnZS93aW4v
RnJhbWVDR1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lQ0dX
aW4uY3BwCShyZXZpc2lvbiAyOTgzNCkJKGZyb20gV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lV2lu
LmNwcDoyOTgzNCkKKysrIFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZUNHV2luLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAw
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJGcmFtZVdpbi5oIgorCisjaW5jbHVkZSA8d2luc29jazIuaD4KKyNp
bmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKKyNpbmNs
dWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkVkaXRv
ckNsaWVudC5oIgorI2luY2x1ZGUgIkZyYW1lTG9hZGVyLmgiCisjaW5jbHVkZSAiRnJhbWVMb2Fk
UmVxdWVzdC5oIgorI2luY2x1ZGUgIkZyYW1lUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkZyYW1lVmll
dy5oIgorI2luY2x1ZGUgIkhUTUxJRnJhbWVFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTE5hbWVz
LmgiCisjaW5jbHVkZSAiSFRNTFRhYmxlQ2VsbEVsZW1lbnQuaCIKKyNpbmNsdWRlICJLZXlib2Fy
ZEV2ZW50LmgiCisjaW5jbHVkZSAiTlBfanNvYmplY3QuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1l
bnRlZC5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRlICJQbHVnaW4uaCIKKyNpbmNsdWRl
ICJQbHVnaW5EYXRhYmFzZVdpbi5oIgorI2luY2x1ZGUgIlBsdWdpblZpZXdXaW4uaCIKKyNpbmNs
dWRlICJSZWd1bGFyRXhwcmVzc2lvbi5oIgorI2luY2x1ZGUgIlJlbmRlckZyYW1lLmgiCisjaW5j
bHVkZSAiUmVuZGVyVGFibGVDZWxsLmgiCisjaW5jbHVkZSAiUmVuZGVyVmlldy5oIgorI2luY2x1
ZGUgIlJlc291cmNlSGFuZGxlLmgiCisjaW5jbHVkZSAiVGV4dFJlc291cmNlRGVjb2Rlci5oIgor
I2luY2x1ZGUgImtqc19wcm94eS5oIgorI2luY2x1ZGUgImtqc193aW5kb3cuaCIKKyNpbmNsdWRl
ICJucHJ1bnRpbWVfaW1wbC5oIgorI2luY2x1ZGUgInJ1bnRpbWVfcm9vdC5oIgorI2luY2x1ZGUg
IkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIlNldHRpbmdzLmgiCisKKyNpZiBQTEFURk9S
TShDRykKKyNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ29yZUdyYXBoaWNzLmg+CisjZW5kaWYKKwor
dXNpbmcgc3RkOjptaW47Cit1c2luZyBuYW1lc3BhY2UgS0pTOjpCaW5kaW5nczsKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCit1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOworCit2b2lkIEZyYW1l
OjpjbGVhclBsYXRmb3JtU2NyaXB0T2JqZWN0cygpCit7Cit9CisKK0tKUzo6QmluZGluZ3M6Oklu
c3RhbmNlKiBGcmFtZTo6Y3JlYXRlU2NyaXB0SW5zdGFuY2VGb3JXaWRnZXQoV2lkZ2V0KiB3aWRn
ZXQpCit7CisgICAgLy8gRklYTUU6IElkZWFsbHkgd2UnZCBoYXZlIGFuIGlzUGx1Z2luVmlldygp
IGhlcmUgYnV0IHdlIGNhbid0IGFkZCB0aGF0IHRvIHRoZSBvcGVuIHNvdXJjZSB0cmVlIHJpZ2h0
IG5vdy4KKyAgICBpZiAod2lkZ2V0LT5pc0ZyYW1lVmlldygpKQorICAgICAgICByZXR1cm4gMDsK
KworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQbHVnaW5WaWV3V2luKj4od2lkZ2V0KS0+YmluZGlu
Z0luc3RhbmNlKCk7Cit9CisKKwordm9pZCBjb21wdXRlUGFnZVJlY3RzRm9yRnJhbWUoRnJhbWUq
IGZyYW1lLCBjb25zdCBJbnRSZWN0JiBwcmludFJlY3QsIGZsb2F0IGhlYWRlckhlaWdodCwgZmxv
YXQgZm9vdGVySGVpZ2h0LCBmbG9hdCB1c2VyU2NhbGVGYWN0b3IsVmVjdG9yPEludFJlY3Q+JiBw
YWdlcywgaW50JiBvdXRQYWdlSGVpZ2h0KQoreworICAgIEFTU0VSVChmcmFtZSk7CisKKyAgICBw
YWdlcy5jbGVhcigpOworICAgIG91dFBhZ2VIZWlnaHQgPSAwOworCisgICAgaWYgKCFmcmFtZS0+
ZG9jdW1lbnQoKSB8fCAhZnJhbWUtPnZpZXcoKSB8fCAhZnJhbWUtPmRvY3VtZW50KCktPnJlbmRl
cmVyKCkpCisgICAgICAgIHJldHVybjsKKyAKKyAgICBSZW5kZXJWaWV3KiByb290ID0gc3RhdGlj
X2Nhc3Q8UmVuZGVyVmlldyAqPihmcmFtZS0+ZG9jdW1lbnQoKS0+cmVuZGVyZXIoKSk7CisKKyAg
ICBpZiAoIXJvb3QpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJkb2N1bWVudCB0byBiZSBwcmludGVk
IGhhcyBubyByZW5kZXJlciIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHVz
ZXJTY2FsZUZhY3RvciA8PSAwKSB7CisgICAgICAgIExPR19FUlJPUigidXNlclNjYWxlRmFjdG9y
IGhhcyBiYWQgdmFsdWUgJS4yZiIsIHVzZXJTY2FsZUZhY3Rvcik7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisgICAgCisgICAgZmxvYXQgcmF0aW8gPSAoZmxvYXQpcHJpbnRSZWN0LmhlaWdodCgp
IC8gKGZsb2F0KXByaW50UmVjdC53aWR0aCgpOworIAorICAgIGZsb2F0IHBhZ2VXaWR0aCAgPSAo
ZmxvYXQpIHJvb3QtPmRvY1dpZHRoKCk7CisgICAgZmxvYXQgcGFnZUhlaWdodCA9IHBhZ2VXaWR0
aCAqIHJhdGlvOworICAgIG91dFBhZ2VIZWlnaHQgPSAoaW50KSBwYWdlSGVpZ2h0OyAgIC8vIHRo
aXMgaXMgdGhlIGhlaWdodCBvZiB0aGUgcGFnZSBhZGp1c3RlZCBieSBtYXJnaW5zCisgICAgcGFn
ZUhlaWdodCAtPSAoaGVhZGVySGVpZ2h0ICsgZm9vdGVySGVpZ2h0KTsKKworICAgIGlmIChwYWdl
SGVpZ2h0IDw9IDApIHsKKyAgICAgICAgTE9HX0VSUk9SKCJwYWdlSGVpZ2h0IGhhcyBiYWQgdmFs
dWUgJS4yZiIsIHBhZ2VIZWlnaHQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZmxv
YXQgY3VyclBhZ2VIZWlnaHQgPSBwYWdlSGVpZ2h0IC8gdXNlclNjYWxlRmFjdG9yOworICAgIGZs
b2F0IGRvY0hlaWdodCAgICAgID0gcm9vdC0+bGF5ZXIoKS0+aGVpZ2h0KCk7CisgICAgZmxvYXQg
ZG9jV2lkdGggICAgICAgPSByb290LT5sYXllcigpLT53aWR0aCgpOworICAgIGZsb2F0IGN1cnJQ
YWdlV2lkdGggID0gcGFnZVdpZHRoIC8gdXNlclNjYWxlRmFjdG9yOworCisgICAgCisgICAgLy8g
YWx3YXlzIHJldHVybiBhdCBsZWFzdCBvbmUgcGFnZSwgc2luY2UgZW1wdHkgZmlsZXMgc2hvdWxk
IHByaW50IGEgYmxhbmsgcGFnZQorICAgIGZsb2F0IHByaW50ZWRQYWdlc0hlaWdodCA9IDAuMDsK
KyAgICBkbyB7CisgICAgICAgIGZsb2F0IHByb3Bvc2VkQm90dG9tID0gbWluKGRvY0hlaWdodCwg
cHJpbnRlZFBhZ2VzSGVpZ2h0ICsgcGFnZUhlaWdodCk7CisgICAgICAgIGZyYW1lLT5hZGp1c3RQ
YWdlSGVpZ2h0KCZwcm9wb3NlZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0LCBwcm9wb3NlZEJv
dHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0KTsKKyAgICAgICAgY3VyclBhZ2VIZWlnaHQgPSBtYXgo
MS4wZiwgcHJvcG9zZWRCb3R0b20gLSBwcmludGVkUGFnZXNIZWlnaHQpOworICAgICAgIAorICAg
ICAgICBwYWdlcy5hcHBlbmQoSW50UmVjdCgwLHByaW50ZWRQYWdlc0hlaWdodCxjdXJyUGFnZVdp
ZHRoLGN1cnJQYWdlSGVpZ2h0KSk7CisgICAgICAgIHByaW50ZWRQYWdlc0hlaWdodCArPSBjdXJy
UGFnZUhlaWdodDsKKyAgICB9IHdoaWxlIChwcmludGVkUGFnZXNIZWlnaHQgPCBkb2NIZWlnaHQp
OworfQorCitzdGF0aWMgdm9pZCBkcmF3UmVjdEludG9Db250ZXh0KEludFJlY3QgcmVjdCwgRnJh
bWVWaWV3KiB2aWV3LCBHcmFwaGljc0NvbnRleHQqIGdjKQoreworICAgIEludFNpemUgb2Zmc2V0
ID0gdmlldy0+c2Nyb2xsT2Zmc2V0KCk7CisgICAgcmVjdC5tb3ZlKC1vZmZzZXQud2lkdGgoKSwg
LW9mZnNldC5oZWlnaHQoKSk7CisgICAgcmVjdCA9IHZpZXctPmNvbnZlcnRUb0NvbnRhaW5pbmdX
aW5kb3cocmVjdCk7CisKKyAgICBnYy0+Y29uY2F0Q1RNKEFmZmluZVRyYW5zZm9ybSgpLnRyYW5z
bGF0ZSgtcmVjdC54KCksIC1yZWN0LnkoKSkpOworCisgICAgdmlldy0+cGFpbnQoZ2MsIHJlY3Qp
OworfQorCitIQklUTUFQIGltYWdlRnJvbVNlbGVjdGlvbihGcmFtZSogZnJhbWUsIGJvb2wgZm9y
Y2VCbGFja1RleHQpCit7CisgICAgZnJhbWUtPnNldFBhaW50UmVzdHJpY3Rpb24oZm9yY2VCbGFj
a1RleHQgPyBQYWludFJlc3RyaWN0aW9uU2VsZWN0aW9uT25seUJsYWNrVGV4dCA6IFBhaW50UmVz
dHJpY3Rpb25TZWxlY3Rpb25Pbmx5KTsKKyAgICBGbG9hdFJlY3QgZnIgPSBmcmFtZS0+c2VsZWN0
aW9uUmVjdCgpOworICAgIEludFJlY3QgaXIoKGludClmci54KCksIChpbnQpZnIueSgpLChpbnQp
ZnIud2lkdGgoKSwoaW50KWZyLmhlaWdodCgpKTsKKworICAgIHZvaWQqIGJpdHM7CisgICAgSERD
IGhkYyA9IENyZWF0ZUNvbXBhdGlibGVEQygwKTsKKyAgICBpbnQgdyA9IGlyLndpZHRoKCk7Cisg
ICAgaW50IGggPSBpci5oZWlnaHQoKTsKKyAgICBCSVRNQVBJTkZPIGJtcCA9IHsgeyBzaXplb2Yo
QklUTUFQSU5GT0hFQURFUiksIHcsIGgsIDEsIDMyIH0gfTsKKworICAgIEhCSVRNQVAgaGJtcCA9
IENyZWF0ZURJQlNlY3Rpb24oMCwgJmJtcCwgRElCX1JHQl9DT0xPUlMsICh2b2lkKiopJmJpdHMs
IDAsIDApOworICAgIEhCSVRNQVAgaGJtcE9sZCA9IChIQklUTUFQKVNlbGVjdE9iamVjdChoZGMs
IGhibXApOworICAgIENHQ29sb3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVh
dGVEZXZpY2VSR0IoKTsKKyAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IENHQml0bWFwQ29udGV4
dENyZWF0ZSgodm9pZCopYml0cywgdywgaCwKKyAgICAgICAgOCwgdyAqIHNpemVvZihSR0JRVUFE
KSwgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFQ
cmVtdWx0aXBsaWVkRmlyc3QpOworICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsK
KyAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQpOworCisgICAgR3JhcGhpY3NDb250ZXh0
IGdjKGNvbnRleHQpOworCisgICAgZnJhbWUtPmRvY3VtZW50KCktPnVwZGF0ZUxheW91dCgpOwor
ICAgIGRyYXdSZWN0SW50b0NvbnRleHQoaXIsIGZyYW1lLT52aWV3KCksICZnYyk7CisKKyAgICBD
R0NvbnRleHRSZWxlYXNlKGNvbnRleHQpOworICAgIFNlbGVjdE9iamVjdChoZGMsIGhibXBPbGQp
OworICAgIERlbGV0ZURDKGhkYyk7CisKKyAgICBmcmFtZS0+c2V0UGFpbnRSZXN0cmljdGlvbihQ
YWludFJlc3RyaWN0aW9uTm9uZSk7CisKKyAgICByZXR1cm4gaGJtcDsKK30KKworRHJhZ0ltYWdl
UmVmIEZyYW1lOjpkcmFnSW1hZ2VGb3JTZWxlY3Rpb24oKQoreyAgICAKKyAgICBpZiAoc2VsZWN0
aW9uQ29udHJvbGxlcigpLT5pc1JhbmdlKCkpCisgICAgICAgIHJldHVybiBpbWFnZUZyb21TZWxl
Y3Rpb24odGhpcywgZmFsc2UpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgRnJhbWU6OmRh
c2hib2FyZFJlZ2lvbnNDaGFuZ2VkKCkKK3sKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJ
bmRleDogV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lQ0dXaW4uY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvYnJpZGdlL3dpbi9GcmFtZUNHV2luLmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJD
b3JlL2JyaWRnZS93aW4vRnJhbWVDR1dpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1
IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAg
LTI2LDExNyArMjYsMTggQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJGcmFtZVdp
bi5oIgogCi0jaW5jbHVkZSA8d2luc29jazIuaD4KICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAKLSNp
bmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKLSNpbmNsdWRlICJGbG9hdFJlY3QuaCIKLSNpbmNs
dWRlICJEb2N1bWVudC5oIgotI2luY2x1ZGUgIkVkaXRvckNsaWVudC5oIgotI2luY2x1ZGUgIkZy
YW1lTG9hZGVyLmgiCi0jaW5jbHVkZSAiRnJhbWVMb2FkUmVxdWVzdC5oIgotI2luY2x1ZGUgIkZy
YW1lUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkZyYW1lVmlldy5oIgotI2luY2x1ZGUgIkhUTUxJRnJh
bWVFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTE5hbWVzLmgiCi0jaW5jbHVkZSAiSFRNTFRhYmxl
Q2VsbEVsZW1lbnQuaCIKLSNpbmNsdWRlICJLZXlib2FyZEV2ZW50LmgiCi0jaW5jbHVkZSAiTlBf
anNvYmplY3QuaCIKLSNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgotI2luY2x1ZGUgIlBhZ2Uu
aCIKLSNpbmNsdWRlICJQbHVnaW4uaCIKLSNpbmNsdWRlICJQbHVnaW5EYXRhYmFzZVdpbi5oIgot
I2luY2x1ZGUgIlBsdWdpblZpZXdXaW4uaCIKLSNpbmNsdWRlICJSZWd1bGFyRXhwcmVzc2lvbi5o
IgotI2luY2x1ZGUgIlJlbmRlckZyYW1lLmgiCi0jaW5jbHVkZSAiUmVuZGVyVGFibGVDZWxsLmgi
Ci0jaW5jbHVkZSAiUmVuZGVyVmlldy5oIgotI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlLmgiCi0j
aW5jbHVkZSAiVGV4dFJlc291cmNlRGVjb2Rlci5oIgotI2luY2x1ZGUgImtqc19wcm94eS5oIgot
I2luY2x1ZGUgImtqc193aW5kb3cuaCIKLSNpbmNsdWRlICJucHJ1bnRpbWVfaW1wbC5oIgotI2lu
Y2x1ZGUgInJ1bnRpbWVfcm9vdC5oIgogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2lu
Y2x1ZGUgIlNldHRpbmdzLmgiCiAKLSNpZiBQTEFURk9STShDRykKICNpbmNsdWRlIDxDb3JlR3Jh
cGhpY3MvQ29yZUdyYXBoaWNzLmg+Ci0jZW5kaWYKIAogdXNpbmcgc3RkOjptaW47Ci11c2luZyBu
YW1lc3BhY2UgS0pTOjpCaW5kaW5nczsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi11c2luZyBu
YW1lc3BhY2UgSFRNTE5hbWVzOwotCi12b2lkIEZyYW1lOjpjbGVhclBsYXRmb3JtU2NyaXB0T2Jq
ZWN0cygpCi17Ci19Ci0KLUtKUzo6QmluZGluZ3M6Okluc3RhbmNlKiBGcmFtZTo6Y3JlYXRlU2Ny
aXB0SW5zdGFuY2VGb3JXaWRnZXQoV2lkZ2V0KiB3aWRnZXQpCi17Ci0gICAgLy8gRklYTUU6IElk
ZWFsbHkgd2UnZCBoYXZlIGFuIGlzUGx1Z2luVmlldygpIGhlcmUgYnV0IHdlIGNhbid0IGFkZCB0
aGF0IHRvIHRoZSBvcGVuIHNvdXJjZSB0cmVlIHJpZ2h0IG5vdy4KLSAgICBpZiAod2lkZ2V0LT5p
c0ZyYW1lVmlldygpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxQbHVnaW5WaWV3V2luKj4od2lkZ2V0KS0+YmluZGluZ0luc3RhbmNlKCk7Ci19Ci0KLQotdm9p
ZCBjb21wdXRlUGFnZVJlY3RzRm9yRnJhbWUoRnJhbWUqIGZyYW1lLCBjb25zdCBJbnRSZWN0JiBw
cmludFJlY3QsIGZsb2F0IGhlYWRlckhlaWdodCwgZmxvYXQgZm9vdGVySGVpZ2h0LCBmbG9hdCB1
c2VyU2NhbGVGYWN0b3IsVmVjdG9yPEludFJlY3Q+JiBwYWdlcywgaW50JiBvdXRQYWdlSGVpZ2h0
KQotewotICAgIEFTU0VSVChmcmFtZSk7Ci0KLSAgICBwYWdlcy5jbGVhcigpOwotICAgIG91dFBh
Z2VIZWlnaHQgPSAwOwotCi0gICAgaWYgKCFmcmFtZS0+ZG9jdW1lbnQoKSB8fCAhZnJhbWUtPnZp
ZXcoKSB8fCAhZnJhbWUtPmRvY3VtZW50KCktPnJlbmRlcmVyKCkpCi0gICAgICAgIHJldHVybjsK
LSAKLSAgICBSZW5kZXJWaWV3KiByb290ID0gc3RhdGljX2Nhc3Q8UmVuZGVyVmlldyAqPihmcmFt
ZS0+ZG9jdW1lbnQoKS0+cmVuZGVyZXIoKSk7Ci0KLSAgICBpZiAoIXJvb3QpIHsKLSAgICAgICAg
TE9HX0VSUk9SKCJkb2N1bWVudCB0byBiZSBwcmludGVkIGhhcyBubyByZW5kZXJlciIpOwotICAg
ICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHVzZXJTY2FsZUZhY3RvciA8PSAwKSB7Ci0g
ICAgICAgIExPR19FUlJPUigidXNlclNjYWxlRmFjdG9yIGhhcyBiYWQgdmFsdWUgJS4yZiIsIHVz
ZXJTY2FsZUZhY3Rvcik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgZmxvYXQg
cmF0aW8gPSAoZmxvYXQpcHJpbnRSZWN0LmhlaWdodCgpIC8gKGZsb2F0KXByaW50UmVjdC53aWR0
aCgpOwotIAotICAgIGZsb2F0IHBhZ2VXaWR0aCAgPSAoZmxvYXQpIHJvb3QtPmRvY1dpZHRoKCk7
Ci0gICAgZmxvYXQgcGFnZUhlaWdodCA9IHBhZ2VXaWR0aCAqIHJhdGlvOwotICAgIG91dFBhZ2VI
ZWlnaHQgPSAoaW50KSBwYWdlSGVpZ2h0OyAgIC8vIHRoaXMgaXMgdGhlIGhlaWdodCBvZiB0aGUg
cGFnZSBhZGp1c3RlZCBieSBtYXJnaW5zCi0gICAgcGFnZUhlaWdodCAtPSAoaGVhZGVySGVpZ2h0
ICsgZm9vdGVySGVpZ2h0KTsKLQotICAgIGlmIChwYWdlSGVpZ2h0IDw9IDApIHsKLSAgICAgICAg
TE9HX0VSUk9SKCJwYWdlSGVpZ2h0IGhhcyBiYWQgdmFsdWUgJS4yZiIsIHBhZ2VIZWlnaHQpOwot
ICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZmxvYXQgY3VyclBhZ2VIZWlnaHQgPSBwYWdl
SGVpZ2h0IC8gdXNlclNjYWxlRmFjdG9yOwotICAgIGZsb2F0IGRvY0hlaWdodCAgICAgID0gcm9v
dC0+bGF5ZXIoKS0+aGVpZ2h0KCk7Ci0gICAgZmxvYXQgZG9jV2lkdGggICAgICAgPSByb290LT5s
YXllcigpLT53aWR0aCgpOwotICAgIGZsb2F0IGN1cnJQYWdlV2lkdGggID0gcGFnZVdpZHRoIC8g
dXNlclNjYWxlRmFjdG9yOwotCi0gICAgCi0gICAgLy8gYWx3YXlzIHJldHVybiBhdCBsZWFzdCBv
bmUgcGFnZSwgc2luY2UgZW1wdHkgZmlsZXMgc2hvdWxkIHByaW50IGEgYmxhbmsgcGFnZQotICAg
IGZsb2F0IHByaW50ZWRQYWdlc0hlaWdodCA9IDAuMDsKLSAgICBkbyB7Ci0gICAgICAgIGZsb2F0
IHByb3Bvc2VkQm90dG9tID0gbWluKGRvY0hlaWdodCwgcHJpbnRlZFBhZ2VzSGVpZ2h0ICsgcGFn
ZUhlaWdodCk7Ci0gICAgICAgIGZyYW1lLT5hZGp1c3RQYWdlSGVpZ2h0KCZwcm9wb3NlZEJvdHRv
bSwgcHJpbnRlZFBhZ2VzSGVpZ2h0LCBwcm9wb3NlZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0
KTsKLSAgICAgICAgY3VyclBhZ2VIZWlnaHQgPSBtYXgoMS4wZiwgcHJvcG9zZWRCb3R0b20gLSBw
cmludGVkUGFnZXNIZWlnaHQpOwotICAgICAgIAotICAgICAgICBwYWdlcy5hcHBlbmQoSW50UmVj
dCgwLHByaW50ZWRQYWdlc0hlaWdodCxjdXJyUGFnZVdpZHRoLGN1cnJQYWdlSGVpZ2h0KSk7Ci0g
ICAgICAgIHByaW50ZWRQYWdlc0hlaWdodCArPSBjdXJyUGFnZUhlaWdodDsKLSAgICB9IHdoaWxl
IChwcmludGVkUGFnZXNIZWlnaHQgPCBkb2NIZWlnaHQpOwotfQotCiBzdGF0aWMgdm9pZCBkcmF3
UmVjdEludG9Db250ZXh0KEludFJlY3QgcmVjdCwgRnJhbWVWaWV3KiB2aWV3LCBHcmFwaGljc0Nv
bnRleHQqIGdjKQogewogICAgIEludFNpemUgb2Zmc2V0ID0gdmlldy0+c2Nyb2xsT2Zmc2V0KCk7
CkBAIC0xNTIsNyArNTMsOCBAQCBIQklUTUFQIGltYWdlRnJvbVNlbGVjdGlvbihGcmFtZSogZnJh
bWUsCiB7CiAgICAgZnJhbWUtPnNldFBhaW50UmVzdHJpY3Rpb24oZm9yY2VCbGFja1RleHQgPyBQ
YWludFJlc3RyaWN0aW9uU2VsZWN0aW9uT25seUJsYWNrVGV4dCA6IFBhaW50UmVzdHJpY3Rpb25T
ZWxlY3Rpb25Pbmx5KTsKICAgICBGbG9hdFJlY3QgZnIgPSBmcmFtZS0+c2VsZWN0aW9uUmVjdCgp
OwotICAgIEludFJlY3QgaXIoKGludClmci54KCksIChpbnQpZnIueSgpLChpbnQpZnIud2lkdGgo
KSwoaW50KWZyLmhlaWdodCgpKTsKKyAgICBJbnRSZWN0IGlyKHN0YXRpY19jYXN0PGludD4oZnIu
eCgpKSwgc3RhdGljX2Nhc3Q8aW50Pihmci55KCkpLAorICAgICAgICAgICAgICAgc3RhdGljX2Nh
c3Q8aW50Pihmci53aWR0aCgpKSwgc3RhdGljX2Nhc3Q8aW50Pihmci5oZWlnaHQoKSkpOwogCiAg
ICAgdm9pZCogYml0czsKICAgICBIREMgaGRjID0gQ3JlYXRlQ29tcGF0aWJsZURDKDApOwpAQCAt
MTYwLDEwICs2MiwxMCBAQCBIQklUTUFQIGltYWdlRnJvbVNlbGVjdGlvbihGcmFtZSogZnJhbWUs
CiAgICAgaW50IGggPSBpci5oZWlnaHQoKTsKICAgICBCSVRNQVBJTkZPIGJtcCA9IHsgeyBzaXpl
b2YoQklUTUFQSU5GT0hFQURFUiksIHcsIGgsIDEsIDMyIH0gfTsKIAotICAgIEhCSVRNQVAgaGJt
cCA9IENyZWF0ZURJQlNlY3Rpb24oMCwgJmJtcCwgRElCX1JHQl9DT0xPUlMsICh2b2lkKiopJmJp
dHMsIDAsIDApOwotICAgIEhCSVRNQVAgaGJtcE9sZCA9IChIQklUTUFQKVNlbGVjdE9iamVjdCho
ZGMsIGhibXApOworICAgIEhCSVRNQVAgaGJtcCA9IENyZWF0ZURJQlNlY3Rpb24oMCwgJmJtcCwg
RElCX1JHQl9DT0xPUlMsIHN0YXRpY19jYXN0PHZvaWQqKj4oJmJpdHMpLCAwLCAwKTsKKyAgICBI
QklUTUFQIGhibXBPbGQgPSBzdGF0aWNfY2FzdDxIQklUTUFQPihTZWxlY3RPYmplY3QoaGRjLCBo
Ym1wKSk7CiAgICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0
ZURldmljZVJHQigpOwotICAgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0
Q3JlYXRlKCh2b2lkKiliaXRzLCB3LCBoLAorICAgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gQ0dC
aXRtYXBDb250ZXh0Q3JlYXRlKHN0YXRpY19jYXN0PHZvaWQqPihiaXRzKSwgdywgaCwKICAgICAg
ICAgOCwgdyAqIHNpemVvZihSR0JRVUFEKSwgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIz
MkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFQcmVtdWx0aXBsaWVkRmlyc3QpOwogICAgIENHQ29sb3JT
cGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKICAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQp
OwpAQCAtMTgyLDE2ICs4NCw0IEBAIEhCSVRNQVAgaW1hZ2VGcm9tU2VsZWN0aW9uKEZyYW1lKiBm
cmFtZSwKICAgICByZXR1cm4gaGJtcDsKIH0KIAotRHJhZ0ltYWdlUmVmIEZyYW1lOjpkcmFnSW1h
Z2VGb3JTZWxlY3Rpb24oKQoteyAgICAKLSAgICBpZiAoc2VsZWN0aW9uQ29udHJvbGxlcigpLT5p
c1JhbmdlKCkpCi0gICAgICAgIHJldHVybiBpbWFnZUZyb21TZWxlY3Rpb24odGhpcywgZmFsc2Up
OwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgRnJhbWU6OmRhc2hib2FyZFJlZ2lvbnNDaGFu
Z2VkKCkKLXsKLX0KLQogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9icmlk
Z2Uvd2luL0ZyYW1lQ2Fpcm9XaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYnJpZGdlL3dp
bi9GcmFtZUNhaXJvV2luLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvYnJpZGdlL3dpbi9G
cmFtZUNhaXJvV2luLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJGcmFtZVdpbi5oIgorCisjaW5jbHVkZSAi
RWRpdG9yQ2xpZW50LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKwordXNpbmcgc3Rk
OjptaW47CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworSEJJVE1BUCBpbWFnZUZyb21TZWxlY3Rp
b24oRnJhbWUqIGZyYW1lLCBib29sIGZvcmNlQmxhY2tUZXh0KQoreworICAgIG5vdEltcGxlbWVu
dGVkKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6
IFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9i
cmlkZ2Uvd2luL0ZyYW1lV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCisrKyBXZWJDb3JlL2JyaWRn
ZS93aW4vRnJhbWVXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAq
IENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC02MCwxMCArNjAs
NiBAQAogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2luY2x1ZGUgIlNldHRpbmdzLmgi
CiAKLSNpZiBQTEFURk9STShDRykKLSNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ29yZUdyYXBoaWNz
Lmg+Ci0jZW5kaWYKLQogdXNpbmcgc3RkOjptaW47CiB1c2luZyBuYW1lc3BhY2UgS0pTOjpCaW5k
aW5nczsKIApAQCAtODQsNyArODAsNiBAQCBLSlM6OkJpbmRpbmdzOjpJbnN0YW5jZSogRnJhbWU6
OmNyZWF0ZVNjCiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFBsdWdpblZpZXdXaW4qPih3aWRnZXQp
LT5iaW5kaW5nSW5zdGFuY2UoKTsKIH0KIAotCiB2b2lkIGNvbXB1dGVQYWdlUmVjdHNGb3JGcmFt
ZShGcmFtZSogZnJhbWUsIGNvbnN0IEludFJlY3QmIHByaW50UmVjdCwgZmxvYXQgaGVhZGVySGVp
Z2h0LCBmbG9hdCBmb290ZXJIZWlnaHQsIGZsb2F0IHVzZXJTY2FsZUZhY3RvcixWZWN0b3I8SW50
UmVjdD4mIHBhZ2VzLCBpbnQmIG91dFBhZ2VIZWlnaHQpCiB7CiAgICAgQVNTRVJUKGZyYW1lKTsK
QEAgLTEwNywxMSArMTAyLDExIEBAIHZvaWQgY29tcHV0ZVBhZ2VSZWN0c0ZvckZyYW1lKEZyYW1l
KiBmcmEKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICAKLSAgICBmbG9hdCByYXRpbyA9IChm
bG9hdClwcmludFJlY3QuaGVpZ2h0KCkgLyAoZmxvYXQpcHJpbnRSZWN0LndpZHRoKCk7CisgICAg
ZmxvYXQgcmF0aW8gPSBzdGF0aWNfY2FzdDxmbG9hdD4ocHJpbnRSZWN0LmhlaWdodCgpKSAvIHN0
YXRpY19jYXN0PGZsb2F0PihwcmludFJlY3Qud2lkdGgoKSk7CiAgCi0gICAgZmxvYXQgcGFnZVdp
ZHRoICA9IChmbG9hdCkgcm9vdC0+ZG9jV2lkdGgoKTsKKyAgICBmbG9hdCBwYWdlV2lkdGggID0g
c3RhdGljX2Nhc3Q8ZmxvYXQ+KHJvb3QtPmRvY1dpZHRoKCkpOwogICAgIGZsb2F0IHBhZ2VIZWln
aHQgPSBwYWdlV2lkdGggKiByYXRpbzsKLSAgICBvdXRQYWdlSGVpZ2h0ID0gKGludCkgcGFnZUhl
aWdodDsgICAvLyB0aGlzIGlzIHRoZSBoZWlnaHQgb2YgdGhlIHBhZ2UgYWRqdXN0ZWQgYnkgbWFy
Z2lucworICAgIG91dFBhZ2VIZWlnaHQgPSBzdGF0aWNfY2FzdDxpbnQ+KHBhZ2VIZWlnaHQpOyAg
IC8vIHRoaXMgaXMgdGhlIGhlaWdodCBvZiB0aGUgcGFnZSBhZGp1c3RlZCBieSBtYXJnaW5zCiAg
ICAgcGFnZUhlaWdodCAtPSAoaGVhZGVySGVpZ2h0ICsgZm9vdGVySGVpZ2h0KTsKIAogICAgIGlm
IChwYWdlSGVpZ2h0IDw9IDApIHsKQEAgLTEyNiw2MiArMTIxLDE3IEBAIHZvaWQgY29tcHV0ZVBh
Z2VSZWN0c0ZvckZyYW1lKEZyYW1lKiBmcmEKIAogICAgIAogICAgIC8vIGFsd2F5cyByZXR1cm4g
YXQgbGVhc3Qgb25lIHBhZ2UsIHNpbmNlIGVtcHR5IGZpbGVzIHNob3VsZCBwcmludCBhIGJsYW5r
IHBhZ2UKLSAgICBmbG9hdCBwcmludGVkUGFnZXNIZWlnaHQgPSAwLjA7CisgICAgZmxvYXQgcHJp
bnRlZFBhZ2VzSGVpZ2h0ID0gMC4wZjsKICAgICBkbyB7CiAgICAgICAgIGZsb2F0IHByb3Bvc2Vk
Qm90dG9tID0gbWluKGRvY0hlaWdodCwgcHJpbnRlZFBhZ2VzSGVpZ2h0ICsgcGFnZUhlaWdodCk7
CiAgICAgICAgIGZyYW1lLT5hZGp1c3RQYWdlSGVpZ2h0KCZwcm9wb3NlZEJvdHRvbSwgcHJpbnRl
ZFBhZ2VzSGVpZ2h0LCBwcm9wb3NlZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0KTsKICAgICAg
ICAgY3VyclBhZ2VIZWlnaHQgPSBtYXgoMS4wZiwgcHJvcG9zZWRCb3R0b20gLSBwcmludGVkUGFn
ZXNIZWlnaHQpOwogICAgICAgIAotICAgICAgICBwYWdlcy5hcHBlbmQoSW50UmVjdCgwLHByaW50
ZWRQYWdlc0hlaWdodCxjdXJyUGFnZVdpZHRoLGN1cnJQYWdlSGVpZ2h0KSk7CisgICAgICAgIHBh
Z2VzLmFwcGVuZChJbnRSZWN0KDAsIHByaW50ZWRQYWdlc0hlaWdodCwgY3VyclBhZ2VXaWR0aCwg
Y3VyclBhZ2VIZWlnaHQpKTsKICAgICAgICAgcHJpbnRlZFBhZ2VzSGVpZ2h0ICs9IGN1cnJQYWdl
SGVpZ2h0OwogICAgIH0gd2hpbGUgKHByaW50ZWRQYWdlc0hlaWdodCA8IGRvY0hlaWdodCk7CiB9
CiAKLXN0YXRpYyB2b2lkIGRyYXdSZWN0SW50b0NvbnRleHQoSW50UmVjdCByZWN0LCBGcmFtZVZp
ZXcqIHZpZXcsIEdyYXBoaWNzQ29udGV4dCogZ2MpCi17Ci0gICAgSW50U2l6ZSBvZmZzZXQgPSB2
aWV3LT5zY3JvbGxPZmZzZXQoKTsKLSAgICByZWN0Lm1vdmUoLW9mZnNldC53aWR0aCgpLCAtb2Zm
c2V0LmhlaWdodCgpKTsKLSAgICByZWN0ID0gdmlldy0+Y29udmVydFRvQ29udGFpbmluZ1dpbmRv
dyhyZWN0KTsKLQotICAgIGdjLT5jb25jYXRDVE0oQWZmaW5lVHJhbnNmb3JtKCkudHJhbnNsYXRl
KC1yZWN0LngoKSwgLXJlY3QueSgpKSk7Ci0KLSAgICB2aWV3LT5wYWludChnYywgcmVjdCk7Ci19
Ci0KLUhCSVRNQVAgaW1hZ2VGcm9tU2VsZWN0aW9uKEZyYW1lKiBmcmFtZSwgYm9vbCBmb3JjZUJs
YWNrVGV4dCkKLXsKLSAgICBmcmFtZS0+c2V0UGFpbnRSZXN0cmljdGlvbihmb3JjZUJsYWNrVGV4
dCA/IFBhaW50UmVzdHJpY3Rpb25TZWxlY3Rpb25Pbmx5QmxhY2tUZXh0IDogUGFpbnRSZXN0cmlj
dGlvblNlbGVjdGlvbk9ubHkpOwotICAgIEZsb2F0UmVjdCBmciA9IGZyYW1lLT5zZWxlY3Rpb25S
ZWN0KCk7Ci0gICAgSW50UmVjdCBpcigoaW50KWZyLngoKSwgKGludClmci55KCksKGludClmci53
aWR0aCgpLChpbnQpZnIuaGVpZ2h0KCkpOwotCi0gICAgdm9pZCogYml0czsKLSAgICBIREMgaGRj
ID0gQ3JlYXRlQ29tcGF0aWJsZURDKDApOwotICAgIGludCB3ID0gaXIud2lkdGgoKTsKLSAgICBp
bnQgaCA9IGlyLmhlaWdodCgpOwotICAgIEJJVE1BUElORk8gYm1wID0geyB7IHNpemVvZihCSVRN
QVBJTkZPSEVBREVSKSwgdywgaCwgMSwgMzIgfSB9OwotCi0gICAgSEJJVE1BUCBoYm1wID0gQ3Jl
YXRlRElCU2VjdGlvbigwLCAmYm1wLCBESUJfUkdCX0NPTE9SUywgKHZvaWQqKikmYml0cywgMCwg
MCk7Ci0gICAgSEJJVE1BUCBoYm1wT2xkID0gKEhCSVRNQVApU2VsZWN0T2JqZWN0KGhkYywgaGJt
cCk7Ci0gICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURl
dmljZVJHQigpOwotICAgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3Jl
YXRlKCh2b2lkKiliaXRzLCB3LCBoLAotICAgICAgICA4LCB3ICogc2l6ZW9mKFJHQlFVQUQpLCBk
ZXZpY2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwga0NHSW1hZ2VBbHBoYVByZW11
bHRpcGxpZWRGaXJzdCk7Ci0gICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOwotICAg
IENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7Ci0KLSAgICBHcmFwaGljc0NvbnRleHQgZ2Mo
Y29udGV4dCk7Ci0KLSAgICBmcmFtZS0+ZG9jdW1lbnQoKS0+dXBkYXRlTGF5b3V0KCk7Ci0gICAg
ZHJhd1JlY3RJbnRvQ29udGV4dChpciwgZnJhbWUtPnZpZXcoKSwgJmdjKTsKLQotICAgIENHQ29u
dGV4dFJlbGVhc2UoY29udGV4dCk7Ci0gICAgU2VsZWN0T2JqZWN0KGhkYywgaGJtcE9sZCk7Ci0g
ICAgRGVsZXRlREMoaGRjKTsKLQotICAgIGZyYW1lLT5zZXRQYWludFJlc3RyaWN0aW9uKFBhaW50
UmVzdHJpY3Rpb25Ob25lKTsKLQotICAgIHJldHVybiBoYm1wOwotfQotCiBEcmFnSW1hZ2VSZWYg
RnJhbWU6OmRyYWdJbWFnZUZvclNlbGVjdGlvbigpCiB7ICAgIAogICAgIGlmIChzZWxlY3Rpb25D
b250cm9sbGVyKCktPmlzUmFuZ2UoKSkKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
U2ltcGxlRm9udERhdGEuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L1NpbXBsZUZvbnREYXRhLmgJKHJldmlzaW9uIDI5NzI2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9TaW1wbGVGb250RGF0YS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMDMsNiArMTAzLDcg
QEAgcHVibGljOgogICAgIFNDUklQVF9DQUNIRSogc2NyaXB0Q2FjaGUoKSBjb25zdCB7IHJldHVy
biAmbV9zY3JpcHRDYWNoZTsgfQogCiAgICAgc3RhdGljIHZvaWQgc2V0U2hvdWxkQXBwbHlNYWNB
c2NlbnRIYWNrKGJvb2wpOworICAgIHN0YXRpYyBib29sIHNob3VsZEFwcGx5TWFjQXNjZW50SGFj
aygpOwogI2VuZGlmCiAKICNpZiBQTEFURk9STShHVEspCkluZGV4OiBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4dENhaXJvLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4dENhaXJvLmNwcAko
cmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBo
aWNzQ29udGV4dENhaXJvLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDEsMTUgKzQxLDEzIEBACiAj
aW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgogCi0jaWYgUExB
VEZPUk0oV0lOKQotI2luY2x1ZGUgPGNhaXJvLXdpbjMyLmg+Ci0jZW5kaWYKLQogI2lmIFBMQVRG
T1JNKEdUSykKICNpbmNsdWRlIDxnZGsvZ2RrLmg+CiAjaW5jbHVkZSA8cGFuZ28vcGFuZ28uaD4K
KyNlbGlmIFBMQVRGT1JNKFdJTikKKyNpbmNsdWRlIDxjYWlyby13aW4zMi5oPgogI2VuZGlmCi0K
KyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUuaCIKIAogI2lmbmRlZiBN
X1BJCiAjZGVmaW5lIE1fUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgpAQCAtNTcsMTkgKzU1LDYg
QEAKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1jbGFzcyBHcmFwaGljc0NvbnRleHRQbGF0Zm9y
bVByaXZhdGUgewotcHVibGljOgotICAgIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSgp
OwotICAgIH5HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKTsKLQotICAgIGNhaXJvX3Qq
IGNyOwotICAgIFZlY3RvcjxmbG9hdD4gbGF5ZXJzOwotCi0jaWYgUExBVEZPUk0oR1RLKQotICAg
IEdka0V2ZW50RXhwb3NlKiBleHBvc2U7Ci0jZW5kaWYKLX07Ci0KIHN0YXRpYyBpbmxpbmUgdm9p
ZCBzZXRDb2xvcihjYWlyb190KiBjciwgY29uc3QgQ29sb3ImIGNvbCkKIHsKICAgICBmbG9hdCBy
ZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKQEAgLTg2LDM0ICs3MSw2IEBAIHN0YXRpYyBpbmxpbmUg
dm9pZCBmaWxsUmVjdFNvdXJjZU92ZXIoY2EKICAgICBjYWlyb19maWxsKGNyKTsKIH0KIAotR3Jh
cGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZh
dGUoKQotICAgIDogIGNyKDApCi0jaWYgUExBVEZPUk0oR1RLKQotICAgICwgZXhwb3NlKDApCi0j
ZW5kaWYKLXsKLX0KLQotR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjp+R3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlKCkKLXsKLSAgICBjYWlyb19kZXN0cm95KGNyKTsKLX0KLQot
I2lmIFBMQVRGT1JNKFdJTikKLUdyYXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0KEhEQyBk
YykKLSAgICA6IG1fY29tbW9uKGNyZWF0ZUdyYXBoaWNzQ29udGV4dFByaXZhdGUoKSkKLSAgICAs
IG1fZGF0YShuZXcgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKQotewotICAgIGlmIChk
YykgewotICAgICAgICBjYWlyb19zdXJmYWNlX3QqIHN1cmZhY2UgPSBjYWlyb193aW4zMl9zdXJm
YWNlX2NyZWF0ZShkYyk7Ci0gICAgICAgIG1fZGF0YS0+Y3IgPSBjYWlyb19jcmVhdGUoc3VyZmFj
ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2V0UGFpbnRpbmdEaXNhYmxlZCh0cnVlKTsKLSAg
ICAgICAgbV9kYXRhLT5jciA9IDA7Ci0gICAgfQotfQotI2VuZGlmCi0KIEdyYXBoaWNzQ29udGV4
dDo6R3JhcGhpY3NDb250ZXh0KFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiBjcikKICAgICA6IG1f
Y29tbW9uKGNyZWF0ZUdyYXBoaWNzQ29udGV4dFByaXZhdGUoKSkKICAgICAsIG1fZGF0YShuZXcg
R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKQpAQCAtNTc3LDYgKzUzNCw5IEBAIHZvaWQg
R3JhcGhpY3NDb250ZXh0OjpzZXRVUkxGb3JSZWN0KGNvbnMKICAgICBub3RJbXBsZW1lbnRlZCgp
OwogfQogCisjaWYgUExBVEZPUk0oR1RLKQorLy8gRklYTUU6ICBUaGlzIHNob3VsZCBiZSBtb3Zl
ZCB0byBzb21ldGhpbmcgbGlrZSBHcmFwaGljc0NvbnRleHRDYWlyb0dUSy5jcHAsCisvLyBhcyB0
aGVyZSBpcyBhIFdpbmRvd3MgaW1wbGVtZW50YXRpb24gaW4gcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0dyYXBoaWNzQ29udGV4dENhaXJvV2luLmNwcAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNvbmNh
dENUTShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSkKIHsKICAgICBpZiAocGFpbnRp
bmdEaXNhYmxlZCgpKQpAQCAtNTg2LDYgKzU0Niw3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0Ojpj
b25jYXRDVE0oY29uc3QgQWYKICAgICBjb25zdCBjYWlyb19tYXRyaXhfdCogbWF0cml4ID0gcmVp
bnRlcnByZXRfY2FzdDxjb25zdCBjYWlyb19tYXRyaXhfdCo+KCZ0cmFuc2Zvcm0pOwogICAgIGNh
aXJvX3RyYW5zZm9ybShjciwgbWF0cml4KTsKIH0KKyNlbmRpZgogCiB2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6YWRkSW5uZXJSb3VuZGVkUmVjdENsaXAoY29uc3QgSW50UmVjdCYgcmVjdCwgaW50IHRo
aWNrbmVzcykKIHsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhp
Y3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9jYWlyby9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUuaAkocmV2aXNp
b24gMjk3MjYpCShmcm9tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhpY3ND
b250ZXh0Q2Fpcm8uY3BwOjI5NzI2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWly
by9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUuaAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDkyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5j
LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBBbHAgVG9rZXIg
PGFscEBhdG9rZXIuY29tPgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
R3JhcGhpY3NDb250ZXh0LmgiCisKKyNpZiBQTEFURk9STShDQUlSTykKKworI2luY2x1ZGUgIkNh
aXJvUGF0aC5oIgorI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUgIkZvbnQuaCIKKyNp
bmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRl
ICJQYXRoLmgiCisjaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIKKyNpbmNsdWRlIDxjYWlyby5o
PgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHd0Zi9N
YXRoRXh0cmFzLmg+CisKKyNpZiBQTEFURk9STShXSU4pCisjaW5jbHVkZSA8Y2Fpcm8td2luMzIu
aD4KKyNlbmRpZgorCisjaWYgUExBVEZPUk0oR1RLKQorI2luY2x1ZGUgPGdkay9nZGsuaD4KKyNp
bmNsdWRlIDxwYW5nby9wYW5nby5oPgorI2VuZGlmCisKKworI2lmbmRlZiBNX1BJCisjZGVmaW5l
IE1fUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgorI2VuZGlmCisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworY2xhc3MgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlIHsKK3B1YmxpYzoKKyAg
ICBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKTsKKyAgICB+R3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlKCk7CisKKyAgICBjYWlyb190KiBjcjsKKyAgICBWZWN0b3I8ZmxvYXQ+
IGxheWVyczsKKworI2lmIFBMQVRGT1JNKEdUSykKKyAgICBHZGtFdmVudEV4cG9zZSogZXhwb3Nl
OworI2VuZGlmCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0Q29sb3IoY2Fpcm9fdCogY3Is
IGNvbnN0IENvbG9yJiBjb2wpCit7CisgICAgZmxvYXQgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGE7
CisgICAgY29sLmdldFJHQkEocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworICAgIGNhaXJvX3Nl
dF9zb3VyY2VfcmdiYShjciwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworfQorCisvLyBBIGZp
bGxSZWN0IGhlbHBlcgorc3RhdGljIGlubGluZSB2b2lkIGZpbGxSZWN0U291cmNlT3ZlcihjYWly
b190KiBjciwgY29uc3QgRmxvYXRSZWN0JiByZWN0LCBjb25zdCBDb2xvciYgY29sKQoreworICAg
IHNldENvbG9yKGNyLCBjb2wpOworICAgIGNhaXJvX3JlY3RhbmdsZShjciwgcmVjdC54KCksIHJl
Y3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOworICAgIGNhaXJvX3NldF9vcGVy
YXRvcihjciwgQ0FJUk9fT1BFUkFUT1JfT1ZFUik7CisgICAgY2Fpcm9fZmlsbChjcik7Cit9CisK
K0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlKCkKKyAgICA6ICBjcigwKQorI2lmIFBMQVRGT1JNKEdUSykKKyAgICAsIGV4cG9zZSgw
KQorI2VuZGlmCit7Cit9CisKK0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6fkdyYXBo
aWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpCit7CisgICAgY2Fpcm9fZGVzdHJveShjcik7Cit9
CisKKyNpZiBQTEFURk9STShXSU4pCitHcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dChI
REMgZGMpCisgICAgOiBtX2NvbW1vbihjcmVhdGVHcmFwaGljc0NvbnRleHRQcml2YXRlKCkpCisg
ICAgLCBtX2RhdGEobmV3IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSkKK3sKKyAgICBp
ZiAoZGMpIHsKKyAgICAgICAgY2Fpcm9fc3VyZmFjZV90KiBzdXJmYWNlID0gY2Fpcm9fd2luMzJf
c3VyZmFjZV9jcmVhdGUoZGMpOworICAgICAgICBtX2RhdGEtPmNyID0gY2Fpcm9fY3JlYXRlKHN1
cmZhY2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNldFBhaW50aW5nRGlzYWJsZWQodHJ1ZSk7
CisgICAgICAgIG1fZGF0YS0+Y3IgPSAwOworICAgIH0KK30KKyNlbmRpZgorCitHcmFwaGljc0Nv
bnRleHQ6OkdyYXBoaWNzQ29udGV4dChQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCogY3IpCisgICAg
OiBtX2NvbW1vbihjcmVhdGVHcmFwaGljc0NvbnRleHRQcml2YXRlKCkpCisgICAgLCBtX2RhdGEo
bmV3IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSkKK3sKKyAgICBtX2RhdGEtPmNyID0g
Y2Fpcm9fcmVmZXJlbmNlKGNyKTsKKyAgICBzZXRQYWludGluZ0Rpc2FibGVkKCFjcik7Cit9CisK
K0dyYXBoaWNzQ29udGV4dDo6fkdyYXBoaWNzQ29udGV4dCgpCit7CisgICAgZGVzdHJveUdyYXBo
aWNzQ29udGV4dFByaXZhdGUobV9jb21tb24pOworICAgIGRlbGV0ZSBtX2RhdGE7Cit9CisKK2Nh
aXJvX3QqIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1Db250ZXh0KCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gbV9kYXRhLT5jcjsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNhdmVQbGF0Zm9y
bVN0YXRlKCkKK3sKKyAgICBjYWlyb19zYXZlKG1fZGF0YS0+Y3IpOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDo6cmVzdG9yZVBsYXRmb3JtU3RhdGUoKQoreworICAgIGNhaXJvX3Jlc3RvcmUo
bV9kYXRhLT5jcik7Cit9CisKKy8vIERyYXdzIGEgZmlsbGVkIHJlY3RhbmdsZSB3aXRoIGEgc3Ry
b2tlZCBib3JkZXIuCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd1JlY3QoY29uc3QgSW50UmVj
dCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgY2Fpcm9fc2F2ZShjcik7CisK
KyAgICBpZiAoZmlsbENvbG9yKCkuYWxwaGEoKSkKKyAgICAgICAgZmlsbFJlY3RTb3VyY2VPdmVy
KGNyLCByZWN0LCBmaWxsQ29sb3IoKSk7CisKKyAgICBpZiAoc3Ryb2tlU3R5bGUoKSAhPSBOb1N0
cm9rZSkgeworICAgICAgICBzZXRDb2xvcihjciwgc3Ryb2tlQ29sb3IoKSk7CisgICAgICAgIEZs
b2F0UmVjdCByKHJlY3QpOworICAgICAgICByLmluZmxhdGUoLS41Zik7CisgICAgICAgIGNhaXJv
X3JlY3RhbmdsZShjciwgci54KCksIHIueSgpLCByLndpZHRoKCksIHIuaGVpZ2h0KCkpOworICAg
ICAgICBjYWlyb19zZXRfbGluZV93aWR0aChjciwgMS4wKTsKKyAgICAgICAgY2Fpcm9fc3Ryb2tl
KGNyKTsKKyAgICB9CisKKyAgICBjYWlyb19yZXN0b3JlKGNyKTsKK30KKworLy8gRklYTUU6IE5v
dyB0aGF0IHRoaXMgaXMgcmVmYWN0b3JlZCwgaXQgc2hvdWxkIGJlIHNoYXJlZCBieSBhbGwgY29u
dGV4dHMuCitzdGF0aWMgdm9pZCBhZGp1c3RMaW5lVG9QaXhlbEJvdW5kYXJpZXMoRmxvYXRQb2lu
dCYgcDEsIEZsb2F0UG9pbnQmIHAyLCBmbG9hdCBzdHJva2VXaWR0aCwgU3Ryb2tlU3R5bGUgc3R5
bGUpCit7CisgICAgLy8gRm9yIG9kZCB3aWR0aHMsIHdlIGFkZCBpbiAwLjUgdG8gdGhlIGFwcHJv
cHJpYXRlIHgveSBzbyB0aGF0IHRoZSBmbG9hdCBhcml0aG1ldGljCisgICAgLy8gd29ya3Mgb3V0
LiAgRm9yIGV4YW1wbGUsIHdpdGggYSBib3JkZXIgd2lkdGggb2YgMywgS0hUTUwgd2lsbCBwYXNz
IHVzICh5MSt5MikvMiwgZS5nLiwKKyAgICAvLyAoNTArNTMpLzIgPSAxMDMvMiA9IDUxIHdoZW4g
d2Ugd2FudCA1MS41LiAgSXQgaXMgYWx3YXlzIHRydWUgdGhhdCBhbiBldmVuIHdpZHRoIGdhdmUK
KyAgICAvLyB1cyBhIHBlcmZlY3QgcG9zaXRpb24sIGJ1dCBhbiBvZGQgd2lkdGggZ2F2ZSB1cyBh
IHBvc2l0aW9uIHRoYXQgaXMgb2ZmIGJ5IGV4YWN0bHkgMC41LgorICAgIGlmIChzdHlsZSA9PSBE
b3R0ZWRTdHJva2UgfHwgc3R5bGUgPT0gRGFzaGVkU3Ryb2tlKSB7CisgICAgICAgIGlmIChwMS54
KCkgPT0gcDIueCgpKSB7CisgICAgICAgICAgICBwMS5zZXRZKHAxLnkoKSArIHN0cm9rZVdpZHRo
KTsKKyAgICAgICAgICAgIHAyLnNldFkocDIueSgpIC0gc3Ryb2tlV2lkdGgpOworICAgICAgICB9
CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcDEuc2V0WChwMS54KCkgKyBzdHJva2VXaWR0
aCk7CisgICAgICAgICAgICBwMi5zZXRYKHAyLngoKSAtIHN0cm9rZVdpZHRoKTsKKyAgICAgICAg
fQorICAgIH0KKworICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KHN0cm9rZVdpZHRoKSAlIDIpIHsK
KyAgICAgICAgaWYgKHAxLngoKSA9PSBwMi54KCkpIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIGEg
dmVydGljYWwgbGluZS4gIEFkanVzdCBvdXIgeC4KKyAgICAgICAgICAgIHAxLnNldFgocDEueCgp
ICsgMC41KTsKKyAgICAgICAgICAgIHAyLnNldFgocDIueCgpICsgMC41KTsKKyAgICAgICAgfQor
ICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIGEgaG9yaXpvbnRhbCBsaW5lLiBB
ZGp1c3Qgb3VyIHkuCisgICAgICAgICAgICBwMS5zZXRZKHAxLnkoKSArIDAuNSk7CisgICAgICAg
ICAgICBwMi5zZXRZKHAyLnkoKSArIDAuNSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIFRo
aXMgaXMgb25seSB1c2VkIHRvIGRyYXcgYm9yZGVycy4KK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpk
cmF3TGluZShjb25zdCBJbnRQb2ludCYgcG9pbnQxLCBjb25zdCBJbnRQb2ludCYgcG9pbnQyKQor
eworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIFN0
cm9rZVN0eWxlIHN0eWxlID0gc3Ryb2tlU3R5bGUoKTsKKyAgICBpZiAoc3R5bGUgPT0gTm9TdHJv
a2UpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAg
ICBjYWlyb19zYXZlKGNyKTsKKworICAgIGZsb2F0IHdpZHRoID0gc3Ryb2tlVGhpY2tuZXNzKCk7
CisgICAgaWYgKHdpZHRoIDwgMSkKKyAgICAgICAgd2lkdGggPSAxOworCisgICAgRmxvYXRQb2lu
dCBwMSA9IHBvaW50MTsKKyAgICBGbG9hdFBvaW50IHAyID0gcG9pbnQyOworICAgIGJvb2wgaXNW
ZXJ0aWNhbExpbmUgPSAocDEueCgpID09IHAyLngoKSk7CisgCisgICAgYWRqdXN0TGluZVRvUGl4
ZWxCb3VuZGFyaWVzKHAxLCBwMiwgd2lkdGgsIHN0eWxlKTsKKyAgICBjYWlyb19zZXRfbGluZV93
aWR0aChjciwgd2lkdGgpOworCisgICAgaW50IHBhdFdpZHRoID0gMDsKKyAgICBzd2l0Y2ggKHN0
eWxlKSB7CisgICAgY2FzZSBOb1N0cm9rZToKKyAgICBjYXNlIFNvbGlkU3Ryb2tlOgorICAgICAg
ICBicmVhazsKKyAgICBjYXNlIERvdHRlZFN0cm9rZToKKyAgICAgICAgcGF0V2lkdGggPSBzdGF0
aWNfY2FzdDxpbnQ+KHdpZHRoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEYXNoZWRTdHJv
a2U6CisgICAgICAgIHBhdFdpZHRoID0gMypzdGF0aWNfY2FzdDxpbnQ+KHdpZHRoKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgfQorCisgICAgc2V0Q29sb3IoY3IsIHN0cm9rZUNvbG9yKCkpOworCisg
ICAgY2Fpcm9fc2V0X2FudGlhbGlhcyhjciwgQ0FJUk9fQU5USUFMSUFTX05PTkUpOworCisgICAg
aWYgKHBhdFdpZHRoKSB7CisgICAgICAgIC8vIERvIGEgcmVjdCBmaWxsIG9mIG91ciBlbmRwb2lu
dHMuICBUaGlzIGVuc3VyZXMgd2UgYWx3YXlzIGhhdmUgdGhlCisgICAgICAgIC8vIGFwcGVhcmFu
Y2Ugb2YgYmVpbmcgYSBib3JkZXIuICBXZSB0aGVuIGRyYXcgdGhlIGFjdHVhbCBkb3R0ZWQvZGFz
aGVkIGxpbmUuCisgICAgICAgIGlmIChpc1ZlcnRpY2FsTGluZSkgeworICAgICAgICAgICAgZmls
bFJlY3RTb3VyY2VPdmVyKGNyLCBGbG9hdFJlY3QocDEueCgpIC0gd2lkdGgvMiwgcDEueSgpIC0g
d2lkdGgsIHdpZHRoLCB3aWR0aCksIHN0cm9rZUNvbG9yKCkpOworICAgICAgICAgICAgZmlsbFJl
Y3RTb3VyY2VPdmVyKGNyLCBGbG9hdFJlY3QocDIueCgpIC0gd2lkdGgvMiwgcDIueSgpLCB3aWR0
aCwgd2lkdGgpLCBzdHJva2VDb2xvcigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
IGZpbGxSZWN0U291cmNlT3ZlcihjciwgRmxvYXRSZWN0KHAxLngoKSAtIHdpZHRoLCBwMS55KCkg
LSB3aWR0aC8yLCB3aWR0aCwgd2lkdGgpLCBzdHJva2VDb2xvcigpKTsKKyAgICAgICAgICAgIGZp
bGxSZWN0U291cmNlT3ZlcihjciwgRmxvYXRSZWN0KHAyLngoKSwgcDIueSgpIC0gd2lkdGgvMiwg
d2lkdGgsIHdpZHRoKSwgc3Ryb2tlQ29sb3IoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBF
eGFtcGxlOiA4MCBwaXhlbHMgd2l0aCBhIHdpZHRoIG9mIDMwIHBpeGVscy4KKyAgICAgICAgLy8g
UmVtYWluZGVyIGlzIDIwLiAgVGhlIG1heGltdW0gcGl4ZWxzIG9mIGxpbmUgd2UgY291bGQgcGFp
bnQKKyAgICAgICAgLy8gd2lsbCBiZSA1MCBwaXhlbHMuCisgICAgICAgIGludCBkaXN0YW5jZSA9
IChpc1ZlcnRpY2FsTGluZSA/IChwb2ludDIueSgpIC0gcG9pbnQxLnkoKSkgOiAocG9pbnQyLngo
KSAtIHBvaW50MS54KCkpKSAtIDIqc3RhdGljX2Nhc3Q8aW50Pih3aWR0aCk7CisgICAgICAgIGlu
dCByZW1haW5kZXIgPSBkaXN0YW5jZSVwYXRXaWR0aDsKKyAgICAgICAgaW50IGNvdmVyYWdlID0g
ZGlzdGFuY2UtcmVtYWluZGVyOworICAgICAgICBpbnQgbnVtU2VnbWVudHMgPSBjb3ZlcmFnZS9w
YXRXaWR0aDsKKworICAgICAgICBmbG9hdCBwYXR0ZXJuT2Zmc2V0ID0gMDsKKyAgICAgICAgLy8g
U3BlY2lhbCBjYXNlIDFweCBkb3R0ZWQgYm9yZGVycyBmb3Igc3BlZWQuCisgICAgICAgIGlmIChw
YXRXaWR0aCA9PSAxKQorICAgICAgICAgICAgcGF0dGVybk9mZnNldCA9IDEuMDsKKyAgICAgICAg
ZWxzZSB7CisgICAgICAgICAgICBib29sIGV2ZW5OdW1iZXJPZlNlZ21lbnRzID0gbnVtU2VnbWVu
dHMlMiA9PSAwOworICAgICAgICAgICAgaWYgKHJlbWFpbmRlcikKKyAgICAgICAgICAgICAgICBl
dmVuTnVtYmVyT2ZTZWdtZW50cyA9ICFldmVuTnVtYmVyT2ZTZWdtZW50czsKKyAgICAgICAgICAg
IGlmIChldmVuTnVtYmVyT2ZTZWdtZW50cykgeworICAgICAgICAgICAgICAgIGlmIChyZW1haW5k
ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0dGVybk9mZnNldCArPSBwYXRXaWR0aCAtIHJl
bWFpbmRlcjsKKyAgICAgICAgICAgICAgICAgICAgcGF0dGVybk9mZnNldCArPSByZW1haW5kZXIv
MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAg
ICAgICAgICBwYXR0ZXJuT2Zmc2V0ID0gcGF0V2lkdGgvMjsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGVsc2UgaWYgKCFldmVuTnVtYmVyT2ZTZWdtZW50cykgeworICAgICAgICAgICAgICAg
IGlmIChyZW1haW5kZXIpCisgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5PZmZzZXQgPSAocGF0
V2lkdGggLSByZW1haW5kZXIpLzI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAg
ICBkb3VibGUgZGFzaCA9IHBhdFdpZHRoOworICAgICAgICBjYWlyb19zZXRfZGFzaChjciwgJmRh
c2gsIDEsIHBhdHRlcm5PZmZzZXQpOworICAgIH0KKworICAgIGNhaXJvX21vdmVfdG8oY3IsIHAx
LngoKSwgcDEueSgpKTsKKyAgICBjYWlyb19saW5lX3RvKGNyLCBwMi54KCksIHAyLnkoKSk7CisK
KyAgICBjYWlyb19zdHJva2UoY3IpOworICAgIGNhaXJvX3Jlc3RvcmUoY3IpOworfQorCisvLyBU
aGlzIG1ldGhvZCBpcyBvbmx5IHVzZWQgdG8gZHJhdyB0aGUgbGl0dGxlIGNpcmNsZXMgdXNlZCBp
biBsaXN0cy4KK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3RWxsaXBzZShjb25zdCBJbnRSZWN0
JiByZWN0KQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsK
KworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb19zYXZlKGNyKTsKKyAg
ICBmbG9hdCB5UmFkaXVzID0gLjUgKiByZWN0LmhlaWdodCgpOworICAgIGZsb2F0IHhSYWRpdXMg
PSAuNSAqIHJlY3Qud2lkdGgoKTsKKyAgICBjYWlyb190cmFuc2xhdGUoY3IsIHJlY3QueCgpICsg
eFJhZGl1cywgcmVjdC55KCkgKyB5UmFkaXVzKTsKKyAgICBjYWlyb19zY2FsZShjciwgeFJhZGl1
cywgeVJhZGl1cyk7CisgICAgY2Fpcm9fYXJjKGNyLCAwLiwgMC4sIDEuLCAwLiwgMiAqIE1fUEkp
OworICAgIGNhaXJvX3Jlc3RvcmUoY3IpOworCisgICAgaWYgKGZpbGxDb2xvcigpLmFscGhhKCkp
IHsKKyAgICAgICAgc2V0Q29sb3IoY3IsIGZpbGxDb2xvcigpKTsKKyAgICAgICAgY2Fpcm9fZmls
bF9wcmVzZXJ2ZShjcik7CisgICAgfQorCisgICAgaWYgKHN0cm9rZVN0eWxlKCkgIT0gTm9TdHJv
a2UpIHsKKyAgICAgICAgc2V0Q29sb3IoY3IsIHN0cm9rZUNvbG9yKCkpOworICAgICAgICBjYWly
b19zZXRfbGluZV93aWR0aChjciwgc3Ryb2tlVGhpY2tuZXNzKCkpOworICAgICAgICBjYWlyb19z
dHJva2UoY3IpOworICAgIH0KKworICAgIGNhaXJvX25ld19wYXRoKGNyKTsKK30KKworLy8gRklY
TUU6IFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgYWRqdXN0ZWQgdG8gbWF0Y2ggdGhlIGZ1bmN0
aW9uYWxpdHkgb24gdGhlIE1hYyBzaWRlLgordm9pZCBHcmFwaGljc0NvbnRleHQ6OnN0cm9rZUFy
Yyhjb25zdCBJbnRSZWN0JiByZWN0LCBpbnQgc3RhcnRBbmdsZSwgaW50IGFuZ2xlU3BhbikKK3sK
KyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAo
c3Ryb2tlU3R5bGUoKSA9PSBOb1N0cm9rZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaW50IHgg
PSByZWN0LngoKTsKKyAgICBpbnQgeSA9IHJlY3QueSgpOworICAgIGZsb2F0IHcgPSByZWN0Lndp
ZHRoKCk7CisjaWYgMCAvLyBGSVhNRTogdW51c2VkIHNvIGZhcgorICAgIGZsb2F0IGggPSByZWN0
LmhlaWdodCgpOworICAgIGZsb2F0IHNjYWxlRmFjdG9yID0gaCAvIHc7CisgICAgZmxvYXQgcmV2
ZXJzZVNjYWxlRmFjdG9yID0gdyAvIGg7CisjZW5kaWYKKyAgICBmbG9hdCByID0gdyAvIDI7Cisg
ICAgZmxvYXQgZmEgPSBzdGFydEFuZ2xlOworICAgIGZsb2F0IGZhbGVuID0gIGZhICsgYW5nbGVT
cGFuOworCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOworICAgIGNhaXJvX3NhdmUoY3Ip
OworICAgIGNhaXJvX2FyY19uZWdhdGl2ZShjciwgeCArIHIsIHkgKyByLCByLCAtZmEgKiBNX1BJ
LzE4MCwgLWZhbGVuICogTV9QSS8xODApOworICAgIHNldENvbG9yKGNyLCBzdHJva2VDb2xvcigp
KTsKKyAgICBjYWlyb19zZXRfbGluZV93aWR0aChjciwgc3Ryb2tlVGhpY2tuZXNzKCkpOworICAg
IGNhaXJvX3N0cm9rZShjcik7CisgICAgY2Fpcm9fcmVzdG9yZShjcik7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpkcmF3Q29udmV4UG9seWdvbihzaXplX3QgbnBvaW50cywgY29uc3QgRmxv
YXRQb2ludCogcG9pbnRzLCBib29sIHNob3VsZEFudGlhbGlhcykKK3sKKyAgICBpZiAocGFpbnRp
bmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAobnBvaW50cyA8PSAxKQor
ICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisKKyAgICBj
YWlyb19zYXZlKGNyKTsKKyAgICBjYWlyb19zZXRfYW50aWFsaWFzKGNyLCBzaG91bGRBbnRpYWxp
YXMgPyBDQUlST19BTlRJQUxJQVNfREVGQVVMVCA6IENBSVJPX0FOVElBTElBU19OT05FKTsKKyAg
ICBjYWlyb19tb3ZlX3RvKGNyLCBwb2ludHNbMF0ueCgpLCBwb2ludHNbMF0ueSgpKTsKKyAgICBm
b3IgKHNpemVfdCBpID0gMTsgaSA8IG5wb2ludHM7IGkrKykKKyAgICAgICAgY2Fpcm9fbGluZV90
byhjciwgcG9pbnRzW2ldLngoKSwgcG9pbnRzW2ldLnkoKSk7CisgICAgY2Fpcm9fY2xvc2VfcGF0
aChjcik7CisKKyAgICBpZiAoZmlsbENvbG9yKCkuYWxwaGEoKSkgeworICAgICAgICBzZXRDb2xv
cihjciwgZmlsbENvbG9yKCkpOworICAgICAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNyLCBDQUlS
T19GSUxMX1JVTEVfRVZFTl9PREQpOworICAgICAgICBjYWlyb19maWxsX3ByZXNlcnZlKGNyKTsK
KyAgICB9CisKKyAgICBpZiAoc3Ryb2tlU3R5bGUoKSAhPSBOb1N0cm9rZSkgeworICAgICAgICBz
ZXRDb2xvcihjciwgc3Ryb2tlQ29sb3IoKSk7CisgICAgICAgIGNhaXJvX3NldF9saW5lX3dpZHRo
KGNyLCBzdHJva2VUaGlja25lc3MoKSk7CisgICAgICAgIGNhaXJvX3N0cm9rZShjcik7CisgICAg
fQorCisgICAgY2Fpcm9fbmV3X3BhdGgoY3IpOworICAgIGNhaXJvX3Jlc3RvcmUoY3IpOworfQor
Cit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJlY3QoY29uc3QgSW50UmVjdCYgcmVjdCwgY29u
c3QgQ29sb3ImIGNvbG9yKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAg
IHJldHVybjsKKworICAgIGlmIChjb2xvci5hbHBoYSgpKQorICAgICAgICBmaWxsUmVjdFNvdXJj
ZU92ZXIobV9kYXRhLT5jciwgcmVjdCwgY29sb3IpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dDo6ZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0LCBjb25zdCBDb2xvciYgY29sb3IpCit7
CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYg
KGNvbG9yLmFscGhhKCkpCisgICAgICAgIGZpbGxSZWN0U291cmNlT3ZlcihtX2RhdGEtPmNyLCBy
ZWN0LCBjb2xvcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwKGNvbnN0IEludFJl
Y3QmIHJlY3QpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOworICAgIGNhaXJvX3JlY3RhbmdsZShj
ciwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOworICAg
IGNhaXJvX2ZpbGxfcnVsZV90IHNhdmVkRmlsbFJ1bGUgPSBjYWlyb19nZXRfZmlsbF9ydWxlKGNy
KTsKKyAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNyLCBDQUlST19GSUxMX1JVTEVfV0lORElORyk7
CisgICAgY2Fpcm9fY2xpcChjcik7CisgICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgc2F2ZWRG
aWxsUnVsZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3Rm9jdXNSaW5nKGNvbnN0
IENvbG9yJiBjb2xvcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBpbnQgcmFkaXVzID0gKGZvY3VzUmluZ1dpZHRoKCkgLSAxKSAvIDI7Cisg
ICAgaW50IG9mZnNldCA9IHJhZGl1cyArIGZvY3VzUmluZ09mZnNldCgpOworCisgICAgY29uc3Qg
VmVjdG9yPEludFJlY3Q+JiByZWN0cyA9IGZvY3VzUmluZ1JlY3RzKCk7CisgICAgdW5zaWduZWQg
cmVjdENvdW50ID0gcmVjdHMuc2l6ZSgpOworICAgIEludFJlY3QgZmluYWxGb2N1c1JlY3Q7Cisg
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlY3RDb3VudDsgaSsrKSB7CisgICAgICAgIElu
dFJlY3QgZm9jdXNSZWN0ID0gcmVjdHNbaV07CisgICAgICAgIGZvY3VzUmVjdC5pbmZsYXRlKG9m
ZnNldCk7CisgICAgICAgIGZpbmFsRm9jdXNSZWN0LnVuaXRlKGZvY3VzUmVjdCk7CisgICAgfQor
CisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOworICAgIGNhaXJvX3NhdmUoY3IpOworICAg
IC8vIEZJWE1FOiBUaGVzZSByZWN0cyBzaG91bGQgYmUgcm91bmRlZAorICAgIGNhaXJvX3JlY3Rh
bmdsZShjciwgZmluYWxGb2N1c1JlY3QueCgpLCBmaW5hbEZvY3VzUmVjdC55KCksIGZpbmFsRm9j
dXNSZWN0LndpZHRoKCksIGZpbmFsRm9jdXNSZWN0LmhlaWdodCgpKTsKKworICAgIC8vIEZvcmNl
IHRoZSBhbHBoYSB0byA1MCUuICBUaGlzIG1hdGNoZXMgd2hhdCB0aGUgTWFjIGRvZXMgd2l0aCBv
dXRsaW5lIHJpbmdzLgorICAgIENvbG9yIHJpbmdDb2xvcihjb2xvci5yZWQoKSwgY29sb3IuZ3Jl
ZW4oKSwgY29sb3IuYmx1ZSgpLCAxMjcpOworICAgIHNldENvbG9yKGNyLCByaW5nQ29sb3IpOwor
ICAgIGNhaXJvX3N0cm9rZShjcik7CisgICAgY2Fpcm9fcmVzdG9yZShjcik7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvclRleHQoY29uc3QgSW50UG9pbnQmIG9yaWdpbiwg
aW50IHdpZHRoLCBib29sIHByaW50aW5nKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkp
CisgICAgICAgIHJldHVybjsKKworICAgIC8vIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBodHRw
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTY1OQorICAgIFN0cm9rZVN0eWxl
IHNhdmVkU3Ryb2tlU3R5bGUgPSBzdHJva2VTdHlsZSgpOworICAgIHNldFN0cm9rZVN0eWxlKFNv
bGlkU3Ryb2tlKTsKKworICAgIEludFBvaW50IGVuZFBvaW50ID0gb3JpZ2luICsgSW50U2l6ZSh3
aWR0aCwgMCk7CisgICAgZHJhd0xpbmUob3JpZ2luLCBlbmRQb2ludCk7CisKKyAgICBzZXRTdHJv
a2VTdHlsZShzYXZlZFN0cm9rZVN0eWxlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRy
YXdMaW5lRm9yTWlzc3BlbGxpbmdPckJhZEdyYW1tYXIoY29uc3QgSW50UG9pbnQmIG9yaWdpbiwg
aW50IHdpZHRoLCBib29sIGdyYW1tYXIpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkK
KyAgICAgICAgcmV0dXJuOworCisjaWYgUExBVEZPUk0oR1RLKQorICAgIGNhaXJvX3QqIGNyID0g
bV9kYXRhLT5jcjsKKyAgICBjYWlyb19zYXZlKGNyKTsKKworICAgIC8vIENvbnZlbnRpb24gaXMg
Z3JlZW4gZm9yIGdyYW1tYXIsIHJlZCBmb3Igc3BlbGxpbmcKKyAgICAvLyBUaGVzZSBuZWVkIHRv
IGJlY29tZSBjb25maWd1cmFibGUKKyAgICBpZiAoZ3JhbW1hcikKKyAgICAgICAgY2Fpcm9fc2V0
X3NvdXJjZV9yZ2IoY3IsIDAsIDEsIDApOworICAgIGVsc2UKKyAgICAgICAgY2Fpcm9fc2V0X3Nv
dXJjZV9yZ2IoY3IsIDEsIDAsIDApOworCisgICAgLy8gV2UgaWdub3JlIG1vc3Qgb2YgdGhlIHBy
b3ZpZGVkIGNvbnN0YW50cyBpbiBmYXZvdXIgb2YgdGhlIHBsYXRmb3JtIHN0eWxlCisgICAgcGFu
Z29fY2Fpcm9fc2hvd19lcnJvcl91bmRlcmxpbmUoY3IsIG9yaWdpbi54KCksIG9yaWdpbi55KCks
IHdpZHRoLCBjTWlzc3BlbGxpbmdMaW5lVGhpY2tuZXNzKTsKKworICAgIGNhaXJvX3Jlc3RvcmUo
Y3IpOworI2Vsc2UKKyAgICBub3RJbXBsZW1lbnRlZCgpOworI2VuZGlmCit9CisKK0Zsb2F0UmVj
dCBHcmFwaGljc0NvbnRleHQ6OnJvdW5kVG9EZXZpY2VQaXhlbHMoY29uc3QgRmxvYXRSZWN0JiBm
cmVjdCkKK3sKKyAgICBGbG9hdFJlY3QgcmVzdWx0OworICAgIGRvdWJsZSB4ID0gZnJlY3QueCgp
OworICAgIGRvdWJsZSB5ID0gZnJlY3QueSgpOworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5j
cjsKKyAgICBjYWlyb191c2VyX3RvX2RldmljZShjciwgJngsICZ5KTsKKyAgICB4ID0gcm91bmQo
eCk7CisgICAgeSA9IHJvdW5kKHkpOworICAgIGNhaXJvX2RldmljZV90b191c2VyKGNyLCAmeCwg
JnkpOworICAgIHJlc3VsdC5zZXRYKHN0YXRpY19jYXN0PGZsb2F0Pih4KSk7CisgICAgcmVzdWx0
LnNldFkoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHkpKTsKKyAgICB4ID0gZnJlY3Qud2lkdGgoKTsKKyAg
ICB5ID0gZnJlY3QuaGVpZ2h0KCk7CisgICAgY2Fpcm9fdXNlcl90b19kZXZpY2VfZGlzdGFuY2Uo
Y3IsICZ4LCAmeSk7CisgICAgeCA9IHJvdW5kKHgpOworICAgIHkgPSByb3VuZCh5KTsKKyAgICBj
YWlyb19kZXZpY2VfdG9fdXNlcl9kaXN0YW5jZShjciwgJngsICZ5KTsKKyAgICByZXN1bHQuc2V0
V2lkdGgoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHgpKTsKKyAgICByZXN1bHQuc2V0SGVpZ2h0KHN0YXRp
Y19jYXN0PGZsb2F0Pih5KSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBHcmFwaGlj
c0NvbnRleHQ6OnRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5KQoreworICAgIGlmIChwYWludGlu
Z0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRh
LT5jcjsKKyAgICBjYWlyb190cmFuc2xhdGUoY3IsIHgsIHkpOworfQorCitJbnRQb2ludCBHcmFw
aGljc0NvbnRleHQ6Om9yaWdpbigpCit7CisgICAgY2Fpcm9fbWF0cml4X3QgbWF0cml4OworICAg
IGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb19nZXRfbWF0cml4KGNyLCAmbWF0
cml4KTsKKyAgICByZXR1cm4gSW50UG9pbnQoc3RhdGljX2Nhc3Q8aW50PihtYXRyaXgueDApLCBz
dGF0aWNfY2FzdDxpbnQ+KG1hdHJpeC55MCkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6
c2V0UGxhdGZvcm1GaWxsQ29sb3IoY29uc3QgQ29sb3ImIGNvbCkKK3sKKyAgICAvLyBGSVhNRTog
dGhpcyBpcyBwcm9iYWJseSBhIG5vLW9wIGJ1dCBJJ20gbm90IHN1cmUKKyAgICAvLyBub3RJbXBs
ZW1lbnRlZCgpOyAvLyBjb21tZW50ZWQtb3V0IGJlY2F1c2UgaXQncyBjaGF0dHkgYW5kIGNsdXR0
ZXJzIG91dHB1dAorfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TdHJva2VD
b2xvcihjb25zdCBDb2xvciYgY29sKQoreworICAgIC8vIEZJWE1FOiB0aGlzIGlzIHByb2JhYmx5
IGEgbm8tb3AgYnV0IEknbSBub3Qgc3VyZQorICAgIC8vbm90SW1wbGVtZW50ZWQoKTsgLy8gY29t
bWVudGVkLW91dCBiZWNhdXNlIGl0J3MgY2hhdHR5IGFuZCBjbHV0dGVycyBvdXRwdXQKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtU3Ryb2tlVGhpY2tuZXNzKGZsb2F0IHN0
cm9rZVRoaWNrbmVzcykKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBjYWlyb19zZXRfbGluZV93aWR0aChtX2RhdGEtPmNyLCBzdHJva2VUaGlj
a25lc3MpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TdHJva2VTdHls
ZShjb25zdCBTdHJva2VTdHlsZSYgc3Ryb2tlU3R5bGUpCit7CisgICAgc3RhdGljIGRvdWJsZSBk
YXNoUGF0dGVybltdID0gezUuMCwgNS4wfTsKKyAgICBzdGF0aWMgZG91YmxlIGRvdFBhdHRlcm5b
XSA9IHsxLjAsIDEuMH07CisKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBzd2l0Y2ggKHN0cm9rZVN0eWxlKSB7CisgICAgY2FzZSBOb1N0cm9rZToK
KyAgICAgICAgLy8gRklYTUU6IGlzIGl0IHRoZSByaWdodCB3YXkgdG8gZW11bGF0ZSBOb1N0cm9r
ZT8KKyAgICAgICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgobV9kYXRhLT5jciwgMCk7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgU29saWRTdHJva2U6CisgICAgICAgIGNhaXJvX3NldF9kYXNoKG1f
ZGF0YS0+Y3IsIDAsIDAsIDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERvdHRlZFN0cm9r
ZToKKyAgICAgICAgY2Fpcm9fc2V0X2Rhc2gobV9kYXRhLT5jciwgZG90UGF0dGVybiwgMiwgMCk7
CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRGFzaGVkU3Ryb2tlOgorICAgICAgICBjYWlyb19z
ZXRfZGFzaChtX2RhdGEtPmNyLCBkYXNoUGF0dGVybiwgMiwgMCk7CisgICAgICAgIGJyZWFrOwor
ICAgIGRlZmF1bHQ6CisgICAgICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgICAgIGJyZWFrOwor
ICAgIH0KK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFVSTEZvclJlY3QoY29uc3QgS1VS
TCYgbGluaywgY29uc3QgSW50UmVjdCYgZGVzdFJlY3QpCit7CisgICAgbm90SW1wbGVtZW50ZWQo
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNvbmNhdENUTShjb25zdCBBZmZpbmVUcmFu
c2Zvcm0mIHRyYW5zZm9ybSkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgY29uc3QgY2Fp
cm9fbWF0cml4X3QqIG1hdHJpeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2Fpcm9fbWF0cml4
X3QqPigmdHJhbnNmb3JtKTsKKyAgICBjYWlyb190cmFuc2Zvcm0oY3IsIG1hdHJpeCk7Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0OjphZGRJbm5lclJvdW5kZWRSZWN0Q2xpcChjb25zdCBJbnRS
ZWN0JiByZWN0LCBpbnQgdGhpY2tuZXNzKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkp
CisgICAgICAgIHJldHVybjsKKworICAgIGNsaXAocmVjdCk7CisKKyAgICBQYXRoIHA7CisgICAg
RmxvYXRSZWN0IHIocmVjdCk7CisgICAgLy8gQWRkIG91dGVyIGVsbGlwc2UKKyAgICBwLmFkZEVs
bGlwc2Uocik7CisgICAgLy8gQWRkIGlubmVyIGVsbGlwc2UKKyAgICByLmluZmxhdGUoLXRoaWNr
bmVzcyk7CisgICAgcC5hZGRFbGxpcHNlKHIpOworICAgIGFkZFBhdGgocCk7CisKKyAgICBjYWly
b190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgY2Fpcm9fZmlsbF9ydWxlX3Qgc2F2ZWRGaWxsUnVs
ZSA9IGNhaXJvX2dldF9maWxsX3J1bGUoY3IpOworICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3Is
IENBSVJPX0ZJTExfUlVMRV9FVkVOX09ERCk7CisgICAgY2Fpcm9fY2xpcChjcik7CisgICAgY2Fp
cm9fc2V0X2ZpbGxfcnVsZShjciwgc2F2ZWRGaWxsUnVsZSk7Cit9CisKKwordm9pZCBHcmFwaGlj
c0NvbnRleHQ6OnNldFNoYWRvdyhJbnRTaXplIGNvbnN0JiwgaW50LCBDb2xvciBjb25zdCYpCit7
CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsZWFy
U2hhZG93KCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6YmVnaW5UcmFuc3BhcmVuY3lMYXllcihmbG9hdCBvcGFjaXR5KQoreworICAgIGlmIChw
YWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0g
bV9kYXRhLT5jcjsKKyAgICBjYWlyb19wdXNoX2dyb3VwKGNyKTsKKyAgICBtX2RhdGEtPmxheWVy
cy5hcHBlbmQob3BhY2l0eSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjplbmRUcmFuc3Bh
cmVuY3lMYXllcigpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOworCisgICAgY2Fpcm9fcG9wX2dy
b3VwX3RvX3NvdXJjZShjcik7CisgICAgY2Fpcm9fcGFpbnRfd2l0aF9hbHBoYShjciwgbV9kYXRh
LT5sYXllcnMubGFzdCgpKTsKKyAgICBtX2RhdGEtPmxheWVycy5yZW1vdmVMYXN0KCk7Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGVhclJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KQor
eworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNh
aXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKworICAgIGNhaXJvX3NhdmUoY3IpOworICAgIGNhaXJv
X3JlY3RhbmdsZShjciwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVp
Z2h0KCkpOworICAgIGNhaXJvX3NldF9vcGVyYXRvcihjciwgQ0FJUk9fT1BFUkFUT1JfQ0xFQVIp
OworICAgIGNhaXJvX2ZpbGwoY3IpOworICAgIGNhaXJvX3Jlc3RvcmUoY3IpOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dDo6c3Ryb2tlUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGZsb2F0
IHdpZHRoKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsK
KworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb19zYXZlKGNyKTsKKyAg
ICBjYWlyb19yZWN0YW5nbGUoY3IsIHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCBy
ZWN0LmhlaWdodCgpKTsKKyAgICBzZXRDb2xvcihjciwgc3Ryb2tlQ29sb3IoKSk7CisgICAgY2Fp
cm9fc2V0X2xpbmVfd2lkdGgoY3IsIHdpZHRoKTsKKyAgICBjYWlyb19zdHJva2UoY3IpOworICAg
IGNhaXJvX3Jlc3RvcmUoY3IpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0TGluZUNh
cChMaW5lQ2FwIGxpbmVDYXApCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgY2Fpcm9fbGluZV9jYXBfdCBjYWlyb0NhcCA9IENBSVJPX0xJTkVf
Q0FQX0JVVFQ7CisgICAgc3dpdGNoIChsaW5lQ2FwKSB7CisgICAgICAgIGNhc2UgQnV0dENhcDoK
KyAgICAgICAgICAgIC8vIG5vLW9wCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBS
b3VuZENhcDoKKyAgICAgICAgICAgIGNhaXJvQ2FwID0gQ0FJUk9fTElORV9DQVBfUk9VTkQ7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTcXVhcmVDYXA6CisgICAgICAgICAgICBj
YWlyb0NhcCA9IENBSVJPX0xJTkVfQ0FQX1NRVUFSRTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
IH0KKyAgICBjYWlyb19zZXRfbGluZV9jYXAobV9kYXRhLT5jciwgY2Fpcm9DYXApOworfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0TGluZUpvaW4oTGluZUpvaW4gbGluZUpvaW4pCit7Cisg
ICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9f
bGluZV9qb2luX3QgY2Fpcm9Kb2luID0gQ0FJUk9fTElORV9KT0lOX01JVEVSOworICAgIHN3aXRj
aCAobGluZUpvaW4pIHsKKyAgICAgICAgY2FzZSBNaXRlckpvaW46CisgICAgICAgICAgICAvLyBu
by1vcAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUm91bmRKb2luOgorICAgICAg
ICAgICAgY2Fpcm9Kb2luID0gQ0FJUk9fTElORV9KT0lOX1JPVU5EOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGNhc2UgQmV2ZWxKb2luOgorICAgICAgICAgICAgY2Fpcm9Kb2luID0gQ0FJ
Uk9fTElORV9KT0lOX0JFVkVMOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhaXJv
X3NldF9saW5lX2pvaW4obV9kYXRhLT5jciwgY2Fpcm9Kb2luKTsKK30KKwordm9pZCBHcmFwaGlj
c0NvbnRleHQ6OnNldE1pdGVyTGltaXQoZmxvYXQgbWl0ZXIpCit7CisgICAgaWYgKHBhaW50aW5n
RGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fc2V0X21pdGVyX2xpbWl0
KG1fZGF0YS0+Y3IsIG1pdGVyKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldEFscGhh
KGZsb2F0KQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgY2Fp
cm9fb3BlcmF0b3JfdCB0b0NhaXJvT3BlcmF0b3IoQ29tcG9zaXRlT3BlcmF0b3Igb3ApCit7Cisg
ICAgc3dpdGNoIChvcCkgeworICAgICAgICBjYXNlIENvbXBvc2l0ZUNsZWFyOgorICAgICAgICAg
ICAgcmV0dXJuIENBSVJPX09QRVJBVE9SX0NMRUFSOworICAgICAgICBjYXNlIENvbXBvc2l0ZUNv
cHk6CisgICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfU09VUkNFOworICAgICAgICBj
YXNlIENvbXBvc2l0ZVNvdXJjZU92ZXI6CisgICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFU
T1JfT1ZFUjsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VJbjoKKyAgICAgICAgICAgIHJl
dHVybiBDQUlST19PUEVSQVRPUl9JTjsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VPdXQ6
CisgICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfT1VUOworICAgICAgICBjYXNlIENv
bXBvc2l0ZVNvdXJjZUF0b3A6CisgICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfQVRP
UDsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlvbk92ZXI6CisgICAgICAgICAgICBy
ZXR1cm4gQ0FJUk9fT1BFUkFUT1JfREVTVF9PVkVSOworICAgICAgICBjYXNlIENvbXBvc2l0ZURl
c3RpbmF0aW9uSW46CisgICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfREVTVF9JTjsK
KyAgICAgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlvbk91dDoKKyAgICAgICAgICAgIHJldHVy
biBDQUlST19PUEVSQVRPUl9ERVNUX09VVDsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5h
dGlvbkF0b3A6CisgICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfREVTVF9BVE9QOwor
ICAgICAgICBjYXNlIENvbXBvc2l0ZVhPUjoKKyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVS
QVRPUl9YT1I7CisgICAgICAgIGNhc2UgQ29tcG9zaXRlUGx1c0RhcmtlcjoKKyAgICAgICAgICAg
IHJldHVybiBDQUlST19PUEVSQVRPUl9TQVRVUkFURTsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVI
aWdobGlnaHQ6CisgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBDYWlybyBlcXVpdmFsZW50IGZv
ciBDb21wb3NpdGVIaWdobGlnaHQuCisgICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1Jf
T1ZFUjsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVQbHVzTGlnaHRlcjoKKyAgICAgICAgICAgIHJl
dHVybiBDQUlST19PUEVSQVRPUl9BREQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBy
ZXR1cm4gQ0FJUk9fT1BFUkFUT1JfU09VUkNFOworICAgIH0KK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQ6OnNldENvbXBvc2l0ZU9wZXJhdGlvbihDb21wb3NpdGVPcGVyYXRvciBvcCkKK3sKKyAg
ICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb19z
ZXRfb3BlcmF0b3IobV9kYXRhLT5jciwgdG9DYWlyb09wZXJhdG9yKG9wKSk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0OjpiZWdpblBhdGgoKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVk
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAg
ICBjYWlyb19uZXdfcGF0aChjcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjphZGRQYXRo
KGNvbnN0IFBhdGgmIHBhdGgpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOworICAgIGNhaXJvX3Bh
dGhfdCogcCA9IGNhaXJvX2NvcHlfcGF0aChwYXRoLnBsYXRmb3JtUGF0aCgpLT5tX2NyKTsKKyAg
ICBjYWlyb19hcHBlbmRfcGF0aChjciwgcCk7CisgICAgY2Fpcm9fcGF0aF9kZXN0cm95KHApOwor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcChjb25zdCBQYXRoJiBwYXRoKQoreworICAg
IGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3Qq
IGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb19wYXRoX3QqIHAgPSBjYWlyb19jb3B5X3BhdGgo
cGF0aC5wbGF0Zm9ybVBhdGgoKS0+bV9jcik7CisgICAgY2Fpcm9fYXBwZW5kX3BhdGgoY3IsIHAp
OworICAgIGNhaXJvX3BhdGhfZGVzdHJveShwKTsKKyAgICBjYWlyb19maWxsX3J1bGVfdCBzYXZl
ZEZpbGxSdWxlID0gY2Fpcm9fZ2V0X2ZpbGxfcnVsZShjcik7CisgICAgY2Fpcm9fc2V0X2ZpbGxf
cnVsZShjciwgQ0FJUk9fRklMTF9SVUxFX1dJTkRJTkcpOworICAgIGNhaXJvX2NsaXAoY3IpOwor
ICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIHNhdmVkRmlsbFJ1bGUpOworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDo6Y2xpcE91dChjb25zdCBQYXRoJiBwYXRoKQoreworICAgIGlmIChwYWlu
dGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9k
YXRhLT5jcjsKKyAgICBkb3VibGUgeDEsIHkxLCB4MiwgeTI7CisgICAgY2Fpcm9fY2xpcF9leHRl
bnRzKGNyLCAmeDEsICZ5MSwgJngyLCAmeTIpOworICAgIGNhaXJvX3JlY3RhbmdsZShjciwgeDEs
IHkxLCB4MiAtIHgxLCB5MiAtIHkxKTsKKyAgICBhZGRQYXRoKHBhdGgpOworCisgICAgY2Fpcm9f
ZmlsbF9ydWxlX3Qgc2F2ZWRGaWxsUnVsZSA9IGNhaXJvX2dldF9maWxsX3J1bGUoY3IpOworICAg
IGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIENBSVJPX0ZJTExfUlVMRV9FVkVOX09ERCk7CisgICAg
Y2Fpcm9fY2xpcChjcik7CisgICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgc2F2ZWRGaWxsUnVs
ZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpyb3RhdGUoZmxvYXQgcmFkaWFucykKK3sK
KyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWly
b19yb3RhdGUobV9kYXRhLT5jciwgcmFkaWFucyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
OjpzY2FsZShjb25zdCBGbG9hdFNpemUmIHNpemUpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJs
ZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fc2NhbGUobV9kYXRhLT5jciwgc2l6
ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNs
aXBPdXQoY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgZG91
YmxlIHgxLCB5MSwgeDIsIHkyOworICAgIGNhaXJvX2NsaXBfZXh0ZW50cyhjciwgJngxLCAmeTEs
ICZ4MiwgJnkyKTsKKyAgICBjYWlyb19yZWN0YW5nbGUoY3IsIHgxLCB4MiwgeDIgLSB4MSwgeTIg
LSB5MSk7CisgICAgY2Fpcm9fcmVjdGFuZ2xlKGNyLCByLngoKSwgci55KCksIHIud2lkdGgoKSwg
ci5oZWlnaHQoKSk7CisgICAgY2Fpcm9fZmlsbF9ydWxlX3Qgc2F2ZWRGaWxsUnVsZSA9IGNhaXJv
X2dldF9maWxsX3J1bGUoY3IpOworICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIENBSVJPX0ZJ
TExfUlVMRV9FVkVOX09ERCk7CisgICAgY2Fpcm9fY2xpcChjcik7CisgICAgY2Fpcm9fc2V0X2Zp
bGxfcnVsZShjciwgc2F2ZWRGaWxsUnVsZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpj
bGlwT3V0RWxsaXBzZUluUmVjdChjb25zdCBJbnRSZWN0JiByKQoreworICAgIGlmIChwYWludGlu
Z0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIFBhdGggcDsKKyAgICBwLmFkZEVs
bGlwc2Uocik7CisgICAgY2xpcE91dChwKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmZp
bGxSb3VuZGVkUmVjdChjb25zdCBJbnRSZWN0JiByLCBjb25zdCBJbnRTaXplJiB0b3BMZWZ0LCBj
b25zdCBJbnRTaXplJiB0b3BSaWdodCwgY29uc3QgSW50U2l6ZSYgYm90dG9tTGVmdCwgY29uc3Qg
SW50U2l6ZSYgYm90dG9tUmlnaHQsIGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBpZiAocGFp
bnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb190KiBjciA9IG1f
ZGF0YS0+Y3I7CisgICAgY2Fpcm9fc2F2ZShjcik7CisgICAgYmVnaW5QYXRoKCk7CisgICAgYWRk
UGF0aChQYXRoOjpjcmVhdGVSb3VuZGVkUmVjdGFuZ2xlKHIsIHRvcExlZnQsIHRvcFJpZ2h0LCBi
b3R0b21MZWZ0LCBib3R0b21SaWdodCkpOworICAgIHNldENvbG9yKGNyLCBjb2xvcik7CisgICAg
Y2Fpcm9fZmlsbChjcik7CisgICAgY2Fpcm9fcmVzdG9yZShjcik7Cit9CisKKyNpZiBQTEFURk9S
TShHVEspCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0R2RrRXhwb3NlRXZlbnQoR2RrRXZlbnRF
eHBvc2UqIGV4cG9zZSkKK3sKKyAgICBtX2RhdGEtPmV4cG9zZSA9IGV4cG9zZTsKK30KKworR2Rr
RXZlbnRFeHBvc2UqIEdyYXBoaWNzQ29udGV4dDo6Z2RrRXhwb3NlRXZlbnQoKSBjb25zdAorewor
ICAgIHJldHVybiBtX2RhdGEtPmV4cG9zZTsKK30KKworR2RrRHJhd2FibGUqIEdyYXBoaWNzQ29u
dGV4dDo6Z2RrRHJhd2FibGUoKSBjb25zdAoreworICAgIGlmICghbV9kYXRhLT5leHBvc2UpCisg
ICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIEdES19EUkFXQUJMRShtX2RhdGEtPmV4cG9z
ZS0+d2luZG93KTsKK30KKworSW50UG9pbnQgR3JhcGhpY3NDb250ZXh0Ojp0cmFuc2xhdGVQb2lu
dChjb25zdCBJbnRQb2ludCYgcG9pbnQpIGNvbnN0Cit7CisgICAgY2Fpcm9fbWF0cml4X3QgdG07
CisgICAgY2Fpcm9fZ2V0X21hdHJpeChtX2RhdGEtPmNyLCAmdG0pOworICAgIGRvdWJsZSB4ID0g
cG9pbnQueCgpOworICAgIGRvdWJsZSB5ID0gcG9pbnQueSgpOworCisgICAgY2Fpcm9fbWF0cml4
X3RyYW5zZm9ybV9wb2ludCgmdG0sICZ4LCAmeSk7CisgICAgcmV0dXJuIEludFBvaW50KHgsIHkp
OworfQorI2VuZGlmCisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRVc2VBbnRpYWxpYXNpbmco
Ym9vbCBlbmFibGUpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgLy8gV2hlbiB0cnVlLCB1c2UgdGhlIGRlZmF1bHQgQ2Fpcm8gYmFja2VuZCBh
bnRpYWxpYXMgbW9kZSAodXN1YWxseSB0aGlzCisgICAgLy8gZW5hYmxlcyBzdGFuZGFyZCAnZ3Jh
eXNjYWxlJyBhbnRpYWxpYXNpbmcpOyBmYWxzZSB0byBleHBsaWNpdGx5IGRpc2FibGUKKyAgICAv
LyBhbnRpYWxpYXNpbmcuIFRoaXMgaXMgdGhlIHNhbWUgc3RyYXRlZ3kgYXMgdXNlZCBpbiBkcmF3
Q29udmV4UG9seWdvbigpLgorICAgIGNhaXJvX3NldF9hbnRpYWxpYXMobV9kYXRhLT5jciwgZW5h
YmxlID8gQ0FJUk9fQU5USUFMSUFTX0RFRkFVTFQgOiBDQUlST19BTlRJQUxJQVNfTk9ORSk7Cit9
CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFBMQVRGT1JNKENBSVJPKQpJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9HcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nh
aXJvL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZS5oCShyZXZpc2lvbiAyOTcyNikKKysr
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNiArMSw3IEBACiAvKgogICogQ29weXJpZ2h0
IChDKSAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICog
Q29weXJpZ2h0IChDKSAyMDA3IEFscCBUb2tlciA8YWxwQGF0b2tlci5jb20+CisgKiBDb3B5cmln
aHQgKEMpIDIwMDggQnJlbnQgRnVsZ2hhbSA8YmZ1bGdoYW1AZ21haWwuY29tPgogICoKICAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yOSw4OTUgKzMwLDU1IEBACiAKICNpZiBQTEFURk9S
TShDQUlSTykKIAotI2luY2x1ZGUgIkNhaXJvUGF0aC5oIgotI2luY2x1ZGUgIkZsb2F0UmVjdC5o
IgotI2luY2x1ZGUgIkZvbnQuaCIKLSNpbmNsdWRlICJJbnRSZWN0LmgiCi0jaW5jbHVkZSAiTm90
SW1wbGVtZW50ZWQuaCIKLSNpbmNsdWRlICJQYXRoLmgiCi0jaW5jbHVkZSAiU2ltcGxlRm9udERh
dGEuaCIKICNpbmNsdWRlIDxjYWlyby5oPgogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxz
dGRpby5oPgogI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CiAKLSNpZiBQTEFURk9STShXSU4p
Ci0jaW5jbHVkZSA8Y2Fpcm8td2luMzIuaD4KLSNlbmRpZgotCiAjaWYgUExBVEZPUk0oR1RLKQog
I2luY2x1ZGUgPGdkay9nZGsuaD4KICNpbmNsdWRlIDxwYW5nby9wYW5nby5oPgotI2VuZGlmCi0K
LQotI2lmbmRlZiBNX1BJCi0jZGVmaW5lIE1fUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgorI2Vs
aWYgUExBVEZPUk0oV0lOKQorI2luY2x1ZGUgPGNhaXJvLXdpbjMyLmg+CiAjZW5kaWYKIAogbmFt
ZXNwYWNlIFdlYkNvcmUgewogCiBjbGFzcyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUg
ewogcHVibGljOgotICAgIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpOwotICAgIH5H
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKTsKLQotICAgIGNhaXJvX3QqIGNyOwotICAg
IFZlY3RvcjxmbG9hdD4gbGF5ZXJzOwotCisgICAgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2
YXRlKCkKKyAgICAgICAgOiAgY3IoMCkKICNpZiBQTEFURk9STShHVEspCi0gICAgR2RrRXZlbnRF
eHBvc2UqIGV4cG9zZTsKLSNlbmRpZgotfTsKLQotc3RhdGljIGlubGluZSB2b2lkIHNldENvbG9y
KGNhaXJvX3QqIGNyLCBjb25zdCBDb2xvciYgY29sKQotewotICAgIGZsb2F0IHJlZCwgZ3JlZW4s
IGJsdWUsIGFscGhhOwotICAgIGNvbC5nZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsK
LSAgICBjYWlyb19zZXRfc291cmNlX3JnYmEoY3IsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsK
LX0KLQotLy8gQSBmaWxsUmVjdCBoZWxwZXIKLXN0YXRpYyBpbmxpbmUgdm9pZCBmaWxsUmVjdFNv
dXJjZU92ZXIoY2Fpcm9fdCogY3IsIGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgY29uc3QgQ29sb3Im
IGNvbCkKLXsKLSAgICBzZXRDb2xvcihjciwgY29sKTsKLSAgICBjYWlyb19yZWN0YW5nbGUoY3Is
IHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKLSAgICBj
YWlyb19zZXRfb3BlcmF0b3IoY3IsIENBSVJPX09QRVJBVE9SX09WRVIpOwotICAgIGNhaXJvX2Zp
bGwoY3IpOwotfQotCi1HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OkdyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZSgpCi0gICAgOiAgY3IoMCkKLSNpZiBQTEFURk9STShHVEspCi0g
ICAgLCBleHBvc2UoMCkKLSNlbmRpZgotewotfQotCi1HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVBy
aXZhdGU6On5HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKQotewotICAgIGNhaXJvX2Rl
c3Ryb3koY3IpOwotfQotCi0jaWYgUExBVEZPUk0oV0lOKQotR3JhcGhpY3NDb250ZXh0OjpHcmFw
aGljc0NvbnRleHQoSERDIGRjKQotICAgIDogbV9jb21tb24oY3JlYXRlR3JhcGhpY3NDb250ZXh0
UHJpdmF0ZSgpKQotICAgICwgbV9kYXRhKG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZh
dGUpCi17Ci0gICAgaWYgKGRjKSB7Ci0gICAgICAgIGNhaXJvX3N1cmZhY2VfdCogc3VyZmFjZSA9
IGNhaXJvX3dpbjMyX3N1cmZhY2VfY3JlYXRlKGRjKTsKLSAgICAgICAgbV9kYXRhLT5jciA9IGNh
aXJvX2NyZWF0ZShzdXJmYWNlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzZXRQYWludGluZ0Rp
c2FibGVkKHRydWUpOwotICAgICAgICBtX2RhdGEtPmNyID0gMDsKLSAgICB9Ci19Ci0jZW5kaWYK
LQotR3JhcGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRleHQoUGxhdGZvcm1HcmFwaGljc0NvbnRl
eHQqIGNyKQotICAgIDogbV9jb21tb24oY3JlYXRlR3JhcGhpY3NDb250ZXh0UHJpdmF0ZSgpKQot
ICAgICwgbV9kYXRhKG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUpCi17Ci0gICAg
bV9kYXRhLT5jciA9IGNhaXJvX3JlZmVyZW5jZShjcik7Ci0gICAgc2V0UGFpbnRpbmdEaXNhYmxl
ZCghY3IpOwotfQotCi1HcmFwaGljc0NvbnRleHQ6On5HcmFwaGljc0NvbnRleHQoKQotewotICAg
IGRlc3Ryb3lHcmFwaGljc0NvbnRleHRQcml2YXRlKG1fY29tbW9uKTsKLSAgICBkZWxldGUgbV9k
YXRhOwotfQotCi1jYWlyb190KiBHcmFwaGljc0NvbnRleHQ6OnBsYXRmb3JtQ29udGV4dCgpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIG1fZGF0YS0+Y3I7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
OjpzYXZlUGxhdGZvcm1TdGF0ZSgpCi17Ci0gICAgY2Fpcm9fc2F2ZShtX2RhdGEtPmNyKTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnJlc3RvcmVQbGF0Zm9ybVN0YXRlKCkKLXsKLSAgICBj
YWlyb19yZXN0b3JlKG1fZGF0YS0+Y3IpOwotfQotCi0vLyBEcmF3cyBhIGZpbGxlZCByZWN0YW5n
bGUgd2l0aCBhIHN0cm9rZWQgYm9yZGVyLgotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdSZWN0
KGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotICAgIGNhaXJv
X3NhdmUoY3IpOwotCi0gICAgaWYgKGZpbGxDb2xvcigpLmFscGhhKCkpCi0gICAgICAgIGZpbGxS
ZWN0U291cmNlT3ZlcihjciwgcmVjdCwgZmlsbENvbG9yKCkpOwotCi0gICAgaWYgKHN0cm9rZVN0
eWxlKCkgIT0gTm9TdHJva2UpIHsKLSAgICAgICAgc2V0Q29sb3IoY3IsIHN0cm9rZUNvbG9yKCkp
OwotICAgICAgICBGbG9hdFJlY3QgcihyZWN0KTsKLSAgICAgICAgci5pbmZsYXRlKC0uNWYpOwot
ICAgICAgICBjYWlyb19yZWN0YW5nbGUoY3IsIHIueCgpLCByLnkoKSwgci53aWR0aCgpLCByLmhl
aWdodCgpKTsKLSAgICAgICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgoY3IsIDEuMCk7Ci0gICAgICAg
IGNhaXJvX3N0cm9rZShjcik7CisgICAgICAgICwgZXhwb3NlKDApCisjZWxpZiBQTEFURk9STShX
SU4pCisgICAgICAgIC8vIE5PVEU6ICBUaGVzZSBtYXkgbm90ZSBiZSBuZWVkZWQ6IHJldmlldyBh
bmQgcmVtb3ZlIG9uY2UgQ2Fpcm8gaW1wbGVtZW50YXRpb24gaXMgY29tcGxldGUKKyAgICAgICAg
LCBtX2hkYygwKQorICAgICAgICAsIG1fdHJhbnNwYXJlbmN5Q291bnQoMCkKKyNlbmRpZgorICAg
IHsKICAgICB9CiAKLSAgICBjYWlyb19yZXN0b3JlKGNyKTsKLX0KLQotLy8gRklYTUU6IE5vdyB0
aGF0IHRoaXMgaXMgcmVmYWN0b3JlZCwgaXQgc2hvdWxkIGJlIHNoYXJlZCBieSBhbGwgY29udGV4
dHMuCi1zdGF0aWMgdm9pZCBhZGp1c3RMaW5lVG9QaXhlbEJvdW5kYXJpZXMoRmxvYXRQb2ludCYg
cDEsIEZsb2F0UG9pbnQmIHAyLCBmbG9hdCBzdHJva2VXaWR0aCwgU3Ryb2tlU3R5bGUgc3R5bGUp
Ci17Ci0gICAgLy8gRm9yIG9kZCB3aWR0aHMsIHdlIGFkZCBpbiAwLjUgdG8gdGhlIGFwcHJvcHJp
YXRlIHgveSBzbyB0aGF0IHRoZSBmbG9hdCBhcml0aG1ldGljCi0gICAgLy8gd29ya3Mgb3V0LiAg
Rm9yIGV4YW1wbGUsIHdpdGggYSBib3JkZXIgd2lkdGggb2YgMywgS0hUTUwgd2lsbCBwYXNzIHVz
ICh5MSt5MikvMiwgZS5nLiwKLSAgICAvLyAoNTArNTMpLzIgPSAxMDMvMiA9IDUxIHdoZW4gd2Ug
d2FudCA1MS41LiAgSXQgaXMgYWx3YXlzIHRydWUgdGhhdCBhbiBldmVuIHdpZHRoIGdhdmUKLSAg
ICAvLyB1cyBhIHBlcmZlY3QgcG9zaXRpb24sIGJ1dCBhbiBvZGQgd2lkdGggZ2F2ZSB1cyBhIHBv
c2l0aW9uIHRoYXQgaXMgb2ZmIGJ5IGV4YWN0bHkgMC41LgotICAgIGlmIChzdHlsZSA9PSBEb3R0
ZWRTdHJva2UgfHwgc3R5bGUgPT0gRGFzaGVkU3Ryb2tlKSB7Ci0gICAgICAgIGlmIChwMS54KCkg
PT0gcDIueCgpKSB7Ci0gICAgICAgICAgICBwMS5zZXRZKHAxLnkoKSArIHN0cm9rZVdpZHRoKTsK
LSAgICAgICAgICAgIHAyLnNldFkocDIueSgpIC0gc3Ryb2tlV2lkdGgpOwotICAgICAgICB9Ci0g
ICAgICAgIGVsc2UgewotICAgICAgICAgICAgcDEuc2V0WChwMS54KCkgKyBzdHJva2VXaWR0aCk7
Ci0gICAgICAgICAgICBwMi5zZXRYKHAyLngoKSAtIHN0cm9rZVdpZHRoKTsKLSAgICAgICAgfQot
ICAgIH0KLQotICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KHN0cm9rZVdpZHRoKSAlIDIpIHsKLSAg
ICAgICAgaWYgKHAxLngoKSA9PSBwMi54KCkpIHsKLSAgICAgICAgICAgIC8vIFdlJ3JlIGEgdmVy
dGljYWwgbGluZS4gIEFkanVzdCBvdXIgeC4KLSAgICAgICAgICAgIHAxLnNldFgocDEueCgpICsg
MC41KTsKLSAgICAgICAgICAgIHAyLnNldFgocDIueCgpICsgMC41KTsKLSAgICAgICAgfQotICAg
ICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIFdlJ3JlIGEgaG9yaXpvbnRhbCBsaW5lLiBBZGp1
c3Qgb3VyIHkuCi0gICAgICAgICAgICBwMS5zZXRZKHAxLnkoKSArIDAuNSk7Ci0gICAgICAgICAg
ICBwMi5zZXRZKHAyLnkoKSArIDAuNSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIFRoaXMg
aXMgb25seSB1c2VkIHRvIGRyYXcgYm9yZGVycy4KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3
TGluZShjb25zdCBJbnRQb2ludCYgcG9pbnQxLCBjb25zdCBJbnRQb2ludCYgcG9pbnQyKQotewot
ICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFN0cm9r
ZVN0eWxlIHN0eWxlID0gc3Ryb2tlU3R5bGUoKTsKLSAgICBpZiAoc3R5bGUgPT0gTm9TdHJva2Up
Ci0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLSAgICBj
YWlyb19zYXZlKGNyKTsKLQotICAgIGZsb2F0IHdpZHRoID0gc3Ryb2tlVGhpY2tuZXNzKCk7Ci0g
ICAgaWYgKHdpZHRoIDwgMSkKLSAgICAgICAgd2lkdGggPSAxOwotCi0gICAgRmxvYXRQb2ludCBw
MSA9IHBvaW50MTsKLSAgICBGbG9hdFBvaW50IHAyID0gcG9pbnQyOwotICAgIGJvb2wgaXNWZXJ0
aWNhbExpbmUgPSAocDEueCgpID09IHAyLngoKSk7Ci0gCi0gICAgYWRqdXN0TGluZVRvUGl4ZWxC
b3VuZGFyaWVzKHAxLCBwMiwgd2lkdGgsIHN0eWxlKTsKLSAgICBjYWlyb19zZXRfbGluZV93aWR0
aChjciwgd2lkdGgpOwotCi0gICAgaW50IHBhdFdpZHRoID0gMDsKLSAgICBzd2l0Y2ggKHN0eWxl
KSB7Ci0gICAgY2FzZSBOb1N0cm9rZToKLSAgICBjYXNlIFNvbGlkU3Ryb2tlOgotICAgICAgICBi
cmVhazsKLSAgICBjYXNlIERvdHRlZFN0cm9rZToKLSAgICAgICAgcGF0V2lkdGggPSBzdGF0aWNf
Y2FzdDxpbnQ+KHdpZHRoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEYXNoZWRTdHJva2U6
Ci0gICAgICAgIHBhdFdpZHRoID0gMypzdGF0aWNfY2FzdDxpbnQ+KHdpZHRoKTsKLSAgICAgICAg
YnJlYWs7CisgICAgfkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpCisgICAgeworICAg
ICAgICBjYWlyb19kZXN0cm95KGNyKTsKICAgICB9CiAKLSAgICBzZXRDb2xvcihjciwgc3Ryb2tl
Q29sb3IoKSk7Ci0KLSAgICBjYWlyb19zZXRfYW50aWFsaWFzKGNyLCBDQUlST19BTlRJQUxJQVNf
Tk9ORSk7Ci0KLSAgICBpZiAocGF0V2lkdGgpIHsKLSAgICAgICAgLy8gRG8gYSByZWN0IGZpbGwg
b2Ygb3VyIGVuZHBvaW50cy4gIFRoaXMgZW5zdXJlcyB3ZSBhbHdheXMgaGF2ZSB0aGUKLSAgICAg
ICAgLy8gYXBwZWFyYW5jZSBvZiBiZWluZyBhIGJvcmRlci4gIFdlIHRoZW4gZHJhdyB0aGUgYWN0
dWFsIGRvdHRlZC9kYXNoZWQgbGluZS4KLSAgICAgICAgaWYgKGlzVmVydGljYWxMaW5lKSB7Ci0g
ICAgICAgICAgICBmaWxsUmVjdFNvdXJjZU92ZXIoY3IsIEZsb2F0UmVjdChwMS54KCkgLSB3aWR0
aC8yLCBwMS55KCkgLSB3aWR0aCwgd2lkdGgsIHdpZHRoKSwgc3Ryb2tlQ29sb3IoKSk7Ci0gICAg
ICAgICAgICBmaWxsUmVjdFNvdXJjZU92ZXIoY3IsIEZsb2F0UmVjdChwMi54KCkgLSB3aWR0aC8y
LCBwMi55KCksIHdpZHRoLCB3aWR0aCksIHN0cm9rZUNvbG9yKCkpOwotICAgICAgICB9IGVsc2Ug
ewotICAgICAgICAgICAgZmlsbFJlY3RTb3VyY2VPdmVyKGNyLCBGbG9hdFJlY3QocDEueCgpIC0g
d2lkdGgsIHAxLnkoKSAtIHdpZHRoLzIsIHdpZHRoLCB3aWR0aCksIHN0cm9rZUNvbG9yKCkpOwot
ICAgICAgICAgICAgZmlsbFJlY3RTb3VyY2VPdmVyKGNyLCBGbG9hdFJlY3QocDIueCgpLCBwMi55
KCkgLSB3aWR0aC8yLCB3aWR0aCwgd2lkdGgpLCBzdHJva2VDb2xvcigpKTsKLSAgICAgICAgfQot
Ci0gICAgICAgIC8vIEV4YW1wbGU6IDgwIHBpeGVscyB3aXRoIGEgd2lkdGggb2YgMzAgcGl4ZWxz
LgotICAgICAgICAvLyBSZW1haW5kZXIgaXMgMjAuICBUaGUgbWF4aW11bSBwaXhlbHMgb2YgbGlu
ZSB3ZSBjb3VsZCBwYWludAotICAgICAgICAvLyB3aWxsIGJlIDUwIHBpeGVscy4KLSAgICAgICAg
aW50IGRpc3RhbmNlID0gKGlzVmVydGljYWxMaW5lID8gKHBvaW50Mi55KCkgLSBwb2ludDEueSgp
KSA6IChwb2ludDIueCgpIC0gcG9pbnQxLngoKSkpIC0gMipzdGF0aWNfY2FzdDxpbnQ+KHdpZHRo
KTsKLSAgICAgICAgaW50IHJlbWFpbmRlciA9IGRpc3RhbmNlJXBhdFdpZHRoOwotICAgICAgICBp
bnQgY292ZXJhZ2UgPSBkaXN0YW5jZS1yZW1haW5kZXI7Ci0gICAgICAgIGludCBudW1TZWdtZW50
cyA9IGNvdmVyYWdlL3BhdFdpZHRoOwotCi0gICAgICAgIGZsb2F0IHBhdHRlcm5PZmZzZXQgPSAw
OwotICAgICAgICAvLyBTcGVjaWFsIGNhc2UgMXB4IGRvdHRlZCBib3JkZXJzIGZvciBzcGVlZC4K
LSAgICAgICAgaWYgKHBhdFdpZHRoID09IDEpCi0gICAgICAgICAgICBwYXR0ZXJuT2Zmc2V0ID0g
MS4wOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGJvb2wgZXZlbk51bWJlck9mU2VnbWVu
dHMgPSBudW1TZWdtZW50cyUyID09IDA7Ci0gICAgICAgICAgICBpZiAocmVtYWluZGVyKQotICAg
ICAgICAgICAgICAgIGV2ZW5OdW1iZXJPZlNlZ21lbnRzID0gIWV2ZW5OdW1iZXJPZlNlZ21lbnRz
OwotICAgICAgICAgICAgaWYgKGV2ZW5OdW1iZXJPZlNlZ21lbnRzKSB7Ci0gICAgICAgICAgICAg
ICAgaWYgKHJlbWFpbmRlcikgewotICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuT2Zmc2V0ICs9
IHBhdFdpZHRoIC0gcmVtYWluZGVyOwotICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuT2Zmc2V0
ICs9IHJlbWFpbmRlci8yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNl
Ci0gICAgICAgICAgICAgICAgICAgIHBhdHRlcm5PZmZzZXQgPSBwYXRXaWR0aC8yOwotICAgICAg
ICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIWV2ZW5OdW1iZXJPZlNlZ21lbnRzKSB7Ci0g
ICAgICAgICAgICAgICAgaWYgKHJlbWFpbmRlcikKLSAgICAgICAgICAgICAgICAgICAgcGF0dGVy
bk9mZnNldCA9IChwYXRXaWR0aCAtIHJlbWFpbmRlcikvMjsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgfQotCi0gICAgICAgIGRvdWJsZSBkYXNoID0gcGF0V2lkdGg7Ci0gICAgICAgIGNhaXJvX3Nl
dF9kYXNoKGNyLCAmZGFzaCwgMSwgcGF0dGVybk9mZnNldCk7Ci0gICAgfQotCi0gICAgY2Fpcm9f
bW92ZV90byhjciwgcDEueCgpLCBwMS55KCkpOwotICAgIGNhaXJvX2xpbmVfdG8oY3IsIHAyLngo
KSwgcDIueSgpKTsKLQotICAgIGNhaXJvX3N0cm9rZShjcik7Ci0gICAgY2Fpcm9fcmVzdG9yZShj
cik7Ci19Ci0KLS8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZCB0byBkcmF3IHRoZSBsaXR0bGUg
Y2lyY2xlcyB1c2VkIGluIGxpc3RzLgotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdFbGxpcHNl
KGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotICAgIGNhaXJv
X3NhdmUoY3IpOwotICAgIGZsb2F0IHlSYWRpdXMgPSAuNSAqIHJlY3QuaGVpZ2h0KCk7Ci0gICAg
ZmxvYXQgeFJhZGl1cyA9IC41ICogcmVjdC53aWR0aCgpOwotICAgIGNhaXJvX3RyYW5zbGF0ZShj
ciwgcmVjdC54KCkgKyB4UmFkaXVzLCByZWN0LnkoKSArIHlSYWRpdXMpOwotICAgIGNhaXJvX3Nj
YWxlKGNyLCB4UmFkaXVzLCB5UmFkaXVzKTsKLSAgICBjYWlyb19hcmMoY3IsIDAuLCAwLiwgMS4s
IDAuLCAyICogTV9QSSk7Ci0gICAgY2Fpcm9fcmVzdG9yZShjcik7Ci0KLSAgICBpZiAoZmlsbENv
bG9yKCkuYWxwaGEoKSkgewotICAgICAgICBzZXRDb2xvcihjciwgZmlsbENvbG9yKCkpOwotICAg
ICAgICBjYWlyb19maWxsX3ByZXNlcnZlKGNyKTsKLSAgICB9Ci0KLSAgICBpZiAoc3Ryb2tlU3R5
bGUoKSAhPSBOb1N0cm9rZSkgewotICAgICAgICBzZXRDb2xvcihjciwgc3Ryb2tlQ29sb3IoKSk7
Ci0gICAgICAgIGNhaXJvX3NldF9saW5lX3dpZHRoKGNyLCBzdHJva2VUaGlja25lc3MoKSk7Ci0g
ICAgICAgIGNhaXJvX3N0cm9rZShjcik7Ci0gICAgfQotCi0gICAgY2Fpcm9fbmV3X3BhdGgoY3Ip
OwotfQotCi0vLyBGSVhNRTogVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSBhZGp1c3RlZCB0byBt
YXRjaCB0aGUgZnVuY3Rpb25hbGl0eSBvbiB0aGUgTWFjIHNpZGUuCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDo6c3Ryb2tlQXJjKGNvbnN0IEludFJlY3QmIHJlY3QsIGludCBzdGFydEFuZ2xlLCBpbnQg
YW5nbGVTcGFuKQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIGlmIChzdHJva2VTdHlsZSgpID09IE5vU3Ryb2tlKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBpbnQgeCA9IHJlY3QueCgpOwotICAgIGludCB5ID0gcmVjdC55KCk7Ci0gICAgZmxv
YXQgdyA9IHJlY3Qud2lkdGgoKTsKLSNpZiAwIC8vIEZJWE1FOiB1bnVzZWQgc28gZmFyCi0gICAg
ZmxvYXQgaCA9IHJlY3QuaGVpZ2h0KCk7Ci0gICAgZmxvYXQgc2NhbGVGYWN0b3IgPSBoIC8gdzsK
LSAgICBmbG9hdCByZXZlcnNlU2NhbGVGYWN0b3IgPSB3IC8gaDsKLSNlbmRpZgotICAgIGZsb2F0
IHIgPSB3IC8gMjsKLSAgICBmbG9hdCBmYSA9IHN0YXJ0QW5nbGU7Ci0gICAgZmxvYXQgZmFsZW4g
PSAgZmEgKyBhbmdsZVNwYW47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAg
Y2Fpcm9fc2F2ZShjcik7Ci0gICAgY2Fpcm9fYXJjX25lZ2F0aXZlKGNyLCB4ICsgciwgeSArIHIs
IHIsIC1mYSAqIE1fUEkvMTgwLCAtZmFsZW4gKiBNX1BJLzE4MCk7Ci0gICAgc2V0Q29sb3IoY3Is
IHN0cm9rZUNvbG9yKCkpOwotICAgIGNhaXJvX3NldF9saW5lX3dpZHRoKGNyLCBzdHJva2VUaGlj
a25lc3MoKSk7Ci0gICAgY2Fpcm9fc3Ryb2tlKGNyKTsKLSAgICBjYWlyb19yZXN0b3JlKGNyKTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdDb252ZXhQb2x5Z29uKHNpemVfdCBucG9p
bnRzLCBjb25zdCBGbG9hdFBvaW50KiBwb2ludHMsIGJvb2wgc2hvdWxkQW50aWFsaWFzKQotewot
ICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChu
cG9pbnRzIDw9IDEpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRh
LT5jcjsKLQotICAgIGNhaXJvX3NhdmUoY3IpOwotICAgIGNhaXJvX3NldF9hbnRpYWxpYXMoY3Is
IHNob3VsZEFudGlhbGlhcyA/IENBSVJPX0FOVElBTElBU19ERUZBVUxUIDogQ0FJUk9fQU5USUFM
SUFTX05PTkUpOwotICAgIGNhaXJvX21vdmVfdG8oY3IsIHBvaW50c1swXS54KCksIHBvaW50c1sw
XS55KCkpOwotICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbnBvaW50czsgaSsrKQotICAgICAg
ICBjYWlyb19saW5lX3RvKGNyLCBwb2ludHNbaV0ueCgpLCBwb2ludHNbaV0ueSgpKTsKLSAgICBj
YWlyb19jbG9zZV9wYXRoKGNyKTsKLQotICAgIGlmIChmaWxsQ29sb3IoKS5hbHBoYSgpKSB7Ci0g
ICAgICAgIHNldENvbG9yKGNyLCBmaWxsQ29sb3IoKSk7Ci0gICAgICAgIGNhaXJvX3NldF9maWxs
X3J1bGUoY3IsIENBSVJPX0ZJTExfUlVMRV9FVkVOX09ERCk7Ci0gICAgICAgIGNhaXJvX2ZpbGxf
cHJlc2VydmUoY3IpOwotICAgIH0KLQotICAgIGlmIChzdHJva2VTdHlsZSgpICE9IE5vU3Ryb2tl
KSB7Ci0gICAgICAgIHNldENvbG9yKGNyLCBzdHJva2VDb2xvcigpKTsKLSAgICAgICAgY2Fpcm9f
c2V0X2xpbmVfd2lkdGgoY3IsIHN0cm9rZVRoaWNrbmVzcygpKTsKLSAgICAgICAgY2Fpcm9fc3Ry
b2tlKGNyKTsKLSAgICB9Ci0KLSAgICBjYWlyb19uZXdfcGF0aChjcik7Ci0gICAgY2Fpcm9fcmVz
dG9yZShjcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpmaWxsUmVjdChjb25zdCBJbnRS
ZWN0JiByZWN0LCBjb25zdCBDb2xvciYgY29sb3IpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJs
ZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKGNvbG9yLmFscGhhKCkpCi0gICAgICAg
IGZpbGxSZWN0U291cmNlT3ZlcihtX2RhdGEtPmNyLCByZWN0LCBjb2xvcik7Ci19Ci0KLXZvaWQg
R3JhcGhpY3NDb250ZXh0OjpmaWxsUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0IENv
bG9yJiBjb2xvcikKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBpZiAoY29sb3IuYWxwaGEoKSkKLSAgICAgICAgZmlsbFJlY3RTb3VyY2VPdmVy
KG1fZGF0YS0+Y3IsIHJlY3QsIGNvbG9yKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNs
aXAoY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fp
cm9fcmVjdGFuZ2xlKGNyLCByZWN0LngoKSwgcmVjdC55KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5o
ZWlnaHQoKSk7Ci0gICAgY2Fpcm9fZmlsbF9ydWxlX3Qgc2F2ZWRGaWxsUnVsZSA9IGNhaXJvX2dl
dF9maWxsX3J1bGUoY3IpOwotICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIENBSVJPX0ZJTExf
UlVMRV9XSU5ESU5HKTsKLSAgICBjYWlyb19jbGlwKGNyKTsKLSAgICBjYWlyb19zZXRfZmlsbF9y
dWxlKGNyLCBzYXZlZEZpbGxSdWxlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdG
b2N1c1JpbmcoY29uc3QgQ29sb3ImIGNvbG9yKQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVk
KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGludCByYWRpdXMgPSAoZm9jdXNSaW5nV2lkdGgo
KSAtIDEpIC8gMjsKLSAgICBpbnQgb2Zmc2V0ID0gcmFkaXVzICsgZm9jdXNSaW5nT2Zmc2V0KCk7
Ci0KLSAgICBjb25zdCBWZWN0b3I8SW50UmVjdD4mIHJlY3RzID0gZm9jdXNSaW5nUmVjdHMoKTsK
LSAgICB1bnNpZ25lZCByZWN0Q291bnQgPSByZWN0cy5zaXplKCk7Ci0gICAgSW50UmVjdCBmaW5h
bEZvY3VzUmVjdDsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcmVjdENvdW50OyBpKysp
IHsKLSAgICAgICAgSW50UmVjdCBmb2N1c1JlY3QgPSByZWN0c1tpXTsKLSAgICAgICAgZm9jdXNS
ZWN0LmluZmxhdGUob2Zmc2V0KTsKLSAgICAgICAgZmluYWxGb2N1c1JlY3QudW5pdGUoZm9jdXNS
ZWN0KTsKLSAgICB9Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9f
c2F2ZShjcik7Ci0gICAgLy8gRklYTUU6IFRoZXNlIHJlY3RzIHNob3VsZCBiZSByb3VuZGVkCi0g
ICAgY2Fpcm9fcmVjdGFuZ2xlKGNyLCBmaW5hbEZvY3VzUmVjdC54KCksIGZpbmFsRm9jdXNSZWN0
LnkoKSwgZmluYWxGb2N1c1JlY3Qud2lkdGgoKSwgZmluYWxGb2N1c1JlY3QuaGVpZ2h0KCkpOwot
Ci0gICAgLy8gRm9yY2UgdGhlIGFscGhhIHRvIDUwJS4gIFRoaXMgbWF0Y2hlcyB3aGF0IHRoZSBN
YWMgZG9lcyB3aXRoIG91dGxpbmUgcmluZ3MuCi0gICAgQ29sb3IgcmluZ0NvbG9yKGNvbG9yLnJl
ZCgpLCBjb2xvci5ncmVlbigpLCBjb2xvci5ibHVlKCksIDEyNyk7Ci0gICAgc2V0Q29sb3IoY3Is
IHJpbmdDb2xvcik7Ci0gICAgY2Fpcm9fc3Ryb2tlKGNyKTsKLSAgICBjYWlyb19yZXN0b3JlKGNy
KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yVGV4dChjb25zdCBJbnRQ
b2ludCYgb3JpZ2luLCBpbnQgd2lkdGgsIGJvb2wgcHJpbnRpbmcpCi17Ci0gICAgaWYgKHBhaW50
aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gVGhpcyBpcyBhIHdvcmth
cm91bmQgZm9yIGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NjU5Ci0g
ICAgU3Ryb2tlU3R5bGUgc2F2ZWRTdHJva2VTdHlsZSA9IHN0cm9rZVN0eWxlKCk7Ci0gICAgc2V0
U3Ryb2tlU3R5bGUoU29saWRTdHJva2UpOwotCi0gICAgSW50UG9pbnQgZW5kUG9pbnQgPSBvcmln
aW4gKyBJbnRTaXplKHdpZHRoLCAwKTsKLSAgICBkcmF3TGluZShvcmlnaW4sIGVuZFBvaW50KTsK
LQotICAgIHNldFN0cm9rZVN0eWxlKHNhdmVkU3Ryb2tlU3R5bGUpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JNaXNzcGVsbGluZ09yQmFkR3JhbW1hcihjb25zdCBJbnRQ
b2ludCYgb3JpZ2luLCBpbnQgd2lkdGgsIGJvb2wgZ3JhbW1hcikKLXsKLSAgICBpZiAocGFpbnRp
bmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSNpZiBQTEFURk9STShHVEspCi0gICAg
Y2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotICAgIGNhaXJvX3NhdmUoY3IpOwotCi0gICAgLy8g
Q29udmVudGlvbiBpcyBncmVlbiBmb3IgZ3JhbW1hciwgcmVkIGZvciBzcGVsbGluZwotICAgIC8v
IFRoZXNlIG5lZWQgdG8gYmVjb21lIGNvbmZpZ3VyYWJsZQotICAgIGlmIChncmFtbWFyKQotICAg
ICAgICBjYWlyb19zZXRfc291cmNlX3JnYihjciwgMCwgMSwgMCk7Ci0gICAgZWxzZQotICAgICAg
ICBjYWlyb19zZXRfc291cmNlX3JnYihjciwgMSwgMCwgMCk7Ci0KLSAgICAvLyBXZSBpZ25vcmUg
bW9zdCBvZiB0aGUgcHJvdmlkZWQgY29uc3RhbnRzIGluIGZhdm91ciBvZiB0aGUgcGxhdGZvcm0g
c3R5bGUKLSAgICBwYW5nb19jYWlyb19zaG93X2Vycm9yX3VuZGVybGluZShjciwgb3JpZ2luLngo
KSwgb3JpZ2luLnkoKSwgd2lkdGgsIGNNaXNzcGVsbGluZ0xpbmVUaGlja25lc3MpOwotCi0gICAg
Y2Fpcm9fcmVzdG9yZShjcik7Ci0jZWxzZQotICAgIG5vdEltcGxlbWVudGVkKCk7CisjaWYgUExB
VEZPUk0oV0lOKQorICAgIC8vIE9uIFdpbmRvd3MsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBIREMg
Zm9yIGZvcm0gY29udHJvbHMgdG8gZHJhdyBpbiB0aGUgcmlnaHQgcGxhY2UuCisgICAgdm9pZCBi
ZWdpblRyYW5zcGFyZW5jeUxheWVyKCkgeyBtX3RyYW5zcGFyZW5jeUNvdW50Kys7IH0KKyAgICB2
b2lkIGVuZFRyYW5zcGFyZW5jeUxheWVyKCkgeyBtX3RyYW5zcGFyZW5jeUNvdW50LS07IH0KICNl
bmRpZgotfQotCi1GbG9hdFJlY3QgR3JhcGhpY3NDb250ZXh0Ojpyb3VuZFRvRGV2aWNlUGl4ZWxz
KGNvbnN0IEZsb2F0UmVjdCYgZnJlY3QpCi17Ci0gICAgRmxvYXRSZWN0IHJlc3VsdDsKLSAgICBk
b3VibGUgeCA9IGZyZWN0LngoKTsKLSAgICBkb3VibGUgeSA9IGZyZWN0LnkoKTsKLSAgICBjYWly
b190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fdXNlcl90b19kZXZpY2UoY3IsICZ4LCAm
eSk7Ci0gICAgeCA9IHJvdW5kKHgpOwotICAgIHkgPSByb3VuZCh5KTsKLSAgICBjYWlyb19kZXZp
Y2VfdG9fdXNlcihjciwgJngsICZ5KTsKLSAgICByZXN1bHQuc2V0WChzdGF0aWNfY2FzdDxmbG9h
dD4oeCkpOwotICAgIHJlc3VsdC5zZXRZKHN0YXRpY19jYXN0PGZsb2F0Pih5KSk7Ci0gICAgeCA9
IGZyZWN0LndpZHRoKCk7Ci0gICAgeSA9IGZyZWN0LmhlaWdodCgpOwotICAgIGNhaXJvX3VzZXJf
dG9fZGV2aWNlX2Rpc3RhbmNlKGNyLCAmeCwgJnkpOwotICAgIHggPSByb3VuZCh4KTsKLSAgICB5
ID0gcm91bmQoeSk7Ci0gICAgY2Fpcm9fZGV2aWNlX3RvX3VzZXJfZGlzdGFuY2UoY3IsICZ4LCAm
eSk7Ci0gICAgcmVzdWx0LnNldFdpZHRoKHN0YXRpY19jYXN0PGZsb2F0Pih4KSk7Ci0gICAgcmVz
dWx0LnNldEhlaWdodChzdGF0aWNfY2FzdDxmbG9hdD4oeSkpOwotICAgIHJldHVybiByZXN1bHQ7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0Ojp0cmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSkK
LXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBj
YWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fdHJhbnNsYXRlKGNyLCB4LCB5KTsK
LX0KLQotSW50UG9pbnQgR3JhcGhpY3NDb250ZXh0OjpvcmlnaW4oKQotewotICAgIGNhaXJvX21h
dHJpeF90IG1hdHJpeDsKLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9f
Z2V0X21hdHJpeChjciwgJm1hdHJpeCk7Ci0gICAgcmV0dXJuIEludFBvaW50KHN0YXRpY19jYXN0
PGludD4obWF0cml4LngwKSwgc3RhdGljX2Nhc3Q8aW50PihtYXRyaXgueTApKTsKLX0KLQotdm9p
ZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtRmlsbENvbG9yKGNvbnN0IENvbG9yJiBjb2wp
Ci17Ci0gICAgLy8gRklYTUU6IHRoaXMgaXMgcHJvYmFibHkgYSBuby1vcCBidXQgSSdtIG5vdCBz
dXJlCi0gICAgLy8gbm90SW1wbGVtZW50ZWQoKTsgLy8gY29tbWVudGVkLW91dCBiZWNhdXNlIGl0
J3MgY2hhdHR5IGFuZCBjbHV0dGVycyBvdXRwdXQKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6
OnNldFBsYXRmb3JtU3Ryb2tlQ29sb3IoY29uc3QgQ29sb3ImIGNvbCkKLXsKLSAgICAvLyBGSVhN
RTogdGhpcyBpcyBwcm9iYWJseSBhIG5vLW9wIGJ1dCBJJ20gbm90IHN1cmUKLSAgICAvL25vdElt
cGxlbWVudGVkKCk7IC8vIGNvbW1lbnRlZC1vdXQgYmVjYXVzZSBpdCdzIGNoYXR0eSBhbmQgY2x1
dHRlcnMgb3V0cHV0Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVN0cm9r
ZVRoaWNrbmVzcyhmbG9hdCBzdHJva2VUaGlja25lc3MpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlz
YWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgobV9k
YXRhLT5jciwgc3Ryb2tlVGhpY2tuZXNzKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNl
dFBsYXRmb3JtU3Ryb2tlU3R5bGUoY29uc3QgU3Ryb2tlU3R5bGUmIHN0cm9rZVN0eWxlKQotewot
ICAgIHN0YXRpYyBkb3VibGUgZGFzaFBhdHRlcm5bXSA9IHs1LjAsIDUuMH07Ci0gICAgc3RhdGlj
IGRvdWJsZSBkb3RQYXR0ZXJuW10gPSB7MS4wLCAxLjB9OwotCi0gICAgaWYgKHBhaW50aW5nRGlz
YWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgc3dpdGNoIChzdHJva2VTdHlsZSkgewot
ICAgIGNhc2UgTm9TdHJva2U6Ci0gICAgICAgIC8vIEZJWE1FOiBpcyBpdCB0aGUgcmlnaHQgd2F5
IHRvIGVtdWxhdGUgTm9TdHJva2U/Ci0gICAgICAgIGNhaXJvX3NldF9saW5lX3dpZHRoKG1fZGF0
YS0+Y3IsIDApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFNvbGlkU3Ryb2tlOgotICAgICAg
ICBjYWlyb19zZXRfZGFzaChtX2RhdGEtPmNyLCAwLCAwLCAwKTsKLSAgICAgICAgYnJlYWs7Ci0g
ICAgY2FzZSBEb3R0ZWRTdHJva2U6Ci0gICAgICAgIGNhaXJvX3NldF9kYXNoKG1fZGF0YS0+Y3Is
IGRvdFBhdHRlcm4sIDIsIDApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERhc2hlZFN0cm9r
ZToKLSAgICAgICAgY2Fpcm9fc2V0X2Rhc2gobV9kYXRhLT5jciwgZGFzaFBhdHRlcm4sIDIsIDAp
OwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBub3RJbXBsZW1lbnRlZCgp
OwotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRV
UkxGb3JSZWN0KGNvbnN0IEtVUkwmIGxpbmssIGNvbnN0IEludFJlY3QmIGRlc3RSZWN0KQotewot
ICAgIG5vdEltcGxlbWVudGVkKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0Ojpjb25jYXRD
VE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFuc2Zvcm0pCi17Ci0gICAgaWYgKHBhaW50aW5n
RGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEt
PmNyOwotICAgIGNvbnN0IGNhaXJvX21hdHJpeF90KiBtYXRyaXggPSByZWludGVycHJldF9jYXN0
PGNvbnN0IGNhaXJvX21hdHJpeF90Kj4oJnRyYW5zZm9ybSk7Ci0gICAgY2Fpcm9fdHJhbnNmb3Jt
KGNyLCBtYXRyaXgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6YWRkSW5uZXJSb3VuZGVk
UmVjdENsaXAoY29uc3QgSW50UmVjdCYgcmVjdCwgaW50IHRoaWNrbmVzcykKLXsKLSAgICBpZiAo
cGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjbGlwKHJlY3QpOwot
Ci0gICAgUGF0aCBwOwotICAgIEZsb2F0UmVjdCByKHJlY3QpOwotICAgIC8vIEFkZCBvdXRlciBl
bGxpcHNlCi0gICAgcC5hZGRFbGxpcHNlKHIpOwotICAgIC8vIEFkZCBpbm5lciBlbGxpcHNlCi0g
ICAgci5pbmZsYXRlKC10aGlja25lc3MpOwotICAgIHAuYWRkRWxsaXBzZShyKTsKLSAgICBhZGRQ
YXRoKHApOwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotICAgIGNhaXJvX2ZpbGxf
cnVsZV90IHNhdmVkRmlsbFJ1bGUgPSBjYWlyb19nZXRfZmlsbF9ydWxlKGNyKTsKLSAgICBjYWly
b19zZXRfZmlsbF9ydWxlKGNyLCBDQUlST19GSUxMX1JVTEVfRVZFTl9PREQpOwotICAgIGNhaXJv
X2NsaXAoY3IpOwotICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIHNhdmVkRmlsbFJ1bGUpOwot
fQotCi0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRTaGFkb3coSW50U2l6ZSBjb25zdCYsIGlu
dCwgQ29sb3IgY29uc3QmKQotewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpjbGVhclNoYWRvdygpCi17Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmJlZ2luVHJhbnNwYXJlbmN5TGF5ZXIoZmxvYXQgb3Bh
Y2l0eSkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fcHVzaF9ncm91cChjcik7
Ci0gICAgbV9kYXRhLT5sYXllcnMuYXBwZW5kKG9wYWNpdHkpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDo6ZW5kVHJhbnNwYXJlbmN5TGF5ZXIoKQotewotICAgIGlmIChwYWludGluZ0Rpc2Fi
bGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsK
LQotICAgIGNhaXJvX3BvcF9ncm91cF90b19zb3VyY2UoY3IpOwotICAgIGNhaXJvX3BhaW50X3dp
dGhfYWxwaGEoY3IsIG1fZGF0YS0+bGF5ZXJzLmxhc3QoKSk7Ci0gICAgbV9kYXRhLT5sYXllcnMu
cmVtb3ZlTGFzdCgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xlYXJSZWN0KGNvbnN0
IEZsb2F0UmVjdCYgcmVjdCkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0KLSAgICBjYWlyb19z
YXZlKGNyKTsKLSAgICBjYWlyb19yZWN0YW5nbGUoY3IsIHJlY3QueCgpLCByZWN0LnkoKSwgcmVj
dC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKLSAgICBjYWlyb19zZXRfb3BlcmF0b3IoY3IsIENB
SVJPX09QRVJBVE9SX0NMRUFSKTsKLSAgICBjYWlyb19maWxsKGNyKTsKLSAgICBjYWlyb19yZXN0
b3JlKGNyKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnN0cm9rZVJlY3QoY29uc3QgRmxv
YXRSZWN0JiByZWN0LCBmbG9hdCB3aWR0aCkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgp
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAg
Y2Fpcm9fc2F2ZShjcik7Ci0gICAgY2Fpcm9fcmVjdGFuZ2xlKGNyLCByZWN0LngoKSwgcmVjdC55
KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7Ci0gICAgc2V0Q29sb3IoY3IsIHN0cm9r
ZUNvbG9yKCkpOwotICAgIGNhaXJvX3NldF9saW5lX3dpZHRoKGNyLCB3aWR0aCk7Ci0gICAgY2Fp
cm9fc3Ryb2tlKGNyKTsKLSAgICBjYWlyb19yZXN0b3JlKGNyKTsKLX0KLQotdm9pZCBHcmFwaGlj
c0NvbnRleHQ6OnNldExpbmVDYXAoTGluZUNhcCBsaW5lQ2FwKQotewotICAgIGlmIChwYWludGlu
Z0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX2xpbmVfY2FwX3QgY2Fp
cm9DYXAgPSBDQUlST19MSU5FX0NBUF9CVVRUOwotICAgIHN3aXRjaCAobGluZUNhcCkgewotICAg
ICAgICBjYXNlIEJ1dHRDYXA6Ci0gICAgICAgICAgICAvLyBuby1vcAotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIGNhc2UgUm91bmRDYXA6Ci0gICAgICAgICAgICBjYWlyb0NhcCA9IENBSVJP
X0xJTkVfQ0FQX1JPVU5EOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU3F1YXJl
Q2FwOgotICAgICAgICAgICAgY2Fpcm9DYXAgPSBDQUlST19MSU5FX0NBUF9TUVVBUkU7Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY2Fpcm9fc2V0X2xpbmVfY2FwKG1fZGF0YS0+Y3Is
IGNhaXJvQ2FwKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldExpbmVKb2luKExpbmVK
b2luIGxpbmVKb2luKQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIGNhaXJvX2xpbmVfam9pbl90IGNhaXJvSm9pbiA9IENBSVJPX0xJTkVfSk9J
Tl9NSVRFUjsKLSAgICBzd2l0Y2ggKGxpbmVKb2luKSB7Ci0gICAgICAgIGNhc2UgTWl0ZXJKb2lu
OgotICAgICAgICAgICAgLy8gbm8tb3AKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNl
IFJvdW5kSm9pbjoKLSAgICAgICAgICAgIGNhaXJvSm9pbiA9IENBSVJPX0xJTkVfSk9JTl9ST1VO
RDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJldmVsSm9pbjoKLSAgICAgICAg
ICAgIGNhaXJvSm9pbiA9IENBSVJPX0xJTkVfSk9JTl9CRVZFTDsKLSAgICAgICAgICAgIGJyZWFr
OwotICAgIH0KLSAgICBjYWlyb19zZXRfbGluZV9qb2luKG1fZGF0YS0+Y3IsIGNhaXJvSm9pbik7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRNaXRlckxpbWl0KGZsb2F0IG1pdGVyKQot
ewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNh
aXJvX3NldF9taXRlcl9saW1pdChtX2RhdGEtPmNyLCBtaXRlcik7Ci19Ci0KLXZvaWQgR3JhcGhp
Y3NDb250ZXh0OjpzZXRBbHBoYShmbG9hdCkKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotfQot
Ci1zdGF0aWMgaW5saW5lIGNhaXJvX29wZXJhdG9yX3QgdG9DYWlyb09wZXJhdG9yKENvbXBvc2l0
ZU9wZXJhdG9yIG9wKQotewotICAgIHN3aXRjaCAob3ApIHsKLSAgICAgICAgY2FzZSBDb21wb3Np
dGVDbGVhcjoKLSAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9DTEVBUjsKLSAgICAg
ICAgY2FzZSBDb21wb3NpdGVDb3B5OgotICAgICAgICAgICAgcmV0dXJuIENBSVJPX09QRVJBVE9S
X1NPVVJDRTsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VPdmVyOgotICAgICAgICAgICAg
cmV0dXJuIENBSVJPX09QRVJBVE9SX09WRVI7Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRlU291cmNl
SW46Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfSU47Ci0gICAgICAgIGNhc2Ug
Q29tcG9zaXRlU291cmNlT3V0OgotICAgICAgICAgICAgcmV0dXJuIENBSVJPX09QRVJBVE9SX09V
VDsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VBdG9wOgotICAgICAgICAgICAgcmV0dXJu
IENBSVJPX09QRVJBVE9SX0FUT1A7Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRlRGVzdGluYXRpb25P
dmVyOgotICAgICAgICAgICAgcmV0dXJuIENBSVJPX09QRVJBVE9SX0RFU1RfT1ZFUjsKLSAgICAg
ICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlvbkluOgotICAgICAgICAgICAgcmV0dXJuIENBSVJP
X09QRVJBVE9SX0RFU1RfSU47Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRlRGVzdGluYXRpb25PdXQ6
Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfREVTVF9PVVQ7Ci0gICAgICAgIGNh
c2UgQ29tcG9zaXRlRGVzdGluYXRpb25BdG9wOgotICAgICAgICAgICAgcmV0dXJuIENBSVJPX09Q
RVJBVE9SX0RFU1RfQVRPUDsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVYT1I6Ci0gICAgICAgICAg
ICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfWE9SOwotICAgICAgICBjYXNlIENvbXBvc2l0ZVBsdXNE
YXJrZXI6Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfU0FUVVJBVEU7Ci0gICAg
ICAgIGNhc2UgQ29tcG9zaXRlSGlnaGxpZ2h0OgotICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8g
Q2Fpcm8gZXF1aXZhbGVudCBmb3IgQ29tcG9zaXRlSGlnaGxpZ2h0LgotICAgICAgICAgICAgcmV0
dXJuIENBSVJPX09QRVJBVE9SX09WRVI7Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRlUGx1c0xpZ2h0
ZXI6Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfQUREOwotICAgICAgICBkZWZh
dWx0OgotICAgICAgICAgICAgcmV0dXJuIENBSVJPX09QRVJBVE9SX1NPVVJDRTsKLSAgICB9Ci19
CiAKLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRDb21wb3NpdGVPcGVyYXRpb24oQ29tcG9zaXRl
T3BlcmF0b3Igb3ApCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgY2Fpcm9fc2V0X29wZXJhdG9yKG1fZGF0YS0+Y3IsIHRvQ2Fpcm9PcGVyYXRv
cihvcCkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6YmVnaW5QYXRoKCkKLXsKLSAgICBp
ZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBj
ciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fbmV3X3BhdGgoY3IpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDo6YWRkUGF0aChjb25zdCBQYXRoJiBwYXRoKQotewotICAgIGlmIChwYWludGlu
Z0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRh
LT5jcjsKLSAgICBjYWlyb19wYXRoX3QqIHAgPSBjYWlyb19jb3B5X3BhdGgocGF0aC5wbGF0Zm9y
bVBhdGgoKS0+bV9jcik7Ci0gICAgY2Fpcm9fYXBwZW5kX3BhdGgoY3IsIHApOwotICAgIGNhaXJv
X3BhdGhfZGVzdHJveShwKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXAoY29uc3Qg
UGF0aCYgcGF0aCkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fcGF0aF90KiBw
ID0gY2Fpcm9fY29weV9wYXRoKHBhdGgucGxhdGZvcm1QYXRoKCktPm1fY3IpOwotICAgIGNhaXJv
X2FwcGVuZF9wYXRoKGNyLCBwKTsKLSAgICBjYWlyb19wYXRoX2Rlc3Ryb3kocCk7Ci0gICAgY2Fp
cm9fZmlsbF9ydWxlX3Qgc2F2ZWRGaWxsUnVsZSA9IGNhaXJvX2dldF9maWxsX3J1bGUoY3IpOwot
ICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIENBSVJPX0ZJTExfUlVMRV9XSU5ESU5HKTsKLSAg
ICBjYWlyb19jbGlwKGNyKTsKLSAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNyLCBzYXZlZEZpbGxS
dWxlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBPdXQoY29uc3QgUGF0aCYgcGF0
aCkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgZG91YmxlIHgxLCB5MSwgeDIsIHkyOwot
ICAgIGNhaXJvX2NsaXBfZXh0ZW50cyhjciwgJngxLCAmeTEsICZ4MiwgJnkyKTsKLSAgICBjYWly
b19yZWN0YW5nbGUoY3IsIHgxLCB5MSwgeDIgLSB4MSwgeTIgLSB5MSk7Ci0gICAgYWRkUGF0aChw
YXRoKTsKLQotICAgIGNhaXJvX2ZpbGxfcnVsZV90IHNhdmVkRmlsbFJ1bGUgPSBjYWlyb19nZXRf
ZmlsbF9ydWxlKGNyKTsKLSAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNyLCBDQUlST19GSUxMX1JV
TEVfRVZFTl9PREQpOwotICAgIGNhaXJvX2NsaXAoY3IpOwotICAgIGNhaXJvX3NldF9maWxsX3J1
bGUoY3IsIHNhdmVkRmlsbFJ1bGUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6cm90YXRl
KGZsb2F0IHJhZGlhbnMpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgY2Fpcm9fcm90YXRlKG1fZGF0YS0+Y3IsIHJhZGlhbnMpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDo6c2NhbGUoY29uc3QgRmxvYXRTaXplJiBzaXplKQotewotICAg
IGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3Nj
YWxlKG1fZGF0YS0+Y3IsIHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSk7Ci19Ci0KLXZvaWQg
R3JhcGhpY3NDb250ZXh0OjpjbGlwT3V0KGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgaWYgKHBh
aW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fdCogY3IgPSBt
X2RhdGEtPmNyOwotICAgIGRvdWJsZSB4MSwgeTEsIHgyLCB5MjsKLSAgICBjYWlyb19jbGlwX2V4
dGVudHMoY3IsICZ4MSwgJnkxLCAmeDIsICZ5Mik7Ci0gICAgY2Fpcm9fcmVjdGFuZ2xlKGNyLCB4
MSwgeDIsIHgyIC0geDEsIHkyIC0geTEpOwotICAgIGNhaXJvX3JlY3RhbmdsZShjciwgci54KCks
IHIueSgpLCByLndpZHRoKCksIHIuaGVpZ2h0KCkpOwotICAgIGNhaXJvX2ZpbGxfcnVsZV90IHNh
dmVkRmlsbFJ1bGUgPSBjYWlyb19nZXRfZmlsbF9ydWxlKGNyKTsKLSAgICBjYWlyb19zZXRfZmls
bF9ydWxlKGNyLCBDQUlST19GSUxMX1JVTEVfRVZFTl9PREQpOwotICAgIGNhaXJvX2NsaXAoY3Ip
OwotICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIHNhdmVkRmlsbFJ1bGUpOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDo6Y2xpcE91dEVsbGlwc2VJblJlY3QoY29uc3QgSW50UmVjdCYgcikK
LXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBQ
YXRoIHA7Ci0gICAgcC5hZGRFbGxpcHNlKHIpOwotICAgIGNsaXBPdXQocCk7Ci19Ci0KLXZvaWQg
R3JhcGhpY3NDb250ZXh0OjpmaWxsUm91bmRlZFJlY3QoY29uc3QgSW50UmVjdCYgciwgY29uc3Qg
SW50U2l6ZSYgdG9wTGVmdCwgY29uc3QgSW50U2l6ZSYgdG9wUmlnaHQsIGNvbnN0IEludFNpemUm
IGJvdHRvbUxlZnQsIGNvbnN0IEludFNpemUmIGJvdHRvbVJpZ2h0LCBjb25zdCBDb2xvciYgY29s
b3IpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotICAgIGNhaXJvX3NhdmUoY3IpOwotICAgIGJl
Z2luUGF0aCgpOwotICAgIGFkZFBhdGgoUGF0aDo6Y3JlYXRlUm91bmRlZFJlY3RhbmdsZShyLCB0
b3BMZWZ0LCB0b3BSaWdodCwgYm90dG9tTGVmdCwgYm90dG9tUmlnaHQpKTsKLSAgICBzZXRDb2xv
cihjciwgY29sb3IpOwotICAgIGNhaXJvX2ZpbGwoY3IpOwotICAgIGNhaXJvX3Jlc3RvcmUoY3Ip
OwotfQorICAgIGNhaXJvX3QqIGNyOworICAgIFZlY3RvcjxmbG9hdD4gbGF5ZXJzOwogCiAjaWYg
UExBVEZPUk0oR1RLKQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldEdka0V4cG9zZUV2ZW50KEdk
a0V2ZW50RXhwb3NlKiBleHBvc2UpCi17Ci0gICAgbV9kYXRhLT5leHBvc2UgPSBleHBvc2U7Ci19
Ci0KLUdka0V2ZW50RXhwb3NlKiBHcmFwaGljc0NvbnRleHQ6Omdka0V4cG9zZUV2ZW50KCkgY29u
c3QKLXsKLSAgICByZXR1cm4gbV9kYXRhLT5leHBvc2U7Ci19Ci0KLUdka0RyYXdhYmxlKiBHcmFw
aGljc0NvbnRleHQ6Omdka0RyYXdhYmxlKCkgY29uc3QKLXsKLSAgICBpZiAoIW1fZGF0YS0+ZXhw
b3NlKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiBHREtfRFJBV0FCTEUobV9kYXRh
LT5leHBvc2UtPndpbmRvdyk7Ci19Ci0KLUludFBvaW50IEdyYXBoaWNzQ29udGV4dDo6dHJhbnNs
YXRlUG9pbnQoY29uc3QgSW50UG9pbnQmIHBvaW50KSBjb25zdAotewotICAgIGNhaXJvX21hdHJp
eF90IHRtOwotICAgIGNhaXJvX2dldF9tYXRyaXgobV9kYXRhLT5jciwgJnRtKTsKLSAgICBkb3Vi
bGUgeCA9IHBvaW50LngoKTsKLSAgICBkb3VibGUgeSA9IHBvaW50LnkoKTsKLQotICAgIGNhaXJv
X21hdHJpeF90cmFuc2Zvcm1fcG9pbnQoJnRtLCAmeCwgJnkpOwotICAgIHJldHVybiBJbnRQb2lu
dCh4LCB5KTsKLX0KKyAgICBHZGtFdmVudEV4cG9zZSogZXhwb3NlOworI2VsaWYgUExBVEZPUk0o
V0lOKQorICAgIEhEQyBtX2hkYzsKKyAgICB1bnNpZ25lZCBtX3RyYW5zcGFyZW5jeUNvdW50Owog
I2VuZGlmCi0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRVc2VBbnRpYWxpYXNpbmcoYm9vbCBl
bmFibGUpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgLy8gV2hlbiB0cnVlLCB1c2UgdGhlIGRlZmF1bHQgQ2Fpcm8gYmFja2VuZCBhbnRpYWxp
YXMgbW9kZSAodXN1YWxseSB0aGlzCi0gICAgLy8gZW5hYmxlcyBzdGFuZGFyZCAnZ3JheXNjYWxl
JyBhbnRpYWxpYXNpbmcpOyBmYWxzZSB0byBleHBsaWNpdGx5IGRpc2FibGUKLSAgICAvLyBhbnRp
YWxpYXNpbmcuIFRoaXMgaXMgdGhlIHNhbWUgc3RyYXRlZ3kgYXMgdXNlZCBpbiBkcmF3Q29udmV4
UG9seWdvbigpLgotICAgIGNhaXJvX3NldF9hbnRpYWxpYXMobV9kYXRhLT5jciwgZW5hYmxlID8g
Q0FJUk9fQU5USUFMSUFTX0RFRkFVTFQgOiBDQUlST19BTlRJQUxJQVNfTk9ORSk7Ci19Cit9Owog
CiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0ZvbnRDR1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW4vRm9udENHV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCShmcm9tIFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRXaW4uY3BwOjI5ODM0KQorKysgV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vRm9udENHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDIy
NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRm9u
dC5oIgorCisjaW5jbHVkZSAiRm9udEZhbGxiYWNrTGlzdC5oIgorI2luY2x1ZGUgIkdseXBoQnVm
ZmVyLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiSW50UmVjdC5o
IgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiU2ltcGxlRm9udERhdGEu
aCIKKyNpbmNsdWRlICJVbmlzY3JpYmVDb250cm9sbGVyLmgiCisjaW5jbHVkZSA8QXBwbGljYXRp
b25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CisjaW5jbHVkZSA8V2ViS2l0U3lzdGVt
SW50ZXJmYWNlL1dlYktpdFN5c3RlbUludGVyZmFjZS5oPgorI2luY2x1ZGUgPHd0Zi9NYXRoRXh0
cmFzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY29uc3QgaW50IHN5bnRoZXRpY09ibGlx
dWVBbmdsZSA9IDE0OworCit2b2lkIEZvbnQ6OmRyYXdHbHlwaHMoR3JhcGhpY3NDb250ZXh0KiBn
cmFwaGljc0NvbnRleHQsIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250LCBjb25zdCBHbHlwaEJ1
ZmZlciYgZ2x5cGhCdWZmZXIsIAorICAgICAgICAgICAgICAgICAgICAgIGludCBmcm9tLCBpbnQg
bnVtR2x5cGhzLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAgICBpZiAoZm9u
dC0+bV9mb250LnVzZUdESSgpKSB7CisgICAgICAgIC8vIEZJWE1FOiBTdXBwb3J0IGFscGhhIGJs
ZW5kaW5nLgorICAgICAgICAvLyBGSVhNRTogU3VwcG9ydCB0ZXh0IHN0cm9rZS9maWxsLgorICAg
ICAgICAvLyBGSVhNRTogU3VwcG9ydCB0ZXh0IHNoYWRvdy4KKyAgICAgICAgQ29sb3IgZmlsbENv
bG9yID0gZ3JhcGhpY3NDb250ZXh0LT5maWxsQ29sb3IoKTsKKyAgICAgICAgaWYgKGZpbGxDb2xv
ci5hbHBoYSgpID09IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gV2UgaGF2
ZSB0byBjb252ZXJ0IENHJ3MgdHdvLWRpbWVuc2lvbmFsIGZsb2F0aW5nIHBvaW50IGFkdmFuY2Vz
IHRvIGp1c3QgaG9yaXpvbnRhbCBpbnRlZ2VyIGFkdmFuY2VzLgorICAgICAgICBWZWN0b3I8aW50
LCAyMDQ4PiBnZGlBZHZhbmNlczsKKyAgICAgICAgaW50IHRvdGFsV2lkdGggPSAwOworICAgICAg
ICBmb3IgKGludCBpID0gMDsgaSA8IG51bUdseXBoczsgaSsrKSB7CisgICAgICAgICAgICBnZGlB
ZHZhbmNlcy5hcHBlbmQobHJvdW5kZihnbHlwaEJ1ZmZlci5hZHZhbmNlQXQoZnJvbSArIGkpKSk7
CisgICAgICAgICAgICB0b3RhbFdpZHRoICs9IGdkaUFkdmFuY2VzW2ldOworICAgICAgICB9CisK
KyAgICAgICAgLy8gV2UgcHV0IHNsb3AgaW50byB0aGlzIHJlY3QsIHNpbmNlIGdseXBocyBjYW4g
b3ZlcmZsb3cgdGhlIGFzY2VudC9kZXNjZW50IGJvdW5kcyBhbmQgdGhlIGxlZnQvcmlnaHQgZWRn
ZXMuCisgICAgICAgIGludCBsaW5lR2FwID0gZm9udC0+bGluZUdhcCgpOworICAgICAgICBJbnRS
ZWN0IHRleHRSZWN0KHBvaW50LngoKSAtIGxpbmVHYXAsIHBvaW50LnkoKSAtIGZvbnQtPmFzY2Vu
dCgpIC0gbGluZUdhcCwgdG90YWxXaWR0aCArIDIgKiBsaW5lR2FwLCBmb250LT5saW5lU3BhY2lu
ZygpKTsKKyAgICAgICAgSERDIGhkYyA9IGdyYXBoaWNzQ29udGV4dC0+Z2V0V2luZG93c0NvbnRl
eHQodGV4dFJlY3QpOworICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBmb250LT5tX2ZvbnQuaGZv
bnQoKSk7CisKKyAgICAgICAgLy8gU2V0IHRoZSBjb3JyZWN0IGNvbG9yLgorICAgICAgICBIREMg
dGV4dERyYXdpbmdEQyA9IGhkYzsKKyAgICAgICAgLyppZiAoZmlsbENvbG9yLmhhc0FscGhhKCkg
fHwgZ3JhcGhpY3NDb250ZXh0LT5pblRyYW5zcGFyZW5jeUxheWVyKCkpIHsKKyAgICAgICAgICAg
IC8vIEdESSBjYW4ndCBoYW5kbGUgZHJhd2luZyB0cmFuc3BhcmVudCB0ZXh0LiAgV2UgaGF2ZSB0
byBkcmF3IGludG8gYSBtYXNrLiAgV2UgZHJhdyBibGFjayB0ZXh0IG9uIGEgd2hpdGUtZmlsbGVk
IGJhY2tncm91bmQuCisgICAgICAgICAgICAvLyBXZSBhbHNvIGRvIHRoaXMgd2hlbiBpbnNpZGUg
dHJhbnNwYXJlbmN5IGxheWVycywgc2luY2UgR0RJIGFsc28gY2FuJ3QgZHJhdyBvbnRvIGEgc3Vy
ZmFjZSB3aXRoIGFscGhhLgorICAgICAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5zYXZlKCk7Cisg
ICAgICAgICAgICBncmFwaGljc0NvbnRleHQtPnNldEZpbGxDb2xvcihDb2xvcjo6d2hpdGUpOwor
ICAgICAgICAgICAgdGV4dERyYXdpbmdEQyA9IGdyYXBoaWNzQ29udGV4dC0+Z2V0V2luZG93c0Jp
dG1hcENvbnRleHQodGV4dFJlY3QpOworICAgICAgICAgICAgU2V0VGV4dENvbG9yKGhkYywgUkdC
KDAsIDAsIDApKTsKKyAgICAgICAgfSBlbHNlKi8KKyAgICAgICAgICAgIFNldFRleHRDb2xvciho
ZGMsIFJHQihmaWxsQ29sb3IucmVkKCksIGZpbGxDb2xvci5ncmVlbigpLCBmaWxsQ29sb3IuYmx1
ZSgpKSk7CisKKyAgICAgICAgU2V0QmtNb2RlKGhkYywgVFJBTlNQQVJFTlQpOworICAgICAgICBT
ZXRUZXh0QWxpZ24oaGRjLCBUQV9MRUZUIHwgVEFfQkFTRUxJTkUpOworCisgICAgICAgIC8vIFVu
aXNjcmliZSBnaXZlcyB1cyBvZmZzZXRzIHRvIGhlbHAgcmVmaW5lIHRoZSBwb3NpdGlvbmluZyBv
ZiBjb21iaW5pbmcgZ2x5cGhzLgorICAgICAgICBGbG9hdFNpemUgdHJhbnNsYXRpb24gPSBnbHlw
aEJ1ZmZlci5vZmZzZXRBdChmcm9tKTsKKyAgICAgICAgaWYgKHRyYW5zbGF0aW9uLndpZHRoKCkg
fHwgdHJhbnNsYXRpb24uaGVpZ2h0KCkpIHsKKyAgICAgICAgICAgIFhGT1JNIHhmb3JtOworICAg
ICAgICAgICAgeGZvcm0uZU0xMSA9IDEuMDsKKyAgICAgICAgICAgIHhmb3JtLmVNMTIgPSAwOwor
ICAgICAgICAgICAgeGZvcm0uZU0yMSA9IDA7CisgICAgICAgICAgICB4Zm9ybS5lTTIyID0gMS4w
OworICAgICAgICAgICAgeGZvcm0uZUR4ID0gdHJhbnNsYXRpb24ud2lkdGgoKTsKKyAgICAgICAg
ICAgIHhmb3JtLmVEeSA9IHRyYW5zbGF0aW9uLmhlaWdodCgpOworICAgICAgICAgICAgTW9kaWZ5
V29ybGRUcmFuc2Zvcm0oaGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOworICAgICAgICB9
CisgICAgICAgIEV4dFRleHRPdXQoaGRjLCBwb2ludC54KCksIHBvaW50LnkoKSwgRVRPX0dMWVBI
X0lOREVYLCAwLCAoV0NIQVIqKWdseXBoQnVmZmVyLmdseXBocyhmcm9tKSwgbnVtR2x5cGhzLCBn
ZGlBZHZhbmNlcy5kYXRhKCkpOworCisgICAgICAgIC8qaWYgKGZpbGxDb2xvci5oYXNBbHBoYSgp
IHx8IGdyYXBoaWNzQ29udGV4dC0+aW5UcmFuc3BhcmVuY3lMYXllcigpKSB7CisgICAgICAgICAg
ICAvLyBUT0RPRDogV2UgaGF2ZSB0byB3YWxrIHRoZSBiaXRzIG9mIHRoZSBiaXRtYXAgYW5kIGlu
dmVydCB0aGVtLiAgV2UgYWxzbyBjb3B5IG92ZXIgdGhlIGdyZWVuIGNvbXBvbmVudCB2YWx1ZSBp
bnRvIHRoZSBhbHBoYSB2YWx1ZQorICAgICAgICAgICAgLy8gdG8ga2VlcCBDbGVhclR5cGUgbG9v
a2luZyByZWFzb25hYmxlLgorCisgICAgICAgICAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGRyYXdu
IHRoZSB0ZXh0IGludG8gYSBiaXRtYXAgYW5kIGludmVydGVkIGl0LCBvYnRhaW4gYSBDR0ltYWdl
UmVmIG1hc2suCisgICAgICAgICAgICBDR0ltYWdlUmVmIG1hc2sgPSBncmFwaGljc0NvbnRleHQt
PnJlbGVhc2VXaW5kb3dzQml0bWFwQ29udGV4dEludG9NYXNrKHRleHREcmF3aW5nREMsIHRleHRS
ZWN0KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gQXBwbHkgdGhlIG1hc2sgdG8gdGhl
IGZpbGwgY29sb3IuCisgICAgICAgICAgICBDR0NvbnRleHRSZWYgYml0bWFwQ29udGV4dCA9IGdy
YXBoaWNzQ29udGV4dC0+Z2V0V2luZG93c0NvbXBhdGlibGVDR0JpdG1hcENvbnRleHQodGV4dFJl
Y3Quc2l6ZSgpKTsKKyAgICAgICAgICAgIENHRmxvYXQgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGE7
CisgICAgICAgICAgICBjb2xvci5nZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAg
ICAgICAgICAgIENHQ29udGV4dFNldFJHQkZpbGxDb2xvcihjb250ZXh0LCByZWQsIGdyZWVuLCBi
bHVlLCBhbHBoYSk7CisgICAgICAgICAgICBDR0NvbnRleHRGaWxsUmVjdChiaXRtYXBDb250ZXh0
LCBJbnRSZWN0KDAsIDAsIHRleHRSZWN0LndpZHRoKCksIHRleHRSZWN0LmhlaWdodCgpKSk7Cisg
ICAgICAgICAgICBDR0ltYWdlUmVmIGZpbGxDb2xvckltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3Jl
YXRlSW1hZ2UoYml0bWFwQ29udGV4dCk7CisgICAgICAgIAorICAgICAgICAgICAgLy8gQXBwbHkg
dGhlIG1hc2suCisgICAgICAgICAgICBDR0ltYWdlUmVmIGZpbmFsSW1hZ2UgPSBDR0ltYWdlQ3Jl
YXRlV2l0aE1hc2soZmlsbENvbG9ySW1hZ2UsIG1hc2spOworCisgICAgICAgICAgICAvLyBUaGUg
Yml0bWFwIGltYWdlIG5lZWRzIHRvIGJlIGRyYXduIGludG8gdGhlIEhEQy4KKyAgICAgICAgICAg
IGdyYXBoaWNzQ29udGV4dC0+ZHJhd0ltYWdlSW50b1dpbmRvd3NDb250ZXh0KGhkYywgZmluYWxJ
bWFnZSk7CisKKyAgICAgICAgICAgIC8vIFJlbGVhc2Ugb3VyIGltYWdlcyBhbmQgY29udGV4dHMu
CisgICAgICAgICAgICBDR0ltYWdlUmVsZWFzZShtYXNrKTsKKyAgICAgICAgICAgIENHSW1hZ2VS
ZWxlYXNlKGZpbGxDb2xvckltYWdlKTsKKyAgICAgICAgICAgIENHSW1hZ2VSZWxlYXNlKGZpbmFs
SW1hZ2UpOworICAgICAgICAgICAgQ0dDb250ZXh0UmVsZWFzZShiaXRtYXBDb250ZXh0KTsKKyAg
ICAgICAgfSovCisKKyAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5yZWxlYXNlV2luZG93c0NvbnRl
eHQoaGRjLCB0ZXh0UmVjdCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDR0NvbnRl
eHRSZWYgY2dDb250ZXh0ID0gZ3JhcGhpY3NDb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKKwor
ICAgIHVpbnQzMl90IG9sZEZvbnRTbW9vdGhpbmdTdHlsZSA9IHdrU2V0Rm9udFNtb290aGluZ1N0
eWxlKGNnQ29udGV4dCk7CisKKyAgICBjb25zdCBGb250UGxhdGZvcm1EYXRhJiBwbGF0Zm9ybURh
dGEgPSBmb250LT5wbGF0Zm9ybURhdGEoKTsKKworICAgIENHQ29udGV4dFNldEZvbnQoY2dDb250
ZXh0LCBwbGF0Zm9ybURhdGEuY2dGb250KCkpOworCisgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbWF0
cml4ID0gQ0dBZmZpbmVUcmFuc2Zvcm1JZGVudGl0eTsKKyAgICBtYXRyaXguYiA9IC1tYXRyaXgu
YjsKKyAgICBtYXRyaXguZCA9IC1tYXRyaXguZDsKKworICAgIGlmIChwbGF0Zm9ybURhdGEuc3lu
dGhldGljT2JsaXF1ZSgpKQorICAgIHsKKyAgICAgICAgc3RhdGljIGZsb2F0IHNrZXcgPSAtdGFu
ZihzeW50aGV0aWNPYmxpcXVlQW5nbGUgKiBhY29zZigwKSAvIDkwKTsKKyAgICAgICAgbWF0cml4
ID0gQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXQobWF0cml4LCBDR0FmZmluZVRyYW5zZm9ybU1ha2Uo
MSwgMCwgc2tldywgMSwgMCwgMCkpOworICAgIH0KKworICAgIC8vIFVuaXNjcmliZSBnaXZlcyB1
cyBvZmZzZXRzIHRvIGhlbHAgcmVmaW5lIHRoZSBwb3NpdGlvbmluZyBvZiBjb21iaW5pbmcgZ2x5
cGhzLgorICAgIEZsb2F0U2l6ZSB0cmFuc2xhdGlvbiA9IGdseXBoQnVmZmVyLm9mZnNldEF0KGZy
b20pOworICAgIGlmICh0cmFuc2xhdGlvbi53aWR0aCgpIHx8IHRyYW5zbGF0aW9uLmhlaWdodCgp
KQorICAgICAgICBDR0FmZmluZVRyYW5zZm9ybVRyYW5zbGF0ZShtYXRyaXgsIHRyYW5zbGF0aW9u
LndpZHRoKCksIHRyYW5zbGF0aW9uLmhlaWdodCgpKTsKKyAgICAKKyAgICBDR0NvbnRleHRTZXRU
ZXh0TWF0cml4KGNnQ29udGV4dCwgbWF0cml4KTsKKworICAgIENHQ29udGV4dFNldEZvbnRTaXpl
KGNnQ29udGV4dCwgcGxhdGZvcm1EYXRhLnNpemUoKSk7CisgICAgQ0dDb250ZXh0U2V0VGV4dFBv
c2l0aW9uKGNnQ29udGV4dCwgcG9pbnQueCgpLCBwb2ludC55KCkpOworICAgIENHQ29udGV4dFNo
b3dHbHlwaHNXaXRoQWR2YW5jZXMoY2dDb250ZXh0LCBnbHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSks
IGdseXBoQnVmZmVyLmFkdmFuY2VzKGZyb20pLCBudW1HbHlwaHMpOworICAgIGlmIChmb250LT5t
X3N5bnRoZXRpY0JvbGRPZmZzZXQpIHsKKyAgICAgICAgQ0dDb250ZXh0U2V0VGV4dFBvc2l0aW9u
KGNnQ29udGV4dCwgcG9pbnQueCgpICsgZm9udC0+bV9zeW50aGV0aWNCb2xkT2Zmc2V0LCBwb2lu
dC55KCkpOworICAgICAgICBDR0NvbnRleHRTaG93R2x5cGhzV2l0aEFkdmFuY2VzKGNnQ29udGV4
dCwgZ2x5cGhCdWZmZXIuZ2x5cGhzKGZyb20pLCBnbHlwaEJ1ZmZlci5hZHZhbmNlcyhmcm9tKSwg
bnVtR2x5cGhzKTsKKyAgICB9CisKKyAgICB3a1Jlc3RvcmVGb250U21vb3RoaW5nU3R5bGUoY2dD
b250ZXh0LCBvbGRGb250U21vb3RoaW5nU3R5bGUpOworfQorCitGbG9hdFJlY3QgRm9udDo6c2Vs
ZWN0aW9uUmVjdEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgSW50UG9p
bnQmIHBvaW50LCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaW50IGZyb20sIGludCB0bykgY29uc3QKK3sKKyAgICBVbmlzY3JpYmVDb250cm9sbGVy
IGl0KHRoaXMsIHJ1bik7CisgICAgaXQuYWR2YW5jZShmcm9tKTsKKyAgICBmbG9hdCBiZWZvcmVX
aWR0aCA9IGl0LnJ1bldpZHRoU29GYXIoKTsKKyAgICBpdC5hZHZhbmNlKHRvKTsKKyAgICBmbG9h
dCBhZnRlcldpZHRoID0gaXQucnVuV2lkdGhTb0ZhcigpOworCisgICAgLy8gVXNpbmcgcm91bmRm
KCkgcmF0aGVyIHRoYW4gY2VpbGYoKSBmb3IgdGhlIHJpZ2h0IGVkZ2UgYXMgYSBjb21wcm9taXNl
IHRvIGVuc3VyZSBjb3JyZWN0IGNhcmV0IHBvc2l0aW9uaW5nCisgICAgaWYgKHJ1bi5ydGwoKSkg
eworICAgICAgICBpdC5hZHZhbmNlKHJ1bi5sZW5ndGgoKSk7CisgICAgICAgIGZsb2F0IHRvdGFs
V2lkdGggPSBpdC5ydW5XaWR0aFNvRmFyKCk7CisgICAgICAgIHJldHVybiBGbG9hdFJlY3QocG9p
bnQueCgpICsgZmxvb3JmKHRvdGFsV2lkdGggLSBhZnRlcldpZHRoKSwgcG9pbnQueSgpLCByb3Vu
ZGYodG90YWxXaWR0aCAtIGJlZm9yZVdpZHRoKSAtIGZsb29yZih0b3RhbFdpZHRoIC0gYWZ0ZXJX
aWR0aCksIGgpOworICAgIH0gCisgICAgCisgICAgcmV0dXJuIEZsb2F0UmVjdChwb2ludC54KCkg
KyBmbG9vcmYoYmVmb3JlV2lkdGgpLCBwb2ludC55KCksIHJvdW5kZihhZnRlcldpZHRoKSAtIGZs
b29yZihiZWZvcmVXaWR0aCksIGgpOworfQorCit2b2lkIEZvbnQ6OmRyYXdDb21wbGV4VGV4dChH
cmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQ
b2ludCYgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IHRv
KSBjb25zdAoreworICAgIC8vIFRoaXMgZ2x5cGggYnVmZmVyIGhvbGRzIG91ciBnbHlwaHMgKyBh
ZHZhbmNlcyArIGZvbnQgZGF0YSBmb3IgZWFjaCBnbHlwaC4KKyAgICBHbHlwaEJ1ZmZlciBnbHlw
aEJ1ZmZlcjsKKworICAgIGZsb2F0IHN0YXJ0WCA9IHBvaW50LngoKTsKKyAgICBVbmlzY3JpYmVD
b250cm9sbGVyIGNvbnRyb2xsZXIodGhpcywgcnVuKTsKKyAgICBjb250cm9sbGVyLmFkdmFuY2Uo
ZnJvbSk7CisgICAgZmxvYXQgYmVmb3JlV2lkdGggPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIo
KTsKKyAgICBjb250cm9sbGVyLmFkdmFuY2UodG8sICZnbHlwaEJ1ZmZlcik7CisgICAgCisgICAg
Ly8gV2UgY291bGRuJ3QgZ2VuZXJhdGUgYW55IGdseXBocyBmb3IgdGhlIHJ1bi4gIEdpdmUgdXAu
CisgICAgaWYgKGdseXBoQnVmZmVyLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworICAgIAor
ICAgIGZsb2F0IGFmdGVyV2lkdGggPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKTsKKworICAg
IGlmIChydW4ucnRsKCkpIHsKKyAgICAgICAgY29udHJvbGxlci5hZHZhbmNlKHJ1bi5sZW5ndGgo
KSk7CisgICAgICAgIHN0YXJ0WCArPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKSAtIGFmdGVy
V2lkdGg7CisgICAgfSBlbHNlCisgICAgICAgIHN0YXJ0WCArPSBiZWZvcmVXaWR0aDsKKworICAg
IC8vIERyYXcgdGhlIGdseXBoIGJ1ZmZlciBub3cgYXQgdGhlIHN0YXJ0aW5nIHBvaW50IHJldHVy
bmVkIGluIHN0YXJ0WC4KKyAgICBGbG9hdFBvaW50IHN0YXJ0UG9pbnQoc3RhcnRYLCBwb2ludC55
KCkpOworICAgIGRyYXdHbHlwaEJ1ZmZlcihjb250ZXh0LCBnbHlwaEJ1ZmZlciwgcnVuLCBzdGFy
dFBvaW50KTsKK30KKworZmxvYXQgRm9udDo6ZmxvYXRXaWR0aEZvckNvbXBsZXhUZXh0KGNvbnN0
IFRleHRSdW4mIHJ1bikgY29uc3QKK3sKKyAgICBVbmlzY3JpYmVDb250cm9sbGVyIGNvbnRyb2xs
ZXIodGhpcywgcnVuKTsKKyAgICBjb250cm9sbGVyLmFkdmFuY2UocnVuLmxlbmd0aCgpKTsKKyAg
ICByZXR1cm4gY29udHJvbGxlci5ydW5XaWR0aFNvRmFyKCk7Cit9CisKK2ludCBGb250OjpvZmZz
ZXRGb3JQb3NpdGlvbkZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgaW50IHgsIGJv
b2wgaW5jbHVkZVBhcnRpYWxHbHlwaHMpIGNvbnN0Cit7CisgICAgVW5pc2NyaWJlQ29udHJvbGxl
ciBjb250cm9sbGVyKHRoaXMsIHJ1bik7CisgICAgcmV0dXJuIGNvbnRyb2xsZXIub2Zmc2V0Rm9y
UG9zaXRpb24oeCwgaW5jbHVkZVBhcnRpYWxHbHlwaHMpOworfQorCit9CkluZGV4OiBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250Q0dXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDR1dpbi5jcHAJKHJldmlzaW9uIDI5NzI2KQor
KysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENHV2luLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBw
bGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAw
NywgMjAwOCBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCkBAIC0yNiwxMSArMjYsOSBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgog
I2luY2x1ZGUgIkZvbnQuaCIKIAotI2luY2x1ZGUgIkZvbnRGYWxsYmFja0xpc3QuaCIKICNpbmNs
dWRlICJHbHlwaEJ1ZmZlci5oIgogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2luY2x1
ZGUgIkludFJlY3QuaCIKLSNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1ZGUgIlNp
bXBsZUZvbnREYXRhLmgiCiAjaW5jbHVkZSAiVW5pc2NyaWJlQ29udHJvbGxlci5oIgogI2luY2x1
ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgpAQCAtNjgsMTUg
KzY2LDcgQEAgdm9pZCBGb250OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCogZwogCiAgICAg
ICAgIC8vIFNldCB0aGUgY29ycmVjdCBjb2xvci4KICAgICAgICAgSERDIHRleHREcmF3aW5nREMg
PSBoZGM7Ci0gICAgICAgIC8qaWYgKGZpbGxDb2xvci5oYXNBbHBoYSgpIHx8IGdyYXBoaWNzQ29u
dGV4dC0+aW5UcmFuc3BhcmVuY3lMYXllcigpKSB7Ci0gICAgICAgICAgICAvLyBHREkgY2FuJ3Qg
aGFuZGxlIGRyYXdpbmcgdHJhbnNwYXJlbnQgdGV4dC4gIFdlIGhhdmUgdG8gZHJhdyBpbnRvIGEg
bWFzay4gIFdlIGRyYXcgYmxhY2sgdGV4dCBvbiBhIHdoaXRlLWZpbGxlZCBiYWNrZ3JvdW5kLgot
ICAgICAgICAgICAgLy8gV2UgYWxzbyBkbyB0aGlzIHdoZW4gaW5zaWRlIHRyYW5zcGFyZW5jeSBs
YXllcnMsIHNpbmNlIEdESSBhbHNvIGNhbid0IGRyYXcgb250byBhIHN1cmZhY2Ugd2l0aCBhbHBo
YS4KLSAgICAgICAgICAgIGdyYXBoaWNzQ29udGV4dC0+c2F2ZSgpOwotICAgICAgICAgICAgZ3Jh
cGhpY3NDb250ZXh0LT5zZXRGaWxsQ29sb3IoQ29sb3I6OndoaXRlKTsKLSAgICAgICAgICAgIHRl
eHREcmF3aW5nREMgPSBncmFwaGljc0NvbnRleHQtPmdldFdpbmRvd3NCaXRtYXBDb250ZXh0KHRl
eHRSZWN0KTsKLSAgICAgICAgICAgIFNldFRleHRDb2xvcihoZGMsIFJHQigwLCAwLCAwKSk7Ci0g
ICAgICAgIH0gZWxzZSovCi0gICAgICAgICAgICBTZXRUZXh0Q29sb3IoaGRjLCBSR0IoZmlsbENv
bG9yLnJlZCgpLCBmaWxsQ29sb3IuZ3JlZW4oKSwgZmlsbENvbG9yLmJsdWUoKSkpOworICAgICAg
ICBTZXRUZXh0Q29sb3IoaGRjLCBSR0IoZmlsbENvbG9yLnJlZCgpLCBmaWxsQ29sb3IuZ3JlZW4o
KSwgZmlsbENvbG9yLmJsdWUoKSkpOwogCiAgICAgICAgIFNldEJrTW9kZShoZGMsIFRSQU5TUEFS
RU5UKTsKICAgICAgICAgU2V0VGV4dEFsaWduKGhkYywgVEFfTEVGVCB8IFRBX0JBU0VMSU5FKTsK
QEAgLTk1LDM0ICs4NSw2IEBAIHZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQq
IGcKICAgICAgICAgfQogICAgICAgICBFeHRUZXh0T3V0KGhkYywgcG9pbnQueCgpLCBwb2ludC55
KCksIEVUT19HTFlQSF9JTkRFWCwgMCwgKFdDSEFSKilnbHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSks
IG51bUdseXBocywgZ2RpQWR2YW5jZXMuZGF0YSgpKTsKIAotICAgICAgICAvKmlmIChmaWxsQ29s
b3IuaGFzQWxwaGEoKSB8fCBncmFwaGljc0NvbnRleHQtPmluVHJhbnNwYXJlbmN5TGF5ZXIoKSkg
ewotICAgICAgICAgICAgLy8gVE9ET0Q6IFdlIGhhdmUgdG8gd2FsayB0aGUgYml0cyBvZiB0aGUg
Yml0bWFwIGFuZCBpbnZlcnQgdGhlbS4gIFdlIGFsc28gY29weSBvdmVyIHRoZSBncmVlbiBjb21w
b25lbnQgdmFsdWUgaW50byB0aGUgYWxwaGEgdmFsdWUKLSAgICAgICAgICAgIC8vIHRvIGtlZXAg
Q2xlYXJUeXBlIGxvb2tpbmcgcmVhc29uYWJsZS4KLQotICAgICAgICAgICAgLy8gTm93IHRoYXQg
d2UgaGF2ZSBkcmF3biB0aGUgdGV4dCBpbnRvIGEgYml0bWFwIGFuZCBpbnZlcnRlZCBpdCwgb2J0
YWluIGEgQ0dJbWFnZVJlZiBtYXNrLgotICAgICAgICAgICAgQ0dJbWFnZVJlZiBtYXNrID0gZ3Jh
cGhpY3NDb250ZXh0LT5yZWxlYXNlV2luZG93c0JpdG1hcENvbnRleHRJbnRvTWFzayh0ZXh0RHJh
d2luZ0RDLCB0ZXh0UmVjdCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEFwcGx5IHRo
ZSBtYXNrIHRvIHRoZSBmaWxsIGNvbG9yLgotICAgICAgICAgICAgQ0dDb250ZXh0UmVmIGJpdG1h
cENvbnRleHQgPSBncmFwaGljc0NvbnRleHQtPmdldFdpbmRvd3NDb21wYXRpYmxlQ0dCaXRtYXBD
b250ZXh0KHRleHRSZWN0LnNpemUoKSk7Ci0gICAgICAgICAgICBDR0Zsb2F0IHJlZCwgZ3JlZW4s
IGJsdWUsIGFscGhhOwotICAgICAgICAgICAgY29sb3IuZ2V0UkdCQShyZWQsIGdyZWVuLCBibHVl
LCBhbHBoYSk7Ci0gICAgICAgICAgICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoY29udGV4dCwg
cmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotICAgICAgICAgICAgQ0dDb250ZXh0RmlsbFJlY3Qo
Yml0bWFwQ29udGV4dCwgSW50UmVjdCgwLCAwLCB0ZXh0UmVjdC53aWR0aCgpLCB0ZXh0UmVjdC5o
ZWlnaHQoKSkpOwotICAgICAgICAgICAgQ0dJbWFnZVJlZiBmaWxsQ29sb3JJbWFnZSA9IENHQml0
bWFwQ29udGV4dENyZWF0ZUltYWdlKGJpdG1hcENvbnRleHQpOwotICAgICAgICAKLSAgICAgICAg
ICAgIC8vIEFwcGx5IHRoZSBtYXNrLgotICAgICAgICAgICAgQ0dJbWFnZVJlZiBmaW5hbEltYWdl
ID0gQ0dJbWFnZUNyZWF0ZVdpdGhNYXNrKGZpbGxDb2xvckltYWdlLCBtYXNrKTsKLQotICAgICAg
ICAgICAgLy8gVGhlIGJpdG1hcCBpbWFnZSBuZWVkcyB0byBiZSBkcmF3biBpbnRvIHRoZSBIREMu
Ci0gICAgICAgICAgICBncmFwaGljc0NvbnRleHQtPmRyYXdJbWFnZUludG9XaW5kb3dzQ29udGV4
dChoZGMsIGZpbmFsSW1hZ2UpOwotCi0gICAgICAgICAgICAvLyBSZWxlYXNlIG91ciBpbWFnZXMg
YW5kIGNvbnRleHRzLgotICAgICAgICAgICAgQ0dJbWFnZVJlbGVhc2UobWFzayk7Ci0gICAgICAg
ICAgICBDR0ltYWdlUmVsZWFzZShmaWxsQ29sb3JJbWFnZSk7Ci0gICAgICAgICAgICBDR0ltYWdl
UmVsZWFzZShmaW5hbEltYWdlKTsKLSAgICAgICAgICAgIENHQ29udGV4dFJlbGVhc2UoYml0bWFw
Q29udGV4dCk7Ci0gICAgICAgIH0qLwotCiAgICAgICAgIGdyYXBoaWNzQ29udGV4dC0+cmVsZWFz
ZVdpbmRvd3NDb250ZXh0KGhkYywgdGV4dFJlY3QpOwogICAgICAgICByZXR1cm47CiAgICAgfQpA
QCAtMTM5LDkgKzEwMSw4IEBAIHZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQq
IGcKICAgICBtYXRyaXguYiA9IC1tYXRyaXguYjsKICAgICBtYXRyaXguZCA9IC1tYXRyaXguZDsK
IAotICAgIGlmIChwbGF0Zm9ybURhdGEuc3ludGhldGljT2JsaXF1ZSgpKQotICAgIHsKLSAgICAg
ICAgc3RhdGljIGZsb2F0IHNrZXcgPSAtdGFuZihzeW50aGV0aWNPYmxpcXVlQW5nbGUgKiBhY29z
ZigwKSAvIDkwKTsKKyAgICBpZiAocGxhdGZvcm1EYXRhLnN5bnRoZXRpY09ibGlxdWUoKSkgewor
ICAgICAgICBzdGF0aWMgZmxvYXQgc2tldyA9IC10YW5mKHN5bnRoZXRpY09ibGlxdWVBbmdsZSAq
IGFjb3NmKDApIC8gOTAuMGYpOwogICAgICAgICBtYXRyaXggPSBDR0FmZmluZVRyYW5zZm9ybUNv
bmNhdChtYXRyaXgsIENHQWZmaW5lVHJhbnNmb3JtTWFrZSgxLCAwLCBza2V3LCAxLCAwLCAwKSk7
CiAgICAgfQogCkBAIC0xNjMsNjUgKzEyNCw0IEBAIHZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFw
aGljc0NvbnRleHQqIGcKICAgICB3a1Jlc3RvcmVGb250U21vb3RoaW5nU3R5bGUoY2dDb250ZXh0
LCBvbGRGb250U21vb3RoaW5nU3R5bGUpOwogfQogCi1GbG9hdFJlY3QgRm9udDo6c2VsZWN0aW9u
UmVjdEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgSW50UG9pbnQmIHBv
aW50LCBpbnQgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aW50IGZyb20sIGludCB0bykgY29uc3QKLXsKLSAgICBVbmlzY3JpYmVDb250cm9sbGVyIGl0KHRo
aXMsIHJ1bik7Ci0gICAgaXQuYWR2YW5jZShmcm9tKTsKLSAgICBmbG9hdCBiZWZvcmVXaWR0aCA9
IGl0LnJ1bldpZHRoU29GYXIoKTsKLSAgICBpdC5hZHZhbmNlKHRvKTsKLSAgICBmbG9hdCBhZnRl
cldpZHRoID0gaXQucnVuV2lkdGhTb0ZhcigpOwotCi0gICAgLy8gVXNpbmcgcm91bmRmKCkgcmF0
aGVyIHRoYW4gY2VpbGYoKSBmb3IgdGhlIHJpZ2h0IGVkZ2UgYXMgYSBjb21wcm9taXNlIHRvIGVu
c3VyZSBjb3JyZWN0IGNhcmV0IHBvc2l0aW9uaW5nCi0gICAgaWYgKHJ1bi5ydGwoKSkgewotICAg
ICAgICBpdC5hZHZhbmNlKHJ1bi5sZW5ndGgoKSk7Ci0gICAgICAgIGZsb2F0IHRvdGFsV2lkdGgg
PSBpdC5ydW5XaWR0aFNvRmFyKCk7Ci0gICAgICAgIHJldHVybiBGbG9hdFJlY3QocG9pbnQueCgp
ICsgZmxvb3JmKHRvdGFsV2lkdGggLSBhZnRlcldpZHRoKSwgcG9pbnQueSgpLCByb3VuZGYodG90
YWxXaWR0aCAtIGJlZm9yZVdpZHRoKSAtIGZsb29yZih0b3RhbFdpZHRoIC0gYWZ0ZXJXaWR0aCks
IGgpOwotICAgIH0gCi0gICAgCi0gICAgcmV0dXJuIEZsb2F0UmVjdChwb2ludC54KCkgKyBmbG9v
cmYoYmVmb3JlV2lkdGgpLCBwb2ludC55KCksIHJvdW5kZihhZnRlcldpZHRoKSAtIGZsb29yZihi
ZWZvcmVXaWR0aCksIGgpOwotfQotCi12b2lkIEZvbnQ6OmRyYXdDb21wbGV4VGV4dChHcmFwaGlj
c0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYg
cG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IHRvKSBjb25z
dAotewotICAgIC8vIFRoaXMgZ2x5cGggYnVmZmVyIGhvbGRzIG91ciBnbHlwaHMgKyBhZHZhbmNl
cyArIGZvbnQgZGF0YSBmb3IgZWFjaCBnbHlwaC4KLSAgICBHbHlwaEJ1ZmZlciBnbHlwaEJ1ZmZl
cjsKLQotICAgIGZsb2F0IHN0YXJ0WCA9IHBvaW50LngoKTsKLSAgICBVbmlzY3JpYmVDb250cm9s
bGVyIGNvbnRyb2xsZXIodGhpcywgcnVuKTsKLSAgICBjb250cm9sbGVyLmFkdmFuY2UoZnJvbSk7
Ci0gICAgZmxvYXQgYmVmb3JlV2lkdGggPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKTsKLSAg
ICBjb250cm9sbGVyLmFkdmFuY2UodG8sICZnbHlwaEJ1ZmZlcik7Ci0gICAgCi0gICAgLy8gV2Ug
Y291bGRuJ3QgZ2VuZXJhdGUgYW55IGdseXBocyBmb3IgdGhlIHJ1bi4gIEdpdmUgdXAuCi0gICAg
aWYgKGdseXBoQnVmZmVyLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIGZs
b2F0IGFmdGVyV2lkdGggPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKTsKLQotICAgIGlmIChy
dW4ucnRsKCkpIHsKLSAgICAgICAgY29udHJvbGxlci5hZHZhbmNlKHJ1bi5sZW5ndGgoKSk7Ci0g
ICAgICAgIHN0YXJ0WCArPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKSAtIGFmdGVyV2lkdGg7
Ci0gICAgfSBlbHNlCi0gICAgICAgIHN0YXJ0WCArPSBiZWZvcmVXaWR0aDsKLQotICAgIC8vIERy
YXcgdGhlIGdseXBoIGJ1ZmZlciBub3cgYXQgdGhlIHN0YXJ0aW5nIHBvaW50IHJldHVybmVkIGlu
IHN0YXJ0WC4KLSAgICBGbG9hdFBvaW50IHN0YXJ0UG9pbnQoc3RhcnRYLCBwb2ludC55KCkpOwot
ICAgIGRyYXdHbHlwaEJ1ZmZlcihjb250ZXh0LCBnbHlwaEJ1ZmZlciwgcnVuLCBzdGFydFBvaW50
KTsKLX0KLQotZmxvYXQgRm9udDo6ZmxvYXRXaWR0aEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRS
dW4mIHJ1bikgY29uc3QKLXsKLSAgICBVbmlzY3JpYmVDb250cm9sbGVyIGNvbnRyb2xsZXIodGhp
cywgcnVuKTsKLSAgICBjb250cm9sbGVyLmFkdmFuY2UocnVuLmxlbmd0aCgpKTsKLSAgICByZXR1
cm4gY29udHJvbGxlci5ydW5XaWR0aFNvRmFyKCk7Ci19Ci0KLWludCBGb250OjpvZmZzZXRGb3JQ
b3NpdGlvbkZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgaW50IHgsIGJvb2wgaW5j
bHVkZVBhcnRpYWxHbHlwaHMpIGNvbnN0Ci17Ci0gICAgVW5pc2NyaWJlQ29udHJvbGxlciBjb250
cm9sbGVyKHRoaXMsIHJ1bik7Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXIub2Zmc2V0Rm9yUG9zaXRp
b24oeCwgaW5jbHVkZVBhcnRpYWxHbHlwaHMpOwotfQotCiB9CkluZGV4OiBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbi9Gb250Q2Fpcm9XaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250Q2Fpcm9XaW4uY3BwCShyZXZpc2lvbiAw
KQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4g
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJGb250LmgiCisKKyNpbmNsdWRlICJHbHlwaEJ1ZmZlci5oIgorI2luY2x1ZGUgIkdyYXBo
aWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiU2lt
cGxlRm9udERhdGEuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2b2lkIEZvbnQ6OmRyYXdH
bHlwaHMoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGNvbnN0IFNpbXBsZUZvbnRE
YXRhKiBmb250LCBjb25zdCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZmZXIsIAorICAgICAgICAgICAg
ICAgICAgICAgIGludCBmcm9tLCBpbnQgbnVtR2x5cGhzLCBjb25zdCBGbG9hdFBvaW50JiBwb2lu
dCkgY29uc3QKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit9CkluZGV4OiBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250V2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250V2luLmNwcAkocmV2aXNpb24gMjk4MzQpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250V2luLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5j
LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAw
OCBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCkBAIC0zMywxMzYgKzMzLDEwIEBACiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQu
aCIKICNpbmNsdWRlICJTaW1wbGVGb250RGF0YS5oIgogI2luY2x1ZGUgIlVuaXNjcmliZUNvbnRy
b2xsZXIuaCIKLSNpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2Vydmlj
ZXMuaD4KLSNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJm
YWNlLmg+CiAjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUg
ewogCi1jb25zdCBpbnQgc3ludGhldGljT2JsaXF1ZUFuZ2xlID0gMTQ7Ci0KLXZvaWQgRm9udDo6
ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwgY29uc3QgU2ltcGxl
Rm9udERhdGEqIGZvbnQsIGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZlciwgCi0gICAgICAg
ICAgICAgICAgICAgICAgaW50IGZyb20sIGludCBudW1HbHlwaHMsIGNvbnN0IEZsb2F0UG9pbnQm
IHBvaW50KSBjb25zdAotewotICAgIGlmIChmb250LT5tX2ZvbnQudXNlR0RJKCkpIHsKLSAgICAg
ICAgLy8gRklYTUU6IFN1cHBvcnQgYWxwaGEgYmxlbmRpbmcuCi0gICAgICAgIC8vIEZJWE1FOiBT
dXBwb3J0IHRleHQgc3Ryb2tlL2ZpbGwuCi0gICAgICAgIC8vIEZJWE1FOiBTdXBwb3J0IHRleHQg
c2hhZG93LgotICAgICAgICBDb2xvciBmaWxsQ29sb3IgPSBncmFwaGljc0NvbnRleHQtPmZpbGxD
b2xvcigpOwotICAgICAgICBpZiAoZmlsbENvbG9yLmFscGhhKCkgPT0gMCkKLSAgICAgICAgICAg
IHJldHVybjsKLQotICAgICAgICAvLyBXZSBoYXZlIHRvIGNvbnZlcnQgQ0cncyB0d28tZGltZW5z
aW9uYWwgZmxvYXRpbmcgcG9pbnQgYWR2YW5jZXMgdG8ganVzdCBob3Jpem9udGFsIGludGVnZXIg
YWR2YW5jZXMuCi0gICAgICAgIFZlY3RvcjxpbnQsIDIwNDg+IGdkaUFkdmFuY2VzOwotICAgICAg
ICBpbnQgdG90YWxXaWR0aCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtR2x5
cGhzOyBpKyspIHsKLSAgICAgICAgICAgIGdkaUFkdmFuY2VzLmFwcGVuZChscm91bmRmKGdseXBo
QnVmZmVyLmFkdmFuY2VBdChmcm9tICsgaSkpKTsKLSAgICAgICAgICAgIHRvdGFsV2lkdGggKz0g
Z2RpQWR2YW5jZXNbaV07Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBwdXQgc2xvcCBpbnRv
IHRoaXMgcmVjdCwgc2luY2UgZ2x5cGhzIGNhbiBvdmVyZmxvdyB0aGUgYXNjZW50L2Rlc2NlbnQg
Ym91bmRzIGFuZCB0aGUgbGVmdC9yaWdodCBlZGdlcy4KLSAgICAgICAgaW50IGxpbmVHYXAgPSBm
b250LT5saW5lR2FwKCk7Ci0gICAgICAgIEludFJlY3QgdGV4dFJlY3QocG9pbnQueCgpIC0gbGlu
ZUdhcCwgcG9pbnQueSgpIC0gZm9udC0+YXNjZW50KCkgLSBsaW5lR2FwLCB0b3RhbFdpZHRoICsg
MiAqIGxpbmVHYXAsIGZvbnQtPmxpbmVTcGFjaW5nKCkpOwotICAgICAgICBIREMgaGRjID0gZ3Jh
cGhpY3NDb250ZXh0LT5nZXRXaW5kb3dzQ29udGV4dCh0ZXh0UmVjdCk7Ci0gICAgICAgIFNlbGVj
dE9iamVjdChoZGMsIGZvbnQtPm1fZm9udC5oZm9udCgpKTsKLQotICAgICAgICAvLyBTZXQgdGhl
IGNvcnJlY3QgY29sb3IuCi0gICAgICAgIEhEQyB0ZXh0RHJhd2luZ0RDID0gaGRjOwotICAgICAg
ICAvKmlmIChmaWxsQ29sb3IuaGFzQWxwaGEoKSB8fCBncmFwaGljc0NvbnRleHQtPmluVHJhbnNw
YXJlbmN5TGF5ZXIoKSkgewotICAgICAgICAgICAgLy8gR0RJIGNhbid0IGhhbmRsZSBkcmF3aW5n
IHRyYW5zcGFyZW50IHRleHQuICBXZSBoYXZlIHRvIGRyYXcgaW50byBhIG1hc2suICBXZSBkcmF3
IGJsYWNrIHRleHQgb24gYSB3aGl0ZS1maWxsZWQgYmFja2dyb3VuZC4KLSAgICAgICAgICAgIC8v
IFdlIGFsc28gZG8gdGhpcyB3aGVuIGluc2lkZSB0cmFuc3BhcmVuY3kgbGF5ZXJzLCBzaW5jZSBH
REkgYWxzbyBjYW4ndCBkcmF3IG9udG8gYSBzdXJmYWNlIHdpdGggYWxwaGEuCi0gICAgICAgICAg
ICBncmFwaGljc0NvbnRleHQtPnNhdmUoKTsKLSAgICAgICAgICAgIGdyYXBoaWNzQ29udGV4dC0+
c2V0RmlsbENvbG9yKENvbG9yOjp3aGl0ZSk7Ci0gICAgICAgICAgICB0ZXh0RHJhd2luZ0RDID0g
Z3JhcGhpY3NDb250ZXh0LT5nZXRXaW5kb3dzQml0bWFwQ29udGV4dCh0ZXh0UmVjdCk7Ci0gICAg
ICAgICAgICBTZXRUZXh0Q29sb3IoaGRjLCBSR0IoMCwgMCwgMCkpOwotICAgICAgICB9IGVsc2Uq
LwotICAgICAgICAgICAgU2V0VGV4dENvbG9yKGhkYywgUkdCKGZpbGxDb2xvci5yZWQoKSwgZmls
bENvbG9yLmdyZWVuKCksIGZpbGxDb2xvci5ibHVlKCkpKTsKLQotICAgICAgICBTZXRCa01vZGUo
aGRjLCBUUkFOU1BBUkVOVCk7Ci0gICAgICAgIFNldFRleHRBbGlnbihoZGMsIFRBX0xFRlQgfCBU
QV9CQVNFTElORSk7Ci0KLSAgICAgICAgLy8gVW5pc2NyaWJlIGdpdmVzIHVzIG9mZnNldHMgdG8g
aGVscCByZWZpbmUgdGhlIHBvc2l0aW9uaW5nIG9mIGNvbWJpbmluZyBnbHlwaHMuCi0gICAgICAg
IEZsb2F0U2l6ZSB0cmFuc2xhdGlvbiA9IGdseXBoQnVmZmVyLm9mZnNldEF0KGZyb20pOwotICAg
ICAgICBpZiAodHJhbnNsYXRpb24ud2lkdGgoKSB8fCB0cmFuc2xhdGlvbi5oZWlnaHQoKSkgewot
ICAgICAgICAgICAgWEZPUk0geGZvcm07Ci0gICAgICAgICAgICB4Zm9ybS5lTTExID0gMS4wOwot
ICAgICAgICAgICAgeGZvcm0uZU0xMiA9IDA7Ci0gICAgICAgICAgICB4Zm9ybS5lTTIxID0gMDsK
LSAgICAgICAgICAgIHhmb3JtLmVNMjIgPSAxLjA7Ci0gICAgICAgICAgICB4Zm9ybS5lRHggPSB0
cmFuc2xhdGlvbi53aWR0aCgpOwotICAgICAgICAgICAgeGZvcm0uZUR5ID0gdHJhbnNsYXRpb24u
aGVpZ2h0KCk7Ci0gICAgICAgICAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShoZGMsICZ4Zm9ybSwg
TVdUX0xFRlRNVUxUSVBMWSk7Ci0gICAgICAgIH0KLSAgICAgICAgRXh0VGV4dE91dChoZGMsIHBv
aW50LngoKSwgcG9pbnQueSgpLCBFVE9fR0xZUEhfSU5ERVgsIDAsIChXQ0hBUiopZ2x5cGhCdWZm
ZXIuZ2x5cGhzKGZyb20pLCBudW1HbHlwaHMsIGdkaUFkdmFuY2VzLmRhdGEoKSk7Ci0KLSAgICAg
ICAgLyppZiAoZmlsbENvbG9yLmhhc0FscGhhKCkgfHwgZ3JhcGhpY3NDb250ZXh0LT5pblRyYW5z
cGFyZW5jeUxheWVyKCkpIHsKLSAgICAgICAgICAgIC8vIFRPRE9EOiBXZSBoYXZlIHRvIHdhbGsg
dGhlIGJpdHMgb2YgdGhlIGJpdG1hcCBhbmQgaW52ZXJ0IHRoZW0uICBXZSBhbHNvIGNvcHkgb3Zl
ciB0aGUgZ3JlZW4gY29tcG9uZW50IHZhbHVlIGludG8gdGhlIGFscGhhIHZhbHVlCi0gICAgICAg
ICAgICAvLyB0byBrZWVwIENsZWFyVHlwZSBsb29raW5nIHJlYXNvbmFibGUuCi0KLSAgICAgICAg
ICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgZHJhd24gdGhlIHRleHQgaW50byBhIGJpdG1hcCBhbmQg
aW52ZXJ0ZWQgaXQsIG9idGFpbiBhIENHSW1hZ2VSZWYgbWFzay4KLSAgICAgICAgICAgIENHSW1h
Z2VSZWYgbWFzayA9IGdyYXBoaWNzQ29udGV4dC0+cmVsZWFzZVdpbmRvd3NCaXRtYXBDb250ZXh0
SW50b01hc2sodGV4dERyYXdpbmdEQywgdGV4dFJlY3QpOwotICAgICAgICAgICAgCi0gICAgICAg
ICAgICAvLyBBcHBseSB0aGUgbWFzayB0byB0aGUgZmlsbCBjb2xvci4KLSAgICAgICAgICAgIENH
Q29udGV4dFJlZiBiaXRtYXBDb250ZXh0ID0gZ3JhcGhpY3NDb250ZXh0LT5nZXRXaW5kb3dzQ29t
cGF0aWJsZUNHQml0bWFwQ29udGV4dCh0ZXh0UmVjdC5zaXplKCkpOwotICAgICAgICAgICAgQ0dG
bG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKLSAgICAgICAgICAgIGNvbG9yLmdldFJHQkEo
cmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotICAgICAgICAgICAgQ0dDb250ZXh0U2V0UkdCRmls
bENvbG9yKGNvbnRleHQsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLSAgICAgICAgICAgIENH
Q29udGV4dEZpbGxSZWN0KGJpdG1hcENvbnRleHQsIEludFJlY3QoMCwgMCwgdGV4dFJlY3Qud2lk
dGgoKSwgdGV4dFJlY3QuaGVpZ2h0KCkpKTsKLSAgICAgICAgICAgIENHSW1hZ2VSZWYgZmlsbENv
bG9ySW1hZ2UgPSBDR0JpdG1hcENvbnRleHRDcmVhdGVJbWFnZShiaXRtYXBDb250ZXh0KTsKLSAg
ICAgICAgCi0gICAgICAgICAgICAvLyBBcHBseSB0aGUgbWFzay4KLSAgICAgICAgICAgIENHSW1h
Z2VSZWYgZmluYWxJbWFnZSA9IENHSW1hZ2VDcmVhdGVXaXRoTWFzayhmaWxsQ29sb3JJbWFnZSwg
bWFzayk7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBiaXRtYXAgaW1hZ2UgbmVlZHMgdG8gYmUgZHJh
d24gaW50byB0aGUgSERDLgotICAgICAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5kcmF3SW1hZ2VJ
bnRvV2luZG93c0NvbnRleHQoaGRjLCBmaW5hbEltYWdlKTsKLQotICAgICAgICAgICAgLy8gUmVs
ZWFzZSBvdXIgaW1hZ2VzIGFuZCBjb250ZXh0cy4KLSAgICAgICAgICAgIENHSW1hZ2VSZWxlYXNl
KG1hc2spOwotICAgICAgICAgICAgQ0dJbWFnZVJlbGVhc2UoZmlsbENvbG9ySW1hZ2UpOwotICAg
ICAgICAgICAgQ0dJbWFnZVJlbGVhc2UoZmluYWxJbWFnZSk7Ci0gICAgICAgICAgICBDR0NvbnRl
eHRSZWxlYXNlKGJpdG1hcENvbnRleHQpOwotICAgICAgICB9Ki8KLQotICAgICAgICBncmFwaGlj
c0NvbnRleHQtPnJlbGVhc2VXaW5kb3dzQ29udGV4dChoZGMsIHRleHRSZWN0KTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLQotICAgIENHQ29udGV4dFJlZiBjZ0NvbnRleHQgPSBncmFwaGljc0Nv
bnRleHQtPnBsYXRmb3JtQ29udGV4dCgpOwotCi0gICAgdWludDMyX3Qgb2xkRm9udFNtb290aGlu
Z1N0eWxlID0gd2tTZXRGb250U21vb3RoaW5nU3R5bGUoY2dDb250ZXh0KTsKLQotICAgIGNvbnN0
IEZvbnRQbGF0Zm9ybURhdGEmIHBsYXRmb3JtRGF0YSA9IGZvbnQtPnBsYXRmb3JtRGF0YSgpOwot
Ci0gICAgQ0dDb250ZXh0U2V0Rm9udChjZ0NvbnRleHQsIHBsYXRmb3JtRGF0YS5jZ0ZvbnQoKSk7
Ci0KLSAgICBDR0FmZmluZVRyYW5zZm9ybSBtYXRyaXggPSBDR0FmZmluZVRyYW5zZm9ybUlkZW50
aXR5OwotICAgIG1hdHJpeC5iID0gLW1hdHJpeC5iOwotICAgIG1hdHJpeC5kID0gLW1hdHJpeC5k
OwotCi0gICAgaWYgKHBsYXRmb3JtRGF0YS5zeW50aGV0aWNPYmxpcXVlKCkpCi0gICAgewotICAg
ICAgICBzdGF0aWMgZmxvYXQgc2tldyA9IC10YW5mKHN5bnRoZXRpY09ibGlxdWVBbmdsZSAqIGFj
b3NmKDApIC8gOTApOwotICAgICAgICBtYXRyaXggPSBDR0FmZmluZVRyYW5zZm9ybUNvbmNhdCht
YXRyaXgsIENHQWZmaW5lVHJhbnNmb3JtTWFrZSgxLCAwLCBza2V3LCAxLCAwLCAwKSk7Ci0gICAg
fQotCi0gICAgLy8gVW5pc2NyaWJlIGdpdmVzIHVzIG9mZnNldHMgdG8gaGVscCByZWZpbmUgdGhl
IHBvc2l0aW9uaW5nIG9mIGNvbWJpbmluZyBnbHlwaHMuCi0gICAgRmxvYXRTaXplIHRyYW5zbGF0
aW9uID0gZ2x5cGhCdWZmZXIub2Zmc2V0QXQoZnJvbSk7Ci0gICAgaWYgKHRyYW5zbGF0aW9uLndp
ZHRoKCkgfHwgdHJhbnNsYXRpb24uaGVpZ2h0KCkpCi0gICAgICAgIENHQWZmaW5lVHJhbnNmb3Jt
VHJhbnNsYXRlKG1hdHJpeCwgdHJhbnNsYXRpb24ud2lkdGgoKSwgdHJhbnNsYXRpb24uaGVpZ2h0
KCkpOwotICAgIAotICAgIENHQ29udGV4dFNldFRleHRNYXRyaXgoY2dDb250ZXh0LCBtYXRyaXgp
OwotCi0gICAgQ0dDb250ZXh0U2V0Rm9udFNpemUoY2dDb250ZXh0LCBwbGF0Zm9ybURhdGEuc2l6
ZSgpKTsKLSAgICBDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24oY2dDb250ZXh0LCBwb2ludC54KCks
IHBvaW50LnkoKSk7Ci0gICAgQ0dDb250ZXh0U2hvd0dseXBoc1dpdGhBZHZhbmNlcyhjZ0NvbnRl
eHQsIGdseXBoQnVmZmVyLmdseXBocyhmcm9tKSwgZ2x5cGhCdWZmZXIuYWR2YW5jZXMoZnJvbSks
IG51bUdseXBocyk7Ci0gICAgaWYgKGZvbnQtPm1fc3ludGhldGljQm9sZE9mZnNldCkgewotICAg
ICAgICBDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24oY2dDb250ZXh0LCBwb2ludC54KCkgKyBmb250
LT5tX3N5bnRoZXRpY0JvbGRPZmZzZXQsIHBvaW50LnkoKSk7Ci0gICAgICAgIENHQ29udGV4dFNo
b3dHbHlwaHNXaXRoQWR2YW5jZXMoY2dDb250ZXh0LCBnbHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSks
IGdseXBoQnVmZmVyLmFkdmFuY2VzKGZyb20pLCBudW1HbHlwaHMpOwotICAgIH0KLQotICAgIHdr
UmVzdG9yZUZvbnRTbW9vdGhpbmdTdHlsZShjZ0NvbnRleHQsIG9sZEZvbnRTbW9vdGhpbmdTdHls
ZSk7Ci19Ci0KIEZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQoY29u
c3QgVGV4dFJ1biYgcnVuLCBjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCBoLAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IHRvKSBjb25z
dAogewpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0
Q0dXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dy
YXBoaWNzQ29udGV4dENHV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCShmcm9tIFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dFdpbi5jcHA6Mjk4MzQpCisrKyBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRDR1dpbi5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSwzODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIw
MDQsIDIwMDUsIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIs
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisK
KyNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5o
IgorI2luY2x1ZGUgIlBhdGguaCIKKyNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ0dCaXRtYXBDb250
ZXh0Lmg+CisjaW5jbHVkZSA8V2ViS2l0U3lzdGVtSW50ZXJmYWNlL1dlYktpdFN5c3RlbUludGVy
ZmFjZS5oPgorI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CisKKyNpbmNsdWRlICJHcmFwaGlj
c0NvbnRleHRQbGF0Zm9ybVByaXZhdGUuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBTVkdSZXNvdXJjZUltYWdlOworCitzdGF0aWMgQ0dD
b250ZXh0UmVmIENHQ29udGV4dFdpdGhIREMoSERDIGhkYykKK3sKKyAgICBIQklUTUFQIGJpdG1h
cCA9IChIQklUTUFQKUdldEN1cnJlbnRPYmplY3QoaGRjLCBPQkpfQklUTUFQKTsKKyAgICBDR0Nv
bG9yU3BhY2VSZWYgZGV2aWNlUkdCID0gQ0dDb2xvclNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7Cisg
ICAgQklUTUFQIGluZm87CisKKyAgICBHZXRPYmplY3QoYml0bWFwLCBzaXplb2YoaW5mbyksICZp
bmZvKTsKKyAgICBBU1NFUlQoaW5mby5ibUJpdHNQaXhlbCA9PSAzMik7CisgICAgQ0dDb250ZXh0
UmVmIGNvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUoaW5mby5ibUJpdHMsIGluZm8uYm1X
aWR0aCwgaW5mby5ibUhlaWdodCwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBpbmZvLmJtV2lkdGhCeXRlcywgZGV2aWNlUkdCLCBrQ0dCaXRtYXBC
eXRlT3JkZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFOb25lU2tpcEZpcnN0KTsKKyAgICBDR0Nv
bG9yU3BhY2VSZWxlYXNlKGRldmljZVJHQik7CisKKyAgICAvLyBGbGlwIGNvb3JkcworICAgIENH
Q29udGV4dFRyYW5zbGF0ZUNUTShjb250ZXh0LCAwLCBpbmZvLmJtSGVpZ2h0KTsKKyAgICBDR0Nv
bnRleHRTY2FsZUNUTShjb250ZXh0LCAxLCAtMSk7CisgICAgCisgICAgLy8gUHV0IHRoZSBIREMg
SW4gYWR2YW5jZWQgbW9kZSBzbyBpdCB3aWxsIGhvbm9yIGFmZmluZSB0cmFuc2Zvcm1zLgorICAg
IFNldEdyYXBoaWNzTW9kZShoZGMsIEdNX0FEVkFOQ0VEKTsKKyAgICAKKyAgICByZXR1cm4gY29u
dGV4dDsKK30KKworR3JhcGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRleHQoSERDIGhkYykKKyAg
ICA6IG1fY29tbW9uKGNyZWF0ZUdyYXBoaWNzQ29udGV4dFByaXZhdGUoKSkKKyAgICAsIG1fZGF0
YShuZXcgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKENHQ29udGV4dFdpdGhIREMoaGRj
KSkpCit7CisgICAgQ0dDb250ZXh0UmVsZWFzZShtX2RhdGEtPm1fY2dDb250ZXh0KTsKKyAgICBt
X2RhdGEtPm1faGRjID0gaGRjOworICAgIHNldFBhaW50aW5nRGlzYWJsZWQoIW1fZGF0YS0+bV9j
Z0NvbnRleHQpOworICAgIGlmIChtX2RhdGEtPm1fY2dDb250ZXh0KSB7CisgICAgICAgIC8vIE1h
a2Ugc3VyZSB0aGUgY29udGV4dCBzdGFydHMgaW4gc3luYyB3aXRoIG91ciBzdGF0ZS4KKyAgICAg
ICAgc2V0UGxhdGZvcm1GaWxsQ29sb3IoZmlsbENvbG9yKCkpOworICAgICAgICBzZXRQbGF0Zm9y
bVN0cm9rZUNvbG9yKHN0cm9rZUNvbG9yKCkpOworICAgIH0KK30KKworSERDIEdyYXBoaWNzQ29u
dGV4dDo6Z2V0V2luZG93c0NvbnRleHQoY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBw
b3J0QWxwaGFCbGVuZCkKK3sKKyAgICBpZiAoaW5UcmFuc3BhcmVuY3lMYXllcigpKSB7CisgICAg
ICAgIGlmIChkc3RSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAg
ICAgIC8vIENyZWF0ZSBhIGJpdG1hcCBEQyBpbiB3aGljaCB0byBkcmF3LgorICAgICAgICBCSVRN
QVBJTkZPIGJpdG1hcEluZm87CisgICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpU2l6ZSAg
ICAgICAgICA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKKyAgICAgICAgYml0bWFwSW5mby5i
bWlIZWFkZXIuYmlXaWR0aCAgICAgICAgID0gZHN0UmVjdC53aWR0aCgpOyAKKyAgICAgICAgYml0
bWFwSW5mby5ibWlIZWFkZXIuYmlIZWlnaHQgICAgICAgID0gZHN0UmVjdC5oZWlnaHQoKTsKKyAg
ICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlQbGFuZXMgICAgICAgID0gMTsKKyAgICAgICAg
Yml0bWFwSW5mby5ibWlIZWFkZXIuYmlCaXRDb3VudCAgICAgID0gMzI7CisgICAgICAgIGJpdG1h
cEluZm8uYm1pSGVhZGVyLmJpQ29tcHJlc3Npb24gICA9IEJJX1JHQjsKKyAgICAgICAgYml0bWFw
SW5mby5ibWlIZWFkZXIuYmlTaXplSW1hZ2UgICAgID0gMDsKKyAgICAgICAgYml0bWFwSW5mby5i
bWlIZWFkZXIuYmlYUGVsc1Blck1ldGVyID0gMDsKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFk
ZXIuYmlZUGVsc1Blck1ldGVyID0gMDsKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlD
bHJVc2VkICAgICAgID0gMDsKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlDbHJJbXBv
cnRhbnQgID0gMDsKKworICAgICAgICB2b2lkKiBwaXhlbHMgPSAwOworICAgICAgICBIQklUTUFQ
IGJpdG1hcCA9IDo6Q3JlYXRlRElCU2VjdGlvbihOVUxMLCAmYml0bWFwSW5mbywgRElCX1JHQl9D
T0xPUlMsICZwaXhlbHMsIDAsIDApOworICAgICAgICBpZiAoIWJpdG1hcCkKKyAgICAgICAgICAg
IHJldHVybiAwOworCisgICAgICAgIEhEQyBiaXRtYXBEQyA9IDo6Q3JlYXRlQ29tcGF0aWJsZURD
KG1fZGF0YS0+bV9oZGMpOworICAgICAgICA6OlNlbGVjdE9iamVjdChiaXRtYXBEQywgYml0bWFw
KTsKKworICAgICAgICAvLyBGaWxsIG91ciBidWZmZXIgd2l0aCBjbGVhciBpZiB3ZSdyZSBnb2lu
ZyB0byBhbHBoYSBibGVuZC4KKyAgICAgICAgaWYgKHN1cHBvcnRBbHBoYUJsZW5kKSB7CisgICAg
ICAgICAgICBCSVRNQVAgYm1wSW5mbzsKKyAgICAgICAgICAgIEdldE9iamVjdChiaXRtYXAsIHNp
emVvZihibXBJbmZvKSwgJmJtcEluZm8pOworICAgICAgICAgICAgaW50IGJ1ZmZlclNpemUgPSBi
bXBJbmZvLmJtV2lkdGhCeXRlcyAqIGJtcEluZm8uYm1IZWlnaHQ7CisgICAgICAgICAgICBtZW1z
ZXQoYm1wSW5mby5ibUJpdHMsIDAsIGJ1ZmZlclNpemUpOworICAgICAgICB9CisKKyAgICAgICAg
Ly8gTWFrZSBzdXJlIHdlIGNhbiBkbyB3b3JsZCB0cmFuc2Zvcm1zLgorICAgICAgICBTZXRHcmFw
aGljc01vZGUoYml0bWFwREMsIEdNX0FEVkFOQ0VEKTsKKworICAgICAgICAvLyBBcHBseSBhIHRy
YW5zbGF0aW9uIHRvIG91ciBjb250ZXh0IHNvIHRoYXQgdGhlIGRyYXdpbmcgZG9uZSB3aWxsIGJl
IGF0ICgwLDApIG9mIHRoZSBiaXRtYXAuCisgICAgICAgIFhGT1JNIHhmb3JtOworICAgICAgICB4
Zm9ybS5lTTExID0gMS4wOworICAgICAgICB4Zm9ybS5lTTEyID0gMDsKKyAgICAgICAgeGZvcm0u
ZU0yMSA9IDA7CisgICAgICAgIHhmb3JtLmVNMjIgPSAxLjA7CisgICAgICAgIHhmb3JtLmVEeCA9
IC1kc3RSZWN0LngoKTsKKyAgICAgICAgeGZvcm0uZUR5ID0gLWRzdFJlY3QueSgpOworICAgICAg
ICA6OlNldFdvcmxkVHJhbnNmb3JtKGJpdG1hcERDLCAmeGZvcm0pOworCisgICAgICAgIHJldHVy
biBiaXRtYXBEQzsKKyAgICB9CisKKyAgICBDR0NvbnRleHRGbHVzaChwbGF0Zm9ybUNvbnRleHQo
KSk7CisgICAgbV9kYXRhLT5zYXZlKCk7CisgICAgcmV0dXJuIG1fZGF0YS0+bV9oZGM7Cit9CisK
K2Jvb2wgR3JhcGhpY3NDb250ZXh0OjppblRyYW5zcGFyZW5jeUxheWVyKCkgY29uc3QgeyByZXR1
cm4gbV9kYXRhLT5tX3RyYW5zcGFyZW5jeUNvdW50OyB9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
OjpyZWxlYXNlV2luZG93c0NvbnRleHQoSERDIGhkYywgY29uc3QgSW50UmVjdCYgZHN0UmVjdCwg
Ym9vbCBzdXBwb3J0QWxwaGFCbGVuZCkKK3sKKyAgICBpZiAoaGRjICYmIGluVHJhbnNwYXJlbmN5
TGF5ZXIoKSkgeworICAgICAgICBpZiAoZHN0UmVjdC5pc0VtcHR5KCkpCisgICAgICAgICAgICBy
ZXR1cm47CisKKyAgICAgICAgSEJJVE1BUCBiaXRtYXAgPSAoSEJJVE1BUClHZXRDdXJyZW50T2Jq
ZWN0KGhkYywgT0JKX0JJVE1BUCk7CisKKyAgICAgICAgLy8gTmVlZCB0byBtYWtlIGEgQ0dJbWFn
ZSBvdXQgb2YgdGhlIGJpdG1hcCdzIHBpeGVsIGJ1ZmZlciBhbmQgdGhlbiBkcmF3CisgICAgICAg
IC8vIGl0IGludG8gb3VyIGNvbnRleHQuCisgICAgICAgIEJJVE1BUCBpbmZvOworICAgICAgICBH
ZXRPYmplY3QoYml0bWFwLCBzaXplb2YoaW5mbyksICZpbmZvKTsKKyAgICAgICAgQVNTRVJUKGlu
Zm8uYm1CaXRzUGl4ZWwgPT0gMzIpOworCisgICAgICAgIENHQ29sb3JTcGFjZVJlZiBkZXZpY2VS
R0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKKyAgICAgICAgQ0dDb250ZXh0UmVm
IGJpdG1hcENvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUoaW5mby5ibUJpdHMsIGluZm8u
Ym1XaWR0aCwgaW5mby5ibUhlaWdodCwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJH
Qiwga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCAKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN1cHBvcnRBbHBoYUJsZW5kID8g
a0NHSW1hZ2VBbHBoYVByZW11bHRpcGxpZWRGaXJzdCA6IGtDR0ltYWdlQWxwaGFOb25lU2tpcEZp
cnN0KSk7CisgICAgICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKKworICAgICAg
ICBDR0ltYWdlUmVmIGltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlSW1hZ2UoYml0bWFwQ29u
dGV4dCk7CisgICAgICAgIENHQ29udGV4dERyYXdJbWFnZShtX2RhdGEtPm1fY2dDb250ZXh0LCBk
c3RSZWN0LCBpbWFnZSk7CisgICAgICAgIAorICAgICAgICAvLyBEZWxldGUgYWxsIG91ciBqdW5r
LgorICAgICAgICBDR0ltYWdlUmVsZWFzZShpbWFnZSk7CisgICAgICAgIENHQ29udGV4dFJlbGVh
c2UoYml0bWFwQ29udGV4dCk7CisgICAgICAgIDo6RGVsZXRlREMoaGRjKTsKKyAgICAgICAgOjpE
ZWxldGVPYmplY3QoYml0bWFwKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9k
YXRhLT5yZXN0b3JlKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRl
OjpzYXZlKCkKK3sKKyAgICBpZiAoIW1faGRjKQorICAgICAgICByZXR1cm47CisgICAgU2F2ZURD
KG1faGRjKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnJlc3Rv
cmUoKQoreworICAgIGlmICghbV9oZGMpCisgICAgICAgIHJldHVybjsKKyAgICBSZXN0b3JlREMo
bV9oZGMsIC0xKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNs
aXAoY29uc3QgSW50UmVjdCYgY2xpcFJlY3QpCit7CisgICAgaWYgKCFtX2hkYykKKyAgICAgICAg
cmV0dXJuOworICAgIEludGVyc2VjdENsaXBSZWN0KG1faGRjLCBjbGlwUmVjdC54KCksIGNsaXBS
ZWN0LnkoKSwgY2xpcFJlY3QucmlnaHQoKSwgY2xpcFJlY3QuYm90dG9tKCkpOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y2xpcChjb25zdCBQYXRoJikKK3sKKyAg
ICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZTo6c2NhbGUoY29uc3QgRmxvYXRTaXplJiBzaXplKQoreworICAgIGlmICghbV9oZGMpCisg
ICAgICAgIHJldHVybjsKKyAgICBYRk9STSB4Zm9ybTsKKyAgICB4Zm9ybS5lTTExID0gc2l6ZS53
aWR0aCgpOworICAgIHhmb3JtLmVNMTIgPSAwOworICAgIHhmb3JtLmVNMjEgPSAwOworICAgIHhm
b3JtLmVNMjIgPSBzaXplLmhlaWdodCgpOworICAgIHhmb3JtLmVEeCA9IDA7CisgICAgeGZvcm0u
ZUR5ID0gMDsKKyAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShtX2hkYywgJnhmb3JtLCBNV1RfTEVG
VE1VTFRJUExZKTsKK30KKworc3RhdGljIGNvbnN0IGRvdWJsZSBkZWcycmFkID0gMC4wMTc0NTMy
OTI1MTk5NDMyOTU3Njk7IC8vIHBpLzE4MAorCit2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3Jt
UHJpdmF0ZTo6cm90YXRlKGZsb2F0IGRlZ3JlZXNBbmdsZSkKK3sKKyAgICBmbG9hdCByYWRpYW5z
QW5nbGUgPSBkZWdyZWVzQW5nbGUgKiBkZWcycmFkOworICAgIGZsb2F0IGNvc0FuZ2xlID0gY29z
ZihyYWRpYW5zQW5nbGUpOworICAgIGZsb2F0IHNpbkFuZ2xlID0gc2luZihyYWRpYW5zQW5nbGUp
OworICAgIFhGT1JNIHhmb3JtOworICAgIHhmb3JtLmVNMTEgPSBjb3NBbmdsZTsKKyAgICB4Zm9y
bS5lTTEyID0gLXNpbkFuZ2xlOworICAgIHhmb3JtLmVNMjEgPSBzaW5BbmdsZTsKKyAgICB4Zm9y
bS5lTTIyID0gY29zQW5nbGU7CisgICAgeGZvcm0uZUR4ID0gMDsKKyAgICB4Zm9ybS5lRHkgPSAw
OworICAgIE1vZGlmeVdvcmxkVHJhbnNmb3JtKG1faGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQ
TFkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6dHJhbnNsYXRl
KGZsb2F0IHggLCBmbG9hdCB5KQoreworICAgIGlmICghbV9oZGMpCisgICAgICAgIHJldHVybjsK
KyAgICBYRk9STSB4Zm9ybTsKKyAgICB4Zm9ybS5lTTExID0gMS4wOworICAgIHhmb3JtLmVNMTIg
PSAwOworICAgIHhmb3JtLmVNMjEgPSAwOworICAgIHhmb3JtLmVNMjIgPSAxLjA7CisgICAgeGZv
cm0uZUR4ID0geDsKKyAgICB4Zm9ybS5lRHkgPSB5OworICAgIE1vZGlmeVdvcmxkVHJhbnNmb3Jt
KG1faGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdHJh
bnNmb3JtKQoreworICAgIGlmICghbV9oZGMpCisgICAgICAgIHJldHVybjsKKyAgICBDR0FmZmlu
ZVRyYW5zZm9ybSBtYXQgPSB0cmFuc2Zvcm07CisgICAgWEZPUk0geGZvcm07CisgICAgeGZvcm0u
ZU0xMSA9IG1hdC5hOworICAgIHhmb3JtLmVNMTIgPSBtYXQuYjsKKyAgICB4Zm9ybS5lTTIxID0g
bWF0LmM7CisgICAgeGZvcm0uZU0yMiA9IG1hdC5kOworICAgIHhmb3JtLmVEeCA9IG1hdC50eDsK
KyAgICB4Zm9ybS5lRHkgPSBtYXQudHk7CisgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMs
ICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpk
cmF3Rm9jdXNSaW5nKGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNh
YmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBmbG9hdCByYWRpdXMgPSAoZm9jdXNSaW5n
V2lkdGgoKSAtIDEpIC8gMi4wZjsKKyAgICBpbnQgb2Zmc2V0ID0gcmFkaXVzICsgZm9jdXNSaW5n
T2Zmc2V0KCk7CisgICAgQ0dDb2xvclJlZiBjb2xvclJlZiA9IGNvbG9yLmlzVmFsaWQoKSA/IGNn
Q29sb3IoY29sb3IpIDogMDsKKworICAgIENHTXV0YWJsZVBhdGhSZWYgZm9jdXNSaW5nUGF0aCA9
IENHUGF0aENyZWF0ZU11dGFibGUoKTsKKyAgICBjb25zdCBWZWN0b3I8SW50UmVjdD4mIHJlY3Rz
ID0gZm9jdXNSaW5nUmVjdHMoKTsKKyAgICB1bnNpZ25lZCByZWN0Q291bnQgPSByZWN0cy5zaXpl
KCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlY3RDb3VudDsgaSsrKQorICAgICAg
ICBDR1BhdGhBZGRSZWN0KGZvY3VzUmluZ1BhdGgsIDAsIENHUmVjdEluc2V0KHJlY3RzW2ldLCAt
b2Zmc2V0LCAtb2Zmc2V0KSk7CisKKyAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IHBsYXRmb3Jt
Q29udGV4dCgpOworICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7CisKKyAgICBDR0Nv
bnRleHRCZWdpblBhdGgoY29udGV4dCk7CisgICAgQ0dDb250ZXh0QWRkUGF0aChjb250ZXh0LCBm
b2N1c1JpbmdQYXRoKTsKKworICAgIHdrRHJhd0ZvY3VzUmluZyhjb250ZXh0LCBjb2xvclJlZiwg
cmFkaXVzKTsKKworICAgIENHQ29sb3JSZWxlYXNlKGNvbG9yUmVmKTsKKworICAgIENHUGF0aFJl
bGVhc2UoZm9jdXNSaW5nUGF0aCk7CisKKyAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRl
eHQpOworfQorCitzdGF0aWMgY29uc3QgQ29sb3ImIHNwZWxsaW5nUGF0dGVybkNvbG9yKCkgewor
ICAgIHN0YXRpYyBjb25zdCBDb2xvciBzcGVsbGluZ0NvbG9yKDI1NSwgMCwgMCk7CisgICAgcmV0
dXJuIHNwZWxsaW5nQ29sb3I7Cit9CisKK3N0YXRpYyBjb25zdCBDb2xvciYgZ3JhbW1hclBhdHRl
cm5Db2xvcigpIHsKKyAgICBzdGF0aWMgY29uc3QgQ29sb3IgZ3JhbW1hckNvbG9yKDAsIDEyOCwg
MCk7CisgICAgcmV0dXJuIGdyYW1tYXJDb2xvcjsKK30KKworLy8gUHVsbGVkIGZyb20gR3JhcGhp
Y3NDb250ZXh0Q0cKK3N0YXRpYyB2b2lkIHNldENHU3Ryb2tlQ29sb3IoQ0dDb250ZXh0UmVmIGNv
bnRleHQsIGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBDR0Zsb2F0IHJlZCwgZ3JlZW4sIGJs
dWUsIGFscGhhOworICAgIGNvbG9yLmdldFJHQkEocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwor
ICAgIENHQ29udGV4dFNldFJHQlN0cm9rZUNvbG9yKGNvbnRleHQsIHJlZCwgZ3JlZW4sIGJsdWUs
IGFscGhhKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yTWlzc3BlbGxp
bmdPckJhZEdyYW1tYXIoY29uc3QgSW50UG9pbnQmIHBvaW50LCBpbnQgd2lkdGgsIGJvb2wgZ3Jh
bW1hcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47Cisg
ICAgCisgICAgLy8gVGhlc2UgYXJlIHRoZSBzYW1lIGZvciBtaXNzcGVsbGluZyBvciBiYWQgZ3Jh
bW1hcgorICAgIGNvbnN0IGludCBwYXR0ZXJuSGVpZ2h0ID0gMzsgLy8gMyByb3dzCisgICAgQVNT
RVJUKGNNaXNzcGVsbGluZ0xpbmVUaGlja25lc3MgPT0gcGF0dGVybkhlaWdodCk7CisgICAgY29u
c3QgaW50IHBhdHRlcm5XaWR0aCA9IDQ7IC8vIDQgcGl4ZWxzCisgICAgQVNTRVJUKHBhdHRlcm5X
aWR0aCA9PSBjTWlzc3BlbGxpbmdMaW5lUGF0dGVybldpZHRoKTsKKworICAgIC8vIE1ha2Ugc3Vy
ZSB0byBkcmF3IG9ubHkgY29tcGxldGUgZG90cy4KKyAgICAvLyBOT1RFOiBDb2RlIGhlcmUgdXNl
ZCB0byBzaGlmdCB0aGUgdW5kZXJsaW5lIHRvIHRoZSBsZWZ0IGFuZCBpbmNyZWFzZSB0aGUgd2lk
dGgKKyAgICAvLyB0byBtYWtlIHN1cmUgZXZlcnl0aGluZyBnZXRzIHVuZGVybGluZWQsIGJ1dCB0
aGF0IHJlc3VsdHMgaW4gZHJhd2luZyBvdXQgb2YKKyAgICAvLyBib3VuZHMgKGUuZy4gd2hlbiBh
dCB0aGUgZWRnZSBvZiBhIHZpZXcpIGFuZCBjb3VsZCBtYWtlIGl0IGFwcGVhciB0aGF0IHRoZQor
ICAgIC8vIHNwYWNlIGJldHdlZW4gYWRqYWNlbnQgbWlzc3BlbGxlZCB3b3JkcyB3YXMgdW5kZXJs
aW5lZC4KKyAgICAvLyBhbGxvdyBzbGlnaHRseSBtb3JlIGNvbnNpZGVyaW5nIHRoYXQgdGhlIHBh
dHRlcm4gZW5kcyB3aXRoIGEgdHJhbnNwYXJlbnQgcGl4ZWwKKyAgICBpbnQgd2lkdGhNb2QgPSB3
aWR0aCAlIHBhdHRlcm5XaWR0aDsKKyAgICBpZiAocGF0dGVybldpZHRoIC0gd2lkdGhNb2QgPiBj
TWlzc3BlbGxpbmdMaW5lUGF0dGVybkdhcFdpZHRoKQorICAgICAgICB3aWR0aCAtPSB3aWR0aE1v
ZDsKKyAgICAgIAorICAgIC8vIERyYXcgdGhlIHVuZGVybGluZQorICAgIENHQ29udGV4dFJlZiBj
b250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCk7CisgICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShjb250
ZXh0KTsKKworICAgIGNvbnN0IENvbG9yJiBwYXR0ZXJuQ29sb3IgPSBncmFtbWFyID8gZ3JhbW1h
clBhdHRlcm5Db2xvcigpIDogc3BlbGxpbmdQYXR0ZXJuQ29sb3IoKTsKKyAgICBzZXRDR1N0cm9r
ZUNvbG9yKGNvbnRleHQsIHBhdHRlcm5Db2xvcik7CisKKyAgICB3a1NldFBhdHRlcm5QaGFzZUlu
VXNlclNwYWNlKGNvbnRleHQsIHBvaW50KTsKKyAgICBDR0NvbnRleHRTZXRCbGVuZE1vZGUoY29u
dGV4dCwga0NHQmxlbmRNb2RlTm9ybWFsKTsKKyAgICAKKyAgICAvLyAzIHJvd3MsIGVhY2ggb2Zm
c2V0IGJ5IGhhbGYgYSBwaXhlbCBmb3IgYmxlbmRpbmcgcHVycG9zZXMKKyAgICBjb25zdCBDR1Bv
aW50IHVwcGVyUG9pbnRzIFtdID0ge3twb2ludC54KCksIHBvaW50LnkoKSArIHBhdHRlcm5IZWln
aHQgLSAyLjUgfSwge3BvaW50LngoKSArIHdpZHRoLCBwb2ludC55KCkgKyBwYXR0ZXJuSGVpZ2h0
IC0gMi41fX07CisgICAgY29uc3QgQ0dQb2ludCBtaWRkbGVQb2ludHMgW10gPSB7e3BvaW50Lngo
KSwgcG9pbnQueSgpICsgcGF0dGVybkhlaWdodCAtIDEuNSB9LCB7cG9pbnQueCgpICsgd2lkdGgs
IHBvaW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAxLjV9fTsKKyAgICBjb25zdCBDR1BvaW50IGxv
d2VyUG9pbnRzIFtdID0ge3twb2ludC54KCksIHBvaW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAw
LjUgfSwge3BvaW50LngoKSArIHdpZHRoLCBwb2ludC55KCkgKyBwYXR0ZXJuSGVpZ2h0IC0gMC41
IH19OworICAgIAorICAgIC8vIERhc2ggbGVuZ3RocyBmb3IgdGhlIHRvcCBhbmQgYm90dG9tIG9m
IHRoZSBlcnJvciB1bmRlcmxpbmUgYXJlIHRoZSBzYW1lLgorICAgIC8vIFRoZXNlIGFyZSBtYWdp
Yy4KKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgZWRnZV9kYXNoX2xlbmd0aHNbXSA9IHsyLCAyfTsK
KyAgICBzdGF0aWMgY29uc3QgZmxvYXQgbWlkZGxlX2Rhc2hfbGVuZ3Roc1tdID0gezIuNzZmLCAx
LjI0Zn07CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGVkZ2Vfb2Zmc2V0ID0gLShlZGdlX2Rhc2hf
bGVuZ3Roc1sxXSAtIDEuMGYpIC8gMi4wZjsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgbWlkZGxl
X29mZnNldCA9IC0obWlkZGxlX2Rhc2hfbGVuZ3Roc1sxXSAtIDEuMGYpIC8gMi4wZjsKKworICAg
IC8vIExpbmUgb3BhY2l0aWVzLiAgT25jZSBhZ2FpbiwgdGhlc2UgYXJlIG1hZ2ljLgorICAgIGNv
bnN0IGZsb2F0IHVwcGVyT3BhY2l0eSA9IDAuMzNmOworICAgIGNvbnN0IGZsb2F0IG1pZGRsZU9w
YWNpdHkgPSAwLjc1ZjsKKyAgICBjb25zdCBmbG9hdCBsb3dlck9wYWNpdHkgPSAwLjg4ZjsKKwor
ICAgIC8vVG9wIGxpbmUKKyAgICBDR0NvbnRleHRTZXRMaW5lRGFzaChjb250ZXh0LCBlZGdlX29m
ZnNldCwgZWRnZV9kYXNoX2xlbmd0aHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVv
ZihlZGdlX2Rhc2hfbGVuZ3RocykgLyBzaXplb2YoZWRnZV9kYXNoX2xlbmd0aHNbMF0pKTsKKyAg
ICBDR0NvbnRleHRTZXRBbHBoYShjb250ZXh0LCB1cHBlck9wYWNpdHkpOworICAgIENHQ29udGV4
dFN0cm9rZUxpbmVTZWdtZW50cyhjb250ZXh0LCB1cHBlclBvaW50cywgMik7CisgCisgICAgLy8g
TWlkZGxlIGxpbmUKKyAgICBDR0NvbnRleHRTZXRMaW5lRGFzaChjb250ZXh0LCBtaWRkbGVfb2Zm
c2V0LCBtaWRkbGVfZGFzaF9sZW5ndGhzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXpl
b2YobWlkZGxlX2Rhc2hfbGVuZ3RocykgLyBzaXplb2YobWlkZGxlX2Rhc2hfbGVuZ3Roc1swXSkp
OworICAgIENHQ29udGV4dFNldEFscGhhKGNvbnRleHQsIG1pZGRsZU9wYWNpdHkpOworICAgIENH
Q29udGV4dFN0cm9rZUxpbmVTZWdtZW50cyhjb250ZXh0LCBtaWRkbGVQb2ludHMsIDIpOworICAg
IAorICAgIC8vIEJvdHRvbSBsaW5lCisgICAgQ0dDb250ZXh0U2V0TGluZURhc2goY29udGV4dCwg
ZWRnZV9vZmZzZXQsIGVkZ2VfZGFzaF9sZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAg
IHNpemVvZihlZGdlX2Rhc2hfbGVuZ3RocykgLyBzaXplb2YoZWRnZV9kYXNoX2xlbmd0aHNbMF0p
KTsKKyAgICBDR0NvbnRleHRTZXRBbHBoYShjb250ZXh0LCBsb3dlck9wYWNpdHkpOworICAgIENH
Q29udGV4dFN0cm9rZUxpbmVTZWdtZW50cyhjb250ZXh0LCBsb3dlclBvaW50cywgMik7CisKKyAg
ICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOworfQorCisjaWYgRU5BQkxFKFNWRykK
K0dyYXBoaWNzQ29udGV4dCogY29udGV4dEZvckltYWdlKFNWR1Jlc291cmNlSW1hZ2UqKQorewor
ICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBnbyBpbiBHcmFwaGljc0NvbnRleHRDRy5jcHAKKyAg
ICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKK30KSW5kZXg6
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENHV2luLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRl
eHRDR1dpbi5jcHAJKHJldmlzaW9uIDI5NzI2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW4vR3JhcGhpY3NDb250ZXh0Q0dXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEs
NSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIw
MDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yOSwyMSArMjksMTggQEAKICNp
bmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgog
I2luY2x1ZGUgIlBhdGguaCIKKwogI2luY2x1ZGUgPENvcmVHcmFwaGljcy9DR0JpdG1hcENvbnRl
eHQuaD4KICNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJm
YWNlLmg+Ci0jaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KLQogI2luY2x1ZGUgIkdyYXBoaWNz
Q29udGV4dFBsYXRmb3JtUHJpdmF0ZS5oIgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCiBuYW1l
c3BhY2UgV2ViQ29yZSB7CiAKLWNsYXNzIFNWR1Jlc291cmNlSW1hZ2U7Ci0KIHN0YXRpYyBDR0Nv
bnRleHRSZWYgQ0dDb250ZXh0V2l0aEhEQyhIREMgaGRjKQogewotICAgIEhCSVRNQVAgYml0bWFw
ID0gKEhCSVRNQVApR2V0Q3VycmVudE9iamVjdChoZGMsIE9CSl9CSVRNQVApOworICAgIEhCSVRN
QVAgYml0bWFwID0gc3RhdGljX2Nhc3Q8SEJJVE1BUD4oR2V0Q3VycmVudE9iamVjdChoZGMsIE9C
Sl9CSVRNQVApKTsKICAgICBDR0NvbG9yU3BhY2VSZWYgZGV2aWNlUkdCID0gQ0dDb2xvclNwYWNl
Q3JlYXRlRGV2aWNlUkdCKCk7CiAgICAgQklUTUFQIGluZm87CiAKQEAgLTExOCwxMCArMTE1LDEw
IEBAIEhEQyBHcmFwaGljc0NvbnRleHQ6OmdldFdpbmRvd3NDb250ZXh0KGMKIAogICAgICAgICAv
LyBBcHBseSBhIHRyYW5zbGF0aW9uIHRvIG91ciBjb250ZXh0IHNvIHRoYXQgdGhlIGRyYXdpbmcg
ZG9uZSB3aWxsIGJlIGF0ICgwLDApIG9mIHRoZSBiaXRtYXAuCiAgICAgICAgIFhGT1JNIHhmb3Jt
OwotICAgICAgICB4Zm9ybS5lTTExID0gMS4wOwotICAgICAgICB4Zm9ybS5lTTEyID0gMDsKLSAg
ICAgICAgeGZvcm0uZU0yMSA9IDA7Ci0gICAgICAgIHhmb3JtLmVNMjIgPSAxLjA7CisgICAgICAg
IHhmb3JtLmVNMTEgPSAxLjBmOworICAgICAgICB4Zm9ybS5lTTEyID0gMC4wZjsKKyAgICAgICAg
eGZvcm0uZU0yMSA9IDAuMGY7CisgICAgICAgIHhmb3JtLmVNMjIgPSAxLjBmOwogICAgICAgICB4
Zm9ybS5lRHggPSAtZHN0UmVjdC54KCk7CiAgICAgICAgIHhmb3JtLmVEeSA9IC1kc3RSZWN0Lnko
KTsKICAgICAgICAgOjpTZXRXb3JsZFRyYW5zZm9ybShiaXRtYXBEQywgJnhmb3JtKTsKQEAgLTEz
NCwxNSArMTMxLDEzIEBAIEhEQyBHcmFwaGljc0NvbnRleHQ6OmdldFdpbmRvd3NDb250ZXh0KGMK
ICAgICByZXR1cm4gbV9kYXRhLT5tX2hkYzsKIH0KIAotYm9vbCBHcmFwaGljc0NvbnRleHQ6Omlu
VHJhbnNwYXJlbmN5TGF5ZXIoKSBjb25zdCB7IHJldHVybiBtX2RhdGEtPm1fdHJhbnNwYXJlbmN5
Q291bnQ7IH0KLQogdm9pZCBHcmFwaGljc0NvbnRleHQ6OnJlbGVhc2VXaW5kb3dzQ29udGV4dChI
REMgaGRjLCBjb25zdCBJbnRSZWN0JiBkc3RSZWN0LCBib29sIHN1cHBvcnRBbHBoYUJsZW5kKQog
ewogICAgIGlmIChoZGMgJiYgaW5UcmFuc3BhcmVuY3lMYXllcigpKSB7CiAgICAgICAgIGlmIChk
c3RSZWN0LmlzRW1wdHkoKSkKICAgICAgICAgICAgIHJldHVybjsKIAotICAgICAgICBIQklUTUFQ
IGJpdG1hcCA9IChIQklUTUFQKUdldEN1cnJlbnRPYmplY3QoaGRjLCBPQkpfQklUTUFQKTsKKyAg
ICAgICAgSEJJVE1BUCBiaXRtYXAgPSBzdGF0aWNfY2FzdDxIQklUTUFQPihHZXRDdXJyZW50T2Jq
ZWN0KGhkYywgT0JKX0JJVE1BUCkpOwogCiAgICAgICAgIC8vIE5lZWQgdG8gbWFrZSBhIENHSW1h
Z2Ugb3V0IG9mIHRoZSBiaXRtYXAncyBwaXhlbCBidWZmZXIgYW5kIHRoZW4gZHJhdwogICAgICAg
ICAvLyBpdCBpbnRvIG91ciBjb250ZXh0LgpAQCAtMjAzLDExICsxOTgsMTEgQEAgdm9pZCBHcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnNjYQogICAgICAgICByZXR1cm47CiAgICAgWEZP
Uk0geGZvcm07CiAgICAgeGZvcm0uZU0xMSA9IHNpemUud2lkdGgoKTsKLSAgICB4Zm9ybS5lTTEy
ID0gMDsKLSAgICB4Zm9ybS5lTTIxID0gMDsKKyAgICB4Zm9ybS5lTTEyID0gMC4wZjsKKyAgICB4
Zm9ybS5lTTIxID0gMC4wZjsKICAgICB4Zm9ybS5lTTIyID0gc2l6ZS5oZWlnaHQoKTsKLSAgICB4
Zm9ybS5lRHggPSAwOwotICAgIHhmb3JtLmVEeSA9IDA7CisgICAgeGZvcm0uZUR4ID0gMC4wZjsK
KyAgICB4Zm9ybS5lRHkgPSAwLjBmOwogICAgIE1vZGlmeVdvcmxkVHJhbnNmb3JtKG1faGRjLCAm
eGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOwogfQogCkBAIC0yMjMsOCArMjE4LDggQEAgdm9pZCBH
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnJvdAogICAgIHhmb3JtLmVNMTIgPSAtc2lu
QW5nbGU7CiAgICAgeGZvcm0uZU0yMSA9IHNpbkFuZ2xlOwogICAgIHhmb3JtLmVNMjIgPSBjb3NB
bmdsZTsKLSAgICB4Zm9ybS5lRHggPSAwOwotICAgIHhmb3JtLmVEeSA9IDA7CisgICAgeGZvcm0u
ZUR4ID0gMC4wZjsKKyAgICB4Zm9ybS5lRHkgPSAwLjBmOwogICAgIE1vZGlmeVdvcmxkVHJhbnNm
b3JtKG1faGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOwogfQogCkBAIC0yMzMsMTAgKzIy
OCwxMCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6dHJhCiAgICAgaWYg
KCFtX2hkYykKICAgICAgICAgcmV0dXJuOwogICAgIFhGT1JNIHhmb3JtOwotICAgIHhmb3JtLmVN
MTEgPSAxLjA7Ci0gICAgeGZvcm0uZU0xMiA9IDA7Ci0gICAgeGZvcm0uZU0yMSA9IDA7Ci0gICAg
eGZvcm0uZU0yMiA9IDEuMDsKKyAgICB4Zm9ybS5lTTExID0gMS4wZjsKKyAgICB4Zm9ybS5lTTEy
ID0gMC4wZjsKKyAgICB4Zm9ybS5lTTIxID0gMC4wZjsKKyAgICB4Zm9ybS5lTTIyID0gMS4wZjsK
ICAgICB4Zm9ybS5lRHggPSB4OwogICAgIHhmb3JtLmVEeSA9IHk7CiAgICAgTW9kaWZ5V29ybGRU
cmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7CkBAIC0yNDYsNiArMjQx
LDcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNvbgogewogICAgIGlm
ICghbV9oZGMpCiAgICAgICAgIHJldHVybjsKKwogICAgIENHQWZmaW5lVHJhbnNmb3JtIG1hdCA9
IHRyYW5zZm9ybTsKICAgICBYRk9STSB4Zm9ybTsKICAgICB4Zm9ybS5lTTExID0gbWF0LmE7CkBA
IC0yNTQsNiArMjUwLDcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNv
bgogICAgIHhmb3JtLmVNMjIgPSBtYXQuZDsKICAgICB4Zm9ybS5lRHggPSBtYXQudHg7CiAgICAg
eGZvcm0uZUR5ID0gbWF0LnR5OworCiAgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4
Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7CiB9CiAKQEAgLTI4Nyw2ICsyODQsMTQgQEAgdm9pZCBH
cmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1c1JpbmcoY29ucwogICAgIENHQ29udGV4dFJlc3RvcmVH
U3RhdGUoY29udGV4dCk7CiB9CiAKKy8vIFB1bGxlZCBmcm9tIEdyYXBoaWNzQ29udGV4dENHCitz
dGF0aWMgdm9pZCBzZXRDR1N0cm9rZUNvbG9yKENHQ29udGV4dFJlZiBjb250ZXh0LCBjb25zdCBD
b2xvciYgY29sb3IpCit7CisgICAgQ0dGbG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKKyAg
ICBjb2xvci5nZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAgICBDR0NvbnRleHRT
ZXRSR0JTdHJva2VDb2xvcihjb250ZXh0LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Cit9CisK
IHN0YXRpYyBjb25zdCBDb2xvciYgc3BlbGxpbmdQYXR0ZXJuQ29sb3IoKSB7CiAgICAgc3RhdGlj
IGNvbnN0IENvbG9yIHNwZWxsaW5nQ29sb3IoMjU1LCAwLCAwKTsKICAgICByZXR1cm4gc3BlbGxp
bmdDb2xvcjsKQEAgLTI5NywxOSArMzAyLDExIEBAIHN0YXRpYyBjb25zdCBDb2xvciYgZ3JhbW1h
clBhdHRlcm5Db2xvcigKICAgICByZXR1cm4gZ3JhbW1hckNvbG9yOwogfQogCi0vLyBQdWxsZWQg
ZnJvbSBHcmFwaGljc0NvbnRleHRDRwotc3RhdGljIHZvaWQgc2V0Q0dTdHJva2VDb2xvcihDR0Nv
bnRleHRSZWYgY29udGV4dCwgY29uc3QgQ29sb3ImIGNvbG9yKQotewotICAgIENHRmxvYXQgcmVk
LCBncmVlbiwgYmx1ZSwgYWxwaGE7Ci0gICAgY29sb3IuZ2V0UkdCQShyZWQsIGdyZWVuLCBibHVl
LCBhbHBoYSk7Ci0gICAgQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IoY29udGV4dCwgcmVkLCBn
cmVlbiwgYmx1ZSwgYWxwaGEpOwotfQotCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVG
b3JNaXNzcGVsbGluZ09yQmFkR3JhbW1hcihjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCB3aWR0
aCwgYm9vbCBncmFtbWFyKQogewogICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCiAgICAgICAg
IHJldHVybjsKLSAgICAKKwogICAgIC8vIFRoZXNlIGFyZSB0aGUgc2FtZSBmb3IgbWlzc3BlbGxp
bmcgb3IgYmFkIGdyYW1tYXIKICAgICBjb25zdCBpbnQgcGF0dGVybkhlaWdodCA9IDM7IC8vIDMg
cm93cwogICAgIEFTU0VSVChjTWlzc3BlbGxpbmdMaW5lVGhpY2tuZXNzID09IHBhdHRlcm5IZWln
aHQpOwpAQCAtMzQzLDcgKzM0MCw3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZv
ck1pc3NwZWwKICAgICAKICAgICAvLyBEYXNoIGxlbmd0aHMgZm9yIHRoZSB0b3AgYW5kIGJvdHRv
bSBvZiB0aGUgZXJyb3IgdW5kZXJsaW5lIGFyZSB0aGUgc2FtZS4KICAgICAvLyBUaGVzZSBhcmUg
bWFnaWMuCi0gICAgc3RhdGljIGNvbnN0IGZsb2F0IGVkZ2VfZGFzaF9sZW5ndGhzW10gPSB7Miwg
Mn07CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGVkZ2VfZGFzaF9sZW5ndGhzW10gPSB7Mi4wZiwg
Mi4wZn07CiAgICAgc3RhdGljIGNvbnN0IGZsb2F0IG1pZGRsZV9kYXNoX2xlbmd0aHNbXSA9IHsy
Ljc2ZiwgMS4yNGZ9OwogICAgIHN0YXRpYyBjb25zdCBmbG9hdCBlZGdlX29mZnNldCA9IC0oZWRn
ZV9kYXNoX2xlbmd0aHNbMV0gLSAxLjBmKSAvIDIuMGY7CiAgICAgc3RhdGljIGNvbnN0IGZsb2F0
IG1pZGRsZV9vZmZzZXQgPSAtKG1pZGRsZV9kYXNoX2xlbmd0aHNbMV0gLSAxLjBmKSAvIDIuMGY7
CkBAIC0zNzQsMTMgKzM3MSw0IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvck1p
c3NwZWwKICAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOwogfQogCi0jaWYgRU5B
QkxFKFNWRykKLUdyYXBoaWNzQ29udGV4dCogY29udGV4dEZvckltYWdlKFNWR1Jlc291cmNlSW1h
Z2UqKQotewotICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBnbyBpbiBHcmFwaGljc0NvbnRleHRD
Ry5jcHAKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotICAgIHJldHVybiAwOwotfQotI2VuZGlmCi0K
IH0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENh
aXJvV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9H
cmFwaGljc0NvbnRleHRDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorCisjaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCisj
aW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQYXRoLmgiCisKKyNpbmNsdWRl
IDxjYWlyby13aW4zMi5oPgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0
ZS5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0dy
YXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0KEhEQyBkYykKKyAgICA6IG1fY29tbW9uKGNy
ZWF0ZUdyYXBoaWNzQ29udGV4dFByaXZhdGUoKSkKKyAgICAsIG1fZGF0YShuZXcgR3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlKQoreworICAgIGlmIChkYykgeworICAgICAgICBjYWlyb19z
dXJmYWNlX3QqIHN1cmZhY2UgPSBjYWlyb193aW4zMl9zdXJmYWNlX2NyZWF0ZShkYyk7CisgICAg
ICAgIG1fZGF0YS0+Y3IgPSBjYWlyb19jcmVhdGUoc3VyZmFjZSk7CisJbV9kYXRhLT5tX2hkYyA9
IGRjOworICAgIH0gZWxzZSB7CisgICAgICAgIHNldFBhaW50aW5nRGlzYWJsZWQodHJ1ZSk7Cisg
ICAgICAgIG1fZGF0YS0+Y3IgPSAwOworCW1fZGF0YS0+bV9oZGMgPSAwOworICAgIH0KKworICAg
IGlmIChtX2RhdGEtPmNyKSB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGV4dCBzdGFy
dHMgaW4gc3luYyB3aXRoIG91ciBzdGF0ZS4KKyAgICAgICAgc2V0UGxhdGZvcm1GaWxsQ29sb3Io
ZmlsbENvbG9yKCkpOworICAgICAgICBzZXRQbGF0Zm9ybVN0cm9rZUNvbG9yKHN0cm9rZUNvbG9y
KCkpOworICAgIH0KK30KKworSERDIEdyYXBoaWNzQ29udGV4dDo6Z2V0V2luZG93c0NvbnRleHQo
Y29uc3QgSW50UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVuZCkKK3sKKyAgICAv
LyBUaGlzIGlzIHByb2JhYmx5IHdyb25nLCBhbmQgZGVmaW5pdGVseSBvdXQgb2YgZGF0ZS4gIFB1
bGxlZCBmcm9tIG9sZCBTVk4KKyAgICBjYWlyb19zdXJmYWNlX3QqIHN1cmZhY2UgPSBjYWlyb19n
ZXRfdGFyZ2V0KHBsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBIREMgaGRjID0gY2Fpcm9fd2luMzJf
c3VyZmFjZV9nZXRfZGMoc3VyZmFjZSk7ICAgCisgICAgU2F2ZURDKGhkYyk7CisKKyAgICAvLyBG
SVhNRTogV2UgbmVlZCB0byBtYWtlIHN1cmUgYSBjbGlwIGlzIHJlYWxseSBzZXQgb24gdGhlIEhE
Qy4KKyAgICAvLyBDYWxsIFNldFdvcmxkVHJhbnNmb3JtIHRvIGhvbm9yIHRoZSBjdXJyZW50IENh
aXJvIHRyYW5zZm9ybS4KKyAgICBTZXRHcmFwaGljc01vZGUoaGRjLCBHTV9BRFZBTkNFRCk7IC8v
IFdlIG5lZWQgdGhpcyBjYWxsIGZvciB0aGVtZXMgdG8gaG9ub3Igd29ybGQgdHJhbnNmb3Jtcy4K
KyAgICBjYWlyb19tYXRyaXhfdCBtYXQ7CisgICAgY2Fpcm9fZ2V0X21hdHJpeChwbGF0Zm9ybUNv
bnRleHQoKSwgJm1hdCk7CisgICAgWEZPUk0geGZvcm07CisgICAgeGZvcm0uZU0xMSA9IG1hdC54
eDsKKyAgICB4Zm9ybS5lTTEyID0gbWF0Lnh5OworICAgIHhmb3JtLmVNMjEgPSBtYXQueXg7Cisg
ICAgeGZvcm0uZU0yMiA9IG1hdC55eTsKKyAgICB4Zm9ybS5lRHggPSBtYXQueDA7CisgICAgeGZv
cm0uZUR5ID0gbWF0LnkwOworICAgIFNldFdvcmxkVHJhbnNmb3JtKGhkYywgJnhmb3JtKTsKKwor
ICAgIHJldHVybiBoZGM7Cit9CisKK2Jvb2wgR3JhcGhpY3NDb250ZXh0OjppblRyYW5zcGFyZW5j
eUxheWVyKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLT5tX3RyYW5zcGFyZW5jeUNvdW50OyB9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpyZWxlYXNlV2luZG93c0NvbnRleHQoSERDIGhkYywgY29u
c3QgSW50UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVuZCkKK3sKKyAgICBjYWly
b19zdXJmYWNlX3QqIHN1cmZhY2UgPSBjYWlyb19nZXRfdGFyZ2V0KHBsYXRmb3JtQ29udGV4dCgp
KTsKKyAgICBIREMgaGRjMiA9IGNhaXJvX3dpbjMyX3N1cmZhY2VfZ2V0X2RjKHN1cmZhY2UpOwor
ICAgIFJlc3RvcmVEQyhoZGMyLCAtMSk7CisgICAgY2Fpcm9fc3VyZmFjZV9tYXJrX2RpcnR5KHN1
cmZhY2UpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y29uY2F0Q1RNKGNvbnN0IEFmZmlu
ZVRyYW5zZm9ybSYgdHJhbnNmb3JtKQoreworICAgIGNhaXJvX3N1cmZhY2VfdCogc3VyZmFjZSA9
IGNhaXJvX2dldF90YXJnZXQocGxhdGZvcm1Db250ZXh0KCkpOworICAgIEhEQyBoZGMgPSBjYWly
b193aW4zMl9zdXJmYWNlX2dldF9kYyhzdXJmYWNlKTsgICAKKyAgICBTYXZlREMoaGRjKTsKKwor
ICAgIGNhaXJvX21hdHJpeF90IG1hdDsKKyAgICBjYWlyb19nZXRfbWF0cml4KHBsYXRmb3JtQ29u
dGV4dCgpLCAmbWF0KTsKKyAgICBYRk9STSB4Zm9ybTsKKyAgICB4Zm9ybS5lTTExID0gbWF0Lnh4
OworICAgIHhmb3JtLmVNMTIgPSBtYXQueHk7CisgICAgeGZvcm0uZU0yMSA9IG1hdC55eDsKKyAg
ICB4Zm9ybS5lTTIyID0gbWF0Lnl5OworICAgIHhmb3JtLmVEeCA9IG1hdC54MDsKKyAgICB4Zm9y
bS5lRHkgPSBtYXQueTA7CisKKyAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShoZGMsICZ4Zm9ybSwg
TVdUX0xFRlRNVUxUSVBMWSk7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0dyYXBoaWNzQ29udGV4dFdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0V2luLmNwcAkocmV2aXNpb24gMjk4MzQp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRXaW4uY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAw
MywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCkBAIC0yOSw4ICsyOSw2IEBACiAjaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCiAjaW5j
bHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRlICJQYXRoLmgiCi0jaW5jbHVkZSA8Q29y
ZUdyYXBoaWNzL0NHQml0bWFwQ29udGV4dC5oPgotI2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVy
ZmFjZS9XZWJLaXRTeXN0ZW1JbnRlcmZhY2UuaD4KICNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5o
PgogCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmgiCkBAIC00MSwz
MzkgKzM5LDggQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiBjbGFzcyBTVkdSZXNvdXJjZUltYWdl
OwogCi1zdGF0aWMgQ0dDb250ZXh0UmVmIENHQ29udGV4dFdpdGhIREMoSERDIGhkYykKLXsKLSAg
ICBIQklUTUFQIGJpdG1hcCA9IChIQklUTUFQKUdldEN1cnJlbnRPYmplY3QoaGRjLCBPQkpfQklU
TUFQKTsKLSAgICBDR0NvbG9yU3BhY2VSZWYgZGV2aWNlUkdCID0gQ0dDb2xvclNwYWNlQ3JlYXRl
RGV2aWNlUkdCKCk7Ci0gICAgQklUTUFQIGluZm87Ci0KLSAgICBHZXRPYmplY3QoYml0bWFwLCBz
aXplb2YoaW5mbyksICZpbmZvKTsKLSAgICBBU1NFUlQoaW5mby5ibUJpdHNQaXhlbCA9PSAzMik7
Ci0gICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUoaW5mby5i
bUJpdHMsIGluZm8uYm1XaWR0aCwgaW5mby5ibUhlaWdodCwgOCwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmJtV2lkdGhCeXRlcywgZGV2aWNl
UkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFOb25lU2tpcEZp
cnN0KTsKLSAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKGRldmljZVJHQik7Ci0KLSAgICAvLyBGbGlw
IGNvb3JkcwotICAgIENHQ29udGV4dFRyYW5zbGF0ZUNUTShjb250ZXh0LCAwLCBpbmZvLmJtSGVp
Z2h0KTsKLSAgICBDR0NvbnRleHRTY2FsZUNUTShjb250ZXh0LCAxLCAtMSk7Ci0gICAgCi0gICAg
Ly8gUHV0IHRoZSBIREMgSW4gYWR2YW5jZWQgbW9kZSBzbyBpdCB3aWxsIGhvbm9yIGFmZmluZSB0
cmFuc2Zvcm1zLgotICAgIFNldEdyYXBoaWNzTW9kZShoZGMsIEdNX0FEVkFOQ0VEKTsKLSAgICAK
LSAgICByZXR1cm4gY29udGV4dDsKLX0KLQotR3JhcGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRl
eHQoSERDIGhkYykKLSAgICA6IG1fY29tbW9uKGNyZWF0ZUdyYXBoaWNzQ29udGV4dFByaXZhdGUo
KSkKLSAgICAsIG1fZGF0YShuZXcgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKENHQ29u
dGV4dFdpdGhIREMoaGRjKSkpCi17Ci0gICAgQ0dDb250ZXh0UmVsZWFzZShtX2RhdGEtPm1fY2dD
b250ZXh0KTsKLSAgICBtX2RhdGEtPm1faGRjID0gaGRjOwotICAgIHNldFBhaW50aW5nRGlzYWJs
ZWQoIW1fZGF0YS0+bV9jZ0NvbnRleHQpOwotICAgIGlmIChtX2RhdGEtPm1fY2dDb250ZXh0KSB7
Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGV4dCBzdGFydHMgaW4gc3luYyB3aXRoIG91
ciBzdGF0ZS4KLSAgICAgICAgc2V0UGxhdGZvcm1GaWxsQ29sb3IoZmlsbENvbG9yKCkpOwotICAg
ICAgICBzZXRQbGF0Zm9ybVN0cm9rZUNvbG9yKHN0cm9rZUNvbG9yKCkpOwotICAgIH0KLX0KLQot
SERDIEdyYXBoaWNzQ29udGV4dDo6Z2V0V2luZG93c0NvbnRleHQoY29uc3QgSW50UmVjdCYgZHN0
UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVuZCkKLXsKLSAgICBpZiAoaW5UcmFuc3BhcmVuY3lM
YXllcigpKSB7Ci0gICAgICAgIGlmIChkc3RSZWN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJl
dHVybiAwOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIGJpdG1hcCBEQyBpbiB3aGljaCB0byBkcmF3
LgotICAgICAgICBCSVRNQVBJTkZPIGJpdG1hcEluZm87Ci0gICAgICAgIGJpdG1hcEluZm8uYm1p
SGVhZGVyLmJpU2l6ZSAgICAgICAgICA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKLSAgICAg
ICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlXaWR0aCAgICAgICAgID0gZHN0UmVjdC53aWR0aCgp
OyAKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlIZWlnaHQgICAgICAgID0gZHN0UmVj
dC5oZWlnaHQoKTsKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlQbGFuZXMgICAgICAg
ID0gMTsKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlCaXRDb3VudCAgICAgID0gMzI7
Ci0gICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpQ29tcHJlc3Npb24gICA9IEJJX1JHQjsK
LSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlTaXplSW1hZ2UgICAgID0gMDsKLSAgICAg
ICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlYUGVsc1Blck1ldGVyID0gMDsKLSAgICAgICAgYml0
bWFwSW5mby5ibWlIZWFkZXIuYmlZUGVsc1Blck1ldGVyID0gMDsKLSAgICAgICAgYml0bWFwSW5m
by5ibWlIZWFkZXIuYmlDbHJVc2VkICAgICAgID0gMDsKLSAgICAgICAgYml0bWFwSW5mby5ibWlI
ZWFkZXIuYmlDbHJJbXBvcnRhbnQgID0gMDsKLQotICAgICAgICB2b2lkKiBwaXhlbHMgPSAwOwot
ICAgICAgICBIQklUTUFQIGJpdG1hcCA9IDo6Q3JlYXRlRElCU2VjdGlvbihOVUxMLCAmYml0bWFw
SW5mbywgRElCX1JHQl9DT0xPUlMsICZwaXhlbHMsIDAsIDApOwotICAgICAgICBpZiAoIWJpdG1h
cCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIEhEQyBiaXRtYXBEQyA9IDo6Q3Jl
YXRlQ29tcGF0aWJsZURDKG1fZGF0YS0+bV9oZGMpOwotICAgICAgICA6OlNlbGVjdE9iamVjdChi
aXRtYXBEQywgYml0bWFwKTsKLQotICAgICAgICAvLyBGaWxsIG91ciBidWZmZXIgd2l0aCBjbGVh
ciBpZiB3ZSdyZSBnb2luZyB0byBhbHBoYSBibGVuZC4KLSAgICAgICAgaWYgKHN1cHBvcnRBbHBo
YUJsZW5kKSB7Ci0gICAgICAgICAgICBCSVRNQVAgYm1wSW5mbzsKLSAgICAgICAgICAgIEdldE9i
amVjdChiaXRtYXAsIHNpemVvZihibXBJbmZvKSwgJmJtcEluZm8pOwotICAgICAgICAgICAgaW50
IGJ1ZmZlclNpemUgPSBibXBJbmZvLmJtV2lkdGhCeXRlcyAqIGJtcEluZm8uYm1IZWlnaHQ7Ci0g
ICAgICAgICAgICBtZW1zZXQoYm1wSW5mby5ibUJpdHMsIDAsIGJ1ZmZlclNpemUpOwotICAgICAg
ICB9Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGNhbiBkbyB3b3JsZCB0cmFuc2Zvcm1zLgot
ICAgICAgICBTZXRHcmFwaGljc01vZGUoYml0bWFwREMsIEdNX0FEVkFOQ0VEKTsKLQotICAgICAg
ICAvLyBBcHBseSBhIHRyYW5zbGF0aW9uIHRvIG91ciBjb250ZXh0IHNvIHRoYXQgdGhlIGRyYXdp
bmcgZG9uZSB3aWxsIGJlIGF0ICgwLDApIG9mIHRoZSBiaXRtYXAuCi0gICAgICAgIFhGT1JNIHhm
b3JtOwotICAgICAgICB4Zm9ybS5lTTExID0gMS4wOwotICAgICAgICB4Zm9ybS5lTTEyID0gMDsK
LSAgICAgICAgeGZvcm0uZU0yMSA9IDA7Ci0gICAgICAgIHhmb3JtLmVNMjIgPSAxLjA7Ci0gICAg
ICAgIHhmb3JtLmVEeCA9IC1kc3RSZWN0LngoKTsKLSAgICAgICAgeGZvcm0uZUR5ID0gLWRzdFJl
Y3QueSgpOwotICAgICAgICA6OlNldFdvcmxkVHJhbnNmb3JtKGJpdG1hcERDLCAmeGZvcm0pOwot
Ci0gICAgICAgIHJldHVybiBiaXRtYXBEQzsKLSAgICB9Ci0KLSAgICBDR0NvbnRleHRGbHVzaChw
bGF0Zm9ybUNvbnRleHQoKSk7Ci0gICAgbV9kYXRhLT5zYXZlKCk7Ci0gICAgcmV0dXJuIG1fZGF0
YS0+bV9oZGM7Ci19Ci0KIGJvb2wgR3JhcGhpY3NDb250ZXh0OjppblRyYW5zcGFyZW5jeUxheWVy
KCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLT5tX3RyYW5zcGFyZW5jeUNvdW50OyB9CiAKLXZvaWQg
R3JhcGhpY3NDb250ZXh0OjpyZWxlYXNlV2luZG93c0NvbnRleHQoSERDIGhkYywgY29uc3QgSW50
UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVuZCkKLXsKLSAgICBpZiAoaGRjICYm
IGluVHJhbnNwYXJlbmN5TGF5ZXIoKSkgewotICAgICAgICBpZiAoZHN0UmVjdC5pc0VtcHR5KCkp
Ci0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgSEJJVE1BUCBiaXRtYXAgPSAoSEJJVE1B
UClHZXRDdXJyZW50T2JqZWN0KGhkYywgT0JKX0JJVE1BUCk7Ci0KLSAgICAgICAgLy8gTmVlZCB0
byBtYWtlIGEgQ0dJbWFnZSBvdXQgb2YgdGhlIGJpdG1hcCdzIHBpeGVsIGJ1ZmZlciBhbmQgdGhl
biBkcmF3Ci0gICAgICAgIC8vIGl0IGludG8gb3VyIGNvbnRleHQuCi0gICAgICAgIEJJVE1BUCBp
bmZvOwotICAgICAgICBHZXRPYmplY3QoYml0bWFwLCBzaXplb2YoaW5mbyksICZpbmZvKTsKLSAg
ICAgICAgQVNTRVJUKGluZm8uYm1CaXRzUGl4ZWwgPT0gMzIpOwotCi0gICAgICAgIENHQ29sb3JT
cGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKLSAgICAg
ICAgQ0dDb250ZXh0UmVmIGJpdG1hcENvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUoaW5m
by5ibUJpdHMsIGluZm8uYm1XaWR0aCwgaW5mby5ibUhlaWdodCwgOCwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5ibVdpZHRo
Qnl0ZXMsIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCAKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN1cHBv
cnRBbHBoYUJsZW5kID8ga0NHSW1hZ2VBbHBoYVByZW11bHRpcGxpZWRGaXJzdCA6IGtDR0ltYWdl
QWxwaGFOb25lU2tpcEZpcnN0KSk7Ci0gICAgICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNl
UkdCKTsKLQotICAgICAgICBDR0ltYWdlUmVmIGltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRl
SW1hZ2UoYml0bWFwQ29udGV4dCk7Ci0gICAgICAgIENHQ29udGV4dERyYXdJbWFnZShtX2RhdGEt
Pm1fY2dDb250ZXh0LCBkc3RSZWN0LCBpbWFnZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBEZWxl
dGUgYWxsIG91ciBqdW5rLgotICAgICAgICBDR0ltYWdlUmVsZWFzZShpbWFnZSk7Ci0gICAgICAg
IENHQ29udGV4dFJlbGVhc2UoYml0bWFwQ29udGV4dCk7Ci0gICAgICAgIDo6RGVsZXRlREMoaGRj
KTsKLSAgICAgICAgOjpEZWxldGVPYmplY3QoYml0bWFwKTsKLQotICAgICAgICByZXR1cm47Ci0g
ICAgfQotCi0gICAgbV9kYXRhLT5yZXN0b3JlKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlOjpzYXZlKCkKLXsKLSAgICBpZiAoIW1faGRjKQotICAgICAgICByZXR1
cm47Ci0gICAgU2F2ZURDKG1faGRjKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9y
bVByaXZhdGU6OnJlc3RvcmUoKQotewotICAgIGlmICghbV9oZGMpCi0gICAgICAgIHJldHVybjsK
LSAgICBSZXN0b3JlREMobV9oZGMsIC0xKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGU6OmNsaXAoY29uc3QgSW50UmVjdCYgY2xpcFJlY3QpCi17Ci0gICAgaWYgKCFt
X2hkYykKLSAgICAgICAgcmV0dXJuOwotICAgIEludGVyc2VjdENsaXBSZWN0KG1faGRjLCBjbGlw
UmVjdC54KCksIGNsaXBSZWN0LnkoKSwgY2xpcFJlY3QucmlnaHQoKSwgY2xpcFJlY3QuYm90dG9t
KCkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y2xpcChjb25z
dCBQYXRoJikKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZTo6c2NhbGUoY29uc3QgRmxvYXRTaXplJiBzaXplKQotewotICAg
IGlmICghbV9oZGMpCi0gICAgICAgIHJldHVybjsKLSAgICBYRk9STSB4Zm9ybTsKLSAgICB4Zm9y
bS5lTTExID0gc2l6ZS53aWR0aCgpOwotICAgIHhmb3JtLmVNMTIgPSAwOwotICAgIHhmb3JtLmVN
MjEgPSAwOwotICAgIHhmb3JtLmVNMjIgPSBzaXplLmhlaWdodCgpOwotICAgIHhmb3JtLmVEeCA9
IDA7Ci0gICAgeGZvcm0uZUR5ID0gMDsKLSAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShtX2hkYywg
Jnhmb3JtLCBNV1RfTEVGVE1VTFRJUExZKTsKLX0KLQotc3RhdGljIGNvbnN0IGRvdWJsZSBkZWcy
cmFkID0gMC4wMTc0NTMyOTI1MTk5NDMyOTU3Njk7IC8vIHBpLzE4MAotCi12b2lkIEdyYXBoaWNz
Q29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6cm90YXRlKGZsb2F0IGRlZ3JlZXNBbmdsZSkKLXsKLSAg
ICBmbG9hdCByYWRpYW5zQW5nbGUgPSBkZWdyZWVzQW5nbGUgKiBkZWcycmFkOwotICAgIGZsb2F0
IGNvc0FuZ2xlID0gY29zZihyYWRpYW5zQW5nbGUpOwotICAgIGZsb2F0IHNpbkFuZ2xlID0gc2lu
ZihyYWRpYW5zQW5nbGUpOwotICAgIFhGT1JNIHhmb3JtOwotICAgIHhmb3JtLmVNMTEgPSBjb3NB
bmdsZTsKLSAgICB4Zm9ybS5lTTEyID0gLXNpbkFuZ2xlOwotICAgIHhmb3JtLmVNMjEgPSBzaW5B
bmdsZTsKLSAgICB4Zm9ybS5lTTIyID0gY29zQW5nbGU7Ci0gICAgeGZvcm0uZUR4ID0gMDsKLSAg
ICB4Zm9ybS5lRHkgPSAwOwotICAgIE1vZGlmeVdvcmxkVHJhbnNmb3JtKG1faGRjLCAmeGZvcm0s
IE1XVF9MRUZUTVVMVElQTFkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZTo6dHJhbnNsYXRlKGZsb2F0IHggLCBmbG9hdCB5KQotewotICAgIGlmICghbV9oZGMpCi0g
ICAgICAgIHJldHVybjsKLSAgICBYRk9STSB4Zm9ybTsKLSAgICB4Zm9ybS5lTTExID0gMS4wOwot
ICAgIHhmb3JtLmVNMTIgPSAwOwotICAgIHhmb3JtLmVNMjEgPSAwOwotICAgIHhmb3JtLmVNMjIg
PSAxLjA7Ci0gICAgeGZvcm0uZUR4ID0geDsKLSAgICB4Zm9ybS5lRHkgPSB5OwotICAgIE1vZGlm
eVdvcmxkVHJhbnNmb3JtKG1faGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y29uY2F0Q1RNKGNvbnN0IEFmZmlu
ZVRyYW5zZm9ybSYgdHJhbnNmb3JtKQotewotICAgIGlmICghbV9oZGMpCi0gICAgICAgIHJldHVy
bjsKLSAgICBDR0FmZmluZVRyYW5zZm9ybSBtYXQgPSB0cmFuc2Zvcm07Ci0gICAgWEZPUk0geGZv
cm07Ci0gICAgeGZvcm0uZU0xMSA9IG1hdC5hOwotICAgIHhmb3JtLmVNMTIgPSBtYXQuYjsKLSAg
ICB4Zm9ybS5lTTIxID0gbWF0LmM7Ci0gICAgeGZvcm0uZU0yMiA9IG1hdC5kOwotICAgIHhmb3Jt
LmVEeCA9IG1hdC50eDsKLSAgICB4Zm9ybS5lRHkgPSBtYXQudHk7Ci0gICAgTW9kaWZ5V29ybGRU
cmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpkcmF3Rm9jdXNSaW5nKGNvbnN0IENvbG9yJiBjb2xvcikKLXsKLSAgICBp
ZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBmbG9hdCByYWRp
dXMgPSAoZm9jdXNSaW5nV2lkdGgoKSAtIDEpIC8gMi4wZjsKLSAgICBpbnQgb2Zmc2V0ID0gcmFk
aXVzICsgZm9jdXNSaW5nT2Zmc2V0KCk7Ci0gICAgQ0dDb2xvclJlZiBjb2xvclJlZiA9IGNvbG9y
LmlzVmFsaWQoKSA/IGNnQ29sb3IoY29sb3IpIDogMDsKLQotICAgIENHTXV0YWJsZVBhdGhSZWYg
Zm9jdXNSaW5nUGF0aCA9IENHUGF0aENyZWF0ZU11dGFibGUoKTsKLSAgICBjb25zdCBWZWN0b3I8
SW50UmVjdD4mIHJlY3RzID0gZm9jdXNSaW5nUmVjdHMoKTsKLSAgICB1bnNpZ25lZCByZWN0Q291
bnQgPSByZWN0cy5zaXplKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlY3RDb3Vu
dDsgaSsrKQotICAgICAgICBDR1BhdGhBZGRSZWN0KGZvY3VzUmluZ1BhdGgsIDAsIENHUmVjdElu
c2V0KHJlY3RzW2ldLCAtb2Zmc2V0LCAtb2Zmc2V0KSk7Ci0KLSAgICBDR0NvbnRleHRSZWYgY29u
dGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOwotICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4
dCk7Ci0KLSAgICBDR0NvbnRleHRCZWdpblBhdGgoY29udGV4dCk7Ci0gICAgQ0dDb250ZXh0QWRk
UGF0aChjb250ZXh0LCBmb2N1c1JpbmdQYXRoKTsKLQotICAgIHdrRHJhd0ZvY3VzUmluZyhjb250
ZXh0LCBjb2xvclJlZiwgcmFkaXVzKTsKLQotICAgIENHQ29sb3JSZWxlYXNlKGNvbG9yUmVmKTsK
LQotICAgIENHUGF0aFJlbGVhc2UoZm9jdXNSaW5nUGF0aCk7Ci0KLSAgICBDR0NvbnRleHRSZXN0
b3JlR1N0YXRlKGNvbnRleHQpOwotfQotCi1zdGF0aWMgY29uc3QgQ29sb3ImIHNwZWxsaW5nUGF0
dGVybkNvbG9yKCkgewotICAgIHN0YXRpYyBjb25zdCBDb2xvciBzcGVsbGluZ0NvbG9yKDI1NSwg
MCwgMCk7Ci0gICAgcmV0dXJuIHNwZWxsaW5nQ29sb3I7Ci19Ci0KLXN0YXRpYyBjb25zdCBDb2xv
ciYgZ3JhbW1hclBhdHRlcm5Db2xvcigpIHsKLSAgICBzdGF0aWMgY29uc3QgQ29sb3IgZ3JhbW1h
ckNvbG9yKDAsIDEyOCwgMCk7Ci0gICAgcmV0dXJuIGdyYW1tYXJDb2xvcjsKLX0KLQotLy8gUHVs
bGVkIGZyb20gR3JhcGhpY3NDb250ZXh0Q0cKLXN0YXRpYyB2b2lkIHNldENHU3Ryb2tlQ29sb3Io
Q0dDb250ZXh0UmVmIGNvbnRleHQsIGNvbnN0IENvbG9yJiBjb2xvcikKLXsKLSAgICBDR0Zsb2F0
IHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhOwotICAgIGNvbG9yLmdldFJHQkEocmVkLCBncmVlbiwg
Ymx1ZSwgYWxwaGEpOwotICAgIENHQ29udGV4dFNldFJHQlN0cm9rZUNvbG9yKGNvbnRleHQsIHJl
ZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdM
aW5lRm9yTWlzc3BlbGxpbmdPckJhZEdyYW1tYXIoY29uc3QgSW50UG9pbnQmIHBvaW50LCBpbnQg
d2lkdGgsIGJvb2wgZ3JhbW1hcikKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAg
ICAgICByZXR1cm47Ci0gICAgCi0gICAgLy8gVGhlc2UgYXJlIHRoZSBzYW1lIGZvciBtaXNzcGVs
bGluZyBvciBiYWQgZ3JhbW1hcgotICAgIGNvbnN0IGludCBwYXR0ZXJuSGVpZ2h0ID0gMzsgLy8g
MyByb3dzCi0gICAgQVNTRVJUKGNNaXNzcGVsbGluZ0xpbmVUaGlja25lc3MgPT0gcGF0dGVybkhl
aWdodCk7Ci0gICAgY29uc3QgaW50IHBhdHRlcm5XaWR0aCA9IDQ7IC8vIDQgcGl4ZWxzCi0gICAg
QVNTRVJUKHBhdHRlcm5XaWR0aCA9PSBjTWlzc3BlbGxpbmdMaW5lUGF0dGVybldpZHRoKTsKLQot
ICAgIC8vIE1ha2Ugc3VyZSB0byBkcmF3IG9ubHkgY29tcGxldGUgZG90cy4KLSAgICAvLyBOT1RF
OiBDb2RlIGhlcmUgdXNlZCB0byBzaGlmdCB0aGUgdW5kZXJsaW5lIHRvIHRoZSBsZWZ0IGFuZCBp
bmNyZWFzZSB0aGUgd2lkdGgKLSAgICAvLyB0byBtYWtlIHN1cmUgZXZlcnl0aGluZyBnZXRzIHVu
ZGVybGluZWQsIGJ1dCB0aGF0IHJlc3VsdHMgaW4gZHJhd2luZyBvdXQgb2YKLSAgICAvLyBib3Vu
ZHMgKGUuZy4gd2hlbiBhdCB0aGUgZWRnZSBvZiBhIHZpZXcpIGFuZCBjb3VsZCBtYWtlIGl0IGFw
cGVhciB0aGF0IHRoZQotICAgIC8vIHNwYWNlIGJldHdlZW4gYWRqYWNlbnQgbWlzc3BlbGxlZCB3
b3JkcyB3YXMgdW5kZXJsaW5lZC4KLSAgICAvLyBhbGxvdyBzbGlnaHRseSBtb3JlIGNvbnNpZGVy
aW5nIHRoYXQgdGhlIHBhdHRlcm4gZW5kcyB3aXRoIGEgdHJhbnNwYXJlbnQgcGl4ZWwKLSAgICBp
bnQgd2lkdGhNb2QgPSB3aWR0aCAlIHBhdHRlcm5XaWR0aDsKLSAgICBpZiAocGF0dGVybldpZHRo
IC0gd2lkdGhNb2QgPiBjTWlzc3BlbGxpbmdMaW5lUGF0dGVybkdhcFdpZHRoKQotICAgICAgICB3
aWR0aCAtPSB3aWR0aE1vZDsKLSAgICAgIAotICAgIC8vIERyYXcgdGhlIHVuZGVybGluZQotICAg
IENHQ29udGV4dFJlZiBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCk7Ci0gICAgQ0dDb250ZXh0
U2F2ZUdTdGF0ZShjb250ZXh0KTsKLQotICAgIGNvbnN0IENvbG9yJiBwYXR0ZXJuQ29sb3IgPSBn
cmFtbWFyID8gZ3JhbW1hclBhdHRlcm5Db2xvcigpIDogc3BlbGxpbmdQYXR0ZXJuQ29sb3IoKTsK
LSAgICBzZXRDR1N0cm9rZUNvbG9yKGNvbnRleHQsIHBhdHRlcm5Db2xvcik7Ci0KLSAgICB3a1Nl
dFBhdHRlcm5QaGFzZUluVXNlclNwYWNlKGNvbnRleHQsIHBvaW50KTsKLSAgICBDR0NvbnRleHRT
ZXRCbGVuZE1vZGUoY29udGV4dCwga0NHQmxlbmRNb2RlTm9ybWFsKTsKLSAgICAKLSAgICAvLyAz
IHJvd3MsIGVhY2ggb2Zmc2V0IGJ5IGhhbGYgYSBwaXhlbCBmb3IgYmxlbmRpbmcgcHVycG9zZXMK
LSAgICBjb25zdCBDR1BvaW50IHVwcGVyUG9pbnRzIFtdID0ge3twb2ludC54KCksIHBvaW50Lnko
KSArIHBhdHRlcm5IZWlnaHQgLSAyLjUgfSwge3BvaW50LngoKSArIHdpZHRoLCBwb2ludC55KCkg
KyBwYXR0ZXJuSGVpZ2h0IC0gMi41fX07Ci0gICAgY29uc3QgQ0dQb2ludCBtaWRkbGVQb2ludHMg
W10gPSB7e3BvaW50LngoKSwgcG9pbnQueSgpICsgcGF0dGVybkhlaWdodCAtIDEuNSB9LCB7cG9p
bnQueCgpICsgd2lkdGgsIHBvaW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAxLjV9fTsKLSAgICBj
b25zdCBDR1BvaW50IGxvd2VyUG9pbnRzIFtdID0ge3twb2ludC54KCksIHBvaW50LnkoKSArIHBh
dHRlcm5IZWlnaHQgLSAwLjUgfSwge3BvaW50LngoKSArIHdpZHRoLCBwb2ludC55KCkgKyBwYXR0
ZXJuSGVpZ2h0IC0gMC41IH19OwotICAgIAotICAgIC8vIERhc2ggbGVuZ3RocyBmb3IgdGhlIHRv
cCBhbmQgYm90dG9tIG9mIHRoZSBlcnJvciB1bmRlcmxpbmUgYXJlIHRoZSBzYW1lLgotICAgIC8v
IFRoZXNlIGFyZSBtYWdpYy4KLSAgICBzdGF0aWMgY29uc3QgZmxvYXQgZWRnZV9kYXNoX2xlbmd0
aHNbXSA9IHsyLCAyfTsKLSAgICBzdGF0aWMgY29uc3QgZmxvYXQgbWlkZGxlX2Rhc2hfbGVuZ3Ro
c1tdID0gezIuNzZmLCAxLjI0Zn07Ci0gICAgc3RhdGljIGNvbnN0IGZsb2F0IGVkZ2Vfb2Zmc2V0
ID0gLShlZGdlX2Rhc2hfbGVuZ3Roc1sxXSAtIDEuMGYpIC8gMi4wZjsKLSAgICBzdGF0aWMgY29u
c3QgZmxvYXQgbWlkZGxlX29mZnNldCA9IC0obWlkZGxlX2Rhc2hfbGVuZ3Roc1sxXSAtIDEuMGYp
IC8gMi4wZjsKLQotICAgIC8vIExpbmUgb3BhY2l0aWVzLiAgT25jZSBhZ2FpbiwgdGhlc2UgYXJl
IG1hZ2ljLgotICAgIGNvbnN0IGZsb2F0IHVwcGVyT3BhY2l0eSA9IDAuMzNmOwotICAgIGNvbnN0
IGZsb2F0IG1pZGRsZU9wYWNpdHkgPSAwLjc1ZjsKLSAgICBjb25zdCBmbG9hdCBsb3dlck9wYWNp
dHkgPSAwLjg4ZjsKLQotICAgIC8vVG9wIGxpbmUKLSAgICBDR0NvbnRleHRTZXRMaW5lRGFzaChj
b250ZXh0LCBlZGdlX29mZnNldCwgZWRnZV9kYXNoX2xlbmd0aHMsIAotICAgICAgICAgICAgICAg
ICAgICAgICAgIHNpemVvZihlZGdlX2Rhc2hfbGVuZ3RocykgLyBzaXplb2YoZWRnZV9kYXNoX2xl
bmd0aHNbMF0pKTsKLSAgICBDR0NvbnRleHRTZXRBbHBoYShjb250ZXh0LCB1cHBlck9wYWNpdHkp
OwotICAgIENHQ29udGV4dFN0cm9rZUxpbmVTZWdtZW50cyhjb250ZXh0LCB1cHBlclBvaW50cywg
Mik7Ci0gCi0gICAgLy8gTWlkZGxlIGxpbmUKLSAgICBDR0NvbnRleHRTZXRMaW5lRGFzaChjb250
ZXh0LCBtaWRkbGVfb2Zmc2V0LCBtaWRkbGVfZGFzaF9sZW5ndGhzLCAKLSAgICAgICAgICAgICAg
ICAgICAgICAgICBzaXplb2YobWlkZGxlX2Rhc2hfbGVuZ3RocykgLyBzaXplb2YobWlkZGxlX2Rh
c2hfbGVuZ3Roc1swXSkpOwotICAgIENHQ29udGV4dFNldEFscGhhKGNvbnRleHQsIG1pZGRsZU9w
YWNpdHkpOwotICAgIENHQ29udGV4dFN0cm9rZUxpbmVTZWdtZW50cyhjb250ZXh0LCBtaWRkbGVQ
b2ludHMsIDIpOwotICAgIAotICAgIC8vIEJvdHRvbSBsaW5lCi0gICAgQ0dDb250ZXh0U2V0TGlu
ZURhc2goY29udGV4dCwgZWRnZV9vZmZzZXQsIGVkZ2VfZGFzaF9sZW5ndGhzLAotICAgICAgICAg
ICAgICAgICAgICAgICAgIHNpemVvZihlZGdlX2Rhc2hfbGVuZ3RocykgLyBzaXplb2YoZWRnZV9k
YXNoX2xlbmd0aHNbMF0pKTsKLSAgICBDR0NvbnRleHRTZXRBbHBoYShjb250ZXh0LCBsb3dlck9w
YWNpdHkpOwotICAgIENHQ29udGV4dFN0cm9rZUxpbmVTZWdtZW50cyhjb250ZXh0LCBsb3dlclBv
aW50cywgMik7Ci0KLSAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOwotfQotCiAj
aWYgRU5BQkxFKFNWRykKIEdyYXBoaWNzQ29udGV4dCogY29udGV4dEZvckltYWdlKFNWR1Jlc291
cmNlSW1hZ2UqKQogewpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VD
R1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1h
Z2VDR1dpbi5jcHAJKHJldmlzaW9uIDI5ODM0KQkoZnJvbSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbi9JbWFnZVdpbi5jcHA6Mjk4MzQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbi9JbWFnZUNHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDExMCBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
Q09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBD
T01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJbWFnZS5oIgorI2lu
Y2x1ZGUgIkJpdG1hcEltYWdlLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5j
bHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CisKKyNpbmNs
dWRlIDx3aW5zb2NrMi5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlICJQbGF0Zm9y
bVN0cmluZy5oIgorI2luY2x1ZGUgIk1JTUVUeXBlUmVnaXN0cnkuaCIKKyNpbmNsdWRlICJTaGFy
ZWRCdWZmZXIuaCIKKworLy8gVGhpcyBmdW5jdGlvbiBsb2FkcyByZXNvdXJjZXMgZnJvbSBXZWJL
aXQKK1Bhc3NSZWZQdHI8V2ViQ29yZTo6U2hhcmVkQnVmZmVyPiBsb2FkUmVzb3VyY2VJbnRvQnVm
ZmVyKGNvbnN0IGNoYXIqKTsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2b2lkIEJpdG1hcElt
YWdlOjppbml0UGxhdGZvcm1EYXRhKCkKK3sKK30KKwordm9pZCBCaXRtYXBJbWFnZTo6aW52YWxp
ZGF0ZVBsYXRmb3JtRGF0YSgpCit7Cit9CisKK0ltYWdlKiBJbWFnZTo6bG9hZFBsYXRmb3JtUmVz
b3VyY2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBSZWZQdHI8U2hhcmVkQnVmZmVyPiBidWZm
ZXIgPSBsb2FkUmVzb3VyY2VJbnRvQnVmZmVyKG5hbWUpOworICAgIEJpdG1hcEltYWdlKiBpbWcg
PSBuZXcgQml0bWFwSW1hZ2U7CisgICAgaW1nLT5zZXREYXRhKGJ1ZmZlci5yZWxlYXNlKCksIHRy
dWUpOworICAgIHJldHVybiBpbWc7Cit9CisKK2Jvb2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVAo
SEJJVE1BUCBibXApCit7CisgICAgcmV0dXJuIGdldEhCSVRNQVBPZlNpemUoYm1wLCAwKTsKK30K
KworYm9vbCBCaXRtYXBJbWFnZTo6Z2V0SEJJVE1BUE9mU2l6ZShIQklUTUFQIGJtcCwgTFBTSVpF
IHNpemUpCit7CisgICAgQVNTRVJUKGJtcCk7CisKKyAgICBCSVRNQVAgYm1wSW5mbzsKKyAgICBH
ZXRPYmplY3QoYm1wLCBzaXplb2YoQklUTUFQKSwgJmJtcEluZm8pOworCisgICAgQVNTRVJUKGJt
cEluZm8uYm1CaXRzUGl4ZWwgPT0gMzIpOworICAgIGludCBidWZmZXJTaXplID0gYm1wSW5mby5i
bVdpZHRoQnl0ZXMgKiBibXBJbmZvLmJtSGVpZ2h0OworICAgIAorICAgIENHQ29sb3JTcGFjZVJl
ZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKKyAgICBDR0NvbnRl
eHRSZWYgY2dDb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGJtcEluZm8uYm1CaXRzLCBi
bXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQsCisgICAgICAgIDgsIGJtcEluZm8uYm1X
aWR0aEJ5dGVzLCBkZXZpY2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwga0NHSW1h
Z2VBbHBoYVByZW11bHRpcGxpZWRGaXJzdCk7CisgIAorICAgIEdyYXBoaWNzQ29udGV4dCBnYyhj
Z0NvbnRleHQpOworICAgIEludFNpemUgaW1hZ2VTaXplID0gQml0bWFwSW1hZ2U6OnNpemUoKTsK
KyAgICBpZiAoc2l6ZSkKKyAgICAgICAgZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXplKCZnYywg
RmxvYXRSZWN0KDAsIDAsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCksIEludFNp
emUoKnNpemUpLCBDb21wb3NpdGVDb3B5KTsKKyAgICBlbHNlCisgICAgICAgIGRyYXcoJmdjLCBG
bG9hdFJlY3QoMCwgMCwgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwgRmxvYXRS
ZWN0KDAsIDAsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBDb21wb3Np
dGVDb3B5KTsKKworICAgIC8vIERvIGNsZWFudXAKKyAgICBDR0NvbnRleHRSZWxlYXNlKGNnQ29u
dGV4dCk7CisgICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOworICAgIHJldHVybiB0
cnVlOworfQorCit2b2lkIEJpdG1hcEltYWdlOjpkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUo
R3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBGbG9hdFJlY3QmIGRzdFJlY3QsIGNvbnN0IElu
dFNpemUmIHNyY1NpemUsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQoreworICAgIGlu
dCBmcmFtZXMgPSBmcmFtZUNvdW50KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZXM7
ICsraSkgeworICAgICAgICBDR0ltYWdlUmVmIGltYWdlID0gZnJhbWVBdEluZGV4KGkpOworICAg
ICAgICBpZiAoQ0dJbWFnZUdldEhlaWdodChpbWFnZSkgPT0gKHNpemVfdClzcmNTaXplLmhlaWdo
dCgpICYmIENHSW1hZ2VHZXRXaWR0aChpbWFnZSkgPT0gKHNpemVfdClzcmNTaXplLndpZHRoKCkp
IHsKKyAgICAgICAgICAgIHNpemVfdCBjdXJyZW50RnJhbWUgPSBtX2N1cnJlbnRGcmFtZTsKKyAg
ICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gaTsKKyAgICAgICAgICAgIGRyYXcoY3R4dCwgZHN0
UmVjdCwgRmxvYXRSZWN0KDAsIDAsIHNyY1NpemUud2lkdGgoKSwgc3JjU2l6ZS5oZWlnaHQoKSks
IGNvbXBvc2l0ZU9wKTsKKyAgICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gY3VycmVudEZyYW1l
OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTm8gaW1h
Z2Ugb2YgdGhlIGNvcnJlY3Qgc2l6ZSB3YXMgZm91bmQsIGZhbGxiYWNrIHRvIGRyYXdpbmcgdGhl
IGN1cnJlbnQgZnJhbWUKKyAgICBJbnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcEltYWdlOjpzaXpl
KCk7CisgICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJlY3QoMCwgMCwgaW1hZ2VTaXplLndp
ZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsKK30KKworfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VD
R1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1h
Z2VDR1dpbi5jcHAJKHJldmlzaW9uIDI5NzI2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW4vSW1hZ2VDR1dpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgot
ICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUgSW5jLiAgQWxsIHJp
Z2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMjksMzgg
KzI5LDExIEBACiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCiAjaW5jbHVkZSA8QXBwbGlj
YXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CiAKLSNpbmNsdWRlIDx3aW5zb2Nr
Mi5oPgogI2luY2x1ZGUgPHdpbmRvd3MuaD4KICNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgot
I2luY2x1ZGUgIk1JTUVUeXBlUmVnaXN0cnkuaCIKLSNpbmNsdWRlICJTaGFyZWRCdWZmZXIuaCIK
LQotLy8gVGhpcyBmdW5jdGlvbiBsb2FkcyByZXNvdXJjZXMgZnJvbSBXZWJLaXQKLVBhc3NSZWZQ
dHI8V2ViQ29yZTo6U2hhcmVkQnVmZmVyPiBsb2FkUmVzb3VyY2VJbnRvQnVmZmVyKGNvbnN0IGNo
YXIqKTsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi12b2lkIEJpdG1hcEltYWdlOjppbml0UGxh
dGZvcm1EYXRhKCkKLXsKLX0KLQotdm9pZCBCaXRtYXBJbWFnZTo6aW52YWxpZGF0ZVBsYXRmb3Jt
RGF0YSgpCi17Ci19Ci0KLUltYWdlKiBJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UoY29uc3Qg
Y2hhciAqbmFtZSkKLXsKLSAgICBSZWZQdHI8U2hhcmVkQnVmZmVyPiBidWZmZXIgPSBsb2FkUmVz
b3VyY2VJbnRvQnVmZmVyKG5hbWUpOwotICAgIEJpdG1hcEltYWdlKiBpbWcgPSBuZXcgQml0bWFw
SW1hZ2U7Ci0gICAgaW1nLT5zZXREYXRhKGJ1ZmZlci5yZWxlYXNlKCksIHRydWUpOwotICAgIHJl
dHVybiBpbWc7Ci19Ci0KLWJvb2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVAoSEJJVE1BUCBibXAp
Ci17Ci0gICAgcmV0dXJuIGdldEhCSVRNQVBPZlNpemUoYm1wLCAwKTsKLX0KLQogYm9vbCBCaXRt
YXBJbWFnZTo6Z2V0SEJJVE1BUE9mU2l6ZShIQklUTUFQIGJtcCwgTFBTSVpFIHNpemUpCiB7CiAg
ICAgQVNTRVJUKGJtcCk7CkBAIC03NiwyNyArNDksMzMgQEAgYm9vbCBCaXRtYXBJbWFnZTo6Z2V0
SEJJVE1BUE9mU2l6ZShIQklUTQogICAgICAgICA4LCBibXBJbmZvLmJtV2lkdGhCeXRlcywgZGV2
aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFQcmVtdWx0
aXBsaWVkRmlyc3QpOwogICAKICAgICBHcmFwaGljc0NvbnRleHQgZ2MoY2dDb250ZXh0KTsKKwog
ICAgIEludFNpemUgaW1hZ2VTaXplID0gQml0bWFwSW1hZ2U6OnNpemUoKTsKICAgICBpZiAoc2l6
ZSkKLSAgICAgICAgZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXplKCZnYywgRmxvYXRSZWN0KDAs
IDAsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCksIEludFNpemUoKnNpemUpLCBD
b21wb3NpdGVDb3B5KTsKKyAgICAgICAgZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXplKCZnYywg
RmxvYXRSZWN0KDAuMGYsIDAuMGYsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCks
IEludFNpemUoKnNpemUpLCBDb21wb3NpdGVDb3B5KTsKICAgICBlbHNlCi0gICAgICAgIGRyYXco
JmdjLCBGbG9hdFJlY3QoMCwgMCwgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwg
RmxvYXRSZWN0KDAsIDAsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBD
b21wb3NpdGVDb3B5KTsKKyAgICAgICAgZHJhdygmZ2MsIEZsb2F0UmVjdCgwLjBmLCAwLjBmLCBi
bXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQpLCBGbG9hdFJlY3QoMC4wZiwgMC4wZiwg
aW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIENvbXBvc2l0ZUNvcHkpOwog
CiAgICAgLy8gRG8gY2xlYW51cAogICAgIENHQ29udGV4dFJlbGVhc2UoY2dDb250ZXh0KTsKICAg
ICBDR0NvbG9yU3BhY2VSZWxlYXNlKGRldmljZVJHQik7CisKICAgICByZXR1cm4gdHJ1ZTsKIH0K
IAogdm9pZCBCaXRtYXBJbWFnZTo6ZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXplKEdyYXBoaWNz
Q29udGV4dCogY3R4dCwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBjb25zdCBJbnRTaXplJiBz
cmNTaXplLCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCkKIHsKICAgICBpbnQgZnJhbWVz
ID0gZnJhbWVDb3VudCgpOworICAgIHNpemVfdCBpbWFnZUhlaWdodCA9IDA7CisgICAgc2l6ZV90
IGltYWdlV2lkdGggPSAwOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVzOyArK2kpIHsK
LSAgICAgICAgQ0dJbWFnZVJlZiBpbWFnZSA9IGZyYW1lQXRJbmRleChpKTsKLSAgICAgICAgaWYg
KENHSW1hZ2VHZXRIZWlnaHQoaW1hZ2UpID09IChzaXplX3Qpc3JjU2l6ZS5oZWlnaHQoKSAmJiBD
R0ltYWdlR2V0V2lkdGgoaW1hZ2UpID09IChzaXplX3Qpc3JjU2l6ZS53aWR0aCgpKSB7CisgICAg
ICAgIE5hdGl2ZUltYWdlUHRyIGltYWdlID0gZnJhbWVBdEluZGV4KGkpOworICAgICAgICBpbWFn
ZUhlaWdodCA9IENHSW1hZ2VHZXRIZWlnaHQoaW1hZ2UpOworICAgICAgICBpbWFnZVdpZHRoID0g
Q0dJbWFnZUdldFdpZHRoKGltYWdlKTsKKyAgICAgICAgaWYgKGltYWdlSGVpZ2h0ID09IHN0YXRp
Y19jYXN0PHNpemVfdD4oc3JjU2l6ZS5oZWlnaHQoKSkgJiYgaW1hZ2VXaWR0aCA9PSBzdGF0aWNf
Y2FzdDxzaXplX3Q+KHNyY1NpemUud2lkdGgoKSkpIHsKICAgICAgICAgICAgIHNpemVfdCBjdXJy
ZW50RnJhbWUgPSBtX2N1cnJlbnRGcmFtZTsKICAgICAgICAgICAgIG1fY3VycmVudEZyYW1lID0g
aTsKLSAgICAgICAgICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRSZWN0KDAsIDAsIHNyY1Np
emUud2lkdGgoKSwgc3JjU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsKKyAgICAgICAgICAg
IGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRSZWN0KDAuMGYsIDAuMGYsIHNyY1NpemUud2lkdGgo
KSwgc3JjU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsKICAgICAgICAgICAgIG1fY3VycmVu
dEZyYW1lID0gY3VycmVudEZyYW1lOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBA
IC0xMDQsNyArODMsNyBAQCB2b2lkIEJpdG1hcEltYWdlOjpkcmF3RnJhbWVNYXRjaGluZ1NvdXJj
CiAKICAgICAvLyBObyBpbWFnZSBvZiB0aGUgY29ycmVjdCBzaXplIHdhcyBmb3VuZCwgZmFsbGJh
Y2sgdG8gZHJhd2luZyB0aGUgY3VycmVudCBmcmFtZQogICAgIEludFNpemUgaW1hZ2VTaXplID0g
Qml0bWFwSW1hZ2U6OnNpemUoKTsKLSAgICBkcmF3KGN0eHQsIGRzdFJlY3QsIEZsb2F0UmVjdCgw
LCAwLCBpbWFnZVNpemUud2lkdGgoKSwgaW1hZ2VTaXplLmhlaWdodCgpKSwgY29tcG9zaXRlT3Ap
OworICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRSZWN0KDAuMGYsIDAuMGYsIGltYWdlU2l6
ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBjb21wb3NpdGVPcCk7CiB9CiAKIH0gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0lt
YWdlQ2Fpcm9XaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luL0ltYWdlQ2Fpcm9XaW4uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW4vSW1hZ2VDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsOTMg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
Q09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW1hZ2UuaCIKKyNp
bmNsdWRlICJCaXRtYXBJbWFnZS5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2lu
Y2x1ZGUgPGNhaXJvLmg+CisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSAiUGxhdGZv
cm1TdHJpbmcuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitib29sIEJpdG1hcEltYWdlOjpn
ZXRIQklUTUFQT2ZTaXplKEhCSVRNQVAgYm1wLCBMUFNJWkUgc2l6ZSkKK3sKKyAgICBBU1NFUlQo
Ym1wKTsKKworICAgIEJJVE1BUCBibXBJbmZvOworICAgIEdldE9iamVjdChibXAsIHNpemVvZihC
SVRNQVApLCAmYm1wSW5mbyk7CisKKyAgICAvLyBJZiB0aGlzIGlzIGEgMzJicHAgYml0bWFwLCB3
aGljaCBpdCBhbHdheXMgc2hvdWxkIGJlLCB3ZSdsbCBjbGVhciBpdCBzbyBhbHBoYS13aXNlIGl0
IHdpbGwgYmUgdmlzaWJsZQorICAgIGlmIChibXBJbmZvLmJtQml0c1BpeGVsID09IDMyKSB7Cisg
ICAgICAgIGludCBidWZmZXJTaXplID0gYm1wSW5mby5ibVdpZHRoQnl0ZXMgKiBibXBJbmZvLmJt
SGVpZ2h0OworICAgICAgICBtZW1zZXQoYm1wSW5mby5ibUJpdHMsIDI1NSwgYnVmZmVyU2l6ZSk7
CisgICAgfQorIAkKKyAgICBIREMgdGVtcERDID0gQ3JlYXRlQ29tcGF0aWJsZURDKDApOworICAg
IGlmICghdGVtcERDKSB7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSBpbi1t
ZW1vcnkgREMgZm9yIEltYWdlOjpibGl0KCkiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IH0KKyAgICBTZWxlY3RPYmplY3QodGVtcERDLCBibXApOworICAgIEdyYXBoaWNzQ29udGV4dCBn
Yyh0ZW1wREMpOworCisgICAgSW50U2l6ZSBpbWFnZVNpemUgPSBCaXRtYXBJbWFnZTo6c2l6ZSgp
OworICAgIGlmIChzaXplKQorICAgICAgICBkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUoJmdj
LCBGbG9hdFJlY3QoMC4wZiwgMC4wZiwgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0
KSwgSW50U2l6ZSgqc2l6ZSksIENvbXBvc2l0ZUNvcHkpOworICAgIGVsc2UKKyAgICAgICAgZHJh
dygmZ2MsIEZsb2F0UmVjdCgwLjBmLCAwLjBmLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1I
ZWlnaHQpLCBGbG9hdFJlY3QoMC4wZiwgMC4wZiwgaW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6
ZS5oZWlnaHQoKSksIENvbXBvc2l0ZUNvcHkpOworCisgICAgLy8gRG8gY2xlYW51cAorICAgIERl
bGV0ZURDKHRlbXBEQyk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBCaXRtYXBJbWFn
ZTo6ZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXplKEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29u
c3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBjb25zdCBJbnRTaXplJiBzcmNTaXplLCBDb21wb3NpdGVP
cGVyYXRvciBjb21wb3NpdGVPcCkKK3sKKyAgICBpbnQgZnJhbWVzID0gZnJhbWVDb3VudCgpOwor
ICAgIHNpemVfdCBpbWFnZUhlaWdodCA9IDA7CisgICAgc2l6ZV90IGltYWdlV2lkdGggPSAwOwor
ICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVzOyArK2kpIHsKKyAgICAgICAgTmF0aXZlSW1h
Z2VQdHIgaW1hZ2UgPSBmcmFtZUF0SW5kZXgoaSk7CisgICAgICAgIGltYWdlSGVpZ2h0ID0gY2Fp
cm9faW1hZ2Vfc3VyZmFjZV9nZXRfaGVpZ2h0KGltYWdlKTsKKyAgICAgICAgaW1hZ2VXaWR0aCA9
IGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X3dpZHRoKGltYWdlKTsKKyAgICAgICAgaWYgKGltYWdl
SGVpZ2h0ID09IHN0YXRpY19jYXN0PHNpemVfdD4oc3JjU2l6ZS5oZWlnaHQoKSkgJiYgaW1hZ2VX
aWR0aCA9PSBzdGF0aWNfY2FzdDxzaXplX3Q+KHNyY1NpemUud2lkdGgoKSkpIHsKKyAgICAgICAg
ICAgIHNpemVfdCBjdXJyZW50RnJhbWUgPSBtX2N1cnJlbnRGcmFtZTsKKyAgICAgICAgICAgIG1f
Y3VycmVudEZyYW1lID0gaTsKKyAgICAgICAgICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRS
ZWN0KDAuMGYsIDAuMGYsIHNyY1NpemUud2lkdGgoKSwgc3JjU2l6ZS5oZWlnaHQoKSksIGNvbXBv
c2l0ZU9wKTsKKyAgICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gY3VycmVudEZyYW1lOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTm8gaW1hZ2Ugb2Yg
dGhlIGNvcnJlY3Qgc2l6ZSB3YXMgZm91bmQsIGZhbGxiYWNrIHRvIGRyYXdpbmcgdGhlIGN1cnJl
bnQgZnJhbWUKKyAgICBJbnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcEltYWdlOjpzaXplKCk7Cisg
ICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJlY3QoMC4wZiwgMC4wZiwgaW1hZ2VTaXplLndp
ZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsKK30KKworfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VX
aW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdl
V2luLmNwcAkocmV2aXNpb24gMjk4MzQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bi9JbWFnZVdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29w
eXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMjYsMTMgKzI2LDcg
QEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJJbWFnZS5oIgogI2luY2x1ZGUgIkJp
dG1hcEltYWdlLmgiCi0jaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCi0jaW5jbHVkZSA8QXBw
bGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CiAKLSNpbmNsdWRlIDx3aW5z
b2NrMi5oPgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5o
IgotI2luY2x1ZGUgIk1JTUVUeXBlUmVnaXN0cnkuaCIKICNpbmNsdWRlICJTaGFyZWRCdWZmZXIu
aCIKIAogLy8gVGhpcyBmdW5jdGlvbiBsb2FkcyByZXNvdXJjZXMgZnJvbSBXZWJLaXQKQEAgLTYx
LDUwICs1NSw0IEBAIGJvb2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVAoSEJJVE1BUCBibXAKICAg
ICByZXR1cm4gZ2V0SEJJVE1BUE9mU2l6ZShibXAsIDApOwogfQogCi1ib29sIEJpdG1hcEltYWdl
OjpnZXRIQklUTUFQT2ZTaXplKEhCSVRNQVAgYm1wLCBMUFNJWkUgc2l6ZSkKLXsKLSAgICBBU1NF
UlQoYm1wKTsKLQotICAgIEJJVE1BUCBibXBJbmZvOwotICAgIEdldE9iamVjdChibXAsIHNpemVv
ZihCSVRNQVApLCAmYm1wSW5mbyk7Ci0KLSAgICBBU1NFUlQoYm1wSW5mby5ibUJpdHNQaXhlbCA9
PSAzMik7Ci0gICAgaW50IGJ1ZmZlclNpemUgPSBibXBJbmZvLmJtV2lkdGhCeXRlcyAqIGJtcElu
Zm8uYm1IZWlnaHQ7Ci0gICAgCi0gICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29s
b3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwotICAgIENHQ29udGV4dFJlZiBjZ0NvbnRleHQgPSBD
R0JpdG1hcENvbnRleHRDcmVhdGUoYm1wSW5mby5ibUJpdHMsIGJtcEluZm8uYm1XaWR0aCwgYm1w
SW5mby5ibUhlaWdodCwKLSAgICAgICAgOCwgYm1wSW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJH
Qiwga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhhUHJlbXVsdGlwbGll
ZEZpcnN0KTsKLSAgCi0gICAgR3JhcGhpY3NDb250ZXh0IGdjKGNnQ29udGV4dCk7Ci0gICAgSW50
U2l6ZSBpbWFnZVNpemUgPSBCaXRtYXBJbWFnZTo6c2l6ZSgpOwotICAgIGlmIChzaXplKQotICAg
ICAgICBkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUoJmdjLCBGbG9hdFJlY3QoMCwgMCwgYm1w
SW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwgSW50U2l6ZSgqc2l6ZSksIENvbXBvc2l0
ZUNvcHkpOwotICAgIGVsc2UKLSAgICAgICAgZHJhdygmZ2MsIEZsb2F0UmVjdCgwLCAwLCBibXBJ
bmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQpLCBGbG9hdFJlY3QoMCwgMCwgaW1hZ2VTaXpl
LndpZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIENvbXBvc2l0ZUNvcHkpOwotCi0gICAgLy8g
RG8gY2xlYW51cAotICAgIENHQ29udGV4dFJlbGVhc2UoY2dDb250ZXh0KTsKLSAgICBDR0NvbG9y
U3BhY2VSZWxlYXNlKGRldmljZVJHQik7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQml0
bWFwSW1hZ2U6OmRyYXdGcmFtZU1hdGNoaW5nU291cmNlU2l6ZShHcmFwaGljc0NvbnRleHQqIGN0
eHQsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgY29uc3QgSW50U2l6ZSYgc3JjU2l6ZSwgQ29t
cG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApCi17Ci0gICAgaW50IGZyYW1lcyA9IGZyYW1lQ291
bnQoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lczsgKytpKSB7Ci0gICAgICAgIENH
SW1hZ2VSZWYgaW1hZ2UgPSBmcmFtZUF0SW5kZXgoaSk7Ci0gICAgICAgIGlmIChDR0ltYWdlR2V0
SGVpZ2h0KGltYWdlKSA9PSAoc2l6ZV90KXNyY1NpemUuaGVpZ2h0KCkgJiYgQ0dJbWFnZUdldFdp
ZHRoKGltYWdlKSA9PSAoc2l6ZV90KXNyY1NpemUud2lkdGgoKSkgewotICAgICAgICAgICAgc2l6
ZV90IGN1cnJlbnRGcmFtZSA9IG1fY3VycmVudEZyYW1lOwotICAgICAgICAgICAgbV9jdXJyZW50
RnJhbWUgPSBpOwotICAgICAgICAgICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJlY3QoMCwg
MCwgc3JjU2l6ZS53aWR0aCgpLCBzcmNTaXplLmhlaWdodCgpKSwgY29tcG9zaXRlT3ApOwotICAg
ICAgICAgICAgbV9jdXJyZW50RnJhbWUgPSBjdXJyZW50RnJhbWU7Ci0gICAgICAgICAgICByZXR1
cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBObyBpbWFnZSBvZiB0aGUgY29ycmVjdCBz
aXplIHdhcyBmb3VuZCwgZmFsbGJhY2sgdG8gZHJhd2luZyB0aGUgY3VycmVudCBmcmFtZQotICAg
IEludFNpemUgaW1hZ2VTaXplID0gQml0bWFwSW1hZ2U6OnNpemUoKTsKLSAgICBkcmF3KGN0eHQs
IGRzdFJlY3QsIEZsb2F0UmVjdCgwLCAwLCBpbWFnZVNpemUud2lkdGgoKSwgaW1hZ2VTaXplLmhl
aWdodCgpKSwgY29tcG9zaXRlT3ApOwotfQotCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4
OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNHV2luLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0
YUNHV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCShmcm9tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL1NpbXBsZUZvbnREYXRhV2luLmNwcDoyOTgzNCkKKysrIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ0dXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMjgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4g
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVy
IHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVz
IG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHBy
b21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNp
bXBsZUZvbnREYXRhLmgiCisKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI2luY2x1ZGUgIkZvbnQu
aCIKKyNpbmNsdWRlICJGb250Q2FjaGUuaCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNs
dWRlICJGb250RGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgorI2lu
Y2x1ZGUgPHVuaWNvZGUvdWNoYXIuaD4KKyNpbmNsdWRlIDx1bmljb2RlL3Vub3JtLmg+CisjaW5j
bHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CisjaW5jbHVk
ZSA8bWxhbmcuaD4KKyNpbmNsdWRlIDx0Y2hhci5oPgorI2luY2x1ZGUgPFdlYktpdFN5c3RlbUlu
dGVyZmFjZS9XZWJLaXRTeXN0ZW1JbnRlcmZhY2UuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgewor
Cit1c2luZyBzdGQ6Om1heDsKKworY29uc3QgZmxvYXQgY1NtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlw
bGllciA9IDAuN2Y7CisKK3N0YXRpYyBib29sIHNob3VsZEFwcGx5TWFjQXNjZW50SGFjazsKKwor
c3RhdGljIGlubGluZSBmbG9hdCBzY2FsZUVtVG9Vbml0cyhmbG9hdCB4LCB1bnNpZ25lZCB1bml0
c1BlckVtKSB7IHJldHVybiB1bml0c1BlckVtID8geCAvIChmbG9hdCl1bml0c1BlckVtIDogeDsg
fQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpzZXRTaG91bGRBcHBseU1hY0FzY2VudEhhY2soYm9v
bCBiKQoreworICAgIHNob3VsZEFwcGx5TWFjQXNjZW50SGFjayA9IGI7Cit9CisKK3ZvaWQgU2lt
cGxlRm9udERhdGE6OnBsYXRmb3JtSW5pdCgpCit7ICAgIAorICAgIG1fc3ludGhldGljQm9sZE9m
ZnNldCA9IG1fZm9udC5zeW50aGV0aWNCb2xkKCkgPyAxLjBmIDogMC5mOworICAgIG1fc2NyaXB0
Q2FjaGUgPSAwOworICAgIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMgPSAwOworICAgIG1faXNTeXN0
ZW1Gb250ID0gZmFsc2U7CisgICAgCisgICAgaWYgKG1fZm9udC51c2VHREkoKSkgeworICAgICAg
ICBIREMgaGRjID0gR2V0REMoMCk7CisgICAgICAgIEhHRElPQkogb2xkRm9udCA9IFNlbGVjdE9i
amVjdChoZGMsIG1fZm9udC5oZm9udCgpKTsKKyAgICAgICAgT1VUTElORVRFWFRNRVRSSUMgbWV0
cmljczsKKyAgICAgICAgR2V0T3V0bGluZVRleHRNZXRyaWNzKGhkYywgc2l6ZW9mKG1ldHJpY3Mp
LCAmbWV0cmljcyk7CisgICAgICAgIFRFWFRNRVRSSUMmIHRleHRNZXRyaWNzID0gbWV0cmljcy5v
dG1UZXh0TWV0cmljczsKKyAgICAgICAgbV9hc2NlbnQgPSB0ZXh0TWV0cmljcy50bUFzY2VudDsK
KyAgICAgICAgbV9kZXNjZW50ID0gdGV4dE1ldHJpY3MudG1EZXNjZW50OworICAgICAgICBtX2xp
bmVHYXAgPSB0ZXh0TWV0cmljcy50bUV4dGVybmFsTGVhZGluZzsKKyAgICAgICAgbV9saW5lU3Bh
Y2luZyA9IG1fYXNjZW50ICsgbV9kZXNjZW50ICsgbV9saW5lR2FwOworICAgICAgICBtX3hIZWln
aHQgPSBtX2FzY2VudCAqIDAuNTZmOyAvLyBCZXN0IGd1ZXNzIGZvciB4SGVpZ2h0IGlmIG5vIHgg
Z2x5cGggaXMgcHJlc2VudC4KKworICAgICAgICBHTFlQSE1FVFJJQ1MgZ207CisgICAgICAgIE1B
VDIgbWF0ID0geyAxLCAwLCAwLCAxIH07CisgICAgICAgIERXT1JEIGxlbiA9IEdldEdseXBoT3V0
bGluZShoZGMsICd4JywgR0dPX01FVFJJQ1MsICZnbSwgMCwgMCwgJm1hdCk7CisgICAgICAgIGlm
IChsZW4gIT0gR0RJX0VSUk9SICYmIGdtLmdtcHRHbHlwaE9yaWdpbi55ID4gMCkKKyAgICAgICAg
ICAgIG1feEhlaWdodCA9IGdtLmdtcHRHbHlwaE9yaWdpbi55OworCisgICAgICAgIG1fdW5pdHNQ
ZXJFbSA9IG1ldHJpY3Mub3RtRU1TcXVhcmU7CisKKyAgICAgICAgU2VsZWN0T2JqZWN0KGhkYywg
b2xkRm9udCk7CisgICAgICAgIFJlbGVhc2VEQygwLCBoZGMpOworCisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICBDR0ZvbnRSZWYgZm9udCA9IG1fZm9udC5jZ0ZvbnQoKTsKKyAgICBpbnQg
aUFzY2VudCA9IENHRm9udEdldEFzY2VudChmb250KTsKKyAgICBpbnQgaURlc2NlbnQgPSBDR0Zv
bnRHZXREZXNjZW50KGZvbnQpOworICAgIGludCBpTGluZUdhcCA9IENHRm9udEdldExlYWRpbmco
Zm9udCk7CisgICAgbV91bml0c1BlckVtID0gQ0dGb250R2V0VW5pdHNQZXJFbShmb250KTsKKyAg
ICBmbG9hdCBwb2ludFNpemUgPSBtX2ZvbnQuc2l6ZSgpOworICAgIGZsb2F0IGZBc2NlbnQgPSBz
Y2FsZUVtVG9Vbml0cyhpQXNjZW50LCBtX3VuaXRzUGVyRW0pICogcG9pbnRTaXplOworICAgIGZs
b2F0IGZEZXNjZW50ID0gLXNjYWxlRW1Ub1VuaXRzKGlEZXNjZW50LCBtX3VuaXRzUGVyRW0pICog
cG9pbnRTaXplOworICAgIGZsb2F0IGZMaW5lR2FwID0gc2NhbGVFbVRvVW5pdHMoaUxpbmVHYXAs
IG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7CisKKyAgICBpZiAoIWlzQ3VzdG9tRm9udCgpKSB7
CisgICAgICAgIEhEQyBkYyA9IEdldERDKDApOworICAgICAgICBIR0RJT0JKIG9sZEZvbnQgPSBT
ZWxlY3RPYmplY3QoZGMsIG1fZm9udC5oZm9udCgpKTsKKyAgICAgICAgaW50IGZhY2VMZW5ndGgg
PSBHZXRUZXh0RmFjZShkYywgMCwgMCk7CisgICAgICAgIFZlY3RvcjxUQ0hBUj4gZmFjZU5hbWUo
ZmFjZUxlbmd0aCk7CisgICAgICAgIEdldFRleHRGYWNlKGRjLCBmYWNlTGVuZ3RoLCBmYWNlTmFt
ZS5kYXRhKCkpOworICAgICAgICBtX2lzU3lzdGVtRm9udCA9ICFfdGNzY21wKGZhY2VOYW1lLmRh
dGEoKSwgX1QoIkx1Y2lkYSBHcmFuZGUiKSk7CisgICAgICAgIFNlbGVjdE9iamVjdChkYywgb2xk
Rm9udCk7CisgICAgICAgIFJlbGVhc2VEQygwLCBkYyk7CisKKyAgICAgICAgaWYgKHNob3VsZEFw
cGx5TWFjQXNjZW50SGFjaykgeworICAgICAgICAgICAgLy8gVGhpcyBjb2RlIGNvbWVzIGZyb20g
Rm9udERhdGFNYWMubW0uIFdlIG9ubHkgZXZlciBkbyB0aGlzIHdoZW4gcnVubmluZyByZWdyZXNz
aW9uIHRlc3RzIHNvIHRoYXQgb3VyIG1ldHJpY3Mgd2lsbCBtYXRjaCBNYWMuCisKKyAgICAgICAg
ICAgIC8vIFdlIG5lZWQgdG8gYWRqdXN0IFRpbWVzLCBIZWx2ZXRpY2EsIGFuZCBDb3VyaWVyIHRv
IGNsb3NlbHkgbWF0Y2ggdGhlCisgICAgICAgICAgICAvLyB2ZXJ0aWNhbCBtZXRyaWNzIG9mIHRo
ZWlyIE1pY3Jvc29mdCBjb3VudGVycGFydHMgdGhhdCBhcmUgdGhlIGRlIGZhY3RvCisgICAgICAg
ICAgICAvLyB3ZWIgc3RhbmRhcmQuIFRoZSBBcHBLaXQgYWRqdXN0bWVudCBvZiAyMCUgaXMgdG9v
IGJpZyBhbmQgaXMKKyAgICAgICAgICAgIC8vIGluY29ycmVjdGx5IGFkZGVkIHRvIGxpbmUgc3Bh
Y2luZywgc28gd2UgdXNlIGEgMTUlIGFkanVzdG1lbnQgaW5zdGVhZAorICAgICAgICAgICAgLy8g
YW5kIGFkZCBpdCB0byB0aGUgYXNjZW50LgorICAgICAgICAgICAgaWYgKCFfdGNzY21wKGZhY2VO
YW1lLmRhdGEoKSwgX1QoIlRpbWVzIikpIHx8ICFfdGNzY21wKGZhY2VOYW1lLmRhdGEoKSwgX1Qo
IkhlbHZldGljYSIpKSB8fCAhX3Rjc2NtcChmYWNlTmFtZS5kYXRhKCksIF9UKCJDb3VyaWVyIikp
KQorICAgICAgICAgICAgICAgIGZBc2NlbnQgKz0gZmxvb3JmKCgoZkFzY2VudCArIGZEZXNjZW50
KSAqIDAuMTVmKSArIDAuNWYpOworICAgICAgICB9CisgICAgfQorCisgICAgbV9hc2NlbnQgPSBs
cm91bmRmKGZBc2NlbnQpOworICAgIG1fZGVzY2VudCA9IGxyb3VuZGYoZkRlc2NlbnQpOworICAg
IG1fbGluZUdhcCA9IGxyb3VuZGYoZkxpbmVHYXApOworICAgIG1fbGluZVNwYWNpbmcgPSBtX2Fz
Y2VudCArIG1fZGVzY2VudCArIG1fbGluZUdhcDsKKworICAgIC8vIE1lYXN1cmUgdGhlIGFjdHVh
bCBjaGFyYWN0ZXIgIngiLCBiZWNhdXNlIEFwcEtpdCBzeW50aGVzaXplcyBYIGhlaWdodCByYXRo
ZXIgdGhhbiBnZXR0aW5nIGl0IGZyb20gdGhlIGZvbnQuCisgICAgLy8gVW5mb3J0dW5hdGVseSwg
TlNGb250IHdpbGwgcm91bmQgdGhpcyBmb3IgdXMgc28gd2UgZG9uJ3QgcXVpdGUgZ2V0IHRoZSBy
aWdodCB2YWx1ZS4KKyAgICBHbHlwaFBhZ2UqIGdseXBoUGFnZVplcm8gPSBHbHlwaFBhZ2VUcmVl
Tm9kZTo6Z2V0Um9vdENoaWxkKHRoaXMsIDApLT5wYWdlKCk7CisgICAgR2x5cGggeEdseXBoID0g
Z2x5cGhQYWdlWmVybyA/IGdseXBoUGFnZVplcm8tPmdseXBoRGF0YUZvckNoYXJhY3RlcigneCcp
LmdseXBoIDogMDsKKyAgICBpZiAoeEdseXBoKSB7CisgICAgICAgIENHUmVjdCB4Qm94OworICAg
ICAgICBDR0ZvbnRHZXRHbHlwaEJCb3hlcyhmb250LCAmeEdseXBoLCAxLCAmeEJveCk7CisgICAg
ICAgIC8vIFVzZSB0aGUgbWF4aW11bSBvZiBlaXRoZXIgd2lkdGggb3IgaGVpZ2h0IGJlY2F1c2Ug
IngiIGlzIG5lYXJseSBzcXVhcmUKKyAgICAgICAgLy8gYW5kIHdlYiBwYWdlcyB0aGF0IGZvb2xp
c2hseSB1c2UgdGhpcyBtZXRyaWMgZm9yIHdpZHRoIHdpbGwgYmUgbGFpZCBvdXQKKyAgICAgICAg
Ly8gcG9vcmx5IGlmIHdlIHJldHVybiBhbiBhY2N1cmF0ZSBoZWlnaHQuIENsYXNzaWMgY2FzZSBp
cyBUaW1lcyAxMyBwb2ludCwKKyAgICAgICAgLy8gd2hpY2ggaGFzIGFuICJ4IiB0aGF0IGlzIDd4
NiBwaXhlbHMuCisgICAgICAgIG1feEhlaWdodCA9IHNjYWxlRW1Ub1VuaXRzKG1heChDR1JlY3RH
ZXRNYXhYKHhCb3gpLCBDR1JlY3RHZXRNYXhZKHhCb3gpKSwgbV91bml0c1BlckVtKSAqIHBvaW50
U2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgaVhIZWlnaHQgPSBDR0ZvbnRHZXRYSGVp
Z2h0KGZvbnQpOworICAgICAgICBtX3hIZWlnaHQgPSBzY2FsZUVtVG9Vbml0cyhpWEhlaWdodCwg
bV91bml0c1BlckVtKSAqIHBvaW50U2l6ZTsKKyAgICB9Cit9CisKK3ZvaWQgU2ltcGxlRm9udERh
dGE6OnBsYXRmb3JtRGVzdHJveSgpCit7CisgICAgaWYgKCFpc0N1c3RvbUZvbnQoKSkgeworICAg
ICAgICBEZWxldGVPYmplY3QobV9mb250Lmhmb250KCkpOworICAgICAgICBDR0ZvbnRSZWxlYXNl
KG1fZm9udC5jZ0ZvbnQoKSk7CisgICAgfQorCisgICAgLy8gV2UgZG9uJ3QgaGFzaCB0aGlzIG9u
IFdpbjMyLCBzbyBpdCdzIGVmZmVjdGl2ZWx5IG93bmVkIGJ5IHVzLgorICAgIGRlbGV0ZSBtX3Nt
YWxsQ2Fwc0ZvbnREYXRhOworCisgICAgU2NyaXB0RnJlZUNhY2hlKCZtX3NjcmlwdENhY2hlKTsK
KyAgICBkZWxldGUgbV9zY3JpcHRGb250UHJvcGVydGllczsKK30KKworU2ltcGxlRm9udERhdGEq
IFNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNGb250RGF0YShjb25zdCBGb250RGVzY3JpcHRpb24m
IGZvbnREZXNjcmlwdGlvbikgY29uc3QKK3sKKyAgICBpZiAoIW1fc21hbGxDYXBzRm9udERhdGEp
IHsKKyAgICAgICAgZmxvYXQgc21hbGxDYXBzSGVpZ2h0ID0gY1NtYWxsQ2Fwc0ZvbnRTaXplTXVs
dGlwbGllciAqIG1fZm9udC5zaXplKCk7CisgICAgICAgIGlmIChpc0N1c3RvbUZvbnQoKSkgewor
ICAgICAgICAgICAgRm9udFBsYXRmb3JtRGF0YSBzbWFsbENhcHNGb250RGF0YShtX2ZvbnQpOwor
ICAgICAgICAgICAgc21hbGxDYXBzRm9udERhdGEuc2V0U2l6ZShzbWFsbENhcHNIZWlnaHQpOwor
ICAgICAgICAgICAgbV9zbWFsbENhcHNGb250RGF0YSA9IG5ldyBTaW1wbGVGb250RGF0YShzbWFs
bENhcHNGb250RGF0YSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgTE9HRk9OVCB3aW5mb250OworICAgICAgICAgICAgR2V0T2JqZWN0KG1fZm9udC5oZm9udCgp
LCBzaXplb2YoTE9HRk9OVCksICZ3aW5mb250KTsKKyAgICAgICAgICAgIHdpbmZvbnQubGZIZWln
aHQgPSAtbHJvdW5kZihzbWFsbENhcHNIZWlnaHQgKiAobV9mb250LnVzZUdESSgpID8gMSA6IDMy
KSk7CisgICAgICAgICAgICBIRk9OVCBoZm9udCA9IENyZWF0ZUZvbnRJbmRpcmVjdCgmd2luZm9u
dCk7CisgICAgICAgICAgICBtX3NtYWxsQ2Fwc0ZvbnREYXRhID0gbmV3IFNpbXBsZUZvbnREYXRh
KEZvbnRQbGF0Zm9ybURhdGEoaGZvbnQsIHNtYWxsQ2Fwc0hlaWdodCwgZm9udERlc2NyaXB0aW9u
LmJvbGQoKSwgZm9udERlc2NyaXB0aW9uLml0YWxpYygpLCBtX2ZvbnQudXNlR0RJKCkpKTsKKyAg
ICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbV9zbWFsbENhcHNGb250RGF0YTsKK30KKworYm9v
bCBTaW1wbGVGb250RGF0YTo6Y29udGFpbnNDaGFyYWN0ZXJzKGNvbnN0IFVDaGFyKiBjaGFyYWN0
ZXJzLCBpbnQgbGVuZ3RoKSBjb25zdAoreworICAgIC8vIEZJWE1FOiBTdXBwb3J0IGN1c3RvbSBm
b250cy4KKyAgICBpZiAoaXNDdXN0b21Gb250KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIC8vIEZJWE1FOiBNaWNyb3NvZnQgZG9jdW1lbnRhdGlvbiBzZWVtcyB0byBpbXBseSB0aGF0
IGNoYXJhY3RlcnMgY2FuIGJlIG91dHB1dCB1c2luZyBhIGdpdmVuIGZvbnQgYW5kIERDCisgICAg
Ly8gbWVyZWx5IGJ5IHRlc3RpbmcgY29kZSBwYWdlIGludGVyc2VjdGlvbi4gIFRoaXMgc2VlbXMg
c3VzcGVjdCB0aG91Z2guICBDYW4ndCBhIGZvbnQgb25seSBwYXJ0aWFsbHkKKyAgICAvLyBjb3Zl
ciBhIGdpdmVuIGNvZGUgcGFnZT8KKyAgICBJTUxhbmdGb250TGluazIqIGxhbmdGb250TGluayA9
IEZvbnRDYWNoZTo6Z2V0Rm9udExpbmtJbnRlcmZhY2UoKTsKKyAgICBpZiAoIWxhbmdGb250TGlu
aykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgSERDIGRjID0gR2V0REMoMCk7CisgICAg
CisgICAgRFdPUkQgYWNwQ29kZVBhZ2VzOworICAgIGxhbmdGb250TGluay0+Q29kZVBhZ2VUb0Nv
ZGVQYWdlcyhDUF9BQ1AsICZhY3BDb2RlUGFnZXMpOworCisgICAgRFdPUkQgZm9udENvZGVQYWdl
czsKKyAgICBsYW5nRm9udExpbmstPkdldEZvbnRDb2RlUGFnZXMoZGMsIG1fZm9udC5oZm9udCgp
LCAmZm9udENvZGVQYWdlcyk7CisKKyAgICBEV09SRCBhY3R1YWxDb2RlUGFnZXM7CisgICAgbG9u
ZyBudW1DaGFyYWN0ZXJzUHJvY2Vzc2VkOworICAgIGxvbmcgb2Zmc2V0ID0gMDsKKyAgICB3aGls
ZSAob2Zmc2V0IDwgbGVuZ3RoKSB7CisgICAgICAgIGxhbmdGb250TGluay0+R2V0U3RyQ29kZVBh
Z2VzKGNoYXJhY3RlcnMsIGxlbmd0aCwgYWNwQ29kZVBhZ2VzLCAmYWN0dWFsQ29kZVBhZ2VzLCAm
bnVtQ2hhcmFjdGVyc1Byb2Nlc3NlZCk7CisgICAgICAgIGlmICgoYWN0dWFsQ29kZVBhZ2VzICYg
Zm9udENvZGVQYWdlcykgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
b2Zmc2V0ICs9IG51bUNoYXJhY3RlcnNQcm9jZXNzZWQ7CisgICAgfQorCisgICAgUmVsZWFzZURD
KDAsIGRjKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpk
ZXRlcm1pbmVQaXRjaCgpCit7CisgICAgaWYgKGlzQ3VzdG9tRm9udCgpKSB7CisgICAgICAgIG1f
dHJlYXRBc0ZpeGVkUGl0Y2ggPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IC8vIFRFWFRNRVRSSUNTIGhhdmUgdGhpcy4gIFNldCBtX3RyZWF0QXNGaXhlZFBpdGNoIGJhc2Vk
IG9mZiB0aGF0LgorICAgIEhEQyBkYyA9IEdldERDKDApOworICAgIFNhdmVEQyhkYyk7CisgICAg
U2VsZWN0T2JqZWN0KGRjLCBtX2ZvbnQuaGZvbnQoKSk7CisKKyAgICAvLyBZZXMsIHRoaXMgbG9v
a3MgYmFja3dhcmRzLCBidXQgdGhlIGZpeGVkIHBpdGNoIGJpdCBpcyBhY3R1YWxseSBzZXQgaWYg
dGhlIGZvbnQKKyAgICAvLyBpcyAqbm90KiBmaXhlZCBwaXRjaC4gIFVuYmVsaWV2YWJsZSBidXQg
dHJ1ZS4KKyAgICBURVhUTUVUUklDIHRtOworICAgIEdldFRleHRNZXRyaWNzKGRjLCAmdG0pOwor
ICAgIG1fdHJlYXRBc0ZpeGVkUGl0Y2ggPSAoKHRtLnRtUGl0Y2hBbmRGYW1pbHkgJiBUTVBGX0ZJ
WEVEX1BJVENIKSA9PSAwKTsKKworICAgIFJlc3RvcmVEQyhkYywgLTEpOworICAgIFJlbGVhc2VE
QygwLCBkYyk7Cit9CisKK2Zsb2F0IFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybVdpZHRoRm9yR2x5
cGgoR2x5cGggZ2x5cGgpIGNvbnN0Cit7CisgICAgaWYgKG1fZm9udC51c2VHREkoKSkgeworICAg
ICAgICBIREMgaGRjID0gR2V0REMoMCk7CisgICAgICAgIEhHRElPQkogb2xkRm9udCA9IFNlbGVj
dE9iamVjdChoZGMsIG1fZm9udC5oZm9udCgpKTsKKyAgICAgICAgaW50IHdpZHRoOworICAgICAg
ICBHZXRDaGFyV2lkdGhJKGhkYywgZ2x5cGgsIDEsIDAsICZ3aWR0aCk7CisgICAgICAgIFNlbGVj
dE9iamVjdChoZGMsIG9sZEZvbnQpOworICAgICAgICBSZWxlYXNlREMoMCwgaGRjKTsKKyAgICAg
ICAgcmV0dXJuIHdpZHRoOworICAgIH0KKworICAgIENHRm9udFJlZiBmb250ID0gbV9mb250LmNn
Rm9udCgpOworICAgIGZsb2F0IHBvaW50U2l6ZSA9IG1fZm9udC5zaXplKCk7CisgICAgQ0dTaXpl
IGFkdmFuY2U7CisgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENHQWZmaW5lVHJhbnNmb3JtTWFr
ZVNjYWxlKHBvaW50U2l6ZSwgcG9pbnRTaXplKTsKKyAgICAvLyBGSVhNRTogTmVlZCB0byBhZGQg
cmVhbCBzdXBwb3J0IGZvciBwcmludGVyIGZvbnRzLgorICAgIGJvb2wgaXNQcmludGVyRm9udCA9
IGZhbHNlOworICAgIHdrR2V0R2x5cGhBZHZhbmNlcyhmb250LCBtLCBtX2lzU3lzdGVtRm9udCwg
aXNQcmludGVyRm9udCwgZ2x5cGgsIGFkdmFuY2UpOworICAgIHJldHVybiBhZHZhbmNlLndpZHRo
ICsgbV9zeW50aGV0aWNCb2xkT2Zmc2V0OworfQorCitTQ1JJUFRfRk9OVFBST1BFUlRJRVMqIFNp
bXBsZUZvbnREYXRhOjpzY3JpcHRGb250UHJvcGVydGllcygpIGNvbnN0Cit7CisgICAgaWYgKCFt
X3NjcmlwdEZvbnRQcm9wZXJ0aWVzKSB7CisgICAgICAgIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMg
PSBuZXcgU0NSSVBUX0ZPTlRQUk9QRVJUSUVTOworICAgICAgICBtZW1zZXQobV9zY3JpcHRGb250
UHJvcGVydGllcywgMCwgc2l6ZW9mKFNDUklQVF9GT05UUFJPUEVSVElFUykpOworICAgICAgICBt
X3NjcmlwdEZvbnRQcm9wZXJ0aWVzLT5jQnl0ZXMgPSBzaXplb2YoU0NSSVBUX0ZPTlRQUk9QRVJU
SUVTKTsKKyAgICAgICAgSFJFU1VMVCByZXN1bHQgPSBTY3JpcHRHZXRGb250UHJvcGVydGllcygw
LCBzY3JpcHRDYWNoZSgpLCBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzKTsKKyAgICAgICAgaWYgKHJl
c3VsdCA9PSBFX1BFTkRJTkcpIHsKKyAgICAgICAgICAgIEhEQyBkYyA9IEdldERDKDApOworICAg
ICAgICAgICAgU2F2ZURDKGRjKTsKKyAgICAgICAgICAgIFNlbGVjdE9iamVjdChkYywgbV9mb250
Lmhmb250KCkpOworICAgICAgICAgICAgU2NyaXB0R2V0Rm9udFByb3BlcnRpZXMoZGMsIHNjcmlw
dENhY2hlKCksIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMpOworICAgICAgICAgICAgUmVzdG9yZURD
KGRjLCAtMSk7CisgICAgICAgICAgICBSZWxlYXNlREMoMCwgZGMpOworICAgICAgICB9CisgICAg
fQorICAgIHJldHVybiBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzOworfQorCit9CkluZGV4OiBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNHV2luLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNHV2lu
LmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9T
aW1wbGVGb250RGF0YUNHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8q
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuICBBbGwg
cmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0zOCwy
NyArMzgsMTggQEAKICNpbmNsdWRlIDx1bmljb2RlL3VjaGFyLmg+CiAjaW5jbHVkZSA8dW5pY29k
ZS91bm9ybS5oPgogI2luY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2
aWNlcy5oPgorI2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVyZmFjZS9XZWJLaXRTeXN0ZW1JbnRl
cmZhY2UuaD4KICNpbmNsdWRlIDxtbGFuZy5oPgogI2luY2x1ZGUgPHRjaGFyLmg+Ci0jaW5jbHVk
ZSA8V2ViS2l0U3lzdGVtSW50ZXJmYWNlL1dlYktpdFN5c3RlbUludGVyZmFjZS5oPgogCiBuYW1l
c3BhY2UgV2ViQ29yZSB7CiAKIHVzaW5nIHN0ZDo6bWF4OwogCi1jb25zdCBmbG9hdCBjU21hbGxD
YXBzRm9udFNpemVNdWx0aXBsaWVyID0gMC43ZjsKLQotc3RhdGljIGJvb2wgc2hvdWxkQXBwbHlN
YWNBc2NlbnRIYWNrOwotCi1zdGF0aWMgaW5saW5lIGZsb2F0IHNjYWxlRW1Ub1VuaXRzKGZsb2F0
IHgsIHVuc2lnbmVkIHVuaXRzUGVyRW0pIHsgcmV0dXJuIHVuaXRzUGVyRW0gPyB4IC8gKGZsb2F0
KXVuaXRzUGVyRW0gOiB4OyB9Ci0KLXZvaWQgU2ltcGxlRm9udERhdGE6OnNldFNob3VsZEFwcGx5
TWFjQXNjZW50SGFjayhib29sIGIpCi17Ci0gICAgc2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrID0g
YjsKLX0KK3N0YXRpYyBpbmxpbmUgZmxvYXQgc2NhbGVFbVRvVW5pdHMoZmxvYXQgeCwgdW5zaWdu
ZWQgdW5pdHNQZXJFbSkgeyByZXR1cm4gdW5pdHNQZXJFbSA/IHggLyBzdGF0aWNfY2FzdDxmbG9h
dD4odW5pdHNQZXJFbSkgOiB4OyB9CiAKIHZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtSW5p
dCgpCi17ICAgIAorewogICAgIG1fc3ludGhldGljQm9sZE9mZnNldCA9IG1fZm9udC5zeW50aGV0
aWNCb2xkKCkgPyAxLjBmIDogMC5mOwogICAgIG1fc2NyaXB0Q2FjaGUgPSAwOwogICAgIG1fc2Ny
aXB0Rm9udFByb3BlcnRpZXMgPSAwOwpAQCAtMTEwLDcgKzEwMSw3IEBAIHZvaWQgU2ltcGxlRm9u
dERhdGE6OnBsYXRmb3JtSW5pdCgpCiAgICAgICAgIFNlbGVjdE9iamVjdChkYywgb2xkRm9udCk7
CiAgICAgICAgIFJlbGVhc2VEQygwLCBkYyk7CiAKLSAgICAgICAgaWYgKHNob3VsZEFwcGx5TWFj
QXNjZW50SGFjaykgeworICAgICAgICBpZiAoc2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrKCkpIHsK
ICAgICAgICAgICAgIC8vIFRoaXMgY29kZSBjb21lcyBmcm9tIEZvbnREYXRhTWFjLm1tLiBXZSBv
bmx5IGV2ZXIgZG8gdGhpcyB3aGVuIHJ1bm5pbmcgcmVncmVzc2lvbiB0ZXN0cyBzbyB0aGF0IG91
ciBtZXRyaWNzIHdpbGwgbWF0Y2ggTWFjLgogCiAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGFk
anVzdCBUaW1lcywgSGVsdmV0aWNhLCBhbmQgQ291cmllciB0byBjbG9zZWx5IG1hdGNoIHRoZQpA
QCAtMTYwLDgzICsxNTEsNiBAQCB2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3ko
KQogICAgIGRlbGV0ZSBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzOwogfQogCi1TaW1wbGVGb250RGF0
YSogU2ltcGxlRm9udERhdGE6OnNtYWxsQ2Fwc0ZvbnREYXRhKGNvbnN0IEZvbnREZXNjcmlwdGlv
biYgZm9udERlc2NyaXB0aW9uKSBjb25zdAotewotICAgIGlmICghbV9zbWFsbENhcHNGb250RGF0
YSkgewotICAgICAgICBmbG9hdCBzbWFsbENhcHNIZWlnaHQgPSBjU21hbGxDYXBzRm9udFNpemVN
dWx0aXBsaWVyICogbV9mb250LnNpemUoKTsKLSAgICAgICAgaWYgKGlzQ3VzdG9tRm9udCgpKSB7
Ci0gICAgICAgICAgICBGb250UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnREYXRhKG1fZm9udCk7
Ci0gICAgICAgICAgICBzbWFsbENhcHNGb250RGF0YS5zZXRTaXplKHNtYWxsQ2Fwc0hlaWdodCk7
Ci0gICAgICAgICAgICBtX3NtYWxsQ2Fwc0ZvbnREYXRhID0gbmV3IFNpbXBsZUZvbnREYXRhKHNt
YWxsQ2Fwc0ZvbnREYXRhLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICBMT0dGT05UIHdpbmZvbnQ7Ci0gICAgICAgICAgICBHZXRPYmplY3QobV9mb250Lmhmb250
KCksIHNpemVvZihMT0dGT05UKSwgJndpbmZvbnQpOwotICAgICAgICAgICAgd2luZm9udC5sZkhl
aWdodCA9IC1scm91bmRmKHNtYWxsQ2Fwc0hlaWdodCAqIChtX2ZvbnQudXNlR0RJKCkgPyAxIDog
MzIpKTsKLSAgICAgICAgICAgIEhGT05UIGhmb250ID0gQ3JlYXRlRm9udEluZGlyZWN0KCZ3aW5m
b250KTsKLSAgICAgICAgICAgIG1fc21hbGxDYXBzRm9udERhdGEgPSBuZXcgU2ltcGxlRm9udERh
dGEoRm9udFBsYXRmb3JtRGF0YShoZm9udCwgc21hbGxDYXBzSGVpZ2h0LCBmb250RGVzY3JpcHRp
b24uYm9sZCgpLCBmb250RGVzY3JpcHRpb24uaXRhbGljKCksIG1fZm9udC51c2VHREkoKSkpOwot
ICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtX3NtYWxsQ2Fwc0ZvbnREYXRhOwotfQotCi1i
b29sIFNpbXBsZUZvbnREYXRhOjpjb250YWluc0NoYXJhY3RlcnMoY29uc3QgVUNoYXIqIGNoYXJh
Y3RlcnMsIGludCBsZW5ndGgpIGNvbnN0Ci17Ci0gICAgLy8gRklYTUU6IFN1cHBvcnQgY3VzdG9t
IGZvbnRzLgotICAgIGlmIChpc0N1c3RvbUZvbnQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgLy8gRklYTUU6IE1pY3Jvc29mdCBkb2N1bWVudGF0aW9uIHNlZW1zIHRvIGltcGx5IHRo
YXQgY2hhcmFjdGVycyBjYW4gYmUgb3V0cHV0IHVzaW5nIGEgZ2l2ZW4gZm9udCBhbmQgREMKLSAg
ICAvLyBtZXJlbHkgYnkgdGVzdGluZyBjb2RlIHBhZ2UgaW50ZXJzZWN0aW9uLiAgVGhpcyBzZWVt
cyBzdXNwZWN0IHRob3VnaC4gIENhbid0IGEgZm9udCBvbmx5IHBhcnRpYWxseQotICAgIC8vIGNv
dmVyIGEgZ2l2ZW4gY29kZSBwYWdlPwotICAgIElNTGFuZ0ZvbnRMaW5rMiogbGFuZ0ZvbnRMaW5r
ID0gRm9udENhY2hlOjpnZXRGb250TGlua0ludGVyZmFjZSgpOwotICAgIGlmICghbGFuZ0ZvbnRM
aW5rKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBIREMgZGMgPSBHZXREQygwKTsKLSAg
ICAKLSAgICBEV09SRCBhY3BDb2RlUGFnZXM7Ci0gICAgbGFuZ0ZvbnRMaW5rLT5Db2RlUGFnZVRv
Q29kZVBhZ2VzKENQX0FDUCwgJmFjcENvZGVQYWdlcyk7Ci0KLSAgICBEV09SRCBmb250Q29kZVBh
Z2VzOwotICAgIGxhbmdGb250TGluay0+R2V0Rm9udENvZGVQYWdlcyhkYywgbV9mb250Lmhmb250
KCksICZmb250Q29kZVBhZ2VzKTsKLQotICAgIERXT1JEIGFjdHVhbENvZGVQYWdlczsKLSAgICBs
b25nIG51bUNoYXJhY3RlcnNQcm9jZXNzZWQ7Ci0gICAgbG9uZyBvZmZzZXQgPSAwOwotICAgIHdo
aWxlIChvZmZzZXQgPCBsZW5ndGgpIHsKLSAgICAgICAgbGFuZ0ZvbnRMaW5rLT5HZXRTdHJDb2Rl
UGFnZXMoY2hhcmFjdGVycywgbGVuZ3RoLCBhY3BDb2RlUGFnZXMsICZhY3R1YWxDb2RlUGFnZXMs
ICZudW1DaGFyYWN0ZXJzUHJvY2Vzc2VkKTsKLSAgICAgICAgaWYgKChhY3R1YWxDb2RlUGFnZXMg
JiBmb250Q29kZVBhZ2VzKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAg
ICBvZmZzZXQgKz0gbnVtQ2hhcmFjdGVyc1Byb2Nlc3NlZDsKLSAgICB9Ci0KLSAgICBSZWxlYXNl
REMoMCwgZGMpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU2ltcGxlRm9udERhdGE6
OmRldGVybWluZVBpdGNoKCkKLXsKLSAgICBpZiAoaXNDdXN0b21Gb250KCkpIHsKLSAgICAgICAg
bV90cmVhdEFzRml4ZWRQaXRjaCA9IGZhbHNlOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0g
ICAgLy8gVEVYVE1FVFJJQ1MgaGF2ZSB0aGlzLiAgU2V0IG1fdHJlYXRBc0ZpeGVkUGl0Y2ggYmFz
ZWQgb2ZmIHRoYXQuCi0gICAgSERDIGRjID0gR2V0REMoMCk7Ci0gICAgU2F2ZURDKGRjKTsKLSAg
ICBTZWxlY3RPYmplY3QoZGMsIG1fZm9udC5oZm9udCgpKTsKLQotICAgIC8vIFllcywgdGhpcyBs
b29rcyBiYWNrd2FyZHMsIGJ1dCB0aGUgZml4ZWQgcGl0Y2ggYml0IGlzIGFjdHVhbGx5IHNldCBp
ZiB0aGUgZm9udAotICAgIC8vIGlzICpub3QqIGZpeGVkIHBpdGNoLiAgVW5iZWxpZXZhYmxlIGJ1
dCB0cnVlLgotICAgIFRFWFRNRVRSSUMgdG07Ci0gICAgR2V0VGV4dE1ldHJpY3MoZGMsICZ0bSk7
Ci0gICAgbV90cmVhdEFzRml4ZWRQaXRjaCA9ICgodG0udG1QaXRjaEFuZEZhbWlseSAmIFRNUEZf
RklYRURfUElUQ0gpID09IDApOwotCi0gICAgUmVzdG9yZURDKGRjLCAtMSk7Ci0gICAgUmVsZWFz
ZURDKDAsIGRjKTsKLX0KLQogZmxvYXQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtV2lkdGhGb3JH
bHlwaChHbHlwaCBnbHlwaCkgY29uc3QKIHsKICAgICBpZiAobV9mb250LnVzZUdESSgpKSB7CkBA
IC0yNTMsMjkgKzE2NywxMiBAQCBmbG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZv
ckdsCiAgICAgZmxvYXQgcG9pbnRTaXplID0gbV9mb250LnNpemUoKTsKICAgICBDR1NpemUgYWR2
YW5jZTsKICAgICBDR0FmZmluZVRyYW5zZm9ybSBtID0gQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlU2Nh
bGUocG9pbnRTaXplLCBwb2ludFNpemUpOworIAogICAgIC8vIEZJWE1FOiBOZWVkIHRvIGFkZCBy
ZWFsIHN1cHBvcnQgZm9yIHByaW50ZXIgZm9udHMuCiAgICAgYm9vbCBpc1ByaW50ZXJGb250ID0g
ZmFsc2U7CiAgICAgd2tHZXRHbHlwaEFkdmFuY2VzKGZvbnQsIG0sIG1faXNTeXN0ZW1Gb250LCBp
c1ByaW50ZXJGb250LCBnbHlwaCwgYWR2YW5jZSk7Ci0gICAgcmV0dXJuIGFkdmFuY2Uud2lkdGgg
KyBtX3N5bnRoZXRpY0JvbGRPZmZzZXQ7Ci19CiAKLVNDUklQVF9GT05UUFJPUEVSVElFUyogU2lt
cGxlRm9udERhdGE6OnNjcmlwdEZvbnRQcm9wZXJ0aWVzKCkgY29uc3QKLXsKLSAgICBpZiAoIW1f
c2NyaXB0Rm9udFByb3BlcnRpZXMpIHsKLSAgICAgICAgbV9zY3JpcHRGb250UHJvcGVydGllcyA9
IG5ldyBTQ1JJUFRfRk9OVFBST1BFUlRJRVM7Ci0gICAgICAgIG1lbXNldChtX3NjcmlwdEZvbnRQ
cm9wZXJ0aWVzLCAwLCBzaXplb2YoU0NSSVBUX0ZPTlRQUk9QRVJUSUVTKSk7Ci0gICAgICAgIG1f
c2NyaXB0Rm9udFByb3BlcnRpZXMtPmNCeXRlcyA9IHNpemVvZihTQ1JJUFRfRk9OVFBST1BFUlRJ
RVMpOwotICAgICAgICBIUkVTVUxUIHJlc3VsdCA9IFNjcmlwdEdldEZvbnRQcm9wZXJ0aWVzKDAs
IHNjcmlwdENhY2hlKCksIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMpOwotICAgICAgICBpZiAocmVz
dWx0ID09IEVfUEVORElORykgewotICAgICAgICAgICAgSERDIGRjID0gR2V0REMoMCk7Ci0gICAg
ICAgICAgICBTYXZlREMoZGMpOwotICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBtX2ZvbnQu
aGZvbnQoKSk7Ci0gICAgICAgICAgICBTY3JpcHRHZXRGb250UHJvcGVydGllcyhkYywgc2NyaXB0
Q2FjaGUoKSwgbV9zY3JpcHRGb250UHJvcGVydGllcyk7Ci0gICAgICAgICAgICBSZXN0b3JlREMo
ZGMsIC0xKTsKLSAgICAgICAgICAgIFJlbGVhc2VEQygwLCBkYyk7Ci0gICAgICAgIH0KLSAgICB9
Ci0gICAgcmV0dXJuIG1fc2NyaXB0Rm9udFByb3BlcnRpZXM7CisgICAgcmV0dXJuIGFkdmFuY2Uu
d2lkdGggKyBtX3N5bnRoZXRpY0JvbGRPZmZzZXQ7CiB9CiAKIH0KSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ2Fpcm9XaW4uY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ2Fpcm9XaW4u
Y3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxl
Rm9udERhdGFDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTAyIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1
dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1
dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAor
ICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4g
cGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBB
TkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQK
KyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNpbXBsZUZvbnREYXRhLmgiCisKKyNpbmNs
dWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJGb250LmgiCisjaW5jbHVkZSAiRm9udENhY2hl
LmgiCisjaW5jbHVkZSAiRm9udERlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50
ZWQuaCIKKyNpbmNsdWRlIDxtbGFuZy5oPgorI2luY2x1ZGUgPHRjaGFyLmg+CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKwordm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKK3sKKyAg
ICBtX3NjcmlwdENhY2hlID0gMDsKKyAgICBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzID0gMDsKKyAg
ICBtX2lzU3lzdGVtRm9udCA9IGZhbHNlOworICAgIAorICAgIGlmIChtX2ZvbnQudXNlR0RJKCkp
IHsKKyAgICAgICAgSERDIGhkYyA9IEdldERDKDApOworICAgICAgICBIR0RJT0JKIG9sZEZvbnQg
PSBTZWxlY3RPYmplY3QoaGRjLCBtX2ZvbnQuaGZvbnQoKSk7CisgICAgICAgIE9VVExJTkVURVhU
TUVUUklDIG1ldHJpY3M7CisgICAgICAgIEdldE91dGxpbmVUZXh0TWV0cmljcyhoZGMsIHNpemVv
ZihtZXRyaWNzKSwgJm1ldHJpY3MpOworICAgICAgICBURVhUTUVUUklDJiB0ZXh0TWV0cmljcyA9
IG1ldHJpY3Mub3RtVGV4dE1ldHJpY3M7CisgICAgICAgIG1fYXNjZW50ID0gdGV4dE1ldHJpY3Mu
dG1Bc2NlbnQ7CisgICAgICAgIG1fZGVzY2VudCA9IHRleHRNZXRyaWNzLnRtRGVzY2VudDsKKyAg
ICAgICAgbV9saW5lR2FwID0gdGV4dE1ldHJpY3MudG1FeHRlcm5hbExlYWRpbmc7CisgICAgICAg
IG1fbGluZVNwYWNpbmcgPSBtX2FzY2VudCArIG1fZGVzY2VudCArIG1fbGluZUdhcDsKKyAgICAg
ICAgbV94SGVpZ2h0ID0gbV9hc2NlbnQgKiAwLjU2ZjsgLy8gQmVzdCBndWVzcyBmb3IgeEhlaWdo
dCBpZiBubyB4IGdseXBoIGlzIHByZXNlbnQuCisKKyAgICAgICAgR0xZUEhNRVRSSUNTIGdtOwor
ICAgICAgICBNQVQyIG1hdCA9IHsgMSwgMCwgMCwgMSB9OworICAgICAgICBEV09SRCBsZW4gPSBH
ZXRHbHlwaE91dGxpbmUoaGRjLCAneCcsIEdHT19NRVRSSUNTLCAmZ20sIDAsIDAsICZtYXQpOwor
ICAgICAgICBpZiAobGVuICE9IEdESV9FUlJPUiAmJiBnbS5nbXB0R2x5cGhPcmlnaW4ueSA+IDAp
CisgICAgICAgICAgICBtX3hIZWlnaHQgPSBnbS5nbXB0R2x5cGhPcmlnaW4ueTsKKworICAgICAg
ICBtX3VuaXRzUGVyRW0gPSBtZXRyaWNzLm90bUVNU3F1YXJlOworCisgICAgICAgIFNlbGVjdE9i
amVjdChoZGMsIG9sZEZvbnQpOworICAgICAgICBSZWxlYXNlREMoMCwgaGRjKTsKKworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgLy8gRklYTUU6IFRoaXMgc2VjdGlvbiBzaG91bGQgZGV0
ZXJtaW5lIGZvbnQgZGltZW5zaW9ucyAoc2VlIENHIGltcGxlbWVudGF0aW9uKS4KKyAgICBub3RJ
bXBsZW1lbnRlZCgpOworfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3ko
KQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK2Zsb2F0IFNpbXBsZUZvbnREYXRhOjpw
bGF0Zm9ybVdpZHRoRm9yR2x5cGgoR2x5cGggZ2x5cGgpIGNvbnN0Cit7CisgICAgaWYgKG1fZm9u
dC51c2VHREkoKSkgeworICAgICAgICBIREMgaGRjID0gR2V0REMoMCk7CisgICAgICAgIEhHRElP
Qkogb2xkRm9udCA9IFNlbGVjdE9iamVjdChoZGMsIG1fZm9udC5oZm9udCgpKTsKKyAgICAgICAg
aW50IHdpZHRoOworICAgICAgICBHZXRDaGFyV2lkdGhJKGhkYywgZ2x5cGgsIDEsIDAsICZ3aWR0
aCk7CisgICAgICAgIFNlbGVjdE9iamVjdChoZGMsIG9sZEZvbnQpOworICAgICAgICBSZWxlYXNl
REMoMCwgaGRjKTsKKyAgICAgICAgcmV0dXJuIHdpZHRoOworICAgIH0KKworICAgIC8vIEZJWE1F
OiBGbGVzaCBvdXQgd2l0aCBDYWlyby93aW4zMiBmb250IGltcGxlbWVudGF0aW9uCisgICAgbm90
SW1wbGVtZW50ZWQoKTsKKworICAgIHJldHVybiAwOworfQorCit9CkluZGV4OiBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YVdpbi5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERhdGFXaW4uY3BwCShyZXZp
c2lvbiAyOTgzNCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnRE
YXRhV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmln
aHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENv
cHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC00OCwxMTYgKzQ4LDE2IEBA
IHVzaW5nIHN0ZDo6bWF4OwogCiBjb25zdCBmbG9hdCBjU21hbGxDYXBzRm9udFNpemVNdWx0aXBs
aWVyID0gMC43ZjsKIAotc3RhdGljIGJvb2wgc2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrOwotCi1z
dGF0aWMgaW5saW5lIGZsb2F0IHNjYWxlRW1Ub1VuaXRzKGZsb2F0IHgsIHVuc2lnbmVkIHVuaXRz
UGVyRW0pIHsgcmV0dXJuIHVuaXRzUGVyRW0gPyB4IC8gKGZsb2F0KXVuaXRzUGVyRW0gOiB4OyB9
CitzdGF0aWMgYm9vbCBnX3Nob3VsZEFwcGx5TWFjQXNjZW50SGFjazsKIAogdm9pZCBTaW1wbGVG
b250RGF0YTo6c2V0U2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrKGJvb2wgYikKIHsKLSAgICBzaG91
bGRBcHBseU1hY0FzY2VudEhhY2sgPSBiOwotfQotCi12b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0
Zm9ybUluaXQoKQoteyAgICAKLSAgICBtX3N5bnRoZXRpY0JvbGRPZmZzZXQgPSBtX2ZvbnQuc3lu
dGhldGljQm9sZCgpID8gMS4wZiA6IDAuZjsKLSAgICBtX3NjcmlwdENhY2hlID0gMDsKLSAgICBt
X3NjcmlwdEZvbnRQcm9wZXJ0aWVzID0gMDsKLSAgICBtX2lzU3lzdGVtRm9udCA9IGZhbHNlOwot
ICAgIAotICAgIGlmIChtX2ZvbnQudXNlR0RJKCkpIHsKLSAgICAgICAgSERDIGhkYyA9IEdldERD
KDApOwotICAgICAgICBIR0RJT0JKIG9sZEZvbnQgPSBTZWxlY3RPYmplY3QoaGRjLCBtX2ZvbnQu
aGZvbnQoKSk7Ci0gICAgICAgIE9VVExJTkVURVhUTUVUUklDIG1ldHJpY3M7Ci0gICAgICAgIEdl
dE91dGxpbmVUZXh0TWV0cmljcyhoZGMsIHNpemVvZihtZXRyaWNzKSwgJm1ldHJpY3MpOwotICAg
ICAgICBURVhUTUVUUklDJiB0ZXh0TWV0cmljcyA9IG1ldHJpY3Mub3RtVGV4dE1ldHJpY3M7Ci0g
ICAgICAgIG1fYXNjZW50ID0gdGV4dE1ldHJpY3MudG1Bc2NlbnQ7Ci0gICAgICAgIG1fZGVzY2Vu
dCA9IHRleHRNZXRyaWNzLnRtRGVzY2VudDsKLSAgICAgICAgbV9saW5lR2FwID0gdGV4dE1ldHJp
Y3MudG1FeHRlcm5hbExlYWRpbmc7Ci0gICAgICAgIG1fbGluZVNwYWNpbmcgPSBtX2FzY2VudCAr
IG1fZGVzY2VudCArIG1fbGluZUdhcDsKLSAgICAgICAgbV94SGVpZ2h0ID0gbV9hc2NlbnQgKiAw
LjU2ZjsgLy8gQmVzdCBndWVzcyBmb3IgeEhlaWdodCBpZiBubyB4IGdseXBoIGlzIHByZXNlbnQu
Ci0KLSAgICAgICAgR0xZUEhNRVRSSUNTIGdtOwotICAgICAgICBNQVQyIG1hdCA9IHsgMSwgMCwg
MCwgMSB9OwotICAgICAgICBEV09SRCBsZW4gPSBHZXRHbHlwaE91dGxpbmUoaGRjLCAneCcsIEdH
T19NRVRSSUNTLCAmZ20sIDAsIDAsICZtYXQpOwotICAgICAgICBpZiAobGVuICE9IEdESV9FUlJP
UiAmJiBnbS5nbXB0R2x5cGhPcmlnaW4ueSA+IDApCi0gICAgICAgICAgICBtX3hIZWlnaHQgPSBn
bS5nbXB0R2x5cGhPcmlnaW4ueTsKLQotICAgICAgICBtX3VuaXRzUGVyRW0gPSBtZXRyaWNzLm90
bUVNU3F1YXJlOwotCi0gICAgICAgIFNlbGVjdE9iamVjdChoZGMsIG9sZEZvbnQpOwotICAgICAg
ICBSZWxlYXNlREMoMCwgaGRjKTsKLQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQ0dG
b250UmVmIGZvbnQgPSBtX2ZvbnQuY2dGb250KCk7Ci0gICAgaW50IGlBc2NlbnQgPSBDR0ZvbnRH
ZXRBc2NlbnQoZm9udCk7Ci0gICAgaW50IGlEZXNjZW50ID0gQ0dGb250R2V0RGVzY2VudChmb250
KTsKLSAgICBpbnQgaUxpbmVHYXAgPSBDR0ZvbnRHZXRMZWFkaW5nKGZvbnQpOwotICAgIG1fdW5p
dHNQZXJFbSA9IENHRm9udEdldFVuaXRzUGVyRW0oZm9udCk7Ci0gICAgZmxvYXQgcG9pbnRTaXpl
ID0gbV9mb250LnNpemUoKTsKLSAgICBmbG9hdCBmQXNjZW50ID0gc2NhbGVFbVRvVW5pdHMoaUFz
Y2VudCwgbV91bml0c1BlckVtKSAqIHBvaW50U2l6ZTsKLSAgICBmbG9hdCBmRGVzY2VudCA9IC1z
Y2FsZUVtVG9Vbml0cyhpRGVzY2VudCwgbV91bml0c1BlckVtKSAqIHBvaW50U2l6ZTsKLSAgICBm
bG9hdCBmTGluZUdhcCA9IHNjYWxlRW1Ub1VuaXRzKGlMaW5lR2FwLCBtX3VuaXRzUGVyRW0pICog
cG9pbnRTaXplOwotCi0gICAgaWYgKCFpc0N1c3RvbUZvbnQoKSkgewotICAgICAgICBIREMgZGMg
PSBHZXREQygwKTsKLSAgICAgICAgSEdESU9CSiBvbGRGb250ID0gU2VsZWN0T2JqZWN0KGRjLCBt
X2ZvbnQuaGZvbnQoKSk7Ci0gICAgICAgIGludCBmYWNlTGVuZ3RoID0gR2V0VGV4dEZhY2UoZGMs
IDAsIDApOwotICAgICAgICBWZWN0b3I8VENIQVI+IGZhY2VOYW1lKGZhY2VMZW5ndGgpOwotICAg
ICAgICBHZXRUZXh0RmFjZShkYywgZmFjZUxlbmd0aCwgZmFjZU5hbWUuZGF0YSgpKTsKLSAgICAg
ICAgbV9pc1N5c3RlbUZvbnQgPSAhX3Rjc2NtcChmYWNlTmFtZS5kYXRhKCksIF9UKCJMdWNpZGEg
R3JhbmRlIikpOwotICAgICAgICBTZWxlY3RPYmplY3QoZGMsIG9sZEZvbnQpOwotICAgICAgICBS
ZWxlYXNlREMoMCwgZGMpOwotCi0gICAgICAgIGlmIChzaG91bGRBcHBseU1hY0FzY2VudEhhY2sp
IHsKLSAgICAgICAgICAgIC8vIFRoaXMgY29kZSBjb21lcyBmcm9tIEZvbnREYXRhTWFjLm1tLiBX
ZSBvbmx5IGV2ZXIgZG8gdGhpcyB3aGVuIHJ1bm5pbmcgcmVncmVzc2lvbiB0ZXN0cyBzbyB0aGF0
IG91ciBtZXRyaWNzIHdpbGwgbWF0Y2ggTWFjLgotCi0gICAgICAgICAgICAvLyBXZSBuZWVkIHRv
IGFkanVzdCBUaW1lcywgSGVsdmV0aWNhLCBhbmQgQ291cmllciB0byBjbG9zZWx5IG1hdGNoIHRo
ZQotICAgICAgICAgICAgLy8gdmVydGljYWwgbWV0cmljcyBvZiB0aGVpciBNaWNyb3NvZnQgY291
bnRlcnBhcnRzIHRoYXQgYXJlIHRoZSBkZSBmYWN0bwotICAgICAgICAgICAgLy8gd2ViIHN0YW5k
YXJkLiBUaGUgQXBwS2l0IGFkanVzdG1lbnQgb2YgMjAlIGlzIHRvbyBiaWcgYW5kIGlzCi0gICAg
ICAgICAgICAvLyBpbmNvcnJlY3RseSBhZGRlZCB0byBsaW5lIHNwYWNpbmcsIHNvIHdlIHVzZSBh
IDE1JSBhZGp1c3RtZW50IGluc3RlYWQKLSAgICAgICAgICAgIC8vIGFuZCBhZGQgaXQgdG8gdGhl
IGFzY2VudC4KLSAgICAgICAgICAgIGlmICghX3Rjc2NtcChmYWNlTmFtZS5kYXRhKCksIF9UKCJU
aW1lcyIpKSB8fCAhX3Rjc2NtcChmYWNlTmFtZS5kYXRhKCksIF9UKCJIZWx2ZXRpY2EiKSkgfHwg
IV90Y3NjbXAoZmFjZU5hbWUuZGF0YSgpLCBfVCgiQ291cmllciIpKSkKLSAgICAgICAgICAgICAg
ICBmQXNjZW50ICs9IGZsb29yZigoKGZBc2NlbnQgKyBmRGVzY2VudCkgKiAwLjE1ZikgKyAwLjVm
KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1fYXNjZW50ID0gbHJvdW5kZihmQXNjZW50KTsK
LSAgICBtX2Rlc2NlbnQgPSBscm91bmRmKGZEZXNjZW50KTsKLSAgICBtX2xpbmVHYXAgPSBscm91
bmRmKGZMaW5lR2FwKTsKLSAgICBtX2xpbmVTcGFjaW5nID0gbV9hc2NlbnQgKyBtX2Rlc2NlbnQg
KyBtX2xpbmVHYXA7Ci0KLSAgICAvLyBNZWFzdXJlIHRoZSBhY3R1YWwgY2hhcmFjdGVyICJ4Iiwg
YmVjYXVzZSBBcHBLaXQgc3ludGhlc2l6ZXMgWCBoZWlnaHQgcmF0aGVyIHRoYW4gZ2V0dGluZyBp
dCBmcm9tIHRoZSBmb250LgotICAgIC8vIFVuZm9ydHVuYXRlbHksIE5TRm9udCB3aWxsIHJvdW5k
IHRoaXMgZm9yIHVzIHNvIHdlIGRvbid0IHF1aXRlIGdldCB0aGUgcmlnaHQgdmFsdWUuCi0gICAg
R2x5cGhQYWdlKiBnbHlwaFBhZ2VaZXJvID0gR2x5cGhQYWdlVHJlZU5vZGU6OmdldFJvb3RDaGls
ZCh0aGlzLCAwKS0+cGFnZSgpOwotICAgIEdseXBoIHhHbHlwaCA9IGdseXBoUGFnZVplcm8gPyBn
bHlwaFBhZ2VaZXJvLT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoJ3gnKS5nbHlwaCA6IDA7Ci0gICAg
aWYgKHhHbHlwaCkgewotICAgICAgICBDR1JlY3QgeEJveDsKLSAgICAgICAgQ0dGb250R2V0R2x5
cGhCQm94ZXMoZm9udCwgJnhHbHlwaCwgMSwgJnhCb3gpOwotICAgICAgICAvLyBVc2UgdGhlIG1h
eGltdW0gb2YgZWl0aGVyIHdpZHRoIG9yIGhlaWdodCBiZWNhdXNlICJ4IiBpcyBuZWFybHkgc3F1
YXJlCi0gICAgICAgIC8vIGFuZCB3ZWIgcGFnZXMgdGhhdCBmb29saXNobHkgdXNlIHRoaXMgbWV0
cmljIGZvciB3aWR0aCB3aWxsIGJlIGxhaWQgb3V0Ci0gICAgICAgIC8vIHBvb3JseSBpZiB3ZSBy
ZXR1cm4gYW4gYWNjdXJhdGUgaGVpZ2h0LiBDbGFzc2ljIGNhc2UgaXMgVGltZXMgMTMgcG9pbnQs
Ci0gICAgICAgIC8vIHdoaWNoIGhhcyBhbiAieCIgdGhhdCBpcyA3eDYgcGl4ZWxzLgotICAgICAg
ICBtX3hIZWlnaHQgPSBzY2FsZUVtVG9Vbml0cyhtYXgoQ0dSZWN0R2V0TWF4WCh4Qm94KSwgQ0dS
ZWN0R2V0TWF4WSh4Qm94KSksIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7Ci0gICAgfSBlbHNl
IHsKLSAgICAgICAgaW50IGlYSGVpZ2h0ID0gQ0dGb250R2V0WEhlaWdodChmb250KTsKLSAgICAg
ICAgbV94SGVpZ2h0ID0gc2NhbGVFbVRvVW5pdHMoaVhIZWlnaHQsIG1fdW5pdHNQZXJFbSkgKiBw
b2ludFNpemU7Ci0gICAgfQorICAgIGdfc2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrID0gYjsKIH0K
IAotdm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1EZXN0cm95KCkKK2Jvb2wgU2ltcGxlRm9u
dERhdGE6OnNob3VsZEFwcGx5TWFjQXNjZW50SGFjaygpCiB7Ci0gICAgaWYgKCFpc0N1c3RvbUZv
bnQoKSkgewotICAgICAgICBEZWxldGVPYmplY3QobV9mb250Lmhmb250KCkpOwotICAgICAgICBD
R0ZvbnRSZWxlYXNlKG1fZm9udC5jZ0ZvbnQoKSk7Ci0gICAgfQotCi0gICAgLy8gV2UgZG9uJ3Qg
aGFzaCB0aGlzIG9uIFdpbjMyLCBzbyBpdCdzIGVmZmVjdGl2ZWx5IG93bmVkIGJ5IHVzLgotICAg
IGRlbGV0ZSBtX3NtYWxsQ2Fwc0ZvbnREYXRhOwotCi0gICAgU2NyaXB0RnJlZUNhY2hlKCZtX3Nj
cmlwdENhY2hlKTsKLSAgICBkZWxldGUgbV9zY3JpcHRGb250UHJvcGVydGllczsKKyAgICByZXR1
cm4gZ19zaG91bGRBcHBseU1hY0FzY2VudEhhY2s7CiB9CiAKIFNpbXBsZUZvbnREYXRhKiBTaW1w
bGVGb250RGF0YTo6c21hbGxDYXBzRm9udERhdGEoY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250
RGVzY3JpcHRpb24pIGNvbnN0CkBAIC0yMzcsMjggKzEzNyw2IEBAIHZvaWQgU2ltcGxlRm9udERh
dGE6OmRldGVybWluZVBpdGNoKCkKICAgICBSZWxlYXNlREMoMCwgZGMpOwogfQogCi1mbG9hdCBT
aW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZvckdseXBoKEdseXBoIGdseXBoKSBjb25zdAot
ewotICAgIGlmIChtX2ZvbnQudXNlR0RJKCkpIHsKLSAgICAgICAgSERDIGhkYyA9IEdldERDKDAp
OwotICAgICAgICBIR0RJT0JKIG9sZEZvbnQgPSBTZWxlY3RPYmplY3QoaGRjLCBtX2ZvbnQuaGZv
bnQoKSk7Ci0gICAgICAgIGludCB3aWR0aDsKLSAgICAgICAgR2V0Q2hhcldpZHRoSShoZGMsIGds
eXBoLCAxLCAwLCAmd2lkdGgpOwotICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBvbGRGb250KTsK
LSAgICAgICAgUmVsZWFzZURDKDAsIGhkYyk7Ci0gICAgICAgIHJldHVybiB3aWR0aDsKLSAgICB9
Ci0KLSAgICBDR0ZvbnRSZWYgZm9udCA9IG1fZm9udC5jZ0ZvbnQoKTsKLSAgICBmbG9hdCBwb2lu
dFNpemUgPSBtX2ZvbnQuc2l6ZSgpOwotICAgIENHU2l6ZSBhZHZhbmNlOwotICAgIENHQWZmaW5l
VHJhbnNmb3JtIG0gPSBDR0FmZmluZVRyYW5zZm9ybU1ha2VTY2FsZShwb2ludFNpemUsIHBvaW50
U2l6ZSk7Ci0gICAgLy8gRklYTUU6IE5lZWQgdG8gYWRkIHJlYWwgc3VwcG9ydCBmb3IgcHJpbnRl
ciBmb250cy4KLSAgICBib29sIGlzUHJpbnRlckZvbnQgPSBmYWxzZTsKLSAgICB3a0dldEdseXBo
QWR2YW5jZXMoZm9udCwgbSwgbV9pc1N5c3RlbUZvbnQsIGlzUHJpbnRlckZvbnQsIGdseXBoLCBh
ZHZhbmNlKTsKLSAgICByZXR1cm4gYWR2YW5jZS53aWR0aCArIG1fc3ludGhldGljQm9sZE9mZnNl
dDsKLX0KLQogU0NSSVBUX0ZPTlRQUk9QRVJUSUVTKiBTaW1wbGVGb250RGF0YTo6c2NyaXB0Rm9u
dFByb3BlcnRpZXMoKSBjb25zdAogewogICAgIGlmICghbV9zY3JpcHRGb250UHJvcGVydGllcykg
ewpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlQ0dXaW4uY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNHV2luLmNwcAkocmV2aXNpb24g
Mjk4MzQpCShmcm9tIFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZVdpbi5jcHA6Mjk4MzQp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFnSW1hZ2VDR1dpbi5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5j
LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkRyYWdJbWFnZS5oIgorCisjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKKyNpbmNsdWRl
ICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbWFnZS5oIgorI2luY2x1ZGUgIlJldGFp
blB0ci5oIgorCisjaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NvcmVHcmFwaGljcy5oPgorCisjaW5j
bHVkZSA8d2luZG93cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0ludFNpemUgZHJhZ0lt
YWdlU2l6ZShEcmFnSW1hZ2VSZWYgaW1hZ2UpCit7CisgICAgaWYgKCFpbWFnZSkKKyAgICAgICAg
cmV0dXJuIEludFNpemUoKTsKKyAgICBCSVRNQVAgYjsKKyAgICBHZXRPYmplY3QoaW1hZ2UsIHNp
emVvZihCSVRNQVApLCAmYik7CisgICAgcmV0dXJuIEludFNpemUoYi5ibVdpZHRoLCBiLmJtSGVp
Z2h0KTsKK30KKwordm9pZCBkZWxldGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVmIGltYWdlKQorewor
ICAgIGlmIChpbWFnZSkKKyAgICAgICAgOjpEZWxldGVPYmplY3QoaW1hZ2UpOworfQorCitIQklU
TUFQIGFsbG9jSW1hZ2UoSERDIGRjLCBJbnRTaXplIHNpemUsIENHQ29udGV4dFJlZiAqdGFyZ2V0
UmVmKQoreworICAgIEhCSVRNQVAgaGJtcDsKKyAgICBCSVRNQVBJTkZPIGJtcEluZm8gPSB7MH07
CisgICAgYm1wSW5mby5ibWlIZWFkZXIuYmlTaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIp
OworICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpV2lkdGggPSBzaXplLndpZHRoKCk7CisgICAgYm1w
SW5mby5ibWlIZWFkZXIuYmlIZWlnaHQgPSBzaXplLmhlaWdodCgpOworICAgIGJtcEluZm8uYm1p
SGVhZGVyLmJpUGxhbmVzID0gMTsKKyAgICBibXBJbmZvLmJtaUhlYWRlci5iaUJpdENvdW50ID0g
MzI7CisgICAgYm1wSW5mby5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiA9IEJJX1JHQjsKKyAgICBM
UFZPSUQgYml0czsKKyAgICBoYm1wID0gQ3JlYXRlRElCU2VjdGlvbihkYywgJmJtcEluZm8sIERJ
Ql9SR0JfQ09MT1JTLCAmYml0cywgMCwgMCk7CisKKyAgICBpZiAoIXRhcmdldFJlZikKKyAgICAg
ICAgcmV0dXJuIGhibXA7CisKKyAgICBDR0NvbG9yU3BhY2VSZWYgZGV2aWNlUkdCID0gQ0dDb2xv
clNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7CisgICAgQ0dDb250ZXh0UmVmIGJpdG1hcENvbnRleHQg
PSBDR0JpdG1hcENvbnRleHRDcmVhdGUoYml0cywgYm1wSW5mby5ibWlIZWFkZXIuYmlXaWR0aCwg
Ym1wSW5mby5ibWlIZWFkZXIuYmlIZWlnaHQsIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wSW5mby5ibWlIZWFkZXIuYmlXaWR0aCAq
IDQsIGRldmljZVJHQiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhh
Tm9uZVNraXBGaXJzdCk7CisgICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOworICAg
IGlmICghYml0bWFwQ29udGV4dCkgeworICAgICAgICBEZWxldGVPYmplY3QoaGJtcCk7CisgICAg
ICAgIHJldHVybiAwOworICAgIH0KKworICAgICp0YXJnZXRSZWYgPSBiaXRtYXBDb250ZXh0Owor
ICAgIHJldHVybiBoYm1wOworfQorCitzdGF0aWMgQ0dDb250ZXh0UmVmIGNyZWF0ZUNnQ29udGV4
dEZyb21CaXRtYXAoSEJJVE1BUCBiaXRtYXApCit7CisgICAgQklUTUFQIGluZm87CisgICAgR2V0
T2JqZWN0KGJpdG1hcCwgc2l6ZW9mKGluZm8pLCAmaW5mbyk7CisgICAgQVNTRVJUKGluZm8uYm1C
aXRzUGl4ZWwgPT0gMzIpOworCisgICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29s
b3JTcGFjZUNyZWF0ZURldmljZVJHQigpOworICAgIENHQ29udGV4dFJlZiBiaXRtYXBDb250ZXh0
ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGluZm8uYm1CaXRzLCBpbmZvLmJtV2lkdGgsIGluZm8u
Ym1IZWlnaHQsIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9y
ZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhhTm9uZVNraXBGaXJzdCk7CisgICAgQ0dDb2xvclNw
YWNlUmVsZWFzZShkZXZpY2VSR0IpOworICAgIHJldHVybiBiaXRtYXBDb250ZXh0OworfQorCitE
cmFnSW1hZ2VSZWYgc2NhbGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVmIGltYWdlLCBGbG9hdFNpemUg
c2NhbGUpCit7CisgICAgLy8gRklYTUU6IGR1ZSB0byB0aGUgd2F5IGRyYWcgaW1hZ2VzIGFyZSBk
b25lIG9uIHdpbmRvd3Mgd2UgbmVlZCAKKyAgICAvLyB0byBwcmVwcm9jZXNzIHRoZSBhbHBoYSBj
aGFubmVsIDxyZGFyOi8vcHJvYmxlbS81MDE1OTQ2PgorCisgICAgaWYgKCFpbWFnZSkKKyAgICAg
ICAgcmV0dXJuIDA7CisgICAgQ0dDb250ZXh0UmVmIHRhcmdldENvbnRleHQ7CisgICAgQ0dDb250
ZXh0UmVmIHNyY0NvbnRleHQ7CisgICAgQ0dJbWFnZVJlZiBzcmNJbWFnZTsKKyAgICBJbnRTaXpl
IHNyY1NpemUgPSBkcmFnSW1hZ2VTaXplKGltYWdlKTsKKyAgICBJbnRTaXplIGRzdFNpemUoKGlu
dCkoc3JjU2l6ZS53aWR0aCgpICogc2NhbGUud2lkdGgoKSksIChpbnQpKHNyY1NpemUuaGVpZ2h0
KCkgKiBzY2FsZS5oZWlnaHQoKSkpOworICAgIEhCSVRNQVAgaGJtcCA9IDA7CisgICAgSERDIGRj
ID0gR2V0REMoMCk7CisgICAgSERDIGRzdERDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGRjKTsKKyAg
ICBpZiAoIWRzdERDKQorICAgICAgICBnb3RvIGV4aXQ7CisKKyAgICBoYm1wID0gYWxsb2NJbWFn
ZShkc3REQywgZHN0U2l6ZSwgJnRhcmdldENvbnRleHQpOworICAgIGlmICghaGJtcCkKKyAgICAg
ICAgZ290byBleGl0OworCisgICAgc3JjQ29udGV4dCA9IGNyZWF0ZUNnQ29udGV4dEZyb21CaXRt
YXAoaW1hZ2UpOworICAgIHNyY0ltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlSW1hZ2Uoc3Jj
Q29udGV4dCk7CisgICAgQ0dSZWN0IHJlY3Q7CisgICAgcmVjdC5vcmlnaW4ueCA9IDA7CisgICAg
cmVjdC5vcmlnaW4ueSA9IDA7CisgICAgcmVjdC5zaXplID0gZHN0U2l6ZTsKKyAgICBDR0NvbnRl
eHREcmF3SW1hZ2UodGFyZ2V0Q29udGV4dCwgcmVjdCwgc3JjSW1hZ2UpOworICAgIENHSW1hZ2VS
ZWxlYXNlKHNyY0ltYWdlKTsKKyAgICBDR0NvbnRleHRSZWxlYXNlKHNyY0NvbnRleHQpOworICAg
IENHQ29udGV4dFJlbGVhc2UodGFyZ2V0Q29udGV4dCk7CisgICAgOjpEZWxldGVPYmplY3QoaW1h
Z2UpOworICAgIGltYWdlID0gMDsKKworZXhpdDoKKyAgICBpZiAoIWhibXApCisgICAgICAgIGhi
bXAgPSBpbWFnZTsKKyAgICBpZiAoZHN0REMpCisgICAgICAgIERlbGV0ZURDKGRzdERDKTsKKyAg
ICBSZWxlYXNlREMoMCwgZGMpOworICAgIHJldHVybiBoYm1wOworfQorICAgIAorRHJhZ0ltYWdl
UmVmIGRpc3NvbHZlRHJhZ0ltYWdlVG9GcmFjdGlvbihEcmFnSW1hZ2VSZWYgaW1hZ2UsIGZsb2F0
KQoreworICAgIC8vV2UgZG9uJ3QgZG8gdGhpcyBvbiB3aW5kb3dzIGFzIHRoZSBkcmFnaW1hZ2Ug
aXMgYmxlbmRlZCBieSB0aGUgT1MKKyAgICByZXR1cm4gaW1hZ2U7Cit9CisgICAgICAgIAorRHJh
Z0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZyb21JbWFnZShJbWFnZSogaW1nKQoreyAgICAKKyAg
ICBIQklUTUFQIGhibXAgPSAwOworICAgIEhEQyBkYyA9IEdldERDKDApOworICAgIEhEQyB3b3Jr
aW5nREMgPSBDcmVhdGVDb21wYXRpYmxlREMoZGMpOworICAgIENHQ29udGV4dFJlZiBkcmF3Q29u
dGV4dCA9IDA7CisgICAgaWYgKCF3b3JraW5nREMpCisgICAgICAgIGdvdG8gZXhpdDsKKworICAg
IGhibXAgPSBhbGxvY0ltYWdlKHdvcmtpbmdEQywgaW1nLT5zaXplKCksICZkcmF3Q29udGV4dCk7
CisKKyAgICBpZiAoIWhibXApCisgICAgICAgIGdvdG8gZXhpdDsKKworICAgIGlmICghZHJhd0Nv
bnRleHQpIHsKKyAgICAgICAgOjpEZWxldGVPYmplY3QoaGJtcCk7CisgICAgICAgIGhibXAgPSAw
OworICAgIH0KKworICAgIENHSW1hZ2VSZWYgc3JjSW1hZ2UgPSBpbWctPmdldENHSW1hZ2VSZWYo
KTsKKyAgICBDR1JlY3QgcmVjdDsKKyAgICByZWN0LnNpemUgPSBpbWctPnNpemUoKTsKKyAgICBy
ZWN0Lm9yaWdpbi54ID0gMDsKKyAgICByZWN0Lm9yaWdpbi55ID0gLXJlY3Quc2l6ZS5oZWlnaHQ7
CisgICAgc3RhdGljIGNvbnN0IENHRmxvYXQgd2hpdGUgW10gPSB7MS4wLCAxLjAsIDEuMCwgMS4w
fTsKKyAgICBDR0NvbnRleHRTY2FsZUNUTShkcmF3Q29udGV4dCwgMSwgLTEpOworICAgIENHQ29u
dGV4dFNldEZpbGxDb2xvcihkcmF3Q29udGV4dCwgd2hpdGUpOworICAgIENHQ29udGV4dEZpbGxS
ZWN0KGRyYXdDb250ZXh0LCByZWN0KTsKKyAgICBDR0NvbnRleHRTZXRCbGVuZE1vZGUoZHJhd0Nv
bnRleHQsIGtDR0JsZW5kTW9kZU5vcm1hbCk7CisgICAgQ0dDb250ZXh0RHJhd0ltYWdlKGRyYXdD
b250ZXh0LCByZWN0LCBzcmNJbWFnZSk7CisgICAgQ0dDb250ZXh0UmVsZWFzZShkcmF3Q29udGV4
dCk7CisKK2V4aXQ6CisgICAgaWYgKHdvcmtpbmdEQykKKyAgICAgICAgRGVsZXRlREMod29ya2lu
Z0RDKTsKKyAgICBSZWxlYXNlREMoMCwgZGMpOworICAgIHJldHVybiBoYm1wOworfQorICAgIAor
RHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUljb25Gb3JDYWNoZWRJbWFnZShDYWNoZWRJbWFn
ZSopCit7CisgICAgLy9GSVhNRTogUHJvdmlkZSBpY29uIGZvciBpbWFnZSB0eXBlIDxyZGFyOi8v
cHJvYmxlbS81MDE1OTQ5PgorICAgIHJldHVybiAwOyAgICAgCit9CisgICAgCit9CkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFnSW1hZ2VDR1dpbi5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlQ0dXaW4uY3BwCShyZXZpc2lvbiAyOTcyNikKKysr
IFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNHV2luLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5jLiAgQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBBcHBsZSBJbmMu
ICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBA
IC0zNywyMSArMzcsNiBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLUludFNpemUgZHJhZ0lt
YWdlU2l6ZShEcmFnSW1hZ2VSZWYgaW1hZ2UpCi17Ci0gICAgaWYgKCFpbWFnZSkKLSAgICAgICAg
cmV0dXJuIEludFNpemUoKTsKLSAgICBCSVRNQVAgYjsKLSAgICBHZXRPYmplY3QoaW1hZ2UsIHNp
emVvZihCSVRNQVApLCAmYik7Ci0gICAgcmV0dXJuIEludFNpemUoYi5ibVdpZHRoLCBiLmJtSGVp
Z2h0KTsKLX0KLQotdm9pZCBkZWxldGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVmIGltYWdlKQotewot
ICAgIGlmIChpbWFnZSkKLSAgICAgICAgOjpEZWxldGVPYmplY3QoaW1hZ2UpOwotfQotCiBIQklU
TUFQIGFsbG9jSW1hZ2UoSERDIGRjLCBJbnRTaXplIHNpemUsIENHQ29udGV4dFJlZiAqdGFyZ2V0
UmVmKQogewogICAgIEhCSVRNQVAgaGJtcDsKQEAgLTEwNiw3ICs5MSw3IEBAIERyYWdJbWFnZVJl
ZiBzY2FsZURyYWdJbWFnZShEcmFnSW1hZ2VSZWYKICAgICBDR0NvbnRleHRSZWYgc3JjQ29udGV4
dDsKICAgICBDR0ltYWdlUmVmIHNyY0ltYWdlOwogICAgIEludFNpemUgc3JjU2l6ZSA9IGRyYWdJ
bWFnZVNpemUoaW1hZ2UpOwotICAgIEludFNpemUgZHN0U2l6ZSgoaW50KShzcmNTaXplLndpZHRo
KCkgKiBzY2FsZS53aWR0aCgpKSwgKGludCkoc3JjU2l6ZS5oZWlnaHQoKSAqIHNjYWxlLmhlaWdo
dCgpKSk7CisgICAgSW50U2l6ZSBkc3RTaXplKHN0YXRpY19jYXN0PGludD4oc3JjU2l6ZS53aWR0
aCgpICogc2NhbGUud2lkdGgoKSksIHN0YXRpY19jYXN0PGludD4oc3JjU2l6ZS5oZWlnaHQoKSAq
IHNjYWxlLmhlaWdodCgpKSk7CiAgICAgSEJJVE1BUCBoYm1wID0gMDsKICAgICBIREMgZGMgPSBH
ZXREQygwKTsKICAgICBIREMgZHN0REMgPSBDcmVhdGVDb21wYXRpYmxlREMoZGMpOwpAQCAtMTM5
LDE0ICsxMjQsOCBAQCBleGl0OgogICAgIHJldHVybiBoYm1wOwogfQogICAgIAotRHJhZ0ltYWdl
UmVmIGRpc3NvbHZlRHJhZ0ltYWdlVG9GcmFjdGlvbihEcmFnSW1hZ2VSZWYgaW1hZ2UsIGZsb2F0
KQotewotICAgIC8vV2UgZG9uJ3QgZG8gdGhpcyBvbiB3aW5kb3dzIGFzIHRoZSBkcmFnaW1hZ2Ug
aXMgYmxlbmRlZCBieSB0aGUgT1MKLSAgICByZXR1cm4gaW1hZ2U7Ci19Ci0gICAgICAgIAogRHJh
Z0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZyb21JbWFnZShJbWFnZSogaW1nKQoteyAgICAKK3sK
ICAgICBIQklUTUFQIGhibXAgPSAwOwogICAgIEhEQyBkYyA9IEdldERDKDApOwogICAgIEhEQyB3
b3JraW5nREMgPSBDcmVhdGVDb21wYXRpYmxlREMoZGMpOwpAQCAtMTg0LDEwICsxNjMsNCBAQCBl
eGl0OgogICAgIHJldHVybiBoYm1wOwogfQogICAgIAotRHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJ
bWFnZUljb25Gb3JDYWNoZWRJbWFnZShDYWNoZWRJbWFnZSopCi17Ci0gICAgLy9GSVhNRTogUHJv
dmlkZSBpY29uIGZvciBpbWFnZSB0eXBlIDxyZGFyOi8vcHJvYmxlbS81MDE1OTQ5PgotICAgIHJl
dHVybiAwOyAgICAgCi19Ci0gICAgCiB9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFn
SW1hZ2VDYWlyb1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJh
Z0ltYWdlQ2Fpcm9XaW4uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW4v
RHJhZ0ltYWdlQ2Fpcm9XaW4uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDU0IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRF
UiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVS
LCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJEcmFnSW1hZ2UuaCIKKworI2lu
Y2x1ZGUgIkNhY2hlZEltYWdlLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5j
bHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlJl
dGFpblB0ci5oIgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK0RyYWdJbWFnZVJlZiBzY2FsZURyYWdJbWFnZShEcmFnSW1hZ2VSZWYgaW1hZ2UsIEZsb2F0
U2l6ZSBzY2FsZSkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworCisgICAgcmV0dXJuIGltYWdl
OworfQorICAgIAorRHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZyb21JbWFnZShJbWFnZSog
aW1nKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisKKyAgICBEcmFnSW1hZ2VSZWYgdGVtcDsK
KyAgICByZXR1cm4gdGVtcDsKK30KKyAgICAKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2lu
L0RyYWdJbWFnZVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJh
Z0ltYWdlV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbi9E
cmFnSW1hZ2VXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENv
cHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29w
eXJpZ2h0IChDKSAyMDA3LCAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAg
KgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTMxLDggKzMxLDYgQEAKICNpbmNsdWRl
ICJJbWFnZS5oIgogI2luY2x1ZGUgIlJldGFpblB0ci5oIgogCi0jaW5jbHVkZSA8Q29yZUdyYXBo
aWNzL0NvcmVHcmFwaGljcy5oPgotCiAjaW5jbHVkZSA8d2luZG93cy5oPgogCiBuYW1lc3BhY2Ug
V2ViQ29yZSB7CkBAIC01MiwxMzggKzUwLDEyIEBAIHZvaWQgZGVsZXRlRHJhZ0ltYWdlKERyYWdJ
bWFnZVJlZiBpbWFnZSkKICAgICAgICAgOjpEZWxldGVPYmplY3QoaW1hZ2UpOwogfQogCi1IQklU
TUFQIGFsbG9jSW1hZ2UoSERDIGRjLCBJbnRTaXplIHNpemUsIENHQ29udGV4dFJlZiAqdGFyZ2V0
UmVmKQotewotICAgIEhCSVRNQVAgaGJtcDsKLSAgICBCSVRNQVBJTkZPIGJtcEluZm8gPSB7MH07
Ci0gICAgYm1wSW5mby5ibWlIZWFkZXIuYmlTaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIp
OwotICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpV2lkdGggPSBzaXplLndpZHRoKCk7Ci0gICAgYm1w
SW5mby5ibWlIZWFkZXIuYmlIZWlnaHQgPSBzaXplLmhlaWdodCgpOwotICAgIGJtcEluZm8uYm1p
SGVhZGVyLmJpUGxhbmVzID0gMTsKLSAgICBibXBJbmZvLmJtaUhlYWRlci5iaUJpdENvdW50ID0g
MzI7Ci0gICAgYm1wSW5mby5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiA9IEJJX1JHQjsKLSAgICBM
UFZPSUQgYml0czsKLSAgICBoYm1wID0gQ3JlYXRlRElCU2VjdGlvbihkYywgJmJtcEluZm8sIERJ
Ql9SR0JfQ09MT1JTLCAmYml0cywgMCwgMCk7Ci0KLSAgICBpZiAoIXRhcmdldFJlZikKLSAgICAg
ICAgcmV0dXJuIGhibXA7Ci0KLSAgICBDR0NvbG9yU3BhY2VSZWYgZGV2aWNlUkdCID0gQ0dDb2xv
clNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7Ci0gICAgQ0dDb250ZXh0UmVmIGJpdG1hcENvbnRleHQg
PSBDR0JpdG1hcENvbnRleHRDcmVhdGUoYml0cywgYm1wSW5mby5ibWlIZWFkZXIuYmlXaWR0aCwg
Ym1wSW5mby5ibWlIZWFkZXIuYmlIZWlnaHQsIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wSW5mby5ibWlIZWFkZXIuYmlXaWR0aCAq
IDQsIGRldmljZVJHQiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhh
Tm9uZVNraXBGaXJzdCk7Ci0gICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOwotICAg
IGlmICghYml0bWFwQ29udGV4dCkgewotICAgICAgICBEZWxldGVPYmplY3QoaGJtcCk7Ci0gICAg
ICAgIHJldHVybiAwOwotICAgIH0KLQotICAgICp0YXJnZXRSZWYgPSBiaXRtYXBDb250ZXh0Owot
ICAgIHJldHVybiBoYm1wOwotfQotCi1zdGF0aWMgQ0dDb250ZXh0UmVmIGNyZWF0ZUNnQ29udGV4
dEZyb21CaXRtYXAoSEJJVE1BUCBiaXRtYXApCi17Ci0gICAgQklUTUFQIGluZm87Ci0gICAgR2V0
T2JqZWN0KGJpdG1hcCwgc2l6ZW9mKGluZm8pLCAmaW5mbyk7Ci0gICAgQVNTRVJUKGluZm8uYm1C
aXRzUGl4ZWwgPT0gMzIpOwotCi0gICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29s
b3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwotICAgIENHQ29udGV4dFJlZiBiaXRtYXBDb250ZXh0
ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGluZm8uYm1CaXRzLCBpbmZvLmJtV2lkdGgsIGluZm8u
Ym1IZWlnaHQsIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9y
ZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhhTm9uZVNraXBGaXJzdCk7Ci0gICAgQ0dDb2xvclNw
YWNlUmVsZWFzZShkZXZpY2VSR0IpOwotICAgIHJldHVybiBiaXRtYXBDb250ZXh0OwotfQotCi1E
cmFnSW1hZ2VSZWYgc2NhbGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVmIGltYWdlLCBGbG9hdFNpemUg
c2NhbGUpCi17Ci0gICAgLy8gRklYTUU6IGR1ZSB0byB0aGUgd2F5IGRyYWcgaW1hZ2VzIGFyZSBk
b25lIG9uIHdpbmRvd3Mgd2UgbmVlZCAKLSAgICAvLyB0byBwcmVwcm9jZXNzIHRoZSBhbHBoYSBj
aGFubmVsIDxyZGFyOi8vcHJvYmxlbS81MDE1OTQ2PgotCi0gICAgaWYgKCFpbWFnZSkKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgQ0dDb250ZXh0UmVmIHRhcmdldENvbnRleHQ7Ci0gICAgQ0dDb250
ZXh0UmVmIHNyY0NvbnRleHQ7Ci0gICAgQ0dJbWFnZVJlZiBzcmNJbWFnZTsKLSAgICBJbnRTaXpl
IHNyY1NpemUgPSBkcmFnSW1hZ2VTaXplKGltYWdlKTsKLSAgICBJbnRTaXplIGRzdFNpemUoKGlu
dCkoc3JjU2l6ZS53aWR0aCgpICogc2NhbGUud2lkdGgoKSksIChpbnQpKHNyY1NpemUuaGVpZ2h0
KCkgKiBzY2FsZS5oZWlnaHQoKSkpOwotICAgIEhCSVRNQVAgaGJtcCA9IDA7Ci0gICAgSERDIGRj
ID0gR2V0REMoMCk7Ci0gICAgSERDIGRzdERDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGRjKTsKLSAg
ICBpZiAoIWRzdERDKQotICAgICAgICBnb3RvIGV4aXQ7Ci0KLSAgICBoYm1wID0gYWxsb2NJbWFn
ZShkc3REQywgZHN0U2l6ZSwgJnRhcmdldENvbnRleHQpOwotICAgIGlmICghaGJtcCkKLSAgICAg
ICAgZ290byBleGl0OwotCi0gICAgc3JjQ29udGV4dCA9IGNyZWF0ZUNnQ29udGV4dEZyb21CaXRt
YXAoaW1hZ2UpOwotICAgIHNyY0ltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlSW1hZ2Uoc3Jj
Q29udGV4dCk7Ci0gICAgQ0dSZWN0IHJlY3Q7Ci0gICAgcmVjdC5vcmlnaW4ueCA9IDA7Ci0gICAg
cmVjdC5vcmlnaW4ueSA9IDA7Ci0gICAgcmVjdC5zaXplID0gZHN0U2l6ZTsKLSAgICBDR0NvbnRl
eHREcmF3SW1hZ2UodGFyZ2V0Q29udGV4dCwgcmVjdCwgc3JjSW1hZ2UpOwotICAgIENHSW1hZ2VS
ZWxlYXNlKHNyY0ltYWdlKTsKLSAgICBDR0NvbnRleHRSZWxlYXNlKHNyY0NvbnRleHQpOwotICAg
IENHQ29udGV4dFJlbGVhc2UodGFyZ2V0Q29udGV4dCk7Ci0gICAgOjpEZWxldGVPYmplY3QoaW1h
Z2UpOwotICAgIGltYWdlID0gMDsKLQotZXhpdDoKLSAgICBpZiAoIWhibXApCi0gICAgICAgIGhi
bXAgPSBpbWFnZTsKLSAgICBpZiAoZHN0REMpCi0gICAgICAgIERlbGV0ZURDKGRzdERDKTsKLSAg
ICBSZWxlYXNlREMoMCwgZGMpOwotICAgIHJldHVybiBoYm1wOwotfQotICAgIAogRHJhZ0ltYWdl
UmVmIGRpc3NvbHZlRHJhZ0ltYWdlVG9GcmFjdGlvbihEcmFnSW1hZ2VSZWYgaW1hZ2UsIGZsb2F0
KQogewogICAgIC8vV2UgZG9uJ3QgZG8gdGhpcyBvbiB3aW5kb3dzIGFzIHRoZSBkcmFnaW1hZ2Ug
aXMgYmxlbmRlZCBieSB0aGUgT1MKICAgICByZXR1cm4gaW1hZ2U7CiB9CiAgICAgICAgIAotRHJh
Z0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZyb21JbWFnZShJbWFnZSogaW1nKQoteyAgICAKLSAg
ICBIQklUTUFQIGhibXAgPSAwOwotICAgIEhEQyBkYyA9IEdldERDKDApOwotICAgIEhEQyB3b3Jr
aW5nREMgPSBDcmVhdGVDb21wYXRpYmxlREMoZGMpOwotICAgIENHQ29udGV4dFJlZiBkcmF3Q29u
dGV4dCA9IDA7Ci0gICAgaWYgKCF3b3JraW5nREMpCi0gICAgICAgIGdvdG8gZXhpdDsKLQotICAg
IGhibXAgPSBhbGxvY0ltYWdlKHdvcmtpbmdEQywgaW1nLT5zaXplKCksICZkcmF3Q29udGV4dCk7
Ci0KLSAgICBpZiAoIWhibXApCi0gICAgICAgIGdvdG8gZXhpdDsKLQotICAgIGlmICghZHJhd0Nv
bnRleHQpIHsKLSAgICAgICAgOjpEZWxldGVPYmplY3QoaGJtcCk7Ci0gICAgICAgIGhibXAgPSAw
OwotICAgIH0KLQotICAgIENHSW1hZ2VSZWYgc3JjSW1hZ2UgPSBpbWctPmdldENHSW1hZ2VSZWYo
KTsKLSAgICBDR1JlY3QgcmVjdDsKLSAgICByZWN0LnNpemUgPSBpbWctPnNpemUoKTsKLSAgICBy
ZWN0Lm9yaWdpbi54ID0gMDsKLSAgICByZWN0Lm9yaWdpbi55ID0gLXJlY3Quc2l6ZS5oZWlnaHQ7
Ci0gICAgc3RhdGljIGNvbnN0IENHRmxvYXQgd2hpdGUgW10gPSB7MS4wLCAxLjAsIDEuMCwgMS4w
fTsKLSAgICBDR0NvbnRleHRTY2FsZUNUTShkcmF3Q29udGV4dCwgMSwgLTEpOwotICAgIENHQ29u
dGV4dFNldEZpbGxDb2xvcihkcmF3Q29udGV4dCwgd2hpdGUpOwotICAgIENHQ29udGV4dEZpbGxS
ZWN0KGRyYXdDb250ZXh0LCByZWN0KTsKLSAgICBDR0NvbnRleHRTZXRCbGVuZE1vZGUoZHJhd0Nv
bnRleHQsIGtDR0JsZW5kTW9kZU5vcm1hbCk7Ci0gICAgQ0dDb250ZXh0RHJhd0ltYWdlKGRyYXdD
b250ZXh0LCByZWN0LCBzcmNJbWFnZSk7Ci0gICAgQ0dDb250ZXh0UmVsZWFzZShkcmF3Q29udGV4
dCk7Ci0KLWV4aXQ6Ci0gICAgaWYgKHdvcmtpbmdEQykKLSAgICAgICAgRGVsZXRlREMod29ya2lu
Z0RDKTsKLSAgICBSZWxlYXNlREMoMCwgZGMpOwotICAgIHJldHVybiBoYm1wOwotfQotICAgIAog
RHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUljb25Gb3JDYWNoZWRJbWFnZShDYWNoZWRJbWFn
ZSopCiB7CiAgICAgLy9GSVhNRTogUHJvdmlkZSBpY29uIGZvciBpbWFnZSB0eXBlIDxyZGFyOi8v
cHJvYmxlbS81MDE1OTQ5Pgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>18811</attachid>
            <date>2008-01-30 22:44:45 -0800</date>
            <delta_ts>2008-01-31 13:09:15 -0800</delta_ts>
            <desc>Correct typo to Sixth patch</desc>
            <filename>webcore_win32.patch</filename>
            <type>text/plain</type>
            <size>200885</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyOTg0NykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNzYgQEAKKzIwMDgtMDEtMjkgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBnbWFp
bC5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
Rmlyc3Qgc3RlcCB0b3dhcmRzIHJlZW5hYmxpbmcgQ2Fpcm8gc3VwcG9ydCB1bmRlciBXaW5kb3dz
LgorICAgICAgICAtIGFkZHMgdmFyaW91cyBQTEFURk9STSBndWFyZHMgdG8gY29kZSB0aGF0IHdp
bGwgbm90IGJ1aWxkCisgICAgICAgICAgdW5kZXIgQ2Fpcm8uCisgICAgICAgIC0gYnJlYWtzIHNv
bWUgZmlsZXMgaW50byBDRyBhbmQgQ2Fpcm8tc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zLgorICAg
ICAgICAtIHByb3ZpZGVzIHNvbWUgd2luMzIvQ2Fpcm8gc3VwcG9ydCAoYnV0IGJ5IG5vIG1lYW5z
IGEgY29tcGxldGUKKyAgICAgICAgICBwb3J0IC0tIHlldCkuCisKKyAgICAgICAgV0FSTklORzog
Tk8gVEVTVCBDQVNFUyBBRERFRCBPUiBDSEFOR0VECisKKyAgICAgICAgKiBXZWJDb3JlLnZjcHJv
ai9XZWJDb3JlLnZjcHJvajoKKyAgICAgICAgKiBicmlkZ2Uvd2luL0ZyYW1lQ0dXaW4uY3BwOiBD
b3BpZWQgZnJvbSBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVXaW4uY3BwLgorICAgICAgICAoV2Vi
Q29yZTo6aW1hZ2VGcm9tU2VsZWN0aW9uKToKKyAgICAgICAgKiBicmlkZ2Uvd2luL0ZyYW1lQ2Fp
cm9XaW4uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OmltYWdlRnJvbVNlbGVjdGlvbik6
CisgICAgICAgICogYnJpZGdlL3dpbi9GcmFtZVdpbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpj
b21wdXRlUGFnZVJlY3RzRm9yRnJhbWUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL1Np
bXBsZUZvbnREYXRhLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhp
Y3NDb250ZXh0Q2Fpcm8uY3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZS5oOiBDb3BpZWQgZnJvbSBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4dENhaXJvLmNwcC4KKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENHV2luLmNwcDogQ29waWVkIGZyb20gV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udFdpbi5jcHAuCisgICAgICAgIChXZWJDb3JlOjpGb250
OjpkcmF3R2x5cGhzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENhaXJv
V2luLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpGb250OjpkcmF3R2x5cGhzKToKKyAg
ICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udFdpbi5jcHA6CisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENHV2luLmNwcDogQ29waWVkIGZyb20g
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0V2luLmNwcC4KKyAg
ICAgICAgKFdlYkNvcmU6OkNHQ29udGV4dFdpdGhIREMpOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0OjpnZXRXaW5kb3dzQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQ6OnJlbGVhc2VXaW5kb3dzQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNvbmNhdENUTSk6CisgICAgICAgIChXZWJD
b3JlOjpzZXRDR1N0cm9rZUNvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dDo6ZHJhd0xpbmVGb3JNaXNzcGVsbGluZ09yQmFkR3JhbW1hcik6CisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENhaXJvV2luLmNwcDogQWRkZWQuCisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dCk6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmdldFdpbmRvd3NDb250ZXh0KToKKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6aW5UcmFuc3BhcmVuY3lMYXllcik6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnJlbGVhc2VXaW5kb3dzQ29udGV4dCk6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNvbmNhdENUTSk6
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1c1JpbmcpOgorICAg
ICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvck1pc3NwZWxsaW5nT3JC
YWRHcmFtbWFyKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250
ZXh0V2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZTo6c2NhbGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlOjpyb3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0UGxhdGZv
cm1Qcml2YXRlOjp0cmFuc2xhdGUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9J
bWFnZUNHV2luLmNwcDogQ29waWVkIGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4v
SW1hZ2VXaW4uY3BwLgorICAgICAgICAoV2ViQ29yZTo6Qml0bWFwSW1hZ2U6OmdldEhCSVRNQVBP
ZlNpemUpOgorICAgICAgICAoV2ViQ29yZTo6Qml0bWFwSW1hZ2U6OmRyYXdGcmFtZU1hdGNoaW5n
U291cmNlU2l6ZSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ2Fpcm9X
aW4uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdlOjpnZXRIQklUTUFQ
T2ZTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdlOjpkcmF3RnJhbWVNYXRjaGlu
Z1NvdXJjZVNpemUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZVdpbi5j
cHA6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ0dXaW4u
Y3BwOiBDb3BpZWQgZnJvbSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250
RGF0YVdpbi5jcHAuCisgICAgICAgIChXZWJDb3JlOjpzY2FsZUVtVG9Vbml0cyk6CisgICAgICAg
IChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KToKKyAgICAgICAgKFdlYkNv
cmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybVdpZHRoRm9yR2x5cGgpOgorICAgICAgICAqIHBs
YXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNhaXJvV2luLmNwcDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KToKKyAgICAgICAg
KFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3kpOgorICAgICAgICAoV2Vi
Q29yZTo6U2ltcGxlRm9udERhdGE6OnBsYXRmb3JtV2lkdGhGb3JHbHlwaCk6CisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhV2luLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OlNpbXBsZUZvbnREYXRhOjpzZXRTaG91bGRBcHBseU1hY0FzY2VudEhhY2spOgorICAg
ICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnNob3VsZEFwcGx5TWFjQXNjZW50SGFjayk6
CisgICAgICAgICogcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNHV2luLmNwcDogQ29waWVkIGZyb20g
V2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlV2luLmNwcC4KKyAgICAgICAgKFdlYkNvcmU6
OnNjYWxlRHJhZ0ltYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OmNyZWF0ZURyYWdJbWFnZUZyb21J
bWFnZSk6CisgICAgICAgICogcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNhaXJvV2luLmNwcDogQWRk
ZWQuCisgICAgICAgIChXZWJDb3JlOjpzY2FsZURyYWdJbWFnZSk6CisgICAgICAgIChXZWJDb3Jl
OjpjcmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2UpOgorICAgICAgICAqIHBsYXRmb3JtL3dpbi9EcmFn
SW1hZ2VXaW4uY3BwOgorCiAyMDA4LTAxLTI5ICBBZGFtIFJvYmVuICA8YXJvYmVuQGFwcGxlLmNv
bT4KIAogICAgICAgICBGaXggPHJkYXI6Ly81NzExMTM2PiBGdWxsLXNjcmVlbiBGbGFzaCBvbiAx
dXAuY29tIGlzIHVucmVzcG9uc2l2ZQpJbmRleDogV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJD
b3JlLnZjcHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUu
dmNwcm9qCShyZXZpc2lvbiAyOTcyNikKKysrIFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29y
ZS52Y3Byb2oJKHdvcmtpbmcgY29weSkKQEAgLTM0MTgsNiArMzQxOCwxMCBAQAogCQkJCQk+DQog
CQkJCTwvRmlsZT4NCiAJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1c
d2luXERyYWdJbWFnZUNHV2luLmNwcCINCisJCQkJCT4NCisJCQkJPC9GaWxlPg0KKwkJCQk8Rmls
ZQ0KIAkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVx3aW5cRHJhZ0ltYWdlV2luLmNwcCIN
CiAJCQkJCT4NCiAJCQkJPC9GaWxlPg0KQEAgLTM4NzYsNiArMzg4MCwxMCBAQAogCQkJCQkJPg0K
IAkJCQkJPC9GaWxlPg0KIAkJCQkJPEZpbGUNCisJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRm
b3JtXGdyYXBoaWNzXHdpblxGb250Q0dXaW4uY3BwIg0KKwkJCQkJCT4NCisJCQkJCTwvRmlsZT4N
CisJCQkJCTxGaWxlDQogCQkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1x3
aW5cRm9udEN1c3RvbVBsYXRmb3JtRGF0YS5jcHAiDQogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0K
QEAgLTM5MzIsNiArMzk0MCwxMCBAQAogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KIAkJCQkJPEZp
bGUNCisJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxHcmFwaGlj
c0NvbnRleHRDR1dpbi5jcHAiDQorCQkJCQkJPg0KKwkJCQkJPC9GaWxlPg0KKwkJCQkJPEZpbGUN
CiAJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxHcmFwaGljc0Nv
bnRleHRXaW4uY3BwIg0KIAkJCQkJCT4NCiAJCQkJCTwvRmlsZT4NCkBAIC0zOTQwLDYgKzM5NTIs
MTAgQEAKIAkJCQkJCT4NCiAJCQkJCTwvRmlsZT4NCiAJCQkJCTxGaWxlDQorCQkJCQkJUmVsYXRp
dmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1x3aW5cSW1hZ2VDR1dpbi5jcHAiDQorCQkJCQkJ
Pg0KKwkJCQkJPC9GaWxlPg0KKwkJCQkJPEZpbGUNCiAJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBs
YXRmb3JtXGdyYXBoaWNzXHdpblxJbWFnZVdpbi5jcHAiDQogCQkJCQkJPg0KIAkJCQkJPC9GaWxl
Pg0KQEAgLTM5NjQsNiArMzk4MCwxMCBAQAogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KIAkJCQkJ
PEZpbGUNCisJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxTaW1w
bGVGb250RGF0YUNHV2luLmNwcCINCisJCQkJCQk+DQorCQkJCQk8L0ZpbGU+DQorCQkJCQk8Rmls
ZQ0KIAkJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cZ3JhcGhpY3Ncd2luXFNpbXBsZUZv
bnREYXRhV2luLmNwcCINCiAJCQkJCQk+DQogCQkJCQk8L0ZpbGU+DQpAQCAtNjQwOCw2ICs2NDI4
LDEwIEBACiAJCQkJTmFtZT0id2luIg0KIAkJCQk+DQogCQkJCTxGaWxlDQorCQkJCQlSZWxhdGl2
ZVBhdGg9Ii4uXGJyaWRnZVx3aW5cRnJhbWVDR1dpbi5jcHAiDQorCQkJCQk+DQorCQkJCTwvRmls
ZT4NCisJCQkJPEZpbGUNCiAJCQkJCVJlbGF0aXZlUGF0aD0iLi5cYnJpZGdlXHdpblxGcmFtZVdp
bi5jcHAiDQogCQkJCQk+DQogCQkJCTwvRmlsZT4NCkluZGV4OiBXZWJDb3JlL2JyaWRnZS93aW4v
RnJhbWVDR1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lQ0dX
aW4uY3BwCShyZXZpc2lvbiAyOTgzNCkJKGZyb20gV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lV2lu
LmNwcDoyOTgzNCkKKysrIFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZUNHV2luLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAw
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJGcmFtZVdpbi5oIgorCisjaW5jbHVkZSA8d2luc29jazIuaD4KKyNp
bmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKKyNpbmNs
dWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkVkaXRv
ckNsaWVudC5oIgorI2luY2x1ZGUgIkZyYW1lTG9hZGVyLmgiCisjaW5jbHVkZSAiRnJhbWVMb2Fk
UmVxdWVzdC5oIgorI2luY2x1ZGUgIkZyYW1lUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkZyYW1lVmll
dy5oIgorI2luY2x1ZGUgIkhUTUxJRnJhbWVFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTE5hbWVz
LmgiCisjaW5jbHVkZSAiSFRNTFRhYmxlQ2VsbEVsZW1lbnQuaCIKKyNpbmNsdWRlICJLZXlib2Fy
ZEV2ZW50LmgiCisjaW5jbHVkZSAiTlBfanNvYmplY3QuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1l
bnRlZC5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRlICJQbHVnaW4uaCIKKyNpbmNsdWRl
ICJQbHVnaW5EYXRhYmFzZVdpbi5oIgorI2luY2x1ZGUgIlBsdWdpblZpZXdXaW4uaCIKKyNpbmNs
dWRlICJSZWd1bGFyRXhwcmVzc2lvbi5oIgorI2luY2x1ZGUgIlJlbmRlckZyYW1lLmgiCisjaW5j
bHVkZSAiUmVuZGVyVGFibGVDZWxsLmgiCisjaW5jbHVkZSAiUmVuZGVyVmlldy5oIgorI2luY2x1
ZGUgIlJlc291cmNlSGFuZGxlLmgiCisjaW5jbHVkZSAiVGV4dFJlc291cmNlRGVjb2Rlci5oIgor
I2luY2x1ZGUgImtqc19wcm94eS5oIgorI2luY2x1ZGUgImtqc193aW5kb3cuaCIKKyNpbmNsdWRl
ICJucHJ1bnRpbWVfaW1wbC5oIgorI2luY2x1ZGUgInJ1bnRpbWVfcm9vdC5oIgorI2luY2x1ZGUg
IkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIlNldHRpbmdzLmgiCisKKyNpZiBQTEFURk9S
TShDRykKKyNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ29yZUdyYXBoaWNzLmg+CisjZW5kaWYKKwor
dXNpbmcgc3RkOjptaW47Cit1c2luZyBuYW1lc3BhY2UgS0pTOjpCaW5kaW5nczsKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCit1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOworCit2b2lkIEZyYW1l
OjpjbGVhclBsYXRmb3JtU2NyaXB0T2JqZWN0cygpCit7Cit9CisKK0tKUzo6QmluZGluZ3M6Oklu
c3RhbmNlKiBGcmFtZTo6Y3JlYXRlU2NyaXB0SW5zdGFuY2VGb3JXaWRnZXQoV2lkZ2V0KiB3aWRn
ZXQpCit7CisgICAgLy8gRklYTUU6IElkZWFsbHkgd2UnZCBoYXZlIGFuIGlzUGx1Z2luVmlldygp
IGhlcmUgYnV0IHdlIGNhbid0IGFkZCB0aGF0IHRvIHRoZSBvcGVuIHNvdXJjZSB0cmVlIHJpZ2h0
IG5vdy4KKyAgICBpZiAod2lkZ2V0LT5pc0ZyYW1lVmlldygpKQorICAgICAgICByZXR1cm4gMDsK
KworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQbHVnaW5WaWV3V2luKj4od2lkZ2V0KS0+YmluZGlu
Z0luc3RhbmNlKCk7Cit9CisKKwordm9pZCBjb21wdXRlUGFnZVJlY3RzRm9yRnJhbWUoRnJhbWUq
IGZyYW1lLCBjb25zdCBJbnRSZWN0JiBwcmludFJlY3QsIGZsb2F0IGhlYWRlckhlaWdodCwgZmxv
YXQgZm9vdGVySGVpZ2h0LCBmbG9hdCB1c2VyU2NhbGVGYWN0b3IsVmVjdG9yPEludFJlY3Q+JiBw
YWdlcywgaW50JiBvdXRQYWdlSGVpZ2h0KQoreworICAgIEFTU0VSVChmcmFtZSk7CisKKyAgICBw
YWdlcy5jbGVhcigpOworICAgIG91dFBhZ2VIZWlnaHQgPSAwOworCisgICAgaWYgKCFmcmFtZS0+
ZG9jdW1lbnQoKSB8fCAhZnJhbWUtPnZpZXcoKSB8fCAhZnJhbWUtPmRvY3VtZW50KCktPnJlbmRl
cmVyKCkpCisgICAgICAgIHJldHVybjsKKyAKKyAgICBSZW5kZXJWaWV3KiByb290ID0gc3RhdGlj
X2Nhc3Q8UmVuZGVyVmlldyAqPihmcmFtZS0+ZG9jdW1lbnQoKS0+cmVuZGVyZXIoKSk7CisKKyAg
ICBpZiAoIXJvb3QpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJkb2N1bWVudCB0byBiZSBwcmludGVk
IGhhcyBubyByZW5kZXJlciIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHVz
ZXJTY2FsZUZhY3RvciA8PSAwKSB7CisgICAgICAgIExPR19FUlJPUigidXNlclNjYWxlRmFjdG9y
IGhhcyBiYWQgdmFsdWUgJS4yZiIsIHVzZXJTY2FsZUZhY3Rvcik7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisgICAgCisgICAgZmxvYXQgcmF0aW8gPSAoZmxvYXQpcHJpbnRSZWN0LmhlaWdodCgp
IC8gKGZsb2F0KXByaW50UmVjdC53aWR0aCgpOworIAorICAgIGZsb2F0IHBhZ2VXaWR0aCAgPSAo
ZmxvYXQpIHJvb3QtPmRvY1dpZHRoKCk7CisgICAgZmxvYXQgcGFnZUhlaWdodCA9IHBhZ2VXaWR0
aCAqIHJhdGlvOworICAgIG91dFBhZ2VIZWlnaHQgPSAoaW50KSBwYWdlSGVpZ2h0OyAgIC8vIHRo
aXMgaXMgdGhlIGhlaWdodCBvZiB0aGUgcGFnZSBhZGp1c3RlZCBieSBtYXJnaW5zCisgICAgcGFn
ZUhlaWdodCAtPSAoaGVhZGVySGVpZ2h0ICsgZm9vdGVySGVpZ2h0KTsKKworICAgIGlmIChwYWdl
SGVpZ2h0IDw9IDApIHsKKyAgICAgICAgTE9HX0VSUk9SKCJwYWdlSGVpZ2h0IGhhcyBiYWQgdmFs
dWUgJS4yZiIsIHBhZ2VIZWlnaHQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZmxv
YXQgY3VyclBhZ2VIZWlnaHQgPSBwYWdlSGVpZ2h0IC8gdXNlclNjYWxlRmFjdG9yOworICAgIGZs
b2F0IGRvY0hlaWdodCAgICAgID0gcm9vdC0+bGF5ZXIoKS0+aGVpZ2h0KCk7CisgICAgZmxvYXQg
ZG9jV2lkdGggICAgICAgPSByb290LT5sYXllcigpLT53aWR0aCgpOworICAgIGZsb2F0IGN1cnJQ
YWdlV2lkdGggID0gcGFnZVdpZHRoIC8gdXNlclNjYWxlRmFjdG9yOworCisgICAgCisgICAgLy8g
YWx3YXlzIHJldHVybiBhdCBsZWFzdCBvbmUgcGFnZSwgc2luY2UgZW1wdHkgZmlsZXMgc2hvdWxk
IHByaW50IGEgYmxhbmsgcGFnZQorICAgIGZsb2F0IHByaW50ZWRQYWdlc0hlaWdodCA9IDAuMDsK
KyAgICBkbyB7CisgICAgICAgIGZsb2F0IHByb3Bvc2VkQm90dG9tID0gbWluKGRvY0hlaWdodCwg
cHJpbnRlZFBhZ2VzSGVpZ2h0ICsgcGFnZUhlaWdodCk7CisgICAgICAgIGZyYW1lLT5hZGp1c3RQ
YWdlSGVpZ2h0KCZwcm9wb3NlZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0LCBwcm9wb3NlZEJv
dHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0KTsKKyAgICAgICAgY3VyclBhZ2VIZWlnaHQgPSBtYXgo
MS4wZiwgcHJvcG9zZWRCb3R0b20gLSBwcmludGVkUGFnZXNIZWlnaHQpOworICAgICAgIAorICAg
ICAgICBwYWdlcy5hcHBlbmQoSW50UmVjdCgwLHByaW50ZWRQYWdlc0hlaWdodCxjdXJyUGFnZVdp
ZHRoLGN1cnJQYWdlSGVpZ2h0KSk7CisgICAgICAgIHByaW50ZWRQYWdlc0hlaWdodCArPSBjdXJy
UGFnZUhlaWdodDsKKyAgICB9IHdoaWxlIChwcmludGVkUGFnZXNIZWlnaHQgPCBkb2NIZWlnaHQp
OworfQorCitzdGF0aWMgdm9pZCBkcmF3UmVjdEludG9Db250ZXh0KEludFJlY3QgcmVjdCwgRnJh
bWVWaWV3KiB2aWV3LCBHcmFwaGljc0NvbnRleHQqIGdjKQoreworICAgIEludFNpemUgb2Zmc2V0
ID0gdmlldy0+c2Nyb2xsT2Zmc2V0KCk7CisgICAgcmVjdC5tb3ZlKC1vZmZzZXQud2lkdGgoKSwg
LW9mZnNldC5oZWlnaHQoKSk7CisgICAgcmVjdCA9IHZpZXctPmNvbnZlcnRUb0NvbnRhaW5pbmdX
aW5kb3cocmVjdCk7CisKKyAgICBnYy0+Y29uY2F0Q1RNKEFmZmluZVRyYW5zZm9ybSgpLnRyYW5z
bGF0ZSgtcmVjdC54KCksIC1yZWN0LnkoKSkpOworCisgICAgdmlldy0+cGFpbnQoZ2MsIHJlY3Qp
OworfQorCitIQklUTUFQIGltYWdlRnJvbVNlbGVjdGlvbihGcmFtZSogZnJhbWUsIGJvb2wgZm9y
Y2VCbGFja1RleHQpCit7CisgICAgZnJhbWUtPnNldFBhaW50UmVzdHJpY3Rpb24oZm9yY2VCbGFj
a1RleHQgPyBQYWludFJlc3RyaWN0aW9uU2VsZWN0aW9uT25seUJsYWNrVGV4dCA6IFBhaW50UmVz
dHJpY3Rpb25TZWxlY3Rpb25Pbmx5KTsKKyAgICBGbG9hdFJlY3QgZnIgPSBmcmFtZS0+c2VsZWN0
aW9uUmVjdCgpOworICAgIEludFJlY3QgaXIoKGludClmci54KCksIChpbnQpZnIueSgpLChpbnQp
ZnIud2lkdGgoKSwoaW50KWZyLmhlaWdodCgpKTsKKworICAgIHZvaWQqIGJpdHM7CisgICAgSERD
IGhkYyA9IENyZWF0ZUNvbXBhdGlibGVEQygwKTsKKyAgICBpbnQgdyA9IGlyLndpZHRoKCk7Cisg
ICAgaW50IGggPSBpci5oZWlnaHQoKTsKKyAgICBCSVRNQVBJTkZPIGJtcCA9IHsgeyBzaXplb2Yo
QklUTUFQSU5GT0hFQURFUiksIHcsIGgsIDEsIDMyIH0gfTsKKworICAgIEhCSVRNQVAgaGJtcCA9
IENyZWF0ZURJQlNlY3Rpb24oMCwgJmJtcCwgRElCX1JHQl9DT0xPUlMsICh2b2lkKiopJmJpdHMs
IDAsIDApOworICAgIEhCSVRNQVAgaGJtcE9sZCA9IChIQklUTUFQKVNlbGVjdE9iamVjdChoZGMs
IGhibXApOworICAgIENHQ29sb3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVh
dGVEZXZpY2VSR0IoKTsKKyAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IENHQml0bWFwQ29udGV4
dENyZWF0ZSgodm9pZCopYml0cywgdywgaCwKKyAgICAgICAgOCwgdyAqIHNpemVvZihSR0JRVUFE
KSwgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFQ
cmVtdWx0aXBsaWVkRmlyc3QpOworICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsK
KyAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQpOworCisgICAgR3JhcGhpY3NDb250ZXh0
IGdjKGNvbnRleHQpOworCisgICAgZnJhbWUtPmRvY3VtZW50KCktPnVwZGF0ZUxheW91dCgpOwor
ICAgIGRyYXdSZWN0SW50b0NvbnRleHQoaXIsIGZyYW1lLT52aWV3KCksICZnYyk7CisKKyAgICBD
R0NvbnRleHRSZWxlYXNlKGNvbnRleHQpOworICAgIFNlbGVjdE9iamVjdChoZGMsIGhibXBPbGQp
OworICAgIERlbGV0ZURDKGhkYyk7CisKKyAgICBmcmFtZS0+c2V0UGFpbnRSZXN0cmljdGlvbihQ
YWludFJlc3RyaWN0aW9uTm9uZSk7CisKKyAgICByZXR1cm4gaGJtcDsKK30KKworRHJhZ0ltYWdl
UmVmIEZyYW1lOjpkcmFnSW1hZ2VGb3JTZWxlY3Rpb24oKQoreyAgICAKKyAgICBpZiAoc2VsZWN0
aW9uQ29udHJvbGxlcigpLT5pc1JhbmdlKCkpCisgICAgICAgIHJldHVybiBpbWFnZUZyb21TZWxl
Y3Rpb24odGhpcywgZmFsc2UpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgRnJhbWU6OmRh
c2hib2FyZFJlZ2lvbnNDaGFuZ2VkKCkKK3sKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJ
bmRleDogV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lQ0dXaW4uY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvYnJpZGdlL3dpbi9GcmFtZUNHV2luLmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJD
b3JlL2JyaWRnZS93aW4vRnJhbWVDR1dpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1
IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAg
LTI2LDExNyArMjYsMTggQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJGcmFtZVdp
bi5oIgogCi0jaW5jbHVkZSA8d2luc29jazIuaD4KICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAKLSNp
bmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKLSNpbmNsdWRlICJGbG9hdFJlY3QuaCIKLSNpbmNs
dWRlICJEb2N1bWVudC5oIgotI2luY2x1ZGUgIkVkaXRvckNsaWVudC5oIgotI2luY2x1ZGUgIkZy
YW1lTG9hZGVyLmgiCi0jaW5jbHVkZSAiRnJhbWVMb2FkUmVxdWVzdC5oIgotI2luY2x1ZGUgIkZy
YW1lUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkZyYW1lVmlldy5oIgotI2luY2x1ZGUgIkhUTUxJRnJh
bWVFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTE5hbWVzLmgiCi0jaW5jbHVkZSAiSFRNTFRhYmxl
Q2VsbEVsZW1lbnQuaCIKLSNpbmNsdWRlICJLZXlib2FyZEV2ZW50LmgiCi0jaW5jbHVkZSAiTlBf
anNvYmplY3QuaCIKLSNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgotI2luY2x1ZGUgIlBhZ2Uu
aCIKLSNpbmNsdWRlICJQbHVnaW4uaCIKLSNpbmNsdWRlICJQbHVnaW5EYXRhYmFzZVdpbi5oIgot
I2luY2x1ZGUgIlBsdWdpblZpZXdXaW4uaCIKLSNpbmNsdWRlICJSZWd1bGFyRXhwcmVzc2lvbi5o
IgotI2luY2x1ZGUgIlJlbmRlckZyYW1lLmgiCi0jaW5jbHVkZSAiUmVuZGVyVGFibGVDZWxsLmgi
Ci0jaW5jbHVkZSAiUmVuZGVyVmlldy5oIgotI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlLmgiCi0j
aW5jbHVkZSAiVGV4dFJlc291cmNlRGVjb2Rlci5oIgotI2luY2x1ZGUgImtqc19wcm94eS5oIgot
I2luY2x1ZGUgImtqc193aW5kb3cuaCIKLSNpbmNsdWRlICJucHJ1bnRpbWVfaW1wbC5oIgotI2lu
Y2x1ZGUgInJ1bnRpbWVfcm9vdC5oIgogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2lu
Y2x1ZGUgIlNldHRpbmdzLmgiCiAKLSNpZiBQTEFURk9STShDRykKICNpbmNsdWRlIDxDb3JlR3Jh
cGhpY3MvQ29yZUdyYXBoaWNzLmg+Ci0jZW5kaWYKIAogdXNpbmcgc3RkOjptaW47Ci11c2luZyBu
YW1lc3BhY2UgS0pTOjpCaW5kaW5nczsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi11c2luZyBu
YW1lc3BhY2UgSFRNTE5hbWVzOwotCi12b2lkIEZyYW1lOjpjbGVhclBsYXRmb3JtU2NyaXB0T2Jq
ZWN0cygpCi17Ci19Ci0KLUtKUzo6QmluZGluZ3M6Okluc3RhbmNlKiBGcmFtZTo6Y3JlYXRlU2Ny
aXB0SW5zdGFuY2VGb3JXaWRnZXQoV2lkZ2V0KiB3aWRnZXQpCi17Ci0gICAgLy8gRklYTUU6IElk
ZWFsbHkgd2UnZCBoYXZlIGFuIGlzUGx1Z2luVmlldygpIGhlcmUgYnV0IHdlIGNhbid0IGFkZCB0
aGF0IHRvIHRoZSBvcGVuIHNvdXJjZSB0cmVlIHJpZ2h0IG5vdy4KLSAgICBpZiAod2lkZ2V0LT5p
c0ZyYW1lVmlldygpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxQbHVnaW5WaWV3V2luKj4od2lkZ2V0KS0+YmluZGluZ0luc3RhbmNlKCk7Ci19Ci0KLQotdm9p
ZCBjb21wdXRlUGFnZVJlY3RzRm9yRnJhbWUoRnJhbWUqIGZyYW1lLCBjb25zdCBJbnRSZWN0JiBw
cmludFJlY3QsIGZsb2F0IGhlYWRlckhlaWdodCwgZmxvYXQgZm9vdGVySGVpZ2h0LCBmbG9hdCB1
c2VyU2NhbGVGYWN0b3IsVmVjdG9yPEludFJlY3Q+JiBwYWdlcywgaW50JiBvdXRQYWdlSGVpZ2h0
KQotewotICAgIEFTU0VSVChmcmFtZSk7Ci0KLSAgICBwYWdlcy5jbGVhcigpOwotICAgIG91dFBh
Z2VIZWlnaHQgPSAwOwotCi0gICAgaWYgKCFmcmFtZS0+ZG9jdW1lbnQoKSB8fCAhZnJhbWUtPnZp
ZXcoKSB8fCAhZnJhbWUtPmRvY3VtZW50KCktPnJlbmRlcmVyKCkpCi0gICAgICAgIHJldHVybjsK
LSAKLSAgICBSZW5kZXJWaWV3KiByb290ID0gc3RhdGljX2Nhc3Q8UmVuZGVyVmlldyAqPihmcmFt
ZS0+ZG9jdW1lbnQoKS0+cmVuZGVyZXIoKSk7Ci0KLSAgICBpZiAoIXJvb3QpIHsKLSAgICAgICAg
TE9HX0VSUk9SKCJkb2N1bWVudCB0byBiZSBwcmludGVkIGhhcyBubyByZW5kZXJlciIpOwotICAg
ICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHVzZXJTY2FsZUZhY3RvciA8PSAwKSB7Ci0g
ICAgICAgIExPR19FUlJPUigidXNlclNjYWxlRmFjdG9yIGhhcyBiYWQgdmFsdWUgJS4yZiIsIHVz
ZXJTY2FsZUZhY3Rvcik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgZmxvYXQg
cmF0aW8gPSAoZmxvYXQpcHJpbnRSZWN0LmhlaWdodCgpIC8gKGZsb2F0KXByaW50UmVjdC53aWR0
aCgpOwotIAotICAgIGZsb2F0IHBhZ2VXaWR0aCAgPSAoZmxvYXQpIHJvb3QtPmRvY1dpZHRoKCk7
Ci0gICAgZmxvYXQgcGFnZUhlaWdodCA9IHBhZ2VXaWR0aCAqIHJhdGlvOwotICAgIG91dFBhZ2VI
ZWlnaHQgPSAoaW50KSBwYWdlSGVpZ2h0OyAgIC8vIHRoaXMgaXMgdGhlIGhlaWdodCBvZiB0aGUg
cGFnZSBhZGp1c3RlZCBieSBtYXJnaW5zCi0gICAgcGFnZUhlaWdodCAtPSAoaGVhZGVySGVpZ2h0
ICsgZm9vdGVySGVpZ2h0KTsKLQotICAgIGlmIChwYWdlSGVpZ2h0IDw9IDApIHsKLSAgICAgICAg
TE9HX0VSUk9SKCJwYWdlSGVpZ2h0IGhhcyBiYWQgdmFsdWUgJS4yZiIsIHBhZ2VIZWlnaHQpOwot
ICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZmxvYXQgY3VyclBhZ2VIZWlnaHQgPSBwYWdl
SGVpZ2h0IC8gdXNlclNjYWxlRmFjdG9yOwotICAgIGZsb2F0IGRvY0hlaWdodCAgICAgID0gcm9v
dC0+bGF5ZXIoKS0+aGVpZ2h0KCk7Ci0gICAgZmxvYXQgZG9jV2lkdGggICAgICAgPSByb290LT5s
YXllcigpLT53aWR0aCgpOwotICAgIGZsb2F0IGN1cnJQYWdlV2lkdGggID0gcGFnZVdpZHRoIC8g
dXNlclNjYWxlRmFjdG9yOwotCi0gICAgCi0gICAgLy8gYWx3YXlzIHJldHVybiBhdCBsZWFzdCBv
bmUgcGFnZSwgc2luY2UgZW1wdHkgZmlsZXMgc2hvdWxkIHByaW50IGEgYmxhbmsgcGFnZQotICAg
IGZsb2F0IHByaW50ZWRQYWdlc0hlaWdodCA9IDAuMDsKLSAgICBkbyB7Ci0gICAgICAgIGZsb2F0
IHByb3Bvc2VkQm90dG9tID0gbWluKGRvY0hlaWdodCwgcHJpbnRlZFBhZ2VzSGVpZ2h0ICsgcGFn
ZUhlaWdodCk7Ci0gICAgICAgIGZyYW1lLT5hZGp1c3RQYWdlSGVpZ2h0KCZwcm9wb3NlZEJvdHRv
bSwgcHJpbnRlZFBhZ2VzSGVpZ2h0LCBwcm9wb3NlZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0
KTsKLSAgICAgICAgY3VyclBhZ2VIZWlnaHQgPSBtYXgoMS4wZiwgcHJvcG9zZWRCb3R0b20gLSBw
cmludGVkUGFnZXNIZWlnaHQpOwotICAgICAgIAotICAgICAgICBwYWdlcy5hcHBlbmQoSW50UmVj
dCgwLHByaW50ZWRQYWdlc0hlaWdodCxjdXJyUGFnZVdpZHRoLGN1cnJQYWdlSGVpZ2h0KSk7Ci0g
ICAgICAgIHByaW50ZWRQYWdlc0hlaWdodCArPSBjdXJyUGFnZUhlaWdodDsKLSAgICB9IHdoaWxl
IChwcmludGVkUGFnZXNIZWlnaHQgPCBkb2NIZWlnaHQpOwotfQotCiBzdGF0aWMgdm9pZCBkcmF3
UmVjdEludG9Db250ZXh0KEludFJlY3QgcmVjdCwgRnJhbWVWaWV3KiB2aWV3LCBHcmFwaGljc0Nv
bnRleHQqIGdjKQogewogICAgIEludFNpemUgb2Zmc2V0ID0gdmlldy0+c2Nyb2xsT2Zmc2V0KCk7
CkBAIC0xNTIsNyArNTMsOCBAQCBIQklUTUFQIGltYWdlRnJvbVNlbGVjdGlvbihGcmFtZSogZnJh
bWUsCiB7CiAgICAgZnJhbWUtPnNldFBhaW50UmVzdHJpY3Rpb24oZm9yY2VCbGFja1RleHQgPyBQ
YWludFJlc3RyaWN0aW9uU2VsZWN0aW9uT25seUJsYWNrVGV4dCA6IFBhaW50UmVzdHJpY3Rpb25T
ZWxlY3Rpb25Pbmx5KTsKICAgICBGbG9hdFJlY3QgZnIgPSBmcmFtZS0+c2VsZWN0aW9uUmVjdCgp
OwotICAgIEludFJlY3QgaXIoKGludClmci54KCksIChpbnQpZnIueSgpLChpbnQpZnIud2lkdGgo
KSwoaW50KWZyLmhlaWdodCgpKTsKKyAgICBJbnRSZWN0IGlyKHN0YXRpY19jYXN0PGludD4oZnIu
eCgpKSwgc3RhdGljX2Nhc3Q8aW50Pihmci55KCkpLAorICAgICAgICAgICAgICAgc3RhdGljX2Nh
c3Q8aW50Pihmci53aWR0aCgpKSwgc3RhdGljX2Nhc3Q8aW50Pihmci5oZWlnaHQoKSkpOwogCiAg
ICAgdm9pZCogYml0czsKICAgICBIREMgaGRjID0gQ3JlYXRlQ29tcGF0aWJsZURDKDApOwpAQCAt
MTYwLDEwICs2MiwxMCBAQCBIQklUTUFQIGltYWdlRnJvbVNlbGVjdGlvbihGcmFtZSogZnJhbWUs
CiAgICAgaW50IGggPSBpci5oZWlnaHQoKTsKICAgICBCSVRNQVBJTkZPIGJtcCA9IHsgeyBzaXpl
b2YoQklUTUFQSU5GT0hFQURFUiksIHcsIGgsIDEsIDMyIH0gfTsKIAotICAgIEhCSVRNQVAgaGJt
cCA9IENyZWF0ZURJQlNlY3Rpb24oMCwgJmJtcCwgRElCX1JHQl9DT0xPUlMsICh2b2lkKiopJmJp
dHMsIDAsIDApOwotICAgIEhCSVRNQVAgaGJtcE9sZCA9IChIQklUTUFQKVNlbGVjdE9iamVjdCho
ZGMsIGhibXApOworICAgIEhCSVRNQVAgaGJtcCA9IENyZWF0ZURJQlNlY3Rpb24oMCwgJmJtcCwg
RElCX1JHQl9DT0xPUlMsIHN0YXRpY19jYXN0PHZvaWQqKj4oJmJpdHMpLCAwLCAwKTsKKyAgICBI
QklUTUFQIGhibXBPbGQgPSBzdGF0aWNfY2FzdDxIQklUTUFQPihTZWxlY3RPYmplY3QoaGRjLCBo
Ym1wKSk7CiAgICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0
ZURldmljZVJHQigpOwotICAgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0
Q3JlYXRlKCh2b2lkKiliaXRzLCB3LCBoLAorICAgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gQ0dC
aXRtYXBDb250ZXh0Q3JlYXRlKHN0YXRpY19jYXN0PHZvaWQqPihiaXRzKSwgdywgaCwKICAgICAg
ICAgOCwgdyAqIHNpemVvZihSR0JRVUFEKSwgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIz
MkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFQcmVtdWx0aXBsaWVkRmlyc3QpOwogICAgIENHQ29sb3JT
cGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKICAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQp
OwpAQCAtMTgyLDE2ICs4NCw0IEBAIEhCSVRNQVAgaW1hZ2VGcm9tU2VsZWN0aW9uKEZyYW1lKiBm
cmFtZSwKICAgICByZXR1cm4gaGJtcDsKIH0KIAotRHJhZ0ltYWdlUmVmIEZyYW1lOjpkcmFnSW1h
Z2VGb3JTZWxlY3Rpb24oKQoteyAgICAKLSAgICBpZiAoc2VsZWN0aW9uQ29udHJvbGxlcigpLT5p
c1JhbmdlKCkpCi0gICAgICAgIHJldHVybiBpbWFnZUZyb21TZWxlY3Rpb24odGhpcywgZmFsc2Up
OwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgRnJhbWU6OmRhc2hib2FyZFJlZ2lvbnNDaGFu
Z2VkKCkKLXsKLX0KLQogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9icmlk
Z2Uvd2luL0ZyYW1lQ2Fpcm9XaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYnJpZGdlL3dp
bi9GcmFtZUNhaXJvV2luLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvYnJpZGdlL3dpbi9G
cmFtZUNhaXJvV2luLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJGcmFtZVdpbi5oIgorCisjaW5jbHVkZSAi
RWRpdG9yQ2xpZW50LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKwordXNpbmcgc3Rk
OjptaW47CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworSEJJVE1BUCBpbWFnZUZyb21TZWxlY3Rp
b24oRnJhbWUqIGZyYW1lLCBib29sIGZvcmNlQmxhY2tUZXh0KQoreworICAgIG5vdEltcGxlbWVu
dGVkKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6
IFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9i
cmlkZ2Uvd2luL0ZyYW1lV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCisrKyBXZWJDb3JlL2JyaWRn
ZS93aW4vRnJhbWVXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAq
IENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC02MCwxMCArNjAs
NiBAQAogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2luY2x1ZGUgIlNldHRpbmdzLmgi
CiAKLSNpZiBQTEFURk9STShDRykKLSNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ29yZUdyYXBoaWNz
Lmg+Ci0jZW5kaWYKLQogdXNpbmcgc3RkOjptaW47CiB1c2luZyBuYW1lc3BhY2UgS0pTOjpCaW5k
aW5nczsKIApAQCAtODQsNyArODAsNiBAQCBLSlM6OkJpbmRpbmdzOjpJbnN0YW5jZSogRnJhbWU6
OmNyZWF0ZVNjCiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFBsdWdpblZpZXdXaW4qPih3aWRnZXQp
LT5iaW5kaW5nSW5zdGFuY2UoKTsKIH0KIAotCiB2b2lkIGNvbXB1dGVQYWdlUmVjdHNGb3JGcmFt
ZShGcmFtZSogZnJhbWUsIGNvbnN0IEludFJlY3QmIHByaW50UmVjdCwgZmxvYXQgaGVhZGVySGVp
Z2h0LCBmbG9hdCBmb290ZXJIZWlnaHQsIGZsb2F0IHVzZXJTY2FsZUZhY3RvcixWZWN0b3I8SW50
UmVjdD4mIHBhZ2VzLCBpbnQmIG91dFBhZ2VIZWlnaHQpCiB7CiAgICAgQVNTRVJUKGZyYW1lKTsK
QEAgLTEwNywxMSArMTAyLDExIEBAIHZvaWQgY29tcHV0ZVBhZ2VSZWN0c0ZvckZyYW1lKEZyYW1l
KiBmcmEKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICAKLSAgICBmbG9hdCByYXRpbyA9IChm
bG9hdClwcmludFJlY3QuaGVpZ2h0KCkgLyAoZmxvYXQpcHJpbnRSZWN0LndpZHRoKCk7CisgICAg
ZmxvYXQgcmF0aW8gPSBzdGF0aWNfY2FzdDxmbG9hdD4ocHJpbnRSZWN0LmhlaWdodCgpKSAvIHN0
YXRpY19jYXN0PGZsb2F0PihwcmludFJlY3Qud2lkdGgoKSk7CiAgCi0gICAgZmxvYXQgcGFnZVdp
ZHRoICA9IChmbG9hdCkgcm9vdC0+ZG9jV2lkdGgoKTsKKyAgICBmbG9hdCBwYWdlV2lkdGggID0g
c3RhdGljX2Nhc3Q8ZmxvYXQ+KHJvb3QtPmRvY1dpZHRoKCkpOwogICAgIGZsb2F0IHBhZ2VIZWln
aHQgPSBwYWdlV2lkdGggKiByYXRpbzsKLSAgICBvdXRQYWdlSGVpZ2h0ID0gKGludCkgcGFnZUhl
aWdodDsgICAvLyB0aGlzIGlzIHRoZSBoZWlnaHQgb2YgdGhlIHBhZ2UgYWRqdXN0ZWQgYnkgbWFy
Z2lucworICAgIG91dFBhZ2VIZWlnaHQgPSBzdGF0aWNfY2FzdDxpbnQ+KHBhZ2VIZWlnaHQpOyAg
IC8vIHRoaXMgaXMgdGhlIGhlaWdodCBvZiB0aGUgcGFnZSBhZGp1c3RlZCBieSBtYXJnaW5zCiAg
ICAgcGFnZUhlaWdodCAtPSAoaGVhZGVySGVpZ2h0ICsgZm9vdGVySGVpZ2h0KTsKIAogICAgIGlm
IChwYWdlSGVpZ2h0IDw9IDApIHsKQEAgLTEyNiw2MiArMTIxLDE3IEBAIHZvaWQgY29tcHV0ZVBh
Z2VSZWN0c0ZvckZyYW1lKEZyYW1lKiBmcmEKIAogICAgIAogICAgIC8vIGFsd2F5cyByZXR1cm4g
YXQgbGVhc3Qgb25lIHBhZ2UsIHNpbmNlIGVtcHR5IGZpbGVzIHNob3VsZCBwcmludCBhIGJsYW5r
IHBhZ2UKLSAgICBmbG9hdCBwcmludGVkUGFnZXNIZWlnaHQgPSAwLjA7CisgICAgZmxvYXQgcHJp
bnRlZFBhZ2VzSGVpZ2h0ID0gMC4wZjsKICAgICBkbyB7CiAgICAgICAgIGZsb2F0IHByb3Bvc2Vk
Qm90dG9tID0gbWluKGRvY0hlaWdodCwgcHJpbnRlZFBhZ2VzSGVpZ2h0ICsgcGFnZUhlaWdodCk7
CiAgICAgICAgIGZyYW1lLT5hZGp1c3RQYWdlSGVpZ2h0KCZwcm9wb3NlZEJvdHRvbSwgcHJpbnRl
ZFBhZ2VzSGVpZ2h0LCBwcm9wb3NlZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0KTsKICAgICAg
ICAgY3VyclBhZ2VIZWlnaHQgPSBtYXgoMS4wZiwgcHJvcG9zZWRCb3R0b20gLSBwcmludGVkUGFn
ZXNIZWlnaHQpOwogICAgICAgIAotICAgICAgICBwYWdlcy5hcHBlbmQoSW50UmVjdCgwLHByaW50
ZWRQYWdlc0hlaWdodCxjdXJyUGFnZVdpZHRoLGN1cnJQYWdlSGVpZ2h0KSk7CisgICAgICAgIHBh
Z2VzLmFwcGVuZChJbnRSZWN0KDAsIHByaW50ZWRQYWdlc0hlaWdodCwgY3VyclBhZ2VXaWR0aCwg
Y3VyclBhZ2VIZWlnaHQpKTsKICAgICAgICAgcHJpbnRlZFBhZ2VzSGVpZ2h0ICs9IGN1cnJQYWdl
SGVpZ2h0OwogICAgIH0gd2hpbGUgKHByaW50ZWRQYWdlc0hlaWdodCA8IGRvY0hlaWdodCk7CiB9
CiAKLXN0YXRpYyB2b2lkIGRyYXdSZWN0SW50b0NvbnRleHQoSW50UmVjdCByZWN0LCBGcmFtZVZp
ZXcqIHZpZXcsIEdyYXBoaWNzQ29udGV4dCogZ2MpCi17Ci0gICAgSW50U2l6ZSBvZmZzZXQgPSB2
aWV3LT5zY3JvbGxPZmZzZXQoKTsKLSAgICByZWN0Lm1vdmUoLW9mZnNldC53aWR0aCgpLCAtb2Zm
c2V0LmhlaWdodCgpKTsKLSAgICByZWN0ID0gdmlldy0+Y29udmVydFRvQ29udGFpbmluZ1dpbmRv
dyhyZWN0KTsKLQotICAgIGdjLT5jb25jYXRDVE0oQWZmaW5lVHJhbnNmb3JtKCkudHJhbnNsYXRl
KC1yZWN0LngoKSwgLXJlY3QueSgpKSk7Ci0KLSAgICB2aWV3LT5wYWludChnYywgcmVjdCk7Ci19
Ci0KLUhCSVRNQVAgaW1hZ2VGcm9tU2VsZWN0aW9uKEZyYW1lKiBmcmFtZSwgYm9vbCBmb3JjZUJs
YWNrVGV4dCkKLXsKLSAgICBmcmFtZS0+c2V0UGFpbnRSZXN0cmljdGlvbihmb3JjZUJsYWNrVGV4
dCA/IFBhaW50UmVzdHJpY3Rpb25TZWxlY3Rpb25Pbmx5QmxhY2tUZXh0IDogUGFpbnRSZXN0cmlj
dGlvblNlbGVjdGlvbk9ubHkpOwotICAgIEZsb2F0UmVjdCBmciA9IGZyYW1lLT5zZWxlY3Rpb25S
ZWN0KCk7Ci0gICAgSW50UmVjdCBpcigoaW50KWZyLngoKSwgKGludClmci55KCksKGludClmci53
aWR0aCgpLChpbnQpZnIuaGVpZ2h0KCkpOwotCi0gICAgdm9pZCogYml0czsKLSAgICBIREMgaGRj
ID0gQ3JlYXRlQ29tcGF0aWJsZURDKDApOwotICAgIGludCB3ID0gaXIud2lkdGgoKTsKLSAgICBp
bnQgaCA9IGlyLmhlaWdodCgpOwotICAgIEJJVE1BUElORk8gYm1wID0geyB7IHNpemVvZihCSVRN
QVBJTkZPSEVBREVSKSwgdywgaCwgMSwgMzIgfSB9OwotCi0gICAgSEJJVE1BUCBoYm1wID0gQ3Jl
YXRlRElCU2VjdGlvbigwLCAmYm1wLCBESUJfUkdCX0NPTE9SUywgKHZvaWQqKikmYml0cywgMCwg
MCk7Ci0gICAgSEJJVE1BUCBoYm1wT2xkID0gKEhCSVRNQVApU2VsZWN0T2JqZWN0KGhkYywgaGJt
cCk7Ci0gICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURl
dmljZVJHQigpOwotICAgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3Jl
YXRlKCh2b2lkKiliaXRzLCB3LCBoLAotICAgICAgICA4LCB3ICogc2l6ZW9mKFJHQlFVQUQpLCBk
ZXZpY2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwga0NHSW1hZ2VBbHBoYVByZW11
bHRpcGxpZWRGaXJzdCk7Ci0gICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOwotICAg
IENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7Ci0KLSAgICBHcmFwaGljc0NvbnRleHQgZ2Mo
Y29udGV4dCk7Ci0KLSAgICBmcmFtZS0+ZG9jdW1lbnQoKS0+dXBkYXRlTGF5b3V0KCk7Ci0gICAg
ZHJhd1JlY3RJbnRvQ29udGV4dChpciwgZnJhbWUtPnZpZXcoKSwgJmdjKTsKLQotICAgIENHQ29u
dGV4dFJlbGVhc2UoY29udGV4dCk7Ci0gICAgU2VsZWN0T2JqZWN0KGhkYywgaGJtcE9sZCk7Ci0g
ICAgRGVsZXRlREMoaGRjKTsKLQotICAgIGZyYW1lLT5zZXRQYWludFJlc3RyaWN0aW9uKFBhaW50
UmVzdHJpY3Rpb25Ob25lKTsKLQotICAgIHJldHVybiBoYm1wOwotfQotCiBEcmFnSW1hZ2VSZWYg
RnJhbWU6OmRyYWdJbWFnZUZvclNlbGVjdGlvbigpCiB7ICAgIAogICAgIGlmIChzZWxlY3Rpb25D
b250cm9sbGVyKCktPmlzUmFuZ2UoKSkKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
U2ltcGxlRm9udERhdGEuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L1NpbXBsZUZvbnREYXRhLmgJKHJldmlzaW9uIDI5NzI2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9TaW1wbGVGb250RGF0YS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMDMsNiArMTAzLDcg
QEAgcHVibGljOgogICAgIFNDUklQVF9DQUNIRSogc2NyaXB0Q2FjaGUoKSBjb25zdCB7IHJldHVy
biAmbV9zY3JpcHRDYWNoZTsgfQogCiAgICAgc3RhdGljIHZvaWQgc2V0U2hvdWxkQXBwbHlNYWNB
c2NlbnRIYWNrKGJvb2wpOworICAgIHN0YXRpYyBib29sIHNob3VsZEFwcGx5TWFjQXNjZW50SGFj
aygpOwogI2VuZGlmCiAKICNpZiBQTEFURk9STShHVEspCkluZGV4OiBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4dENhaXJvLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4dENhaXJvLmNwcAko
cmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBo
aWNzQ29udGV4dENhaXJvLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDEsMTUgKzQxLDEzIEBACiAj
aW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgogCi0jaWYgUExB
VEZPUk0oV0lOKQotI2luY2x1ZGUgPGNhaXJvLXdpbjMyLmg+Ci0jZW5kaWYKLQogI2lmIFBMQVRG
T1JNKEdUSykKICNpbmNsdWRlIDxnZGsvZ2RrLmg+CiAjaW5jbHVkZSA8cGFuZ28vcGFuZ28uaD4K
KyNlbGlmIFBMQVRGT1JNKFdJTikKKyNpbmNsdWRlIDxjYWlyby13aW4zMi5oPgogI2VuZGlmCi0K
KyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUuaCIKIAogI2lmbmRlZiBN
X1BJCiAjZGVmaW5lIE1fUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgpAQCAtNTcsMTkgKzU1LDYg
QEAKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1jbGFzcyBHcmFwaGljc0NvbnRleHRQbGF0Zm9y
bVByaXZhdGUgewotcHVibGljOgotICAgIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSgp
OwotICAgIH5HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKTsKLQotICAgIGNhaXJvX3Qq
IGNyOwotICAgIFZlY3RvcjxmbG9hdD4gbGF5ZXJzOwotCi0jaWYgUExBVEZPUk0oR1RLKQotICAg
IEdka0V2ZW50RXhwb3NlKiBleHBvc2U7Ci0jZW5kaWYKLX07Ci0KIHN0YXRpYyBpbmxpbmUgdm9p
ZCBzZXRDb2xvcihjYWlyb190KiBjciwgY29uc3QgQ29sb3ImIGNvbCkKIHsKICAgICBmbG9hdCBy
ZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKQEAgLTg2LDM0ICs3MSw2IEBAIHN0YXRpYyBpbmxpbmUg
dm9pZCBmaWxsUmVjdFNvdXJjZU92ZXIoY2EKICAgICBjYWlyb19maWxsKGNyKTsKIH0KIAotR3Jh
cGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZh
dGUoKQotICAgIDogIGNyKDApCi0jaWYgUExBVEZPUk0oR1RLKQotICAgICwgZXhwb3NlKDApCi0j
ZW5kaWYKLXsKLX0KLQotR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjp+R3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlKCkKLXsKLSAgICBjYWlyb19kZXN0cm95KGNyKTsKLX0KLQot
I2lmIFBMQVRGT1JNKFdJTikKLUdyYXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0KEhEQyBk
YykKLSAgICA6IG1fY29tbW9uKGNyZWF0ZUdyYXBoaWNzQ29udGV4dFByaXZhdGUoKSkKLSAgICAs
IG1fZGF0YShuZXcgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKQotewotICAgIGlmIChk
YykgewotICAgICAgICBjYWlyb19zdXJmYWNlX3QqIHN1cmZhY2UgPSBjYWlyb193aW4zMl9zdXJm
YWNlX2NyZWF0ZShkYyk7Ci0gICAgICAgIG1fZGF0YS0+Y3IgPSBjYWlyb19jcmVhdGUoc3VyZmFj
ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2V0UGFpbnRpbmdEaXNhYmxlZCh0cnVlKTsKLSAg
ICAgICAgbV9kYXRhLT5jciA9IDA7Ci0gICAgfQotfQotI2VuZGlmCi0KIEdyYXBoaWNzQ29udGV4
dDo6R3JhcGhpY3NDb250ZXh0KFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiBjcikKICAgICA6IG1f
Y29tbW9uKGNyZWF0ZUdyYXBoaWNzQ29udGV4dFByaXZhdGUoKSkKICAgICAsIG1fZGF0YShuZXcg
R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKQpAQCAtNTc3LDYgKzUzNCw5IEBAIHZvaWQg
R3JhcGhpY3NDb250ZXh0OjpzZXRVUkxGb3JSZWN0KGNvbnMKICAgICBub3RJbXBsZW1lbnRlZCgp
OwogfQogCisjaWYgUExBVEZPUk0oR1RLKQorLy8gRklYTUU6ICBUaGlzIHNob3VsZCBiZSBtb3Zl
ZCB0byBzb21ldGhpbmcgbGlrZSBHcmFwaGljc0NvbnRleHRDYWlyb0dUSy5jcHAsCisvLyBhcyB0
aGVyZSBpcyBhIFdpbmRvd3MgaW1wbGVtZW50YXRpb24gaW4gcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0dyYXBoaWNzQ29udGV4dENhaXJvV2luLmNwcAogdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNvbmNh
dENUTShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSkKIHsKICAgICBpZiAocGFpbnRp
bmdEaXNhYmxlZCgpKQpAQCAtNTg2LDYgKzU0Niw3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0Ojpj
b25jYXRDVE0oY29uc3QgQWYKICAgICBjb25zdCBjYWlyb19tYXRyaXhfdCogbWF0cml4ID0gcmVp
bnRlcnByZXRfY2FzdDxjb25zdCBjYWlyb19tYXRyaXhfdCo+KCZ0cmFuc2Zvcm0pOwogICAgIGNh
aXJvX3RyYW5zZm9ybShjciwgbWF0cml4KTsKIH0KKyNlbmRpZgogCiB2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6YWRkSW5uZXJSb3VuZGVkUmVjdENsaXAoY29uc3QgSW50UmVjdCYgcmVjdCwgaW50IHRo
aWNrbmVzcykKIHsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhp
Y3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9jYWlyby9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUuaAkocmV2aXNp
b24gMjk3MjYpCShmcm9tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhpY3ND
b250ZXh0Q2Fpcm8uY3BwOjI5NzI2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWly
by9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUuaAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDkyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5j
LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBBbHAgVG9rZXIg
PGFscEBhdG9rZXIuY29tPgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
R3JhcGhpY3NDb250ZXh0LmgiCisKKyNpZiBQTEFURk9STShDQUlSTykKKworI2luY2x1ZGUgIkNh
aXJvUGF0aC5oIgorI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUgIkZvbnQuaCIKKyNp
bmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRl
ICJQYXRoLmgiCisjaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIKKyNpbmNsdWRlIDxjYWlyby5o
PgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHd0Zi9N
YXRoRXh0cmFzLmg+CisKKyNpZiBQTEFURk9STShXSU4pCisjaW5jbHVkZSA8Y2Fpcm8td2luMzIu
aD4KKyNlbmRpZgorCisjaWYgUExBVEZPUk0oR1RLKQorI2luY2x1ZGUgPGdkay9nZGsuaD4KKyNp
bmNsdWRlIDxwYW5nby9wYW5nby5oPgorI2VuZGlmCisKKworI2lmbmRlZiBNX1BJCisjZGVmaW5l
IE1fUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgorI2VuZGlmCisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworY2xhc3MgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlIHsKK3B1YmxpYzoKKyAg
ICBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKTsKKyAgICB+R3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlKCk7CisKKyAgICBjYWlyb190KiBjcjsKKyAgICBWZWN0b3I8ZmxvYXQ+
IGxheWVyczsKKworI2lmIFBMQVRGT1JNKEdUSykKKyAgICBHZGtFdmVudEV4cG9zZSogZXhwb3Nl
OworI2VuZGlmCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0Q29sb3IoY2Fpcm9fdCogY3Is
IGNvbnN0IENvbG9yJiBjb2wpCit7CisgICAgZmxvYXQgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGE7
CisgICAgY29sLmdldFJHQkEocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworICAgIGNhaXJvX3Nl
dF9zb3VyY2VfcmdiYShjciwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworfQorCisvLyBBIGZp
bGxSZWN0IGhlbHBlcgorc3RhdGljIGlubGluZSB2b2lkIGZpbGxSZWN0U291cmNlT3ZlcihjYWly
b190KiBjciwgY29uc3QgRmxvYXRSZWN0JiByZWN0LCBjb25zdCBDb2xvciYgY29sKQoreworICAg
IHNldENvbG9yKGNyLCBjb2wpOworICAgIGNhaXJvX3JlY3RhbmdsZShjciwgcmVjdC54KCksIHJl
Y3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOworICAgIGNhaXJvX3NldF9vcGVy
YXRvcihjciwgQ0FJUk9fT1BFUkFUT1JfT1ZFUik7CisgICAgY2Fpcm9fZmlsbChjcik7Cit9CisK
K0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlKCkKKyAgICA6ICBjcigwKQorI2lmIFBMQVRGT1JNKEdUSykKKyAgICAsIGV4cG9zZSgw
KQorI2VuZGlmCit7Cit9CisKK0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6fkdyYXBo
aWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpCit7CisgICAgY2Fpcm9fZGVzdHJveShjcik7Cit9
CisKKyNpZiBQTEFURk9STShXSU4pCitHcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dChI
REMgZGMpCisgICAgOiBtX2NvbW1vbihjcmVhdGVHcmFwaGljc0NvbnRleHRQcml2YXRlKCkpCisg
ICAgLCBtX2RhdGEobmV3IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSkKK3sKKyAgICBp
ZiAoZGMpIHsKKyAgICAgICAgY2Fpcm9fc3VyZmFjZV90KiBzdXJmYWNlID0gY2Fpcm9fd2luMzJf
c3VyZmFjZV9jcmVhdGUoZGMpOworICAgICAgICBtX2RhdGEtPmNyID0gY2Fpcm9fY3JlYXRlKHN1
cmZhY2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNldFBhaW50aW5nRGlzYWJsZWQodHJ1ZSk7
CisgICAgICAgIG1fZGF0YS0+Y3IgPSAwOworICAgIH0KK30KKyNlbmRpZgorCitHcmFwaGljc0Nv
bnRleHQ6OkdyYXBoaWNzQ29udGV4dChQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCogY3IpCisgICAg
OiBtX2NvbW1vbihjcmVhdGVHcmFwaGljc0NvbnRleHRQcml2YXRlKCkpCisgICAgLCBtX2RhdGEo
bmV3IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSkKK3sKKyAgICBtX2RhdGEtPmNyID0g
Y2Fpcm9fcmVmZXJlbmNlKGNyKTsKKyAgICBzZXRQYWludGluZ0Rpc2FibGVkKCFjcik7Cit9CisK
K0dyYXBoaWNzQ29udGV4dDo6fkdyYXBoaWNzQ29udGV4dCgpCit7CisgICAgZGVzdHJveUdyYXBo
aWNzQ29udGV4dFByaXZhdGUobV9jb21tb24pOworICAgIGRlbGV0ZSBtX2RhdGE7Cit9CisKK2Nh
aXJvX3QqIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1Db250ZXh0KCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gbV9kYXRhLT5jcjsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNhdmVQbGF0Zm9y
bVN0YXRlKCkKK3sKKyAgICBjYWlyb19zYXZlKG1fZGF0YS0+Y3IpOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDo6cmVzdG9yZVBsYXRmb3JtU3RhdGUoKQoreworICAgIGNhaXJvX3Jlc3RvcmUo
bV9kYXRhLT5jcik7Cit9CisKKy8vIERyYXdzIGEgZmlsbGVkIHJlY3RhbmdsZSB3aXRoIGEgc3Ry
b2tlZCBib3JkZXIuCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd1JlY3QoY29uc3QgSW50UmVj
dCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgY2Fpcm9fc2F2ZShjcik7CisK
KyAgICBpZiAoZmlsbENvbG9yKCkuYWxwaGEoKSkKKyAgICAgICAgZmlsbFJlY3RTb3VyY2VPdmVy
KGNyLCByZWN0LCBmaWxsQ29sb3IoKSk7CisKKyAgICBpZiAoc3Ryb2tlU3R5bGUoKSAhPSBOb1N0
cm9rZSkgeworICAgICAgICBzZXRDb2xvcihjciwgc3Ryb2tlQ29sb3IoKSk7CisgICAgICAgIEZs
b2F0UmVjdCByKHJlY3QpOworICAgICAgICByLmluZmxhdGUoLS41Zik7CisgICAgICAgIGNhaXJv
X3JlY3RhbmdsZShjciwgci54KCksIHIueSgpLCByLndpZHRoKCksIHIuaGVpZ2h0KCkpOworICAg
ICAgICBjYWlyb19zZXRfbGluZV93aWR0aChjciwgMS4wKTsKKyAgICAgICAgY2Fpcm9fc3Ryb2tl
KGNyKTsKKyAgICB9CisKKyAgICBjYWlyb19yZXN0b3JlKGNyKTsKK30KKworLy8gRklYTUU6IE5v
dyB0aGF0IHRoaXMgaXMgcmVmYWN0b3JlZCwgaXQgc2hvdWxkIGJlIHNoYXJlZCBieSBhbGwgY29u
dGV4dHMuCitzdGF0aWMgdm9pZCBhZGp1c3RMaW5lVG9QaXhlbEJvdW5kYXJpZXMoRmxvYXRQb2lu
dCYgcDEsIEZsb2F0UG9pbnQmIHAyLCBmbG9hdCBzdHJva2VXaWR0aCwgU3Ryb2tlU3R5bGUgc3R5
bGUpCit7CisgICAgLy8gRm9yIG9kZCB3aWR0aHMsIHdlIGFkZCBpbiAwLjUgdG8gdGhlIGFwcHJv
cHJpYXRlIHgveSBzbyB0aGF0IHRoZSBmbG9hdCBhcml0aG1ldGljCisgICAgLy8gd29ya3Mgb3V0
LiAgRm9yIGV4YW1wbGUsIHdpdGggYSBib3JkZXIgd2lkdGggb2YgMywgS0hUTUwgd2lsbCBwYXNz
IHVzICh5MSt5MikvMiwgZS5nLiwKKyAgICAvLyAoNTArNTMpLzIgPSAxMDMvMiA9IDUxIHdoZW4g
d2Ugd2FudCA1MS41LiAgSXQgaXMgYWx3YXlzIHRydWUgdGhhdCBhbiBldmVuIHdpZHRoIGdhdmUK
KyAgICAvLyB1cyBhIHBlcmZlY3QgcG9zaXRpb24sIGJ1dCBhbiBvZGQgd2lkdGggZ2F2ZSB1cyBh
IHBvc2l0aW9uIHRoYXQgaXMgb2ZmIGJ5IGV4YWN0bHkgMC41LgorICAgIGlmIChzdHlsZSA9PSBE
b3R0ZWRTdHJva2UgfHwgc3R5bGUgPT0gRGFzaGVkU3Ryb2tlKSB7CisgICAgICAgIGlmIChwMS54
KCkgPT0gcDIueCgpKSB7CisgICAgICAgICAgICBwMS5zZXRZKHAxLnkoKSArIHN0cm9rZVdpZHRo
KTsKKyAgICAgICAgICAgIHAyLnNldFkocDIueSgpIC0gc3Ryb2tlV2lkdGgpOworICAgICAgICB9
CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcDEuc2V0WChwMS54KCkgKyBzdHJva2VXaWR0
aCk7CisgICAgICAgICAgICBwMi5zZXRYKHAyLngoKSAtIHN0cm9rZVdpZHRoKTsKKyAgICAgICAg
fQorICAgIH0KKworICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KHN0cm9rZVdpZHRoKSAlIDIpIHsK
KyAgICAgICAgaWYgKHAxLngoKSA9PSBwMi54KCkpIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIGEg
dmVydGljYWwgbGluZS4gIEFkanVzdCBvdXIgeC4KKyAgICAgICAgICAgIHAxLnNldFgocDEueCgp
ICsgMC41KTsKKyAgICAgICAgICAgIHAyLnNldFgocDIueCgpICsgMC41KTsKKyAgICAgICAgfQor
ICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIGEgaG9yaXpvbnRhbCBsaW5lLiBB
ZGp1c3Qgb3VyIHkuCisgICAgICAgICAgICBwMS5zZXRZKHAxLnkoKSArIDAuNSk7CisgICAgICAg
ICAgICBwMi5zZXRZKHAyLnkoKSArIDAuNSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIFRo
aXMgaXMgb25seSB1c2VkIHRvIGRyYXcgYm9yZGVycy4KK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpk
cmF3TGluZShjb25zdCBJbnRQb2ludCYgcG9pbnQxLCBjb25zdCBJbnRQb2ludCYgcG9pbnQyKQor
eworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIFN0
cm9rZVN0eWxlIHN0eWxlID0gc3Ryb2tlU3R5bGUoKTsKKyAgICBpZiAoc3R5bGUgPT0gTm9TdHJv
a2UpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAg
ICBjYWlyb19zYXZlKGNyKTsKKworICAgIGZsb2F0IHdpZHRoID0gc3Ryb2tlVGhpY2tuZXNzKCk7
CisgICAgaWYgKHdpZHRoIDwgMSkKKyAgICAgICAgd2lkdGggPSAxOworCisgICAgRmxvYXRQb2lu
dCBwMSA9IHBvaW50MTsKKyAgICBGbG9hdFBvaW50IHAyID0gcG9pbnQyOworICAgIGJvb2wgaXNW
ZXJ0aWNhbExpbmUgPSAocDEueCgpID09IHAyLngoKSk7CisgCisgICAgYWRqdXN0TGluZVRvUGl4
ZWxCb3VuZGFyaWVzKHAxLCBwMiwgd2lkdGgsIHN0eWxlKTsKKyAgICBjYWlyb19zZXRfbGluZV93
aWR0aChjciwgd2lkdGgpOworCisgICAgaW50IHBhdFdpZHRoID0gMDsKKyAgICBzd2l0Y2ggKHN0
eWxlKSB7CisgICAgY2FzZSBOb1N0cm9rZToKKyAgICBjYXNlIFNvbGlkU3Ryb2tlOgorICAgICAg
ICBicmVhazsKKyAgICBjYXNlIERvdHRlZFN0cm9rZToKKyAgICAgICAgcGF0V2lkdGggPSBzdGF0
aWNfY2FzdDxpbnQ+KHdpZHRoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEYXNoZWRTdHJv
a2U6CisgICAgICAgIHBhdFdpZHRoID0gMypzdGF0aWNfY2FzdDxpbnQ+KHdpZHRoKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgfQorCisgICAgc2V0Q29sb3IoY3IsIHN0cm9rZUNvbG9yKCkpOworCisg
ICAgY2Fpcm9fc2V0X2FudGlhbGlhcyhjciwgQ0FJUk9fQU5USUFMSUFTX05PTkUpOworCisgICAg
aWYgKHBhdFdpZHRoKSB7CisgICAgICAgIC8vIERvIGEgcmVjdCBmaWxsIG9mIG91ciBlbmRwb2lu
dHMuICBUaGlzIGVuc3VyZXMgd2UgYWx3YXlzIGhhdmUgdGhlCisgICAgICAgIC8vIGFwcGVhcmFu
Y2Ugb2YgYmVpbmcgYSBib3JkZXIuICBXZSB0aGVuIGRyYXcgdGhlIGFjdHVhbCBkb3R0ZWQvZGFz
aGVkIGxpbmUuCisgICAgICAgIGlmIChpc1ZlcnRpY2FsTGluZSkgeworICAgICAgICAgICAgZmls
bFJlY3RTb3VyY2VPdmVyKGNyLCBGbG9hdFJlY3QocDEueCgpIC0gd2lkdGgvMiwgcDEueSgpIC0g
d2lkdGgsIHdpZHRoLCB3aWR0aCksIHN0cm9rZUNvbG9yKCkpOworICAgICAgICAgICAgZmlsbFJl
Y3RTb3VyY2VPdmVyKGNyLCBGbG9hdFJlY3QocDIueCgpIC0gd2lkdGgvMiwgcDIueSgpLCB3aWR0
aCwgd2lkdGgpLCBzdHJva2VDb2xvcigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
IGZpbGxSZWN0U291cmNlT3ZlcihjciwgRmxvYXRSZWN0KHAxLngoKSAtIHdpZHRoLCBwMS55KCkg
LSB3aWR0aC8yLCB3aWR0aCwgd2lkdGgpLCBzdHJva2VDb2xvcigpKTsKKyAgICAgICAgICAgIGZp
bGxSZWN0U291cmNlT3ZlcihjciwgRmxvYXRSZWN0KHAyLngoKSwgcDIueSgpIC0gd2lkdGgvMiwg
d2lkdGgsIHdpZHRoKSwgc3Ryb2tlQ29sb3IoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBF
eGFtcGxlOiA4MCBwaXhlbHMgd2l0aCBhIHdpZHRoIG9mIDMwIHBpeGVscy4KKyAgICAgICAgLy8g
UmVtYWluZGVyIGlzIDIwLiAgVGhlIG1heGltdW0gcGl4ZWxzIG9mIGxpbmUgd2UgY291bGQgcGFp
bnQKKyAgICAgICAgLy8gd2lsbCBiZSA1MCBwaXhlbHMuCisgICAgICAgIGludCBkaXN0YW5jZSA9
IChpc1ZlcnRpY2FsTGluZSA/IChwb2ludDIueSgpIC0gcG9pbnQxLnkoKSkgOiAocG9pbnQyLngo
KSAtIHBvaW50MS54KCkpKSAtIDIqc3RhdGljX2Nhc3Q8aW50Pih3aWR0aCk7CisgICAgICAgIGlu
dCByZW1haW5kZXIgPSBkaXN0YW5jZSVwYXRXaWR0aDsKKyAgICAgICAgaW50IGNvdmVyYWdlID0g
ZGlzdGFuY2UtcmVtYWluZGVyOworICAgICAgICBpbnQgbnVtU2VnbWVudHMgPSBjb3ZlcmFnZS9w
YXRXaWR0aDsKKworICAgICAgICBmbG9hdCBwYXR0ZXJuT2Zmc2V0ID0gMDsKKyAgICAgICAgLy8g
U3BlY2lhbCBjYXNlIDFweCBkb3R0ZWQgYm9yZGVycyBmb3Igc3BlZWQuCisgICAgICAgIGlmIChw
YXRXaWR0aCA9PSAxKQorICAgICAgICAgICAgcGF0dGVybk9mZnNldCA9IDEuMDsKKyAgICAgICAg
ZWxzZSB7CisgICAgICAgICAgICBib29sIGV2ZW5OdW1iZXJPZlNlZ21lbnRzID0gbnVtU2VnbWVu
dHMlMiA9PSAwOworICAgICAgICAgICAgaWYgKHJlbWFpbmRlcikKKyAgICAgICAgICAgICAgICBl
dmVuTnVtYmVyT2ZTZWdtZW50cyA9ICFldmVuTnVtYmVyT2ZTZWdtZW50czsKKyAgICAgICAgICAg
IGlmIChldmVuTnVtYmVyT2ZTZWdtZW50cykgeworICAgICAgICAgICAgICAgIGlmIChyZW1haW5k
ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0dGVybk9mZnNldCArPSBwYXRXaWR0aCAtIHJl
bWFpbmRlcjsKKyAgICAgICAgICAgICAgICAgICAgcGF0dGVybk9mZnNldCArPSByZW1haW5kZXIv
MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAg
ICAgICAgICBwYXR0ZXJuT2Zmc2V0ID0gcGF0V2lkdGgvMjsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGVsc2UgaWYgKCFldmVuTnVtYmVyT2ZTZWdtZW50cykgeworICAgICAgICAgICAgICAg
IGlmIChyZW1haW5kZXIpCisgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5PZmZzZXQgPSAocGF0
V2lkdGggLSByZW1haW5kZXIpLzI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAg
ICBkb3VibGUgZGFzaCA9IHBhdFdpZHRoOworICAgICAgICBjYWlyb19zZXRfZGFzaChjciwgJmRh
c2gsIDEsIHBhdHRlcm5PZmZzZXQpOworICAgIH0KKworICAgIGNhaXJvX21vdmVfdG8oY3IsIHAx
LngoKSwgcDEueSgpKTsKKyAgICBjYWlyb19saW5lX3RvKGNyLCBwMi54KCksIHAyLnkoKSk7CisK
KyAgICBjYWlyb19zdHJva2UoY3IpOworICAgIGNhaXJvX3Jlc3RvcmUoY3IpOworfQorCisvLyBU
aGlzIG1ldGhvZCBpcyBvbmx5IHVzZWQgdG8gZHJhdyB0aGUgbGl0dGxlIGNpcmNsZXMgdXNlZCBp
biBsaXN0cy4KK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3RWxsaXBzZShjb25zdCBJbnRSZWN0
JiByZWN0KQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsK
KworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb19zYXZlKGNyKTsKKyAg
ICBmbG9hdCB5UmFkaXVzID0gLjUgKiByZWN0LmhlaWdodCgpOworICAgIGZsb2F0IHhSYWRpdXMg
PSAuNSAqIHJlY3Qud2lkdGgoKTsKKyAgICBjYWlyb190cmFuc2xhdGUoY3IsIHJlY3QueCgpICsg
eFJhZGl1cywgcmVjdC55KCkgKyB5UmFkaXVzKTsKKyAgICBjYWlyb19zY2FsZShjciwgeFJhZGl1
cywgeVJhZGl1cyk7CisgICAgY2Fpcm9fYXJjKGNyLCAwLiwgMC4sIDEuLCAwLiwgMiAqIE1fUEkp
OworICAgIGNhaXJvX3Jlc3RvcmUoY3IpOworCisgICAgaWYgKGZpbGxDb2xvcigpLmFscGhhKCkp
IHsKKyAgICAgICAgc2V0Q29sb3IoY3IsIGZpbGxDb2xvcigpKTsKKyAgICAgICAgY2Fpcm9fZmls
bF9wcmVzZXJ2ZShjcik7CisgICAgfQorCisgICAgaWYgKHN0cm9rZVN0eWxlKCkgIT0gTm9TdHJv
a2UpIHsKKyAgICAgICAgc2V0Q29sb3IoY3IsIHN0cm9rZUNvbG9yKCkpOworICAgICAgICBjYWly
b19zZXRfbGluZV93aWR0aChjciwgc3Ryb2tlVGhpY2tuZXNzKCkpOworICAgICAgICBjYWlyb19z
dHJva2UoY3IpOworICAgIH0KKworICAgIGNhaXJvX25ld19wYXRoKGNyKTsKK30KKworLy8gRklY
TUU6IFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgYWRqdXN0ZWQgdG8gbWF0Y2ggdGhlIGZ1bmN0
aW9uYWxpdHkgb24gdGhlIE1hYyBzaWRlLgordm9pZCBHcmFwaGljc0NvbnRleHQ6OnN0cm9rZUFy
Yyhjb25zdCBJbnRSZWN0JiByZWN0LCBpbnQgc3RhcnRBbmdsZSwgaW50IGFuZ2xlU3BhbikKK3sK
KyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAo
c3Ryb2tlU3R5bGUoKSA9PSBOb1N0cm9rZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaW50IHgg
PSByZWN0LngoKTsKKyAgICBpbnQgeSA9IHJlY3QueSgpOworICAgIGZsb2F0IHcgPSByZWN0Lndp
ZHRoKCk7CisjaWYgMCAvLyBGSVhNRTogdW51c2VkIHNvIGZhcgorICAgIGZsb2F0IGggPSByZWN0
LmhlaWdodCgpOworICAgIGZsb2F0IHNjYWxlRmFjdG9yID0gaCAvIHc7CisgICAgZmxvYXQgcmV2
ZXJzZVNjYWxlRmFjdG9yID0gdyAvIGg7CisjZW5kaWYKKyAgICBmbG9hdCByID0gdyAvIDI7Cisg
ICAgZmxvYXQgZmEgPSBzdGFydEFuZ2xlOworICAgIGZsb2F0IGZhbGVuID0gIGZhICsgYW5nbGVT
cGFuOworCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOworICAgIGNhaXJvX3NhdmUoY3Ip
OworICAgIGNhaXJvX2FyY19uZWdhdGl2ZShjciwgeCArIHIsIHkgKyByLCByLCAtZmEgKiBNX1BJ
LzE4MCwgLWZhbGVuICogTV9QSS8xODApOworICAgIHNldENvbG9yKGNyLCBzdHJva2VDb2xvcigp
KTsKKyAgICBjYWlyb19zZXRfbGluZV93aWR0aChjciwgc3Ryb2tlVGhpY2tuZXNzKCkpOworICAg
IGNhaXJvX3N0cm9rZShjcik7CisgICAgY2Fpcm9fcmVzdG9yZShjcik7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpkcmF3Q29udmV4UG9seWdvbihzaXplX3QgbnBvaW50cywgY29uc3QgRmxv
YXRQb2ludCogcG9pbnRzLCBib29sIHNob3VsZEFudGlhbGlhcykKK3sKKyAgICBpZiAocGFpbnRp
bmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAobnBvaW50cyA8PSAxKQor
ICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisKKyAgICBj
YWlyb19zYXZlKGNyKTsKKyAgICBjYWlyb19zZXRfYW50aWFsaWFzKGNyLCBzaG91bGRBbnRpYWxp
YXMgPyBDQUlST19BTlRJQUxJQVNfREVGQVVMVCA6IENBSVJPX0FOVElBTElBU19OT05FKTsKKyAg
ICBjYWlyb19tb3ZlX3RvKGNyLCBwb2ludHNbMF0ueCgpLCBwb2ludHNbMF0ueSgpKTsKKyAgICBm
b3IgKHNpemVfdCBpID0gMTsgaSA8IG5wb2ludHM7IGkrKykKKyAgICAgICAgY2Fpcm9fbGluZV90
byhjciwgcG9pbnRzW2ldLngoKSwgcG9pbnRzW2ldLnkoKSk7CisgICAgY2Fpcm9fY2xvc2VfcGF0
aChjcik7CisKKyAgICBpZiAoZmlsbENvbG9yKCkuYWxwaGEoKSkgeworICAgICAgICBzZXRDb2xv
cihjciwgZmlsbENvbG9yKCkpOworICAgICAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNyLCBDQUlS
T19GSUxMX1JVTEVfRVZFTl9PREQpOworICAgICAgICBjYWlyb19maWxsX3ByZXNlcnZlKGNyKTsK
KyAgICB9CisKKyAgICBpZiAoc3Ryb2tlU3R5bGUoKSAhPSBOb1N0cm9rZSkgeworICAgICAgICBz
ZXRDb2xvcihjciwgc3Ryb2tlQ29sb3IoKSk7CisgICAgICAgIGNhaXJvX3NldF9saW5lX3dpZHRo
KGNyLCBzdHJva2VUaGlja25lc3MoKSk7CisgICAgICAgIGNhaXJvX3N0cm9rZShjcik7CisgICAg
fQorCisgICAgY2Fpcm9fbmV3X3BhdGgoY3IpOworICAgIGNhaXJvX3Jlc3RvcmUoY3IpOworfQor
Cit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJlY3QoY29uc3QgSW50UmVjdCYgcmVjdCwgY29u
c3QgQ29sb3ImIGNvbG9yKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAg
IHJldHVybjsKKworICAgIGlmIChjb2xvci5hbHBoYSgpKQorICAgICAgICBmaWxsUmVjdFNvdXJj
ZU92ZXIobV9kYXRhLT5jciwgcmVjdCwgY29sb3IpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dDo6ZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0LCBjb25zdCBDb2xvciYgY29sb3IpCit7
CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYg
KGNvbG9yLmFscGhhKCkpCisgICAgICAgIGZpbGxSZWN0U291cmNlT3ZlcihtX2RhdGEtPmNyLCBy
ZWN0LCBjb2xvcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwKGNvbnN0IEludFJl
Y3QmIHJlY3QpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOworICAgIGNhaXJvX3JlY3RhbmdsZShj
ciwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOworICAg
IGNhaXJvX2ZpbGxfcnVsZV90IHNhdmVkRmlsbFJ1bGUgPSBjYWlyb19nZXRfZmlsbF9ydWxlKGNy
KTsKKyAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNyLCBDQUlST19GSUxMX1JVTEVfV0lORElORyk7
CisgICAgY2Fpcm9fY2xpcChjcik7CisgICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgc2F2ZWRG
aWxsUnVsZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3Rm9jdXNSaW5nKGNvbnN0
IENvbG9yJiBjb2xvcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBpbnQgcmFkaXVzID0gKGZvY3VzUmluZ1dpZHRoKCkgLSAxKSAvIDI7Cisg
ICAgaW50IG9mZnNldCA9IHJhZGl1cyArIGZvY3VzUmluZ09mZnNldCgpOworCisgICAgY29uc3Qg
VmVjdG9yPEludFJlY3Q+JiByZWN0cyA9IGZvY3VzUmluZ1JlY3RzKCk7CisgICAgdW5zaWduZWQg
cmVjdENvdW50ID0gcmVjdHMuc2l6ZSgpOworICAgIEludFJlY3QgZmluYWxGb2N1c1JlY3Q7Cisg
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlY3RDb3VudDsgaSsrKSB7CisgICAgICAgIElu
dFJlY3QgZm9jdXNSZWN0ID0gcmVjdHNbaV07CisgICAgICAgIGZvY3VzUmVjdC5pbmZsYXRlKG9m
ZnNldCk7CisgICAgICAgIGZpbmFsRm9jdXNSZWN0LnVuaXRlKGZvY3VzUmVjdCk7CisgICAgfQor
CisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOworICAgIGNhaXJvX3NhdmUoY3IpOworICAg
IC8vIEZJWE1FOiBUaGVzZSByZWN0cyBzaG91bGQgYmUgcm91bmRlZAorICAgIGNhaXJvX3JlY3Rh
bmdsZShjciwgZmluYWxGb2N1c1JlY3QueCgpLCBmaW5hbEZvY3VzUmVjdC55KCksIGZpbmFsRm9j
dXNSZWN0LndpZHRoKCksIGZpbmFsRm9jdXNSZWN0LmhlaWdodCgpKTsKKworICAgIC8vIEZvcmNl
IHRoZSBhbHBoYSB0byA1MCUuICBUaGlzIG1hdGNoZXMgd2hhdCB0aGUgTWFjIGRvZXMgd2l0aCBv
dXRsaW5lIHJpbmdzLgorICAgIENvbG9yIHJpbmdDb2xvcihjb2xvci5yZWQoKSwgY29sb3IuZ3Jl
ZW4oKSwgY29sb3IuYmx1ZSgpLCAxMjcpOworICAgIHNldENvbG9yKGNyLCByaW5nQ29sb3IpOwor
ICAgIGNhaXJvX3N0cm9rZShjcik7CisgICAgY2Fpcm9fcmVzdG9yZShjcik7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvclRleHQoY29uc3QgSW50UG9pbnQmIG9yaWdpbiwg
aW50IHdpZHRoLCBib29sIHByaW50aW5nKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkp
CisgICAgICAgIHJldHVybjsKKworICAgIC8vIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBodHRw
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTY1OQorICAgIFN0cm9rZVN0eWxl
IHNhdmVkU3Ryb2tlU3R5bGUgPSBzdHJva2VTdHlsZSgpOworICAgIHNldFN0cm9rZVN0eWxlKFNv
bGlkU3Ryb2tlKTsKKworICAgIEludFBvaW50IGVuZFBvaW50ID0gb3JpZ2luICsgSW50U2l6ZSh3
aWR0aCwgMCk7CisgICAgZHJhd0xpbmUob3JpZ2luLCBlbmRQb2ludCk7CisKKyAgICBzZXRTdHJv
a2VTdHlsZShzYXZlZFN0cm9rZVN0eWxlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRy
YXdMaW5lRm9yTWlzc3BlbGxpbmdPckJhZEdyYW1tYXIoY29uc3QgSW50UG9pbnQmIG9yaWdpbiwg
aW50IHdpZHRoLCBib29sIGdyYW1tYXIpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkK
KyAgICAgICAgcmV0dXJuOworCisjaWYgUExBVEZPUk0oR1RLKQorICAgIGNhaXJvX3QqIGNyID0g
bV9kYXRhLT5jcjsKKyAgICBjYWlyb19zYXZlKGNyKTsKKworICAgIC8vIENvbnZlbnRpb24gaXMg
Z3JlZW4gZm9yIGdyYW1tYXIsIHJlZCBmb3Igc3BlbGxpbmcKKyAgICAvLyBUaGVzZSBuZWVkIHRv
IGJlY29tZSBjb25maWd1cmFibGUKKyAgICBpZiAoZ3JhbW1hcikKKyAgICAgICAgY2Fpcm9fc2V0
X3NvdXJjZV9yZ2IoY3IsIDAsIDEsIDApOworICAgIGVsc2UKKyAgICAgICAgY2Fpcm9fc2V0X3Nv
dXJjZV9yZ2IoY3IsIDEsIDAsIDApOworCisgICAgLy8gV2UgaWdub3JlIG1vc3Qgb2YgdGhlIHBy
b3ZpZGVkIGNvbnN0YW50cyBpbiBmYXZvdXIgb2YgdGhlIHBsYXRmb3JtIHN0eWxlCisgICAgcGFu
Z29fY2Fpcm9fc2hvd19lcnJvcl91bmRlcmxpbmUoY3IsIG9yaWdpbi54KCksIG9yaWdpbi55KCks
IHdpZHRoLCBjTWlzc3BlbGxpbmdMaW5lVGhpY2tuZXNzKTsKKworICAgIGNhaXJvX3Jlc3RvcmUo
Y3IpOworI2Vsc2UKKyAgICBub3RJbXBsZW1lbnRlZCgpOworI2VuZGlmCit9CisKK0Zsb2F0UmVj
dCBHcmFwaGljc0NvbnRleHQ6OnJvdW5kVG9EZXZpY2VQaXhlbHMoY29uc3QgRmxvYXRSZWN0JiBm
cmVjdCkKK3sKKyAgICBGbG9hdFJlY3QgcmVzdWx0OworICAgIGRvdWJsZSB4ID0gZnJlY3QueCgp
OworICAgIGRvdWJsZSB5ID0gZnJlY3QueSgpOworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5j
cjsKKyAgICBjYWlyb191c2VyX3RvX2RldmljZShjciwgJngsICZ5KTsKKyAgICB4ID0gcm91bmQo
eCk7CisgICAgeSA9IHJvdW5kKHkpOworICAgIGNhaXJvX2RldmljZV90b191c2VyKGNyLCAmeCwg
JnkpOworICAgIHJlc3VsdC5zZXRYKHN0YXRpY19jYXN0PGZsb2F0Pih4KSk7CisgICAgcmVzdWx0
LnNldFkoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHkpKTsKKyAgICB4ID0gZnJlY3Qud2lkdGgoKTsKKyAg
ICB5ID0gZnJlY3QuaGVpZ2h0KCk7CisgICAgY2Fpcm9fdXNlcl90b19kZXZpY2VfZGlzdGFuY2Uo
Y3IsICZ4LCAmeSk7CisgICAgeCA9IHJvdW5kKHgpOworICAgIHkgPSByb3VuZCh5KTsKKyAgICBj
YWlyb19kZXZpY2VfdG9fdXNlcl9kaXN0YW5jZShjciwgJngsICZ5KTsKKyAgICByZXN1bHQuc2V0
V2lkdGgoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHgpKTsKKyAgICByZXN1bHQuc2V0SGVpZ2h0KHN0YXRp
Y19jYXN0PGZsb2F0Pih5KSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBHcmFwaGlj
c0NvbnRleHQ6OnRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5KQoreworICAgIGlmIChwYWludGlu
Z0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRh
LT5jcjsKKyAgICBjYWlyb190cmFuc2xhdGUoY3IsIHgsIHkpOworfQorCitJbnRQb2ludCBHcmFw
aGljc0NvbnRleHQ6Om9yaWdpbigpCit7CisgICAgY2Fpcm9fbWF0cml4X3QgbWF0cml4OworICAg
IGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb19nZXRfbWF0cml4KGNyLCAmbWF0
cml4KTsKKyAgICByZXR1cm4gSW50UG9pbnQoc3RhdGljX2Nhc3Q8aW50PihtYXRyaXgueDApLCBz
dGF0aWNfY2FzdDxpbnQ+KG1hdHJpeC55MCkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6
c2V0UGxhdGZvcm1GaWxsQ29sb3IoY29uc3QgQ29sb3ImIGNvbCkKK3sKKyAgICAvLyBGSVhNRTog
dGhpcyBpcyBwcm9iYWJseSBhIG5vLW9wIGJ1dCBJJ20gbm90IHN1cmUKKyAgICAvLyBub3RJbXBs
ZW1lbnRlZCgpOyAvLyBjb21tZW50ZWQtb3V0IGJlY2F1c2UgaXQncyBjaGF0dHkgYW5kIGNsdXR0
ZXJzIG91dHB1dAorfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TdHJva2VD
b2xvcihjb25zdCBDb2xvciYgY29sKQoreworICAgIC8vIEZJWE1FOiB0aGlzIGlzIHByb2JhYmx5
IGEgbm8tb3AgYnV0IEknbSBub3Qgc3VyZQorICAgIC8vbm90SW1wbGVtZW50ZWQoKTsgLy8gY29t
bWVudGVkLW91dCBiZWNhdXNlIGl0J3MgY2hhdHR5IGFuZCBjbHV0dGVycyBvdXRwdXQKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtU3Ryb2tlVGhpY2tuZXNzKGZsb2F0IHN0
cm9rZVRoaWNrbmVzcykKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBjYWlyb19zZXRfbGluZV93aWR0aChtX2RhdGEtPmNyLCBzdHJva2VUaGlj
a25lc3MpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TdHJva2VTdHls
ZShjb25zdCBTdHJva2VTdHlsZSYgc3Ryb2tlU3R5bGUpCit7CisgICAgc3RhdGljIGRvdWJsZSBk
YXNoUGF0dGVybltdID0gezUuMCwgNS4wfTsKKyAgICBzdGF0aWMgZG91YmxlIGRvdFBhdHRlcm5b
XSA9IHsxLjAsIDEuMH07CisKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBzd2l0Y2ggKHN0cm9rZVN0eWxlKSB7CisgICAgY2FzZSBOb1N0cm9rZToK
KyAgICAgICAgLy8gRklYTUU6IGlzIGl0IHRoZSByaWdodCB3YXkgdG8gZW11bGF0ZSBOb1N0cm9r
ZT8KKyAgICAgICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgobV9kYXRhLT5jciwgMCk7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgU29saWRTdHJva2U6CisgICAgICAgIGNhaXJvX3NldF9kYXNoKG1f
ZGF0YS0+Y3IsIDAsIDAsIDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERvdHRlZFN0cm9r
ZToKKyAgICAgICAgY2Fpcm9fc2V0X2Rhc2gobV9kYXRhLT5jciwgZG90UGF0dGVybiwgMiwgMCk7
CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRGFzaGVkU3Ryb2tlOgorICAgICAgICBjYWlyb19z
ZXRfZGFzaChtX2RhdGEtPmNyLCBkYXNoUGF0dGVybiwgMiwgMCk7CisgICAgICAgIGJyZWFrOwor
ICAgIGRlZmF1bHQ6CisgICAgICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgICAgIGJyZWFrOwor
ICAgIH0KK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFVSTEZvclJlY3QoY29uc3QgS1VS
TCYgbGluaywgY29uc3QgSW50UmVjdCYgZGVzdFJlY3QpCit7CisgICAgbm90SW1wbGVtZW50ZWQo
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNvbmNhdENUTShjb25zdCBBZmZpbmVUcmFu
c2Zvcm0mIHRyYW5zZm9ybSkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgY29uc3QgY2Fp
cm9fbWF0cml4X3QqIG1hdHJpeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2Fpcm9fbWF0cml4
X3QqPigmdHJhbnNmb3JtKTsKKyAgICBjYWlyb190cmFuc2Zvcm0oY3IsIG1hdHJpeCk7Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0OjphZGRJbm5lclJvdW5kZWRSZWN0Q2xpcChjb25zdCBJbnRS
ZWN0JiByZWN0LCBpbnQgdGhpY2tuZXNzKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkp
CisgICAgICAgIHJldHVybjsKKworICAgIGNsaXAocmVjdCk7CisKKyAgICBQYXRoIHA7CisgICAg
RmxvYXRSZWN0IHIocmVjdCk7CisgICAgLy8gQWRkIG91dGVyIGVsbGlwc2UKKyAgICBwLmFkZEVs
bGlwc2Uocik7CisgICAgLy8gQWRkIGlubmVyIGVsbGlwc2UKKyAgICByLmluZmxhdGUoLXRoaWNr
bmVzcyk7CisgICAgcC5hZGRFbGxpcHNlKHIpOworICAgIGFkZFBhdGgocCk7CisKKyAgICBjYWly
b190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgY2Fpcm9fZmlsbF9ydWxlX3Qgc2F2ZWRGaWxsUnVs
ZSA9IGNhaXJvX2dldF9maWxsX3J1bGUoY3IpOworICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3Is
IENBSVJPX0ZJTExfUlVMRV9FVkVOX09ERCk7CisgICAgY2Fpcm9fY2xpcChjcik7CisgICAgY2Fp
cm9fc2V0X2ZpbGxfcnVsZShjciwgc2F2ZWRGaWxsUnVsZSk7Cit9CisKKwordm9pZCBHcmFwaGlj
c0NvbnRleHQ6OnNldFNoYWRvdyhJbnRTaXplIGNvbnN0JiwgaW50LCBDb2xvciBjb25zdCYpCit7
CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsZWFy
U2hhZG93KCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6YmVnaW5UcmFuc3BhcmVuY3lMYXllcihmbG9hdCBvcGFjaXR5KQoreworICAgIGlmIChw
YWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0g
bV9kYXRhLT5jcjsKKyAgICBjYWlyb19wdXNoX2dyb3VwKGNyKTsKKyAgICBtX2RhdGEtPmxheWVy
cy5hcHBlbmQob3BhY2l0eSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjplbmRUcmFuc3Bh
cmVuY3lMYXllcigpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOworCisgICAgY2Fpcm9fcG9wX2dy
b3VwX3RvX3NvdXJjZShjcik7CisgICAgY2Fpcm9fcGFpbnRfd2l0aF9hbHBoYShjciwgbV9kYXRh
LT5sYXllcnMubGFzdCgpKTsKKyAgICBtX2RhdGEtPmxheWVycy5yZW1vdmVMYXN0KCk7Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGVhclJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KQor
eworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNh
aXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKworICAgIGNhaXJvX3NhdmUoY3IpOworICAgIGNhaXJv
X3JlY3RhbmdsZShjciwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVp
Z2h0KCkpOworICAgIGNhaXJvX3NldF9vcGVyYXRvcihjciwgQ0FJUk9fT1BFUkFUT1JfQ0xFQVIp
OworICAgIGNhaXJvX2ZpbGwoY3IpOworICAgIGNhaXJvX3Jlc3RvcmUoY3IpOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dDo6c3Ryb2tlUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGZsb2F0
IHdpZHRoKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsK
KworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb19zYXZlKGNyKTsKKyAg
ICBjYWlyb19yZWN0YW5nbGUoY3IsIHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCBy
ZWN0LmhlaWdodCgpKTsKKyAgICBzZXRDb2xvcihjciwgc3Ryb2tlQ29sb3IoKSk7CisgICAgY2Fp
cm9fc2V0X2xpbmVfd2lkdGgoY3IsIHdpZHRoKTsKKyAgICBjYWlyb19zdHJva2UoY3IpOworICAg
IGNhaXJvX3Jlc3RvcmUoY3IpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0TGluZUNh
cChMaW5lQ2FwIGxpbmVDYXApCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgY2Fpcm9fbGluZV9jYXBfdCBjYWlyb0NhcCA9IENBSVJPX0xJTkVf
Q0FQX0JVVFQ7CisgICAgc3dpdGNoIChsaW5lQ2FwKSB7CisgICAgICAgIGNhc2UgQnV0dENhcDoK
KyAgICAgICAgICAgIC8vIG5vLW9wCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBS
b3VuZENhcDoKKyAgICAgICAgICAgIGNhaXJvQ2FwID0gQ0FJUk9fTElORV9DQVBfUk9VTkQ7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTcXVhcmVDYXA6CisgICAgICAgICAgICBj
YWlyb0NhcCA9IENBSVJPX0xJTkVfQ0FQX1NRVUFSRTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
IH0KKyAgICBjYWlyb19zZXRfbGluZV9jYXAobV9kYXRhLT5jciwgY2Fpcm9DYXApOworfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0TGluZUpvaW4oTGluZUpvaW4gbGluZUpvaW4pCit7Cisg
ICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9f
bGluZV9qb2luX3QgY2Fpcm9Kb2luID0gQ0FJUk9fTElORV9KT0lOX01JVEVSOworICAgIHN3aXRj
aCAobGluZUpvaW4pIHsKKyAgICAgICAgY2FzZSBNaXRlckpvaW46CisgICAgICAgICAgICAvLyBu
by1vcAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUm91bmRKb2luOgorICAgICAg
ICAgICAgY2Fpcm9Kb2luID0gQ0FJUk9fTElORV9KT0lOX1JPVU5EOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGNhc2UgQmV2ZWxKb2luOgorICAgICAgICAgICAgY2Fpcm9Kb2luID0gQ0FJ
Uk9fTElORV9KT0lOX0JFVkVMOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhaXJv
X3NldF9saW5lX2pvaW4obV9kYXRhLT5jciwgY2Fpcm9Kb2luKTsKK30KKwordm9pZCBHcmFwaGlj
c0NvbnRleHQ6OnNldE1pdGVyTGltaXQoZmxvYXQgbWl0ZXIpCit7CisgICAgaWYgKHBhaW50aW5n
RGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fc2V0X21pdGVyX2xpbWl0
KG1fZGF0YS0+Y3IsIG1pdGVyKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldEFscGhh
KGZsb2F0KQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgY2Fp
cm9fb3BlcmF0b3JfdCB0b0NhaXJvT3BlcmF0b3IoQ29tcG9zaXRlT3BlcmF0b3Igb3ApCit7Cisg
ICAgc3dpdGNoIChvcCkgeworICAgICAgICBjYXNlIENvbXBvc2l0ZUNsZWFyOgorICAgICAgICAg
ICAgcmV0dXJuIENBSVJPX09QRVJBVE9SX0NMRUFSOworICAgICAgICBjYXNlIENvbXBvc2l0ZUNv
cHk6CisgICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfU09VUkNFOworICAgICAgICBj
YXNlIENvbXBvc2l0ZVNvdXJjZU92ZXI6CisgICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFU
T1JfT1ZFUjsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VJbjoKKyAgICAgICAgICAgIHJl
dHVybiBDQUlST19PUEVSQVRPUl9JTjsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VPdXQ6
CisgICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfT1VUOworICAgICAgICBjYXNlIENv
bXBvc2l0ZVNvdXJjZUF0b3A6CisgICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfQVRP
UDsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlvbk92ZXI6CisgICAgICAgICAgICBy
ZXR1cm4gQ0FJUk9fT1BFUkFUT1JfREVTVF9PVkVSOworICAgICAgICBjYXNlIENvbXBvc2l0ZURl
c3RpbmF0aW9uSW46CisgICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfREVTVF9JTjsK
KyAgICAgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlvbk91dDoKKyAgICAgICAgICAgIHJldHVy
biBDQUlST19PUEVSQVRPUl9ERVNUX09VVDsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5h
dGlvbkF0b3A6CisgICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfREVTVF9BVE9QOwor
ICAgICAgICBjYXNlIENvbXBvc2l0ZVhPUjoKKyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVS
QVRPUl9YT1I7CisgICAgICAgIGNhc2UgQ29tcG9zaXRlUGx1c0RhcmtlcjoKKyAgICAgICAgICAg
IHJldHVybiBDQUlST19PUEVSQVRPUl9TQVRVUkFURTsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVI
aWdobGlnaHQ6CisgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBDYWlybyBlcXVpdmFsZW50IGZv
ciBDb21wb3NpdGVIaWdobGlnaHQuCisgICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1Jf
T1ZFUjsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVQbHVzTGlnaHRlcjoKKyAgICAgICAgICAgIHJl
dHVybiBDQUlST19PUEVSQVRPUl9BREQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBy
ZXR1cm4gQ0FJUk9fT1BFUkFUT1JfU09VUkNFOworICAgIH0KK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQ6OnNldENvbXBvc2l0ZU9wZXJhdGlvbihDb21wb3NpdGVPcGVyYXRvciBvcCkKK3sKKyAg
ICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb19z
ZXRfb3BlcmF0b3IobV9kYXRhLT5jciwgdG9DYWlyb09wZXJhdG9yKG9wKSk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0OjpiZWdpblBhdGgoKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVk
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAg
ICBjYWlyb19uZXdfcGF0aChjcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjphZGRQYXRo
KGNvbnN0IFBhdGgmIHBhdGgpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOworICAgIGNhaXJvX3Bh
dGhfdCogcCA9IGNhaXJvX2NvcHlfcGF0aChwYXRoLnBsYXRmb3JtUGF0aCgpLT5tX2NyKTsKKyAg
ICBjYWlyb19hcHBlbmRfcGF0aChjciwgcCk7CisgICAgY2Fpcm9fcGF0aF9kZXN0cm95KHApOwor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcChjb25zdCBQYXRoJiBwYXRoKQoreworICAg
IGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3Qq
IGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb19wYXRoX3QqIHAgPSBjYWlyb19jb3B5X3BhdGgo
cGF0aC5wbGF0Zm9ybVBhdGgoKS0+bV9jcik7CisgICAgY2Fpcm9fYXBwZW5kX3BhdGgoY3IsIHAp
OworICAgIGNhaXJvX3BhdGhfZGVzdHJveShwKTsKKyAgICBjYWlyb19maWxsX3J1bGVfdCBzYXZl
ZEZpbGxSdWxlID0gY2Fpcm9fZ2V0X2ZpbGxfcnVsZShjcik7CisgICAgY2Fpcm9fc2V0X2ZpbGxf
cnVsZShjciwgQ0FJUk9fRklMTF9SVUxFX1dJTkRJTkcpOworICAgIGNhaXJvX2NsaXAoY3IpOwor
ICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIHNhdmVkRmlsbFJ1bGUpOworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDo6Y2xpcE91dChjb25zdCBQYXRoJiBwYXRoKQoreworICAgIGlmIChwYWlu
dGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9k
YXRhLT5jcjsKKyAgICBkb3VibGUgeDEsIHkxLCB4MiwgeTI7CisgICAgY2Fpcm9fY2xpcF9leHRl
bnRzKGNyLCAmeDEsICZ5MSwgJngyLCAmeTIpOworICAgIGNhaXJvX3JlY3RhbmdsZShjciwgeDEs
IHkxLCB4MiAtIHgxLCB5MiAtIHkxKTsKKyAgICBhZGRQYXRoKHBhdGgpOworCisgICAgY2Fpcm9f
ZmlsbF9ydWxlX3Qgc2F2ZWRGaWxsUnVsZSA9IGNhaXJvX2dldF9maWxsX3J1bGUoY3IpOworICAg
IGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIENBSVJPX0ZJTExfUlVMRV9FVkVOX09ERCk7CisgICAg
Y2Fpcm9fY2xpcChjcik7CisgICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgc2F2ZWRGaWxsUnVs
ZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpyb3RhdGUoZmxvYXQgcmFkaWFucykKK3sK
KyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWly
b19yb3RhdGUobV9kYXRhLT5jciwgcmFkaWFucyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
OjpzY2FsZShjb25zdCBGbG9hdFNpemUmIHNpemUpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJs
ZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fc2NhbGUobV9kYXRhLT5jciwgc2l6
ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNs
aXBPdXQoY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgZG91
YmxlIHgxLCB5MSwgeDIsIHkyOworICAgIGNhaXJvX2NsaXBfZXh0ZW50cyhjciwgJngxLCAmeTEs
ICZ4MiwgJnkyKTsKKyAgICBjYWlyb19yZWN0YW5nbGUoY3IsIHgxLCB4MiwgeDIgLSB4MSwgeTIg
LSB5MSk7CisgICAgY2Fpcm9fcmVjdGFuZ2xlKGNyLCByLngoKSwgci55KCksIHIud2lkdGgoKSwg
ci5oZWlnaHQoKSk7CisgICAgY2Fpcm9fZmlsbF9ydWxlX3Qgc2F2ZWRGaWxsUnVsZSA9IGNhaXJv
X2dldF9maWxsX3J1bGUoY3IpOworICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIENBSVJPX0ZJ
TExfUlVMRV9FVkVOX09ERCk7CisgICAgY2Fpcm9fY2xpcChjcik7CisgICAgY2Fpcm9fc2V0X2Zp
bGxfcnVsZShjciwgc2F2ZWRGaWxsUnVsZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpj
bGlwT3V0RWxsaXBzZUluUmVjdChjb25zdCBJbnRSZWN0JiByKQoreworICAgIGlmIChwYWludGlu
Z0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIFBhdGggcDsKKyAgICBwLmFkZEVs
bGlwc2Uocik7CisgICAgY2xpcE91dChwKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmZp
bGxSb3VuZGVkUmVjdChjb25zdCBJbnRSZWN0JiByLCBjb25zdCBJbnRTaXplJiB0b3BMZWZ0LCBj
b25zdCBJbnRTaXplJiB0b3BSaWdodCwgY29uc3QgSW50U2l6ZSYgYm90dG9tTGVmdCwgY29uc3Qg
SW50U2l6ZSYgYm90dG9tUmlnaHQsIGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBpZiAocGFp
bnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb190KiBjciA9IG1f
ZGF0YS0+Y3I7CisgICAgY2Fpcm9fc2F2ZShjcik7CisgICAgYmVnaW5QYXRoKCk7CisgICAgYWRk
UGF0aChQYXRoOjpjcmVhdGVSb3VuZGVkUmVjdGFuZ2xlKHIsIHRvcExlZnQsIHRvcFJpZ2h0LCBi
b3R0b21MZWZ0LCBib3R0b21SaWdodCkpOworICAgIHNldENvbG9yKGNyLCBjb2xvcik7CisgICAg
Y2Fpcm9fZmlsbChjcik7CisgICAgY2Fpcm9fcmVzdG9yZShjcik7Cit9CisKKyNpZiBQTEFURk9S
TShHVEspCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0R2RrRXhwb3NlRXZlbnQoR2RrRXZlbnRF
eHBvc2UqIGV4cG9zZSkKK3sKKyAgICBtX2RhdGEtPmV4cG9zZSA9IGV4cG9zZTsKK30KKworR2Rr
RXZlbnRFeHBvc2UqIEdyYXBoaWNzQ29udGV4dDo6Z2RrRXhwb3NlRXZlbnQoKSBjb25zdAorewor
ICAgIHJldHVybiBtX2RhdGEtPmV4cG9zZTsKK30KKworR2RrRHJhd2FibGUqIEdyYXBoaWNzQ29u
dGV4dDo6Z2RrRHJhd2FibGUoKSBjb25zdAoreworICAgIGlmICghbV9kYXRhLT5leHBvc2UpCisg
ICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIEdES19EUkFXQUJMRShtX2RhdGEtPmV4cG9z
ZS0+d2luZG93KTsKK30KKworSW50UG9pbnQgR3JhcGhpY3NDb250ZXh0Ojp0cmFuc2xhdGVQb2lu
dChjb25zdCBJbnRQb2ludCYgcG9pbnQpIGNvbnN0Cit7CisgICAgY2Fpcm9fbWF0cml4X3QgdG07
CisgICAgY2Fpcm9fZ2V0X21hdHJpeChtX2RhdGEtPmNyLCAmdG0pOworICAgIGRvdWJsZSB4ID0g
cG9pbnQueCgpOworICAgIGRvdWJsZSB5ID0gcG9pbnQueSgpOworCisgICAgY2Fpcm9fbWF0cml4
X3RyYW5zZm9ybV9wb2ludCgmdG0sICZ4LCAmeSk7CisgICAgcmV0dXJuIEludFBvaW50KHgsIHkp
OworfQorI2VuZGlmCisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRVc2VBbnRpYWxpYXNpbmco
Ym9vbCBlbmFibGUpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgLy8gV2hlbiB0cnVlLCB1c2UgdGhlIGRlZmF1bHQgQ2Fpcm8gYmFja2VuZCBh
bnRpYWxpYXMgbW9kZSAodXN1YWxseSB0aGlzCisgICAgLy8gZW5hYmxlcyBzdGFuZGFyZCAnZ3Jh
eXNjYWxlJyBhbnRpYWxpYXNpbmcpOyBmYWxzZSB0byBleHBsaWNpdGx5IGRpc2FibGUKKyAgICAv
LyBhbnRpYWxpYXNpbmcuIFRoaXMgaXMgdGhlIHNhbWUgc3RyYXRlZ3kgYXMgdXNlZCBpbiBkcmF3
Q29udmV4UG9seWdvbigpLgorICAgIGNhaXJvX3NldF9hbnRpYWxpYXMobV9kYXRhLT5jciwgZW5h
YmxlID8gQ0FJUk9fQU5USUFMSUFTX0RFRkFVTFQgOiBDQUlST19BTlRJQUxJQVNfTk9ORSk7Cit9
CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFBMQVRGT1JNKENBSVJPKQpJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9HcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nh
aXJvL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZS5oCShyZXZpc2lvbiAyOTcyNikKKysr
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNiArMSw3IEBACiAvKgogICogQ29weXJpZ2h0
IChDKSAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICog
Q29weXJpZ2h0IChDKSAyMDA3IEFscCBUb2tlciA8YWxwQGF0b2tlci5jb20+CisgKiBDb3B5cmln
aHQgKEMpIDIwMDggQnJlbnQgRnVsZ2hhbSA8YmZ1bGdoYW1AZ21haWwuY29tPgogICoKICAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yOSw4OTUgKzMwLDU1IEBACiAKICNpZiBQTEFURk9S
TShDQUlSTykKIAotI2luY2x1ZGUgIkNhaXJvUGF0aC5oIgotI2luY2x1ZGUgIkZsb2F0UmVjdC5o
IgotI2luY2x1ZGUgIkZvbnQuaCIKLSNpbmNsdWRlICJJbnRSZWN0LmgiCi0jaW5jbHVkZSAiTm90
SW1wbGVtZW50ZWQuaCIKLSNpbmNsdWRlICJQYXRoLmgiCi0jaW5jbHVkZSAiU2ltcGxlRm9udERh
dGEuaCIKICNpbmNsdWRlIDxjYWlyby5oPgogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxz
dGRpby5oPgogI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CiAKLSNpZiBQTEFURk9STShXSU4p
Ci0jaW5jbHVkZSA8Y2Fpcm8td2luMzIuaD4KLSNlbmRpZgotCiAjaWYgUExBVEZPUk0oR1RLKQog
I2luY2x1ZGUgPGdkay9nZGsuaD4KICNpbmNsdWRlIDxwYW5nby9wYW5nby5oPgotI2VuZGlmCi0K
LQotI2lmbmRlZiBNX1BJCi0jZGVmaW5lIE1fUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgorI2Vs
aWYgUExBVEZPUk0oV0lOKQorI2luY2x1ZGUgPGNhaXJvLXdpbjMyLmg+CiAjZW5kaWYKIAogbmFt
ZXNwYWNlIFdlYkNvcmUgewogCiBjbGFzcyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUg
ewogcHVibGljOgotICAgIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpOwotICAgIH5H
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKTsKLQotICAgIGNhaXJvX3QqIGNyOwotICAg
IFZlY3RvcjxmbG9hdD4gbGF5ZXJzOwotCisgICAgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2
YXRlKCkKKyAgICAgICAgOiAgY3IoMCkKICNpZiBQTEFURk9STShHVEspCi0gICAgR2RrRXZlbnRF
eHBvc2UqIGV4cG9zZTsKLSNlbmRpZgotfTsKLQotc3RhdGljIGlubGluZSB2b2lkIHNldENvbG9y
KGNhaXJvX3QqIGNyLCBjb25zdCBDb2xvciYgY29sKQotewotICAgIGZsb2F0IHJlZCwgZ3JlZW4s
IGJsdWUsIGFscGhhOwotICAgIGNvbC5nZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsK
LSAgICBjYWlyb19zZXRfc291cmNlX3JnYmEoY3IsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsK
LX0KLQotLy8gQSBmaWxsUmVjdCBoZWxwZXIKLXN0YXRpYyBpbmxpbmUgdm9pZCBmaWxsUmVjdFNv
dXJjZU92ZXIoY2Fpcm9fdCogY3IsIGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgY29uc3QgQ29sb3Im
IGNvbCkKLXsKLSAgICBzZXRDb2xvcihjciwgY29sKTsKLSAgICBjYWlyb19yZWN0YW5nbGUoY3Is
IHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKLSAgICBj
YWlyb19zZXRfb3BlcmF0b3IoY3IsIENBSVJPX09QRVJBVE9SX09WRVIpOwotICAgIGNhaXJvX2Zp
bGwoY3IpOwotfQotCi1HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OkdyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZSgpCi0gICAgOiAgY3IoMCkKLSNpZiBQTEFURk9STShHVEspCi0g
ICAgLCBleHBvc2UoMCkKLSNlbmRpZgotewotfQotCi1HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVBy
aXZhdGU6On5HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKQotewotICAgIGNhaXJvX2Rl
c3Ryb3koY3IpOwotfQotCi0jaWYgUExBVEZPUk0oV0lOKQotR3JhcGhpY3NDb250ZXh0OjpHcmFw
aGljc0NvbnRleHQoSERDIGRjKQotICAgIDogbV9jb21tb24oY3JlYXRlR3JhcGhpY3NDb250ZXh0
UHJpdmF0ZSgpKQotICAgICwgbV9kYXRhKG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZh
dGUpCi17Ci0gICAgaWYgKGRjKSB7Ci0gICAgICAgIGNhaXJvX3N1cmZhY2VfdCogc3VyZmFjZSA9
IGNhaXJvX3dpbjMyX3N1cmZhY2VfY3JlYXRlKGRjKTsKLSAgICAgICAgbV9kYXRhLT5jciA9IGNh
aXJvX2NyZWF0ZShzdXJmYWNlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzZXRQYWludGluZ0Rp
c2FibGVkKHRydWUpOwotICAgICAgICBtX2RhdGEtPmNyID0gMDsKLSAgICB9Ci19Ci0jZW5kaWYK
LQotR3JhcGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRleHQoUGxhdGZvcm1HcmFwaGljc0NvbnRl
eHQqIGNyKQotICAgIDogbV9jb21tb24oY3JlYXRlR3JhcGhpY3NDb250ZXh0UHJpdmF0ZSgpKQot
ICAgICwgbV9kYXRhKG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUpCi17Ci0gICAg
bV9kYXRhLT5jciA9IGNhaXJvX3JlZmVyZW5jZShjcik7Ci0gICAgc2V0UGFpbnRpbmdEaXNhYmxl
ZCghY3IpOwotfQotCi1HcmFwaGljc0NvbnRleHQ6On5HcmFwaGljc0NvbnRleHQoKQotewotICAg
IGRlc3Ryb3lHcmFwaGljc0NvbnRleHRQcml2YXRlKG1fY29tbW9uKTsKLSAgICBkZWxldGUgbV9k
YXRhOwotfQotCi1jYWlyb190KiBHcmFwaGljc0NvbnRleHQ6OnBsYXRmb3JtQ29udGV4dCgpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIG1fZGF0YS0+Y3I7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
OjpzYXZlUGxhdGZvcm1TdGF0ZSgpCi17Ci0gICAgY2Fpcm9fc2F2ZShtX2RhdGEtPmNyKTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnJlc3RvcmVQbGF0Zm9ybVN0YXRlKCkKLXsKLSAgICBj
YWlyb19yZXN0b3JlKG1fZGF0YS0+Y3IpOwotfQotCi0vLyBEcmF3cyBhIGZpbGxlZCByZWN0YW5n
bGUgd2l0aCBhIHN0cm9rZWQgYm9yZGVyLgotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdSZWN0
KGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotICAgIGNhaXJv
X3NhdmUoY3IpOwotCi0gICAgaWYgKGZpbGxDb2xvcigpLmFscGhhKCkpCi0gICAgICAgIGZpbGxS
ZWN0U291cmNlT3ZlcihjciwgcmVjdCwgZmlsbENvbG9yKCkpOwotCi0gICAgaWYgKHN0cm9rZVN0
eWxlKCkgIT0gTm9TdHJva2UpIHsKLSAgICAgICAgc2V0Q29sb3IoY3IsIHN0cm9rZUNvbG9yKCkp
OwotICAgICAgICBGbG9hdFJlY3QgcihyZWN0KTsKLSAgICAgICAgci5pbmZsYXRlKC0uNWYpOwot
ICAgICAgICBjYWlyb19yZWN0YW5nbGUoY3IsIHIueCgpLCByLnkoKSwgci53aWR0aCgpLCByLmhl
aWdodCgpKTsKLSAgICAgICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgoY3IsIDEuMCk7Ci0gICAgICAg
IGNhaXJvX3N0cm9rZShjcik7CisgICAgICAgICwgZXhwb3NlKDApCisjZWxpZiBQTEFURk9STShX
SU4pCisgICAgICAgIC8vIE5PVEU6ICBUaGVzZSBtYXkgbm90ZSBiZSBuZWVkZWQ6IHJldmlldyBh
bmQgcmVtb3ZlIG9uY2UgQ2Fpcm8gaW1wbGVtZW50YXRpb24gaXMgY29tcGxldGUKKyAgICAgICAg
LCBtX2hkYygwKQorICAgICAgICAsIG1fdHJhbnNwYXJlbmN5Q291bnQoMCkKKyNlbmRpZgorICAg
IHsKICAgICB9CiAKLSAgICBjYWlyb19yZXN0b3JlKGNyKTsKLX0KLQotLy8gRklYTUU6IE5vdyB0
aGF0IHRoaXMgaXMgcmVmYWN0b3JlZCwgaXQgc2hvdWxkIGJlIHNoYXJlZCBieSBhbGwgY29udGV4
dHMuCi1zdGF0aWMgdm9pZCBhZGp1c3RMaW5lVG9QaXhlbEJvdW5kYXJpZXMoRmxvYXRQb2ludCYg
cDEsIEZsb2F0UG9pbnQmIHAyLCBmbG9hdCBzdHJva2VXaWR0aCwgU3Ryb2tlU3R5bGUgc3R5bGUp
Ci17Ci0gICAgLy8gRm9yIG9kZCB3aWR0aHMsIHdlIGFkZCBpbiAwLjUgdG8gdGhlIGFwcHJvcHJp
YXRlIHgveSBzbyB0aGF0IHRoZSBmbG9hdCBhcml0aG1ldGljCi0gICAgLy8gd29ya3Mgb3V0LiAg
Rm9yIGV4YW1wbGUsIHdpdGggYSBib3JkZXIgd2lkdGggb2YgMywgS0hUTUwgd2lsbCBwYXNzIHVz
ICh5MSt5MikvMiwgZS5nLiwKLSAgICAvLyAoNTArNTMpLzIgPSAxMDMvMiA9IDUxIHdoZW4gd2Ug
d2FudCA1MS41LiAgSXQgaXMgYWx3YXlzIHRydWUgdGhhdCBhbiBldmVuIHdpZHRoIGdhdmUKLSAg
ICAvLyB1cyBhIHBlcmZlY3QgcG9zaXRpb24sIGJ1dCBhbiBvZGQgd2lkdGggZ2F2ZSB1cyBhIHBv
c2l0aW9uIHRoYXQgaXMgb2ZmIGJ5IGV4YWN0bHkgMC41LgotICAgIGlmIChzdHlsZSA9PSBEb3R0
ZWRTdHJva2UgfHwgc3R5bGUgPT0gRGFzaGVkU3Ryb2tlKSB7Ci0gICAgICAgIGlmIChwMS54KCkg
PT0gcDIueCgpKSB7Ci0gICAgICAgICAgICBwMS5zZXRZKHAxLnkoKSArIHN0cm9rZVdpZHRoKTsK
LSAgICAgICAgICAgIHAyLnNldFkocDIueSgpIC0gc3Ryb2tlV2lkdGgpOwotICAgICAgICB9Ci0g
ICAgICAgIGVsc2UgewotICAgICAgICAgICAgcDEuc2V0WChwMS54KCkgKyBzdHJva2VXaWR0aCk7
Ci0gICAgICAgICAgICBwMi5zZXRYKHAyLngoKSAtIHN0cm9rZVdpZHRoKTsKLSAgICAgICAgfQot
ICAgIH0KLQotICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KHN0cm9rZVdpZHRoKSAlIDIpIHsKLSAg
ICAgICAgaWYgKHAxLngoKSA9PSBwMi54KCkpIHsKLSAgICAgICAgICAgIC8vIFdlJ3JlIGEgdmVy
dGljYWwgbGluZS4gIEFkanVzdCBvdXIgeC4KLSAgICAgICAgICAgIHAxLnNldFgocDEueCgpICsg
MC41KTsKLSAgICAgICAgICAgIHAyLnNldFgocDIueCgpICsgMC41KTsKLSAgICAgICAgfQotICAg
ICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIFdlJ3JlIGEgaG9yaXpvbnRhbCBsaW5lLiBBZGp1
c3Qgb3VyIHkuCi0gICAgICAgICAgICBwMS5zZXRZKHAxLnkoKSArIDAuNSk7Ci0gICAgICAgICAg
ICBwMi5zZXRZKHAyLnkoKSArIDAuNSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIFRoaXMg
aXMgb25seSB1c2VkIHRvIGRyYXcgYm9yZGVycy4KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3
TGluZShjb25zdCBJbnRQb2ludCYgcG9pbnQxLCBjb25zdCBJbnRQb2ludCYgcG9pbnQyKQotewot
ICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFN0cm9r
ZVN0eWxlIHN0eWxlID0gc3Ryb2tlU3R5bGUoKTsKLSAgICBpZiAoc3R5bGUgPT0gTm9TdHJva2Up
Ci0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLSAgICBj
YWlyb19zYXZlKGNyKTsKLQotICAgIGZsb2F0IHdpZHRoID0gc3Ryb2tlVGhpY2tuZXNzKCk7Ci0g
ICAgaWYgKHdpZHRoIDwgMSkKLSAgICAgICAgd2lkdGggPSAxOwotCi0gICAgRmxvYXRQb2ludCBw
MSA9IHBvaW50MTsKLSAgICBGbG9hdFBvaW50IHAyID0gcG9pbnQyOwotICAgIGJvb2wgaXNWZXJ0
aWNhbExpbmUgPSAocDEueCgpID09IHAyLngoKSk7Ci0gCi0gICAgYWRqdXN0TGluZVRvUGl4ZWxC
b3VuZGFyaWVzKHAxLCBwMiwgd2lkdGgsIHN0eWxlKTsKLSAgICBjYWlyb19zZXRfbGluZV93aWR0
aChjciwgd2lkdGgpOwotCi0gICAgaW50IHBhdFdpZHRoID0gMDsKLSAgICBzd2l0Y2ggKHN0eWxl
KSB7Ci0gICAgY2FzZSBOb1N0cm9rZToKLSAgICBjYXNlIFNvbGlkU3Ryb2tlOgotICAgICAgICBi
cmVhazsKLSAgICBjYXNlIERvdHRlZFN0cm9rZToKLSAgICAgICAgcGF0V2lkdGggPSBzdGF0aWNf
Y2FzdDxpbnQ+KHdpZHRoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEYXNoZWRTdHJva2U6
Ci0gICAgICAgIHBhdFdpZHRoID0gMypzdGF0aWNfY2FzdDxpbnQ+KHdpZHRoKTsKLSAgICAgICAg
YnJlYWs7CisgICAgfkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpCisgICAgeworICAg
ICAgICBjYWlyb19kZXN0cm95KGNyKTsKICAgICB9CiAKLSAgICBzZXRDb2xvcihjciwgc3Ryb2tl
Q29sb3IoKSk7Ci0KLSAgICBjYWlyb19zZXRfYW50aWFsaWFzKGNyLCBDQUlST19BTlRJQUxJQVNf
Tk9ORSk7Ci0KLSAgICBpZiAocGF0V2lkdGgpIHsKLSAgICAgICAgLy8gRG8gYSByZWN0IGZpbGwg
b2Ygb3VyIGVuZHBvaW50cy4gIFRoaXMgZW5zdXJlcyB3ZSBhbHdheXMgaGF2ZSB0aGUKLSAgICAg
ICAgLy8gYXBwZWFyYW5jZSBvZiBiZWluZyBhIGJvcmRlci4gIFdlIHRoZW4gZHJhdyB0aGUgYWN0
dWFsIGRvdHRlZC9kYXNoZWQgbGluZS4KLSAgICAgICAgaWYgKGlzVmVydGljYWxMaW5lKSB7Ci0g
ICAgICAgICAgICBmaWxsUmVjdFNvdXJjZU92ZXIoY3IsIEZsb2F0UmVjdChwMS54KCkgLSB3aWR0
aC8yLCBwMS55KCkgLSB3aWR0aCwgd2lkdGgsIHdpZHRoKSwgc3Ryb2tlQ29sb3IoKSk7Ci0gICAg
ICAgICAgICBmaWxsUmVjdFNvdXJjZU92ZXIoY3IsIEZsb2F0UmVjdChwMi54KCkgLSB3aWR0aC8y
LCBwMi55KCksIHdpZHRoLCB3aWR0aCksIHN0cm9rZUNvbG9yKCkpOwotICAgICAgICB9IGVsc2Ug
ewotICAgICAgICAgICAgZmlsbFJlY3RTb3VyY2VPdmVyKGNyLCBGbG9hdFJlY3QocDEueCgpIC0g
d2lkdGgsIHAxLnkoKSAtIHdpZHRoLzIsIHdpZHRoLCB3aWR0aCksIHN0cm9rZUNvbG9yKCkpOwot
ICAgICAgICAgICAgZmlsbFJlY3RTb3VyY2VPdmVyKGNyLCBGbG9hdFJlY3QocDIueCgpLCBwMi55
KCkgLSB3aWR0aC8yLCB3aWR0aCwgd2lkdGgpLCBzdHJva2VDb2xvcigpKTsKLSAgICAgICAgfQot
Ci0gICAgICAgIC8vIEV4YW1wbGU6IDgwIHBpeGVscyB3aXRoIGEgd2lkdGggb2YgMzAgcGl4ZWxz
LgotICAgICAgICAvLyBSZW1haW5kZXIgaXMgMjAuICBUaGUgbWF4aW11bSBwaXhlbHMgb2YgbGlu
ZSB3ZSBjb3VsZCBwYWludAotICAgICAgICAvLyB3aWxsIGJlIDUwIHBpeGVscy4KLSAgICAgICAg
aW50IGRpc3RhbmNlID0gKGlzVmVydGljYWxMaW5lID8gKHBvaW50Mi55KCkgLSBwb2ludDEueSgp
KSA6IChwb2ludDIueCgpIC0gcG9pbnQxLngoKSkpIC0gMipzdGF0aWNfY2FzdDxpbnQ+KHdpZHRo
KTsKLSAgICAgICAgaW50IHJlbWFpbmRlciA9IGRpc3RhbmNlJXBhdFdpZHRoOwotICAgICAgICBp
bnQgY292ZXJhZ2UgPSBkaXN0YW5jZS1yZW1haW5kZXI7Ci0gICAgICAgIGludCBudW1TZWdtZW50
cyA9IGNvdmVyYWdlL3BhdFdpZHRoOwotCi0gICAgICAgIGZsb2F0IHBhdHRlcm5PZmZzZXQgPSAw
OwotICAgICAgICAvLyBTcGVjaWFsIGNhc2UgMXB4IGRvdHRlZCBib3JkZXJzIGZvciBzcGVlZC4K
LSAgICAgICAgaWYgKHBhdFdpZHRoID09IDEpCi0gICAgICAgICAgICBwYXR0ZXJuT2Zmc2V0ID0g
MS4wOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGJvb2wgZXZlbk51bWJlck9mU2VnbWVu
dHMgPSBudW1TZWdtZW50cyUyID09IDA7Ci0gICAgICAgICAgICBpZiAocmVtYWluZGVyKQotICAg
ICAgICAgICAgICAgIGV2ZW5OdW1iZXJPZlNlZ21lbnRzID0gIWV2ZW5OdW1iZXJPZlNlZ21lbnRz
OwotICAgICAgICAgICAgaWYgKGV2ZW5OdW1iZXJPZlNlZ21lbnRzKSB7Ci0gICAgICAgICAgICAg
ICAgaWYgKHJlbWFpbmRlcikgewotICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuT2Zmc2V0ICs9
IHBhdFdpZHRoIC0gcmVtYWluZGVyOwotICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuT2Zmc2V0
ICs9IHJlbWFpbmRlci8yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNl
Ci0gICAgICAgICAgICAgICAgICAgIHBhdHRlcm5PZmZzZXQgPSBwYXRXaWR0aC8yOwotICAgICAg
ICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIWV2ZW5OdW1iZXJPZlNlZ21lbnRzKSB7Ci0g
ICAgICAgICAgICAgICAgaWYgKHJlbWFpbmRlcikKLSAgICAgICAgICAgICAgICAgICAgcGF0dGVy
bk9mZnNldCA9IChwYXRXaWR0aCAtIHJlbWFpbmRlcikvMjsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgfQotCi0gICAgICAgIGRvdWJsZSBkYXNoID0gcGF0V2lkdGg7Ci0gICAgICAgIGNhaXJvX3Nl
dF9kYXNoKGNyLCAmZGFzaCwgMSwgcGF0dGVybk9mZnNldCk7Ci0gICAgfQotCi0gICAgY2Fpcm9f
bW92ZV90byhjciwgcDEueCgpLCBwMS55KCkpOwotICAgIGNhaXJvX2xpbmVfdG8oY3IsIHAyLngo
KSwgcDIueSgpKTsKLQotICAgIGNhaXJvX3N0cm9rZShjcik7Ci0gICAgY2Fpcm9fcmVzdG9yZShj
cik7Ci19Ci0KLS8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZCB0byBkcmF3IHRoZSBsaXR0bGUg
Y2lyY2xlcyB1c2VkIGluIGxpc3RzLgotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdFbGxpcHNl
KGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotICAgIGNhaXJv
X3NhdmUoY3IpOwotICAgIGZsb2F0IHlSYWRpdXMgPSAuNSAqIHJlY3QuaGVpZ2h0KCk7Ci0gICAg
ZmxvYXQgeFJhZGl1cyA9IC41ICogcmVjdC53aWR0aCgpOwotICAgIGNhaXJvX3RyYW5zbGF0ZShj
ciwgcmVjdC54KCkgKyB4UmFkaXVzLCByZWN0LnkoKSArIHlSYWRpdXMpOwotICAgIGNhaXJvX3Nj
YWxlKGNyLCB4UmFkaXVzLCB5UmFkaXVzKTsKLSAgICBjYWlyb19hcmMoY3IsIDAuLCAwLiwgMS4s
IDAuLCAyICogTV9QSSk7Ci0gICAgY2Fpcm9fcmVzdG9yZShjcik7Ci0KLSAgICBpZiAoZmlsbENv
bG9yKCkuYWxwaGEoKSkgewotICAgICAgICBzZXRDb2xvcihjciwgZmlsbENvbG9yKCkpOwotICAg
ICAgICBjYWlyb19maWxsX3ByZXNlcnZlKGNyKTsKLSAgICB9Ci0KLSAgICBpZiAoc3Ryb2tlU3R5
bGUoKSAhPSBOb1N0cm9rZSkgewotICAgICAgICBzZXRDb2xvcihjciwgc3Ryb2tlQ29sb3IoKSk7
Ci0gICAgICAgIGNhaXJvX3NldF9saW5lX3dpZHRoKGNyLCBzdHJva2VUaGlja25lc3MoKSk7Ci0g
ICAgICAgIGNhaXJvX3N0cm9rZShjcik7Ci0gICAgfQotCi0gICAgY2Fpcm9fbmV3X3BhdGgoY3Ip
OwotfQotCi0vLyBGSVhNRTogVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSBhZGp1c3RlZCB0byBt
YXRjaCB0aGUgZnVuY3Rpb25hbGl0eSBvbiB0aGUgTWFjIHNpZGUuCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDo6c3Ryb2tlQXJjKGNvbnN0IEludFJlY3QmIHJlY3QsIGludCBzdGFydEFuZ2xlLCBpbnQg
YW5nbGVTcGFuKQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIGlmIChzdHJva2VTdHlsZSgpID09IE5vU3Ryb2tlKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBpbnQgeCA9IHJlY3QueCgpOwotICAgIGludCB5ID0gcmVjdC55KCk7Ci0gICAgZmxv
YXQgdyA9IHJlY3Qud2lkdGgoKTsKLSNpZiAwIC8vIEZJWE1FOiB1bnVzZWQgc28gZmFyCi0gICAg
ZmxvYXQgaCA9IHJlY3QuaGVpZ2h0KCk7Ci0gICAgZmxvYXQgc2NhbGVGYWN0b3IgPSBoIC8gdzsK
LSAgICBmbG9hdCByZXZlcnNlU2NhbGVGYWN0b3IgPSB3IC8gaDsKLSNlbmRpZgotICAgIGZsb2F0
IHIgPSB3IC8gMjsKLSAgICBmbG9hdCBmYSA9IHN0YXJ0QW5nbGU7Ci0gICAgZmxvYXQgZmFsZW4g
PSAgZmEgKyBhbmdsZVNwYW47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAg
Y2Fpcm9fc2F2ZShjcik7Ci0gICAgY2Fpcm9fYXJjX25lZ2F0aXZlKGNyLCB4ICsgciwgeSArIHIs
IHIsIC1mYSAqIE1fUEkvMTgwLCAtZmFsZW4gKiBNX1BJLzE4MCk7Ci0gICAgc2V0Q29sb3IoY3Is
IHN0cm9rZUNvbG9yKCkpOwotICAgIGNhaXJvX3NldF9saW5lX3dpZHRoKGNyLCBzdHJva2VUaGlj
a25lc3MoKSk7Ci0gICAgY2Fpcm9fc3Ryb2tlKGNyKTsKLSAgICBjYWlyb19yZXN0b3JlKGNyKTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdDb252ZXhQb2x5Z29uKHNpemVfdCBucG9p
bnRzLCBjb25zdCBGbG9hdFBvaW50KiBwb2ludHMsIGJvb2wgc2hvdWxkQW50aWFsaWFzKQotewot
ICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChu
cG9pbnRzIDw9IDEpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRh
LT5jcjsKLQotICAgIGNhaXJvX3NhdmUoY3IpOwotICAgIGNhaXJvX3NldF9hbnRpYWxpYXMoY3Is
IHNob3VsZEFudGlhbGlhcyA/IENBSVJPX0FOVElBTElBU19ERUZBVUxUIDogQ0FJUk9fQU5USUFM
SUFTX05PTkUpOwotICAgIGNhaXJvX21vdmVfdG8oY3IsIHBvaW50c1swXS54KCksIHBvaW50c1sw
XS55KCkpOwotICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbnBvaW50czsgaSsrKQotICAgICAg
ICBjYWlyb19saW5lX3RvKGNyLCBwb2ludHNbaV0ueCgpLCBwb2ludHNbaV0ueSgpKTsKLSAgICBj
YWlyb19jbG9zZV9wYXRoKGNyKTsKLQotICAgIGlmIChmaWxsQ29sb3IoKS5hbHBoYSgpKSB7Ci0g
ICAgICAgIHNldENvbG9yKGNyLCBmaWxsQ29sb3IoKSk7Ci0gICAgICAgIGNhaXJvX3NldF9maWxs
X3J1bGUoY3IsIENBSVJPX0ZJTExfUlVMRV9FVkVOX09ERCk7Ci0gICAgICAgIGNhaXJvX2ZpbGxf
cHJlc2VydmUoY3IpOwotICAgIH0KLQotICAgIGlmIChzdHJva2VTdHlsZSgpICE9IE5vU3Ryb2tl
KSB7Ci0gICAgICAgIHNldENvbG9yKGNyLCBzdHJva2VDb2xvcigpKTsKLSAgICAgICAgY2Fpcm9f
c2V0X2xpbmVfd2lkdGgoY3IsIHN0cm9rZVRoaWNrbmVzcygpKTsKLSAgICAgICAgY2Fpcm9fc3Ry
b2tlKGNyKTsKLSAgICB9Ci0KLSAgICBjYWlyb19uZXdfcGF0aChjcik7Ci0gICAgY2Fpcm9fcmVz
dG9yZShjcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpmaWxsUmVjdChjb25zdCBJbnRS
ZWN0JiByZWN0LCBjb25zdCBDb2xvciYgY29sb3IpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJs
ZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKGNvbG9yLmFscGhhKCkpCi0gICAgICAg
IGZpbGxSZWN0U291cmNlT3ZlcihtX2RhdGEtPmNyLCByZWN0LCBjb2xvcik7Ci19Ci0KLXZvaWQg
R3JhcGhpY3NDb250ZXh0OjpmaWxsUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0IENv
bG9yJiBjb2xvcikKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBpZiAoY29sb3IuYWxwaGEoKSkKLSAgICAgICAgZmlsbFJlY3RTb3VyY2VPdmVy
KG1fZGF0YS0+Y3IsIHJlY3QsIGNvbG9yKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNs
aXAoY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fp
cm9fcmVjdGFuZ2xlKGNyLCByZWN0LngoKSwgcmVjdC55KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5o
ZWlnaHQoKSk7Ci0gICAgY2Fpcm9fZmlsbF9ydWxlX3Qgc2F2ZWRGaWxsUnVsZSA9IGNhaXJvX2dl
dF9maWxsX3J1bGUoY3IpOwotICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIENBSVJPX0ZJTExf
UlVMRV9XSU5ESU5HKTsKLSAgICBjYWlyb19jbGlwKGNyKTsKLSAgICBjYWlyb19zZXRfZmlsbF9y
dWxlKGNyLCBzYXZlZEZpbGxSdWxlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdG
b2N1c1JpbmcoY29uc3QgQ29sb3ImIGNvbG9yKQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVk
KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGludCByYWRpdXMgPSAoZm9jdXNSaW5nV2lkdGgo
KSAtIDEpIC8gMjsKLSAgICBpbnQgb2Zmc2V0ID0gcmFkaXVzICsgZm9jdXNSaW5nT2Zmc2V0KCk7
Ci0KLSAgICBjb25zdCBWZWN0b3I8SW50UmVjdD4mIHJlY3RzID0gZm9jdXNSaW5nUmVjdHMoKTsK
LSAgICB1bnNpZ25lZCByZWN0Q291bnQgPSByZWN0cy5zaXplKCk7Ci0gICAgSW50UmVjdCBmaW5h
bEZvY3VzUmVjdDsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcmVjdENvdW50OyBpKysp
IHsKLSAgICAgICAgSW50UmVjdCBmb2N1c1JlY3QgPSByZWN0c1tpXTsKLSAgICAgICAgZm9jdXNS
ZWN0LmluZmxhdGUob2Zmc2V0KTsKLSAgICAgICAgZmluYWxGb2N1c1JlY3QudW5pdGUoZm9jdXNS
ZWN0KTsKLSAgICB9Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9f
c2F2ZShjcik7Ci0gICAgLy8gRklYTUU6IFRoZXNlIHJlY3RzIHNob3VsZCBiZSByb3VuZGVkCi0g
ICAgY2Fpcm9fcmVjdGFuZ2xlKGNyLCBmaW5hbEZvY3VzUmVjdC54KCksIGZpbmFsRm9jdXNSZWN0
LnkoKSwgZmluYWxGb2N1c1JlY3Qud2lkdGgoKSwgZmluYWxGb2N1c1JlY3QuaGVpZ2h0KCkpOwot
Ci0gICAgLy8gRm9yY2UgdGhlIGFscGhhIHRvIDUwJS4gIFRoaXMgbWF0Y2hlcyB3aGF0IHRoZSBN
YWMgZG9lcyB3aXRoIG91dGxpbmUgcmluZ3MuCi0gICAgQ29sb3IgcmluZ0NvbG9yKGNvbG9yLnJl
ZCgpLCBjb2xvci5ncmVlbigpLCBjb2xvci5ibHVlKCksIDEyNyk7Ci0gICAgc2V0Q29sb3IoY3Is
IHJpbmdDb2xvcik7Ci0gICAgY2Fpcm9fc3Ryb2tlKGNyKTsKLSAgICBjYWlyb19yZXN0b3JlKGNy
KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yVGV4dChjb25zdCBJbnRQ
b2ludCYgb3JpZ2luLCBpbnQgd2lkdGgsIGJvb2wgcHJpbnRpbmcpCi17Ci0gICAgaWYgKHBhaW50
aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gVGhpcyBpcyBhIHdvcmth
cm91bmQgZm9yIGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NjU5Ci0g
ICAgU3Ryb2tlU3R5bGUgc2F2ZWRTdHJva2VTdHlsZSA9IHN0cm9rZVN0eWxlKCk7Ci0gICAgc2V0
U3Ryb2tlU3R5bGUoU29saWRTdHJva2UpOwotCi0gICAgSW50UG9pbnQgZW5kUG9pbnQgPSBvcmln
aW4gKyBJbnRTaXplKHdpZHRoLCAwKTsKLSAgICBkcmF3TGluZShvcmlnaW4sIGVuZFBvaW50KTsK
LQotICAgIHNldFN0cm9rZVN0eWxlKHNhdmVkU3Ryb2tlU3R5bGUpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JNaXNzcGVsbGluZ09yQmFkR3JhbW1hcihjb25zdCBJbnRQ
b2ludCYgb3JpZ2luLCBpbnQgd2lkdGgsIGJvb2wgZ3JhbW1hcikKLXsKLSAgICBpZiAocGFpbnRp
bmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSNpZiBQTEFURk9STShHVEspCi0gICAg
Y2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotICAgIGNhaXJvX3NhdmUoY3IpOwotCi0gICAgLy8g
Q29udmVudGlvbiBpcyBncmVlbiBmb3IgZ3JhbW1hciwgcmVkIGZvciBzcGVsbGluZwotICAgIC8v
IFRoZXNlIG5lZWQgdG8gYmVjb21lIGNvbmZpZ3VyYWJsZQotICAgIGlmIChncmFtbWFyKQotICAg
ICAgICBjYWlyb19zZXRfc291cmNlX3JnYihjciwgMCwgMSwgMCk7Ci0gICAgZWxzZQotICAgICAg
ICBjYWlyb19zZXRfc291cmNlX3JnYihjciwgMSwgMCwgMCk7Ci0KLSAgICAvLyBXZSBpZ25vcmUg
bW9zdCBvZiB0aGUgcHJvdmlkZWQgY29uc3RhbnRzIGluIGZhdm91ciBvZiB0aGUgcGxhdGZvcm0g
c3R5bGUKLSAgICBwYW5nb19jYWlyb19zaG93X2Vycm9yX3VuZGVybGluZShjciwgb3JpZ2luLngo
KSwgb3JpZ2luLnkoKSwgd2lkdGgsIGNNaXNzcGVsbGluZ0xpbmVUaGlja25lc3MpOwotCi0gICAg
Y2Fpcm9fcmVzdG9yZShjcik7Ci0jZWxzZQotICAgIG5vdEltcGxlbWVudGVkKCk7CisjaWYgUExB
VEZPUk0oV0lOKQorICAgIC8vIE9uIFdpbmRvd3MsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBIREMg
Zm9yIGZvcm0gY29udHJvbHMgdG8gZHJhdyBpbiB0aGUgcmlnaHQgcGxhY2UuCisgICAgdm9pZCBi
ZWdpblRyYW5zcGFyZW5jeUxheWVyKCkgeyBtX3RyYW5zcGFyZW5jeUNvdW50Kys7IH0KKyAgICB2
b2lkIGVuZFRyYW5zcGFyZW5jeUxheWVyKCkgeyBtX3RyYW5zcGFyZW5jeUNvdW50LS07IH0KICNl
bmRpZgotfQotCi1GbG9hdFJlY3QgR3JhcGhpY3NDb250ZXh0Ojpyb3VuZFRvRGV2aWNlUGl4ZWxz
KGNvbnN0IEZsb2F0UmVjdCYgZnJlY3QpCi17Ci0gICAgRmxvYXRSZWN0IHJlc3VsdDsKLSAgICBk
b3VibGUgeCA9IGZyZWN0LngoKTsKLSAgICBkb3VibGUgeSA9IGZyZWN0LnkoKTsKLSAgICBjYWly
b190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fdXNlcl90b19kZXZpY2UoY3IsICZ4LCAm
eSk7Ci0gICAgeCA9IHJvdW5kKHgpOwotICAgIHkgPSByb3VuZCh5KTsKLSAgICBjYWlyb19kZXZp
Y2VfdG9fdXNlcihjciwgJngsICZ5KTsKLSAgICByZXN1bHQuc2V0WChzdGF0aWNfY2FzdDxmbG9h
dD4oeCkpOwotICAgIHJlc3VsdC5zZXRZKHN0YXRpY19jYXN0PGZsb2F0Pih5KSk7Ci0gICAgeCA9
IGZyZWN0LndpZHRoKCk7Ci0gICAgeSA9IGZyZWN0LmhlaWdodCgpOwotICAgIGNhaXJvX3VzZXJf
dG9fZGV2aWNlX2Rpc3RhbmNlKGNyLCAmeCwgJnkpOwotICAgIHggPSByb3VuZCh4KTsKLSAgICB5
ID0gcm91bmQoeSk7Ci0gICAgY2Fpcm9fZGV2aWNlX3RvX3VzZXJfZGlzdGFuY2UoY3IsICZ4LCAm
eSk7Ci0gICAgcmVzdWx0LnNldFdpZHRoKHN0YXRpY19jYXN0PGZsb2F0Pih4KSk7Ci0gICAgcmVz
dWx0LnNldEhlaWdodChzdGF0aWNfY2FzdDxmbG9hdD4oeSkpOwotICAgIHJldHVybiByZXN1bHQ7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0Ojp0cmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSkK
LXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBj
YWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fdHJhbnNsYXRlKGNyLCB4LCB5KTsK
LX0KLQotSW50UG9pbnQgR3JhcGhpY3NDb250ZXh0OjpvcmlnaW4oKQotewotICAgIGNhaXJvX21h
dHJpeF90IG1hdHJpeDsKLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9f
Z2V0X21hdHJpeChjciwgJm1hdHJpeCk7Ci0gICAgcmV0dXJuIEludFBvaW50KHN0YXRpY19jYXN0
PGludD4obWF0cml4LngwKSwgc3RhdGljX2Nhc3Q8aW50PihtYXRyaXgueTApKTsKLX0KLQotdm9p
ZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtRmlsbENvbG9yKGNvbnN0IENvbG9yJiBjb2wp
Ci17Ci0gICAgLy8gRklYTUU6IHRoaXMgaXMgcHJvYmFibHkgYSBuby1vcCBidXQgSSdtIG5vdCBz
dXJlCi0gICAgLy8gbm90SW1wbGVtZW50ZWQoKTsgLy8gY29tbWVudGVkLW91dCBiZWNhdXNlIGl0
J3MgY2hhdHR5IGFuZCBjbHV0dGVycyBvdXRwdXQKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6
OnNldFBsYXRmb3JtU3Ryb2tlQ29sb3IoY29uc3QgQ29sb3ImIGNvbCkKLXsKLSAgICAvLyBGSVhN
RTogdGhpcyBpcyBwcm9iYWJseSBhIG5vLW9wIGJ1dCBJJ20gbm90IHN1cmUKLSAgICAvL25vdElt
cGxlbWVudGVkKCk7IC8vIGNvbW1lbnRlZC1vdXQgYmVjYXVzZSBpdCdzIGNoYXR0eSBhbmQgY2x1
dHRlcnMgb3V0cHV0Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVN0cm9r
ZVRoaWNrbmVzcyhmbG9hdCBzdHJva2VUaGlja25lc3MpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlz
YWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgobV9k
YXRhLT5jciwgc3Ryb2tlVGhpY2tuZXNzKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNl
dFBsYXRmb3JtU3Ryb2tlU3R5bGUoY29uc3QgU3Ryb2tlU3R5bGUmIHN0cm9rZVN0eWxlKQotewot
ICAgIHN0YXRpYyBkb3VibGUgZGFzaFBhdHRlcm5bXSA9IHs1LjAsIDUuMH07Ci0gICAgc3RhdGlj
IGRvdWJsZSBkb3RQYXR0ZXJuW10gPSB7MS4wLCAxLjB9OwotCi0gICAgaWYgKHBhaW50aW5nRGlz
YWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgc3dpdGNoIChzdHJva2VTdHlsZSkgewot
ICAgIGNhc2UgTm9TdHJva2U6Ci0gICAgICAgIC8vIEZJWE1FOiBpcyBpdCB0aGUgcmlnaHQgd2F5
IHRvIGVtdWxhdGUgTm9TdHJva2U/Ci0gICAgICAgIGNhaXJvX3NldF9saW5lX3dpZHRoKG1fZGF0
YS0+Y3IsIDApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFNvbGlkU3Ryb2tlOgotICAgICAg
ICBjYWlyb19zZXRfZGFzaChtX2RhdGEtPmNyLCAwLCAwLCAwKTsKLSAgICAgICAgYnJlYWs7Ci0g
ICAgY2FzZSBEb3R0ZWRTdHJva2U6Ci0gICAgICAgIGNhaXJvX3NldF9kYXNoKG1fZGF0YS0+Y3Is
IGRvdFBhdHRlcm4sIDIsIDApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERhc2hlZFN0cm9r
ZToKLSAgICAgICAgY2Fpcm9fc2V0X2Rhc2gobV9kYXRhLT5jciwgZGFzaFBhdHRlcm4sIDIsIDAp
OwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBub3RJbXBsZW1lbnRlZCgp
OwotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRV
UkxGb3JSZWN0KGNvbnN0IEtVUkwmIGxpbmssIGNvbnN0IEludFJlY3QmIGRlc3RSZWN0KQotewot
ICAgIG5vdEltcGxlbWVudGVkKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0Ojpjb25jYXRD
VE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFuc2Zvcm0pCi17Ci0gICAgaWYgKHBhaW50aW5n
RGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEt
PmNyOwotICAgIGNvbnN0IGNhaXJvX21hdHJpeF90KiBtYXRyaXggPSByZWludGVycHJldF9jYXN0
PGNvbnN0IGNhaXJvX21hdHJpeF90Kj4oJnRyYW5zZm9ybSk7Ci0gICAgY2Fpcm9fdHJhbnNmb3Jt
KGNyLCBtYXRyaXgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6YWRkSW5uZXJSb3VuZGVk
UmVjdENsaXAoY29uc3QgSW50UmVjdCYgcmVjdCwgaW50IHRoaWNrbmVzcykKLXsKLSAgICBpZiAo
cGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjbGlwKHJlY3QpOwot
Ci0gICAgUGF0aCBwOwotICAgIEZsb2F0UmVjdCByKHJlY3QpOwotICAgIC8vIEFkZCBvdXRlciBl
bGxpcHNlCi0gICAgcC5hZGRFbGxpcHNlKHIpOwotICAgIC8vIEFkZCBpbm5lciBlbGxpcHNlCi0g
ICAgci5pbmZsYXRlKC10aGlja25lc3MpOwotICAgIHAuYWRkRWxsaXBzZShyKTsKLSAgICBhZGRQ
YXRoKHApOwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotICAgIGNhaXJvX2ZpbGxf
cnVsZV90IHNhdmVkRmlsbFJ1bGUgPSBjYWlyb19nZXRfZmlsbF9ydWxlKGNyKTsKLSAgICBjYWly
b19zZXRfZmlsbF9ydWxlKGNyLCBDQUlST19GSUxMX1JVTEVfRVZFTl9PREQpOwotICAgIGNhaXJv
X2NsaXAoY3IpOwotICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIHNhdmVkRmlsbFJ1bGUpOwot
fQotCi0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRTaGFkb3coSW50U2l6ZSBjb25zdCYsIGlu
dCwgQ29sb3IgY29uc3QmKQotewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpjbGVhclNoYWRvdygpCi17Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmJlZ2luVHJhbnNwYXJlbmN5TGF5ZXIoZmxvYXQgb3Bh
Y2l0eSkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fcHVzaF9ncm91cChjcik7
Ci0gICAgbV9kYXRhLT5sYXllcnMuYXBwZW5kKG9wYWNpdHkpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDo6ZW5kVHJhbnNwYXJlbmN5TGF5ZXIoKQotewotICAgIGlmIChwYWludGluZ0Rpc2Fi
bGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsK
LQotICAgIGNhaXJvX3BvcF9ncm91cF90b19zb3VyY2UoY3IpOwotICAgIGNhaXJvX3BhaW50X3dp
dGhfYWxwaGEoY3IsIG1fZGF0YS0+bGF5ZXJzLmxhc3QoKSk7Ci0gICAgbV9kYXRhLT5sYXllcnMu
cmVtb3ZlTGFzdCgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xlYXJSZWN0KGNvbnN0
IEZsb2F0UmVjdCYgcmVjdCkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0KLSAgICBjYWlyb19z
YXZlKGNyKTsKLSAgICBjYWlyb19yZWN0YW5nbGUoY3IsIHJlY3QueCgpLCByZWN0LnkoKSwgcmVj
dC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKLSAgICBjYWlyb19zZXRfb3BlcmF0b3IoY3IsIENB
SVJPX09QRVJBVE9SX0NMRUFSKTsKLSAgICBjYWlyb19maWxsKGNyKTsKLSAgICBjYWlyb19yZXN0
b3JlKGNyKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnN0cm9rZVJlY3QoY29uc3QgRmxv
YXRSZWN0JiByZWN0LCBmbG9hdCB3aWR0aCkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgp
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAg
Y2Fpcm9fc2F2ZShjcik7Ci0gICAgY2Fpcm9fcmVjdGFuZ2xlKGNyLCByZWN0LngoKSwgcmVjdC55
KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7Ci0gICAgc2V0Q29sb3IoY3IsIHN0cm9r
ZUNvbG9yKCkpOwotICAgIGNhaXJvX3NldF9saW5lX3dpZHRoKGNyLCB3aWR0aCk7Ci0gICAgY2Fp
cm9fc3Ryb2tlKGNyKTsKLSAgICBjYWlyb19yZXN0b3JlKGNyKTsKLX0KLQotdm9pZCBHcmFwaGlj
c0NvbnRleHQ6OnNldExpbmVDYXAoTGluZUNhcCBsaW5lQ2FwKQotewotICAgIGlmIChwYWludGlu
Z0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX2xpbmVfY2FwX3QgY2Fp
cm9DYXAgPSBDQUlST19MSU5FX0NBUF9CVVRUOwotICAgIHN3aXRjaCAobGluZUNhcCkgewotICAg
ICAgICBjYXNlIEJ1dHRDYXA6Ci0gICAgICAgICAgICAvLyBuby1vcAotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIGNhc2UgUm91bmRDYXA6Ci0gICAgICAgICAgICBjYWlyb0NhcCA9IENBSVJP
X0xJTkVfQ0FQX1JPVU5EOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU3F1YXJl
Q2FwOgotICAgICAgICAgICAgY2Fpcm9DYXAgPSBDQUlST19MSU5FX0NBUF9TUVVBUkU7Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY2Fpcm9fc2V0X2xpbmVfY2FwKG1fZGF0YS0+Y3Is
IGNhaXJvQ2FwKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldExpbmVKb2luKExpbmVK
b2luIGxpbmVKb2luKQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIGNhaXJvX2xpbmVfam9pbl90IGNhaXJvSm9pbiA9IENBSVJPX0xJTkVfSk9J
Tl9NSVRFUjsKLSAgICBzd2l0Y2ggKGxpbmVKb2luKSB7Ci0gICAgICAgIGNhc2UgTWl0ZXJKb2lu
OgotICAgICAgICAgICAgLy8gbm8tb3AKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNl
IFJvdW5kSm9pbjoKLSAgICAgICAgICAgIGNhaXJvSm9pbiA9IENBSVJPX0xJTkVfSk9JTl9ST1VO
RDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJldmVsSm9pbjoKLSAgICAgICAg
ICAgIGNhaXJvSm9pbiA9IENBSVJPX0xJTkVfSk9JTl9CRVZFTDsKLSAgICAgICAgICAgIGJyZWFr
OwotICAgIH0KLSAgICBjYWlyb19zZXRfbGluZV9qb2luKG1fZGF0YS0+Y3IsIGNhaXJvSm9pbik7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRNaXRlckxpbWl0KGZsb2F0IG1pdGVyKQot
ewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNh
aXJvX3NldF9taXRlcl9saW1pdChtX2RhdGEtPmNyLCBtaXRlcik7Ci19Ci0KLXZvaWQgR3JhcGhp
Y3NDb250ZXh0OjpzZXRBbHBoYShmbG9hdCkKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotfQot
Ci1zdGF0aWMgaW5saW5lIGNhaXJvX29wZXJhdG9yX3QgdG9DYWlyb09wZXJhdG9yKENvbXBvc2l0
ZU9wZXJhdG9yIG9wKQotewotICAgIHN3aXRjaCAob3ApIHsKLSAgICAgICAgY2FzZSBDb21wb3Np
dGVDbGVhcjoKLSAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9DTEVBUjsKLSAgICAg
ICAgY2FzZSBDb21wb3NpdGVDb3B5OgotICAgICAgICAgICAgcmV0dXJuIENBSVJPX09QRVJBVE9S
X1NPVVJDRTsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VPdmVyOgotICAgICAgICAgICAg
cmV0dXJuIENBSVJPX09QRVJBVE9SX09WRVI7Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRlU291cmNl
SW46Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfSU47Ci0gICAgICAgIGNhc2Ug
Q29tcG9zaXRlU291cmNlT3V0OgotICAgICAgICAgICAgcmV0dXJuIENBSVJPX09QRVJBVE9SX09V
VDsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VBdG9wOgotICAgICAgICAgICAgcmV0dXJu
IENBSVJPX09QRVJBVE9SX0FUT1A7Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRlRGVzdGluYXRpb25P
dmVyOgotICAgICAgICAgICAgcmV0dXJuIENBSVJPX09QRVJBVE9SX0RFU1RfT1ZFUjsKLSAgICAg
ICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlvbkluOgotICAgICAgICAgICAgcmV0dXJuIENBSVJP
X09QRVJBVE9SX0RFU1RfSU47Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRlRGVzdGluYXRpb25PdXQ6
Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfREVTVF9PVVQ7Ci0gICAgICAgIGNh
c2UgQ29tcG9zaXRlRGVzdGluYXRpb25BdG9wOgotICAgICAgICAgICAgcmV0dXJuIENBSVJPX09Q
RVJBVE9SX0RFU1RfQVRPUDsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVYT1I6Ci0gICAgICAgICAg
ICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfWE9SOwotICAgICAgICBjYXNlIENvbXBvc2l0ZVBsdXNE
YXJrZXI6Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfU0FUVVJBVEU7Ci0gICAg
ICAgIGNhc2UgQ29tcG9zaXRlSGlnaGxpZ2h0OgotICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8g
Q2Fpcm8gZXF1aXZhbGVudCBmb3IgQ29tcG9zaXRlSGlnaGxpZ2h0LgotICAgICAgICAgICAgcmV0
dXJuIENBSVJPX09QRVJBVE9SX09WRVI7Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRlUGx1c0xpZ2h0
ZXI6Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfQUREOwotICAgICAgICBkZWZh
dWx0OgotICAgICAgICAgICAgcmV0dXJuIENBSVJPX09QRVJBVE9SX1NPVVJDRTsKLSAgICB9Ci19
CiAKLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRDb21wb3NpdGVPcGVyYXRpb24oQ29tcG9zaXRl
T3BlcmF0b3Igb3ApCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgY2Fpcm9fc2V0X29wZXJhdG9yKG1fZGF0YS0+Y3IsIHRvQ2Fpcm9PcGVyYXRv
cihvcCkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6YmVnaW5QYXRoKCkKLXsKLSAgICBp
ZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBj
ciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fbmV3X3BhdGgoY3IpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDo6YWRkUGF0aChjb25zdCBQYXRoJiBwYXRoKQotewotICAgIGlmIChwYWludGlu
Z0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRh
LT5jcjsKLSAgICBjYWlyb19wYXRoX3QqIHAgPSBjYWlyb19jb3B5X3BhdGgocGF0aC5wbGF0Zm9y
bVBhdGgoKS0+bV9jcik7Ci0gICAgY2Fpcm9fYXBwZW5kX3BhdGgoY3IsIHApOwotICAgIGNhaXJv
X3BhdGhfZGVzdHJveShwKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXAoY29uc3Qg
UGF0aCYgcGF0aCkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fcGF0aF90KiBw
ID0gY2Fpcm9fY29weV9wYXRoKHBhdGgucGxhdGZvcm1QYXRoKCktPm1fY3IpOwotICAgIGNhaXJv
X2FwcGVuZF9wYXRoKGNyLCBwKTsKLSAgICBjYWlyb19wYXRoX2Rlc3Ryb3kocCk7Ci0gICAgY2Fp
cm9fZmlsbF9ydWxlX3Qgc2F2ZWRGaWxsUnVsZSA9IGNhaXJvX2dldF9maWxsX3J1bGUoY3IpOwot
ICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIENBSVJPX0ZJTExfUlVMRV9XSU5ESU5HKTsKLSAg
ICBjYWlyb19jbGlwKGNyKTsKLSAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNyLCBzYXZlZEZpbGxS
dWxlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBPdXQoY29uc3QgUGF0aCYgcGF0
aCkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgZG91YmxlIHgxLCB5MSwgeDIsIHkyOwot
ICAgIGNhaXJvX2NsaXBfZXh0ZW50cyhjciwgJngxLCAmeTEsICZ4MiwgJnkyKTsKLSAgICBjYWly
b19yZWN0YW5nbGUoY3IsIHgxLCB5MSwgeDIgLSB4MSwgeTIgLSB5MSk7Ci0gICAgYWRkUGF0aChw
YXRoKTsKLQotICAgIGNhaXJvX2ZpbGxfcnVsZV90IHNhdmVkRmlsbFJ1bGUgPSBjYWlyb19nZXRf
ZmlsbF9ydWxlKGNyKTsKLSAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNyLCBDQUlST19GSUxMX1JV
TEVfRVZFTl9PREQpOwotICAgIGNhaXJvX2NsaXAoY3IpOwotICAgIGNhaXJvX3NldF9maWxsX3J1
bGUoY3IsIHNhdmVkRmlsbFJ1bGUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6cm90YXRl
KGZsb2F0IHJhZGlhbnMpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgY2Fpcm9fcm90YXRlKG1fZGF0YS0+Y3IsIHJhZGlhbnMpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDo6c2NhbGUoY29uc3QgRmxvYXRTaXplJiBzaXplKQotewotICAg
IGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3Nj
YWxlKG1fZGF0YS0+Y3IsIHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSk7Ci19Ci0KLXZvaWQg
R3JhcGhpY3NDb250ZXh0OjpjbGlwT3V0KGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgaWYgKHBh
aW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fdCogY3IgPSBt
X2RhdGEtPmNyOwotICAgIGRvdWJsZSB4MSwgeTEsIHgyLCB5MjsKLSAgICBjYWlyb19jbGlwX2V4
dGVudHMoY3IsICZ4MSwgJnkxLCAmeDIsICZ5Mik7Ci0gICAgY2Fpcm9fcmVjdGFuZ2xlKGNyLCB4
MSwgeDIsIHgyIC0geDEsIHkyIC0geTEpOwotICAgIGNhaXJvX3JlY3RhbmdsZShjciwgci54KCks
IHIueSgpLCByLndpZHRoKCksIHIuaGVpZ2h0KCkpOwotICAgIGNhaXJvX2ZpbGxfcnVsZV90IHNh
dmVkRmlsbFJ1bGUgPSBjYWlyb19nZXRfZmlsbF9ydWxlKGNyKTsKLSAgICBjYWlyb19zZXRfZmls
bF9ydWxlKGNyLCBDQUlST19GSUxMX1JVTEVfRVZFTl9PREQpOwotICAgIGNhaXJvX2NsaXAoY3Ip
OwotICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIHNhdmVkRmlsbFJ1bGUpOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDo6Y2xpcE91dEVsbGlwc2VJblJlY3QoY29uc3QgSW50UmVjdCYgcikK
LXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBQ
YXRoIHA7Ci0gICAgcC5hZGRFbGxpcHNlKHIpOwotICAgIGNsaXBPdXQocCk7Ci19Ci0KLXZvaWQg
R3JhcGhpY3NDb250ZXh0OjpmaWxsUm91bmRlZFJlY3QoY29uc3QgSW50UmVjdCYgciwgY29uc3Qg
SW50U2l6ZSYgdG9wTGVmdCwgY29uc3QgSW50U2l6ZSYgdG9wUmlnaHQsIGNvbnN0IEludFNpemUm
IGJvdHRvbUxlZnQsIGNvbnN0IEludFNpemUmIGJvdHRvbVJpZ2h0LCBjb25zdCBDb2xvciYgY29s
b3IpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotICAgIGNhaXJvX3NhdmUoY3IpOwotICAgIGJl
Z2luUGF0aCgpOwotICAgIGFkZFBhdGgoUGF0aDo6Y3JlYXRlUm91bmRlZFJlY3RhbmdsZShyLCB0
b3BMZWZ0LCB0b3BSaWdodCwgYm90dG9tTGVmdCwgYm90dG9tUmlnaHQpKTsKLSAgICBzZXRDb2xv
cihjciwgY29sb3IpOwotICAgIGNhaXJvX2ZpbGwoY3IpOwotICAgIGNhaXJvX3Jlc3RvcmUoY3Ip
OwotfQorICAgIGNhaXJvX3QqIGNyOworICAgIFZlY3RvcjxmbG9hdD4gbGF5ZXJzOwogCiAjaWYg
UExBVEZPUk0oR1RLKQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldEdka0V4cG9zZUV2ZW50KEdk
a0V2ZW50RXhwb3NlKiBleHBvc2UpCi17Ci0gICAgbV9kYXRhLT5leHBvc2UgPSBleHBvc2U7Ci19
Ci0KLUdka0V2ZW50RXhwb3NlKiBHcmFwaGljc0NvbnRleHQ6Omdka0V4cG9zZUV2ZW50KCkgY29u
c3QKLXsKLSAgICByZXR1cm4gbV9kYXRhLT5leHBvc2U7Ci19Ci0KLUdka0RyYXdhYmxlKiBHcmFw
aGljc0NvbnRleHQ6Omdka0RyYXdhYmxlKCkgY29uc3QKLXsKLSAgICBpZiAoIW1fZGF0YS0+ZXhw
b3NlKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiBHREtfRFJBV0FCTEUobV9kYXRh
LT5leHBvc2UtPndpbmRvdyk7Ci19Ci0KLUludFBvaW50IEdyYXBoaWNzQ29udGV4dDo6dHJhbnNs
YXRlUG9pbnQoY29uc3QgSW50UG9pbnQmIHBvaW50KSBjb25zdAotewotICAgIGNhaXJvX21hdHJp
eF90IHRtOwotICAgIGNhaXJvX2dldF9tYXRyaXgobV9kYXRhLT5jciwgJnRtKTsKLSAgICBkb3Vi
bGUgeCA9IHBvaW50LngoKTsKLSAgICBkb3VibGUgeSA9IHBvaW50LnkoKTsKLQotICAgIGNhaXJv
X21hdHJpeF90cmFuc2Zvcm1fcG9pbnQoJnRtLCAmeCwgJnkpOwotICAgIHJldHVybiBJbnRQb2lu
dCh4LCB5KTsKLX0KKyAgICBHZGtFdmVudEV4cG9zZSogZXhwb3NlOworI2VsaWYgUExBVEZPUk0o
V0lOKQorICAgIEhEQyBtX2hkYzsKKyAgICB1bnNpZ25lZCBtX3RyYW5zcGFyZW5jeUNvdW50Owog
I2VuZGlmCi0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRVc2VBbnRpYWxpYXNpbmcoYm9vbCBl
bmFibGUpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgLy8gV2hlbiB0cnVlLCB1c2UgdGhlIGRlZmF1bHQgQ2Fpcm8gYmFja2VuZCBhbnRpYWxp
YXMgbW9kZSAodXN1YWxseSB0aGlzCi0gICAgLy8gZW5hYmxlcyBzdGFuZGFyZCAnZ3JheXNjYWxl
JyBhbnRpYWxpYXNpbmcpOyBmYWxzZSB0byBleHBsaWNpdGx5IGRpc2FibGUKLSAgICAvLyBhbnRp
YWxpYXNpbmcuIFRoaXMgaXMgdGhlIHNhbWUgc3RyYXRlZ3kgYXMgdXNlZCBpbiBkcmF3Q29udmV4
UG9seWdvbigpLgotICAgIGNhaXJvX3NldF9hbnRpYWxpYXMobV9kYXRhLT5jciwgZW5hYmxlID8g
Q0FJUk9fQU5USUFMSUFTX0RFRkFVTFQgOiBDQUlST19BTlRJQUxJQVNfTk9ORSk7Ci19Cit9Owog
CiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0ZvbnRDR1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW4vRm9udENHV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCShmcm9tIFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRXaW4uY3BwOjI5ODM0KQorKysgV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vRm9udENHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDIy
NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRm9u
dC5oIgorCisjaW5jbHVkZSAiRm9udEZhbGxiYWNrTGlzdC5oIgorI2luY2x1ZGUgIkdseXBoQnVm
ZmVyLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiSW50UmVjdC5o
IgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiU2ltcGxlRm9udERhdGEu
aCIKKyNpbmNsdWRlICJVbmlzY3JpYmVDb250cm9sbGVyLmgiCisjaW5jbHVkZSA8QXBwbGljYXRp
b25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CisjaW5jbHVkZSA8V2ViS2l0U3lzdGVt
SW50ZXJmYWNlL1dlYktpdFN5c3RlbUludGVyZmFjZS5oPgorI2luY2x1ZGUgPHd0Zi9NYXRoRXh0
cmFzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY29uc3QgaW50IHN5bnRoZXRpY09ibGlx
dWVBbmdsZSA9IDE0OworCit2b2lkIEZvbnQ6OmRyYXdHbHlwaHMoR3JhcGhpY3NDb250ZXh0KiBn
cmFwaGljc0NvbnRleHQsIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250LCBjb25zdCBHbHlwaEJ1
ZmZlciYgZ2x5cGhCdWZmZXIsIAorICAgICAgICAgICAgICAgICAgICAgIGludCBmcm9tLCBpbnQg
bnVtR2x5cGhzLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAgICBpZiAoZm9u
dC0+bV9mb250LnVzZUdESSgpKSB7CisgICAgICAgIC8vIEZJWE1FOiBTdXBwb3J0IGFscGhhIGJs
ZW5kaW5nLgorICAgICAgICAvLyBGSVhNRTogU3VwcG9ydCB0ZXh0IHN0cm9rZS9maWxsLgorICAg
ICAgICAvLyBGSVhNRTogU3VwcG9ydCB0ZXh0IHNoYWRvdy4KKyAgICAgICAgQ29sb3IgZmlsbENv
bG9yID0gZ3JhcGhpY3NDb250ZXh0LT5maWxsQ29sb3IoKTsKKyAgICAgICAgaWYgKGZpbGxDb2xv
ci5hbHBoYSgpID09IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gV2UgaGF2
ZSB0byBjb252ZXJ0IENHJ3MgdHdvLWRpbWVuc2lvbmFsIGZsb2F0aW5nIHBvaW50IGFkdmFuY2Vz
IHRvIGp1c3QgaG9yaXpvbnRhbCBpbnRlZ2VyIGFkdmFuY2VzLgorICAgICAgICBWZWN0b3I8aW50
LCAyMDQ4PiBnZGlBZHZhbmNlczsKKyAgICAgICAgaW50IHRvdGFsV2lkdGggPSAwOworICAgICAg
ICBmb3IgKGludCBpID0gMDsgaSA8IG51bUdseXBoczsgaSsrKSB7CisgICAgICAgICAgICBnZGlB
ZHZhbmNlcy5hcHBlbmQobHJvdW5kZihnbHlwaEJ1ZmZlci5hZHZhbmNlQXQoZnJvbSArIGkpKSk7
CisgICAgICAgICAgICB0b3RhbFdpZHRoICs9IGdkaUFkdmFuY2VzW2ldOworICAgICAgICB9CisK
KyAgICAgICAgLy8gV2UgcHV0IHNsb3AgaW50byB0aGlzIHJlY3QsIHNpbmNlIGdseXBocyBjYW4g
b3ZlcmZsb3cgdGhlIGFzY2VudC9kZXNjZW50IGJvdW5kcyBhbmQgdGhlIGxlZnQvcmlnaHQgZWRn
ZXMuCisgICAgICAgIGludCBsaW5lR2FwID0gZm9udC0+bGluZUdhcCgpOworICAgICAgICBJbnRS
ZWN0IHRleHRSZWN0KHBvaW50LngoKSAtIGxpbmVHYXAsIHBvaW50LnkoKSAtIGZvbnQtPmFzY2Vu
dCgpIC0gbGluZUdhcCwgdG90YWxXaWR0aCArIDIgKiBsaW5lR2FwLCBmb250LT5saW5lU3BhY2lu
ZygpKTsKKyAgICAgICAgSERDIGhkYyA9IGdyYXBoaWNzQ29udGV4dC0+Z2V0V2luZG93c0NvbnRl
eHQodGV4dFJlY3QpOworICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBmb250LT5tX2ZvbnQuaGZv
bnQoKSk7CisKKyAgICAgICAgLy8gU2V0IHRoZSBjb3JyZWN0IGNvbG9yLgorICAgICAgICBIREMg
dGV4dERyYXdpbmdEQyA9IGhkYzsKKyAgICAgICAgLyppZiAoZmlsbENvbG9yLmhhc0FscGhhKCkg
fHwgZ3JhcGhpY3NDb250ZXh0LT5pblRyYW5zcGFyZW5jeUxheWVyKCkpIHsKKyAgICAgICAgICAg
IC8vIEdESSBjYW4ndCBoYW5kbGUgZHJhd2luZyB0cmFuc3BhcmVudCB0ZXh0LiAgV2UgaGF2ZSB0
byBkcmF3IGludG8gYSBtYXNrLiAgV2UgZHJhdyBibGFjayB0ZXh0IG9uIGEgd2hpdGUtZmlsbGVk
IGJhY2tncm91bmQuCisgICAgICAgICAgICAvLyBXZSBhbHNvIGRvIHRoaXMgd2hlbiBpbnNpZGUg
dHJhbnNwYXJlbmN5IGxheWVycywgc2luY2UgR0RJIGFsc28gY2FuJ3QgZHJhdyBvbnRvIGEgc3Vy
ZmFjZSB3aXRoIGFscGhhLgorICAgICAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5zYXZlKCk7Cisg
ICAgICAgICAgICBncmFwaGljc0NvbnRleHQtPnNldEZpbGxDb2xvcihDb2xvcjo6d2hpdGUpOwor
ICAgICAgICAgICAgdGV4dERyYXdpbmdEQyA9IGdyYXBoaWNzQ29udGV4dC0+Z2V0V2luZG93c0Jp
dG1hcENvbnRleHQodGV4dFJlY3QpOworICAgICAgICAgICAgU2V0VGV4dENvbG9yKGhkYywgUkdC
KDAsIDAsIDApKTsKKyAgICAgICAgfSBlbHNlKi8KKyAgICAgICAgICAgIFNldFRleHRDb2xvciho
ZGMsIFJHQihmaWxsQ29sb3IucmVkKCksIGZpbGxDb2xvci5ncmVlbigpLCBmaWxsQ29sb3IuYmx1
ZSgpKSk7CisKKyAgICAgICAgU2V0QmtNb2RlKGhkYywgVFJBTlNQQVJFTlQpOworICAgICAgICBT
ZXRUZXh0QWxpZ24oaGRjLCBUQV9MRUZUIHwgVEFfQkFTRUxJTkUpOworCisgICAgICAgIC8vIFVu
aXNjcmliZSBnaXZlcyB1cyBvZmZzZXRzIHRvIGhlbHAgcmVmaW5lIHRoZSBwb3NpdGlvbmluZyBv
ZiBjb21iaW5pbmcgZ2x5cGhzLgorICAgICAgICBGbG9hdFNpemUgdHJhbnNsYXRpb24gPSBnbHlw
aEJ1ZmZlci5vZmZzZXRBdChmcm9tKTsKKyAgICAgICAgaWYgKHRyYW5zbGF0aW9uLndpZHRoKCkg
fHwgdHJhbnNsYXRpb24uaGVpZ2h0KCkpIHsKKyAgICAgICAgICAgIFhGT1JNIHhmb3JtOworICAg
ICAgICAgICAgeGZvcm0uZU0xMSA9IDEuMDsKKyAgICAgICAgICAgIHhmb3JtLmVNMTIgPSAwOwor
ICAgICAgICAgICAgeGZvcm0uZU0yMSA9IDA7CisgICAgICAgICAgICB4Zm9ybS5lTTIyID0gMS4w
OworICAgICAgICAgICAgeGZvcm0uZUR4ID0gdHJhbnNsYXRpb24ud2lkdGgoKTsKKyAgICAgICAg
ICAgIHhmb3JtLmVEeSA9IHRyYW5zbGF0aW9uLmhlaWdodCgpOworICAgICAgICAgICAgTW9kaWZ5
V29ybGRUcmFuc2Zvcm0oaGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOworICAgICAgICB9
CisgICAgICAgIEV4dFRleHRPdXQoaGRjLCBwb2ludC54KCksIHBvaW50LnkoKSwgRVRPX0dMWVBI
X0lOREVYLCAwLCAoV0NIQVIqKWdseXBoQnVmZmVyLmdseXBocyhmcm9tKSwgbnVtR2x5cGhzLCBn
ZGlBZHZhbmNlcy5kYXRhKCkpOworCisgICAgICAgIC8qaWYgKGZpbGxDb2xvci5oYXNBbHBoYSgp
IHx8IGdyYXBoaWNzQ29udGV4dC0+aW5UcmFuc3BhcmVuY3lMYXllcigpKSB7CisgICAgICAgICAg
ICAvLyBUT0RPRDogV2UgaGF2ZSB0byB3YWxrIHRoZSBiaXRzIG9mIHRoZSBiaXRtYXAgYW5kIGlu
dmVydCB0aGVtLiAgV2UgYWxzbyBjb3B5IG92ZXIgdGhlIGdyZWVuIGNvbXBvbmVudCB2YWx1ZSBp
bnRvIHRoZSBhbHBoYSB2YWx1ZQorICAgICAgICAgICAgLy8gdG8ga2VlcCBDbGVhclR5cGUgbG9v
a2luZyByZWFzb25hYmxlLgorCisgICAgICAgICAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGRyYXdu
IHRoZSB0ZXh0IGludG8gYSBiaXRtYXAgYW5kIGludmVydGVkIGl0LCBvYnRhaW4gYSBDR0ltYWdl
UmVmIG1hc2suCisgICAgICAgICAgICBDR0ltYWdlUmVmIG1hc2sgPSBncmFwaGljc0NvbnRleHQt
PnJlbGVhc2VXaW5kb3dzQml0bWFwQ29udGV4dEludG9NYXNrKHRleHREcmF3aW5nREMsIHRleHRS
ZWN0KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gQXBwbHkgdGhlIG1hc2sgdG8gdGhl
IGZpbGwgY29sb3IuCisgICAgICAgICAgICBDR0NvbnRleHRSZWYgYml0bWFwQ29udGV4dCA9IGdy
YXBoaWNzQ29udGV4dC0+Z2V0V2luZG93c0NvbXBhdGlibGVDR0JpdG1hcENvbnRleHQodGV4dFJl
Y3Quc2l6ZSgpKTsKKyAgICAgICAgICAgIENHRmxvYXQgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGE7
CisgICAgICAgICAgICBjb2xvci5nZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAg
ICAgICAgICAgIENHQ29udGV4dFNldFJHQkZpbGxDb2xvcihjb250ZXh0LCByZWQsIGdyZWVuLCBi
bHVlLCBhbHBoYSk7CisgICAgICAgICAgICBDR0NvbnRleHRGaWxsUmVjdChiaXRtYXBDb250ZXh0
LCBJbnRSZWN0KDAsIDAsIHRleHRSZWN0LndpZHRoKCksIHRleHRSZWN0LmhlaWdodCgpKSk7Cisg
ICAgICAgICAgICBDR0ltYWdlUmVmIGZpbGxDb2xvckltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3Jl
YXRlSW1hZ2UoYml0bWFwQ29udGV4dCk7CisgICAgICAgIAorICAgICAgICAgICAgLy8gQXBwbHkg
dGhlIG1hc2suCisgICAgICAgICAgICBDR0ltYWdlUmVmIGZpbmFsSW1hZ2UgPSBDR0ltYWdlQ3Jl
YXRlV2l0aE1hc2soZmlsbENvbG9ySW1hZ2UsIG1hc2spOworCisgICAgICAgICAgICAvLyBUaGUg
Yml0bWFwIGltYWdlIG5lZWRzIHRvIGJlIGRyYXduIGludG8gdGhlIEhEQy4KKyAgICAgICAgICAg
IGdyYXBoaWNzQ29udGV4dC0+ZHJhd0ltYWdlSW50b1dpbmRvd3NDb250ZXh0KGhkYywgZmluYWxJ
bWFnZSk7CisKKyAgICAgICAgICAgIC8vIFJlbGVhc2Ugb3VyIGltYWdlcyBhbmQgY29udGV4dHMu
CisgICAgICAgICAgICBDR0ltYWdlUmVsZWFzZShtYXNrKTsKKyAgICAgICAgICAgIENHSW1hZ2VS
ZWxlYXNlKGZpbGxDb2xvckltYWdlKTsKKyAgICAgICAgICAgIENHSW1hZ2VSZWxlYXNlKGZpbmFs
SW1hZ2UpOworICAgICAgICAgICAgQ0dDb250ZXh0UmVsZWFzZShiaXRtYXBDb250ZXh0KTsKKyAg
ICAgICAgfSovCisKKyAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5yZWxlYXNlV2luZG93c0NvbnRl
eHQoaGRjLCB0ZXh0UmVjdCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDR0NvbnRl
eHRSZWYgY2dDb250ZXh0ID0gZ3JhcGhpY3NDb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKKwor
ICAgIHVpbnQzMl90IG9sZEZvbnRTbW9vdGhpbmdTdHlsZSA9IHdrU2V0Rm9udFNtb290aGluZ1N0
eWxlKGNnQ29udGV4dCk7CisKKyAgICBjb25zdCBGb250UGxhdGZvcm1EYXRhJiBwbGF0Zm9ybURh
dGEgPSBmb250LT5wbGF0Zm9ybURhdGEoKTsKKworICAgIENHQ29udGV4dFNldEZvbnQoY2dDb250
ZXh0LCBwbGF0Zm9ybURhdGEuY2dGb250KCkpOworCisgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbWF0
cml4ID0gQ0dBZmZpbmVUcmFuc2Zvcm1JZGVudGl0eTsKKyAgICBtYXRyaXguYiA9IC1tYXRyaXgu
YjsKKyAgICBtYXRyaXguZCA9IC1tYXRyaXguZDsKKworICAgIGlmIChwbGF0Zm9ybURhdGEuc3lu
dGhldGljT2JsaXF1ZSgpKQorICAgIHsKKyAgICAgICAgc3RhdGljIGZsb2F0IHNrZXcgPSAtdGFu
ZihzeW50aGV0aWNPYmxpcXVlQW5nbGUgKiBhY29zZigwKSAvIDkwKTsKKyAgICAgICAgbWF0cml4
ID0gQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXQobWF0cml4LCBDR0FmZmluZVRyYW5zZm9ybU1ha2Uo
MSwgMCwgc2tldywgMSwgMCwgMCkpOworICAgIH0KKworICAgIC8vIFVuaXNjcmliZSBnaXZlcyB1
cyBvZmZzZXRzIHRvIGhlbHAgcmVmaW5lIHRoZSBwb3NpdGlvbmluZyBvZiBjb21iaW5pbmcgZ2x5
cGhzLgorICAgIEZsb2F0U2l6ZSB0cmFuc2xhdGlvbiA9IGdseXBoQnVmZmVyLm9mZnNldEF0KGZy
b20pOworICAgIGlmICh0cmFuc2xhdGlvbi53aWR0aCgpIHx8IHRyYW5zbGF0aW9uLmhlaWdodCgp
KQorICAgICAgICBDR0FmZmluZVRyYW5zZm9ybVRyYW5zbGF0ZShtYXRyaXgsIHRyYW5zbGF0aW9u
LndpZHRoKCksIHRyYW5zbGF0aW9uLmhlaWdodCgpKTsKKyAgICAKKyAgICBDR0NvbnRleHRTZXRU
ZXh0TWF0cml4KGNnQ29udGV4dCwgbWF0cml4KTsKKworICAgIENHQ29udGV4dFNldEZvbnRTaXpl
KGNnQ29udGV4dCwgcGxhdGZvcm1EYXRhLnNpemUoKSk7CisgICAgQ0dDb250ZXh0U2V0VGV4dFBv
c2l0aW9uKGNnQ29udGV4dCwgcG9pbnQueCgpLCBwb2ludC55KCkpOworICAgIENHQ29udGV4dFNo
b3dHbHlwaHNXaXRoQWR2YW5jZXMoY2dDb250ZXh0LCBnbHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSks
IGdseXBoQnVmZmVyLmFkdmFuY2VzKGZyb20pLCBudW1HbHlwaHMpOworICAgIGlmIChmb250LT5t
X3N5bnRoZXRpY0JvbGRPZmZzZXQpIHsKKyAgICAgICAgQ0dDb250ZXh0U2V0VGV4dFBvc2l0aW9u
KGNnQ29udGV4dCwgcG9pbnQueCgpICsgZm9udC0+bV9zeW50aGV0aWNCb2xkT2Zmc2V0LCBwb2lu
dC55KCkpOworICAgICAgICBDR0NvbnRleHRTaG93R2x5cGhzV2l0aEFkdmFuY2VzKGNnQ29udGV4
dCwgZ2x5cGhCdWZmZXIuZ2x5cGhzKGZyb20pLCBnbHlwaEJ1ZmZlci5hZHZhbmNlcyhmcm9tKSwg
bnVtR2x5cGhzKTsKKyAgICB9CisKKyAgICB3a1Jlc3RvcmVGb250U21vb3RoaW5nU3R5bGUoY2dD
b250ZXh0LCBvbGRGb250U21vb3RoaW5nU3R5bGUpOworfQorCitGbG9hdFJlY3QgRm9udDo6c2Vs
ZWN0aW9uUmVjdEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgSW50UG9p
bnQmIHBvaW50LCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaW50IGZyb20sIGludCB0bykgY29uc3QKK3sKKyAgICBVbmlzY3JpYmVDb250cm9sbGVy
IGl0KHRoaXMsIHJ1bik7CisgICAgaXQuYWR2YW5jZShmcm9tKTsKKyAgICBmbG9hdCBiZWZvcmVX
aWR0aCA9IGl0LnJ1bldpZHRoU29GYXIoKTsKKyAgICBpdC5hZHZhbmNlKHRvKTsKKyAgICBmbG9h
dCBhZnRlcldpZHRoID0gaXQucnVuV2lkdGhTb0ZhcigpOworCisgICAgLy8gVXNpbmcgcm91bmRm
KCkgcmF0aGVyIHRoYW4gY2VpbGYoKSBmb3IgdGhlIHJpZ2h0IGVkZ2UgYXMgYSBjb21wcm9taXNl
IHRvIGVuc3VyZSBjb3JyZWN0IGNhcmV0IHBvc2l0aW9uaW5nCisgICAgaWYgKHJ1bi5ydGwoKSkg
eworICAgICAgICBpdC5hZHZhbmNlKHJ1bi5sZW5ndGgoKSk7CisgICAgICAgIGZsb2F0IHRvdGFs
V2lkdGggPSBpdC5ydW5XaWR0aFNvRmFyKCk7CisgICAgICAgIHJldHVybiBGbG9hdFJlY3QocG9p
bnQueCgpICsgZmxvb3JmKHRvdGFsV2lkdGggLSBhZnRlcldpZHRoKSwgcG9pbnQueSgpLCByb3Vu
ZGYodG90YWxXaWR0aCAtIGJlZm9yZVdpZHRoKSAtIGZsb29yZih0b3RhbFdpZHRoIC0gYWZ0ZXJX
aWR0aCksIGgpOworICAgIH0gCisgICAgCisgICAgcmV0dXJuIEZsb2F0UmVjdChwb2ludC54KCkg
KyBmbG9vcmYoYmVmb3JlV2lkdGgpLCBwb2ludC55KCksIHJvdW5kZihhZnRlcldpZHRoKSAtIGZs
b29yZihiZWZvcmVXaWR0aCksIGgpOworfQorCit2b2lkIEZvbnQ6OmRyYXdDb21wbGV4VGV4dChH
cmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQ
b2ludCYgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IHRv
KSBjb25zdAoreworICAgIC8vIFRoaXMgZ2x5cGggYnVmZmVyIGhvbGRzIG91ciBnbHlwaHMgKyBh
ZHZhbmNlcyArIGZvbnQgZGF0YSBmb3IgZWFjaCBnbHlwaC4KKyAgICBHbHlwaEJ1ZmZlciBnbHlw
aEJ1ZmZlcjsKKworICAgIGZsb2F0IHN0YXJ0WCA9IHBvaW50LngoKTsKKyAgICBVbmlzY3JpYmVD
b250cm9sbGVyIGNvbnRyb2xsZXIodGhpcywgcnVuKTsKKyAgICBjb250cm9sbGVyLmFkdmFuY2Uo
ZnJvbSk7CisgICAgZmxvYXQgYmVmb3JlV2lkdGggPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIo
KTsKKyAgICBjb250cm9sbGVyLmFkdmFuY2UodG8sICZnbHlwaEJ1ZmZlcik7CisgICAgCisgICAg
Ly8gV2UgY291bGRuJ3QgZ2VuZXJhdGUgYW55IGdseXBocyBmb3IgdGhlIHJ1bi4gIEdpdmUgdXAu
CisgICAgaWYgKGdseXBoQnVmZmVyLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworICAgIAor
ICAgIGZsb2F0IGFmdGVyV2lkdGggPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKTsKKworICAg
IGlmIChydW4ucnRsKCkpIHsKKyAgICAgICAgY29udHJvbGxlci5hZHZhbmNlKHJ1bi5sZW5ndGgo
KSk7CisgICAgICAgIHN0YXJ0WCArPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKSAtIGFmdGVy
V2lkdGg7CisgICAgfSBlbHNlCisgICAgICAgIHN0YXJ0WCArPSBiZWZvcmVXaWR0aDsKKworICAg
IC8vIERyYXcgdGhlIGdseXBoIGJ1ZmZlciBub3cgYXQgdGhlIHN0YXJ0aW5nIHBvaW50IHJldHVy
bmVkIGluIHN0YXJ0WC4KKyAgICBGbG9hdFBvaW50IHN0YXJ0UG9pbnQoc3RhcnRYLCBwb2ludC55
KCkpOworICAgIGRyYXdHbHlwaEJ1ZmZlcihjb250ZXh0LCBnbHlwaEJ1ZmZlciwgcnVuLCBzdGFy
dFBvaW50KTsKK30KKworZmxvYXQgRm9udDo6ZmxvYXRXaWR0aEZvckNvbXBsZXhUZXh0KGNvbnN0
IFRleHRSdW4mIHJ1bikgY29uc3QKK3sKKyAgICBVbmlzY3JpYmVDb250cm9sbGVyIGNvbnRyb2xs
ZXIodGhpcywgcnVuKTsKKyAgICBjb250cm9sbGVyLmFkdmFuY2UocnVuLmxlbmd0aCgpKTsKKyAg
ICByZXR1cm4gY29udHJvbGxlci5ydW5XaWR0aFNvRmFyKCk7Cit9CisKK2ludCBGb250OjpvZmZz
ZXRGb3JQb3NpdGlvbkZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgaW50IHgsIGJv
b2wgaW5jbHVkZVBhcnRpYWxHbHlwaHMpIGNvbnN0Cit7CisgICAgVW5pc2NyaWJlQ29udHJvbGxl
ciBjb250cm9sbGVyKHRoaXMsIHJ1bik7CisgICAgcmV0dXJuIGNvbnRyb2xsZXIub2Zmc2V0Rm9y
UG9zaXRpb24oeCwgaW5jbHVkZVBhcnRpYWxHbHlwaHMpOworfQorCit9CkluZGV4OiBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250Q0dXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDR1dpbi5jcHAJKHJldmlzaW9uIDI5NzI2KQor
KysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENHV2luLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBw
bGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAw
NywgMjAwOCBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCkBAIC0yNiwxMSArMjYsOSBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgog
I2luY2x1ZGUgIkZvbnQuaCIKIAotI2luY2x1ZGUgIkZvbnRGYWxsYmFja0xpc3QuaCIKICNpbmNs
dWRlICJHbHlwaEJ1ZmZlci5oIgogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2luY2x1
ZGUgIkludFJlY3QuaCIKLSNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1ZGUgIlNp
bXBsZUZvbnREYXRhLmgiCiAjaW5jbHVkZSAiVW5pc2NyaWJlQ29udHJvbGxlci5oIgogI2luY2x1
ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgpAQCAtNjgsMTUg
KzY2LDcgQEAgdm9pZCBGb250OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCogZwogCiAgICAg
ICAgIC8vIFNldCB0aGUgY29ycmVjdCBjb2xvci4KICAgICAgICAgSERDIHRleHREcmF3aW5nREMg
PSBoZGM7Ci0gICAgICAgIC8qaWYgKGZpbGxDb2xvci5oYXNBbHBoYSgpIHx8IGdyYXBoaWNzQ29u
dGV4dC0+aW5UcmFuc3BhcmVuY3lMYXllcigpKSB7Ci0gICAgICAgICAgICAvLyBHREkgY2FuJ3Qg
aGFuZGxlIGRyYXdpbmcgdHJhbnNwYXJlbnQgdGV4dC4gIFdlIGhhdmUgdG8gZHJhdyBpbnRvIGEg
bWFzay4gIFdlIGRyYXcgYmxhY2sgdGV4dCBvbiBhIHdoaXRlLWZpbGxlZCBiYWNrZ3JvdW5kLgot
ICAgICAgICAgICAgLy8gV2UgYWxzbyBkbyB0aGlzIHdoZW4gaW5zaWRlIHRyYW5zcGFyZW5jeSBs
YXllcnMsIHNpbmNlIEdESSBhbHNvIGNhbid0IGRyYXcgb250byBhIHN1cmZhY2Ugd2l0aCBhbHBo
YS4KLSAgICAgICAgICAgIGdyYXBoaWNzQ29udGV4dC0+c2F2ZSgpOwotICAgICAgICAgICAgZ3Jh
cGhpY3NDb250ZXh0LT5zZXRGaWxsQ29sb3IoQ29sb3I6OndoaXRlKTsKLSAgICAgICAgICAgIHRl
eHREcmF3aW5nREMgPSBncmFwaGljc0NvbnRleHQtPmdldFdpbmRvd3NCaXRtYXBDb250ZXh0KHRl
eHRSZWN0KTsKLSAgICAgICAgICAgIFNldFRleHRDb2xvcihoZGMsIFJHQigwLCAwLCAwKSk7Ci0g
ICAgICAgIH0gZWxzZSovCi0gICAgICAgICAgICBTZXRUZXh0Q29sb3IoaGRjLCBSR0IoZmlsbENv
bG9yLnJlZCgpLCBmaWxsQ29sb3IuZ3JlZW4oKSwgZmlsbENvbG9yLmJsdWUoKSkpOworICAgICAg
ICBTZXRUZXh0Q29sb3IoaGRjLCBSR0IoZmlsbENvbG9yLnJlZCgpLCBmaWxsQ29sb3IuZ3JlZW4o
KSwgZmlsbENvbG9yLmJsdWUoKSkpOwogCiAgICAgICAgIFNldEJrTW9kZShoZGMsIFRSQU5TUEFS
RU5UKTsKICAgICAgICAgU2V0VGV4dEFsaWduKGhkYywgVEFfTEVGVCB8IFRBX0JBU0VMSU5FKTsK
QEAgLTk1LDM0ICs4NSw2IEBAIHZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQq
IGcKICAgICAgICAgfQogICAgICAgICBFeHRUZXh0T3V0KGhkYywgcG9pbnQueCgpLCBwb2ludC55
KCksIEVUT19HTFlQSF9JTkRFWCwgMCwgKFdDSEFSKilnbHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSks
IG51bUdseXBocywgZ2RpQWR2YW5jZXMuZGF0YSgpKTsKIAotICAgICAgICAvKmlmIChmaWxsQ29s
b3IuaGFzQWxwaGEoKSB8fCBncmFwaGljc0NvbnRleHQtPmluVHJhbnNwYXJlbmN5TGF5ZXIoKSkg
ewotICAgICAgICAgICAgLy8gVE9ET0Q6IFdlIGhhdmUgdG8gd2FsayB0aGUgYml0cyBvZiB0aGUg
Yml0bWFwIGFuZCBpbnZlcnQgdGhlbS4gIFdlIGFsc28gY29weSBvdmVyIHRoZSBncmVlbiBjb21w
b25lbnQgdmFsdWUgaW50byB0aGUgYWxwaGEgdmFsdWUKLSAgICAgICAgICAgIC8vIHRvIGtlZXAg
Q2xlYXJUeXBlIGxvb2tpbmcgcmVhc29uYWJsZS4KLQotICAgICAgICAgICAgLy8gTm93IHRoYXQg
d2UgaGF2ZSBkcmF3biB0aGUgdGV4dCBpbnRvIGEgYml0bWFwIGFuZCBpbnZlcnRlZCBpdCwgb2J0
YWluIGEgQ0dJbWFnZVJlZiBtYXNrLgotICAgICAgICAgICAgQ0dJbWFnZVJlZiBtYXNrID0gZ3Jh
cGhpY3NDb250ZXh0LT5yZWxlYXNlV2luZG93c0JpdG1hcENvbnRleHRJbnRvTWFzayh0ZXh0RHJh
d2luZ0RDLCB0ZXh0UmVjdCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEFwcGx5IHRo
ZSBtYXNrIHRvIHRoZSBmaWxsIGNvbG9yLgotICAgICAgICAgICAgQ0dDb250ZXh0UmVmIGJpdG1h
cENvbnRleHQgPSBncmFwaGljc0NvbnRleHQtPmdldFdpbmRvd3NDb21wYXRpYmxlQ0dCaXRtYXBD
b250ZXh0KHRleHRSZWN0LnNpemUoKSk7Ci0gICAgICAgICAgICBDR0Zsb2F0IHJlZCwgZ3JlZW4s
IGJsdWUsIGFscGhhOwotICAgICAgICAgICAgY29sb3IuZ2V0UkdCQShyZWQsIGdyZWVuLCBibHVl
LCBhbHBoYSk7Ci0gICAgICAgICAgICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoY29udGV4dCwg
cmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotICAgICAgICAgICAgQ0dDb250ZXh0RmlsbFJlY3Qo
Yml0bWFwQ29udGV4dCwgSW50UmVjdCgwLCAwLCB0ZXh0UmVjdC53aWR0aCgpLCB0ZXh0UmVjdC5o
ZWlnaHQoKSkpOwotICAgICAgICAgICAgQ0dJbWFnZVJlZiBmaWxsQ29sb3JJbWFnZSA9IENHQml0
bWFwQ29udGV4dENyZWF0ZUltYWdlKGJpdG1hcENvbnRleHQpOwotICAgICAgICAKLSAgICAgICAg
ICAgIC8vIEFwcGx5IHRoZSBtYXNrLgotICAgICAgICAgICAgQ0dJbWFnZVJlZiBmaW5hbEltYWdl
ID0gQ0dJbWFnZUNyZWF0ZVdpdGhNYXNrKGZpbGxDb2xvckltYWdlLCBtYXNrKTsKLQotICAgICAg
ICAgICAgLy8gVGhlIGJpdG1hcCBpbWFnZSBuZWVkcyB0byBiZSBkcmF3biBpbnRvIHRoZSBIREMu
Ci0gICAgICAgICAgICBncmFwaGljc0NvbnRleHQtPmRyYXdJbWFnZUludG9XaW5kb3dzQ29udGV4
dChoZGMsIGZpbmFsSW1hZ2UpOwotCi0gICAgICAgICAgICAvLyBSZWxlYXNlIG91ciBpbWFnZXMg
YW5kIGNvbnRleHRzLgotICAgICAgICAgICAgQ0dJbWFnZVJlbGVhc2UobWFzayk7Ci0gICAgICAg
ICAgICBDR0ltYWdlUmVsZWFzZShmaWxsQ29sb3JJbWFnZSk7Ci0gICAgICAgICAgICBDR0ltYWdl
UmVsZWFzZShmaW5hbEltYWdlKTsKLSAgICAgICAgICAgIENHQ29udGV4dFJlbGVhc2UoYml0bWFw
Q29udGV4dCk7Ci0gICAgICAgIH0qLwotCiAgICAgICAgIGdyYXBoaWNzQ29udGV4dC0+cmVsZWFz
ZVdpbmRvd3NDb250ZXh0KGhkYywgdGV4dFJlY3QpOwogICAgICAgICByZXR1cm47CiAgICAgfQpA
QCAtMTM5LDkgKzEwMSw4IEBAIHZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQq
IGcKICAgICBtYXRyaXguYiA9IC1tYXRyaXguYjsKICAgICBtYXRyaXguZCA9IC1tYXRyaXguZDsK
IAotICAgIGlmIChwbGF0Zm9ybURhdGEuc3ludGhldGljT2JsaXF1ZSgpKQotICAgIHsKLSAgICAg
ICAgc3RhdGljIGZsb2F0IHNrZXcgPSAtdGFuZihzeW50aGV0aWNPYmxpcXVlQW5nbGUgKiBhY29z
ZigwKSAvIDkwKTsKKyAgICBpZiAocGxhdGZvcm1EYXRhLnN5bnRoZXRpY09ibGlxdWUoKSkgewor
ICAgICAgICBzdGF0aWMgZmxvYXQgc2tldyA9IC10YW5mKHN5bnRoZXRpY09ibGlxdWVBbmdsZSAq
IGFjb3NmKDApIC8gOTAuMGYpOwogICAgICAgICBtYXRyaXggPSBDR0FmZmluZVRyYW5zZm9ybUNv
bmNhdChtYXRyaXgsIENHQWZmaW5lVHJhbnNmb3JtTWFrZSgxLCAwLCBza2V3LCAxLCAwLCAwKSk7
CiAgICAgfQogCkBAIC0xNjMsNjUgKzEyNCw0IEBAIHZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFw
aGljc0NvbnRleHQqIGcKICAgICB3a1Jlc3RvcmVGb250U21vb3RoaW5nU3R5bGUoY2dDb250ZXh0
LCBvbGRGb250U21vb3RoaW5nU3R5bGUpOwogfQogCi1GbG9hdFJlY3QgRm9udDo6c2VsZWN0aW9u
UmVjdEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgSW50UG9pbnQmIHBv
aW50LCBpbnQgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aW50IGZyb20sIGludCB0bykgY29uc3QKLXsKLSAgICBVbmlzY3JpYmVDb250cm9sbGVyIGl0KHRo
aXMsIHJ1bik7Ci0gICAgaXQuYWR2YW5jZShmcm9tKTsKLSAgICBmbG9hdCBiZWZvcmVXaWR0aCA9
IGl0LnJ1bldpZHRoU29GYXIoKTsKLSAgICBpdC5hZHZhbmNlKHRvKTsKLSAgICBmbG9hdCBhZnRl
cldpZHRoID0gaXQucnVuV2lkdGhTb0ZhcigpOwotCi0gICAgLy8gVXNpbmcgcm91bmRmKCkgcmF0
aGVyIHRoYW4gY2VpbGYoKSBmb3IgdGhlIHJpZ2h0IGVkZ2UgYXMgYSBjb21wcm9taXNlIHRvIGVu
c3VyZSBjb3JyZWN0IGNhcmV0IHBvc2l0aW9uaW5nCi0gICAgaWYgKHJ1bi5ydGwoKSkgewotICAg
ICAgICBpdC5hZHZhbmNlKHJ1bi5sZW5ndGgoKSk7Ci0gICAgICAgIGZsb2F0IHRvdGFsV2lkdGgg
PSBpdC5ydW5XaWR0aFNvRmFyKCk7Ci0gICAgICAgIHJldHVybiBGbG9hdFJlY3QocG9pbnQueCgp
ICsgZmxvb3JmKHRvdGFsV2lkdGggLSBhZnRlcldpZHRoKSwgcG9pbnQueSgpLCByb3VuZGYodG90
YWxXaWR0aCAtIGJlZm9yZVdpZHRoKSAtIGZsb29yZih0b3RhbFdpZHRoIC0gYWZ0ZXJXaWR0aCks
IGgpOwotICAgIH0gCi0gICAgCi0gICAgcmV0dXJuIEZsb2F0UmVjdChwb2ludC54KCkgKyBmbG9v
cmYoYmVmb3JlV2lkdGgpLCBwb2ludC55KCksIHJvdW5kZihhZnRlcldpZHRoKSAtIGZsb29yZihi
ZWZvcmVXaWR0aCksIGgpOwotfQotCi12b2lkIEZvbnQ6OmRyYXdDb21wbGV4VGV4dChHcmFwaGlj
c0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYg
cG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IHRvKSBjb25z
dAotewotICAgIC8vIFRoaXMgZ2x5cGggYnVmZmVyIGhvbGRzIG91ciBnbHlwaHMgKyBhZHZhbmNl
cyArIGZvbnQgZGF0YSBmb3IgZWFjaCBnbHlwaC4KLSAgICBHbHlwaEJ1ZmZlciBnbHlwaEJ1ZmZl
cjsKLQotICAgIGZsb2F0IHN0YXJ0WCA9IHBvaW50LngoKTsKLSAgICBVbmlzY3JpYmVDb250cm9s
bGVyIGNvbnRyb2xsZXIodGhpcywgcnVuKTsKLSAgICBjb250cm9sbGVyLmFkdmFuY2UoZnJvbSk7
Ci0gICAgZmxvYXQgYmVmb3JlV2lkdGggPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKTsKLSAg
ICBjb250cm9sbGVyLmFkdmFuY2UodG8sICZnbHlwaEJ1ZmZlcik7Ci0gICAgCi0gICAgLy8gV2Ug
Y291bGRuJ3QgZ2VuZXJhdGUgYW55IGdseXBocyBmb3IgdGhlIHJ1bi4gIEdpdmUgdXAuCi0gICAg
aWYgKGdseXBoQnVmZmVyLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIGZs
b2F0IGFmdGVyV2lkdGggPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKTsKLQotICAgIGlmIChy
dW4ucnRsKCkpIHsKLSAgICAgICAgY29udHJvbGxlci5hZHZhbmNlKHJ1bi5sZW5ndGgoKSk7Ci0g
ICAgICAgIHN0YXJ0WCArPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKSAtIGFmdGVyV2lkdGg7
Ci0gICAgfSBlbHNlCi0gICAgICAgIHN0YXJ0WCArPSBiZWZvcmVXaWR0aDsKLQotICAgIC8vIERy
YXcgdGhlIGdseXBoIGJ1ZmZlciBub3cgYXQgdGhlIHN0YXJ0aW5nIHBvaW50IHJldHVybmVkIGlu
IHN0YXJ0WC4KLSAgICBGbG9hdFBvaW50IHN0YXJ0UG9pbnQoc3RhcnRYLCBwb2ludC55KCkpOwot
ICAgIGRyYXdHbHlwaEJ1ZmZlcihjb250ZXh0LCBnbHlwaEJ1ZmZlciwgcnVuLCBzdGFydFBvaW50
KTsKLX0KLQotZmxvYXQgRm9udDo6ZmxvYXRXaWR0aEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRS
dW4mIHJ1bikgY29uc3QKLXsKLSAgICBVbmlzY3JpYmVDb250cm9sbGVyIGNvbnRyb2xsZXIodGhp
cywgcnVuKTsKLSAgICBjb250cm9sbGVyLmFkdmFuY2UocnVuLmxlbmd0aCgpKTsKLSAgICByZXR1
cm4gY29udHJvbGxlci5ydW5XaWR0aFNvRmFyKCk7Ci19Ci0KLWludCBGb250OjpvZmZzZXRGb3JQ
b3NpdGlvbkZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgaW50IHgsIGJvb2wgaW5j
bHVkZVBhcnRpYWxHbHlwaHMpIGNvbnN0Ci17Ci0gICAgVW5pc2NyaWJlQ29udHJvbGxlciBjb250
cm9sbGVyKHRoaXMsIHJ1bik7Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXIub2Zmc2V0Rm9yUG9zaXRp
b24oeCwgaW5jbHVkZVBhcnRpYWxHbHlwaHMpOwotfQotCiB9CkluZGV4OiBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbi9Gb250Q2Fpcm9XaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250Q2Fpcm9XaW4uY3BwCShyZXZpc2lvbiAw
KQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4g
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJGb250LmgiCisKKyNpbmNsdWRlICJHbHlwaEJ1ZmZlci5oIgorI2luY2x1ZGUgIkdyYXBo
aWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiU2lt
cGxlRm9udERhdGEuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2b2lkIEZvbnQ6OmRyYXdH
bHlwaHMoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGNvbnN0IFNpbXBsZUZvbnRE
YXRhKiBmb250LCBjb25zdCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZmZXIsIAorICAgICAgICAgICAg
ICAgICAgICAgIGludCBmcm9tLCBpbnQgbnVtR2x5cGhzLCBjb25zdCBGbG9hdFBvaW50JiBwb2lu
dCkgY29uc3QKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit9CkluZGV4OiBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250V2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250V2luLmNwcAkocmV2aXNpb24gMjk4MzQpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250V2luLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5j
LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAw
OCBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCkBAIC0zMywxMzYgKzMzLDEwIEBACiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQu
aCIKICNpbmNsdWRlICJTaW1wbGVGb250RGF0YS5oIgogI2luY2x1ZGUgIlVuaXNjcmliZUNvbnRy
b2xsZXIuaCIKLSNpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2Vydmlj
ZXMuaD4KLSNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJm
YWNlLmg+CiAjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUg
ewogCi1jb25zdCBpbnQgc3ludGhldGljT2JsaXF1ZUFuZ2xlID0gMTQ7Ci0KLXZvaWQgRm9udDo6
ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwgY29uc3QgU2ltcGxl
Rm9udERhdGEqIGZvbnQsIGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZlciwgCi0gICAgICAg
ICAgICAgICAgICAgICAgaW50IGZyb20sIGludCBudW1HbHlwaHMsIGNvbnN0IEZsb2F0UG9pbnQm
IHBvaW50KSBjb25zdAotewotICAgIGlmIChmb250LT5tX2ZvbnQudXNlR0RJKCkpIHsKLSAgICAg
ICAgLy8gRklYTUU6IFN1cHBvcnQgYWxwaGEgYmxlbmRpbmcuCi0gICAgICAgIC8vIEZJWE1FOiBT
dXBwb3J0IHRleHQgc3Ryb2tlL2ZpbGwuCi0gICAgICAgIC8vIEZJWE1FOiBTdXBwb3J0IHRleHQg
c2hhZG93LgotICAgICAgICBDb2xvciBmaWxsQ29sb3IgPSBncmFwaGljc0NvbnRleHQtPmZpbGxD
b2xvcigpOwotICAgICAgICBpZiAoZmlsbENvbG9yLmFscGhhKCkgPT0gMCkKLSAgICAgICAgICAg
IHJldHVybjsKLQotICAgICAgICAvLyBXZSBoYXZlIHRvIGNvbnZlcnQgQ0cncyB0d28tZGltZW5z
aW9uYWwgZmxvYXRpbmcgcG9pbnQgYWR2YW5jZXMgdG8ganVzdCBob3Jpem9udGFsIGludGVnZXIg
YWR2YW5jZXMuCi0gICAgICAgIFZlY3RvcjxpbnQsIDIwNDg+IGdkaUFkdmFuY2VzOwotICAgICAg
ICBpbnQgdG90YWxXaWR0aCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtR2x5
cGhzOyBpKyspIHsKLSAgICAgICAgICAgIGdkaUFkdmFuY2VzLmFwcGVuZChscm91bmRmKGdseXBo
QnVmZmVyLmFkdmFuY2VBdChmcm9tICsgaSkpKTsKLSAgICAgICAgICAgIHRvdGFsV2lkdGggKz0g
Z2RpQWR2YW5jZXNbaV07Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBwdXQgc2xvcCBpbnRv
IHRoaXMgcmVjdCwgc2luY2UgZ2x5cGhzIGNhbiBvdmVyZmxvdyB0aGUgYXNjZW50L2Rlc2NlbnQg
Ym91bmRzIGFuZCB0aGUgbGVmdC9yaWdodCBlZGdlcy4KLSAgICAgICAgaW50IGxpbmVHYXAgPSBm
b250LT5saW5lR2FwKCk7Ci0gICAgICAgIEludFJlY3QgdGV4dFJlY3QocG9pbnQueCgpIC0gbGlu
ZUdhcCwgcG9pbnQueSgpIC0gZm9udC0+YXNjZW50KCkgLSBsaW5lR2FwLCB0b3RhbFdpZHRoICsg
MiAqIGxpbmVHYXAsIGZvbnQtPmxpbmVTcGFjaW5nKCkpOwotICAgICAgICBIREMgaGRjID0gZ3Jh
cGhpY3NDb250ZXh0LT5nZXRXaW5kb3dzQ29udGV4dCh0ZXh0UmVjdCk7Ci0gICAgICAgIFNlbGVj
dE9iamVjdChoZGMsIGZvbnQtPm1fZm9udC5oZm9udCgpKTsKLQotICAgICAgICAvLyBTZXQgdGhl
IGNvcnJlY3QgY29sb3IuCi0gICAgICAgIEhEQyB0ZXh0RHJhd2luZ0RDID0gaGRjOwotICAgICAg
ICAvKmlmIChmaWxsQ29sb3IuaGFzQWxwaGEoKSB8fCBncmFwaGljc0NvbnRleHQtPmluVHJhbnNw
YXJlbmN5TGF5ZXIoKSkgewotICAgICAgICAgICAgLy8gR0RJIGNhbid0IGhhbmRsZSBkcmF3aW5n
IHRyYW5zcGFyZW50IHRleHQuICBXZSBoYXZlIHRvIGRyYXcgaW50byBhIG1hc2suICBXZSBkcmF3
IGJsYWNrIHRleHQgb24gYSB3aGl0ZS1maWxsZWQgYmFja2dyb3VuZC4KLSAgICAgICAgICAgIC8v
IFdlIGFsc28gZG8gdGhpcyB3aGVuIGluc2lkZSB0cmFuc3BhcmVuY3kgbGF5ZXJzLCBzaW5jZSBH
REkgYWxzbyBjYW4ndCBkcmF3IG9udG8gYSBzdXJmYWNlIHdpdGggYWxwaGEuCi0gICAgICAgICAg
ICBncmFwaGljc0NvbnRleHQtPnNhdmUoKTsKLSAgICAgICAgICAgIGdyYXBoaWNzQ29udGV4dC0+
c2V0RmlsbENvbG9yKENvbG9yOjp3aGl0ZSk7Ci0gICAgICAgICAgICB0ZXh0RHJhd2luZ0RDID0g
Z3JhcGhpY3NDb250ZXh0LT5nZXRXaW5kb3dzQml0bWFwQ29udGV4dCh0ZXh0UmVjdCk7Ci0gICAg
ICAgICAgICBTZXRUZXh0Q29sb3IoaGRjLCBSR0IoMCwgMCwgMCkpOwotICAgICAgICB9IGVsc2Uq
LwotICAgICAgICAgICAgU2V0VGV4dENvbG9yKGhkYywgUkdCKGZpbGxDb2xvci5yZWQoKSwgZmls
bENvbG9yLmdyZWVuKCksIGZpbGxDb2xvci5ibHVlKCkpKTsKLQotICAgICAgICBTZXRCa01vZGUo
aGRjLCBUUkFOU1BBUkVOVCk7Ci0gICAgICAgIFNldFRleHRBbGlnbihoZGMsIFRBX0xFRlQgfCBU
QV9CQVNFTElORSk7Ci0KLSAgICAgICAgLy8gVW5pc2NyaWJlIGdpdmVzIHVzIG9mZnNldHMgdG8g
aGVscCByZWZpbmUgdGhlIHBvc2l0aW9uaW5nIG9mIGNvbWJpbmluZyBnbHlwaHMuCi0gICAgICAg
IEZsb2F0U2l6ZSB0cmFuc2xhdGlvbiA9IGdseXBoQnVmZmVyLm9mZnNldEF0KGZyb20pOwotICAg
ICAgICBpZiAodHJhbnNsYXRpb24ud2lkdGgoKSB8fCB0cmFuc2xhdGlvbi5oZWlnaHQoKSkgewot
ICAgICAgICAgICAgWEZPUk0geGZvcm07Ci0gICAgICAgICAgICB4Zm9ybS5lTTExID0gMS4wOwot
ICAgICAgICAgICAgeGZvcm0uZU0xMiA9IDA7Ci0gICAgICAgICAgICB4Zm9ybS5lTTIxID0gMDsK
LSAgICAgICAgICAgIHhmb3JtLmVNMjIgPSAxLjA7Ci0gICAgICAgICAgICB4Zm9ybS5lRHggPSB0
cmFuc2xhdGlvbi53aWR0aCgpOwotICAgICAgICAgICAgeGZvcm0uZUR5ID0gdHJhbnNsYXRpb24u
aGVpZ2h0KCk7Ci0gICAgICAgICAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShoZGMsICZ4Zm9ybSwg
TVdUX0xFRlRNVUxUSVBMWSk7Ci0gICAgICAgIH0KLSAgICAgICAgRXh0VGV4dE91dChoZGMsIHBv
aW50LngoKSwgcG9pbnQueSgpLCBFVE9fR0xZUEhfSU5ERVgsIDAsIChXQ0hBUiopZ2x5cGhCdWZm
ZXIuZ2x5cGhzKGZyb20pLCBudW1HbHlwaHMsIGdkaUFkdmFuY2VzLmRhdGEoKSk7Ci0KLSAgICAg
ICAgLyppZiAoZmlsbENvbG9yLmhhc0FscGhhKCkgfHwgZ3JhcGhpY3NDb250ZXh0LT5pblRyYW5z
cGFyZW5jeUxheWVyKCkpIHsKLSAgICAgICAgICAgIC8vIFRPRE9EOiBXZSBoYXZlIHRvIHdhbGsg
dGhlIGJpdHMgb2YgdGhlIGJpdG1hcCBhbmQgaW52ZXJ0IHRoZW0uICBXZSBhbHNvIGNvcHkgb3Zl
ciB0aGUgZ3JlZW4gY29tcG9uZW50IHZhbHVlIGludG8gdGhlIGFscGhhIHZhbHVlCi0gICAgICAg
ICAgICAvLyB0byBrZWVwIENsZWFyVHlwZSBsb29raW5nIHJlYXNvbmFibGUuCi0KLSAgICAgICAg
ICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgZHJhd24gdGhlIHRleHQgaW50byBhIGJpdG1hcCBhbmQg
aW52ZXJ0ZWQgaXQsIG9idGFpbiBhIENHSW1hZ2VSZWYgbWFzay4KLSAgICAgICAgICAgIENHSW1h
Z2VSZWYgbWFzayA9IGdyYXBoaWNzQ29udGV4dC0+cmVsZWFzZVdpbmRvd3NCaXRtYXBDb250ZXh0
SW50b01hc2sodGV4dERyYXdpbmdEQywgdGV4dFJlY3QpOwotICAgICAgICAgICAgCi0gICAgICAg
ICAgICAvLyBBcHBseSB0aGUgbWFzayB0byB0aGUgZmlsbCBjb2xvci4KLSAgICAgICAgICAgIENH
Q29udGV4dFJlZiBiaXRtYXBDb250ZXh0ID0gZ3JhcGhpY3NDb250ZXh0LT5nZXRXaW5kb3dzQ29t
cGF0aWJsZUNHQml0bWFwQ29udGV4dCh0ZXh0UmVjdC5zaXplKCkpOwotICAgICAgICAgICAgQ0dG
bG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKLSAgICAgICAgICAgIGNvbG9yLmdldFJHQkEo
cmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotICAgICAgICAgICAgQ0dDb250ZXh0U2V0UkdCRmls
bENvbG9yKGNvbnRleHQsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLSAgICAgICAgICAgIENH
Q29udGV4dEZpbGxSZWN0KGJpdG1hcENvbnRleHQsIEludFJlY3QoMCwgMCwgdGV4dFJlY3Qud2lk
dGgoKSwgdGV4dFJlY3QuaGVpZ2h0KCkpKTsKLSAgICAgICAgICAgIENHSW1hZ2VSZWYgZmlsbENv
bG9ySW1hZ2UgPSBDR0JpdG1hcENvbnRleHRDcmVhdGVJbWFnZShiaXRtYXBDb250ZXh0KTsKLSAg
ICAgICAgCi0gICAgICAgICAgICAvLyBBcHBseSB0aGUgbWFzay4KLSAgICAgICAgICAgIENHSW1h
Z2VSZWYgZmluYWxJbWFnZSA9IENHSW1hZ2VDcmVhdGVXaXRoTWFzayhmaWxsQ29sb3JJbWFnZSwg
bWFzayk7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBiaXRtYXAgaW1hZ2UgbmVlZHMgdG8gYmUgZHJh
d24gaW50byB0aGUgSERDLgotICAgICAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5kcmF3SW1hZ2VJ
bnRvV2luZG93c0NvbnRleHQoaGRjLCBmaW5hbEltYWdlKTsKLQotICAgICAgICAgICAgLy8gUmVs
ZWFzZSBvdXIgaW1hZ2VzIGFuZCBjb250ZXh0cy4KLSAgICAgICAgICAgIENHSW1hZ2VSZWxlYXNl
KG1hc2spOwotICAgICAgICAgICAgQ0dJbWFnZVJlbGVhc2UoZmlsbENvbG9ySW1hZ2UpOwotICAg
ICAgICAgICAgQ0dJbWFnZVJlbGVhc2UoZmluYWxJbWFnZSk7Ci0gICAgICAgICAgICBDR0NvbnRl
eHRSZWxlYXNlKGJpdG1hcENvbnRleHQpOwotICAgICAgICB9Ki8KLQotICAgICAgICBncmFwaGlj
c0NvbnRleHQtPnJlbGVhc2VXaW5kb3dzQ29udGV4dChoZGMsIHRleHRSZWN0KTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLQotICAgIENHQ29udGV4dFJlZiBjZ0NvbnRleHQgPSBncmFwaGljc0Nv
bnRleHQtPnBsYXRmb3JtQ29udGV4dCgpOwotCi0gICAgdWludDMyX3Qgb2xkRm9udFNtb290aGlu
Z1N0eWxlID0gd2tTZXRGb250U21vb3RoaW5nU3R5bGUoY2dDb250ZXh0KTsKLQotICAgIGNvbnN0
IEZvbnRQbGF0Zm9ybURhdGEmIHBsYXRmb3JtRGF0YSA9IGZvbnQtPnBsYXRmb3JtRGF0YSgpOwot
Ci0gICAgQ0dDb250ZXh0U2V0Rm9udChjZ0NvbnRleHQsIHBsYXRmb3JtRGF0YS5jZ0ZvbnQoKSk7
Ci0KLSAgICBDR0FmZmluZVRyYW5zZm9ybSBtYXRyaXggPSBDR0FmZmluZVRyYW5zZm9ybUlkZW50
aXR5OwotICAgIG1hdHJpeC5iID0gLW1hdHJpeC5iOwotICAgIG1hdHJpeC5kID0gLW1hdHJpeC5k
OwotCi0gICAgaWYgKHBsYXRmb3JtRGF0YS5zeW50aGV0aWNPYmxpcXVlKCkpCi0gICAgewotICAg
ICAgICBzdGF0aWMgZmxvYXQgc2tldyA9IC10YW5mKHN5bnRoZXRpY09ibGlxdWVBbmdsZSAqIGFj
b3NmKDApIC8gOTApOwotICAgICAgICBtYXRyaXggPSBDR0FmZmluZVRyYW5zZm9ybUNvbmNhdCht
YXRyaXgsIENHQWZmaW5lVHJhbnNmb3JtTWFrZSgxLCAwLCBza2V3LCAxLCAwLCAwKSk7Ci0gICAg
fQotCi0gICAgLy8gVW5pc2NyaWJlIGdpdmVzIHVzIG9mZnNldHMgdG8gaGVscCByZWZpbmUgdGhl
IHBvc2l0aW9uaW5nIG9mIGNvbWJpbmluZyBnbHlwaHMuCi0gICAgRmxvYXRTaXplIHRyYW5zbGF0
aW9uID0gZ2x5cGhCdWZmZXIub2Zmc2V0QXQoZnJvbSk7Ci0gICAgaWYgKHRyYW5zbGF0aW9uLndp
ZHRoKCkgfHwgdHJhbnNsYXRpb24uaGVpZ2h0KCkpCi0gICAgICAgIENHQWZmaW5lVHJhbnNmb3Jt
VHJhbnNsYXRlKG1hdHJpeCwgdHJhbnNsYXRpb24ud2lkdGgoKSwgdHJhbnNsYXRpb24uaGVpZ2h0
KCkpOwotICAgIAotICAgIENHQ29udGV4dFNldFRleHRNYXRyaXgoY2dDb250ZXh0LCBtYXRyaXgp
OwotCi0gICAgQ0dDb250ZXh0U2V0Rm9udFNpemUoY2dDb250ZXh0LCBwbGF0Zm9ybURhdGEuc2l6
ZSgpKTsKLSAgICBDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24oY2dDb250ZXh0LCBwb2ludC54KCks
IHBvaW50LnkoKSk7Ci0gICAgQ0dDb250ZXh0U2hvd0dseXBoc1dpdGhBZHZhbmNlcyhjZ0NvbnRl
eHQsIGdseXBoQnVmZmVyLmdseXBocyhmcm9tKSwgZ2x5cGhCdWZmZXIuYWR2YW5jZXMoZnJvbSks
IG51bUdseXBocyk7Ci0gICAgaWYgKGZvbnQtPm1fc3ludGhldGljQm9sZE9mZnNldCkgewotICAg
ICAgICBDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24oY2dDb250ZXh0LCBwb2ludC54KCkgKyBmb250
LT5tX3N5bnRoZXRpY0JvbGRPZmZzZXQsIHBvaW50LnkoKSk7Ci0gICAgICAgIENHQ29udGV4dFNo
b3dHbHlwaHNXaXRoQWR2YW5jZXMoY2dDb250ZXh0LCBnbHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSks
IGdseXBoQnVmZmVyLmFkdmFuY2VzKGZyb20pLCBudW1HbHlwaHMpOwotICAgIH0KLQotICAgIHdr
UmVzdG9yZUZvbnRTbW9vdGhpbmdTdHlsZShjZ0NvbnRleHQsIG9sZEZvbnRTbW9vdGhpbmdTdHls
ZSk7Ci19Ci0KIEZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQoY29u
c3QgVGV4dFJ1biYgcnVuLCBjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCBoLAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IHRvKSBjb25z
dAogewpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0
Q0dXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dy
YXBoaWNzQ29udGV4dENHV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCShmcm9tIFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dFdpbi5jcHA6Mjk4MzQpCisrKyBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRDR1dpbi5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSwzODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIw
MDQsIDIwMDUsIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIs
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisK
KyNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5o
IgorI2luY2x1ZGUgIlBhdGguaCIKKyNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ0dCaXRtYXBDb250
ZXh0Lmg+CisjaW5jbHVkZSA8V2ViS2l0U3lzdGVtSW50ZXJmYWNlL1dlYktpdFN5c3RlbUludGVy
ZmFjZS5oPgorI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CisKKyNpbmNsdWRlICJHcmFwaGlj
c0NvbnRleHRQbGF0Zm9ybVByaXZhdGUuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBTVkdSZXNvdXJjZUltYWdlOworCitzdGF0aWMgQ0dD
b250ZXh0UmVmIENHQ29udGV4dFdpdGhIREMoSERDIGhkYykKK3sKKyAgICBIQklUTUFQIGJpdG1h
cCA9IChIQklUTUFQKUdldEN1cnJlbnRPYmplY3QoaGRjLCBPQkpfQklUTUFQKTsKKyAgICBDR0Nv
bG9yU3BhY2VSZWYgZGV2aWNlUkdCID0gQ0dDb2xvclNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7Cisg
ICAgQklUTUFQIGluZm87CisKKyAgICBHZXRPYmplY3QoYml0bWFwLCBzaXplb2YoaW5mbyksICZp
bmZvKTsKKyAgICBBU1NFUlQoaW5mby5ibUJpdHNQaXhlbCA9PSAzMik7CisgICAgQ0dDb250ZXh0
UmVmIGNvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUoaW5mby5ibUJpdHMsIGluZm8uYm1X
aWR0aCwgaW5mby5ibUhlaWdodCwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBpbmZvLmJtV2lkdGhCeXRlcywgZGV2aWNlUkdCLCBrQ0dCaXRtYXBC
eXRlT3JkZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFOb25lU2tpcEZpcnN0KTsKKyAgICBDR0Nv
bG9yU3BhY2VSZWxlYXNlKGRldmljZVJHQik7CisKKyAgICAvLyBGbGlwIGNvb3JkcworICAgIENH
Q29udGV4dFRyYW5zbGF0ZUNUTShjb250ZXh0LCAwLCBpbmZvLmJtSGVpZ2h0KTsKKyAgICBDR0Nv
bnRleHRTY2FsZUNUTShjb250ZXh0LCAxLCAtMSk7CisgICAgCisgICAgLy8gUHV0IHRoZSBIREMg
SW4gYWR2YW5jZWQgbW9kZSBzbyBpdCB3aWxsIGhvbm9yIGFmZmluZSB0cmFuc2Zvcm1zLgorICAg
IFNldEdyYXBoaWNzTW9kZShoZGMsIEdNX0FEVkFOQ0VEKTsKKyAgICAKKyAgICByZXR1cm4gY29u
dGV4dDsKK30KKworR3JhcGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRleHQoSERDIGhkYykKKyAg
ICA6IG1fY29tbW9uKGNyZWF0ZUdyYXBoaWNzQ29udGV4dFByaXZhdGUoKSkKKyAgICAsIG1fZGF0
YShuZXcgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKENHQ29udGV4dFdpdGhIREMoaGRj
KSkpCit7CisgICAgQ0dDb250ZXh0UmVsZWFzZShtX2RhdGEtPm1fY2dDb250ZXh0KTsKKyAgICBt
X2RhdGEtPm1faGRjID0gaGRjOworICAgIHNldFBhaW50aW5nRGlzYWJsZWQoIW1fZGF0YS0+bV9j
Z0NvbnRleHQpOworICAgIGlmIChtX2RhdGEtPm1fY2dDb250ZXh0KSB7CisgICAgICAgIC8vIE1h
a2Ugc3VyZSB0aGUgY29udGV4dCBzdGFydHMgaW4gc3luYyB3aXRoIG91ciBzdGF0ZS4KKyAgICAg
ICAgc2V0UGxhdGZvcm1GaWxsQ29sb3IoZmlsbENvbG9yKCkpOworICAgICAgICBzZXRQbGF0Zm9y
bVN0cm9rZUNvbG9yKHN0cm9rZUNvbG9yKCkpOworICAgIH0KK30KKworSERDIEdyYXBoaWNzQ29u
dGV4dDo6Z2V0V2luZG93c0NvbnRleHQoY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBw
b3J0QWxwaGFCbGVuZCkKK3sKKyAgICBpZiAoaW5UcmFuc3BhcmVuY3lMYXllcigpKSB7CisgICAg
ICAgIGlmIChkc3RSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAg
ICAgIC8vIENyZWF0ZSBhIGJpdG1hcCBEQyBpbiB3aGljaCB0byBkcmF3LgorICAgICAgICBCSVRN
QVBJTkZPIGJpdG1hcEluZm87CisgICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpU2l6ZSAg
ICAgICAgICA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKKyAgICAgICAgYml0bWFwSW5mby5i
bWlIZWFkZXIuYmlXaWR0aCAgICAgICAgID0gZHN0UmVjdC53aWR0aCgpOyAKKyAgICAgICAgYml0
bWFwSW5mby5ibWlIZWFkZXIuYmlIZWlnaHQgICAgICAgID0gZHN0UmVjdC5oZWlnaHQoKTsKKyAg
ICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlQbGFuZXMgICAgICAgID0gMTsKKyAgICAgICAg
Yml0bWFwSW5mby5ibWlIZWFkZXIuYmlCaXRDb3VudCAgICAgID0gMzI7CisgICAgICAgIGJpdG1h
cEluZm8uYm1pSGVhZGVyLmJpQ29tcHJlc3Npb24gICA9IEJJX1JHQjsKKyAgICAgICAgYml0bWFw
SW5mby5ibWlIZWFkZXIuYmlTaXplSW1hZ2UgICAgID0gMDsKKyAgICAgICAgYml0bWFwSW5mby5i
bWlIZWFkZXIuYmlYUGVsc1Blck1ldGVyID0gMDsKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFk
ZXIuYmlZUGVsc1Blck1ldGVyID0gMDsKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlD
bHJVc2VkICAgICAgID0gMDsKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlDbHJJbXBv
cnRhbnQgID0gMDsKKworICAgICAgICB2b2lkKiBwaXhlbHMgPSAwOworICAgICAgICBIQklUTUFQ
IGJpdG1hcCA9IDo6Q3JlYXRlRElCU2VjdGlvbihOVUxMLCAmYml0bWFwSW5mbywgRElCX1JHQl9D
T0xPUlMsICZwaXhlbHMsIDAsIDApOworICAgICAgICBpZiAoIWJpdG1hcCkKKyAgICAgICAgICAg
IHJldHVybiAwOworCisgICAgICAgIEhEQyBiaXRtYXBEQyA9IDo6Q3JlYXRlQ29tcGF0aWJsZURD
KG1fZGF0YS0+bV9oZGMpOworICAgICAgICA6OlNlbGVjdE9iamVjdChiaXRtYXBEQywgYml0bWFw
KTsKKworICAgICAgICAvLyBGaWxsIG91ciBidWZmZXIgd2l0aCBjbGVhciBpZiB3ZSdyZSBnb2lu
ZyB0byBhbHBoYSBibGVuZC4KKyAgICAgICAgaWYgKHN1cHBvcnRBbHBoYUJsZW5kKSB7CisgICAg
ICAgICAgICBCSVRNQVAgYm1wSW5mbzsKKyAgICAgICAgICAgIEdldE9iamVjdChiaXRtYXAsIHNp
emVvZihibXBJbmZvKSwgJmJtcEluZm8pOworICAgICAgICAgICAgaW50IGJ1ZmZlclNpemUgPSBi
bXBJbmZvLmJtV2lkdGhCeXRlcyAqIGJtcEluZm8uYm1IZWlnaHQ7CisgICAgICAgICAgICBtZW1z
ZXQoYm1wSW5mby5ibUJpdHMsIDAsIGJ1ZmZlclNpemUpOworICAgICAgICB9CisKKyAgICAgICAg
Ly8gTWFrZSBzdXJlIHdlIGNhbiBkbyB3b3JsZCB0cmFuc2Zvcm1zLgorICAgICAgICBTZXRHcmFw
aGljc01vZGUoYml0bWFwREMsIEdNX0FEVkFOQ0VEKTsKKworICAgICAgICAvLyBBcHBseSBhIHRy
YW5zbGF0aW9uIHRvIG91ciBjb250ZXh0IHNvIHRoYXQgdGhlIGRyYXdpbmcgZG9uZSB3aWxsIGJl
IGF0ICgwLDApIG9mIHRoZSBiaXRtYXAuCisgICAgICAgIFhGT1JNIHhmb3JtOworICAgICAgICB4
Zm9ybS5lTTExID0gMS4wOworICAgICAgICB4Zm9ybS5lTTEyID0gMDsKKyAgICAgICAgeGZvcm0u
ZU0yMSA9IDA7CisgICAgICAgIHhmb3JtLmVNMjIgPSAxLjA7CisgICAgICAgIHhmb3JtLmVEeCA9
IC1kc3RSZWN0LngoKTsKKyAgICAgICAgeGZvcm0uZUR5ID0gLWRzdFJlY3QueSgpOworICAgICAg
ICA6OlNldFdvcmxkVHJhbnNmb3JtKGJpdG1hcERDLCAmeGZvcm0pOworCisgICAgICAgIHJldHVy
biBiaXRtYXBEQzsKKyAgICB9CisKKyAgICBDR0NvbnRleHRGbHVzaChwbGF0Zm9ybUNvbnRleHQo
KSk7CisgICAgbV9kYXRhLT5zYXZlKCk7CisgICAgcmV0dXJuIG1fZGF0YS0+bV9oZGM7Cit9CisK
K2Jvb2wgR3JhcGhpY3NDb250ZXh0OjppblRyYW5zcGFyZW5jeUxheWVyKCkgY29uc3QgeyByZXR1
cm4gbV9kYXRhLT5tX3RyYW5zcGFyZW5jeUNvdW50OyB9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
OjpyZWxlYXNlV2luZG93c0NvbnRleHQoSERDIGhkYywgY29uc3QgSW50UmVjdCYgZHN0UmVjdCwg
Ym9vbCBzdXBwb3J0QWxwaGFCbGVuZCkKK3sKKyAgICBpZiAoaGRjICYmIGluVHJhbnNwYXJlbmN5
TGF5ZXIoKSkgeworICAgICAgICBpZiAoZHN0UmVjdC5pc0VtcHR5KCkpCisgICAgICAgICAgICBy
ZXR1cm47CisKKyAgICAgICAgSEJJVE1BUCBiaXRtYXAgPSAoSEJJVE1BUClHZXRDdXJyZW50T2Jq
ZWN0KGhkYywgT0JKX0JJVE1BUCk7CisKKyAgICAgICAgLy8gTmVlZCB0byBtYWtlIGEgQ0dJbWFn
ZSBvdXQgb2YgdGhlIGJpdG1hcCdzIHBpeGVsIGJ1ZmZlciBhbmQgdGhlbiBkcmF3CisgICAgICAg
IC8vIGl0IGludG8gb3VyIGNvbnRleHQuCisgICAgICAgIEJJVE1BUCBpbmZvOworICAgICAgICBH
ZXRPYmplY3QoYml0bWFwLCBzaXplb2YoaW5mbyksICZpbmZvKTsKKyAgICAgICAgQVNTRVJUKGlu
Zm8uYm1CaXRzUGl4ZWwgPT0gMzIpOworCisgICAgICAgIENHQ29sb3JTcGFjZVJlZiBkZXZpY2VS
R0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKKyAgICAgICAgQ0dDb250ZXh0UmVm
IGJpdG1hcENvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUoaW5mby5ibUJpdHMsIGluZm8u
Ym1XaWR0aCwgaW5mby5ibUhlaWdodCwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJH
Qiwga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCAKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN1cHBvcnRBbHBoYUJsZW5kID8g
a0NHSW1hZ2VBbHBoYVByZW11bHRpcGxpZWRGaXJzdCA6IGtDR0ltYWdlQWxwaGFOb25lU2tpcEZp
cnN0KSk7CisgICAgICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKKworICAgICAg
ICBDR0ltYWdlUmVmIGltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlSW1hZ2UoYml0bWFwQ29u
dGV4dCk7CisgICAgICAgIENHQ29udGV4dERyYXdJbWFnZShtX2RhdGEtPm1fY2dDb250ZXh0LCBk
c3RSZWN0LCBpbWFnZSk7CisgICAgICAgIAorICAgICAgICAvLyBEZWxldGUgYWxsIG91ciBqdW5r
LgorICAgICAgICBDR0ltYWdlUmVsZWFzZShpbWFnZSk7CisgICAgICAgIENHQ29udGV4dFJlbGVh
c2UoYml0bWFwQ29udGV4dCk7CisgICAgICAgIDo6RGVsZXRlREMoaGRjKTsKKyAgICAgICAgOjpE
ZWxldGVPYmplY3QoYml0bWFwKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9k
YXRhLT5yZXN0b3JlKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRl
OjpzYXZlKCkKK3sKKyAgICBpZiAoIW1faGRjKQorICAgICAgICByZXR1cm47CisgICAgU2F2ZURD
KG1faGRjKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnJlc3Rv
cmUoKQoreworICAgIGlmICghbV9oZGMpCisgICAgICAgIHJldHVybjsKKyAgICBSZXN0b3JlREMo
bV9oZGMsIC0xKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNs
aXAoY29uc3QgSW50UmVjdCYgY2xpcFJlY3QpCit7CisgICAgaWYgKCFtX2hkYykKKyAgICAgICAg
cmV0dXJuOworICAgIEludGVyc2VjdENsaXBSZWN0KG1faGRjLCBjbGlwUmVjdC54KCksIGNsaXBS
ZWN0LnkoKSwgY2xpcFJlY3QucmlnaHQoKSwgY2xpcFJlY3QuYm90dG9tKCkpOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y2xpcChjb25zdCBQYXRoJikKK3sKKyAg
ICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZTo6c2NhbGUoY29uc3QgRmxvYXRTaXplJiBzaXplKQoreworICAgIGlmICghbV9oZGMpCisg
ICAgICAgIHJldHVybjsKKyAgICBYRk9STSB4Zm9ybTsKKyAgICB4Zm9ybS5lTTExID0gc2l6ZS53
aWR0aCgpOworICAgIHhmb3JtLmVNMTIgPSAwOworICAgIHhmb3JtLmVNMjEgPSAwOworICAgIHhm
b3JtLmVNMjIgPSBzaXplLmhlaWdodCgpOworICAgIHhmb3JtLmVEeCA9IDA7CisgICAgeGZvcm0u
ZUR5ID0gMDsKKyAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShtX2hkYywgJnhmb3JtLCBNV1RfTEVG
VE1VTFRJUExZKTsKK30KKworc3RhdGljIGNvbnN0IGRvdWJsZSBkZWcycmFkID0gMC4wMTc0NTMy
OTI1MTk5NDMyOTU3Njk7IC8vIHBpLzE4MAorCit2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3Jt
UHJpdmF0ZTo6cm90YXRlKGZsb2F0IGRlZ3JlZXNBbmdsZSkKK3sKKyAgICBmbG9hdCByYWRpYW5z
QW5nbGUgPSBkZWdyZWVzQW5nbGUgKiBkZWcycmFkOworICAgIGZsb2F0IGNvc0FuZ2xlID0gY29z
ZihyYWRpYW5zQW5nbGUpOworICAgIGZsb2F0IHNpbkFuZ2xlID0gc2luZihyYWRpYW5zQW5nbGUp
OworICAgIFhGT1JNIHhmb3JtOworICAgIHhmb3JtLmVNMTEgPSBjb3NBbmdsZTsKKyAgICB4Zm9y
bS5lTTEyID0gLXNpbkFuZ2xlOworICAgIHhmb3JtLmVNMjEgPSBzaW5BbmdsZTsKKyAgICB4Zm9y
bS5lTTIyID0gY29zQW5nbGU7CisgICAgeGZvcm0uZUR4ID0gMDsKKyAgICB4Zm9ybS5lRHkgPSAw
OworICAgIE1vZGlmeVdvcmxkVHJhbnNmb3JtKG1faGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQ
TFkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6dHJhbnNsYXRl
KGZsb2F0IHggLCBmbG9hdCB5KQoreworICAgIGlmICghbV9oZGMpCisgICAgICAgIHJldHVybjsK
KyAgICBYRk9STSB4Zm9ybTsKKyAgICB4Zm9ybS5lTTExID0gMS4wOworICAgIHhmb3JtLmVNMTIg
PSAwOworICAgIHhmb3JtLmVNMjEgPSAwOworICAgIHhmb3JtLmVNMjIgPSAxLjA7CisgICAgeGZv
cm0uZUR4ID0geDsKKyAgICB4Zm9ybS5lRHkgPSB5OworICAgIE1vZGlmeVdvcmxkVHJhbnNmb3Jt
KG1faGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdHJh
bnNmb3JtKQoreworICAgIGlmICghbV9oZGMpCisgICAgICAgIHJldHVybjsKKyAgICBDR0FmZmlu
ZVRyYW5zZm9ybSBtYXQgPSB0cmFuc2Zvcm07CisgICAgWEZPUk0geGZvcm07CisgICAgeGZvcm0u
ZU0xMSA9IG1hdC5hOworICAgIHhmb3JtLmVNMTIgPSBtYXQuYjsKKyAgICB4Zm9ybS5lTTIxID0g
bWF0LmM7CisgICAgeGZvcm0uZU0yMiA9IG1hdC5kOworICAgIHhmb3JtLmVEeCA9IG1hdC50eDsK
KyAgICB4Zm9ybS5lRHkgPSBtYXQudHk7CisgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMs
ICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpk
cmF3Rm9jdXNSaW5nKGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNh
YmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBmbG9hdCByYWRpdXMgPSAoZm9jdXNSaW5n
V2lkdGgoKSAtIDEpIC8gMi4wZjsKKyAgICBpbnQgb2Zmc2V0ID0gcmFkaXVzICsgZm9jdXNSaW5n
T2Zmc2V0KCk7CisgICAgQ0dDb2xvclJlZiBjb2xvclJlZiA9IGNvbG9yLmlzVmFsaWQoKSA/IGNn
Q29sb3IoY29sb3IpIDogMDsKKworICAgIENHTXV0YWJsZVBhdGhSZWYgZm9jdXNSaW5nUGF0aCA9
IENHUGF0aENyZWF0ZU11dGFibGUoKTsKKyAgICBjb25zdCBWZWN0b3I8SW50UmVjdD4mIHJlY3Rz
ID0gZm9jdXNSaW5nUmVjdHMoKTsKKyAgICB1bnNpZ25lZCByZWN0Q291bnQgPSByZWN0cy5zaXpl
KCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlY3RDb3VudDsgaSsrKQorICAgICAg
ICBDR1BhdGhBZGRSZWN0KGZvY3VzUmluZ1BhdGgsIDAsIENHUmVjdEluc2V0KHJlY3RzW2ldLCAt
b2Zmc2V0LCAtb2Zmc2V0KSk7CisKKyAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IHBsYXRmb3Jt
Q29udGV4dCgpOworICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7CisKKyAgICBDR0Nv
bnRleHRCZWdpblBhdGgoY29udGV4dCk7CisgICAgQ0dDb250ZXh0QWRkUGF0aChjb250ZXh0LCBm
b2N1c1JpbmdQYXRoKTsKKworICAgIHdrRHJhd0ZvY3VzUmluZyhjb250ZXh0LCBjb2xvclJlZiwg
cmFkaXVzKTsKKworICAgIENHQ29sb3JSZWxlYXNlKGNvbG9yUmVmKTsKKworICAgIENHUGF0aFJl
bGVhc2UoZm9jdXNSaW5nUGF0aCk7CisKKyAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRl
eHQpOworfQorCitzdGF0aWMgY29uc3QgQ29sb3ImIHNwZWxsaW5nUGF0dGVybkNvbG9yKCkgewor
ICAgIHN0YXRpYyBjb25zdCBDb2xvciBzcGVsbGluZ0NvbG9yKDI1NSwgMCwgMCk7CisgICAgcmV0
dXJuIHNwZWxsaW5nQ29sb3I7Cit9CisKK3N0YXRpYyBjb25zdCBDb2xvciYgZ3JhbW1hclBhdHRl
cm5Db2xvcigpIHsKKyAgICBzdGF0aWMgY29uc3QgQ29sb3IgZ3JhbW1hckNvbG9yKDAsIDEyOCwg
MCk7CisgICAgcmV0dXJuIGdyYW1tYXJDb2xvcjsKK30KKworLy8gUHVsbGVkIGZyb20gR3JhcGhp
Y3NDb250ZXh0Q0cKK3N0YXRpYyB2b2lkIHNldENHU3Ryb2tlQ29sb3IoQ0dDb250ZXh0UmVmIGNv
bnRleHQsIGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBDR0Zsb2F0IHJlZCwgZ3JlZW4sIGJs
dWUsIGFscGhhOworICAgIGNvbG9yLmdldFJHQkEocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwor
ICAgIENHQ29udGV4dFNldFJHQlN0cm9rZUNvbG9yKGNvbnRleHQsIHJlZCwgZ3JlZW4sIGJsdWUs
IGFscGhhKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yTWlzc3BlbGxp
bmdPckJhZEdyYW1tYXIoY29uc3QgSW50UG9pbnQmIHBvaW50LCBpbnQgd2lkdGgsIGJvb2wgZ3Jh
bW1hcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47Cisg
ICAgCisgICAgLy8gVGhlc2UgYXJlIHRoZSBzYW1lIGZvciBtaXNzcGVsbGluZyBvciBiYWQgZ3Jh
bW1hcgorICAgIGNvbnN0IGludCBwYXR0ZXJuSGVpZ2h0ID0gMzsgLy8gMyByb3dzCisgICAgQVNT
RVJUKGNNaXNzcGVsbGluZ0xpbmVUaGlja25lc3MgPT0gcGF0dGVybkhlaWdodCk7CisgICAgY29u
c3QgaW50IHBhdHRlcm5XaWR0aCA9IDQ7IC8vIDQgcGl4ZWxzCisgICAgQVNTRVJUKHBhdHRlcm5X
aWR0aCA9PSBjTWlzc3BlbGxpbmdMaW5lUGF0dGVybldpZHRoKTsKKworICAgIC8vIE1ha2Ugc3Vy
ZSB0byBkcmF3IG9ubHkgY29tcGxldGUgZG90cy4KKyAgICAvLyBOT1RFOiBDb2RlIGhlcmUgdXNl
ZCB0byBzaGlmdCB0aGUgdW5kZXJsaW5lIHRvIHRoZSBsZWZ0IGFuZCBpbmNyZWFzZSB0aGUgd2lk
dGgKKyAgICAvLyB0byBtYWtlIHN1cmUgZXZlcnl0aGluZyBnZXRzIHVuZGVybGluZWQsIGJ1dCB0
aGF0IHJlc3VsdHMgaW4gZHJhd2luZyBvdXQgb2YKKyAgICAvLyBib3VuZHMgKGUuZy4gd2hlbiBh
dCB0aGUgZWRnZSBvZiBhIHZpZXcpIGFuZCBjb3VsZCBtYWtlIGl0IGFwcGVhciB0aGF0IHRoZQor
ICAgIC8vIHNwYWNlIGJldHdlZW4gYWRqYWNlbnQgbWlzc3BlbGxlZCB3b3JkcyB3YXMgdW5kZXJs
aW5lZC4KKyAgICAvLyBhbGxvdyBzbGlnaHRseSBtb3JlIGNvbnNpZGVyaW5nIHRoYXQgdGhlIHBh
dHRlcm4gZW5kcyB3aXRoIGEgdHJhbnNwYXJlbnQgcGl4ZWwKKyAgICBpbnQgd2lkdGhNb2QgPSB3
aWR0aCAlIHBhdHRlcm5XaWR0aDsKKyAgICBpZiAocGF0dGVybldpZHRoIC0gd2lkdGhNb2QgPiBj
TWlzc3BlbGxpbmdMaW5lUGF0dGVybkdhcFdpZHRoKQorICAgICAgICB3aWR0aCAtPSB3aWR0aE1v
ZDsKKyAgICAgIAorICAgIC8vIERyYXcgdGhlIHVuZGVybGluZQorICAgIENHQ29udGV4dFJlZiBj
b250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCk7CisgICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShjb250
ZXh0KTsKKworICAgIGNvbnN0IENvbG9yJiBwYXR0ZXJuQ29sb3IgPSBncmFtbWFyID8gZ3JhbW1h
clBhdHRlcm5Db2xvcigpIDogc3BlbGxpbmdQYXR0ZXJuQ29sb3IoKTsKKyAgICBzZXRDR1N0cm9r
ZUNvbG9yKGNvbnRleHQsIHBhdHRlcm5Db2xvcik7CisKKyAgICB3a1NldFBhdHRlcm5QaGFzZUlu
VXNlclNwYWNlKGNvbnRleHQsIHBvaW50KTsKKyAgICBDR0NvbnRleHRTZXRCbGVuZE1vZGUoY29u
dGV4dCwga0NHQmxlbmRNb2RlTm9ybWFsKTsKKyAgICAKKyAgICAvLyAzIHJvd3MsIGVhY2ggb2Zm
c2V0IGJ5IGhhbGYgYSBwaXhlbCBmb3IgYmxlbmRpbmcgcHVycG9zZXMKKyAgICBjb25zdCBDR1Bv
aW50IHVwcGVyUG9pbnRzIFtdID0ge3twb2ludC54KCksIHBvaW50LnkoKSArIHBhdHRlcm5IZWln
aHQgLSAyLjUgfSwge3BvaW50LngoKSArIHdpZHRoLCBwb2ludC55KCkgKyBwYXR0ZXJuSGVpZ2h0
IC0gMi41fX07CisgICAgY29uc3QgQ0dQb2ludCBtaWRkbGVQb2ludHMgW10gPSB7e3BvaW50Lngo
KSwgcG9pbnQueSgpICsgcGF0dGVybkhlaWdodCAtIDEuNSB9LCB7cG9pbnQueCgpICsgd2lkdGgs
IHBvaW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAxLjV9fTsKKyAgICBjb25zdCBDR1BvaW50IGxv
d2VyUG9pbnRzIFtdID0ge3twb2ludC54KCksIHBvaW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAw
LjUgfSwge3BvaW50LngoKSArIHdpZHRoLCBwb2ludC55KCkgKyBwYXR0ZXJuSGVpZ2h0IC0gMC41
IH19OworICAgIAorICAgIC8vIERhc2ggbGVuZ3RocyBmb3IgdGhlIHRvcCBhbmQgYm90dG9tIG9m
IHRoZSBlcnJvciB1bmRlcmxpbmUgYXJlIHRoZSBzYW1lLgorICAgIC8vIFRoZXNlIGFyZSBtYWdp
Yy4KKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgZWRnZV9kYXNoX2xlbmd0aHNbXSA9IHsyLCAyfTsK
KyAgICBzdGF0aWMgY29uc3QgZmxvYXQgbWlkZGxlX2Rhc2hfbGVuZ3Roc1tdID0gezIuNzZmLCAx
LjI0Zn07CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGVkZ2Vfb2Zmc2V0ID0gLShlZGdlX2Rhc2hf
bGVuZ3Roc1sxXSAtIDEuMGYpIC8gMi4wZjsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgbWlkZGxl
X29mZnNldCA9IC0obWlkZGxlX2Rhc2hfbGVuZ3Roc1sxXSAtIDEuMGYpIC8gMi4wZjsKKworICAg
IC8vIExpbmUgb3BhY2l0aWVzLiAgT25jZSBhZ2FpbiwgdGhlc2UgYXJlIG1hZ2ljLgorICAgIGNv
bnN0IGZsb2F0IHVwcGVyT3BhY2l0eSA9IDAuMzNmOworICAgIGNvbnN0IGZsb2F0IG1pZGRsZU9w
YWNpdHkgPSAwLjc1ZjsKKyAgICBjb25zdCBmbG9hdCBsb3dlck9wYWNpdHkgPSAwLjg4ZjsKKwor
ICAgIC8vVG9wIGxpbmUKKyAgICBDR0NvbnRleHRTZXRMaW5lRGFzaChjb250ZXh0LCBlZGdlX29m
ZnNldCwgZWRnZV9kYXNoX2xlbmd0aHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVv
ZihlZGdlX2Rhc2hfbGVuZ3RocykgLyBzaXplb2YoZWRnZV9kYXNoX2xlbmd0aHNbMF0pKTsKKyAg
ICBDR0NvbnRleHRTZXRBbHBoYShjb250ZXh0LCB1cHBlck9wYWNpdHkpOworICAgIENHQ29udGV4
dFN0cm9rZUxpbmVTZWdtZW50cyhjb250ZXh0LCB1cHBlclBvaW50cywgMik7CisgCisgICAgLy8g
TWlkZGxlIGxpbmUKKyAgICBDR0NvbnRleHRTZXRMaW5lRGFzaChjb250ZXh0LCBtaWRkbGVfb2Zm
c2V0LCBtaWRkbGVfZGFzaF9sZW5ndGhzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXpl
b2YobWlkZGxlX2Rhc2hfbGVuZ3RocykgLyBzaXplb2YobWlkZGxlX2Rhc2hfbGVuZ3Roc1swXSkp
OworICAgIENHQ29udGV4dFNldEFscGhhKGNvbnRleHQsIG1pZGRsZU9wYWNpdHkpOworICAgIENH
Q29udGV4dFN0cm9rZUxpbmVTZWdtZW50cyhjb250ZXh0LCBtaWRkbGVQb2ludHMsIDIpOworICAg
IAorICAgIC8vIEJvdHRvbSBsaW5lCisgICAgQ0dDb250ZXh0U2V0TGluZURhc2goY29udGV4dCwg
ZWRnZV9vZmZzZXQsIGVkZ2VfZGFzaF9sZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAg
IHNpemVvZihlZGdlX2Rhc2hfbGVuZ3RocykgLyBzaXplb2YoZWRnZV9kYXNoX2xlbmd0aHNbMF0p
KTsKKyAgICBDR0NvbnRleHRTZXRBbHBoYShjb250ZXh0LCBsb3dlck9wYWNpdHkpOworICAgIENH
Q29udGV4dFN0cm9rZUxpbmVTZWdtZW50cyhjb250ZXh0LCBsb3dlclBvaW50cywgMik7CisKKyAg
ICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOworfQorCisjaWYgRU5BQkxFKFNWRykK
K0dyYXBoaWNzQ29udGV4dCogY29udGV4dEZvckltYWdlKFNWR1Jlc291cmNlSW1hZ2UqKQorewor
ICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBnbyBpbiBHcmFwaGljc0NvbnRleHRDRy5jcHAKKyAg
ICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKK30KSW5kZXg6
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENHV2luLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRl
eHRDR1dpbi5jcHAJKHJldmlzaW9uIDI5NzI2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW4vR3JhcGhpY3NDb250ZXh0Q0dXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEs
NSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIw
MDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yOSwyMSArMjksMTggQEAKICNp
bmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgog
I2luY2x1ZGUgIlBhdGguaCIKKwogI2luY2x1ZGUgPENvcmVHcmFwaGljcy9DR0JpdG1hcENvbnRl
eHQuaD4KICNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJm
YWNlLmg+Ci0jaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KLQogI2luY2x1ZGUgIkdyYXBoaWNz
Q29udGV4dFBsYXRmb3JtUHJpdmF0ZS5oIgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCiBuYW1l
c3BhY2UgV2ViQ29yZSB7CiAKLWNsYXNzIFNWR1Jlc291cmNlSW1hZ2U7Ci0KIHN0YXRpYyBDR0Nv
bnRleHRSZWYgQ0dDb250ZXh0V2l0aEhEQyhIREMgaGRjKQogewotICAgIEhCSVRNQVAgYml0bWFw
ID0gKEhCSVRNQVApR2V0Q3VycmVudE9iamVjdChoZGMsIE9CSl9CSVRNQVApOworICAgIEhCSVRN
QVAgYml0bWFwID0gc3RhdGljX2Nhc3Q8SEJJVE1BUD4oR2V0Q3VycmVudE9iamVjdChoZGMsIE9C
Sl9CSVRNQVApKTsKICAgICBDR0NvbG9yU3BhY2VSZWYgZGV2aWNlUkdCID0gQ0dDb2xvclNwYWNl
Q3JlYXRlRGV2aWNlUkdCKCk7CiAgICAgQklUTUFQIGluZm87CiAKQEAgLTExOCwxMCArMTE1LDEw
IEBAIEhEQyBHcmFwaGljc0NvbnRleHQ6OmdldFdpbmRvd3NDb250ZXh0KGMKIAogICAgICAgICAv
LyBBcHBseSBhIHRyYW5zbGF0aW9uIHRvIG91ciBjb250ZXh0IHNvIHRoYXQgdGhlIGRyYXdpbmcg
ZG9uZSB3aWxsIGJlIGF0ICgwLDApIG9mIHRoZSBiaXRtYXAuCiAgICAgICAgIFhGT1JNIHhmb3Jt
OwotICAgICAgICB4Zm9ybS5lTTExID0gMS4wOwotICAgICAgICB4Zm9ybS5lTTEyID0gMDsKLSAg
ICAgICAgeGZvcm0uZU0yMSA9IDA7Ci0gICAgICAgIHhmb3JtLmVNMjIgPSAxLjA7CisgICAgICAg
IHhmb3JtLmVNMTEgPSAxLjBmOworICAgICAgICB4Zm9ybS5lTTEyID0gMC4wZjsKKyAgICAgICAg
eGZvcm0uZU0yMSA9IDAuMGY7CisgICAgICAgIHhmb3JtLmVNMjIgPSAxLjBmOwogICAgICAgICB4
Zm9ybS5lRHggPSAtZHN0UmVjdC54KCk7CiAgICAgICAgIHhmb3JtLmVEeSA9IC1kc3RSZWN0Lnko
KTsKICAgICAgICAgOjpTZXRXb3JsZFRyYW5zZm9ybShiaXRtYXBEQywgJnhmb3JtKTsKQEAgLTEz
NCwxNSArMTMxLDEzIEBAIEhEQyBHcmFwaGljc0NvbnRleHQ6OmdldFdpbmRvd3NDb250ZXh0KGMK
ICAgICByZXR1cm4gbV9kYXRhLT5tX2hkYzsKIH0KIAotYm9vbCBHcmFwaGljc0NvbnRleHQ6Omlu
VHJhbnNwYXJlbmN5TGF5ZXIoKSBjb25zdCB7IHJldHVybiBtX2RhdGEtPm1fdHJhbnNwYXJlbmN5
Q291bnQ7IH0KLQogdm9pZCBHcmFwaGljc0NvbnRleHQ6OnJlbGVhc2VXaW5kb3dzQ29udGV4dChI
REMgaGRjLCBjb25zdCBJbnRSZWN0JiBkc3RSZWN0LCBib29sIHN1cHBvcnRBbHBoYUJsZW5kKQog
ewogICAgIGlmIChoZGMgJiYgaW5UcmFuc3BhcmVuY3lMYXllcigpKSB7CiAgICAgICAgIGlmIChk
c3RSZWN0LmlzRW1wdHkoKSkKICAgICAgICAgICAgIHJldHVybjsKIAotICAgICAgICBIQklUTUFQ
IGJpdG1hcCA9IChIQklUTUFQKUdldEN1cnJlbnRPYmplY3QoaGRjLCBPQkpfQklUTUFQKTsKKyAg
ICAgICAgSEJJVE1BUCBiaXRtYXAgPSBzdGF0aWNfY2FzdDxIQklUTUFQPihHZXRDdXJyZW50T2Jq
ZWN0KGhkYywgT0JKX0JJVE1BUCkpOwogCiAgICAgICAgIC8vIE5lZWQgdG8gbWFrZSBhIENHSW1h
Z2Ugb3V0IG9mIHRoZSBiaXRtYXAncyBwaXhlbCBidWZmZXIgYW5kIHRoZW4gZHJhdwogICAgICAg
ICAvLyBpdCBpbnRvIG91ciBjb250ZXh0LgpAQCAtMjAzLDExICsxOTgsMTEgQEAgdm9pZCBHcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnNjYQogICAgICAgICByZXR1cm47CiAgICAgWEZP
Uk0geGZvcm07CiAgICAgeGZvcm0uZU0xMSA9IHNpemUud2lkdGgoKTsKLSAgICB4Zm9ybS5lTTEy
ID0gMDsKLSAgICB4Zm9ybS5lTTIxID0gMDsKKyAgICB4Zm9ybS5lTTEyID0gMC4wZjsKKyAgICB4
Zm9ybS5lTTIxID0gMC4wZjsKICAgICB4Zm9ybS5lTTIyID0gc2l6ZS5oZWlnaHQoKTsKLSAgICB4
Zm9ybS5lRHggPSAwOwotICAgIHhmb3JtLmVEeSA9IDA7CisgICAgeGZvcm0uZUR4ID0gMC4wZjsK
KyAgICB4Zm9ybS5lRHkgPSAwLjBmOwogICAgIE1vZGlmeVdvcmxkVHJhbnNmb3JtKG1faGRjLCAm
eGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOwogfQogCkBAIC0yMjMsOCArMjE4LDggQEAgdm9pZCBH
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnJvdAogICAgIHhmb3JtLmVNMTIgPSAtc2lu
QW5nbGU7CiAgICAgeGZvcm0uZU0yMSA9IHNpbkFuZ2xlOwogICAgIHhmb3JtLmVNMjIgPSBjb3NB
bmdsZTsKLSAgICB4Zm9ybS5lRHggPSAwOwotICAgIHhmb3JtLmVEeSA9IDA7CisgICAgeGZvcm0u
ZUR4ID0gMC4wZjsKKyAgICB4Zm9ybS5lRHkgPSAwLjBmOwogICAgIE1vZGlmeVdvcmxkVHJhbnNm
b3JtKG1faGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOwogfQogCkBAIC0yMzMsMTAgKzIy
OCwxMCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6dHJhCiAgICAgaWYg
KCFtX2hkYykKICAgICAgICAgcmV0dXJuOwogICAgIFhGT1JNIHhmb3JtOwotICAgIHhmb3JtLmVN
MTEgPSAxLjA7Ci0gICAgeGZvcm0uZU0xMiA9IDA7Ci0gICAgeGZvcm0uZU0yMSA9IDA7Ci0gICAg
eGZvcm0uZU0yMiA9IDEuMDsKKyAgICB4Zm9ybS5lTTExID0gMS4wZjsKKyAgICB4Zm9ybS5lTTEy
ID0gMC4wZjsKKyAgICB4Zm9ybS5lTTIxID0gMC4wZjsKKyAgICB4Zm9ybS5lTTIyID0gMS4wZjsK
ICAgICB4Zm9ybS5lRHggPSB4OwogICAgIHhmb3JtLmVEeSA9IHk7CiAgICAgTW9kaWZ5V29ybGRU
cmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7CkBAIC0yNDYsNiArMjQx
LDcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNvbgogewogICAgIGlm
ICghbV9oZGMpCiAgICAgICAgIHJldHVybjsKKwogICAgIENHQWZmaW5lVHJhbnNmb3JtIG1hdCA9
IHRyYW5zZm9ybTsKICAgICBYRk9STSB4Zm9ybTsKICAgICB4Zm9ybS5lTTExID0gbWF0LmE7CkBA
IC0yNTQsNiArMjUwLDcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNv
bgogICAgIHhmb3JtLmVNMjIgPSBtYXQuZDsKICAgICB4Zm9ybS5lRHggPSBtYXQudHg7CiAgICAg
eGZvcm0uZUR5ID0gbWF0LnR5OworCiAgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4
Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7CiB9CiAKQEAgLTI4Nyw2ICsyODQsMTQgQEAgdm9pZCBH
cmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1c1JpbmcoY29ucwogICAgIENHQ29udGV4dFJlc3RvcmVH
U3RhdGUoY29udGV4dCk7CiB9CiAKKy8vIFB1bGxlZCBmcm9tIEdyYXBoaWNzQ29udGV4dENHCitz
dGF0aWMgdm9pZCBzZXRDR1N0cm9rZUNvbG9yKENHQ29udGV4dFJlZiBjb250ZXh0LCBjb25zdCBD
b2xvciYgY29sb3IpCit7CisgICAgQ0dGbG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKKyAg
ICBjb2xvci5nZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAgICBDR0NvbnRleHRT
ZXRSR0JTdHJva2VDb2xvcihjb250ZXh0LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Cit9CisK
IHN0YXRpYyBjb25zdCBDb2xvciYgc3BlbGxpbmdQYXR0ZXJuQ29sb3IoKSB7CiAgICAgc3RhdGlj
IGNvbnN0IENvbG9yIHNwZWxsaW5nQ29sb3IoMjU1LCAwLCAwKTsKICAgICByZXR1cm4gc3BlbGxp
bmdDb2xvcjsKQEAgLTI5NywxOSArMzAyLDExIEBAIHN0YXRpYyBjb25zdCBDb2xvciYgZ3JhbW1h
clBhdHRlcm5Db2xvcigKICAgICByZXR1cm4gZ3JhbW1hckNvbG9yOwogfQogCi0vLyBQdWxsZWQg
ZnJvbSBHcmFwaGljc0NvbnRleHRDRwotc3RhdGljIHZvaWQgc2V0Q0dTdHJva2VDb2xvcihDR0Nv
bnRleHRSZWYgY29udGV4dCwgY29uc3QgQ29sb3ImIGNvbG9yKQotewotICAgIENHRmxvYXQgcmVk
LCBncmVlbiwgYmx1ZSwgYWxwaGE7Ci0gICAgY29sb3IuZ2V0UkdCQShyZWQsIGdyZWVuLCBibHVl
LCBhbHBoYSk7Ci0gICAgQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IoY29udGV4dCwgcmVkLCBn
cmVlbiwgYmx1ZSwgYWxwaGEpOwotfQotCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVG
b3JNaXNzcGVsbGluZ09yQmFkR3JhbW1hcihjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCB3aWR0
aCwgYm9vbCBncmFtbWFyKQogewogICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCiAgICAgICAg
IHJldHVybjsKLSAgICAKKwogICAgIC8vIFRoZXNlIGFyZSB0aGUgc2FtZSBmb3IgbWlzc3BlbGxp
bmcgb3IgYmFkIGdyYW1tYXIKICAgICBjb25zdCBpbnQgcGF0dGVybkhlaWdodCA9IDM7IC8vIDMg
cm93cwogICAgIEFTU0VSVChjTWlzc3BlbGxpbmdMaW5lVGhpY2tuZXNzID09IHBhdHRlcm5IZWln
aHQpOwpAQCAtMzQzLDcgKzM0MCw3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZv
ck1pc3NwZWwKICAgICAKICAgICAvLyBEYXNoIGxlbmd0aHMgZm9yIHRoZSB0b3AgYW5kIGJvdHRv
bSBvZiB0aGUgZXJyb3IgdW5kZXJsaW5lIGFyZSB0aGUgc2FtZS4KICAgICAvLyBUaGVzZSBhcmUg
bWFnaWMuCi0gICAgc3RhdGljIGNvbnN0IGZsb2F0IGVkZ2VfZGFzaF9sZW5ndGhzW10gPSB7Miwg
Mn07CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGVkZ2VfZGFzaF9sZW5ndGhzW10gPSB7Mi4wZiwg
Mi4wZn07CiAgICAgc3RhdGljIGNvbnN0IGZsb2F0IG1pZGRsZV9kYXNoX2xlbmd0aHNbXSA9IHsy
Ljc2ZiwgMS4yNGZ9OwogICAgIHN0YXRpYyBjb25zdCBmbG9hdCBlZGdlX29mZnNldCA9IC0oZWRn
ZV9kYXNoX2xlbmd0aHNbMV0gLSAxLjBmKSAvIDIuMGY7CiAgICAgc3RhdGljIGNvbnN0IGZsb2F0
IG1pZGRsZV9vZmZzZXQgPSAtKG1pZGRsZV9kYXNoX2xlbmd0aHNbMV0gLSAxLjBmKSAvIDIuMGY7
CkBAIC0zNzQsMTMgKzM3MSw0IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvck1p
c3NwZWwKICAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOwogfQogCi0jaWYgRU5B
QkxFKFNWRykKLUdyYXBoaWNzQ29udGV4dCogY29udGV4dEZvckltYWdlKFNWR1Jlc291cmNlSW1h
Z2UqKQotewotICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBnbyBpbiBHcmFwaGljc0NvbnRleHRD
Ry5jcHAKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotICAgIHJldHVybiAwOwotfQotI2VuZGlmCi0K
IH0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENh
aXJvV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9H
cmFwaGljc0NvbnRleHRDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorCisjaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCisj
aW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQYXRoLmgiCisKKyNpbmNsdWRl
IDxjYWlyby13aW4zMi5oPgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0
ZS5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0dy
YXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0KEhEQyBkYykKKyAgICA6IG1fY29tbW9uKGNy
ZWF0ZUdyYXBoaWNzQ29udGV4dFByaXZhdGUoKSkKKyAgICAsIG1fZGF0YShuZXcgR3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlKQoreworICAgIGlmIChkYykgeworICAgICAgICBjYWlyb19z
dXJmYWNlX3QqIHN1cmZhY2UgPSBjYWlyb193aW4zMl9zdXJmYWNlX2NyZWF0ZShkYyk7CisgICAg
ICAgIG1fZGF0YS0+Y3IgPSBjYWlyb19jcmVhdGUoc3VyZmFjZSk7CisJbV9kYXRhLT5tX2hkYyA9
IGRjOworICAgIH0gZWxzZSB7CisgICAgICAgIHNldFBhaW50aW5nRGlzYWJsZWQodHJ1ZSk7Cisg
ICAgICAgIG1fZGF0YS0+Y3IgPSAwOworCW1fZGF0YS0+bV9oZGMgPSAwOworICAgIH0KKworICAg
IGlmIChtX2RhdGEtPmNyKSB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGV4dCBzdGFy
dHMgaW4gc3luYyB3aXRoIG91ciBzdGF0ZS4KKyAgICAgICAgc2V0UGxhdGZvcm1GaWxsQ29sb3Io
ZmlsbENvbG9yKCkpOworICAgICAgICBzZXRQbGF0Zm9ybVN0cm9rZUNvbG9yKHN0cm9rZUNvbG9y
KCkpOworICAgIH0KK30KKworSERDIEdyYXBoaWNzQ29udGV4dDo6Z2V0V2luZG93c0NvbnRleHQo
Y29uc3QgSW50UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVuZCkKK3sKKyAgICAv
LyBUaGlzIGlzIHByb2JhYmx5IHdyb25nLCBhbmQgZGVmaW5pdGVseSBvdXQgb2YgZGF0ZS4gIFB1
bGxlZCBmcm9tIG9sZCBTVk4KKyAgICBjYWlyb19zdXJmYWNlX3QqIHN1cmZhY2UgPSBjYWlyb19n
ZXRfdGFyZ2V0KHBsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBIREMgaGRjID0gY2Fpcm9fd2luMzJf
c3VyZmFjZV9nZXRfZGMoc3VyZmFjZSk7ICAgCisgICAgU2F2ZURDKGhkYyk7CisKKyAgICAvLyBG
SVhNRTogV2UgbmVlZCB0byBtYWtlIHN1cmUgYSBjbGlwIGlzIHJlYWxseSBzZXQgb24gdGhlIEhE
Qy4KKyAgICAvLyBDYWxsIFNldFdvcmxkVHJhbnNmb3JtIHRvIGhvbm9yIHRoZSBjdXJyZW50IENh
aXJvIHRyYW5zZm9ybS4KKyAgICBTZXRHcmFwaGljc01vZGUoaGRjLCBHTV9BRFZBTkNFRCk7IC8v
IFdlIG5lZWQgdGhpcyBjYWxsIGZvciB0aGVtZXMgdG8gaG9ub3Igd29ybGQgdHJhbnNmb3Jtcy4K
KyAgICBjYWlyb19tYXRyaXhfdCBtYXQ7CisgICAgY2Fpcm9fZ2V0X21hdHJpeChwbGF0Zm9ybUNv
bnRleHQoKSwgJm1hdCk7CisgICAgWEZPUk0geGZvcm07CisgICAgeGZvcm0uZU0xMSA9IG1hdC54
eDsKKyAgICB4Zm9ybS5lTTEyID0gbWF0Lnh5OworICAgIHhmb3JtLmVNMjEgPSBtYXQueXg7Cisg
ICAgeGZvcm0uZU0yMiA9IG1hdC55eTsKKyAgICB4Zm9ybS5lRHggPSBtYXQueDA7CisgICAgeGZv
cm0uZUR5ID0gbWF0LnkwOworICAgIFNldFdvcmxkVHJhbnNmb3JtKGhkYywgJnhmb3JtKTsKKwor
ICAgIHJldHVybiBoZGM7Cit9CisKK2Jvb2wgR3JhcGhpY3NDb250ZXh0OjppblRyYW5zcGFyZW5j
eUxheWVyKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLT5tX3RyYW5zcGFyZW5jeUNvdW50OyB9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpyZWxlYXNlV2luZG93c0NvbnRleHQoSERDIGhkYywgY29u
c3QgSW50UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVuZCkKK3sKKyAgICBjYWly
b19zdXJmYWNlX3QqIHN1cmZhY2UgPSBjYWlyb19nZXRfdGFyZ2V0KHBsYXRmb3JtQ29udGV4dCgp
KTsKKyAgICBIREMgaGRjMiA9IGNhaXJvX3dpbjMyX3N1cmZhY2VfZ2V0X2RjKHN1cmZhY2UpOwor
ICAgIFJlc3RvcmVEQyhoZGMyLCAtMSk7CisgICAgY2Fpcm9fc3VyZmFjZV9tYXJrX2RpcnR5KHN1
cmZhY2UpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y29uY2F0Q1RNKGNvbnN0IEFmZmlu
ZVRyYW5zZm9ybSYgdHJhbnNmb3JtKQoreworICAgIGNhaXJvX3N1cmZhY2VfdCogc3VyZmFjZSA9
IGNhaXJvX2dldF90YXJnZXQocGxhdGZvcm1Db250ZXh0KCkpOworICAgIEhEQyBoZGMgPSBjYWly
b193aW4zMl9zdXJmYWNlX2dldF9kYyhzdXJmYWNlKTsgICAKKyAgICBTYXZlREMoaGRjKTsKKwor
ICAgIGNhaXJvX21hdHJpeF90IG1hdDsKKyAgICBjYWlyb19nZXRfbWF0cml4KHBsYXRmb3JtQ29u
dGV4dCgpLCAmbWF0KTsKKyAgICBYRk9STSB4Zm9ybTsKKyAgICB4Zm9ybS5lTTExID0gbWF0Lnh4
OworICAgIHhmb3JtLmVNMTIgPSBtYXQueHk7CisgICAgeGZvcm0uZU0yMSA9IG1hdC55eDsKKyAg
ICB4Zm9ybS5lTTIyID0gbWF0Lnl5OworICAgIHhmb3JtLmVEeCA9IG1hdC54MDsKKyAgICB4Zm9y
bS5lRHkgPSBtYXQueTA7CisKKyAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShoZGMsICZ4Zm9ybSwg
TVdUX0xFRlRNVUxUSVBMWSk7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0dyYXBoaWNzQ29udGV4dFdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0V2luLmNwcAkocmV2aXNpb24gMjk4MzQp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRXaW4uY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAw
MywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCkBAIC0yOSw4ICsyOSw2IEBACiAjaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCiAjaW5j
bHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRlICJQYXRoLmgiCi0jaW5jbHVkZSA8Q29y
ZUdyYXBoaWNzL0NHQml0bWFwQ29udGV4dC5oPgotI2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVy
ZmFjZS9XZWJLaXRTeXN0ZW1JbnRlcmZhY2UuaD4KICNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5o
PgogCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmgiCkBAIC00MSwz
MzkgKzM5LDggQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiBjbGFzcyBTVkdSZXNvdXJjZUltYWdl
OwogCi1zdGF0aWMgQ0dDb250ZXh0UmVmIENHQ29udGV4dFdpdGhIREMoSERDIGhkYykKLXsKLSAg
ICBIQklUTUFQIGJpdG1hcCA9IChIQklUTUFQKUdldEN1cnJlbnRPYmplY3QoaGRjLCBPQkpfQklU
TUFQKTsKLSAgICBDR0NvbG9yU3BhY2VSZWYgZGV2aWNlUkdCID0gQ0dDb2xvclNwYWNlQ3JlYXRl
RGV2aWNlUkdCKCk7Ci0gICAgQklUTUFQIGluZm87Ci0KLSAgICBHZXRPYmplY3QoYml0bWFwLCBz
aXplb2YoaW5mbyksICZpbmZvKTsKLSAgICBBU1NFUlQoaW5mby5ibUJpdHNQaXhlbCA9PSAzMik7
Ci0gICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUoaW5mby5i
bUJpdHMsIGluZm8uYm1XaWR0aCwgaW5mby5ibUhlaWdodCwgOCwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmJtV2lkdGhCeXRlcywgZGV2aWNl
UkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFOb25lU2tpcEZp
cnN0KTsKLSAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKGRldmljZVJHQik7Ci0KLSAgICAvLyBGbGlw
IGNvb3JkcwotICAgIENHQ29udGV4dFRyYW5zbGF0ZUNUTShjb250ZXh0LCAwLCBpbmZvLmJtSGVp
Z2h0KTsKLSAgICBDR0NvbnRleHRTY2FsZUNUTShjb250ZXh0LCAxLCAtMSk7Ci0gICAgCi0gICAg
Ly8gUHV0IHRoZSBIREMgSW4gYWR2YW5jZWQgbW9kZSBzbyBpdCB3aWxsIGhvbm9yIGFmZmluZSB0
cmFuc2Zvcm1zLgotICAgIFNldEdyYXBoaWNzTW9kZShoZGMsIEdNX0FEVkFOQ0VEKTsKLSAgICAK
LSAgICByZXR1cm4gY29udGV4dDsKLX0KLQotR3JhcGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRl
eHQoSERDIGhkYykKLSAgICA6IG1fY29tbW9uKGNyZWF0ZUdyYXBoaWNzQ29udGV4dFByaXZhdGUo
KSkKLSAgICAsIG1fZGF0YShuZXcgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKENHQ29u
dGV4dFdpdGhIREMoaGRjKSkpCi17Ci0gICAgQ0dDb250ZXh0UmVsZWFzZShtX2RhdGEtPm1fY2dD
b250ZXh0KTsKLSAgICBtX2RhdGEtPm1faGRjID0gaGRjOwotICAgIHNldFBhaW50aW5nRGlzYWJs
ZWQoIW1fZGF0YS0+bV9jZ0NvbnRleHQpOwotICAgIGlmIChtX2RhdGEtPm1fY2dDb250ZXh0KSB7
Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGV4dCBzdGFydHMgaW4gc3luYyB3aXRoIG91
ciBzdGF0ZS4KLSAgICAgICAgc2V0UGxhdGZvcm1GaWxsQ29sb3IoZmlsbENvbG9yKCkpOwotICAg
ICAgICBzZXRQbGF0Zm9ybVN0cm9rZUNvbG9yKHN0cm9rZUNvbG9yKCkpOwotICAgIH0KLX0KLQot
SERDIEdyYXBoaWNzQ29udGV4dDo6Z2V0V2luZG93c0NvbnRleHQoY29uc3QgSW50UmVjdCYgZHN0
UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVuZCkKLXsKLSAgICBpZiAoaW5UcmFuc3BhcmVuY3lM
YXllcigpKSB7Ci0gICAgICAgIGlmIChkc3RSZWN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJl
dHVybiAwOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIGJpdG1hcCBEQyBpbiB3aGljaCB0byBkcmF3
LgotICAgICAgICBCSVRNQVBJTkZPIGJpdG1hcEluZm87Ci0gICAgICAgIGJpdG1hcEluZm8uYm1p
SGVhZGVyLmJpU2l6ZSAgICAgICAgICA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKLSAgICAg
ICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlXaWR0aCAgICAgICAgID0gZHN0UmVjdC53aWR0aCgp
OyAKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlIZWlnaHQgICAgICAgID0gZHN0UmVj
dC5oZWlnaHQoKTsKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlQbGFuZXMgICAgICAg
ID0gMTsKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlCaXRDb3VudCAgICAgID0gMzI7
Ci0gICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpQ29tcHJlc3Npb24gICA9IEJJX1JHQjsK
LSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlTaXplSW1hZ2UgICAgID0gMDsKLSAgICAg
ICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlYUGVsc1Blck1ldGVyID0gMDsKLSAgICAgICAgYml0
bWFwSW5mby5ibWlIZWFkZXIuYmlZUGVsc1Blck1ldGVyID0gMDsKLSAgICAgICAgYml0bWFwSW5m
by5ibWlIZWFkZXIuYmlDbHJVc2VkICAgICAgID0gMDsKLSAgICAgICAgYml0bWFwSW5mby5ibWlI
ZWFkZXIuYmlDbHJJbXBvcnRhbnQgID0gMDsKLQotICAgICAgICB2b2lkKiBwaXhlbHMgPSAwOwot
ICAgICAgICBIQklUTUFQIGJpdG1hcCA9IDo6Q3JlYXRlRElCU2VjdGlvbihOVUxMLCAmYml0bWFw
SW5mbywgRElCX1JHQl9DT0xPUlMsICZwaXhlbHMsIDAsIDApOwotICAgICAgICBpZiAoIWJpdG1h
cCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIEhEQyBiaXRtYXBEQyA9IDo6Q3Jl
YXRlQ29tcGF0aWJsZURDKG1fZGF0YS0+bV9oZGMpOwotICAgICAgICA6OlNlbGVjdE9iamVjdChi
aXRtYXBEQywgYml0bWFwKTsKLQotICAgICAgICAvLyBGaWxsIG91ciBidWZmZXIgd2l0aCBjbGVh
ciBpZiB3ZSdyZSBnb2luZyB0byBhbHBoYSBibGVuZC4KLSAgICAgICAgaWYgKHN1cHBvcnRBbHBo
YUJsZW5kKSB7Ci0gICAgICAgICAgICBCSVRNQVAgYm1wSW5mbzsKLSAgICAgICAgICAgIEdldE9i
amVjdChiaXRtYXAsIHNpemVvZihibXBJbmZvKSwgJmJtcEluZm8pOwotICAgICAgICAgICAgaW50
IGJ1ZmZlclNpemUgPSBibXBJbmZvLmJtV2lkdGhCeXRlcyAqIGJtcEluZm8uYm1IZWlnaHQ7Ci0g
ICAgICAgICAgICBtZW1zZXQoYm1wSW5mby5ibUJpdHMsIDAsIGJ1ZmZlclNpemUpOwotICAgICAg
ICB9Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGNhbiBkbyB3b3JsZCB0cmFuc2Zvcm1zLgot
ICAgICAgICBTZXRHcmFwaGljc01vZGUoYml0bWFwREMsIEdNX0FEVkFOQ0VEKTsKLQotICAgICAg
ICAvLyBBcHBseSBhIHRyYW5zbGF0aW9uIHRvIG91ciBjb250ZXh0IHNvIHRoYXQgdGhlIGRyYXdp
bmcgZG9uZSB3aWxsIGJlIGF0ICgwLDApIG9mIHRoZSBiaXRtYXAuCi0gICAgICAgIFhGT1JNIHhm
b3JtOwotICAgICAgICB4Zm9ybS5lTTExID0gMS4wOwotICAgICAgICB4Zm9ybS5lTTEyID0gMDsK
LSAgICAgICAgeGZvcm0uZU0yMSA9IDA7Ci0gICAgICAgIHhmb3JtLmVNMjIgPSAxLjA7Ci0gICAg
ICAgIHhmb3JtLmVEeCA9IC1kc3RSZWN0LngoKTsKLSAgICAgICAgeGZvcm0uZUR5ID0gLWRzdFJl
Y3QueSgpOwotICAgICAgICA6OlNldFdvcmxkVHJhbnNmb3JtKGJpdG1hcERDLCAmeGZvcm0pOwot
Ci0gICAgICAgIHJldHVybiBiaXRtYXBEQzsKLSAgICB9Ci0KLSAgICBDR0NvbnRleHRGbHVzaChw
bGF0Zm9ybUNvbnRleHQoKSk7Ci0gICAgbV9kYXRhLT5zYXZlKCk7Ci0gICAgcmV0dXJuIG1fZGF0
YS0+bV9oZGM7Ci19Ci0KIGJvb2wgR3JhcGhpY3NDb250ZXh0OjppblRyYW5zcGFyZW5jeUxheWVy
KCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLT5tX3RyYW5zcGFyZW5jeUNvdW50OyB9CiAKLXZvaWQg
R3JhcGhpY3NDb250ZXh0OjpyZWxlYXNlV2luZG93c0NvbnRleHQoSERDIGhkYywgY29uc3QgSW50
UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVuZCkKLXsKLSAgICBpZiAoaGRjICYm
IGluVHJhbnNwYXJlbmN5TGF5ZXIoKSkgewotICAgICAgICBpZiAoZHN0UmVjdC5pc0VtcHR5KCkp
Ci0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgSEJJVE1BUCBiaXRtYXAgPSAoSEJJVE1B
UClHZXRDdXJyZW50T2JqZWN0KGhkYywgT0JKX0JJVE1BUCk7Ci0KLSAgICAgICAgLy8gTmVlZCB0
byBtYWtlIGEgQ0dJbWFnZSBvdXQgb2YgdGhlIGJpdG1hcCdzIHBpeGVsIGJ1ZmZlciBhbmQgdGhl
biBkcmF3Ci0gICAgICAgIC8vIGl0IGludG8gb3VyIGNvbnRleHQuCi0gICAgICAgIEJJVE1BUCBp
bmZvOwotICAgICAgICBHZXRPYmplY3QoYml0bWFwLCBzaXplb2YoaW5mbyksICZpbmZvKTsKLSAg
ICAgICAgQVNTRVJUKGluZm8uYm1CaXRzUGl4ZWwgPT0gMzIpOwotCi0gICAgICAgIENHQ29sb3JT
cGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKLSAgICAg
ICAgQ0dDb250ZXh0UmVmIGJpdG1hcENvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUoaW5m
by5ibUJpdHMsIGluZm8uYm1XaWR0aCwgaW5mby5ibUhlaWdodCwgOCwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5ibVdpZHRo
Qnl0ZXMsIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCAKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN1cHBv
cnRBbHBoYUJsZW5kID8ga0NHSW1hZ2VBbHBoYVByZW11bHRpcGxpZWRGaXJzdCA6IGtDR0ltYWdl
QWxwaGFOb25lU2tpcEZpcnN0KSk7Ci0gICAgICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNl
UkdCKTsKLQotICAgICAgICBDR0ltYWdlUmVmIGltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRl
SW1hZ2UoYml0bWFwQ29udGV4dCk7Ci0gICAgICAgIENHQ29udGV4dERyYXdJbWFnZShtX2RhdGEt
Pm1fY2dDb250ZXh0LCBkc3RSZWN0LCBpbWFnZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBEZWxl
dGUgYWxsIG91ciBqdW5rLgotICAgICAgICBDR0ltYWdlUmVsZWFzZShpbWFnZSk7Ci0gICAgICAg
IENHQ29udGV4dFJlbGVhc2UoYml0bWFwQ29udGV4dCk7Ci0gICAgICAgIDo6RGVsZXRlREMoaGRj
KTsKLSAgICAgICAgOjpEZWxldGVPYmplY3QoYml0bWFwKTsKLQotICAgICAgICByZXR1cm47Ci0g
ICAgfQotCi0gICAgbV9kYXRhLT5yZXN0b3JlKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlOjpzYXZlKCkKLXsKLSAgICBpZiAoIW1faGRjKQotICAgICAgICByZXR1
cm47Ci0gICAgU2F2ZURDKG1faGRjKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9y
bVByaXZhdGU6OnJlc3RvcmUoKQotewotICAgIGlmICghbV9oZGMpCi0gICAgICAgIHJldHVybjsK
LSAgICBSZXN0b3JlREMobV9oZGMsIC0xKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGU6OmNsaXAoY29uc3QgSW50UmVjdCYgY2xpcFJlY3QpCi17Ci0gICAgaWYgKCFt
X2hkYykKLSAgICAgICAgcmV0dXJuOwotICAgIEludGVyc2VjdENsaXBSZWN0KG1faGRjLCBjbGlw
UmVjdC54KCksIGNsaXBSZWN0LnkoKSwgY2xpcFJlY3QucmlnaHQoKSwgY2xpcFJlY3QuYm90dG9t
KCkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y2xpcChjb25z
dCBQYXRoJikKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZTo6c2NhbGUoY29uc3QgRmxvYXRTaXplJiBzaXplKQotewotICAg
IGlmICghbV9oZGMpCi0gICAgICAgIHJldHVybjsKLSAgICBYRk9STSB4Zm9ybTsKLSAgICB4Zm9y
bS5lTTExID0gc2l6ZS53aWR0aCgpOwotICAgIHhmb3JtLmVNMTIgPSAwOwotICAgIHhmb3JtLmVN
MjEgPSAwOwotICAgIHhmb3JtLmVNMjIgPSBzaXplLmhlaWdodCgpOwotICAgIHhmb3JtLmVEeCA9
IDA7Ci0gICAgeGZvcm0uZUR5ID0gMDsKLSAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShtX2hkYywg
Jnhmb3JtLCBNV1RfTEVGVE1VTFRJUExZKTsKLX0KLQotc3RhdGljIGNvbnN0IGRvdWJsZSBkZWcy
cmFkID0gMC4wMTc0NTMyOTI1MTk5NDMyOTU3Njk7IC8vIHBpLzE4MAotCi12b2lkIEdyYXBoaWNz
Q29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6cm90YXRlKGZsb2F0IGRlZ3JlZXNBbmdsZSkKLXsKLSAg
ICBmbG9hdCByYWRpYW5zQW5nbGUgPSBkZWdyZWVzQW5nbGUgKiBkZWcycmFkOwotICAgIGZsb2F0
IGNvc0FuZ2xlID0gY29zZihyYWRpYW5zQW5nbGUpOwotICAgIGZsb2F0IHNpbkFuZ2xlID0gc2lu
ZihyYWRpYW5zQW5nbGUpOwotICAgIFhGT1JNIHhmb3JtOwotICAgIHhmb3JtLmVNMTEgPSBjb3NB
bmdsZTsKLSAgICB4Zm9ybS5lTTEyID0gLXNpbkFuZ2xlOwotICAgIHhmb3JtLmVNMjEgPSBzaW5B
bmdsZTsKLSAgICB4Zm9ybS5lTTIyID0gY29zQW5nbGU7Ci0gICAgeGZvcm0uZUR4ID0gMDsKLSAg
ICB4Zm9ybS5lRHkgPSAwOwotICAgIE1vZGlmeVdvcmxkVHJhbnNmb3JtKG1faGRjLCAmeGZvcm0s
IE1XVF9MRUZUTVVMVElQTFkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZTo6dHJhbnNsYXRlKGZsb2F0IHggLCBmbG9hdCB5KQotewotICAgIGlmICghbV9oZGMpCi0g
ICAgICAgIHJldHVybjsKLSAgICBYRk9STSB4Zm9ybTsKLSAgICB4Zm9ybS5lTTExID0gMS4wOwot
ICAgIHhmb3JtLmVNMTIgPSAwOwotICAgIHhmb3JtLmVNMjEgPSAwOwotICAgIHhmb3JtLmVNMjIg
PSAxLjA7Ci0gICAgeGZvcm0uZUR4ID0geDsKLSAgICB4Zm9ybS5lRHkgPSB5OwotICAgIE1vZGlm
eVdvcmxkVHJhbnNmb3JtKG1faGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y29uY2F0Q1RNKGNvbnN0IEFmZmlu
ZVRyYW5zZm9ybSYgdHJhbnNmb3JtKQotewotICAgIGlmICghbV9oZGMpCi0gICAgICAgIHJldHVy
bjsKLSAgICBDR0FmZmluZVRyYW5zZm9ybSBtYXQgPSB0cmFuc2Zvcm07Ci0gICAgWEZPUk0geGZv
cm07Ci0gICAgeGZvcm0uZU0xMSA9IG1hdC5hOwotICAgIHhmb3JtLmVNMTIgPSBtYXQuYjsKLSAg
ICB4Zm9ybS5lTTIxID0gbWF0LmM7Ci0gICAgeGZvcm0uZU0yMiA9IG1hdC5kOwotICAgIHhmb3Jt
LmVEeCA9IG1hdC50eDsKLSAgICB4Zm9ybS5lRHkgPSBtYXQudHk7Ci0gICAgTW9kaWZ5V29ybGRU
cmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpkcmF3Rm9jdXNSaW5nKGNvbnN0IENvbG9yJiBjb2xvcikKLXsKLSAgICBp
ZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBmbG9hdCByYWRp
dXMgPSAoZm9jdXNSaW5nV2lkdGgoKSAtIDEpIC8gMi4wZjsKLSAgICBpbnQgb2Zmc2V0ID0gcmFk
aXVzICsgZm9jdXNSaW5nT2Zmc2V0KCk7Ci0gICAgQ0dDb2xvclJlZiBjb2xvclJlZiA9IGNvbG9y
LmlzVmFsaWQoKSA/IGNnQ29sb3IoY29sb3IpIDogMDsKLQotICAgIENHTXV0YWJsZVBhdGhSZWYg
Zm9jdXNSaW5nUGF0aCA9IENHUGF0aENyZWF0ZU11dGFibGUoKTsKLSAgICBjb25zdCBWZWN0b3I8
SW50UmVjdD4mIHJlY3RzID0gZm9jdXNSaW5nUmVjdHMoKTsKLSAgICB1bnNpZ25lZCByZWN0Q291
bnQgPSByZWN0cy5zaXplKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlY3RDb3Vu
dDsgaSsrKQotICAgICAgICBDR1BhdGhBZGRSZWN0KGZvY3VzUmluZ1BhdGgsIDAsIENHUmVjdElu
c2V0KHJlY3RzW2ldLCAtb2Zmc2V0LCAtb2Zmc2V0KSk7Ci0KLSAgICBDR0NvbnRleHRSZWYgY29u
dGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOwotICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4
dCk7Ci0KLSAgICBDR0NvbnRleHRCZWdpblBhdGgoY29udGV4dCk7Ci0gICAgQ0dDb250ZXh0QWRk
UGF0aChjb250ZXh0LCBmb2N1c1JpbmdQYXRoKTsKLQotICAgIHdrRHJhd0ZvY3VzUmluZyhjb250
ZXh0LCBjb2xvclJlZiwgcmFkaXVzKTsKLQotICAgIENHQ29sb3JSZWxlYXNlKGNvbG9yUmVmKTsK
LQotICAgIENHUGF0aFJlbGVhc2UoZm9jdXNSaW5nUGF0aCk7Ci0KLSAgICBDR0NvbnRleHRSZXN0
b3JlR1N0YXRlKGNvbnRleHQpOwotfQotCi1zdGF0aWMgY29uc3QgQ29sb3ImIHNwZWxsaW5nUGF0
dGVybkNvbG9yKCkgewotICAgIHN0YXRpYyBjb25zdCBDb2xvciBzcGVsbGluZ0NvbG9yKDI1NSwg
MCwgMCk7Ci0gICAgcmV0dXJuIHNwZWxsaW5nQ29sb3I7Ci19Ci0KLXN0YXRpYyBjb25zdCBDb2xv
ciYgZ3JhbW1hclBhdHRlcm5Db2xvcigpIHsKLSAgICBzdGF0aWMgY29uc3QgQ29sb3IgZ3JhbW1h
ckNvbG9yKDAsIDEyOCwgMCk7Ci0gICAgcmV0dXJuIGdyYW1tYXJDb2xvcjsKLX0KLQotLy8gUHVs
bGVkIGZyb20gR3JhcGhpY3NDb250ZXh0Q0cKLXN0YXRpYyB2b2lkIHNldENHU3Ryb2tlQ29sb3Io
Q0dDb250ZXh0UmVmIGNvbnRleHQsIGNvbnN0IENvbG9yJiBjb2xvcikKLXsKLSAgICBDR0Zsb2F0
IHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhOwotICAgIGNvbG9yLmdldFJHQkEocmVkLCBncmVlbiwg
Ymx1ZSwgYWxwaGEpOwotICAgIENHQ29udGV4dFNldFJHQlN0cm9rZUNvbG9yKGNvbnRleHQsIHJl
ZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdM
aW5lRm9yTWlzc3BlbGxpbmdPckJhZEdyYW1tYXIoY29uc3QgSW50UG9pbnQmIHBvaW50LCBpbnQg
d2lkdGgsIGJvb2wgZ3JhbW1hcikKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAg
ICAgICByZXR1cm47Ci0gICAgCi0gICAgLy8gVGhlc2UgYXJlIHRoZSBzYW1lIGZvciBtaXNzcGVs
bGluZyBvciBiYWQgZ3JhbW1hcgotICAgIGNvbnN0IGludCBwYXR0ZXJuSGVpZ2h0ID0gMzsgLy8g
MyByb3dzCi0gICAgQVNTRVJUKGNNaXNzcGVsbGluZ0xpbmVUaGlja25lc3MgPT0gcGF0dGVybkhl
aWdodCk7Ci0gICAgY29uc3QgaW50IHBhdHRlcm5XaWR0aCA9IDQ7IC8vIDQgcGl4ZWxzCi0gICAg
QVNTRVJUKHBhdHRlcm5XaWR0aCA9PSBjTWlzc3BlbGxpbmdMaW5lUGF0dGVybldpZHRoKTsKLQot
ICAgIC8vIE1ha2Ugc3VyZSB0byBkcmF3IG9ubHkgY29tcGxldGUgZG90cy4KLSAgICAvLyBOT1RF
OiBDb2RlIGhlcmUgdXNlZCB0byBzaGlmdCB0aGUgdW5kZXJsaW5lIHRvIHRoZSBsZWZ0IGFuZCBp
bmNyZWFzZSB0aGUgd2lkdGgKLSAgICAvLyB0byBtYWtlIHN1cmUgZXZlcnl0aGluZyBnZXRzIHVu
ZGVybGluZWQsIGJ1dCB0aGF0IHJlc3VsdHMgaW4gZHJhd2luZyBvdXQgb2YKLSAgICAvLyBib3Vu
ZHMgKGUuZy4gd2hlbiBhdCB0aGUgZWRnZSBvZiBhIHZpZXcpIGFuZCBjb3VsZCBtYWtlIGl0IGFw
cGVhciB0aGF0IHRoZQotICAgIC8vIHNwYWNlIGJldHdlZW4gYWRqYWNlbnQgbWlzc3BlbGxlZCB3
b3JkcyB3YXMgdW5kZXJsaW5lZC4KLSAgICAvLyBhbGxvdyBzbGlnaHRseSBtb3JlIGNvbnNpZGVy
aW5nIHRoYXQgdGhlIHBhdHRlcm4gZW5kcyB3aXRoIGEgdHJhbnNwYXJlbnQgcGl4ZWwKLSAgICBp
bnQgd2lkdGhNb2QgPSB3aWR0aCAlIHBhdHRlcm5XaWR0aDsKLSAgICBpZiAocGF0dGVybldpZHRo
IC0gd2lkdGhNb2QgPiBjTWlzc3BlbGxpbmdMaW5lUGF0dGVybkdhcFdpZHRoKQotICAgICAgICB3
aWR0aCAtPSB3aWR0aE1vZDsKLSAgICAgIAotICAgIC8vIERyYXcgdGhlIHVuZGVybGluZQotICAg
IENHQ29udGV4dFJlZiBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCk7Ci0gICAgQ0dDb250ZXh0
U2F2ZUdTdGF0ZShjb250ZXh0KTsKLQotICAgIGNvbnN0IENvbG9yJiBwYXR0ZXJuQ29sb3IgPSBn
cmFtbWFyID8gZ3JhbW1hclBhdHRlcm5Db2xvcigpIDogc3BlbGxpbmdQYXR0ZXJuQ29sb3IoKTsK
LSAgICBzZXRDR1N0cm9rZUNvbG9yKGNvbnRleHQsIHBhdHRlcm5Db2xvcik7Ci0KLSAgICB3a1Nl
dFBhdHRlcm5QaGFzZUluVXNlclNwYWNlKGNvbnRleHQsIHBvaW50KTsKLSAgICBDR0NvbnRleHRT
ZXRCbGVuZE1vZGUoY29udGV4dCwga0NHQmxlbmRNb2RlTm9ybWFsKTsKLSAgICAKLSAgICAvLyAz
IHJvd3MsIGVhY2ggb2Zmc2V0IGJ5IGhhbGYgYSBwaXhlbCBmb3IgYmxlbmRpbmcgcHVycG9zZXMK
LSAgICBjb25zdCBDR1BvaW50IHVwcGVyUG9pbnRzIFtdID0ge3twb2ludC54KCksIHBvaW50Lnko
KSArIHBhdHRlcm5IZWlnaHQgLSAyLjUgfSwge3BvaW50LngoKSArIHdpZHRoLCBwb2ludC55KCkg
KyBwYXR0ZXJuSGVpZ2h0IC0gMi41fX07Ci0gICAgY29uc3QgQ0dQb2ludCBtaWRkbGVQb2ludHMg
W10gPSB7e3BvaW50LngoKSwgcG9pbnQueSgpICsgcGF0dGVybkhlaWdodCAtIDEuNSB9LCB7cG9p
bnQueCgpICsgd2lkdGgsIHBvaW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAxLjV9fTsKLSAgICBj
b25zdCBDR1BvaW50IGxvd2VyUG9pbnRzIFtdID0ge3twb2ludC54KCksIHBvaW50LnkoKSArIHBh
dHRlcm5IZWlnaHQgLSAwLjUgfSwge3BvaW50LngoKSArIHdpZHRoLCBwb2ludC55KCkgKyBwYXR0
ZXJuSGVpZ2h0IC0gMC41IH19OwotICAgIAotICAgIC8vIERhc2ggbGVuZ3RocyBmb3IgdGhlIHRv
cCBhbmQgYm90dG9tIG9mIHRoZSBlcnJvciB1bmRlcmxpbmUgYXJlIHRoZSBzYW1lLgotICAgIC8v
IFRoZXNlIGFyZSBtYWdpYy4KLSAgICBzdGF0aWMgY29uc3QgZmxvYXQgZWRnZV9kYXNoX2xlbmd0
aHNbXSA9IHsyLCAyfTsKLSAgICBzdGF0aWMgY29uc3QgZmxvYXQgbWlkZGxlX2Rhc2hfbGVuZ3Ro
c1tdID0gezIuNzZmLCAxLjI0Zn07Ci0gICAgc3RhdGljIGNvbnN0IGZsb2F0IGVkZ2Vfb2Zmc2V0
ID0gLShlZGdlX2Rhc2hfbGVuZ3Roc1sxXSAtIDEuMGYpIC8gMi4wZjsKLSAgICBzdGF0aWMgY29u
c3QgZmxvYXQgbWlkZGxlX29mZnNldCA9IC0obWlkZGxlX2Rhc2hfbGVuZ3Roc1sxXSAtIDEuMGYp
IC8gMi4wZjsKLQotICAgIC8vIExpbmUgb3BhY2l0aWVzLiAgT25jZSBhZ2FpbiwgdGhlc2UgYXJl
IG1hZ2ljLgotICAgIGNvbnN0IGZsb2F0IHVwcGVyT3BhY2l0eSA9IDAuMzNmOwotICAgIGNvbnN0
IGZsb2F0IG1pZGRsZU9wYWNpdHkgPSAwLjc1ZjsKLSAgICBjb25zdCBmbG9hdCBsb3dlck9wYWNp
dHkgPSAwLjg4ZjsKLQotICAgIC8vVG9wIGxpbmUKLSAgICBDR0NvbnRleHRTZXRMaW5lRGFzaChj
b250ZXh0LCBlZGdlX29mZnNldCwgZWRnZV9kYXNoX2xlbmd0aHMsIAotICAgICAgICAgICAgICAg
ICAgICAgICAgIHNpemVvZihlZGdlX2Rhc2hfbGVuZ3RocykgLyBzaXplb2YoZWRnZV9kYXNoX2xl
bmd0aHNbMF0pKTsKLSAgICBDR0NvbnRleHRTZXRBbHBoYShjb250ZXh0LCB1cHBlck9wYWNpdHkp
OwotICAgIENHQ29udGV4dFN0cm9rZUxpbmVTZWdtZW50cyhjb250ZXh0LCB1cHBlclBvaW50cywg
Mik7Ci0gCi0gICAgLy8gTWlkZGxlIGxpbmUKLSAgICBDR0NvbnRleHRTZXRMaW5lRGFzaChjb250
ZXh0LCBtaWRkbGVfb2Zmc2V0LCBtaWRkbGVfZGFzaF9sZW5ndGhzLCAKLSAgICAgICAgICAgICAg
ICAgICAgICAgICBzaXplb2YobWlkZGxlX2Rhc2hfbGVuZ3RocykgLyBzaXplb2YobWlkZGxlX2Rh
c2hfbGVuZ3Roc1swXSkpOwotICAgIENHQ29udGV4dFNldEFscGhhKGNvbnRleHQsIG1pZGRsZU9w
YWNpdHkpOwotICAgIENHQ29udGV4dFN0cm9rZUxpbmVTZWdtZW50cyhjb250ZXh0LCBtaWRkbGVQ
b2ludHMsIDIpOwotICAgIAotICAgIC8vIEJvdHRvbSBsaW5lCi0gICAgQ0dDb250ZXh0U2V0TGlu
ZURhc2goY29udGV4dCwgZWRnZV9vZmZzZXQsIGVkZ2VfZGFzaF9sZW5ndGhzLAotICAgICAgICAg
ICAgICAgICAgICAgICAgIHNpemVvZihlZGdlX2Rhc2hfbGVuZ3RocykgLyBzaXplb2YoZWRnZV9k
YXNoX2xlbmd0aHNbMF0pKTsKLSAgICBDR0NvbnRleHRTZXRBbHBoYShjb250ZXh0LCBsb3dlck9w
YWNpdHkpOwotICAgIENHQ29udGV4dFN0cm9rZUxpbmVTZWdtZW50cyhjb250ZXh0LCBsb3dlclBv
aW50cywgMik7Ci0KLSAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOwotfQotCiAj
aWYgRU5BQkxFKFNWRykKIEdyYXBoaWNzQ29udGV4dCogY29udGV4dEZvckltYWdlKFNWR1Jlc291
cmNlSW1hZ2UqKQogewpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VD
R1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1h
Z2VDR1dpbi5jcHAJKHJldmlzaW9uIDI5ODM0KQkoZnJvbSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbi9JbWFnZVdpbi5jcHA6Mjk4MzQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbi9JbWFnZUNHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDExMCBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
Q09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBD
T01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJbWFnZS5oIgorI2lu
Y2x1ZGUgIkJpdG1hcEltYWdlLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5j
bHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CisKKyNpbmNs
dWRlIDx3aW5zb2NrMi5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlICJQbGF0Zm9y
bVN0cmluZy5oIgorI2luY2x1ZGUgIk1JTUVUeXBlUmVnaXN0cnkuaCIKKyNpbmNsdWRlICJTaGFy
ZWRCdWZmZXIuaCIKKworLy8gVGhpcyBmdW5jdGlvbiBsb2FkcyByZXNvdXJjZXMgZnJvbSBXZWJL
aXQKK1Bhc3NSZWZQdHI8V2ViQ29yZTo6U2hhcmVkQnVmZmVyPiBsb2FkUmVzb3VyY2VJbnRvQnVm
ZmVyKGNvbnN0IGNoYXIqKTsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2b2lkIEJpdG1hcElt
YWdlOjppbml0UGxhdGZvcm1EYXRhKCkKK3sKK30KKwordm9pZCBCaXRtYXBJbWFnZTo6aW52YWxp
ZGF0ZVBsYXRmb3JtRGF0YSgpCit7Cit9CisKK0ltYWdlKiBJbWFnZTo6bG9hZFBsYXRmb3JtUmVz
b3VyY2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBSZWZQdHI8U2hhcmVkQnVmZmVyPiBidWZm
ZXIgPSBsb2FkUmVzb3VyY2VJbnRvQnVmZmVyKG5hbWUpOworICAgIEJpdG1hcEltYWdlKiBpbWcg
PSBuZXcgQml0bWFwSW1hZ2U7CisgICAgaW1nLT5zZXREYXRhKGJ1ZmZlci5yZWxlYXNlKCksIHRy
dWUpOworICAgIHJldHVybiBpbWc7Cit9CisKK2Jvb2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVAo
SEJJVE1BUCBibXApCit7CisgICAgcmV0dXJuIGdldEhCSVRNQVBPZlNpemUoYm1wLCAwKTsKK30K
KworYm9vbCBCaXRtYXBJbWFnZTo6Z2V0SEJJVE1BUE9mU2l6ZShIQklUTUFQIGJtcCwgTFBTSVpF
IHNpemUpCit7CisgICAgQVNTRVJUKGJtcCk7CisKKyAgICBCSVRNQVAgYm1wSW5mbzsKKyAgICBH
ZXRPYmplY3QoYm1wLCBzaXplb2YoQklUTUFQKSwgJmJtcEluZm8pOworCisgICAgQVNTRVJUKGJt
cEluZm8uYm1CaXRzUGl4ZWwgPT0gMzIpOworICAgIGludCBidWZmZXJTaXplID0gYm1wSW5mby5i
bVdpZHRoQnl0ZXMgKiBibXBJbmZvLmJtSGVpZ2h0OworICAgIAorICAgIENHQ29sb3JTcGFjZVJl
ZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKKyAgICBDR0NvbnRl
eHRSZWYgY2dDb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGJtcEluZm8uYm1CaXRzLCBi
bXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQsCisgICAgICAgIDgsIGJtcEluZm8uYm1X
aWR0aEJ5dGVzLCBkZXZpY2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwga0NHSW1h
Z2VBbHBoYVByZW11bHRpcGxpZWRGaXJzdCk7CisgIAorICAgIEdyYXBoaWNzQ29udGV4dCBnYyhj
Z0NvbnRleHQpOworICAgIEludFNpemUgaW1hZ2VTaXplID0gQml0bWFwSW1hZ2U6OnNpemUoKTsK
KyAgICBpZiAoc2l6ZSkKKyAgICAgICAgZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXplKCZnYywg
RmxvYXRSZWN0KDAsIDAsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCksIEludFNp
emUoKnNpemUpLCBDb21wb3NpdGVDb3B5KTsKKyAgICBlbHNlCisgICAgICAgIGRyYXcoJmdjLCBG
bG9hdFJlY3QoMCwgMCwgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwgRmxvYXRS
ZWN0KDAsIDAsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBDb21wb3Np
dGVDb3B5KTsKKworICAgIC8vIERvIGNsZWFudXAKKyAgICBDR0NvbnRleHRSZWxlYXNlKGNnQ29u
dGV4dCk7CisgICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOworICAgIHJldHVybiB0
cnVlOworfQorCit2b2lkIEJpdG1hcEltYWdlOjpkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUo
R3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBGbG9hdFJlY3QmIGRzdFJlY3QsIGNvbnN0IElu
dFNpemUmIHNyY1NpemUsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQoreworICAgIGlu
dCBmcmFtZXMgPSBmcmFtZUNvdW50KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZXM7
ICsraSkgeworICAgICAgICBDR0ltYWdlUmVmIGltYWdlID0gZnJhbWVBdEluZGV4KGkpOworICAg
ICAgICBpZiAoQ0dJbWFnZUdldEhlaWdodChpbWFnZSkgPT0gKHNpemVfdClzcmNTaXplLmhlaWdo
dCgpICYmIENHSW1hZ2VHZXRXaWR0aChpbWFnZSkgPT0gKHNpemVfdClzcmNTaXplLndpZHRoKCkp
IHsKKyAgICAgICAgICAgIHNpemVfdCBjdXJyZW50RnJhbWUgPSBtX2N1cnJlbnRGcmFtZTsKKyAg
ICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gaTsKKyAgICAgICAgICAgIGRyYXcoY3R4dCwgZHN0
UmVjdCwgRmxvYXRSZWN0KDAsIDAsIHNyY1NpemUud2lkdGgoKSwgc3JjU2l6ZS5oZWlnaHQoKSks
IGNvbXBvc2l0ZU9wKTsKKyAgICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gY3VycmVudEZyYW1l
OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTm8gaW1h
Z2Ugb2YgdGhlIGNvcnJlY3Qgc2l6ZSB3YXMgZm91bmQsIGZhbGxiYWNrIHRvIGRyYXdpbmcgdGhl
IGN1cnJlbnQgZnJhbWUKKyAgICBJbnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcEltYWdlOjpzaXpl
KCk7CisgICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJlY3QoMCwgMCwgaW1hZ2VTaXplLndp
ZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsKK30KKworfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VD
R1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1h
Z2VDR1dpbi5jcHAJKHJldmlzaW9uIDI5NzI2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW4vSW1hZ2VDR1dpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgot
ICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUgSW5jLiAgQWxsIHJp
Z2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMjksMzgg
KzI5LDExIEBACiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCiAjaW5jbHVkZSA8QXBwbGlj
YXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CiAKLSNpbmNsdWRlIDx3aW5zb2Nr
Mi5oPgogI2luY2x1ZGUgPHdpbmRvd3MuaD4KICNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgot
I2luY2x1ZGUgIk1JTUVUeXBlUmVnaXN0cnkuaCIKLSNpbmNsdWRlICJTaGFyZWRCdWZmZXIuaCIK
LQotLy8gVGhpcyBmdW5jdGlvbiBsb2FkcyByZXNvdXJjZXMgZnJvbSBXZWJLaXQKLVBhc3NSZWZQ
dHI8V2ViQ29yZTo6U2hhcmVkQnVmZmVyPiBsb2FkUmVzb3VyY2VJbnRvQnVmZmVyKGNvbnN0IGNo
YXIqKTsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi12b2lkIEJpdG1hcEltYWdlOjppbml0UGxh
dGZvcm1EYXRhKCkKLXsKLX0KLQotdm9pZCBCaXRtYXBJbWFnZTo6aW52YWxpZGF0ZVBsYXRmb3Jt
RGF0YSgpCi17Ci19Ci0KLUltYWdlKiBJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UoY29uc3Qg
Y2hhciAqbmFtZSkKLXsKLSAgICBSZWZQdHI8U2hhcmVkQnVmZmVyPiBidWZmZXIgPSBsb2FkUmVz
b3VyY2VJbnRvQnVmZmVyKG5hbWUpOwotICAgIEJpdG1hcEltYWdlKiBpbWcgPSBuZXcgQml0bWFw
SW1hZ2U7Ci0gICAgaW1nLT5zZXREYXRhKGJ1ZmZlci5yZWxlYXNlKCksIHRydWUpOwotICAgIHJl
dHVybiBpbWc7Ci19Ci0KLWJvb2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVAoSEJJVE1BUCBibXAp
Ci17Ci0gICAgcmV0dXJuIGdldEhCSVRNQVBPZlNpemUoYm1wLCAwKTsKLX0KLQogYm9vbCBCaXRt
YXBJbWFnZTo6Z2V0SEJJVE1BUE9mU2l6ZShIQklUTUFQIGJtcCwgTFBTSVpFIHNpemUpCiB7CiAg
ICAgQVNTRVJUKGJtcCk7CkBAIC03NiwyNyArNDksMzMgQEAgYm9vbCBCaXRtYXBJbWFnZTo6Z2V0
SEJJVE1BUE9mU2l6ZShIQklUTQogICAgICAgICA4LCBibXBJbmZvLmJtV2lkdGhCeXRlcywgZGV2
aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFQcmVtdWx0
aXBsaWVkRmlyc3QpOwogICAKICAgICBHcmFwaGljc0NvbnRleHQgZ2MoY2dDb250ZXh0KTsKKwog
ICAgIEludFNpemUgaW1hZ2VTaXplID0gQml0bWFwSW1hZ2U6OnNpemUoKTsKICAgICBpZiAoc2l6
ZSkKLSAgICAgICAgZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXplKCZnYywgRmxvYXRSZWN0KDAs
IDAsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCksIEludFNpemUoKnNpemUpLCBD
b21wb3NpdGVDb3B5KTsKKyAgICAgICAgZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXplKCZnYywg
RmxvYXRSZWN0KDAuMGYsIDAuMGYsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCks
IEludFNpemUoKnNpemUpLCBDb21wb3NpdGVDb3B5KTsKICAgICBlbHNlCi0gICAgICAgIGRyYXco
JmdjLCBGbG9hdFJlY3QoMCwgMCwgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwg
RmxvYXRSZWN0KDAsIDAsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBD
b21wb3NpdGVDb3B5KTsKKyAgICAgICAgZHJhdygmZ2MsIEZsb2F0UmVjdCgwLjBmLCAwLjBmLCBi
bXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQpLCBGbG9hdFJlY3QoMC4wZiwgMC4wZiwg
aW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIENvbXBvc2l0ZUNvcHkpOwog
CiAgICAgLy8gRG8gY2xlYW51cAogICAgIENHQ29udGV4dFJlbGVhc2UoY2dDb250ZXh0KTsKICAg
ICBDR0NvbG9yU3BhY2VSZWxlYXNlKGRldmljZVJHQik7CisKICAgICByZXR1cm4gdHJ1ZTsKIH0K
IAogdm9pZCBCaXRtYXBJbWFnZTo6ZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXplKEdyYXBoaWNz
Q29udGV4dCogY3R4dCwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBjb25zdCBJbnRTaXplJiBz
cmNTaXplLCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCkKIHsKICAgICBpbnQgZnJhbWVz
ID0gZnJhbWVDb3VudCgpOworICAgIHNpemVfdCBpbWFnZUhlaWdodCA9IDA7CisgICAgc2l6ZV90
IGltYWdlV2lkdGggPSAwOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVzOyArK2kpIHsK
LSAgICAgICAgQ0dJbWFnZVJlZiBpbWFnZSA9IGZyYW1lQXRJbmRleChpKTsKLSAgICAgICAgaWYg
KENHSW1hZ2VHZXRIZWlnaHQoaW1hZ2UpID09IChzaXplX3Qpc3JjU2l6ZS5oZWlnaHQoKSAmJiBD
R0ltYWdlR2V0V2lkdGgoaW1hZ2UpID09IChzaXplX3Qpc3JjU2l6ZS53aWR0aCgpKSB7CisgICAg
ICAgIE5hdGl2ZUltYWdlUHRyIGltYWdlID0gZnJhbWVBdEluZGV4KGkpOworICAgICAgICBpbWFn
ZUhlaWdodCA9IENHSW1hZ2VHZXRIZWlnaHQoaW1hZ2UpOworICAgICAgICBpbWFnZVdpZHRoID0g
Q0dJbWFnZUdldFdpZHRoKGltYWdlKTsKKyAgICAgICAgaWYgKGltYWdlSGVpZ2h0ID09IHN0YXRp
Y19jYXN0PHNpemVfdD4oc3JjU2l6ZS5oZWlnaHQoKSkgJiYgaW1hZ2VXaWR0aCA9PSBzdGF0aWNf
Y2FzdDxzaXplX3Q+KHNyY1NpemUud2lkdGgoKSkpIHsKICAgICAgICAgICAgIHNpemVfdCBjdXJy
ZW50RnJhbWUgPSBtX2N1cnJlbnRGcmFtZTsKICAgICAgICAgICAgIG1fY3VycmVudEZyYW1lID0g
aTsKLSAgICAgICAgICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRSZWN0KDAsIDAsIHNyY1Np
emUud2lkdGgoKSwgc3JjU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsKKyAgICAgICAgICAg
IGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRSZWN0KDAuMGYsIDAuMGYsIHNyY1NpemUud2lkdGgo
KSwgc3JjU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsKICAgICAgICAgICAgIG1fY3VycmVu
dEZyYW1lID0gY3VycmVudEZyYW1lOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBA
IC0xMDQsNyArODMsNyBAQCB2b2lkIEJpdG1hcEltYWdlOjpkcmF3RnJhbWVNYXRjaGluZ1NvdXJj
CiAKICAgICAvLyBObyBpbWFnZSBvZiB0aGUgY29ycmVjdCBzaXplIHdhcyBmb3VuZCwgZmFsbGJh
Y2sgdG8gZHJhd2luZyB0aGUgY3VycmVudCBmcmFtZQogICAgIEludFNpemUgaW1hZ2VTaXplID0g
Qml0bWFwSW1hZ2U6OnNpemUoKTsKLSAgICBkcmF3KGN0eHQsIGRzdFJlY3QsIEZsb2F0UmVjdCgw
LCAwLCBpbWFnZVNpemUud2lkdGgoKSwgaW1hZ2VTaXplLmhlaWdodCgpKSwgY29tcG9zaXRlT3Ap
OworICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRSZWN0KDAuMGYsIDAuMGYsIGltYWdlU2l6
ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBjb21wb3NpdGVPcCk7CiB9CiAKIH0gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0lt
YWdlQ2Fpcm9XaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luL0ltYWdlQ2Fpcm9XaW4uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW4vSW1hZ2VDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsOTMg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
Q09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW1hZ2UuaCIKKyNp
bmNsdWRlICJCaXRtYXBJbWFnZS5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2lu
Y2x1ZGUgPGNhaXJvLmg+CisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSAiUGxhdGZv
cm1TdHJpbmcuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitib29sIEJpdG1hcEltYWdlOjpn
ZXRIQklUTUFQT2ZTaXplKEhCSVRNQVAgYm1wLCBMUFNJWkUgc2l6ZSkKK3sKKyAgICBBU1NFUlQo
Ym1wKTsKKworICAgIEJJVE1BUCBibXBJbmZvOworICAgIEdldE9iamVjdChibXAsIHNpemVvZihC
SVRNQVApLCAmYm1wSW5mbyk7CisKKyAgICAvLyBJZiB0aGlzIGlzIGEgMzJicHAgYml0bWFwLCB3
aGljaCBpdCBhbHdheXMgc2hvdWxkIGJlLCB3ZSdsbCBjbGVhciBpdCBzbyBhbHBoYS13aXNlIGl0
IHdpbGwgYmUgdmlzaWJsZQorICAgIGlmIChibXBJbmZvLmJtQml0c1BpeGVsID09IDMyKSB7Cisg
ICAgICAgIGludCBidWZmZXJTaXplID0gYm1wSW5mby5ibVdpZHRoQnl0ZXMgKiBibXBJbmZvLmJt
SGVpZ2h0OworICAgICAgICBtZW1zZXQoYm1wSW5mby5ibUJpdHMsIDI1NSwgYnVmZmVyU2l6ZSk7
CisgICAgfQorIAkKKyAgICBIREMgdGVtcERDID0gQ3JlYXRlQ29tcGF0aWJsZURDKDApOworICAg
IGlmICghdGVtcERDKSB7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSBpbi1t
ZW1vcnkgREMgZm9yIEltYWdlOjpibGl0KCkiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IH0KKyAgICBTZWxlY3RPYmplY3QodGVtcERDLCBibXApOworICAgIEdyYXBoaWNzQ29udGV4dCBn
Yyh0ZW1wREMpOworCisgICAgSW50U2l6ZSBpbWFnZVNpemUgPSBCaXRtYXBJbWFnZTo6c2l6ZSgp
OworICAgIGlmIChzaXplKQorICAgICAgICBkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUoJmdj
LCBGbG9hdFJlY3QoMC4wZiwgMC4wZiwgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0
KSwgSW50U2l6ZSgqc2l6ZSksIENvbXBvc2l0ZUNvcHkpOworICAgIGVsc2UKKyAgICAgICAgZHJh
dygmZ2MsIEZsb2F0UmVjdCgwLjBmLCAwLjBmLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1I
ZWlnaHQpLCBGbG9hdFJlY3QoMC4wZiwgMC4wZiwgaW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6
ZS5oZWlnaHQoKSksIENvbXBvc2l0ZUNvcHkpOworCisgICAgLy8gRG8gY2xlYW51cAorICAgIERl
bGV0ZURDKHRlbXBEQyk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBCaXRtYXBJbWFn
ZTo6ZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXplKEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29u
c3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBjb25zdCBJbnRTaXplJiBzcmNTaXplLCBDb21wb3NpdGVP
cGVyYXRvciBjb21wb3NpdGVPcCkKK3sKKyAgICBpbnQgZnJhbWVzID0gZnJhbWVDb3VudCgpOwor
ICAgIHNpemVfdCBpbWFnZUhlaWdodCA9IDA7CisgICAgc2l6ZV90IGltYWdlV2lkdGggPSAwOwor
ICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVzOyArK2kpIHsKKyAgICAgICAgTmF0aXZlSW1h
Z2VQdHIgaW1hZ2UgPSBmcmFtZUF0SW5kZXgoaSk7CisgICAgICAgIGltYWdlSGVpZ2h0ID0gY2Fp
cm9faW1hZ2Vfc3VyZmFjZV9nZXRfaGVpZ2h0KGltYWdlKTsKKyAgICAgICAgaW1hZ2VXaWR0aCA9
IGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X3dpZHRoKGltYWdlKTsKKyAgICAgICAgaWYgKGltYWdl
SGVpZ2h0ID09IHN0YXRpY19jYXN0PHNpemVfdD4oc3JjU2l6ZS5oZWlnaHQoKSkgJiYgaW1hZ2VX
aWR0aCA9PSBzdGF0aWNfY2FzdDxzaXplX3Q+KHNyY1NpemUud2lkdGgoKSkpIHsKKyAgICAgICAg
ICAgIHNpemVfdCBjdXJyZW50RnJhbWUgPSBtX2N1cnJlbnRGcmFtZTsKKyAgICAgICAgICAgIG1f
Y3VycmVudEZyYW1lID0gaTsKKyAgICAgICAgICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRS
ZWN0KDAuMGYsIDAuMGYsIHNyY1NpemUud2lkdGgoKSwgc3JjU2l6ZS5oZWlnaHQoKSksIGNvbXBv
c2l0ZU9wKTsKKyAgICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gY3VycmVudEZyYW1lOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTm8gaW1hZ2Ugb2Yg
dGhlIGNvcnJlY3Qgc2l6ZSB3YXMgZm91bmQsIGZhbGxiYWNrIHRvIGRyYXdpbmcgdGhlIGN1cnJl
bnQgZnJhbWUKKyAgICBJbnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcEltYWdlOjpzaXplKCk7Cisg
ICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJlY3QoMC4wZiwgMC4wZiwgaW1hZ2VTaXplLndp
ZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsKK30KKworfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VX
aW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdl
V2luLmNwcAkocmV2aXNpb24gMjk4MzQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bi9JbWFnZVdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29w
eXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMjYsMTMgKzI2LDcg
QEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJJbWFnZS5oIgogI2luY2x1ZGUgIkJp
dG1hcEltYWdlLmgiCi0jaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCi0jaW5jbHVkZSA8QXBw
bGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CiAKLSNpbmNsdWRlIDx3aW5z
b2NrMi5oPgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5o
IgotI2luY2x1ZGUgIk1JTUVUeXBlUmVnaXN0cnkuaCIKICNpbmNsdWRlICJTaGFyZWRCdWZmZXIu
aCIKIAogLy8gVGhpcyBmdW5jdGlvbiBsb2FkcyByZXNvdXJjZXMgZnJvbSBXZWJLaXQKQEAgLTYx
LDUwICs1NSw0IEBAIGJvb2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVAoSEJJVE1BUCBibXAKICAg
ICByZXR1cm4gZ2V0SEJJVE1BUE9mU2l6ZShibXAsIDApOwogfQogCi1ib29sIEJpdG1hcEltYWdl
OjpnZXRIQklUTUFQT2ZTaXplKEhCSVRNQVAgYm1wLCBMUFNJWkUgc2l6ZSkKLXsKLSAgICBBU1NF
UlQoYm1wKTsKLQotICAgIEJJVE1BUCBibXBJbmZvOwotICAgIEdldE9iamVjdChibXAsIHNpemVv
ZihCSVRNQVApLCAmYm1wSW5mbyk7Ci0KLSAgICBBU1NFUlQoYm1wSW5mby5ibUJpdHNQaXhlbCA9
PSAzMik7Ci0gICAgaW50IGJ1ZmZlclNpemUgPSBibXBJbmZvLmJtV2lkdGhCeXRlcyAqIGJtcElu
Zm8uYm1IZWlnaHQ7Ci0gICAgCi0gICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29s
b3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwotICAgIENHQ29udGV4dFJlZiBjZ0NvbnRleHQgPSBD
R0JpdG1hcENvbnRleHRDcmVhdGUoYm1wSW5mby5ibUJpdHMsIGJtcEluZm8uYm1XaWR0aCwgYm1w
SW5mby5ibUhlaWdodCwKLSAgICAgICAgOCwgYm1wSW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJH
Qiwga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhhUHJlbXVsdGlwbGll
ZEZpcnN0KTsKLSAgCi0gICAgR3JhcGhpY3NDb250ZXh0IGdjKGNnQ29udGV4dCk7Ci0gICAgSW50
U2l6ZSBpbWFnZVNpemUgPSBCaXRtYXBJbWFnZTo6c2l6ZSgpOwotICAgIGlmIChzaXplKQotICAg
ICAgICBkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUoJmdjLCBGbG9hdFJlY3QoMCwgMCwgYm1w
SW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwgSW50U2l6ZSgqc2l6ZSksIENvbXBvc2l0
ZUNvcHkpOwotICAgIGVsc2UKLSAgICAgICAgZHJhdygmZ2MsIEZsb2F0UmVjdCgwLCAwLCBibXBJ
bmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQpLCBGbG9hdFJlY3QoMCwgMCwgaW1hZ2VTaXpl
LndpZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIENvbXBvc2l0ZUNvcHkpOwotCi0gICAgLy8g
RG8gY2xlYW51cAotICAgIENHQ29udGV4dFJlbGVhc2UoY2dDb250ZXh0KTsKLSAgICBDR0NvbG9y
U3BhY2VSZWxlYXNlKGRldmljZVJHQik7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQml0
bWFwSW1hZ2U6OmRyYXdGcmFtZU1hdGNoaW5nU291cmNlU2l6ZShHcmFwaGljc0NvbnRleHQqIGN0
eHQsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgY29uc3QgSW50U2l6ZSYgc3JjU2l6ZSwgQ29t
cG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApCi17Ci0gICAgaW50IGZyYW1lcyA9IGZyYW1lQ291
bnQoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lczsgKytpKSB7Ci0gICAgICAgIENH
SW1hZ2VSZWYgaW1hZ2UgPSBmcmFtZUF0SW5kZXgoaSk7Ci0gICAgICAgIGlmIChDR0ltYWdlR2V0
SGVpZ2h0KGltYWdlKSA9PSAoc2l6ZV90KXNyY1NpemUuaGVpZ2h0KCkgJiYgQ0dJbWFnZUdldFdp
ZHRoKGltYWdlKSA9PSAoc2l6ZV90KXNyY1NpemUud2lkdGgoKSkgewotICAgICAgICAgICAgc2l6
ZV90IGN1cnJlbnRGcmFtZSA9IG1fY3VycmVudEZyYW1lOwotICAgICAgICAgICAgbV9jdXJyZW50
RnJhbWUgPSBpOwotICAgICAgICAgICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJlY3QoMCwg
MCwgc3JjU2l6ZS53aWR0aCgpLCBzcmNTaXplLmhlaWdodCgpKSwgY29tcG9zaXRlT3ApOwotICAg
ICAgICAgICAgbV9jdXJyZW50RnJhbWUgPSBjdXJyZW50RnJhbWU7Ci0gICAgICAgICAgICByZXR1
cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBObyBpbWFnZSBvZiB0aGUgY29ycmVjdCBz
aXplIHdhcyBmb3VuZCwgZmFsbGJhY2sgdG8gZHJhd2luZyB0aGUgY3VycmVudCBmcmFtZQotICAg
IEludFNpemUgaW1hZ2VTaXplID0gQml0bWFwSW1hZ2U6OnNpemUoKTsKLSAgICBkcmF3KGN0eHQs
IGRzdFJlY3QsIEZsb2F0UmVjdCgwLCAwLCBpbWFnZVNpemUud2lkdGgoKSwgaW1hZ2VTaXplLmhl
aWdodCgpKSwgY29tcG9zaXRlT3ApOwotfQotCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4
OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNHV2luLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0
YUNHV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCShmcm9tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL1NpbXBsZUZvbnREYXRhV2luLmNwcDoyOTgzNCkKKysrIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ0dXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMjgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4g
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVy
IHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVz
IG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHBy
b21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNp
bXBsZUZvbnREYXRhLmgiCisKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI2luY2x1ZGUgIkZvbnQu
aCIKKyNpbmNsdWRlICJGb250Q2FjaGUuaCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNs
dWRlICJGb250RGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgorI2lu
Y2x1ZGUgPHVuaWNvZGUvdWNoYXIuaD4KKyNpbmNsdWRlIDx1bmljb2RlL3Vub3JtLmg+CisjaW5j
bHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CisjaW5jbHVk
ZSA8bWxhbmcuaD4KKyNpbmNsdWRlIDx0Y2hhci5oPgorI2luY2x1ZGUgPFdlYktpdFN5c3RlbUlu
dGVyZmFjZS9XZWJLaXRTeXN0ZW1JbnRlcmZhY2UuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgewor
Cit1c2luZyBzdGQ6Om1heDsKKworY29uc3QgZmxvYXQgY1NtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlw
bGllciA9IDAuN2Y7CisKK3N0YXRpYyBib29sIHNob3VsZEFwcGx5TWFjQXNjZW50SGFjazsKKwor
c3RhdGljIGlubGluZSBmbG9hdCBzY2FsZUVtVG9Vbml0cyhmbG9hdCB4LCB1bnNpZ25lZCB1bml0
c1BlckVtKSB7IHJldHVybiB1bml0c1BlckVtID8geCAvIChmbG9hdCl1bml0c1BlckVtIDogeDsg
fQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpzZXRTaG91bGRBcHBseU1hY0FzY2VudEhhY2soYm9v
bCBiKQoreworICAgIHNob3VsZEFwcGx5TWFjQXNjZW50SGFjayA9IGI7Cit9CisKK3ZvaWQgU2lt
cGxlRm9udERhdGE6OnBsYXRmb3JtSW5pdCgpCit7ICAgIAorICAgIG1fc3ludGhldGljQm9sZE9m
ZnNldCA9IG1fZm9udC5zeW50aGV0aWNCb2xkKCkgPyAxLjBmIDogMC5mOworICAgIG1fc2NyaXB0
Q2FjaGUgPSAwOworICAgIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMgPSAwOworICAgIG1faXNTeXN0
ZW1Gb250ID0gZmFsc2U7CisgICAgCisgICAgaWYgKG1fZm9udC51c2VHREkoKSkgeworICAgICAg
ICBIREMgaGRjID0gR2V0REMoMCk7CisgICAgICAgIEhHRElPQkogb2xkRm9udCA9IFNlbGVjdE9i
amVjdChoZGMsIG1fZm9udC5oZm9udCgpKTsKKyAgICAgICAgT1VUTElORVRFWFRNRVRSSUMgbWV0
cmljczsKKyAgICAgICAgR2V0T3V0bGluZVRleHRNZXRyaWNzKGhkYywgc2l6ZW9mKG1ldHJpY3Mp
LCAmbWV0cmljcyk7CisgICAgICAgIFRFWFRNRVRSSUMmIHRleHRNZXRyaWNzID0gbWV0cmljcy5v
dG1UZXh0TWV0cmljczsKKyAgICAgICAgbV9hc2NlbnQgPSB0ZXh0TWV0cmljcy50bUFzY2VudDsK
KyAgICAgICAgbV9kZXNjZW50ID0gdGV4dE1ldHJpY3MudG1EZXNjZW50OworICAgICAgICBtX2xp
bmVHYXAgPSB0ZXh0TWV0cmljcy50bUV4dGVybmFsTGVhZGluZzsKKyAgICAgICAgbV9saW5lU3Bh
Y2luZyA9IG1fYXNjZW50ICsgbV9kZXNjZW50ICsgbV9saW5lR2FwOworICAgICAgICBtX3hIZWln
aHQgPSBtX2FzY2VudCAqIDAuNTZmOyAvLyBCZXN0IGd1ZXNzIGZvciB4SGVpZ2h0IGlmIG5vIHgg
Z2x5cGggaXMgcHJlc2VudC4KKworICAgICAgICBHTFlQSE1FVFJJQ1MgZ207CisgICAgICAgIE1B
VDIgbWF0ID0geyAxLCAwLCAwLCAxIH07CisgICAgICAgIERXT1JEIGxlbiA9IEdldEdseXBoT3V0
bGluZShoZGMsICd4JywgR0dPX01FVFJJQ1MsICZnbSwgMCwgMCwgJm1hdCk7CisgICAgICAgIGlm
IChsZW4gIT0gR0RJX0VSUk9SICYmIGdtLmdtcHRHbHlwaE9yaWdpbi55ID4gMCkKKyAgICAgICAg
ICAgIG1feEhlaWdodCA9IGdtLmdtcHRHbHlwaE9yaWdpbi55OworCisgICAgICAgIG1fdW5pdHNQ
ZXJFbSA9IG1ldHJpY3Mub3RtRU1TcXVhcmU7CisKKyAgICAgICAgU2VsZWN0T2JqZWN0KGhkYywg
b2xkRm9udCk7CisgICAgICAgIFJlbGVhc2VEQygwLCBoZGMpOworCisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICBDR0ZvbnRSZWYgZm9udCA9IG1fZm9udC5jZ0ZvbnQoKTsKKyAgICBpbnQg
aUFzY2VudCA9IENHRm9udEdldEFzY2VudChmb250KTsKKyAgICBpbnQgaURlc2NlbnQgPSBDR0Zv
bnRHZXREZXNjZW50KGZvbnQpOworICAgIGludCBpTGluZUdhcCA9IENHRm9udEdldExlYWRpbmco
Zm9udCk7CisgICAgbV91bml0c1BlckVtID0gQ0dGb250R2V0VW5pdHNQZXJFbShmb250KTsKKyAg
ICBmbG9hdCBwb2ludFNpemUgPSBtX2ZvbnQuc2l6ZSgpOworICAgIGZsb2F0IGZBc2NlbnQgPSBz
Y2FsZUVtVG9Vbml0cyhpQXNjZW50LCBtX3VuaXRzUGVyRW0pICogcG9pbnRTaXplOworICAgIGZs
b2F0IGZEZXNjZW50ID0gLXNjYWxlRW1Ub1VuaXRzKGlEZXNjZW50LCBtX3VuaXRzUGVyRW0pICog
cG9pbnRTaXplOworICAgIGZsb2F0IGZMaW5lR2FwID0gc2NhbGVFbVRvVW5pdHMoaUxpbmVHYXAs
IG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7CisKKyAgICBpZiAoIWlzQ3VzdG9tRm9udCgpKSB7
CisgICAgICAgIEhEQyBkYyA9IEdldERDKDApOworICAgICAgICBIR0RJT0JKIG9sZEZvbnQgPSBT
ZWxlY3RPYmplY3QoZGMsIG1fZm9udC5oZm9udCgpKTsKKyAgICAgICAgaW50IGZhY2VMZW5ndGgg
PSBHZXRUZXh0RmFjZShkYywgMCwgMCk7CisgICAgICAgIFZlY3RvcjxUQ0hBUj4gZmFjZU5hbWUo
ZmFjZUxlbmd0aCk7CisgICAgICAgIEdldFRleHRGYWNlKGRjLCBmYWNlTGVuZ3RoLCBmYWNlTmFt
ZS5kYXRhKCkpOworICAgICAgICBtX2lzU3lzdGVtRm9udCA9ICFfdGNzY21wKGZhY2VOYW1lLmRh
dGEoKSwgX1QoIkx1Y2lkYSBHcmFuZGUiKSk7CisgICAgICAgIFNlbGVjdE9iamVjdChkYywgb2xk
Rm9udCk7CisgICAgICAgIFJlbGVhc2VEQygwLCBkYyk7CisKKyAgICAgICAgaWYgKHNob3VsZEFw
cGx5TWFjQXNjZW50SGFjaykgeworICAgICAgICAgICAgLy8gVGhpcyBjb2RlIGNvbWVzIGZyb20g
Rm9udERhdGFNYWMubW0uIFdlIG9ubHkgZXZlciBkbyB0aGlzIHdoZW4gcnVubmluZyByZWdyZXNz
aW9uIHRlc3RzIHNvIHRoYXQgb3VyIG1ldHJpY3Mgd2lsbCBtYXRjaCBNYWMuCisKKyAgICAgICAg
ICAgIC8vIFdlIG5lZWQgdG8gYWRqdXN0IFRpbWVzLCBIZWx2ZXRpY2EsIGFuZCBDb3VyaWVyIHRv
IGNsb3NlbHkgbWF0Y2ggdGhlCisgICAgICAgICAgICAvLyB2ZXJ0aWNhbCBtZXRyaWNzIG9mIHRo
ZWlyIE1pY3Jvc29mdCBjb3VudGVycGFydHMgdGhhdCBhcmUgdGhlIGRlIGZhY3RvCisgICAgICAg
ICAgICAvLyB3ZWIgc3RhbmRhcmQuIFRoZSBBcHBLaXQgYWRqdXN0bWVudCBvZiAyMCUgaXMgdG9v
IGJpZyBhbmQgaXMKKyAgICAgICAgICAgIC8vIGluY29ycmVjdGx5IGFkZGVkIHRvIGxpbmUgc3Bh
Y2luZywgc28gd2UgdXNlIGEgMTUlIGFkanVzdG1lbnQgaW5zdGVhZAorICAgICAgICAgICAgLy8g
YW5kIGFkZCBpdCB0byB0aGUgYXNjZW50LgorICAgICAgICAgICAgaWYgKCFfdGNzY21wKGZhY2VO
YW1lLmRhdGEoKSwgX1QoIlRpbWVzIikpIHx8ICFfdGNzY21wKGZhY2VOYW1lLmRhdGEoKSwgX1Qo
IkhlbHZldGljYSIpKSB8fCAhX3Rjc2NtcChmYWNlTmFtZS5kYXRhKCksIF9UKCJDb3VyaWVyIikp
KQorICAgICAgICAgICAgICAgIGZBc2NlbnQgKz0gZmxvb3JmKCgoZkFzY2VudCArIGZEZXNjZW50
KSAqIDAuMTVmKSArIDAuNWYpOworICAgICAgICB9CisgICAgfQorCisgICAgbV9hc2NlbnQgPSBs
cm91bmRmKGZBc2NlbnQpOworICAgIG1fZGVzY2VudCA9IGxyb3VuZGYoZkRlc2NlbnQpOworICAg
IG1fbGluZUdhcCA9IGxyb3VuZGYoZkxpbmVHYXApOworICAgIG1fbGluZVNwYWNpbmcgPSBtX2Fz
Y2VudCArIG1fZGVzY2VudCArIG1fbGluZUdhcDsKKworICAgIC8vIE1lYXN1cmUgdGhlIGFjdHVh
bCBjaGFyYWN0ZXIgIngiLCBiZWNhdXNlIEFwcEtpdCBzeW50aGVzaXplcyBYIGhlaWdodCByYXRo
ZXIgdGhhbiBnZXR0aW5nIGl0IGZyb20gdGhlIGZvbnQuCisgICAgLy8gVW5mb3J0dW5hdGVseSwg
TlNGb250IHdpbGwgcm91bmQgdGhpcyBmb3IgdXMgc28gd2UgZG9uJ3QgcXVpdGUgZ2V0IHRoZSBy
aWdodCB2YWx1ZS4KKyAgICBHbHlwaFBhZ2UqIGdseXBoUGFnZVplcm8gPSBHbHlwaFBhZ2VUcmVl
Tm9kZTo6Z2V0Um9vdENoaWxkKHRoaXMsIDApLT5wYWdlKCk7CisgICAgR2x5cGggeEdseXBoID0g
Z2x5cGhQYWdlWmVybyA/IGdseXBoUGFnZVplcm8tPmdseXBoRGF0YUZvckNoYXJhY3RlcigneCcp
LmdseXBoIDogMDsKKyAgICBpZiAoeEdseXBoKSB7CisgICAgICAgIENHUmVjdCB4Qm94OworICAg
ICAgICBDR0ZvbnRHZXRHbHlwaEJCb3hlcyhmb250LCAmeEdseXBoLCAxLCAmeEJveCk7CisgICAg
ICAgIC8vIFVzZSB0aGUgbWF4aW11bSBvZiBlaXRoZXIgd2lkdGggb3IgaGVpZ2h0IGJlY2F1c2Ug
IngiIGlzIG5lYXJseSBzcXVhcmUKKyAgICAgICAgLy8gYW5kIHdlYiBwYWdlcyB0aGF0IGZvb2xp
c2hseSB1c2UgdGhpcyBtZXRyaWMgZm9yIHdpZHRoIHdpbGwgYmUgbGFpZCBvdXQKKyAgICAgICAg
Ly8gcG9vcmx5IGlmIHdlIHJldHVybiBhbiBhY2N1cmF0ZSBoZWlnaHQuIENsYXNzaWMgY2FzZSBp
cyBUaW1lcyAxMyBwb2ludCwKKyAgICAgICAgLy8gd2hpY2ggaGFzIGFuICJ4IiB0aGF0IGlzIDd4
NiBwaXhlbHMuCisgICAgICAgIG1feEhlaWdodCA9IHNjYWxlRW1Ub1VuaXRzKG1heChDR1JlY3RH
ZXRNYXhYKHhCb3gpLCBDR1JlY3RHZXRNYXhZKHhCb3gpKSwgbV91bml0c1BlckVtKSAqIHBvaW50
U2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgaVhIZWlnaHQgPSBDR0ZvbnRHZXRYSGVp
Z2h0KGZvbnQpOworICAgICAgICBtX3hIZWlnaHQgPSBzY2FsZUVtVG9Vbml0cyhpWEhlaWdodCwg
bV91bml0c1BlckVtKSAqIHBvaW50U2l6ZTsKKyAgICB9Cit9CisKK3ZvaWQgU2ltcGxlRm9udERh
dGE6OnBsYXRmb3JtRGVzdHJveSgpCit7CisgICAgaWYgKCFpc0N1c3RvbUZvbnQoKSkgeworICAg
ICAgICBEZWxldGVPYmplY3QobV9mb250Lmhmb250KCkpOworICAgICAgICBDR0ZvbnRSZWxlYXNl
KG1fZm9udC5jZ0ZvbnQoKSk7CisgICAgfQorCisgICAgLy8gV2UgZG9uJ3QgaGFzaCB0aGlzIG9u
IFdpbjMyLCBzbyBpdCdzIGVmZmVjdGl2ZWx5IG93bmVkIGJ5IHVzLgorICAgIGRlbGV0ZSBtX3Nt
YWxsQ2Fwc0ZvbnREYXRhOworCisgICAgU2NyaXB0RnJlZUNhY2hlKCZtX3NjcmlwdENhY2hlKTsK
KyAgICBkZWxldGUgbV9zY3JpcHRGb250UHJvcGVydGllczsKK30KKworU2ltcGxlRm9udERhdGEq
IFNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNGb250RGF0YShjb25zdCBGb250RGVzY3JpcHRpb24m
IGZvbnREZXNjcmlwdGlvbikgY29uc3QKK3sKKyAgICBpZiAoIW1fc21hbGxDYXBzRm9udERhdGEp
IHsKKyAgICAgICAgZmxvYXQgc21hbGxDYXBzSGVpZ2h0ID0gY1NtYWxsQ2Fwc0ZvbnRTaXplTXVs
dGlwbGllciAqIG1fZm9udC5zaXplKCk7CisgICAgICAgIGlmIChpc0N1c3RvbUZvbnQoKSkgewor
ICAgICAgICAgICAgRm9udFBsYXRmb3JtRGF0YSBzbWFsbENhcHNGb250RGF0YShtX2ZvbnQpOwor
ICAgICAgICAgICAgc21hbGxDYXBzRm9udERhdGEuc2V0U2l6ZShzbWFsbENhcHNIZWlnaHQpOwor
ICAgICAgICAgICAgbV9zbWFsbENhcHNGb250RGF0YSA9IG5ldyBTaW1wbGVGb250RGF0YShzbWFs
bENhcHNGb250RGF0YSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgTE9HRk9OVCB3aW5mb250OworICAgICAgICAgICAgR2V0T2JqZWN0KG1fZm9udC5oZm9udCgp
LCBzaXplb2YoTE9HRk9OVCksICZ3aW5mb250KTsKKyAgICAgICAgICAgIHdpbmZvbnQubGZIZWln
aHQgPSAtbHJvdW5kZihzbWFsbENhcHNIZWlnaHQgKiAobV9mb250LnVzZUdESSgpID8gMSA6IDMy
KSk7CisgICAgICAgICAgICBIRk9OVCBoZm9udCA9IENyZWF0ZUZvbnRJbmRpcmVjdCgmd2luZm9u
dCk7CisgICAgICAgICAgICBtX3NtYWxsQ2Fwc0ZvbnREYXRhID0gbmV3IFNpbXBsZUZvbnREYXRh
KEZvbnRQbGF0Zm9ybURhdGEoaGZvbnQsIHNtYWxsQ2Fwc0hlaWdodCwgZm9udERlc2NyaXB0aW9u
LmJvbGQoKSwgZm9udERlc2NyaXB0aW9uLml0YWxpYygpLCBtX2ZvbnQudXNlR0RJKCkpKTsKKyAg
ICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbV9zbWFsbENhcHNGb250RGF0YTsKK30KKworYm9v
bCBTaW1wbGVGb250RGF0YTo6Y29udGFpbnNDaGFyYWN0ZXJzKGNvbnN0IFVDaGFyKiBjaGFyYWN0
ZXJzLCBpbnQgbGVuZ3RoKSBjb25zdAoreworICAgIC8vIEZJWE1FOiBTdXBwb3J0IGN1c3RvbSBm
b250cy4KKyAgICBpZiAoaXNDdXN0b21Gb250KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIC8vIEZJWE1FOiBNaWNyb3NvZnQgZG9jdW1lbnRhdGlvbiBzZWVtcyB0byBpbXBseSB0aGF0
IGNoYXJhY3RlcnMgY2FuIGJlIG91dHB1dCB1c2luZyBhIGdpdmVuIGZvbnQgYW5kIERDCisgICAg
Ly8gbWVyZWx5IGJ5IHRlc3RpbmcgY29kZSBwYWdlIGludGVyc2VjdGlvbi4gIFRoaXMgc2VlbXMg
c3VzcGVjdCB0aG91Z2guICBDYW4ndCBhIGZvbnQgb25seSBwYXJ0aWFsbHkKKyAgICAvLyBjb3Zl
ciBhIGdpdmVuIGNvZGUgcGFnZT8KKyAgICBJTUxhbmdGb250TGluazIqIGxhbmdGb250TGluayA9
IEZvbnRDYWNoZTo6Z2V0Rm9udExpbmtJbnRlcmZhY2UoKTsKKyAgICBpZiAoIWxhbmdGb250TGlu
aykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgSERDIGRjID0gR2V0REMoMCk7CisgICAg
CisgICAgRFdPUkQgYWNwQ29kZVBhZ2VzOworICAgIGxhbmdGb250TGluay0+Q29kZVBhZ2VUb0Nv
ZGVQYWdlcyhDUF9BQ1AsICZhY3BDb2RlUGFnZXMpOworCisgICAgRFdPUkQgZm9udENvZGVQYWdl
czsKKyAgICBsYW5nRm9udExpbmstPkdldEZvbnRDb2RlUGFnZXMoZGMsIG1fZm9udC5oZm9udCgp
LCAmZm9udENvZGVQYWdlcyk7CisKKyAgICBEV09SRCBhY3R1YWxDb2RlUGFnZXM7CisgICAgbG9u
ZyBudW1DaGFyYWN0ZXJzUHJvY2Vzc2VkOworICAgIGxvbmcgb2Zmc2V0ID0gMDsKKyAgICB3aGls
ZSAob2Zmc2V0IDwgbGVuZ3RoKSB7CisgICAgICAgIGxhbmdGb250TGluay0+R2V0U3RyQ29kZVBh
Z2VzKGNoYXJhY3RlcnMsIGxlbmd0aCwgYWNwQ29kZVBhZ2VzLCAmYWN0dWFsQ29kZVBhZ2VzLCAm
bnVtQ2hhcmFjdGVyc1Byb2Nlc3NlZCk7CisgICAgICAgIGlmICgoYWN0dWFsQ29kZVBhZ2VzICYg
Zm9udENvZGVQYWdlcykgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
b2Zmc2V0ICs9IG51bUNoYXJhY3RlcnNQcm9jZXNzZWQ7CisgICAgfQorCisgICAgUmVsZWFzZURD
KDAsIGRjKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpk
ZXRlcm1pbmVQaXRjaCgpCit7CisgICAgaWYgKGlzQ3VzdG9tRm9udCgpKSB7CisgICAgICAgIG1f
dHJlYXRBc0ZpeGVkUGl0Y2ggPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IC8vIFRFWFRNRVRSSUNTIGhhdmUgdGhpcy4gIFNldCBtX3RyZWF0QXNGaXhlZFBpdGNoIGJhc2Vk
IG9mZiB0aGF0LgorICAgIEhEQyBkYyA9IEdldERDKDApOworICAgIFNhdmVEQyhkYyk7CisgICAg
U2VsZWN0T2JqZWN0KGRjLCBtX2ZvbnQuaGZvbnQoKSk7CisKKyAgICAvLyBZZXMsIHRoaXMgbG9v
a3MgYmFja3dhcmRzLCBidXQgdGhlIGZpeGVkIHBpdGNoIGJpdCBpcyBhY3R1YWxseSBzZXQgaWYg
dGhlIGZvbnQKKyAgICAvLyBpcyAqbm90KiBmaXhlZCBwaXRjaC4gIFVuYmVsaWV2YWJsZSBidXQg
dHJ1ZS4KKyAgICBURVhUTUVUUklDIHRtOworICAgIEdldFRleHRNZXRyaWNzKGRjLCAmdG0pOwor
ICAgIG1fdHJlYXRBc0ZpeGVkUGl0Y2ggPSAoKHRtLnRtUGl0Y2hBbmRGYW1pbHkgJiBUTVBGX0ZJ
WEVEX1BJVENIKSA9PSAwKTsKKworICAgIFJlc3RvcmVEQyhkYywgLTEpOworICAgIFJlbGVhc2VE
QygwLCBkYyk7Cit9CisKK2Zsb2F0IFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybVdpZHRoRm9yR2x5
cGgoR2x5cGggZ2x5cGgpIGNvbnN0Cit7CisgICAgaWYgKG1fZm9udC51c2VHREkoKSkgeworICAg
ICAgICBIREMgaGRjID0gR2V0REMoMCk7CisgICAgICAgIEhHRElPQkogb2xkRm9udCA9IFNlbGVj
dE9iamVjdChoZGMsIG1fZm9udC5oZm9udCgpKTsKKyAgICAgICAgaW50IHdpZHRoOworICAgICAg
ICBHZXRDaGFyV2lkdGhJKGhkYywgZ2x5cGgsIDEsIDAsICZ3aWR0aCk7CisgICAgICAgIFNlbGVj
dE9iamVjdChoZGMsIG9sZEZvbnQpOworICAgICAgICBSZWxlYXNlREMoMCwgaGRjKTsKKyAgICAg
ICAgcmV0dXJuIHdpZHRoOworICAgIH0KKworICAgIENHRm9udFJlZiBmb250ID0gbV9mb250LmNn
Rm9udCgpOworICAgIGZsb2F0IHBvaW50U2l6ZSA9IG1fZm9udC5zaXplKCk7CisgICAgQ0dTaXpl
IGFkdmFuY2U7CisgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENHQWZmaW5lVHJhbnNmb3JtTWFr
ZVNjYWxlKHBvaW50U2l6ZSwgcG9pbnRTaXplKTsKKyAgICAvLyBGSVhNRTogTmVlZCB0byBhZGQg
cmVhbCBzdXBwb3J0IGZvciBwcmludGVyIGZvbnRzLgorICAgIGJvb2wgaXNQcmludGVyRm9udCA9
IGZhbHNlOworICAgIHdrR2V0R2x5cGhBZHZhbmNlcyhmb250LCBtLCBtX2lzU3lzdGVtRm9udCwg
aXNQcmludGVyRm9udCwgZ2x5cGgsIGFkdmFuY2UpOworICAgIHJldHVybiBhZHZhbmNlLndpZHRo
ICsgbV9zeW50aGV0aWNCb2xkT2Zmc2V0OworfQorCitTQ1JJUFRfRk9OVFBST1BFUlRJRVMqIFNp
bXBsZUZvbnREYXRhOjpzY3JpcHRGb250UHJvcGVydGllcygpIGNvbnN0Cit7CisgICAgaWYgKCFt
X3NjcmlwdEZvbnRQcm9wZXJ0aWVzKSB7CisgICAgICAgIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMg
PSBuZXcgU0NSSVBUX0ZPTlRQUk9QRVJUSUVTOworICAgICAgICBtZW1zZXQobV9zY3JpcHRGb250
UHJvcGVydGllcywgMCwgc2l6ZW9mKFNDUklQVF9GT05UUFJPUEVSVElFUykpOworICAgICAgICBt
X3NjcmlwdEZvbnRQcm9wZXJ0aWVzLT5jQnl0ZXMgPSBzaXplb2YoU0NSSVBUX0ZPTlRQUk9QRVJU
SUVTKTsKKyAgICAgICAgSFJFU1VMVCByZXN1bHQgPSBTY3JpcHRHZXRGb250UHJvcGVydGllcygw
LCBzY3JpcHRDYWNoZSgpLCBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzKTsKKyAgICAgICAgaWYgKHJl
c3VsdCA9PSBFX1BFTkRJTkcpIHsKKyAgICAgICAgICAgIEhEQyBkYyA9IEdldERDKDApOworICAg
ICAgICAgICAgU2F2ZURDKGRjKTsKKyAgICAgICAgICAgIFNlbGVjdE9iamVjdChkYywgbV9mb250
Lmhmb250KCkpOworICAgICAgICAgICAgU2NyaXB0R2V0Rm9udFByb3BlcnRpZXMoZGMsIHNjcmlw
dENhY2hlKCksIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMpOworICAgICAgICAgICAgUmVzdG9yZURD
KGRjLCAtMSk7CisgICAgICAgICAgICBSZWxlYXNlREMoMCwgZGMpOworICAgICAgICB9CisgICAg
fQorICAgIHJldHVybiBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzOworfQorCit9CkluZGV4OiBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNHV2luLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNHV2lu
LmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9T
aW1wbGVGb250RGF0YUNHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8q
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuICBBbGwg
cmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0zOCwy
NyArMzgsMTggQEAKICNpbmNsdWRlIDx1bmljb2RlL3VjaGFyLmg+CiAjaW5jbHVkZSA8dW5pY29k
ZS91bm9ybS5oPgogI2luY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2
aWNlcy5oPgorI2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVyZmFjZS9XZWJLaXRTeXN0ZW1JbnRl
cmZhY2UuaD4KICNpbmNsdWRlIDxtbGFuZy5oPgogI2luY2x1ZGUgPHRjaGFyLmg+Ci0jaW5jbHVk
ZSA8V2ViS2l0U3lzdGVtSW50ZXJmYWNlL1dlYktpdFN5c3RlbUludGVyZmFjZS5oPgogCiBuYW1l
c3BhY2UgV2ViQ29yZSB7CiAKIHVzaW5nIHN0ZDo6bWF4OwogCi1jb25zdCBmbG9hdCBjU21hbGxD
YXBzRm9udFNpemVNdWx0aXBsaWVyID0gMC43ZjsKLQotc3RhdGljIGJvb2wgc2hvdWxkQXBwbHlN
YWNBc2NlbnRIYWNrOwotCi1zdGF0aWMgaW5saW5lIGZsb2F0IHNjYWxlRW1Ub1VuaXRzKGZsb2F0
IHgsIHVuc2lnbmVkIHVuaXRzUGVyRW0pIHsgcmV0dXJuIHVuaXRzUGVyRW0gPyB4IC8gKGZsb2F0
KXVuaXRzUGVyRW0gOiB4OyB9Ci0KLXZvaWQgU2ltcGxlRm9udERhdGE6OnNldFNob3VsZEFwcGx5
TWFjQXNjZW50SGFjayhib29sIGIpCi17Ci0gICAgc2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrID0g
YjsKLX0KK3N0YXRpYyBpbmxpbmUgZmxvYXQgc2NhbGVFbVRvVW5pdHMoZmxvYXQgeCwgdW5zaWdu
ZWQgdW5pdHNQZXJFbSkgeyByZXR1cm4gdW5pdHNQZXJFbSA/IHggLyBzdGF0aWNfY2FzdDxmbG9h
dD4odW5pdHNQZXJFbSkgOiB4OyB9CiAKIHZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtSW5p
dCgpCi17ICAgIAorewogICAgIG1fc3ludGhldGljQm9sZE9mZnNldCA9IG1fZm9udC5zeW50aGV0
aWNCb2xkKCkgPyAxLjBmIDogMC5mOwogICAgIG1fc2NyaXB0Q2FjaGUgPSAwOwogICAgIG1fc2Ny
aXB0Rm9udFByb3BlcnRpZXMgPSAwOwpAQCAtMTEwLDcgKzEwMSw3IEBAIHZvaWQgU2ltcGxlRm9u
dERhdGE6OnBsYXRmb3JtSW5pdCgpCiAgICAgICAgIFNlbGVjdE9iamVjdChkYywgb2xkRm9udCk7
CiAgICAgICAgIFJlbGVhc2VEQygwLCBkYyk7CiAKLSAgICAgICAgaWYgKHNob3VsZEFwcGx5TWFj
QXNjZW50SGFjaykgeworICAgICAgICBpZiAoc2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrKCkpIHsK
ICAgICAgICAgICAgIC8vIFRoaXMgY29kZSBjb21lcyBmcm9tIEZvbnREYXRhTWFjLm1tLiBXZSBv
bmx5IGV2ZXIgZG8gdGhpcyB3aGVuIHJ1bm5pbmcgcmVncmVzc2lvbiB0ZXN0cyBzbyB0aGF0IG91
ciBtZXRyaWNzIHdpbGwgbWF0Y2ggTWFjLgogCiAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGFk
anVzdCBUaW1lcywgSGVsdmV0aWNhLCBhbmQgQ291cmllciB0byBjbG9zZWx5IG1hdGNoIHRoZQpA
QCAtMTYwLDgzICsxNTEsNiBAQCB2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3ko
KQogICAgIGRlbGV0ZSBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzOwogfQogCi1TaW1wbGVGb250RGF0
YSogU2ltcGxlRm9udERhdGE6OnNtYWxsQ2Fwc0ZvbnREYXRhKGNvbnN0IEZvbnREZXNjcmlwdGlv
biYgZm9udERlc2NyaXB0aW9uKSBjb25zdAotewotICAgIGlmICghbV9zbWFsbENhcHNGb250RGF0
YSkgewotICAgICAgICBmbG9hdCBzbWFsbENhcHNIZWlnaHQgPSBjU21hbGxDYXBzRm9udFNpemVN
dWx0aXBsaWVyICogbV9mb250LnNpemUoKTsKLSAgICAgICAgaWYgKGlzQ3VzdG9tRm9udCgpKSB7
Ci0gICAgICAgICAgICBGb250UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnREYXRhKG1fZm9udCk7
Ci0gICAgICAgICAgICBzbWFsbENhcHNGb250RGF0YS5zZXRTaXplKHNtYWxsQ2Fwc0hlaWdodCk7
Ci0gICAgICAgICAgICBtX3NtYWxsQ2Fwc0ZvbnREYXRhID0gbmV3IFNpbXBsZUZvbnREYXRhKHNt
YWxsQ2Fwc0ZvbnREYXRhLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICBMT0dGT05UIHdpbmZvbnQ7Ci0gICAgICAgICAgICBHZXRPYmplY3QobV9mb250Lmhmb250
KCksIHNpemVvZihMT0dGT05UKSwgJndpbmZvbnQpOwotICAgICAgICAgICAgd2luZm9udC5sZkhl
aWdodCA9IC1scm91bmRmKHNtYWxsQ2Fwc0hlaWdodCAqIChtX2ZvbnQudXNlR0RJKCkgPyAxIDog
MzIpKTsKLSAgICAgICAgICAgIEhGT05UIGhmb250ID0gQ3JlYXRlRm9udEluZGlyZWN0KCZ3aW5m
b250KTsKLSAgICAgICAgICAgIG1fc21hbGxDYXBzRm9udERhdGEgPSBuZXcgU2ltcGxlRm9udERh
dGEoRm9udFBsYXRmb3JtRGF0YShoZm9udCwgc21hbGxDYXBzSGVpZ2h0LCBmb250RGVzY3JpcHRp
b24uYm9sZCgpLCBmb250RGVzY3JpcHRpb24uaXRhbGljKCksIG1fZm9udC51c2VHREkoKSkpOwot
ICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtX3NtYWxsQ2Fwc0ZvbnREYXRhOwotfQotCi1i
b29sIFNpbXBsZUZvbnREYXRhOjpjb250YWluc0NoYXJhY3RlcnMoY29uc3QgVUNoYXIqIGNoYXJh
Y3RlcnMsIGludCBsZW5ndGgpIGNvbnN0Ci17Ci0gICAgLy8gRklYTUU6IFN1cHBvcnQgY3VzdG9t
IGZvbnRzLgotICAgIGlmIChpc0N1c3RvbUZvbnQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgLy8gRklYTUU6IE1pY3Jvc29mdCBkb2N1bWVudGF0aW9uIHNlZW1zIHRvIGltcGx5IHRo
YXQgY2hhcmFjdGVycyBjYW4gYmUgb3V0cHV0IHVzaW5nIGEgZ2l2ZW4gZm9udCBhbmQgREMKLSAg
ICAvLyBtZXJlbHkgYnkgdGVzdGluZyBjb2RlIHBhZ2UgaW50ZXJzZWN0aW9uLiAgVGhpcyBzZWVt
cyBzdXNwZWN0IHRob3VnaC4gIENhbid0IGEgZm9udCBvbmx5IHBhcnRpYWxseQotICAgIC8vIGNv
dmVyIGEgZ2l2ZW4gY29kZSBwYWdlPwotICAgIElNTGFuZ0ZvbnRMaW5rMiogbGFuZ0ZvbnRMaW5r
ID0gRm9udENhY2hlOjpnZXRGb250TGlua0ludGVyZmFjZSgpOwotICAgIGlmICghbGFuZ0ZvbnRM
aW5rKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBIREMgZGMgPSBHZXREQygwKTsKLSAg
ICAKLSAgICBEV09SRCBhY3BDb2RlUGFnZXM7Ci0gICAgbGFuZ0ZvbnRMaW5rLT5Db2RlUGFnZVRv
Q29kZVBhZ2VzKENQX0FDUCwgJmFjcENvZGVQYWdlcyk7Ci0KLSAgICBEV09SRCBmb250Q29kZVBh
Z2VzOwotICAgIGxhbmdGb250TGluay0+R2V0Rm9udENvZGVQYWdlcyhkYywgbV9mb250Lmhmb250
KCksICZmb250Q29kZVBhZ2VzKTsKLQotICAgIERXT1JEIGFjdHVhbENvZGVQYWdlczsKLSAgICBs
b25nIG51bUNoYXJhY3RlcnNQcm9jZXNzZWQ7Ci0gICAgbG9uZyBvZmZzZXQgPSAwOwotICAgIHdo
aWxlIChvZmZzZXQgPCBsZW5ndGgpIHsKLSAgICAgICAgbGFuZ0ZvbnRMaW5rLT5HZXRTdHJDb2Rl
UGFnZXMoY2hhcmFjdGVycywgbGVuZ3RoLCBhY3BDb2RlUGFnZXMsICZhY3R1YWxDb2RlUGFnZXMs
ICZudW1DaGFyYWN0ZXJzUHJvY2Vzc2VkKTsKLSAgICAgICAgaWYgKChhY3R1YWxDb2RlUGFnZXMg
JiBmb250Q29kZVBhZ2VzKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAg
ICBvZmZzZXQgKz0gbnVtQ2hhcmFjdGVyc1Byb2Nlc3NlZDsKLSAgICB9Ci0KLSAgICBSZWxlYXNl
REMoMCwgZGMpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU2ltcGxlRm9udERhdGE6
OmRldGVybWluZVBpdGNoKCkKLXsKLSAgICBpZiAoaXNDdXN0b21Gb250KCkpIHsKLSAgICAgICAg
bV90cmVhdEFzRml4ZWRQaXRjaCA9IGZhbHNlOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0g
ICAgLy8gVEVYVE1FVFJJQ1MgaGF2ZSB0aGlzLiAgU2V0IG1fdHJlYXRBc0ZpeGVkUGl0Y2ggYmFz
ZWQgb2ZmIHRoYXQuCi0gICAgSERDIGRjID0gR2V0REMoMCk7Ci0gICAgU2F2ZURDKGRjKTsKLSAg
ICBTZWxlY3RPYmplY3QoZGMsIG1fZm9udC5oZm9udCgpKTsKLQotICAgIC8vIFllcywgdGhpcyBs
b29rcyBiYWNrd2FyZHMsIGJ1dCB0aGUgZml4ZWQgcGl0Y2ggYml0IGlzIGFjdHVhbGx5IHNldCBp
ZiB0aGUgZm9udAotICAgIC8vIGlzICpub3QqIGZpeGVkIHBpdGNoLiAgVW5iZWxpZXZhYmxlIGJ1
dCB0cnVlLgotICAgIFRFWFRNRVRSSUMgdG07Ci0gICAgR2V0VGV4dE1ldHJpY3MoZGMsICZ0bSk7
Ci0gICAgbV90cmVhdEFzRml4ZWRQaXRjaCA9ICgodG0udG1QaXRjaEFuZEZhbWlseSAmIFRNUEZf
RklYRURfUElUQ0gpID09IDApOwotCi0gICAgUmVzdG9yZURDKGRjLCAtMSk7Ci0gICAgUmVsZWFz
ZURDKDAsIGRjKTsKLX0KLQogZmxvYXQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtV2lkdGhGb3JH
bHlwaChHbHlwaCBnbHlwaCkgY29uc3QKIHsKICAgICBpZiAobV9mb250LnVzZUdESSgpKSB7CkBA
IC0yNTMsMjkgKzE2NywxMiBAQCBmbG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZv
ckdsCiAgICAgZmxvYXQgcG9pbnRTaXplID0gbV9mb250LnNpemUoKTsKICAgICBDR1NpemUgYWR2
YW5jZTsKICAgICBDR0FmZmluZVRyYW5zZm9ybSBtID0gQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlU2Nh
bGUocG9pbnRTaXplLCBwb2ludFNpemUpOworIAogICAgIC8vIEZJWE1FOiBOZWVkIHRvIGFkZCBy
ZWFsIHN1cHBvcnQgZm9yIHByaW50ZXIgZm9udHMuCiAgICAgYm9vbCBpc1ByaW50ZXJGb250ID0g
ZmFsc2U7CiAgICAgd2tHZXRHbHlwaEFkdmFuY2VzKGZvbnQsIG0sIG1faXNTeXN0ZW1Gb250LCBp
c1ByaW50ZXJGb250LCBnbHlwaCwgYWR2YW5jZSk7Ci0gICAgcmV0dXJuIGFkdmFuY2Uud2lkdGgg
KyBtX3N5bnRoZXRpY0JvbGRPZmZzZXQ7Ci19CiAKLVNDUklQVF9GT05UUFJPUEVSVElFUyogU2lt
cGxlRm9udERhdGE6OnNjcmlwdEZvbnRQcm9wZXJ0aWVzKCkgY29uc3QKLXsKLSAgICBpZiAoIW1f
c2NyaXB0Rm9udFByb3BlcnRpZXMpIHsKLSAgICAgICAgbV9zY3JpcHRGb250UHJvcGVydGllcyA9
IG5ldyBTQ1JJUFRfRk9OVFBST1BFUlRJRVM7Ci0gICAgICAgIG1lbXNldChtX3NjcmlwdEZvbnRQ
cm9wZXJ0aWVzLCAwLCBzaXplb2YoU0NSSVBUX0ZPTlRQUk9QRVJUSUVTKSk7Ci0gICAgICAgIG1f
c2NyaXB0Rm9udFByb3BlcnRpZXMtPmNCeXRlcyA9IHNpemVvZihTQ1JJUFRfRk9OVFBST1BFUlRJ
RVMpOwotICAgICAgICBIUkVTVUxUIHJlc3VsdCA9IFNjcmlwdEdldEZvbnRQcm9wZXJ0aWVzKDAs
IHNjcmlwdENhY2hlKCksIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMpOwotICAgICAgICBpZiAocmVz
dWx0ID09IEVfUEVORElORykgewotICAgICAgICAgICAgSERDIGRjID0gR2V0REMoMCk7Ci0gICAg
ICAgICAgICBTYXZlREMoZGMpOwotICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBtX2ZvbnQu
aGZvbnQoKSk7Ci0gICAgICAgICAgICBTY3JpcHRHZXRGb250UHJvcGVydGllcyhkYywgc2NyaXB0
Q2FjaGUoKSwgbV9zY3JpcHRGb250UHJvcGVydGllcyk7Ci0gICAgICAgICAgICBSZXN0b3JlREMo
ZGMsIC0xKTsKLSAgICAgICAgICAgIFJlbGVhc2VEQygwLCBkYyk7Ci0gICAgICAgIH0KLSAgICB9
Ci0gICAgcmV0dXJuIG1fc2NyaXB0Rm9udFByb3BlcnRpZXM7CisgICAgcmV0dXJuIGFkdmFuY2Uu
d2lkdGggKyBtX3N5bnRoZXRpY0JvbGRPZmZzZXQ7CiB9CiAKIH0KSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ2Fpcm9XaW4uY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ2Fpcm9XaW4u
Y3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxl
Rm9udERhdGFDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTAyIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1
dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1
dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAor
ICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4g
cGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBB
TkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQK
KyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNpbXBsZUZvbnREYXRhLmgiCisKKyNpbmNs
dWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJGb250LmgiCisjaW5jbHVkZSAiRm9udENhY2hl
LmgiCisjaW5jbHVkZSAiRm9udERlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50
ZWQuaCIKKyNpbmNsdWRlIDxtbGFuZy5oPgorI2luY2x1ZGUgPHRjaGFyLmg+CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKwordm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKK3sKKyAg
ICBtX3NjcmlwdENhY2hlID0gMDsKKyAgICBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzID0gMDsKKyAg
ICBtX2lzU3lzdGVtRm9udCA9IGZhbHNlOworICAgIAorICAgIGlmIChtX2ZvbnQudXNlR0RJKCkp
IHsKKyAgICAgICAgSERDIGhkYyA9IEdldERDKDApOworICAgICAgICBIR0RJT0JKIG9sZEZvbnQg
PSBTZWxlY3RPYmplY3QoaGRjLCBtX2ZvbnQuaGZvbnQoKSk7CisgICAgICAgIE9VVExJTkVURVhU
TUVUUklDIG1ldHJpY3M7CisgICAgICAgIEdldE91dGxpbmVUZXh0TWV0cmljcyhoZGMsIHNpemVv
ZihtZXRyaWNzKSwgJm1ldHJpY3MpOworICAgICAgICBURVhUTUVUUklDJiB0ZXh0TWV0cmljcyA9
IG1ldHJpY3Mub3RtVGV4dE1ldHJpY3M7CisgICAgICAgIG1fYXNjZW50ID0gdGV4dE1ldHJpY3Mu
dG1Bc2NlbnQ7CisgICAgICAgIG1fZGVzY2VudCA9IHRleHRNZXRyaWNzLnRtRGVzY2VudDsKKyAg
ICAgICAgbV9saW5lR2FwID0gdGV4dE1ldHJpY3MudG1FeHRlcm5hbExlYWRpbmc7CisgICAgICAg
IG1fbGluZVNwYWNpbmcgPSBtX2FzY2VudCArIG1fZGVzY2VudCArIG1fbGluZUdhcDsKKyAgICAg
ICAgbV94SGVpZ2h0ID0gbV9hc2NlbnQgKiAwLjU2ZjsgLy8gQmVzdCBndWVzcyBmb3IgeEhlaWdo
dCBpZiBubyB4IGdseXBoIGlzIHByZXNlbnQuCisKKyAgICAgICAgR0xZUEhNRVRSSUNTIGdtOwor
ICAgICAgICBNQVQyIG1hdCA9IHsgMSwgMCwgMCwgMSB9OworICAgICAgICBEV09SRCBsZW4gPSBH
ZXRHbHlwaE91dGxpbmUoaGRjLCAneCcsIEdHT19NRVRSSUNTLCAmZ20sIDAsIDAsICZtYXQpOwor
ICAgICAgICBpZiAobGVuICE9IEdESV9FUlJPUiAmJiBnbS5nbXB0R2x5cGhPcmlnaW4ueSA+IDAp
CisgICAgICAgICAgICBtX3hIZWlnaHQgPSBnbS5nbXB0R2x5cGhPcmlnaW4ueTsKKworICAgICAg
ICBtX3VuaXRzUGVyRW0gPSBtZXRyaWNzLm90bUVNU3F1YXJlOworCisgICAgICAgIFNlbGVjdE9i
amVjdChoZGMsIG9sZEZvbnQpOworICAgICAgICBSZWxlYXNlREMoMCwgaGRjKTsKKworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgLy8gRklYTUU6IFRoaXMgc2VjdGlvbiBzaG91bGQgZGV0
ZXJtaW5lIGZvbnQgZGltZW5zaW9ucyAoc2VlIENHIGltcGxlbWVudGF0aW9uKS4KKyAgICBub3RJ
bXBsZW1lbnRlZCgpOworfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3ko
KQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK2Zsb2F0IFNpbXBsZUZvbnREYXRhOjpw
bGF0Zm9ybVdpZHRoRm9yR2x5cGgoR2x5cGggZ2x5cGgpIGNvbnN0Cit7CisgICAgaWYgKG1fZm9u
dC51c2VHREkoKSkgeworICAgICAgICBIREMgaGRjID0gR2V0REMoMCk7CisgICAgICAgIEhHRElP
Qkogb2xkRm9udCA9IFNlbGVjdE9iamVjdChoZGMsIG1fZm9udC5oZm9udCgpKTsKKyAgICAgICAg
aW50IHdpZHRoOworICAgICAgICBHZXRDaGFyV2lkdGhJKGhkYywgZ2x5cGgsIDEsIDAsICZ3aWR0
aCk7CisgICAgICAgIFNlbGVjdE9iamVjdChoZGMsIG9sZEZvbnQpOworICAgICAgICBSZWxlYXNl
REMoMCwgaGRjKTsKKyAgICAgICAgcmV0dXJuIHdpZHRoOworICAgIH0KKworICAgIC8vIEZJWE1F
OiBGbGVzaCBvdXQgd2l0aCBDYWlyby93aW4zMiBmb250IGltcGxlbWVudGF0aW9uCisgICAgbm90
SW1wbGVtZW50ZWQoKTsKKworICAgIHJldHVybiAwOworfQorCit9CkluZGV4OiBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YVdpbi5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERhdGFXaW4uY3BwCShyZXZp
c2lvbiAyOTgzNCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnRE
YXRhV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmln
aHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENv
cHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC00OCwxMTYgKzQ4LDE2IEBA
IHVzaW5nIHN0ZDo6bWF4OwogCiBjb25zdCBmbG9hdCBjU21hbGxDYXBzRm9udFNpemVNdWx0aXBs
aWVyID0gMC43ZjsKIAotc3RhdGljIGJvb2wgc2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrOwotCi1z
dGF0aWMgaW5saW5lIGZsb2F0IHNjYWxlRW1Ub1VuaXRzKGZsb2F0IHgsIHVuc2lnbmVkIHVuaXRz
UGVyRW0pIHsgcmV0dXJuIHVuaXRzUGVyRW0gPyB4IC8gKGZsb2F0KXVuaXRzUGVyRW0gOiB4OyB9
CitzdGF0aWMgYm9vbCBnX3Nob3VsZEFwcGx5TWFjQXNjZW50SGFjazsKIAogdm9pZCBTaW1wbGVG
b250RGF0YTo6c2V0U2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrKGJvb2wgYikKIHsKLSAgICBzaG91
bGRBcHBseU1hY0FzY2VudEhhY2sgPSBiOwotfQotCi12b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0
Zm9ybUluaXQoKQoteyAgICAKLSAgICBtX3N5bnRoZXRpY0JvbGRPZmZzZXQgPSBtX2ZvbnQuc3lu
dGhldGljQm9sZCgpID8gMS4wZiA6IDAuZjsKLSAgICBtX3NjcmlwdENhY2hlID0gMDsKLSAgICBt
X3NjcmlwdEZvbnRQcm9wZXJ0aWVzID0gMDsKLSAgICBtX2lzU3lzdGVtRm9udCA9IGZhbHNlOwot
ICAgIAotICAgIGlmIChtX2ZvbnQudXNlR0RJKCkpIHsKLSAgICAgICAgSERDIGhkYyA9IEdldERD
KDApOwotICAgICAgICBIR0RJT0JKIG9sZEZvbnQgPSBTZWxlY3RPYmplY3QoaGRjLCBtX2ZvbnQu
aGZvbnQoKSk7Ci0gICAgICAgIE9VVExJTkVURVhUTUVUUklDIG1ldHJpY3M7Ci0gICAgICAgIEdl
dE91dGxpbmVUZXh0TWV0cmljcyhoZGMsIHNpemVvZihtZXRyaWNzKSwgJm1ldHJpY3MpOwotICAg
ICAgICBURVhUTUVUUklDJiB0ZXh0TWV0cmljcyA9IG1ldHJpY3Mub3RtVGV4dE1ldHJpY3M7Ci0g
ICAgICAgIG1fYXNjZW50ID0gdGV4dE1ldHJpY3MudG1Bc2NlbnQ7Ci0gICAgICAgIG1fZGVzY2Vu
dCA9IHRleHRNZXRyaWNzLnRtRGVzY2VudDsKLSAgICAgICAgbV9saW5lR2FwID0gdGV4dE1ldHJp
Y3MudG1FeHRlcm5hbExlYWRpbmc7Ci0gICAgICAgIG1fbGluZVNwYWNpbmcgPSBtX2FzY2VudCAr
IG1fZGVzY2VudCArIG1fbGluZUdhcDsKLSAgICAgICAgbV94SGVpZ2h0ID0gbV9hc2NlbnQgKiAw
LjU2ZjsgLy8gQmVzdCBndWVzcyBmb3IgeEhlaWdodCBpZiBubyB4IGdseXBoIGlzIHByZXNlbnQu
Ci0KLSAgICAgICAgR0xZUEhNRVRSSUNTIGdtOwotICAgICAgICBNQVQyIG1hdCA9IHsgMSwgMCwg
MCwgMSB9OwotICAgICAgICBEV09SRCBsZW4gPSBHZXRHbHlwaE91dGxpbmUoaGRjLCAneCcsIEdH
T19NRVRSSUNTLCAmZ20sIDAsIDAsICZtYXQpOwotICAgICAgICBpZiAobGVuICE9IEdESV9FUlJP
UiAmJiBnbS5nbXB0R2x5cGhPcmlnaW4ueSA+IDApCi0gICAgICAgICAgICBtX3hIZWlnaHQgPSBn
bS5nbXB0R2x5cGhPcmlnaW4ueTsKLQotICAgICAgICBtX3VuaXRzUGVyRW0gPSBtZXRyaWNzLm90
bUVNU3F1YXJlOwotCi0gICAgICAgIFNlbGVjdE9iamVjdChoZGMsIG9sZEZvbnQpOwotICAgICAg
ICBSZWxlYXNlREMoMCwgaGRjKTsKLQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQ0dG
b250UmVmIGZvbnQgPSBtX2ZvbnQuY2dGb250KCk7Ci0gICAgaW50IGlBc2NlbnQgPSBDR0ZvbnRH
ZXRBc2NlbnQoZm9udCk7Ci0gICAgaW50IGlEZXNjZW50ID0gQ0dGb250R2V0RGVzY2VudChmb250
KTsKLSAgICBpbnQgaUxpbmVHYXAgPSBDR0ZvbnRHZXRMZWFkaW5nKGZvbnQpOwotICAgIG1fdW5p
dHNQZXJFbSA9IENHRm9udEdldFVuaXRzUGVyRW0oZm9udCk7Ci0gICAgZmxvYXQgcG9pbnRTaXpl
ID0gbV9mb250LnNpemUoKTsKLSAgICBmbG9hdCBmQXNjZW50ID0gc2NhbGVFbVRvVW5pdHMoaUFz
Y2VudCwgbV91bml0c1BlckVtKSAqIHBvaW50U2l6ZTsKLSAgICBmbG9hdCBmRGVzY2VudCA9IC1z
Y2FsZUVtVG9Vbml0cyhpRGVzY2VudCwgbV91bml0c1BlckVtKSAqIHBvaW50U2l6ZTsKLSAgICBm
bG9hdCBmTGluZUdhcCA9IHNjYWxlRW1Ub1VuaXRzKGlMaW5lR2FwLCBtX3VuaXRzUGVyRW0pICog
cG9pbnRTaXplOwotCi0gICAgaWYgKCFpc0N1c3RvbUZvbnQoKSkgewotICAgICAgICBIREMgZGMg
PSBHZXREQygwKTsKLSAgICAgICAgSEdESU9CSiBvbGRGb250ID0gU2VsZWN0T2JqZWN0KGRjLCBt
X2ZvbnQuaGZvbnQoKSk7Ci0gICAgICAgIGludCBmYWNlTGVuZ3RoID0gR2V0VGV4dEZhY2UoZGMs
IDAsIDApOwotICAgICAgICBWZWN0b3I8VENIQVI+IGZhY2VOYW1lKGZhY2VMZW5ndGgpOwotICAg
ICAgICBHZXRUZXh0RmFjZShkYywgZmFjZUxlbmd0aCwgZmFjZU5hbWUuZGF0YSgpKTsKLSAgICAg
ICAgbV9pc1N5c3RlbUZvbnQgPSAhX3Rjc2NtcChmYWNlTmFtZS5kYXRhKCksIF9UKCJMdWNpZGEg
R3JhbmRlIikpOwotICAgICAgICBTZWxlY3RPYmplY3QoZGMsIG9sZEZvbnQpOwotICAgICAgICBS
ZWxlYXNlREMoMCwgZGMpOwotCi0gICAgICAgIGlmIChzaG91bGRBcHBseU1hY0FzY2VudEhhY2sp
IHsKLSAgICAgICAgICAgIC8vIFRoaXMgY29kZSBjb21lcyBmcm9tIEZvbnREYXRhTWFjLm1tLiBX
ZSBvbmx5IGV2ZXIgZG8gdGhpcyB3aGVuIHJ1bm5pbmcgcmVncmVzc2lvbiB0ZXN0cyBzbyB0aGF0
IG91ciBtZXRyaWNzIHdpbGwgbWF0Y2ggTWFjLgotCi0gICAgICAgICAgICAvLyBXZSBuZWVkIHRv
IGFkanVzdCBUaW1lcywgSGVsdmV0aWNhLCBhbmQgQ291cmllciB0byBjbG9zZWx5IG1hdGNoIHRo
ZQotICAgICAgICAgICAgLy8gdmVydGljYWwgbWV0cmljcyBvZiB0aGVpciBNaWNyb3NvZnQgY291
bnRlcnBhcnRzIHRoYXQgYXJlIHRoZSBkZSBmYWN0bwotICAgICAgICAgICAgLy8gd2ViIHN0YW5k
YXJkLiBUaGUgQXBwS2l0IGFkanVzdG1lbnQgb2YgMjAlIGlzIHRvbyBiaWcgYW5kIGlzCi0gICAg
ICAgICAgICAvLyBpbmNvcnJlY3RseSBhZGRlZCB0byBsaW5lIHNwYWNpbmcsIHNvIHdlIHVzZSBh
IDE1JSBhZGp1c3RtZW50IGluc3RlYWQKLSAgICAgICAgICAgIC8vIGFuZCBhZGQgaXQgdG8gdGhl
IGFzY2VudC4KLSAgICAgICAgICAgIGlmICghX3Rjc2NtcChmYWNlTmFtZS5kYXRhKCksIF9UKCJU
aW1lcyIpKSB8fCAhX3Rjc2NtcChmYWNlTmFtZS5kYXRhKCksIF9UKCJIZWx2ZXRpY2EiKSkgfHwg
IV90Y3NjbXAoZmFjZU5hbWUuZGF0YSgpLCBfVCgiQ291cmllciIpKSkKLSAgICAgICAgICAgICAg
ICBmQXNjZW50ICs9IGZsb29yZigoKGZBc2NlbnQgKyBmRGVzY2VudCkgKiAwLjE1ZikgKyAwLjVm
KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1fYXNjZW50ID0gbHJvdW5kZihmQXNjZW50KTsK
LSAgICBtX2Rlc2NlbnQgPSBscm91bmRmKGZEZXNjZW50KTsKLSAgICBtX2xpbmVHYXAgPSBscm91
bmRmKGZMaW5lR2FwKTsKLSAgICBtX2xpbmVTcGFjaW5nID0gbV9hc2NlbnQgKyBtX2Rlc2NlbnQg
KyBtX2xpbmVHYXA7Ci0KLSAgICAvLyBNZWFzdXJlIHRoZSBhY3R1YWwgY2hhcmFjdGVyICJ4Iiwg
YmVjYXVzZSBBcHBLaXQgc3ludGhlc2l6ZXMgWCBoZWlnaHQgcmF0aGVyIHRoYW4gZ2V0dGluZyBp
dCBmcm9tIHRoZSBmb250LgotICAgIC8vIFVuZm9ydHVuYXRlbHksIE5TRm9udCB3aWxsIHJvdW5k
IHRoaXMgZm9yIHVzIHNvIHdlIGRvbid0IHF1aXRlIGdldCB0aGUgcmlnaHQgdmFsdWUuCi0gICAg
R2x5cGhQYWdlKiBnbHlwaFBhZ2VaZXJvID0gR2x5cGhQYWdlVHJlZU5vZGU6OmdldFJvb3RDaGls
ZCh0aGlzLCAwKS0+cGFnZSgpOwotICAgIEdseXBoIHhHbHlwaCA9IGdseXBoUGFnZVplcm8gPyBn
bHlwaFBhZ2VaZXJvLT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoJ3gnKS5nbHlwaCA6IDA7Ci0gICAg
aWYgKHhHbHlwaCkgewotICAgICAgICBDR1JlY3QgeEJveDsKLSAgICAgICAgQ0dGb250R2V0R2x5
cGhCQm94ZXMoZm9udCwgJnhHbHlwaCwgMSwgJnhCb3gpOwotICAgICAgICAvLyBVc2UgdGhlIG1h
eGltdW0gb2YgZWl0aGVyIHdpZHRoIG9yIGhlaWdodCBiZWNhdXNlICJ4IiBpcyBuZWFybHkgc3F1
YXJlCi0gICAgICAgIC8vIGFuZCB3ZWIgcGFnZXMgdGhhdCBmb29saXNobHkgdXNlIHRoaXMgbWV0
cmljIGZvciB3aWR0aCB3aWxsIGJlIGxhaWQgb3V0Ci0gICAgICAgIC8vIHBvb3JseSBpZiB3ZSBy
ZXR1cm4gYW4gYWNjdXJhdGUgaGVpZ2h0LiBDbGFzc2ljIGNhc2UgaXMgVGltZXMgMTMgcG9pbnQs
Ci0gICAgICAgIC8vIHdoaWNoIGhhcyBhbiAieCIgdGhhdCBpcyA3eDYgcGl4ZWxzLgotICAgICAg
ICBtX3hIZWlnaHQgPSBzY2FsZUVtVG9Vbml0cyhtYXgoQ0dSZWN0R2V0TWF4WCh4Qm94KSwgQ0dS
ZWN0R2V0TWF4WSh4Qm94KSksIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7Ci0gICAgfSBlbHNl
IHsKLSAgICAgICAgaW50IGlYSGVpZ2h0ID0gQ0dGb250R2V0WEhlaWdodChmb250KTsKLSAgICAg
ICAgbV94SGVpZ2h0ID0gc2NhbGVFbVRvVW5pdHMoaVhIZWlnaHQsIG1fdW5pdHNQZXJFbSkgKiBw
b2ludFNpemU7Ci0gICAgfQorICAgIGdfc2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrID0gYjsKIH0K
IAotdm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1EZXN0cm95KCkKK2Jvb2wgU2ltcGxlRm9u
dERhdGE6OnNob3VsZEFwcGx5TWFjQXNjZW50SGFjaygpCiB7Ci0gICAgaWYgKCFpc0N1c3RvbUZv
bnQoKSkgewotICAgICAgICBEZWxldGVPYmplY3QobV9mb250Lmhmb250KCkpOwotICAgICAgICBD
R0ZvbnRSZWxlYXNlKG1fZm9udC5jZ0ZvbnQoKSk7Ci0gICAgfQotCi0gICAgLy8gV2UgZG9uJ3Qg
aGFzaCB0aGlzIG9uIFdpbjMyLCBzbyBpdCdzIGVmZmVjdGl2ZWx5IG93bmVkIGJ5IHVzLgotICAg
IGRlbGV0ZSBtX3NtYWxsQ2Fwc0ZvbnREYXRhOwotCi0gICAgU2NyaXB0RnJlZUNhY2hlKCZtX3Nj
cmlwdENhY2hlKTsKLSAgICBkZWxldGUgbV9zY3JpcHRGb250UHJvcGVydGllczsKKyAgICByZXR1
cm4gZ19zaG91bGRBcHBseU1hY0FzY2VudEhhY2s7CiB9CiAKIFNpbXBsZUZvbnREYXRhKiBTaW1w
bGVGb250RGF0YTo6c21hbGxDYXBzRm9udERhdGEoY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250
RGVzY3JpcHRpb24pIGNvbnN0CkBAIC0yMzcsMjggKzEzNyw2IEBAIHZvaWQgU2ltcGxlRm9udERh
dGE6OmRldGVybWluZVBpdGNoKCkKICAgICBSZWxlYXNlREMoMCwgZGMpOwogfQogCi1mbG9hdCBT
aW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZvckdseXBoKEdseXBoIGdseXBoKSBjb25zdAot
ewotICAgIGlmIChtX2ZvbnQudXNlR0RJKCkpIHsKLSAgICAgICAgSERDIGhkYyA9IEdldERDKDAp
OwotICAgICAgICBIR0RJT0JKIG9sZEZvbnQgPSBTZWxlY3RPYmplY3QoaGRjLCBtX2ZvbnQuaGZv
bnQoKSk7Ci0gICAgICAgIGludCB3aWR0aDsKLSAgICAgICAgR2V0Q2hhcldpZHRoSShoZGMsIGds
eXBoLCAxLCAwLCAmd2lkdGgpOwotICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBvbGRGb250KTsK
LSAgICAgICAgUmVsZWFzZURDKDAsIGhkYyk7Ci0gICAgICAgIHJldHVybiB3aWR0aDsKLSAgICB9
Ci0KLSAgICBDR0ZvbnRSZWYgZm9udCA9IG1fZm9udC5jZ0ZvbnQoKTsKLSAgICBmbG9hdCBwb2lu
dFNpemUgPSBtX2ZvbnQuc2l6ZSgpOwotICAgIENHU2l6ZSBhZHZhbmNlOwotICAgIENHQWZmaW5l
VHJhbnNmb3JtIG0gPSBDR0FmZmluZVRyYW5zZm9ybU1ha2VTY2FsZShwb2ludFNpemUsIHBvaW50
U2l6ZSk7Ci0gICAgLy8gRklYTUU6IE5lZWQgdG8gYWRkIHJlYWwgc3VwcG9ydCBmb3IgcHJpbnRl
ciBmb250cy4KLSAgICBib29sIGlzUHJpbnRlckZvbnQgPSBmYWxzZTsKLSAgICB3a0dldEdseXBo
QWR2YW5jZXMoZm9udCwgbSwgbV9pc1N5c3RlbUZvbnQsIGlzUHJpbnRlckZvbnQsIGdseXBoLCBh
ZHZhbmNlKTsKLSAgICByZXR1cm4gYWR2YW5jZS53aWR0aCArIG1fc3ludGhldGljQm9sZE9mZnNl
dDsKLX0KLQogU0NSSVBUX0ZPTlRQUk9QRVJUSUVTKiBTaW1wbGVGb250RGF0YTo6c2NyaXB0Rm9u
dFByb3BlcnRpZXMoKSBjb25zdAogewogICAgIGlmICghbV9zY3JpcHRGb250UHJvcGVydGllcykg
ewpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlQ0dXaW4uY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNHV2luLmNwcAkocmV2aXNpb24g
Mjk4MzQpCShmcm9tIFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZVdpbi5jcHA6Mjk4MzQp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFnSW1hZ2VDR1dpbi5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5j
LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkRyYWdJbWFnZS5oIgorCisjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKKyNpbmNsdWRl
ICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbWFnZS5oIgorI2luY2x1ZGUgIlJldGFp
blB0ci5oIgorCisjaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NvcmVHcmFwaGljcy5oPgorCisjaW5j
bHVkZSA8d2luZG93cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0ludFNpemUgZHJhZ0lt
YWdlU2l6ZShEcmFnSW1hZ2VSZWYgaW1hZ2UpCit7CisgICAgaWYgKCFpbWFnZSkKKyAgICAgICAg
cmV0dXJuIEludFNpemUoKTsKKyAgICBCSVRNQVAgYjsKKyAgICBHZXRPYmplY3QoaW1hZ2UsIHNp
emVvZihCSVRNQVApLCAmYik7CisgICAgcmV0dXJuIEludFNpemUoYi5ibVdpZHRoLCBiLmJtSGVp
Z2h0KTsKK30KKwordm9pZCBkZWxldGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVmIGltYWdlKQorewor
ICAgIGlmIChpbWFnZSkKKyAgICAgICAgOjpEZWxldGVPYmplY3QoaW1hZ2UpOworfQorCitIQklU
TUFQIGFsbG9jSW1hZ2UoSERDIGRjLCBJbnRTaXplIHNpemUsIENHQ29udGV4dFJlZiAqdGFyZ2V0
UmVmKQoreworICAgIEhCSVRNQVAgaGJtcDsKKyAgICBCSVRNQVBJTkZPIGJtcEluZm8gPSB7MH07
CisgICAgYm1wSW5mby5ibWlIZWFkZXIuYmlTaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIp
OworICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpV2lkdGggPSBzaXplLndpZHRoKCk7CisgICAgYm1w
SW5mby5ibWlIZWFkZXIuYmlIZWlnaHQgPSBzaXplLmhlaWdodCgpOworICAgIGJtcEluZm8uYm1p
SGVhZGVyLmJpUGxhbmVzID0gMTsKKyAgICBibXBJbmZvLmJtaUhlYWRlci5iaUJpdENvdW50ID0g
MzI7CisgICAgYm1wSW5mby5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiA9IEJJX1JHQjsKKyAgICBM
UFZPSUQgYml0czsKKyAgICBoYm1wID0gQ3JlYXRlRElCU2VjdGlvbihkYywgJmJtcEluZm8sIERJ
Ql9SR0JfQ09MT1JTLCAmYml0cywgMCwgMCk7CisKKyAgICBpZiAoIXRhcmdldFJlZikKKyAgICAg
ICAgcmV0dXJuIGhibXA7CisKKyAgICBDR0NvbG9yU3BhY2VSZWYgZGV2aWNlUkdCID0gQ0dDb2xv
clNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7CisgICAgQ0dDb250ZXh0UmVmIGJpdG1hcENvbnRleHQg
PSBDR0JpdG1hcENvbnRleHRDcmVhdGUoYml0cywgYm1wSW5mby5ibWlIZWFkZXIuYmlXaWR0aCwg
Ym1wSW5mby5ibWlIZWFkZXIuYmlIZWlnaHQsIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wSW5mby5ibWlIZWFkZXIuYmlXaWR0aCAq
IDQsIGRldmljZVJHQiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhh
Tm9uZVNraXBGaXJzdCk7CisgICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOworICAg
IGlmICghYml0bWFwQ29udGV4dCkgeworICAgICAgICBEZWxldGVPYmplY3QoaGJtcCk7CisgICAg
ICAgIHJldHVybiAwOworICAgIH0KKworICAgICp0YXJnZXRSZWYgPSBiaXRtYXBDb250ZXh0Owor
ICAgIHJldHVybiBoYm1wOworfQorCitzdGF0aWMgQ0dDb250ZXh0UmVmIGNyZWF0ZUNnQ29udGV4
dEZyb21CaXRtYXAoSEJJVE1BUCBiaXRtYXApCit7CisgICAgQklUTUFQIGluZm87CisgICAgR2V0
T2JqZWN0KGJpdG1hcCwgc2l6ZW9mKGluZm8pLCAmaW5mbyk7CisgICAgQVNTRVJUKGluZm8uYm1C
aXRzUGl4ZWwgPT0gMzIpOworCisgICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29s
b3JTcGFjZUNyZWF0ZURldmljZVJHQigpOworICAgIENHQ29udGV4dFJlZiBiaXRtYXBDb250ZXh0
ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGluZm8uYm1CaXRzLCBpbmZvLmJtV2lkdGgsIGluZm8u
Ym1IZWlnaHQsIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9y
ZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhhTm9uZVNraXBGaXJzdCk7CisgICAgQ0dDb2xvclNw
YWNlUmVsZWFzZShkZXZpY2VSR0IpOworICAgIHJldHVybiBiaXRtYXBDb250ZXh0OworfQorCitE
cmFnSW1hZ2VSZWYgc2NhbGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVmIGltYWdlLCBGbG9hdFNpemUg
c2NhbGUpCit7CisgICAgLy8gRklYTUU6IGR1ZSB0byB0aGUgd2F5IGRyYWcgaW1hZ2VzIGFyZSBk
b25lIG9uIHdpbmRvd3Mgd2UgbmVlZCAKKyAgICAvLyB0byBwcmVwcm9jZXNzIHRoZSBhbHBoYSBj
aGFubmVsIDxyZGFyOi8vcHJvYmxlbS81MDE1OTQ2PgorCisgICAgaWYgKCFpbWFnZSkKKyAgICAg
ICAgcmV0dXJuIDA7CisgICAgQ0dDb250ZXh0UmVmIHRhcmdldENvbnRleHQ7CisgICAgQ0dDb250
ZXh0UmVmIHNyY0NvbnRleHQ7CisgICAgQ0dJbWFnZVJlZiBzcmNJbWFnZTsKKyAgICBJbnRTaXpl
IHNyY1NpemUgPSBkcmFnSW1hZ2VTaXplKGltYWdlKTsKKyAgICBJbnRTaXplIGRzdFNpemUoKGlu
dCkoc3JjU2l6ZS53aWR0aCgpICogc2NhbGUud2lkdGgoKSksIChpbnQpKHNyY1NpemUuaGVpZ2h0
KCkgKiBzY2FsZS5oZWlnaHQoKSkpOworICAgIEhCSVRNQVAgaGJtcCA9IDA7CisgICAgSERDIGRj
ID0gR2V0REMoMCk7CisgICAgSERDIGRzdERDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGRjKTsKKyAg
ICBpZiAoIWRzdERDKQorICAgICAgICBnb3RvIGV4aXQ7CisKKyAgICBoYm1wID0gYWxsb2NJbWFn
ZShkc3REQywgZHN0U2l6ZSwgJnRhcmdldENvbnRleHQpOworICAgIGlmICghaGJtcCkKKyAgICAg
ICAgZ290byBleGl0OworCisgICAgc3JjQ29udGV4dCA9IGNyZWF0ZUNnQ29udGV4dEZyb21CaXRt
YXAoaW1hZ2UpOworICAgIHNyY0ltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlSW1hZ2Uoc3Jj
Q29udGV4dCk7CisgICAgQ0dSZWN0IHJlY3Q7CisgICAgcmVjdC5vcmlnaW4ueCA9IDA7CisgICAg
cmVjdC5vcmlnaW4ueSA9IDA7CisgICAgcmVjdC5zaXplID0gZHN0U2l6ZTsKKyAgICBDR0NvbnRl
eHREcmF3SW1hZ2UodGFyZ2V0Q29udGV4dCwgcmVjdCwgc3JjSW1hZ2UpOworICAgIENHSW1hZ2VS
ZWxlYXNlKHNyY0ltYWdlKTsKKyAgICBDR0NvbnRleHRSZWxlYXNlKHNyY0NvbnRleHQpOworICAg
IENHQ29udGV4dFJlbGVhc2UodGFyZ2V0Q29udGV4dCk7CisgICAgOjpEZWxldGVPYmplY3QoaW1h
Z2UpOworICAgIGltYWdlID0gMDsKKworZXhpdDoKKyAgICBpZiAoIWhibXApCisgICAgICAgIGhi
bXAgPSBpbWFnZTsKKyAgICBpZiAoZHN0REMpCisgICAgICAgIERlbGV0ZURDKGRzdERDKTsKKyAg
ICBSZWxlYXNlREMoMCwgZGMpOworICAgIHJldHVybiBoYm1wOworfQorICAgIAorRHJhZ0ltYWdl
UmVmIGRpc3NvbHZlRHJhZ0ltYWdlVG9GcmFjdGlvbihEcmFnSW1hZ2VSZWYgaW1hZ2UsIGZsb2F0
KQoreworICAgIC8vV2UgZG9uJ3QgZG8gdGhpcyBvbiB3aW5kb3dzIGFzIHRoZSBkcmFnaW1hZ2Ug
aXMgYmxlbmRlZCBieSB0aGUgT1MKKyAgICByZXR1cm4gaW1hZ2U7Cit9CisgICAgICAgIAorRHJh
Z0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZyb21JbWFnZShJbWFnZSogaW1nKQoreyAgICAKKyAg
ICBIQklUTUFQIGhibXAgPSAwOworICAgIEhEQyBkYyA9IEdldERDKDApOworICAgIEhEQyB3b3Jr
aW5nREMgPSBDcmVhdGVDb21wYXRpYmxlREMoZGMpOworICAgIENHQ29udGV4dFJlZiBkcmF3Q29u
dGV4dCA9IDA7CisgICAgaWYgKCF3b3JraW5nREMpCisgICAgICAgIGdvdG8gZXhpdDsKKworICAg
IGhibXAgPSBhbGxvY0ltYWdlKHdvcmtpbmdEQywgaW1nLT5zaXplKCksICZkcmF3Q29udGV4dCk7
CisKKyAgICBpZiAoIWhibXApCisgICAgICAgIGdvdG8gZXhpdDsKKworICAgIGlmICghZHJhd0Nv
bnRleHQpIHsKKyAgICAgICAgOjpEZWxldGVPYmplY3QoaGJtcCk7CisgICAgICAgIGhibXAgPSAw
OworICAgIH0KKworICAgIENHSW1hZ2VSZWYgc3JjSW1hZ2UgPSBpbWctPmdldENHSW1hZ2VSZWYo
KTsKKyAgICBDR1JlY3QgcmVjdDsKKyAgICByZWN0LnNpemUgPSBpbWctPnNpemUoKTsKKyAgICBy
ZWN0Lm9yaWdpbi54ID0gMDsKKyAgICByZWN0Lm9yaWdpbi55ID0gLXJlY3Quc2l6ZS5oZWlnaHQ7
CisgICAgc3RhdGljIGNvbnN0IENHRmxvYXQgd2hpdGUgW10gPSB7MS4wLCAxLjAsIDEuMCwgMS4w
fTsKKyAgICBDR0NvbnRleHRTY2FsZUNUTShkcmF3Q29udGV4dCwgMSwgLTEpOworICAgIENHQ29u
dGV4dFNldEZpbGxDb2xvcihkcmF3Q29udGV4dCwgd2hpdGUpOworICAgIENHQ29udGV4dEZpbGxS
ZWN0KGRyYXdDb250ZXh0LCByZWN0KTsKKyAgICBDR0NvbnRleHRTZXRCbGVuZE1vZGUoZHJhd0Nv
bnRleHQsIGtDR0JsZW5kTW9kZU5vcm1hbCk7CisgICAgQ0dDb250ZXh0RHJhd0ltYWdlKGRyYXdD
b250ZXh0LCByZWN0LCBzcmNJbWFnZSk7CisgICAgQ0dDb250ZXh0UmVsZWFzZShkcmF3Q29udGV4
dCk7CisKK2V4aXQ6CisgICAgaWYgKHdvcmtpbmdEQykKKyAgICAgICAgRGVsZXRlREMod29ya2lu
Z0RDKTsKKyAgICBSZWxlYXNlREMoMCwgZGMpOworICAgIHJldHVybiBoYm1wOworfQorICAgIAor
RHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUljb25Gb3JDYWNoZWRJbWFnZShDYWNoZWRJbWFn
ZSopCit7CisgICAgLy9GSVhNRTogUHJvdmlkZSBpY29uIGZvciBpbWFnZSB0eXBlIDxyZGFyOi8v
cHJvYmxlbS81MDE1OTQ5PgorICAgIHJldHVybiAwOyAgICAgCit9CisgICAgCit9CkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFnSW1hZ2VDR1dpbi5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlQ0dXaW4uY3BwCShyZXZpc2lvbiAyOTcyNikKKysr
IFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNHV2luLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5jLiAgQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBBcHBsZSBJbmMu
ICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBA
IC0zNywyMSArMzcsNiBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLUludFNpemUgZHJhZ0lt
YWdlU2l6ZShEcmFnSW1hZ2VSZWYgaW1hZ2UpCi17Ci0gICAgaWYgKCFpbWFnZSkKLSAgICAgICAg
cmV0dXJuIEludFNpemUoKTsKLSAgICBCSVRNQVAgYjsKLSAgICBHZXRPYmplY3QoaW1hZ2UsIHNp
emVvZihCSVRNQVApLCAmYik7Ci0gICAgcmV0dXJuIEludFNpemUoYi5ibVdpZHRoLCBiLmJtSGVp
Z2h0KTsKLX0KLQotdm9pZCBkZWxldGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVmIGltYWdlKQotewot
ICAgIGlmIChpbWFnZSkKLSAgICAgICAgOjpEZWxldGVPYmplY3QoaW1hZ2UpOwotfQotCiBIQklU
TUFQIGFsbG9jSW1hZ2UoSERDIGRjLCBJbnRTaXplIHNpemUsIENHQ29udGV4dFJlZiAqdGFyZ2V0
UmVmKQogewogICAgIEhCSVRNQVAgaGJtcDsKQEAgLTEwNiw3ICs5MSw3IEBAIERyYWdJbWFnZVJl
ZiBzY2FsZURyYWdJbWFnZShEcmFnSW1hZ2VSZWYKICAgICBDR0NvbnRleHRSZWYgc3JjQ29udGV4
dDsKICAgICBDR0ltYWdlUmVmIHNyY0ltYWdlOwogICAgIEludFNpemUgc3JjU2l6ZSA9IGRyYWdJ
bWFnZVNpemUoaW1hZ2UpOwotICAgIEludFNpemUgZHN0U2l6ZSgoaW50KShzcmNTaXplLndpZHRo
KCkgKiBzY2FsZS53aWR0aCgpKSwgKGludCkoc3JjU2l6ZS5oZWlnaHQoKSAqIHNjYWxlLmhlaWdo
dCgpKSk7CisgICAgSW50U2l6ZSBkc3RTaXplKHN0YXRpY19jYXN0PGludD4oc3JjU2l6ZS53aWR0
aCgpICogc2NhbGUud2lkdGgoKSksIHN0YXRpY19jYXN0PGludD4oc3JjU2l6ZS5oZWlnaHQoKSAq
IHNjYWxlLmhlaWdodCgpKSk7CiAgICAgSEJJVE1BUCBoYm1wID0gMDsKICAgICBIREMgZGMgPSBH
ZXREQygwKTsKICAgICBIREMgZHN0REMgPSBDcmVhdGVDb21wYXRpYmxlREMoZGMpOwpAQCAtMTM5
LDE0ICsxMjQsOCBAQCBleGl0OgogICAgIHJldHVybiBoYm1wOwogfQogICAgIAotRHJhZ0ltYWdl
UmVmIGRpc3NvbHZlRHJhZ0ltYWdlVG9GcmFjdGlvbihEcmFnSW1hZ2VSZWYgaW1hZ2UsIGZsb2F0
KQotewotICAgIC8vV2UgZG9uJ3QgZG8gdGhpcyBvbiB3aW5kb3dzIGFzIHRoZSBkcmFnaW1hZ2Ug
aXMgYmxlbmRlZCBieSB0aGUgT1MKLSAgICByZXR1cm4gaW1hZ2U7Ci19Ci0gICAgICAgIAogRHJh
Z0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZyb21JbWFnZShJbWFnZSogaW1nKQoteyAgICAKK3sK
ICAgICBIQklUTUFQIGhibXAgPSAwOwogICAgIEhEQyBkYyA9IEdldERDKDApOwogICAgIEhEQyB3
b3JraW5nREMgPSBDcmVhdGVDb21wYXRpYmxlREMoZGMpOwpAQCAtMTg0LDEwICsxNjMsNCBAQCBl
eGl0OgogICAgIHJldHVybiBoYm1wOwogfQogICAgIAotRHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJ
bWFnZUljb25Gb3JDYWNoZWRJbWFnZShDYWNoZWRJbWFnZSopCi17Ci0gICAgLy9GSVhNRTogUHJv
dmlkZSBpY29uIGZvciBpbWFnZSB0eXBlIDxyZGFyOi8vcHJvYmxlbS81MDE1OTQ5PgotICAgIHJl
dHVybiAwOyAgICAgCi19Ci0gICAgCiB9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFn
SW1hZ2VDYWlyb1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJh
Z0ltYWdlQ2Fpcm9XaW4uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW4v
RHJhZ0ltYWdlQ2Fpcm9XaW4uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDU0IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRF
UiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVS
LCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJEcmFnSW1hZ2UuaCIKKworI2lu
Y2x1ZGUgIkNhY2hlZEltYWdlLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5j
bHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlJl
dGFpblB0ci5oIgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK0RyYWdJbWFnZVJlZiBzY2FsZURyYWdJbWFnZShEcmFnSW1hZ2VSZWYgaW1hZ2UsIEZsb2F0
U2l6ZSBzY2FsZSkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworCisgICAgcmV0dXJuIGltYWdl
OworfQorICAgIAorRHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZyb21JbWFnZShJbWFnZSog
aW1nKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisKKyAgICBEcmFnSW1hZ2VSZWYgdGVtcDsK
KyAgICByZXR1cm4gdGVtcDsKK30KKyAgICAKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2lu
L0RyYWdJbWFnZVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJh
Z0ltYWdlV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbi9E
cmFnSW1hZ2VXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENv
cHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29w
eXJpZ2h0IChDKSAyMDA3LCAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAg
KgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTMxLDggKzMxLDYgQEAKICNpbmNsdWRl
ICJJbWFnZS5oIgogI2luY2x1ZGUgIlJldGFpblB0ci5oIgogCi0jaW5jbHVkZSA8Q29yZUdyYXBo
aWNzL0NvcmVHcmFwaGljcy5oPgotCiAjaW5jbHVkZSA8d2luZG93cy5oPgogCiBuYW1lc3BhY2Ug
V2ViQ29yZSB7CkBAIC01MiwxMzggKzUwLDEyIEBAIHZvaWQgZGVsZXRlRHJhZ0ltYWdlKERyYWdJ
bWFnZVJlZiBpbWFnZSkKICAgICAgICAgOjpEZWxldGVPYmplY3QoaW1hZ2UpOwogfQogCi1IQklU
TUFQIGFsbG9jSW1hZ2UoSERDIGRjLCBJbnRTaXplIHNpemUsIENHQ29udGV4dFJlZiAqdGFyZ2V0
UmVmKQotewotICAgIEhCSVRNQVAgaGJtcDsKLSAgICBCSVRNQVBJTkZPIGJtcEluZm8gPSB7MH07
Ci0gICAgYm1wSW5mby5ibWlIZWFkZXIuYmlTaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIp
OwotICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpV2lkdGggPSBzaXplLndpZHRoKCk7Ci0gICAgYm1w
SW5mby5ibWlIZWFkZXIuYmlIZWlnaHQgPSBzaXplLmhlaWdodCgpOwotICAgIGJtcEluZm8uYm1p
SGVhZGVyLmJpUGxhbmVzID0gMTsKLSAgICBibXBJbmZvLmJtaUhlYWRlci5iaUJpdENvdW50ID0g
MzI7Ci0gICAgYm1wSW5mby5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiA9IEJJX1JHQjsKLSAgICBM
UFZPSUQgYml0czsKLSAgICBoYm1wID0gQ3JlYXRlRElCU2VjdGlvbihkYywgJmJtcEluZm8sIERJ
Ql9SR0JfQ09MT1JTLCAmYml0cywgMCwgMCk7Ci0KLSAgICBpZiAoIXRhcmdldFJlZikKLSAgICAg
ICAgcmV0dXJuIGhibXA7Ci0KLSAgICBDR0NvbG9yU3BhY2VSZWYgZGV2aWNlUkdCID0gQ0dDb2xv
clNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7Ci0gICAgQ0dDb250ZXh0UmVmIGJpdG1hcENvbnRleHQg
PSBDR0JpdG1hcENvbnRleHRDcmVhdGUoYml0cywgYm1wSW5mby5ibWlIZWFkZXIuYmlXaWR0aCwg
Ym1wSW5mby5ibWlIZWFkZXIuYmlIZWlnaHQsIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wSW5mby5ibWlIZWFkZXIuYmlXaWR0aCAq
IDQsIGRldmljZVJHQiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhh
Tm9uZVNraXBGaXJzdCk7Ci0gICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOwotICAg
IGlmICghYml0bWFwQ29udGV4dCkgewotICAgICAgICBEZWxldGVPYmplY3QoaGJtcCk7Ci0gICAg
ICAgIHJldHVybiAwOwotICAgIH0KLQotICAgICp0YXJnZXRSZWYgPSBiaXRtYXBDb250ZXh0Owot
ICAgIHJldHVybiBoYm1wOwotfQotCi1zdGF0aWMgQ0dDb250ZXh0UmVmIGNyZWF0ZUNnQ29udGV4
dEZyb21CaXRtYXAoSEJJVE1BUCBiaXRtYXApCi17Ci0gICAgQklUTUFQIGluZm87Ci0gICAgR2V0
T2JqZWN0KGJpdG1hcCwgc2l6ZW9mKGluZm8pLCAmaW5mbyk7Ci0gICAgQVNTRVJUKGluZm8uYm1C
aXRzUGl4ZWwgPT0gMzIpOwotCi0gICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29s
b3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwotICAgIENHQ29udGV4dFJlZiBiaXRtYXBDb250ZXh0
ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGluZm8uYm1CaXRzLCBpbmZvLmJtV2lkdGgsIGluZm8u
Ym1IZWlnaHQsIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9y
ZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhhTm9uZVNraXBGaXJzdCk7Ci0gICAgQ0dDb2xvclNw
YWNlUmVsZWFzZShkZXZpY2VSR0IpOwotICAgIHJldHVybiBiaXRtYXBDb250ZXh0OwotfQotCi1E
cmFnSW1hZ2VSZWYgc2NhbGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVmIGltYWdlLCBGbG9hdFNpemUg
c2NhbGUpCi17Ci0gICAgLy8gRklYTUU6IGR1ZSB0byB0aGUgd2F5IGRyYWcgaW1hZ2VzIGFyZSBk
b25lIG9uIHdpbmRvd3Mgd2UgbmVlZCAKLSAgICAvLyB0byBwcmVwcm9jZXNzIHRoZSBhbHBoYSBj
aGFubmVsIDxyZGFyOi8vcHJvYmxlbS81MDE1OTQ2PgotCi0gICAgaWYgKCFpbWFnZSkKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgQ0dDb250ZXh0UmVmIHRhcmdldENvbnRleHQ7Ci0gICAgQ0dDb250
ZXh0UmVmIHNyY0NvbnRleHQ7Ci0gICAgQ0dJbWFnZVJlZiBzcmNJbWFnZTsKLSAgICBJbnRTaXpl
IHNyY1NpemUgPSBkcmFnSW1hZ2VTaXplKGltYWdlKTsKLSAgICBJbnRTaXplIGRzdFNpemUoKGlu
dCkoc3JjU2l6ZS53aWR0aCgpICogc2NhbGUud2lkdGgoKSksIChpbnQpKHNyY1NpemUuaGVpZ2h0
KCkgKiBzY2FsZS5oZWlnaHQoKSkpOwotICAgIEhCSVRNQVAgaGJtcCA9IDA7Ci0gICAgSERDIGRj
ID0gR2V0REMoMCk7Ci0gICAgSERDIGRzdERDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGRjKTsKLSAg
ICBpZiAoIWRzdERDKQotICAgICAgICBnb3RvIGV4aXQ7Ci0KLSAgICBoYm1wID0gYWxsb2NJbWFn
ZShkc3REQywgZHN0U2l6ZSwgJnRhcmdldENvbnRleHQpOwotICAgIGlmICghaGJtcCkKLSAgICAg
ICAgZ290byBleGl0OwotCi0gICAgc3JjQ29udGV4dCA9IGNyZWF0ZUNnQ29udGV4dEZyb21CaXRt
YXAoaW1hZ2UpOwotICAgIHNyY0ltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlSW1hZ2Uoc3Jj
Q29udGV4dCk7Ci0gICAgQ0dSZWN0IHJlY3Q7Ci0gICAgcmVjdC5vcmlnaW4ueCA9IDA7Ci0gICAg
cmVjdC5vcmlnaW4ueSA9IDA7Ci0gICAgcmVjdC5zaXplID0gZHN0U2l6ZTsKLSAgICBDR0NvbnRl
eHREcmF3SW1hZ2UodGFyZ2V0Q29udGV4dCwgcmVjdCwgc3JjSW1hZ2UpOwotICAgIENHSW1hZ2VS
ZWxlYXNlKHNyY0ltYWdlKTsKLSAgICBDR0NvbnRleHRSZWxlYXNlKHNyY0NvbnRleHQpOwotICAg
IENHQ29udGV4dFJlbGVhc2UodGFyZ2V0Q29udGV4dCk7Ci0gICAgOjpEZWxldGVPYmplY3QoaW1h
Z2UpOwotICAgIGltYWdlID0gMDsKLQotZXhpdDoKLSAgICBpZiAoIWhibXApCi0gICAgICAgIGhi
bXAgPSBpbWFnZTsKLSAgICBpZiAoZHN0REMpCi0gICAgICAgIERlbGV0ZURDKGRzdERDKTsKLSAg
ICBSZWxlYXNlREMoMCwgZGMpOwotICAgIHJldHVybiBoYm1wOwotfQotICAgIAogRHJhZ0ltYWdl
UmVmIGRpc3NvbHZlRHJhZ0ltYWdlVG9GcmFjdGlvbihEcmFnSW1hZ2VSZWYgaW1hZ2UsIGZsb2F0
KQogewogICAgIC8vV2UgZG9uJ3QgZG8gdGhpcyBvbiB3aW5kb3dzIGFzIHRoZSBkcmFnaW1hZ2Ug
aXMgYmxlbmRlZCBieSB0aGUgT1MKICAgICByZXR1cm4gaW1hZ2U7CiB9CiAgICAgICAgIAotRHJh
Z0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZyb21JbWFnZShJbWFnZSogaW1nKQoteyAgICAKLSAg
ICBIQklUTUFQIGhibXAgPSAwOwotICAgIEhEQyBkYyA9IEdldERDKDApOwotICAgIEhEQyB3b3Jr
aW5nREMgPSBDcmVhdGVDb21wYXRpYmxlREMoZGMpOwotICAgIENHQ29udGV4dFJlZiBkcmF3Q29u
dGV4dCA9IDA7Ci0gICAgaWYgKCF3b3JraW5nREMpCi0gICAgICAgIGdvdG8gZXhpdDsKLQotICAg
IGhibXAgPSBhbGxvY0ltYWdlKHdvcmtpbmdEQywgaW1nLT5zaXplKCksICZkcmF3Q29udGV4dCk7
Ci0KLSAgICBpZiAoIWhibXApCi0gICAgICAgIGdvdG8gZXhpdDsKLQotICAgIGlmICghZHJhd0Nv
bnRleHQpIHsKLSAgICAgICAgOjpEZWxldGVPYmplY3QoaGJtcCk7Ci0gICAgICAgIGhibXAgPSAw
OwotICAgIH0KLQotICAgIENHSW1hZ2VSZWYgc3JjSW1hZ2UgPSBpbWctPmdldENHSW1hZ2VSZWYo
KTsKLSAgICBDR1JlY3QgcmVjdDsKLSAgICByZWN0LnNpemUgPSBpbWctPnNpemUoKTsKLSAgICBy
ZWN0Lm9yaWdpbi54ID0gMDsKLSAgICByZWN0Lm9yaWdpbi55ID0gLXJlY3Quc2l6ZS5oZWlnaHQ7
Ci0gICAgc3RhdGljIGNvbnN0IENHRmxvYXQgd2hpdGUgW10gPSB7MS4wLCAxLjAsIDEuMCwgMS4w
fTsKLSAgICBDR0NvbnRleHRTY2FsZUNUTShkcmF3Q29udGV4dCwgMSwgLTEpOwotICAgIENHQ29u
dGV4dFNldEZpbGxDb2xvcihkcmF3Q29udGV4dCwgd2hpdGUpOwotICAgIENHQ29udGV4dEZpbGxS
ZWN0KGRyYXdDb250ZXh0LCByZWN0KTsKLSAgICBDR0NvbnRleHRTZXRCbGVuZE1vZGUoZHJhd0Nv
bnRleHQsIGtDR0JsZW5kTW9kZU5vcm1hbCk7Ci0gICAgQ0dDb250ZXh0RHJhd0ltYWdlKGRyYXdD
b250ZXh0LCByZWN0LCBzcmNJbWFnZSk7Ci0gICAgQ0dDb250ZXh0UmVsZWFzZShkcmF3Q29udGV4
dCk7Ci0KLWV4aXQ6Ci0gICAgaWYgKHdvcmtpbmdEQykKLSAgICAgICAgRGVsZXRlREMod29ya2lu
Z0RDKTsKLSAgICBSZWxlYXNlREMoMCwgZGMpOwotICAgIHJldHVybiBoYm1wOwotfQotICAgIAog
RHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUljb25Gb3JDYWNoZWRJbWFnZShDYWNoZWRJbWFn
ZSopCiB7CiAgICAgLy9GSVhNRTogUHJvdmlkZSBpY29uIGZvciBpbWFnZSB0eXBlIDxyZGFyOi8v
cHJvYmxlbS81MDE1OTQ5Pgo=
</data>
<flag name="review"
          id="8209"
          type_id="1"
          status="-"
          setter="aroben"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>18829</attachid>
            <date>2008-01-31 13:09:15 -0800</date>
            <delta_ts>2008-01-31 16:25:51 -0800</delta_ts>
            <desc>Seventh revision based on Adam&apos;s comments.</desc>
            <filename>webcore_win32.patch</filename>
            <type>text/plain</type>
            <size>201595</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyOTg0NykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNzYgQEAKKzIwMDgtMDEtMjkgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBnbWFp
bC5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
Rmlyc3Qgc3RlcCB0b3dhcmRzIHJlZW5hYmxpbmcgQ2Fpcm8gc3VwcG9ydCB1bmRlciBXaW5kb3dz
LgorICAgICAgICAtIGFkZHMgdmFyaW91cyBQTEFURk9STSBndWFyZHMgdG8gY29kZSB0aGF0IHdp
bGwgbm90IGJ1aWxkCisgICAgICAgICAgdW5kZXIgQ2Fpcm8uCisgICAgICAgIC0gYnJlYWtzIHNv
bWUgZmlsZXMgaW50byBDRyBhbmQgQ2Fpcm8tc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zLgorICAg
ICAgICAtIHByb3ZpZGVzIHNvbWUgd2luMzIvQ2Fpcm8gc3VwcG9ydCAoYnV0IGJ5IG5vIG1lYW5z
IGEgY29tcGxldGUKKyAgICAgICAgICBwb3J0IC0tIHlldCkuCisKKyAgICAgICAgV0FSTklORzog
Tk8gVEVTVCBDQVNFUyBBRERFRCBPUiBDSEFOR0VECisKKyAgICAgICAgKiBXZWJDb3JlLnZjcHJv
ai9XZWJDb3JlLnZjcHJvajoKKyAgICAgICAgKiBicmlkZ2Uvd2luL0ZyYW1lQ0dXaW4uY3BwOiBD
b3BpZWQgZnJvbSBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVXaW4uY3BwLgorICAgICAgICAoV2Vi
Q29yZTo6aW1hZ2VGcm9tU2VsZWN0aW9uKToKKyAgICAgICAgKiBicmlkZ2Uvd2luL0ZyYW1lQ2Fp
cm9XaW4uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OmltYWdlRnJvbVNlbGVjdGlvbik6
CisgICAgICAgICogYnJpZGdlL3dpbi9GcmFtZVdpbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpj
b21wdXRlUGFnZVJlY3RzRm9yRnJhbWUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL1Np
bXBsZUZvbnREYXRhLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhp
Y3NDb250ZXh0Q2Fpcm8uY3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZS5oOiBDb3BpZWQgZnJvbSBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4dENhaXJvLmNwcC4KKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENHV2luLmNwcDogQ29waWVkIGZyb20gV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udFdpbi5jcHAuCisgICAgICAgIChXZWJDb3JlOjpGb250
OjpkcmF3R2x5cGhzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENhaXJv
V2luLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpGb250OjpkcmF3R2x5cGhzKToKKyAg
ICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udFdpbi5jcHA6CisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENHV2luLmNwcDogQ29waWVkIGZyb20g
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0V2luLmNwcC4KKyAg
ICAgICAgKFdlYkNvcmU6OkNHQ29udGV4dFdpdGhIREMpOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0OjpnZXRXaW5kb3dzQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQ6OnJlbGVhc2VXaW5kb3dzQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNvbmNhdENUTSk6CisgICAgICAgIChXZWJD
b3JlOjpzZXRDR1N0cm9rZUNvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dDo6ZHJhd0xpbmVGb3JNaXNzcGVsbGluZ09yQmFkR3JhbW1hcik6CisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENhaXJvV2luLmNwcDogQWRkZWQuCisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dCk6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmdldFdpbmRvd3NDb250ZXh0KToKKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6aW5UcmFuc3BhcmVuY3lMYXllcik6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnJlbGVhc2VXaW5kb3dzQ29udGV4dCk6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNvbmNhdENUTSk6
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1c1JpbmcpOgorICAg
ICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvck1pc3NwZWxsaW5nT3JC
YWRHcmFtbWFyKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250
ZXh0V2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZTo6c2NhbGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlOjpyb3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0UGxhdGZv
cm1Qcml2YXRlOjp0cmFuc2xhdGUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9J
bWFnZUNHV2luLmNwcDogQ29waWVkIGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4v
SW1hZ2VXaW4uY3BwLgorICAgICAgICAoV2ViQ29yZTo6Qml0bWFwSW1hZ2U6OmdldEhCSVRNQVBP
ZlNpemUpOgorICAgICAgICAoV2ViQ29yZTo6Qml0bWFwSW1hZ2U6OmRyYXdGcmFtZU1hdGNoaW5n
U291cmNlU2l6ZSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ2Fpcm9X
aW4uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdlOjpnZXRIQklUTUFQ
T2ZTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdlOjpkcmF3RnJhbWVNYXRjaGlu
Z1NvdXJjZVNpemUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZVdpbi5j
cHA6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ0dXaW4u
Y3BwOiBDb3BpZWQgZnJvbSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250
RGF0YVdpbi5jcHAuCisgICAgICAgIChXZWJDb3JlOjpzY2FsZUVtVG9Vbml0cyk6CisgICAgICAg
IChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KToKKyAgICAgICAgKFdlYkNv
cmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybVdpZHRoRm9yR2x5cGgpOgorICAgICAgICAqIHBs
YXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNhaXJvV2luLmNwcDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KToKKyAgICAgICAg
KFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3kpOgorICAgICAgICAoV2Vi
Q29yZTo6U2ltcGxlRm9udERhdGE6OnBsYXRmb3JtV2lkdGhGb3JHbHlwaCk6CisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhV2luLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OlNpbXBsZUZvbnREYXRhOjpzZXRTaG91bGRBcHBseU1hY0FzY2VudEhhY2spOgorICAg
ICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnNob3VsZEFwcGx5TWFjQXNjZW50SGFjayk6
CisgICAgICAgICogcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNHV2luLmNwcDogQ29waWVkIGZyb20g
V2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlV2luLmNwcC4KKyAgICAgICAgKFdlYkNvcmU6
OnNjYWxlRHJhZ0ltYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OmNyZWF0ZURyYWdJbWFnZUZyb21J
bWFnZSk6CisgICAgICAgICogcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNhaXJvV2luLmNwcDogQWRk
ZWQuCisgICAgICAgIChXZWJDb3JlOjpzY2FsZURyYWdJbWFnZSk6CisgICAgICAgIChXZWJDb3Jl
OjpjcmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2UpOgorICAgICAgICAqIHBsYXRmb3JtL3dpbi9EcmFn
SW1hZ2VXaW4uY3BwOgorCiAyMDA4LTAxLTI5ICBBZGFtIFJvYmVuICA8YXJvYmVuQGFwcGxlLmNv
bT4KIAogICAgICAgICBGaXggPHJkYXI6Ly81NzExMTM2PiBGdWxsLXNjcmVlbiBGbGFzaCBvbiAx
dXAuY29tIGlzIHVucmVzcG9uc2l2ZQpJbmRleDogV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJD
b3JlLnZjcHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUu
dmNwcm9qCShyZXZpc2lvbiAyOTg4NCkKKysrIFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29y
ZS52Y3Byb2oJKHdvcmtpbmcgY29weSkKQEAgLTM0MjIsNiArMzQyMiwxMCBAQAogCQkJCQk+DQog
CQkJCTwvRmlsZT4NCiAJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1c
d2luXERyYWdJbWFnZUNHV2luLmNwcCINCisJCQkJCT4NCisJCQkJPC9GaWxlPg0KKwkJCQk8Rmls
ZQ0KIAkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVx3aW5cRWRpdG9yV2luLmNwcCINCiAJ
CQkJCT4NCiAJCQkJPC9GaWxlPg0KQEAgLTM3NTcsNiArMzc2MSwxMCBAQAogCQkJCQk+DQogCQkJ
CTwvRmlsZT4NCiAJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cZ3Jh
cGhpY3NcY2dcR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmgiDQorCQkJCQk+DQorCQkJ
CTwvRmlsZT4NCisJCQkJPEZpbGUNCiAJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cZ3Jh
cGhpY3NcR3JhcGhpY3NDb250ZXh0LmNwcCINCiAJCQkJCT4NCiAJCQkJPC9GaWxlPg0KQEAgLTM4
NzYsNiArMzg4NCwxMCBAQAogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KIAkJCQkJPEZpbGUNCisJ
CQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxGb250Q0dXaW4uY3Bw
Ig0KKwkJCQkJCT4NCisJCQkJCTwvRmlsZT4NCisJCQkJCTxGaWxlDQogCQkJCQkJUmVsYXRpdmVQ
YXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1x3aW5cRm9udEN1c3RvbVBsYXRmb3JtRGF0YS5jcHAi
DQogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KQEAgLTM5MzIsNiArMzk0NCwxMCBAQAogCQkJCQkJ
Pg0KIAkJCQkJPC9GaWxlPg0KIAkJCQkJPEZpbGUNCisJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBs
YXRmb3JtXGdyYXBoaWNzXHdpblxHcmFwaGljc0NvbnRleHRDR1dpbi5jcHAiDQorCQkJCQkJPg0K
KwkJCQkJPC9GaWxlPg0KKwkJCQkJPEZpbGUNCiAJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRm
b3JtXGdyYXBoaWNzXHdpblxHcmFwaGljc0NvbnRleHRXaW4uY3BwIg0KIAkJCQkJCT4NCiAJCQkJ
CTwvRmlsZT4NCkBAIC0zOTQwLDYgKzM5NTYsMTAgQEAKIAkJCQkJCT4NCiAJCQkJCTwvRmlsZT4N
CiAJCQkJCTxGaWxlDQorCQkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1x3
aW5cSW1hZ2VDR1dpbi5jcHAiDQorCQkJCQkJPg0KKwkJCQkJPC9GaWxlPg0KKwkJCQkJPEZpbGUN
CiAJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxJbWFnZVdpbi5j
cHAiDQogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KQEAgLTM5NjQsNiArMzk4NCwxMCBAQAogCQkJ
CQkJPg0KIAkJCQkJPC9GaWxlPg0KIAkJCQkJPEZpbGUNCisJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4u
XHBsYXRmb3JtXGdyYXBoaWNzXHdpblxTaW1wbGVGb250RGF0YUNHV2luLmNwcCINCisJCQkJCQk+
DQorCQkJCQk8L0ZpbGU+DQorCQkJCQk8RmlsZQ0KIAkJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxh
dGZvcm1cZ3JhcGhpY3Ncd2luXFNpbXBsZUZvbnREYXRhV2luLmNwcCINCiAJCQkJCQk+DQogCQkJ
CQk8L0ZpbGU+DQpAQCAtNjQwOCw2ICs2NDMyLDEwIEBACiAJCQkJTmFtZT0id2luIg0KIAkJCQk+
DQogCQkJCTxGaWxlDQorCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGJyaWRnZVx3aW5cRnJhbWVDR1dp
bi5jcHAiDQorCQkJCQk+DQorCQkJCTwvRmlsZT4NCisJCQkJPEZpbGUNCiAJCQkJCVJlbGF0aXZl
UGF0aD0iLi5cYnJpZGdlXHdpblxGcmFtZVdpbi5jcHAiDQogCQkJCQk+DQogCQkJCTwvRmlsZT4N
CkluZGV4OiBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVDR1dpbi5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lQ0dXaW4uY3BwCShyZXZpc2lvbiAyOTgzNCkJKGZyb20g
V2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lV2luLmNwcDoyOTgzNCkKKysrIFdlYkNvcmUvYnJpZGdl
L3dpbi9GcmFtZUNHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE5NyBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBD
T01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENP
TVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJGcmFtZVdpbi5oIgor
CisjaW5jbHVkZSA8d2luc29jazIuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRl
ICJBZmZpbmVUcmFuc2Zvcm0uaCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJE
b2N1bWVudC5oIgorI2luY2x1ZGUgIkVkaXRvckNsaWVudC5oIgorI2luY2x1ZGUgIkZyYW1lTG9h
ZGVyLmgiCisjaW5jbHVkZSAiRnJhbWVMb2FkUmVxdWVzdC5oIgorI2luY2x1ZGUgIkZyYW1lUHJp
dmF0ZS5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhUTUxJRnJhbWVFbGVt
ZW50LmgiCisjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCisjaW5jbHVkZSAiSFRNTFRhYmxlQ2VsbEVs
ZW1lbnQuaCIKKyNpbmNsdWRlICJLZXlib2FyZEV2ZW50LmgiCisjaW5jbHVkZSAiTlBfanNvYmpl
Y3QuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNp
bmNsdWRlICJQbHVnaW4uaCIKKyNpbmNsdWRlICJQbHVnaW5EYXRhYmFzZVdpbi5oIgorI2luY2x1
ZGUgIlBsdWdpblZpZXdXaW4uaCIKKyNpbmNsdWRlICJSZWd1bGFyRXhwcmVzc2lvbi5oIgorI2lu
Y2x1ZGUgIlJlbmRlckZyYW1lLmgiCisjaW5jbHVkZSAiUmVuZGVyVGFibGVDZWxsLmgiCisjaW5j
bHVkZSAiUmVuZGVyVmlldy5oIgorI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlLmgiCisjaW5jbHVk
ZSAiVGV4dFJlc291cmNlRGVjb2Rlci5oIgorI2luY2x1ZGUgImtqc19wcm94eS5oIgorI2luY2x1
ZGUgImtqc193aW5kb3cuaCIKKyNpbmNsdWRlICJucHJ1bnRpbWVfaW1wbC5oIgorI2luY2x1ZGUg
InJ1bnRpbWVfcm9vdC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUg
IlNldHRpbmdzLmgiCisKKyNpZiBQTEFURk9STShDRykKKyNpbmNsdWRlIDxDb3JlR3JhcGhpY3Mv
Q29yZUdyYXBoaWNzLmg+CisjZW5kaWYKKwordXNpbmcgc3RkOjptaW47Cit1c2luZyBuYW1lc3Bh
Y2UgS0pTOjpCaW5kaW5nczsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit1c2luZyBuYW1lc3Bh
Y2UgSFRNTE5hbWVzOworCit2b2lkIEZyYW1lOjpjbGVhclBsYXRmb3JtU2NyaXB0T2JqZWN0cygp
Cit7Cit9CisKK0tKUzo6QmluZGluZ3M6Okluc3RhbmNlKiBGcmFtZTo6Y3JlYXRlU2NyaXB0SW5z
dGFuY2VGb3JXaWRnZXQoV2lkZ2V0KiB3aWRnZXQpCit7CisgICAgLy8gRklYTUU6IElkZWFsbHkg
d2UnZCBoYXZlIGFuIGlzUGx1Z2luVmlldygpIGhlcmUgYnV0IHdlIGNhbid0IGFkZCB0aGF0IHRv
IHRoZSBvcGVuIHNvdXJjZSB0cmVlIHJpZ2h0IG5vdy4KKyAgICBpZiAod2lkZ2V0LT5pc0ZyYW1l
VmlldygpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQbHVn
aW5WaWV3V2luKj4od2lkZ2V0KS0+YmluZGluZ0luc3RhbmNlKCk7Cit9CisKKwordm9pZCBjb21w
dXRlUGFnZVJlY3RzRm9yRnJhbWUoRnJhbWUqIGZyYW1lLCBjb25zdCBJbnRSZWN0JiBwcmludFJl
Y3QsIGZsb2F0IGhlYWRlckhlaWdodCwgZmxvYXQgZm9vdGVySGVpZ2h0LCBmbG9hdCB1c2VyU2Nh
bGVGYWN0b3IsVmVjdG9yPEludFJlY3Q+JiBwYWdlcywgaW50JiBvdXRQYWdlSGVpZ2h0KQorewor
ICAgIEFTU0VSVChmcmFtZSk7CisKKyAgICBwYWdlcy5jbGVhcigpOworICAgIG91dFBhZ2VIZWln
aHQgPSAwOworCisgICAgaWYgKCFmcmFtZS0+ZG9jdW1lbnQoKSB8fCAhZnJhbWUtPnZpZXcoKSB8
fCAhZnJhbWUtPmRvY3VtZW50KCktPnJlbmRlcmVyKCkpCisgICAgICAgIHJldHVybjsKKyAKKyAg
ICBSZW5kZXJWaWV3KiByb290ID0gc3RhdGljX2Nhc3Q8UmVuZGVyVmlldyAqPihmcmFtZS0+ZG9j
dW1lbnQoKS0+cmVuZGVyZXIoKSk7CisKKyAgICBpZiAoIXJvb3QpIHsKKyAgICAgICAgTE9HX0VS
Uk9SKCJkb2N1bWVudCB0byBiZSBwcmludGVkIGhhcyBubyByZW5kZXJlciIpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgaWYgKHVzZXJTY2FsZUZhY3RvciA8PSAwKSB7CisgICAgICAg
IExPR19FUlJPUigidXNlclNjYWxlRmFjdG9yIGhhcyBiYWQgdmFsdWUgJS4yZiIsIHVzZXJTY2Fs
ZUZhY3Rvcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgZmxvYXQgcmF0aW8g
PSAoZmxvYXQpcHJpbnRSZWN0LmhlaWdodCgpIC8gKGZsb2F0KXByaW50UmVjdC53aWR0aCgpOwor
IAorICAgIGZsb2F0IHBhZ2VXaWR0aCAgPSAoZmxvYXQpIHJvb3QtPmRvY1dpZHRoKCk7CisgICAg
ZmxvYXQgcGFnZUhlaWdodCA9IHBhZ2VXaWR0aCAqIHJhdGlvOworICAgIG91dFBhZ2VIZWlnaHQg
PSAoaW50KSBwYWdlSGVpZ2h0OyAgIC8vIHRoaXMgaXMgdGhlIGhlaWdodCBvZiB0aGUgcGFnZSBh
ZGp1c3RlZCBieSBtYXJnaW5zCisgICAgcGFnZUhlaWdodCAtPSAoaGVhZGVySGVpZ2h0ICsgZm9v
dGVySGVpZ2h0KTsKKworICAgIGlmIChwYWdlSGVpZ2h0IDw9IDApIHsKKyAgICAgICAgTE9HX0VS
Uk9SKCJwYWdlSGVpZ2h0IGhhcyBiYWQgdmFsdWUgJS4yZiIsIHBhZ2VIZWlnaHQpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgZmxvYXQgY3VyclBhZ2VIZWlnaHQgPSBwYWdlSGVpZ2h0
IC8gdXNlclNjYWxlRmFjdG9yOworICAgIGZsb2F0IGRvY0hlaWdodCAgICAgID0gcm9vdC0+bGF5
ZXIoKS0+aGVpZ2h0KCk7CisgICAgZmxvYXQgZG9jV2lkdGggICAgICAgPSByb290LT5sYXllcigp
LT53aWR0aCgpOworICAgIGZsb2F0IGN1cnJQYWdlV2lkdGggID0gcGFnZVdpZHRoIC8gdXNlclNj
YWxlRmFjdG9yOworCisgICAgCisgICAgLy8gYWx3YXlzIHJldHVybiBhdCBsZWFzdCBvbmUgcGFn
ZSwgc2luY2UgZW1wdHkgZmlsZXMgc2hvdWxkIHByaW50IGEgYmxhbmsgcGFnZQorICAgIGZsb2F0
IHByaW50ZWRQYWdlc0hlaWdodCA9IDAuMDsKKyAgICBkbyB7CisgICAgICAgIGZsb2F0IHByb3Bv
c2VkQm90dG9tID0gbWluKGRvY0hlaWdodCwgcHJpbnRlZFBhZ2VzSGVpZ2h0ICsgcGFnZUhlaWdo
dCk7CisgICAgICAgIGZyYW1lLT5hZGp1c3RQYWdlSGVpZ2h0KCZwcm9wb3NlZEJvdHRvbSwgcHJp
bnRlZFBhZ2VzSGVpZ2h0LCBwcm9wb3NlZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0KTsKKyAg
ICAgICAgY3VyclBhZ2VIZWlnaHQgPSBtYXgoMS4wZiwgcHJvcG9zZWRCb3R0b20gLSBwcmludGVk
UGFnZXNIZWlnaHQpOworICAgICAgIAorICAgICAgICBwYWdlcy5hcHBlbmQoSW50UmVjdCgwLHBy
aW50ZWRQYWdlc0hlaWdodCxjdXJyUGFnZVdpZHRoLGN1cnJQYWdlSGVpZ2h0KSk7CisgICAgICAg
IHByaW50ZWRQYWdlc0hlaWdodCArPSBjdXJyUGFnZUhlaWdodDsKKyAgICB9IHdoaWxlIChwcmlu
dGVkUGFnZXNIZWlnaHQgPCBkb2NIZWlnaHQpOworfQorCitzdGF0aWMgdm9pZCBkcmF3UmVjdElu
dG9Db250ZXh0KEludFJlY3QgcmVjdCwgRnJhbWVWaWV3KiB2aWV3LCBHcmFwaGljc0NvbnRleHQq
IGdjKQoreworICAgIEludFNpemUgb2Zmc2V0ID0gdmlldy0+c2Nyb2xsT2Zmc2V0KCk7CisgICAg
cmVjdC5tb3ZlKC1vZmZzZXQud2lkdGgoKSwgLW9mZnNldC5oZWlnaHQoKSk7CisgICAgcmVjdCA9
IHZpZXctPmNvbnZlcnRUb0NvbnRhaW5pbmdXaW5kb3cocmVjdCk7CisKKyAgICBnYy0+Y29uY2F0
Q1RNKEFmZmluZVRyYW5zZm9ybSgpLnRyYW5zbGF0ZSgtcmVjdC54KCksIC1yZWN0LnkoKSkpOwor
CisgICAgdmlldy0+cGFpbnQoZ2MsIHJlY3QpOworfQorCitIQklUTUFQIGltYWdlRnJvbVNlbGVj
dGlvbihGcmFtZSogZnJhbWUsIGJvb2wgZm9yY2VCbGFja1RleHQpCit7CisgICAgZnJhbWUtPnNl
dFBhaW50UmVzdHJpY3Rpb24oZm9yY2VCbGFja1RleHQgPyBQYWludFJlc3RyaWN0aW9uU2VsZWN0
aW9uT25seUJsYWNrVGV4dCA6IFBhaW50UmVzdHJpY3Rpb25TZWxlY3Rpb25Pbmx5KTsKKyAgICBG
bG9hdFJlY3QgZnIgPSBmcmFtZS0+c2VsZWN0aW9uUmVjdCgpOworICAgIEludFJlY3QgaXIoKGlu
dClmci54KCksIChpbnQpZnIueSgpLChpbnQpZnIud2lkdGgoKSwoaW50KWZyLmhlaWdodCgpKTsK
KworICAgIHZvaWQqIGJpdHM7CisgICAgSERDIGhkYyA9IENyZWF0ZUNvbXBhdGlibGVEQygwKTsK
KyAgICBpbnQgdyA9IGlyLndpZHRoKCk7CisgICAgaW50IGggPSBpci5oZWlnaHQoKTsKKyAgICBC
SVRNQVBJTkZPIGJtcCA9IHsgeyBzaXplb2YoQklUTUFQSU5GT0hFQURFUiksIHcsIGgsIDEsIDMy
IH0gfTsKKworICAgIEhCSVRNQVAgaGJtcCA9IENyZWF0ZURJQlNlY3Rpb24oMCwgJmJtcCwgRElC
X1JHQl9DT0xPUlMsICh2b2lkKiopJmJpdHMsIDAsIDApOworICAgIEhCSVRNQVAgaGJtcE9sZCA9
IChIQklUTUFQKVNlbGVjdE9iamVjdChoZGMsIGhibXApOworICAgIENHQ29sb3JTcGFjZVJlZiBk
ZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKKyAgICBDR0NvbnRleHRS
ZWYgY29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZSgodm9pZCopYml0cywgdywgaCwKKyAg
ICAgICAgOCwgdyAqIHNpemVvZihSR0JRVUFEKSwgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3Jk
ZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFQcmVtdWx0aXBsaWVkRmlyc3QpOworICAgIENHQ29s
b3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKKyAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNvbnRl
eHQpOworCisgICAgR3JhcGhpY3NDb250ZXh0IGdjKGNvbnRleHQpOworCisgICAgZnJhbWUtPmRv
Y3VtZW50KCktPnVwZGF0ZUxheW91dCgpOworICAgIGRyYXdSZWN0SW50b0NvbnRleHQoaXIsIGZy
YW1lLT52aWV3KCksICZnYyk7CisKKyAgICBDR0NvbnRleHRSZWxlYXNlKGNvbnRleHQpOworICAg
IFNlbGVjdE9iamVjdChoZGMsIGhibXBPbGQpOworICAgIERlbGV0ZURDKGhkYyk7CisKKyAgICBm
cmFtZS0+c2V0UGFpbnRSZXN0cmljdGlvbihQYWludFJlc3RyaWN0aW9uTm9uZSk7CisKKyAgICBy
ZXR1cm4gaGJtcDsKK30KKworRHJhZ0ltYWdlUmVmIEZyYW1lOjpkcmFnSW1hZ2VGb3JTZWxlY3Rp
b24oKQoreyAgICAKKyAgICBpZiAoc2VsZWN0aW9uQ29udHJvbGxlcigpLT5pc1JhbmdlKCkpCisg
ICAgICAgIHJldHVybiBpbWFnZUZyb21TZWxlY3Rpb24odGhpcywgZmFsc2UpOworCisgICAgcmV0
dXJuIDA7Cit9CisKK3ZvaWQgRnJhbWU6OmRhc2hib2FyZFJlZ2lvbnNDaGFuZ2VkKCkKK3sKK30K
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1l
Q0dXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZUNHV2luLmNw
cAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVDR1dpbi5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2
LCAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykg
MjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI2LDExNyArMjYsMTggQEAKICNpbmNsdWRlICJj
b25maWcuaCIKICNpbmNsdWRlICJGcmFtZVdpbi5oIgogCi0jaW5jbHVkZSA8d2luc29jazIuaD4K
ICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAKLSNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKLSNp
bmNsdWRlICJGbG9hdFJlY3QuaCIKLSNpbmNsdWRlICJEb2N1bWVudC5oIgotI2luY2x1ZGUgIkVk
aXRvckNsaWVudC5oIgotI2luY2x1ZGUgIkZyYW1lTG9hZGVyLmgiCi0jaW5jbHVkZSAiRnJhbWVM
b2FkUmVxdWVzdC5oIgotI2luY2x1ZGUgIkZyYW1lUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkZyYW1l
Vmlldy5oIgotI2luY2x1ZGUgIkhUTUxJRnJhbWVFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTE5h
bWVzLmgiCi0jaW5jbHVkZSAiSFRNTFRhYmxlQ2VsbEVsZW1lbnQuaCIKLSNpbmNsdWRlICJLZXli
b2FyZEV2ZW50LmgiCi0jaW5jbHVkZSAiTlBfanNvYmplY3QuaCIKLSNpbmNsdWRlICJOb3RJbXBs
ZW1lbnRlZC5oIgotI2luY2x1ZGUgIlBhZ2UuaCIKLSNpbmNsdWRlICJQbHVnaW4uaCIKLSNpbmNs
dWRlICJQbHVnaW5EYXRhYmFzZVdpbi5oIgotI2luY2x1ZGUgIlBsdWdpblZpZXdXaW4uaCIKLSNp
bmNsdWRlICJSZWd1bGFyRXhwcmVzc2lvbi5oIgotI2luY2x1ZGUgIlJlbmRlckZyYW1lLmgiCi0j
aW5jbHVkZSAiUmVuZGVyVGFibGVDZWxsLmgiCi0jaW5jbHVkZSAiUmVuZGVyVmlldy5oIgotI2lu
Y2x1ZGUgIlJlc291cmNlSGFuZGxlLmgiCi0jaW5jbHVkZSAiVGV4dFJlc291cmNlRGVjb2Rlci5o
IgotI2luY2x1ZGUgImtqc19wcm94eS5oIgotI2luY2x1ZGUgImtqc193aW5kb3cuaCIKLSNpbmNs
dWRlICJucHJ1bnRpbWVfaW1wbC5oIgotI2luY2x1ZGUgInJ1bnRpbWVfcm9vdC5oIgogI2luY2x1
ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2luY2x1ZGUgIlNldHRpbmdzLmgiCiAKLSNpZiBQTEFU
Rk9STShDRykKICNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ29yZUdyYXBoaWNzLmg+Ci0jZW5kaWYK
IAogdXNpbmcgc3RkOjptaW47Ci11c2luZyBuYW1lc3BhY2UgS0pTOjpCaW5kaW5nczsKIAogbmFt
ZXNwYWNlIFdlYkNvcmUgewogCi11c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwotCi12b2lkIEZy
YW1lOjpjbGVhclBsYXRmb3JtU2NyaXB0T2JqZWN0cygpCi17Ci19Ci0KLUtKUzo6QmluZGluZ3M6
Okluc3RhbmNlKiBGcmFtZTo6Y3JlYXRlU2NyaXB0SW5zdGFuY2VGb3JXaWRnZXQoV2lkZ2V0KiB3
aWRnZXQpCi17Ci0gICAgLy8gRklYTUU6IElkZWFsbHkgd2UnZCBoYXZlIGFuIGlzUGx1Z2luVmll
dygpIGhlcmUgYnV0IHdlIGNhbid0IGFkZCB0aGF0IHRvIHRoZSBvcGVuIHNvdXJjZSB0cmVlIHJp
Z2h0IG5vdy4KLSAgICBpZiAod2lkZ2V0LT5pc0ZyYW1lVmlldygpKQotICAgICAgICByZXR1cm4g
MDsKLQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQbHVnaW5WaWV3V2luKj4od2lkZ2V0KS0+Ymlu
ZGluZ0luc3RhbmNlKCk7Ci19Ci0KLQotdm9pZCBjb21wdXRlUGFnZVJlY3RzRm9yRnJhbWUoRnJh
bWUqIGZyYW1lLCBjb25zdCBJbnRSZWN0JiBwcmludFJlY3QsIGZsb2F0IGhlYWRlckhlaWdodCwg
ZmxvYXQgZm9vdGVySGVpZ2h0LCBmbG9hdCB1c2VyU2NhbGVGYWN0b3IsVmVjdG9yPEludFJlY3Q+
JiBwYWdlcywgaW50JiBvdXRQYWdlSGVpZ2h0KQotewotICAgIEFTU0VSVChmcmFtZSk7Ci0KLSAg
ICBwYWdlcy5jbGVhcigpOwotICAgIG91dFBhZ2VIZWlnaHQgPSAwOwotCi0gICAgaWYgKCFmcmFt
ZS0+ZG9jdW1lbnQoKSB8fCAhZnJhbWUtPnZpZXcoKSB8fCAhZnJhbWUtPmRvY3VtZW50KCktPnJl
bmRlcmVyKCkpCi0gICAgICAgIHJldHVybjsKLSAKLSAgICBSZW5kZXJWaWV3KiByb290ID0gc3Rh
dGljX2Nhc3Q8UmVuZGVyVmlldyAqPihmcmFtZS0+ZG9jdW1lbnQoKS0+cmVuZGVyZXIoKSk7Ci0K
LSAgICBpZiAoIXJvb3QpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJkb2N1bWVudCB0byBiZSBwcmlu
dGVkIGhhcyBubyByZW5kZXJlciIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYg
KHVzZXJTY2FsZUZhY3RvciA8PSAwKSB7Ci0gICAgICAgIExPR19FUlJPUigidXNlclNjYWxlRmFj
dG9yIGhhcyBiYWQgdmFsdWUgJS4yZiIsIHVzZXJTY2FsZUZhY3Rvcik7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0gICAgCi0gICAgZmxvYXQgcmF0aW8gPSAoZmxvYXQpcHJpbnRSZWN0LmhlaWdo
dCgpIC8gKGZsb2F0KXByaW50UmVjdC53aWR0aCgpOwotIAotICAgIGZsb2F0IHBhZ2VXaWR0aCAg
PSAoZmxvYXQpIHJvb3QtPmRvY1dpZHRoKCk7Ci0gICAgZmxvYXQgcGFnZUhlaWdodCA9IHBhZ2VX
aWR0aCAqIHJhdGlvOwotICAgIG91dFBhZ2VIZWlnaHQgPSAoaW50KSBwYWdlSGVpZ2h0OyAgIC8v
IHRoaXMgaXMgdGhlIGhlaWdodCBvZiB0aGUgcGFnZSBhZGp1c3RlZCBieSBtYXJnaW5zCi0gICAg
cGFnZUhlaWdodCAtPSAoaGVhZGVySGVpZ2h0ICsgZm9vdGVySGVpZ2h0KTsKLQotICAgIGlmIChw
YWdlSGVpZ2h0IDw9IDApIHsKLSAgICAgICAgTE9HX0VSUk9SKCJwYWdlSGVpZ2h0IGhhcyBiYWQg
dmFsdWUgJS4yZiIsIHBhZ2VIZWlnaHQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAg
ZmxvYXQgY3VyclBhZ2VIZWlnaHQgPSBwYWdlSGVpZ2h0IC8gdXNlclNjYWxlRmFjdG9yOwotICAg
IGZsb2F0IGRvY0hlaWdodCAgICAgID0gcm9vdC0+bGF5ZXIoKS0+aGVpZ2h0KCk7Ci0gICAgZmxv
YXQgZG9jV2lkdGggICAgICAgPSByb290LT5sYXllcigpLT53aWR0aCgpOwotICAgIGZsb2F0IGN1
cnJQYWdlV2lkdGggID0gcGFnZVdpZHRoIC8gdXNlclNjYWxlRmFjdG9yOwotCi0gICAgCi0gICAg
Ly8gYWx3YXlzIHJldHVybiBhdCBsZWFzdCBvbmUgcGFnZSwgc2luY2UgZW1wdHkgZmlsZXMgc2hv
dWxkIHByaW50IGEgYmxhbmsgcGFnZQotICAgIGZsb2F0IHByaW50ZWRQYWdlc0hlaWdodCA9IDAu
MDsKLSAgICBkbyB7Ci0gICAgICAgIGZsb2F0IHByb3Bvc2VkQm90dG9tID0gbWluKGRvY0hlaWdo
dCwgcHJpbnRlZFBhZ2VzSGVpZ2h0ICsgcGFnZUhlaWdodCk7Ci0gICAgICAgIGZyYW1lLT5hZGp1
c3RQYWdlSGVpZ2h0KCZwcm9wb3NlZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0LCBwcm9wb3Nl
ZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0KTsKLSAgICAgICAgY3VyclBhZ2VIZWlnaHQgPSBt
YXgoMS4wZiwgcHJvcG9zZWRCb3R0b20gLSBwcmludGVkUGFnZXNIZWlnaHQpOwotICAgICAgIAot
ICAgICAgICBwYWdlcy5hcHBlbmQoSW50UmVjdCgwLHByaW50ZWRQYWdlc0hlaWdodCxjdXJyUGFn
ZVdpZHRoLGN1cnJQYWdlSGVpZ2h0KSk7Ci0gICAgICAgIHByaW50ZWRQYWdlc0hlaWdodCArPSBj
dXJyUGFnZUhlaWdodDsKLSAgICB9IHdoaWxlIChwcmludGVkUGFnZXNIZWlnaHQgPCBkb2NIZWln
aHQpOwotfQotCiBzdGF0aWMgdm9pZCBkcmF3UmVjdEludG9Db250ZXh0KEludFJlY3QgcmVjdCwg
RnJhbWVWaWV3KiB2aWV3LCBHcmFwaGljc0NvbnRleHQqIGdjKQogewogICAgIEludFNpemUgb2Zm
c2V0ID0gdmlldy0+c2Nyb2xsT2Zmc2V0KCk7CkBAIC0xNTIsNyArNTMsOCBAQCBIQklUTUFQIGlt
YWdlRnJvbVNlbGVjdGlvbihGcmFtZSogZnJhbWUsCiB7CiAgICAgZnJhbWUtPnNldFBhaW50UmVz
dHJpY3Rpb24oZm9yY2VCbGFja1RleHQgPyBQYWludFJlc3RyaWN0aW9uU2VsZWN0aW9uT25seUJs
YWNrVGV4dCA6IFBhaW50UmVzdHJpY3Rpb25TZWxlY3Rpb25Pbmx5KTsKICAgICBGbG9hdFJlY3Qg
ZnIgPSBmcmFtZS0+c2VsZWN0aW9uUmVjdCgpOwotICAgIEludFJlY3QgaXIoKGludClmci54KCks
IChpbnQpZnIueSgpLChpbnQpZnIud2lkdGgoKSwoaW50KWZyLmhlaWdodCgpKTsKKyAgICBJbnRS
ZWN0IGlyKHN0YXRpY19jYXN0PGludD4oZnIueCgpKSwgc3RhdGljX2Nhc3Q8aW50Pihmci55KCkp
LAorICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pihmci53aWR0aCgpKSwgc3RhdGljX2Nh
c3Q8aW50Pihmci5oZWlnaHQoKSkpOwogCiAgICAgdm9pZCogYml0czsKICAgICBIREMgaGRjID0g
Q3JlYXRlQ29tcGF0aWJsZURDKDApOwpAQCAtMTYwLDEwICs2MiwxMCBAQCBIQklUTUFQIGltYWdl
RnJvbVNlbGVjdGlvbihGcmFtZSogZnJhbWUsCiAgICAgaW50IGggPSBpci5oZWlnaHQoKTsKICAg
ICBCSVRNQVBJTkZPIGJtcCA9IHsgeyBzaXplb2YoQklUTUFQSU5GT0hFQURFUiksIHcsIGgsIDEs
IDMyIH0gfTsKIAotICAgIEhCSVRNQVAgaGJtcCA9IENyZWF0ZURJQlNlY3Rpb24oMCwgJmJtcCwg
RElCX1JHQl9DT0xPUlMsICh2b2lkKiopJmJpdHMsIDAsIDApOwotICAgIEhCSVRNQVAgaGJtcE9s
ZCA9IChIQklUTUFQKVNlbGVjdE9iamVjdChoZGMsIGhibXApOworICAgIEhCSVRNQVAgaGJtcCA9
IENyZWF0ZURJQlNlY3Rpb24oMCwgJmJtcCwgRElCX1JHQl9DT0xPUlMsIHN0YXRpY19jYXN0PHZv
aWQqKj4oJmJpdHMpLCAwLCAwKTsKKyAgICBIQklUTUFQIGhibXBPbGQgPSBzdGF0aWNfY2FzdDxI
QklUTUFQPihTZWxlY3RPYmplY3QoaGRjLCBoYm1wKSk7CiAgICAgQ0dDb2xvclNwYWNlUmVmIGRl
dmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwotICAgIENHQ29udGV4dFJl
ZiBjb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKCh2b2lkKiliaXRzLCB3LCBoLAorICAg
IENHQ29udGV4dFJlZiBjb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKHN0YXRpY19jYXN0
PHZvaWQqPihiaXRzKSwgdywgaCwKICAgICAgICAgOCwgdyAqIHNpemVvZihSR0JRVUFEKSwgZGV2
aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFQcmVtdWx0
aXBsaWVkRmlyc3QpOwogICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKICAgICBD
R0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQpOwpAQCAtMTgyLDE2ICs4NCw0IEBAIEhCSVRNQVAg
aW1hZ2VGcm9tU2VsZWN0aW9uKEZyYW1lKiBmcmFtZSwKICAgICByZXR1cm4gaGJtcDsKIH0KIAot
RHJhZ0ltYWdlUmVmIEZyYW1lOjpkcmFnSW1hZ2VGb3JTZWxlY3Rpb24oKQoteyAgICAKLSAgICBp
ZiAoc2VsZWN0aW9uQ29udHJvbGxlcigpLT5pc1JhbmdlKCkpCi0gICAgICAgIHJldHVybiBpbWFn
ZUZyb21TZWxlY3Rpb24odGhpcywgZmFsc2UpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQg
RnJhbWU6OmRhc2hib2FyZFJlZ2lvbnNDaGFuZ2VkKCkKLXsKLX0KLQogfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQpJbmRleDogV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lQ2Fpcm9XaW4uY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZUNhaXJvV2luLmNwcAkocmV2aXNpb24g
MCkKKysrIFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZUNhaXJvV2luLmNwcAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJGcmFtZVdpbi5oIgorCisjaW5jbHVkZSAiRWRpdG9yQ2xpZW50LmgiCisjaW5jbHVkZSAiTm90
SW1wbGVtZW50ZWQuaCIKKwordXNpbmcgc3RkOjptaW47CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworSEJJVE1BUCBpbWFnZUZyb21TZWxlY3Rpb24oRnJhbWUqIGZyYW1lLCBib29sIGZvcmNlQmxh
Y2tUZXh0KQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZVdpbi5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lV2luLmNwcAkocmV2aXNp
b24gMjk4MzQpCisrKyBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVXaW4uY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcs
IDIwMDggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAog
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCkBAIC02MCwxMCArNjAsNiBAQAogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4
dC5oIgogI2luY2x1ZGUgIlNldHRpbmdzLmgiCiAKLSNpZiBQTEFURk9STShDRykKLSNpbmNsdWRl
IDxDb3JlR3JhcGhpY3MvQ29yZUdyYXBoaWNzLmg+Ci0jZW5kaWYKLQogdXNpbmcgc3RkOjptaW47
CiB1c2luZyBuYW1lc3BhY2UgS0pTOjpCaW5kaW5nczsKIApAQCAtODQsNyArODAsNiBAQCBLSlM6
OkJpbmRpbmdzOjpJbnN0YW5jZSogRnJhbWU6OmNyZWF0ZVNjCiAgICAgcmV0dXJuIHN0YXRpY19j
YXN0PFBsdWdpblZpZXdXaW4qPih3aWRnZXQpLT5iaW5kaW5nSW5zdGFuY2UoKTsKIH0KIAotCiB2
b2lkIGNvbXB1dGVQYWdlUmVjdHNGb3JGcmFtZShGcmFtZSogZnJhbWUsIGNvbnN0IEludFJlY3Qm
IHByaW50UmVjdCwgZmxvYXQgaGVhZGVySGVpZ2h0LCBmbG9hdCBmb290ZXJIZWlnaHQsIGZsb2F0
IHVzZXJTY2FsZUZhY3RvcixWZWN0b3I8SW50UmVjdD4mIHBhZ2VzLCBpbnQmIG91dFBhZ2VIZWln
aHQpCiB7CiAgICAgQVNTRVJUKGZyYW1lKTsKQEAgLTEwNywxMSArMTAyLDExIEBAIHZvaWQgY29t
cHV0ZVBhZ2VSZWN0c0ZvckZyYW1lKEZyYW1lKiBmcmEKICAgICAgICAgcmV0dXJuOwogICAgIH0K
ICAgICAKLSAgICBmbG9hdCByYXRpbyA9IChmbG9hdClwcmludFJlY3QuaGVpZ2h0KCkgLyAoZmxv
YXQpcHJpbnRSZWN0LndpZHRoKCk7CisgICAgZmxvYXQgcmF0aW8gPSBzdGF0aWNfY2FzdDxmbG9h
dD4ocHJpbnRSZWN0LmhlaWdodCgpKSAvIHN0YXRpY19jYXN0PGZsb2F0PihwcmludFJlY3Qud2lk
dGgoKSk7CiAgCi0gICAgZmxvYXQgcGFnZVdpZHRoICA9IChmbG9hdCkgcm9vdC0+ZG9jV2lkdGgo
KTsKKyAgICBmbG9hdCBwYWdlV2lkdGggID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHJvb3QtPmRvY1dp
ZHRoKCkpOwogICAgIGZsb2F0IHBhZ2VIZWlnaHQgPSBwYWdlV2lkdGggKiByYXRpbzsKLSAgICBv
dXRQYWdlSGVpZ2h0ID0gKGludCkgcGFnZUhlaWdodDsgICAvLyB0aGlzIGlzIHRoZSBoZWlnaHQg
b2YgdGhlIHBhZ2UgYWRqdXN0ZWQgYnkgbWFyZ2lucworICAgIG91dFBhZ2VIZWlnaHQgPSBzdGF0
aWNfY2FzdDxpbnQ+KHBhZ2VIZWlnaHQpOyAgIC8vIHRoaXMgaXMgdGhlIGhlaWdodCBvZiB0aGUg
cGFnZSBhZGp1c3RlZCBieSBtYXJnaW5zCiAgICAgcGFnZUhlaWdodCAtPSAoaGVhZGVySGVpZ2h0
ICsgZm9vdGVySGVpZ2h0KTsKIAogICAgIGlmIChwYWdlSGVpZ2h0IDw9IDApIHsKQEAgLTEyNiw2
MiArMTIxLDE3IEBAIHZvaWQgY29tcHV0ZVBhZ2VSZWN0c0ZvckZyYW1lKEZyYW1lKiBmcmEKIAog
ICAgIAogICAgIC8vIGFsd2F5cyByZXR1cm4gYXQgbGVhc3Qgb25lIHBhZ2UsIHNpbmNlIGVtcHR5
IGZpbGVzIHNob3VsZCBwcmludCBhIGJsYW5rIHBhZ2UKLSAgICBmbG9hdCBwcmludGVkUGFnZXNI
ZWlnaHQgPSAwLjA7CisgICAgZmxvYXQgcHJpbnRlZFBhZ2VzSGVpZ2h0ID0gMC4wZjsKICAgICBk
byB7CiAgICAgICAgIGZsb2F0IHByb3Bvc2VkQm90dG9tID0gbWluKGRvY0hlaWdodCwgcHJpbnRl
ZFBhZ2VzSGVpZ2h0ICsgcGFnZUhlaWdodCk7CiAgICAgICAgIGZyYW1lLT5hZGp1c3RQYWdlSGVp
Z2h0KCZwcm9wb3NlZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0LCBwcm9wb3NlZEJvdHRvbSwg
cHJpbnRlZFBhZ2VzSGVpZ2h0KTsKICAgICAgICAgY3VyclBhZ2VIZWlnaHQgPSBtYXgoMS4wZiwg
cHJvcG9zZWRCb3R0b20gLSBwcmludGVkUGFnZXNIZWlnaHQpOwogICAgICAgIAotICAgICAgICBw
YWdlcy5hcHBlbmQoSW50UmVjdCgwLHByaW50ZWRQYWdlc0hlaWdodCxjdXJyUGFnZVdpZHRoLGN1
cnJQYWdlSGVpZ2h0KSk7CisgICAgICAgIHBhZ2VzLmFwcGVuZChJbnRSZWN0KDAsIHByaW50ZWRQ
YWdlc0hlaWdodCwgY3VyclBhZ2VXaWR0aCwgY3VyclBhZ2VIZWlnaHQpKTsKICAgICAgICAgcHJp
bnRlZFBhZ2VzSGVpZ2h0ICs9IGN1cnJQYWdlSGVpZ2h0OwogICAgIH0gd2hpbGUgKHByaW50ZWRQ
YWdlc0hlaWdodCA8IGRvY0hlaWdodCk7CiB9CiAKLXN0YXRpYyB2b2lkIGRyYXdSZWN0SW50b0Nv
bnRleHQoSW50UmVjdCByZWN0LCBGcmFtZVZpZXcqIHZpZXcsIEdyYXBoaWNzQ29udGV4dCogZ2Mp
Ci17Ci0gICAgSW50U2l6ZSBvZmZzZXQgPSB2aWV3LT5zY3JvbGxPZmZzZXQoKTsKLSAgICByZWN0
Lm1vdmUoLW9mZnNldC53aWR0aCgpLCAtb2Zmc2V0LmhlaWdodCgpKTsKLSAgICByZWN0ID0gdmll
dy0+Y29udmVydFRvQ29udGFpbmluZ1dpbmRvdyhyZWN0KTsKLQotICAgIGdjLT5jb25jYXRDVE0o
QWZmaW5lVHJhbnNmb3JtKCkudHJhbnNsYXRlKC1yZWN0LngoKSwgLXJlY3QueSgpKSk7Ci0KLSAg
ICB2aWV3LT5wYWludChnYywgcmVjdCk7Ci19Ci0KLUhCSVRNQVAgaW1hZ2VGcm9tU2VsZWN0aW9u
KEZyYW1lKiBmcmFtZSwgYm9vbCBmb3JjZUJsYWNrVGV4dCkKLXsKLSAgICBmcmFtZS0+c2V0UGFp
bnRSZXN0cmljdGlvbihmb3JjZUJsYWNrVGV4dCA/IFBhaW50UmVzdHJpY3Rpb25TZWxlY3Rpb25P
bmx5QmxhY2tUZXh0IDogUGFpbnRSZXN0cmljdGlvblNlbGVjdGlvbk9ubHkpOwotICAgIEZsb2F0
UmVjdCBmciA9IGZyYW1lLT5zZWxlY3Rpb25SZWN0KCk7Ci0gICAgSW50UmVjdCBpcigoaW50KWZy
LngoKSwgKGludClmci55KCksKGludClmci53aWR0aCgpLChpbnQpZnIuaGVpZ2h0KCkpOwotCi0g
ICAgdm9pZCogYml0czsKLSAgICBIREMgaGRjID0gQ3JlYXRlQ29tcGF0aWJsZURDKDApOwotICAg
IGludCB3ID0gaXIud2lkdGgoKTsKLSAgICBpbnQgaCA9IGlyLmhlaWdodCgpOwotICAgIEJJVE1B
UElORk8gYm1wID0geyB7IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSwgdywgaCwgMSwgMzIgfSB9
OwotCi0gICAgSEJJVE1BUCBoYm1wID0gQ3JlYXRlRElCU2VjdGlvbigwLCAmYm1wLCBESUJfUkdC
X0NPTE9SUywgKHZvaWQqKikmYml0cywgMCwgMCk7Ci0gICAgSEJJVE1BUCBoYm1wT2xkID0gKEhC
SVRNQVApU2VsZWN0T2JqZWN0KGhkYywgaGJtcCk7Ci0gICAgQ0dDb2xvclNwYWNlUmVmIGRldmlj
ZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwotICAgIENHQ29udGV4dFJlZiBj
b250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKCh2b2lkKiliaXRzLCB3LCBoLAotICAgICAg
ICA4LCB3ICogc2l6ZW9mKFJHQlFVQUQpLCBkZXZpY2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMy
TGl0dGxlIHwga0NHSW1hZ2VBbHBoYVByZW11bHRpcGxpZWRGaXJzdCk7Ci0gICAgQ0dDb2xvclNw
YWNlUmVsZWFzZShkZXZpY2VSR0IpOwotICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7
Ci0KLSAgICBHcmFwaGljc0NvbnRleHQgZ2MoY29udGV4dCk7Ci0KLSAgICBmcmFtZS0+ZG9jdW1l
bnQoKS0+dXBkYXRlTGF5b3V0KCk7Ci0gICAgZHJhd1JlY3RJbnRvQ29udGV4dChpciwgZnJhbWUt
PnZpZXcoKSwgJmdjKTsKLQotICAgIENHQ29udGV4dFJlbGVhc2UoY29udGV4dCk7Ci0gICAgU2Vs
ZWN0T2JqZWN0KGhkYywgaGJtcE9sZCk7Ci0gICAgRGVsZXRlREMoaGRjKTsKLQotICAgIGZyYW1l
LT5zZXRQYWludFJlc3RyaWN0aW9uKFBhaW50UmVzdHJpY3Rpb25Ob25lKTsKLQotICAgIHJldHVy
biBoYm1wOwotfQotCiBEcmFnSW1hZ2VSZWYgRnJhbWU6OmRyYWdJbWFnZUZvclNlbGVjdGlvbigp
CiB7ICAgIAogICAgIGlmIChzZWxlY3Rpb25Db250cm9sbGVyKCktPmlzUmFuZ2UoKSkKSW5kZXg6
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmgJKHJldmlzaW9uIDI5
NzI2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xMDMsNiArMTAzLDcgQEAgcHVibGljOgogICAgIFNDUklQVF9DQUNIRSog
c2NyaXB0Q2FjaGUoKSBjb25zdCB7IHJldHVybiAmbV9zY3JpcHRDYWNoZTsgfQogCiAgICAgc3Rh
dGljIHZvaWQgc2V0U2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrKGJvb2wpOworICAgIHN0YXRpYyBi
b29sIHNob3VsZEFwcGx5TWFjQXNjZW50SGFjaygpOwogI2VuZGlmCiAKICNpZiBQTEFURk9STShH
VEspCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4
dENhaXJvLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJv
L0dyYXBoaWNzQ29udGV4dENhaXJvLmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4dENhaXJvLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNDEsMTUgKzQxLDEzIEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDx3
dGYvTWF0aEV4dHJhcy5oPgogCi0jaWYgUExBVEZPUk0oV0lOKQotI2luY2x1ZGUgPGNhaXJvLXdp
bjMyLmg+Ci0jZW5kaWYKLQogI2lmIFBMQVRGT1JNKEdUSykKICNpbmNsdWRlIDxnZGsvZ2RrLmg+
CiAjaW5jbHVkZSA8cGFuZ28vcGFuZ28uaD4KKyNlbGlmIFBMQVRGT1JNKFdJTikKKyNpbmNsdWRl
IDxjYWlyby13aW4zMi5oPgogI2VuZGlmCi0KKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGUuaCIKIAogI2lmbmRlZiBNX1BJCiAjZGVmaW5lIE1fUEkgMy4xNDE1OTI2NTM1
ODk3OTMyMzg0NgpAQCAtNTcsMTkgKzU1LDYgQEAKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1j
bGFzcyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUgewotcHVibGljOgotICAgIEdyYXBo
aWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpOwotICAgIH5HcmFwaGljc0NvbnRleHRQbGF0Zm9y
bVByaXZhdGUoKTsKLQotICAgIGNhaXJvX3QqIGNyOwotICAgIFZlY3RvcjxmbG9hdD4gbGF5ZXJz
OwotCi0jaWYgUExBVEZPUk0oR1RLKQotICAgIEdka0V2ZW50RXhwb3NlKiBleHBvc2U7Ci0jZW5k
aWYKLX07Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRDb2xvcihjYWlyb190KiBjciwgY29uc3Qg
Q29sb3ImIGNvbCkKIHsKICAgICBmbG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKQEAgLTg2
LDM0ICs3MSw2IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBmaWxsUmVjdFNvdXJjZU92ZXIoY2EKICAg
ICBjYWlyb19maWxsKGNyKTsKIH0KIAotR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpH
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKQotICAgIDogIGNyKDApCi0jaWYgUExBVEZP
Uk0oR1RLKQotICAgICwgZXhwb3NlKDApCi0jZW5kaWYKLXsKLX0KLQotR3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlOjp+R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKCkKLXsKLSAg
ICBjYWlyb19kZXN0cm95KGNyKTsKLX0KLQotI2lmIFBMQVRGT1JNKFdJTikKLUdyYXBoaWNzQ29u
dGV4dDo6R3JhcGhpY3NDb250ZXh0KEhEQyBkYykKLSAgICA6IG1fY29tbW9uKGNyZWF0ZUdyYXBo
aWNzQ29udGV4dFByaXZhdGUoKSkKLSAgICAsIG1fZGF0YShuZXcgR3JhcGhpY3NDb250ZXh0UGxh
dGZvcm1Qcml2YXRlKQotewotICAgIGlmIChkYykgewotICAgICAgICBjYWlyb19zdXJmYWNlX3Qq
IHN1cmZhY2UgPSBjYWlyb193aW4zMl9zdXJmYWNlX2NyZWF0ZShkYyk7Ci0gICAgICAgIG1fZGF0
YS0+Y3IgPSBjYWlyb19jcmVhdGUoc3VyZmFjZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2V0
UGFpbnRpbmdEaXNhYmxlZCh0cnVlKTsKLSAgICAgICAgbV9kYXRhLT5jciA9IDA7Ci0gICAgfQot
fQotI2VuZGlmCi0KIEdyYXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0KFBsYXRmb3JtR3Jh
cGhpY3NDb250ZXh0KiBjcikKICAgICA6IG1fY29tbW9uKGNyZWF0ZUdyYXBoaWNzQ29udGV4dFBy
aXZhdGUoKSkKICAgICAsIG1fZGF0YShuZXcgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRl
KQpAQCAtNTc3LDYgKzUzNCw5IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRVUkxGb3JSZWN0
KGNvbnMKICAgICBub3RJbXBsZW1lbnRlZCgpOwogfQogCisjaWYgUExBVEZPUk0oR1RLKQorLy8g
RklYTUU6ICBUaGlzIHNob3VsZCBiZSBtb3ZlZCB0byBzb21ldGhpbmcgbGlrZSBHcmFwaGljc0Nv
bnRleHRDYWlyb0dUSy5jcHAsCisvLyBhcyB0aGVyZSBpcyBhIFdpbmRvd3MgaW1wbGVtZW50YXRp
b24gaW4gcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENhaXJvV2luLmNwcAog
dm9pZCBHcmFwaGljc0NvbnRleHQ6OmNvbmNhdENUTShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRy
YW5zZm9ybSkKIHsKICAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQpAQCAtNTg2LDYgKzU0Niw3
IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0Ojpjb25jYXRDVE0oY29uc3QgQWYKICAgICBjb25zdCBj
YWlyb19tYXRyaXhfdCogbWF0cml4ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYWlyb19tYXRy
aXhfdCo+KCZ0cmFuc2Zvcm0pOwogICAgIGNhaXJvX3RyYW5zZm9ybShjciwgbWF0cml4KTsKIH0K
KyNlbmRpZgogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6YWRkSW5uZXJSb3VuZGVkUmVjdENsaXAo
Y29uc3QgSW50UmVjdCYgcmVjdCwgaW50IHRoaWNrbmVzcykKIHsKSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9HcmFwaGljc0NvbnRl
eHRQbGF0Zm9ybVByaXZhdGUuaAkocmV2aXNpb24gMjk3MjYpCShmcm9tIFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhpY3NDb250ZXh0Q2Fpcm8uY3BwOjI5NzI2KQorKysgV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZh
dGUuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDkyNCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENv
cHlyaWdodCAoQykgMjAwNyBBbHAgVG9rZXIgPGFscEBhdG9rZXIuY29tPgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisKKyNpZiBQTEFU
Rk9STShDQUlSTykKKworI2luY2x1ZGUgIkNhaXJvUGF0aC5oIgorI2luY2x1ZGUgIkZsb2F0UmVj
dC5oIgorI2luY2x1ZGUgIkZvbnQuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAi
Tm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQYXRoLmgiCisjaW5jbHVkZSAiU2ltcGxlRm9u
dERhdGEuaCIKKyNpbmNsdWRlIDxjYWlyby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRl
IDxzdGRpby5oPgorI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CisKKyNpZiBQTEFURk9STShX
SU4pCisjaW5jbHVkZSA8Y2Fpcm8td2luMzIuaD4KKyNlbmRpZgorCisjaWYgUExBVEZPUk0oR1RL
KQorI2luY2x1ZGUgPGdkay9nZGsuaD4KKyNpbmNsdWRlIDxwYW5nby9wYW5nby5oPgorI2VuZGlm
CisKKworI2lmbmRlZiBNX1BJCisjZGVmaW5lIE1fUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0Ngor
I2VuZGlmCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgR3JhcGhpY3NDb250ZXh0UGxh
dGZvcm1Qcml2YXRlIHsKK3B1YmxpYzoKKyAgICBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZh
dGUoKTsKKyAgICB+R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKCk7CisKKyAgICBjYWly
b190KiBjcjsKKyAgICBWZWN0b3I8ZmxvYXQ+IGxheWVyczsKKworI2lmIFBMQVRGT1JNKEdUSykK
KyAgICBHZGtFdmVudEV4cG9zZSogZXhwb3NlOworI2VuZGlmCit9OworCitzdGF0aWMgaW5saW5l
IHZvaWQgc2V0Q29sb3IoY2Fpcm9fdCogY3IsIGNvbnN0IENvbG9yJiBjb2wpCit7CisgICAgZmxv
YXQgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGE7CisgICAgY29sLmdldFJHQkEocmVkLCBncmVlbiwg
Ymx1ZSwgYWxwaGEpOworICAgIGNhaXJvX3NldF9zb3VyY2VfcmdiYShjciwgcmVkLCBncmVlbiwg
Ymx1ZSwgYWxwaGEpOworfQorCisvLyBBIGZpbGxSZWN0IGhlbHBlcgorc3RhdGljIGlubGluZSB2
b2lkIGZpbGxSZWN0U291cmNlT3ZlcihjYWlyb190KiBjciwgY29uc3QgRmxvYXRSZWN0JiByZWN0
LCBjb25zdCBDb2xvciYgY29sKQoreworICAgIHNldENvbG9yKGNyLCBjb2wpOworICAgIGNhaXJv
X3JlY3RhbmdsZShjciwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVp
Z2h0KCkpOworICAgIGNhaXJvX3NldF9vcGVyYXRvcihjciwgQ0FJUk9fT1BFUkFUT1JfT1ZFUik7
CisgICAgY2Fpcm9fZmlsbChjcik7Cit9CisKK0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0
ZTo6R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKCkKKyAgICA6ICBjcigwKQorI2lmIFBM
QVRGT1JNKEdUSykKKyAgICAsIGV4cG9zZSgwKQorI2VuZGlmCit7Cit9CisKK0dyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZTo6fkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpCit7
CisgICAgY2Fpcm9fZGVzdHJveShjcik7Cit9CisKKyNpZiBQTEFURk9STShXSU4pCitHcmFwaGlj
c0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dChIREMgZGMpCisgICAgOiBtX2NvbW1vbihjcmVhdGVH
cmFwaGljc0NvbnRleHRQcml2YXRlKCkpCisgICAgLCBtX2RhdGEobmV3IEdyYXBoaWNzQ29udGV4
dFBsYXRmb3JtUHJpdmF0ZSkKK3sKKyAgICBpZiAoZGMpIHsKKyAgICAgICAgY2Fpcm9fc3VyZmFj
ZV90KiBzdXJmYWNlID0gY2Fpcm9fd2luMzJfc3VyZmFjZV9jcmVhdGUoZGMpOworICAgICAgICBt
X2RhdGEtPmNyID0gY2Fpcm9fY3JlYXRlKHN1cmZhY2UpOworICAgIH0gZWxzZSB7CisgICAgICAg
IHNldFBhaW50aW5nRGlzYWJsZWQodHJ1ZSk7CisgICAgICAgIG1fZGF0YS0+Y3IgPSAwOworICAg
IH0KK30KKyNlbmRpZgorCitHcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dChQbGF0Zm9y
bUdyYXBoaWNzQ29udGV4dCogY3IpCisgICAgOiBtX2NvbW1vbihjcmVhdGVHcmFwaGljc0NvbnRl
eHRQcml2YXRlKCkpCisgICAgLCBtX2RhdGEobmV3IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZSkKK3sKKyAgICBtX2RhdGEtPmNyID0gY2Fpcm9fcmVmZXJlbmNlKGNyKTsKKyAgICBzZXRQ
YWludGluZ0Rpc2FibGVkKCFjcik7Cit9CisKK0dyYXBoaWNzQ29udGV4dDo6fkdyYXBoaWNzQ29u
dGV4dCgpCit7CisgICAgZGVzdHJveUdyYXBoaWNzQ29udGV4dFByaXZhdGUobV9jb21tb24pOwor
ICAgIGRlbGV0ZSBtX2RhdGE7Cit9CisKK2NhaXJvX3QqIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZv
cm1Db250ZXh0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9kYXRhLT5jcjsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHQ6OnNhdmVQbGF0Zm9ybVN0YXRlKCkKK3sKKyAgICBjYWlyb19zYXZlKG1f
ZGF0YS0+Y3IpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6cmVzdG9yZVBsYXRmb3JtU3Rh
dGUoKQoreworICAgIGNhaXJvX3Jlc3RvcmUobV9kYXRhLT5jcik7Cit9CisKKy8vIERyYXdzIGEg
ZmlsbGVkIHJlY3RhbmdsZSB3aXRoIGEgc3Ryb2tlZCBib3JkZXIuCit2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6ZHJhd1JlY3QoY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRpbmdE
aXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+
Y3I7CisgICAgY2Fpcm9fc2F2ZShjcik7CisKKyAgICBpZiAoZmlsbENvbG9yKCkuYWxwaGEoKSkK
KyAgICAgICAgZmlsbFJlY3RTb3VyY2VPdmVyKGNyLCByZWN0LCBmaWxsQ29sb3IoKSk7CisKKyAg
ICBpZiAoc3Ryb2tlU3R5bGUoKSAhPSBOb1N0cm9rZSkgeworICAgICAgICBzZXRDb2xvcihjciwg
c3Ryb2tlQ29sb3IoKSk7CisgICAgICAgIEZsb2F0UmVjdCByKHJlY3QpOworICAgICAgICByLmlu
ZmxhdGUoLS41Zik7CisgICAgICAgIGNhaXJvX3JlY3RhbmdsZShjciwgci54KCksIHIueSgpLCBy
LndpZHRoKCksIHIuaGVpZ2h0KCkpOworICAgICAgICBjYWlyb19zZXRfbGluZV93aWR0aChjciwg
MS4wKTsKKyAgICAgICAgY2Fpcm9fc3Ryb2tlKGNyKTsKKyAgICB9CisKKyAgICBjYWlyb19yZXN0
b3JlKGNyKTsKK30KKworLy8gRklYTUU6IE5vdyB0aGF0IHRoaXMgaXMgcmVmYWN0b3JlZCwgaXQg
c2hvdWxkIGJlIHNoYXJlZCBieSBhbGwgY29udGV4dHMuCitzdGF0aWMgdm9pZCBhZGp1c3RMaW5l
VG9QaXhlbEJvdW5kYXJpZXMoRmxvYXRQb2ludCYgcDEsIEZsb2F0UG9pbnQmIHAyLCBmbG9hdCBz
dHJva2VXaWR0aCwgU3Ryb2tlU3R5bGUgc3R5bGUpCit7CisgICAgLy8gRm9yIG9kZCB3aWR0aHMs
IHdlIGFkZCBpbiAwLjUgdG8gdGhlIGFwcHJvcHJpYXRlIHgveSBzbyB0aGF0IHRoZSBmbG9hdCBh
cml0aG1ldGljCisgICAgLy8gd29ya3Mgb3V0LiAgRm9yIGV4YW1wbGUsIHdpdGggYSBib3JkZXIg
d2lkdGggb2YgMywgS0hUTUwgd2lsbCBwYXNzIHVzICh5MSt5MikvMiwgZS5nLiwKKyAgICAvLyAo
NTArNTMpLzIgPSAxMDMvMiA9IDUxIHdoZW4gd2Ugd2FudCA1MS41LiAgSXQgaXMgYWx3YXlzIHRy
dWUgdGhhdCBhbiBldmVuIHdpZHRoIGdhdmUKKyAgICAvLyB1cyBhIHBlcmZlY3QgcG9zaXRpb24s
IGJ1dCBhbiBvZGQgd2lkdGggZ2F2ZSB1cyBhIHBvc2l0aW9uIHRoYXQgaXMgb2ZmIGJ5IGV4YWN0
bHkgMC41LgorICAgIGlmIChzdHlsZSA9PSBEb3R0ZWRTdHJva2UgfHwgc3R5bGUgPT0gRGFzaGVk
U3Ryb2tlKSB7CisgICAgICAgIGlmIChwMS54KCkgPT0gcDIueCgpKSB7CisgICAgICAgICAgICBw
MS5zZXRZKHAxLnkoKSArIHN0cm9rZVdpZHRoKTsKKyAgICAgICAgICAgIHAyLnNldFkocDIueSgp
IC0gc3Ryb2tlV2lkdGgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAg
cDEuc2V0WChwMS54KCkgKyBzdHJva2VXaWR0aCk7CisgICAgICAgICAgICBwMi5zZXRYKHAyLngo
KSAtIHN0cm9rZVdpZHRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzdGF0aWNfY2Fz
dDxpbnQ+KHN0cm9rZVdpZHRoKSAlIDIpIHsKKyAgICAgICAgaWYgKHAxLngoKSA9PSBwMi54KCkp
IHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIGEgdmVydGljYWwgbGluZS4gIEFkanVzdCBvdXIgeC4K
KyAgICAgICAgICAgIHAxLnNldFgocDEueCgpICsgMC41KTsKKyAgICAgICAgICAgIHAyLnNldFgo
cDIueCgpICsgMC41KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8v
IFdlJ3JlIGEgaG9yaXpvbnRhbCBsaW5lLiBBZGp1c3Qgb3VyIHkuCisgICAgICAgICAgICBwMS5z
ZXRZKHAxLnkoKSArIDAuNSk7CisgICAgICAgICAgICBwMi5zZXRZKHAyLnkoKSArIDAuNSk7Cisg
ICAgICAgIH0KKyAgICB9Cit9CisKKy8vIFRoaXMgaXMgb25seSB1c2VkIHRvIGRyYXcgYm9yZGVy
cy4KK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZShjb25zdCBJbnRQb2ludCYgcG9pbnQx
LCBjb25zdCBJbnRQb2ludCYgcG9pbnQyKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkp
CisgICAgICAgIHJldHVybjsKKworICAgIFN0cm9rZVN0eWxlIHN0eWxlID0gc3Ryb2tlU3R5bGUo
KTsKKyAgICBpZiAoc3R5bGUgPT0gTm9TdHJva2UpCisgICAgICAgIHJldHVybjsKKworICAgIGNh
aXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb19zYXZlKGNyKTsKKworICAgIGZsb2F0
IHdpZHRoID0gc3Ryb2tlVGhpY2tuZXNzKCk7CisgICAgaWYgKHdpZHRoIDwgMSkKKyAgICAgICAg
d2lkdGggPSAxOworCisgICAgRmxvYXRQb2ludCBwMSA9IHBvaW50MTsKKyAgICBGbG9hdFBvaW50
IHAyID0gcG9pbnQyOworICAgIGJvb2wgaXNWZXJ0aWNhbExpbmUgPSAocDEueCgpID09IHAyLngo
KSk7CisgCisgICAgYWRqdXN0TGluZVRvUGl4ZWxCb3VuZGFyaWVzKHAxLCBwMiwgd2lkdGgsIHN0
eWxlKTsKKyAgICBjYWlyb19zZXRfbGluZV93aWR0aChjciwgd2lkdGgpOworCisgICAgaW50IHBh
dFdpZHRoID0gMDsKKyAgICBzd2l0Y2ggKHN0eWxlKSB7CisgICAgY2FzZSBOb1N0cm9rZToKKyAg
ICBjYXNlIFNvbGlkU3Ryb2tlOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIERvdHRlZFN0cm9r
ZToKKyAgICAgICAgcGF0V2lkdGggPSBzdGF0aWNfY2FzdDxpbnQ+KHdpZHRoKTsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBEYXNoZWRTdHJva2U6CisgICAgICAgIHBhdFdpZHRoID0gMypzdGF0
aWNfY2FzdDxpbnQ+KHdpZHRoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc2V0Q29s
b3IoY3IsIHN0cm9rZUNvbG9yKCkpOworCisgICAgY2Fpcm9fc2V0X2FudGlhbGlhcyhjciwgQ0FJ
Uk9fQU5USUFMSUFTX05PTkUpOworCisgICAgaWYgKHBhdFdpZHRoKSB7CisgICAgICAgIC8vIERv
IGEgcmVjdCBmaWxsIG9mIG91ciBlbmRwb2ludHMuICBUaGlzIGVuc3VyZXMgd2UgYWx3YXlzIGhh
dmUgdGhlCisgICAgICAgIC8vIGFwcGVhcmFuY2Ugb2YgYmVpbmcgYSBib3JkZXIuICBXZSB0aGVu
IGRyYXcgdGhlIGFjdHVhbCBkb3R0ZWQvZGFzaGVkIGxpbmUuCisgICAgICAgIGlmIChpc1ZlcnRp
Y2FsTGluZSkgeworICAgICAgICAgICAgZmlsbFJlY3RTb3VyY2VPdmVyKGNyLCBGbG9hdFJlY3Qo
cDEueCgpIC0gd2lkdGgvMiwgcDEueSgpIC0gd2lkdGgsIHdpZHRoLCB3aWR0aCksIHN0cm9rZUNv
bG9yKCkpOworICAgICAgICAgICAgZmlsbFJlY3RTb3VyY2VPdmVyKGNyLCBGbG9hdFJlY3QocDIu
eCgpIC0gd2lkdGgvMiwgcDIueSgpLCB3aWR0aCwgd2lkdGgpLCBzdHJva2VDb2xvcigpKTsKKyAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbGxSZWN0U291cmNlT3ZlcihjciwgRmxvYXRS
ZWN0KHAxLngoKSAtIHdpZHRoLCBwMS55KCkgLSB3aWR0aC8yLCB3aWR0aCwgd2lkdGgpLCBzdHJv
a2VDb2xvcigpKTsKKyAgICAgICAgICAgIGZpbGxSZWN0U291cmNlT3ZlcihjciwgRmxvYXRSZWN0
KHAyLngoKSwgcDIueSgpIC0gd2lkdGgvMiwgd2lkdGgsIHdpZHRoKSwgc3Ryb2tlQ29sb3IoKSk7
CisgICAgICAgIH0KKworICAgICAgICAvLyBFeGFtcGxlOiA4MCBwaXhlbHMgd2l0aCBhIHdpZHRo
IG9mIDMwIHBpeGVscy4KKyAgICAgICAgLy8gUmVtYWluZGVyIGlzIDIwLiAgVGhlIG1heGltdW0g
cGl4ZWxzIG9mIGxpbmUgd2UgY291bGQgcGFpbnQKKyAgICAgICAgLy8gd2lsbCBiZSA1MCBwaXhl
bHMuCisgICAgICAgIGludCBkaXN0YW5jZSA9IChpc1ZlcnRpY2FsTGluZSA/IChwb2ludDIueSgp
IC0gcG9pbnQxLnkoKSkgOiAocG9pbnQyLngoKSAtIHBvaW50MS54KCkpKSAtIDIqc3RhdGljX2Nh
c3Q8aW50Pih3aWR0aCk7CisgICAgICAgIGludCByZW1haW5kZXIgPSBkaXN0YW5jZSVwYXRXaWR0
aDsKKyAgICAgICAgaW50IGNvdmVyYWdlID0gZGlzdGFuY2UtcmVtYWluZGVyOworICAgICAgICBp
bnQgbnVtU2VnbWVudHMgPSBjb3ZlcmFnZS9wYXRXaWR0aDsKKworICAgICAgICBmbG9hdCBwYXR0
ZXJuT2Zmc2V0ID0gMDsKKyAgICAgICAgLy8gU3BlY2lhbCBjYXNlIDFweCBkb3R0ZWQgYm9yZGVy
cyBmb3Igc3BlZWQuCisgICAgICAgIGlmIChwYXRXaWR0aCA9PSAxKQorICAgICAgICAgICAgcGF0
dGVybk9mZnNldCA9IDEuMDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBib29sIGV2ZW5O
dW1iZXJPZlNlZ21lbnRzID0gbnVtU2VnbWVudHMlMiA9PSAwOworICAgICAgICAgICAgaWYgKHJl
bWFpbmRlcikKKyAgICAgICAgICAgICAgICBldmVuTnVtYmVyT2ZTZWdtZW50cyA9ICFldmVuTnVt
YmVyT2ZTZWdtZW50czsKKyAgICAgICAgICAgIGlmIChldmVuTnVtYmVyT2ZTZWdtZW50cykgewor
ICAgICAgICAgICAgICAgIGlmIChyZW1haW5kZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0
dGVybk9mZnNldCArPSBwYXRXaWR0aCAtIHJlbWFpbmRlcjsKKyAgICAgICAgICAgICAgICAgICAg
cGF0dGVybk9mZnNldCArPSByZW1haW5kZXIvMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuT2Zmc2V0ID0gcGF0V2lk
dGgvMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCFldmVuTnVtYmVyT2ZT
ZWdtZW50cykgeworICAgICAgICAgICAgICAgIGlmIChyZW1haW5kZXIpCisgICAgICAgICAgICAg
ICAgICAgIHBhdHRlcm5PZmZzZXQgPSAocGF0V2lkdGggLSByZW1haW5kZXIpLzI7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkb3VibGUgZGFzaCA9IHBhdFdpZHRoOworICAg
ICAgICBjYWlyb19zZXRfZGFzaChjciwgJmRhc2gsIDEsIHBhdHRlcm5PZmZzZXQpOworICAgIH0K
KworICAgIGNhaXJvX21vdmVfdG8oY3IsIHAxLngoKSwgcDEueSgpKTsKKyAgICBjYWlyb19saW5l
X3RvKGNyLCBwMi54KCksIHAyLnkoKSk7CisKKyAgICBjYWlyb19zdHJva2UoY3IpOworICAgIGNh
aXJvX3Jlc3RvcmUoY3IpOworfQorCisvLyBUaGlzIG1ldGhvZCBpcyBvbmx5IHVzZWQgdG8gZHJh
dyB0aGUgbGl0dGxlIGNpcmNsZXMgdXNlZCBpbiBsaXN0cy4KK3ZvaWQgR3JhcGhpY3NDb250ZXh0
OjpkcmF3RWxsaXBzZShjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmIChwYWludGluZ0Rp
c2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5j
cjsKKyAgICBjYWlyb19zYXZlKGNyKTsKKyAgICBmbG9hdCB5UmFkaXVzID0gLjUgKiByZWN0Lmhl
aWdodCgpOworICAgIGZsb2F0IHhSYWRpdXMgPSAuNSAqIHJlY3Qud2lkdGgoKTsKKyAgICBjYWly
b190cmFuc2xhdGUoY3IsIHJlY3QueCgpICsgeFJhZGl1cywgcmVjdC55KCkgKyB5UmFkaXVzKTsK
KyAgICBjYWlyb19zY2FsZShjciwgeFJhZGl1cywgeVJhZGl1cyk7CisgICAgY2Fpcm9fYXJjKGNy
LCAwLiwgMC4sIDEuLCAwLiwgMiAqIE1fUEkpOworICAgIGNhaXJvX3Jlc3RvcmUoY3IpOworCisg
ICAgaWYgKGZpbGxDb2xvcigpLmFscGhhKCkpIHsKKyAgICAgICAgc2V0Q29sb3IoY3IsIGZpbGxD
b2xvcigpKTsKKyAgICAgICAgY2Fpcm9fZmlsbF9wcmVzZXJ2ZShjcik7CisgICAgfQorCisgICAg
aWYgKHN0cm9rZVN0eWxlKCkgIT0gTm9TdHJva2UpIHsKKyAgICAgICAgc2V0Q29sb3IoY3IsIHN0
cm9rZUNvbG9yKCkpOworICAgICAgICBjYWlyb19zZXRfbGluZV93aWR0aChjciwgc3Ryb2tlVGhp
Y2tuZXNzKCkpOworICAgICAgICBjYWlyb19zdHJva2UoY3IpOworICAgIH0KKworICAgIGNhaXJv
X25ld19wYXRoKGNyKTsKK30KKworLy8gRklYTUU6IFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUg
YWRqdXN0ZWQgdG8gbWF0Y2ggdGhlIGZ1bmN0aW9uYWxpdHkgb24gdGhlIE1hYyBzaWRlLgordm9p
ZCBHcmFwaGljc0NvbnRleHQ6OnN0cm9rZUFyYyhjb25zdCBJbnRSZWN0JiByZWN0LCBpbnQgc3Rh
cnRBbmdsZSwgaW50IGFuZ2xlU3BhbikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBpZiAoc3Ryb2tlU3R5bGUoKSA9PSBOb1N0cm9rZSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgaW50IHggPSByZWN0LngoKTsKKyAgICBpbnQgeSA9IHJlY3Qu
eSgpOworICAgIGZsb2F0IHcgPSByZWN0LndpZHRoKCk7CisjaWYgMCAvLyBGSVhNRTogdW51c2Vk
IHNvIGZhcgorICAgIGZsb2F0IGggPSByZWN0LmhlaWdodCgpOworICAgIGZsb2F0IHNjYWxlRmFj
dG9yID0gaCAvIHc7CisgICAgZmxvYXQgcmV2ZXJzZVNjYWxlRmFjdG9yID0gdyAvIGg7CisjZW5k
aWYKKyAgICBmbG9hdCByID0gdyAvIDI7CisgICAgZmxvYXQgZmEgPSBzdGFydEFuZ2xlOworICAg
IGZsb2F0IGZhbGVuID0gIGZhICsgYW5nbGVTcGFuOworCisgICAgY2Fpcm9fdCogY3IgPSBtX2Rh
dGEtPmNyOworICAgIGNhaXJvX3NhdmUoY3IpOworICAgIGNhaXJvX2FyY19uZWdhdGl2ZShjciwg
eCArIHIsIHkgKyByLCByLCAtZmEgKiBNX1BJLzE4MCwgLWZhbGVuICogTV9QSS8xODApOworICAg
IHNldENvbG9yKGNyLCBzdHJva2VDb2xvcigpKTsKKyAgICBjYWlyb19zZXRfbGluZV93aWR0aChj
ciwgc3Ryb2tlVGhpY2tuZXNzKCkpOworICAgIGNhaXJvX3N0cm9rZShjcik7CisgICAgY2Fpcm9f
cmVzdG9yZShjcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3Q29udmV4UG9seWdv
bihzaXplX3QgbnBvaW50cywgY29uc3QgRmxvYXRQb2ludCogcG9pbnRzLCBib29sIHNob3VsZEFu
dGlhbGlhcykKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBpZiAobnBvaW50cyA8PSAxKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb190
KiBjciA9IG1fZGF0YS0+Y3I7CisKKyAgICBjYWlyb19zYXZlKGNyKTsKKyAgICBjYWlyb19zZXRf
YW50aWFsaWFzKGNyLCBzaG91bGRBbnRpYWxpYXMgPyBDQUlST19BTlRJQUxJQVNfREVGQVVMVCA6
IENBSVJPX0FOVElBTElBU19OT05FKTsKKyAgICBjYWlyb19tb3ZlX3RvKGNyLCBwb2ludHNbMF0u
eCgpLCBwb2ludHNbMF0ueSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG5wb2ludHM7
IGkrKykKKyAgICAgICAgY2Fpcm9fbGluZV90byhjciwgcG9pbnRzW2ldLngoKSwgcG9pbnRzW2ld
LnkoKSk7CisgICAgY2Fpcm9fY2xvc2VfcGF0aChjcik7CisKKyAgICBpZiAoZmlsbENvbG9yKCku
YWxwaGEoKSkgeworICAgICAgICBzZXRDb2xvcihjciwgZmlsbENvbG9yKCkpOworICAgICAgICBj
YWlyb19zZXRfZmlsbF9ydWxlKGNyLCBDQUlST19GSUxMX1JVTEVfRVZFTl9PREQpOworICAgICAg
ICBjYWlyb19maWxsX3ByZXNlcnZlKGNyKTsKKyAgICB9CisKKyAgICBpZiAoc3Ryb2tlU3R5bGUo
KSAhPSBOb1N0cm9rZSkgeworICAgICAgICBzZXRDb2xvcihjciwgc3Ryb2tlQ29sb3IoKSk7Cisg
ICAgICAgIGNhaXJvX3NldF9saW5lX3dpZHRoKGNyLCBzdHJva2VUaGlja25lc3MoKSk7CisgICAg
ICAgIGNhaXJvX3N0cm9rZShjcik7CisgICAgfQorCisgICAgY2Fpcm9fbmV3X3BhdGgoY3IpOwor
ICAgIGNhaXJvX3Jlc3RvcmUoY3IpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJl
Y3QoY29uc3QgSW50UmVjdCYgcmVjdCwgY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIGlmIChw
YWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChjb2xvci5hbHBo
YSgpKQorICAgICAgICBmaWxsUmVjdFNvdXJjZU92ZXIobV9kYXRhLT5jciwgcmVjdCwgY29sb3Ip
OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0JiBy
ZWN0LCBjb25zdCBDb2xvciYgY29sb3IpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGNvbG9yLmFscGhhKCkpCisgICAgICAgIGZpbGxS
ZWN0U291cmNlT3ZlcihtX2RhdGEtPmNyLCByZWN0LCBjb2xvcik7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0OjpjbGlwKGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKHBhaW50aW5n
RGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEt
PmNyOworICAgIGNhaXJvX3JlY3RhbmdsZShjciwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0Lndp
ZHRoKCksIHJlY3QuaGVpZ2h0KCkpOworICAgIGNhaXJvX2ZpbGxfcnVsZV90IHNhdmVkRmlsbFJ1
bGUgPSBjYWlyb19nZXRfZmlsbF9ydWxlKGNyKTsKKyAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNy
LCBDQUlST19GSUxMX1JVTEVfV0lORElORyk7CisgICAgY2Fpcm9fY2xpcChjcik7CisgICAgY2Fp
cm9fc2V0X2ZpbGxfcnVsZShjciwgc2F2ZWRGaWxsUnVsZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0OjpkcmF3Rm9jdXNSaW5nKGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBpZiAocGFp
bnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpbnQgcmFkaXVzID0gKGZv
Y3VzUmluZ1dpZHRoKCkgLSAxKSAvIDI7CisgICAgaW50IG9mZnNldCA9IHJhZGl1cyArIGZvY3Vz
UmluZ09mZnNldCgpOworCisgICAgY29uc3QgVmVjdG9yPEludFJlY3Q+JiByZWN0cyA9IGZvY3Vz
UmluZ1JlY3RzKCk7CisgICAgdW5zaWduZWQgcmVjdENvdW50ID0gcmVjdHMuc2l6ZSgpOworICAg
IEludFJlY3QgZmluYWxGb2N1c1JlY3Q7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJl
Y3RDb3VudDsgaSsrKSB7CisgICAgICAgIEludFJlY3QgZm9jdXNSZWN0ID0gcmVjdHNbaV07Cisg
ICAgICAgIGZvY3VzUmVjdC5pbmZsYXRlKG9mZnNldCk7CisgICAgICAgIGZpbmFsRm9jdXNSZWN0
LnVuaXRlKGZvY3VzUmVjdCk7CisgICAgfQorCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNy
OworICAgIGNhaXJvX3NhdmUoY3IpOworICAgIC8vIEZJWE1FOiBUaGVzZSByZWN0cyBzaG91bGQg
YmUgcm91bmRlZAorICAgIGNhaXJvX3JlY3RhbmdsZShjciwgZmluYWxGb2N1c1JlY3QueCgpLCBm
aW5hbEZvY3VzUmVjdC55KCksIGZpbmFsRm9jdXNSZWN0LndpZHRoKCksIGZpbmFsRm9jdXNSZWN0
LmhlaWdodCgpKTsKKworICAgIC8vIEZvcmNlIHRoZSBhbHBoYSB0byA1MCUuICBUaGlzIG1hdGNo
ZXMgd2hhdCB0aGUgTWFjIGRvZXMgd2l0aCBvdXRsaW5lIHJpbmdzLgorICAgIENvbG9yIHJpbmdD
b2xvcihjb2xvci5yZWQoKSwgY29sb3IuZ3JlZW4oKSwgY29sb3IuYmx1ZSgpLCAxMjcpOworICAg
IHNldENvbG9yKGNyLCByaW5nQ29sb3IpOworICAgIGNhaXJvX3N0cm9rZShjcik7CisgICAgY2Fp
cm9fcmVzdG9yZShjcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvclRl
eHQoY29uc3QgSW50UG9pbnQmIG9yaWdpbiwgaW50IHdpZHRoLCBib29sIHByaW50aW5nKQorewor
ICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFRo
aXMgaXMgYSB3b3JrYXJvdW5kIGZvciBodHRwOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD0xNTY1OQorICAgIFN0cm9rZVN0eWxlIHNhdmVkU3Ryb2tlU3R5bGUgPSBzdHJva2VTdHls
ZSgpOworICAgIHNldFN0cm9rZVN0eWxlKFNvbGlkU3Ryb2tlKTsKKworICAgIEludFBvaW50IGVu
ZFBvaW50ID0gb3JpZ2luICsgSW50U2l6ZSh3aWR0aCwgMCk7CisgICAgZHJhd0xpbmUob3JpZ2lu
LCBlbmRQb2ludCk7CisKKyAgICBzZXRTdHJva2VTdHlsZShzYXZlZFN0cm9rZVN0eWxlKTsKK30K
Kwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yTWlzc3BlbGxpbmdPckJhZEdyYW1t
YXIoY29uc3QgSW50UG9pbnQmIG9yaWdpbiwgaW50IHdpZHRoLCBib29sIGdyYW1tYXIpCit7Cisg
ICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisjaWYgUExBVEZP
Uk0oR1RLKQorICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb19zYXZlKGNy
KTsKKworICAgIC8vIENvbnZlbnRpb24gaXMgZ3JlZW4gZm9yIGdyYW1tYXIsIHJlZCBmb3Igc3Bl
bGxpbmcKKyAgICAvLyBUaGVzZSBuZWVkIHRvIGJlY29tZSBjb25maWd1cmFibGUKKyAgICBpZiAo
Z3JhbW1hcikKKyAgICAgICAgY2Fpcm9fc2V0X3NvdXJjZV9yZ2IoY3IsIDAsIDEsIDApOworICAg
IGVsc2UKKyAgICAgICAgY2Fpcm9fc2V0X3NvdXJjZV9yZ2IoY3IsIDEsIDAsIDApOworCisgICAg
Ly8gV2UgaWdub3JlIG1vc3Qgb2YgdGhlIHByb3ZpZGVkIGNvbnN0YW50cyBpbiBmYXZvdXIgb2Yg
dGhlIHBsYXRmb3JtIHN0eWxlCisgICAgcGFuZ29fY2Fpcm9fc2hvd19lcnJvcl91bmRlcmxpbmUo
Y3IsIG9yaWdpbi54KCksIG9yaWdpbi55KCksIHdpZHRoLCBjTWlzc3BlbGxpbmdMaW5lVGhpY2tu
ZXNzKTsKKworICAgIGNhaXJvX3Jlc3RvcmUoY3IpOworI2Vsc2UKKyAgICBub3RJbXBsZW1lbnRl
ZCgpOworI2VuZGlmCit9CisKK0Zsb2F0UmVjdCBHcmFwaGljc0NvbnRleHQ6OnJvdW5kVG9EZXZp
Y2VQaXhlbHMoY29uc3QgRmxvYXRSZWN0JiBmcmVjdCkKK3sKKyAgICBGbG9hdFJlY3QgcmVzdWx0
OworICAgIGRvdWJsZSB4ID0gZnJlY3QueCgpOworICAgIGRvdWJsZSB5ID0gZnJlY3QueSgpOwor
ICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb191c2VyX3RvX2RldmljZShj
ciwgJngsICZ5KTsKKyAgICB4ID0gcm91bmQoeCk7CisgICAgeSA9IHJvdW5kKHkpOworICAgIGNh
aXJvX2RldmljZV90b191c2VyKGNyLCAmeCwgJnkpOworICAgIHJlc3VsdC5zZXRYKHN0YXRpY19j
YXN0PGZsb2F0Pih4KSk7CisgICAgcmVzdWx0LnNldFkoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHkpKTsK
KyAgICB4ID0gZnJlY3Qud2lkdGgoKTsKKyAgICB5ID0gZnJlY3QuaGVpZ2h0KCk7CisgICAgY2Fp
cm9fdXNlcl90b19kZXZpY2VfZGlzdGFuY2UoY3IsICZ4LCAmeSk7CisgICAgeCA9IHJvdW5kKHgp
OworICAgIHkgPSByb3VuZCh5KTsKKyAgICBjYWlyb19kZXZpY2VfdG9fdXNlcl9kaXN0YW5jZShj
ciwgJngsICZ5KTsKKyAgICByZXN1bHQuc2V0V2lkdGgoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHgpKTsK
KyAgICByZXN1bHQuc2V0SGVpZ2h0KHN0YXRpY19jYXN0PGZsb2F0Pih5KSk7CisgICAgcmV0dXJu
IHJlc3VsdDsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnRyYW5zbGF0ZShmbG9hdCB4LCBm
bG9hdCB5KQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsK
KworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb190cmFuc2xhdGUoY3Is
IHgsIHkpOworfQorCitJbnRQb2ludCBHcmFwaGljc0NvbnRleHQ6Om9yaWdpbigpCit7CisgICAg
Y2Fpcm9fbWF0cml4X3QgbWF0cml4OworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAg
ICBjYWlyb19nZXRfbWF0cml4KGNyLCAmbWF0cml4KTsKKyAgICByZXR1cm4gSW50UG9pbnQoc3Rh
dGljX2Nhc3Q8aW50PihtYXRyaXgueDApLCBzdGF0aWNfY2FzdDxpbnQ+KG1hdHJpeC55MCkpOwor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1GaWxsQ29sb3IoY29uc3QgQ29s
b3ImIGNvbCkKK3sKKyAgICAvLyBGSVhNRTogdGhpcyBpcyBwcm9iYWJseSBhIG5vLW9wIGJ1dCBJ
J20gbm90IHN1cmUKKyAgICAvLyBub3RJbXBsZW1lbnRlZCgpOyAvLyBjb21tZW50ZWQtb3V0IGJl
Y2F1c2UgaXQncyBjaGF0dHkgYW5kIGNsdXR0ZXJzIG91dHB1dAorfQorCit2b2lkIEdyYXBoaWNz
Q29udGV4dDo6c2V0UGxhdGZvcm1TdHJva2VDb2xvcihjb25zdCBDb2xvciYgY29sKQoreworICAg
IC8vIEZJWE1FOiB0aGlzIGlzIHByb2JhYmx5IGEgbm8tb3AgYnV0IEknbSBub3Qgc3VyZQorICAg
IC8vbm90SW1wbGVtZW50ZWQoKTsgLy8gY29tbWVudGVkLW91dCBiZWNhdXNlIGl0J3MgY2hhdHR5
IGFuZCBjbHV0dGVycyBvdXRwdXQKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRm
b3JtU3Ryb2tlVGhpY2tuZXNzKGZsb2F0IHN0cm9rZVRoaWNrbmVzcykKK3sKKyAgICBpZiAocGFp
bnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb19zZXRfbGluZV93
aWR0aChtX2RhdGEtPmNyLCBzdHJva2VUaGlja25lc3MpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6c2V0UGxhdGZvcm1TdHJva2VTdHlsZShjb25zdCBTdHJva2VTdHlsZSYgc3Ryb2tlU3R5
bGUpCit7CisgICAgc3RhdGljIGRvdWJsZSBkYXNoUGF0dGVybltdID0gezUuMCwgNS4wfTsKKyAg
ICBzdGF0aWMgZG91YmxlIGRvdFBhdHRlcm5bXSA9IHsxLjAsIDEuMH07CisKKyAgICBpZiAocGFp
bnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBzd2l0Y2ggKHN0cm9rZVN0
eWxlKSB7CisgICAgY2FzZSBOb1N0cm9rZToKKyAgICAgICAgLy8gRklYTUU6IGlzIGl0IHRoZSBy
aWdodCB3YXkgdG8gZW11bGF0ZSBOb1N0cm9rZT8KKyAgICAgICAgY2Fpcm9fc2V0X2xpbmVfd2lk
dGgobV9kYXRhLT5jciwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU29saWRTdHJva2U6
CisgICAgICAgIGNhaXJvX3NldF9kYXNoKG1fZGF0YS0+Y3IsIDAsIDAsIDApOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIERvdHRlZFN0cm9rZToKKyAgICAgICAgY2Fpcm9fc2V0X2Rhc2gobV9k
YXRhLT5jciwgZG90UGF0dGVybiwgMiwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRGFz
aGVkU3Ryb2tlOgorICAgICAgICBjYWlyb19zZXRfZGFzaChtX2RhdGEtPmNyLCBkYXNoUGF0dGVy
biwgMiwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIG5vdEltcGxl
bWVudGVkKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBHcmFwaGljc0NvbnRl
eHQ6OnNldFVSTEZvclJlY3QoY29uc3QgS1VSTCYgbGluaywgY29uc3QgSW50UmVjdCYgZGVzdFJl
Y3QpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6
OmNvbmNhdENUTShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSkKK3sKKyAgICBpZiAo
cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb190KiBjciA9
IG1fZGF0YS0+Y3I7CisgICAgY29uc3QgY2Fpcm9fbWF0cml4X3QqIG1hdHJpeCA9IHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgY2Fpcm9fbWF0cml4X3QqPigmdHJhbnNmb3JtKTsKKyAgICBjYWlyb190
cmFuc2Zvcm0oY3IsIG1hdHJpeCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjphZGRJbm5l
clJvdW5kZWRSZWN0Q2xpcChjb25zdCBJbnRSZWN0JiByZWN0LCBpbnQgdGhpY2tuZXNzKQorewor
ICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNsaXAo
cmVjdCk7CisKKyAgICBQYXRoIHA7CisgICAgRmxvYXRSZWN0IHIocmVjdCk7CisgICAgLy8gQWRk
IG91dGVyIGVsbGlwc2UKKyAgICBwLmFkZEVsbGlwc2Uocik7CisgICAgLy8gQWRkIGlubmVyIGVs
bGlwc2UKKyAgICByLmluZmxhdGUoLXRoaWNrbmVzcyk7CisgICAgcC5hZGRFbGxpcHNlKHIpOwor
ICAgIGFkZFBhdGgocCk7CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgY2Fp
cm9fZmlsbF9ydWxlX3Qgc2F2ZWRGaWxsUnVsZSA9IGNhaXJvX2dldF9maWxsX3J1bGUoY3IpOwor
ICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIENBSVJPX0ZJTExfUlVMRV9FVkVOX09ERCk7Cisg
ICAgY2Fpcm9fY2xpcChjcik7CisgICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgc2F2ZWRGaWxs
UnVsZSk7Cit9CisKKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFNoYWRvdyhJbnRTaXplIGNv
bnN0JiwgaW50LCBDb2xvciBjb25zdCYpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsZWFyU2hhZG93KCkKK3sKKyAgICBub3RJbXBsZW1lbnRl
ZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6YmVnaW5UcmFuc3BhcmVuY3lMYXllcihm
bG9hdCBvcGFjaXR5KQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb19wdXNoX2dy
b3VwKGNyKTsKKyAgICBtX2RhdGEtPmxheWVycy5hcHBlbmQob3BhY2l0eSk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0OjplbmRUcmFuc3BhcmVuY3lMYXllcigpCit7CisgICAgaWYgKHBhaW50
aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fdCogY3IgPSBtX2Rh
dGEtPmNyOworCisgICAgY2Fpcm9fcG9wX2dyb3VwX3RvX3NvdXJjZShjcik7CisgICAgY2Fpcm9f
cGFpbnRfd2l0aF9hbHBoYShjciwgbV9kYXRhLT5sYXllcnMubGFzdCgpKTsKKyAgICBtX2RhdGEt
PmxheWVycy5yZW1vdmVMYXN0KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGVhclJl
Y3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkp
CisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKworICAg
IGNhaXJvX3NhdmUoY3IpOworICAgIGNhaXJvX3JlY3RhbmdsZShjciwgcmVjdC54KCksIHJlY3Qu
eSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOworICAgIGNhaXJvX3NldF9vcGVyYXRv
cihjciwgQ0FJUk9fT1BFUkFUT1JfQ0xFQVIpOworICAgIGNhaXJvX2ZpbGwoY3IpOworICAgIGNh
aXJvX3Jlc3RvcmUoY3IpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c3Ryb2tlUmVjdChj
b25zdCBGbG9hdFJlY3QmIHJlY3QsIGZsb2F0IHdpZHRoKQoreworICAgIGlmIChwYWludGluZ0Rp
c2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5j
cjsKKyAgICBjYWlyb19zYXZlKGNyKTsKKyAgICBjYWlyb19yZWN0YW5nbGUoY3IsIHJlY3QueCgp
LCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKKyAgICBzZXRDb2xvcihj
ciwgc3Ryb2tlQ29sb3IoKSk7CisgICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgoY3IsIHdpZHRoKTsK
KyAgICBjYWlyb19zdHJva2UoY3IpOworICAgIGNhaXJvX3Jlc3RvcmUoY3IpOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dDo6c2V0TGluZUNhcChMaW5lQ2FwIGxpbmVDYXApCit7CisgICAgaWYg
KHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fbGluZV9j
YXBfdCBjYWlyb0NhcCA9IENBSVJPX0xJTkVfQ0FQX0JVVFQ7CisgICAgc3dpdGNoIChsaW5lQ2Fw
KSB7CisgICAgICAgIGNhc2UgQnV0dENhcDoKKyAgICAgICAgICAgIC8vIG5vLW9wCisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSb3VuZENhcDoKKyAgICAgICAgICAgIGNhaXJvQ2Fw
ID0gQ0FJUk9fTElORV9DQVBfUk9VTkQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2Fz
ZSBTcXVhcmVDYXA6CisgICAgICAgICAgICBjYWlyb0NhcCA9IENBSVJPX0xJTkVfQ0FQX1NRVUFS
RTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYWlyb19zZXRfbGluZV9jYXAobV9k
YXRhLT5jciwgY2Fpcm9DYXApOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0TGluZUpv
aW4oTGluZUpvaW4gbGluZUpvaW4pCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fbGluZV9qb2luX3QgY2Fpcm9Kb2luID0gQ0FJUk9f
TElORV9KT0lOX01JVEVSOworICAgIHN3aXRjaCAobGluZUpvaW4pIHsKKyAgICAgICAgY2FzZSBN
aXRlckpvaW46CisgICAgICAgICAgICAvLyBuby1vcAorICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIGNhc2UgUm91bmRKb2luOgorICAgICAgICAgICAgY2Fpcm9Kb2luID0gQ0FJUk9fTElORV9K
T0lOX1JPVU5EOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQmV2ZWxKb2luOgor
ICAgICAgICAgICAgY2Fpcm9Kb2luID0gQ0FJUk9fTElORV9KT0lOX0JFVkVMOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgfQorICAgIGNhaXJvX3NldF9saW5lX2pvaW4obV9kYXRhLT5jciwgY2Fp
cm9Kb2luKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldE1pdGVyTGltaXQoZmxvYXQg
bWl0ZXIpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgY2Fpcm9fc2V0X21pdGVyX2xpbWl0KG1fZGF0YS0+Y3IsIG1pdGVyKTsKK30KKwordm9p
ZCBHcmFwaGljc0NvbnRleHQ6OnNldEFscGhhKGZsb2F0KQoreworICAgIG5vdEltcGxlbWVudGVk
KCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgY2Fpcm9fb3BlcmF0b3JfdCB0b0NhaXJvT3BlcmF0b3Io
Q29tcG9zaXRlT3BlcmF0b3Igb3ApCit7CisgICAgc3dpdGNoIChvcCkgeworICAgICAgICBjYXNl
IENvbXBvc2l0ZUNsZWFyOgorICAgICAgICAgICAgcmV0dXJuIENBSVJPX09QRVJBVE9SX0NMRUFS
OworICAgICAgICBjYXNlIENvbXBvc2l0ZUNvcHk6CisgICAgICAgICAgICByZXR1cm4gQ0FJUk9f
T1BFUkFUT1JfU09VUkNFOworICAgICAgICBjYXNlIENvbXBvc2l0ZVNvdXJjZU92ZXI6CisgICAg
ICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfT1ZFUjsKKyAgICAgICAgY2FzZSBDb21wb3Np
dGVTb3VyY2VJbjoKKyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9JTjsKKyAgICAg
ICAgY2FzZSBDb21wb3NpdGVTb3VyY2VPdXQ6CisgICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BF
UkFUT1JfT1VUOworICAgICAgICBjYXNlIENvbXBvc2l0ZVNvdXJjZUF0b3A6CisgICAgICAgICAg
ICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfQVRPUDsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVEZXN0
aW5hdGlvbk92ZXI6CisgICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfREVTVF9PVkVS
OworICAgICAgICBjYXNlIENvbXBvc2l0ZURlc3RpbmF0aW9uSW46CisgICAgICAgICAgICByZXR1
cm4gQ0FJUk9fT1BFUkFUT1JfREVTVF9JTjsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5h
dGlvbk91dDoKKyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9ERVNUX09VVDsKKyAg
ICAgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlvbkF0b3A6CisgICAgICAgICAgICByZXR1cm4g
Q0FJUk9fT1BFUkFUT1JfREVTVF9BVE9QOworICAgICAgICBjYXNlIENvbXBvc2l0ZVhPUjoKKyAg
ICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9YT1I7CisgICAgICAgIGNhc2UgQ29tcG9z
aXRlUGx1c0RhcmtlcjoKKyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9TQVRVUkFU
RTsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVIaWdobGlnaHQ6CisgICAgICAgICAgICAvLyBUaGVy
ZSBpcyBubyBDYWlybyBlcXVpdmFsZW50IGZvciBDb21wb3NpdGVIaWdobGlnaHQuCisgICAgICAg
ICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfT1ZFUjsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVQ
bHVzTGlnaHRlcjoKKyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9BREQ7CisgICAg
ICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfU09VUkNFOwor
ICAgIH0KK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldENvbXBvc2l0ZU9wZXJhdGlvbihD
b21wb3NpdGVPcGVyYXRvciBvcCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBjYWlyb19zZXRfb3BlcmF0b3IobV9kYXRhLT5jciwgdG9DYWly
b09wZXJhdG9yKG9wKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpiZWdpblBhdGgoKQor
eworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNh
aXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb19uZXdfcGF0aChjcik7Cit9CisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0OjphZGRQYXRoKGNvbnN0IFBhdGgmIHBhdGgpCit7CisgICAgaWYg
KHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fdCogY3Ig
PSBtX2RhdGEtPmNyOworICAgIGNhaXJvX3BhdGhfdCogcCA9IGNhaXJvX2NvcHlfcGF0aChwYXRo
LnBsYXRmb3JtUGF0aCgpLT5tX2NyKTsKKyAgICBjYWlyb19hcHBlbmRfcGF0aChjciwgcCk7Cisg
ICAgY2Fpcm9fcGF0aF9kZXN0cm95KHApOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xp
cChjb25zdCBQYXRoJiBwYXRoKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb19w
YXRoX3QqIHAgPSBjYWlyb19jb3B5X3BhdGgocGF0aC5wbGF0Zm9ybVBhdGgoKS0+bV9jcik7Cisg
ICAgY2Fpcm9fYXBwZW5kX3BhdGgoY3IsIHApOworICAgIGNhaXJvX3BhdGhfZGVzdHJveShwKTsK
KyAgICBjYWlyb19maWxsX3J1bGVfdCBzYXZlZEZpbGxSdWxlID0gY2Fpcm9fZ2V0X2ZpbGxfcnVs
ZShjcik7CisgICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgQ0FJUk9fRklMTF9SVUxFX1dJTkRJ
TkcpOworICAgIGNhaXJvX2NsaXAoY3IpOworICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIHNh
dmVkRmlsbFJ1bGUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcE91dChjb25zdCBQ
YXRoJiBwYXRoKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBkb3VibGUgeDEsIHkxLCB4
MiwgeTI7CisgICAgY2Fpcm9fY2xpcF9leHRlbnRzKGNyLCAmeDEsICZ5MSwgJngyLCAmeTIpOwor
ICAgIGNhaXJvX3JlY3RhbmdsZShjciwgeDEsIHkxLCB4MiAtIHgxLCB5MiAtIHkxKTsKKyAgICBh
ZGRQYXRoKHBhdGgpOworCisgICAgY2Fpcm9fZmlsbF9ydWxlX3Qgc2F2ZWRGaWxsUnVsZSA9IGNh
aXJvX2dldF9maWxsX3J1bGUoY3IpOworICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIENBSVJP
X0ZJTExfUlVMRV9FVkVOX09ERCk7CisgICAgY2Fpcm9fY2xpcChjcik7CisgICAgY2Fpcm9fc2V0
X2ZpbGxfcnVsZShjciwgc2F2ZWRGaWxsUnVsZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
Ojpyb3RhdGUoZmxvYXQgcmFkaWFucykKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb19yb3RhdGUobV9kYXRhLT5jciwgcmFkaWFucyk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzY2FsZShjb25zdCBGbG9hdFNpemUmIHNpemUp
Cit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
Y2Fpcm9fc2NhbGUobV9kYXRhLT5jciwgc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpKTsKK30K
Kwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBPdXQoY29uc3QgSW50UmVjdCYgcikKK3sKKyAg
ICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb190
KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgZG91YmxlIHgxLCB5MSwgeDIsIHkyOworICAgIGNhaXJv
X2NsaXBfZXh0ZW50cyhjciwgJngxLCAmeTEsICZ4MiwgJnkyKTsKKyAgICBjYWlyb19yZWN0YW5n
bGUoY3IsIHgxLCB4MiwgeDIgLSB4MSwgeTIgLSB5MSk7CisgICAgY2Fpcm9fcmVjdGFuZ2xlKGNy
LCByLngoKSwgci55KCksIHIud2lkdGgoKSwgci5oZWlnaHQoKSk7CisgICAgY2Fpcm9fZmlsbF9y
dWxlX3Qgc2F2ZWRGaWxsUnVsZSA9IGNhaXJvX2dldF9maWxsX3J1bGUoY3IpOworICAgIGNhaXJv
X3NldF9maWxsX3J1bGUoY3IsIENBSVJPX0ZJTExfUlVMRV9FVkVOX09ERCk7CisgICAgY2Fpcm9f
Y2xpcChjcik7CisgICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgc2F2ZWRGaWxsUnVsZSk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwT3V0RWxsaXBzZUluUmVjdChjb25zdCBJbnRS
ZWN0JiByKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsK
KworICAgIFBhdGggcDsKKyAgICBwLmFkZEVsbGlwc2Uocik7CisgICAgY2xpcE91dChwKTsKK30K
Kwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxSb3VuZGVkUmVjdChjb25zdCBJbnRSZWN0JiBy
LCBjb25zdCBJbnRTaXplJiB0b3BMZWZ0LCBjb25zdCBJbnRTaXplJiB0b3BSaWdodCwgY29uc3Qg
SW50U2l6ZSYgYm90dG9tTGVmdCwgY29uc3QgSW50U2l6ZSYgYm90dG9tUmlnaHQsIGNvbnN0IENv
bG9yJiBjb2xvcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgY2Fpcm9fc2F2ZShjcik7
CisgICAgYmVnaW5QYXRoKCk7CisgICAgYWRkUGF0aChQYXRoOjpjcmVhdGVSb3VuZGVkUmVjdGFu
Z2xlKHIsIHRvcExlZnQsIHRvcFJpZ2h0LCBib3R0b21MZWZ0LCBib3R0b21SaWdodCkpOworICAg
IHNldENvbG9yKGNyLCBjb2xvcik7CisgICAgY2Fpcm9fZmlsbChjcik7CisgICAgY2Fpcm9fcmVz
dG9yZShjcik7Cit9CisKKyNpZiBQTEFURk9STShHVEspCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6
c2V0R2RrRXhwb3NlRXZlbnQoR2RrRXZlbnRFeHBvc2UqIGV4cG9zZSkKK3sKKyAgICBtX2RhdGEt
PmV4cG9zZSA9IGV4cG9zZTsKK30KKworR2RrRXZlbnRFeHBvc2UqIEdyYXBoaWNzQ29udGV4dDo6
Z2RrRXhwb3NlRXZlbnQoKSBjb25zdAoreworICAgIHJldHVybiBtX2RhdGEtPmV4cG9zZTsKK30K
KworR2RrRHJhd2FibGUqIEdyYXBoaWNzQ29udGV4dDo6Z2RrRHJhd2FibGUoKSBjb25zdAorewor
ICAgIGlmICghbV9kYXRhLT5leHBvc2UpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJu
IEdES19EUkFXQUJMRShtX2RhdGEtPmV4cG9zZS0+d2luZG93KTsKK30KKworSW50UG9pbnQgR3Jh
cGhpY3NDb250ZXh0Ojp0cmFuc2xhdGVQb2ludChjb25zdCBJbnRQb2ludCYgcG9pbnQpIGNvbnN0
Cit7CisgICAgY2Fpcm9fbWF0cml4X3QgdG07CisgICAgY2Fpcm9fZ2V0X21hdHJpeChtX2RhdGEt
PmNyLCAmdG0pOworICAgIGRvdWJsZSB4ID0gcG9pbnQueCgpOworICAgIGRvdWJsZSB5ID0gcG9p
bnQueSgpOworCisgICAgY2Fpcm9fbWF0cml4X3RyYW5zZm9ybV9wb2ludCgmdG0sICZ4LCAmeSk7
CisgICAgcmV0dXJuIEludFBvaW50KHgsIHkpOworfQorI2VuZGlmCisKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0OjpzZXRVc2VBbnRpYWxpYXNpbmcoYm9vbCBlbmFibGUpCit7CisgICAgaWYgKHBhaW50
aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gV2hlbiB0cnVlLCB1c2Ug
dGhlIGRlZmF1bHQgQ2Fpcm8gYmFja2VuZCBhbnRpYWxpYXMgbW9kZSAodXN1YWxseSB0aGlzCisg
ICAgLy8gZW5hYmxlcyBzdGFuZGFyZCAnZ3JheXNjYWxlJyBhbnRpYWxpYXNpbmcpOyBmYWxzZSB0
byBleHBsaWNpdGx5IGRpc2FibGUKKyAgICAvLyBhbnRpYWxpYXNpbmcuIFRoaXMgaXMgdGhlIHNh
bWUgc3RyYXRlZ3kgYXMgdXNlZCBpbiBkcmF3Q29udmV4UG9seWdvbigpLgorICAgIGNhaXJvX3Nl
dF9hbnRpYWxpYXMobV9kYXRhLT5jciwgZW5hYmxlID8gQ0FJUk9fQU5USUFMSUFTX0RFRkFVTFQg
OiBDQUlST19BTlRJQUxJQVNfTk9ORSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKwor
I2VuZGlmIC8vIFBMQVRGT1JNKENBSVJPKQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jYWlyby9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZS5oCShyZXZpc2lvbiAyOTcyNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fp
cm8vR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmgJKHdvcmtpbmcgY29weSkKQEAgLTEs
NiArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMu
ICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IChDKSAyMDA3IEFscCBUb2tlciA8
YWxwQGF0b2tlci5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQnJlbnQgRnVsZ2hhbSA8YmZ1
bGdoYW1AZ21haWwuY29tPgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yNSw4
OTkgKzI2LDYwIEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkdyYXBo
aWNzQ29udGV4dC5oIgogCiAjaWYgUExBVEZPUk0oQ0FJUk8pCiAKLSNpbmNsdWRlICJDYWlyb1Bh
dGguaCIKLSNpbmNsdWRlICJGbG9hdFJlY3QuaCIKLSNpbmNsdWRlICJGb250LmgiCi0jaW5jbHVk
ZSAiSW50UmVjdC5oIgotI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCi0jaW5jbHVkZSAiUGF0
aC5oIgotI2luY2x1ZGUgIlNpbXBsZUZvbnREYXRhLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250
ZXh0LmgiCisKICNpbmNsdWRlIDxjYWlyby5oPgogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRl
IDxzdGRpby5oPgogI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CiAKLSNpZiBQTEFURk9STShX
SU4pCi0jaW5jbHVkZSA8Y2Fpcm8td2luMzIuaD4KLSNlbmRpZgotCiAjaWYgUExBVEZPUk0oR1RL
KQogI2luY2x1ZGUgPGdkay9nZGsuaD4KICNpbmNsdWRlIDxwYW5nby9wYW5nby5oPgotI2VuZGlm
Ci0KLQotI2lmbmRlZiBNX1BJCi0jZGVmaW5lIE1fUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0Ngor
I2VsaWYgUExBVEZPUk0oV0lOKQorI2luY2x1ZGUgPGNhaXJvLXdpbjMyLmg+CiAjZW5kaWYKIAog
bmFtZXNwYWNlIFdlYkNvcmUgewogCiBjbGFzcyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZh
dGUgewogcHVibGljOgotICAgIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpOwotICAg
IH5HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKTsKLQotICAgIGNhaXJvX3QqIGNyOwot
ICAgIFZlY3RvcjxmbG9hdD4gbGF5ZXJzOwotCi0jaWYgUExBVEZPUk0oR1RLKQotICAgIEdka0V2
ZW50RXhwb3NlKiBleHBvc2U7Ci0jZW5kaWYKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRD
b2xvcihjYWlyb190KiBjciwgY29uc3QgQ29sb3ImIGNvbCkKLXsKLSAgICBmbG9hdCByZWQsIGdy
ZWVuLCBibHVlLCBhbHBoYTsKLSAgICBjb2wuZ2V0UkdCQShyZWQsIGdyZWVuLCBibHVlLCBhbHBo
YSk7Ci0gICAgY2Fpcm9fc2V0X3NvdXJjZV9yZ2JhKGNyLCByZWQsIGdyZWVuLCBibHVlLCBhbHBo
YSk7Ci19Ci0KLS8vIEEgZmlsbFJlY3QgaGVscGVyCi1zdGF0aWMgaW5saW5lIHZvaWQgZmlsbFJl
Y3RTb3VyY2VPdmVyKGNhaXJvX3QqIGNyLCBjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0IENv
bG9yJiBjb2wpCi17Ci0gICAgc2V0Q29sb3IoY3IsIGNvbCk7Ci0gICAgY2Fpcm9fcmVjdGFuZ2xl
KGNyLCByZWN0LngoKSwgcmVjdC55KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7Ci0g
ICAgY2Fpcm9fc2V0X29wZXJhdG9yKGNyLCBDQUlST19PUEVSQVRPUl9PVkVSKTsKLSAgICBjYWly
b19maWxsKGNyKTsKLX0KLQotR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpHcmFwaGlj
c0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKQotICAgIDogIGNyKDApCisgICAgR3JhcGhpY3NDb250
ZXh0UGxhdGZvcm1Qcml2YXRlKCkKKyAgICAgICAgOiAgY3IoMCkKICNpZiBQTEFURk9STShHVEsp
Ci0gICAgLCBleHBvc2UoMCkKLSNlbmRpZgotewotfQotCi1HcmFwaGljc0NvbnRleHRQbGF0Zm9y
bVByaXZhdGU6On5HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKQotewotICAgIGNhaXJv
X2Rlc3Ryb3koY3IpOwotfQotCi0jaWYgUExBVEZPUk0oV0lOKQotR3JhcGhpY3NDb250ZXh0OjpH
cmFwaGljc0NvbnRleHQoSERDIGRjKQotICAgIDogbV9jb21tb24oY3JlYXRlR3JhcGhpY3NDb250
ZXh0UHJpdmF0ZSgpKQotICAgICwgbV9kYXRhKG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVBy
aXZhdGUpCi17Ci0gICAgaWYgKGRjKSB7Ci0gICAgICAgIGNhaXJvX3N1cmZhY2VfdCogc3VyZmFj
ZSA9IGNhaXJvX3dpbjMyX3N1cmZhY2VfY3JlYXRlKGRjKTsKLSAgICAgICAgbV9kYXRhLT5jciA9
IGNhaXJvX2NyZWF0ZShzdXJmYWNlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzZXRQYWludGlu
Z0Rpc2FibGVkKHRydWUpOwotICAgICAgICBtX2RhdGEtPmNyID0gMDsKLSAgICB9Ci19Ci0jZW5k
aWYKLQotR3JhcGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRleHQoUGxhdGZvcm1HcmFwaGljc0Nv
bnRleHQqIGNyKQotICAgIDogbV9jb21tb24oY3JlYXRlR3JhcGhpY3NDb250ZXh0UHJpdmF0ZSgp
KQotICAgICwgbV9kYXRhKG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUpCi17Ci0g
ICAgbV9kYXRhLT5jciA9IGNhaXJvX3JlZmVyZW5jZShjcik7Ci0gICAgc2V0UGFpbnRpbmdEaXNh
YmxlZCghY3IpOwotfQotCi1HcmFwaGljc0NvbnRleHQ6On5HcmFwaGljc0NvbnRleHQoKQotewot
ICAgIGRlc3Ryb3lHcmFwaGljc0NvbnRleHRQcml2YXRlKG1fY29tbW9uKTsKLSAgICBkZWxldGUg
bV9kYXRhOwotfQotCi1jYWlyb190KiBHcmFwaGljc0NvbnRleHQ6OnBsYXRmb3JtQ29udGV4dCgp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fZGF0YS0+Y3I7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0OjpzYXZlUGxhdGZvcm1TdGF0ZSgpCi17Ci0gICAgY2Fpcm9fc2F2ZShtX2RhdGEtPmNyKTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnJlc3RvcmVQbGF0Zm9ybVN0YXRlKCkKLXsKLSAg
ICBjYWlyb19yZXN0b3JlKG1fZGF0YS0+Y3IpOwotfQotCi0vLyBEcmF3cyBhIGZpbGxlZCByZWN0
YW5nbGUgd2l0aCBhIHN0cm9rZWQgYm9yZGVyLgotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdS
ZWN0KGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotICAgIGNh
aXJvX3NhdmUoY3IpOwotCi0gICAgaWYgKGZpbGxDb2xvcigpLmFscGhhKCkpCi0gICAgICAgIGZp
bGxSZWN0U291cmNlT3ZlcihjciwgcmVjdCwgZmlsbENvbG9yKCkpOwotCi0gICAgaWYgKHN0cm9r
ZVN0eWxlKCkgIT0gTm9TdHJva2UpIHsKLSAgICAgICAgc2V0Q29sb3IoY3IsIHN0cm9rZUNvbG9y
KCkpOwotICAgICAgICBGbG9hdFJlY3QgcihyZWN0KTsKLSAgICAgICAgci5pbmZsYXRlKC0uNWYp
OwotICAgICAgICBjYWlyb19yZWN0YW5nbGUoY3IsIHIueCgpLCByLnkoKSwgci53aWR0aCgpLCBy
LmhlaWdodCgpKTsKLSAgICAgICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgoY3IsIDEuMCk7Ci0gICAg
ICAgIGNhaXJvX3N0cm9rZShjcik7Ci0gICAgfQotCi0gICAgY2Fpcm9fcmVzdG9yZShjcik7Ci19
Ci0KLS8vIEZJWE1FOiBOb3cgdGhhdCB0aGlzIGlzIHJlZmFjdG9yZWQsIGl0IHNob3VsZCBiZSBz
aGFyZWQgYnkgYWxsIGNvbnRleHRzLgotc3RhdGljIHZvaWQgYWRqdXN0TGluZVRvUGl4ZWxCb3Vu
ZGFyaWVzKEZsb2F0UG9pbnQmIHAxLCBGbG9hdFBvaW50JiBwMiwgZmxvYXQgc3Ryb2tlV2lkdGgs
IFN0cm9rZVN0eWxlIHN0eWxlKQotewotICAgIC8vIEZvciBvZGQgd2lkdGhzLCB3ZSBhZGQgaW4g
MC41IHRvIHRoZSBhcHByb3ByaWF0ZSB4L3kgc28gdGhhdCB0aGUgZmxvYXQgYXJpdGhtZXRpYwot
ICAgIC8vIHdvcmtzIG91dC4gIEZvciBleGFtcGxlLCB3aXRoIGEgYm9yZGVyIHdpZHRoIG9mIDMs
IEtIVE1MIHdpbGwgcGFzcyB1cyAoeTEreTIpLzIsIGUuZy4sCi0gICAgLy8gKDUwKzUzKS8yID0g
MTAzLzIgPSA1MSB3aGVuIHdlIHdhbnQgNTEuNS4gIEl0IGlzIGFsd2F5cyB0cnVlIHRoYXQgYW4g
ZXZlbiB3aWR0aCBnYXZlCi0gICAgLy8gdXMgYSBwZXJmZWN0IHBvc2l0aW9uLCBidXQgYW4gb2Rk
IHdpZHRoIGdhdmUgdXMgYSBwb3NpdGlvbiB0aGF0IGlzIG9mZiBieSBleGFjdGx5IDAuNS4KLSAg
ICBpZiAoc3R5bGUgPT0gRG90dGVkU3Ryb2tlIHx8IHN0eWxlID09IERhc2hlZFN0cm9rZSkgewot
ICAgICAgICBpZiAocDEueCgpID09IHAyLngoKSkgewotICAgICAgICAgICAgcDEuc2V0WShwMS55
KCkgKyBzdHJva2VXaWR0aCk7Ci0gICAgICAgICAgICBwMi5zZXRZKHAyLnkoKSAtIHN0cm9rZVdp
ZHRoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHAxLnNldFgocDEu
eCgpICsgc3Ryb2tlV2lkdGgpOwotICAgICAgICAgICAgcDIuc2V0WChwMi54KCkgLSBzdHJva2VX
aWR0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihzdHJv
a2VXaWR0aCkgJSAyKSB7Ci0gICAgICAgIGlmIChwMS54KCkgPT0gcDIueCgpKSB7Ci0gICAgICAg
ICAgICAvLyBXZSdyZSBhIHZlcnRpY2FsIGxpbmUuICBBZGp1c3Qgb3VyIHguCi0gICAgICAgICAg
ICBwMS5zZXRYKHAxLngoKSArIDAuNSk7Ci0gICAgICAgICAgICBwMi5zZXRYKHAyLngoKSArIDAu
NSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBXZSdyZSBhIGhv
cml6b250YWwgbGluZS4gQWRqdXN0IG91ciB5LgotICAgICAgICAgICAgcDEuc2V0WShwMS55KCkg
KyAwLjUpOwotICAgICAgICAgICAgcDIuc2V0WShwMi55KCkgKyAwLjUpOwotICAgICAgICB9Ci0g
ICAgfQotfQotCi0vLyBUaGlzIGlzIG9ubHkgdXNlZCB0byBkcmF3IGJvcmRlcnMuCi12b2lkIEdy
YXBoaWNzQ29udGV4dDo6ZHJhd0xpbmUoY29uc3QgSW50UG9pbnQmIHBvaW50MSwgY29uc3QgSW50
UG9pbnQmIHBvaW50MikKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBTdHJva2VTdHlsZSBzdHlsZSA9IHN0cm9rZVN0eWxlKCk7Ci0gICAgaWYg
KHN0eWxlID09IE5vU3Ryb2tlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9
IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fc2F2ZShjcik7Ci0KLSAgICBmbG9hdCB3aWR0aCA9IHN0
cm9rZVRoaWNrbmVzcygpOwotICAgIGlmICh3aWR0aCA8IDEpCi0gICAgICAgIHdpZHRoID0gMTsK
LQotICAgIEZsb2F0UG9pbnQgcDEgPSBwb2ludDE7Ci0gICAgRmxvYXRQb2ludCBwMiA9IHBvaW50
MjsKLSAgICBib29sIGlzVmVydGljYWxMaW5lID0gKHAxLngoKSA9PSBwMi54KCkpOwotIAotICAg
IGFkanVzdExpbmVUb1BpeGVsQm91bmRhcmllcyhwMSwgcDIsIHdpZHRoLCBzdHlsZSk7Ci0gICAg
Y2Fpcm9fc2V0X2xpbmVfd2lkdGgoY3IsIHdpZHRoKTsKLQotICAgIGludCBwYXRXaWR0aCA9IDA7
Ci0gICAgc3dpdGNoIChzdHlsZSkgewotICAgIGNhc2UgTm9TdHJva2U6Ci0gICAgY2FzZSBTb2xp
ZFN0cm9rZToKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEb3R0ZWRTdHJva2U6Ci0gICAgICAg
IHBhdFdpZHRoID0gc3RhdGljX2Nhc3Q8aW50Pih3aWR0aCk7Ci0gICAgICAgIGJyZWFrOwotICAg
IGNhc2UgRGFzaGVkU3Ryb2tlOgotICAgICAgICBwYXRXaWR0aCA9IDMqc3RhdGljX2Nhc3Q8aW50
Pih3aWR0aCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHNldENvbG9yKGNyLCBzdHJv
a2VDb2xvcigpKTsKLQotICAgIGNhaXJvX3NldF9hbnRpYWxpYXMoY3IsIENBSVJPX0FOVElBTElB
U19OT05FKTsKLQotICAgIGlmIChwYXRXaWR0aCkgewotICAgICAgICAvLyBEbyBhIHJlY3QgZmls
bCBvZiBvdXIgZW5kcG9pbnRzLiAgVGhpcyBlbnN1cmVzIHdlIGFsd2F5cyBoYXZlIHRoZQotICAg
ICAgICAvLyBhcHBlYXJhbmNlIG9mIGJlaW5nIGEgYm9yZGVyLiAgV2UgdGhlbiBkcmF3IHRoZSBh
Y3R1YWwgZG90dGVkL2Rhc2hlZCBsaW5lLgotICAgICAgICBpZiAoaXNWZXJ0aWNhbExpbmUpIHsK
LSAgICAgICAgICAgIGZpbGxSZWN0U291cmNlT3ZlcihjciwgRmxvYXRSZWN0KHAxLngoKSAtIHdp
ZHRoLzIsIHAxLnkoKSAtIHdpZHRoLCB3aWR0aCwgd2lkdGgpLCBzdHJva2VDb2xvcigpKTsKLSAg
ICAgICAgICAgIGZpbGxSZWN0U291cmNlT3ZlcihjciwgRmxvYXRSZWN0KHAyLngoKSAtIHdpZHRo
LzIsIHAyLnkoKSwgd2lkdGgsIHdpZHRoKSwgc3Ryb2tlQ29sb3IoKSk7Ci0gICAgICAgIH0gZWxz
ZSB7Ci0gICAgICAgICAgICBmaWxsUmVjdFNvdXJjZU92ZXIoY3IsIEZsb2F0UmVjdChwMS54KCkg
LSB3aWR0aCwgcDEueSgpIC0gd2lkdGgvMiwgd2lkdGgsIHdpZHRoKSwgc3Ryb2tlQ29sb3IoKSk7
Ci0gICAgICAgICAgICBmaWxsUmVjdFNvdXJjZU92ZXIoY3IsIEZsb2F0UmVjdChwMi54KCksIHAy
LnkoKSAtIHdpZHRoLzIsIHdpZHRoLCB3aWR0aCksIHN0cm9rZUNvbG9yKCkpOwotICAgICAgICB9
Ci0KLSAgICAgICAgLy8gRXhhbXBsZTogODAgcGl4ZWxzIHdpdGggYSB3aWR0aCBvZiAzMCBwaXhl
bHMuCi0gICAgICAgIC8vIFJlbWFpbmRlciBpcyAyMC4gIFRoZSBtYXhpbXVtIHBpeGVscyBvZiBs
aW5lIHdlIGNvdWxkIHBhaW50Ci0gICAgICAgIC8vIHdpbGwgYmUgNTAgcGl4ZWxzLgotICAgICAg
ICBpbnQgZGlzdGFuY2UgPSAoaXNWZXJ0aWNhbExpbmUgPyAocG9pbnQyLnkoKSAtIHBvaW50MS55
KCkpIDogKHBvaW50Mi54KCkgLSBwb2ludDEueCgpKSkgLSAyKnN0YXRpY19jYXN0PGludD4od2lk
dGgpOwotICAgICAgICBpbnQgcmVtYWluZGVyID0gZGlzdGFuY2UlcGF0V2lkdGg7Ci0gICAgICAg
IGludCBjb3ZlcmFnZSA9IGRpc3RhbmNlLXJlbWFpbmRlcjsKLSAgICAgICAgaW50IG51bVNlZ21l
bnRzID0gY292ZXJhZ2UvcGF0V2lkdGg7Ci0KLSAgICAgICAgZmxvYXQgcGF0dGVybk9mZnNldCA9
IDA7Ci0gICAgICAgIC8vIFNwZWNpYWwgY2FzZSAxcHggZG90dGVkIGJvcmRlcnMgZm9yIHNwZWVk
LgotICAgICAgICBpZiAocGF0V2lkdGggPT0gMSkKLSAgICAgICAgICAgIHBhdHRlcm5PZmZzZXQg
PSAxLjA7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYm9vbCBldmVuTnVtYmVyT2ZTZWdt
ZW50cyA9IG51bVNlZ21lbnRzJTIgPT0gMDsKLSAgICAgICAgICAgIGlmIChyZW1haW5kZXIpCi0g
ICAgICAgICAgICAgICAgZXZlbk51bWJlck9mU2VnbWVudHMgPSAhZXZlbk51bWJlck9mU2VnbWVu
dHM7Ci0gICAgICAgICAgICBpZiAoZXZlbk51bWJlck9mU2VnbWVudHMpIHsKLSAgICAgICAgICAg
ICAgICBpZiAocmVtYWluZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdHRlcm5PZmZzZXQg
Kz0gcGF0V2lkdGggLSByZW1haW5kZXI7Ci0gICAgICAgICAgICAgICAgICAgIHBhdHRlcm5PZmZz
ZXQgKz0gcmVtYWluZGVyLzI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVs
c2UKLSAgICAgICAgICAgICAgICAgICAgcGF0dGVybk9mZnNldCA9IHBhdFdpZHRoLzI7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghZXZlbk51bWJlck9mU2VnbWVudHMpIHsK
LSAgICAgICAgICAgICAgICBpZiAocmVtYWluZGVyKQotICAgICAgICAgICAgICAgICAgICBwYXR0
ZXJuT2Zmc2V0ID0gKHBhdFdpZHRoIC0gcmVtYWluZGVyKS8yOwotICAgICAgICAgICAgfQotICAg
ICAgICB9Ci0KLSAgICAgICAgZG91YmxlIGRhc2ggPSBwYXRXaWR0aDsKLSAgICAgICAgY2Fpcm9f
c2V0X2Rhc2goY3IsICZkYXNoLCAxLCBwYXR0ZXJuT2Zmc2V0KTsKLSAgICB9Ci0KLSAgICBjYWly
b19tb3ZlX3RvKGNyLCBwMS54KCksIHAxLnkoKSk7Ci0gICAgY2Fpcm9fbGluZV90byhjciwgcDIu
eCgpLCBwMi55KCkpOwotCi0gICAgY2Fpcm9fc3Ryb2tlKGNyKTsKLSAgICBjYWlyb19yZXN0b3Jl
KGNyKTsKLX0KLQotLy8gVGhpcyBtZXRob2QgaXMgb25seSB1c2VkIHRvIGRyYXcgdGhlIGxpdHRs
ZSBjaXJjbGVzIHVzZWQgaW4gbGlzdHMuCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0VsbGlw
c2UoY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fp
cm9fc2F2ZShjcik7Ci0gICAgZmxvYXQgeVJhZGl1cyA9IC41ICogcmVjdC5oZWlnaHQoKTsKLSAg
ICBmbG9hdCB4UmFkaXVzID0gLjUgKiByZWN0LndpZHRoKCk7Ci0gICAgY2Fpcm9fdHJhbnNsYXRl
KGNyLCByZWN0LngoKSArIHhSYWRpdXMsIHJlY3QueSgpICsgeVJhZGl1cyk7Ci0gICAgY2Fpcm9f
c2NhbGUoY3IsIHhSYWRpdXMsIHlSYWRpdXMpOwotICAgIGNhaXJvX2FyYyhjciwgMC4sIDAuLCAx
LiwgMC4sIDIgKiBNX1BJKTsKLSAgICBjYWlyb19yZXN0b3JlKGNyKTsKLQotICAgIGlmIChmaWxs
Q29sb3IoKS5hbHBoYSgpKSB7Ci0gICAgICAgIHNldENvbG9yKGNyLCBmaWxsQ29sb3IoKSk7Ci0g
ICAgICAgIGNhaXJvX2ZpbGxfcHJlc2VydmUoY3IpOwotICAgIH0KLQotICAgIGlmIChzdHJva2VT
dHlsZSgpICE9IE5vU3Ryb2tlKSB7Ci0gICAgICAgIHNldENvbG9yKGNyLCBzdHJva2VDb2xvcigp
KTsKLSAgICAgICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgoY3IsIHN0cm9rZVRoaWNrbmVzcygpKTsK
LSAgICAgICAgY2Fpcm9fc3Ryb2tlKGNyKTsKLSAgICB9Ci0KLSAgICBjYWlyb19uZXdfcGF0aChj
cik7Ci19Ci0KLS8vIEZJWE1FOiBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIGFkanVzdGVkIHRv
IG1hdGNoIHRoZSBmdW5jdGlvbmFsaXR5IG9uIHRoZSBNYWMgc2lkZS4KLXZvaWQgR3JhcGhpY3ND
b250ZXh0OjpzdHJva2VBcmMoY29uc3QgSW50UmVjdCYgcmVjdCwgaW50IHN0YXJ0QW5nbGUsIGlu
dCBhbmdsZVNwYW4pCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgaWYgKHN0cm9rZVN0eWxlKCkgPT0gTm9TdHJva2UpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIGludCB4ID0gcmVjdC54KCk7Ci0gICAgaW50IHkgPSByZWN0LnkoKTsKLSAgICBm
bG9hdCB3ID0gcmVjdC53aWR0aCgpOwotI2lmIDAgLy8gRklYTUU6IHVudXNlZCBzbyBmYXIKLSAg
ICBmbG9hdCBoID0gcmVjdC5oZWlnaHQoKTsKLSAgICBmbG9hdCBzY2FsZUZhY3RvciA9IGggLyB3
OwotICAgIGZsb2F0IHJldmVyc2VTY2FsZUZhY3RvciA9IHcgLyBoOwotI2VuZGlmCi0gICAgZmxv
YXQgciA9IHcgLyAyOwotICAgIGZsb2F0IGZhID0gc3RhcnRBbmdsZTsKLSAgICBmbG9hdCBmYWxl
biA9ICBmYSArIGFuZ2xlU3BhbjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLSAg
ICBjYWlyb19zYXZlKGNyKTsKLSAgICBjYWlyb19hcmNfbmVnYXRpdmUoY3IsIHggKyByLCB5ICsg
ciwgciwgLWZhICogTV9QSS8xODAsIC1mYWxlbiAqIE1fUEkvMTgwKTsKLSAgICBzZXRDb2xvcihj
ciwgc3Ryb2tlQ29sb3IoKSk7Ci0gICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgoY3IsIHN0cm9rZVRo
aWNrbmVzcygpKTsKLSAgICBjYWlyb19zdHJva2UoY3IpOwotICAgIGNhaXJvX3Jlc3RvcmUoY3Ip
OwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0NvbnZleFBvbHlnb24oc2l6ZV90IG5w
b2ludHMsIGNvbnN0IEZsb2F0UG9pbnQqIHBvaW50cywgYm9vbCBzaG91bGRBbnRpYWxpYXMpCi17
Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYg
KG5wb2ludHMgPD0gMSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2Rh
dGEtPmNyOwotCi0gICAgY2Fpcm9fc2F2ZShjcik7Ci0gICAgY2Fpcm9fc2V0X2FudGlhbGlhcyhj
ciwgc2hvdWxkQW50aWFsaWFzID8gQ0FJUk9fQU5USUFMSUFTX0RFRkFVTFQgOiBDQUlST19BTlRJ
QUxJQVNfTk9ORSk7Ci0gICAgY2Fpcm9fbW92ZV90byhjciwgcG9pbnRzWzBdLngoKSwgcG9pbnRz
WzBdLnkoKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBucG9pbnRzOyBpKyspCi0gICAg
ICAgIGNhaXJvX2xpbmVfdG8oY3IsIHBvaW50c1tpXS54KCksIHBvaW50c1tpXS55KCkpOwotICAg
IGNhaXJvX2Nsb3NlX3BhdGgoY3IpOwotCi0gICAgaWYgKGZpbGxDb2xvcigpLmFscGhhKCkpIHsK
LSAgICAgICAgc2V0Q29sb3IoY3IsIGZpbGxDb2xvcigpKTsKLSAgICAgICAgY2Fpcm9fc2V0X2Zp
bGxfcnVsZShjciwgQ0FJUk9fRklMTF9SVUxFX0VWRU5fT0REKTsKLSAgICAgICAgY2Fpcm9fZmls
bF9wcmVzZXJ2ZShjcik7Ci0gICAgfQotCi0gICAgaWYgKHN0cm9rZVN0eWxlKCkgIT0gTm9TdHJv
a2UpIHsKLSAgICAgICAgc2V0Q29sb3IoY3IsIHN0cm9rZUNvbG9yKCkpOwotICAgICAgICBjYWly
b19zZXRfbGluZV93aWR0aChjciwgc3Ryb2tlVGhpY2tuZXNzKCkpOwotICAgICAgICBjYWlyb19z
dHJva2UoY3IpOworICAgICAgICAsIGV4cG9zZSgwKQorI2VsaWYgUExBVEZPUk0oV0lOKQorICAg
ICAgICAvLyBOT1RFOiAgVGhlc2UgbWF5IG5vdGUgYmUgbmVlZGVkOiByZXZpZXcgYW5kIHJlbW92
ZSBvbmNlIENhaXJvIGltcGxlbWVudGF0aW9uIGlzIGNvbXBsZXRlCisgICAgICAgICwgbV9oZGMo
MCkKKyAgICAgICAgLCBtX3RyYW5zcGFyZW5jeUNvdW50KDApCisjZW5kaWYKKyAgICB7CiAgICAg
fQogCi0gICAgY2Fpcm9fbmV3X3BhdGgoY3IpOwotICAgIGNhaXJvX3Jlc3RvcmUoY3IpOwotfQot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJlY3QoY29uc3QgSW50UmVjdCYgcmVjdCwgY29u
c3QgQ29sb3ImIGNvbG9yKQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAg
IHJldHVybjsKLQotICAgIGlmIChjb2xvci5hbHBoYSgpKQotICAgICAgICBmaWxsUmVjdFNvdXJj
ZU92ZXIobV9kYXRhLT5jciwgcmVjdCwgY29sb3IpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4
dDo6ZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0LCBjb25zdCBDb2xvciYgY29sb3IpCi17
Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYg
KGNvbG9yLmFscGhhKCkpCi0gICAgICAgIGZpbGxSZWN0U291cmNlT3ZlcihtX2RhdGEtPmNyLCBy
ZWN0LCBjb2xvcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwKGNvbnN0IEludFJl
Y3QmIHJlY3QpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotICAgIGNhaXJvX3JlY3RhbmdsZShj
ciwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOwotICAg
IGNhaXJvX2ZpbGxfcnVsZV90IHNhdmVkRmlsbFJ1bGUgPSBjYWlyb19nZXRfZmlsbF9ydWxlKGNy
KTsKLSAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNyLCBDQUlST19GSUxMX1JVTEVfV0lORElORyk7
Ci0gICAgY2Fpcm9fY2xpcChjcik7Ci0gICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgc2F2ZWRG
aWxsUnVsZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3Rm9jdXNSaW5nKGNvbnN0
IENvbG9yJiBjb2xvcikKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBpbnQgcmFkaXVzID0gKGZvY3VzUmluZ1dpZHRoKCkgLSAxKSAvIDI7Ci0g
ICAgaW50IG9mZnNldCA9IHJhZGl1cyArIGZvY3VzUmluZ09mZnNldCgpOwotCi0gICAgY29uc3Qg
VmVjdG9yPEludFJlY3Q+JiByZWN0cyA9IGZvY3VzUmluZ1JlY3RzKCk7Ci0gICAgdW5zaWduZWQg
cmVjdENvdW50ID0gcmVjdHMuc2l6ZSgpOwotICAgIEludFJlY3QgZmluYWxGb2N1c1JlY3Q7Ci0g
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlY3RDb3VudDsgaSsrKSB7Ci0gICAgICAgIElu
dFJlY3QgZm9jdXNSZWN0ID0gcmVjdHNbaV07Ci0gICAgICAgIGZvY3VzUmVjdC5pbmZsYXRlKG9m
ZnNldCk7Ci0gICAgICAgIGZpbmFsRm9jdXNSZWN0LnVuaXRlKGZvY3VzUmVjdCk7CisgICAgfkdy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpCisgICAgeworICAgICAgICBjYWlyb19kZXN0
cm95KGNyKTsKICAgICB9CiAKLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fp
cm9fc2F2ZShjcik7Ci0gICAgLy8gRklYTUU6IFRoZXNlIHJlY3RzIHNob3VsZCBiZSByb3VuZGVk
Ci0gICAgY2Fpcm9fcmVjdGFuZ2xlKGNyLCBmaW5hbEZvY3VzUmVjdC54KCksIGZpbmFsRm9jdXNS
ZWN0LnkoKSwgZmluYWxGb2N1c1JlY3Qud2lkdGgoKSwgZmluYWxGb2N1c1JlY3QuaGVpZ2h0KCkp
OwotCi0gICAgLy8gRm9yY2UgdGhlIGFscGhhIHRvIDUwJS4gIFRoaXMgbWF0Y2hlcyB3aGF0IHRo
ZSBNYWMgZG9lcyB3aXRoIG91dGxpbmUgcmluZ3MuCi0gICAgQ29sb3IgcmluZ0NvbG9yKGNvbG9y
LnJlZCgpLCBjb2xvci5ncmVlbigpLCBjb2xvci5ibHVlKCksIDEyNyk7Ci0gICAgc2V0Q29sb3Io
Y3IsIHJpbmdDb2xvcik7Ci0gICAgY2Fpcm9fc3Ryb2tlKGNyKTsKLSAgICBjYWlyb19yZXN0b3Jl
KGNyKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yVGV4dChjb25zdCBJ
bnRQb2ludCYgb3JpZ2luLCBpbnQgd2lkdGgsIGJvb2wgcHJpbnRpbmcpCi17Ci0gICAgaWYgKHBh
aW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gVGhpcyBpcyBhIHdv
cmthcm91bmQgZm9yIGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NjU5
Ci0gICAgU3Ryb2tlU3R5bGUgc2F2ZWRTdHJva2VTdHlsZSA9IHN0cm9rZVN0eWxlKCk7Ci0gICAg
c2V0U3Ryb2tlU3R5bGUoU29saWRTdHJva2UpOwotCi0gICAgSW50UG9pbnQgZW5kUG9pbnQgPSBv
cmlnaW4gKyBJbnRTaXplKHdpZHRoLCAwKTsKLSAgICBkcmF3TGluZShvcmlnaW4sIGVuZFBvaW50
KTsKLQotICAgIHNldFN0cm9rZVN0eWxlKHNhdmVkU3Ryb2tlU3R5bGUpOwotfQotCi12b2lkIEdy
YXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JNaXNzcGVsbGluZ09yQmFkR3JhbW1hcihjb25zdCBJ
bnRQb2ludCYgb3JpZ2luLCBpbnQgd2lkdGgsIGJvb2wgZ3JhbW1hcikKLXsKLSAgICBpZiAocGFp
bnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSNpZiBQTEFURk9STShHVEspCi0g
ICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotICAgIGNhaXJvX3NhdmUoY3IpOwotCi0gICAg
Ly8gQ29udmVudGlvbiBpcyBncmVlbiBmb3IgZ3JhbW1hciwgcmVkIGZvciBzcGVsbGluZwotICAg
IC8vIFRoZXNlIG5lZWQgdG8gYmVjb21lIGNvbmZpZ3VyYWJsZQotICAgIGlmIChncmFtbWFyKQot
ICAgICAgICBjYWlyb19zZXRfc291cmNlX3JnYihjciwgMCwgMSwgMCk7Ci0gICAgZWxzZQotICAg
ICAgICBjYWlyb19zZXRfc291cmNlX3JnYihjciwgMSwgMCwgMCk7Ci0KLSAgICAvLyBXZSBpZ25v
cmUgbW9zdCBvZiB0aGUgcHJvdmlkZWQgY29uc3RhbnRzIGluIGZhdm91ciBvZiB0aGUgcGxhdGZv
cm0gc3R5bGUKLSAgICBwYW5nb19jYWlyb19zaG93X2Vycm9yX3VuZGVybGluZShjciwgb3JpZ2lu
LngoKSwgb3JpZ2luLnkoKSwgd2lkdGgsIGNNaXNzcGVsbGluZ0xpbmVUaGlja25lc3MpOwotCi0g
ICAgY2Fpcm9fcmVzdG9yZShjcik7Ci0jZWxzZQotICAgIG5vdEltcGxlbWVudGVkKCk7CisjaWYg
UExBVEZPUk0oV0lOKQorICAgIC8vIE9uIFdpbmRvd3MsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBI
REMgZm9yIGZvcm0gY29udHJvbHMgdG8gZHJhdyBpbiB0aGUgcmlnaHQgcGxhY2UuCisgICAgdm9p
ZCBiZWdpblRyYW5zcGFyZW5jeUxheWVyKCkgeyBtX3RyYW5zcGFyZW5jeUNvdW50Kys7IH0KKyAg
ICB2b2lkIGVuZFRyYW5zcGFyZW5jeUxheWVyKCkgeyBtX3RyYW5zcGFyZW5jeUNvdW50LS07IH0K
ICNlbmRpZgotfQogCi1GbG9hdFJlY3QgR3JhcGhpY3NDb250ZXh0Ojpyb3VuZFRvRGV2aWNlUGl4
ZWxzKGNvbnN0IEZsb2F0UmVjdCYgZnJlY3QpCi17Ci0gICAgRmxvYXRSZWN0IHJlc3VsdDsKLSAg
ICBkb3VibGUgeCA9IGZyZWN0LngoKTsKLSAgICBkb3VibGUgeSA9IGZyZWN0LnkoKTsKLSAgICBj
YWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fdXNlcl90b19kZXZpY2UoY3IsICZ4
LCAmeSk7Ci0gICAgeCA9IHJvdW5kKHgpOwotICAgIHkgPSByb3VuZCh5KTsKLSAgICBjYWlyb19k
ZXZpY2VfdG9fdXNlcihjciwgJngsICZ5KTsKLSAgICByZXN1bHQuc2V0WChzdGF0aWNfY2FzdDxm
bG9hdD4oeCkpOwotICAgIHJlc3VsdC5zZXRZKHN0YXRpY19jYXN0PGZsb2F0Pih5KSk7Ci0gICAg
eCA9IGZyZWN0LndpZHRoKCk7Ci0gICAgeSA9IGZyZWN0LmhlaWdodCgpOwotICAgIGNhaXJvX3Vz
ZXJfdG9fZGV2aWNlX2Rpc3RhbmNlKGNyLCAmeCwgJnkpOwotICAgIHggPSByb3VuZCh4KTsKLSAg
ICB5ID0gcm91bmQoeSk7Ci0gICAgY2Fpcm9fZGV2aWNlX3RvX3VzZXJfZGlzdGFuY2UoY3IsICZ4
LCAmeSk7Ci0gICAgcmVzdWx0LnNldFdpZHRoKHN0YXRpY19jYXN0PGZsb2F0Pih4KSk7Ci0gICAg
cmVzdWx0LnNldEhlaWdodChzdGF0aWNfY2FzdDxmbG9hdD4oeSkpOwotICAgIHJldHVybiByZXN1
bHQ7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0Ojp0cmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQg
eSkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fdHJhbnNsYXRlKGNyLCB4LCB5
KTsKLX0KLQotSW50UG9pbnQgR3JhcGhpY3NDb250ZXh0OjpvcmlnaW4oKQotewotICAgIGNhaXJv
X21hdHJpeF90IG1hdHJpeDsKLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fp
cm9fZ2V0X21hdHJpeChjciwgJm1hdHJpeCk7Ci0gICAgcmV0dXJuIEludFBvaW50KHN0YXRpY19j
YXN0PGludD4obWF0cml4LngwKSwgc3RhdGljX2Nhc3Q8aW50PihtYXRyaXgueTApKTsKLX0KLQot
dm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtRmlsbENvbG9yKGNvbnN0IENvbG9yJiBj
b2wpCi17Ci0gICAgLy8gRklYTUU6IHRoaXMgaXMgcHJvYmFibHkgYSBuby1vcCBidXQgSSdtIG5v
dCBzdXJlCi0gICAgLy8gbm90SW1wbGVtZW50ZWQoKTsgLy8gY29tbWVudGVkLW91dCBiZWNhdXNl
IGl0J3MgY2hhdHR5IGFuZCBjbHV0dGVycyBvdXRwdXQKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQ6OnNldFBsYXRmb3JtU3Ryb2tlQ29sb3IoY29uc3QgQ29sb3ImIGNvbCkKLXsKLSAgICAvLyBG
SVhNRTogdGhpcyBpcyBwcm9iYWJseSBhIG5vLW9wIGJ1dCBJJ20gbm90IHN1cmUKLSAgICAvL25v
dEltcGxlbWVudGVkKCk7IC8vIGNvbW1lbnRlZC1vdXQgYmVjYXVzZSBpdCdzIGNoYXR0eSBhbmQg
Y2x1dHRlcnMgb3V0cHV0Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVN0
cm9rZVRoaWNrbmVzcyhmbG9hdCBzdHJva2VUaGlja25lc3MpCi17Ci0gICAgaWYgKHBhaW50aW5n
RGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgo
bV9kYXRhLT5jciwgc3Ryb2tlVGhpY2tuZXNzKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6
OnNldFBsYXRmb3JtU3Ryb2tlU3R5bGUoY29uc3QgU3Ryb2tlU3R5bGUmIHN0cm9rZVN0eWxlKQot
ewotICAgIHN0YXRpYyBkb3VibGUgZGFzaFBhdHRlcm5bXSA9IHs1LjAsIDUuMH07Ci0gICAgc3Rh
dGljIGRvdWJsZSBkb3RQYXR0ZXJuW10gPSB7MS4wLCAxLjB9OwotCi0gICAgaWYgKHBhaW50aW5n
RGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgc3dpdGNoIChzdHJva2VTdHlsZSkg
ewotICAgIGNhc2UgTm9TdHJva2U6Ci0gICAgICAgIC8vIEZJWE1FOiBpcyBpdCB0aGUgcmlnaHQg
d2F5IHRvIGVtdWxhdGUgTm9TdHJva2U/Ci0gICAgICAgIGNhaXJvX3NldF9saW5lX3dpZHRoKG1f
ZGF0YS0+Y3IsIDApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFNvbGlkU3Ryb2tlOgotICAg
ICAgICBjYWlyb19zZXRfZGFzaChtX2RhdGEtPmNyLCAwLCAwLCAwKTsKLSAgICAgICAgYnJlYWs7
Ci0gICAgY2FzZSBEb3R0ZWRTdHJva2U6Ci0gICAgICAgIGNhaXJvX3NldF9kYXNoKG1fZGF0YS0+
Y3IsIGRvdFBhdHRlcm4sIDIsIDApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERhc2hlZFN0
cm9rZToKLSAgICAgICAgY2Fpcm9fc2V0X2Rhc2gobV9kYXRhLT5jciwgZGFzaFBhdHRlcm4sIDIs
IDApOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBub3RJbXBsZW1lbnRl
ZCgpOwotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0Ojpz
ZXRVUkxGb3JSZWN0KGNvbnN0IEtVUkwmIGxpbmssIGNvbnN0IEludFJlY3QmIGRlc3RSZWN0KQot
ewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0Ojpjb25j
YXRDVE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFuc2Zvcm0pCi17Ci0gICAgaWYgKHBhaW50
aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2Rh
dGEtPmNyOwotICAgIGNvbnN0IGNhaXJvX21hdHJpeF90KiBtYXRyaXggPSByZWludGVycHJldF9j
YXN0PGNvbnN0IGNhaXJvX21hdHJpeF90Kj4oJnRyYW5zZm9ybSk7Ci0gICAgY2Fpcm9fdHJhbnNm
b3JtKGNyLCBtYXRyaXgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6YWRkSW5uZXJSb3Vu
ZGVkUmVjdENsaXAoY29uc3QgSW50UmVjdCYgcmVjdCwgaW50IHRoaWNrbmVzcykKLXsKLSAgICBp
ZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjbGlwKHJlY3Qp
OwotCi0gICAgUGF0aCBwOwotICAgIEZsb2F0UmVjdCByKHJlY3QpOwotICAgIC8vIEFkZCBvdXRl
ciBlbGxpcHNlCi0gICAgcC5hZGRFbGxpcHNlKHIpOwotICAgIC8vIEFkZCBpbm5lciBlbGxpcHNl
Ci0gICAgci5pbmZsYXRlKC10aGlja25lc3MpOwotICAgIHAuYWRkRWxsaXBzZShyKTsKLSAgICBh
ZGRQYXRoKHApOwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotICAgIGNhaXJvX2Zp
bGxfcnVsZV90IHNhdmVkRmlsbFJ1bGUgPSBjYWlyb19nZXRfZmlsbF9ydWxlKGNyKTsKLSAgICBj
YWlyb19zZXRfZmlsbF9ydWxlKGNyLCBDQUlST19GSUxMX1JVTEVfRVZFTl9PREQpOwotICAgIGNh
aXJvX2NsaXAoY3IpOwotICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIHNhdmVkRmlsbFJ1bGUp
OwotfQotCi0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRTaGFkb3coSW50U2l6ZSBjb25zdCYs
IGludCwgQ29sb3IgY29uc3QmKQotewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci19Ci0KLXZvaWQg
R3JhcGhpY3NDb250ZXh0OjpjbGVhclNoYWRvdygpCi17Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmJlZ2luVHJhbnNwYXJlbmN5TGF5ZXIoZmxvYXQg
b3BhY2l0eSkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fcHVzaF9ncm91cChj
cik7Ci0gICAgbV9kYXRhLT5sYXllcnMuYXBwZW5kKG9wYWNpdHkpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDo6ZW5kVHJhbnNwYXJlbmN5TGF5ZXIoKQotewotICAgIGlmIChwYWludGluZ0Rp
c2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5j
cjsKLQotICAgIGNhaXJvX3BvcF9ncm91cF90b19zb3VyY2UoY3IpOwotICAgIGNhaXJvX3BhaW50
X3dpdGhfYWxwaGEoY3IsIG1fZGF0YS0+bGF5ZXJzLmxhc3QoKSk7Ci0gICAgbV9kYXRhLT5sYXll
cnMucmVtb3ZlTGFzdCgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xlYXJSZWN0KGNv
bnN0IEZsb2F0UmVjdCYgcmVjdCkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0KLSAgICBjYWly
b19zYXZlKGNyKTsKLSAgICBjYWlyb19yZWN0YW5nbGUoY3IsIHJlY3QueCgpLCByZWN0LnkoKSwg
cmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKLSAgICBjYWlyb19zZXRfb3BlcmF0b3IoY3Is
IENBSVJPX09QRVJBVE9SX0NMRUFSKTsKLSAgICBjYWlyb19maWxsKGNyKTsKLSAgICBjYWlyb19y
ZXN0b3JlKGNyKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnN0cm9rZVJlY3QoY29uc3Qg
RmxvYXRSZWN0JiByZWN0LCBmbG9hdCB3aWR0aCkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxl
ZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0g
ICAgY2Fpcm9fc2F2ZShjcik7Ci0gICAgY2Fpcm9fcmVjdGFuZ2xlKGNyLCByZWN0LngoKSwgcmVj
dC55KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7Ci0gICAgc2V0Q29sb3IoY3IsIHN0
cm9rZUNvbG9yKCkpOwotICAgIGNhaXJvX3NldF9saW5lX3dpZHRoKGNyLCB3aWR0aCk7Ci0gICAg
Y2Fpcm9fc3Ryb2tlKGNyKTsKLSAgICBjYWlyb19yZXN0b3JlKGNyKTsKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQ6OnNldExpbmVDYXAoTGluZUNhcCBsaW5lQ2FwKQotewotICAgIGlmIChwYWlu
dGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX2xpbmVfY2FwX3Qg
Y2Fpcm9DYXAgPSBDQUlST19MSU5FX0NBUF9CVVRUOwotICAgIHN3aXRjaCAobGluZUNhcCkgewot
ICAgICAgICBjYXNlIEJ1dHRDYXA6Ci0gICAgICAgICAgICAvLyBuby1vcAotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIGNhc2UgUm91bmRDYXA6Ci0gICAgICAgICAgICBjYWlyb0NhcCA9IENB
SVJPX0xJTkVfQ0FQX1JPVU5EOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU3F1
YXJlQ2FwOgotICAgICAgICAgICAgY2Fpcm9DYXAgPSBDQUlST19MSU5FX0NBUF9TUVVBUkU7Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY2Fpcm9fc2V0X2xpbmVfY2FwKG1fZGF0YS0+
Y3IsIGNhaXJvQ2FwKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldExpbmVKb2luKExp
bmVKb2luIGxpbmVKb2luKQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAg
IHJldHVybjsKLQotICAgIGNhaXJvX2xpbmVfam9pbl90IGNhaXJvSm9pbiA9IENBSVJPX0xJTkVf
Sk9JTl9NSVRFUjsKLSAgICBzd2l0Y2ggKGxpbmVKb2luKSB7Ci0gICAgICAgIGNhc2UgTWl0ZXJK
b2luOgotICAgICAgICAgICAgLy8gbm8tb3AKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBj
YXNlIFJvdW5kSm9pbjoKLSAgICAgICAgICAgIGNhaXJvSm9pbiA9IENBSVJPX0xJTkVfSk9JTl9S
T1VORDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJldmVsSm9pbjoKLSAgICAg
ICAgICAgIGNhaXJvSm9pbiA9IENBSVJPX0xJTkVfSk9JTl9CRVZFTDsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgIH0KLSAgICBjYWlyb19zZXRfbGluZV9qb2luKG1fZGF0YS0+Y3IsIGNhaXJvSm9p
bik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRNaXRlckxpbWl0KGZsb2F0IG1pdGVy
KQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAg
IGNhaXJvX3NldF9taXRlcl9saW1pdChtX2RhdGEtPmNyLCBtaXRlcik7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpzZXRBbHBoYShmbG9hdCkKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwot
fQotCi1zdGF0aWMgaW5saW5lIGNhaXJvX29wZXJhdG9yX3QgdG9DYWlyb09wZXJhdG9yKENvbXBv
c2l0ZU9wZXJhdG9yIG9wKQotewotICAgIHN3aXRjaCAob3ApIHsKLSAgICAgICAgY2FzZSBDb21w
b3NpdGVDbGVhcjoKLSAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9DTEVBUjsKLSAg
ICAgICAgY2FzZSBDb21wb3NpdGVDb3B5OgotICAgICAgICAgICAgcmV0dXJuIENBSVJPX09QRVJB
VE9SX1NPVVJDRTsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VPdmVyOgotICAgICAgICAg
ICAgcmV0dXJuIENBSVJPX09QRVJBVE9SX09WRVI7Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRlU291
cmNlSW46Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfSU47Ci0gICAgICAgIGNh
c2UgQ29tcG9zaXRlU291cmNlT3V0OgotICAgICAgICAgICAgcmV0dXJuIENBSVJPX09QRVJBVE9S
X09VVDsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VBdG9wOgotICAgICAgICAgICAgcmV0
dXJuIENBSVJPX09QRVJBVE9SX0FUT1A7Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRlRGVzdGluYXRp
b25PdmVyOgotICAgICAgICAgICAgcmV0dXJuIENBSVJPX09QRVJBVE9SX0RFU1RfT1ZFUjsKLSAg
ICAgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlvbkluOgotICAgICAgICAgICAgcmV0dXJuIENB
SVJPX09QRVJBVE9SX0RFU1RfSU47Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRlRGVzdGluYXRpb25P
dXQ6Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfREVTVF9PVVQ7Ci0gICAgICAg
IGNhc2UgQ29tcG9zaXRlRGVzdGluYXRpb25BdG9wOgotICAgICAgICAgICAgcmV0dXJuIENBSVJP
X09QRVJBVE9SX0RFU1RfQVRPUDsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVYT1I6Ci0gICAgICAg
ICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfWE9SOwotICAgICAgICBjYXNlIENvbXBvc2l0ZVBs
dXNEYXJrZXI6Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfU0FUVVJBVEU7Ci0g
ICAgICAgIGNhc2UgQ29tcG9zaXRlSGlnaGxpZ2h0OgotICAgICAgICAgICAgLy8gVGhlcmUgaXMg
bm8gQ2Fpcm8gZXF1aXZhbGVudCBmb3IgQ29tcG9zaXRlSGlnaGxpZ2h0LgotICAgICAgICAgICAg
cmV0dXJuIENBSVJPX09QRVJBVE9SX09WRVI7Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRlUGx1c0xp
Z2h0ZXI6Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfQUREOwotICAgICAgICBk
ZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIENBSVJPX09QRVJBVE9SX1NPVVJDRTsKLSAgICB9
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRDb21wb3NpdGVPcGVyYXRpb24oQ29tcG9z
aXRlT3BlcmF0b3Igb3ApCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgY2Fpcm9fc2V0X29wZXJhdG9yKG1fZGF0YS0+Y3IsIHRvQ2Fpcm9PcGVy
YXRvcihvcCkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6YmVnaW5QYXRoKCkKLXsKLSAg
ICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjYWlyb190
KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fbmV3X3BhdGgoY3IpOwotfQotCi12b2lkIEdy
YXBoaWNzQ29udGV4dDo6YWRkUGF0aChjb25zdCBQYXRoJiBwYXRoKQotewotICAgIGlmIChwYWlu
dGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9k
YXRhLT5jcjsKLSAgICBjYWlyb19wYXRoX3QqIHAgPSBjYWlyb19jb3B5X3BhdGgocGF0aC5wbGF0
Zm9ybVBhdGgoKS0+bV9jcik7Ci0gICAgY2Fpcm9fYXBwZW5kX3BhdGgoY3IsIHApOwotICAgIGNh
aXJvX3BhdGhfZGVzdHJveShwKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXAoY29u
c3QgUGF0aCYgcGF0aCkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fcGF0aF90
KiBwID0gY2Fpcm9fY29weV9wYXRoKHBhdGgucGxhdGZvcm1QYXRoKCktPm1fY3IpOwotICAgIGNh
aXJvX2FwcGVuZF9wYXRoKGNyLCBwKTsKLSAgICBjYWlyb19wYXRoX2Rlc3Ryb3kocCk7Ci0gICAg
Y2Fpcm9fZmlsbF9ydWxlX3Qgc2F2ZWRGaWxsUnVsZSA9IGNhaXJvX2dldF9maWxsX3J1bGUoY3Ip
OwotICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIENBSVJPX0ZJTExfUlVMRV9XSU5ESU5HKTsK
LSAgICBjYWlyb19jbGlwKGNyKTsKLSAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNyLCBzYXZlZEZp
bGxSdWxlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBPdXQoY29uc3QgUGF0aCYg
cGF0aCkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgZG91YmxlIHgxLCB5MSwgeDIsIHky
OwotICAgIGNhaXJvX2NsaXBfZXh0ZW50cyhjciwgJngxLCAmeTEsICZ4MiwgJnkyKTsKLSAgICBj
YWlyb19yZWN0YW5nbGUoY3IsIHgxLCB5MSwgeDIgLSB4MSwgeTIgLSB5MSk7Ci0gICAgYWRkUGF0
aChwYXRoKTsKLQotICAgIGNhaXJvX2ZpbGxfcnVsZV90IHNhdmVkRmlsbFJ1bGUgPSBjYWlyb19n
ZXRfZmlsbF9ydWxlKGNyKTsKLSAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNyLCBDQUlST19GSUxM
X1JVTEVfRVZFTl9PREQpOwotICAgIGNhaXJvX2NsaXAoY3IpOwotICAgIGNhaXJvX3NldF9maWxs
X3J1bGUoY3IsIHNhdmVkRmlsbFJ1bGUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6cm90
YXRlKGZsb2F0IHJhZGlhbnMpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fcm90YXRlKG1fZGF0YS0+Y3IsIHJhZGlhbnMpOwotfQot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDo6c2NhbGUoY29uc3QgRmxvYXRTaXplJiBzaXplKQotewot
ICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJv
X3NjYWxlKG1fZGF0YS0+Y3IsIHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSk7Ci19Ci0KLXZv
aWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwT3V0KGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgaWYg
KHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fdCogY3Ig
PSBtX2RhdGEtPmNyOwotICAgIGRvdWJsZSB4MSwgeTEsIHgyLCB5MjsKLSAgICBjYWlyb19jbGlw
X2V4dGVudHMoY3IsICZ4MSwgJnkxLCAmeDIsICZ5Mik7Ci0gICAgY2Fpcm9fcmVjdGFuZ2xlKGNy
LCB4MSwgeDIsIHgyIC0geDEsIHkyIC0geTEpOwotICAgIGNhaXJvX3JlY3RhbmdsZShjciwgci54
KCksIHIueSgpLCByLndpZHRoKCksIHIuaGVpZ2h0KCkpOwotICAgIGNhaXJvX2ZpbGxfcnVsZV90
IHNhdmVkRmlsbFJ1bGUgPSBjYWlyb19nZXRfZmlsbF9ydWxlKGNyKTsKLSAgICBjYWlyb19zZXRf
ZmlsbF9ydWxlKGNyLCBDQUlST19GSUxMX1JVTEVfRVZFTl9PREQpOwotICAgIGNhaXJvX2NsaXAo
Y3IpOwotICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIHNhdmVkRmlsbFJ1bGUpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcE91dEVsbGlwc2VJblJlY3QoY29uc3QgSW50UmVjdCYg
cikKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBQYXRoIHA7Ci0gICAgcC5hZGRFbGxpcHNlKHIpOwotICAgIGNsaXBPdXQocCk7Ci19Ci0KLXZv
aWQgR3JhcGhpY3NDb250ZXh0OjpmaWxsUm91bmRlZFJlY3QoY29uc3QgSW50UmVjdCYgciwgY29u
c3QgSW50U2l6ZSYgdG9wTGVmdCwgY29uc3QgSW50U2l6ZSYgdG9wUmlnaHQsIGNvbnN0IEludFNp
emUmIGJvdHRvbUxlZnQsIGNvbnN0IEludFNpemUmIGJvdHRvbVJpZ2h0LCBjb25zdCBDb2xvciYg
Y29sb3IpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotICAgIGNhaXJvX3NhdmUoY3IpOwotICAg
IGJlZ2luUGF0aCgpOwotICAgIGFkZFBhdGgoUGF0aDo6Y3JlYXRlUm91bmRlZFJlY3RhbmdsZShy
LCB0b3BMZWZ0LCB0b3BSaWdodCwgYm90dG9tTGVmdCwgYm90dG9tUmlnaHQpKTsKLSAgICBzZXRD
b2xvcihjciwgY29sb3IpOwotICAgIGNhaXJvX2ZpbGwoY3IpOwotICAgIGNhaXJvX3Jlc3RvcmUo
Y3IpOwotfQorICAgIGNhaXJvX3QqIGNyOworICAgIFZlY3RvcjxmbG9hdD4gbGF5ZXJzOwogCiAj
aWYgUExBVEZPUk0oR1RLKQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldEdka0V4cG9zZUV2ZW50
KEdka0V2ZW50RXhwb3NlKiBleHBvc2UpCi17Ci0gICAgbV9kYXRhLT5leHBvc2UgPSBleHBvc2U7
Ci19Ci0KLUdka0V2ZW50RXhwb3NlKiBHcmFwaGljc0NvbnRleHQ6Omdka0V4cG9zZUV2ZW50KCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gbV9kYXRhLT5leHBvc2U7Ci19Ci0KLUdka0RyYXdhYmxlKiBH
cmFwaGljc0NvbnRleHQ6Omdka0RyYXdhYmxlKCkgY29uc3QKLXsKLSAgICBpZiAoIW1fZGF0YS0+
ZXhwb3NlKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiBHREtfRFJBV0FCTEUobV9k
YXRhLT5leHBvc2UtPndpbmRvdyk7Ci19Ci0KLUludFBvaW50IEdyYXBoaWNzQ29udGV4dDo6dHJh
bnNsYXRlUG9pbnQoY29uc3QgSW50UG9pbnQmIHBvaW50KSBjb25zdAotewotICAgIGNhaXJvX21h
dHJpeF90IHRtOwotICAgIGNhaXJvX2dldF9tYXRyaXgobV9kYXRhLT5jciwgJnRtKTsKLSAgICBk
b3VibGUgeCA9IHBvaW50LngoKTsKLSAgICBkb3VibGUgeSA9IHBvaW50LnkoKTsKLQotICAgIGNh
aXJvX21hdHJpeF90cmFuc2Zvcm1fcG9pbnQoJnRtLCAmeCwgJnkpOwotICAgIHJldHVybiBJbnRQ
b2ludCh4LCB5KTsKLX0KKyAgICBHZGtFdmVudEV4cG9zZSogZXhwb3NlOworI2VsaWYgUExBVEZP
Uk0oV0lOKQorICAgIEhEQyBtX2hkYzsKKyAgICB1bnNpZ25lZCBtX3RyYW5zcGFyZW5jeUNvdW50
OwogI2VuZGlmCi0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRVc2VBbnRpYWxpYXNpbmcoYm9v
bCBlbmFibGUpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgLy8gV2hlbiB0cnVlLCB1c2UgdGhlIGRlZmF1bHQgQ2Fpcm8gYmFja2VuZCBhbnRp
YWxpYXMgbW9kZSAodXN1YWxseSB0aGlzCi0gICAgLy8gZW5hYmxlcyBzdGFuZGFyZCAnZ3JheXNj
YWxlJyBhbnRpYWxpYXNpbmcpOyBmYWxzZSB0byBleHBsaWNpdGx5IGRpc2FibGUKLSAgICAvLyBh
bnRpYWxpYXNpbmcuIFRoaXMgaXMgdGhlIHNhbWUgc3RyYXRlZ3kgYXMgdXNlZCBpbiBkcmF3Q29u
dmV4UG9seWdvbigpLgotICAgIGNhaXJvX3NldF9hbnRpYWxpYXMobV9kYXRhLT5jciwgZW5hYmxl
ID8gQ0FJUk9fQU5USUFMSUFTX0RFRkFVTFQgOiBDQUlST19BTlRJQUxJQVNfTk9ORSk7Ci19Cit9
OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvY2cvR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZh
dGUuaAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NnL0dy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMyw2ICsy
MywxMCBAQAogICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCiAgKi8KIAorI2luY2x1ZGUgImNvbmZpZy5oIgorCisj
aWYgUExBVEZPUk0oQ0cpCisKICNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ0dDb250ZXh0Lmg+CiAK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKQEAgLTgyLDQgKzg2LDUgQEAgcHVibGljOgogICAgIGJvb2wg
bV91c2VyVG9EZXZpY2VUcmFuc2Zvcm1Lbm93blRvQmVJZGVudGl0eTsKIH07CiAKKyNlbmRpZgkv
LyBQTEFURk9STSAoQ0cpCiB9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9G
b250Q0dXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0ZvbnRDR1dpbi5jcHAJKHJldmlzaW9uIDI5ODM0KQkoZnJvbSBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbi9Gb250V2luLmNwcDoyOTgzNCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0ZvbnRDR1dpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyMjcgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
Q09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZvbnQuaCIKKwor
I2luY2x1ZGUgIkZvbnRGYWxsYmFja0xpc3QuaCIKKyNpbmNsdWRlICJHbHlwaEJ1ZmZlci5oIgor
I2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkludFJlY3QuaCIKKyNpbmNs
dWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlNpbXBsZUZvbnREYXRhLmgiCisjaW5j
bHVkZSAiVW5pc2NyaWJlQ29udHJvbGxlci5oIgorI2luY2x1ZGUgPEFwcGxpY2F0aW9uU2Vydmlj
ZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgorI2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVyZmFj
ZS9XZWJLaXRTeXN0ZW1JbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NvbnN0IGludCBzeW50aGV0aWNPYmxpcXVlQW5nbGUg
PSAxNDsKKwordm9pZCBGb250OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3ND
b250ZXh0LCBjb25zdCBTaW1wbGVGb250RGF0YSogZm9udCwgY29uc3QgR2x5cGhCdWZmZXImIGds
eXBoQnVmZmVyLCAKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IG51bUdseXBo
cywgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpIGNvbnN0Cit7CisgICAgaWYgKGZvbnQtPm1fZm9u
dC51c2VHREkoKSkgeworICAgICAgICAvLyBGSVhNRTogU3VwcG9ydCBhbHBoYSBibGVuZGluZy4K
KyAgICAgICAgLy8gRklYTUU6IFN1cHBvcnQgdGV4dCBzdHJva2UvZmlsbC4KKyAgICAgICAgLy8g
RklYTUU6IFN1cHBvcnQgdGV4dCBzaGFkb3cuCisgICAgICAgIENvbG9yIGZpbGxDb2xvciA9IGdy
YXBoaWNzQ29udGV4dC0+ZmlsbENvbG9yKCk7CisgICAgICAgIGlmIChmaWxsQ29sb3IuYWxwaGEo
KSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIFdlIGhhdmUgdG8gY29u
dmVydCBDRydzIHR3by1kaW1lbnNpb25hbCBmbG9hdGluZyBwb2ludCBhZHZhbmNlcyB0byBqdXN0
IGhvcml6b250YWwgaW50ZWdlciBhZHZhbmNlcy4KKyAgICAgICAgVmVjdG9yPGludCwgMjA0OD4g
Z2RpQWR2YW5jZXM7CisgICAgICAgIGludCB0b3RhbFdpZHRoID0gMDsKKyAgICAgICAgZm9yIChp
bnQgaSA9IDA7IGkgPCBudW1HbHlwaHM7IGkrKykgeworICAgICAgICAgICAgZ2RpQWR2YW5jZXMu
YXBwZW5kKGxyb3VuZGYoZ2x5cGhCdWZmZXIuYWR2YW5jZUF0KGZyb20gKyBpKSkpOworICAgICAg
ICAgICAgdG90YWxXaWR0aCArPSBnZGlBZHZhbmNlc1tpXTsKKyAgICAgICAgfQorCisgICAgICAg
IC8vIFdlIHB1dCBzbG9wIGludG8gdGhpcyByZWN0LCBzaW5jZSBnbHlwaHMgY2FuIG92ZXJmbG93
IHRoZSBhc2NlbnQvZGVzY2VudCBib3VuZHMgYW5kIHRoZSBsZWZ0L3JpZ2h0IGVkZ2VzLgorICAg
ICAgICBpbnQgbGluZUdhcCA9IGZvbnQtPmxpbmVHYXAoKTsKKyAgICAgICAgSW50UmVjdCB0ZXh0
UmVjdChwb2ludC54KCkgLSBsaW5lR2FwLCBwb2ludC55KCkgLSBmb250LT5hc2NlbnQoKSAtIGxp
bmVHYXAsIHRvdGFsV2lkdGggKyAyICogbGluZUdhcCwgZm9udC0+bGluZVNwYWNpbmcoKSk7Cisg
ICAgICAgIEhEQyBoZGMgPSBncmFwaGljc0NvbnRleHQtPmdldFdpbmRvd3NDb250ZXh0KHRleHRS
ZWN0KTsKKyAgICAgICAgU2VsZWN0T2JqZWN0KGhkYywgZm9udC0+bV9mb250Lmhmb250KCkpOwor
CisgICAgICAgIC8vIFNldCB0aGUgY29ycmVjdCBjb2xvci4KKyAgICAgICAgSERDIHRleHREcmF3
aW5nREMgPSBoZGM7CisgICAgICAgIC8qaWYgKGZpbGxDb2xvci5oYXNBbHBoYSgpIHx8IGdyYXBo
aWNzQ29udGV4dC0+aW5UcmFuc3BhcmVuY3lMYXllcigpKSB7CisgICAgICAgICAgICAvLyBHREkg
Y2FuJ3QgaGFuZGxlIGRyYXdpbmcgdHJhbnNwYXJlbnQgdGV4dC4gIFdlIGhhdmUgdG8gZHJhdyBp
bnRvIGEgbWFzay4gIFdlIGRyYXcgYmxhY2sgdGV4dCBvbiBhIHdoaXRlLWZpbGxlZCBiYWNrZ3Jv
dW5kLgorICAgICAgICAgICAgLy8gV2UgYWxzbyBkbyB0aGlzIHdoZW4gaW5zaWRlIHRyYW5zcGFy
ZW5jeSBsYXllcnMsIHNpbmNlIEdESSBhbHNvIGNhbid0IGRyYXcgb250byBhIHN1cmZhY2Ugd2l0
aCBhbHBoYS4KKyAgICAgICAgICAgIGdyYXBoaWNzQ29udGV4dC0+c2F2ZSgpOworICAgICAgICAg
ICAgZ3JhcGhpY3NDb250ZXh0LT5zZXRGaWxsQ29sb3IoQ29sb3I6OndoaXRlKTsKKyAgICAgICAg
ICAgIHRleHREcmF3aW5nREMgPSBncmFwaGljc0NvbnRleHQtPmdldFdpbmRvd3NCaXRtYXBDb250
ZXh0KHRleHRSZWN0KTsKKyAgICAgICAgICAgIFNldFRleHRDb2xvcihoZGMsIFJHQigwLCAwLCAw
KSk7CisgICAgICAgIH0gZWxzZSovCisgICAgICAgICAgICBTZXRUZXh0Q29sb3IoaGRjLCBSR0Io
ZmlsbENvbG9yLnJlZCgpLCBmaWxsQ29sb3IuZ3JlZW4oKSwgZmlsbENvbG9yLmJsdWUoKSkpOwor
CisgICAgICAgIFNldEJrTW9kZShoZGMsIFRSQU5TUEFSRU5UKTsKKyAgICAgICAgU2V0VGV4dEFs
aWduKGhkYywgVEFfTEVGVCB8IFRBX0JBU0VMSU5FKTsKKworICAgICAgICAvLyBVbmlzY3JpYmUg
Z2l2ZXMgdXMgb2Zmc2V0cyB0byBoZWxwIHJlZmluZSB0aGUgcG9zaXRpb25pbmcgb2YgY29tYmlu
aW5nIGdseXBocy4KKyAgICAgICAgRmxvYXRTaXplIHRyYW5zbGF0aW9uID0gZ2x5cGhCdWZmZXIu
b2Zmc2V0QXQoZnJvbSk7CisgICAgICAgIGlmICh0cmFuc2xhdGlvbi53aWR0aCgpIHx8IHRyYW5z
bGF0aW9uLmhlaWdodCgpKSB7CisgICAgICAgICAgICBYRk9STSB4Zm9ybTsKKyAgICAgICAgICAg
IHhmb3JtLmVNMTEgPSAxLjA7CisgICAgICAgICAgICB4Zm9ybS5lTTEyID0gMDsKKyAgICAgICAg
ICAgIHhmb3JtLmVNMjEgPSAwOworICAgICAgICAgICAgeGZvcm0uZU0yMiA9IDEuMDsKKyAgICAg
ICAgICAgIHhmb3JtLmVEeCA9IHRyYW5zbGF0aW9uLndpZHRoKCk7CisgICAgICAgICAgICB4Zm9y
bS5lRHkgPSB0cmFuc2xhdGlvbi5oZWlnaHQoKTsKKyAgICAgICAgICAgIE1vZGlmeVdvcmxkVHJh
bnNmb3JtKGhkYywgJnhmb3JtLCBNV1RfTEVGVE1VTFRJUExZKTsKKyAgICAgICAgfQorICAgICAg
ICBFeHRUZXh0T3V0KGhkYywgcG9pbnQueCgpLCBwb2ludC55KCksIEVUT19HTFlQSF9JTkRFWCwg
MCwgKFdDSEFSKilnbHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSksIG51bUdseXBocywgZ2RpQWR2YW5j
ZXMuZGF0YSgpKTsKKworICAgICAgICAvKmlmIChmaWxsQ29sb3IuaGFzQWxwaGEoKSB8fCBncmFw
aGljc0NvbnRleHQtPmluVHJhbnNwYXJlbmN5TGF5ZXIoKSkgeworICAgICAgICAgICAgLy8gVE9E
T0Q6IFdlIGhhdmUgdG8gd2FsayB0aGUgYml0cyBvZiB0aGUgYml0bWFwIGFuZCBpbnZlcnQgdGhl
bS4gIFdlIGFsc28gY29weSBvdmVyIHRoZSBncmVlbiBjb21wb25lbnQgdmFsdWUgaW50byB0aGUg
YWxwaGEgdmFsdWUKKyAgICAgICAgICAgIC8vIHRvIGtlZXAgQ2xlYXJUeXBlIGxvb2tpbmcgcmVh
c29uYWJsZS4KKworICAgICAgICAgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBkcmF3biB0aGUgdGV4
dCBpbnRvIGEgYml0bWFwIGFuZCBpbnZlcnRlZCBpdCwgb2J0YWluIGEgQ0dJbWFnZVJlZiBtYXNr
LgorICAgICAgICAgICAgQ0dJbWFnZVJlZiBtYXNrID0gZ3JhcGhpY3NDb250ZXh0LT5yZWxlYXNl
V2luZG93c0JpdG1hcENvbnRleHRJbnRvTWFzayh0ZXh0RHJhd2luZ0RDLCB0ZXh0UmVjdCk7Cisg
ICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEFwcGx5IHRoZSBtYXNrIHRvIHRoZSBmaWxsIGNv
bG9yLgorICAgICAgICAgICAgQ0dDb250ZXh0UmVmIGJpdG1hcENvbnRleHQgPSBncmFwaGljc0Nv
bnRleHQtPmdldFdpbmRvd3NDb21wYXRpYmxlQ0dCaXRtYXBDb250ZXh0KHRleHRSZWN0LnNpemUo
KSk7CisgICAgICAgICAgICBDR0Zsb2F0IHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhOworICAgICAg
ICAgICAgY29sb3IuZ2V0UkdCQShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisgICAgICAgICAg
ICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoY29udGV4dCwgcmVkLCBncmVlbiwgYmx1ZSwgYWxw
aGEpOworICAgICAgICAgICAgQ0dDb250ZXh0RmlsbFJlY3QoYml0bWFwQ29udGV4dCwgSW50UmVj
dCgwLCAwLCB0ZXh0UmVjdC53aWR0aCgpLCB0ZXh0UmVjdC5oZWlnaHQoKSkpOworICAgICAgICAg
ICAgQ0dJbWFnZVJlZiBmaWxsQ29sb3JJbWFnZSA9IENHQml0bWFwQ29udGV4dENyZWF0ZUltYWdl
KGJpdG1hcENvbnRleHQpOworICAgICAgICAKKyAgICAgICAgICAgIC8vIEFwcGx5IHRoZSBtYXNr
LgorICAgICAgICAgICAgQ0dJbWFnZVJlZiBmaW5hbEltYWdlID0gQ0dJbWFnZUNyZWF0ZVdpdGhN
YXNrKGZpbGxDb2xvckltYWdlLCBtYXNrKTsKKworICAgICAgICAgICAgLy8gVGhlIGJpdG1hcCBp
bWFnZSBuZWVkcyB0byBiZSBkcmF3biBpbnRvIHRoZSBIREMuCisgICAgICAgICAgICBncmFwaGlj
c0NvbnRleHQtPmRyYXdJbWFnZUludG9XaW5kb3dzQ29udGV4dChoZGMsIGZpbmFsSW1hZ2UpOwor
CisgICAgICAgICAgICAvLyBSZWxlYXNlIG91ciBpbWFnZXMgYW5kIGNvbnRleHRzLgorICAgICAg
ICAgICAgQ0dJbWFnZVJlbGVhc2UobWFzayk7CisgICAgICAgICAgICBDR0ltYWdlUmVsZWFzZShm
aWxsQ29sb3JJbWFnZSk7CisgICAgICAgICAgICBDR0ltYWdlUmVsZWFzZShmaW5hbEltYWdlKTsK
KyAgICAgICAgICAgIENHQ29udGV4dFJlbGVhc2UoYml0bWFwQ29udGV4dCk7CisgICAgICAgIH0q
LworCisgICAgICAgIGdyYXBoaWNzQ29udGV4dC0+cmVsZWFzZVdpbmRvd3NDb250ZXh0KGhkYywg
dGV4dFJlY3QpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ0dDb250ZXh0UmVmIGNn
Q29udGV4dCA9IGdyYXBoaWNzQ29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCk7CisKKyAgICB1aW50
MzJfdCBvbGRGb250U21vb3RoaW5nU3R5bGUgPSB3a1NldEZvbnRTbW9vdGhpbmdTdHlsZShjZ0Nv
bnRleHQpOworCisgICAgY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgcGxhdGZvcm1EYXRhID0gZm9u
dC0+cGxhdGZvcm1EYXRhKCk7CisKKyAgICBDR0NvbnRleHRTZXRGb250KGNnQ29udGV4dCwgcGxh
dGZvcm1EYXRhLmNnRm9udCgpKTsKKworICAgIENHQWZmaW5lVHJhbnNmb3JtIG1hdHJpeCA9IENH
QWZmaW5lVHJhbnNmb3JtSWRlbnRpdHk7CisgICAgbWF0cml4LmIgPSAtbWF0cml4LmI7CisgICAg
bWF0cml4LmQgPSAtbWF0cml4LmQ7CisKKyAgICBpZiAocGxhdGZvcm1EYXRhLnN5bnRoZXRpY09i
bGlxdWUoKSkKKyAgICB7CisgICAgICAgIHN0YXRpYyBmbG9hdCBza2V3ID0gLXRhbmYoc3ludGhl
dGljT2JsaXF1ZUFuZ2xlICogYWNvc2YoMCkgLyA5MCk7CisgICAgICAgIG1hdHJpeCA9IENHQWZm
aW5lVHJhbnNmb3JtQ29uY2F0KG1hdHJpeCwgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlKDEsIDAsIHNr
ZXcsIDEsIDAsIDApKTsKKyAgICB9CisKKyAgICAvLyBVbmlzY3JpYmUgZ2l2ZXMgdXMgb2Zmc2V0
cyB0byBoZWxwIHJlZmluZSB0aGUgcG9zaXRpb25pbmcgb2YgY29tYmluaW5nIGdseXBocy4KKyAg
ICBGbG9hdFNpemUgdHJhbnNsYXRpb24gPSBnbHlwaEJ1ZmZlci5vZmZzZXRBdChmcm9tKTsKKyAg
ICBpZiAodHJhbnNsYXRpb24ud2lkdGgoKSB8fCB0cmFuc2xhdGlvbi5oZWlnaHQoKSkKKyAgICAg
ICAgQ0dBZmZpbmVUcmFuc2Zvcm1UcmFuc2xhdGUobWF0cml4LCB0cmFuc2xhdGlvbi53aWR0aCgp
LCB0cmFuc2xhdGlvbi5oZWlnaHQoKSk7CisgICAgCisgICAgQ0dDb250ZXh0U2V0VGV4dE1hdHJp
eChjZ0NvbnRleHQsIG1hdHJpeCk7CisKKyAgICBDR0NvbnRleHRTZXRGb250U2l6ZShjZ0NvbnRl
eHQsIHBsYXRmb3JtRGF0YS5zaXplKCkpOworICAgIENHQ29udGV4dFNldFRleHRQb3NpdGlvbihj
Z0NvbnRleHQsIHBvaW50LngoKSwgcG9pbnQueSgpKTsKKyAgICBDR0NvbnRleHRTaG93R2x5cGhz
V2l0aEFkdmFuY2VzKGNnQ29udGV4dCwgZ2x5cGhCdWZmZXIuZ2x5cGhzKGZyb20pLCBnbHlwaEJ1
ZmZlci5hZHZhbmNlcyhmcm9tKSwgbnVtR2x5cGhzKTsKKyAgICBpZiAoZm9udC0+bV9zeW50aGV0
aWNCb2xkT2Zmc2V0KSB7CisgICAgICAgIENHQ29udGV4dFNldFRleHRQb3NpdGlvbihjZ0NvbnRl
eHQsIHBvaW50LngoKSArIGZvbnQtPm1fc3ludGhldGljQm9sZE9mZnNldCwgcG9pbnQueSgpKTsK
KyAgICAgICAgQ0dDb250ZXh0U2hvd0dseXBoc1dpdGhBZHZhbmNlcyhjZ0NvbnRleHQsIGdseXBo
QnVmZmVyLmdseXBocyhmcm9tKSwgZ2x5cGhCdWZmZXIuYWR2YW5jZXMoZnJvbSksIG51bUdseXBo
cyk7CisgICAgfQorCisgICAgd2tSZXN0b3JlRm9udFNtb290aGluZ1N0eWxlKGNnQ29udGV4dCwg
b2xkRm9udFNtb290aGluZ1N0eWxlKTsKK30KKworRmxvYXRSZWN0IEZvbnQ6OnNlbGVjdGlvblJl
Y3RGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEludFBvaW50JiBwb2lu
dCwgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlu
dCBmcm9tLCBpbnQgdG8pIGNvbnN0Cit7CisgICAgVW5pc2NyaWJlQ29udHJvbGxlciBpdCh0aGlz
LCBydW4pOworICAgIGl0LmFkdmFuY2UoZnJvbSk7CisgICAgZmxvYXQgYmVmb3JlV2lkdGggPSBp
dC5ydW5XaWR0aFNvRmFyKCk7CisgICAgaXQuYWR2YW5jZSh0byk7CisgICAgZmxvYXQgYWZ0ZXJX
aWR0aCA9IGl0LnJ1bldpZHRoU29GYXIoKTsKKworICAgIC8vIFVzaW5nIHJvdW5kZigpIHJhdGhl
ciB0aGFuIGNlaWxmKCkgZm9yIHRoZSByaWdodCBlZGdlIGFzIGEgY29tcHJvbWlzZSB0byBlbnN1
cmUgY29ycmVjdCBjYXJldCBwb3NpdGlvbmluZworICAgIGlmIChydW4ucnRsKCkpIHsKKyAgICAg
ICAgaXQuYWR2YW5jZShydW4ubGVuZ3RoKCkpOworICAgICAgICBmbG9hdCB0b3RhbFdpZHRoID0g
aXQucnVuV2lkdGhTb0ZhcigpOworICAgICAgICByZXR1cm4gRmxvYXRSZWN0KHBvaW50LngoKSAr
IGZsb29yZih0b3RhbFdpZHRoIC0gYWZ0ZXJXaWR0aCksIHBvaW50LnkoKSwgcm91bmRmKHRvdGFs
V2lkdGggLSBiZWZvcmVXaWR0aCkgLSBmbG9vcmYodG90YWxXaWR0aCAtIGFmdGVyV2lkdGgpLCBo
KTsKKyAgICB9IAorICAgIAorICAgIHJldHVybiBGbG9hdFJlY3QocG9pbnQueCgpICsgZmxvb3Jm
KGJlZm9yZVdpZHRoKSwgcG9pbnQueSgpLCByb3VuZGYoYWZ0ZXJXaWR0aCkgLSBmbG9vcmYoYmVm
b3JlV2lkdGgpLCBoKTsKK30KKwordm9pZCBGb250OjpkcmF3Q29tcGxleFRleHQoR3JhcGhpY3ND
b250ZXh0KiBjb250ZXh0LCBjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBv
aW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyb20sIGludCB0bykgY29uc3QK
K3sKKyAgICAvLyBUaGlzIGdseXBoIGJ1ZmZlciBob2xkcyBvdXIgZ2x5cGhzICsgYWR2YW5jZXMg
KyBmb250IGRhdGEgZm9yIGVhY2ggZ2x5cGguCisgICAgR2x5cGhCdWZmZXIgZ2x5cGhCdWZmZXI7
CisKKyAgICBmbG9hdCBzdGFydFggPSBwb2ludC54KCk7CisgICAgVW5pc2NyaWJlQ29udHJvbGxl
ciBjb250cm9sbGVyKHRoaXMsIHJ1bik7CisgICAgY29udHJvbGxlci5hZHZhbmNlKGZyb20pOwor
ICAgIGZsb2F0IGJlZm9yZVdpZHRoID0gY29udHJvbGxlci5ydW5XaWR0aFNvRmFyKCk7CisgICAg
Y29udHJvbGxlci5hZHZhbmNlKHRvLCAmZ2x5cGhCdWZmZXIpOworICAgIAorICAgIC8vIFdlIGNv
dWxkbid0IGdlbmVyYXRlIGFueSBnbHlwaHMgZm9yIHRoZSBydW4uICBHaXZlIHVwLgorICAgIGlm
IChnbHlwaEJ1ZmZlci5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBmbG9h
dCBhZnRlcldpZHRoID0gY29udHJvbGxlci5ydW5XaWR0aFNvRmFyKCk7CisKKyAgICBpZiAocnVu
LnJ0bCgpKSB7CisgICAgICAgIGNvbnRyb2xsZXIuYWR2YW5jZShydW4ubGVuZ3RoKCkpOworICAg
ICAgICBzdGFydFggKz0gY29udHJvbGxlci5ydW5XaWR0aFNvRmFyKCkgLSBhZnRlcldpZHRoOwor
ICAgIH0gZWxzZQorICAgICAgICBzdGFydFggKz0gYmVmb3JlV2lkdGg7CisKKyAgICAvLyBEcmF3
IHRoZSBnbHlwaCBidWZmZXIgbm93IGF0IHRoZSBzdGFydGluZyBwb2ludCByZXR1cm5lZCBpbiBz
dGFydFguCisgICAgRmxvYXRQb2ludCBzdGFydFBvaW50KHN0YXJ0WCwgcG9pbnQueSgpKTsKKyAg
ICBkcmF3R2x5cGhCdWZmZXIoY29udGV4dCwgZ2x5cGhCdWZmZXIsIHJ1biwgc3RhcnRQb2ludCk7
Cit9CisKK2Zsb2F0IEZvbnQ6OmZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVu
JiBydW4pIGNvbnN0Cit7CisgICAgVW5pc2NyaWJlQ29udHJvbGxlciBjb250cm9sbGVyKHRoaXMs
IHJ1bik7CisgICAgY29udHJvbGxlci5hZHZhbmNlKHJ1bi5sZW5ndGgoKSk7CisgICAgcmV0dXJu
IGNvbnRyb2xsZXIucnVuV2lkdGhTb0ZhcigpOworfQorCitpbnQgRm9udDo6b2Zmc2V0Rm9yUG9z
aXRpb25Gb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGludCB4LCBib29sIGluY2x1
ZGVQYXJ0aWFsR2x5cGhzKSBjb25zdAoreworICAgIFVuaXNjcmliZUNvbnRyb2xsZXIgY29udHJv
bGxlcih0aGlzLCBydW4pOworICAgIHJldHVybiBjb250cm9sbGVyLm9mZnNldEZvclBvc2l0aW9u
KHgsIGluY2x1ZGVQYXJ0aWFsR2x5cGhzKTsKK30KKworfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vRm9udENHV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbi9Gb250Q0dXaW4uY3BwCShyZXZpc2lvbiAyOTcyNikKKysrIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDR1dpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4g
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDgg
QXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucwpAQCAtMjYsMTEgKzI2LDkgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRl
ICJGb250LmgiCiAKLSNpbmNsdWRlICJGb250RmFsbGJhY2tMaXN0LmgiCiAjaW5jbHVkZSAiR2x5
cGhCdWZmZXIuaCIKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNpbmNsdWRlICJJbnRS
ZWN0LmgiCi0jaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRlICJTaW1wbGVGb250
RGF0YS5oIgogI2luY2x1ZGUgIlVuaXNjcmliZUNvbnRyb2xsZXIuaCIKICNpbmNsdWRlIDxBcHBs
aWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KQEAgLTY4LDE1ICs2Niw3IEBA
IHZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQqIGcKIAogICAgICAgICAvLyBT
ZXQgdGhlIGNvcnJlY3QgY29sb3IuCiAgICAgICAgIEhEQyB0ZXh0RHJhd2luZ0RDID0gaGRjOwot
ICAgICAgICAvKmlmIChmaWxsQ29sb3IuaGFzQWxwaGEoKSB8fCBncmFwaGljc0NvbnRleHQtPmlu
VHJhbnNwYXJlbmN5TGF5ZXIoKSkgewotICAgICAgICAgICAgLy8gR0RJIGNhbid0IGhhbmRsZSBk
cmF3aW5nIHRyYW5zcGFyZW50IHRleHQuICBXZSBoYXZlIHRvIGRyYXcgaW50byBhIG1hc2suICBX
ZSBkcmF3IGJsYWNrIHRleHQgb24gYSB3aGl0ZS1maWxsZWQgYmFja2dyb3VuZC4KLSAgICAgICAg
ICAgIC8vIFdlIGFsc28gZG8gdGhpcyB3aGVuIGluc2lkZSB0cmFuc3BhcmVuY3kgbGF5ZXJzLCBz
aW5jZSBHREkgYWxzbyBjYW4ndCBkcmF3IG9udG8gYSBzdXJmYWNlIHdpdGggYWxwaGEuCi0gICAg
ICAgICAgICBncmFwaGljc0NvbnRleHQtPnNhdmUoKTsKLSAgICAgICAgICAgIGdyYXBoaWNzQ29u
dGV4dC0+c2V0RmlsbENvbG9yKENvbG9yOjp3aGl0ZSk7Ci0gICAgICAgICAgICB0ZXh0RHJhd2lu
Z0RDID0gZ3JhcGhpY3NDb250ZXh0LT5nZXRXaW5kb3dzQml0bWFwQ29udGV4dCh0ZXh0UmVjdCk7
Ci0gICAgICAgICAgICBTZXRUZXh0Q29sb3IoaGRjLCBSR0IoMCwgMCwgMCkpOwotICAgICAgICB9
IGVsc2UqLwotICAgICAgICAgICAgU2V0VGV4dENvbG9yKGhkYywgUkdCKGZpbGxDb2xvci5yZWQo
KSwgZmlsbENvbG9yLmdyZWVuKCksIGZpbGxDb2xvci5ibHVlKCkpKTsKKyAgICAgICAgU2V0VGV4
dENvbG9yKGhkYywgUkdCKGZpbGxDb2xvci5yZWQoKSwgZmlsbENvbG9yLmdyZWVuKCksIGZpbGxD
b2xvci5ibHVlKCkpKTsKIAogICAgICAgICBTZXRCa01vZGUoaGRjLCBUUkFOU1BBUkVOVCk7CiAg
ICAgICAgIFNldFRleHRBbGlnbihoZGMsIFRBX0xFRlQgfCBUQV9CQVNFTElORSk7CkBAIC05NSwz
NCArODUsNiBAQCB2b2lkIEZvbnQ6OmRyYXdHbHlwaHMoR3JhcGhpY3NDb250ZXh0KiBnCiAgICAg
ICAgIH0KICAgICAgICAgRXh0VGV4dE91dChoZGMsIHBvaW50LngoKSwgcG9pbnQueSgpLCBFVE9f
R0xZUEhfSU5ERVgsIDAsIChXQ0hBUiopZ2x5cGhCdWZmZXIuZ2x5cGhzKGZyb20pLCBudW1HbHlw
aHMsIGdkaUFkdmFuY2VzLmRhdGEoKSk7CiAKLSAgICAgICAgLyppZiAoZmlsbENvbG9yLmhhc0Fs
cGhhKCkgfHwgZ3JhcGhpY3NDb250ZXh0LT5pblRyYW5zcGFyZW5jeUxheWVyKCkpIHsKLSAgICAg
ICAgICAgIC8vIFRPRE9EOiBXZSBoYXZlIHRvIHdhbGsgdGhlIGJpdHMgb2YgdGhlIGJpdG1hcCBh
bmQgaW52ZXJ0IHRoZW0uICBXZSBhbHNvIGNvcHkgb3ZlciB0aGUgZ3JlZW4gY29tcG9uZW50IHZh
bHVlIGludG8gdGhlIGFscGhhIHZhbHVlCi0gICAgICAgICAgICAvLyB0byBrZWVwIENsZWFyVHlw
ZSBsb29raW5nIHJlYXNvbmFibGUuCi0KLSAgICAgICAgICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUg
ZHJhd24gdGhlIHRleHQgaW50byBhIGJpdG1hcCBhbmQgaW52ZXJ0ZWQgaXQsIG9idGFpbiBhIENH
SW1hZ2VSZWYgbWFzay4KLSAgICAgICAgICAgIENHSW1hZ2VSZWYgbWFzayA9IGdyYXBoaWNzQ29u
dGV4dC0+cmVsZWFzZVdpbmRvd3NCaXRtYXBDb250ZXh0SW50b01hc2sodGV4dERyYXdpbmdEQywg
dGV4dFJlY3QpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBBcHBseSB0aGUgbWFzayB0
byB0aGUgZmlsbCBjb2xvci4KLSAgICAgICAgICAgIENHQ29udGV4dFJlZiBiaXRtYXBDb250ZXh0
ID0gZ3JhcGhpY3NDb250ZXh0LT5nZXRXaW5kb3dzQ29tcGF0aWJsZUNHQml0bWFwQ29udGV4dCh0
ZXh0UmVjdC5zaXplKCkpOwotICAgICAgICAgICAgQ0dGbG9hdCByZWQsIGdyZWVuLCBibHVlLCBh
bHBoYTsKLSAgICAgICAgICAgIGNvbG9yLmdldFJHQkEocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEp
OwotICAgICAgICAgICAgQ0dDb250ZXh0U2V0UkdCRmlsbENvbG9yKGNvbnRleHQsIHJlZCwgZ3Jl
ZW4sIGJsdWUsIGFscGhhKTsKLSAgICAgICAgICAgIENHQ29udGV4dEZpbGxSZWN0KGJpdG1hcENv
bnRleHQsIEludFJlY3QoMCwgMCwgdGV4dFJlY3Qud2lkdGgoKSwgdGV4dFJlY3QuaGVpZ2h0KCkp
KTsKLSAgICAgICAgICAgIENHSW1hZ2VSZWYgZmlsbENvbG9ySW1hZ2UgPSBDR0JpdG1hcENvbnRl
eHRDcmVhdGVJbWFnZShiaXRtYXBDb250ZXh0KTsKLSAgICAgICAgCi0gICAgICAgICAgICAvLyBB
cHBseSB0aGUgbWFzay4KLSAgICAgICAgICAgIENHSW1hZ2VSZWYgZmluYWxJbWFnZSA9IENHSW1h
Z2VDcmVhdGVXaXRoTWFzayhmaWxsQ29sb3JJbWFnZSwgbWFzayk7Ci0KLSAgICAgICAgICAgIC8v
IFRoZSBiaXRtYXAgaW1hZ2UgbmVlZHMgdG8gYmUgZHJhd24gaW50byB0aGUgSERDLgotICAgICAg
ICAgICAgZ3JhcGhpY3NDb250ZXh0LT5kcmF3SW1hZ2VJbnRvV2luZG93c0NvbnRleHQoaGRjLCBm
aW5hbEltYWdlKTsKLQotICAgICAgICAgICAgLy8gUmVsZWFzZSBvdXIgaW1hZ2VzIGFuZCBjb250
ZXh0cy4KLSAgICAgICAgICAgIENHSW1hZ2VSZWxlYXNlKG1hc2spOwotICAgICAgICAgICAgQ0dJ
bWFnZVJlbGVhc2UoZmlsbENvbG9ySW1hZ2UpOwotICAgICAgICAgICAgQ0dJbWFnZVJlbGVhc2Uo
ZmluYWxJbWFnZSk7Ci0gICAgICAgICAgICBDR0NvbnRleHRSZWxlYXNlKGJpdG1hcENvbnRleHQp
OwotICAgICAgICB9Ki8KLQogICAgICAgICBncmFwaGljc0NvbnRleHQtPnJlbGVhc2VXaW5kb3dz
Q29udGV4dChoZGMsIHRleHRSZWN0KTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTEzOSw5
ICsxMDEsOCBAQCB2b2lkIEZvbnQ6OmRyYXdHbHlwaHMoR3JhcGhpY3NDb250ZXh0KiBnCiAgICAg
bWF0cml4LmIgPSAtbWF0cml4LmI7CiAgICAgbWF0cml4LmQgPSAtbWF0cml4LmQ7CiAKLSAgICBp
ZiAocGxhdGZvcm1EYXRhLnN5bnRoZXRpY09ibGlxdWUoKSkKLSAgICB7Ci0gICAgICAgIHN0YXRp
YyBmbG9hdCBza2V3ID0gLXRhbmYoc3ludGhldGljT2JsaXF1ZUFuZ2xlICogYWNvc2YoMCkgLyA5
MCk7CisgICAgaWYgKHBsYXRmb3JtRGF0YS5zeW50aGV0aWNPYmxpcXVlKCkpIHsKKyAgICAgICAg
c3RhdGljIGZsb2F0IHNrZXcgPSAtdGFuZihzeW50aGV0aWNPYmxpcXVlQW5nbGUgKiBhY29zZigw
KSAvIDkwLjBmKTsKICAgICAgICAgbWF0cml4ID0gQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXQobWF0
cml4LCBDR0FmZmluZVRyYW5zZm9ybU1ha2UoMSwgMCwgc2tldywgMSwgMCwgMCkpOwogICAgIH0K
IApAQCAtMTYzLDY1ICsxMjQsNCBAQCB2b2lkIEZvbnQ6OmRyYXdHbHlwaHMoR3JhcGhpY3NDb250
ZXh0KiBnCiAgICAgd2tSZXN0b3JlRm9udFNtb290aGluZ1N0eWxlKGNnQ29udGV4dCwgb2xkRm9u
dFNtb290aGluZ1N0eWxlKTsKIH0KIAotRmxvYXRSZWN0IEZvbnQ6OnNlbGVjdGlvblJlY3RGb3JD
b21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEludFBvaW50JiBwb2ludCwgaW50
IGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcm9t
LCBpbnQgdG8pIGNvbnN0Ci17Ci0gICAgVW5pc2NyaWJlQ29udHJvbGxlciBpdCh0aGlzLCBydW4p
OwotICAgIGl0LmFkdmFuY2UoZnJvbSk7Ci0gICAgZmxvYXQgYmVmb3JlV2lkdGggPSBpdC5ydW5X
aWR0aFNvRmFyKCk7Ci0gICAgaXQuYWR2YW5jZSh0byk7Ci0gICAgZmxvYXQgYWZ0ZXJXaWR0aCA9
IGl0LnJ1bldpZHRoU29GYXIoKTsKLQotICAgIC8vIFVzaW5nIHJvdW5kZigpIHJhdGhlciB0aGFu
IGNlaWxmKCkgZm9yIHRoZSByaWdodCBlZGdlIGFzIGEgY29tcHJvbWlzZSB0byBlbnN1cmUgY29y
cmVjdCBjYXJldCBwb3NpdGlvbmluZwotICAgIGlmIChydW4ucnRsKCkpIHsKLSAgICAgICAgaXQu
YWR2YW5jZShydW4ubGVuZ3RoKCkpOwotICAgICAgICBmbG9hdCB0b3RhbFdpZHRoID0gaXQucnVu
V2lkdGhTb0ZhcigpOwotICAgICAgICByZXR1cm4gRmxvYXRSZWN0KHBvaW50LngoKSArIGZsb29y
Zih0b3RhbFdpZHRoIC0gYWZ0ZXJXaWR0aCksIHBvaW50LnkoKSwgcm91bmRmKHRvdGFsV2lkdGgg
LSBiZWZvcmVXaWR0aCkgLSBmbG9vcmYodG90YWxXaWR0aCAtIGFmdGVyV2lkdGgpLCBoKTsKLSAg
ICB9IAotICAgIAotICAgIHJldHVybiBGbG9hdFJlY3QocG9pbnQueCgpICsgZmxvb3JmKGJlZm9y
ZVdpZHRoKSwgcG9pbnQueSgpLCByb3VuZGYoYWZ0ZXJXaWR0aCkgLSBmbG9vcmYoYmVmb3JlV2lk
dGgpLCBoKTsKLX0KLQotdm9pZCBGb250OjpkcmF3Q29tcGxleFRleHQoR3JhcGhpY3NDb250ZXh0
KiBjb250ZXh0LCBjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyb20sIGludCB0bykgY29uc3QKLXsKLSAg
ICAvLyBUaGlzIGdseXBoIGJ1ZmZlciBob2xkcyBvdXIgZ2x5cGhzICsgYWR2YW5jZXMgKyBmb250
IGRhdGEgZm9yIGVhY2ggZ2x5cGguCi0gICAgR2x5cGhCdWZmZXIgZ2x5cGhCdWZmZXI7Ci0KLSAg
ICBmbG9hdCBzdGFydFggPSBwb2ludC54KCk7Ci0gICAgVW5pc2NyaWJlQ29udHJvbGxlciBjb250
cm9sbGVyKHRoaXMsIHJ1bik7Ci0gICAgY29udHJvbGxlci5hZHZhbmNlKGZyb20pOwotICAgIGZs
b2F0IGJlZm9yZVdpZHRoID0gY29udHJvbGxlci5ydW5XaWR0aFNvRmFyKCk7Ci0gICAgY29udHJv
bGxlci5hZHZhbmNlKHRvLCAmZ2x5cGhCdWZmZXIpOwotICAgIAotICAgIC8vIFdlIGNvdWxkbid0
IGdlbmVyYXRlIGFueSBnbHlwaHMgZm9yIHRoZSBydW4uICBHaXZlIHVwLgotICAgIGlmIChnbHlw
aEJ1ZmZlci5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBmbG9hdCBhZnRl
cldpZHRoID0gY29udHJvbGxlci5ydW5XaWR0aFNvRmFyKCk7Ci0KLSAgICBpZiAocnVuLnJ0bCgp
KSB7Ci0gICAgICAgIGNvbnRyb2xsZXIuYWR2YW5jZShydW4ubGVuZ3RoKCkpOwotICAgICAgICBz
dGFydFggKz0gY29udHJvbGxlci5ydW5XaWR0aFNvRmFyKCkgLSBhZnRlcldpZHRoOwotICAgIH0g
ZWxzZQotICAgICAgICBzdGFydFggKz0gYmVmb3JlV2lkdGg7Ci0KLSAgICAvLyBEcmF3IHRoZSBn
bHlwaCBidWZmZXIgbm93IGF0IHRoZSBzdGFydGluZyBwb2ludCByZXR1cm5lZCBpbiBzdGFydFgu
Ci0gICAgRmxvYXRQb2ludCBzdGFydFBvaW50KHN0YXJ0WCwgcG9pbnQueSgpKTsKLSAgICBkcmF3
R2x5cGhCdWZmZXIoY29udGV4dCwgZ2x5cGhCdWZmZXIsIHJ1biwgc3RhcnRQb2ludCk7Ci19Ci0K
LWZsb2F0IEZvbnQ6OmZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4p
IGNvbnN0Ci17Ci0gICAgVW5pc2NyaWJlQ29udHJvbGxlciBjb250cm9sbGVyKHRoaXMsIHJ1bik7
Ci0gICAgY29udHJvbGxlci5hZHZhbmNlKHJ1bi5sZW5ndGgoKSk7Ci0gICAgcmV0dXJuIGNvbnRy
b2xsZXIucnVuV2lkdGhTb0ZhcigpOwotfQotCi1pbnQgRm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25G
b3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGludCB4LCBib29sIGluY2x1ZGVQYXJ0
aWFsR2x5cGhzKSBjb25zdAotewotICAgIFVuaXNjcmliZUNvbnRyb2xsZXIgY29udHJvbGxlcih0
aGlzLCBydW4pOwotICAgIHJldHVybiBjb250cm9sbGVyLm9mZnNldEZvclBvc2l0aW9uKHgsIGlu
Y2x1ZGVQYXJ0aWFsR2x5cGhzKTsKLX0KLQogfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW4vRm9udENhaXJvV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3dpbi9Gb250Q2Fpcm9XaW4uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENhaXJvV2luLmNwcAkocmV2aXNpb24gMCkKQEAgLTAs
MCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBcHBsZSBJbmMuICBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRm9u
dC5oIgorCisjaW5jbHVkZSAiR2x5cGhCdWZmZXIuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRl
eHQuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlNpbXBsZUZvbnRE
YXRhLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9pZCBGb250OjpkcmF3R2x5cGhzKEdy
YXBoaWNzQ29udGV4dCogZ3JhcGhpY3NDb250ZXh0LCBjb25zdCBTaW1wbGVGb250RGF0YSogZm9u
dCwgY29uc3QgR2x5cGhCdWZmZXImIGdseXBoQnVmZmVyLCAKKyAgICAgICAgICAgICAgICAgICAg
ICBpbnQgZnJvbSwgaW50IG51bUdseXBocywgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpIGNvbnN0
Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vRm9udFdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vRm9udFdpbi5jcHAJKHJldmlzaW9uIDI5ODM0KQorKysgV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udFdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSAr
MSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUg
SW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cwpAQCAtMzMsMTM2ICszMywxMCBAQAogI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCiAjaW5j
bHVkZSAiU2ltcGxlRm9udERhdGEuaCIKICNpbmNsdWRlICJVbmlzY3JpYmVDb250cm9sbGVyLmgi
Ci0jaW5jbHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+Ci0j
aW5jbHVkZSA8V2ViS2l0U3lzdGVtSW50ZXJmYWNlL1dlYktpdFN5c3RlbUludGVyZmFjZS5oPgog
I2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotY29u
c3QgaW50IHN5bnRoZXRpY09ibGlxdWVBbmdsZSA9IDE0OwotCi12b2lkIEZvbnQ6OmRyYXdHbHlw
aHMoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGNvbnN0IFNpbXBsZUZvbnREYXRh
KiBmb250LCBjb25zdCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZmZXIsIAotICAgICAgICAgICAgICAg
ICAgICAgIGludCBmcm9tLCBpbnQgbnVtR2x5cGhzLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCkg
Y29uc3QKLXsKLSAgICBpZiAoZm9udC0+bV9mb250LnVzZUdESSgpKSB7Ci0gICAgICAgIC8vIEZJ
WE1FOiBTdXBwb3J0IGFscGhhIGJsZW5kaW5nLgotICAgICAgICAvLyBGSVhNRTogU3VwcG9ydCB0
ZXh0IHN0cm9rZS9maWxsLgotICAgICAgICAvLyBGSVhNRTogU3VwcG9ydCB0ZXh0IHNoYWRvdy4K
LSAgICAgICAgQ29sb3IgZmlsbENvbG9yID0gZ3JhcGhpY3NDb250ZXh0LT5maWxsQ29sb3IoKTsK
LSAgICAgICAgaWYgKGZpbGxDb2xvci5hbHBoYSgpID09IDApCi0gICAgICAgICAgICByZXR1cm47
Ci0KLSAgICAgICAgLy8gV2UgaGF2ZSB0byBjb252ZXJ0IENHJ3MgdHdvLWRpbWVuc2lvbmFsIGZs
b2F0aW5nIHBvaW50IGFkdmFuY2VzIHRvIGp1c3QgaG9yaXpvbnRhbCBpbnRlZ2VyIGFkdmFuY2Vz
LgotICAgICAgICBWZWN0b3I8aW50LCAyMDQ4PiBnZGlBZHZhbmNlczsKLSAgICAgICAgaW50IHRv
dGFsV2lkdGggPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUdseXBoczsgaSsr
KSB7Ci0gICAgICAgICAgICBnZGlBZHZhbmNlcy5hcHBlbmQobHJvdW5kZihnbHlwaEJ1ZmZlci5h
ZHZhbmNlQXQoZnJvbSArIGkpKSk7Ci0gICAgICAgICAgICB0b3RhbFdpZHRoICs9IGdkaUFkdmFu
Y2VzW2ldOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2UgcHV0IHNsb3AgaW50byB0aGlzIHJl
Y3QsIHNpbmNlIGdseXBocyBjYW4gb3ZlcmZsb3cgdGhlIGFzY2VudC9kZXNjZW50IGJvdW5kcyBh
bmQgdGhlIGxlZnQvcmlnaHQgZWRnZXMuCi0gICAgICAgIGludCBsaW5lR2FwID0gZm9udC0+bGlu
ZUdhcCgpOwotICAgICAgICBJbnRSZWN0IHRleHRSZWN0KHBvaW50LngoKSAtIGxpbmVHYXAsIHBv
aW50LnkoKSAtIGZvbnQtPmFzY2VudCgpIC0gbGluZUdhcCwgdG90YWxXaWR0aCArIDIgKiBsaW5l
R2FwLCBmb250LT5saW5lU3BhY2luZygpKTsKLSAgICAgICAgSERDIGhkYyA9IGdyYXBoaWNzQ29u
dGV4dC0+Z2V0V2luZG93c0NvbnRleHQodGV4dFJlY3QpOwotICAgICAgICBTZWxlY3RPYmplY3Qo
aGRjLCBmb250LT5tX2ZvbnQuaGZvbnQoKSk7Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBjb3JyZWN0
IGNvbG9yLgotICAgICAgICBIREMgdGV4dERyYXdpbmdEQyA9IGhkYzsKLSAgICAgICAgLyppZiAo
ZmlsbENvbG9yLmhhc0FscGhhKCkgfHwgZ3JhcGhpY3NDb250ZXh0LT5pblRyYW5zcGFyZW5jeUxh
eWVyKCkpIHsKLSAgICAgICAgICAgIC8vIEdESSBjYW4ndCBoYW5kbGUgZHJhd2luZyB0cmFuc3Bh
cmVudCB0ZXh0LiAgV2UgaGF2ZSB0byBkcmF3IGludG8gYSBtYXNrLiAgV2UgZHJhdyBibGFjayB0
ZXh0IG9uIGEgd2hpdGUtZmlsbGVkIGJhY2tncm91bmQuCi0gICAgICAgICAgICAvLyBXZSBhbHNv
IGRvIHRoaXMgd2hlbiBpbnNpZGUgdHJhbnNwYXJlbmN5IGxheWVycywgc2luY2UgR0RJIGFsc28g
Y2FuJ3QgZHJhdyBvbnRvIGEgc3VyZmFjZSB3aXRoIGFscGhhLgotICAgICAgICAgICAgZ3JhcGhp
Y3NDb250ZXh0LT5zYXZlKCk7Ci0gICAgICAgICAgICBncmFwaGljc0NvbnRleHQtPnNldEZpbGxD
b2xvcihDb2xvcjo6d2hpdGUpOwotICAgICAgICAgICAgdGV4dERyYXdpbmdEQyA9IGdyYXBoaWNz
Q29udGV4dC0+Z2V0V2luZG93c0JpdG1hcENvbnRleHQodGV4dFJlY3QpOwotICAgICAgICAgICAg
U2V0VGV4dENvbG9yKGhkYywgUkdCKDAsIDAsIDApKTsKLSAgICAgICAgfSBlbHNlKi8KLSAgICAg
ICAgICAgIFNldFRleHRDb2xvcihoZGMsIFJHQihmaWxsQ29sb3IucmVkKCksIGZpbGxDb2xvci5n
cmVlbigpLCBmaWxsQ29sb3IuYmx1ZSgpKSk7Ci0KLSAgICAgICAgU2V0QmtNb2RlKGhkYywgVFJB
TlNQQVJFTlQpOwotICAgICAgICBTZXRUZXh0QWxpZ24oaGRjLCBUQV9MRUZUIHwgVEFfQkFTRUxJ
TkUpOwotCi0gICAgICAgIC8vIFVuaXNjcmliZSBnaXZlcyB1cyBvZmZzZXRzIHRvIGhlbHAgcmVm
aW5lIHRoZSBwb3NpdGlvbmluZyBvZiBjb21iaW5pbmcgZ2x5cGhzLgotICAgICAgICBGbG9hdFNp
emUgdHJhbnNsYXRpb24gPSBnbHlwaEJ1ZmZlci5vZmZzZXRBdChmcm9tKTsKLSAgICAgICAgaWYg
KHRyYW5zbGF0aW9uLndpZHRoKCkgfHwgdHJhbnNsYXRpb24uaGVpZ2h0KCkpIHsKLSAgICAgICAg
ICAgIFhGT1JNIHhmb3JtOwotICAgICAgICAgICAgeGZvcm0uZU0xMSA9IDEuMDsKLSAgICAgICAg
ICAgIHhmb3JtLmVNMTIgPSAwOwotICAgICAgICAgICAgeGZvcm0uZU0yMSA9IDA7Ci0gICAgICAg
ICAgICB4Zm9ybS5lTTIyID0gMS4wOwotICAgICAgICAgICAgeGZvcm0uZUR4ID0gdHJhbnNsYXRp
b24ud2lkdGgoKTsKLSAgICAgICAgICAgIHhmb3JtLmVEeSA9IHRyYW5zbGF0aW9uLmhlaWdodCgp
OwotICAgICAgICAgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0oaGRjLCAmeGZvcm0sIE1XVF9MRUZU
TVVMVElQTFkpOwotICAgICAgICB9Ci0gICAgICAgIEV4dFRleHRPdXQoaGRjLCBwb2ludC54KCks
IHBvaW50LnkoKSwgRVRPX0dMWVBIX0lOREVYLCAwLCAoV0NIQVIqKWdseXBoQnVmZmVyLmdseXBo
cyhmcm9tKSwgbnVtR2x5cGhzLCBnZGlBZHZhbmNlcy5kYXRhKCkpOwotCi0gICAgICAgIC8qaWYg
KGZpbGxDb2xvci5oYXNBbHBoYSgpIHx8IGdyYXBoaWNzQ29udGV4dC0+aW5UcmFuc3BhcmVuY3lM
YXllcigpKSB7Ci0gICAgICAgICAgICAvLyBUT0RPRDogV2UgaGF2ZSB0byB3YWxrIHRoZSBiaXRz
IG9mIHRoZSBiaXRtYXAgYW5kIGludmVydCB0aGVtLiAgV2UgYWxzbyBjb3B5IG92ZXIgdGhlIGdy
ZWVuIGNvbXBvbmVudCB2YWx1ZSBpbnRvIHRoZSBhbHBoYSB2YWx1ZQotICAgICAgICAgICAgLy8g
dG8ga2VlcCBDbGVhclR5cGUgbG9va2luZyByZWFzb25hYmxlLgotCi0gICAgICAgICAgICAvLyBO
b3cgdGhhdCB3ZSBoYXZlIGRyYXduIHRoZSB0ZXh0IGludG8gYSBiaXRtYXAgYW5kIGludmVydGVk
IGl0LCBvYnRhaW4gYSBDR0ltYWdlUmVmIG1hc2suCi0gICAgICAgICAgICBDR0ltYWdlUmVmIG1h
c2sgPSBncmFwaGljc0NvbnRleHQtPnJlbGVhc2VXaW5kb3dzQml0bWFwQ29udGV4dEludG9NYXNr
KHRleHREcmF3aW5nREMsIHRleHRSZWN0KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8g
QXBwbHkgdGhlIG1hc2sgdG8gdGhlIGZpbGwgY29sb3IuCi0gICAgICAgICAgICBDR0NvbnRleHRS
ZWYgYml0bWFwQ29udGV4dCA9IGdyYXBoaWNzQ29udGV4dC0+Z2V0V2luZG93c0NvbXBhdGlibGVD
R0JpdG1hcENvbnRleHQodGV4dFJlY3Quc2l6ZSgpKTsKLSAgICAgICAgICAgIENHRmxvYXQgcmVk
LCBncmVlbiwgYmx1ZSwgYWxwaGE7Ci0gICAgICAgICAgICBjb2xvci5nZXRSR0JBKHJlZCwgZ3Jl
ZW4sIGJsdWUsIGFscGhhKTsKLSAgICAgICAgICAgIENHQ29udGV4dFNldFJHQkZpbGxDb2xvcihj
b250ZXh0LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci0gICAgICAgICAgICBDR0NvbnRleHRG
aWxsUmVjdChiaXRtYXBDb250ZXh0LCBJbnRSZWN0KDAsIDAsIHRleHRSZWN0LndpZHRoKCksIHRl
eHRSZWN0LmhlaWdodCgpKSk7Ci0gICAgICAgICAgICBDR0ltYWdlUmVmIGZpbGxDb2xvckltYWdl
ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlSW1hZ2UoYml0bWFwQ29udGV4dCk7Ci0gICAgICAgIAot
ICAgICAgICAgICAgLy8gQXBwbHkgdGhlIG1hc2suCi0gICAgICAgICAgICBDR0ltYWdlUmVmIGZp
bmFsSW1hZ2UgPSBDR0ltYWdlQ3JlYXRlV2l0aE1hc2soZmlsbENvbG9ySW1hZ2UsIG1hc2spOwot
Ci0gICAgICAgICAgICAvLyBUaGUgYml0bWFwIGltYWdlIG5lZWRzIHRvIGJlIGRyYXduIGludG8g
dGhlIEhEQy4KLSAgICAgICAgICAgIGdyYXBoaWNzQ29udGV4dC0+ZHJhd0ltYWdlSW50b1dpbmRv
d3NDb250ZXh0KGhkYywgZmluYWxJbWFnZSk7Ci0KLSAgICAgICAgICAgIC8vIFJlbGVhc2Ugb3Vy
IGltYWdlcyBhbmQgY29udGV4dHMuCi0gICAgICAgICAgICBDR0ltYWdlUmVsZWFzZShtYXNrKTsK
LSAgICAgICAgICAgIENHSW1hZ2VSZWxlYXNlKGZpbGxDb2xvckltYWdlKTsKLSAgICAgICAgICAg
IENHSW1hZ2VSZWxlYXNlKGZpbmFsSW1hZ2UpOwotICAgICAgICAgICAgQ0dDb250ZXh0UmVsZWFz
ZShiaXRtYXBDb250ZXh0KTsKLSAgICAgICAgfSovCi0KLSAgICAgICAgZ3JhcGhpY3NDb250ZXh0
LT5yZWxlYXNlV2luZG93c0NvbnRleHQoaGRjLCB0ZXh0UmVjdCk7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0KLSAgICBDR0NvbnRleHRSZWYgY2dDb250ZXh0ID0gZ3JhcGhpY3NDb250ZXh0LT5w
bGF0Zm9ybUNvbnRleHQoKTsKLQotICAgIHVpbnQzMl90IG9sZEZvbnRTbW9vdGhpbmdTdHlsZSA9
IHdrU2V0Rm9udFNtb290aGluZ1N0eWxlKGNnQ29udGV4dCk7Ci0KLSAgICBjb25zdCBGb250UGxh
dGZvcm1EYXRhJiBwbGF0Zm9ybURhdGEgPSBmb250LT5wbGF0Zm9ybURhdGEoKTsKLQotICAgIENH
Q29udGV4dFNldEZvbnQoY2dDb250ZXh0LCBwbGF0Zm9ybURhdGEuY2dGb250KCkpOwotCi0gICAg
Q0dBZmZpbmVUcmFuc2Zvcm0gbWF0cml4ID0gQ0dBZmZpbmVUcmFuc2Zvcm1JZGVudGl0eTsKLSAg
ICBtYXRyaXguYiA9IC1tYXRyaXguYjsKLSAgICBtYXRyaXguZCA9IC1tYXRyaXguZDsKLQotICAg
IGlmIChwbGF0Zm9ybURhdGEuc3ludGhldGljT2JsaXF1ZSgpKQotICAgIHsKLSAgICAgICAgc3Rh
dGljIGZsb2F0IHNrZXcgPSAtdGFuZihzeW50aGV0aWNPYmxpcXVlQW5nbGUgKiBhY29zZigwKSAv
IDkwKTsKLSAgICAgICAgbWF0cml4ID0gQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXQobWF0cml4LCBD
R0FmZmluZVRyYW5zZm9ybU1ha2UoMSwgMCwgc2tldywgMSwgMCwgMCkpOwotICAgIH0KLQotICAg
IC8vIFVuaXNjcmliZSBnaXZlcyB1cyBvZmZzZXRzIHRvIGhlbHAgcmVmaW5lIHRoZSBwb3NpdGlv
bmluZyBvZiBjb21iaW5pbmcgZ2x5cGhzLgotICAgIEZsb2F0U2l6ZSB0cmFuc2xhdGlvbiA9IGds
eXBoQnVmZmVyLm9mZnNldEF0KGZyb20pOwotICAgIGlmICh0cmFuc2xhdGlvbi53aWR0aCgpIHx8
IHRyYW5zbGF0aW9uLmhlaWdodCgpKQotICAgICAgICBDR0FmZmluZVRyYW5zZm9ybVRyYW5zbGF0
ZShtYXRyaXgsIHRyYW5zbGF0aW9uLndpZHRoKCksIHRyYW5zbGF0aW9uLmhlaWdodCgpKTsKLSAg
ICAKLSAgICBDR0NvbnRleHRTZXRUZXh0TWF0cml4KGNnQ29udGV4dCwgbWF0cml4KTsKLQotICAg
IENHQ29udGV4dFNldEZvbnRTaXplKGNnQ29udGV4dCwgcGxhdGZvcm1EYXRhLnNpemUoKSk7Ci0g
ICAgQ0dDb250ZXh0U2V0VGV4dFBvc2l0aW9uKGNnQ29udGV4dCwgcG9pbnQueCgpLCBwb2ludC55
KCkpOwotICAgIENHQ29udGV4dFNob3dHbHlwaHNXaXRoQWR2YW5jZXMoY2dDb250ZXh0LCBnbHlw
aEJ1ZmZlci5nbHlwaHMoZnJvbSksIGdseXBoQnVmZmVyLmFkdmFuY2VzKGZyb20pLCBudW1HbHlw
aHMpOwotICAgIGlmIChmb250LT5tX3N5bnRoZXRpY0JvbGRPZmZzZXQpIHsKLSAgICAgICAgQ0dD
b250ZXh0U2V0VGV4dFBvc2l0aW9uKGNnQ29udGV4dCwgcG9pbnQueCgpICsgZm9udC0+bV9zeW50
aGV0aWNCb2xkT2Zmc2V0LCBwb2ludC55KCkpOwotICAgICAgICBDR0NvbnRleHRTaG93R2x5cGhz
V2l0aEFkdmFuY2VzKGNnQ29udGV4dCwgZ2x5cGhCdWZmZXIuZ2x5cGhzKGZyb20pLCBnbHlwaEJ1
ZmZlci5hZHZhbmNlcyhmcm9tKSwgbnVtR2x5cGhzKTsKLSAgICB9Ci0KLSAgICB3a1Jlc3RvcmVG
b250U21vb3RoaW5nU3R5bGUoY2dDb250ZXh0LCBvbGRGb250U21vb3RoaW5nU3R5bGUpOwotfQot
CiBGbG9hdFJlY3QgRm9udDo6c2VsZWN0aW9uUmVjdEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRS
dW4mIHJ1biwgY29uc3QgSW50UG9pbnQmIHBvaW50LCBpbnQgaCwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyb20sIGludCB0bykgY29uc3QKIHsKSW5k
ZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENHV2luLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0Nv
bnRleHRDR1dpbi5jcHAJKHJldmlzaW9uIDI5ODM0KQkoZnJvbSBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRXaW4uY3BwOjI5ODM0KQorKysgV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0Q0dXaW4uY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsMzg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1
LCAyMDA2LCAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorCisjaW5jbHVk
ZSAiQWZmaW5lVHJhbnNmb3JtLmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNs
dWRlICJQYXRoLmgiCisjaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NHQml0bWFwQ29udGV4dC5oPgor
I2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVyZmFjZS9XZWJLaXRTeXN0ZW1JbnRlcmZhY2UuaD4K
KyNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgorCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworY2xhc3MgU1ZHUmVzb3VyY2VJbWFnZTsKKworc3RhdGljIENHQ29udGV4dFJl
ZiBDR0NvbnRleHRXaXRoSERDKEhEQyBoZGMpCit7CisgICAgSEJJVE1BUCBiaXRtYXAgPSAoSEJJ
VE1BUClHZXRDdXJyZW50T2JqZWN0KGhkYywgT0JKX0JJVE1BUCk7CisgICAgQ0dDb2xvclNwYWNl
UmVmIGRldmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOworICAgIEJJVE1B
UCBpbmZvOworCisgICAgR2V0T2JqZWN0KGJpdG1hcCwgc2l6ZW9mKGluZm8pLCAmaW5mbyk7Cisg
ICAgQVNTRVJUKGluZm8uYm1CaXRzUGl4ZWwgPT0gMzIpOworICAgIENHQ29udGV4dFJlZiBjb250
ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGluZm8uYm1CaXRzLCBpbmZvLmJtV2lkdGgsIGlu
Zm8uYm1IZWlnaHQsIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9yZGVy
MzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhhTm9uZVNraXBGaXJzdCk7CisgICAgQ0dDb2xvclNwYWNl
UmVsZWFzZShkZXZpY2VSR0IpOworCisgICAgLy8gRmxpcCBjb29yZHMKKyAgICBDR0NvbnRleHRU
cmFuc2xhdGVDVE0oY29udGV4dCwgMCwgaW5mby5ibUhlaWdodCk7CisgICAgQ0dDb250ZXh0U2Nh
bGVDVE0oY29udGV4dCwgMSwgLTEpOworICAgIAorICAgIC8vIFB1dCB0aGUgSERDIEluIGFkdmFu
Y2VkIG1vZGUgc28gaXQgd2lsbCBob25vciBhZmZpbmUgdHJhbnNmb3Jtcy4KKyAgICBTZXRHcmFw
aGljc01vZGUoaGRjLCBHTV9BRFZBTkNFRCk7CisgICAgCisgICAgcmV0dXJuIGNvbnRleHQ7Cit9
CisKK0dyYXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0KEhEQyBoZGMpCisgICAgOiBtX2Nv
bW1vbihjcmVhdGVHcmFwaGljc0NvbnRleHRQcml2YXRlKCkpCisgICAgLCBtX2RhdGEobmV3IEdy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZShDR0NvbnRleHRXaXRoSERDKGhkYykpKQorewor
ICAgIENHQ29udGV4dFJlbGVhc2UobV9kYXRhLT5tX2NnQ29udGV4dCk7CisgICAgbV9kYXRhLT5t
X2hkYyA9IGhkYzsKKyAgICBzZXRQYWludGluZ0Rpc2FibGVkKCFtX2RhdGEtPm1fY2dDb250ZXh0
KTsKKyAgICBpZiAobV9kYXRhLT5tX2NnQ29udGV4dCkgeworICAgICAgICAvLyBNYWtlIHN1cmUg
dGhlIGNvbnRleHQgc3RhcnRzIGluIHN5bmMgd2l0aCBvdXIgc3RhdGUuCisgICAgICAgIHNldFBs
YXRmb3JtRmlsbENvbG9yKGZpbGxDb2xvcigpKTsKKyAgICAgICAgc2V0UGxhdGZvcm1TdHJva2VD
b2xvcihzdHJva2VDb2xvcigpKTsKKyAgICB9Cit9CisKK0hEQyBHcmFwaGljc0NvbnRleHQ6Omdl
dFdpbmRvd3NDb250ZXh0KGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGJvb2wgc3VwcG9ydEFscGhh
QmxlbmQpCit7CisgICAgaWYgKGluVHJhbnNwYXJlbmN5TGF5ZXIoKSkgeworICAgICAgICBpZiAo
ZHN0UmVjdC5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAvLyBD
cmVhdGUgYSBiaXRtYXAgREMgaW4gd2hpY2ggdG8gZHJhdy4KKyAgICAgICAgQklUTUFQSU5GTyBi
aXRtYXBJbmZvOworICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVNpemUgICAgICAgICAg
PSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7CisgICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVy
LmJpV2lkdGggICAgICAgICA9IGRzdFJlY3Qud2lkdGgoKTsgCisgICAgICAgIGJpdG1hcEluZm8u
Ym1pSGVhZGVyLmJpSGVpZ2h0ICAgICAgICA9IGRzdFJlY3QuaGVpZ2h0KCk7CisgICAgICAgIGJp
dG1hcEluZm8uYm1pSGVhZGVyLmJpUGxhbmVzICAgICAgICA9IDE7CisgICAgICAgIGJpdG1hcElu
Zm8uYm1pSGVhZGVyLmJpQml0Q291bnQgICAgICA9IDMyOworICAgICAgICBiaXRtYXBJbmZvLmJt
aUhlYWRlci5iaUNvbXByZXNzaW9uICAgPSBCSV9SR0I7CisgICAgICAgIGJpdG1hcEluZm8uYm1p
SGVhZGVyLmJpU2l6ZUltYWdlICAgICA9IDA7CisgICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVy
LmJpWFBlbHNQZXJNZXRlciA9IDA7CisgICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpWVBl
bHNQZXJNZXRlciA9IDA7CisgICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpQ2xyVXNlZCAg
ICAgICA9IDA7CisgICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpQ2xySW1wb3J0YW50ICA9
IDA7CisKKyAgICAgICAgdm9pZCogcGl4ZWxzID0gMDsKKyAgICAgICAgSEJJVE1BUCBiaXRtYXAg
PSA6OkNyZWF0ZURJQlNlY3Rpb24oTlVMTCwgJmJpdG1hcEluZm8sIERJQl9SR0JfQ09MT1JTLCAm
cGl4ZWxzLCAwLCAwKTsKKyAgICAgICAgaWYgKCFiaXRtYXApCisgICAgICAgICAgICByZXR1cm4g
MDsKKworICAgICAgICBIREMgYml0bWFwREMgPSA6OkNyZWF0ZUNvbXBhdGlibGVEQyhtX2RhdGEt
Pm1faGRjKTsKKyAgICAgICAgOjpTZWxlY3RPYmplY3QoYml0bWFwREMsIGJpdG1hcCk7CisKKyAg
ICAgICAgLy8gRmlsbCBvdXIgYnVmZmVyIHdpdGggY2xlYXIgaWYgd2UncmUgZ29pbmcgdG8gYWxw
aGEgYmxlbmQuCisgICAgICAgIGlmIChzdXBwb3J0QWxwaGFCbGVuZCkgeworICAgICAgICAgICAg
QklUTUFQIGJtcEluZm87CisgICAgICAgICAgICBHZXRPYmplY3QoYml0bWFwLCBzaXplb2YoYm1w
SW5mbyksICZibXBJbmZvKTsKKyAgICAgICAgICAgIGludCBidWZmZXJTaXplID0gYm1wSW5mby5i
bVdpZHRoQnl0ZXMgKiBibXBJbmZvLmJtSGVpZ2h0OworICAgICAgICAgICAgbWVtc2V0KGJtcElu
Zm8uYm1CaXRzLCAwLCBidWZmZXJTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE1ha2Ug
c3VyZSB3ZSBjYW4gZG8gd29ybGQgdHJhbnNmb3Jtcy4KKyAgICAgICAgU2V0R3JhcGhpY3NNb2Rl
KGJpdG1hcERDLCBHTV9BRFZBTkNFRCk7CisKKyAgICAgICAgLy8gQXBwbHkgYSB0cmFuc2xhdGlv
biB0byBvdXIgY29udGV4dCBzbyB0aGF0IHRoZSBkcmF3aW5nIGRvbmUgd2lsbCBiZSBhdCAoMCww
KSBvZiB0aGUgYml0bWFwLgorICAgICAgICBYRk9STSB4Zm9ybTsKKyAgICAgICAgeGZvcm0uZU0x
MSA9IDEuMDsKKyAgICAgICAgeGZvcm0uZU0xMiA9IDA7CisgICAgICAgIHhmb3JtLmVNMjEgPSAw
OworICAgICAgICB4Zm9ybS5lTTIyID0gMS4wOworICAgICAgICB4Zm9ybS5lRHggPSAtZHN0UmVj
dC54KCk7CisgICAgICAgIHhmb3JtLmVEeSA9IC1kc3RSZWN0LnkoKTsKKyAgICAgICAgOjpTZXRX
b3JsZFRyYW5zZm9ybShiaXRtYXBEQywgJnhmb3JtKTsKKworICAgICAgICByZXR1cm4gYml0bWFw
REM7CisgICAgfQorCisgICAgQ0dDb250ZXh0Rmx1c2gocGxhdGZvcm1Db250ZXh0KCkpOworICAg
IG1fZGF0YS0+c2F2ZSgpOworICAgIHJldHVybiBtX2RhdGEtPm1faGRjOworfQorCitib29sIEdy
YXBoaWNzQ29udGV4dDo6aW5UcmFuc3BhcmVuY3lMYXllcigpIGNvbnN0IHsgcmV0dXJuIG1fZGF0
YS0+bV90cmFuc3BhcmVuY3lDb3VudDsgfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6cmVsZWFz
ZVdpbmRvd3NDb250ZXh0KEhEQyBoZGMsIGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGJvb2wgc3Vw
cG9ydEFscGhhQmxlbmQpCit7CisgICAgaWYgKGhkYyAmJiBpblRyYW5zcGFyZW5jeUxheWVyKCkp
IHsKKyAgICAgICAgaWYgKGRzdFJlY3QuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuOwor
CisgICAgICAgIEhCSVRNQVAgYml0bWFwID0gKEhCSVRNQVApR2V0Q3VycmVudE9iamVjdChoZGMs
IE9CSl9CSVRNQVApOworCisgICAgICAgIC8vIE5lZWQgdG8gbWFrZSBhIENHSW1hZ2Ugb3V0IG9m
IHRoZSBiaXRtYXAncyBwaXhlbCBidWZmZXIgYW5kIHRoZW4gZHJhdworICAgICAgICAvLyBpdCBp
bnRvIG91ciBjb250ZXh0LgorICAgICAgICBCSVRNQVAgaW5mbzsKKyAgICAgICAgR2V0T2JqZWN0
KGJpdG1hcCwgc2l6ZW9mKGluZm8pLCAmaW5mbyk7CisgICAgICAgIEFTU0VSVChpbmZvLmJtQml0
c1BpeGVsID09IDMyKTsKKworICAgICAgICBDR0NvbG9yU3BhY2VSZWYgZGV2aWNlUkdCID0gQ0dD
b2xvclNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7CisgICAgICAgIENHQ29udGV4dFJlZiBiaXRtYXBD
b250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGluZm8uYm1CaXRzLCBpbmZvLmJtV2lkdGgs
IGluZm8uYm1IZWlnaHQsIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGluZm8uYm1XaWR0aEJ5dGVzLCBkZXZpY2VSR0IsIGtDR0Jp
dG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdXBwb3J0QWxwaGFCbGVuZCA/IGtDR0ltYWdl
QWxwaGFQcmVtdWx0aXBsaWVkRmlyc3QgOiBrQ0dJbWFnZUFscGhhTm9uZVNraXBGaXJzdCkpOwor
ICAgICAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKGRldmljZVJHQik7CisKKyAgICAgICAgQ0dJbWFn
ZVJlZiBpbWFnZSA9IENHQml0bWFwQ29udGV4dENyZWF0ZUltYWdlKGJpdG1hcENvbnRleHQpOwor
ICAgICAgICBDR0NvbnRleHREcmF3SW1hZ2UobV9kYXRhLT5tX2NnQ29udGV4dCwgZHN0UmVjdCwg
aW1hZ2UpOworICAgICAgICAKKyAgICAgICAgLy8gRGVsZXRlIGFsbCBvdXIganVuay4KKyAgICAg
ICAgQ0dJbWFnZVJlbGVhc2UoaW1hZ2UpOworICAgICAgICBDR0NvbnRleHRSZWxlYXNlKGJpdG1h
cENvbnRleHQpOworICAgICAgICA6OkRlbGV0ZURDKGhkYyk7CisgICAgICAgIDo6RGVsZXRlT2Jq
ZWN0KGJpdG1hcCk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1fZGF0YS0+cmVz
dG9yZSgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6c2F2ZSgp
Cit7CisgICAgaWYgKCFtX2hkYykKKyAgICAgICAgcmV0dXJuOworICAgIFNhdmVEQyhtX2hkYyk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpyZXN0b3JlKCkKK3sK
KyAgICBpZiAoIW1faGRjKQorICAgICAgICByZXR1cm47CisgICAgUmVzdG9yZURDKG1faGRjLCAt
MSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpjbGlwKGNvbnN0
IEludFJlY3QmIGNsaXBSZWN0KQoreworICAgIGlmICghbV9oZGMpCisgICAgICAgIHJldHVybjsK
KyAgICBJbnRlcnNlY3RDbGlwUmVjdChtX2hkYywgY2xpcFJlY3QueCgpLCBjbGlwUmVjdC55KCks
IGNsaXBSZWN0LnJpZ2h0KCksIGNsaXBSZWN0LmJvdHRvbSgpKTsKK30KKwordm9pZCBHcmFwaGlj
c0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNsaXAoY29uc3QgUGF0aCYpCit7CisgICAgbm90SW1w
bGVtZW50ZWQoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnNj
YWxlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sKKyAgICBpZiAoIW1faGRjKQorICAgICAgICBy
ZXR1cm47CisgICAgWEZPUk0geGZvcm07CisgICAgeGZvcm0uZU0xMSA9IHNpemUud2lkdGgoKTsK
KyAgICB4Zm9ybS5lTTEyID0gMDsKKyAgICB4Zm9ybS5lTTIxID0gMDsKKyAgICB4Zm9ybS5lTTIy
ID0gc2l6ZS5oZWlnaHQoKTsKKyAgICB4Zm9ybS5lRHggPSAwOworICAgIHhmb3JtLmVEeSA9IDA7
CisgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBM
WSk7Cit9CisKK3N0YXRpYyBjb25zdCBkb3VibGUgZGVnMnJhZCA9IDAuMDE3NDUzMjkyNTE5OTQz
Mjk1NzY5OyAvLyBwaS8xODAKKwordm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6
OnJvdGF0ZShmbG9hdCBkZWdyZWVzQW5nbGUpCit7CisgICAgZmxvYXQgcmFkaWFuc0FuZ2xlID0g
ZGVncmVlc0FuZ2xlICogZGVnMnJhZDsKKyAgICBmbG9hdCBjb3NBbmdsZSA9IGNvc2YocmFkaWFu
c0FuZ2xlKTsKKyAgICBmbG9hdCBzaW5BbmdsZSA9IHNpbmYocmFkaWFuc0FuZ2xlKTsKKyAgICBY
Rk9STSB4Zm9ybTsKKyAgICB4Zm9ybS5lTTExID0gY29zQW5nbGU7CisgICAgeGZvcm0uZU0xMiA9
IC1zaW5BbmdsZTsKKyAgICB4Zm9ybS5lTTIxID0gc2luQW5nbGU7CisgICAgeGZvcm0uZU0yMiA9
IGNvc0FuZ2xlOworICAgIHhmb3JtLmVEeCA9IDA7CisgICAgeGZvcm0uZUR5ID0gMDsKKyAgICBN
b2RpZnlXb3JsZFRyYW5zZm9ybShtX2hkYywgJnhmb3JtLCBNV1RfTEVGVE1VTFRJUExZKTsKK30K
Kwordm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnRyYW5zbGF0ZShmbG9hdCB4
ICwgZmxvYXQgeSkKK3sKKyAgICBpZiAoIW1faGRjKQorICAgICAgICByZXR1cm47CisgICAgWEZP
Uk0geGZvcm07CisgICAgeGZvcm0uZU0xMSA9IDEuMDsKKyAgICB4Zm9ybS5lTTEyID0gMDsKKyAg
ICB4Zm9ybS5lTTIxID0gMDsKKyAgICB4Zm9ybS5lTTIyID0gMS4wOworICAgIHhmb3JtLmVEeCA9
IHg7CisgICAgeGZvcm0uZUR5ID0geTsKKyAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShtX2hkYywg
Jnhmb3JtLCBNV1RfTEVGVE1VTFRJUExZKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGU6OmNvbmNhdENUTShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSkK
K3sKKyAgICBpZiAoIW1faGRjKQorICAgICAgICByZXR1cm47CisgICAgQ0dBZmZpbmVUcmFuc2Zv
cm0gbWF0ID0gdHJhbnNmb3JtOworICAgIFhGT1JNIHhmb3JtOworICAgIHhmb3JtLmVNMTEgPSBt
YXQuYTsKKyAgICB4Zm9ybS5lTTEyID0gbWF0LmI7CisgICAgeGZvcm0uZU0yMSA9IG1hdC5jOwor
ICAgIHhmb3JtLmVNMjIgPSBtYXQuZDsKKyAgICB4Zm9ybS5lRHggPSBtYXQudHg7CisgICAgeGZv
cm0uZUR5ID0gbWF0LnR5OworICAgIE1vZGlmeVdvcmxkVHJhbnNmb3JtKG1faGRjLCAmeGZvcm0s
IE1XVF9MRUZUTVVMVElQTFkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0ZvY3Vz
UmluZyhjb25zdCBDb2xvciYgY29sb3IpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgZmxvYXQgcmFkaXVzID0gKGZvY3VzUmluZ1dpZHRoKCkg
LSAxKSAvIDIuMGY7CisgICAgaW50IG9mZnNldCA9IHJhZGl1cyArIGZvY3VzUmluZ09mZnNldCgp
OworICAgIENHQ29sb3JSZWYgY29sb3JSZWYgPSBjb2xvci5pc1ZhbGlkKCkgPyBjZ0NvbG9yKGNv
bG9yKSA6IDA7CisKKyAgICBDR011dGFibGVQYXRoUmVmIGZvY3VzUmluZ1BhdGggPSBDR1BhdGhD
cmVhdGVNdXRhYmxlKCk7CisgICAgY29uc3QgVmVjdG9yPEludFJlY3Q+JiByZWN0cyA9IGZvY3Vz
UmluZ1JlY3RzKCk7CisgICAgdW5zaWduZWQgcmVjdENvdW50ID0gcmVjdHMuc2l6ZSgpOworICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCByZWN0Q291bnQ7IGkrKykKKyAgICAgICAgQ0dQYXRo
QWRkUmVjdChmb2N1c1JpbmdQYXRoLCAwLCBDR1JlY3RJbnNldChyZWN0c1tpXSwgLW9mZnNldCwg
LW9mZnNldCkpOworCisgICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQo
KTsKKyAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQpOworCisgICAgQ0dDb250ZXh0QmVn
aW5QYXRoKGNvbnRleHQpOworICAgIENHQ29udGV4dEFkZFBhdGgoY29udGV4dCwgZm9jdXNSaW5n
UGF0aCk7CisKKyAgICB3a0RyYXdGb2N1c1JpbmcoY29udGV4dCwgY29sb3JSZWYsIHJhZGl1cyk7
CisKKyAgICBDR0NvbG9yUmVsZWFzZShjb2xvclJlZik7CisKKyAgICBDR1BhdGhSZWxlYXNlKGZv
Y3VzUmluZ1BhdGgpOworCisgICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShjb250ZXh0KTsKK30K
Kworc3RhdGljIGNvbnN0IENvbG9yJiBzcGVsbGluZ1BhdHRlcm5Db2xvcigpIHsKKyAgICBzdGF0
aWMgY29uc3QgQ29sb3Igc3BlbGxpbmdDb2xvcigyNTUsIDAsIDApOworICAgIHJldHVybiBzcGVs
bGluZ0NvbG9yOworfQorCitzdGF0aWMgY29uc3QgQ29sb3ImIGdyYW1tYXJQYXR0ZXJuQ29sb3Io
KSB7CisgICAgc3RhdGljIGNvbnN0IENvbG9yIGdyYW1tYXJDb2xvcigwLCAxMjgsIDApOworICAg
IHJldHVybiBncmFtbWFyQ29sb3I7Cit9CisKKy8vIFB1bGxlZCBmcm9tIEdyYXBoaWNzQ29udGV4
dENHCitzdGF0aWMgdm9pZCBzZXRDR1N0cm9rZUNvbG9yKENHQ29udGV4dFJlZiBjb250ZXh0LCBj
b25zdCBDb2xvciYgY29sb3IpCit7CisgICAgQ0dGbG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBo
YTsKKyAgICBjb2xvci5nZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAgICBDR0Nv
bnRleHRTZXRSR0JTdHJva2VDb2xvcihjb250ZXh0LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvck1pc3NwZWxsaW5nT3JCYWRH
cmFtbWFyKGNvbnN0IEludFBvaW50JiBwb2ludCwgaW50IHdpZHRoLCBib29sIGdyYW1tYXIpCit7
CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAg
IC8vIFRoZXNlIGFyZSB0aGUgc2FtZSBmb3IgbWlzc3BlbGxpbmcgb3IgYmFkIGdyYW1tYXIKKyAg
ICBjb25zdCBpbnQgcGF0dGVybkhlaWdodCA9IDM7IC8vIDMgcm93cworICAgIEFTU0VSVChjTWlz
c3BlbGxpbmdMaW5lVGhpY2tuZXNzID09IHBhdHRlcm5IZWlnaHQpOworICAgIGNvbnN0IGludCBw
YXR0ZXJuV2lkdGggPSA0OyAvLyA0IHBpeGVscworICAgIEFTU0VSVChwYXR0ZXJuV2lkdGggPT0g
Y01pc3NwZWxsaW5nTGluZVBhdHRlcm5XaWR0aCk7CisKKyAgICAvLyBNYWtlIHN1cmUgdG8gZHJh
dyBvbmx5IGNvbXBsZXRlIGRvdHMuCisgICAgLy8gTk9URTogQ29kZSBoZXJlIHVzZWQgdG8gc2hp
ZnQgdGhlIHVuZGVybGluZSB0byB0aGUgbGVmdCBhbmQgaW5jcmVhc2UgdGhlIHdpZHRoCisgICAg
Ly8gdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgZ2V0cyB1bmRlcmxpbmVkLCBidXQgdGhhdCByZXN1
bHRzIGluIGRyYXdpbmcgb3V0IG9mCisgICAgLy8gYm91bmRzIChlLmcuIHdoZW4gYXQgdGhlIGVk
Z2Ugb2YgYSB2aWV3KSBhbmQgY291bGQgbWFrZSBpdCBhcHBlYXIgdGhhdCB0aGUKKyAgICAvLyBz
cGFjZSBiZXR3ZWVuIGFkamFjZW50IG1pc3NwZWxsZWQgd29yZHMgd2FzIHVuZGVybGluZWQuCisg
ICAgLy8gYWxsb3cgc2xpZ2h0bHkgbW9yZSBjb25zaWRlcmluZyB0aGF0IHRoZSBwYXR0ZXJuIGVu
ZHMgd2l0aCBhIHRyYW5zcGFyZW50IHBpeGVsCisgICAgaW50IHdpZHRoTW9kID0gd2lkdGggJSBw
YXR0ZXJuV2lkdGg7CisgICAgaWYgKHBhdHRlcm5XaWR0aCAtIHdpZHRoTW9kID4gY01pc3NwZWxs
aW5nTGluZVBhdHRlcm5HYXBXaWR0aCkKKyAgICAgICAgd2lkdGggLT0gd2lkdGhNb2Q7CisgICAg
ICAKKyAgICAvLyBEcmF3IHRoZSB1bmRlcmxpbmUKKyAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9
IHBsYXRmb3JtQ29udGV4dCgpOworICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7CisK
KyAgICBjb25zdCBDb2xvciYgcGF0dGVybkNvbG9yID0gZ3JhbW1hciA/IGdyYW1tYXJQYXR0ZXJu
Q29sb3IoKSA6IHNwZWxsaW5nUGF0dGVybkNvbG9yKCk7CisgICAgc2V0Q0dTdHJva2VDb2xvcihj
b250ZXh0LCBwYXR0ZXJuQ29sb3IpOworCisgICAgd2tTZXRQYXR0ZXJuUGhhc2VJblVzZXJTcGFj
ZShjb250ZXh0LCBwb2ludCk7CisgICAgQ0dDb250ZXh0U2V0QmxlbmRNb2RlKGNvbnRleHQsIGtD
R0JsZW5kTW9kZU5vcm1hbCk7CisgICAgCisgICAgLy8gMyByb3dzLCBlYWNoIG9mZnNldCBieSBo
YWxmIGEgcGl4ZWwgZm9yIGJsZW5kaW5nIHB1cnBvc2VzCisgICAgY29uc3QgQ0dQb2ludCB1cHBl
clBvaW50cyBbXSA9IHt7cG9pbnQueCgpLCBwb2ludC55KCkgKyBwYXR0ZXJuSGVpZ2h0IC0gMi41
IH0sIHtwb2ludC54KCkgKyB3aWR0aCwgcG9pbnQueSgpICsgcGF0dGVybkhlaWdodCAtIDIuNX19
OworICAgIGNvbnN0IENHUG9pbnQgbWlkZGxlUG9pbnRzIFtdID0ge3twb2ludC54KCksIHBvaW50
LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAxLjUgfSwge3BvaW50LngoKSArIHdpZHRoLCBwb2ludC55
KCkgKyBwYXR0ZXJuSGVpZ2h0IC0gMS41fX07CisgICAgY29uc3QgQ0dQb2ludCBsb3dlclBvaW50
cyBbXSA9IHt7cG9pbnQueCgpLCBwb2ludC55KCkgKyBwYXR0ZXJuSGVpZ2h0IC0gMC41IH0sIHtw
b2ludC54KCkgKyB3aWR0aCwgcG9pbnQueSgpICsgcGF0dGVybkhlaWdodCAtIDAuNSB9fTsKKyAg
ICAKKyAgICAvLyBEYXNoIGxlbmd0aHMgZm9yIHRoZSB0b3AgYW5kIGJvdHRvbSBvZiB0aGUgZXJy
b3IgdW5kZXJsaW5lIGFyZSB0aGUgc2FtZS4KKyAgICAvLyBUaGVzZSBhcmUgbWFnaWMuCisgICAg
c3RhdGljIGNvbnN0IGZsb2F0IGVkZ2VfZGFzaF9sZW5ndGhzW10gPSB7MiwgMn07CisgICAgc3Rh
dGljIGNvbnN0IGZsb2F0IG1pZGRsZV9kYXNoX2xlbmd0aHNbXSA9IHsyLjc2ZiwgMS4yNGZ9Owor
ICAgIHN0YXRpYyBjb25zdCBmbG9hdCBlZGdlX29mZnNldCA9IC0oZWRnZV9kYXNoX2xlbmd0aHNb
MV0gLSAxLjBmKSAvIDIuMGY7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IG1pZGRsZV9vZmZzZXQg
PSAtKG1pZGRsZV9kYXNoX2xlbmd0aHNbMV0gLSAxLjBmKSAvIDIuMGY7CisKKyAgICAvLyBMaW5l
IG9wYWNpdGllcy4gIE9uY2UgYWdhaW4sIHRoZXNlIGFyZSBtYWdpYy4KKyAgICBjb25zdCBmbG9h
dCB1cHBlck9wYWNpdHkgPSAwLjMzZjsKKyAgICBjb25zdCBmbG9hdCBtaWRkbGVPcGFjaXR5ID0g
MC43NWY7CisgICAgY29uc3QgZmxvYXQgbG93ZXJPcGFjaXR5ID0gMC44OGY7CisKKyAgICAvL1Rv
cCBsaW5lCisgICAgQ0dDb250ZXh0U2V0TGluZURhc2goY29udGV4dCwgZWRnZV9vZmZzZXQsIGVk
Z2VfZGFzaF9sZW5ndGhzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZWRnZV9k
YXNoX2xlbmd0aHMpIC8gc2l6ZW9mKGVkZ2VfZGFzaF9sZW5ndGhzWzBdKSk7CisgICAgQ0dDb250
ZXh0U2V0QWxwaGEoY29udGV4dCwgdXBwZXJPcGFjaXR5KTsKKyAgICBDR0NvbnRleHRTdHJva2VM
aW5lU2VnbWVudHMoY29udGV4dCwgdXBwZXJQb2ludHMsIDIpOworIAorICAgIC8vIE1pZGRsZSBs
aW5lCisgICAgQ0dDb250ZXh0U2V0TGluZURhc2goY29udGV4dCwgbWlkZGxlX29mZnNldCwgbWlk
ZGxlX2Rhc2hfbGVuZ3RocywgCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG1pZGRs
ZV9kYXNoX2xlbmd0aHMpIC8gc2l6ZW9mKG1pZGRsZV9kYXNoX2xlbmd0aHNbMF0pKTsKKyAgICBD
R0NvbnRleHRTZXRBbHBoYShjb250ZXh0LCBtaWRkbGVPcGFjaXR5KTsKKyAgICBDR0NvbnRleHRT
dHJva2VMaW5lU2VnbWVudHMoY29udGV4dCwgbWlkZGxlUG9pbnRzLCAyKTsKKyAgICAKKyAgICAv
LyBCb3R0b20gbGluZQorICAgIENHQ29udGV4dFNldExpbmVEYXNoKGNvbnRleHQsIGVkZ2Vfb2Zm
c2V0LCBlZGdlX2Rhc2hfbGVuZ3RocywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yo
ZWRnZV9kYXNoX2xlbmd0aHMpIC8gc2l6ZW9mKGVkZ2VfZGFzaF9sZW5ndGhzWzBdKSk7CisgICAg
Q0dDb250ZXh0U2V0QWxwaGEoY29udGV4dCwgbG93ZXJPcGFjaXR5KTsKKyAgICBDR0NvbnRleHRT
dHJva2VMaW5lU2VnbWVudHMoY29udGV4dCwgbG93ZXJQb2ludHMsIDIpOworCisgICAgQ0dDb250
ZXh0UmVzdG9yZUdTdGF0ZShjb250ZXh0KTsKK30KKworI2lmIEVOQUJMRShTVkcpCitHcmFwaGlj
c0NvbnRleHQqIGNvbnRleHRGb3JJbWFnZShTVkdSZXNvdXJjZUltYWdlKikKK3sKKyAgICAvLyBG
SVhNRTogVGhpcyBzaG91bGQgZ28gaW4gR3JhcGhpY3NDb250ZXh0Q0cuY3BwCisgICAgbm90SW1w
bGVtZW50ZWQoKTsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCit9CkluZGV4OiBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRDR1dpbi5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0Q0dXaW4u
Y3BwCShyZXZpc2lvbiAyOTcyNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dy
YXBoaWNzQ29udGV4dENHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8q
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1
LCAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMjksMjEgKzI5LDE4IEBACiAjaW5jbHVkZSAi
QWZmaW5lVHJhbnNmb3JtLmgiCiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRl
ICJQYXRoLmgiCisKICNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ0dCaXRtYXBDb250ZXh0Lmg+CiAj
aW5jbHVkZSA8V2ViS2l0U3lzdGVtSW50ZXJmYWNlL1dlYktpdFN5c3RlbUludGVyZmFjZS5oPgot
I2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+Ci0KLSNpbmNsdWRlICJHcmFwaGljc0NvbnRleHRQ
bGF0Zm9ybVByaXZhdGUuaCIKKyNpbmNsdWRlICJjZy9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVBy
aXZhdGUuaCIKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewog
Ci1jbGFzcyBTVkdSZXNvdXJjZUltYWdlOwotCiBzdGF0aWMgQ0dDb250ZXh0UmVmIENHQ29udGV4
dFdpdGhIREMoSERDIGhkYykKIHsKLSAgICBIQklUTUFQIGJpdG1hcCA9IChIQklUTUFQKUdldEN1
cnJlbnRPYmplY3QoaGRjLCBPQkpfQklUTUFQKTsKKyAgICBIQklUTUFQIGJpdG1hcCA9IHN0YXRp
Y19jYXN0PEhCSVRNQVA+KEdldEN1cnJlbnRPYmplY3QoaGRjLCBPQkpfQklUTUFQKSk7CiAgICAg
Q0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigp
OwogICAgIEJJVE1BUCBpbmZvOwogCkBAIC0xMTgsMTAgKzExNSwxMCBAQCBIREMgR3JhcGhpY3ND
b250ZXh0OjpnZXRXaW5kb3dzQ29udGV4dChjCiAKICAgICAgICAgLy8gQXBwbHkgYSB0cmFuc2xh
dGlvbiB0byBvdXIgY29udGV4dCBzbyB0aGF0IHRoZSBkcmF3aW5nIGRvbmUgd2lsbCBiZSBhdCAo
MCwwKSBvZiB0aGUgYml0bWFwLgogICAgICAgICBYRk9STSB4Zm9ybTsKLSAgICAgICAgeGZvcm0u
ZU0xMSA9IDEuMDsKLSAgICAgICAgeGZvcm0uZU0xMiA9IDA7Ci0gICAgICAgIHhmb3JtLmVNMjEg
PSAwOwotICAgICAgICB4Zm9ybS5lTTIyID0gMS4wOworICAgICAgICB4Zm9ybS5lTTExID0gMS4w
ZjsKKyAgICAgICAgeGZvcm0uZU0xMiA9IDAuMGY7CisgICAgICAgIHhmb3JtLmVNMjEgPSAwLjBm
OworICAgICAgICB4Zm9ybS5lTTIyID0gMS4wZjsKICAgICAgICAgeGZvcm0uZUR4ID0gLWRzdFJl
Y3QueCgpOwogICAgICAgICB4Zm9ybS5lRHkgPSAtZHN0UmVjdC55KCk7CiAgICAgICAgIDo6U2V0
V29ybGRUcmFuc2Zvcm0oYml0bWFwREMsICZ4Zm9ybSk7CkBAIC0xMzQsMTUgKzEzMSwxMyBAQCBI
REMgR3JhcGhpY3NDb250ZXh0OjpnZXRXaW5kb3dzQ29udGV4dChjCiAgICAgcmV0dXJuIG1fZGF0
YS0+bV9oZGM7CiB9CiAKLWJvb2wgR3JhcGhpY3NDb250ZXh0OjppblRyYW5zcGFyZW5jeUxheWVy
KCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLT5tX3RyYW5zcGFyZW5jeUNvdW50OyB9Ci0KIHZvaWQg
R3JhcGhpY3NDb250ZXh0OjpyZWxlYXNlV2luZG93c0NvbnRleHQoSERDIGhkYywgY29uc3QgSW50
UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVuZCkKIHsKICAgICBpZiAoaGRjICYm
IGluVHJhbnNwYXJlbmN5TGF5ZXIoKSkgewogICAgICAgICBpZiAoZHN0UmVjdC5pc0VtcHR5KCkp
CiAgICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgSEJJVE1BUCBiaXRtYXAgPSAoSEJJVE1B
UClHZXRDdXJyZW50T2JqZWN0KGhkYywgT0JKX0JJVE1BUCk7CisgICAgICAgIEhCSVRNQVAgYml0
bWFwID0gc3RhdGljX2Nhc3Q8SEJJVE1BUD4oR2V0Q3VycmVudE9iamVjdChoZGMsIE9CSl9CSVRN
QVApKTsKIAogICAgICAgICAvLyBOZWVkIHRvIG1ha2UgYSBDR0ltYWdlIG91dCBvZiB0aGUgYml0
bWFwJ3MgcGl4ZWwgYnVmZmVyIGFuZCB0aGVuIGRyYXcKICAgICAgICAgLy8gaXQgaW50byBvdXIg
Y29udGV4dC4KQEAgLTIwMywxMSArMTk4LDExIEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZv
cm1Qcml2YXRlOjpzY2EKICAgICAgICAgcmV0dXJuOwogICAgIFhGT1JNIHhmb3JtOwogICAgIHhm
b3JtLmVNMTEgPSBzaXplLndpZHRoKCk7Ci0gICAgeGZvcm0uZU0xMiA9IDA7Ci0gICAgeGZvcm0u
ZU0yMSA9IDA7CisgICAgeGZvcm0uZU0xMiA9IDAuMGY7CisgICAgeGZvcm0uZU0yMSA9IDAuMGY7
CiAgICAgeGZvcm0uZU0yMiA9IHNpemUuaGVpZ2h0KCk7Ci0gICAgeGZvcm0uZUR4ID0gMDsKLSAg
ICB4Zm9ybS5lRHkgPSAwOworICAgIHhmb3JtLmVEeCA9IDAuMGY7CisgICAgeGZvcm0uZUR5ID0g
MC4wZjsKICAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShtX2hkYywgJnhmb3JtLCBNV1RfTEVGVE1V
TFRJUExZKTsKIH0KIApAQCAtMjIzLDggKzIxOCw4IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxh
dGZvcm1Qcml2YXRlOjpyb3QKICAgICB4Zm9ybS5lTTEyID0gLXNpbkFuZ2xlOwogICAgIHhmb3Jt
LmVNMjEgPSBzaW5BbmdsZTsKICAgICB4Zm9ybS5lTTIyID0gY29zQW5nbGU7Ci0gICAgeGZvcm0u
ZUR4ID0gMDsKLSAgICB4Zm9ybS5lRHkgPSAwOworICAgIHhmb3JtLmVEeCA9IDAuMGY7CisgICAg
eGZvcm0uZUR5ID0gMC4wZjsKICAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShtX2hkYywgJnhmb3Jt
LCBNV1RfTEVGVE1VTFRJUExZKTsKIH0KIApAQCAtMjMzLDEwICsyMjgsMTAgQEAgdm9pZCBHcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnRyYQogICAgIGlmICghbV9oZGMpCiAgICAgICAg
IHJldHVybjsKICAgICBYRk9STSB4Zm9ybTsKLSAgICB4Zm9ybS5lTTExID0gMS4wOwotICAgIHhm
b3JtLmVNMTIgPSAwOwotICAgIHhmb3JtLmVNMjEgPSAwOwotICAgIHhmb3JtLmVNMjIgPSAxLjA7
CisgICAgeGZvcm0uZU0xMSA9IDEuMGY7CisgICAgeGZvcm0uZU0xMiA9IDAuMGY7CisgICAgeGZv
cm0uZU0yMSA9IDAuMGY7CisgICAgeGZvcm0uZU0yMiA9IDEuMGY7CiAgICAgeGZvcm0uZUR4ID0g
eDsKICAgICB4Zm9ybS5lRHkgPSB5OwogICAgIE1vZGlmeVdvcmxkVHJhbnNmb3JtKG1faGRjLCAm
eGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOwpAQCAtMjQ2LDYgKzI0MSw3IEBAIHZvaWQgR3JhcGhp
Y3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpjb24KIHsKICAgICBpZiAoIW1faGRjKQogICAgICAg
ICByZXR1cm47CisKICAgICBDR0FmZmluZVRyYW5zZm9ybSBtYXQgPSB0cmFuc2Zvcm07CiAgICAg
WEZPUk0geGZvcm07CiAgICAgeGZvcm0uZU0xMSA9IG1hdC5hOwpAQCAtMjU0LDYgKzI1MCw3IEBA
IHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpjb24KICAgICB4Zm9ybS5lTTIy
ID0gbWF0LmQ7CiAgICAgeGZvcm0uZUR4ID0gbWF0LnR4OwogICAgIHhmb3JtLmVEeSA9IG1hdC50
eTsKKwogICAgIE1vZGlmeVdvcmxkVHJhbnNmb3JtKG1faGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVM
VElQTFkpOwogfQogCkBAIC0yODcsNiArMjg0LDE0IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0Ojpk
cmF3Rm9jdXNSaW5nKGNvbnMKICAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOwog
fQogCisvLyBQdWxsZWQgZnJvbSBHcmFwaGljc0NvbnRleHRDRworc3RhdGljIHZvaWQgc2V0Q0dT
dHJva2VDb2xvcihDR0NvbnRleHRSZWYgY29udGV4dCwgY29uc3QgQ29sb3ImIGNvbG9yKQorewor
ICAgIENHRmxvYXQgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGE7CisgICAgY29sb3IuZ2V0UkdCQShy
ZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisgICAgQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3Io
Y29udGV4dCwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworfQorCiBzdGF0aWMgY29uc3QgQ29s
b3ImIHNwZWxsaW5nUGF0dGVybkNvbG9yKCkgewogICAgIHN0YXRpYyBjb25zdCBDb2xvciBzcGVs
bGluZ0NvbG9yKDI1NSwgMCwgMCk7CiAgICAgcmV0dXJuIHNwZWxsaW5nQ29sb3I7CkBAIC0yOTcs
MTkgKzMwMiwxMSBAQCBzdGF0aWMgY29uc3QgQ29sb3ImIGdyYW1tYXJQYXR0ZXJuQ29sb3IoCiAg
ICAgcmV0dXJuIGdyYW1tYXJDb2xvcjsKIH0KIAotLy8gUHVsbGVkIGZyb20gR3JhcGhpY3NDb250
ZXh0Q0cKLXN0YXRpYyB2b2lkIHNldENHU3Ryb2tlQ29sb3IoQ0dDb250ZXh0UmVmIGNvbnRleHQs
IGNvbnN0IENvbG9yJiBjb2xvcikKLXsKLSAgICBDR0Zsb2F0IHJlZCwgZ3JlZW4sIGJsdWUsIGFs
cGhhOwotICAgIGNvbG9yLmdldFJHQkEocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotICAgIENH
Q29udGV4dFNldFJHQlN0cm9rZUNvbG9yKGNvbnRleHQsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhh
KTsKLX0KLQogdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yTWlzc3BlbGxpbmdPckJh
ZEdyYW1tYXIoY29uc3QgSW50UG9pbnQmIHBvaW50LCBpbnQgd2lkdGgsIGJvb2wgZ3JhbW1hcikK
IHsKICAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQogICAgICAgICByZXR1cm47Ci0gICAgCisK
ICAgICAvLyBUaGVzZSBhcmUgdGhlIHNhbWUgZm9yIG1pc3NwZWxsaW5nIG9yIGJhZCBncmFtbWFy
CiAgICAgY29uc3QgaW50IHBhdHRlcm5IZWlnaHQgPSAzOyAvLyAzIHJvd3MKICAgICBBU1NFUlQo
Y01pc3NwZWxsaW5nTGluZVRoaWNrbmVzcyA9PSBwYXR0ZXJuSGVpZ2h0KTsKQEAgLTM0Myw3ICsz
NDAsNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JNaXNzcGVsCiAgICAgCiAg
ICAgLy8gRGFzaCBsZW5ndGhzIGZvciB0aGUgdG9wIGFuZCBib3R0b20gb2YgdGhlIGVycm9yIHVu
ZGVybGluZSBhcmUgdGhlIHNhbWUuCiAgICAgLy8gVGhlc2UgYXJlIG1hZ2ljLgotICAgIHN0YXRp
YyBjb25zdCBmbG9hdCBlZGdlX2Rhc2hfbGVuZ3Roc1tdID0gezIsIDJ9OworICAgIHN0YXRpYyBj
b25zdCBmbG9hdCBlZGdlX2Rhc2hfbGVuZ3Roc1tdID0gezIuMGYsIDIuMGZ9OwogICAgIHN0YXRp
YyBjb25zdCBmbG9hdCBtaWRkbGVfZGFzaF9sZW5ndGhzW10gPSB7Mi43NmYsIDEuMjRmfTsKICAg
ICBzdGF0aWMgY29uc3QgZmxvYXQgZWRnZV9vZmZzZXQgPSAtKGVkZ2VfZGFzaF9sZW5ndGhzWzFd
IC0gMS4wZikgLyAyLjBmOwogICAgIHN0YXRpYyBjb25zdCBmbG9hdCBtaWRkbGVfb2Zmc2V0ID0g
LShtaWRkbGVfZGFzaF9sZW5ndGhzWzFdIC0gMS4wZikgLyAyLjBmOwpAQCAtMzc0LDEzICszNzEs
NCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JNaXNzcGVsCiAgICAgQ0dDb250
ZXh0UmVzdG9yZUdTdGF0ZShjb250ZXh0KTsKIH0KIAotI2lmIEVOQUJMRShTVkcpCi1HcmFwaGlj
c0NvbnRleHQqIGNvbnRleHRGb3JJbWFnZShTVkdSZXNvdXJjZUltYWdlKikKLXsKLSAgICAvLyBG
SVhNRTogVGhpcyBzaG91bGQgZ28gaW4gR3JhcGhpY3NDb250ZXh0Q0cuY3BwCi0gICAgbm90SW1w
bGVtZW50ZWQoKTsKLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCiB9CkluZGV4OiBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRDYWlyb1dpbi5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0Q2Fp
cm9XaW4uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4v
R3JhcGhpY3NDb250ZXh0Q2Fpcm9XaW4uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDExNCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBD
T01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENP
TVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRl
eHQuaCIKKworI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgorI2luY2x1ZGUgIk5vdEltcGxl
bWVudGVkLmgiCisjaW5jbHVkZSAiUGF0aC5oIgorCisjaW5jbHVkZSA8Y2Fpcm8td2luMzIuaD4K
KyNpbmNsdWRlICJjYWlyby9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUuaCIKKwordXNp
bmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitHcmFwaGljc0NvbnRl
eHQ6OkdyYXBoaWNzQ29udGV4dChIREMgZGMpCisgICAgOiBtX2NvbW1vbihjcmVhdGVHcmFwaGlj
c0NvbnRleHRQcml2YXRlKCkpCisgICAgLCBtX2RhdGEobmV3IEdyYXBoaWNzQ29udGV4dFBsYXRm
b3JtUHJpdmF0ZSkKK3sKKyAgICBpZiAoZGMpIHsKKyAgICAgICAgY2Fpcm9fc3VyZmFjZV90KiBz
dXJmYWNlID0gY2Fpcm9fd2luMzJfc3VyZmFjZV9jcmVhdGUoZGMpOworICAgICAgICBtX2RhdGEt
PmNyID0gY2Fpcm9fY3JlYXRlKHN1cmZhY2UpOworICAgICAgICBtX2RhdGEtPm1faGRjID0gZGM7
CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0UGFpbnRpbmdEaXNhYmxlZCh0cnVlKTsKKyAgICAg
ICAgbV9kYXRhLT5jciA9IDA7CisgICAgICAgIG1fZGF0YS0+bV9oZGMgPSAwOworICAgIH0KKwor
ICAgIGlmIChtX2RhdGEtPmNyKSB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGV4dCBz
dGFydHMgaW4gc3luYyB3aXRoIG91ciBzdGF0ZS4KKyAgICAgICAgc2V0UGxhdGZvcm1GaWxsQ29s
b3IoZmlsbENvbG9yKCkpOworICAgICAgICBzZXRQbGF0Zm9ybVN0cm9rZUNvbG9yKHN0cm9rZUNv
bG9yKCkpOworICAgIH0KK30KKworSERDIEdyYXBoaWNzQ29udGV4dDo6Z2V0V2luZG93c0NvbnRl
eHQoY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVuZCkKK3sKKyAg
ICAvLyBUaGlzIGlzIHByb2JhYmx5IHdyb25nLCBhbmQgZGVmaW5pdGVseSBvdXQgb2YgZGF0ZS4g
IFB1bGxlZCBmcm9tIG9sZCBTVk4KKyAgICBjYWlyb19zdXJmYWNlX3QqIHN1cmZhY2UgPSBjYWly
b19nZXRfdGFyZ2V0KHBsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBIREMgaGRjID0gY2Fpcm9fd2lu
MzJfc3VyZmFjZV9nZXRfZGMoc3VyZmFjZSk7ICAgCisgICAgU2F2ZURDKGhkYyk7CisKKyAgICAv
LyBGSVhNRTogV2UgbmVlZCB0byBtYWtlIHN1cmUgYSBjbGlwIGlzIHJlYWxseSBzZXQgb24gdGhl
IEhEQy4KKyAgICAvLyBDYWxsIFNldFdvcmxkVHJhbnNmb3JtIHRvIGhvbm9yIHRoZSBjdXJyZW50
IENhaXJvIHRyYW5zZm9ybS4KKyAgICBTZXRHcmFwaGljc01vZGUoaGRjLCBHTV9BRFZBTkNFRCk7
IC8vIFdlIG5lZWQgdGhpcyBjYWxsIGZvciB0aGVtZXMgdG8gaG9ub3Igd29ybGQgdHJhbnNmb3Jt
cy4KKyAgICBjYWlyb19tYXRyaXhfdCBtYXQ7CisgICAgY2Fpcm9fZ2V0X21hdHJpeChwbGF0Zm9y
bUNvbnRleHQoKSwgJm1hdCk7CisgICAgWEZPUk0geGZvcm07CisgICAgeGZvcm0uZU0xMSA9IG1h
dC54eDsKKyAgICB4Zm9ybS5lTTEyID0gbWF0Lnh5OworICAgIHhmb3JtLmVNMjEgPSBtYXQueXg7
CisgICAgeGZvcm0uZU0yMiA9IG1hdC55eTsKKyAgICB4Zm9ybS5lRHggPSBtYXQueDA7CisgICAg
eGZvcm0uZUR5ID0gbWF0LnkwOworICAgIFNldFdvcmxkVHJhbnNmb3JtKGhkYywgJnhmb3JtKTsK
KworICAgIHJldHVybiBoZGM7Cit9CisKK2Jvb2wgR3JhcGhpY3NDb250ZXh0OjppblRyYW5zcGFy
ZW5jeUxheWVyKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLT5tX3RyYW5zcGFyZW5jeUNvdW50OyB9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpyZWxlYXNlV2luZG93c0NvbnRleHQoSERDIGhkYywg
Y29uc3QgSW50UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVuZCkKK3sKKyAgICBj
YWlyb19zdXJmYWNlX3QqIHN1cmZhY2UgPSBjYWlyb19nZXRfdGFyZ2V0KHBsYXRmb3JtQ29udGV4
dCgpKTsKKyAgICBIREMgaGRjMiA9IGNhaXJvX3dpbjMyX3N1cmZhY2VfZ2V0X2RjKHN1cmZhY2Up
OworICAgIFJlc3RvcmVEQyhoZGMyLCAtMSk7CisgICAgY2Fpcm9fc3VyZmFjZV9tYXJrX2RpcnR5
KHN1cmZhY2UpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y29uY2F0Q1RNKGNvbnN0IEFm
ZmluZVRyYW5zZm9ybSYgdHJhbnNmb3JtKQoreworICAgIGNhaXJvX3N1cmZhY2VfdCogc3VyZmFj
ZSA9IGNhaXJvX2dldF90YXJnZXQocGxhdGZvcm1Db250ZXh0KCkpOworICAgIEhEQyBoZGMgPSBj
YWlyb193aW4zMl9zdXJmYWNlX2dldF9kYyhzdXJmYWNlKTsgICAKKyAgICBTYXZlREMoaGRjKTsK
KworICAgIGNhaXJvX21hdHJpeF90IG1hdDsKKyAgICBjYWlyb19nZXRfbWF0cml4KHBsYXRmb3Jt
Q29udGV4dCgpLCAmbWF0KTsKKyAgICBYRk9STSB4Zm9ybTsKKyAgICB4Zm9ybS5lTTExID0gbWF0
Lnh4OworICAgIHhmb3JtLmVNMTIgPSBtYXQueHk7CisgICAgeGZvcm0uZU0yMSA9IG1hdC55eDsK
KyAgICB4Zm9ybS5lTTIyID0gbWF0Lnl5OworICAgIHhmb3JtLmVEeCA9IG1hdC54MDsKKyAgICB4
Zm9ybS5lRHkgPSBtYXQueTA7CisKKyAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShoZGMsICZ4Zm9y
bSwgTVdUX0xFRlRNVUxUSVBMWSk7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dFdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0V2luLmNwcAkocmV2aXNpb24gMjk4
MzQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRXaW4u
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykg
MjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCkBAIC0yOSwxMSArMjksOSBAQAogI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgog
I2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCiAjaW5jbHVkZSAiUGF0aC5oIgotI2luY2x1ZGUg
PENvcmVHcmFwaGljcy9DR0JpdG1hcENvbnRleHQuaD4KLSNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1J
bnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8d3RmL01hdGhFeHRy
YXMuaD4KIAotI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZS5oIgorI2lu
Y2x1ZGUgImNnL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZS5oIgogCiB1c2luZyBuYW1l
c3BhY2Ugc3RkOwogCkBAIC00MSwzMzkgKzM5LDggQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiBj
bGFzcyBTVkdSZXNvdXJjZUltYWdlOwogCi1zdGF0aWMgQ0dDb250ZXh0UmVmIENHQ29udGV4dFdp
dGhIREMoSERDIGhkYykKLXsKLSAgICBIQklUTUFQIGJpdG1hcCA9IChIQklUTUFQKUdldEN1cnJl
bnRPYmplY3QoaGRjLCBPQkpfQklUTUFQKTsKLSAgICBDR0NvbG9yU3BhY2VSZWYgZGV2aWNlUkdC
ID0gQ0dDb2xvclNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7Ci0gICAgQklUTUFQIGluZm87Ci0KLSAg
ICBHZXRPYmplY3QoYml0bWFwLCBzaXplb2YoaW5mbyksICZpbmZvKTsKLSAgICBBU1NFUlQoaW5m
by5ibUJpdHNQaXhlbCA9PSAzMik7Ci0gICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBDR0JpdG1h
cENvbnRleHRDcmVhdGUoaW5mby5ibUJpdHMsIGluZm8uYm1XaWR0aCwgaW5mby5ibUhlaWdodCwg
OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZv
LmJtV2lkdGhCeXRlcywgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IGtD
R0ltYWdlQWxwaGFOb25lU2tpcEZpcnN0KTsKLSAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKGRldmlj
ZVJHQik7Ci0KLSAgICAvLyBGbGlwIGNvb3JkcwotICAgIENHQ29udGV4dFRyYW5zbGF0ZUNUTShj
b250ZXh0LCAwLCBpbmZvLmJtSGVpZ2h0KTsKLSAgICBDR0NvbnRleHRTY2FsZUNUTShjb250ZXh0
LCAxLCAtMSk7Ci0gICAgCi0gICAgLy8gUHV0IHRoZSBIREMgSW4gYWR2YW5jZWQgbW9kZSBzbyBp
dCB3aWxsIGhvbm9yIGFmZmluZSB0cmFuc2Zvcm1zLgotICAgIFNldEdyYXBoaWNzTW9kZShoZGMs
IEdNX0FEVkFOQ0VEKTsKLSAgICAKLSAgICByZXR1cm4gY29udGV4dDsKLX0KLQotR3JhcGhpY3ND
b250ZXh0OjpHcmFwaGljc0NvbnRleHQoSERDIGhkYykKLSAgICA6IG1fY29tbW9uKGNyZWF0ZUdy
YXBoaWNzQ29udGV4dFByaXZhdGUoKSkKLSAgICAsIG1fZGF0YShuZXcgR3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlKENHQ29udGV4dFdpdGhIREMoaGRjKSkpCi17Ci0gICAgQ0dDb250ZXh0
UmVsZWFzZShtX2RhdGEtPm1fY2dDb250ZXh0KTsKLSAgICBtX2RhdGEtPm1faGRjID0gaGRjOwot
ICAgIHNldFBhaW50aW5nRGlzYWJsZWQoIW1fZGF0YS0+bV9jZ0NvbnRleHQpOwotICAgIGlmICht
X2RhdGEtPm1fY2dDb250ZXh0KSB7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGV4dCBz
dGFydHMgaW4gc3luYyB3aXRoIG91ciBzdGF0ZS4KLSAgICAgICAgc2V0UGxhdGZvcm1GaWxsQ29s
b3IoZmlsbENvbG9yKCkpOwotICAgICAgICBzZXRQbGF0Zm9ybVN0cm9rZUNvbG9yKHN0cm9rZUNv
bG9yKCkpOwotICAgIH0KLX0KLQotSERDIEdyYXBoaWNzQ29udGV4dDo6Z2V0V2luZG93c0NvbnRl
eHQoY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVuZCkKLXsKLSAg
ICBpZiAoaW5UcmFuc3BhcmVuY3lMYXllcigpKSB7Ci0gICAgICAgIGlmIChkc3RSZWN0LmlzRW1w
dHkoKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIGJpdG1h
cCBEQyBpbiB3aGljaCB0byBkcmF3LgotICAgICAgICBCSVRNQVBJTkZPIGJpdG1hcEluZm87Ci0g
ICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpU2l6ZSAgICAgICAgICA9IHNpemVvZihCSVRN
QVBJTkZPSEVBREVSKTsKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlXaWR0aCAgICAg
ICAgID0gZHN0UmVjdC53aWR0aCgpOyAKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlI
ZWlnaHQgICAgICAgID0gZHN0UmVjdC5oZWlnaHQoKTsKLSAgICAgICAgYml0bWFwSW5mby5ibWlI
ZWFkZXIuYmlQbGFuZXMgICAgICAgID0gMTsKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIu
YmlCaXRDb3VudCAgICAgID0gMzI7Ci0gICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpQ29t
cHJlc3Npb24gICA9IEJJX1JHQjsKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlTaXpl
SW1hZ2UgICAgID0gMDsKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlYUGVsc1Blck1l
dGVyID0gMDsKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlZUGVsc1Blck1ldGVyID0g
MDsKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlDbHJVc2VkICAgICAgID0gMDsKLSAg
ICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlDbHJJbXBvcnRhbnQgID0gMDsKLQotICAgICAg
ICB2b2lkKiBwaXhlbHMgPSAwOwotICAgICAgICBIQklUTUFQIGJpdG1hcCA9IDo6Q3JlYXRlRElC
U2VjdGlvbihOVUxMLCAmYml0bWFwSW5mbywgRElCX1JHQl9DT0xPUlMsICZwaXhlbHMsIDAsIDAp
OwotICAgICAgICBpZiAoIWJpdG1hcCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAg
IEhEQyBiaXRtYXBEQyA9IDo6Q3JlYXRlQ29tcGF0aWJsZURDKG1fZGF0YS0+bV9oZGMpOwotICAg
ICAgICA6OlNlbGVjdE9iamVjdChiaXRtYXBEQywgYml0bWFwKTsKLQotICAgICAgICAvLyBGaWxs
IG91ciBidWZmZXIgd2l0aCBjbGVhciBpZiB3ZSdyZSBnb2luZyB0byBhbHBoYSBibGVuZC4KLSAg
ICAgICAgaWYgKHN1cHBvcnRBbHBoYUJsZW5kKSB7Ci0gICAgICAgICAgICBCSVRNQVAgYm1wSW5m
bzsKLSAgICAgICAgICAgIEdldE9iamVjdChiaXRtYXAsIHNpemVvZihibXBJbmZvKSwgJmJtcElu
Zm8pOwotICAgICAgICAgICAgaW50IGJ1ZmZlclNpemUgPSBibXBJbmZvLmJtV2lkdGhCeXRlcyAq
IGJtcEluZm8uYm1IZWlnaHQ7Ci0gICAgICAgICAgICBtZW1zZXQoYm1wSW5mby5ibUJpdHMsIDAs
IGJ1ZmZlclNpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGNhbiBk
byB3b3JsZCB0cmFuc2Zvcm1zLgotICAgICAgICBTZXRHcmFwaGljc01vZGUoYml0bWFwREMsIEdN
X0FEVkFOQ0VEKTsKLQotICAgICAgICAvLyBBcHBseSBhIHRyYW5zbGF0aW9uIHRvIG91ciBjb250
ZXh0IHNvIHRoYXQgdGhlIGRyYXdpbmcgZG9uZSB3aWxsIGJlIGF0ICgwLDApIG9mIHRoZSBiaXRt
YXAuCi0gICAgICAgIFhGT1JNIHhmb3JtOwotICAgICAgICB4Zm9ybS5lTTExID0gMS4wOwotICAg
ICAgICB4Zm9ybS5lTTEyID0gMDsKLSAgICAgICAgeGZvcm0uZU0yMSA9IDA7Ci0gICAgICAgIHhm
b3JtLmVNMjIgPSAxLjA7Ci0gICAgICAgIHhmb3JtLmVEeCA9IC1kc3RSZWN0LngoKTsKLSAgICAg
ICAgeGZvcm0uZUR5ID0gLWRzdFJlY3QueSgpOwotICAgICAgICA6OlNldFdvcmxkVHJhbnNmb3Jt
KGJpdG1hcERDLCAmeGZvcm0pOwotCi0gICAgICAgIHJldHVybiBiaXRtYXBEQzsKLSAgICB9Ci0K
LSAgICBDR0NvbnRleHRGbHVzaChwbGF0Zm9ybUNvbnRleHQoKSk7Ci0gICAgbV9kYXRhLT5zYXZl
KCk7Ci0gICAgcmV0dXJuIG1fZGF0YS0+bV9oZGM7Ci19Ci0KIGJvb2wgR3JhcGhpY3NDb250ZXh0
OjppblRyYW5zcGFyZW5jeUxheWVyKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLT5tX3RyYW5zcGFy
ZW5jeUNvdW50OyB9CiAKLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpyZWxlYXNlV2luZG93c0NvbnRl
eHQoSERDIGhkYywgY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVu
ZCkKLXsKLSAgICBpZiAoaGRjICYmIGluVHJhbnNwYXJlbmN5TGF5ZXIoKSkgewotICAgICAgICBp
ZiAoZHN0UmVjdC5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgSEJJ
VE1BUCBiaXRtYXAgPSAoSEJJVE1BUClHZXRDdXJyZW50T2JqZWN0KGhkYywgT0JKX0JJVE1BUCk7
Ci0KLSAgICAgICAgLy8gTmVlZCB0byBtYWtlIGEgQ0dJbWFnZSBvdXQgb2YgdGhlIGJpdG1hcCdz
IHBpeGVsIGJ1ZmZlciBhbmQgdGhlbiBkcmF3Ci0gICAgICAgIC8vIGl0IGludG8gb3VyIGNvbnRl
eHQuCi0gICAgICAgIEJJVE1BUCBpbmZvOwotICAgICAgICBHZXRPYmplY3QoYml0bWFwLCBzaXpl
b2YoaW5mbyksICZpbmZvKTsKLSAgICAgICAgQVNTRVJUKGluZm8uYm1CaXRzUGl4ZWwgPT0gMzIp
OwotCi0gICAgICAgIENHQ29sb3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVh
dGVEZXZpY2VSR0IoKTsKLSAgICAgICAgQ0dDb250ZXh0UmVmIGJpdG1hcENvbnRleHQgPSBDR0Jp
dG1hcENvbnRleHRDcmVhdGUoaW5mby5ibUJpdHMsIGluZm8uYm1XaWR0aCwgaW5mby5ibUhlaWdo
dCwgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9yZGVy
MzJMaXR0bGUgfCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKHN1cHBvcnRBbHBoYUJsZW5kID8ga0NHSW1hZ2VBbHBoYVByZW11bHRp
cGxpZWRGaXJzdCA6IGtDR0ltYWdlQWxwaGFOb25lU2tpcEZpcnN0KSk7Ci0gICAgICAgIENHQ29s
b3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKLQotICAgICAgICBDR0ltYWdlUmVmIGltYWdlID0g
Q0dCaXRtYXBDb250ZXh0Q3JlYXRlSW1hZ2UoYml0bWFwQ29udGV4dCk7Ci0gICAgICAgIENHQ29u
dGV4dERyYXdJbWFnZShtX2RhdGEtPm1fY2dDb250ZXh0LCBkc3RSZWN0LCBpbWFnZSk7Ci0gICAg
ICAgIAotICAgICAgICAvLyBEZWxldGUgYWxsIG91ciBqdW5rLgotICAgICAgICBDR0ltYWdlUmVs
ZWFzZShpbWFnZSk7Ci0gICAgICAgIENHQ29udGV4dFJlbGVhc2UoYml0bWFwQ29udGV4dCk7Ci0g
ICAgICAgIDo6RGVsZXRlREMoaGRjKTsKLSAgICAgICAgOjpEZWxldGVPYmplY3QoYml0bWFwKTsK
LQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbV9kYXRhLT5yZXN0b3JlKCk7Ci19Ci0K
LXZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpzYXZlKCkKLXsKLSAgICBpZiAo
IW1faGRjKQotICAgICAgICByZXR1cm47Ci0gICAgU2F2ZURDKG1faGRjKTsKLX0KLQotdm9pZCBH
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnJlc3RvcmUoKQotewotICAgIGlmICghbV9o
ZGMpCi0gICAgICAgIHJldHVybjsKLSAgICBSZXN0b3JlREMobV9oZGMsIC0xKTsKLX0KLQotdm9p
ZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNsaXAoY29uc3QgSW50UmVjdCYgY2xp
cFJlY3QpCi17Ci0gICAgaWYgKCFtX2hkYykKLSAgICAgICAgcmV0dXJuOwotICAgIEludGVyc2Vj
dENsaXBSZWN0KG1faGRjLCBjbGlwUmVjdC54KCksIGNsaXBSZWN0LnkoKSwgY2xpcFJlY3Qucmln
aHQoKSwgY2xpcFJlY3QuYm90dG9tKCkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRm
b3JtUHJpdmF0ZTo6Y2xpcChjb25zdCBQYXRoJikKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwot
fQotCi12b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6c2NhbGUoY29uc3QgRmxv
YXRTaXplJiBzaXplKQotewotICAgIGlmICghbV9oZGMpCi0gICAgICAgIHJldHVybjsKLSAgICBY
Rk9STSB4Zm9ybTsKLSAgICB4Zm9ybS5lTTExID0gc2l6ZS53aWR0aCgpOwotICAgIHhmb3JtLmVN
MTIgPSAwOwotICAgIHhmb3JtLmVNMjEgPSAwOwotICAgIHhmb3JtLmVNMjIgPSBzaXplLmhlaWdo
dCgpOwotICAgIHhmb3JtLmVEeCA9IDA7Ci0gICAgeGZvcm0uZUR5ID0gMDsKLSAgICBNb2RpZnlX
b3JsZFRyYW5zZm9ybShtX2hkYywgJnhmb3JtLCBNV1RfTEVGVE1VTFRJUExZKTsKLX0KLQotc3Rh
dGljIGNvbnN0IGRvdWJsZSBkZWcycmFkID0gMC4wMTc0NTMyOTI1MTk5NDMyOTU3Njk7IC8vIHBp
LzE4MAotCi12b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6cm90YXRlKGZsb2F0
IGRlZ3JlZXNBbmdsZSkKLXsKLSAgICBmbG9hdCByYWRpYW5zQW5nbGUgPSBkZWdyZWVzQW5nbGUg
KiBkZWcycmFkOwotICAgIGZsb2F0IGNvc0FuZ2xlID0gY29zZihyYWRpYW5zQW5nbGUpOwotICAg
IGZsb2F0IHNpbkFuZ2xlID0gc2luZihyYWRpYW5zQW5nbGUpOwotICAgIFhGT1JNIHhmb3JtOwot
ICAgIHhmb3JtLmVNMTEgPSBjb3NBbmdsZTsKLSAgICB4Zm9ybS5lTTEyID0gLXNpbkFuZ2xlOwot
ICAgIHhmb3JtLmVNMjEgPSBzaW5BbmdsZTsKLSAgICB4Zm9ybS5lTTIyID0gY29zQW5nbGU7Ci0g
ICAgeGZvcm0uZUR4ID0gMDsKLSAgICB4Zm9ybS5lRHkgPSAwOwotICAgIE1vZGlmeVdvcmxkVHJh
bnNmb3JtKG1faGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6dHJhbnNsYXRlKGZsb2F0IHggLCBmbG9hdCB5KQot
ewotICAgIGlmICghbV9oZGMpCi0gICAgICAgIHJldHVybjsKLSAgICBYRk9STSB4Zm9ybTsKLSAg
ICB4Zm9ybS5lTTExID0gMS4wOwotICAgIHhmb3JtLmVNMTIgPSAwOwotICAgIHhmb3JtLmVNMjEg
PSAwOwotICAgIHhmb3JtLmVNMjIgPSAxLjA7Ci0gICAgeGZvcm0uZUR4ID0geDsKLSAgICB4Zm9y
bS5lRHkgPSB5OwotICAgIE1vZGlmeVdvcmxkVHJhbnNmb3JtKG1faGRjLCAmeGZvcm0sIE1XVF9M
RUZUTVVMVElQTFkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6
Y29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdHJhbnNmb3JtKQotewotICAgIGlmICgh
bV9oZGMpCi0gICAgICAgIHJldHVybjsKLSAgICBDR0FmZmluZVRyYW5zZm9ybSBtYXQgPSB0cmFu
c2Zvcm07Ci0gICAgWEZPUk0geGZvcm07Ci0gICAgeGZvcm0uZU0xMSA9IG1hdC5hOwotICAgIHhm
b3JtLmVNMTIgPSBtYXQuYjsKLSAgICB4Zm9ybS5lTTIxID0gbWF0LmM7Ci0gICAgeGZvcm0uZU0y
MiA9IG1hdC5kOwotICAgIHhmb3JtLmVEeCA9IG1hdC50eDsKLSAgICB4Zm9ybS5lRHkgPSBtYXQu
dHk7Ci0gICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxU
SVBMWSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3Rm9jdXNSaW5nKGNvbnN0IENv
bG9yJiBjb2xvcikKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBmbG9hdCByYWRpdXMgPSAoZm9jdXNSaW5nV2lkdGgoKSAtIDEpIC8gMi4wZjsK
LSAgICBpbnQgb2Zmc2V0ID0gcmFkaXVzICsgZm9jdXNSaW5nT2Zmc2V0KCk7Ci0gICAgQ0dDb2xv
clJlZiBjb2xvclJlZiA9IGNvbG9yLmlzVmFsaWQoKSA/IGNnQ29sb3IoY29sb3IpIDogMDsKLQot
ICAgIENHTXV0YWJsZVBhdGhSZWYgZm9jdXNSaW5nUGF0aCA9IENHUGF0aENyZWF0ZU11dGFibGUo
KTsKLSAgICBjb25zdCBWZWN0b3I8SW50UmVjdD4mIHJlY3RzID0gZm9jdXNSaW5nUmVjdHMoKTsK
LSAgICB1bnNpZ25lZCByZWN0Q291bnQgPSByZWN0cy5zaXplKCk7Ci0gICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IHJlY3RDb3VudDsgaSsrKQotICAgICAgICBDR1BhdGhBZGRSZWN0KGZvY3Vz
UmluZ1BhdGgsIDAsIENHUmVjdEluc2V0KHJlY3RzW2ldLCAtb2Zmc2V0LCAtb2Zmc2V0KSk7Ci0K
LSAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOwotICAgIENHQ29u
dGV4dFNhdmVHU3RhdGUoY29udGV4dCk7Ci0KLSAgICBDR0NvbnRleHRCZWdpblBhdGgoY29udGV4
dCk7Ci0gICAgQ0dDb250ZXh0QWRkUGF0aChjb250ZXh0LCBmb2N1c1JpbmdQYXRoKTsKLQotICAg
IHdrRHJhd0ZvY3VzUmluZyhjb250ZXh0LCBjb2xvclJlZiwgcmFkaXVzKTsKLQotICAgIENHQ29s
b3JSZWxlYXNlKGNvbG9yUmVmKTsKLQotICAgIENHUGF0aFJlbGVhc2UoZm9jdXNSaW5nUGF0aCk7
Ci0KLSAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOwotfQotCi1zdGF0aWMgY29u
c3QgQ29sb3ImIHNwZWxsaW5nUGF0dGVybkNvbG9yKCkgewotICAgIHN0YXRpYyBjb25zdCBDb2xv
ciBzcGVsbGluZ0NvbG9yKDI1NSwgMCwgMCk7Ci0gICAgcmV0dXJuIHNwZWxsaW5nQ29sb3I7Ci19
Ci0KLXN0YXRpYyBjb25zdCBDb2xvciYgZ3JhbW1hclBhdHRlcm5Db2xvcigpIHsKLSAgICBzdGF0
aWMgY29uc3QgQ29sb3IgZ3JhbW1hckNvbG9yKDAsIDEyOCwgMCk7Ci0gICAgcmV0dXJuIGdyYW1t
YXJDb2xvcjsKLX0KLQotLy8gUHVsbGVkIGZyb20gR3JhcGhpY3NDb250ZXh0Q0cKLXN0YXRpYyB2
b2lkIHNldENHU3Ryb2tlQ29sb3IoQ0dDb250ZXh0UmVmIGNvbnRleHQsIGNvbnN0IENvbG9yJiBj
b2xvcikKLXsKLSAgICBDR0Zsb2F0IHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhOwotICAgIGNvbG9y
LmdldFJHQkEocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotICAgIENHQ29udGV4dFNldFJHQlN0
cm9rZUNvbG9yKGNvbnRleHQsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLX0KLQotdm9pZCBH
cmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yTWlzc3BlbGxpbmdPckJhZEdyYW1tYXIoY29uc3Qg
SW50UG9pbnQmIHBvaW50LCBpbnQgd2lkdGgsIGJvb2wgZ3JhbW1hcikKLXsKLSAgICBpZiAocGFp
bnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgLy8gVGhlc2UgYXJl
IHRoZSBzYW1lIGZvciBtaXNzcGVsbGluZyBvciBiYWQgZ3JhbW1hcgotICAgIGNvbnN0IGludCBw
YXR0ZXJuSGVpZ2h0ID0gMzsgLy8gMyByb3dzCi0gICAgQVNTRVJUKGNNaXNzcGVsbGluZ0xpbmVU
aGlja25lc3MgPT0gcGF0dGVybkhlaWdodCk7Ci0gICAgY29uc3QgaW50IHBhdHRlcm5XaWR0aCA9
IDQ7IC8vIDQgcGl4ZWxzCi0gICAgQVNTRVJUKHBhdHRlcm5XaWR0aCA9PSBjTWlzc3BlbGxpbmdM
aW5lUGF0dGVybldpZHRoKTsKLQotICAgIC8vIE1ha2Ugc3VyZSB0byBkcmF3IG9ubHkgY29tcGxl
dGUgZG90cy4KLSAgICAvLyBOT1RFOiBDb2RlIGhlcmUgdXNlZCB0byBzaGlmdCB0aGUgdW5kZXJs
aW5lIHRvIHRoZSBsZWZ0IGFuZCBpbmNyZWFzZSB0aGUgd2lkdGgKLSAgICAvLyB0byBtYWtlIHN1
cmUgZXZlcnl0aGluZyBnZXRzIHVuZGVybGluZWQsIGJ1dCB0aGF0IHJlc3VsdHMgaW4gZHJhd2lu
ZyBvdXQgb2YKLSAgICAvLyBib3VuZHMgKGUuZy4gd2hlbiBhdCB0aGUgZWRnZSBvZiBhIHZpZXcp
IGFuZCBjb3VsZCBtYWtlIGl0IGFwcGVhciB0aGF0IHRoZQotICAgIC8vIHNwYWNlIGJldHdlZW4g
YWRqYWNlbnQgbWlzc3BlbGxlZCB3b3JkcyB3YXMgdW5kZXJsaW5lZC4KLSAgICAvLyBhbGxvdyBz
bGlnaHRseSBtb3JlIGNvbnNpZGVyaW5nIHRoYXQgdGhlIHBhdHRlcm4gZW5kcyB3aXRoIGEgdHJh
bnNwYXJlbnQgcGl4ZWwKLSAgICBpbnQgd2lkdGhNb2QgPSB3aWR0aCAlIHBhdHRlcm5XaWR0aDsK
LSAgICBpZiAocGF0dGVybldpZHRoIC0gd2lkdGhNb2QgPiBjTWlzc3BlbGxpbmdMaW5lUGF0dGVy
bkdhcFdpZHRoKQotICAgICAgICB3aWR0aCAtPSB3aWR0aE1vZDsKLSAgICAgIAotICAgIC8vIERy
YXcgdGhlIHVuZGVybGluZQotICAgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gcGxhdGZvcm1Db250
ZXh0KCk7Ci0gICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShjb250ZXh0KTsKLQotICAgIGNvbnN0IENv
bG9yJiBwYXR0ZXJuQ29sb3IgPSBncmFtbWFyID8gZ3JhbW1hclBhdHRlcm5Db2xvcigpIDogc3Bl
bGxpbmdQYXR0ZXJuQ29sb3IoKTsKLSAgICBzZXRDR1N0cm9rZUNvbG9yKGNvbnRleHQsIHBhdHRl
cm5Db2xvcik7Ci0KLSAgICB3a1NldFBhdHRlcm5QaGFzZUluVXNlclNwYWNlKGNvbnRleHQsIHBv
aW50KTsKLSAgICBDR0NvbnRleHRTZXRCbGVuZE1vZGUoY29udGV4dCwga0NHQmxlbmRNb2RlTm9y
bWFsKTsKLSAgICAKLSAgICAvLyAzIHJvd3MsIGVhY2ggb2Zmc2V0IGJ5IGhhbGYgYSBwaXhlbCBm
b3IgYmxlbmRpbmcgcHVycG9zZXMKLSAgICBjb25zdCBDR1BvaW50IHVwcGVyUG9pbnRzIFtdID0g
e3twb2ludC54KCksIHBvaW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAyLjUgfSwge3BvaW50Lngo
KSArIHdpZHRoLCBwb2ludC55KCkgKyBwYXR0ZXJuSGVpZ2h0IC0gMi41fX07Ci0gICAgY29uc3Qg
Q0dQb2ludCBtaWRkbGVQb2ludHMgW10gPSB7e3BvaW50LngoKSwgcG9pbnQueSgpICsgcGF0dGVy
bkhlaWdodCAtIDEuNSB9LCB7cG9pbnQueCgpICsgd2lkdGgsIHBvaW50LnkoKSArIHBhdHRlcm5I
ZWlnaHQgLSAxLjV9fTsKLSAgICBjb25zdCBDR1BvaW50IGxvd2VyUG9pbnRzIFtdID0ge3twb2lu
dC54KCksIHBvaW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAwLjUgfSwge3BvaW50LngoKSArIHdp
ZHRoLCBwb2ludC55KCkgKyBwYXR0ZXJuSGVpZ2h0IC0gMC41IH19OwotICAgIAotICAgIC8vIERh
c2ggbGVuZ3RocyBmb3IgdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBlcnJvciB1bmRlcmxpbmUg
YXJlIHRoZSBzYW1lLgotICAgIC8vIFRoZXNlIGFyZSBtYWdpYy4KLSAgICBzdGF0aWMgY29uc3Qg
ZmxvYXQgZWRnZV9kYXNoX2xlbmd0aHNbXSA9IHsyLCAyfTsKLSAgICBzdGF0aWMgY29uc3QgZmxv
YXQgbWlkZGxlX2Rhc2hfbGVuZ3Roc1tdID0gezIuNzZmLCAxLjI0Zn07Ci0gICAgc3RhdGljIGNv
bnN0IGZsb2F0IGVkZ2Vfb2Zmc2V0ID0gLShlZGdlX2Rhc2hfbGVuZ3Roc1sxXSAtIDEuMGYpIC8g
Mi4wZjsKLSAgICBzdGF0aWMgY29uc3QgZmxvYXQgbWlkZGxlX29mZnNldCA9IC0obWlkZGxlX2Rh
c2hfbGVuZ3Roc1sxXSAtIDEuMGYpIC8gMi4wZjsKLQotICAgIC8vIExpbmUgb3BhY2l0aWVzLiAg
T25jZSBhZ2FpbiwgdGhlc2UgYXJlIG1hZ2ljLgotICAgIGNvbnN0IGZsb2F0IHVwcGVyT3BhY2l0
eSA9IDAuMzNmOwotICAgIGNvbnN0IGZsb2F0IG1pZGRsZU9wYWNpdHkgPSAwLjc1ZjsKLSAgICBj
b25zdCBmbG9hdCBsb3dlck9wYWNpdHkgPSAwLjg4ZjsKLQotICAgIC8vVG9wIGxpbmUKLSAgICBD
R0NvbnRleHRTZXRMaW5lRGFzaChjb250ZXh0LCBlZGdlX29mZnNldCwgZWRnZV9kYXNoX2xlbmd0
aHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlZGdlX2Rhc2hfbGVuZ3Rocykg
LyBzaXplb2YoZWRnZV9kYXNoX2xlbmd0aHNbMF0pKTsKLSAgICBDR0NvbnRleHRTZXRBbHBoYShj
b250ZXh0LCB1cHBlck9wYWNpdHkpOwotICAgIENHQ29udGV4dFN0cm9rZUxpbmVTZWdtZW50cyhj
b250ZXh0LCB1cHBlclBvaW50cywgMik7Ci0gCi0gICAgLy8gTWlkZGxlIGxpbmUKLSAgICBDR0Nv
bnRleHRTZXRMaW5lRGFzaChjb250ZXh0LCBtaWRkbGVfb2Zmc2V0LCBtaWRkbGVfZGFzaF9sZW5n
dGhzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobWlkZGxlX2Rhc2hfbGVuZ3Ro
cykgLyBzaXplb2YobWlkZGxlX2Rhc2hfbGVuZ3Roc1swXSkpOwotICAgIENHQ29udGV4dFNldEFs
cGhhKGNvbnRleHQsIG1pZGRsZU9wYWNpdHkpOwotICAgIENHQ29udGV4dFN0cm9rZUxpbmVTZWdt
ZW50cyhjb250ZXh0LCBtaWRkbGVQb2ludHMsIDIpOwotICAgIAotICAgIC8vIEJvdHRvbSBsaW5l
Ci0gICAgQ0dDb250ZXh0U2V0TGluZURhc2goY29udGV4dCwgZWRnZV9vZmZzZXQsIGVkZ2VfZGFz
aF9sZW5ndGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlZGdlX2Rhc2hfbGVu
Z3RocykgLyBzaXplb2YoZWRnZV9kYXNoX2xlbmd0aHNbMF0pKTsKLSAgICBDR0NvbnRleHRTZXRB
bHBoYShjb250ZXh0LCBsb3dlck9wYWNpdHkpOwotICAgIENHQ29udGV4dFN0cm9rZUxpbmVTZWdt
ZW50cyhjb250ZXh0LCBsb3dlclBvaW50cywgMik7Ci0KLSAgICBDR0NvbnRleHRSZXN0b3JlR1N0
YXRlKGNvbnRleHQpOwotfQotCiAjaWYgRU5BQkxFKFNWRykKIEdyYXBoaWNzQ29udGV4dCogY29u
dGV4dEZvckltYWdlKFNWR1Jlc291cmNlSW1hZ2UqKQogewpJbmRleDogV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vSW1hZ2VDR1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VDR1dpbi5jcHAJKHJldmlzaW9uIDI5ODM0KQkoZnJvbSBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZVdpbi5jcHA6Mjk4MzQpCisrKyBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZUNHV2luLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJ
bmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJJbWFnZS5oIgorI2luY2x1ZGUgIkJpdG1hcEltYWdlLmgiCisjaW5jbHVkZSAiR3Jh
cGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlv
blNlcnZpY2VzLmg+CisKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI2luY2x1ZGUgPHdpbmRvd3Mu
aD4KKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIk1JTUVUeXBlUmVnaXN0
cnkuaCIKKyNpbmNsdWRlICJTaGFyZWRCdWZmZXIuaCIKKworLy8gVGhpcyBmdW5jdGlvbiBsb2Fk
cyByZXNvdXJjZXMgZnJvbSBXZWJLaXQKK1Bhc3NSZWZQdHI8V2ViQ29yZTo6U2hhcmVkQnVmZmVy
PiBsb2FkUmVzb3VyY2VJbnRvQnVmZmVyKGNvbnN0IGNoYXIqKTsKKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCit2b2lkIEJpdG1hcEltYWdlOjppbml0UGxhdGZvcm1EYXRhKCkKK3sKK30KKwordm9p
ZCBCaXRtYXBJbWFnZTo6aW52YWxpZGF0ZVBsYXRmb3JtRGF0YSgpCit7Cit9CisKK0ltYWdlKiBJ
bWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBSZWZQ
dHI8U2hhcmVkQnVmZmVyPiBidWZmZXIgPSBsb2FkUmVzb3VyY2VJbnRvQnVmZmVyKG5hbWUpOwor
ICAgIEJpdG1hcEltYWdlKiBpbWcgPSBuZXcgQml0bWFwSW1hZ2U7CisgICAgaW1nLT5zZXREYXRh
KGJ1ZmZlci5yZWxlYXNlKCksIHRydWUpOworICAgIHJldHVybiBpbWc7Cit9CisKK2Jvb2wgQml0
bWFwSW1hZ2U6OmdldEhCSVRNQVAoSEJJVE1BUCBibXApCit7CisgICAgcmV0dXJuIGdldEhCSVRN
QVBPZlNpemUoYm1wLCAwKTsKK30KKworYm9vbCBCaXRtYXBJbWFnZTo6Z2V0SEJJVE1BUE9mU2l6
ZShIQklUTUFQIGJtcCwgTFBTSVpFIHNpemUpCit7CisgICAgQVNTRVJUKGJtcCk7CisKKyAgICBC
SVRNQVAgYm1wSW5mbzsKKyAgICBHZXRPYmplY3QoYm1wLCBzaXplb2YoQklUTUFQKSwgJmJtcElu
Zm8pOworCisgICAgQVNTRVJUKGJtcEluZm8uYm1CaXRzUGl4ZWwgPT0gMzIpOworICAgIGludCBi
dWZmZXJTaXplID0gYm1wSW5mby5ibVdpZHRoQnl0ZXMgKiBibXBJbmZvLmJtSGVpZ2h0OworICAg
IAorICAgIENHQ29sb3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZp
Y2VSR0IoKTsKKyAgICBDR0NvbnRleHRSZWYgY2dDb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3Jl
YXRlKGJtcEluZm8uYm1CaXRzLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQsCisg
ICAgICAgIDgsIGJtcEluZm8uYm1XaWR0aEJ5dGVzLCBkZXZpY2VSR0IsIGtDR0JpdG1hcEJ5dGVP
cmRlcjMyTGl0dGxlIHwga0NHSW1hZ2VBbHBoYVByZW11bHRpcGxpZWRGaXJzdCk7CisgIAorICAg
IEdyYXBoaWNzQ29udGV4dCBnYyhjZ0NvbnRleHQpOworICAgIEludFNpemUgaW1hZ2VTaXplID0g
Qml0bWFwSW1hZ2U6OnNpemUoKTsKKyAgICBpZiAoc2l6ZSkKKyAgICAgICAgZHJhd0ZyYW1lTWF0
Y2hpbmdTb3VyY2VTaXplKCZnYywgRmxvYXRSZWN0KDAsIDAsIGJtcEluZm8uYm1XaWR0aCwgYm1w
SW5mby5ibUhlaWdodCksIEludFNpemUoKnNpemUpLCBDb21wb3NpdGVDb3B5KTsKKyAgICBlbHNl
CisgICAgICAgIGRyYXcoJmdjLCBGbG9hdFJlY3QoMCwgMCwgYm1wSW5mby5ibVdpZHRoLCBibXBJ
bmZvLmJtSGVpZ2h0KSwgRmxvYXRSZWN0KDAsIDAsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNp
emUuaGVpZ2h0KCkpLCBDb21wb3NpdGVDb3B5KTsKKworICAgIC8vIERvIGNsZWFudXAKKyAgICBD
R0NvbnRleHRSZWxlYXNlKGNnQ29udGV4dCk7CisgICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZp
Y2VSR0IpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEJpdG1hcEltYWdlOjpkcmF3RnJh
bWVNYXRjaGluZ1NvdXJjZVNpemUoR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBGbG9hdFJl
Y3QmIGRzdFJlY3QsIGNvbnN0IEludFNpemUmIHNyY1NpemUsIENvbXBvc2l0ZU9wZXJhdG9yIGNv
bXBvc2l0ZU9wKQoreworICAgIGludCBmcmFtZXMgPSBmcmFtZUNvdW50KCk7CisgICAgZm9yIChp
bnQgaSA9IDA7IGkgPCBmcmFtZXM7ICsraSkgeworICAgICAgICBDR0ltYWdlUmVmIGltYWdlID0g
ZnJhbWVBdEluZGV4KGkpOworICAgICAgICBpZiAoQ0dJbWFnZUdldEhlaWdodChpbWFnZSkgPT0g
KHNpemVfdClzcmNTaXplLmhlaWdodCgpICYmIENHSW1hZ2VHZXRXaWR0aChpbWFnZSkgPT0gKHNp
emVfdClzcmNTaXplLndpZHRoKCkpIHsKKyAgICAgICAgICAgIHNpemVfdCBjdXJyZW50RnJhbWUg
PSBtX2N1cnJlbnRGcmFtZTsKKyAgICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gaTsKKyAgICAg
ICAgICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRSZWN0KDAsIDAsIHNyY1NpemUud2lkdGgo
KSwgc3JjU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsKKyAgICAgICAgICAgIG1fY3VycmVu
dEZyYW1lID0gY3VycmVudEZyYW1lOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9Cisg
ICAgfQorCisgICAgLy8gTm8gaW1hZ2Ugb2YgdGhlIGNvcnJlY3Qgc2l6ZSB3YXMgZm91bmQsIGZh
bGxiYWNrIHRvIGRyYXdpbmcgdGhlIGN1cnJlbnQgZnJhbWUKKyAgICBJbnRTaXplIGltYWdlU2l6
ZSA9IEJpdG1hcEltYWdlOjpzaXplKCk7CisgICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJl
Y3QoMCwgMCwgaW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0
ZU9wKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vSW1hZ2VDR1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VDR1dpbi5jcHAJKHJldmlzaW9uIDI5NzI2KQorKysgV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VDR1dpbi5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIElu
Yy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIw
MDggQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucwpAQCAtMjksMzggKzI5LDExIEBACiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0
LmgiCiAjaW5jbHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+
CiAKLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgogI2luY2x1ZGUgPHdpbmRvd3MuaD4KICNpbmNsdWRl
ICJQbGF0Zm9ybVN0cmluZy5oIgotI2luY2x1ZGUgIk1JTUVUeXBlUmVnaXN0cnkuaCIKLSNpbmNs
dWRlICJTaGFyZWRCdWZmZXIuaCIKLQotLy8gVGhpcyBmdW5jdGlvbiBsb2FkcyByZXNvdXJjZXMg
ZnJvbSBXZWJLaXQKLVBhc3NSZWZQdHI8V2ViQ29yZTo6U2hhcmVkQnVmZmVyPiBsb2FkUmVzb3Vy
Y2VJbnRvQnVmZmVyKGNvbnN0IGNoYXIqKTsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi12b2lk
IEJpdG1hcEltYWdlOjppbml0UGxhdGZvcm1EYXRhKCkKLXsKLX0KLQotdm9pZCBCaXRtYXBJbWFn
ZTo6aW52YWxpZGF0ZVBsYXRmb3JtRGF0YSgpCi17Ci19Ci0KLUltYWdlKiBJbWFnZTo6bG9hZFBs
YXRmb3JtUmVzb3VyY2UoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBSZWZQdHI8U2hhcmVkQnVm
ZmVyPiBidWZmZXIgPSBsb2FkUmVzb3VyY2VJbnRvQnVmZmVyKG5hbWUpOwotICAgIEJpdG1hcElt
YWdlKiBpbWcgPSBuZXcgQml0bWFwSW1hZ2U7Ci0gICAgaW1nLT5zZXREYXRhKGJ1ZmZlci5yZWxl
YXNlKCksIHRydWUpOwotICAgIHJldHVybiBpbWc7Ci19Ci0KLWJvb2wgQml0bWFwSW1hZ2U6Omdl
dEhCSVRNQVAoSEJJVE1BUCBibXApCi17Ci0gICAgcmV0dXJuIGdldEhCSVRNQVBPZlNpemUoYm1w
LCAwKTsKLX0KLQogYm9vbCBCaXRtYXBJbWFnZTo6Z2V0SEJJVE1BUE9mU2l6ZShIQklUTUFQIGJt
cCwgTFBTSVpFIHNpemUpCiB7CiAgICAgQVNTRVJUKGJtcCk7CkBAIC03NiwxNSArNDksMTcgQEAg
Ym9vbCBCaXRtYXBJbWFnZTo6Z2V0SEJJVE1BUE9mU2l6ZShIQklUTQogICAgICAgICA4LCBibXBJ
bmZvLmJtV2lkdGhCeXRlcywgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8
IGtDR0ltYWdlQWxwaGFQcmVtdWx0aXBsaWVkRmlyc3QpOwogICAKICAgICBHcmFwaGljc0NvbnRl
eHQgZ2MoY2dDb250ZXh0KTsKKwogICAgIEludFNpemUgaW1hZ2VTaXplID0gQml0bWFwSW1hZ2U6
OnNpemUoKTsKICAgICBpZiAoc2l6ZSkKLSAgICAgICAgZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VT
aXplKCZnYywgRmxvYXRSZWN0KDAsIDAsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdo
dCksIEludFNpemUoKnNpemUpLCBDb21wb3NpdGVDb3B5KTsKKyAgICAgICAgZHJhd0ZyYW1lTWF0
Y2hpbmdTb3VyY2VTaXplKCZnYywgRmxvYXRSZWN0KDAuMGYsIDAuMGYsIGJtcEluZm8uYm1XaWR0
aCwgYm1wSW5mby5ibUhlaWdodCksIEludFNpemUoKnNpemUpLCBDb21wb3NpdGVDb3B5KTsKICAg
ICBlbHNlCi0gICAgICAgIGRyYXcoJmdjLCBGbG9hdFJlY3QoMCwgMCwgYm1wSW5mby5ibVdpZHRo
LCBibXBJbmZvLmJtSGVpZ2h0KSwgRmxvYXRSZWN0KDAsIDAsIGltYWdlU2l6ZS53aWR0aCgpLCBp
bWFnZVNpemUuaGVpZ2h0KCkpLCBDb21wb3NpdGVDb3B5KTsKKyAgICAgICAgZHJhdygmZ2MsIEZs
b2F0UmVjdCgwLjBmLCAwLjBmLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQpLCBG
bG9hdFJlY3QoMC4wZiwgMC4wZiwgaW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQo
KSksIENvbXBvc2l0ZUNvcHkpOwogCiAgICAgLy8gRG8gY2xlYW51cAogICAgIENHQ29udGV4dFJl
bGVhc2UoY2dDb250ZXh0KTsKICAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKGRldmljZVJHQik7CisK
ICAgICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtOTMsMTAgKzY4LDEwIEBAIHZvaWQgQml0bWFwSW1h
Z2U6OmRyYXdGcmFtZU1hdGNoaW5nU291cmMKICAgICBpbnQgZnJhbWVzID0gZnJhbWVDb3VudCgp
OwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVzOyArK2kpIHsKICAgICAgICAgQ0dJbWFn
ZVJlZiBpbWFnZSA9IGZyYW1lQXRJbmRleChpKTsKLSAgICAgICAgaWYgKENHSW1hZ2VHZXRIZWln
aHQoaW1hZ2UpID09IChzaXplX3Qpc3JjU2l6ZS5oZWlnaHQoKSAmJiBDR0ltYWdlR2V0V2lkdGgo
aW1hZ2UpID09IChzaXplX3Qpc3JjU2l6ZS53aWR0aCgpKSB7CisgICAgICAgIGlmIChDR0ltYWdl
R2V0SGVpZ2h0KGltYWdlKSA9PSBzdGF0aWNfY2FzdDxzaXplX3Q+KHNyY1NpemUuaGVpZ2h0KCkp
ICYmIENHSW1hZ2VHZXRXaWR0aChpbWFnZSkgPT0gc3RhdGljX2Nhc3Q8c2l6ZV90PihzcmNTaXpl
LndpZHRoKCkpKSB7CiAgICAgICAgICAgICBzaXplX3QgY3VycmVudEZyYW1lID0gbV9jdXJyZW50
RnJhbWU7CiAgICAgICAgICAgICBtX2N1cnJlbnRGcmFtZSA9IGk7Ci0gICAgICAgICAgICBkcmF3
KGN0eHQsIGRzdFJlY3QsIEZsb2F0UmVjdCgwLCAwLCBzcmNTaXplLndpZHRoKCksIHNyY1NpemUu
aGVpZ2h0KCkpLCBjb21wb3NpdGVPcCk7CisgICAgICAgICAgICBkcmF3KGN0eHQsIGRzdFJlY3Qs
IEZsb2F0UmVjdCgwLjBmLCAwLjBmLCBzcmNTaXplLndpZHRoKCksIHNyY1NpemUuaGVpZ2h0KCkp
LCBjb21wb3NpdGVPcCk7CiAgICAgICAgICAgICBtX2N1cnJlbnRGcmFtZSA9IGN1cnJlbnRGcmFt
ZTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtMTA0LDcgKzc5LDcgQEAgdm9p
ZCBCaXRtYXBJbWFnZTo6ZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyYwogCiAgICAgLy8gTm8gaW1hZ2Ug
b2YgdGhlIGNvcnJlY3Qgc2l6ZSB3YXMgZm91bmQsIGZhbGxiYWNrIHRvIGRyYXdpbmcgdGhlIGN1
cnJlbnQgZnJhbWUKICAgICBJbnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcEltYWdlOjpzaXplKCk7
Ci0gICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJlY3QoMCwgMCwgaW1hZ2VTaXplLndpZHRo
KCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsKKyAgICBkcmF3KGN0eHQsIGRz
dFJlY3QsIEZsb2F0UmVjdCgwLjBmLCAwLjBmLCBpbWFnZVNpemUud2lkdGgoKSwgaW1hZ2VTaXpl
LmhlaWdodCgpKSwgY29tcG9zaXRlT3ApOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCklu
ZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZUNhaXJvV2luLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZUNhaXJvV2luLmNw
cAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ2Fp
cm9XaW4uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkltYWdlLmgiCisjaW5jbHVkZSAiQml0bWFwSW1hZ2Uu
aCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlIDxjYWlyby5oPgorCisj
aW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworYm9vbCBCaXRtYXBJbWFnZTo6Z2V0SEJJVE1BUE9mU2l6ZShIQklU
TUFQIGJtcCwgTFBTSVpFIHNpemUpCit7CisgICAgQVNTRVJUKGJtcCk7CisKKyAgICBCSVRNQVAg
Ym1wSW5mbzsKKyAgICBHZXRPYmplY3QoYm1wLCBzaXplb2YoQklUTUFQKSwgJmJtcEluZm8pOwor
CisgICAgLy8gSWYgdGhpcyBpcyBhIDMyYnBwIGJpdG1hcCwgd2hpY2ggaXQgYWx3YXlzIHNob3Vs
ZCBiZSwgd2UnbGwgY2xlYXIgaXQgc28gYWxwaGEtd2lzZSBpdCB3aWxsIGJlIHZpc2libGUKKyAg
ICBpZiAoYm1wSW5mby5ibUJpdHNQaXhlbCA9PSAzMikgeworICAgICAgICBpbnQgYnVmZmVyU2l6
ZSA9IGJtcEluZm8uYm1XaWR0aEJ5dGVzICogYm1wSW5mby5ibUhlaWdodDsKKyAgICAgICAgbWVt
c2V0KGJtcEluZm8uYm1CaXRzLCAyNTUsIGJ1ZmZlclNpemUpOworICAgIH0KKyAJCisgICAgSERD
IHRlbXBEQyA9IENyZWF0ZUNvbXBhdGlibGVEQygwKTsKKyAgICBpZiAoIXRlbXBEQykgeworICAg
ICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBjcmVhdGUgaW4tbWVtb3J5IERDIGZvciBJbWFnZTo6
YmxpdCgpIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgU2VsZWN0T2JqZWN0
KHRlbXBEQywgYm1wKTsKKyAgICBHcmFwaGljc0NvbnRleHQgZ2ModGVtcERDKTsKKworICAgIElu
dFNpemUgaW1hZ2VTaXplID0gQml0bWFwSW1hZ2U6OnNpemUoKTsKKyAgICBpZiAoc2l6ZSkKKyAg
ICAgICAgZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXplKCZnYywgRmxvYXRSZWN0KDAuMGYsIDAu
MGYsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCksIEludFNpemUoKnNpemUpLCBD
b21wb3NpdGVDb3B5KTsKKyAgICBlbHNlCisgICAgICAgIGRyYXcoJmdjLCBGbG9hdFJlY3QoMC4w
ZiwgMC4wZiwgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwgRmxvYXRSZWN0KDAu
MGYsIDAuMGYsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBDb21wb3Np
dGVDb3B5KTsKKworICAgIC8vIERvIGNsZWFudXAKKyAgICBEZWxldGVEQyh0ZW1wREMpOworCisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQml0bWFwSW1hZ2U6OmRyYXdGcmFtZU1hdGNoaW5n
U291cmNlU2l6ZShHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVj
dCwgY29uc3QgSW50U2l6ZSYgc3JjU2l6ZSwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3Ap
Cit7CisgICAgaW50IGZyYW1lcyA9IGZyYW1lQ291bnQoKTsKKyAgICBmb3IgKGludCBpID0gMDsg
aSA8IGZyYW1lczsgKytpKSB7CisgICAgICAgIGNhaXJvX3N1cmZhY2VfdCogaW1hZ2UgPSBmcmFt
ZUF0SW5kZXgoaSk7CisgICAgICAgIGlmIChjYWlyb19pbWFnZV9zdXJmYWNlX2dldF9oZWlnaHQo
aW1hZ2UpID09IHN0YXRpY19jYXN0PHNpemVfdD4oc3JjU2l6ZS5oZWlnaHQoKSkgJiYgY2Fpcm9f
aW1hZ2Vfc3VyZmFjZV9nZXRfd2lkdGgoaW1hZ2UpID09IHN0YXRpY19jYXN0PHNpemVfdD4oc3Jj
U2l6ZS53aWR0aCgpKSkgeworICAgICAgICAgICAgc2l6ZV90IGN1cnJlbnRGcmFtZSA9IG1fY3Vy
cmVudEZyYW1lOworICAgICAgICAgICAgbV9jdXJyZW50RnJhbWUgPSBpOworICAgICAgICAgICAg
ZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJlY3QoMC4wZiwgMC4wZiwgc3JjU2l6ZS53aWR0aCgp
LCBzcmNTaXplLmhlaWdodCgpKSwgY29tcG9zaXRlT3ApOworICAgICAgICAgICAgbV9jdXJyZW50
RnJhbWUgPSBjdXJyZW50RnJhbWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICAvLyBObyBpbWFnZSBvZiB0aGUgY29ycmVjdCBzaXplIHdhcyBmb3VuZCwgZmFs
bGJhY2sgdG8gZHJhd2luZyB0aGUgY3VycmVudCBmcmFtZQorICAgIEludFNpemUgaW1hZ2VTaXpl
ID0gQml0bWFwSW1hZ2U6OnNpemUoKTsKKyAgICBkcmF3KGN0eHQsIGRzdFJlY3QsIEZsb2F0UmVj
dCgwLjBmLCAwLjBmLCBpbWFnZVNpemUud2lkdGgoKSwgaW1hZ2VTaXplLmhlaWdodCgpKSwgY29t
cG9zaXRlT3ApOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VXaW4uY3BwCShyZXZpc2lvbiAyOTgzNCkKKysrIFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlV2luLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5j
LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAw
OCBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCkBAIC0yNiwxMyArMjYsNyBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1
ZGUgIkltYWdlLmgiCiAjaW5jbHVkZSAiQml0bWFwSW1hZ2UuaCIKLSNpbmNsdWRlICJHcmFwaGlj
c0NvbnRleHQuaCIKLSNpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2Vy
dmljZXMuaD4KIAotI2luY2x1ZGUgPHdpbnNvY2syLmg+Ci0jaW5jbHVkZSA8d2luZG93cy5oPgot
I2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCi0jaW5jbHVkZSAiTUlNRVR5cGVSZWdpc3RyeS5o
IgogI2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgogCiAvLyBUaGlzIGZ1bmN0aW9uIGxvYWRzIHJl
c291cmNlcyBmcm9tIFdlYktpdApAQCAtNjEsNTAgKzU1LDQgQEAgYm9vbCBCaXRtYXBJbWFnZTo6
Z2V0SEJJVE1BUChIQklUTUFQIGJtcAogICAgIHJldHVybiBnZXRIQklUTUFQT2ZTaXplKGJtcCwg
MCk7CiB9CiAKLWJvb2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVBPZlNpemUoSEJJVE1BUCBibXAs
IExQU0laRSBzaXplKQotewotICAgIEFTU0VSVChibXApOwotCi0gICAgQklUTUFQIGJtcEluZm87
Ci0gICAgR2V0T2JqZWN0KGJtcCwgc2l6ZW9mKEJJVE1BUCksICZibXBJbmZvKTsKLQotICAgIEFT
U0VSVChibXBJbmZvLmJtQml0c1BpeGVsID09IDMyKTsKLSAgICBpbnQgYnVmZmVyU2l6ZSA9IGJt
cEluZm8uYm1XaWR0aEJ5dGVzICogYm1wSW5mby5ibUhlaWdodDsKLSAgICAKLSAgICBDR0NvbG9y
U3BhY2VSZWYgZGV2aWNlUkdCID0gQ0dDb2xvclNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7Ci0gICAg
Q0dDb250ZXh0UmVmIGNnQ29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZShibXBJbmZvLmJt
Qml0cywgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0LAotICAgICAgICA4LCBibXBJ
bmZvLmJtV2lkdGhCeXRlcywgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8
IGtDR0ltYWdlQWxwaGFQcmVtdWx0aXBsaWVkRmlyc3QpOwotICAKLSAgICBHcmFwaGljc0NvbnRl
eHQgZ2MoY2dDb250ZXh0KTsKLSAgICBJbnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcEltYWdlOjpz
aXplKCk7Ci0gICAgaWYgKHNpemUpCi0gICAgICAgIGRyYXdGcmFtZU1hdGNoaW5nU291cmNlU2l6
ZSgmZ2MsIEZsb2F0UmVjdCgwLCAwLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQp
LCBJbnRTaXplKCpzaXplKSwgQ29tcG9zaXRlQ29weSk7Ci0gICAgZWxzZQotICAgICAgICBkcmF3
KCZnYywgRmxvYXRSZWN0KDAsIDAsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCks
IEZsb2F0UmVjdCgwLCAwLCBpbWFnZVNpemUud2lkdGgoKSwgaW1hZ2VTaXplLmhlaWdodCgpKSwg
Q29tcG9zaXRlQ29weSk7Ci0KLSAgICAvLyBEbyBjbGVhbnVwCi0gICAgQ0dDb250ZXh0UmVsZWFz
ZShjZ0NvbnRleHQpOwotICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKLSAgICBy
ZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBCaXRtYXBJbWFnZTo6ZHJhd0ZyYW1lTWF0Y2hpbmdTb3Vy
Y2VTaXplKEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBj
b25zdCBJbnRTaXplJiBzcmNTaXplLCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCkKLXsK
LSAgICBpbnQgZnJhbWVzID0gZnJhbWVDb3VudCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwg
ZnJhbWVzOyArK2kpIHsKLSAgICAgICAgQ0dJbWFnZVJlZiBpbWFnZSA9IGZyYW1lQXRJbmRleChp
KTsKLSAgICAgICAgaWYgKENHSW1hZ2VHZXRIZWlnaHQoaW1hZ2UpID09IChzaXplX3Qpc3JjU2l6
ZS5oZWlnaHQoKSAmJiBDR0ltYWdlR2V0V2lkdGgoaW1hZ2UpID09IChzaXplX3Qpc3JjU2l6ZS53
aWR0aCgpKSB7Ci0gICAgICAgICAgICBzaXplX3QgY3VycmVudEZyYW1lID0gbV9jdXJyZW50RnJh
bWU7Ci0gICAgICAgICAgICBtX2N1cnJlbnRGcmFtZSA9IGk7Ci0gICAgICAgICAgICBkcmF3KGN0
eHQsIGRzdFJlY3QsIEZsb2F0UmVjdCgwLCAwLCBzcmNTaXplLndpZHRoKCksIHNyY1NpemUuaGVp
Z2h0KCkpLCBjb21wb3NpdGVPcCk7Ci0gICAgICAgICAgICBtX2N1cnJlbnRGcmFtZSA9IGN1cnJl
bnRGcmFtZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8v
IE5vIGltYWdlIG9mIHRoZSBjb3JyZWN0IHNpemUgd2FzIGZvdW5kLCBmYWxsYmFjayB0byBkcmF3
aW5nIHRoZSBjdXJyZW50IGZyYW1lCi0gICAgSW50U2l6ZSBpbWFnZVNpemUgPSBCaXRtYXBJbWFn
ZTo6c2l6ZSgpOwotICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRSZWN0KDAsIDAsIGltYWdl
U2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBjb21wb3NpdGVPcCk7Ci19Ci0KIH0g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L1NpbXBsZUZvbnREYXRhQ0dXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ0dXaW4uY3BwCShyZXZpc2lvbiAyOTgzNCkJKGZy
b20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERhdGFXaW4uY3BwOjI5
ODM0KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERhdGFDR1dp
bi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyODEgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uIAorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIElu
Yy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1h
eSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAg
ZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMg
Q09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRT
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAq
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIKKworI2luY2x1ZGUgPHdp
bnNvY2syLmg+CisjaW5jbHVkZSAiRm9udC5oIgorI2luY2x1ZGUgIkZvbnRDYWNoZS5oIgorI2lu
Y2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUgIkZvbnREZXNjcmlwdGlvbi5oIgorI2luY2x1
ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CisjaW5jbHVkZSA8dW5pY29kZS91Y2hhci5oPgorI2luY2x1
ZGUgPHVuaWNvZGUvdW5vcm0uaD4KKyNpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxp
Y2F0aW9uU2VydmljZXMuaD4KKyNpbmNsdWRlIDxtbGFuZy5oPgorI2luY2x1ZGUgPHRjaGFyLmg+
CisjaW5jbHVkZSA8V2ViS2l0U3lzdGVtSW50ZXJmYWNlL1dlYktpdFN5c3RlbUludGVyZmFjZS5o
PgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3VzaW5nIHN0ZDo6bWF4OworCitjb25zdCBmbG9h
dCBjU21hbGxDYXBzRm9udFNpemVNdWx0aXBsaWVyID0gMC43ZjsKKworc3RhdGljIGJvb2wgc2hv
dWxkQXBwbHlNYWNBc2NlbnRIYWNrOworCitzdGF0aWMgaW5saW5lIGZsb2F0IHNjYWxlRW1Ub1Vu
aXRzKGZsb2F0IHgsIHVuc2lnbmVkIHVuaXRzUGVyRW0pIHsgcmV0dXJuIHVuaXRzUGVyRW0gPyB4
IC8gKGZsb2F0KXVuaXRzUGVyRW0gOiB4OyB9CisKK3ZvaWQgU2ltcGxlRm9udERhdGE6OnNldFNo
b3VsZEFwcGx5TWFjQXNjZW50SGFjayhib29sIGIpCit7CisgICAgc2hvdWxkQXBwbHlNYWNBc2Nl
bnRIYWNrID0gYjsKK30KKwordm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKK3sg
ICAgCisgICAgbV9zeW50aGV0aWNCb2xkT2Zmc2V0ID0gbV9mb250LnN5bnRoZXRpY0JvbGQoKSA/
IDEuMGYgOiAwLmY7CisgICAgbV9zY3JpcHRDYWNoZSA9IDA7CisgICAgbV9zY3JpcHRGb250UHJv
cGVydGllcyA9IDA7CisgICAgbV9pc1N5c3RlbUZvbnQgPSBmYWxzZTsKKyAgICAKKyAgICBpZiAo
bV9mb250LnVzZUdESSgpKSB7CisgICAgICAgIEhEQyBoZGMgPSBHZXREQygwKTsKKyAgICAgICAg
SEdESU9CSiBvbGRGb250ID0gU2VsZWN0T2JqZWN0KGhkYywgbV9mb250Lmhmb250KCkpOworICAg
ICAgICBPVVRMSU5FVEVYVE1FVFJJQyBtZXRyaWNzOworICAgICAgICBHZXRPdXRsaW5lVGV4dE1l
dHJpY3MoaGRjLCBzaXplb2YobWV0cmljcyksICZtZXRyaWNzKTsKKyAgICAgICAgVEVYVE1FVFJJ
QyYgdGV4dE1ldHJpY3MgPSBtZXRyaWNzLm90bVRleHRNZXRyaWNzOworICAgICAgICBtX2FzY2Vu
dCA9IHRleHRNZXRyaWNzLnRtQXNjZW50OworICAgICAgICBtX2Rlc2NlbnQgPSB0ZXh0TWV0cmlj
cy50bURlc2NlbnQ7CisgICAgICAgIG1fbGluZUdhcCA9IHRleHRNZXRyaWNzLnRtRXh0ZXJuYWxM
ZWFkaW5nOworICAgICAgICBtX2xpbmVTcGFjaW5nID0gbV9hc2NlbnQgKyBtX2Rlc2NlbnQgKyBt
X2xpbmVHYXA7CisgICAgICAgIG1feEhlaWdodCA9IG1fYXNjZW50ICogMC41NmY7IC8vIEJlc3Qg
Z3Vlc3MgZm9yIHhIZWlnaHQgaWYgbm8geCBnbHlwaCBpcyBwcmVzZW50LgorCisgICAgICAgIEdM
WVBITUVUUklDUyBnbTsKKyAgICAgICAgTUFUMiBtYXQgPSB7IDEsIDAsIDAsIDEgfTsKKyAgICAg
ICAgRFdPUkQgbGVuID0gR2V0R2x5cGhPdXRsaW5lKGhkYywgJ3gnLCBHR09fTUVUUklDUywgJmdt
LCAwLCAwLCAmbWF0KTsKKyAgICAgICAgaWYgKGxlbiAhPSBHRElfRVJST1IgJiYgZ20uZ21wdEds
eXBoT3JpZ2luLnkgPiAwKQorICAgICAgICAgICAgbV94SGVpZ2h0ID0gZ20uZ21wdEdseXBoT3Jp
Z2luLnk7CisKKyAgICAgICAgbV91bml0c1BlckVtID0gbWV0cmljcy5vdG1FTVNxdWFyZTsKKwor
ICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBvbGRGb250KTsKKyAgICAgICAgUmVsZWFzZURDKDAs
IGhkYyk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENHRm9udFJlZiBmb250ID0g
bV9mb250LmNnRm9udCgpOworICAgIGludCBpQXNjZW50ID0gQ0dGb250R2V0QXNjZW50KGZvbnQp
OworICAgIGludCBpRGVzY2VudCA9IENHRm9udEdldERlc2NlbnQoZm9udCk7CisgICAgaW50IGlM
aW5lR2FwID0gQ0dGb250R2V0TGVhZGluZyhmb250KTsKKyAgICBtX3VuaXRzUGVyRW0gPSBDR0Zv
bnRHZXRVbml0c1BlckVtKGZvbnQpOworICAgIGZsb2F0IHBvaW50U2l6ZSA9IG1fZm9udC5zaXpl
KCk7CisgICAgZmxvYXQgZkFzY2VudCA9IHNjYWxlRW1Ub1VuaXRzKGlBc2NlbnQsIG1fdW5pdHNQ
ZXJFbSkgKiBwb2ludFNpemU7CisgICAgZmxvYXQgZkRlc2NlbnQgPSAtc2NhbGVFbVRvVW5pdHMo
aURlc2NlbnQsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7CisgICAgZmxvYXQgZkxpbmVHYXAg
PSBzY2FsZUVtVG9Vbml0cyhpTGluZUdhcCwgbV91bml0c1BlckVtKSAqIHBvaW50U2l6ZTsKKwor
ICAgIGlmICghaXNDdXN0b21Gb250KCkpIHsKKyAgICAgICAgSERDIGRjID0gR2V0REMoMCk7Cisg
ICAgICAgIEhHRElPQkogb2xkRm9udCA9IFNlbGVjdE9iamVjdChkYywgbV9mb250Lmhmb250KCkp
OworICAgICAgICBpbnQgZmFjZUxlbmd0aCA9IEdldFRleHRGYWNlKGRjLCAwLCAwKTsKKyAgICAg
ICAgVmVjdG9yPFRDSEFSPiBmYWNlTmFtZShmYWNlTGVuZ3RoKTsKKyAgICAgICAgR2V0VGV4dEZh
Y2UoZGMsIGZhY2VMZW5ndGgsIGZhY2VOYW1lLmRhdGEoKSk7CisgICAgICAgIG1faXNTeXN0ZW1G
b250ID0gIV90Y3NjbXAoZmFjZU5hbWUuZGF0YSgpLCBfVCgiTHVjaWRhIEdyYW5kZSIpKTsKKyAg
ICAgICAgU2VsZWN0T2JqZWN0KGRjLCBvbGRGb250KTsKKyAgICAgICAgUmVsZWFzZURDKDAsIGRj
KTsKKworICAgICAgICBpZiAoc2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrKSB7CisgICAgICAgICAg
ICAvLyBUaGlzIGNvZGUgY29tZXMgZnJvbSBGb250RGF0YU1hYy5tbS4gV2Ugb25seSBldmVyIGRv
IHRoaXMgd2hlbiBydW5uaW5nIHJlZ3Jlc3Npb24gdGVzdHMgc28gdGhhdCBvdXIgbWV0cmljcyB3
aWxsIG1hdGNoIE1hYy4KKworICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBhZGp1c3QgVGltZXMs
IEhlbHZldGljYSwgYW5kIENvdXJpZXIgdG8gY2xvc2VseSBtYXRjaCB0aGUKKyAgICAgICAgICAg
IC8vIHZlcnRpY2FsIG1ldHJpY3Mgb2YgdGhlaXIgTWljcm9zb2Z0IGNvdW50ZXJwYXJ0cyB0aGF0
IGFyZSB0aGUgZGUgZmFjdG8KKyAgICAgICAgICAgIC8vIHdlYiBzdGFuZGFyZC4gVGhlIEFwcEtp
dCBhZGp1c3RtZW50IG9mIDIwJSBpcyB0b28gYmlnIGFuZCBpcworICAgICAgICAgICAgLy8gaW5j
b3JyZWN0bHkgYWRkZWQgdG8gbGluZSBzcGFjaW5nLCBzbyB3ZSB1c2UgYSAxNSUgYWRqdXN0bWVu
dCBpbnN0ZWFkCisgICAgICAgICAgICAvLyBhbmQgYWRkIGl0IHRvIHRoZSBhc2NlbnQuCisgICAg
ICAgICAgICBpZiAoIV90Y3NjbXAoZmFjZU5hbWUuZGF0YSgpLCBfVCgiVGltZXMiKSkgfHwgIV90
Y3NjbXAoZmFjZU5hbWUuZGF0YSgpLCBfVCgiSGVsdmV0aWNhIikpIHx8ICFfdGNzY21wKGZhY2VO
YW1lLmRhdGEoKSwgX1QoIkNvdXJpZXIiKSkpCisgICAgICAgICAgICAgICAgZkFzY2VudCArPSBm
bG9vcmYoKChmQXNjZW50ICsgZkRlc2NlbnQpICogMC4xNWYpICsgMC41Zik7CisgICAgICAgIH0K
KyAgICB9CisKKyAgICBtX2FzY2VudCA9IGxyb3VuZGYoZkFzY2VudCk7CisgICAgbV9kZXNjZW50
ID0gbHJvdW5kZihmRGVzY2VudCk7CisgICAgbV9saW5lR2FwID0gbHJvdW5kZihmTGluZUdhcCk7
CisgICAgbV9saW5lU3BhY2luZyA9IG1fYXNjZW50ICsgbV9kZXNjZW50ICsgbV9saW5lR2FwOwor
CisgICAgLy8gTWVhc3VyZSB0aGUgYWN0dWFsIGNoYXJhY3RlciAieCIsIGJlY2F1c2UgQXBwS2l0
IHN5bnRoZXNpemVzIFggaGVpZ2h0IHJhdGhlciB0aGFuIGdldHRpbmcgaXQgZnJvbSB0aGUgZm9u
dC4KKyAgICAvLyBVbmZvcnR1bmF0ZWx5LCBOU0ZvbnQgd2lsbCByb3VuZCB0aGlzIGZvciB1cyBz
byB3ZSBkb24ndCBxdWl0ZSBnZXQgdGhlIHJpZ2h0IHZhbHVlLgorICAgIEdseXBoUGFnZSogZ2x5
cGhQYWdlWmVybyA9IEdseXBoUGFnZVRyZWVOb2RlOjpnZXRSb290Q2hpbGQodGhpcywgMCktPnBh
Z2UoKTsKKyAgICBHbHlwaCB4R2x5cGggPSBnbHlwaFBhZ2VaZXJvID8gZ2x5cGhQYWdlWmVyby0+
Z2x5cGhEYXRhRm9yQ2hhcmFjdGVyKCd4JykuZ2x5cGggOiAwOworICAgIGlmICh4R2x5cGgpIHsK
KyAgICAgICAgQ0dSZWN0IHhCb3g7CisgICAgICAgIENHRm9udEdldEdseXBoQkJveGVzKGZvbnQs
ICZ4R2x5cGgsIDEsICZ4Qm94KTsKKyAgICAgICAgLy8gVXNlIHRoZSBtYXhpbXVtIG9mIGVpdGhl
ciB3aWR0aCBvciBoZWlnaHQgYmVjYXVzZSAieCIgaXMgbmVhcmx5IHNxdWFyZQorICAgICAgICAv
LyBhbmQgd2ViIHBhZ2VzIHRoYXQgZm9vbGlzaGx5IHVzZSB0aGlzIG1ldHJpYyBmb3Igd2lkdGgg
d2lsbCBiZSBsYWlkIG91dAorICAgICAgICAvLyBwb29ybHkgaWYgd2UgcmV0dXJuIGFuIGFjY3Vy
YXRlIGhlaWdodC4gQ2xhc3NpYyBjYXNlIGlzIFRpbWVzIDEzIHBvaW50LAorICAgICAgICAvLyB3
aGljaCBoYXMgYW4gIngiIHRoYXQgaXMgN3g2IHBpeGVscy4KKyAgICAgICAgbV94SGVpZ2h0ID0g
c2NhbGVFbVRvVW5pdHMobWF4KENHUmVjdEdldE1heFgoeEJveCksIENHUmVjdEdldE1heFkoeEJv
eCkpLCBtX3VuaXRzUGVyRW0pICogcG9pbnRTaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIGlu
dCBpWEhlaWdodCA9IENHRm9udEdldFhIZWlnaHQoZm9udCk7CisgICAgICAgIG1feEhlaWdodCA9
IHNjYWxlRW1Ub1VuaXRzKGlYSGVpZ2h0LCBtX3VuaXRzUGVyRW0pICogcG9pbnRTaXplOworICAg
IH0KK30KKwordm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1EZXN0cm95KCkKK3sKKyAgICBp
ZiAoIWlzQ3VzdG9tRm9udCgpKSB7CisgICAgICAgIERlbGV0ZU9iamVjdChtX2ZvbnQuaGZvbnQo
KSk7CisgICAgICAgIENHRm9udFJlbGVhc2UobV9mb250LmNnRm9udCgpKTsKKyAgICB9CisKKyAg
ICAvLyBXZSBkb24ndCBoYXNoIHRoaXMgb24gV2luMzIsIHNvIGl0J3MgZWZmZWN0aXZlbHkgb3du
ZWQgYnkgdXMuCisgICAgZGVsZXRlIG1fc21hbGxDYXBzRm9udERhdGE7CisKKyAgICBTY3JpcHRG
cmVlQ2FjaGUoJm1fc2NyaXB0Q2FjaGUpOworICAgIGRlbGV0ZSBtX3NjcmlwdEZvbnRQcm9wZXJ0
aWVzOworfQorCitTaW1wbGVGb250RGF0YSogU2ltcGxlRm9udERhdGE6OnNtYWxsQ2Fwc0ZvbnRE
YXRhKGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uKSBjb25zdAoreworICAg
IGlmICghbV9zbWFsbENhcHNGb250RGF0YSkgeworICAgICAgICBmbG9hdCBzbWFsbENhcHNIZWln
aHQgPSBjU21hbGxDYXBzRm9udFNpemVNdWx0aXBsaWVyICogbV9mb250LnNpemUoKTsKKyAgICAg
ICAgaWYgKGlzQ3VzdG9tRm9udCgpKSB7CisgICAgICAgICAgICBGb250UGxhdGZvcm1EYXRhIHNt
YWxsQ2Fwc0ZvbnREYXRhKG1fZm9udCk7CisgICAgICAgICAgICBzbWFsbENhcHNGb250RGF0YS5z
ZXRTaXplKHNtYWxsQ2Fwc0hlaWdodCk7CisgICAgICAgICAgICBtX3NtYWxsQ2Fwc0ZvbnREYXRh
ID0gbmV3IFNpbXBsZUZvbnREYXRhKHNtYWxsQ2Fwc0ZvbnREYXRhLCB0cnVlLCBmYWxzZSk7Cisg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dGT05UIHdpbmZvbnQ7CisgICAgICAgICAg
ICBHZXRPYmplY3QobV9mb250Lmhmb250KCksIHNpemVvZihMT0dGT05UKSwgJndpbmZvbnQpOwor
ICAgICAgICAgICAgd2luZm9udC5sZkhlaWdodCA9IC1scm91bmRmKHNtYWxsQ2Fwc0hlaWdodCAq
IChtX2ZvbnQudXNlR0RJKCkgPyAxIDogMzIpKTsKKyAgICAgICAgICAgIEhGT05UIGhmb250ID0g
Q3JlYXRlRm9udEluZGlyZWN0KCZ3aW5mb250KTsKKyAgICAgICAgICAgIG1fc21hbGxDYXBzRm9u
dERhdGEgPSBuZXcgU2ltcGxlRm9udERhdGEoRm9udFBsYXRmb3JtRGF0YShoZm9udCwgc21hbGxD
YXBzSGVpZ2h0LCBmb250RGVzY3JpcHRpb24uYm9sZCgpLCBmb250RGVzY3JpcHRpb24uaXRhbGlj
KCksIG1fZm9udC51c2VHREkoKSkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtX3Nt
YWxsQ2Fwc0ZvbnREYXRhOworfQorCitib29sIFNpbXBsZUZvbnREYXRhOjpjb250YWluc0NoYXJh
Y3RlcnMoY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIGludCBsZW5ndGgpIGNvbnN0Cit7CisgICAg
Ly8gRklYTUU6IFN1cHBvcnQgY3VzdG9tIGZvbnRzLgorICAgIGlmIChpc0N1c3RvbUZvbnQoKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gRklYTUU6IE1pY3Jvc29mdCBkb2N1bWVu
dGF0aW9uIHNlZW1zIHRvIGltcGx5IHRoYXQgY2hhcmFjdGVycyBjYW4gYmUgb3V0cHV0IHVzaW5n
IGEgZ2l2ZW4gZm9udCBhbmQgREMKKyAgICAvLyBtZXJlbHkgYnkgdGVzdGluZyBjb2RlIHBhZ2Ug
aW50ZXJzZWN0aW9uLiAgVGhpcyBzZWVtcyBzdXNwZWN0IHRob3VnaC4gIENhbid0IGEgZm9udCBv
bmx5IHBhcnRpYWxseQorICAgIC8vIGNvdmVyIGEgZ2l2ZW4gY29kZSBwYWdlPworICAgIElNTGFu
Z0ZvbnRMaW5rMiogbGFuZ0ZvbnRMaW5rID0gRm9udENhY2hlOjpnZXRGb250TGlua0ludGVyZmFj
ZSgpOworICAgIGlmICghbGFuZ0ZvbnRMaW5rKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBIREMgZGMgPSBHZXREQygwKTsKKyAgICAKKyAgICBEV09SRCBhY3BDb2RlUGFnZXM7CisgICAg
bGFuZ0ZvbnRMaW5rLT5Db2RlUGFnZVRvQ29kZVBhZ2VzKENQX0FDUCwgJmFjcENvZGVQYWdlcyk7
CisKKyAgICBEV09SRCBmb250Q29kZVBhZ2VzOworICAgIGxhbmdGb250TGluay0+R2V0Rm9udENv
ZGVQYWdlcyhkYywgbV9mb250Lmhmb250KCksICZmb250Q29kZVBhZ2VzKTsKKworICAgIERXT1JE
IGFjdHVhbENvZGVQYWdlczsKKyAgICBsb25nIG51bUNoYXJhY3RlcnNQcm9jZXNzZWQ7CisgICAg
bG9uZyBvZmZzZXQgPSAwOworICAgIHdoaWxlIChvZmZzZXQgPCBsZW5ndGgpIHsKKyAgICAgICAg
bGFuZ0ZvbnRMaW5rLT5HZXRTdHJDb2RlUGFnZXMoY2hhcmFjdGVycywgbGVuZ3RoLCBhY3BDb2Rl
UGFnZXMsICZhY3R1YWxDb2RlUGFnZXMsICZudW1DaGFyYWN0ZXJzUHJvY2Vzc2VkKTsKKyAgICAg
ICAgaWYgKChhY3R1YWxDb2RlUGFnZXMgJiBmb250Q29kZVBhZ2VzKSA9PSAwKQorICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICBvZmZzZXQgKz0gbnVtQ2hhcmFjdGVyc1Byb2Nlc3Nl
ZDsKKyAgICB9CisKKyAgICBSZWxlYXNlREMoMCwgZGMpOworCisgICAgcmV0dXJuIHRydWU7Cit9
CisKK3ZvaWQgU2ltcGxlRm9udERhdGE6OmRldGVybWluZVBpdGNoKCkKK3sKKyAgICBpZiAoaXND
dXN0b21Gb250KCkpIHsKKyAgICAgICAgbV90cmVhdEFzRml4ZWRQaXRjaCA9IGZhbHNlOworICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVEVYVE1FVFJJQ1MgaGF2ZSB0aGlzLiAgU2V0
IG1fdHJlYXRBc0ZpeGVkUGl0Y2ggYmFzZWQgb2ZmIHRoYXQuCisgICAgSERDIGRjID0gR2V0REMo
MCk7CisgICAgU2F2ZURDKGRjKTsKKyAgICBTZWxlY3RPYmplY3QoZGMsIG1fZm9udC5oZm9udCgp
KTsKKworICAgIC8vIFllcywgdGhpcyBsb29rcyBiYWNrd2FyZHMsIGJ1dCB0aGUgZml4ZWQgcGl0
Y2ggYml0IGlzIGFjdHVhbGx5IHNldCBpZiB0aGUgZm9udAorICAgIC8vIGlzICpub3QqIGZpeGVk
IHBpdGNoLiAgVW5iZWxpZXZhYmxlIGJ1dCB0cnVlLgorICAgIFRFWFRNRVRSSUMgdG07CisgICAg
R2V0VGV4dE1ldHJpY3MoZGMsICZ0bSk7CisgICAgbV90cmVhdEFzRml4ZWRQaXRjaCA9ICgodG0u
dG1QaXRjaEFuZEZhbWlseSAmIFRNUEZfRklYRURfUElUQ0gpID09IDApOworCisgICAgUmVzdG9y
ZURDKGRjLCAtMSk7CisgICAgUmVsZWFzZURDKDAsIGRjKTsKK30KKworZmxvYXQgU2ltcGxlRm9u
dERhdGE6OnBsYXRmb3JtV2lkdGhGb3JHbHlwaChHbHlwaCBnbHlwaCkgY29uc3QKK3sKKyAgICBp
ZiAobV9mb250LnVzZUdESSgpKSB7CisgICAgICAgIEhEQyBoZGMgPSBHZXREQygwKTsKKyAgICAg
ICAgSEdESU9CSiBvbGRGb250ID0gU2VsZWN0T2JqZWN0KGhkYywgbV9mb250Lmhmb250KCkpOwor
ICAgICAgICBpbnQgd2lkdGg7CisgICAgICAgIEdldENoYXJXaWR0aEkoaGRjLCBnbHlwaCwgMSwg
MCwgJndpZHRoKTsKKyAgICAgICAgU2VsZWN0T2JqZWN0KGhkYywgb2xkRm9udCk7CisgICAgICAg
IFJlbGVhc2VEQygwLCBoZGMpOworICAgICAgICByZXR1cm4gd2lkdGg7CisgICAgfQorCisgICAg
Q0dGb250UmVmIGZvbnQgPSBtX2ZvbnQuY2dGb250KCk7CisgICAgZmxvYXQgcG9pbnRTaXplID0g
bV9mb250LnNpemUoKTsKKyAgICBDR1NpemUgYWR2YW5jZTsKKyAgICBDR0FmZmluZVRyYW5zZm9y
bSBtID0gQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlU2NhbGUocG9pbnRTaXplLCBwb2ludFNpemUpOwor
ICAgIC8vIEZJWE1FOiBOZWVkIHRvIGFkZCByZWFsIHN1cHBvcnQgZm9yIHByaW50ZXIgZm9udHMu
CisgICAgYm9vbCBpc1ByaW50ZXJGb250ID0gZmFsc2U7CisgICAgd2tHZXRHbHlwaEFkdmFuY2Vz
KGZvbnQsIG0sIG1faXNTeXN0ZW1Gb250LCBpc1ByaW50ZXJGb250LCBnbHlwaCwgYWR2YW5jZSk7
CisgICAgcmV0dXJuIGFkdmFuY2Uud2lkdGggKyBtX3N5bnRoZXRpY0JvbGRPZmZzZXQ7Cit9CisK
K1NDUklQVF9GT05UUFJPUEVSVElFUyogU2ltcGxlRm9udERhdGE6OnNjcmlwdEZvbnRQcm9wZXJ0
aWVzKCkgY29uc3QKK3sKKyAgICBpZiAoIW1fc2NyaXB0Rm9udFByb3BlcnRpZXMpIHsKKyAgICAg
ICAgbV9zY3JpcHRGb250UHJvcGVydGllcyA9IG5ldyBTQ1JJUFRfRk9OVFBST1BFUlRJRVM7Cisg
ICAgICAgIG1lbXNldChtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzLCAwLCBzaXplb2YoU0NSSVBUX0ZP
TlRQUk9QRVJUSUVTKSk7CisgICAgICAgIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMtPmNCeXRlcyA9
IHNpemVvZihTQ1JJUFRfRk9OVFBST1BFUlRJRVMpOworICAgICAgICBIUkVTVUxUIHJlc3VsdCA9
IFNjcmlwdEdldEZvbnRQcm9wZXJ0aWVzKDAsIHNjcmlwdENhY2hlKCksIG1fc2NyaXB0Rm9udFBy
b3BlcnRpZXMpOworICAgICAgICBpZiAocmVzdWx0ID09IEVfUEVORElORykgeworICAgICAgICAg
ICAgSERDIGRjID0gR2V0REMoMCk7CisgICAgICAgICAgICBTYXZlREMoZGMpOworICAgICAgICAg
ICAgU2VsZWN0T2JqZWN0KGRjLCBtX2ZvbnQuaGZvbnQoKSk7CisgICAgICAgICAgICBTY3JpcHRH
ZXRGb250UHJvcGVydGllcyhkYywgc2NyaXB0Q2FjaGUoKSwgbV9zY3JpcHRGb250UHJvcGVydGll
cyk7CisgICAgICAgICAgICBSZXN0b3JlREMoZGMsIC0xKTsKKyAgICAgICAgICAgIFJlbGVhc2VE
QygwLCBkYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1fc2NyaXB0Rm9udFByb3Bl
cnRpZXM7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBs
ZUZvbnREYXRhQ0dXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL1NpbXBsZUZvbnREYXRhQ0dXaW4uY3BwCShyZXZpc2lvbiAyOTcyNikKKysrIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ0dXaW4uY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBB
cHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAy
MDA3LCAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKQEAgLTM4LDI3ICszOCwxOCBAQAogI2luY2x1ZGUgPHVuaWNvZGUv
dWNoYXIuaD4KICNpbmNsdWRlIDx1bmljb2RlL3Vub3JtLmg+CiAjaW5jbHVkZSA8QXBwbGljYXRp
b25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CisjaW5jbHVkZSA8V2ViS2l0U3lzdGVt
SW50ZXJmYWNlL1dlYktpdFN5c3RlbUludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1sYW5nLmg+CiAj
aW5jbHVkZSA8dGNoYXIuaD4KLSNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0
U3lzdGVtSW50ZXJmYWNlLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogdXNpbmcgc3RkOjpt
YXg7CiAKLWNvbnN0IGZsb2F0IGNTbWFsbENhcHNGb250U2l6ZU11bHRpcGxpZXIgPSAwLjdmOwot
Ci1zdGF0aWMgYm9vbCBzaG91bGRBcHBseU1hY0FzY2VudEhhY2s7Ci0KLXN0YXRpYyBpbmxpbmUg
ZmxvYXQgc2NhbGVFbVRvVW5pdHMoZmxvYXQgeCwgdW5zaWduZWQgdW5pdHNQZXJFbSkgeyByZXR1
cm4gdW5pdHNQZXJFbSA/IHggLyAoZmxvYXQpdW5pdHNQZXJFbSA6IHg7IH0KLQotdm9pZCBTaW1w
bGVGb250RGF0YTo6c2V0U2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrKGJvb2wgYikKLXsKLSAgICBz
aG91bGRBcHBseU1hY0FzY2VudEhhY2sgPSBiOwotfQorc3RhdGljIGlubGluZSBmbG9hdCBzY2Fs
ZUVtVG9Vbml0cyhmbG9hdCB4LCB1bnNpZ25lZCB1bml0c1BlckVtKSB7IHJldHVybiB1bml0c1Bl
ckVtID8geCAvIHN0YXRpY19jYXN0PGZsb2F0Pih1bml0c1BlckVtKSA6IHg7IH0KIAogdm9pZCBT
aW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKLXsgICAgCit7CiAgICAgbV9zeW50aGV0aWNC
b2xkT2Zmc2V0ID0gbV9mb250LnN5bnRoZXRpY0JvbGQoKSA/IDEuMGYgOiAwLmY7CiAgICAgbV9z
Y3JpcHRDYWNoZSA9IDA7CiAgICAgbV9zY3JpcHRGb250UHJvcGVydGllcyA9IDA7CkBAIC0xMTAs
NyArMTAxLDcgQEAgdm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKICAgICAgICAg
U2VsZWN0T2JqZWN0KGRjLCBvbGRGb250KTsKICAgICAgICAgUmVsZWFzZURDKDAsIGRjKTsKIAot
ICAgICAgICBpZiAoc2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrKSB7CisgICAgICAgIGlmIChzaG91
bGRBcHBseU1hY0FzY2VudEhhY2soKSkgewogICAgICAgICAgICAgLy8gVGhpcyBjb2RlIGNvbWVz
IGZyb20gRm9udERhdGFNYWMubW0uIFdlIG9ubHkgZXZlciBkbyB0aGlzIHdoZW4gcnVubmluZyBy
ZWdyZXNzaW9uIHRlc3RzIHNvIHRoYXQgb3VyIG1ldHJpY3Mgd2lsbCBtYXRjaCBNYWMuCiAKICAg
ICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYWRqdXN0IFRpbWVzLCBIZWx2ZXRpY2EsIGFuZCBDb3Vy
aWVyIHRvIGNsb3NlbHkgbWF0Y2ggdGhlCkBAIC0xNjAsODMgKzE1MSw2IEBAIHZvaWQgU2ltcGxl
Rm9udERhdGE6OnBsYXRmb3JtRGVzdHJveSgpCiAgICAgZGVsZXRlIG1fc2NyaXB0Rm9udFByb3Bl
cnRpZXM7CiB9CiAKLVNpbXBsZUZvbnREYXRhKiBTaW1wbGVGb250RGF0YTo6c21hbGxDYXBzRm9u
dERhdGEoY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIGNvbnN0Ci17Ci0g
ICAgaWYgKCFtX3NtYWxsQ2Fwc0ZvbnREYXRhKSB7Ci0gICAgICAgIGZsb2F0IHNtYWxsQ2Fwc0hl
aWdodCA9IGNTbWFsbENhcHNGb250U2l6ZU11bHRpcGxpZXIgKiBtX2ZvbnQuc2l6ZSgpOwotICAg
ICAgICBpZiAoaXNDdXN0b21Gb250KCkpIHsKLSAgICAgICAgICAgIEZvbnRQbGF0Zm9ybURhdGEg
c21hbGxDYXBzRm9udERhdGEobV9mb250KTsKLSAgICAgICAgICAgIHNtYWxsQ2Fwc0ZvbnREYXRh
LnNldFNpemUoc21hbGxDYXBzSGVpZ2h0KTsKLSAgICAgICAgICAgIG1fc21hbGxDYXBzRm9udERh
dGEgPSBuZXcgU2ltcGxlRm9udERhdGEoc21hbGxDYXBzRm9udERhdGEsIHRydWUsIGZhbHNlKTsK
LSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPR0ZPTlQgd2luZm9udDsKLSAgICAgICAg
ICAgIEdldE9iamVjdChtX2ZvbnQuaGZvbnQoKSwgc2l6ZW9mKExPR0ZPTlQpLCAmd2luZm9udCk7
Ci0gICAgICAgICAgICB3aW5mb250LmxmSGVpZ2h0ID0gLWxyb3VuZGYoc21hbGxDYXBzSGVpZ2h0
ICogKG1fZm9udC51c2VHREkoKSA/IDEgOiAzMikpOwotICAgICAgICAgICAgSEZPTlQgaGZvbnQg
PSBDcmVhdGVGb250SW5kaXJlY3QoJndpbmZvbnQpOwotICAgICAgICAgICAgbV9zbWFsbENhcHNG
b250RGF0YSA9IG5ldyBTaW1wbGVGb250RGF0YShGb250UGxhdGZvcm1EYXRhKGhmb250LCBzbWFs
bENhcHNIZWlnaHQsIGZvbnREZXNjcmlwdGlvbi5ib2xkKCksIGZvbnREZXNjcmlwdGlvbi5pdGFs
aWMoKSwgbV9mb250LnVzZUdESSgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1f
c21hbGxDYXBzRm9udERhdGE7Ci19Ci0KLWJvb2wgU2ltcGxlRm9udERhdGE6OmNvbnRhaW5zQ2hh
cmFjdGVycyhjb25zdCBVQ2hhciogY2hhcmFjdGVycywgaW50IGxlbmd0aCkgY29uc3QKLXsKLSAg
ICAvLyBGSVhNRTogU3VwcG9ydCBjdXN0b20gZm9udHMuCi0gICAgaWYgKGlzQ3VzdG9tRm9udCgp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBGSVhNRTogTWljcm9zb2Z0IGRvY3Vt
ZW50YXRpb24gc2VlbXMgdG8gaW1wbHkgdGhhdCBjaGFyYWN0ZXJzIGNhbiBiZSBvdXRwdXQgdXNp
bmcgYSBnaXZlbiBmb250IGFuZCBEQwotICAgIC8vIG1lcmVseSBieSB0ZXN0aW5nIGNvZGUgcGFn
ZSBpbnRlcnNlY3Rpb24uICBUaGlzIHNlZW1zIHN1c3BlY3QgdGhvdWdoLiAgQ2FuJ3QgYSBmb250
IG9ubHkgcGFydGlhbGx5Ci0gICAgLy8gY292ZXIgYSBnaXZlbiBjb2RlIHBhZ2U/Ci0gICAgSU1M
YW5nRm9udExpbmsyKiBsYW5nRm9udExpbmsgPSBGb250Q2FjaGU6OmdldEZvbnRMaW5rSW50ZXJm
YWNlKCk7Ci0gICAgaWYgKCFsYW5nRm9udExpbmspCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQot
ICAgIEhEQyBkYyA9IEdldERDKDApOwotICAgIAotICAgIERXT1JEIGFjcENvZGVQYWdlczsKLSAg
ICBsYW5nRm9udExpbmstPkNvZGVQYWdlVG9Db2RlUGFnZXMoQ1BfQUNQLCAmYWNwQ29kZVBhZ2Vz
KTsKLQotICAgIERXT1JEIGZvbnRDb2RlUGFnZXM7Ci0gICAgbGFuZ0ZvbnRMaW5rLT5HZXRGb250
Q29kZVBhZ2VzKGRjLCBtX2ZvbnQuaGZvbnQoKSwgJmZvbnRDb2RlUGFnZXMpOwotCi0gICAgRFdP
UkQgYWN0dWFsQ29kZVBhZ2VzOwotICAgIGxvbmcgbnVtQ2hhcmFjdGVyc1Byb2Nlc3NlZDsKLSAg
ICBsb25nIG9mZnNldCA9IDA7Ci0gICAgd2hpbGUgKG9mZnNldCA8IGxlbmd0aCkgewotICAgICAg
ICBsYW5nRm9udExpbmstPkdldFN0ckNvZGVQYWdlcyhjaGFyYWN0ZXJzLCBsZW5ndGgsIGFjcENv
ZGVQYWdlcywgJmFjdHVhbENvZGVQYWdlcywgJm51bUNoYXJhY3RlcnNQcm9jZXNzZWQpOwotICAg
ICAgICBpZiAoKGFjdHVhbENvZGVQYWdlcyAmIGZvbnRDb2RlUGFnZXMpID09IDApCi0gICAgICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIG9mZnNldCArPSBudW1DaGFyYWN0ZXJzUHJvY2Vz
c2VkOwotICAgIH0KLQotICAgIFJlbGVhc2VEQygwLCBkYyk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsK
LX0KLQotdm9pZCBTaW1wbGVGb250RGF0YTo6ZGV0ZXJtaW5lUGl0Y2goKQotewotICAgIGlmIChp
c0N1c3RvbUZvbnQoKSkgewotICAgICAgICBtX3RyZWF0QXNGaXhlZFBpdGNoID0gZmFsc2U7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBURVhUTUVUUklDUyBoYXZlIHRoaXMuICBT
ZXQgbV90cmVhdEFzRml4ZWRQaXRjaCBiYXNlZCBvZmYgdGhhdC4KLSAgICBIREMgZGMgPSBHZXRE
QygwKTsKLSAgICBTYXZlREMoZGMpOwotICAgIFNlbGVjdE9iamVjdChkYywgbV9mb250Lmhmb250
KCkpOwotCi0gICAgLy8gWWVzLCB0aGlzIGxvb2tzIGJhY2t3YXJkcywgYnV0IHRoZSBmaXhlZCBw
aXRjaCBiaXQgaXMgYWN0dWFsbHkgc2V0IGlmIHRoZSBmb250Ci0gICAgLy8gaXMgKm5vdCogZml4
ZWQgcGl0Y2guICBVbmJlbGlldmFibGUgYnV0IHRydWUuCi0gICAgVEVYVE1FVFJJQyB0bTsKLSAg
ICBHZXRUZXh0TWV0cmljcyhkYywgJnRtKTsKLSAgICBtX3RyZWF0QXNGaXhlZFBpdGNoID0gKCh0
bS50bVBpdGNoQW5kRmFtaWx5ICYgVE1QRl9GSVhFRF9QSVRDSCkgPT0gMCk7Ci0KLSAgICBSZXN0
b3JlREMoZGMsIC0xKTsKLSAgICBSZWxlYXNlREMoMCwgZGMpOwotfQotCiBmbG9hdCBTaW1wbGVG
b250RGF0YTo6cGxhdGZvcm1XaWR0aEZvckdseXBoKEdseXBoIGdseXBoKSBjb25zdAogewogICAg
IGlmIChtX2ZvbnQudXNlR0RJKCkpIHsKQEAgLTI1MywyOSArMTY3LDEyIEBAIGZsb2F0IFNpbXBs
ZUZvbnREYXRhOjpwbGF0Zm9ybVdpZHRoRm9yR2wKICAgICBmbG9hdCBwb2ludFNpemUgPSBtX2Zv
bnQuc2l6ZSgpOwogICAgIENHU2l6ZSBhZHZhbmNlOwogICAgIENHQWZmaW5lVHJhbnNmb3JtIG0g
PSBDR0FmZmluZVRyYW5zZm9ybU1ha2VTY2FsZShwb2ludFNpemUsIHBvaW50U2l6ZSk7CisgCiAg
ICAgLy8gRklYTUU6IE5lZWQgdG8gYWRkIHJlYWwgc3VwcG9ydCBmb3IgcHJpbnRlciBmb250cy4K
ICAgICBib29sIGlzUHJpbnRlckZvbnQgPSBmYWxzZTsKICAgICB3a0dldEdseXBoQWR2YW5jZXMo
Zm9udCwgbSwgbV9pc1N5c3RlbUZvbnQsIGlzUHJpbnRlckZvbnQsIGdseXBoLCBhZHZhbmNlKTsK
LSAgICByZXR1cm4gYWR2YW5jZS53aWR0aCArIG1fc3ludGhldGljQm9sZE9mZnNldDsKLX0KIAot
U0NSSVBUX0ZPTlRQUk9QRVJUSUVTKiBTaW1wbGVGb250RGF0YTo6c2NyaXB0Rm9udFByb3BlcnRp
ZXMoKSBjb25zdAotewotICAgIGlmICghbV9zY3JpcHRGb250UHJvcGVydGllcykgewotICAgICAg
ICBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzID0gbmV3IFNDUklQVF9GT05UUFJPUEVSVElFUzsKLSAg
ICAgICAgbWVtc2V0KG1fc2NyaXB0Rm9udFByb3BlcnRpZXMsIDAsIHNpemVvZihTQ1JJUFRfRk9O
VFBST1BFUlRJRVMpKTsKLSAgICAgICAgbV9zY3JpcHRGb250UHJvcGVydGllcy0+Y0J5dGVzID0g
c2l6ZW9mKFNDUklQVF9GT05UUFJPUEVSVElFUyk7Ci0gICAgICAgIEhSRVNVTFQgcmVzdWx0ID0g
U2NyaXB0R2V0Rm9udFByb3BlcnRpZXMoMCwgc2NyaXB0Q2FjaGUoKSwgbV9zY3JpcHRGb250UHJv
cGVydGllcyk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gRV9QRU5ESU5HKSB7Ci0gICAgICAgICAg
ICBIREMgZGMgPSBHZXREQygwKTsKLSAgICAgICAgICAgIFNhdmVEQyhkYyk7Ci0gICAgICAgICAg
ICBTZWxlY3RPYmplY3QoZGMsIG1fZm9udC5oZm9udCgpKTsKLSAgICAgICAgICAgIFNjcmlwdEdl
dEZvbnRQcm9wZXJ0aWVzKGRjLCBzY3JpcHRDYWNoZSgpLCBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVz
KTsKLSAgICAgICAgICAgIFJlc3RvcmVEQyhkYywgLTEpOwotICAgICAgICAgICAgUmVsZWFzZURD
KDAsIGRjKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbV9zY3JpcHRGb250UHJvcGVy
dGllczsKKyAgICByZXR1cm4gYWR2YW5jZS53aWR0aCArIG1fc3ludGhldGljQm9sZE9mZnNldDsK
IH0KIAogfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERh
dGFDYWlyb1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW4vU2ltcGxlRm9udERhdGFDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNhaXJvV2luLmNwcAkocmV2aXNpb24g
MCkKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQXBwbGUgSW5j
LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4gIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4gIE5laXRo
ZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFt
ZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3Ig
cHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhv
dXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAq
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
U2ltcGxlRm9udERhdGEuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2luY2x1ZGUgIkZv
bnQuaCIKKyNpbmNsdWRlICJGb250Q2FjaGUuaCIKKyNpbmNsdWRlICJGb250RGVzY3JpcHRpb24u
aCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgPG1sYW5nLmg+CisjaW5j
bHVkZSA8dGNoYXIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2b2lkIFNpbXBsZUZvbnRE
YXRhOjpwbGF0Zm9ybUluaXQoKQoreworICAgIG1fc2NyaXB0Q2FjaGUgPSAwOworICAgIG1fc2Ny
aXB0Rm9udFByb3BlcnRpZXMgPSAwOworICAgIG1faXNTeXN0ZW1Gb250ID0gZmFsc2U7CisgICAg
CisgICAgaWYgKG1fZm9udC51c2VHREkoKSkgeworICAgICAgICBIREMgaGRjID0gR2V0REMoMCk7
CisgICAgICAgIEhHRElPQkogb2xkRm9udCA9IFNlbGVjdE9iamVjdChoZGMsIG1fZm9udC5oZm9u
dCgpKTsKKyAgICAgICAgT1VUTElORVRFWFRNRVRSSUMgbWV0cmljczsKKyAgICAgICAgR2V0T3V0
bGluZVRleHRNZXRyaWNzKGhkYywgc2l6ZW9mKG1ldHJpY3MpLCAmbWV0cmljcyk7CisgICAgICAg
IFRFWFRNRVRSSUMmIHRleHRNZXRyaWNzID0gbWV0cmljcy5vdG1UZXh0TWV0cmljczsKKyAgICAg
ICAgbV9hc2NlbnQgPSB0ZXh0TWV0cmljcy50bUFzY2VudDsKKyAgICAgICAgbV9kZXNjZW50ID0g
dGV4dE1ldHJpY3MudG1EZXNjZW50OworICAgICAgICBtX2xpbmVHYXAgPSB0ZXh0TWV0cmljcy50
bUV4dGVybmFsTGVhZGluZzsKKyAgICAgICAgbV9saW5lU3BhY2luZyA9IG1fYXNjZW50ICsgbV9k
ZXNjZW50ICsgbV9saW5lR2FwOworICAgICAgICBtX3hIZWlnaHQgPSBtX2FzY2VudCAqIDAuNTZm
OyAvLyBCZXN0IGd1ZXNzIGZvciB4SGVpZ2h0IGlmIG5vIHggZ2x5cGggaXMgcHJlc2VudC4KKwor
ICAgICAgICBHTFlQSE1FVFJJQ1MgZ207CisgICAgICAgIE1BVDIgbWF0ID0geyAxLCAwLCAwLCAx
IH07CisgICAgICAgIERXT1JEIGxlbiA9IEdldEdseXBoT3V0bGluZShoZGMsICd4JywgR0dPX01F
VFJJQ1MsICZnbSwgMCwgMCwgJm1hdCk7CisgICAgICAgIGlmIChsZW4gIT0gR0RJX0VSUk9SICYm
IGdtLmdtcHRHbHlwaE9yaWdpbi55ID4gMCkKKyAgICAgICAgICAgIG1feEhlaWdodCA9IGdtLmdt
cHRHbHlwaE9yaWdpbi55OworCisgICAgICAgIG1fdW5pdHNQZXJFbSA9IG1ldHJpY3Mub3RtRU1T
cXVhcmU7CisKKyAgICAgICAgU2VsZWN0T2JqZWN0KGhkYywgb2xkRm9udCk7CisgICAgICAgIFJl
bGVhc2VEQygwLCBoZGMpOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBGSVhN
RTogVGhpcyBzZWN0aW9uIHNob3VsZCBkZXRlcm1pbmUgZm9udCBkaW1lbnNpb25zIChzZWUgQ0cg
aW1wbGVtZW50YXRpb24pLgorICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgU2ltcGxl
Rm9udERhdGE6OnBsYXRmb3JtRGVzdHJveSgpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30K
KworZmxvYXQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtV2lkdGhGb3JHbHlwaChHbHlwaCBnbHlw
aCkgY29uc3QKK3sKKyAgICBpZiAobV9mb250LnVzZUdESSgpKSB7CisgICAgICAgIEhEQyBoZGMg
PSBHZXREQygwKTsKKyAgICAgICAgSEdESU9CSiBvbGRGb250ID0gU2VsZWN0T2JqZWN0KGhkYywg
bV9mb250Lmhmb250KCkpOworICAgICAgICBpbnQgd2lkdGg7CisgICAgICAgIEdldENoYXJXaWR0
aEkoaGRjLCBnbHlwaCwgMSwgMCwgJndpZHRoKTsKKyAgICAgICAgU2VsZWN0T2JqZWN0KGhkYywg
b2xkRm9udCk7CisgICAgICAgIFJlbGVhc2VEQygwLCBoZGMpOworICAgICAgICByZXR1cm4gd2lk
dGg7CisgICAgfQorCisgICAgLy8gRklYTUU6IEZsZXNoIG91dCB3aXRoIENhaXJvL3dpbjMyIGZv
bnQgaW1wbGVtZW50YXRpb24KKyAgICBub3RJbXBsZW1lbnRlZCgpOworCisgICAgcmV0dXJuIDA7
Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnRE
YXRhV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9T
aW1wbGVGb250RGF0YVdpbi5jcHAJKHJldmlzaW9uIDI5ODM0KQorKysgV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERhdGFXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0x
LDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFw
cGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKQEAgLTQ4LDExNiArNDgsMTYgQEAgdXNpbmcgc3RkOjptYXg7CiAKIGNvbnN0IGZsb2F0
IGNTbWFsbENhcHNGb250U2l6ZU11bHRpcGxpZXIgPSAwLjdmOwogCi1zdGF0aWMgYm9vbCBzaG91
bGRBcHBseU1hY0FzY2VudEhhY2s7Ci0KLXN0YXRpYyBpbmxpbmUgZmxvYXQgc2NhbGVFbVRvVW5p
dHMoZmxvYXQgeCwgdW5zaWduZWQgdW5pdHNQZXJFbSkgeyByZXR1cm4gdW5pdHNQZXJFbSA/IHgg
LyAoZmxvYXQpdW5pdHNQZXJFbSA6IHg7IH0KK3N0YXRpYyBib29sIGdfc2hvdWxkQXBwbHlNYWNB
c2NlbnRIYWNrOwogCiB2b2lkIFNpbXBsZUZvbnREYXRhOjpzZXRTaG91bGRBcHBseU1hY0FzY2Vu
dEhhY2soYm9vbCBiKQogewotICAgIHNob3VsZEFwcGx5TWFjQXNjZW50SGFjayA9IGI7Ci19Ci0K
LXZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtSW5pdCgpCi17ICAgIAotICAgIG1fc3ludGhl
dGljQm9sZE9mZnNldCA9IG1fZm9udC5zeW50aGV0aWNCb2xkKCkgPyAxLjBmIDogMC5mOwotICAg
IG1fc2NyaXB0Q2FjaGUgPSAwOwotICAgIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMgPSAwOwotICAg
IG1faXNTeXN0ZW1Gb250ID0gZmFsc2U7Ci0gICAgCi0gICAgaWYgKG1fZm9udC51c2VHREkoKSkg
ewotICAgICAgICBIREMgaGRjID0gR2V0REMoMCk7Ci0gICAgICAgIEhHRElPQkogb2xkRm9udCA9
IFNlbGVjdE9iamVjdChoZGMsIG1fZm9udC5oZm9udCgpKTsKLSAgICAgICAgT1VUTElORVRFWFRN
RVRSSUMgbWV0cmljczsKLSAgICAgICAgR2V0T3V0bGluZVRleHRNZXRyaWNzKGhkYywgc2l6ZW9m
KG1ldHJpY3MpLCAmbWV0cmljcyk7Ci0gICAgICAgIFRFWFRNRVRSSUMmIHRleHRNZXRyaWNzID0g
bWV0cmljcy5vdG1UZXh0TWV0cmljczsKLSAgICAgICAgbV9hc2NlbnQgPSB0ZXh0TWV0cmljcy50
bUFzY2VudDsKLSAgICAgICAgbV9kZXNjZW50ID0gdGV4dE1ldHJpY3MudG1EZXNjZW50OwotICAg
ICAgICBtX2xpbmVHYXAgPSB0ZXh0TWV0cmljcy50bUV4dGVybmFsTGVhZGluZzsKLSAgICAgICAg
bV9saW5lU3BhY2luZyA9IG1fYXNjZW50ICsgbV9kZXNjZW50ICsgbV9saW5lR2FwOwotICAgICAg
ICBtX3hIZWlnaHQgPSBtX2FzY2VudCAqIDAuNTZmOyAvLyBCZXN0IGd1ZXNzIGZvciB4SGVpZ2h0
IGlmIG5vIHggZ2x5cGggaXMgcHJlc2VudC4KLQotICAgICAgICBHTFlQSE1FVFJJQ1MgZ207Ci0g
ICAgICAgIE1BVDIgbWF0ID0geyAxLCAwLCAwLCAxIH07Ci0gICAgICAgIERXT1JEIGxlbiA9IEdl
dEdseXBoT3V0bGluZShoZGMsICd4JywgR0dPX01FVFJJQ1MsICZnbSwgMCwgMCwgJm1hdCk7Ci0g
ICAgICAgIGlmIChsZW4gIT0gR0RJX0VSUk9SICYmIGdtLmdtcHRHbHlwaE9yaWdpbi55ID4gMCkK
LSAgICAgICAgICAgIG1feEhlaWdodCA9IGdtLmdtcHRHbHlwaE9yaWdpbi55OwotCi0gICAgICAg
IG1fdW5pdHNQZXJFbSA9IG1ldHJpY3Mub3RtRU1TcXVhcmU7Ci0KLSAgICAgICAgU2VsZWN0T2Jq
ZWN0KGhkYywgb2xkRm9udCk7Ci0gICAgICAgIFJlbGVhc2VEQygwLCBoZGMpOwotCi0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0KLSAgICBDR0ZvbnRSZWYgZm9udCA9IG1fZm9udC5jZ0ZvbnQoKTsK
LSAgICBpbnQgaUFzY2VudCA9IENHRm9udEdldEFzY2VudChmb250KTsKLSAgICBpbnQgaURlc2Nl
bnQgPSBDR0ZvbnRHZXREZXNjZW50KGZvbnQpOwotICAgIGludCBpTGluZUdhcCA9IENHRm9udEdl
dExlYWRpbmcoZm9udCk7Ci0gICAgbV91bml0c1BlckVtID0gQ0dGb250R2V0VW5pdHNQZXJFbShm
b250KTsKLSAgICBmbG9hdCBwb2ludFNpemUgPSBtX2ZvbnQuc2l6ZSgpOwotICAgIGZsb2F0IGZB
c2NlbnQgPSBzY2FsZUVtVG9Vbml0cyhpQXNjZW50LCBtX3VuaXRzUGVyRW0pICogcG9pbnRTaXpl
OwotICAgIGZsb2F0IGZEZXNjZW50ID0gLXNjYWxlRW1Ub1VuaXRzKGlEZXNjZW50LCBtX3VuaXRz
UGVyRW0pICogcG9pbnRTaXplOwotICAgIGZsb2F0IGZMaW5lR2FwID0gc2NhbGVFbVRvVW5pdHMo
aUxpbmVHYXAsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7Ci0KLSAgICBpZiAoIWlzQ3VzdG9t
Rm9udCgpKSB7Ci0gICAgICAgIEhEQyBkYyA9IEdldERDKDApOwotICAgICAgICBIR0RJT0JKIG9s
ZEZvbnQgPSBTZWxlY3RPYmplY3QoZGMsIG1fZm9udC5oZm9udCgpKTsKLSAgICAgICAgaW50IGZh
Y2VMZW5ndGggPSBHZXRUZXh0RmFjZShkYywgMCwgMCk7Ci0gICAgICAgIFZlY3RvcjxUQ0hBUj4g
ZmFjZU5hbWUoZmFjZUxlbmd0aCk7Ci0gICAgICAgIEdldFRleHRGYWNlKGRjLCBmYWNlTGVuZ3Ro
LCBmYWNlTmFtZS5kYXRhKCkpOwotICAgICAgICBtX2lzU3lzdGVtRm9udCA9ICFfdGNzY21wKGZh
Y2VOYW1lLmRhdGEoKSwgX1QoIkx1Y2lkYSBHcmFuZGUiKSk7Ci0gICAgICAgIFNlbGVjdE9iamVj
dChkYywgb2xkRm9udCk7Ci0gICAgICAgIFJlbGVhc2VEQygwLCBkYyk7Ci0KLSAgICAgICAgaWYg
KHNob3VsZEFwcGx5TWFjQXNjZW50SGFjaykgewotICAgICAgICAgICAgLy8gVGhpcyBjb2RlIGNv
bWVzIGZyb20gRm9udERhdGFNYWMubW0uIFdlIG9ubHkgZXZlciBkbyB0aGlzIHdoZW4gcnVubmlu
ZyByZWdyZXNzaW9uIHRlc3RzIHNvIHRoYXQgb3VyIG1ldHJpY3Mgd2lsbCBtYXRjaCBNYWMuCi0K
LSAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYWRqdXN0IFRpbWVzLCBIZWx2ZXRpY2EsIGFuZCBD
b3VyaWVyIHRvIGNsb3NlbHkgbWF0Y2ggdGhlCi0gICAgICAgICAgICAvLyB2ZXJ0aWNhbCBtZXRy
aWNzIG9mIHRoZWlyIE1pY3Jvc29mdCBjb3VudGVycGFydHMgdGhhdCBhcmUgdGhlIGRlIGZhY3Rv
Ci0gICAgICAgICAgICAvLyB3ZWIgc3RhbmRhcmQuIFRoZSBBcHBLaXQgYWRqdXN0bWVudCBvZiAy
MCUgaXMgdG9vIGJpZyBhbmQgaXMKLSAgICAgICAgICAgIC8vIGluY29ycmVjdGx5IGFkZGVkIHRv
IGxpbmUgc3BhY2luZywgc28gd2UgdXNlIGEgMTUlIGFkanVzdG1lbnQgaW5zdGVhZAotICAgICAg
ICAgICAgLy8gYW5kIGFkZCBpdCB0byB0aGUgYXNjZW50LgotICAgICAgICAgICAgaWYgKCFfdGNz
Y21wKGZhY2VOYW1lLmRhdGEoKSwgX1QoIlRpbWVzIikpIHx8ICFfdGNzY21wKGZhY2VOYW1lLmRh
dGEoKSwgX1QoIkhlbHZldGljYSIpKSB8fCAhX3Rjc2NtcChmYWNlTmFtZS5kYXRhKCksIF9UKCJD
b3VyaWVyIikpKQotICAgICAgICAgICAgICAgIGZBc2NlbnQgKz0gZmxvb3JmKCgoZkFzY2VudCAr
IGZEZXNjZW50KSAqIDAuMTVmKSArIDAuNWYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbV9h
c2NlbnQgPSBscm91bmRmKGZBc2NlbnQpOwotICAgIG1fZGVzY2VudCA9IGxyb3VuZGYoZkRlc2Nl
bnQpOwotICAgIG1fbGluZUdhcCA9IGxyb3VuZGYoZkxpbmVHYXApOwotICAgIG1fbGluZVNwYWNp
bmcgPSBtX2FzY2VudCArIG1fZGVzY2VudCArIG1fbGluZUdhcDsKLQotICAgIC8vIE1lYXN1cmUg
dGhlIGFjdHVhbCBjaGFyYWN0ZXIgIngiLCBiZWNhdXNlIEFwcEtpdCBzeW50aGVzaXplcyBYIGhl
aWdodCByYXRoZXIgdGhhbiBnZXR0aW5nIGl0IGZyb20gdGhlIGZvbnQuCi0gICAgLy8gVW5mb3J0
dW5hdGVseSwgTlNGb250IHdpbGwgcm91bmQgdGhpcyBmb3IgdXMgc28gd2UgZG9uJ3QgcXVpdGUg
Z2V0IHRoZSByaWdodCB2YWx1ZS4KLSAgICBHbHlwaFBhZ2UqIGdseXBoUGFnZVplcm8gPSBHbHlw
aFBhZ2VUcmVlTm9kZTo6Z2V0Um9vdENoaWxkKHRoaXMsIDApLT5wYWdlKCk7Ci0gICAgR2x5cGgg
eEdseXBoID0gZ2x5cGhQYWdlWmVybyA/IGdseXBoUGFnZVplcm8tPmdseXBoRGF0YUZvckNoYXJh
Y3RlcigneCcpLmdseXBoIDogMDsKLSAgICBpZiAoeEdseXBoKSB7Ci0gICAgICAgIENHUmVjdCB4
Qm94OwotICAgICAgICBDR0ZvbnRHZXRHbHlwaEJCb3hlcyhmb250LCAmeEdseXBoLCAxLCAmeEJv
eCk7Ci0gICAgICAgIC8vIFVzZSB0aGUgbWF4aW11bSBvZiBlaXRoZXIgd2lkdGggb3IgaGVpZ2h0
IGJlY2F1c2UgIngiIGlzIG5lYXJseSBzcXVhcmUKLSAgICAgICAgLy8gYW5kIHdlYiBwYWdlcyB0
aGF0IGZvb2xpc2hseSB1c2UgdGhpcyBtZXRyaWMgZm9yIHdpZHRoIHdpbGwgYmUgbGFpZCBvdXQK
LSAgICAgICAgLy8gcG9vcmx5IGlmIHdlIHJldHVybiBhbiBhY2N1cmF0ZSBoZWlnaHQuIENsYXNz
aWMgY2FzZSBpcyBUaW1lcyAxMyBwb2ludCwKLSAgICAgICAgLy8gd2hpY2ggaGFzIGFuICJ4IiB0
aGF0IGlzIDd4NiBwaXhlbHMuCi0gICAgICAgIG1feEhlaWdodCA9IHNjYWxlRW1Ub1VuaXRzKG1h
eChDR1JlY3RHZXRNYXhYKHhCb3gpLCBDR1JlY3RHZXRNYXhZKHhCb3gpKSwgbV91bml0c1BlckVt
KSAqIHBvaW50U2l6ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgaVhIZWlnaHQgPSBDR0Zv
bnRHZXRYSGVpZ2h0KGZvbnQpOwotICAgICAgICBtX3hIZWlnaHQgPSBzY2FsZUVtVG9Vbml0cyhp
WEhlaWdodCwgbV91bml0c1BlckVtKSAqIHBvaW50U2l6ZTsKLSAgICB9CisgICAgZ19zaG91bGRB
cHBseU1hY0FzY2VudEhhY2sgPSBiOwogfQogCi12b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9y
bURlc3Ryb3koKQorYm9vbCBTaW1wbGVGb250RGF0YTo6c2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNr
KCkKIHsKLSAgICBpZiAoIWlzQ3VzdG9tRm9udCgpKSB7Ci0gICAgICAgIERlbGV0ZU9iamVjdCht
X2ZvbnQuaGZvbnQoKSk7Ci0gICAgICAgIENHRm9udFJlbGVhc2UobV9mb250LmNnRm9udCgpKTsK
LSAgICB9Ci0KLSAgICAvLyBXZSBkb24ndCBoYXNoIHRoaXMgb24gV2luMzIsIHNvIGl0J3MgZWZm
ZWN0aXZlbHkgb3duZWQgYnkgdXMuCi0gICAgZGVsZXRlIG1fc21hbGxDYXBzRm9udERhdGE7Ci0K
LSAgICBTY3JpcHRGcmVlQ2FjaGUoJm1fc2NyaXB0Q2FjaGUpOwotICAgIGRlbGV0ZSBtX3Njcmlw
dEZvbnRQcm9wZXJ0aWVzOworICAgIHJldHVybiBnX3Nob3VsZEFwcGx5TWFjQXNjZW50SGFjazsK
IH0KIAogU2ltcGxlRm9udERhdGEqIFNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNGb250RGF0YShj
b25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKQEAgLTIzNywyOCAr
MTM3LDYgQEAgdm9pZCBTaW1wbGVGb250RGF0YTo6ZGV0ZXJtaW5lUGl0Y2goKQogICAgIFJlbGVh
c2VEQygwLCBkYyk7CiB9CiAKLWZsb2F0IFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybVdpZHRoRm9y
R2x5cGgoR2x5cGggZ2x5cGgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fZm9udC51c2VHREkoKSkgewot
ICAgICAgICBIREMgaGRjID0gR2V0REMoMCk7Ci0gICAgICAgIEhHRElPQkogb2xkRm9udCA9IFNl
bGVjdE9iamVjdChoZGMsIG1fZm9udC5oZm9udCgpKTsKLSAgICAgICAgaW50IHdpZHRoOwotICAg
ICAgICBHZXRDaGFyV2lkdGhJKGhkYywgZ2x5cGgsIDEsIDAsICZ3aWR0aCk7Ci0gICAgICAgIFNl
bGVjdE9iamVjdChoZGMsIG9sZEZvbnQpOwotICAgICAgICBSZWxlYXNlREMoMCwgaGRjKTsKLSAg
ICAgICAgcmV0dXJuIHdpZHRoOwotICAgIH0KLQotICAgIENHRm9udFJlZiBmb250ID0gbV9mb250
LmNnRm9udCgpOwotICAgIGZsb2F0IHBvaW50U2l6ZSA9IG1fZm9udC5zaXplKCk7Ci0gICAgQ0dT
aXplIGFkdmFuY2U7Ci0gICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENHQWZmaW5lVHJhbnNmb3Jt
TWFrZVNjYWxlKHBvaW50U2l6ZSwgcG9pbnRTaXplKTsKLSAgICAvLyBGSVhNRTogTmVlZCB0byBh
ZGQgcmVhbCBzdXBwb3J0IGZvciBwcmludGVyIGZvbnRzLgotICAgIGJvb2wgaXNQcmludGVyRm9u
dCA9IGZhbHNlOwotICAgIHdrR2V0R2x5cGhBZHZhbmNlcyhmb250LCBtLCBtX2lzU3lzdGVtRm9u
dCwgaXNQcmludGVyRm9udCwgZ2x5cGgsIGFkdmFuY2UpOwotICAgIHJldHVybiBhZHZhbmNlLndp
ZHRoICsgbV9zeW50aGV0aWNCb2xkT2Zmc2V0OwotfQotCiBTQ1JJUFRfRk9OVFBST1BFUlRJRVMq
IFNpbXBsZUZvbnREYXRhOjpzY3JpcHRGb250UHJvcGVydGllcygpIGNvbnN0CiB7CiAgICAgaWYg
KCFtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzKSB7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbi9E
cmFnSW1hZ2VDR1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJh
Z0ltYWdlQ0dXaW4uY3BwCShyZXZpc2lvbiAyOTgzNCkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS93
aW4vRHJhZ0ltYWdlV2luLmNwcDoyOTgzNCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJ
bWFnZUNHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRHJhZ0ltYWdlLmgiCisKKyNpbmNsdWRl
ICJDYWNoZWRJbWFnZS5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUg
IkltYWdlLmgiCisjaW5jbHVkZSAiUmV0YWluUHRyLmgiCisKKyNpbmNsdWRlIDxDb3JlR3JhcGhp
Y3MvQ29yZUdyYXBoaWNzLmg+CisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworSW50U2l6ZSBkcmFnSW1hZ2VTaXplKERyYWdJbWFnZVJlZiBpbWFnZSkKK3sK
KyAgICBpZiAoIWltYWdlKQorICAgICAgICByZXR1cm4gSW50U2l6ZSgpOworICAgIEJJVE1BUCBi
OworICAgIEdldE9iamVjdChpbWFnZSwgc2l6ZW9mKEJJVE1BUCksICZiKTsKKyAgICByZXR1cm4g
SW50U2l6ZShiLmJtV2lkdGgsIGIuYm1IZWlnaHQpOworfQorCit2b2lkIGRlbGV0ZURyYWdJbWFn
ZShEcmFnSW1hZ2VSZWYgaW1hZ2UpCit7CisgICAgaWYgKGltYWdlKQorICAgICAgICA6OkRlbGV0
ZU9iamVjdChpbWFnZSk7Cit9CisKK0hCSVRNQVAgYWxsb2NJbWFnZShIREMgZGMsIEludFNpemUg
c2l6ZSwgQ0dDb250ZXh0UmVmICp0YXJnZXRSZWYpCit7CisgICAgSEJJVE1BUCBoYm1wOworICAg
IEJJVE1BUElORk8gYm1wSW5mbyA9IHswfTsKKyAgICBibXBJbmZvLmJtaUhlYWRlci5iaVNpemUg
PSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7CisgICAgYm1wSW5mby5ibWlIZWFkZXIuYmlXaWR0
aCA9IHNpemUud2lkdGgoKTsKKyAgICBibXBJbmZvLmJtaUhlYWRlci5iaUhlaWdodCA9IHNpemUu
aGVpZ2h0KCk7CisgICAgYm1wSW5mby5ibWlIZWFkZXIuYmlQbGFuZXMgPSAxOworICAgIGJtcElu
Zm8uYm1pSGVhZGVyLmJpQml0Q291bnQgPSAzMjsKKyAgICBibXBJbmZvLmJtaUhlYWRlci5iaUNv
bXByZXNzaW9uID0gQklfUkdCOworICAgIExQVk9JRCBiaXRzOworICAgIGhibXAgPSBDcmVhdGVE
SUJTZWN0aW9uKGRjLCAmYm1wSW5mbywgRElCX1JHQl9DT0xPUlMsICZiaXRzLCAwLCAwKTsKKwor
ICAgIGlmICghdGFyZ2V0UmVmKQorICAgICAgICByZXR1cm4gaGJtcDsKKworICAgIENHQ29sb3JT
cGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKKyAgICBD
R0NvbnRleHRSZWYgYml0bWFwQ29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZShiaXRzLCBi
bXBJbmZvLmJtaUhlYWRlci5iaVdpZHRoLCBibXBJbmZvLmJtaUhlYWRlci5iaUhlaWdodCwgOCwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBi
bXBJbmZvLmJtaUhlYWRlci5iaVdpZHRoICogNCwgZGV2aWNlUkdCLCAKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0dCaXRtYXBCeXRlT3Jk
ZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFOb25lU2tpcEZpcnN0KTsKKyAgICBDR0NvbG9yU3Bh
Y2VSZWxlYXNlKGRldmljZVJHQik7CisgICAgaWYgKCFiaXRtYXBDb250ZXh0KSB7CisgICAgICAg
IERlbGV0ZU9iamVjdChoYm1wKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgKnRh
cmdldFJlZiA9IGJpdG1hcENvbnRleHQ7CisgICAgcmV0dXJuIGhibXA7Cit9CisKK3N0YXRpYyBD
R0NvbnRleHRSZWYgY3JlYXRlQ2dDb250ZXh0RnJvbUJpdG1hcChIQklUTUFQIGJpdG1hcCkKK3sK
KyAgICBCSVRNQVAgaW5mbzsKKyAgICBHZXRPYmplY3QoYml0bWFwLCBzaXplb2YoaW5mbyksICZp
bmZvKTsKKyAgICBBU1NFUlQoaW5mby5ibUJpdHNQaXhlbCA9PSAzMik7CisKKyAgICBDR0NvbG9y
U3BhY2VSZWYgZGV2aWNlUkdCID0gQ0dDb2xvclNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7CisgICAg
Q0dDb250ZXh0UmVmIGJpdG1hcENvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUoaW5mby5i
bUJpdHMsIGluZm8uYm1XaWR0aCwgaW5mby5ibUhlaWdodCwgOCwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmJtV2lkdGhCeXRlcywg
ZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFOb25l
U2tpcEZpcnN0KTsKKyAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKGRldmljZVJHQik7CisgICAgcmV0
dXJuIGJpdG1hcENvbnRleHQ7Cit9CisKK0RyYWdJbWFnZVJlZiBzY2FsZURyYWdJbWFnZShEcmFn
SW1hZ2VSZWYgaW1hZ2UsIEZsb2F0U2l6ZSBzY2FsZSkKK3sKKyAgICAvLyBGSVhNRTogZHVlIHRv
IHRoZSB3YXkgZHJhZyBpbWFnZXMgYXJlIGRvbmUgb24gd2luZG93cyB3ZSBuZWVkIAorICAgIC8v
IHRvIHByZXByb2Nlc3MgdGhlIGFscGhhIGNoYW5uZWwgPHJkYXI6Ly9wcm9ibGVtLzUwMTU5NDY+
CisKKyAgICBpZiAoIWltYWdlKQorICAgICAgICByZXR1cm4gMDsKKyAgICBDR0NvbnRleHRSZWYg
dGFyZ2V0Q29udGV4dDsKKyAgICBDR0NvbnRleHRSZWYgc3JjQ29udGV4dDsKKyAgICBDR0ltYWdl
UmVmIHNyY0ltYWdlOworICAgIEludFNpemUgc3JjU2l6ZSA9IGRyYWdJbWFnZVNpemUoaW1hZ2Up
OworICAgIEludFNpemUgZHN0U2l6ZSgoaW50KShzcmNTaXplLndpZHRoKCkgKiBzY2FsZS53aWR0
aCgpKSwgKGludCkoc3JjU2l6ZS5oZWlnaHQoKSAqIHNjYWxlLmhlaWdodCgpKSk7CisgICAgSEJJ
VE1BUCBoYm1wID0gMDsKKyAgICBIREMgZGMgPSBHZXREQygwKTsKKyAgICBIREMgZHN0REMgPSBD
cmVhdGVDb21wYXRpYmxlREMoZGMpOworICAgIGlmICghZHN0REMpCisgICAgICAgIGdvdG8gZXhp
dDsKKworICAgIGhibXAgPSBhbGxvY0ltYWdlKGRzdERDLCBkc3RTaXplLCAmdGFyZ2V0Q29udGV4
dCk7CisgICAgaWYgKCFoYm1wKQorICAgICAgICBnb3RvIGV4aXQ7CisKKyAgICBzcmNDb250ZXh0
ID0gY3JlYXRlQ2dDb250ZXh0RnJvbUJpdG1hcChpbWFnZSk7CisgICAgc3JjSW1hZ2UgPSBDR0Jp
dG1hcENvbnRleHRDcmVhdGVJbWFnZShzcmNDb250ZXh0KTsKKyAgICBDR1JlY3QgcmVjdDsKKyAg
ICByZWN0Lm9yaWdpbi54ID0gMDsKKyAgICByZWN0Lm9yaWdpbi55ID0gMDsKKyAgICByZWN0LnNp
emUgPSBkc3RTaXplOworICAgIENHQ29udGV4dERyYXdJbWFnZSh0YXJnZXRDb250ZXh0LCByZWN0
LCBzcmNJbWFnZSk7CisgICAgQ0dJbWFnZVJlbGVhc2Uoc3JjSW1hZ2UpOworICAgIENHQ29udGV4
dFJlbGVhc2Uoc3JjQ29udGV4dCk7CisgICAgQ0dDb250ZXh0UmVsZWFzZSh0YXJnZXRDb250ZXh0
KTsKKyAgICA6OkRlbGV0ZU9iamVjdChpbWFnZSk7CisgICAgaW1hZ2UgPSAwOworCitleGl0Ogor
ICAgIGlmICghaGJtcCkKKyAgICAgICAgaGJtcCA9IGltYWdlOworICAgIGlmIChkc3REQykKKyAg
ICAgICAgRGVsZXRlREMoZHN0REMpOworICAgIFJlbGVhc2VEQygwLCBkYyk7CisgICAgcmV0dXJu
IGhibXA7Cit9CisgICAgCitEcmFnSW1hZ2VSZWYgZGlzc29sdmVEcmFnSW1hZ2VUb0ZyYWN0aW9u
KERyYWdJbWFnZVJlZiBpbWFnZSwgZmxvYXQpCit7CisgICAgLy9XZSBkb24ndCBkbyB0aGlzIG9u
IHdpbmRvd3MgYXMgdGhlIGRyYWdpbWFnZSBpcyBibGVuZGVkIGJ5IHRoZSBPUworICAgIHJldHVy
biBpbWFnZTsKK30KKyAgICAgICAgCitEcmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlRnJvbUlt
YWdlKEltYWdlKiBpbWcpCit7ICAgIAorICAgIEhCSVRNQVAgaGJtcCA9IDA7CisgICAgSERDIGRj
ID0gR2V0REMoMCk7CisgICAgSERDIHdvcmtpbmdEQyA9IENyZWF0ZUNvbXBhdGlibGVEQyhkYyk7
CisgICAgQ0dDb250ZXh0UmVmIGRyYXdDb250ZXh0ID0gMDsKKyAgICBpZiAoIXdvcmtpbmdEQykK
KyAgICAgICAgZ290byBleGl0OworCisgICAgaGJtcCA9IGFsbG9jSW1hZ2Uod29ya2luZ0RDLCBp
bWctPnNpemUoKSwgJmRyYXdDb250ZXh0KTsKKworICAgIGlmICghaGJtcCkKKyAgICAgICAgZ290
byBleGl0OworCisgICAgaWYgKCFkcmF3Q29udGV4dCkgeworICAgICAgICA6OkRlbGV0ZU9iamVj
dChoYm1wKTsKKyAgICAgICAgaGJtcCA9IDA7CisgICAgfQorCisgICAgQ0dJbWFnZVJlZiBzcmNJ
bWFnZSA9IGltZy0+Z2V0Q0dJbWFnZVJlZigpOworICAgIENHUmVjdCByZWN0OworICAgIHJlY3Qu
c2l6ZSA9IGltZy0+c2l6ZSgpOworICAgIHJlY3Qub3JpZ2luLnggPSAwOworICAgIHJlY3Qub3Jp
Z2luLnkgPSAtcmVjdC5zaXplLmhlaWdodDsKKyAgICBzdGF0aWMgY29uc3QgQ0dGbG9hdCB3aGl0
ZSBbXSA9IHsxLjAsIDEuMCwgMS4wLCAxLjB9OworICAgIENHQ29udGV4dFNjYWxlQ1RNKGRyYXdD
b250ZXh0LCAxLCAtMSk7CisgICAgQ0dDb250ZXh0U2V0RmlsbENvbG9yKGRyYXdDb250ZXh0LCB3
aGl0ZSk7CisgICAgQ0dDb250ZXh0RmlsbFJlY3QoZHJhd0NvbnRleHQsIHJlY3QpOworICAgIENH
Q29udGV4dFNldEJsZW5kTW9kZShkcmF3Q29udGV4dCwga0NHQmxlbmRNb2RlTm9ybWFsKTsKKyAg
ICBDR0NvbnRleHREcmF3SW1hZ2UoZHJhd0NvbnRleHQsIHJlY3QsIHNyY0ltYWdlKTsKKyAgICBD
R0NvbnRleHRSZWxlYXNlKGRyYXdDb250ZXh0KTsKKworZXhpdDoKKyAgICBpZiAod29ya2luZ0RD
KQorICAgICAgICBEZWxldGVEQyh3b3JraW5nREMpOworICAgIFJlbGVhc2VEQygwLCBkYyk7Cisg
ICAgcmV0dXJuIGhibXA7Cit9CisgICAgCitEcmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlSWNv
bkZvckNhY2hlZEltYWdlKENhY2hlZEltYWdlKikKK3sKKyAgICAvL0ZJWE1FOiBQcm92aWRlIGlj
b24gZm9yIGltYWdlIHR5cGUgPHJkYXI6Ly9wcm9ibGVtLzUwMTU5NDk+CisgICAgcmV0dXJuIDA7
ICAgICAKK30KKyAgICAKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNH
V2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFnSW1hZ2VDR1dp
bi5jcHAJKHJldmlzaW9uIDI5NzI2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdl
Q0dXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdo
dCAoQykgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0
IChDKSAyMDA3LCAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTM3LDIxICszNyw2IEBACiAKIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKIAotSW50U2l6ZSBkcmFnSW1hZ2VTaXplKERyYWdJbWFnZVJlZiBpbWFnZSkKLXsK
LSAgICBpZiAoIWltYWdlKQotICAgICAgICByZXR1cm4gSW50U2l6ZSgpOwotICAgIEJJVE1BUCBi
OwotICAgIEdldE9iamVjdChpbWFnZSwgc2l6ZW9mKEJJVE1BUCksICZiKTsKLSAgICByZXR1cm4g
SW50U2l6ZShiLmJtV2lkdGgsIGIuYm1IZWlnaHQpOwotfQotCi12b2lkIGRlbGV0ZURyYWdJbWFn
ZShEcmFnSW1hZ2VSZWYgaW1hZ2UpCi17Ci0gICAgaWYgKGltYWdlKQotICAgICAgICA6OkRlbGV0
ZU9iamVjdChpbWFnZSk7Ci19Ci0KIEhCSVRNQVAgYWxsb2NJbWFnZShIREMgZGMsIEludFNpemUg
c2l6ZSwgQ0dDb250ZXh0UmVmICp0YXJnZXRSZWYpCiB7CiAgICAgSEJJVE1BUCBoYm1wOwpAQCAt
MTA2LDcgKzkxLDcgQEAgRHJhZ0ltYWdlUmVmIHNjYWxlRHJhZ0ltYWdlKERyYWdJbWFnZVJlZgog
ICAgIENHQ29udGV4dFJlZiBzcmNDb250ZXh0OwogICAgIENHSW1hZ2VSZWYgc3JjSW1hZ2U7CiAg
ICAgSW50U2l6ZSBzcmNTaXplID0gZHJhZ0ltYWdlU2l6ZShpbWFnZSk7Ci0gICAgSW50U2l6ZSBk
c3RTaXplKChpbnQpKHNyY1NpemUud2lkdGgoKSAqIHNjYWxlLndpZHRoKCkpLCAoaW50KShzcmNT
aXplLmhlaWdodCgpICogc2NhbGUuaGVpZ2h0KCkpKTsKKyAgICBJbnRTaXplIGRzdFNpemUoc3Rh
dGljX2Nhc3Q8aW50PihzcmNTaXplLndpZHRoKCkgKiBzY2FsZS53aWR0aCgpKSwgc3RhdGljX2Nh
c3Q8aW50PihzcmNTaXplLmhlaWdodCgpICogc2NhbGUuaGVpZ2h0KCkpKTsKICAgICBIQklUTUFQ
IGhibXAgPSAwOwogICAgIEhEQyBkYyA9IEdldERDKDApOwogICAgIEhEQyBkc3REQyA9IENyZWF0
ZUNvbXBhdGlibGVEQyhkYyk7CkBAIC0xMzksMTQgKzEyNCw4IEBAIGV4aXQ6CiAgICAgcmV0dXJu
IGhibXA7CiB9CiAgICAgCi1EcmFnSW1hZ2VSZWYgZGlzc29sdmVEcmFnSW1hZ2VUb0ZyYWN0aW9u
KERyYWdJbWFnZVJlZiBpbWFnZSwgZmxvYXQpCi17Ci0gICAgLy9XZSBkb24ndCBkbyB0aGlzIG9u
IHdpbmRvd3MgYXMgdGhlIGRyYWdpbWFnZSBpcyBibGVuZGVkIGJ5IHRoZSBPUwotICAgIHJldHVy
biBpbWFnZTsKLX0KLSAgICAgICAgCiBEcmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlRnJvbUlt
YWdlKEltYWdlKiBpbWcpCi17ICAgIAorewogICAgIEhCSVRNQVAgaGJtcCA9IDA7CiAgICAgSERD
IGRjID0gR2V0REMoMCk7CiAgICAgSERDIHdvcmtpbmdEQyA9IENyZWF0ZUNvbXBhdGlibGVEQyhk
Yyk7CkBAIC0xODQsMTAgKzE2Myw0IEBAIGV4aXQ6CiAgICAgcmV0dXJuIGhibXA7CiB9CiAgICAg
Ci1EcmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlSWNvbkZvckNhY2hlZEltYWdlKENhY2hlZElt
YWdlKikKLXsKLSAgICAvL0ZJWE1FOiBQcm92aWRlIGljb24gZm9yIGltYWdlIHR5cGUgPHJkYXI6
Ly9wcm9ibGVtLzUwMTU5NDk+Ci0gICAgcmV0dXJuIDA7ICAgICAKLX0KLSAgICAKIH0KSW5kZXg6
IFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNhaXJvV2luLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFnSW1hZ2VDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDAp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFnSW1hZ2VDYWlyb1dpbi5jcHAJKHJldmlzaW9u
IDApCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQXBwbGUgSW5j
LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkRyYWdJbWFnZS5oIgorCisjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKKyNpbmNsdWRl
ICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbWFnZS5oIgorI2luY2x1ZGUgIk5vdElt
cGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUmV0YWluUHRyLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dz
Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworRHJhZ0ltYWdlUmVmIHNjYWxlRHJhZ0ltYWdl
KERyYWdJbWFnZVJlZiBpbWFnZSwgRmxvYXRTaXplIHNjYWxlKQoreworICAgIG5vdEltcGxlbWVu
dGVkKCk7CisKKyAgICByZXR1cm4gaW1hZ2U7Cit9CisgICAgCitEcmFnSW1hZ2VSZWYgY3JlYXRl
RHJhZ0ltYWdlRnJvbUltYWdlKEltYWdlKiBpbWcpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsK
KworICAgIERyYWdJbWFnZVJlZiB0ZW1wOworICAgIHJldHVybiB0ZW1wOworfQorICAgIAorfQpJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlV2luLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFnSW1hZ2VXaW4uY3BwCShyZXZpc2lvbiAyOTgzNCkK
KysrIFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZVdpbi5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlIEluYy4gIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggQXBwbGUgSW5j
LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpA
QCAtMzEsOCArMzEsNiBAQAogI2luY2x1ZGUgIkltYWdlLmgiCiAjaW5jbHVkZSAiUmV0YWluUHRy
LmgiCiAKLSNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ29yZUdyYXBoaWNzLmg+Ci0KICNpbmNsdWRl
IDx3aW5kb3dzLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKQEAgLTUyLDEzOCArNTAsMTIgQEAg
dm9pZCBkZWxldGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVmIGltYWdlKQogICAgICAgICA6OkRlbGV0
ZU9iamVjdChpbWFnZSk7CiB9CiAKLUhCSVRNQVAgYWxsb2NJbWFnZShIREMgZGMsIEludFNpemUg
c2l6ZSwgQ0dDb250ZXh0UmVmICp0YXJnZXRSZWYpCi17Ci0gICAgSEJJVE1BUCBoYm1wOwotICAg
IEJJVE1BUElORk8gYm1wSW5mbyA9IHswfTsKLSAgICBibXBJbmZvLmJtaUhlYWRlci5iaVNpemUg
PSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7Ci0gICAgYm1wSW5mby5ibWlIZWFkZXIuYmlXaWR0
aCA9IHNpemUud2lkdGgoKTsKLSAgICBibXBJbmZvLmJtaUhlYWRlci5iaUhlaWdodCA9IHNpemUu
aGVpZ2h0KCk7Ci0gICAgYm1wSW5mby5ibWlIZWFkZXIuYmlQbGFuZXMgPSAxOwotICAgIGJtcElu
Zm8uYm1pSGVhZGVyLmJpQml0Q291bnQgPSAzMjsKLSAgICBibXBJbmZvLmJtaUhlYWRlci5iaUNv
bXByZXNzaW9uID0gQklfUkdCOwotICAgIExQVk9JRCBiaXRzOwotICAgIGhibXAgPSBDcmVhdGVE
SUJTZWN0aW9uKGRjLCAmYm1wSW5mbywgRElCX1JHQl9DT0xPUlMsICZiaXRzLCAwLCAwKTsKLQot
ICAgIGlmICghdGFyZ2V0UmVmKQotICAgICAgICByZXR1cm4gaGJtcDsKLQotICAgIENHQ29sb3JT
cGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKLSAgICBD
R0NvbnRleHRSZWYgYml0bWFwQ29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZShiaXRzLCBi
bXBJbmZvLmJtaUhlYWRlci5iaVdpZHRoLCBibXBJbmZvLmJtaUhlYWRlci5iaUhlaWdodCwgOCwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBi
bXBJbmZvLmJtaUhlYWRlci5iaVdpZHRoICogNCwgZGV2aWNlUkdCLCAKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0dCaXRtYXBCeXRlT3Jk
ZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFOb25lU2tpcEZpcnN0KTsKLSAgICBDR0NvbG9yU3Bh
Y2VSZWxlYXNlKGRldmljZVJHQik7Ci0gICAgaWYgKCFiaXRtYXBDb250ZXh0KSB7Ci0gICAgICAg
IERlbGV0ZU9iamVjdChoYm1wKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgKnRh
cmdldFJlZiA9IGJpdG1hcENvbnRleHQ7Ci0gICAgcmV0dXJuIGhibXA7Ci19Ci0KLXN0YXRpYyBD
R0NvbnRleHRSZWYgY3JlYXRlQ2dDb250ZXh0RnJvbUJpdG1hcChIQklUTUFQIGJpdG1hcCkKLXsK
LSAgICBCSVRNQVAgaW5mbzsKLSAgICBHZXRPYmplY3QoYml0bWFwLCBzaXplb2YoaW5mbyksICZp
bmZvKTsKLSAgICBBU1NFUlQoaW5mby5ibUJpdHNQaXhlbCA9PSAzMik7Ci0KLSAgICBDR0NvbG9y
U3BhY2VSZWYgZGV2aWNlUkdCID0gQ0dDb2xvclNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7Ci0gICAg
Q0dDb250ZXh0UmVmIGJpdG1hcENvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUoaW5mby5i
bUJpdHMsIGluZm8uYm1XaWR0aCwgaW5mby5ibUhlaWdodCwgOCwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmJtV2lkdGhCeXRlcywg
ZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFOb25l
U2tpcEZpcnN0KTsKLSAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKGRldmljZVJHQik7Ci0gICAgcmV0
dXJuIGJpdG1hcENvbnRleHQ7Ci19Ci0KLURyYWdJbWFnZVJlZiBzY2FsZURyYWdJbWFnZShEcmFn
SW1hZ2VSZWYgaW1hZ2UsIEZsb2F0U2l6ZSBzY2FsZSkKLXsKLSAgICAvLyBGSVhNRTogZHVlIHRv
IHRoZSB3YXkgZHJhZyBpbWFnZXMgYXJlIGRvbmUgb24gd2luZG93cyB3ZSBuZWVkIAotICAgIC8v
IHRvIHByZXByb2Nlc3MgdGhlIGFscGhhIGNoYW5uZWwgPHJkYXI6Ly9wcm9ibGVtLzUwMTU5NDY+
Ci0KLSAgICBpZiAoIWltYWdlKQotICAgICAgICByZXR1cm4gMDsKLSAgICBDR0NvbnRleHRSZWYg
dGFyZ2V0Q29udGV4dDsKLSAgICBDR0NvbnRleHRSZWYgc3JjQ29udGV4dDsKLSAgICBDR0ltYWdl
UmVmIHNyY0ltYWdlOwotICAgIEludFNpemUgc3JjU2l6ZSA9IGRyYWdJbWFnZVNpemUoaW1hZ2Up
OwotICAgIEludFNpemUgZHN0U2l6ZSgoaW50KShzcmNTaXplLndpZHRoKCkgKiBzY2FsZS53aWR0
aCgpKSwgKGludCkoc3JjU2l6ZS5oZWlnaHQoKSAqIHNjYWxlLmhlaWdodCgpKSk7Ci0gICAgSEJJ
VE1BUCBoYm1wID0gMDsKLSAgICBIREMgZGMgPSBHZXREQygwKTsKLSAgICBIREMgZHN0REMgPSBD
cmVhdGVDb21wYXRpYmxlREMoZGMpOwotICAgIGlmICghZHN0REMpCi0gICAgICAgIGdvdG8gZXhp
dDsKLQotICAgIGhibXAgPSBhbGxvY0ltYWdlKGRzdERDLCBkc3RTaXplLCAmdGFyZ2V0Q29udGV4
dCk7Ci0gICAgaWYgKCFoYm1wKQotICAgICAgICBnb3RvIGV4aXQ7Ci0KLSAgICBzcmNDb250ZXh0
ID0gY3JlYXRlQ2dDb250ZXh0RnJvbUJpdG1hcChpbWFnZSk7Ci0gICAgc3JjSW1hZ2UgPSBDR0Jp
dG1hcENvbnRleHRDcmVhdGVJbWFnZShzcmNDb250ZXh0KTsKLSAgICBDR1JlY3QgcmVjdDsKLSAg
ICByZWN0Lm9yaWdpbi54ID0gMDsKLSAgICByZWN0Lm9yaWdpbi55ID0gMDsKLSAgICByZWN0LnNp
emUgPSBkc3RTaXplOwotICAgIENHQ29udGV4dERyYXdJbWFnZSh0YXJnZXRDb250ZXh0LCByZWN0
LCBzcmNJbWFnZSk7Ci0gICAgQ0dJbWFnZVJlbGVhc2Uoc3JjSW1hZ2UpOwotICAgIENHQ29udGV4
dFJlbGVhc2Uoc3JjQ29udGV4dCk7Ci0gICAgQ0dDb250ZXh0UmVsZWFzZSh0YXJnZXRDb250ZXh0
KTsKLSAgICA6OkRlbGV0ZU9iamVjdChpbWFnZSk7Ci0gICAgaW1hZ2UgPSAwOwotCi1leGl0Ogot
ICAgIGlmICghaGJtcCkKLSAgICAgICAgaGJtcCA9IGltYWdlOwotICAgIGlmIChkc3REQykKLSAg
ICAgICAgRGVsZXRlREMoZHN0REMpOwotICAgIFJlbGVhc2VEQygwLCBkYyk7Ci0gICAgcmV0dXJu
IGhibXA7Ci19Ci0gICAgCiBEcmFnSW1hZ2VSZWYgZGlzc29sdmVEcmFnSW1hZ2VUb0ZyYWN0aW9u
KERyYWdJbWFnZVJlZiBpbWFnZSwgZmxvYXQpCiB7CiAgICAgLy9XZSBkb24ndCBkbyB0aGlzIG9u
IHdpbmRvd3MgYXMgdGhlIGRyYWdpbWFnZSBpcyBibGVuZGVkIGJ5IHRoZSBPUwogICAgIHJldHVy
biBpbWFnZTsKIH0KICAgICAgICAgCi1EcmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlRnJvbUlt
YWdlKEltYWdlKiBpbWcpCi17ICAgIAotICAgIEhCSVRNQVAgaGJtcCA9IDA7Ci0gICAgSERDIGRj
ID0gR2V0REMoMCk7Ci0gICAgSERDIHdvcmtpbmdEQyA9IENyZWF0ZUNvbXBhdGlibGVEQyhkYyk7
Ci0gICAgQ0dDb250ZXh0UmVmIGRyYXdDb250ZXh0ID0gMDsKLSAgICBpZiAoIXdvcmtpbmdEQykK
LSAgICAgICAgZ290byBleGl0OwotCi0gICAgaGJtcCA9IGFsbG9jSW1hZ2Uod29ya2luZ0RDLCBp
bWctPnNpemUoKSwgJmRyYXdDb250ZXh0KTsKLQotICAgIGlmICghaGJtcCkKLSAgICAgICAgZ290
byBleGl0OwotCi0gICAgaWYgKCFkcmF3Q29udGV4dCkgewotICAgICAgICA6OkRlbGV0ZU9iamVj
dChoYm1wKTsKLSAgICAgICAgaGJtcCA9IDA7Ci0gICAgfQotCi0gICAgQ0dJbWFnZVJlZiBzcmNJ
bWFnZSA9IGltZy0+Z2V0Q0dJbWFnZVJlZigpOwotICAgIENHUmVjdCByZWN0OwotICAgIHJlY3Qu
c2l6ZSA9IGltZy0+c2l6ZSgpOwotICAgIHJlY3Qub3JpZ2luLnggPSAwOwotICAgIHJlY3Qub3Jp
Z2luLnkgPSAtcmVjdC5zaXplLmhlaWdodDsKLSAgICBzdGF0aWMgY29uc3QgQ0dGbG9hdCB3aGl0
ZSBbXSA9IHsxLjAsIDEuMCwgMS4wLCAxLjB9OwotICAgIENHQ29udGV4dFNjYWxlQ1RNKGRyYXdD
b250ZXh0LCAxLCAtMSk7Ci0gICAgQ0dDb250ZXh0U2V0RmlsbENvbG9yKGRyYXdDb250ZXh0LCB3
aGl0ZSk7Ci0gICAgQ0dDb250ZXh0RmlsbFJlY3QoZHJhd0NvbnRleHQsIHJlY3QpOwotICAgIENH
Q29udGV4dFNldEJsZW5kTW9kZShkcmF3Q29udGV4dCwga0NHQmxlbmRNb2RlTm9ybWFsKTsKLSAg
ICBDR0NvbnRleHREcmF3SW1hZ2UoZHJhd0NvbnRleHQsIHJlY3QsIHNyY0ltYWdlKTsKLSAgICBD
R0NvbnRleHRSZWxlYXNlKGRyYXdDb250ZXh0KTsKLQotZXhpdDoKLSAgICBpZiAod29ya2luZ0RD
KQotICAgICAgICBEZWxldGVEQyh3b3JraW5nREMpOwotICAgIFJlbGVhc2VEQygwLCBkYyk7Ci0g
ICAgcmV0dXJuIGhibXA7Ci19Ci0gICAgCiBEcmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlSWNv
bkZvckNhY2hlZEltYWdlKENhY2hlZEltYWdlKikKIHsKICAgICAvL0ZJWE1FOiBQcm92aWRlIGlj
b24gZm9yIGltYWdlIHR5cGUgPHJkYXI6Ly9wcm9ibGVtLzUwMTU5NDk+Cg==
</data>
<flag name="review"
          id="8219"
          type_id="1"
          status="-"
          setter="aroben"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>18835</attachid>
            <date>2008-01-31 16:25:51 -0800</date>
            <delta_ts>2008-02-04 12:25:27 -0800</delta_ts>
            <desc>Eighth revision based on Adam&apos;s comments.</desc>
            <filename>webcore_win32.patch</filename>
            <type>text/plain</type>
            <size>210084</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyOTg0NykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNzYgQEAKKzIwMDgtMDEtMjkgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBnbWFp
bC5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
Rmlyc3Qgc3RlcCB0b3dhcmRzIHJlZW5hYmxpbmcgQ2Fpcm8gc3VwcG9ydCB1bmRlciBXaW5kb3dz
LgorICAgICAgICAtIGFkZHMgdmFyaW91cyBQTEFURk9STSBndWFyZHMgdG8gY29kZSB0aGF0IHdp
bGwgbm90IGJ1aWxkCisgICAgICAgICAgdW5kZXIgQ2Fpcm8uCisgICAgICAgIC0gYnJlYWtzIHNv
bWUgZmlsZXMgaW50byBDRyBhbmQgQ2Fpcm8tc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zLgorICAg
ICAgICAtIHByb3ZpZGVzIHNvbWUgd2luMzIvQ2Fpcm8gc3VwcG9ydCAoYnV0IGJ5IG5vIG1lYW5z
IGEgY29tcGxldGUKKyAgICAgICAgICBwb3J0IC0tIHlldCkuCisKKyAgICAgICAgV0FSTklORzog
Tk8gVEVTVCBDQVNFUyBBRERFRCBPUiBDSEFOR0VECisKKyAgICAgICAgKiBXZWJDb3JlLnZjcHJv
ai9XZWJDb3JlLnZjcHJvajoKKyAgICAgICAgKiBicmlkZ2Uvd2luL0ZyYW1lQ0dXaW4uY3BwOiBD
b3BpZWQgZnJvbSBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVXaW4uY3BwLgorICAgICAgICAoV2Vi
Q29yZTo6aW1hZ2VGcm9tU2VsZWN0aW9uKToKKyAgICAgICAgKiBicmlkZ2Uvd2luL0ZyYW1lQ2Fp
cm9XaW4uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OmltYWdlRnJvbVNlbGVjdGlvbik6
CisgICAgICAgICogYnJpZGdlL3dpbi9GcmFtZVdpbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpj
b21wdXRlUGFnZVJlY3RzRm9yRnJhbWUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL1Np
bXBsZUZvbnREYXRhLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhp
Y3NDb250ZXh0Q2Fpcm8uY3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZS5oOiBDb3BpZWQgZnJvbSBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4dENhaXJvLmNwcC4KKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENHV2luLmNwcDogQ29waWVkIGZyb20gV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udFdpbi5jcHAuCisgICAgICAgIChXZWJDb3JlOjpGb250
OjpkcmF3R2x5cGhzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENhaXJv
V2luLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpGb250OjpkcmF3R2x5cGhzKToKKyAg
ICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udFdpbi5jcHA6CisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENHV2luLmNwcDogQ29waWVkIGZyb20g
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0V2luLmNwcC4KKyAg
ICAgICAgKFdlYkNvcmU6OkNHQ29udGV4dFdpdGhIREMpOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0OjpnZXRXaW5kb3dzQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQ6OnJlbGVhc2VXaW5kb3dzQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNvbmNhdENUTSk6CisgICAgICAgIChXZWJD
b3JlOjpzZXRDR1N0cm9rZUNvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dDo6ZHJhd0xpbmVGb3JNaXNzcGVsbGluZ09yQmFkR3JhbW1hcik6CisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENhaXJvV2luLmNwcDogQWRkZWQuCisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dCk6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmdldFdpbmRvd3NDb250ZXh0KToKKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6aW5UcmFuc3BhcmVuY3lMYXllcik6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnJlbGVhc2VXaW5kb3dzQ29udGV4dCk6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNvbmNhdENUTSk6
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1c1JpbmcpOgorICAg
ICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvck1pc3NwZWxsaW5nT3JC
YWRHcmFtbWFyKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250
ZXh0V2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZTo6c2NhbGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlOjpyb3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0UGxhdGZv
cm1Qcml2YXRlOjp0cmFuc2xhdGUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9J
bWFnZUNHV2luLmNwcDogQ29waWVkIGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4v
SW1hZ2VXaW4uY3BwLgorICAgICAgICAoV2ViQ29yZTo6Qml0bWFwSW1hZ2U6OmdldEhCSVRNQVBP
ZlNpemUpOgorICAgICAgICAoV2ViQ29yZTo6Qml0bWFwSW1hZ2U6OmRyYXdGcmFtZU1hdGNoaW5n
U291cmNlU2l6ZSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ2Fpcm9X
aW4uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdlOjpnZXRIQklUTUFQ
T2ZTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdlOjpkcmF3RnJhbWVNYXRjaGlu
Z1NvdXJjZVNpemUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZVdpbi5j
cHA6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ0dXaW4u
Y3BwOiBDb3BpZWQgZnJvbSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250
RGF0YVdpbi5jcHAuCisgICAgICAgIChXZWJDb3JlOjpzY2FsZUVtVG9Vbml0cyk6CisgICAgICAg
IChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KToKKyAgICAgICAgKFdlYkNv
cmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybVdpZHRoRm9yR2x5cGgpOgorICAgICAgICAqIHBs
YXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNhaXJvV2luLmNwcDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KToKKyAgICAgICAg
KFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3kpOgorICAgICAgICAoV2Vi
Q29yZTo6U2ltcGxlRm9udERhdGE6OnBsYXRmb3JtV2lkdGhGb3JHbHlwaCk6CisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhV2luLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OlNpbXBsZUZvbnREYXRhOjpzZXRTaG91bGRBcHBseU1hY0FzY2VudEhhY2spOgorICAg
ICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnNob3VsZEFwcGx5TWFjQXNjZW50SGFjayk6
CisgICAgICAgICogcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNHV2luLmNwcDogQ29waWVkIGZyb20g
V2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlV2luLmNwcC4KKyAgICAgICAgKFdlYkNvcmU6
OnNjYWxlRHJhZ0ltYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OmNyZWF0ZURyYWdJbWFnZUZyb21J
bWFnZSk6CisgICAgICAgICogcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNhaXJvV2luLmNwcDogQWRk
ZWQuCisgICAgICAgIChXZWJDb3JlOjpzY2FsZURyYWdJbWFnZSk6CisgICAgICAgIChXZWJDb3Jl
OjpjcmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2UpOgorICAgICAgICAqIHBsYXRmb3JtL3dpbi9EcmFn
SW1hZ2VXaW4uY3BwOgorCiAyMDA4LTAxLTI5ICBBZGFtIFJvYmVuICA8YXJvYmVuQGFwcGxlLmNv
bT4KIAogICAgICAgICBGaXggPHJkYXI6Ly81NzExMTM2PiBGdWxsLXNjcmVlbiBGbGFzaCBvbiAx
dXAuY29tIGlzIHVucmVzcG9uc2l2ZQpJbmRleDogV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJD
b3JlLnZjcHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUu
dmNwcm9qCShyZXZpc2lvbiAyOTg4NCkKKysrIFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29y
ZS52Y3Byb2oJKHdvcmtpbmcgY29weSkKQEAgLTM0MjIsNiArMzQyMiwxMCBAQAogCQkJCQk+DQog
CQkJCTwvRmlsZT4NCiAJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1c
d2luXERyYWdJbWFnZUNHV2luLmNwcCINCisJCQkJCT4NCisJCQkJPC9GaWxlPg0KKwkJCQk8Rmls
ZQ0KIAkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVx3aW5cRWRpdG9yV2luLmNwcCINCiAJ
CQkJCT4NCiAJCQkJPC9GaWxlPg0KQEAgLTM3NTcsNiArMzc2MSwxMCBAQAogCQkJCQk+DQogCQkJ
CTwvRmlsZT4NCiAJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cZ3Jh
cGhpY3NcY2dcR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmgiDQorCQkJCQk+DQorCQkJ
CTwvRmlsZT4NCisJCQkJPEZpbGUNCiAJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cZ3Jh
cGhpY3NcR3JhcGhpY3NDb250ZXh0LmNwcCINCiAJCQkJCT4NCiAJCQkJPC9GaWxlPg0KQEAgLTM4
NzYsNiArMzg4NCwxMCBAQAogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KIAkJCQkJPEZpbGUNCisJ
CQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxGb250Q0dXaW4uY3Bw
Ig0KKwkJCQkJCT4NCisJCQkJCTwvRmlsZT4NCisJCQkJCTxGaWxlDQogCQkJCQkJUmVsYXRpdmVQ
YXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1x3aW5cRm9udEN1c3RvbVBsYXRmb3JtRGF0YS5jcHAi
DQogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KQEAgLTM5MzIsNiArMzk0NCwxMCBAQAogCQkJCQkJ
Pg0KIAkJCQkJPC9GaWxlPg0KIAkJCQkJPEZpbGUNCisJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBs
YXRmb3JtXGdyYXBoaWNzXHdpblxHcmFwaGljc0NvbnRleHRDR1dpbi5jcHAiDQorCQkJCQkJPg0K
KwkJCQkJPC9GaWxlPg0KKwkJCQkJPEZpbGUNCiAJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRm
b3JtXGdyYXBoaWNzXHdpblxHcmFwaGljc0NvbnRleHRXaW4uY3BwIg0KIAkJCQkJCT4NCiAJCQkJ
CTwvRmlsZT4NCkBAIC0zOTQwLDYgKzM5NTYsMTAgQEAKIAkJCQkJCT4NCiAJCQkJCTwvRmlsZT4N
CiAJCQkJCTxGaWxlDQorCQkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1x3
aW5cSW1hZ2VDR1dpbi5jcHAiDQorCQkJCQkJPg0KKwkJCQkJPC9GaWxlPg0KKwkJCQkJPEZpbGUN
CiAJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxJbWFnZVdpbi5j
cHAiDQogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KQEAgLTM5NjQsNiArMzk4NCwxMCBAQAogCQkJ
CQkJPg0KIAkJCQkJPC9GaWxlPg0KIAkJCQkJPEZpbGUNCisJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4u
XHBsYXRmb3JtXGdyYXBoaWNzXHdpblxTaW1wbGVGb250RGF0YUNHV2luLmNwcCINCisJCQkJCQk+
DQorCQkJCQk8L0ZpbGU+DQorCQkJCQk8RmlsZQ0KIAkJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxh
dGZvcm1cZ3JhcGhpY3Ncd2luXFNpbXBsZUZvbnREYXRhV2luLmNwcCINCiAJCQkJCQk+DQogCQkJ
CQk8L0ZpbGU+DQpAQCAtNjQwOCw2ICs2NDMyLDEwIEBACiAJCQkJTmFtZT0id2luIg0KIAkJCQk+
DQogCQkJCTxGaWxlDQorCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGJyaWRnZVx3aW5cRnJhbWVDR1dp
bi5jcHAiDQorCQkJCQk+DQorCQkJCTwvRmlsZT4NCisJCQkJPEZpbGUNCiAJCQkJCVJlbGF0aXZl
UGF0aD0iLi5cYnJpZGdlXHdpblxGcmFtZVdpbi5jcHAiDQogCQkJCQk+DQogCQkJCTwvRmlsZT4N
CkluZGV4OiBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVDR1dpbi5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lQ0dXaW4uY3BwCShyZXZpc2lvbiAyOTgzNCkJKGZyb20g
V2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lV2luLmNwcDoyOTgzNCkKKysrIFdlYkNvcmUvYnJpZGdl
L3dpbi9GcmFtZUNHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE5NyBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBD
T01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENP
TVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJGcmFtZVdpbi5oIgor
CisjaW5jbHVkZSA8d2luc29jazIuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRl
ICJBZmZpbmVUcmFuc2Zvcm0uaCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJE
b2N1bWVudC5oIgorI2luY2x1ZGUgIkVkaXRvckNsaWVudC5oIgorI2luY2x1ZGUgIkZyYW1lTG9h
ZGVyLmgiCisjaW5jbHVkZSAiRnJhbWVMb2FkUmVxdWVzdC5oIgorI2luY2x1ZGUgIkZyYW1lUHJp
dmF0ZS5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhUTUxJRnJhbWVFbGVt
ZW50LmgiCisjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCisjaW5jbHVkZSAiSFRNTFRhYmxlQ2VsbEVs
ZW1lbnQuaCIKKyNpbmNsdWRlICJLZXlib2FyZEV2ZW50LmgiCisjaW5jbHVkZSAiTlBfanNvYmpl
Y3QuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNp
bmNsdWRlICJQbHVnaW4uaCIKKyNpbmNsdWRlICJQbHVnaW5EYXRhYmFzZVdpbi5oIgorI2luY2x1
ZGUgIlBsdWdpblZpZXdXaW4uaCIKKyNpbmNsdWRlICJSZWd1bGFyRXhwcmVzc2lvbi5oIgorI2lu
Y2x1ZGUgIlJlbmRlckZyYW1lLmgiCisjaW5jbHVkZSAiUmVuZGVyVGFibGVDZWxsLmgiCisjaW5j
bHVkZSAiUmVuZGVyVmlldy5oIgorI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlLmgiCisjaW5jbHVk
ZSAiVGV4dFJlc291cmNlRGVjb2Rlci5oIgorI2luY2x1ZGUgImtqc19wcm94eS5oIgorI2luY2x1
ZGUgImtqc193aW5kb3cuaCIKKyNpbmNsdWRlICJucHJ1bnRpbWVfaW1wbC5oIgorI2luY2x1ZGUg
InJ1bnRpbWVfcm9vdC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUg
IlNldHRpbmdzLmgiCisKKyNpZiBQTEFURk9STShDRykKKyNpbmNsdWRlIDxDb3JlR3JhcGhpY3Mv
Q29yZUdyYXBoaWNzLmg+CisjZW5kaWYKKwordXNpbmcgc3RkOjptaW47Cit1c2luZyBuYW1lc3Bh
Y2UgS0pTOjpCaW5kaW5nczsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit1c2luZyBuYW1lc3Bh
Y2UgSFRNTE5hbWVzOworCit2b2lkIEZyYW1lOjpjbGVhclBsYXRmb3JtU2NyaXB0T2JqZWN0cygp
Cit7Cit9CisKK0tKUzo6QmluZGluZ3M6Okluc3RhbmNlKiBGcmFtZTo6Y3JlYXRlU2NyaXB0SW5z
dGFuY2VGb3JXaWRnZXQoV2lkZ2V0KiB3aWRnZXQpCit7CisgICAgLy8gRklYTUU6IElkZWFsbHkg
d2UnZCBoYXZlIGFuIGlzUGx1Z2luVmlldygpIGhlcmUgYnV0IHdlIGNhbid0IGFkZCB0aGF0IHRv
IHRoZSBvcGVuIHNvdXJjZSB0cmVlIHJpZ2h0IG5vdy4KKyAgICBpZiAod2lkZ2V0LT5pc0ZyYW1l
VmlldygpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQbHVn
aW5WaWV3V2luKj4od2lkZ2V0KS0+YmluZGluZ0luc3RhbmNlKCk7Cit9CisKKwordm9pZCBjb21w
dXRlUGFnZVJlY3RzRm9yRnJhbWUoRnJhbWUqIGZyYW1lLCBjb25zdCBJbnRSZWN0JiBwcmludFJl
Y3QsIGZsb2F0IGhlYWRlckhlaWdodCwgZmxvYXQgZm9vdGVySGVpZ2h0LCBmbG9hdCB1c2VyU2Nh
bGVGYWN0b3IsVmVjdG9yPEludFJlY3Q+JiBwYWdlcywgaW50JiBvdXRQYWdlSGVpZ2h0KQorewor
ICAgIEFTU0VSVChmcmFtZSk7CisKKyAgICBwYWdlcy5jbGVhcigpOworICAgIG91dFBhZ2VIZWln
aHQgPSAwOworCisgICAgaWYgKCFmcmFtZS0+ZG9jdW1lbnQoKSB8fCAhZnJhbWUtPnZpZXcoKSB8
fCAhZnJhbWUtPmRvY3VtZW50KCktPnJlbmRlcmVyKCkpCisgICAgICAgIHJldHVybjsKKyAKKyAg
ICBSZW5kZXJWaWV3KiByb290ID0gc3RhdGljX2Nhc3Q8UmVuZGVyVmlldyAqPihmcmFtZS0+ZG9j
dW1lbnQoKS0+cmVuZGVyZXIoKSk7CisKKyAgICBpZiAoIXJvb3QpIHsKKyAgICAgICAgTE9HX0VS
Uk9SKCJkb2N1bWVudCB0byBiZSBwcmludGVkIGhhcyBubyByZW5kZXJlciIpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgaWYgKHVzZXJTY2FsZUZhY3RvciA8PSAwKSB7CisgICAgICAg
IExPR19FUlJPUigidXNlclNjYWxlRmFjdG9yIGhhcyBiYWQgdmFsdWUgJS4yZiIsIHVzZXJTY2Fs
ZUZhY3Rvcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgZmxvYXQgcmF0aW8g
PSAoZmxvYXQpcHJpbnRSZWN0LmhlaWdodCgpIC8gKGZsb2F0KXByaW50UmVjdC53aWR0aCgpOwor
IAorICAgIGZsb2F0IHBhZ2VXaWR0aCAgPSAoZmxvYXQpIHJvb3QtPmRvY1dpZHRoKCk7CisgICAg
ZmxvYXQgcGFnZUhlaWdodCA9IHBhZ2VXaWR0aCAqIHJhdGlvOworICAgIG91dFBhZ2VIZWlnaHQg
PSAoaW50KSBwYWdlSGVpZ2h0OyAgIC8vIHRoaXMgaXMgdGhlIGhlaWdodCBvZiB0aGUgcGFnZSBh
ZGp1c3RlZCBieSBtYXJnaW5zCisgICAgcGFnZUhlaWdodCAtPSAoaGVhZGVySGVpZ2h0ICsgZm9v
dGVySGVpZ2h0KTsKKworICAgIGlmIChwYWdlSGVpZ2h0IDw9IDApIHsKKyAgICAgICAgTE9HX0VS
Uk9SKCJwYWdlSGVpZ2h0IGhhcyBiYWQgdmFsdWUgJS4yZiIsIHBhZ2VIZWlnaHQpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgZmxvYXQgY3VyclBhZ2VIZWlnaHQgPSBwYWdlSGVpZ2h0
IC8gdXNlclNjYWxlRmFjdG9yOworICAgIGZsb2F0IGRvY0hlaWdodCAgICAgID0gcm9vdC0+bGF5
ZXIoKS0+aGVpZ2h0KCk7CisgICAgZmxvYXQgZG9jV2lkdGggICAgICAgPSByb290LT5sYXllcigp
LT53aWR0aCgpOworICAgIGZsb2F0IGN1cnJQYWdlV2lkdGggID0gcGFnZVdpZHRoIC8gdXNlclNj
YWxlRmFjdG9yOworCisgICAgCisgICAgLy8gYWx3YXlzIHJldHVybiBhdCBsZWFzdCBvbmUgcGFn
ZSwgc2luY2UgZW1wdHkgZmlsZXMgc2hvdWxkIHByaW50IGEgYmxhbmsgcGFnZQorICAgIGZsb2F0
IHByaW50ZWRQYWdlc0hlaWdodCA9IDAuMDsKKyAgICBkbyB7CisgICAgICAgIGZsb2F0IHByb3Bv
c2VkQm90dG9tID0gbWluKGRvY0hlaWdodCwgcHJpbnRlZFBhZ2VzSGVpZ2h0ICsgcGFnZUhlaWdo
dCk7CisgICAgICAgIGZyYW1lLT5hZGp1c3RQYWdlSGVpZ2h0KCZwcm9wb3NlZEJvdHRvbSwgcHJp
bnRlZFBhZ2VzSGVpZ2h0LCBwcm9wb3NlZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0KTsKKyAg
ICAgICAgY3VyclBhZ2VIZWlnaHQgPSBtYXgoMS4wZiwgcHJvcG9zZWRCb3R0b20gLSBwcmludGVk
UGFnZXNIZWlnaHQpOworICAgICAgIAorICAgICAgICBwYWdlcy5hcHBlbmQoSW50UmVjdCgwLHBy
aW50ZWRQYWdlc0hlaWdodCxjdXJyUGFnZVdpZHRoLGN1cnJQYWdlSGVpZ2h0KSk7CisgICAgICAg
IHByaW50ZWRQYWdlc0hlaWdodCArPSBjdXJyUGFnZUhlaWdodDsKKyAgICB9IHdoaWxlIChwcmlu
dGVkUGFnZXNIZWlnaHQgPCBkb2NIZWlnaHQpOworfQorCitzdGF0aWMgdm9pZCBkcmF3UmVjdElu
dG9Db250ZXh0KEludFJlY3QgcmVjdCwgRnJhbWVWaWV3KiB2aWV3LCBHcmFwaGljc0NvbnRleHQq
IGdjKQoreworICAgIEludFNpemUgb2Zmc2V0ID0gdmlldy0+c2Nyb2xsT2Zmc2V0KCk7CisgICAg
cmVjdC5tb3ZlKC1vZmZzZXQud2lkdGgoKSwgLW9mZnNldC5oZWlnaHQoKSk7CisgICAgcmVjdCA9
IHZpZXctPmNvbnZlcnRUb0NvbnRhaW5pbmdXaW5kb3cocmVjdCk7CisKKyAgICBnYy0+Y29uY2F0
Q1RNKEFmZmluZVRyYW5zZm9ybSgpLnRyYW5zbGF0ZSgtcmVjdC54KCksIC1yZWN0LnkoKSkpOwor
CisgICAgdmlldy0+cGFpbnQoZ2MsIHJlY3QpOworfQorCitIQklUTUFQIGltYWdlRnJvbVNlbGVj
dGlvbihGcmFtZSogZnJhbWUsIGJvb2wgZm9yY2VCbGFja1RleHQpCit7CisgICAgZnJhbWUtPnNl
dFBhaW50UmVzdHJpY3Rpb24oZm9yY2VCbGFja1RleHQgPyBQYWludFJlc3RyaWN0aW9uU2VsZWN0
aW9uT25seUJsYWNrVGV4dCA6IFBhaW50UmVzdHJpY3Rpb25TZWxlY3Rpb25Pbmx5KTsKKyAgICBG
bG9hdFJlY3QgZnIgPSBmcmFtZS0+c2VsZWN0aW9uUmVjdCgpOworICAgIEludFJlY3QgaXIoKGlu
dClmci54KCksIChpbnQpZnIueSgpLChpbnQpZnIud2lkdGgoKSwoaW50KWZyLmhlaWdodCgpKTsK
KworICAgIHZvaWQqIGJpdHM7CisgICAgSERDIGhkYyA9IENyZWF0ZUNvbXBhdGlibGVEQygwKTsK
KyAgICBpbnQgdyA9IGlyLndpZHRoKCk7CisgICAgaW50IGggPSBpci5oZWlnaHQoKTsKKyAgICBC
SVRNQVBJTkZPIGJtcCA9IHsgeyBzaXplb2YoQklUTUFQSU5GT0hFQURFUiksIHcsIGgsIDEsIDMy
IH0gfTsKKworICAgIEhCSVRNQVAgaGJtcCA9IENyZWF0ZURJQlNlY3Rpb24oMCwgJmJtcCwgRElC
X1JHQl9DT0xPUlMsICh2b2lkKiopJmJpdHMsIDAsIDApOworICAgIEhCSVRNQVAgaGJtcE9sZCA9
IChIQklUTUFQKVNlbGVjdE9iamVjdChoZGMsIGhibXApOworICAgIENHQ29sb3JTcGFjZVJlZiBk
ZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKKyAgICBDR0NvbnRleHRS
ZWYgY29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZSgodm9pZCopYml0cywgdywgaCwKKyAg
ICAgICAgOCwgdyAqIHNpemVvZihSR0JRVUFEKSwgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3Jk
ZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFQcmVtdWx0aXBsaWVkRmlyc3QpOworICAgIENHQ29s
b3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKKyAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNvbnRl
eHQpOworCisgICAgR3JhcGhpY3NDb250ZXh0IGdjKGNvbnRleHQpOworCisgICAgZnJhbWUtPmRv
Y3VtZW50KCktPnVwZGF0ZUxheW91dCgpOworICAgIGRyYXdSZWN0SW50b0NvbnRleHQoaXIsIGZy
YW1lLT52aWV3KCksICZnYyk7CisKKyAgICBDR0NvbnRleHRSZWxlYXNlKGNvbnRleHQpOworICAg
IFNlbGVjdE9iamVjdChoZGMsIGhibXBPbGQpOworICAgIERlbGV0ZURDKGhkYyk7CisKKyAgICBm
cmFtZS0+c2V0UGFpbnRSZXN0cmljdGlvbihQYWludFJlc3RyaWN0aW9uTm9uZSk7CisKKyAgICBy
ZXR1cm4gaGJtcDsKK30KKworRHJhZ0ltYWdlUmVmIEZyYW1lOjpkcmFnSW1hZ2VGb3JTZWxlY3Rp
b24oKQoreyAgICAKKyAgICBpZiAoc2VsZWN0aW9uQ29udHJvbGxlcigpLT5pc1JhbmdlKCkpCisg
ICAgICAgIHJldHVybiBpbWFnZUZyb21TZWxlY3Rpb24odGhpcywgZmFsc2UpOworCisgICAgcmV0
dXJuIDA7Cit9CisKK3ZvaWQgRnJhbWU6OmRhc2hib2FyZFJlZ2lvbnNDaGFuZ2VkKCkKK3sKK30K
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1l
Q0dXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZUNHV2luLmNw
cAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVDR1dpbi5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2
LCAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykg
MjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI2LDExNyArMjYsMTggQEAKICNpbmNsdWRlICJj
b25maWcuaCIKICNpbmNsdWRlICJGcmFtZVdpbi5oIgogCi0jaW5jbHVkZSA8d2luc29jazIuaD4K
ICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAKLSNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKLSNp
bmNsdWRlICJGbG9hdFJlY3QuaCIKLSNpbmNsdWRlICJEb2N1bWVudC5oIgotI2luY2x1ZGUgIkVk
aXRvckNsaWVudC5oIgotI2luY2x1ZGUgIkZyYW1lTG9hZGVyLmgiCi0jaW5jbHVkZSAiRnJhbWVM
b2FkUmVxdWVzdC5oIgotI2luY2x1ZGUgIkZyYW1lUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkZyYW1l
Vmlldy5oIgotI2luY2x1ZGUgIkhUTUxJRnJhbWVFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTE5h
bWVzLmgiCi0jaW5jbHVkZSAiSFRNTFRhYmxlQ2VsbEVsZW1lbnQuaCIKLSNpbmNsdWRlICJLZXli
b2FyZEV2ZW50LmgiCi0jaW5jbHVkZSAiTlBfanNvYmplY3QuaCIKLSNpbmNsdWRlICJOb3RJbXBs
ZW1lbnRlZC5oIgotI2luY2x1ZGUgIlBhZ2UuaCIKLSNpbmNsdWRlICJQbHVnaW4uaCIKLSNpbmNs
dWRlICJQbHVnaW5EYXRhYmFzZVdpbi5oIgotI2luY2x1ZGUgIlBsdWdpblZpZXdXaW4uaCIKLSNp
bmNsdWRlICJSZWd1bGFyRXhwcmVzc2lvbi5oIgotI2luY2x1ZGUgIlJlbmRlckZyYW1lLmgiCi0j
aW5jbHVkZSAiUmVuZGVyVGFibGVDZWxsLmgiCi0jaW5jbHVkZSAiUmVuZGVyVmlldy5oIgotI2lu
Y2x1ZGUgIlJlc291cmNlSGFuZGxlLmgiCi0jaW5jbHVkZSAiVGV4dFJlc291cmNlRGVjb2Rlci5o
IgotI2luY2x1ZGUgImtqc19wcm94eS5oIgotI2luY2x1ZGUgImtqc193aW5kb3cuaCIKLSNpbmNs
dWRlICJucHJ1bnRpbWVfaW1wbC5oIgotI2luY2x1ZGUgInJ1bnRpbWVfcm9vdC5oIgogI2luY2x1
ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2luY2x1ZGUgIlNldHRpbmdzLmgiCiAKLSNpZiBQTEFU
Rk9STShDRykKICNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ29yZUdyYXBoaWNzLmg+Ci0jZW5kaWYK
IAogdXNpbmcgc3RkOjptaW47Ci11c2luZyBuYW1lc3BhY2UgS0pTOjpCaW5kaW5nczsKIAogbmFt
ZXNwYWNlIFdlYkNvcmUgewogCi11c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwotCi12b2lkIEZy
YW1lOjpjbGVhclBsYXRmb3JtU2NyaXB0T2JqZWN0cygpCi17Ci19Ci0KLUtKUzo6QmluZGluZ3M6
Okluc3RhbmNlKiBGcmFtZTo6Y3JlYXRlU2NyaXB0SW5zdGFuY2VGb3JXaWRnZXQoV2lkZ2V0KiB3
aWRnZXQpCi17Ci0gICAgLy8gRklYTUU6IElkZWFsbHkgd2UnZCBoYXZlIGFuIGlzUGx1Z2luVmll
dygpIGhlcmUgYnV0IHdlIGNhbid0IGFkZCB0aGF0IHRvIHRoZSBvcGVuIHNvdXJjZSB0cmVlIHJp
Z2h0IG5vdy4KLSAgICBpZiAod2lkZ2V0LT5pc0ZyYW1lVmlldygpKQotICAgICAgICByZXR1cm4g
MDsKLQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQbHVnaW5WaWV3V2luKj4od2lkZ2V0KS0+Ymlu
ZGluZ0luc3RhbmNlKCk7Ci19Ci0KLQotdm9pZCBjb21wdXRlUGFnZVJlY3RzRm9yRnJhbWUoRnJh
bWUqIGZyYW1lLCBjb25zdCBJbnRSZWN0JiBwcmludFJlY3QsIGZsb2F0IGhlYWRlckhlaWdodCwg
ZmxvYXQgZm9vdGVySGVpZ2h0LCBmbG9hdCB1c2VyU2NhbGVGYWN0b3IsVmVjdG9yPEludFJlY3Q+
JiBwYWdlcywgaW50JiBvdXRQYWdlSGVpZ2h0KQotewotICAgIEFTU0VSVChmcmFtZSk7Ci0KLSAg
ICBwYWdlcy5jbGVhcigpOwotICAgIG91dFBhZ2VIZWlnaHQgPSAwOwotCi0gICAgaWYgKCFmcmFt
ZS0+ZG9jdW1lbnQoKSB8fCAhZnJhbWUtPnZpZXcoKSB8fCAhZnJhbWUtPmRvY3VtZW50KCktPnJl
bmRlcmVyKCkpCi0gICAgICAgIHJldHVybjsKLSAKLSAgICBSZW5kZXJWaWV3KiByb290ID0gc3Rh
dGljX2Nhc3Q8UmVuZGVyVmlldyAqPihmcmFtZS0+ZG9jdW1lbnQoKS0+cmVuZGVyZXIoKSk7Ci0K
LSAgICBpZiAoIXJvb3QpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJkb2N1bWVudCB0byBiZSBwcmlu
dGVkIGhhcyBubyByZW5kZXJlciIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYg
KHVzZXJTY2FsZUZhY3RvciA8PSAwKSB7Ci0gICAgICAgIExPR19FUlJPUigidXNlclNjYWxlRmFj
dG9yIGhhcyBiYWQgdmFsdWUgJS4yZiIsIHVzZXJTY2FsZUZhY3Rvcik7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0gICAgCi0gICAgZmxvYXQgcmF0aW8gPSAoZmxvYXQpcHJpbnRSZWN0LmhlaWdo
dCgpIC8gKGZsb2F0KXByaW50UmVjdC53aWR0aCgpOwotIAotICAgIGZsb2F0IHBhZ2VXaWR0aCAg
PSAoZmxvYXQpIHJvb3QtPmRvY1dpZHRoKCk7Ci0gICAgZmxvYXQgcGFnZUhlaWdodCA9IHBhZ2VX
aWR0aCAqIHJhdGlvOwotICAgIG91dFBhZ2VIZWlnaHQgPSAoaW50KSBwYWdlSGVpZ2h0OyAgIC8v
IHRoaXMgaXMgdGhlIGhlaWdodCBvZiB0aGUgcGFnZSBhZGp1c3RlZCBieSBtYXJnaW5zCi0gICAg
cGFnZUhlaWdodCAtPSAoaGVhZGVySGVpZ2h0ICsgZm9vdGVySGVpZ2h0KTsKLQotICAgIGlmIChw
YWdlSGVpZ2h0IDw9IDApIHsKLSAgICAgICAgTE9HX0VSUk9SKCJwYWdlSGVpZ2h0IGhhcyBiYWQg
dmFsdWUgJS4yZiIsIHBhZ2VIZWlnaHQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAg
ZmxvYXQgY3VyclBhZ2VIZWlnaHQgPSBwYWdlSGVpZ2h0IC8gdXNlclNjYWxlRmFjdG9yOwotICAg
IGZsb2F0IGRvY0hlaWdodCAgICAgID0gcm9vdC0+bGF5ZXIoKS0+aGVpZ2h0KCk7Ci0gICAgZmxv
YXQgZG9jV2lkdGggICAgICAgPSByb290LT5sYXllcigpLT53aWR0aCgpOwotICAgIGZsb2F0IGN1
cnJQYWdlV2lkdGggID0gcGFnZVdpZHRoIC8gdXNlclNjYWxlRmFjdG9yOwotCi0gICAgCi0gICAg
Ly8gYWx3YXlzIHJldHVybiBhdCBsZWFzdCBvbmUgcGFnZSwgc2luY2UgZW1wdHkgZmlsZXMgc2hv
dWxkIHByaW50IGEgYmxhbmsgcGFnZQotICAgIGZsb2F0IHByaW50ZWRQYWdlc0hlaWdodCA9IDAu
MDsKLSAgICBkbyB7Ci0gICAgICAgIGZsb2F0IHByb3Bvc2VkQm90dG9tID0gbWluKGRvY0hlaWdo
dCwgcHJpbnRlZFBhZ2VzSGVpZ2h0ICsgcGFnZUhlaWdodCk7Ci0gICAgICAgIGZyYW1lLT5hZGp1
c3RQYWdlSGVpZ2h0KCZwcm9wb3NlZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0LCBwcm9wb3Nl
ZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0KTsKLSAgICAgICAgY3VyclBhZ2VIZWlnaHQgPSBt
YXgoMS4wZiwgcHJvcG9zZWRCb3R0b20gLSBwcmludGVkUGFnZXNIZWlnaHQpOwotICAgICAgIAot
ICAgICAgICBwYWdlcy5hcHBlbmQoSW50UmVjdCgwLHByaW50ZWRQYWdlc0hlaWdodCxjdXJyUGFn
ZVdpZHRoLGN1cnJQYWdlSGVpZ2h0KSk7Ci0gICAgICAgIHByaW50ZWRQYWdlc0hlaWdodCArPSBj
dXJyUGFnZUhlaWdodDsKLSAgICB9IHdoaWxlIChwcmludGVkUGFnZXNIZWlnaHQgPCBkb2NIZWln
aHQpOwotfQotCiBzdGF0aWMgdm9pZCBkcmF3UmVjdEludG9Db250ZXh0KEludFJlY3QgcmVjdCwg
RnJhbWVWaWV3KiB2aWV3LCBHcmFwaGljc0NvbnRleHQqIGdjKQogewogICAgIEludFNpemUgb2Zm
c2V0ID0gdmlldy0+c2Nyb2xsT2Zmc2V0KCk7CkBAIC0xNTIsNyArNTMsOCBAQCBIQklUTUFQIGlt
YWdlRnJvbVNlbGVjdGlvbihGcmFtZSogZnJhbWUsCiB7CiAgICAgZnJhbWUtPnNldFBhaW50UmVz
dHJpY3Rpb24oZm9yY2VCbGFja1RleHQgPyBQYWludFJlc3RyaWN0aW9uU2VsZWN0aW9uT25seUJs
YWNrVGV4dCA6IFBhaW50UmVzdHJpY3Rpb25TZWxlY3Rpb25Pbmx5KTsKICAgICBGbG9hdFJlY3Qg
ZnIgPSBmcmFtZS0+c2VsZWN0aW9uUmVjdCgpOwotICAgIEludFJlY3QgaXIoKGludClmci54KCks
IChpbnQpZnIueSgpLChpbnQpZnIud2lkdGgoKSwoaW50KWZyLmhlaWdodCgpKTsKKyAgICBJbnRS
ZWN0IGlyKHN0YXRpY19jYXN0PGludD4oZnIueCgpKSwgc3RhdGljX2Nhc3Q8aW50Pihmci55KCkp
LAorICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pihmci53aWR0aCgpKSwgc3RhdGljX2Nh
c3Q8aW50Pihmci5oZWlnaHQoKSkpOwogCiAgICAgdm9pZCogYml0czsKICAgICBIREMgaGRjID0g
Q3JlYXRlQ29tcGF0aWJsZURDKDApOwpAQCAtMTYwLDEwICs2MiwxMCBAQCBIQklUTUFQIGltYWdl
RnJvbVNlbGVjdGlvbihGcmFtZSogZnJhbWUsCiAgICAgaW50IGggPSBpci5oZWlnaHQoKTsKICAg
ICBCSVRNQVBJTkZPIGJtcCA9IHsgeyBzaXplb2YoQklUTUFQSU5GT0hFQURFUiksIHcsIGgsIDEs
IDMyIH0gfTsKIAotICAgIEhCSVRNQVAgaGJtcCA9IENyZWF0ZURJQlNlY3Rpb24oMCwgJmJtcCwg
RElCX1JHQl9DT0xPUlMsICh2b2lkKiopJmJpdHMsIDAsIDApOwotICAgIEhCSVRNQVAgaGJtcE9s
ZCA9IChIQklUTUFQKVNlbGVjdE9iamVjdChoZGMsIGhibXApOworICAgIEhCSVRNQVAgaGJtcCA9
IENyZWF0ZURJQlNlY3Rpb24oMCwgJmJtcCwgRElCX1JHQl9DT0xPUlMsIHN0YXRpY19jYXN0PHZv
aWQqKj4oJmJpdHMpLCAwLCAwKTsKKyAgICBIQklUTUFQIGhibXBPbGQgPSBzdGF0aWNfY2FzdDxI
QklUTUFQPihTZWxlY3RPYmplY3QoaGRjLCBoYm1wKSk7CiAgICAgQ0dDb2xvclNwYWNlUmVmIGRl
dmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwotICAgIENHQ29udGV4dFJl
ZiBjb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKCh2b2lkKiliaXRzLCB3LCBoLAorICAg
IENHQ29udGV4dFJlZiBjb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKHN0YXRpY19jYXN0
PHZvaWQqPihiaXRzKSwgdywgaCwKICAgICAgICAgOCwgdyAqIHNpemVvZihSR0JRVUFEKSwgZGV2
aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFQcmVtdWx0
aXBsaWVkRmlyc3QpOwogICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKICAgICBD
R0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQpOwpAQCAtMTgyLDE2ICs4NCw0IEBAIEhCSVRNQVAg
aW1hZ2VGcm9tU2VsZWN0aW9uKEZyYW1lKiBmcmFtZSwKICAgICByZXR1cm4gaGJtcDsKIH0KIAot
RHJhZ0ltYWdlUmVmIEZyYW1lOjpkcmFnSW1hZ2VGb3JTZWxlY3Rpb24oKQoteyAgICAKLSAgICBp
ZiAoc2VsZWN0aW9uQ29udHJvbGxlcigpLT5pc1JhbmdlKCkpCi0gICAgICAgIHJldHVybiBpbWFn
ZUZyb21TZWxlY3Rpb24odGhpcywgZmFsc2UpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQg
RnJhbWU6OmRhc2hib2FyZFJlZ2lvbnNDaGFuZ2VkKCkKLXsKLX0KLQogfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQpJbmRleDogV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lQ2Fpcm9XaW4uY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZUNhaXJvV2luLmNwcAkocmV2aXNpb24g
MCkKKysrIFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZUNhaXJvV2luLmNwcAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJGcmFtZVdpbi5oIgorCisjaW5jbHVkZSAiRWRpdG9yQ2xpZW50LmgiCisjaW5jbHVkZSAiTm90
SW1wbGVtZW50ZWQuaCIKKwordXNpbmcgc3RkOjptaW47CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworSEJJVE1BUCBpbWFnZUZyb21TZWxlY3Rpb24oRnJhbWUqIGZyYW1lLCBib29sIGZvcmNlQmxh
Y2tUZXh0KQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZVdpbi5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lV2luLmNwcAkocmV2aXNp
b24gMjk4MzQpCisrKyBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVXaW4uY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcs
IDIwMDggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAog
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCkBAIC02MCwxMCArNjAsNiBAQAogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4
dC5oIgogI2luY2x1ZGUgIlNldHRpbmdzLmgiCiAKLSNpZiBQTEFURk9STShDRykKLSNpbmNsdWRl
IDxDb3JlR3JhcGhpY3MvQ29yZUdyYXBoaWNzLmg+Ci0jZW5kaWYKLQogdXNpbmcgc3RkOjptaW47
CiB1c2luZyBuYW1lc3BhY2UgS0pTOjpCaW5kaW5nczsKIApAQCAtODQsNyArODAsNiBAQCBLSlM6
OkJpbmRpbmdzOjpJbnN0YW5jZSogRnJhbWU6OmNyZWF0ZVNjCiAgICAgcmV0dXJuIHN0YXRpY19j
YXN0PFBsdWdpblZpZXdXaW4qPih3aWRnZXQpLT5iaW5kaW5nSW5zdGFuY2UoKTsKIH0KIAotCiB2
b2lkIGNvbXB1dGVQYWdlUmVjdHNGb3JGcmFtZShGcmFtZSogZnJhbWUsIGNvbnN0IEludFJlY3Qm
IHByaW50UmVjdCwgZmxvYXQgaGVhZGVySGVpZ2h0LCBmbG9hdCBmb290ZXJIZWlnaHQsIGZsb2F0
IHVzZXJTY2FsZUZhY3RvcixWZWN0b3I8SW50UmVjdD4mIHBhZ2VzLCBpbnQmIG91dFBhZ2VIZWln
aHQpCiB7CiAgICAgQVNTRVJUKGZyYW1lKTsKQEAgLTEwNywxMSArMTAyLDExIEBAIHZvaWQgY29t
cHV0ZVBhZ2VSZWN0c0ZvckZyYW1lKEZyYW1lKiBmcmEKICAgICAgICAgcmV0dXJuOwogICAgIH0K
ICAgICAKLSAgICBmbG9hdCByYXRpbyA9IChmbG9hdClwcmludFJlY3QuaGVpZ2h0KCkgLyAoZmxv
YXQpcHJpbnRSZWN0LndpZHRoKCk7CisgICAgZmxvYXQgcmF0aW8gPSBzdGF0aWNfY2FzdDxmbG9h
dD4ocHJpbnRSZWN0LmhlaWdodCgpKSAvIHN0YXRpY19jYXN0PGZsb2F0PihwcmludFJlY3Qud2lk
dGgoKSk7CiAgCi0gICAgZmxvYXQgcGFnZVdpZHRoICA9IChmbG9hdCkgcm9vdC0+ZG9jV2lkdGgo
KTsKKyAgICBmbG9hdCBwYWdlV2lkdGggID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHJvb3QtPmRvY1dp
ZHRoKCkpOwogICAgIGZsb2F0IHBhZ2VIZWlnaHQgPSBwYWdlV2lkdGggKiByYXRpbzsKLSAgICBv
dXRQYWdlSGVpZ2h0ID0gKGludCkgcGFnZUhlaWdodDsgICAvLyB0aGlzIGlzIHRoZSBoZWlnaHQg
b2YgdGhlIHBhZ2UgYWRqdXN0ZWQgYnkgbWFyZ2lucworICAgIG91dFBhZ2VIZWlnaHQgPSBzdGF0
aWNfY2FzdDxpbnQ+KHBhZ2VIZWlnaHQpOyAgIC8vIHRoaXMgaXMgdGhlIGhlaWdodCBvZiB0aGUg
cGFnZSBhZGp1c3RlZCBieSBtYXJnaW5zCiAgICAgcGFnZUhlaWdodCAtPSAoaGVhZGVySGVpZ2h0
ICsgZm9vdGVySGVpZ2h0KTsKIAogICAgIGlmIChwYWdlSGVpZ2h0IDw9IDApIHsKQEAgLTEyNiw2
MiArMTIxLDE3IEBAIHZvaWQgY29tcHV0ZVBhZ2VSZWN0c0ZvckZyYW1lKEZyYW1lKiBmcmEKIAog
ICAgIAogICAgIC8vIGFsd2F5cyByZXR1cm4gYXQgbGVhc3Qgb25lIHBhZ2UsIHNpbmNlIGVtcHR5
IGZpbGVzIHNob3VsZCBwcmludCBhIGJsYW5rIHBhZ2UKLSAgICBmbG9hdCBwcmludGVkUGFnZXNI
ZWlnaHQgPSAwLjA7CisgICAgZmxvYXQgcHJpbnRlZFBhZ2VzSGVpZ2h0ID0gMC4wZjsKICAgICBk
byB7CiAgICAgICAgIGZsb2F0IHByb3Bvc2VkQm90dG9tID0gbWluKGRvY0hlaWdodCwgcHJpbnRl
ZFBhZ2VzSGVpZ2h0ICsgcGFnZUhlaWdodCk7CiAgICAgICAgIGZyYW1lLT5hZGp1c3RQYWdlSGVp
Z2h0KCZwcm9wb3NlZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0LCBwcm9wb3NlZEJvdHRvbSwg
cHJpbnRlZFBhZ2VzSGVpZ2h0KTsKICAgICAgICAgY3VyclBhZ2VIZWlnaHQgPSBtYXgoMS4wZiwg
cHJvcG9zZWRCb3R0b20gLSBwcmludGVkUGFnZXNIZWlnaHQpOwogICAgICAgIAotICAgICAgICBw
YWdlcy5hcHBlbmQoSW50UmVjdCgwLHByaW50ZWRQYWdlc0hlaWdodCxjdXJyUGFnZVdpZHRoLGN1
cnJQYWdlSGVpZ2h0KSk7CisgICAgICAgIHBhZ2VzLmFwcGVuZChJbnRSZWN0KDAsIHByaW50ZWRQ
YWdlc0hlaWdodCwgY3VyclBhZ2VXaWR0aCwgY3VyclBhZ2VIZWlnaHQpKTsKICAgICAgICAgcHJp
bnRlZFBhZ2VzSGVpZ2h0ICs9IGN1cnJQYWdlSGVpZ2h0OwogICAgIH0gd2hpbGUgKHByaW50ZWRQ
YWdlc0hlaWdodCA8IGRvY0hlaWdodCk7CiB9CiAKLXN0YXRpYyB2b2lkIGRyYXdSZWN0SW50b0Nv
bnRleHQoSW50UmVjdCByZWN0LCBGcmFtZVZpZXcqIHZpZXcsIEdyYXBoaWNzQ29udGV4dCogZ2Mp
Ci17Ci0gICAgSW50U2l6ZSBvZmZzZXQgPSB2aWV3LT5zY3JvbGxPZmZzZXQoKTsKLSAgICByZWN0
Lm1vdmUoLW9mZnNldC53aWR0aCgpLCAtb2Zmc2V0LmhlaWdodCgpKTsKLSAgICByZWN0ID0gdmll
dy0+Y29udmVydFRvQ29udGFpbmluZ1dpbmRvdyhyZWN0KTsKLQotICAgIGdjLT5jb25jYXRDVE0o
QWZmaW5lVHJhbnNmb3JtKCkudHJhbnNsYXRlKC1yZWN0LngoKSwgLXJlY3QueSgpKSk7Ci0KLSAg
ICB2aWV3LT5wYWludChnYywgcmVjdCk7Ci19Ci0KLUhCSVRNQVAgaW1hZ2VGcm9tU2VsZWN0aW9u
KEZyYW1lKiBmcmFtZSwgYm9vbCBmb3JjZUJsYWNrVGV4dCkKLXsKLSAgICBmcmFtZS0+c2V0UGFp
bnRSZXN0cmljdGlvbihmb3JjZUJsYWNrVGV4dCA/IFBhaW50UmVzdHJpY3Rpb25TZWxlY3Rpb25P
bmx5QmxhY2tUZXh0IDogUGFpbnRSZXN0cmljdGlvblNlbGVjdGlvbk9ubHkpOwotICAgIEZsb2F0
UmVjdCBmciA9IGZyYW1lLT5zZWxlY3Rpb25SZWN0KCk7Ci0gICAgSW50UmVjdCBpcigoaW50KWZy
LngoKSwgKGludClmci55KCksKGludClmci53aWR0aCgpLChpbnQpZnIuaGVpZ2h0KCkpOwotCi0g
ICAgdm9pZCogYml0czsKLSAgICBIREMgaGRjID0gQ3JlYXRlQ29tcGF0aWJsZURDKDApOwotICAg
IGludCB3ID0gaXIud2lkdGgoKTsKLSAgICBpbnQgaCA9IGlyLmhlaWdodCgpOwotICAgIEJJVE1B
UElORk8gYm1wID0geyB7IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSwgdywgaCwgMSwgMzIgfSB9
OwotCi0gICAgSEJJVE1BUCBoYm1wID0gQ3JlYXRlRElCU2VjdGlvbigwLCAmYm1wLCBESUJfUkdC
X0NPTE9SUywgKHZvaWQqKikmYml0cywgMCwgMCk7Ci0gICAgSEJJVE1BUCBoYm1wT2xkID0gKEhC
SVRNQVApU2VsZWN0T2JqZWN0KGhkYywgaGJtcCk7Ci0gICAgQ0dDb2xvclNwYWNlUmVmIGRldmlj
ZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwotICAgIENHQ29udGV4dFJlZiBj
b250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKCh2b2lkKiliaXRzLCB3LCBoLAotICAgICAg
ICA4LCB3ICogc2l6ZW9mKFJHQlFVQUQpLCBkZXZpY2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMy
TGl0dGxlIHwga0NHSW1hZ2VBbHBoYVByZW11bHRpcGxpZWRGaXJzdCk7Ci0gICAgQ0dDb2xvclNw
YWNlUmVsZWFzZShkZXZpY2VSR0IpOwotICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7
Ci0KLSAgICBHcmFwaGljc0NvbnRleHQgZ2MoY29udGV4dCk7Ci0KLSAgICBmcmFtZS0+ZG9jdW1l
bnQoKS0+dXBkYXRlTGF5b3V0KCk7Ci0gICAgZHJhd1JlY3RJbnRvQ29udGV4dChpciwgZnJhbWUt
PnZpZXcoKSwgJmdjKTsKLQotICAgIENHQ29udGV4dFJlbGVhc2UoY29udGV4dCk7Ci0gICAgU2Vs
ZWN0T2JqZWN0KGhkYywgaGJtcE9sZCk7Ci0gICAgRGVsZXRlREMoaGRjKTsKLQotICAgIGZyYW1l
LT5zZXRQYWludFJlc3RyaWN0aW9uKFBhaW50UmVzdHJpY3Rpb25Ob25lKTsKLQotICAgIHJldHVy
biBoYm1wOwotfQotCiBEcmFnSW1hZ2VSZWYgRnJhbWU6OmRyYWdJbWFnZUZvclNlbGVjdGlvbigp
CiB7ICAgIAogICAgIGlmIChzZWxlY3Rpb25Db250cm9sbGVyKCktPmlzUmFuZ2UoKSkKSW5kZXg6
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmgJKHJldmlzaW9uIDI5
NzI2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xMDMsNiArMTAzLDcgQEAgcHVibGljOgogICAgIFNDUklQVF9DQUNIRSog
c2NyaXB0Q2FjaGUoKSBjb25zdCB7IHJldHVybiAmbV9zY3JpcHRDYWNoZTsgfQogCiAgICAgc3Rh
dGljIHZvaWQgc2V0U2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrKGJvb2wpOworICAgIHN0YXRpYyBi
b29sIHNob3VsZEFwcGx5TWFjQXNjZW50SGFjaygpOwogI2VuZGlmCiAKICNpZiBQTEFURk9STShH
VEspCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4
dENhaXJvLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJv
L0dyYXBoaWNzQ29udGV4dENhaXJvLmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4dENhaXJvLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNDEsMTUgKzQxLDEzIEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDx3
dGYvTWF0aEV4dHJhcy5oPgogCi0jaWYgUExBVEZPUk0oV0lOKQotI2luY2x1ZGUgPGNhaXJvLXdp
bjMyLmg+Ci0jZW5kaWYKLQogI2lmIFBMQVRGT1JNKEdUSykKICNpbmNsdWRlIDxnZGsvZ2RrLmg+
CiAjaW5jbHVkZSA8cGFuZ28vcGFuZ28uaD4KKyNlbGlmIFBMQVRGT1JNKFdJTikKKyNpbmNsdWRl
IDxjYWlyby13aW4zMi5oPgogI2VuZGlmCi0KKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGVDYWlyby5oIgogCiAjaWZuZGVmIE1fUEkKICNkZWZpbmUgTV9QSSAzLjE0MTU5
MjY1MzU4OTc5MzIzODQ2CkBAIC01NywxOSArNTUsNiBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7
CiAKLWNsYXNzIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSB7Ci1wdWJsaWM6Ci0gICAg
R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKCk7Ci0gICAgfkdyYXBoaWNzQ29udGV4dFBs
YXRmb3JtUHJpdmF0ZSgpOwotCi0gICAgY2Fpcm9fdCogY3I7Ci0gICAgVmVjdG9yPGZsb2F0PiBs
YXllcnM7Ci0KLSNpZiBQTEFURk9STShHVEspCi0gICAgR2RrRXZlbnRFeHBvc2UqIGV4cG9zZTsK
LSNlbmRpZgotfTsKLQogc3RhdGljIGlubGluZSB2b2lkIHNldENvbG9yKGNhaXJvX3QqIGNyLCBj
b25zdCBDb2xvciYgY29sKQogewogICAgIGZsb2F0IHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhOwpA
QCAtODYsMzQgKzcxLDYgQEAgc3RhdGljIGlubGluZSB2b2lkIGZpbGxSZWN0U291cmNlT3Zlcihj
YQogICAgIGNhaXJvX2ZpbGwoY3IpOwogfQogCi1HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZh
dGU6OkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpCi0gICAgOiAgY3IoMCkKLSNpZiBQ
TEFURk9STShHVEspCi0gICAgLCBleHBvc2UoMCkKLSNlbmRpZgotewotfQotCi1HcmFwaGljc0Nv
bnRleHRQbGF0Zm9ybVByaXZhdGU6On5HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKQot
ewotICAgIGNhaXJvX2Rlc3Ryb3koY3IpOwotfQotCi0jaWYgUExBVEZPUk0oV0lOKQotR3JhcGhp
Y3NDb250ZXh0OjpHcmFwaGljc0NvbnRleHQoSERDIGRjKQotICAgIDogbV9jb21tb24oY3JlYXRl
R3JhcGhpY3NDb250ZXh0UHJpdmF0ZSgpKQotICAgICwgbV9kYXRhKG5ldyBHcmFwaGljc0NvbnRl
eHRQbGF0Zm9ybVByaXZhdGUpCi17Ci0gICAgaWYgKGRjKSB7Ci0gICAgICAgIGNhaXJvX3N1cmZh
Y2VfdCogc3VyZmFjZSA9IGNhaXJvX3dpbjMyX3N1cmZhY2VfY3JlYXRlKGRjKTsKLSAgICAgICAg
bV9kYXRhLT5jciA9IGNhaXJvX2NyZWF0ZShzdXJmYWNlKTsKLSAgICB9IGVsc2UgewotICAgICAg
ICBzZXRQYWludGluZ0Rpc2FibGVkKHRydWUpOwotICAgICAgICBtX2RhdGEtPmNyID0gMDsKLSAg
ICB9Ci19Ci0jZW5kaWYKLQogR3JhcGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRleHQoUGxhdGZv
cm1HcmFwaGljc0NvbnRleHQqIGNyKQogICAgIDogbV9jb21tb24oY3JlYXRlR3JhcGhpY3NDb250
ZXh0UHJpdmF0ZSgpKQogICAgICwgbV9kYXRhKG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVBy
aXZhdGUpCkBAIC01NzcsNiArNTM0LDkgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFVSTEZv
clJlY3QoY29ucwogICAgIG5vdEltcGxlbWVudGVkKCk7CiB9CiAKKyNpZiBQTEFURk9STShHVEsp
CisvLyBGSVhNRTogIFRoaXMgc2hvdWxkIGJlIG1vdmVkIHRvIHNvbWV0aGluZyBsaWtlIEdyYXBo
aWNzQ29udGV4dENhaXJvR1RLLmNwcCwKKy8vIGFzIHRoZXJlIGlzIGEgV2luZG93cyBpbXBsZW1l
bnRhdGlvbiBpbiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0Q2Fpcm9XaW4u
Y3BwCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9y
bSYgdHJhbnNmb3JtKQogewogICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCkBAIC01ODYsNiAr
NTQ2LDcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNvbmNhdENUTShjb25zdCBBZgogICAgIGNv
bnN0IGNhaXJvX21hdHJpeF90KiBtYXRyaXggPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNhaXJv
X21hdHJpeF90Kj4oJnRyYW5zZm9ybSk7CiAgICAgY2Fpcm9fdHJhbnNmb3JtKGNyLCBtYXRyaXgp
OwogfQorI2VuZGlmCiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjphZGRJbm5lclJvdW5kZWRSZWN0
Q2xpcChjb25zdCBJbnRSZWN0JiByZWN0LCBpbnQgdGhpY2tuZXNzKQogewpJbmRleDogV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVD
YWlyby5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3Jh
cGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlQ2Fpcm8uaAkocmV2aXNpb24gMjk3MjYpCShmcm9t
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhpY3NDb250ZXh0Q2Fpcm8uY3Bw
OjI5NzI2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9HcmFwaGljc0NvbnRl
eHRQbGF0Zm9ybVByaXZhdGVDYWlyby5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsOTI0IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmln
aHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFscCBUb2tlciA8YWxwQGF0b2tl
ci5jb20+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJHcmFwaGljc0Nv
bnRleHQuaCIKKworI2lmIFBMQVRGT1JNKENBSVJPKQorCisjaW5jbHVkZSAiQ2Fpcm9QYXRoLmgi
CisjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVkZSAiRm9udC5oIgorI2luY2x1ZGUgIklu
dFJlY3QuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlBhdGguaCIK
KyNpbmNsdWRlICJTaW1wbGVGb250RGF0YS5oIgorI2luY2x1ZGUgPGNhaXJvLmg+CisjaW5jbHVk
ZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMu
aD4KKworI2lmIFBMQVRGT1JNKFdJTikKKyNpbmNsdWRlIDxjYWlyby13aW4zMi5oPgorI2VuZGlm
CisKKyNpZiBQTEFURk9STShHVEspCisjaW5jbHVkZSA8Z2RrL2dkay5oPgorI2luY2x1ZGUgPHBh
bmdvL3BhbmdvLmg+CisjZW5kaWYKKworCisjaWZuZGVmIE1fUEkKKyNkZWZpbmUgTV9QSSAzLjE0
MTU5MjY1MzU4OTc5MzIzODQ2CisjZW5kaWYKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFz
cyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUgeworcHVibGljOgorICAgIEdyYXBoaWNz
Q29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpOworICAgIH5HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVBy
aXZhdGUoKTsKKworICAgIGNhaXJvX3QqIGNyOworICAgIFZlY3RvcjxmbG9hdD4gbGF5ZXJzOwor
CisjaWYgUExBVEZPUk0oR1RLKQorICAgIEdka0V2ZW50RXhwb3NlKiBleHBvc2U7CisjZW5kaWYK
K307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRDb2xvcihjYWlyb190KiBjciwgY29uc3QgQ29s
b3ImIGNvbCkKK3sKKyAgICBmbG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKKyAgICBjb2wu
Z2V0UkdCQShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisgICAgY2Fpcm9fc2V0X3NvdXJjZV9y
Z2JhKGNyLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Cit9CisKKy8vIEEgZmlsbFJlY3QgaGVs
cGVyCitzdGF0aWMgaW5saW5lIHZvaWQgZmlsbFJlY3RTb3VyY2VPdmVyKGNhaXJvX3QqIGNyLCBj
b25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0IENvbG9yJiBjb2wpCit7CisgICAgc2V0Q29sb3Io
Y3IsIGNvbCk7CisgICAgY2Fpcm9fcmVjdGFuZ2xlKGNyLCByZWN0LngoKSwgcmVjdC55KCksIHJl
Y3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7CisgICAgY2Fpcm9fc2V0X29wZXJhdG9yKGNyLCBD
QUlST19PUEVSQVRPUl9PVkVSKTsKKyAgICBjYWlyb19maWxsKGNyKTsKK30KKworR3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlOjpHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKQor
ICAgIDogIGNyKDApCisjaWYgUExBVEZPUk0oR1RLKQorICAgICwgZXhwb3NlKDApCisjZW5kaWYK
K3sKK30KKworR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjp+R3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlKCkKK3sKKyAgICBjYWlyb19kZXN0cm95KGNyKTsKK30KKworI2lmIFBM
QVRGT1JNKFdJTikKK0dyYXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0KEhEQyBkYykKKyAg
ICA6IG1fY29tbW9uKGNyZWF0ZUdyYXBoaWNzQ29udGV4dFByaXZhdGUoKSkKKyAgICAsIG1fZGF0
YShuZXcgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKQoreworICAgIGlmIChkYykgewor
ICAgICAgICBjYWlyb19zdXJmYWNlX3QqIHN1cmZhY2UgPSBjYWlyb193aW4zMl9zdXJmYWNlX2Ny
ZWF0ZShkYyk7CisgICAgICAgIG1fZGF0YS0+Y3IgPSBjYWlyb19jcmVhdGUoc3VyZmFjZSk7Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgc2V0UGFpbnRpbmdEaXNhYmxlZCh0cnVlKTsKKyAgICAgICAg
bV9kYXRhLT5jciA9IDA7CisgICAgfQorfQorI2VuZGlmCisKK0dyYXBoaWNzQ29udGV4dDo6R3Jh
cGhpY3NDb250ZXh0KFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiBjcikKKyAgICA6IG1fY29tbW9u
KGNyZWF0ZUdyYXBoaWNzQ29udGV4dFByaXZhdGUoKSkKKyAgICAsIG1fZGF0YShuZXcgR3JhcGhp
Y3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKQoreworICAgIG1fZGF0YS0+Y3IgPSBjYWlyb19yZWZl
cmVuY2UoY3IpOworICAgIHNldFBhaW50aW5nRGlzYWJsZWQoIWNyKTsKK30KKworR3JhcGhpY3ND
b250ZXh0Ojp+R3JhcGhpY3NDb250ZXh0KCkKK3sKKyAgICBkZXN0cm95R3JhcGhpY3NDb250ZXh0
UHJpdmF0ZShtX2NvbW1vbik7CisgICAgZGVsZXRlIG1fZGF0YTsKK30KKworY2Fpcm9fdCogR3Jh
cGhpY3NDb250ZXh0OjpwbGF0Zm9ybUNvbnRleHQoKSBjb25zdAoreworICAgIHJldHVybiBtX2Rh
dGEtPmNyOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2F2ZVBsYXRmb3JtU3RhdGUoKQor
eworICAgIGNhaXJvX3NhdmUobV9kYXRhLT5jcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
OjpyZXN0b3JlUGxhdGZvcm1TdGF0ZSgpCit7CisgICAgY2Fpcm9fcmVzdG9yZShtX2RhdGEtPmNy
KTsKK30KKworLy8gRHJhd3MgYSBmaWxsZWQgcmVjdGFuZ2xlIHdpdGggYSBzdHJva2VkIGJvcmRl
ci4KK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3UmVjdChjb25zdCBJbnRSZWN0JiByZWN0KQor
eworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNh
aXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb19zYXZlKGNyKTsKKworICAgIGlmIChm
aWxsQ29sb3IoKS5hbHBoYSgpKQorICAgICAgICBmaWxsUmVjdFNvdXJjZU92ZXIoY3IsIHJlY3Qs
IGZpbGxDb2xvcigpKTsKKworICAgIGlmIChzdHJva2VTdHlsZSgpICE9IE5vU3Ryb2tlKSB7Cisg
ICAgICAgIHNldENvbG9yKGNyLCBzdHJva2VDb2xvcigpKTsKKyAgICAgICAgRmxvYXRSZWN0IHIo
cmVjdCk7CisgICAgICAgIHIuaW5mbGF0ZSgtLjVmKTsKKyAgICAgICAgY2Fpcm9fcmVjdGFuZ2xl
KGNyLCByLngoKSwgci55KCksIHIud2lkdGgoKSwgci5oZWlnaHQoKSk7CisgICAgICAgIGNhaXJv
X3NldF9saW5lX3dpZHRoKGNyLCAxLjApOworICAgICAgICBjYWlyb19zdHJva2UoY3IpOworICAg
IH0KKworICAgIGNhaXJvX3Jlc3RvcmUoY3IpOworfQorCisvLyBGSVhNRTogTm93IHRoYXQgdGhp
cyBpcyByZWZhY3RvcmVkLCBpdCBzaG91bGQgYmUgc2hhcmVkIGJ5IGFsbCBjb250ZXh0cy4KK3N0
YXRpYyB2b2lkIGFkanVzdExpbmVUb1BpeGVsQm91bmRhcmllcyhGbG9hdFBvaW50JiBwMSwgRmxv
YXRQb2ludCYgcDIsIGZsb2F0IHN0cm9rZVdpZHRoLCBTdHJva2VTdHlsZSBzdHlsZSkKK3sKKyAg
ICAvLyBGb3Igb2RkIHdpZHRocywgd2UgYWRkIGluIDAuNSB0byB0aGUgYXBwcm9wcmlhdGUgeC95
IHNvIHRoYXQgdGhlIGZsb2F0IGFyaXRobWV0aWMKKyAgICAvLyB3b3JrcyBvdXQuICBGb3IgZXhh
bXBsZSwgd2l0aCBhIGJvcmRlciB3aWR0aCBvZiAzLCBLSFRNTCB3aWxsIHBhc3MgdXMgKHkxK3ky
KS8yLCBlLmcuLAorICAgIC8vICg1MCs1MykvMiA9IDEwMy8yID0gNTEgd2hlbiB3ZSB3YW50IDUx
LjUuICBJdCBpcyBhbHdheXMgdHJ1ZSB0aGF0IGFuIGV2ZW4gd2lkdGggZ2F2ZQorICAgIC8vIHVz
IGEgcGVyZmVjdCBwb3NpdGlvbiwgYnV0IGFuIG9kZCB3aWR0aCBnYXZlIHVzIGEgcG9zaXRpb24g
dGhhdCBpcyBvZmYgYnkgZXhhY3RseSAwLjUuCisgICAgaWYgKHN0eWxlID09IERvdHRlZFN0cm9r
ZSB8fCBzdHlsZSA9PSBEYXNoZWRTdHJva2UpIHsKKyAgICAgICAgaWYgKHAxLngoKSA9PSBwMi54
KCkpIHsKKyAgICAgICAgICAgIHAxLnNldFkocDEueSgpICsgc3Ryb2tlV2lkdGgpOworICAgICAg
ICAgICAgcDIuc2V0WShwMi55KCkgLSBzdHJva2VXaWR0aCk7CisgICAgICAgIH0KKyAgICAgICAg
ZWxzZSB7CisgICAgICAgICAgICBwMS5zZXRYKHAxLngoKSArIHN0cm9rZVdpZHRoKTsKKyAgICAg
ICAgICAgIHAyLnNldFgocDIueCgpIC0gc3Ryb2tlV2lkdGgpOworICAgICAgICB9CisgICAgfQor
CisgICAgaWYgKHN0YXRpY19jYXN0PGludD4oc3Ryb2tlV2lkdGgpICUgMikgeworICAgICAgICBp
ZiAocDEueCgpID09IHAyLngoKSkgeworICAgICAgICAgICAgLy8gV2UncmUgYSB2ZXJ0aWNhbCBs
aW5lLiAgQWRqdXN0IG91ciB4LgorICAgICAgICAgICAgcDEuc2V0WChwMS54KCkgKyAwLjUpOwor
ICAgICAgICAgICAgcDIuc2V0WChwMi54KCkgKyAwLjUpOworICAgICAgICB9CisgICAgICAgIGVs
c2UgeworICAgICAgICAgICAgLy8gV2UncmUgYSBob3Jpem9udGFsIGxpbmUuIEFkanVzdCBvdXIg
eS4KKyAgICAgICAgICAgIHAxLnNldFkocDEueSgpICsgMC41KTsKKyAgICAgICAgICAgIHAyLnNl
dFkocDIueSgpICsgMC41KTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gVGhpcyBpcyBvbmx5
IHVzZWQgdG8gZHJhdyBib3JkZXJzLgordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lKGNv
bnN0IEludFBvaW50JiBwb2ludDEsIGNvbnN0IEludFBvaW50JiBwb2ludDIpCit7CisgICAgaWYg
KHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU3Ryb2tlU3R5bGUg
c3R5bGUgPSBzdHJva2VTdHlsZSgpOworICAgIGlmIChzdHlsZSA9PSBOb1N0cm9rZSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOworICAgIGNhaXJvX3Nh
dmUoY3IpOworCisgICAgZmxvYXQgd2lkdGggPSBzdHJva2VUaGlja25lc3MoKTsKKyAgICBpZiAo
d2lkdGggPCAxKQorICAgICAgICB3aWR0aCA9IDE7CisKKyAgICBGbG9hdFBvaW50IHAxID0gcG9p
bnQxOworICAgIEZsb2F0UG9pbnQgcDIgPSBwb2ludDI7CisgICAgYm9vbCBpc1ZlcnRpY2FsTGlu
ZSA9IChwMS54KCkgPT0gcDIueCgpKTsKKyAKKyAgICBhZGp1c3RMaW5lVG9QaXhlbEJvdW5kYXJp
ZXMocDEsIHAyLCB3aWR0aCwgc3R5bGUpOworICAgIGNhaXJvX3NldF9saW5lX3dpZHRoKGNyLCB3
aWR0aCk7CisKKyAgICBpbnQgcGF0V2lkdGggPSAwOworICAgIHN3aXRjaCAoc3R5bGUpIHsKKyAg
ICBjYXNlIE5vU3Ryb2tlOgorICAgIGNhc2UgU29saWRTdHJva2U6CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgRG90dGVkU3Ryb2tlOgorICAgICAgICBwYXRXaWR0aCA9IHN0YXRpY19jYXN0PGlu
dD4od2lkdGgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERhc2hlZFN0cm9rZToKKyAgICAg
ICAgcGF0V2lkdGggPSAzKnN0YXRpY19jYXN0PGludD4od2lkdGgpOworICAgICAgICBicmVhazsK
KyAgICB9CisKKyAgICBzZXRDb2xvcihjciwgc3Ryb2tlQ29sb3IoKSk7CisKKyAgICBjYWlyb19z
ZXRfYW50aWFsaWFzKGNyLCBDQUlST19BTlRJQUxJQVNfTk9ORSk7CisKKyAgICBpZiAocGF0V2lk
dGgpIHsKKyAgICAgICAgLy8gRG8gYSByZWN0IGZpbGwgb2Ygb3VyIGVuZHBvaW50cy4gIFRoaXMg
ZW5zdXJlcyB3ZSBhbHdheXMgaGF2ZSB0aGUKKyAgICAgICAgLy8gYXBwZWFyYW5jZSBvZiBiZWlu
ZyBhIGJvcmRlci4gIFdlIHRoZW4gZHJhdyB0aGUgYWN0dWFsIGRvdHRlZC9kYXNoZWQgbGluZS4K
KyAgICAgICAgaWYgKGlzVmVydGljYWxMaW5lKSB7CisgICAgICAgICAgICBmaWxsUmVjdFNvdXJj
ZU92ZXIoY3IsIEZsb2F0UmVjdChwMS54KCkgLSB3aWR0aC8yLCBwMS55KCkgLSB3aWR0aCwgd2lk
dGgsIHdpZHRoKSwgc3Ryb2tlQ29sb3IoKSk7CisgICAgICAgICAgICBmaWxsUmVjdFNvdXJjZU92
ZXIoY3IsIEZsb2F0UmVjdChwMi54KCkgLSB3aWR0aC8yLCBwMi55KCksIHdpZHRoLCB3aWR0aCks
IHN0cm9rZUNvbG9yKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlsbFJlY3RT
b3VyY2VPdmVyKGNyLCBGbG9hdFJlY3QocDEueCgpIC0gd2lkdGgsIHAxLnkoKSAtIHdpZHRoLzIs
IHdpZHRoLCB3aWR0aCksIHN0cm9rZUNvbG9yKCkpOworICAgICAgICAgICAgZmlsbFJlY3RTb3Vy
Y2VPdmVyKGNyLCBGbG9hdFJlY3QocDIueCgpLCBwMi55KCkgLSB3aWR0aC8yLCB3aWR0aCwgd2lk
dGgpLCBzdHJva2VDb2xvcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEV4YW1wbGU6IDgw
IHBpeGVscyB3aXRoIGEgd2lkdGggb2YgMzAgcGl4ZWxzLgorICAgICAgICAvLyBSZW1haW5kZXIg
aXMgMjAuICBUaGUgbWF4aW11bSBwaXhlbHMgb2YgbGluZSB3ZSBjb3VsZCBwYWludAorICAgICAg
ICAvLyB3aWxsIGJlIDUwIHBpeGVscy4KKyAgICAgICAgaW50IGRpc3RhbmNlID0gKGlzVmVydGlj
YWxMaW5lID8gKHBvaW50Mi55KCkgLSBwb2ludDEueSgpKSA6IChwb2ludDIueCgpIC0gcG9pbnQx
LngoKSkpIC0gMipzdGF0aWNfY2FzdDxpbnQ+KHdpZHRoKTsKKyAgICAgICAgaW50IHJlbWFpbmRl
ciA9IGRpc3RhbmNlJXBhdFdpZHRoOworICAgICAgICBpbnQgY292ZXJhZ2UgPSBkaXN0YW5jZS1y
ZW1haW5kZXI7CisgICAgICAgIGludCBudW1TZWdtZW50cyA9IGNvdmVyYWdlL3BhdFdpZHRoOwor
CisgICAgICAgIGZsb2F0IHBhdHRlcm5PZmZzZXQgPSAwOworICAgICAgICAvLyBTcGVjaWFsIGNh
c2UgMXB4IGRvdHRlZCBib3JkZXJzIGZvciBzcGVlZC4KKyAgICAgICAgaWYgKHBhdFdpZHRoID09
IDEpCisgICAgICAgICAgICBwYXR0ZXJuT2Zmc2V0ID0gMS4wOworICAgICAgICBlbHNlIHsKKyAg
ICAgICAgICAgIGJvb2wgZXZlbk51bWJlck9mU2VnbWVudHMgPSBudW1TZWdtZW50cyUyID09IDA7
CisgICAgICAgICAgICBpZiAocmVtYWluZGVyKQorICAgICAgICAgICAgICAgIGV2ZW5OdW1iZXJP
ZlNlZ21lbnRzID0gIWV2ZW5OdW1iZXJPZlNlZ21lbnRzOworICAgICAgICAgICAgaWYgKGV2ZW5O
dW1iZXJPZlNlZ21lbnRzKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmRlcikgeworICAg
ICAgICAgICAgICAgICAgICBwYXR0ZXJuT2Zmc2V0ICs9IHBhdFdpZHRoIC0gcmVtYWluZGVyOwor
ICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuT2Zmc2V0ICs9IHJlbWFpbmRlci8yOworICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBh
dHRlcm5PZmZzZXQgPSBwYXRXaWR0aC8yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxz
ZSBpZiAoIWV2ZW5OdW1iZXJPZlNlZ21lbnRzKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlbWFp
bmRlcikKKyAgICAgICAgICAgICAgICAgICAgcGF0dGVybk9mZnNldCA9IChwYXRXaWR0aCAtIHJl
bWFpbmRlcikvMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRvdWJsZSBk
YXNoID0gcGF0V2lkdGg7CisgICAgICAgIGNhaXJvX3NldF9kYXNoKGNyLCAmZGFzaCwgMSwgcGF0
dGVybk9mZnNldCk7CisgICAgfQorCisgICAgY2Fpcm9fbW92ZV90byhjciwgcDEueCgpLCBwMS55
KCkpOworICAgIGNhaXJvX2xpbmVfdG8oY3IsIHAyLngoKSwgcDIueSgpKTsKKworICAgIGNhaXJv
X3N0cm9rZShjcik7CisgICAgY2Fpcm9fcmVzdG9yZShjcik7Cit9CisKKy8vIFRoaXMgbWV0aG9k
IGlzIG9ubHkgdXNlZCB0byBkcmF3IHRoZSBsaXR0bGUgY2lyY2xlcyB1c2VkIGluIGxpc3RzLgor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdFbGxpcHNlKGNvbnN0IEludFJlY3QmIHJlY3QpCit7
CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fp
cm9fdCogY3IgPSBtX2RhdGEtPmNyOworICAgIGNhaXJvX3NhdmUoY3IpOworICAgIGZsb2F0IHlS
YWRpdXMgPSAuNSAqIHJlY3QuaGVpZ2h0KCk7CisgICAgZmxvYXQgeFJhZGl1cyA9IC41ICogcmVj
dC53aWR0aCgpOworICAgIGNhaXJvX3RyYW5zbGF0ZShjciwgcmVjdC54KCkgKyB4UmFkaXVzLCBy
ZWN0LnkoKSArIHlSYWRpdXMpOworICAgIGNhaXJvX3NjYWxlKGNyLCB4UmFkaXVzLCB5UmFkaXVz
KTsKKyAgICBjYWlyb19hcmMoY3IsIDAuLCAwLiwgMS4sIDAuLCAyICogTV9QSSk7CisgICAgY2Fp
cm9fcmVzdG9yZShjcik7CisKKyAgICBpZiAoZmlsbENvbG9yKCkuYWxwaGEoKSkgeworICAgICAg
ICBzZXRDb2xvcihjciwgZmlsbENvbG9yKCkpOworICAgICAgICBjYWlyb19maWxsX3ByZXNlcnZl
KGNyKTsKKyAgICB9CisKKyAgICBpZiAoc3Ryb2tlU3R5bGUoKSAhPSBOb1N0cm9rZSkgeworICAg
ICAgICBzZXRDb2xvcihjciwgc3Ryb2tlQ29sb3IoKSk7CisgICAgICAgIGNhaXJvX3NldF9saW5l
X3dpZHRoKGNyLCBzdHJva2VUaGlja25lc3MoKSk7CisgICAgICAgIGNhaXJvX3N0cm9rZShjcik7
CisgICAgfQorCisgICAgY2Fpcm9fbmV3X3BhdGgoY3IpOworfQorCisvLyBGSVhNRTogVGhpcyBm
dW5jdGlvbiBuZWVkcyB0byBiZSBhZGp1c3RlZCB0byBtYXRjaCB0aGUgZnVuY3Rpb25hbGl0eSBv
biB0aGUgTWFjIHNpZGUuCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c3Ryb2tlQXJjKGNvbnN0IElu
dFJlY3QmIHJlY3QsIGludCBzdGFydEFuZ2xlLCBpbnQgYW5nbGVTcGFuKQoreworICAgIGlmIChw
YWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChzdHJva2VTdHls
ZSgpID09IE5vU3Ryb2tlKQorICAgICAgICByZXR1cm47CisKKyAgICBpbnQgeCA9IHJlY3QueCgp
OworICAgIGludCB5ID0gcmVjdC55KCk7CisgICAgZmxvYXQgdyA9IHJlY3Qud2lkdGgoKTsKKyNp
ZiAwIC8vIEZJWE1FOiB1bnVzZWQgc28gZmFyCisgICAgZmxvYXQgaCA9IHJlY3QuaGVpZ2h0KCk7
CisgICAgZmxvYXQgc2NhbGVGYWN0b3IgPSBoIC8gdzsKKyAgICBmbG9hdCByZXZlcnNlU2NhbGVG
YWN0b3IgPSB3IC8gaDsKKyNlbmRpZgorICAgIGZsb2F0IHIgPSB3IC8gMjsKKyAgICBmbG9hdCBm
YSA9IHN0YXJ0QW5nbGU7CisgICAgZmxvYXQgZmFsZW4gPSAgZmEgKyBhbmdsZVNwYW47CisKKyAg
ICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgY2Fpcm9fc2F2ZShjcik7CisgICAgY2Fp
cm9fYXJjX25lZ2F0aXZlKGNyLCB4ICsgciwgeSArIHIsIHIsIC1mYSAqIE1fUEkvMTgwLCAtZmFs
ZW4gKiBNX1BJLzE4MCk7CisgICAgc2V0Q29sb3IoY3IsIHN0cm9rZUNvbG9yKCkpOworICAgIGNh
aXJvX3NldF9saW5lX3dpZHRoKGNyLCBzdHJva2VUaGlja25lc3MoKSk7CisgICAgY2Fpcm9fc3Ry
b2tlKGNyKTsKKyAgICBjYWlyb19yZXN0b3JlKGNyKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRl
eHQ6OmRyYXdDb252ZXhQb2x5Z29uKHNpemVfdCBucG9pbnRzLCBjb25zdCBGbG9hdFBvaW50KiBw
b2ludHMsIGJvb2wgc2hvdWxkQW50aWFsaWFzKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVk
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChucG9pbnRzIDw9IDEpCisgICAgICAgIHJl
dHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKworICAgIGNhaXJvX3NhdmUo
Y3IpOworICAgIGNhaXJvX3NldF9hbnRpYWxpYXMoY3IsIHNob3VsZEFudGlhbGlhcyA/IENBSVJP
X0FOVElBTElBU19ERUZBVUxUIDogQ0FJUk9fQU5USUFMSUFTX05PTkUpOworICAgIGNhaXJvX21v
dmVfdG8oY3IsIHBvaW50c1swXS54KCksIHBvaW50c1swXS55KCkpOworICAgIGZvciAoc2l6ZV90
IGkgPSAxOyBpIDwgbnBvaW50czsgaSsrKQorICAgICAgICBjYWlyb19saW5lX3RvKGNyLCBwb2lu
dHNbaV0ueCgpLCBwb2ludHNbaV0ueSgpKTsKKyAgICBjYWlyb19jbG9zZV9wYXRoKGNyKTsKKwor
ICAgIGlmIChmaWxsQ29sb3IoKS5hbHBoYSgpKSB7CisgICAgICAgIHNldENvbG9yKGNyLCBmaWxs
Q29sb3IoKSk7CisgICAgICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIENBSVJPX0ZJTExfUlVM
RV9FVkVOX09ERCk7CisgICAgICAgIGNhaXJvX2ZpbGxfcHJlc2VydmUoY3IpOworICAgIH0KKwor
ICAgIGlmIChzdHJva2VTdHlsZSgpICE9IE5vU3Ryb2tlKSB7CisgICAgICAgIHNldENvbG9yKGNy
LCBzdHJva2VDb2xvcigpKTsKKyAgICAgICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgoY3IsIHN0cm9r
ZVRoaWNrbmVzcygpKTsKKyAgICAgICAgY2Fpcm9fc3Ryb2tlKGNyKTsKKyAgICB9CisKKyAgICBj
YWlyb19uZXdfcGF0aChjcik7CisgICAgY2Fpcm9fcmVzdG9yZShjcik7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpmaWxsUmVjdChjb25zdCBJbnRSZWN0JiByZWN0LCBjb25zdCBDb2xvciYg
Y29sb3IpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgaWYgKGNvbG9yLmFscGhhKCkpCisgICAgICAgIGZpbGxSZWN0U291cmNlT3ZlcihtX2Rh
dGEtPmNyLCByZWN0LCBjb2xvcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpmaWxsUmVj
dChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBpZiAo
cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoY29sb3IuYWxw
aGEoKSkKKyAgICAgICAgZmlsbFJlY3RTb3VyY2VPdmVyKG1fZGF0YS0+Y3IsIHJlY3QsIGNvbG9y
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXAoY29uc3QgSW50UmVjdCYgcmVjdCkK
K3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBj
YWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgY2Fpcm9fcmVjdGFuZ2xlKGNyLCByZWN0Lngo
KSwgcmVjdC55KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7CisgICAgY2Fpcm9fZmls
bF9ydWxlX3Qgc2F2ZWRGaWxsUnVsZSA9IGNhaXJvX2dldF9maWxsX3J1bGUoY3IpOworICAgIGNh
aXJvX3NldF9maWxsX3J1bGUoY3IsIENBSVJPX0ZJTExfUlVMRV9XSU5ESU5HKTsKKyAgICBjYWly
b19jbGlwKGNyKTsKKyAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNyLCBzYXZlZEZpbGxSdWxlKTsK
K30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1c1JpbmcoY29uc3QgQ29sb3ImIGNv
bG9yKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIGludCByYWRpdXMgPSAoZm9jdXNSaW5nV2lkdGgoKSAtIDEpIC8gMjsKKyAgICBpbnQgb2Zm
c2V0ID0gcmFkaXVzICsgZm9jdXNSaW5nT2Zmc2V0KCk7CisKKyAgICBjb25zdCBWZWN0b3I8SW50
UmVjdD4mIHJlY3RzID0gZm9jdXNSaW5nUmVjdHMoKTsKKyAgICB1bnNpZ25lZCByZWN0Q291bnQg
PSByZWN0cy5zaXplKCk7CisgICAgSW50UmVjdCBmaW5hbEZvY3VzUmVjdDsKKyAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgcmVjdENvdW50OyBpKyspIHsKKyAgICAgICAgSW50UmVjdCBmb2N1
c1JlY3QgPSByZWN0c1tpXTsKKyAgICAgICAgZm9jdXNSZWN0LmluZmxhdGUob2Zmc2V0KTsKKyAg
ICAgICAgZmluYWxGb2N1c1JlY3QudW5pdGUoZm9jdXNSZWN0KTsKKyAgICB9CisKKyAgICBjYWly
b190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgY2Fpcm9fc2F2ZShjcik7CisgICAgLy8gRklYTUU6
IFRoZXNlIHJlY3RzIHNob3VsZCBiZSByb3VuZGVkCisgICAgY2Fpcm9fcmVjdGFuZ2xlKGNyLCBm
aW5hbEZvY3VzUmVjdC54KCksIGZpbmFsRm9jdXNSZWN0LnkoKSwgZmluYWxGb2N1c1JlY3Qud2lk
dGgoKSwgZmluYWxGb2N1c1JlY3QuaGVpZ2h0KCkpOworCisgICAgLy8gRm9yY2UgdGhlIGFscGhh
IHRvIDUwJS4gIFRoaXMgbWF0Y2hlcyB3aGF0IHRoZSBNYWMgZG9lcyB3aXRoIG91dGxpbmUgcmlu
Z3MuCisgICAgQ29sb3IgcmluZ0NvbG9yKGNvbG9yLnJlZCgpLCBjb2xvci5ncmVlbigpLCBjb2xv
ci5ibHVlKCksIDEyNyk7CisgICAgc2V0Q29sb3IoY3IsIHJpbmdDb2xvcik7CisgICAgY2Fpcm9f
c3Ryb2tlKGNyKTsKKyAgICBjYWlyb19yZXN0b3JlKGNyKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQ6OmRyYXdMaW5lRm9yVGV4dChjb25zdCBJbnRQb2ludCYgb3JpZ2luLCBpbnQgd2lkdGgs
IGJvb2wgcHJpbnRpbmcpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgLy8gVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGh0dHA6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NjU5CisgICAgU3Ryb2tlU3R5bGUgc2F2ZWRTdHJv
a2VTdHlsZSA9IHN0cm9rZVN0eWxlKCk7CisgICAgc2V0U3Ryb2tlU3R5bGUoU29saWRTdHJva2Up
OworCisgICAgSW50UG9pbnQgZW5kUG9pbnQgPSBvcmlnaW4gKyBJbnRTaXplKHdpZHRoLCAwKTsK
KyAgICBkcmF3TGluZShvcmlnaW4sIGVuZFBvaW50KTsKKworICAgIHNldFN0cm9rZVN0eWxlKHNh
dmVkU3Ryb2tlU3R5bGUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JN
aXNzcGVsbGluZ09yQmFkR3JhbW1hcihjb25zdCBJbnRQb2ludCYgb3JpZ2luLCBpbnQgd2lkdGgs
IGJvb2wgZ3JhbW1hcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICBy
ZXR1cm47CisKKyNpZiBQTEFURk9STShHVEspCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNy
OworICAgIGNhaXJvX3NhdmUoY3IpOworCisgICAgLy8gQ29udmVudGlvbiBpcyBncmVlbiBmb3Ig
Z3JhbW1hciwgcmVkIGZvciBzcGVsbGluZworICAgIC8vIFRoZXNlIG5lZWQgdG8gYmVjb21lIGNv
bmZpZ3VyYWJsZQorICAgIGlmIChncmFtbWFyKQorICAgICAgICBjYWlyb19zZXRfc291cmNlX3Jn
YihjciwgMCwgMSwgMCk7CisgICAgZWxzZQorICAgICAgICBjYWlyb19zZXRfc291cmNlX3JnYihj
ciwgMSwgMCwgMCk7CisKKyAgICAvLyBXZSBpZ25vcmUgbW9zdCBvZiB0aGUgcHJvdmlkZWQgY29u
c3RhbnRzIGluIGZhdm91ciBvZiB0aGUgcGxhdGZvcm0gc3R5bGUKKyAgICBwYW5nb19jYWlyb19z
aG93X2Vycm9yX3VuZGVybGluZShjciwgb3JpZ2luLngoKSwgb3JpZ2luLnkoKSwgd2lkdGgsIGNN
aXNzcGVsbGluZ0xpbmVUaGlja25lc3MpOworCisgICAgY2Fpcm9fcmVzdG9yZShjcik7CisjZWxz
ZQorICAgIG5vdEltcGxlbWVudGVkKCk7CisjZW5kaWYKK30KKworRmxvYXRSZWN0IEdyYXBoaWNz
Q29udGV4dDo6cm91bmRUb0RldmljZVBpeGVscyhjb25zdCBGbG9hdFJlY3QmIGZyZWN0KQorewor
ICAgIEZsb2F0UmVjdCByZXN1bHQ7CisgICAgZG91YmxlIHggPSBmcmVjdC54KCk7CisgICAgZG91
YmxlIHkgPSBmcmVjdC55KCk7CisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOworICAgIGNh
aXJvX3VzZXJfdG9fZGV2aWNlKGNyLCAmeCwgJnkpOworICAgIHggPSByb3VuZCh4KTsKKyAgICB5
ID0gcm91bmQoeSk7CisgICAgY2Fpcm9fZGV2aWNlX3RvX3VzZXIoY3IsICZ4LCAmeSk7CisgICAg
cmVzdWx0LnNldFgoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHgpKTsKKyAgICByZXN1bHQuc2V0WShzdGF0
aWNfY2FzdDxmbG9hdD4oeSkpOworICAgIHggPSBmcmVjdC53aWR0aCgpOworICAgIHkgPSBmcmVj
dC5oZWlnaHQoKTsKKyAgICBjYWlyb191c2VyX3RvX2RldmljZV9kaXN0YW5jZShjciwgJngsICZ5
KTsKKyAgICB4ID0gcm91bmQoeCk7CisgICAgeSA9IHJvdW5kKHkpOworICAgIGNhaXJvX2Rldmlj
ZV90b191c2VyX2Rpc3RhbmNlKGNyLCAmeCwgJnkpOworICAgIHJlc3VsdC5zZXRXaWR0aChzdGF0
aWNfY2FzdDxmbG9hdD4oeCkpOworICAgIHJlc3VsdC5zZXRIZWlnaHQoc3RhdGljX2Nhc3Q8Zmxv
YXQ+KHkpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6
dHJhbnNsYXRlKGZsb2F0IHgsIGZsb2F0IHkpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQo
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOworICAg
IGNhaXJvX3RyYW5zbGF0ZShjciwgeCwgeSk7Cit9CisKK0ludFBvaW50IEdyYXBoaWNzQ29udGV4
dDo6b3JpZ2luKCkKK3sKKyAgICBjYWlyb19tYXRyaXhfdCBtYXRyaXg7CisgICAgY2Fpcm9fdCog
Y3IgPSBtX2RhdGEtPmNyOworICAgIGNhaXJvX2dldF9tYXRyaXgoY3IsICZtYXRyaXgpOworICAg
IHJldHVybiBJbnRQb2ludChzdGF0aWNfY2FzdDxpbnQ+KG1hdHJpeC54MCksIHN0YXRpY19jYXN0
PGludD4obWF0cml4LnkwKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9y
bUZpbGxDb2xvcihjb25zdCBDb2xvciYgY29sKQoreworICAgIC8vIEZJWE1FOiB0aGlzIGlzIHBy
b2JhYmx5IGEgbm8tb3AgYnV0IEknbSBub3Qgc3VyZQorICAgIC8vIG5vdEltcGxlbWVudGVkKCk7
IC8vIGNvbW1lbnRlZC1vdXQgYmVjYXVzZSBpdCdzIGNoYXR0eSBhbmQgY2x1dHRlcnMgb3V0cHV0
Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVN0cm9rZUNvbG9yKGNvbnN0
IENvbG9yJiBjb2wpCit7CisgICAgLy8gRklYTUU6IHRoaXMgaXMgcHJvYmFibHkgYSBuby1vcCBi
dXQgSSdtIG5vdCBzdXJlCisgICAgLy9ub3RJbXBsZW1lbnRlZCgpOyAvLyBjb21tZW50ZWQtb3V0
IGJlY2F1c2UgaXQncyBjaGF0dHkgYW5kIGNsdXR0ZXJzIG91dHB1dAorfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TdHJva2VUaGlja25lc3MoZmxvYXQgc3Ryb2tlVGhpY2tu
ZXNzKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIGNhaXJvX3NldF9saW5lX3dpZHRoKG1fZGF0YS0+Y3IsIHN0cm9rZVRoaWNrbmVzcyk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVN0cm9rZVN0eWxlKGNvbnN0IFN0
cm9rZVN0eWxlJiBzdHJva2VTdHlsZSkKK3sKKyAgICBzdGF0aWMgZG91YmxlIGRhc2hQYXR0ZXJu
W10gPSB7NS4wLCA1LjB9OworICAgIHN0YXRpYyBkb3VibGUgZG90UGF0dGVybltdID0gezEuMCwg
MS4wfTsKKworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIHN3aXRjaCAoc3Ryb2tlU3R5bGUpIHsKKyAgICBjYXNlIE5vU3Ryb2tlOgorICAgICAgICAv
LyBGSVhNRTogaXMgaXQgdGhlIHJpZ2h0IHdheSB0byBlbXVsYXRlIE5vU3Ryb2tlPworICAgICAg
ICBjYWlyb19zZXRfbGluZV93aWR0aChtX2RhdGEtPmNyLCAwKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgY2FzZSBTb2xpZFN0cm9rZToKKyAgICAgICAgY2Fpcm9fc2V0X2Rhc2gobV9kYXRhLT5jciwg
MCwgMCwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRG90dGVkU3Ryb2tlOgorICAgICAg
ICBjYWlyb19zZXRfZGFzaChtX2RhdGEtPmNyLCBkb3RQYXR0ZXJuLCAyLCAwKTsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBEYXNoZWRTdHJva2U6CisgICAgICAgIGNhaXJvX3NldF9kYXNoKG1f
ZGF0YS0+Y3IsIGRhc2hQYXR0ZXJuLCAyLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVs
dDoKKyAgICAgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQor
Cit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0VVJMRm9yUmVjdChjb25zdCBLVVJMJiBsaW5rLCBj
b25zdCBJbnRSZWN0JiBkZXN0UmVjdCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dDo6Y29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdHJh
bnNmb3JtKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsK
KworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBjb25zdCBjYWlyb19tYXRyaXhf
dCogbWF0cml4ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYWlyb19tYXRyaXhfdCo+KCZ0cmFu
c2Zvcm0pOworICAgIGNhaXJvX3RyYW5zZm9ybShjciwgbWF0cml4KTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHQ6OmFkZElubmVyUm91bmRlZFJlY3RDbGlwKGNvbnN0IEludFJlY3QmIHJlY3Qs
IGludCB0aGlja25lc3MpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgY2xpcChyZWN0KTsKKworICAgIFBhdGggcDsKKyAgICBGbG9hdFJlY3Qg
cihyZWN0KTsKKyAgICAvLyBBZGQgb3V0ZXIgZWxsaXBzZQorICAgIHAuYWRkRWxsaXBzZShyKTsK
KyAgICAvLyBBZGQgaW5uZXIgZWxsaXBzZQorICAgIHIuaW5mbGF0ZSgtdGhpY2tuZXNzKTsKKyAg
ICBwLmFkZEVsbGlwc2Uocik7CisgICAgYWRkUGF0aChwKTsKKworICAgIGNhaXJvX3QqIGNyID0g
bV9kYXRhLT5jcjsKKyAgICBjYWlyb19maWxsX3J1bGVfdCBzYXZlZEZpbGxSdWxlID0gY2Fpcm9f
Z2V0X2ZpbGxfcnVsZShjcik7CisgICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgQ0FJUk9fRklM
TF9SVUxFX0VWRU5fT0REKTsKKyAgICBjYWlyb19jbGlwKGNyKTsKKyAgICBjYWlyb19zZXRfZmls
bF9ydWxlKGNyLCBzYXZlZEZpbGxSdWxlKTsKK30KKworCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6
c2V0U2hhZG93KEludFNpemUgY29uc3QmLCBpbnQsIENvbG9yIGNvbnN0JikKK3sKKyAgICBub3RJ
bXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xlYXJTaGFkb3coKQor
eworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpiZWdp
blRyYW5zcGFyZW5jeUxheWVyKGZsb2F0IG9wYWNpdHkpCit7CisgICAgaWYgKHBhaW50aW5nRGlz
YWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNy
OworICAgIGNhaXJvX3B1c2hfZ3JvdXAoY3IpOworICAgIG1fZGF0YS0+bGF5ZXJzLmFwcGVuZChv
cGFjaXR5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmVuZFRyYW5zcGFyZW5jeUxheWVy
KCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisKKyAgICBjYWlyb19wb3BfZ3JvdXBfdG9fc291
cmNlKGNyKTsKKyAgICBjYWlyb19wYWludF93aXRoX2FscGhhKGNyLCBtX2RhdGEtPmxheWVycy5s
YXN0KCkpOworICAgIG1fZGF0YS0+bGF5ZXJzLnJlbW92ZUxhc3QoKTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHQ6OmNsZWFyUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7CisgICAgaWYg
KHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fdCogY3Ig
PSBtX2RhdGEtPmNyOworCisgICAgY2Fpcm9fc2F2ZShjcik7CisgICAgY2Fpcm9fcmVjdGFuZ2xl
KGNyLCByZWN0LngoKSwgcmVjdC55KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7Cisg
ICAgY2Fpcm9fc2V0X29wZXJhdG9yKGNyLCBDQUlST19PUEVSQVRPUl9DTEVBUik7CisgICAgY2Fp
cm9fZmlsbChjcik7CisgICAgY2Fpcm9fcmVzdG9yZShjcik7Cit9CisKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0OjpzdHJva2VSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgZmxvYXQgd2lkdGgpCit7
CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fp
cm9fdCogY3IgPSBtX2RhdGEtPmNyOworICAgIGNhaXJvX3NhdmUoY3IpOworICAgIGNhaXJvX3Jl
Y3RhbmdsZShjciwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0
KCkpOworICAgIHNldENvbG9yKGNyLCBzdHJva2VDb2xvcigpKTsKKyAgICBjYWlyb19zZXRfbGlu
ZV93aWR0aChjciwgd2lkdGgpOworICAgIGNhaXJvX3N0cm9rZShjcik7CisgICAgY2Fpcm9fcmVz
dG9yZShjcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRMaW5lQ2FwKExpbmVDYXAg
bGluZUNhcCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBjYWlyb19saW5lX2NhcF90IGNhaXJvQ2FwID0gQ0FJUk9fTElORV9DQVBfQlVUVDsK
KyAgICBzd2l0Y2ggKGxpbmVDYXApIHsKKyAgICAgICAgY2FzZSBCdXR0Q2FwOgorICAgICAgICAg
ICAgLy8gbm8tb3AKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJvdW5kQ2FwOgor
ICAgICAgICAgICAgY2Fpcm9DYXAgPSBDQUlST19MSU5FX0NBUF9ST1VORDsKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICBjYXNlIFNxdWFyZUNhcDoKKyAgICAgICAgICAgIGNhaXJvQ2FwID0g
Q0FJUk9fTElORV9DQVBfU1FVQVJFOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNh
aXJvX3NldF9saW5lX2NhcChtX2RhdGEtPmNyLCBjYWlyb0NhcCk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0OjpzZXRMaW5lSm9pbihMaW5lSm9pbiBsaW5lSm9pbikKK3sKKyAgICBpZiAocGFp
bnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb19saW5lX2pvaW5f
dCBjYWlyb0pvaW4gPSBDQUlST19MSU5FX0pPSU5fTUlURVI7CisgICAgc3dpdGNoIChsaW5lSm9p
bikgeworICAgICAgICBjYXNlIE1pdGVySm9pbjoKKyAgICAgICAgICAgIC8vIG5vLW9wCisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSb3VuZEpvaW46CisgICAgICAgICAgICBjYWly
b0pvaW4gPSBDQUlST19MSU5FX0pPSU5fUk9VTkQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBCZXZlbEpvaW46CisgICAgICAgICAgICBjYWlyb0pvaW4gPSBDQUlST19MSU5FX0pP
SU5fQkVWRUw7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2Fpcm9fc2V0X2xpbmVf
am9pbihtX2RhdGEtPmNyLCBjYWlyb0pvaW4pOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6
c2V0TWl0ZXJMaW1pdChmbG9hdCBtaXRlcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgp
KQorICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb19zZXRfbWl0ZXJfbGltaXQobV9kYXRhLT5j
ciwgbWl0ZXIpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0QWxwaGEoZmxvYXQpCit7
CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworc3RhdGljIGlubGluZSBjYWlyb19vcGVyYXRv
cl90IHRvQ2Fpcm9PcGVyYXRvcihDb21wb3NpdGVPcGVyYXRvciBvcCkKK3sKKyAgICBzd2l0Y2gg
KG9wKSB7CisgICAgICAgIGNhc2UgQ29tcG9zaXRlQ2xlYXI6CisgICAgICAgICAgICByZXR1cm4g
Q0FJUk9fT1BFUkFUT1JfQ0xFQVI7CisgICAgICAgIGNhc2UgQ29tcG9zaXRlQ29weToKKyAgICAg
ICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9TT1VSQ0U7CisgICAgICAgIGNhc2UgQ29tcG9z
aXRlU291cmNlT3ZlcjoKKyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9PVkVSOwor
ICAgICAgICBjYXNlIENvbXBvc2l0ZVNvdXJjZUluOgorICAgICAgICAgICAgcmV0dXJuIENBSVJP
X09QRVJBVE9SX0lOOworICAgICAgICBjYXNlIENvbXBvc2l0ZVNvdXJjZU91dDoKKyAgICAgICAg
ICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9PVVQ7CisgICAgICAgIGNhc2UgQ29tcG9zaXRlU291
cmNlQXRvcDoKKyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9BVE9QOworICAgICAg
ICBjYXNlIENvbXBvc2l0ZURlc3RpbmF0aW9uT3ZlcjoKKyAgICAgICAgICAgIHJldHVybiBDQUlS
T19PUEVSQVRPUl9ERVNUX09WRVI7CisgICAgICAgIGNhc2UgQ29tcG9zaXRlRGVzdGluYXRpb25J
bjoKKyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9ERVNUX0lOOworICAgICAgICBj
YXNlIENvbXBvc2l0ZURlc3RpbmF0aW9uT3V0OgorICAgICAgICAgICAgcmV0dXJuIENBSVJPX09Q
RVJBVE9SX0RFU1RfT1VUOworICAgICAgICBjYXNlIENvbXBvc2l0ZURlc3RpbmF0aW9uQXRvcDoK
KyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9ERVNUX0FUT1A7CisgICAgICAgIGNh
c2UgQ29tcG9zaXRlWE9SOgorICAgICAgICAgICAgcmV0dXJuIENBSVJPX09QRVJBVE9SX1hPUjsK
KyAgICAgICAgY2FzZSBDb21wb3NpdGVQbHVzRGFya2VyOgorICAgICAgICAgICAgcmV0dXJuIENB
SVJPX09QRVJBVE9SX1NBVFVSQVRFOworICAgICAgICBjYXNlIENvbXBvc2l0ZUhpZ2hsaWdodDoK
KyAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIENhaXJvIGVxdWl2YWxlbnQgZm9yIENvbXBvc2l0
ZUhpZ2hsaWdodC4KKyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9PVkVSOworICAg
ICAgICBjYXNlIENvbXBvc2l0ZVBsdXNMaWdodGVyOgorICAgICAgICAgICAgcmV0dXJuIENBSVJP
X09QRVJBVE9SX0FERDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBDQUlS
T19PUEVSQVRPUl9TT1VSQ0U7CisgICAgfQorfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0
Q29tcG9zaXRlT3BlcmF0aW9uKENvbXBvc2l0ZU9wZXJhdG9yIG9wKQoreworICAgIGlmIChwYWlu
dGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3NldF9vcGVyYXRv
cihtX2RhdGEtPmNyLCB0b0NhaXJvT3BlcmF0b3Iob3ApKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQ6OmJlZ2luUGF0aCgpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOworICAgIGNhaXJvX25l
d19wYXRoKGNyKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmFkZFBhdGgoY29uc3QgUGF0
aCYgcGF0aCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgY2Fpcm9fcGF0aF90KiBwID0g
Y2Fpcm9fY29weV9wYXRoKHBhdGgucGxhdGZvcm1QYXRoKCktPm1fY3IpOworICAgIGNhaXJvX2Fw
cGVuZF9wYXRoKGNyLCBwKTsKKyAgICBjYWlyb19wYXRoX2Rlc3Ryb3kocCk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0OjpjbGlwKGNvbnN0IFBhdGgmIHBhdGgpCit7CisgICAgaWYgKHBhaW50
aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fdCogY3IgPSBtX2Rh
dGEtPmNyOworICAgIGNhaXJvX3BhdGhfdCogcCA9IGNhaXJvX2NvcHlfcGF0aChwYXRoLnBsYXRm
b3JtUGF0aCgpLT5tX2NyKTsKKyAgICBjYWlyb19hcHBlbmRfcGF0aChjciwgcCk7CisgICAgY2Fp
cm9fcGF0aF9kZXN0cm95KHApOworICAgIGNhaXJvX2ZpbGxfcnVsZV90IHNhdmVkRmlsbFJ1bGUg
PSBjYWlyb19nZXRfZmlsbF9ydWxlKGNyKTsKKyAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNyLCBD
QUlST19GSUxMX1JVTEVfV0lORElORyk7CisgICAgY2Fpcm9fY2xpcChjcik7CisgICAgY2Fpcm9f
c2V0X2ZpbGxfcnVsZShjciwgc2F2ZWRGaWxsUnVsZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250
ZXh0OjpjbGlwT3V0KGNvbnN0IFBhdGgmIHBhdGgpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJs
ZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwor
ICAgIGRvdWJsZSB4MSwgeTEsIHgyLCB5MjsKKyAgICBjYWlyb19jbGlwX2V4dGVudHMoY3IsICZ4
MSwgJnkxLCAmeDIsICZ5Mik7CisgICAgY2Fpcm9fcmVjdGFuZ2xlKGNyLCB4MSwgeTEsIHgyIC0g
eDEsIHkyIC0geTEpOworICAgIGFkZFBhdGgocGF0aCk7CisKKyAgICBjYWlyb19maWxsX3J1bGVf
dCBzYXZlZEZpbGxSdWxlID0gY2Fpcm9fZ2V0X2ZpbGxfcnVsZShjcik7CisgICAgY2Fpcm9fc2V0
X2ZpbGxfcnVsZShjciwgQ0FJUk9fRklMTF9SVUxFX0VWRU5fT0REKTsKKyAgICBjYWlyb19jbGlw
KGNyKTsKKyAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNyLCBzYXZlZEZpbGxSdWxlKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OnJvdGF0ZShmbG9hdCByYWRpYW5zKQoreworICAgIGlmIChw
YWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3JvdGF0ZSht
X2RhdGEtPmNyLCByYWRpYW5zKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNjYWxlKGNv
bnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBjYWlyb19zY2FsZShtX2RhdGEtPmNyLCBzaXplLndpZHRoKCks
IHNpemUuaGVpZ2h0KCkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcE91dChjb25z
dCBJbnRSZWN0JiByKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBkb3VibGUgeDEsIHkx
LCB4MiwgeTI7CisgICAgY2Fpcm9fY2xpcF9leHRlbnRzKGNyLCAmeDEsICZ5MSwgJngyLCAmeTIp
OworICAgIGNhaXJvX3JlY3RhbmdsZShjciwgeDEsIHgyLCB4MiAtIHgxLCB5MiAtIHkxKTsKKyAg
ICBjYWlyb19yZWN0YW5nbGUoY3IsIHIueCgpLCByLnkoKSwgci53aWR0aCgpLCByLmhlaWdodCgp
KTsKKyAgICBjYWlyb19maWxsX3J1bGVfdCBzYXZlZEZpbGxSdWxlID0gY2Fpcm9fZ2V0X2ZpbGxf
cnVsZShjcik7CisgICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgQ0FJUk9fRklMTF9SVUxFX0VW
RU5fT0REKTsKKyAgICBjYWlyb19jbGlwKGNyKTsKKyAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNy
LCBzYXZlZEZpbGxSdWxlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBPdXRFbGxp
cHNlSW5SZWN0KGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQo
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgUGF0aCBwOworICAgIHAuYWRkRWxsaXBzZShyKTsK
KyAgICBjbGlwT3V0KHApOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJvdW5kZWRS
ZWN0KGNvbnN0IEludFJlY3QmIHIsIGNvbnN0IEludFNpemUmIHRvcExlZnQsIGNvbnN0IEludFNp
emUmIHRvcFJpZ2h0LCBjb25zdCBJbnRTaXplJiBib3R0b21MZWZ0LCBjb25zdCBJbnRTaXplJiBi
b3R0b21SaWdodCwgY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIGlmIChwYWludGluZ0Rpc2Fi
bGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsK
KyAgICBjYWlyb19zYXZlKGNyKTsKKyAgICBiZWdpblBhdGgoKTsKKyAgICBhZGRQYXRoKFBhdGg6
OmNyZWF0ZVJvdW5kZWRSZWN0YW5nbGUociwgdG9wTGVmdCwgdG9wUmlnaHQsIGJvdHRvbUxlZnQs
IGJvdHRvbVJpZ2h0KSk7CisgICAgc2V0Q29sb3IoY3IsIGNvbG9yKTsKKyAgICBjYWlyb19maWxs
KGNyKTsKKyAgICBjYWlyb19yZXN0b3JlKGNyKTsKK30KKworI2lmIFBMQVRGT1JNKEdUSykKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0OjpzZXRHZGtFeHBvc2VFdmVudChHZGtFdmVudEV4cG9zZSogZXhw
b3NlKQoreworICAgIG1fZGF0YS0+ZXhwb3NlID0gZXhwb3NlOworfQorCitHZGtFdmVudEV4cG9z
ZSogR3JhcGhpY3NDb250ZXh0OjpnZGtFeHBvc2VFdmVudCgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IG1fZGF0YS0+ZXhwb3NlOworfQorCitHZGtEcmF3YWJsZSogR3JhcGhpY3NDb250ZXh0OjpnZGtE
cmF3YWJsZSgpIGNvbnN0Cit7CisgICAgaWYgKCFtX2RhdGEtPmV4cG9zZSkKKyAgICAgICAgcmV0
dXJuIDA7CisKKyAgICByZXR1cm4gR0RLX0RSQVdBQkxFKG1fZGF0YS0+ZXhwb3NlLT53aW5kb3cp
OworfQorCitJbnRQb2ludCBHcmFwaGljc0NvbnRleHQ6OnRyYW5zbGF0ZVBvaW50KGNvbnN0IElu
dFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAgICBjYWlyb19tYXRyaXhfdCB0bTsKKyAgICBjYWly
b19nZXRfbWF0cml4KG1fZGF0YS0+Y3IsICZ0bSk7CisgICAgZG91YmxlIHggPSBwb2ludC54KCk7
CisgICAgZG91YmxlIHkgPSBwb2ludC55KCk7CisKKyAgICBjYWlyb19tYXRyaXhfdHJhbnNmb3Jt
X3BvaW50KCZ0bSwgJngsICZ5KTsKKyAgICByZXR1cm4gSW50UG9pbnQoeCwgeSk7Cit9CisjZW5k
aWYKKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFVzZUFudGlhbGlhc2luZyhib29sIGVuYWJs
ZSkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICAvLyBXaGVuIHRydWUsIHVzZSB0aGUgZGVmYXVsdCBDYWlybyBiYWNrZW5kIGFudGlhbGlhcyBt
b2RlICh1c3VhbGx5IHRoaXMKKyAgICAvLyBlbmFibGVzIHN0YW5kYXJkICdncmF5c2NhbGUnIGFu
dGlhbGlhc2luZyk7IGZhbHNlIHRvIGV4cGxpY2l0bHkgZGlzYWJsZQorICAgIC8vIGFudGlhbGlh
c2luZy4gVGhpcyBpcyB0aGUgc2FtZSBzdHJhdGVneSBhcyB1c2VkIGluIGRyYXdDb252ZXhQb2x5
Z29uKCkuCisgICAgY2Fpcm9fc2V0X2FudGlhbGlhcyhtX2RhdGEtPmNyLCBlbmFibGUgPyBDQUlS
T19BTlRJQUxJQVNfREVGQVVMVCA6IENBSVJPX0FOVElBTElBU19OT05FKTsKK30KKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gUExBVEZPUk0oQ0FJUk8pCkluZGV4OiBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0
ZUNhaXJvLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9H
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVDYWlyby5oCShyZXZpc2lvbiAyOTcyNikKKysr
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlQ2Fpcm8uaAkod29ya2luZyBjb3B5KQpAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBDb3B5
cmlnaHQgKEMpIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQWxwIFRva2VyIDxhbHBAYXRva2VyLmNvbT4KKyAqIENv
cHlyaWdodCAoQykgMjAwOCBCcmVudCBGdWxnaGFtIDxiZnVsZ2hhbUBnbWFpbC5jb20+CiAgKgog
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI1LDg5OSArMjYsNjAgQEAKICAqLwogCiAj
aW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCiAKICNpZiBQ
TEFURk9STShDQUlSTykKIAotI2luY2x1ZGUgIkNhaXJvUGF0aC5oIgotI2luY2x1ZGUgIkZsb2F0
UmVjdC5oIgotI2luY2x1ZGUgIkZvbnQuaCIKLSNpbmNsdWRlICJJbnRSZWN0LmgiCi0jaW5jbHVk
ZSAiTm90SW1wbGVtZW50ZWQuaCIKLSNpbmNsdWRlICJQYXRoLmgiCi0jaW5jbHVkZSAiU2ltcGxl
Rm9udERhdGEuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKwogI2luY2x1ZGUgPGNh
aXJvLmg+CiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8
d3RmL01hdGhFeHRyYXMuaD4KIAotI2lmIFBMQVRGT1JNKFdJTikKLSNpbmNsdWRlIDxjYWlyby13
aW4zMi5oPgotI2VuZGlmCi0KICNpZiBQTEFURk9STShHVEspCiAjaW5jbHVkZSA8Z2RrL2dkay5o
PgogI2luY2x1ZGUgPHBhbmdvL3BhbmdvLmg+Ci0jZW5kaWYKLQotCi0jaWZuZGVmIE1fUEkKLSNk
ZWZpbmUgTV9QSSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CisjZWxpZiBQTEFURk9STShXSU4pCisj
aW5jbHVkZSA8Y2Fpcm8td2luMzIuaD4KICNlbmRpZgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAK
IGNsYXNzIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSB7CiBwdWJsaWM6Ci0gICAgR3Jh
cGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKCk7Ci0gICAgfkdyYXBoaWNzQ29udGV4dFBsYXRm
b3JtUHJpdmF0ZSgpOwotCi0gICAgY2Fpcm9fdCogY3I7Ci0gICAgVmVjdG9yPGZsb2F0PiBsYXll
cnM7Ci0KLSNpZiBQTEFURk9STShHVEspCi0gICAgR2RrRXZlbnRFeHBvc2UqIGV4cG9zZTsKLSNl
bmRpZgotfTsKLQotc3RhdGljIGlubGluZSB2b2lkIHNldENvbG9yKGNhaXJvX3QqIGNyLCBjb25z
dCBDb2xvciYgY29sKQotewotICAgIGZsb2F0IHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhOwotICAg
IGNvbC5nZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLSAgICBjYWlyb19zZXRfc291
cmNlX3JnYmEoY3IsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLX0KLQotLy8gQSBmaWxsUmVj
dCBoZWxwZXIKLXN0YXRpYyBpbmxpbmUgdm9pZCBmaWxsUmVjdFNvdXJjZU92ZXIoY2Fpcm9fdCog
Y3IsIGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgY29uc3QgQ29sb3ImIGNvbCkKLXsKLSAgICBzZXRD
b2xvcihjciwgY29sKTsKLSAgICBjYWlyb19yZWN0YW5nbGUoY3IsIHJlY3QueCgpLCByZWN0Lnko
KSwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKLSAgICBjYWlyb19zZXRfb3BlcmF0b3Io
Y3IsIENBSVJPX09QRVJBVE9SX09WRVIpOwotICAgIGNhaXJvX2ZpbGwoY3IpOwotfQotCi1HcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0
ZSgpCi0gICAgOiAgY3IoMCkKKyAgICBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKQor
ICAgICAgICA6ICBjcigwKQogI2lmIFBMQVRGT1JNKEdUSykKLSAgICAsIGV4cG9zZSgwKQotI2Vu
ZGlmCi17Ci19Ci0KLUdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6fkdyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZSgpCi17Ci0gICAgY2Fpcm9fZGVzdHJveShjcik7Ci19Ci0KLSNp
ZiBQTEFURk9STShXSU4pCi1HcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dChIREMgZGMp
Ci0gICAgOiBtX2NvbW1vbihjcmVhdGVHcmFwaGljc0NvbnRleHRQcml2YXRlKCkpCi0gICAgLCBt
X2RhdGEobmV3IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSkKLXsKLSAgICBpZiAoZGMp
IHsKLSAgICAgICAgY2Fpcm9fc3VyZmFjZV90KiBzdXJmYWNlID0gY2Fpcm9fd2luMzJfc3VyZmFj
ZV9jcmVhdGUoZGMpOwotICAgICAgICBtX2RhdGEtPmNyID0gY2Fpcm9fY3JlYXRlKHN1cmZhY2Up
OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNldFBhaW50aW5nRGlzYWJsZWQodHJ1ZSk7Ci0gICAg
ICAgIG1fZGF0YS0+Y3IgPSAwOwotICAgIH0KLX0KLSNlbmRpZgotCi1HcmFwaGljc0NvbnRleHQ6
OkdyYXBoaWNzQ29udGV4dChQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCogY3IpCi0gICAgOiBtX2Nv
bW1vbihjcmVhdGVHcmFwaGljc0NvbnRleHRQcml2YXRlKCkpCi0gICAgLCBtX2RhdGEobmV3IEdy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSkKLXsKLSAgICBtX2RhdGEtPmNyID0gY2Fpcm9f
cmVmZXJlbmNlKGNyKTsKLSAgICBzZXRQYWludGluZ0Rpc2FibGVkKCFjcik7Ci19Ci0KLUdyYXBo
aWNzQ29udGV4dDo6fkdyYXBoaWNzQ29udGV4dCgpCi17Ci0gICAgZGVzdHJveUdyYXBoaWNzQ29u
dGV4dFByaXZhdGUobV9jb21tb24pOwotICAgIGRlbGV0ZSBtX2RhdGE7Ci19Ci0KLWNhaXJvX3Qq
IEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1Db250ZXh0KCkgY29uc3QKLXsKLSAgICByZXR1cm4g
bV9kYXRhLT5jcjsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNhdmVQbGF0Zm9ybVN0YXRl
KCkKLXsKLSAgICBjYWlyb19zYXZlKG1fZGF0YS0+Y3IpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDo6cmVzdG9yZVBsYXRmb3JtU3RhdGUoKQotewotICAgIGNhaXJvX3Jlc3RvcmUobV9kYXRh
LT5jcik7Ci19Ci0KLS8vIERyYXdzIGEgZmlsbGVkIHJlY3RhbmdsZSB3aXRoIGEgc3Ryb2tlZCBi
b3JkZXIuCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd1JlY3QoY29uc3QgSW50UmVjdCYgcmVj
dCkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fc2F2ZShjcik7Ci0KLSAgICBp
ZiAoZmlsbENvbG9yKCkuYWxwaGEoKSkKLSAgICAgICAgZmlsbFJlY3RTb3VyY2VPdmVyKGNyLCBy
ZWN0LCBmaWxsQ29sb3IoKSk7Ci0KLSAgICBpZiAoc3Ryb2tlU3R5bGUoKSAhPSBOb1N0cm9rZSkg
ewotICAgICAgICBzZXRDb2xvcihjciwgc3Ryb2tlQ29sb3IoKSk7Ci0gICAgICAgIEZsb2F0UmVj
dCByKHJlY3QpOwotICAgICAgICByLmluZmxhdGUoLS41Zik7Ci0gICAgICAgIGNhaXJvX3JlY3Rh
bmdsZShjciwgci54KCksIHIueSgpLCByLndpZHRoKCksIHIuaGVpZ2h0KCkpOwotICAgICAgICBj
YWlyb19zZXRfbGluZV93aWR0aChjciwgMS4wKTsKLSAgICAgICAgY2Fpcm9fc3Ryb2tlKGNyKTsK
LSAgICB9Ci0KLSAgICBjYWlyb19yZXN0b3JlKGNyKTsKLX0KLQotLy8gRklYTUU6IE5vdyB0aGF0
IHRoaXMgaXMgcmVmYWN0b3JlZCwgaXQgc2hvdWxkIGJlIHNoYXJlZCBieSBhbGwgY29udGV4dHMu
Ci1zdGF0aWMgdm9pZCBhZGp1c3RMaW5lVG9QaXhlbEJvdW5kYXJpZXMoRmxvYXRQb2ludCYgcDEs
IEZsb2F0UG9pbnQmIHAyLCBmbG9hdCBzdHJva2VXaWR0aCwgU3Ryb2tlU3R5bGUgc3R5bGUpCi17
Ci0gICAgLy8gRm9yIG9kZCB3aWR0aHMsIHdlIGFkZCBpbiAwLjUgdG8gdGhlIGFwcHJvcHJpYXRl
IHgveSBzbyB0aGF0IHRoZSBmbG9hdCBhcml0aG1ldGljCi0gICAgLy8gd29ya3Mgb3V0LiAgRm9y
IGV4YW1wbGUsIHdpdGggYSBib3JkZXIgd2lkdGggb2YgMywgS0hUTUwgd2lsbCBwYXNzIHVzICh5
MSt5MikvMiwgZS5nLiwKLSAgICAvLyAoNTArNTMpLzIgPSAxMDMvMiA9IDUxIHdoZW4gd2Ugd2Fu
dCA1MS41LiAgSXQgaXMgYWx3YXlzIHRydWUgdGhhdCBhbiBldmVuIHdpZHRoIGdhdmUKLSAgICAv
LyB1cyBhIHBlcmZlY3QgcG9zaXRpb24sIGJ1dCBhbiBvZGQgd2lkdGggZ2F2ZSB1cyBhIHBvc2l0
aW9uIHRoYXQgaXMgb2ZmIGJ5IGV4YWN0bHkgMC41LgotICAgIGlmIChzdHlsZSA9PSBEb3R0ZWRT
dHJva2UgfHwgc3R5bGUgPT0gRGFzaGVkU3Ryb2tlKSB7Ci0gICAgICAgIGlmIChwMS54KCkgPT0g
cDIueCgpKSB7Ci0gICAgICAgICAgICBwMS5zZXRZKHAxLnkoKSArIHN0cm9rZVdpZHRoKTsKLSAg
ICAgICAgICAgIHAyLnNldFkocDIueSgpIC0gc3Ryb2tlV2lkdGgpOwotICAgICAgICB9Ci0gICAg
ICAgIGVsc2UgewotICAgICAgICAgICAgcDEuc2V0WChwMS54KCkgKyBzdHJva2VXaWR0aCk7Ci0g
ICAgICAgICAgICBwMi5zZXRYKHAyLngoKSAtIHN0cm9rZVdpZHRoKTsKLSAgICAgICAgfQotICAg
IH0KLQotICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KHN0cm9rZVdpZHRoKSAlIDIpIHsKLSAgICAg
ICAgaWYgKHAxLngoKSA9PSBwMi54KCkpIHsKLSAgICAgICAgICAgIC8vIFdlJ3JlIGEgdmVydGlj
YWwgbGluZS4gIEFkanVzdCBvdXIgeC4KLSAgICAgICAgICAgIHAxLnNldFgocDEueCgpICsgMC41
KTsKLSAgICAgICAgICAgIHAyLnNldFgocDIueCgpICsgMC41KTsKLSAgICAgICAgfQotICAgICAg
ICBlbHNlIHsKLSAgICAgICAgICAgIC8vIFdlJ3JlIGEgaG9yaXpvbnRhbCBsaW5lLiBBZGp1c3Qg
b3VyIHkuCi0gICAgICAgICAgICBwMS5zZXRZKHAxLnkoKSArIDAuNSk7Ci0gICAgICAgICAgICBw
Mi5zZXRZKHAyLnkoKSArIDAuNSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIFRoaXMgaXMg
b25seSB1c2VkIHRvIGRyYXcgYm9yZGVycy4KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGlu
ZShjb25zdCBJbnRQb2ludCYgcG9pbnQxLCBjb25zdCBJbnRQb2ludCYgcG9pbnQyKQotewotICAg
IGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFN0cm9rZVN0
eWxlIHN0eWxlID0gc3Ryb2tlU3R5bGUoKTsKLSAgICBpZiAoc3R5bGUgPT0gTm9TdHJva2UpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLSAgICBjYWly
b19zYXZlKGNyKTsKLQotICAgIGZsb2F0IHdpZHRoID0gc3Ryb2tlVGhpY2tuZXNzKCk7Ci0gICAg
aWYgKHdpZHRoIDwgMSkKLSAgICAgICAgd2lkdGggPSAxOwotCi0gICAgRmxvYXRQb2ludCBwMSA9
IHBvaW50MTsKLSAgICBGbG9hdFBvaW50IHAyID0gcG9pbnQyOwotICAgIGJvb2wgaXNWZXJ0aWNh
bExpbmUgPSAocDEueCgpID09IHAyLngoKSk7Ci0gCi0gICAgYWRqdXN0TGluZVRvUGl4ZWxCb3Vu
ZGFyaWVzKHAxLCBwMiwgd2lkdGgsIHN0eWxlKTsKLSAgICBjYWlyb19zZXRfbGluZV93aWR0aChj
ciwgd2lkdGgpOwotCi0gICAgaW50IHBhdFdpZHRoID0gMDsKLSAgICBzd2l0Y2ggKHN0eWxlKSB7
Ci0gICAgY2FzZSBOb1N0cm9rZToKLSAgICBjYXNlIFNvbGlkU3Ryb2tlOgotICAgICAgICBicmVh
azsKLSAgICBjYXNlIERvdHRlZFN0cm9rZToKLSAgICAgICAgcGF0V2lkdGggPSBzdGF0aWNfY2Fz
dDxpbnQ+KHdpZHRoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEYXNoZWRTdHJva2U6Ci0g
ICAgICAgIHBhdFdpZHRoID0gMypzdGF0aWNfY2FzdDxpbnQ+KHdpZHRoKTsKLSAgICAgICAgYnJl
YWs7Ci0gICAgfQotCi0gICAgc2V0Q29sb3IoY3IsIHN0cm9rZUNvbG9yKCkpOwotCi0gICAgY2Fp
cm9fc2V0X2FudGlhbGlhcyhjciwgQ0FJUk9fQU5USUFMSUFTX05PTkUpOwotCi0gICAgaWYgKHBh
dFdpZHRoKSB7Ci0gICAgICAgIC8vIERvIGEgcmVjdCBmaWxsIG9mIG91ciBlbmRwb2ludHMuICBU
aGlzIGVuc3VyZXMgd2UgYWx3YXlzIGhhdmUgdGhlCi0gICAgICAgIC8vIGFwcGVhcmFuY2Ugb2Yg
YmVpbmcgYSBib3JkZXIuICBXZSB0aGVuIGRyYXcgdGhlIGFjdHVhbCBkb3R0ZWQvZGFzaGVkIGxp
bmUuCi0gICAgICAgIGlmIChpc1ZlcnRpY2FsTGluZSkgewotICAgICAgICAgICAgZmlsbFJlY3RT
b3VyY2VPdmVyKGNyLCBGbG9hdFJlY3QocDEueCgpIC0gd2lkdGgvMiwgcDEueSgpIC0gd2lkdGgs
IHdpZHRoLCB3aWR0aCksIHN0cm9rZUNvbG9yKCkpOwotICAgICAgICAgICAgZmlsbFJlY3RTb3Vy
Y2VPdmVyKGNyLCBGbG9hdFJlY3QocDIueCgpIC0gd2lkdGgvMiwgcDIueSgpLCB3aWR0aCwgd2lk
dGgpLCBzdHJva2VDb2xvcigpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpbGxS
ZWN0U291cmNlT3ZlcihjciwgRmxvYXRSZWN0KHAxLngoKSAtIHdpZHRoLCBwMS55KCkgLSB3aWR0
aC8yLCB3aWR0aCwgd2lkdGgpLCBzdHJva2VDb2xvcigpKTsKLSAgICAgICAgICAgIGZpbGxSZWN0
U291cmNlT3ZlcihjciwgRmxvYXRSZWN0KHAyLngoKSwgcDIueSgpIC0gd2lkdGgvMiwgd2lkdGgs
IHdpZHRoKSwgc3Ryb2tlQ29sb3IoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFeGFtcGxl
OiA4MCBwaXhlbHMgd2l0aCBhIHdpZHRoIG9mIDMwIHBpeGVscy4KLSAgICAgICAgLy8gUmVtYWlu
ZGVyIGlzIDIwLiAgVGhlIG1heGltdW0gcGl4ZWxzIG9mIGxpbmUgd2UgY291bGQgcGFpbnQKLSAg
ICAgICAgLy8gd2lsbCBiZSA1MCBwaXhlbHMuCi0gICAgICAgIGludCBkaXN0YW5jZSA9IChpc1Zl
cnRpY2FsTGluZSA/IChwb2ludDIueSgpIC0gcG9pbnQxLnkoKSkgOiAocG9pbnQyLngoKSAtIHBv
aW50MS54KCkpKSAtIDIqc3RhdGljX2Nhc3Q8aW50Pih3aWR0aCk7Ci0gICAgICAgIGludCByZW1h
aW5kZXIgPSBkaXN0YW5jZSVwYXRXaWR0aDsKLSAgICAgICAgaW50IGNvdmVyYWdlID0gZGlzdGFu
Y2UtcmVtYWluZGVyOwotICAgICAgICBpbnQgbnVtU2VnbWVudHMgPSBjb3ZlcmFnZS9wYXRXaWR0
aDsKLQotICAgICAgICBmbG9hdCBwYXR0ZXJuT2Zmc2V0ID0gMDsKLSAgICAgICAgLy8gU3BlY2lh
bCBjYXNlIDFweCBkb3R0ZWQgYm9yZGVycyBmb3Igc3BlZWQuCi0gICAgICAgIGlmIChwYXRXaWR0
aCA9PSAxKQotICAgICAgICAgICAgcGF0dGVybk9mZnNldCA9IDEuMDsKLSAgICAgICAgZWxzZSB7
Ci0gICAgICAgICAgICBib29sIGV2ZW5OdW1iZXJPZlNlZ21lbnRzID0gbnVtU2VnbWVudHMlMiA9
PSAwOwotICAgICAgICAgICAgaWYgKHJlbWFpbmRlcikKLSAgICAgICAgICAgICAgICBldmVuTnVt
YmVyT2ZTZWdtZW50cyA9ICFldmVuTnVtYmVyT2ZTZWdtZW50czsKLSAgICAgICAgICAgIGlmIChl
dmVuTnVtYmVyT2ZTZWdtZW50cykgewotICAgICAgICAgICAgICAgIGlmIChyZW1haW5kZXIpIHsK
LSAgICAgICAgICAgICAgICAgICAgcGF0dGVybk9mZnNldCArPSBwYXRXaWR0aCAtIHJlbWFpbmRl
cjsKLSAgICAgICAgICAgICAgICAgICAgcGF0dGVybk9mZnNldCArPSByZW1haW5kZXIvMjsKLSAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAg
ICBwYXR0ZXJuT2Zmc2V0ID0gcGF0V2lkdGgvMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IGVsc2UgaWYgKCFldmVuTnVtYmVyT2ZTZWdtZW50cykgewotICAgICAgICAgICAgICAgIGlmIChy
ZW1haW5kZXIpCi0gICAgICAgICAgICAgICAgICAgIHBhdHRlcm5PZmZzZXQgPSAocGF0V2lkdGgg
LSByZW1haW5kZXIpLzI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBkb3Vi
bGUgZGFzaCA9IHBhdFdpZHRoOwotICAgICAgICBjYWlyb19zZXRfZGFzaChjciwgJmRhc2gsIDEs
IHBhdHRlcm5PZmZzZXQpOwotICAgIH0KLQotICAgIGNhaXJvX21vdmVfdG8oY3IsIHAxLngoKSwg
cDEueSgpKTsKLSAgICBjYWlyb19saW5lX3RvKGNyLCBwMi54KCksIHAyLnkoKSk7Ci0KLSAgICBj
YWlyb19zdHJva2UoY3IpOwotICAgIGNhaXJvX3Jlc3RvcmUoY3IpOwotfQotCi0vLyBUaGlzIG1l
dGhvZCBpcyBvbmx5IHVzZWQgdG8gZHJhdyB0aGUgbGl0dGxlIGNpcmNsZXMgdXNlZCBpbiBsaXN0
cy4KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3RWxsaXBzZShjb25zdCBJbnRSZWN0JiByZWN0
KQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAg
IGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLSAgICBjYWlyb19zYXZlKGNyKTsKLSAgICBmbG9h
dCB5UmFkaXVzID0gLjUgKiByZWN0LmhlaWdodCgpOwotICAgIGZsb2F0IHhSYWRpdXMgPSAuNSAq
IHJlY3Qud2lkdGgoKTsKLSAgICBjYWlyb190cmFuc2xhdGUoY3IsIHJlY3QueCgpICsgeFJhZGl1
cywgcmVjdC55KCkgKyB5UmFkaXVzKTsKLSAgICBjYWlyb19zY2FsZShjciwgeFJhZGl1cywgeVJh
ZGl1cyk7Ci0gICAgY2Fpcm9fYXJjKGNyLCAwLiwgMC4sIDEuLCAwLiwgMiAqIE1fUEkpOwotICAg
IGNhaXJvX3Jlc3RvcmUoY3IpOwotCi0gICAgaWYgKGZpbGxDb2xvcigpLmFscGhhKCkpIHsKLSAg
ICAgICAgc2V0Q29sb3IoY3IsIGZpbGxDb2xvcigpKTsKLSAgICAgICAgY2Fpcm9fZmlsbF9wcmVz
ZXJ2ZShjcik7Ci0gICAgfQotCi0gICAgaWYgKHN0cm9rZVN0eWxlKCkgIT0gTm9TdHJva2UpIHsK
LSAgICAgICAgc2V0Q29sb3IoY3IsIHN0cm9rZUNvbG9yKCkpOwotICAgICAgICBjYWlyb19zZXRf
bGluZV93aWR0aChjciwgc3Ryb2tlVGhpY2tuZXNzKCkpOwotICAgICAgICBjYWlyb19zdHJva2Uo
Y3IpOwotICAgIH0KLQotICAgIGNhaXJvX25ld19wYXRoKGNyKTsKLX0KLQotLy8gRklYTUU6IFRo
aXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgYWRqdXN0ZWQgdG8gbWF0Y2ggdGhlIGZ1bmN0aW9uYWxp
dHkgb24gdGhlIE1hYyBzaWRlLgotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnN0cm9rZUFyYyhjb25z
dCBJbnRSZWN0JiByZWN0LCBpbnQgc3RhcnRBbmdsZSwgaW50IGFuZ2xlU3BhbikKLXsKLSAgICBp
ZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoc3Ryb2tl
U3R5bGUoKSA9PSBOb1N0cm9rZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaW50IHggPSByZWN0
LngoKTsKLSAgICBpbnQgeSA9IHJlY3QueSgpOwotICAgIGZsb2F0IHcgPSByZWN0LndpZHRoKCk7
Ci0jaWYgMCAvLyBGSVhNRTogdW51c2VkIHNvIGZhcgotICAgIGZsb2F0IGggPSByZWN0LmhlaWdo
dCgpOwotICAgIGZsb2F0IHNjYWxlRmFjdG9yID0gaCAvIHc7Ci0gICAgZmxvYXQgcmV2ZXJzZVNj
YWxlRmFjdG9yID0gdyAvIGg7Ci0jZW5kaWYKLSAgICBmbG9hdCByID0gdyAvIDI7Ci0gICAgZmxv
YXQgZmEgPSBzdGFydEFuZ2xlOwotICAgIGZsb2F0IGZhbGVuID0gIGZhICsgYW5nbGVTcGFuOwot
Ci0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotICAgIGNhaXJvX3NhdmUoY3IpOwotICAg
IGNhaXJvX2FyY19uZWdhdGl2ZShjciwgeCArIHIsIHkgKyByLCByLCAtZmEgKiBNX1BJLzE4MCwg
LWZhbGVuICogTV9QSS8xODApOwotICAgIHNldENvbG9yKGNyLCBzdHJva2VDb2xvcigpKTsKLSAg
ICBjYWlyb19zZXRfbGluZV93aWR0aChjciwgc3Ryb2tlVGhpY2tuZXNzKCkpOwotICAgIGNhaXJv
X3N0cm9rZShjcik7Ci0gICAgY2Fpcm9fcmVzdG9yZShjcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3ND
b250ZXh0OjpkcmF3Q29udmV4UG9seWdvbihzaXplX3QgbnBvaW50cywgY29uc3QgRmxvYXRQb2lu
dCogcG9pbnRzLCBib29sIHNob3VsZEFudGlhbGlhcykKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNh
YmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAobnBvaW50cyA8PSAxKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0KLSAgICBjYWlyb19z
YXZlKGNyKTsKLSAgICBjYWlyb19zZXRfYW50aWFsaWFzKGNyLCBzaG91bGRBbnRpYWxpYXMgPyBD
QUlST19BTlRJQUxJQVNfREVGQVVMVCA6IENBSVJPX0FOVElBTElBU19OT05FKTsKLSAgICBjYWly
b19tb3ZlX3RvKGNyLCBwb2ludHNbMF0ueCgpLCBwb2ludHNbMF0ueSgpKTsKLSAgICBmb3IgKHNp
emVfdCBpID0gMTsgaSA8IG5wb2ludHM7IGkrKykKLSAgICAgICAgY2Fpcm9fbGluZV90byhjciwg
cG9pbnRzW2ldLngoKSwgcG9pbnRzW2ldLnkoKSk7Ci0gICAgY2Fpcm9fY2xvc2VfcGF0aChjcik7
Ci0KLSAgICBpZiAoZmlsbENvbG9yKCkuYWxwaGEoKSkgewotICAgICAgICBzZXRDb2xvcihjciwg
ZmlsbENvbG9yKCkpOwotICAgICAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNyLCBDQUlST19GSUxM
X1JVTEVfRVZFTl9PREQpOwotICAgICAgICBjYWlyb19maWxsX3ByZXNlcnZlKGNyKTsKLSAgICB9
Ci0KLSAgICBpZiAoc3Ryb2tlU3R5bGUoKSAhPSBOb1N0cm9rZSkgewotICAgICAgICBzZXRDb2xv
cihjciwgc3Ryb2tlQ29sb3IoKSk7Ci0gICAgICAgIGNhaXJvX3NldF9saW5lX3dpZHRoKGNyLCBz
dHJva2VUaGlja25lc3MoKSk7Ci0gICAgICAgIGNhaXJvX3N0cm9rZShjcik7CisgICAgICAgICwg
ZXhwb3NlKDApCisjZWxpZiBQTEFURk9STShXSU4pCisgICAgICAgIC8vIE5PVEU6ICBUaGVzZSBt
YXkgbm90ZSBiZSBuZWVkZWQ6IHJldmlldyBhbmQgcmVtb3ZlIG9uY2UgQ2Fpcm8gaW1wbGVtZW50
YXRpb24gaXMgY29tcGxldGUKKyAgICAgICAgLCBtX2hkYygwKQorICAgICAgICAsIG1fdHJhbnNw
YXJlbmN5Q291bnQoMCkKKyNlbmRpZgorICAgIHsKICAgICB9CiAKLSAgICBjYWlyb19uZXdfcGF0
aChjcik7Ci0gICAgY2Fpcm9fcmVzdG9yZShjcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
OjpmaWxsUmVjdChjb25zdCBJbnRSZWN0JiByZWN0LCBjb25zdCBDb2xvciYgY29sb3IpCi17Ci0g
ICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKGNv
bG9yLmFscGhhKCkpCi0gICAgICAgIGZpbGxSZWN0U291cmNlT3ZlcihtX2RhdGEtPmNyLCByZWN0
LCBjb2xvcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpmaWxsUmVjdChjb25zdCBGbG9h
dFJlY3QmIHJlY3QsIGNvbnN0IENvbG9yJiBjb2xvcikKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNh
YmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoY29sb3IuYWxwaGEoKSkKLSAgICAg
ICAgZmlsbFJlY3RTb3VyY2VPdmVyKG1fZGF0YS0+Y3IsIHJlY3QsIGNvbG9yKTsKLX0KLQotdm9p
ZCBHcmFwaGljc0NvbnRleHQ6OmNsaXAoY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICBpZiAo
cGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9
IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fcmVjdGFuZ2xlKGNyLCByZWN0LngoKSwgcmVjdC55KCks
IHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7Ci0gICAgY2Fpcm9fZmlsbF9ydWxlX3Qgc2F2
ZWRGaWxsUnVsZSA9IGNhaXJvX2dldF9maWxsX3J1bGUoY3IpOwotICAgIGNhaXJvX3NldF9maWxs
X3J1bGUoY3IsIENBSVJPX0ZJTExfUlVMRV9XSU5ESU5HKTsKLSAgICBjYWlyb19jbGlwKGNyKTsK
LSAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNyLCBzYXZlZEZpbGxSdWxlKTsKLX0KLQotdm9pZCBH
cmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1c1JpbmcoY29uc3QgQ29sb3ImIGNvbG9yKQotewotICAg
IGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGludCByYWRp
dXMgPSAoZm9jdXNSaW5nV2lkdGgoKSAtIDEpIC8gMjsKLSAgICBpbnQgb2Zmc2V0ID0gcmFkaXVz
ICsgZm9jdXNSaW5nT2Zmc2V0KCk7Ci0KLSAgICBjb25zdCBWZWN0b3I8SW50UmVjdD4mIHJlY3Rz
ID0gZm9jdXNSaW5nUmVjdHMoKTsKLSAgICB1bnNpZ25lZCByZWN0Q291bnQgPSByZWN0cy5zaXpl
KCk7Ci0gICAgSW50UmVjdCBmaW5hbEZvY3VzUmVjdDsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgcmVjdENvdW50OyBpKyspIHsKLSAgICAgICAgSW50UmVjdCBmb2N1c1JlY3QgPSByZWN0
c1tpXTsKLSAgICAgICAgZm9jdXNSZWN0LmluZmxhdGUob2Zmc2V0KTsKLSAgICAgICAgZmluYWxG
b2N1c1JlY3QudW5pdGUoZm9jdXNSZWN0KTsKKyAgICB+R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlKCkKKyAgICB7CisgICAgICAgIGNhaXJvX2Rlc3Ryb3koY3IpOwogICAgIH0KIAotICAg
IGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLSAgICBjYWlyb19zYXZlKGNyKTsKLSAgICAvLyBG
SVhNRTogVGhlc2UgcmVjdHMgc2hvdWxkIGJlIHJvdW5kZWQKLSAgICBjYWlyb19yZWN0YW5nbGUo
Y3IsIGZpbmFsRm9jdXNSZWN0LngoKSwgZmluYWxGb2N1c1JlY3QueSgpLCBmaW5hbEZvY3VzUmVj
dC53aWR0aCgpLCBmaW5hbEZvY3VzUmVjdC5oZWlnaHQoKSk7Ci0KLSAgICAvLyBGb3JjZSB0aGUg
YWxwaGEgdG8gNTAlLiAgVGhpcyBtYXRjaGVzIHdoYXQgdGhlIE1hYyBkb2VzIHdpdGggb3V0bGlu
ZSByaW5ncy4KLSAgICBDb2xvciByaW5nQ29sb3IoY29sb3IucmVkKCksIGNvbG9yLmdyZWVuKCks
IGNvbG9yLmJsdWUoKSwgMTI3KTsKLSAgICBzZXRDb2xvcihjciwgcmluZ0NvbG9yKTsKLSAgICBj
YWlyb19zdHJva2UoY3IpOwotICAgIGNhaXJvX3Jlc3RvcmUoY3IpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JUZXh0KGNvbnN0IEludFBvaW50JiBvcmlnaW4sIGludCB3
aWR0aCwgYm9vbCBwcmludGluZykKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICAvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgaHR0cDovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU2NTkKLSAgICBTdHJva2VTdHlsZSBzYXZl
ZFN0cm9rZVN0eWxlID0gc3Ryb2tlU3R5bGUoKTsKLSAgICBzZXRTdHJva2VTdHlsZShTb2xpZFN0
cm9rZSk7Ci0KLSAgICBJbnRQb2ludCBlbmRQb2ludCA9IG9yaWdpbiArIEludFNpemUod2lkdGgs
IDApOwotICAgIGRyYXdMaW5lKG9yaWdpbiwgZW5kUG9pbnQpOwotCi0gICAgc2V0U3Ryb2tlU3R5
bGUoc2F2ZWRTdHJva2VTdHlsZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGlu
ZUZvck1pc3NwZWxsaW5nT3JCYWRHcmFtbWFyKGNvbnN0IEludFBvaW50JiBvcmlnaW4sIGludCB3
aWR0aCwgYm9vbCBncmFtbWFyKQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAg
ICAgIHJldHVybjsKLQotI2lmIFBMQVRGT1JNKEdUSykKLSAgICBjYWlyb190KiBjciA9IG1fZGF0
YS0+Y3I7Ci0gICAgY2Fpcm9fc2F2ZShjcik7Ci0KLSAgICAvLyBDb252ZW50aW9uIGlzIGdyZWVu
IGZvciBncmFtbWFyLCByZWQgZm9yIHNwZWxsaW5nCi0gICAgLy8gVGhlc2UgbmVlZCB0byBiZWNv
bWUgY29uZmlndXJhYmxlCi0gICAgaWYgKGdyYW1tYXIpCi0gICAgICAgIGNhaXJvX3NldF9zb3Vy
Y2VfcmdiKGNyLCAwLCAxLCAwKTsKLSAgICBlbHNlCi0gICAgICAgIGNhaXJvX3NldF9zb3VyY2Vf
cmdiKGNyLCAxLCAwLCAwKTsKLQotICAgIC8vIFdlIGlnbm9yZSBtb3N0IG9mIHRoZSBwcm92aWRl
ZCBjb25zdGFudHMgaW4gZmF2b3VyIG9mIHRoZSBwbGF0Zm9ybSBzdHlsZQotICAgIHBhbmdvX2Nh
aXJvX3Nob3dfZXJyb3JfdW5kZXJsaW5lKGNyLCBvcmlnaW4ueCgpLCBvcmlnaW4ueSgpLCB3aWR0
aCwgY01pc3NwZWxsaW5nTGluZVRoaWNrbmVzcyk7Ci0KLSAgICBjYWlyb19yZXN0b3JlKGNyKTsK
LSNlbHNlCi0gICAgbm90SW1wbGVtZW50ZWQoKTsKKyNpZiBQTEFURk9STShXSU4pCisgICAgLy8g
T24gV2luZG93cywgd2UgbmVlZCB0byB1cGRhdGUgdGhlIEhEQyBmb3IgZm9ybSBjb250cm9scyB0
byBkcmF3IGluIHRoZSByaWdodCBwbGFjZS4KKyAgICB2b2lkIGJlZ2luVHJhbnNwYXJlbmN5TGF5
ZXIoKSB7IG1fdHJhbnNwYXJlbmN5Q291bnQrKzsgfQorICAgIHZvaWQgZW5kVHJhbnNwYXJlbmN5
TGF5ZXIoKSB7IG1fdHJhbnNwYXJlbmN5Q291bnQtLTsgfQogI2VuZGlmCi19CiAKLUZsb2F0UmVj
dCBHcmFwaGljc0NvbnRleHQ6OnJvdW5kVG9EZXZpY2VQaXhlbHMoY29uc3QgRmxvYXRSZWN0JiBm
cmVjdCkKLXsKLSAgICBGbG9hdFJlY3QgcmVzdWx0OwotICAgIGRvdWJsZSB4ID0gZnJlY3QueCgp
OwotICAgIGRvdWJsZSB5ID0gZnJlY3QueSgpOwotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5j
cjsKLSAgICBjYWlyb191c2VyX3RvX2RldmljZShjciwgJngsICZ5KTsKLSAgICB4ID0gcm91bmQo
eCk7Ci0gICAgeSA9IHJvdW5kKHkpOwotICAgIGNhaXJvX2RldmljZV90b191c2VyKGNyLCAmeCwg
JnkpOwotICAgIHJlc3VsdC5zZXRYKHN0YXRpY19jYXN0PGZsb2F0Pih4KSk7Ci0gICAgcmVzdWx0
LnNldFkoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHkpKTsKLSAgICB4ID0gZnJlY3Qud2lkdGgoKTsKLSAg
ICB5ID0gZnJlY3QuaGVpZ2h0KCk7Ci0gICAgY2Fpcm9fdXNlcl90b19kZXZpY2VfZGlzdGFuY2Uo
Y3IsICZ4LCAmeSk7Ci0gICAgeCA9IHJvdW5kKHgpOwotICAgIHkgPSByb3VuZCh5KTsKLSAgICBj
YWlyb19kZXZpY2VfdG9fdXNlcl9kaXN0YW5jZShjciwgJngsICZ5KTsKLSAgICByZXN1bHQuc2V0
V2lkdGgoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHgpKTsKLSAgICByZXN1bHQuc2V0SGVpZ2h0KHN0YXRp
Y19jYXN0PGZsb2F0Pih5KSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBHcmFwaGlj
c0NvbnRleHQ6OnRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5KQotewotICAgIGlmIChwYWludGlu
Z0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRh
LT5jcjsKLSAgICBjYWlyb190cmFuc2xhdGUoY3IsIHgsIHkpOwotfQotCi1JbnRQb2ludCBHcmFw
aGljc0NvbnRleHQ6Om9yaWdpbigpCi17Ci0gICAgY2Fpcm9fbWF0cml4X3QgbWF0cml4OwotICAg
IGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLSAgICBjYWlyb19nZXRfbWF0cml4KGNyLCAmbWF0
cml4KTsKLSAgICByZXR1cm4gSW50UG9pbnQoc3RhdGljX2Nhc3Q8aW50PihtYXRyaXgueDApLCBz
dGF0aWNfY2FzdDxpbnQ+KG1hdHJpeC55MCkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6
c2V0UGxhdGZvcm1GaWxsQ29sb3IoY29uc3QgQ29sb3ImIGNvbCkKLXsKLSAgICAvLyBGSVhNRTog
dGhpcyBpcyBwcm9iYWJseSBhIG5vLW9wIGJ1dCBJJ20gbm90IHN1cmUKLSAgICAvLyBub3RJbXBs
ZW1lbnRlZCgpOyAvLyBjb21tZW50ZWQtb3V0IGJlY2F1c2UgaXQncyBjaGF0dHkgYW5kIGNsdXR0
ZXJzIG91dHB1dAotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TdHJva2VD
b2xvcihjb25zdCBDb2xvciYgY29sKQotewotICAgIC8vIEZJWE1FOiB0aGlzIGlzIHByb2JhYmx5
IGEgbm8tb3AgYnV0IEknbSBub3Qgc3VyZQotICAgIC8vbm90SW1wbGVtZW50ZWQoKTsgLy8gY29t
bWVudGVkLW91dCBiZWNhdXNlIGl0J3MgY2hhdHR5IGFuZCBjbHV0dGVycyBvdXRwdXQKLX0KLQot
dm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtU3Ryb2tlVGhpY2tuZXNzKGZsb2F0IHN0
cm9rZVRoaWNrbmVzcykKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBjYWlyb19zZXRfbGluZV93aWR0aChtX2RhdGEtPmNyLCBzdHJva2VUaGlj
a25lc3MpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TdHJva2VTdHls
ZShjb25zdCBTdHJva2VTdHlsZSYgc3Ryb2tlU3R5bGUpCi17Ci0gICAgc3RhdGljIGRvdWJsZSBk
YXNoUGF0dGVybltdID0gezUuMCwgNS4wfTsKLSAgICBzdGF0aWMgZG91YmxlIGRvdFBhdHRlcm5b
XSA9IHsxLjAsIDEuMH07Ci0KLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBzd2l0Y2ggKHN0cm9rZVN0eWxlKSB7Ci0gICAgY2FzZSBOb1N0cm9rZToK
LSAgICAgICAgLy8gRklYTUU6IGlzIGl0IHRoZSByaWdodCB3YXkgdG8gZW11bGF0ZSBOb1N0cm9r
ZT8KLSAgICAgICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgobV9kYXRhLT5jciwgMCk7Ci0gICAgICAg
IGJyZWFrOwotICAgIGNhc2UgU29saWRTdHJva2U6Ci0gICAgICAgIGNhaXJvX3NldF9kYXNoKG1f
ZGF0YS0+Y3IsIDAsIDAsIDApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERvdHRlZFN0cm9r
ZToKLSAgICAgICAgY2Fpcm9fc2V0X2Rhc2gobV9kYXRhLT5jciwgZG90UGF0dGVybiwgMiwgMCk7
Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRGFzaGVkU3Ryb2tlOgotICAgICAgICBjYWlyb19z
ZXRfZGFzaChtX2RhdGEtPmNyLCBkYXNoUGF0dGVybiwgMiwgMCk7Ci0gICAgICAgIGJyZWFrOwot
ICAgIGRlZmF1bHQ6Ci0gICAgICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgICAgIGJyZWFrOwot
ICAgIH0KLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFVSTEZvclJlY3QoY29uc3QgS1VS
TCYgbGluaywgY29uc3QgSW50UmVjdCYgZGVzdFJlY3QpCi17Ci0gICAgbm90SW1wbGVtZW50ZWQo
KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNvbmNhdENUTShjb25zdCBBZmZpbmVUcmFu
c2Zvcm0mIHRyYW5zZm9ybSkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY29uc3QgY2Fp
cm9fbWF0cml4X3QqIG1hdHJpeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2Fpcm9fbWF0cml4
X3QqPigmdHJhbnNmb3JtKTsKLSAgICBjYWlyb190cmFuc2Zvcm0oY3IsIG1hdHJpeCk7Ci19Ci0K
LXZvaWQgR3JhcGhpY3NDb250ZXh0OjphZGRJbm5lclJvdW5kZWRSZWN0Q2xpcChjb25zdCBJbnRS
ZWN0JiByZWN0LCBpbnQgdGhpY2tuZXNzKQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIGNsaXAocmVjdCk7Ci0KLSAgICBQYXRoIHA7Ci0gICAg
RmxvYXRSZWN0IHIocmVjdCk7Ci0gICAgLy8gQWRkIG91dGVyIGVsbGlwc2UKLSAgICBwLmFkZEVs
bGlwc2Uocik7Ci0gICAgLy8gQWRkIGlubmVyIGVsbGlwc2UKLSAgICByLmluZmxhdGUoLXRoaWNr
bmVzcyk7Ci0gICAgcC5hZGRFbGxpcHNlKHIpOwotICAgIGFkZFBhdGgocCk7Ci0KLSAgICBjYWly
b190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fZmlsbF9ydWxlX3Qgc2F2ZWRGaWxsUnVs
ZSA9IGNhaXJvX2dldF9maWxsX3J1bGUoY3IpOwotICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3Is
IENBSVJPX0ZJTExfUlVMRV9FVkVOX09ERCk7Ci0gICAgY2Fpcm9fY2xpcChjcik7Ci0gICAgY2Fp
cm9fc2V0X2ZpbGxfcnVsZShjciwgc2F2ZWRGaWxsUnVsZSk7Ci19Ci0KLQotdm9pZCBHcmFwaGlj
c0NvbnRleHQ6OnNldFNoYWRvdyhJbnRTaXplIGNvbnN0JiwgaW50LCBDb2xvciBjb25zdCYpCi17
Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsZWFy
U2hhZG93KCkKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDo6YmVnaW5UcmFuc3BhcmVuY3lMYXllcihmbG9hdCBvcGFjaXR5KQotewotICAgIGlmIChw
YWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0g
bV9kYXRhLT5jcjsKLSAgICBjYWlyb19wdXNoX2dyb3VwKGNyKTsKLSAgICBtX2RhdGEtPmxheWVy
cy5hcHBlbmQob3BhY2l0eSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjplbmRUcmFuc3Bh
cmVuY3lMYXllcigpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotCi0gICAgY2Fpcm9fcG9wX2dy
b3VwX3RvX3NvdXJjZShjcik7Ci0gICAgY2Fpcm9fcGFpbnRfd2l0aF9hbHBoYShjciwgbV9kYXRh
LT5sYXllcnMubGFzdCgpKTsKLSAgICBtX2RhdGEtPmxheWVycy5yZW1vdmVMYXN0KCk7Ci19Ci0K
LXZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGVhclJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KQot
ewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNh
aXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLQotICAgIGNhaXJvX3NhdmUoY3IpOwotICAgIGNhaXJv
X3JlY3RhbmdsZShjciwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVp
Z2h0KCkpOwotICAgIGNhaXJvX3NldF9vcGVyYXRvcihjciwgQ0FJUk9fT1BFUkFUT1JfQ0xFQVIp
OwotICAgIGNhaXJvX2ZpbGwoY3IpOwotICAgIGNhaXJvX3Jlc3RvcmUoY3IpOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDo6c3Ryb2tlUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGZsb2F0
IHdpZHRoKQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsK
LQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLSAgICBjYWlyb19zYXZlKGNyKTsKLSAg
ICBjYWlyb19yZWN0YW5nbGUoY3IsIHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCBy
ZWN0LmhlaWdodCgpKTsKLSAgICBzZXRDb2xvcihjciwgc3Ryb2tlQ29sb3IoKSk7Ci0gICAgY2Fp
cm9fc2V0X2xpbmVfd2lkdGgoY3IsIHdpZHRoKTsKLSAgICBjYWlyb19zdHJva2UoY3IpOwotICAg
IGNhaXJvX3Jlc3RvcmUoY3IpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0TGluZUNh
cChMaW5lQ2FwIGxpbmVDYXApCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fbGluZV9jYXBfdCBjYWlyb0NhcCA9IENBSVJPX0xJTkVf
Q0FQX0JVVFQ7Ci0gICAgc3dpdGNoIChsaW5lQ2FwKSB7Ci0gICAgICAgIGNhc2UgQnV0dENhcDoK
LSAgICAgICAgICAgIC8vIG5vLW9wCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBS
b3VuZENhcDoKLSAgICAgICAgICAgIGNhaXJvQ2FwID0gQ0FJUk9fTElORV9DQVBfUk9VTkQ7Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTcXVhcmVDYXA6Ci0gICAgICAgICAgICBj
YWlyb0NhcCA9IENBSVJPX0xJTkVfQ0FQX1NRVUFSRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAg
IH0KLSAgICBjYWlyb19zZXRfbGluZV9jYXAobV9kYXRhLT5jciwgY2Fpcm9DYXApOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0TGluZUpvaW4oTGluZUpvaW4gbGluZUpvaW4pCi17Ci0g
ICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9f
bGluZV9qb2luX3QgY2Fpcm9Kb2luID0gQ0FJUk9fTElORV9KT0lOX01JVEVSOwotICAgIHN3aXRj
aCAobGluZUpvaW4pIHsKLSAgICAgICAgY2FzZSBNaXRlckpvaW46Ci0gICAgICAgICAgICAvLyBu
by1vcAotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUm91bmRKb2luOgotICAgICAg
ICAgICAgY2Fpcm9Kb2luID0gQ0FJUk9fTElORV9KT0lOX1JPVU5EOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIGNhc2UgQmV2ZWxKb2luOgotICAgICAgICAgICAgY2Fpcm9Kb2luID0gQ0FJ
Uk9fTElORV9KT0lOX0JFVkVMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhaXJv
X3NldF9saW5lX2pvaW4obV9kYXRhLT5jciwgY2Fpcm9Kb2luKTsKLX0KLQotdm9pZCBHcmFwaGlj
c0NvbnRleHQ6OnNldE1pdGVyTGltaXQoZmxvYXQgbWl0ZXIpCi17Ci0gICAgaWYgKHBhaW50aW5n
RGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fc2V0X21pdGVyX2xpbWl0
KG1fZGF0YS0+Y3IsIG1pdGVyKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldEFscGhh
KGZsb2F0KQotewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgY2Fp
cm9fb3BlcmF0b3JfdCB0b0NhaXJvT3BlcmF0b3IoQ29tcG9zaXRlT3BlcmF0b3Igb3ApCi17Ci0g
ICAgc3dpdGNoIChvcCkgewotICAgICAgICBjYXNlIENvbXBvc2l0ZUNsZWFyOgotICAgICAgICAg
ICAgcmV0dXJuIENBSVJPX09QRVJBVE9SX0NMRUFSOwotICAgICAgICBjYXNlIENvbXBvc2l0ZUNv
cHk6Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfU09VUkNFOwotICAgICAgICBj
YXNlIENvbXBvc2l0ZVNvdXJjZU92ZXI6Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFU
T1JfT1ZFUjsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VJbjoKLSAgICAgICAgICAgIHJl
dHVybiBDQUlST19PUEVSQVRPUl9JTjsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VPdXQ6
Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfT1VUOwotICAgICAgICBjYXNlIENv
bXBvc2l0ZVNvdXJjZUF0b3A6Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfQVRP
UDsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlvbk92ZXI6Ci0gICAgICAgICAgICBy
ZXR1cm4gQ0FJUk9fT1BFUkFUT1JfREVTVF9PVkVSOwotICAgICAgICBjYXNlIENvbXBvc2l0ZURl
c3RpbmF0aW9uSW46Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfREVTVF9JTjsK
LSAgICAgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlvbk91dDoKLSAgICAgICAgICAgIHJldHVy
biBDQUlST19PUEVSQVRPUl9ERVNUX09VVDsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5h
dGlvbkF0b3A6Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfREVTVF9BVE9QOwot
ICAgICAgICBjYXNlIENvbXBvc2l0ZVhPUjoKLSAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVS
QVRPUl9YT1I7Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRlUGx1c0RhcmtlcjoKLSAgICAgICAgICAg
IHJldHVybiBDQUlST19PUEVSQVRPUl9TQVRVUkFURTsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVI
aWdobGlnaHQ6Ci0gICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBDYWlybyBlcXVpdmFsZW50IGZv
ciBDb21wb3NpdGVIaWdobGlnaHQuCi0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1Jf
T1ZFUjsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVQbHVzTGlnaHRlcjoKLSAgICAgICAgICAgIHJl
dHVybiBDQUlST19PUEVSQVRPUl9BREQ7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBy
ZXR1cm4gQ0FJUk9fT1BFUkFUT1JfU09VUkNFOwotICAgIH0KLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQ6OnNldENvbXBvc2l0ZU9wZXJhdGlvbihDb21wb3NpdGVPcGVyYXRvciBvcCkKLXsKLSAg
ICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjYWlyb19z
ZXRfb3BlcmF0b3IobV9kYXRhLT5jciwgdG9DYWlyb09wZXJhdG9yKG9wKSk7Ci19Ci0KLXZvaWQg
R3JhcGhpY3NDb250ZXh0OjpiZWdpblBhdGgoKQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVk
KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLSAg
ICBjYWlyb19uZXdfcGF0aChjcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjphZGRQYXRo
KGNvbnN0IFBhdGgmIHBhdGgpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotICAgIGNhaXJvX3Bh
dGhfdCogcCA9IGNhaXJvX2NvcHlfcGF0aChwYXRoLnBsYXRmb3JtUGF0aCgpLT5tX2NyKTsKLSAg
ICBjYWlyb19hcHBlbmRfcGF0aChjciwgcCk7Ci0gICAgY2Fpcm9fcGF0aF9kZXN0cm95KHApOwot
fQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcChjb25zdCBQYXRoJiBwYXRoKQotewotICAg
IGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3Qq
IGNyID0gbV9kYXRhLT5jcjsKLSAgICBjYWlyb19wYXRoX3QqIHAgPSBjYWlyb19jb3B5X3BhdGgo
cGF0aC5wbGF0Zm9ybVBhdGgoKS0+bV9jcik7Ci0gICAgY2Fpcm9fYXBwZW5kX3BhdGgoY3IsIHAp
OwotICAgIGNhaXJvX3BhdGhfZGVzdHJveShwKTsKLSAgICBjYWlyb19maWxsX3J1bGVfdCBzYXZl
ZEZpbGxSdWxlID0gY2Fpcm9fZ2V0X2ZpbGxfcnVsZShjcik7Ci0gICAgY2Fpcm9fc2V0X2ZpbGxf
cnVsZShjciwgQ0FJUk9fRklMTF9SVUxFX1dJTkRJTkcpOwotICAgIGNhaXJvX2NsaXAoY3IpOwot
ICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIHNhdmVkRmlsbFJ1bGUpOwotfQotCi12b2lkIEdy
YXBoaWNzQ29udGV4dDo6Y2xpcE91dChjb25zdCBQYXRoJiBwYXRoKQotewotICAgIGlmIChwYWlu
dGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9k
YXRhLT5jcjsKLSAgICBkb3VibGUgeDEsIHkxLCB4MiwgeTI7Ci0gICAgY2Fpcm9fY2xpcF9leHRl
bnRzKGNyLCAmeDEsICZ5MSwgJngyLCAmeTIpOwotICAgIGNhaXJvX3JlY3RhbmdsZShjciwgeDEs
IHkxLCB4MiAtIHgxLCB5MiAtIHkxKTsKLSAgICBhZGRQYXRoKHBhdGgpOwotCi0gICAgY2Fpcm9f
ZmlsbF9ydWxlX3Qgc2F2ZWRGaWxsUnVsZSA9IGNhaXJvX2dldF9maWxsX3J1bGUoY3IpOwotICAg
IGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIENBSVJPX0ZJTExfUlVMRV9FVkVOX09ERCk7Ci0gICAg
Y2Fpcm9fY2xpcChjcik7Ci0gICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgc2F2ZWRGaWxsUnVs
ZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0Ojpyb3RhdGUoZmxvYXQgcmFkaWFucykKLXsK
LSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjYWly
b19yb3RhdGUobV9kYXRhLT5jciwgcmFkaWFucyk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
OjpzY2FsZShjb25zdCBGbG9hdFNpemUmIHNpemUpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJs
ZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fc2NhbGUobV9kYXRhLT5jciwgc2l6
ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNs
aXBPdXQoY29uc3QgSW50UmVjdCYgcikKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgZG91
YmxlIHgxLCB5MSwgeDIsIHkyOwotICAgIGNhaXJvX2NsaXBfZXh0ZW50cyhjciwgJngxLCAmeTEs
ICZ4MiwgJnkyKTsKLSAgICBjYWlyb19yZWN0YW5nbGUoY3IsIHgxLCB4MiwgeDIgLSB4MSwgeTIg
LSB5MSk7Ci0gICAgY2Fpcm9fcmVjdGFuZ2xlKGNyLCByLngoKSwgci55KCksIHIud2lkdGgoKSwg
ci5oZWlnaHQoKSk7Ci0gICAgY2Fpcm9fZmlsbF9ydWxlX3Qgc2F2ZWRGaWxsUnVsZSA9IGNhaXJv
X2dldF9maWxsX3J1bGUoY3IpOwotICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIENBSVJPX0ZJ
TExfUlVMRV9FVkVOX09ERCk7Ci0gICAgY2Fpcm9fY2xpcChjcik7Ci0gICAgY2Fpcm9fc2V0X2Zp
bGxfcnVsZShjciwgc2F2ZWRGaWxsUnVsZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0Ojpj
bGlwT3V0RWxsaXBzZUluUmVjdChjb25zdCBJbnRSZWN0JiByKQotewotICAgIGlmIChwYWludGlu
Z0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFBhdGggcDsKLSAgICBwLmFkZEVs
bGlwc2Uocik7Ci0gICAgY2xpcE91dChwKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmZp
bGxSb3VuZGVkUmVjdChjb25zdCBJbnRSZWN0JiByLCBjb25zdCBJbnRTaXplJiB0b3BMZWZ0LCBj
b25zdCBJbnRTaXplJiB0b3BSaWdodCwgY29uc3QgSW50U2l6ZSYgYm90dG9tTGVmdCwgY29uc3Qg
SW50U2l6ZSYgYm90dG9tUmlnaHQsIGNvbnN0IENvbG9yJiBjb2xvcikKLXsKLSAgICBpZiAocGFp
bnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1f
ZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fc2F2ZShjcik7Ci0gICAgYmVnaW5QYXRoKCk7Ci0gICAgYWRk
UGF0aChQYXRoOjpjcmVhdGVSb3VuZGVkUmVjdGFuZ2xlKHIsIHRvcExlZnQsIHRvcFJpZ2h0LCBi
b3R0b21MZWZ0LCBib3R0b21SaWdodCkpOwotICAgIHNldENvbG9yKGNyLCBjb2xvcik7Ci0gICAg
Y2Fpcm9fZmlsbChjcik7Ci0gICAgY2Fpcm9fcmVzdG9yZShjcik7Ci19CisgICAgY2Fpcm9fdCog
Y3I7CisgICAgVmVjdG9yPGZsb2F0PiBsYXllcnM7CiAKICNpZiBQTEFURk9STShHVEspCi12b2lk
IEdyYXBoaWNzQ29udGV4dDo6c2V0R2RrRXhwb3NlRXZlbnQoR2RrRXZlbnRFeHBvc2UqIGV4cG9z
ZSkKLXsKLSAgICBtX2RhdGEtPmV4cG9zZSA9IGV4cG9zZTsKLX0KLQotR2RrRXZlbnRFeHBvc2Uq
IEdyYXBoaWNzQ29udGV4dDo6Z2RrRXhwb3NlRXZlbnQoKSBjb25zdAotewotICAgIHJldHVybiBt
X2RhdGEtPmV4cG9zZTsKLX0KLQotR2RrRHJhd2FibGUqIEdyYXBoaWNzQ29udGV4dDo6Z2RrRHJh
d2FibGUoKSBjb25zdAotewotICAgIGlmICghbV9kYXRhLT5leHBvc2UpCi0gICAgICAgIHJldHVy
biAwOwotCi0gICAgcmV0dXJuIEdES19EUkFXQUJMRShtX2RhdGEtPmV4cG9zZS0+d2luZG93KTsK
LX0KLQotSW50UG9pbnQgR3JhcGhpY3NDb250ZXh0Ojp0cmFuc2xhdGVQb2ludChjb25zdCBJbnRQ
b2ludCYgcG9pbnQpIGNvbnN0Ci17Ci0gICAgY2Fpcm9fbWF0cml4X3QgdG07Ci0gICAgY2Fpcm9f
Z2V0X21hdHJpeChtX2RhdGEtPmNyLCAmdG0pOwotICAgIGRvdWJsZSB4ID0gcG9pbnQueCgpOwot
ICAgIGRvdWJsZSB5ID0gcG9pbnQueSgpOwotCi0gICAgY2Fpcm9fbWF0cml4X3RyYW5zZm9ybV9w
b2ludCgmdG0sICZ4LCAmeSk7Ci0gICAgcmV0dXJuIEludFBvaW50KHgsIHkpOwotfQorICAgIEdk
a0V2ZW50RXhwb3NlKiBleHBvc2U7CisjZWxpZiBQTEFURk9STShXSU4pCisgICAgSERDIG1faGRj
OworICAgIHVuc2lnbmVkIG1fdHJhbnNwYXJlbmN5Q291bnQ7CiAjZW5kaWYKLQotdm9pZCBHcmFw
aGljc0NvbnRleHQ6OnNldFVzZUFudGlhbGlhc2luZyhib29sIGVuYWJsZSkKLXsKLSAgICBpZiAo
cGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBXaGVuIHRydWUs
IHVzZSB0aGUgZGVmYXVsdCBDYWlybyBiYWNrZW5kIGFudGlhbGlhcyBtb2RlICh1c3VhbGx5IHRo
aXMKLSAgICAvLyBlbmFibGVzIHN0YW5kYXJkICdncmF5c2NhbGUnIGFudGlhbGlhc2luZyk7IGZh
bHNlIHRvIGV4cGxpY2l0bHkgZGlzYWJsZQotICAgIC8vIGFudGlhbGlhc2luZy4gVGhpcyBpcyB0
aGUgc2FtZSBzdHJhdGVneSBhcyB1c2VkIGluIGRyYXdDb252ZXhQb2x5Z29uKCkuCi0gICAgY2Fp
cm9fc2V0X2FudGlhbGlhcyhtX2RhdGEtPmNyLCBlbmFibGUgPyBDQUlST19BTlRJQUxJQVNfREVG
QVVMVCA6IENBSVJPX0FOVElBTElBU19OT05FKTsKLX0KK307CiAKIH0gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKIApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9HcmFwaGljc0NvbnRl
eHRDRy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9HcmFw
aGljc0NvbnRleHRDRy5jcHAJKHJldmlzaW9uIDI5NzI2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHRDRy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3LDEx
ICsyNyw5IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0
LmgiCiAKLSNpZiBQTEFURk9STShDRykKLQogI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgog
I2luY2x1ZGUgIkZsb2F0Q29udmVyc2lvbi5oIgotI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFBs
YXRmb3JtUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0
ZUNHLmgiCiAjaW5jbHVkZSAiS1VSTC5oIgogI2luY2x1ZGUgIlBhdGguaCIKICNpbmNsdWRlIDxD
b3JlR3JhcGhpY3MvQ0dQREZDb250ZXh0Lmg+CkBAIC04Myw3ICs4MSw3IEBAIENHQ29udGV4dFJl
ZiBHcmFwaGljc0NvbnRleHQ6OnBsYXRmb3JtQ28KIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzYXZl
UGxhdGZvcm1TdGF0ZSgpCiB7CiAgICAgLy8gTm90ZTogRG8gbm90IHVzZSB0aGlzIGZ1bmN0aW9u
IHdpdGhpbiB0aGlzIGNsYXNzIGltcGxlbWVudGF0aW9uLCBzaW5jZSB3ZSB3YW50IHRvIGF2b2lk
IHRoZSBleHRyYQotICAgIC8vIHNhdmUgb2YgdGhlIHNlY29uZGFyeSBjb250ZXh0IChpbiBHcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUuaCkuCisgICAgLy8gc2F2ZSBvZiB0aGUgc2Vjb25k
YXJ5IGNvbnRleHQgKGluIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZUNHLmgpLgogICAg
IENHQ29udGV4dFNhdmVHU3RhdGUocGxhdGZvcm1Db250ZXh0KCkpOwogICAgIG1fZGF0YS0+c2F2
ZSgpOwogfQpAQCAtOTEsNyArODksNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2F2ZVBsYXRm
b3JtU3RhdGUoCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6cmVzdG9yZVBsYXRmb3JtU3RhdGUoKQog
ewogICAgIC8vIE5vdGU6IERvIG5vdCB1c2UgdGhpcyBmdW5jdGlvbiB3aXRoaW4gdGhpcyBjbGFz
cyBpbXBsZW1lbnRhdGlvbiwgc2luY2Ugd2Ugd2FudCB0byBhdm9pZCB0aGUgZXh0cmEKLSAgICAv
LyByZXN0b3JlIG9mIHRoZSBzZWNvbmRhcnkgY29udGV4dCAoaW4gR3JhcGhpY3NDb250ZXh0UGxh
dGZvcm1Qcml2YXRlLmgpLgorICAgIC8vIHJlc3RvcmUgb2YgdGhlIHNlY29uZGFyeSBjb250ZXh0
IChpbiBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVDRy5oKS4KICAgICBDR0NvbnRleHRS
ZXN0b3JlR1N0YXRlKHBsYXRmb3JtQ29udGV4dCgpKTsKICAgICBtX2RhdGEtPnJlc3RvcmUoKTsK
ICAgICBtX2RhdGEtPm1fdXNlclRvRGV2aWNlVHJhbnNmb3JtS25vd25Ub0JlSWRlbnRpdHkgPSBm
YWxzZTsKQEAgLTkyNSw0ICs5MjMsMyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0Q29tcG9z
aXRlT3BlcmF0CiAgICAgCiB9CiAKLSNlbmRpZiAvLyBQTEFURk9STShDRykKSW5kZXg6IFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9HcmFwaGljc0NvbnRl
eHRQbGF0Zm9ybVByaXZhdGUuaAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2NnL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZS5oCSh3b3JraW5nIGNv
cHkpCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
LSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgotICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
Ci0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKLSAqLwotCi0jaW5jbHVkZSA8Q29yZUdyYXBo
aWNzL0NHQ29udGV4dC5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLWNsYXNzIEdyYXBoaWNz
Q29udGV4dFBsYXRmb3JtUHJpdmF0ZSB7Ci1wdWJsaWM6Ci0gICAgR3JhcGhpY3NDb250ZXh0UGxh
dGZvcm1Qcml2YXRlKENHQ29udGV4dFJlZiBjZ0NvbnRleHQpCi0gICAgICAgIDogbV9jZ0NvbnRl
eHQoY2dDb250ZXh0KQotI2lmIFBMQVRGT1JNKFdJTikKLSAgICAgICAgLCBtX2hkYygwKQotICAg
ICAgICAsIG1fdHJhbnNwYXJlbmN5Q291bnQoMCkKLSNlbmRpZgotICAgICAgICAsIG1fdXNlclRv
RGV2aWNlVHJhbnNmb3JtS25vd25Ub0JlSWRlbnRpdHkoZmFsc2UpCi0gICAgewotICAgICAgICBD
R0NvbnRleHRSZXRhaW4obV9jZ0NvbnRleHQpOwotICAgIH0KLSAgICAKLSAgICB+R3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlKCkKLSAgICB7Ci0gICAgICAgIENHQ29udGV4dFJlbGVhc2Uo
bV9jZ0NvbnRleHQpOwotICAgIH0KLQotI2lmIFBMQVRGT1JNKE1BQykKLSAgICAvLyBUaGVzZSBt
ZXRob2RzIGRvIG5vdGhpbmcgb24gTWFjLgotICAgIHZvaWQgc2F2ZSgpIHt9Ci0gICAgdm9pZCBy
ZXN0b3JlKCkge30KLSAgICB2b2lkIGNsaXAoY29uc3QgSW50UmVjdCYpIHt9Ci0gICAgdm9pZCBj
bGlwKGNvbnN0IFBhdGgmKSB7fQotICAgIHZvaWQgc2NhbGUoY29uc3QgRmxvYXRTaXplJikge30K
LSAgICB2b2lkIHJvdGF0ZShmbG9hdCkge30KLSAgICB2b2lkIHRyYW5zbGF0ZShmbG9hdCwgZmxv
YXQpIHt9Ci0gICAgdm9pZCBjb25jYXRDVE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJikge30KLSAg
ICB2b2lkIGJlZ2luVHJhbnNwYXJlbmN5TGF5ZXIoKSB7fQotICAgIHZvaWQgZW5kVHJhbnNwYXJl
bmN5TGF5ZXIoKSB7fQotI2VuZGlmCi0KLSNpZiBQTEFURk9STShXSU4pCi0gICAgLy8gT24gV2lu
ZG93cywgd2UgbmVlZCB0byB1cGRhdGUgdGhlIEhEQyBmb3IgZm9ybSBjb250cm9scyB0byBkcmF3
IGluIHRoZSByaWdodCBwbGFjZS4KLSAgICB2b2lkIHNhdmUoKTsKLSAgICB2b2lkIHJlc3RvcmUo
KTsKLSAgICB2b2lkIGNsaXAoY29uc3QgSW50UmVjdCYpOwotICAgIHZvaWQgY2xpcChjb25zdCBQ
YXRoJik7Ci0gICAgdm9pZCBzY2FsZShjb25zdCBGbG9hdFNpemUmKTsKLSAgICB2b2lkIHJvdGF0
ZShmbG9hdCk7Ci0gICAgdm9pZCB0cmFuc2xhdGUoZmxvYXQsIGZsb2F0KTsKLSAgICB2b2lkIGNv
bmNhdENUTShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mKTsKLSAgICB2b2lkIGJlZ2luVHJhbnNwYXJl
bmN5TGF5ZXIoKSB7IG1fdHJhbnNwYXJlbmN5Q291bnQrKzsgfQotICAgIHZvaWQgZW5kVHJhbnNw
YXJlbmN5TGF5ZXIoKSB7IG1fdHJhbnNwYXJlbmN5Q291bnQtLTsgfQotI2VuZGlmCi0KLSNpZiBQ
TEFURk9STShXSU4pCi0gICAgSERDIG1faGRjOwotICAgIHVuc2lnbmVkIG1fdHJhbnNwYXJlbmN5
Q291bnQ7Ci0jZW5kaWYKLQotICAgIENHQ29udGV4dFJlZiBtX2NnQ29udGV4dDsKLSAgICBib29s
IG1fdXNlclRvRGV2aWNlVHJhbnNmb3JtS25vd25Ub0JlSWRlbnRpdHk7Ci19OwotCi19CkluZGV4
OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NnL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZUNHLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9HcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVDRy5oCShyZXZpc2lvbiAyOTcyNikJKGZyb20gV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUu
aDoyOTcyNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvR3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlQ0cuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDg1IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENP
TVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09N
UFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKworI2luY2x1ZGUgPENvcmVHcmFwaGljcy9DR0NvbnRleHQuaD4KKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitjbGFzcyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUgewor
cHVibGljOgorICAgIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZShDR0NvbnRleHRSZWYg
Y2dDb250ZXh0KQorICAgICAgICA6IG1fY2dDb250ZXh0KGNnQ29udGV4dCkKKyNpZiBQTEFURk9S
TShXSU4pCisgICAgICAgICwgbV9oZGMoMCkKKyAgICAgICAgLCBtX3RyYW5zcGFyZW5jeUNvdW50
KDApCisjZW5kaWYKKyAgICAgICAgLCBtX3VzZXJUb0RldmljZVRyYW5zZm9ybUtub3duVG9CZUlk
ZW50aXR5KGZhbHNlKQorICAgIHsKKyAgICAgICAgQ0dDb250ZXh0UmV0YWluKG1fY2dDb250ZXh0
KTsKKyAgICB9CisgICAgCisgICAgfkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpCisg
ICAgeworICAgICAgICBDR0NvbnRleHRSZWxlYXNlKG1fY2dDb250ZXh0KTsKKyAgICB9CisKKyNp
ZiBQTEFURk9STShNQUMpCisgICAgLy8gVGhlc2UgbWV0aG9kcyBkbyBub3RoaW5nIG9uIE1hYy4K
KyAgICB2b2lkIHNhdmUoKSB7fQorICAgIHZvaWQgcmVzdG9yZSgpIHt9CisgICAgdm9pZCBjbGlw
KGNvbnN0IEludFJlY3QmKSB7fQorICAgIHZvaWQgY2xpcChjb25zdCBQYXRoJikge30KKyAgICB2
b2lkIHNjYWxlKGNvbnN0IEZsb2F0U2l6ZSYpIHt9CisgICAgdm9pZCByb3RhdGUoZmxvYXQpIHt9
CisgICAgdm9pZCB0cmFuc2xhdGUoZmxvYXQsIGZsb2F0KSB7fQorICAgIHZvaWQgY29uY2F0Q1RN
KGNvbnN0IEFmZmluZVRyYW5zZm9ybSYpIHt9CisgICAgdm9pZCBiZWdpblRyYW5zcGFyZW5jeUxh
eWVyKCkge30KKyAgICB2b2lkIGVuZFRyYW5zcGFyZW5jeUxheWVyKCkge30KKyNlbmRpZgorCisj
aWYgUExBVEZPUk0oV0lOKQorICAgIC8vIE9uIFdpbmRvd3MsIHdlIG5lZWQgdG8gdXBkYXRlIHRo
ZSBIREMgZm9yIGZvcm0gY29udHJvbHMgdG8gZHJhdyBpbiB0aGUgcmlnaHQgcGxhY2UuCisgICAg
dm9pZCBzYXZlKCk7CisgICAgdm9pZCByZXN0b3JlKCk7CisgICAgdm9pZCBjbGlwKGNvbnN0IElu
dFJlY3QmKTsKKyAgICB2b2lkIGNsaXAoY29uc3QgUGF0aCYpOworICAgIHZvaWQgc2NhbGUoY29u
c3QgRmxvYXRTaXplJik7CisgICAgdm9pZCByb3RhdGUoZmxvYXQpOworICAgIHZvaWQgdHJhbnNs
YXRlKGZsb2F0LCBmbG9hdCk7CisgICAgdm9pZCBjb25jYXRDVE0oY29uc3QgQWZmaW5lVHJhbnNm
b3JtJik7CisgICAgdm9pZCBiZWdpblRyYW5zcGFyZW5jeUxheWVyKCkgeyBtX3RyYW5zcGFyZW5j
eUNvdW50Kys7IH0KKyAgICB2b2lkIGVuZFRyYW5zcGFyZW5jeUxheWVyKCkgeyBtX3RyYW5zcGFy
ZW5jeUNvdW50LS07IH0KKyNlbmRpZgorCisjaWYgUExBVEZPUk0oV0lOKQorICAgIEhEQyBtX2hk
YzsKKyAgICB1bnNpZ25lZCBtX3RyYW5zcGFyZW5jeUNvdW50OworI2VuZGlmCisKKyAgICBDR0Nv
bnRleHRSZWYgbV9jZ0NvbnRleHQ7CisgICAgYm9vbCBtX3VzZXJUb0RldmljZVRyYW5zZm9ybUtu
b3duVG9CZUlkZW50aXR5OworfTsKKworfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jZy9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVDRy5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRl
Q0cuaAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NnL0dy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZUNHLmgJKHdvcmtpbmcgY29weSkKQEAgLTIzLDYg
KzIzLDEwIEBACiAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKICAqLwogCisjaW5jbHVkZSAiY29uZmlnLmgiCisK
KyNpZiBQTEFURk9STShDRykKKwogI2luY2x1ZGUgPENvcmVHcmFwaGljcy9DR0NvbnRleHQuaD4K
IAogbmFtZXNwYWNlIFdlYkNvcmUgewpAQCAtODIsNCArODYsNSBAQCBwdWJsaWM6CiAgICAgYm9v
bCBtX3VzZXJUb0RldmljZVRyYW5zZm9ybUtub3duVG9CZUlkZW50aXR5OwogfTsKIAorI2VuZGlm
CS8vIFBMQVRGT1JNIChDRykKIH0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0ZvbnRDR1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW4vRm9udENHV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCShmcm9tIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL0ZvbnRXaW4uY3BwOjI5ODM0KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW4vRm9udENHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDIyNyBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRm9udC5oIgor
CisjaW5jbHVkZSAiRm9udEZhbGxiYWNrTGlzdC5oIgorI2luY2x1ZGUgIkdseXBoQnVmZmVyLmgi
CisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiSW50UmVjdC5oIgorI2lu
Y2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIKKyNp
bmNsdWRlICJVbmlzY3JpYmVDb250cm9sbGVyLmgiCisjaW5jbHVkZSA8QXBwbGljYXRpb25TZXJ2
aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CisjaW5jbHVkZSA8V2ViS2l0U3lzdGVtSW50ZXJm
YWNlL1dlYktpdFN5c3RlbUludGVyZmFjZS5oPgorI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY29uc3QgaW50IHN5bnRoZXRpY09ibGlxdWVBbmds
ZSA9IDE0OworCit2b2lkIEZvbnQ6OmRyYXdHbHlwaHMoR3JhcGhpY3NDb250ZXh0KiBncmFwaGlj
c0NvbnRleHQsIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250LCBjb25zdCBHbHlwaEJ1ZmZlciYg
Z2x5cGhCdWZmZXIsIAorICAgICAgICAgICAgICAgICAgICAgIGludCBmcm9tLCBpbnQgbnVtR2x5
cGhzLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAgICBpZiAoZm9udC0+bV9m
b250LnVzZUdESSgpKSB7CisgICAgICAgIC8vIEZJWE1FOiBTdXBwb3J0IGFscGhhIGJsZW5kaW5n
LgorICAgICAgICAvLyBGSVhNRTogU3VwcG9ydCB0ZXh0IHN0cm9rZS9maWxsLgorICAgICAgICAv
LyBGSVhNRTogU3VwcG9ydCB0ZXh0IHNoYWRvdy4KKyAgICAgICAgQ29sb3IgZmlsbENvbG9yID0g
Z3JhcGhpY3NDb250ZXh0LT5maWxsQ29sb3IoKTsKKyAgICAgICAgaWYgKGZpbGxDb2xvci5hbHBo
YSgpID09IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gV2UgaGF2ZSB0byBj
b252ZXJ0IENHJ3MgdHdvLWRpbWVuc2lvbmFsIGZsb2F0aW5nIHBvaW50IGFkdmFuY2VzIHRvIGp1
c3QgaG9yaXpvbnRhbCBpbnRlZ2VyIGFkdmFuY2VzLgorICAgICAgICBWZWN0b3I8aW50LCAyMDQ4
PiBnZGlBZHZhbmNlczsKKyAgICAgICAgaW50IHRvdGFsV2lkdGggPSAwOworICAgICAgICBmb3Ig
KGludCBpID0gMDsgaSA8IG51bUdseXBoczsgaSsrKSB7CisgICAgICAgICAgICBnZGlBZHZhbmNl
cy5hcHBlbmQobHJvdW5kZihnbHlwaEJ1ZmZlci5hZHZhbmNlQXQoZnJvbSArIGkpKSk7CisgICAg
ICAgICAgICB0b3RhbFdpZHRoICs9IGdkaUFkdmFuY2VzW2ldOworICAgICAgICB9CisKKyAgICAg
ICAgLy8gV2UgcHV0IHNsb3AgaW50byB0aGlzIHJlY3QsIHNpbmNlIGdseXBocyBjYW4gb3ZlcmZs
b3cgdGhlIGFzY2VudC9kZXNjZW50IGJvdW5kcyBhbmQgdGhlIGxlZnQvcmlnaHQgZWRnZXMuCisg
ICAgICAgIGludCBsaW5lR2FwID0gZm9udC0+bGluZUdhcCgpOworICAgICAgICBJbnRSZWN0IHRl
eHRSZWN0KHBvaW50LngoKSAtIGxpbmVHYXAsIHBvaW50LnkoKSAtIGZvbnQtPmFzY2VudCgpIC0g
bGluZUdhcCwgdG90YWxXaWR0aCArIDIgKiBsaW5lR2FwLCBmb250LT5saW5lU3BhY2luZygpKTsK
KyAgICAgICAgSERDIGhkYyA9IGdyYXBoaWNzQ29udGV4dC0+Z2V0V2luZG93c0NvbnRleHQodGV4
dFJlY3QpOworICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBmb250LT5tX2ZvbnQuaGZvbnQoKSk7
CisKKyAgICAgICAgLy8gU2V0IHRoZSBjb3JyZWN0IGNvbG9yLgorICAgICAgICBIREMgdGV4dERy
YXdpbmdEQyA9IGhkYzsKKyAgICAgICAgLyppZiAoZmlsbENvbG9yLmhhc0FscGhhKCkgfHwgZ3Jh
cGhpY3NDb250ZXh0LT5pblRyYW5zcGFyZW5jeUxheWVyKCkpIHsKKyAgICAgICAgICAgIC8vIEdE
SSBjYW4ndCBoYW5kbGUgZHJhd2luZyB0cmFuc3BhcmVudCB0ZXh0LiAgV2UgaGF2ZSB0byBkcmF3
IGludG8gYSBtYXNrLiAgV2UgZHJhdyBibGFjayB0ZXh0IG9uIGEgd2hpdGUtZmlsbGVkIGJhY2tn
cm91bmQuCisgICAgICAgICAgICAvLyBXZSBhbHNvIGRvIHRoaXMgd2hlbiBpbnNpZGUgdHJhbnNw
YXJlbmN5IGxheWVycywgc2luY2UgR0RJIGFsc28gY2FuJ3QgZHJhdyBvbnRvIGEgc3VyZmFjZSB3
aXRoIGFscGhhLgorICAgICAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5zYXZlKCk7CisgICAgICAg
ICAgICBncmFwaGljc0NvbnRleHQtPnNldEZpbGxDb2xvcihDb2xvcjo6d2hpdGUpOworICAgICAg
ICAgICAgdGV4dERyYXdpbmdEQyA9IGdyYXBoaWNzQ29udGV4dC0+Z2V0V2luZG93c0JpdG1hcENv
bnRleHQodGV4dFJlY3QpOworICAgICAgICAgICAgU2V0VGV4dENvbG9yKGhkYywgUkdCKDAsIDAs
IDApKTsKKyAgICAgICAgfSBlbHNlKi8KKyAgICAgICAgICAgIFNldFRleHRDb2xvcihoZGMsIFJH
QihmaWxsQ29sb3IucmVkKCksIGZpbGxDb2xvci5ncmVlbigpLCBmaWxsQ29sb3IuYmx1ZSgpKSk7
CisKKyAgICAgICAgU2V0QmtNb2RlKGhkYywgVFJBTlNQQVJFTlQpOworICAgICAgICBTZXRUZXh0
QWxpZ24oaGRjLCBUQV9MRUZUIHwgVEFfQkFTRUxJTkUpOworCisgICAgICAgIC8vIFVuaXNjcmli
ZSBnaXZlcyB1cyBvZmZzZXRzIHRvIGhlbHAgcmVmaW5lIHRoZSBwb3NpdGlvbmluZyBvZiBjb21i
aW5pbmcgZ2x5cGhzLgorICAgICAgICBGbG9hdFNpemUgdHJhbnNsYXRpb24gPSBnbHlwaEJ1ZmZl
ci5vZmZzZXRBdChmcm9tKTsKKyAgICAgICAgaWYgKHRyYW5zbGF0aW9uLndpZHRoKCkgfHwgdHJh
bnNsYXRpb24uaGVpZ2h0KCkpIHsKKyAgICAgICAgICAgIFhGT1JNIHhmb3JtOworICAgICAgICAg
ICAgeGZvcm0uZU0xMSA9IDEuMDsKKyAgICAgICAgICAgIHhmb3JtLmVNMTIgPSAwOworICAgICAg
ICAgICAgeGZvcm0uZU0yMSA9IDA7CisgICAgICAgICAgICB4Zm9ybS5lTTIyID0gMS4wOworICAg
ICAgICAgICAgeGZvcm0uZUR4ID0gdHJhbnNsYXRpb24ud2lkdGgoKTsKKyAgICAgICAgICAgIHhm
b3JtLmVEeSA9IHRyYW5zbGF0aW9uLmhlaWdodCgpOworICAgICAgICAgICAgTW9kaWZ5V29ybGRU
cmFuc2Zvcm0oaGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOworICAgICAgICB9CisgICAg
ICAgIEV4dFRleHRPdXQoaGRjLCBwb2ludC54KCksIHBvaW50LnkoKSwgRVRPX0dMWVBIX0lOREVY
LCAwLCAoV0NIQVIqKWdseXBoQnVmZmVyLmdseXBocyhmcm9tKSwgbnVtR2x5cGhzLCBnZGlBZHZh
bmNlcy5kYXRhKCkpOworCisgICAgICAgIC8qaWYgKGZpbGxDb2xvci5oYXNBbHBoYSgpIHx8IGdy
YXBoaWNzQ29udGV4dC0+aW5UcmFuc3BhcmVuY3lMYXllcigpKSB7CisgICAgICAgICAgICAvLyBU
T0RPRDogV2UgaGF2ZSB0byB3YWxrIHRoZSBiaXRzIG9mIHRoZSBiaXRtYXAgYW5kIGludmVydCB0
aGVtLiAgV2UgYWxzbyBjb3B5IG92ZXIgdGhlIGdyZWVuIGNvbXBvbmVudCB2YWx1ZSBpbnRvIHRo
ZSBhbHBoYSB2YWx1ZQorICAgICAgICAgICAgLy8gdG8ga2VlcCBDbGVhclR5cGUgbG9va2luZyBy
ZWFzb25hYmxlLgorCisgICAgICAgICAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGRyYXduIHRoZSB0
ZXh0IGludG8gYSBiaXRtYXAgYW5kIGludmVydGVkIGl0LCBvYnRhaW4gYSBDR0ltYWdlUmVmIG1h
c2suCisgICAgICAgICAgICBDR0ltYWdlUmVmIG1hc2sgPSBncmFwaGljc0NvbnRleHQtPnJlbGVh
c2VXaW5kb3dzQml0bWFwQ29udGV4dEludG9NYXNrKHRleHREcmF3aW5nREMsIHRleHRSZWN0KTsK
KyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gQXBwbHkgdGhlIG1hc2sgdG8gdGhlIGZpbGwg
Y29sb3IuCisgICAgICAgICAgICBDR0NvbnRleHRSZWYgYml0bWFwQ29udGV4dCA9IGdyYXBoaWNz
Q29udGV4dC0+Z2V0V2luZG93c0NvbXBhdGlibGVDR0JpdG1hcENvbnRleHQodGV4dFJlY3Quc2l6
ZSgpKTsKKyAgICAgICAgICAgIENHRmxvYXQgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGE7CisgICAg
ICAgICAgICBjb2xvci5nZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAgICAgICAg
ICAgIENHQ29udGV4dFNldFJHQkZpbGxDb2xvcihjb250ZXh0LCByZWQsIGdyZWVuLCBibHVlLCBh
bHBoYSk7CisgICAgICAgICAgICBDR0NvbnRleHRGaWxsUmVjdChiaXRtYXBDb250ZXh0LCBJbnRS
ZWN0KDAsIDAsIHRleHRSZWN0LndpZHRoKCksIHRleHRSZWN0LmhlaWdodCgpKSk7CisgICAgICAg
ICAgICBDR0ltYWdlUmVmIGZpbGxDb2xvckltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlSW1h
Z2UoYml0bWFwQ29udGV4dCk7CisgICAgICAgIAorICAgICAgICAgICAgLy8gQXBwbHkgdGhlIG1h
c2suCisgICAgICAgICAgICBDR0ltYWdlUmVmIGZpbmFsSW1hZ2UgPSBDR0ltYWdlQ3JlYXRlV2l0
aE1hc2soZmlsbENvbG9ySW1hZ2UsIG1hc2spOworCisgICAgICAgICAgICAvLyBUaGUgYml0bWFw
IGltYWdlIG5lZWRzIHRvIGJlIGRyYXduIGludG8gdGhlIEhEQy4KKyAgICAgICAgICAgIGdyYXBo
aWNzQ29udGV4dC0+ZHJhd0ltYWdlSW50b1dpbmRvd3NDb250ZXh0KGhkYywgZmluYWxJbWFnZSk7
CisKKyAgICAgICAgICAgIC8vIFJlbGVhc2Ugb3VyIGltYWdlcyBhbmQgY29udGV4dHMuCisgICAg
ICAgICAgICBDR0ltYWdlUmVsZWFzZShtYXNrKTsKKyAgICAgICAgICAgIENHSW1hZ2VSZWxlYXNl
KGZpbGxDb2xvckltYWdlKTsKKyAgICAgICAgICAgIENHSW1hZ2VSZWxlYXNlKGZpbmFsSW1hZ2Up
OworICAgICAgICAgICAgQ0dDb250ZXh0UmVsZWFzZShiaXRtYXBDb250ZXh0KTsKKyAgICAgICAg
fSovCisKKyAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5yZWxlYXNlV2luZG93c0NvbnRleHQoaGRj
LCB0ZXh0UmVjdCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDR0NvbnRleHRSZWYg
Y2dDb250ZXh0ID0gZ3JhcGhpY3NDb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKKworICAgIHVp
bnQzMl90IG9sZEZvbnRTbW9vdGhpbmdTdHlsZSA9IHdrU2V0Rm9udFNtb290aGluZ1N0eWxlKGNn
Q29udGV4dCk7CisKKyAgICBjb25zdCBGb250UGxhdGZvcm1EYXRhJiBwbGF0Zm9ybURhdGEgPSBm
b250LT5wbGF0Zm9ybURhdGEoKTsKKworICAgIENHQ29udGV4dFNldEZvbnQoY2dDb250ZXh0LCBw
bGF0Zm9ybURhdGEuY2dGb250KCkpOworCisgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbWF0cml4ID0g
Q0dBZmZpbmVUcmFuc2Zvcm1JZGVudGl0eTsKKyAgICBtYXRyaXguYiA9IC1tYXRyaXguYjsKKyAg
ICBtYXRyaXguZCA9IC1tYXRyaXguZDsKKworICAgIGlmIChwbGF0Zm9ybURhdGEuc3ludGhldGlj
T2JsaXF1ZSgpKQorICAgIHsKKyAgICAgICAgc3RhdGljIGZsb2F0IHNrZXcgPSAtdGFuZihzeW50
aGV0aWNPYmxpcXVlQW5nbGUgKiBhY29zZigwKSAvIDkwKTsKKyAgICAgICAgbWF0cml4ID0gQ0dB
ZmZpbmVUcmFuc2Zvcm1Db25jYXQobWF0cml4LCBDR0FmZmluZVRyYW5zZm9ybU1ha2UoMSwgMCwg
c2tldywgMSwgMCwgMCkpOworICAgIH0KKworICAgIC8vIFVuaXNjcmliZSBnaXZlcyB1cyBvZmZz
ZXRzIHRvIGhlbHAgcmVmaW5lIHRoZSBwb3NpdGlvbmluZyBvZiBjb21iaW5pbmcgZ2x5cGhzLgor
ICAgIEZsb2F0U2l6ZSB0cmFuc2xhdGlvbiA9IGdseXBoQnVmZmVyLm9mZnNldEF0KGZyb20pOwor
ICAgIGlmICh0cmFuc2xhdGlvbi53aWR0aCgpIHx8IHRyYW5zbGF0aW9uLmhlaWdodCgpKQorICAg
ICAgICBDR0FmZmluZVRyYW5zZm9ybVRyYW5zbGF0ZShtYXRyaXgsIHRyYW5zbGF0aW9uLndpZHRo
KCksIHRyYW5zbGF0aW9uLmhlaWdodCgpKTsKKyAgICAKKyAgICBDR0NvbnRleHRTZXRUZXh0TWF0
cml4KGNnQ29udGV4dCwgbWF0cml4KTsKKworICAgIENHQ29udGV4dFNldEZvbnRTaXplKGNnQ29u
dGV4dCwgcGxhdGZvcm1EYXRhLnNpemUoKSk7CisgICAgQ0dDb250ZXh0U2V0VGV4dFBvc2l0aW9u
KGNnQ29udGV4dCwgcG9pbnQueCgpLCBwb2ludC55KCkpOworICAgIENHQ29udGV4dFNob3dHbHlw
aHNXaXRoQWR2YW5jZXMoY2dDb250ZXh0LCBnbHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSksIGdseXBo
QnVmZmVyLmFkdmFuY2VzKGZyb20pLCBudW1HbHlwaHMpOworICAgIGlmIChmb250LT5tX3N5bnRo
ZXRpY0JvbGRPZmZzZXQpIHsKKyAgICAgICAgQ0dDb250ZXh0U2V0VGV4dFBvc2l0aW9uKGNnQ29u
dGV4dCwgcG9pbnQueCgpICsgZm9udC0+bV9zeW50aGV0aWNCb2xkT2Zmc2V0LCBwb2ludC55KCkp
OworICAgICAgICBDR0NvbnRleHRTaG93R2x5cGhzV2l0aEFkdmFuY2VzKGNnQ29udGV4dCwgZ2x5
cGhCdWZmZXIuZ2x5cGhzKGZyb20pLCBnbHlwaEJ1ZmZlci5hZHZhbmNlcyhmcm9tKSwgbnVtR2x5
cGhzKTsKKyAgICB9CisKKyAgICB3a1Jlc3RvcmVGb250U21vb3RoaW5nU3R5bGUoY2dDb250ZXh0
LCBvbGRGb250U21vb3RoaW5nU3R5bGUpOworfQorCitGbG9hdFJlY3QgRm9udDo6c2VsZWN0aW9u
UmVjdEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgSW50UG9pbnQmIHBv
aW50LCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aW50IGZyb20sIGludCB0bykgY29uc3QKK3sKKyAgICBVbmlzY3JpYmVDb250cm9sbGVyIGl0KHRo
aXMsIHJ1bik7CisgICAgaXQuYWR2YW5jZShmcm9tKTsKKyAgICBmbG9hdCBiZWZvcmVXaWR0aCA9
IGl0LnJ1bldpZHRoU29GYXIoKTsKKyAgICBpdC5hZHZhbmNlKHRvKTsKKyAgICBmbG9hdCBhZnRl
cldpZHRoID0gaXQucnVuV2lkdGhTb0ZhcigpOworCisgICAgLy8gVXNpbmcgcm91bmRmKCkgcmF0
aGVyIHRoYW4gY2VpbGYoKSBmb3IgdGhlIHJpZ2h0IGVkZ2UgYXMgYSBjb21wcm9taXNlIHRvIGVu
c3VyZSBjb3JyZWN0IGNhcmV0IHBvc2l0aW9uaW5nCisgICAgaWYgKHJ1bi5ydGwoKSkgeworICAg
ICAgICBpdC5hZHZhbmNlKHJ1bi5sZW5ndGgoKSk7CisgICAgICAgIGZsb2F0IHRvdGFsV2lkdGgg
PSBpdC5ydW5XaWR0aFNvRmFyKCk7CisgICAgICAgIHJldHVybiBGbG9hdFJlY3QocG9pbnQueCgp
ICsgZmxvb3JmKHRvdGFsV2lkdGggLSBhZnRlcldpZHRoKSwgcG9pbnQueSgpLCByb3VuZGYodG90
YWxXaWR0aCAtIGJlZm9yZVdpZHRoKSAtIGZsb29yZih0b3RhbFdpZHRoIC0gYWZ0ZXJXaWR0aCks
IGgpOworICAgIH0gCisgICAgCisgICAgcmV0dXJuIEZsb2F0UmVjdChwb2ludC54KCkgKyBmbG9v
cmYoYmVmb3JlV2lkdGgpLCBwb2ludC55KCksIHJvdW5kZihhZnRlcldpZHRoKSAtIGZsb29yZihi
ZWZvcmVXaWR0aCksIGgpOworfQorCit2b2lkIEZvbnQ6OmRyYXdDb21wbGV4VGV4dChHcmFwaGlj
c0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYg
cG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IHRvKSBjb25z
dAoreworICAgIC8vIFRoaXMgZ2x5cGggYnVmZmVyIGhvbGRzIG91ciBnbHlwaHMgKyBhZHZhbmNl
cyArIGZvbnQgZGF0YSBmb3IgZWFjaCBnbHlwaC4KKyAgICBHbHlwaEJ1ZmZlciBnbHlwaEJ1ZmZl
cjsKKworICAgIGZsb2F0IHN0YXJ0WCA9IHBvaW50LngoKTsKKyAgICBVbmlzY3JpYmVDb250cm9s
bGVyIGNvbnRyb2xsZXIodGhpcywgcnVuKTsKKyAgICBjb250cm9sbGVyLmFkdmFuY2UoZnJvbSk7
CisgICAgZmxvYXQgYmVmb3JlV2lkdGggPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKTsKKyAg
ICBjb250cm9sbGVyLmFkdmFuY2UodG8sICZnbHlwaEJ1ZmZlcik7CisgICAgCisgICAgLy8gV2Ug
Y291bGRuJ3QgZ2VuZXJhdGUgYW55IGdseXBocyBmb3IgdGhlIHJ1bi4gIEdpdmUgdXAuCisgICAg
aWYgKGdseXBoQnVmZmVyLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIGZs
b2F0IGFmdGVyV2lkdGggPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKTsKKworICAgIGlmIChy
dW4ucnRsKCkpIHsKKyAgICAgICAgY29udHJvbGxlci5hZHZhbmNlKHJ1bi5sZW5ndGgoKSk7Cisg
ICAgICAgIHN0YXJ0WCArPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKSAtIGFmdGVyV2lkdGg7
CisgICAgfSBlbHNlCisgICAgICAgIHN0YXJ0WCArPSBiZWZvcmVXaWR0aDsKKworICAgIC8vIERy
YXcgdGhlIGdseXBoIGJ1ZmZlciBub3cgYXQgdGhlIHN0YXJ0aW5nIHBvaW50IHJldHVybmVkIGlu
IHN0YXJ0WC4KKyAgICBGbG9hdFBvaW50IHN0YXJ0UG9pbnQoc3RhcnRYLCBwb2ludC55KCkpOwor
ICAgIGRyYXdHbHlwaEJ1ZmZlcihjb250ZXh0LCBnbHlwaEJ1ZmZlciwgcnVuLCBzdGFydFBvaW50
KTsKK30KKworZmxvYXQgRm9udDo6ZmxvYXRXaWR0aEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRS
dW4mIHJ1bikgY29uc3QKK3sKKyAgICBVbmlzY3JpYmVDb250cm9sbGVyIGNvbnRyb2xsZXIodGhp
cywgcnVuKTsKKyAgICBjb250cm9sbGVyLmFkdmFuY2UocnVuLmxlbmd0aCgpKTsKKyAgICByZXR1
cm4gY29udHJvbGxlci5ydW5XaWR0aFNvRmFyKCk7Cit9CisKK2ludCBGb250OjpvZmZzZXRGb3JQ
b3NpdGlvbkZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgaW50IHgsIGJvb2wgaW5j
bHVkZVBhcnRpYWxHbHlwaHMpIGNvbnN0Cit7CisgICAgVW5pc2NyaWJlQ29udHJvbGxlciBjb250
cm9sbGVyKHRoaXMsIHJ1bik7CisgICAgcmV0dXJuIGNvbnRyb2xsZXIub2Zmc2V0Rm9yUG9zaXRp
b24oeCwgaW5jbHVkZVBhcnRpYWxHbHlwaHMpOworfQorCit9CkluZGV4OiBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbi9Gb250Q0dXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDR1dpbi5jcHAJKHJldmlzaW9uIDI5NzI2KQorKysgV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENHV2luLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5j
LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAw
OCBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCkBAIC0yNiwxMSArMjYsOSBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1
ZGUgIkZvbnQuaCIKIAotI2luY2x1ZGUgIkZvbnRGYWxsYmFja0xpc3QuaCIKICNpbmNsdWRlICJH
bHlwaEJ1ZmZlci5oIgogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2luY2x1ZGUgIklu
dFJlY3QuaCIKLSNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1ZGUgIlNpbXBsZUZv
bnREYXRhLmgiCiAjaW5jbHVkZSAiVW5pc2NyaWJlQ29udHJvbGxlci5oIgogI2luY2x1ZGUgPEFw
cGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgpAQCAtNjgsMTUgKzY2LDcg
QEAgdm9pZCBGb250OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCogZwogCiAgICAgICAgIC8v
IFNldCB0aGUgY29ycmVjdCBjb2xvci4KICAgICAgICAgSERDIHRleHREcmF3aW5nREMgPSBoZGM7
Ci0gICAgICAgIC8qaWYgKGZpbGxDb2xvci5oYXNBbHBoYSgpIHx8IGdyYXBoaWNzQ29udGV4dC0+
aW5UcmFuc3BhcmVuY3lMYXllcigpKSB7Ci0gICAgICAgICAgICAvLyBHREkgY2FuJ3QgaGFuZGxl
IGRyYXdpbmcgdHJhbnNwYXJlbnQgdGV4dC4gIFdlIGhhdmUgdG8gZHJhdyBpbnRvIGEgbWFzay4g
IFdlIGRyYXcgYmxhY2sgdGV4dCBvbiBhIHdoaXRlLWZpbGxlZCBiYWNrZ3JvdW5kLgotICAgICAg
ICAgICAgLy8gV2UgYWxzbyBkbyB0aGlzIHdoZW4gaW5zaWRlIHRyYW5zcGFyZW5jeSBsYXllcnMs
IHNpbmNlIEdESSBhbHNvIGNhbid0IGRyYXcgb250byBhIHN1cmZhY2Ugd2l0aCBhbHBoYS4KLSAg
ICAgICAgICAgIGdyYXBoaWNzQ29udGV4dC0+c2F2ZSgpOwotICAgICAgICAgICAgZ3JhcGhpY3ND
b250ZXh0LT5zZXRGaWxsQ29sb3IoQ29sb3I6OndoaXRlKTsKLSAgICAgICAgICAgIHRleHREcmF3
aW5nREMgPSBncmFwaGljc0NvbnRleHQtPmdldFdpbmRvd3NCaXRtYXBDb250ZXh0KHRleHRSZWN0
KTsKLSAgICAgICAgICAgIFNldFRleHRDb2xvcihoZGMsIFJHQigwLCAwLCAwKSk7Ci0gICAgICAg
IH0gZWxzZSovCi0gICAgICAgICAgICBTZXRUZXh0Q29sb3IoaGRjLCBSR0IoZmlsbENvbG9yLnJl
ZCgpLCBmaWxsQ29sb3IuZ3JlZW4oKSwgZmlsbENvbG9yLmJsdWUoKSkpOworICAgICAgICBTZXRU
ZXh0Q29sb3IoaGRjLCBSR0IoZmlsbENvbG9yLnJlZCgpLCBmaWxsQ29sb3IuZ3JlZW4oKSwgZmls
bENvbG9yLmJsdWUoKSkpOwogCiAgICAgICAgIFNldEJrTW9kZShoZGMsIFRSQU5TUEFSRU5UKTsK
ICAgICAgICAgU2V0VGV4dEFsaWduKGhkYywgVEFfTEVGVCB8IFRBX0JBU0VMSU5FKTsKQEAgLTk1
LDM0ICs4NSw2IEBAIHZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQqIGcKICAg
ICAgICAgfQogICAgICAgICBFeHRUZXh0T3V0KGhkYywgcG9pbnQueCgpLCBwb2ludC55KCksIEVU
T19HTFlQSF9JTkRFWCwgMCwgKFdDSEFSKilnbHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSksIG51bUds
eXBocywgZ2RpQWR2YW5jZXMuZGF0YSgpKTsKIAotICAgICAgICAvKmlmIChmaWxsQ29sb3IuaGFz
QWxwaGEoKSB8fCBncmFwaGljc0NvbnRleHQtPmluVHJhbnNwYXJlbmN5TGF5ZXIoKSkgewotICAg
ICAgICAgICAgLy8gVE9ET0Q6IFdlIGhhdmUgdG8gd2FsayB0aGUgYml0cyBvZiB0aGUgYml0bWFw
IGFuZCBpbnZlcnQgdGhlbS4gIFdlIGFsc28gY29weSBvdmVyIHRoZSBncmVlbiBjb21wb25lbnQg
dmFsdWUgaW50byB0aGUgYWxwaGEgdmFsdWUKLSAgICAgICAgICAgIC8vIHRvIGtlZXAgQ2xlYXJU
eXBlIGxvb2tpbmcgcmVhc29uYWJsZS4KLQotICAgICAgICAgICAgLy8gTm93IHRoYXQgd2UgaGF2
ZSBkcmF3biB0aGUgdGV4dCBpbnRvIGEgYml0bWFwIGFuZCBpbnZlcnRlZCBpdCwgb2J0YWluIGEg
Q0dJbWFnZVJlZiBtYXNrLgotICAgICAgICAgICAgQ0dJbWFnZVJlZiBtYXNrID0gZ3JhcGhpY3ND
b250ZXh0LT5yZWxlYXNlV2luZG93c0JpdG1hcENvbnRleHRJbnRvTWFzayh0ZXh0RHJhd2luZ0RD
LCB0ZXh0UmVjdCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEFwcGx5IHRoZSBtYXNr
IHRvIHRoZSBmaWxsIGNvbG9yLgotICAgICAgICAgICAgQ0dDb250ZXh0UmVmIGJpdG1hcENvbnRl
eHQgPSBncmFwaGljc0NvbnRleHQtPmdldFdpbmRvd3NDb21wYXRpYmxlQ0dCaXRtYXBDb250ZXh0
KHRleHRSZWN0LnNpemUoKSk7Ci0gICAgICAgICAgICBDR0Zsb2F0IHJlZCwgZ3JlZW4sIGJsdWUs
IGFscGhhOwotICAgICAgICAgICAgY29sb3IuZ2V0UkdCQShyZWQsIGdyZWVuLCBibHVlLCBhbHBo
YSk7Ci0gICAgICAgICAgICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoY29udGV4dCwgcmVkLCBn
cmVlbiwgYmx1ZSwgYWxwaGEpOwotICAgICAgICAgICAgQ0dDb250ZXh0RmlsbFJlY3QoYml0bWFw
Q29udGV4dCwgSW50UmVjdCgwLCAwLCB0ZXh0UmVjdC53aWR0aCgpLCB0ZXh0UmVjdC5oZWlnaHQo
KSkpOwotICAgICAgICAgICAgQ0dJbWFnZVJlZiBmaWxsQ29sb3JJbWFnZSA9IENHQml0bWFwQ29u
dGV4dENyZWF0ZUltYWdlKGJpdG1hcENvbnRleHQpOwotICAgICAgICAKLSAgICAgICAgICAgIC8v
IEFwcGx5IHRoZSBtYXNrLgotICAgICAgICAgICAgQ0dJbWFnZVJlZiBmaW5hbEltYWdlID0gQ0dJ
bWFnZUNyZWF0ZVdpdGhNYXNrKGZpbGxDb2xvckltYWdlLCBtYXNrKTsKLQotICAgICAgICAgICAg
Ly8gVGhlIGJpdG1hcCBpbWFnZSBuZWVkcyB0byBiZSBkcmF3biBpbnRvIHRoZSBIREMuCi0gICAg
ICAgICAgICBncmFwaGljc0NvbnRleHQtPmRyYXdJbWFnZUludG9XaW5kb3dzQ29udGV4dChoZGMs
IGZpbmFsSW1hZ2UpOwotCi0gICAgICAgICAgICAvLyBSZWxlYXNlIG91ciBpbWFnZXMgYW5kIGNv
bnRleHRzLgotICAgICAgICAgICAgQ0dJbWFnZVJlbGVhc2UobWFzayk7Ci0gICAgICAgICAgICBD
R0ltYWdlUmVsZWFzZShmaWxsQ29sb3JJbWFnZSk7Ci0gICAgICAgICAgICBDR0ltYWdlUmVsZWFz
ZShmaW5hbEltYWdlKTsKLSAgICAgICAgICAgIENHQ29udGV4dFJlbGVhc2UoYml0bWFwQ29udGV4
dCk7Ci0gICAgICAgIH0qLwotCiAgICAgICAgIGdyYXBoaWNzQ29udGV4dC0+cmVsZWFzZVdpbmRv
d3NDb250ZXh0KGhkYywgdGV4dFJlY3QpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTM5
LDkgKzEwMSw4IEBAIHZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQqIGcKICAg
ICBtYXRyaXguYiA9IC1tYXRyaXguYjsKICAgICBtYXRyaXguZCA9IC1tYXRyaXguZDsKIAotICAg
IGlmIChwbGF0Zm9ybURhdGEuc3ludGhldGljT2JsaXF1ZSgpKQotICAgIHsKLSAgICAgICAgc3Rh
dGljIGZsb2F0IHNrZXcgPSAtdGFuZihzeW50aGV0aWNPYmxpcXVlQW5nbGUgKiBhY29zZigwKSAv
IDkwKTsKKyAgICBpZiAocGxhdGZvcm1EYXRhLnN5bnRoZXRpY09ibGlxdWUoKSkgeworICAgICAg
ICBzdGF0aWMgZmxvYXQgc2tldyA9IC10YW5mKHN5bnRoZXRpY09ibGlxdWVBbmdsZSAqIGFjb3Nm
KDApIC8gOTAuMGYpOwogICAgICAgICBtYXRyaXggPSBDR0FmZmluZVRyYW5zZm9ybUNvbmNhdCht
YXRyaXgsIENHQWZmaW5lVHJhbnNmb3JtTWFrZSgxLCAwLCBza2V3LCAxLCAwLCAwKSk7CiAgICAg
fQogCkBAIC0xNjMsNjUgKzEyNCw0IEBAIHZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFwaGljc0Nv
bnRleHQqIGcKICAgICB3a1Jlc3RvcmVGb250U21vb3RoaW5nU3R5bGUoY2dDb250ZXh0LCBvbGRG
b250U21vb3RoaW5nU3R5bGUpOwogfQogCi1GbG9hdFJlY3QgRm9udDo6c2VsZWN0aW9uUmVjdEZv
ckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgSW50UG9pbnQmIHBvaW50LCBp
bnQgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZy
b20sIGludCB0bykgY29uc3QKLXsKLSAgICBVbmlzY3JpYmVDb250cm9sbGVyIGl0KHRoaXMsIHJ1
bik7Ci0gICAgaXQuYWR2YW5jZShmcm9tKTsKLSAgICBmbG9hdCBiZWZvcmVXaWR0aCA9IGl0LnJ1
bldpZHRoU29GYXIoKTsKLSAgICBpdC5hZHZhbmNlKHRvKTsKLSAgICBmbG9hdCBhZnRlcldpZHRo
ID0gaXQucnVuV2lkdGhTb0ZhcigpOwotCi0gICAgLy8gVXNpbmcgcm91bmRmKCkgcmF0aGVyIHRo
YW4gY2VpbGYoKSBmb3IgdGhlIHJpZ2h0IGVkZ2UgYXMgYSBjb21wcm9taXNlIHRvIGVuc3VyZSBj
b3JyZWN0IGNhcmV0IHBvc2l0aW9uaW5nCi0gICAgaWYgKHJ1bi5ydGwoKSkgewotICAgICAgICBp
dC5hZHZhbmNlKHJ1bi5sZW5ndGgoKSk7Ci0gICAgICAgIGZsb2F0IHRvdGFsV2lkdGggPSBpdC5y
dW5XaWR0aFNvRmFyKCk7Ci0gICAgICAgIHJldHVybiBGbG9hdFJlY3QocG9pbnQueCgpICsgZmxv
b3JmKHRvdGFsV2lkdGggLSBhZnRlcldpZHRoKSwgcG9pbnQueSgpLCByb3VuZGYodG90YWxXaWR0
aCAtIGJlZm9yZVdpZHRoKSAtIGZsb29yZih0b3RhbFdpZHRoIC0gYWZ0ZXJXaWR0aCksIGgpOwot
ICAgIH0gCi0gICAgCi0gICAgcmV0dXJuIEZsb2F0UmVjdChwb2ludC54KCkgKyBmbG9vcmYoYmVm
b3JlV2lkdGgpLCBwb2ludC55KCksIHJvdW5kZihhZnRlcldpZHRoKSAtIGZsb29yZihiZWZvcmVX
aWR0aCksIGgpOwotfQotCi12b2lkIEZvbnQ6OmRyYXdDb21wbGV4VGV4dChHcmFwaGljc0NvbnRl
eHQqIGNvbnRleHQsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQs
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAotewot
ICAgIC8vIFRoaXMgZ2x5cGggYnVmZmVyIGhvbGRzIG91ciBnbHlwaHMgKyBhZHZhbmNlcyArIGZv
bnQgZGF0YSBmb3IgZWFjaCBnbHlwaC4KLSAgICBHbHlwaEJ1ZmZlciBnbHlwaEJ1ZmZlcjsKLQot
ICAgIGZsb2F0IHN0YXJ0WCA9IHBvaW50LngoKTsKLSAgICBVbmlzY3JpYmVDb250cm9sbGVyIGNv
bnRyb2xsZXIodGhpcywgcnVuKTsKLSAgICBjb250cm9sbGVyLmFkdmFuY2UoZnJvbSk7Ci0gICAg
ZmxvYXQgYmVmb3JlV2lkdGggPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKTsKLSAgICBjb250
cm9sbGVyLmFkdmFuY2UodG8sICZnbHlwaEJ1ZmZlcik7Ci0gICAgCi0gICAgLy8gV2UgY291bGRu
J3QgZ2VuZXJhdGUgYW55IGdseXBocyBmb3IgdGhlIHJ1bi4gIEdpdmUgdXAuCi0gICAgaWYgKGds
eXBoQnVmZmVyLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIGZsb2F0IGFm
dGVyV2lkdGggPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKTsKLQotICAgIGlmIChydW4ucnRs
KCkpIHsKLSAgICAgICAgY29udHJvbGxlci5hZHZhbmNlKHJ1bi5sZW5ndGgoKSk7Ci0gICAgICAg
IHN0YXJ0WCArPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKSAtIGFmdGVyV2lkdGg7Ci0gICAg
fSBlbHNlCi0gICAgICAgIHN0YXJ0WCArPSBiZWZvcmVXaWR0aDsKLQotICAgIC8vIERyYXcgdGhl
IGdseXBoIGJ1ZmZlciBub3cgYXQgdGhlIHN0YXJ0aW5nIHBvaW50IHJldHVybmVkIGluIHN0YXJ0
WC4KLSAgICBGbG9hdFBvaW50IHN0YXJ0UG9pbnQoc3RhcnRYLCBwb2ludC55KCkpOwotICAgIGRy
YXdHbHlwaEJ1ZmZlcihjb250ZXh0LCBnbHlwaEJ1ZmZlciwgcnVuLCBzdGFydFBvaW50KTsKLX0K
LQotZmxvYXQgRm9udDo6ZmxvYXRXaWR0aEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1
bikgY29uc3QKLXsKLSAgICBVbmlzY3JpYmVDb250cm9sbGVyIGNvbnRyb2xsZXIodGhpcywgcnVu
KTsKLSAgICBjb250cm9sbGVyLmFkdmFuY2UocnVuLmxlbmd0aCgpKTsKLSAgICByZXR1cm4gY29u
dHJvbGxlci5ydW5XaWR0aFNvRmFyKCk7Ci19Ci0KLWludCBGb250OjpvZmZzZXRGb3JQb3NpdGlv
bkZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgaW50IHgsIGJvb2wgaW5jbHVkZVBh
cnRpYWxHbHlwaHMpIGNvbnN0Ci17Ci0gICAgVW5pc2NyaWJlQ29udHJvbGxlciBjb250cm9sbGVy
KHRoaXMsIHJ1bik7Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXIub2Zmc2V0Rm9yUG9zaXRpb24oeCwg
aW5jbHVkZVBhcnRpYWxHbHlwaHMpOwotfQotCiB9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbi9Gb250Q2Fpcm9XaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL0ZvbnRDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250Q2Fpcm9XaW4uY3BwCShyZXZpc2lvbiAwKQpAQCAt
MCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4gIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJG
b250LmgiCisKKyNpbmNsdWRlICJHbHlwaEJ1ZmZlci5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29u
dGV4dC5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiU2ltcGxlRm9u
dERhdGEuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2b2lkIEZvbnQ6OmRyYXdHbHlwaHMo
R3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBm
b250LCBjb25zdCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZmZXIsIAorICAgICAgICAgICAgICAgICAg
ICAgIGludCBmcm9tLCBpbnQgbnVtR2x5cGhzLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29u
c3QKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit9CkluZGV4OiBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbi9Gb250V2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbi9Gb250V2luLmNwcAkocmV2aXNpb24gMjk4MzQpCisrKyBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250V2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1
ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCBBcHBs
ZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCkBAIC0zMywxMzYgKzMzLDEwIEBACiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNp
bmNsdWRlICJTaW1wbGVGb250RGF0YS5oIgogI2luY2x1ZGUgIlVuaXNjcmliZUNvbnRyb2xsZXIu
aCIKLSNpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4K
LSNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+
CiAjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1j
b25zdCBpbnQgc3ludGhldGljT2JsaXF1ZUFuZ2xlID0gMTQ7Ci0KLXZvaWQgRm9udDo6ZHJhd0ds
eXBocyhHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwgY29uc3QgU2ltcGxlRm9udERh
dGEqIGZvbnQsIGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZlciwgCi0gICAgICAgICAgICAg
ICAgICAgICAgaW50IGZyb20sIGludCBudW1HbHlwaHMsIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50
KSBjb25zdAotewotICAgIGlmIChmb250LT5tX2ZvbnQudXNlR0RJKCkpIHsKLSAgICAgICAgLy8g
RklYTUU6IFN1cHBvcnQgYWxwaGEgYmxlbmRpbmcuCi0gICAgICAgIC8vIEZJWE1FOiBTdXBwb3J0
IHRleHQgc3Ryb2tlL2ZpbGwuCi0gICAgICAgIC8vIEZJWE1FOiBTdXBwb3J0IHRleHQgc2hhZG93
LgotICAgICAgICBDb2xvciBmaWxsQ29sb3IgPSBncmFwaGljc0NvbnRleHQtPmZpbGxDb2xvcigp
OwotICAgICAgICBpZiAoZmlsbENvbG9yLmFscGhhKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVy
bjsKLQotICAgICAgICAvLyBXZSBoYXZlIHRvIGNvbnZlcnQgQ0cncyB0d28tZGltZW5zaW9uYWwg
ZmxvYXRpbmcgcG9pbnQgYWR2YW5jZXMgdG8ganVzdCBob3Jpem9udGFsIGludGVnZXIgYWR2YW5j
ZXMuCi0gICAgICAgIFZlY3RvcjxpbnQsIDIwNDg+IGdkaUFkdmFuY2VzOwotICAgICAgICBpbnQg
dG90YWxXaWR0aCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtR2x5cGhzOyBp
KyspIHsKLSAgICAgICAgICAgIGdkaUFkdmFuY2VzLmFwcGVuZChscm91bmRmKGdseXBoQnVmZmVy
LmFkdmFuY2VBdChmcm9tICsgaSkpKTsKLSAgICAgICAgICAgIHRvdGFsV2lkdGggKz0gZ2RpQWR2
YW5jZXNbaV07Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBwdXQgc2xvcCBpbnRvIHRoaXMg
cmVjdCwgc2luY2UgZ2x5cGhzIGNhbiBvdmVyZmxvdyB0aGUgYXNjZW50L2Rlc2NlbnQgYm91bmRz
IGFuZCB0aGUgbGVmdC9yaWdodCBlZGdlcy4KLSAgICAgICAgaW50IGxpbmVHYXAgPSBmb250LT5s
aW5lR2FwKCk7Ci0gICAgICAgIEludFJlY3QgdGV4dFJlY3QocG9pbnQueCgpIC0gbGluZUdhcCwg
cG9pbnQueSgpIC0gZm9udC0+YXNjZW50KCkgLSBsaW5lR2FwLCB0b3RhbFdpZHRoICsgMiAqIGxp
bmVHYXAsIGZvbnQtPmxpbmVTcGFjaW5nKCkpOwotICAgICAgICBIREMgaGRjID0gZ3JhcGhpY3ND
b250ZXh0LT5nZXRXaW5kb3dzQ29udGV4dCh0ZXh0UmVjdCk7Ci0gICAgICAgIFNlbGVjdE9iamVj
dChoZGMsIGZvbnQtPm1fZm9udC5oZm9udCgpKTsKLQotICAgICAgICAvLyBTZXQgdGhlIGNvcnJl
Y3QgY29sb3IuCi0gICAgICAgIEhEQyB0ZXh0RHJhd2luZ0RDID0gaGRjOwotICAgICAgICAvKmlm
IChmaWxsQ29sb3IuaGFzQWxwaGEoKSB8fCBncmFwaGljc0NvbnRleHQtPmluVHJhbnNwYXJlbmN5
TGF5ZXIoKSkgewotICAgICAgICAgICAgLy8gR0RJIGNhbid0IGhhbmRsZSBkcmF3aW5nIHRyYW5z
cGFyZW50IHRleHQuICBXZSBoYXZlIHRvIGRyYXcgaW50byBhIG1hc2suICBXZSBkcmF3IGJsYWNr
IHRleHQgb24gYSB3aGl0ZS1maWxsZWQgYmFja2dyb3VuZC4KLSAgICAgICAgICAgIC8vIFdlIGFs
c28gZG8gdGhpcyB3aGVuIGluc2lkZSB0cmFuc3BhcmVuY3kgbGF5ZXJzLCBzaW5jZSBHREkgYWxz
byBjYW4ndCBkcmF3IG9udG8gYSBzdXJmYWNlIHdpdGggYWxwaGEuCi0gICAgICAgICAgICBncmFw
aGljc0NvbnRleHQtPnNhdmUoKTsKLSAgICAgICAgICAgIGdyYXBoaWNzQ29udGV4dC0+c2V0Rmls
bENvbG9yKENvbG9yOjp3aGl0ZSk7Ci0gICAgICAgICAgICB0ZXh0RHJhd2luZ0RDID0gZ3JhcGhp
Y3NDb250ZXh0LT5nZXRXaW5kb3dzQml0bWFwQ29udGV4dCh0ZXh0UmVjdCk7Ci0gICAgICAgICAg
ICBTZXRUZXh0Q29sb3IoaGRjLCBSR0IoMCwgMCwgMCkpOwotICAgICAgICB9IGVsc2UqLwotICAg
ICAgICAgICAgU2V0VGV4dENvbG9yKGhkYywgUkdCKGZpbGxDb2xvci5yZWQoKSwgZmlsbENvbG9y
LmdyZWVuKCksIGZpbGxDb2xvci5ibHVlKCkpKTsKLQotICAgICAgICBTZXRCa01vZGUoaGRjLCBU
UkFOU1BBUkVOVCk7Ci0gICAgICAgIFNldFRleHRBbGlnbihoZGMsIFRBX0xFRlQgfCBUQV9CQVNF
TElORSk7Ci0KLSAgICAgICAgLy8gVW5pc2NyaWJlIGdpdmVzIHVzIG9mZnNldHMgdG8gaGVscCBy
ZWZpbmUgdGhlIHBvc2l0aW9uaW5nIG9mIGNvbWJpbmluZyBnbHlwaHMuCi0gICAgICAgIEZsb2F0
U2l6ZSB0cmFuc2xhdGlvbiA9IGdseXBoQnVmZmVyLm9mZnNldEF0KGZyb20pOwotICAgICAgICBp
ZiAodHJhbnNsYXRpb24ud2lkdGgoKSB8fCB0cmFuc2xhdGlvbi5oZWlnaHQoKSkgewotICAgICAg
ICAgICAgWEZPUk0geGZvcm07Ci0gICAgICAgICAgICB4Zm9ybS5lTTExID0gMS4wOwotICAgICAg
ICAgICAgeGZvcm0uZU0xMiA9IDA7Ci0gICAgICAgICAgICB4Zm9ybS5lTTIxID0gMDsKLSAgICAg
ICAgICAgIHhmb3JtLmVNMjIgPSAxLjA7Ci0gICAgICAgICAgICB4Zm9ybS5lRHggPSB0cmFuc2xh
dGlvbi53aWR0aCgpOwotICAgICAgICAgICAgeGZvcm0uZUR5ID0gdHJhbnNsYXRpb24uaGVpZ2h0
KCk7Ci0gICAgICAgICAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShoZGMsICZ4Zm9ybSwgTVdUX0xF
RlRNVUxUSVBMWSk7Ci0gICAgICAgIH0KLSAgICAgICAgRXh0VGV4dE91dChoZGMsIHBvaW50Lngo
KSwgcG9pbnQueSgpLCBFVE9fR0xZUEhfSU5ERVgsIDAsIChXQ0hBUiopZ2x5cGhCdWZmZXIuZ2x5
cGhzKGZyb20pLCBudW1HbHlwaHMsIGdkaUFkdmFuY2VzLmRhdGEoKSk7Ci0KLSAgICAgICAgLypp
ZiAoZmlsbENvbG9yLmhhc0FscGhhKCkgfHwgZ3JhcGhpY3NDb250ZXh0LT5pblRyYW5zcGFyZW5j
eUxheWVyKCkpIHsKLSAgICAgICAgICAgIC8vIFRPRE9EOiBXZSBoYXZlIHRvIHdhbGsgdGhlIGJp
dHMgb2YgdGhlIGJpdG1hcCBhbmQgaW52ZXJ0IHRoZW0uICBXZSBhbHNvIGNvcHkgb3ZlciB0aGUg
Z3JlZW4gY29tcG9uZW50IHZhbHVlIGludG8gdGhlIGFscGhhIHZhbHVlCi0gICAgICAgICAgICAv
LyB0byBrZWVwIENsZWFyVHlwZSBsb29raW5nIHJlYXNvbmFibGUuCi0KLSAgICAgICAgICAgIC8v
IE5vdyB0aGF0IHdlIGhhdmUgZHJhd24gdGhlIHRleHQgaW50byBhIGJpdG1hcCBhbmQgaW52ZXJ0
ZWQgaXQsIG9idGFpbiBhIENHSW1hZ2VSZWYgbWFzay4KLSAgICAgICAgICAgIENHSW1hZ2VSZWYg
bWFzayA9IGdyYXBoaWNzQ29udGV4dC0+cmVsZWFzZVdpbmRvd3NCaXRtYXBDb250ZXh0SW50b01h
c2sodGV4dERyYXdpbmdEQywgdGV4dFJlY3QpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAv
LyBBcHBseSB0aGUgbWFzayB0byB0aGUgZmlsbCBjb2xvci4KLSAgICAgICAgICAgIENHQ29udGV4
dFJlZiBiaXRtYXBDb250ZXh0ID0gZ3JhcGhpY3NDb250ZXh0LT5nZXRXaW5kb3dzQ29tcGF0aWJs
ZUNHQml0bWFwQ29udGV4dCh0ZXh0UmVjdC5zaXplKCkpOwotICAgICAgICAgICAgQ0dGbG9hdCBy
ZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKLSAgICAgICAgICAgIGNvbG9yLmdldFJHQkEocmVkLCBn
cmVlbiwgYmx1ZSwgYWxwaGEpOwotICAgICAgICAgICAgQ0dDb250ZXh0U2V0UkdCRmlsbENvbG9y
KGNvbnRleHQsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLSAgICAgICAgICAgIENHQ29udGV4
dEZpbGxSZWN0KGJpdG1hcENvbnRleHQsIEludFJlY3QoMCwgMCwgdGV4dFJlY3Qud2lkdGgoKSwg
dGV4dFJlY3QuaGVpZ2h0KCkpKTsKLSAgICAgICAgICAgIENHSW1hZ2VSZWYgZmlsbENvbG9ySW1h
Z2UgPSBDR0JpdG1hcENvbnRleHRDcmVhdGVJbWFnZShiaXRtYXBDb250ZXh0KTsKLSAgICAgICAg
Ci0gICAgICAgICAgICAvLyBBcHBseSB0aGUgbWFzay4KLSAgICAgICAgICAgIENHSW1hZ2VSZWYg
ZmluYWxJbWFnZSA9IENHSW1hZ2VDcmVhdGVXaXRoTWFzayhmaWxsQ29sb3JJbWFnZSwgbWFzayk7
Ci0KLSAgICAgICAgICAgIC8vIFRoZSBiaXRtYXAgaW1hZ2UgbmVlZHMgdG8gYmUgZHJhd24gaW50
byB0aGUgSERDLgotICAgICAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5kcmF3SW1hZ2VJbnRvV2lu
ZG93c0NvbnRleHQoaGRjLCBmaW5hbEltYWdlKTsKLQotICAgICAgICAgICAgLy8gUmVsZWFzZSBv
dXIgaW1hZ2VzIGFuZCBjb250ZXh0cy4KLSAgICAgICAgICAgIENHSW1hZ2VSZWxlYXNlKG1hc2sp
OwotICAgICAgICAgICAgQ0dJbWFnZVJlbGVhc2UoZmlsbENvbG9ySW1hZ2UpOwotICAgICAgICAg
ICAgQ0dJbWFnZVJlbGVhc2UoZmluYWxJbWFnZSk7Ci0gICAgICAgICAgICBDR0NvbnRleHRSZWxl
YXNlKGJpdG1hcENvbnRleHQpOwotICAgICAgICB9Ki8KLQotICAgICAgICBncmFwaGljc0NvbnRl
eHQtPnJlbGVhc2VXaW5kb3dzQ29udGV4dChoZGMsIHRleHRSZWN0KTsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KLQotICAgIENHQ29udGV4dFJlZiBjZ0NvbnRleHQgPSBncmFwaGljc0NvbnRleHQt
PnBsYXRmb3JtQ29udGV4dCgpOwotCi0gICAgdWludDMyX3Qgb2xkRm9udFNtb290aGluZ1N0eWxl
ID0gd2tTZXRGb250U21vb3RoaW5nU3R5bGUoY2dDb250ZXh0KTsKLQotICAgIGNvbnN0IEZvbnRQ
bGF0Zm9ybURhdGEmIHBsYXRmb3JtRGF0YSA9IGZvbnQtPnBsYXRmb3JtRGF0YSgpOwotCi0gICAg
Q0dDb250ZXh0U2V0Rm9udChjZ0NvbnRleHQsIHBsYXRmb3JtRGF0YS5jZ0ZvbnQoKSk7Ci0KLSAg
ICBDR0FmZmluZVRyYW5zZm9ybSBtYXRyaXggPSBDR0FmZmluZVRyYW5zZm9ybUlkZW50aXR5Owot
ICAgIG1hdHJpeC5iID0gLW1hdHJpeC5iOwotICAgIG1hdHJpeC5kID0gLW1hdHJpeC5kOwotCi0g
ICAgaWYgKHBsYXRmb3JtRGF0YS5zeW50aGV0aWNPYmxpcXVlKCkpCi0gICAgewotICAgICAgICBz
dGF0aWMgZmxvYXQgc2tldyA9IC10YW5mKHN5bnRoZXRpY09ibGlxdWVBbmdsZSAqIGFjb3NmKDAp
IC8gOTApOwotICAgICAgICBtYXRyaXggPSBDR0FmZmluZVRyYW5zZm9ybUNvbmNhdChtYXRyaXgs
IENHQWZmaW5lVHJhbnNmb3JtTWFrZSgxLCAwLCBza2V3LCAxLCAwLCAwKSk7Ci0gICAgfQotCi0g
ICAgLy8gVW5pc2NyaWJlIGdpdmVzIHVzIG9mZnNldHMgdG8gaGVscCByZWZpbmUgdGhlIHBvc2l0
aW9uaW5nIG9mIGNvbWJpbmluZyBnbHlwaHMuCi0gICAgRmxvYXRTaXplIHRyYW5zbGF0aW9uID0g
Z2x5cGhCdWZmZXIub2Zmc2V0QXQoZnJvbSk7Ci0gICAgaWYgKHRyYW5zbGF0aW9uLndpZHRoKCkg
fHwgdHJhbnNsYXRpb24uaGVpZ2h0KCkpCi0gICAgICAgIENHQWZmaW5lVHJhbnNmb3JtVHJhbnNs
YXRlKG1hdHJpeCwgdHJhbnNsYXRpb24ud2lkdGgoKSwgdHJhbnNsYXRpb24uaGVpZ2h0KCkpOwot
ICAgIAotICAgIENHQ29udGV4dFNldFRleHRNYXRyaXgoY2dDb250ZXh0LCBtYXRyaXgpOwotCi0g
ICAgQ0dDb250ZXh0U2V0Rm9udFNpemUoY2dDb250ZXh0LCBwbGF0Zm9ybURhdGEuc2l6ZSgpKTsK
LSAgICBDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24oY2dDb250ZXh0LCBwb2ludC54KCksIHBvaW50
LnkoKSk7Ci0gICAgQ0dDb250ZXh0U2hvd0dseXBoc1dpdGhBZHZhbmNlcyhjZ0NvbnRleHQsIGds
eXBoQnVmZmVyLmdseXBocyhmcm9tKSwgZ2x5cGhCdWZmZXIuYWR2YW5jZXMoZnJvbSksIG51bUds
eXBocyk7Ci0gICAgaWYgKGZvbnQtPm1fc3ludGhldGljQm9sZE9mZnNldCkgewotICAgICAgICBD
R0NvbnRleHRTZXRUZXh0UG9zaXRpb24oY2dDb250ZXh0LCBwb2ludC54KCkgKyBmb250LT5tX3N5
bnRoZXRpY0JvbGRPZmZzZXQsIHBvaW50LnkoKSk7Ci0gICAgICAgIENHQ29udGV4dFNob3dHbHlw
aHNXaXRoQWR2YW5jZXMoY2dDb250ZXh0LCBnbHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSksIGdseXBo
QnVmZmVyLmFkdmFuY2VzKGZyb20pLCBudW1HbHlwaHMpOwotICAgIH0KLQotICAgIHdrUmVzdG9y
ZUZvbnRTbW9vdGhpbmdTdHlsZShjZ0NvbnRleHQsIG9sZEZvbnRTbW9vdGhpbmdTdHlsZSk7Ci19
Ci0KIEZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQoY29uc3QgVGV4
dFJ1biYgcnVuLCBjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCBoLAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAogewpJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0Q0dXaW4u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNz
Q29udGV4dENHV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCShmcm9tIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dFdpbi5jcHA6Mjk4MzQpCisrKyBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRDR1dpbi5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwzODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIw
MDUsIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisKKyNpbmNs
dWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2lu
Y2x1ZGUgIlBhdGguaCIKKyNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ0dCaXRtYXBDb250ZXh0Lmg+
CisjaW5jbHVkZSA8V2ViS2l0U3lzdGVtSW50ZXJmYWNlL1dlYktpdFN5c3RlbUludGVyZmFjZS5o
PgorI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CisKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRl
eHRQbGF0Zm9ybVByaXZhdGUuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCitjbGFzcyBTVkdSZXNvdXJjZUltYWdlOworCitzdGF0aWMgQ0dDb250ZXh0
UmVmIENHQ29udGV4dFdpdGhIREMoSERDIGhkYykKK3sKKyAgICBIQklUTUFQIGJpdG1hcCA9IChI
QklUTUFQKUdldEN1cnJlbnRPYmplY3QoaGRjLCBPQkpfQklUTUFQKTsKKyAgICBDR0NvbG9yU3Bh
Y2VSZWYgZGV2aWNlUkdCID0gQ0dDb2xvclNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7CisgICAgQklU
TUFQIGluZm87CisKKyAgICBHZXRPYmplY3QoYml0bWFwLCBzaXplb2YoaW5mbyksICZpbmZvKTsK
KyAgICBBU1NFUlQoaW5mby5ibUJpdHNQaXhlbCA9PSAzMik7CisgICAgQ0dDb250ZXh0UmVmIGNv
bnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUoaW5mby5ibUJpdHMsIGluZm8uYm1XaWR0aCwg
aW5mby5ibUhlaWdodCwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpbmZvLmJtV2lkdGhCeXRlcywgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3Jk
ZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFOb25lU2tpcEZpcnN0KTsKKyAgICBDR0NvbG9yU3Bh
Y2VSZWxlYXNlKGRldmljZVJHQik7CisKKyAgICAvLyBGbGlwIGNvb3JkcworICAgIENHQ29udGV4
dFRyYW5zbGF0ZUNUTShjb250ZXh0LCAwLCBpbmZvLmJtSGVpZ2h0KTsKKyAgICBDR0NvbnRleHRT
Y2FsZUNUTShjb250ZXh0LCAxLCAtMSk7CisgICAgCisgICAgLy8gUHV0IHRoZSBIREMgSW4gYWR2
YW5jZWQgbW9kZSBzbyBpdCB3aWxsIGhvbm9yIGFmZmluZSB0cmFuc2Zvcm1zLgorICAgIFNldEdy
YXBoaWNzTW9kZShoZGMsIEdNX0FEVkFOQ0VEKTsKKyAgICAKKyAgICByZXR1cm4gY29udGV4dDsK
K30KKworR3JhcGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRleHQoSERDIGhkYykKKyAgICA6IG1f
Y29tbW9uKGNyZWF0ZUdyYXBoaWNzQ29udGV4dFByaXZhdGUoKSkKKyAgICAsIG1fZGF0YShuZXcg
R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKENHQ29udGV4dFdpdGhIREMoaGRjKSkpCit7
CisgICAgQ0dDb250ZXh0UmVsZWFzZShtX2RhdGEtPm1fY2dDb250ZXh0KTsKKyAgICBtX2RhdGEt
Pm1faGRjID0gaGRjOworICAgIHNldFBhaW50aW5nRGlzYWJsZWQoIW1fZGF0YS0+bV9jZ0NvbnRl
eHQpOworICAgIGlmIChtX2RhdGEtPm1fY2dDb250ZXh0KSB7CisgICAgICAgIC8vIE1ha2Ugc3Vy
ZSB0aGUgY29udGV4dCBzdGFydHMgaW4gc3luYyB3aXRoIG91ciBzdGF0ZS4KKyAgICAgICAgc2V0
UGxhdGZvcm1GaWxsQ29sb3IoZmlsbENvbG9yKCkpOworICAgICAgICBzZXRQbGF0Zm9ybVN0cm9r
ZUNvbG9yKHN0cm9rZUNvbG9yKCkpOworICAgIH0KK30KKworSERDIEdyYXBoaWNzQ29udGV4dDo6
Z2V0V2luZG93c0NvbnRleHQoY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxw
aGFCbGVuZCkKK3sKKyAgICBpZiAoaW5UcmFuc3BhcmVuY3lMYXllcigpKSB7CisgICAgICAgIGlm
IChkc3RSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIC8v
IENyZWF0ZSBhIGJpdG1hcCBEQyBpbiB3aGljaCB0byBkcmF3LgorICAgICAgICBCSVRNQVBJTkZP
IGJpdG1hcEluZm87CisgICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpU2l6ZSAgICAgICAg
ICA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFk
ZXIuYmlXaWR0aCAgICAgICAgID0gZHN0UmVjdC53aWR0aCgpOyAKKyAgICAgICAgYml0bWFwSW5m
by5ibWlIZWFkZXIuYmlIZWlnaHQgICAgICAgID0gZHN0UmVjdC5oZWlnaHQoKTsKKyAgICAgICAg
Yml0bWFwSW5mby5ibWlIZWFkZXIuYmlQbGFuZXMgICAgICAgID0gMTsKKyAgICAgICAgYml0bWFw
SW5mby5ibWlIZWFkZXIuYmlCaXRDb3VudCAgICAgID0gMzI7CisgICAgICAgIGJpdG1hcEluZm8u
Ym1pSGVhZGVyLmJpQ29tcHJlc3Npb24gICA9IEJJX1JHQjsKKyAgICAgICAgYml0bWFwSW5mby5i
bWlIZWFkZXIuYmlTaXplSW1hZ2UgICAgID0gMDsKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFk
ZXIuYmlYUGVsc1Blck1ldGVyID0gMDsKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlZ
UGVsc1Blck1ldGVyID0gMDsKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlDbHJVc2Vk
ICAgICAgID0gMDsKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlDbHJJbXBvcnRhbnQg
ID0gMDsKKworICAgICAgICB2b2lkKiBwaXhlbHMgPSAwOworICAgICAgICBIQklUTUFQIGJpdG1h
cCA9IDo6Q3JlYXRlRElCU2VjdGlvbihOVUxMLCAmYml0bWFwSW5mbywgRElCX1JHQl9DT0xPUlMs
ICZwaXhlbHMsIDAsIDApOworICAgICAgICBpZiAoIWJpdG1hcCkKKyAgICAgICAgICAgIHJldHVy
biAwOworCisgICAgICAgIEhEQyBiaXRtYXBEQyA9IDo6Q3JlYXRlQ29tcGF0aWJsZURDKG1fZGF0
YS0+bV9oZGMpOworICAgICAgICA6OlNlbGVjdE9iamVjdChiaXRtYXBEQywgYml0bWFwKTsKKwor
ICAgICAgICAvLyBGaWxsIG91ciBidWZmZXIgd2l0aCBjbGVhciBpZiB3ZSdyZSBnb2luZyB0byBh
bHBoYSBibGVuZC4KKyAgICAgICAgaWYgKHN1cHBvcnRBbHBoYUJsZW5kKSB7CisgICAgICAgICAg
ICBCSVRNQVAgYm1wSW5mbzsKKyAgICAgICAgICAgIEdldE9iamVjdChiaXRtYXAsIHNpemVvZihi
bXBJbmZvKSwgJmJtcEluZm8pOworICAgICAgICAgICAgaW50IGJ1ZmZlclNpemUgPSBibXBJbmZv
LmJtV2lkdGhCeXRlcyAqIGJtcEluZm8uYm1IZWlnaHQ7CisgICAgICAgICAgICBtZW1zZXQoYm1w
SW5mby5ibUJpdHMsIDAsIGJ1ZmZlclNpemUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWFr
ZSBzdXJlIHdlIGNhbiBkbyB3b3JsZCB0cmFuc2Zvcm1zLgorICAgICAgICBTZXRHcmFwaGljc01v
ZGUoYml0bWFwREMsIEdNX0FEVkFOQ0VEKTsKKworICAgICAgICAvLyBBcHBseSBhIHRyYW5zbGF0
aW9uIHRvIG91ciBjb250ZXh0IHNvIHRoYXQgdGhlIGRyYXdpbmcgZG9uZSB3aWxsIGJlIGF0ICgw
LDApIG9mIHRoZSBiaXRtYXAuCisgICAgICAgIFhGT1JNIHhmb3JtOworICAgICAgICB4Zm9ybS5l
TTExID0gMS4wOworICAgICAgICB4Zm9ybS5lTTEyID0gMDsKKyAgICAgICAgeGZvcm0uZU0yMSA9
IDA7CisgICAgICAgIHhmb3JtLmVNMjIgPSAxLjA7CisgICAgICAgIHhmb3JtLmVEeCA9IC1kc3RS
ZWN0LngoKTsKKyAgICAgICAgeGZvcm0uZUR5ID0gLWRzdFJlY3QueSgpOworICAgICAgICA6OlNl
dFdvcmxkVHJhbnNmb3JtKGJpdG1hcERDLCAmeGZvcm0pOworCisgICAgICAgIHJldHVybiBiaXRt
YXBEQzsKKyAgICB9CisKKyAgICBDR0NvbnRleHRGbHVzaChwbGF0Zm9ybUNvbnRleHQoKSk7Cisg
ICAgbV9kYXRhLT5zYXZlKCk7CisgICAgcmV0dXJuIG1fZGF0YS0+bV9oZGM7Cit9CisKK2Jvb2wg
R3JhcGhpY3NDb250ZXh0OjppblRyYW5zcGFyZW5jeUxheWVyKCkgY29uc3QgeyByZXR1cm4gbV9k
YXRhLT5tX3RyYW5zcGFyZW5jeUNvdW50OyB9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpyZWxl
YXNlV2luZG93c0NvbnRleHQoSERDIGhkYywgY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgYm9vbCBz
dXBwb3J0QWxwaGFCbGVuZCkKK3sKKyAgICBpZiAoaGRjICYmIGluVHJhbnNwYXJlbmN5TGF5ZXIo
KSkgeworICAgICAgICBpZiAoZHN0UmVjdC5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm47
CisKKyAgICAgICAgSEJJVE1BUCBiaXRtYXAgPSAoSEJJVE1BUClHZXRDdXJyZW50T2JqZWN0KGhk
YywgT0JKX0JJVE1BUCk7CisKKyAgICAgICAgLy8gTmVlZCB0byBtYWtlIGEgQ0dJbWFnZSBvdXQg
b2YgdGhlIGJpdG1hcCdzIHBpeGVsIGJ1ZmZlciBhbmQgdGhlbiBkcmF3CisgICAgICAgIC8vIGl0
IGludG8gb3VyIGNvbnRleHQuCisgICAgICAgIEJJVE1BUCBpbmZvOworICAgICAgICBHZXRPYmpl
Y3QoYml0bWFwLCBzaXplb2YoaW5mbyksICZpbmZvKTsKKyAgICAgICAgQVNTRVJUKGluZm8uYm1C
aXRzUGl4ZWwgPT0gMzIpOworCisgICAgICAgIENHQ29sb3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBD
R0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKKyAgICAgICAgQ0dDb250ZXh0UmVmIGJpdG1h
cENvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUoaW5mby5ibUJpdHMsIGluZm8uYm1XaWR0
aCwgaW5mby5ibUhlaWdodCwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJHQiwga0NH
Qml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN1cHBvcnRBbHBoYUJsZW5kID8ga0NHSW1h
Z2VBbHBoYVByZW11bHRpcGxpZWRGaXJzdCA6IGtDR0ltYWdlQWxwaGFOb25lU2tpcEZpcnN0KSk7
CisgICAgICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKKworICAgICAgICBDR0lt
YWdlUmVmIGltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlSW1hZ2UoYml0bWFwQ29udGV4dCk7
CisgICAgICAgIENHQ29udGV4dERyYXdJbWFnZShtX2RhdGEtPm1fY2dDb250ZXh0LCBkc3RSZWN0
LCBpbWFnZSk7CisgICAgICAgIAorICAgICAgICAvLyBEZWxldGUgYWxsIG91ciBqdW5rLgorICAg
ICAgICBDR0ltYWdlUmVsZWFzZShpbWFnZSk7CisgICAgICAgIENHQ29udGV4dFJlbGVhc2UoYml0
bWFwQ29udGV4dCk7CisgICAgICAgIDo6RGVsZXRlREMoaGRjKTsKKyAgICAgICAgOjpEZWxldGVP
YmplY3QoYml0bWFwKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9kYXRhLT5y
ZXN0b3JlKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpzYXZl
KCkKK3sKKyAgICBpZiAoIW1faGRjKQorICAgICAgICByZXR1cm47CisgICAgU2F2ZURDKG1faGRj
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnJlc3RvcmUoKQor
eworICAgIGlmICghbV9oZGMpCisgICAgICAgIHJldHVybjsKKyAgICBSZXN0b3JlREMobV9oZGMs
IC0xKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNsaXAoY29u
c3QgSW50UmVjdCYgY2xpcFJlY3QpCit7CisgICAgaWYgKCFtX2hkYykKKyAgICAgICAgcmV0dXJu
OworICAgIEludGVyc2VjdENsaXBSZWN0KG1faGRjLCBjbGlwUmVjdC54KCksIGNsaXBSZWN0Lnko
KSwgY2xpcFJlY3QucmlnaHQoKSwgY2xpcFJlY3QuYm90dG9tKCkpOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y2xpcChjb25zdCBQYXRoJikKK3sKKyAgICBub3RJ
bXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6
c2NhbGUoY29uc3QgRmxvYXRTaXplJiBzaXplKQoreworICAgIGlmICghbV9oZGMpCisgICAgICAg
IHJldHVybjsKKyAgICBYRk9STSB4Zm9ybTsKKyAgICB4Zm9ybS5lTTExID0gc2l6ZS53aWR0aCgp
OworICAgIHhmb3JtLmVNMTIgPSAwOworICAgIHhmb3JtLmVNMjEgPSAwOworICAgIHhmb3JtLmVN
MjIgPSBzaXplLmhlaWdodCgpOworICAgIHhmb3JtLmVEeCA9IDA7CisgICAgeGZvcm0uZUR5ID0g
MDsKKyAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShtX2hkYywgJnhmb3JtLCBNV1RfTEVGVE1VTFRJ
UExZKTsKK30KKworc3RhdGljIGNvbnN0IGRvdWJsZSBkZWcycmFkID0gMC4wMTc0NTMyOTI1MTk5
NDMyOTU3Njk7IC8vIHBpLzE4MAorCit2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0
ZTo6cm90YXRlKGZsb2F0IGRlZ3JlZXNBbmdsZSkKK3sKKyAgICBmbG9hdCByYWRpYW5zQW5nbGUg
PSBkZWdyZWVzQW5nbGUgKiBkZWcycmFkOworICAgIGZsb2F0IGNvc0FuZ2xlID0gY29zZihyYWRp
YW5zQW5nbGUpOworICAgIGZsb2F0IHNpbkFuZ2xlID0gc2luZihyYWRpYW5zQW5nbGUpOworICAg
IFhGT1JNIHhmb3JtOworICAgIHhmb3JtLmVNMTEgPSBjb3NBbmdsZTsKKyAgICB4Zm9ybS5lTTEy
ID0gLXNpbkFuZ2xlOworICAgIHhmb3JtLmVNMjEgPSBzaW5BbmdsZTsKKyAgICB4Zm9ybS5lTTIy
ID0gY29zQW5nbGU7CisgICAgeGZvcm0uZUR4ID0gMDsKKyAgICB4Zm9ybS5lRHkgPSAwOworICAg
IE1vZGlmeVdvcmxkVHJhbnNmb3JtKG1faGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOwor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6dHJhbnNsYXRlKGZsb2F0
IHggLCBmbG9hdCB5KQoreworICAgIGlmICghbV9oZGMpCisgICAgICAgIHJldHVybjsKKyAgICBY
Rk9STSB4Zm9ybTsKKyAgICB4Zm9ybS5lTTExID0gMS4wOworICAgIHhmb3JtLmVNMTIgPSAwOwor
ICAgIHhmb3JtLmVNMjEgPSAwOworICAgIHhmb3JtLmVNMjIgPSAxLjA7CisgICAgeGZvcm0uZUR4
ID0geDsKKyAgICB4Zm9ybS5lRHkgPSB5OworICAgIE1vZGlmeVdvcmxkVHJhbnNmb3JtKG1faGRj
LCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dFBs
YXRmb3JtUHJpdmF0ZTo6Y29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdHJhbnNmb3Jt
KQoreworICAgIGlmICghbV9oZGMpCisgICAgICAgIHJldHVybjsKKyAgICBDR0FmZmluZVRyYW5z
Zm9ybSBtYXQgPSB0cmFuc2Zvcm07CisgICAgWEZPUk0geGZvcm07CisgICAgeGZvcm0uZU0xMSA9
IG1hdC5hOworICAgIHhmb3JtLmVNMTIgPSBtYXQuYjsKKyAgICB4Zm9ybS5lTTIxID0gbWF0LmM7
CisgICAgeGZvcm0uZU0yMiA9IG1hdC5kOworICAgIHhmb3JtLmVEeCA9IG1hdC50eDsKKyAgICB4
Zm9ybS5lRHkgPSBtYXQudHk7CisgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9y
bSwgTVdUX0xFRlRNVUxUSVBMWSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3Rm9j
dXNSaW5nKGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgp
KQorICAgICAgICByZXR1cm47CisKKyAgICBmbG9hdCByYWRpdXMgPSAoZm9jdXNSaW5nV2lkdGgo
KSAtIDEpIC8gMi4wZjsKKyAgICBpbnQgb2Zmc2V0ID0gcmFkaXVzICsgZm9jdXNSaW5nT2Zmc2V0
KCk7CisgICAgQ0dDb2xvclJlZiBjb2xvclJlZiA9IGNvbG9yLmlzVmFsaWQoKSA/IGNnQ29sb3Io
Y29sb3IpIDogMDsKKworICAgIENHTXV0YWJsZVBhdGhSZWYgZm9jdXNSaW5nUGF0aCA9IENHUGF0
aENyZWF0ZU11dGFibGUoKTsKKyAgICBjb25zdCBWZWN0b3I8SW50UmVjdD4mIHJlY3RzID0gZm9j
dXNSaW5nUmVjdHMoKTsKKyAgICB1bnNpZ25lZCByZWN0Q291bnQgPSByZWN0cy5zaXplKCk7Cisg
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlY3RDb3VudDsgaSsrKQorICAgICAgICBDR1Bh
dGhBZGRSZWN0KGZvY3VzUmluZ1BhdGgsIDAsIENHUmVjdEluc2V0KHJlY3RzW2ldLCAtb2Zmc2V0
LCAtb2Zmc2V0KSk7CisKKyAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IHBsYXRmb3JtQ29udGV4
dCgpOworICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7CisKKyAgICBDR0NvbnRleHRC
ZWdpblBhdGgoY29udGV4dCk7CisgICAgQ0dDb250ZXh0QWRkUGF0aChjb250ZXh0LCBmb2N1c1Jp
bmdQYXRoKTsKKworICAgIHdrRHJhd0ZvY3VzUmluZyhjb250ZXh0LCBjb2xvclJlZiwgcmFkaXVz
KTsKKworICAgIENHQ29sb3JSZWxlYXNlKGNvbG9yUmVmKTsKKworICAgIENHUGF0aFJlbGVhc2Uo
Zm9jdXNSaW5nUGF0aCk7CisKKyAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOwor
fQorCitzdGF0aWMgY29uc3QgQ29sb3ImIHNwZWxsaW5nUGF0dGVybkNvbG9yKCkgeworICAgIHN0
YXRpYyBjb25zdCBDb2xvciBzcGVsbGluZ0NvbG9yKDI1NSwgMCwgMCk7CisgICAgcmV0dXJuIHNw
ZWxsaW5nQ29sb3I7Cit9CisKK3N0YXRpYyBjb25zdCBDb2xvciYgZ3JhbW1hclBhdHRlcm5Db2xv
cigpIHsKKyAgICBzdGF0aWMgY29uc3QgQ29sb3IgZ3JhbW1hckNvbG9yKDAsIDEyOCwgMCk7Cisg
ICAgcmV0dXJuIGdyYW1tYXJDb2xvcjsKK30KKworLy8gUHVsbGVkIGZyb20gR3JhcGhpY3NDb250
ZXh0Q0cKK3N0YXRpYyB2b2lkIHNldENHU3Ryb2tlQ29sb3IoQ0dDb250ZXh0UmVmIGNvbnRleHQs
IGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBDR0Zsb2F0IHJlZCwgZ3JlZW4sIGJsdWUsIGFs
cGhhOworICAgIGNvbG9yLmdldFJHQkEocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworICAgIENH
Q29udGV4dFNldFJHQlN0cm9rZUNvbG9yKGNvbnRleHQsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhh
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yTWlzc3BlbGxpbmdPckJh
ZEdyYW1tYXIoY29uc3QgSW50UG9pbnQmIHBvaW50LCBpbnQgd2lkdGgsIGJvb2wgZ3JhbW1hcikK
K3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisgICAgCisg
ICAgLy8gVGhlc2UgYXJlIHRoZSBzYW1lIGZvciBtaXNzcGVsbGluZyBvciBiYWQgZ3JhbW1hcgor
ICAgIGNvbnN0IGludCBwYXR0ZXJuSGVpZ2h0ID0gMzsgLy8gMyByb3dzCisgICAgQVNTRVJUKGNN
aXNzcGVsbGluZ0xpbmVUaGlja25lc3MgPT0gcGF0dGVybkhlaWdodCk7CisgICAgY29uc3QgaW50
IHBhdHRlcm5XaWR0aCA9IDQ7IC8vIDQgcGl4ZWxzCisgICAgQVNTRVJUKHBhdHRlcm5XaWR0aCA9
PSBjTWlzc3BlbGxpbmdMaW5lUGF0dGVybldpZHRoKTsKKworICAgIC8vIE1ha2Ugc3VyZSB0byBk
cmF3IG9ubHkgY29tcGxldGUgZG90cy4KKyAgICAvLyBOT1RFOiBDb2RlIGhlcmUgdXNlZCB0byBz
aGlmdCB0aGUgdW5kZXJsaW5lIHRvIHRoZSBsZWZ0IGFuZCBpbmNyZWFzZSB0aGUgd2lkdGgKKyAg
ICAvLyB0byBtYWtlIHN1cmUgZXZlcnl0aGluZyBnZXRzIHVuZGVybGluZWQsIGJ1dCB0aGF0IHJl
c3VsdHMgaW4gZHJhd2luZyBvdXQgb2YKKyAgICAvLyBib3VuZHMgKGUuZy4gd2hlbiBhdCB0aGUg
ZWRnZSBvZiBhIHZpZXcpIGFuZCBjb3VsZCBtYWtlIGl0IGFwcGVhciB0aGF0IHRoZQorICAgIC8v
IHNwYWNlIGJldHdlZW4gYWRqYWNlbnQgbWlzc3BlbGxlZCB3b3JkcyB3YXMgdW5kZXJsaW5lZC4K
KyAgICAvLyBhbGxvdyBzbGlnaHRseSBtb3JlIGNvbnNpZGVyaW5nIHRoYXQgdGhlIHBhdHRlcm4g
ZW5kcyB3aXRoIGEgdHJhbnNwYXJlbnQgcGl4ZWwKKyAgICBpbnQgd2lkdGhNb2QgPSB3aWR0aCAl
IHBhdHRlcm5XaWR0aDsKKyAgICBpZiAocGF0dGVybldpZHRoIC0gd2lkdGhNb2QgPiBjTWlzc3Bl
bGxpbmdMaW5lUGF0dGVybkdhcFdpZHRoKQorICAgICAgICB3aWR0aCAtPSB3aWR0aE1vZDsKKyAg
ICAgIAorICAgIC8vIERyYXcgdGhlIHVuZGVybGluZQorICAgIENHQ29udGV4dFJlZiBjb250ZXh0
ID0gcGxhdGZvcm1Db250ZXh0KCk7CisgICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShjb250ZXh0KTsK
KworICAgIGNvbnN0IENvbG9yJiBwYXR0ZXJuQ29sb3IgPSBncmFtbWFyID8gZ3JhbW1hclBhdHRl
cm5Db2xvcigpIDogc3BlbGxpbmdQYXR0ZXJuQ29sb3IoKTsKKyAgICBzZXRDR1N0cm9rZUNvbG9y
KGNvbnRleHQsIHBhdHRlcm5Db2xvcik7CisKKyAgICB3a1NldFBhdHRlcm5QaGFzZUluVXNlclNw
YWNlKGNvbnRleHQsIHBvaW50KTsKKyAgICBDR0NvbnRleHRTZXRCbGVuZE1vZGUoY29udGV4dCwg
a0NHQmxlbmRNb2RlTm9ybWFsKTsKKyAgICAKKyAgICAvLyAzIHJvd3MsIGVhY2ggb2Zmc2V0IGJ5
IGhhbGYgYSBwaXhlbCBmb3IgYmxlbmRpbmcgcHVycG9zZXMKKyAgICBjb25zdCBDR1BvaW50IHVw
cGVyUG9pbnRzIFtdID0ge3twb2ludC54KCksIHBvaW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAy
LjUgfSwge3BvaW50LngoKSArIHdpZHRoLCBwb2ludC55KCkgKyBwYXR0ZXJuSGVpZ2h0IC0gMi41
fX07CisgICAgY29uc3QgQ0dQb2ludCBtaWRkbGVQb2ludHMgW10gPSB7e3BvaW50LngoKSwgcG9p
bnQueSgpICsgcGF0dGVybkhlaWdodCAtIDEuNSB9LCB7cG9pbnQueCgpICsgd2lkdGgsIHBvaW50
LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAxLjV9fTsKKyAgICBjb25zdCBDR1BvaW50IGxvd2VyUG9p
bnRzIFtdID0ge3twb2ludC54KCksIHBvaW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAwLjUgfSwg
e3BvaW50LngoKSArIHdpZHRoLCBwb2ludC55KCkgKyBwYXR0ZXJuSGVpZ2h0IC0gMC41IH19Owor
ICAgIAorICAgIC8vIERhc2ggbGVuZ3RocyBmb3IgdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBl
cnJvciB1bmRlcmxpbmUgYXJlIHRoZSBzYW1lLgorICAgIC8vIFRoZXNlIGFyZSBtYWdpYy4KKyAg
ICBzdGF0aWMgY29uc3QgZmxvYXQgZWRnZV9kYXNoX2xlbmd0aHNbXSA9IHsyLCAyfTsKKyAgICBz
dGF0aWMgY29uc3QgZmxvYXQgbWlkZGxlX2Rhc2hfbGVuZ3Roc1tdID0gezIuNzZmLCAxLjI0Zn07
CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGVkZ2Vfb2Zmc2V0ID0gLShlZGdlX2Rhc2hfbGVuZ3Ro
c1sxXSAtIDEuMGYpIC8gMi4wZjsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgbWlkZGxlX29mZnNl
dCA9IC0obWlkZGxlX2Rhc2hfbGVuZ3Roc1sxXSAtIDEuMGYpIC8gMi4wZjsKKworICAgIC8vIExp
bmUgb3BhY2l0aWVzLiAgT25jZSBhZ2FpbiwgdGhlc2UgYXJlIG1hZ2ljLgorICAgIGNvbnN0IGZs
b2F0IHVwcGVyT3BhY2l0eSA9IDAuMzNmOworICAgIGNvbnN0IGZsb2F0IG1pZGRsZU9wYWNpdHkg
PSAwLjc1ZjsKKyAgICBjb25zdCBmbG9hdCBsb3dlck9wYWNpdHkgPSAwLjg4ZjsKKworICAgIC8v
VG9wIGxpbmUKKyAgICBDR0NvbnRleHRTZXRMaW5lRGFzaChjb250ZXh0LCBlZGdlX29mZnNldCwg
ZWRnZV9kYXNoX2xlbmd0aHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlZGdl
X2Rhc2hfbGVuZ3RocykgLyBzaXplb2YoZWRnZV9kYXNoX2xlbmd0aHNbMF0pKTsKKyAgICBDR0Nv
bnRleHRTZXRBbHBoYShjb250ZXh0LCB1cHBlck9wYWNpdHkpOworICAgIENHQ29udGV4dFN0cm9r
ZUxpbmVTZWdtZW50cyhjb250ZXh0LCB1cHBlclBvaW50cywgMik7CisgCisgICAgLy8gTWlkZGxl
IGxpbmUKKyAgICBDR0NvbnRleHRTZXRMaW5lRGFzaChjb250ZXh0LCBtaWRkbGVfb2Zmc2V0LCBt
aWRkbGVfZGFzaF9sZW5ndGhzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobWlk
ZGxlX2Rhc2hfbGVuZ3RocykgLyBzaXplb2YobWlkZGxlX2Rhc2hfbGVuZ3Roc1swXSkpOworICAg
IENHQ29udGV4dFNldEFscGhhKGNvbnRleHQsIG1pZGRsZU9wYWNpdHkpOworICAgIENHQ29udGV4
dFN0cm9rZUxpbmVTZWdtZW50cyhjb250ZXh0LCBtaWRkbGVQb2ludHMsIDIpOworICAgIAorICAg
IC8vIEJvdHRvbSBsaW5lCisgICAgQ0dDb250ZXh0U2V0TGluZURhc2goY29udGV4dCwgZWRnZV9v
ZmZzZXQsIGVkZ2VfZGFzaF9sZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVv
ZihlZGdlX2Rhc2hfbGVuZ3RocykgLyBzaXplb2YoZWRnZV9kYXNoX2xlbmd0aHNbMF0pKTsKKyAg
ICBDR0NvbnRleHRTZXRBbHBoYShjb250ZXh0LCBsb3dlck9wYWNpdHkpOworICAgIENHQ29udGV4
dFN0cm9rZUxpbmVTZWdtZW50cyhjb250ZXh0LCBsb3dlclBvaW50cywgMik7CisKKyAgICBDR0Nv
bnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOworfQorCisjaWYgRU5BQkxFKFNWRykKK0dyYXBo
aWNzQ29udGV4dCogY29udGV4dEZvckltYWdlKFNWR1Jlc291cmNlSW1hZ2UqKQoreworICAgIC8v
IEZJWE1FOiBUaGlzIHNob3VsZCBnbyBpbiBHcmFwaGljc0NvbnRleHRDRy5jcHAKKyAgICBub3RJ
bXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKK30KSW5kZXg6IFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENHV2luLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRDR1dp
bi5jcHAJKHJldmlzaW9uIDI5NzI2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4v
R3JhcGhpY3NDb250ZXh0Q0dXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAog
LyoKLSAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIw
MDUsIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoK
ICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yOSwyMSArMjksMTggQEAKICNpbmNsdWRl
ICJBZmZpbmVUcmFuc2Zvcm0uaCIKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1
ZGUgIlBhdGguaCIKKwogI2luY2x1ZGUgPENvcmVHcmFwaGljcy9DR0JpdG1hcENvbnRleHQuaD4K
ICNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+
Ci0jaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KLQotI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4
dFBsYXRmb3JtUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZUNHLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsK
IAotY2xhc3MgU1ZHUmVzb3VyY2VJbWFnZTsKLQogc3RhdGljIENHQ29udGV4dFJlZiBDR0NvbnRl
eHRXaXRoSERDKEhEQyBoZGMpCiB7Ci0gICAgSEJJVE1BUCBiaXRtYXAgPSAoSEJJVE1BUClHZXRD
dXJyZW50T2JqZWN0KGhkYywgT0JKX0JJVE1BUCk7CisgICAgSEJJVE1BUCBiaXRtYXAgPSBzdGF0
aWNfY2FzdDxIQklUTUFQPihHZXRDdXJyZW50T2JqZWN0KGhkYywgT0JKX0JJVE1BUCkpOwogICAg
IENHQ29sb3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0Io
KTsKICAgICBCSVRNQVAgaW5mbzsKIApAQCAtNzcsNiArNzQsOCBAQCBHcmFwaGljc0NvbnRleHQ6
OkdyYXBoaWNzQ29udGV4dChIREMgaGRjCiAgICAgfQogfQogCitib29sIEdyYXBoaWNzQ29udGV4
dDo6aW5UcmFuc3BhcmVuY3lMYXllcigpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS0+bV90cmFuc3Bh
cmVuY3lDb3VudDsgfQorCiBIREMgR3JhcGhpY3NDb250ZXh0OjpnZXRXaW5kb3dzQ29udGV4dChj
b25zdCBJbnRSZWN0JiBkc3RSZWN0LCBib29sIHN1cHBvcnRBbHBoYUJsZW5kKQogewogICAgIGlm
IChpblRyYW5zcGFyZW5jeUxheWVyKCkpIHsKQEAgLTExOCwxMCArMTE3LDEwIEBAIEhEQyBHcmFw
aGljc0NvbnRleHQ6OmdldFdpbmRvd3NDb250ZXh0KGMKIAogICAgICAgICAvLyBBcHBseSBhIHRy
YW5zbGF0aW9uIHRvIG91ciBjb250ZXh0IHNvIHRoYXQgdGhlIGRyYXdpbmcgZG9uZSB3aWxsIGJl
IGF0ICgwLDApIG9mIHRoZSBiaXRtYXAuCiAgICAgICAgIFhGT1JNIHhmb3JtOwotICAgICAgICB4
Zm9ybS5lTTExID0gMS4wOwotICAgICAgICB4Zm9ybS5lTTEyID0gMDsKLSAgICAgICAgeGZvcm0u
ZU0yMSA9IDA7Ci0gICAgICAgIHhmb3JtLmVNMjIgPSAxLjA7CisgICAgICAgIHhmb3JtLmVNMTEg
PSAxLjBmOworICAgICAgICB4Zm9ybS5lTTEyID0gMC4wZjsKKyAgICAgICAgeGZvcm0uZU0yMSA9
IDAuMGY7CisgICAgICAgIHhmb3JtLmVNMjIgPSAxLjBmOwogICAgICAgICB4Zm9ybS5lRHggPSAt
ZHN0UmVjdC54KCk7CiAgICAgICAgIHhmb3JtLmVEeSA9IC1kc3RSZWN0LnkoKTsKICAgICAgICAg
OjpTZXRXb3JsZFRyYW5zZm9ybShiaXRtYXBEQywgJnhmb3JtKTsKQEAgLTEzNCwxNSArMTMzLDEz
IEBAIEhEQyBHcmFwaGljc0NvbnRleHQ6OmdldFdpbmRvd3NDb250ZXh0KGMKICAgICByZXR1cm4g
bV9kYXRhLT5tX2hkYzsKIH0KIAotYm9vbCBHcmFwaGljc0NvbnRleHQ6OmluVHJhbnNwYXJlbmN5
TGF5ZXIoKSBjb25zdCB7IHJldHVybiBtX2RhdGEtPm1fdHJhbnNwYXJlbmN5Q291bnQ7IH0KLQog
dm9pZCBHcmFwaGljc0NvbnRleHQ6OnJlbGVhc2VXaW5kb3dzQ29udGV4dChIREMgaGRjLCBjb25z
dCBJbnRSZWN0JiBkc3RSZWN0LCBib29sIHN1cHBvcnRBbHBoYUJsZW5kKQogewogICAgIGlmICho
ZGMgJiYgaW5UcmFuc3BhcmVuY3lMYXllcigpKSB7CiAgICAgICAgIGlmIChkc3RSZWN0LmlzRW1w
dHkoKSkKICAgICAgICAgICAgIHJldHVybjsKIAotICAgICAgICBIQklUTUFQIGJpdG1hcCA9IChI
QklUTUFQKUdldEN1cnJlbnRPYmplY3QoaGRjLCBPQkpfQklUTUFQKTsKKyAgICAgICAgSEJJVE1B
UCBiaXRtYXAgPSBzdGF0aWNfY2FzdDxIQklUTUFQPihHZXRDdXJyZW50T2JqZWN0KGhkYywgT0JK
X0JJVE1BUCkpOwogCiAgICAgICAgIC8vIE5lZWQgdG8gbWFrZSBhIENHSW1hZ2Ugb3V0IG9mIHRo
ZSBiaXRtYXAncyBwaXhlbCBidWZmZXIgYW5kIHRoZW4gZHJhdwogICAgICAgICAvLyBpdCBpbnRv
IG91ciBjb250ZXh0LgpAQCAtMjAzLDExICsyMDAsMTEgQEAgdm9pZCBHcmFwaGljc0NvbnRleHRQ
bGF0Zm9ybVByaXZhdGU6OnNjYQogICAgICAgICByZXR1cm47CiAgICAgWEZPUk0geGZvcm07CiAg
ICAgeGZvcm0uZU0xMSA9IHNpemUud2lkdGgoKTsKLSAgICB4Zm9ybS5lTTEyID0gMDsKLSAgICB4
Zm9ybS5lTTIxID0gMDsKKyAgICB4Zm9ybS5lTTEyID0gMC4wZjsKKyAgICB4Zm9ybS5lTTIxID0g
MC4wZjsKICAgICB4Zm9ybS5lTTIyID0gc2l6ZS5oZWlnaHQoKTsKLSAgICB4Zm9ybS5lRHggPSAw
OwotICAgIHhmb3JtLmVEeSA9IDA7CisgICAgeGZvcm0uZUR4ID0gMC4wZjsKKyAgICB4Zm9ybS5l
RHkgPSAwLjBmOwogICAgIE1vZGlmeVdvcmxkVHJhbnNmb3JtKG1faGRjLCAmeGZvcm0sIE1XVF9M
RUZUTVVMVElQTFkpOwogfQogCkBAIC0yMjMsOCArMjIwLDggQEAgdm9pZCBHcmFwaGljc0NvbnRl
eHRQbGF0Zm9ybVByaXZhdGU6OnJvdAogICAgIHhmb3JtLmVNMTIgPSAtc2luQW5nbGU7CiAgICAg
eGZvcm0uZU0yMSA9IHNpbkFuZ2xlOwogICAgIHhmb3JtLmVNMjIgPSBjb3NBbmdsZTsKLSAgICB4
Zm9ybS5lRHggPSAwOwotICAgIHhmb3JtLmVEeSA9IDA7CisgICAgeGZvcm0uZUR4ID0gMC4wZjsK
KyAgICB4Zm9ybS5lRHkgPSAwLjBmOwogICAgIE1vZGlmeVdvcmxkVHJhbnNmb3JtKG1faGRjLCAm
eGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOwogfQogCkBAIC0yMzMsMTAgKzIzMCwxMCBAQCB2b2lk
IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6dHJhCiAgICAgaWYgKCFtX2hkYykKICAg
ICAgICAgcmV0dXJuOwogICAgIFhGT1JNIHhmb3JtOwotICAgIHhmb3JtLmVNMTEgPSAxLjA7Ci0g
ICAgeGZvcm0uZU0xMiA9IDA7Ci0gICAgeGZvcm0uZU0yMSA9IDA7Ci0gICAgeGZvcm0uZU0yMiA9
IDEuMDsKKyAgICB4Zm9ybS5lTTExID0gMS4wZjsKKyAgICB4Zm9ybS5lTTEyID0gMC4wZjsKKyAg
ICB4Zm9ybS5lTTIxID0gMC4wZjsKKyAgICB4Zm9ybS5lTTIyID0gMS4wZjsKICAgICB4Zm9ybS5l
RHggPSB4OwogICAgIHhmb3JtLmVEeSA9IHk7CiAgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9o
ZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7CkBAIC0yNDYsNiArMjQzLDcgQEAgdm9pZCBH
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNvbgogewogICAgIGlmICghbV9oZGMpCiAg
ICAgICAgIHJldHVybjsKKwogICAgIENHQWZmaW5lVHJhbnNmb3JtIG1hdCA9IHRyYW5zZm9ybTsK
ICAgICBYRk9STSB4Zm9ybTsKICAgICB4Zm9ybS5lTTExID0gbWF0LmE7CkBAIC0yNTQsNiArMjUy
LDcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNvbgogICAgIHhmb3Jt
LmVNMjIgPSBtYXQuZDsKICAgICB4Zm9ybS5lRHggPSBtYXQudHg7CiAgICAgeGZvcm0uZUR5ID0g
bWF0LnR5OworCiAgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xF
RlRNVUxUSVBMWSk7CiB9CiAKQEAgLTI4Nyw2ICsyODYsMTQgQEAgdm9pZCBHcmFwaGljc0NvbnRl
eHQ6OmRyYXdGb2N1c1JpbmcoY29ucwogICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29udGV4
dCk7CiB9CiAKKy8vIFB1bGxlZCBmcm9tIEdyYXBoaWNzQ29udGV4dENHCitzdGF0aWMgdm9pZCBz
ZXRDR1N0cm9rZUNvbG9yKENHQ29udGV4dFJlZiBjb250ZXh0LCBjb25zdCBDb2xvciYgY29sb3Ip
Cit7CisgICAgQ0dGbG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKKyAgICBjb2xvci5nZXRS
R0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAgICBDR0NvbnRleHRTZXRSR0JTdHJva2VD
b2xvcihjb250ZXh0LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Cit9CisKIHN0YXRpYyBjb25z
dCBDb2xvciYgc3BlbGxpbmdQYXR0ZXJuQ29sb3IoKSB7CiAgICAgc3RhdGljIGNvbnN0IENvbG9y
IHNwZWxsaW5nQ29sb3IoMjU1LCAwLCAwKTsKICAgICByZXR1cm4gc3BlbGxpbmdDb2xvcjsKQEAg
LTI5NywxOSArMzA0LDExIEBAIHN0YXRpYyBjb25zdCBDb2xvciYgZ3JhbW1hclBhdHRlcm5Db2xv
cigKICAgICByZXR1cm4gZ3JhbW1hckNvbG9yOwogfQogCi0vLyBQdWxsZWQgZnJvbSBHcmFwaGlj
c0NvbnRleHRDRwotc3RhdGljIHZvaWQgc2V0Q0dTdHJva2VDb2xvcihDR0NvbnRleHRSZWYgY29u
dGV4dCwgY29uc3QgQ29sb3ImIGNvbG9yKQotewotICAgIENHRmxvYXQgcmVkLCBncmVlbiwgYmx1
ZSwgYWxwaGE7Ci0gICAgY29sb3IuZ2V0UkdCQShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci0g
ICAgQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IoY29udGV4dCwgcmVkLCBncmVlbiwgYmx1ZSwg
YWxwaGEpOwotfQotCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JNaXNzcGVsbGlu
Z09yQmFkR3JhbW1hcihjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCB3aWR0aCwgYm9vbCBncmFt
bWFyKQogewogICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCiAgICAgICAgIHJldHVybjsKLSAg
ICAKKwogICAgIC8vIFRoZXNlIGFyZSB0aGUgc2FtZSBmb3IgbWlzc3BlbGxpbmcgb3IgYmFkIGdy
YW1tYXIKICAgICBjb25zdCBpbnQgcGF0dGVybkhlaWdodCA9IDM7IC8vIDMgcm93cwogICAgIEFT
U0VSVChjTWlzc3BlbGxpbmdMaW5lVGhpY2tuZXNzID09IHBhdHRlcm5IZWlnaHQpOwpAQCAtMzQz
LDcgKzM0Miw3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvck1pc3NwZWwKICAg
ICAKICAgICAvLyBEYXNoIGxlbmd0aHMgZm9yIHRoZSB0b3AgYW5kIGJvdHRvbSBvZiB0aGUgZXJy
b3IgdW5kZXJsaW5lIGFyZSB0aGUgc2FtZS4KICAgICAvLyBUaGVzZSBhcmUgbWFnaWMuCi0gICAg
c3RhdGljIGNvbnN0IGZsb2F0IGVkZ2VfZGFzaF9sZW5ndGhzW10gPSB7MiwgMn07CisgICAgc3Rh
dGljIGNvbnN0IGZsb2F0IGVkZ2VfZGFzaF9sZW5ndGhzW10gPSB7Mi4wZiwgMi4wZn07CiAgICAg
c3RhdGljIGNvbnN0IGZsb2F0IG1pZGRsZV9kYXNoX2xlbmd0aHNbXSA9IHsyLjc2ZiwgMS4yNGZ9
OwogICAgIHN0YXRpYyBjb25zdCBmbG9hdCBlZGdlX29mZnNldCA9IC0oZWRnZV9kYXNoX2xlbmd0
aHNbMV0gLSAxLjBmKSAvIDIuMGY7CiAgICAgc3RhdGljIGNvbnN0IGZsb2F0IG1pZGRsZV9vZmZz
ZXQgPSAtKG1pZGRsZV9kYXNoX2xlbmd0aHNbMV0gLSAxLjBmKSAvIDIuMGY7CkBAIC0zNzQsMTMg
KzM3Myw0IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvck1pc3NwZWwKICAgICBD
R0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOwogfQogCi0jaWYgRU5BQkxFKFNWRykKLUdy
YXBoaWNzQ29udGV4dCogY29udGV4dEZvckltYWdlKFNWR1Jlc291cmNlSW1hZ2UqKQotewotICAg
IC8vIEZJWE1FOiBUaGlzIHNob3VsZCBnbyBpbiBHcmFwaGljc0NvbnRleHRDRy5jcHAKLSAgICBu
b3RJbXBsZW1lbnRlZCgpOwotICAgIHJldHVybiAwOwotfQotI2VuZGlmCi0KIH0KSW5kZXg6IFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENhaXJvV2luLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRl
eHRDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbi9HcmFwaGljc0NvbnRleHRDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
MTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkdyYXBoaWNz
Q29udGV4dC5oIgorCisjaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCisjaW5jbHVkZSAiTm90
SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQYXRoLmgiCisKKyNpbmNsdWRlIDxjYWlyby13aW4z
Mi5oPgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZUNhaXJvLmgiCisK
K3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworR3JhcGhpY3ND
b250ZXh0OjpHcmFwaGljc0NvbnRleHQoSERDIGRjKQorICAgIDogbV9jb21tb24oY3JlYXRlR3Jh
cGhpY3NDb250ZXh0UHJpdmF0ZSgpKQorICAgICwgbV9kYXRhKG5ldyBHcmFwaGljc0NvbnRleHRQ
bGF0Zm9ybVByaXZhdGUpCit7CisgICAgaWYgKGRjKSB7CisgICAgICAgIGNhaXJvX3N1cmZhY2Vf
dCogc3VyZmFjZSA9IGNhaXJvX3dpbjMyX3N1cmZhY2VfY3JlYXRlKGRjKTsKKyAgICAgICAgbV9k
YXRhLT5jciA9IGNhaXJvX2NyZWF0ZShzdXJmYWNlKTsKKyAgICAgICAgbV9kYXRhLT5tX2hkYyA9
IGRjOworICAgIH0gZWxzZSB7CisgICAgICAgIHNldFBhaW50aW5nRGlzYWJsZWQodHJ1ZSk7Cisg
ICAgICAgIG1fZGF0YS0+Y3IgPSAwOworICAgICAgICBtX2RhdGEtPm1faGRjID0gMDsKKyAgICB9
CisKKyAgICBpZiAobV9kYXRhLT5jcikgeworICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGNvbnRl
eHQgc3RhcnRzIGluIHN5bmMgd2l0aCBvdXIgc3RhdGUuCisgICAgICAgIHNldFBsYXRmb3JtRmls
bENvbG9yKGZpbGxDb2xvcigpKTsKKyAgICAgICAgc2V0UGxhdGZvcm1TdHJva2VDb2xvcihzdHJv
a2VDb2xvcigpKTsKKyAgICB9Cit9CisKK0hEQyBHcmFwaGljc0NvbnRleHQ6OmdldFdpbmRvd3ND
b250ZXh0KGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGJvb2wgc3VwcG9ydEFscGhhQmxlbmQpCit7
CisgICAgLy8gVGhpcyBpcyBwcm9iYWJseSB3cm9uZywgYW5kIGRlZmluaXRlbHkgb3V0IG9mIGRh
dGUuICBQdWxsZWQgZnJvbSBvbGQgU1ZOCisgICAgY2Fpcm9fc3VyZmFjZV90KiBzdXJmYWNlID0g
Y2Fpcm9fZ2V0X3RhcmdldChwbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgSERDIGhkYyA9IGNhaXJv
X3dpbjMyX3N1cmZhY2VfZ2V0X2RjKHN1cmZhY2UpOyAgIAorICAgIFNhdmVEQyhoZGMpOworCisg
ICAgLy8gRklYTUU6IFdlIG5lZWQgdG8gbWFrZSBzdXJlIGEgY2xpcCBpcyByZWFsbHkgc2V0IG9u
IHRoZSBIREMuCisgICAgLy8gQ2FsbCBTZXRXb3JsZFRyYW5zZm9ybSB0byBob25vciB0aGUgY3Vy
cmVudCBDYWlybyB0cmFuc2Zvcm0uCisgICAgU2V0R3JhcGhpY3NNb2RlKGhkYywgR01fQURWQU5D
RUQpOyAvLyBXZSBuZWVkIHRoaXMgY2FsbCBmb3IgdGhlbWVzIHRvIGhvbm9yIHdvcmxkIHRyYW5z
Zm9ybXMuCisgICAgY2Fpcm9fbWF0cml4X3QgbWF0OworICAgIGNhaXJvX2dldF9tYXRyaXgocGxh
dGZvcm1Db250ZXh0KCksICZtYXQpOworICAgIFhGT1JNIHhmb3JtOworICAgIHhmb3JtLmVNMTEg
PSBtYXQueHg7CisgICAgeGZvcm0uZU0xMiA9IG1hdC54eTsKKyAgICB4Zm9ybS5lTTIxID0gbWF0
Lnl4OworICAgIHhmb3JtLmVNMjIgPSBtYXQueXk7CisgICAgeGZvcm0uZUR4ID0gbWF0LngwOwor
ICAgIHhmb3JtLmVEeSA9IG1hdC55MDsKKyAgICBTZXRXb3JsZFRyYW5zZm9ybShoZGMsICZ4Zm9y
bSk7CisKKyAgICByZXR1cm4gaGRjOworfQorCitib29sIEdyYXBoaWNzQ29udGV4dDo6aW5UcmFu
c3BhcmVuY3lMYXllcigpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS0+bV90cmFuc3BhcmVuY3lDb3Vu
dDsgfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6cmVsZWFzZVdpbmRvd3NDb250ZXh0KEhEQyBo
ZGMsIGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGJvb2wgc3VwcG9ydEFscGhhQmxlbmQpCit7Cisg
ICAgY2Fpcm9fc3VyZmFjZV90KiBzdXJmYWNlID0gY2Fpcm9fZ2V0X3RhcmdldChwbGF0Zm9ybUNv
bnRleHQoKSk7CisgICAgSERDIGhkYzIgPSBjYWlyb193aW4zMl9zdXJmYWNlX2dldF9kYyhzdXJm
YWNlKTsKKyAgICBSZXN0b3JlREMoaGRjMiwgLTEpOworICAgIGNhaXJvX3N1cmZhY2VfbWFya19k
aXJ0eShzdXJmYWNlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNvbmNhdENUTShjb25z
dCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSkKK3sKKyAgICBjYWlyb19zdXJmYWNlX3QqIHN1
cmZhY2UgPSBjYWlyb19nZXRfdGFyZ2V0KHBsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBIREMgaGRj
ID0gY2Fpcm9fd2luMzJfc3VyZmFjZV9nZXRfZGMoc3VyZmFjZSk7ICAgCisgICAgU2F2ZURDKGhk
Yyk7CisKKyAgICBjYWlyb19tYXRyaXhfdCBtYXQ7CisgICAgY2Fpcm9fZ2V0X21hdHJpeChwbGF0
Zm9ybUNvbnRleHQoKSwgJm1hdCk7CisgICAgWEZPUk0geGZvcm07CisgICAgeGZvcm0uZU0xMSA9
IG1hdC54eDsKKyAgICB4Zm9ybS5lTTEyID0gbWF0Lnh5OworICAgIHhmb3JtLmVNMjEgPSBtYXQu
eXg7CisgICAgeGZvcm0uZU0yMiA9IG1hdC55eTsKKyAgICB4Zm9ybS5lRHggPSBtYXQueDA7Cisg
ICAgeGZvcm0uZUR5ID0gbWF0LnkwOworCisgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0oaGRjLCAm
eGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOworfQorCit9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dFdpbi5jcHAJKHJldmlzaW9u
IDI5ODM0KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0
V2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQg
KEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAy
MDA4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucwpAQCAtMjksMzUxICsyOSwxNCBAQAogI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9y
bS5oIgogI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCiAjaW5jbHVkZSAiUGF0aC5oIgotI2lu
Y2x1ZGUgPENvcmVHcmFwaGljcy9DR0JpdG1hcENvbnRleHQuaD4KLSNpbmNsdWRlIDxXZWJLaXRT
eXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8d3RmL01h
dGhFeHRyYXMuaD4KIAotI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZS5o
IgotCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIGNsYXNz
IFNWR1Jlc291cmNlSW1hZ2U7CiAKLXN0YXRpYyBDR0NvbnRleHRSZWYgQ0dDb250ZXh0V2l0aEhE
QyhIREMgaGRjKQotewotICAgIEhCSVRNQVAgYml0bWFwID0gKEhCSVRNQVApR2V0Q3VycmVudE9i
amVjdChoZGMsIE9CSl9CSVRNQVApOwotICAgIENHQ29sb3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBD
R0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKLSAgICBCSVRNQVAgaW5mbzsKLQotICAgIEdl
dE9iamVjdChiaXRtYXAsIHNpemVvZihpbmZvKSwgJmluZm8pOwotICAgIEFTU0VSVChpbmZvLmJt
Qml0c1BpeGVsID09IDMyKTsKLSAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IENHQml0bWFwQ29u
dGV4dENyZWF0ZShpbmZvLmJtQml0cywgaW5mby5ibVdpZHRoLCBpbmZvLmJtSGVpZ2h0LCA4LAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uYm1X
aWR0aEJ5dGVzLCBkZXZpY2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwga0NHSW1h
Z2VBbHBoYU5vbmVTa2lwRmlyc3QpOwotICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdC
KTsKLQotICAgIC8vIEZsaXAgY29vcmRzCi0gICAgQ0dDb250ZXh0VHJhbnNsYXRlQ1RNKGNvbnRl
eHQsIDAsIGluZm8uYm1IZWlnaHQpOwotICAgIENHQ29udGV4dFNjYWxlQ1RNKGNvbnRleHQsIDEs
IC0xKTsKLSAgICAKLSAgICAvLyBQdXQgdGhlIEhEQyBJbiBhZHZhbmNlZCBtb2RlIHNvIGl0IHdp
bGwgaG9ub3IgYWZmaW5lIHRyYW5zZm9ybXMuCi0gICAgU2V0R3JhcGhpY3NNb2RlKGhkYywgR01f
QURWQU5DRUQpOwotICAgIAotICAgIHJldHVybiBjb250ZXh0OwotfQotCi1HcmFwaGljc0NvbnRl
eHQ6OkdyYXBoaWNzQ29udGV4dChIREMgaGRjKQotICAgIDogbV9jb21tb24oY3JlYXRlR3JhcGhp
Y3NDb250ZXh0UHJpdmF0ZSgpKQotICAgICwgbV9kYXRhKG5ldyBHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGUoQ0dDb250ZXh0V2l0aEhEQyhoZGMpKSkKLXsKLSAgICBDR0NvbnRleHRSZWxl
YXNlKG1fZGF0YS0+bV9jZ0NvbnRleHQpOwotICAgIG1fZGF0YS0+bV9oZGMgPSBoZGM7Ci0gICAg
c2V0UGFpbnRpbmdEaXNhYmxlZCghbV9kYXRhLT5tX2NnQ29udGV4dCk7Ci0gICAgaWYgKG1fZGF0
YS0+bV9jZ0NvbnRleHQpIHsKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBjb250ZXh0IHN0YXJ0
cyBpbiBzeW5jIHdpdGggb3VyIHN0YXRlLgotICAgICAgICBzZXRQbGF0Zm9ybUZpbGxDb2xvcihm
aWxsQ29sb3IoKSk7Ci0gICAgICAgIHNldFBsYXRmb3JtU3Ryb2tlQ29sb3Ioc3Ryb2tlQ29sb3Io
KSk7Ci0gICAgfQotfQotCi1IREMgR3JhcGhpY3NDb250ZXh0OjpnZXRXaW5kb3dzQ29udGV4dChj
b25zdCBJbnRSZWN0JiBkc3RSZWN0LCBib29sIHN1cHBvcnRBbHBoYUJsZW5kKQotewotICAgIGlm
IChpblRyYW5zcGFyZW5jeUxheWVyKCkpIHsKLSAgICAgICAgaWYgKGRzdFJlY3QuaXNFbXB0eSgp
KQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgYml0bWFwIERD
IGluIHdoaWNoIHRvIGRyYXcuCi0gICAgICAgIEJJVE1BUElORk8gYml0bWFwSW5mbzsKLSAgICAg
ICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlTaXplICAgICAgICAgID0gc2l6ZW9mKEJJVE1BUElO
Rk9IRUFERVIpOwotICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVdpZHRoICAgICAgICAg
PSBkc3RSZWN0LndpZHRoKCk7IAotICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUhlaWdo
dCAgICAgICAgPSBkc3RSZWN0LmhlaWdodCgpOwotICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRl
ci5iaVBsYW5lcyAgICAgICAgPSAxOwotICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUJp
dENvdW50ICAgICAgPSAzMjsKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlDb21wcmVz
c2lvbiAgID0gQklfUkdCOwotICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVNpemVJbWFn
ZSAgICAgPSAwOwotICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVhQZWxzUGVyTWV0ZXIg
PSAwOwotICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVlQZWxzUGVyTWV0ZXIgPSAwOwot
ICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUNsclVzZWQgICAgICAgPSAwOwotICAgICAg
ICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUNsckltcG9ydGFudCAgPSAwOwotCi0gICAgICAgIHZv
aWQqIHBpeGVscyA9IDA7Ci0gICAgICAgIEhCSVRNQVAgYml0bWFwID0gOjpDcmVhdGVESUJTZWN0
aW9uKE5VTEwsICZiaXRtYXBJbmZvLCBESUJfUkdCX0NPTE9SUywgJnBpeGVscywgMCwgMCk7Ci0g
ICAgICAgIGlmICghYml0bWFwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgSERD
IGJpdG1hcERDID0gOjpDcmVhdGVDb21wYXRpYmxlREMobV9kYXRhLT5tX2hkYyk7Ci0gICAgICAg
IDo6U2VsZWN0T2JqZWN0KGJpdG1hcERDLCBiaXRtYXApOwotCi0gICAgICAgIC8vIEZpbGwgb3Vy
IGJ1ZmZlciB3aXRoIGNsZWFyIGlmIHdlJ3JlIGdvaW5nIHRvIGFscGhhIGJsZW5kLgotICAgICAg
ICBpZiAoc3VwcG9ydEFscGhhQmxlbmQpIHsKLSAgICAgICAgICAgIEJJVE1BUCBibXBJbmZvOwot
ICAgICAgICAgICAgR2V0T2JqZWN0KGJpdG1hcCwgc2l6ZW9mKGJtcEluZm8pLCAmYm1wSW5mbyk7
Ci0gICAgICAgICAgICBpbnQgYnVmZmVyU2l6ZSA9IGJtcEluZm8uYm1XaWR0aEJ5dGVzICogYm1w
SW5mby5ibUhlaWdodDsKLSAgICAgICAgICAgIG1lbXNldChibXBJbmZvLmJtQml0cywgMCwgYnVm
ZmVyU2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNYWtlIHN1cmUgd2UgY2FuIGRvIHdv
cmxkIHRyYW5zZm9ybXMuCi0gICAgICAgIFNldEdyYXBoaWNzTW9kZShiaXRtYXBEQywgR01fQURW
QU5DRUQpOwotCi0gICAgICAgIC8vIEFwcGx5IGEgdHJhbnNsYXRpb24gdG8gb3VyIGNvbnRleHQg
c28gdGhhdCB0aGUgZHJhd2luZyBkb25lIHdpbGwgYmUgYXQgKDAsMCkgb2YgdGhlIGJpdG1hcC4K
LSAgICAgICAgWEZPUk0geGZvcm07Ci0gICAgICAgIHhmb3JtLmVNMTEgPSAxLjA7Ci0gICAgICAg
IHhmb3JtLmVNMTIgPSAwOwotICAgICAgICB4Zm9ybS5lTTIxID0gMDsKLSAgICAgICAgeGZvcm0u
ZU0yMiA9IDEuMDsKLSAgICAgICAgeGZvcm0uZUR4ID0gLWRzdFJlY3QueCgpOwotICAgICAgICB4
Zm9ybS5lRHkgPSAtZHN0UmVjdC55KCk7Ci0gICAgICAgIDo6U2V0V29ybGRUcmFuc2Zvcm0oYml0
bWFwREMsICZ4Zm9ybSk7Ci0KLSAgICAgICAgcmV0dXJuIGJpdG1hcERDOwotICAgIH0KLQotICAg
IENHQ29udGV4dEZsdXNoKHBsYXRmb3JtQ29udGV4dCgpKTsKLSAgICBtX2RhdGEtPnNhdmUoKTsK
LSAgICByZXR1cm4gbV9kYXRhLT5tX2hkYzsKLX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQ6Omlu
VHJhbnNwYXJlbmN5TGF5ZXIoKSBjb25zdCB7IHJldHVybiBtX2RhdGEtPm1fdHJhbnNwYXJlbmN5
Q291bnQ7IH0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnJlbGVhc2VXaW5kb3dzQ29udGV4dChI
REMgaGRjLCBjb25zdCBJbnRSZWN0JiBkc3RSZWN0LCBib29sIHN1cHBvcnRBbHBoYUJsZW5kKQot
ewotICAgIGlmIChoZGMgJiYgaW5UcmFuc3BhcmVuY3lMYXllcigpKSB7Ci0gICAgICAgIGlmIChk
c3RSZWN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBIQklUTUFQ
IGJpdG1hcCA9IChIQklUTUFQKUdldEN1cnJlbnRPYmplY3QoaGRjLCBPQkpfQklUTUFQKTsKLQot
ICAgICAgICAvLyBOZWVkIHRvIG1ha2UgYSBDR0ltYWdlIG91dCBvZiB0aGUgYml0bWFwJ3MgcGl4
ZWwgYnVmZmVyIGFuZCB0aGVuIGRyYXcKLSAgICAgICAgLy8gaXQgaW50byBvdXIgY29udGV4dC4K
LSAgICAgICAgQklUTUFQIGluZm87Ci0gICAgICAgIEdldE9iamVjdChiaXRtYXAsIHNpemVvZihp
bmZvKSwgJmluZm8pOwotICAgICAgICBBU1NFUlQoaW5mby5ibUJpdHNQaXhlbCA9PSAzMik7Ci0K
LSAgICAgICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURl
dmljZVJHQigpOwotICAgICAgICBDR0NvbnRleHRSZWYgYml0bWFwQ29udGV4dCA9IENHQml0bWFw
Q29udGV4dENyZWF0ZShpbmZvLmJtQml0cywgaW5mby5ibVdpZHRoLCBpbmZvLmJtSGVpZ2h0LCA4
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBpbmZvLmJtV2lkdGhCeXRlcywgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxp
dHRsZSB8IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAoc3VwcG9ydEFscGhhQmxlbmQgPyBrQ0dJbWFnZUFscGhhUHJlbXVsdGlwbGll
ZEZpcnN0IDoga0NHSW1hZ2VBbHBoYU5vbmVTa2lwRmlyc3QpKTsKLSAgICAgICAgQ0dDb2xvclNw
YWNlUmVsZWFzZShkZXZpY2VSR0IpOwotCi0gICAgICAgIENHSW1hZ2VSZWYgaW1hZ2UgPSBDR0Jp
dG1hcENvbnRleHRDcmVhdGVJbWFnZShiaXRtYXBDb250ZXh0KTsKLSAgICAgICAgQ0dDb250ZXh0
RHJhd0ltYWdlKG1fZGF0YS0+bV9jZ0NvbnRleHQsIGRzdFJlY3QsIGltYWdlKTsKLSAgICAgICAg
Ci0gICAgICAgIC8vIERlbGV0ZSBhbGwgb3VyIGp1bmsuCi0gICAgICAgIENHSW1hZ2VSZWxlYXNl
KGltYWdlKTsKLSAgICAgICAgQ0dDb250ZXh0UmVsZWFzZShiaXRtYXBDb250ZXh0KTsKLSAgICAg
ICAgOjpEZWxldGVEQyhoZGMpOwotICAgICAgICA6OkRlbGV0ZU9iamVjdChiaXRtYXApOwotCi0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtX2RhdGEtPnJlc3RvcmUoKTsKLX0KLQotdm9p
ZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnNhdmUoKQotewotICAgIGlmICghbV9o
ZGMpCi0gICAgICAgIHJldHVybjsKLSAgICBTYXZlREMobV9oZGMpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6cmVzdG9yZSgpCi17Ci0gICAgaWYgKCFtX2hkYykK
LSAgICAgICAgcmV0dXJuOwotICAgIFJlc3RvcmVEQyhtX2hkYywgLTEpOwotfQotCi12b2lkIEdy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y2xpcChjb25zdCBJbnRSZWN0JiBjbGlwUmVj
dCkKLXsKLSAgICBpZiAoIW1faGRjKQotICAgICAgICByZXR1cm47Ci0gICAgSW50ZXJzZWN0Q2xp
cFJlY3QobV9oZGMsIGNsaXBSZWN0LngoKSwgY2xpcFJlY3QueSgpLCBjbGlwUmVjdC5yaWdodCgp
LCBjbGlwUmVjdC5ib3R0b20oKSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlOjpjbGlwKGNvbnN0IFBhdGgmKQotewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci19Ci0K
LXZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpzY2FsZShjb25zdCBGbG9hdFNp
emUmIHNpemUpCi17Ci0gICAgaWYgKCFtX2hkYykKLSAgICAgICAgcmV0dXJuOwotICAgIFhGT1JN
IHhmb3JtOwotICAgIHhmb3JtLmVNMTEgPSBzaXplLndpZHRoKCk7Ci0gICAgeGZvcm0uZU0xMiA9
IDA7Ci0gICAgeGZvcm0uZU0yMSA9IDA7Ci0gICAgeGZvcm0uZU0yMiA9IHNpemUuaGVpZ2h0KCk7
Ci0gICAgeGZvcm0uZUR4ID0gMDsKLSAgICB4Zm9ybS5lRHkgPSAwOwotICAgIE1vZGlmeVdvcmxk
VHJhbnNmb3JtKG1faGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOwotfQotCi1zdGF0aWMg
Y29uc3QgZG91YmxlIGRlZzJyYWQgPSAwLjAxNzQ1MzI5MjUxOTk0MzI5NTc2OTsgLy8gcGkvMTgw
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpyb3RhdGUoZmxvYXQgZGVn
cmVlc0FuZ2xlKQotewotICAgIGZsb2F0IHJhZGlhbnNBbmdsZSA9IGRlZ3JlZXNBbmdsZSAqIGRl
ZzJyYWQ7Ci0gICAgZmxvYXQgY29zQW5nbGUgPSBjb3NmKHJhZGlhbnNBbmdsZSk7Ci0gICAgZmxv
YXQgc2luQW5nbGUgPSBzaW5mKHJhZGlhbnNBbmdsZSk7Ci0gICAgWEZPUk0geGZvcm07Ci0gICAg
eGZvcm0uZU0xMSA9IGNvc0FuZ2xlOwotICAgIHhmb3JtLmVNMTIgPSAtc2luQW5nbGU7Ci0gICAg
eGZvcm0uZU0yMSA9IHNpbkFuZ2xlOwotICAgIHhmb3JtLmVNMjIgPSBjb3NBbmdsZTsKLSAgICB4
Zm9ybS5lRHggPSAwOwotICAgIHhmb3JtLmVEeSA9IDA7Ci0gICAgTW9kaWZ5V29ybGRUcmFuc2Zv
cm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlOjp0cmFuc2xhdGUoZmxvYXQgeCAsIGZsb2F0IHkpCi17Ci0g
ICAgaWYgKCFtX2hkYykKLSAgICAgICAgcmV0dXJuOwotICAgIFhGT1JNIHhmb3JtOwotICAgIHhm
b3JtLmVNMTEgPSAxLjA7Ci0gICAgeGZvcm0uZU0xMiA9IDA7Ci0gICAgeGZvcm0uZU0yMSA9IDA7
Ci0gICAgeGZvcm0uZU0yMiA9IDEuMDsKLSAgICB4Zm9ybS5lRHggPSB4OwotICAgIHhmb3JtLmVE
eSA9IHk7Ci0gICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRN
VUxUSVBMWSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpjb25j
YXRDVE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFuc2Zvcm0pCi17Ci0gICAgaWYgKCFtX2hk
YykKLSAgICAgICAgcmV0dXJuOwotICAgIENHQWZmaW5lVHJhbnNmb3JtIG1hdCA9IHRyYW5zZm9y
bTsKLSAgICBYRk9STSB4Zm9ybTsKLSAgICB4Zm9ybS5lTTExID0gbWF0LmE7Ci0gICAgeGZvcm0u
ZU0xMiA9IG1hdC5iOwotICAgIHhmb3JtLmVNMjEgPSBtYXQuYzsKLSAgICB4Zm9ybS5lTTIyID0g
bWF0LmQ7Ci0gICAgeGZvcm0uZUR4ID0gbWF0LnR4OwotICAgIHhmb3JtLmVEeSA9IG1hdC50eTsK
LSAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShtX2hkYywgJnhmb3JtLCBNV1RfTEVGVE1VTFRJUExZ
KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1c1JpbmcoY29uc3QgQ29sb3Im
IGNvbG9yKQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsK
LQotICAgIGZsb2F0IHJhZGl1cyA9IChmb2N1c1JpbmdXaWR0aCgpIC0gMSkgLyAyLjBmOwotICAg
IGludCBvZmZzZXQgPSByYWRpdXMgKyBmb2N1c1JpbmdPZmZzZXQoKTsKLSAgICBDR0NvbG9yUmVm
IGNvbG9yUmVmID0gY29sb3IuaXNWYWxpZCgpID8gY2dDb2xvcihjb2xvcikgOiAwOwotCi0gICAg
Q0dNdXRhYmxlUGF0aFJlZiBmb2N1c1JpbmdQYXRoID0gQ0dQYXRoQ3JlYXRlTXV0YWJsZSgpOwot
ICAgIGNvbnN0IFZlY3RvcjxJbnRSZWN0PiYgcmVjdHMgPSBmb2N1c1JpbmdSZWN0cygpOwotICAg
IHVuc2lnbmVkIHJlY3RDb3VudCA9IHJlY3RzLnNpemUoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgcmVjdENvdW50OyBpKyspCi0gICAgICAgIENHUGF0aEFkZFJlY3QoZm9jdXNSaW5n
UGF0aCwgMCwgQ0dSZWN0SW5zZXQocmVjdHNbaV0sIC1vZmZzZXQsIC1vZmZzZXQpKTsKLQotICAg
IENHQ29udGV4dFJlZiBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCk7Ci0gICAgQ0dDb250ZXh0
U2F2ZUdTdGF0ZShjb250ZXh0KTsKLQotICAgIENHQ29udGV4dEJlZ2luUGF0aChjb250ZXh0KTsK
LSAgICBDR0NvbnRleHRBZGRQYXRoKGNvbnRleHQsIGZvY3VzUmluZ1BhdGgpOwotCi0gICAgd2tE
cmF3Rm9jdXNSaW5nKGNvbnRleHQsIGNvbG9yUmVmLCByYWRpdXMpOwotCi0gICAgQ0dDb2xvclJl
bGVhc2UoY29sb3JSZWYpOwotCi0gICAgQ0dQYXRoUmVsZWFzZShmb2N1c1JpbmdQYXRoKTsKLQot
ICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29udGV4dCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBD
b2xvciYgc3BlbGxpbmdQYXR0ZXJuQ29sb3IoKSB7Ci0gICAgc3RhdGljIGNvbnN0IENvbG9yIHNw
ZWxsaW5nQ29sb3IoMjU1LCAwLCAwKTsKLSAgICByZXR1cm4gc3BlbGxpbmdDb2xvcjsKLX0KLQot
c3RhdGljIGNvbnN0IENvbG9yJiBncmFtbWFyUGF0dGVybkNvbG9yKCkgewotICAgIHN0YXRpYyBj
b25zdCBDb2xvciBncmFtbWFyQ29sb3IoMCwgMTI4LCAwKTsKLSAgICByZXR1cm4gZ3JhbW1hckNv
bG9yOwotfQotCi0vLyBQdWxsZWQgZnJvbSBHcmFwaGljc0NvbnRleHRDRwotc3RhdGljIHZvaWQg
c2V0Q0dTdHJva2VDb2xvcihDR0NvbnRleHRSZWYgY29udGV4dCwgY29uc3QgQ29sb3ImIGNvbG9y
KQotewotICAgIENHRmxvYXQgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGE7Ci0gICAgY29sb3IuZ2V0
UkdCQShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci0gICAgQ0dDb250ZXh0U2V0UkdCU3Ryb2tl
Q29sb3IoY29udGV4dCwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JNaXNzcGVsbGluZ09yQmFkR3JhbW1hcihjb25zdCBJbnRQ
b2ludCYgcG9pbnQsIGludCB3aWR0aCwgYm9vbCBncmFtbWFyKQotewotICAgIGlmIChwYWludGlu
Z0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICAvLyBUaGVzZSBhcmUgdGhl
IHNhbWUgZm9yIG1pc3NwZWxsaW5nIG9yIGJhZCBncmFtbWFyCi0gICAgY29uc3QgaW50IHBhdHRl
cm5IZWlnaHQgPSAzOyAvLyAzIHJvd3MKLSAgICBBU1NFUlQoY01pc3NwZWxsaW5nTGluZVRoaWNr
bmVzcyA9PSBwYXR0ZXJuSGVpZ2h0KTsKLSAgICBjb25zdCBpbnQgcGF0dGVybldpZHRoID0gNDsg
Ly8gNCBwaXhlbHMKLSAgICBBU1NFUlQocGF0dGVybldpZHRoID09IGNNaXNzcGVsbGluZ0xpbmVQ
YXR0ZXJuV2lkdGgpOwotCi0gICAgLy8gTWFrZSBzdXJlIHRvIGRyYXcgb25seSBjb21wbGV0ZSBk
b3RzLgotICAgIC8vIE5PVEU6IENvZGUgaGVyZSB1c2VkIHRvIHNoaWZ0IHRoZSB1bmRlcmxpbmUg
dG8gdGhlIGxlZnQgYW5kIGluY3JlYXNlIHRoZSB3aWR0aAotICAgIC8vIHRvIG1ha2Ugc3VyZSBl
dmVyeXRoaW5nIGdldHMgdW5kZXJsaW5lZCwgYnV0IHRoYXQgcmVzdWx0cyBpbiBkcmF3aW5nIG91
dCBvZgotICAgIC8vIGJvdW5kcyAoZS5nLiB3aGVuIGF0IHRoZSBlZGdlIG9mIGEgdmlldykgYW5k
IGNvdWxkIG1ha2UgaXQgYXBwZWFyIHRoYXQgdGhlCi0gICAgLy8gc3BhY2UgYmV0d2VlbiBhZGph
Y2VudCBtaXNzcGVsbGVkIHdvcmRzIHdhcyB1bmRlcmxpbmVkLgotICAgIC8vIGFsbG93IHNsaWdo
dGx5IG1vcmUgY29uc2lkZXJpbmcgdGhhdCB0aGUgcGF0dGVybiBlbmRzIHdpdGggYSB0cmFuc3Bh
cmVudCBwaXhlbAotICAgIGludCB3aWR0aE1vZCA9IHdpZHRoICUgcGF0dGVybldpZHRoOwotICAg
IGlmIChwYXR0ZXJuV2lkdGggLSB3aWR0aE1vZCA+IGNNaXNzcGVsbGluZ0xpbmVQYXR0ZXJuR2Fw
V2lkdGgpCi0gICAgICAgIHdpZHRoIC09IHdpZHRoTW9kOwotICAgICAgCi0gICAgLy8gRHJhdyB0
aGUgdW5kZXJsaW5lCi0gICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQo
KTsKLSAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQpOwotCi0gICAgY29uc3QgQ29sb3Im
IHBhdHRlcm5Db2xvciA9IGdyYW1tYXIgPyBncmFtbWFyUGF0dGVybkNvbG9yKCkgOiBzcGVsbGlu
Z1BhdHRlcm5Db2xvcigpOwotICAgIHNldENHU3Ryb2tlQ29sb3IoY29udGV4dCwgcGF0dGVybkNv
bG9yKTsKLQotICAgIHdrU2V0UGF0dGVyblBoYXNlSW5Vc2VyU3BhY2UoY29udGV4dCwgcG9pbnQp
OwotICAgIENHQ29udGV4dFNldEJsZW5kTW9kZShjb250ZXh0LCBrQ0dCbGVuZE1vZGVOb3JtYWwp
OwotICAgIAotICAgIC8vIDMgcm93cywgZWFjaCBvZmZzZXQgYnkgaGFsZiBhIHBpeGVsIGZvciBi
bGVuZGluZyBwdXJwb3NlcwotICAgIGNvbnN0IENHUG9pbnQgdXBwZXJQb2ludHMgW10gPSB7e3Bv
aW50LngoKSwgcG9pbnQueSgpICsgcGF0dGVybkhlaWdodCAtIDIuNSB9LCB7cG9pbnQueCgpICsg
d2lkdGgsIHBvaW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAyLjV9fTsKLSAgICBjb25zdCBDR1Bv
aW50IG1pZGRsZVBvaW50cyBbXSA9IHt7cG9pbnQueCgpLCBwb2ludC55KCkgKyBwYXR0ZXJuSGVp
Z2h0IC0gMS41IH0sIHtwb2ludC54KCkgKyB3aWR0aCwgcG9pbnQueSgpICsgcGF0dGVybkhlaWdo
dCAtIDEuNX19OwotICAgIGNvbnN0IENHUG9pbnQgbG93ZXJQb2ludHMgW10gPSB7e3BvaW50Lngo
KSwgcG9pbnQueSgpICsgcGF0dGVybkhlaWdodCAtIDAuNSB9LCB7cG9pbnQueCgpICsgd2lkdGgs
IHBvaW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAwLjUgfX07Ci0gICAgCi0gICAgLy8gRGFzaCBs
ZW5ndGhzIGZvciB0aGUgdG9wIGFuZCBib3R0b20gb2YgdGhlIGVycm9yIHVuZGVybGluZSBhcmUg
dGhlIHNhbWUuCi0gICAgLy8gVGhlc2UgYXJlIG1hZ2ljLgotICAgIHN0YXRpYyBjb25zdCBmbG9h
dCBlZGdlX2Rhc2hfbGVuZ3Roc1tdID0gezIsIDJ9OwotICAgIHN0YXRpYyBjb25zdCBmbG9hdCBt
aWRkbGVfZGFzaF9sZW5ndGhzW10gPSB7Mi43NmYsIDEuMjRmfTsKLSAgICBzdGF0aWMgY29uc3Qg
ZmxvYXQgZWRnZV9vZmZzZXQgPSAtKGVkZ2VfZGFzaF9sZW5ndGhzWzFdIC0gMS4wZikgLyAyLjBm
OwotICAgIHN0YXRpYyBjb25zdCBmbG9hdCBtaWRkbGVfb2Zmc2V0ID0gLShtaWRkbGVfZGFzaF9s
ZW5ndGhzWzFdIC0gMS4wZikgLyAyLjBmOwotCi0gICAgLy8gTGluZSBvcGFjaXRpZXMuICBPbmNl
IGFnYWluLCB0aGVzZSBhcmUgbWFnaWMuCi0gICAgY29uc3QgZmxvYXQgdXBwZXJPcGFjaXR5ID0g
MC4zM2Y7Ci0gICAgY29uc3QgZmxvYXQgbWlkZGxlT3BhY2l0eSA9IDAuNzVmOwotICAgIGNvbnN0
IGZsb2F0IGxvd2VyT3BhY2l0eSA9IDAuODhmOwotCi0gICAgLy9Ub3AgbGluZQotICAgIENHQ29u
dGV4dFNldExpbmVEYXNoKGNvbnRleHQsIGVkZ2Vfb2Zmc2V0LCBlZGdlX2Rhc2hfbGVuZ3Rocywg
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVkZ2VfZGFzaF9sZW5ndGhzKSAvIHNp
emVvZihlZGdlX2Rhc2hfbGVuZ3Roc1swXSkpOwotICAgIENHQ29udGV4dFNldEFscGhhKGNvbnRl
eHQsIHVwcGVyT3BhY2l0eSk7Ci0gICAgQ0dDb250ZXh0U3Ryb2tlTGluZVNlZ21lbnRzKGNvbnRl
eHQsIHVwcGVyUG9pbnRzLCAyKTsKLSAKLSAgICAvLyBNaWRkbGUgbGluZQotICAgIENHQ29udGV4
dFNldExpbmVEYXNoKGNvbnRleHQsIG1pZGRsZV9vZmZzZXQsIG1pZGRsZV9kYXNoX2xlbmd0aHMs
IAotICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihtaWRkbGVfZGFzaF9sZW5ndGhzKSAv
IHNpemVvZihtaWRkbGVfZGFzaF9sZW5ndGhzWzBdKSk7Ci0gICAgQ0dDb250ZXh0U2V0QWxwaGEo
Y29udGV4dCwgbWlkZGxlT3BhY2l0eSk7Ci0gICAgQ0dDb250ZXh0U3Ryb2tlTGluZVNlZ21lbnRz
KGNvbnRleHQsIG1pZGRsZVBvaW50cywgMik7Ci0gICAgCi0gICAgLy8gQm90dG9tIGxpbmUKLSAg
ICBDR0NvbnRleHRTZXRMaW5lRGFzaChjb250ZXh0LCBlZGdlX29mZnNldCwgZWRnZV9kYXNoX2xl
bmd0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVkZ2VfZGFzaF9sZW5ndGhz
KSAvIHNpemVvZihlZGdlX2Rhc2hfbGVuZ3Roc1swXSkpOwotICAgIENHQ29udGV4dFNldEFscGhh
KGNvbnRleHQsIGxvd2VyT3BhY2l0eSk7Ci0gICAgQ0dDb250ZXh0U3Ryb2tlTGluZVNlZ21lbnRz
KGNvbnRleHQsIGxvd2VyUG9pbnRzLCAyKTsKLQotICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUo
Y29udGV4dCk7Ci19Ci0KICNpZiBFTkFCTEUoU1ZHKQogR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0
Rm9ySW1hZ2UoU1ZHUmVzb3VyY2VJbWFnZSopCiB7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbi9JbWFnZUNHV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3dpbi9JbWFnZUNHV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCShmcm9tIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlV2luLmNwcDoyOTgzNCkKKysrIFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ0dXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4g
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIkltYWdlLmgiCisjaW5jbHVkZSAiQml0bWFwSW1hZ2UuaCIKKyNpbmNsdWRlICJHcmFwaGlj
c0NvbnRleHQuaCIKKyNpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2Vy
dmljZXMuaD4KKworI2luY2x1ZGUgPHdpbnNvY2syLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgor
I2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiTUlNRVR5cGVSZWdpc3RyeS5o
IgorI2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgorCisvLyBUaGlzIGZ1bmN0aW9uIGxvYWRzIHJl
c291cmNlcyBmcm9tIFdlYktpdAorUGFzc1JlZlB0cjxXZWJDb3JlOjpTaGFyZWRCdWZmZXI+IGxv
YWRSZXNvdXJjZUludG9CdWZmZXIoY29uc3QgY2hhciopOworCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK3ZvaWQgQml0bWFwSW1hZ2U6OmluaXRQbGF0Zm9ybURhdGEoKQoreworfQorCit2b2lkIEJp
dG1hcEltYWdlOjppbnZhbGlkYXRlUGxhdGZvcm1EYXRhKCkKK3sKK30KKworSW1hZ2UqIEltYWdl
Ojpsb2FkUGxhdGZvcm1SZXNvdXJjZShjb25zdCBjaGFyICpuYW1lKQoreworICAgIFJlZlB0cjxT
aGFyZWRCdWZmZXI+IGJ1ZmZlciA9IGxvYWRSZXNvdXJjZUludG9CdWZmZXIobmFtZSk7CisgICAg
Qml0bWFwSW1hZ2UqIGltZyA9IG5ldyBCaXRtYXBJbWFnZTsKKyAgICBpbWctPnNldERhdGEoYnVm
ZmVyLnJlbGVhc2UoKSwgdHJ1ZSk7CisgICAgcmV0dXJuIGltZzsKK30KKworYm9vbCBCaXRtYXBJ
bWFnZTo6Z2V0SEJJVE1BUChIQklUTUFQIGJtcCkKK3sKKyAgICByZXR1cm4gZ2V0SEJJVE1BUE9m
U2l6ZShibXAsIDApOworfQorCitib29sIEJpdG1hcEltYWdlOjpnZXRIQklUTUFQT2ZTaXplKEhC
SVRNQVAgYm1wLCBMUFNJWkUgc2l6ZSkKK3sKKyAgICBBU1NFUlQoYm1wKTsKKworICAgIEJJVE1B
UCBibXBJbmZvOworICAgIEdldE9iamVjdChibXAsIHNpemVvZihCSVRNQVApLCAmYm1wSW5mbyk7
CisKKyAgICBBU1NFUlQoYm1wSW5mby5ibUJpdHNQaXhlbCA9PSAzMik7CisgICAgaW50IGJ1ZmZl
clNpemUgPSBibXBJbmZvLmJtV2lkdGhCeXRlcyAqIGJtcEluZm8uYm1IZWlnaHQ7CisgICAgCisg
ICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJH
QigpOworICAgIENHQ29udGV4dFJlZiBjZ0NvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUo
Ym1wSW5mby5ibUJpdHMsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCwKKyAgICAg
ICAgOCwgYm1wSW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9yZGVy
MzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhhUHJlbXVsdGlwbGllZEZpcnN0KTsKKyAgCisgICAgR3Jh
cGhpY3NDb250ZXh0IGdjKGNnQ29udGV4dCk7CisgICAgSW50U2l6ZSBpbWFnZVNpemUgPSBCaXRt
YXBJbWFnZTo6c2l6ZSgpOworICAgIGlmIChzaXplKQorICAgICAgICBkcmF3RnJhbWVNYXRjaGlu
Z1NvdXJjZVNpemUoJmdjLCBGbG9hdFJlY3QoMCwgMCwgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZv
LmJtSGVpZ2h0KSwgSW50U2l6ZSgqc2l6ZSksIENvbXBvc2l0ZUNvcHkpOworICAgIGVsc2UKKyAg
ICAgICAgZHJhdygmZ2MsIEZsb2F0UmVjdCgwLCAwLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8u
Ym1IZWlnaHQpLCBGbG9hdFJlY3QoMCwgMCwgaW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5o
ZWlnaHQoKSksIENvbXBvc2l0ZUNvcHkpOworCisgICAgLy8gRG8gY2xlYW51cAorICAgIENHQ29u
dGV4dFJlbGVhc2UoY2dDb250ZXh0KTsKKyAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKGRldmljZVJH
Qik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQml0bWFwSW1hZ2U6OmRyYXdGcmFtZU1h
dGNoaW5nU291cmNlU2l6ZShHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYg
ZHN0UmVjdCwgY29uc3QgSW50U2l6ZSYgc3JjU2l6ZSwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9z
aXRlT3ApCit7CisgICAgaW50IGZyYW1lcyA9IGZyYW1lQ291bnQoKTsKKyAgICBmb3IgKGludCBp
ID0gMDsgaSA8IGZyYW1lczsgKytpKSB7CisgICAgICAgIENHSW1hZ2VSZWYgaW1hZ2UgPSBmcmFt
ZUF0SW5kZXgoaSk7CisgICAgICAgIGlmIChDR0ltYWdlR2V0SGVpZ2h0KGltYWdlKSA9PSAoc2l6
ZV90KXNyY1NpemUuaGVpZ2h0KCkgJiYgQ0dJbWFnZUdldFdpZHRoKGltYWdlKSA9PSAoc2l6ZV90
KXNyY1NpemUud2lkdGgoKSkgeworICAgICAgICAgICAgc2l6ZV90IGN1cnJlbnRGcmFtZSA9IG1f
Y3VycmVudEZyYW1lOworICAgICAgICAgICAgbV9jdXJyZW50RnJhbWUgPSBpOworICAgICAgICAg
ICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJlY3QoMCwgMCwgc3JjU2l6ZS53aWR0aCgpLCBz
cmNTaXplLmhlaWdodCgpKSwgY29tcG9zaXRlT3ApOworICAgICAgICAgICAgbV9jdXJyZW50RnJh
bWUgPSBjdXJyZW50RnJhbWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9
CisKKyAgICAvLyBObyBpbWFnZSBvZiB0aGUgY29ycmVjdCBzaXplIHdhcyBmb3VuZCwgZmFsbGJh
Y2sgdG8gZHJhd2luZyB0aGUgY3VycmVudCBmcmFtZQorICAgIEludFNpemUgaW1hZ2VTaXplID0g
Qml0bWFwSW1hZ2U6OnNpemUoKTsKKyAgICBkcmF3KGN0eHQsIGRzdFJlY3QsIEZsb2F0UmVjdCgw
LCAwLCBpbWFnZVNpemUud2lkdGgoKSwgaW1hZ2VTaXplLmhlaWdodCgpKSwgY29tcG9zaXRlT3Ap
OworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbi9JbWFnZUNHV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3dpbi9JbWFnZUNHV2luLmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZUNHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAg
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCBB
cHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCkBAIC0yOSwzOCArMjksMTEgQEAKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIK
ICNpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KIAot
I2luY2x1ZGUgPHdpbnNvY2syLmg+CiAjaW5jbHVkZSA8d2luZG93cy5oPgogI2luY2x1ZGUgIlBs
YXRmb3JtU3RyaW5nLmgiCi0jaW5jbHVkZSAiTUlNRVR5cGVSZWdpc3RyeS5oIgotI2luY2x1ZGUg
IlNoYXJlZEJ1ZmZlci5oIgotCi0vLyBUaGlzIGZ1bmN0aW9uIGxvYWRzIHJlc291cmNlcyBmcm9t
IFdlYktpdAotUGFzc1JlZlB0cjxXZWJDb3JlOjpTaGFyZWRCdWZmZXI+IGxvYWRSZXNvdXJjZUlu
dG9CdWZmZXIoY29uc3QgY2hhciopOwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLXZvaWQgQml0
bWFwSW1hZ2U6OmluaXRQbGF0Zm9ybURhdGEoKQotewotfQotCi12b2lkIEJpdG1hcEltYWdlOjpp
bnZhbGlkYXRlUGxhdGZvcm1EYXRhKCkKLXsKLX0KLQotSW1hZ2UqIEltYWdlOjpsb2FkUGxhdGZv
cm1SZXNvdXJjZShjb25zdCBjaGFyICpuYW1lKQotewotICAgIFJlZlB0cjxTaGFyZWRCdWZmZXI+
IGJ1ZmZlciA9IGxvYWRSZXNvdXJjZUludG9CdWZmZXIobmFtZSk7Ci0gICAgQml0bWFwSW1hZ2Uq
IGltZyA9IG5ldyBCaXRtYXBJbWFnZTsKLSAgICBpbWctPnNldERhdGEoYnVmZmVyLnJlbGVhc2Uo
KSwgdHJ1ZSk7Ci0gICAgcmV0dXJuIGltZzsKLX0KLQotYm9vbCBCaXRtYXBJbWFnZTo6Z2V0SEJJ
VE1BUChIQklUTUFQIGJtcCkKLXsKLSAgICByZXR1cm4gZ2V0SEJJVE1BUE9mU2l6ZShibXAsIDAp
OwotfQotCiBib29sIEJpdG1hcEltYWdlOjpnZXRIQklUTUFQT2ZTaXplKEhCSVRNQVAgYm1wLCBM
UFNJWkUgc2l6ZSkKIHsKICAgICBBU1NFUlQoYm1wKTsKQEAgLTc2LDE1ICs0OSwxNyBAQCBib29s
IEJpdG1hcEltYWdlOjpnZXRIQklUTUFQT2ZTaXplKEhCSVRNCiAgICAgICAgIDgsIGJtcEluZm8u
Ym1XaWR0aEJ5dGVzLCBkZXZpY2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwga0NH
SW1hZ2VBbHBoYVByZW11bHRpcGxpZWRGaXJzdCk7CiAgIAogICAgIEdyYXBoaWNzQ29udGV4dCBn
YyhjZ0NvbnRleHQpOworCiAgICAgSW50U2l6ZSBpbWFnZVNpemUgPSBCaXRtYXBJbWFnZTo6c2l6
ZSgpOwogICAgIGlmIChzaXplKQotICAgICAgICBkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUo
JmdjLCBGbG9hdFJlY3QoMCwgMCwgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwg
SW50U2l6ZSgqc2l6ZSksIENvbXBvc2l0ZUNvcHkpOworICAgICAgICBkcmF3RnJhbWVNYXRjaGlu
Z1NvdXJjZVNpemUoJmdjLCBGbG9hdFJlY3QoMC4wZiwgMC4wZiwgYm1wSW5mby5ibVdpZHRoLCBi
bXBJbmZvLmJtSGVpZ2h0KSwgSW50U2l6ZSgqc2l6ZSksIENvbXBvc2l0ZUNvcHkpOwogICAgIGVs
c2UKLSAgICAgICAgZHJhdygmZ2MsIEZsb2F0UmVjdCgwLCAwLCBibXBJbmZvLmJtV2lkdGgsIGJt
cEluZm8uYm1IZWlnaHQpLCBGbG9hdFJlY3QoMCwgMCwgaW1hZ2VTaXplLndpZHRoKCksIGltYWdl
U2l6ZS5oZWlnaHQoKSksIENvbXBvc2l0ZUNvcHkpOworICAgICAgICBkcmF3KCZnYywgRmxvYXRS
ZWN0KDAuMGYsIDAuMGYsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCksIEZsb2F0
UmVjdCgwLjBmLCAwLjBmLCBpbWFnZVNpemUud2lkdGgoKSwgaW1hZ2VTaXplLmhlaWdodCgpKSwg
Q29tcG9zaXRlQ29weSk7CiAKICAgICAvLyBEbyBjbGVhbnVwCiAgICAgQ0dDb250ZXh0UmVsZWFz
ZShjZ0NvbnRleHQpOwogICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKKwogICAg
IHJldHVybiB0cnVlOwogfQogCkBAIC05MywxMCArNjgsMTAgQEAgdm9pZCBCaXRtYXBJbWFnZTo6
ZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyYwogICAgIGludCBmcmFtZXMgPSBmcmFtZUNvdW50KCk7CiAg
ICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZXM7ICsraSkgewogICAgICAgICBDR0ltYWdlUmVm
IGltYWdlID0gZnJhbWVBdEluZGV4KGkpOwotICAgICAgICBpZiAoQ0dJbWFnZUdldEhlaWdodChp
bWFnZSkgPT0gKHNpemVfdClzcmNTaXplLmhlaWdodCgpICYmIENHSW1hZ2VHZXRXaWR0aChpbWFn
ZSkgPT0gKHNpemVfdClzcmNTaXplLndpZHRoKCkpIHsKKyAgICAgICAgaWYgKENHSW1hZ2VHZXRI
ZWlnaHQoaW1hZ2UpID09IHN0YXRpY19jYXN0PHNpemVfdD4oc3JjU2l6ZS5oZWlnaHQoKSkgJiYg
Q0dJbWFnZUdldFdpZHRoKGltYWdlKSA9PSBzdGF0aWNfY2FzdDxzaXplX3Q+KHNyY1NpemUud2lk
dGgoKSkpIHsKICAgICAgICAgICAgIHNpemVfdCBjdXJyZW50RnJhbWUgPSBtX2N1cnJlbnRGcmFt
ZTsKICAgICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gaTsKLSAgICAgICAgICAgIGRyYXcoY3R4
dCwgZHN0UmVjdCwgRmxvYXRSZWN0KDAsIDAsIHNyY1NpemUud2lkdGgoKSwgc3JjU2l6ZS5oZWln
aHQoKSksIGNvbXBvc2l0ZU9wKTsKKyAgICAgICAgICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxv
YXRSZWN0KDAuMGYsIDAuMGYsIHNyY1NpemUud2lkdGgoKSwgc3JjU2l6ZS5oZWlnaHQoKSksIGNv
bXBvc2l0ZU9wKTsKICAgICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gY3VycmVudEZyYW1lOwog
ICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0xMDQsNyArNzksNyBAQCB2b2lkIEJp
dG1hcEltYWdlOjpkcmF3RnJhbWVNYXRjaGluZ1NvdXJjCiAKICAgICAvLyBObyBpbWFnZSBvZiB0
aGUgY29ycmVjdCBzaXplIHdhcyBmb3VuZCwgZmFsbGJhY2sgdG8gZHJhd2luZyB0aGUgY3VycmVu
dCBmcmFtZQogICAgIEludFNpemUgaW1hZ2VTaXplID0gQml0bWFwSW1hZ2U6OnNpemUoKTsKLSAg
ICBkcmF3KGN0eHQsIGRzdFJlY3QsIEZsb2F0UmVjdCgwLCAwLCBpbWFnZVNpemUud2lkdGgoKSwg
aW1hZ2VTaXplLmhlaWdodCgpKSwgY29tcG9zaXRlT3ApOworICAgIGRyYXcoY3R4dCwgZHN0UmVj
dCwgRmxvYXRSZWN0KDAuMGYsIDAuMGYsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVp
Z2h0KCkpLCBjb21wb3NpdGVPcCk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ2Fpcm9XaW4uY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ2Fpcm9XaW4uY3BwCShy
ZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VDYWlyb1dp
bi5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDggQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJCaXRtYXBJbWFnZS5oIgor
I2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgPGNhaXJvLmg+CisKKyNpbmNs
dWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCitib29sIEJpdG1hcEltYWdlOjpnZXRIQklUTUFQT2ZTaXplKEhCSVRNQVAg
Ym1wLCBMUFNJWkUgc2l6ZSkKK3sKKyAgICBBU1NFUlQoYm1wKTsKKworICAgIEJJVE1BUCBibXBJ
bmZvOworICAgIEdldE9iamVjdChibXAsIHNpemVvZihCSVRNQVApLCAmYm1wSW5mbyk7CisKKyAg
ICAvLyBJZiB0aGlzIGlzIGEgMzJicHAgYml0bWFwLCB3aGljaCBpdCBhbHdheXMgc2hvdWxkIGJl
LCB3ZSdsbCBjbGVhciBpdCBzbyBhbHBoYS13aXNlIGl0IHdpbGwgYmUgdmlzaWJsZQorICAgIGlm
IChibXBJbmZvLmJtQml0c1BpeGVsID09IDMyKSB7CisgICAgICAgIGludCBidWZmZXJTaXplID0g
Ym1wSW5mby5ibVdpZHRoQnl0ZXMgKiBibXBJbmZvLmJtSGVpZ2h0OworICAgICAgICBtZW1zZXQo
Ym1wSW5mby5ibUJpdHMsIDI1NSwgYnVmZmVyU2l6ZSk7CisgICAgfQorIAkKKyAgICBIREMgdGVt
cERDID0gQ3JlYXRlQ29tcGF0aWJsZURDKDApOworICAgIGlmICghdGVtcERDKSB7CisgICAgICAg
IExPR19FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSBpbi1tZW1vcnkgREMgZm9yIEltYWdlOjpibGl0
KCkiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBTZWxlY3RPYmplY3QodGVt
cERDLCBibXApOworICAgIEdyYXBoaWNzQ29udGV4dCBnYyh0ZW1wREMpOworCisgICAgSW50U2l6
ZSBpbWFnZVNpemUgPSBCaXRtYXBJbWFnZTo6c2l6ZSgpOworICAgIGlmIChzaXplKQorICAgICAg
ICBkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUoJmdjLCBGbG9hdFJlY3QoMC4wZiwgMC4wZiwg
Ym1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwgSW50U2l6ZSgqc2l6ZSksIENvbXBv
c2l0ZUNvcHkpOworICAgIGVsc2UKKyAgICAgICAgZHJhdygmZ2MsIEZsb2F0UmVjdCgwLjBmLCAw
LjBmLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQpLCBGbG9hdFJlY3QoMC4wZiwg
MC4wZiwgaW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIENvbXBvc2l0ZUNv
cHkpOworCisgICAgLy8gRG8gY2xlYW51cAorICAgIERlbGV0ZURDKHRlbXBEQyk7CisKKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBCaXRtYXBJbWFnZTo6ZHJhd0ZyYW1lTWF0Y2hpbmdTb3Vy
Y2VTaXplKEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBj
b25zdCBJbnRTaXplJiBzcmNTaXplLCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCkKK3sK
KyAgICBpbnQgZnJhbWVzID0gZnJhbWVDb3VudCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwg
ZnJhbWVzOyArK2kpIHsKKyAgICAgICAgY2Fpcm9fc3VyZmFjZV90KiBpbWFnZSA9IGZyYW1lQXRJ
bmRleChpKTsKKyAgICAgICAgaWYgKGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X2hlaWdodChpbWFn
ZSkgPT0gc3RhdGljX2Nhc3Q8c2l6ZV90PihzcmNTaXplLmhlaWdodCgpKSAmJiBjYWlyb19pbWFn
ZV9zdXJmYWNlX2dldF93aWR0aChpbWFnZSkgPT0gc3RhdGljX2Nhc3Q8c2l6ZV90PihzcmNTaXpl
LndpZHRoKCkpKSB7CisgICAgICAgICAgICBzaXplX3QgY3VycmVudEZyYW1lID0gbV9jdXJyZW50
RnJhbWU7CisgICAgICAgICAgICBtX2N1cnJlbnRGcmFtZSA9IGk7CisgICAgICAgICAgICBkcmF3
KGN0eHQsIGRzdFJlY3QsIEZsb2F0UmVjdCgwLjBmLCAwLjBmLCBzcmNTaXplLndpZHRoKCksIHNy
Y1NpemUuaGVpZ2h0KCkpLCBjb21wb3NpdGVPcCk7CisgICAgICAgICAgICBtX2N1cnJlbnRGcmFt
ZSA9IGN1cnJlbnRGcmFtZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0K
KworICAgIC8vIE5vIGltYWdlIG9mIHRoZSBjb3JyZWN0IHNpemUgd2FzIGZvdW5kLCBmYWxsYmFj
ayB0byBkcmF3aW5nIHRoZSBjdXJyZW50IGZyYW1lCisgICAgSW50U2l6ZSBpbWFnZVNpemUgPSBC
aXRtYXBJbWFnZTo6c2l6ZSgpOworICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRSZWN0KDAu
MGYsIDAuMGYsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBjb21wb3Np
dGVPcCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL0ltYWdlV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbi9JbWFnZVdpbi5jcHAJKHJldmlzaW9uIDI5ODM0KQorKysgV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0x
LDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFw
cGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKQEAgLTI2LDEzICsyNiw3IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAi
SW1hZ2UuaCIKICNpbmNsdWRlICJCaXRtYXBJbWFnZS5oIgotI2luY2x1ZGUgIkdyYXBoaWNzQ29u
dGV4dC5oIgotI2luY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNl
cy5oPgogCi0jaW5jbHVkZSA8d2luc29jazIuaD4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5j
bHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKLSNpbmNsdWRlICJNSU1FVHlwZVJlZ2lzdHJ5LmgiCiAj
aW5jbHVkZSAiU2hhcmVkQnVmZmVyLmgiCiAKIC8vIFRoaXMgZnVuY3Rpb24gbG9hZHMgcmVzb3Vy
Y2VzIGZyb20gV2ViS2l0CkBAIC02MSw1MCArNTUsNCBAQCBib29sIEJpdG1hcEltYWdlOjpnZXRI
QklUTUFQKEhCSVRNQVAgYm1wCiAgICAgcmV0dXJuIGdldEhCSVRNQVBPZlNpemUoYm1wLCAwKTsK
IH0KIAotYm9vbCBCaXRtYXBJbWFnZTo6Z2V0SEJJVE1BUE9mU2l6ZShIQklUTUFQIGJtcCwgTFBT
SVpFIHNpemUpCi17Ci0gICAgQVNTRVJUKGJtcCk7Ci0KLSAgICBCSVRNQVAgYm1wSW5mbzsKLSAg
ICBHZXRPYmplY3QoYm1wLCBzaXplb2YoQklUTUFQKSwgJmJtcEluZm8pOwotCi0gICAgQVNTRVJU
KGJtcEluZm8uYm1CaXRzUGl4ZWwgPT0gMzIpOwotICAgIGludCBidWZmZXJTaXplID0gYm1wSW5m
by5ibVdpZHRoQnl0ZXMgKiBibXBJbmZvLmJtSGVpZ2h0OwotICAgIAotICAgIENHQ29sb3JTcGFj
ZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKLSAgICBDR0Nv
bnRleHRSZWYgY2dDb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGJtcEluZm8uYm1CaXRz
LCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQsCi0gICAgICAgIDgsIGJtcEluZm8u
Ym1XaWR0aEJ5dGVzLCBkZXZpY2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwga0NH
SW1hZ2VBbHBoYVByZW11bHRpcGxpZWRGaXJzdCk7Ci0gIAotICAgIEdyYXBoaWNzQ29udGV4dCBn
YyhjZ0NvbnRleHQpOwotICAgIEludFNpemUgaW1hZ2VTaXplID0gQml0bWFwSW1hZ2U6OnNpemUo
KTsKLSAgICBpZiAoc2l6ZSkKLSAgICAgICAgZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXplKCZn
YywgRmxvYXRSZWN0KDAsIDAsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCksIElu
dFNpemUoKnNpemUpLCBDb21wb3NpdGVDb3B5KTsKLSAgICBlbHNlCi0gICAgICAgIGRyYXcoJmdj
LCBGbG9hdFJlY3QoMCwgMCwgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwgRmxv
YXRSZWN0KDAsIDAsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBDb21w
b3NpdGVDb3B5KTsKLQotICAgIC8vIERvIGNsZWFudXAKLSAgICBDR0NvbnRleHRSZWxlYXNlKGNn
Q29udGV4dCk7Ci0gICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOwotICAgIHJldHVy
biB0cnVlOwotfQotCi12b2lkIEJpdG1hcEltYWdlOjpkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNp
emUoR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBGbG9hdFJlY3QmIGRzdFJlY3QsIGNvbnN0
IEludFNpemUmIHNyY1NpemUsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQotewotICAg
IGludCBmcmFtZXMgPSBmcmFtZUNvdW50KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFt
ZXM7ICsraSkgewotICAgICAgICBDR0ltYWdlUmVmIGltYWdlID0gZnJhbWVBdEluZGV4KGkpOwot
ICAgICAgICBpZiAoQ0dJbWFnZUdldEhlaWdodChpbWFnZSkgPT0gKHNpemVfdClzcmNTaXplLmhl
aWdodCgpICYmIENHSW1hZ2VHZXRXaWR0aChpbWFnZSkgPT0gKHNpemVfdClzcmNTaXplLndpZHRo
KCkpIHsKLSAgICAgICAgICAgIHNpemVfdCBjdXJyZW50RnJhbWUgPSBtX2N1cnJlbnRGcmFtZTsK
LSAgICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gaTsKLSAgICAgICAgICAgIGRyYXcoY3R4dCwg
ZHN0UmVjdCwgRmxvYXRSZWN0KDAsIDAsIHNyY1NpemUud2lkdGgoKSwgc3JjU2l6ZS5oZWlnaHQo
KSksIGNvbXBvc2l0ZU9wKTsKLSAgICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gY3VycmVudEZy
YW1lOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gTm8g
aW1hZ2Ugb2YgdGhlIGNvcnJlY3Qgc2l6ZSB3YXMgZm91bmQsIGZhbGxiYWNrIHRvIGRyYXdpbmcg
dGhlIGN1cnJlbnQgZnJhbWUKLSAgICBJbnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcEltYWdlOjpz
aXplKCk7Ci0gICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJlY3QoMCwgMCwgaW1hZ2VTaXpl
LndpZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsKLX0KLQogfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vU2lt
cGxlRm9udERhdGFDR1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW4vU2ltcGxlRm9udERhdGFDR1dpbi5jcHAJKHJldmlzaW9uIDI5ODM0KQkoZnJvbSBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YVdpbi5jcHA6Mjk4MzQp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNHV2luLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDI4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4gCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4gCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAo
IkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJl
IHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9t
IHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24u
IAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05U
UklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJTaW1wbGVGb250RGF0YS5oIgorCisjaW5jbHVkZSA8d2luc29j
azIuaD4KKyNpbmNsdWRlICJGb250LmgiCisjaW5jbHVkZSAiRm9udENhY2hlLmgiCisjaW5jbHVk
ZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVkZSAiRm9udERlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSA8
d3RmL01hdGhFeHRyYXMuaD4KKyNpbmNsdWRlIDx1bmljb2RlL3VjaGFyLmg+CisjaW5jbHVkZSA8
dW5pY29kZS91bm9ybS5oPgorI2luY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRp
b25TZXJ2aWNlcy5oPgorI2luY2x1ZGUgPG1sYW5nLmg+CisjaW5jbHVkZSA8dGNoYXIuaD4KKyNp
bmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKwordXNpbmcgc3RkOjptYXg7CisKK2NvbnN0IGZsb2F0IGNT
bWFsbENhcHNGb250U2l6ZU11bHRpcGxpZXIgPSAwLjdmOworCitzdGF0aWMgYm9vbCBzaG91bGRB
cHBseU1hY0FzY2VudEhhY2s7CisKK3N0YXRpYyBpbmxpbmUgZmxvYXQgc2NhbGVFbVRvVW5pdHMo
ZmxvYXQgeCwgdW5zaWduZWQgdW5pdHNQZXJFbSkgeyByZXR1cm4gdW5pdHNQZXJFbSA/IHggLyAo
ZmxvYXQpdW5pdHNQZXJFbSA6IHg7IH0KKwordm9pZCBTaW1wbGVGb250RGF0YTo6c2V0U2hvdWxk
QXBwbHlNYWNBc2NlbnRIYWNrKGJvb2wgYikKK3sKKyAgICBzaG91bGRBcHBseU1hY0FzY2VudEhh
Y2sgPSBiOworfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUluaXQoKQoreyAgICAK
KyAgICBtX3N5bnRoZXRpY0JvbGRPZmZzZXQgPSBtX2ZvbnQuc3ludGhldGljQm9sZCgpID8gMS4w
ZiA6IDAuZjsKKyAgICBtX3NjcmlwdENhY2hlID0gMDsKKyAgICBtX3NjcmlwdEZvbnRQcm9wZXJ0
aWVzID0gMDsKKyAgICBtX2lzU3lzdGVtRm9udCA9IGZhbHNlOworICAgIAorICAgIGlmIChtX2Zv
bnQudXNlR0RJKCkpIHsKKyAgICAgICAgSERDIGhkYyA9IEdldERDKDApOworICAgICAgICBIR0RJ
T0JKIG9sZEZvbnQgPSBTZWxlY3RPYmplY3QoaGRjLCBtX2ZvbnQuaGZvbnQoKSk7CisgICAgICAg
IE9VVExJTkVURVhUTUVUUklDIG1ldHJpY3M7CisgICAgICAgIEdldE91dGxpbmVUZXh0TWV0cmlj
cyhoZGMsIHNpemVvZihtZXRyaWNzKSwgJm1ldHJpY3MpOworICAgICAgICBURVhUTUVUUklDJiB0
ZXh0TWV0cmljcyA9IG1ldHJpY3Mub3RtVGV4dE1ldHJpY3M7CisgICAgICAgIG1fYXNjZW50ID0g
dGV4dE1ldHJpY3MudG1Bc2NlbnQ7CisgICAgICAgIG1fZGVzY2VudCA9IHRleHRNZXRyaWNzLnRt
RGVzY2VudDsKKyAgICAgICAgbV9saW5lR2FwID0gdGV4dE1ldHJpY3MudG1FeHRlcm5hbExlYWRp
bmc7CisgICAgICAgIG1fbGluZVNwYWNpbmcgPSBtX2FzY2VudCArIG1fZGVzY2VudCArIG1fbGlu
ZUdhcDsKKyAgICAgICAgbV94SGVpZ2h0ID0gbV9hc2NlbnQgKiAwLjU2ZjsgLy8gQmVzdCBndWVz
cyBmb3IgeEhlaWdodCBpZiBubyB4IGdseXBoIGlzIHByZXNlbnQuCisKKyAgICAgICAgR0xZUEhN
RVRSSUNTIGdtOworICAgICAgICBNQVQyIG1hdCA9IHsgMSwgMCwgMCwgMSB9OworICAgICAgICBE
V09SRCBsZW4gPSBHZXRHbHlwaE91dGxpbmUoaGRjLCAneCcsIEdHT19NRVRSSUNTLCAmZ20sIDAs
IDAsICZtYXQpOworICAgICAgICBpZiAobGVuICE9IEdESV9FUlJPUiAmJiBnbS5nbXB0R2x5cGhP
cmlnaW4ueSA+IDApCisgICAgICAgICAgICBtX3hIZWlnaHQgPSBnbS5nbXB0R2x5cGhPcmlnaW4u
eTsKKworICAgICAgICBtX3VuaXRzUGVyRW0gPSBtZXRyaWNzLm90bUVNU3F1YXJlOworCisgICAg
ICAgIFNlbGVjdE9iamVjdChoZGMsIG9sZEZvbnQpOworICAgICAgICBSZWxlYXNlREMoMCwgaGRj
KTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ0dGb250UmVmIGZvbnQgPSBtX2Zv
bnQuY2dGb250KCk7CisgICAgaW50IGlBc2NlbnQgPSBDR0ZvbnRHZXRBc2NlbnQoZm9udCk7Cisg
ICAgaW50IGlEZXNjZW50ID0gQ0dGb250R2V0RGVzY2VudChmb250KTsKKyAgICBpbnQgaUxpbmVH
YXAgPSBDR0ZvbnRHZXRMZWFkaW5nKGZvbnQpOworICAgIG1fdW5pdHNQZXJFbSA9IENHRm9udEdl
dFVuaXRzUGVyRW0oZm9udCk7CisgICAgZmxvYXQgcG9pbnRTaXplID0gbV9mb250LnNpemUoKTsK
KyAgICBmbG9hdCBmQXNjZW50ID0gc2NhbGVFbVRvVW5pdHMoaUFzY2VudCwgbV91bml0c1BlckVt
KSAqIHBvaW50U2l6ZTsKKyAgICBmbG9hdCBmRGVzY2VudCA9IC1zY2FsZUVtVG9Vbml0cyhpRGVz
Y2VudCwgbV91bml0c1BlckVtKSAqIHBvaW50U2l6ZTsKKyAgICBmbG9hdCBmTGluZUdhcCA9IHNj
YWxlRW1Ub1VuaXRzKGlMaW5lR2FwLCBtX3VuaXRzUGVyRW0pICogcG9pbnRTaXplOworCisgICAg
aWYgKCFpc0N1c3RvbUZvbnQoKSkgeworICAgICAgICBIREMgZGMgPSBHZXREQygwKTsKKyAgICAg
ICAgSEdESU9CSiBvbGRGb250ID0gU2VsZWN0T2JqZWN0KGRjLCBtX2ZvbnQuaGZvbnQoKSk7Cisg
ICAgICAgIGludCBmYWNlTGVuZ3RoID0gR2V0VGV4dEZhY2UoZGMsIDAsIDApOworICAgICAgICBW
ZWN0b3I8VENIQVI+IGZhY2VOYW1lKGZhY2VMZW5ndGgpOworICAgICAgICBHZXRUZXh0RmFjZShk
YywgZmFjZUxlbmd0aCwgZmFjZU5hbWUuZGF0YSgpKTsKKyAgICAgICAgbV9pc1N5c3RlbUZvbnQg
PSAhX3Rjc2NtcChmYWNlTmFtZS5kYXRhKCksIF9UKCJMdWNpZGEgR3JhbmRlIikpOworICAgICAg
ICBTZWxlY3RPYmplY3QoZGMsIG9sZEZvbnQpOworICAgICAgICBSZWxlYXNlREMoMCwgZGMpOwor
CisgICAgICAgIGlmIChzaG91bGRBcHBseU1hY0FzY2VudEhhY2spIHsKKyAgICAgICAgICAgIC8v
IFRoaXMgY29kZSBjb21lcyBmcm9tIEZvbnREYXRhTWFjLm1tLiBXZSBvbmx5IGV2ZXIgZG8gdGhp
cyB3aGVuIHJ1bm5pbmcgcmVncmVzc2lvbiB0ZXN0cyBzbyB0aGF0IG91ciBtZXRyaWNzIHdpbGwg
bWF0Y2ggTWFjLgorCisgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGFkanVzdCBUaW1lcywgSGVs
dmV0aWNhLCBhbmQgQ291cmllciB0byBjbG9zZWx5IG1hdGNoIHRoZQorICAgICAgICAgICAgLy8g
dmVydGljYWwgbWV0cmljcyBvZiB0aGVpciBNaWNyb3NvZnQgY291bnRlcnBhcnRzIHRoYXQgYXJl
IHRoZSBkZSBmYWN0bworICAgICAgICAgICAgLy8gd2ViIHN0YW5kYXJkLiBUaGUgQXBwS2l0IGFk
anVzdG1lbnQgb2YgMjAlIGlzIHRvbyBiaWcgYW5kIGlzCisgICAgICAgICAgICAvLyBpbmNvcnJl
Y3RseSBhZGRlZCB0byBsaW5lIHNwYWNpbmcsIHNvIHdlIHVzZSBhIDE1JSBhZGp1c3RtZW50IGlu
c3RlYWQKKyAgICAgICAgICAgIC8vIGFuZCBhZGQgaXQgdG8gdGhlIGFzY2VudC4KKyAgICAgICAg
ICAgIGlmICghX3Rjc2NtcChmYWNlTmFtZS5kYXRhKCksIF9UKCJUaW1lcyIpKSB8fCAhX3Rjc2Nt
cChmYWNlTmFtZS5kYXRhKCksIF9UKCJIZWx2ZXRpY2EiKSkgfHwgIV90Y3NjbXAoZmFjZU5hbWUu
ZGF0YSgpLCBfVCgiQ291cmllciIpKSkKKyAgICAgICAgICAgICAgICBmQXNjZW50ICs9IGZsb29y
ZigoKGZBc2NlbnQgKyBmRGVzY2VudCkgKiAwLjE1ZikgKyAwLjVmKTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIG1fYXNjZW50ID0gbHJvdW5kZihmQXNjZW50KTsKKyAgICBtX2Rlc2NlbnQgPSBs
cm91bmRmKGZEZXNjZW50KTsKKyAgICBtX2xpbmVHYXAgPSBscm91bmRmKGZMaW5lR2FwKTsKKyAg
ICBtX2xpbmVTcGFjaW5nID0gbV9hc2NlbnQgKyBtX2Rlc2NlbnQgKyBtX2xpbmVHYXA7CisKKyAg
ICAvLyBNZWFzdXJlIHRoZSBhY3R1YWwgY2hhcmFjdGVyICJ4IiwgYmVjYXVzZSBBcHBLaXQgc3lu
dGhlc2l6ZXMgWCBoZWlnaHQgcmF0aGVyIHRoYW4gZ2V0dGluZyBpdCBmcm9tIHRoZSBmb250Lgor
ICAgIC8vIFVuZm9ydHVuYXRlbHksIE5TRm9udCB3aWxsIHJvdW5kIHRoaXMgZm9yIHVzIHNvIHdl
IGRvbid0IHF1aXRlIGdldCB0aGUgcmlnaHQgdmFsdWUuCisgICAgR2x5cGhQYWdlKiBnbHlwaFBh
Z2VaZXJvID0gR2x5cGhQYWdlVHJlZU5vZGU6OmdldFJvb3RDaGlsZCh0aGlzLCAwKS0+cGFnZSgp
OworICAgIEdseXBoIHhHbHlwaCA9IGdseXBoUGFnZVplcm8gPyBnbHlwaFBhZ2VaZXJvLT5nbHlw
aERhdGFGb3JDaGFyYWN0ZXIoJ3gnKS5nbHlwaCA6IDA7CisgICAgaWYgKHhHbHlwaCkgeworICAg
ICAgICBDR1JlY3QgeEJveDsKKyAgICAgICAgQ0dGb250R2V0R2x5cGhCQm94ZXMoZm9udCwgJnhH
bHlwaCwgMSwgJnhCb3gpOworICAgICAgICAvLyBVc2UgdGhlIG1heGltdW0gb2YgZWl0aGVyIHdp
ZHRoIG9yIGhlaWdodCBiZWNhdXNlICJ4IiBpcyBuZWFybHkgc3F1YXJlCisgICAgICAgIC8vIGFu
ZCB3ZWIgcGFnZXMgdGhhdCBmb29saXNobHkgdXNlIHRoaXMgbWV0cmljIGZvciB3aWR0aCB3aWxs
IGJlIGxhaWQgb3V0CisgICAgICAgIC8vIHBvb3JseSBpZiB3ZSByZXR1cm4gYW4gYWNjdXJhdGUg
aGVpZ2h0LiBDbGFzc2ljIGNhc2UgaXMgVGltZXMgMTMgcG9pbnQsCisgICAgICAgIC8vIHdoaWNo
IGhhcyBhbiAieCIgdGhhdCBpcyA3eDYgcGl4ZWxzLgorICAgICAgICBtX3hIZWlnaHQgPSBzY2Fs
ZUVtVG9Vbml0cyhtYXgoQ0dSZWN0R2V0TWF4WCh4Qm94KSwgQ0dSZWN0R2V0TWF4WSh4Qm94KSks
IG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGlY
SGVpZ2h0ID0gQ0dGb250R2V0WEhlaWdodChmb250KTsKKyAgICAgICAgbV94SGVpZ2h0ID0gc2Nh
bGVFbVRvVW5pdHMoaVhIZWlnaHQsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7CisgICAgfQor
fQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3koKQoreworICAgIGlmICgh
aXNDdXN0b21Gb250KCkpIHsKKyAgICAgICAgRGVsZXRlT2JqZWN0KG1fZm9udC5oZm9udCgpKTsK
KyAgICAgICAgQ0dGb250UmVsZWFzZShtX2ZvbnQuY2dGb250KCkpOworICAgIH0KKworICAgIC8v
IFdlIGRvbid0IGhhc2ggdGhpcyBvbiBXaW4zMiwgc28gaXQncyBlZmZlY3RpdmVseSBvd25lZCBi
eSB1cy4KKyAgICBkZWxldGUgbV9zbWFsbENhcHNGb250RGF0YTsKKworICAgIFNjcmlwdEZyZWVD
YWNoZSgmbV9zY3JpcHRDYWNoZSk7CisgICAgZGVsZXRlIG1fc2NyaXB0Rm9udFByb3BlcnRpZXM7
Cit9CisKK1NpbXBsZUZvbnREYXRhKiBTaW1wbGVGb250RGF0YTo6c21hbGxDYXBzRm9udERhdGEo
Y29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIGNvbnN0Cit7CisgICAgaWYg
KCFtX3NtYWxsQ2Fwc0ZvbnREYXRhKSB7CisgICAgICAgIGZsb2F0IHNtYWxsQ2Fwc0hlaWdodCA9
IGNTbWFsbENhcHNGb250U2l6ZU11bHRpcGxpZXIgKiBtX2ZvbnQuc2l6ZSgpOworICAgICAgICBp
ZiAoaXNDdXN0b21Gb250KCkpIHsKKyAgICAgICAgICAgIEZvbnRQbGF0Zm9ybURhdGEgc21hbGxD
YXBzRm9udERhdGEobV9mb250KTsKKyAgICAgICAgICAgIHNtYWxsQ2Fwc0ZvbnREYXRhLnNldFNp
emUoc21hbGxDYXBzSGVpZ2h0KTsKKyAgICAgICAgICAgIG1fc21hbGxDYXBzRm9udERhdGEgPSBu
ZXcgU2ltcGxlRm9udERhdGEoc21hbGxDYXBzRm9udERhdGEsIHRydWUsIGZhbHNlKTsKKyAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0ZPTlQgd2luZm9udDsKKyAgICAgICAgICAgIEdl
dE9iamVjdChtX2ZvbnQuaGZvbnQoKSwgc2l6ZW9mKExPR0ZPTlQpLCAmd2luZm9udCk7CisgICAg
ICAgICAgICB3aW5mb250LmxmSGVpZ2h0ID0gLWxyb3VuZGYoc21hbGxDYXBzSGVpZ2h0ICogKG1f
Zm9udC51c2VHREkoKSA/IDEgOiAzMikpOworICAgICAgICAgICAgSEZPTlQgaGZvbnQgPSBDcmVh
dGVGb250SW5kaXJlY3QoJndpbmZvbnQpOworICAgICAgICAgICAgbV9zbWFsbENhcHNGb250RGF0
YSA9IG5ldyBTaW1wbGVGb250RGF0YShGb250UGxhdGZvcm1EYXRhKGhmb250LCBzbWFsbENhcHNI
ZWlnaHQsIGZvbnREZXNjcmlwdGlvbi5ib2xkKCksIGZvbnREZXNjcmlwdGlvbi5pdGFsaWMoKSwg
bV9mb250LnVzZUdESSgpKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1fc21hbGxD
YXBzRm9udERhdGE7Cit9CisKK2Jvb2wgU2ltcGxlRm9udERhdGE6OmNvbnRhaW5zQ2hhcmFjdGVy
cyhjb25zdCBVQ2hhciogY2hhcmFjdGVycywgaW50IGxlbmd0aCkgY29uc3QKK3sKKyAgICAvLyBG
SVhNRTogU3VwcG9ydCBjdXN0b20gZm9udHMuCisgICAgaWYgKGlzQ3VzdG9tRm9udCgpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBGSVhNRTogTWljcm9zb2Z0IGRvY3VtZW50YXRp
b24gc2VlbXMgdG8gaW1wbHkgdGhhdCBjaGFyYWN0ZXJzIGNhbiBiZSBvdXRwdXQgdXNpbmcgYSBn
aXZlbiBmb250IGFuZCBEQworICAgIC8vIG1lcmVseSBieSB0ZXN0aW5nIGNvZGUgcGFnZSBpbnRl
cnNlY3Rpb24uICBUaGlzIHNlZW1zIHN1c3BlY3QgdGhvdWdoLiAgQ2FuJ3QgYSBmb250IG9ubHkg
cGFydGlhbGx5CisgICAgLy8gY292ZXIgYSBnaXZlbiBjb2RlIHBhZ2U/CisgICAgSU1MYW5nRm9u
dExpbmsyKiBsYW5nRm9udExpbmsgPSBGb250Q2FjaGU6OmdldEZvbnRMaW5rSW50ZXJmYWNlKCk7
CisgICAgaWYgKCFsYW5nRm9udExpbmspCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEhE
QyBkYyA9IEdldERDKDApOworICAgIAorICAgIERXT1JEIGFjcENvZGVQYWdlczsKKyAgICBsYW5n
Rm9udExpbmstPkNvZGVQYWdlVG9Db2RlUGFnZXMoQ1BfQUNQLCAmYWNwQ29kZVBhZ2VzKTsKKwor
ICAgIERXT1JEIGZvbnRDb2RlUGFnZXM7CisgICAgbGFuZ0ZvbnRMaW5rLT5HZXRGb250Q29kZVBh
Z2VzKGRjLCBtX2ZvbnQuaGZvbnQoKSwgJmZvbnRDb2RlUGFnZXMpOworCisgICAgRFdPUkQgYWN0
dWFsQ29kZVBhZ2VzOworICAgIGxvbmcgbnVtQ2hhcmFjdGVyc1Byb2Nlc3NlZDsKKyAgICBsb25n
IG9mZnNldCA9IDA7CisgICAgd2hpbGUgKG9mZnNldCA8IGxlbmd0aCkgeworICAgICAgICBsYW5n
Rm9udExpbmstPkdldFN0ckNvZGVQYWdlcyhjaGFyYWN0ZXJzLCBsZW5ndGgsIGFjcENvZGVQYWdl
cywgJmFjdHVhbENvZGVQYWdlcywgJm51bUNoYXJhY3RlcnNQcm9jZXNzZWQpOworICAgICAgICBp
ZiAoKGFjdHVhbENvZGVQYWdlcyAmIGZvbnRDb2RlUGFnZXMpID09IDApCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIG9mZnNldCArPSBudW1DaGFyYWN0ZXJzUHJvY2Vzc2VkOwor
ICAgIH0KKworICAgIFJlbGVhc2VEQygwLCBkYyk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwor
dm9pZCBTaW1wbGVGb250RGF0YTo6ZGV0ZXJtaW5lUGl0Y2goKQoreworICAgIGlmIChpc0N1c3Rv
bUZvbnQoKSkgeworICAgICAgICBtX3RyZWF0QXNGaXhlZFBpdGNoID0gZmFsc2U7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICAvLyBURVhUTUVUUklDUyBoYXZlIHRoaXMuICBTZXQgbV90
cmVhdEFzRml4ZWRQaXRjaCBiYXNlZCBvZmYgdGhhdC4KKyAgICBIREMgZGMgPSBHZXREQygwKTsK
KyAgICBTYXZlREMoZGMpOworICAgIFNlbGVjdE9iamVjdChkYywgbV9mb250Lmhmb250KCkpOwor
CisgICAgLy8gWWVzLCB0aGlzIGxvb2tzIGJhY2t3YXJkcywgYnV0IHRoZSBmaXhlZCBwaXRjaCBi
aXQgaXMgYWN0dWFsbHkgc2V0IGlmIHRoZSBmb250CisgICAgLy8gaXMgKm5vdCogZml4ZWQgcGl0
Y2guICBVbmJlbGlldmFibGUgYnV0IHRydWUuCisgICAgVEVYVE1FVFJJQyB0bTsKKyAgICBHZXRU
ZXh0TWV0cmljcyhkYywgJnRtKTsKKyAgICBtX3RyZWF0QXNGaXhlZFBpdGNoID0gKCh0bS50bVBp
dGNoQW5kRmFtaWx5ICYgVE1QRl9GSVhFRF9QSVRDSCkgPT0gMCk7CisKKyAgICBSZXN0b3JlREMo
ZGMsIC0xKTsKKyAgICBSZWxlYXNlREMoMCwgZGMpOworfQorCitmbG9hdCBTaW1wbGVGb250RGF0
YTo6cGxhdGZvcm1XaWR0aEZvckdseXBoKEdseXBoIGdseXBoKSBjb25zdAoreworICAgIGlmICht
X2ZvbnQudXNlR0RJKCkpIHsKKyAgICAgICAgSERDIGhkYyA9IEdldERDKDApOworICAgICAgICBI
R0RJT0JKIG9sZEZvbnQgPSBTZWxlY3RPYmplY3QoaGRjLCBtX2ZvbnQuaGZvbnQoKSk7CisgICAg
ICAgIGludCB3aWR0aDsKKyAgICAgICAgR2V0Q2hhcldpZHRoSShoZGMsIGdseXBoLCAxLCAwLCAm
d2lkdGgpOworICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBvbGRGb250KTsKKyAgICAgICAgUmVs
ZWFzZURDKDAsIGhkYyk7CisgICAgICAgIHJldHVybiB3aWR0aDsKKyAgICB9CisKKyAgICBDR0Zv
bnRSZWYgZm9udCA9IG1fZm9udC5jZ0ZvbnQoKTsKKyAgICBmbG9hdCBwb2ludFNpemUgPSBtX2Zv
bnQuc2l6ZSgpOworICAgIENHU2l6ZSBhZHZhbmNlOworICAgIENHQWZmaW5lVHJhbnNmb3JtIG0g
PSBDR0FmZmluZVRyYW5zZm9ybU1ha2VTY2FsZShwb2ludFNpemUsIHBvaW50U2l6ZSk7CisgICAg
Ly8gRklYTUU6IE5lZWQgdG8gYWRkIHJlYWwgc3VwcG9ydCBmb3IgcHJpbnRlciBmb250cy4KKyAg
ICBib29sIGlzUHJpbnRlckZvbnQgPSBmYWxzZTsKKyAgICB3a0dldEdseXBoQWR2YW5jZXMoZm9u
dCwgbSwgbV9pc1N5c3RlbUZvbnQsIGlzUHJpbnRlckZvbnQsIGdseXBoLCBhZHZhbmNlKTsKKyAg
ICByZXR1cm4gYWR2YW5jZS53aWR0aCArIG1fc3ludGhldGljQm9sZE9mZnNldDsKK30KKworU0NS
SVBUX0ZPTlRQUk9QRVJUSUVTKiBTaW1wbGVGb250RGF0YTo6c2NyaXB0Rm9udFByb3BlcnRpZXMo
KSBjb25zdAoreworICAgIGlmICghbV9zY3JpcHRGb250UHJvcGVydGllcykgeworICAgICAgICBt
X3NjcmlwdEZvbnRQcm9wZXJ0aWVzID0gbmV3IFNDUklQVF9GT05UUFJPUEVSVElFUzsKKyAgICAg
ICAgbWVtc2V0KG1fc2NyaXB0Rm9udFByb3BlcnRpZXMsIDAsIHNpemVvZihTQ1JJUFRfRk9OVFBS
T1BFUlRJRVMpKTsKKyAgICAgICAgbV9zY3JpcHRGb250UHJvcGVydGllcy0+Y0J5dGVzID0gc2l6
ZW9mKFNDUklQVF9GT05UUFJPUEVSVElFUyk7CisgICAgICAgIEhSRVNVTFQgcmVzdWx0ID0gU2Ny
aXB0R2V0Rm9udFByb3BlcnRpZXMoMCwgc2NyaXB0Q2FjaGUoKSwgbV9zY3JpcHRGb250UHJvcGVy
dGllcyk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gRV9QRU5ESU5HKSB7CisgICAgICAgICAgICBI
REMgZGMgPSBHZXREQygwKTsKKyAgICAgICAgICAgIFNhdmVEQyhkYyk7CisgICAgICAgICAgICBT
ZWxlY3RPYmplY3QoZGMsIG1fZm9udC5oZm9udCgpKTsKKyAgICAgICAgICAgIFNjcmlwdEdldEZv
bnRQcm9wZXJ0aWVzKGRjLCBzY3JpcHRDYWNoZSgpLCBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzKTsK
KyAgICAgICAgICAgIFJlc3RvcmVEQyhkYywgLTEpOworICAgICAgICAgICAgUmVsZWFzZURDKDAs
IGRjKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbV9zY3JpcHRGb250UHJvcGVydGll
czsKK30KKworfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9u
dERhdGFDR1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW4vU2ltcGxlRm9udERhdGFDR1dpbi5jcHAJKHJldmlzaW9uIDI5NzI2KQorKysgV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERhdGFDR1dpbi5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxl
IEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcs
IDIwMDggQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
ICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucwpAQCAtMzgsMjcgKzM4LDE4IEBACiAjaW5jbHVkZSA8dW5pY29kZS91Y2hh
ci5oPgogI2luY2x1ZGUgPHVuaWNvZGUvdW5vcm0uaD4KICNpbmNsdWRlIDxBcHBsaWNhdGlvblNl
cnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KKyNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRl
cmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWxhbmcuaD4KICNpbmNs
dWRlIDx0Y2hhci5oPgotI2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVyZmFjZS9XZWJLaXRTeXN0
ZW1JbnRlcmZhY2UuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCiB1c2luZyBzdGQ6Om1heDsK
IAotY29uc3QgZmxvYXQgY1NtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllciA9IDAuN2Y7Ci0KLXN0
YXRpYyBib29sIHNob3VsZEFwcGx5TWFjQXNjZW50SGFjazsKLQotc3RhdGljIGlubGluZSBmbG9h
dCBzY2FsZUVtVG9Vbml0cyhmbG9hdCB4LCB1bnNpZ25lZCB1bml0c1BlckVtKSB7IHJldHVybiB1
bml0c1BlckVtID8geCAvIChmbG9hdCl1bml0c1BlckVtIDogeDsgfQotCi12b2lkIFNpbXBsZUZv
bnREYXRhOjpzZXRTaG91bGRBcHBseU1hY0FzY2VudEhhY2soYm9vbCBiKQotewotICAgIHNob3Vs
ZEFwcGx5TWFjQXNjZW50SGFjayA9IGI7Ci19CitzdGF0aWMgaW5saW5lIGZsb2F0IHNjYWxlRW1U
b1VuaXRzKGZsb2F0IHgsIHVuc2lnbmVkIHVuaXRzUGVyRW0pIHsgcmV0dXJuIHVuaXRzUGVyRW0g
PyB4IC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHVuaXRzUGVyRW0pIDogeDsgfQogCiB2b2lkIFNpbXBs
ZUZvbnREYXRhOjpwbGF0Zm9ybUluaXQoKQoteyAgICAKK3sKICAgICBtX3N5bnRoZXRpY0JvbGRP
ZmZzZXQgPSBtX2ZvbnQuc3ludGhldGljQm9sZCgpID8gMS4wZiA6IDAuZjsKICAgICBtX3Njcmlw
dENhY2hlID0gMDsKICAgICBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzID0gMDsKQEAgLTExMCw3ICsx
MDEsNyBAQCB2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUluaXQoKQogICAgICAgICBTZWxl
Y3RPYmplY3QoZGMsIG9sZEZvbnQpOwogICAgICAgICBSZWxlYXNlREMoMCwgZGMpOwogCi0gICAg
ICAgIGlmIChzaG91bGRBcHBseU1hY0FzY2VudEhhY2spIHsKKyAgICAgICAgaWYgKHNob3VsZEFw
cGx5TWFjQXNjZW50SGFjaygpKSB7CiAgICAgICAgICAgICAvLyBUaGlzIGNvZGUgY29tZXMgZnJv
bSBGb250RGF0YU1hYy5tbS4gV2Ugb25seSBldmVyIGRvIHRoaXMgd2hlbiBydW5uaW5nIHJlZ3Jl
c3Npb24gdGVzdHMgc28gdGhhdCBvdXIgbWV0cmljcyB3aWxsIG1hdGNoIE1hYy4KIAogICAgICAg
ICAgICAgLy8gV2UgbmVlZCB0byBhZGp1c3QgVGltZXMsIEhlbHZldGljYSwgYW5kIENvdXJpZXIg
dG8gY2xvc2VseSBtYXRjaCB0aGUKQEAgLTE2MCw4MyArMTUxLDYgQEAgdm9pZCBTaW1wbGVGb250
RGF0YTo6cGxhdGZvcm1EZXN0cm95KCkKICAgICBkZWxldGUgbV9zY3JpcHRGb250UHJvcGVydGll
czsKIH0KIAotU2ltcGxlRm9udERhdGEqIFNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNGb250RGF0
YShjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKLXsKLSAgICBp
ZiAoIW1fc21hbGxDYXBzRm9udERhdGEpIHsKLSAgICAgICAgZmxvYXQgc21hbGxDYXBzSGVpZ2h0
ID0gY1NtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllciAqIG1fZm9udC5zaXplKCk7Ci0gICAgICAg
IGlmIChpc0N1c3RvbUZvbnQoKSkgewotICAgICAgICAgICAgRm9udFBsYXRmb3JtRGF0YSBzbWFs
bENhcHNGb250RGF0YShtX2ZvbnQpOwotICAgICAgICAgICAgc21hbGxDYXBzRm9udERhdGEuc2V0
U2l6ZShzbWFsbENhcHNIZWlnaHQpOwotICAgICAgICAgICAgbV9zbWFsbENhcHNGb250RGF0YSA9
IG5ldyBTaW1wbGVGb250RGF0YShzbWFsbENhcHNGb250RGF0YSwgdHJ1ZSwgZmFsc2UpOwotICAg
ICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HRk9OVCB3aW5mb250OwotICAgICAgICAgICAg
R2V0T2JqZWN0KG1fZm9udC5oZm9udCgpLCBzaXplb2YoTE9HRk9OVCksICZ3aW5mb250KTsKLSAg
ICAgICAgICAgIHdpbmZvbnQubGZIZWlnaHQgPSAtbHJvdW5kZihzbWFsbENhcHNIZWlnaHQgKiAo
bV9mb250LnVzZUdESSgpID8gMSA6IDMyKSk7Ci0gICAgICAgICAgICBIRk9OVCBoZm9udCA9IENy
ZWF0ZUZvbnRJbmRpcmVjdCgmd2luZm9udCk7Ci0gICAgICAgICAgICBtX3NtYWxsQ2Fwc0ZvbnRE
YXRhID0gbmV3IFNpbXBsZUZvbnREYXRhKEZvbnRQbGF0Zm9ybURhdGEoaGZvbnQsIHNtYWxsQ2Fw
c0hlaWdodCwgZm9udERlc2NyaXB0aW9uLmJvbGQoKSwgZm9udERlc2NyaXB0aW9uLml0YWxpYygp
LCBtX2ZvbnQudXNlR0RJKCkpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbV9zbWFs
bENhcHNGb250RGF0YTsKLX0KLQotYm9vbCBTaW1wbGVGb250RGF0YTo6Y29udGFpbnNDaGFyYWN0
ZXJzKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3RoKSBjb25zdAotewotICAgIC8v
IEZJWE1FOiBTdXBwb3J0IGN1c3RvbSBmb250cy4KLSAgICBpZiAoaXNDdXN0b21Gb250KCkpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIEZJWE1FOiBNaWNyb3NvZnQgZG9jdW1lbnRh
dGlvbiBzZWVtcyB0byBpbXBseSB0aGF0IGNoYXJhY3RlcnMgY2FuIGJlIG91dHB1dCB1c2luZyBh
IGdpdmVuIGZvbnQgYW5kIERDCi0gICAgLy8gbWVyZWx5IGJ5IHRlc3RpbmcgY29kZSBwYWdlIGlu
dGVyc2VjdGlvbi4gIFRoaXMgc2VlbXMgc3VzcGVjdCB0aG91Z2guICBDYW4ndCBhIGZvbnQgb25s
eSBwYXJ0aWFsbHkKLSAgICAvLyBjb3ZlciBhIGdpdmVuIGNvZGUgcGFnZT8KLSAgICBJTUxhbmdG
b250TGluazIqIGxhbmdGb250TGluayA9IEZvbnRDYWNoZTo6Z2V0Rm9udExpbmtJbnRlcmZhY2Uo
KTsKLSAgICBpZiAoIWxhbmdGb250TGluaykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAg
SERDIGRjID0gR2V0REMoMCk7Ci0gICAgCi0gICAgRFdPUkQgYWNwQ29kZVBhZ2VzOwotICAgIGxh
bmdGb250TGluay0+Q29kZVBhZ2VUb0NvZGVQYWdlcyhDUF9BQ1AsICZhY3BDb2RlUGFnZXMpOwot
Ci0gICAgRFdPUkQgZm9udENvZGVQYWdlczsKLSAgICBsYW5nRm9udExpbmstPkdldEZvbnRDb2Rl
UGFnZXMoZGMsIG1fZm9udC5oZm9udCgpLCAmZm9udENvZGVQYWdlcyk7Ci0KLSAgICBEV09SRCBh
Y3R1YWxDb2RlUGFnZXM7Ci0gICAgbG9uZyBudW1DaGFyYWN0ZXJzUHJvY2Vzc2VkOwotICAgIGxv
bmcgb2Zmc2V0ID0gMDsKLSAgICB3aGlsZSAob2Zmc2V0IDwgbGVuZ3RoKSB7Ci0gICAgICAgIGxh
bmdGb250TGluay0+R2V0U3RyQ29kZVBhZ2VzKGNoYXJhY3RlcnMsIGxlbmd0aCwgYWNwQ29kZVBh
Z2VzLCAmYWN0dWFsQ29kZVBhZ2VzLCAmbnVtQ2hhcmFjdGVyc1Byb2Nlc3NlZCk7Ci0gICAgICAg
IGlmICgoYWN0dWFsQ29kZVBhZ2VzICYgZm9udENvZGVQYWdlcykgPT0gMCkKLSAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICAgICAgb2Zmc2V0ICs9IG51bUNoYXJhY3RlcnNQcm9jZXNzZWQ7
Ci0gICAgfQotCi0gICAgUmVsZWFzZURDKDAsIGRjKTsKLQotICAgIHJldHVybiB0cnVlOwotfQot
Ci12b2lkIFNpbXBsZUZvbnREYXRhOjpkZXRlcm1pbmVQaXRjaCgpCi17Ci0gICAgaWYgKGlzQ3Vz
dG9tRm9udCgpKSB7Ci0gICAgICAgIG1fdHJlYXRBc0ZpeGVkUGl0Y2ggPSBmYWxzZTsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIFRFWFRNRVRSSUNTIGhhdmUgdGhpcy4gIFNldCBt
X3RyZWF0QXNGaXhlZFBpdGNoIGJhc2VkIG9mZiB0aGF0LgotICAgIEhEQyBkYyA9IEdldERDKDAp
OwotICAgIFNhdmVEQyhkYyk7Ci0gICAgU2VsZWN0T2JqZWN0KGRjLCBtX2ZvbnQuaGZvbnQoKSk7
Ci0KLSAgICAvLyBZZXMsIHRoaXMgbG9va3MgYmFja3dhcmRzLCBidXQgdGhlIGZpeGVkIHBpdGNo
IGJpdCBpcyBhY3R1YWxseSBzZXQgaWYgdGhlIGZvbnQKLSAgICAvLyBpcyAqbm90KiBmaXhlZCBw
aXRjaC4gIFVuYmVsaWV2YWJsZSBidXQgdHJ1ZS4KLSAgICBURVhUTUVUUklDIHRtOwotICAgIEdl
dFRleHRNZXRyaWNzKGRjLCAmdG0pOwotICAgIG1fdHJlYXRBc0ZpeGVkUGl0Y2ggPSAoKHRtLnRt
UGl0Y2hBbmRGYW1pbHkgJiBUTVBGX0ZJWEVEX1BJVENIKSA9PSAwKTsKLQotICAgIFJlc3RvcmVE
QyhkYywgLTEpOwotICAgIFJlbGVhc2VEQygwLCBkYyk7Ci19Ci0KIGZsb2F0IFNpbXBsZUZvbnRE
YXRhOjpwbGF0Zm9ybVdpZHRoRm9yR2x5cGgoR2x5cGggZ2x5cGgpIGNvbnN0CiB7CiAgICAgaWYg
KG1fZm9udC51c2VHREkoKSkgewpAQCAtMjUzLDI5ICsxNjcsMTIgQEAgZmxvYXQgU2ltcGxlRm9u
dERhdGE6OnBsYXRmb3JtV2lkdGhGb3JHbAogICAgIGZsb2F0IHBvaW50U2l6ZSA9IG1fZm9udC5z
aXplKCk7CiAgICAgQ0dTaXplIGFkdmFuY2U7CiAgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENH
QWZmaW5lVHJhbnNmb3JtTWFrZVNjYWxlKHBvaW50U2l6ZSwgcG9pbnRTaXplKTsKKyAKICAgICAv
LyBGSVhNRTogTmVlZCB0byBhZGQgcmVhbCBzdXBwb3J0IGZvciBwcmludGVyIGZvbnRzLgogICAg
IGJvb2wgaXNQcmludGVyRm9udCA9IGZhbHNlOwogICAgIHdrR2V0R2x5cGhBZHZhbmNlcyhmb250
LCBtLCBtX2lzU3lzdGVtRm9udCwgaXNQcmludGVyRm9udCwgZ2x5cGgsIGFkdmFuY2UpOwotICAg
IHJldHVybiBhZHZhbmNlLndpZHRoICsgbV9zeW50aGV0aWNCb2xkT2Zmc2V0OwotfQogCi1TQ1JJ
UFRfRk9OVFBST1BFUlRJRVMqIFNpbXBsZUZvbnREYXRhOjpzY3JpcHRGb250UHJvcGVydGllcygp
IGNvbnN0Ci17Ci0gICAgaWYgKCFtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzKSB7Ci0gICAgICAgIG1f
c2NyaXB0Rm9udFByb3BlcnRpZXMgPSBuZXcgU0NSSVBUX0ZPTlRQUk9QRVJUSUVTOwotICAgICAg
ICBtZW1zZXQobV9zY3JpcHRGb250UHJvcGVydGllcywgMCwgc2l6ZW9mKFNDUklQVF9GT05UUFJP
UEVSVElFUykpOwotICAgICAgICBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzLT5jQnl0ZXMgPSBzaXpl
b2YoU0NSSVBUX0ZPTlRQUk9QRVJUSUVTKTsKLSAgICAgICAgSFJFU1VMVCByZXN1bHQgPSBTY3Jp
cHRHZXRGb250UHJvcGVydGllcygwLCBzY3JpcHRDYWNoZSgpLCBtX3NjcmlwdEZvbnRQcm9wZXJ0
aWVzKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBFX1BFTkRJTkcpIHsKLSAgICAgICAgICAgIEhE
QyBkYyA9IEdldERDKDApOwotICAgICAgICAgICAgU2F2ZURDKGRjKTsKLSAgICAgICAgICAgIFNl
bGVjdE9iamVjdChkYywgbV9mb250Lmhmb250KCkpOwotICAgICAgICAgICAgU2NyaXB0R2V0Rm9u
dFByb3BlcnRpZXMoZGMsIHNjcmlwdENhY2hlKCksIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMpOwot
ICAgICAgICAgICAgUmVzdG9yZURDKGRjLCAtMSk7Ci0gICAgICAgICAgICBSZWxlYXNlREMoMCwg
ZGMpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVz
OworICAgIHJldHVybiBhZHZhbmNlLndpZHRoICsgbV9zeW50aGV0aWNCb2xkT2Zmc2V0OwogfQog
CiB9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNh
aXJvV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9T
aW1wbGVGb250RGF0YUNhaXJvV2luLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ2Fpcm9XaW4uY3BwCShyZXZpc2lvbiAwKQpA
QCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBcHBsZSBJbmMuICBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKiAyLiAgUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAzLiAgTmVpdGhlciB0
aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBv
ZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9t
b3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBz
cGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
CisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTaW1w
bGVGb250RGF0YS5oIgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjaW5jbHVkZSAiRm9udC5o
IgorI2luY2x1ZGUgIkZvbnRDYWNoZS5oIgorI2luY2x1ZGUgIkZvbnREZXNjcmlwdGlvbi5oIgor
I2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSA8bWxhbmcuaD4KKyNpbmNsdWRl
IDx0Y2hhci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3ZvaWQgU2ltcGxlRm9udERhdGE6
OnBsYXRmb3JtSW5pdCgpCit7CisgICAgbV9zY3JpcHRDYWNoZSA9IDA7CisgICAgbV9zY3JpcHRG
b250UHJvcGVydGllcyA9IDA7CisgICAgbV9pc1N5c3RlbUZvbnQgPSBmYWxzZTsKKyAgICAKKyAg
ICBpZiAobV9mb250LnVzZUdESSgpKSB7CisgICAgICAgIEhEQyBoZGMgPSBHZXREQygwKTsKKyAg
ICAgICAgSEdESU9CSiBvbGRGb250ID0gU2VsZWN0T2JqZWN0KGhkYywgbV9mb250Lmhmb250KCkp
OworICAgICAgICBPVVRMSU5FVEVYVE1FVFJJQyBtZXRyaWNzOworICAgICAgICBHZXRPdXRsaW5l
VGV4dE1ldHJpY3MoaGRjLCBzaXplb2YobWV0cmljcyksICZtZXRyaWNzKTsKKyAgICAgICAgVEVY
VE1FVFJJQyYgdGV4dE1ldHJpY3MgPSBtZXRyaWNzLm90bVRleHRNZXRyaWNzOworICAgICAgICBt
X2FzY2VudCA9IHRleHRNZXRyaWNzLnRtQXNjZW50OworICAgICAgICBtX2Rlc2NlbnQgPSB0ZXh0
TWV0cmljcy50bURlc2NlbnQ7CisgICAgICAgIG1fbGluZUdhcCA9IHRleHRNZXRyaWNzLnRtRXh0
ZXJuYWxMZWFkaW5nOworICAgICAgICBtX2xpbmVTcGFjaW5nID0gbV9hc2NlbnQgKyBtX2Rlc2Nl
bnQgKyBtX2xpbmVHYXA7CisgICAgICAgIG1feEhlaWdodCA9IG1fYXNjZW50ICogMC41NmY7IC8v
IEJlc3QgZ3Vlc3MgZm9yIHhIZWlnaHQgaWYgbm8geCBnbHlwaCBpcyBwcmVzZW50LgorCisgICAg
ICAgIEdMWVBITUVUUklDUyBnbTsKKyAgICAgICAgTUFUMiBtYXQgPSB7IDEsIDAsIDAsIDEgfTsK
KyAgICAgICAgRFdPUkQgbGVuID0gR2V0R2x5cGhPdXRsaW5lKGhkYywgJ3gnLCBHR09fTUVUUklD
UywgJmdtLCAwLCAwLCAmbWF0KTsKKyAgICAgICAgaWYgKGxlbiAhPSBHRElfRVJST1IgJiYgZ20u
Z21wdEdseXBoT3JpZ2luLnkgPiAwKQorICAgICAgICAgICAgbV94SGVpZ2h0ID0gZ20uZ21wdEds
eXBoT3JpZ2luLnk7CisKKyAgICAgICAgbV91bml0c1BlckVtID0gbWV0cmljcy5vdG1FTVNxdWFy
ZTsKKworICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBvbGRGb250KTsKKyAgICAgICAgUmVsZWFz
ZURDKDAsIGhkYyk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEZJWE1FOiBU
aGlzIHNlY3Rpb24gc2hvdWxkIGRldGVybWluZSBmb250IGRpbWVuc2lvbnMgKHNlZSBDRyBpbXBs
ZW1lbnRhdGlvbikuCisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBTaW1wbGVGb250
RGF0YTo6cGxhdGZvcm1EZXN0cm95KCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCitm
bG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZvckdseXBoKEdseXBoIGdseXBoKSBj
b25zdAoreworICAgIGlmIChtX2ZvbnQudXNlR0RJKCkpIHsKKyAgICAgICAgSERDIGhkYyA9IEdl
dERDKDApOworICAgICAgICBIR0RJT0JKIG9sZEZvbnQgPSBTZWxlY3RPYmplY3QoaGRjLCBtX2Zv
bnQuaGZvbnQoKSk7CisgICAgICAgIGludCB3aWR0aDsKKyAgICAgICAgR2V0Q2hhcldpZHRoSSho
ZGMsIGdseXBoLCAxLCAwLCAmd2lkdGgpOworICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBvbGRG
b250KTsKKyAgICAgICAgUmVsZWFzZURDKDAsIGhkYyk7CisgICAgICAgIHJldHVybiB3aWR0aDsK
KyAgICB9CisKKyAgICAvLyBGSVhNRTogRmxlc2ggb3V0IHdpdGggQ2Fpcm8vd2luMzIgZm9udCBp
bXBsZW1lbnRhdGlvbgorICAgIG5vdEltcGxlbWVudGVkKCk7CisKKyAgICByZXR1cm4gMDsKK30K
KworfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERhdGFX
aW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBs
ZUZvbnREYXRhV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YVdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSAr
MSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUg
SW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cwpAQCAtNDgsMTE2ICs0OCwxNiBAQCB1c2luZyBzdGQ6Om1heDsKIAogY29uc3QgZmxvYXQgY1Nt
YWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllciA9IDAuN2Y7CiAKLXN0YXRpYyBib29sIHNob3VsZEFw
cGx5TWFjQXNjZW50SGFjazsKLQotc3RhdGljIGlubGluZSBmbG9hdCBzY2FsZUVtVG9Vbml0cyhm
bG9hdCB4LCB1bnNpZ25lZCB1bml0c1BlckVtKSB7IHJldHVybiB1bml0c1BlckVtID8geCAvIChm
bG9hdCl1bml0c1BlckVtIDogeDsgfQorc3RhdGljIGJvb2wgZ19zaG91bGRBcHBseU1hY0FzY2Vu
dEhhY2s7CiAKIHZvaWQgU2ltcGxlRm9udERhdGE6OnNldFNob3VsZEFwcGx5TWFjQXNjZW50SGFj
ayhib29sIGIpCiB7Ci0gICAgc2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrID0gYjsKLX0KLQotdm9p
ZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKLXsgICAgCi0gICAgbV9zeW50aGV0aWNC
b2xkT2Zmc2V0ID0gbV9mb250LnN5bnRoZXRpY0JvbGQoKSA/IDEuMGYgOiAwLmY7Ci0gICAgbV9z
Y3JpcHRDYWNoZSA9IDA7Ci0gICAgbV9zY3JpcHRGb250UHJvcGVydGllcyA9IDA7Ci0gICAgbV9p
c1N5c3RlbUZvbnQgPSBmYWxzZTsKLSAgICAKLSAgICBpZiAobV9mb250LnVzZUdESSgpKSB7Ci0g
ICAgICAgIEhEQyBoZGMgPSBHZXREQygwKTsKLSAgICAgICAgSEdESU9CSiBvbGRGb250ID0gU2Vs
ZWN0T2JqZWN0KGhkYywgbV9mb250Lmhmb250KCkpOwotICAgICAgICBPVVRMSU5FVEVYVE1FVFJJ
QyBtZXRyaWNzOwotICAgICAgICBHZXRPdXRsaW5lVGV4dE1ldHJpY3MoaGRjLCBzaXplb2YobWV0
cmljcyksICZtZXRyaWNzKTsKLSAgICAgICAgVEVYVE1FVFJJQyYgdGV4dE1ldHJpY3MgPSBtZXRy
aWNzLm90bVRleHRNZXRyaWNzOwotICAgICAgICBtX2FzY2VudCA9IHRleHRNZXRyaWNzLnRtQXNj
ZW50OwotICAgICAgICBtX2Rlc2NlbnQgPSB0ZXh0TWV0cmljcy50bURlc2NlbnQ7Ci0gICAgICAg
IG1fbGluZUdhcCA9IHRleHRNZXRyaWNzLnRtRXh0ZXJuYWxMZWFkaW5nOwotICAgICAgICBtX2xp
bmVTcGFjaW5nID0gbV9hc2NlbnQgKyBtX2Rlc2NlbnQgKyBtX2xpbmVHYXA7Ci0gICAgICAgIG1f
eEhlaWdodCA9IG1fYXNjZW50ICogMC41NmY7IC8vIEJlc3QgZ3Vlc3MgZm9yIHhIZWlnaHQgaWYg
bm8geCBnbHlwaCBpcyBwcmVzZW50LgotCi0gICAgICAgIEdMWVBITUVUUklDUyBnbTsKLSAgICAg
ICAgTUFUMiBtYXQgPSB7IDEsIDAsIDAsIDEgfTsKLSAgICAgICAgRFdPUkQgbGVuID0gR2V0R2x5
cGhPdXRsaW5lKGhkYywgJ3gnLCBHR09fTUVUUklDUywgJmdtLCAwLCAwLCAmbWF0KTsKLSAgICAg
ICAgaWYgKGxlbiAhPSBHRElfRVJST1IgJiYgZ20uZ21wdEdseXBoT3JpZ2luLnkgPiAwKQotICAg
ICAgICAgICAgbV94SGVpZ2h0ID0gZ20uZ21wdEdseXBoT3JpZ2luLnk7Ci0KLSAgICAgICAgbV91
bml0c1BlckVtID0gbWV0cmljcy5vdG1FTVNxdWFyZTsKLQotICAgICAgICBTZWxlY3RPYmplY3Qo
aGRjLCBvbGRGb250KTsKLSAgICAgICAgUmVsZWFzZURDKDAsIGhkYyk7Ci0KLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLQotICAgIENHRm9udFJlZiBmb250ID0gbV9mb250LmNnRm9udCgpOwotICAg
IGludCBpQXNjZW50ID0gQ0dGb250R2V0QXNjZW50KGZvbnQpOwotICAgIGludCBpRGVzY2VudCA9
IENHRm9udEdldERlc2NlbnQoZm9udCk7Ci0gICAgaW50IGlMaW5lR2FwID0gQ0dGb250R2V0TGVh
ZGluZyhmb250KTsKLSAgICBtX3VuaXRzUGVyRW0gPSBDR0ZvbnRHZXRVbml0c1BlckVtKGZvbnQp
OwotICAgIGZsb2F0IHBvaW50U2l6ZSA9IG1fZm9udC5zaXplKCk7Ci0gICAgZmxvYXQgZkFzY2Vu
dCA9IHNjYWxlRW1Ub1VuaXRzKGlBc2NlbnQsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7Ci0g
ICAgZmxvYXQgZkRlc2NlbnQgPSAtc2NhbGVFbVRvVW5pdHMoaURlc2NlbnQsIG1fdW5pdHNQZXJF
bSkgKiBwb2ludFNpemU7Ci0gICAgZmxvYXQgZkxpbmVHYXAgPSBzY2FsZUVtVG9Vbml0cyhpTGlu
ZUdhcCwgbV91bml0c1BlckVtKSAqIHBvaW50U2l6ZTsKLQotICAgIGlmICghaXNDdXN0b21Gb250
KCkpIHsKLSAgICAgICAgSERDIGRjID0gR2V0REMoMCk7Ci0gICAgICAgIEhHRElPQkogb2xkRm9u
dCA9IFNlbGVjdE9iamVjdChkYywgbV9mb250Lmhmb250KCkpOwotICAgICAgICBpbnQgZmFjZUxl
bmd0aCA9IEdldFRleHRGYWNlKGRjLCAwLCAwKTsKLSAgICAgICAgVmVjdG9yPFRDSEFSPiBmYWNl
TmFtZShmYWNlTGVuZ3RoKTsKLSAgICAgICAgR2V0VGV4dEZhY2UoZGMsIGZhY2VMZW5ndGgsIGZh
Y2VOYW1lLmRhdGEoKSk7Ci0gICAgICAgIG1faXNTeXN0ZW1Gb250ID0gIV90Y3NjbXAoZmFjZU5h
bWUuZGF0YSgpLCBfVCgiTHVjaWRhIEdyYW5kZSIpKTsKLSAgICAgICAgU2VsZWN0T2JqZWN0KGRj
LCBvbGRGb250KTsKLSAgICAgICAgUmVsZWFzZURDKDAsIGRjKTsKLQotICAgICAgICBpZiAoc2hv
dWxkQXBwbHlNYWNBc2NlbnRIYWNrKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGNvZGUgY29tZXMg
ZnJvbSBGb250RGF0YU1hYy5tbS4gV2Ugb25seSBldmVyIGRvIHRoaXMgd2hlbiBydW5uaW5nIHJl
Z3Jlc3Npb24gdGVzdHMgc28gdGhhdCBvdXIgbWV0cmljcyB3aWxsIG1hdGNoIE1hYy4KLQotICAg
ICAgICAgICAgLy8gV2UgbmVlZCB0byBhZGp1c3QgVGltZXMsIEhlbHZldGljYSwgYW5kIENvdXJp
ZXIgdG8gY2xvc2VseSBtYXRjaCB0aGUKLSAgICAgICAgICAgIC8vIHZlcnRpY2FsIG1ldHJpY3Mg
b2YgdGhlaXIgTWljcm9zb2Z0IGNvdW50ZXJwYXJ0cyB0aGF0IGFyZSB0aGUgZGUgZmFjdG8KLSAg
ICAgICAgICAgIC8vIHdlYiBzdGFuZGFyZC4gVGhlIEFwcEtpdCBhZGp1c3RtZW50IG9mIDIwJSBp
cyB0b28gYmlnIGFuZCBpcwotICAgICAgICAgICAgLy8gaW5jb3JyZWN0bHkgYWRkZWQgdG8gbGlu
ZSBzcGFjaW5nLCBzbyB3ZSB1c2UgYSAxNSUgYWRqdXN0bWVudCBpbnN0ZWFkCi0gICAgICAgICAg
ICAvLyBhbmQgYWRkIGl0IHRvIHRoZSBhc2NlbnQuCi0gICAgICAgICAgICBpZiAoIV90Y3NjbXAo
ZmFjZU5hbWUuZGF0YSgpLCBfVCgiVGltZXMiKSkgfHwgIV90Y3NjbXAoZmFjZU5hbWUuZGF0YSgp
LCBfVCgiSGVsdmV0aWNhIikpIHx8ICFfdGNzY21wKGZhY2VOYW1lLmRhdGEoKSwgX1QoIkNvdXJp
ZXIiKSkpCi0gICAgICAgICAgICAgICAgZkFzY2VudCArPSBmbG9vcmYoKChmQXNjZW50ICsgZkRl
c2NlbnQpICogMC4xNWYpICsgMC41Zik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtX2FzY2Vu
dCA9IGxyb3VuZGYoZkFzY2VudCk7Ci0gICAgbV9kZXNjZW50ID0gbHJvdW5kZihmRGVzY2VudCk7
Ci0gICAgbV9saW5lR2FwID0gbHJvdW5kZihmTGluZUdhcCk7Ci0gICAgbV9saW5lU3BhY2luZyA9
IG1fYXNjZW50ICsgbV9kZXNjZW50ICsgbV9saW5lR2FwOwotCi0gICAgLy8gTWVhc3VyZSB0aGUg
YWN0dWFsIGNoYXJhY3RlciAieCIsIGJlY2F1c2UgQXBwS2l0IHN5bnRoZXNpemVzIFggaGVpZ2h0
IHJhdGhlciB0aGFuIGdldHRpbmcgaXQgZnJvbSB0aGUgZm9udC4KLSAgICAvLyBVbmZvcnR1bmF0
ZWx5LCBOU0ZvbnQgd2lsbCByb3VuZCB0aGlzIGZvciB1cyBzbyB3ZSBkb24ndCBxdWl0ZSBnZXQg
dGhlIHJpZ2h0IHZhbHVlLgotICAgIEdseXBoUGFnZSogZ2x5cGhQYWdlWmVybyA9IEdseXBoUGFn
ZVRyZWVOb2RlOjpnZXRSb290Q2hpbGQodGhpcywgMCktPnBhZ2UoKTsKLSAgICBHbHlwaCB4R2x5
cGggPSBnbHlwaFBhZ2VaZXJvID8gZ2x5cGhQYWdlWmVyby0+Z2x5cGhEYXRhRm9yQ2hhcmFjdGVy
KCd4JykuZ2x5cGggOiAwOwotICAgIGlmICh4R2x5cGgpIHsKLSAgICAgICAgQ0dSZWN0IHhCb3g7
Ci0gICAgICAgIENHRm9udEdldEdseXBoQkJveGVzKGZvbnQsICZ4R2x5cGgsIDEsICZ4Qm94KTsK
LSAgICAgICAgLy8gVXNlIHRoZSBtYXhpbXVtIG9mIGVpdGhlciB3aWR0aCBvciBoZWlnaHQgYmVj
YXVzZSAieCIgaXMgbmVhcmx5IHNxdWFyZQotICAgICAgICAvLyBhbmQgd2ViIHBhZ2VzIHRoYXQg
Zm9vbGlzaGx5IHVzZSB0aGlzIG1ldHJpYyBmb3Igd2lkdGggd2lsbCBiZSBsYWlkIG91dAotICAg
ICAgICAvLyBwb29ybHkgaWYgd2UgcmV0dXJuIGFuIGFjY3VyYXRlIGhlaWdodC4gQ2xhc3NpYyBj
YXNlIGlzIFRpbWVzIDEzIHBvaW50LAotICAgICAgICAvLyB3aGljaCBoYXMgYW4gIngiIHRoYXQg
aXMgN3g2IHBpeGVscy4KLSAgICAgICAgbV94SGVpZ2h0ID0gc2NhbGVFbVRvVW5pdHMobWF4KENH
UmVjdEdldE1heFgoeEJveCksIENHUmVjdEdldE1heFkoeEJveCkpLCBtX3VuaXRzUGVyRW0pICog
cG9pbnRTaXplOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBpWEhlaWdodCA9IENHRm9udEdl
dFhIZWlnaHQoZm9udCk7Ci0gICAgICAgIG1feEhlaWdodCA9IHNjYWxlRW1Ub1VuaXRzKGlYSGVp
Z2h0LCBtX3VuaXRzUGVyRW0pICogcG9pbnRTaXplOwotICAgIH0KKyAgICBnX3Nob3VsZEFwcGx5
TWFjQXNjZW50SGFjayA9IGI7CiB9CiAKLXZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtRGVz
dHJveSgpCitib29sIFNpbXBsZUZvbnREYXRhOjpzaG91bGRBcHBseU1hY0FzY2VudEhhY2soKQog
ewotICAgIGlmICghaXNDdXN0b21Gb250KCkpIHsKLSAgICAgICAgRGVsZXRlT2JqZWN0KG1fZm9u
dC5oZm9udCgpKTsKLSAgICAgICAgQ0dGb250UmVsZWFzZShtX2ZvbnQuY2dGb250KCkpOwotICAg
IH0KLQotICAgIC8vIFdlIGRvbid0IGhhc2ggdGhpcyBvbiBXaW4zMiwgc28gaXQncyBlZmZlY3Rp
dmVseSBvd25lZCBieSB1cy4KLSAgICBkZWxldGUgbV9zbWFsbENhcHNGb250RGF0YTsKLQotICAg
IFNjcmlwdEZyZWVDYWNoZSgmbV9zY3JpcHRDYWNoZSk7Ci0gICAgZGVsZXRlIG1fc2NyaXB0Rm9u
dFByb3BlcnRpZXM7CisgICAgcmV0dXJuIGdfc2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrOwogfQog
CiBTaW1wbGVGb250RGF0YSogU2ltcGxlRm9udERhdGE6OnNtYWxsQ2Fwc0ZvbnREYXRhKGNvbnN0
IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uKSBjb25zdApAQCAtMjM3LDI4ICsxMzcs
NiBAQCB2b2lkIFNpbXBsZUZvbnREYXRhOjpkZXRlcm1pbmVQaXRjaCgpCiAgICAgUmVsZWFzZURD
KDAsIGRjKTsKIH0KIAotZmxvYXQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtV2lkdGhGb3JHbHlw
aChHbHlwaCBnbHlwaCkgY29uc3QKLXsKLSAgICBpZiAobV9mb250LnVzZUdESSgpKSB7Ci0gICAg
ICAgIEhEQyBoZGMgPSBHZXREQygwKTsKLSAgICAgICAgSEdESU9CSiBvbGRGb250ID0gU2VsZWN0
T2JqZWN0KGhkYywgbV9mb250Lmhmb250KCkpOwotICAgICAgICBpbnQgd2lkdGg7Ci0gICAgICAg
IEdldENoYXJXaWR0aEkoaGRjLCBnbHlwaCwgMSwgMCwgJndpZHRoKTsKLSAgICAgICAgU2VsZWN0
T2JqZWN0KGhkYywgb2xkRm9udCk7Ci0gICAgICAgIFJlbGVhc2VEQygwLCBoZGMpOwotICAgICAg
ICByZXR1cm4gd2lkdGg7Ci0gICAgfQotCi0gICAgQ0dGb250UmVmIGZvbnQgPSBtX2ZvbnQuY2dG
b250KCk7Ci0gICAgZmxvYXQgcG9pbnRTaXplID0gbV9mb250LnNpemUoKTsKLSAgICBDR1NpemUg
YWR2YW5jZTsKLSAgICBDR0FmZmluZVRyYW5zZm9ybSBtID0gQ0dBZmZpbmVUcmFuc2Zvcm1NYWtl
U2NhbGUocG9pbnRTaXplLCBwb2ludFNpemUpOwotICAgIC8vIEZJWE1FOiBOZWVkIHRvIGFkZCBy
ZWFsIHN1cHBvcnQgZm9yIHByaW50ZXIgZm9udHMuCi0gICAgYm9vbCBpc1ByaW50ZXJGb250ID0g
ZmFsc2U7Ci0gICAgd2tHZXRHbHlwaEFkdmFuY2VzKGZvbnQsIG0sIG1faXNTeXN0ZW1Gb250LCBp
c1ByaW50ZXJGb250LCBnbHlwaCwgYWR2YW5jZSk7Ci0gICAgcmV0dXJuIGFkdmFuY2Uud2lkdGgg
KyBtX3N5bnRoZXRpY0JvbGRPZmZzZXQ7Ci19Ci0KIFNDUklQVF9GT05UUFJPUEVSVElFUyogU2lt
cGxlRm9udERhdGE6OnNjcmlwdEZvbnRQcm9wZXJ0aWVzKCkgY29uc3QKIHsKICAgICBpZiAoIW1f
c2NyaXB0Rm9udFByb3BlcnRpZXMpIHsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJ
bWFnZUNHV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFnSW1h
Z2VDR1dpbi5jcHAJKHJldmlzaW9uIDI5ODM0KQkoZnJvbSBXZWJDb3JlL3BsYXRmb3JtL3dpbi9E
cmFnSW1hZ2VXaW4uY3BwOjI5ODM0KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdl
Q0dXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJEcmFnSW1hZ2UuaCIKKworI2luY2x1ZGUgIkNh
Y2hlZEltYWdlLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiSW1h
Z2UuaCIKKyNpbmNsdWRlICJSZXRhaW5QdHIuaCIKKworI2luY2x1ZGUgPENvcmVHcmFwaGljcy9D
b3JlR3JhcGhpY3MuaD4KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCitJbnRTaXplIGRyYWdJbWFnZVNpemUoRHJhZ0ltYWdlUmVmIGltYWdlKQoreworICAg
IGlmICghaW1hZ2UpCisgICAgICAgIHJldHVybiBJbnRTaXplKCk7CisgICAgQklUTUFQIGI7Cisg
ICAgR2V0T2JqZWN0KGltYWdlLCBzaXplb2YoQklUTUFQKSwgJmIpOworICAgIHJldHVybiBJbnRT
aXplKGIuYm1XaWR0aCwgYi5ibUhlaWdodCk7Cit9CisKK3ZvaWQgZGVsZXRlRHJhZ0ltYWdlKERy
YWdJbWFnZVJlZiBpbWFnZSkKK3sKKyAgICBpZiAoaW1hZ2UpCisgICAgICAgIDo6RGVsZXRlT2Jq
ZWN0KGltYWdlKTsKK30KKworSEJJVE1BUCBhbGxvY0ltYWdlKEhEQyBkYywgSW50U2l6ZSBzaXpl
LCBDR0NvbnRleHRSZWYgKnRhcmdldFJlZikKK3sKKyAgICBIQklUTUFQIGhibXA7CisgICAgQklU
TUFQSU5GTyBibXBJbmZvID0gezB9OworICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpU2l6ZSA9IHNp
emVvZihCSVRNQVBJTkZPSEVBREVSKTsKKyAgICBibXBJbmZvLmJtaUhlYWRlci5iaVdpZHRoID0g
c2l6ZS53aWR0aCgpOworICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpSGVpZ2h0ID0gc2l6ZS5oZWln
aHQoKTsKKyAgICBibXBJbmZvLmJtaUhlYWRlci5iaVBsYW5lcyA9IDE7CisgICAgYm1wSW5mby5i
bWlIZWFkZXIuYmlCaXRDb3VudCA9IDMyOworICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpQ29tcHJl
c3Npb24gPSBCSV9SR0I7CisgICAgTFBWT0lEIGJpdHM7CisgICAgaGJtcCA9IENyZWF0ZURJQlNl
Y3Rpb24oZGMsICZibXBJbmZvLCBESUJfUkdCX0NPTE9SUywgJmJpdHMsIDAsIDApOworCisgICAg
aWYgKCF0YXJnZXRSZWYpCisgICAgICAgIHJldHVybiBoYm1wOworCisgICAgQ0dDb2xvclNwYWNl
UmVmIGRldmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOworICAgIENHQ29u
dGV4dFJlZiBiaXRtYXBDb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGJpdHMsIGJtcElu
Zm8uYm1pSGVhZGVyLmJpV2lkdGgsIGJtcEluZm8uYm1pSGVhZGVyLmJpSGVpZ2h0LCA4LAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcElu
Zm8uYm1pSGVhZGVyLmJpV2lkdGggKiA0LCBkZXZpY2VSR0IsIAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDR0JpdG1hcEJ5dGVPcmRlcjMy
TGl0dGxlIHwga0NHSW1hZ2VBbHBoYU5vbmVTa2lwRmlyc3QpOworICAgIENHQ29sb3JTcGFjZVJl
bGVhc2UoZGV2aWNlUkdCKTsKKyAgICBpZiAoIWJpdG1hcENvbnRleHQpIHsKKyAgICAgICAgRGVs
ZXRlT2JqZWN0KGhibXApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAqdGFyZ2V0
UmVmID0gYml0bWFwQ29udGV4dDsKKyAgICByZXR1cm4gaGJtcDsKK30KKworc3RhdGljIENHQ29u
dGV4dFJlZiBjcmVhdGVDZ0NvbnRleHRGcm9tQml0bWFwKEhCSVRNQVAgYml0bWFwKQoreworICAg
IEJJVE1BUCBpbmZvOworICAgIEdldE9iamVjdChiaXRtYXAsIHNpemVvZihpbmZvKSwgJmluZm8p
OworICAgIEFTU0VSVChpbmZvLmJtQml0c1BpeGVsID09IDMyKTsKKworICAgIENHQ29sb3JTcGFj
ZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKKyAgICBDR0Nv
bnRleHRSZWYgYml0bWFwQ29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZShpbmZvLmJtQml0
cywgaW5mby5ibVdpZHRoLCBpbmZvLmJtSGVpZ2h0LCA4LAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uYm1XaWR0aEJ5dGVzLCBkZXZp
Y2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwga0NHSW1hZ2VBbHBoYU5vbmVTa2lw
Rmlyc3QpOworICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKKyAgICByZXR1cm4g
Yml0bWFwQ29udGV4dDsKK30KKworRHJhZ0ltYWdlUmVmIHNjYWxlRHJhZ0ltYWdlKERyYWdJbWFn
ZVJlZiBpbWFnZSwgRmxvYXRTaXplIHNjYWxlKQoreworICAgIC8vIEZJWE1FOiBkdWUgdG8gdGhl
IHdheSBkcmFnIGltYWdlcyBhcmUgZG9uZSBvbiB3aW5kb3dzIHdlIG5lZWQgCisgICAgLy8gdG8g
cHJlcHJvY2VzcyB0aGUgYWxwaGEgY2hhbm5lbCA8cmRhcjovL3Byb2JsZW0vNTAxNTk0Nj4KKwor
ICAgIGlmICghaW1hZ2UpCisgICAgICAgIHJldHVybiAwOworICAgIENHQ29udGV4dFJlZiB0YXJn
ZXRDb250ZXh0OworICAgIENHQ29udGV4dFJlZiBzcmNDb250ZXh0OworICAgIENHSW1hZ2VSZWYg
c3JjSW1hZ2U7CisgICAgSW50U2l6ZSBzcmNTaXplID0gZHJhZ0ltYWdlU2l6ZShpbWFnZSk7Cisg
ICAgSW50U2l6ZSBkc3RTaXplKChpbnQpKHNyY1NpemUud2lkdGgoKSAqIHNjYWxlLndpZHRoKCkp
LCAoaW50KShzcmNTaXplLmhlaWdodCgpICogc2NhbGUuaGVpZ2h0KCkpKTsKKyAgICBIQklUTUFQ
IGhibXAgPSAwOworICAgIEhEQyBkYyA9IEdldERDKDApOworICAgIEhEQyBkc3REQyA9IENyZWF0
ZUNvbXBhdGlibGVEQyhkYyk7CisgICAgaWYgKCFkc3REQykKKyAgICAgICAgZ290byBleGl0Owor
CisgICAgaGJtcCA9IGFsbG9jSW1hZ2UoZHN0REMsIGRzdFNpemUsICZ0YXJnZXRDb250ZXh0KTsK
KyAgICBpZiAoIWhibXApCisgICAgICAgIGdvdG8gZXhpdDsKKworICAgIHNyY0NvbnRleHQgPSBj
cmVhdGVDZ0NvbnRleHRGcm9tQml0bWFwKGltYWdlKTsKKyAgICBzcmNJbWFnZSA9IENHQml0bWFw
Q29udGV4dENyZWF0ZUltYWdlKHNyY0NvbnRleHQpOworICAgIENHUmVjdCByZWN0OworICAgIHJl
Y3Qub3JpZ2luLnggPSAwOworICAgIHJlY3Qub3JpZ2luLnkgPSAwOworICAgIHJlY3Quc2l6ZSA9
IGRzdFNpemU7CisgICAgQ0dDb250ZXh0RHJhd0ltYWdlKHRhcmdldENvbnRleHQsIHJlY3QsIHNy
Y0ltYWdlKTsKKyAgICBDR0ltYWdlUmVsZWFzZShzcmNJbWFnZSk7CisgICAgQ0dDb250ZXh0UmVs
ZWFzZShzcmNDb250ZXh0KTsKKyAgICBDR0NvbnRleHRSZWxlYXNlKHRhcmdldENvbnRleHQpOwor
ICAgIDo6RGVsZXRlT2JqZWN0KGltYWdlKTsKKyAgICBpbWFnZSA9IDA7CisKK2V4aXQ6CisgICAg
aWYgKCFoYm1wKQorICAgICAgICBoYm1wID0gaW1hZ2U7CisgICAgaWYgKGRzdERDKQorICAgICAg
ICBEZWxldGVEQyhkc3REQyk7CisgICAgUmVsZWFzZURDKDAsIGRjKTsKKyAgICByZXR1cm4gaGJt
cDsKK30KKyAgICAKK0RyYWdJbWFnZVJlZiBkaXNzb2x2ZURyYWdJbWFnZVRvRnJhY3Rpb24oRHJh
Z0ltYWdlUmVmIGltYWdlLCBmbG9hdCkKK3sKKyAgICAvL1dlIGRvbid0IGRvIHRoaXMgb24gd2lu
ZG93cyBhcyB0aGUgZHJhZ2ltYWdlIGlzIGJsZW5kZWQgYnkgdGhlIE9TCisgICAgcmV0dXJuIGlt
YWdlOworfQorICAgICAgICAKK0RyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2Uo
SW1hZ2UqIGltZykKK3sgICAgCisgICAgSEJJVE1BUCBoYm1wID0gMDsKKyAgICBIREMgZGMgPSBH
ZXREQygwKTsKKyAgICBIREMgd29ya2luZ0RDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGRjKTsKKyAg
ICBDR0NvbnRleHRSZWYgZHJhd0NvbnRleHQgPSAwOworICAgIGlmICghd29ya2luZ0RDKQorICAg
ICAgICBnb3RvIGV4aXQ7CisKKyAgICBoYm1wID0gYWxsb2NJbWFnZSh3b3JraW5nREMsIGltZy0+
c2l6ZSgpLCAmZHJhd0NvbnRleHQpOworCisgICAgaWYgKCFoYm1wKQorICAgICAgICBnb3RvIGV4
aXQ7CisKKyAgICBpZiAoIWRyYXdDb250ZXh0KSB7CisgICAgICAgIDo6RGVsZXRlT2JqZWN0KGhi
bXApOworICAgICAgICBoYm1wID0gMDsKKyAgICB9CisKKyAgICBDR0ltYWdlUmVmIHNyY0ltYWdl
ID0gaW1nLT5nZXRDR0ltYWdlUmVmKCk7CisgICAgQ0dSZWN0IHJlY3Q7CisgICAgcmVjdC5zaXpl
ID0gaW1nLT5zaXplKCk7CisgICAgcmVjdC5vcmlnaW4ueCA9IDA7CisgICAgcmVjdC5vcmlnaW4u
eSA9IC1yZWN0LnNpemUuaGVpZ2h0OworICAgIHN0YXRpYyBjb25zdCBDR0Zsb2F0IHdoaXRlIFtd
ID0gezEuMCwgMS4wLCAxLjAsIDEuMH07CisgICAgQ0dDb250ZXh0U2NhbGVDVE0oZHJhd0NvbnRl
eHQsIDEsIC0xKTsKKyAgICBDR0NvbnRleHRTZXRGaWxsQ29sb3IoZHJhd0NvbnRleHQsIHdoaXRl
KTsKKyAgICBDR0NvbnRleHRGaWxsUmVjdChkcmF3Q29udGV4dCwgcmVjdCk7CisgICAgQ0dDb250
ZXh0U2V0QmxlbmRNb2RlKGRyYXdDb250ZXh0LCBrQ0dCbGVuZE1vZGVOb3JtYWwpOworICAgIENH
Q29udGV4dERyYXdJbWFnZShkcmF3Q29udGV4dCwgcmVjdCwgc3JjSW1hZ2UpOworICAgIENHQ29u
dGV4dFJlbGVhc2UoZHJhd0NvbnRleHQpOworCitleGl0OgorICAgIGlmICh3b3JraW5nREMpCisg
ICAgICAgIERlbGV0ZURDKHdvcmtpbmdEQyk7CisgICAgUmVsZWFzZURDKDAsIGRjKTsKKyAgICBy
ZXR1cm4gaGJtcDsKK30KKyAgICAKK0RyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VJY29uRm9y
Q2FjaGVkSW1hZ2UoQ2FjaGVkSW1hZ2UqKQoreworICAgIC8vRklYTUU6IFByb3ZpZGUgaWNvbiBm
b3IgaW1hZ2UgdHlwZSA8cmRhcjovL3Byb2JsZW0vNTAxNTk0OT4KKyAgICByZXR1cm4gMDsgICAg
IAorfQorICAgIAorfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlQ0dXaW4u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNHV2luLmNw
cAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFnSW1hZ2VDR1dp
bi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChD
KSAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDcsIDIwMDggQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMzcsMjEgKzM3LDYgQEAKIAogbmFtZXNwYWNlIFdlYkNv
cmUgewogCi1JbnRTaXplIGRyYWdJbWFnZVNpemUoRHJhZ0ltYWdlUmVmIGltYWdlKQotewotICAg
IGlmICghaW1hZ2UpCi0gICAgICAgIHJldHVybiBJbnRTaXplKCk7Ci0gICAgQklUTUFQIGI7Ci0g
ICAgR2V0T2JqZWN0KGltYWdlLCBzaXplb2YoQklUTUFQKSwgJmIpOwotICAgIHJldHVybiBJbnRT
aXplKGIuYm1XaWR0aCwgYi5ibUhlaWdodCk7Ci19Ci0KLXZvaWQgZGVsZXRlRHJhZ0ltYWdlKERy
YWdJbWFnZVJlZiBpbWFnZSkKLXsKLSAgICBpZiAoaW1hZ2UpCi0gICAgICAgIDo6RGVsZXRlT2Jq
ZWN0KGltYWdlKTsKLX0KLQogSEJJVE1BUCBhbGxvY0ltYWdlKEhEQyBkYywgSW50U2l6ZSBzaXpl
LCBDR0NvbnRleHRSZWYgKnRhcmdldFJlZikKIHsKICAgICBIQklUTUFQIGhibXA7CkBAIC0xMDYs
NyArOTEsNyBAQCBEcmFnSW1hZ2VSZWYgc2NhbGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVmCiAgICAg
Q0dDb250ZXh0UmVmIHNyY0NvbnRleHQ7CiAgICAgQ0dJbWFnZVJlZiBzcmNJbWFnZTsKICAgICBJ
bnRTaXplIHNyY1NpemUgPSBkcmFnSW1hZ2VTaXplKGltYWdlKTsKLSAgICBJbnRTaXplIGRzdFNp
emUoKGludCkoc3JjU2l6ZS53aWR0aCgpICogc2NhbGUud2lkdGgoKSksIChpbnQpKHNyY1NpemUu
aGVpZ2h0KCkgKiBzY2FsZS5oZWlnaHQoKSkpOworICAgIEludFNpemUgZHN0U2l6ZShzdGF0aWNf
Y2FzdDxpbnQ+KHNyY1NpemUud2lkdGgoKSAqIHNjYWxlLndpZHRoKCkpLCBzdGF0aWNfY2FzdDxp
bnQ+KHNyY1NpemUuaGVpZ2h0KCkgKiBzY2FsZS5oZWlnaHQoKSkpOwogICAgIEhCSVRNQVAgaGJt
cCA9IDA7CiAgICAgSERDIGRjID0gR2V0REMoMCk7CiAgICAgSERDIGRzdERDID0gQ3JlYXRlQ29t
cGF0aWJsZURDKGRjKTsKQEAgLTEzOSwxNCArMTI0LDggQEAgZXhpdDoKICAgICByZXR1cm4gaGJt
cDsKIH0KICAgICAKLURyYWdJbWFnZVJlZiBkaXNzb2x2ZURyYWdJbWFnZVRvRnJhY3Rpb24oRHJh
Z0ltYWdlUmVmIGltYWdlLCBmbG9hdCkKLXsKLSAgICAvL1dlIGRvbid0IGRvIHRoaXMgb24gd2lu
ZG93cyBhcyB0aGUgZHJhZ2ltYWdlIGlzIGJsZW5kZWQgYnkgdGhlIE9TCi0gICAgcmV0dXJuIGlt
YWdlOwotfQotICAgICAgICAKIERyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2Uo
SW1hZ2UqIGltZykKLXsgICAgCit7CiAgICAgSEJJVE1BUCBoYm1wID0gMDsKICAgICBIREMgZGMg
PSBHZXREQygwKTsKICAgICBIREMgd29ya2luZ0RDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGRjKTsK
QEAgLTE4NCwxMCArMTYzLDQgQEAgZXhpdDoKICAgICByZXR1cm4gaGJtcDsKIH0KICAgICAKLURy
YWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VJY29uRm9yQ2FjaGVkSW1hZ2UoQ2FjaGVkSW1hZ2Uq
KQotewotICAgIC8vRklYTUU6IFByb3ZpZGUgaWNvbiBmb3IgaW1hZ2UgdHlwZSA8cmRhcjovL3By
b2JsZW0vNTAxNTk0OT4KLSAgICByZXR1cm4gMDsgICAgIAotfQotICAgIAogfQpJbmRleDogV2Vi
Q29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlQ2Fpcm9XaW4uY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNhaXJvV2luLmNwcAkocmV2aXNpb24gMCkKKysr
IFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNhaXJvV2luLmNwcAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBcHBsZSBJbmMuICBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiRHJhZ0ltYWdlLmgiCisKKyNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgorI2luY2x1ZGUgIkdy
YXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkltYWdlLmgiCisjaW5jbHVkZSAiTm90SW1wbGVt
ZW50ZWQuaCIKKyNpbmNsdWRlICJSZXRhaW5QdHIuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4K
KworbmFtZXNwYWNlIFdlYkNvcmUgeworCitEcmFnSW1hZ2VSZWYgc2NhbGVEcmFnSW1hZ2UoRHJh
Z0ltYWdlUmVmIGltYWdlLCBGbG9hdFNpemUgc2NhbGUpCit7CisgICAgbm90SW1wbGVtZW50ZWQo
KTsKKworICAgIHJldHVybiBpbWFnZTsKK30KKyAgICAKK0RyYWdJbWFnZVJlZiBjcmVhdGVEcmFn
SW1hZ2VGcm9tSW1hZ2UoSW1hZ2UqIGltZykKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworCisg
ICAgRHJhZ0ltYWdlUmVmIHRlbXA7CisgICAgcmV0dXJuIHRlbXA7Cit9CisgICAgCit9CkluZGV4
OiBXZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFnSW1hZ2VXaW4uY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZVdpbi5jcHAJKHJldmlzaW9uIDI5ODM0KQorKysg
V2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBBcHBsZSBJbmMuICBB
bGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0z
MSw4ICszMSw2IEBACiAjaW5jbHVkZSAiSW1hZ2UuaCIKICNpbmNsdWRlICJSZXRhaW5QdHIuaCIK
IAotI2luY2x1ZGUgPENvcmVHcmFwaGljcy9Db3JlR3JhcGhpY3MuaD4KLQogI2luY2x1ZGUgPHdp
bmRvd3MuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewpAQCAtNTIsMTM4ICs1MCwxMiBAQCB2b2lk
IGRlbGV0ZURyYWdJbWFnZShEcmFnSW1hZ2VSZWYgaW1hZ2UpCiAgICAgICAgIDo6RGVsZXRlT2Jq
ZWN0KGltYWdlKTsKIH0KIAotSEJJVE1BUCBhbGxvY0ltYWdlKEhEQyBkYywgSW50U2l6ZSBzaXpl
LCBDR0NvbnRleHRSZWYgKnRhcmdldFJlZikKLXsKLSAgICBIQklUTUFQIGhibXA7Ci0gICAgQklU
TUFQSU5GTyBibXBJbmZvID0gezB9OwotICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpU2l6ZSA9IHNp
emVvZihCSVRNQVBJTkZPSEVBREVSKTsKLSAgICBibXBJbmZvLmJtaUhlYWRlci5iaVdpZHRoID0g
c2l6ZS53aWR0aCgpOwotICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpSGVpZ2h0ID0gc2l6ZS5oZWln
aHQoKTsKLSAgICBibXBJbmZvLmJtaUhlYWRlci5iaVBsYW5lcyA9IDE7Ci0gICAgYm1wSW5mby5i
bWlIZWFkZXIuYmlCaXRDb3VudCA9IDMyOwotICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpQ29tcHJl
c3Npb24gPSBCSV9SR0I7Ci0gICAgTFBWT0lEIGJpdHM7Ci0gICAgaGJtcCA9IENyZWF0ZURJQlNl
Y3Rpb24oZGMsICZibXBJbmZvLCBESUJfUkdCX0NPTE9SUywgJmJpdHMsIDAsIDApOwotCi0gICAg
aWYgKCF0YXJnZXRSZWYpCi0gICAgICAgIHJldHVybiBoYm1wOwotCi0gICAgQ0dDb2xvclNwYWNl
UmVmIGRldmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwotICAgIENHQ29u
dGV4dFJlZiBiaXRtYXBDb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGJpdHMsIGJtcElu
Zm8uYm1pSGVhZGVyLmJpV2lkdGgsIGJtcEluZm8uYm1pSGVhZGVyLmJpSGVpZ2h0LCA4LAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcElu
Zm8uYm1pSGVhZGVyLmJpV2lkdGggKiA0LCBkZXZpY2VSR0IsIAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDR0JpdG1hcEJ5dGVPcmRlcjMy
TGl0dGxlIHwga0NHSW1hZ2VBbHBoYU5vbmVTa2lwRmlyc3QpOwotICAgIENHQ29sb3JTcGFjZVJl
bGVhc2UoZGV2aWNlUkdCKTsKLSAgICBpZiAoIWJpdG1hcENvbnRleHQpIHsKLSAgICAgICAgRGVs
ZXRlT2JqZWN0KGhibXApOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAqdGFyZ2V0
UmVmID0gYml0bWFwQ29udGV4dDsKLSAgICByZXR1cm4gaGJtcDsKLX0KLQotc3RhdGljIENHQ29u
dGV4dFJlZiBjcmVhdGVDZ0NvbnRleHRGcm9tQml0bWFwKEhCSVRNQVAgYml0bWFwKQotewotICAg
IEJJVE1BUCBpbmZvOwotICAgIEdldE9iamVjdChiaXRtYXAsIHNpemVvZihpbmZvKSwgJmluZm8p
OwotICAgIEFTU0VSVChpbmZvLmJtQml0c1BpeGVsID09IDMyKTsKLQotICAgIENHQ29sb3JTcGFj
ZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKLSAgICBDR0Nv
bnRleHRSZWYgYml0bWFwQ29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZShpbmZvLmJtQml0
cywgaW5mby5ibVdpZHRoLCBpbmZvLmJtSGVpZ2h0LCA4LAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uYm1XaWR0aEJ5dGVzLCBkZXZp
Y2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwga0NHSW1hZ2VBbHBoYU5vbmVTa2lw
Rmlyc3QpOwotICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKLSAgICByZXR1cm4g
Yml0bWFwQ29udGV4dDsKLX0KLQotRHJhZ0ltYWdlUmVmIHNjYWxlRHJhZ0ltYWdlKERyYWdJbWFn
ZVJlZiBpbWFnZSwgRmxvYXRTaXplIHNjYWxlKQotewotICAgIC8vIEZJWE1FOiBkdWUgdG8gdGhl
IHdheSBkcmFnIGltYWdlcyBhcmUgZG9uZSBvbiB3aW5kb3dzIHdlIG5lZWQgCi0gICAgLy8gdG8g
cHJlcHJvY2VzcyB0aGUgYWxwaGEgY2hhbm5lbCA8cmRhcjovL3Byb2JsZW0vNTAxNTk0Nj4KLQot
ICAgIGlmICghaW1hZ2UpCi0gICAgICAgIHJldHVybiAwOwotICAgIENHQ29udGV4dFJlZiB0YXJn
ZXRDb250ZXh0OwotICAgIENHQ29udGV4dFJlZiBzcmNDb250ZXh0OwotICAgIENHSW1hZ2VSZWYg
c3JjSW1hZ2U7Ci0gICAgSW50U2l6ZSBzcmNTaXplID0gZHJhZ0ltYWdlU2l6ZShpbWFnZSk7Ci0g
ICAgSW50U2l6ZSBkc3RTaXplKChpbnQpKHNyY1NpemUud2lkdGgoKSAqIHNjYWxlLndpZHRoKCkp
LCAoaW50KShzcmNTaXplLmhlaWdodCgpICogc2NhbGUuaGVpZ2h0KCkpKTsKLSAgICBIQklUTUFQ
IGhibXAgPSAwOwotICAgIEhEQyBkYyA9IEdldERDKDApOwotICAgIEhEQyBkc3REQyA9IENyZWF0
ZUNvbXBhdGlibGVEQyhkYyk7Ci0gICAgaWYgKCFkc3REQykKLSAgICAgICAgZ290byBleGl0Owot
Ci0gICAgaGJtcCA9IGFsbG9jSW1hZ2UoZHN0REMsIGRzdFNpemUsICZ0YXJnZXRDb250ZXh0KTsK
LSAgICBpZiAoIWhibXApCi0gICAgICAgIGdvdG8gZXhpdDsKLQotICAgIHNyY0NvbnRleHQgPSBj
cmVhdGVDZ0NvbnRleHRGcm9tQml0bWFwKGltYWdlKTsKLSAgICBzcmNJbWFnZSA9IENHQml0bWFw
Q29udGV4dENyZWF0ZUltYWdlKHNyY0NvbnRleHQpOwotICAgIENHUmVjdCByZWN0OwotICAgIHJl
Y3Qub3JpZ2luLnggPSAwOwotICAgIHJlY3Qub3JpZ2luLnkgPSAwOwotICAgIHJlY3Quc2l6ZSA9
IGRzdFNpemU7Ci0gICAgQ0dDb250ZXh0RHJhd0ltYWdlKHRhcmdldENvbnRleHQsIHJlY3QsIHNy
Y0ltYWdlKTsKLSAgICBDR0ltYWdlUmVsZWFzZShzcmNJbWFnZSk7Ci0gICAgQ0dDb250ZXh0UmVs
ZWFzZShzcmNDb250ZXh0KTsKLSAgICBDR0NvbnRleHRSZWxlYXNlKHRhcmdldENvbnRleHQpOwot
ICAgIDo6RGVsZXRlT2JqZWN0KGltYWdlKTsKLSAgICBpbWFnZSA9IDA7Ci0KLWV4aXQ6Ci0gICAg
aWYgKCFoYm1wKQotICAgICAgICBoYm1wID0gaW1hZ2U7Ci0gICAgaWYgKGRzdERDKQotICAgICAg
ICBEZWxldGVEQyhkc3REQyk7Ci0gICAgUmVsZWFzZURDKDAsIGRjKTsKLSAgICByZXR1cm4gaGJt
cDsKLX0KLSAgICAKIERyYWdJbWFnZVJlZiBkaXNzb2x2ZURyYWdJbWFnZVRvRnJhY3Rpb24oRHJh
Z0ltYWdlUmVmIGltYWdlLCBmbG9hdCkKIHsKICAgICAvL1dlIGRvbid0IGRvIHRoaXMgb24gd2lu
ZG93cyBhcyB0aGUgZHJhZ2ltYWdlIGlzIGJsZW5kZWQgYnkgdGhlIE9TCiAgICAgcmV0dXJuIGlt
YWdlOwogfQogICAgICAgICAKLURyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2Uo
SW1hZ2UqIGltZykKLXsgICAgCi0gICAgSEJJVE1BUCBoYm1wID0gMDsKLSAgICBIREMgZGMgPSBH
ZXREQygwKTsKLSAgICBIREMgd29ya2luZ0RDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGRjKTsKLSAg
ICBDR0NvbnRleHRSZWYgZHJhd0NvbnRleHQgPSAwOwotICAgIGlmICghd29ya2luZ0RDKQotICAg
ICAgICBnb3RvIGV4aXQ7Ci0KLSAgICBoYm1wID0gYWxsb2NJbWFnZSh3b3JraW5nREMsIGltZy0+
c2l6ZSgpLCAmZHJhd0NvbnRleHQpOwotCi0gICAgaWYgKCFoYm1wKQotICAgICAgICBnb3RvIGV4
aXQ7Ci0KLSAgICBpZiAoIWRyYXdDb250ZXh0KSB7Ci0gICAgICAgIDo6RGVsZXRlT2JqZWN0KGhi
bXApOwotICAgICAgICBoYm1wID0gMDsKLSAgICB9Ci0KLSAgICBDR0ltYWdlUmVmIHNyY0ltYWdl
ID0gaW1nLT5nZXRDR0ltYWdlUmVmKCk7Ci0gICAgQ0dSZWN0IHJlY3Q7Ci0gICAgcmVjdC5zaXpl
ID0gaW1nLT5zaXplKCk7Ci0gICAgcmVjdC5vcmlnaW4ueCA9IDA7Ci0gICAgcmVjdC5vcmlnaW4u
eSA9IC1yZWN0LnNpemUuaGVpZ2h0OwotICAgIHN0YXRpYyBjb25zdCBDR0Zsb2F0IHdoaXRlIFtd
ID0gezEuMCwgMS4wLCAxLjAsIDEuMH07Ci0gICAgQ0dDb250ZXh0U2NhbGVDVE0oZHJhd0NvbnRl
eHQsIDEsIC0xKTsKLSAgICBDR0NvbnRleHRTZXRGaWxsQ29sb3IoZHJhd0NvbnRleHQsIHdoaXRl
KTsKLSAgICBDR0NvbnRleHRGaWxsUmVjdChkcmF3Q29udGV4dCwgcmVjdCk7Ci0gICAgQ0dDb250
ZXh0U2V0QmxlbmRNb2RlKGRyYXdDb250ZXh0LCBrQ0dCbGVuZE1vZGVOb3JtYWwpOwotICAgIENH
Q29udGV4dERyYXdJbWFnZShkcmF3Q29udGV4dCwgcmVjdCwgc3JjSW1hZ2UpOwotICAgIENHQ29u
dGV4dFJlbGVhc2UoZHJhd0NvbnRleHQpOwotCi1leGl0OgotICAgIGlmICh3b3JraW5nREMpCi0g
ICAgICAgIERlbGV0ZURDKHdvcmtpbmdEQyk7Ci0gICAgUmVsZWFzZURDKDAsIGRjKTsKLSAgICBy
ZXR1cm4gaGJtcDsKLX0KLSAgICAKIERyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VJY29uRm9y
Q2FjaGVkSW1hZ2UoQ2FjaGVkSW1hZ2UqKQogewogICAgIC8vRklYTUU6IFByb3ZpZGUgaWNvbiBm
b3IgaW1hZ2UgdHlwZSA8cmRhcjovL3Byb2JsZW0vNTAxNTk0OT4K
</data>
<flag name="review"
          id="8224"
          type_id="1"
          status="-"
          setter="aroben"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>18914</attachid>
            <date>2008-02-04 12:25:27 -0800</date>
            <delta_ts>2008-02-06 16:08:55 -0800</delta_ts>
            <desc>Ninth patch based on Adam&apos;s comments.</desc>
            <filename>webcore_win32.patch</filename>
            <type>text/plain</type>
            <size>210363</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyOTg0NykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNzYgQEAKKzIwMDgtMDEtMjkgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBnbWFp
bC5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
Rmlyc3Qgc3RlcCB0b3dhcmRzIHJlZW5hYmxpbmcgQ2Fpcm8gc3VwcG9ydCB1bmRlciBXaW5kb3dz
LgorICAgICAgICAtIGFkZHMgdmFyaW91cyBQTEFURk9STSBndWFyZHMgdG8gY29kZSB0aGF0IHdp
bGwgbm90IGJ1aWxkCisgICAgICAgICAgdW5kZXIgQ2Fpcm8uCisgICAgICAgIC0gYnJlYWtzIHNv
bWUgZmlsZXMgaW50byBDRyBhbmQgQ2Fpcm8tc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zLgorICAg
ICAgICAtIHByb3ZpZGVzIHNvbWUgd2luMzIvQ2Fpcm8gc3VwcG9ydCAoYnV0IGJ5IG5vIG1lYW5z
IGEgY29tcGxldGUKKyAgICAgICAgICBwb3J0IC0tIHlldCkuCisKKyAgICAgICAgV0FSTklORzog
Tk8gVEVTVCBDQVNFUyBBRERFRCBPUiBDSEFOR0VECisKKyAgICAgICAgKiBXZWJDb3JlLnZjcHJv
ai9XZWJDb3JlLnZjcHJvajoKKyAgICAgICAgKiBicmlkZ2Uvd2luL0ZyYW1lQ0dXaW4uY3BwOiBD
b3BpZWQgZnJvbSBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVXaW4uY3BwLgorICAgICAgICAoV2Vi
Q29yZTo6aW1hZ2VGcm9tU2VsZWN0aW9uKToKKyAgICAgICAgKiBicmlkZ2Uvd2luL0ZyYW1lQ2Fp
cm9XaW4uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OmltYWdlRnJvbVNlbGVjdGlvbik6
CisgICAgICAgICogYnJpZGdlL3dpbi9GcmFtZVdpbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpj
b21wdXRlUGFnZVJlY3RzRm9yRnJhbWUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL1Np
bXBsZUZvbnREYXRhLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhp
Y3NDb250ZXh0Q2Fpcm8uY3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZS5oOiBDb3BpZWQgZnJvbSBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4dENhaXJvLmNwcC4KKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENHV2luLmNwcDogQ29waWVkIGZyb20gV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udFdpbi5jcHAuCisgICAgICAgIChXZWJDb3JlOjpGb250
OjpkcmF3R2x5cGhzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENhaXJv
V2luLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpGb250OjpkcmF3R2x5cGhzKToKKyAg
ICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udFdpbi5jcHA6CisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENHV2luLmNwcDogQ29waWVkIGZyb20g
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0V2luLmNwcC4KKyAg
ICAgICAgKFdlYkNvcmU6OkNHQ29udGV4dFdpdGhIREMpOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0OjpnZXRXaW5kb3dzQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQ6OnJlbGVhc2VXaW5kb3dzQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNvbmNhdENUTSk6CisgICAgICAgIChXZWJD
b3JlOjpzZXRDR1N0cm9rZUNvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dDo6ZHJhd0xpbmVGb3JNaXNzcGVsbGluZ09yQmFkR3JhbW1hcik6CisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENhaXJvV2luLmNwcDogQWRkZWQuCisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dCk6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmdldFdpbmRvd3NDb250ZXh0KToKKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6aW5UcmFuc3BhcmVuY3lMYXllcik6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnJlbGVhc2VXaW5kb3dzQ29udGV4dCk6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNvbmNhdENUTSk6
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1c1JpbmcpOgorICAg
ICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvck1pc3NwZWxsaW5nT3JC
YWRHcmFtbWFyKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250
ZXh0V2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZTo6c2NhbGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlOjpyb3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0UGxhdGZv
cm1Qcml2YXRlOjp0cmFuc2xhdGUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9J
bWFnZUNHV2luLmNwcDogQ29waWVkIGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4v
SW1hZ2VXaW4uY3BwLgorICAgICAgICAoV2ViQ29yZTo6Qml0bWFwSW1hZ2U6OmdldEhCSVRNQVBP
ZlNpemUpOgorICAgICAgICAoV2ViQ29yZTo6Qml0bWFwSW1hZ2U6OmRyYXdGcmFtZU1hdGNoaW5n
U291cmNlU2l6ZSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ2Fpcm9X
aW4uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdlOjpnZXRIQklUTUFQ
T2ZTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdlOjpkcmF3RnJhbWVNYXRjaGlu
Z1NvdXJjZVNpemUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZVdpbi5j
cHA6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ0dXaW4u
Y3BwOiBDb3BpZWQgZnJvbSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250
RGF0YVdpbi5jcHAuCisgICAgICAgIChXZWJDb3JlOjpzY2FsZUVtVG9Vbml0cyk6CisgICAgICAg
IChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KToKKyAgICAgICAgKFdlYkNv
cmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybVdpZHRoRm9yR2x5cGgpOgorICAgICAgICAqIHBs
YXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNhaXJvV2luLmNwcDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KToKKyAgICAgICAg
KFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3kpOgorICAgICAgICAoV2Vi
Q29yZTo6U2ltcGxlRm9udERhdGE6OnBsYXRmb3JtV2lkdGhGb3JHbHlwaCk6CisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhV2luLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OlNpbXBsZUZvbnREYXRhOjpzZXRTaG91bGRBcHBseU1hY0FzY2VudEhhY2spOgorICAg
ICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnNob3VsZEFwcGx5TWFjQXNjZW50SGFjayk6
CisgICAgICAgICogcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNHV2luLmNwcDogQ29waWVkIGZyb20g
V2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlV2luLmNwcC4KKyAgICAgICAgKFdlYkNvcmU6
OnNjYWxlRHJhZ0ltYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OmNyZWF0ZURyYWdJbWFnZUZyb21J
bWFnZSk6CisgICAgICAgICogcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNhaXJvV2luLmNwcDogQWRk
ZWQuCisgICAgICAgIChXZWJDb3JlOjpzY2FsZURyYWdJbWFnZSk6CisgICAgICAgIChXZWJDb3Jl
OjpjcmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2UpOgorICAgICAgICAqIHBsYXRmb3JtL3dpbi9EcmFn
SW1hZ2VXaW4uY3BwOgorCiAyMDA4LTAxLTI5ICBBZGFtIFJvYmVuICA8YXJvYmVuQGFwcGxlLmNv
bT4KIAogICAgICAgICBGaXggPHJkYXI6Ly81NzExMTM2PiBGdWxsLXNjcmVlbiBGbGFzaCBvbiAx
dXAuY29tIGlzIHVucmVzcG9uc2l2ZQpJbmRleDogV2ViQ29yZS9jb25maWcuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL2NvbmZpZy5oCShyZXZpc2lvbiAyOTcyNikKKysrIFdlYkNvcmUvY29uZmln
LmgJKHdvcmtpbmcgY29weSkKQEAgLTg1LDYgKzg1LDggQEAKICNkZWZpbmUgQVZPSURfU1RBVElD
X0NPTlNUUlVDVE9SUyAxCiAjZW5kaWYKIAorI2lmIDEKKwogI2lmIFBMQVRGT1JNKFdJTikKICNk
ZWZpbmUgV1RGX1VTRV9KQVZBU0NSSVBUQ09SRV9CSU5ESU5HUyAxCiAjZGVmaW5lIFdURl9VU0Vf
TlBPQkpFQ1QgMQpAQCAtOTYsNiArOTgsMjQgQEAKICNkZWZpbmUgV1RGX1VTRV9QVEhSRUFEUyAw
CiAjZW5kaWYKIAorI2Vsc2UKKworI2lmIFBMQVRGT1JNKFdJTikKKyNkZWZpbmUgV1RGX1VTRV9K
QVZBU0NSSVBUQ09SRV9CSU5ESU5HUyAxCisjZGVmaW5lIFdURl9VU0VfTlBPQkpFQ1QgMQorI3Vu
ZGVmIFdURl9QTEFURk9STV9DRworI2RlZmluZSBXVEZfUExBVEZPUk1fQ0FJUk8gMQorLy8gI3Vu
ZGVmIFdURl9VU0VfQ0ZORVRXT1JLCisjZGVmaW5lIFdURl9VU0VfQ0ZORVRXT1JLIDEKKy8vICNk
ZWZpbmUgV1RGX1VTRV9XSU5JTkVUIDEKKyN1bmRlZiBXVEZfVVNFX1dJTklORVQKKy8vI3VuZGVm
IFdURl9QTEFURk9STV9DRgorI2RlZmluZSBXVEZfUExBVEZPUk1fQ0YgMQorI2RlZmluZSBXVEZf
VVNFX1BUSFJFQURTIDAKKyNlbmRpZgorCisjZW5kaWYKKwogI2lmIFBMQVRGT1JNKE1BQykKICNk
ZWZpbmUgV1RGX1VTRV9KQVZBU0NSSVBUQ09SRV9CSU5ESU5HUyAxCiAjaWZkZWYgX19MUDY0X18K
SW5kZXg6IFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagkocmV2aXNpb24gMjk4ODQp
CisrKyBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCSh3b3JraW5nIGNvcHkp
CkBAIC0zNDIyLDYgKzM0MjIsMTAgQEAKIAkJCQkJPg0KIAkJCQk8L0ZpbGU+DQogCQkJCTxGaWxl
DQorCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXHdpblxEcmFnSW1hZ2VDR1dpbi5jcHAi
DQorCQkJCQk+DQorCQkJCTwvRmlsZT4NCisJCQkJPEZpbGUNCiAJCQkJCVJlbGF0aXZlUGF0aD0i
Li5ccGxhdGZvcm1cd2luXEVkaXRvcldpbi5jcHAiDQogCQkJCQk+DQogCQkJCTwvRmlsZT4NCkBA
IC0zNzU3LDYgKzM3NjEsMTAgQEAKIAkJCQkJPg0KIAkJCQk8L0ZpbGU+DQogCQkJCTxGaWxlDQor
CQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXGNnXEdyYXBoaWNzQ29udGV4
dFBsYXRmb3JtUHJpdmF0ZS5oIg0KKwkJCQkJPg0KKwkJCQk8L0ZpbGU+DQorCQkJCTxGaWxlDQog
CQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXEdyYXBoaWNzQ29udGV4dC5j
cHAiDQogCQkJCQk+DQogCQkJCTwvRmlsZT4NCkBAIC0zODc2LDYgKzM4ODQsMTAgQEAKIAkJCQkJ
CT4NCiAJCQkJCTwvRmlsZT4NCiAJCQkJCTxGaWxlDQorCQkJCQkJUmVsYXRpdmVQYXRoPSIuLlxw
bGF0Zm9ybVxncmFwaGljc1x3aW5cRm9udENHV2luLmNwcCINCisJCQkJCQk+DQorCQkJCQk8L0Zp
bGU+DQorCQkJCQk8RmlsZQ0KIAkJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cZ3JhcGhp
Y3Ncd2luXEZvbnRDdXN0b21QbGF0Zm9ybURhdGEuY3BwIg0KIAkJCQkJCT4NCiAJCQkJCTwvRmls
ZT4NCkBAIC0zOTMyLDYgKzM5NDQsMTAgQEAKIAkJCQkJCT4NCiAJCQkJCTwvRmlsZT4NCiAJCQkJ
CTxGaWxlDQorCQkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1x3aW5cR3Jh
cGhpY3NDb250ZXh0Q0dXaW4uY3BwIg0KKwkJCQkJCT4NCisJCQkJCTwvRmlsZT4NCisJCQkJCTxG
aWxlDQogCQkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1x3aW5cR3JhcGhp
Y3NDb250ZXh0V2luLmNwcCINCiAJCQkJCQk+DQogCQkJCQk8L0ZpbGU+DQpAQCAtMzk0MCw2ICsz
OTU2LDEwIEBACiAJCQkJCQk+DQogCQkJCQk8L0ZpbGU+DQogCQkJCQk8RmlsZQ0KKwkJCQkJCVJl
bGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cZ3JhcGhpY3Ncd2luXEltYWdlQ0dXaW4uY3BwIg0KKwkJ
CQkJCT4NCisJCQkJCTwvRmlsZT4NCisJCQkJCTxGaWxlDQogCQkJCQkJUmVsYXRpdmVQYXRoPSIu
LlxwbGF0Zm9ybVxncmFwaGljc1x3aW5cSW1hZ2VXaW4uY3BwIg0KIAkJCQkJCT4NCiAJCQkJCTwv
RmlsZT4NCkBAIC0zOTY0LDYgKzM5ODQsMTAgQEAKIAkJCQkJCT4NCiAJCQkJCTwvRmlsZT4NCiAJ
CQkJCTxGaWxlDQorCQkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1x3aW5c
U2ltcGxlRm9udERhdGFDR1dpbi5jcHAiDQorCQkJCQkJPg0KKwkJCQkJPC9GaWxlPg0KKwkJCQkJ
PEZpbGUNCiAJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxTaW1w
bGVGb250RGF0YVdpbi5jcHAiDQogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KQEAgLTY0MDgsNiAr
NjQzMiwxMCBAQAogCQkJCU5hbWU9IndpbiINCiAJCQkJPg0KIAkJCQk8RmlsZQ0KKwkJCQkJUmVs
YXRpdmVQYXRoPSIuLlxicmlkZ2Vcd2luXEZyYW1lQ0dXaW4uY3BwIg0KKwkJCQkJPg0KKwkJCQk8
L0ZpbGU+DQorCQkJCTxGaWxlDQogCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGJyaWRnZVx3aW5cRnJh
bWVXaW4uY3BwIg0KIAkJCQkJPg0KIAkJCQk8L0ZpbGU+DQpJbmRleDogV2ViQ29yZS9icmlkZ2Uv
d2luL0ZyYW1lQ0dXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFt
ZUNHV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCShmcm9tIFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFt
ZVdpbi5jcHA6Mjk4MzQpCisrKyBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVDR1dpbi5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYs
IDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiRnJhbWVXaW4uaCIKKworI2luY2x1ZGUgPHdpbnNvY2syLmg+
CisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCisj
aW5jbHVkZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJF
ZGl0b3JDbGllbnQuaCIKKyNpbmNsdWRlICJGcmFtZUxvYWRlci5oIgorI2luY2x1ZGUgIkZyYW1l
TG9hZFJlcXVlc3QuaCIKKyNpbmNsdWRlICJGcmFtZVByaXZhdGUuaCIKKyNpbmNsdWRlICJGcmFt
ZVZpZXcuaCIKKyNpbmNsdWRlICJIVE1MSUZyYW1lRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxO
YW1lcy5oIgorI2luY2x1ZGUgIkhUTUxUYWJsZUNlbGxFbGVtZW50LmgiCisjaW5jbHVkZSAiS2V5
Ym9hcmRFdmVudC5oIgorI2luY2x1ZGUgIk5QX2pzb2JqZWN0LmgiCisjaW5jbHVkZSAiTm90SW1w
bGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAiUGx1Z2luLmgiCisjaW5j
bHVkZSAiUGx1Z2luRGF0YWJhc2VXaW4uaCIKKyNpbmNsdWRlICJQbHVnaW5WaWV3V2luLmgiCisj
aW5jbHVkZSAiUmVndWxhckV4cHJlc3Npb24uaCIKKyNpbmNsdWRlICJSZW5kZXJGcmFtZS5oIgor
I2luY2x1ZGUgIlJlbmRlclRhYmxlQ2VsbC5oIgorI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKKyNp
bmNsdWRlICJSZXNvdXJjZUhhbmRsZS5oIgorI2luY2x1ZGUgIlRleHRSZXNvdXJjZURlY29kZXIu
aCIKKyNpbmNsdWRlICJranNfcHJveHkuaCIKKyNpbmNsdWRlICJranNfd2luZG93LmgiCisjaW5j
bHVkZSAibnBydW50aW1lX2ltcGwuaCIKKyNpbmNsdWRlICJydW50aW1lX3Jvb3QuaCIKKyNpbmNs
dWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJTZXR0aW5ncy5oIgorCisjaWYgUExB
VEZPUk0oQ0cpCisjaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NvcmVHcmFwaGljcy5oPgorI2VuZGlm
CisKK3VzaW5nIHN0ZDo6bWluOwordXNpbmcgbmFtZXNwYWNlIEtKUzo6QmluZGluZ3M7CisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKwordXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKKwordm9pZCBG
cmFtZTo6Y2xlYXJQbGF0Zm9ybVNjcmlwdE9iamVjdHMoKQoreworfQorCitLSlM6OkJpbmRpbmdz
OjpJbnN0YW5jZSogRnJhbWU6OmNyZWF0ZVNjcmlwdEluc3RhbmNlRm9yV2lkZ2V0KFdpZGdldCog
d2lkZ2V0KQoreworICAgIC8vIEZJWE1FOiBJZGVhbGx5IHdlJ2QgaGF2ZSBhbiBpc1BsdWdpblZp
ZXcoKSBoZXJlIGJ1dCB3ZSBjYW4ndCBhZGQgdGhhdCB0byB0aGUgb3BlbiBzb3VyY2UgdHJlZSBy
aWdodCBub3cuCisgICAgaWYgKHdpZGdldC0+aXNGcmFtZVZpZXcoKSkKKyAgICAgICAgcmV0dXJu
IDA7CisKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UGx1Z2luVmlld1dpbio+KHdpZGdldCktPmJp
bmRpbmdJbnN0YW5jZSgpOworfQorCisKK3ZvaWQgY29tcHV0ZVBhZ2VSZWN0c0ZvckZyYW1lKEZy
YW1lKiBmcmFtZSwgY29uc3QgSW50UmVjdCYgcHJpbnRSZWN0LCBmbG9hdCBoZWFkZXJIZWlnaHQs
IGZsb2F0IGZvb3RlckhlaWdodCwgZmxvYXQgdXNlclNjYWxlRmFjdG9yLFZlY3RvcjxJbnRSZWN0
PiYgcGFnZXMsIGludCYgb3V0UGFnZUhlaWdodCkKK3sKKyAgICBBU1NFUlQoZnJhbWUpOworCisg
ICAgcGFnZXMuY2xlYXIoKTsKKyAgICBvdXRQYWdlSGVpZ2h0ID0gMDsKKworICAgIGlmICghZnJh
bWUtPmRvY3VtZW50KCkgfHwgIWZyYW1lLT52aWV3KCkgfHwgIWZyYW1lLT5kb2N1bWVudCgpLT5y
ZW5kZXJlcigpKQorICAgICAgICByZXR1cm47CisgCisgICAgUmVuZGVyVmlldyogcm9vdCA9IHN0
YXRpY19jYXN0PFJlbmRlclZpZXcgKj4oZnJhbWUtPmRvY3VtZW50KCktPnJlbmRlcmVyKCkpOwor
CisgICAgaWYgKCFyb290KSB7CisgICAgICAgIExPR19FUlJPUigiZG9jdW1lbnQgdG8gYmUgcHJp
bnRlZCBoYXMgbm8gcmVuZGVyZXIiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlm
ICh1c2VyU2NhbGVGYWN0b3IgPD0gMCkgeworICAgICAgICBMT0dfRVJST1IoInVzZXJTY2FsZUZh
Y3RvciBoYXMgYmFkIHZhbHVlICUuMmYiLCB1c2VyU2NhbGVGYWN0b3IpOworICAgICAgICByZXR1
cm47CisgICAgfQorICAgIAorICAgIGZsb2F0IHJhdGlvID0gKGZsb2F0KXByaW50UmVjdC5oZWln
aHQoKSAvIChmbG9hdClwcmludFJlY3Qud2lkdGgoKTsKKyAKKyAgICBmbG9hdCBwYWdlV2lkdGgg
ID0gKGZsb2F0KSByb290LT5kb2NXaWR0aCgpOworICAgIGZsb2F0IHBhZ2VIZWlnaHQgPSBwYWdl
V2lkdGggKiByYXRpbzsKKyAgICBvdXRQYWdlSGVpZ2h0ID0gKGludCkgcGFnZUhlaWdodDsgICAv
LyB0aGlzIGlzIHRoZSBoZWlnaHQgb2YgdGhlIHBhZ2UgYWRqdXN0ZWQgYnkgbWFyZ2lucworICAg
IHBhZ2VIZWlnaHQgLT0gKGhlYWRlckhlaWdodCArIGZvb3RlckhlaWdodCk7CisKKyAgICBpZiAo
cGFnZUhlaWdodCA8PSAwKSB7CisgICAgICAgIExPR19FUlJPUigicGFnZUhlaWdodCBoYXMgYmFk
IHZhbHVlICUuMmYiLCBwYWdlSGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IGZsb2F0IGN1cnJQYWdlSGVpZ2h0ID0gcGFnZUhlaWdodCAvIHVzZXJTY2FsZUZhY3RvcjsKKyAg
ICBmbG9hdCBkb2NIZWlnaHQgICAgICA9IHJvb3QtPmxheWVyKCktPmhlaWdodCgpOworICAgIGZs
b2F0IGRvY1dpZHRoICAgICAgID0gcm9vdC0+bGF5ZXIoKS0+d2lkdGgoKTsKKyAgICBmbG9hdCBj
dXJyUGFnZVdpZHRoICA9IHBhZ2VXaWR0aCAvIHVzZXJTY2FsZUZhY3RvcjsKKworICAgIAorICAg
IC8vIGFsd2F5cyByZXR1cm4gYXQgbGVhc3Qgb25lIHBhZ2UsIHNpbmNlIGVtcHR5IGZpbGVzIHNo
b3VsZCBwcmludCBhIGJsYW5rIHBhZ2UKKyAgICBmbG9hdCBwcmludGVkUGFnZXNIZWlnaHQgPSAw
LjA7CisgICAgZG8geworICAgICAgICBmbG9hdCBwcm9wb3NlZEJvdHRvbSA9IG1pbihkb2NIZWln
aHQsIHByaW50ZWRQYWdlc0hlaWdodCArIHBhZ2VIZWlnaHQpOworICAgICAgICBmcmFtZS0+YWRq
dXN0UGFnZUhlaWdodCgmcHJvcG9zZWRCb3R0b20sIHByaW50ZWRQYWdlc0hlaWdodCwgcHJvcG9z
ZWRCb3R0b20sIHByaW50ZWRQYWdlc0hlaWdodCk7CisgICAgICAgIGN1cnJQYWdlSGVpZ2h0ID0g
bWF4KDEuMGYsIHByb3Bvc2VkQm90dG9tIC0gcHJpbnRlZFBhZ2VzSGVpZ2h0KTsKKyAgICAgICAK
KyAgICAgICAgcGFnZXMuYXBwZW5kKEludFJlY3QoMCxwcmludGVkUGFnZXNIZWlnaHQsY3VyclBh
Z2VXaWR0aCxjdXJyUGFnZUhlaWdodCkpOworICAgICAgICBwcmludGVkUGFnZXNIZWlnaHQgKz0g
Y3VyclBhZ2VIZWlnaHQ7CisgICAgfSB3aGlsZSAocHJpbnRlZFBhZ2VzSGVpZ2h0IDwgZG9jSGVp
Z2h0KTsKK30KKworc3RhdGljIHZvaWQgZHJhd1JlY3RJbnRvQ29udGV4dChJbnRSZWN0IHJlY3Qs
IEZyYW1lVmlldyogdmlldywgR3JhcGhpY3NDb250ZXh0KiBnYykKK3sKKyAgICBJbnRTaXplIG9m
ZnNldCA9IHZpZXctPnNjcm9sbE9mZnNldCgpOworICAgIHJlY3QubW92ZSgtb2Zmc2V0LndpZHRo
KCksIC1vZmZzZXQuaGVpZ2h0KCkpOworICAgIHJlY3QgPSB2aWV3LT5jb252ZXJ0VG9Db250YWlu
aW5nV2luZG93KHJlY3QpOworCisgICAgZ2MtPmNvbmNhdENUTShBZmZpbmVUcmFuc2Zvcm0oKS50
cmFuc2xhdGUoLXJlY3QueCgpLCAtcmVjdC55KCkpKTsKKworICAgIHZpZXctPnBhaW50KGdjLCBy
ZWN0KTsKK30KKworSEJJVE1BUCBpbWFnZUZyb21TZWxlY3Rpb24oRnJhbWUqIGZyYW1lLCBib29s
IGZvcmNlQmxhY2tUZXh0KQoreworICAgIGZyYW1lLT5zZXRQYWludFJlc3RyaWN0aW9uKGZvcmNl
QmxhY2tUZXh0ID8gUGFpbnRSZXN0cmljdGlvblNlbGVjdGlvbk9ubHlCbGFja1RleHQgOiBQYWlu
dFJlc3RyaWN0aW9uU2VsZWN0aW9uT25seSk7CisgICAgRmxvYXRSZWN0IGZyID0gZnJhbWUtPnNl
bGVjdGlvblJlY3QoKTsKKyAgICBJbnRSZWN0IGlyKChpbnQpZnIueCgpLCAoaW50KWZyLnkoKSwo
aW50KWZyLndpZHRoKCksKGludClmci5oZWlnaHQoKSk7CisKKyAgICB2b2lkKiBiaXRzOworICAg
IEhEQyBoZGMgPSBDcmVhdGVDb21wYXRpYmxlREMoMCk7CisgICAgaW50IHcgPSBpci53aWR0aCgp
OworICAgIGludCBoID0gaXIuaGVpZ2h0KCk7CisgICAgQklUTUFQSU5GTyBibXAgPSB7IHsgc2l6
ZW9mKEJJVE1BUElORk9IRUFERVIpLCB3LCBoLCAxLCAzMiB9IH07CisKKyAgICBIQklUTUFQIGhi
bXAgPSBDcmVhdGVESUJTZWN0aW9uKDAsICZibXAsIERJQl9SR0JfQ09MT1JTLCAodm9pZCoqKSZi
aXRzLCAwLCAwKTsKKyAgICBIQklUTUFQIGhibXBPbGQgPSAoSEJJVE1BUClTZWxlY3RPYmplY3Qo
aGRjLCBoYm1wKTsKKyAgICBDR0NvbG9yU3BhY2VSZWYgZGV2aWNlUkdCID0gQ0dDb2xvclNwYWNl
Q3JlYXRlRGV2aWNlUkdCKCk7CisgICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBDR0JpdG1hcENv
bnRleHRDcmVhdGUoKHZvaWQqKWJpdHMsIHcsIGgsCisgICAgICAgIDgsIHcgKiBzaXplb2YoUkdC
UVVBRCksIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFs
cGhhUHJlbXVsdGlwbGllZEZpcnN0KTsKKyAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKGRldmljZVJH
Qik7CisgICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShjb250ZXh0KTsKKworICAgIEdyYXBoaWNzQ29u
dGV4dCBnYyhjb250ZXh0KTsKKworICAgIGZyYW1lLT5kb2N1bWVudCgpLT51cGRhdGVMYXlvdXQo
KTsKKyAgICBkcmF3UmVjdEludG9Db250ZXh0KGlyLCBmcmFtZS0+dmlldygpLCAmZ2MpOworCisg
ICAgQ0dDb250ZXh0UmVsZWFzZShjb250ZXh0KTsKKyAgICBTZWxlY3RPYmplY3QoaGRjLCBoYm1w
T2xkKTsKKyAgICBEZWxldGVEQyhoZGMpOworCisgICAgZnJhbWUtPnNldFBhaW50UmVzdHJpY3Rp
b24oUGFpbnRSZXN0cmljdGlvbk5vbmUpOworCisgICAgcmV0dXJuIGhibXA7Cit9CisKK0RyYWdJ
bWFnZVJlZiBGcmFtZTo6ZHJhZ0ltYWdlRm9yU2VsZWN0aW9uKCkKK3sgICAgCisgICAgaWYgKHNl
bGVjdGlvbkNvbnRyb2xsZXIoKS0+aXNSYW5nZSgpKQorICAgICAgICByZXR1cm4gaW1hZ2VGcm9t
U2VsZWN0aW9uKHRoaXMsIGZhbHNlKTsKKworICAgIHJldHVybiAwOworfQorCit2b2lkIEZyYW1l
OjpkYXNoYm9hcmRSZWdpb25zQ2hhbmdlZCgpCit7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKSW5kZXg6IFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZUNHV2luLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVDR1dpbi5jcHAJKHJldmlzaW9uIDI5NzI2KQorKysg
V2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lQ0dXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUg
KzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CkBAIC0yNiwxMTcgKzI2LDE4IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiRnJh
bWVXaW4uaCIKIAotI2luY2x1ZGUgPHdpbnNvY2syLmg+CiAjaW5jbHVkZSA8d2luZG93cy5oPgog
Ci0jaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCi0jaW5jbHVkZSAiRmxvYXRSZWN0LmgiCi0j
aW5jbHVkZSAiRG9jdW1lbnQuaCIKLSNpbmNsdWRlICJFZGl0b3JDbGllbnQuaCIKLSNpbmNsdWRl
ICJGcmFtZUxvYWRlci5oIgotI2luY2x1ZGUgIkZyYW1lTG9hZFJlcXVlc3QuaCIKLSNpbmNsdWRl
ICJGcmFtZVByaXZhdGUuaCIKICNpbmNsdWRlICJGcmFtZVZpZXcuaCIKLSNpbmNsdWRlICJIVE1M
SUZyYW1lRWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgotI2luY2x1ZGUgIkhUTUxU
YWJsZUNlbGxFbGVtZW50LmgiCi0jaW5jbHVkZSAiS2V5Ym9hcmRFdmVudC5oIgotI2luY2x1ZGUg
Ik5QX2pzb2JqZWN0LmgiCi0jaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKLSNpbmNsdWRlICJQ
YWdlLmgiCi0jaW5jbHVkZSAiUGx1Z2luLmgiCi0jaW5jbHVkZSAiUGx1Z2luRGF0YWJhc2VXaW4u
aCIKLSNpbmNsdWRlICJQbHVnaW5WaWV3V2luLmgiCi0jaW5jbHVkZSAiUmVndWxhckV4cHJlc3Np
b24uaCIKLSNpbmNsdWRlICJSZW5kZXJGcmFtZS5oIgotI2luY2x1ZGUgIlJlbmRlclRhYmxlQ2Vs
bC5oIgotI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKLSNpbmNsdWRlICJSZXNvdXJjZUhhbmRsZS5o
IgotI2luY2x1ZGUgIlRleHRSZXNvdXJjZURlY29kZXIuaCIKLSNpbmNsdWRlICJranNfcHJveHku
aCIKLSNpbmNsdWRlICJranNfd2luZG93LmgiCi0jaW5jbHVkZSAibnBydW50aW1lX2ltcGwuaCIK
LSNpbmNsdWRlICJydW50aW1lX3Jvb3QuaCIKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIK
ICNpbmNsdWRlICJTZXR0aW5ncy5oIgogCi0jaWYgUExBVEZPUk0oQ0cpCiAjaW5jbHVkZSA8Q29y
ZUdyYXBoaWNzL0NvcmVHcmFwaGljcy5oPgotI2VuZGlmCiAKIHVzaW5nIHN0ZDo6bWluOwotdXNp
bmcgbmFtZXNwYWNlIEtKUzo6QmluZGluZ3M7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotdXNp
bmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKLQotdm9pZCBGcmFtZTo6Y2xlYXJQbGF0Zm9ybVNjcmlw
dE9iamVjdHMoKQotewotfQotCi1LSlM6OkJpbmRpbmdzOjpJbnN0YW5jZSogRnJhbWU6OmNyZWF0
ZVNjcmlwdEluc3RhbmNlRm9yV2lkZ2V0KFdpZGdldCogd2lkZ2V0KQotewotICAgIC8vIEZJWE1F
OiBJZGVhbGx5IHdlJ2QgaGF2ZSBhbiBpc1BsdWdpblZpZXcoKSBoZXJlIGJ1dCB3ZSBjYW4ndCBh
ZGQgdGhhdCB0byB0aGUgb3BlbiBzb3VyY2UgdHJlZSByaWdodCBub3cuCi0gICAgaWYgKHdpZGdl
dC0+aXNGcmFtZVZpZXcoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gc3RhdGlj
X2Nhc3Q8UGx1Z2luVmlld1dpbio+KHdpZGdldCktPmJpbmRpbmdJbnN0YW5jZSgpOwotfQotCi0K
LXZvaWQgY29tcHV0ZVBhZ2VSZWN0c0ZvckZyYW1lKEZyYW1lKiBmcmFtZSwgY29uc3QgSW50UmVj
dCYgcHJpbnRSZWN0LCBmbG9hdCBoZWFkZXJIZWlnaHQsIGZsb2F0IGZvb3RlckhlaWdodCwgZmxv
YXQgdXNlclNjYWxlRmFjdG9yLFZlY3RvcjxJbnRSZWN0PiYgcGFnZXMsIGludCYgb3V0UGFnZUhl
aWdodCkKLXsKLSAgICBBU1NFUlQoZnJhbWUpOwotCi0gICAgcGFnZXMuY2xlYXIoKTsKLSAgICBv
dXRQYWdlSGVpZ2h0ID0gMDsKLQotICAgIGlmICghZnJhbWUtPmRvY3VtZW50KCkgfHwgIWZyYW1l
LT52aWV3KCkgfHwgIWZyYW1lLT5kb2N1bWVudCgpLT5yZW5kZXJlcigpKQotICAgICAgICByZXR1
cm47Ci0gCi0gICAgUmVuZGVyVmlldyogcm9vdCA9IHN0YXRpY19jYXN0PFJlbmRlclZpZXcgKj4o
ZnJhbWUtPmRvY3VtZW50KCktPnJlbmRlcmVyKCkpOwotCi0gICAgaWYgKCFyb290KSB7Ci0gICAg
ICAgIExPR19FUlJPUigiZG9jdW1lbnQgdG8gYmUgcHJpbnRlZCBoYXMgbm8gcmVuZGVyZXIiKTsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICh1c2VyU2NhbGVGYWN0b3IgPD0gMCkg
ewotICAgICAgICBMT0dfRVJST1IoInVzZXJTY2FsZUZhY3RvciBoYXMgYmFkIHZhbHVlICUuMmYi
LCB1c2VyU2NhbGVGYWN0b3IpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIGZs
b2F0IHJhdGlvID0gKGZsb2F0KXByaW50UmVjdC5oZWlnaHQoKSAvIChmbG9hdClwcmludFJlY3Qu
d2lkdGgoKTsKLSAKLSAgICBmbG9hdCBwYWdlV2lkdGggID0gKGZsb2F0KSByb290LT5kb2NXaWR0
aCgpOwotICAgIGZsb2F0IHBhZ2VIZWlnaHQgPSBwYWdlV2lkdGggKiByYXRpbzsKLSAgICBvdXRQ
YWdlSGVpZ2h0ID0gKGludCkgcGFnZUhlaWdodDsgICAvLyB0aGlzIGlzIHRoZSBoZWlnaHQgb2Yg
dGhlIHBhZ2UgYWRqdXN0ZWQgYnkgbWFyZ2lucwotICAgIHBhZ2VIZWlnaHQgLT0gKGhlYWRlckhl
aWdodCArIGZvb3RlckhlaWdodCk7Ci0KLSAgICBpZiAocGFnZUhlaWdodCA8PSAwKSB7Ci0gICAg
ICAgIExPR19FUlJPUigicGFnZUhlaWdodCBoYXMgYmFkIHZhbHVlICUuMmYiLCBwYWdlSGVpZ2h0
KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZsb2F0IGN1cnJQYWdlSGVpZ2h0ID0g
cGFnZUhlaWdodCAvIHVzZXJTY2FsZUZhY3RvcjsKLSAgICBmbG9hdCBkb2NIZWlnaHQgICAgICA9
IHJvb3QtPmxheWVyKCktPmhlaWdodCgpOwotICAgIGZsb2F0IGRvY1dpZHRoICAgICAgID0gcm9v
dC0+bGF5ZXIoKS0+d2lkdGgoKTsKLSAgICBmbG9hdCBjdXJyUGFnZVdpZHRoICA9IHBhZ2VXaWR0
aCAvIHVzZXJTY2FsZUZhY3RvcjsKLQotICAgIAotICAgIC8vIGFsd2F5cyByZXR1cm4gYXQgbGVh
c3Qgb25lIHBhZ2UsIHNpbmNlIGVtcHR5IGZpbGVzIHNob3VsZCBwcmludCBhIGJsYW5rIHBhZ2UK
LSAgICBmbG9hdCBwcmludGVkUGFnZXNIZWlnaHQgPSAwLjA7Ci0gICAgZG8gewotICAgICAgICBm
bG9hdCBwcm9wb3NlZEJvdHRvbSA9IG1pbihkb2NIZWlnaHQsIHByaW50ZWRQYWdlc0hlaWdodCAr
IHBhZ2VIZWlnaHQpOwotICAgICAgICBmcmFtZS0+YWRqdXN0UGFnZUhlaWdodCgmcHJvcG9zZWRC
b3R0b20sIHByaW50ZWRQYWdlc0hlaWdodCwgcHJvcG9zZWRCb3R0b20sIHByaW50ZWRQYWdlc0hl
aWdodCk7Ci0gICAgICAgIGN1cnJQYWdlSGVpZ2h0ID0gbWF4KDEuMGYsIHByb3Bvc2VkQm90dG9t
IC0gcHJpbnRlZFBhZ2VzSGVpZ2h0KTsKLSAgICAgICAKLSAgICAgICAgcGFnZXMuYXBwZW5kKElu
dFJlY3QoMCxwcmludGVkUGFnZXNIZWlnaHQsY3VyclBhZ2VXaWR0aCxjdXJyUGFnZUhlaWdodCkp
OwotICAgICAgICBwcmludGVkUGFnZXNIZWlnaHQgKz0gY3VyclBhZ2VIZWlnaHQ7Ci0gICAgfSB3
aGlsZSAocHJpbnRlZFBhZ2VzSGVpZ2h0IDwgZG9jSGVpZ2h0KTsKLX0KLQogc3RhdGljIHZvaWQg
ZHJhd1JlY3RJbnRvQ29udGV4dChJbnRSZWN0IHJlY3QsIEZyYW1lVmlldyogdmlldywgR3JhcGhp
Y3NDb250ZXh0KiBnYykKIHsKICAgICBJbnRTaXplIG9mZnNldCA9IHZpZXctPnNjcm9sbE9mZnNl
dCgpOwpAQCAtMTUyLDcgKzUzLDggQEAgSEJJVE1BUCBpbWFnZUZyb21TZWxlY3Rpb24oRnJhbWUq
IGZyYW1lLAogewogICAgIGZyYW1lLT5zZXRQYWludFJlc3RyaWN0aW9uKGZvcmNlQmxhY2tUZXh0
ID8gUGFpbnRSZXN0cmljdGlvblNlbGVjdGlvbk9ubHlCbGFja1RleHQgOiBQYWludFJlc3RyaWN0
aW9uU2VsZWN0aW9uT25seSk7CiAgICAgRmxvYXRSZWN0IGZyID0gZnJhbWUtPnNlbGVjdGlvblJl
Y3QoKTsKLSAgICBJbnRSZWN0IGlyKChpbnQpZnIueCgpLCAoaW50KWZyLnkoKSwoaW50KWZyLndp
ZHRoKCksKGludClmci5oZWlnaHQoKSk7CisgICAgSW50UmVjdCBpcihzdGF0aWNfY2FzdDxpbnQ+
KGZyLngoKSksIHN0YXRpY19jYXN0PGludD4oZnIueSgpKSwKKyAgICAgICAgICAgICAgIHN0YXRp
Y19jYXN0PGludD4oZnIud2lkdGgoKSksIHN0YXRpY19jYXN0PGludD4oZnIuaGVpZ2h0KCkpKTsK
IAogICAgIHZvaWQqIGJpdHM7CiAgICAgSERDIGhkYyA9IENyZWF0ZUNvbXBhdGlibGVEQygwKTsK
QEAgLTE2MCwxMCArNjIsMTAgQEAgSEJJVE1BUCBpbWFnZUZyb21TZWxlY3Rpb24oRnJhbWUqIGZy
YW1lLAogICAgIGludCBoID0gaXIuaGVpZ2h0KCk7CiAgICAgQklUTUFQSU5GTyBibXAgPSB7IHsg
c2l6ZW9mKEJJVE1BUElORk9IRUFERVIpLCB3LCBoLCAxLCAzMiB9IH07CiAKLSAgICBIQklUTUFQ
IGhibXAgPSBDcmVhdGVESUJTZWN0aW9uKDAsICZibXAsIERJQl9SR0JfQ09MT1JTLCAodm9pZCoq
KSZiaXRzLCAwLCAwKTsKLSAgICBIQklUTUFQIGhibXBPbGQgPSAoSEJJVE1BUClTZWxlY3RPYmpl
Y3QoaGRjLCBoYm1wKTsKKyAgICBIQklUTUFQIGhibXAgPSBDcmVhdGVESUJTZWN0aW9uKDAsICZi
bXAsIERJQl9SR0JfQ09MT1JTLCBzdGF0aWNfY2FzdDx2b2lkKio+KCZiaXRzKSwgMCwgMCk7Cisg
ICAgSEJJVE1BUCBoYm1wT2xkID0gc3RhdGljX2Nhc3Q8SEJJVE1BUD4oU2VsZWN0T2JqZWN0KGhk
YywgaGJtcCkpOwogICAgIENHQ29sb3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VD
cmVhdGVEZXZpY2VSR0IoKTsKLSAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IENHQml0bWFwQ29u
dGV4dENyZWF0ZSgodm9pZCopYml0cywgdywgaCwKKyAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9
IENHQml0bWFwQ29udGV4dENyZWF0ZShzdGF0aWNfY2FzdDx2b2lkKj4oYml0cyksIHcsIGgsCiAg
ICAgICAgIDgsIHcgKiBzaXplb2YoUkdCUVVBRCksIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9y
ZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhhUHJlbXVsdGlwbGllZEZpcnN0KTsKICAgICBDR0Nv
bG9yU3BhY2VSZWxlYXNlKGRldmljZVJHQik7CiAgICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShjb250
ZXh0KTsKQEAgLTE4MiwxNiArODQsNCBAQCBIQklUTUFQIGltYWdlRnJvbVNlbGVjdGlvbihGcmFt
ZSogZnJhbWUsCiAgICAgcmV0dXJuIGhibXA7CiB9CiAKLURyYWdJbWFnZVJlZiBGcmFtZTo6ZHJh
Z0ltYWdlRm9yU2VsZWN0aW9uKCkKLXsgICAgCi0gICAgaWYgKHNlbGVjdGlvbkNvbnRyb2xsZXIo
KS0+aXNSYW5nZSgpKQotICAgICAgICByZXR1cm4gaW1hZ2VGcm9tU2VsZWN0aW9uKHRoaXMsIGZh
bHNlKTsKLQotICAgIHJldHVybiAwOwotfQotCi12b2lkIEZyYW1lOjpkYXNoYm9hcmRSZWdpb25z
Q2hhbmdlZCgpCi17Ci19Ci0KIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUv
YnJpZGdlL3dpbi9GcmFtZUNhaXJvV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JyaWRn
ZS93aW4vRnJhbWVDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL2JyaWRnZS93
aW4vRnJhbWVDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIs
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRnJhbWVXaW4uaCIKKworI2luY2x1
ZGUgIkVkaXRvckNsaWVudC5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisKK3VzaW5n
IHN0ZDo6bWluOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0hCSVRNQVAgaW1hZ2VGcm9tU2Vs
ZWN0aW9uKEZyYW1lKiBmcmFtZSwgYm9vbCBmb3JjZUJsYWNrVGV4dCkKK3sKKyAgICBub3RJbXBs
ZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCklu
ZGV4OiBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvYnJpZGdlL3dpbi9GcmFtZVdpbi5jcHAJKHJldmlzaW9uIDI5ODM0KQorKysgV2ViQ29yZS9i
cmlkZ2Uvd2luL0ZyYW1lV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8q
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtNjAsMTAg
KzYwLDYgQEAKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNpbmNsdWRlICJTZXR0aW5n
cy5oIgogCi0jaWYgUExBVEZPUk0oQ0cpCi0jaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NvcmVHcmFw
aGljcy5oPgotI2VuZGlmCi0KIHVzaW5nIHN0ZDo6bWluOwogdXNpbmcgbmFtZXNwYWNlIEtKUzo6
QmluZGluZ3M7CiAKQEAgLTg0LDcgKzgwLDYgQEAgS0pTOjpCaW5kaW5nczo6SW5zdGFuY2UqIEZy
YW1lOjpjcmVhdGVTYwogICAgIHJldHVybiBzdGF0aWNfY2FzdDxQbHVnaW5WaWV3V2luKj4od2lk
Z2V0KS0+YmluZGluZ0luc3RhbmNlKCk7CiB9CiAKLQogdm9pZCBjb21wdXRlUGFnZVJlY3RzRm9y
RnJhbWUoRnJhbWUqIGZyYW1lLCBjb25zdCBJbnRSZWN0JiBwcmludFJlY3QsIGZsb2F0IGhlYWRl
ckhlaWdodCwgZmxvYXQgZm9vdGVySGVpZ2h0LCBmbG9hdCB1c2VyU2NhbGVGYWN0b3IsVmVjdG9y
PEludFJlY3Q+JiBwYWdlcywgaW50JiBvdXRQYWdlSGVpZ2h0KQogewogICAgIEFTU0VSVChmcmFt
ZSk7CkBAIC0xMDcsMTEgKzEwMiwxMSBAQCB2b2lkIGNvbXB1dGVQYWdlUmVjdHNGb3JGcmFtZShG
cmFtZSogZnJhCiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgCi0gICAgZmxvYXQgcmF0aW8g
PSAoZmxvYXQpcHJpbnRSZWN0LmhlaWdodCgpIC8gKGZsb2F0KXByaW50UmVjdC53aWR0aCgpOwor
ICAgIGZsb2F0IHJhdGlvID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHByaW50UmVjdC5oZWlnaHQoKSkg
LyBzdGF0aWNfY2FzdDxmbG9hdD4ocHJpbnRSZWN0LndpZHRoKCkpOwogIAotICAgIGZsb2F0IHBh
Z2VXaWR0aCAgPSAoZmxvYXQpIHJvb3QtPmRvY1dpZHRoKCk7CisgICAgZmxvYXQgcGFnZVdpZHRo
ICA9IHN0YXRpY19jYXN0PGZsb2F0Pihyb290LT5kb2NXaWR0aCgpKTsKICAgICBmbG9hdCBwYWdl
SGVpZ2h0ID0gcGFnZVdpZHRoICogcmF0aW87Ci0gICAgb3V0UGFnZUhlaWdodCA9IChpbnQpIHBh
Z2VIZWlnaHQ7ICAgLy8gdGhpcyBpcyB0aGUgaGVpZ2h0IG9mIHRoZSBwYWdlIGFkanVzdGVkIGJ5
IG1hcmdpbnMKKyAgICBvdXRQYWdlSGVpZ2h0ID0gc3RhdGljX2Nhc3Q8aW50PihwYWdlSGVpZ2h0
KTsgICAvLyB0aGlzIGlzIHRoZSBoZWlnaHQgb2YgdGhlIHBhZ2UgYWRqdXN0ZWQgYnkgbWFyZ2lu
cwogICAgIHBhZ2VIZWlnaHQgLT0gKGhlYWRlckhlaWdodCArIGZvb3RlckhlaWdodCk7CiAKICAg
ICBpZiAocGFnZUhlaWdodCA8PSAwKSB7CkBAIC0xMjYsNjIgKzEyMSwxNyBAQCB2b2lkIGNvbXB1
dGVQYWdlUmVjdHNGb3JGcmFtZShGcmFtZSogZnJhCiAKICAgICAKICAgICAvLyBhbHdheXMgcmV0
dXJuIGF0IGxlYXN0IG9uZSBwYWdlLCBzaW5jZSBlbXB0eSBmaWxlcyBzaG91bGQgcHJpbnQgYSBi
bGFuayBwYWdlCi0gICAgZmxvYXQgcHJpbnRlZFBhZ2VzSGVpZ2h0ID0gMC4wOworICAgIGZsb2F0
IHByaW50ZWRQYWdlc0hlaWdodCA9IDAuMGY7CiAgICAgZG8gewogICAgICAgICBmbG9hdCBwcm9w
b3NlZEJvdHRvbSA9IG1pbihkb2NIZWlnaHQsIHByaW50ZWRQYWdlc0hlaWdodCArIHBhZ2VIZWln
aHQpOwogICAgICAgICBmcmFtZS0+YWRqdXN0UGFnZUhlaWdodCgmcHJvcG9zZWRCb3R0b20sIHBy
aW50ZWRQYWdlc0hlaWdodCwgcHJvcG9zZWRCb3R0b20sIHByaW50ZWRQYWdlc0hlaWdodCk7CiAg
ICAgICAgIGN1cnJQYWdlSGVpZ2h0ID0gbWF4KDEuMGYsIHByb3Bvc2VkQm90dG9tIC0gcHJpbnRl
ZFBhZ2VzSGVpZ2h0KTsKICAgICAgICAKLSAgICAgICAgcGFnZXMuYXBwZW5kKEludFJlY3QoMCxw
cmludGVkUGFnZXNIZWlnaHQsY3VyclBhZ2VXaWR0aCxjdXJyUGFnZUhlaWdodCkpOworICAgICAg
ICBwYWdlcy5hcHBlbmQoSW50UmVjdCgwLCBwcmludGVkUGFnZXNIZWlnaHQsIGN1cnJQYWdlV2lk
dGgsIGN1cnJQYWdlSGVpZ2h0KSk7CiAgICAgICAgIHByaW50ZWRQYWdlc0hlaWdodCArPSBjdXJy
UGFnZUhlaWdodDsKICAgICB9IHdoaWxlIChwcmludGVkUGFnZXNIZWlnaHQgPCBkb2NIZWlnaHQp
OwogfQogCi1zdGF0aWMgdm9pZCBkcmF3UmVjdEludG9Db250ZXh0KEludFJlY3QgcmVjdCwgRnJh
bWVWaWV3KiB2aWV3LCBHcmFwaGljc0NvbnRleHQqIGdjKQotewotICAgIEludFNpemUgb2Zmc2V0
ID0gdmlldy0+c2Nyb2xsT2Zmc2V0KCk7Ci0gICAgcmVjdC5tb3ZlKC1vZmZzZXQud2lkdGgoKSwg
LW9mZnNldC5oZWlnaHQoKSk7Ci0gICAgcmVjdCA9IHZpZXctPmNvbnZlcnRUb0NvbnRhaW5pbmdX
aW5kb3cocmVjdCk7Ci0KLSAgICBnYy0+Y29uY2F0Q1RNKEFmZmluZVRyYW5zZm9ybSgpLnRyYW5z
bGF0ZSgtcmVjdC54KCksIC1yZWN0LnkoKSkpOwotCi0gICAgdmlldy0+cGFpbnQoZ2MsIHJlY3Qp
OwotfQotCi1IQklUTUFQIGltYWdlRnJvbVNlbGVjdGlvbihGcmFtZSogZnJhbWUsIGJvb2wgZm9y
Y2VCbGFja1RleHQpCi17Ci0gICAgZnJhbWUtPnNldFBhaW50UmVzdHJpY3Rpb24oZm9yY2VCbGFj
a1RleHQgPyBQYWludFJlc3RyaWN0aW9uU2VsZWN0aW9uT25seUJsYWNrVGV4dCA6IFBhaW50UmVz
dHJpY3Rpb25TZWxlY3Rpb25Pbmx5KTsKLSAgICBGbG9hdFJlY3QgZnIgPSBmcmFtZS0+c2VsZWN0
aW9uUmVjdCgpOwotICAgIEludFJlY3QgaXIoKGludClmci54KCksIChpbnQpZnIueSgpLChpbnQp
ZnIud2lkdGgoKSwoaW50KWZyLmhlaWdodCgpKTsKLQotICAgIHZvaWQqIGJpdHM7Ci0gICAgSERD
IGhkYyA9IENyZWF0ZUNvbXBhdGlibGVEQygwKTsKLSAgICBpbnQgdyA9IGlyLndpZHRoKCk7Ci0g
ICAgaW50IGggPSBpci5oZWlnaHQoKTsKLSAgICBCSVRNQVBJTkZPIGJtcCA9IHsgeyBzaXplb2Yo
QklUTUFQSU5GT0hFQURFUiksIHcsIGgsIDEsIDMyIH0gfTsKLQotICAgIEhCSVRNQVAgaGJtcCA9
IENyZWF0ZURJQlNlY3Rpb24oMCwgJmJtcCwgRElCX1JHQl9DT0xPUlMsICh2b2lkKiopJmJpdHMs
IDAsIDApOwotICAgIEhCSVRNQVAgaGJtcE9sZCA9IChIQklUTUFQKVNlbGVjdE9iamVjdChoZGMs
IGhibXApOwotICAgIENHQ29sb3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVh
dGVEZXZpY2VSR0IoKTsKLSAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IENHQml0bWFwQ29udGV4
dENyZWF0ZSgodm9pZCopYml0cywgdywgaCwKLSAgICAgICAgOCwgdyAqIHNpemVvZihSR0JRVUFE
KSwgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFQ
cmVtdWx0aXBsaWVkRmlyc3QpOwotICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsK
LSAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQpOwotCi0gICAgR3JhcGhpY3NDb250ZXh0
IGdjKGNvbnRleHQpOwotCi0gICAgZnJhbWUtPmRvY3VtZW50KCktPnVwZGF0ZUxheW91dCgpOwot
ICAgIGRyYXdSZWN0SW50b0NvbnRleHQoaXIsIGZyYW1lLT52aWV3KCksICZnYyk7Ci0KLSAgICBD
R0NvbnRleHRSZWxlYXNlKGNvbnRleHQpOwotICAgIFNlbGVjdE9iamVjdChoZGMsIGhibXBPbGQp
OwotICAgIERlbGV0ZURDKGhkYyk7Ci0KLSAgICBmcmFtZS0+c2V0UGFpbnRSZXN0cmljdGlvbihQ
YWludFJlc3RyaWN0aW9uTm9uZSk7Ci0KLSAgICByZXR1cm4gaGJtcDsKLX0KLQogRHJhZ0ltYWdl
UmVmIEZyYW1lOjpkcmFnSW1hZ2VGb3JTZWxlY3Rpb24oKQogeyAgICAKICAgICBpZiAoc2VsZWN0
aW9uQ29udHJvbGxlcigpLT5pc1JhbmdlKCkpCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL1NpbXBsZUZvbnREYXRhLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9TaW1wbGVGb250RGF0YS5oCShyZXZpc2lvbiAyOTcyNikKKysrIFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuaAkod29ya2luZyBjb3B5KQpAQCAtMTAzLDYgKzEw
Myw3IEBAIHB1YmxpYzoKICAgICBTQ1JJUFRfQ0FDSEUqIHNjcmlwdENhY2hlKCkgY29uc3QgeyBy
ZXR1cm4gJm1fc2NyaXB0Q2FjaGU7IH0KIAogICAgIHN0YXRpYyB2b2lkIHNldFNob3VsZEFwcGx5
TWFjQXNjZW50SGFjayhib29sKTsKKyAgICBzdGF0aWMgYm9vbCBzaG91bGRBcHBseU1hY0FzY2Vu
dEhhY2soKTsKICNlbmRpZgogCiAjaWYgUExBVEZPUk0oR1RLKQpJbmRleDogV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9jYWlyby9HcmFwaGljc0NvbnRleHRDYWlyby5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9HcmFwaGljc0NvbnRleHRDYWlyby5j
cHAJKHJldmlzaW9uIDI5NzI2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9H
cmFwaGljc0NvbnRleHRDYWlyby5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQxLDE1ICs0MSwxMyBA
QAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KIAotI2lm
IFBMQVRGT1JNKFdJTikKLSNpbmNsdWRlIDxjYWlyby13aW4zMi5oPgotI2VuZGlmCi0KICNpZiBQ
TEFURk9STShHVEspCiAjaW5jbHVkZSA8Z2RrL2dkay5oPgogI2luY2x1ZGUgPHBhbmdvL3Bhbmdv
Lmg+CisjZWxpZiBQTEFURk9STShXSU4pCisjaW5jbHVkZSA8Y2Fpcm8td2luMzIuaD4KICNlbmRp
ZgotCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlQ2Fpcm8uaCIKIAog
I2lmbmRlZiBNX1BJCiAjZGVmaW5lIE1fUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgpAQCAtNTcs
MTkgKzU1LDYgQEAKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1jbGFzcyBHcmFwaGljc0NvbnRl
eHRQbGF0Zm9ybVByaXZhdGUgewotcHVibGljOgotICAgIEdyYXBoaWNzQ29udGV4dFBsYXRmb3Jt
UHJpdmF0ZSgpOwotICAgIH5HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKTsKLQotICAg
IGNhaXJvX3QqIGNyOwotICAgIFZlY3RvcjxmbG9hdD4gbGF5ZXJzOwotCi0jaWYgUExBVEZPUk0o
R1RLKQotICAgIEdka0V2ZW50RXhwb3NlKiBleHBvc2U7Ci0jZW5kaWYKLX07Ci0KIHN0YXRpYyBp
bmxpbmUgdm9pZCBzZXRDb2xvcihjYWlyb190KiBjciwgY29uc3QgQ29sb3ImIGNvbCkKIHsKICAg
ICBmbG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKQEAgLTg2LDM0ICs3MSw2IEBAIHN0YXRp
YyBpbmxpbmUgdm9pZCBmaWxsUmVjdFNvdXJjZU92ZXIoY2EKICAgICBjYWlyb19maWxsKGNyKTsK
IH0KIAotR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGUoKQotICAgIDogIGNyKDApCi0jaWYgUExBVEZPUk0oR1RLKQotICAgICwgZXhw
b3NlKDApCi0jZW5kaWYKLXsKLX0KLQotR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjp+
R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKCkKLXsKLSAgICBjYWlyb19kZXN0cm95KGNy
KTsKLX0KLQotI2lmIFBMQVRGT1JNKFdJTikKLUdyYXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250
ZXh0KEhEQyBkYykKLSAgICA6IG1fY29tbW9uKGNyZWF0ZUdyYXBoaWNzQ29udGV4dFByaXZhdGUo
KSkKLSAgICAsIG1fZGF0YShuZXcgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKQotewot
ICAgIGlmIChkYykgewotICAgICAgICBjYWlyb19zdXJmYWNlX3QqIHN1cmZhY2UgPSBjYWlyb193
aW4zMl9zdXJmYWNlX2NyZWF0ZShkYyk7Ci0gICAgICAgIG1fZGF0YS0+Y3IgPSBjYWlyb19jcmVh
dGUoc3VyZmFjZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2V0UGFpbnRpbmdEaXNhYmxlZCh0
cnVlKTsKLSAgICAgICAgbV9kYXRhLT5jciA9IDA7Ci0gICAgfQotfQotI2VuZGlmCi0KIEdyYXBo
aWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0KFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiBjcikK
ICAgICA6IG1fY29tbW9uKGNyZWF0ZUdyYXBoaWNzQ29udGV4dFByaXZhdGUoKSkKICAgICAsIG1f
ZGF0YShuZXcgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKQpAQCAtNTc3LDYgKzUzNCw5
IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRVUkxGb3JSZWN0KGNvbnMKICAgICBub3RJbXBs
ZW1lbnRlZCgpOwogfQogCisjaWYgUExBVEZPUk0oR1RLKQorLy8gRklYTUU6ICBUaGlzIHNob3Vs
ZCBiZSBtb3ZlZCB0byBzb21ldGhpbmcgbGlrZSBHcmFwaGljc0NvbnRleHRDYWlyb0dUSy5jcHAs
CisvLyBhcyB0aGVyZSBpcyBhIFdpbmRvd3MgaW1wbGVtZW50YXRpb24gaW4gcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENhaXJvV2luLmNwcAogdm9pZCBHcmFwaGljc0NvbnRl
eHQ6OmNvbmNhdENUTShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSkKIHsKICAgICBp
ZiAocGFpbnRpbmdEaXNhYmxlZCgpKQpAQCAtNTg2LDYgKzU0Niw3IEBAIHZvaWQgR3JhcGhpY3ND
b250ZXh0Ojpjb25jYXRDVE0oY29uc3QgQWYKICAgICBjb25zdCBjYWlyb19tYXRyaXhfdCogbWF0
cml4ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYWlyb19tYXRyaXhfdCo+KCZ0cmFuc2Zvcm0p
OwogICAgIGNhaXJvX3RyYW5zZm9ybShjciwgbWF0cml4KTsKIH0KKyNlbmRpZgogCiB2b2lkIEdy
YXBoaWNzQ29udGV4dDo6YWRkSW5uZXJSb3VuZGVkUmVjdENsaXAoY29uc3QgSW50UmVjdCYgcmVj
dCwgaW50IHRoaWNrbmVzcykKIHsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fp
cm8vR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlQ2Fpcm8uaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZUNhaXJvLmgJKHJldmlzaW9uIDI5NzI2KQkoZnJvbSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4dENhaXJvLmNwcDoyOTcyNikKKysrIFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlQ2Fpcm8u
aAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDkyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAwNiBBcHBsZSBDb21wdXRlciwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHly
aWdodCAoQykgMjAwNyBBbHAgVG9rZXIgPGFscEBhdG9rZXIuY29tPgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisKKyNpZiBQTEFURk9S
TShDQUlSTykKKworI2luY2x1ZGUgIkNhaXJvUGF0aC5oIgorI2luY2x1ZGUgIkZsb2F0UmVjdC5o
IgorI2luY2x1ZGUgIkZvbnQuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiTm90
SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQYXRoLmgiCisjaW5jbHVkZSAiU2ltcGxlRm9udERh
dGEuaCIKKyNpbmNsdWRlIDxjYWlyby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxz
dGRpby5oPgorI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CisKKyNpZiBQTEFURk9STShXSU4p
CisjaW5jbHVkZSA8Y2Fpcm8td2luMzIuaD4KKyNlbmRpZgorCisjaWYgUExBVEZPUk0oR1RLKQor
I2luY2x1ZGUgPGdkay9nZGsuaD4KKyNpbmNsdWRlIDxwYW5nby9wYW5nby5oPgorI2VuZGlmCisK
KworI2lmbmRlZiBNX1BJCisjZGVmaW5lIE1fUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgorI2Vu
ZGlmCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgR3JhcGhpY3NDb250ZXh0UGxhdGZv
cm1Qcml2YXRlIHsKK3B1YmxpYzoKKyAgICBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUo
KTsKKyAgICB+R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKCk7CisKKyAgICBjYWlyb190
KiBjcjsKKyAgICBWZWN0b3I8ZmxvYXQ+IGxheWVyczsKKworI2lmIFBMQVRGT1JNKEdUSykKKyAg
ICBHZGtFdmVudEV4cG9zZSogZXhwb3NlOworI2VuZGlmCit9OworCitzdGF0aWMgaW5saW5lIHZv
aWQgc2V0Q29sb3IoY2Fpcm9fdCogY3IsIGNvbnN0IENvbG9yJiBjb2wpCit7CisgICAgZmxvYXQg
cmVkLCBncmVlbiwgYmx1ZSwgYWxwaGE7CisgICAgY29sLmdldFJHQkEocmVkLCBncmVlbiwgYmx1
ZSwgYWxwaGEpOworICAgIGNhaXJvX3NldF9zb3VyY2VfcmdiYShjciwgcmVkLCBncmVlbiwgYmx1
ZSwgYWxwaGEpOworfQorCisvLyBBIGZpbGxSZWN0IGhlbHBlcgorc3RhdGljIGlubGluZSB2b2lk
IGZpbGxSZWN0U291cmNlT3ZlcihjYWlyb190KiBjciwgY29uc3QgRmxvYXRSZWN0JiByZWN0LCBj
b25zdCBDb2xvciYgY29sKQoreworICAgIHNldENvbG9yKGNyLCBjb2wpOworICAgIGNhaXJvX3Jl
Y3RhbmdsZShjciwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0
KCkpOworICAgIGNhaXJvX3NldF9vcGVyYXRvcihjciwgQ0FJUk9fT1BFUkFUT1JfT1ZFUik7Cisg
ICAgY2Fpcm9fZmlsbChjcik7Cit9CisKK0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6
R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKCkKKyAgICA6ICBjcigwKQorI2lmIFBMQVRG
T1JNKEdUSykKKyAgICAsIGV4cG9zZSgwKQorI2VuZGlmCit7Cit9CisKK0dyYXBoaWNzQ29udGV4
dFBsYXRmb3JtUHJpdmF0ZTo6fkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpCit7Cisg
ICAgY2Fpcm9fZGVzdHJveShjcik7Cit9CisKKyNpZiBQTEFURk9STShXSU4pCitHcmFwaGljc0Nv
bnRleHQ6OkdyYXBoaWNzQ29udGV4dChIREMgZGMpCisgICAgOiBtX2NvbW1vbihjcmVhdGVHcmFw
aGljc0NvbnRleHRQcml2YXRlKCkpCisgICAgLCBtX2RhdGEobmV3IEdyYXBoaWNzQ29udGV4dFBs
YXRmb3JtUHJpdmF0ZSkKK3sKKyAgICBpZiAoZGMpIHsKKyAgICAgICAgY2Fpcm9fc3VyZmFjZV90
KiBzdXJmYWNlID0gY2Fpcm9fd2luMzJfc3VyZmFjZV9jcmVhdGUoZGMpOworICAgICAgICBtX2Rh
dGEtPmNyID0gY2Fpcm9fY3JlYXRlKHN1cmZhY2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNl
dFBhaW50aW5nRGlzYWJsZWQodHJ1ZSk7CisgICAgICAgIG1fZGF0YS0+Y3IgPSAwOworICAgIH0K
K30KKyNlbmRpZgorCitHcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dChQbGF0Zm9ybUdy
YXBoaWNzQ29udGV4dCogY3IpCisgICAgOiBtX2NvbW1vbihjcmVhdGVHcmFwaGljc0NvbnRleHRQ
cml2YXRlKCkpCisgICAgLCBtX2RhdGEobmV3IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0
ZSkKK3sKKyAgICBtX2RhdGEtPmNyID0gY2Fpcm9fcmVmZXJlbmNlKGNyKTsKKyAgICBzZXRQYWlu
dGluZ0Rpc2FibGVkKCFjcik7Cit9CisKK0dyYXBoaWNzQ29udGV4dDo6fkdyYXBoaWNzQ29udGV4
dCgpCit7CisgICAgZGVzdHJveUdyYXBoaWNzQ29udGV4dFByaXZhdGUobV9jb21tb24pOworICAg
IGRlbGV0ZSBtX2RhdGE7Cit9CisKK2NhaXJvX3QqIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1D
b250ZXh0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9kYXRhLT5jcjsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHQ6OnNhdmVQbGF0Zm9ybVN0YXRlKCkKK3sKKyAgICBjYWlyb19zYXZlKG1fZGF0
YS0+Y3IpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6cmVzdG9yZVBsYXRmb3JtU3RhdGUo
KQoreworICAgIGNhaXJvX3Jlc3RvcmUobV9kYXRhLT5jcik7Cit9CisKKy8vIERyYXdzIGEgZmls
bGVkIHJlY3RhbmdsZSB3aXRoIGEgc3Ryb2tlZCBib3JkZXIuCit2b2lkIEdyYXBoaWNzQ29udGV4
dDo6ZHJhd1JlY3QoY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNh
YmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7
CisgICAgY2Fpcm9fc2F2ZShjcik7CisKKyAgICBpZiAoZmlsbENvbG9yKCkuYWxwaGEoKSkKKyAg
ICAgICAgZmlsbFJlY3RTb3VyY2VPdmVyKGNyLCByZWN0LCBmaWxsQ29sb3IoKSk7CisKKyAgICBp
ZiAoc3Ryb2tlU3R5bGUoKSAhPSBOb1N0cm9rZSkgeworICAgICAgICBzZXRDb2xvcihjciwgc3Ry
b2tlQ29sb3IoKSk7CisgICAgICAgIEZsb2F0UmVjdCByKHJlY3QpOworICAgICAgICByLmluZmxh
dGUoLS41Zik7CisgICAgICAgIGNhaXJvX3JlY3RhbmdsZShjciwgci54KCksIHIueSgpLCByLndp
ZHRoKCksIHIuaGVpZ2h0KCkpOworICAgICAgICBjYWlyb19zZXRfbGluZV93aWR0aChjciwgMS4w
KTsKKyAgICAgICAgY2Fpcm9fc3Ryb2tlKGNyKTsKKyAgICB9CisKKyAgICBjYWlyb19yZXN0b3Jl
KGNyKTsKK30KKworLy8gRklYTUU6IE5vdyB0aGF0IHRoaXMgaXMgcmVmYWN0b3JlZCwgaXQgc2hv
dWxkIGJlIHNoYXJlZCBieSBhbGwgY29udGV4dHMuCitzdGF0aWMgdm9pZCBhZGp1c3RMaW5lVG9Q
aXhlbEJvdW5kYXJpZXMoRmxvYXRQb2ludCYgcDEsIEZsb2F0UG9pbnQmIHAyLCBmbG9hdCBzdHJv
a2VXaWR0aCwgU3Ryb2tlU3R5bGUgc3R5bGUpCit7CisgICAgLy8gRm9yIG9kZCB3aWR0aHMsIHdl
IGFkZCBpbiAwLjUgdG8gdGhlIGFwcHJvcHJpYXRlIHgveSBzbyB0aGF0IHRoZSBmbG9hdCBhcml0
aG1ldGljCisgICAgLy8gd29ya3Mgb3V0LiAgRm9yIGV4YW1wbGUsIHdpdGggYSBib3JkZXIgd2lk
dGggb2YgMywgS0hUTUwgd2lsbCBwYXNzIHVzICh5MSt5MikvMiwgZS5nLiwKKyAgICAvLyAoNTAr
NTMpLzIgPSAxMDMvMiA9IDUxIHdoZW4gd2Ugd2FudCA1MS41LiAgSXQgaXMgYWx3YXlzIHRydWUg
dGhhdCBhbiBldmVuIHdpZHRoIGdhdmUKKyAgICAvLyB1cyBhIHBlcmZlY3QgcG9zaXRpb24sIGJ1
dCBhbiBvZGQgd2lkdGggZ2F2ZSB1cyBhIHBvc2l0aW9uIHRoYXQgaXMgb2ZmIGJ5IGV4YWN0bHkg
MC41LgorICAgIGlmIChzdHlsZSA9PSBEb3R0ZWRTdHJva2UgfHwgc3R5bGUgPT0gRGFzaGVkU3Ry
b2tlKSB7CisgICAgICAgIGlmIChwMS54KCkgPT0gcDIueCgpKSB7CisgICAgICAgICAgICBwMS5z
ZXRZKHAxLnkoKSArIHN0cm9rZVdpZHRoKTsKKyAgICAgICAgICAgIHAyLnNldFkocDIueSgpIC0g
c3Ryb2tlV2lkdGgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcDEu
c2V0WChwMS54KCkgKyBzdHJva2VXaWR0aCk7CisgICAgICAgICAgICBwMi5zZXRYKHAyLngoKSAt
IHN0cm9rZVdpZHRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzdGF0aWNfY2FzdDxp
bnQ+KHN0cm9rZVdpZHRoKSAlIDIpIHsKKyAgICAgICAgaWYgKHAxLngoKSA9PSBwMi54KCkpIHsK
KyAgICAgICAgICAgIC8vIFdlJ3JlIGEgdmVydGljYWwgbGluZS4gIEFkanVzdCBvdXIgeC4KKyAg
ICAgICAgICAgIHAxLnNldFgocDEueCgpICsgMC41KTsKKyAgICAgICAgICAgIHAyLnNldFgocDIu
eCgpICsgMC41KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIFdl
J3JlIGEgaG9yaXpvbnRhbCBsaW5lLiBBZGp1c3Qgb3VyIHkuCisgICAgICAgICAgICBwMS5zZXRZ
KHAxLnkoKSArIDAuNSk7CisgICAgICAgICAgICBwMi5zZXRZKHAyLnkoKSArIDAuNSk7CisgICAg
ICAgIH0KKyAgICB9Cit9CisKKy8vIFRoaXMgaXMgb25seSB1c2VkIHRvIGRyYXcgYm9yZGVycy4K
K3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZShjb25zdCBJbnRQb2ludCYgcG9pbnQxLCBj
b25zdCBJbnRQb2ludCYgcG9pbnQyKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIFN0cm9rZVN0eWxlIHN0eWxlID0gc3Ryb2tlU3R5bGUoKTsK
KyAgICBpZiAoc3R5bGUgPT0gTm9TdHJva2UpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJv
X3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb19zYXZlKGNyKTsKKworICAgIGZsb2F0IHdp
ZHRoID0gc3Ryb2tlVGhpY2tuZXNzKCk7CisgICAgaWYgKHdpZHRoIDwgMSkKKyAgICAgICAgd2lk
dGggPSAxOworCisgICAgRmxvYXRQb2ludCBwMSA9IHBvaW50MTsKKyAgICBGbG9hdFBvaW50IHAy
ID0gcG9pbnQyOworICAgIGJvb2wgaXNWZXJ0aWNhbExpbmUgPSAocDEueCgpID09IHAyLngoKSk7
CisgCisgICAgYWRqdXN0TGluZVRvUGl4ZWxCb3VuZGFyaWVzKHAxLCBwMiwgd2lkdGgsIHN0eWxl
KTsKKyAgICBjYWlyb19zZXRfbGluZV93aWR0aChjciwgd2lkdGgpOworCisgICAgaW50IHBhdFdp
ZHRoID0gMDsKKyAgICBzd2l0Y2ggKHN0eWxlKSB7CisgICAgY2FzZSBOb1N0cm9rZToKKyAgICBj
YXNlIFNvbGlkU3Ryb2tlOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIERvdHRlZFN0cm9rZToK
KyAgICAgICAgcGF0V2lkdGggPSBzdGF0aWNfY2FzdDxpbnQ+KHdpZHRoKTsKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBEYXNoZWRTdHJva2U6CisgICAgICAgIHBhdFdpZHRoID0gMypzdGF0aWNf
Y2FzdDxpbnQ+KHdpZHRoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc2V0Q29sb3Io
Y3IsIHN0cm9rZUNvbG9yKCkpOworCisgICAgY2Fpcm9fc2V0X2FudGlhbGlhcyhjciwgQ0FJUk9f
QU5USUFMSUFTX05PTkUpOworCisgICAgaWYgKHBhdFdpZHRoKSB7CisgICAgICAgIC8vIERvIGEg
cmVjdCBmaWxsIG9mIG91ciBlbmRwb2ludHMuICBUaGlzIGVuc3VyZXMgd2UgYWx3YXlzIGhhdmUg
dGhlCisgICAgICAgIC8vIGFwcGVhcmFuY2Ugb2YgYmVpbmcgYSBib3JkZXIuICBXZSB0aGVuIGRy
YXcgdGhlIGFjdHVhbCBkb3R0ZWQvZGFzaGVkIGxpbmUuCisgICAgICAgIGlmIChpc1ZlcnRpY2Fs
TGluZSkgeworICAgICAgICAgICAgZmlsbFJlY3RTb3VyY2VPdmVyKGNyLCBGbG9hdFJlY3QocDEu
eCgpIC0gd2lkdGgvMiwgcDEueSgpIC0gd2lkdGgsIHdpZHRoLCB3aWR0aCksIHN0cm9rZUNvbG9y
KCkpOworICAgICAgICAgICAgZmlsbFJlY3RTb3VyY2VPdmVyKGNyLCBGbG9hdFJlY3QocDIueCgp
IC0gd2lkdGgvMiwgcDIueSgpLCB3aWR0aCwgd2lkdGgpLCBzdHJva2VDb2xvcigpKTsKKyAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbGxSZWN0U291cmNlT3ZlcihjciwgRmxvYXRSZWN0
KHAxLngoKSAtIHdpZHRoLCBwMS55KCkgLSB3aWR0aC8yLCB3aWR0aCwgd2lkdGgpLCBzdHJva2VD
b2xvcigpKTsKKyAgICAgICAgICAgIGZpbGxSZWN0U291cmNlT3ZlcihjciwgRmxvYXRSZWN0KHAy
LngoKSwgcDIueSgpIC0gd2lkdGgvMiwgd2lkdGgsIHdpZHRoKSwgc3Ryb2tlQ29sb3IoKSk7Cisg
ICAgICAgIH0KKworICAgICAgICAvLyBFeGFtcGxlOiA4MCBwaXhlbHMgd2l0aCBhIHdpZHRoIG9m
IDMwIHBpeGVscy4KKyAgICAgICAgLy8gUmVtYWluZGVyIGlzIDIwLiAgVGhlIG1heGltdW0gcGl4
ZWxzIG9mIGxpbmUgd2UgY291bGQgcGFpbnQKKyAgICAgICAgLy8gd2lsbCBiZSA1MCBwaXhlbHMu
CisgICAgICAgIGludCBkaXN0YW5jZSA9IChpc1ZlcnRpY2FsTGluZSA/IChwb2ludDIueSgpIC0g
cG9pbnQxLnkoKSkgOiAocG9pbnQyLngoKSAtIHBvaW50MS54KCkpKSAtIDIqc3RhdGljX2Nhc3Q8
aW50Pih3aWR0aCk7CisgICAgICAgIGludCByZW1haW5kZXIgPSBkaXN0YW5jZSVwYXRXaWR0aDsK
KyAgICAgICAgaW50IGNvdmVyYWdlID0gZGlzdGFuY2UtcmVtYWluZGVyOworICAgICAgICBpbnQg
bnVtU2VnbWVudHMgPSBjb3ZlcmFnZS9wYXRXaWR0aDsKKworICAgICAgICBmbG9hdCBwYXR0ZXJu
T2Zmc2V0ID0gMDsKKyAgICAgICAgLy8gU3BlY2lhbCBjYXNlIDFweCBkb3R0ZWQgYm9yZGVycyBm
b3Igc3BlZWQuCisgICAgICAgIGlmIChwYXRXaWR0aCA9PSAxKQorICAgICAgICAgICAgcGF0dGVy
bk9mZnNldCA9IDEuMDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBib29sIGV2ZW5OdW1i
ZXJPZlNlZ21lbnRzID0gbnVtU2VnbWVudHMlMiA9PSAwOworICAgICAgICAgICAgaWYgKHJlbWFp
bmRlcikKKyAgICAgICAgICAgICAgICBldmVuTnVtYmVyT2ZTZWdtZW50cyA9ICFldmVuTnVtYmVy
T2ZTZWdtZW50czsKKyAgICAgICAgICAgIGlmIChldmVuTnVtYmVyT2ZTZWdtZW50cykgeworICAg
ICAgICAgICAgICAgIGlmIChyZW1haW5kZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0dGVy
bk9mZnNldCArPSBwYXRXaWR0aCAtIHJlbWFpbmRlcjsKKyAgICAgICAgICAgICAgICAgICAgcGF0
dGVybk9mZnNldCArPSByZW1haW5kZXIvMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuT2Zmc2V0ID0gcGF0V2lkdGgv
MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCFldmVuTnVtYmVyT2ZTZWdt
ZW50cykgeworICAgICAgICAgICAgICAgIGlmIChyZW1haW5kZXIpCisgICAgICAgICAgICAgICAg
ICAgIHBhdHRlcm5PZmZzZXQgPSAocGF0V2lkdGggLSByZW1haW5kZXIpLzI7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKworICAgICAgICBkb3VibGUgZGFzaCA9IHBhdFdpZHRoOworICAgICAg
ICBjYWlyb19zZXRfZGFzaChjciwgJmRhc2gsIDEsIHBhdHRlcm5PZmZzZXQpOworICAgIH0KKwor
ICAgIGNhaXJvX21vdmVfdG8oY3IsIHAxLngoKSwgcDEueSgpKTsKKyAgICBjYWlyb19saW5lX3Rv
KGNyLCBwMi54KCksIHAyLnkoKSk7CisKKyAgICBjYWlyb19zdHJva2UoY3IpOworICAgIGNhaXJv
X3Jlc3RvcmUoY3IpOworfQorCisvLyBUaGlzIG1ldGhvZCBpcyBvbmx5IHVzZWQgdG8gZHJhdyB0
aGUgbGl0dGxlIGNpcmNsZXMgdXNlZCBpbiBsaXN0cy4KK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpk
cmF3RWxsaXBzZShjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmIChwYWludGluZ0Rpc2Fi
bGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsK
KyAgICBjYWlyb19zYXZlKGNyKTsKKyAgICBmbG9hdCB5UmFkaXVzID0gLjUgKiByZWN0LmhlaWdo
dCgpOworICAgIGZsb2F0IHhSYWRpdXMgPSAuNSAqIHJlY3Qud2lkdGgoKTsKKyAgICBjYWlyb190
cmFuc2xhdGUoY3IsIHJlY3QueCgpICsgeFJhZGl1cywgcmVjdC55KCkgKyB5UmFkaXVzKTsKKyAg
ICBjYWlyb19zY2FsZShjciwgeFJhZGl1cywgeVJhZGl1cyk7CisgICAgY2Fpcm9fYXJjKGNyLCAw
LiwgMC4sIDEuLCAwLiwgMiAqIE1fUEkpOworICAgIGNhaXJvX3Jlc3RvcmUoY3IpOworCisgICAg
aWYgKGZpbGxDb2xvcigpLmFscGhhKCkpIHsKKyAgICAgICAgc2V0Q29sb3IoY3IsIGZpbGxDb2xv
cigpKTsKKyAgICAgICAgY2Fpcm9fZmlsbF9wcmVzZXJ2ZShjcik7CisgICAgfQorCisgICAgaWYg
KHN0cm9rZVN0eWxlKCkgIT0gTm9TdHJva2UpIHsKKyAgICAgICAgc2V0Q29sb3IoY3IsIHN0cm9r
ZUNvbG9yKCkpOworICAgICAgICBjYWlyb19zZXRfbGluZV93aWR0aChjciwgc3Ryb2tlVGhpY2tu
ZXNzKCkpOworICAgICAgICBjYWlyb19zdHJva2UoY3IpOworICAgIH0KKworICAgIGNhaXJvX25l
d19wYXRoKGNyKTsKK30KKworLy8gRklYTUU6IFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgYWRq
dXN0ZWQgdG8gbWF0Y2ggdGhlIGZ1bmN0aW9uYWxpdHkgb24gdGhlIE1hYyBzaWRlLgordm9pZCBH
cmFwaGljc0NvbnRleHQ6OnN0cm9rZUFyYyhjb25zdCBJbnRSZWN0JiByZWN0LCBpbnQgc3RhcnRB
bmdsZSwgaW50IGFuZ2xlU3BhbikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBpZiAoc3Ryb2tlU3R5bGUoKSA9PSBOb1N0cm9rZSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgaW50IHggPSByZWN0LngoKTsKKyAgICBpbnQgeSA9IHJlY3QueSgp
OworICAgIGZsb2F0IHcgPSByZWN0LndpZHRoKCk7CisjaWYgMCAvLyBGSVhNRTogdW51c2VkIHNv
IGZhcgorICAgIGZsb2F0IGggPSByZWN0LmhlaWdodCgpOworICAgIGZsb2F0IHNjYWxlRmFjdG9y
ID0gaCAvIHc7CisgICAgZmxvYXQgcmV2ZXJzZVNjYWxlRmFjdG9yID0gdyAvIGg7CisjZW5kaWYK
KyAgICBmbG9hdCByID0gdyAvIDI7CisgICAgZmxvYXQgZmEgPSBzdGFydEFuZ2xlOworICAgIGZs
b2F0IGZhbGVuID0gIGZhICsgYW5nbGVTcGFuOworCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEt
PmNyOworICAgIGNhaXJvX3NhdmUoY3IpOworICAgIGNhaXJvX2FyY19uZWdhdGl2ZShjciwgeCAr
IHIsIHkgKyByLCByLCAtZmEgKiBNX1BJLzE4MCwgLWZhbGVuICogTV9QSS8xODApOworICAgIHNl
dENvbG9yKGNyLCBzdHJva2VDb2xvcigpKTsKKyAgICBjYWlyb19zZXRfbGluZV93aWR0aChjciwg
c3Ryb2tlVGhpY2tuZXNzKCkpOworICAgIGNhaXJvX3N0cm9rZShjcik7CisgICAgY2Fpcm9fcmVz
dG9yZShjcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3Q29udmV4UG9seWdvbihz
aXplX3QgbnBvaW50cywgY29uc3QgRmxvYXRQb2ludCogcG9pbnRzLCBib29sIHNob3VsZEFudGlh
bGlhcykKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisK
KyAgICBpZiAobnBvaW50cyA8PSAxKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb190KiBj
ciA9IG1fZGF0YS0+Y3I7CisKKyAgICBjYWlyb19zYXZlKGNyKTsKKyAgICBjYWlyb19zZXRfYW50
aWFsaWFzKGNyLCBzaG91bGRBbnRpYWxpYXMgPyBDQUlST19BTlRJQUxJQVNfREVGQVVMVCA6IENB
SVJPX0FOVElBTElBU19OT05FKTsKKyAgICBjYWlyb19tb3ZlX3RvKGNyLCBwb2ludHNbMF0ueCgp
LCBwb2ludHNbMF0ueSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG5wb2ludHM7IGkr
KykKKyAgICAgICAgY2Fpcm9fbGluZV90byhjciwgcG9pbnRzW2ldLngoKSwgcG9pbnRzW2ldLnko
KSk7CisgICAgY2Fpcm9fY2xvc2VfcGF0aChjcik7CisKKyAgICBpZiAoZmlsbENvbG9yKCkuYWxw
aGEoKSkgeworICAgICAgICBzZXRDb2xvcihjciwgZmlsbENvbG9yKCkpOworICAgICAgICBjYWly
b19zZXRfZmlsbF9ydWxlKGNyLCBDQUlST19GSUxMX1JVTEVfRVZFTl9PREQpOworICAgICAgICBj
YWlyb19maWxsX3ByZXNlcnZlKGNyKTsKKyAgICB9CisKKyAgICBpZiAoc3Ryb2tlU3R5bGUoKSAh
PSBOb1N0cm9rZSkgeworICAgICAgICBzZXRDb2xvcihjciwgc3Ryb2tlQ29sb3IoKSk7CisgICAg
ICAgIGNhaXJvX3NldF9saW5lX3dpZHRoKGNyLCBzdHJva2VUaGlja25lc3MoKSk7CisgICAgICAg
IGNhaXJvX3N0cm9rZShjcik7CisgICAgfQorCisgICAgY2Fpcm9fbmV3X3BhdGgoY3IpOworICAg
IGNhaXJvX3Jlc3RvcmUoY3IpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJlY3Qo
Y29uc3QgSW50UmVjdCYgcmVjdCwgY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIGlmIChwYWlu
dGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChjb2xvci5hbHBoYSgp
KQorICAgICAgICBmaWxsUmVjdFNvdXJjZU92ZXIobV9kYXRhLT5jciwgcmVjdCwgY29sb3IpOwor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0
LCBjb25zdCBDb2xvciYgY29sb3IpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgaWYgKGNvbG9yLmFscGhhKCkpCisgICAgICAgIGZpbGxSZWN0
U291cmNlT3ZlcihtX2RhdGEtPmNyLCByZWN0LCBjb2xvcik7Cit9CisKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0OjpjbGlwKGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKHBhaW50aW5nRGlz
YWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNy
OworICAgIGNhaXJvX3JlY3RhbmdsZShjciwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRo
KCksIHJlY3QuaGVpZ2h0KCkpOworICAgIGNhaXJvX2ZpbGxfcnVsZV90IHNhdmVkRmlsbFJ1bGUg
PSBjYWlyb19nZXRfZmlsbF9ydWxlKGNyKTsKKyAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNyLCBD
QUlST19GSUxMX1JVTEVfV0lORElORyk7CisgICAgY2Fpcm9fY2xpcChjcik7CisgICAgY2Fpcm9f
c2V0X2ZpbGxfcnVsZShjciwgc2F2ZWRGaWxsUnVsZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250
ZXh0OjpkcmF3Rm9jdXNSaW5nKGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBpZiAocGFpbnRp
bmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpbnQgcmFkaXVzID0gKGZvY3Vz
UmluZ1dpZHRoKCkgLSAxKSAvIDI7CisgICAgaW50IG9mZnNldCA9IHJhZGl1cyArIGZvY3VzUmlu
Z09mZnNldCgpOworCisgICAgY29uc3QgVmVjdG9yPEludFJlY3Q+JiByZWN0cyA9IGZvY3VzUmlu
Z1JlY3RzKCk7CisgICAgdW5zaWduZWQgcmVjdENvdW50ID0gcmVjdHMuc2l6ZSgpOworICAgIElu
dFJlY3QgZmluYWxGb2N1c1JlY3Q7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlY3RD
b3VudDsgaSsrKSB7CisgICAgICAgIEludFJlY3QgZm9jdXNSZWN0ID0gcmVjdHNbaV07CisgICAg
ICAgIGZvY3VzUmVjdC5pbmZsYXRlKG9mZnNldCk7CisgICAgICAgIGZpbmFsRm9jdXNSZWN0LnVu
aXRlKGZvY3VzUmVjdCk7CisgICAgfQorCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwor
ICAgIGNhaXJvX3NhdmUoY3IpOworICAgIC8vIEZJWE1FOiBUaGVzZSByZWN0cyBzaG91bGQgYmUg
cm91bmRlZAorICAgIGNhaXJvX3JlY3RhbmdsZShjciwgZmluYWxGb2N1c1JlY3QueCgpLCBmaW5h
bEZvY3VzUmVjdC55KCksIGZpbmFsRm9jdXNSZWN0LndpZHRoKCksIGZpbmFsRm9jdXNSZWN0Lmhl
aWdodCgpKTsKKworICAgIC8vIEZvcmNlIHRoZSBhbHBoYSB0byA1MCUuICBUaGlzIG1hdGNoZXMg
d2hhdCB0aGUgTWFjIGRvZXMgd2l0aCBvdXRsaW5lIHJpbmdzLgorICAgIENvbG9yIHJpbmdDb2xv
cihjb2xvci5yZWQoKSwgY29sb3IuZ3JlZW4oKSwgY29sb3IuYmx1ZSgpLCAxMjcpOworICAgIHNl
dENvbG9yKGNyLCByaW5nQ29sb3IpOworICAgIGNhaXJvX3N0cm9rZShjcik7CisgICAgY2Fpcm9f
cmVzdG9yZShjcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvclRleHQo
Y29uc3QgSW50UG9pbnQmIG9yaWdpbiwgaW50IHdpZHRoLCBib29sIHByaW50aW5nKQoreworICAg
IGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFRoaXMg
aXMgYSB3b3JrYXJvdW5kIGZvciBodHRwOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0xNTY1OQorICAgIFN0cm9rZVN0eWxlIHNhdmVkU3Ryb2tlU3R5bGUgPSBzdHJva2VTdHlsZSgp
OworICAgIHNldFN0cm9rZVN0eWxlKFNvbGlkU3Ryb2tlKTsKKworICAgIEludFBvaW50IGVuZFBv
aW50ID0gb3JpZ2luICsgSW50U2l6ZSh3aWR0aCwgMCk7CisgICAgZHJhd0xpbmUob3JpZ2luLCBl
bmRQb2ludCk7CisKKyAgICBzZXRTdHJva2VTdHlsZShzYXZlZFN0cm9rZVN0eWxlKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yTWlzc3BlbGxpbmdPckJhZEdyYW1tYXIo
Y29uc3QgSW50UG9pbnQmIG9yaWdpbiwgaW50IHdpZHRoLCBib29sIGdyYW1tYXIpCit7CisgICAg
aWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisjaWYgUExBVEZPUk0o
R1RLKQorICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb19zYXZlKGNyKTsK
KworICAgIC8vIENvbnZlbnRpb24gaXMgZ3JlZW4gZm9yIGdyYW1tYXIsIHJlZCBmb3Igc3BlbGxp
bmcKKyAgICAvLyBUaGVzZSBuZWVkIHRvIGJlY29tZSBjb25maWd1cmFibGUKKyAgICBpZiAoZ3Jh
bW1hcikKKyAgICAgICAgY2Fpcm9fc2V0X3NvdXJjZV9yZ2IoY3IsIDAsIDEsIDApOworICAgIGVs
c2UKKyAgICAgICAgY2Fpcm9fc2V0X3NvdXJjZV9yZ2IoY3IsIDEsIDAsIDApOworCisgICAgLy8g
V2UgaWdub3JlIG1vc3Qgb2YgdGhlIHByb3ZpZGVkIGNvbnN0YW50cyBpbiBmYXZvdXIgb2YgdGhl
IHBsYXRmb3JtIHN0eWxlCisgICAgcGFuZ29fY2Fpcm9fc2hvd19lcnJvcl91bmRlcmxpbmUoY3Is
IG9yaWdpbi54KCksIG9yaWdpbi55KCksIHdpZHRoLCBjTWlzc3BlbGxpbmdMaW5lVGhpY2tuZXNz
KTsKKworICAgIGNhaXJvX3Jlc3RvcmUoY3IpOworI2Vsc2UKKyAgICBub3RJbXBsZW1lbnRlZCgp
OworI2VuZGlmCit9CisKK0Zsb2F0UmVjdCBHcmFwaGljc0NvbnRleHQ6OnJvdW5kVG9EZXZpY2VQ
aXhlbHMoY29uc3QgRmxvYXRSZWN0JiBmcmVjdCkKK3sKKyAgICBGbG9hdFJlY3QgcmVzdWx0Owor
ICAgIGRvdWJsZSB4ID0gZnJlY3QueCgpOworICAgIGRvdWJsZSB5ID0gZnJlY3QueSgpOworICAg
IGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb191c2VyX3RvX2RldmljZShjciwg
JngsICZ5KTsKKyAgICB4ID0gcm91bmQoeCk7CisgICAgeSA9IHJvdW5kKHkpOworICAgIGNhaXJv
X2RldmljZV90b191c2VyKGNyLCAmeCwgJnkpOworICAgIHJlc3VsdC5zZXRYKHN0YXRpY19jYXN0
PGZsb2F0Pih4KSk7CisgICAgcmVzdWx0LnNldFkoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHkpKTsKKyAg
ICB4ID0gZnJlY3Qud2lkdGgoKTsKKyAgICB5ID0gZnJlY3QuaGVpZ2h0KCk7CisgICAgY2Fpcm9f
dXNlcl90b19kZXZpY2VfZGlzdGFuY2UoY3IsICZ4LCAmeSk7CisgICAgeCA9IHJvdW5kKHgpOwor
ICAgIHkgPSByb3VuZCh5KTsKKyAgICBjYWlyb19kZXZpY2VfdG9fdXNlcl9kaXN0YW5jZShjciwg
JngsICZ5KTsKKyAgICByZXN1bHQuc2V0V2lkdGgoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHgpKTsKKyAg
ICByZXN1bHQuc2V0SGVpZ2h0KHN0YXRpY19jYXN0PGZsb2F0Pih5KSk7CisgICAgcmV0dXJuIHJl
c3VsdDsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnRyYW5zbGF0ZShmbG9hdCB4LCBmbG9h
dCB5KQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb190cmFuc2xhdGUoY3IsIHgs
IHkpOworfQorCitJbnRQb2ludCBHcmFwaGljc0NvbnRleHQ6Om9yaWdpbigpCit7CisgICAgY2Fp
cm9fbWF0cml4X3QgbWF0cml4OworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBj
YWlyb19nZXRfbWF0cml4KGNyLCAmbWF0cml4KTsKKyAgICByZXR1cm4gSW50UG9pbnQoc3RhdGlj
X2Nhc3Q8aW50PihtYXRyaXgueDApLCBzdGF0aWNfY2FzdDxpbnQ+KG1hdHJpeC55MCkpOworfQor
Cit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1GaWxsQ29sb3IoY29uc3QgQ29sb3Im
IGNvbCkKK3sKKyAgICAvLyBGSVhNRTogdGhpcyBpcyBwcm9iYWJseSBhIG5vLW9wIGJ1dCBJJ20g
bm90IHN1cmUKKyAgICAvLyBub3RJbXBsZW1lbnRlZCgpOyAvLyBjb21tZW50ZWQtb3V0IGJlY2F1
c2UgaXQncyBjaGF0dHkgYW5kIGNsdXR0ZXJzIG91dHB1dAorfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6c2V0UGxhdGZvcm1TdHJva2VDb2xvcihjb25zdCBDb2xvciYgY29sKQoreworICAgIC8v
IEZJWE1FOiB0aGlzIGlzIHByb2JhYmx5IGEgbm8tb3AgYnV0IEknbSBub3Qgc3VyZQorICAgIC8v
bm90SW1wbGVtZW50ZWQoKTsgLy8gY29tbWVudGVkLW91dCBiZWNhdXNlIGl0J3MgY2hhdHR5IGFu
ZCBjbHV0dGVycyBvdXRwdXQKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3Jt
U3Ryb2tlVGhpY2tuZXNzKGZsb2F0IHN0cm9rZVRoaWNrbmVzcykKK3sKKyAgICBpZiAocGFpbnRp
bmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb19zZXRfbGluZV93aWR0
aChtX2RhdGEtPmNyLCBzdHJva2VUaGlja25lc3MpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dDo6c2V0UGxhdGZvcm1TdHJva2VTdHlsZShjb25zdCBTdHJva2VTdHlsZSYgc3Ryb2tlU3R5bGUp
Cit7CisgICAgc3RhdGljIGRvdWJsZSBkYXNoUGF0dGVybltdID0gezUuMCwgNS4wfTsKKyAgICBz
dGF0aWMgZG91YmxlIGRvdFBhdHRlcm5bXSA9IHsxLjAsIDEuMH07CisKKyAgICBpZiAocGFpbnRp
bmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBzd2l0Y2ggKHN0cm9rZVN0eWxl
KSB7CisgICAgY2FzZSBOb1N0cm9rZToKKyAgICAgICAgLy8gRklYTUU6IGlzIGl0IHRoZSByaWdo
dCB3YXkgdG8gZW11bGF0ZSBOb1N0cm9rZT8KKyAgICAgICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgo
bV9kYXRhLT5jciwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU29saWRTdHJva2U6Cisg
ICAgICAgIGNhaXJvX3NldF9kYXNoKG1fZGF0YS0+Y3IsIDAsIDAsIDApOworICAgICAgICBicmVh
azsKKyAgICBjYXNlIERvdHRlZFN0cm9rZToKKyAgICAgICAgY2Fpcm9fc2V0X2Rhc2gobV9kYXRh
LT5jciwgZG90UGF0dGVybiwgMiwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRGFzaGVk
U3Ryb2tlOgorICAgICAgICBjYWlyb19zZXRfZGFzaChtX2RhdGEtPmNyLCBkYXNoUGF0dGVybiwg
MiwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIG5vdEltcGxlbWVu
dGVkKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6
OnNldFVSTEZvclJlY3QoY29uc3QgS1VSTCYgbGluaywgY29uc3QgSW50UmVjdCYgZGVzdFJlY3Qp
Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNv
bmNhdENUTShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSkKK3sKKyAgICBpZiAocGFp
bnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb190KiBjciA9IG1f
ZGF0YS0+Y3I7CisgICAgY29uc3QgY2Fpcm9fbWF0cml4X3QqIG1hdHJpeCA9IHJlaW50ZXJwcmV0
X2Nhc3Q8Y29uc3QgY2Fpcm9fbWF0cml4X3QqPigmdHJhbnNmb3JtKTsKKyAgICBjYWlyb190cmFu
c2Zvcm0oY3IsIG1hdHJpeCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjphZGRJbm5lclJv
dW5kZWRSZWN0Q2xpcChjb25zdCBJbnRSZWN0JiByZWN0LCBpbnQgdGhpY2tuZXNzKQoreworICAg
IGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNsaXAocmVj
dCk7CisKKyAgICBQYXRoIHA7CisgICAgRmxvYXRSZWN0IHIocmVjdCk7CisgICAgLy8gQWRkIG91
dGVyIGVsbGlwc2UKKyAgICBwLmFkZEVsbGlwc2Uocik7CisgICAgLy8gQWRkIGlubmVyIGVsbGlw
c2UKKyAgICByLmluZmxhdGUoLXRoaWNrbmVzcyk7CisgICAgcC5hZGRFbGxpcHNlKHIpOworICAg
IGFkZFBhdGgocCk7CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgY2Fpcm9f
ZmlsbF9ydWxlX3Qgc2F2ZWRGaWxsUnVsZSA9IGNhaXJvX2dldF9maWxsX3J1bGUoY3IpOworICAg
IGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIENBSVJPX0ZJTExfUlVMRV9FVkVOX09ERCk7CisgICAg
Y2Fpcm9fY2xpcChjcik7CisgICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgc2F2ZWRGaWxsUnVs
ZSk7Cit9CisKKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFNoYWRvdyhJbnRTaXplIGNvbnN0
JiwgaW50LCBDb2xvciBjb25zdCYpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9p
ZCBHcmFwaGljc0NvbnRleHQ6OmNsZWFyU2hhZG93KCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgp
OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6YmVnaW5UcmFuc3BhcmVuY3lMYXllcihmbG9h
dCBvcGFjaXR5KQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb19wdXNoX2dyb3Vw
KGNyKTsKKyAgICBtX2RhdGEtPmxheWVycy5hcHBlbmQob3BhY2l0eSk7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0OjplbmRUcmFuc3BhcmVuY3lMYXllcigpCit7CisgICAgaWYgKHBhaW50aW5n
RGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEt
PmNyOworCisgICAgY2Fpcm9fcG9wX2dyb3VwX3RvX3NvdXJjZShjcik7CisgICAgY2Fpcm9fcGFp
bnRfd2l0aF9hbHBoYShjciwgbV9kYXRhLT5sYXllcnMubGFzdCgpKTsKKyAgICBtX2RhdGEtPmxh
eWVycy5yZW1vdmVMYXN0KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGVhclJlY3Qo
Y29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKworICAgIGNh
aXJvX3NhdmUoY3IpOworICAgIGNhaXJvX3JlY3RhbmdsZShjciwgcmVjdC54KCksIHJlY3QueSgp
LCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOworICAgIGNhaXJvX3NldF9vcGVyYXRvcihj
ciwgQ0FJUk9fT1BFUkFUT1JfQ0xFQVIpOworICAgIGNhaXJvX2ZpbGwoY3IpOworICAgIGNhaXJv
X3Jlc3RvcmUoY3IpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c3Ryb2tlUmVjdChjb25z
dCBGbG9hdFJlY3QmIHJlY3QsIGZsb2F0IHdpZHRoKQoreworICAgIGlmIChwYWludGluZ0Rpc2Fi
bGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsK
KyAgICBjYWlyb19zYXZlKGNyKTsKKyAgICBjYWlyb19yZWN0YW5nbGUoY3IsIHJlY3QueCgpLCBy
ZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKKyAgICBzZXRDb2xvcihjciwg
c3Ryb2tlQ29sb3IoKSk7CisgICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgoY3IsIHdpZHRoKTsKKyAg
ICBjYWlyb19zdHJva2UoY3IpOworICAgIGNhaXJvX3Jlc3RvcmUoY3IpOworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDo6c2V0TGluZUNhcChMaW5lQ2FwIGxpbmVDYXApCit7CisgICAgaWYgKHBh
aW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fbGluZV9jYXBf
dCBjYWlyb0NhcCA9IENBSVJPX0xJTkVfQ0FQX0JVVFQ7CisgICAgc3dpdGNoIChsaW5lQ2FwKSB7
CisgICAgICAgIGNhc2UgQnV0dENhcDoKKyAgICAgICAgICAgIC8vIG5vLW9wCisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgY2FzZSBSb3VuZENhcDoKKyAgICAgICAgICAgIGNhaXJvQ2FwID0g
Q0FJUk9fTElORV9DQVBfUk9VTkQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBT
cXVhcmVDYXA6CisgICAgICAgICAgICBjYWlyb0NhcCA9IENBSVJPX0xJTkVfQ0FQX1NRVUFSRTsK
KyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYWlyb19zZXRfbGluZV9jYXAobV9kYXRh
LT5jciwgY2Fpcm9DYXApOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0TGluZUpvaW4o
TGluZUpvaW4gbGluZUpvaW4pCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgY2Fpcm9fbGluZV9qb2luX3QgY2Fpcm9Kb2luID0gQ0FJUk9fTElO
RV9KT0lOX01JVEVSOworICAgIHN3aXRjaCAobGluZUpvaW4pIHsKKyAgICAgICAgY2FzZSBNaXRl
ckpvaW46CisgICAgICAgICAgICAvLyBuby1vcAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IGNhc2UgUm91bmRKb2luOgorICAgICAgICAgICAgY2Fpcm9Kb2luID0gQ0FJUk9fTElORV9KT0lO
X1JPVU5EOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQmV2ZWxKb2luOgorICAg
ICAgICAgICAgY2Fpcm9Kb2luID0gQ0FJUk9fTElORV9KT0lOX0JFVkVMOworICAgICAgICAgICAg
YnJlYWs7CisgICAgfQorICAgIGNhaXJvX3NldF9saW5lX2pvaW4obV9kYXRhLT5jciwgY2Fpcm9K
b2luKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldE1pdGVyTGltaXQoZmxvYXQgbWl0
ZXIpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgY2Fpcm9fc2V0X21pdGVyX2xpbWl0KG1fZGF0YS0+Y3IsIG1pdGVyKTsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHQ6OnNldEFscGhhKGZsb2F0KQoreworICAgIG5vdEltcGxlbWVudGVkKCk7
Cit9CisKK3N0YXRpYyBpbmxpbmUgY2Fpcm9fb3BlcmF0b3JfdCB0b0NhaXJvT3BlcmF0b3IoQ29t
cG9zaXRlT3BlcmF0b3Igb3ApCit7CisgICAgc3dpdGNoIChvcCkgeworICAgICAgICBjYXNlIENv
bXBvc2l0ZUNsZWFyOgorICAgICAgICAgICAgcmV0dXJuIENBSVJPX09QRVJBVE9SX0NMRUFSOwor
ICAgICAgICBjYXNlIENvbXBvc2l0ZUNvcHk6CisgICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BF
UkFUT1JfU09VUkNFOworICAgICAgICBjYXNlIENvbXBvc2l0ZVNvdXJjZU92ZXI6CisgICAgICAg
ICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfT1ZFUjsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVT
b3VyY2VJbjoKKyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9JTjsKKyAgICAgICAg
Y2FzZSBDb21wb3NpdGVTb3VyY2VPdXQ6CisgICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFU
T1JfT1VUOworICAgICAgICBjYXNlIENvbXBvc2l0ZVNvdXJjZUF0b3A6CisgICAgICAgICAgICBy
ZXR1cm4gQ0FJUk9fT1BFUkFUT1JfQVRPUDsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5h
dGlvbk92ZXI6CisgICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfREVTVF9PVkVSOwor
ICAgICAgICBjYXNlIENvbXBvc2l0ZURlc3RpbmF0aW9uSW46CisgICAgICAgICAgICByZXR1cm4g
Q0FJUk9fT1BFUkFUT1JfREVTVF9JTjsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlv
bk91dDoKKyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9ERVNUX09VVDsKKyAgICAg
ICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlvbkF0b3A6CisgICAgICAgICAgICByZXR1cm4gQ0FJ
Uk9fT1BFUkFUT1JfREVTVF9BVE9QOworICAgICAgICBjYXNlIENvbXBvc2l0ZVhPUjoKKyAgICAg
ICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9YT1I7CisgICAgICAgIGNhc2UgQ29tcG9zaXRl
UGx1c0RhcmtlcjoKKyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9TQVRVUkFURTsK
KyAgICAgICAgY2FzZSBDb21wb3NpdGVIaWdobGlnaHQ6CisgICAgICAgICAgICAvLyBUaGVyZSBp
cyBubyBDYWlybyBlcXVpdmFsZW50IGZvciBDb21wb3NpdGVIaWdobGlnaHQuCisgICAgICAgICAg
ICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfT1ZFUjsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVQbHVz
TGlnaHRlcjoKKyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9BREQ7CisgICAgICAg
IGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfU09VUkNFOworICAg
IH0KK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldENvbXBvc2l0ZU9wZXJhdGlvbihDb21w
b3NpdGVPcGVyYXRvciBvcCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBjYWlyb19zZXRfb3BlcmF0b3IobV9kYXRhLT5jciwgdG9DYWlyb09w
ZXJhdG9yKG9wKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpiZWdpblBhdGgoKQorewor
ICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJv
X3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb19uZXdfcGF0aChjcik7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0OjphZGRQYXRoKGNvbnN0IFBhdGgmIHBhdGgpCit7CisgICAgaWYgKHBh
aW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fdCogY3IgPSBt
X2RhdGEtPmNyOworICAgIGNhaXJvX3BhdGhfdCogcCA9IGNhaXJvX2NvcHlfcGF0aChwYXRoLnBs
YXRmb3JtUGF0aCgpLT5tX2NyKTsKKyAgICBjYWlyb19hcHBlbmRfcGF0aChjciwgcCk7CisgICAg
Y2Fpcm9fcGF0aF9kZXN0cm95KHApOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcChj
b25zdCBQYXRoJiBwYXRoKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAg
IHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb19wYXRo
X3QqIHAgPSBjYWlyb19jb3B5X3BhdGgocGF0aC5wbGF0Zm9ybVBhdGgoKS0+bV9jcik7CisgICAg
Y2Fpcm9fYXBwZW5kX3BhdGgoY3IsIHApOworICAgIGNhaXJvX3BhdGhfZGVzdHJveShwKTsKKyAg
ICBjYWlyb19maWxsX3J1bGVfdCBzYXZlZEZpbGxSdWxlID0gY2Fpcm9fZ2V0X2ZpbGxfcnVsZShj
cik7CisgICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgQ0FJUk9fRklMTF9SVUxFX1dJTkRJTkcp
OworICAgIGNhaXJvX2NsaXAoY3IpOworICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIHNhdmVk
RmlsbFJ1bGUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcE91dChjb25zdCBQYXRo
JiBwYXRoKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsK
KworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBkb3VibGUgeDEsIHkxLCB4Miwg
eTI7CisgICAgY2Fpcm9fY2xpcF9leHRlbnRzKGNyLCAmeDEsICZ5MSwgJngyLCAmeTIpOworICAg
IGNhaXJvX3JlY3RhbmdsZShjciwgeDEsIHkxLCB4MiAtIHgxLCB5MiAtIHkxKTsKKyAgICBhZGRQ
YXRoKHBhdGgpOworCisgICAgY2Fpcm9fZmlsbF9ydWxlX3Qgc2F2ZWRGaWxsUnVsZSA9IGNhaXJv
X2dldF9maWxsX3J1bGUoY3IpOworICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIENBSVJPX0ZJ
TExfUlVMRV9FVkVOX09ERCk7CisgICAgY2Fpcm9fY2xpcChjcik7CisgICAgY2Fpcm9fc2V0X2Zp
bGxfcnVsZShjciwgc2F2ZWRGaWxsUnVsZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpy
b3RhdGUoZmxvYXQgcmFkaWFucykKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBjYWlyb19yb3RhdGUobV9kYXRhLT5jciwgcmFkaWFucyk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzY2FsZShjb25zdCBGbG9hdFNpemUmIHNpemUpCit7
CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fp
cm9fc2NhbGUobV9kYXRhLT5jciwgc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBPdXQoY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBp
ZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb190KiBj
ciA9IG1fZGF0YS0+Y3I7CisgICAgZG91YmxlIHgxLCB5MSwgeDIsIHkyOworICAgIGNhaXJvX2Ns
aXBfZXh0ZW50cyhjciwgJngxLCAmeTEsICZ4MiwgJnkyKTsKKyAgICBjYWlyb19yZWN0YW5nbGUo
Y3IsIHgxLCB4MiwgeDIgLSB4MSwgeTIgLSB5MSk7CisgICAgY2Fpcm9fcmVjdGFuZ2xlKGNyLCBy
LngoKSwgci55KCksIHIud2lkdGgoKSwgci5oZWlnaHQoKSk7CisgICAgY2Fpcm9fZmlsbF9ydWxl
X3Qgc2F2ZWRGaWxsUnVsZSA9IGNhaXJvX2dldF9maWxsX3J1bGUoY3IpOworICAgIGNhaXJvX3Nl
dF9maWxsX3J1bGUoY3IsIENBSVJPX0ZJTExfUlVMRV9FVkVOX09ERCk7CisgICAgY2Fpcm9fY2xp
cChjcik7CisgICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgc2F2ZWRGaWxsUnVsZSk7Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwT3V0RWxsaXBzZUluUmVjdChjb25zdCBJbnRSZWN0
JiByKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIFBhdGggcDsKKyAgICBwLmFkZEVsbGlwc2Uocik7CisgICAgY2xpcE91dChwKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxSb3VuZGVkUmVjdChjb25zdCBJbnRSZWN0JiByLCBj
b25zdCBJbnRTaXplJiB0b3BMZWZ0LCBjb25zdCBJbnRTaXplJiB0b3BSaWdodCwgY29uc3QgSW50
U2l6ZSYgYm90dG9tTGVmdCwgY29uc3QgSW50U2l6ZSYgYm90dG9tUmlnaHQsIGNvbnN0IENvbG9y
JiBjb2xvcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgY2Fpcm9fc2F2ZShjcik7Cisg
ICAgYmVnaW5QYXRoKCk7CisgICAgYWRkUGF0aChQYXRoOjpjcmVhdGVSb3VuZGVkUmVjdGFuZ2xl
KHIsIHRvcExlZnQsIHRvcFJpZ2h0LCBib3R0b21MZWZ0LCBib3R0b21SaWdodCkpOworICAgIHNl
dENvbG9yKGNyLCBjb2xvcik7CisgICAgY2Fpcm9fZmlsbChjcik7CisgICAgY2Fpcm9fcmVzdG9y
ZShjcik7Cit9CisKKyNpZiBQTEFURk9STShHVEspCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0
R2RrRXhwb3NlRXZlbnQoR2RrRXZlbnRFeHBvc2UqIGV4cG9zZSkKK3sKKyAgICBtX2RhdGEtPmV4
cG9zZSA9IGV4cG9zZTsKK30KKworR2RrRXZlbnRFeHBvc2UqIEdyYXBoaWNzQ29udGV4dDo6Z2Rr
RXhwb3NlRXZlbnQoKSBjb25zdAoreworICAgIHJldHVybiBtX2RhdGEtPmV4cG9zZTsKK30KKwor
R2RrRHJhd2FibGUqIEdyYXBoaWNzQ29udGV4dDo6Z2RrRHJhd2FibGUoKSBjb25zdAoreworICAg
IGlmICghbV9kYXRhLT5leHBvc2UpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIEdE
S19EUkFXQUJMRShtX2RhdGEtPmV4cG9zZS0+d2luZG93KTsKK30KKworSW50UG9pbnQgR3JhcGhp
Y3NDb250ZXh0Ojp0cmFuc2xhdGVQb2ludChjb25zdCBJbnRQb2ludCYgcG9pbnQpIGNvbnN0Cit7
CisgICAgY2Fpcm9fbWF0cml4X3QgdG07CisgICAgY2Fpcm9fZ2V0X21hdHJpeChtX2RhdGEtPmNy
LCAmdG0pOworICAgIGRvdWJsZSB4ID0gcG9pbnQueCgpOworICAgIGRvdWJsZSB5ID0gcG9pbnQu
eSgpOworCisgICAgY2Fpcm9fbWF0cml4X3RyYW5zZm9ybV9wb2ludCgmdG0sICZ4LCAmeSk7Cisg
ICAgcmV0dXJuIEludFBvaW50KHgsIHkpOworfQorI2VuZGlmCisKK3ZvaWQgR3JhcGhpY3NDb250
ZXh0OjpzZXRVc2VBbnRpYWxpYXNpbmcoYm9vbCBlbmFibGUpCit7CisgICAgaWYgKHBhaW50aW5n
RGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gV2hlbiB0cnVlLCB1c2UgdGhl
IGRlZmF1bHQgQ2Fpcm8gYmFja2VuZCBhbnRpYWxpYXMgbW9kZSAodXN1YWxseSB0aGlzCisgICAg
Ly8gZW5hYmxlcyBzdGFuZGFyZCAnZ3JheXNjYWxlJyBhbnRpYWxpYXNpbmcpOyBmYWxzZSB0byBl
eHBsaWNpdGx5IGRpc2FibGUKKyAgICAvLyBhbnRpYWxpYXNpbmcuIFRoaXMgaXMgdGhlIHNhbWUg
c3RyYXRlZ3kgYXMgdXNlZCBpbiBkcmF3Q29udmV4UG9seWdvbigpLgorICAgIGNhaXJvX3NldF9h
bnRpYWxpYXMobV9kYXRhLT5jciwgZW5hYmxlID8gQ0FJUk9fQU5USUFMSUFTX0RFRkFVTFQgOiBD
QUlST19BTlRJQUxJQVNfTk9ORSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2Vu
ZGlmIC8vIFBMQVRGT1JNKENBSVJPKQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
YWlyby9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVDYWlyby5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlQ2Fpcm8uaAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZUNhaXJvLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTEsNiArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA2IEFwcGxlIENv
bXB1dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IChDKSAyMDA3
IEFscCBUb2tlciA8YWxwQGF0b2tlci5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQnJlbnQg
RnVsZ2hhbSA8YmZ1bGdoYW1AZ21haWwuY29tPgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCkBAIC0yNCw5MDEgKzI1LDU3IEBACiAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKICAqLwogCi0jaW5jbHVk
ZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCiAKLSNpZiBQTEFURk9S
TShDQUlSTykKLQotI2luY2x1ZGUgIkNhaXJvUGF0aC5oIgotI2luY2x1ZGUgIkZsb2F0UmVjdC5o
IgotI2luY2x1ZGUgIkZvbnQuaCIKLSNpbmNsdWRlICJJbnRSZWN0LmgiCi0jaW5jbHVkZSAiTm90
SW1wbGVtZW50ZWQuaCIKLSNpbmNsdWRlICJQYXRoLmgiCi0jaW5jbHVkZSAiU2ltcGxlRm9udERh
dGEuaCIKICNpbmNsdWRlIDxjYWlyby5oPgogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxz
dGRpby5oPgogI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CiAKLSNpZiBQTEFURk9STShXSU4p
Ci0jaW5jbHVkZSA8Y2Fpcm8td2luMzIuaD4KLSNlbmRpZgotCiAjaWYgUExBVEZPUk0oR1RLKQog
I2luY2x1ZGUgPGdkay9nZGsuaD4KICNpbmNsdWRlIDxwYW5nby9wYW5nby5oPgotI2VuZGlmCi0K
LQotI2lmbmRlZiBNX1BJCi0jZGVmaW5lIE1fUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgorI2Vs
aWYgUExBVEZPUk0oV0lOKQorI2luY2x1ZGUgPGNhaXJvLXdpbjMyLmg+CiAjZW5kaWYKIAogbmFt
ZXNwYWNlIFdlYkNvcmUgewogCiBjbGFzcyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUg
ewogcHVibGljOgotICAgIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpOwotICAgIH5H
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKTsKLQotICAgIGNhaXJvX3QqIGNyOwotICAg
IFZlY3RvcjxmbG9hdD4gbGF5ZXJzOwotCisgICAgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2
YXRlKCkKKyAgICAgICAgOiAgY3IoMCkKICNpZiBQTEFURk9STShHVEspCi0gICAgR2RrRXZlbnRF
eHBvc2UqIGV4cG9zZTsKLSNlbmRpZgotfTsKLQotc3RhdGljIGlubGluZSB2b2lkIHNldENvbG9y
KGNhaXJvX3QqIGNyLCBjb25zdCBDb2xvciYgY29sKQotewotICAgIGZsb2F0IHJlZCwgZ3JlZW4s
IGJsdWUsIGFscGhhOwotICAgIGNvbC5nZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsK
LSAgICBjYWlyb19zZXRfc291cmNlX3JnYmEoY3IsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsK
LX0KLQotLy8gQSBmaWxsUmVjdCBoZWxwZXIKLXN0YXRpYyBpbmxpbmUgdm9pZCBmaWxsUmVjdFNv
dXJjZU92ZXIoY2Fpcm9fdCogY3IsIGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgY29uc3QgQ29sb3Im
IGNvbCkKLXsKLSAgICBzZXRDb2xvcihjciwgY29sKTsKLSAgICBjYWlyb19yZWN0YW5nbGUoY3Is
IHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKLSAgICBj
YWlyb19zZXRfb3BlcmF0b3IoY3IsIENBSVJPX09QRVJBVE9SX09WRVIpOwotICAgIGNhaXJvX2Zp
bGwoY3IpOwotfQotCi1HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OkdyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZSgpCi0gICAgOiAgY3IoMCkKLSNpZiBQTEFURk9STShHVEspCi0g
ICAgLCBleHBvc2UoMCkKLSNlbmRpZgotewotfQotCi1HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVBy
aXZhdGU6On5HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKQotewotICAgIGNhaXJvX2Rl
c3Ryb3koY3IpOwotfQotCi0jaWYgUExBVEZPUk0oV0lOKQotR3JhcGhpY3NDb250ZXh0OjpHcmFw
aGljc0NvbnRleHQoSERDIGRjKQotICAgIDogbV9jb21tb24oY3JlYXRlR3JhcGhpY3NDb250ZXh0
UHJpdmF0ZSgpKQotICAgICwgbV9kYXRhKG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZh
dGUpCi17Ci0gICAgaWYgKGRjKSB7Ci0gICAgICAgIGNhaXJvX3N1cmZhY2VfdCogc3VyZmFjZSA9
IGNhaXJvX3dpbjMyX3N1cmZhY2VfY3JlYXRlKGRjKTsKLSAgICAgICAgbV9kYXRhLT5jciA9IGNh
aXJvX2NyZWF0ZShzdXJmYWNlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzZXRQYWludGluZ0Rp
c2FibGVkKHRydWUpOwotICAgICAgICBtX2RhdGEtPmNyID0gMDsKLSAgICB9Ci19Ci0jZW5kaWYK
LQotR3JhcGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRleHQoUGxhdGZvcm1HcmFwaGljc0NvbnRl
eHQqIGNyKQotICAgIDogbV9jb21tb24oY3JlYXRlR3JhcGhpY3NDb250ZXh0UHJpdmF0ZSgpKQot
ICAgICwgbV9kYXRhKG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUpCi17Ci0gICAg
bV9kYXRhLT5jciA9IGNhaXJvX3JlZmVyZW5jZShjcik7Ci0gICAgc2V0UGFpbnRpbmdEaXNhYmxl
ZCghY3IpOwotfQotCi1HcmFwaGljc0NvbnRleHQ6On5HcmFwaGljc0NvbnRleHQoKQotewotICAg
IGRlc3Ryb3lHcmFwaGljc0NvbnRleHRQcml2YXRlKG1fY29tbW9uKTsKLSAgICBkZWxldGUgbV9k
YXRhOwotfQotCi1jYWlyb190KiBHcmFwaGljc0NvbnRleHQ6OnBsYXRmb3JtQ29udGV4dCgpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIG1fZGF0YS0+Y3I7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
OjpzYXZlUGxhdGZvcm1TdGF0ZSgpCi17Ci0gICAgY2Fpcm9fc2F2ZShtX2RhdGEtPmNyKTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnJlc3RvcmVQbGF0Zm9ybVN0YXRlKCkKLXsKLSAgICBj
YWlyb19yZXN0b3JlKG1fZGF0YS0+Y3IpOwotfQotCi0vLyBEcmF3cyBhIGZpbGxlZCByZWN0YW5n
bGUgd2l0aCBhIHN0cm9rZWQgYm9yZGVyLgotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdSZWN0
KGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotICAgIGNhaXJv
X3NhdmUoY3IpOwotCi0gICAgaWYgKGZpbGxDb2xvcigpLmFscGhhKCkpCi0gICAgICAgIGZpbGxS
ZWN0U291cmNlT3ZlcihjciwgcmVjdCwgZmlsbENvbG9yKCkpOwotCi0gICAgaWYgKHN0cm9rZVN0
eWxlKCkgIT0gTm9TdHJva2UpIHsKLSAgICAgICAgc2V0Q29sb3IoY3IsIHN0cm9rZUNvbG9yKCkp
OwotICAgICAgICBGbG9hdFJlY3QgcihyZWN0KTsKLSAgICAgICAgci5pbmZsYXRlKC0uNWYpOwot
ICAgICAgICBjYWlyb19yZWN0YW5nbGUoY3IsIHIueCgpLCByLnkoKSwgci53aWR0aCgpLCByLmhl
aWdodCgpKTsKLSAgICAgICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgoY3IsIDEuMCk7Ci0gICAgICAg
IGNhaXJvX3N0cm9rZShjcik7Ci0gICAgfQotCi0gICAgY2Fpcm9fcmVzdG9yZShjcik7Ci19Ci0K
LS8vIEZJWE1FOiBOb3cgdGhhdCB0aGlzIGlzIHJlZmFjdG9yZWQsIGl0IHNob3VsZCBiZSBzaGFy
ZWQgYnkgYWxsIGNvbnRleHRzLgotc3RhdGljIHZvaWQgYWRqdXN0TGluZVRvUGl4ZWxCb3VuZGFy
aWVzKEZsb2F0UG9pbnQmIHAxLCBGbG9hdFBvaW50JiBwMiwgZmxvYXQgc3Ryb2tlV2lkdGgsIFN0
cm9rZVN0eWxlIHN0eWxlKQotewotICAgIC8vIEZvciBvZGQgd2lkdGhzLCB3ZSBhZGQgaW4gMC41
IHRvIHRoZSBhcHByb3ByaWF0ZSB4L3kgc28gdGhhdCB0aGUgZmxvYXQgYXJpdGhtZXRpYwotICAg
IC8vIHdvcmtzIG91dC4gIEZvciBleGFtcGxlLCB3aXRoIGEgYm9yZGVyIHdpZHRoIG9mIDMsIEtI
VE1MIHdpbGwgcGFzcyB1cyAoeTEreTIpLzIsIGUuZy4sCi0gICAgLy8gKDUwKzUzKS8yID0gMTAz
LzIgPSA1MSB3aGVuIHdlIHdhbnQgNTEuNS4gIEl0IGlzIGFsd2F5cyB0cnVlIHRoYXQgYW4gZXZl
biB3aWR0aCBnYXZlCi0gICAgLy8gdXMgYSBwZXJmZWN0IHBvc2l0aW9uLCBidXQgYW4gb2RkIHdp
ZHRoIGdhdmUgdXMgYSBwb3NpdGlvbiB0aGF0IGlzIG9mZiBieSBleGFjdGx5IDAuNS4KLSAgICBp
ZiAoc3R5bGUgPT0gRG90dGVkU3Ryb2tlIHx8IHN0eWxlID09IERhc2hlZFN0cm9rZSkgewotICAg
ICAgICBpZiAocDEueCgpID09IHAyLngoKSkgewotICAgICAgICAgICAgcDEuc2V0WShwMS55KCkg
KyBzdHJva2VXaWR0aCk7Ci0gICAgICAgICAgICBwMi5zZXRZKHAyLnkoKSAtIHN0cm9rZVdpZHRo
KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHAxLnNldFgocDEueCgp
ICsgc3Ryb2tlV2lkdGgpOwotICAgICAgICAgICAgcDIuc2V0WChwMi54KCkgLSBzdHJva2VXaWR0
aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihzdHJva2VX
aWR0aCkgJSAyKSB7Ci0gICAgICAgIGlmIChwMS54KCkgPT0gcDIueCgpKSB7Ci0gICAgICAgICAg
ICAvLyBXZSdyZSBhIHZlcnRpY2FsIGxpbmUuICBBZGp1c3Qgb3VyIHguCi0gICAgICAgICAgICBw
MS5zZXRYKHAxLngoKSArIDAuNSk7Ci0gICAgICAgICAgICBwMi5zZXRYKHAyLngoKSArIDAuNSk7
Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBXZSdyZSBhIGhvcml6
b250YWwgbGluZS4gQWRqdXN0IG91ciB5LgotICAgICAgICAgICAgcDEuc2V0WShwMS55KCkgKyAw
LjUpOwotICAgICAgICAgICAgcDIuc2V0WShwMi55KCkgKyAwLjUpOwotICAgICAgICB9Ci0gICAg
fQotfQotCi0vLyBUaGlzIGlzIG9ubHkgdXNlZCB0byBkcmF3IGJvcmRlcnMuCi12b2lkIEdyYXBo
aWNzQ29udGV4dDo6ZHJhd0xpbmUoY29uc3QgSW50UG9pbnQmIHBvaW50MSwgY29uc3QgSW50UG9p
bnQmIHBvaW50MikKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBTdHJva2VTdHlsZSBzdHlsZSA9IHN0cm9rZVN0eWxlKCk7Ci0gICAgaWYgKHN0
eWxlID09IE5vU3Ryb2tlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1f
ZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fc2F2ZShjcik7Ci0KLSAgICBmbG9hdCB3aWR0aCA9IHN0cm9r
ZVRoaWNrbmVzcygpOwotICAgIGlmICh3aWR0aCA8IDEpCi0gICAgICAgIHdpZHRoID0gMTsKLQot
ICAgIEZsb2F0UG9pbnQgcDEgPSBwb2ludDE7Ci0gICAgRmxvYXRQb2ludCBwMiA9IHBvaW50MjsK
LSAgICBib29sIGlzVmVydGljYWxMaW5lID0gKHAxLngoKSA9PSBwMi54KCkpOwotIAotICAgIGFk
anVzdExpbmVUb1BpeGVsQm91bmRhcmllcyhwMSwgcDIsIHdpZHRoLCBzdHlsZSk7Ci0gICAgY2Fp
cm9fc2V0X2xpbmVfd2lkdGgoY3IsIHdpZHRoKTsKLQotICAgIGludCBwYXRXaWR0aCA9IDA7Ci0g
ICAgc3dpdGNoIChzdHlsZSkgewotICAgIGNhc2UgTm9TdHJva2U6Ci0gICAgY2FzZSBTb2xpZFN0
cm9rZToKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEb3R0ZWRTdHJva2U6Ci0gICAgICAgIHBh
dFdpZHRoID0gc3RhdGljX2Nhc3Q8aW50Pih3aWR0aCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNh
c2UgRGFzaGVkU3Ryb2tlOgotICAgICAgICBwYXRXaWR0aCA9IDMqc3RhdGljX2Nhc3Q8aW50Pih3
aWR0aCk7Ci0gICAgICAgIGJyZWFrOworICAgICAgICAsIGV4cG9zZSgwKQorI2VsaWYgUExBVEZP
Uk0oV0lOKQorICAgICAgICAvLyBOT1RFOiAgVGhlc2UgbWF5IG5vdGUgYmUgbmVlZGVkOiByZXZp
ZXcgYW5kIHJlbW92ZSBvbmNlIENhaXJvIGltcGxlbWVudGF0aW9uIGlzIGNvbXBsZXRlCisgICAg
ICAgICwgbV9oZGMoMCkKKyAgICAgICAgLCBtX3RyYW5zcGFyZW5jeUNvdW50KDApCisjZW5kaWYK
KyAgICB7CiAgICAgfQogCi0gICAgc2V0Q29sb3IoY3IsIHN0cm9rZUNvbG9yKCkpOwotCi0gICAg
Y2Fpcm9fc2V0X2FudGlhbGlhcyhjciwgQ0FJUk9fQU5USUFMSUFTX05PTkUpOwotCi0gICAgaWYg
KHBhdFdpZHRoKSB7Ci0gICAgICAgIC8vIERvIGEgcmVjdCBmaWxsIG9mIG91ciBlbmRwb2ludHMu
ICBUaGlzIGVuc3VyZXMgd2UgYWx3YXlzIGhhdmUgdGhlCi0gICAgICAgIC8vIGFwcGVhcmFuY2Ug
b2YgYmVpbmcgYSBib3JkZXIuICBXZSB0aGVuIGRyYXcgdGhlIGFjdHVhbCBkb3R0ZWQvZGFzaGVk
IGxpbmUuCi0gICAgICAgIGlmIChpc1ZlcnRpY2FsTGluZSkgewotICAgICAgICAgICAgZmlsbFJl
Y3RTb3VyY2VPdmVyKGNyLCBGbG9hdFJlY3QocDEueCgpIC0gd2lkdGgvMiwgcDEueSgpIC0gd2lk
dGgsIHdpZHRoLCB3aWR0aCksIHN0cm9rZUNvbG9yKCkpOwotICAgICAgICAgICAgZmlsbFJlY3RT
b3VyY2VPdmVyKGNyLCBGbG9hdFJlY3QocDIueCgpIC0gd2lkdGgvMiwgcDIueSgpLCB3aWR0aCwg
d2lkdGgpLCBzdHJva2VDb2xvcigpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZp
bGxSZWN0U291cmNlT3ZlcihjciwgRmxvYXRSZWN0KHAxLngoKSAtIHdpZHRoLCBwMS55KCkgLSB3
aWR0aC8yLCB3aWR0aCwgd2lkdGgpLCBzdHJva2VDb2xvcigpKTsKLSAgICAgICAgICAgIGZpbGxS
ZWN0U291cmNlT3ZlcihjciwgRmxvYXRSZWN0KHAyLngoKSwgcDIueSgpIC0gd2lkdGgvMiwgd2lk
dGgsIHdpZHRoKSwgc3Ryb2tlQ29sb3IoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFeGFt
cGxlOiA4MCBwaXhlbHMgd2l0aCBhIHdpZHRoIG9mIDMwIHBpeGVscy4KLSAgICAgICAgLy8gUmVt
YWluZGVyIGlzIDIwLiAgVGhlIG1heGltdW0gcGl4ZWxzIG9mIGxpbmUgd2UgY291bGQgcGFpbnQK
LSAgICAgICAgLy8gd2lsbCBiZSA1MCBwaXhlbHMuCi0gICAgICAgIGludCBkaXN0YW5jZSA9IChp
c1ZlcnRpY2FsTGluZSA/IChwb2ludDIueSgpIC0gcG9pbnQxLnkoKSkgOiAocG9pbnQyLngoKSAt
IHBvaW50MS54KCkpKSAtIDIqc3RhdGljX2Nhc3Q8aW50Pih3aWR0aCk7Ci0gICAgICAgIGludCBy
ZW1haW5kZXIgPSBkaXN0YW5jZSVwYXRXaWR0aDsKLSAgICAgICAgaW50IGNvdmVyYWdlID0gZGlz
dGFuY2UtcmVtYWluZGVyOwotICAgICAgICBpbnQgbnVtU2VnbWVudHMgPSBjb3ZlcmFnZS9wYXRX
aWR0aDsKLQotICAgICAgICBmbG9hdCBwYXR0ZXJuT2Zmc2V0ID0gMDsKLSAgICAgICAgLy8gU3Bl
Y2lhbCBjYXNlIDFweCBkb3R0ZWQgYm9yZGVycyBmb3Igc3BlZWQuCi0gICAgICAgIGlmIChwYXRX
aWR0aCA9PSAxKQotICAgICAgICAgICAgcGF0dGVybk9mZnNldCA9IDEuMDsKLSAgICAgICAgZWxz
ZSB7Ci0gICAgICAgICAgICBib29sIGV2ZW5OdW1iZXJPZlNlZ21lbnRzID0gbnVtU2VnbWVudHMl
MiA9PSAwOwotICAgICAgICAgICAgaWYgKHJlbWFpbmRlcikKLSAgICAgICAgICAgICAgICBldmVu
TnVtYmVyT2ZTZWdtZW50cyA9ICFldmVuTnVtYmVyT2ZTZWdtZW50czsKLSAgICAgICAgICAgIGlm
IChldmVuTnVtYmVyT2ZTZWdtZW50cykgewotICAgICAgICAgICAgICAgIGlmIChyZW1haW5kZXIp
IHsKLSAgICAgICAgICAgICAgICAgICAgcGF0dGVybk9mZnNldCArPSBwYXRXaWR0aCAtIHJlbWFp
bmRlcjsKLSAgICAgICAgICAgICAgICAgICAgcGF0dGVybk9mZnNldCArPSByZW1haW5kZXIvMjsK
LSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAg
ICAgICBwYXR0ZXJuT2Zmc2V0ID0gcGF0V2lkdGgvMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIGVsc2UgaWYgKCFldmVuTnVtYmVyT2ZTZWdtZW50cykgewotICAgICAgICAgICAgICAgIGlm
IChyZW1haW5kZXIpCi0gICAgICAgICAgICAgICAgICAgIHBhdHRlcm5PZmZzZXQgPSAocGF0V2lk
dGggLSByZW1haW5kZXIpLzI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBk
b3VibGUgZGFzaCA9IHBhdFdpZHRoOwotICAgICAgICBjYWlyb19zZXRfZGFzaChjciwgJmRhc2gs
IDEsIHBhdHRlcm5PZmZzZXQpOworICAgIH5HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUo
KQorICAgIHsKKyAgICAgICAgY2Fpcm9fZGVzdHJveShjcik7CiAgICAgfQogCi0gICAgY2Fpcm9f
bW92ZV90byhjciwgcDEueCgpLCBwMS55KCkpOwotICAgIGNhaXJvX2xpbmVfdG8oY3IsIHAyLngo
KSwgcDIueSgpKTsKLQotICAgIGNhaXJvX3N0cm9rZShjcik7Ci0gICAgY2Fpcm9fcmVzdG9yZShj
cik7Ci19Ci0KLS8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZCB0byBkcmF3IHRoZSBsaXR0bGUg
Y2lyY2xlcyB1c2VkIGluIGxpc3RzLgotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdFbGxpcHNl
KGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotICAgIGNhaXJv
X3NhdmUoY3IpOwotICAgIGZsb2F0IHlSYWRpdXMgPSAuNSAqIHJlY3QuaGVpZ2h0KCk7Ci0gICAg
ZmxvYXQgeFJhZGl1cyA9IC41ICogcmVjdC53aWR0aCgpOwotICAgIGNhaXJvX3RyYW5zbGF0ZShj
ciwgcmVjdC54KCkgKyB4UmFkaXVzLCByZWN0LnkoKSArIHlSYWRpdXMpOwotICAgIGNhaXJvX3Nj
YWxlKGNyLCB4UmFkaXVzLCB5UmFkaXVzKTsKLSAgICBjYWlyb19hcmMoY3IsIDAuLCAwLiwgMS4s
IDAuLCAyICogTV9QSSk7Ci0gICAgY2Fpcm9fcmVzdG9yZShjcik7Ci0KLSAgICBpZiAoZmlsbENv
bG9yKCkuYWxwaGEoKSkgewotICAgICAgICBzZXRDb2xvcihjciwgZmlsbENvbG9yKCkpOwotICAg
ICAgICBjYWlyb19maWxsX3ByZXNlcnZlKGNyKTsKLSAgICB9Ci0KLSAgICBpZiAoc3Ryb2tlU3R5
bGUoKSAhPSBOb1N0cm9rZSkgewotICAgICAgICBzZXRDb2xvcihjciwgc3Ryb2tlQ29sb3IoKSk7
Ci0gICAgICAgIGNhaXJvX3NldF9saW5lX3dpZHRoKGNyLCBzdHJva2VUaGlja25lc3MoKSk7Ci0g
ICAgICAgIGNhaXJvX3N0cm9rZShjcik7Ci0gICAgfQotCi0gICAgY2Fpcm9fbmV3X3BhdGgoY3Ip
OwotfQotCi0vLyBGSVhNRTogVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSBhZGp1c3RlZCB0byBt
YXRjaCB0aGUgZnVuY3Rpb25hbGl0eSBvbiB0aGUgTWFjIHNpZGUuCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDo6c3Ryb2tlQXJjKGNvbnN0IEludFJlY3QmIHJlY3QsIGludCBzdGFydEFuZ2xlLCBpbnQg
YW5nbGVTcGFuKQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIGlmIChzdHJva2VTdHlsZSgpID09IE5vU3Ryb2tlKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBpbnQgeCA9IHJlY3QueCgpOwotICAgIGludCB5ID0gcmVjdC55KCk7Ci0gICAgZmxv
YXQgdyA9IHJlY3Qud2lkdGgoKTsKLSNpZiAwIC8vIEZJWE1FOiB1bnVzZWQgc28gZmFyCi0gICAg
ZmxvYXQgaCA9IHJlY3QuaGVpZ2h0KCk7Ci0gICAgZmxvYXQgc2NhbGVGYWN0b3IgPSBoIC8gdzsK
LSAgICBmbG9hdCByZXZlcnNlU2NhbGVGYWN0b3IgPSB3IC8gaDsKLSNlbmRpZgotICAgIGZsb2F0
IHIgPSB3IC8gMjsKLSAgICBmbG9hdCBmYSA9IHN0YXJ0QW5nbGU7Ci0gICAgZmxvYXQgZmFsZW4g
PSAgZmEgKyBhbmdsZVNwYW47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAg
Y2Fpcm9fc2F2ZShjcik7Ci0gICAgY2Fpcm9fYXJjX25lZ2F0aXZlKGNyLCB4ICsgciwgeSArIHIs
IHIsIC1mYSAqIE1fUEkvMTgwLCAtZmFsZW4gKiBNX1BJLzE4MCk7Ci0gICAgc2V0Q29sb3IoY3Is
IHN0cm9rZUNvbG9yKCkpOwotICAgIGNhaXJvX3NldF9saW5lX3dpZHRoKGNyLCBzdHJva2VUaGlj
a25lc3MoKSk7Ci0gICAgY2Fpcm9fc3Ryb2tlKGNyKTsKLSAgICBjYWlyb19yZXN0b3JlKGNyKTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdDb252ZXhQb2x5Z29uKHNpemVfdCBucG9p
bnRzLCBjb25zdCBGbG9hdFBvaW50KiBwb2ludHMsIGJvb2wgc2hvdWxkQW50aWFsaWFzKQotewot
ICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChu
cG9pbnRzIDw9IDEpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRh
LT5jcjsKLQotICAgIGNhaXJvX3NhdmUoY3IpOwotICAgIGNhaXJvX3NldF9hbnRpYWxpYXMoY3Is
IHNob3VsZEFudGlhbGlhcyA/IENBSVJPX0FOVElBTElBU19ERUZBVUxUIDogQ0FJUk9fQU5USUFM
SUFTX05PTkUpOwotICAgIGNhaXJvX21vdmVfdG8oY3IsIHBvaW50c1swXS54KCksIHBvaW50c1sw
XS55KCkpOwotICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbnBvaW50czsgaSsrKQotICAgICAg
ICBjYWlyb19saW5lX3RvKGNyLCBwb2ludHNbaV0ueCgpLCBwb2ludHNbaV0ueSgpKTsKLSAgICBj
YWlyb19jbG9zZV9wYXRoKGNyKTsKLQotICAgIGlmIChmaWxsQ29sb3IoKS5hbHBoYSgpKSB7Ci0g
ICAgICAgIHNldENvbG9yKGNyLCBmaWxsQ29sb3IoKSk7Ci0gICAgICAgIGNhaXJvX3NldF9maWxs
X3J1bGUoY3IsIENBSVJPX0ZJTExfUlVMRV9FVkVOX09ERCk7Ci0gICAgICAgIGNhaXJvX2ZpbGxf
cHJlc2VydmUoY3IpOwotICAgIH0KLQotICAgIGlmIChzdHJva2VTdHlsZSgpICE9IE5vU3Ryb2tl
KSB7Ci0gICAgICAgIHNldENvbG9yKGNyLCBzdHJva2VDb2xvcigpKTsKLSAgICAgICAgY2Fpcm9f
c2V0X2xpbmVfd2lkdGgoY3IsIHN0cm9rZVRoaWNrbmVzcygpKTsKLSAgICAgICAgY2Fpcm9fc3Ry
b2tlKGNyKTsKLSAgICB9Ci0KLSAgICBjYWlyb19uZXdfcGF0aChjcik7Ci0gICAgY2Fpcm9fcmVz
dG9yZShjcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpmaWxsUmVjdChjb25zdCBJbnRS
ZWN0JiByZWN0LCBjb25zdCBDb2xvciYgY29sb3IpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJs
ZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKGNvbG9yLmFscGhhKCkpCi0gICAgICAg
IGZpbGxSZWN0U291cmNlT3ZlcihtX2RhdGEtPmNyLCByZWN0LCBjb2xvcik7Ci19Ci0KLXZvaWQg
R3JhcGhpY3NDb250ZXh0OjpmaWxsUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0IENv
bG9yJiBjb2xvcikKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBpZiAoY29sb3IuYWxwaGEoKSkKLSAgICAgICAgZmlsbFJlY3RTb3VyY2VPdmVy
KG1fZGF0YS0+Y3IsIHJlY3QsIGNvbG9yKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNs
aXAoY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fp
cm9fcmVjdGFuZ2xlKGNyLCByZWN0LngoKSwgcmVjdC55KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5o
ZWlnaHQoKSk7Ci0gICAgY2Fpcm9fZmlsbF9ydWxlX3Qgc2F2ZWRGaWxsUnVsZSA9IGNhaXJvX2dl
dF9maWxsX3J1bGUoY3IpOwotICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIENBSVJPX0ZJTExf
UlVMRV9XSU5ESU5HKTsKLSAgICBjYWlyb19jbGlwKGNyKTsKLSAgICBjYWlyb19zZXRfZmlsbF9y
dWxlKGNyLCBzYXZlZEZpbGxSdWxlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdG
b2N1c1JpbmcoY29uc3QgQ29sb3ImIGNvbG9yKQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVk
KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGludCByYWRpdXMgPSAoZm9jdXNSaW5nV2lkdGgo
KSAtIDEpIC8gMjsKLSAgICBpbnQgb2Zmc2V0ID0gcmFkaXVzICsgZm9jdXNSaW5nT2Zmc2V0KCk7
Ci0KLSAgICBjb25zdCBWZWN0b3I8SW50UmVjdD4mIHJlY3RzID0gZm9jdXNSaW5nUmVjdHMoKTsK
LSAgICB1bnNpZ25lZCByZWN0Q291bnQgPSByZWN0cy5zaXplKCk7Ci0gICAgSW50UmVjdCBmaW5h
bEZvY3VzUmVjdDsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcmVjdENvdW50OyBpKysp
IHsKLSAgICAgICAgSW50UmVjdCBmb2N1c1JlY3QgPSByZWN0c1tpXTsKLSAgICAgICAgZm9jdXNS
ZWN0LmluZmxhdGUob2Zmc2V0KTsKLSAgICAgICAgZmluYWxGb2N1c1JlY3QudW5pdGUoZm9jdXNS
ZWN0KTsKLSAgICB9Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9f
c2F2ZShjcik7Ci0gICAgLy8gRklYTUU6IFRoZXNlIHJlY3RzIHNob3VsZCBiZSByb3VuZGVkCi0g
ICAgY2Fpcm9fcmVjdGFuZ2xlKGNyLCBmaW5hbEZvY3VzUmVjdC54KCksIGZpbmFsRm9jdXNSZWN0
LnkoKSwgZmluYWxGb2N1c1JlY3Qud2lkdGgoKSwgZmluYWxGb2N1c1JlY3QuaGVpZ2h0KCkpOwot
Ci0gICAgLy8gRm9yY2UgdGhlIGFscGhhIHRvIDUwJS4gIFRoaXMgbWF0Y2hlcyB3aGF0IHRoZSBN
YWMgZG9lcyB3aXRoIG91dGxpbmUgcmluZ3MuCi0gICAgQ29sb3IgcmluZ0NvbG9yKGNvbG9yLnJl
ZCgpLCBjb2xvci5ncmVlbigpLCBjb2xvci5ibHVlKCksIDEyNyk7Ci0gICAgc2V0Q29sb3IoY3Is
IHJpbmdDb2xvcik7Ci0gICAgY2Fpcm9fc3Ryb2tlKGNyKTsKLSAgICBjYWlyb19yZXN0b3JlKGNy
KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yVGV4dChjb25zdCBJbnRQ
b2ludCYgb3JpZ2luLCBpbnQgd2lkdGgsIGJvb2wgcHJpbnRpbmcpCi17Ci0gICAgaWYgKHBhaW50
aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gVGhpcyBpcyBhIHdvcmth
cm91bmQgZm9yIGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NjU5Ci0g
ICAgU3Ryb2tlU3R5bGUgc2F2ZWRTdHJva2VTdHlsZSA9IHN0cm9rZVN0eWxlKCk7Ci0gICAgc2V0
U3Ryb2tlU3R5bGUoU29saWRTdHJva2UpOwotCi0gICAgSW50UG9pbnQgZW5kUG9pbnQgPSBvcmln
aW4gKyBJbnRTaXplKHdpZHRoLCAwKTsKLSAgICBkcmF3TGluZShvcmlnaW4sIGVuZFBvaW50KTsK
LQotICAgIHNldFN0cm9rZVN0eWxlKHNhdmVkU3Ryb2tlU3R5bGUpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JNaXNzcGVsbGluZ09yQmFkR3JhbW1hcihjb25zdCBJbnRQ
b2ludCYgb3JpZ2luLCBpbnQgd2lkdGgsIGJvb2wgZ3JhbW1hcikKLXsKLSAgICBpZiAocGFpbnRp
bmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSNpZiBQTEFURk9STShHVEspCi0gICAg
Y2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotICAgIGNhaXJvX3NhdmUoY3IpOwotCi0gICAgLy8g
Q29udmVudGlvbiBpcyBncmVlbiBmb3IgZ3JhbW1hciwgcmVkIGZvciBzcGVsbGluZwotICAgIC8v
IFRoZXNlIG5lZWQgdG8gYmVjb21lIGNvbmZpZ3VyYWJsZQotICAgIGlmIChncmFtbWFyKQotICAg
ICAgICBjYWlyb19zZXRfc291cmNlX3JnYihjciwgMCwgMSwgMCk7Ci0gICAgZWxzZQotICAgICAg
ICBjYWlyb19zZXRfc291cmNlX3JnYihjciwgMSwgMCwgMCk7Ci0KLSAgICAvLyBXZSBpZ25vcmUg
bW9zdCBvZiB0aGUgcHJvdmlkZWQgY29uc3RhbnRzIGluIGZhdm91ciBvZiB0aGUgcGxhdGZvcm0g
c3R5bGUKLSAgICBwYW5nb19jYWlyb19zaG93X2Vycm9yX3VuZGVybGluZShjciwgb3JpZ2luLngo
KSwgb3JpZ2luLnkoKSwgd2lkdGgsIGNNaXNzcGVsbGluZ0xpbmVUaGlja25lc3MpOwotCi0gICAg
Y2Fpcm9fcmVzdG9yZShjcik7Ci0jZWxzZQotICAgIG5vdEltcGxlbWVudGVkKCk7CisjaWYgUExB
VEZPUk0oV0lOKQorICAgIC8vIE9uIFdpbmRvd3MsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBIREMg
Zm9yIGZvcm0gY29udHJvbHMgdG8gZHJhdyBpbiB0aGUgcmlnaHQgcGxhY2UuCisgICAgdm9pZCBi
ZWdpblRyYW5zcGFyZW5jeUxheWVyKCkgeyBtX3RyYW5zcGFyZW5jeUNvdW50Kys7IH0KKyAgICB2
b2lkIGVuZFRyYW5zcGFyZW5jeUxheWVyKCkgeyBtX3RyYW5zcGFyZW5jeUNvdW50LS07IH0KICNl
bmRpZgotfQotCi1GbG9hdFJlY3QgR3JhcGhpY3NDb250ZXh0Ojpyb3VuZFRvRGV2aWNlUGl4ZWxz
KGNvbnN0IEZsb2F0UmVjdCYgZnJlY3QpCi17Ci0gICAgRmxvYXRSZWN0IHJlc3VsdDsKLSAgICBk
b3VibGUgeCA9IGZyZWN0LngoKTsKLSAgICBkb3VibGUgeSA9IGZyZWN0LnkoKTsKLSAgICBjYWly
b190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fdXNlcl90b19kZXZpY2UoY3IsICZ4LCAm
eSk7Ci0gICAgeCA9IHJvdW5kKHgpOwotICAgIHkgPSByb3VuZCh5KTsKLSAgICBjYWlyb19kZXZp
Y2VfdG9fdXNlcihjciwgJngsICZ5KTsKLSAgICByZXN1bHQuc2V0WChzdGF0aWNfY2FzdDxmbG9h
dD4oeCkpOwotICAgIHJlc3VsdC5zZXRZKHN0YXRpY19jYXN0PGZsb2F0Pih5KSk7Ci0gICAgeCA9
IGZyZWN0LndpZHRoKCk7Ci0gICAgeSA9IGZyZWN0LmhlaWdodCgpOwotICAgIGNhaXJvX3VzZXJf
dG9fZGV2aWNlX2Rpc3RhbmNlKGNyLCAmeCwgJnkpOwotICAgIHggPSByb3VuZCh4KTsKLSAgICB5
ID0gcm91bmQoeSk7Ci0gICAgY2Fpcm9fZGV2aWNlX3RvX3VzZXJfZGlzdGFuY2UoY3IsICZ4LCAm
eSk7Ci0gICAgcmVzdWx0LnNldFdpZHRoKHN0YXRpY19jYXN0PGZsb2F0Pih4KSk7Ci0gICAgcmVz
dWx0LnNldEhlaWdodChzdGF0aWNfY2FzdDxmbG9hdD4oeSkpOwotICAgIHJldHVybiByZXN1bHQ7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0Ojp0cmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSkK
LXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBj
YWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fdHJhbnNsYXRlKGNyLCB4LCB5KTsK
LX0KLQotSW50UG9pbnQgR3JhcGhpY3NDb250ZXh0OjpvcmlnaW4oKQotewotICAgIGNhaXJvX21h
dHJpeF90IG1hdHJpeDsKLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9f
Z2V0X21hdHJpeChjciwgJm1hdHJpeCk7Ci0gICAgcmV0dXJuIEludFBvaW50KHN0YXRpY19jYXN0
PGludD4obWF0cml4LngwKSwgc3RhdGljX2Nhc3Q8aW50PihtYXRyaXgueTApKTsKLX0KLQotdm9p
ZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtRmlsbENvbG9yKGNvbnN0IENvbG9yJiBjb2wp
Ci17Ci0gICAgLy8gRklYTUU6IHRoaXMgaXMgcHJvYmFibHkgYSBuby1vcCBidXQgSSdtIG5vdCBz
dXJlCi0gICAgLy8gbm90SW1wbGVtZW50ZWQoKTsgLy8gY29tbWVudGVkLW91dCBiZWNhdXNlIGl0
J3MgY2hhdHR5IGFuZCBjbHV0dGVycyBvdXRwdXQKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6
OnNldFBsYXRmb3JtU3Ryb2tlQ29sb3IoY29uc3QgQ29sb3ImIGNvbCkKLXsKLSAgICAvLyBGSVhN
RTogdGhpcyBpcyBwcm9iYWJseSBhIG5vLW9wIGJ1dCBJJ20gbm90IHN1cmUKLSAgICAvL25vdElt
cGxlbWVudGVkKCk7IC8vIGNvbW1lbnRlZC1vdXQgYmVjYXVzZSBpdCdzIGNoYXR0eSBhbmQgY2x1
dHRlcnMgb3V0cHV0Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVN0cm9r
ZVRoaWNrbmVzcyhmbG9hdCBzdHJva2VUaGlja25lc3MpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlz
YWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgobV9k
YXRhLT5jciwgc3Ryb2tlVGhpY2tuZXNzKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNl
dFBsYXRmb3JtU3Ryb2tlU3R5bGUoY29uc3QgU3Ryb2tlU3R5bGUmIHN0cm9rZVN0eWxlKQotewot
ICAgIHN0YXRpYyBkb3VibGUgZGFzaFBhdHRlcm5bXSA9IHs1LjAsIDUuMH07Ci0gICAgc3RhdGlj
IGRvdWJsZSBkb3RQYXR0ZXJuW10gPSB7MS4wLCAxLjB9OwotCi0gICAgaWYgKHBhaW50aW5nRGlz
YWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgc3dpdGNoIChzdHJva2VTdHlsZSkgewot
ICAgIGNhc2UgTm9TdHJva2U6Ci0gICAgICAgIC8vIEZJWE1FOiBpcyBpdCB0aGUgcmlnaHQgd2F5
IHRvIGVtdWxhdGUgTm9TdHJva2U/Ci0gICAgICAgIGNhaXJvX3NldF9saW5lX3dpZHRoKG1fZGF0
YS0+Y3IsIDApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFNvbGlkU3Ryb2tlOgotICAgICAg
ICBjYWlyb19zZXRfZGFzaChtX2RhdGEtPmNyLCAwLCAwLCAwKTsKLSAgICAgICAgYnJlYWs7Ci0g
ICAgY2FzZSBEb3R0ZWRTdHJva2U6Ci0gICAgICAgIGNhaXJvX3NldF9kYXNoKG1fZGF0YS0+Y3Is
IGRvdFBhdHRlcm4sIDIsIDApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERhc2hlZFN0cm9r
ZToKLSAgICAgICAgY2Fpcm9fc2V0X2Rhc2gobV9kYXRhLT5jciwgZGFzaFBhdHRlcm4sIDIsIDAp
OwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBub3RJbXBsZW1lbnRlZCgp
OwotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRV
UkxGb3JSZWN0KGNvbnN0IEtVUkwmIGxpbmssIGNvbnN0IEludFJlY3QmIGRlc3RSZWN0KQotewot
ICAgIG5vdEltcGxlbWVudGVkKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0Ojpjb25jYXRD
VE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFuc2Zvcm0pCi17Ci0gICAgaWYgKHBhaW50aW5n
RGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEt
PmNyOwotICAgIGNvbnN0IGNhaXJvX21hdHJpeF90KiBtYXRyaXggPSByZWludGVycHJldF9jYXN0
PGNvbnN0IGNhaXJvX21hdHJpeF90Kj4oJnRyYW5zZm9ybSk7Ci0gICAgY2Fpcm9fdHJhbnNmb3Jt
KGNyLCBtYXRyaXgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6YWRkSW5uZXJSb3VuZGVk
UmVjdENsaXAoY29uc3QgSW50UmVjdCYgcmVjdCwgaW50IHRoaWNrbmVzcykKLXsKLSAgICBpZiAo
cGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjbGlwKHJlY3QpOwot
Ci0gICAgUGF0aCBwOwotICAgIEZsb2F0UmVjdCByKHJlY3QpOwotICAgIC8vIEFkZCBvdXRlciBl
bGxpcHNlCi0gICAgcC5hZGRFbGxpcHNlKHIpOwotICAgIC8vIEFkZCBpbm5lciBlbGxpcHNlCi0g
ICAgci5pbmZsYXRlKC10aGlja25lc3MpOwotICAgIHAuYWRkRWxsaXBzZShyKTsKLSAgICBhZGRQ
YXRoKHApOwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotICAgIGNhaXJvX2ZpbGxf
cnVsZV90IHNhdmVkRmlsbFJ1bGUgPSBjYWlyb19nZXRfZmlsbF9ydWxlKGNyKTsKLSAgICBjYWly
b19zZXRfZmlsbF9ydWxlKGNyLCBDQUlST19GSUxMX1JVTEVfRVZFTl9PREQpOwotICAgIGNhaXJv
X2NsaXAoY3IpOwotICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIHNhdmVkRmlsbFJ1bGUpOwot
fQotCi0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRTaGFkb3coSW50U2l6ZSBjb25zdCYsIGlu
dCwgQ29sb3IgY29uc3QmKQotewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpjbGVhclNoYWRvdygpCi17Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmJlZ2luVHJhbnNwYXJlbmN5TGF5ZXIoZmxvYXQgb3Bh
Y2l0eSkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fcHVzaF9ncm91cChjcik7
Ci0gICAgbV9kYXRhLT5sYXllcnMuYXBwZW5kKG9wYWNpdHkpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDo6ZW5kVHJhbnNwYXJlbmN5TGF5ZXIoKQotewotICAgIGlmIChwYWludGluZ0Rpc2Fi
bGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsK
LQotICAgIGNhaXJvX3BvcF9ncm91cF90b19zb3VyY2UoY3IpOwotICAgIGNhaXJvX3BhaW50X3dp
dGhfYWxwaGEoY3IsIG1fZGF0YS0+bGF5ZXJzLmxhc3QoKSk7Ci0gICAgbV9kYXRhLT5sYXllcnMu
cmVtb3ZlTGFzdCgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xlYXJSZWN0KGNvbnN0
IEZsb2F0UmVjdCYgcmVjdCkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0KLSAgICBjYWlyb19z
YXZlKGNyKTsKLSAgICBjYWlyb19yZWN0YW5nbGUoY3IsIHJlY3QueCgpLCByZWN0LnkoKSwgcmVj
dC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKLSAgICBjYWlyb19zZXRfb3BlcmF0b3IoY3IsIENB
SVJPX09QRVJBVE9SX0NMRUFSKTsKLSAgICBjYWlyb19maWxsKGNyKTsKLSAgICBjYWlyb19yZXN0
b3JlKGNyKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnN0cm9rZVJlY3QoY29uc3QgRmxv
YXRSZWN0JiByZWN0LCBmbG9hdCB3aWR0aCkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgp
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAg
Y2Fpcm9fc2F2ZShjcik7Ci0gICAgY2Fpcm9fcmVjdGFuZ2xlKGNyLCByZWN0LngoKSwgcmVjdC55
KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7Ci0gICAgc2V0Q29sb3IoY3IsIHN0cm9r
ZUNvbG9yKCkpOwotICAgIGNhaXJvX3NldF9saW5lX3dpZHRoKGNyLCB3aWR0aCk7Ci0gICAgY2Fp
cm9fc3Ryb2tlKGNyKTsKLSAgICBjYWlyb19yZXN0b3JlKGNyKTsKLX0KLQotdm9pZCBHcmFwaGlj
c0NvbnRleHQ6OnNldExpbmVDYXAoTGluZUNhcCBsaW5lQ2FwKQotewotICAgIGlmIChwYWludGlu
Z0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX2xpbmVfY2FwX3QgY2Fp
cm9DYXAgPSBDQUlST19MSU5FX0NBUF9CVVRUOwotICAgIHN3aXRjaCAobGluZUNhcCkgewotICAg
ICAgICBjYXNlIEJ1dHRDYXA6Ci0gICAgICAgICAgICAvLyBuby1vcAotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIGNhc2UgUm91bmRDYXA6Ci0gICAgICAgICAgICBjYWlyb0NhcCA9IENBSVJP
X0xJTkVfQ0FQX1JPVU5EOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU3F1YXJl
Q2FwOgotICAgICAgICAgICAgY2Fpcm9DYXAgPSBDQUlST19MSU5FX0NBUF9TUVVBUkU7Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY2Fpcm9fc2V0X2xpbmVfY2FwKG1fZGF0YS0+Y3Is
IGNhaXJvQ2FwKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldExpbmVKb2luKExpbmVK
b2luIGxpbmVKb2luKQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIGNhaXJvX2xpbmVfam9pbl90IGNhaXJvSm9pbiA9IENBSVJPX0xJTkVfSk9J
Tl9NSVRFUjsKLSAgICBzd2l0Y2ggKGxpbmVKb2luKSB7Ci0gICAgICAgIGNhc2UgTWl0ZXJKb2lu
OgotICAgICAgICAgICAgLy8gbm8tb3AKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNl
IFJvdW5kSm9pbjoKLSAgICAgICAgICAgIGNhaXJvSm9pbiA9IENBSVJPX0xJTkVfSk9JTl9ST1VO
RDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJldmVsSm9pbjoKLSAgICAgICAg
ICAgIGNhaXJvSm9pbiA9IENBSVJPX0xJTkVfSk9JTl9CRVZFTDsKLSAgICAgICAgICAgIGJyZWFr
OwotICAgIH0KLSAgICBjYWlyb19zZXRfbGluZV9qb2luKG1fZGF0YS0+Y3IsIGNhaXJvSm9pbik7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRNaXRlckxpbWl0KGZsb2F0IG1pdGVyKQot
ewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNh
aXJvX3NldF9taXRlcl9saW1pdChtX2RhdGEtPmNyLCBtaXRlcik7Ci19Ci0KLXZvaWQgR3JhcGhp
Y3NDb250ZXh0OjpzZXRBbHBoYShmbG9hdCkKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotfQot
Ci1zdGF0aWMgaW5saW5lIGNhaXJvX29wZXJhdG9yX3QgdG9DYWlyb09wZXJhdG9yKENvbXBvc2l0
ZU9wZXJhdG9yIG9wKQotewotICAgIHN3aXRjaCAob3ApIHsKLSAgICAgICAgY2FzZSBDb21wb3Np
dGVDbGVhcjoKLSAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9DTEVBUjsKLSAgICAg
ICAgY2FzZSBDb21wb3NpdGVDb3B5OgotICAgICAgICAgICAgcmV0dXJuIENBSVJPX09QRVJBVE9S
X1NPVVJDRTsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VPdmVyOgotICAgICAgICAgICAg
cmV0dXJuIENBSVJPX09QRVJBVE9SX09WRVI7Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRlU291cmNl
SW46Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfSU47Ci0gICAgICAgIGNhc2Ug
Q29tcG9zaXRlU291cmNlT3V0OgotICAgICAgICAgICAgcmV0dXJuIENBSVJPX09QRVJBVE9SX09V
VDsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VBdG9wOgotICAgICAgICAgICAgcmV0dXJu
IENBSVJPX09QRVJBVE9SX0FUT1A7Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRlRGVzdGluYXRpb25P
dmVyOgotICAgICAgICAgICAgcmV0dXJuIENBSVJPX09QRVJBVE9SX0RFU1RfT1ZFUjsKLSAgICAg
ICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlvbkluOgotICAgICAgICAgICAgcmV0dXJuIENBSVJP
X09QRVJBVE9SX0RFU1RfSU47Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRlRGVzdGluYXRpb25PdXQ6
Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfREVTVF9PVVQ7Ci0gICAgICAgIGNh
c2UgQ29tcG9zaXRlRGVzdGluYXRpb25BdG9wOgotICAgICAgICAgICAgcmV0dXJuIENBSVJPX09Q
RVJBVE9SX0RFU1RfQVRPUDsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVYT1I6Ci0gICAgICAgICAg
ICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfWE9SOwotICAgICAgICBjYXNlIENvbXBvc2l0ZVBsdXNE
YXJrZXI6Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfU0FUVVJBVEU7Ci0gICAg
ICAgIGNhc2UgQ29tcG9zaXRlSGlnaGxpZ2h0OgotICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8g
Q2Fpcm8gZXF1aXZhbGVudCBmb3IgQ29tcG9zaXRlSGlnaGxpZ2h0LgotICAgICAgICAgICAgcmV0
dXJuIENBSVJPX09QRVJBVE9SX09WRVI7Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRlUGx1c0xpZ2h0
ZXI6Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfQUREOwotICAgICAgICBkZWZh
dWx0OgotICAgICAgICAgICAgcmV0dXJuIENBSVJPX09QRVJBVE9SX1NPVVJDRTsKLSAgICB9Ci19
CiAKLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRDb21wb3NpdGVPcGVyYXRpb24oQ29tcG9zaXRl
T3BlcmF0b3Igb3ApCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgY2Fpcm9fc2V0X29wZXJhdG9yKG1fZGF0YS0+Y3IsIHRvQ2Fpcm9PcGVyYXRv
cihvcCkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6YmVnaW5QYXRoKCkKLXsKLSAgICBp
ZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBj
ciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fbmV3X3BhdGgoY3IpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDo6YWRkUGF0aChjb25zdCBQYXRoJiBwYXRoKQotewotICAgIGlmIChwYWludGlu
Z0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRh
LT5jcjsKLSAgICBjYWlyb19wYXRoX3QqIHAgPSBjYWlyb19jb3B5X3BhdGgocGF0aC5wbGF0Zm9y
bVBhdGgoKS0+bV9jcik7Ci0gICAgY2Fpcm9fYXBwZW5kX3BhdGgoY3IsIHApOwotICAgIGNhaXJv
X3BhdGhfZGVzdHJveShwKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXAoY29uc3Qg
UGF0aCYgcGF0aCkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fcGF0aF90KiBw
ID0gY2Fpcm9fY29weV9wYXRoKHBhdGgucGxhdGZvcm1QYXRoKCktPm1fY3IpOwotICAgIGNhaXJv
X2FwcGVuZF9wYXRoKGNyLCBwKTsKLSAgICBjYWlyb19wYXRoX2Rlc3Ryb3kocCk7Ci0gICAgY2Fp
cm9fZmlsbF9ydWxlX3Qgc2F2ZWRGaWxsUnVsZSA9IGNhaXJvX2dldF9maWxsX3J1bGUoY3IpOwot
ICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIENBSVJPX0ZJTExfUlVMRV9XSU5ESU5HKTsKLSAg
ICBjYWlyb19jbGlwKGNyKTsKLSAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNyLCBzYXZlZEZpbGxS
dWxlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBPdXQoY29uc3QgUGF0aCYgcGF0
aCkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgZG91YmxlIHgxLCB5MSwgeDIsIHkyOwot
ICAgIGNhaXJvX2NsaXBfZXh0ZW50cyhjciwgJngxLCAmeTEsICZ4MiwgJnkyKTsKLSAgICBjYWly
b19yZWN0YW5nbGUoY3IsIHgxLCB5MSwgeDIgLSB4MSwgeTIgLSB5MSk7Ci0gICAgYWRkUGF0aChw
YXRoKTsKLQotICAgIGNhaXJvX2ZpbGxfcnVsZV90IHNhdmVkRmlsbFJ1bGUgPSBjYWlyb19nZXRf
ZmlsbF9ydWxlKGNyKTsKLSAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNyLCBDQUlST19GSUxMX1JV
TEVfRVZFTl9PREQpOwotICAgIGNhaXJvX2NsaXAoY3IpOwotICAgIGNhaXJvX3NldF9maWxsX3J1
bGUoY3IsIHNhdmVkRmlsbFJ1bGUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6cm90YXRl
KGZsb2F0IHJhZGlhbnMpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgY2Fpcm9fcm90YXRlKG1fZGF0YS0+Y3IsIHJhZGlhbnMpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDo6c2NhbGUoY29uc3QgRmxvYXRTaXplJiBzaXplKQotewotICAg
IGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3Nj
YWxlKG1fZGF0YS0+Y3IsIHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSk7Ci19Ci0KLXZvaWQg
R3JhcGhpY3NDb250ZXh0OjpjbGlwT3V0KGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgaWYgKHBh
aW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fdCogY3IgPSBt
X2RhdGEtPmNyOwotICAgIGRvdWJsZSB4MSwgeTEsIHgyLCB5MjsKLSAgICBjYWlyb19jbGlwX2V4
dGVudHMoY3IsICZ4MSwgJnkxLCAmeDIsICZ5Mik7Ci0gICAgY2Fpcm9fcmVjdGFuZ2xlKGNyLCB4
MSwgeDIsIHgyIC0geDEsIHkyIC0geTEpOwotICAgIGNhaXJvX3JlY3RhbmdsZShjciwgci54KCks
IHIueSgpLCByLndpZHRoKCksIHIuaGVpZ2h0KCkpOwotICAgIGNhaXJvX2ZpbGxfcnVsZV90IHNh
dmVkRmlsbFJ1bGUgPSBjYWlyb19nZXRfZmlsbF9ydWxlKGNyKTsKLSAgICBjYWlyb19zZXRfZmls
bF9ydWxlKGNyLCBDQUlST19GSUxMX1JVTEVfRVZFTl9PREQpOwotICAgIGNhaXJvX2NsaXAoY3Ip
OwotICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIHNhdmVkRmlsbFJ1bGUpOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDo6Y2xpcE91dEVsbGlwc2VJblJlY3QoY29uc3QgSW50UmVjdCYgcikK
LXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBQ
YXRoIHA7Ci0gICAgcC5hZGRFbGxpcHNlKHIpOwotICAgIGNsaXBPdXQocCk7Ci19Ci0KLXZvaWQg
R3JhcGhpY3NDb250ZXh0OjpmaWxsUm91bmRlZFJlY3QoY29uc3QgSW50UmVjdCYgciwgY29uc3Qg
SW50U2l6ZSYgdG9wTGVmdCwgY29uc3QgSW50U2l6ZSYgdG9wUmlnaHQsIGNvbnN0IEludFNpemUm
IGJvdHRvbUxlZnQsIGNvbnN0IEludFNpemUmIGJvdHRvbVJpZ2h0LCBjb25zdCBDb2xvciYgY29s
b3IpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotICAgIGNhaXJvX3NhdmUoY3IpOwotICAgIGJl
Z2luUGF0aCgpOwotICAgIGFkZFBhdGgoUGF0aDo6Y3JlYXRlUm91bmRlZFJlY3RhbmdsZShyLCB0
b3BMZWZ0LCB0b3BSaWdodCwgYm90dG9tTGVmdCwgYm90dG9tUmlnaHQpKTsKLSAgICBzZXRDb2xv
cihjciwgY29sb3IpOwotICAgIGNhaXJvX2ZpbGwoY3IpOwotICAgIGNhaXJvX3Jlc3RvcmUoY3Ip
OwotfQorICAgIGNhaXJvX3QqIGNyOworICAgIFZlY3RvcjxmbG9hdD4gbGF5ZXJzOwogCiAjaWYg
UExBVEZPUk0oR1RLKQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldEdka0V4cG9zZUV2ZW50KEdk
a0V2ZW50RXhwb3NlKiBleHBvc2UpCi17Ci0gICAgbV9kYXRhLT5leHBvc2UgPSBleHBvc2U7Ci19
Ci0KLUdka0V2ZW50RXhwb3NlKiBHcmFwaGljc0NvbnRleHQ6Omdka0V4cG9zZUV2ZW50KCkgY29u
c3QKLXsKLSAgICByZXR1cm4gbV9kYXRhLT5leHBvc2U7Ci19Ci0KLUdka0RyYXdhYmxlKiBHcmFw
aGljc0NvbnRleHQ6Omdka0RyYXdhYmxlKCkgY29uc3QKLXsKLSAgICBpZiAoIW1fZGF0YS0+ZXhw
b3NlKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiBHREtfRFJBV0FCTEUobV9kYXRh
LT5leHBvc2UtPndpbmRvdyk7Ci19Ci0KLUludFBvaW50IEdyYXBoaWNzQ29udGV4dDo6dHJhbnNs
YXRlUG9pbnQoY29uc3QgSW50UG9pbnQmIHBvaW50KSBjb25zdAotewotICAgIGNhaXJvX21hdHJp
eF90IHRtOwotICAgIGNhaXJvX2dldF9tYXRyaXgobV9kYXRhLT5jciwgJnRtKTsKLSAgICBkb3Vi
bGUgeCA9IHBvaW50LngoKTsKLSAgICBkb3VibGUgeSA9IHBvaW50LnkoKTsKLQotICAgIGNhaXJv
X21hdHJpeF90cmFuc2Zvcm1fcG9pbnQoJnRtLCAmeCwgJnkpOwotICAgIHJldHVybiBJbnRQb2lu
dCh4LCB5KTsKLX0KKyAgICBHZGtFdmVudEV4cG9zZSogZXhwb3NlOworI2VsaWYgUExBVEZPUk0o
V0lOKQorICAgIEhEQyBtX2hkYzsKKyAgICB1bnNpZ25lZCBtX3RyYW5zcGFyZW5jeUNvdW50Owog
I2VuZGlmCi0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRVc2VBbnRpYWxpYXNpbmcoYm9vbCBl
bmFibGUpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgLy8gV2hlbiB0cnVlLCB1c2UgdGhlIGRlZmF1bHQgQ2Fpcm8gYmFja2VuZCBhbnRpYWxp
YXMgbW9kZSAodXN1YWxseSB0aGlzCi0gICAgLy8gZW5hYmxlcyBzdGFuZGFyZCAnZ3JheXNjYWxl
JyBhbnRpYWxpYXNpbmcpOyBmYWxzZSB0byBleHBsaWNpdGx5IGRpc2FibGUKLSAgICAvLyBhbnRp
YWxpYXNpbmcuIFRoaXMgaXMgdGhlIHNhbWUgc3RyYXRlZ3kgYXMgdXNlZCBpbiBkcmF3Q29udmV4
UG9seWdvbigpLgotICAgIGNhaXJvX3NldF9hbnRpYWxpYXMobV9kYXRhLT5jciwgZW5hYmxlID8g
Q0FJUk9fQU5USUFMSUFTX0RFRkFVTFQgOiBDQUlST19BTlRJQUxJQVNfTk9ORSk7Ci19Cit9Owog
CiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKLSNlbmRpZiAvLyBQTEFURk9STShDQUlSTykKSW5k
ZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvR3JhcGhpY3NDb250ZXh0Q0cuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvR3JhcGhpY3NDb250ZXh0
Q0cuY3BwCShyZXZpc2lvbiAyOTcyNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cv
R3JhcGhpY3NDb250ZXh0Q0cuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNywxMSArMjcsOSBAQAog
I2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogCi0jaWYg
UExBVEZPUk0oQ0cpCi0KICNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKICNpbmNsdWRlICJG
bG9hdENvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZh
dGUuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVDRy5oIgogI2lu
Y2x1ZGUgIktVUkwuaCIKICNpbmNsdWRlICJQYXRoLmgiCiAjaW5jbHVkZSA8Q29yZUdyYXBoaWNz
L0NHUERGQ29udGV4dC5oPgpAQCAtODMsNyArODEsNyBAQCBDR0NvbnRleHRSZWYgR3JhcGhpY3ND
b250ZXh0OjpwbGF0Zm9ybUNvCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2F2ZVBsYXRmb3JtU3Rh
dGUoKQogewogICAgIC8vIE5vdGU6IERvIG5vdCB1c2UgdGhpcyBmdW5jdGlvbiB3aXRoaW4gdGhp
cyBjbGFzcyBpbXBsZW1lbnRhdGlvbiwgc2luY2Ugd2Ugd2FudCB0byBhdm9pZCB0aGUgZXh0cmEK
LSAgICAvLyBzYXZlIG9mIHRoZSBzZWNvbmRhcnkgY29udGV4dCAoaW4gR3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlLmgpLgorICAgIC8vIHNhdmUgb2YgdGhlIHNlY29uZGFyeSBjb250ZXh0
IChpbiBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVDRy5oKS4KICAgICBDR0NvbnRleHRT
YXZlR1N0YXRlKHBsYXRmb3JtQ29udGV4dCgpKTsKICAgICBtX2RhdGEtPnNhdmUoKTsKIH0KQEAg
LTkxLDcgKzg5LDcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNhdmVQbGF0Zm9ybVN0YXRlKAog
dm9pZCBHcmFwaGljc0NvbnRleHQ6OnJlc3RvcmVQbGF0Zm9ybVN0YXRlKCkKIHsKICAgICAvLyBO
b3RlOiBEbyBub3QgdXNlIHRoaXMgZnVuY3Rpb24gd2l0aGluIHRoaXMgY2xhc3MgaW1wbGVtZW50
YXRpb24sIHNpbmNlIHdlIHdhbnQgdG8gYXZvaWQgdGhlIGV4dHJhCi0gICAgLy8gcmVzdG9yZSBv
ZiB0aGUgc2Vjb25kYXJ5IGNvbnRleHQgKGluIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0
ZS5oKS4KKyAgICAvLyByZXN0b3JlIG9mIHRoZSBzZWNvbmRhcnkgY29udGV4dCAoaW4gR3JhcGhp
Y3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlQ0cuaCkuCiAgICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0
ZShwbGF0Zm9ybUNvbnRleHQoKSk7CiAgICAgbV9kYXRhLT5yZXN0b3JlKCk7CiAgICAgbV9kYXRh
LT5tX3VzZXJUb0RldmljZVRyYW5zZm9ybUtub3duVG9CZUlkZW50aXR5ID0gZmFsc2U7CkBAIC05
MjUsNCArOTIzLDMgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldENvbXBvc2l0ZU9wZXJhdAog
ICAgIAogfQogCi0jZW5kaWYgLy8gUExBVEZPUk0oQ0cpCkluZGV4OiBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2NnL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlLmgJKHJldmlzaW9uIDI5NzI2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
Zy9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUuaAkod29ya2luZyBjb3B5KQpAQCAtMSw4
NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJl
IG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCi0gKi8KLQotI2luY2x1ZGUgPENvcmVHcmFwaGljcy9DR0NvbnRl
eHQuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1jbGFzcyBHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGUgewotcHVibGljOgotICAgIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0
ZShDR0NvbnRleHRSZWYgY2dDb250ZXh0KQotICAgICAgICA6IG1fY2dDb250ZXh0KGNnQ29udGV4
dCkKLSNpZiBQTEFURk9STShXSU4pCi0gICAgICAgICwgbV9oZGMoMCkKLSAgICAgICAgLCBtX3Ry
YW5zcGFyZW5jeUNvdW50KDApCi0jZW5kaWYKLSAgICAgICAgLCBtX3VzZXJUb0RldmljZVRyYW5z
Zm9ybUtub3duVG9CZUlkZW50aXR5KGZhbHNlKQotICAgIHsKLSAgICAgICAgQ0dDb250ZXh0UmV0
YWluKG1fY2dDb250ZXh0KTsKLSAgICB9Ci0gICAgCi0gICAgfkdyYXBoaWNzQ29udGV4dFBsYXRm
b3JtUHJpdmF0ZSgpCi0gICAgewotICAgICAgICBDR0NvbnRleHRSZWxlYXNlKG1fY2dDb250ZXh0
KTsKLSAgICB9Ci0KLSNpZiBQTEFURk9STShNQUMpCi0gICAgLy8gVGhlc2UgbWV0aG9kcyBkbyBu
b3RoaW5nIG9uIE1hYy4KLSAgICB2b2lkIHNhdmUoKSB7fQotICAgIHZvaWQgcmVzdG9yZSgpIHt9
Ci0gICAgdm9pZCBjbGlwKGNvbnN0IEludFJlY3QmKSB7fQotICAgIHZvaWQgY2xpcChjb25zdCBQ
YXRoJikge30KLSAgICB2b2lkIHNjYWxlKGNvbnN0IEZsb2F0U2l6ZSYpIHt9Ci0gICAgdm9pZCBy
b3RhdGUoZmxvYXQpIHt9Ci0gICAgdm9pZCB0cmFuc2xhdGUoZmxvYXQsIGZsb2F0KSB7fQotICAg
IHZvaWQgY29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYpIHt9Ci0gICAgdm9pZCBiZWdp
blRyYW5zcGFyZW5jeUxheWVyKCkge30KLSAgICB2b2lkIGVuZFRyYW5zcGFyZW5jeUxheWVyKCkg
e30KLSNlbmRpZgotCi0jaWYgUExBVEZPUk0oV0lOKQotICAgIC8vIE9uIFdpbmRvd3MsIHdlIG5l
ZWQgdG8gdXBkYXRlIHRoZSBIREMgZm9yIGZvcm0gY29udHJvbHMgdG8gZHJhdyBpbiB0aGUgcmln
aHQgcGxhY2UuCi0gICAgdm9pZCBzYXZlKCk7Ci0gICAgdm9pZCByZXN0b3JlKCk7Ci0gICAgdm9p
ZCBjbGlwKGNvbnN0IEludFJlY3QmKTsKLSAgICB2b2lkIGNsaXAoY29uc3QgUGF0aCYpOwotICAg
IHZvaWQgc2NhbGUoY29uc3QgRmxvYXRTaXplJik7Ci0gICAgdm9pZCByb3RhdGUoZmxvYXQpOwot
ICAgIHZvaWQgdHJhbnNsYXRlKGZsb2F0LCBmbG9hdCk7Ci0gICAgdm9pZCBjb25jYXRDVE0oY29u
c3QgQWZmaW5lVHJhbnNmb3JtJik7Ci0gICAgdm9pZCBiZWdpblRyYW5zcGFyZW5jeUxheWVyKCkg
eyBtX3RyYW5zcGFyZW5jeUNvdW50Kys7IH0KLSAgICB2b2lkIGVuZFRyYW5zcGFyZW5jeUxheWVy
KCkgeyBtX3RyYW5zcGFyZW5jeUNvdW50LS07IH0KLSNlbmRpZgotCi0jaWYgUExBVEZPUk0oV0lO
KQotICAgIEhEQyBtX2hkYzsKLSAgICB1bnNpZ25lZCBtX3RyYW5zcGFyZW5jeUNvdW50OwotI2Vu
ZGlmCi0KLSAgICBDR0NvbnRleHRSZWYgbV9jZ0NvbnRleHQ7Ci0gICAgYm9vbCBtX3VzZXJUb0Rl
dmljZVRyYW5zZm9ybUtub3duVG9CZUlkZW50aXR5OwotfTsKLQotfQpJbmRleDogV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVDRy5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvR3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlQ0cuaAkocmV2aXNpb24gMjk3MjYpCShmcm9tIFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2cvR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmg6Mjk3MjYpCisr
KyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NnL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZUNHLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ0dDb250ZXh0Lmg+CisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworY2xhc3MgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlIHsKK3B1YmxpYzoKKyAg
ICBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoQ0dDb250ZXh0UmVmIGNnQ29udGV4dCkK
KyAgICAgICAgOiBtX2NnQ29udGV4dChjZ0NvbnRleHQpCisjaWYgUExBVEZPUk0oV0lOKQorICAg
ICAgICAsIG1faGRjKDApCisgICAgICAgICwgbV90cmFuc3BhcmVuY3lDb3VudCgwKQorI2VuZGlm
CisgICAgICAgICwgbV91c2VyVG9EZXZpY2VUcmFuc2Zvcm1Lbm93blRvQmVJZGVudGl0eShmYWxz
ZSkKKyAgICB7CisgICAgICAgIENHQ29udGV4dFJldGFpbihtX2NnQ29udGV4dCk7CisgICAgfQor
ICAgIAorICAgIH5HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKQorICAgIHsKKyAgICAg
ICAgQ0dDb250ZXh0UmVsZWFzZShtX2NnQ29udGV4dCk7CisgICAgfQorCisjaWYgUExBVEZPUk0o
TUFDKQorICAgIC8vIFRoZXNlIG1ldGhvZHMgZG8gbm90aGluZyBvbiBNYWMuCisgICAgdm9pZCBz
YXZlKCkge30KKyAgICB2b2lkIHJlc3RvcmUoKSB7fQorICAgIHZvaWQgY2xpcChjb25zdCBJbnRS
ZWN0Jikge30KKyAgICB2b2lkIGNsaXAoY29uc3QgUGF0aCYpIHt9CisgICAgdm9pZCBzY2FsZShj
b25zdCBGbG9hdFNpemUmKSB7fQorICAgIHZvaWQgcm90YXRlKGZsb2F0KSB7fQorICAgIHZvaWQg
dHJhbnNsYXRlKGZsb2F0LCBmbG9hdCkge30KKyAgICB2b2lkIGNvbmNhdENUTShjb25zdCBBZmZp
bmVUcmFuc2Zvcm0mKSB7fQorICAgIHZvaWQgYmVnaW5UcmFuc3BhcmVuY3lMYXllcigpIHt9Cisg
ICAgdm9pZCBlbmRUcmFuc3BhcmVuY3lMYXllcigpIHt9CisjZW5kaWYKKworI2lmIFBMQVRGT1JN
KFdJTikKKyAgICAvLyBPbiBXaW5kb3dzLCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgSERDIGZvciBm
b3JtIGNvbnRyb2xzIHRvIGRyYXcgaW4gdGhlIHJpZ2h0IHBsYWNlLgorICAgIHZvaWQgc2F2ZSgp
OworICAgIHZvaWQgcmVzdG9yZSgpOworICAgIHZvaWQgY2xpcChjb25zdCBJbnRSZWN0Jik7Cisg
ICAgdm9pZCBjbGlwKGNvbnN0IFBhdGgmKTsKKyAgICB2b2lkIHNjYWxlKGNvbnN0IEZsb2F0U2l6
ZSYpOworICAgIHZvaWQgcm90YXRlKGZsb2F0KTsKKyAgICB2b2lkIHRyYW5zbGF0ZShmbG9hdCwg
ZmxvYXQpOworICAgIHZvaWQgY29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYpOworICAg
IHZvaWQgYmVnaW5UcmFuc3BhcmVuY3lMYXllcigpIHsgbV90cmFuc3BhcmVuY3lDb3VudCsrOyB9
CisgICAgdm9pZCBlbmRUcmFuc3BhcmVuY3lMYXllcigpIHsgbV90cmFuc3BhcmVuY3lDb3VudC0t
OyB9CisjZW5kaWYKKworI2lmIFBMQVRGT1JNKFdJTikKKyAgICBIREMgbV9oZGM7CisgICAgdW5z
aWduZWQgbV90cmFuc3BhcmVuY3lDb3VudDsKKyNlbmRpZgorCisgICAgQ0dDb250ZXh0UmVmIG1f
Y2dDb250ZXh0OworICAgIGJvb2wgbV91c2VyVG9EZXZpY2VUcmFuc2Zvcm1Lbm93blRvQmVJZGVu
dGl0eTsKK307CisKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRD
R1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9u
dENHV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCShmcm9tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0ZvbnRXaW4uY3BwOjI5ODM0KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW4vRm9udENHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09N
UFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01Q
VVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRm9udC5oIgorCisjaW5j
bHVkZSAiRm9udEZhbGxiYWNrTGlzdC5oIgorI2luY2x1ZGUgIkdseXBoQnVmZmVyLmgiCisjaW5j
bHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiSW50UmVjdC5oIgorI2luY2x1ZGUg
Ik5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIKKyNpbmNsdWRl
ICJVbmlzY3JpYmVDb250cm9sbGVyLmgiCisjaW5jbHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9B
cHBsaWNhdGlvblNlcnZpY2VzLmg+CisjaW5jbHVkZSA8V2ViS2l0U3lzdGVtSW50ZXJmYWNlL1dl
YktpdFN5c3RlbUludGVyZmFjZS5oPgorI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworY29uc3QgaW50IHN5bnRoZXRpY09ibGlxdWVBbmdsZSA9IDE0
OworCit2b2lkIEZvbnQ6OmRyYXdHbHlwaHMoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRl
eHQsIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250LCBjb25zdCBHbHlwaEJ1ZmZlciYgZ2x5cGhC
dWZmZXIsIAorICAgICAgICAgICAgICAgICAgICAgIGludCBmcm9tLCBpbnQgbnVtR2x5cGhzLCBj
b25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAgICBpZiAoZm9udC0+bV9mb250LnVz
ZUdESSgpKSB7CisgICAgICAgIC8vIEZJWE1FOiBTdXBwb3J0IGFscGhhIGJsZW5kaW5nLgorICAg
ICAgICAvLyBGSVhNRTogU3VwcG9ydCB0ZXh0IHN0cm9rZS9maWxsLgorICAgICAgICAvLyBGSVhN
RTogU3VwcG9ydCB0ZXh0IHNoYWRvdy4KKyAgICAgICAgQ29sb3IgZmlsbENvbG9yID0gZ3JhcGhp
Y3NDb250ZXh0LT5maWxsQ29sb3IoKTsKKyAgICAgICAgaWYgKGZpbGxDb2xvci5hbHBoYSgpID09
IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gV2UgaGF2ZSB0byBjb252ZXJ0
IENHJ3MgdHdvLWRpbWVuc2lvbmFsIGZsb2F0aW5nIHBvaW50IGFkdmFuY2VzIHRvIGp1c3QgaG9y
aXpvbnRhbCBpbnRlZ2VyIGFkdmFuY2VzLgorICAgICAgICBWZWN0b3I8aW50LCAyMDQ4PiBnZGlB
ZHZhbmNlczsKKyAgICAgICAgaW50IHRvdGFsV2lkdGggPSAwOworICAgICAgICBmb3IgKGludCBp
ID0gMDsgaSA8IG51bUdseXBoczsgaSsrKSB7CisgICAgICAgICAgICBnZGlBZHZhbmNlcy5hcHBl
bmQobHJvdW5kZihnbHlwaEJ1ZmZlci5hZHZhbmNlQXQoZnJvbSArIGkpKSk7CisgICAgICAgICAg
ICB0b3RhbFdpZHRoICs9IGdkaUFkdmFuY2VzW2ldOworICAgICAgICB9CisKKyAgICAgICAgLy8g
V2UgcHV0IHNsb3AgaW50byB0aGlzIHJlY3QsIHNpbmNlIGdseXBocyBjYW4gb3ZlcmZsb3cgdGhl
IGFzY2VudC9kZXNjZW50IGJvdW5kcyBhbmQgdGhlIGxlZnQvcmlnaHQgZWRnZXMuCisgICAgICAg
IGludCBsaW5lR2FwID0gZm9udC0+bGluZUdhcCgpOworICAgICAgICBJbnRSZWN0IHRleHRSZWN0
KHBvaW50LngoKSAtIGxpbmVHYXAsIHBvaW50LnkoKSAtIGZvbnQtPmFzY2VudCgpIC0gbGluZUdh
cCwgdG90YWxXaWR0aCArIDIgKiBsaW5lR2FwLCBmb250LT5saW5lU3BhY2luZygpKTsKKyAgICAg
ICAgSERDIGhkYyA9IGdyYXBoaWNzQ29udGV4dC0+Z2V0V2luZG93c0NvbnRleHQodGV4dFJlY3Qp
OworICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBmb250LT5tX2ZvbnQuaGZvbnQoKSk7CisKKyAg
ICAgICAgLy8gU2V0IHRoZSBjb3JyZWN0IGNvbG9yLgorICAgICAgICBIREMgdGV4dERyYXdpbmdE
QyA9IGhkYzsKKyAgICAgICAgLyppZiAoZmlsbENvbG9yLmhhc0FscGhhKCkgfHwgZ3JhcGhpY3ND
b250ZXh0LT5pblRyYW5zcGFyZW5jeUxheWVyKCkpIHsKKyAgICAgICAgICAgIC8vIEdESSBjYW4n
dCBoYW5kbGUgZHJhd2luZyB0cmFuc3BhcmVudCB0ZXh0LiAgV2UgaGF2ZSB0byBkcmF3IGludG8g
YSBtYXNrLiAgV2UgZHJhdyBibGFjayB0ZXh0IG9uIGEgd2hpdGUtZmlsbGVkIGJhY2tncm91bmQu
CisgICAgICAgICAgICAvLyBXZSBhbHNvIGRvIHRoaXMgd2hlbiBpbnNpZGUgdHJhbnNwYXJlbmN5
IGxheWVycywgc2luY2UgR0RJIGFsc28gY2FuJ3QgZHJhdyBvbnRvIGEgc3VyZmFjZSB3aXRoIGFs
cGhhLgorICAgICAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5zYXZlKCk7CisgICAgICAgICAgICBn
cmFwaGljc0NvbnRleHQtPnNldEZpbGxDb2xvcihDb2xvcjo6d2hpdGUpOworICAgICAgICAgICAg
dGV4dERyYXdpbmdEQyA9IGdyYXBoaWNzQ29udGV4dC0+Z2V0V2luZG93c0JpdG1hcENvbnRleHQo
dGV4dFJlY3QpOworICAgICAgICAgICAgU2V0VGV4dENvbG9yKGhkYywgUkdCKDAsIDAsIDApKTsK
KyAgICAgICAgfSBlbHNlKi8KKyAgICAgICAgICAgIFNldFRleHRDb2xvcihoZGMsIFJHQihmaWxs
Q29sb3IucmVkKCksIGZpbGxDb2xvci5ncmVlbigpLCBmaWxsQ29sb3IuYmx1ZSgpKSk7CisKKyAg
ICAgICAgU2V0QmtNb2RlKGhkYywgVFJBTlNQQVJFTlQpOworICAgICAgICBTZXRUZXh0QWxpZ24o
aGRjLCBUQV9MRUZUIHwgVEFfQkFTRUxJTkUpOworCisgICAgICAgIC8vIFVuaXNjcmliZSBnaXZl
cyB1cyBvZmZzZXRzIHRvIGhlbHAgcmVmaW5lIHRoZSBwb3NpdGlvbmluZyBvZiBjb21iaW5pbmcg
Z2x5cGhzLgorICAgICAgICBGbG9hdFNpemUgdHJhbnNsYXRpb24gPSBnbHlwaEJ1ZmZlci5vZmZz
ZXRBdChmcm9tKTsKKyAgICAgICAgaWYgKHRyYW5zbGF0aW9uLndpZHRoKCkgfHwgdHJhbnNsYXRp
b24uaGVpZ2h0KCkpIHsKKyAgICAgICAgICAgIFhGT1JNIHhmb3JtOworICAgICAgICAgICAgeGZv
cm0uZU0xMSA9IDEuMDsKKyAgICAgICAgICAgIHhmb3JtLmVNMTIgPSAwOworICAgICAgICAgICAg
eGZvcm0uZU0yMSA9IDA7CisgICAgICAgICAgICB4Zm9ybS5lTTIyID0gMS4wOworICAgICAgICAg
ICAgeGZvcm0uZUR4ID0gdHJhbnNsYXRpb24ud2lkdGgoKTsKKyAgICAgICAgICAgIHhmb3JtLmVE
eSA9IHRyYW5zbGF0aW9uLmhlaWdodCgpOworICAgICAgICAgICAgTW9kaWZ5V29ybGRUcmFuc2Zv
cm0oaGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOworICAgICAgICB9CisgICAgICAgIEV4
dFRleHRPdXQoaGRjLCBwb2ludC54KCksIHBvaW50LnkoKSwgRVRPX0dMWVBIX0lOREVYLCAwLCAo
V0NIQVIqKWdseXBoQnVmZmVyLmdseXBocyhmcm9tKSwgbnVtR2x5cGhzLCBnZGlBZHZhbmNlcy5k
YXRhKCkpOworCisgICAgICAgIC8qaWYgKGZpbGxDb2xvci5oYXNBbHBoYSgpIHx8IGdyYXBoaWNz
Q29udGV4dC0+aW5UcmFuc3BhcmVuY3lMYXllcigpKSB7CisgICAgICAgICAgICAvLyBUT0RPRDog
V2UgaGF2ZSB0byB3YWxrIHRoZSBiaXRzIG9mIHRoZSBiaXRtYXAgYW5kIGludmVydCB0aGVtLiAg
V2UgYWxzbyBjb3B5IG92ZXIgdGhlIGdyZWVuIGNvbXBvbmVudCB2YWx1ZSBpbnRvIHRoZSBhbHBo
YSB2YWx1ZQorICAgICAgICAgICAgLy8gdG8ga2VlcCBDbGVhclR5cGUgbG9va2luZyByZWFzb25h
YmxlLgorCisgICAgICAgICAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGRyYXduIHRoZSB0ZXh0IGlu
dG8gYSBiaXRtYXAgYW5kIGludmVydGVkIGl0LCBvYnRhaW4gYSBDR0ltYWdlUmVmIG1hc2suCisg
ICAgICAgICAgICBDR0ltYWdlUmVmIG1hc2sgPSBncmFwaGljc0NvbnRleHQtPnJlbGVhc2VXaW5k
b3dzQml0bWFwQ29udGV4dEludG9NYXNrKHRleHREcmF3aW5nREMsIHRleHRSZWN0KTsKKyAgICAg
ICAgICAgIAorICAgICAgICAgICAgLy8gQXBwbHkgdGhlIG1hc2sgdG8gdGhlIGZpbGwgY29sb3Iu
CisgICAgICAgICAgICBDR0NvbnRleHRSZWYgYml0bWFwQ29udGV4dCA9IGdyYXBoaWNzQ29udGV4
dC0+Z2V0V2luZG93c0NvbXBhdGlibGVDR0JpdG1hcENvbnRleHQodGV4dFJlY3Quc2l6ZSgpKTsK
KyAgICAgICAgICAgIENHRmxvYXQgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGE7CisgICAgICAgICAg
ICBjb2xvci5nZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAgICAgICAgICAgIENH
Q29udGV4dFNldFJHQkZpbGxDb2xvcihjb250ZXh0LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7
CisgICAgICAgICAgICBDR0NvbnRleHRGaWxsUmVjdChiaXRtYXBDb250ZXh0LCBJbnRSZWN0KDAs
IDAsIHRleHRSZWN0LndpZHRoKCksIHRleHRSZWN0LmhlaWdodCgpKSk7CisgICAgICAgICAgICBD
R0ltYWdlUmVmIGZpbGxDb2xvckltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlSW1hZ2UoYml0
bWFwQ29udGV4dCk7CisgICAgICAgIAorICAgICAgICAgICAgLy8gQXBwbHkgdGhlIG1hc2suCisg
ICAgICAgICAgICBDR0ltYWdlUmVmIGZpbmFsSW1hZ2UgPSBDR0ltYWdlQ3JlYXRlV2l0aE1hc2so
ZmlsbENvbG9ySW1hZ2UsIG1hc2spOworCisgICAgICAgICAgICAvLyBUaGUgYml0bWFwIGltYWdl
IG5lZWRzIHRvIGJlIGRyYXduIGludG8gdGhlIEhEQy4KKyAgICAgICAgICAgIGdyYXBoaWNzQ29u
dGV4dC0+ZHJhd0ltYWdlSW50b1dpbmRvd3NDb250ZXh0KGhkYywgZmluYWxJbWFnZSk7CisKKyAg
ICAgICAgICAgIC8vIFJlbGVhc2Ugb3VyIGltYWdlcyBhbmQgY29udGV4dHMuCisgICAgICAgICAg
ICBDR0ltYWdlUmVsZWFzZShtYXNrKTsKKyAgICAgICAgICAgIENHSW1hZ2VSZWxlYXNlKGZpbGxD
b2xvckltYWdlKTsKKyAgICAgICAgICAgIENHSW1hZ2VSZWxlYXNlKGZpbmFsSW1hZ2UpOworICAg
ICAgICAgICAgQ0dDb250ZXh0UmVsZWFzZShiaXRtYXBDb250ZXh0KTsKKyAgICAgICAgfSovCisK
KyAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5yZWxlYXNlV2luZG93c0NvbnRleHQoaGRjLCB0ZXh0
UmVjdCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDR0NvbnRleHRSZWYgY2dDb250
ZXh0ID0gZ3JhcGhpY3NDb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKKworICAgIHVpbnQzMl90
IG9sZEZvbnRTbW9vdGhpbmdTdHlsZSA9IHdrU2V0Rm9udFNtb290aGluZ1N0eWxlKGNnQ29udGV4
dCk7CisKKyAgICBjb25zdCBGb250UGxhdGZvcm1EYXRhJiBwbGF0Zm9ybURhdGEgPSBmb250LT5w
bGF0Zm9ybURhdGEoKTsKKworICAgIENHQ29udGV4dFNldEZvbnQoY2dDb250ZXh0LCBwbGF0Zm9y
bURhdGEuY2dGb250KCkpOworCisgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbWF0cml4ID0gQ0dBZmZp
bmVUcmFuc2Zvcm1JZGVudGl0eTsKKyAgICBtYXRyaXguYiA9IC1tYXRyaXguYjsKKyAgICBtYXRy
aXguZCA9IC1tYXRyaXguZDsKKworICAgIGlmIChwbGF0Zm9ybURhdGEuc3ludGhldGljT2JsaXF1
ZSgpKQorICAgIHsKKyAgICAgICAgc3RhdGljIGZsb2F0IHNrZXcgPSAtdGFuZihzeW50aGV0aWNP
YmxpcXVlQW5nbGUgKiBhY29zZigwKSAvIDkwKTsKKyAgICAgICAgbWF0cml4ID0gQ0dBZmZpbmVU
cmFuc2Zvcm1Db25jYXQobWF0cml4LCBDR0FmZmluZVRyYW5zZm9ybU1ha2UoMSwgMCwgc2tldywg
MSwgMCwgMCkpOworICAgIH0KKworICAgIC8vIFVuaXNjcmliZSBnaXZlcyB1cyBvZmZzZXRzIHRv
IGhlbHAgcmVmaW5lIHRoZSBwb3NpdGlvbmluZyBvZiBjb21iaW5pbmcgZ2x5cGhzLgorICAgIEZs
b2F0U2l6ZSB0cmFuc2xhdGlvbiA9IGdseXBoQnVmZmVyLm9mZnNldEF0KGZyb20pOworICAgIGlm
ICh0cmFuc2xhdGlvbi53aWR0aCgpIHx8IHRyYW5zbGF0aW9uLmhlaWdodCgpKQorICAgICAgICBD
R0FmZmluZVRyYW5zZm9ybVRyYW5zbGF0ZShtYXRyaXgsIHRyYW5zbGF0aW9uLndpZHRoKCksIHRy
YW5zbGF0aW9uLmhlaWdodCgpKTsKKyAgICAKKyAgICBDR0NvbnRleHRTZXRUZXh0TWF0cml4KGNn
Q29udGV4dCwgbWF0cml4KTsKKworICAgIENHQ29udGV4dFNldEZvbnRTaXplKGNnQ29udGV4dCwg
cGxhdGZvcm1EYXRhLnNpemUoKSk7CisgICAgQ0dDb250ZXh0U2V0VGV4dFBvc2l0aW9uKGNnQ29u
dGV4dCwgcG9pbnQueCgpLCBwb2ludC55KCkpOworICAgIENHQ29udGV4dFNob3dHbHlwaHNXaXRo
QWR2YW5jZXMoY2dDb250ZXh0LCBnbHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSksIGdseXBoQnVmZmVy
LmFkdmFuY2VzKGZyb20pLCBudW1HbHlwaHMpOworICAgIGlmIChmb250LT5tX3N5bnRoZXRpY0Jv
bGRPZmZzZXQpIHsKKyAgICAgICAgQ0dDb250ZXh0U2V0VGV4dFBvc2l0aW9uKGNnQ29udGV4dCwg
cG9pbnQueCgpICsgZm9udC0+bV9zeW50aGV0aWNCb2xkT2Zmc2V0LCBwb2ludC55KCkpOworICAg
ICAgICBDR0NvbnRleHRTaG93R2x5cGhzV2l0aEFkdmFuY2VzKGNnQ29udGV4dCwgZ2x5cGhCdWZm
ZXIuZ2x5cGhzKGZyb20pLCBnbHlwaEJ1ZmZlci5hZHZhbmNlcyhmcm9tKSwgbnVtR2x5cGhzKTsK
KyAgICB9CisKKyAgICB3a1Jlc3RvcmVGb250U21vb3RoaW5nU3R5bGUoY2dDb250ZXh0LCBvbGRG
b250U21vb3RoaW5nU3R5bGUpOworfQorCitGbG9hdFJlY3QgRm9udDo6c2VsZWN0aW9uUmVjdEZv
ckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgSW50UG9pbnQmIHBvaW50LCBp
bnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZy
b20sIGludCB0bykgY29uc3QKK3sKKyAgICBVbmlzY3JpYmVDb250cm9sbGVyIGl0KHRoaXMsIHJ1
bik7CisgICAgaXQuYWR2YW5jZShmcm9tKTsKKyAgICBmbG9hdCBiZWZvcmVXaWR0aCA9IGl0LnJ1
bldpZHRoU29GYXIoKTsKKyAgICBpdC5hZHZhbmNlKHRvKTsKKyAgICBmbG9hdCBhZnRlcldpZHRo
ID0gaXQucnVuV2lkdGhTb0ZhcigpOworCisgICAgLy8gVXNpbmcgcm91bmRmKCkgcmF0aGVyIHRo
YW4gY2VpbGYoKSBmb3IgdGhlIHJpZ2h0IGVkZ2UgYXMgYSBjb21wcm9taXNlIHRvIGVuc3VyZSBj
b3JyZWN0IGNhcmV0IHBvc2l0aW9uaW5nCisgICAgaWYgKHJ1bi5ydGwoKSkgeworICAgICAgICBp
dC5hZHZhbmNlKHJ1bi5sZW5ndGgoKSk7CisgICAgICAgIGZsb2F0IHRvdGFsV2lkdGggPSBpdC5y
dW5XaWR0aFNvRmFyKCk7CisgICAgICAgIHJldHVybiBGbG9hdFJlY3QocG9pbnQueCgpICsgZmxv
b3JmKHRvdGFsV2lkdGggLSBhZnRlcldpZHRoKSwgcG9pbnQueSgpLCByb3VuZGYodG90YWxXaWR0
aCAtIGJlZm9yZVdpZHRoKSAtIGZsb29yZih0b3RhbFdpZHRoIC0gYWZ0ZXJXaWR0aCksIGgpOwor
ICAgIH0gCisgICAgCisgICAgcmV0dXJuIEZsb2F0UmVjdChwb2ludC54KCkgKyBmbG9vcmYoYmVm
b3JlV2lkdGgpLCBwb2ludC55KCksIHJvdW5kZihhZnRlcldpZHRoKSAtIGZsb29yZihiZWZvcmVX
aWR0aCksIGgpOworfQorCit2b2lkIEZvbnQ6OmRyYXdDb21wbGV4VGV4dChHcmFwaGljc0NvbnRl
eHQqIGNvbnRleHQsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAorewor
ICAgIC8vIFRoaXMgZ2x5cGggYnVmZmVyIGhvbGRzIG91ciBnbHlwaHMgKyBhZHZhbmNlcyArIGZv
bnQgZGF0YSBmb3IgZWFjaCBnbHlwaC4KKyAgICBHbHlwaEJ1ZmZlciBnbHlwaEJ1ZmZlcjsKKwor
ICAgIGZsb2F0IHN0YXJ0WCA9IHBvaW50LngoKTsKKyAgICBVbmlzY3JpYmVDb250cm9sbGVyIGNv
bnRyb2xsZXIodGhpcywgcnVuKTsKKyAgICBjb250cm9sbGVyLmFkdmFuY2UoZnJvbSk7CisgICAg
ZmxvYXQgYmVmb3JlV2lkdGggPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKTsKKyAgICBjb250
cm9sbGVyLmFkdmFuY2UodG8sICZnbHlwaEJ1ZmZlcik7CisgICAgCisgICAgLy8gV2UgY291bGRu
J3QgZ2VuZXJhdGUgYW55IGdseXBocyBmb3IgdGhlIHJ1bi4gIEdpdmUgdXAuCisgICAgaWYgKGds
eXBoQnVmZmVyLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIGZsb2F0IGFm
dGVyV2lkdGggPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKTsKKworICAgIGlmIChydW4ucnRs
KCkpIHsKKyAgICAgICAgY29udHJvbGxlci5hZHZhbmNlKHJ1bi5sZW5ndGgoKSk7CisgICAgICAg
IHN0YXJ0WCArPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKSAtIGFmdGVyV2lkdGg7CisgICAg
fSBlbHNlCisgICAgICAgIHN0YXJ0WCArPSBiZWZvcmVXaWR0aDsKKworICAgIC8vIERyYXcgdGhl
IGdseXBoIGJ1ZmZlciBub3cgYXQgdGhlIHN0YXJ0aW5nIHBvaW50IHJldHVybmVkIGluIHN0YXJ0
WC4KKyAgICBGbG9hdFBvaW50IHN0YXJ0UG9pbnQoc3RhcnRYLCBwb2ludC55KCkpOworICAgIGRy
YXdHbHlwaEJ1ZmZlcihjb250ZXh0LCBnbHlwaEJ1ZmZlciwgcnVuLCBzdGFydFBvaW50KTsKK30K
KworZmxvYXQgRm9udDo6ZmxvYXRXaWR0aEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1
bikgY29uc3QKK3sKKyAgICBVbmlzY3JpYmVDb250cm9sbGVyIGNvbnRyb2xsZXIodGhpcywgcnVu
KTsKKyAgICBjb250cm9sbGVyLmFkdmFuY2UocnVuLmxlbmd0aCgpKTsKKyAgICByZXR1cm4gY29u
dHJvbGxlci5ydW5XaWR0aFNvRmFyKCk7Cit9CisKK2ludCBGb250OjpvZmZzZXRGb3JQb3NpdGlv
bkZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgaW50IHgsIGJvb2wgaW5jbHVkZVBh
cnRpYWxHbHlwaHMpIGNvbnN0Cit7CisgICAgVW5pc2NyaWJlQ29udHJvbGxlciBjb250cm9sbGVy
KHRoaXMsIHJ1bik7CisgICAgcmV0dXJuIGNvbnRyb2xsZXIub2Zmc2V0Rm9yUG9zaXRpb24oeCwg
aW5jbHVkZVBhcnRpYWxHbHlwaHMpOworfQorCit9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbi9Gb250Q0dXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL0ZvbnRDR1dpbi5jcHAJKHJldmlzaW9uIDI5NzI2KQorKysgV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1
ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCBBcHBs
ZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCkBAIC0yNiwxMSArMjYsOSBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIkZv
bnQuaCIKIAotI2luY2x1ZGUgIkZvbnRGYWxsYmFja0xpc3QuaCIKICNpbmNsdWRlICJHbHlwaEJ1
ZmZlci5oIgogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2luY2x1ZGUgIkludFJlY3Qu
aCIKLSNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1ZGUgIlNpbXBsZUZvbnREYXRh
LmgiCiAjaW5jbHVkZSAiVW5pc2NyaWJlQ29udHJvbGxlci5oIgogI2luY2x1ZGUgPEFwcGxpY2F0
aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgpAQCAtNjgsMTUgKzY2LDcgQEAgdm9p
ZCBGb250OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCogZwogCiAgICAgICAgIC8vIFNldCB0
aGUgY29ycmVjdCBjb2xvci4KICAgICAgICAgSERDIHRleHREcmF3aW5nREMgPSBoZGM7Ci0gICAg
ICAgIC8qaWYgKGZpbGxDb2xvci5oYXNBbHBoYSgpIHx8IGdyYXBoaWNzQ29udGV4dC0+aW5UcmFu
c3BhcmVuY3lMYXllcigpKSB7Ci0gICAgICAgICAgICAvLyBHREkgY2FuJ3QgaGFuZGxlIGRyYXdp
bmcgdHJhbnNwYXJlbnQgdGV4dC4gIFdlIGhhdmUgdG8gZHJhdyBpbnRvIGEgbWFzay4gIFdlIGRy
YXcgYmxhY2sgdGV4dCBvbiBhIHdoaXRlLWZpbGxlZCBiYWNrZ3JvdW5kLgotICAgICAgICAgICAg
Ly8gV2UgYWxzbyBkbyB0aGlzIHdoZW4gaW5zaWRlIHRyYW5zcGFyZW5jeSBsYXllcnMsIHNpbmNl
IEdESSBhbHNvIGNhbid0IGRyYXcgb250byBhIHN1cmZhY2Ugd2l0aCBhbHBoYS4KLSAgICAgICAg
ICAgIGdyYXBoaWNzQ29udGV4dC0+c2F2ZSgpOwotICAgICAgICAgICAgZ3JhcGhpY3NDb250ZXh0
LT5zZXRGaWxsQ29sb3IoQ29sb3I6OndoaXRlKTsKLSAgICAgICAgICAgIHRleHREcmF3aW5nREMg
PSBncmFwaGljc0NvbnRleHQtPmdldFdpbmRvd3NCaXRtYXBDb250ZXh0KHRleHRSZWN0KTsKLSAg
ICAgICAgICAgIFNldFRleHRDb2xvcihoZGMsIFJHQigwLCAwLCAwKSk7Ci0gICAgICAgIH0gZWxz
ZSovCi0gICAgICAgICAgICBTZXRUZXh0Q29sb3IoaGRjLCBSR0IoZmlsbENvbG9yLnJlZCgpLCBm
aWxsQ29sb3IuZ3JlZW4oKSwgZmlsbENvbG9yLmJsdWUoKSkpOworICAgICAgICBTZXRUZXh0Q29s
b3IoaGRjLCBSR0IoZmlsbENvbG9yLnJlZCgpLCBmaWxsQ29sb3IuZ3JlZW4oKSwgZmlsbENvbG9y
LmJsdWUoKSkpOwogCiAgICAgICAgIFNldEJrTW9kZShoZGMsIFRSQU5TUEFSRU5UKTsKICAgICAg
ICAgU2V0VGV4dEFsaWduKGhkYywgVEFfTEVGVCB8IFRBX0JBU0VMSU5FKTsKQEAgLTk1LDM0ICs4
NSw2IEBAIHZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQqIGcKICAgICAgICAg
fQogICAgICAgICBFeHRUZXh0T3V0KGhkYywgcG9pbnQueCgpLCBwb2ludC55KCksIEVUT19HTFlQ
SF9JTkRFWCwgMCwgKFdDSEFSKilnbHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSksIG51bUdseXBocywg
Z2RpQWR2YW5jZXMuZGF0YSgpKTsKIAotICAgICAgICAvKmlmIChmaWxsQ29sb3IuaGFzQWxwaGEo
KSB8fCBncmFwaGljc0NvbnRleHQtPmluVHJhbnNwYXJlbmN5TGF5ZXIoKSkgewotICAgICAgICAg
ICAgLy8gVE9ET0Q6IFdlIGhhdmUgdG8gd2FsayB0aGUgYml0cyBvZiB0aGUgYml0bWFwIGFuZCBp
bnZlcnQgdGhlbS4gIFdlIGFsc28gY29weSBvdmVyIHRoZSBncmVlbiBjb21wb25lbnQgdmFsdWUg
aW50byB0aGUgYWxwaGEgdmFsdWUKLSAgICAgICAgICAgIC8vIHRvIGtlZXAgQ2xlYXJUeXBlIGxv
b2tpbmcgcmVhc29uYWJsZS4KLQotICAgICAgICAgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBkcmF3
biB0aGUgdGV4dCBpbnRvIGEgYml0bWFwIGFuZCBpbnZlcnRlZCBpdCwgb2J0YWluIGEgQ0dJbWFn
ZVJlZiBtYXNrLgotICAgICAgICAgICAgQ0dJbWFnZVJlZiBtYXNrID0gZ3JhcGhpY3NDb250ZXh0
LT5yZWxlYXNlV2luZG93c0JpdG1hcENvbnRleHRJbnRvTWFzayh0ZXh0RHJhd2luZ0RDLCB0ZXh0
UmVjdCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEFwcGx5IHRoZSBtYXNrIHRvIHRo
ZSBmaWxsIGNvbG9yLgotICAgICAgICAgICAgQ0dDb250ZXh0UmVmIGJpdG1hcENvbnRleHQgPSBn
cmFwaGljc0NvbnRleHQtPmdldFdpbmRvd3NDb21wYXRpYmxlQ0dCaXRtYXBDb250ZXh0KHRleHRS
ZWN0LnNpemUoKSk7Ci0gICAgICAgICAgICBDR0Zsb2F0IHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhh
OwotICAgICAgICAgICAgY29sb3IuZ2V0UkdCQShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci0g
ICAgICAgICAgICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoY29udGV4dCwgcmVkLCBncmVlbiwg
Ymx1ZSwgYWxwaGEpOwotICAgICAgICAgICAgQ0dDb250ZXh0RmlsbFJlY3QoYml0bWFwQ29udGV4
dCwgSW50UmVjdCgwLCAwLCB0ZXh0UmVjdC53aWR0aCgpLCB0ZXh0UmVjdC5oZWlnaHQoKSkpOwot
ICAgICAgICAgICAgQ0dJbWFnZVJlZiBmaWxsQ29sb3JJbWFnZSA9IENHQml0bWFwQ29udGV4dENy
ZWF0ZUltYWdlKGJpdG1hcENvbnRleHQpOwotICAgICAgICAKLSAgICAgICAgICAgIC8vIEFwcGx5
IHRoZSBtYXNrLgotICAgICAgICAgICAgQ0dJbWFnZVJlZiBmaW5hbEltYWdlID0gQ0dJbWFnZUNy
ZWF0ZVdpdGhNYXNrKGZpbGxDb2xvckltYWdlLCBtYXNrKTsKLQotICAgICAgICAgICAgLy8gVGhl
IGJpdG1hcCBpbWFnZSBuZWVkcyB0byBiZSBkcmF3biBpbnRvIHRoZSBIREMuCi0gICAgICAgICAg
ICBncmFwaGljc0NvbnRleHQtPmRyYXdJbWFnZUludG9XaW5kb3dzQ29udGV4dChoZGMsIGZpbmFs
SW1hZ2UpOwotCi0gICAgICAgICAgICAvLyBSZWxlYXNlIG91ciBpbWFnZXMgYW5kIGNvbnRleHRz
LgotICAgICAgICAgICAgQ0dJbWFnZVJlbGVhc2UobWFzayk7Ci0gICAgICAgICAgICBDR0ltYWdl
UmVsZWFzZShmaWxsQ29sb3JJbWFnZSk7Ci0gICAgICAgICAgICBDR0ltYWdlUmVsZWFzZShmaW5h
bEltYWdlKTsKLSAgICAgICAgICAgIENHQ29udGV4dFJlbGVhc2UoYml0bWFwQ29udGV4dCk7Ci0g
ICAgICAgIH0qLwotCiAgICAgICAgIGdyYXBoaWNzQ29udGV4dC0+cmVsZWFzZVdpbmRvd3NDb250
ZXh0KGhkYywgdGV4dFJlY3QpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTM5LDkgKzEw
MSw4IEBAIHZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQqIGcKICAgICBtYXRy
aXguYiA9IC1tYXRyaXguYjsKICAgICBtYXRyaXguZCA9IC1tYXRyaXguZDsKIAotICAgIGlmIChw
bGF0Zm9ybURhdGEuc3ludGhldGljT2JsaXF1ZSgpKQotICAgIHsKLSAgICAgICAgc3RhdGljIGZs
b2F0IHNrZXcgPSAtdGFuZihzeW50aGV0aWNPYmxpcXVlQW5nbGUgKiBhY29zZigwKSAvIDkwKTsK
KyAgICBpZiAocGxhdGZvcm1EYXRhLnN5bnRoZXRpY09ibGlxdWUoKSkgeworICAgICAgICBzdGF0
aWMgZmxvYXQgc2tldyA9IC10YW5mKHN5bnRoZXRpY09ibGlxdWVBbmdsZSAqIGFjb3NmKDApIC8g
OTAuMGYpOwogICAgICAgICBtYXRyaXggPSBDR0FmZmluZVRyYW5zZm9ybUNvbmNhdChtYXRyaXgs
IENHQWZmaW5lVHJhbnNmb3JtTWFrZSgxLCAwLCBza2V3LCAxLCAwLCAwKSk7CiAgICAgfQogCkBA
IC0xNjMsNjUgKzEyNCw0IEBAIHZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQq
IGcKICAgICB3a1Jlc3RvcmVGb250U21vb3RoaW5nU3R5bGUoY2dDb250ZXh0LCBvbGRGb250U21v
b3RoaW5nU3R5bGUpOwogfQogCi1GbG9hdFJlY3QgRm9udDo6c2VsZWN0aW9uUmVjdEZvckNvbXBs
ZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgSW50UG9pbnQmIHBvaW50LCBpbnQgaCwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyb20sIGlu
dCB0bykgY29uc3QKLXsKLSAgICBVbmlzY3JpYmVDb250cm9sbGVyIGl0KHRoaXMsIHJ1bik7Ci0g
ICAgaXQuYWR2YW5jZShmcm9tKTsKLSAgICBmbG9hdCBiZWZvcmVXaWR0aCA9IGl0LnJ1bldpZHRo
U29GYXIoKTsKLSAgICBpdC5hZHZhbmNlKHRvKTsKLSAgICBmbG9hdCBhZnRlcldpZHRoID0gaXQu
cnVuV2lkdGhTb0ZhcigpOwotCi0gICAgLy8gVXNpbmcgcm91bmRmKCkgcmF0aGVyIHRoYW4gY2Vp
bGYoKSBmb3IgdGhlIHJpZ2h0IGVkZ2UgYXMgYSBjb21wcm9taXNlIHRvIGVuc3VyZSBjb3JyZWN0
IGNhcmV0IHBvc2l0aW9uaW5nCi0gICAgaWYgKHJ1bi5ydGwoKSkgewotICAgICAgICBpdC5hZHZh
bmNlKHJ1bi5sZW5ndGgoKSk7Ci0gICAgICAgIGZsb2F0IHRvdGFsV2lkdGggPSBpdC5ydW5XaWR0
aFNvRmFyKCk7Ci0gICAgICAgIHJldHVybiBGbG9hdFJlY3QocG9pbnQueCgpICsgZmxvb3JmKHRv
dGFsV2lkdGggLSBhZnRlcldpZHRoKSwgcG9pbnQueSgpLCByb3VuZGYodG90YWxXaWR0aCAtIGJl
Zm9yZVdpZHRoKSAtIGZsb29yZih0b3RhbFdpZHRoIC0gYWZ0ZXJXaWR0aCksIGgpOwotICAgIH0g
Ci0gICAgCi0gICAgcmV0dXJuIEZsb2F0UmVjdChwb2ludC54KCkgKyBmbG9vcmYoYmVmb3JlV2lk
dGgpLCBwb2ludC55KCksIHJvdW5kZihhZnRlcldpZHRoKSAtIGZsb29yZihiZWZvcmVXaWR0aCks
IGgpOwotfQotCi12b2lkIEZvbnQ6OmRyYXdDb21wbGV4VGV4dChHcmFwaGljc0NvbnRleHQqIGNv
bnRleHQsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAotewotICAgIC8v
IFRoaXMgZ2x5cGggYnVmZmVyIGhvbGRzIG91ciBnbHlwaHMgKyBhZHZhbmNlcyArIGZvbnQgZGF0
YSBmb3IgZWFjaCBnbHlwaC4KLSAgICBHbHlwaEJ1ZmZlciBnbHlwaEJ1ZmZlcjsKLQotICAgIGZs
b2F0IHN0YXJ0WCA9IHBvaW50LngoKTsKLSAgICBVbmlzY3JpYmVDb250cm9sbGVyIGNvbnRyb2xs
ZXIodGhpcywgcnVuKTsKLSAgICBjb250cm9sbGVyLmFkdmFuY2UoZnJvbSk7Ci0gICAgZmxvYXQg
YmVmb3JlV2lkdGggPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKTsKLSAgICBjb250cm9sbGVy
LmFkdmFuY2UodG8sICZnbHlwaEJ1ZmZlcik7Ci0gICAgCi0gICAgLy8gV2UgY291bGRuJ3QgZ2Vu
ZXJhdGUgYW55IGdseXBocyBmb3IgdGhlIHJ1bi4gIEdpdmUgdXAuCi0gICAgaWYgKGdseXBoQnVm
ZmVyLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIGZsb2F0IGFmdGVyV2lk
dGggPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKTsKLQotICAgIGlmIChydW4ucnRsKCkpIHsK
LSAgICAgICAgY29udHJvbGxlci5hZHZhbmNlKHJ1bi5sZW5ndGgoKSk7Ci0gICAgICAgIHN0YXJ0
WCArPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKSAtIGFmdGVyV2lkdGg7Ci0gICAgfSBlbHNl
Ci0gICAgICAgIHN0YXJ0WCArPSBiZWZvcmVXaWR0aDsKLQotICAgIC8vIERyYXcgdGhlIGdseXBo
IGJ1ZmZlciBub3cgYXQgdGhlIHN0YXJ0aW5nIHBvaW50IHJldHVybmVkIGluIHN0YXJ0WC4KLSAg
ICBGbG9hdFBvaW50IHN0YXJ0UG9pbnQoc3RhcnRYLCBwb2ludC55KCkpOwotICAgIGRyYXdHbHlw
aEJ1ZmZlcihjb250ZXh0LCBnbHlwaEJ1ZmZlciwgcnVuLCBzdGFydFBvaW50KTsKLX0KLQotZmxv
YXQgRm9udDo6ZmxvYXRXaWR0aEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1bikgY29u
c3QKLXsKLSAgICBVbmlzY3JpYmVDb250cm9sbGVyIGNvbnRyb2xsZXIodGhpcywgcnVuKTsKLSAg
ICBjb250cm9sbGVyLmFkdmFuY2UocnVuLmxlbmd0aCgpKTsKLSAgICByZXR1cm4gY29udHJvbGxl
ci5ydW5XaWR0aFNvRmFyKCk7Ci19Ci0KLWludCBGb250OjpvZmZzZXRGb3JQb3NpdGlvbkZvckNv
bXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgaW50IHgsIGJvb2wgaW5jbHVkZVBhcnRpYWxH
bHlwaHMpIGNvbnN0Ci17Ci0gICAgVW5pc2NyaWJlQ29udHJvbGxlciBjb250cm9sbGVyKHRoaXMs
IHJ1bik7Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXIub2Zmc2V0Rm9yUG9zaXRpb24oeCwgaW5jbHVk
ZVBhcnRpYWxHbHlwaHMpOwotfQotCiB9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbi9Gb250Q2Fpcm9XaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL0ZvbnRDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbi9Gb250Q2Fpcm9XaW4uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsx
LDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJGb250Lmgi
CisKKyNpbmNsdWRlICJHbHlwaEJ1ZmZlci5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5o
IgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiU2ltcGxlRm9udERhdGEu
aCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2b2lkIEZvbnQ6OmRyYXdHbHlwaHMoR3JhcGhp
Y3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250LCBj
b25zdCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZmZXIsIAorICAgICAgICAgICAgICAgICAgICAgIGlu
dCBmcm9tLCBpbnQgbnVtR2x5cGhzLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29uc3QKK3sK
KyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbi9Gb250V2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbi9Gb250V2luLmNwcAkocmV2aXNpb24gMjk4MzQpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbi9Gb250V2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUg
QEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMu
ICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBA
IC0zMywxMzYgKzMzLDEwIEBACiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRl
ICJTaW1wbGVGb250RGF0YS5oIgogI2luY2x1ZGUgIlVuaXNjcmliZUNvbnRyb2xsZXIuaCIKLSNp
bmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KLSNpbmNs
dWRlIDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+CiAjaW5j
bHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1jb25zdCBp
bnQgc3ludGhldGljT2JsaXF1ZUFuZ2xlID0gMTQ7Ci0KLXZvaWQgRm9udDo6ZHJhd0dseXBocyhH
cmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwgY29uc3QgU2ltcGxlRm9udERhdGEqIGZv
bnQsIGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZlciwgCi0gICAgICAgICAgICAgICAgICAg
ICAgaW50IGZyb20sIGludCBudW1HbHlwaHMsIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KSBjb25z
dAotewotICAgIGlmIChmb250LT5tX2ZvbnQudXNlR0RJKCkpIHsKLSAgICAgICAgLy8gRklYTUU6
IFN1cHBvcnQgYWxwaGEgYmxlbmRpbmcuCi0gICAgICAgIC8vIEZJWE1FOiBTdXBwb3J0IHRleHQg
c3Ryb2tlL2ZpbGwuCi0gICAgICAgIC8vIEZJWE1FOiBTdXBwb3J0IHRleHQgc2hhZG93LgotICAg
ICAgICBDb2xvciBmaWxsQ29sb3IgPSBncmFwaGljc0NvbnRleHQtPmZpbGxDb2xvcigpOwotICAg
ICAgICBpZiAoZmlsbENvbG9yLmFscGhhKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybjsKLQot
ICAgICAgICAvLyBXZSBoYXZlIHRvIGNvbnZlcnQgQ0cncyB0d28tZGltZW5zaW9uYWwgZmxvYXRp
bmcgcG9pbnQgYWR2YW5jZXMgdG8ganVzdCBob3Jpem9udGFsIGludGVnZXIgYWR2YW5jZXMuCi0g
ICAgICAgIFZlY3RvcjxpbnQsIDIwNDg+IGdkaUFkdmFuY2VzOwotICAgICAgICBpbnQgdG90YWxX
aWR0aCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtR2x5cGhzOyBpKyspIHsK
LSAgICAgICAgICAgIGdkaUFkdmFuY2VzLmFwcGVuZChscm91bmRmKGdseXBoQnVmZmVyLmFkdmFu
Y2VBdChmcm9tICsgaSkpKTsKLSAgICAgICAgICAgIHRvdGFsV2lkdGggKz0gZ2RpQWR2YW5jZXNb
aV07Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBwdXQgc2xvcCBpbnRvIHRoaXMgcmVjdCwg
c2luY2UgZ2x5cGhzIGNhbiBvdmVyZmxvdyB0aGUgYXNjZW50L2Rlc2NlbnQgYm91bmRzIGFuZCB0
aGUgbGVmdC9yaWdodCBlZGdlcy4KLSAgICAgICAgaW50IGxpbmVHYXAgPSBmb250LT5saW5lR2Fw
KCk7Ci0gICAgICAgIEludFJlY3QgdGV4dFJlY3QocG9pbnQueCgpIC0gbGluZUdhcCwgcG9pbnQu
eSgpIC0gZm9udC0+YXNjZW50KCkgLSBsaW5lR2FwLCB0b3RhbFdpZHRoICsgMiAqIGxpbmVHYXAs
IGZvbnQtPmxpbmVTcGFjaW5nKCkpOwotICAgICAgICBIREMgaGRjID0gZ3JhcGhpY3NDb250ZXh0
LT5nZXRXaW5kb3dzQ29udGV4dCh0ZXh0UmVjdCk7Ci0gICAgICAgIFNlbGVjdE9iamVjdChoZGMs
IGZvbnQtPm1fZm9udC5oZm9udCgpKTsKLQotICAgICAgICAvLyBTZXQgdGhlIGNvcnJlY3QgY29s
b3IuCi0gICAgICAgIEhEQyB0ZXh0RHJhd2luZ0RDID0gaGRjOwotICAgICAgICAvKmlmIChmaWxs
Q29sb3IuaGFzQWxwaGEoKSB8fCBncmFwaGljc0NvbnRleHQtPmluVHJhbnNwYXJlbmN5TGF5ZXIo
KSkgewotICAgICAgICAgICAgLy8gR0RJIGNhbid0IGhhbmRsZSBkcmF3aW5nIHRyYW5zcGFyZW50
IHRleHQuICBXZSBoYXZlIHRvIGRyYXcgaW50byBhIG1hc2suICBXZSBkcmF3IGJsYWNrIHRleHQg
b24gYSB3aGl0ZS1maWxsZWQgYmFja2dyb3VuZC4KLSAgICAgICAgICAgIC8vIFdlIGFsc28gZG8g
dGhpcyB3aGVuIGluc2lkZSB0cmFuc3BhcmVuY3kgbGF5ZXJzLCBzaW5jZSBHREkgYWxzbyBjYW4n
dCBkcmF3IG9udG8gYSBzdXJmYWNlIHdpdGggYWxwaGEuCi0gICAgICAgICAgICBncmFwaGljc0Nv
bnRleHQtPnNhdmUoKTsKLSAgICAgICAgICAgIGdyYXBoaWNzQ29udGV4dC0+c2V0RmlsbENvbG9y
KENvbG9yOjp3aGl0ZSk7Ci0gICAgICAgICAgICB0ZXh0RHJhd2luZ0RDID0gZ3JhcGhpY3NDb250
ZXh0LT5nZXRXaW5kb3dzQml0bWFwQ29udGV4dCh0ZXh0UmVjdCk7Ci0gICAgICAgICAgICBTZXRU
ZXh0Q29sb3IoaGRjLCBSR0IoMCwgMCwgMCkpOwotICAgICAgICB9IGVsc2UqLwotICAgICAgICAg
ICAgU2V0VGV4dENvbG9yKGhkYywgUkdCKGZpbGxDb2xvci5yZWQoKSwgZmlsbENvbG9yLmdyZWVu
KCksIGZpbGxDb2xvci5ibHVlKCkpKTsKLQotICAgICAgICBTZXRCa01vZGUoaGRjLCBUUkFOU1BB
UkVOVCk7Ci0gICAgICAgIFNldFRleHRBbGlnbihoZGMsIFRBX0xFRlQgfCBUQV9CQVNFTElORSk7
Ci0KLSAgICAgICAgLy8gVW5pc2NyaWJlIGdpdmVzIHVzIG9mZnNldHMgdG8gaGVscCByZWZpbmUg
dGhlIHBvc2l0aW9uaW5nIG9mIGNvbWJpbmluZyBnbHlwaHMuCi0gICAgICAgIEZsb2F0U2l6ZSB0
cmFuc2xhdGlvbiA9IGdseXBoQnVmZmVyLm9mZnNldEF0KGZyb20pOwotICAgICAgICBpZiAodHJh
bnNsYXRpb24ud2lkdGgoKSB8fCB0cmFuc2xhdGlvbi5oZWlnaHQoKSkgewotICAgICAgICAgICAg
WEZPUk0geGZvcm07Ci0gICAgICAgICAgICB4Zm9ybS5lTTExID0gMS4wOwotICAgICAgICAgICAg
eGZvcm0uZU0xMiA9IDA7Ci0gICAgICAgICAgICB4Zm9ybS5lTTIxID0gMDsKLSAgICAgICAgICAg
IHhmb3JtLmVNMjIgPSAxLjA7Ci0gICAgICAgICAgICB4Zm9ybS5lRHggPSB0cmFuc2xhdGlvbi53
aWR0aCgpOwotICAgICAgICAgICAgeGZvcm0uZUR5ID0gdHJhbnNsYXRpb24uaGVpZ2h0KCk7Ci0g
ICAgICAgICAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShoZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxU
SVBMWSk7Ci0gICAgICAgIH0KLSAgICAgICAgRXh0VGV4dE91dChoZGMsIHBvaW50LngoKSwgcG9p
bnQueSgpLCBFVE9fR0xZUEhfSU5ERVgsIDAsIChXQ0hBUiopZ2x5cGhCdWZmZXIuZ2x5cGhzKGZy
b20pLCBudW1HbHlwaHMsIGdkaUFkdmFuY2VzLmRhdGEoKSk7Ci0KLSAgICAgICAgLyppZiAoZmls
bENvbG9yLmhhc0FscGhhKCkgfHwgZ3JhcGhpY3NDb250ZXh0LT5pblRyYW5zcGFyZW5jeUxheWVy
KCkpIHsKLSAgICAgICAgICAgIC8vIFRPRE9EOiBXZSBoYXZlIHRvIHdhbGsgdGhlIGJpdHMgb2Yg
dGhlIGJpdG1hcCBhbmQgaW52ZXJ0IHRoZW0uICBXZSBhbHNvIGNvcHkgb3ZlciB0aGUgZ3JlZW4g
Y29tcG9uZW50IHZhbHVlIGludG8gdGhlIGFscGhhIHZhbHVlCi0gICAgICAgICAgICAvLyB0byBr
ZWVwIENsZWFyVHlwZSBsb29raW5nIHJlYXNvbmFibGUuCi0KLSAgICAgICAgICAgIC8vIE5vdyB0
aGF0IHdlIGhhdmUgZHJhd24gdGhlIHRleHQgaW50byBhIGJpdG1hcCBhbmQgaW52ZXJ0ZWQgaXQs
IG9idGFpbiBhIENHSW1hZ2VSZWYgbWFzay4KLSAgICAgICAgICAgIENHSW1hZ2VSZWYgbWFzayA9
IGdyYXBoaWNzQ29udGV4dC0+cmVsZWFzZVdpbmRvd3NCaXRtYXBDb250ZXh0SW50b01hc2sodGV4
dERyYXdpbmdEQywgdGV4dFJlY3QpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBBcHBs
eSB0aGUgbWFzayB0byB0aGUgZmlsbCBjb2xvci4KLSAgICAgICAgICAgIENHQ29udGV4dFJlZiBi
aXRtYXBDb250ZXh0ID0gZ3JhcGhpY3NDb250ZXh0LT5nZXRXaW5kb3dzQ29tcGF0aWJsZUNHQml0
bWFwQ29udGV4dCh0ZXh0UmVjdC5zaXplKCkpOwotICAgICAgICAgICAgQ0dGbG9hdCByZWQsIGdy
ZWVuLCBibHVlLCBhbHBoYTsKLSAgICAgICAgICAgIGNvbG9yLmdldFJHQkEocmVkLCBncmVlbiwg
Ymx1ZSwgYWxwaGEpOwotICAgICAgICAgICAgQ0dDb250ZXh0U2V0UkdCRmlsbENvbG9yKGNvbnRl
eHQsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLSAgICAgICAgICAgIENHQ29udGV4dEZpbGxS
ZWN0KGJpdG1hcENvbnRleHQsIEludFJlY3QoMCwgMCwgdGV4dFJlY3Qud2lkdGgoKSwgdGV4dFJl
Y3QuaGVpZ2h0KCkpKTsKLSAgICAgICAgICAgIENHSW1hZ2VSZWYgZmlsbENvbG9ySW1hZ2UgPSBD
R0JpdG1hcENvbnRleHRDcmVhdGVJbWFnZShiaXRtYXBDb250ZXh0KTsKLSAgICAgICAgCi0gICAg
ICAgICAgICAvLyBBcHBseSB0aGUgbWFzay4KLSAgICAgICAgICAgIENHSW1hZ2VSZWYgZmluYWxJ
bWFnZSA9IENHSW1hZ2VDcmVhdGVXaXRoTWFzayhmaWxsQ29sb3JJbWFnZSwgbWFzayk7Ci0KLSAg
ICAgICAgICAgIC8vIFRoZSBiaXRtYXAgaW1hZ2UgbmVlZHMgdG8gYmUgZHJhd24gaW50byB0aGUg
SERDLgotICAgICAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5kcmF3SW1hZ2VJbnRvV2luZG93c0Nv
bnRleHQoaGRjLCBmaW5hbEltYWdlKTsKLQotICAgICAgICAgICAgLy8gUmVsZWFzZSBvdXIgaW1h
Z2VzIGFuZCBjb250ZXh0cy4KLSAgICAgICAgICAgIENHSW1hZ2VSZWxlYXNlKG1hc2spOwotICAg
ICAgICAgICAgQ0dJbWFnZVJlbGVhc2UoZmlsbENvbG9ySW1hZ2UpOwotICAgICAgICAgICAgQ0dJ
bWFnZVJlbGVhc2UoZmluYWxJbWFnZSk7Ci0gICAgICAgICAgICBDR0NvbnRleHRSZWxlYXNlKGJp
dG1hcENvbnRleHQpOwotICAgICAgICB9Ki8KLQotICAgICAgICBncmFwaGljc0NvbnRleHQtPnJl
bGVhc2VXaW5kb3dzQ29udGV4dChoZGMsIHRleHRSZWN0KTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLQotICAgIENHQ29udGV4dFJlZiBjZ0NvbnRleHQgPSBncmFwaGljc0NvbnRleHQtPnBsYXRm
b3JtQ29udGV4dCgpOwotCi0gICAgdWludDMyX3Qgb2xkRm9udFNtb290aGluZ1N0eWxlID0gd2tT
ZXRGb250U21vb3RoaW5nU3R5bGUoY2dDb250ZXh0KTsKLQotICAgIGNvbnN0IEZvbnRQbGF0Zm9y
bURhdGEmIHBsYXRmb3JtRGF0YSA9IGZvbnQtPnBsYXRmb3JtRGF0YSgpOwotCi0gICAgQ0dDb250
ZXh0U2V0Rm9udChjZ0NvbnRleHQsIHBsYXRmb3JtRGF0YS5jZ0ZvbnQoKSk7Ci0KLSAgICBDR0Fm
ZmluZVRyYW5zZm9ybSBtYXRyaXggPSBDR0FmZmluZVRyYW5zZm9ybUlkZW50aXR5OwotICAgIG1h
dHJpeC5iID0gLW1hdHJpeC5iOwotICAgIG1hdHJpeC5kID0gLW1hdHJpeC5kOwotCi0gICAgaWYg
KHBsYXRmb3JtRGF0YS5zeW50aGV0aWNPYmxpcXVlKCkpCi0gICAgewotICAgICAgICBzdGF0aWMg
ZmxvYXQgc2tldyA9IC10YW5mKHN5bnRoZXRpY09ibGlxdWVBbmdsZSAqIGFjb3NmKDApIC8gOTAp
OwotICAgICAgICBtYXRyaXggPSBDR0FmZmluZVRyYW5zZm9ybUNvbmNhdChtYXRyaXgsIENHQWZm
aW5lVHJhbnNmb3JtTWFrZSgxLCAwLCBza2V3LCAxLCAwLCAwKSk7Ci0gICAgfQotCi0gICAgLy8g
VW5pc2NyaWJlIGdpdmVzIHVzIG9mZnNldHMgdG8gaGVscCByZWZpbmUgdGhlIHBvc2l0aW9uaW5n
IG9mIGNvbWJpbmluZyBnbHlwaHMuCi0gICAgRmxvYXRTaXplIHRyYW5zbGF0aW9uID0gZ2x5cGhC
dWZmZXIub2Zmc2V0QXQoZnJvbSk7Ci0gICAgaWYgKHRyYW5zbGF0aW9uLndpZHRoKCkgfHwgdHJh
bnNsYXRpb24uaGVpZ2h0KCkpCi0gICAgICAgIENHQWZmaW5lVHJhbnNmb3JtVHJhbnNsYXRlKG1h
dHJpeCwgdHJhbnNsYXRpb24ud2lkdGgoKSwgdHJhbnNsYXRpb24uaGVpZ2h0KCkpOwotICAgIAot
ICAgIENHQ29udGV4dFNldFRleHRNYXRyaXgoY2dDb250ZXh0LCBtYXRyaXgpOwotCi0gICAgQ0dD
b250ZXh0U2V0Rm9udFNpemUoY2dDb250ZXh0LCBwbGF0Zm9ybURhdGEuc2l6ZSgpKTsKLSAgICBD
R0NvbnRleHRTZXRUZXh0UG9zaXRpb24oY2dDb250ZXh0LCBwb2ludC54KCksIHBvaW50LnkoKSk7
Ci0gICAgQ0dDb250ZXh0U2hvd0dseXBoc1dpdGhBZHZhbmNlcyhjZ0NvbnRleHQsIGdseXBoQnVm
ZmVyLmdseXBocyhmcm9tKSwgZ2x5cGhCdWZmZXIuYWR2YW5jZXMoZnJvbSksIG51bUdseXBocyk7
Ci0gICAgaWYgKGZvbnQtPm1fc3ludGhldGljQm9sZE9mZnNldCkgewotICAgICAgICBDR0NvbnRl
eHRTZXRUZXh0UG9zaXRpb24oY2dDb250ZXh0LCBwb2ludC54KCkgKyBmb250LT5tX3N5bnRoZXRp
Y0JvbGRPZmZzZXQsIHBvaW50LnkoKSk7Ci0gICAgICAgIENHQ29udGV4dFNob3dHbHlwaHNXaXRo
QWR2YW5jZXMoY2dDb250ZXh0LCBnbHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSksIGdseXBoQnVmZmVy
LmFkdmFuY2VzKGZyb20pLCBudW1HbHlwaHMpOwotICAgIH0KLQotICAgIHdrUmVzdG9yZUZvbnRT
bW9vdGhpbmdTdHlsZShjZ0NvbnRleHQsIG9sZEZvbnRTbW9vdGhpbmdTdHlsZSk7Ci19Ci0KIEZs
b2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYg
cnVuLCBjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCBoLAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAogewpJbmRleDog
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0Q0dXaW4uY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4
dENHV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCShmcm9tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0dyYXBoaWNzQ29udGV4dFdpbi5jcHA6Mjk4MzQpCisrKyBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRDR1dpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSwzODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIw
MDYsIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisKKyNpbmNsdWRlICJB
ZmZpbmVUcmFuc2Zvcm0uaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUg
IlBhdGguaCIKKyNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ0dCaXRtYXBDb250ZXh0Lmg+CisjaW5j
bHVkZSA8V2ViS2l0U3lzdGVtSW50ZXJmYWNlL1dlYktpdFN5c3RlbUludGVyZmFjZS5oPgorI2lu
Y2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CisKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGUuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCitjbGFzcyBTVkdSZXNvdXJjZUltYWdlOworCitzdGF0aWMgQ0dDb250ZXh0UmVmIENH
Q29udGV4dFdpdGhIREMoSERDIGhkYykKK3sKKyAgICBIQklUTUFQIGJpdG1hcCA9IChIQklUTUFQ
KUdldEN1cnJlbnRPYmplY3QoaGRjLCBPQkpfQklUTUFQKTsKKyAgICBDR0NvbG9yU3BhY2VSZWYg
ZGV2aWNlUkdCID0gQ0dDb2xvclNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7CisgICAgQklUTUFQIGlu
Zm87CisKKyAgICBHZXRPYmplY3QoYml0bWFwLCBzaXplb2YoaW5mbyksICZpbmZvKTsKKyAgICBB
U1NFUlQoaW5mby5ibUJpdHNQaXhlbCA9PSAzMik7CisgICAgQ0dDb250ZXh0UmVmIGNvbnRleHQg
PSBDR0JpdG1hcENvbnRleHRDcmVhdGUoaW5mby5ibUJpdHMsIGluZm8uYm1XaWR0aCwgaW5mby5i
bUhlaWdodCwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBpbmZvLmJtV2lkdGhCeXRlcywgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxp
dHRsZSB8IGtDR0ltYWdlQWxwaGFOb25lU2tpcEZpcnN0KTsKKyAgICBDR0NvbG9yU3BhY2VSZWxl
YXNlKGRldmljZVJHQik7CisKKyAgICAvLyBGbGlwIGNvb3JkcworICAgIENHQ29udGV4dFRyYW5z
bGF0ZUNUTShjb250ZXh0LCAwLCBpbmZvLmJtSGVpZ2h0KTsKKyAgICBDR0NvbnRleHRTY2FsZUNU
TShjb250ZXh0LCAxLCAtMSk7CisgICAgCisgICAgLy8gUHV0IHRoZSBIREMgSW4gYWR2YW5jZWQg
bW9kZSBzbyBpdCB3aWxsIGhvbm9yIGFmZmluZSB0cmFuc2Zvcm1zLgorICAgIFNldEdyYXBoaWNz
TW9kZShoZGMsIEdNX0FEVkFOQ0VEKTsKKyAgICAKKyAgICByZXR1cm4gY29udGV4dDsKK30KKwor
R3JhcGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRleHQoSERDIGhkYykKKyAgICA6IG1fY29tbW9u
KGNyZWF0ZUdyYXBoaWNzQ29udGV4dFByaXZhdGUoKSkKKyAgICAsIG1fZGF0YShuZXcgR3JhcGhp
Y3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKENHQ29udGV4dFdpdGhIREMoaGRjKSkpCit7CisgICAg
Q0dDb250ZXh0UmVsZWFzZShtX2RhdGEtPm1fY2dDb250ZXh0KTsKKyAgICBtX2RhdGEtPm1faGRj
ID0gaGRjOworICAgIHNldFBhaW50aW5nRGlzYWJsZWQoIW1fZGF0YS0+bV9jZ0NvbnRleHQpOwor
ICAgIGlmIChtX2RhdGEtPm1fY2dDb250ZXh0KSB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUg
Y29udGV4dCBzdGFydHMgaW4gc3luYyB3aXRoIG91ciBzdGF0ZS4KKyAgICAgICAgc2V0UGxhdGZv
cm1GaWxsQ29sb3IoZmlsbENvbG9yKCkpOworICAgICAgICBzZXRQbGF0Zm9ybVN0cm9rZUNvbG9y
KHN0cm9rZUNvbG9yKCkpOworICAgIH0KK30KKworSERDIEdyYXBoaWNzQ29udGV4dDo6Z2V0V2lu
ZG93c0NvbnRleHQoY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVu
ZCkKK3sKKyAgICBpZiAoaW5UcmFuc3BhcmVuY3lMYXllcigpKSB7CisgICAgICAgIGlmIChkc3RS
ZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIC8vIENyZWF0
ZSBhIGJpdG1hcCBEQyBpbiB3aGljaCB0byBkcmF3LgorICAgICAgICBCSVRNQVBJTkZPIGJpdG1h
cEluZm87CisgICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpU2l6ZSAgICAgICAgICA9IHNp
emVvZihCSVRNQVBJTkZPSEVBREVSKTsKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlX
aWR0aCAgICAgICAgID0gZHN0UmVjdC53aWR0aCgpOyAKKyAgICAgICAgYml0bWFwSW5mby5ibWlI
ZWFkZXIuYmlIZWlnaHQgICAgICAgID0gZHN0UmVjdC5oZWlnaHQoKTsKKyAgICAgICAgYml0bWFw
SW5mby5ibWlIZWFkZXIuYmlQbGFuZXMgICAgICAgID0gMTsKKyAgICAgICAgYml0bWFwSW5mby5i
bWlIZWFkZXIuYmlCaXRDb3VudCAgICAgID0gMzI7CisgICAgICAgIGJpdG1hcEluZm8uYm1pSGVh
ZGVyLmJpQ29tcHJlc3Npb24gICA9IEJJX1JHQjsKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFk
ZXIuYmlTaXplSW1hZ2UgICAgID0gMDsKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlY
UGVsc1Blck1ldGVyID0gMDsKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlZUGVsc1Bl
ck1ldGVyID0gMDsKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlDbHJVc2VkICAgICAg
ID0gMDsKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlDbHJJbXBvcnRhbnQgID0gMDsK
KworICAgICAgICB2b2lkKiBwaXhlbHMgPSAwOworICAgICAgICBIQklUTUFQIGJpdG1hcCA9IDo6
Q3JlYXRlRElCU2VjdGlvbihOVUxMLCAmYml0bWFwSW5mbywgRElCX1JHQl9DT0xPUlMsICZwaXhl
bHMsIDAsIDApOworICAgICAgICBpZiAoIWJpdG1hcCkKKyAgICAgICAgICAgIHJldHVybiAwOwor
CisgICAgICAgIEhEQyBiaXRtYXBEQyA9IDo6Q3JlYXRlQ29tcGF0aWJsZURDKG1fZGF0YS0+bV9o
ZGMpOworICAgICAgICA6OlNlbGVjdE9iamVjdChiaXRtYXBEQywgYml0bWFwKTsKKworICAgICAg
ICAvLyBGaWxsIG91ciBidWZmZXIgd2l0aCBjbGVhciBpZiB3ZSdyZSBnb2luZyB0byBhbHBoYSBi
bGVuZC4KKyAgICAgICAgaWYgKHN1cHBvcnRBbHBoYUJsZW5kKSB7CisgICAgICAgICAgICBCSVRN
QVAgYm1wSW5mbzsKKyAgICAgICAgICAgIEdldE9iamVjdChiaXRtYXAsIHNpemVvZihibXBJbmZv
KSwgJmJtcEluZm8pOworICAgICAgICAgICAgaW50IGJ1ZmZlclNpemUgPSBibXBJbmZvLmJtV2lk
dGhCeXRlcyAqIGJtcEluZm8uYm1IZWlnaHQ7CisgICAgICAgICAgICBtZW1zZXQoYm1wSW5mby5i
bUJpdHMsIDAsIGJ1ZmZlclNpemUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWFrZSBzdXJl
IHdlIGNhbiBkbyB3b3JsZCB0cmFuc2Zvcm1zLgorICAgICAgICBTZXRHcmFwaGljc01vZGUoYml0
bWFwREMsIEdNX0FEVkFOQ0VEKTsKKworICAgICAgICAvLyBBcHBseSBhIHRyYW5zbGF0aW9uIHRv
IG91ciBjb250ZXh0IHNvIHRoYXQgdGhlIGRyYXdpbmcgZG9uZSB3aWxsIGJlIGF0ICgwLDApIG9m
IHRoZSBiaXRtYXAuCisgICAgICAgIFhGT1JNIHhmb3JtOworICAgICAgICB4Zm9ybS5lTTExID0g
MS4wOworICAgICAgICB4Zm9ybS5lTTEyID0gMDsKKyAgICAgICAgeGZvcm0uZU0yMSA9IDA7Cisg
ICAgICAgIHhmb3JtLmVNMjIgPSAxLjA7CisgICAgICAgIHhmb3JtLmVEeCA9IC1kc3RSZWN0Lngo
KTsKKyAgICAgICAgeGZvcm0uZUR5ID0gLWRzdFJlY3QueSgpOworICAgICAgICA6OlNldFdvcmxk
VHJhbnNmb3JtKGJpdG1hcERDLCAmeGZvcm0pOworCisgICAgICAgIHJldHVybiBiaXRtYXBEQzsK
KyAgICB9CisKKyAgICBDR0NvbnRleHRGbHVzaChwbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgbV9k
YXRhLT5zYXZlKCk7CisgICAgcmV0dXJuIG1fZGF0YS0+bV9oZGM7Cit9CisKK2Jvb2wgR3JhcGhp
Y3NDb250ZXh0OjppblRyYW5zcGFyZW5jeUxheWVyKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLT5t
X3RyYW5zcGFyZW5jeUNvdW50OyB9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpyZWxlYXNlV2lu
ZG93c0NvbnRleHQoSERDIGhkYywgY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0
QWxwaGFCbGVuZCkKK3sKKyAgICBpZiAoaGRjICYmIGluVHJhbnNwYXJlbmN5TGF5ZXIoKSkgewor
ICAgICAgICBpZiAoZHN0UmVjdC5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAg
ICAgICAgSEJJVE1BUCBiaXRtYXAgPSAoSEJJVE1BUClHZXRDdXJyZW50T2JqZWN0KGhkYywgT0JK
X0JJVE1BUCk7CisKKyAgICAgICAgLy8gTmVlZCB0byBtYWtlIGEgQ0dJbWFnZSBvdXQgb2YgdGhl
IGJpdG1hcCdzIHBpeGVsIGJ1ZmZlciBhbmQgdGhlbiBkcmF3CisgICAgICAgIC8vIGl0IGludG8g
b3VyIGNvbnRleHQuCisgICAgICAgIEJJVE1BUCBpbmZvOworICAgICAgICBHZXRPYmplY3QoYml0
bWFwLCBzaXplb2YoaW5mbyksICZpbmZvKTsKKyAgICAgICAgQVNTRVJUKGluZm8uYm1CaXRzUGl4
ZWwgPT0gMzIpOworCisgICAgICAgIENHQ29sb3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9y
U3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKKyAgICAgICAgQ0dDb250ZXh0UmVmIGJpdG1hcENvbnRl
eHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUoaW5mby5ibUJpdHMsIGluZm8uYm1XaWR0aCwgaW5m
by5ibUhlaWdodCwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJHQiwga0NHQml0bWFw
Qnl0ZU9yZGVyMzJMaXR0bGUgfCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKHN1cHBvcnRBbHBoYUJsZW5kID8ga0NHSW1hZ2VBbHBo
YVByZW11bHRpcGxpZWRGaXJzdCA6IGtDR0ltYWdlQWxwaGFOb25lU2tpcEZpcnN0KSk7CisgICAg
ICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKKworICAgICAgICBDR0ltYWdlUmVm
IGltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlSW1hZ2UoYml0bWFwQ29udGV4dCk7CisgICAg
ICAgIENHQ29udGV4dERyYXdJbWFnZShtX2RhdGEtPm1fY2dDb250ZXh0LCBkc3RSZWN0LCBpbWFn
ZSk7CisgICAgICAgIAorICAgICAgICAvLyBEZWxldGUgYWxsIG91ciBqdW5rLgorICAgICAgICBD
R0ltYWdlUmVsZWFzZShpbWFnZSk7CisgICAgICAgIENHQ29udGV4dFJlbGVhc2UoYml0bWFwQ29u
dGV4dCk7CisgICAgICAgIDo6RGVsZXRlREMoaGRjKTsKKyAgICAgICAgOjpEZWxldGVPYmplY3Qo
Yml0bWFwKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9kYXRhLT5yZXN0b3Jl
KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpzYXZlKCkKK3sK
KyAgICBpZiAoIW1faGRjKQorICAgICAgICByZXR1cm47CisgICAgU2F2ZURDKG1faGRjKTsKK30K
Kwordm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnJlc3RvcmUoKQoreworICAg
IGlmICghbV9oZGMpCisgICAgICAgIHJldHVybjsKKyAgICBSZXN0b3JlREMobV9oZGMsIC0xKTsK
K30KKwordm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNsaXAoY29uc3QgSW50
UmVjdCYgY2xpcFJlY3QpCit7CisgICAgaWYgKCFtX2hkYykKKyAgICAgICAgcmV0dXJuOworICAg
IEludGVyc2VjdENsaXBSZWN0KG1faGRjLCBjbGlwUmVjdC54KCksIGNsaXBSZWN0LnkoKSwgY2xp
cFJlY3QucmlnaHQoKSwgY2xpcFJlY3QuYm90dG9tKCkpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y2xpcChjb25zdCBQYXRoJikKK3sKKyAgICBub3RJbXBsZW1l
bnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6c2NhbGUo
Y29uc3QgRmxvYXRTaXplJiBzaXplKQoreworICAgIGlmICghbV9oZGMpCisgICAgICAgIHJldHVy
bjsKKyAgICBYRk9STSB4Zm9ybTsKKyAgICB4Zm9ybS5lTTExID0gc2l6ZS53aWR0aCgpOworICAg
IHhmb3JtLmVNMTIgPSAwOworICAgIHhmb3JtLmVNMjEgPSAwOworICAgIHhmb3JtLmVNMjIgPSBz
aXplLmhlaWdodCgpOworICAgIHhmb3JtLmVEeCA9IDA7CisgICAgeGZvcm0uZUR5ID0gMDsKKyAg
ICBNb2RpZnlXb3JsZFRyYW5zZm9ybShtX2hkYywgJnhmb3JtLCBNV1RfTEVGVE1VTFRJUExZKTsK
K30KKworc3RhdGljIGNvbnN0IGRvdWJsZSBkZWcycmFkID0gMC4wMTc0NTMyOTI1MTk5NDMyOTU3
Njk7IC8vIHBpLzE4MAorCit2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6cm90
YXRlKGZsb2F0IGRlZ3JlZXNBbmdsZSkKK3sKKyAgICBmbG9hdCByYWRpYW5zQW5nbGUgPSBkZWdy
ZWVzQW5nbGUgKiBkZWcycmFkOworICAgIGZsb2F0IGNvc0FuZ2xlID0gY29zZihyYWRpYW5zQW5n
bGUpOworICAgIGZsb2F0IHNpbkFuZ2xlID0gc2luZihyYWRpYW5zQW5nbGUpOworICAgIFhGT1JN
IHhmb3JtOworICAgIHhmb3JtLmVNMTEgPSBjb3NBbmdsZTsKKyAgICB4Zm9ybS5lTTEyID0gLXNp
bkFuZ2xlOworICAgIHhmb3JtLmVNMjEgPSBzaW5BbmdsZTsKKyAgICB4Zm9ybS5lTTIyID0gY29z
QW5nbGU7CisgICAgeGZvcm0uZUR4ID0gMDsKKyAgICB4Zm9ybS5lRHkgPSAwOworICAgIE1vZGlm
eVdvcmxkVHJhbnNmb3JtKG1faGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOworfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6dHJhbnNsYXRlKGZsb2F0IHggLCBm
bG9hdCB5KQoreworICAgIGlmICghbV9oZGMpCisgICAgICAgIHJldHVybjsKKyAgICBYRk9STSB4
Zm9ybTsKKyAgICB4Zm9ybS5lTTExID0gMS4wOworICAgIHhmb3JtLmVNMTIgPSAwOworICAgIHhm
b3JtLmVNMjEgPSAwOworICAgIHhmb3JtLmVNMjIgPSAxLjA7CisgICAgeGZvcm0uZUR4ID0geDsK
KyAgICB4Zm9ybS5lRHkgPSB5OworICAgIE1vZGlmeVdvcmxkVHJhbnNmb3JtKG1faGRjLCAmeGZv
cm0sIE1XVF9MRUZUTVVMVElQTFkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3Jt
UHJpdmF0ZTo6Y29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdHJhbnNmb3JtKQorewor
ICAgIGlmICghbV9oZGMpCisgICAgICAgIHJldHVybjsKKyAgICBDR0FmZmluZVRyYW5zZm9ybSBt
YXQgPSB0cmFuc2Zvcm07CisgICAgWEZPUk0geGZvcm07CisgICAgeGZvcm0uZU0xMSA9IG1hdC5h
OworICAgIHhmb3JtLmVNMTIgPSBtYXQuYjsKKyAgICB4Zm9ybS5lTTIxID0gbWF0LmM7CisgICAg
eGZvcm0uZU0yMiA9IG1hdC5kOworICAgIHhmb3JtLmVEeCA9IG1hdC50eDsKKyAgICB4Zm9ybS5l
RHkgPSBtYXQudHk7CisgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdU
X0xFRlRNVUxUSVBMWSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3Rm9jdXNSaW5n
KGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBmbG9hdCByYWRpdXMgPSAoZm9jdXNSaW5nV2lkdGgoKSAtIDEp
IC8gMi4wZjsKKyAgICBpbnQgb2Zmc2V0ID0gcmFkaXVzICsgZm9jdXNSaW5nT2Zmc2V0KCk7Cisg
ICAgQ0dDb2xvclJlZiBjb2xvclJlZiA9IGNvbG9yLmlzVmFsaWQoKSA/IGNnQ29sb3IoY29sb3Ip
IDogMDsKKworICAgIENHTXV0YWJsZVBhdGhSZWYgZm9jdXNSaW5nUGF0aCA9IENHUGF0aENyZWF0
ZU11dGFibGUoKTsKKyAgICBjb25zdCBWZWN0b3I8SW50UmVjdD4mIHJlY3RzID0gZm9jdXNSaW5n
UmVjdHMoKTsKKyAgICB1bnNpZ25lZCByZWN0Q291bnQgPSByZWN0cy5zaXplKCk7CisgICAgZm9y
ICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlY3RDb3VudDsgaSsrKQorICAgICAgICBDR1BhdGhBZGRS
ZWN0KGZvY3VzUmluZ1BhdGgsIDAsIENHUmVjdEluc2V0KHJlY3RzW2ldLCAtb2Zmc2V0LCAtb2Zm
c2V0KSk7CisKKyAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOwor
ICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7CisKKyAgICBDR0NvbnRleHRCZWdpblBh
dGgoY29udGV4dCk7CisgICAgQ0dDb250ZXh0QWRkUGF0aChjb250ZXh0LCBmb2N1c1JpbmdQYXRo
KTsKKworICAgIHdrRHJhd0ZvY3VzUmluZyhjb250ZXh0LCBjb2xvclJlZiwgcmFkaXVzKTsKKwor
ICAgIENHQ29sb3JSZWxlYXNlKGNvbG9yUmVmKTsKKworICAgIENHUGF0aFJlbGVhc2UoZm9jdXNS
aW5nUGF0aCk7CisKKyAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOworfQorCitz
dGF0aWMgY29uc3QgQ29sb3ImIHNwZWxsaW5nUGF0dGVybkNvbG9yKCkgeworICAgIHN0YXRpYyBj
b25zdCBDb2xvciBzcGVsbGluZ0NvbG9yKDI1NSwgMCwgMCk7CisgICAgcmV0dXJuIHNwZWxsaW5n
Q29sb3I7Cit9CisKK3N0YXRpYyBjb25zdCBDb2xvciYgZ3JhbW1hclBhdHRlcm5Db2xvcigpIHsK
KyAgICBzdGF0aWMgY29uc3QgQ29sb3IgZ3JhbW1hckNvbG9yKDAsIDEyOCwgMCk7CisgICAgcmV0
dXJuIGdyYW1tYXJDb2xvcjsKK30KKworLy8gUHVsbGVkIGZyb20gR3JhcGhpY3NDb250ZXh0Q0cK
K3N0YXRpYyB2b2lkIHNldENHU3Ryb2tlQ29sb3IoQ0dDb250ZXh0UmVmIGNvbnRleHQsIGNvbnN0
IENvbG9yJiBjb2xvcikKK3sKKyAgICBDR0Zsb2F0IHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhOwor
ICAgIGNvbG9yLmdldFJHQkEocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworICAgIENHQ29udGV4
dFNldFJHQlN0cm9rZUNvbG9yKGNvbnRleHQsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKK30K
Kwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yTWlzc3BlbGxpbmdPckJhZEdyYW1t
YXIoY29uc3QgSW50UG9pbnQmIHBvaW50LCBpbnQgd2lkdGgsIGJvb2wgZ3JhbW1hcikKK3sKKyAg
ICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgLy8g
VGhlc2UgYXJlIHRoZSBzYW1lIGZvciBtaXNzcGVsbGluZyBvciBiYWQgZ3JhbW1hcgorICAgIGNv
bnN0IGludCBwYXR0ZXJuSGVpZ2h0ID0gMzsgLy8gMyByb3dzCisgICAgQVNTRVJUKGNNaXNzcGVs
bGluZ0xpbmVUaGlja25lc3MgPT0gcGF0dGVybkhlaWdodCk7CisgICAgY29uc3QgaW50IHBhdHRl
cm5XaWR0aCA9IDQ7IC8vIDQgcGl4ZWxzCisgICAgQVNTRVJUKHBhdHRlcm5XaWR0aCA9PSBjTWlz
c3BlbGxpbmdMaW5lUGF0dGVybldpZHRoKTsKKworICAgIC8vIE1ha2Ugc3VyZSB0byBkcmF3IG9u
bHkgY29tcGxldGUgZG90cy4KKyAgICAvLyBOT1RFOiBDb2RlIGhlcmUgdXNlZCB0byBzaGlmdCB0
aGUgdW5kZXJsaW5lIHRvIHRoZSBsZWZ0IGFuZCBpbmNyZWFzZSB0aGUgd2lkdGgKKyAgICAvLyB0
byBtYWtlIHN1cmUgZXZlcnl0aGluZyBnZXRzIHVuZGVybGluZWQsIGJ1dCB0aGF0IHJlc3VsdHMg
aW4gZHJhd2luZyBvdXQgb2YKKyAgICAvLyBib3VuZHMgKGUuZy4gd2hlbiBhdCB0aGUgZWRnZSBv
ZiBhIHZpZXcpIGFuZCBjb3VsZCBtYWtlIGl0IGFwcGVhciB0aGF0IHRoZQorICAgIC8vIHNwYWNl
IGJldHdlZW4gYWRqYWNlbnQgbWlzc3BlbGxlZCB3b3JkcyB3YXMgdW5kZXJsaW5lZC4KKyAgICAv
LyBhbGxvdyBzbGlnaHRseSBtb3JlIGNvbnNpZGVyaW5nIHRoYXQgdGhlIHBhdHRlcm4gZW5kcyB3
aXRoIGEgdHJhbnNwYXJlbnQgcGl4ZWwKKyAgICBpbnQgd2lkdGhNb2QgPSB3aWR0aCAlIHBhdHRl
cm5XaWR0aDsKKyAgICBpZiAocGF0dGVybldpZHRoIC0gd2lkdGhNb2QgPiBjTWlzc3BlbGxpbmdM
aW5lUGF0dGVybkdhcFdpZHRoKQorICAgICAgICB3aWR0aCAtPSB3aWR0aE1vZDsKKyAgICAgIAor
ICAgIC8vIERyYXcgdGhlIHVuZGVybGluZQorICAgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gcGxh
dGZvcm1Db250ZXh0KCk7CisgICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShjb250ZXh0KTsKKworICAg
IGNvbnN0IENvbG9yJiBwYXR0ZXJuQ29sb3IgPSBncmFtbWFyID8gZ3JhbW1hclBhdHRlcm5Db2xv
cigpIDogc3BlbGxpbmdQYXR0ZXJuQ29sb3IoKTsKKyAgICBzZXRDR1N0cm9rZUNvbG9yKGNvbnRl
eHQsIHBhdHRlcm5Db2xvcik7CisKKyAgICB3a1NldFBhdHRlcm5QaGFzZUluVXNlclNwYWNlKGNv
bnRleHQsIHBvaW50KTsKKyAgICBDR0NvbnRleHRTZXRCbGVuZE1vZGUoY29udGV4dCwga0NHQmxl
bmRNb2RlTm9ybWFsKTsKKyAgICAKKyAgICAvLyAzIHJvd3MsIGVhY2ggb2Zmc2V0IGJ5IGhhbGYg
YSBwaXhlbCBmb3IgYmxlbmRpbmcgcHVycG9zZXMKKyAgICBjb25zdCBDR1BvaW50IHVwcGVyUG9p
bnRzIFtdID0ge3twb2ludC54KCksIHBvaW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAyLjUgfSwg
e3BvaW50LngoKSArIHdpZHRoLCBwb2ludC55KCkgKyBwYXR0ZXJuSGVpZ2h0IC0gMi41fX07Cisg
ICAgY29uc3QgQ0dQb2ludCBtaWRkbGVQb2ludHMgW10gPSB7e3BvaW50LngoKSwgcG9pbnQueSgp
ICsgcGF0dGVybkhlaWdodCAtIDEuNSB9LCB7cG9pbnQueCgpICsgd2lkdGgsIHBvaW50LnkoKSAr
IHBhdHRlcm5IZWlnaHQgLSAxLjV9fTsKKyAgICBjb25zdCBDR1BvaW50IGxvd2VyUG9pbnRzIFtd
ID0ge3twb2ludC54KCksIHBvaW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAwLjUgfSwge3BvaW50
LngoKSArIHdpZHRoLCBwb2ludC55KCkgKyBwYXR0ZXJuSGVpZ2h0IC0gMC41IH19OworICAgIAor
ICAgIC8vIERhc2ggbGVuZ3RocyBmb3IgdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBlcnJvciB1
bmRlcmxpbmUgYXJlIHRoZSBzYW1lLgorICAgIC8vIFRoZXNlIGFyZSBtYWdpYy4KKyAgICBzdGF0
aWMgY29uc3QgZmxvYXQgZWRnZV9kYXNoX2xlbmd0aHNbXSA9IHsyLCAyfTsKKyAgICBzdGF0aWMg
Y29uc3QgZmxvYXQgbWlkZGxlX2Rhc2hfbGVuZ3Roc1tdID0gezIuNzZmLCAxLjI0Zn07CisgICAg
c3RhdGljIGNvbnN0IGZsb2F0IGVkZ2Vfb2Zmc2V0ID0gLShlZGdlX2Rhc2hfbGVuZ3Roc1sxXSAt
IDEuMGYpIC8gMi4wZjsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgbWlkZGxlX29mZnNldCA9IC0o
bWlkZGxlX2Rhc2hfbGVuZ3Roc1sxXSAtIDEuMGYpIC8gMi4wZjsKKworICAgIC8vIExpbmUgb3Bh
Y2l0aWVzLiAgT25jZSBhZ2FpbiwgdGhlc2UgYXJlIG1hZ2ljLgorICAgIGNvbnN0IGZsb2F0IHVw
cGVyT3BhY2l0eSA9IDAuMzNmOworICAgIGNvbnN0IGZsb2F0IG1pZGRsZU9wYWNpdHkgPSAwLjc1
ZjsKKyAgICBjb25zdCBmbG9hdCBsb3dlck9wYWNpdHkgPSAwLjg4ZjsKKworICAgIC8vVG9wIGxp
bmUKKyAgICBDR0NvbnRleHRTZXRMaW5lRGFzaChjb250ZXh0LCBlZGdlX29mZnNldCwgZWRnZV9k
YXNoX2xlbmd0aHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlZGdlX2Rhc2hf
bGVuZ3RocykgLyBzaXplb2YoZWRnZV9kYXNoX2xlbmd0aHNbMF0pKTsKKyAgICBDR0NvbnRleHRT
ZXRBbHBoYShjb250ZXh0LCB1cHBlck9wYWNpdHkpOworICAgIENHQ29udGV4dFN0cm9rZUxpbmVT
ZWdtZW50cyhjb250ZXh0LCB1cHBlclBvaW50cywgMik7CisgCisgICAgLy8gTWlkZGxlIGxpbmUK
KyAgICBDR0NvbnRleHRTZXRMaW5lRGFzaChjb250ZXh0LCBtaWRkbGVfb2Zmc2V0LCBtaWRkbGVf
ZGFzaF9sZW5ndGhzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobWlkZGxlX2Rh
c2hfbGVuZ3RocykgLyBzaXplb2YobWlkZGxlX2Rhc2hfbGVuZ3Roc1swXSkpOworICAgIENHQ29u
dGV4dFNldEFscGhhKGNvbnRleHQsIG1pZGRsZU9wYWNpdHkpOworICAgIENHQ29udGV4dFN0cm9r
ZUxpbmVTZWdtZW50cyhjb250ZXh0LCBtaWRkbGVQb2ludHMsIDIpOworICAgIAorICAgIC8vIEJv
dHRvbSBsaW5lCisgICAgQ0dDb250ZXh0U2V0TGluZURhc2goY29udGV4dCwgZWRnZV9vZmZzZXQs
IGVkZ2VfZGFzaF9sZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlZGdl
X2Rhc2hfbGVuZ3RocykgLyBzaXplb2YoZWRnZV9kYXNoX2xlbmd0aHNbMF0pKTsKKyAgICBDR0Nv
bnRleHRTZXRBbHBoYShjb250ZXh0LCBsb3dlck9wYWNpdHkpOworICAgIENHQ29udGV4dFN0cm9r
ZUxpbmVTZWdtZW50cyhjb250ZXh0LCBsb3dlclBvaW50cywgMik7CisKKyAgICBDR0NvbnRleHRS
ZXN0b3JlR1N0YXRlKGNvbnRleHQpOworfQorCisjaWYgRU5BQkxFKFNWRykKK0dyYXBoaWNzQ29u
dGV4dCogY29udGV4dEZvckltYWdlKFNWR1Jlc291cmNlSW1hZ2UqKQoreworICAgIC8vIEZJWE1F
OiBUaGlzIHNob3VsZCBnbyBpbiBHcmFwaGljc0NvbnRleHRDRy5jcHAKKyAgICBub3RJbXBsZW1l
bnRlZCgpOworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKK30KSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENHV2luLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRDR1dpbi5jcHAJ
KHJldmlzaW9uIDI5NzI2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhp
Y3NDb250ZXh0Q0dXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAq
IENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIw
MDYsIDIwMDcsIDIwMDggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yOSwyMSArMjksMTggQEAKICNpbmNsdWRlICJBZmZp
bmVUcmFuc2Zvcm0uaCIKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1ZGUgIlBh
dGguaCIKKwogI2luY2x1ZGUgPENvcmVHcmFwaGljcy9DR0JpdG1hcENvbnRleHQuaD4KICNpbmNs
dWRlIDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+Ci0jaW5j
bHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KLQotI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFBsYXRm
b3JtUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZUNH
LmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotY2xh
c3MgU1ZHUmVzb3VyY2VJbWFnZTsKLQogc3RhdGljIENHQ29udGV4dFJlZiBDR0NvbnRleHRXaXRo
SERDKEhEQyBoZGMpCiB7Ci0gICAgSEJJVE1BUCBiaXRtYXAgPSAoSEJJVE1BUClHZXRDdXJyZW50
T2JqZWN0KGhkYywgT0JKX0JJVE1BUCk7CisgICAgSEJJVE1BUCBiaXRtYXAgPSBzdGF0aWNfY2Fz
dDxIQklUTUFQPihHZXRDdXJyZW50T2JqZWN0KGhkYywgT0JKX0JJVE1BUCkpOwogICAgIENHQ29s
b3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKICAg
ICBCSVRNQVAgaW5mbzsKIApAQCAtNzcsNiArNzQsOCBAQCBHcmFwaGljc0NvbnRleHQ6OkdyYXBo
aWNzQ29udGV4dChIREMgaGRjCiAgICAgfQogfQogCitib29sIEdyYXBoaWNzQ29udGV4dDo6aW5U
cmFuc3BhcmVuY3lMYXllcigpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS0+bV90cmFuc3BhcmVuY3lD
b3VudDsgfQorCiBIREMgR3JhcGhpY3NDb250ZXh0OjpnZXRXaW5kb3dzQ29udGV4dChjb25zdCBJ
bnRSZWN0JiBkc3RSZWN0LCBib29sIHN1cHBvcnRBbHBoYUJsZW5kKQogewogICAgIGlmIChpblRy
YW5zcGFyZW5jeUxheWVyKCkpIHsKQEAgLTExOCwxMCArMTE3LDEwIEBAIEhEQyBHcmFwaGljc0Nv
bnRleHQ6OmdldFdpbmRvd3NDb250ZXh0KGMKIAogICAgICAgICAvLyBBcHBseSBhIHRyYW5zbGF0
aW9uIHRvIG91ciBjb250ZXh0IHNvIHRoYXQgdGhlIGRyYXdpbmcgZG9uZSB3aWxsIGJlIGF0ICgw
LDApIG9mIHRoZSBiaXRtYXAuCiAgICAgICAgIFhGT1JNIHhmb3JtOwotICAgICAgICB4Zm9ybS5l
TTExID0gMS4wOwotICAgICAgICB4Zm9ybS5lTTEyID0gMDsKLSAgICAgICAgeGZvcm0uZU0yMSA9
IDA7Ci0gICAgICAgIHhmb3JtLmVNMjIgPSAxLjA7CisgICAgICAgIHhmb3JtLmVNMTEgPSAxLjBm
OworICAgICAgICB4Zm9ybS5lTTEyID0gMC4wZjsKKyAgICAgICAgeGZvcm0uZU0yMSA9IDAuMGY7
CisgICAgICAgIHhmb3JtLmVNMjIgPSAxLjBmOwogICAgICAgICB4Zm9ybS5lRHggPSAtZHN0UmVj
dC54KCk7CiAgICAgICAgIHhmb3JtLmVEeSA9IC1kc3RSZWN0LnkoKTsKICAgICAgICAgOjpTZXRX
b3JsZFRyYW5zZm9ybShiaXRtYXBEQywgJnhmb3JtKTsKQEAgLTEzNCwxNSArMTMzLDEzIEBAIEhE
QyBHcmFwaGljc0NvbnRleHQ6OmdldFdpbmRvd3NDb250ZXh0KGMKICAgICByZXR1cm4gbV9kYXRh
LT5tX2hkYzsKIH0KIAotYm9vbCBHcmFwaGljc0NvbnRleHQ6OmluVHJhbnNwYXJlbmN5TGF5ZXIo
KSBjb25zdCB7IHJldHVybiBtX2RhdGEtPm1fdHJhbnNwYXJlbmN5Q291bnQ7IH0KLQogdm9pZCBH
cmFwaGljc0NvbnRleHQ6OnJlbGVhc2VXaW5kb3dzQ29udGV4dChIREMgaGRjLCBjb25zdCBJbnRS
ZWN0JiBkc3RSZWN0LCBib29sIHN1cHBvcnRBbHBoYUJsZW5kKQogewogICAgIGlmIChoZGMgJiYg
aW5UcmFuc3BhcmVuY3lMYXllcigpKSB7CiAgICAgICAgIGlmIChkc3RSZWN0LmlzRW1wdHkoKSkK
ICAgICAgICAgICAgIHJldHVybjsKIAotICAgICAgICBIQklUTUFQIGJpdG1hcCA9IChIQklUTUFQ
KUdldEN1cnJlbnRPYmplY3QoaGRjLCBPQkpfQklUTUFQKTsKKyAgICAgICAgSEJJVE1BUCBiaXRt
YXAgPSBzdGF0aWNfY2FzdDxIQklUTUFQPihHZXRDdXJyZW50T2JqZWN0KGhkYywgT0JKX0JJVE1B
UCkpOwogCiAgICAgICAgIC8vIE5lZWQgdG8gbWFrZSBhIENHSW1hZ2Ugb3V0IG9mIHRoZSBiaXRt
YXAncyBwaXhlbCBidWZmZXIgYW5kIHRoZW4gZHJhdwogICAgICAgICAvLyBpdCBpbnRvIG91ciBj
b250ZXh0LgpAQCAtMjAzLDExICsyMDAsMTEgQEAgdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9y
bVByaXZhdGU6OnNjYQogICAgICAgICByZXR1cm47CiAgICAgWEZPUk0geGZvcm07CiAgICAgeGZv
cm0uZU0xMSA9IHNpemUud2lkdGgoKTsKLSAgICB4Zm9ybS5lTTEyID0gMDsKLSAgICB4Zm9ybS5l
TTIxID0gMDsKKyAgICB4Zm9ybS5lTTEyID0gMC4wZjsKKyAgICB4Zm9ybS5lTTIxID0gMC4wZjsK
ICAgICB4Zm9ybS5lTTIyID0gc2l6ZS5oZWlnaHQoKTsKLSAgICB4Zm9ybS5lRHggPSAwOwotICAg
IHhmb3JtLmVEeSA9IDA7CisgICAgeGZvcm0uZUR4ID0gMC4wZjsKKyAgICB4Zm9ybS5lRHkgPSAw
LjBmOwogICAgIE1vZGlmeVdvcmxkVHJhbnNmb3JtKG1faGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVM
VElQTFkpOwogfQogCkBAIC0yMjMsOCArMjIwLDggQEAgdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGU6OnJvdAogICAgIHhmb3JtLmVNMTIgPSAtc2luQW5nbGU7CiAgICAgeGZvcm0u
ZU0yMSA9IHNpbkFuZ2xlOwogICAgIHhmb3JtLmVNMjIgPSBjb3NBbmdsZTsKLSAgICB4Zm9ybS5l
RHggPSAwOwotICAgIHhmb3JtLmVEeSA9IDA7CisgICAgeGZvcm0uZUR4ID0gMC4wZjsKKyAgICB4
Zm9ybS5lRHkgPSAwLjBmOwogICAgIE1vZGlmeVdvcmxkVHJhbnNmb3JtKG1faGRjLCAmeGZvcm0s
IE1XVF9MRUZUTVVMVElQTFkpOwogfQogCkBAIC0yMzMsMTAgKzIzMCwxMCBAQCB2b2lkIEdyYXBo
aWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6dHJhCiAgICAgaWYgKCFtX2hkYykKICAgICAgICAg
cmV0dXJuOwogICAgIFhGT1JNIHhmb3JtOwotICAgIHhmb3JtLmVNMTEgPSAxLjA7Ci0gICAgeGZv
cm0uZU0xMiA9IDA7Ci0gICAgeGZvcm0uZU0yMSA9IDA7Ci0gICAgeGZvcm0uZU0yMiA9IDEuMDsK
KyAgICB4Zm9ybS5lTTExID0gMS4wZjsKKyAgICB4Zm9ybS5lTTEyID0gMC4wZjsKKyAgICB4Zm9y
bS5lTTIxID0gMC4wZjsKKyAgICB4Zm9ybS5lTTIyID0gMS4wZjsKICAgICB4Zm9ybS5lRHggPSB4
OwogICAgIHhmb3JtLmVEeSA9IHk7CiAgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4
Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7CkBAIC0yNDYsNiArMjQzLDcgQEAgdm9pZCBHcmFwaGlj
c0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNvbgogewogICAgIGlmICghbV9oZGMpCiAgICAgICAg
IHJldHVybjsKKwogICAgIENHQWZmaW5lVHJhbnNmb3JtIG1hdCA9IHRyYW5zZm9ybTsKICAgICBY
Rk9STSB4Zm9ybTsKICAgICB4Zm9ybS5lTTExID0gbWF0LmE7CkBAIC0yNTQsNiArMjUyLDcgQEAg
dm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNvbgogICAgIHhmb3JtLmVNMjIg
PSBtYXQuZDsKICAgICB4Zm9ybS5lRHggPSBtYXQudHg7CiAgICAgeGZvcm0uZUR5ID0gbWF0LnR5
OworCiAgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxU
SVBMWSk7CiB9CiAKQEAgLTI4Nyw2ICsyODYsMTQgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRy
YXdGb2N1c1JpbmcoY29ucwogICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29udGV4dCk7CiB9
CiAKKy8vIFB1bGxlZCBmcm9tIEdyYXBoaWNzQ29udGV4dENHCitzdGF0aWMgdm9pZCBzZXRDR1N0
cm9rZUNvbG9yKENHQ29udGV4dFJlZiBjb250ZXh0LCBjb25zdCBDb2xvciYgY29sb3IpCit7Cisg
ICAgQ0dGbG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKKyAgICBjb2xvci5nZXRSR0JBKHJl
ZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAgICBDR0NvbnRleHRTZXRSR0JTdHJva2VDb2xvcihj
b250ZXh0LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Cit9CisKIHN0YXRpYyBjb25zdCBDb2xv
ciYgc3BlbGxpbmdQYXR0ZXJuQ29sb3IoKSB7CiAgICAgc3RhdGljIGNvbnN0IENvbG9yIHNwZWxs
aW5nQ29sb3IoMjU1LCAwLCAwKTsKICAgICByZXR1cm4gc3BlbGxpbmdDb2xvcjsKQEAgLTI5Nywx
OSArMzA0LDExIEBAIHN0YXRpYyBjb25zdCBDb2xvciYgZ3JhbW1hclBhdHRlcm5Db2xvcigKICAg
ICByZXR1cm4gZ3JhbW1hckNvbG9yOwogfQogCi0vLyBQdWxsZWQgZnJvbSBHcmFwaGljc0NvbnRl
eHRDRwotc3RhdGljIHZvaWQgc2V0Q0dTdHJva2VDb2xvcihDR0NvbnRleHRSZWYgY29udGV4dCwg
Y29uc3QgQ29sb3ImIGNvbG9yKQotewotICAgIENHRmxvYXQgcmVkLCBncmVlbiwgYmx1ZSwgYWxw
aGE7Ci0gICAgY29sb3IuZ2V0UkdCQShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci0gICAgQ0dD
b250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IoY29udGV4dCwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEp
OwotfQotCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JNaXNzcGVsbGluZ09yQmFk
R3JhbW1hcihjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCB3aWR0aCwgYm9vbCBncmFtbWFyKQog
ewogICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCiAgICAgICAgIHJldHVybjsKLSAgICAKKwog
ICAgIC8vIFRoZXNlIGFyZSB0aGUgc2FtZSBmb3IgbWlzc3BlbGxpbmcgb3IgYmFkIGdyYW1tYXIK
ICAgICBjb25zdCBpbnQgcGF0dGVybkhlaWdodCA9IDM7IC8vIDMgcm93cwogICAgIEFTU0VSVChj
TWlzc3BlbGxpbmdMaW5lVGhpY2tuZXNzID09IHBhdHRlcm5IZWlnaHQpOwpAQCAtMzQzLDcgKzM0
Miw3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvck1pc3NwZWwKICAgICAKICAg
ICAvLyBEYXNoIGxlbmd0aHMgZm9yIHRoZSB0b3AgYW5kIGJvdHRvbSBvZiB0aGUgZXJyb3IgdW5k
ZXJsaW5lIGFyZSB0aGUgc2FtZS4KICAgICAvLyBUaGVzZSBhcmUgbWFnaWMuCi0gICAgc3RhdGlj
IGNvbnN0IGZsb2F0IGVkZ2VfZGFzaF9sZW5ndGhzW10gPSB7MiwgMn07CisgICAgc3RhdGljIGNv
bnN0IGZsb2F0IGVkZ2VfZGFzaF9sZW5ndGhzW10gPSB7Mi4wZiwgMi4wZn07CiAgICAgc3RhdGlj
IGNvbnN0IGZsb2F0IG1pZGRsZV9kYXNoX2xlbmd0aHNbXSA9IHsyLjc2ZiwgMS4yNGZ9OwogICAg
IHN0YXRpYyBjb25zdCBmbG9hdCBlZGdlX29mZnNldCA9IC0oZWRnZV9kYXNoX2xlbmd0aHNbMV0g
LSAxLjBmKSAvIDIuMGY7CiAgICAgc3RhdGljIGNvbnN0IGZsb2F0IG1pZGRsZV9vZmZzZXQgPSAt
KG1pZGRsZV9kYXNoX2xlbmd0aHNbMV0gLSAxLjBmKSAvIDIuMGY7CkBAIC0zNzQsMTMgKzM3Myw0
IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvck1pc3NwZWwKICAgICBDR0NvbnRl
eHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOwogfQogCi0jaWYgRU5BQkxFKFNWRykKLUdyYXBoaWNz
Q29udGV4dCogY29udGV4dEZvckltYWdlKFNWR1Jlc291cmNlSW1hZ2UqKQotewotICAgIC8vIEZJ
WE1FOiBUaGlzIHNob3VsZCBnbyBpbiBHcmFwaGljc0NvbnRleHRDRy5jcHAKLSAgICBub3RJbXBs
ZW1lbnRlZCgpOwotICAgIHJldHVybiAwOwotfQotI2VuZGlmCi0KIH0KSW5kZXg6IFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENhaXJvV2luLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRDYWly
b1dpbi5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9H
cmFwaGljc0NvbnRleHRDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTE0IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENP
TVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09N
UFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4
dC5oIgorCisjaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCisjaW5jbHVkZSAiTm90SW1wbGVt
ZW50ZWQuaCIKKyNpbmNsdWRlICJQYXRoLmgiCisKKyNpbmNsdWRlIDxjYWlyby13aW4zMi5oPgor
I2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZUNhaXJvLmgiCisKK3VzaW5n
IG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworR3JhcGhpY3NDb250ZXh0
OjpHcmFwaGljc0NvbnRleHQoSERDIGRjKQorICAgIDogbV9jb21tb24oY3JlYXRlR3JhcGhpY3ND
b250ZXh0UHJpdmF0ZSgpKQorICAgICwgbV9kYXRhKG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9y
bVByaXZhdGUpCit7CisgICAgaWYgKGRjKSB7CisgICAgICAgIGNhaXJvX3N1cmZhY2VfdCogc3Vy
ZmFjZSA9IGNhaXJvX3dpbjMyX3N1cmZhY2VfY3JlYXRlKGRjKTsKKyAgICAgICAgbV9kYXRhLT5j
ciA9IGNhaXJvX2NyZWF0ZShzdXJmYWNlKTsKKyAgICAgICAgbV9kYXRhLT5tX2hkYyA9IGRjOwor
ICAgIH0gZWxzZSB7CisgICAgICAgIHNldFBhaW50aW5nRGlzYWJsZWQodHJ1ZSk7CisgICAgICAg
IG1fZGF0YS0+Y3IgPSAwOworICAgICAgICBtX2RhdGEtPm1faGRjID0gMDsKKyAgICB9CisKKyAg
ICBpZiAobV9kYXRhLT5jcikgeworICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGNvbnRleHQgc3Rh
cnRzIGluIHN5bmMgd2l0aCBvdXIgc3RhdGUuCisgICAgICAgIHNldFBsYXRmb3JtRmlsbENvbG9y
KGZpbGxDb2xvcigpKTsKKyAgICAgICAgc2V0UGxhdGZvcm1TdHJva2VDb2xvcihzdHJva2VDb2xv
cigpKTsKKyAgICB9Cit9CisKK0hEQyBHcmFwaGljc0NvbnRleHQ6OmdldFdpbmRvd3NDb250ZXh0
KGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGJvb2wgc3VwcG9ydEFscGhhQmxlbmQpCit7CisgICAg
Ly8gVGhpcyBpcyBwcm9iYWJseSB3cm9uZywgYW5kIGRlZmluaXRlbHkgb3V0IG9mIGRhdGUuICBQ
dWxsZWQgZnJvbSBvbGQgU1ZOCisgICAgY2Fpcm9fc3VyZmFjZV90KiBzdXJmYWNlID0gY2Fpcm9f
Z2V0X3RhcmdldChwbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgSERDIGhkYyA9IGNhaXJvX3dpbjMy
X3N1cmZhY2VfZ2V0X2RjKHN1cmZhY2UpOyAgIAorICAgIFNhdmVEQyhoZGMpOworCisgICAgLy8g
RklYTUU6IFdlIG5lZWQgdG8gbWFrZSBzdXJlIGEgY2xpcCBpcyByZWFsbHkgc2V0IG9uIHRoZSBI
REMuCisgICAgLy8gQ2FsbCBTZXRXb3JsZFRyYW5zZm9ybSB0byBob25vciB0aGUgY3VycmVudCBD
YWlybyB0cmFuc2Zvcm0uCisgICAgU2V0R3JhcGhpY3NNb2RlKGhkYywgR01fQURWQU5DRUQpOyAv
LyBXZSBuZWVkIHRoaXMgY2FsbCBmb3IgdGhlbWVzIHRvIGhvbm9yIHdvcmxkIHRyYW5zZm9ybXMu
CisgICAgY2Fpcm9fbWF0cml4X3QgbWF0OworICAgIGNhaXJvX2dldF9tYXRyaXgocGxhdGZvcm1D
b250ZXh0KCksICZtYXQpOworICAgIFhGT1JNIHhmb3JtOworICAgIHhmb3JtLmVNMTEgPSBtYXQu
eHg7CisgICAgeGZvcm0uZU0xMiA9IG1hdC54eTsKKyAgICB4Zm9ybS5lTTIxID0gbWF0Lnl4Owor
ICAgIHhmb3JtLmVNMjIgPSBtYXQueXk7CisgICAgeGZvcm0uZUR4ID0gbWF0LngwOworICAgIHhm
b3JtLmVEeSA9IG1hdC55MDsKKyAgICBTZXRXb3JsZFRyYW5zZm9ybShoZGMsICZ4Zm9ybSk7CisK
KyAgICByZXR1cm4gaGRjOworfQorCitib29sIEdyYXBoaWNzQ29udGV4dDo6aW5UcmFuc3BhcmVu
Y3lMYXllcigpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS0+bV90cmFuc3BhcmVuY3lDb3VudDsgfQor
Cit2b2lkIEdyYXBoaWNzQ29udGV4dDo6cmVsZWFzZVdpbmRvd3NDb250ZXh0KEhEQyBoZGMsIGNv
bnN0IEludFJlY3QmIGRzdFJlY3QsIGJvb2wgc3VwcG9ydEFscGhhQmxlbmQpCit7CisgICAgY2Fp
cm9fc3VyZmFjZV90KiBzdXJmYWNlID0gY2Fpcm9fZ2V0X3RhcmdldChwbGF0Zm9ybUNvbnRleHQo
KSk7CisgICAgSERDIGhkYzIgPSBjYWlyb193aW4zMl9zdXJmYWNlX2dldF9kYyhzdXJmYWNlKTsK
KyAgICBSZXN0b3JlREMoaGRjMiwgLTEpOworICAgIGNhaXJvX3N1cmZhY2VfbWFya19kaXJ0eShz
dXJmYWNlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNvbmNhdENUTShjb25zdCBBZmZp
bmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSkKK3sKKyAgICBjYWlyb19zdXJmYWNlX3QqIHN1cmZhY2Ug
PSBjYWlyb19nZXRfdGFyZ2V0KHBsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBIREMgaGRjID0gY2Fp
cm9fd2luMzJfc3VyZmFjZV9nZXRfZGMoc3VyZmFjZSk7ICAgCisgICAgU2F2ZURDKGhkYyk7CisK
KyAgICBjYWlyb19tYXRyaXhfdCBtYXQ7CisgICAgY2Fpcm9fZ2V0X21hdHJpeChwbGF0Zm9ybUNv
bnRleHQoKSwgJm1hdCk7CisgICAgWEZPUk0geGZvcm07CisgICAgeGZvcm0uZU0xMSA9IG1hdC54
eDsKKyAgICB4Zm9ybS5lTTEyID0gbWF0Lnh5OworICAgIHhmb3JtLmVNMjEgPSBtYXQueXg7Cisg
ICAgeGZvcm0uZU0yMiA9IG1hdC55eTsKKyAgICB4Zm9ybS5lRHggPSBtYXQueDA7CisgICAgeGZv
cm0uZUR5ID0gbWF0LnkwOworCisgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0oaGRjLCAmeGZvcm0s
IE1XVF9MRUZUTVVMVElQTFkpOworfQorCit9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbi9HcmFwaGljc0NvbnRleHRXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dFdpbi5jcHAJKHJldmlzaW9uIDI5ODM0
KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0V2luLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIw
MDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucwpAQCAtMjksMzUxICsyOSwxNCBAQAogI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgog
I2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCiAjaW5jbHVkZSAiUGF0aC5oIgotI2luY2x1ZGUg
PENvcmVHcmFwaGljcy9DR0JpdG1hcENvbnRleHQuaD4KLSNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1J
bnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8d3RmL01hdGhFeHRy
YXMuaD4KIAotI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZS5oIgotCiB1
c2luZyBuYW1lc3BhY2Ugc3RkOwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIGNsYXNzIFNWR1Jl
c291cmNlSW1hZ2U7CiAKLXN0YXRpYyBDR0NvbnRleHRSZWYgQ0dDb250ZXh0V2l0aEhEQyhIREMg
aGRjKQotewotICAgIEhCSVRNQVAgYml0bWFwID0gKEhCSVRNQVApR2V0Q3VycmVudE9iamVjdCho
ZGMsIE9CSl9CSVRNQVApOwotICAgIENHQ29sb3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBDR0NvbG9y
U3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKLSAgICBCSVRNQVAgaW5mbzsKLQotICAgIEdldE9iamVj
dChiaXRtYXAsIHNpemVvZihpbmZvKSwgJmluZm8pOwotICAgIEFTU0VSVChpbmZvLmJtQml0c1Bp
eGVsID09IDMyKTsKLSAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IENHQml0bWFwQ29udGV4dENy
ZWF0ZShpbmZvLmJtQml0cywgaW5mby5ibVdpZHRoLCBpbmZvLmJtSGVpZ2h0LCA4LAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uYm1XaWR0aEJ5
dGVzLCBkZXZpY2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwga0NHSW1hZ2VBbHBo
YU5vbmVTa2lwRmlyc3QpOwotICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKLQot
ICAgIC8vIEZsaXAgY29vcmRzCi0gICAgQ0dDb250ZXh0VHJhbnNsYXRlQ1RNKGNvbnRleHQsIDAs
IGluZm8uYm1IZWlnaHQpOwotICAgIENHQ29udGV4dFNjYWxlQ1RNKGNvbnRleHQsIDEsIC0xKTsK
LSAgICAKLSAgICAvLyBQdXQgdGhlIEhEQyBJbiBhZHZhbmNlZCBtb2RlIHNvIGl0IHdpbGwgaG9u
b3IgYWZmaW5lIHRyYW5zZm9ybXMuCi0gICAgU2V0R3JhcGhpY3NNb2RlKGhkYywgR01fQURWQU5D
RUQpOwotICAgIAotICAgIHJldHVybiBjb250ZXh0OwotfQotCi1HcmFwaGljc0NvbnRleHQ6Okdy
YXBoaWNzQ29udGV4dChIREMgaGRjKQotICAgIDogbV9jb21tb24oY3JlYXRlR3JhcGhpY3NDb250
ZXh0UHJpdmF0ZSgpKQotICAgICwgbV9kYXRhKG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVBy
aXZhdGUoQ0dDb250ZXh0V2l0aEhEQyhoZGMpKSkKLXsKLSAgICBDR0NvbnRleHRSZWxlYXNlKG1f
ZGF0YS0+bV9jZ0NvbnRleHQpOwotICAgIG1fZGF0YS0+bV9oZGMgPSBoZGM7Ci0gICAgc2V0UGFp
bnRpbmdEaXNhYmxlZCghbV9kYXRhLT5tX2NnQ29udGV4dCk7Ci0gICAgaWYgKG1fZGF0YS0+bV9j
Z0NvbnRleHQpIHsKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBjb250ZXh0IHN0YXJ0cyBpbiBz
eW5jIHdpdGggb3VyIHN0YXRlLgotICAgICAgICBzZXRQbGF0Zm9ybUZpbGxDb2xvcihmaWxsQ29s
b3IoKSk7Ci0gICAgICAgIHNldFBsYXRmb3JtU3Ryb2tlQ29sb3Ioc3Ryb2tlQ29sb3IoKSk7Ci0g
ICAgfQotfQotCi1IREMgR3JhcGhpY3NDb250ZXh0OjpnZXRXaW5kb3dzQ29udGV4dChjb25zdCBJ
bnRSZWN0JiBkc3RSZWN0LCBib29sIHN1cHBvcnRBbHBoYUJsZW5kKQotewotICAgIGlmIChpblRy
YW5zcGFyZW5jeUxheWVyKCkpIHsKLSAgICAgICAgaWYgKGRzdFJlY3QuaXNFbXB0eSgpKQotICAg
ICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgYml0bWFwIERDIGluIHdo
aWNoIHRvIGRyYXcuCi0gICAgICAgIEJJVE1BUElORk8gYml0bWFwSW5mbzsKLSAgICAgICAgYml0
bWFwSW5mby5ibWlIZWFkZXIuYmlTaXplICAgICAgICAgID0gc2l6ZW9mKEJJVE1BUElORk9IRUFE
RVIpOwotICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVdpZHRoICAgICAgICAgPSBkc3RS
ZWN0LndpZHRoKCk7IAotICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUhlaWdodCAgICAg
ICAgPSBkc3RSZWN0LmhlaWdodCgpOwotICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVBs
YW5lcyAgICAgICAgPSAxOwotICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUJpdENvdW50
ICAgICAgPSAzMjsKLSAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiAg
ID0gQklfUkdCOwotICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVNpemVJbWFnZSAgICAg
PSAwOwotICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVhQZWxzUGVyTWV0ZXIgPSAwOwot
ICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVlQZWxzUGVyTWV0ZXIgPSAwOwotICAgICAg
ICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUNsclVzZWQgICAgICAgPSAwOwotICAgICAgICBiaXRt
YXBJbmZvLmJtaUhlYWRlci5iaUNsckltcG9ydGFudCAgPSAwOwotCi0gICAgICAgIHZvaWQqIHBp
eGVscyA9IDA7Ci0gICAgICAgIEhCSVRNQVAgYml0bWFwID0gOjpDcmVhdGVESUJTZWN0aW9uKE5V
TEwsICZiaXRtYXBJbmZvLCBESUJfUkdCX0NPTE9SUywgJnBpeGVscywgMCwgMCk7Ci0gICAgICAg
IGlmICghYml0bWFwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgSERDIGJpdG1h
cERDID0gOjpDcmVhdGVDb21wYXRpYmxlREMobV9kYXRhLT5tX2hkYyk7Ci0gICAgICAgIDo6U2Vs
ZWN0T2JqZWN0KGJpdG1hcERDLCBiaXRtYXApOwotCi0gICAgICAgIC8vIEZpbGwgb3VyIGJ1ZmZl
ciB3aXRoIGNsZWFyIGlmIHdlJ3JlIGdvaW5nIHRvIGFscGhhIGJsZW5kLgotICAgICAgICBpZiAo
c3VwcG9ydEFscGhhQmxlbmQpIHsKLSAgICAgICAgICAgIEJJVE1BUCBibXBJbmZvOwotICAgICAg
ICAgICAgR2V0T2JqZWN0KGJpdG1hcCwgc2l6ZW9mKGJtcEluZm8pLCAmYm1wSW5mbyk7Ci0gICAg
ICAgICAgICBpbnQgYnVmZmVyU2l6ZSA9IGJtcEluZm8uYm1XaWR0aEJ5dGVzICogYm1wSW5mby5i
bUhlaWdodDsKLSAgICAgICAgICAgIG1lbXNldChibXBJbmZvLmJtQml0cywgMCwgYnVmZmVyU2l6
ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNYWtlIHN1cmUgd2UgY2FuIGRvIHdvcmxkIHRy
YW5zZm9ybXMuCi0gICAgICAgIFNldEdyYXBoaWNzTW9kZShiaXRtYXBEQywgR01fQURWQU5DRUQp
OwotCi0gICAgICAgIC8vIEFwcGx5IGEgdHJhbnNsYXRpb24gdG8gb3VyIGNvbnRleHQgc28gdGhh
dCB0aGUgZHJhd2luZyBkb25lIHdpbGwgYmUgYXQgKDAsMCkgb2YgdGhlIGJpdG1hcC4KLSAgICAg
ICAgWEZPUk0geGZvcm07Ci0gICAgICAgIHhmb3JtLmVNMTEgPSAxLjA7Ci0gICAgICAgIHhmb3Jt
LmVNMTIgPSAwOwotICAgICAgICB4Zm9ybS5lTTIxID0gMDsKLSAgICAgICAgeGZvcm0uZU0yMiA9
IDEuMDsKLSAgICAgICAgeGZvcm0uZUR4ID0gLWRzdFJlY3QueCgpOwotICAgICAgICB4Zm9ybS5l
RHkgPSAtZHN0UmVjdC55KCk7Ci0gICAgICAgIDo6U2V0V29ybGRUcmFuc2Zvcm0oYml0bWFwREMs
ICZ4Zm9ybSk7Ci0KLSAgICAgICAgcmV0dXJuIGJpdG1hcERDOwotICAgIH0KLQotICAgIENHQ29u
dGV4dEZsdXNoKHBsYXRmb3JtQ29udGV4dCgpKTsKLSAgICBtX2RhdGEtPnNhdmUoKTsKLSAgICBy
ZXR1cm4gbV9kYXRhLT5tX2hkYzsKLX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQ6OmluVHJhbnNw
YXJlbmN5TGF5ZXIoKSBjb25zdCB7IHJldHVybiBtX2RhdGEtPm1fdHJhbnNwYXJlbmN5Q291bnQ7
IH0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnJlbGVhc2VXaW5kb3dzQ29udGV4dChIREMgaGRj
LCBjb25zdCBJbnRSZWN0JiBkc3RSZWN0LCBib29sIHN1cHBvcnRBbHBoYUJsZW5kKQotewotICAg
IGlmIChoZGMgJiYgaW5UcmFuc3BhcmVuY3lMYXllcigpKSB7Ci0gICAgICAgIGlmIChkc3RSZWN0
LmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBIQklUTUFQIGJpdG1h
cCA9IChIQklUTUFQKUdldEN1cnJlbnRPYmplY3QoaGRjLCBPQkpfQklUTUFQKTsKLQotICAgICAg
ICAvLyBOZWVkIHRvIG1ha2UgYSBDR0ltYWdlIG91dCBvZiB0aGUgYml0bWFwJ3MgcGl4ZWwgYnVm
ZmVyIGFuZCB0aGVuIGRyYXcKLSAgICAgICAgLy8gaXQgaW50byBvdXIgY29udGV4dC4KLSAgICAg
ICAgQklUTUFQIGluZm87Ci0gICAgICAgIEdldE9iamVjdChiaXRtYXAsIHNpemVvZihpbmZvKSwg
JmluZm8pOwotICAgICAgICBBU1NFUlQoaW5mby5ibUJpdHNQaXhlbCA9PSAzMik7Ci0KLSAgICAg
ICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJH
QigpOwotICAgICAgICBDR0NvbnRleHRSZWYgYml0bWFwQ29udGV4dCA9IENHQml0bWFwQ29udGV4
dENyZWF0ZShpbmZvLmJtQml0cywgaW5mby5ibVdpZHRoLCBpbmZvLmJtSGVpZ2h0LCA4LAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBp
bmZvLmJtV2lkdGhCeXRlcywgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8
IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAoc3VwcG9ydEFscGhhQmxlbmQgPyBrQ0dJbWFnZUFscGhhUHJlbXVsdGlwbGllZEZpcnN0
IDoga0NHSW1hZ2VBbHBoYU5vbmVTa2lwRmlyc3QpKTsKLSAgICAgICAgQ0dDb2xvclNwYWNlUmVs
ZWFzZShkZXZpY2VSR0IpOwotCi0gICAgICAgIENHSW1hZ2VSZWYgaW1hZ2UgPSBDR0JpdG1hcENv
bnRleHRDcmVhdGVJbWFnZShiaXRtYXBDb250ZXh0KTsKLSAgICAgICAgQ0dDb250ZXh0RHJhd0lt
YWdlKG1fZGF0YS0+bV9jZ0NvbnRleHQsIGRzdFJlY3QsIGltYWdlKTsKLSAgICAgICAgCi0gICAg
ICAgIC8vIERlbGV0ZSBhbGwgb3VyIGp1bmsuCi0gICAgICAgIENHSW1hZ2VSZWxlYXNlKGltYWdl
KTsKLSAgICAgICAgQ0dDb250ZXh0UmVsZWFzZShiaXRtYXBDb250ZXh0KTsKLSAgICAgICAgOjpE
ZWxldGVEQyhoZGMpOwotICAgICAgICA6OkRlbGV0ZU9iamVjdChiaXRtYXApOwotCi0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0KLSAgICBtX2RhdGEtPnJlc3RvcmUoKTsKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnNhdmUoKQotewotICAgIGlmICghbV9oZGMpCi0g
ICAgICAgIHJldHVybjsKLSAgICBTYXZlREMobV9oZGMpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZTo6cmVzdG9yZSgpCi17Ci0gICAgaWYgKCFtX2hkYykKLSAgICAg
ICAgcmV0dXJuOwotICAgIFJlc3RvcmVEQyhtX2hkYywgLTEpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y2xpcChjb25zdCBJbnRSZWN0JiBjbGlwUmVjdCkKLXsK
LSAgICBpZiAoIW1faGRjKQotICAgICAgICByZXR1cm47Ci0gICAgSW50ZXJzZWN0Q2xpcFJlY3Qo
bV9oZGMsIGNsaXBSZWN0LngoKSwgY2xpcFJlY3QueSgpLCBjbGlwUmVjdC5yaWdodCgpLCBjbGlw
UmVjdC5ib3R0b20oKSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRl
OjpjbGlwKGNvbnN0IFBhdGgmKQotewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci19Ci0KLXZvaWQg
R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpzY2FsZShjb25zdCBGbG9hdFNpemUmIHNp
emUpCi17Ci0gICAgaWYgKCFtX2hkYykKLSAgICAgICAgcmV0dXJuOwotICAgIFhGT1JNIHhmb3Jt
OwotICAgIHhmb3JtLmVNMTEgPSBzaXplLndpZHRoKCk7Ci0gICAgeGZvcm0uZU0xMiA9IDA7Ci0g
ICAgeGZvcm0uZU0yMSA9IDA7Ci0gICAgeGZvcm0uZU0yMiA9IHNpemUuaGVpZ2h0KCk7Ci0gICAg
eGZvcm0uZUR4ID0gMDsKLSAgICB4Zm9ybS5lRHkgPSAwOwotICAgIE1vZGlmeVdvcmxkVHJhbnNm
b3JtKG1faGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOwotfQotCi1zdGF0aWMgY29uc3Qg
ZG91YmxlIGRlZzJyYWQgPSAwLjAxNzQ1MzI5MjUxOTk0MzI5NTc2OTsgLy8gcGkvMTgwCi0KLXZv
aWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpyb3RhdGUoZmxvYXQgZGVncmVlc0Fu
Z2xlKQotewotICAgIGZsb2F0IHJhZGlhbnNBbmdsZSA9IGRlZ3JlZXNBbmdsZSAqIGRlZzJyYWQ7
Ci0gICAgZmxvYXQgY29zQW5nbGUgPSBjb3NmKHJhZGlhbnNBbmdsZSk7Ci0gICAgZmxvYXQgc2lu
QW5nbGUgPSBzaW5mKHJhZGlhbnNBbmdsZSk7Ci0gICAgWEZPUk0geGZvcm07Ci0gICAgeGZvcm0u
ZU0xMSA9IGNvc0FuZ2xlOwotICAgIHhmb3JtLmVNMTIgPSAtc2luQW5nbGU7Ci0gICAgeGZvcm0u
ZU0yMSA9IHNpbkFuZ2xlOwotICAgIHhmb3JtLmVNMjIgPSBjb3NBbmdsZTsKLSAgICB4Zm9ybS5l
RHggPSAwOwotICAgIHhmb3JtLmVEeSA9IDA7Ci0gICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9o
ZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlOjp0cmFuc2xhdGUoZmxvYXQgeCAsIGZsb2F0IHkpCi17Ci0gICAgaWYg
KCFtX2hkYykKLSAgICAgICAgcmV0dXJuOwotICAgIFhGT1JNIHhmb3JtOwotICAgIHhmb3JtLmVN
MTEgPSAxLjA7Ci0gICAgeGZvcm0uZU0xMiA9IDA7Ci0gICAgeGZvcm0uZU0yMSA9IDA7Ci0gICAg
eGZvcm0uZU0yMiA9IDEuMDsKLSAgICB4Zm9ybS5lRHggPSB4OwotICAgIHhmb3JtLmVEeSA9IHk7
Ci0gICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBM
WSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpjb25jYXRDVE0o
Y29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFuc2Zvcm0pCi17Ci0gICAgaWYgKCFtX2hkYykKLSAg
ICAgICAgcmV0dXJuOwotICAgIENHQWZmaW5lVHJhbnNmb3JtIG1hdCA9IHRyYW5zZm9ybTsKLSAg
ICBYRk9STSB4Zm9ybTsKLSAgICB4Zm9ybS5lTTExID0gbWF0LmE7Ci0gICAgeGZvcm0uZU0xMiA9
IG1hdC5iOwotICAgIHhmb3JtLmVNMjEgPSBtYXQuYzsKLSAgICB4Zm9ybS5lTTIyID0gbWF0LmQ7
Ci0gICAgeGZvcm0uZUR4ID0gbWF0LnR4OwotICAgIHhmb3JtLmVEeSA9IG1hdC50eTsKLSAgICBN
b2RpZnlXb3JsZFRyYW5zZm9ybShtX2hkYywgJnhmb3JtLCBNV1RfTEVGVE1VTFRJUExZKTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1c1JpbmcoY29uc3QgQ29sb3ImIGNvbG9y
KQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAg
IGZsb2F0IHJhZGl1cyA9IChmb2N1c1JpbmdXaWR0aCgpIC0gMSkgLyAyLjBmOwotICAgIGludCBv
ZmZzZXQgPSByYWRpdXMgKyBmb2N1c1JpbmdPZmZzZXQoKTsKLSAgICBDR0NvbG9yUmVmIGNvbG9y
UmVmID0gY29sb3IuaXNWYWxpZCgpID8gY2dDb2xvcihjb2xvcikgOiAwOwotCi0gICAgQ0dNdXRh
YmxlUGF0aFJlZiBmb2N1c1JpbmdQYXRoID0gQ0dQYXRoQ3JlYXRlTXV0YWJsZSgpOwotICAgIGNv
bnN0IFZlY3RvcjxJbnRSZWN0PiYgcmVjdHMgPSBmb2N1c1JpbmdSZWN0cygpOwotICAgIHVuc2ln
bmVkIHJlY3RDb3VudCA9IHJlY3RzLnNpemUoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgcmVjdENvdW50OyBpKyspCi0gICAgICAgIENHUGF0aEFkZFJlY3QoZm9jdXNSaW5nUGF0aCwg
MCwgQ0dSZWN0SW5zZXQocmVjdHNbaV0sIC1vZmZzZXQsIC1vZmZzZXQpKTsKLQotICAgIENHQ29u
dGV4dFJlZiBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCk7Ci0gICAgQ0dDb250ZXh0U2F2ZUdT
dGF0ZShjb250ZXh0KTsKLQotICAgIENHQ29udGV4dEJlZ2luUGF0aChjb250ZXh0KTsKLSAgICBD
R0NvbnRleHRBZGRQYXRoKGNvbnRleHQsIGZvY3VzUmluZ1BhdGgpOwotCi0gICAgd2tEcmF3Rm9j
dXNSaW5nKGNvbnRleHQsIGNvbG9yUmVmLCByYWRpdXMpOwotCi0gICAgQ0dDb2xvclJlbGVhc2Uo
Y29sb3JSZWYpOwotCi0gICAgQ0dQYXRoUmVsZWFzZShmb2N1c1JpbmdQYXRoKTsKLQotICAgIENH
Q29udGV4dFJlc3RvcmVHU3RhdGUoY29udGV4dCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBDb2xvciYg
c3BlbGxpbmdQYXR0ZXJuQ29sb3IoKSB7Ci0gICAgc3RhdGljIGNvbnN0IENvbG9yIHNwZWxsaW5n
Q29sb3IoMjU1LCAwLCAwKTsKLSAgICByZXR1cm4gc3BlbGxpbmdDb2xvcjsKLX0KLQotc3RhdGlj
IGNvbnN0IENvbG9yJiBncmFtbWFyUGF0dGVybkNvbG9yKCkgewotICAgIHN0YXRpYyBjb25zdCBD
b2xvciBncmFtbWFyQ29sb3IoMCwgMTI4LCAwKTsKLSAgICByZXR1cm4gZ3JhbW1hckNvbG9yOwot
fQotCi0vLyBQdWxsZWQgZnJvbSBHcmFwaGljc0NvbnRleHRDRwotc3RhdGljIHZvaWQgc2V0Q0dT
dHJva2VDb2xvcihDR0NvbnRleHRSZWYgY29udGV4dCwgY29uc3QgQ29sb3ImIGNvbG9yKQotewot
ICAgIENHRmxvYXQgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGE7Ci0gICAgY29sb3IuZ2V0UkdCQShy
ZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci0gICAgQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3Io
Y29udGV4dCwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDo6ZHJhd0xpbmVGb3JNaXNzcGVsbGluZ09yQmFkR3JhbW1hcihjb25zdCBJbnRQb2ludCYg
cG9pbnQsIGludCB3aWR0aCwgYm9vbCBncmFtbWFyKQotewotICAgIGlmIChwYWludGluZ0Rpc2Fi
bGVkKCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICAvLyBUaGVzZSBhcmUgdGhlIHNhbWUg
Zm9yIG1pc3NwZWxsaW5nIG9yIGJhZCBncmFtbWFyCi0gICAgY29uc3QgaW50IHBhdHRlcm5IZWln
aHQgPSAzOyAvLyAzIHJvd3MKLSAgICBBU1NFUlQoY01pc3NwZWxsaW5nTGluZVRoaWNrbmVzcyA9
PSBwYXR0ZXJuSGVpZ2h0KTsKLSAgICBjb25zdCBpbnQgcGF0dGVybldpZHRoID0gNDsgLy8gNCBw
aXhlbHMKLSAgICBBU1NFUlQocGF0dGVybldpZHRoID09IGNNaXNzcGVsbGluZ0xpbmVQYXR0ZXJu
V2lkdGgpOwotCi0gICAgLy8gTWFrZSBzdXJlIHRvIGRyYXcgb25seSBjb21wbGV0ZSBkb3RzLgot
ICAgIC8vIE5PVEU6IENvZGUgaGVyZSB1c2VkIHRvIHNoaWZ0IHRoZSB1bmRlcmxpbmUgdG8gdGhl
IGxlZnQgYW5kIGluY3JlYXNlIHRoZSB3aWR0aAotICAgIC8vIHRvIG1ha2Ugc3VyZSBldmVyeXRo
aW5nIGdldHMgdW5kZXJsaW5lZCwgYnV0IHRoYXQgcmVzdWx0cyBpbiBkcmF3aW5nIG91dCBvZgot
ICAgIC8vIGJvdW5kcyAoZS5nLiB3aGVuIGF0IHRoZSBlZGdlIG9mIGEgdmlldykgYW5kIGNvdWxk
IG1ha2UgaXQgYXBwZWFyIHRoYXQgdGhlCi0gICAgLy8gc3BhY2UgYmV0d2VlbiBhZGphY2VudCBt
aXNzcGVsbGVkIHdvcmRzIHdhcyB1bmRlcmxpbmVkLgotICAgIC8vIGFsbG93IHNsaWdodGx5IG1v
cmUgY29uc2lkZXJpbmcgdGhhdCB0aGUgcGF0dGVybiBlbmRzIHdpdGggYSB0cmFuc3BhcmVudCBw
aXhlbAotICAgIGludCB3aWR0aE1vZCA9IHdpZHRoICUgcGF0dGVybldpZHRoOwotICAgIGlmIChw
YXR0ZXJuV2lkdGggLSB3aWR0aE1vZCA+IGNNaXNzcGVsbGluZ0xpbmVQYXR0ZXJuR2FwV2lkdGgp
Ci0gICAgICAgIHdpZHRoIC09IHdpZHRoTW9kOwotICAgICAgCi0gICAgLy8gRHJhdyB0aGUgdW5k
ZXJsaW5lCi0gICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsKLSAg
ICBDR0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQpOwotCi0gICAgY29uc3QgQ29sb3ImIHBhdHRl
cm5Db2xvciA9IGdyYW1tYXIgPyBncmFtbWFyUGF0dGVybkNvbG9yKCkgOiBzcGVsbGluZ1BhdHRl
cm5Db2xvcigpOwotICAgIHNldENHU3Ryb2tlQ29sb3IoY29udGV4dCwgcGF0dGVybkNvbG9yKTsK
LQotICAgIHdrU2V0UGF0dGVyblBoYXNlSW5Vc2VyU3BhY2UoY29udGV4dCwgcG9pbnQpOwotICAg
IENHQ29udGV4dFNldEJsZW5kTW9kZShjb250ZXh0LCBrQ0dCbGVuZE1vZGVOb3JtYWwpOwotICAg
IAotICAgIC8vIDMgcm93cywgZWFjaCBvZmZzZXQgYnkgaGFsZiBhIHBpeGVsIGZvciBibGVuZGlu
ZyBwdXJwb3NlcwotICAgIGNvbnN0IENHUG9pbnQgdXBwZXJQb2ludHMgW10gPSB7e3BvaW50Lngo
KSwgcG9pbnQueSgpICsgcGF0dGVybkhlaWdodCAtIDIuNSB9LCB7cG9pbnQueCgpICsgd2lkdGgs
IHBvaW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAyLjV9fTsKLSAgICBjb25zdCBDR1BvaW50IG1p
ZGRsZVBvaW50cyBbXSA9IHt7cG9pbnQueCgpLCBwb2ludC55KCkgKyBwYXR0ZXJuSGVpZ2h0IC0g
MS41IH0sIHtwb2ludC54KCkgKyB3aWR0aCwgcG9pbnQueSgpICsgcGF0dGVybkhlaWdodCAtIDEu
NX19OwotICAgIGNvbnN0IENHUG9pbnQgbG93ZXJQb2ludHMgW10gPSB7e3BvaW50LngoKSwgcG9p
bnQueSgpICsgcGF0dGVybkhlaWdodCAtIDAuNSB9LCB7cG9pbnQueCgpICsgd2lkdGgsIHBvaW50
LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAwLjUgfX07Ci0gICAgCi0gICAgLy8gRGFzaCBsZW5ndGhz
IGZvciB0aGUgdG9wIGFuZCBib3R0b20gb2YgdGhlIGVycm9yIHVuZGVybGluZSBhcmUgdGhlIHNh
bWUuCi0gICAgLy8gVGhlc2UgYXJlIG1hZ2ljLgotICAgIHN0YXRpYyBjb25zdCBmbG9hdCBlZGdl
X2Rhc2hfbGVuZ3Roc1tdID0gezIsIDJ9OwotICAgIHN0YXRpYyBjb25zdCBmbG9hdCBtaWRkbGVf
ZGFzaF9sZW5ndGhzW10gPSB7Mi43NmYsIDEuMjRmfTsKLSAgICBzdGF0aWMgY29uc3QgZmxvYXQg
ZWRnZV9vZmZzZXQgPSAtKGVkZ2VfZGFzaF9sZW5ndGhzWzFdIC0gMS4wZikgLyAyLjBmOwotICAg
IHN0YXRpYyBjb25zdCBmbG9hdCBtaWRkbGVfb2Zmc2V0ID0gLShtaWRkbGVfZGFzaF9sZW5ndGhz
WzFdIC0gMS4wZikgLyAyLjBmOwotCi0gICAgLy8gTGluZSBvcGFjaXRpZXMuICBPbmNlIGFnYWlu
LCB0aGVzZSBhcmUgbWFnaWMuCi0gICAgY29uc3QgZmxvYXQgdXBwZXJPcGFjaXR5ID0gMC4zM2Y7
Ci0gICAgY29uc3QgZmxvYXQgbWlkZGxlT3BhY2l0eSA9IDAuNzVmOwotICAgIGNvbnN0IGZsb2F0
IGxvd2VyT3BhY2l0eSA9IDAuODhmOwotCi0gICAgLy9Ub3AgbGluZQotICAgIENHQ29udGV4dFNl
dExpbmVEYXNoKGNvbnRleHQsIGVkZ2Vfb2Zmc2V0LCBlZGdlX2Rhc2hfbGVuZ3RocywgCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVkZ2VfZGFzaF9sZW5ndGhzKSAvIHNpemVvZihl
ZGdlX2Rhc2hfbGVuZ3Roc1swXSkpOwotICAgIENHQ29udGV4dFNldEFscGhhKGNvbnRleHQsIHVw
cGVyT3BhY2l0eSk7Ci0gICAgQ0dDb250ZXh0U3Ryb2tlTGluZVNlZ21lbnRzKGNvbnRleHQsIHVw
cGVyUG9pbnRzLCAyKTsKLSAKLSAgICAvLyBNaWRkbGUgbGluZQotICAgIENHQ29udGV4dFNldExp
bmVEYXNoKGNvbnRleHQsIG1pZGRsZV9vZmZzZXQsIG1pZGRsZV9kYXNoX2xlbmd0aHMsIAotICAg
ICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihtaWRkbGVfZGFzaF9sZW5ndGhzKSAvIHNpemVv
ZihtaWRkbGVfZGFzaF9sZW5ndGhzWzBdKSk7Ci0gICAgQ0dDb250ZXh0U2V0QWxwaGEoY29udGV4
dCwgbWlkZGxlT3BhY2l0eSk7Ci0gICAgQ0dDb250ZXh0U3Ryb2tlTGluZVNlZ21lbnRzKGNvbnRl
eHQsIG1pZGRsZVBvaW50cywgMik7Ci0gICAgCi0gICAgLy8gQm90dG9tIGxpbmUKLSAgICBDR0Nv
bnRleHRTZXRMaW5lRGFzaChjb250ZXh0LCBlZGdlX29mZnNldCwgZWRnZV9kYXNoX2xlbmd0aHMs
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVkZ2VfZGFzaF9sZW5ndGhzKSAvIHNp
emVvZihlZGdlX2Rhc2hfbGVuZ3Roc1swXSkpOwotICAgIENHQ29udGV4dFNldEFscGhhKGNvbnRl
eHQsIGxvd2VyT3BhY2l0eSk7Ci0gICAgQ0dDb250ZXh0U3Ryb2tlTGluZVNlZ21lbnRzKGNvbnRl
eHQsIGxvd2VyUG9pbnRzLCAyKTsKLQotICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29udGV4
dCk7Ci19Ci0KICNpZiBFTkFCTEUoU1ZHKQogR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0Rm9ySW1h
Z2UoU1ZHUmVzb3VyY2VJbWFnZSopCiB7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbi9JbWFnZUNHV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbi9JbWFnZUNHV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCShmcm9tIFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlV2luLmNwcDoyOTgzNCkKKysrIFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ0dXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MTEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIklt
YWdlLmgiCisjaW5jbHVkZSAiQml0bWFwSW1hZ2UuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRl
eHQuaCIKKyNpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMu
aD4KKworI2luY2x1ZGUgPHdpbnNvY2syLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1
ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiTUlNRVR5cGVSZWdpc3RyeS5oIgorI2lu
Y2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgorCisvLyBUaGlzIGZ1bmN0aW9uIGxvYWRzIHJlc291cmNl
cyBmcm9tIFdlYktpdAorUGFzc1JlZlB0cjxXZWJDb3JlOjpTaGFyZWRCdWZmZXI+IGxvYWRSZXNv
dXJjZUludG9CdWZmZXIoY29uc3QgY2hhciopOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3Zv
aWQgQml0bWFwSW1hZ2U6OmluaXRQbGF0Zm9ybURhdGEoKQoreworfQorCit2b2lkIEJpdG1hcElt
YWdlOjppbnZhbGlkYXRlUGxhdGZvcm1EYXRhKCkKK3sKK30KKworSW1hZ2UqIEltYWdlOjpsb2Fk
UGxhdGZvcm1SZXNvdXJjZShjb25zdCBjaGFyICpuYW1lKQoreworICAgIFJlZlB0cjxTaGFyZWRC
dWZmZXI+IGJ1ZmZlciA9IGxvYWRSZXNvdXJjZUludG9CdWZmZXIobmFtZSk7CisgICAgQml0bWFw
SW1hZ2UqIGltZyA9IG5ldyBCaXRtYXBJbWFnZTsKKyAgICBpbWctPnNldERhdGEoYnVmZmVyLnJl
bGVhc2UoKSwgdHJ1ZSk7CisgICAgcmV0dXJuIGltZzsKK30KKworYm9vbCBCaXRtYXBJbWFnZTo6
Z2V0SEJJVE1BUChIQklUTUFQIGJtcCkKK3sKKyAgICByZXR1cm4gZ2V0SEJJVE1BUE9mU2l6ZShi
bXAsIDApOworfQorCitib29sIEJpdG1hcEltYWdlOjpnZXRIQklUTUFQT2ZTaXplKEhCSVRNQVAg
Ym1wLCBMUFNJWkUgc2l6ZSkKK3sKKyAgICBBU1NFUlQoYm1wKTsKKworICAgIEJJVE1BUCBibXBJ
bmZvOworICAgIEdldE9iamVjdChibXAsIHNpemVvZihCSVRNQVApLCAmYm1wSW5mbyk7CisKKyAg
ICBBU1NFUlQoYm1wSW5mby5ibUJpdHNQaXhlbCA9PSAzMik7CisgICAgaW50IGJ1ZmZlclNpemUg
PSBibXBJbmZvLmJtV2lkdGhCeXRlcyAqIGJtcEluZm8uYm1IZWlnaHQ7CisgICAgCisgICAgQ0dD
b2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwor
ICAgIENHQ29udGV4dFJlZiBjZ0NvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUoYm1wSW5m
by5ibUJpdHMsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCwKKyAgICAgICAgOCwg
Ym1wSW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0
bGUgfCBrQ0dJbWFnZUFscGhhUHJlbXVsdGlwbGllZEZpcnN0KTsKKyAgCisgICAgR3JhcGhpY3ND
b250ZXh0IGdjKGNnQ29udGV4dCk7CisgICAgSW50U2l6ZSBpbWFnZVNpemUgPSBCaXRtYXBJbWFn
ZTo6c2l6ZSgpOworICAgIGlmIChzaXplKQorICAgICAgICBkcmF3RnJhbWVNYXRjaGluZ1NvdXJj
ZVNpemUoJmdjLCBGbG9hdFJlY3QoMCwgMCwgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVp
Z2h0KSwgSW50U2l6ZSgqc2l6ZSksIENvbXBvc2l0ZUNvcHkpOworICAgIGVsc2UKKyAgICAgICAg
ZHJhdygmZ2MsIEZsb2F0UmVjdCgwLCAwLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWln
aHQpLCBGbG9hdFJlY3QoMCwgMCwgaW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQo
KSksIENvbXBvc2l0ZUNvcHkpOworCisgICAgLy8gRG8gY2xlYW51cAorICAgIENHQ29udGV4dFJl
bGVhc2UoY2dDb250ZXh0KTsKKyAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKGRldmljZVJHQik7Cisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQml0bWFwSW1hZ2U6OmRyYXdGcmFtZU1hdGNoaW5n
U291cmNlU2l6ZShHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVj
dCwgY29uc3QgSW50U2l6ZSYgc3JjU2l6ZSwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3Ap
Cit7CisgICAgaW50IGZyYW1lcyA9IGZyYW1lQ291bnQoKTsKKyAgICBmb3IgKGludCBpID0gMDsg
aSA8IGZyYW1lczsgKytpKSB7CisgICAgICAgIENHSW1hZ2VSZWYgaW1hZ2UgPSBmcmFtZUF0SW5k
ZXgoaSk7CisgICAgICAgIGlmIChDR0ltYWdlR2V0SGVpZ2h0KGltYWdlKSA9PSAoc2l6ZV90KXNy
Y1NpemUuaGVpZ2h0KCkgJiYgQ0dJbWFnZUdldFdpZHRoKGltYWdlKSA9PSAoc2l6ZV90KXNyY1Np
emUud2lkdGgoKSkgeworICAgICAgICAgICAgc2l6ZV90IGN1cnJlbnRGcmFtZSA9IG1fY3VycmVu
dEZyYW1lOworICAgICAgICAgICAgbV9jdXJyZW50RnJhbWUgPSBpOworICAgICAgICAgICAgZHJh
dyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJlY3QoMCwgMCwgc3JjU2l6ZS53aWR0aCgpLCBzcmNTaXpl
LmhlaWdodCgpKSwgY29tcG9zaXRlT3ApOworICAgICAgICAgICAgbV9jdXJyZW50RnJhbWUgPSBj
dXJyZW50RnJhbWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICAvLyBObyBpbWFnZSBvZiB0aGUgY29ycmVjdCBzaXplIHdhcyBmb3VuZCwgZmFsbGJhY2sgdG8g
ZHJhd2luZyB0aGUgY3VycmVudCBmcmFtZQorICAgIEludFNpemUgaW1hZ2VTaXplID0gQml0bWFw
SW1hZ2U6OnNpemUoKTsKKyAgICBkcmF3KGN0eHQsIGRzdFJlY3QsIEZsb2F0UmVjdCgwLCAwLCBp
bWFnZVNpemUud2lkdGgoKSwgaW1hZ2VTaXplLmhlaWdodCgpKSwgY29tcG9zaXRlT3ApOworfQor
Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbi9JbWFnZUNHV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbi9JbWFnZUNHV2luLmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbi9JbWFnZUNHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsx
LDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJ
bmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CkBAIC0yOSwzOCArMjksMTEgQEAKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNpbmNs
dWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KIAotI2luY2x1
ZGUgPHdpbnNvY2syLmg+CiAjaW5jbHVkZSA8d2luZG93cy5oPgogI2luY2x1ZGUgIlBsYXRmb3Jt
U3RyaW5nLmgiCi0jaW5jbHVkZSAiTUlNRVR5cGVSZWdpc3RyeS5oIgotI2luY2x1ZGUgIlNoYXJl
ZEJ1ZmZlci5oIgotCi0vLyBUaGlzIGZ1bmN0aW9uIGxvYWRzIHJlc291cmNlcyBmcm9tIFdlYktp
dAotUGFzc1JlZlB0cjxXZWJDb3JlOjpTaGFyZWRCdWZmZXI+IGxvYWRSZXNvdXJjZUludG9CdWZm
ZXIoY29uc3QgY2hhciopOwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLXZvaWQgQml0bWFwSW1h
Z2U6OmluaXRQbGF0Zm9ybURhdGEoKQotewotfQotCi12b2lkIEJpdG1hcEltYWdlOjppbnZhbGlk
YXRlUGxhdGZvcm1EYXRhKCkKLXsKLX0KLQotSW1hZ2UqIEltYWdlOjpsb2FkUGxhdGZvcm1SZXNv
dXJjZShjb25zdCBjaGFyICpuYW1lKQotewotICAgIFJlZlB0cjxTaGFyZWRCdWZmZXI+IGJ1ZmZl
ciA9IGxvYWRSZXNvdXJjZUludG9CdWZmZXIobmFtZSk7Ci0gICAgQml0bWFwSW1hZ2UqIGltZyA9
IG5ldyBCaXRtYXBJbWFnZTsKLSAgICBpbWctPnNldERhdGEoYnVmZmVyLnJlbGVhc2UoKSwgdHJ1
ZSk7Ci0gICAgcmV0dXJuIGltZzsKLX0KLQotYm9vbCBCaXRtYXBJbWFnZTo6Z2V0SEJJVE1BUChI
QklUTUFQIGJtcCkKLXsKLSAgICByZXR1cm4gZ2V0SEJJVE1BUE9mU2l6ZShibXAsIDApOwotfQot
CiBib29sIEJpdG1hcEltYWdlOjpnZXRIQklUTUFQT2ZTaXplKEhCSVRNQVAgYm1wLCBMUFNJWkUg
c2l6ZSkKIHsKICAgICBBU1NFUlQoYm1wKTsKQEAgLTc2LDE1ICs0OSwxNyBAQCBib29sIEJpdG1h
cEltYWdlOjpnZXRIQklUTUFQT2ZTaXplKEhCSVRNCiAgICAgICAgIDgsIGJtcEluZm8uYm1XaWR0
aEJ5dGVzLCBkZXZpY2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwga0NHSW1hZ2VB
bHBoYVByZW11bHRpcGxpZWRGaXJzdCk7CiAgIAogICAgIEdyYXBoaWNzQ29udGV4dCBnYyhjZ0Nv
bnRleHQpOworCiAgICAgSW50U2l6ZSBpbWFnZVNpemUgPSBCaXRtYXBJbWFnZTo6c2l6ZSgpOwog
ICAgIGlmIChzaXplKQotICAgICAgICBkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUoJmdjLCBG
bG9hdFJlY3QoMCwgMCwgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwgSW50U2l6
ZSgqc2l6ZSksIENvbXBvc2l0ZUNvcHkpOworICAgICAgICBkcmF3RnJhbWVNYXRjaGluZ1NvdXJj
ZVNpemUoJmdjLCBGbG9hdFJlY3QoMC4wZiwgMC4wZiwgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZv
LmJtSGVpZ2h0KSwgSW50U2l6ZSgqc2l6ZSksIENvbXBvc2l0ZUNvcHkpOwogICAgIGVsc2UKLSAg
ICAgICAgZHJhdygmZ2MsIEZsb2F0UmVjdCgwLCAwLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8u
Ym1IZWlnaHQpLCBGbG9hdFJlY3QoMCwgMCwgaW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5o
ZWlnaHQoKSksIENvbXBvc2l0ZUNvcHkpOworICAgICAgICBkcmF3KCZnYywgRmxvYXRSZWN0KDAu
MGYsIDAuMGYsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCksIEZsb2F0UmVjdCgw
LjBmLCAwLjBmLCBpbWFnZVNpemUud2lkdGgoKSwgaW1hZ2VTaXplLmhlaWdodCgpKSwgQ29tcG9z
aXRlQ29weSk7CiAKICAgICAvLyBEbyBjbGVhbnVwCiAgICAgQ0dDb250ZXh0UmVsZWFzZShjZ0Nv
bnRleHQpOwogICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKKwogICAgIHJldHVy
biB0cnVlOwogfQogCkBAIC05MywxMCArNjgsMTAgQEAgdm9pZCBCaXRtYXBJbWFnZTo6ZHJhd0Zy
YW1lTWF0Y2hpbmdTb3VyYwogICAgIGludCBmcmFtZXMgPSBmcmFtZUNvdW50KCk7CiAgICAgZm9y
IChpbnQgaSA9IDA7IGkgPCBmcmFtZXM7ICsraSkgewogICAgICAgICBDR0ltYWdlUmVmIGltYWdl
ID0gZnJhbWVBdEluZGV4KGkpOwotICAgICAgICBpZiAoQ0dJbWFnZUdldEhlaWdodChpbWFnZSkg
PT0gKHNpemVfdClzcmNTaXplLmhlaWdodCgpICYmIENHSW1hZ2VHZXRXaWR0aChpbWFnZSkgPT0g
KHNpemVfdClzcmNTaXplLndpZHRoKCkpIHsKKyAgICAgICAgaWYgKENHSW1hZ2VHZXRIZWlnaHQo
aW1hZ2UpID09IHN0YXRpY19jYXN0PHNpemVfdD4oc3JjU2l6ZS5oZWlnaHQoKSkgJiYgQ0dJbWFn
ZUdldFdpZHRoKGltYWdlKSA9PSBzdGF0aWNfY2FzdDxzaXplX3Q+KHNyY1NpemUud2lkdGgoKSkp
IHsKICAgICAgICAgICAgIHNpemVfdCBjdXJyZW50RnJhbWUgPSBtX2N1cnJlbnRGcmFtZTsKICAg
ICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gaTsKLSAgICAgICAgICAgIGRyYXcoY3R4dCwgZHN0
UmVjdCwgRmxvYXRSZWN0KDAsIDAsIHNyY1NpemUud2lkdGgoKSwgc3JjU2l6ZS5oZWlnaHQoKSks
IGNvbXBvc2l0ZU9wKTsKKyAgICAgICAgICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRSZWN0
KDAuMGYsIDAuMGYsIHNyY1NpemUud2lkdGgoKSwgc3JjU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0
ZU9wKTsKICAgICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gY3VycmVudEZyYW1lOwogICAgICAg
ICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0xMDQsNyArNzksNyBAQCB2b2lkIEJpdG1hcElt
YWdlOjpkcmF3RnJhbWVNYXRjaGluZ1NvdXJjCiAKICAgICAvLyBObyBpbWFnZSBvZiB0aGUgY29y
cmVjdCBzaXplIHdhcyBmb3VuZCwgZmFsbGJhY2sgdG8gZHJhd2luZyB0aGUgY3VycmVudCBmcmFt
ZQogICAgIEludFNpemUgaW1hZ2VTaXplID0gQml0bWFwSW1hZ2U6OnNpemUoKTsKLSAgICBkcmF3
KGN0eHQsIGRzdFJlY3QsIEZsb2F0UmVjdCgwLCAwLCBpbWFnZVNpemUud2lkdGgoKSwgaW1hZ2VT
aXplLmhlaWdodCgpKSwgY29tcG9zaXRlT3ApOworICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxv
YXRSZWN0KDAuMGYsIDAuMGYsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkp
LCBjb21wb3NpdGVPcCk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ2Fpcm9XaW4uY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ2Fpcm9XaW4uY3BwCShyZXZpc2lv
biAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VDYWlyb1dpbi5jcHAJ
KHJldmlzaW9uIDApCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgg
QXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJCaXRtYXBJbWFnZS5oIgorI2luY2x1
ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgPGNhaXJvLmg+CisKKyNpbmNsdWRlIDx3
aW5kb3dzLmg+CisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCitib29sIEJpdG1hcEltYWdlOjpnZXRIQklUTUFQT2ZTaXplKEhCSVRNQVAgYm1wLCBM
UFNJWkUgc2l6ZSkKK3sKKyAgICBBU1NFUlQoYm1wKTsKKworICAgIEJJVE1BUCBibXBJbmZvOwor
ICAgIEdldE9iamVjdChibXAsIHNpemVvZihCSVRNQVApLCAmYm1wSW5mbyk7CisKKyAgICAvLyBJ
ZiB0aGlzIGlzIGEgMzJicHAgYml0bWFwLCB3aGljaCBpdCBhbHdheXMgc2hvdWxkIGJlLCB3ZSds
bCBjbGVhciBpdCBzbyBhbHBoYS13aXNlIGl0IHdpbGwgYmUgdmlzaWJsZQorICAgIGlmIChibXBJ
bmZvLmJtQml0c1BpeGVsID09IDMyKSB7CisgICAgICAgIGludCBidWZmZXJTaXplID0gYm1wSW5m
by5ibVdpZHRoQnl0ZXMgKiBibXBJbmZvLmJtSGVpZ2h0OworICAgICAgICBtZW1zZXQoYm1wSW5m
by5ibUJpdHMsIDI1NSwgYnVmZmVyU2l6ZSk7CisgICAgfQorIAkKKyAgICBIREMgdGVtcERDID0g
Q3JlYXRlQ29tcGF0aWJsZURDKDApOworICAgIGlmICghdGVtcERDKSB7CisgICAgICAgIExPR19F
UlJPUigiRmFpbGVkIHRvIGNyZWF0ZSBpbi1tZW1vcnkgREMgZm9yIEltYWdlOjpibGl0KCkiKTsK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBTZWxlY3RPYmplY3QodGVtcERDLCBi
bXApOworICAgIEdyYXBoaWNzQ29udGV4dCBnYyh0ZW1wREMpOworCisgICAgSW50U2l6ZSBpbWFn
ZVNpemUgPSBCaXRtYXBJbWFnZTo6c2l6ZSgpOworICAgIGlmIChzaXplKQorICAgICAgICBkcmF3
RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUoJmdjLCBGbG9hdFJlY3QoMC4wZiwgMC4wZiwgYm1wSW5m
by5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwgSW50U2l6ZSgqc2l6ZSksIENvbXBvc2l0ZUNv
cHkpOworICAgIGVsc2UKKyAgICAgICAgZHJhdygmZ2MsIEZsb2F0UmVjdCgwLjBmLCAwLjBmLCBi
bXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQpLCBGbG9hdFJlY3QoMC4wZiwgMC4wZiwg
aW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIENvbXBvc2l0ZUNvcHkpOwor
CisgICAgLy8gRG8gY2xlYW51cAorICAgIERlbGV0ZURDKHRlbXBEQyk7CisKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKwordm9pZCBCaXRtYXBJbWFnZTo6ZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXpl
KEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBjb25zdCBJ
bnRTaXplJiBzcmNTaXplLCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCkKK3sKKyAgICBp
bnQgZnJhbWVzID0gZnJhbWVDb3VudCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVz
OyArK2kpIHsKKyAgICAgICAgY2Fpcm9fc3VyZmFjZV90KiBpbWFnZSA9IGZyYW1lQXRJbmRleChp
KTsKKyAgICAgICAgaWYgKGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X2hlaWdodChpbWFnZSkgPT0g
c3RhdGljX2Nhc3Q8c2l6ZV90PihzcmNTaXplLmhlaWdodCgpKSAmJiBjYWlyb19pbWFnZV9zdXJm
YWNlX2dldF93aWR0aChpbWFnZSkgPT0gc3RhdGljX2Nhc3Q8c2l6ZV90PihzcmNTaXplLndpZHRo
KCkpKSB7CisgICAgICAgICAgICBzaXplX3QgY3VycmVudEZyYW1lID0gbV9jdXJyZW50RnJhbWU7
CisgICAgICAgICAgICBtX2N1cnJlbnRGcmFtZSA9IGk7CisgICAgICAgICAgICBkcmF3KGN0eHQs
IGRzdFJlY3QsIEZsb2F0UmVjdCgwLjBmLCAwLjBmLCBzcmNTaXplLndpZHRoKCksIHNyY1NpemUu
aGVpZ2h0KCkpLCBjb21wb3NpdGVPcCk7CisgICAgICAgICAgICBtX2N1cnJlbnRGcmFtZSA9IGN1
cnJlbnRGcmFtZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAg
IC8vIE5vIGltYWdlIG9mIHRoZSBjb3JyZWN0IHNpemUgd2FzIGZvdW5kLCBmYWxsYmFjayB0byBk
cmF3aW5nIHRoZSBjdXJyZW50IGZyYW1lCisgICAgSW50U2l6ZSBpbWFnZVNpemUgPSBCaXRtYXBJ
bWFnZTo6c2l6ZSgpOworICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRSZWN0KDAuMGYsIDAu
MGYsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBjb21wb3NpdGVPcCk7
Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL0ltYWdlV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbi9JbWFnZVdpbi5jcHAJKHJldmlzaW9uIDI5ODM0KQorKysgV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEs
NSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmln
aHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIElu
Yy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
QEAgLTI2LDEzICsyNiw3IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiSW1hZ2Uu
aCIKICNpbmNsdWRlICJCaXRtYXBJbWFnZS5oIgotI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5o
IgotI2luY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgog
Ci0jaW5jbHVkZSA8d2luc29jazIuaD4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSAi
UGxhdGZvcm1TdHJpbmcuaCIKLSNpbmNsdWRlICJNSU1FVHlwZVJlZ2lzdHJ5LmgiCiAjaW5jbHVk
ZSAiU2hhcmVkQnVmZmVyLmgiCiAKIC8vIFRoaXMgZnVuY3Rpb24gbG9hZHMgcmVzb3VyY2VzIGZy
b20gV2ViS2l0CkBAIC02MSw1MCArNTUsNCBAQCBib29sIEJpdG1hcEltYWdlOjpnZXRIQklUTUFQ
KEhCSVRNQVAgYm1wCiAgICAgcmV0dXJuIGdldEhCSVRNQVBPZlNpemUoYm1wLCAwKTsKIH0KIAot
Ym9vbCBCaXRtYXBJbWFnZTo6Z2V0SEJJVE1BUE9mU2l6ZShIQklUTUFQIGJtcCwgTFBTSVpFIHNp
emUpCi17Ci0gICAgQVNTRVJUKGJtcCk7Ci0KLSAgICBCSVRNQVAgYm1wSW5mbzsKLSAgICBHZXRP
YmplY3QoYm1wLCBzaXplb2YoQklUTUFQKSwgJmJtcEluZm8pOwotCi0gICAgQVNTRVJUKGJtcElu
Zm8uYm1CaXRzUGl4ZWwgPT0gMzIpOwotICAgIGludCBidWZmZXJTaXplID0gYm1wSW5mby5ibVdp
ZHRoQnl0ZXMgKiBibXBJbmZvLmJtSGVpZ2h0OwotICAgIAotICAgIENHQ29sb3JTcGFjZVJlZiBk
ZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKLSAgICBDR0NvbnRleHRS
ZWYgY2dDb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGJtcEluZm8uYm1CaXRzLCBibXBJ
bmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQsCi0gICAgICAgIDgsIGJtcEluZm8uYm1XaWR0
aEJ5dGVzLCBkZXZpY2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwga0NHSW1hZ2VB
bHBoYVByZW11bHRpcGxpZWRGaXJzdCk7Ci0gIAotICAgIEdyYXBoaWNzQ29udGV4dCBnYyhjZ0Nv
bnRleHQpOwotICAgIEludFNpemUgaW1hZ2VTaXplID0gQml0bWFwSW1hZ2U6OnNpemUoKTsKLSAg
ICBpZiAoc2l6ZSkKLSAgICAgICAgZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXplKCZnYywgRmxv
YXRSZWN0KDAsIDAsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCksIEludFNpemUo
KnNpemUpLCBDb21wb3NpdGVDb3B5KTsKLSAgICBlbHNlCi0gICAgICAgIGRyYXcoJmdjLCBGbG9h
dFJlY3QoMCwgMCwgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwgRmxvYXRSZWN0
KDAsIDAsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBDb21wb3NpdGVD
b3B5KTsKLQotICAgIC8vIERvIGNsZWFudXAKLSAgICBDR0NvbnRleHRSZWxlYXNlKGNnQ29udGV4
dCk7Ci0gICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOwotICAgIHJldHVybiB0cnVl
OwotfQotCi12b2lkIEJpdG1hcEltYWdlOjpkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUoR3Jh
cGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBGbG9hdFJlY3QmIGRzdFJlY3QsIGNvbnN0IEludFNp
emUmIHNyY1NpemUsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQotewotICAgIGludCBm
cmFtZXMgPSBmcmFtZUNvdW50KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZXM7ICsr
aSkgewotICAgICAgICBDR0ltYWdlUmVmIGltYWdlID0gZnJhbWVBdEluZGV4KGkpOwotICAgICAg
ICBpZiAoQ0dJbWFnZUdldEhlaWdodChpbWFnZSkgPT0gKHNpemVfdClzcmNTaXplLmhlaWdodCgp
ICYmIENHSW1hZ2VHZXRXaWR0aChpbWFnZSkgPT0gKHNpemVfdClzcmNTaXplLndpZHRoKCkpIHsK
LSAgICAgICAgICAgIHNpemVfdCBjdXJyZW50RnJhbWUgPSBtX2N1cnJlbnRGcmFtZTsKLSAgICAg
ICAgICAgIG1fY3VycmVudEZyYW1lID0gaTsKLSAgICAgICAgICAgIGRyYXcoY3R4dCwgZHN0UmVj
dCwgRmxvYXRSZWN0KDAsIDAsIHNyY1NpemUud2lkdGgoKSwgc3JjU2l6ZS5oZWlnaHQoKSksIGNv
bXBvc2l0ZU9wKTsKLSAgICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gY3VycmVudEZyYW1lOwot
ICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gTm8gaW1hZ2Ug
b2YgdGhlIGNvcnJlY3Qgc2l6ZSB3YXMgZm91bmQsIGZhbGxiYWNrIHRvIGRyYXdpbmcgdGhlIGN1
cnJlbnQgZnJhbWUKLSAgICBJbnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcEltYWdlOjpzaXplKCk7
Ci0gICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJlY3QoMCwgMCwgaW1hZ2VTaXplLndpZHRo
KCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsKLX0KLQogfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9u
dERhdGFDR1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW4vU2ltcGxlRm9udERhdGFDR1dpbi5jcHAJKHJldmlzaW9uIDI5ODM0KQkoZnJvbSBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YVdpbi5jcHA6Mjk4MzQpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNHV2luLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDI4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwg
MjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4g
CisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4g
CisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxl
Iikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQg
dG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMg
c29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRP
UlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
CisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJTaW1wbGVGb250RGF0YS5oIgorCisjaW5jbHVkZSA8d2luc29jazIuaD4K
KyNpbmNsdWRlICJGb250LmgiCisjaW5jbHVkZSAiRm9udENhY2hlLmgiCisjaW5jbHVkZSAiRmxv
YXRSZWN0LmgiCisjaW5jbHVkZSAiRm9udERlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSA8d3RmL01h
dGhFeHRyYXMuaD4KKyNpbmNsdWRlIDx1bmljb2RlL3VjaGFyLmg+CisjaW5jbHVkZSA8dW5pY29k
ZS91bm9ybS5oPgorI2luY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2
aWNlcy5oPgorI2luY2x1ZGUgPG1sYW5nLmg+CisjaW5jbHVkZSA8dGNoYXIuaD4KKyNpbmNsdWRl
IDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+CisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKwordXNpbmcgc3RkOjptYXg7CisKK2NvbnN0IGZsb2F0IGNTbWFsbENh
cHNGb250U2l6ZU11bHRpcGxpZXIgPSAwLjdmOworCitzdGF0aWMgYm9vbCBzaG91bGRBcHBseU1h
Y0FzY2VudEhhY2s7CisKK3N0YXRpYyBpbmxpbmUgZmxvYXQgc2NhbGVFbVRvVW5pdHMoZmxvYXQg
eCwgdW5zaWduZWQgdW5pdHNQZXJFbSkgeyByZXR1cm4gdW5pdHNQZXJFbSA/IHggLyAoZmxvYXQp
dW5pdHNQZXJFbSA6IHg7IH0KKwordm9pZCBTaW1wbGVGb250RGF0YTo6c2V0U2hvdWxkQXBwbHlN
YWNBc2NlbnRIYWNrKGJvb2wgYikKK3sKKyAgICBzaG91bGRBcHBseU1hY0FzY2VudEhhY2sgPSBi
OworfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUluaXQoKQoreyAgICAKKyAgICBt
X3N5bnRoZXRpY0JvbGRPZmZzZXQgPSBtX2ZvbnQuc3ludGhldGljQm9sZCgpID8gMS4wZiA6IDAu
ZjsKKyAgICBtX3NjcmlwdENhY2hlID0gMDsKKyAgICBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzID0g
MDsKKyAgICBtX2lzU3lzdGVtRm9udCA9IGZhbHNlOworICAgIAorICAgIGlmIChtX2ZvbnQudXNl
R0RJKCkpIHsKKyAgICAgICAgSERDIGhkYyA9IEdldERDKDApOworICAgICAgICBIR0RJT0JKIG9s
ZEZvbnQgPSBTZWxlY3RPYmplY3QoaGRjLCBtX2ZvbnQuaGZvbnQoKSk7CisgICAgICAgIE9VVExJ
TkVURVhUTUVUUklDIG1ldHJpY3M7CisgICAgICAgIEdldE91dGxpbmVUZXh0TWV0cmljcyhoZGMs
IHNpemVvZihtZXRyaWNzKSwgJm1ldHJpY3MpOworICAgICAgICBURVhUTUVUUklDJiB0ZXh0TWV0
cmljcyA9IG1ldHJpY3Mub3RtVGV4dE1ldHJpY3M7CisgICAgICAgIG1fYXNjZW50ID0gdGV4dE1l
dHJpY3MudG1Bc2NlbnQ7CisgICAgICAgIG1fZGVzY2VudCA9IHRleHRNZXRyaWNzLnRtRGVzY2Vu
dDsKKyAgICAgICAgbV9saW5lR2FwID0gdGV4dE1ldHJpY3MudG1FeHRlcm5hbExlYWRpbmc7Cisg
ICAgICAgIG1fbGluZVNwYWNpbmcgPSBtX2FzY2VudCArIG1fZGVzY2VudCArIG1fbGluZUdhcDsK
KyAgICAgICAgbV94SGVpZ2h0ID0gbV9hc2NlbnQgKiAwLjU2ZjsgLy8gQmVzdCBndWVzcyBmb3Ig
eEhlaWdodCBpZiBubyB4IGdseXBoIGlzIHByZXNlbnQuCisKKyAgICAgICAgR0xZUEhNRVRSSUNT
IGdtOworICAgICAgICBNQVQyIG1hdCA9IHsgMSwgMCwgMCwgMSB9OworICAgICAgICBEV09SRCBs
ZW4gPSBHZXRHbHlwaE91dGxpbmUoaGRjLCAneCcsIEdHT19NRVRSSUNTLCAmZ20sIDAsIDAsICZt
YXQpOworICAgICAgICBpZiAobGVuICE9IEdESV9FUlJPUiAmJiBnbS5nbXB0R2x5cGhPcmlnaW4u
eSA+IDApCisgICAgICAgICAgICBtX3hIZWlnaHQgPSBnbS5nbXB0R2x5cGhPcmlnaW4ueTsKKwor
ICAgICAgICBtX3VuaXRzUGVyRW0gPSBtZXRyaWNzLm90bUVNU3F1YXJlOworCisgICAgICAgIFNl
bGVjdE9iamVjdChoZGMsIG9sZEZvbnQpOworICAgICAgICBSZWxlYXNlREMoMCwgaGRjKTsKKwor
ICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ0dGb250UmVmIGZvbnQgPSBtX2ZvbnQuY2dG
b250KCk7CisgICAgaW50IGlBc2NlbnQgPSBDR0ZvbnRHZXRBc2NlbnQoZm9udCk7CisgICAgaW50
IGlEZXNjZW50ID0gQ0dGb250R2V0RGVzY2VudChmb250KTsKKyAgICBpbnQgaUxpbmVHYXAgPSBD
R0ZvbnRHZXRMZWFkaW5nKGZvbnQpOworICAgIG1fdW5pdHNQZXJFbSA9IENHRm9udEdldFVuaXRz
UGVyRW0oZm9udCk7CisgICAgZmxvYXQgcG9pbnRTaXplID0gbV9mb250LnNpemUoKTsKKyAgICBm
bG9hdCBmQXNjZW50ID0gc2NhbGVFbVRvVW5pdHMoaUFzY2VudCwgbV91bml0c1BlckVtKSAqIHBv
aW50U2l6ZTsKKyAgICBmbG9hdCBmRGVzY2VudCA9IC1zY2FsZUVtVG9Vbml0cyhpRGVzY2VudCwg
bV91bml0c1BlckVtKSAqIHBvaW50U2l6ZTsKKyAgICBmbG9hdCBmTGluZUdhcCA9IHNjYWxlRW1U
b1VuaXRzKGlMaW5lR2FwLCBtX3VuaXRzUGVyRW0pICogcG9pbnRTaXplOworCisgICAgaWYgKCFp
c0N1c3RvbUZvbnQoKSkgeworICAgICAgICBIREMgZGMgPSBHZXREQygwKTsKKyAgICAgICAgSEdE
SU9CSiBvbGRGb250ID0gU2VsZWN0T2JqZWN0KGRjLCBtX2ZvbnQuaGZvbnQoKSk7CisgICAgICAg
IGludCBmYWNlTGVuZ3RoID0gR2V0VGV4dEZhY2UoZGMsIDAsIDApOworICAgICAgICBWZWN0b3I8
VENIQVI+IGZhY2VOYW1lKGZhY2VMZW5ndGgpOworICAgICAgICBHZXRUZXh0RmFjZShkYywgZmFj
ZUxlbmd0aCwgZmFjZU5hbWUuZGF0YSgpKTsKKyAgICAgICAgbV9pc1N5c3RlbUZvbnQgPSAhX3Rj
c2NtcChmYWNlTmFtZS5kYXRhKCksIF9UKCJMdWNpZGEgR3JhbmRlIikpOworICAgICAgICBTZWxl
Y3RPYmplY3QoZGMsIG9sZEZvbnQpOworICAgICAgICBSZWxlYXNlREMoMCwgZGMpOworCisgICAg
ICAgIGlmIChzaG91bGRBcHBseU1hY0FzY2VudEhhY2spIHsKKyAgICAgICAgICAgIC8vIFRoaXMg
Y29kZSBjb21lcyBmcm9tIEZvbnREYXRhTWFjLm1tLiBXZSBvbmx5IGV2ZXIgZG8gdGhpcyB3aGVu
IHJ1bm5pbmcgcmVncmVzc2lvbiB0ZXN0cyBzbyB0aGF0IG91ciBtZXRyaWNzIHdpbGwgbWF0Y2gg
TWFjLgorCisgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGFkanVzdCBUaW1lcywgSGVsdmV0aWNh
LCBhbmQgQ291cmllciB0byBjbG9zZWx5IG1hdGNoIHRoZQorICAgICAgICAgICAgLy8gdmVydGlj
YWwgbWV0cmljcyBvZiB0aGVpciBNaWNyb3NvZnQgY291bnRlcnBhcnRzIHRoYXQgYXJlIHRoZSBk
ZSBmYWN0bworICAgICAgICAgICAgLy8gd2ViIHN0YW5kYXJkLiBUaGUgQXBwS2l0IGFkanVzdG1l
bnQgb2YgMjAlIGlzIHRvbyBiaWcgYW5kIGlzCisgICAgICAgICAgICAvLyBpbmNvcnJlY3RseSBh
ZGRlZCB0byBsaW5lIHNwYWNpbmcsIHNvIHdlIHVzZSBhIDE1JSBhZGp1c3RtZW50IGluc3RlYWQK
KyAgICAgICAgICAgIC8vIGFuZCBhZGQgaXQgdG8gdGhlIGFzY2VudC4KKyAgICAgICAgICAgIGlm
ICghX3Rjc2NtcChmYWNlTmFtZS5kYXRhKCksIF9UKCJUaW1lcyIpKSB8fCAhX3Rjc2NtcChmYWNl
TmFtZS5kYXRhKCksIF9UKCJIZWx2ZXRpY2EiKSkgfHwgIV90Y3NjbXAoZmFjZU5hbWUuZGF0YSgp
LCBfVCgiQ291cmllciIpKSkKKyAgICAgICAgICAgICAgICBmQXNjZW50ICs9IGZsb29yZigoKGZB
c2NlbnQgKyBmRGVzY2VudCkgKiAwLjE1ZikgKyAwLjVmKTsKKyAgICAgICAgfQorICAgIH0KKwor
ICAgIG1fYXNjZW50ID0gbHJvdW5kZihmQXNjZW50KTsKKyAgICBtX2Rlc2NlbnQgPSBscm91bmRm
KGZEZXNjZW50KTsKKyAgICBtX2xpbmVHYXAgPSBscm91bmRmKGZMaW5lR2FwKTsKKyAgICBtX2xp
bmVTcGFjaW5nID0gbV9hc2NlbnQgKyBtX2Rlc2NlbnQgKyBtX2xpbmVHYXA7CisKKyAgICAvLyBN
ZWFzdXJlIHRoZSBhY3R1YWwgY2hhcmFjdGVyICJ4IiwgYmVjYXVzZSBBcHBLaXQgc3ludGhlc2l6
ZXMgWCBoZWlnaHQgcmF0aGVyIHRoYW4gZ2V0dGluZyBpdCBmcm9tIHRoZSBmb250LgorICAgIC8v
IFVuZm9ydHVuYXRlbHksIE5TRm9udCB3aWxsIHJvdW5kIHRoaXMgZm9yIHVzIHNvIHdlIGRvbid0
IHF1aXRlIGdldCB0aGUgcmlnaHQgdmFsdWUuCisgICAgR2x5cGhQYWdlKiBnbHlwaFBhZ2VaZXJv
ID0gR2x5cGhQYWdlVHJlZU5vZGU6OmdldFJvb3RDaGlsZCh0aGlzLCAwKS0+cGFnZSgpOworICAg
IEdseXBoIHhHbHlwaCA9IGdseXBoUGFnZVplcm8gPyBnbHlwaFBhZ2VaZXJvLT5nbHlwaERhdGFG
b3JDaGFyYWN0ZXIoJ3gnKS5nbHlwaCA6IDA7CisgICAgaWYgKHhHbHlwaCkgeworICAgICAgICBD
R1JlY3QgeEJveDsKKyAgICAgICAgQ0dGb250R2V0R2x5cGhCQm94ZXMoZm9udCwgJnhHbHlwaCwg
MSwgJnhCb3gpOworICAgICAgICAvLyBVc2UgdGhlIG1heGltdW0gb2YgZWl0aGVyIHdpZHRoIG9y
IGhlaWdodCBiZWNhdXNlICJ4IiBpcyBuZWFybHkgc3F1YXJlCisgICAgICAgIC8vIGFuZCB3ZWIg
cGFnZXMgdGhhdCBmb29saXNobHkgdXNlIHRoaXMgbWV0cmljIGZvciB3aWR0aCB3aWxsIGJlIGxh
aWQgb3V0CisgICAgICAgIC8vIHBvb3JseSBpZiB3ZSByZXR1cm4gYW4gYWNjdXJhdGUgaGVpZ2h0
LiBDbGFzc2ljIGNhc2UgaXMgVGltZXMgMTMgcG9pbnQsCisgICAgICAgIC8vIHdoaWNoIGhhcyBh
biAieCIgdGhhdCBpcyA3eDYgcGl4ZWxzLgorICAgICAgICBtX3hIZWlnaHQgPSBzY2FsZUVtVG9V
bml0cyhtYXgoQ0dSZWN0R2V0TWF4WCh4Qm94KSwgQ0dSZWN0R2V0TWF4WSh4Qm94KSksIG1fdW5p
dHNQZXJFbSkgKiBwb2ludFNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGlYSGVpZ2h0
ID0gQ0dGb250R2V0WEhlaWdodChmb250KTsKKyAgICAgICAgbV94SGVpZ2h0ID0gc2NhbGVFbVRv
VW5pdHMoaVhIZWlnaHQsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7CisgICAgfQorfQorCit2
b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3koKQoreworICAgIGlmICghaXNDdXN0
b21Gb250KCkpIHsKKyAgICAgICAgRGVsZXRlT2JqZWN0KG1fZm9udC5oZm9udCgpKTsKKyAgICAg
ICAgQ0dGb250UmVsZWFzZShtX2ZvbnQuY2dGb250KCkpOworICAgIH0KKworICAgIC8vIFdlIGRv
bid0IGhhc2ggdGhpcyBvbiBXaW4zMiwgc28gaXQncyBlZmZlY3RpdmVseSBvd25lZCBieSB1cy4K
KyAgICBkZWxldGUgbV9zbWFsbENhcHNGb250RGF0YTsKKworICAgIFNjcmlwdEZyZWVDYWNoZSgm
bV9zY3JpcHRDYWNoZSk7CisgICAgZGVsZXRlIG1fc2NyaXB0Rm9udFByb3BlcnRpZXM7Cit9CisK
K1NpbXBsZUZvbnREYXRhKiBTaW1wbGVGb250RGF0YTo6c21hbGxDYXBzRm9udERhdGEoY29uc3Qg
Rm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIGNvbnN0Cit7CisgICAgaWYgKCFtX3Nt
YWxsQ2Fwc0ZvbnREYXRhKSB7CisgICAgICAgIGZsb2F0IHNtYWxsQ2Fwc0hlaWdodCA9IGNTbWFs
bENhcHNGb250U2l6ZU11bHRpcGxpZXIgKiBtX2ZvbnQuc2l6ZSgpOworICAgICAgICBpZiAoaXND
dXN0b21Gb250KCkpIHsKKyAgICAgICAgICAgIEZvbnRQbGF0Zm9ybURhdGEgc21hbGxDYXBzRm9u
dERhdGEobV9mb250KTsKKyAgICAgICAgICAgIHNtYWxsQ2Fwc0ZvbnREYXRhLnNldFNpemUoc21h
bGxDYXBzSGVpZ2h0KTsKKyAgICAgICAgICAgIG1fc21hbGxDYXBzRm9udERhdGEgPSBuZXcgU2lt
cGxlRm9udERhdGEoc21hbGxDYXBzRm9udERhdGEsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgIExPR0ZPTlQgd2luZm9udDsKKyAgICAgICAgICAgIEdldE9iamVj
dChtX2ZvbnQuaGZvbnQoKSwgc2l6ZW9mKExPR0ZPTlQpLCAmd2luZm9udCk7CisgICAgICAgICAg
ICB3aW5mb250LmxmSGVpZ2h0ID0gLWxyb3VuZGYoc21hbGxDYXBzSGVpZ2h0ICogKG1fZm9udC51
c2VHREkoKSA/IDEgOiAzMikpOworICAgICAgICAgICAgSEZPTlQgaGZvbnQgPSBDcmVhdGVGb250
SW5kaXJlY3QoJndpbmZvbnQpOworICAgICAgICAgICAgbV9zbWFsbENhcHNGb250RGF0YSA9IG5l
dyBTaW1wbGVGb250RGF0YShGb250UGxhdGZvcm1EYXRhKGhmb250LCBzbWFsbENhcHNIZWlnaHQs
IGZvbnREZXNjcmlwdGlvbi5ib2xkKCksIGZvbnREZXNjcmlwdGlvbi5pdGFsaWMoKSwgbV9mb250
LnVzZUdESSgpKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1fc21hbGxDYXBzRm9u
dERhdGE7Cit9CisKK2Jvb2wgU2ltcGxlRm9udERhdGE6OmNvbnRhaW5zQ2hhcmFjdGVycyhjb25z
dCBVQ2hhciogY2hhcmFjdGVycywgaW50IGxlbmd0aCkgY29uc3QKK3sKKyAgICAvLyBGSVhNRTog
U3VwcG9ydCBjdXN0b20gZm9udHMuCisgICAgaWYgKGlzQ3VzdG9tRm9udCgpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICAvLyBGSVhNRTogTWljcm9zb2Z0IGRvY3VtZW50YXRpb24gc2Vl
bXMgdG8gaW1wbHkgdGhhdCBjaGFyYWN0ZXJzIGNhbiBiZSBvdXRwdXQgdXNpbmcgYSBnaXZlbiBm
b250IGFuZCBEQworICAgIC8vIG1lcmVseSBieSB0ZXN0aW5nIGNvZGUgcGFnZSBpbnRlcnNlY3Rp
b24uICBUaGlzIHNlZW1zIHN1c3BlY3QgdGhvdWdoLiAgQ2FuJ3QgYSBmb250IG9ubHkgcGFydGlh
bGx5CisgICAgLy8gY292ZXIgYSBnaXZlbiBjb2RlIHBhZ2U/CisgICAgSU1MYW5nRm9udExpbmsy
KiBsYW5nRm9udExpbmsgPSBGb250Q2FjaGU6OmdldEZvbnRMaW5rSW50ZXJmYWNlKCk7CisgICAg
aWYgKCFsYW5nRm9udExpbmspCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEhEQyBkYyA9
IEdldERDKDApOworICAgIAorICAgIERXT1JEIGFjcENvZGVQYWdlczsKKyAgICBsYW5nRm9udExp
bmstPkNvZGVQYWdlVG9Db2RlUGFnZXMoQ1BfQUNQLCAmYWNwQ29kZVBhZ2VzKTsKKworICAgIERX
T1JEIGZvbnRDb2RlUGFnZXM7CisgICAgbGFuZ0ZvbnRMaW5rLT5HZXRGb250Q29kZVBhZ2VzKGRj
LCBtX2ZvbnQuaGZvbnQoKSwgJmZvbnRDb2RlUGFnZXMpOworCisgICAgRFdPUkQgYWN0dWFsQ29k
ZVBhZ2VzOworICAgIGxvbmcgbnVtQ2hhcmFjdGVyc1Byb2Nlc3NlZDsKKyAgICBsb25nIG9mZnNl
dCA9IDA7CisgICAgd2hpbGUgKG9mZnNldCA8IGxlbmd0aCkgeworICAgICAgICBsYW5nRm9udExp
bmstPkdldFN0ckNvZGVQYWdlcyhjaGFyYWN0ZXJzLCBsZW5ndGgsIGFjcENvZGVQYWdlcywgJmFj
dHVhbENvZGVQYWdlcywgJm51bUNoYXJhY3RlcnNQcm9jZXNzZWQpOworICAgICAgICBpZiAoKGFj
dHVhbENvZGVQYWdlcyAmIGZvbnRDb2RlUGFnZXMpID09IDApCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIG9mZnNldCArPSBudW1DaGFyYWN0ZXJzUHJvY2Vzc2VkOworICAgIH0K
KworICAgIFJlbGVhc2VEQygwLCBkYyk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBT
aW1wbGVGb250RGF0YTo6ZGV0ZXJtaW5lUGl0Y2goKQoreworICAgIGlmIChpc0N1c3RvbUZvbnQo
KSkgeworICAgICAgICBtX3RyZWF0QXNGaXhlZFBpdGNoID0gZmFsc2U7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICAvLyBURVhUTUVUUklDUyBoYXZlIHRoaXMuICBTZXQgbV90cmVhdEFz
Rml4ZWRQaXRjaCBiYXNlZCBvZmYgdGhhdC4KKyAgICBIREMgZGMgPSBHZXREQygwKTsKKyAgICBT
YXZlREMoZGMpOworICAgIFNlbGVjdE9iamVjdChkYywgbV9mb250Lmhmb250KCkpOworCisgICAg
Ly8gWWVzLCB0aGlzIGxvb2tzIGJhY2t3YXJkcywgYnV0IHRoZSBmaXhlZCBwaXRjaCBiaXQgaXMg
YWN0dWFsbHkgc2V0IGlmIHRoZSBmb250CisgICAgLy8gaXMgKm5vdCogZml4ZWQgcGl0Y2guICBV
bmJlbGlldmFibGUgYnV0IHRydWUuCisgICAgVEVYVE1FVFJJQyB0bTsKKyAgICBHZXRUZXh0TWV0
cmljcyhkYywgJnRtKTsKKyAgICBtX3RyZWF0QXNGaXhlZFBpdGNoID0gKCh0bS50bVBpdGNoQW5k
RmFtaWx5ICYgVE1QRl9GSVhFRF9QSVRDSCkgPT0gMCk7CisKKyAgICBSZXN0b3JlREMoZGMsIC0x
KTsKKyAgICBSZWxlYXNlREMoMCwgZGMpOworfQorCitmbG9hdCBTaW1wbGVGb250RGF0YTo6cGxh
dGZvcm1XaWR0aEZvckdseXBoKEdseXBoIGdseXBoKSBjb25zdAoreworICAgIGlmIChtX2ZvbnQu
dXNlR0RJKCkpIHsKKyAgICAgICAgSERDIGhkYyA9IEdldERDKDApOworICAgICAgICBIR0RJT0JK
IG9sZEZvbnQgPSBTZWxlY3RPYmplY3QoaGRjLCBtX2ZvbnQuaGZvbnQoKSk7CisgICAgICAgIGlu
dCB3aWR0aDsKKyAgICAgICAgR2V0Q2hhcldpZHRoSShoZGMsIGdseXBoLCAxLCAwLCAmd2lkdGgp
OworICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBvbGRGb250KTsKKyAgICAgICAgUmVsZWFzZURD
KDAsIGhkYyk7CisgICAgICAgIHJldHVybiB3aWR0aDsKKyAgICB9CisKKyAgICBDR0ZvbnRSZWYg
Zm9udCA9IG1fZm9udC5jZ0ZvbnQoKTsKKyAgICBmbG9hdCBwb2ludFNpemUgPSBtX2ZvbnQuc2l6
ZSgpOworICAgIENHU2l6ZSBhZHZhbmNlOworICAgIENHQWZmaW5lVHJhbnNmb3JtIG0gPSBDR0Fm
ZmluZVRyYW5zZm9ybU1ha2VTY2FsZShwb2ludFNpemUsIHBvaW50U2l6ZSk7CisgICAgLy8gRklY
TUU6IE5lZWQgdG8gYWRkIHJlYWwgc3VwcG9ydCBmb3IgcHJpbnRlciBmb250cy4KKyAgICBib29s
IGlzUHJpbnRlckZvbnQgPSBmYWxzZTsKKyAgICB3a0dldEdseXBoQWR2YW5jZXMoZm9udCwgbSwg
bV9pc1N5c3RlbUZvbnQsIGlzUHJpbnRlckZvbnQsIGdseXBoLCBhZHZhbmNlKTsKKyAgICByZXR1
cm4gYWR2YW5jZS53aWR0aCArIG1fc3ludGhldGljQm9sZE9mZnNldDsKK30KKworU0NSSVBUX0ZP
TlRQUk9QRVJUSUVTKiBTaW1wbGVGb250RGF0YTo6c2NyaXB0Rm9udFByb3BlcnRpZXMoKSBjb25z
dAoreworICAgIGlmICghbV9zY3JpcHRGb250UHJvcGVydGllcykgeworICAgICAgICBtX3Njcmlw
dEZvbnRQcm9wZXJ0aWVzID0gbmV3IFNDUklQVF9GT05UUFJPUEVSVElFUzsKKyAgICAgICAgbWVt
c2V0KG1fc2NyaXB0Rm9udFByb3BlcnRpZXMsIDAsIHNpemVvZihTQ1JJUFRfRk9OVFBST1BFUlRJ
RVMpKTsKKyAgICAgICAgbV9zY3JpcHRGb250UHJvcGVydGllcy0+Y0J5dGVzID0gc2l6ZW9mKFND
UklQVF9GT05UUFJPUEVSVElFUyk7CisgICAgICAgIEhSRVNVTFQgcmVzdWx0ID0gU2NyaXB0R2V0
Rm9udFByb3BlcnRpZXMoMCwgc2NyaXB0Q2FjaGUoKSwgbV9zY3JpcHRGb250UHJvcGVydGllcyk7
CisgICAgICAgIGlmIChyZXN1bHQgPT0gRV9QRU5ESU5HKSB7CisgICAgICAgICAgICBIREMgZGMg
PSBHZXREQygwKTsKKyAgICAgICAgICAgIFNhdmVEQyhkYyk7CisgICAgICAgICAgICBTZWxlY3RP
YmplY3QoZGMsIG1fZm9udC5oZm9udCgpKTsKKyAgICAgICAgICAgIFNjcmlwdEdldEZvbnRQcm9w
ZXJ0aWVzKGRjLCBzY3JpcHRDYWNoZSgpLCBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzKTsKKyAgICAg
ICAgICAgIFJlc3RvcmVEQyhkYywgLTEpOworICAgICAgICAgICAgUmVsZWFzZURDKDAsIGRjKTsK
KyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbV9zY3JpcHRGb250UHJvcGVydGllczsKK30K
KworfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERhdGFD
R1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vU2lt
cGxlRm9udERhdGFDR1dpbi5jcHAJKHJldmlzaW9uIDI5NzI2KQorKysgV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERhdGFDR1dpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4g
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDgg
QXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucwpAQCAtMzgsMjcgKzM4LDE4IEBACiAjaW5jbHVkZSA8dW5pY29kZS91Y2hhci5oPgog
I2luY2x1ZGUgPHVuaWNvZGUvdW5vcm0uaD4KICNpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2Vz
L0FwcGxpY2F0aW9uU2VydmljZXMuaD4KKyNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2Uv
V2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWxhbmcuaD4KICNpbmNsdWRlIDx0
Y2hhci5oPgotI2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVyZmFjZS9XZWJLaXRTeXN0ZW1JbnRl
cmZhY2UuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCiB1c2luZyBzdGQ6Om1heDsKIAotY29u
c3QgZmxvYXQgY1NtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllciA9IDAuN2Y7Ci0KLXN0YXRpYyBi
b29sIHNob3VsZEFwcGx5TWFjQXNjZW50SGFjazsKLQotc3RhdGljIGlubGluZSBmbG9hdCBzY2Fs
ZUVtVG9Vbml0cyhmbG9hdCB4LCB1bnNpZ25lZCB1bml0c1BlckVtKSB7IHJldHVybiB1bml0c1Bl
ckVtID8geCAvIChmbG9hdCl1bml0c1BlckVtIDogeDsgfQotCi12b2lkIFNpbXBsZUZvbnREYXRh
OjpzZXRTaG91bGRBcHBseU1hY0FzY2VudEhhY2soYm9vbCBiKQotewotICAgIHNob3VsZEFwcGx5
TWFjQXNjZW50SGFjayA9IGI7Ci19CitzdGF0aWMgaW5saW5lIGZsb2F0IHNjYWxlRW1Ub1VuaXRz
KGZsb2F0IHgsIHVuc2lnbmVkIHVuaXRzUGVyRW0pIHsgcmV0dXJuIHVuaXRzUGVyRW0gPyB4IC8g
c3RhdGljX2Nhc3Q8ZmxvYXQ+KHVuaXRzUGVyRW0pIDogeDsgfQogCiB2b2lkIFNpbXBsZUZvbnRE
YXRhOjpwbGF0Zm9ybUluaXQoKQoteyAgICAKK3sKICAgICBtX3N5bnRoZXRpY0JvbGRPZmZzZXQg
PSBtX2ZvbnQuc3ludGhldGljQm9sZCgpID8gMS4wZiA6IDAuZjsKICAgICBtX3NjcmlwdENhY2hl
ID0gMDsKICAgICBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzID0gMDsKQEAgLTExMCw3ICsxMDEsNyBA
QCB2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUluaXQoKQogICAgICAgICBTZWxlY3RPYmpl
Y3QoZGMsIG9sZEZvbnQpOwogICAgICAgICBSZWxlYXNlREMoMCwgZGMpOwogCi0gICAgICAgIGlm
IChzaG91bGRBcHBseU1hY0FzY2VudEhhY2spIHsKKyAgICAgICAgaWYgKHNob3VsZEFwcGx5TWFj
QXNjZW50SGFjaygpKSB7CiAgICAgICAgICAgICAvLyBUaGlzIGNvZGUgY29tZXMgZnJvbSBGb250
RGF0YU1hYy5tbS4gV2Ugb25seSBldmVyIGRvIHRoaXMgd2hlbiBydW5uaW5nIHJlZ3Jlc3Npb24g
dGVzdHMgc28gdGhhdCBvdXIgbWV0cmljcyB3aWxsIG1hdGNoIE1hYy4KIAogICAgICAgICAgICAg
Ly8gV2UgbmVlZCB0byBhZGp1c3QgVGltZXMsIEhlbHZldGljYSwgYW5kIENvdXJpZXIgdG8gY2xv
c2VseSBtYXRjaCB0aGUKQEAgLTE2MCw4MyArMTUxLDYgQEAgdm9pZCBTaW1wbGVGb250RGF0YTo6
cGxhdGZvcm1EZXN0cm95KCkKICAgICBkZWxldGUgbV9zY3JpcHRGb250UHJvcGVydGllczsKIH0K
IAotU2ltcGxlRm9udERhdGEqIFNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNGb250RGF0YShjb25z
dCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKLXsKLSAgICBpZiAoIW1f
c21hbGxDYXBzRm9udERhdGEpIHsKLSAgICAgICAgZmxvYXQgc21hbGxDYXBzSGVpZ2h0ID0gY1Nt
YWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllciAqIG1fZm9udC5zaXplKCk7Ci0gICAgICAgIGlmIChp
c0N1c3RvbUZvbnQoKSkgewotICAgICAgICAgICAgRm9udFBsYXRmb3JtRGF0YSBzbWFsbENhcHNG
b250RGF0YShtX2ZvbnQpOwotICAgICAgICAgICAgc21hbGxDYXBzRm9udERhdGEuc2V0U2l6ZShz
bWFsbENhcHNIZWlnaHQpOwotICAgICAgICAgICAgbV9zbWFsbENhcHNGb250RGF0YSA9IG5ldyBT
aW1wbGVGb250RGF0YShzbWFsbENhcHNGb250RGF0YSwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB9
IGVsc2UgewotICAgICAgICAgICAgTE9HRk9OVCB3aW5mb250OwotICAgICAgICAgICAgR2V0T2Jq
ZWN0KG1fZm9udC5oZm9udCgpLCBzaXplb2YoTE9HRk9OVCksICZ3aW5mb250KTsKLSAgICAgICAg
ICAgIHdpbmZvbnQubGZIZWlnaHQgPSAtbHJvdW5kZihzbWFsbENhcHNIZWlnaHQgKiAobV9mb250
LnVzZUdESSgpID8gMSA6IDMyKSk7Ci0gICAgICAgICAgICBIRk9OVCBoZm9udCA9IENyZWF0ZUZv
bnRJbmRpcmVjdCgmd2luZm9udCk7Ci0gICAgICAgICAgICBtX3NtYWxsQ2Fwc0ZvbnREYXRhID0g
bmV3IFNpbXBsZUZvbnREYXRhKEZvbnRQbGF0Zm9ybURhdGEoaGZvbnQsIHNtYWxsQ2Fwc0hlaWdo
dCwgZm9udERlc2NyaXB0aW9uLmJvbGQoKSwgZm9udERlc2NyaXB0aW9uLml0YWxpYygpLCBtX2Zv
bnQudXNlR0RJKCkpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbV9zbWFsbENhcHNG
b250RGF0YTsKLX0KLQotYm9vbCBTaW1wbGVGb250RGF0YTo6Y29udGFpbnNDaGFyYWN0ZXJzKGNv
bnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3RoKSBjb25zdAotewotICAgIC8vIEZJWE1F
OiBTdXBwb3J0IGN1c3RvbSBmb250cy4KLSAgICBpZiAoaXNDdXN0b21Gb250KCkpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIC8vIEZJWE1FOiBNaWNyb3NvZnQgZG9jdW1lbnRhdGlvbiBz
ZWVtcyB0byBpbXBseSB0aGF0IGNoYXJhY3RlcnMgY2FuIGJlIG91dHB1dCB1c2luZyBhIGdpdmVu
IGZvbnQgYW5kIERDCi0gICAgLy8gbWVyZWx5IGJ5IHRlc3RpbmcgY29kZSBwYWdlIGludGVyc2Vj
dGlvbi4gIFRoaXMgc2VlbXMgc3VzcGVjdCB0aG91Z2guICBDYW4ndCBhIGZvbnQgb25seSBwYXJ0
aWFsbHkKLSAgICAvLyBjb3ZlciBhIGdpdmVuIGNvZGUgcGFnZT8KLSAgICBJTUxhbmdGb250TGlu
azIqIGxhbmdGb250TGluayA9IEZvbnRDYWNoZTo6Z2V0Rm9udExpbmtJbnRlcmZhY2UoKTsKLSAg
ICBpZiAoIWxhbmdGb250TGluaykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgSERDIGRj
ID0gR2V0REMoMCk7Ci0gICAgCi0gICAgRFdPUkQgYWNwQ29kZVBhZ2VzOwotICAgIGxhbmdGb250
TGluay0+Q29kZVBhZ2VUb0NvZGVQYWdlcyhDUF9BQ1AsICZhY3BDb2RlUGFnZXMpOwotCi0gICAg
RFdPUkQgZm9udENvZGVQYWdlczsKLSAgICBsYW5nRm9udExpbmstPkdldEZvbnRDb2RlUGFnZXMo
ZGMsIG1fZm9udC5oZm9udCgpLCAmZm9udENvZGVQYWdlcyk7Ci0KLSAgICBEV09SRCBhY3R1YWxD
b2RlUGFnZXM7Ci0gICAgbG9uZyBudW1DaGFyYWN0ZXJzUHJvY2Vzc2VkOwotICAgIGxvbmcgb2Zm
c2V0ID0gMDsKLSAgICB3aGlsZSAob2Zmc2V0IDwgbGVuZ3RoKSB7Ci0gICAgICAgIGxhbmdGb250
TGluay0+R2V0U3RyQ29kZVBhZ2VzKGNoYXJhY3RlcnMsIGxlbmd0aCwgYWNwQ29kZVBhZ2VzLCAm
YWN0dWFsQ29kZVBhZ2VzLCAmbnVtQ2hhcmFjdGVyc1Byb2Nlc3NlZCk7Ci0gICAgICAgIGlmICgo
YWN0dWFsQ29kZVBhZ2VzICYgZm9udENvZGVQYWdlcykgPT0gMCkKLSAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAgICAgb2Zmc2V0ICs9IG51bUNoYXJhY3RlcnNQcm9jZXNzZWQ7Ci0gICAg
fQotCi0gICAgUmVsZWFzZURDKDAsIGRjKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lk
IFNpbXBsZUZvbnREYXRhOjpkZXRlcm1pbmVQaXRjaCgpCi17Ci0gICAgaWYgKGlzQ3VzdG9tRm9u
dCgpKSB7Ci0gICAgICAgIG1fdHJlYXRBc0ZpeGVkUGl0Y2ggPSBmYWxzZTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLQotICAgIC8vIFRFWFRNRVRSSUNTIGhhdmUgdGhpcy4gIFNldCBtX3RyZWF0
QXNGaXhlZFBpdGNoIGJhc2VkIG9mZiB0aGF0LgotICAgIEhEQyBkYyA9IEdldERDKDApOwotICAg
IFNhdmVEQyhkYyk7Ci0gICAgU2VsZWN0T2JqZWN0KGRjLCBtX2ZvbnQuaGZvbnQoKSk7Ci0KLSAg
ICAvLyBZZXMsIHRoaXMgbG9va3MgYmFja3dhcmRzLCBidXQgdGhlIGZpeGVkIHBpdGNoIGJpdCBp
cyBhY3R1YWxseSBzZXQgaWYgdGhlIGZvbnQKLSAgICAvLyBpcyAqbm90KiBmaXhlZCBwaXRjaC4g
IFVuYmVsaWV2YWJsZSBidXQgdHJ1ZS4KLSAgICBURVhUTUVUUklDIHRtOwotICAgIEdldFRleHRN
ZXRyaWNzKGRjLCAmdG0pOwotICAgIG1fdHJlYXRBc0ZpeGVkUGl0Y2ggPSAoKHRtLnRtUGl0Y2hB
bmRGYW1pbHkgJiBUTVBGX0ZJWEVEX1BJVENIKSA9PSAwKTsKLQotICAgIFJlc3RvcmVEQyhkYywg
LTEpOwotICAgIFJlbGVhc2VEQygwLCBkYyk7Ci19Ci0KIGZsb2F0IFNpbXBsZUZvbnREYXRhOjpw
bGF0Zm9ybVdpZHRoRm9yR2x5cGgoR2x5cGggZ2x5cGgpIGNvbnN0CiB7CiAgICAgaWYgKG1fZm9u
dC51c2VHREkoKSkgewpAQCAtMjUzLDI5ICsxNjcsMTIgQEAgZmxvYXQgU2ltcGxlRm9udERhdGE6
OnBsYXRmb3JtV2lkdGhGb3JHbAogICAgIGZsb2F0IHBvaW50U2l6ZSA9IG1fZm9udC5zaXplKCk7
CiAgICAgQ0dTaXplIGFkdmFuY2U7CiAgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENHQWZmaW5l
VHJhbnNmb3JtTWFrZVNjYWxlKHBvaW50U2l6ZSwgcG9pbnRTaXplKTsKKyAKICAgICAvLyBGSVhN
RTogTmVlZCB0byBhZGQgcmVhbCBzdXBwb3J0IGZvciBwcmludGVyIGZvbnRzLgogICAgIGJvb2wg
aXNQcmludGVyRm9udCA9IGZhbHNlOwogICAgIHdrR2V0R2x5cGhBZHZhbmNlcyhmb250LCBtLCBt
X2lzU3lzdGVtRm9udCwgaXNQcmludGVyRm9udCwgZ2x5cGgsIGFkdmFuY2UpOwotICAgIHJldHVy
biBhZHZhbmNlLndpZHRoICsgbV9zeW50aGV0aWNCb2xkT2Zmc2V0OwotfQogCi1TQ1JJUFRfRk9O
VFBST1BFUlRJRVMqIFNpbXBsZUZvbnREYXRhOjpzY3JpcHRGb250UHJvcGVydGllcygpIGNvbnN0
Ci17Ci0gICAgaWYgKCFtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzKSB7Ci0gICAgICAgIG1fc2NyaXB0
Rm9udFByb3BlcnRpZXMgPSBuZXcgU0NSSVBUX0ZPTlRQUk9QRVJUSUVTOwotICAgICAgICBtZW1z
ZXQobV9zY3JpcHRGb250UHJvcGVydGllcywgMCwgc2l6ZW9mKFNDUklQVF9GT05UUFJPUEVSVElF
UykpOwotICAgICAgICBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzLT5jQnl0ZXMgPSBzaXplb2YoU0NS
SVBUX0ZPTlRQUk9QRVJUSUVTKTsKLSAgICAgICAgSFJFU1VMVCByZXN1bHQgPSBTY3JpcHRHZXRG
b250UHJvcGVydGllcygwLCBzY3JpcHRDYWNoZSgpLCBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzKTsK
LSAgICAgICAgaWYgKHJlc3VsdCA9PSBFX1BFTkRJTkcpIHsKLSAgICAgICAgICAgIEhEQyBkYyA9
IEdldERDKDApOwotICAgICAgICAgICAgU2F2ZURDKGRjKTsKLSAgICAgICAgICAgIFNlbGVjdE9i
amVjdChkYywgbV9mb250Lmhmb250KCkpOwotICAgICAgICAgICAgU2NyaXB0R2V0Rm9udFByb3Bl
cnRpZXMoZGMsIHNjcmlwdENhY2hlKCksIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMpOwotICAgICAg
ICAgICAgUmVzdG9yZURDKGRjLCAtMSk7Ci0gICAgICAgICAgICBSZWxlYXNlREMoMCwgZGMpOwot
ICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzOworICAg
IHJldHVybiBhZHZhbmNlLndpZHRoICsgbV9zeW50aGV0aWNCb2xkT2Zmc2V0OwogfQogCiB9Cklu
ZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNhaXJvV2lu
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVG
b250RGF0YUNhaXJvV2luLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ2Fpcm9XaW4uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBcHBsZSBJbmMuICBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKiAyLiAgUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAzLiAgTmVpdGhlciB0aGUgbmFt
ZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICog
ICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHBy
b2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZp
YyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisg
KiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTaW1wbGVGb250
RGF0YS5oIgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjaW5jbHVkZSAiRm9udC5oIgorI2lu
Y2x1ZGUgIkZvbnRDYWNoZS5oIgorI2luY2x1ZGUgIkZvbnREZXNjcmlwdGlvbi5oIgorI2luY2x1
ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSA8bWxhbmcuaD4KKyNpbmNsdWRlIDx0Y2hh
ci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3ZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRm
b3JtSW5pdCgpCit7CisgICAgbV9zY3JpcHRDYWNoZSA9IDA7CisgICAgbV9zY3JpcHRGb250UHJv
cGVydGllcyA9IDA7CisgICAgbV9pc1N5c3RlbUZvbnQgPSBmYWxzZTsKKyAgICAKKyAgICBpZiAo
bV9mb250LnVzZUdESSgpKSB7CisgICAgICAgIEhEQyBoZGMgPSBHZXREQygwKTsKKyAgICAgICAg
SEdESU9CSiBvbGRGb250ID0gU2VsZWN0T2JqZWN0KGhkYywgbV9mb250Lmhmb250KCkpOworICAg
ICAgICBPVVRMSU5FVEVYVE1FVFJJQyBtZXRyaWNzOworICAgICAgICBHZXRPdXRsaW5lVGV4dE1l
dHJpY3MoaGRjLCBzaXplb2YobWV0cmljcyksICZtZXRyaWNzKTsKKyAgICAgICAgVEVYVE1FVFJJ
QyYgdGV4dE1ldHJpY3MgPSBtZXRyaWNzLm90bVRleHRNZXRyaWNzOworICAgICAgICBtX2FzY2Vu
dCA9IHRleHRNZXRyaWNzLnRtQXNjZW50OworICAgICAgICBtX2Rlc2NlbnQgPSB0ZXh0TWV0cmlj
cy50bURlc2NlbnQ7CisgICAgICAgIG1fbGluZUdhcCA9IHRleHRNZXRyaWNzLnRtRXh0ZXJuYWxM
ZWFkaW5nOworICAgICAgICBtX2xpbmVTcGFjaW5nID0gbV9hc2NlbnQgKyBtX2Rlc2NlbnQgKyBt
X2xpbmVHYXA7CisgICAgICAgIG1feEhlaWdodCA9IG1fYXNjZW50ICogMC41NmY7IC8vIEJlc3Qg
Z3Vlc3MgZm9yIHhIZWlnaHQgaWYgbm8geCBnbHlwaCBpcyBwcmVzZW50LgorCisgICAgICAgIEdM
WVBITUVUUklDUyBnbTsKKyAgICAgICAgTUFUMiBtYXQgPSB7IDEsIDAsIDAsIDEgfTsKKyAgICAg
ICAgRFdPUkQgbGVuID0gR2V0R2x5cGhPdXRsaW5lKGhkYywgJ3gnLCBHR09fTUVUUklDUywgJmdt
LCAwLCAwLCAmbWF0KTsKKyAgICAgICAgaWYgKGxlbiAhPSBHRElfRVJST1IgJiYgZ20uZ21wdEds
eXBoT3JpZ2luLnkgPiAwKQorICAgICAgICAgICAgbV94SGVpZ2h0ID0gZ20uZ21wdEdseXBoT3Jp
Z2luLnk7CisKKyAgICAgICAgbV91bml0c1BlckVtID0gbWV0cmljcy5vdG1FTVNxdWFyZTsKKwor
ICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBvbGRGb250KTsKKyAgICAgICAgUmVsZWFzZURDKDAs
IGhkYyk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEZJWE1FOiBUaGlzIHNl
Y3Rpb24gc2hvdWxkIGRldGVybWluZSBmb250IGRpbWVuc2lvbnMgKHNlZSBDRyBpbXBsZW1lbnRh
dGlvbikuCisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBTaW1wbGVGb250RGF0YTo6
cGxhdGZvcm1EZXN0cm95KCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCitmbG9hdCBT
aW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZvckdseXBoKEdseXBoIGdseXBoKSBjb25zdAor
eworICAgIGlmIChtX2ZvbnQudXNlR0RJKCkpIHsKKyAgICAgICAgSERDIGhkYyA9IEdldERDKDAp
OworICAgICAgICBIR0RJT0JKIG9sZEZvbnQgPSBTZWxlY3RPYmplY3QoaGRjLCBtX2ZvbnQuaGZv
bnQoKSk7CisgICAgICAgIGludCB3aWR0aDsKKyAgICAgICAgR2V0Q2hhcldpZHRoSShoZGMsIGds
eXBoLCAxLCAwLCAmd2lkdGgpOworICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBvbGRGb250KTsK
KyAgICAgICAgUmVsZWFzZURDKDAsIGhkYyk7CisgICAgICAgIHJldHVybiB3aWR0aDsKKyAgICB9
CisKKyAgICAvLyBGSVhNRTogRmxlc2ggb3V0IHdpdGggQ2Fpcm8vd2luMzIgZm9udCBpbXBsZW1l
bnRhdGlvbgorICAgIG5vdEltcGxlbWVudGVkKCk7CisKKyAgICByZXR1cm4gMDsKK30KKworfQpJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERhdGFXaW4uY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnRE
YXRhV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbi9TaW1wbGVGb250RGF0YVdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBA
CiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUgSW5jLiAg
QWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAt
NDgsMTE2ICs0OCwxNiBAQCB1c2luZyBzdGQ6Om1heDsKIAogY29uc3QgZmxvYXQgY1NtYWxsQ2Fw
c0ZvbnRTaXplTXVsdGlwbGllciA9IDAuN2Y7CiAKLXN0YXRpYyBib29sIHNob3VsZEFwcGx5TWFj
QXNjZW50SGFjazsKLQotc3RhdGljIGlubGluZSBmbG9hdCBzY2FsZUVtVG9Vbml0cyhmbG9hdCB4
LCB1bnNpZ25lZCB1bml0c1BlckVtKSB7IHJldHVybiB1bml0c1BlckVtID8geCAvIChmbG9hdCl1
bml0c1BlckVtIDogeDsgfQorc3RhdGljIGJvb2wgZ19zaG91bGRBcHBseU1hY0FzY2VudEhhY2s7
CiAKIHZvaWQgU2ltcGxlRm9udERhdGE6OnNldFNob3VsZEFwcGx5TWFjQXNjZW50SGFjayhib29s
IGIpCiB7Ci0gICAgc2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrID0gYjsKLX0KLQotdm9pZCBTaW1w
bGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKLXsgICAgCi0gICAgbV9zeW50aGV0aWNCb2xkT2Zm
c2V0ID0gbV9mb250LnN5bnRoZXRpY0JvbGQoKSA/IDEuMGYgOiAwLmY7Ci0gICAgbV9zY3JpcHRD
YWNoZSA9IDA7Ci0gICAgbV9zY3JpcHRGb250UHJvcGVydGllcyA9IDA7Ci0gICAgbV9pc1N5c3Rl
bUZvbnQgPSBmYWxzZTsKLSAgICAKLSAgICBpZiAobV9mb250LnVzZUdESSgpKSB7Ci0gICAgICAg
IEhEQyBoZGMgPSBHZXREQygwKTsKLSAgICAgICAgSEdESU9CSiBvbGRGb250ID0gU2VsZWN0T2Jq
ZWN0KGhkYywgbV9mb250Lmhmb250KCkpOwotICAgICAgICBPVVRMSU5FVEVYVE1FVFJJQyBtZXRy
aWNzOwotICAgICAgICBHZXRPdXRsaW5lVGV4dE1ldHJpY3MoaGRjLCBzaXplb2YobWV0cmljcyks
ICZtZXRyaWNzKTsKLSAgICAgICAgVEVYVE1FVFJJQyYgdGV4dE1ldHJpY3MgPSBtZXRyaWNzLm90
bVRleHRNZXRyaWNzOwotICAgICAgICBtX2FzY2VudCA9IHRleHRNZXRyaWNzLnRtQXNjZW50Owot
ICAgICAgICBtX2Rlc2NlbnQgPSB0ZXh0TWV0cmljcy50bURlc2NlbnQ7Ci0gICAgICAgIG1fbGlu
ZUdhcCA9IHRleHRNZXRyaWNzLnRtRXh0ZXJuYWxMZWFkaW5nOwotICAgICAgICBtX2xpbmVTcGFj
aW5nID0gbV9hc2NlbnQgKyBtX2Rlc2NlbnQgKyBtX2xpbmVHYXA7Ci0gICAgICAgIG1feEhlaWdo
dCA9IG1fYXNjZW50ICogMC41NmY7IC8vIEJlc3QgZ3Vlc3MgZm9yIHhIZWlnaHQgaWYgbm8geCBn
bHlwaCBpcyBwcmVzZW50LgotCi0gICAgICAgIEdMWVBITUVUUklDUyBnbTsKLSAgICAgICAgTUFU
MiBtYXQgPSB7IDEsIDAsIDAsIDEgfTsKLSAgICAgICAgRFdPUkQgbGVuID0gR2V0R2x5cGhPdXRs
aW5lKGhkYywgJ3gnLCBHR09fTUVUUklDUywgJmdtLCAwLCAwLCAmbWF0KTsKLSAgICAgICAgaWYg
KGxlbiAhPSBHRElfRVJST1IgJiYgZ20uZ21wdEdseXBoT3JpZ2luLnkgPiAwKQotICAgICAgICAg
ICAgbV94SGVpZ2h0ID0gZ20uZ21wdEdseXBoT3JpZ2luLnk7Ci0KLSAgICAgICAgbV91bml0c1Bl
ckVtID0gbWV0cmljcy5vdG1FTVNxdWFyZTsKLQotICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBv
bGRGb250KTsKLSAgICAgICAgUmVsZWFzZURDKDAsIGhkYyk7Ci0KLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLQotICAgIENHRm9udFJlZiBmb250ID0gbV9mb250LmNnRm9udCgpOwotICAgIGludCBp
QXNjZW50ID0gQ0dGb250R2V0QXNjZW50KGZvbnQpOwotICAgIGludCBpRGVzY2VudCA9IENHRm9u
dEdldERlc2NlbnQoZm9udCk7Ci0gICAgaW50IGlMaW5lR2FwID0gQ0dGb250R2V0TGVhZGluZyhm
b250KTsKLSAgICBtX3VuaXRzUGVyRW0gPSBDR0ZvbnRHZXRVbml0c1BlckVtKGZvbnQpOwotICAg
IGZsb2F0IHBvaW50U2l6ZSA9IG1fZm9udC5zaXplKCk7Ci0gICAgZmxvYXQgZkFzY2VudCA9IHNj
YWxlRW1Ub1VuaXRzKGlBc2NlbnQsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7Ci0gICAgZmxv
YXQgZkRlc2NlbnQgPSAtc2NhbGVFbVRvVW5pdHMoaURlc2NlbnQsIG1fdW5pdHNQZXJFbSkgKiBw
b2ludFNpemU7Ci0gICAgZmxvYXQgZkxpbmVHYXAgPSBzY2FsZUVtVG9Vbml0cyhpTGluZUdhcCwg
bV91bml0c1BlckVtKSAqIHBvaW50U2l6ZTsKLQotICAgIGlmICghaXNDdXN0b21Gb250KCkpIHsK
LSAgICAgICAgSERDIGRjID0gR2V0REMoMCk7Ci0gICAgICAgIEhHRElPQkogb2xkRm9udCA9IFNl
bGVjdE9iamVjdChkYywgbV9mb250Lmhmb250KCkpOwotICAgICAgICBpbnQgZmFjZUxlbmd0aCA9
IEdldFRleHRGYWNlKGRjLCAwLCAwKTsKLSAgICAgICAgVmVjdG9yPFRDSEFSPiBmYWNlTmFtZShm
YWNlTGVuZ3RoKTsKLSAgICAgICAgR2V0VGV4dEZhY2UoZGMsIGZhY2VMZW5ndGgsIGZhY2VOYW1l
LmRhdGEoKSk7Ci0gICAgICAgIG1faXNTeXN0ZW1Gb250ID0gIV90Y3NjbXAoZmFjZU5hbWUuZGF0
YSgpLCBfVCgiTHVjaWRhIEdyYW5kZSIpKTsKLSAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBvbGRG
b250KTsKLSAgICAgICAgUmVsZWFzZURDKDAsIGRjKTsKLQotICAgICAgICBpZiAoc2hvdWxkQXBw
bHlNYWNBc2NlbnRIYWNrKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGNvZGUgY29tZXMgZnJvbSBG
b250RGF0YU1hYy5tbS4gV2Ugb25seSBldmVyIGRvIHRoaXMgd2hlbiBydW5uaW5nIHJlZ3Jlc3Np
b24gdGVzdHMgc28gdGhhdCBvdXIgbWV0cmljcyB3aWxsIG1hdGNoIE1hYy4KLQotICAgICAgICAg
ICAgLy8gV2UgbmVlZCB0byBhZGp1c3QgVGltZXMsIEhlbHZldGljYSwgYW5kIENvdXJpZXIgdG8g
Y2xvc2VseSBtYXRjaCB0aGUKLSAgICAgICAgICAgIC8vIHZlcnRpY2FsIG1ldHJpY3Mgb2YgdGhl
aXIgTWljcm9zb2Z0IGNvdW50ZXJwYXJ0cyB0aGF0IGFyZSB0aGUgZGUgZmFjdG8KLSAgICAgICAg
ICAgIC8vIHdlYiBzdGFuZGFyZC4gVGhlIEFwcEtpdCBhZGp1c3RtZW50IG9mIDIwJSBpcyB0b28g
YmlnIGFuZCBpcwotICAgICAgICAgICAgLy8gaW5jb3JyZWN0bHkgYWRkZWQgdG8gbGluZSBzcGFj
aW5nLCBzbyB3ZSB1c2UgYSAxNSUgYWRqdXN0bWVudCBpbnN0ZWFkCi0gICAgICAgICAgICAvLyBh
bmQgYWRkIGl0IHRvIHRoZSBhc2NlbnQuCi0gICAgICAgICAgICBpZiAoIV90Y3NjbXAoZmFjZU5h
bWUuZGF0YSgpLCBfVCgiVGltZXMiKSkgfHwgIV90Y3NjbXAoZmFjZU5hbWUuZGF0YSgpLCBfVCgi
SGVsdmV0aWNhIikpIHx8ICFfdGNzY21wKGZhY2VOYW1lLmRhdGEoKSwgX1QoIkNvdXJpZXIiKSkp
Ci0gICAgICAgICAgICAgICAgZkFzY2VudCArPSBmbG9vcmYoKChmQXNjZW50ICsgZkRlc2NlbnQp
ICogMC4xNWYpICsgMC41Zik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtX2FzY2VudCA9IGxy
b3VuZGYoZkFzY2VudCk7Ci0gICAgbV9kZXNjZW50ID0gbHJvdW5kZihmRGVzY2VudCk7Ci0gICAg
bV9saW5lR2FwID0gbHJvdW5kZihmTGluZUdhcCk7Ci0gICAgbV9saW5lU3BhY2luZyA9IG1fYXNj
ZW50ICsgbV9kZXNjZW50ICsgbV9saW5lR2FwOwotCi0gICAgLy8gTWVhc3VyZSB0aGUgYWN0dWFs
IGNoYXJhY3RlciAieCIsIGJlY2F1c2UgQXBwS2l0IHN5bnRoZXNpemVzIFggaGVpZ2h0IHJhdGhl
ciB0aGFuIGdldHRpbmcgaXQgZnJvbSB0aGUgZm9udC4KLSAgICAvLyBVbmZvcnR1bmF0ZWx5LCBO
U0ZvbnQgd2lsbCByb3VuZCB0aGlzIGZvciB1cyBzbyB3ZSBkb24ndCBxdWl0ZSBnZXQgdGhlIHJp
Z2h0IHZhbHVlLgotICAgIEdseXBoUGFnZSogZ2x5cGhQYWdlWmVybyA9IEdseXBoUGFnZVRyZWVO
b2RlOjpnZXRSb290Q2hpbGQodGhpcywgMCktPnBhZ2UoKTsKLSAgICBHbHlwaCB4R2x5cGggPSBn
bHlwaFBhZ2VaZXJvID8gZ2x5cGhQYWdlWmVyby0+Z2x5cGhEYXRhRm9yQ2hhcmFjdGVyKCd4Jyku
Z2x5cGggOiAwOwotICAgIGlmICh4R2x5cGgpIHsKLSAgICAgICAgQ0dSZWN0IHhCb3g7Ci0gICAg
ICAgIENHRm9udEdldEdseXBoQkJveGVzKGZvbnQsICZ4R2x5cGgsIDEsICZ4Qm94KTsKLSAgICAg
ICAgLy8gVXNlIHRoZSBtYXhpbXVtIG9mIGVpdGhlciB3aWR0aCBvciBoZWlnaHQgYmVjYXVzZSAi
eCIgaXMgbmVhcmx5IHNxdWFyZQotICAgICAgICAvLyBhbmQgd2ViIHBhZ2VzIHRoYXQgZm9vbGlz
aGx5IHVzZSB0aGlzIG1ldHJpYyBmb3Igd2lkdGggd2lsbCBiZSBsYWlkIG91dAotICAgICAgICAv
LyBwb29ybHkgaWYgd2UgcmV0dXJuIGFuIGFjY3VyYXRlIGhlaWdodC4gQ2xhc3NpYyBjYXNlIGlz
IFRpbWVzIDEzIHBvaW50LAotICAgICAgICAvLyB3aGljaCBoYXMgYW4gIngiIHRoYXQgaXMgN3g2
IHBpeGVscy4KLSAgICAgICAgbV94SGVpZ2h0ID0gc2NhbGVFbVRvVW5pdHMobWF4KENHUmVjdEdl
dE1heFgoeEJveCksIENHUmVjdEdldE1heFkoeEJveCkpLCBtX3VuaXRzUGVyRW0pICogcG9pbnRT
aXplOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBpWEhlaWdodCA9IENHRm9udEdldFhIZWln
aHQoZm9udCk7Ci0gICAgICAgIG1feEhlaWdodCA9IHNjYWxlRW1Ub1VuaXRzKGlYSGVpZ2h0LCBt
X3VuaXRzUGVyRW0pICogcG9pbnRTaXplOwotICAgIH0KKyAgICBnX3Nob3VsZEFwcGx5TWFjQXNj
ZW50SGFjayA9IGI7CiB9CiAKLXZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtRGVzdHJveSgp
Citib29sIFNpbXBsZUZvbnREYXRhOjpzaG91bGRBcHBseU1hY0FzY2VudEhhY2soKQogewotICAg
IGlmICghaXNDdXN0b21Gb250KCkpIHsKLSAgICAgICAgRGVsZXRlT2JqZWN0KG1fZm9udC5oZm9u
dCgpKTsKLSAgICAgICAgQ0dGb250UmVsZWFzZShtX2ZvbnQuY2dGb250KCkpOwotICAgIH0KLQot
ICAgIC8vIFdlIGRvbid0IGhhc2ggdGhpcyBvbiBXaW4zMiwgc28gaXQncyBlZmZlY3RpdmVseSBv
d25lZCBieSB1cy4KLSAgICBkZWxldGUgbV9zbWFsbENhcHNGb250RGF0YTsKLQotICAgIFNjcmlw
dEZyZWVDYWNoZSgmbV9zY3JpcHRDYWNoZSk7Ci0gICAgZGVsZXRlIG1fc2NyaXB0Rm9udFByb3Bl
cnRpZXM7CisgICAgcmV0dXJuIGdfc2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrOwogfQogCiBTaW1w
bGVGb250RGF0YSogU2ltcGxlRm9udERhdGE6OnNtYWxsQ2Fwc0ZvbnREYXRhKGNvbnN0IEZvbnRE
ZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uKSBjb25zdApAQCAtMjM3LDI4ICsxMzcsNiBAQCB2
b2lkIFNpbXBsZUZvbnREYXRhOjpkZXRlcm1pbmVQaXRjaCgpCiAgICAgUmVsZWFzZURDKDAsIGRj
KTsKIH0KIAotZmxvYXQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtV2lkdGhGb3JHbHlwaChHbHlw
aCBnbHlwaCkgY29uc3QKLXsKLSAgICBpZiAobV9mb250LnVzZUdESSgpKSB7Ci0gICAgICAgIEhE
QyBoZGMgPSBHZXREQygwKTsKLSAgICAgICAgSEdESU9CSiBvbGRGb250ID0gU2VsZWN0T2JqZWN0
KGhkYywgbV9mb250Lmhmb250KCkpOwotICAgICAgICBpbnQgd2lkdGg7Ci0gICAgICAgIEdldENo
YXJXaWR0aEkoaGRjLCBnbHlwaCwgMSwgMCwgJndpZHRoKTsKLSAgICAgICAgU2VsZWN0T2JqZWN0
KGhkYywgb2xkRm9udCk7Ci0gICAgICAgIFJlbGVhc2VEQygwLCBoZGMpOwotICAgICAgICByZXR1
cm4gd2lkdGg7Ci0gICAgfQotCi0gICAgQ0dGb250UmVmIGZvbnQgPSBtX2ZvbnQuY2dGb250KCk7
Ci0gICAgZmxvYXQgcG9pbnRTaXplID0gbV9mb250LnNpemUoKTsKLSAgICBDR1NpemUgYWR2YW5j
ZTsKLSAgICBDR0FmZmluZVRyYW5zZm9ybSBtID0gQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlU2NhbGUo
cG9pbnRTaXplLCBwb2ludFNpemUpOwotICAgIC8vIEZJWE1FOiBOZWVkIHRvIGFkZCByZWFsIHN1
cHBvcnQgZm9yIHByaW50ZXIgZm9udHMuCi0gICAgYm9vbCBpc1ByaW50ZXJGb250ID0gZmFsc2U7
Ci0gICAgd2tHZXRHbHlwaEFkdmFuY2VzKGZvbnQsIG0sIG1faXNTeXN0ZW1Gb250LCBpc1ByaW50
ZXJGb250LCBnbHlwaCwgYWR2YW5jZSk7Ci0gICAgcmV0dXJuIGFkdmFuY2Uud2lkdGggKyBtX3N5
bnRoZXRpY0JvbGRPZmZzZXQ7Ci19Ci0KIFNDUklQVF9GT05UUFJPUEVSVElFUyogU2ltcGxlRm9u
dERhdGE6OnNjcmlwdEZvbnRQcm9wZXJ0aWVzKCkgY29uc3QKIHsKICAgICBpZiAoIW1fc2NyaXB0
Rm9udFByb3BlcnRpZXMpIHsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNH
V2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFnSW1hZ2VDR1dp
bi5jcHAJKHJldmlzaW9uIDI5ODM0KQkoZnJvbSBXZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFnSW1h
Z2VXaW4uY3BwOjI5ODM0KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlQ0dXaW4u
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKyNpbmNsdWRlICJEcmFnSW1hZ2UuaCIKKworI2luY2x1ZGUgIkNhY2hlZElt
YWdlLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiSW1hZ2UuaCIK
KyNpbmNsdWRlICJSZXRhaW5QdHIuaCIKKworI2luY2x1ZGUgPENvcmVHcmFwaGljcy9Db3JlR3Jh
cGhpY3MuaD4KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgewor
CitJbnRTaXplIGRyYWdJbWFnZVNpemUoRHJhZ0ltYWdlUmVmIGltYWdlKQoreworICAgIGlmICgh
aW1hZ2UpCisgICAgICAgIHJldHVybiBJbnRTaXplKCk7CisgICAgQklUTUFQIGI7CisgICAgR2V0
T2JqZWN0KGltYWdlLCBzaXplb2YoQklUTUFQKSwgJmIpOworICAgIHJldHVybiBJbnRTaXplKGIu
Ym1XaWR0aCwgYi5ibUhlaWdodCk7Cit9CisKK3ZvaWQgZGVsZXRlRHJhZ0ltYWdlKERyYWdJbWFn
ZVJlZiBpbWFnZSkKK3sKKyAgICBpZiAoaW1hZ2UpCisgICAgICAgIDo6RGVsZXRlT2JqZWN0KGlt
YWdlKTsKK30KKworSEJJVE1BUCBhbGxvY0ltYWdlKEhEQyBkYywgSW50U2l6ZSBzaXplLCBDR0Nv
bnRleHRSZWYgKnRhcmdldFJlZikKK3sKKyAgICBIQklUTUFQIGhibXA7CisgICAgQklUTUFQSU5G
TyBibXBJbmZvID0gezB9OworICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpU2l6ZSA9IHNpemVvZihC
SVRNQVBJTkZPSEVBREVSKTsKKyAgICBibXBJbmZvLmJtaUhlYWRlci5iaVdpZHRoID0gc2l6ZS53
aWR0aCgpOworICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpSGVpZ2h0ID0gc2l6ZS5oZWlnaHQoKTsK
KyAgICBibXBJbmZvLmJtaUhlYWRlci5iaVBsYW5lcyA9IDE7CisgICAgYm1wSW5mby5ibWlIZWFk
ZXIuYmlCaXRDb3VudCA9IDMyOworICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpQ29tcHJlc3Npb24g
PSBCSV9SR0I7CisgICAgTFBWT0lEIGJpdHM7CisgICAgaGJtcCA9IENyZWF0ZURJQlNlY3Rpb24o
ZGMsICZibXBJbmZvLCBESUJfUkdCX0NPTE9SUywgJmJpdHMsIDAsIDApOworCisgICAgaWYgKCF0
YXJnZXRSZWYpCisgICAgICAgIHJldHVybiBoYm1wOworCisgICAgQ0dDb2xvclNwYWNlUmVmIGRl
dmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOworICAgIENHQ29udGV4dFJl
ZiBiaXRtYXBDb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGJpdHMsIGJtcEluZm8uYm1p
SGVhZGVyLmJpV2lkdGgsIGJtcEluZm8uYm1pSGVhZGVyLmJpSGVpZ2h0LCA4LAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcEluZm8uYm1p
SGVhZGVyLmJpV2lkdGggKiA0LCBkZXZpY2VSR0IsIAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxl
IHwga0NHSW1hZ2VBbHBoYU5vbmVTa2lwRmlyc3QpOworICAgIENHQ29sb3JTcGFjZVJlbGVhc2Uo
ZGV2aWNlUkdCKTsKKyAgICBpZiAoIWJpdG1hcENvbnRleHQpIHsKKyAgICAgICAgRGVsZXRlT2Jq
ZWN0KGhibXApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAqdGFyZ2V0UmVmID0g
Yml0bWFwQ29udGV4dDsKKyAgICByZXR1cm4gaGJtcDsKK30KKworc3RhdGljIENHQ29udGV4dFJl
ZiBjcmVhdGVDZ0NvbnRleHRGcm9tQml0bWFwKEhCSVRNQVAgYml0bWFwKQoreworICAgIEJJVE1B
UCBpbmZvOworICAgIEdldE9iamVjdChiaXRtYXAsIHNpemVvZihpbmZvKSwgJmluZm8pOworICAg
IEFTU0VSVChpbmZvLmJtQml0c1BpeGVsID09IDMyKTsKKworICAgIENHQ29sb3JTcGFjZVJlZiBk
ZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKKyAgICBDR0NvbnRleHRS
ZWYgYml0bWFwQ29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZShpbmZvLmJtQml0cywgaW5m
by5ibVdpZHRoLCBpbmZvLmJtSGVpZ2h0LCA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uYm1XaWR0aEJ5dGVzLCBkZXZpY2VSR0Is
IGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwga0NHSW1hZ2VBbHBoYU5vbmVTa2lwRmlyc3Qp
OworICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKKyAgICByZXR1cm4gYml0bWFw
Q29udGV4dDsKK30KKworRHJhZ0ltYWdlUmVmIHNjYWxlRHJhZ0ltYWdlKERyYWdJbWFnZVJlZiBp
bWFnZSwgRmxvYXRTaXplIHNjYWxlKQoreworICAgIC8vIEZJWE1FOiBkdWUgdG8gdGhlIHdheSBk
cmFnIGltYWdlcyBhcmUgZG9uZSBvbiB3aW5kb3dzIHdlIG5lZWQgCisgICAgLy8gdG8gcHJlcHJv
Y2VzcyB0aGUgYWxwaGEgY2hhbm5lbCA8cmRhcjovL3Byb2JsZW0vNTAxNTk0Nj4KKworICAgIGlm
ICghaW1hZ2UpCisgICAgICAgIHJldHVybiAwOworICAgIENHQ29udGV4dFJlZiB0YXJnZXRDb250
ZXh0OworICAgIENHQ29udGV4dFJlZiBzcmNDb250ZXh0OworICAgIENHSW1hZ2VSZWYgc3JjSW1h
Z2U7CisgICAgSW50U2l6ZSBzcmNTaXplID0gZHJhZ0ltYWdlU2l6ZShpbWFnZSk7CisgICAgSW50
U2l6ZSBkc3RTaXplKChpbnQpKHNyY1NpemUud2lkdGgoKSAqIHNjYWxlLndpZHRoKCkpLCAoaW50
KShzcmNTaXplLmhlaWdodCgpICogc2NhbGUuaGVpZ2h0KCkpKTsKKyAgICBIQklUTUFQIGhibXAg
PSAwOworICAgIEhEQyBkYyA9IEdldERDKDApOworICAgIEhEQyBkc3REQyA9IENyZWF0ZUNvbXBh
dGlibGVEQyhkYyk7CisgICAgaWYgKCFkc3REQykKKyAgICAgICAgZ290byBleGl0OworCisgICAg
aGJtcCA9IGFsbG9jSW1hZ2UoZHN0REMsIGRzdFNpemUsICZ0YXJnZXRDb250ZXh0KTsKKyAgICBp
ZiAoIWhibXApCisgICAgICAgIGdvdG8gZXhpdDsKKworICAgIHNyY0NvbnRleHQgPSBjcmVhdGVD
Z0NvbnRleHRGcm9tQml0bWFwKGltYWdlKTsKKyAgICBzcmNJbWFnZSA9IENHQml0bWFwQ29udGV4
dENyZWF0ZUltYWdlKHNyY0NvbnRleHQpOworICAgIENHUmVjdCByZWN0OworICAgIHJlY3Qub3Jp
Z2luLnggPSAwOworICAgIHJlY3Qub3JpZ2luLnkgPSAwOworICAgIHJlY3Quc2l6ZSA9IGRzdFNp
emU7CisgICAgQ0dDb250ZXh0RHJhd0ltYWdlKHRhcmdldENvbnRleHQsIHJlY3QsIHNyY0ltYWdl
KTsKKyAgICBDR0ltYWdlUmVsZWFzZShzcmNJbWFnZSk7CisgICAgQ0dDb250ZXh0UmVsZWFzZShz
cmNDb250ZXh0KTsKKyAgICBDR0NvbnRleHRSZWxlYXNlKHRhcmdldENvbnRleHQpOworICAgIDo6
RGVsZXRlT2JqZWN0KGltYWdlKTsKKyAgICBpbWFnZSA9IDA7CisKK2V4aXQ6CisgICAgaWYgKCFo
Ym1wKQorICAgICAgICBoYm1wID0gaW1hZ2U7CisgICAgaWYgKGRzdERDKQorICAgICAgICBEZWxl
dGVEQyhkc3REQyk7CisgICAgUmVsZWFzZURDKDAsIGRjKTsKKyAgICByZXR1cm4gaGJtcDsKK30K
KyAgICAKK0RyYWdJbWFnZVJlZiBkaXNzb2x2ZURyYWdJbWFnZVRvRnJhY3Rpb24oRHJhZ0ltYWdl
UmVmIGltYWdlLCBmbG9hdCkKK3sKKyAgICAvL1dlIGRvbid0IGRvIHRoaXMgb24gd2luZG93cyBh
cyB0aGUgZHJhZ2ltYWdlIGlzIGJsZW5kZWQgYnkgdGhlIE9TCisgICAgcmV0dXJuIGltYWdlOwor
fQorICAgICAgICAKK0RyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2UoSW1hZ2Uq
IGltZykKK3sgICAgCisgICAgSEJJVE1BUCBoYm1wID0gMDsKKyAgICBIREMgZGMgPSBHZXREQygw
KTsKKyAgICBIREMgd29ya2luZ0RDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGRjKTsKKyAgICBDR0Nv
bnRleHRSZWYgZHJhd0NvbnRleHQgPSAwOworICAgIGlmICghd29ya2luZ0RDKQorICAgICAgICBn
b3RvIGV4aXQ7CisKKyAgICBoYm1wID0gYWxsb2NJbWFnZSh3b3JraW5nREMsIGltZy0+c2l6ZSgp
LCAmZHJhd0NvbnRleHQpOworCisgICAgaWYgKCFoYm1wKQorICAgICAgICBnb3RvIGV4aXQ7CisK
KyAgICBpZiAoIWRyYXdDb250ZXh0KSB7CisgICAgICAgIDo6RGVsZXRlT2JqZWN0KGhibXApOwor
ICAgICAgICBoYm1wID0gMDsKKyAgICB9CisKKyAgICBDR0ltYWdlUmVmIHNyY0ltYWdlID0gaW1n
LT5nZXRDR0ltYWdlUmVmKCk7CisgICAgQ0dSZWN0IHJlY3Q7CisgICAgcmVjdC5zaXplID0gaW1n
LT5zaXplKCk7CisgICAgcmVjdC5vcmlnaW4ueCA9IDA7CisgICAgcmVjdC5vcmlnaW4ueSA9IC1y
ZWN0LnNpemUuaGVpZ2h0OworICAgIHN0YXRpYyBjb25zdCBDR0Zsb2F0IHdoaXRlIFtdID0gezEu
MCwgMS4wLCAxLjAsIDEuMH07CisgICAgQ0dDb250ZXh0U2NhbGVDVE0oZHJhd0NvbnRleHQsIDEs
IC0xKTsKKyAgICBDR0NvbnRleHRTZXRGaWxsQ29sb3IoZHJhd0NvbnRleHQsIHdoaXRlKTsKKyAg
ICBDR0NvbnRleHRGaWxsUmVjdChkcmF3Q29udGV4dCwgcmVjdCk7CisgICAgQ0dDb250ZXh0U2V0
QmxlbmRNb2RlKGRyYXdDb250ZXh0LCBrQ0dCbGVuZE1vZGVOb3JtYWwpOworICAgIENHQ29udGV4
dERyYXdJbWFnZShkcmF3Q29udGV4dCwgcmVjdCwgc3JjSW1hZ2UpOworICAgIENHQ29udGV4dFJl
bGVhc2UoZHJhd0NvbnRleHQpOworCitleGl0OgorICAgIGlmICh3b3JraW5nREMpCisgICAgICAg
IERlbGV0ZURDKHdvcmtpbmdEQyk7CisgICAgUmVsZWFzZURDKDAsIGRjKTsKKyAgICByZXR1cm4g
aGJtcDsKK30KKyAgICAKK0RyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VJY29uRm9yQ2FjaGVk
SW1hZ2UoQ2FjaGVkSW1hZ2UqKQoreworICAgIC8vRklYTUU6IFByb3ZpZGUgaWNvbiBmb3IgaW1h
Z2UgdHlwZSA8cmRhcjovL3Byb2JsZW0vNTAxNTk0OT4KKyAgICByZXR1cm4gMDsgICAgIAorfQor
ICAgIAorfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlQ0dXaW4uY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNHV2luLmNwcAkocmV2
aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFnSW1hZ2VDR1dpbi5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA3
IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcs
IDIwMDggQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
ICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucwpAQCAtMzcsMjEgKzM3LDYgQEAKIAogbmFtZXNwYWNlIFdlYkNvcmUgewog
Ci1JbnRTaXplIGRyYWdJbWFnZVNpemUoRHJhZ0ltYWdlUmVmIGltYWdlKQotewotICAgIGlmICgh
aW1hZ2UpCi0gICAgICAgIHJldHVybiBJbnRTaXplKCk7Ci0gICAgQklUTUFQIGI7Ci0gICAgR2V0
T2JqZWN0KGltYWdlLCBzaXplb2YoQklUTUFQKSwgJmIpOwotICAgIHJldHVybiBJbnRTaXplKGIu
Ym1XaWR0aCwgYi5ibUhlaWdodCk7Ci19Ci0KLXZvaWQgZGVsZXRlRHJhZ0ltYWdlKERyYWdJbWFn
ZVJlZiBpbWFnZSkKLXsKLSAgICBpZiAoaW1hZ2UpCi0gICAgICAgIDo6RGVsZXRlT2JqZWN0KGlt
YWdlKTsKLX0KLQogSEJJVE1BUCBhbGxvY0ltYWdlKEhEQyBkYywgSW50U2l6ZSBzaXplLCBDR0Nv
bnRleHRSZWYgKnRhcmdldFJlZikKIHsKICAgICBIQklUTUFQIGhibXA7CkBAIC0xMDYsNyArOTEs
NyBAQCBEcmFnSW1hZ2VSZWYgc2NhbGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVmCiAgICAgQ0dDb250
ZXh0UmVmIHNyY0NvbnRleHQ7CiAgICAgQ0dJbWFnZVJlZiBzcmNJbWFnZTsKICAgICBJbnRTaXpl
IHNyY1NpemUgPSBkcmFnSW1hZ2VTaXplKGltYWdlKTsKLSAgICBJbnRTaXplIGRzdFNpemUoKGlu
dCkoc3JjU2l6ZS53aWR0aCgpICogc2NhbGUud2lkdGgoKSksIChpbnQpKHNyY1NpemUuaGVpZ2h0
KCkgKiBzY2FsZS5oZWlnaHQoKSkpOworICAgIEludFNpemUgZHN0U2l6ZShzdGF0aWNfY2FzdDxp
bnQ+KHNyY1NpemUud2lkdGgoKSAqIHNjYWxlLndpZHRoKCkpLCBzdGF0aWNfY2FzdDxpbnQ+KHNy
Y1NpemUuaGVpZ2h0KCkgKiBzY2FsZS5oZWlnaHQoKSkpOwogICAgIEhCSVRNQVAgaGJtcCA9IDA7
CiAgICAgSERDIGRjID0gR2V0REMoMCk7CiAgICAgSERDIGRzdERDID0gQ3JlYXRlQ29tcGF0aWJs
ZURDKGRjKTsKQEAgLTEzOSwxNCArMTI0LDggQEAgZXhpdDoKICAgICByZXR1cm4gaGJtcDsKIH0K
ICAgICAKLURyYWdJbWFnZVJlZiBkaXNzb2x2ZURyYWdJbWFnZVRvRnJhY3Rpb24oRHJhZ0ltYWdl
UmVmIGltYWdlLCBmbG9hdCkKLXsKLSAgICAvL1dlIGRvbid0IGRvIHRoaXMgb24gd2luZG93cyBh
cyB0aGUgZHJhZ2ltYWdlIGlzIGJsZW5kZWQgYnkgdGhlIE9TCi0gICAgcmV0dXJuIGltYWdlOwot
fQotICAgICAgICAKIERyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2UoSW1hZ2Uq
IGltZykKLXsgICAgCit7CiAgICAgSEJJVE1BUCBoYm1wID0gMDsKICAgICBIREMgZGMgPSBHZXRE
QygwKTsKICAgICBIREMgd29ya2luZ0RDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGRjKTsKQEAgLTE4
NCwxMCArMTYzLDQgQEAgZXhpdDoKICAgICByZXR1cm4gaGJtcDsKIH0KICAgICAKLURyYWdJbWFn
ZVJlZiBjcmVhdGVEcmFnSW1hZ2VJY29uRm9yQ2FjaGVkSW1hZ2UoQ2FjaGVkSW1hZ2UqKQotewot
ICAgIC8vRklYTUU6IFByb3ZpZGUgaWNvbiBmb3IgaW1hZ2UgdHlwZSA8cmRhcjovL3Byb2JsZW0v
NTAxNTk0OT4KLSAgICByZXR1cm4gMDsgICAgIAotfQotICAgIAogfQpJbmRleDogV2ViQ29yZS9w
bGF0Zm9ybS93aW4vRHJhZ0ltYWdlQ2Fpcm9XaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
cGxhdGZvcm0vd2luL0RyYWdJbWFnZUNhaXJvV2luLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNv
cmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNhaXJvV2luLmNwcAkocmV2aXNpb24gMCkKQEAgLTAs
MCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBcHBsZSBJbmMuICBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRHJh
Z0ltYWdlLmgiCisKKyNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgorI2luY2x1ZGUgIkdyYXBoaWNz
Q29udGV4dC5oIgorI2luY2x1ZGUgIkltYWdlLmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQu
aCIKKyNpbmNsdWRlICJSZXRhaW5QdHIuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworCitEcmFnSW1hZ2VSZWYgc2NhbGVEcmFnSW1hZ2UoRHJhZ0ltYWdl
UmVmIGltYWdlLCBGbG9hdFNpemUgc2NhbGUpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKwor
ICAgIHJldHVybiBpbWFnZTsKK30KKyAgICAKK0RyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VG
cm9tSW1hZ2UoSW1hZ2UqIGltZykKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworCisgICAgRHJh
Z0ltYWdlUmVmIHRlbXA7CisgICAgcmV0dXJuIHRlbXA7Cit9CisgICAgCit9CkluZGV4OiBXZWJD
b3JlL3BsYXRmb3JtL3dpbi9EcmFnSW1hZ2VXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
cGxhdGZvcm0vd2luL0RyYWdJbWFnZVdpbi5jcHAJKHJldmlzaW9uIDI5ODM0KQorKysgV2ViQ29y
ZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsx
LDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBBcHBsZSBJbmMuICBBbGwgcmln
aHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0zMSw4ICsz
MSw2IEBACiAjaW5jbHVkZSAiSW1hZ2UuaCIKICNpbmNsdWRlICJSZXRhaW5QdHIuaCIKIAotI2lu
Y2x1ZGUgPENvcmVHcmFwaGljcy9Db3JlR3JhcGhpY3MuaD4KLQogI2luY2x1ZGUgPHdpbmRvd3Mu
aD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewpAQCAtNTIsMTM4ICs1MCwxMiBAQCB2b2lkIGRlbGV0
ZURyYWdJbWFnZShEcmFnSW1hZ2VSZWYgaW1hZ2UpCiAgICAgICAgIDo6RGVsZXRlT2JqZWN0KGlt
YWdlKTsKIH0KIAotSEJJVE1BUCBhbGxvY0ltYWdlKEhEQyBkYywgSW50U2l6ZSBzaXplLCBDR0Nv
bnRleHRSZWYgKnRhcmdldFJlZikKLXsKLSAgICBIQklUTUFQIGhibXA7Ci0gICAgQklUTUFQSU5G
TyBibXBJbmZvID0gezB9OwotICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpU2l6ZSA9IHNpemVvZihC
SVRNQVBJTkZPSEVBREVSKTsKLSAgICBibXBJbmZvLmJtaUhlYWRlci5iaVdpZHRoID0gc2l6ZS53
aWR0aCgpOwotICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpSGVpZ2h0ID0gc2l6ZS5oZWlnaHQoKTsK
LSAgICBibXBJbmZvLmJtaUhlYWRlci5iaVBsYW5lcyA9IDE7Ci0gICAgYm1wSW5mby5ibWlIZWFk
ZXIuYmlCaXRDb3VudCA9IDMyOwotICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpQ29tcHJlc3Npb24g
PSBCSV9SR0I7Ci0gICAgTFBWT0lEIGJpdHM7Ci0gICAgaGJtcCA9IENyZWF0ZURJQlNlY3Rpb24o
ZGMsICZibXBJbmZvLCBESUJfUkdCX0NPTE9SUywgJmJpdHMsIDAsIDApOwotCi0gICAgaWYgKCF0
YXJnZXRSZWYpCi0gICAgICAgIHJldHVybiBoYm1wOwotCi0gICAgQ0dDb2xvclNwYWNlUmVmIGRl
dmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwotICAgIENHQ29udGV4dFJl
ZiBiaXRtYXBDb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGJpdHMsIGJtcEluZm8uYm1p
SGVhZGVyLmJpV2lkdGgsIGJtcEluZm8uYm1pSGVhZGVyLmJpSGVpZ2h0LCA4LAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcEluZm8uYm1p
SGVhZGVyLmJpV2lkdGggKiA0LCBkZXZpY2VSR0IsIAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxl
IHwga0NHSW1hZ2VBbHBoYU5vbmVTa2lwRmlyc3QpOwotICAgIENHQ29sb3JTcGFjZVJlbGVhc2Uo
ZGV2aWNlUkdCKTsKLSAgICBpZiAoIWJpdG1hcENvbnRleHQpIHsKLSAgICAgICAgRGVsZXRlT2Jq
ZWN0KGhibXApOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAqdGFyZ2V0UmVmID0g
Yml0bWFwQ29udGV4dDsKLSAgICByZXR1cm4gaGJtcDsKLX0KLQotc3RhdGljIENHQ29udGV4dFJl
ZiBjcmVhdGVDZ0NvbnRleHRGcm9tQml0bWFwKEhCSVRNQVAgYml0bWFwKQotewotICAgIEJJVE1B
UCBpbmZvOwotICAgIEdldE9iamVjdChiaXRtYXAsIHNpemVvZihpbmZvKSwgJmluZm8pOwotICAg
IEFTU0VSVChpbmZvLmJtQml0c1BpeGVsID09IDMyKTsKLQotICAgIENHQ29sb3JTcGFjZVJlZiBk
ZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKLSAgICBDR0NvbnRleHRS
ZWYgYml0bWFwQ29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZShpbmZvLmJtQml0cywgaW5m
by5ibVdpZHRoLCBpbmZvLmJtSGVpZ2h0LCA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uYm1XaWR0aEJ5dGVzLCBkZXZpY2VSR0Is
IGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwga0NHSW1hZ2VBbHBoYU5vbmVTa2lwRmlyc3Qp
OwotICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKLSAgICByZXR1cm4gYml0bWFw
Q29udGV4dDsKLX0KLQotRHJhZ0ltYWdlUmVmIHNjYWxlRHJhZ0ltYWdlKERyYWdJbWFnZVJlZiBp
bWFnZSwgRmxvYXRTaXplIHNjYWxlKQotewotICAgIC8vIEZJWE1FOiBkdWUgdG8gdGhlIHdheSBk
cmFnIGltYWdlcyBhcmUgZG9uZSBvbiB3aW5kb3dzIHdlIG5lZWQgCi0gICAgLy8gdG8gcHJlcHJv
Y2VzcyB0aGUgYWxwaGEgY2hhbm5lbCA8cmRhcjovL3Byb2JsZW0vNTAxNTk0Nj4KLQotICAgIGlm
ICghaW1hZ2UpCi0gICAgICAgIHJldHVybiAwOwotICAgIENHQ29udGV4dFJlZiB0YXJnZXRDb250
ZXh0OwotICAgIENHQ29udGV4dFJlZiBzcmNDb250ZXh0OwotICAgIENHSW1hZ2VSZWYgc3JjSW1h
Z2U7Ci0gICAgSW50U2l6ZSBzcmNTaXplID0gZHJhZ0ltYWdlU2l6ZShpbWFnZSk7Ci0gICAgSW50
U2l6ZSBkc3RTaXplKChpbnQpKHNyY1NpemUud2lkdGgoKSAqIHNjYWxlLndpZHRoKCkpLCAoaW50
KShzcmNTaXplLmhlaWdodCgpICogc2NhbGUuaGVpZ2h0KCkpKTsKLSAgICBIQklUTUFQIGhibXAg
PSAwOwotICAgIEhEQyBkYyA9IEdldERDKDApOwotICAgIEhEQyBkc3REQyA9IENyZWF0ZUNvbXBh
dGlibGVEQyhkYyk7Ci0gICAgaWYgKCFkc3REQykKLSAgICAgICAgZ290byBleGl0OwotCi0gICAg
aGJtcCA9IGFsbG9jSW1hZ2UoZHN0REMsIGRzdFNpemUsICZ0YXJnZXRDb250ZXh0KTsKLSAgICBp
ZiAoIWhibXApCi0gICAgICAgIGdvdG8gZXhpdDsKLQotICAgIHNyY0NvbnRleHQgPSBjcmVhdGVD
Z0NvbnRleHRGcm9tQml0bWFwKGltYWdlKTsKLSAgICBzcmNJbWFnZSA9IENHQml0bWFwQ29udGV4
dENyZWF0ZUltYWdlKHNyY0NvbnRleHQpOwotICAgIENHUmVjdCByZWN0OwotICAgIHJlY3Qub3Jp
Z2luLnggPSAwOwotICAgIHJlY3Qub3JpZ2luLnkgPSAwOwotICAgIHJlY3Quc2l6ZSA9IGRzdFNp
emU7Ci0gICAgQ0dDb250ZXh0RHJhd0ltYWdlKHRhcmdldENvbnRleHQsIHJlY3QsIHNyY0ltYWdl
KTsKLSAgICBDR0ltYWdlUmVsZWFzZShzcmNJbWFnZSk7Ci0gICAgQ0dDb250ZXh0UmVsZWFzZShz
cmNDb250ZXh0KTsKLSAgICBDR0NvbnRleHRSZWxlYXNlKHRhcmdldENvbnRleHQpOwotICAgIDo6
RGVsZXRlT2JqZWN0KGltYWdlKTsKLSAgICBpbWFnZSA9IDA7Ci0KLWV4aXQ6Ci0gICAgaWYgKCFo
Ym1wKQotICAgICAgICBoYm1wID0gaW1hZ2U7Ci0gICAgaWYgKGRzdERDKQotICAgICAgICBEZWxl
dGVEQyhkc3REQyk7Ci0gICAgUmVsZWFzZURDKDAsIGRjKTsKLSAgICByZXR1cm4gaGJtcDsKLX0K
LSAgICAKIERyYWdJbWFnZVJlZiBkaXNzb2x2ZURyYWdJbWFnZVRvRnJhY3Rpb24oRHJhZ0ltYWdl
UmVmIGltYWdlLCBmbG9hdCkKIHsKICAgICAvL1dlIGRvbid0IGRvIHRoaXMgb24gd2luZG93cyBh
cyB0aGUgZHJhZ2ltYWdlIGlzIGJsZW5kZWQgYnkgdGhlIE9TCiAgICAgcmV0dXJuIGltYWdlOwog
fQogICAgICAgICAKLURyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2UoSW1hZ2Uq
IGltZykKLXsgICAgCi0gICAgSEJJVE1BUCBoYm1wID0gMDsKLSAgICBIREMgZGMgPSBHZXREQygw
KTsKLSAgICBIREMgd29ya2luZ0RDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGRjKTsKLSAgICBDR0Nv
bnRleHRSZWYgZHJhd0NvbnRleHQgPSAwOwotICAgIGlmICghd29ya2luZ0RDKQotICAgICAgICBn
b3RvIGV4aXQ7Ci0KLSAgICBoYm1wID0gYWxsb2NJbWFnZSh3b3JraW5nREMsIGltZy0+c2l6ZSgp
LCAmZHJhd0NvbnRleHQpOwotCi0gICAgaWYgKCFoYm1wKQotICAgICAgICBnb3RvIGV4aXQ7Ci0K
LSAgICBpZiAoIWRyYXdDb250ZXh0KSB7Ci0gICAgICAgIDo6RGVsZXRlT2JqZWN0KGhibXApOwot
ICAgICAgICBoYm1wID0gMDsKLSAgICB9Ci0KLSAgICBDR0ltYWdlUmVmIHNyY0ltYWdlID0gaW1n
LT5nZXRDR0ltYWdlUmVmKCk7Ci0gICAgQ0dSZWN0IHJlY3Q7Ci0gICAgcmVjdC5zaXplID0gaW1n
LT5zaXplKCk7Ci0gICAgcmVjdC5vcmlnaW4ueCA9IDA7Ci0gICAgcmVjdC5vcmlnaW4ueSA9IC1y
ZWN0LnNpemUuaGVpZ2h0OwotICAgIHN0YXRpYyBjb25zdCBDR0Zsb2F0IHdoaXRlIFtdID0gezEu
MCwgMS4wLCAxLjAsIDEuMH07Ci0gICAgQ0dDb250ZXh0U2NhbGVDVE0oZHJhd0NvbnRleHQsIDEs
IC0xKTsKLSAgICBDR0NvbnRleHRTZXRGaWxsQ29sb3IoZHJhd0NvbnRleHQsIHdoaXRlKTsKLSAg
ICBDR0NvbnRleHRGaWxsUmVjdChkcmF3Q29udGV4dCwgcmVjdCk7Ci0gICAgQ0dDb250ZXh0U2V0
QmxlbmRNb2RlKGRyYXdDb250ZXh0LCBrQ0dCbGVuZE1vZGVOb3JtYWwpOwotICAgIENHQ29udGV4
dERyYXdJbWFnZShkcmF3Q29udGV4dCwgcmVjdCwgc3JjSW1hZ2UpOwotICAgIENHQ29udGV4dFJl
bGVhc2UoZHJhd0NvbnRleHQpOwotCi1leGl0OgotICAgIGlmICh3b3JraW5nREMpCi0gICAgICAg
IERlbGV0ZURDKHdvcmtpbmdEQyk7Ci0gICAgUmVsZWFzZURDKDAsIGRjKTsKLSAgICByZXR1cm4g
aGJtcDsKLX0KLSAgICAKIERyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VJY29uRm9yQ2FjaGVk
SW1hZ2UoQ2FjaGVkSW1hZ2UqKQogewogICAgIC8vRklYTUU6IFByb3ZpZGUgaWNvbiBmb3IgaW1h
Z2UgdHlwZSA8cmRhcjovL3Byb2JsZW0vNTAxNTk0OT4K
</data>
<flag name="review"
          id="8260"
          type_id="1"
          status="+"
          setter="aroben"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>18975</attachid>
            <date>2008-02-06 16:08:55 -0800</date>
            <delta_ts>2008-02-06 17:42:42 -0800</delta_ts>
            <desc>Tenth revision to patch cleanly against today&apos;s SVN.</desc>
            <filename>webcore_win32.patch</filename>
            <type>text/plain</type>
            <size>209720</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAzMDA1MykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNzcgQEAKKzIwMDgtMDItMDYgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBnbWFp
bC5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
V0FSTklORzogTk8gVEVTVCBDQVNFUyBBRERFRCBPUiBDSEFOR0VECisKKyAgICAgICAgKiBXZWJD
b3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvajoKKyAgICAgICAgKiBicmlkZ2Uvd2luL0ZyYW1lQ0dX
aW4uY3BwOiBDb3BpZWQgZnJvbSBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVXaW4uY3BwLgorICAg
ICAgICAoV2ViQ29yZTo6aW1hZ2VGcm9tU2VsZWN0aW9uKToKKyAgICAgICAgKiBicmlkZ2Uvd2lu
L0ZyYW1lQ2Fpcm9XaW4uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OmltYWdlRnJvbVNl
bGVjdGlvbik6CisgICAgICAgICogYnJpZGdlL3dpbi9GcmFtZVdpbi5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpjb21wdXRlUGFnZVJlY3RzRm9yRnJhbWUpOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL1NpbXBsZUZvbnREYXRhLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2Fp
cm8vR3JhcGhpY3NDb250ZXh0Q2Fpcm8uY3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L2NhaXJvL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZUNhaXJvLmg6IENvcGllZCBmcm9t
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhpY3NDb250ZXh0Q2Fpcm8uY3Bw
LgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpHcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlOjp+R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6YmVnaW5U
cmFuc3BhcmVuY3lMYXllcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGU6OmVuZFRyYW5zcGFyZW5jeUxheWVyKToKKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHRDRy5jcHA6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQ6OnNhdmVQbGF0Zm9ybVN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dDo6cmVzdG9yZVBsYXRmb3JtU3RhdGUpOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL2NnL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZS5oOiBSZW1vdmVkLgorICAg
ICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2NnL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0
ZUNHLmg6IENvcGllZCBmcm9tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvR3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlLmguCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0ZvbnRDR1dpbi5jcHA6IENvcGllZCBmcm9tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0ZvbnRXaW4uY3BwLgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZHJhd0dseXBocyk6CisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDYWlyb1dpbi5jcHA6IEFkZGVkLgorICAg
ICAgICAoV2ViQ29yZTo6Rm9udDo6ZHJhd0dseXBocyk6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL0ZvbnRXaW4uY3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9H
cmFwaGljc0NvbnRleHRDR1dpbi5jcHA6IENvcGllZCBmcm9tIFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dFdpbi5jcHAuCisgICAgICAgIChXZWJDb3JlOjpDR0Nv
bnRleHRXaXRoSERDKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6aW5UcmFu
c3BhcmVuY3lMYXllcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmdldFdp
bmRvd3NDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6cmVsZWFz
ZVdpbmRvd3NDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dFBsYXRm
b3JtUHJpdmF0ZTo6c2NhbGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0UGxh
dGZvcm1Qcml2YXRlOjpyb3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlOjp0cmFuc2xhdGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlOjpjb25jYXRDVE0pOgorICAgICAgICAoV2ViQ29yZTo6c2V0
Q0dTdHJva2VDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmRyYXdM
aW5lRm9yTWlzc3BlbGxpbmdPckJhZEdyYW1tYXIpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBo
aWNzL3dpbi9HcmFwaGljc0NvbnRleHRDYWlyb1dpbi5jcHA6IEFkZGVkLgorICAgICAgICAoV2Vi
Q29yZTo6R3JhcGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRleHQpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0OjpnZXRXaW5kb3dzQ29udGV4dCk6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQ6OmluVHJhbnNwYXJlbmN5TGF5ZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0OjpyZWxlYXNlV2luZG93c0NvbnRleHQpOgorICAgICAgICAoV2Vi
Q29yZTo6R3JhcGhpY3NDb250ZXh0Ojpjb25jYXRDVE0pOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRXaW4uY3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL3dpbi9JbWFnZUNHV2luLmNwcDogQ29waWVkIGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW4vSW1hZ2VXaW4uY3BwLgorICAgICAgICAoV2ViQ29yZTo6Qml0bWFwSW1hZ2U6
OmdldEhCSVRNQVBPZlNpemUpOgorICAgICAgICAoV2ViQ29yZTo6Qml0bWFwSW1hZ2U6OmRyYXdG
cmFtZU1hdGNoaW5nU291cmNlU2l6ZSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0ltYWdlQ2Fpcm9XaW4uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdl
OjpnZXRIQklUTUFQT2ZTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdlOjpkcmF3
RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bi9JbWFnZVdpbi5jcHA6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZv
bnREYXRhQ0dXaW4uY3BwOiBDb3BpZWQgZnJvbSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bi9TaW1wbGVGb250RGF0YVdpbi5jcHAuCisgICAgICAgIChXZWJDb3JlOjpzY2FsZUVtVG9Vbml0
cyk6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KToKKyAg
ICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybVdpZHRoRm9yR2x5cGgpOgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNhaXJvV2luLmNw
cDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0
KToKKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3kpOgor
ICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnBsYXRmb3JtV2lkdGhGb3JHbHlwaCk6
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhV2luLmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpzZXRTaG91bGRBcHBseU1hY0FzY2Vu
dEhhY2spOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnNob3VsZEFwcGx5TWFj
QXNjZW50SGFjayk6CisgICAgICAgICogcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNHV2luLmNwcDog
Q29waWVkIGZyb20gV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlV2luLmNwcC4KKyAgICAg
ICAgKFdlYkNvcmU6OnNjYWxlRHJhZ0ltYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OmNyZWF0ZURy
YWdJbWFnZUZyb21JbWFnZSk6CisgICAgICAgICogcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNhaXJv
V2luLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpzY2FsZURyYWdJbWFnZSk6CisgICAg
ICAgIChXZWJDb3JlOjpjcmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2UpOgorICAgICAgICAqIHBsYXRm
b3JtL3dpbi9EcmFnSW1hZ2VXaW4uY3BwOgorCiAyMDA4LTAyLTA2ICBPbGl2ZXIgSHVudCAgPG9s
aXZlckBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChCdWlsZCBmaXgp
LgpJbmRleDogV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvago9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCShyZXZpc2lvbiAzMDA1
MykKKysrIFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHdvcmtpbmcgY29w
eSkKQEAgLTM0MTgsNiArMzQxOCwxMCBAQAogCQkJCQk+DQogCQkJCTwvRmlsZT4NCiAJCQkJPEZp
bGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cd2luXERyYWdJbWFnZUNHV2luLmNw
cCINCisJCQkJCT4NCisJCQkJPC9GaWxlPg0KKwkJCQk8RmlsZQ0KIAkJCQkJUmVsYXRpdmVQYXRo
PSIuLlxwbGF0Zm9ybVx3aW5cRHJhZ0ltYWdlV2luLmNwcCINCiAJCQkJCT4NCiAJCQkJPC9GaWxl
Pg0KQEAgLTM4NzYsNiArMzg4MCwxMCBAQAogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KIAkJCQkJ
PEZpbGUNCisJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxGb250
Q0dXaW4uY3BwIg0KKwkJCQkJCT4NCisJCQkJCTwvRmlsZT4NCisJCQkJCTxGaWxlDQogCQkJCQkJ
UmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1x3aW5cRm9udEN1c3RvbVBsYXRmb3Jt
RGF0YS5jcHAiDQogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KQEAgLTM5MzIsNiArMzk0MCwxMCBA
QAogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KIAkJCQkJPEZpbGUNCisJCQkJCQlSZWxhdGl2ZVBh
dGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxHcmFwaGljc0NvbnRleHRDR1dpbi5jcHAiDQor
CQkJCQkJPg0KKwkJCQkJPC9GaWxlPg0KKwkJCQkJPEZpbGUNCiAJCQkJCQlSZWxhdGl2ZVBhdGg9
Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxHcmFwaGljc0NvbnRleHRXaW4uY3BwIg0KIAkJCQkJ
CT4NCiAJCQkJCTwvRmlsZT4NCkBAIC0zOTQwLDYgKzM5NTIsMTAgQEAKIAkJCQkJCT4NCiAJCQkJ
CTwvRmlsZT4NCiAJCQkJCTxGaWxlDQorCQkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxn
cmFwaGljc1x3aW5cSW1hZ2VDR1dpbi5jcHAiDQorCQkJCQkJPg0KKwkJCQkJPC9GaWxlPg0KKwkJ
CQkJPEZpbGUNCiAJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxJ
bWFnZVdpbi5jcHAiDQogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KQEAgLTM5NjQsNiArMzk4MCwx
MCBAQAogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KIAkJCQkJPEZpbGUNCisJCQkJCQlSZWxhdGl2
ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxTaW1wbGVGb250RGF0YUNHV2luLmNwcCIN
CisJCQkJCQk+DQorCQkJCQk8L0ZpbGU+DQorCQkJCQk8RmlsZQ0KIAkJCQkJCVJlbGF0aXZlUGF0
aD0iLi5ccGxhdGZvcm1cZ3JhcGhpY3Ncd2luXFNpbXBsZUZvbnREYXRhV2luLmNwcCINCiAJCQkJ
CQk+DQogCQkJCQk8L0ZpbGU+DQpAQCAtNjQwOCw2ICs2NDI4LDEwIEBACiAJCQkJTmFtZT0id2lu
Ig0KIAkJCQk+DQogCQkJCTxGaWxlDQorCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGJyaWRnZVx3aW5c
RnJhbWVDR1dpbi5jcHAiDQorCQkJCQk+DQorCQkJCTwvRmlsZT4NCisJCQkJPEZpbGUNCiAJCQkJ
CVJlbGF0aXZlUGF0aD0iLi5cYnJpZGdlXHdpblxGcmFtZVdpbi5jcHAiDQogCQkJCQk+DQogCQkJ
CTwvRmlsZT4NCkluZGV4OiBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVDR1dpbi5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lQ0dXaW4uY3BwCShyZXZpc2lvbiAyOTgz
NCkJKGZyb20gV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lV2luLmNwcDoyOTgzNCkKKysrIFdlYkNv
cmUvYnJpZGdlL3dpbi9GcmFtZUNHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE5
NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJGcmFt
ZVdpbi5oIgorCisjaW5jbHVkZSA8d2luc29jazIuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisK
KyNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNp
bmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkVkaXRvckNsaWVudC5oIgorI2luY2x1ZGUg
IkZyYW1lTG9hZGVyLmgiCisjaW5jbHVkZSAiRnJhbWVMb2FkUmVxdWVzdC5oIgorI2luY2x1ZGUg
IkZyYW1lUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhUTUxJ
RnJhbWVFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCisjaW5jbHVkZSAiSFRNTFRh
YmxlQ2VsbEVsZW1lbnQuaCIKKyNpbmNsdWRlICJLZXlib2FyZEV2ZW50LmgiCisjaW5jbHVkZSAi
TlBfanNvYmplY3QuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlBh
Z2UuaCIKKyNpbmNsdWRlICJQbHVnaW4uaCIKKyNpbmNsdWRlICJQbHVnaW5EYXRhYmFzZS5oIgor
I2luY2x1ZGUgIlBsdWdpblZpZXcuaCIKKyNpbmNsdWRlICJSZWd1bGFyRXhwcmVzc2lvbi5oIgor
I2luY2x1ZGUgIlJlbmRlckZyYW1lLmgiCisjaW5jbHVkZSAiUmVuZGVyVGFibGVDZWxsLmgiCisj
aW5jbHVkZSAiUmVuZGVyVmlldy5oIgorI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlLmgiCisjaW5j
bHVkZSAiVGV4dFJlc291cmNlRGVjb2Rlci5oIgorI2luY2x1ZGUgImtqc19wcm94eS5oIgorI2lu
Y2x1ZGUgImtqc193aW5kb3cuaCIKKyNpbmNsdWRlICJucHJ1bnRpbWVfaW1wbC5oIgorI2luY2x1
ZGUgInJ1bnRpbWVfcm9vdC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1
ZGUgIlNldHRpbmdzLmgiCisKKyNpZiBQTEFURk9STShDRykKKyNpbmNsdWRlIDxDb3JlR3JhcGhp
Y3MvQ29yZUdyYXBoaWNzLmg+CisjZW5kaWYKKwordXNpbmcgc3RkOjptaW47Cit1c2luZyBuYW1l
c3BhY2UgS0pTOjpCaW5kaW5nczsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit1c2luZyBuYW1l
c3BhY2UgSFRNTE5hbWVzOworCit2b2lkIEZyYW1lOjpjbGVhclBsYXRmb3JtU2NyaXB0T2JqZWN0
cygpCit7Cit9CisKK0tKUzo6QmluZGluZ3M6Okluc3RhbmNlKiBGcmFtZTo6Y3JlYXRlU2NyaXB0
SW5zdGFuY2VGb3JXaWRnZXQoV2lkZ2V0KiB3aWRnZXQpCit7CisgICAgLy8gRklYTUU6IElkZWFs
bHkgd2UnZCBoYXZlIGFuIGlzUGx1Z2luVmlldygpIGhlcmUgYnV0IHdlIGNhbid0IGFkZCB0aGF0
IHRvIHRoZSBvcGVuIHNvdXJjZSB0cmVlIHJpZ2h0IG5vdy4KKyAgICBpZiAod2lkZ2V0LT5pc0Zy
YW1lVmlldygpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQ
bHVnaW5WaWV3Kj4od2lkZ2V0KS0+YmluZGluZ0luc3RhbmNlKCk7Cit9CisKKwordm9pZCBjb21w
dXRlUGFnZVJlY3RzRm9yRnJhbWUoRnJhbWUqIGZyYW1lLCBjb25zdCBJbnRSZWN0JiBwcmludFJl
Y3QsIGZsb2F0IGhlYWRlckhlaWdodCwgZmxvYXQgZm9vdGVySGVpZ2h0LCBmbG9hdCB1c2VyU2Nh
bGVGYWN0b3IsVmVjdG9yPEludFJlY3Q+JiBwYWdlcywgaW50JiBvdXRQYWdlSGVpZ2h0KQorewor
ICAgIEFTU0VSVChmcmFtZSk7CisKKyAgICBwYWdlcy5jbGVhcigpOworICAgIG91dFBhZ2VIZWln
aHQgPSAwOworCisgICAgaWYgKCFmcmFtZS0+ZG9jdW1lbnQoKSB8fCAhZnJhbWUtPnZpZXcoKSB8
fCAhZnJhbWUtPmRvY3VtZW50KCktPnJlbmRlcmVyKCkpCisgICAgICAgIHJldHVybjsKKyAKKyAg
ICBSZW5kZXJWaWV3KiByb290ID0gc3RhdGljX2Nhc3Q8UmVuZGVyVmlldyAqPihmcmFtZS0+ZG9j
dW1lbnQoKS0+cmVuZGVyZXIoKSk7CisKKyAgICBpZiAoIXJvb3QpIHsKKyAgICAgICAgTE9HX0VS
Uk9SKCJkb2N1bWVudCB0byBiZSBwcmludGVkIGhhcyBubyByZW5kZXJlciIpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgaWYgKHVzZXJTY2FsZUZhY3RvciA8PSAwKSB7CisgICAgICAg
IExPR19FUlJPUigidXNlclNjYWxlRmFjdG9yIGhhcyBiYWQgdmFsdWUgJS4yZiIsIHVzZXJTY2Fs
ZUZhY3Rvcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgZmxvYXQgcmF0aW8g
PSAoZmxvYXQpcHJpbnRSZWN0LmhlaWdodCgpIC8gKGZsb2F0KXByaW50UmVjdC53aWR0aCgpOwor
IAorICAgIGZsb2F0IHBhZ2VXaWR0aCAgPSAoZmxvYXQpIHJvb3QtPmRvY1dpZHRoKCk7CisgICAg
ZmxvYXQgcGFnZUhlaWdodCA9IHBhZ2VXaWR0aCAqIHJhdGlvOworICAgIG91dFBhZ2VIZWlnaHQg
PSAoaW50KSBwYWdlSGVpZ2h0OyAgIC8vIHRoaXMgaXMgdGhlIGhlaWdodCBvZiB0aGUgcGFnZSBh
ZGp1c3RlZCBieSBtYXJnaW5zCisgICAgcGFnZUhlaWdodCAtPSAoaGVhZGVySGVpZ2h0ICsgZm9v
dGVySGVpZ2h0KTsKKworICAgIGlmIChwYWdlSGVpZ2h0IDw9IDApIHsKKyAgICAgICAgTE9HX0VS
Uk9SKCJwYWdlSGVpZ2h0IGhhcyBiYWQgdmFsdWUgJS4yZiIsIHBhZ2VIZWlnaHQpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgZmxvYXQgY3VyclBhZ2VIZWlnaHQgPSBwYWdlSGVpZ2h0
IC8gdXNlclNjYWxlRmFjdG9yOworICAgIGZsb2F0IGRvY0hlaWdodCAgICAgID0gcm9vdC0+bGF5
ZXIoKS0+aGVpZ2h0KCk7CisgICAgZmxvYXQgZG9jV2lkdGggICAgICAgPSByb290LT5sYXllcigp
LT53aWR0aCgpOworICAgIGZsb2F0IGN1cnJQYWdlV2lkdGggID0gcGFnZVdpZHRoIC8gdXNlclNj
YWxlRmFjdG9yOworCisgICAgCisgICAgLy8gYWx3YXlzIHJldHVybiBhdCBsZWFzdCBvbmUgcGFn
ZSwgc2luY2UgZW1wdHkgZmlsZXMgc2hvdWxkIHByaW50IGEgYmxhbmsgcGFnZQorICAgIGZsb2F0
IHByaW50ZWRQYWdlc0hlaWdodCA9IDAuMDsKKyAgICBkbyB7CisgICAgICAgIGZsb2F0IHByb3Bv
c2VkQm90dG9tID0gbWluKGRvY0hlaWdodCwgcHJpbnRlZFBhZ2VzSGVpZ2h0ICsgcGFnZUhlaWdo
dCk7CisgICAgICAgIGZyYW1lLT5hZGp1c3RQYWdlSGVpZ2h0KCZwcm9wb3NlZEJvdHRvbSwgcHJp
bnRlZFBhZ2VzSGVpZ2h0LCBwcm9wb3NlZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0KTsKKyAg
ICAgICAgY3VyclBhZ2VIZWlnaHQgPSBtYXgoMS4wZiwgcHJvcG9zZWRCb3R0b20gLSBwcmludGVk
UGFnZXNIZWlnaHQpOworICAgICAgIAorICAgICAgICBwYWdlcy5hcHBlbmQoSW50UmVjdCgwLHBy
aW50ZWRQYWdlc0hlaWdodCxjdXJyUGFnZVdpZHRoLGN1cnJQYWdlSGVpZ2h0KSk7CisgICAgICAg
IHByaW50ZWRQYWdlc0hlaWdodCArPSBjdXJyUGFnZUhlaWdodDsKKyAgICB9IHdoaWxlIChwcmlu
dGVkUGFnZXNIZWlnaHQgPCBkb2NIZWlnaHQpOworfQorCitzdGF0aWMgdm9pZCBkcmF3UmVjdElu
dG9Db250ZXh0KEludFJlY3QgcmVjdCwgRnJhbWVWaWV3KiB2aWV3LCBHcmFwaGljc0NvbnRleHQq
IGdjKQoreworICAgIEludFNpemUgb2Zmc2V0ID0gdmlldy0+c2Nyb2xsT2Zmc2V0KCk7CisgICAg
cmVjdC5tb3ZlKC1vZmZzZXQud2lkdGgoKSwgLW9mZnNldC5oZWlnaHQoKSk7CisgICAgcmVjdCA9
IHZpZXctPmNvbnZlcnRUb0NvbnRhaW5pbmdXaW5kb3cocmVjdCk7CisKKyAgICBnYy0+Y29uY2F0
Q1RNKEFmZmluZVRyYW5zZm9ybSgpLnRyYW5zbGF0ZSgtcmVjdC54KCksIC1yZWN0LnkoKSkpOwor
CisgICAgdmlldy0+cGFpbnQoZ2MsIHJlY3QpOworfQorCitIQklUTUFQIGltYWdlRnJvbVNlbGVj
dGlvbihGcmFtZSogZnJhbWUsIGJvb2wgZm9yY2VCbGFja1RleHQpCit7CisgICAgZnJhbWUtPnNl
dFBhaW50UmVzdHJpY3Rpb24oZm9yY2VCbGFja1RleHQgPyBQYWludFJlc3RyaWN0aW9uU2VsZWN0
aW9uT25seUJsYWNrVGV4dCA6IFBhaW50UmVzdHJpY3Rpb25TZWxlY3Rpb25Pbmx5KTsKKyAgICBG
bG9hdFJlY3QgZnIgPSBmcmFtZS0+c2VsZWN0aW9uUmVjdCgpOworICAgIEludFJlY3QgaXIoKGlu
dClmci54KCksIChpbnQpZnIueSgpLChpbnQpZnIud2lkdGgoKSwoaW50KWZyLmhlaWdodCgpKTsK
KworICAgIHZvaWQqIGJpdHM7CisgICAgSERDIGhkYyA9IENyZWF0ZUNvbXBhdGlibGVEQygwKTsK
KyAgICBpbnQgdyA9IGlyLndpZHRoKCk7CisgICAgaW50IGggPSBpci5oZWlnaHQoKTsKKyAgICBC
SVRNQVBJTkZPIGJtcCA9IHsgeyBzaXplb2YoQklUTUFQSU5GT0hFQURFUiksIHcsIGgsIDEsIDMy
IH0gfTsKKworICAgIEhCSVRNQVAgaGJtcCA9IENyZWF0ZURJQlNlY3Rpb24oMCwgJmJtcCwgRElC
X1JHQl9DT0xPUlMsICh2b2lkKiopJmJpdHMsIDAsIDApOworICAgIEhCSVRNQVAgaGJtcE9sZCA9
IChIQklUTUFQKVNlbGVjdE9iamVjdChoZGMsIGhibXApOworICAgIENHQ29sb3JTcGFjZVJlZiBk
ZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKKyAgICBDR0NvbnRleHRS
ZWYgY29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZSgodm9pZCopYml0cywgdywgaCwKKyAg
ICAgICAgOCwgdyAqIHNpemVvZihSR0JRVUFEKSwgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3Jk
ZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFQcmVtdWx0aXBsaWVkRmlyc3QpOworICAgIENHQ29s
b3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKKyAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNvbnRl
eHQpOworCisgICAgR3JhcGhpY3NDb250ZXh0IGdjKGNvbnRleHQpOworCisgICAgZnJhbWUtPmRv
Y3VtZW50KCktPnVwZGF0ZUxheW91dCgpOworICAgIGRyYXdSZWN0SW50b0NvbnRleHQoaXIsIGZy
YW1lLT52aWV3KCksICZnYyk7CisKKyAgICBDR0NvbnRleHRSZWxlYXNlKGNvbnRleHQpOworICAg
IFNlbGVjdE9iamVjdChoZGMsIGhibXBPbGQpOworICAgIERlbGV0ZURDKGhkYyk7CisKKyAgICBm
cmFtZS0+c2V0UGFpbnRSZXN0cmljdGlvbihQYWludFJlc3RyaWN0aW9uTm9uZSk7CisKKyAgICBy
ZXR1cm4gaGJtcDsKK30KKworRHJhZ0ltYWdlUmVmIEZyYW1lOjpkcmFnSW1hZ2VGb3JTZWxlY3Rp
b24oKQoreyAgICAKKyAgICBpZiAoc2VsZWN0aW9uQ29udHJvbGxlcigpLT5pc1JhbmdlKCkpCisg
ICAgICAgIHJldHVybiBpbWFnZUZyb21TZWxlY3Rpb24odGhpcywgZmFsc2UpOworCisgICAgcmV0
dXJuIDA7Cit9CisKK3ZvaWQgRnJhbWU6OmRhc2hib2FyZFJlZ2lvbnNDaGFuZ2VkKCkKK3sKK30K
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1l
Q0dXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZUNHV2luLmNw
cAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVDR1dpbi5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2
LCAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykg
MjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI2LDExNyArMjYsMTggQEAKICNpbmNsdWRlICJj
b25maWcuaCIKICNpbmNsdWRlICJGcmFtZVdpbi5oIgogCi0jaW5jbHVkZSA8d2luc29jazIuaD4K
ICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAKLSNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKLSNp
bmNsdWRlICJGbG9hdFJlY3QuaCIKLSNpbmNsdWRlICJEb2N1bWVudC5oIgotI2luY2x1ZGUgIkVk
aXRvckNsaWVudC5oIgotI2luY2x1ZGUgIkZyYW1lTG9hZGVyLmgiCi0jaW5jbHVkZSAiRnJhbWVM
b2FkUmVxdWVzdC5oIgotI2luY2x1ZGUgIkZyYW1lUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkZyYW1l
Vmlldy5oIgotI2luY2x1ZGUgIkhUTUxJRnJhbWVFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTE5h
bWVzLmgiCi0jaW5jbHVkZSAiSFRNTFRhYmxlQ2VsbEVsZW1lbnQuaCIKLSNpbmNsdWRlICJLZXli
b2FyZEV2ZW50LmgiCi0jaW5jbHVkZSAiTlBfanNvYmplY3QuaCIKLSNpbmNsdWRlICJOb3RJbXBs
ZW1lbnRlZC5oIgotI2luY2x1ZGUgIlBhZ2UuaCIKLSNpbmNsdWRlICJQbHVnaW4uaCIKLSNpbmNs
dWRlICJQbHVnaW5EYXRhYmFzZVdpbi5oIgotI2luY2x1ZGUgIlBsdWdpblZpZXdXaW4uaCIKLSNp
bmNsdWRlICJSZWd1bGFyRXhwcmVzc2lvbi5oIgotI2luY2x1ZGUgIlJlbmRlckZyYW1lLmgiCi0j
aW5jbHVkZSAiUmVuZGVyVGFibGVDZWxsLmgiCi0jaW5jbHVkZSAiUmVuZGVyVmlldy5oIgotI2lu
Y2x1ZGUgIlJlc291cmNlSGFuZGxlLmgiCi0jaW5jbHVkZSAiVGV4dFJlc291cmNlRGVjb2Rlci5o
IgotI2luY2x1ZGUgImtqc19wcm94eS5oIgotI2luY2x1ZGUgImtqc193aW5kb3cuaCIKLSNpbmNs
dWRlICJucHJ1bnRpbWVfaW1wbC5oIgotI2luY2x1ZGUgInJ1bnRpbWVfcm9vdC5oIgogI2luY2x1
ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2luY2x1ZGUgIlNldHRpbmdzLmgiCiAKLSNpZiBQTEFU
Rk9STShDRykKICNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ29yZUdyYXBoaWNzLmg+Ci0jZW5kaWYK
IAogdXNpbmcgc3RkOjptaW47Ci11c2luZyBuYW1lc3BhY2UgS0pTOjpCaW5kaW5nczsKIAogbmFt
ZXNwYWNlIFdlYkNvcmUgewogCi11c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwotCi12b2lkIEZy
YW1lOjpjbGVhclBsYXRmb3JtU2NyaXB0T2JqZWN0cygpCi17Ci19Ci0KLUtKUzo6QmluZGluZ3M6
Okluc3RhbmNlKiBGcmFtZTo6Y3JlYXRlU2NyaXB0SW5zdGFuY2VGb3JXaWRnZXQoV2lkZ2V0KiB3
aWRnZXQpCi17Ci0gICAgLy8gRklYTUU6IElkZWFsbHkgd2UnZCBoYXZlIGFuIGlzUGx1Z2luVmll
dygpIGhlcmUgYnV0IHdlIGNhbid0IGFkZCB0aGF0IHRvIHRoZSBvcGVuIHNvdXJjZSB0cmVlIHJp
Z2h0IG5vdy4KLSAgICBpZiAod2lkZ2V0LT5pc0ZyYW1lVmlldygpKQotICAgICAgICByZXR1cm4g
MDsKLQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQbHVnaW5WaWV3V2luKj4od2lkZ2V0KS0+Ymlu
ZGluZ0luc3RhbmNlKCk7Ci19Ci0KLQotdm9pZCBjb21wdXRlUGFnZVJlY3RzRm9yRnJhbWUoRnJh
bWUqIGZyYW1lLCBjb25zdCBJbnRSZWN0JiBwcmludFJlY3QsIGZsb2F0IGhlYWRlckhlaWdodCwg
ZmxvYXQgZm9vdGVySGVpZ2h0LCBmbG9hdCB1c2VyU2NhbGVGYWN0b3IsVmVjdG9yPEludFJlY3Q+
JiBwYWdlcywgaW50JiBvdXRQYWdlSGVpZ2h0KQotewotICAgIEFTU0VSVChmcmFtZSk7Ci0KLSAg
ICBwYWdlcy5jbGVhcigpOwotICAgIG91dFBhZ2VIZWlnaHQgPSAwOwotCi0gICAgaWYgKCFmcmFt
ZS0+ZG9jdW1lbnQoKSB8fCAhZnJhbWUtPnZpZXcoKSB8fCAhZnJhbWUtPmRvY3VtZW50KCktPnJl
bmRlcmVyKCkpCi0gICAgICAgIHJldHVybjsKLSAKLSAgICBSZW5kZXJWaWV3KiByb290ID0gc3Rh
dGljX2Nhc3Q8UmVuZGVyVmlldyAqPihmcmFtZS0+ZG9jdW1lbnQoKS0+cmVuZGVyZXIoKSk7Ci0K
LSAgICBpZiAoIXJvb3QpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJkb2N1bWVudCB0byBiZSBwcmlu
dGVkIGhhcyBubyByZW5kZXJlciIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYg
KHVzZXJTY2FsZUZhY3RvciA8PSAwKSB7Ci0gICAgICAgIExPR19FUlJPUigidXNlclNjYWxlRmFj
dG9yIGhhcyBiYWQgdmFsdWUgJS4yZiIsIHVzZXJTY2FsZUZhY3Rvcik7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0gICAgCi0gICAgZmxvYXQgcmF0aW8gPSAoZmxvYXQpcHJpbnRSZWN0LmhlaWdo
dCgpIC8gKGZsb2F0KXByaW50UmVjdC53aWR0aCgpOwotIAotICAgIGZsb2F0IHBhZ2VXaWR0aCAg
PSAoZmxvYXQpIHJvb3QtPmRvY1dpZHRoKCk7Ci0gICAgZmxvYXQgcGFnZUhlaWdodCA9IHBhZ2VX
aWR0aCAqIHJhdGlvOwotICAgIG91dFBhZ2VIZWlnaHQgPSAoaW50KSBwYWdlSGVpZ2h0OyAgIC8v
IHRoaXMgaXMgdGhlIGhlaWdodCBvZiB0aGUgcGFnZSBhZGp1c3RlZCBieSBtYXJnaW5zCi0gICAg
cGFnZUhlaWdodCAtPSAoaGVhZGVySGVpZ2h0ICsgZm9vdGVySGVpZ2h0KTsKLQotICAgIGlmIChw
YWdlSGVpZ2h0IDw9IDApIHsKLSAgICAgICAgTE9HX0VSUk9SKCJwYWdlSGVpZ2h0IGhhcyBiYWQg
dmFsdWUgJS4yZiIsIHBhZ2VIZWlnaHQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAg
ZmxvYXQgY3VyclBhZ2VIZWlnaHQgPSBwYWdlSGVpZ2h0IC8gdXNlclNjYWxlRmFjdG9yOwotICAg
IGZsb2F0IGRvY0hlaWdodCAgICAgID0gcm9vdC0+bGF5ZXIoKS0+aGVpZ2h0KCk7Ci0gICAgZmxv
YXQgZG9jV2lkdGggICAgICAgPSByb290LT5sYXllcigpLT53aWR0aCgpOwotICAgIGZsb2F0IGN1
cnJQYWdlV2lkdGggID0gcGFnZVdpZHRoIC8gdXNlclNjYWxlRmFjdG9yOwotCi0gICAgCi0gICAg
Ly8gYWx3YXlzIHJldHVybiBhdCBsZWFzdCBvbmUgcGFnZSwgc2luY2UgZW1wdHkgZmlsZXMgc2hv
dWxkIHByaW50IGEgYmxhbmsgcGFnZQotICAgIGZsb2F0IHByaW50ZWRQYWdlc0hlaWdodCA9IDAu
MDsKLSAgICBkbyB7Ci0gICAgICAgIGZsb2F0IHByb3Bvc2VkQm90dG9tID0gbWluKGRvY0hlaWdo
dCwgcHJpbnRlZFBhZ2VzSGVpZ2h0ICsgcGFnZUhlaWdodCk7Ci0gICAgICAgIGZyYW1lLT5hZGp1
c3RQYWdlSGVpZ2h0KCZwcm9wb3NlZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0LCBwcm9wb3Nl
ZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0KTsKLSAgICAgICAgY3VyclBhZ2VIZWlnaHQgPSBt
YXgoMS4wZiwgcHJvcG9zZWRCb3R0b20gLSBwcmludGVkUGFnZXNIZWlnaHQpOwotICAgICAgIAot
ICAgICAgICBwYWdlcy5hcHBlbmQoSW50UmVjdCgwLHByaW50ZWRQYWdlc0hlaWdodCxjdXJyUGFn
ZVdpZHRoLGN1cnJQYWdlSGVpZ2h0KSk7Ci0gICAgICAgIHByaW50ZWRQYWdlc0hlaWdodCArPSBj
dXJyUGFnZUhlaWdodDsKLSAgICB9IHdoaWxlIChwcmludGVkUGFnZXNIZWlnaHQgPCBkb2NIZWln
aHQpOwotfQotCiBzdGF0aWMgdm9pZCBkcmF3UmVjdEludG9Db250ZXh0KEludFJlY3QgcmVjdCwg
RnJhbWVWaWV3KiB2aWV3LCBHcmFwaGljc0NvbnRleHQqIGdjKQogewogICAgIEludFNpemUgb2Zm
c2V0ID0gdmlldy0+c2Nyb2xsT2Zmc2V0KCk7CkBAIC0xNTIsNyArNTMsOCBAQCBIQklUTUFQIGlt
YWdlRnJvbVNlbGVjdGlvbihGcmFtZSogZnJhbWUsCiB7CiAgICAgZnJhbWUtPnNldFBhaW50UmVz
dHJpY3Rpb24oZm9yY2VCbGFja1RleHQgPyBQYWludFJlc3RyaWN0aW9uU2VsZWN0aW9uT25seUJs
YWNrVGV4dCA6IFBhaW50UmVzdHJpY3Rpb25TZWxlY3Rpb25Pbmx5KTsKICAgICBGbG9hdFJlY3Qg
ZnIgPSBmcmFtZS0+c2VsZWN0aW9uUmVjdCgpOwotICAgIEludFJlY3QgaXIoKGludClmci54KCks
IChpbnQpZnIueSgpLChpbnQpZnIud2lkdGgoKSwoaW50KWZyLmhlaWdodCgpKTsKKyAgICBJbnRS
ZWN0IGlyKHN0YXRpY19jYXN0PGludD4oZnIueCgpKSwgc3RhdGljX2Nhc3Q8aW50Pihmci55KCkp
LAorICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pihmci53aWR0aCgpKSwgc3RhdGljX2Nh
c3Q8aW50Pihmci5oZWlnaHQoKSkpOwogCiAgICAgdm9pZCogYml0czsKICAgICBIREMgaGRjID0g
Q3JlYXRlQ29tcGF0aWJsZURDKDApOwpAQCAtMTYwLDEwICs2MiwxMCBAQCBIQklUTUFQIGltYWdl
RnJvbVNlbGVjdGlvbihGcmFtZSogZnJhbWUsCiAgICAgaW50IGggPSBpci5oZWlnaHQoKTsKICAg
ICBCSVRNQVBJTkZPIGJtcCA9IHsgeyBzaXplb2YoQklUTUFQSU5GT0hFQURFUiksIHcsIGgsIDEs
IDMyIH0gfTsKIAotICAgIEhCSVRNQVAgaGJtcCA9IENyZWF0ZURJQlNlY3Rpb24oMCwgJmJtcCwg
RElCX1JHQl9DT0xPUlMsICh2b2lkKiopJmJpdHMsIDAsIDApOwotICAgIEhCSVRNQVAgaGJtcE9s
ZCA9IChIQklUTUFQKVNlbGVjdE9iamVjdChoZGMsIGhibXApOworICAgIEhCSVRNQVAgaGJtcCA9
IENyZWF0ZURJQlNlY3Rpb24oMCwgJmJtcCwgRElCX1JHQl9DT0xPUlMsIHN0YXRpY19jYXN0PHZv
aWQqKj4oJmJpdHMpLCAwLCAwKTsKKyAgICBIQklUTUFQIGhibXBPbGQgPSBzdGF0aWNfY2FzdDxI
QklUTUFQPihTZWxlY3RPYmplY3QoaGRjLCBoYm1wKSk7CiAgICAgQ0dDb2xvclNwYWNlUmVmIGRl
dmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwotICAgIENHQ29udGV4dFJl
ZiBjb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKCh2b2lkKiliaXRzLCB3LCBoLAorICAg
IENHQ29udGV4dFJlZiBjb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKHN0YXRpY19jYXN0
PHZvaWQqPihiaXRzKSwgdywgaCwKICAgICAgICAgOCwgdyAqIHNpemVvZihSR0JRVUFEKSwgZGV2
aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFQcmVtdWx0
aXBsaWVkRmlyc3QpOwogICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKICAgICBD
R0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQpOwpAQCAtMTgyLDE2ICs4NCw0IEBAIEhCSVRNQVAg
aW1hZ2VGcm9tU2VsZWN0aW9uKEZyYW1lKiBmcmFtZSwKICAgICByZXR1cm4gaGJtcDsKIH0KIAot
RHJhZ0ltYWdlUmVmIEZyYW1lOjpkcmFnSW1hZ2VGb3JTZWxlY3Rpb24oKQoteyAgICAKLSAgICBp
ZiAoc2VsZWN0aW9uQ29udHJvbGxlcigpLT5pc1JhbmdlKCkpCi0gICAgICAgIHJldHVybiBpbWFn
ZUZyb21TZWxlY3Rpb24odGhpcywgZmFsc2UpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQg
RnJhbWU6OmRhc2hib2FyZFJlZ2lvbnNDaGFuZ2VkKCkKLXsKLX0KLQogfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQpJbmRleDogV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lQ2Fpcm9XaW4uY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZUNhaXJvV2luLmNwcAkocmV2aXNpb24g
MCkKKysrIFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZUNhaXJvV2luLmNwcAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJGcmFtZVdpbi5oIgorCisjaW5jbHVkZSAiRWRpdG9yQ2xpZW50LmgiCisjaW5jbHVkZSAiTm90
SW1wbGVtZW50ZWQuaCIKKwordXNpbmcgc3RkOjptaW47CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworSEJJVE1BUCBpbWFnZUZyb21TZWxlY3Rpb24oRnJhbWUqIGZyYW1lLCBib29sIGZvcmNlQmxh
Y2tUZXh0KQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZVdpbi5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lV2luLmNwcAkocmV2aXNp
b24gMzAwNDgpCisrKyBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVXaW4uY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcs
IDIwMDggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAog
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCkBAIC02MCwxMCArNjAsNiBAQAogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4
dC5oIgogI2luY2x1ZGUgIlNldHRpbmdzLmgiCiAKLSNpZiBQTEFURk9STShDRykKLSNpbmNsdWRl
IDxDb3JlR3JhcGhpY3MvQ29yZUdyYXBoaWNzLmg+Ci0jZW5kaWYKLQogdXNpbmcgc3RkOjptaW47
CiB1c2luZyBuYW1lc3BhY2UgS0pTOjpCaW5kaW5nczsKIApAQCAtODQsNyArODAsNiBAQCBLSlM6
OkJpbmRpbmdzOjpJbnN0YW5jZSogRnJhbWU6OmNyZWF0ZVNjCiAgICAgcmV0dXJuIHN0YXRpY19j
YXN0PFBsdWdpblZpZXcqPih3aWRnZXQpLT5iaW5kaW5nSW5zdGFuY2UoKTsKIH0KIAotCiB2b2lk
IGNvbXB1dGVQYWdlUmVjdHNGb3JGcmFtZShGcmFtZSogZnJhbWUsIGNvbnN0IEludFJlY3QmIHBy
aW50UmVjdCwgZmxvYXQgaGVhZGVySGVpZ2h0LCBmbG9hdCBmb290ZXJIZWlnaHQsIGZsb2F0IHVz
ZXJTY2FsZUZhY3RvcixWZWN0b3I8SW50UmVjdD4mIHBhZ2VzLCBpbnQmIG91dFBhZ2VIZWlnaHQp
CiB7CiAgICAgQVNTRVJUKGZyYW1lKTsKQEAgLTEwNywxMSArMTAyLDExIEBAIHZvaWQgY29tcHV0
ZVBhZ2VSZWN0c0ZvckZyYW1lKEZyYW1lKiBmcmEKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAg
ICAKLSAgICBmbG9hdCByYXRpbyA9IChmbG9hdClwcmludFJlY3QuaGVpZ2h0KCkgLyAoZmxvYXQp
cHJpbnRSZWN0LndpZHRoKCk7CisgICAgZmxvYXQgcmF0aW8gPSBzdGF0aWNfY2FzdDxmbG9hdD4o
cHJpbnRSZWN0LmhlaWdodCgpKSAvIHN0YXRpY19jYXN0PGZsb2F0PihwcmludFJlY3Qud2lkdGgo
KSk7CiAgCi0gICAgZmxvYXQgcGFnZVdpZHRoICA9IChmbG9hdCkgcm9vdC0+ZG9jV2lkdGgoKTsK
KyAgICBmbG9hdCBwYWdlV2lkdGggID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHJvb3QtPmRvY1dpZHRo
KCkpOwogICAgIGZsb2F0IHBhZ2VIZWlnaHQgPSBwYWdlV2lkdGggKiByYXRpbzsKLSAgICBvdXRQ
YWdlSGVpZ2h0ID0gKGludCkgcGFnZUhlaWdodDsgICAvLyB0aGlzIGlzIHRoZSBoZWlnaHQgb2Yg
dGhlIHBhZ2UgYWRqdXN0ZWQgYnkgbWFyZ2lucworICAgIG91dFBhZ2VIZWlnaHQgPSBzdGF0aWNf
Y2FzdDxpbnQ+KHBhZ2VIZWlnaHQpOyAgIC8vIHRoaXMgaXMgdGhlIGhlaWdodCBvZiB0aGUgcGFn
ZSBhZGp1c3RlZCBieSBtYXJnaW5zCiAgICAgcGFnZUhlaWdodCAtPSAoaGVhZGVySGVpZ2h0ICsg
Zm9vdGVySGVpZ2h0KTsKIAogICAgIGlmIChwYWdlSGVpZ2h0IDw9IDApIHsKQEAgLTEyNiw2MiAr
MTIxLDE3IEBAIHZvaWQgY29tcHV0ZVBhZ2VSZWN0c0ZvckZyYW1lKEZyYW1lKiBmcmEKIAogICAg
IAogICAgIC8vIGFsd2F5cyByZXR1cm4gYXQgbGVhc3Qgb25lIHBhZ2UsIHNpbmNlIGVtcHR5IGZp
bGVzIHNob3VsZCBwcmludCBhIGJsYW5rIHBhZ2UKLSAgICBmbG9hdCBwcmludGVkUGFnZXNIZWln
aHQgPSAwLjA7CisgICAgZmxvYXQgcHJpbnRlZFBhZ2VzSGVpZ2h0ID0gMC4wZjsKICAgICBkbyB7
CiAgICAgICAgIGZsb2F0IHByb3Bvc2VkQm90dG9tID0gbWluKGRvY0hlaWdodCwgcHJpbnRlZFBh
Z2VzSGVpZ2h0ICsgcGFnZUhlaWdodCk7CiAgICAgICAgIGZyYW1lLT5hZGp1c3RQYWdlSGVpZ2h0
KCZwcm9wb3NlZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0LCBwcm9wb3NlZEJvdHRvbSwgcHJp
bnRlZFBhZ2VzSGVpZ2h0KTsKICAgICAgICAgY3VyclBhZ2VIZWlnaHQgPSBtYXgoMS4wZiwgcHJv
cG9zZWRCb3R0b20gLSBwcmludGVkUGFnZXNIZWlnaHQpOwogICAgICAgIAotICAgICAgICBwYWdl
cy5hcHBlbmQoSW50UmVjdCgwLHByaW50ZWRQYWdlc0hlaWdodCxjdXJyUGFnZVdpZHRoLGN1cnJQ
YWdlSGVpZ2h0KSk7CisgICAgICAgIHBhZ2VzLmFwcGVuZChJbnRSZWN0KDAsIHByaW50ZWRQYWdl
c0hlaWdodCwgY3VyclBhZ2VXaWR0aCwgY3VyclBhZ2VIZWlnaHQpKTsKICAgICAgICAgcHJpbnRl
ZFBhZ2VzSGVpZ2h0ICs9IGN1cnJQYWdlSGVpZ2h0OwogICAgIH0gd2hpbGUgKHByaW50ZWRQYWdl
c0hlaWdodCA8IGRvY0hlaWdodCk7CiB9CiAKLXN0YXRpYyB2b2lkIGRyYXdSZWN0SW50b0NvbnRl
eHQoSW50UmVjdCByZWN0LCBGcmFtZVZpZXcqIHZpZXcsIEdyYXBoaWNzQ29udGV4dCogZ2MpCi17
Ci0gICAgSW50U2l6ZSBvZmZzZXQgPSB2aWV3LT5zY3JvbGxPZmZzZXQoKTsKLSAgICByZWN0Lm1v
dmUoLW9mZnNldC53aWR0aCgpLCAtb2Zmc2V0LmhlaWdodCgpKTsKLSAgICByZWN0ID0gdmlldy0+
Y29udmVydFRvQ29udGFpbmluZ1dpbmRvdyhyZWN0KTsKLQotICAgIGdjLT5jb25jYXRDVE0oQWZm
aW5lVHJhbnNmb3JtKCkudHJhbnNsYXRlKC1yZWN0LngoKSwgLXJlY3QueSgpKSk7Ci0KLSAgICB2
aWV3LT5wYWludChnYywgcmVjdCk7Ci19Ci0KLUhCSVRNQVAgaW1hZ2VGcm9tU2VsZWN0aW9uKEZy
YW1lKiBmcmFtZSwgYm9vbCBmb3JjZUJsYWNrVGV4dCkKLXsKLSAgICBmcmFtZS0+c2V0UGFpbnRS
ZXN0cmljdGlvbihmb3JjZUJsYWNrVGV4dCA/IFBhaW50UmVzdHJpY3Rpb25TZWxlY3Rpb25Pbmx5
QmxhY2tUZXh0IDogUGFpbnRSZXN0cmljdGlvblNlbGVjdGlvbk9ubHkpOwotICAgIEZsb2F0UmVj
dCBmciA9IGZyYW1lLT5zZWxlY3Rpb25SZWN0KCk7Ci0gICAgSW50UmVjdCBpcigoaW50KWZyLngo
KSwgKGludClmci55KCksKGludClmci53aWR0aCgpLChpbnQpZnIuaGVpZ2h0KCkpOwotCi0gICAg
dm9pZCogYml0czsKLSAgICBIREMgaGRjID0gQ3JlYXRlQ29tcGF0aWJsZURDKDApOwotICAgIGlu
dCB3ID0gaXIud2lkdGgoKTsKLSAgICBpbnQgaCA9IGlyLmhlaWdodCgpOwotICAgIEJJVE1BUElO
Rk8gYm1wID0geyB7IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSwgdywgaCwgMSwgMzIgfSB9Owot
Ci0gICAgSEJJVE1BUCBoYm1wID0gQ3JlYXRlRElCU2VjdGlvbigwLCAmYm1wLCBESUJfUkdCX0NP
TE9SUywgKHZvaWQqKikmYml0cywgMCwgMCk7Ci0gICAgSEJJVE1BUCBoYm1wT2xkID0gKEhCSVRN
QVApU2VsZWN0T2JqZWN0KGhkYywgaGJtcCk7Ci0gICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJH
QiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwotICAgIENHQ29udGV4dFJlZiBjb250
ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKCh2b2lkKiliaXRzLCB3LCBoLAotICAgICAgICA4
LCB3ICogc2l6ZW9mKFJHQlFVQUQpLCBkZXZpY2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0
dGxlIHwga0NHSW1hZ2VBbHBoYVByZW11bHRpcGxpZWRGaXJzdCk7Ci0gICAgQ0dDb2xvclNwYWNl
UmVsZWFzZShkZXZpY2VSR0IpOwotICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7Ci0K
LSAgICBHcmFwaGljc0NvbnRleHQgZ2MoY29udGV4dCk7Ci0KLSAgICBmcmFtZS0+ZG9jdW1lbnQo
KS0+dXBkYXRlTGF5b3V0KCk7Ci0gICAgZHJhd1JlY3RJbnRvQ29udGV4dChpciwgZnJhbWUtPnZp
ZXcoKSwgJmdjKTsKLQotICAgIENHQ29udGV4dFJlbGVhc2UoY29udGV4dCk7Ci0gICAgU2VsZWN0
T2JqZWN0KGhkYywgaGJtcE9sZCk7Ci0gICAgRGVsZXRlREMoaGRjKTsKLQotICAgIGZyYW1lLT5z
ZXRQYWludFJlc3RyaWN0aW9uKFBhaW50UmVzdHJpY3Rpb25Ob25lKTsKLQotICAgIHJldHVybiBo
Ym1wOwotfQotCiBEcmFnSW1hZ2VSZWYgRnJhbWU6OmRyYWdJbWFnZUZvclNlbGVjdGlvbigpCiB7
ICAgIAogICAgIGlmIChzZWxlY3Rpb25Db250cm9sbGVyKCktPmlzUmFuZ2UoKSkKSW5kZXg6IFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmgJKHJldmlzaW9uIDMwMDQ4
KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5oCSh3b3JraW5n
IGNvcHkpCkBAIC0xMDMsNiArMTAzLDcgQEAgcHVibGljOgogICAgIFNDUklQVF9DQUNIRSogc2Ny
aXB0Q2FjaGUoKSBjb25zdCB7IHJldHVybiAmbV9zY3JpcHRDYWNoZTsgfQogCiAgICAgc3RhdGlj
IHZvaWQgc2V0U2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrKGJvb2wpOworICAgIHN0YXRpYyBib29s
IHNob3VsZEFwcGx5TWFjQXNjZW50SGFjaygpOwogI2VuZGlmCiAKICNpZiBQTEFURk9STShHVEsp
CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4dENh
aXJvLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dy
YXBoaWNzQ29udGV4dENhaXJvLmNwcAkocmV2aXNpb24gMzAwNDgpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4dENhaXJvLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNDIsMTUgKzQyLDEzIEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDx3dGYv
TWF0aEV4dHJhcy5oPgogCi0jaWYgUExBVEZPUk0oV0lOKQotI2luY2x1ZGUgPGNhaXJvLXdpbjMy
Lmg+Ci0jZW5kaWYKLQogI2lmIFBMQVRGT1JNKEdUSykKICNpbmNsdWRlIDxnZGsvZ2RrLmg+CiAj
aW5jbHVkZSA8cGFuZ28vcGFuZ28uaD4KKyNlbGlmIFBMQVRGT1JNKFdJTikKKyNpbmNsdWRlIDxj
YWlyby13aW4zMi5oPgogI2VuZGlmCi0KKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHRQbGF0Zm9y
bVByaXZhdGVDYWlyby5oIgogCiAjaWZuZGVmIE1fUEkKICNkZWZpbmUgTV9QSSAzLjE0MTU5MjY1
MzU4OTc5MzIzODQ2CkBAIC01OCwxOSArNTYsNiBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAK
LWNsYXNzIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSB7Ci1wdWJsaWM6Ci0gICAgR3Jh
cGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKCk7Ci0gICAgfkdyYXBoaWNzQ29udGV4dFBsYXRm
b3JtUHJpdmF0ZSgpOwotCi0gICAgY2Fpcm9fdCogY3I7Ci0gICAgVmVjdG9yPGZsb2F0PiBsYXll
cnM7Ci0KLSNpZiBQTEFURk9STShHVEspCi0gICAgR2RrRXZlbnRFeHBvc2UqIGV4cG9zZTsKLSNl
bmRpZgotfTsKLQogc3RhdGljIGlubGluZSB2b2lkIHNldENvbG9yKGNhaXJvX3QqIGNyLCBjb25z
dCBDb2xvciYgY29sKQogewogICAgIGZsb2F0IHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhOwpAQCAt
ODcsMzQgKzcyLDYgQEAgc3RhdGljIGlubGluZSB2b2lkIGZpbGxSZWN0U291cmNlT3ZlcihjYQog
ICAgIGNhaXJvX2ZpbGwoY3IpOwogfQogCi1HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6
OkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpCi0gICAgOiAgY3IoMCkKLSNpZiBQTEFU
Rk9STShHVEspCi0gICAgLCBleHBvc2UoMCkKLSNlbmRpZgotewotfQotCi1HcmFwaGljc0NvbnRl
eHRQbGF0Zm9ybVByaXZhdGU6On5HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKQotewot
ICAgIGNhaXJvX2Rlc3Ryb3koY3IpOwotfQotCi0jaWYgUExBVEZPUk0oV0lOKQotR3JhcGhpY3ND
b250ZXh0OjpHcmFwaGljc0NvbnRleHQoSERDIGRjKQotICAgIDogbV9jb21tb24oY3JlYXRlR3Jh
cGhpY3NDb250ZXh0UHJpdmF0ZSgpKQotICAgICwgbV9kYXRhKG5ldyBHcmFwaGljc0NvbnRleHRQ
bGF0Zm9ybVByaXZhdGUpCi17Ci0gICAgaWYgKGRjKSB7Ci0gICAgICAgIGNhaXJvX3N1cmZhY2Vf
dCogc3VyZmFjZSA9IGNhaXJvX3dpbjMyX3N1cmZhY2VfY3JlYXRlKGRjKTsKLSAgICAgICAgbV9k
YXRhLT5jciA9IGNhaXJvX2NyZWF0ZShzdXJmYWNlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBz
ZXRQYWludGluZ0Rpc2FibGVkKHRydWUpOwotICAgICAgICBtX2RhdGEtPmNyID0gMDsKLSAgICB9
Ci19Ci0jZW5kaWYKLQogR3JhcGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRleHQoUGxhdGZvcm1H
cmFwaGljc0NvbnRleHQqIGNyKQogICAgIDogbV9jb21tb24oY3JlYXRlR3JhcGhpY3NDb250ZXh0
UHJpdmF0ZSgpKQogICAgICwgbV9kYXRhKG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZh
dGUpCkBAIC01ODYsNiArNTQzLDkgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFVSTEZvclJl
Y3QoY29ucwogICAgIG5vdEltcGxlbWVudGVkKCk7CiB9CiAKKyNpZiBQTEFURk9STShHVEspCisv
LyBGSVhNRTogIFRoaXMgc2hvdWxkIGJlIG1vdmVkIHRvIHNvbWV0aGluZyBsaWtlIEdyYXBoaWNz
Q29udGV4dENhaXJvR1RLLmNwcCwKKy8vIGFzIHRoZXJlIGlzIGEgV2luZG93cyBpbXBsZW1lbnRh
dGlvbiBpbiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0Q2Fpcm9XaW4uY3Bw
CiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYg
dHJhbnNmb3JtKQogewogICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCkBAIC01OTUsNiArNTU1
LDcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNvbmNhdENUTShjb25zdCBBZgogICAgIGNvbnN0
IGNhaXJvX21hdHJpeF90KiBtYXRyaXggPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNhaXJvX21h
dHJpeF90Kj4oJnRyYW5zZm9ybSk7CiAgICAgY2Fpcm9fdHJhbnNmb3JtKGNyLCBtYXRyaXgpOwog
fQorI2VuZGlmCiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjphZGRJbm5lclJvdW5kZWRSZWN0Q2xp
cChjb25zdCBJbnRSZWN0JiByZWN0LCBpbnQgdGhpY2tuZXNzKQogewpJbmRleDogV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jYWlyby9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVDYWly
by5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhp
Y3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlQ2Fpcm8uaAkocmV2aXNpb24gMjk3MjYpCShmcm9tIFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhpY3NDb250ZXh0Q2Fpcm8uY3BwOjI5
NzI2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9HcmFwaGljc0NvbnRleHRQ
bGF0Zm9ybVByaXZhdGVDYWlyby5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsOTMzIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFscCBUb2tlciA8YWxwQGF0b2tlci5j
b20+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBD
T01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENP
TVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4
dC5oIgorCisjaWYgUExBVEZPUk0oQ0FJUk8pCisKKyNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0u
aCIKKyNpbmNsdWRlICJDYWlyb1BhdGguaCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNs
dWRlICJGb250LmgiCisjaW5jbHVkZSAiSW50UmVjdC5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVu
dGVkLmgiCisjaW5jbHVkZSAiUGF0aC5oIgorI2luY2x1ZGUgIlNpbXBsZUZvbnREYXRhLmgiCisj
aW5jbHVkZSA8Y2Fpcm8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4K
KyNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgorCisjaWYgUExBVEZPUk0oV0lOKQorI2luY2x1
ZGUgPGNhaXJvLXdpbjMyLmg+CisjZW5kaWYKKworI2lmIFBMQVRGT1JNKEdUSykKKyNpbmNsdWRl
IDxnZGsvZ2RrLmg+CisjaW5jbHVkZSA8cGFuZ28vcGFuZ28uaD4KKyNlbmRpZgorCisKKyNpZm5k
ZWYgTV9QSQorI2RlZmluZSBNX1BJIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYKKyNlbmRpZgorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0
ZSB7CitwdWJsaWM6CisgICAgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKCk7CisgICAg
fkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpOworCisgICAgY2Fpcm9fdCogY3I7Cisg
ICAgVmVjdG9yPGZsb2F0PiBsYXllcnM7CisKKyNpZiBQTEFURk9STShHVEspCisgICAgR2RrRXZl
bnRFeHBvc2UqIGV4cG9zZTsKKyNlbmRpZgorfTsKKworc3RhdGljIGlubGluZSB2b2lkIHNldENv
bG9yKGNhaXJvX3QqIGNyLCBjb25zdCBDb2xvciYgY29sKQoreworICAgIGZsb2F0IHJlZCwgZ3Jl
ZW4sIGJsdWUsIGFscGhhOworICAgIGNvbC5nZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhh
KTsKKyAgICBjYWlyb19zZXRfc291cmNlX3JnYmEoY3IsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhh
KTsKK30KKworLy8gQSBmaWxsUmVjdCBoZWxwZXIKK3N0YXRpYyBpbmxpbmUgdm9pZCBmaWxsUmVj
dFNvdXJjZU92ZXIoY2Fpcm9fdCogY3IsIGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgY29uc3QgQ29s
b3ImIGNvbCkKK3sKKyAgICBzZXRDb2xvcihjciwgY29sKTsKKyAgICBjYWlyb19yZWN0YW5nbGUo
Y3IsIHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKKyAg
ICBjYWlyb19zZXRfb3BlcmF0b3IoY3IsIENBSVJPX09QRVJBVE9SX09WRVIpOworICAgIGNhaXJv
X2ZpbGwoY3IpOworfQorCitHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OkdyYXBoaWNz
Q29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpCisgICAgOiAgY3IoMCkKKyNpZiBQTEFURk9STShHVEsp
CisgICAgLCBleHBvc2UoMCkKKyNlbmRpZgoreworfQorCitHcmFwaGljc0NvbnRleHRQbGF0Zm9y
bVByaXZhdGU6On5HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKQoreworICAgIGNhaXJv
X2Rlc3Ryb3koY3IpOworfQorCisjaWYgUExBVEZPUk0oV0lOKQorR3JhcGhpY3NDb250ZXh0OjpH
cmFwaGljc0NvbnRleHQoSERDIGRjKQorICAgIDogbV9jb21tb24oY3JlYXRlR3JhcGhpY3NDb250
ZXh0UHJpdmF0ZSgpKQorICAgICwgbV9kYXRhKG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVBy
aXZhdGUpCit7CisgICAgaWYgKGRjKSB7CisgICAgICAgIGNhaXJvX3N1cmZhY2VfdCogc3VyZmFj
ZSA9IGNhaXJvX3dpbjMyX3N1cmZhY2VfY3JlYXRlKGRjKTsKKyAgICAgICAgbV9kYXRhLT5jciA9
IGNhaXJvX2NyZWF0ZShzdXJmYWNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzZXRQYWludGlu
Z0Rpc2FibGVkKHRydWUpOworICAgICAgICBtX2RhdGEtPmNyID0gMDsKKyAgICB9Cit9CisjZW5k
aWYKKworR3JhcGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRleHQoUGxhdGZvcm1HcmFwaGljc0Nv
bnRleHQqIGNyKQorICAgIDogbV9jb21tb24oY3JlYXRlR3JhcGhpY3NDb250ZXh0UHJpdmF0ZSgp
KQorICAgICwgbV9kYXRhKG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUpCit7Cisg
ICAgbV9kYXRhLT5jciA9IGNhaXJvX3JlZmVyZW5jZShjcik7CisgICAgc2V0UGFpbnRpbmdEaXNh
YmxlZCghY3IpOworfQorCitHcmFwaGljc0NvbnRleHQ6On5HcmFwaGljc0NvbnRleHQoKQorewor
ICAgIGRlc3Ryb3lHcmFwaGljc0NvbnRleHRQcml2YXRlKG1fY29tbW9uKTsKKyAgICBkZWxldGUg
bV9kYXRhOworfQorCitBZmZpbmVUcmFuc2Zvcm0gR3JhcGhpY3NDb250ZXh0OjpnZXRDVE0oKSBj
b25zdAoreworICAgIGNhaXJvX3QqIGNyID0gcGxhdGZvcm1Db250ZXh0KCk7CisgICAgY2Fpcm9f
bWF0cml4X3QgbTsKKyAgICBjYWlyb19nZXRfbWF0cml4KGNyLCAmbSk7CisgICAgcmV0dXJuIG07
Cit9CisKK2NhaXJvX3QqIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1Db250ZXh0KCkgY29uc3QK
K3sKKyAgICByZXR1cm4gbV9kYXRhLT5jcjsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNh
dmVQbGF0Zm9ybVN0YXRlKCkKK3sKKyAgICBjYWlyb19zYXZlKG1fZGF0YS0+Y3IpOworfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dDo6cmVzdG9yZVBsYXRmb3JtU3RhdGUoKQoreworICAgIGNhaXJv
X3Jlc3RvcmUobV9kYXRhLT5jcik7Cit9CisKKy8vIERyYXdzIGEgZmlsbGVkIHJlY3RhbmdsZSB3
aXRoIGEgc3Ryb2tlZCBib3JkZXIuCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd1JlY3QoY29u
c3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgY2Fpcm9fc2F2
ZShjcik7CisKKyAgICBpZiAoZmlsbENvbG9yKCkuYWxwaGEoKSkKKyAgICAgICAgZmlsbFJlY3RT
b3VyY2VPdmVyKGNyLCByZWN0LCBmaWxsQ29sb3IoKSk7CisKKyAgICBpZiAoc3Ryb2tlU3R5bGUo
KSAhPSBOb1N0cm9rZSkgeworICAgICAgICBzZXRDb2xvcihjciwgc3Ryb2tlQ29sb3IoKSk7Cisg
ICAgICAgIEZsb2F0UmVjdCByKHJlY3QpOworICAgICAgICByLmluZmxhdGUoLS41Zik7CisgICAg
ICAgIGNhaXJvX3JlY3RhbmdsZShjciwgci54KCksIHIueSgpLCByLndpZHRoKCksIHIuaGVpZ2h0
KCkpOworICAgICAgICBjYWlyb19zZXRfbGluZV93aWR0aChjciwgMS4wKTsKKyAgICAgICAgY2Fp
cm9fc3Ryb2tlKGNyKTsKKyAgICB9CisKKyAgICBjYWlyb19yZXN0b3JlKGNyKTsKK30KKworLy8g
RklYTUU6IE5vdyB0aGF0IHRoaXMgaXMgcmVmYWN0b3JlZCwgaXQgc2hvdWxkIGJlIHNoYXJlZCBi
eSBhbGwgY29udGV4dHMuCitzdGF0aWMgdm9pZCBhZGp1c3RMaW5lVG9QaXhlbEJvdW5kYXJpZXMo
RmxvYXRQb2ludCYgcDEsIEZsb2F0UG9pbnQmIHAyLCBmbG9hdCBzdHJva2VXaWR0aCwgU3Ryb2tl
U3R5bGUgc3R5bGUpCit7CisgICAgLy8gRm9yIG9kZCB3aWR0aHMsIHdlIGFkZCBpbiAwLjUgdG8g
dGhlIGFwcHJvcHJpYXRlIHgveSBzbyB0aGF0IHRoZSBmbG9hdCBhcml0aG1ldGljCisgICAgLy8g
d29ya3Mgb3V0LiAgRm9yIGV4YW1wbGUsIHdpdGggYSBib3JkZXIgd2lkdGggb2YgMywgS0hUTUwg
d2lsbCBwYXNzIHVzICh5MSt5MikvMiwgZS5nLiwKKyAgICAvLyAoNTArNTMpLzIgPSAxMDMvMiA9
IDUxIHdoZW4gd2Ugd2FudCA1MS41LiAgSXQgaXMgYWx3YXlzIHRydWUgdGhhdCBhbiBldmVuIHdp
ZHRoIGdhdmUKKyAgICAvLyB1cyBhIHBlcmZlY3QgcG9zaXRpb24sIGJ1dCBhbiBvZGQgd2lkdGgg
Z2F2ZSB1cyBhIHBvc2l0aW9uIHRoYXQgaXMgb2ZmIGJ5IGV4YWN0bHkgMC41LgorICAgIGlmIChz
dHlsZSA9PSBEb3R0ZWRTdHJva2UgfHwgc3R5bGUgPT0gRGFzaGVkU3Ryb2tlKSB7CisgICAgICAg
IGlmIChwMS54KCkgPT0gcDIueCgpKSB7CisgICAgICAgICAgICBwMS5zZXRZKHAxLnkoKSArIHN0
cm9rZVdpZHRoKTsKKyAgICAgICAgICAgIHAyLnNldFkocDIueSgpIC0gc3Ryb2tlV2lkdGgpOwor
ICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcDEuc2V0WChwMS54KCkgKyBz
dHJva2VXaWR0aCk7CisgICAgICAgICAgICBwMi5zZXRYKHAyLngoKSAtIHN0cm9rZVdpZHRoKTsK
KyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KHN0cm9rZVdpZHRo
KSAlIDIpIHsKKyAgICAgICAgaWYgKHAxLngoKSA9PSBwMi54KCkpIHsKKyAgICAgICAgICAgIC8v
IFdlJ3JlIGEgdmVydGljYWwgbGluZS4gIEFkanVzdCBvdXIgeC4KKyAgICAgICAgICAgIHAxLnNl
dFgocDEueCgpICsgMC41KTsKKyAgICAgICAgICAgIHAyLnNldFgocDIueCgpICsgMC41KTsKKyAg
ICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIGEgaG9yaXpvbnRh
bCBsaW5lLiBBZGp1c3Qgb3VyIHkuCisgICAgICAgICAgICBwMS5zZXRZKHAxLnkoKSArIDAuNSk7
CisgICAgICAgICAgICBwMi5zZXRZKHAyLnkoKSArIDAuNSk7CisgICAgICAgIH0KKyAgICB9Cit9
CisKKy8vIFRoaXMgaXMgb25seSB1c2VkIHRvIGRyYXcgYm9yZGVycy4KK3ZvaWQgR3JhcGhpY3ND
b250ZXh0OjpkcmF3TGluZShjb25zdCBJbnRQb2ludCYgcG9pbnQxLCBjb25zdCBJbnRQb2ludCYg
cG9pbnQyKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsK
KworICAgIFN0cm9rZVN0eWxlIHN0eWxlID0gc3Ryb2tlU3R5bGUoKTsKKyAgICBpZiAoc3R5bGUg
PT0gTm9TdHJva2UpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRh
LT5jcjsKKyAgICBjYWlyb19zYXZlKGNyKTsKKworICAgIGZsb2F0IHdpZHRoID0gc3Ryb2tlVGhp
Y2tuZXNzKCk7CisgICAgaWYgKHdpZHRoIDwgMSkKKyAgICAgICAgd2lkdGggPSAxOworCisgICAg
RmxvYXRQb2ludCBwMSA9IHBvaW50MTsKKyAgICBGbG9hdFBvaW50IHAyID0gcG9pbnQyOworICAg
IGJvb2wgaXNWZXJ0aWNhbExpbmUgPSAocDEueCgpID09IHAyLngoKSk7CisKKyAgICBhZGp1c3RM
aW5lVG9QaXhlbEJvdW5kYXJpZXMocDEsIHAyLCB3aWR0aCwgc3R5bGUpOworICAgIGNhaXJvX3Nl
dF9saW5lX3dpZHRoKGNyLCB3aWR0aCk7CisKKyAgICBpbnQgcGF0V2lkdGggPSAwOworICAgIHN3
aXRjaCAoc3R5bGUpIHsKKyAgICBjYXNlIE5vU3Ryb2tlOgorICAgIGNhc2UgU29saWRTdHJva2U6
CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRG90dGVkU3Ryb2tlOgorICAgICAgICBwYXRXaWR0
aCA9IHN0YXRpY19jYXN0PGludD4od2lkdGgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERh
c2hlZFN0cm9rZToKKyAgICAgICAgcGF0V2lkdGggPSAzKnN0YXRpY19jYXN0PGludD4od2lkdGgp
OworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzZXRDb2xvcihjciwgc3Ryb2tlQ29sb3Io
KSk7CisKKyAgICBjYWlyb19zZXRfYW50aWFsaWFzKGNyLCBDQUlST19BTlRJQUxJQVNfTk9ORSk7
CisKKyAgICBpZiAocGF0V2lkdGgpIHsKKyAgICAgICAgLy8gRG8gYSByZWN0IGZpbGwgb2Ygb3Vy
IGVuZHBvaW50cy4gIFRoaXMgZW5zdXJlcyB3ZSBhbHdheXMgaGF2ZSB0aGUKKyAgICAgICAgLy8g
YXBwZWFyYW5jZSBvZiBiZWluZyBhIGJvcmRlci4gIFdlIHRoZW4gZHJhdyB0aGUgYWN0dWFsIGRv
dHRlZC9kYXNoZWQgbGluZS4KKyAgICAgICAgaWYgKGlzVmVydGljYWxMaW5lKSB7CisgICAgICAg
ICAgICBmaWxsUmVjdFNvdXJjZU92ZXIoY3IsIEZsb2F0UmVjdChwMS54KCkgLSB3aWR0aC8yLCBw
MS55KCkgLSB3aWR0aCwgd2lkdGgsIHdpZHRoKSwgc3Ryb2tlQ29sb3IoKSk7CisgICAgICAgICAg
ICBmaWxsUmVjdFNvdXJjZU92ZXIoY3IsIEZsb2F0UmVjdChwMi54KCkgLSB3aWR0aC8yLCBwMi55
KCksIHdpZHRoLCB3aWR0aCksIHN0cm9rZUNvbG9yKCkpOworICAgICAgICB9IGVsc2UgeworICAg
ICAgICAgICAgZmlsbFJlY3RTb3VyY2VPdmVyKGNyLCBGbG9hdFJlY3QocDEueCgpIC0gd2lkdGgs
IHAxLnkoKSAtIHdpZHRoLzIsIHdpZHRoLCB3aWR0aCksIHN0cm9rZUNvbG9yKCkpOworICAgICAg
ICAgICAgZmlsbFJlY3RTb3VyY2VPdmVyKGNyLCBGbG9hdFJlY3QocDIueCgpLCBwMi55KCkgLSB3
aWR0aC8yLCB3aWR0aCwgd2lkdGgpLCBzdHJva2VDb2xvcigpKTsKKyAgICAgICAgfQorCisgICAg
ICAgIC8vIEV4YW1wbGU6IDgwIHBpeGVscyB3aXRoIGEgd2lkdGggb2YgMzAgcGl4ZWxzLgorICAg
ICAgICAvLyBSZW1haW5kZXIgaXMgMjAuICBUaGUgbWF4aW11bSBwaXhlbHMgb2YgbGluZSB3ZSBj
b3VsZCBwYWludAorICAgICAgICAvLyB3aWxsIGJlIDUwIHBpeGVscy4KKyAgICAgICAgaW50IGRp
c3RhbmNlID0gKGlzVmVydGljYWxMaW5lID8gKHBvaW50Mi55KCkgLSBwb2ludDEueSgpKSA6IChw
b2ludDIueCgpIC0gcG9pbnQxLngoKSkpIC0gMipzdGF0aWNfY2FzdDxpbnQ+KHdpZHRoKTsKKyAg
ICAgICAgaW50IHJlbWFpbmRlciA9IGRpc3RhbmNlJXBhdFdpZHRoOworICAgICAgICBpbnQgY292
ZXJhZ2UgPSBkaXN0YW5jZS1yZW1haW5kZXI7CisgICAgICAgIGludCBudW1TZWdtZW50cyA9IGNv
dmVyYWdlL3BhdFdpZHRoOworCisgICAgICAgIGZsb2F0IHBhdHRlcm5PZmZzZXQgPSAwOworICAg
ICAgICAvLyBTcGVjaWFsIGNhc2UgMXB4IGRvdHRlZCBib3JkZXJzIGZvciBzcGVlZC4KKyAgICAg
ICAgaWYgKHBhdFdpZHRoID09IDEpCisgICAgICAgICAgICBwYXR0ZXJuT2Zmc2V0ID0gMS4wOwor
ICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGJvb2wgZXZlbk51bWJlck9mU2VnbWVudHMgPSBu
dW1TZWdtZW50cyUyID09IDA7CisgICAgICAgICAgICBpZiAocmVtYWluZGVyKQorICAgICAgICAg
ICAgICAgIGV2ZW5OdW1iZXJPZlNlZ21lbnRzID0gIWV2ZW5OdW1iZXJPZlNlZ21lbnRzOworICAg
ICAgICAgICAgaWYgKGV2ZW5OdW1iZXJPZlNlZ21lbnRzKSB7CisgICAgICAgICAgICAgICAgaWYg
KHJlbWFpbmRlcikgeworICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuT2Zmc2V0ICs9IHBhdFdp
ZHRoIC0gcmVtYWluZGVyOworICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuT2Zmc2V0ICs9IHJl
bWFpbmRlci8yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAg
ICAgICAgICAgICAgICAgIHBhdHRlcm5PZmZzZXQgPSBwYXRXaWR0aC8yOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgZWxzZSBpZiAoIWV2ZW5OdW1iZXJPZlNlZ21lbnRzKSB7CisgICAgICAg
ICAgICAgICAgaWYgKHJlbWFpbmRlcikKKyAgICAgICAgICAgICAgICAgICAgcGF0dGVybk9mZnNl
dCA9IChwYXRXaWR0aCAtIHJlbWFpbmRlcikvMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
CisgICAgICAgIGRvdWJsZSBkYXNoID0gcGF0V2lkdGg7CisgICAgICAgIGNhaXJvX3NldF9kYXNo
KGNyLCAmZGFzaCwgMSwgcGF0dGVybk9mZnNldCk7CisgICAgfQorCisgICAgY2Fpcm9fbW92ZV90
byhjciwgcDEueCgpLCBwMS55KCkpOworICAgIGNhaXJvX2xpbmVfdG8oY3IsIHAyLngoKSwgcDIu
eSgpKTsKKworICAgIGNhaXJvX3N0cm9rZShjcik7CisgICAgY2Fpcm9fcmVzdG9yZShjcik7Cit9
CisKKy8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZCB0byBkcmF3IHRoZSBsaXR0bGUgY2lyY2xl
cyB1c2VkIGluIGxpc3RzLgordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdFbGxpcHNlKGNvbnN0
IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOworICAgIGNhaXJvX3NhdmUo
Y3IpOworICAgIGZsb2F0IHlSYWRpdXMgPSAuNSAqIHJlY3QuaGVpZ2h0KCk7CisgICAgZmxvYXQg
eFJhZGl1cyA9IC41ICogcmVjdC53aWR0aCgpOworICAgIGNhaXJvX3RyYW5zbGF0ZShjciwgcmVj
dC54KCkgKyB4UmFkaXVzLCByZWN0LnkoKSArIHlSYWRpdXMpOworICAgIGNhaXJvX3NjYWxlKGNy
LCB4UmFkaXVzLCB5UmFkaXVzKTsKKyAgICBjYWlyb19hcmMoY3IsIDAuLCAwLiwgMS4sIDAuLCAy
ICogTV9QSSk7CisgICAgY2Fpcm9fcmVzdG9yZShjcik7CisKKyAgICBpZiAoZmlsbENvbG9yKCku
YWxwaGEoKSkgeworICAgICAgICBzZXRDb2xvcihjciwgZmlsbENvbG9yKCkpOworICAgICAgICBj
YWlyb19maWxsX3ByZXNlcnZlKGNyKTsKKyAgICB9CisKKyAgICBpZiAoc3Ryb2tlU3R5bGUoKSAh
PSBOb1N0cm9rZSkgeworICAgICAgICBzZXRDb2xvcihjciwgc3Ryb2tlQ29sb3IoKSk7CisgICAg
ICAgIGNhaXJvX3NldF9saW5lX3dpZHRoKGNyLCBzdHJva2VUaGlja25lc3MoKSk7CisgICAgICAg
IGNhaXJvX3N0cm9rZShjcik7CisgICAgfQorCisgICAgY2Fpcm9fbmV3X3BhdGgoY3IpOworfQor
CisvLyBGSVhNRTogVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSBhZGp1c3RlZCB0byBtYXRjaCB0
aGUgZnVuY3Rpb25hbGl0eSBvbiB0aGUgTWFjIHNpZGUuCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6
c3Ryb2tlQXJjKGNvbnN0IEludFJlY3QmIHJlY3QsIGludCBzdGFydEFuZ2xlLCBpbnQgYW5nbGVT
cGFuKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIGlmIChzdHJva2VTdHlsZSgpID09IE5vU3Ryb2tlKQorICAgICAgICByZXR1cm47CisKKyAg
ICBpbnQgeCA9IHJlY3QueCgpOworICAgIGludCB5ID0gcmVjdC55KCk7CisgICAgZmxvYXQgdyA9
IHJlY3Qud2lkdGgoKTsKKyNpZiAwIC8vIEZJWE1FOiB1bnVzZWQgc28gZmFyCisgICAgZmxvYXQg
aCA9IHJlY3QuaGVpZ2h0KCk7CisgICAgZmxvYXQgc2NhbGVGYWN0b3IgPSBoIC8gdzsKKyAgICBm
bG9hdCByZXZlcnNlU2NhbGVGYWN0b3IgPSB3IC8gaDsKKyNlbmRpZgorICAgIGZsb2F0IHIgPSB3
IC8gMjsKKyAgICBmbG9hdCBmYSA9IHN0YXJ0QW5nbGU7CisgICAgZmxvYXQgZmFsZW4gPSAgZmEg
KyBhbmdsZVNwYW47CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgY2Fpcm9f
c2F2ZShjcik7CisgICAgY2Fpcm9fYXJjX25lZ2F0aXZlKGNyLCB4ICsgciwgeSArIHIsIHIsIC1m
YSAqIE1fUEkvMTgwLCAtZmFsZW4gKiBNX1BJLzE4MCk7CisgICAgc2V0Q29sb3IoY3IsIHN0cm9r
ZUNvbG9yKCkpOworICAgIGNhaXJvX3NldF9saW5lX3dpZHRoKGNyLCBzdHJva2VUaGlja25lc3Mo
KSk7CisgICAgY2Fpcm9fc3Ryb2tlKGNyKTsKKyAgICBjYWlyb19yZXN0b3JlKGNyKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdDb252ZXhQb2x5Z29uKHNpemVfdCBucG9pbnRzLCBj
b25zdCBGbG9hdFBvaW50KiBwb2ludHMsIGJvb2wgc2hvdWxkQW50aWFsaWFzKQoreworICAgIGlm
IChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChucG9pbnRz
IDw9IDEpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsK
KworICAgIGNhaXJvX3NhdmUoY3IpOworICAgIGNhaXJvX3NldF9hbnRpYWxpYXMoY3IsIHNob3Vs
ZEFudGlhbGlhcyA/IENBSVJPX0FOVElBTElBU19ERUZBVUxUIDogQ0FJUk9fQU5USUFMSUFTX05P
TkUpOworICAgIGNhaXJvX21vdmVfdG8oY3IsIHBvaW50c1swXS54KCksIHBvaW50c1swXS55KCkp
OworICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbnBvaW50czsgaSsrKQorICAgICAgICBjYWly
b19saW5lX3RvKGNyLCBwb2ludHNbaV0ueCgpLCBwb2ludHNbaV0ueSgpKTsKKyAgICBjYWlyb19j
bG9zZV9wYXRoKGNyKTsKKworICAgIGlmIChmaWxsQ29sb3IoKS5hbHBoYSgpKSB7CisgICAgICAg
IHNldENvbG9yKGNyLCBmaWxsQ29sb3IoKSk7CisgICAgICAgIGNhaXJvX3NldF9maWxsX3J1bGUo
Y3IsIENBSVJPX0ZJTExfUlVMRV9FVkVOX09ERCk7CisgICAgICAgIGNhaXJvX2ZpbGxfcHJlc2Vy
dmUoY3IpOworICAgIH0KKworICAgIGlmIChzdHJva2VTdHlsZSgpICE9IE5vU3Ryb2tlKSB7Cisg
ICAgICAgIHNldENvbG9yKGNyLCBzdHJva2VDb2xvcigpKTsKKyAgICAgICAgY2Fpcm9fc2V0X2xp
bmVfd2lkdGgoY3IsIHN0cm9rZVRoaWNrbmVzcygpKTsKKyAgICAgICAgY2Fpcm9fc3Ryb2tlKGNy
KTsKKyAgICB9CisKKyAgICBjYWlyb19uZXdfcGF0aChjcik7CisgICAgY2Fpcm9fcmVzdG9yZShj
cik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpmaWxsUmVjdChjb25zdCBJbnRSZWN0JiBy
ZWN0LCBjb25zdCBDb2xvciYgY29sb3IpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGNvbG9yLmFscGhhKCkpCisgICAgICAgIGZpbGxS
ZWN0U291cmNlT3ZlcihtX2RhdGEtPmNyLCByZWN0LCBjb2xvcik7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0OjpmaWxsUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0IENvbG9yJiBj
b2xvcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisK
KyAgICBpZiAoY29sb3IuYWxwaGEoKSkKKyAgICAgICAgZmlsbFJlY3RTb3VyY2VPdmVyKG1fZGF0
YS0+Y3IsIHJlY3QsIGNvbG9yKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXAoY29u
c3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgY2Fpcm9fcmVj
dGFuZ2xlKGNyLCByZWN0LngoKSwgcmVjdC55KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQo
KSk7CisgICAgY2Fpcm9fZmlsbF9ydWxlX3Qgc2F2ZWRGaWxsUnVsZSA9IGNhaXJvX2dldF9maWxs
X3J1bGUoY3IpOworICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIENBSVJPX0ZJTExfUlVMRV9X
SU5ESU5HKTsKKyAgICBjYWlyb19jbGlwKGNyKTsKKyAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNy
LCBzYXZlZEZpbGxSdWxlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1c1Jp
bmcoY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIGludCByYWRpdXMgPSAoZm9jdXNSaW5nV2lkdGgoKSAtIDEp
IC8gMjsKKyAgICBpbnQgb2Zmc2V0ID0gcmFkaXVzICsgZm9jdXNSaW5nT2Zmc2V0KCk7CisKKyAg
ICBjb25zdCBWZWN0b3I8SW50UmVjdD4mIHJlY3RzID0gZm9jdXNSaW5nUmVjdHMoKTsKKyAgICB1
bnNpZ25lZCByZWN0Q291bnQgPSByZWN0cy5zaXplKCk7CisgICAgSW50UmVjdCBmaW5hbEZvY3Vz
UmVjdDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcmVjdENvdW50OyBpKyspIHsKKyAg
ICAgICAgSW50UmVjdCBmb2N1c1JlY3QgPSByZWN0c1tpXTsKKyAgICAgICAgZm9jdXNSZWN0Lmlu
ZmxhdGUob2Zmc2V0KTsKKyAgICAgICAgZmluYWxGb2N1c1JlY3QudW5pdGUoZm9jdXNSZWN0KTsK
KyAgICB9CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgY2Fpcm9fc2F2ZShj
cik7CisgICAgLy8gRklYTUU6IFRoZXNlIHJlY3RzIHNob3VsZCBiZSByb3VuZGVkCisgICAgY2Fp
cm9fcmVjdGFuZ2xlKGNyLCBmaW5hbEZvY3VzUmVjdC54KCksIGZpbmFsRm9jdXNSZWN0LnkoKSwg
ZmluYWxGb2N1c1JlY3Qud2lkdGgoKSwgZmluYWxGb2N1c1JlY3QuaGVpZ2h0KCkpOworCisgICAg
Ly8gRm9yY2UgdGhlIGFscGhhIHRvIDUwJS4gIFRoaXMgbWF0Y2hlcyB3aGF0IHRoZSBNYWMgZG9l
cyB3aXRoIG91dGxpbmUgcmluZ3MuCisgICAgQ29sb3IgcmluZ0NvbG9yKGNvbG9yLnJlZCgpLCBj
b2xvci5ncmVlbigpLCBjb2xvci5ibHVlKCksIDEyNyk7CisgICAgc2V0Q29sb3IoY3IsIHJpbmdD
b2xvcik7CisgICAgY2Fpcm9fc3Ryb2tlKGNyKTsKKyAgICBjYWlyb19yZXN0b3JlKGNyKTsKK30K
Kwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yVGV4dChjb25zdCBJbnRQb2ludCYg
b3JpZ2luLCBpbnQgd2lkdGgsIGJvb2wgcHJpbnRpbmcpCit7CisgICAgaWYgKHBhaW50aW5nRGlz
YWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gVGhpcyBpcyBhIHdvcmthcm91bmQg
Zm9yIGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NjU5CisgICAgU3Ry
b2tlU3R5bGUgc2F2ZWRTdHJva2VTdHlsZSA9IHN0cm9rZVN0eWxlKCk7CisgICAgc2V0U3Ryb2tl
U3R5bGUoU29saWRTdHJva2UpOworCisgICAgSW50UG9pbnQgZW5kUG9pbnQgPSBvcmlnaW4gKyBJ
bnRTaXplKHdpZHRoLCAwKTsKKyAgICBkcmF3TGluZShvcmlnaW4sIGVuZFBvaW50KTsKKworICAg
IHNldFN0cm9rZVN0eWxlKHNhdmVkU3Ryb2tlU3R5bGUpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6ZHJhd0xpbmVGb3JNaXNzcGVsbGluZ09yQmFkR3JhbW1hcihjb25zdCBJbnRQb2ludCYg
b3JpZ2luLCBpbnQgd2lkdGgsIGJvb2wgZ3JhbW1hcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNh
YmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyNpZiBQTEFURk9STShHVEspCisgICAgY2Fpcm9f
dCogY3IgPSBtX2RhdGEtPmNyOworICAgIGNhaXJvX3NhdmUoY3IpOworCisgICAgLy8gQ29udmVu
dGlvbiBpcyBncmVlbiBmb3IgZ3JhbW1hciwgcmVkIGZvciBzcGVsbGluZworICAgIC8vIFRoZXNl
IG5lZWQgdG8gYmVjb21lIGNvbmZpZ3VyYWJsZQorICAgIGlmIChncmFtbWFyKQorICAgICAgICBj
YWlyb19zZXRfc291cmNlX3JnYihjciwgMCwgMSwgMCk7CisgICAgZWxzZQorICAgICAgICBjYWly
b19zZXRfc291cmNlX3JnYihjciwgMSwgMCwgMCk7CisKKyAgICAvLyBXZSBpZ25vcmUgbW9zdCBv
ZiB0aGUgcHJvdmlkZWQgY29uc3RhbnRzIGluIGZhdm91ciBvZiB0aGUgcGxhdGZvcm0gc3R5bGUK
KyAgICBwYW5nb19jYWlyb19zaG93X2Vycm9yX3VuZGVybGluZShjciwgb3JpZ2luLngoKSwgb3Jp
Z2luLnkoKSwgd2lkdGgsIGNNaXNzcGVsbGluZ0xpbmVUaGlja25lc3MpOworCisgICAgY2Fpcm9f
cmVzdG9yZShjcik7CisjZWxzZQorICAgIG5vdEltcGxlbWVudGVkKCk7CisjZW5kaWYKK30KKwor
RmxvYXRSZWN0IEdyYXBoaWNzQ29udGV4dDo6cm91bmRUb0RldmljZVBpeGVscyhjb25zdCBGbG9h
dFJlY3QmIGZyZWN0KQoreworICAgIEZsb2F0UmVjdCByZXN1bHQ7CisgICAgZG91YmxlIHggPSBm
cmVjdC54KCk7CisgICAgZG91YmxlIHkgPSBmcmVjdC55KCk7CisgICAgY2Fpcm9fdCogY3IgPSBt
X2RhdGEtPmNyOworICAgIGNhaXJvX3VzZXJfdG9fZGV2aWNlKGNyLCAmeCwgJnkpOworICAgIHgg
PSByb3VuZCh4KTsKKyAgICB5ID0gcm91bmQoeSk7CisgICAgY2Fpcm9fZGV2aWNlX3RvX3VzZXIo
Y3IsICZ4LCAmeSk7CisgICAgcmVzdWx0LnNldFgoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHgpKTsKKyAg
ICByZXN1bHQuc2V0WShzdGF0aWNfY2FzdDxmbG9hdD4oeSkpOworICAgIHggPSBmcmVjdC53aWR0
aCgpOworICAgIHkgPSBmcmVjdC5oZWlnaHQoKTsKKyAgICBjYWlyb191c2VyX3RvX2RldmljZV9k
aXN0YW5jZShjciwgJngsICZ5KTsKKyAgICB4ID0gcm91bmQoeCk7CisgICAgeSA9IHJvdW5kKHkp
OworICAgIGNhaXJvX2RldmljZV90b191c2VyX2Rpc3RhbmNlKGNyLCAmeCwgJnkpOworICAgIHJl
c3VsdC5zZXRXaWR0aChzdGF0aWNfY2FzdDxmbG9hdD4oeCkpOworICAgIHJlc3VsdC5zZXRIZWln
aHQoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHkpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dDo6dHJhbnNsYXRlKGZsb2F0IHgsIGZsb2F0IHkpCit7CisgICAgaWYg
KHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fdCogY3Ig
PSBtX2RhdGEtPmNyOworICAgIGNhaXJvX3RyYW5zbGF0ZShjciwgeCwgeSk7Cit9CisKK0ludFBv
aW50IEdyYXBoaWNzQ29udGV4dDo6b3JpZ2luKCkKK3sKKyAgICBjYWlyb19tYXRyaXhfdCBtYXRy
aXg7CisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOworICAgIGNhaXJvX2dldF9tYXRyaXgo
Y3IsICZtYXRyaXgpOworICAgIHJldHVybiBJbnRQb2ludChzdGF0aWNfY2FzdDxpbnQ+KG1hdHJp
eC54MCksIHN0YXRpY19jYXN0PGludD4obWF0cml4LnkwKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0OjpzZXRQbGF0Zm9ybUZpbGxDb2xvcihjb25zdCBDb2xvciYgY29sKQoreworICAgIC8v
IEZJWE1FOiB0aGlzIGlzIHByb2JhYmx5IGEgbm8tb3AgYnV0IEknbSBub3Qgc3VyZQorICAgIC8v
IG5vdEltcGxlbWVudGVkKCk7IC8vIGNvbW1lbnRlZC1vdXQgYmVjYXVzZSBpdCdzIGNoYXR0eSBh
bmQgY2x1dHRlcnMgb3V0cHV0Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9y
bVN0cm9rZUNvbG9yKGNvbnN0IENvbG9yJiBjb2wpCit7CisgICAgLy8gRklYTUU6IHRoaXMgaXMg
cHJvYmFibHkgYSBuby1vcCBidXQgSSdtIG5vdCBzdXJlCisgICAgLy9ub3RJbXBsZW1lbnRlZCgp
OyAvLyBjb21tZW50ZWQtb3V0IGJlY2F1c2UgaXQncyBjaGF0dHkgYW5kIGNsdXR0ZXJzIG91dHB1
dAorfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TdHJva2VUaGlja25lc3Mo
ZmxvYXQgc3Ryb2tlVGhpY2tuZXNzKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3NldF9saW5lX3dpZHRoKG1fZGF0YS0+Y3IsIHN0
cm9rZVRoaWNrbmVzcyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVN0
cm9rZVN0eWxlKGNvbnN0IFN0cm9rZVN0eWxlJiBzdHJva2VTdHlsZSkKK3sKKyAgICBzdGF0aWMg
ZG91YmxlIGRhc2hQYXR0ZXJuW10gPSB7NS4wLCA1LjB9OworICAgIHN0YXRpYyBkb3VibGUgZG90
UGF0dGVybltdID0gezEuMCwgMS4wfTsKKworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIHN3aXRjaCAoc3Ryb2tlU3R5bGUpIHsKKyAgICBjYXNlIE5v
U3Ryb2tlOgorICAgICAgICAvLyBGSVhNRTogaXMgaXQgdGhlIHJpZ2h0IHdheSB0byBlbXVsYXRl
IE5vU3Ryb2tlPworICAgICAgICBjYWlyb19zZXRfbGluZV93aWR0aChtX2RhdGEtPmNyLCAwKTsK
KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTb2xpZFN0cm9rZToKKyAgICAgICAgY2Fpcm9fc2V0
X2Rhc2gobV9kYXRhLT5jciwgMCwgMCwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRG90
dGVkU3Ryb2tlOgorICAgICAgICBjYWlyb19zZXRfZGFzaChtX2RhdGEtPmNyLCBkb3RQYXR0ZXJu
LCAyLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEYXNoZWRTdHJva2U6CisgICAgICAg
IGNhaXJvX3NldF9kYXNoKG1fZGF0YS0+Y3IsIGRhc2hQYXR0ZXJuLCAyLCAwKTsKKyAgICAgICAg
YnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICAgICAg
YnJlYWs7CisgICAgfQorfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0VVJMRm9yUmVjdChj
b25zdCBLVVJMJiBsaW5rLCBjb25zdCBJbnRSZWN0JiBkZXN0UmVjdCkKK3sKKyAgICBub3RJbXBs
ZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y29uY2F0Q1RNKGNvbnN0IEFm
ZmluZVRyYW5zZm9ybSYgdHJhbnNmb3JtKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkp
CisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBj
b25zdCBjYWlyb19tYXRyaXhfdCogbWF0cml4ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYWly
b19tYXRyaXhfdCo+KCZ0cmFuc2Zvcm0pOworICAgIGNhaXJvX3RyYW5zZm9ybShjciwgbWF0cml4
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmFkZElubmVyUm91bmRlZFJlY3RDbGlwKGNv
bnN0IEludFJlY3QmIHJlY3QsIGludCB0aGlja25lc3MpCit7CisgICAgaWYgKHBhaW50aW5nRGlz
YWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2xpcChyZWN0KTsKKworICAgIFBhdGgg
cDsKKyAgICBGbG9hdFJlY3QgcihyZWN0KTsKKyAgICAvLyBBZGQgb3V0ZXIgZWxsaXBzZQorICAg
IHAuYWRkRWxsaXBzZShyKTsKKyAgICAvLyBBZGQgaW5uZXIgZWxsaXBzZQorICAgIHIuaW5mbGF0
ZSgtdGhpY2tuZXNzKTsKKyAgICBwLmFkZEVsbGlwc2Uocik7CisgICAgYWRkUGF0aChwKTsKKwor
ICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb19maWxsX3J1bGVfdCBzYXZl
ZEZpbGxSdWxlID0gY2Fpcm9fZ2V0X2ZpbGxfcnVsZShjcik7CisgICAgY2Fpcm9fc2V0X2ZpbGxf
cnVsZShjciwgQ0FJUk9fRklMTF9SVUxFX0VWRU5fT0REKTsKKyAgICBjYWlyb19jbGlwKGNyKTsK
KyAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNyLCBzYXZlZEZpbGxSdWxlKTsKK30KKworCit2b2lk
IEdyYXBoaWNzQ29udGV4dDo6c2V0U2hhZG93KEludFNpemUgY29uc3QmLCBpbnQsIENvbG9yIGNv
bnN0JikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dDo6Y2xlYXJTaGFkb3coKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpiZWdpblRyYW5zcGFyZW5jeUxheWVyKGZsb2F0IG9wYWNpdHkpCit7Cisg
ICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9f
dCogY3IgPSBtX2RhdGEtPmNyOworICAgIGNhaXJvX3B1c2hfZ3JvdXAoY3IpOworICAgIG1fZGF0
YS0+bGF5ZXJzLmFwcGVuZChvcGFjaXR5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmVu
ZFRyYW5zcGFyZW5jeUxheWVyKCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisKKyAgICBjYWly
b19wb3BfZ3JvdXBfdG9fc291cmNlKGNyKTsKKyAgICBjYWlyb19wYWludF93aXRoX2FscGhhKGNy
LCBtX2RhdGEtPmxheWVycy5sYXN0KCkpOworICAgIG1fZGF0YS0+bGF5ZXJzLnJlbW92ZUxhc3Qo
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsZWFyUmVjdChjb25zdCBGbG9hdFJlY3Qm
IHJlY3QpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOworCisgICAgY2Fpcm9fc2F2ZShjcik7Cisg
ICAgY2Fpcm9fcmVjdGFuZ2xlKGNyLCByZWN0LngoKSwgcmVjdC55KCksIHJlY3Qud2lkdGgoKSwg
cmVjdC5oZWlnaHQoKSk7CisgICAgY2Fpcm9fc2V0X29wZXJhdG9yKGNyLCBDQUlST19PUEVSQVRP
Ul9DTEVBUik7CisgICAgY2Fpcm9fZmlsbChjcik7CisgICAgY2Fpcm9fcmVzdG9yZShjcik7Cit9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzdHJva2VSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVj
dCwgZmxvYXQgd2lkdGgpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOworICAgIGNhaXJvX3NhdmUo
Y3IpOworICAgIGNhaXJvX3JlY3RhbmdsZShjciwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0Lndp
ZHRoKCksIHJlY3QuaGVpZ2h0KCkpOworICAgIHNldENvbG9yKGNyLCBzdHJva2VDb2xvcigpKTsK
KyAgICBjYWlyb19zZXRfbGluZV93aWR0aChjciwgd2lkdGgpOworICAgIGNhaXJvX3N0cm9rZShj
cik7CisgICAgY2Fpcm9fcmVzdG9yZShjcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpz
ZXRMaW5lQ2FwKExpbmVDYXAgbGluZUNhcCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgp
KQorICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb19saW5lX2NhcF90IGNhaXJvQ2FwID0gQ0FJ
Uk9fTElORV9DQVBfQlVUVDsKKyAgICBzd2l0Y2ggKGxpbmVDYXApIHsKKyAgICAgICAgY2FzZSBC
dXR0Q2FwOgorICAgICAgICAgICAgLy8gbm8tb3AKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICBjYXNlIFJvdW5kQ2FwOgorICAgICAgICAgICAgY2Fpcm9DYXAgPSBDQUlST19MSU5FX0NBUF9S
T1VORDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNxdWFyZUNhcDoKKyAgICAg
ICAgICAgIGNhaXJvQ2FwID0gQ0FJUk9fTElORV9DQVBfU1FVQVJFOworICAgICAgICAgICAgYnJl
YWs7CisgICAgfQorICAgIGNhaXJvX3NldF9saW5lX2NhcChtX2RhdGEtPmNyLCBjYWlyb0NhcCk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRMaW5lSm9pbihMaW5lSm9pbiBsaW5lSm9p
bikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBjYWlyb19saW5lX2pvaW5fdCBjYWlyb0pvaW4gPSBDQUlST19MSU5FX0pPSU5fTUlURVI7Cisg
ICAgc3dpdGNoIChsaW5lSm9pbikgeworICAgICAgICBjYXNlIE1pdGVySm9pbjoKKyAgICAgICAg
ICAgIC8vIG5vLW9wCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSb3VuZEpvaW46
CisgICAgICAgICAgICBjYWlyb0pvaW4gPSBDQUlST19MSU5FX0pPSU5fUk9VTkQ7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCZXZlbEpvaW46CisgICAgICAgICAgICBjYWlyb0pv
aW4gPSBDQUlST19MSU5FX0pPSU5fQkVWRUw7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cisg
ICAgY2Fpcm9fc2V0X2xpbmVfam9pbihtX2RhdGEtPmNyLCBjYWlyb0pvaW4pOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dDo6c2V0TWl0ZXJMaW1pdChmbG9hdCBtaXRlcikKK3sKKyAgICBpZiAo
cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb19zZXRfbWl0
ZXJfbGltaXQobV9kYXRhLT5jciwgbWl0ZXIpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6
c2V0QWxwaGEoZmxvYXQpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworc3RhdGljIGlu
bGluZSBjYWlyb19vcGVyYXRvcl90IHRvQ2Fpcm9PcGVyYXRvcihDb21wb3NpdGVPcGVyYXRvciBv
cCkKK3sKKyAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgIGNhc2UgQ29tcG9zaXRlQ2xlYXI6Cisg
ICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfQ0xFQVI7CisgICAgICAgIGNhc2UgQ29t
cG9zaXRlQ29weToKKyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9TT1VSQ0U7Cisg
ICAgICAgIGNhc2UgQ29tcG9zaXRlU291cmNlT3ZlcjoKKyAgICAgICAgICAgIHJldHVybiBDQUlS
T19PUEVSQVRPUl9PVkVSOworICAgICAgICBjYXNlIENvbXBvc2l0ZVNvdXJjZUluOgorICAgICAg
ICAgICAgcmV0dXJuIENBSVJPX09QRVJBVE9SX0lOOworICAgICAgICBjYXNlIENvbXBvc2l0ZVNv
dXJjZU91dDoKKyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9PVVQ7CisgICAgICAg
IGNhc2UgQ29tcG9zaXRlU291cmNlQXRvcDoKKyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVS
QVRPUl9BVE9QOworICAgICAgICBjYXNlIENvbXBvc2l0ZURlc3RpbmF0aW9uT3ZlcjoKKyAgICAg
ICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9ERVNUX09WRVI7CisgICAgICAgIGNhc2UgQ29t
cG9zaXRlRGVzdGluYXRpb25JbjoKKyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9E
RVNUX0lOOworICAgICAgICBjYXNlIENvbXBvc2l0ZURlc3RpbmF0aW9uT3V0OgorICAgICAgICAg
ICAgcmV0dXJuIENBSVJPX09QRVJBVE9SX0RFU1RfT1VUOworICAgICAgICBjYXNlIENvbXBvc2l0
ZURlc3RpbmF0aW9uQXRvcDoKKyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9ERVNU
X0FUT1A7CisgICAgICAgIGNhc2UgQ29tcG9zaXRlWE9SOgorICAgICAgICAgICAgcmV0dXJuIENB
SVJPX09QRVJBVE9SX1hPUjsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVQbHVzRGFya2VyOgorICAg
ICAgICAgICAgcmV0dXJuIENBSVJPX09QRVJBVE9SX1NBVFVSQVRFOworICAgICAgICBjYXNlIENv
bXBvc2l0ZUhpZ2hsaWdodDoKKyAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIENhaXJvIGVxdWl2
YWxlbnQgZm9yIENvbXBvc2l0ZUhpZ2hsaWdodC4KKyAgICAgICAgICAgIHJldHVybiBDQUlST19P
UEVSQVRPUl9PVkVSOworICAgICAgICBjYXNlIENvbXBvc2l0ZVBsdXNMaWdodGVyOgorICAgICAg
ICAgICAgcmV0dXJuIENBSVJPX09QRVJBVE9SX0FERDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAg
ICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9TT1VSQ0U7CisgICAgfQorfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDo6c2V0Q29tcG9zaXRlT3BlcmF0aW9uKENvbXBvc2l0ZU9wZXJhdG9yIG9w
KQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAg
IGNhaXJvX3NldF9vcGVyYXRvcihtX2RhdGEtPmNyLCB0b0NhaXJvT3BlcmF0b3Iob3ApKTsKK30K
Kwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmJlZ2luUGF0aCgpCit7CisgICAgaWYgKHBhaW50aW5n
RGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEt
PmNyOworICAgIGNhaXJvX25ld19wYXRoKGNyKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6
OmFkZFBhdGgoY29uc3QgUGF0aCYgcGF0aCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgp
KQorICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAg
Y2Fpcm9fcGF0aF90KiBwID0gY2Fpcm9fY29weV9wYXRoKHBhdGgucGxhdGZvcm1QYXRoKCktPm1f
Y3IpOworICAgIGNhaXJvX2FwcGVuZF9wYXRoKGNyLCBwKTsKKyAgICBjYWlyb19wYXRoX2Rlc3Ry
b3kocCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwKGNvbnN0IFBhdGgmIHBhdGgp
Cit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
Y2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOworICAgIGNhaXJvX3BhdGhfdCogcCA9IGNhaXJvX2Nv
cHlfcGF0aChwYXRoLnBsYXRmb3JtUGF0aCgpLT5tX2NyKTsKKyAgICBjYWlyb19hcHBlbmRfcGF0
aChjciwgcCk7CisgICAgY2Fpcm9fcGF0aF9kZXN0cm95KHApOworICAgIGNhaXJvX2ZpbGxfcnVs
ZV90IHNhdmVkRmlsbFJ1bGUgPSBjYWlyb19nZXRfZmlsbF9ydWxlKGNyKTsKKyAgICBjYWlyb19z
ZXRfZmlsbF9ydWxlKGNyLCBDQUlST19GSUxMX1JVTEVfV0lORElORyk7CisgICAgY2Fpcm9fY2xp
cChjcik7CisgICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgc2F2ZWRGaWxsUnVsZSk7Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwT3V0KGNvbnN0IFBhdGgmIHBhdGgpCit7CisgICAg
aWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fdCog
Y3IgPSBtX2RhdGEtPmNyOworICAgIGRvdWJsZSB4MSwgeTEsIHgyLCB5MjsKKyAgICBjYWlyb19j
bGlwX2V4dGVudHMoY3IsICZ4MSwgJnkxLCAmeDIsICZ5Mik7CisgICAgY2Fpcm9fcmVjdGFuZ2xl
KGNyLCB4MSwgeTEsIHgyIC0geDEsIHkyIC0geTEpOworICAgIGFkZFBhdGgocGF0aCk7CisKKyAg
ICBjYWlyb19maWxsX3J1bGVfdCBzYXZlZEZpbGxSdWxlID0gY2Fpcm9fZ2V0X2ZpbGxfcnVsZShj
cik7CisgICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgQ0FJUk9fRklMTF9SVUxFX0VWRU5fT0RE
KTsKKyAgICBjYWlyb19jbGlwKGNyKTsKKyAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNyLCBzYXZl
ZEZpbGxSdWxlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnJvdGF0ZShmbG9hdCByYWRp
YW5zKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIGNhaXJvX3JvdGF0ZShtX2RhdGEtPmNyLCByYWRpYW5zKTsKK30KKwordm9pZCBHcmFwaGlj
c0NvbnRleHQ6OnNjYWxlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sKKyAgICBpZiAocGFpbnRp
bmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb19zY2FsZShtX2RhdGEt
PmNyLCBzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCkpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6Y2xpcE91dChjb25zdCBJbnRSZWN0JiByKQoreworICAgIGlmIChwYWludGluZ0Rpc2Fi
bGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsK
KyAgICBkb3VibGUgeDEsIHkxLCB4MiwgeTI7CisgICAgY2Fpcm9fY2xpcF9leHRlbnRzKGNyLCAm
eDEsICZ5MSwgJngyLCAmeTIpOworICAgIGNhaXJvX3JlY3RhbmdsZShjciwgeDEsIHgyLCB4MiAt
IHgxLCB5MiAtIHkxKTsKKyAgICBjYWlyb19yZWN0YW5nbGUoY3IsIHIueCgpLCByLnkoKSwgci53
aWR0aCgpLCByLmhlaWdodCgpKTsKKyAgICBjYWlyb19maWxsX3J1bGVfdCBzYXZlZEZpbGxSdWxl
ID0gY2Fpcm9fZ2V0X2ZpbGxfcnVsZShjcik7CisgICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwg
Q0FJUk9fRklMTF9SVUxFX0VWRU5fT0REKTsKKyAgICBjYWlyb19jbGlwKGNyKTsKKyAgICBjYWly
b19zZXRfZmlsbF9ydWxlKGNyLCBzYXZlZEZpbGxSdWxlKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQ6OmNsaXBPdXRFbGxpcHNlSW5SZWN0KGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgaWYg
KHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgUGF0aCBwOworICAg
IHAuYWRkRWxsaXBzZShyKTsKKyAgICBjbGlwT3V0KHApOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6ZmlsbFJvdW5kZWRSZWN0KGNvbnN0IEludFJlY3QmIHIsIGNvbnN0IEludFNpemUmIHRv
cExlZnQsIGNvbnN0IEludFNpemUmIHRvcFJpZ2h0LCBjb25zdCBJbnRTaXplJiBib3R0b21MZWZ0
LCBjb25zdCBJbnRTaXplJiBib3R0b21SaWdodCwgY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAg
IGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3Qq
IGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb19zYXZlKGNyKTsKKyAgICBiZWdpblBhdGgoKTsK
KyAgICBhZGRQYXRoKFBhdGg6OmNyZWF0ZVJvdW5kZWRSZWN0YW5nbGUociwgdG9wTGVmdCwgdG9w
UmlnaHQsIGJvdHRvbUxlZnQsIGJvdHRvbVJpZ2h0KSk7CisgICAgc2V0Q29sb3IoY3IsIGNvbG9y
KTsKKyAgICBjYWlyb19maWxsKGNyKTsKKyAgICBjYWlyb19yZXN0b3JlKGNyKTsKK30KKworI2lm
IFBMQVRGT1JNKEdUSykKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRHZGtFeHBvc2VFdmVudChH
ZGtFdmVudEV4cG9zZSogZXhwb3NlKQoreworICAgIG1fZGF0YS0+ZXhwb3NlID0gZXhwb3NlOwor
fQorCitHZGtFdmVudEV4cG9zZSogR3JhcGhpY3NDb250ZXh0OjpnZGtFeHBvc2VFdmVudCgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIG1fZGF0YS0+ZXhwb3NlOworfQorCitHZGtEcmF3YWJsZSogR3Jh
cGhpY3NDb250ZXh0OjpnZGtEcmF3YWJsZSgpIGNvbnN0Cit7CisgICAgaWYgKCFtX2RhdGEtPmV4
cG9zZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gR0RLX0RSQVdBQkxFKG1fZGF0
YS0+ZXhwb3NlLT53aW5kb3cpOworfQorCitJbnRQb2ludCBHcmFwaGljc0NvbnRleHQ6OnRyYW5z
bGF0ZVBvaW50KGNvbnN0IEludFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAgICBjYWlyb19tYXRy
aXhfdCB0bTsKKyAgICBjYWlyb19nZXRfbWF0cml4KG1fZGF0YS0+Y3IsICZ0bSk7CisgICAgZG91
YmxlIHggPSBwb2ludC54KCk7CisgICAgZG91YmxlIHkgPSBwb2ludC55KCk7CisKKyAgICBjYWly
b19tYXRyaXhfdHJhbnNmb3JtX3BvaW50KCZ0bSwgJngsICZ5KTsKKyAgICByZXR1cm4gSW50UG9p
bnQoeCwgeSk7Cit9CisjZW5kaWYKKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFVzZUFudGlh
bGlhc2luZyhib29sIGVuYWJsZSkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAg
ICAgICByZXR1cm47CisKKyAgICAvLyBXaGVuIHRydWUsIHVzZSB0aGUgZGVmYXVsdCBDYWlybyBi
YWNrZW5kIGFudGlhbGlhcyBtb2RlICh1c3VhbGx5IHRoaXMKKyAgICAvLyBlbmFibGVzIHN0YW5k
YXJkICdncmF5c2NhbGUnIGFudGlhbGlhc2luZyk7IGZhbHNlIHRvIGV4cGxpY2l0bHkgZGlzYWJs
ZQorICAgIC8vIGFudGlhbGlhc2luZy4gVGhpcyBpcyB0aGUgc2FtZSBzdHJhdGVneSBhcyB1c2Vk
IGluIGRyYXdDb252ZXhQb2x5Z29uKCkuCisgICAgY2Fpcm9fc2V0X2FudGlhbGlhcyhtX2RhdGEt
PmNyLCBlbmFibGUgPyBDQUlST19BTlRJQUxJQVNfREVGQVVMVCA6IENBSVJPX0FOVElBTElBU19O
T05FKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gUExBVEZPUk0o
Q0FJUk8pCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZUNhaXJvLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9jYWlyby9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVDYWlyby5oCShy
ZXZpc2lvbiAyOTcyNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhp
Y3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlQ2Fpcm8uaAkod29ya2luZyBjb3B5KQpAQCAtMSw2ICsx
LDcgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQWxwIFRva2VyIDxhbHBA
YXRva2VyLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBCcmVudCBGdWxnaGFtIDxiZnVsZ2hh
bUBnbWFpbC5jb20+CiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI0LDkwMSAr
MjUsNTcgQEAKICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAogICovCiAKLSNpbmNsdWRlICJjb25maWcuaCIKICNp
bmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKIAotI2lmIFBMQVRGT1JNKENBSVJPKQotCi0jaW5j
bHVkZSAiQ2Fpcm9QYXRoLmgiCi0jaW5jbHVkZSAiRmxvYXRSZWN0LmgiCi0jaW5jbHVkZSAiRm9u
dC5oIgotI2luY2x1ZGUgIkludFJlY3QuaCIKLSNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgot
I2luY2x1ZGUgIlBhdGguaCIKLSNpbmNsdWRlICJTaW1wbGVGb250RGF0YS5oIgogI2luY2x1ZGUg
PGNhaXJvLmg+CiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVk
ZSA8d3RmL01hdGhFeHRyYXMuaD4KIAotI2lmIFBMQVRGT1JNKFdJTikKLSNpbmNsdWRlIDxjYWly
by13aW4zMi5oPgotI2VuZGlmCi0KICNpZiBQTEFURk9STShHVEspCiAjaW5jbHVkZSA8Z2RrL2dk
ay5oPgogI2luY2x1ZGUgPHBhbmdvL3BhbmdvLmg+Ci0jZW5kaWYKLQotCi0jaWZuZGVmIE1fUEkK
LSNkZWZpbmUgTV9QSSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CisjZWxpZiBQTEFURk9STShXSU4p
CisjaW5jbHVkZSA8Y2Fpcm8td2luMzIuaD4KICNlbmRpZgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7
CiAKIGNsYXNzIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSB7CiBwdWJsaWM6Ci0gICAg
R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKCk7Ci0gICAgfkdyYXBoaWNzQ29udGV4dFBs
YXRmb3JtUHJpdmF0ZSgpOwotCi0gICAgY2Fpcm9fdCogY3I7Ci0gICAgVmVjdG9yPGZsb2F0PiBs
YXllcnM7Ci0KKyAgICBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKQorICAgICAgICA6
ICBjcigwKQogI2lmIFBMQVRGT1JNKEdUSykKLSAgICBHZGtFdmVudEV4cG9zZSogZXhwb3NlOwot
I2VuZGlmCi19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0Q29sb3IoY2Fpcm9fdCogY3IsIGNv
bnN0IENvbG9yJiBjb2wpCi17Ci0gICAgZmxvYXQgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGE7Ci0g
ICAgY29sLmdldFJHQkEocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotICAgIGNhaXJvX3NldF9z
b3VyY2VfcmdiYShjciwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotfQotCi0vLyBBIGZpbGxS
ZWN0IGhlbHBlcgotc3RhdGljIGlubGluZSB2b2lkIGZpbGxSZWN0U291cmNlT3ZlcihjYWlyb190
KiBjciwgY29uc3QgRmxvYXRSZWN0JiByZWN0LCBjb25zdCBDb2xvciYgY29sKQotewotICAgIHNl
dENvbG9yKGNyLCBjb2wpOwotICAgIGNhaXJvX3JlY3RhbmdsZShjciwgcmVjdC54KCksIHJlY3Qu
eSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOwotICAgIGNhaXJvX3NldF9vcGVyYXRv
cihjciwgQ0FJUk9fT1BFUkFUT1JfT1ZFUik7Ci0gICAgY2Fpcm9fZmlsbChjcik7Ci19Ci0KLUdy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2
YXRlKCkKLSAgICA6ICBjcigwKQotI2lmIFBMQVRGT1JNKEdUSykKLSAgICAsIGV4cG9zZSgwKQot
I2VuZGlmCi17Ci19Ci0KLUdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6fkdyYXBoaWNz
Q29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpCi17Ci0gICAgY2Fpcm9fZGVzdHJveShjcik7Ci19Ci0K
LSNpZiBQTEFURk9STShXSU4pCi1HcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dChIREMg
ZGMpCi0gICAgOiBtX2NvbW1vbihjcmVhdGVHcmFwaGljc0NvbnRleHRQcml2YXRlKCkpCi0gICAg
LCBtX2RhdGEobmV3IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSkKLXsKLSAgICBpZiAo
ZGMpIHsKLSAgICAgICAgY2Fpcm9fc3VyZmFjZV90KiBzdXJmYWNlID0gY2Fpcm9fd2luMzJfc3Vy
ZmFjZV9jcmVhdGUoZGMpOwotICAgICAgICBtX2RhdGEtPmNyID0gY2Fpcm9fY3JlYXRlKHN1cmZh
Y2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNldFBhaW50aW5nRGlzYWJsZWQodHJ1ZSk7Ci0g
ICAgICAgIG1fZGF0YS0+Y3IgPSAwOwotICAgIH0KLX0KLSNlbmRpZgotCi1HcmFwaGljc0NvbnRl
eHQ6OkdyYXBoaWNzQ29udGV4dChQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCogY3IpCi0gICAgOiBt
X2NvbW1vbihjcmVhdGVHcmFwaGljc0NvbnRleHRQcml2YXRlKCkpCi0gICAgLCBtX2RhdGEobmV3
IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSkKLXsKLSAgICBtX2RhdGEtPmNyID0gY2Fp
cm9fcmVmZXJlbmNlKGNyKTsKLSAgICBzZXRQYWludGluZ0Rpc2FibGVkKCFjcik7Ci19Ci0KLUdy
YXBoaWNzQ29udGV4dDo6fkdyYXBoaWNzQ29udGV4dCgpCi17Ci0gICAgZGVzdHJveUdyYXBoaWNz
Q29udGV4dFByaXZhdGUobV9jb21tb24pOwotICAgIGRlbGV0ZSBtX2RhdGE7Ci19Ci0KLWNhaXJv
X3QqIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1Db250ZXh0KCkgY29uc3QKLXsKLSAgICByZXR1
cm4gbV9kYXRhLT5jcjsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNhdmVQbGF0Zm9ybVN0
YXRlKCkKLXsKLSAgICBjYWlyb19zYXZlKG1fZGF0YS0+Y3IpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDo6cmVzdG9yZVBsYXRmb3JtU3RhdGUoKQotewotICAgIGNhaXJvX3Jlc3RvcmUobV9k
YXRhLT5jcik7Ci19Ci0KLS8vIERyYXdzIGEgZmlsbGVkIHJlY3RhbmdsZSB3aXRoIGEgc3Ryb2tl
ZCBib3JkZXIuCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd1JlY3QoY29uc3QgSW50UmVjdCYg
cmVjdCkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fc2F2ZShjcik7Ci0KLSAg
ICBpZiAoZmlsbENvbG9yKCkuYWxwaGEoKSkKLSAgICAgICAgZmlsbFJlY3RTb3VyY2VPdmVyKGNy
LCByZWN0LCBmaWxsQ29sb3IoKSk7Ci0KLSAgICBpZiAoc3Ryb2tlU3R5bGUoKSAhPSBOb1N0cm9r
ZSkgewotICAgICAgICBzZXRDb2xvcihjciwgc3Ryb2tlQ29sb3IoKSk7Ci0gICAgICAgIEZsb2F0
UmVjdCByKHJlY3QpOwotICAgICAgICByLmluZmxhdGUoLS41Zik7Ci0gICAgICAgIGNhaXJvX3Jl
Y3RhbmdsZShjciwgci54KCksIHIueSgpLCByLndpZHRoKCksIHIuaGVpZ2h0KCkpOwotICAgICAg
ICBjYWlyb19zZXRfbGluZV93aWR0aChjciwgMS4wKTsKLSAgICAgICAgY2Fpcm9fc3Ryb2tlKGNy
KTsKLSAgICB9Ci0KLSAgICBjYWlyb19yZXN0b3JlKGNyKTsKLX0KLQotLy8gRklYTUU6IE5vdyB0
aGF0IHRoaXMgaXMgcmVmYWN0b3JlZCwgaXQgc2hvdWxkIGJlIHNoYXJlZCBieSBhbGwgY29udGV4
dHMuCi1zdGF0aWMgdm9pZCBhZGp1c3RMaW5lVG9QaXhlbEJvdW5kYXJpZXMoRmxvYXRQb2ludCYg
cDEsIEZsb2F0UG9pbnQmIHAyLCBmbG9hdCBzdHJva2VXaWR0aCwgU3Ryb2tlU3R5bGUgc3R5bGUp
Ci17Ci0gICAgLy8gRm9yIG9kZCB3aWR0aHMsIHdlIGFkZCBpbiAwLjUgdG8gdGhlIGFwcHJvcHJp
YXRlIHgveSBzbyB0aGF0IHRoZSBmbG9hdCBhcml0aG1ldGljCi0gICAgLy8gd29ya3Mgb3V0LiAg
Rm9yIGV4YW1wbGUsIHdpdGggYSBib3JkZXIgd2lkdGggb2YgMywgS0hUTUwgd2lsbCBwYXNzIHVz
ICh5MSt5MikvMiwgZS5nLiwKLSAgICAvLyAoNTArNTMpLzIgPSAxMDMvMiA9IDUxIHdoZW4gd2Ug
d2FudCA1MS41LiAgSXQgaXMgYWx3YXlzIHRydWUgdGhhdCBhbiBldmVuIHdpZHRoIGdhdmUKLSAg
ICAvLyB1cyBhIHBlcmZlY3QgcG9zaXRpb24sIGJ1dCBhbiBvZGQgd2lkdGggZ2F2ZSB1cyBhIHBv
c2l0aW9uIHRoYXQgaXMgb2ZmIGJ5IGV4YWN0bHkgMC41LgotICAgIGlmIChzdHlsZSA9PSBEb3R0
ZWRTdHJva2UgfHwgc3R5bGUgPT0gRGFzaGVkU3Ryb2tlKSB7Ci0gICAgICAgIGlmIChwMS54KCkg
PT0gcDIueCgpKSB7Ci0gICAgICAgICAgICBwMS5zZXRZKHAxLnkoKSArIHN0cm9rZVdpZHRoKTsK
LSAgICAgICAgICAgIHAyLnNldFkocDIueSgpIC0gc3Ryb2tlV2lkdGgpOwotICAgICAgICB9Ci0g
ICAgICAgIGVsc2UgewotICAgICAgICAgICAgcDEuc2V0WChwMS54KCkgKyBzdHJva2VXaWR0aCk7
Ci0gICAgICAgICAgICBwMi5zZXRYKHAyLngoKSAtIHN0cm9rZVdpZHRoKTsKLSAgICAgICAgfQot
ICAgIH0KLQotICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KHN0cm9rZVdpZHRoKSAlIDIpIHsKLSAg
ICAgICAgaWYgKHAxLngoKSA9PSBwMi54KCkpIHsKLSAgICAgICAgICAgIC8vIFdlJ3JlIGEgdmVy
dGljYWwgbGluZS4gIEFkanVzdCBvdXIgeC4KLSAgICAgICAgICAgIHAxLnNldFgocDEueCgpICsg
MC41KTsKLSAgICAgICAgICAgIHAyLnNldFgocDIueCgpICsgMC41KTsKLSAgICAgICAgfQotICAg
ICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIFdlJ3JlIGEgaG9yaXpvbnRhbCBsaW5lLiBBZGp1
c3Qgb3VyIHkuCi0gICAgICAgICAgICBwMS5zZXRZKHAxLnkoKSArIDAuNSk7Ci0gICAgICAgICAg
ICBwMi5zZXRZKHAyLnkoKSArIDAuNSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIFRoaXMg
aXMgb25seSB1c2VkIHRvIGRyYXcgYm9yZGVycy4KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3
TGluZShjb25zdCBJbnRQb2ludCYgcG9pbnQxLCBjb25zdCBJbnRQb2ludCYgcG9pbnQyKQotewot
ICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFN0cm9r
ZVN0eWxlIHN0eWxlID0gc3Ryb2tlU3R5bGUoKTsKLSAgICBpZiAoc3R5bGUgPT0gTm9TdHJva2Up
Ci0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLSAgICBj
YWlyb19zYXZlKGNyKTsKLQotICAgIGZsb2F0IHdpZHRoID0gc3Ryb2tlVGhpY2tuZXNzKCk7Ci0g
ICAgaWYgKHdpZHRoIDwgMSkKLSAgICAgICAgd2lkdGggPSAxOwotCi0gICAgRmxvYXRQb2ludCBw
MSA9IHBvaW50MTsKLSAgICBGbG9hdFBvaW50IHAyID0gcG9pbnQyOwotICAgIGJvb2wgaXNWZXJ0
aWNhbExpbmUgPSAocDEueCgpID09IHAyLngoKSk7Ci0gCi0gICAgYWRqdXN0TGluZVRvUGl4ZWxC
b3VuZGFyaWVzKHAxLCBwMiwgd2lkdGgsIHN0eWxlKTsKLSAgICBjYWlyb19zZXRfbGluZV93aWR0
aChjciwgd2lkdGgpOwotCi0gICAgaW50IHBhdFdpZHRoID0gMDsKLSAgICBzd2l0Y2ggKHN0eWxl
KSB7Ci0gICAgY2FzZSBOb1N0cm9rZToKLSAgICBjYXNlIFNvbGlkU3Ryb2tlOgotICAgICAgICBi
cmVhazsKLSAgICBjYXNlIERvdHRlZFN0cm9rZToKLSAgICAgICAgcGF0V2lkdGggPSBzdGF0aWNf
Y2FzdDxpbnQ+KHdpZHRoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEYXNoZWRTdHJva2U6
Ci0gICAgICAgIHBhdFdpZHRoID0gMypzdGF0aWNfY2FzdDxpbnQ+KHdpZHRoKTsKLSAgICAgICAg
YnJlYWs7CisgICAgICAgICwgZXhwb3NlKDApCisjZWxpZiBQTEFURk9STShXSU4pCisgICAgICAg
IC8vIE5PVEU6ICBUaGVzZSBtYXkgbm90ZSBiZSBuZWVkZWQ6IHJldmlldyBhbmQgcmVtb3ZlIG9u
Y2UgQ2Fpcm8gaW1wbGVtZW50YXRpb24gaXMgY29tcGxldGUKKyAgICAgICAgLCBtX2hkYygwKQor
ICAgICAgICAsIG1fdHJhbnNwYXJlbmN5Q291bnQoMCkKKyNlbmRpZgorICAgIHsKICAgICB9CiAK
LSAgICBzZXRDb2xvcihjciwgc3Ryb2tlQ29sb3IoKSk7Ci0KLSAgICBjYWlyb19zZXRfYW50aWFs
aWFzKGNyLCBDQUlST19BTlRJQUxJQVNfTk9ORSk7Ci0KLSAgICBpZiAocGF0V2lkdGgpIHsKLSAg
ICAgICAgLy8gRG8gYSByZWN0IGZpbGwgb2Ygb3VyIGVuZHBvaW50cy4gIFRoaXMgZW5zdXJlcyB3
ZSBhbHdheXMgaGF2ZSB0aGUKLSAgICAgICAgLy8gYXBwZWFyYW5jZSBvZiBiZWluZyBhIGJvcmRl
ci4gIFdlIHRoZW4gZHJhdyB0aGUgYWN0dWFsIGRvdHRlZC9kYXNoZWQgbGluZS4KLSAgICAgICAg
aWYgKGlzVmVydGljYWxMaW5lKSB7Ci0gICAgICAgICAgICBmaWxsUmVjdFNvdXJjZU92ZXIoY3Is
IEZsb2F0UmVjdChwMS54KCkgLSB3aWR0aC8yLCBwMS55KCkgLSB3aWR0aCwgd2lkdGgsIHdpZHRo
KSwgc3Ryb2tlQ29sb3IoKSk7Ci0gICAgICAgICAgICBmaWxsUmVjdFNvdXJjZU92ZXIoY3IsIEZs
b2F0UmVjdChwMi54KCkgLSB3aWR0aC8yLCBwMi55KCksIHdpZHRoLCB3aWR0aCksIHN0cm9rZUNv
bG9yKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmlsbFJlY3RTb3VyY2VPdmVy
KGNyLCBGbG9hdFJlY3QocDEueCgpIC0gd2lkdGgsIHAxLnkoKSAtIHdpZHRoLzIsIHdpZHRoLCB3
aWR0aCksIHN0cm9rZUNvbG9yKCkpOwotICAgICAgICAgICAgZmlsbFJlY3RTb3VyY2VPdmVyKGNy
LCBGbG9hdFJlY3QocDIueCgpLCBwMi55KCkgLSB3aWR0aC8yLCB3aWR0aCwgd2lkdGgpLCBzdHJv
a2VDb2xvcigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEV4YW1wbGU6IDgwIHBpeGVscyB3
aXRoIGEgd2lkdGggb2YgMzAgcGl4ZWxzLgotICAgICAgICAvLyBSZW1haW5kZXIgaXMgMjAuICBU
aGUgbWF4aW11bSBwaXhlbHMgb2YgbGluZSB3ZSBjb3VsZCBwYWludAotICAgICAgICAvLyB3aWxs
IGJlIDUwIHBpeGVscy4KLSAgICAgICAgaW50IGRpc3RhbmNlID0gKGlzVmVydGljYWxMaW5lID8g
KHBvaW50Mi55KCkgLSBwb2ludDEueSgpKSA6IChwb2ludDIueCgpIC0gcG9pbnQxLngoKSkpIC0g
MipzdGF0aWNfY2FzdDxpbnQ+KHdpZHRoKTsKLSAgICAgICAgaW50IHJlbWFpbmRlciA9IGRpc3Rh
bmNlJXBhdFdpZHRoOwotICAgICAgICBpbnQgY292ZXJhZ2UgPSBkaXN0YW5jZS1yZW1haW5kZXI7
Ci0gICAgICAgIGludCBudW1TZWdtZW50cyA9IGNvdmVyYWdlL3BhdFdpZHRoOwotCi0gICAgICAg
IGZsb2F0IHBhdHRlcm5PZmZzZXQgPSAwOwotICAgICAgICAvLyBTcGVjaWFsIGNhc2UgMXB4IGRv
dHRlZCBib3JkZXJzIGZvciBzcGVlZC4KLSAgICAgICAgaWYgKHBhdFdpZHRoID09IDEpCi0gICAg
ICAgICAgICBwYXR0ZXJuT2Zmc2V0ID0gMS4wOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAg
IGJvb2wgZXZlbk51bWJlck9mU2VnbWVudHMgPSBudW1TZWdtZW50cyUyID09IDA7Ci0gICAgICAg
ICAgICBpZiAocmVtYWluZGVyKQotICAgICAgICAgICAgICAgIGV2ZW5OdW1iZXJPZlNlZ21lbnRz
ID0gIWV2ZW5OdW1iZXJPZlNlZ21lbnRzOwotICAgICAgICAgICAgaWYgKGV2ZW5OdW1iZXJPZlNl
Z21lbnRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbWFpbmRlcikgewotICAgICAgICAgICAg
ICAgICAgICBwYXR0ZXJuT2Zmc2V0ICs9IHBhdFdpZHRoIC0gcmVtYWluZGVyOwotICAgICAgICAg
ICAgICAgICAgICBwYXR0ZXJuT2Zmc2V0ICs9IHJlbWFpbmRlci8yOwotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHBhdHRlcm5PZmZz
ZXQgPSBwYXRXaWR0aC8yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIWV2
ZW5OdW1iZXJPZlNlZ21lbnRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbWFpbmRlcikKLSAg
ICAgICAgICAgICAgICAgICAgcGF0dGVybk9mZnNldCA9IChwYXRXaWR0aCAtIHJlbWFpbmRlcikv
MjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGRvdWJsZSBkYXNoID0gcGF0
V2lkdGg7Ci0gICAgICAgIGNhaXJvX3NldF9kYXNoKGNyLCAmZGFzaCwgMSwgcGF0dGVybk9mZnNl
dCk7CisgICAgfkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpCisgICAgeworICAgICAg
ICBjYWlyb19kZXN0cm95KGNyKTsKICAgICB9CiAKLSAgICBjYWlyb19tb3ZlX3RvKGNyLCBwMS54
KCksIHAxLnkoKSk7Ci0gICAgY2Fpcm9fbGluZV90byhjciwgcDIueCgpLCBwMi55KCkpOwotCi0g
ICAgY2Fpcm9fc3Ryb2tlKGNyKTsKLSAgICBjYWlyb19yZXN0b3JlKGNyKTsKLX0KLQotLy8gVGhp
cyBtZXRob2QgaXMgb25seSB1c2VkIHRvIGRyYXcgdGhlIGxpdHRsZSBjaXJjbGVzIHVzZWQgaW4g
bGlzdHMuCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0VsbGlwc2UoY29uc3QgSW50UmVjdCYg
cmVjdCkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fc2F2ZShjcik7Ci0gICAg
ZmxvYXQgeVJhZGl1cyA9IC41ICogcmVjdC5oZWlnaHQoKTsKLSAgICBmbG9hdCB4UmFkaXVzID0g
LjUgKiByZWN0LndpZHRoKCk7Ci0gICAgY2Fpcm9fdHJhbnNsYXRlKGNyLCByZWN0LngoKSArIHhS
YWRpdXMsIHJlY3QueSgpICsgeVJhZGl1cyk7Ci0gICAgY2Fpcm9fc2NhbGUoY3IsIHhSYWRpdXMs
IHlSYWRpdXMpOwotICAgIGNhaXJvX2FyYyhjciwgMC4sIDAuLCAxLiwgMC4sIDIgKiBNX1BJKTsK
LSAgICBjYWlyb19yZXN0b3JlKGNyKTsKLQotICAgIGlmIChmaWxsQ29sb3IoKS5hbHBoYSgpKSB7
Ci0gICAgICAgIHNldENvbG9yKGNyLCBmaWxsQ29sb3IoKSk7Ci0gICAgICAgIGNhaXJvX2ZpbGxf
cHJlc2VydmUoY3IpOwotICAgIH0KLQotICAgIGlmIChzdHJva2VTdHlsZSgpICE9IE5vU3Ryb2tl
KSB7Ci0gICAgICAgIHNldENvbG9yKGNyLCBzdHJva2VDb2xvcigpKTsKLSAgICAgICAgY2Fpcm9f
c2V0X2xpbmVfd2lkdGgoY3IsIHN0cm9rZVRoaWNrbmVzcygpKTsKLSAgICAgICAgY2Fpcm9fc3Ry
b2tlKGNyKTsKLSAgICB9Ci0KLSAgICBjYWlyb19uZXdfcGF0aChjcik7Ci19Ci0KLS8vIEZJWE1F
OiBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIGFkanVzdGVkIHRvIG1hdGNoIHRoZSBmdW5jdGlv
bmFsaXR5IG9uIHRoZSBNYWMgc2lkZS4KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzdHJva2VBcmMo
Y29uc3QgSW50UmVjdCYgcmVjdCwgaW50IHN0YXJ0QW5nbGUsIGludCBhbmdsZVNwYW4pCi17Ci0g
ICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKHN0
cm9rZVN0eWxlKCkgPT0gTm9TdHJva2UpCi0gICAgICAgIHJldHVybjsKLQotICAgIGludCB4ID0g
cmVjdC54KCk7Ci0gICAgaW50IHkgPSByZWN0LnkoKTsKLSAgICBmbG9hdCB3ID0gcmVjdC53aWR0
aCgpOwotI2lmIDAgLy8gRklYTUU6IHVudXNlZCBzbyBmYXIKLSAgICBmbG9hdCBoID0gcmVjdC5o
ZWlnaHQoKTsKLSAgICBmbG9hdCBzY2FsZUZhY3RvciA9IGggLyB3OwotICAgIGZsb2F0IHJldmVy
c2VTY2FsZUZhY3RvciA9IHcgLyBoOwotI2VuZGlmCi0gICAgZmxvYXQgciA9IHcgLyAyOwotICAg
IGZsb2F0IGZhID0gc3RhcnRBbmdsZTsKLSAgICBmbG9hdCBmYWxlbiA9ICBmYSArIGFuZ2xlU3Bh
bjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLSAgICBjYWlyb19zYXZlKGNyKTsK
LSAgICBjYWlyb19hcmNfbmVnYXRpdmUoY3IsIHggKyByLCB5ICsgciwgciwgLWZhICogTV9QSS8x
ODAsIC1mYWxlbiAqIE1fUEkvMTgwKTsKLSAgICBzZXRDb2xvcihjciwgc3Ryb2tlQ29sb3IoKSk7
Ci0gICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgoY3IsIHN0cm9rZVRoaWNrbmVzcygpKTsKLSAgICBj
YWlyb19zdHJva2UoY3IpOwotICAgIGNhaXJvX3Jlc3RvcmUoY3IpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDo6ZHJhd0NvbnZleFBvbHlnb24oc2l6ZV90IG5wb2ludHMsIGNvbnN0IEZsb2F0
UG9pbnQqIHBvaW50cywgYm9vbCBzaG91bGRBbnRpYWxpYXMpCi17Ci0gICAgaWYgKHBhaW50aW5n
RGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKG5wb2ludHMgPD0gMSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotCi0gICAgY2Fp
cm9fc2F2ZShjcik7Ci0gICAgY2Fpcm9fc2V0X2FudGlhbGlhcyhjciwgc2hvdWxkQW50aWFsaWFz
ID8gQ0FJUk9fQU5USUFMSUFTX0RFRkFVTFQgOiBDQUlST19BTlRJQUxJQVNfTk9ORSk7Ci0gICAg
Y2Fpcm9fbW92ZV90byhjciwgcG9pbnRzWzBdLngoKSwgcG9pbnRzWzBdLnkoKSk7Ci0gICAgZm9y
IChzaXplX3QgaSA9IDE7IGkgPCBucG9pbnRzOyBpKyspCi0gICAgICAgIGNhaXJvX2xpbmVfdG8o
Y3IsIHBvaW50c1tpXS54KCksIHBvaW50c1tpXS55KCkpOwotICAgIGNhaXJvX2Nsb3NlX3BhdGgo
Y3IpOwotCi0gICAgaWYgKGZpbGxDb2xvcigpLmFscGhhKCkpIHsKLSAgICAgICAgc2V0Q29sb3Io
Y3IsIGZpbGxDb2xvcigpKTsKLSAgICAgICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgQ0FJUk9f
RklMTF9SVUxFX0VWRU5fT0REKTsKLSAgICAgICAgY2Fpcm9fZmlsbF9wcmVzZXJ2ZShjcik7Ci0g
ICAgfQotCi0gICAgaWYgKHN0cm9rZVN0eWxlKCkgIT0gTm9TdHJva2UpIHsKLSAgICAgICAgc2V0
Q29sb3IoY3IsIHN0cm9rZUNvbG9yKCkpOwotICAgICAgICBjYWlyb19zZXRfbGluZV93aWR0aChj
ciwgc3Ryb2tlVGhpY2tuZXNzKCkpOwotICAgICAgICBjYWlyb19zdHJva2UoY3IpOwotICAgIH0K
LQotICAgIGNhaXJvX25ld19wYXRoKGNyKTsKLSAgICBjYWlyb19yZXN0b3JlKGNyKTsKLX0KLQot
dm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxSZWN0KGNvbnN0IEludFJlY3QmIHJlY3QsIGNvbnN0
IENvbG9yJiBjb2xvcikKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBpZiAoY29sb3IuYWxwaGEoKSkKLSAgICAgICAgZmlsbFJlY3RTb3VyY2VP
dmVyKG1fZGF0YS0+Y3IsIHJlY3QsIGNvbG9yKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6
OmZpbGxSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgY29uc3QgQ29sb3ImIGNvbG9yKQotewot
ICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChj
b2xvci5hbHBoYSgpKQotICAgICAgICBmaWxsUmVjdFNvdXJjZU92ZXIobV9kYXRhLT5jciwgcmVj
dCwgY29sb3IpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcChjb25zdCBJbnRSZWN0
JiByZWN0KQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsK
LQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLSAgICBjYWlyb19yZWN0YW5nbGUoY3Is
IHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKLSAgICBj
YWlyb19maWxsX3J1bGVfdCBzYXZlZEZpbGxSdWxlID0gY2Fpcm9fZ2V0X2ZpbGxfcnVsZShjcik7
Ci0gICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgQ0FJUk9fRklMTF9SVUxFX1dJTkRJTkcpOwot
ICAgIGNhaXJvX2NsaXAoY3IpOwotICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIHNhdmVkRmls
bFJ1bGUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0ZvY3VzUmluZyhjb25zdCBD
b2xvciYgY29sb3IpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgaW50IHJhZGl1cyA9IChmb2N1c1JpbmdXaWR0aCgpIC0gMSkgLyAyOwotICAg
IGludCBvZmZzZXQgPSByYWRpdXMgKyBmb2N1c1JpbmdPZmZzZXQoKTsKLQotICAgIGNvbnN0IFZl
Y3RvcjxJbnRSZWN0PiYgcmVjdHMgPSBmb2N1c1JpbmdSZWN0cygpOwotICAgIHVuc2lnbmVkIHJl
Y3RDb3VudCA9IHJlY3RzLnNpemUoKTsKLSAgICBJbnRSZWN0IGZpbmFsRm9jdXNSZWN0OwotICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCByZWN0Q291bnQ7IGkrKykgewotICAgICAgICBJbnRS
ZWN0IGZvY3VzUmVjdCA9IHJlY3RzW2ldOwotICAgICAgICBmb2N1c1JlY3QuaW5mbGF0ZShvZmZz
ZXQpOwotICAgICAgICBmaW5hbEZvY3VzUmVjdC51bml0ZShmb2N1c1JlY3QpOwotICAgIH0KLQot
ICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLSAgICBjYWlyb19zYXZlKGNyKTsKLSAgICAv
LyBGSVhNRTogVGhlc2UgcmVjdHMgc2hvdWxkIGJlIHJvdW5kZWQKLSAgICBjYWlyb19yZWN0YW5n
bGUoY3IsIGZpbmFsRm9jdXNSZWN0LngoKSwgZmluYWxGb2N1c1JlY3QueSgpLCBmaW5hbEZvY3Vz
UmVjdC53aWR0aCgpLCBmaW5hbEZvY3VzUmVjdC5oZWlnaHQoKSk7Ci0KLSAgICAvLyBGb3JjZSB0
aGUgYWxwaGEgdG8gNTAlLiAgVGhpcyBtYXRjaGVzIHdoYXQgdGhlIE1hYyBkb2VzIHdpdGggb3V0
bGluZSByaW5ncy4KLSAgICBDb2xvciByaW5nQ29sb3IoY29sb3IucmVkKCksIGNvbG9yLmdyZWVu
KCksIGNvbG9yLmJsdWUoKSwgMTI3KTsKLSAgICBzZXRDb2xvcihjciwgcmluZ0NvbG9yKTsKLSAg
ICBjYWlyb19zdHJva2UoY3IpOwotICAgIGNhaXJvX3Jlc3RvcmUoY3IpOwotfQotCi12b2lkIEdy
YXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JUZXh0KGNvbnN0IEludFBvaW50JiBvcmlnaW4sIGlu
dCB3aWR0aCwgYm9vbCBwcmludGluZykKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgaHR0cDov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU2NTkKLSAgICBTdHJva2VTdHlsZSBz
YXZlZFN0cm9rZVN0eWxlID0gc3Ryb2tlU3R5bGUoKTsKLSAgICBzZXRTdHJva2VTdHlsZShTb2xp
ZFN0cm9rZSk7Ci0KLSAgICBJbnRQb2ludCBlbmRQb2ludCA9IG9yaWdpbiArIEludFNpemUod2lk
dGgsIDApOwotICAgIGRyYXdMaW5lKG9yaWdpbiwgZW5kUG9pbnQpOwotCi0gICAgc2V0U3Ryb2tl
U3R5bGUoc2F2ZWRTdHJva2VTdHlsZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3
TGluZUZvck1pc3NwZWxsaW5nT3JCYWRHcmFtbWFyKGNvbnN0IEludFBvaW50JiBvcmlnaW4sIGlu
dCB3aWR0aCwgYm9vbCBncmFtbWFyKQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0g
ICAgICAgIHJldHVybjsKLQotI2lmIFBMQVRGT1JNKEdUSykKLSAgICBjYWlyb190KiBjciA9IG1f
ZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fc2F2ZShjcik7Ci0KLSAgICAvLyBDb252ZW50aW9uIGlzIGdy
ZWVuIGZvciBncmFtbWFyLCByZWQgZm9yIHNwZWxsaW5nCi0gICAgLy8gVGhlc2UgbmVlZCB0byBi
ZWNvbWUgY29uZmlndXJhYmxlCi0gICAgaWYgKGdyYW1tYXIpCi0gICAgICAgIGNhaXJvX3NldF9z
b3VyY2VfcmdiKGNyLCAwLCAxLCAwKTsKLSAgICBlbHNlCi0gICAgICAgIGNhaXJvX3NldF9zb3Vy
Y2VfcmdiKGNyLCAxLCAwLCAwKTsKLQotICAgIC8vIFdlIGlnbm9yZSBtb3N0IG9mIHRoZSBwcm92
aWRlZCBjb25zdGFudHMgaW4gZmF2b3VyIG9mIHRoZSBwbGF0Zm9ybSBzdHlsZQotICAgIHBhbmdv
X2NhaXJvX3Nob3dfZXJyb3JfdW5kZXJsaW5lKGNyLCBvcmlnaW4ueCgpLCBvcmlnaW4ueSgpLCB3
aWR0aCwgY01pc3NwZWxsaW5nTGluZVRoaWNrbmVzcyk7Ci0KLSAgICBjYWlyb19yZXN0b3JlKGNy
KTsKLSNlbHNlCi0gICAgbm90SW1wbGVtZW50ZWQoKTsKKyNpZiBQTEFURk9STShXSU4pCisgICAg
Ly8gT24gV2luZG93cywgd2UgbmVlZCB0byB1cGRhdGUgdGhlIEhEQyBmb3IgZm9ybSBjb250cm9s
cyB0byBkcmF3IGluIHRoZSByaWdodCBwbGFjZS4KKyAgICB2b2lkIGJlZ2luVHJhbnNwYXJlbmN5
TGF5ZXIoKSB7IG1fdHJhbnNwYXJlbmN5Q291bnQrKzsgfQorICAgIHZvaWQgZW5kVHJhbnNwYXJl
bmN5TGF5ZXIoKSB7IG1fdHJhbnNwYXJlbmN5Q291bnQtLTsgfQogI2VuZGlmCi19Ci0KLUZsb2F0
UmVjdCBHcmFwaGljc0NvbnRleHQ6OnJvdW5kVG9EZXZpY2VQaXhlbHMoY29uc3QgRmxvYXRSZWN0
JiBmcmVjdCkKLXsKLSAgICBGbG9hdFJlY3QgcmVzdWx0OwotICAgIGRvdWJsZSB4ID0gZnJlY3Qu
eCgpOwotICAgIGRvdWJsZSB5ID0gZnJlY3QueSgpOwotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRh
LT5jcjsKLSAgICBjYWlyb191c2VyX3RvX2RldmljZShjciwgJngsICZ5KTsKLSAgICB4ID0gcm91
bmQoeCk7Ci0gICAgeSA9IHJvdW5kKHkpOwotICAgIGNhaXJvX2RldmljZV90b191c2VyKGNyLCAm
eCwgJnkpOwotICAgIHJlc3VsdC5zZXRYKHN0YXRpY19jYXN0PGZsb2F0Pih4KSk7Ci0gICAgcmVz
dWx0LnNldFkoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHkpKTsKLSAgICB4ID0gZnJlY3Qud2lkdGgoKTsK
LSAgICB5ID0gZnJlY3QuaGVpZ2h0KCk7Ci0gICAgY2Fpcm9fdXNlcl90b19kZXZpY2VfZGlzdGFu
Y2UoY3IsICZ4LCAmeSk7Ci0gICAgeCA9IHJvdW5kKHgpOwotICAgIHkgPSByb3VuZCh5KTsKLSAg
ICBjYWlyb19kZXZpY2VfdG9fdXNlcl9kaXN0YW5jZShjciwgJngsICZ5KTsKLSAgICByZXN1bHQu
c2V0V2lkdGgoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHgpKTsKLSAgICByZXN1bHQuc2V0SGVpZ2h0KHN0
YXRpY19jYXN0PGZsb2F0Pih5KSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQ6OnRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5KQotewotICAgIGlmIChwYWlu
dGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9k
YXRhLT5jcjsKLSAgICBjYWlyb190cmFuc2xhdGUoY3IsIHgsIHkpOwotfQotCi1JbnRQb2ludCBH
cmFwaGljc0NvbnRleHQ6Om9yaWdpbigpCi17Ci0gICAgY2Fpcm9fbWF0cml4X3QgbWF0cml4Owot
ICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLSAgICBjYWlyb19nZXRfbWF0cml4KGNyLCAm
bWF0cml4KTsKLSAgICByZXR1cm4gSW50UG9pbnQoc3RhdGljX2Nhc3Q8aW50PihtYXRyaXgueDAp
LCBzdGF0aWNfY2FzdDxpbnQ+KG1hdHJpeC55MCkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4
dDo6c2V0UGxhdGZvcm1GaWxsQ29sb3IoY29uc3QgQ29sb3ImIGNvbCkKLXsKLSAgICAvLyBGSVhN
RTogdGhpcyBpcyBwcm9iYWJseSBhIG5vLW9wIGJ1dCBJJ20gbm90IHN1cmUKLSAgICAvLyBub3RJ
bXBsZW1lbnRlZCgpOyAvLyBjb21tZW50ZWQtb3V0IGJlY2F1c2UgaXQncyBjaGF0dHkgYW5kIGNs
dXR0ZXJzIG91dHB1dAotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TdHJv
a2VDb2xvcihjb25zdCBDb2xvciYgY29sKQotewotICAgIC8vIEZJWE1FOiB0aGlzIGlzIHByb2Jh
Ymx5IGEgbm8tb3AgYnV0IEknbSBub3Qgc3VyZQotICAgIC8vbm90SW1wbGVtZW50ZWQoKTsgLy8g
Y29tbWVudGVkLW91dCBiZWNhdXNlIGl0J3MgY2hhdHR5IGFuZCBjbHV0dGVycyBvdXRwdXQKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtU3Ryb2tlVGhpY2tuZXNzKGZsb2F0
IHN0cm9rZVRoaWNrbmVzcykKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBjYWlyb19zZXRfbGluZV93aWR0aChtX2RhdGEtPmNyLCBzdHJva2VU
aGlja25lc3MpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TdHJva2VT
dHlsZShjb25zdCBTdHJva2VTdHlsZSYgc3Ryb2tlU3R5bGUpCi17Ci0gICAgc3RhdGljIGRvdWJs
ZSBkYXNoUGF0dGVybltdID0gezUuMCwgNS4wfTsKLSAgICBzdGF0aWMgZG91YmxlIGRvdFBhdHRl
cm5bXSA9IHsxLjAsIDEuMH07Ci0KLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBzd2l0Y2ggKHN0cm9rZVN0eWxlKSB7Ci0gICAgY2FzZSBOb1N0cm9r
ZToKLSAgICAgICAgLy8gRklYTUU6IGlzIGl0IHRoZSByaWdodCB3YXkgdG8gZW11bGF0ZSBOb1N0
cm9rZT8KLSAgICAgICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgobV9kYXRhLT5jciwgMCk7Ci0gICAg
ICAgIGJyZWFrOwotICAgIGNhc2UgU29saWRTdHJva2U6Ci0gICAgICAgIGNhaXJvX3NldF9kYXNo
KG1fZGF0YS0+Y3IsIDAsIDAsIDApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERvdHRlZFN0
cm9rZToKLSAgICAgICAgY2Fpcm9fc2V0X2Rhc2gobV9kYXRhLT5jciwgZG90UGF0dGVybiwgMiwg
MCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRGFzaGVkU3Ryb2tlOgotICAgICAgICBjYWly
b19zZXRfZGFzaChtX2RhdGEtPmNyLCBkYXNoUGF0dGVybiwgMiwgMCk7Ci0gICAgICAgIGJyZWFr
OwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgICAgIGJyZWFr
OwotICAgIH0KLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFVSTEZvclJlY3QoY29uc3Qg
S1VSTCYgbGluaywgY29uc3QgSW50UmVjdCYgZGVzdFJlY3QpCi17Ci0gICAgbm90SW1wbGVtZW50
ZWQoKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNvbmNhdENUTShjb25zdCBBZmZpbmVU
cmFuc2Zvcm0mIHRyYW5zZm9ybSkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY29uc3Qg
Y2Fpcm9fbWF0cml4X3QqIG1hdHJpeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2Fpcm9fbWF0
cml4X3QqPigmdHJhbnNmb3JtKTsKLSAgICBjYWlyb190cmFuc2Zvcm0oY3IsIG1hdHJpeCk7Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjphZGRJbm5lclJvdW5kZWRSZWN0Q2xpcChjb25zdCBJ
bnRSZWN0JiByZWN0LCBpbnQgdGhpY2tuZXNzKQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVk
KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNsaXAocmVjdCk7Ci0KLSAgICBQYXRoIHA7Ci0g
ICAgRmxvYXRSZWN0IHIocmVjdCk7Ci0gICAgLy8gQWRkIG91dGVyIGVsbGlwc2UKLSAgICBwLmFk
ZEVsbGlwc2Uocik7Ci0gICAgLy8gQWRkIGlubmVyIGVsbGlwc2UKLSAgICByLmluZmxhdGUoLXRo
aWNrbmVzcyk7Ci0gICAgcC5hZGRFbGxpcHNlKHIpOwotICAgIGFkZFBhdGgocCk7Ci0KLSAgICBj
YWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fZmlsbF9ydWxlX3Qgc2F2ZWRGaWxs
UnVsZSA9IGNhaXJvX2dldF9maWxsX3J1bGUoY3IpOwotICAgIGNhaXJvX3NldF9maWxsX3J1bGUo
Y3IsIENBSVJPX0ZJTExfUlVMRV9FVkVOX09ERCk7Ci0gICAgY2Fpcm9fY2xpcChjcik7Ci0gICAg
Y2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgc2F2ZWRGaWxsUnVsZSk7Ci19Ci0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQ6OnNldFNoYWRvdyhJbnRTaXplIGNvbnN0JiwgaW50LCBDb2xvciBjb25zdCYp
Ci17Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNs
ZWFyU2hhZG93KCkKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDo6YmVnaW5UcmFuc3BhcmVuY3lMYXllcihmbG9hdCBvcGFjaXR5KQotewotICAgIGlm
IChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNy
ID0gbV9kYXRhLT5jcjsKLSAgICBjYWlyb19wdXNoX2dyb3VwKGNyKTsKLSAgICBtX2RhdGEtPmxh
eWVycy5hcHBlbmQob3BhY2l0eSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjplbmRUcmFu
c3BhcmVuY3lMYXllcigpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotCi0gICAgY2Fpcm9fcG9w
X2dyb3VwX3RvX3NvdXJjZShjcik7Ci0gICAgY2Fpcm9fcGFpbnRfd2l0aF9hbHBoYShjciwgbV9k
YXRhLT5sYXllcnMubGFzdCgpKTsKLSAgICBtX2RhdGEtPmxheWVycy5yZW1vdmVMYXN0KCk7Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGVhclJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0
KQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAg
IGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLQotICAgIGNhaXJvX3NhdmUoY3IpOwotICAgIGNh
aXJvX3JlY3RhbmdsZShjciwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3Qu
aGVpZ2h0KCkpOwotICAgIGNhaXJvX3NldF9vcGVyYXRvcihjciwgQ0FJUk9fT1BFUkFUT1JfQ0xF
QVIpOwotICAgIGNhaXJvX2ZpbGwoY3IpOwotICAgIGNhaXJvX3Jlc3RvcmUoY3IpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDo6c3Ryb2tlUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGZs
b2F0IHdpZHRoKQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLSAgICBjYWlyb19zYXZlKGNyKTsK
LSAgICBjYWlyb19yZWN0YW5nbGUoY3IsIHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgp
LCByZWN0LmhlaWdodCgpKTsKLSAgICBzZXRDb2xvcihjciwgc3Ryb2tlQ29sb3IoKSk7Ci0gICAg
Y2Fpcm9fc2V0X2xpbmVfd2lkdGgoY3IsIHdpZHRoKTsKLSAgICBjYWlyb19zdHJva2UoY3IpOwot
ICAgIGNhaXJvX3Jlc3RvcmUoY3IpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0TGlu
ZUNhcChMaW5lQ2FwIGxpbmVDYXApCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fbGluZV9jYXBfdCBjYWlyb0NhcCA9IENBSVJPX0xJ
TkVfQ0FQX0JVVFQ7Ci0gICAgc3dpdGNoIChsaW5lQ2FwKSB7Ci0gICAgICAgIGNhc2UgQnV0dENh
cDoKLSAgICAgICAgICAgIC8vIG5vLW9wCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2Fz
ZSBSb3VuZENhcDoKLSAgICAgICAgICAgIGNhaXJvQ2FwID0gQ0FJUk9fTElORV9DQVBfUk9VTkQ7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTcXVhcmVDYXA6Ci0gICAgICAgICAg
ICBjYWlyb0NhcCA9IENBSVJPX0xJTkVfQ0FQX1NRVUFSRTsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgIH0KLSAgICBjYWlyb19zZXRfbGluZV9jYXAobV9kYXRhLT5jciwgY2Fpcm9DYXApOwotfQot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0TGluZUpvaW4oTGluZUpvaW4gbGluZUpvaW4pCi17
Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fp
cm9fbGluZV9qb2luX3QgY2Fpcm9Kb2luID0gQ0FJUk9fTElORV9KT0lOX01JVEVSOwotICAgIHN3
aXRjaCAobGluZUpvaW4pIHsKLSAgICAgICAgY2FzZSBNaXRlckpvaW46Ci0gICAgICAgICAgICAv
LyBuby1vcAotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUm91bmRKb2luOgotICAg
ICAgICAgICAgY2Fpcm9Kb2luID0gQ0FJUk9fTElORV9KT0lOX1JPVU5EOwotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIGNhc2UgQmV2ZWxKb2luOgotICAgICAgICAgICAgY2Fpcm9Kb2luID0g
Q0FJUk9fTElORV9KT0lOX0JFVkVMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNh
aXJvX3NldF9saW5lX2pvaW4obV9kYXRhLT5jciwgY2Fpcm9Kb2luKTsKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQ6OnNldE1pdGVyTGltaXQoZmxvYXQgbWl0ZXIpCi17Ci0gICAgaWYgKHBhaW50
aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fc2V0X21pdGVyX2xp
bWl0KG1fZGF0YS0+Y3IsIG1pdGVyKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldEFs
cGhhKGZsb2F0KQotewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUg
Y2Fpcm9fb3BlcmF0b3JfdCB0b0NhaXJvT3BlcmF0b3IoQ29tcG9zaXRlT3BlcmF0b3Igb3ApCi17
Ci0gICAgc3dpdGNoIChvcCkgewotICAgICAgICBjYXNlIENvbXBvc2l0ZUNsZWFyOgotICAgICAg
ICAgICAgcmV0dXJuIENBSVJPX09QRVJBVE9SX0NMRUFSOwotICAgICAgICBjYXNlIENvbXBvc2l0
ZUNvcHk6Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfU09VUkNFOwotICAgICAg
ICBjYXNlIENvbXBvc2l0ZVNvdXJjZU92ZXI6Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BF
UkFUT1JfT1ZFUjsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VJbjoKLSAgICAgICAgICAg
IHJldHVybiBDQUlST19PUEVSQVRPUl9JTjsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VP
dXQ6Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfT1VUOwotICAgICAgICBjYXNl
IENvbXBvc2l0ZVNvdXJjZUF0b3A6Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1Jf
QVRPUDsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlvbk92ZXI6Ci0gICAgICAgICAg
ICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfREVTVF9PVkVSOwotICAgICAgICBjYXNlIENvbXBvc2l0
ZURlc3RpbmF0aW9uSW46Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfREVTVF9J
TjsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlvbk91dDoKLSAgICAgICAgICAgIHJl
dHVybiBDQUlST19PUEVSQVRPUl9ERVNUX09VVDsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVEZXN0
aW5hdGlvbkF0b3A6Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfREVTVF9BVE9Q
OwotICAgICAgICBjYXNlIENvbXBvc2l0ZVhPUjoKLSAgICAgICAgICAgIHJldHVybiBDQUlST19P
UEVSQVRPUl9YT1I7Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRlUGx1c0RhcmtlcjoKLSAgICAgICAg
ICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9TQVRVUkFURTsKLSAgICAgICAgY2FzZSBDb21wb3Np
dGVIaWdobGlnaHQ6Ci0gICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBDYWlybyBlcXVpdmFsZW50
IGZvciBDb21wb3NpdGVIaWdobGlnaHQuCi0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFU
T1JfT1ZFUjsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVQbHVzTGlnaHRlcjoKLSAgICAgICAgICAg
IHJldHVybiBDQUlST19PUEVSQVRPUl9BREQ7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAg
ICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfU09VUkNFOwotICAgIH0KLX0KIAotdm9pZCBHcmFwaGlj
c0NvbnRleHQ6OnNldENvbXBvc2l0ZU9wZXJhdGlvbihDb21wb3NpdGVPcGVyYXRvciBvcCkKLXsK
LSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjYWly
b19zZXRfb3BlcmF0b3IobV9kYXRhLT5jciwgdG9DYWlyb09wZXJhdG9yKG9wKSk7Ci19Ci0KLXZv
aWQgR3JhcGhpY3NDb250ZXh0OjpiZWdpblBhdGgoKQotewotICAgIGlmIChwYWludGluZ0Rpc2Fi
bGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsK
LSAgICBjYWlyb19uZXdfcGF0aChjcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjphZGRQ
YXRoKGNvbnN0IFBhdGgmIHBhdGgpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotICAgIGNhaXJv
X3BhdGhfdCogcCA9IGNhaXJvX2NvcHlfcGF0aChwYXRoLnBsYXRmb3JtUGF0aCgpLT5tX2NyKTsK
LSAgICBjYWlyb19hcHBlbmRfcGF0aChjciwgcCk7Ci0gICAgY2Fpcm9fcGF0aF9kZXN0cm95KHAp
OwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcChjb25zdCBQYXRoJiBwYXRoKQotewot
ICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJv
X3QqIGNyID0gbV9kYXRhLT5jcjsKLSAgICBjYWlyb19wYXRoX3QqIHAgPSBjYWlyb19jb3B5X3Bh
dGgocGF0aC5wbGF0Zm9ybVBhdGgoKS0+bV9jcik7Ci0gICAgY2Fpcm9fYXBwZW5kX3BhdGgoY3Is
IHApOwotICAgIGNhaXJvX3BhdGhfZGVzdHJveShwKTsKLSAgICBjYWlyb19maWxsX3J1bGVfdCBz
YXZlZEZpbGxSdWxlID0gY2Fpcm9fZ2V0X2ZpbGxfcnVsZShjcik7Ci0gICAgY2Fpcm9fc2V0X2Zp
bGxfcnVsZShjciwgQ0FJUk9fRklMTF9SVUxFX1dJTkRJTkcpOwotICAgIGNhaXJvX2NsaXAoY3Ip
OwotICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIHNhdmVkRmlsbFJ1bGUpOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDo6Y2xpcE91dChjb25zdCBQYXRoJiBwYXRoKQotewotICAgIGlmIChw
YWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0g
bV9kYXRhLT5jcjsKLSAgICBkb3VibGUgeDEsIHkxLCB4MiwgeTI7Ci0gICAgY2Fpcm9fY2xpcF9l
eHRlbnRzKGNyLCAmeDEsICZ5MSwgJngyLCAmeTIpOwotICAgIGNhaXJvX3JlY3RhbmdsZShjciwg
eDEsIHkxLCB4MiAtIHgxLCB5MiAtIHkxKTsKLSAgICBhZGRQYXRoKHBhdGgpOwotCi0gICAgY2Fp
cm9fZmlsbF9ydWxlX3Qgc2F2ZWRGaWxsUnVsZSA9IGNhaXJvX2dldF9maWxsX3J1bGUoY3IpOwot
ICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIENBSVJPX0ZJTExfUlVMRV9FVkVOX09ERCk7Ci0g
ICAgY2Fpcm9fY2xpcChjcik7Ci0gICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgc2F2ZWRGaWxs
UnVsZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0Ojpyb3RhdGUoZmxvYXQgcmFkaWFucykK
LXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBj
YWlyb19yb3RhdGUobV9kYXRhLT5jciwgcmFkaWFucyk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0OjpzY2FsZShjb25zdCBGbG9hdFNpemUmIHNpemUpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlz
YWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fc2NhbGUobV9kYXRhLT5jciwg
c2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6
OmNsaXBPdXQoY29uc3QgSW50UmVjdCYgcikKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgp
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAg
ZG91YmxlIHgxLCB5MSwgeDIsIHkyOwotICAgIGNhaXJvX2NsaXBfZXh0ZW50cyhjciwgJngxLCAm
eTEsICZ4MiwgJnkyKTsKLSAgICBjYWlyb19yZWN0YW5nbGUoY3IsIHgxLCB4MiwgeDIgLSB4MSwg
eTIgLSB5MSk7Ci0gICAgY2Fpcm9fcmVjdGFuZ2xlKGNyLCByLngoKSwgci55KCksIHIud2lkdGgo
KSwgci5oZWlnaHQoKSk7Ci0gICAgY2Fpcm9fZmlsbF9ydWxlX3Qgc2F2ZWRGaWxsUnVsZSA9IGNh
aXJvX2dldF9maWxsX3J1bGUoY3IpOwotICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIENBSVJP
X0ZJTExfUlVMRV9FVkVOX09ERCk7Ci0gICAgY2Fpcm9fY2xpcChjcik7Ci0gICAgY2Fpcm9fc2V0
X2ZpbGxfcnVsZShjciwgc2F2ZWRGaWxsUnVsZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
OjpjbGlwT3V0RWxsaXBzZUluUmVjdChjb25zdCBJbnRSZWN0JiByKQotewotICAgIGlmIChwYWlu
dGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFBhdGggcDsKLSAgICBwLmFk
ZEVsbGlwc2Uocik7Ci0gICAgY2xpcE91dChwKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6
OmZpbGxSb3VuZGVkUmVjdChjb25zdCBJbnRSZWN0JiByLCBjb25zdCBJbnRTaXplJiB0b3BMZWZ0
LCBjb25zdCBJbnRTaXplJiB0b3BSaWdodCwgY29uc3QgSW50U2l6ZSYgYm90dG9tTGVmdCwgY29u
c3QgSW50U2l6ZSYgYm90dG9tUmlnaHQsIGNvbnN0IENvbG9yJiBjb2xvcikKLXsKLSAgICBpZiAo
cGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9
IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fc2F2ZShjcik7Ci0gICAgYmVnaW5QYXRoKCk7Ci0gICAg
YWRkUGF0aChQYXRoOjpjcmVhdGVSb3VuZGVkUmVjdGFuZ2xlKHIsIHRvcExlZnQsIHRvcFJpZ2h0
LCBib3R0b21MZWZ0LCBib3R0b21SaWdodCkpOwotICAgIHNldENvbG9yKGNyLCBjb2xvcik7Ci0g
ICAgY2Fpcm9fZmlsbChjcik7Ci0gICAgY2Fpcm9fcmVzdG9yZShjcik7Ci19CisgICAgY2Fpcm9f
dCogY3I7CisgICAgVmVjdG9yPGZsb2F0PiBsYXllcnM7CiAKICNpZiBQTEFURk9STShHVEspCi12
b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0R2RrRXhwb3NlRXZlbnQoR2RrRXZlbnRFeHBvc2UqIGV4
cG9zZSkKLXsKLSAgICBtX2RhdGEtPmV4cG9zZSA9IGV4cG9zZTsKLX0KLQotR2RrRXZlbnRFeHBv
c2UqIEdyYXBoaWNzQ29udGV4dDo6Z2RrRXhwb3NlRXZlbnQoKSBjb25zdAotewotICAgIHJldHVy
biBtX2RhdGEtPmV4cG9zZTsKLX0KLQotR2RrRHJhd2FibGUqIEdyYXBoaWNzQ29udGV4dDo6Z2Rr
RHJhd2FibGUoKSBjb25zdAotewotICAgIGlmICghbV9kYXRhLT5leHBvc2UpCi0gICAgICAgIHJl
dHVybiAwOwotCi0gICAgcmV0dXJuIEdES19EUkFXQUJMRShtX2RhdGEtPmV4cG9zZS0+d2luZG93
KTsKLX0KLQotSW50UG9pbnQgR3JhcGhpY3NDb250ZXh0Ojp0cmFuc2xhdGVQb2ludChjb25zdCBJ
bnRQb2ludCYgcG9pbnQpIGNvbnN0Ci17Ci0gICAgY2Fpcm9fbWF0cml4X3QgdG07Ci0gICAgY2Fp
cm9fZ2V0X21hdHJpeChtX2RhdGEtPmNyLCAmdG0pOwotICAgIGRvdWJsZSB4ID0gcG9pbnQueCgp
OwotICAgIGRvdWJsZSB5ID0gcG9pbnQueSgpOwotCi0gICAgY2Fpcm9fbWF0cml4X3RyYW5zZm9y
bV9wb2ludCgmdG0sICZ4LCAmeSk7Ci0gICAgcmV0dXJuIEludFBvaW50KHgsIHkpOwotfQorICAg
IEdka0V2ZW50RXhwb3NlKiBleHBvc2U7CisjZWxpZiBQTEFURk9STShXSU4pCisgICAgSERDIG1f
aGRjOworICAgIHVuc2lnbmVkIG1fdHJhbnNwYXJlbmN5Q291bnQ7CiAjZW5kaWYKLQotdm9pZCBH
cmFwaGljc0NvbnRleHQ6OnNldFVzZUFudGlhbGlhc2luZyhib29sIGVuYWJsZSkKLXsKLSAgICBp
ZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBXaGVuIHRy
dWUsIHVzZSB0aGUgZGVmYXVsdCBDYWlybyBiYWNrZW5kIGFudGlhbGlhcyBtb2RlICh1c3VhbGx5
IHRoaXMKLSAgICAvLyBlbmFibGVzIHN0YW5kYXJkICdncmF5c2NhbGUnIGFudGlhbGlhc2luZyk7
IGZhbHNlIHRvIGV4cGxpY2l0bHkgZGlzYWJsZQotICAgIC8vIGFudGlhbGlhc2luZy4gVGhpcyBp
cyB0aGUgc2FtZSBzdHJhdGVneSBhcyB1c2VkIGluIGRyYXdDb252ZXhQb2x5Z29uKCkuCi0gICAg
Y2Fpcm9fc2V0X2FudGlhbGlhcyhtX2RhdGEtPmNyLCBlbmFibGUgPyBDQUlST19BTlRJQUxJQVNf
REVGQVVMVCA6IENBSVJPX0FOVElBTElBU19OT05FKTsKLX0KK307CiAKIH0gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKIAotI2VuZGlmIC8vIFBMQVRGT1JNKENBSVJPKQpJbmRleDogV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHRDRy5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHRDRy5jcHAJKHJldmlzaW9u
IDMwMDQ4KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHRD
Ry5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3LDExICsyNyw5IEBACiAjaW5jbHVkZSAiY29uZmln
LmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCiAKLSNpZiBQTEFURk9STShDRykKLQog
I2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgogI2luY2x1ZGUgIkZsb2F0Q29udmVyc2lvbi5o
IgotI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZS5oIgorI2luY2x1ZGUg
IkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZUNHLmgiCiAjaW5jbHVkZSAiS1VSTC5oIgog
I2luY2x1ZGUgIlBhdGguaCIKICNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ0dQREZDb250ZXh0Lmg+
CkBAIC04Myw3ICs4MSw3IEBAIENHQ29udGV4dFJlZiBHcmFwaGljc0NvbnRleHQ6OnBsYXRmb3Jt
Q28KIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzYXZlUGxhdGZvcm1TdGF0ZSgpCiB7CiAgICAgLy8g
Tm90ZTogRG8gbm90IHVzZSB0aGlzIGZ1bmN0aW9uIHdpdGhpbiB0aGlzIGNsYXNzIGltcGxlbWVu
dGF0aW9uLCBzaW5jZSB3ZSB3YW50IHRvIGF2b2lkIHRoZSBleHRyYQotICAgIC8vIHNhdmUgb2Yg
dGhlIHNlY29uZGFyeSBjb250ZXh0IChpbiBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUu
aCkuCisgICAgLy8gc2F2ZSBvZiB0aGUgc2Vjb25kYXJ5IGNvbnRleHQgKGluIEdyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZUNHLmgpLgogICAgIENHQ29udGV4dFNhdmVHU3RhdGUocGxhdGZv
cm1Db250ZXh0KCkpOwogICAgIG1fZGF0YS0+c2F2ZSgpOwogfQpAQCAtOTEsNyArODksNyBAQCB2
b2lkIEdyYXBoaWNzQ29udGV4dDo6c2F2ZVBsYXRmb3JtU3RhdGUoCiB2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6cmVzdG9yZVBsYXRmb3JtU3RhdGUoKQogewogICAgIC8vIE5vdGU6IERvIG5vdCB1c2Ug
dGhpcyBmdW5jdGlvbiB3aXRoaW4gdGhpcyBjbGFzcyBpbXBsZW1lbnRhdGlvbiwgc2luY2Ugd2Ug
d2FudCB0byBhdm9pZCB0aGUgZXh0cmEKLSAgICAvLyByZXN0b3JlIG9mIHRoZSBzZWNvbmRhcnkg
Y29udGV4dCAoaW4gR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmgpLgorICAgIC8vIHJl
c3RvcmUgb2YgdGhlIHNlY29uZGFyeSBjb250ZXh0IChpbiBHcmFwaGljc0NvbnRleHRQbGF0Zm9y
bVByaXZhdGVDRy5oKS4KICAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKHBsYXRmb3JtQ29udGV4
dCgpKTsKICAgICBtX2RhdGEtPnJlc3RvcmUoKTsKICAgICBtX2RhdGEtPm1fdXNlclRvRGV2aWNl
VHJhbnNmb3JtS25vd25Ub0JlSWRlbnRpdHkgPSBmYWxzZTsKQEAgLTkzMCw0ICs5MjgsMyBAQCB2
b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0Q29tcG9zaXRlT3BlcmF0CiAgICAgCiB9CiAKLSNlbmRp
ZiAvLyBQTEFURk9STShDRykKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvR3Jh
cGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUuaAkocmV2aXNp
b24gMzAwNDgpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NnL0dyYXBoaWNzQ29udGV4
dFBsYXRmb3JtUHJpdmF0ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0g
KiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09N
UFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
LSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01Q
VVRFUiwgSU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKLSAqLwotCi0jaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NHQ29udGV4dC5oPgotCi1uYW1lc3Bh
Y2UgV2ViQ29yZSB7Ci0KLWNsYXNzIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSB7Ci1w
dWJsaWM6Ci0gICAgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKENHQ29udGV4dFJlZiBj
Z0NvbnRleHQpCi0gICAgICAgIDogbV9jZ0NvbnRleHQoY2dDb250ZXh0KQotI2lmIFBMQVRGT1JN
KFdJTikKLSAgICAgICAgLCBtX2hkYygwKQotICAgICAgICAsIG1fdHJhbnNwYXJlbmN5Q291bnQo
MCkKLSNlbmRpZgotICAgICAgICAsIG1fdXNlclRvRGV2aWNlVHJhbnNmb3JtS25vd25Ub0JlSWRl
bnRpdHkoZmFsc2UpCi0gICAgewotICAgICAgICBDR0NvbnRleHRSZXRhaW4obV9jZ0NvbnRleHQp
OwotICAgIH0KLSAgICAKLSAgICB+R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKCkKLSAg
ICB7Ci0gICAgICAgIENHQ29udGV4dFJlbGVhc2UobV9jZ0NvbnRleHQpOwotICAgIH0KLQotI2lm
IFBMQVRGT1JNKE1BQykKLSAgICAvLyBUaGVzZSBtZXRob2RzIGRvIG5vdGhpbmcgb24gTWFjLgot
ICAgIHZvaWQgc2F2ZSgpIHt9Ci0gICAgdm9pZCByZXN0b3JlKCkge30KLSAgICB2b2lkIGNsaXAo
Y29uc3QgSW50UmVjdCYpIHt9Ci0gICAgdm9pZCBjbGlwKGNvbnN0IFBhdGgmKSB7fQotICAgIHZv
aWQgc2NhbGUoY29uc3QgRmxvYXRTaXplJikge30KLSAgICB2b2lkIHJvdGF0ZShmbG9hdCkge30K
LSAgICB2b2lkIHRyYW5zbGF0ZShmbG9hdCwgZmxvYXQpIHt9Ci0gICAgdm9pZCBjb25jYXRDVE0o
Y29uc3QgQWZmaW5lVHJhbnNmb3JtJikge30KLSAgICB2b2lkIGJlZ2luVHJhbnNwYXJlbmN5TGF5
ZXIoKSB7fQotICAgIHZvaWQgZW5kVHJhbnNwYXJlbmN5TGF5ZXIoKSB7fQotI2VuZGlmCi0KLSNp
ZiBQTEFURk9STShXSU4pCi0gICAgLy8gT24gV2luZG93cywgd2UgbmVlZCB0byB1cGRhdGUgdGhl
IEhEQyBmb3IgZm9ybSBjb250cm9scyB0byBkcmF3IGluIHRoZSByaWdodCBwbGFjZS4KLSAgICB2
b2lkIHNhdmUoKTsKLSAgICB2b2lkIHJlc3RvcmUoKTsKLSAgICB2b2lkIGNsaXAoY29uc3QgSW50
UmVjdCYpOwotICAgIHZvaWQgY2xpcChjb25zdCBQYXRoJik7Ci0gICAgdm9pZCBzY2FsZShjb25z
dCBGbG9hdFNpemUmKTsKLSAgICB2b2lkIHJvdGF0ZShmbG9hdCk7Ci0gICAgdm9pZCB0cmFuc2xh
dGUoZmxvYXQsIGZsb2F0KTsKLSAgICB2b2lkIGNvbmNhdENUTShjb25zdCBBZmZpbmVUcmFuc2Zv
cm0mKTsKLSAgICB2b2lkIGJlZ2luVHJhbnNwYXJlbmN5TGF5ZXIoKSB7IG1fdHJhbnNwYXJlbmN5
Q291bnQrKzsgfQotICAgIHZvaWQgZW5kVHJhbnNwYXJlbmN5TGF5ZXIoKSB7IG1fdHJhbnNwYXJl
bmN5Q291bnQtLTsgfQotI2VuZGlmCi0KLSNpZiBQTEFURk9STShXSU4pCi0gICAgSERDIG1faGRj
OwotICAgIHVuc2lnbmVkIG1fdHJhbnNwYXJlbmN5Q291bnQ7Ci0jZW5kaWYKLQotICAgIENHQ29u
dGV4dFJlZiBtX2NnQ29udGV4dDsKLSAgICBib29sIG1fdXNlclRvRGV2aWNlVHJhbnNmb3JtS25v
d25Ub0JlSWRlbnRpdHk7Ci19OwotCi19CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2NnL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZUNHLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVD
Ry5oCShyZXZpc2lvbiAyOTcyNikJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9H
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUuaDoyOTcyNikKKysrIFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2cvR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlQ0cuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgPENvcmVH
cmFwaGljcy9DR0NvbnRleHQuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBHcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUgeworcHVibGljOgorICAgIEdyYXBoaWNzQ29udGV4
dFBsYXRmb3JtUHJpdmF0ZShDR0NvbnRleHRSZWYgY2dDb250ZXh0KQorICAgICAgICA6IG1fY2dD
b250ZXh0KGNnQ29udGV4dCkKKyNpZiBQTEFURk9STShXSU4pCisgICAgICAgICwgbV9oZGMoMCkK
KyAgICAgICAgLCBtX3RyYW5zcGFyZW5jeUNvdW50KDApCisjZW5kaWYKKyAgICAgICAgLCBtX3Vz
ZXJUb0RldmljZVRyYW5zZm9ybUtub3duVG9CZUlkZW50aXR5KGZhbHNlKQorICAgIHsKKyAgICAg
ICAgQ0dDb250ZXh0UmV0YWluKG1fY2dDb250ZXh0KTsKKyAgICB9CisgICAgCisgICAgfkdyYXBo
aWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpCisgICAgeworICAgICAgICBDR0NvbnRleHRSZWxl
YXNlKG1fY2dDb250ZXh0KTsKKyAgICB9CisKKyNpZiBQTEFURk9STShNQUMpCisgICAgLy8gVGhl
c2UgbWV0aG9kcyBkbyBub3RoaW5nIG9uIE1hYy4KKyAgICB2b2lkIHNhdmUoKSB7fQorICAgIHZv
aWQgcmVzdG9yZSgpIHt9CisgICAgdm9pZCBjbGlwKGNvbnN0IEludFJlY3QmKSB7fQorICAgIHZv
aWQgY2xpcChjb25zdCBQYXRoJikge30KKyAgICB2b2lkIHNjYWxlKGNvbnN0IEZsb2F0U2l6ZSYp
IHt9CisgICAgdm9pZCByb3RhdGUoZmxvYXQpIHt9CisgICAgdm9pZCB0cmFuc2xhdGUoZmxvYXQs
IGZsb2F0KSB7fQorICAgIHZvaWQgY29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYpIHt9
CisgICAgdm9pZCBiZWdpblRyYW5zcGFyZW5jeUxheWVyKCkge30KKyAgICB2b2lkIGVuZFRyYW5z
cGFyZW5jeUxheWVyKCkge30KKyNlbmRpZgorCisjaWYgUExBVEZPUk0oV0lOKQorICAgIC8vIE9u
IFdpbmRvd3MsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBIREMgZm9yIGZvcm0gY29udHJvbHMgdG8g
ZHJhdyBpbiB0aGUgcmlnaHQgcGxhY2UuCisgICAgdm9pZCBzYXZlKCk7CisgICAgdm9pZCByZXN0
b3JlKCk7CisgICAgdm9pZCBjbGlwKGNvbnN0IEludFJlY3QmKTsKKyAgICB2b2lkIGNsaXAoY29u
c3QgUGF0aCYpOworICAgIHZvaWQgc2NhbGUoY29uc3QgRmxvYXRTaXplJik7CisgICAgdm9pZCBy
b3RhdGUoZmxvYXQpOworICAgIHZvaWQgdHJhbnNsYXRlKGZsb2F0LCBmbG9hdCk7CisgICAgdm9p
ZCBjb25jYXRDVE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJik7CisgICAgdm9pZCBiZWdpblRyYW5z
cGFyZW5jeUxheWVyKCkgeyBtX3RyYW5zcGFyZW5jeUNvdW50Kys7IH0KKyAgICB2b2lkIGVuZFRy
YW5zcGFyZW5jeUxheWVyKCkgeyBtX3RyYW5zcGFyZW5jeUNvdW50LS07IH0KKyNlbmRpZgorCisj
aWYgUExBVEZPUk0oV0lOKQorICAgIEhEQyBtX2hkYzsKKyAgICB1bnNpZ25lZCBtX3RyYW5zcGFy
ZW5jeUNvdW50OworI2VuZGlmCisKKyAgICBDR0NvbnRleHRSZWYgbV9jZ0NvbnRleHQ7CisgICAg
Ym9vbCBtX3VzZXJUb0RldmljZVRyYW5zZm9ybUtub3duVG9CZUlkZW50aXR5OworfTsKKworfQpJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENHV2luLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250Q0dXaW4uY3BwCShyZXZp
c2lvbiAyOTgzNCkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udFdpbi5j
cHA6Mjk4MzQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250Q0dXaW4uY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJGb250LmgiCisKKyNpbmNsdWRlICJGb250RmFsbGJh
Y2tMaXN0LmgiCisjaW5jbHVkZSAiR2x5cGhCdWZmZXIuaCIKKyNpbmNsdWRlICJHcmFwaGljc0Nv
bnRleHQuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQu
aCIKKyNpbmNsdWRlICJTaW1wbGVGb250RGF0YS5oIgorI2luY2x1ZGUgIlVuaXNjcmliZUNvbnRy
b2xsZXIuaCIKKyNpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2Vydmlj
ZXMuaD4KKyNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJm
YWNlLmg+CisjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitjb25zdCBpbnQgc3ludGhldGljT2JsaXF1ZUFuZ2xlID0gMTQ7CisKK3ZvaWQgRm9udDo6
ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwgY29uc3QgU2ltcGxl
Rm9udERhdGEqIGZvbnQsIGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZlciwgCisgICAgICAg
ICAgICAgICAgICAgICAgaW50IGZyb20sIGludCBudW1HbHlwaHMsIGNvbnN0IEZsb2F0UG9pbnQm
IHBvaW50KSBjb25zdAoreworICAgIGlmIChmb250LT5tX2ZvbnQudXNlR0RJKCkpIHsKKyAgICAg
ICAgLy8gRklYTUU6IFN1cHBvcnQgYWxwaGEgYmxlbmRpbmcuCisgICAgICAgIC8vIEZJWE1FOiBT
dXBwb3J0IHRleHQgc3Ryb2tlL2ZpbGwuCisgICAgICAgIC8vIEZJWE1FOiBTdXBwb3J0IHRleHQg
c2hhZG93LgorICAgICAgICBDb2xvciBmaWxsQ29sb3IgPSBncmFwaGljc0NvbnRleHQtPmZpbGxD
b2xvcigpOworICAgICAgICBpZiAoZmlsbENvbG9yLmFscGhhKCkgPT0gMCkKKyAgICAgICAgICAg
IHJldHVybjsKKworICAgICAgICAvLyBXZSBoYXZlIHRvIGNvbnZlcnQgQ0cncyB0d28tZGltZW5z
aW9uYWwgZmxvYXRpbmcgcG9pbnQgYWR2YW5jZXMgdG8ganVzdCBob3Jpem9udGFsIGludGVnZXIg
YWR2YW5jZXMuCisgICAgICAgIFZlY3RvcjxpbnQsIDIwNDg+IGdkaUFkdmFuY2VzOworICAgICAg
ICBpbnQgdG90YWxXaWR0aCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtR2x5
cGhzOyBpKyspIHsKKyAgICAgICAgICAgIGdkaUFkdmFuY2VzLmFwcGVuZChscm91bmRmKGdseXBo
QnVmZmVyLmFkdmFuY2VBdChmcm9tICsgaSkpKTsKKyAgICAgICAgICAgIHRvdGFsV2lkdGggKz0g
Z2RpQWR2YW5jZXNbaV07CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBwdXQgc2xvcCBpbnRv
IHRoaXMgcmVjdCwgc2luY2UgZ2x5cGhzIGNhbiBvdmVyZmxvdyB0aGUgYXNjZW50L2Rlc2NlbnQg
Ym91bmRzIGFuZCB0aGUgbGVmdC9yaWdodCBlZGdlcy4KKyAgICAgICAgaW50IGxpbmVHYXAgPSBm
b250LT5saW5lR2FwKCk7CisgICAgICAgIEludFJlY3QgdGV4dFJlY3QocG9pbnQueCgpIC0gbGlu
ZUdhcCwgcG9pbnQueSgpIC0gZm9udC0+YXNjZW50KCkgLSBsaW5lR2FwLCB0b3RhbFdpZHRoICsg
MiAqIGxpbmVHYXAsIGZvbnQtPmxpbmVTcGFjaW5nKCkpOworICAgICAgICBIREMgaGRjID0gZ3Jh
cGhpY3NDb250ZXh0LT5nZXRXaW5kb3dzQ29udGV4dCh0ZXh0UmVjdCk7CisgICAgICAgIFNlbGVj
dE9iamVjdChoZGMsIGZvbnQtPm1fZm9udC5oZm9udCgpKTsKKworICAgICAgICAvLyBTZXQgdGhl
IGNvcnJlY3QgY29sb3IuCisgICAgICAgIEhEQyB0ZXh0RHJhd2luZ0RDID0gaGRjOworICAgICAg
ICAvKmlmIChmaWxsQ29sb3IuaGFzQWxwaGEoKSB8fCBncmFwaGljc0NvbnRleHQtPmluVHJhbnNw
YXJlbmN5TGF5ZXIoKSkgeworICAgICAgICAgICAgLy8gR0RJIGNhbid0IGhhbmRsZSBkcmF3aW5n
IHRyYW5zcGFyZW50IHRleHQuICBXZSBoYXZlIHRvIGRyYXcgaW50byBhIG1hc2suICBXZSBkcmF3
IGJsYWNrIHRleHQgb24gYSB3aGl0ZS1maWxsZWQgYmFja2dyb3VuZC4KKyAgICAgICAgICAgIC8v
IFdlIGFsc28gZG8gdGhpcyB3aGVuIGluc2lkZSB0cmFuc3BhcmVuY3kgbGF5ZXJzLCBzaW5jZSBH
REkgYWxzbyBjYW4ndCBkcmF3IG9udG8gYSBzdXJmYWNlIHdpdGggYWxwaGEuCisgICAgICAgICAg
ICBncmFwaGljc0NvbnRleHQtPnNhdmUoKTsKKyAgICAgICAgICAgIGdyYXBoaWNzQ29udGV4dC0+
c2V0RmlsbENvbG9yKENvbG9yOjp3aGl0ZSk7CisgICAgICAgICAgICB0ZXh0RHJhd2luZ0RDID0g
Z3JhcGhpY3NDb250ZXh0LT5nZXRXaW5kb3dzQml0bWFwQ29udGV4dCh0ZXh0UmVjdCk7CisgICAg
ICAgICAgICBTZXRUZXh0Q29sb3IoaGRjLCBSR0IoMCwgMCwgMCkpOworICAgICAgICB9IGVsc2Uq
LworICAgICAgICAgICAgU2V0VGV4dENvbG9yKGhkYywgUkdCKGZpbGxDb2xvci5yZWQoKSwgZmls
bENvbG9yLmdyZWVuKCksIGZpbGxDb2xvci5ibHVlKCkpKTsKKworICAgICAgICBTZXRCa01vZGUo
aGRjLCBUUkFOU1BBUkVOVCk7CisgICAgICAgIFNldFRleHRBbGlnbihoZGMsIFRBX0xFRlQgfCBU
QV9CQVNFTElORSk7CisKKyAgICAgICAgLy8gVW5pc2NyaWJlIGdpdmVzIHVzIG9mZnNldHMgdG8g
aGVscCByZWZpbmUgdGhlIHBvc2l0aW9uaW5nIG9mIGNvbWJpbmluZyBnbHlwaHMuCisgICAgICAg
IEZsb2F0U2l6ZSB0cmFuc2xhdGlvbiA9IGdseXBoQnVmZmVyLm9mZnNldEF0KGZyb20pOworICAg
ICAgICBpZiAodHJhbnNsYXRpb24ud2lkdGgoKSB8fCB0cmFuc2xhdGlvbi5oZWlnaHQoKSkgewor
ICAgICAgICAgICAgWEZPUk0geGZvcm07CisgICAgICAgICAgICB4Zm9ybS5lTTExID0gMS4wOwor
ICAgICAgICAgICAgeGZvcm0uZU0xMiA9IDA7CisgICAgICAgICAgICB4Zm9ybS5lTTIxID0gMDsK
KyAgICAgICAgICAgIHhmb3JtLmVNMjIgPSAxLjA7CisgICAgICAgICAgICB4Zm9ybS5lRHggPSB0
cmFuc2xhdGlvbi53aWR0aCgpOworICAgICAgICAgICAgeGZvcm0uZUR5ID0gdHJhbnNsYXRpb24u
aGVpZ2h0KCk7CisgICAgICAgICAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShoZGMsICZ4Zm9ybSwg
TVdUX0xFRlRNVUxUSVBMWSk7CisgICAgICAgIH0KKyAgICAgICAgRXh0VGV4dE91dChoZGMsIHBv
aW50LngoKSwgcG9pbnQueSgpLCBFVE9fR0xZUEhfSU5ERVgsIDAsIChXQ0hBUiopZ2x5cGhCdWZm
ZXIuZ2x5cGhzKGZyb20pLCBudW1HbHlwaHMsIGdkaUFkdmFuY2VzLmRhdGEoKSk7CisKKyAgICAg
ICAgLyppZiAoZmlsbENvbG9yLmhhc0FscGhhKCkgfHwgZ3JhcGhpY3NDb250ZXh0LT5pblRyYW5z
cGFyZW5jeUxheWVyKCkpIHsKKyAgICAgICAgICAgIC8vIFRPRE9EOiBXZSBoYXZlIHRvIHdhbGsg
dGhlIGJpdHMgb2YgdGhlIGJpdG1hcCBhbmQgaW52ZXJ0IHRoZW0uICBXZSBhbHNvIGNvcHkgb3Zl
ciB0aGUgZ3JlZW4gY29tcG9uZW50IHZhbHVlIGludG8gdGhlIGFscGhhIHZhbHVlCisgICAgICAg
ICAgICAvLyB0byBrZWVwIENsZWFyVHlwZSBsb29raW5nIHJlYXNvbmFibGUuCisKKyAgICAgICAg
ICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgZHJhd24gdGhlIHRleHQgaW50byBhIGJpdG1hcCBhbmQg
aW52ZXJ0ZWQgaXQsIG9idGFpbiBhIENHSW1hZ2VSZWYgbWFzay4KKyAgICAgICAgICAgIENHSW1h
Z2VSZWYgbWFzayA9IGdyYXBoaWNzQ29udGV4dC0+cmVsZWFzZVdpbmRvd3NCaXRtYXBDb250ZXh0
SW50b01hc2sodGV4dERyYXdpbmdEQywgdGV4dFJlY3QpOworICAgICAgICAgICAgCisgICAgICAg
ICAgICAvLyBBcHBseSB0aGUgbWFzayB0byB0aGUgZmlsbCBjb2xvci4KKyAgICAgICAgICAgIENH
Q29udGV4dFJlZiBiaXRtYXBDb250ZXh0ID0gZ3JhcGhpY3NDb250ZXh0LT5nZXRXaW5kb3dzQ29t
cGF0aWJsZUNHQml0bWFwQ29udGV4dCh0ZXh0UmVjdC5zaXplKCkpOworICAgICAgICAgICAgQ0dG
bG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKKyAgICAgICAgICAgIGNvbG9yLmdldFJHQkEo
cmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworICAgICAgICAgICAgQ0dDb250ZXh0U2V0UkdCRmls
bENvbG9yKGNvbnRleHQsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAgICAgICAgICAgIENH
Q29udGV4dEZpbGxSZWN0KGJpdG1hcENvbnRleHQsIEludFJlY3QoMCwgMCwgdGV4dFJlY3Qud2lk
dGgoKSwgdGV4dFJlY3QuaGVpZ2h0KCkpKTsKKyAgICAgICAgICAgIENHSW1hZ2VSZWYgZmlsbENv
bG9ySW1hZ2UgPSBDR0JpdG1hcENvbnRleHRDcmVhdGVJbWFnZShiaXRtYXBDb250ZXh0KTsKKyAg
ICAgICAgCisgICAgICAgICAgICAvLyBBcHBseSB0aGUgbWFzay4KKyAgICAgICAgICAgIENHSW1h
Z2VSZWYgZmluYWxJbWFnZSA9IENHSW1hZ2VDcmVhdGVXaXRoTWFzayhmaWxsQ29sb3JJbWFnZSwg
bWFzayk7CisKKyAgICAgICAgICAgIC8vIFRoZSBiaXRtYXAgaW1hZ2UgbmVlZHMgdG8gYmUgZHJh
d24gaW50byB0aGUgSERDLgorICAgICAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5kcmF3SW1hZ2VJ
bnRvV2luZG93c0NvbnRleHQoaGRjLCBmaW5hbEltYWdlKTsKKworICAgICAgICAgICAgLy8gUmVs
ZWFzZSBvdXIgaW1hZ2VzIGFuZCBjb250ZXh0cy4KKyAgICAgICAgICAgIENHSW1hZ2VSZWxlYXNl
KG1hc2spOworICAgICAgICAgICAgQ0dJbWFnZVJlbGVhc2UoZmlsbENvbG9ySW1hZ2UpOworICAg
ICAgICAgICAgQ0dJbWFnZVJlbGVhc2UoZmluYWxJbWFnZSk7CisgICAgICAgICAgICBDR0NvbnRl
eHRSZWxlYXNlKGJpdG1hcENvbnRleHQpOworICAgICAgICB9Ki8KKworICAgICAgICBncmFwaGlj
c0NvbnRleHQtPnJlbGVhc2VXaW5kb3dzQ29udGV4dChoZGMsIHRleHRSZWN0KTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIENHQ29udGV4dFJlZiBjZ0NvbnRleHQgPSBncmFwaGljc0Nv
bnRleHQtPnBsYXRmb3JtQ29udGV4dCgpOworCisgICAgdWludDMyX3Qgb2xkRm9udFNtb290aGlu
Z1N0eWxlID0gd2tTZXRGb250U21vb3RoaW5nU3R5bGUoY2dDb250ZXh0KTsKKworICAgIGNvbnN0
IEZvbnRQbGF0Zm9ybURhdGEmIHBsYXRmb3JtRGF0YSA9IGZvbnQtPnBsYXRmb3JtRGF0YSgpOwor
CisgICAgQ0dDb250ZXh0U2V0Rm9udChjZ0NvbnRleHQsIHBsYXRmb3JtRGF0YS5jZ0ZvbnQoKSk7
CisKKyAgICBDR0FmZmluZVRyYW5zZm9ybSBtYXRyaXggPSBDR0FmZmluZVRyYW5zZm9ybUlkZW50
aXR5OworICAgIG1hdHJpeC5iID0gLW1hdHJpeC5iOworICAgIG1hdHJpeC5kID0gLW1hdHJpeC5k
OworCisgICAgaWYgKHBsYXRmb3JtRGF0YS5zeW50aGV0aWNPYmxpcXVlKCkpCisgICAgeworICAg
ICAgICBzdGF0aWMgZmxvYXQgc2tldyA9IC10YW5mKHN5bnRoZXRpY09ibGlxdWVBbmdsZSAqIGFj
b3NmKDApIC8gOTApOworICAgICAgICBtYXRyaXggPSBDR0FmZmluZVRyYW5zZm9ybUNvbmNhdCht
YXRyaXgsIENHQWZmaW5lVHJhbnNmb3JtTWFrZSgxLCAwLCBza2V3LCAxLCAwLCAwKSk7CisgICAg
fQorCisgICAgLy8gVW5pc2NyaWJlIGdpdmVzIHVzIG9mZnNldHMgdG8gaGVscCByZWZpbmUgdGhl
IHBvc2l0aW9uaW5nIG9mIGNvbWJpbmluZyBnbHlwaHMuCisgICAgRmxvYXRTaXplIHRyYW5zbGF0
aW9uID0gZ2x5cGhCdWZmZXIub2Zmc2V0QXQoZnJvbSk7CisgICAgaWYgKHRyYW5zbGF0aW9uLndp
ZHRoKCkgfHwgdHJhbnNsYXRpb24uaGVpZ2h0KCkpCisgICAgICAgIENHQWZmaW5lVHJhbnNmb3Jt
VHJhbnNsYXRlKG1hdHJpeCwgdHJhbnNsYXRpb24ud2lkdGgoKSwgdHJhbnNsYXRpb24uaGVpZ2h0
KCkpOworICAgIAorICAgIENHQ29udGV4dFNldFRleHRNYXRyaXgoY2dDb250ZXh0LCBtYXRyaXgp
OworCisgICAgQ0dDb250ZXh0U2V0Rm9udFNpemUoY2dDb250ZXh0LCBwbGF0Zm9ybURhdGEuc2l6
ZSgpKTsKKyAgICBDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24oY2dDb250ZXh0LCBwb2ludC54KCks
IHBvaW50LnkoKSk7CisgICAgQ0dDb250ZXh0U2hvd0dseXBoc1dpdGhBZHZhbmNlcyhjZ0NvbnRl
eHQsIGdseXBoQnVmZmVyLmdseXBocyhmcm9tKSwgZ2x5cGhCdWZmZXIuYWR2YW5jZXMoZnJvbSks
IG51bUdseXBocyk7CisgICAgaWYgKGZvbnQtPm1fc3ludGhldGljQm9sZE9mZnNldCkgeworICAg
ICAgICBDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24oY2dDb250ZXh0LCBwb2ludC54KCkgKyBmb250
LT5tX3N5bnRoZXRpY0JvbGRPZmZzZXQsIHBvaW50LnkoKSk7CisgICAgICAgIENHQ29udGV4dFNo
b3dHbHlwaHNXaXRoQWR2YW5jZXMoY2dDb250ZXh0LCBnbHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSks
IGdseXBoQnVmZmVyLmFkdmFuY2VzKGZyb20pLCBudW1HbHlwaHMpOworICAgIH0KKworICAgIHdr
UmVzdG9yZUZvbnRTbW9vdGhpbmdTdHlsZShjZ0NvbnRleHQsIG9sZEZvbnRTbW9vdGhpbmdTdHls
ZSk7Cit9CisKK0Zsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQoY29u
c3QgVGV4dFJ1biYgcnVuLCBjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCBoLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IHRvKSBjb25z
dAoreworICAgIFVuaXNjcmliZUNvbnRyb2xsZXIgaXQodGhpcywgcnVuKTsKKyAgICBpdC5hZHZh
bmNlKGZyb20pOworICAgIGZsb2F0IGJlZm9yZVdpZHRoID0gaXQucnVuV2lkdGhTb0ZhcigpOwor
ICAgIGl0LmFkdmFuY2UodG8pOworICAgIGZsb2F0IGFmdGVyV2lkdGggPSBpdC5ydW5XaWR0aFNv
RmFyKCk7CisKKyAgICAvLyBVc2luZyByb3VuZGYoKSByYXRoZXIgdGhhbiBjZWlsZigpIGZvciB0
aGUgcmlnaHQgZWRnZSBhcyBhIGNvbXByb21pc2UgdG8gZW5zdXJlIGNvcnJlY3QgY2FyZXQgcG9z
aXRpb25pbmcKKyAgICBpZiAocnVuLnJ0bCgpKSB7CisgICAgICAgIGl0LmFkdmFuY2UocnVuLmxl
bmd0aCgpKTsKKyAgICAgICAgZmxvYXQgdG90YWxXaWR0aCA9IGl0LnJ1bldpZHRoU29GYXIoKTsK
KyAgICAgICAgcmV0dXJuIEZsb2F0UmVjdChwb2ludC54KCkgKyBmbG9vcmYodG90YWxXaWR0aCAt
IGFmdGVyV2lkdGgpLCBwb2ludC55KCksIHJvdW5kZih0b3RhbFdpZHRoIC0gYmVmb3JlV2lkdGgp
IC0gZmxvb3JmKHRvdGFsV2lkdGggLSBhZnRlcldpZHRoKSwgaCk7CisgICAgfSAKKyAgICAKKyAg
ICByZXR1cm4gRmxvYXRSZWN0KHBvaW50LngoKSArIGZsb29yZihiZWZvcmVXaWR0aCksIHBvaW50
LnkoKSwgcm91bmRmKGFmdGVyV2lkdGgpIC0gZmxvb3JmKGJlZm9yZVdpZHRoKSwgaCk7Cit9CisK
K3ZvaWQgRm9udDo6ZHJhd0NvbXBsZXhUZXh0KEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29u
c3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0Cit7CisgICAgLy8gVGhpcyBnbHlw
aCBidWZmZXIgaG9sZHMgb3VyIGdseXBocyArIGFkdmFuY2VzICsgZm9udCBkYXRhIGZvciBlYWNo
IGdseXBoLgorICAgIEdseXBoQnVmZmVyIGdseXBoQnVmZmVyOworCisgICAgZmxvYXQgc3RhcnRY
ID0gcG9pbnQueCgpOworICAgIFVuaXNjcmliZUNvbnRyb2xsZXIgY29udHJvbGxlcih0aGlzLCBy
dW4pOworICAgIGNvbnRyb2xsZXIuYWR2YW5jZShmcm9tKTsKKyAgICBmbG9hdCBiZWZvcmVXaWR0
aCA9IGNvbnRyb2xsZXIucnVuV2lkdGhTb0ZhcigpOworICAgIGNvbnRyb2xsZXIuYWR2YW5jZSh0
bywgJmdseXBoQnVmZmVyKTsKKyAgICAKKyAgICAvLyBXZSBjb3VsZG4ndCBnZW5lcmF0ZSBhbnkg
Z2x5cGhzIGZvciB0aGUgcnVuLiAgR2l2ZSB1cC4KKyAgICBpZiAoZ2x5cGhCdWZmZXIuaXNFbXB0
eSgpKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgZmxvYXQgYWZ0ZXJXaWR0aCA9IGNvbnRy
b2xsZXIucnVuV2lkdGhTb0ZhcigpOworCisgICAgaWYgKHJ1bi5ydGwoKSkgeworICAgICAgICBj
b250cm9sbGVyLmFkdmFuY2UocnVuLmxlbmd0aCgpKTsKKyAgICAgICAgc3RhcnRYICs9IGNvbnRy
b2xsZXIucnVuV2lkdGhTb0ZhcigpIC0gYWZ0ZXJXaWR0aDsKKyAgICB9IGVsc2UKKyAgICAgICAg
c3RhcnRYICs9IGJlZm9yZVdpZHRoOworCisgICAgLy8gRHJhdyB0aGUgZ2x5cGggYnVmZmVyIG5v
dyBhdCB0aGUgc3RhcnRpbmcgcG9pbnQgcmV0dXJuZWQgaW4gc3RhcnRYLgorICAgIEZsb2F0UG9p
bnQgc3RhcnRQb2ludChzdGFydFgsIHBvaW50LnkoKSk7CisgICAgZHJhd0dseXBoQnVmZmVyKGNv
bnRleHQsIGdseXBoQnVmZmVyLCBydW4sIHN0YXJ0UG9pbnQpOworfQorCitmbG9hdCBGb250Ojpm
bG9hdFdpZHRoRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuKSBjb25zdAoreworICAg
IFVuaXNjcmliZUNvbnRyb2xsZXIgY29udHJvbGxlcih0aGlzLCBydW4pOworICAgIGNvbnRyb2xs
ZXIuYWR2YW5jZShydW4ubGVuZ3RoKCkpOworICAgIHJldHVybiBjb250cm9sbGVyLnJ1bldpZHRo
U29GYXIoKTsKK30KKworaW50IEZvbnQ6Om9mZnNldEZvclBvc2l0aW9uRm9yQ29tcGxleFRleHQo
Y29uc3QgVGV4dFJ1biYgcnVuLCBpbnQgeCwgYm9vbCBpbmNsdWRlUGFydGlhbEdseXBocykgY29u
c3QKK3sKKyAgICBVbmlzY3JpYmVDb250cm9sbGVyIGNvbnRyb2xsZXIodGhpcywgcnVuKTsKKyAg
ICByZXR1cm4gY29udHJvbGxlci5vZmZzZXRGb3JQb3NpdGlvbih4LCBpbmNsdWRlUGFydGlhbEds
eXBocyk7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRD
R1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9u
dENHV2luLmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbi9Gb250Q0dXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAq
IENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI2LDExICsy
Niw5IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiRm9udC5oIgogCi0jaW5jbHVk
ZSAiRm9udEZhbGxiYWNrTGlzdC5oIgogI2luY2x1ZGUgIkdseXBoQnVmZmVyLmgiCiAjaW5jbHVk
ZSAiR3JhcGhpY3NDb250ZXh0LmgiCiAjaW5jbHVkZSAiSW50UmVjdC5oIgotI2luY2x1ZGUgIk5v
dEltcGxlbWVudGVkLmgiCiAjaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIKICNpbmNsdWRlICJV
bmlzY3JpYmVDb250cm9sbGVyLmgiCiAjaW5jbHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBs
aWNhdGlvblNlcnZpY2VzLmg+CkBAIC02OCwxNSArNjYsNyBAQCB2b2lkIEZvbnQ6OmRyYXdHbHlw
aHMoR3JhcGhpY3NDb250ZXh0KiBnCiAKICAgICAgICAgLy8gU2V0IHRoZSBjb3JyZWN0IGNvbG9y
LgogICAgICAgICBIREMgdGV4dERyYXdpbmdEQyA9IGhkYzsKLSAgICAgICAgLyppZiAoZmlsbENv
bG9yLmhhc0FscGhhKCkgfHwgZ3JhcGhpY3NDb250ZXh0LT5pblRyYW5zcGFyZW5jeUxheWVyKCkp
IHsKLSAgICAgICAgICAgIC8vIEdESSBjYW4ndCBoYW5kbGUgZHJhd2luZyB0cmFuc3BhcmVudCB0
ZXh0LiAgV2UgaGF2ZSB0byBkcmF3IGludG8gYSBtYXNrLiAgV2UgZHJhdyBibGFjayB0ZXh0IG9u
IGEgd2hpdGUtZmlsbGVkIGJhY2tncm91bmQuCi0gICAgICAgICAgICAvLyBXZSBhbHNvIGRvIHRo
aXMgd2hlbiBpbnNpZGUgdHJhbnNwYXJlbmN5IGxheWVycywgc2luY2UgR0RJIGFsc28gY2FuJ3Qg
ZHJhdyBvbnRvIGEgc3VyZmFjZSB3aXRoIGFscGhhLgotICAgICAgICAgICAgZ3JhcGhpY3NDb250
ZXh0LT5zYXZlKCk7Ci0gICAgICAgICAgICBncmFwaGljc0NvbnRleHQtPnNldEZpbGxDb2xvcihD
b2xvcjo6d2hpdGUpOwotICAgICAgICAgICAgdGV4dERyYXdpbmdEQyA9IGdyYXBoaWNzQ29udGV4
dC0+Z2V0V2luZG93c0JpdG1hcENvbnRleHQodGV4dFJlY3QpOwotICAgICAgICAgICAgU2V0VGV4
dENvbG9yKGhkYywgUkdCKDAsIDAsIDApKTsKLSAgICAgICAgfSBlbHNlKi8KLSAgICAgICAgICAg
IFNldFRleHRDb2xvcihoZGMsIFJHQihmaWxsQ29sb3IucmVkKCksIGZpbGxDb2xvci5ncmVlbigp
LCBmaWxsQ29sb3IuYmx1ZSgpKSk7CisgICAgICAgIFNldFRleHRDb2xvcihoZGMsIFJHQihmaWxs
Q29sb3IucmVkKCksIGZpbGxDb2xvci5ncmVlbigpLCBmaWxsQ29sb3IuYmx1ZSgpKSk7CiAKICAg
ICAgICAgU2V0QmtNb2RlKGhkYywgVFJBTlNQQVJFTlQpOwogICAgICAgICBTZXRUZXh0QWxpZ24o
aGRjLCBUQV9MRUZUIHwgVEFfQkFTRUxJTkUpOwpAQCAtOTUsMzQgKzg1LDYgQEAgdm9pZCBGb250
OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCogZwogICAgICAgICB9CiAgICAgICAgIEV4dFRl
eHRPdXQoaGRjLCBwb2ludC54KCksIHBvaW50LnkoKSwgRVRPX0dMWVBIX0lOREVYLCAwLCAoV0NI
QVIqKWdseXBoQnVmZmVyLmdseXBocyhmcm9tKSwgbnVtR2x5cGhzLCBnZGlBZHZhbmNlcy5kYXRh
KCkpOwogCi0gICAgICAgIC8qaWYgKGZpbGxDb2xvci5oYXNBbHBoYSgpIHx8IGdyYXBoaWNzQ29u
dGV4dC0+aW5UcmFuc3BhcmVuY3lMYXllcigpKSB7Ci0gICAgICAgICAgICAvLyBUT0RPRDogV2Ug
aGF2ZSB0byB3YWxrIHRoZSBiaXRzIG9mIHRoZSBiaXRtYXAgYW5kIGludmVydCB0aGVtLiAgV2Ug
YWxzbyBjb3B5IG92ZXIgdGhlIGdyZWVuIGNvbXBvbmVudCB2YWx1ZSBpbnRvIHRoZSBhbHBoYSB2
YWx1ZQotICAgICAgICAgICAgLy8gdG8ga2VlcCBDbGVhclR5cGUgbG9va2luZyByZWFzb25hYmxl
LgotCi0gICAgICAgICAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGRyYXduIHRoZSB0ZXh0IGludG8g
YSBiaXRtYXAgYW5kIGludmVydGVkIGl0LCBvYnRhaW4gYSBDR0ltYWdlUmVmIG1hc2suCi0gICAg
ICAgICAgICBDR0ltYWdlUmVmIG1hc2sgPSBncmFwaGljc0NvbnRleHQtPnJlbGVhc2VXaW5kb3dz
Qml0bWFwQ29udGV4dEludG9NYXNrKHRleHREcmF3aW5nREMsIHRleHRSZWN0KTsKLSAgICAgICAg
ICAgIAotICAgICAgICAgICAgLy8gQXBwbHkgdGhlIG1hc2sgdG8gdGhlIGZpbGwgY29sb3IuCi0g
ICAgICAgICAgICBDR0NvbnRleHRSZWYgYml0bWFwQ29udGV4dCA9IGdyYXBoaWNzQ29udGV4dC0+
Z2V0V2luZG93c0NvbXBhdGlibGVDR0JpdG1hcENvbnRleHQodGV4dFJlY3Quc2l6ZSgpKTsKLSAg
ICAgICAgICAgIENHRmxvYXQgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGE7Ci0gICAgICAgICAgICBj
b2xvci5nZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLSAgICAgICAgICAgIENHQ29u
dGV4dFNldFJHQkZpbGxDb2xvcihjb250ZXh0LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci0g
ICAgICAgICAgICBDR0NvbnRleHRGaWxsUmVjdChiaXRtYXBDb250ZXh0LCBJbnRSZWN0KDAsIDAs
IHRleHRSZWN0LndpZHRoKCksIHRleHRSZWN0LmhlaWdodCgpKSk7Ci0gICAgICAgICAgICBDR0lt
YWdlUmVmIGZpbGxDb2xvckltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlSW1hZ2UoYml0bWFw
Q29udGV4dCk7Ci0gICAgICAgIAotICAgICAgICAgICAgLy8gQXBwbHkgdGhlIG1hc2suCi0gICAg
ICAgICAgICBDR0ltYWdlUmVmIGZpbmFsSW1hZ2UgPSBDR0ltYWdlQ3JlYXRlV2l0aE1hc2soZmls
bENvbG9ySW1hZ2UsIG1hc2spOwotCi0gICAgICAgICAgICAvLyBUaGUgYml0bWFwIGltYWdlIG5l
ZWRzIHRvIGJlIGRyYXduIGludG8gdGhlIEhEQy4KLSAgICAgICAgICAgIGdyYXBoaWNzQ29udGV4
dC0+ZHJhd0ltYWdlSW50b1dpbmRvd3NDb250ZXh0KGhkYywgZmluYWxJbWFnZSk7Ci0KLSAgICAg
ICAgICAgIC8vIFJlbGVhc2Ugb3VyIGltYWdlcyBhbmQgY29udGV4dHMuCi0gICAgICAgICAgICBD
R0ltYWdlUmVsZWFzZShtYXNrKTsKLSAgICAgICAgICAgIENHSW1hZ2VSZWxlYXNlKGZpbGxDb2xv
ckltYWdlKTsKLSAgICAgICAgICAgIENHSW1hZ2VSZWxlYXNlKGZpbmFsSW1hZ2UpOwotICAgICAg
ICAgICAgQ0dDb250ZXh0UmVsZWFzZShiaXRtYXBDb250ZXh0KTsKLSAgICAgICAgfSovCi0KICAg
ICAgICAgZ3JhcGhpY3NDb250ZXh0LT5yZWxlYXNlV2luZG93c0NvbnRleHQoaGRjLCB0ZXh0UmVj
dCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xMzksOSArMTAxLDggQEAgdm9pZCBGb250
OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCogZwogICAgIG1hdHJpeC5iID0gLW1hdHJpeC5i
OwogICAgIG1hdHJpeC5kID0gLW1hdHJpeC5kOwogCi0gICAgaWYgKHBsYXRmb3JtRGF0YS5zeW50
aGV0aWNPYmxpcXVlKCkpCi0gICAgewotICAgICAgICBzdGF0aWMgZmxvYXQgc2tldyA9IC10YW5m
KHN5bnRoZXRpY09ibGlxdWVBbmdsZSAqIGFjb3NmKDApIC8gOTApOworICAgIGlmIChwbGF0Zm9y
bURhdGEuc3ludGhldGljT2JsaXF1ZSgpKSB7CisgICAgICAgIHN0YXRpYyBmbG9hdCBza2V3ID0g
LXRhbmYoc3ludGhldGljT2JsaXF1ZUFuZ2xlICogYWNvc2YoMCkgLyA5MC4wZik7CiAgICAgICAg
IG1hdHJpeCA9IENHQWZmaW5lVHJhbnNmb3JtQ29uY2F0KG1hdHJpeCwgQ0dBZmZpbmVUcmFuc2Zv
cm1NYWtlKDEsIDAsIHNrZXcsIDEsIDAsIDApKTsKICAgICB9CiAKQEAgLTE2Myw2NSArMTI0LDQg
QEAgdm9pZCBGb250OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCogZwogICAgIHdrUmVzdG9y
ZUZvbnRTbW9vdGhpbmdTdHlsZShjZ0NvbnRleHQsIG9sZEZvbnRTbW9vdGhpbmdTdHlsZSk7CiB9
CiAKLUZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQoY29uc3QgVGV4
dFJ1biYgcnVuLCBjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCBoLAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAotewot
ICAgIFVuaXNjcmliZUNvbnRyb2xsZXIgaXQodGhpcywgcnVuKTsKLSAgICBpdC5hZHZhbmNlKGZy
b20pOwotICAgIGZsb2F0IGJlZm9yZVdpZHRoID0gaXQucnVuV2lkdGhTb0ZhcigpOwotICAgIGl0
LmFkdmFuY2UodG8pOwotICAgIGZsb2F0IGFmdGVyV2lkdGggPSBpdC5ydW5XaWR0aFNvRmFyKCk7
Ci0KLSAgICAvLyBVc2luZyByb3VuZGYoKSByYXRoZXIgdGhhbiBjZWlsZigpIGZvciB0aGUgcmln
aHQgZWRnZSBhcyBhIGNvbXByb21pc2UgdG8gZW5zdXJlIGNvcnJlY3QgY2FyZXQgcG9zaXRpb25p
bmcKLSAgICBpZiAocnVuLnJ0bCgpKSB7Ci0gICAgICAgIGl0LmFkdmFuY2UocnVuLmxlbmd0aCgp
KTsKLSAgICAgICAgZmxvYXQgdG90YWxXaWR0aCA9IGl0LnJ1bldpZHRoU29GYXIoKTsKLSAgICAg
ICAgcmV0dXJuIEZsb2F0UmVjdChwb2ludC54KCkgKyBmbG9vcmYodG90YWxXaWR0aCAtIGFmdGVy
V2lkdGgpLCBwb2ludC55KCksIHJvdW5kZih0b3RhbFdpZHRoIC0gYmVmb3JlV2lkdGgpIC0gZmxv
b3JmKHRvdGFsV2lkdGggLSBhZnRlcldpZHRoKSwgaCk7Ci0gICAgfSAKLSAgICAKLSAgICByZXR1
cm4gRmxvYXRSZWN0KHBvaW50LngoKSArIGZsb29yZihiZWZvcmVXaWR0aCksIHBvaW50LnkoKSwg
cm91bmRmKGFmdGVyV2lkdGgpIC0gZmxvb3JmKGJlZm9yZVdpZHRoKSwgaCk7Ci19Ci0KLXZvaWQg
Rm9udDo6ZHJhd0NvbXBsZXhUZXh0KEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgVGV4
dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCwKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0Ci17Ci0gICAgLy8gVGhpcyBnbHlwaCBidWZm
ZXIgaG9sZHMgb3VyIGdseXBocyArIGFkdmFuY2VzICsgZm9udCBkYXRhIGZvciBlYWNoIGdseXBo
LgotICAgIEdseXBoQnVmZmVyIGdseXBoQnVmZmVyOwotCi0gICAgZmxvYXQgc3RhcnRYID0gcG9p
bnQueCgpOwotICAgIFVuaXNjcmliZUNvbnRyb2xsZXIgY29udHJvbGxlcih0aGlzLCBydW4pOwot
ICAgIGNvbnRyb2xsZXIuYWR2YW5jZShmcm9tKTsKLSAgICBmbG9hdCBiZWZvcmVXaWR0aCA9IGNv
bnRyb2xsZXIucnVuV2lkdGhTb0ZhcigpOwotICAgIGNvbnRyb2xsZXIuYWR2YW5jZSh0bywgJmds
eXBoQnVmZmVyKTsKLSAgICAKLSAgICAvLyBXZSBjb3VsZG4ndCBnZW5lcmF0ZSBhbnkgZ2x5cGhz
IGZvciB0aGUgcnVuLiAgR2l2ZSB1cC4KLSAgICBpZiAoZ2x5cGhCdWZmZXIuaXNFbXB0eSgpKQot
ICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgZmxvYXQgYWZ0ZXJXaWR0aCA9IGNvbnRyb2xsZXIu
cnVuV2lkdGhTb0ZhcigpOwotCi0gICAgaWYgKHJ1bi5ydGwoKSkgewotICAgICAgICBjb250cm9s
bGVyLmFkdmFuY2UocnVuLmxlbmd0aCgpKTsKLSAgICAgICAgc3RhcnRYICs9IGNvbnRyb2xsZXIu
cnVuV2lkdGhTb0ZhcigpIC0gYWZ0ZXJXaWR0aDsKLSAgICB9IGVsc2UKLSAgICAgICAgc3RhcnRY
ICs9IGJlZm9yZVdpZHRoOwotCi0gICAgLy8gRHJhdyB0aGUgZ2x5cGggYnVmZmVyIG5vdyBhdCB0
aGUgc3RhcnRpbmcgcG9pbnQgcmV0dXJuZWQgaW4gc3RhcnRYLgotICAgIEZsb2F0UG9pbnQgc3Rh
cnRQb2ludChzdGFydFgsIHBvaW50LnkoKSk7Ci0gICAgZHJhd0dseXBoQnVmZmVyKGNvbnRleHQs
IGdseXBoQnVmZmVyLCBydW4sIHN0YXJ0UG9pbnQpOwotfQotCi1mbG9hdCBGb250OjpmbG9hdFdp
ZHRoRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuKSBjb25zdAotewotICAgIFVuaXNj
cmliZUNvbnRyb2xsZXIgY29udHJvbGxlcih0aGlzLCBydW4pOwotICAgIGNvbnRyb2xsZXIuYWR2
YW5jZShydW4ubGVuZ3RoKCkpOwotICAgIHJldHVybiBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIo
KTsKLX0KLQotaW50IEZvbnQ6Om9mZnNldEZvclBvc2l0aW9uRm9yQ29tcGxleFRleHQoY29uc3Qg
VGV4dFJ1biYgcnVuLCBpbnQgeCwgYm9vbCBpbmNsdWRlUGFydGlhbEdseXBocykgY29uc3QKLXsK
LSAgICBVbmlzY3JpYmVDb250cm9sbGVyIGNvbnRyb2xsZXIodGhpcywgcnVuKTsKLSAgICByZXR1
cm4gY29udHJvbGxlci5vZmZzZXRGb3JQb3NpdGlvbih4LCBpbmNsdWRlUGFydGlhbEdseXBocyk7
Ci19Ci0KIH0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDYWlyb1dp
bi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENh
aXJvV2luLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0ZvbnRDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDggQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZvbnQuaCIKKworI2luY2x1ZGUgIkds
eXBoQnVmZmVyLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiTm90
SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJTaW1wbGVGb250RGF0YS5oIgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKK3ZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQqIGdyYXBo
aWNzQ29udGV4dCwgY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnQsIGNvbnN0IEdseXBoQnVmZmVy
JiBnbHlwaEJ1ZmZlciwgCisgICAgICAgICAgICAgICAgICAgICAgaW50IGZyb20sIGludCBudW1H
bHlwaHMsIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KSBjb25zdAoreworICAgIG5vdEltcGxlbWVu
dGVkKCk7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRX
aW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRX
aW4uY3BwCShyZXZpc2lvbiAzMDA0OCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0ZvbnRXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHly
aWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICog
Q29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTMzLDEzNiArMzMsMTAg
QEAKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1ZGUgIlNpbXBsZUZvbnREYXRh
LmgiCiAjaW5jbHVkZSAiVW5pc2NyaWJlQ29udHJvbGxlci5oIgotI2luY2x1ZGUgPEFwcGxpY2F0
aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgotI2luY2x1ZGUgPFdlYktpdFN5c3Rl
bUludGVyZmFjZS9XZWJLaXRTeXN0ZW1JbnRlcmZhY2UuaD4KICNpbmNsdWRlIDx3dGYvTWF0aEV4
dHJhcy5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLWNvbnN0IGludCBzeW50aGV0aWNPYmxp
cXVlQW5nbGUgPSAxNDsKLQotdm9pZCBGb250OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCog
Z3JhcGhpY3NDb250ZXh0LCBjb25zdCBTaW1wbGVGb250RGF0YSogZm9udCwgY29uc3QgR2x5cGhC
dWZmZXImIGdseXBoQnVmZmVyLCAKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50
IG51bUdseXBocywgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpIGNvbnN0Ci17Ci0gICAgaWYgKGZv
bnQtPm1fZm9udC51c2VHREkoKSkgewotICAgICAgICAvLyBGSVhNRTogU3VwcG9ydCBhbHBoYSBi
bGVuZGluZy4KLSAgICAgICAgLy8gRklYTUU6IFN1cHBvcnQgdGV4dCBzdHJva2UvZmlsbC4KLSAg
ICAgICAgLy8gRklYTUU6IFN1cHBvcnQgdGV4dCBzaGFkb3cuCi0gICAgICAgIENvbG9yIGZpbGxD
b2xvciA9IGdyYXBoaWNzQ29udGV4dC0+ZmlsbENvbG9yKCk7Ci0gICAgICAgIGlmIChmaWxsQ29s
b3IuYWxwaGEoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIC8vIFdlIGhh
dmUgdG8gY29udmVydCBDRydzIHR3by1kaW1lbnNpb25hbCBmbG9hdGluZyBwb2ludCBhZHZhbmNl
cyB0byBqdXN0IGhvcml6b250YWwgaW50ZWdlciBhZHZhbmNlcy4KLSAgICAgICAgVmVjdG9yPGlu
dCwgMjA0OD4gZ2RpQWR2YW5jZXM7Ci0gICAgICAgIGludCB0b3RhbFdpZHRoID0gMDsKLSAgICAg
ICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1HbHlwaHM7IGkrKykgewotICAgICAgICAgICAgZ2Rp
QWR2YW5jZXMuYXBwZW5kKGxyb3VuZGYoZ2x5cGhCdWZmZXIuYWR2YW5jZUF0KGZyb20gKyBpKSkp
OwotICAgICAgICAgICAgdG90YWxXaWR0aCArPSBnZGlBZHZhbmNlc1tpXTsKLSAgICAgICAgfQot
Ci0gICAgICAgIC8vIFdlIHB1dCBzbG9wIGludG8gdGhpcyByZWN0LCBzaW5jZSBnbHlwaHMgY2Fu
IG92ZXJmbG93IHRoZSBhc2NlbnQvZGVzY2VudCBib3VuZHMgYW5kIHRoZSBsZWZ0L3JpZ2h0IGVk
Z2VzLgotICAgICAgICBpbnQgbGluZUdhcCA9IGZvbnQtPmxpbmVHYXAoKTsKLSAgICAgICAgSW50
UmVjdCB0ZXh0UmVjdChwb2ludC54KCkgLSBsaW5lR2FwLCBwb2ludC55KCkgLSBmb250LT5hc2Nl
bnQoKSAtIGxpbmVHYXAsIHRvdGFsV2lkdGggKyAyICogbGluZUdhcCwgZm9udC0+bGluZVNwYWNp
bmcoKSk7Ci0gICAgICAgIEhEQyBoZGMgPSBncmFwaGljc0NvbnRleHQtPmdldFdpbmRvd3NDb250
ZXh0KHRleHRSZWN0KTsKLSAgICAgICAgU2VsZWN0T2JqZWN0KGhkYywgZm9udC0+bV9mb250Lmhm
b250KCkpOwotCi0gICAgICAgIC8vIFNldCB0aGUgY29ycmVjdCBjb2xvci4KLSAgICAgICAgSERD
IHRleHREcmF3aW5nREMgPSBoZGM7Ci0gICAgICAgIC8qaWYgKGZpbGxDb2xvci5oYXNBbHBoYSgp
IHx8IGdyYXBoaWNzQ29udGV4dC0+aW5UcmFuc3BhcmVuY3lMYXllcigpKSB7Ci0gICAgICAgICAg
ICAvLyBHREkgY2FuJ3QgaGFuZGxlIGRyYXdpbmcgdHJhbnNwYXJlbnQgdGV4dC4gIFdlIGhhdmUg
dG8gZHJhdyBpbnRvIGEgbWFzay4gIFdlIGRyYXcgYmxhY2sgdGV4dCBvbiBhIHdoaXRlLWZpbGxl
ZCBiYWNrZ3JvdW5kLgotICAgICAgICAgICAgLy8gV2UgYWxzbyBkbyB0aGlzIHdoZW4gaW5zaWRl
IHRyYW5zcGFyZW5jeSBsYXllcnMsIHNpbmNlIEdESSBhbHNvIGNhbid0IGRyYXcgb250byBhIHN1
cmZhY2Ugd2l0aCBhbHBoYS4KLSAgICAgICAgICAgIGdyYXBoaWNzQ29udGV4dC0+c2F2ZSgpOwot
ICAgICAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5zZXRGaWxsQ29sb3IoQ29sb3I6OndoaXRlKTsK
LSAgICAgICAgICAgIHRleHREcmF3aW5nREMgPSBncmFwaGljc0NvbnRleHQtPmdldFdpbmRvd3NC
aXRtYXBDb250ZXh0KHRleHRSZWN0KTsKLSAgICAgICAgICAgIFNldFRleHRDb2xvcihoZGMsIFJH
QigwLCAwLCAwKSk7Ci0gICAgICAgIH0gZWxzZSovCi0gICAgICAgICAgICBTZXRUZXh0Q29sb3Io
aGRjLCBSR0IoZmlsbENvbG9yLnJlZCgpLCBmaWxsQ29sb3IuZ3JlZW4oKSwgZmlsbENvbG9yLmJs
dWUoKSkpOwotCi0gICAgICAgIFNldEJrTW9kZShoZGMsIFRSQU5TUEFSRU5UKTsKLSAgICAgICAg
U2V0VGV4dEFsaWduKGhkYywgVEFfTEVGVCB8IFRBX0JBU0VMSU5FKTsKLQotICAgICAgICAvLyBV
bmlzY3JpYmUgZ2l2ZXMgdXMgb2Zmc2V0cyB0byBoZWxwIHJlZmluZSB0aGUgcG9zaXRpb25pbmcg
b2YgY29tYmluaW5nIGdseXBocy4KLSAgICAgICAgRmxvYXRTaXplIHRyYW5zbGF0aW9uID0gZ2x5
cGhCdWZmZXIub2Zmc2V0QXQoZnJvbSk7Ci0gICAgICAgIGlmICh0cmFuc2xhdGlvbi53aWR0aCgp
IHx8IHRyYW5zbGF0aW9uLmhlaWdodCgpKSB7Ci0gICAgICAgICAgICBYRk9STSB4Zm9ybTsKLSAg
ICAgICAgICAgIHhmb3JtLmVNMTEgPSAxLjA7Ci0gICAgICAgICAgICB4Zm9ybS5lTTEyID0gMDsK
LSAgICAgICAgICAgIHhmb3JtLmVNMjEgPSAwOwotICAgICAgICAgICAgeGZvcm0uZU0yMiA9IDEu
MDsKLSAgICAgICAgICAgIHhmb3JtLmVEeCA9IHRyYW5zbGF0aW9uLndpZHRoKCk7Ci0gICAgICAg
ICAgICB4Zm9ybS5lRHkgPSB0cmFuc2xhdGlvbi5oZWlnaHQoKTsKLSAgICAgICAgICAgIE1vZGlm
eVdvcmxkVHJhbnNmb3JtKGhkYywgJnhmb3JtLCBNV1RfTEVGVE1VTFRJUExZKTsKLSAgICAgICAg
fQotICAgICAgICBFeHRUZXh0T3V0KGhkYywgcG9pbnQueCgpLCBwb2ludC55KCksIEVUT19HTFlQ
SF9JTkRFWCwgMCwgKFdDSEFSKilnbHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSksIG51bUdseXBocywg
Z2RpQWR2YW5jZXMuZGF0YSgpKTsKLQotICAgICAgICAvKmlmIChmaWxsQ29sb3IuaGFzQWxwaGEo
KSB8fCBncmFwaGljc0NvbnRleHQtPmluVHJhbnNwYXJlbmN5TGF5ZXIoKSkgewotICAgICAgICAg
ICAgLy8gVE9ET0Q6IFdlIGhhdmUgdG8gd2FsayB0aGUgYml0cyBvZiB0aGUgYml0bWFwIGFuZCBp
bnZlcnQgdGhlbS4gIFdlIGFsc28gY29weSBvdmVyIHRoZSBncmVlbiBjb21wb25lbnQgdmFsdWUg
aW50byB0aGUgYWxwaGEgdmFsdWUKLSAgICAgICAgICAgIC8vIHRvIGtlZXAgQ2xlYXJUeXBlIGxv
b2tpbmcgcmVhc29uYWJsZS4KLQotICAgICAgICAgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBkcmF3
biB0aGUgdGV4dCBpbnRvIGEgYml0bWFwIGFuZCBpbnZlcnRlZCBpdCwgb2J0YWluIGEgQ0dJbWFn
ZVJlZiBtYXNrLgotICAgICAgICAgICAgQ0dJbWFnZVJlZiBtYXNrID0gZ3JhcGhpY3NDb250ZXh0
LT5yZWxlYXNlV2luZG93c0JpdG1hcENvbnRleHRJbnRvTWFzayh0ZXh0RHJhd2luZ0RDLCB0ZXh0
UmVjdCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEFwcGx5IHRoZSBtYXNrIHRvIHRo
ZSBmaWxsIGNvbG9yLgotICAgICAgICAgICAgQ0dDb250ZXh0UmVmIGJpdG1hcENvbnRleHQgPSBn
cmFwaGljc0NvbnRleHQtPmdldFdpbmRvd3NDb21wYXRpYmxlQ0dCaXRtYXBDb250ZXh0KHRleHRS
ZWN0LnNpemUoKSk7Ci0gICAgICAgICAgICBDR0Zsb2F0IHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhh
OwotICAgICAgICAgICAgY29sb3IuZ2V0UkdCQShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci0g
ICAgICAgICAgICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoY29udGV4dCwgcmVkLCBncmVlbiwg
Ymx1ZSwgYWxwaGEpOwotICAgICAgICAgICAgQ0dDb250ZXh0RmlsbFJlY3QoYml0bWFwQ29udGV4
dCwgSW50UmVjdCgwLCAwLCB0ZXh0UmVjdC53aWR0aCgpLCB0ZXh0UmVjdC5oZWlnaHQoKSkpOwot
ICAgICAgICAgICAgQ0dJbWFnZVJlZiBmaWxsQ29sb3JJbWFnZSA9IENHQml0bWFwQ29udGV4dENy
ZWF0ZUltYWdlKGJpdG1hcENvbnRleHQpOwotICAgICAgICAKLSAgICAgICAgICAgIC8vIEFwcGx5
IHRoZSBtYXNrLgotICAgICAgICAgICAgQ0dJbWFnZVJlZiBmaW5hbEltYWdlID0gQ0dJbWFnZUNy
ZWF0ZVdpdGhNYXNrKGZpbGxDb2xvckltYWdlLCBtYXNrKTsKLQotICAgICAgICAgICAgLy8gVGhl
IGJpdG1hcCBpbWFnZSBuZWVkcyB0byBiZSBkcmF3biBpbnRvIHRoZSBIREMuCi0gICAgICAgICAg
ICBncmFwaGljc0NvbnRleHQtPmRyYXdJbWFnZUludG9XaW5kb3dzQ29udGV4dChoZGMsIGZpbmFs
SW1hZ2UpOwotCi0gICAgICAgICAgICAvLyBSZWxlYXNlIG91ciBpbWFnZXMgYW5kIGNvbnRleHRz
LgotICAgICAgICAgICAgQ0dJbWFnZVJlbGVhc2UobWFzayk7Ci0gICAgICAgICAgICBDR0ltYWdl
UmVsZWFzZShmaWxsQ29sb3JJbWFnZSk7Ci0gICAgICAgICAgICBDR0ltYWdlUmVsZWFzZShmaW5h
bEltYWdlKTsKLSAgICAgICAgICAgIENHQ29udGV4dFJlbGVhc2UoYml0bWFwQ29udGV4dCk7Ci0g
ICAgICAgIH0qLwotCi0gICAgICAgIGdyYXBoaWNzQ29udGV4dC0+cmVsZWFzZVdpbmRvd3NDb250
ZXh0KGhkYywgdGV4dFJlY3QpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQ0dDb250
ZXh0UmVmIGNnQ29udGV4dCA9IGdyYXBoaWNzQ29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCk7Ci0K
LSAgICB1aW50MzJfdCBvbGRGb250U21vb3RoaW5nU3R5bGUgPSB3a1NldEZvbnRTbW9vdGhpbmdT
dHlsZShjZ0NvbnRleHQpOwotCi0gICAgY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgcGxhdGZvcm1E
YXRhID0gZm9udC0+cGxhdGZvcm1EYXRhKCk7Ci0KLSAgICBDR0NvbnRleHRTZXRGb250KGNnQ29u
dGV4dCwgcGxhdGZvcm1EYXRhLmNnRm9udCgpKTsKLQotICAgIENHQWZmaW5lVHJhbnNmb3JtIG1h
dHJpeCA9IENHQWZmaW5lVHJhbnNmb3JtSWRlbnRpdHk7Ci0gICAgbWF0cml4LmIgPSAtbWF0cml4
LmI7Ci0gICAgbWF0cml4LmQgPSAtbWF0cml4LmQ7Ci0KLSAgICBpZiAocGxhdGZvcm1EYXRhLnN5
bnRoZXRpY09ibGlxdWUoKSkKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBmbG9hdCBza2V3ID0gLXRh
bmYoc3ludGhldGljT2JsaXF1ZUFuZ2xlICogYWNvc2YoMCkgLyA5MCk7Ci0gICAgICAgIG1hdHJp
eCA9IENHQWZmaW5lVHJhbnNmb3JtQ29uY2F0KG1hdHJpeCwgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtl
KDEsIDAsIHNrZXcsIDEsIDAsIDApKTsKLSAgICB9Ci0KLSAgICAvLyBVbmlzY3JpYmUgZ2l2ZXMg
dXMgb2Zmc2V0cyB0byBoZWxwIHJlZmluZSB0aGUgcG9zaXRpb25pbmcgb2YgY29tYmluaW5nIGds
eXBocy4KLSAgICBGbG9hdFNpemUgdHJhbnNsYXRpb24gPSBnbHlwaEJ1ZmZlci5vZmZzZXRBdChm
cm9tKTsKLSAgICBpZiAodHJhbnNsYXRpb24ud2lkdGgoKSB8fCB0cmFuc2xhdGlvbi5oZWlnaHQo
KSkKLSAgICAgICAgQ0dBZmZpbmVUcmFuc2Zvcm1UcmFuc2xhdGUobWF0cml4LCB0cmFuc2xhdGlv
bi53aWR0aCgpLCB0cmFuc2xhdGlvbi5oZWlnaHQoKSk7Ci0gICAgCi0gICAgQ0dDb250ZXh0U2V0
VGV4dE1hdHJpeChjZ0NvbnRleHQsIG1hdHJpeCk7Ci0KLSAgICBDR0NvbnRleHRTZXRGb250U2l6
ZShjZ0NvbnRleHQsIHBsYXRmb3JtRGF0YS5zaXplKCkpOwotICAgIENHQ29udGV4dFNldFRleHRQ
b3NpdGlvbihjZ0NvbnRleHQsIHBvaW50LngoKSwgcG9pbnQueSgpKTsKLSAgICBDR0NvbnRleHRT
aG93R2x5cGhzV2l0aEFkdmFuY2VzKGNnQ29udGV4dCwgZ2x5cGhCdWZmZXIuZ2x5cGhzKGZyb20p
LCBnbHlwaEJ1ZmZlci5hZHZhbmNlcyhmcm9tKSwgbnVtR2x5cGhzKTsKLSAgICBpZiAoZm9udC0+
bV9zeW50aGV0aWNCb2xkT2Zmc2V0KSB7Ci0gICAgICAgIENHQ29udGV4dFNldFRleHRQb3NpdGlv
bihjZ0NvbnRleHQsIHBvaW50LngoKSArIGZvbnQtPm1fc3ludGhldGljQm9sZE9mZnNldCwgcG9p
bnQueSgpKTsKLSAgICAgICAgQ0dDb250ZXh0U2hvd0dseXBoc1dpdGhBZHZhbmNlcyhjZ0NvbnRl
eHQsIGdseXBoQnVmZmVyLmdseXBocyhmcm9tKSwgZ2x5cGhCdWZmZXIuYWR2YW5jZXMoZnJvbSks
IG51bUdseXBocyk7Ci0gICAgfQotCi0gICAgd2tSZXN0b3JlRm9udFNtb290aGluZ1N0eWxlKGNn
Q29udGV4dCwgb2xkRm9udFNtb290aGluZ1N0eWxlKTsKLX0KLQogRmxvYXRSZWN0IEZvbnQ6OnNl
bGVjdGlvblJlY3RGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEludFBv
aW50JiBwb2ludCwgaW50IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0CiB7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRDR1dpbi5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0Q0dXaW4uY3BwCShyZXZp
c2lvbiAyOTgzNCkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3ND
b250ZXh0V2luLmNwcDoyOTgzNCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dy
YXBoaWNzQ29udGV4dENHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM4NiBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKworI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5o
IgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGF0aC5oIgorI2luY2x1
ZGUgPENvcmVHcmFwaGljcy9DR0JpdG1hcENvbnRleHQuaD4KKyNpbmNsdWRlIDxXZWJLaXRTeXN0
ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8d3RmL01hdGhF
eHRyYXMuaD4KKworI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZS5oIgor
Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFNW
R1Jlc291cmNlSW1hZ2U7CisKK3N0YXRpYyBDR0NvbnRleHRSZWYgQ0dDb250ZXh0V2l0aEhEQyhI
REMgaGRjKQoreworICAgIEhCSVRNQVAgYml0bWFwID0gKEhCSVRNQVApR2V0Q3VycmVudE9iamVj
dChoZGMsIE9CSl9CSVRNQVApOworICAgIENHQ29sb3JTcGFjZVJlZiBkZXZpY2VSR0IgPSBDR0Nv
bG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKKyAgICBCSVRNQVAgaW5mbzsKKworICAgIEdldE9i
amVjdChiaXRtYXAsIHNpemVvZihpbmZvKSwgJmluZm8pOworICAgIEFTU0VSVChpbmZvLmJtQml0
c1BpeGVsID09IDMyKTsKKyAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IENHQml0bWFwQ29udGV4
dENyZWF0ZShpbmZvLmJtQml0cywgaW5mby5ibVdpZHRoLCBpbmZvLmJtSGVpZ2h0LCA4LAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uYm1XaWR0
aEJ5dGVzLCBkZXZpY2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwga0NHSW1hZ2VB
bHBoYU5vbmVTa2lwRmlyc3QpOworICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsK
KworICAgIC8vIEZsaXAgY29vcmRzCisgICAgQ0dDb250ZXh0VHJhbnNsYXRlQ1RNKGNvbnRleHQs
IDAsIGluZm8uYm1IZWlnaHQpOworICAgIENHQ29udGV4dFNjYWxlQ1RNKGNvbnRleHQsIDEsIC0x
KTsKKyAgICAKKyAgICAvLyBQdXQgdGhlIEhEQyBJbiBhZHZhbmNlZCBtb2RlIHNvIGl0IHdpbGwg
aG9ub3IgYWZmaW5lIHRyYW5zZm9ybXMuCisgICAgU2V0R3JhcGhpY3NNb2RlKGhkYywgR01fQURW
QU5DRUQpOworICAgIAorICAgIHJldHVybiBjb250ZXh0OworfQorCitHcmFwaGljc0NvbnRleHQ6
OkdyYXBoaWNzQ29udGV4dChIREMgaGRjKQorICAgIDogbV9jb21tb24oY3JlYXRlR3JhcGhpY3ND
b250ZXh0UHJpdmF0ZSgpKQorICAgICwgbV9kYXRhKG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9y
bVByaXZhdGUoQ0dDb250ZXh0V2l0aEhEQyhoZGMpKSkKK3sKKyAgICBDR0NvbnRleHRSZWxlYXNl
KG1fZGF0YS0+bV9jZ0NvbnRleHQpOworICAgIG1fZGF0YS0+bV9oZGMgPSBoZGM7CisgICAgc2V0
UGFpbnRpbmdEaXNhYmxlZCghbV9kYXRhLT5tX2NnQ29udGV4dCk7CisgICAgaWYgKG1fZGF0YS0+
bV9jZ0NvbnRleHQpIHsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBjb250ZXh0IHN0YXJ0cyBp
biBzeW5jIHdpdGggb3VyIHN0YXRlLgorICAgICAgICBzZXRQbGF0Zm9ybUZpbGxDb2xvcihmaWxs
Q29sb3IoKSk7CisgICAgICAgIHNldFBsYXRmb3JtU3Ryb2tlQ29sb3Ioc3Ryb2tlQ29sb3IoKSk7
CisgICAgfQorfQorCitIREMgR3JhcGhpY3NDb250ZXh0OjpnZXRXaW5kb3dzQ29udGV4dChjb25z
dCBJbnRSZWN0JiBkc3RSZWN0LCBib29sIHN1cHBvcnRBbHBoYUJsZW5kKQoreworICAgIGlmIChp
blRyYW5zcGFyZW5jeUxheWVyKCkpIHsKKyAgICAgICAgaWYgKGRzdFJlY3QuaXNFbXB0eSgpKQor
ICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgYml0bWFwIERDIGlu
IHdoaWNoIHRvIGRyYXcuCisgICAgICAgIEJJVE1BUElORk8gYml0bWFwSW5mbzsKKyAgICAgICAg
Yml0bWFwSW5mby5ibWlIZWFkZXIuYmlTaXplICAgICAgICAgID0gc2l6ZW9mKEJJVE1BUElORk9I
RUFERVIpOworICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVdpZHRoICAgICAgICAgPSBk
c3RSZWN0LndpZHRoKCk7IAorICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUhlaWdodCAg
ICAgICAgPSBkc3RSZWN0LmhlaWdodCgpOworICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5i
aVBsYW5lcyAgICAgICAgPSAxOworICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUJpdENv
dW50ICAgICAgPSAzMjsKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlDb21wcmVzc2lv
biAgID0gQklfUkdCOworICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVNpemVJbWFnZSAg
ICAgPSAwOworICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVhQZWxzUGVyTWV0ZXIgPSAw
OworICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVlQZWxzUGVyTWV0ZXIgPSAwOworICAg
ICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUNsclVzZWQgICAgICAgPSAwOworICAgICAgICBi
aXRtYXBJbmZvLmJtaUhlYWRlci5iaUNsckltcG9ydGFudCAgPSAwOworCisgICAgICAgIHZvaWQq
IHBpeGVscyA9IDA7CisgICAgICAgIEhCSVRNQVAgYml0bWFwID0gOjpDcmVhdGVESUJTZWN0aW9u
KE5VTEwsICZiaXRtYXBJbmZvLCBESUJfUkdCX0NPTE9SUywgJnBpeGVscywgMCwgMCk7CisgICAg
ICAgIGlmICghYml0bWFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgSERDIGJp
dG1hcERDID0gOjpDcmVhdGVDb21wYXRpYmxlREMobV9kYXRhLT5tX2hkYyk7CisgICAgICAgIDo6
U2VsZWN0T2JqZWN0KGJpdG1hcERDLCBiaXRtYXApOworCisgICAgICAgIC8vIEZpbGwgb3VyIGJ1
ZmZlciB3aXRoIGNsZWFyIGlmIHdlJ3JlIGdvaW5nIHRvIGFscGhhIGJsZW5kLgorICAgICAgICBp
ZiAoc3VwcG9ydEFscGhhQmxlbmQpIHsKKyAgICAgICAgICAgIEJJVE1BUCBibXBJbmZvOworICAg
ICAgICAgICAgR2V0T2JqZWN0KGJpdG1hcCwgc2l6ZW9mKGJtcEluZm8pLCAmYm1wSW5mbyk7Cisg
ICAgICAgICAgICBpbnQgYnVmZmVyU2l6ZSA9IGJtcEluZm8uYm1XaWR0aEJ5dGVzICogYm1wSW5m
by5ibUhlaWdodDsKKyAgICAgICAgICAgIG1lbXNldChibXBJbmZvLmJtQml0cywgMCwgYnVmZmVy
U2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBNYWtlIHN1cmUgd2UgY2FuIGRvIHdvcmxk
IHRyYW5zZm9ybXMuCisgICAgICAgIFNldEdyYXBoaWNzTW9kZShiaXRtYXBEQywgR01fQURWQU5D
RUQpOworCisgICAgICAgIC8vIEFwcGx5IGEgdHJhbnNsYXRpb24gdG8gb3VyIGNvbnRleHQgc28g
dGhhdCB0aGUgZHJhd2luZyBkb25lIHdpbGwgYmUgYXQgKDAsMCkgb2YgdGhlIGJpdG1hcC4KKyAg
ICAgICAgWEZPUk0geGZvcm07CisgICAgICAgIHhmb3JtLmVNMTEgPSAxLjA7CisgICAgICAgIHhm
b3JtLmVNMTIgPSAwOworICAgICAgICB4Zm9ybS5lTTIxID0gMDsKKyAgICAgICAgeGZvcm0uZU0y
MiA9IDEuMDsKKyAgICAgICAgeGZvcm0uZUR4ID0gLWRzdFJlY3QueCgpOworICAgICAgICB4Zm9y
bS5lRHkgPSAtZHN0UmVjdC55KCk7CisgICAgICAgIDo6U2V0V29ybGRUcmFuc2Zvcm0oYml0bWFw
REMsICZ4Zm9ybSk7CisKKyAgICAgICAgcmV0dXJuIGJpdG1hcERDOworICAgIH0KKworICAgIENH
Q29udGV4dEZsdXNoKHBsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBtX2RhdGEtPnNhdmUoKTsKKyAg
ICByZXR1cm4gbV9kYXRhLT5tX2hkYzsKK30KKworYm9vbCBHcmFwaGljc0NvbnRleHQ6OmluVHJh
bnNwYXJlbmN5TGF5ZXIoKSBjb25zdCB7IHJldHVybiBtX2RhdGEtPm1fdHJhbnNwYXJlbmN5Q291
bnQ7IH0KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnJlbGVhc2VXaW5kb3dzQ29udGV4dChIREMg
aGRjLCBjb25zdCBJbnRSZWN0JiBkc3RSZWN0LCBib29sIHN1cHBvcnRBbHBoYUJsZW5kKQorewor
ICAgIGlmIChoZGMgJiYgaW5UcmFuc3BhcmVuY3lMYXllcigpKSB7CisgICAgICAgIGlmIChkc3RS
ZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBIQklUTUFQIGJp
dG1hcCA9IChIQklUTUFQKUdldEN1cnJlbnRPYmplY3QoaGRjLCBPQkpfQklUTUFQKTsKKworICAg
ICAgICAvLyBOZWVkIHRvIG1ha2UgYSBDR0ltYWdlIG91dCBvZiB0aGUgYml0bWFwJ3MgcGl4ZWwg
YnVmZmVyIGFuZCB0aGVuIGRyYXcKKyAgICAgICAgLy8gaXQgaW50byBvdXIgY29udGV4dC4KKyAg
ICAgICAgQklUTUFQIGluZm87CisgICAgICAgIEdldE9iamVjdChiaXRtYXAsIHNpemVvZihpbmZv
KSwgJmluZm8pOworICAgICAgICBBU1NFUlQoaW5mby5ibUJpdHNQaXhlbCA9PSAzMik7CisKKyAg
ICAgICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmlj
ZVJHQigpOworICAgICAgICBDR0NvbnRleHRSZWYgYml0bWFwQ29udGV4dCA9IENHQml0bWFwQ29u
dGV4dENyZWF0ZShpbmZvLmJtQml0cywgaW5mby5ibVdpZHRoLCBpbmZvLmJtSGVpZ2h0LCA4LAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBpbmZvLmJtV2lkdGhCeXRlcywgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRs
ZSB8IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAoc3VwcG9ydEFscGhhQmxlbmQgPyBrQ0dJbWFnZUFscGhhUHJlbXVsdGlwbGllZEZp
cnN0IDoga0NHSW1hZ2VBbHBoYU5vbmVTa2lwRmlyc3QpKTsKKyAgICAgICAgQ0dDb2xvclNwYWNl
UmVsZWFzZShkZXZpY2VSR0IpOworCisgICAgICAgIENHSW1hZ2VSZWYgaW1hZ2UgPSBDR0JpdG1h
cENvbnRleHRDcmVhdGVJbWFnZShiaXRtYXBDb250ZXh0KTsKKyAgICAgICAgQ0dDb250ZXh0RHJh
d0ltYWdlKG1fZGF0YS0+bV9jZ0NvbnRleHQsIGRzdFJlY3QsIGltYWdlKTsKKyAgICAgICAgCisg
ICAgICAgIC8vIERlbGV0ZSBhbGwgb3VyIGp1bmsuCisgICAgICAgIENHSW1hZ2VSZWxlYXNlKGlt
YWdlKTsKKyAgICAgICAgQ0dDb250ZXh0UmVsZWFzZShiaXRtYXBDb250ZXh0KTsKKyAgICAgICAg
OjpEZWxldGVEQyhoZGMpOworICAgICAgICA6OkRlbGV0ZU9iamVjdChiaXRtYXApOworCisgICAg
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtX2RhdGEtPnJlc3RvcmUoKTsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnNhdmUoKQoreworICAgIGlmICghbV9oZGMp
CisgICAgICAgIHJldHVybjsKKyAgICBTYXZlREMobV9oZGMpOworfQorCit2b2lkIEdyYXBoaWNz
Q29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6cmVzdG9yZSgpCit7CisgICAgaWYgKCFtX2hkYykKKyAg
ICAgICAgcmV0dXJuOworICAgIFJlc3RvcmVEQyhtX2hkYywgLTEpOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y2xpcChjb25zdCBJbnRSZWN0JiBjbGlwUmVjdCkK
K3sKKyAgICBpZiAoIW1faGRjKQorICAgICAgICByZXR1cm47CisgICAgSW50ZXJzZWN0Q2xpcFJl
Y3QobV9oZGMsIGNsaXBSZWN0LngoKSwgY2xpcFJlY3QueSgpLCBjbGlwUmVjdC5yaWdodCgpLCBj
bGlwUmVjdC5ib3R0b20oKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2
YXRlOjpjbGlwKGNvbnN0IFBhdGgmKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpzY2FsZShjb25zdCBGbG9hdFNpemUm
IHNpemUpCit7CisgICAgaWYgKCFtX2hkYykKKyAgICAgICAgcmV0dXJuOworICAgIFhGT1JNIHhm
b3JtOworICAgIHhmb3JtLmVNMTEgPSBzaXplLndpZHRoKCk7CisgICAgeGZvcm0uZU0xMiA9IDA7
CisgICAgeGZvcm0uZU0yMSA9IDA7CisgICAgeGZvcm0uZU0yMiA9IHNpemUuaGVpZ2h0KCk7Cisg
ICAgeGZvcm0uZUR4ID0gMDsKKyAgICB4Zm9ybS5lRHkgPSAwOworICAgIE1vZGlmeVdvcmxkVHJh
bnNmb3JtKG1faGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOworfQorCitzdGF0aWMgY29u
c3QgZG91YmxlIGRlZzJyYWQgPSAwLjAxNzQ1MzI5MjUxOTk0MzI5NTc2OTsgLy8gcGkvMTgwCisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpyb3RhdGUoZmxvYXQgZGVncmVl
c0FuZ2xlKQoreworICAgIGZsb2F0IHJhZGlhbnNBbmdsZSA9IGRlZ3JlZXNBbmdsZSAqIGRlZzJy
YWQ7CisgICAgZmxvYXQgY29zQW5nbGUgPSBjb3NmKHJhZGlhbnNBbmdsZSk7CisgICAgZmxvYXQg
c2luQW5nbGUgPSBzaW5mKHJhZGlhbnNBbmdsZSk7CisgICAgWEZPUk0geGZvcm07CisgICAgeGZv
cm0uZU0xMSA9IGNvc0FuZ2xlOworICAgIHhmb3JtLmVNMTIgPSAtc2luQW5nbGU7CisgICAgeGZv
cm0uZU0yMSA9IHNpbkFuZ2xlOworICAgIHhmb3JtLmVNMjIgPSBjb3NBbmdsZTsKKyAgICB4Zm9y
bS5lRHggPSAwOworICAgIHhmb3JtLmVEeSA9IDA7CisgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0o
bV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250
ZXh0UGxhdGZvcm1Qcml2YXRlOjp0cmFuc2xhdGUoZmxvYXQgeCAsIGZsb2F0IHkpCit7CisgICAg
aWYgKCFtX2hkYykKKyAgICAgICAgcmV0dXJuOworICAgIFhGT1JNIHhmb3JtOworICAgIHhmb3Jt
LmVNMTEgPSAxLjA7CisgICAgeGZvcm0uZU0xMiA9IDA7CisgICAgeGZvcm0uZU0yMSA9IDA7Cisg
ICAgeGZvcm0uZU0yMiA9IDEuMDsKKyAgICB4Zm9ybS5lRHggPSB4OworICAgIHhmb3JtLmVEeSA9
IHk7CisgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxU
SVBMWSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpjb25jYXRD
VE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFuc2Zvcm0pCit7CisgICAgaWYgKCFtX2hkYykK
KyAgICAgICAgcmV0dXJuOworICAgIENHQWZmaW5lVHJhbnNmb3JtIG1hdCA9IHRyYW5zZm9ybTsK
KyAgICBYRk9STSB4Zm9ybTsKKyAgICB4Zm9ybS5lTTExID0gbWF0LmE7CisgICAgeGZvcm0uZU0x
MiA9IG1hdC5iOworICAgIHhmb3JtLmVNMjEgPSBtYXQuYzsKKyAgICB4Zm9ybS5lTTIyID0gbWF0
LmQ7CisgICAgeGZvcm0uZUR4ID0gbWF0LnR4OworICAgIHhmb3JtLmVEeSA9IG1hdC50eTsKKyAg
ICBNb2RpZnlXb3JsZFRyYW5zZm9ybShtX2hkYywgJnhmb3JtLCBNV1RfTEVGVE1VTFRJUExZKTsK
K30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1c1JpbmcoY29uc3QgQ29sb3ImIGNv
bG9yKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIGZsb2F0IHJhZGl1cyA9IChmb2N1c1JpbmdXaWR0aCgpIC0gMSkgLyAyLjBmOworICAgIGlu
dCBvZmZzZXQgPSByYWRpdXMgKyBmb2N1c1JpbmdPZmZzZXQoKTsKKyAgICBDR0NvbG9yUmVmIGNv
bG9yUmVmID0gY29sb3IuaXNWYWxpZCgpID8gY2dDb2xvcihjb2xvcikgOiAwOworCisgICAgQ0dN
dXRhYmxlUGF0aFJlZiBmb2N1c1JpbmdQYXRoID0gQ0dQYXRoQ3JlYXRlTXV0YWJsZSgpOworICAg
IGNvbnN0IFZlY3RvcjxJbnRSZWN0PiYgcmVjdHMgPSBmb2N1c1JpbmdSZWN0cygpOworICAgIHVu
c2lnbmVkIHJlY3RDb3VudCA9IHJlY3RzLnNpemUoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgcmVjdENvdW50OyBpKyspCisgICAgICAgIENHUGF0aEFkZFJlY3QoZm9jdXNSaW5nUGF0
aCwgMCwgQ0dSZWN0SW5zZXQocmVjdHNbaV0sIC1vZmZzZXQsIC1vZmZzZXQpKTsKKworICAgIENH
Q29udGV4dFJlZiBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCk7CisgICAgQ0dDb250ZXh0U2F2
ZUdTdGF0ZShjb250ZXh0KTsKKworICAgIENHQ29udGV4dEJlZ2luUGF0aChjb250ZXh0KTsKKyAg
ICBDR0NvbnRleHRBZGRQYXRoKGNvbnRleHQsIGZvY3VzUmluZ1BhdGgpOworCisgICAgd2tEcmF3
Rm9jdXNSaW5nKGNvbnRleHQsIGNvbG9yUmVmLCByYWRpdXMpOworCisgICAgQ0dDb2xvclJlbGVh
c2UoY29sb3JSZWYpOworCisgICAgQ0dQYXRoUmVsZWFzZShmb2N1c1JpbmdQYXRoKTsKKworICAg
IENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29udGV4dCk7Cit9CisKK3N0YXRpYyBjb25zdCBDb2xv
ciYgc3BlbGxpbmdQYXR0ZXJuQ29sb3IoKSB7CisgICAgc3RhdGljIGNvbnN0IENvbG9yIHNwZWxs
aW5nQ29sb3IoMjU1LCAwLCAwKTsKKyAgICByZXR1cm4gc3BlbGxpbmdDb2xvcjsKK30KKworc3Rh
dGljIGNvbnN0IENvbG9yJiBncmFtbWFyUGF0dGVybkNvbG9yKCkgeworICAgIHN0YXRpYyBjb25z
dCBDb2xvciBncmFtbWFyQ29sb3IoMCwgMTI4LCAwKTsKKyAgICByZXR1cm4gZ3JhbW1hckNvbG9y
OworfQorCisvLyBQdWxsZWQgZnJvbSBHcmFwaGljc0NvbnRleHRDRworc3RhdGljIHZvaWQgc2V0
Q0dTdHJva2VDb2xvcihDR0NvbnRleHRSZWYgY29udGV4dCwgY29uc3QgQ29sb3ImIGNvbG9yKQor
eworICAgIENHRmxvYXQgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGE7CisgICAgY29sb3IuZ2V0UkdC
QShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisgICAgQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29s
b3IoY29udGV4dCwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworfQorCit2b2lkIEdyYXBoaWNz
Q29udGV4dDo6ZHJhd0xpbmVGb3JNaXNzcGVsbGluZ09yQmFkR3JhbW1hcihjb25zdCBJbnRQb2lu
dCYgcG9pbnQsIGludCB3aWR0aCwgYm9vbCBncmFtbWFyKQoreworICAgIGlmIChwYWludGluZ0Rp
c2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICAvLyBUaGVzZSBhcmUgdGhlIHNh
bWUgZm9yIG1pc3NwZWxsaW5nIG9yIGJhZCBncmFtbWFyCisgICAgY29uc3QgaW50IHBhdHRlcm5I
ZWlnaHQgPSAzOyAvLyAzIHJvd3MKKyAgICBBU1NFUlQoY01pc3NwZWxsaW5nTGluZVRoaWNrbmVz
cyA9PSBwYXR0ZXJuSGVpZ2h0KTsKKyAgICBjb25zdCBpbnQgcGF0dGVybldpZHRoID0gNDsgLy8g
NCBwaXhlbHMKKyAgICBBU1NFUlQocGF0dGVybldpZHRoID09IGNNaXNzcGVsbGluZ0xpbmVQYXR0
ZXJuV2lkdGgpOworCisgICAgLy8gTWFrZSBzdXJlIHRvIGRyYXcgb25seSBjb21wbGV0ZSBkb3Rz
LgorICAgIC8vIE5PVEU6IENvZGUgaGVyZSB1c2VkIHRvIHNoaWZ0IHRoZSB1bmRlcmxpbmUgdG8g
dGhlIGxlZnQgYW5kIGluY3JlYXNlIHRoZSB3aWR0aAorICAgIC8vIHRvIG1ha2Ugc3VyZSBldmVy
eXRoaW5nIGdldHMgdW5kZXJsaW5lZCwgYnV0IHRoYXQgcmVzdWx0cyBpbiBkcmF3aW5nIG91dCBv
ZgorICAgIC8vIGJvdW5kcyAoZS5nLiB3aGVuIGF0IHRoZSBlZGdlIG9mIGEgdmlldykgYW5kIGNv
dWxkIG1ha2UgaXQgYXBwZWFyIHRoYXQgdGhlCisgICAgLy8gc3BhY2UgYmV0d2VlbiBhZGphY2Vu
dCBtaXNzcGVsbGVkIHdvcmRzIHdhcyB1bmRlcmxpbmVkLgorICAgIC8vIGFsbG93IHNsaWdodGx5
IG1vcmUgY29uc2lkZXJpbmcgdGhhdCB0aGUgcGF0dGVybiBlbmRzIHdpdGggYSB0cmFuc3BhcmVu
dCBwaXhlbAorICAgIGludCB3aWR0aE1vZCA9IHdpZHRoICUgcGF0dGVybldpZHRoOworICAgIGlm
IChwYXR0ZXJuV2lkdGggLSB3aWR0aE1vZCA+IGNNaXNzcGVsbGluZ0xpbmVQYXR0ZXJuR2FwV2lk
dGgpCisgICAgICAgIHdpZHRoIC09IHdpZHRoTW9kOworICAgICAgCisgICAgLy8gRHJhdyB0aGUg
dW5kZXJsaW5lCisgICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsK
KyAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQpOworCisgICAgY29uc3QgQ29sb3ImIHBh
dHRlcm5Db2xvciA9IGdyYW1tYXIgPyBncmFtbWFyUGF0dGVybkNvbG9yKCkgOiBzcGVsbGluZ1Bh
dHRlcm5Db2xvcigpOworICAgIHNldENHU3Ryb2tlQ29sb3IoY29udGV4dCwgcGF0dGVybkNvbG9y
KTsKKworICAgIHdrU2V0UGF0dGVyblBoYXNlSW5Vc2VyU3BhY2UoY29udGV4dCwgcG9pbnQpOwor
ICAgIENHQ29udGV4dFNldEJsZW5kTW9kZShjb250ZXh0LCBrQ0dCbGVuZE1vZGVOb3JtYWwpOwor
ICAgIAorICAgIC8vIDMgcm93cywgZWFjaCBvZmZzZXQgYnkgaGFsZiBhIHBpeGVsIGZvciBibGVu
ZGluZyBwdXJwb3NlcworICAgIGNvbnN0IENHUG9pbnQgdXBwZXJQb2ludHMgW10gPSB7e3BvaW50
LngoKSwgcG9pbnQueSgpICsgcGF0dGVybkhlaWdodCAtIDIuNSB9LCB7cG9pbnQueCgpICsgd2lk
dGgsIHBvaW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAyLjV9fTsKKyAgICBjb25zdCBDR1BvaW50
IG1pZGRsZVBvaW50cyBbXSA9IHt7cG9pbnQueCgpLCBwb2ludC55KCkgKyBwYXR0ZXJuSGVpZ2h0
IC0gMS41IH0sIHtwb2ludC54KCkgKyB3aWR0aCwgcG9pbnQueSgpICsgcGF0dGVybkhlaWdodCAt
IDEuNX19OworICAgIGNvbnN0IENHUG9pbnQgbG93ZXJQb2ludHMgW10gPSB7e3BvaW50LngoKSwg
cG9pbnQueSgpICsgcGF0dGVybkhlaWdodCAtIDAuNSB9LCB7cG9pbnQueCgpICsgd2lkdGgsIHBv
aW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAwLjUgfX07CisgICAgCisgICAgLy8gRGFzaCBsZW5n
dGhzIGZvciB0aGUgdG9wIGFuZCBib3R0b20gb2YgdGhlIGVycm9yIHVuZGVybGluZSBhcmUgdGhl
IHNhbWUuCisgICAgLy8gVGhlc2UgYXJlIG1hZ2ljLgorICAgIHN0YXRpYyBjb25zdCBmbG9hdCBl
ZGdlX2Rhc2hfbGVuZ3Roc1tdID0gezIsIDJ9OworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBtaWRk
bGVfZGFzaF9sZW5ndGhzW10gPSB7Mi43NmYsIDEuMjRmfTsKKyAgICBzdGF0aWMgY29uc3QgZmxv
YXQgZWRnZV9vZmZzZXQgPSAtKGVkZ2VfZGFzaF9sZW5ndGhzWzFdIC0gMS4wZikgLyAyLjBmOwor
ICAgIHN0YXRpYyBjb25zdCBmbG9hdCBtaWRkbGVfb2Zmc2V0ID0gLShtaWRkbGVfZGFzaF9sZW5n
dGhzWzFdIC0gMS4wZikgLyAyLjBmOworCisgICAgLy8gTGluZSBvcGFjaXRpZXMuICBPbmNlIGFn
YWluLCB0aGVzZSBhcmUgbWFnaWMuCisgICAgY29uc3QgZmxvYXQgdXBwZXJPcGFjaXR5ID0gMC4z
M2Y7CisgICAgY29uc3QgZmxvYXQgbWlkZGxlT3BhY2l0eSA9IDAuNzVmOworICAgIGNvbnN0IGZs
b2F0IGxvd2VyT3BhY2l0eSA9IDAuODhmOworCisgICAgLy9Ub3AgbGluZQorICAgIENHQ29udGV4
dFNldExpbmVEYXNoKGNvbnRleHQsIGVkZ2Vfb2Zmc2V0LCBlZGdlX2Rhc2hfbGVuZ3RocywgCisg
ICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVkZ2VfZGFzaF9sZW5ndGhzKSAvIHNpemVv
ZihlZGdlX2Rhc2hfbGVuZ3Roc1swXSkpOworICAgIENHQ29udGV4dFNldEFscGhhKGNvbnRleHQs
IHVwcGVyT3BhY2l0eSk7CisgICAgQ0dDb250ZXh0U3Ryb2tlTGluZVNlZ21lbnRzKGNvbnRleHQs
IHVwcGVyUG9pbnRzLCAyKTsKKyAKKyAgICAvLyBNaWRkbGUgbGluZQorICAgIENHQ29udGV4dFNl
dExpbmVEYXNoKGNvbnRleHQsIG1pZGRsZV9vZmZzZXQsIG1pZGRsZV9kYXNoX2xlbmd0aHMsIAor
ICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihtaWRkbGVfZGFzaF9sZW5ndGhzKSAvIHNp
emVvZihtaWRkbGVfZGFzaF9sZW5ndGhzWzBdKSk7CisgICAgQ0dDb250ZXh0U2V0QWxwaGEoY29u
dGV4dCwgbWlkZGxlT3BhY2l0eSk7CisgICAgQ0dDb250ZXh0U3Ryb2tlTGluZVNlZ21lbnRzKGNv
bnRleHQsIG1pZGRsZVBvaW50cywgMik7CisgICAgCisgICAgLy8gQm90dG9tIGxpbmUKKyAgICBD
R0NvbnRleHRTZXRMaW5lRGFzaChjb250ZXh0LCBlZGdlX29mZnNldCwgZWRnZV9kYXNoX2xlbmd0
aHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVkZ2VfZGFzaF9sZW5ndGhzKSAv
IHNpemVvZihlZGdlX2Rhc2hfbGVuZ3Roc1swXSkpOworICAgIENHQ29udGV4dFNldEFscGhhKGNv
bnRleHQsIGxvd2VyT3BhY2l0eSk7CisgICAgQ0dDb250ZXh0U3Ryb2tlTGluZVNlZ21lbnRzKGNv
bnRleHQsIGxvd2VyUG9pbnRzLCAyKTsKKworICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29u
dGV4dCk7Cit9CisKKyNpZiBFTkFCTEUoU1ZHKQorR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0Rm9y
SW1hZ2UoU1ZHUmVzb3VyY2VJbWFnZSopCit7CisgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGdv
IGluIEdyYXBoaWNzQ29udGV4dENHLmNwcAorICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0
dXJuIDA7Cit9CisjZW5kaWYKKworfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW4vR3JhcGhpY3NDb250ZXh0Q0dXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENHV2luLmNwcAkocmV2aXNpb24gMjk3MjYp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRDR1dpbi5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAy
MDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKQEAgLTI5LDIxICsyOSwxOCBAQAogI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgog
I2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCiAjaW5jbHVkZSAiUGF0aC5oIgorCiAjaW5jbHVk
ZSA8Q29yZUdyYXBoaWNzL0NHQml0bWFwQ29udGV4dC5oPgogI2luY2x1ZGUgPFdlYktpdFN5c3Rl
bUludGVyZmFjZS9XZWJLaXRTeXN0ZW1JbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx3dGYvTWF0aEV4
dHJhcy5oPgotCi0jaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmgiCisj
aW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlQ0cuaCIKIAogdXNpbmcgbmFt
ZXNwYWNlIHN0ZDsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1jbGFzcyBTVkdSZXNvdXJjZUlt
YWdlOwotCiBzdGF0aWMgQ0dDb250ZXh0UmVmIENHQ29udGV4dFdpdGhIREMoSERDIGhkYykKIHsK
LSAgICBIQklUTUFQIGJpdG1hcCA9IChIQklUTUFQKUdldEN1cnJlbnRPYmplY3QoaGRjLCBPQkpf
QklUTUFQKTsKKyAgICBIQklUTUFQIGJpdG1hcCA9IHN0YXRpY19jYXN0PEhCSVRNQVA+KEdldEN1
cnJlbnRPYmplY3QoaGRjLCBPQkpfQklUTUFQKSk7CiAgICAgQ0dDb2xvclNwYWNlUmVmIGRldmlj
ZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwogICAgIEJJVE1BUCBpbmZvOwog
CkBAIC03Nyw2ICs3NCw4IEBAIEdyYXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0KEhEQyBo
ZGMKICAgICB9CiB9CiAKK2Jvb2wgR3JhcGhpY3NDb250ZXh0OjppblRyYW5zcGFyZW5jeUxheWVy
KCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLT5tX3RyYW5zcGFyZW5jeUNvdW50OyB9CisKIEhEQyBH
cmFwaGljc0NvbnRleHQ6OmdldFdpbmRvd3NDb250ZXh0KGNvbnN0IEludFJlY3QmIGRzdFJlY3Qs
IGJvb2wgc3VwcG9ydEFscGhhQmxlbmQpCiB7CiAgICAgaWYgKGluVHJhbnNwYXJlbmN5TGF5ZXIo
KSkgewpAQCAtMTE4LDEwICsxMTcsMTAgQEAgSERDIEdyYXBoaWNzQ29udGV4dDo6Z2V0V2luZG93
c0NvbnRleHQoYwogCiAgICAgICAgIC8vIEFwcGx5IGEgdHJhbnNsYXRpb24gdG8gb3VyIGNvbnRl
eHQgc28gdGhhdCB0aGUgZHJhd2luZyBkb25lIHdpbGwgYmUgYXQgKDAsMCkgb2YgdGhlIGJpdG1h
cC4KICAgICAgICAgWEZPUk0geGZvcm07Ci0gICAgICAgIHhmb3JtLmVNMTEgPSAxLjA7Ci0gICAg
ICAgIHhmb3JtLmVNMTIgPSAwOwotICAgICAgICB4Zm9ybS5lTTIxID0gMDsKLSAgICAgICAgeGZv
cm0uZU0yMiA9IDEuMDsKKyAgICAgICAgeGZvcm0uZU0xMSA9IDEuMGY7CisgICAgICAgIHhmb3Jt
LmVNMTIgPSAwLjBmOworICAgICAgICB4Zm9ybS5lTTIxID0gMC4wZjsKKyAgICAgICAgeGZvcm0u
ZU0yMiA9IDEuMGY7CiAgICAgICAgIHhmb3JtLmVEeCA9IC1kc3RSZWN0LngoKTsKICAgICAgICAg
eGZvcm0uZUR5ID0gLWRzdFJlY3QueSgpOwogICAgICAgICA6OlNldFdvcmxkVHJhbnNmb3JtKGJp
dG1hcERDLCAmeGZvcm0pOwpAQCAtMTM0LDE1ICsxMzMsMTMgQEAgSERDIEdyYXBoaWNzQ29udGV4
dDo6Z2V0V2luZG93c0NvbnRleHQoYwogICAgIHJldHVybiBtX2RhdGEtPm1faGRjOwogfQogCi1i
b29sIEdyYXBoaWNzQ29udGV4dDo6aW5UcmFuc3BhcmVuY3lMYXllcigpIGNvbnN0IHsgcmV0dXJu
IG1fZGF0YS0+bV90cmFuc3BhcmVuY3lDb3VudDsgfQotCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6
cmVsZWFzZVdpbmRvd3NDb250ZXh0KEhEQyBoZGMsIGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGJv
b2wgc3VwcG9ydEFscGhhQmxlbmQpCiB7CiAgICAgaWYgKGhkYyAmJiBpblRyYW5zcGFyZW5jeUxh
eWVyKCkpIHsKICAgICAgICAgaWYgKGRzdFJlY3QuaXNFbXB0eSgpKQogICAgICAgICAgICAgcmV0
dXJuOwogCi0gICAgICAgIEhCSVRNQVAgYml0bWFwID0gKEhCSVRNQVApR2V0Q3VycmVudE9iamVj
dChoZGMsIE9CSl9CSVRNQVApOworICAgICAgICBIQklUTUFQIGJpdG1hcCA9IHN0YXRpY19jYXN0
PEhCSVRNQVA+KEdldEN1cnJlbnRPYmplY3QoaGRjLCBPQkpfQklUTUFQKSk7CiAKICAgICAgICAg
Ly8gTmVlZCB0byBtYWtlIGEgQ0dJbWFnZSBvdXQgb2YgdGhlIGJpdG1hcCdzIHBpeGVsIGJ1ZmZl
ciBhbmQgdGhlbiBkcmF3CiAgICAgICAgIC8vIGl0IGludG8gb3VyIGNvbnRleHQuCkBAIC0yMDMs
MTEgKzIwMCwxMSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6c2NhCiAg
ICAgICAgIHJldHVybjsKICAgICBYRk9STSB4Zm9ybTsKICAgICB4Zm9ybS5lTTExID0gc2l6ZS53
aWR0aCgpOwotICAgIHhmb3JtLmVNMTIgPSAwOwotICAgIHhmb3JtLmVNMjEgPSAwOworICAgIHhm
b3JtLmVNMTIgPSAwLjBmOworICAgIHhmb3JtLmVNMjEgPSAwLjBmOwogICAgIHhmb3JtLmVNMjIg
PSBzaXplLmhlaWdodCgpOwotICAgIHhmb3JtLmVEeCA9IDA7Ci0gICAgeGZvcm0uZUR5ID0gMDsK
KyAgICB4Zm9ybS5lRHggPSAwLjBmOworICAgIHhmb3JtLmVEeSA9IDAuMGY7CiAgICAgTW9kaWZ5
V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7CiB9CiAKQEAg
LTIyMyw4ICsyMjAsOCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6cm90
CiAgICAgeGZvcm0uZU0xMiA9IC1zaW5BbmdsZTsKICAgICB4Zm9ybS5lTTIxID0gc2luQW5nbGU7
CiAgICAgeGZvcm0uZU0yMiA9IGNvc0FuZ2xlOwotICAgIHhmb3JtLmVEeCA9IDA7Ci0gICAgeGZv
cm0uZUR5ID0gMDsKKyAgICB4Zm9ybS5lRHggPSAwLjBmOworICAgIHhmb3JtLmVEeSA9IDAuMGY7
CiAgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBM
WSk7CiB9CiAKQEAgLTIzMywxMCArMjMwLDEwIEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZv
cm1Qcml2YXRlOjp0cmEKICAgICBpZiAoIW1faGRjKQogICAgICAgICByZXR1cm47CiAgICAgWEZP
Uk0geGZvcm07Ci0gICAgeGZvcm0uZU0xMSA9IDEuMDsKLSAgICB4Zm9ybS5lTTEyID0gMDsKLSAg
ICB4Zm9ybS5lTTIxID0gMDsKLSAgICB4Zm9ybS5lTTIyID0gMS4wOworICAgIHhmb3JtLmVNMTEg
PSAxLjBmOworICAgIHhmb3JtLmVNMTIgPSAwLjBmOworICAgIHhmb3JtLmVNMjEgPSAwLjBmOwor
ICAgIHhmb3JtLmVNMjIgPSAxLjBmOwogICAgIHhmb3JtLmVEeCA9IHg7CiAgICAgeGZvcm0uZUR5
ID0geTsKICAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShtX2hkYywgJnhmb3JtLCBNV1RfTEVGVE1V
TFRJUExZKTsKQEAgLTI0Niw2ICsyNDMsNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3Jt
UHJpdmF0ZTo6Y29uCiB7CiAgICAgaWYgKCFtX2hkYykKICAgICAgICAgcmV0dXJuOworCiAgICAg
Q0dBZmZpbmVUcmFuc2Zvcm0gbWF0ID0gdHJhbnNmb3JtOwogICAgIFhGT1JNIHhmb3JtOwogICAg
IHhmb3JtLmVNMTEgPSBtYXQuYTsKQEAgLTI1NCw2ICsyNTIsNyBAQCB2b2lkIEdyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y29uCiAgICAgeGZvcm0uZU0yMiA9IG1hdC5kOwogICAgIHhm
b3JtLmVEeCA9IG1hdC50eDsKICAgICB4Zm9ybS5lRHkgPSBtYXQudHk7CisKICAgICBNb2RpZnlX
b3JsZFRyYW5zZm9ybShtX2hkYywgJnhmb3JtLCBNV1RfTEVGVE1VTFRJUExZKTsKIH0KIApAQCAt
Mjg3LDYgKzI4NiwxNCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0ZvY3VzUmluZyhjb25z
CiAgICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShjb250ZXh0KTsKIH0KIAorLy8gUHVsbGVkIGZy
b20gR3JhcGhpY3NDb250ZXh0Q0cKK3N0YXRpYyB2b2lkIHNldENHU3Ryb2tlQ29sb3IoQ0dDb250
ZXh0UmVmIGNvbnRleHQsIGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBDR0Zsb2F0IHJlZCwg
Z3JlZW4sIGJsdWUsIGFscGhhOworICAgIGNvbG9yLmdldFJHQkEocmVkLCBncmVlbiwgYmx1ZSwg
YWxwaGEpOworICAgIENHQ29udGV4dFNldFJHQlN0cm9rZUNvbG9yKGNvbnRleHQsIHJlZCwgZ3Jl
ZW4sIGJsdWUsIGFscGhhKTsKK30KKwogc3RhdGljIGNvbnN0IENvbG9yJiBzcGVsbGluZ1BhdHRl
cm5Db2xvcigpIHsKICAgICBzdGF0aWMgY29uc3QgQ29sb3Igc3BlbGxpbmdDb2xvcigyNTUsIDAs
IDApOwogICAgIHJldHVybiBzcGVsbGluZ0NvbG9yOwpAQCAtMjk3LDE5ICszMDQsMTEgQEAgc3Rh
dGljIGNvbnN0IENvbG9yJiBncmFtbWFyUGF0dGVybkNvbG9yKAogICAgIHJldHVybiBncmFtbWFy
Q29sb3I7CiB9CiAKLS8vIFB1bGxlZCBmcm9tIEdyYXBoaWNzQ29udGV4dENHCi1zdGF0aWMgdm9p
ZCBzZXRDR1N0cm9rZUNvbG9yKENHQ29udGV4dFJlZiBjb250ZXh0LCBjb25zdCBDb2xvciYgY29s
b3IpCi17Ci0gICAgQ0dGbG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKLSAgICBjb2xvci5n
ZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLSAgICBDR0NvbnRleHRTZXRSR0JTdHJv
a2VDb2xvcihjb250ZXh0LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci19Ci0KIHZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpkcmF3TGluZUZvck1pc3NwZWxsaW5nT3JCYWRHcmFtbWFyKGNvbnN0IElu
dFBvaW50JiBwb2ludCwgaW50IHdpZHRoLCBib29sIGdyYW1tYXIpCiB7CiAgICAgaWYgKHBhaW50
aW5nRGlzYWJsZWQoKSkKICAgICAgICAgcmV0dXJuOwotICAgIAorCiAgICAgLy8gVGhlc2UgYXJl
IHRoZSBzYW1lIGZvciBtaXNzcGVsbGluZyBvciBiYWQgZ3JhbW1hcgogICAgIGNvbnN0IGludCBw
YXR0ZXJuSGVpZ2h0ID0gMzsgLy8gMyByb3dzCiAgICAgQVNTRVJUKGNNaXNzcGVsbGluZ0xpbmVU
aGlja25lc3MgPT0gcGF0dGVybkhlaWdodCk7CkBAIC0zNDMsNyArMzQyLDcgQEAgdm9pZCBHcmFw
aGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yTWlzc3BlbAogICAgIAogICAgIC8vIERhc2ggbGVuZ3Ro
cyBmb3IgdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBlcnJvciB1bmRlcmxpbmUgYXJlIHRoZSBz
YW1lLgogICAgIC8vIFRoZXNlIGFyZSBtYWdpYy4KLSAgICBzdGF0aWMgY29uc3QgZmxvYXQgZWRn
ZV9kYXNoX2xlbmd0aHNbXSA9IHsyLCAyfTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgZWRnZV9k
YXNoX2xlbmd0aHNbXSA9IHsyLjBmLCAyLjBmfTsKICAgICBzdGF0aWMgY29uc3QgZmxvYXQgbWlk
ZGxlX2Rhc2hfbGVuZ3Roc1tdID0gezIuNzZmLCAxLjI0Zn07CiAgICAgc3RhdGljIGNvbnN0IGZs
b2F0IGVkZ2Vfb2Zmc2V0ID0gLShlZGdlX2Rhc2hfbGVuZ3Roc1sxXSAtIDEuMGYpIC8gMi4wZjsK
ICAgICBzdGF0aWMgY29uc3QgZmxvYXQgbWlkZGxlX29mZnNldCA9IC0obWlkZGxlX2Rhc2hfbGVu
Z3Roc1sxXSAtIDEuMGYpIC8gMi4wZjsKQEAgLTM3NCwxMyArMzczLDQgQEAgdm9pZCBHcmFwaGlj
c0NvbnRleHQ6OmRyYXdMaW5lRm9yTWlzc3BlbAogICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUo
Y29udGV4dCk7CiB9CiAKLSNpZiBFTkFCTEUoU1ZHKQotR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0
Rm9ySW1hZ2UoU1ZHUmVzb3VyY2VJbWFnZSopCi17Ci0gICAgLy8gRklYTUU6IFRoaXMgc2hvdWxk
IGdvIGluIEdyYXBoaWNzQ29udGV4dENHLmNwcAotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAg
cmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQogfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW4vR3JhcGhpY3NDb250ZXh0Q2Fpcm9XaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENhaXJvV2luLmNwcAkocmV2aXNp
b24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENh
aXJvV2luLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMDggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisKKyNpbmNsdWRl
ICJBZmZpbmVUcmFuc2Zvcm0uaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1
ZGUgIlBhdGguaCIKKworI2luY2x1ZGUgPGNhaXJvLXdpbjMyLmg+CisjaW5jbHVkZSAiR3JhcGhp
Y3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlQ2Fpcm8uaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsK
KworbmFtZXNwYWNlIFdlYkNvcmUgeworCitHcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4
dChIREMgZGMpCisgICAgOiBtX2NvbW1vbihjcmVhdGVHcmFwaGljc0NvbnRleHRQcml2YXRlKCkp
CisgICAgLCBtX2RhdGEobmV3IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSkKK3sKKyAg
ICBpZiAoZGMpIHsKKyAgICAgICAgY2Fpcm9fc3VyZmFjZV90KiBzdXJmYWNlID0gY2Fpcm9fd2lu
MzJfc3VyZmFjZV9jcmVhdGUoZGMpOworICAgICAgICBtX2RhdGEtPmNyID0gY2Fpcm9fY3JlYXRl
KHN1cmZhY2UpOworICAgICAgICBtX2RhdGEtPm1faGRjID0gZGM7CisgICAgfSBlbHNlIHsKKyAg
ICAgICAgc2V0UGFpbnRpbmdEaXNhYmxlZCh0cnVlKTsKKyAgICAgICAgbV9kYXRhLT5jciA9IDA7
CisgICAgICAgIG1fZGF0YS0+bV9oZGMgPSAwOworICAgIH0KKworICAgIGlmIChtX2RhdGEtPmNy
KSB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGV4dCBzdGFydHMgaW4gc3luYyB3aXRo
IG91ciBzdGF0ZS4KKyAgICAgICAgc2V0UGxhdGZvcm1GaWxsQ29sb3IoZmlsbENvbG9yKCkpOwor
ICAgICAgICBzZXRQbGF0Zm9ybVN0cm9rZUNvbG9yKHN0cm9rZUNvbG9yKCkpOworICAgIH0KK30K
KworSERDIEdyYXBoaWNzQ29udGV4dDo6Z2V0V2luZG93c0NvbnRleHQoY29uc3QgSW50UmVjdCYg
ZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVuZCkKK3sKKyAgICAvLyBUaGlzIGlzIHByb2Jh
Ymx5IHdyb25nLCBhbmQgZGVmaW5pdGVseSBvdXQgb2YgZGF0ZS4gIFB1bGxlZCBmcm9tIG9sZCBT
Vk4KKyAgICBjYWlyb19zdXJmYWNlX3QqIHN1cmZhY2UgPSBjYWlyb19nZXRfdGFyZ2V0KHBsYXRm
b3JtQ29udGV4dCgpKTsKKyAgICBIREMgaGRjID0gY2Fpcm9fd2luMzJfc3VyZmFjZV9nZXRfZGMo
c3VyZmFjZSk7ICAgCisgICAgU2F2ZURDKGhkYyk7CisKKyAgICAvLyBGSVhNRTogV2UgbmVlZCB0
byBtYWtlIHN1cmUgYSBjbGlwIGlzIHJlYWxseSBzZXQgb24gdGhlIEhEQy4KKyAgICAvLyBDYWxs
IFNldFdvcmxkVHJhbnNmb3JtIHRvIGhvbm9yIHRoZSBjdXJyZW50IENhaXJvIHRyYW5zZm9ybS4K
KyAgICBTZXRHcmFwaGljc01vZGUoaGRjLCBHTV9BRFZBTkNFRCk7IC8vIFdlIG5lZWQgdGhpcyBj
YWxsIGZvciB0aGVtZXMgdG8gaG9ub3Igd29ybGQgdHJhbnNmb3Jtcy4KKyAgICBjYWlyb19tYXRy
aXhfdCBtYXQ7CisgICAgY2Fpcm9fZ2V0X21hdHJpeChwbGF0Zm9ybUNvbnRleHQoKSwgJm1hdCk7
CisgICAgWEZPUk0geGZvcm07CisgICAgeGZvcm0uZU0xMSA9IG1hdC54eDsKKyAgICB4Zm9ybS5l
TTEyID0gbWF0Lnh5OworICAgIHhmb3JtLmVNMjEgPSBtYXQueXg7CisgICAgeGZvcm0uZU0yMiA9
IG1hdC55eTsKKyAgICB4Zm9ybS5lRHggPSBtYXQueDA7CisgICAgeGZvcm0uZUR5ID0gbWF0Lnkw
OworICAgIFNldFdvcmxkVHJhbnNmb3JtKGhkYywgJnhmb3JtKTsKKworICAgIHJldHVybiBoZGM7
Cit9CisKK2Jvb2wgR3JhcGhpY3NDb250ZXh0OjppblRyYW5zcGFyZW5jeUxheWVyKCkgY29uc3Qg
eyByZXR1cm4gbV9kYXRhLT5tX3RyYW5zcGFyZW5jeUNvdW50OyB9CisKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0OjpyZWxlYXNlV2luZG93c0NvbnRleHQoSERDIGhkYywgY29uc3QgSW50UmVjdCYgZHN0
UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVuZCkKK3sKKyAgICBjYWlyb19zdXJmYWNlX3QqIHN1
cmZhY2UgPSBjYWlyb19nZXRfdGFyZ2V0KHBsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBIREMgaGRj
MiA9IGNhaXJvX3dpbjMyX3N1cmZhY2VfZ2V0X2RjKHN1cmZhY2UpOworICAgIFJlc3RvcmVEQyho
ZGMyLCAtMSk7CisgICAgY2Fpcm9fc3VyZmFjZV9tYXJrX2RpcnR5KHN1cmZhY2UpOworfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dDo6Y29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdHJh
bnNmb3JtKQoreworICAgIGNhaXJvX3N1cmZhY2VfdCogc3VyZmFjZSA9IGNhaXJvX2dldF90YXJn
ZXQocGxhdGZvcm1Db250ZXh0KCkpOworICAgIEhEQyBoZGMgPSBjYWlyb193aW4zMl9zdXJmYWNl
X2dldF9kYyhzdXJmYWNlKTsgICAKKyAgICBTYXZlREMoaGRjKTsKKworICAgIGNhaXJvX21hdHJp
eF90IG1hdDsKKyAgICBjYWlyb19nZXRfbWF0cml4KHBsYXRmb3JtQ29udGV4dCgpLCAmbWF0KTsK
KyAgICBYRk9STSB4Zm9ybTsKKyAgICB4Zm9ybS5lTTExID0gbWF0Lnh4OworICAgIHhmb3JtLmVN
MTIgPSBtYXQueHk7CisgICAgeGZvcm0uZU0yMSA9IG1hdC55eDsKKyAgICB4Zm9ybS5lTTIyID0g
bWF0Lnl5OworICAgIHhmb3JtLmVEeCA9IG1hdC54MDsKKyAgICB4Zm9ybS5lRHkgPSBtYXQueTA7
CisKKyAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShoZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBM
WSk7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNz
Q29udGV4dFdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW4vR3JhcGhpY3NDb250ZXh0V2luLmNwcAkocmV2aXNpb24gMzAwNDgpCisrKyBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRXaW4uY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwg
MjAwNiwgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yOSwzNTEg
KzI5LDE0IEBACiAjaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCiAjaW5jbHVkZSAiTm90SW1w
bGVtZW50ZWQuaCIKICNpbmNsdWRlICJQYXRoLmgiCi0jaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NH
Qml0bWFwQ29udGV4dC5oPgotI2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVyZmFjZS9XZWJLaXRT
eXN0ZW1JbnRlcmZhY2UuaD4KICNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgogCi0jaW5jbHVk
ZSAiR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmgiCi0KIHVzaW5nIG5hbWVzcGFjZSBz
dGQ7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xhc3MgU1ZHUmVzb3VyY2VJbWFnZTsKIAot
c3RhdGljIENHQ29udGV4dFJlZiBDR0NvbnRleHRXaXRoSERDKEhEQyBoZGMpCi17Ci0gICAgSEJJ
VE1BUCBiaXRtYXAgPSAoSEJJVE1BUClHZXRDdXJyZW50T2JqZWN0KGhkYywgT0JKX0JJVE1BUCk7
Ci0gICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmlj
ZVJHQigpOwotICAgIEJJVE1BUCBpbmZvOwotCi0gICAgR2V0T2JqZWN0KGJpdG1hcCwgc2l6ZW9m
KGluZm8pLCAmaW5mbyk7Ci0gICAgQVNTRVJUKGluZm8uYm1CaXRzUGl4ZWwgPT0gMzIpOwotICAg
IENHQ29udGV4dFJlZiBjb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGluZm8uYm1CaXRz
LCBpbmZvLmJtV2lkdGgsIGluZm8uYm1IZWlnaHQsIDgsCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJHQiwg
a0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhhTm9uZVNraXBGaXJzdCk7
Ci0gICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOwotCi0gICAgLy8gRmxpcCBjb29y
ZHMKLSAgICBDR0NvbnRleHRUcmFuc2xhdGVDVE0oY29udGV4dCwgMCwgaW5mby5ibUhlaWdodCk7
Ci0gICAgQ0dDb250ZXh0U2NhbGVDVE0oY29udGV4dCwgMSwgLTEpOwotICAgIAotICAgIC8vIFB1
dCB0aGUgSERDIEluIGFkdmFuY2VkIG1vZGUgc28gaXQgd2lsbCBob25vciBhZmZpbmUgdHJhbnNm
b3Jtcy4KLSAgICBTZXRHcmFwaGljc01vZGUoaGRjLCBHTV9BRFZBTkNFRCk7Ci0gICAgCi0gICAg
cmV0dXJuIGNvbnRleHQ7Ci19Ci0KLUdyYXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0KEhE
QyBoZGMpCi0gICAgOiBtX2NvbW1vbihjcmVhdGVHcmFwaGljc0NvbnRleHRQcml2YXRlKCkpCi0g
ICAgLCBtX2RhdGEobmV3IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZShDR0NvbnRleHRX
aXRoSERDKGhkYykpKQotewotICAgIENHQ29udGV4dFJlbGVhc2UobV9kYXRhLT5tX2NnQ29udGV4
dCk7Ci0gICAgbV9kYXRhLT5tX2hkYyA9IGhkYzsKLSAgICBzZXRQYWludGluZ0Rpc2FibGVkKCFt
X2RhdGEtPm1fY2dDb250ZXh0KTsKLSAgICBpZiAobV9kYXRhLT5tX2NnQ29udGV4dCkgewotICAg
ICAgICAvLyBNYWtlIHN1cmUgdGhlIGNvbnRleHQgc3RhcnRzIGluIHN5bmMgd2l0aCBvdXIgc3Rh
dGUuCi0gICAgICAgIHNldFBsYXRmb3JtRmlsbENvbG9yKGZpbGxDb2xvcigpKTsKLSAgICAgICAg
c2V0UGxhdGZvcm1TdHJva2VDb2xvcihzdHJva2VDb2xvcigpKTsKLSAgICB9Ci19Ci0KLUhEQyBH
cmFwaGljc0NvbnRleHQ6OmdldFdpbmRvd3NDb250ZXh0KGNvbnN0IEludFJlY3QmIGRzdFJlY3Qs
IGJvb2wgc3VwcG9ydEFscGhhQmxlbmQpCi17Ci0gICAgaWYgKGluVHJhbnNwYXJlbmN5TGF5ZXIo
KSkgewotICAgICAgICBpZiAoZHN0UmVjdC5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4g
MDsKLQotICAgICAgICAvLyBDcmVhdGUgYSBiaXRtYXAgREMgaW4gd2hpY2ggdG8gZHJhdy4KLSAg
ICAgICAgQklUTUFQSU5GTyBiaXRtYXBJbmZvOwotICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRl
ci5iaVNpemUgICAgICAgICAgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7Ci0gICAgICAgIGJp
dG1hcEluZm8uYm1pSGVhZGVyLmJpV2lkdGggICAgICAgICA9IGRzdFJlY3Qud2lkdGgoKTsgCi0g
ICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpSGVpZ2h0ICAgICAgICA9IGRzdFJlY3QuaGVp
Z2h0KCk7Ci0gICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpUGxhbmVzICAgICAgICA9IDE7
Ci0gICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpQml0Q291bnQgICAgICA9IDMyOwotICAg
ICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUNvbXByZXNzaW9uICAgPSBCSV9SR0I7Ci0gICAg
ICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpU2l6ZUltYWdlICAgICA9IDA7Ci0gICAgICAgIGJp
dG1hcEluZm8uYm1pSGVhZGVyLmJpWFBlbHNQZXJNZXRlciA9IDA7Ci0gICAgICAgIGJpdG1hcElu
Zm8uYm1pSGVhZGVyLmJpWVBlbHNQZXJNZXRlciA9IDA7Ci0gICAgICAgIGJpdG1hcEluZm8uYm1p
SGVhZGVyLmJpQ2xyVXNlZCAgICAgICA9IDA7Ci0gICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVy
LmJpQ2xySW1wb3J0YW50ICA9IDA7Ci0KLSAgICAgICAgdm9pZCogcGl4ZWxzID0gMDsKLSAgICAg
ICAgSEJJVE1BUCBiaXRtYXAgPSA6OkNyZWF0ZURJQlNlY3Rpb24oTlVMTCwgJmJpdG1hcEluZm8s
IERJQl9SR0JfQ09MT1JTLCAmcGl4ZWxzLCAwLCAwKTsKLSAgICAgICAgaWYgKCFiaXRtYXApCi0g
ICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBIREMgYml0bWFwREMgPSA6OkNyZWF0ZUNv
bXBhdGlibGVEQyhtX2RhdGEtPm1faGRjKTsKLSAgICAgICAgOjpTZWxlY3RPYmplY3QoYml0bWFw
REMsIGJpdG1hcCk7Ci0KLSAgICAgICAgLy8gRmlsbCBvdXIgYnVmZmVyIHdpdGggY2xlYXIgaWYg
d2UncmUgZ29pbmcgdG8gYWxwaGEgYmxlbmQuCi0gICAgICAgIGlmIChzdXBwb3J0QWxwaGFCbGVu
ZCkgewotICAgICAgICAgICAgQklUTUFQIGJtcEluZm87Ci0gICAgICAgICAgICBHZXRPYmplY3Qo
Yml0bWFwLCBzaXplb2YoYm1wSW5mbyksICZibXBJbmZvKTsKLSAgICAgICAgICAgIGludCBidWZm
ZXJTaXplID0gYm1wSW5mby5ibVdpZHRoQnl0ZXMgKiBibXBJbmZvLmJtSGVpZ2h0OwotICAgICAg
ICAgICAgbWVtc2V0KGJtcEluZm8uYm1CaXRzLCAwLCBidWZmZXJTaXplKTsKLSAgICAgICAgfQot
Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBjYW4gZG8gd29ybGQgdHJhbnNmb3Jtcy4KLSAgICAg
ICAgU2V0R3JhcGhpY3NNb2RlKGJpdG1hcERDLCBHTV9BRFZBTkNFRCk7Ci0KLSAgICAgICAgLy8g
QXBwbHkgYSB0cmFuc2xhdGlvbiB0byBvdXIgY29udGV4dCBzbyB0aGF0IHRoZSBkcmF3aW5nIGRv
bmUgd2lsbCBiZSBhdCAoMCwwKSBvZiB0aGUgYml0bWFwLgotICAgICAgICBYRk9STSB4Zm9ybTsK
LSAgICAgICAgeGZvcm0uZU0xMSA9IDEuMDsKLSAgICAgICAgeGZvcm0uZU0xMiA9IDA7Ci0gICAg
ICAgIHhmb3JtLmVNMjEgPSAwOwotICAgICAgICB4Zm9ybS5lTTIyID0gMS4wOwotICAgICAgICB4
Zm9ybS5lRHggPSAtZHN0UmVjdC54KCk7Ci0gICAgICAgIHhmb3JtLmVEeSA9IC1kc3RSZWN0Lnko
KTsKLSAgICAgICAgOjpTZXRXb3JsZFRyYW5zZm9ybShiaXRtYXBEQywgJnhmb3JtKTsKLQotICAg
ICAgICByZXR1cm4gYml0bWFwREM7Ci0gICAgfQotCi0gICAgQ0dDb250ZXh0Rmx1c2gocGxhdGZv
cm1Db250ZXh0KCkpOwotICAgIG1fZGF0YS0+c2F2ZSgpOwotICAgIHJldHVybiBtX2RhdGEtPm1f
aGRjOwotfQotCi1ib29sIEdyYXBoaWNzQ29udGV4dDo6aW5UcmFuc3BhcmVuY3lMYXllcigpIGNv
bnN0IHsgcmV0dXJuIG1fZGF0YS0+bV90cmFuc3BhcmVuY3lDb3VudDsgfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDo6cmVsZWFzZVdpbmRvd3NDb250ZXh0KEhEQyBoZGMsIGNvbnN0IEludFJlY3Qm
IGRzdFJlY3QsIGJvb2wgc3VwcG9ydEFscGhhQmxlbmQpCi17Ci0gICAgaWYgKGhkYyAmJiBpblRy
YW5zcGFyZW5jeUxheWVyKCkpIHsKLSAgICAgICAgaWYgKGRzdFJlY3QuaXNFbXB0eSgpKQotICAg
ICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIEhCSVRNQVAgYml0bWFwID0gKEhCSVRNQVApR2V0
Q3VycmVudE9iamVjdChoZGMsIE9CSl9CSVRNQVApOwotCi0gICAgICAgIC8vIE5lZWQgdG8gbWFr
ZSBhIENHSW1hZ2Ugb3V0IG9mIHRoZSBiaXRtYXAncyBwaXhlbCBidWZmZXIgYW5kIHRoZW4gZHJh
dwotICAgICAgICAvLyBpdCBpbnRvIG91ciBjb250ZXh0LgotICAgICAgICBCSVRNQVAgaW5mbzsK
LSAgICAgICAgR2V0T2JqZWN0KGJpdG1hcCwgc2l6ZW9mKGluZm8pLCAmaW5mbyk7Ci0gICAgICAg
IEFTU0VSVChpbmZvLmJtQml0c1BpeGVsID09IDMyKTsKLQotICAgICAgICBDR0NvbG9yU3BhY2VS
ZWYgZGV2aWNlUkdCID0gQ0dDb2xvclNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7Ci0gICAgICAgIENH
Q29udGV4dFJlZiBiaXRtYXBDb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGluZm8uYm1C
aXRzLCBpbmZvLmJtV2lkdGgsIGluZm8uYm1IZWlnaHQsIDgsCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uYm1XaWR0aEJ5dGVz
LCBkZXZpY2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwgCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdXBwb3J0QWxw
aGFCbGVuZCA/IGtDR0ltYWdlQWxwaGFQcmVtdWx0aXBsaWVkRmlyc3QgOiBrQ0dJbWFnZUFscGhh
Tm9uZVNraXBGaXJzdCkpOwotICAgICAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKGRldmljZVJHQik7
Ci0KLSAgICAgICAgQ0dJbWFnZVJlZiBpbWFnZSA9IENHQml0bWFwQ29udGV4dENyZWF0ZUltYWdl
KGJpdG1hcENvbnRleHQpOwotICAgICAgICBDR0NvbnRleHREcmF3SW1hZ2UobV9kYXRhLT5tX2Nn
Q29udGV4dCwgZHN0UmVjdCwgaW1hZ2UpOwotICAgICAgICAKLSAgICAgICAgLy8gRGVsZXRlIGFs
bCBvdXIganVuay4KLSAgICAgICAgQ0dJbWFnZVJlbGVhc2UoaW1hZ2UpOwotICAgICAgICBDR0Nv
bnRleHRSZWxlYXNlKGJpdG1hcENvbnRleHQpOwotICAgICAgICA6OkRlbGV0ZURDKGhkYyk7Ci0g
ICAgICAgIDo6RGVsZXRlT2JqZWN0KGJpdG1hcCk7Ci0KLSAgICAgICAgcmV0dXJuOwotICAgIH0K
LQotICAgIG1fZGF0YS0+cmVzdG9yZSgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRm
b3JtUHJpdmF0ZTo6c2F2ZSgpCi17Ci0gICAgaWYgKCFtX2hkYykKLSAgICAgICAgcmV0dXJuOwot
ICAgIFNhdmVEQyhtX2hkYyk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2
YXRlOjpyZXN0b3JlKCkKLXsKLSAgICBpZiAoIW1faGRjKQotICAgICAgICByZXR1cm47Ci0gICAg
UmVzdG9yZURDKG1faGRjLCAtMSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlOjpjbGlwKGNvbnN0IEludFJlY3QmIGNsaXBSZWN0KQotewotICAgIGlmICghbV9oZGMp
Ci0gICAgICAgIHJldHVybjsKLSAgICBJbnRlcnNlY3RDbGlwUmVjdChtX2hkYywgY2xpcFJlY3Qu
eCgpLCBjbGlwUmVjdC55KCksIGNsaXBSZWN0LnJpZ2h0KCksIGNsaXBSZWN0LmJvdHRvbSgpKTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNsaXAoY29uc3QgUGF0
aCYpCi17Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHRQ
bGF0Zm9ybVByaXZhdGU6OnNjYWxlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKLXsKLSAgICBpZiAo
IW1faGRjKQotICAgICAgICByZXR1cm47Ci0gICAgWEZPUk0geGZvcm07Ci0gICAgeGZvcm0uZU0x
MSA9IHNpemUud2lkdGgoKTsKLSAgICB4Zm9ybS5lTTEyID0gMDsKLSAgICB4Zm9ybS5lTTIxID0g
MDsKLSAgICB4Zm9ybS5lTTIyID0gc2l6ZS5oZWlnaHQoKTsKLSAgICB4Zm9ybS5lRHggPSAwOwot
ICAgIHhmb3JtLmVEeSA9IDA7Ci0gICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9y
bSwgTVdUX0xFRlRNVUxUSVBMWSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBkb3VibGUgZGVnMnJhZCA9
IDAuMDE3NDUzMjkyNTE5OTQzMjk1NzY5OyAvLyBwaS8xODAKLQotdm9pZCBHcmFwaGljc0NvbnRl
eHRQbGF0Zm9ybVByaXZhdGU6OnJvdGF0ZShmbG9hdCBkZWdyZWVzQW5nbGUpCi17Ci0gICAgZmxv
YXQgcmFkaWFuc0FuZ2xlID0gZGVncmVlc0FuZ2xlICogZGVnMnJhZDsKLSAgICBmbG9hdCBjb3NB
bmdsZSA9IGNvc2YocmFkaWFuc0FuZ2xlKTsKLSAgICBmbG9hdCBzaW5BbmdsZSA9IHNpbmYocmFk
aWFuc0FuZ2xlKTsKLSAgICBYRk9STSB4Zm9ybTsKLSAgICB4Zm9ybS5lTTExID0gY29zQW5nbGU7
Ci0gICAgeGZvcm0uZU0xMiA9IC1zaW5BbmdsZTsKLSAgICB4Zm9ybS5lTTIxID0gc2luQW5nbGU7
Ci0gICAgeGZvcm0uZU0yMiA9IGNvc0FuZ2xlOwotICAgIHhmb3JtLmVEeCA9IDA7Ci0gICAgeGZv
cm0uZUR5ID0gMDsKLSAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShtX2hkYywgJnhmb3JtLCBNV1Rf
TEVGVE1VTFRJUExZKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6
OnRyYW5zbGF0ZShmbG9hdCB4ICwgZmxvYXQgeSkKLXsKLSAgICBpZiAoIW1faGRjKQotICAgICAg
ICByZXR1cm47Ci0gICAgWEZPUk0geGZvcm07Ci0gICAgeGZvcm0uZU0xMSA9IDEuMDsKLSAgICB4
Zm9ybS5lTTEyID0gMDsKLSAgICB4Zm9ybS5lTTIxID0gMDsKLSAgICB4Zm9ybS5lTTIyID0gMS4w
OwotICAgIHhmb3JtLmVEeCA9IHg7Ci0gICAgeGZvcm0uZUR5ID0geTsKLSAgICBNb2RpZnlXb3Js
ZFRyYW5zZm9ybShtX2hkYywgJnhmb3JtLCBNV1RfTEVGVE1VTFRJUExZKTsKLX0KLQotdm9pZCBH
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNvbmNhdENUTShjb25zdCBBZmZpbmVUcmFu
c2Zvcm0mIHRyYW5zZm9ybSkKLXsKLSAgICBpZiAoIW1faGRjKQotICAgICAgICByZXR1cm47Ci0g
ICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbWF0ID0gdHJhbnNmb3JtOwotICAgIFhGT1JNIHhmb3JtOwot
ICAgIHhmb3JtLmVNMTEgPSBtYXQuYTsKLSAgICB4Zm9ybS5lTTEyID0gbWF0LmI7Ci0gICAgeGZv
cm0uZU0yMSA9IG1hdC5jOwotICAgIHhmb3JtLmVNMjIgPSBtYXQuZDsKLSAgICB4Zm9ybS5lRHgg
PSBtYXQudHg7Ci0gICAgeGZvcm0uZUR5ID0gbWF0LnR5OwotICAgIE1vZGlmeVdvcmxkVHJhbnNm
b3JtKG1faGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDo6ZHJhd0ZvY3VzUmluZyhjb25zdCBDb2xvciYgY29sb3IpCi17Ci0gICAgaWYgKHBh
aW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZmxvYXQgcmFkaXVzID0g
KGZvY3VzUmluZ1dpZHRoKCkgLSAxKSAvIDIuMGY7Ci0gICAgaW50IG9mZnNldCA9IHJhZGl1cyAr
IGZvY3VzUmluZ09mZnNldCgpOwotICAgIENHQ29sb3JSZWYgY29sb3JSZWYgPSBjb2xvci5pc1Zh
bGlkKCkgPyBjZ0NvbG9yKGNvbG9yKSA6IDA7Ci0KLSAgICBDR011dGFibGVQYXRoUmVmIGZvY3Vz
UmluZ1BhdGggPSBDR1BhdGhDcmVhdGVNdXRhYmxlKCk7Ci0gICAgY29uc3QgVmVjdG9yPEludFJl
Y3Q+JiByZWN0cyA9IGZvY3VzUmluZ1JlY3RzKCk7Ci0gICAgdW5zaWduZWQgcmVjdENvdW50ID0g
cmVjdHMuc2l6ZSgpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCByZWN0Q291bnQ7IGkr
KykKLSAgICAgICAgQ0dQYXRoQWRkUmVjdChmb2N1c1JpbmdQYXRoLCAwLCBDR1JlY3RJbnNldChy
ZWN0c1tpXSwgLW9mZnNldCwgLW9mZnNldCkpOwotCi0gICAgQ0dDb250ZXh0UmVmIGNvbnRleHQg
PSBwbGF0Zm9ybUNvbnRleHQoKTsKLSAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQpOwot
Ci0gICAgQ0dDb250ZXh0QmVnaW5QYXRoKGNvbnRleHQpOwotICAgIENHQ29udGV4dEFkZFBhdGgo
Y29udGV4dCwgZm9jdXNSaW5nUGF0aCk7Ci0KLSAgICB3a0RyYXdGb2N1c1JpbmcoY29udGV4dCwg
Y29sb3JSZWYsIHJhZGl1cyk7Ci0KLSAgICBDR0NvbG9yUmVsZWFzZShjb2xvclJlZik7Ci0KLSAg
ICBDR1BhdGhSZWxlYXNlKGZvY3VzUmluZ1BhdGgpOwotCi0gICAgQ0dDb250ZXh0UmVzdG9yZUdT
dGF0ZShjb250ZXh0KTsKLX0KLQotc3RhdGljIGNvbnN0IENvbG9yJiBzcGVsbGluZ1BhdHRlcm5D
b2xvcigpIHsKLSAgICBzdGF0aWMgY29uc3QgQ29sb3Igc3BlbGxpbmdDb2xvcigyNTUsIDAsIDAp
OwotICAgIHJldHVybiBzcGVsbGluZ0NvbG9yOwotfQotCi1zdGF0aWMgY29uc3QgQ29sb3ImIGdy
YW1tYXJQYXR0ZXJuQ29sb3IoKSB7Ci0gICAgc3RhdGljIGNvbnN0IENvbG9yIGdyYW1tYXJDb2xv
cigwLCAxMjgsIDApOwotICAgIHJldHVybiBncmFtbWFyQ29sb3I7Ci19Ci0KLS8vIFB1bGxlZCBm
cm9tIEdyYXBoaWNzQ29udGV4dENHCi1zdGF0aWMgdm9pZCBzZXRDR1N0cm9rZUNvbG9yKENHQ29u
dGV4dFJlZiBjb250ZXh0LCBjb25zdCBDb2xvciYgY29sb3IpCi17Ci0gICAgQ0dGbG9hdCByZWQs
IGdyZWVuLCBibHVlLCBhbHBoYTsKLSAgICBjb2xvci5nZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUs
IGFscGhhKTsKLSAgICBDR0NvbnRleHRTZXRSR0JTdHJva2VDb2xvcihjb250ZXh0LCByZWQsIGdy
ZWVuLCBibHVlLCBhbHBoYSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZv
ck1pc3NwZWxsaW5nT3JCYWRHcmFtbWFyKGNvbnN0IEludFBvaW50JiBwb2ludCwgaW50IHdpZHRo
LCBib29sIGdyYW1tYXIpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAg
cmV0dXJuOwotICAgIAotICAgIC8vIFRoZXNlIGFyZSB0aGUgc2FtZSBmb3IgbWlzc3BlbGxpbmcg
b3IgYmFkIGdyYW1tYXIKLSAgICBjb25zdCBpbnQgcGF0dGVybkhlaWdodCA9IDM7IC8vIDMgcm93
cwotICAgIEFTU0VSVChjTWlzc3BlbGxpbmdMaW5lVGhpY2tuZXNzID09IHBhdHRlcm5IZWlnaHQp
OwotICAgIGNvbnN0IGludCBwYXR0ZXJuV2lkdGggPSA0OyAvLyA0IHBpeGVscwotICAgIEFTU0VS
VChwYXR0ZXJuV2lkdGggPT0gY01pc3NwZWxsaW5nTGluZVBhdHRlcm5XaWR0aCk7Ci0KLSAgICAv
LyBNYWtlIHN1cmUgdG8gZHJhdyBvbmx5IGNvbXBsZXRlIGRvdHMuCi0gICAgLy8gTk9URTogQ29k
ZSBoZXJlIHVzZWQgdG8gc2hpZnQgdGhlIHVuZGVybGluZSB0byB0aGUgbGVmdCBhbmQgaW5jcmVh
c2UgdGhlIHdpZHRoCi0gICAgLy8gdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgZ2V0cyB1bmRlcmxp
bmVkLCBidXQgdGhhdCByZXN1bHRzIGluIGRyYXdpbmcgb3V0IG9mCi0gICAgLy8gYm91bmRzIChl
LmcuIHdoZW4gYXQgdGhlIGVkZ2Ugb2YgYSB2aWV3KSBhbmQgY291bGQgbWFrZSBpdCBhcHBlYXIg
dGhhdCB0aGUKLSAgICAvLyBzcGFjZSBiZXR3ZWVuIGFkamFjZW50IG1pc3NwZWxsZWQgd29yZHMg
d2FzIHVuZGVybGluZWQuCi0gICAgLy8gYWxsb3cgc2xpZ2h0bHkgbW9yZSBjb25zaWRlcmluZyB0
aGF0IHRoZSBwYXR0ZXJuIGVuZHMgd2l0aCBhIHRyYW5zcGFyZW50IHBpeGVsCi0gICAgaW50IHdp
ZHRoTW9kID0gd2lkdGggJSBwYXR0ZXJuV2lkdGg7Ci0gICAgaWYgKHBhdHRlcm5XaWR0aCAtIHdp
ZHRoTW9kID4gY01pc3NwZWxsaW5nTGluZVBhdHRlcm5HYXBXaWR0aCkKLSAgICAgICAgd2lkdGgg
LT0gd2lkdGhNb2Q7Ci0gICAgICAKLSAgICAvLyBEcmF3IHRoZSB1bmRlcmxpbmUKLSAgICBDR0Nv
bnRleHRSZWYgY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOwotICAgIENHQ29udGV4dFNhdmVH
U3RhdGUoY29udGV4dCk7Ci0KLSAgICBjb25zdCBDb2xvciYgcGF0dGVybkNvbG9yID0gZ3JhbW1h
ciA/IGdyYW1tYXJQYXR0ZXJuQ29sb3IoKSA6IHNwZWxsaW5nUGF0dGVybkNvbG9yKCk7Ci0gICAg
c2V0Q0dTdHJva2VDb2xvcihjb250ZXh0LCBwYXR0ZXJuQ29sb3IpOwotCi0gICAgd2tTZXRQYXR0
ZXJuUGhhc2VJblVzZXJTcGFjZShjb250ZXh0LCBwb2ludCk7Ci0gICAgQ0dDb250ZXh0U2V0Qmxl
bmRNb2RlKGNvbnRleHQsIGtDR0JsZW5kTW9kZU5vcm1hbCk7Ci0gICAgCi0gICAgLy8gMyByb3dz
LCBlYWNoIG9mZnNldCBieSBoYWxmIGEgcGl4ZWwgZm9yIGJsZW5kaW5nIHB1cnBvc2VzCi0gICAg
Y29uc3QgQ0dQb2ludCB1cHBlclBvaW50cyBbXSA9IHt7cG9pbnQueCgpLCBwb2ludC55KCkgKyBw
YXR0ZXJuSGVpZ2h0IC0gMi41IH0sIHtwb2ludC54KCkgKyB3aWR0aCwgcG9pbnQueSgpICsgcGF0
dGVybkhlaWdodCAtIDIuNX19OwotICAgIGNvbnN0IENHUG9pbnQgbWlkZGxlUG9pbnRzIFtdID0g
e3twb2ludC54KCksIHBvaW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAxLjUgfSwge3BvaW50Lngo
KSArIHdpZHRoLCBwb2ludC55KCkgKyBwYXR0ZXJuSGVpZ2h0IC0gMS41fX07Ci0gICAgY29uc3Qg
Q0dQb2ludCBsb3dlclBvaW50cyBbXSA9IHt7cG9pbnQueCgpLCBwb2ludC55KCkgKyBwYXR0ZXJu
SGVpZ2h0IC0gMC41IH0sIHtwb2ludC54KCkgKyB3aWR0aCwgcG9pbnQueSgpICsgcGF0dGVybkhl
aWdodCAtIDAuNSB9fTsKLSAgICAKLSAgICAvLyBEYXNoIGxlbmd0aHMgZm9yIHRoZSB0b3AgYW5k
IGJvdHRvbSBvZiB0aGUgZXJyb3IgdW5kZXJsaW5lIGFyZSB0aGUgc2FtZS4KLSAgICAvLyBUaGVz
ZSBhcmUgbWFnaWMuCi0gICAgc3RhdGljIGNvbnN0IGZsb2F0IGVkZ2VfZGFzaF9sZW5ndGhzW10g
PSB7MiwgMn07Ci0gICAgc3RhdGljIGNvbnN0IGZsb2F0IG1pZGRsZV9kYXNoX2xlbmd0aHNbXSA9
IHsyLjc2ZiwgMS4yNGZ9OwotICAgIHN0YXRpYyBjb25zdCBmbG9hdCBlZGdlX29mZnNldCA9IC0o
ZWRnZV9kYXNoX2xlbmd0aHNbMV0gLSAxLjBmKSAvIDIuMGY7Ci0gICAgc3RhdGljIGNvbnN0IGZs
b2F0IG1pZGRsZV9vZmZzZXQgPSAtKG1pZGRsZV9kYXNoX2xlbmd0aHNbMV0gLSAxLjBmKSAvIDIu
MGY7Ci0KLSAgICAvLyBMaW5lIG9wYWNpdGllcy4gIE9uY2UgYWdhaW4sIHRoZXNlIGFyZSBtYWdp
Yy4KLSAgICBjb25zdCBmbG9hdCB1cHBlck9wYWNpdHkgPSAwLjMzZjsKLSAgICBjb25zdCBmbG9h
dCBtaWRkbGVPcGFjaXR5ID0gMC43NWY7Ci0gICAgY29uc3QgZmxvYXQgbG93ZXJPcGFjaXR5ID0g
MC44OGY7Ci0KLSAgICAvL1RvcCBsaW5lCi0gICAgQ0dDb250ZXh0U2V0TGluZURhc2goY29udGV4
dCwgZWRnZV9vZmZzZXQsIGVkZ2VfZGFzaF9sZW5ndGhzLCAKLSAgICAgICAgICAgICAgICAgICAg
ICAgICBzaXplb2YoZWRnZV9kYXNoX2xlbmd0aHMpIC8gc2l6ZW9mKGVkZ2VfZGFzaF9sZW5ndGhz
WzBdKSk7Ci0gICAgQ0dDb250ZXh0U2V0QWxwaGEoY29udGV4dCwgdXBwZXJPcGFjaXR5KTsKLSAg
ICBDR0NvbnRleHRTdHJva2VMaW5lU2VnbWVudHMoY29udGV4dCwgdXBwZXJQb2ludHMsIDIpOwot
IAotICAgIC8vIE1pZGRsZSBsaW5lCi0gICAgQ0dDb250ZXh0U2V0TGluZURhc2goY29udGV4dCwg
bWlkZGxlX29mZnNldCwgbWlkZGxlX2Rhc2hfbGVuZ3RocywgCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgc2l6ZW9mKG1pZGRsZV9kYXNoX2xlbmd0aHMpIC8gc2l6ZW9mKG1pZGRsZV9kYXNoX2xl
bmd0aHNbMF0pKTsKLSAgICBDR0NvbnRleHRTZXRBbHBoYShjb250ZXh0LCBtaWRkbGVPcGFjaXR5
KTsKLSAgICBDR0NvbnRleHRTdHJva2VMaW5lU2VnbWVudHMoY29udGV4dCwgbWlkZGxlUG9pbnRz
LCAyKTsKLSAgICAKLSAgICAvLyBCb3R0b20gbGluZQotICAgIENHQ29udGV4dFNldExpbmVEYXNo
KGNvbnRleHQsIGVkZ2Vfb2Zmc2V0LCBlZGdlX2Rhc2hfbGVuZ3RocywKLSAgICAgICAgICAgICAg
ICAgICAgICAgICBzaXplb2YoZWRnZV9kYXNoX2xlbmd0aHMpIC8gc2l6ZW9mKGVkZ2VfZGFzaF9s
ZW5ndGhzWzBdKSk7Ci0gICAgQ0dDb250ZXh0U2V0QWxwaGEoY29udGV4dCwgbG93ZXJPcGFjaXR5
KTsKLSAgICBDR0NvbnRleHRTdHJva2VMaW5lU2VnbWVudHMoY29udGV4dCwgbG93ZXJQb2ludHMs
IDIpOwotCi0gICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShjb250ZXh0KTsKLX0KLQogI2lmIEVO
QUJMRShTVkcpCiBHcmFwaGljc0NvbnRleHQqIGNvbnRleHRGb3JJbWFnZShTVkdSZXNvdXJjZUlt
YWdlKikKIHsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ0dXaW4u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ0dX
aW4uY3BwCShyZXZpc2lvbiAyOTgzNCkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW4vSW1hZ2VXaW4uY3BwOjI5ODM0KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4v
SW1hZ2VDR1dpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBV
VEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVU
RVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRl
ICJCaXRtYXBJbWFnZS5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUg
PEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgorCisjaW5jbHVkZSA8
d2luc29jazIuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSAiUGxhdGZvcm1TdHJp
bmcuaCIKKyNpbmNsdWRlICJNSU1FVHlwZVJlZ2lzdHJ5LmgiCisjaW5jbHVkZSAiU2hhcmVkQnVm
ZmVyLmgiCisKKy8vIFRoaXMgZnVuY3Rpb24gbG9hZHMgcmVzb3VyY2VzIGZyb20gV2ViS2l0CitQ
YXNzUmVmUHRyPFdlYkNvcmU6OlNoYXJlZEJ1ZmZlcj4gbG9hZFJlc291cmNlSW50b0J1ZmZlcihj
b25zdCBjaGFyKik7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9pZCBCaXRtYXBJbWFnZTo6
aW5pdFBsYXRmb3JtRGF0YSgpCit7Cit9CisKK3ZvaWQgQml0bWFwSW1hZ2U6OmludmFsaWRhdGVQ
bGF0Zm9ybURhdGEoKQoreworfQorCitJbWFnZSogSW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNl
KGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gYnVmZmVyID0g
bG9hZFJlc291cmNlSW50b0J1ZmZlcihuYW1lKTsKKyAgICBCaXRtYXBJbWFnZSogaW1nID0gbmV3
IEJpdG1hcEltYWdlOworICAgIGltZy0+c2V0RGF0YShidWZmZXIucmVsZWFzZSgpLCB0cnVlKTsK
KyAgICByZXR1cm4gaW1nOworfQorCitib29sIEJpdG1hcEltYWdlOjpnZXRIQklUTUFQKEhCSVRN
QVAgYm1wKQoreworICAgIHJldHVybiBnZXRIQklUTUFQT2ZTaXplKGJtcCwgMCk7Cit9CisKK2Jv
b2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVBPZlNpemUoSEJJVE1BUCBibXAsIExQU0laRSBzaXpl
KQoreworICAgIEFTU0VSVChibXApOworCisgICAgQklUTUFQIGJtcEluZm87CisgICAgR2V0T2Jq
ZWN0KGJtcCwgc2l6ZW9mKEJJVE1BUCksICZibXBJbmZvKTsKKworICAgIEFTU0VSVChibXBJbmZv
LmJtQml0c1BpeGVsID09IDMyKTsKKyAgICBpbnQgYnVmZmVyU2l6ZSA9IGJtcEluZm8uYm1XaWR0
aEJ5dGVzICogYm1wSW5mby5ibUhlaWdodDsKKyAgICAKKyAgICBDR0NvbG9yU3BhY2VSZWYgZGV2
aWNlUkdCID0gQ0dDb2xvclNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7CisgICAgQ0dDb250ZXh0UmVm
IGNnQ29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZShibXBJbmZvLmJtQml0cywgYm1wSW5m
by5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0LAorICAgICAgICA4LCBibXBJbmZvLmJtV2lkdGhC
eXRlcywgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxw
aGFQcmVtdWx0aXBsaWVkRmlyc3QpOworICAKKyAgICBHcmFwaGljc0NvbnRleHQgZ2MoY2dDb250
ZXh0KTsKKyAgICBJbnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcEltYWdlOjpzaXplKCk7CisgICAg
aWYgKHNpemUpCisgICAgICAgIGRyYXdGcmFtZU1hdGNoaW5nU291cmNlU2l6ZSgmZ2MsIEZsb2F0
UmVjdCgwLCAwLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQpLCBJbnRTaXplKCpz
aXplKSwgQ29tcG9zaXRlQ29weSk7CisgICAgZWxzZQorICAgICAgICBkcmF3KCZnYywgRmxvYXRS
ZWN0KDAsIDAsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCksIEZsb2F0UmVjdCgw
LCAwLCBpbWFnZVNpemUud2lkdGgoKSwgaW1hZ2VTaXplLmhlaWdodCgpKSwgQ29tcG9zaXRlQ29w
eSk7CisKKyAgICAvLyBEbyBjbGVhbnVwCisgICAgQ0dDb250ZXh0UmVsZWFzZShjZ0NvbnRleHQp
OworICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKKyAgICByZXR1cm4gdHJ1ZTsK
K30KKwordm9pZCBCaXRtYXBJbWFnZTo6ZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXplKEdyYXBo
aWNzQ29udGV4dCogY3R4dCwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBjb25zdCBJbnRTaXpl
JiBzcmNTaXplLCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCkKK3sKKyAgICBpbnQgZnJh
bWVzID0gZnJhbWVDb3VudCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVzOyArK2kp
IHsKKyAgICAgICAgQ0dJbWFnZVJlZiBpbWFnZSA9IGZyYW1lQXRJbmRleChpKTsKKyAgICAgICAg
aWYgKENHSW1hZ2VHZXRIZWlnaHQoaW1hZ2UpID09IChzaXplX3Qpc3JjU2l6ZS5oZWlnaHQoKSAm
JiBDR0ltYWdlR2V0V2lkdGgoaW1hZ2UpID09IChzaXplX3Qpc3JjU2l6ZS53aWR0aCgpKSB7Cisg
ICAgICAgICAgICBzaXplX3QgY3VycmVudEZyYW1lID0gbV9jdXJyZW50RnJhbWU7CisgICAgICAg
ICAgICBtX2N1cnJlbnRGcmFtZSA9IGk7CisgICAgICAgICAgICBkcmF3KGN0eHQsIGRzdFJlY3Qs
IEZsb2F0UmVjdCgwLCAwLCBzcmNTaXplLndpZHRoKCksIHNyY1NpemUuaGVpZ2h0KCkpLCBjb21w
b3NpdGVPcCk7CisgICAgICAgICAgICBtX2N1cnJlbnRGcmFtZSA9IGN1cnJlbnRGcmFtZTsKKyAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE5vIGltYWdlIG9m
IHRoZSBjb3JyZWN0IHNpemUgd2FzIGZvdW5kLCBmYWxsYmFjayB0byBkcmF3aW5nIHRoZSBjdXJy
ZW50IGZyYW1lCisgICAgSW50U2l6ZSBpbWFnZVNpemUgPSBCaXRtYXBJbWFnZTo6c2l6ZSgpOwor
ICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRSZWN0KDAsIDAsIGltYWdlU2l6ZS53aWR0aCgp
LCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBjb21wb3NpdGVPcCk7Cit9CisKK30gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ0dXaW4u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdlQ0dX
aW4uY3BwCShyZXZpc2lvbiAyOTcyNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0ltYWdlQ0dXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENv
cHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI5LDM4ICsyOSwx
MSBAQAogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2luY2x1ZGUgPEFwcGxpY2F0aW9u
U2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgogCi0jaW5jbHVkZSA8d2luc29jazIuaD4K
ICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKLSNpbmNs
dWRlICJNSU1FVHlwZVJlZ2lzdHJ5LmgiCi0jaW5jbHVkZSAiU2hhcmVkQnVmZmVyLmgiCi0KLS8v
IFRoaXMgZnVuY3Rpb24gbG9hZHMgcmVzb3VyY2VzIGZyb20gV2ViS2l0Ci1QYXNzUmVmUHRyPFdl
YkNvcmU6OlNoYXJlZEJ1ZmZlcj4gbG9hZFJlc291cmNlSW50b0J1ZmZlcihjb25zdCBjaGFyKik7
CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotdm9pZCBCaXRtYXBJbWFnZTo6aW5pdFBsYXRmb3Jt
RGF0YSgpCi17Ci19Ci0KLXZvaWQgQml0bWFwSW1hZ2U6OmludmFsaWRhdGVQbGF0Zm9ybURhdGEo
KQotewotfQotCi1JbWFnZSogSW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNlKGNvbnN0IGNoYXIg
Km5hbWUpCi17Ci0gICAgUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gYnVmZmVyID0gbG9hZFJlc291cmNl
SW50b0J1ZmZlcihuYW1lKTsKLSAgICBCaXRtYXBJbWFnZSogaW1nID0gbmV3IEJpdG1hcEltYWdl
OwotICAgIGltZy0+c2V0RGF0YShidWZmZXIucmVsZWFzZSgpLCB0cnVlKTsKLSAgICByZXR1cm4g
aW1nOwotfQotCi1ib29sIEJpdG1hcEltYWdlOjpnZXRIQklUTUFQKEhCSVRNQVAgYm1wKQotewot
ICAgIHJldHVybiBnZXRIQklUTUFQT2ZTaXplKGJtcCwgMCk7Ci19Ci0KIGJvb2wgQml0bWFwSW1h
Z2U6OmdldEhCSVRNQVBPZlNpemUoSEJJVE1BUCBibXAsIExQU0laRSBzaXplKQogewogICAgIEFT
U0VSVChibXApOwpAQCAtNzYsMTUgKzQ5LDE3IEBAIGJvb2wgQml0bWFwSW1hZ2U6OmdldEhCSVRN
QVBPZlNpemUoSEJJVE0KICAgICAgICAgOCwgYm1wSW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJH
Qiwga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhhUHJlbXVsdGlwbGll
ZEZpcnN0KTsKICAgCiAgICAgR3JhcGhpY3NDb250ZXh0IGdjKGNnQ29udGV4dCk7CisKICAgICBJ
bnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcEltYWdlOjpzaXplKCk7CiAgICAgaWYgKHNpemUpCi0g
ICAgICAgIGRyYXdGcmFtZU1hdGNoaW5nU291cmNlU2l6ZSgmZ2MsIEZsb2F0UmVjdCgwLCAwLCBi
bXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQpLCBJbnRTaXplKCpzaXplKSwgQ29tcG9z
aXRlQ29weSk7CisgICAgICAgIGRyYXdGcmFtZU1hdGNoaW5nU291cmNlU2l6ZSgmZ2MsIEZsb2F0
UmVjdCgwLjBmLCAwLjBmLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQpLCBJbnRT
aXplKCpzaXplKSwgQ29tcG9zaXRlQ29weSk7CiAgICAgZWxzZQotICAgICAgICBkcmF3KCZnYywg
RmxvYXRSZWN0KDAsIDAsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCksIEZsb2F0
UmVjdCgwLCAwLCBpbWFnZVNpemUud2lkdGgoKSwgaW1hZ2VTaXplLmhlaWdodCgpKSwgQ29tcG9z
aXRlQ29weSk7CisgICAgICAgIGRyYXcoJmdjLCBGbG9hdFJlY3QoMC4wZiwgMC4wZiwgYm1wSW5m
by5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwgRmxvYXRSZWN0KDAuMGYsIDAuMGYsIGltYWdl
U2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBDb21wb3NpdGVDb3B5KTsKIAogICAg
IC8vIERvIGNsZWFudXAKICAgICBDR0NvbnRleHRSZWxlYXNlKGNnQ29udGV4dCk7CiAgICAgQ0dD
b2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOworCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKQEAg
LTkzLDEwICs2OCwxMCBAQCB2b2lkIEJpdG1hcEltYWdlOjpkcmF3RnJhbWVNYXRjaGluZ1NvdXJj
CiAgICAgaW50IGZyYW1lcyA9IGZyYW1lQ291bnQoKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8
IGZyYW1lczsgKytpKSB7CiAgICAgICAgIENHSW1hZ2VSZWYgaW1hZ2UgPSBmcmFtZUF0SW5kZXgo
aSk7Ci0gICAgICAgIGlmIChDR0ltYWdlR2V0SGVpZ2h0KGltYWdlKSA9PSAoc2l6ZV90KXNyY1Np
emUuaGVpZ2h0KCkgJiYgQ0dJbWFnZUdldFdpZHRoKGltYWdlKSA9PSAoc2l6ZV90KXNyY1NpemUu
d2lkdGgoKSkgeworICAgICAgICBpZiAoQ0dJbWFnZUdldEhlaWdodChpbWFnZSkgPT0gc3RhdGlj
X2Nhc3Q8c2l6ZV90PihzcmNTaXplLmhlaWdodCgpKSAmJiBDR0ltYWdlR2V0V2lkdGgoaW1hZ2Up
ID09IHN0YXRpY19jYXN0PHNpemVfdD4oc3JjU2l6ZS53aWR0aCgpKSkgewogICAgICAgICAgICAg
c2l6ZV90IGN1cnJlbnRGcmFtZSA9IG1fY3VycmVudEZyYW1lOwogICAgICAgICAgICAgbV9jdXJy
ZW50RnJhbWUgPSBpOwotICAgICAgICAgICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJlY3Qo
MCwgMCwgc3JjU2l6ZS53aWR0aCgpLCBzcmNTaXplLmhlaWdodCgpKSwgY29tcG9zaXRlT3ApOwor
ICAgICAgICAgICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJlY3QoMC4wZiwgMC4wZiwgc3Jj
U2l6ZS53aWR0aCgpLCBzcmNTaXplLmhlaWdodCgpKSwgY29tcG9zaXRlT3ApOwogICAgICAgICAg
ICAgbV9jdXJyZW50RnJhbWUgPSBjdXJyZW50RnJhbWU7CiAgICAgICAgICAgICByZXR1cm47CiAg
ICAgICAgIH0KQEAgLTEwNCw3ICs3OSw3IEBAIHZvaWQgQml0bWFwSW1hZ2U6OmRyYXdGcmFtZU1h
dGNoaW5nU291cmMKIAogICAgIC8vIE5vIGltYWdlIG9mIHRoZSBjb3JyZWN0IHNpemUgd2FzIGZv
dW5kLCBmYWxsYmFjayB0byBkcmF3aW5nIHRoZSBjdXJyZW50IGZyYW1lCiAgICAgSW50U2l6ZSBp
bWFnZVNpemUgPSBCaXRtYXBJbWFnZTo6c2l6ZSgpOwotICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwg
RmxvYXRSZWN0KDAsIDAsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBj
b21wb3NpdGVPcCk7CisgICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJlY3QoMC4wZiwgMC4w
ZiwgaW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsK
IH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW4vSW1hZ2VDYWlyb1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vSW1hZ2VDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZUNhaXJvV2luLmNwcAkocmV2aXNpb24gMCkKQEAg
LTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBcHBsZSBJbmMuICBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJ
bWFnZS5oIgorI2luY2x1ZGUgIkJpdG1hcEltYWdlLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250
ZXh0LmgiCisjaW5jbHVkZSA8Y2Fpcm8uaD4KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNs
dWRlICJQbGF0Zm9ybVN0cmluZy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2Jvb2wgQml0
bWFwSW1hZ2U6OmdldEhCSVRNQVBPZlNpemUoSEJJVE1BUCBibXAsIExQU0laRSBzaXplKQorewor
ICAgIEFTU0VSVChibXApOworCisgICAgQklUTUFQIGJtcEluZm87CisgICAgR2V0T2JqZWN0KGJt
cCwgc2l6ZW9mKEJJVE1BUCksICZibXBJbmZvKTsKKworICAgIC8vIElmIHRoaXMgaXMgYSAzMmJw
cCBiaXRtYXAsIHdoaWNoIGl0IGFsd2F5cyBzaG91bGQgYmUsIHdlJ2xsIGNsZWFyIGl0IHNvIGFs
cGhhLXdpc2UgaXQgd2lsbCBiZSB2aXNpYmxlCisgICAgaWYgKGJtcEluZm8uYm1CaXRzUGl4ZWwg
PT0gMzIpIHsKKyAgICAgICAgaW50IGJ1ZmZlclNpemUgPSBibXBJbmZvLmJtV2lkdGhCeXRlcyAq
IGJtcEluZm8uYm1IZWlnaHQ7CisgICAgICAgIG1lbXNldChibXBJbmZvLmJtQml0cywgMjU1LCBi
dWZmZXJTaXplKTsKKyAgICB9CisgCQorICAgIEhEQyB0ZW1wREMgPSBDcmVhdGVDb21wYXRpYmxl
REMoMCk7CisgICAgaWYgKCF0ZW1wREMpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8g
Y3JlYXRlIGluLW1lbW9yeSBEQyBmb3IgSW1hZ2U6OmJsaXQoKSIpOworICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgfQorICAgIFNlbGVjdE9iamVjdCh0ZW1wREMsIGJtcCk7CisgICAgR3JhcGhp
Y3NDb250ZXh0IGdjKHRlbXBEQyk7CisKKyAgICBJbnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcElt
YWdlOjpzaXplKCk7CisgICAgaWYgKHNpemUpCisgICAgICAgIGRyYXdGcmFtZU1hdGNoaW5nU291
cmNlU2l6ZSgmZ2MsIEZsb2F0UmVjdCgwLjBmLCAwLjBmLCBibXBJbmZvLmJtV2lkdGgsIGJtcElu
Zm8uYm1IZWlnaHQpLCBJbnRTaXplKCpzaXplKSwgQ29tcG9zaXRlQ29weSk7CisgICAgZWxzZQor
ICAgICAgICBkcmF3KCZnYywgRmxvYXRSZWN0KDAuMGYsIDAuMGYsIGJtcEluZm8uYm1XaWR0aCwg
Ym1wSW5mby5ibUhlaWdodCksIEZsb2F0UmVjdCgwLjBmLCAwLjBmLCBpbWFnZVNpemUud2lkdGgo
KSwgaW1hZ2VTaXplLmhlaWdodCgpKSwgQ29tcG9zaXRlQ29weSk7CisKKyAgICAvLyBEbyBjbGVh
bnVwCisgICAgRGVsZXRlREModGVtcERDKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lk
IEJpdG1hcEltYWdlOjpkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUoR3JhcGhpY3NDb250ZXh0
KiBjdHh0LCBjb25zdCBGbG9hdFJlY3QmIGRzdFJlY3QsIGNvbnN0IEludFNpemUmIHNyY1NpemUs
IENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQoreworICAgIGludCBmcmFtZXMgPSBmcmFt
ZUNvdW50KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZXM7ICsraSkgeworICAgICAg
ICBjYWlyb19zdXJmYWNlX3QqIGltYWdlID0gZnJhbWVBdEluZGV4KGkpOworICAgICAgICBpZiAo
Y2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfaGVpZ2h0KGltYWdlKSA9PSBzdGF0aWNfY2FzdDxzaXpl
X3Q+KHNyY1NpemUuaGVpZ2h0KCkpICYmIGNhaXJvX2ltYWdlX3N1cmZhY2VfZ2V0X3dpZHRoKGlt
YWdlKSA9PSBzdGF0aWNfY2FzdDxzaXplX3Q+KHNyY1NpemUud2lkdGgoKSkpIHsKKyAgICAgICAg
ICAgIHNpemVfdCBjdXJyZW50RnJhbWUgPSBtX2N1cnJlbnRGcmFtZTsKKyAgICAgICAgICAgIG1f
Y3VycmVudEZyYW1lID0gaTsKKyAgICAgICAgICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRS
ZWN0KDAuMGYsIDAuMGYsIHNyY1NpemUud2lkdGgoKSwgc3JjU2l6ZS5oZWlnaHQoKSksIGNvbXBv
c2l0ZU9wKTsKKyAgICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gY3VycmVudEZyYW1lOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTm8gaW1hZ2Ugb2Yg
dGhlIGNvcnJlY3Qgc2l6ZSB3YXMgZm91bmQsIGZhbGxiYWNrIHRvIGRyYXdpbmcgdGhlIGN1cnJl
bnQgZnJhbWUKKyAgICBJbnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcEltYWdlOjpzaXplKCk7Cisg
ICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJlY3QoMC4wZiwgMC4wZiwgaW1hZ2VTaXplLndp
ZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsKK30KKworfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VX
aW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ltYWdl
V2luLmNwcAkocmV2aXNpb24gMzAwNDgpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bi9JbWFnZVdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29w
eXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMjYsMTMgKzI2LDcg
QEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJJbWFnZS5oIgogI2luY2x1ZGUgIkJp
dG1hcEltYWdlLmgiCi0jaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCi0jaW5jbHVkZSA8QXBw
bGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CiAKLSNpbmNsdWRlIDx3aW5z
b2NrMi5oPgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5o
IgotI2luY2x1ZGUgIk1JTUVUeXBlUmVnaXN0cnkuaCIKICNpbmNsdWRlICJTaGFyZWRCdWZmZXIu
aCIKIAogLy8gVGhpcyBmdW5jdGlvbiBsb2FkcyByZXNvdXJjZXMgZnJvbSBXZWJLaXQKQEAgLTYx
LDUwICs1NSw0IEBAIGJvb2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVAoSEJJVE1BUCBibXAKICAg
ICByZXR1cm4gZ2V0SEJJVE1BUE9mU2l6ZShibXAsIDApOwogfQogCi1ib29sIEJpdG1hcEltYWdl
OjpnZXRIQklUTUFQT2ZTaXplKEhCSVRNQVAgYm1wLCBMUFNJWkUgc2l6ZSkKLXsKLSAgICBBU1NF
UlQoYm1wKTsKLQotICAgIEJJVE1BUCBibXBJbmZvOwotICAgIEdldE9iamVjdChibXAsIHNpemVv
ZihCSVRNQVApLCAmYm1wSW5mbyk7Ci0KLSAgICBBU1NFUlQoYm1wSW5mby5ibUJpdHNQaXhlbCA9
PSAzMik7Ci0gICAgaW50IGJ1ZmZlclNpemUgPSBibXBJbmZvLmJtV2lkdGhCeXRlcyAqIGJtcElu
Zm8uYm1IZWlnaHQ7Ci0gICAgCi0gICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29s
b3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwotICAgIENHQ29udGV4dFJlZiBjZ0NvbnRleHQgPSBD
R0JpdG1hcENvbnRleHRDcmVhdGUoYm1wSW5mby5ibUJpdHMsIGJtcEluZm8uYm1XaWR0aCwgYm1w
SW5mby5ibUhlaWdodCwKLSAgICAgICAgOCwgYm1wSW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJH
Qiwga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhhUHJlbXVsdGlwbGll
ZEZpcnN0KTsKLSAgCi0gICAgR3JhcGhpY3NDb250ZXh0IGdjKGNnQ29udGV4dCk7Ci0gICAgSW50
U2l6ZSBpbWFnZVNpemUgPSBCaXRtYXBJbWFnZTo6c2l6ZSgpOwotICAgIGlmIChzaXplKQotICAg
ICAgICBkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUoJmdjLCBGbG9hdFJlY3QoMCwgMCwgYm1w
SW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwgSW50U2l6ZSgqc2l6ZSksIENvbXBvc2l0
ZUNvcHkpOwotICAgIGVsc2UKLSAgICAgICAgZHJhdygmZ2MsIEZsb2F0UmVjdCgwLCAwLCBibXBJ
bmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQpLCBGbG9hdFJlY3QoMCwgMCwgaW1hZ2VTaXpl
LndpZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIENvbXBvc2l0ZUNvcHkpOwotCi0gICAgLy8g
RG8gY2xlYW51cAotICAgIENHQ29udGV4dFJlbGVhc2UoY2dDb250ZXh0KTsKLSAgICBDR0NvbG9y
U3BhY2VSZWxlYXNlKGRldmljZVJHQik7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQml0
bWFwSW1hZ2U6OmRyYXdGcmFtZU1hdGNoaW5nU291cmNlU2l6ZShHcmFwaGljc0NvbnRleHQqIGN0
eHQsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgY29uc3QgSW50U2l6ZSYgc3JjU2l6ZSwgQ29t
cG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApCi17Ci0gICAgaW50IGZyYW1lcyA9IGZyYW1lQ291
bnQoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lczsgKytpKSB7Ci0gICAgICAgIENH
SW1hZ2VSZWYgaW1hZ2UgPSBmcmFtZUF0SW5kZXgoaSk7Ci0gICAgICAgIGlmIChDR0ltYWdlR2V0
SGVpZ2h0KGltYWdlKSA9PSAoc2l6ZV90KXNyY1NpemUuaGVpZ2h0KCkgJiYgQ0dJbWFnZUdldFdp
ZHRoKGltYWdlKSA9PSAoc2l6ZV90KXNyY1NpemUud2lkdGgoKSkgewotICAgICAgICAgICAgc2l6
ZV90IGN1cnJlbnRGcmFtZSA9IG1fY3VycmVudEZyYW1lOwotICAgICAgICAgICAgbV9jdXJyZW50
RnJhbWUgPSBpOwotICAgICAgICAgICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJlY3QoMCwg
MCwgc3JjU2l6ZS53aWR0aCgpLCBzcmNTaXplLmhlaWdodCgpKSwgY29tcG9zaXRlT3ApOwotICAg
ICAgICAgICAgbV9jdXJyZW50RnJhbWUgPSBjdXJyZW50RnJhbWU7Ci0gICAgICAgICAgICByZXR1
cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBObyBpbWFnZSBvZiB0aGUgY29ycmVjdCBz
aXplIHdhcyBmb3VuZCwgZmFsbGJhY2sgdG8gZHJhd2luZyB0aGUgY3VycmVudCBmcmFtZQotICAg
IEludFNpemUgaW1hZ2VTaXplID0gQml0bWFwSW1hZ2U6OnNpemUoKTsKLSAgICBkcmF3KGN0eHQs
IGRzdFJlY3QsIEZsb2F0UmVjdCgwLCAwLCBpbWFnZVNpemUud2lkdGgoKSwgaW1hZ2VTaXplLmhl
aWdodCgpKSwgY29tcG9zaXRlT3ApOwotfQotCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4
OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNHV2luLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0
YUNHV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCShmcm9tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL1NpbXBsZUZvbnREYXRhV2luLmNwcDoyOTgzNCkKKysrIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ0dXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMjgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4g
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVy
IHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVz
IG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHBy
b21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNp
bXBsZUZvbnREYXRhLmgiCisKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI2luY2x1ZGUgIkZvbnQu
aCIKKyNpbmNsdWRlICJGb250Q2FjaGUuaCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNs
dWRlICJGb250RGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgorI2lu
Y2x1ZGUgPHVuaWNvZGUvdWNoYXIuaD4KKyNpbmNsdWRlIDx1bmljb2RlL3Vub3JtLmg+CisjaW5j
bHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CisjaW5jbHVk
ZSA8bWxhbmcuaD4KKyNpbmNsdWRlIDx0Y2hhci5oPgorI2luY2x1ZGUgPFdlYktpdFN5c3RlbUlu
dGVyZmFjZS9XZWJLaXRTeXN0ZW1JbnRlcmZhY2UuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgewor
Cit1c2luZyBzdGQ6Om1heDsKKworY29uc3QgZmxvYXQgY1NtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlw
bGllciA9IDAuN2Y7CisKK3N0YXRpYyBib29sIHNob3VsZEFwcGx5TWFjQXNjZW50SGFjazsKKwor
c3RhdGljIGlubGluZSBmbG9hdCBzY2FsZUVtVG9Vbml0cyhmbG9hdCB4LCB1bnNpZ25lZCB1bml0
c1BlckVtKSB7IHJldHVybiB1bml0c1BlckVtID8geCAvIChmbG9hdCl1bml0c1BlckVtIDogeDsg
fQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpzZXRTaG91bGRBcHBseU1hY0FzY2VudEhhY2soYm9v
bCBiKQoreworICAgIHNob3VsZEFwcGx5TWFjQXNjZW50SGFjayA9IGI7Cit9CisKK3ZvaWQgU2lt
cGxlRm9udERhdGE6OnBsYXRmb3JtSW5pdCgpCit7ICAgIAorICAgIG1fc3ludGhldGljQm9sZE9m
ZnNldCA9IG1fZm9udC5zeW50aGV0aWNCb2xkKCkgPyAxLjBmIDogMC5mOworICAgIG1fc2NyaXB0
Q2FjaGUgPSAwOworICAgIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMgPSAwOworICAgIG1faXNTeXN0
ZW1Gb250ID0gZmFsc2U7CisgICAgCisgICAgaWYgKG1fZm9udC51c2VHREkoKSkgeworICAgICAg
ICBIREMgaGRjID0gR2V0REMoMCk7CisgICAgICAgIEhHRElPQkogb2xkRm9udCA9IFNlbGVjdE9i
amVjdChoZGMsIG1fZm9udC5oZm9udCgpKTsKKyAgICAgICAgT1VUTElORVRFWFRNRVRSSUMgbWV0
cmljczsKKyAgICAgICAgR2V0T3V0bGluZVRleHRNZXRyaWNzKGhkYywgc2l6ZW9mKG1ldHJpY3Mp
LCAmbWV0cmljcyk7CisgICAgICAgIFRFWFRNRVRSSUMmIHRleHRNZXRyaWNzID0gbWV0cmljcy5v
dG1UZXh0TWV0cmljczsKKyAgICAgICAgbV9hc2NlbnQgPSB0ZXh0TWV0cmljcy50bUFzY2VudDsK
KyAgICAgICAgbV9kZXNjZW50ID0gdGV4dE1ldHJpY3MudG1EZXNjZW50OworICAgICAgICBtX2xp
bmVHYXAgPSB0ZXh0TWV0cmljcy50bUV4dGVybmFsTGVhZGluZzsKKyAgICAgICAgbV9saW5lU3Bh
Y2luZyA9IG1fYXNjZW50ICsgbV9kZXNjZW50ICsgbV9saW5lR2FwOworICAgICAgICBtX3hIZWln
aHQgPSBtX2FzY2VudCAqIDAuNTZmOyAvLyBCZXN0IGd1ZXNzIGZvciB4SGVpZ2h0IGlmIG5vIHgg
Z2x5cGggaXMgcHJlc2VudC4KKworICAgICAgICBHTFlQSE1FVFJJQ1MgZ207CisgICAgICAgIE1B
VDIgbWF0ID0geyAxLCAwLCAwLCAxIH07CisgICAgICAgIERXT1JEIGxlbiA9IEdldEdseXBoT3V0
bGluZShoZGMsICd4JywgR0dPX01FVFJJQ1MsICZnbSwgMCwgMCwgJm1hdCk7CisgICAgICAgIGlm
IChsZW4gIT0gR0RJX0VSUk9SICYmIGdtLmdtcHRHbHlwaE9yaWdpbi55ID4gMCkKKyAgICAgICAg
ICAgIG1feEhlaWdodCA9IGdtLmdtcHRHbHlwaE9yaWdpbi55OworCisgICAgICAgIG1fdW5pdHNQ
ZXJFbSA9IG1ldHJpY3Mub3RtRU1TcXVhcmU7CisKKyAgICAgICAgU2VsZWN0T2JqZWN0KGhkYywg
b2xkRm9udCk7CisgICAgICAgIFJlbGVhc2VEQygwLCBoZGMpOworCisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICBDR0ZvbnRSZWYgZm9udCA9IG1fZm9udC5jZ0ZvbnQoKTsKKyAgICBpbnQg
aUFzY2VudCA9IENHRm9udEdldEFzY2VudChmb250KTsKKyAgICBpbnQgaURlc2NlbnQgPSBDR0Zv
bnRHZXREZXNjZW50KGZvbnQpOworICAgIGludCBpTGluZUdhcCA9IENHRm9udEdldExlYWRpbmco
Zm9udCk7CisgICAgbV91bml0c1BlckVtID0gQ0dGb250R2V0VW5pdHNQZXJFbShmb250KTsKKyAg
ICBmbG9hdCBwb2ludFNpemUgPSBtX2ZvbnQuc2l6ZSgpOworICAgIGZsb2F0IGZBc2NlbnQgPSBz
Y2FsZUVtVG9Vbml0cyhpQXNjZW50LCBtX3VuaXRzUGVyRW0pICogcG9pbnRTaXplOworICAgIGZs
b2F0IGZEZXNjZW50ID0gLXNjYWxlRW1Ub1VuaXRzKGlEZXNjZW50LCBtX3VuaXRzUGVyRW0pICog
cG9pbnRTaXplOworICAgIGZsb2F0IGZMaW5lR2FwID0gc2NhbGVFbVRvVW5pdHMoaUxpbmVHYXAs
IG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7CisKKyAgICBpZiAoIWlzQ3VzdG9tRm9udCgpKSB7
CisgICAgICAgIEhEQyBkYyA9IEdldERDKDApOworICAgICAgICBIR0RJT0JKIG9sZEZvbnQgPSBT
ZWxlY3RPYmplY3QoZGMsIG1fZm9udC5oZm9udCgpKTsKKyAgICAgICAgaW50IGZhY2VMZW5ndGgg
PSBHZXRUZXh0RmFjZShkYywgMCwgMCk7CisgICAgICAgIFZlY3RvcjxUQ0hBUj4gZmFjZU5hbWUo
ZmFjZUxlbmd0aCk7CisgICAgICAgIEdldFRleHRGYWNlKGRjLCBmYWNlTGVuZ3RoLCBmYWNlTmFt
ZS5kYXRhKCkpOworICAgICAgICBtX2lzU3lzdGVtRm9udCA9ICFfdGNzY21wKGZhY2VOYW1lLmRh
dGEoKSwgX1QoIkx1Y2lkYSBHcmFuZGUiKSk7CisgICAgICAgIFNlbGVjdE9iamVjdChkYywgb2xk
Rm9udCk7CisgICAgICAgIFJlbGVhc2VEQygwLCBkYyk7CisKKyAgICAgICAgaWYgKHNob3VsZEFw
cGx5TWFjQXNjZW50SGFjaykgeworICAgICAgICAgICAgLy8gVGhpcyBjb2RlIGNvbWVzIGZyb20g
Rm9udERhdGFNYWMubW0uIFdlIG9ubHkgZXZlciBkbyB0aGlzIHdoZW4gcnVubmluZyByZWdyZXNz
aW9uIHRlc3RzIHNvIHRoYXQgb3VyIG1ldHJpY3Mgd2lsbCBtYXRjaCBNYWMuCisKKyAgICAgICAg
ICAgIC8vIFdlIG5lZWQgdG8gYWRqdXN0IFRpbWVzLCBIZWx2ZXRpY2EsIGFuZCBDb3VyaWVyIHRv
IGNsb3NlbHkgbWF0Y2ggdGhlCisgICAgICAgICAgICAvLyB2ZXJ0aWNhbCBtZXRyaWNzIG9mIHRo
ZWlyIE1pY3Jvc29mdCBjb3VudGVycGFydHMgdGhhdCBhcmUgdGhlIGRlIGZhY3RvCisgICAgICAg
ICAgICAvLyB3ZWIgc3RhbmRhcmQuIFRoZSBBcHBLaXQgYWRqdXN0bWVudCBvZiAyMCUgaXMgdG9v
IGJpZyBhbmQgaXMKKyAgICAgICAgICAgIC8vIGluY29ycmVjdGx5IGFkZGVkIHRvIGxpbmUgc3Bh
Y2luZywgc28gd2UgdXNlIGEgMTUlIGFkanVzdG1lbnQgaW5zdGVhZAorICAgICAgICAgICAgLy8g
YW5kIGFkZCBpdCB0byB0aGUgYXNjZW50LgorICAgICAgICAgICAgaWYgKCFfdGNzY21wKGZhY2VO
YW1lLmRhdGEoKSwgX1QoIlRpbWVzIikpIHx8ICFfdGNzY21wKGZhY2VOYW1lLmRhdGEoKSwgX1Qo
IkhlbHZldGljYSIpKSB8fCAhX3Rjc2NtcChmYWNlTmFtZS5kYXRhKCksIF9UKCJDb3VyaWVyIikp
KQorICAgICAgICAgICAgICAgIGZBc2NlbnQgKz0gZmxvb3JmKCgoZkFzY2VudCArIGZEZXNjZW50
KSAqIDAuMTVmKSArIDAuNWYpOworICAgICAgICB9CisgICAgfQorCisgICAgbV9hc2NlbnQgPSBs
cm91bmRmKGZBc2NlbnQpOworICAgIG1fZGVzY2VudCA9IGxyb3VuZGYoZkRlc2NlbnQpOworICAg
IG1fbGluZUdhcCA9IGxyb3VuZGYoZkxpbmVHYXApOworICAgIG1fbGluZVNwYWNpbmcgPSBtX2Fz
Y2VudCArIG1fZGVzY2VudCArIG1fbGluZUdhcDsKKworICAgIC8vIE1lYXN1cmUgdGhlIGFjdHVh
bCBjaGFyYWN0ZXIgIngiLCBiZWNhdXNlIEFwcEtpdCBzeW50aGVzaXplcyBYIGhlaWdodCByYXRo
ZXIgdGhhbiBnZXR0aW5nIGl0IGZyb20gdGhlIGZvbnQuCisgICAgLy8gVW5mb3J0dW5hdGVseSwg
TlNGb250IHdpbGwgcm91bmQgdGhpcyBmb3IgdXMgc28gd2UgZG9uJ3QgcXVpdGUgZ2V0IHRoZSBy
aWdodCB2YWx1ZS4KKyAgICBHbHlwaFBhZ2UqIGdseXBoUGFnZVplcm8gPSBHbHlwaFBhZ2VUcmVl
Tm9kZTo6Z2V0Um9vdENoaWxkKHRoaXMsIDApLT5wYWdlKCk7CisgICAgR2x5cGggeEdseXBoID0g
Z2x5cGhQYWdlWmVybyA/IGdseXBoUGFnZVplcm8tPmdseXBoRGF0YUZvckNoYXJhY3RlcigneCcp
LmdseXBoIDogMDsKKyAgICBpZiAoeEdseXBoKSB7CisgICAgICAgIENHUmVjdCB4Qm94OworICAg
ICAgICBDR0ZvbnRHZXRHbHlwaEJCb3hlcyhmb250LCAmeEdseXBoLCAxLCAmeEJveCk7CisgICAg
ICAgIC8vIFVzZSB0aGUgbWF4aW11bSBvZiBlaXRoZXIgd2lkdGggb3IgaGVpZ2h0IGJlY2F1c2Ug
IngiIGlzIG5lYXJseSBzcXVhcmUKKyAgICAgICAgLy8gYW5kIHdlYiBwYWdlcyB0aGF0IGZvb2xp
c2hseSB1c2UgdGhpcyBtZXRyaWMgZm9yIHdpZHRoIHdpbGwgYmUgbGFpZCBvdXQKKyAgICAgICAg
Ly8gcG9vcmx5IGlmIHdlIHJldHVybiBhbiBhY2N1cmF0ZSBoZWlnaHQuIENsYXNzaWMgY2FzZSBp
cyBUaW1lcyAxMyBwb2ludCwKKyAgICAgICAgLy8gd2hpY2ggaGFzIGFuICJ4IiB0aGF0IGlzIDd4
NiBwaXhlbHMuCisgICAgICAgIG1feEhlaWdodCA9IHNjYWxlRW1Ub1VuaXRzKG1heChDR1JlY3RH
ZXRNYXhYKHhCb3gpLCBDR1JlY3RHZXRNYXhZKHhCb3gpKSwgbV91bml0c1BlckVtKSAqIHBvaW50
U2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgaVhIZWlnaHQgPSBDR0ZvbnRHZXRYSGVp
Z2h0KGZvbnQpOworICAgICAgICBtX3hIZWlnaHQgPSBzY2FsZUVtVG9Vbml0cyhpWEhlaWdodCwg
bV91bml0c1BlckVtKSAqIHBvaW50U2l6ZTsKKyAgICB9Cit9CisKK3ZvaWQgU2ltcGxlRm9udERh
dGE6OnBsYXRmb3JtRGVzdHJveSgpCit7CisgICAgaWYgKCFpc0N1c3RvbUZvbnQoKSkgeworICAg
ICAgICBEZWxldGVPYmplY3QobV9mb250Lmhmb250KCkpOworICAgICAgICBDR0ZvbnRSZWxlYXNl
KG1fZm9udC5jZ0ZvbnQoKSk7CisgICAgfQorCisgICAgLy8gV2UgZG9uJ3QgaGFzaCB0aGlzIG9u
IFdpbjMyLCBzbyBpdCdzIGVmZmVjdGl2ZWx5IG93bmVkIGJ5IHVzLgorICAgIGRlbGV0ZSBtX3Nt
YWxsQ2Fwc0ZvbnREYXRhOworCisgICAgU2NyaXB0RnJlZUNhY2hlKCZtX3NjcmlwdENhY2hlKTsK
KyAgICBkZWxldGUgbV9zY3JpcHRGb250UHJvcGVydGllczsKK30KKworU2ltcGxlRm9udERhdGEq
IFNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNGb250RGF0YShjb25zdCBGb250RGVzY3JpcHRpb24m
IGZvbnREZXNjcmlwdGlvbikgY29uc3QKK3sKKyAgICBpZiAoIW1fc21hbGxDYXBzRm9udERhdGEp
IHsKKyAgICAgICAgZmxvYXQgc21hbGxDYXBzSGVpZ2h0ID0gY1NtYWxsQ2Fwc0ZvbnRTaXplTXVs
dGlwbGllciAqIG1fZm9udC5zaXplKCk7CisgICAgICAgIGlmIChpc0N1c3RvbUZvbnQoKSkgewor
ICAgICAgICAgICAgRm9udFBsYXRmb3JtRGF0YSBzbWFsbENhcHNGb250RGF0YShtX2ZvbnQpOwor
ICAgICAgICAgICAgc21hbGxDYXBzRm9udERhdGEuc2V0U2l6ZShzbWFsbENhcHNIZWlnaHQpOwor
ICAgICAgICAgICAgbV9zbWFsbENhcHNGb250RGF0YSA9IG5ldyBTaW1wbGVGb250RGF0YShzbWFs
bENhcHNGb250RGF0YSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgTE9HRk9OVCB3aW5mb250OworICAgICAgICAgICAgR2V0T2JqZWN0KG1fZm9udC5oZm9udCgp
LCBzaXplb2YoTE9HRk9OVCksICZ3aW5mb250KTsKKyAgICAgICAgICAgIHdpbmZvbnQubGZIZWln
aHQgPSAtbHJvdW5kZihzbWFsbENhcHNIZWlnaHQgKiAobV9mb250LnVzZUdESSgpID8gMSA6IDMy
KSk7CisgICAgICAgICAgICBIRk9OVCBoZm9udCA9IENyZWF0ZUZvbnRJbmRpcmVjdCgmd2luZm9u
dCk7CisgICAgICAgICAgICBtX3NtYWxsQ2Fwc0ZvbnREYXRhID0gbmV3IFNpbXBsZUZvbnREYXRh
KEZvbnRQbGF0Zm9ybURhdGEoaGZvbnQsIHNtYWxsQ2Fwc0hlaWdodCwgZm9udERlc2NyaXB0aW9u
LmJvbGQoKSwgZm9udERlc2NyaXB0aW9uLml0YWxpYygpLCBtX2ZvbnQudXNlR0RJKCkpKTsKKyAg
ICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbV9zbWFsbENhcHNGb250RGF0YTsKK30KKworYm9v
bCBTaW1wbGVGb250RGF0YTo6Y29udGFpbnNDaGFyYWN0ZXJzKGNvbnN0IFVDaGFyKiBjaGFyYWN0
ZXJzLCBpbnQgbGVuZ3RoKSBjb25zdAoreworICAgIC8vIEZJWE1FOiBTdXBwb3J0IGN1c3RvbSBm
b250cy4KKyAgICBpZiAoaXNDdXN0b21Gb250KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIC8vIEZJWE1FOiBNaWNyb3NvZnQgZG9jdW1lbnRhdGlvbiBzZWVtcyB0byBpbXBseSB0aGF0
IGNoYXJhY3RlcnMgY2FuIGJlIG91dHB1dCB1c2luZyBhIGdpdmVuIGZvbnQgYW5kIERDCisgICAg
Ly8gbWVyZWx5IGJ5IHRlc3RpbmcgY29kZSBwYWdlIGludGVyc2VjdGlvbi4gIFRoaXMgc2VlbXMg
c3VzcGVjdCB0aG91Z2guICBDYW4ndCBhIGZvbnQgb25seSBwYXJ0aWFsbHkKKyAgICAvLyBjb3Zl
ciBhIGdpdmVuIGNvZGUgcGFnZT8KKyAgICBJTUxhbmdGb250TGluazIqIGxhbmdGb250TGluayA9
IEZvbnRDYWNoZTo6Z2V0Rm9udExpbmtJbnRlcmZhY2UoKTsKKyAgICBpZiAoIWxhbmdGb250TGlu
aykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgSERDIGRjID0gR2V0REMoMCk7CisgICAg
CisgICAgRFdPUkQgYWNwQ29kZVBhZ2VzOworICAgIGxhbmdGb250TGluay0+Q29kZVBhZ2VUb0Nv
ZGVQYWdlcyhDUF9BQ1AsICZhY3BDb2RlUGFnZXMpOworCisgICAgRFdPUkQgZm9udENvZGVQYWdl
czsKKyAgICBsYW5nRm9udExpbmstPkdldEZvbnRDb2RlUGFnZXMoZGMsIG1fZm9udC5oZm9udCgp
LCAmZm9udENvZGVQYWdlcyk7CisKKyAgICBEV09SRCBhY3R1YWxDb2RlUGFnZXM7CisgICAgbG9u
ZyBudW1DaGFyYWN0ZXJzUHJvY2Vzc2VkOworICAgIGxvbmcgb2Zmc2V0ID0gMDsKKyAgICB3aGls
ZSAob2Zmc2V0IDwgbGVuZ3RoKSB7CisgICAgICAgIGxhbmdGb250TGluay0+R2V0U3RyQ29kZVBh
Z2VzKGNoYXJhY3RlcnMsIGxlbmd0aCwgYWNwQ29kZVBhZ2VzLCAmYWN0dWFsQ29kZVBhZ2VzLCAm
bnVtQ2hhcmFjdGVyc1Byb2Nlc3NlZCk7CisgICAgICAgIGlmICgoYWN0dWFsQ29kZVBhZ2VzICYg
Zm9udENvZGVQYWdlcykgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
b2Zmc2V0ICs9IG51bUNoYXJhY3RlcnNQcm9jZXNzZWQ7CisgICAgfQorCisgICAgUmVsZWFzZURD
KDAsIGRjKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpk
ZXRlcm1pbmVQaXRjaCgpCit7CisgICAgaWYgKGlzQ3VzdG9tRm9udCgpKSB7CisgICAgICAgIG1f
dHJlYXRBc0ZpeGVkUGl0Y2ggPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IC8vIFRFWFRNRVRSSUNTIGhhdmUgdGhpcy4gIFNldCBtX3RyZWF0QXNGaXhlZFBpdGNoIGJhc2Vk
IG9mZiB0aGF0LgorICAgIEhEQyBkYyA9IEdldERDKDApOworICAgIFNhdmVEQyhkYyk7CisgICAg
U2VsZWN0T2JqZWN0KGRjLCBtX2ZvbnQuaGZvbnQoKSk7CisKKyAgICAvLyBZZXMsIHRoaXMgbG9v
a3MgYmFja3dhcmRzLCBidXQgdGhlIGZpeGVkIHBpdGNoIGJpdCBpcyBhY3R1YWxseSBzZXQgaWYg
dGhlIGZvbnQKKyAgICAvLyBpcyAqbm90KiBmaXhlZCBwaXRjaC4gIFVuYmVsaWV2YWJsZSBidXQg
dHJ1ZS4KKyAgICBURVhUTUVUUklDIHRtOworICAgIEdldFRleHRNZXRyaWNzKGRjLCAmdG0pOwor
ICAgIG1fdHJlYXRBc0ZpeGVkUGl0Y2ggPSAoKHRtLnRtUGl0Y2hBbmRGYW1pbHkgJiBUTVBGX0ZJ
WEVEX1BJVENIKSA9PSAwKTsKKworICAgIFJlc3RvcmVEQyhkYywgLTEpOworICAgIFJlbGVhc2VE
QygwLCBkYyk7Cit9CisKK2Zsb2F0IFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybVdpZHRoRm9yR2x5
cGgoR2x5cGggZ2x5cGgpIGNvbnN0Cit7CisgICAgaWYgKG1fZm9udC51c2VHREkoKSkgeworICAg
ICAgICBIREMgaGRjID0gR2V0REMoMCk7CisgICAgICAgIEhHRElPQkogb2xkRm9udCA9IFNlbGVj
dE9iamVjdChoZGMsIG1fZm9udC5oZm9udCgpKTsKKyAgICAgICAgaW50IHdpZHRoOworICAgICAg
ICBHZXRDaGFyV2lkdGhJKGhkYywgZ2x5cGgsIDEsIDAsICZ3aWR0aCk7CisgICAgICAgIFNlbGVj
dE9iamVjdChoZGMsIG9sZEZvbnQpOworICAgICAgICBSZWxlYXNlREMoMCwgaGRjKTsKKyAgICAg
ICAgcmV0dXJuIHdpZHRoOworICAgIH0KKworICAgIENHRm9udFJlZiBmb250ID0gbV9mb250LmNn
Rm9udCgpOworICAgIGZsb2F0IHBvaW50U2l6ZSA9IG1fZm9udC5zaXplKCk7CisgICAgQ0dTaXpl
IGFkdmFuY2U7CisgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENHQWZmaW5lVHJhbnNmb3JtTWFr
ZVNjYWxlKHBvaW50U2l6ZSwgcG9pbnRTaXplKTsKKyAgICAvLyBGSVhNRTogTmVlZCB0byBhZGQg
cmVhbCBzdXBwb3J0IGZvciBwcmludGVyIGZvbnRzLgorICAgIGJvb2wgaXNQcmludGVyRm9udCA9
IGZhbHNlOworICAgIHdrR2V0R2x5cGhBZHZhbmNlcyhmb250LCBtLCBtX2lzU3lzdGVtRm9udCwg
aXNQcmludGVyRm9udCwgZ2x5cGgsIGFkdmFuY2UpOworICAgIHJldHVybiBhZHZhbmNlLndpZHRo
ICsgbV9zeW50aGV0aWNCb2xkT2Zmc2V0OworfQorCitTQ1JJUFRfRk9OVFBST1BFUlRJRVMqIFNp
bXBsZUZvbnREYXRhOjpzY3JpcHRGb250UHJvcGVydGllcygpIGNvbnN0Cit7CisgICAgaWYgKCFt
X3NjcmlwdEZvbnRQcm9wZXJ0aWVzKSB7CisgICAgICAgIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMg
PSBuZXcgU0NSSVBUX0ZPTlRQUk9QRVJUSUVTOworICAgICAgICBtZW1zZXQobV9zY3JpcHRGb250
UHJvcGVydGllcywgMCwgc2l6ZW9mKFNDUklQVF9GT05UUFJPUEVSVElFUykpOworICAgICAgICBt
X3NjcmlwdEZvbnRQcm9wZXJ0aWVzLT5jQnl0ZXMgPSBzaXplb2YoU0NSSVBUX0ZPTlRQUk9QRVJU
SUVTKTsKKyAgICAgICAgSFJFU1VMVCByZXN1bHQgPSBTY3JpcHRHZXRGb250UHJvcGVydGllcygw
LCBzY3JpcHRDYWNoZSgpLCBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzKTsKKyAgICAgICAgaWYgKHJl
c3VsdCA9PSBFX1BFTkRJTkcpIHsKKyAgICAgICAgICAgIEhEQyBkYyA9IEdldERDKDApOworICAg
ICAgICAgICAgU2F2ZURDKGRjKTsKKyAgICAgICAgICAgIFNlbGVjdE9iamVjdChkYywgbV9mb250
Lmhmb250KCkpOworICAgICAgICAgICAgU2NyaXB0R2V0Rm9udFByb3BlcnRpZXMoZGMsIHNjcmlw
dENhY2hlKCksIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMpOworICAgICAgICAgICAgUmVzdG9yZURD
KGRjLCAtMSk7CisgICAgICAgICAgICBSZWxlYXNlREMoMCwgZGMpOworICAgICAgICB9CisgICAg
fQorICAgIHJldHVybiBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzOworfQorCit9CkluZGV4OiBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNHV2luLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNHV2lu
LmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9T
aW1wbGVGb250RGF0YUNHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8q
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuICBBbGwg
cmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0zOCwy
NyArMzgsMTggQEAKICNpbmNsdWRlIDx1bmljb2RlL3VjaGFyLmg+CiAjaW5jbHVkZSA8dW5pY29k
ZS91bm9ybS5oPgogI2luY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2
aWNlcy5oPgorI2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVyZmFjZS9XZWJLaXRTeXN0ZW1JbnRl
cmZhY2UuaD4KICNpbmNsdWRlIDxtbGFuZy5oPgogI2luY2x1ZGUgPHRjaGFyLmg+Ci0jaW5jbHVk
ZSA8V2ViS2l0U3lzdGVtSW50ZXJmYWNlL1dlYktpdFN5c3RlbUludGVyZmFjZS5oPgogCiBuYW1l
c3BhY2UgV2ViQ29yZSB7CiAKIHVzaW5nIHN0ZDo6bWF4OwogCi1jb25zdCBmbG9hdCBjU21hbGxD
YXBzRm9udFNpemVNdWx0aXBsaWVyID0gMC43ZjsKLQotc3RhdGljIGJvb2wgc2hvdWxkQXBwbHlN
YWNBc2NlbnRIYWNrOwotCi1zdGF0aWMgaW5saW5lIGZsb2F0IHNjYWxlRW1Ub1VuaXRzKGZsb2F0
IHgsIHVuc2lnbmVkIHVuaXRzUGVyRW0pIHsgcmV0dXJuIHVuaXRzUGVyRW0gPyB4IC8gKGZsb2F0
KXVuaXRzUGVyRW0gOiB4OyB9Ci0KLXZvaWQgU2ltcGxlRm9udERhdGE6OnNldFNob3VsZEFwcGx5
TWFjQXNjZW50SGFjayhib29sIGIpCi17Ci0gICAgc2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrID0g
YjsKLX0KK3N0YXRpYyBpbmxpbmUgZmxvYXQgc2NhbGVFbVRvVW5pdHMoZmxvYXQgeCwgdW5zaWdu
ZWQgdW5pdHNQZXJFbSkgeyByZXR1cm4gdW5pdHNQZXJFbSA/IHggLyBzdGF0aWNfY2FzdDxmbG9h
dD4odW5pdHNQZXJFbSkgOiB4OyB9CiAKIHZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtSW5p
dCgpCi17ICAgIAorewogICAgIG1fc3ludGhldGljQm9sZE9mZnNldCA9IG1fZm9udC5zeW50aGV0
aWNCb2xkKCkgPyAxLjBmIDogMC5mOwogICAgIG1fc2NyaXB0Q2FjaGUgPSAwOwogICAgIG1fc2Ny
aXB0Rm9udFByb3BlcnRpZXMgPSAwOwpAQCAtMTEwLDcgKzEwMSw3IEBAIHZvaWQgU2ltcGxlRm9u
dERhdGE6OnBsYXRmb3JtSW5pdCgpCiAgICAgICAgIFNlbGVjdE9iamVjdChkYywgb2xkRm9udCk7
CiAgICAgICAgIFJlbGVhc2VEQygwLCBkYyk7CiAKLSAgICAgICAgaWYgKHNob3VsZEFwcGx5TWFj
QXNjZW50SGFjaykgeworICAgICAgICBpZiAoc2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrKCkpIHsK
ICAgICAgICAgICAgIC8vIFRoaXMgY29kZSBjb21lcyBmcm9tIEZvbnREYXRhTWFjLm1tLiBXZSBv
bmx5IGV2ZXIgZG8gdGhpcyB3aGVuIHJ1bm5pbmcgcmVncmVzc2lvbiB0ZXN0cyBzbyB0aGF0IG91
ciBtZXRyaWNzIHdpbGwgbWF0Y2ggTWFjLgogCiAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGFk
anVzdCBUaW1lcywgSGVsdmV0aWNhLCBhbmQgQ291cmllciB0byBjbG9zZWx5IG1hdGNoIHRoZQpA
QCAtMTYwLDgzICsxNTEsNiBAQCB2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3ko
KQogICAgIGRlbGV0ZSBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzOwogfQogCi1TaW1wbGVGb250RGF0
YSogU2ltcGxlRm9udERhdGE6OnNtYWxsQ2Fwc0ZvbnREYXRhKGNvbnN0IEZvbnREZXNjcmlwdGlv
biYgZm9udERlc2NyaXB0aW9uKSBjb25zdAotewotICAgIGlmICghbV9zbWFsbENhcHNGb250RGF0
YSkgewotICAgICAgICBmbG9hdCBzbWFsbENhcHNIZWlnaHQgPSBjU21hbGxDYXBzRm9udFNpemVN
dWx0aXBsaWVyICogbV9mb250LnNpemUoKTsKLSAgICAgICAgaWYgKGlzQ3VzdG9tRm9udCgpKSB7
Ci0gICAgICAgICAgICBGb250UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnREYXRhKG1fZm9udCk7
Ci0gICAgICAgICAgICBzbWFsbENhcHNGb250RGF0YS5zZXRTaXplKHNtYWxsQ2Fwc0hlaWdodCk7
Ci0gICAgICAgICAgICBtX3NtYWxsQ2Fwc0ZvbnREYXRhID0gbmV3IFNpbXBsZUZvbnREYXRhKHNt
YWxsQ2Fwc0ZvbnREYXRhLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICBMT0dGT05UIHdpbmZvbnQ7Ci0gICAgICAgICAgICBHZXRPYmplY3QobV9mb250Lmhmb250
KCksIHNpemVvZihMT0dGT05UKSwgJndpbmZvbnQpOwotICAgICAgICAgICAgd2luZm9udC5sZkhl
aWdodCA9IC1scm91bmRmKHNtYWxsQ2Fwc0hlaWdodCAqIChtX2ZvbnQudXNlR0RJKCkgPyAxIDog
MzIpKTsKLSAgICAgICAgICAgIEhGT05UIGhmb250ID0gQ3JlYXRlRm9udEluZGlyZWN0KCZ3aW5m
b250KTsKLSAgICAgICAgICAgIG1fc21hbGxDYXBzRm9udERhdGEgPSBuZXcgU2ltcGxlRm9udERh
dGEoRm9udFBsYXRmb3JtRGF0YShoZm9udCwgc21hbGxDYXBzSGVpZ2h0LCBmb250RGVzY3JpcHRp
b24uYm9sZCgpLCBmb250RGVzY3JpcHRpb24uaXRhbGljKCksIG1fZm9udC51c2VHREkoKSkpOwot
ICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtX3NtYWxsQ2Fwc0ZvbnREYXRhOwotfQotCi1i
b29sIFNpbXBsZUZvbnREYXRhOjpjb250YWluc0NoYXJhY3RlcnMoY29uc3QgVUNoYXIqIGNoYXJh
Y3RlcnMsIGludCBsZW5ndGgpIGNvbnN0Ci17Ci0gICAgLy8gRklYTUU6IFN1cHBvcnQgY3VzdG9t
IGZvbnRzLgotICAgIGlmIChpc0N1c3RvbUZvbnQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgLy8gRklYTUU6IE1pY3Jvc29mdCBkb2N1bWVudGF0aW9uIHNlZW1zIHRvIGltcGx5IHRo
YXQgY2hhcmFjdGVycyBjYW4gYmUgb3V0cHV0IHVzaW5nIGEgZ2l2ZW4gZm9udCBhbmQgREMKLSAg
ICAvLyBtZXJlbHkgYnkgdGVzdGluZyBjb2RlIHBhZ2UgaW50ZXJzZWN0aW9uLiAgVGhpcyBzZWVt
cyBzdXNwZWN0IHRob3VnaC4gIENhbid0IGEgZm9udCBvbmx5IHBhcnRpYWxseQotICAgIC8vIGNv
dmVyIGEgZ2l2ZW4gY29kZSBwYWdlPwotICAgIElNTGFuZ0ZvbnRMaW5rMiogbGFuZ0ZvbnRMaW5r
ID0gRm9udENhY2hlOjpnZXRGb250TGlua0ludGVyZmFjZSgpOwotICAgIGlmICghbGFuZ0ZvbnRM
aW5rKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBIREMgZGMgPSBHZXREQygwKTsKLSAg
ICAKLSAgICBEV09SRCBhY3BDb2RlUGFnZXM7Ci0gICAgbGFuZ0ZvbnRMaW5rLT5Db2RlUGFnZVRv
Q29kZVBhZ2VzKENQX0FDUCwgJmFjcENvZGVQYWdlcyk7Ci0KLSAgICBEV09SRCBmb250Q29kZVBh
Z2VzOwotICAgIGxhbmdGb250TGluay0+R2V0Rm9udENvZGVQYWdlcyhkYywgbV9mb250Lmhmb250
KCksICZmb250Q29kZVBhZ2VzKTsKLQotICAgIERXT1JEIGFjdHVhbENvZGVQYWdlczsKLSAgICBs
b25nIG51bUNoYXJhY3RlcnNQcm9jZXNzZWQ7Ci0gICAgbG9uZyBvZmZzZXQgPSAwOwotICAgIHdo
aWxlIChvZmZzZXQgPCBsZW5ndGgpIHsKLSAgICAgICAgbGFuZ0ZvbnRMaW5rLT5HZXRTdHJDb2Rl
UGFnZXMoY2hhcmFjdGVycywgbGVuZ3RoLCBhY3BDb2RlUGFnZXMsICZhY3R1YWxDb2RlUGFnZXMs
ICZudW1DaGFyYWN0ZXJzUHJvY2Vzc2VkKTsKLSAgICAgICAgaWYgKChhY3R1YWxDb2RlUGFnZXMg
JiBmb250Q29kZVBhZ2VzKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAg
ICBvZmZzZXQgKz0gbnVtQ2hhcmFjdGVyc1Byb2Nlc3NlZDsKLSAgICB9Ci0KLSAgICBSZWxlYXNl
REMoMCwgZGMpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU2ltcGxlRm9udERhdGE6
OmRldGVybWluZVBpdGNoKCkKLXsKLSAgICBpZiAoaXNDdXN0b21Gb250KCkpIHsKLSAgICAgICAg
bV90cmVhdEFzRml4ZWRQaXRjaCA9IGZhbHNlOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0g
ICAgLy8gVEVYVE1FVFJJQ1MgaGF2ZSB0aGlzLiAgU2V0IG1fdHJlYXRBc0ZpeGVkUGl0Y2ggYmFz
ZWQgb2ZmIHRoYXQuCi0gICAgSERDIGRjID0gR2V0REMoMCk7Ci0gICAgU2F2ZURDKGRjKTsKLSAg
ICBTZWxlY3RPYmplY3QoZGMsIG1fZm9udC5oZm9udCgpKTsKLQotICAgIC8vIFllcywgdGhpcyBs
b29rcyBiYWNrd2FyZHMsIGJ1dCB0aGUgZml4ZWQgcGl0Y2ggYml0IGlzIGFjdHVhbGx5IHNldCBp
ZiB0aGUgZm9udAotICAgIC8vIGlzICpub3QqIGZpeGVkIHBpdGNoLiAgVW5iZWxpZXZhYmxlIGJ1
dCB0cnVlLgotICAgIFRFWFRNRVRSSUMgdG07Ci0gICAgR2V0VGV4dE1ldHJpY3MoZGMsICZ0bSk7
Ci0gICAgbV90cmVhdEFzRml4ZWRQaXRjaCA9ICgodG0udG1QaXRjaEFuZEZhbWlseSAmIFRNUEZf
RklYRURfUElUQ0gpID09IDApOwotCi0gICAgUmVzdG9yZURDKGRjLCAtMSk7Ci0gICAgUmVsZWFz
ZURDKDAsIGRjKTsKLX0KLQogZmxvYXQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtV2lkdGhGb3JH
bHlwaChHbHlwaCBnbHlwaCkgY29uc3QKIHsKICAgICBpZiAobV9mb250LnVzZUdESSgpKSB7CkBA
IC0yNTMsMjkgKzE2NywxMiBAQCBmbG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZv
ckdsCiAgICAgZmxvYXQgcG9pbnRTaXplID0gbV9mb250LnNpemUoKTsKICAgICBDR1NpemUgYWR2
YW5jZTsKICAgICBDR0FmZmluZVRyYW5zZm9ybSBtID0gQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlU2Nh
bGUocG9pbnRTaXplLCBwb2ludFNpemUpOworIAogICAgIC8vIEZJWE1FOiBOZWVkIHRvIGFkZCBy
ZWFsIHN1cHBvcnQgZm9yIHByaW50ZXIgZm9udHMuCiAgICAgYm9vbCBpc1ByaW50ZXJGb250ID0g
ZmFsc2U7CiAgICAgd2tHZXRHbHlwaEFkdmFuY2VzKGZvbnQsIG0sIG1faXNTeXN0ZW1Gb250LCBp
c1ByaW50ZXJGb250LCBnbHlwaCwgYWR2YW5jZSk7Ci0gICAgcmV0dXJuIGFkdmFuY2Uud2lkdGgg
KyBtX3N5bnRoZXRpY0JvbGRPZmZzZXQ7Ci19CiAKLVNDUklQVF9GT05UUFJPUEVSVElFUyogU2lt
cGxlRm9udERhdGE6OnNjcmlwdEZvbnRQcm9wZXJ0aWVzKCkgY29uc3QKLXsKLSAgICBpZiAoIW1f
c2NyaXB0Rm9udFByb3BlcnRpZXMpIHsKLSAgICAgICAgbV9zY3JpcHRGb250UHJvcGVydGllcyA9
IG5ldyBTQ1JJUFRfRk9OVFBST1BFUlRJRVM7Ci0gICAgICAgIG1lbXNldChtX3NjcmlwdEZvbnRQ
cm9wZXJ0aWVzLCAwLCBzaXplb2YoU0NSSVBUX0ZPTlRQUk9QRVJUSUVTKSk7Ci0gICAgICAgIG1f
c2NyaXB0Rm9udFByb3BlcnRpZXMtPmNCeXRlcyA9IHNpemVvZihTQ1JJUFRfRk9OVFBST1BFUlRJ
RVMpOwotICAgICAgICBIUkVTVUxUIHJlc3VsdCA9IFNjcmlwdEdldEZvbnRQcm9wZXJ0aWVzKDAs
IHNjcmlwdENhY2hlKCksIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMpOwotICAgICAgICBpZiAocmVz
dWx0ID09IEVfUEVORElORykgewotICAgICAgICAgICAgSERDIGRjID0gR2V0REMoMCk7Ci0gICAg
ICAgICAgICBTYXZlREMoZGMpOwotICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBtX2ZvbnQu
aGZvbnQoKSk7Ci0gICAgICAgICAgICBTY3JpcHRHZXRGb250UHJvcGVydGllcyhkYywgc2NyaXB0
Q2FjaGUoKSwgbV9zY3JpcHRGb250UHJvcGVydGllcyk7Ci0gICAgICAgICAgICBSZXN0b3JlREMo
ZGMsIC0xKTsKLSAgICAgICAgICAgIFJlbGVhc2VEQygwLCBkYyk7Ci0gICAgICAgIH0KLSAgICB9
Ci0gICAgcmV0dXJuIG1fc2NyaXB0Rm9udFByb3BlcnRpZXM7CisgICAgcmV0dXJuIGFkdmFuY2Uu
d2lkdGggKyBtX3N5bnRoZXRpY0JvbGRPZmZzZXQ7CiB9CiAKIH0KSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ2Fpcm9XaW4uY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ2Fpcm9XaW4u
Y3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxl
Rm9udERhdGFDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTAyIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1
dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1
dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAor
ICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4g
cGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBB
TkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQK
KyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNpbXBsZUZvbnREYXRhLmgiCisKKyNpbmNs
dWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJGb250LmgiCisjaW5jbHVkZSAiRm9udENhY2hl
LmgiCisjaW5jbHVkZSAiRm9udERlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50
ZWQuaCIKKyNpbmNsdWRlIDxtbGFuZy5oPgorI2luY2x1ZGUgPHRjaGFyLmg+CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKwordm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKK3sKKyAg
ICBtX3NjcmlwdENhY2hlID0gMDsKKyAgICBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzID0gMDsKKyAg
ICBtX2lzU3lzdGVtRm9udCA9IGZhbHNlOworICAgIAorICAgIGlmIChtX2ZvbnQudXNlR0RJKCkp
IHsKKyAgICAgICAgSERDIGhkYyA9IEdldERDKDApOworICAgICAgICBIR0RJT0JKIG9sZEZvbnQg
PSBTZWxlY3RPYmplY3QoaGRjLCBtX2ZvbnQuaGZvbnQoKSk7CisgICAgICAgIE9VVExJTkVURVhU
TUVUUklDIG1ldHJpY3M7CisgICAgICAgIEdldE91dGxpbmVUZXh0TWV0cmljcyhoZGMsIHNpemVv
ZihtZXRyaWNzKSwgJm1ldHJpY3MpOworICAgICAgICBURVhUTUVUUklDJiB0ZXh0TWV0cmljcyA9
IG1ldHJpY3Mub3RtVGV4dE1ldHJpY3M7CisgICAgICAgIG1fYXNjZW50ID0gdGV4dE1ldHJpY3Mu
dG1Bc2NlbnQ7CisgICAgICAgIG1fZGVzY2VudCA9IHRleHRNZXRyaWNzLnRtRGVzY2VudDsKKyAg
ICAgICAgbV9saW5lR2FwID0gdGV4dE1ldHJpY3MudG1FeHRlcm5hbExlYWRpbmc7CisgICAgICAg
IG1fbGluZVNwYWNpbmcgPSBtX2FzY2VudCArIG1fZGVzY2VudCArIG1fbGluZUdhcDsKKyAgICAg
ICAgbV94SGVpZ2h0ID0gbV9hc2NlbnQgKiAwLjU2ZjsgLy8gQmVzdCBndWVzcyBmb3IgeEhlaWdo
dCBpZiBubyB4IGdseXBoIGlzIHByZXNlbnQuCisKKyAgICAgICAgR0xZUEhNRVRSSUNTIGdtOwor
ICAgICAgICBNQVQyIG1hdCA9IHsgMSwgMCwgMCwgMSB9OworICAgICAgICBEV09SRCBsZW4gPSBH
ZXRHbHlwaE91dGxpbmUoaGRjLCAneCcsIEdHT19NRVRSSUNTLCAmZ20sIDAsIDAsICZtYXQpOwor
ICAgICAgICBpZiAobGVuICE9IEdESV9FUlJPUiAmJiBnbS5nbXB0R2x5cGhPcmlnaW4ueSA+IDAp
CisgICAgICAgICAgICBtX3hIZWlnaHQgPSBnbS5nbXB0R2x5cGhPcmlnaW4ueTsKKworICAgICAg
ICBtX3VuaXRzUGVyRW0gPSBtZXRyaWNzLm90bUVNU3F1YXJlOworCisgICAgICAgIFNlbGVjdE9i
amVjdChoZGMsIG9sZEZvbnQpOworICAgICAgICBSZWxlYXNlREMoMCwgaGRjKTsKKworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgLy8gRklYTUU6IFRoaXMgc2VjdGlvbiBzaG91bGQgZGV0
ZXJtaW5lIGZvbnQgZGltZW5zaW9ucyAoc2VlIENHIGltcGxlbWVudGF0aW9uKS4KKyAgICBub3RJ
bXBsZW1lbnRlZCgpOworfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3ko
KQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK2Zsb2F0IFNpbXBsZUZvbnREYXRhOjpw
bGF0Zm9ybVdpZHRoRm9yR2x5cGgoR2x5cGggZ2x5cGgpIGNvbnN0Cit7CisgICAgaWYgKG1fZm9u
dC51c2VHREkoKSkgeworICAgICAgICBIREMgaGRjID0gR2V0REMoMCk7CisgICAgICAgIEhHRElP
Qkogb2xkRm9udCA9IFNlbGVjdE9iamVjdChoZGMsIG1fZm9udC5oZm9udCgpKTsKKyAgICAgICAg
aW50IHdpZHRoOworICAgICAgICBHZXRDaGFyV2lkdGhJKGhkYywgZ2x5cGgsIDEsIDAsICZ3aWR0
aCk7CisgICAgICAgIFNlbGVjdE9iamVjdChoZGMsIG9sZEZvbnQpOworICAgICAgICBSZWxlYXNl
REMoMCwgaGRjKTsKKyAgICAgICAgcmV0dXJuIHdpZHRoOworICAgIH0KKworICAgIC8vIEZJWE1F
OiBGbGVzaCBvdXQgd2l0aCBDYWlyby93aW4zMiBmb250IGltcGxlbWVudGF0aW9uCisgICAgbm90
SW1wbGVtZW50ZWQoKTsKKworICAgIHJldHVybiAwOworfQorCit9CkluZGV4OiBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YVdpbi5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERhdGFXaW4uY3BwCShyZXZp
c2lvbiAzMDA0OCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnRE
YXRhV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmln
aHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENv
cHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC00OCwxMTYgKzQ4LDE2IEBA
IHVzaW5nIHN0ZDo6bWF4OwogCiBjb25zdCBmbG9hdCBjU21hbGxDYXBzRm9udFNpemVNdWx0aXBs
aWVyID0gMC43ZjsKIAotc3RhdGljIGJvb2wgc2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrOwotCi1z
dGF0aWMgaW5saW5lIGZsb2F0IHNjYWxlRW1Ub1VuaXRzKGZsb2F0IHgsIHVuc2lnbmVkIHVuaXRz
UGVyRW0pIHsgcmV0dXJuIHVuaXRzUGVyRW0gPyB4IC8gKGZsb2F0KXVuaXRzUGVyRW0gOiB4OyB9
CitzdGF0aWMgYm9vbCBnX3Nob3VsZEFwcGx5TWFjQXNjZW50SGFjazsKIAogdm9pZCBTaW1wbGVG
b250RGF0YTo6c2V0U2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrKGJvb2wgYikKIHsKLSAgICBzaG91
bGRBcHBseU1hY0FzY2VudEhhY2sgPSBiOwotfQotCi12b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0
Zm9ybUluaXQoKQoteyAgICAKLSAgICBtX3N5bnRoZXRpY0JvbGRPZmZzZXQgPSBtX2ZvbnQuc3lu
dGhldGljQm9sZCgpID8gMS4wZiA6IDAuZjsKLSAgICBtX3NjcmlwdENhY2hlID0gMDsKLSAgICBt
X3NjcmlwdEZvbnRQcm9wZXJ0aWVzID0gMDsKLSAgICBtX2lzU3lzdGVtRm9udCA9IGZhbHNlOwot
ICAgIAotICAgIGlmIChtX2ZvbnQudXNlR0RJKCkpIHsKLSAgICAgICAgSERDIGhkYyA9IEdldERD
KDApOwotICAgICAgICBIR0RJT0JKIG9sZEZvbnQgPSBTZWxlY3RPYmplY3QoaGRjLCBtX2ZvbnQu
aGZvbnQoKSk7Ci0gICAgICAgIE9VVExJTkVURVhUTUVUUklDIG1ldHJpY3M7Ci0gICAgICAgIEdl
dE91dGxpbmVUZXh0TWV0cmljcyhoZGMsIHNpemVvZihtZXRyaWNzKSwgJm1ldHJpY3MpOwotICAg
ICAgICBURVhUTUVUUklDJiB0ZXh0TWV0cmljcyA9IG1ldHJpY3Mub3RtVGV4dE1ldHJpY3M7Ci0g
ICAgICAgIG1fYXNjZW50ID0gdGV4dE1ldHJpY3MudG1Bc2NlbnQ7Ci0gICAgICAgIG1fZGVzY2Vu
dCA9IHRleHRNZXRyaWNzLnRtRGVzY2VudDsKLSAgICAgICAgbV9saW5lR2FwID0gdGV4dE1ldHJp
Y3MudG1FeHRlcm5hbExlYWRpbmc7Ci0gICAgICAgIG1fbGluZVNwYWNpbmcgPSBtX2FzY2VudCAr
IG1fZGVzY2VudCArIG1fbGluZUdhcDsKLSAgICAgICAgbV94SGVpZ2h0ID0gbV9hc2NlbnQgKiAw
LjU2ZjsgLy8gQmVzdCBndWVzcyBmb3IgeEhlaWdodCBpZiBubyB4IGdseXBoIGlzIHByZXNlbnQu
Ci0KLSAgICAgICAgR0xZUEhNRVRSSUNTIGdtOwotICAgICAgICBNQVQyIG1hdCA9IHsgMSwgMCwg
MCwgMSB9OwotICAgICAgICBEV09SRCBsZW4gPSBHZXRHbHlwaE91dGxpbmUoaGRjLCAneCcsIEdH
T19NRVRSSUNTLCAmZ20sIDAsIDAsICZtYXQpOwotICAgICAgICBpZiAobGVuICE9IEdESV9FUlJP
UiAmJiBnbS5nbXB0R2x5cGhPcmlnaW4ueSA+IDApCi0gICAgICAgICAgICBtX3hIZWlnaHQgPSBn
bS5nbXB0R2x5cGhPcmlnaW4ueTsKLQotICAgICAgICBtX3VuaXRzUGVyRW0gPSBtZXRyaWNzLm90
bUVNU3F1YXJlOwotCi0gICAgICAgIFNlbGVjdE9iamVjdChoZGMsIG9sZEZvbnQpOwotICAgICAg
ICBSZWxlYXNlREMoMCwgaGRjKTsKLQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQ0dG
b250UmVmIGZvbnQgPSBtX2ZvbnQuY2dGb250KCk7Ci0gICAgaW50IGlBc2NlbnQgPSBDR0ZvbnRH
ZXRBc2NlbnQoZm9udCk7Ci0gICAgaW50IGlEZXNjZW50ID0gQ0dGb250R2V0RGVzY2VudChmb250
KTsKLSAgICBpbnQgaUxpbmVHYXAgPSBDR0ZvbnRHZXRMZWFkaW5nKGZvbnQpOwotICAgIG1fdW5p
dHNQZXJFbSA9IENHRm9udEdldFVuaXRzUGVyRW0oZm9udCk7Ci0gICAgZmxvYXQgcG9pbnRTaXpl
ID0gbV9mb250LnNpemUoKTsKLSAgICBmbG9hdCBmQXNjZW50ID0gc2NhbGVFbVRvVW5pdHMoaUFz
Y2VudCwgbV91bml0c1BlckVtKSAqIHBvaW50U2l6ZTsKLSAgICBmbG9hdCBmRGVzY2VudCA9IC1z
Y2FsZUVtVG9Vbml0cyhpRGVzY2VudCwgbV91bml0c1BlckVtKSAqIHBvaW50U2l6ZTsKLSAgICBm
bG9hdCBmTGluZUdhcCA9IHNjYWxlRW1Ub1VuaXRzKGlMaW5lR2FwLCBtX3VuaXRzUGVyRW0pICog
cG9pbnRTaXplOwotCi0gICAgaWYgKCFpc0N1c3RvbUZvbnQoKSkgewotICAgICAgICBIREMgZGMg
PSBHZXREQygwKTsKLSAgICAgICAgSEdESU9CSiBvbGRGb250ID0gU2VsZWN0T2JqZWN0KGRjLCBt
X2ZvbnQuaGZvbnQoKSk7Ci0gICAgICAgIGludCBmYWNlTGVuZ3RoID0gR2V0VGV4dEZhY2UoZGMs
IDAsIDApOwotICAgICAgICBWZWN0b3I8VENIQVI+IGZhY2VOYW1lKGZhY2VMZW5ndGgpOwotICAg
ICAgICBHZXRUZXh0RmFjZShkYywgZmFjZUxlbmd0aCwgZmFjZU5hbWUuZGF0YSgpKTsKLSAgICAg
ICAgbV9pc1N5c3RlbUZvbnQgPSAhX3Rjc2NtcChmYWNlTmFtZS5kYXRhKCksIF9UKCJMdWNpZGEg
R3JhbmRlIikpOwotICAgICAgICBTZWxlY3RPYmplY3QoZGMsIG9sZEZvbnQpOwotICAgICAgICBS
ZWxlYXNlREMoMCwgZGMpOwotCi0gICAgICAgIGlmIChzaG91bGRBcHBseU1hY0FzY2VudEhhY2sp
IHsKLSAgICAgICAgICAgIC8vIFRoaXMgY29kZSBjb21lcyBmcm9tIEZvbnREYXRhTWFjLm1tLiBX
ZSBvbmx5IGV2ZXIgZG8gdGhpcyB3aGVuIHJ1bm5pbmcgcmVncmVzc2lvbiB0ZXN0cyBzbyB0aGF0
IG91ciBtZXRyaWNzIHdpbGwgbWF0Y2ggTWFjLgotCi0gICAgICAgICAgICAvLyBXZSBuZWVkIHRv
IGFkanVzdCBUaW1lcywgSGVsdmV0aWNhLCBhbmQgQ291cmllciB0byBjbG9zZWx5IG1hdGNoIHRo
ZQotICAgICAgICAgICAgLy8gdmVydGljYWwgbWV0cmljcyBvZiB0aGVpciBNaWNyb3NvZnQgY291
bnRlcnBhcnRzIHRoYXQgYXJlIHRoZSBkZSBmYWN0bwotICAgICAgICAgICAgLy8gd2ViIHN0YW5k
YXJkLiBUaGUgQXBwS2l0IGFkanVzdG1lbnQgb2YgMjAlIGlzIHRvbyBiaWcgYW5kIGlzCi0gICAg
ICAgICAgICAvLyBpbmNvcnJlY3RseSBhZGRlZCB0byBsaW5lIHNwYWNpbmcsIHNvIHdlIHVzZSBh
IDE1JSBhZGp1c3RtZW50IGluc3RlYWQKLSAgICAgICAgICAgIC8vIGFuZCBhZGQgaXQgdG8gdGhl
IGFzY2VudC4KLSAgICAgICAgICAgIGlmICghX3Rjc2NtcChmYWNlTmFtZS5kYXRhKCksIF9UKCJU
aW1lcyIpKSB8fCAhX3Rjc2NtcChmYWNlTmFtZS5kYXRhKCksIF9UKCJIZWx2ZXRpY2EiKSkgfHwg
IV90Y3NjbXAoZmFjZU5hbWUuZGF0YSgpLCBfVCgiQ291cmllciIpKSkKLSAgICAgICAgICAgICAg
ICBmQXNjZW50ICs9IGZsb29yZigoKGZBc2NlbnQgKyBmRGVzY2VudCkgKiAwLjE1ZikgKyAwLjVm
KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1fYXNjZW50ID0gbHJvdW5kZihmQXNjZW50KTsK
LSAgICBtX2Rlc2NlbnQgPSBscm91bmRmKGZEZXNjZW50KTsKLSAgICBtX2xpbmVHYXAgPSBscm91
bmRmKGZMaW5lR2FwKTsKLSAgICBtX2xpbmVTcGFjaW5nID0gbV9hc2NlbnQgKyBtX2Rlc2NlbnQg
KyBtX2xpbmVHYXA7Ci0KLSAgICAvLyBNZWFzdXJlIHRoZSBhY3R1YWwgY2hhcmFjdGVyICJ4Iiwg
YmVjYXVzZSBBcHBLaXQgc3ludGhlc2l6ZXMgWCBoZWlnaHQgcmF0aGVyIHRoYW4gZ2V0dGluZyBp
dCBmcm9tIHRoZSBmb250LgotICAgIC8vIFVuZm9ydHVuYXRlbHksIE5TRm9udCB3aWxsIHJvdW5k
IHRoaXMgZm9yIHVzIHNvIHdlIGRvbid0IHF1aXRlIGdldCB0aGUgcmlnaHQgdmFsdWUuCi0gICAg
R2x5cGhQYWdlKiBnbHlwaFBhZ2VaZXJvID0gR2x5cGhQYWdlVHJlZU5vZGU6OmdldFJvb3RDaGls
ZCh0aGlzLCAwKS0+cGFnZSgpOwotICAgIEdseXBoIHhHbHlwaCA9IGdseXBoUGFnZVplcm8gPyBn
bHlwaFBhZ2VaZXJvLT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoJ3gnKS5nbHlwaCA6IDA7Ci0gICAg
aWYgKHhHbHlwaCkgewotICAgICAgICBDR1JlY3QgeEJveDsKLSAgICAgICAgQ0dGb250R2V0R2x5
cGhCQm94ZXMoZm9udCwgJnhHbHlwaCwgMSwgJnhCb3gpOwotICAgICAgICAvLyBVc2UgdGhlIG1h
eGltdW0gb2YgZWl0aGVyIHdpZHRoIG9yIGhlaWdodCBiZWNhdXNlICJ4IiBpcyBuZWFybHkgc3F1
YXJlCi0gICAgICAgIC8vIGFuZCB3ZWIgcGFnZXMgdGhhdCBmb29saXNobHkgdXNlIHRoaXMgbWV0
cmljIGZvciB3aWR0aCB3aWxsIGJlIGxhaWQgb3V0Ci0gICAgICAgIC8vIHBvb3JseSBpZiB3ZSBy
ZXR1cm4gYW4gYWNjdXJhdGUgaGVpZ2h0LiBDbGFzc2ljIGNhc2UgaXMgVGltZXMgMTMgcG9pbnQs
Ci0gICAgICAgIC8vIHdoaWNoIGhhcyBhbiAieCIgdGhhdCBpcyA3eDYgcGl4ZWxzLgotICAgICAg
ICBtX3hIZWlnaHQgPSBzY2FsZUVtVG9Vbml0cyhtYXgoQ0dSZWN0R2V0TWF4WCh4Qm94KSwgQ0dS
ZWN0R2V0TWF4WSh4Qm94KSksIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7Ci0gICAgfSBlbHNl
IHsKLSAgICAgICAgaW50IGlYSGVpZ2h0ID0gQ0dGb250R2V0WEhlaWdodChmb250KTsKLSAgICAg
ICAgbV94SGVpZ2h0ID0gc2NhbGVFbVRvVW5pdHMoaVhIZWlnaHQsIG1fdW5pdHNQZXJFbSkgKiBw
b2ludFNpemU7Ci0gICAgfQorICAgIGdfc2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrID0gYjsKIH0K
IAotdm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1EZXN0cm95KCkKK2Jvb2wgU2ltcGxlRm9u
dERhdGE6OnNob3VsZEFwcGx5TWFjQXNjZW50SGFjaygpCiB7Ci0gICAgaWYgKCFpc0N1c3RvbUZv
bnQoKSkgewotICAgICAgICBEZWxldGVPYmplY3QobV9mb250Lmhmb250KCkpOwotICAgICAgICBD
R0ZvbnRSZWxlYXNlKG1fZm9udC5jZ0ZvbnQoKSk7Ci0gICAgfQotCi0gICAgLy8gV2UgZG9uJ3Qg
aGFzaCB0aGlzIG9uIFdpbjMyLCBzbyBpdCdzIGVmZmVjdGl2ZWx5IG93bmVkIGJ5IHVzLgotICAg
IGRlbGV0ZSBtX3NtYWxsQ2Fwc0ZvbnREYXRhOwotCi0gICAgU2NyaXB0RnJlZUNhY2hlKCZtX3Nj
cmlwdENhY2hlKTsKLSAgICBkZWxldGUgbV9zY3JpcHRGb250UHJvcGVydGllczsKKyAgICByZXR1
cm4gZ19zaG91bGRBcHBseU1hY0FzY2VudEhhY2s7CiB9CiAKIFNpbXBsZUZvbnREYXRhKiBTaW1w
bGVGb250RGF0YTo6c21hbGxDYXBzRm9udERhdGEoY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250
RGVzY3JpcHRpb24pIGNvbnN0CkBAIC0yMzcsMjggKzEzNyw2IEBAIHZvaWQgU2ltcGxlRm9udERh
dGE6OmRldGVybWluZVBpdGNoKCkKICAgICBSZWxlYXNlREMoMCwgZGMpOwogfQogCi1mbG9hdCBT
aW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZvckdseXBoKEdseXBoIGdseXBoKSBjb25zdAot
ewotICAgIGlmIChtX2ZvbnQudXNlR0RJKCkpIHsKLSAgICAgICAgSERDIGhkYyA9IEdldERDKDAp
OwotICAgICAgICBIR0RJT0JKIG9sZEZvbnQgPSBTZWxlY3RPYmplY3QoaGRjLCBtX2ZvbnQuaGZv
bnQoKSk7Ci0gICAgICAgIGludCB3aWR0aDsKLSAgICAgICAgR2V0Q2hhcldpZHRoSShoZGMsIGds
eXBoLCAxLCAwLCAmd2lkdGgpOwotICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBvbGRGb250KTsK
LSAgICAgICAgUmVsZWFzZURDKDAsIGhkYyk7Ci0gICAgICAgIHJldHVybiB3aWR0aDsKLSAgICB9
Ci0KLSAgICBDR0ZvbnRSZWYgZm9udCA9IG1fZm9udC5jZ0ZvbnQoKTsKLSAgICBmbG9hdCBwb2lu
dFNpemUgPSBtX2ZvbnQuc2l6ZSgpOwotICAgIENHU2l6ZSBhZHZhbmNlOwotICAgIENHQWZmaW5l
VHJhbnNmb3JtIG0gPSBDR0FmZmluZVRyYW5zZm9ybU1ha2VTY2FsZShwb2ludFNpemUsIHBvaW50
U2l6ZSk7Ci0gICAgLy8gRklYTUU6IE5lZWQgdG8gYWRkIHJlYWwgc3VwcG9ydCBmb3IgcHJpbnRl
ciBmb250cy4KLSAgICBib29sIGlzUHJpbnRlckZvbnQgPSBmYWxzZTsKLSAgICB3a0dldEdseXBo
QWR2YW5jZXMoZm9udCwgbSwgbV9pc1N5c3RlbUZvbnQsIGlzUHJpbnRlckZvbnQsIGdseXBoLCBh
ZHZhbmNlKTsKLSAgICByZXR1cm4gYWR2YW5jZS53aWR0aCArIG1fc3ludGhldGljQm9sZE9mZnNl
dDsKLX0KLQogU0NSSVBUX0ZPTlRQUk9QRVJUSUVTKiBTaW1wbGVGb250RGF0YTo6c2NyaXB0Rm9u
dFByb3BlcnRpZXMoKSBjb25zdAogewogICAgIGlmICghbV9zY3JpcHRGb250UHJvcGVydGllcykg
ewpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlQ0dXaW4uY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNHV2luLmNwcAkocmV2aXNpb24g
Mjk4MzQpCShmcm9tIFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZVdpbi5jcHA6Mjk4MzQp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFnSW1hZ2VDR1dpbi5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5j
LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkRyYWdJbWFnZS5oIgorCisjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKKyNpbmNsdWRl
ICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbWFnZS5oIgorI2luY2x1ZGUgIlJldGFp
blB0ci5oIgorCisjaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NvcmVHcmFwaGljcy5oPgorCisjaW5j
bHVkZSA8d2luZG93cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0ludFNpemUgZHJhZ0lt
YWdlU2l6ZShEcmFnSW1hZ2VSZWYgaW1hZ2UpCit7CisgICAgaWYgKCFpbWFnZSkKKyAgICAgICAg
cmV0dXJuIEludFNpemUoKTsKKyAgICBCSVRNQVAgYjsKKyAgICBHZXRPYmplY3QoaW1hZ2UsIHNp
emVvZihCSVRNQVApLCAmYik7CisgICAgcmV0dXJuIEludFNpemUoYi5ibVdpZHRoLCBiLmJtSGVp
Z2h0KTsKK30KKwordm9pZCBkZWxldGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVmIGltYWdlKQorewor
ICAgIGlmIChpbWFnZSkKKyAgICAgICAgOjpEZWxldGVPYmplY3QoaW1hZ2UpOworfQorCitIQklU
TUFQIGFsbG9jSW1hZ2UoSERDIGRjLCBJbnRTaXplIHNpemUsIENHQ29udGV4dFJlZiAqdGFyZ2V0
UmVmKQoreworICAgIEhCSVRNQVAgaGJtcDsKKyAgICBCSVRNQVBJTkZPIGJtcEluZm8gPSB7MH07
CisgICAgYm1wSW5mby5ibWlIZWFkZXIuYmlTaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIp
OworICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpV2lkdGggPSBzaXplLndpZHRoKCk7CisgICAgYm1w
SW5mby5ibWlIZWFkZXIuYmlIZWlnaHQgPSBzaXplLmhlaWdodCgpOworICAgIGJtcEluZm8uYm1p
SGVhZGVyLmJpUGxhbmVzID0gMTsKKyAgICBibXBJbmZvLmJtaUhlYWRlci5iaUJpdENvdW50ID0g
MzI7CisgICAgYm1wSW5mby5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiA9IEJJX1JHQjsKKyAgICBM
UFZPSUQgYml0czsKKyAgICBoYm1wID0gQ3JlYXRlRElCU2VjdGlvbihkYywgJmJtcEluZm8sIERJ
Ql9SR0JfQ09MT1JTLCAmYml0cywgMCwgMCk7CisKKyAgICBpZiAoIXRhcmdldFJlZikKKyAgICAg
ICAgcmV0dXJuIGhibXA7CisKKyAgICBDR0NvbG9yU3BhY2VSZWYgZGV2aWNlUkdCID0gQ0dDb2xv
clNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7CisgICAgQ0dDb250ZXh0UmVmIGJpdG1hcENvbnRleHQg
PSBDR0JpdG1hcENvbnRleHRDcmVhdGUoYml0cywgYm1wSW5mby5ibWlIZWFkZXIuYmlXaWR0aCwg
Ym1wSW5mby5ibWlIZWFkZXIuYmlIZWlnaHQsIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wSW5mby5ibWlIZWFkZXIuYmlXaWR0aCAq
IDQsIGRldmljZVJHQiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhh
Tm9uZVNraXBGaXJzdCk7CisgICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOworICAg
IGlmICghYml0bWFwQ29udGV4dCkgeworICAgICAgICBEZWxldGVPYmplY3QoaGJtcCk7CisgICAg
ICAgIHJldHVybiAwOworICAgIH0KKworICAgICp0YXJnZXRSZWYgPSBiaXRtYXBDb250ZXh0Owor
ICAgIHJldHVybiBoYm1wOworfQorCitzdGF0aWMgQ0dDb250ZXh0UmVmIGNyZWF0ZUNnQ29udGV4
dEZyb21CaXRtYXAoSEJJVE1BUCBiaXRtYXApCit7CisgICAgQklUTUFQIGluZm87CisgICAgR2V0
T2JqZWN0KGJpdG1hcCwgc2l6ZW9mKGluZm8pLCAmaW5mbyk7CisgICAgQVNTRVJUKGluZm8uYm1C
aXRzUGl4ZWwgPT0gMzIpOworCisgICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29s
b3JTcGFjZUNyZWF0ZURldmljZVJHQigpOworICAgIENHQ29udGV4dFJlZiBiaXRtYXBDb250ZXh0
ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGluZm8uYm1CaXRzLCBpbmZvLmJtV2lkdGgsIGluZm8u
Ym1IZWlnaHQsIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9y
ZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhhTm9uZVNraXBGaXJzdCk7CisgICAgQ0dDb2xvclNw
YWNlUmVsZWFzZShkZXZpY2VSR0IpOworICAgIHJldHVybiBiaXRtYXBDb250ZXh0OworfQorCitE
cmFnSW1hZ2VSZWYgc2NhbGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVmIGltYWdlLCBGbG9hdFNpemUg
c2NhbGUpCit7CisgICAgLy8gRklYTUU6IGR1ZSB0byB0aGUgd2F5IGRyYWcgaW1hZ2VzIGFyZSBk
b25lIG9uIHdpbmRvd3Mgd2UgbmVlZCAKKyAgICAvLyB0byBwcmVwcm9jZXNzIHRoZSBhbHBoYSBj
aGFubmVsIDxyZGFyOi8vcHJvYmxlbS81MDE1OTQ2PgorCisgICAgaWYgKCFpbWFnZSkKKyAgICAg
ICAgcmV0dXJuIDA7CisgICAgQ0dDb250ZXh0UmVmIHRhcmdldENvbnRleHQ7CisgICAgQ0dDb250
ZXh0UmVmIHNyY0NvbnRleHQ7CisgICAgQ0dJbWFnZVJlZiBzcmNJbWFnZTsKKyAgICBJbnRTaXpl
IHNyY1NpemUgPSBkcmFnSW1hZ2VTaXplKGltYWdlKTsKKyAgICBJbnRTaXplIGRzdFNpemUoKGlu
dCkoc3JjU2l6ZS53aWR0aCgpICogc2NhbGUud2lkdGgoKSksIChpbnQpKHNyY1NpemUuaGVpZ2h0
KCkgKiBzY2FsZS5oZWlnaHQoKSkpOworICAgIEhCSVRNQVAgaGJtcCA9IDA7CisgICAgSERDIGRj
ID0gR2V0REMoMCk7CisgICAgSERDIGRzdERDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGRjKTsKKyAg
ICBpZiAoIWRzdERDKQorICAgICAgICBnb3RvIGV4aXQ7CisKKyAgICBoYm1wID0gYWxsb2NJbWFn
ZShkc3REQywgZHN0U2l6ZSwgJnRhcmdldENvbnRleHQpOworICAgIGlmICghaGJtcCkKKyAgICAg
ICAgZ290byBleGl0OworCisgICAgc3JjQ29udGV4dCA9IGNyZWF0ZUNnQ29udGV4dEZyb21CaXRt
YXAoaW1hZ2UpOworICAgIHNyY0ltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlSW1hZ2Uoc3Jj
Q29udGV4dCk7CisgICAgQ0dSZWN0IHJlY3Q7CisgICAgcmVjdC5vcmlnaW4ueCA9IDA7CisgICAg
cmVjdC5vcmlnaW4ueSA9IDA7CisgICAgcmVjdC5zaXplID0gZHN0U2l6ZTsKKyAgICBDR0NvbnRl
eHREcmF3SW1hZ2UodGFyZ2V0Q29udGV4dCwgcmVjdCwgc3JjSW1hZ2UpOworICAgIENHSW1hZ2VS
ZWxlYXNlKHNyY0ltYWdlKTsKKyAgICBDR0NvbnRleHRSZWxlYXNlKHNyY0NvbnRleHQpOworICAg
IENHQ29udGV4dFJlbGVhc2UodGFyZ2V0Q29udGV4dCk7CisgICAgOjpEZWxldGVPYmplY3QoaW1h
Z2UpOworICAgIGltYWdlID0gMDsKKworZXhpdDoKKyAgICBpZiAoIWhibXApCisgICAgICAgIGhi
bXAgPSBpbWFnZTsKKyAgICBpZiAoZHN0REMpCisgICAgICAgIERlbGV0ZURDKGRzdERDKTsKKyAg
ICBSZWxlYXNlREMoMCwgZGMpOworICAgIHJldHVybiBoYm1wOworfQorICAgIAorRHJhZ0ltYWdl
UmVmIGRpc3NvbHZlRHJhZ0ltYWdlVG9GcmFjdGlvbihEcmFnSW1hZ2VSZWYgaW1hZ2UsIGZsb2F0
KQoreworICAgIC8vV2UgZG9uJ3QgZG8gdGhpcyBvbiB3aW5kb3dzIGFzIHRoZSBkcmFnaW1hZ2Ug
aXMgYmxlbmRlZCBieSB0aGUgT1MKKyAgICByZXR1cm4gaW1hZ2U7Cit9CisgICAgICAgIAorRHJh
Z0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZyb21JbWFnZShJbWFnZSogaW1nKQoreyAgICAKKyAg
ICBIQklUTUFQIGhibXAgPSAwOworICAgIEhEQyBkYyA9IEdldERDKDApOworICAgIEhEQyB3b3Jr
aW5nREMgPSBDcmVhdGVDb21wYXRpYmxlREMoZGMpOworICAgIENHQ29udGV4dFJlZiBkcmF3Q29u
dGV4dCA9IDA7CisgICAgaWYgKCF3b3JraW5nREMpCisgICAgICAgIGdvdG8gZXhpdDsKKworICAg
IGhibXAgPSBhbGxvY0ltYWdlKHdvcmtpbmdEQywgaW1nLT5zaXplKCksICZkcmF3Q29udGV4dCk7
CisKKyAgICBpZiAoIWhibXApCisgICAgICAgIGdvdG8gZXhpdDsKKworICAgIGlmICghZHJhd0Nv
bnRleHQpIHsKKyAgICAgICAgOjpEZWxldGVPYmplY3QoaGJtcCk7CisgICAgICAgIGhibXAgPSAw
OworICAgIH0KKworICAgIENHSW1hZ2VSZWYgc3JjSW1hZ2UgPSBpbWctPmdldENHSW1hZ2VSZWYo
KTsKKyAgICBDR1JlY3QgcmVjdDsKKyAgICByZWN0LnNpemUgPSBpbWctPnNpemUoKTsKKyAgICBy
ZWN0Lm9yaWdpbi54ID0gMDsKKyAgICByZWN0Lm9yaWdpbi55ID0gLXJlY3Quc2l6ZS5oZWlnaHQ7
CisgICAgc3RhdGljIGNvbnN0IENHRmxvYXQgd2hpdGUgW10gPSB7MS4wLCAxLjAsIDEuMCwgMS4w
fTsKKyAgICBDR0NvbnRleHRTY2FsZUNUTShkcmF3Q29udGV4dCwgMSwgLTEpOworICAgIENHQ29u
dGV4dFNldEZpbGxDb2xvcihkcmF3Q29udGV4dCwgd2hpdGUpOworICAgIENHQ29udGV4dEZpbGxS
ZWN0KGRyYXdDb250ZXh0LCByZWN0KTsKKyAgICBDR0NvbnRleHRTZXRCbGVuZE1vZGUoZHJhd0Nv
bnRleHQsIGtDR0JsZW5kTW9kZU5vcm1hbCk7CisgICAgQ0dDb250ZXh0RHJhd0ltYWdlKGRyYXdD
b250ZXh0LCByZWN0LCBzcmNJbWFnZSk7CisgICAgQ0dDb250ZXh0UmVsZWFzZShkcmF3Q29udGV4
dCk7CisKK2V4aXQ6CisgICAgaWYgKHdvcmtpbmdEQykKKyAgICAgICAgRGVsZXRlREMod29ya2lu
Z0RDKTsKKyAgICBSZWxlYXNlREMoMCwgZGMpOworICAgIHJldHVybiBoYm1wOworfQorICAgIAor
RHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUljb25Gb3JDYWNoZWRJbWFnZShDYWNoZWRJbWFn
ZSopCit7CisgICAgLy9GSVhNRTogUHJvdmlkZSBpY29uIGZvciBpbWFnZSB0eXBlIDxyZGFyOi8v
cHJvYmxlbS81MDE1OTQ5PgorICAgIHJldHVybiAwOyAgICAgCit9CisgICAgCit9CkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFnSW1hZ2VDR1dpbi5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlQ0dXaW4uY3BwCShyZXZpc2lvbiAyOTcyNikKKysr
IFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNHV2luLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5jLiAgQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBBcHBsZSBJbmMu
ICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBA
IC0zNywyMSArMzcsNiBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLUludFNpemUgZHJhZ0lt
YWdlU2l6ZShEcmFnSW1hZ2VSZWYgaW1hZ2UpCi17Ci0gICAgaWYgKCFpbWFnZSkKLSAgICAgICAg
cmV0dXJuIEludFNpemUoKTsKLSAgICBCSVRNQVAgYjsKLSAgICBHZXRPYmplY3QoaW1hZ2UsIHNp
emVvZihCSVRNQVApLCAmYik7Ci0gICAgcmV0dXJuIEludFNpemUoYi5ibVdpZHRoLCBiLmJtSGVp
Z2h0KTsKLX0KLQotdm9pZCBkZWxldGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVmIGltYWdlKQotewot
ICAgIGlmIChpbWFnZSkKLSAgICAgICAgOjpEZWxldGVPYmplY3QoaW1hZ2UpOwotfQotCiBIQklU
TUFQIGFsbG9jSW1hZ2UoSERDIGRjLCBJbnRTaXplIHNpemUsIENHQ29udGV4dFJlZiAqdGFyZ2V0
UmVmKQogewogICAgIEhCSVRNQVAgaGJtcDsKQEAgLTEwNiw3ICs5MSw3IEBAIERyYWdJbWFnZVJl
ZiBzY2FsZURyYWdJbWFnZShEcmFnSW1hZ2VSZWYKICAgICBDR0NvbnRleHRSZWYgc3JjQ29udGV4
dDsKICAgICBDR0ltYWdlUmVmIHNyY0ltYWdlOwogICAgIEludFNpemUgc3JjU2l6ZSA9IGRyYWdJ
bWFnZVNpemUoaW1hZ2UpOwotICAgIEludFNpemUgZHN0U2l6ZSgoaW50KShzcmNTaXplLndpZHRo
KCkgKiBzY2FsZS53aWR0aCgpKSwgKGludCkoc3JjU2l6ZS5oZWlnaHQoKSAqIHNjYWxlLmhlaWdo
dCgpKSk7CisgICAgSW50U2l6ZSBkc3RTaXplKHN0YXRpY19jYXN0PGludD4oc3JjU2l6ZS53aWR0
aCgpICogc2NhbGUud2lkdGgoKSksIHN0YXRpY19jYXN0PGludD4oc3JjU2l6ZS5oZWlnaHQoKSAq
IHNjYWxlLmhlaWdodCgpKSk7CiAgICAgSEJJVE1BUCBoYm1wID0gMDsKICAgICBIREMgZGMgPSBH
ZXREQygwKTsKICAgICBIREMgZHN0REMgPSBDcmVhdGVDb21wYXRpYmxlREMoZGMpOwpAQCAtMTM5
LDE0ICsxMjQsOCBAQCBleGl0OgogICAgIHJldHVybiBoYm1wOwogfQogICAgIAotRHJhZ0ltYWdl
UmVmIGRpc3NvbHZlRHJhZ0ltYWdlVG9GcmFjdGlvbihEcmFnSW1hZ2VSZWYgaW1hZ2UsIGZsb2F0
KQotewotICAgIC8vV2UgZG9uJ3QgZG8gdGhpcyBvbiB3aW5kb3dzIGFzIHRoZSBkcmFnaW1hZ2Ug
aXMgYmxlbmRlZCBieSB0aGUgT1MKLSAgICByZXR1cm4gaW1hZ2U7Ci19Ci0gICAgICAgIAogRHJh
Z0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZyb21JbWFnZShJbWFnZSogaW1nKQoteyAgICAKK3sK
ICAgICBIQklUTUFQIGhibXAgPSAwOwogICAgIEhEQyBkYyA9IEdldERDKDApOwogICAgIEhEQyB3
b3JraW5nREMgPSBDcmVhdGVDb21wYXRpYmxlREMoZGMpOwpAQCAtMTg0LDEwICsxNjMsNCBAQCBl
eGl0OgogICAgIHJldHVybiBoYm1wOwogfQogICAgIAotRHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJ
bWFnZUljb25Gb3JDYWNoZWRJbWFnZShDYWNoZWRJbWFnZSopCi17Ci0gICAgLy9GSVhNRTogUHJv
dmlkZSBpY29uIGZvciBpbWFnZSB0eXBlIDxyZGFyOi8vcHJvYmxlbS81MDE1OTQ5PgotICAgIHJl
dHVybiAwOyAgICAgCi19Ci0gICAgCiB9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFn
SW1hZ2VDYWlyb1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJh
Z0ltYWdlQ2Fpcm9XaW4uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW4v
RHJhZ0ltYWdlQ2Fpcm9XaW4uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDU0IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRF
UiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVS
LCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJEcmFnSW1hZ2UuaCIKKworI2lu
Y2x1ZGUgIkNhY2hlZEltYWdlLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5j
bHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlJl
dGFpblB0ci5oIgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK0RyYWdJbWFnZVJlZiBzY2FsZURyYWdJbWFnZShEcmFnSW1hZ2VSZWYgaW1hZ2UsIEZsb2F0
U2l6ZSBzY2FsZSkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworCisgICAgcmV0dXJuIGltYWdl
OworfQorICAgIAorRHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZyb21JbWFnZShJbWFnZSog
aW1nKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisKKyAgICBEcmFnSW1hZ2VSZWYgdGVtcDsK
KyAgICByZXR1cm4gdGVtcDsKK30KKyAgICAKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2lu
L0RyYWdJbWFnZVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJh
Z0ltYWdlV2luLmNwcAkocmV2aXNpb24gMzAwNDgpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbi9E
cmFnSW1hZ2VXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENv
cHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29w
eXJpZ2h0IChDKSAyMDA3LCAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAg
KgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTMxLDggKzMxLDYgQEAKICNpbmNsdWRl
ICJJbWFnZS5oIgogI2luY2x1ZGUgIlJldGFpblB0ci5oIgogCi0jaW5jbHVkZSA8Q29yZUdyYXBo
aWNzL0NvcmVHcmFwaGljcy5oPgotCiAjaW5jbHVkZSA8d2luZG93cy5oPgogCiBuYW1lc3BhY2Ug
V2ViQ29yZSB7CkBAIC01MiwxMzggKzUwLDEyIEBAIHZvaWQgZGVsZXRlRHJhZ0ltYWdlKERyYWdJ
bWFnZVJlZiBpbWFnZSkKICAgICAgICAgOjpEZWxldGVPYmplY3QoaW1hZ2UpOwogfQogCi1IQklU
TUFQIGFsbG9jSW1hZ2UoSERDIGRjLCBJbnRTaXplIHNpemUsIENHQ29udGV4dFJlZiAqdGFyZ2V0
UmVmKQotewotICAgIEhCSVRNQVAgaGJtcDsKLSAgICBCSVRNQVBJTkZPIGJtcEluZm8gPSB7MH07
Ci0gICAgYm1wSW5mby5ibWlIZWFkZXIuYmlTaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIp
OwotICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpV2lkdGggPSBzaXplLndpZHRoKCk7Ci0gICAgYm1w
SW5mby5ibWlIZWFkZXIuYmlIZWlnaHQgPSBzaXplLmhlaWdodCgpOwotICAgIGJtcEluZm8uYm1p
SGVhZGVyLmJpUGxhbmVzID0gMTsKLSAgICBibXBJbmZvLmJtaUhlYWRlci5iaUJpdENvdW50ID0g
MzI7Ci0gICAgYm1wSW5mby5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiA9IEJJX1JHQjsKLSAgICBM
UFZPSUQgYml0czsKLSAgICBoYm1wID0gQ3JlYXRlRElCU2VjdGlvbihkYywgJmJtcEluZm8sIERJ
Ql9SR0JfQ09MT1JTLCAmYml0cywgMCwgMCk7Ci0KLSAgICBpZiAoIXRhcmdldFJlZikKLSAgICAg
ICAgcmV0dXJuIGhibXA7Ci0KLSAgICBDR0NvbG9yU3BhY2VSZWYgZGV2aWNlUkdCID0gQ0dDb2xv
clNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7Ci0gICAgQ0dDb250ZXh0UmVmIGJpdG1hcENvbnRleHQg
PSBDR0JpdG1hcENvbnRleHRDcmVhdGUoYml0cywgYm1wSW5mby5ibWlIZWFkZXIuYmlXaWR0aCwg
Ym1wSW5mby5ibWlIZWFkZXIuYmlIZWlnaHQsIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wSW5mby5ibWlIZWFkZXIuYmlXaWR0aCAq
IDQsIGRldmljZVJHQiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhh
Tm9uZVNraXBGaXJzdCk7Ci0gICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOwotICAg
IGlmICghYml0bWFwQ29udGV4dCkgewotICAgICAgICBEZWxldGVPYmplY3QoaGJtcCk7Ci0gICAg
ICAgIHJldHVybiAwOwotICAgIH0KLQotICAgICp0YXJnZXRSZWYgPSBiaXRtYXBDb250ZXh0Owot
ICAgIHJldHVybiBoYm1wOwotfQotCi1zdGF0aWMgQ0dDb250ZXh0UmVmIGNyZWF0ZUNnQ29udGV4
dEZyb21CaXRtYXAoSEJJVE1BUCBiaXRtYXApCi17Ci0gICAgQklUTUFQIGluZm87Ci0gICAgR2V0
T2JqZWN0KGJpdG1hcCwgc2l6ZW9mKGluZm8pLCAmaW5mbyk7Ci0gICAgQVNTRVJUKGluZm8uYm1C
aXRzUGl4ZWwgPT0gMzIpOwotCi0gICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29s
b3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwotICAgIENHQ29udGV4dFJlZiBiaXRtYXBDb250ZXh0
ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGluZm8uYm1CaXRzLCBpbmZvLmJtV2lkdGgsIGluZm8u
Ym1IZWlnaHQsIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9y
ZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhhTm9uZVNraXBGaXJzdCk7Ci0gICAgQ0dDb2xvclNw
YWNlUmVsZWFzZShkZXZpY2VSR0IpOwotICAgIHJldHVybiBiaXRtYXBDb250ZXh0OwotfQotCi1E
cmFnSW1hZ2VSZWYgc2NhbGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVmIGltYWdlLCBGbG9hdFNpemUg
c2NhbGUpCi17Ci0gICAgLy8gRklYTUU6IGR1ZSB0byB0aGUgd2F5IGRyYWcgaW1hZ2VzIGFyZSBk
b25lIG9uIHdpbmRvd3Mgd2UgbmVlZCAKLSAgICAvLyB0byBwcmVwcm9jZXNzIHRoZSBhbHBoYSBj
aGFubmVsIDxyZGFyOi8vcHJvYmxlbS81MDE1OTQ2PgotCi0gICAgaWYgKCFpbWFnZSkKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgQ0dDb250ZXh0UmVmIHRhcmdldENvbnRleHQ7Ci0gICAgQ0dDb250
ZXh0UmVmIHNyY0NvbnRleHQ7Ci0gICAgQ0dJbWFnZVJlZiBzcmNJbWFnZTsKLSAgICBJbnRTaXpl
IHNyY1NpemUgPSBkcmFnSW1hZ2VTaXplKGltYWdlKTsKLSAgICBJbnRTaXplIGRzdFNpemUoKGlu
dCkoc3JjU2l6ZS53aWR0aCgpICogc2NhbGUud2lkdGgoKSksIChpbnQpKHNyY1NpemUuaGVpZ2h0
KCkgKiBzY2FsZS5oZWlnaHQoKSkpOwotICAgIEhCSVRNQVAgaGJtcCA9IDA7Ci0gICAgSERDIGRj
ID0gR2V0REMoMCk7Ci0gICAgSERDIGRzdERDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGRjKTsKLSAg
ICBpZiAoIWRzdERDKQotICAgICAgICBnb3RvIGV4aXQ7Ci0KLSAgICBoYm1wID0gYWxsb2NJbWFn
ZShkc3REQywgZHN0U2l6ZSwgJnRhcmdldENvbnRleHQpOwotICAgIGlmICghaGJtcCkKLSAgICAg
ICAgZ290byBleGl0OwotCi0gICAgc3JjQ29udGV4dCA9IGNyZWF0ZUNnQ29udGV4dEZyb21CaXRt
YXAoaW1hZ2UpOwotICAgIHNyY0ltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlSW1hZ2Uoc3Jj
Q29udGV4dCk7Ci0gICAgQ0dSZWN0IHJlY3Q7Ci0gICAgcmVjdC5vcmlnaW4ueCA9IDA7Ci0gICAg
cmVjdC5vcmlnaW4ueSA9IDA7Ci0gICAgcmVjdC5zaXplID0gZHN0U2l6ZTsKLSAgICBDR0NvbnRl
eHREcmF3SW1hZ2UodGFyZ2V0Q29udGV4dCwgcmVjdCwgc3JjSW1hZ2UpOwotICAgIENHSW1hZ2VS
ZWxlYXNlKHNyY0ltYWdlKTsKLSAgICBDR0NvbnRleHRSZWxlYXNlKHNyY0NvbnRleHQpOwotICAg
IENHQ29udGV4dFJlbGVhc2UodGFyZ2V0Q29udGV4dCk7Ci0gICAgOjpEZWxldGVPYmplY3QoaW1h
Z2UpOwotICAgIGltYWdlID0gMDsKLQotZXhpdDoKLSAgICBpZiAoIWhibXApCi0gICAgICAgIGhi
bXAgPSBpbWFnZTsKLSAgICBpZiAoZHN0REMpCi0gICAgICAgIERlbGV0ZURDKGRzdERDKTsKLSAg
ICBSZWxlYXNlREMoMCwgZGMpOwotICAgIHJldHVybiBoYm1wOwotfQotICAgIAogRHJhZ0ltYWdl
UmVmIGRpc3NvbHZlRHJhZ0ltYWdlVG9GcmFjdGlvbihEcmFnSW1hZ2VSZWYgaW1hZ2UsIGZsb2F0
KQogewogICAgIC8vV2UgZG9uJ3QgZG8gdGhpcyBvbiB3aW5kb3dzIGFzIHRoZSBkcmFnaW1hZ2Ug
aXMgYmxlbmRlZCBieSB0aGUgT1MKICAgICByZXR1cm4gaW1hZ2U7CiB9CiAgICAgICAgIAotRHJh
Z0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZyb21JbWFnZShJbWFnZSogaW1nKQoteyAgICAKLSAg
ICBIQklUTUFQIGhibXAgPSAwOwotICAgIEhEQyBkYyA9IEdldERDKDApOwotICAgIEhEQyB3b3Jr
aW5nREMgPSBDcmVhdGVDb21wYXRpYmxlREMoZGMpOwotICAgIENHQ29udGV4dFJlZiBkcmF3Q29u
dGV4dCA9IDA7Ci0gICAgaWYgKCF3b3JraW5nREMpCi0gICAgICAgIGdvdG8gZXhpdDsKLQotICAg
IGhibXAgPSBhbGxvY0ltYWdlKHdvcmtpbmdEQywgaW1nLT5zaXplKCksICZkcmF3Q29udGV4dCk7
Ci0KLSAgICBpZiAoIWhibXApCi0gICAgICAgIGdvdG8gZXhpdDsKLQotICAgIGlmICghZHJhd0Nv
bnRleHQpIHsKLSAgICAgICAgOjpEZWxldGVPYmplY3QoaGJtcCk7Ci0gICAgICAgIGhibXAgPSAw
OwotICAgIH0KLQotICAgIENHSW1hZ2VSZWYgc3JjSW1hZ2UgPSBpbWctPmdldENHSW1hZ2VSZWYo
KTsKLSAgICBDR1JlY3QgcmVjdDsKLSAgICByZWN0LnNpemUgPSBpbWctPnNpemUoKTsKLSAgICBy
ZWN0Lm9yaWdpbi54ID0gMDsKLSAgICByZWN0Lm9yaWdpbi55ID0gLXJlY3Quc2l6ZS5oZWlnaHQ7
Ci0gICAgc3RhdGljIGNvbnN0IENHRmxvYXQgd2hpdGUgW10gPSB7MS4wLCAxLjAsIDEuMCwgMS4w
fTsKLSAgICBDR0NvbnRleHRTY2FsZUNUTShkcmF3Q29udGV4dCwgMSwgLTEpOwotICAgIENHQ29u
dGV4dFNldEZpbGxDb2xvcihkcmF3Q29udGV4dCwgd2hpdGUpOwotICAgIENHQ29udGV4dEZpbGxS
ZWN0KGRyYXdDb250ZXh0LCByZWN0KTsKLSAgICBDR0NvbnRleHRTZXRCbGVuZE1vZGUoZHJhd0Nv
bnRleHQsIGtDR0JsZW5kTW9kZU5vcm1hbCk7Ci0gICAgQ0dDb250ZXh0RHJhd0ltYWdlKGRyYXdD
b250ZXh0LCByZWN0LCBzcmNJbWFnZSk7Ci0gICAgQ0dDb250ZXh0UmVsZWFzZShkcmF3Q29udGV4
dCk7Ci0KLWV4aXQ6Ci0gICAgaWYgKHdvcmtpbmdEQykKLSAgICAgICAgRGVsZXRlREMod29ya2lu
Z0RDKTsKLSAgICBSZWxlYXNlREMoMCwgZGMpOwotICAgIHJldHVybiBoYm1wOwotfQotICAgIAog
RHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUljb25Gb3JDYWNoZWRJbWFnZShDYWNoZWRJbWFn
ZSopCiB7CiAgICAgLy9GSVhNRTogUHJvdmlkZSBpY29uIGZvciBpbWFnZSB0eXBlIDxyZGFyOi8v
cHJvYmxlbS81MDE1OTQ5Pgo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>18976</attachid>
            <date>2008-02-06 17:42:42 -0800</date>
            <delta_ts>2008-02-06 17:42:42 -0800</delta_ts>
            <desc>Try #11 -- redo &apos;svn cp&apos; events to allow clean patch.</desc>
            <filename>webcore_win32.patch</filename>
            <type>text/plain</type>
            <size>210188</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAzMDA1MykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNzcgQEAKKzIwMDgtMDItMDYgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBnbWFp
bC5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
V0FSTklORzogTk8gVEVTVCBDQVNFUyBBRERFRCBPUiBDSEFOR0VECisKKyAgICAgICAgKiBXZWJD
b3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvajoKKyAgICAgICAgKiBicmlkZ2Uvd2luL0ZyYW1lQ0dX
aW4uY3BwOiBDb3BpZWQgZnJvbSBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVXaW4uY3BwLgorICAg
ICAgICAoV2ViQ29yZTo6aW1hZ2VGcm9tU2VsZWN0aW9uKToKKyAgICAgICAgKiBicmlkZ2Uvd2lu
L0ZyYW1lQ2Fpcm9XaW4uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OmltYWdlRnJvbVNl
bGVjdGlvbik6CisgICAgICAgICogYnJpZGdlL3dpbi9GcmFtZVdpbi5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpjb21wdXRlUGFnZVJlY3RzRm9yRnJhbWUpOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL1NpbXBsZUZvbnREYXRhLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2Fp
cm8vR3JhcGhpY3NDb250ZXh0Q2Fpcm8uY3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L2NhaXJvL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZUNhaXJvLmg6IENvcGllZCBmcm9t
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhpY3NDb250ZXh0Q2Fpcm8uY3Bw
LgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpHcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlOjp+R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6YmVnaW5U
cmFuc3BhcmVuY3lMYXllcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGU6OmVuZFRyYW5zcGFyZW5jeUxheWVyKToKKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHRDRy5jcHA6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQ6OnNhdmVQbGF0Zm9ybVN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dDo6cmVzdG9yZVBsYXRmb3JtU3RhdGUpOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL2NnL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZS5oOiBSZW1vdmVkLgorICAg
ICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2NnL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0
ZUNHLmg6IENvcGllZCBmcm9tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvR3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlLmguCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0ZvbnRDR1dpbi5jcHA6IENvcGllZCBmcm9tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0ZvbnRXaW4uY3BwLgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZHJhd0dseXBocyk6CisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0ZvbnRDYWlyb1dpbi5jcHA6IEFkZGVkLgorICAg
ICAgICAoV2ViQ29yZTo6Rm9udDo6ZHJhd0dseXBocyk6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL0ZvbnRXaW4uY3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9H
cmFwaGljc0NvbnRleHRDR1dpbi5jcHA6IENvcGllZCBmcm9tIFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dFdpbi5jcHAuCisgICAgICAgIChXZWJDb3JlOjpDR0Nv
bnRleHRXaXRoSERDKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6aW5UcmFu
c3BhcmVuY3lMYXllcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmdldFdp
bmRvd3NDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6cmVsZWFz
ZVdpbmRvd3NDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dFBsYXRm
b3JtUHJpdmF0ZTo6c2NhbGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0UGxh
dGZvcm1Qcml2YXRlOjpyb3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlOjp0cmFuc2xhdGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlOjpjb25jYXRDVE0pOgorICAgICAgICAoV2ViQ29yZTo6c2V0
Q0dTdHJva2VDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmRyYXdM
aW5lRm9yTWlzc3BlbGxpbmdPckJhZEdyYW1tYXIpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBo
aWNzL3dpbi9HcmFwaGljc0NvbnRleHRDYWlyb1dpbi5jcHA6IEFkZGVkLgorICAgICAgICAoV2Vi
Q29yZTo6R3JhcGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRleHQpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0OjpnZXRXaW5kb3dzQ29udGV4dCk6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQ6OmluVHJhbnNwYXJlbmN5TGF5ZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0OjpyZWxlYXNlV2luZG93c0NvbnRleHQpOgorICAgICAgICAoV2Vi
Q29yZTo6R3JhcGhpY3NDb250ZXh0Ojpjb25jYXRDVE0pOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRXaW4uY3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL3dpbi9JbWFnZUNHV2luLmNwcDogQ29waWVkIGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW4vSW1hZ2VXaW4uY3BwLgorICAgICAgICAoV2ViQ29yZTo6Qml0bWFwSW1hZ2U6
OmdldEhCSVRNQVBPZlNpemUpOgorICAgICAgICAoV2ViQ29yZTo6Qml0bWFwSW1hZ2U6OmRyYXdG
cmFtZU1hdGNoaW5nU291cmNlU2l6ZSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0ltYWdlQ2Fpcm9XaW4uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdl
OjpnZXRIQklUTUFQT2ZTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdlOjpkcmF3
RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bi9JbWFnZVdpbi5jcHA6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZv
bnREYXRhQ0dXaW4uY3BwOiBDb3BpZWQgZnJvbSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bi9TaW1wbGVGb250RGF0YVdpbi5jcHAuCisgICAgICAgIChXZWJDb3JlOjpzY2FsZUVtVG9Vbml0
cyk6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KToKKyAg
ICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybVdpZHRoRm9yR2x5cGgpOgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNhaXJvV2luLmNw
cDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0
KToKKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3kpOgor
ICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnBsYXRmb3JtV2lkdGhGb3JHbHlwaCk6
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhV2luLmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpzZXRTaG91bGRBcHBseU1hY0FzY2Vu
dEhhY2spOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnNob3VsZEFwcGx5TWFj
QXNjZW50SGFjayk6CisgICAgICAgICogcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNHV2luLmNwcDog
Q29waWVkIGZyb20gV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlV2luLmNwcC4KKyAgICAg
ICAgKFdlYkNvcmU6OnNjYWxlRHJhZ0ltYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OmNyZWF0ZURy
YWdJbWFnZUZyb21JbWFnZSk6CisgICAgICAgICogcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNhaXJv
V2luLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpzY2FsZURyYWdJbWFnZSk6CisgICAg
ICAgIChXZWJDb3JlOjpjcmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2UpOgorICAgICAgICAqIHBsYXRm
b3JtL3dpbi9EcmFnSW1hZ2VXaW4uY3BwOgorCiAyMDA4LTAyLTA2ICBPbGl2ZXIgSHVudCAgPG9s
aXZlckBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChCdWlsZCBmaXgp
LgpJbmRleDogV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvago9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCShyZXZpc2lvbiAzMDA1
NSkKKysrIFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHdvcmtpbmcgY29w
eSkKQEAgLTM0MTgsNiArMzQxOCwxMCBAQAogCQkJCQk+DQogCQkJCTwvRmlsZT4NCiAJCQkJPEZp
bGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cd2luXERyYWdJbWFnZUNHV2luLmNw
cCINCisJCQkJCT4NCisJCQkJPC9GaWxlPg0KKwkJCQk8RmlsZQ0KIAkJCQkJUmVsYXRpdmVQYXRo
PSIuLlxwbGF0Zm9ybVx3aW5cRHJhZ0ltYWdlV2luLmNwcCINCiAJCQkJCT4NCiAJCQkJPC9GaWxl
Pg0KQEAgLTM4NzYsNiArMzg4MCwxMCBAQAogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KIAkJCQkJ
PEZpbGUNCisJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxGb250
Q0dXaW4uY3BwIg0KKwkJCQkJCT4NCisJCQkJCTwvRmlsZT4NCisJCQkJCTxGaWxlDQogCQkJCQkJ
UmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1x3aW5cRm9udEN1c3RvbVBsYXRmb3Jt
RGF0YS5jcHAiDQogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KQEAgLTM5MzIsNiArMzk0MCwxMCBA
QAogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KIAkJCQkJPEZpbGUNCisJCQkJCQlSZWxhdGl2ZVBh
dGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxHcmFwaGljc0NvbnRleHRDR1dpbi5jcHAiDQor
CQkJCQkJPg0KKwkJCQkJPC9GaWxlPg0KKwkJCQkJPEZpbGUNCiAJCQkJCQlSZWxhdGl2ZVBhdGg9
Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxHcmFwaGljc0NvbnRleHRXaW4uY3BwIg0KIAkJCQkJ
CT4NCiAJCQkJCTwvRmlsZT4NCkBAIC0zOTQwLDYgKzM5NTIsMTAgQEAKIAkJCQkJCT4NCiAJCQkJ
CTwvRmlsZT4NCiAJCQkJCTxGaWxlDQorCQkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxn
cmFwaGljc1x3aW5cSW1hZ2VDR1dpbi5jcHAiDQorCQkJCQkJPg0KKwkJCQkJPC9GaWxlPg0KKwkJ
CQkJPEZpbGUNCiAJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxJ
bWFnZVdpbi5jcHAiDQogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KQEAgLTM5NjQsNiArMzk4MCwx
MCBAQAogCQkJCQkJPg0KIAkJCQkJPC9GaWxlPg0KIAkJCQkJPEZpbGUNCisJCQkJCQlSZWxhdGl2
ZVBhdGg9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpblxTaW1wbGVGb250RGF0YUNHV2luLmNwcCIN
CisJCQkJCQk+DQorCQkJCQk8L0ZpbGU+DQorCQkJCQk8RmlsZQ0KIAkJCQkJCVJlbGF0aXZlUGF0
aD0iLi5ccGxhdGZvcm1cZ3JhcGhpY3Ncd2luXFNpbXBsZUZvbnREYXRhV2luLmNwcCINCiAJCQkJ
CQk+DQogCQkJCQk8L0ZpbGU+DQpAQCAtNjQwOCw2ICs2NDI4LDEwIEBACiAJCQkJTmFtZT0id2lu
Ig0KIAkJCQk+DQogCQkJCTxGaWxlDQorCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGJyaWRnZVx3aW5c
RnJhbWVDR1dpbi5jcHAiDQorCQkJCQk+DQorCQkJCTwvRmlsZT4NCisJCQkJPEZpbGUNCiAJCQkJ
CVJlbGF0aXZlUGF0aD0iLi5cYnJpZGdlXHdpblxGcmFtZVdpbi5jcHAiDQogCQkJCQk+DQogCQkJ
CTwvRmlsZT4NCkluZGV4OiBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVDR1dpbi5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lQ0dXaW4uY3BwCShyZXZpc2lvbiAzMDA0
OCkJKGZyb20gV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lV2luLmNwcDozMDA0OCkKKysrIFdlYkNv
cmUvYnJpZGdlL3dpbi9GcmFtZUNHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE5
NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJGcmFt
ZVdpbi5oIgorCisjaW5jbHVkZSA8d2luc29jazIuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisK
KyNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNp
bmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkVkaXRvckNsaWVudC5oIgorI2luY2x1ZGUg
IkZyYW1lTG9hZGVyLmgiCisjaW5jbHVkZSAiRnJhbWVMb2FkUmVxdWVzdC5oIgorI2luY2x1ZGUg
IkZyYW1lUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhUTUxJ
RnJhbWVFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCisjaW5jbHVkZSAiSFRNTFRh
YmxlQ2VsbEVsZW1lbnQuaCIKKyNpbmNsdWRlICJLZXlib2FyZEV2ZW50LmgiCisjaW5jbHVkZSAi
TlBfanNvYmplY3QuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlBh
Z2UuaCIKKyNpbmNsdWRlICJQbHVnaW4uaCIKKyNpbmNsdWRlICJQbHVnaW5EYXRhYmFzZS5oIgor
I2luY2x1ZGUgIlBsdWdpblZpZXcuaCIKKyNpbmNsdWRlICJSZWd1bGFyRXhwcmVzc2lvbi5oIgor
I2luY2x1ZGUgIlJlbmRlckZyYW1lLmgiCisjaW5jbHVkZSAiUmVuZGVyVGFibGVDZWxsLmgiCisj
aW5jbHVkZSAiUmVuZGVyVmlldy5oIgorI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlLmgiCisjaW5j
bHVkZSAiVGV4dFJlc291cmNlRGVjb2Rlci5oIgorI2luY2x1ZGUgImtqc19wcm94eS5oIgorI2lu
Y2x1ZGUgImtqc193aW5kb3cuaCIKKyNpbmNsdWRlICJucHJ1bnRpbWVfaW1wbC5oIgorI2luY2x1
ZGUgInJ1bnRpbWVfcm9vdC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1
ZGUgIlNldHRpbmdzLmgiCisKKyNpZiBQTEFURk9STShDRykKKyNpbmNsdWRlIDxDb3JlR3JhcGhp
Y3MvQ29yZUdyYXBoaWNzLmg+CisjZW5kaWYKKwordXNpbmcgc3RkOjptaW47Cit1c2luZyBuYW1l
c3BhY2UgS0pTOjpCaW5kaW5nczsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit1c2luZyBuYW1l
c3BhY2UgSFRNTE5hbWVzOworCit2b2lkIEZyYW1lOjpjbGVhclBsYXRmb3JtU2NyaXB0T2JqZWN0
cygpCit7Cit9CisKK0tKUzo6QmluZGluZ3M6Okluc3RhbmNlKiBGcmFtZTo6Y3JlYXRlU2NyaXB0
SW5zdGFuY2VGb3JXaWRnZXQoV2lkZ2V0KiB3aWRnZXQpCit7CisgICAgLy8gRklYTUU6IElkZWFs
bHkgd2UnZCBoYXZlIGFuIGlzUGx1Z2luVmlldygpIGhlcmUgYnV0IHdlIGNhbid0IGFkZCB0aGF0
IHRvIHRoZSBvcGVuIHNvdXJjZSB0cmVlIHJpZ2h0IG5vdy4KKyAgICBpZiAod2lkZ2V0LT5pc0Zy
YW1lVmlldygpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQ
bHVnaW5WaWV3Kj4od2lkZ2V0KS0+YmluZGluZ0luc3RhbmNlKCk7Cit9CisKKwordm9pZCBjb21w
dXRlUGFnZVJlY3RzRm9yRnJhbWUoRnJhbWUqIGZyYW1lLCBjb25zdCBJbnRSZWN0JiBwcmludFJl
Y3QsIGZsb2F0IGhlYWRlckhlaWdodCwgZmxvYXQgZm9vdGVySGVpZ2h0LCBmbG9hdCB1c2VyU2Nh
bGVGYWN0b3IsVmVjdG9yPEludFJlY3Q+JiBwYWdlcywgaW50JiBvdXRQYWdlSGVpZ2h0KQorewor
ICAgIEFTU0VSVChmcmFtZSk7CisKKyAgICBwYWdlcy5jbGVhcigpOworICAgIG91dFBhZ2VIZWln
aHQgPSAwOworCisgICAgaWYgKCFmcmFtZS0+ZG9jdW1lbnQoKSB8fCAhZnJhbWUtPnZpZXcoKSB8
fCAhZnJhbWUtPmRvY3VtZW50KCktPnJlbmRlcmVyKCkpCisgICAgICAgIHJldHVybjsKKyAKKyAg
ICBSZW5kZXJWaWV3KiByb290ID0gc3RhdGljX2Nhc3Q8UmVuZGVyVmlldyAqPihmcmFtZS0+ZG9j
dW1lbnQoKS0+cmVuZGVyZXIoKSk7CisKKyAgICBpZiAoIXJvb3QpIHsKKyAgICAgICAgTE9HX0VS
Uk9SKCJkb2N1bWVudCB0byBiZSBwcmludGVkIGhhcyBubyByZW5kZXJlciIpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgaWYgKHVzZXJTY2FsZUZhY3RvciA8PSAwKSB7CisgICAgICAg
IExPR19FUlJPUigidXNlclNjYWxlRmFjdG9yIGhhcyBiYWQgdmFsdWUgJS4yZiIsIHVzZXJTY2Fs
ZUZhY3Rvcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgZmxvYXQgcmF0aW8g
PSAoZmxvYXQpcHJpbnRSZWN0LmhlaWdodCgpIC8gKGZsb2F0KXByaW50UmVjdC53aWR0aCgpOwor
IAorICAgIGZsb2F0IHBhZ2VXaWR0aCAgPSAoZmxvYXQpIHJvb3QtPmRvY1dpZHRoKCk7CisgICAg
ZmxvYXQgcGFnZUhlaWdodCA9IHBhZ2VXaWR0aCAqIHJhdGlvOworICAgIG91dFBhZ2VIZWlnaHQg
PSAoaW50KSBwYWdlSGVpZ2h0OyAgIC8vIHRoaXMgaXMgdGhlIGhlaWdodCBvZiB0aGUgcGFnZSBh
ZGp1c3RlZCBieSBtYXJnaW5zCisgICAgcGFnZUhlaWdodCAtPSAoaGVhZGVySGVpZ2h0ICsgZm9v
dGVySGVpZ2h0KTsKKworICAgIGlmIChwYWdlSGVpZ2h0IDw9IDApIHsKKyAgICAgICAgTE9HX0VS
Uk9SKCJwYWdlSGVpZ2h0IGhhcyBiYWQgdmFsdWUgJS4yZiIsIHBhZ2VIZWlnaHQpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgZmxvYXQgY3VyclBhZ2VIZWlnaHQgPSBwYWdlSGVpZ2h0
IC8gdXNlclNjYWxlRmFjdG9yOworICAgIGZsb2F0IGRvY0hlaWdodCAgICAgID0gcm9vdC0+bGF5
ZXIoKS0+aGVpZ2h0KCk7CisgICAgZmxvYXQgZG9jV2lkdGggICAgICAgPSByb290LT5sYXllcigp
LT53aWR0aCgpOworICAgIGZsb2F0IGN1cnJQYWdlV2lkdGggID0gcGFnZVdpZHRoIC8gdXNlclNj
YWxlRmFjdG9yOworCisgICAgCisgICAgLy8gYWx3YXlzIHJldHVybiBhdCBsZWFzdCBvbmUgcGFn
ZSwgc2luY2UgZW1wdHkgZmlsZXMgc2hvdWxkIHByaW50IGEgYmxhbmsgcGFnZQorICAgIGZsb2F0
IHByaW50ZWRQYWdlc0hlaWdodCA9IDAuMDsKKyAgICBkbyB7CisgICAgICAgIGZsb2F0IHByb3Bv
c2VkQm90dG9tID0gbWluKGRvY0hlaWdodCwgcHJpbnRlZFBhZ2VzSGVpZ2h0ICsgcGFnZUhlaWdo
dCk7CisgICAgICAgIGZyYW1lLT5hZGp1c3RQYWdlSGVpZ2h0KCZwcm9wb3NlZEJvdHRvbSwgcHJp
bnRlZFBhZ2VzSGVpZ2h0LCBwcm9wb3NlZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0KTsKKyAg
ICAgICAgY3VyclBhZ2VIZWlnaHQgPSBtYXgoMS4wZiwgcHJvcG9zZWRCb3R0b20gLSBwcmludGVk
UGFnZXNIZWlnaHQpOworICAgICAgIAorICAgICAgICBwYWdlcy5hcHBlbmQoSW50UmVjdCgwLHBy
aW50ZWRQYWdlc0hlaWdodCxjdXJyUGFnZVdpZHRoLGN1cnJQYWdlSGVpZ2h0KSk7CisgICAgICAg
IHByaW50ZWRQYWdlc0hlaWdodCArPSBjdXJyUGFnZUhlaWdodDsKKyAgICB9IHdoaWxlIChwcmlu
dGVkUGFnZXNIZWlnaHQgPCBkb2NIZWlnaHQpOworfQorCitzdGF0aWMgdm9pZCBkcmF3UmVjdElu
dG9Db250ZXh0KEludFJlY3QgcmVjdCwgRnJhbWVWaWV3KiB2aWV3LCBHcmFwaGljc0NvbnRleHQq
IGdjKQoreworICAgIEludFNpemUgb2Zmc2V0ID0gdmlldy0+c2Nyb2xsT2Zmc2V0KCk7CisgICAg
cmVjdC5tb3ZlKC1vZmZzZXQud2lkdGgoKSwgLW9mZnNldC5oZWlnaHQoKSk7CisgICAgcmVjdCA9
IHZpZXctPmNvbnZlcnRUb0NvbnRhaW5pbmdXaW5kb3cocmVjdCk7CisKKyAgICBnYy0+Y29uY2F0
Q1RNKEFmZmluZVRyYW5zZm9ybSgpLnRyYW5zbGF0ZSgtcmVjdC54KCksIC1yZWN0LnkoKSkpOwor
CisgICAgdmlldy0+cGFpbnQoZ2MsIHJlY3QpOworfQorCitIQklUTUFQIGltYWdlRnJvbVNlbGVj
dGlvbihGcmFtZSogZnJhbWUsIGJvb2wgZm9yY2VCbGFja1RleHQpCit7CisgICAgZnJhbWUtPnNl
dFBhaW50UmVzdHJpY3Rpb24oZm9yY2VCbGFja1RleHQgPyBQYWludFJlc3RyaWN0aW9uU2VsZWN0
aW9uT25seUJsYWNrVGV4dCA6IFBhaW50UmVzdHJpY3Rpb25TZWxlY3Rpb25Pbmx5KTsKKyAgICBG
bG9hdFJlY3QgZnIgPSBmcmFtZS0+c2VsZWN0aW9uUmVjdCgpOworICAgIEludFJlY3QgaXIoKGlu
dClmci54KCksIChpbnQpZnIueSgpLChpbnQpZnIud2lkdGgoKSwoaW50KWZyLmhlaWdodCgpKTsK
KworICAgIHZvaWQqIGJpdHM7CisgICAgSERDIGhkYyA9IENyZWF0ZUNvbXBhdGlibGVEQygwKTsK
KyAgICBpbnQgdyA9IGlyLndpZHRoKCk7CisgICAgaW50IGggPSBpci5oZWlnaHQoKTsKKyAgICBC
SVRNQVBJTkZPIGJtcCA9IHsgeyBzaXplb2YoQklUTUFQSU5GT0hFQURFUiksIHcsIGgsIDEsIDMy
IH0gfTsKKworICAgIEhCSVRNQVAgaGJtcCA9IENyZWF0ZURJQlNlY3Rpb24oMCwgJmJtcCwgRElC
X1JHQl9DT0xPUlMsICh2b2lkKiopJmJpdHMsIDAsIDApOworICAgIEhCSVRNQVAgaGJtcE9sZCA9
IChIQklUTUFQKVNlbGVjdE9iamVjdChoZGMsIGhibXApOworICAgIENHQ29sb3JTcGFjZVJlZiBk
ZXZpY2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKKyAgICBDR0NvbnRleHRS
ZWYgY29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZSgodm9pZCopYml0cywgdywgaCwKKyAg
ICAgICAgOCwgdyAqIHNpemVvZihSR0JRVUFEKSwgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3Jk
ZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFQcmVtdWx0aXBsaWVkRmlyc3QpOworICAgIENHQ29s
b3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKKyAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNvbnRl
eHQpOworCisgICAgR3JhcGhpY3NDb250ZXh0IGdjKGNvbnRleHQpOworCisgICAgZnJhbWUtPmRv
Y3VtZW50KCktPnVwZGF0ZUxheW91dCgpOworICAgIGRyYXdSZWN0SW50b0NvbnRleHQoaXIsIGZy
YW1lLT52aWV3KCksICZnYyk7CisKKyAgICBDR0NvbnRleHRSZWxlYXNlKGNvbnRleHQpOworICAg
IFNlbGVjdE9iamVjdChoZGMsIGhibXBPbGQpOworICAgIERlbGV0ZURDKGhkYyk7CisKKyAgICBm
cmFtZS0+c2V0UGFpbnRSZXN0cmljdGlvbihQYWludFJlc3RyaWN0aW9uTm9uZSk7CisKKyAgICBy
ZXR1cm4gaGJtcDsKK30KKworRHJhZ0ltYWdlUmVmIEZyYW1lOjpkcmFnSW1hZ2VGb3JTZWxlY3Rp
b24oKQoreyAgICAKKyAgICBpZiAoc2VsZWN0aW9uQ29udHJvbGxlcigpLT5pc1JhbmdlKCkpCisg
ICAgICAgIHJldHVybiBpbWFnZUZyb21TZWxlY3Rpb24odGhpcywgZmFsc2UpOworCisgICAgcmV0
dXJuIDA7Cit9CisKK3ZvaWQgRnJhbWU6OmRhc2hib2FyZFJlZ2lvbnNDaGFuZ2VkKCkKK3sKK30K
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1l
Q0dXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZUNHV2luLmNw
cAkocmV2aXNpb24gMzAwNDgpCisrKyBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVDR1dpbi5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2
LCAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykg
MjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI2LDExNyArMjYsMTggQEAKICNpbmNsdWRlICJj
b25maWcuaCIKICNpbmNsdWRlICJGcmFtZVdpbi5oIgogCi0jaW5jbHVkZSA8d2luc29jazIuaD4K
ICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAKLSNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKLSNp
bmNsdWRlICJGbG9hdFJlY3QuaCIKLSNpbmNsdWRlICJEb2N1bWVudC5oIgotI2luY2x1ZGUgIkVk
aXRvckNsaWVudC5oIgotI2luY2x1ZGUgIkZyYW1lTG9hZGVyLmgiCi0jaW5jbHVkZSAiRnJhbWVM
b2FkUmVxdWVzdC5oIgotI2luY2x1ZGUgIkZyYW1lUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkZyYW1l
Vmlldy5oIgotI2luY2x1ZGUgIkhUTUxJRnJhbWVFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTE5h
bWVzLmgiCi0jaW5jbHVkZSAiSFRNTFRhYmxlQ2VsbEVsZW1lbnQuaCIKLSNpbmNsdWRlICJLZXli
b2FyZEV2ZW50LmgiCi0jaW5jbHVkZSAiTlBfanNvYmplY3QuaCIKLSNpbmNsdWRlICJOb3RJbXBs
ZW1lbnRlZC5oIgotI2luY2x1ZGUgIlBhZ2UuaCIKLSNpbmNsdWRlICJQbHVnaW4uaCIKLSNpbmNs
dWRlICJQbHVnaW5EYXRhYmFzZS5oIgotI2luY2x1ZGUgIlBsdWdpblZpZXcuaCIKLSNpbmNsdWRl
ICJSZWd1bGFyRXhwcmVzc2lvbi5oIgotI2luY2x1ZGUgIlJlbmRlckZyYW1lLmgiCi0jaW5jbHVk
ZSAiUmVuZGVyVGFibGVDZWxsLmgiCi0jaW5jbHVkZSAiUmVuZGVyVmlldy5oIgotI2luY2x1ZGUg
IlJlc291cmNlSGFuZGxlLmgiCi0jaW5jbHVkZSAiVGV4dFJlc291cmNlRGVjb2Rlci5oIgotI2lu
Y2x1ZGUgImtqc19wcm94eS5oIgotI2luY2x1ZGUgImtqc193aW5kb3cuaCIKLSNpbmNsdWRlICJu
cHJ1bnRpbWVfaW1wbC5oIgotI2luY2x1ZGUgInJ1bnRpbWVfcm9vdC5oIgogI2luY2x1ZGUgIkdy
YXBoaWNzQ29udGV4dC5oIgogI2luY2x1ZGUgIlNldHRpbmdzLmgiCiAKLSNpZiBQTEFURk9STShD
RykKICNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ29yZUdyYXBoaWNzLmg+Ci0jZW5kaWYKIAogdXNp
bmcgc3RkOjptaW47Ci11c2luZyBuYW1lc3BhY2UgS0pTOjpCaW5kaW5nczsKIAogbmFtZXNwYWNl
IFdlYkNvcmUgewogCi11c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwotCi12b2lkIEZyYW1lOjpj
bGVhclBsYXRmb3JtU2NyaXB0T2JqZWN0cygpCi17Ci19Ci0KLUtKUzo6QmluZGluZ3M6Okluc3Rh
bmNlKiBGcmFtZTo6Y3JlYXRlU2NyaXB0SW5zdGFuY2VGb3JXaWRnZXQoV2lkZ2V0KiB3aWRnZXQp
Ci17Ci0gICAgLy8gRklYTUU6IElkZWFsbHkgd2UnZCBoYXZlIGFuIGlzUGx1Z2luVmlldygpIGhl
cmUgYnV0IHdlIGNhbid0IGFkZCB0aGF0IHRvIHRoZSBvcGVuIHNvdXJjZSB0cmVlIHJpZ2h0IG5v
dy4KLSAgICBpZiAod2lkZ2V0LT5pc0ZyYW1lVmlldygpKQotICAgICAgICByZXR1cm4gMDsKLQot
ICAgIHJldHVybiBzdGF0aWNfY2FzdDxQbHVnaW5WaWV3Kj4od2lkZ2V0KS0+YmluZGluZ0luc3Rh
bmNlKCk7Ci19Ci0KLQotdm9pZCBjb21wdXRlUGFnZVJlY3RzRm9yRnJhbWUoRnJhbWUqIGZyYW1l
LCBjb25zdCBJbnRSZWN0JiBwcmludFJlY3QsIGZsb2F0IGhlYWRlckhlaWdodCwgZmxvYXQgZm9v
dGVySGVpZ2h0LCBmbG9hdCB1c2VyU2NhbGVGYWN0b3IsVmVjdG9yPEludFJlY3Q+JiBwYWdlcywg
aW50JiBvdXRQYWdlSGVpZ2h0KQotewotICAgIEFTU0VSVChmcmFtZSk7Ci0KLSAgICBwYWdlcy5j
bGVhcigpOwotICAgIG91dFBhZ2VIZWlnaHQgPSAwOwotCi0gICAgaWYgKCFmcmFtZS0+ZG9jdW1l
bnQoKSB8fCAhZnJhbWUtPnZpZXcoKSB8fCAhZnJhbWUtPmRvY3VtZW50KCktPnJlbmRlcmVyKCkp
Ci0gICAgICAgIHJldHVybjsKLSAKLSAgICBSZW5kZXJWaWV3KiByb290ID0gc3RhdGljX2Nhc3Q8
UmVuZGVyVmlldyAqPihmcmFtZS0+ZG9jdW1lbnQoKS0+cmVuZGVyZXIoKSk7Ci0KLSAgICBpZiAo
IXJvb3QpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJkb2N1bWVudCB0byBiZSBwcmludGVkIGhhcyBu
byByZW5kZXJlciIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHVzZXJTY2Fs
ZUZhY3RvciA8PSAwKSB7Ci0gICAgICAgIExPR19FUlJPUigidXNlclNjYWxlRmFjdG9yIGhhcyBi
YWQgdmFsdWUgJS4yZiIsIHVzZXJTY2FsZUZhY3Rvcik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0gICAgCi0gICAgZmxvYXQgcmF0aW8gPSAoZmxvYXQpcHJpbnRSZWN0LmhlaWdodCgpIC8gKGZs
b2F0KXByaW50UmVjdC53aWR0aCgpOwotIAotICAgIGZsb2F0IHBhZ2VXaWR0aCAgPSAoZmxvYXQp
IHJvb3QtPmRvY1dpZHRoKCk7Ci0gICAgZmxvYXQgcGFnZUhlaWdodCA9IHBhZ2VXaWR0aCAqIHJh
dGlvOwotICAgIG91dFBhZ2VIZWlnaHQgPSAoaW50KSBwYWdlSGVpZ2h0OyAgIC8vIHRoaXMgaXMg
dGhlIGhlaWdodCBvZiB0aGUgcGFnZSBhZGp1c3RlZCBieSBtYXJnaW5zCi0gICAgcGFnZUhlaWdo
dCAtPSAoaGVhZGVySGVpZ2h0ICsgZm9vdGVySGVpZ2h0KTsKLQotICAgIGlmIChwYWdlSGVpZ2h0
IDw9IDApIHsKLSAgICAgICAgTE9HX0VSUk9SKCJwYWdlSGVpZ2h0IGhhcyBiYWQgdmFsdWUgJS4y
ZiIsIHBhZ2VIZWlnaHQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZmxvYXQgY3Vy
clBhZ2VIZWlnaHQgPSBwYWdlSGVpZ2h0IC8gdXNlclNjYWxlRmFjdG9yOwotICAgIGZsb2F0IGRv
Y0hlaWdodCAgICAgID0gcm9vdC0+bGF5ZXIoKS0+aGVpZ2h0KCk7Ci0gICAgZmxvYXQgZG9jV2lk
dGggICAgICAgPSByb290LT5sYXllcigpLT53aWR0aCgpOwotICAgIGZsb2F0IGN1cnJQYWdlV2lk
dGggID0gcGFnZVdpZHRoIC8gdXNlclNjYWxlRmFjdG9yOwotCi0gICAgCi0gICAgLy8gYWx3YXlz
IHJldHVybiBhdCBsZWFzdCBvbmUgcGFnZSwgc2luY2UgZW1wdHkgZmlsZXMgc2hvdWxkIHByaW50
IGEgYmxhbmsgcGFnZQotICAgIGZsb2F0IHByaW50ZWRQYWdlc0hlaWdodCA9IDAuMDsKLSAgICBk
byB7Ci0gICAgICAgIGZsb2F0IHByb3Bvc2VkQm90dG9tID0gbWluKGRvY0hlaWdodCwgcHJpbnRl
ZFBhZ2VzSGVpZ2h0ICsgcGFnZUhlaWdodCk7Ci0gICAgICAgIGZyYW1lLT5hZGp1c3RQYWdlSGVp
Z2h0KCZwcm9wb3NlZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0LCBwcm9wb3NlZEJvdHRvbSwg
cHJpbnRlZFBhZ2VzSGVpZ2h0KTsKLSAgICAgICAgY3VyclBhZ2VIZWlnaHQgPSBtYXgoMS4wZiwg
cHJvcG9zZWRCb3R0b20gLSBwcmludGVkUGFnZXNIZWlnaHQpOwotICAgICAgIAotICAgICAgICBw
YWdlcy5hcHBlbmQoSW50UmVjdCgwLHByaW50ZWRQYWdlc0hlaWdodCxjdXJyUGFnZVdpZHRoLGN1
cnJQYWdlSGVpZ2h0KSk7Ci0gICAgICAgIHByaW50ZWRQYWdlc0hlaWdodCArPSBjdXJyUGFnZUhl
aWdodDsKLSAgICB9IHdoaWxlIChwcmludGVkUGFnZXNIZWlnaHQgPCBkb2NIZWlnaHQpOwotfQot
CiBzdGF0aWMgdm9pZCBkcmF3UmVjdEludG9Db250ZXh0KEludFJlY3QgcmVjdCwgRnJhbWVWaWV3
KiB2aWV3LCBHcmFwaGljc0NvbnRleHQqIGdjKQogewogICAgIEludFNpemUgb2Zmc2V0ID0gdmll
dy0+c2Nyb2xsT2Zmc2V0KCk7CkBAIC0xNTIsNyArNTMsOCBAQCBIQklUTUFQIGltYWdlRnJvbVNl
bGVjdGlvbihGcmFtZSogZnJhbWUsCiB7CiAgICAgZnJhbWUtPnNldFBhaW50UmVzdHJpY3Rpb24o
Zm9yY2VCbGFja1RleHQgPyBQYWludFJlc3RyaWN0aW9uU2VsZWN0aW9uT25seUJsYWNrVGV4dCA6
IFBhaW50UmVzdHJpY3Rpb25TZWxlY3Rpb25Pbmx5KTsKICAgICBGbG9hdFJlY3QgZnIgPSBmcmFt
ZS0+c2VsZWN0aW9uUmVjdCgpOwotICAgIEludFJlY3QgaXIoKGludClmci54KCksIChpbnQpZnIu
eSgpLChpbnQpZnIud2lkdGgoKSwoaW50KWZyLmhlaWdodCgpKTsKKyAgICBJbnRSZWN0IGlyKHN0
YXRpY19jYXN0PGludD4oZnIueCgpKSwgc3RhdGljX2Nhc3Q8aW50Pihmci55KCkpLAorICAgICAg
ICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pihmci53aWR0aCgpKSwgc3RhdGljX2Nhc3Q8aW50Pihm
ci5oZWlnaHQoKSkpOwogCiAgICAgdm9pZCogYml0czsKICAgICBIREMgaGRjID0gQ3JlYXRlQ29t
cGF0aWJsZURDKDApOwpAQCAtMTYwLDEwICs2MiwxMCBAQCBIQklUTUFQIGltYWdlRnJvbVNlbGVj
dGlvbihGcmFtZSogZnJhbWUsCiAgICAgaW50IGggPSBpci5oZWlnaHQoKTsKICAgICBCSVRNQVBJ
TkZPIGJtcCA9IHsgeyBzaXplb2YoQklUTUFQSU5GT0hFQURFUiksIHcsIGgsIDEsIDMyIH0gfTsK
IAotICAgIEhCSVRNQVAgaGJtcCA9IENyZWF0ZURJQlNlY3Rpb24oMCwgJmJtcCwgRElCX1JHQl9D
T0xPUlMsICh2b2lkKiopJmJpdHMsIDAsIDApOwotICAgIEhCSVRNQVAgaGJtcE9sZCA9IChIQklU
TUFQKVNlbGVjdE9iamVjdChoZGMsIGhibXApOworICAgIEhCSVRNQVAgaGJtcCA9IENyZWF0ZURJ
QlNlY3Rpb24oMCwgJmJtcCwgRElCX1JHQl9DT0xPUlMsIHN0YXRpY19jYXN0PHZvaWQqKj4oJmJp
dHMpLCAwLCAwKTsKKyAgICBIQklUTUFQIGhibXBPbGQgPSBzdGF0aWNfY2FzdDxIQklUTUFQPihT
ZWxlY3RPYmplY3QoaGRjLCBoYm1wKSk7CiAgICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9
IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwotICAgIENHQ29udGV4dFJlZiBjb250ZXh0
ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKCh2b2lkKiliaXRzLCB3LCBoLAorICAgIENHQ29udGV4
dFJlZiBjb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKHN0YXRpY19jYXN0PHZvaWQqPihi
aXRzKSwgdywgaCwKICAgICAgICAgOCwgdyAqIHNpemVvZihSR0JRVUFEKSwgZGV2aWNlUkdCLCBr
Q0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8IGtDR0ltYWdlQWxwaGFQcmVtdWx0aXBsaWVkRmly
c3QpOwogICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKICAgICBDR0NvbnRleHRT
YXZlR1N0YXRlKGNvbnRleHQpOwpAQCAtMTgyLDE2ICs4NCw0IEBAIEhCSVRNQVAgaW1hZ2VGcm9t
U2VsZWN0aW9uKEZyYW1lKiBmcmFtZSwKICAgICByZXR1cm4gaGJtcDsKIH0KIAotRHJhZ0ltYWdl
UmVmIEZyYW1lOjpkcmFnSW1hZ2VGb3JTZWxlY3Rpb24oKQoteyAgICAKLSAgICBpZiAoc2VsZWN0
aW9uQ29udHJvbGxlcigpLT5pc1JhbmdlKCkpCi0gICAgICAgIHJldHVybiBpbWFnZUZyb21TZWxl
Y3Rpb24odGhpcywgZmFsc2UpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgRnJhbWU6OmRh
c2hib2FyZFJlZ2lvbnNDaGFuZ2VkKCkKLXsKLX0KLQogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJ
bmRleDogV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lQ2Fpcm9XaW4uY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZUNhaXJvV2luLmNwcAkocmV2aXNpb24gMCkKKysrIFdl
YkNvcmUvYnJpZGdlL3dpbi9GcmFtZUNhaXJvV2luLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCAr
MSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJGcmFtZVdp
bi5oIgorCisjaW5jbHVkZSAiRWRpdG9yQ2xpZW50LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50
ZWQuaCIKKwordXNpbmcgc3RkOjptaW47CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworSEJJVE1B
UCBpbWFnZUZyb21TZWxlY3Rpb24oRnJhbWUqIGZyYW1lLCBib29sIGZvcmNlQmxhY2tUZXh0KQor
eworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK30gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYnJpZGdlL3dpbi9GcmFtZVdpbi5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9icmlkZ2Uvd2luL0ZyYW1lV2luLmNwcAkocmV2aXNpb24gMzAwNDgp
CisrKyBXZWJDb3JlL2JyaWRnZS93aW4vRnJhbWVXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0x
LDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCkBAIC02MCwxMCArNjAsNiBAQAogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2lu
Y2x1ZGUgIlNldHRpbmdzLmgiCiAKLSNpZiBQTEFURk9STShDRykKLSNpbmNsdWRlIDxDb3JlR3Jh
cGhpY3MvQ29yZUdyYXBoaWNzLmg+Ci0jZW5kaWYKLQogdXNpbmcgc3RkOjptaW47CiB1c2luZyBu
YW1lc3BhY2UgS0pTOjpCaW5kaW5nczsKIApAQCAtODQsNyArODAsNiBAQCBLSlM6OkJpbmRpbmdz
OjpJbnN0YW5jZSogRnJhbWU6OmNyZWF0ZVNjCiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFBsdWdp
blZpZXcqPih3aWRnZXQpLT5iaW5kaW5nSW5zdGFuY2UoKTsKIH0KIAotCiB2b2lkIGNvbXB1dGVQ
YWdlUmVjdHNGb3JGcmFtZShGcmFtZSogZnJhbWUsIGNvbnN0IEludFJlY3QmIHByaW50UmVjdCwg
ZmxvYXQgaGVhZGVySGVpZ2h0LCBmbG9hdCBmb290ZXJIZWlnaHQsIGZsb2F0IHVzZXJTY2FsZUZh
Y3RvcixWZWN0b3I8SW50UmVjdD4mIHBhZ2VzLCBpbnQmIG91dFBhZ2VIZWlnaHQpCiB7CiAgICAg
QVNTRVJUKGZyYW1lKTsKQEAgLTEwNywxMSArMTAyLDExIEBAIHZvaWQgY29tcHV0ZVBhZ2VSZWN0
c0ZvckZyYW1lKEZyYW1lKiBmcmEKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICAKLSAgICBm
bG9hdCByYXRpbyA9IChmbG9hdClwcmludFJlY3QuaGVpZ2h0KCkgLyAoZmxvYXQpcHJpbnRSZWN0
LndpZHRoKCk7CisgICAgZmxvYXQgcmF0aW8gPSBzdGF0aWNfY2FzdDxmbG9hdD4ocHJpbnRSZWN0
LmhlaWdodCgpKSAvIHN0YXRpY19jYXN0PGZsb2F0PihwcmludFJlY3Qud2lkdGgoKSk7CiAgCi0g
ICAgZmxvYXQgcGFnZVdpZHRoICA9IChmbG9hdCkgcm9vdC0+ZG9jV2lkdGgoKTsKKyAgICBmbG9h
dCBwYWdlV2lkdGggID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHJvb3QtPmRvY1dpZHRoKCkpOwogICAg
IGZsb2F0IHBhZ2VIZWlnaHQgPSBwYWdlV2lkdGggKiByYXRpbzsKLSAgICBvdXRQYWdlSGVpZ2h0
ID0gKGludCkgcGFnZUhlaWdodDsgICAvLyB0aGlzIGlzIHRoZSBoZWlnaHQgb2YgdGhlIHBhZ2Ug
YWRqdXN0ZWQgYnkgbWFyZ2lucworICAgIG91dFBhZ2VIZWlnaHQgPSBzdGF0aWNfY2FzdDxpbnQ+
KHBhZ2VIZWlnaHQpOyAgIC8vIHRoaXMgaXMgdGhlIGhlaWdodCBvZiB0aGUgcGFnZSBhZGp1c3Rl
ZCBieSBtYXJnaW5zCiAgICAgcGFnZUhlaWdodCAtPSAoaGVhZGVySGVpZ2h0ICsgZm9vdGVySGVp
Z2h0KTsKIAogICAgIGlmIChwYWdlSGVpZ2h0IDw9IDApIHsKQEAgLTEyNiw2MiArMTIxLDE3IEBA
IHZvaWQgY29tcHV0ZVBhZ2VSZWN0c0ZvckZyYW1lKEZyYW1lKiBmcmEKIAogICAgIAogICAgIC8v
IGFsd2F5cyByZXR1cm4gYXQgbGVhc3Qgb25lIHBhZ2UsIHNpbmNlIGVtcHR5IGZpbGVzIHNob3Vs
ZCBwcmludCBhIGJsYW5rIHBhZ2UKLSAgICBmbG9hdCBwcmludGVkUGFnZXNIZWlnaHQgPSAwLjA7
CisgICAgZmxvYXQgcHJpbnRlZFBhZ2VzSGVpZ2h0ID0gMC4wZjsKICAgICBkbyB7CiAgICAgICAg
IGZsb2F0IHByb3Bvc2VkQm90dG9tID0gbWluKGRvY0hlaWdodCwgcHJpbnRlZFBhZ2VzSGVpZ2h0
ICsgcGFnZUhlaWdodCk7CiAgICAgICAgIGZyYW1lLT5hZGp1c3RQYWdlSGVpZ2h0KCZwcm9wb3Nl
ZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0LCBwcm9wb3NlZEJvdHRvbSwgcHJpbnRlZFBhZ2Vz
SGVpZ2h0KTsKICAgICAgICAgY3VyclBhZ2VIZWlnaHQgPSBtYXgoMS4wZiwgcHJvcG9zZWRCb3R0
b20gLSBwcmludGVkUGFnZXNIZWlnaHQpOwogICAgICAgIAotICAgICAgICBwYWdlcy5hcHBlbmQo
SW50UmVjdCgwLHByaW50ZWRQYWdlc0hlaWdodCxjdXJyUGFnZVdpZHRoLGN1cnJQYWdlSGVpZ2h0
KSk7CisgICAgICAgIHBhZ2VzLmFwcGVuZChJbnRSZWN0KDAsIHByaW50ZWRQYWdlc0hlaWdodCwg
Y3VyclBhZ2VXaWR0aCwgY3VyclBhZ2VIZWlnaHQpKTsKICAgICAgICAgcHJpbnRlZFBhZ2VzSGVp
Z2h0ICs9IGN1cnJQYWdlSGVpZ2h0OwogICAgIH0gd2hpbGUgKHByaW50ZWRQYWdlc0hlaWdodCA8
IGRvY0hlaWdodCk7CiB9CiAKLXN0YXRpYyB2b2lkIGRyYXdSZWN0SW50b0NvbnRleHQoSW50UmVj
dCByZWN0LCBGcmFtZVZpZXcqIHZpZXcsIEdyYXBoaWNzQ29udGV4dCogZ2MpCi17Ci0gICAgSW50
U2l6ZSBvZmZzZXQgPSB2aWV3LT5zY3JvbGxPZmZzZXQoKTsKLSAgICByZWN0Lm1vdmUoLW9mZnNl
dC53aWR0aCgpLCAtb2Zmc2V0LmhlaWdodCgpKTsKLSAgICByZWN0ID0gdmlldy0+Y29udmVydFRv
Q29udGFpbmluZ1dpbmRvdyhyZWN0KTsKLQotICAgIGdjLT5jb25jYXRDVE0oQWZmaW5lVHJhbnNm
b3JtKCkudHJhbnNsYXRlKC1yZWN0LngoKSwgLXJlY3QueSgpKSk7Ci0KLSAgICB2aWV3LT5wYWlu
dChnYywgcmVjdCk7Ci19Ci0KLUhCSVRNQVAgaW1hZ2VGcm9tU2VsZWN0aW9uKEZyYW1lKiBmcmFt
ZSwgYm9vbCBmb3JjZUJsYWNrVGV4dCkKLXsKLSAgICBmcmFtZS0+c2V0UGFpbnRSZXN0cmljdGlv
bihmb3JjZUJsYWNrVGV4dCA/IFBhaW50UmVzdHJpY3Rpb25TZWxlY3Rpb25Pbmx5QmxhY2tUZXh0
IDogUGFpbnRSZXN0cmljdGlvblNlbGVjdGlvbk9ubHkpOwotICAgIEZsb2F0UmVjdCBmciA9IGZy
YW1lLT5zZWxlY3Rpb25SZWN0KCk7Ci0gICAgSW50UmVjdCBpcigoaW50KWZyLngoKSwgKGludClm
ci55KCksKGludClmci53aWR0aCgpLChpbnQpZnIuaGVpZ2h0KCkpOwotCi0gICAgdm9pZCogYml0
czsKLSAgICBIREMgaGRjID0gQ3JlYXRlQ29tcGF0aWJsZURDKDApOwotICAgIGludCB3ID0gaXIu
d2lkdGgoKTsKLSAgICBpbnQgaCA9IGlyLmhlaWdodCgpOwotICAgIEJJVE1BUElORk8gYm1wID0g
eyB7IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSwgdywgaCwgMSwgMzIgfSB9OwotCi0gICAgSEJJ
VE1BUCBoYm1wID0gQ3JlYXRlRElCU2VjdGlvbigwLCAmYm1wLCBESUJfUkdCX0NPTE9SUywgKHZv
aWQqKikmYml0cywgMCwgMCk7Ci0gICAgSEJJVE1BUCBoYm1wT2xkID0gKEhCSVRNQVApU2VsZWN0
T2JqZWN0KGhkYywgaGJtcCk7Ci0gICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29s
b3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwotICAgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gQ0dC
aXRtYXBDb250ZXh0Q3JlYXRlKCh2b2lkKiliaXRzLCB3LCBoLAotICAgICAgICA4LCB3ICogc2l6
ZW9mKFJHQlFVQUQpLCBkZXZpY2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwga0NH
SW1hZ2VBbHBoYVByZW11bHRpcGxpZWRGaXJzdCk7Ci0gICAgQ0dDb2xvclNwYWNlUmVsZWFzZShk
ZXZpY2VSR0IpOwotICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7Ci0KLSAgICBHcmFw
aGljc0NvbnRleHQgZ2MoY29udGV4dCk7Ci0KLSAgICBmcmFtZS0+ZG9jdW1lbnQoKS0+dXBkYXRl
TGF5b3V0KCk7Ci0gICAgZHJhd1JlY3RJbnRvQ29udGV4dChpciwgZnJhbWUtPnZpZXcoKSwgJmdj
KTsKLQotICAgIENHQ29udGV4dFJlbGVhc2UoY29udGV4dCk7Ci0gICAgU2VsZWN0T2JqZWN0KGhk
YywgaGJtcE9sZCk7Ci0gICAgRGVsZXRlREMoaGRjKTsKLQotICAgIGZyYW1lLT5zZXRQYWludFJl
c3RyaWN0aW9uKFBhaW50UmVzdHJpY3Rpb25Ob25lKTsKLQotICAgIHJldHVybiBoYm1wOwotfQot
CiBEcmFnSW1hZ2VSZWYgRnJhbWU6OmRyYWdJbWFnZUZvclNlbGVjdGlvbigpCiB7ICAgIAogICAg
IGlmIChzZWxlY3Rpb25Db250cm9sbGVyKCktPmlzUmFuZ2UoKSkKSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvU2ltcGxlRm9udERhdGEuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL1NpbXBsZUZvbnREYXRhLmgJKHJldmlzaW9uIDMwMDQ4KQorKysgV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5oCSh3b3JraW5nIGNvcHkpCkBA
IC0xMDMsNiArMTAzLDcgQEAgcHVibGljOgogICAgIFNDUklQVF9DQUNIRSogc2NyaXB0Q2FjaGUo
KSBjb25zdCB7IHJldHVybiAmbV9zY3JpcHRDYWNoZTsgfQogCiAgICAgc3RhdGljIHZvaWQgc2V0
U2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrKGJvb2wpOworICAgIHN0YXRpYyBib29sIHNob3VsZEFw
cGx5TWFjQXNjZW50SGFjaygpOwogI2VuZGlmCiAKICNpZiBQTEFURk9STShHVEspCkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4dENhaXJvLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29u
dGV4dENhaXJvLmNwcAkocmV2aXNpb24gMzAwNDgpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4dENhaXJvLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDIs
MTUgKzQyLDEzIEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDx3dGYvTWF0aEV4dHJh
cy5oPgogCi0jaWYgUExBVEZPUk0oV0lOKQotI2luY2x1ZGUgPGNhaXJvLXdpbjMyLmg+Ci0jZW5k
aWYKLQogI2lmIFBMQVRGT1JNKEdUSykKICNpbmNsdWRlIDxnZGsvZ2RrLmg+CiAjaW5jbHVkZSA8
cGFuZ28vcGFuZ28uaD4KKyNlbGlmIFBMQVRGT1JNKFdJTikKKyNpbmNsdWRlIDxjYWlyby13aW4z
Mi5oPgogI2VuZGlmCi0KKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVD
YWlyby5oIgogCiAjaWZuZGVmIE1fUEkKICNkZWZpbmUgTV9QSSAzLjE0MTU5MjY1MzU4OTc5MzIz
ODQ2CkBAIC01OCwxOSArNTYsNiBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLWNsYXNzIEdy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSB7Ci1wdWJsaWM6Ci0gICAgR3JhcGhpY3NDb250
ZXh0UGxhdGZvcm1Qcml2YXRlKCk7Ci0gICAgfkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0
ZSgpOwotCi0gICAgY2Fpcm9fdCogY3I7Ci0gICAgVmVjdG9yPGZsb2F0PiBsYXllcnM7Ci0KLSNp
ZiBQTEFURk9STShHVEspCi0gICAgR2RrRXZlbnRFeHBvc2UqIGV4cG9zZTsKLSNlbmRpZgotfTsK
LQogc3RhdGljIGlubGluZSB2b2lkIHNldENvbG9yKGNhaXJvX3QqIGNyLCBjb25zdCBDb2xvciYg
Y29sKQogewogICAgIGZsb2F0IHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhOwpAQCAtODcsMzQgKzcy
LDYgQEAgc3RhdGljIGlubGluZSB2b2lkIGZpbGxSZWN0U291cmNlT3ZlcihjYQogICAgIGNhaXJv
X2ZpbGwoY3IpOwogfQogCi1HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OkdyYXBoaWNz
Q29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpCi0gICAgOiAgY3IoMCkKLSNpZiBQTEFURk9STShHVEsp
Ci0gICAgLCBleHBvc2UoMCkKLSNlbmRpZgotewotfQotCi1HcmFwaGljc0NvbnRleHRQbGF0Zm9y
bVByaXZhdGU6On5HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKQotewotICAgIGNhaXJv
X2Rlc3Ryb3koY3IpOwotfQotCi0jaWYgUExBVEZPUk0oV0lOKQotR3JhcGhpY3NDb250ZXh0OjpH
cmFwaGljc0NvbnRleHQoSERDIGRjKQotICAgIDogbV9jb21tb24oY3JlYXRlR3JhcGhpY3NDb250
ZXh0UHJpdmF0ZSgpKQotICAgICwgbV9kYXRhKG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVBy
aXZhdGUpCi17Ci0gICAgaWYgKGRjKSB7Ci0gICAgICAgIGNhaXJvX3N1cmZhY2VfdCogc3VyZmFj
ZSA9IGNhaXJvX3dpbjMyX3N1cmZhY2VfY3JlYXRlKGRjKTsKLSAgICAgICAgbV9kYXRhLT5jciA9
IGNhaXJvX2NyZWF0ZShzdXJmYWNlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzZXRQYWludGlu
Z0Rpc2FibGVkKHRydWUpOwotICAgICAgICBtX2RhdGEtPmNyID0gMDsKLSAgICB9Ci19Ci0jZW5k
aWYKLQogR3JhcGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRleHQoUGxhdGZvcm1HcmFwaGljc0Nv
bnRleHQqIGNyKQogICAgIDogbV9jb21tb24oY3JlYXRlR3JhcGhpY3NDb250ZXh0UHJpdmF0ZSgp
KQogICAgICwgbV9kYXRhKG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUpCkBAIC01
ODYsNiArNTQzLDkgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFVSTEZvclJlY3QoY29ucwog
ICAgIG5vdEltcGxlbWVudGVkKCk7CiB9CiAKKyNpZiBQTEFURk9STShHVEspCisvLyBGSVhNRTog
IFRoaXMgc2hvdWxkIGJlIG1vdmVkIHRvIHNvbWV0aGluZyBsaWtlIEdyYXBoaWNzQ29udGV4dENh
aXJvR1RLLmNwcCwKKy8vIGFzIHRoZXJlIGlzIGEgV2luZG93cyBpbXBsZW1lbnRhdGlvbiBpbiBw
bGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0Q2Fpcm9XaW4uY3BwCiB2b2lkIEdy
YXBoaWNzQ29udGV4dDo6Y29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdHJhbnNmb3Jt
KQogewogICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCkBAIC01OTUsNiArNTU1LDcgQEAgdm9p
ZCBHcmFwaGljc0NvbnRleHQ6OmNvbmNhdENUTShjb25zdCBBZgogICAgIGNvbnN0IGNhaXJvX21h
dHJpeF90KiBtYXRyaXggPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNhaXJvX21hdHJpeF90Kj4o
JnRyYW5zZm9ybSk7CiAgICAgY2Fpcm9fdHJhbnNmb3JtKGNyLCBtYXRyaXgpOwogfQorI2VuZGlm
CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjphZGRJbm5lclJvdW5kZWRSZWN0Q2xpcChjb25zdCBJ
bnRSZWN0JiByZWN0LCBpbnQgdGhpY2tuZXNzKQogewpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9jYWlyby9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVDYWlyby5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlQ2Fpcm8uaAkocmV2aXNpb24gMzAwNDgpCShmcm9tIFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhpY3NDb250ZXh0Q2Fpcm8uY3BwOjMwMDQ4KQorKysg
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVBy
aXZhdGVDYWlyby5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsOTMzIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFscCBUb2tlciA8YWxwQGF0b2tlci5jb20+CisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorCisj
aWYgUExBVEZPUk0oQ0FJUk8pCisKKyNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKKyNpbmNs
dWRlICJDYWlyb1BhdGguaCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJGb250
LmgiCisjaW5jbHVkZSAiSW50UmVjdC5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisj
aW5jbHVkZSAiUGF0aC5oIgorI2luY2x1ZGUgIlNpbXBsZUZvbnREYXRhLmgiCisjaW5jbHVkZSA8
Y2Fpcm8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRl
IDx3dGYvTWF0aEV4dHJhcy5oPgorCisjaWYgUExBVEZPUk0oV0lOKQorI2luY2x1ZGUgPGNhaXJv
LXdpbjMyLmg+CisjZW5kaWYKKworI2lmIFBMQVRGT1JNKEdUSykKKyNpbmNsdWRlIDxnZGsvZ2Rr
Lmg+CisjaW5jbHVkZSA8cGFuZ28vcGFuZ28uaD4KKyNlbmRpZgorCisKKyNpZm5kZWYgTV9QSQor
I2RlZmluZSBNX1BJIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYKKyNlbmRpZgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKK2NsYXNzIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSB7CitwdWJs
aWM6CisgICAgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKCk7CisgICAgfkdyYXBoaWNz
Q29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpOworCisgICAgY2Fpcm9fdCogY3I7CisgICAgVmVjdG9y
PGZsb2F0PiBsYXllcnM7CisKKyNpZiBQTEFURk9STShHVEspCisgICAgR2RrRXZlbnRFeHBvc2Uq
IGV4cG9zZTsKKyNlbmRpZgorfTsKKworc3RhdGljIGlubGluZSB2b2lkIHNldENvbG9yKGNhaXJv
X3QqIGNyLCBjb25zdCBDb2xvciYgY29sKQoreworICAgIGZsb2F0IHJlZCwgZ3JlZW4sIGJsdWUs
IGFscGhhOworICAgIGNvbC5nZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAgICBj
YWlyb19zZXRfc291cmNlX3JnYmEoY3IsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKK30KKwor
Ly8gQSBmaWxsUmVjdCBoZWxwZXIKK3N0YXRpYyBpbmxpbmUgdm9pZCBmaWxsUmVjdFNvdXJjZU92
ZXIoY2Fpcm9fdCogY3IsIGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgY29uc3QgQ29sb3ImIGNvbCkK
K3sKKyAgICBzZXRDb2xvcihjciwgY29sKTsKKyAgICBjYWlyb19yZWN0YW5nbGUoY3IsIHJlY3Qu
eCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKKyAgICBjYWlyb19z
ZXRfb3BlcmF0b3IoY3IsIENBSVJPX09QRVJBVE9SX09WRVIpOworICAgIGNhaXJvX2ZpbGwoY3Ip
OworfQorCitHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OkdyYXBoaWNzQ29udGV4dFBs
YXRmb3JtUHJpdmF0ZSgpCisgICAgOiAgY3IoMCkKKyNpZiBQTEFURk9STShHVEspCisgICAgLCBl
eHBvc2UoMCkKKyNlbmRpZgoreworfQorCitHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6
On5HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKQoreworICAgIGNhaXJvX2Rlc3Ryb3ko
Y3IpOworfQorCisjaWYgUExBVEZPUk0oV0lOKQorR3JhcGhpY3NDb250ZXh0OjpHcmFwaGljc0Nv
bnRleHQoSERDIGRjKQorICAgIDogbV9jb21tb24oY3JlYXRlR3JhcGhpY3NDb250ZXh0UHJpdmF0
ZSgpKQorICAgICwgbV9kYXRhKG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUpCit7
CisgICAgaWYgKGRjKSB7CisgICAgICAgIGNhaXJvX3N1cmZhY2VfdCogc3VyZmFjZSA9IGNhaXJv
X3dpbjMyX3N1cmZhY2VfY3JlYXRlKGRjKTsKKyAgICAgICAgbV9kYXRhLT5jciA9IGNhaXJvX2Ny
ZWF0ZShzdXJmYWNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzZXRQYWludGluZ0Rpc2FibGVk
KHRydWUpOworICAgICAgICBtX2RhdGEtPmNyID0gMDsKKyAgICB9Cit9CisjZW5kaWYKKworR3Jh
cGhpY3NDb250ZXh0OjpHcmFwaGljc0NvbnRleHQoUGxhdGZvcm1HcmFwaGljc0NvbnRleHQqIGNy
KQorICAgIDogbV9jb21tb24oY3JlYXRlR3JhcGhpY3NDb250ZXh0UHJpdmF0ZSgpKQorICAgICwg
bV9kYXRhKG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUpCit7CisgICAgbV9kYXRh
LT5jciA9IGNhaXJvX3JlZmVyZW5jZShjcik7CisgICAgc2V0UGFpbnRpbmdEaXNhYmxlZCghY3Ip
OworfQorCitHcmFwaGljc0NvbnRleHQ6On5HcmFwaGljc0NvbnRleHQoKQoreworICAgIGRlc3Ry
b3lHcmFwaGljc0NvbnRleHRQcml2YXRlKG1fY29tbW9uKTsKKyAgICBkZWxldGUgbV9kYXRhOwor
fQorCitBZmZpbmVUcmFuc2Zvcm0gR3JhcGhpY3NDb250ZXh0OjpnZXRDVE0oKSBjb25zdAorewor
ICAgIGNhaXJvX3QqIGNyID0gcGxhdGZvcm1Db250ZXh0KCk7CisgICAgY2Fpcm9fbWF0cml4X3Qg
bTsKKyAgICBjYWlyb19nZXRfbWF0cml4KGNyLCAmbSk7CisgICAgcmV0dXJuIG07Cit9CisKK2Nh
aXJvX3QqIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1Db250ZXh0KCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gbV9kYXRhLT5jcjsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNhdmVQbGF0Zm9y
bVN0YXRlKCkKK3sKKyAgICBjYWlyb19zYXZlKG1fZGF0YS0+Y3IpOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDo6cmVzdG9yZVBsYXRmb3JtU3RhdGUoKQoreworICAgIGNhaXJvX3Jlc3RvcmUo
bV9kYXRhLT5jcik7Cit9CisKKy8vIERyYXdzIGEgZmlsbGVkIHJlY3RhbmdsZSB3aXRoIGEgc3Ry
b2tlZCBib3JkZXIuCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd1JlY3QoY29uc3QgSW50UmVj
dCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgY2Fpcm9fc2F2ZShjcik7CisK
KyAgICBpZiAoZmlsbENvbG9yKCkuYWxwaGEoKSkKKyAgICAgICAgZmlsbFJlY3RTb3VyY2VPdmVy
KGNyLCByZWN0LCBmaWxsQ29sb3IoKSk7CisKKyAgICBpZiAoc3Ryb2tlU3R5bGUoKSAhPSBOb1N0
cm9rZSkgeworICAgICAgICBzZXRDb2xvcihjciwgc3Ryb2tlQ29sb3IoKSk7CisgICAgICAgIEZs
b2F0UmVjdCByKHJlY3QpOworICAgICAgICByLmluZmxhdGUoLS41Zik7CisgICAgICAgIGNhaXJv
X3JlY3RhbmdsZShjciwgci54KCksIHIueSgpLCByLndpZHRoKCksIHIuaGVpZ2h0KCkpOworICAg
ICAgICBjYWlyb19zZXRfbGluZV93aWR0aChjciwgMS4wKTsKKyAgICAgICAgY2Fpcm9fc3Ryb2tl
KGNyKTsKKyAgICB9CisKKyAgICBjYWlyb19yZXN0b3JlKGNyKTsKK30KKworLy8gRklYTUU6IE5v
dyB0aGF0IHRoaXMgaXMgcmVmYWN0b3JlZCwgaXQgc2hvdWxkIGJlIHNoYXJlZCBieSBhbGwgY29u
dGV4dHMuCitzdGF0aWMgdm9pZCBhZGp1c3RMaW5lVG9QaXhlbEJvdW5kYXJpZXMoRmxvYXRQb2lu
dCYgcDEsIEZsb2F0UG9pbnQmIHAyLCBmbG9hdCBzdHJva2VXaWR0aCwgU3Ryb2tlU3R5bGUgc3R5
bGUpCit7CisgICAgLy8gRm9yIG9kZCB3aWR0aHMsIHdlIGFkZCBpbiAwLjUgdG8gdGhlIGFwcHJv
cHJpYXRlIHgveSBzbyB0aGF0IHRoZSBmbG9hdCBhcml0aG1ldGljCisgICAgLy8gd29ya3Mgb3V0
LiAgRm9yIGV4YW1wbGUsIHdpdGggYSBib3JkZXIgd2lkdGggb2YgMywgS0hUTUwgd2lsbCBwYXNz
IHVzICh5MSt5MikvMiwgZS5nLiwKKyAgICAvLyAoNTArNTMpLzIgPSAxMDMvMiA9IDUxIHdoZW4g
d2Ugd2FudCA1MS41LiAgSXQgaXMgYWx3YXlzIHRydWUgdGhhdCBhbiBldmVuIHdpZHRoIGdhdmUK
KyAgICAvLyB1cyBhIHBlcmZlY3QgcG9zaXRpb24sIGJ1dCBhbiBvZGQgd2lkdGggZ2F2ZSB1cyBh
IHBvc2l0aW9uIHRoYXQgaXMgb2ZmIGJ5IGV4YWN0bHkgMC41LgorICAgIGlmIChzdHlsZSA9PSBE
b3R0ZWRTdHJva2UgfHwgc3R5bGUgPT0gRGFzaGVkU3Ryb2tlKSB7CisgICAgICAgIGlmIChwMS54
KCkgPT0gcDIueCgpKSB7CisgICAgICAgICAgICBwMS5zZXRZKHAxLnkoKSArIHN0cm9rZVdpZHRo
KTsKKyAgICAgICAgICAgIHAyLnNldFkocDIueSgpIC0gc3Ryb2tlV2lkdGgpOworICAgICAgICB9
CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcDEuc2V0WChwMS54KCkgKyBzdHJva2VXaWR0
aCk7CisgICAgICAgICAgICBwMi5zZXRYKHAyLngoKSAtIHN0cm9rZVdpZHRoKTsKKyAgICAgICAg
fQorICAgIH0KKworICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KHN0cm9rZVdpZHRoKSAlIDIpIHsK
KyAgICAgICAgaWYgKHAxLngoKSA9PSBwMi54KCkpIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIGEg
dmVydGljYWwgbGluZS4gIEFkanVzdCBvdXIgeC4KKyAgICAgICAgICAgIHAxLnNldFgocDEueCgp
ICsgMC41KTsKKyAgICAgICAgICAgIHAyLnNldFgocDIueCgpICsgMC41KTsKKyAgICAgICAgfQor
ICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIGEgaG9yaXpvbnRhbCBsaW5lLiBB
ZGp1c3Qgb3VyIHkuCisgICAgICAgICAgICBwMS5zZXRZKHAxLnkoKSArIDAuNSk7CisgICAgICAg
ICAgICBwMi5zZXRZKHAyLnkoKSArIDAuNSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIFRo
aXMgaXMgb25seSB1c2VkIHRvIGRyYXcgYm9yZGVycy4KK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpk
cmF3TGluZShjb25zdCBJbnRQb2ludCYgcG9pbnQxLCBjb25zdCBJbnRQb2ludCYgcG9pbnQyKQor
eworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIFN0
cm9rZVN0eWxlIHN0eWxlID0gc3Ryb2tlU3R5bGUoKTsKKyAgICBpZiAoc3R5bGUgPT0gTm9TdHJv
a2UpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAg
ICBjYWlyb19zYXZlKGNyKTsKKworICAgIGZsb2F0IHdpZHRoID0gc3Ryb2tlVGhpY2tuZXNzKCk7
CisgICAgaWYgKHdpZHRoIDwgMSkKKyAgICAgICAgd2lkdGggPSAxOworCisgICAgRmxvYXRQb2lu
dCBwMSA9IHBvaW50MTsKKyAgICBGbG9hdFBvaW50IHAyID0gcG9pbnQyOworICAgIGJvb2wgaXNW
ZXJ0aWNhbExpbmUgPSAocDEueCgpID09IHAyLngoKSk7CisKKyAgICBhZGp1c3RMaW5lVG9QaXhl
bEJvdW5kYXJpZXMocDEsIHAyLCB3aWR0aCwgc3R5bGUpOworICAgIGNhaXJvX3NldF9saW5lX3dp
ZHRoKGNyLCB3aWR0aCk7CisKKyAgICBpbnQgcGF0V2lkdGggPSAwOworICAgIHN3aXRjaCAoc3R5
bGUpIHsKKyAgICBjYXNlIE5vU3Ryb2tlOgorICAgIGNhc2UgU29saWRTdHJva2U6CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgRG90dGVkU3Ryb2tlOgorICAgICAgICBwYXRXaWR0aCA9IHN0YXRp
Y19jYXN0PGludD4od2lkdGgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERhc2hlZFN0cm9r
ZToKKyAgICAgICAgcGF0V2lkdGggPSAzKnN0YXRpY19jYXN0PGludD4od2lkdGgpOworICAgICAg
ICBicmVhazsKKyAgICB9CisKKyAgICBzZXRDb2xvcihjciwgc3Ryb2tlQ29sb3IoKSk7CisKKyAg
ICBjYWlyb19zZXRfYW50aWFsaWFzKGNyLCBDQUlST19BTlRJQUxJQVNfTk9ORSk7CisKKyAgICBp
ZiAocGF0V2lkdGgpIHsKKyAgICAgICAgLy8gRG8gYSByZWN0IGZpbGwgb2Ygb3VyIGVuZHBvaW50
cy4gIFRoaXMgZW5zdXJlcyB3ZSBhbHdheXMgaGF2ZSB0aGUKKyAgICAgICAgLy8gYXBwZWFyYW5j
ZSBvZiBiZWluZyBhIGJvcmRlci4gIFdlIHRoZW4gZHJhdyB0aGUgYWN0dWFsIGRvdHRlZC9kYXNo
ZWQgbGluZS4KKyAgICAgICAgaWYgKGlzVmVydGljYWxMaW5lKSB7CisgICAgICAgICAgICBmaWxs
UmVjdFNvdXJjZU92ZXIoY3IsIEZsb2F0UmVjdChwMS54KCkgLSB3aWR0aC8yLCBwMS55KCkgLSB3
aWR0aCwgd2lkdGgsIHdpZHRoKSwgc3Ryb2tlQ29sb3IoKSk7CisgICAgICAgICAgICBmaWxsUmVj
dFNvdXJjZU92ZXIoY3IsIEZsb2F0UmVjdChwMi54KCkgLSB3aWR0aC8yLCBwMi55KCksIHdpZHRo
LCB3aWR0aCksIHN0cm9rZUNvbG9yKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg
ZmlsbFJlY3RTb3VyY2VPdmVyKGNyLCBGbG9hdFJlY3QocDEueCgpIC0gd2lkdGgsIHAxLnkoKSAt
IHdpZHRoLzIsIHdpZHRoLCB3aWR0aCksIHN0cm9rZUNvbG9yKCkpOworICAgICAgICAgICAgZmls
bFJlY3RTb3VyY2VPdmVyKGNyLCBGbG9hdFJlY3QocDIueCgpLCBwMi55KCkgLSB3aWR0aC8yLCB3
aWR0aCwgd2lkdGgpLCBzdHJva2VDb2xvcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEV4
YW1wbGU6IDgwIHBpeGVscyB3aXRoIGEgd2lkdGggb2YgMzAgcGl4ZWxzLgorICAgICAgICAvLyBS
ZW1haW5kZXIgaXMgMjAuICBUaGUgbWF4aW11bSBwaXhlbHMgb2YgbGluZSB3ZSBjb3VsZCBwYWlu
dAorICAgICAgICAvLyB3aWxsIGJlIDUwIHBpeGVscy4KKyAgICAgICAgaW50IGRpc3RhbmNlID0g
KGlzVmVydGljYWxMaW5lID8gKHBvaW50Mi55KCkgLSBwb2ludDEueSgpKSA6IChwb2ludDIueCgp
IC0gcG9pbnQxLngoKSkpIC0gMipzdGF0aWNfY2FzdDxpbnQ+KHdpZHRoKTsKKyAgICAgICAgaW50
IHJlbWFpbmRlciA9IGRpc3RhbmNlJXBhdFdpZHRoOworICAgICAgICBpbnQgY292ZXJhZ2UgPSBk
aXN0YW5jZS1yZW1haW5kZXI7CisgICAgICAgIGludCBudW1TZWdtZW50cyA9IGNvdmVyYWdlL3Bh
dFdpZHRoOworCisgICAgICAgIGZsb2F0IHBhdHRlcm5PZmZzZXQgPSAwOworICAgICAgICAvLyBT
cGVjaWFsIGNhc2UgMXB4IGRvdHRlZCBib3JkZXJzIGZvciBzcGVlZC4KKyAgICAgICAgaWYgKHBh
dFdpZHRoID09IDEpCisgICAgICAgICAgICBwYXR0ZXJuT2Zmc2V0ID0gMS4wOworICAgICAgICBl
bHNlIHsKKyAgICAgICAgICAgIGJvb2wgZXZlbk51bWJlck9mU2VnbWVudHMgPSBudW1TZWdtZW50
cyUyID09IDA7CisgICAgICAgICAgICBpZiAocmVtYWluZGVyKQorICAgICAgICAgICAgICAgIGV2
ZW5OdW1iZXJPZlNlZ21lbnRzID0gIWV2ZW5OdW1iZXJPZlNlZ21lbnRzOworICAgICAgICAgICAg
aWYgKGV2ZW5OdW1iZXJPZlNlZ21lbnRzKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmRl
cikgeworICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuT2Zmc2V0ICs9IHBhdFdpZHRoIC0gcmVt
YWluZGVyOworICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuT2Zmc2V0ICs9IHJlbWFpbmRlci8y
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAg
ICAgICAgIHBhdHRlcm5PZmZzZXQgPSBwYXRXaWR0aC8yOworICAgICAgICAgICAgfQorICAgICAg
ICAgICAgZWxzZSBpZiAoIWV2ZW5OdW1iZXJPZlNlZ21lbnRzKSB7CisgICAgICAgICAgICAgICAg
aWYgKHJlbWFpbmRlcikKKyAgICAgICAgICAgICAgICAgICAgcGF0dGVybk9mZnNldCA9IChwYXRX
aWR0aCAtIHJlbWFpbmRlcikvMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAg
IGRvdWJsZSBkYXNoID0gcGF0V2lkdGg7CisgICAgICAgIGNhaXJvX3NldF9kYXNoKGNyLCAmZGFz
aCwgMSwgcGF0dGVybk9mZnNldCk7CisgICAgfQorCisgICAgY2Fpcm9fbW92ZV90byhjciwgcDEu
eCgpLCBwMS55KCkpOworICAgIGNhaXJvX2xpbmVfdG8oY3IsIHAyLngoKSwgcDIueSgpKTsKKwor
ICAgIGNhaXJvX3N0cm9rZShjcik7CisgICAgY2Fpcm9fcmVzdG9yZShjcik7Cit9CisKKy8vIFRo
aXMgbWV0aG9kIGlzIG9ubHkgdXNlZCB0byBkcmF3IHRoZSBsaXR0bGUgY2lyY2xlcyB1c2VkIGlu
IGxpc3RzLgordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdFbGxpcHNlKGNvbnN0IEludFJlY3Qm
IHJlY3QpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOworICAgIGNhaXJvX3NhdmUoY3IpOworICAg
IGZsb2F0IHlSYWRpdXMgPSAuNSAqIHJlY3QuaGVpZ2h0KCk7CisgICAgZmxvYXQgeFJhZGl1cyA9
IC41ICogcmVjdC53aWR0aCgpOworICAgIGNhaXJvX3RyYW5zbGF0ZShjciwgcmVjdC54KCkgKyB4
UmFkaXVzLCByZWN0LnkoKSArIHlSYWRpdXMpOworICAgIGNhaXJvX3NjYWxlKGNyLCB4UmFkaXVz
LCB5UmFkaXVzKTsKKyAgICBjYWlyb19hcmMoY3IsIDAuLCAwLiwgMS4sIDAuLCAyICogTV9QSSk7
CisgICAgY2Fpcm9fcmVzdG9yZShjcik7CisKKyAgICBpZiAoZmlsbENvbG9yKCkuYWxwaGEoKSkg
eworICAgICAgICBzZXRDb2xvcihjciwgZmlsbENvbG9yKCkpOworICAgICAgICBjYWlyb19maWxs
X3ByZXNlcnZlKGNyKTsKKyAgICB9CisKKyAgICBpZiAoc3Ryb2tlU3R5bGUoKSAhPSBOb1N0cm9r
ZSkgeworICAgICAgICBzZXRDb2xvcihjciwgc3Ryb2tlQ29sb3IoKSk7CisgICAgICAgIGNhaXJv
X3NldF9saW5lX3dpZHRoKGNyLCBzdHJva2VUaGlja25lc3MoKSk7CisgICAgICAgIGNhaXJvX3N0
cm9rZShjcik7CisgICAgfQorCisgICAgY2Fpcm9fbmV3X3BhdGgoY3IpOworfQorCisvLyBGSVhN
RTogVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSBhZGp1c3RlZCB0byBtYXRjaCB0aGUgZnVuY3Rp
b25hbGl0eSBvbiB0aGUgTWFjIHNpZGUuCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c3Ryb2tlQXJj
KGNvbnN0IEludFJlY3QmIHJlY3QsIGludCBzdGFydEFuZ2xlLCBpbnQgYW5nbGVTcGFuKQorewor
ICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChz
dHJva2VTdHlsZSgpID09IE5vU3Ryb2tlKQorICAgICAgICByZXR1cm47CisKKyAgICBpbnQgeCA9
IHJlY3QueCgpOworICAgIGludCB5ID0gcmVjdC55KCk7CisgICAgZmxvYXQgdyA9IHJlY3Qud2lk
dGgoKTsKKyNpZiAwIC8vIEZJWE1FOiB1bnVzZWQgc28gZmFyCisgICAgZmxvYXQgaCA9IHJlY3Qu
aGVpZ2h0KCk7CisgICAgZmxvYXQgc2NhbGVGYWN0b3IgPSBoIC8gdzsKKyAgICBmbG9hdCByZXZl
cnNlU2NhbGVGYWN0b3IgPSB3IC8gaDsKKyNlbmRpZgorICAgIGZsb2F0IHIgPSB3IC8gMjsKKyAg
ICBmbG9hdCBmYSA9IHN0YXJ0QW5nbGU7CisgICAgZmxvYXQgZmFsZW4gPSAgZmEgKyBhbmdsZVNw
YW47CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgY2Fpcm9fc2F2ZShjcik7
CisgICAgY2Fpcm9fYXJjX25lZ2F0aXZlKGNyLCB4ICsgciwgeSArIHIsIHIsIC1mYSAqIE1fUEkv
MTgwLCAtZmFsZW4gKiBNX1BJLzE4MCk7CisgICAgc2V0Q29sb3IoY3IsIHN0cm9rZUNvbG9yKCkp
OworICAgIGNhaXJvX3NldF9saW5lX3dpZHRoKGNyLCBzdHJva2VUaGlja25lc3MoKSk7CisgICAg
Y2Fpcm9fc3Ryb2tlKGNyKTsKKyAgICBjYWlyb19yZXN0b3JlKGNyKTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHQ6OmRyYXdDb252ZXhQb2x5Z29uKHNpemVfdCBucG9pbnRzLCBjb25zdCBGbG9h
dFBvaW50KiBwb2ludHMsIGJvb2wgc2hvdWxkQW50aWFsaWFzKQoreworICAgIGlmIChwYWludGlu
Z0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChucG9pbnRzIDw9IDEpCisg
ICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKworICAgIGNh
aXJvX3NhdmUoY3IpOworICAgIGNhaXJvX3NldF9hbnRpYWxpYXMoY3IsIHNob3VsZEFudGlhbGlh
cyA/IENBSVJPX0FOVElBTElBU19ERUZBVUxUIDogQ0FJUk9fQU5USUFMSUFTX05PTkUpOworICAg
IGNhaXJvX21vdmVfdG8oY3IsIHBvaW50c1swXS54KCksIHBvaW50c1swXS55KCkpOworICAgIGZv
ciAoc2l6ZV90IGkgPSAxOyBpIDwgbnBvaW50czsgaSsrKQorICAgICAgICBjYWlyb19saW5lX3Rv
KGNyLCBwb2ludHNbaV0ueCgpLCBwb2ludHNbaV0ueSgpKTsKKyAgICBjYWlyb19jbG9zZV9wYXRo
KGNyKTsKKworICAgIGlmIChmaWxsQ29sb3IoKS5hbHBoYSgpKSB7CisgICAgICAgIHNldENvbG9y
KGNyLCBmaWxsQ29sb3IoKSk7CisgICAgICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIENBSVJP
X0ZJTExfUlVMRV9FVkVOX09ERCk7CisgICAgICAgIGNhaXJvX2ZpbGxfcHJlc2VydmUoY3IpOwor
ICAgIH0KKworICAgIGlmIChzdHJva2VTdHlsZSgpICE9IE5vU3Ryb2tlKSB7CisgICAgICAgIHNl
dENvbG9yKGNyLCBzdHJva2VDb2xvcigpKTsKKyAgICAgICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgo
Y3IsIHN0cm9rZVRoaWNrbmVzcygpKTsKKyAgICAgICAgY2Fpcm9fc3Ryb2tlKGNyKTsKKyAgICB9
CisKKyAgICBjYWlyb19uZXdfcGF0aChjcik7CisgICAgY2Fpcm9fcmVzdG9yZShjcik7Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpmaWxsUmVjdChjb25zdCBJbnRSZWN0JiByZWN0LCBjb25z
dCBDb2xvciYgY29sb3IpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgaWYgKGNvbG9yLmFscGhhKCkpCisgICAgICAgIGZpbGxSZWN0U291cmNl
T3ZlcihtX2RhdGEtPmNyLCByZWN0LCBjb2xvcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
OjpmaWxsUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0IENvbG9yJiBjb2xvcikKK3sK
KyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAo
Y29sb3IuYWxwaGEoKSkKKyAgICAgICAgZmlsbFJlY3RTb3VyY2VPdmVyKG1fZGF0YS0+Y3IsIHJl
Y3QsIGNvbG9yKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXAoY29uc3QgSW50UmVj
dCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgY2Fpcm9fcmVjdGFuZ2xlKGNy
LCByZWN0LngoKSwgcmVjdC55KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7CisgICAg
Y2Fpcm9fZmlsbF9ydWxlX3Qgc2F2ZWRGaWxsUnVsZSA9IGNhaXJvX2dldF9maWxsX3J1bGUoY3Ip
OworICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIENBSVJPX0ZJTExfUlVMRV9XSU5ESU5HKTsK
KyAgICBjYWlyb19jbGlwKGNyKTsKKyAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNyLCBzYXZlZEZp
bGxSdWxlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1c1JpbmcoY29uc3Qg
Q29sb3ImIGNvbG9yKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIGludCByYWRpdXMgPSAoZm9jdXNSaW5nV2lkdGgoKSAtIDEpIC8gMjsKKyAg
ICBpbnQgb2Zmc2V0ID0gcmFkaXVzICsgZm9jdXNSaW5nT2Zmc2V0KCk7CisKKyAgICBjb25zdCBW
ZWN0b3I8SW50UmVjdD4mIHJlY3RzID0gZm9jdXNSaW5nUmVjdHMoKTsKKyAgICB1bnNpZ25lZCBy
ZWN0Q291bnQgPSByZWN0cy5zaXplKCk7CisgICAgSW50UmVjdCBmaW5hbEZvY3VzUmVjdDsKKyAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcmVjdENvdW50OyBpKyspIHsKKyAgICAgICAgSW50
UmVjdCBmb2N1c1JlY3QgPSByZWN0c1tpXTsKKyAgICAgICAgZm9jdXNSZWN0LmluZmxhdGUob2Zm
c2V0KTsKKyAgICAgICAgZmluYWxGb2N1c1JlY3QudW5pdGUoZm9jdXNSZWN0KTsKKyAgICB9CisK
KyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgY2Fpcm9fc2F2ZShjcik7CisgICAg
Ly8gRklYTUU6IFRoZXNlIHJlY3RzIHNob3VsZCBiZSByb3VuZGVkCisgICAgY2Fpcm9fcmVjdGFu
Z2xlKGNyLCBmaW5hbEZvY3VzUmVjdC54KCksIGZpbmFsRm9jdXNSZWN0LnkoKSwgZmluYWxGb2N1
c1JlY3Qud2lkdGgoKSwgZmluYWxGb2N1c1JlY3QuaGVpZ2h0KCkpOworCisgICAgLy8gRm9yY2Ug
dGhlIGFscGhhIHRvIDUwJS4gIFRoaXMgbWF0Y2hlcyB3aGF0IHRoZSBNYWMgZG9lcyB3aXRoIG91
dGxpbmUgcmluZ3MuCisgICAgQ29sb3IgcmluZ0NvbG9yKGNvbG9yLnJlZCgpLCBjb2xvci5ncmVl
bigpLCBjb2xvci5ibHVlKCksIDEyNyk7CisgICAgc2V0Q29sb3IoY3IsIHJpbmdDb2xvcik7Cisg
ICAgY2Fpcm9fc3Ryb2tlKGNyKTsKKyAgICBjYWlyb19yZXN0b3JlKGNyKTsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yVGV4dChjb25zdCBJbnRQb2ludCYgb3JpZ2luLCBp
bnQgd2lkdGgsIGJvb2wgcHJpbnRpbmcpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgLy8gVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGh0dHA6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NjU5CisgICAgU3Ryb2tlU3R5bGUg
c2F2ZWRTdHJva2VTdHlsZSA9IHN0cm9rZVN0eWxlKCk7CisgICAgc2V0U3Ryb2tlU3R5bGUoU29s
aWRTdHJva2UpOworCisgICAgSW50UG9pbnQgZW5kUG9pbnQgPSBvcmlnaW4gKyBJbnRTaXplKHdp
ZHRoLCAwKTsKKyAgICBkcmF3TGluZShvcmlnaW4sIGVuZFBvaW50KTsKKworICAgIHNldFN0cm9r
ZVN0eWxlKHNhdmVkU3Ryb2tlU3R5bGUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJh
d0xpbmVGb3JNaXNzcGVsbGluZ09yQmFkR3JhbW1hcihjb25zdCBJbnRQb2ludCYgb3JpZ2luLCBp
bnQgd2lkdGgsIGJvb2wgZ3JhbW1hcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQor
ICAgICAgICByZXR1cm47CisKKyNpZiBQTEFURk9STShHVEspCisgICAgY2Fpcm9fdCogY3IgPSBt
X2RhdGEtPmNyOworICAgIGNhaXJvX3NhdmUoY3IpOworCisgICAgLy8gQ29udmVudGlvbiBpcyBn
cmVlbiBmb3IgZ3JhbW1hciwgcmVkIGZvciBzcGVsbGluZworICAgIC8vIFRoZXNlIG5lZWQgdG8g
YmVjb21lIGNvbmZpZ3VyYWJsZQorICAgIGlmIChncmFtbWFyKQorICAgICAgICBjYWlyb19zZXRf
c291cmNlX3JnYihjciwgMCwgMSwgMCk7CisgICAgZWxzZQorICAgICAgICBjYWlyb19zZXRfc291
cmNlX3JnYihjciwgMSwgMCwgMCk7CisKKyAgICAvLyBXZSBpZ25vcmUgbW9zdCBvZiB0aGUgcHJv
dmlkZWQgY29uc3RhbnRzIGluIGZhdm91ciBvZiB0aGUgcGxhdGZvcm0gc3R5bGUKKyAgICBwYW5n
b19jYWlyb19zaG93X2Vycm9yX3VuZGVybGluZShjciwgb3JpZ2luLngoKSwgb3JpZ2luLnkoKSwg
d2lkdGgsIGNNaXNzcGVsbGluZ0xpbmVUaGlja25lc3MpOworCisgICAgY2Fpcm9fcmVzdG9yZShj
cik7CisjZWxzZQorICAgIG5vdEltcGxlbWVudGVkKCk7CisjZW5kaWYKK30KKworRmxvYXRSZWN0
IEdyYXBoaWNzQ29udGV4dDo6cm91bmRUb0RldmljZVBpeGVscyhjb25zdCBGbG9hdFJlY3QmIGZy
ZWN0KQoreworICAgIEZsb2F0UmVjdCByZXN1bHQ7CisgICAgZG91YmxlIHggPSBmcmVjdC54KCk7
CisgICAgZG91YmxlIHkgPSBmcmVjdC55KCk7CisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNy
OworICAgIGNhaXJvX3VzZXJfdG9fZGV2aWNlKGNyLCAmeCwgJnkpOworICAgIHggPSByb3VuZCh4
KTsKKyAgICB5ID0gcm91bmQoeSk7CisgICAgY2Fpcm9fZGV2aWNlX3RvX3VzZXIoY3IsICZ4LCAm
eSk7CisgICAgcmVzdWx0LnNldFgoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHgpKTsKKyAgICByZXN1bHQu
c2V0WShzdGF0aWNfY2FzdDxmbG9hdD4oeSkpOworICAgIHggPSBmcmVjdC53aWR0aCgpOworICAg
IHkgPSBmcmVjdC5oZWlnaHQoKTsKKyAgICBjYWlyb191c2VyX3RvX2RldmljZV9kaXN0YW5jZShj
ciwgJngsICZ5KTsKKyAgICB4ID0gcm91bmQoeCk7CisgICAgeSA9IHJvdW5kKHkpOworICAgIGNh
aXJvX2RldmljZV90b191c2VyX2Rpc3RhbmNlKGNyLCAmeCwgJnkpOworICAgIHJlc3VsdC5zZXRX
aWR0aChzdGF0aWNfY2FzdDxmbG9hdD4oeCkpOworICAgIHJlc3VsdC5zZXRIZWlnaHQoc3RhdGlj
X2Nhc3Q8ZmxvYXQ+KHkpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIEdyYXBoaWNz
Q29udGV4dDo6dHJhbnNsYXRlKGZsb2F0IHgsIGZsb2F0IHkpCit7CisgICAgaWYgKHBhaW50aW5n
RGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEt
PmNyOworICAgIGNhaXJvX3RyYW5zbGF0ZShjciwgeCwgeSk7Cit9CisKK0ludFBvaW50IEdyYXBo
aWNzQ29udGV4dDo6b3JpZ2luKCkKK3sKKyAgICBjYWlyb19tYXRyaXhfdCBtYXRyaXg7CisgICAg
Y2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOworICAgIGNhaXJvX2dldF9tYXRyaXgoY3IsICZtYXRy
aXgpOworICAgIHJldHVybiBJbnRQb2ludChzdGF0aWNfY2FzdDxpbnQ+KG1hdHJpeC54MCksIHN0
YXRpY19jYXN0PGludD4obWF0cml4LnkwKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpz
ZXRQbGF0Zm9ybUZpbGxDb2xvcihjb25zdCBDb2xvciYgY29sKQoreworICAgIC8vIEZJWE1FOiB0
aGlzIGlzIHByb2JhYmx5IGEgbm8tb3AgYnV0IEknbSBub3Qgc3VyZQorICAgIC8vIG5vdEltcGxl
bWVudGVkKCk7IC8vIGNvbW1lbnRlZC1vdXQgYmVjYXVzZSBpdCdzIGNoYXR0eSBhbmQgY2x1dHRl
cnMgb3V0cHV0Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVN0cm9rZUNv
bG9yKGNvbnN0IENvbG9yJiBjb2wpCit7CisgICAgLy8gRklYTUU6IHRoaXMgaXMgcHJvYmFibHkg
YSBuby1vcCBidXQgSSdtIG5vdCBzdXJlCisgICAgLy9ub3RJbXBsZW1lbnRlZCgpOyAvLyBjb21t
ZW50ZWQtb3V0IGJlY2F1c2UgaXQncyBjaGF0dHkgYW5kIGNsdXR0ZXJzIG91dHB1dAorfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TdHJva2VUaGlja25lc3MoZmxvYXQgc3Ry
b2tlVGhpY2tuZXNzKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIGNhaXJvX3NldF9saW5lX3dpZHRoKG1fZGF0YS0+Y3IsIHN0cm9rZVRoaWNr
bmVzcyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVN0cm9rZVN0eWxl
KGNvbnN0IFN0cm9rZVN0eWxlJiBzdHJva2VTdHlsZSkKK3sKKyAgICBzdGF0aWMgZG91YmxlIGRh
c2hQYXR0ZXJuW10gPSB7NS4wLCA1LjB9OworICAgIHN0YXRpYyBkb3VibGUgZG90UGF0dGVybltd
ID0gezEuMCwgMS4wfTsKKworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIHN3aXRjaCAoc3Ryb2tlU3R5bGUpIHsKKyAgICBjYXNlIE5vU3Ryb2tlOgor
ICAgICAgICAvLyBGSVhNRTogaXMgaXQgdGhlIHJpZ2h0IHdheSB0byBlbXVsYXRlIE5vU3Ryb2tl
PworICAgICAgICBjYWlyb19zZXRfbGluZV93aWR0aChtX2RhdGEtPmNyLCAwKTsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBTb2xpZFN0cm9rZToKKyAgICAgICAgY2Fpcm9fc2V0X2Rhc2gobV9k
YXRhLT5jciwgMCwgMCwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRG90dGVkU3Ryb2tl
OgorICAgICAgICBjYWlyb19zZXRfZGFzaChtX2RhdGEtPmNyLCBkb3RQYXR0ZXJuLCAyLCAwKTsK
KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEYXNoZWRTdHJva2U6CisgICAgICAgIGNhaXJvX3Nl
dF9kYXNoKG1fZGF0YS0+Y3IsIGRhc2hQYXR0ZXJuLCAyLCAwKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgZGVmYXVsdDoKKyAgICAgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgfQorfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0VVJMRm9yUmVjdChjb25zdCBLVVJM
JiBsaW5rLCBjb25zdCBJbnRSZWN0JiBkZXN0UmVjdCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgp
OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5z
Zm9ybSYgdHJhbnNmb3JtKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAg
IHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBjb25zdCBjYWly
b19tYXRyaXhfdCogbWF0cml4ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYWlyb19tYXRyaXhf
dCo+KCZ0cmFuc2Zvcm0pOworICAgIGNhaXJvX3RyYW5zZm9ybShjciwgbWF0cml4KTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OmFkZElubmVyUm91bmRlZFJlY3RDbGlwKGNvbnN0IEludFJl
Y3QmIHJlY3QsIGludCB0aGlja25lc3MpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgY2xpcChyZWN0KTsKKworICAgIFBhdGggcDsKKyAgICBG
bG9hdFJlY3QgcihyZWN0KTsKKyAgICAvLyBBZGQgb3V0ZXIgZWxsaXBzZQorICAgIHAuYWRkRWxs
aXBzZShyKTsKKyAgICAvLyBBZGQgaW5uZXIgZWxsaXBzZQorICAgIHIuaW5mbGF0ZSgtdGhpY2tu
ZXNzKTsKKyAgICBwLmFkZEVsbGlwc2Uocik7CisgICAgYWRkUGF0aChwKTsKKworICAgIGNhaXJv
X3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBjYWlyb19maWxsX3J1bGVfdCBzYXZlZEZpbGxSdWxl
ID0gY2Fpcm9fZ2V0X2ZpbGxfcnVsZShjcik7CisgICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwg
Q0FJUk9fRklMTF9SVUxFX0VWRU5fT0REKTsKKyAgICBjYWlyb19jbGlwKGNyKTsKKyAgICBjYWly
b19zZXRfZmlsbF9ydWxlKGNyLCBzYXZlZEZpbGxSdWxlKTsKK30KKworCit2b2lkIEdyYXBoaWNz
Q29udGV4dDo6c2V0U2hhZG93KEludFNpemUgY29uc3QmLCBpbnQsIENvbG9yIGNvbnN0JikKK3sK
KyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xlYXJT
aGFkb3coKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250
ZXh0OjpiZWdpblRyYW5zcGFyZW5jeUxheWVyKGZsb2F0IG9wYWNpdHkpCit7CisgICAgaWYgKHBh
aW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fdCogY3IgPSBt
X2RhdGEtPmNyOworICAgIGNhaXJvX3B1c2hfZ3JvdXAoY3IpOworICAgIG1fZGF0YS0+bGF5ZXJz
LmFwcGVuZChvcGFjaXR5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmVuZFRyYW5zcGFy
ZW5jeUxheWVyKCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisKKyAgICBjYWlyb19wb3BfZ3Jv
dXBfdG9fc291cmNlKGNyKTsKKyAgICBjYWlyb19wYWludF93aXRoX2FscGhhKGNyLCBtX2RhdGEt
PmxheWVycy5sYXN0KCkpOworICAgIG1fZGF0YS0+bGF5ZXJzLnJlbW92ZUxhc3QoKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsZWFyUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7
CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fp
cm9fdCogY3IgPSBtX2RhdGEtPmNyOworCisgICAgY2Fpcm9fc2F2ZShjcik7CisgICAgY2Fpcm9f
cmVjdGFuZ2xlKGNyLCByZWN0LngoKSwgcmVjdC55KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWln
aHQoKSk7CisgICAgY2Fpcm9fc2V0X29wZXJhdG9yKGNyLCBDQUlST19PUEVSQVRPUl9DTEVBUik7
CisgICAgY2Fpcm9fZmlsbChjcik7CisgICAgY2Fpcm9fcmVzdG9yZShjcik7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0OjpzdHJva2VSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgZmxvYXQg
d2lkdGgpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOworICAgIGNhaXJvX3NhdmUoY3IpOworICAg
IGNhaXJvX3JlY3RhbmdsZShjciwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJl
Y3QuaGVpZ2h0KCkpOworICAgIHNldENvbG9yKGNyLCBzdHJva2VDb2xvcigpKTsKKyAgICBjYWly
b19zZXRfbGluZV93aWR0aChjciwgd2lkdGgpOworICAgIGNhaXJvX3N0cm9rZShjcik7CisgICAg
Y2Fpcm9fcmVzdG9yZShjcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRMaW5lQ2Fw
KExpbmVDYXAgbGluZUNhcCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBjYWlyb19saW5lX2NhcF90IGNhaXJvQ2FwID0gQ0FJUk9fTElORV9D
QVBfQlVUVDsKKyAgICBzd2l0Y2ggKGxpbmVDYXApIHsKKyAgICAgICAgY2FzZSBCdXR0Q2FwOgor
ICAgICAgICAgICAgLy8gbm8tb3AKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJv
dW5kQ2FwOgorICAgICAgICAgICAgY2Fpcm9DYXAgPSBDQUlST19MSU5FX0NBUF9ST1VORDsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNxdWFyZUNhcDoKKyAgICAgICAgICAgIGNh
aXJvQ2FwID0gQ0FJUk9fTElORV9DQVBfU1FVQVJFOworICAgICAgICAgICAgYnJlYWs7CisgICAg
fQorICAgIGNhaXJvX3NldF9saW5lX2NhcChtX2RhdGEtPmNyLCBjYWlyb0NhcCk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0OjpzZXRMaW5lSm9pbihMaW5lSm9pbiBsaW5lSm9pbikKK3sKKyAg
ICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb19s
aW5lX2pvaW5fdCBjYWlyb0pvaW4gPSBDQUlST19MSU5FX0pPSU5fTUlURVI7CisgICAgc3dpdGNo
IChsaW5lSm9pbikgeworICAgICAgICBjYXNlIE1pdGVySm9pbjoKKyAgICAgICAgICAgIC8vIG5v
LW9wCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSb3VuZEpvaW46CisgICAgICAg
ICAgICBjYWlyb0pvaW4gPSBDQUlST19MSU5FX0pPSU5fUk9VTkQ7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgY2FzZSBCZXZlbEpvaW46CisgICAgICAgICAgICBjYWlyb0pvaW4gPSBDQUlS
T19MSU5FX0pPSU5fQkVWRUw7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2Fpcm9f
c2V0X2xpbmVfam9pbihtX2RhdGEtPmNyLCBjYWlyb0pvaW4pOworfQorCit2b2lkIEdyYXBoaWNz
Q29udGV4dDo6c2V0TWl0ZXJMaW1pdChmbG9hdCBtaXRlcikKK3sKKyAgICBpZiAocGFpbnRpbmdE
aXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb19zZXRfbWl0ZXJfbGltaXQo
bV9kYXRhLT5jciwgbWl0ZXIpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0QWxwaGEo
ZmxvYXQpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworc3RhdGljIGlubGluZSBjYWly
b19vcGVyYXRvcl90IHRvQ2Fpcm9PcGVyYXRvcihDb21wb3NpdGVPcGVyYXRvciBvcCkKK3sKKyAg
ICBzd2l0Y2ggKG9wKSB7CisgICAgICAgIGNhc2UgQ29tcG9zaXRlQ2xlYXI6CisgICAgICAgICAg
ICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfQ0xFQVI7CisgICAgICAgIGNhc2UgQ29tcG9zaXRlQ29w
eToKKyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9TT1VSQ0U7CisgICAgICAgIGNh
c2UgQ29tcG9zaXRlU291cmNlT3ZlcjoKKyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRP
Ul9PVkVSOworICAgICAgICBjYXNlIENvbXBvc2l0ZVNvdXJjZUluOgorICAgICAgICAgICAgcmV0
dXJuIENBSVJPX09QRVJBVE9SX0lOOworICAgICAgICBjYXNlIENvbXBvc2l0ZVNvdXJjZU91dDoK
KyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9PVVQ7CisgICAgICAgIGNhc2UgQ29t
cG9zaXRlU291cmNlQXRvcDoKKyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9BVE9Q
OworICAgICAgICBjYXNlIENvbXBvc2l0ZURlc3RpbmF0aW9uT3ZlcjoKKyAgICAgICAgICAgIHJl
dHVybiBDQUlST19PUEVSQVRPUl9ERVNUX09WRVI7CisgICAgICAgIGNhc2UgQ29tcG9zaXRlRGVz
dGluYXRpb25JbjoKKyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9ERVNUX0lOOwor
ICAgICAgICBjYXNlIENvbXBvc2l0ZURlc3RpbmF0aW9uT3V0OgorICAgICAgICAgICAgcmV0dXJu
IENBSVJPX09QRVJBVE9SX0RFU1RfT1VUOworICAgICAgICBjYXNlIENvbXBvc2l0ZURlc3RpbmF0
aW9uQXRvcDoKKyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9ERVNUX0FUT1A7Cisg
ICAgICAgIGNhc2UgQ29tcG9zaXRlWE9SOgorICAgICAgICAgICAgcmV0dXJuIENBSVJPX09QRVJB
VE9SX1hPUjsKKyAgICAgICAgY2FzZSBDb21wb3NpdGVQbHVzRGFya2VyOgorICAgICAgICAgICAg
cmV0dXJuIENBSVJPX09QRVJBVE9SX1NBVFVSQVRFOworICAgICAgICBjYXNlIENvbXBvc2l0ZUhp
Z2hsaWdodDoKKyAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIENhaXJvIGVxdWl2YWxlbnQgZm9y
IENvbXBvc2l0ZUhpZ2hsaWdodC4KKyAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9P
VkVSOworICAgICAgICBjYXNlIENvbXBvc2l0ZVBsdXNMaWdodGVyOgorICAgICAgICAgICAgcmV0
dXJuIENBSVJPX09QRVJBVE9SX0FERDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJl
dHVybiBDQUlST19PUEVSQVRPUl9TT1VSQ0U7CisgICAgfQorfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6c2V0Q29tcG9zaXRlT3BlcmF0aW9uKENvbXBvc2l0ZU9wZXJhdG9yIG9wKQoreworICAg
IGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3Nl
dF9vcGVyYXRvcihtX2RhdGEtPmNyLCB0b0NhaXJvT3BlcmF0b3Iob3ApKTsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHQ6OmJlZ2luUGF0aCgpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQo
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOworICAg
IGNhaXJvX25ld19wYXRoKGNyKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmFkZFBhdGgo
Y29uc3QgUGF0aCYgcGF0aCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7CisgICAgY2Fpcm9fcGF0
aF90KiBwID0gY2Fpcm9fY29weV9wYXRoKHBhdGgucGxhdGZvcm1QYXRoKCktPm1fY3IpOworICAg
IGNhaXJvX2FwcGVuZF9wYXRoKGNyLCBwKTsKKyAgICBjYWlyb19wYXRoX2Rlc3Ryb3kocCk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwKGNvbnN0IFBhdGgmIHBhdGgpCit7CisgICAg
aWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fdCog
Y3IgPSBtX2RhdGEtPmNyOworICAgIGNhaXJvX3BhdGhfdCogcCA9IGNhaXJvX2NvcHlfcGF0aChw
YXRoLnBsYXRmb3JtUGF0aCgpLT5tX2NyKTsKKyAgICBjYWlyb19hcHBlbmRfcGF0aChjciwgcCk7
CisgICAgY2Fpcm9fcGF0aF9kZXN0cm95KHApOworICAgIGNhaXJvX2ZpbGxfcnVsZV90IHNhdmVk
RmlsbFJ1bGUgPSBjYWlyb19nZXRfZmlsbF9ydWxlKGNyKTsKKyAgICBjYWlyb19zZXRfZmlsbF9y
dWxlKGNyLCBDQUlST19GSUxMX1JVTEVfV0lORElORyk7CisgICAgY2Fpcm9fY2xpcChjcik7Cisg
ICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgc2F2ZWRGaWxsUnVsZSk7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpjbGlwT3V0KGNvbnN0IFBhdGgmIHBhdGgpCit7CisgICAgaWYgKHBhaW50
aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2Fpcm9fdCogY3IgPSBtX2Rh
dGEtPmNyOworICAgIGRvdWJsZSB4MSwgeTEsIHgyLCB5MjsKKyAgICBjYWlyb19jbGlwX2V4dGVu
dHMoY3IsICZ4MSwgJnkxLCAmeDIsICZ5Mik7CisgICAgY2Fpcm9fcmVjdGFuZ2xlKGNyLCB4MSwg
eTEsIHgyIC0geDEsIHkyIC0geTEpOworICAgIGFkZFBhdGgocGF0aCk7CisKKyAgICBjYWlyb19m
aWxsX3J1bGVfdCBzYXZlZEZpbGxSdWxlID0gY2Fpcm9fZ2V0X2ZpbGxfcnVsZShjcik7CisgICAg
Y2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgQ0FJUk9fRklMTF9SVUxFX0VWRU5fT0REKTsKKyAgICBj
YWlyb19jbGlwKGNyKTsKKyAgICBjYWlyb19zZXRfZmlsbF9ydWxlKGNyLCBzYXZlZEZpbGxSdWxl
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnJvdGF0ZShmbG9hdCByYWRpYW5zKQorewor
ICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJv
X3JvdGF0ZShtX2RhdGEtPmNyLCByYWRpYW5zKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6
OnNjYWxlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxl
ZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWlyb19zY2FsZShtX2RhdGEtPmNyLCBzaXpl
LndpZHRoKCksIHNpemUuaGVpZ2h0KCkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xp
cE91dChjb25zdCBJbnRSZWN0JiByKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKKyAgICBkb3Vi
bGUgeDEsIHkxLCB4MiwgeTI7CisgICAgY2Fpcm9fY2xpcF9leHRlbnRzKGNyLCAmeDEsICZ5MSwg
JngyLCAmeTIpOworICAgIGNhaXJvX3JlY3RhbmdsZShjciwgeDEsIHgyLCB4MiAtIHgxLCB5MiAt
IHkxKTsKKyAgICBjYWlyb19yZWN0YW5nbGUoY3IsIHIueCgpLCByLnkoKSwgci53aWR0aCgpLCBy
LmhlaWdodCgpKTsKKyAgICBjYWlyb19maWxsX3J1bGVfdCBzYXZlZEZpbGxSdWxlID0gY2Fpcm9f
Z2V0X2ZpbGxfcnVsZShjcik7CisgICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgQ0FJUk9fRklM
TF9SVUxFX0VWRU5fT0REKTsKKyAgICBjYWlyb19jbGlwKGNyKTsKKyAgICBjYWlyb19zZXRfZmls
bF9ydWxlKGNyLCBzYXZlZEZpbGxSdWxlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNs
aXBPdXRFbGxpcHNlSW5SZWN0KGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgaWYgKHBhaW50aW5n
RGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgUGF0aCBwOworICAgIHAuYWRkRWxs
aXBzZShyKTsKKyAgICBjbGlwT3V0KHApOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Zmls
bFJvdW5kZWRSZWN0KGNvbnN0IEludFJlY3QmIHIsIGNvbnN0IEludFNpemUmIHRvcExlZnQsIGNv
bnN0IEludFNpemUmIHRvcFJpZ2h0LCBjb25zdCBJbnRTaXplJiBib3R0b21MZWZ0LCBjb25zdCBJ
bnRTaXplJiBib3R0b21SaWdodCwgY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIGlmIChwYWlu
dGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNhaXJvX3QqIGNyID0gbV9k
YXRhLT5jcjsKKyAgICBjYWlyb19zYXZlKGNyKTsKKyAgICBiZWdpblBhdGgoKTsKKyAgICBhZGRQ
YXRoKFBhdGg6OmNyZWF0ZVJvdW5kZWRSZWN0YW5nbGUociwgdG9wTGVmdCwgdG9wUmlnaHQsIGJv
dHRvbUxlZnQsIGJvdHRvbVJpZ2h0KSk7CisgICAgc2V0Q29sb3IoY3IsIGNvbG9yKTsKKyAgICBj
YWlyb19maWxsKGNyKTsKKyAgICBjYWlyb19yZXN0b3JlKGNyKTsKK30KKworI2lmIFBMQVRGT1JN
KEdUSykKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRHZGtFeHBvc2VFdmVudChHZGtFdmVudEV4
cG9zZSogZXhwb3NlKQoreworICAgIG1fZGF0YS0+ZXhwb3NlID0gZXhwb3NlOworfQorCitHZGtF
dmVudEV4cG9zZSogR3JhcGhpY3NDb250ZXh0OjpnZGtFeHBvc2VFdmVudCgpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIG1fZGF0YS0+ZXhwb3NlOworfQorCitHZGtEcmF3YWJsZSogR3JhcGhpY3NDb250
ZXh0OjpnZGtEcmF3YWJsZSgpIGNvbnN0Cit7CisgICAgaWYgKCFtX2RhdGEtPmV4cG9zZSkKKyAg
ICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gR0RLX0RSQVdBQkxFKG1fZGF0YS0+ZXhwb3Nl
LT53aW5kb3cpOworfQorCitJbnRQb2ludCBHcmFwaGljc0NvbnRleHQ6OnRyYW5zbGF0ZVBvaW50
KGNvbnN0IEludFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAgICBjYWlyb19tYXRyaXhfdCB0bTsK
KyAgICBjYWlyb19nZXRfbWF0cml4KG1fZGF0YS0+Y3IsICZ0bSk7CisgICAgZG91YmxlIHggPSBw
b2ludC54KCk7CisgICAgZG91YmxlIHkgPSBwb2ludC55KCk7CisKKyAgICBjYWlyb19tYXRyaXhf
dHJhbnNmb3JtX3BvaW50KCZ0bSwgJngsICZ5KTsKKyAgICByZXR1cm4gSW50UG9pbnQoeCwgeSk7
Cit9CisjZW5kaWYKKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFVzZUFudGlhbGlhc2luZyhi
b29sIGVuYWJsZSkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1
cm47CisKKyAgICAvLyBXaGVuIHRydWUsIHVzZSB0aGUgZGVmYXVsdCBDYWlybyBiYWNrZW5kIGFu
dGlhbGlhcyBtb2RlICh1c3VhbGx5IHRoaXMKKyAgICAvLyBlbmFibGVzIHN0YW5kYXJkICdncmF5
c2NhbGUnIGFudGlhbGlhc2luZyk7IGZhbHNlIHRvIGV4cGxpY2l0bHkgZGlzYWJsZQorICAgIC8v
IGFudGlhbGlhc2luZy4gVGhpcyBpcyB0aGUgc2FtZSBzdHJhdGVneSBhcyB1c2VkIGluIGRyYXdD
b252ZXhQb2x5Z29uKCkuCisgICAgY2Fpcm9fc2V0X2FudGlhbGlhcyhtX2RhdGEtPmNyLCBlbmFi
bGUgPyBDQUlST19BTlRJQUxJQVNfREVGQVVMVCA6IENBSVJPX0FOVElBTElBU19OT05FKTsKK30K
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gUExBVEZPUk0oQ0FJUk8pCklu
ZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL0dyYXBoaWNzQ29udGV4dFBsYXRm
b3JtUHJpdmF0ZUNhaXJvLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jYWlyby9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVDYWlyby5oCShyZXZpc2lvbiAz
MDA0OCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vR3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlQ2Fpcm8uaAkod29ya2luZyBjb3B5KQpAQCAtMSw2ICsxLDcgQEAKIC8q
CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQWxwIFRva2VyIDxhbHBAYXRva2VyLmNv
bT4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBCcmVudCBGdWxnaGFtIDxiZnVsZ2hhbUBnbWFpbC5j
b20+CiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTIxLDkxMyArMjIsNjAgQEAK
ICAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKICAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAogICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCiAgKi8KIAotI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIkdy
YXBoaWNzQ29udGV4dC5oIgogCi0jaWYgUExBVEZPUk0oQ0FJUk8pCi0KLSNpbmNsdWRlICJBZmZp
bmVUcmFuc2Zvcm0uaCIKLSNpbmNsdWRlICJDYWlyb1BhdGguaCIKLSNpbmNsdWRlICJGbG9hdFJl
Y3QuaCIKLSNpbmNsdWRlICJGb250LmgiCi0jaW5jbHVkZSAiSW50UmVjdC5oIgotI2luY2x1ZGUg
Ik5vdEltcGxlbWVudGVkLmgiCi0jaW5jbHVkZSAiUGF0aC5oIgotI2luY2x1ZGUgIlNpbXBsZUZv
bnREYXRhLmgiCiAjaW5jbHVkZSA8Y2Fpcm8uaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVk
ZSA8c3RkaW8uaD4KICNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgogCi0jaWYgUExBVEZPUk0o
V0lOKQotI2luY2x1ZGUgPGNhaXJvLXdpbjMyLmg+Ci0jZW5kaWYKLQogI2lmIFBMQVRGT1JNKEdU
SykKICNpbmNsdWRlIDxnZGsvZ2RrLmg+CiAjaW5jbHVkZSA8cGFuZ28vcGFuZ28uaD4KLSNlbmRp
ZgotCi0KLSNpZm5kZWYgTV9QSQotI2RlZmluZSBNX1BJIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYK
KyNlbGlmIFBMQVRGT1JNKFdJTikKKyNpbmNsdWRlIDxjYWlyby13aW4zMi5oPgogI2VuZGlmCiAK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xhc3MgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2
YXRlIHsKIHB1YmxpYzoKLSAgICBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKTsKLSAg
ICB+R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKCk7Ci0KLSAgICBjYWlyb190KiBjcjsK
LSAgICBWZWN0b3I8ZmxvYXQ+IGxheWVyczsKLQorICAgIEdyYXBoaWNzQ29udGV4dFBsYXRmb3Jt
UHJpdmF0ZSgpCisgICAgICAgIDogIGNyKDApCiAjaWYgUExBVEZPUk0oR1RLKQotICAgIEdka0V2
ZW50RXhwb3NlKiBleHBvc2U7Ci0jZW5kaWYKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRD
b2xvcihjYWlyb190KiBjciwgY29uc3QgQ29sb3ImIGNvbCkKLXsKLSAgICBmbG9hdCByZWQsIGdy
ZWVuLCBibHVlLCBhbHBoYTsKLSAgICBjb2wuZ2V0UkdCQShyZWQsIGdyZWVuLCBibHVlLCBhbHBo
YSk7Ci0gICAgY2Fpcm9fc2V0X3NvdXJjZV9yZ2JhKGNyLCByZWQsIGdyZWVuLCBibHVlLCBhbHBo
YSk7Ci19Ci0KLS8vIEEgZmlsbFJlY3QgaGVscGVyCi1zdGF0aWMgaW5saW5lIHZvaWQgZmlsbFJl
Y3RTb3VyY2VPdmVyKGNhaXJvX3QqIGNyLCBjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0IENv
bG9yJiBjb2wpCi17Ci0gICAgc2V0Q29sb3IoY3IsIGNvbCk7Ci0gICAgY2Fpcm9fcmVjdGFuZ2xl
KGNyLCByZWN0LngoKSwgcmVjdC55KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7Ci0g
ICAgY2Fpcm9fc2V0X29wZXJhdG9yKGNyLCBDQUlST19PUEVSQVRPUl9PVkVSKTsKLSAgICBjYWly
b19maWxsKGNyKTsKLX0KLQotR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpHcmFwaGlj
c0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKQotICAgIDogIGNyKDApCi0jaWYgUExBVEZPUk0oR1RL
KQotICAgICwgZXhwb3NlKDApCi0jZW5kaWYKLXsKLX0KLQotR3JhcGhpY3NDb250ZXh0UGxhdGZv
cm1Qcml2YXRlOjp+R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKCkKLXsKLSAgICBjYWly
b19kZXN0cm95KGNyKTsKLX0KLQotI2lmIFBMQVRGT1JNKFdJTikKLUdyYXBoaWNzQ29udGV4dDo6
R3JhcGhpY3NDb250ZXh0KEhEQyBkYykKLSAgICA6IG1fY29tbW9uKGNyZWF0ZUdyYXBoaWNzQ29u
dGV4dFByaXZhdGUoKSkKLSAgICAsIG1fZGF0YShuZXcgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlKQotewotICAgIGlmIChkYykgewotICAgICAgICBjYWlyb19zdXJmYWNlX3QqIHN1cmZh
Y2UgPSBjYWlyb193aW4zMl9zdXJmYWNlX2NyZWF0ZShkYyk7Ci0gICAgICAgIG1fZGF0YS0+Y3Ig
PSBjYWlyb19jcmVhdGUoc3VyZmFjZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2V0UGFpbnRp
bmdEaXNhYmxlZCh0cnVlKTsKLSAgICAgICAgbV9kYXRhLT5jciA9IDA7Ci0gICAgfQotfQotI2Vu
ZGlmCi0KLUdyYXBoaWNzQ29udGV4dDo6R3JhcGhpY3NDb250ZXh0KFBsYXRmb3JtR3JhcGhpY3ND
b250ZXh0KiBjcikKLSAgICA6IG1fY29tbW9uKGNyZWF0ZUdyYXBoaWNzQ29udGV4dFByaXZhdGUo
KSkKLSAgICAsIG1fZGF0YShuZXcgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKQotewot
ICAgIG1fZGF0YS0+Y3IgPSBjYWlyb19yZWZlcmVuY2UoY3IpOwotICAgIHNldFBhaW50aW5nRGlz
YWJsZWQoIWNyKTsKLX0KLQotR3JhcGhpY3NDb250ZXh0Ojp+R3JhcGhpY3NDb250ZXh0KCkKLXsK
LSAgICBkZXN0cm95R3JhcGhpY3NDb250ZXh0UHJpdmF0ZShtX2NvbW1vbik7Ci0gICAgZGVsZXRl
IG1fZGF0YTsKLX0KLQotQWZmaW5lVHJhbnNmb3JtIEdyYXBoaWNzQ29udGV4dDo6Z2V0Q1RNKCkg
Y29uc3QKLXsKLSAgICBjYWlyb190KiBjciA9IHBsYXRmb3JtQ29udGV4dCgpOwotICAgIGNhaXJv
X21hdHJpeF90IG07Ci0gICAgY2Fpcm9fZ2V0X21hdHJpeChjciwgJm0pOwotICAgIHJldHVybiBt
OwotfQotCi1jYWlyb190KiBHcmFwaGljc0NvbnRleHQ6OnBsYXRmb3JtQ29udGV4dCgpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIG1fZGF0YS0+Y3I7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0Ojpz
YXZlUGxhdGZvcm1TdGF0ZSgpCi17Ci0gICAgY2Fpcm9fc2F2ZShtX2RhdGEtPmNyKTsKLX0KLQot
dm9pZCBHcmFwaGljc0NvbnRleHQ6OnJlc3RvcmVQbGF0Zm9ybVN0YXRlKCkKLXsKLSAgICBjYWly
b19yZXN0b3JlKG1fZGF0YS0+Y3IpOwotfQotCi0vLyBEcmF3cyBhIGZpbGxlZCByZWN0YW5nbGUg
d2l0aCBhIHN0cm9rZWQgYm9yZGVyLgotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdSZWN0KGNv
bnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotICAgIGNhaXJvX3Nh
dmUoY3IpOwotCi0gICAgaWYgKGZpbGxDb2xvcigpLmFscGhhKCkpCi0gICAgICAgIGZpbGxSZWN0
U291cmNlT3ZlcihjciwgcmVjdCwgZmlsbENvbG9yKCkpOwotCi0gICAgaWYgKHN0cm9rZVN0eWxl
KCkgIT0gTm9TdHJva2UpIHsKLSAgICAgICAgc2V0Q29sb3IoY3IsIHN0cm9rZUNvbG9yKCkpOwot
ICAgICAgICBGbG9hdFJlY3QgcihyZWN0KTsKLSAgICAgICAgci5pbmZsYXRlKC0uNWYpOwotICAg
ICAgICBjYWlyb19yZWN0YW5nbGUoY3IsIHIueCgpLCByLnkoKSwgci53aWR0aCgpLCByLmhlaWdo
dCgpKTsKLSAgICAgICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgoY3IsIDEuMCk7Ci0gICAgICAgIGNh
aXJvX3N0cm9rZShjcik7Ci0gICAgfQotCi0gICAgY2Fpcm9fcmVzdG9yZShjcik7Ci19Ci0KLS8v
IEZJWE1FOiBOb3cgdGhhdCB0aGlzIGlzIHJlZmFjdG9yZWQsIGl0IHNob3VsZCBiZSBzaGFyZWQg
YnkgYWxsIGNvbnRleHRzLgotc3RhdGljIHZvaWQgYWRqdXN0TGluZVRvUGl4ZWxCb3VuZGFyaWVz
KEZsb2F0UG9pbnQmIHAxLCBGbG9hdFBvaW50JiBwMiwgZmxvYXQgc3Ryb2tlV2lkdGgsIFN0cm9r
ZVN0eWxlIHN0eWxlKQotewotICAgIC8vIEZvciBvZGQgd2lkdGhzLCB3ZSBhZGQgaW4gMC41IHRv
IHRoZSBhcHByb3ByaWF0ZSB4L3kgc28gdGhhdCB0aGUgZmxvYXQgYXJpdGhtZXRpYwotICAgIC8v
IHdvcmtzIG91dC4gIEZvciBleGFtcGxlLCB3aXRoIGEgYm9yZGVyIHdpZHRoIG9mIDMsIEtIVE1M
IHdpbGwgcGFzcyB1cyAoeTEreTIpLzIsIGUuZy4sCi0gICAgLy8gKDUwKzUzKS8yID0gMTAzLzIg
PSA1MSB3aGVuIHdlIHdhbnQgNTEuNS4gIEl0IGlzIGFsd2F5cyB0cnVlIHRoYXQgYW4gZXZlbiB3
aWR0aCBnYXZlCi0gICAgLy8gdXMgYSBwZXJmZWN0IHBvc2l0aW9uLCBidXQgYW4gb2RkIHdpZHRo
IGdhdmUgdXMgYSBwb3NpdGlvbiB0aGF0IGlzIG9mZiBieSBleGFjdGx5IDAuNS4KLSAgICBpZiAo
c3R5bGUgPT0gRG90dGVkU3Ryb2tlIHx8IHN0eWxlID09IERhc2hlZFN0cm9rZSkgewotICAgICAg
ICBpZiAocDEueCgpID09IHAyLngoKSkgewotICAgICAgICAgICAgcDEuc2V0WShwMS55KCkgKyBz
dHJva2VXaWR0aCk7Ci0gICAgICAgICAgICBwMi5zZXRZKHAyLnkoKSAtIHN0cm9rZVdpZHRoKTsK
LSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHAxLnNldFgocDEueCgpICsg
c3Ryb2tlV2lkdGgpOwotICAgICAgICAgICAgcDIuc2V0WChwMi54KCkgLSBzdHJva2VXaWR0aCk7
Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihzdHJva2VXaWR0
aCkgJSAyKSB7Ci0gICAgICAgIGlmIChwMS54KCkgPT0gcDIueCgpKSB7Ci0gICAgICAgICAgICAv
LyBXZSdyZSBhIHZlcnRpY2FsIGxpbmUuICBBZGp1c3Qgb3VyIHguCi0gICAgICAgICAgICBwMS5z
ZXRYKHAxLngoKSArIDAuNSk7Ci0gICAgICAgICAgICBwMi5zZXRYKHAyLngoKSArIDAuNSk7Ci0g
ICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBXZSdyZSBhIGhvcml6b250
YWwgbGluZS4gQWRqdXN0IG91ciB5LgotICAgICAgICAgICAgcDEuc2V0WShwMS55KCkgKyAwLjUp
OwotICAgICAgICAgICAgcDIuc2V0WShwMi55KCkgKyAwLjUpOwotICAgICAgICB9Ci0gICAgfQot
fQotCi0vLyBUaGlzIGlzIG9ubHkgdXNlZCB0byBkcmF3IGJvcmRlcnMuCi12b2lkIEdyYXBoaWNz
Q29udGV4dDo6ZHJhd0xpbmUoY29uc3QgSW50UG9pbnQmIHBvaW50MSwgY29uc3QgSW50UG9pbnQm
IHBvaW50MikKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBTdHJva2VTdHlsZSBzdHlsZSA9IHN0cm9rZVN0eWxlKCk7Ci0gICAgaWYgKHN0eWxl
ID09IE5vU3Ryb2tlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0
YS0+Y3I7Ci0gICAgY2Fpcm9fc2F2ZShjcik7Ci0KLSAgICBmbG9hdCB3aWR0aCA9IHN0cm9rZVRo
aWNrbmVzcygpOwotICAgIGlmICh3aWR0aCA8IDEpCi0gICAgICAgIHdpZHRoID0gMTsKLQotICAg
IEZsb2F0UG9pbnQgcDEgPSBwb2ludDE7Ci0gICAgRmxvYXRQb2ludCBwMiA9IHBvaW50MjsKLSAg
ICBib29sIGlzVmVydGljYWxMaW5lID0gKHAxLngoKSA9PSBwMi54KCkpOwotCi0gICAgYWRqdXN0
TGluZVRvUGl4ZWxCb3VuZGFyaWVzKHAxLCBwMiwgd2lkdGgsIHN0eWxlKTsKLSAgICBjYWlyb19z
ZXRfbGluZV93aWR0aChjciwgd2lkdGgpOwotCi0gICAgaW50IHBhdFdpZHRoID0gMDsKLSAgICBz
d2l0Y2ggKHN0eWxlKSB7Ci0gICAgY2FzZSBOb1N0cm9rZToKLSAgICBjYXNlIFNvbGlkU3Ryb2tl
OgotICAgICAgICBicmVhazsKLSAgICBjYXNlIERvdHRlZFN0cm9rZToKLSAgICAgICAgcGF0V2lk
dGggPSBzdGF0aWNfY2FzdDxpbnQ+KHdpZHRoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBE
YXNoZWRTdHJva2U6Ci0gICAgICAgIHBhdFdpZHRoID0gMypzdGF0aWNfY2FzdDxpbnQ+KHdpZHRo
KTsKLSAgICAgICAgYnJlYWs7CisgICAgICAgICwgZXhwb3NlKDApCisjZWxpZiBQTEFURk9STShX
SU4pCisgICAgICAgIC8vIE5PVEU6ICBUaGVzZSBtYXkgbm90ZSBiZSBuZWVkZWQ6IHJldmlldyBh
bmQgcmVtb3ZlIG9uY2UgQ2Fpcm8gaW1wbGVtZW50YXRpb24gaXMgY29tcGxldGUKKyAgICAgICAg
LCBtX2hkYygwKQorICAgICAgICAsIG1fdHJhbnNwYXJlbmN5Q291bnQoMCkKKyNlbmRpZgorICAg
IHsKICAgICB9CiAKLSAgICBzZXRDb2xvcihjciwgc3Ryb2tlQ29sb3IoKSk7Ci0KLSAgICBjYWly
b19zZXRfYW50aWFsaWFzKGNyLCBDQUlST19BTlRJQUxJQVNfTk9ORSk7Ci0KLSAgICBpZiAocGF0
V2lkdGgpIHsKLSAgICAgICAgLy8gRG8gYSByZWN0IGZpbGwgb2Ygb3VyIGVuZHBvaW50cy4gIFRo
aXMgZW5zdXJlcyB3ZSBhbHdheXMgaGF2ZSB0aGUKLSAgICAgICAgLy8gYXBwZWFyYW5jZSBvZiBi
ZWluZyBhIGJvcmRlci4gIFdlIHRoZW4gZHJhdyB0aGUgYWN0dWFsIGRvdHRlZC9kYXNoZWQgbGlu
ZS4KLSAgICAgICAgaWYgKGlzVmVydGljYWxMaW5lKSB7Ci0gICAgICAgICAgICBmaWxsUmVjdFNv
dXJjZU92ZXIoY3IsIEZsb2F0UmVjdChwMS54KCkgLSB3aWR0aC8yLCBwMS55KCkgLSB3aWR0aCwg
d2lkdGgsIHdpZHRoKSwgc3Ryb2tlQ29sb3IoKSk7Ci0gICAgICAgICAgICBmaWxsUmVjdFNvdXJj
ZU92ZXIoY3IsIEZsb2F0UmVjdChwMi54KCkgLSB3aWR0aC8yLCBwMi55KCksIHdpZHRoLCB3aWR0
aCksIHN0cm9rZUNvbG9yKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmlsbFJl
Y3RTb3VyY2VPdmVyKGNyLCBGbG9hdFJlY3QocDEueCgpIC0gd2lkdGgsIHAxLnkoKSAtIHdpZHRo
LzIsIHdpZHRoLCB3aWR0aCksIHN0cm9rZUNvbG9yKCkpOwotICAgICAgICAgICAgZmlsbFJlY3RT
b3VyY2VPdmVyKGNyLCBGbG9hdFJlY3QocDIueCgpLCBwMi55KCkgLSB3aWR0aC8yLCB3aWR0aCwg
d2lkdGgpLCBzdHJva2VDb2xvcigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEV4YW1wbGU6
IDgwIHBpeGVscyB3aXRoIGEgd2lkdGggb2YgMzAgcGl4ZWxzLgotICAgICAgICAvLyBSZW1haW5k
ZXIgaXMgMjAuICBUaGUgbWF4aW11bSBwaXhlbHMgb2YgbGluZSB3ZSBjb3VsZCBwYWludAotICAg
ICAgICAvLyB3aWxsIGJlIDUwIHBpeGVscy4KLSAgICAgICAgaW50IGRpc3RhbmNlID0gKGlzVmVy
dGljYWxMaW5lID8gKHBvaW50Mi55KCkgLSBwb2ludDEueSgpKSA6IChwb2ludDIueCgpIC0gcG9p
bnQxLngoKSkpIC0gMipzdGF0aWNfY2FzdDxpbnQ+KHdpZHRoKTsKLSAgICAgICAgaW50IHJlbWFp
bmRlciA9IGRpc3RhbmNlJXBhdFdpZHRoOwotICAgICAgICBpbnQgY292ZXJhZ2UgPSBkaXN0YW5j
ZS1yZW1haW5kZXI7Ci0gICAgICAgIGludCBudW1TZWdtZW50cyA9IGNvdmVyYWdlL3BhdFdpZHRo
OwotCi0gICAgICAgIGZsb2F0IHBhdHRlcm5PZmZzZXQgPSAwOwotICAgICAgICAvLyBTcGVjaWFs
IGNhc2UgMXB4IGRvdHRlZCBib3JkZXJzIGZvciBzcGVlZC4KLSAgICAgICAgaWYgKHBhdFdpZHRo
ID09IDEpCi0gICAgICAgICAgICBwYXR0ZXJuT2Zmc2V0ID0gMS4wOwotICAgICAgICBlbHNlIHsK
LSAgICAgICAgICAgIGJvb2wgZXZlbk51bWJlck9mU2VnbWVudHMgPSBudW1TZWdtZW50cyUyID09
IDA7Ci0gICAgICAgICAgICBpZiAocmVtYWluZGVyKQotICAgICAgICAgICAgICAgIGV2ZW5OdW1i
ZXJPZlNlZ21lbnRzID0gIWV2ZW5OdW1iZXJPZlNlZ21lbnRzOwotICAgICAgICAgICAgaWYgKGV2
ZW5OdW1iZXJPZlNlZ21lbnRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbWFpbmRlcikgewot
ICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuT2Zmc2V0ICs9IHBhdFdpZHRoIC0gcmVtYWluZGVy
OwotICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuT2Zmc2V0ICs9IHJlbWFpbmRlci8yOwotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAg
IHBhdHRlcm5PZmZzZXQgPSBwYXRXaWR0aC8yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAg
ZWxzZSBpZiAoIWV2ZW5OdW1iZXJPZlNlZ21lbnRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJl
bWFpbmRlcikKLSAgICAgICAgICAgICAgICAgICAgcGF0dGVybk9mZnNldCA9IChwYXRXaWR0aCAt
IHJlbWFpbmRlcikvMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGRvdWJs
ZSBkYXNoID0gcGF0V2lkdGg7Ci0gICAgICAgIGNhaXJvX3NldF9kYXNoKGNyLCAmZGFzaCwgMSwg
cGF0dGVybk9mZnNldCk7CisgICAgfkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpCisg
ICAgeworICAgICAgICBjYWlyb19kZXN0cm95KGNyKTsKICAgICB9CiAKLSAgICBjYWlyb19tb3Zl
X3RvKGNyLCBwMS54KCksIHAxLnkoKSk7Ci0gICAgY2Fpcm9fbGluZV90byhjciwgcDIueCgpLCBw
Mi55KCkpOwotCi0gICAgY2Fpcm9fc3Ryb2tlKGNyKTsKLSAgICBjYWlyb19yZXN0b3JlKGNyKTsK
LX0KLQotLy8gVGhpcyBtZXRob2QgaXMgb25seSB1c2VkIHRvIGRyYXcgdGhlIGxpdHRsZSBjaXJj
bGVzIHVzZWQgaW4gbGlzdHMuCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0VsbGlwc2UoY29u
c3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fc2F2
ZShjcik7Ci0gICAgZmxvYXQgeVJhZGl1cyA9IC41ICogcmVjdC5oZWlnaHQoKTsKLSAgICBmbG9h
dCB4UmFkaXVzID0gLjUgKiByZWN0LndpZHRoKCk7Ci0gICAgY2Fpcm9fdHJhbnNsYXRlKGNyLCBy
ZWN0LngoKSArIHhSYWRpdXMsIHJlY3QueSgpICsgeVJhZGl1cyk7Ci0gICAgY2Fpcm9fc2NhbGUo
Y3IsIHhSYWRpdXMsIHlSYWRpdXMpOwotICAgIGNhaXJvX2FyYyhjciwgMC4sIDAuLCAxLiwgMC4s
IDIgKiBNX1BJKTsKLSAgICBjYWlyb19yZXN0b3JlKGNyKTsKLQotICAgIGlmIChmaWxsQ29sb3Io
KS5hbHBoYSgpKSB7Ci0gICAgICAgIHNldENvbG9yKGNyLCBmaWxsQ29sb3IoKSk7Ci0gICAgICAg
IGNhaXJvX2ZpbGxfcHJlc2VydmUoY3IpOwotICAgIH0KLQotICAgIGlmIChzdHJva2VTdHlsZSgp
ICE9IE5vU3Ryb2tlKSB7Ci0gICAgICAgIHNldENvbG9yKGNyLCBzdHJva2VDb2xvcigpKTsKLSAg
ICAgICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgoY3IsIHN0cm9rZVRoaWNrbmVzcygpKTsKLSAgICAg
ICAgY2Fpcm9fc3Ryb2tlKGNyKTsKLSAgICB9Ci0KLSAgICBjYWlyb19uZXdfcGF0aChjcik7Ci19
Ci0KLS8vIEZJWE1FOiBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIGFkanVzdGVkIHRvIG1hdGNo
IHRoZSBmdW5jdGlvbmFsaXR5IG9uIHRoZSBNYWMgc2lkZS4KLXZvaWQgR3JhcGhpY3NDb250ZXh0
OjpzdHJva2VBcmMoY29uc3QgSW50UmVjdCYgcmVjdCwgaW50IHN0YXJ0QW5nbGUsIGludCBhbmds
ZVNwYW4pCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgaWYgKHN0cm9rZVN0eWxlKCkgPT0gTm9TdHJva2UpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIGludCB4ID0gcmVjdC54KCk7Ci0gICAgaW50IHkgPSByZWN0LnkoKTsKLSAgICBmbG9hdCB3
ID0gcmVjdC53aWR0aCgpOwotI2lmIDAgLy8gRklYTUU6IHVudXNlZCBzbyBmYXIKLSAgICBmbG9h
dCBoID0gcmVjdC5oZWlnaHQoKTsKLSAgICBmbG9hdCBzY2FsZUZhY3RvciA9IGggLyB3OwotICAg
IGZsb2F0IHJldmVyc2VTY2FsZUZhY3RvciA9IHcgLyBoOwotI2VuZGlmCi0gICAgZmxvYXQgciA9
IHcgLyAyOwotICAgIGZsb2F0IGZhID0gc3RhcnRBbmdsZTsKLSAgICBmbG9hdCBmYWxlbiA9ICBm
YSArIGFuZ2xlU3BhbjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLSAgICBjYWly
b19zYXZlKGNyKTsKLSAgICBjYWlyb19hcmNfbmVnYXRpdmUoY3IsIHggKyByLCB5ICsgciwgciwg
LWZhICogTV9QSS8xODAsIC1mYWxlbiAqIE1fUEkvMTgwKTsKLSAgICBzZXRDb2xvcihjciwgc3Ry
b2tlQ29sb3IoKSk7Ci0gICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgoY3IsIHN0cm9rZVRoaWNrbmVz
cygpKTsKLSAgICBjYWlyb19zdHJva2UoY3IpOwotICAgIGNhaXJvX3Jlc3RvcmUoY3IpOwotfQot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0NvbnZleFBvbHlnb24oc2l6ZV90IG5wb2ludHMs
IGNvbnN0IEZsb2F0UG9pbnQqIHBvaW50cywgYm9vbCBzaG91bGRBbnRpYWxpYXMpCi17Ci0gICAg
aWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKG5wb2lu
dHMgPD0gMSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNy
OwotCi0gICAgY2Fpcm9fc2F2ZShjcik7Ci0gICAgY2Fpcm9fc2V0X2FudGlhbGlhcyhjciwgc2hv
dWxkQW50aWFsaWFzID8gQ0FJUk9fQU5USUFMSUFTX0RFRkFVTFQgOiBDQUlST19BTlRJQUxJQVNf
Tk9ORSk7Ci0gICAgY2Fpcm9fbW92ZV90byhjciwgcG9pbnRzWzBdLngoKSwgcG9pbnRzWzBdLnko
KSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBucG9pbnRzOyBpKyspCi0gICAgICAgIGNh
aXJvX2xpbmVfdG8oY3IsIHBvaW50c1tpXS54KCksIHBvaW50c1tpXS55KCkpOwotICAgIGNhaXJv
X2Nsb3NlX3BhdGgoY3IpOwotCi0gICAgaWYgKGZpbGxDb2xvcigpLmFscGhhKCkpIHsKLSAgICAg
ICAgc2V0Q29sb3IoY3IsIGZpbGxDb2xvcigpKTsKLSAgICAgICAgY2Fpcm9fc2V0X2ZpbGxfcnVs
ZShjciwgQ0FJUk9fRklMTF9SVUxFX0VWRU5fT0REKTsKLSAgICAgICAgY2Fpcm9fZmlsbF9wcmVz
ZXJ2ZShjcik7Ci0gICAgfQotCi0gICAgaWYgKHN0cm9rZVN0eWxlKCkgIT0gTm9TdHJva2UpIHsK
LSAgICAgICAgc2V0Q29sb3IoY3IsIHN0cm9rZUNvbG9yKCkpOwotICAgICAgICBjYWlyb19zZXRf
bGluZV93aWR0aChjciwgc3Ryb2tlVGhpY2tuZXNzKCkpOwotICAgICAgICBjYWlyb19zdHJva2Uo
Y3IpOwotICAgIH0KLQotICAgIGNhaXJvX25ld19wYXRoKGNyKTsKLSAgICBjYWlyb19yZXN0b3Jl
KGNyKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxSZWN0KGNvbnN0IEludFJlY3Qm
IHJlY3QsIGNvbnN0IENvbG9yJiBjb2xvcikKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgp
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoY29sb3IuYWxwaGEoKSkKLSAgICAgICAgZmls
bFJlY3RTb3VyY2VPdmVyKG1fZGF0YS0+Y3IsIHJlY3QsIGNvbG9yKTsKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQ6OmZpbGxSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgY29uc3QgQ29sb3Im
IGNvbG9yKQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsK
LQotICAgIGlmIChjb2xvci5hbHBoYSgpKQotICAgICAgICBmaWxsUmVjdFNvdXJjZU92ZXIobV9k
YXRhLT5jciwgcmVjdCwgY29sb3IpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcChj
b25zdCBJbnRSZWN0JiByZWN0KQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLSAgICBjYWlyb19y
ZWN0YW5nbGUoY3IsIHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdo
dCgpKTsKLSAgICBjYWlyb19maWxsX3J1bGVfdCBzYXZlZEZpbGxSdWxlID0gY2Fpcm9fZ2V0X2Zp
bGxfcnVsZShjcik7Ci0gICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgQ0FJUk9fRklMTF9SVUxF
X1dJTkRJTkcpOwotICAgIGNhaXJvX2NsaXAoY3IpOwotICAgIGNhaXJvX3NldF9maWxsX3J1bGUo
Y3IsIHNhdmVkRmlsbFJ1bGUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0ZvY3Vz
UmluZyhjb25zdCBDb2xvciYgY29sb3IpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgaW50IHJhZGl1cyA9IChmb2N1c1JpbmdXaWR0aCgpIC0g
MSkgLyAyOwotICAgIGludCBvZmZzZXQgPSByYWRpdXMgKyBmb2N1c1JpbmdPZmZzZXQoKTsKLQot
ICAgIGNvbnN0IFZlY3RvcjxJbnRSZWN0PiYgcmVjdHMgPSBmb2N1c1JpbmdSZWN0cygpOwotICAg
IHVuc2lnbmVkIHJlY3RDb3VudCA9IHJlY3RzLnNpemUoKTsKLSAgICBJbnRSZWN0IGZpbmFsRm9j
dXNSZWN0OwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCByZWN0Q291bnQ7IGkrKykgewot
ICAgICAgICBJbnRSZWN0IGZvY3VzUmVjdCA9IHJlY3RzW2ldOwotICAgICAgICBmb2N1c1JlY3Qu
aW5mbGF0ZShvZmZzZXQpOwotICAgICAgICBmaW5hbEZvY3VzUmVjdC51bml0ZShmb2N1c1JlY3Qp
OwotICAgIH0KLQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLSAgICBjYWlyb19zYXZl
KGNyKTsKLSAgICAvLyBGSVhNRTogVGhlc2UgcmVjdHMgc2hvdWxkIGJlIHJvdW5kZWQKLSAgICBj
YWlyb19yZWN0YW5nbGUoY3IsIGZpbmFsRm9jdXNSZWN0LngoKSwgZmluYWxGb2N1c1JlY3QueSgp
LCBmaW5hbEZvY3VzUmVjdC53aWR0aCgpLCBmaW5hbEZvY3VzUmVjdC5oZWlnaHQoKSk7Ci0KLSAg
ICAvLyBGb3JjZSB0aGUgYWxwaGEgdG8gNTAlLiAgVGhpcyBtYXRjaGVzIHdoYXQgdGhlIE1hYyBk
b2VzIHdpdGggb3V0bGluZSByaW5ncy4KLSAgICBDb2xvciByaW5nQ29sb3IoY29sb3IucmVkKCks
IGNvbG9yLmdyZWVuKCksIGNvbG9yLmJsdWUoKSwgMTI3KTsKLSAgICBzZXRDb2xvcihjciwgcmlu
Z0NvbG9yKTsKLSAgICBjYWlyb19zdHJva2UoY3IpOwotICAgIGNhaXJvX3Jlc3RvcmUoY3IpOwot
fQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JUZXh0KGNvbnN0IEludFBvaW50
JiBvcmlnaW4sIGludCB3aWR0aCwgYm9vbCBwcmludGluZykKLXsKLSAgICBpZiAocGFpbnRpbmdE
aXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBUaGlzIGlzIGEgd29ya2Fyb3Vu
ZCBmb3IgaHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU2NTkKLSAgICBT
dHJva2VTdHlsZSBzYXZlZFN0cm9rZVN0eWxlID0gc3Ryb2tlU3R5bGUoKTsKLSAgICBzZXRTdHJv
a2VTdHlsZShTb2xpZFN0cm9rZSk7Ci0KLSAgICBJbnRQb2ludCBlbmRQb2ludCA9IG9yaWdpbiAr
IEludFNpemUod2lkdGgsIDApOwotICAgIGRyYXdMaW5lKG9yaWdpbiwgZW5kUG9pbnQpOwotCi0g
ICAgc2V0U3Ryb2tlU3R5bGUoc2F2ZWRTdHJva2VTdHlsZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3ND
b250ZXh0OjpkcmF3TGluZUZvck1pc3NwZWxsaW5nT3JCYWRHcmFtbWFyKGNvbnN0IEludFBvaW50
JiBvcmlnaW4sIGludCB3aWR0aCwgYm9vbCBncmFtbWFyKQotewotICAgIGlmIChwYWludGluZ0Rp
c2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotI2lmIFBMQVRGT1JNKEdUSykKLSAgICBjYWly
b190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fc2F2ZShjcik7Ci0KLSAgICAvLyBDb252
ZW50aW9uIGlzIGdyZWVuIGZvciBncmFtbWFyLCByZWQgZm9yIHNwZWxsaW5nCi0gICAgLy8gVGhl
c2UgbmVlZCB0byBiZWNvbWUgY29uZmlndXJhYmxlCi0gICAgaWYgKGdyYW1tYXIpCi0gICAgICAg
IGNhaXJvX3NldF9zb3VyY2VfcmdiKGNyLCAwLCAxLCAwKTsKLSAgICBlbHNlCi0gICAgICAgIGNh
aXJvX3NldF9zb3VyY2VfcmdiKGNyLCAxLCAwLCAwKTsKLQotICAgIC8vIFdlIGlnbm9yZSBtb3N0
IG9mIHRoZSBwcm92aWRlZCBjb25zdGFudHMgaW4gZmF2b3VyIG9mIHRoZSBwbGF0Zm9ybSBzdHls
ZQotICAgIHBhbmdvX2NhaXJvX3Nob3dfZXJyb3JfdW5kZXJsaW5lKGNyLCBvcmlnaW4ueCgpLCBv
cmlnaW4ueSgpLCB3aWR0aCwgY01pc3NwZWxsaW5nTGluZVRoaWNrbmVzcyk7Ci0KLSAgICBjYWly
b19yZXN0b3JlKGNyKTsKLSNlbHNlCi0gICAgbm90SW1wbGVtZW50ZWQoKTsKKyNpZiBQTEFURk9S
TShXSU4pCisgICAgLy8gT24gV2luZG93cywgd2UgbmVlZCB0byB1cGRhdGUgdGhlIEhEQyBmb3Ig
Zm9ybSBjb250cm9scyB0byBkcmF3IGluIHRoZSByaWdodCBwbGFjZS4KKyAgICB2b2lkIGJlZ2lu
VHJhbnNwYXJlbmN5TGF5ZXIoKSB7IG1fdHJhbnNwYXJlbmN5Q291bnQrKzsgfQorICAgIHZvaWQg
ZW5kVHJhbnNwYXJlbmN5TGF5ZXIoKSB7IG1fdHJhbnNwYXJlbmN5Q291bnQtLTsgfQogI2VuZGlm
Ci19Ci0KLUZsb2F0UmVjdCBHcmFwaGljc0NvbnRleHQ6OnJvdW5kVG9EZXZpY2VQaXhlbHMoY29u
c3QgRmxvYXRSZWN0JiBmcmVjdCkKLXsKLSAgICBGbG9hdFJlY3QgcmVzdWx0OwotICAgIGRvdWJs
ZSB4ID0gZnJlY3QueCgpOwotICAgIGRvdWJsZSB5ID0gZnJlY3QueSgpOwotICAgIGNhaXJvX3Qq
IGNyID0gbV9kYXRhLT5jcjsKLSAgICBjYWlyb191c2VyX3RvX2RldmljZShjciwgJngsICZ5KTsK
LSAgICB4ID0gcm91bmQoeCk7Ci0gICAgeSA9IHJvdW5kKHkpOwotICAgIGNhaXJvX2RldmljZV90
b191c2VyKGNyLCAmeCwgJnkpOwotICAgIHJlc3VsdC5zZXRYKHN0YXRpY19jYXN0PGZsb2F0Pih4
KSk7Ci0gICAgcmVzdWx0LnNldFkoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHkpKTsKLSAgICB4ID0gZnJl
Y3Qud2lkdGgoKTsKLSAgICB5ID0gZnJlY3QuaGVpZ2h0KCk7Ci0gICAgY2Fpcm9fdXNlcl90b19k
ZXZpY2VfZGlzdGFuY2UoY3IsICZ4LCAmeSk7Ci0gICAgeCA9IHJvdW5kKHgpOwotICAgIHkgPSBy
b3VuZCh5KTsKLSAgICBjYWlyb19kZXZpY2VfdG9fdXNlcl9kaXN0YW5jZShjciwgJngsICZ5KTsK
LSAgICByZXN1bHQuc2V0V2lkdGgoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHgpKTsKLSAgICByZXN1bHQu
c2V0SGVpZ2h0KHN0YXRpY19jYXN0PGZsb2F0Pih5KSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5KQotewot
ICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJv
X3QqIGNyID0gbV9kYXRhLT5jcjsKLSAgICBjYWlyb190cmFuc2xhdGUoY3IsIHgsIHkpOwotfQot
Ci1JbnRQb2ludCBHcmFwaGljc0NvbnRleHQ6Om9yaWdpbigpCi17Ci0gICAgY2Fpcm9fbWF0cml4
X3QgbWF0cml4OwotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLSAgICBjYWlyb19nZXRf
bWF0cml4KGNyLCAmbWF0cml4KTsKLSAgICByZXR1cm4gSW50UG9pbnQoc3RhdGljX2Nhc3Q8aW50
PihtYXRyaXgueDApLCBzdGF0aWNfY2FzdDxpbnQ+KG1hdHJpeC55MCkpOwotfQotCi12b2lkIEdy
YXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1GaWxsQ29sb3IoY29uc3QgQ29sb3ImIGNvbCkKLXsK
LSAgICAvLyBGSVhNRTogdGhpcyBpcyBwcm9iYWJseSBhIG5vLW9wIGJ1dCBJJ20gbm90IHN1cmUK
LSAgICAvLyBub3RJbXBsZW1lbnRlZCgpOyAvLyBjb21tZW50ZWQtb3V0IGJlY2F1c2UgaXQncyBj
aGF0dHkgYW5kIGNsdXR0ZXJzIG91dHB1dAotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0
UGxhdGZvcm1TdHJva2VDb2xvcihjb25zdCBDb2xvciYgY29sKQotewotICAgIC8vIEZJWE1FOiB0
aGlzIGlzIHByb2JhYmx5IGEgbm8tb3AgYnV0IEknbSBub3Qgc3VyZQotICAgIC8vbm90SW1wbGVt
ZW50ZWQoKTsgLy8gY29tbWVudGVkLW91dCBiZWNhdXNlIGl0J3MgY2hhdHR5IGFuZCBjbHV0dGVy
cyBvdXRwdXQKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtU3Ryb2tlVGhp
Y2tuZXNzKGZsb2F0IHN0cm9rZVRoaWNrbmVzcykKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxl
ZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjYWlyb19zZXRfbGluZV93aWR0aChtX2RhdGEt
PmNyLCBzdHJva2VUaGlja25lc3MpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxh
dGZvcm1TdHJva2VTdHlsZShjb25zdCBTdHJva2VTdHlsZSYgc3Ryb2tlU3R5bGUpCi17Ci0gICAg
c3RhdGljIGRvdWJsZSBkYXNoUGF0dGVybltdID0gezUuMCwgNS4wfTsKLSAgICBzdGF0aWMgZG91
YmxlIGRvdFBhdHRlcm5bXSA9IHsxLjAsIDEuMH07Ci0KLSAgICBpZiAocGFpbnRpbmdEaXNhYmxl
ZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBzd2l0Y2ggKHN0cm9rZVN0eWxlKSB7Ci0gICAg
Y2FzZSBOb1N0cm9rZToKLSAgICAgICAgLy8gRklYTUU6IGlzIGl0IHRoZSByaWdodCB3YXkgdG8g
ZW11bGF0ZSBOb1N0cm9rZT8KLSAgICAgICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgobV9kYXRhLT5j
ciwgMCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgU29saWRTdHJva2U6Ci0gICAgICAgIGNh
aXJvX3NldF9kYXNoKG1fZGF0YS0+Y3IsIDAsIDAsIDApOwotICAgICAgICBicmVhazsKLSAgICBj
YXNlIERvdHRlZFN0cm9rZToKLSAgICAgICAgY2Fpcm9fc2V0X2Rhc2gobV9kYXRhLT5jciwgZG90
UGF0dGVybiwgMiwgMCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRGFzaGVkU3Ryb2tlOgot
ICAgICAgICBjYWlyb19zZXRfZGFzaChtX2RhdGEtPmNyLCBkYXNoUGF0dGVybiwgMiwgMCk7Ci0g
ICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIG5vdEltcGxlbWVudGVkKCk7Ci0g
ICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFVSTEZv
clJlY3QoY29uc3QgS1VSTCYgbGluaywgY29uc3QgSW50UmVjdCYgZGVzdFJlY3QpCi17Ci0gICAg
bm90SW1wbGVtZW50ZWQoKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNvbmNhdENUTShj
b25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNh
YmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7
Ci0gICAgY29uc3QgY2Fpcm9fbWF0cml4X3QqIG1hdHJpeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29u
c3QgY2Fpcm9fbWF0cml4X3QqPigmdHJhbnNmb3JtKTsKLSAgICBjYWlyb190cmFuc2Zvcm0oY3Is
IG1hdHJpeCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjphZGRJbm5lclJvdW5kZWRSZWN0
Q2xpcChjb25zdCBJbnRSZWN0JiByZWN0LCBpbnQgdGhpY2tuZXNzKQotewotICAgIGlmIChwYWlu
dGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNsaXAocmVjdCk7Ci0KLSAg
ICBQYXRoIHA7Ci0gICAgRmxvYXRSZWN0IHIocmVjdCk7Ci0gICAgLy8gQWRkIG91dGVyIGVsbGlw
c2UKLSAgICBwLmFkZEVsbGlwc2Uocik7Ci0gICAgLy8gQWRkIGlubmVyIGVsbGlwc2UKLSAgICBy
LmluZmxhdGUoLXRoaWNrbmVzcyk7Ci0gICAgcC5hZGRFbGxpcHNlKHIpOwotICAgIGFkZFBhdGgo
cCk7Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fZmlsbF9ydWxl
X3Qgc2F2ZWRGaWxsUnVsZSA9IGNhaXJvX2dldF9maWxsX3J1bGUoY3IpOwotICAgIGNhaXJvX3Nl
dF9maWxsX3J1bGUoY3IsIENBSVJPX0ZJTExfUlVMRV9FVkVOX09ERCk7Ci0gICAgY2Fpcm9fY2xp
cChjcik7Ci0gICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgc2F2ZWRGaWxsUnVsZSk7Ci19Ci0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFNoYWRvdyhJbnRTaXplIGNvbnN0JiwgaW50LCBD
b2xvciBjb25zdCYpCi17Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLX0KLQotdm9pZCBHcmFwaGlj
c0NvbnRleHQ6OmNsZWFyU2hhZG93KCkKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDo6YmVnaW5UcmFuc3BhcmVuY3lMYXllcihmbG9hdCBvcGFjaXR5
KQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAg
IGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLSAgICBjYWlyb19wdXNoX2dyb3VwKGNyKTsKLSAg
ICBtX2RhdGEtPmxheWVycy5hcHBlbmQob3BhY2l0eSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0OjplbmRUcmFuc3BhcmVuY3lMYXllcigpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQo
KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNyOwotCi0g
ICAgY2Fpcm9fcG9wX2dyb3VwX3RvX3NvdXJjZShjcik7Ci0gICAgY2Fpcm9fcGFpbnRfd2l0aF9h
bHBoYShjciwgbV9kYXRhLT5sYXllcnMubGFzdCgpKTsKLSAgICBtX2RhdGEtPmxheWVycy5yZW1v
dmVMYXN0KCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGVhclJlY3QoY29uc3QgRmxv
YXRSZWN0JiByZWN0KQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLQotICAgIGNhaXJvX3NhdmUo
Y3IpOwotICAgIGNhaXJvX3JlY3RhbmdsZShjciwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0Lndp
ZHRoKCksIHJlY3QuaGVpZ2h0KCkpOwotICAgIGNhaXJvX3NldF9vcGVyYXRvcihjciwgQ0FJUk9f
T1BFUkFUT1JfQ0xFQVIpOwotICAgIGNhaXJvX2ZpbGwoY3IpOwotICAgIGNhaXJvX3Jlc3RvcmUo
Y3IpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6c3Ryb2tlUmVjdChjb25zdCBGbG9hdFJl
Y3QmIHJlY3QsIGZsb2F0IHdpZHRoKQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLSAgICBjYWly
b19zYXZlKGNyKTsKLSAgICBjYWlyb19yZWN0YW5nbGUoY3IsIHJlY3QueCgpLCByZWN0LnkoKSwg
cmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKLSAgICBzZXRDb2xvcihjciwgc3Ryb2tlQ29s
b3IoKSk7Ci0gICAgY2Fpcm9fc2V0X2xpbmVfd2lkdGgoY3IsIHdpZHRoKTsKLSAgICBjYWlyb19z
dHJva2UoY3IpOwotICAgIGNhaXJvX3Jlc3RvcmUoY3IpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDo6c2V0TGluZUNhcChMaW5lQ2FwIGxpbmVDYXApCi17Ci0gICAgaWYgKHBhaW50aW5nRGlz
YWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fbGluZV9jYXBfdCBjYWlyb0Nh
cCA9IENBSVJPX0xJTkVfQ0FQX0JVVFQ7Ci0gICAgc3dpdGNoIChsaW5lQ2FwKSB7Ci0gICAgICAg
IGNhc2UgQnV0dENhcDoKLSAgICAgICAgICAgIC8vIG5vLW9wCi0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgY2FzZSBSb3VuZENhcDoKLSAgICAgICAgICAgIGNhaXJvQ2FwID0gQ0FJUk9fTElO
RV9DQVBfUk9VTkQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTcXVhcmVDYXA6
Ci0gICAgICAgICAgICBjYWlyb0NhcCA9IENBSVJPX0xJTkVfQ0FQX1NRVUFSRTsKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgIH0KLSAgICBjYWlyb19zZXRfbGluZV9jYXAobV9kYXRhLT5jciwgY2Fp
cm9DYXApOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0TGluZUpvaW4oTGluZUpvaW4g
bGluZUpvaW4pCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgY2Fpcm9fbGluZV9qb2luX3QgY2Fpcm9Kb2luID0gQ0FJUk9fTElORV9KT0lOX01J
VEVSOwotICAgIHN3aXRjaCAobGluZUpvaW4pIHsKLSAgICAgICAgY2FzZSBNaXRlckpvaW46Ci0g
ICAgICAgICAgICAvLyBuby1vcAotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUm91
bmRKb2luOgotICAgICAgICAgICAgY2Fpcm9Kb2luID0gQ0FJUk9fTElORV9KT0lOX1JPVU5EOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQmV2ZWxKb2luOgotICAgICAgICAgICAg
Y2Fpcm9Kb2luID0gQ0FJUk9fTElORV9KT0lOX0JFVkVMOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgfQotICAgIGNhaXJvX3NldF9saW5lX2pvaW4obV9kYXRhLT5jciwgY2Fpcm9Kb2luKTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldE1pdGVyTGltaXQoZmxvYXQgbWl0ZXIpCi17Ci0g
ICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9f
c2V0X21pdGVyX2xpbWl0KG1fZGF0YS0+Y3IsIG1pdGVyKTsKLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQ6OnNldEFscGhhKGZsb2F0KQotewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci19Ci0KLXN0
YXRpYyBpbmxpbmUgY2Fpcm9fb3BlcmF0b3JfdCB0b0NhaXJvT3BlcmF0b3IoQ29tcG9zaXRlT3Bl
cmF0b3Igb3ApCi17Ci0gICAgc3dpdGNoIChvcCkgewotICAgICAgICBjYXNlIENvbXBvc2l0ZUNs
ZWFyOgotICAgICAgICAgICAgcmV0dXJuIENBSVJPX09QRVJBVE9SX0NMRUFSOwotICAgICAgICBj
YXNlIENvbXBvc2l0ZUNvcHk6Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfU09V
UkNFOwotICAgICAgICBjYXNlIENvbXBvc2l0ZVNvdXJjZU92ZXI6Ci0gICAgICAgICAgICByZXR1
cm4gQ0FJUk9fT1BFUkFUT1JfT1ZFUjsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VJbjoK
LSAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9JTjsKLSAgICAgICAgY2FzZSBDb21w
b3NpdGVTb3VyY2VPdXQ6Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfT1VUOwot
ICAgICAgICBjYXNlIENvbXBvc2l0ZVNvdXJjZUF0b3A6Ci0gICAgICAgICAgICByZXR1cm4gQ0FJ
Uk9fT1BFUkFUT1JfQVRPUDsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlvbk92ZXI6
Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfREVTVF9PVkVSOwotICAgICAgICBj
YXNlIENvbXBvc2l0ZURlc3RpbmF0aW9uSW46Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BF
UkFUT1JfREVTVF9JTjsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlvbk91dDoKLSAg
ICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9ERVNUX09VVDsKLSAgICAgICAgY2FzZSBD
b21wb3NpdGVEZXN0aW5hdGlvbkF0b3A6Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFU
T1JfREVTVF9BVE9QOwotICAgICAgICBjYXNlIENvbXBvc2l0ZVhPUjoKLSAgICAgICAgICAgIHJl
dHVybiBDQUlST19PUEVSQVRPUl9YT1I7Ci0gICAgICAgIGNhc2UgQ29tcG9zaXRlUGx1c0Rhcmtl
cjoKLSAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9TQVRVUkFURTsKLSAgICAgICAg
Y2FzZSBDb21wb3NpdGVIaWdobGlnaHQ6Ci0gICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBDYWly
byBlcXVpdmFsZW50IGZvciBDb21wb3NpdGVIaWdobGlnaHQuCi0gICAgICAgICAgICByZXR1cm4g
Q0FJUk9fT1BFUkFUT1JfT1ZFUjsKLSAgICAgICAgY2FzZSBDb21wb3NpdGVQbHVzTGlnaHRlcjoK
LSAgICAgICAgICAgIHJldHVybiBDQUlST19PUEVSQVRPUl9BREQ7Ci0gICAgICAgIGRlZmF1bHQ6
Ci0gICAgICAgICAgICByZXR1cm4gQ0FJUk9fT1BFUkFUT1JfU09VUkNFOwotICAgIH0KLX0KIAot
dm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldENvbXBvc2l0ZU9wZXJhdGlvbihDb21wb3NpdGVPcGVy
YXRvciBvcCkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBjYWlyb19zZXRfb3BlcmF0b3IobV9kYXRhLT5jciwgdG9DYWlyb09wZXJhdG9yKG9w
KSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpiZWdpblBhdGgoKQotewotICAgIGlmIChw
YWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNhaXJvX3QqIGNyID0g
bV9kYXRhLT5jcjsKLSAgICBjYWlyb19uZXdfcGF0aChjcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3ND
b250ZXh0OjphZGRQYXRoKGNvbnN0IFBhdGgmIHBhdGgpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlz
YWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fdCogY3IgPSBtX2RhdGEtPmNy
OwotICAgIGNhaXJvX3BhdGhfdCogcCA9IGNhaXJvX2NvcHlfcGF0aChwYXRoLnBsYXRmb3JtUGF0
aCgpLT5tX2NyKTsKLSAgICBjYWlyb19hcHBlbmRfcGF0aChjciwgcCk7Ci0gICAgY2Fpcm9fcGF0
aF9kZXN0cm95KHApOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcChjb25zdCBQYXRo
JiBwYXRoKQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsK
LQotICAgIGNhaXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLSAgICBjYWlyb19wYXRoX3QqIHAgPSBj
YWlyb19jb3B5X3BhdGgocGF0aC5wbGF0Zm9ybVBhdGgoKS0+bV9jcik7Ci0gICAgY2Fpcm9fYXBw
ZW5kX3BhdGgoY3IsIHApOwotICAgIGNhaXJvX3BhdGhfZGVzdHJveShwKTsKLSAgICBjYWlyb19m
aWxsX3J1bGVfdCBzYXZlZEZpbGxSdWxlID0gY2Fpcm9fZ2V0X2ZpbGxfcnVsZShjcik7Ci0gICAg
Y2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgQ0FJUk9fRklMTF9SVUxFX1dJTkRJTkcpOwotICAgIGNh
aXJvX2NsaXAoY3IpOwotICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIHNhdmVkRmlsbFJ1bGUp
OwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcE91dChjb25zdCBQYXRoJiBwYXRoKQot
ewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNh
aXJvX3QqIGNyID0gbV9kYXRhLT5jcjsKLSAgICBkb3VibGUgeDEsIHkxLCB4MiwgeTI7Ci0gICAg
Y2Fpcm9fY2xpcF9leHRlbnRzKGNyLCAmeDEsICZ5MSwgJngyLCAmeTIpOwotICAgIGNhaXJvX3Jl
Y3RhbmdsZShjciwgeDEsIHkxLCB4MiAtIHgxLCB5MiAtIHkxKTsKLSAgICBhZGRQYXRoKHBhdGgp
OwotCi0gICAgY2Fpcm9fZmlsbF9ydWxlX3Qgc2F2ZWRGaWxsUnVsZSA9IGNhaXJvX2dldF9maWxs
X3J1bGUoY3IpOwotICAgIGNhaXJvX3NldF9maWxsX3J1bGUoY3IsIENBSVJPX0ZJTExfUlVMRV9F
VkVOX09ERCk7Ci0gICAgY2Fpcm9fY2xpcChjcik7Ci0gICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShj
ciwgc2F2ZWRGaWxsUnVsZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0Ojpyb3RhdGUoZmxv
YXQgcmFkaWFucykKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBjYWlyb19yb3RhdGUobV9kYXRhLT5jciwgcmFkaWFucyk7Ci19Ci0KLXZvaWQg
R3JhcGhpY3NDb250ZXh0OjpzY2FsZShjb25zdCBGbG9hdFNpemUmIHNpemUpCi17Ci0gICAgaWYg
KHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2Fpcm9fc2NhbGUo
bV9kYXRhLT5jciwgc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpKTsKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQ6OmNsaXBPdXQoY29uc3QgSW50UmVjdCYgcikKLXsKLSAgICBpZiAocGFpbnRp
bmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjYWlyb190KiBjciA9IG1fZGF0
YS0+Y3I7Ci0gICAgZG91YmxlIHgxLCB5MSwgeDIsIHkyOwotICAgIGNhaXJvX2NsaXBfZXh0ZW50
cyhjciwgJngxLCAmeTEsICZ4MiwgJnkyKTsKLSAgICBjYWlyb19yZWN0YW5nbGUoY3IsIHgxLCB4
MiwgeDIgLSB4MSwgeTIgLSB5MSk7Ci0gICAgY2Fpcm9fcmVjdGFuZ2xlKGNyLCByLngoKSwgci55
KCksIHIud2lkdGgoKSwgci5oZWlnaHQoKSk7Ci0gICAgY2Fpcm9fZmlsbF9ydWxlX3Qgc2F2ZWRG
aWxsUnVsZSA9IGNhaXJvX2dldF9maWxsX3J1bGUoY3IpOwotICAgIGNhaXJvX3NldF9maWxsX3J1
bGUoY3IsIENBSVJPX0ZJTExfUlVMRV9FVkVOX09ERCk7Ci0gICAgY2Fpcm9fY2xpcChjcik7Ci0g
ICAgY2Fpcm9fc2V0X2ZpbGxfcnVsZShjciwgc2F2ZWRGaWxsUnVsZSk7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpjbGlwT3V0RWxsaXBzZUluUmVjdChjb25zdCBJbnRSZWN0JiByKQotewot
ICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFBhdGgg
cDsKLSAgICBwLmFkZEVsbGlwc2Uocik7Ci0gICAgY2xpcE91dChwKTsKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQ6OmZpbGxSb3VuZGVkUmVjdChjb25zdCBJbnRSZWN0JiByLCBjb25zdCBJbnRT
aXplJiB0b3BMZWZ0LCBjb25zdCBJbnRTaXplJiB0b3BSaWdodCwgY29uc3QgSW50U2l6ZSYgYm90
dG9tTGVmdCwgY29uc3QgSW50U2l6ZSYgYm90dG9tUmlnaHQsIGNvbnN0IENvbG9yJiBjb2xvcikK
LXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBj
YWlyb190KiBjciA9IG1fZGF0YS0+Y3I7Ci0gICAgY2Fpcm9fc2F2ZShjcik7Ci0gICAgYmVnaW5Q
YXRoKCk7Ci0gICAgYWRkUGF0aChQYXRoOjpjcmVhdGVSb3VuZGVkUmVjdGFuZ2xlKHIsIHRvcExl
ZnQsIHRvcFJpZ2h0LCBib3R0b21MZWZ0LCBib3R0b21SaWdodCkpOwotICAgIHNldENvbG9yKGNy
LCBjb2xvcik7Ci0gICAgY2Fpcm9fZmlsbChjcik7Ci0gICAgY2Fpcm9fcmVzdG9yZShjcik7Ci19
CisgICAgY2Fpcm9fdCogY3I7CisgICAgVmVjdG9yPGZsb2F0PiBsYXllcnM7CiAKICNpZiBQTEFU
Rk9STShHVEspCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0R2RrRXhwb3NlRXZlbnQoR2RrRXZl
bnRFeHBvc2UqIGV4cG9zZSkKLXsKLSAgICBtX2RhdGEtPmV4cG9zZSA9IGV4cG9zZTsKLX0KLQot
R2RrRXZlbnRFeHBvc2UqIEdyYXBoaWNzQ29udGV4dDo6Z2RrRXhwb3NlRXZlbnQoKSBjb25zdAot
ewotICAgIHJldHVybiBtX2RhdGEtPmV4cG9zZTsKLX0KLQotR2RrRHJhd2FibGUqIEdyYXBoaWNz
Q29udGV4dDo6Z2RrRHJhd2FibGUoKSBjb25zdAotewotICAgIGlmICghbV9kYXRhLT5leHBvc2Up
Ci0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIEdES19EUkFXQUJMRShtX2RhdGEtPmV4
cG9zZS0+d2luZG93KTsKLX0KLQotSW50UG9pbnQgR3JhcGhpY3NDb250ZXh0Ojp0cmFuc2xhdGVQ
b2ludChjb25zdCBJbnRQb2ludCYgcG9pbnQpIGNvbnN0Ci17Ci0gICAgY2Fpcm9fbWF0cml4X3Qg
dG07Ci0gICAgY2Fpcm9fZ2V0X21hdHJpeChtX2RhdGEtPmNyLCAmdG0pOwotICAgIGRvdWJsZSB4
ID0gcG9pbnQueCgpOwotICAgIGRvdWJsZSB5ID0gcG9pbnQueSgpOwotCi0gICAgY2Fpcm9fbWF0
cml4X3RyYW5zZm9ybV9wb2ludCgmdG0sICZ4LCAmeSk7Ci0gICAgcmV0dXJuIEludFBvaW50KHgs
IHkpOwotfQorICAgIEdka0V2ZW50RXhwb3NlKiBleHBvc2U7CisjZWxpZiBQTEFURk9STShXSU4p
CisgICAgSERDIG1faGRjOworICAgIHVuc2lnbmVkIG1fdHJhbnNwYXJlbmN5Q291bnQ7CiAjZW5k
aWYKLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFVzZUFudGlhbGlhc2luZyhib29sIGVuYWJs
ZSkKLXsKLSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICAvLyBXaGVuIHRydWUsIHVzZSB0aGUgZGVmYXVsdCBDYWlybyBiYWNrZW5kIGFudGlhbGlhcyBt
b2RlICh1c3VhbGx5IHRoaXMKLSAgICAvLyBlbmFibGVzIHN0YW5kYXJkICdncmF5c2NhbGUnIGFu
dGlhbGlhc2luZyk7IGZhbHNlIHRvIGV4cGxpY2l0bHkgZGlzYWJsZQotICAgIC8vIGFudGlhbGlh
c2luZy4gVGhpcyBpcyB0aGUgc2FtZSBzdHJhdGVneSBhcyB1c2VkIGluIGRyYXdDb252ZXhQb2x5
Z29uKCkuCi0gICAgY2Fpcm9fc2V0X2FudGlhbGlhcyhtX2RhdGEtPmNyLCBlbmFibGUgPyBDQUlS
T19BTlRJQUxJQVNfREVGQVVMVCA6IENBSVJPX0FOVElBTElBU19OT05FKTsKLX0KK307CiAKIH0g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKIAotI2VuZGlmIC8vIFBMQVRGT1JNKENBSVJPKQpJbmRleDog
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHRDRy5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHRDRy5j
cHAJKHJldmlzaW9uIDMwMDQ4KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9HcmFw
aGljc0NvbnRleHRDRy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3LDExICsyNyw5IEBACiAjaW5j
bHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCiAKLSNpZiBQTEFU
Rk9STShDRykKLQogI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgogI2luY2x1ZGUgIkZsb2F0
Q29udmVyc2lvbi5oIgotI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZS5o
IgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZUNHLmgiCiAjaW5jbHVk
ZSAiS1VSTC5oIgogI2luY2x1ZGUgIlBhdGguaCIKICNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ0dQ
REZDb250ZXh0Lmg+CkBAIC04Myw3ICs4MSw3IEBAIENHQ29udGV4dFJlZiBHcmFwaGljc0NvbnRl
eHQ6OnBsYXRmb3JtQ28KIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpzYXZlUGxhdGZvcm1TdGF0ZSgp
CiB7CiAgICAgLy8gTm90ZTogRG8gbm90IHVzZSB0aGlzIGZ1bmN0aW9uIHdpdGhpbiB0aGlzIGNs
YXNzIGltcGxlbWVudGF0aW9uLCBzaW5jZSB3ZSB3YW50IHRvIGF2b2lkIHRoZSBleHRyYQotICAg
IC8vIHNhdmUgb2YgdGhlIHNlY29uZGFyeSBjb250ZXh0IChpbiBHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGUuaCkuCisgICAgLy8gc2F2ZSBvZiB0aGUgc2Vjb25kYXJ5IGNvbnRleHQgKGlu
IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZUNHLmgpLgogICAgIENHQ29udGV4dFNhdmVH
U3RhdGUocGxhdGZvcm1Db250ZXh0KCkpOwogICAgIG1fZGF0YS0+c2F2ZSgpOwogfQpAQCAtOTEs
NyArODksNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2F2ZVBsYXRmb3JtU3RhdGUoCiB2b2lk
IEdyYXBoaWNzQ29udGV4dDo6cmVzdG9yZVBsYXRmb3JtU3RhdGUoKQogewogICAgIC8vIE5vdGU6
IERvIG5vdCB1c2UgdGhpcyBmdW5jdGlvbiB3aXRoaW4gdGhpcyBjbGFzcyBpbXBsZW1lbnRhdGlv
biwgc2luY2Ugd2Ugd2FudCB0byBhdm9pZCB0aGUgZXh0cmEKLSAgICAvLyByZXN0b3JlIG9mIHRo
ZSBzZWNvbmRhcnkgY29udGV4dCAoaW4gR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmgp
LgorICAgIC8vIHJlc3RvcmUgb2YgdGhlIHNlY29uZGFyeSBjb250ZXh0IChpbiBHcmFwaGljc0Nv
bnRleHRQbGF0Zm9ybVByaXZhdGVDRy5oKS4KICAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKHBs
YXRmb3JtQ29udGV4dCgpKTsKICAgICBtX2RhdGEtPnJlc3RvcmUoKTsKICAgICBtX2RhdGEtPm1f
dXNlclRvRGV2aWNlVHJhbnNmb3JtS25vd25Ub0JlSWRlbnRpdHkgPSBmYWxzZTsKQEAgLTkzMCw0
ICs5MjgsMyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0Q29tcG9zaXRlT3BlcmF0CiAgICAg
CiB9CiAKLSNlbmRpZiAvLyBQTEFURk9STShDRykKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvY2cvR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZh
dGUuaAkocmV2aXNpb24gMzAwNDgpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NnL0dy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDg1ICsw
LDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0
OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0g
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
Ci0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0g
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKLSAqLwotCi0jaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NHQ29udGV4dC5o
PgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLWNsYXNzIEdyYXBoaWNzQ29udGV4dFBsYXRmb3Jt
UHJpdmF0ZSB7Ci1wdWJsaWM6Ci0gICAgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKENH
Q29udGV4dFJlZiBjZ0NvbnRleHQpCi0gICAgICAgIDogbV9jZ0NvbnRleHQoY2dDb250ZXh0KQot
I2lmIFBMQVRGT1JNKFdJTikKLSAgICAgICAgLCBtX2hkYygwKQotICAgICAgICAsIG1fdHJhbnNw
YXJlbmN5Q291bnQoMCkKLSNlbmRpZgotICAgICAgICAsIG1fdXNlclRvRGV2aWNlVHJhbnNmb3Jt
S25vd25Ub0JlSWRlbnRpdHkoZmFsc2UpCi0gICAgewotICAgICAgICBDR0NvbnRleHRSZXRhaW4o
bV9jZ0NvbnRleHQpOwotICAgIH0KLSAgICAKLSAgICB+R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlKCkKLSAgICB7Ci0gICAgICAgIENHQ29udGV4dFJlbGVhc2UobV9jZ0NvbnRleHQpOwot
ICAgIH0KLQotI2lmIFBMQVRGT1JNKE1BQykKLSAgICAvLyBUaGVzZSBtZXRob2RzIGRvIG5vdGhp
bmcgb24gTWFjLgotICAgIHZvaWQgc2F2ZSgpIHt9Ci0gICAgdm9pZCByZXN0b3JlKCkge30KLSAg
ICB2b2lkIGNsaXAoY29uc3QgSW50UmVjdCYpIHt9Ci0gICAgdm9pZCBjbGlwKGNvbnN0IFBhdGgm
KSB7fQotICAgIHZvaWQgc2NhbGUoY29uc3QgRmxvYXRTaXplJikge30KLSAgICB2b2lkIHJvdGF0
ZShmbG9hdCkge30KLSAgICB2b2lkIHRyYW5zbGF0ZShmbG9hdCwgZmxvYXQpIHt9Ci0gICAgdm9p
ZCBjb25jYXRDVE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJikge30KLSAgICB2b2lkIGJlZ2luVHJh
bnNwYXJlbmN5TGF5ZXIoKSB7fQotICAgIHZvaWQgZW5kVHJhbnNwYXJlbmN5TGF5ZXIoKSB7fQot
I2VuZGlmCi0KLSNpZiBQTEFURk9STShXSU4pCi0gICAgLy8gT24gV2luZG93cywgd2UgbmVlZCB0
byB1cGRhdGUgdGhlIEhEQyBmb3IgZm9ybSBjb250cm9scyB0byBkcmF3IGluIHRoZSByaWdodCBw
bGFjZS4KLSAgICB2b2lkIHNhdmUoKTsKLSAgICB2b2lkIHJlc3RvcmUoKTsKLSAgICB2b2lkIGNs
aXAoY29uc3QgSW50UmVjdCYpOwotICAgIHZvaWQgY2xpcChjb25zdCBQYXRoJik7Ci0gICAgdm9p
ZCBzY2FsZShjb25zdCBGbG9hdFNpemUmKTsKLSAgICB2b2lkIHJvdGF0ZShmbG9hdCk7Ci0gICAg
dm9pZCB0cmFuc2xhdGUoZmxvYXQsIGZsb2F0KTsKLSAgICB2b2lkIGNvbmNhdENUTShjb25zdCBB
ZmZpbmVUcmFuc2Zvcm0mKTsKLSAgICB2b2lkIGJlZ2luVHJhbnNwYXJlbmN5TGF5ZXIoKSB7IG1f
dHJhbnNwYXJlbmN5Q291bnQrKzsgfQotICAgIHZvaWQgZW5kVHJhbnNwYXJlbmN5TGF5ZXIoKSB7
IG1fdHJhbnNwYXJlbmN5Q291bnQtLTsgfQotI2VuZGlmCi0KLSNpZiBQTEFURk9STShXSU4pCi0g
ICAgSERDIG1faGRjOwotICAgIHVuc2lnbmVkIG1fdHJhbnNwYXJlbmN5Q291bnQ7Ci0jZW5kaWYK
LQotICAgIENHQ29udGV4dFJlZiBtX2NnQ29udGV4dDsKLSAgICBib29sIG1fdXNlclRvRGV2aWNl
VHJhbnNmb3JtS25vd25Ub0JlSWRlbnRpdHk7Ci19OwotCi19CkluZGV4OiBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2NnL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZUNHLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGVDRy5oCShyZXZpc2lvbiAyOTcyNikJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9jZy9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUuaDoyOTcyNikKKysrIFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRl
Q0cuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lu
Y2x1ZGUgPENvcmVHcmFwaGljcy9DR0NvbnRleHQuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgewor
CitjbGFzcyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUgeworcHVibGljOgorICAgIEdy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZShDR0NvbnRleHRSZWYgY2dDb250ZXh0KQorICAg
ICAgICA6IG1fY2dDb250ZXh0KGNnQ29udGV4dCkKKyNpZiBQTEFURk9STShXSU4pCisgICAgICAg
ICwgbV9oZGMoMCkKKyAgICAgICAgLCBtX3RyYW5zcGFyZW5jeUNvdW50KDApCisjZW5kaWYKKyAg
ICAgICAgLCBtX3VzZXJUb0RldmljZVRyYW5zZm9ybUtub3duVG9CZUlkZW50aXR5KGZhbHNlKQor
ICAgIHsKKyAgICAgICAgQ0dDb250ZXh0UmV0YWluKG1fY2dDb250ZXh0KTsKKyAgICB9CisgICAg
CisgICAgfkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSgpCisgICAgeworICAgICAgICBD
R0NvbnRleHRSZWxlYXNlKG1fY2dDb250ZXh0KTsKKyAgICB9CisKKyNpZiBQTEFURk9STShNQUMp
CisgICAgLy8gVGhlc2UgbWV0aG9kcyBkbyBub3RoaW5nIG9uIE1hYy4KKyAgICB2b2lkIHNhdmUo
KSB7fQorICAgIHZvaWQgcmVzdG9yZSgpIHt9CisgICAgdm9pZCBjbGlwKGNvbnN0IEludFJlY3Qm
KSB7fQorICAgIHZvaWQgY2xpcChjb25zdCBQYXRoJikge30KKyAgICB2b2lkIHNjYWxlKGNvbnN0
IEZsb2F0U2l6ZSYpIHt9CisgICAgdm9pZCByb3RhdGUoZmxvYXQpIHt9CisgICAgdm9pZCB0cmFu
c2xhdGUoZmxvYXQsIGZsb2F0KSB7fQorICAgIHZvaWQgY29uY2F0Q1RNKGNvbnN0IEFmZmluZVRy
YW5zZm9ybSYpIHt9CisgICAgdm9pZCBiZWdpblRyYW5zcGFyZW5jeUxheWVyKCkge30KKyAgICB2
b2lkIGVuZFRyYW5zcGFyZW5jeUxheWVyKCkge30KKyNlbmRpZgorCisjaWYgUExBVEZPUk0oV0lO
KQorICAgIC8vIE9uIFdpbmRvd3MsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBIREMgZm9yIGZvcm0g
Y29udHJvbHMgdG8gZHJhdyBpbiB0aGUgcmlnaHQgcGxhY2UuCisgICAgdm9pZCBzYXZlKCk7Cisg
ICAgdm9pZCByZXN0b3JlKCk7CisgICAgdm9pZCBjbGlwKGNvbnN0IEludFJlY3QmKTsKKyAgICB2
b2lkIGNsaXAoY29uc3QgUGF0aCYpOworICAgIHZvaWQgc2NhbGUoY29uc3QgRmxvYXRTaXplJik7
CisgICAgdm9pZCByb3RhdGUoZmxvYXQpOworICAgIHZvaWQgdHJhbnNsYXRlKGZsb2F0LCBmbG9h
dCk7CisgICAgdm9pZCBjb25jYXRDVE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJik7CisgICAgdm9p
ZCBiZWdpblRyYW5zcGFyZW5jeUxheWVyKCkgeyBtX3RyYW5zcGFyZW5jeUNvdW50Kys7IH0KKyAg
ICB2b2lkIGVuZFRyYW5zcGFyZW5jeUxheWVyKCkgeyBtX3RyYW5zcGFyZW5jeUNvdW50LS07IH0K
KyNlbmRpZgorCisjaWYgUExBVEZPUk0oV0lOKQorICAgIEhEQyBtX2hkYzsKKyAgICB1bnNpZ25l
ZCBtX3RyYW5zcGFyZW5jeUNvdW50OworI2VuZGlmCisKKyAgICBDR0NvbnRleHRSZWYgbV9jZ0Nv
bnRleHQ7CisgICAgYm9vbCBtX3VzZXJUb0RldmljZVRyYW5zZm9ybUtub3duVG9CZUlkZW50aXR5
OworfTsKKworfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vRm9udENHV2lu
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9Gb250Q0dX
aW4uY3BwCShyZXZpc2lvbiAyOTgzNCkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW4vRm9udFdpbi5jcHA6Mjk4MzQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9G
b250Q0dXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRF
UiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVS
LCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJGb250LmgiCisKKyNpbmNsdWRl
ICJGb250RmFsbGJhY2tMaXN0LmgiCisjaW5jbHVkZSAiR2x5cGhCdWZmZXIuaCIKKyNpbmNsdWRl
ICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiTm90
SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJTaW1wbGVGb250RGF0YS5oIgorI2luY2x1ZGUgIlVu
aXNjcmliZUNvbnRyb2xsZXIuaCIKKyNpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxp
Y2F0aW9uU2VydmljZXMuaD4KKyNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0
U3lzdGVtSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitjb25zdCBpbnQgc3ludGhldGljT2JsaXF1ZUFuZ2xlID0gMTQ7CisK
K3ZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwg
Y29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnQsIGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZl
ciwgCisgICAgICAgICAgICAgICAgICAgICAgaW50IGZyb20sIGludCBudW1HbHlwaHMsIGNvbnN0
IEZsb2F0UG9pbnQmIHBvaW50KSBjb25zdAoreworICAgIGlmIChmb250LT5tX2ZvbnQudXNlR0RJ
KCkpIHsKKyAgICAgICAgLy8gRklYTUU6IFN1cHBvcnQgYWxwaGEgYmxlbmRpbmcuCisgICAgICAg
IC8vIEZJWE1FOiBTdXBwb3J0IHRleHQgc3Ryb2tlL2ZpbGwuCisgICAgICAgIC8vIEZJWE1FOiBT
dXBwb3J0IHRleHQgc2hhZG93LgorICAgICAgICBDb2xvciBmaWxsQ29sb3IgPSBncmFwaGljc0Nv
bnRleHQtPmZpbGxDb2xvcigpOworICAgICAgICBpZiAoZmlsbENvbG9yLmFscGhhKCkgPT0gMCkK
KyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBXZSBoYXZlIHRvIGNvbnZlcnQgQ0cn
cyB0d28tZGltZW5zaW9uYWwgZmxvYXRpbmcgcG9pbnQgYWR2YW5jZXMgdG8ganVzdCBob3Jpem9u
dGFsIGludGVnZXIgYWR2YW5jZXMuCisgICAgICAgIFZlY3RvcjxpbnQsIDIwNDg+IGdkaUFkdmFu
Y2VzOworICAgICAgICBpbnQgdG90YWxXaWR0aCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgbnVtR2x5cGhzOyBpKyspIHsKKyAgICAgICAgICAgIGdkaUFkdmFuY2VzLmFwcGVuZChs
cm91bmRmKGdseXBoQnVmZmVyLmFkdmFuY2VBdChmcm9tICsgaSkpKTsKKyAgICAgICAgICAgIHRv
dGFsV2lkdGggKz0gZ2RpQWR2YW5jZXNbaV07CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBw
dXQgc2xvcCBpbnRvIHRoaXMgcmVjdCwgc2luY2UgZ2x5cGhzIGNhbiBvdmVyZmxvdyB0aGUgYXNj
ZW50L2Rlc2NlbnQgYm91bmRzIGFuZCB0aGUgbGVmdC9yaWdodCBlZGdlcy4KKyAgICAgICAgaW50
IGxpbmVHYXAgPSBmb250LT5saW5lR2FwKCk7CisgICAgICAgIEludFJlY3QgdGV4dFJlY3QocG9p
bnQueCgpIC0gbGluZUdhcCwgcG9pbnQueSgpIC0gZm9udC0+YXNjZW50KCkgLSBsaW5lR2FwLCB0
b3RhbFdpZHRoICsgMiAqIGxpbmVHYXAsIGZvbnQtPmxpbmVTcGFjaW5nKCkpOworICAgICAgICBI
REMgaGRjID0gZ3JhcGhpY3NDb250ZXh0LT5nZXRXaW5kb3dzQ29udGV4dCh0ZXh0UmVjdCk7Cisg
ICAgICAgIFNlbGVjdE9iamVjdChoZGMsIGZvbnQtPm1fZm9udC5oZm9udCgpKTsKKworICAgICAg
ICAvLyBTZXQgdGhlIGNvcnJlY3QgY29sb3IuCisgICAgICAgIEhEQyB0ZXh0RHJhd2luZ0RDID0g
aGRjOworICAgICAgICAvKmlmIChmaWxsQ29sb3IuaGFzQWxwaGEoKSB8fCBncmFwaGljc0NvbnRl
eHQtPmluVHJhbnNwYXJlbmN5TGF5ZXIoKSkgeworICAgICAgICAgICAgLy8gR0RJIGNhbid0IGhh
bmRsZSBkcmF3aW5nIHRyYW5zcGFyZW50IHRleHQuICBXZSBoYXZlIHRvIGRyYXcgaW50byBhIG1h
c2suICBXZSBkcmF3IGJsYWNrIHRleHQgb24gYSB3aGl0ZS1maWxsZWQgYmFja2dyb3VuZC4KKyAg
ICAgICAgICAgIC8vIFdlIGFsc28gZG8gdGhpcyB3aGVuIGluc2lkZSB0cmFuc3BhcmVuY3kgbGF5
ZXJzLCBzaW5jZSBHREkgYWxzbyBjYW4ndCBkcmF3IG9udG8gYSBzdXJmYWNlIHdpdGggYWxwaGEu
CisgICAgICAgICAgICBncmFwaGljc0NvbnRleHQtPnNhdmUoKTsKKyAgICAgICAgICAgIGdyYXBo
aWNzQ29udGV4dC0+c2V0RmlsbENvbG9yKENvbG9yOjp3aGl0ZSk7CisgICAgICAgICAgICB0ZXh0
RHJhd2luZ0RDID0gZ3JhcGhpY3NDb250ZXh0LT5nZXRXaW5kb3dzQml0bWFwQ29udGV4dCh0ZXh0
UmVjdCk7CisgICAgICAgICAgICBTZXRUZXh0Q29sb3IoaGRjLCBSR0IoMCwgMCwgMCkpOworICAg
ICAgICB9IGVsc2UqLworICAgICAgICAgICAgU2V0VGV4dENvbG9yKGhkYywgUkdCKGZpbGxDb2xv
ci5yZWQoKSwgZmlsbENvbG9yLmdyZWVuKCksIGZpbGxDb2xvci5ibHVlKCkpKTsKKworICAgICAg
ICBTZXRCa01vZGUoaGRjLCBUUkFOU1BBUkVOVCk7CisgICAgICAgIFNldFRleHRBbGlnbihoZGMs
IFRBX0xFRlQgfCBUQV9CQVNFTElORSk7CisKKyAgICAgICAgLy8gVW5pc2NyaWJlIGdpdmVzIHVz
IG9mZnNldHMgdG8gaGVscCByZWZpbmUgdGhlIHBvc2l0aW9uaW5nIG9mIGNvbWJpbmluZyBnbHlw
aHMuCisgICAgICAgIEZsb2F0U2l6ZSB0cmFuc2xhdGlvbiA9IGdseXBoQnVmZmVyLm9mZnNldEF0
KGZyb20pOworICAgICAgICBpZiAodHJhbnNsYXRpb24ud2lkdGgoKSB8fCB0cmFuc2xhdGlvbi5o
ZWlnaHQoKSkgeworICAgICAgICAgICAgWEZPUk0geGZvcm07CisgICAgICAgICAgICB4Zm9ybS5l
TTExID0gMS4wOworICAgICAgICAgICAgeGZvcm0uZU0xMiA9IDA7CisgICAgICAgICAgICB4Zm9y
bS5lTTIxID0gMDsKKyAgICAgICAgICAgIHhmb3JtLmVNMjIgPSAxLjA7CisgICAgICAgICAgICB4
Zm9ybS5lRHggPSB0cmFuc2xhdGlvbi53aWR0aCgpOworICAgICAgICAgICAgeGZvcm0uZUR5ID0g
dHJhbnNsYXRpb24uaGVpZ2h0KCk7CisgICAgICAgICAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybSho
ZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7CisgICAgICAgIH0KKyAgICAgICAgRXh0VGV4
dE91dChoZGMsIHBvaW50LngoKSwgcG9pbnQueSgpLCBFVE9fR0xZUEhfSU5ERVgsIDAsIChXQ0hB
UiopZ2x5cGhCdWZmZXIuZ2x5cGhzKGZyb20pLCBudW1HbHlwaHMsIGdkaUFkdmFuY2VzLmRhdGEo
KSk7CisKKyAgICAgICAgLyppZiAoZmlsbENvbG9yLmhhc0FscGhhKCkgfHwgZ3JhcGhpY3NDb250
ZXh0LT5pblRyYW5zcGFyZW5jeUxheWVyKCkpIHsKKyAgICAgICAgICAgIC8vIFRPRE9EOiBXZSBo
YXZlIHRvIHdhbGsgdGhlIGJpdHMgb2YgdGhlIGJpdG1hcCBhbmQgaW52ZXJ0IHRoZW0uICBXZSBh
bHNvIGNvcHkgb3ZlciB0aGUgZ3JlZW4gY29tcG9uZW50IHZhbHVlIGludG8gdGhlIGFscGhhIHZh
bHVlCisgICAgICAgICAgICAvLyB0byBrZWVwIENsZWFyVHlwZSBsb29raW5nIHJlYXNvbmFibGUu
CisKKyAgICAgICAgICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgZHJhd24gdGhlIHRleHQgaW50byBh
IGJpdG1hcCBhbmQgaW52ZXJ0ZWQgaXQsIG9idGFpbiBhIENHSW1hZ2VSZWYgbWFzay4KKyAgICAg
ICAgICAgIENHSW1hZ2VSZWYgbWFzayA9IGdyYXBoaWNzQ29udGV4dC0+cmVsZWFzZVdpbmRvd3NC
aXRtYXBDb250ZXh0SW50b01hc2sodGV4dERyYXdpbmdEQywgdGV4dFJlY3QpOworICAgICAgICAg
ICAgCisgICAgICAgICAgICAvLyBBcHBseSB0aGUgbWFzayB0byB0aGUgZmlsbCBjb2xvci4KKyAg
ICAgICAgICAgIENHQ29udGV4dFJlZiBiaXRtYXBDb250ZXh0ID0gZ3JhcGhpY3NDb250ZXh0LT5n
ZXRXaW5kb3dzQ29tcGF0aWJsZUNHQml0bWFwQ29udGV4dCh0ZXh0UmVjdC5zaXplKCkpOworICAg
ICAgICAgICAgQ0dGbG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKKyAgICAgICAgICAgIGNv
bG9yLmdldFJHQkEocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworICAgICAgICAgICAgQ0dDb250
ZXh0U2V0UkdCRmlsbENvbG9yKGNvbnRleHQsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAg
ICAgICAgICAgIENHQ29udGV4dEZpbGxSZWN0KGJpdG1hcENvbnRleHQsIEludFJlY3QoMCwgMCwg
dGV4dFJlY3Qud2lkdGgoKSwgdGV4dFJlY3QuaGVpZ2h0KCkpKTsKKyAgICAgICAgICAgIENHSW1h
Z2VSZWYgZmlsbENvbG9ySW1hZ2UgPSBDR0JpdG1hcENvbnRleHRDcmVhdGVJbWFnZShiaXRtYXBD
b250ZXh0KTsKKyAgICAgICAgCisgICAgICAgICAgICAvLyBBcHBseSB0aGUgbWFzay4KKyAgICAg
ICAgICAgIENHSW1hZ2VSZWYgZmluYWxJbWFnZSA9IENHSW1hZ2VDcmVhdGVXaXRoTWFzayhmaWxs
Q29sb3JJbWFnZSwgbWFzayk7CisKKyAgICAgICAgICAgIC8vIFRoZSBiaXRtYXAgaW1hZ2UgbmVl
ZHMgdG8gYmUgZHJhd24gaW50byB0aGUgSERDLgorICAgICAgICAgICAgZ3JhcGhpY3NDb250ZXh0
LT5kcmF3SW1hZ2VJbnRvV2luZG93c0NvbnRleHQoaGRjLCBmaW5hbEltYWdlKTsKKworICAgICAg
ICAgICAgLy8gUmVsZWFzZSBvdXIgaW1hZ2VzIGFuZCBjb250ZXh0cy4KKyAgICAgICAgICAgIENH
SW1hZ2VSZWxlYXNlKG1hc2spOworICAgICAgICAgICAgQ0dJbWFnZVJlbGVhc2UoZmlsbENvbG9y
SW1hZ2UpOworICAgICAgICAgICAgQ0dJbWFnZVJlbGVhc2UoZmluYWxJbWFnZSk7CisgICAgICAg
ICAgICBDR0NvbnRleHRSZWxlYXNlKGJpdG1hcENvbnRleHQpOworICAgICAgICB9Ki8KKworICAg
ICAgICBncmFwaGljc0NvbnRleHQtPnJlbGVhc2VXaW5kb3dzQ29udGV4dChoZGMsIHRleHRSZWN0
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENHQ29udGV4dFJlZiBjZ0NvbnRleHQg
PSBncmFwaGljc0NvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpOworCisgICAgdWludDMyX3Qgb2xk
Rm9udFNtb290aGluZ1N0eWxlID0gd2tTZXRGb250U21vb3RoaW5nU3R5bGUoY2dDb250ZXh0KTsK
KworICAgIGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIHBsYXRmb3JtRGF0YSA9IGZvbnQtPnBsYXRm
b3JtRGF0YSgpOworCisgICAgQ0dDb250ZXh0U2V0Rm9udChjZ0NvbnRleHQsIHBsYXRmb3JtRGF0
YS5jZ0ZvbnQoKSk7CisKKyAgICBDR0FmZmluZVRyYW5zZm9ybSBtYXRyaXggPSBDR0FmZmluZVRy
YW5zZm9ybUlkZW50aXR5OworICAgIG1hdHJpeC5iID0gLW1hdHJpeC5iOworICAgIG1hdHJpeC5k
ID0gLW1hdHJpeC5kOworCisgICAgaWYgKHBsYXRmb3JtRGF0YS5zeW50aGV0aWNPYmxpcXVlKCkp
CisgICAgeworICAgICAgICBzdGF0aWMgZmxvYXQgc2tldyA9IC10YW5mKHN5bnRoZXRpY09ibGlx
dWVBbmdsZSAqIGFjb3NmKDApIC8gOTApOworICAgICAgICBtYXRyaXggPSBDR0FmZmluZVRyYW5z
Zm9ybUNvbmNhdChtYXRyaXgsIENHQWZmaW5lVHJhbnNmb3JtTWFrZSgxLCAwLCBza2V3LCAxLCAw
LCAwKSk7CisgICAgfQorCisgICAgLy8gVW5pc2NyaWJlIGdpdmVzIHVzIG9mZnNldHMgdG8gaGVs
cCByZWZpbmUgdGhlIHBvc2l0aW9uaW5nIG9mIGNvbWJpbmluZyBnbHlwaHMuCisgICAgRmxvYXRT
aXplIHRyYW5zbGF0aW9uID0gZ2x5cGhCdWZmZXIub2Zmc2V0QXQoZnJvbSk7CisgICAgaWYgKHRy
YW5zbGF0aW9uLndpZHRoKCkgfHwgdHJhbnNsYXRpb24uaGVpZ2h0KCkpCisgICAgICAgIENHQWZm
aW5lVHJhbnNmb3JtVHJhbnNsYXRlKG1hdHJpeCwgdHJhbnNsYXRpb24ud2lkdGgoKSwgdHJhbnNs
YXRpb24uaGVpZ2h0KCkpOworICAgIAorICAgIENHQ29udGV4dFNldFRleHRNYXRyaXgoY2dDb250
ZXh0LCBtYXRyaXgpOworCisgICAgQ0dDb250ZXh0U2V0Rm9udFNpemUoY2dDb250ZXh0LCBwbGF0
Zm9ybURhdGEuc2l6ZSgpKTsKKyAgICBDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24oY2dDb250ZXh0
LCBwb2ludC54KCksIHBvaW50LnkoKSk7CisgICAgQ0dDb250ZXh0U2hvd0dseXBoc1dpdGhBZHZh
bmNlcyhjZ0NvbnRleHQsIGdseXBoQnVmZmVyLmdseXBocyhmcm9tKSwgZ2x5cGhCdWZmZXIuYWR2
YW5jZXMoZnJvbSksIG51bUdseXBocyk7CisgICAgaWYgKGZvbnQtPm1fc3ludGhldGljQm9sZE9m
ZnNldCkgeworICAgICAgICBDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24oY2dDb250ZXh0LCBwb2lu
dC54KCkgKyBmb250LT5tX3N5bnRoZXRpY0JvbGRPZmZzZXQsIHBvaW50LnkoKSk7CisgICAgICAg
IENHQ29udGV4dFNob3dHbHlwaHNXaXRoQWR2YW5jZXMoY2dDb250ZXh0LCBnbHlwaEJ1ZmZlci5n
bHlwaHMoZnJvbSksIGdseXBoQnVmZmVyLmFkdmFuY2VzKGZyb20pLCBudW1HbHlwaHMpOworICAg
IH0KKworICAgIHdrUmVzdG9yZUZvbnRTbW9vdGhpbmdTdHlsZShjZ0NvbnRleHQsIG9sZEZvbnRT
bW9vdGhpbmdTdHlsZSk7Cit9CisKK0Zsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29t
cGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCBo
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwg
aW50IHRvKSBjb25zdAoreworICAgIFVuaXNjcmliZUNvbnRyb2xsZXIgaXQodGhpcywgcnVuKTsK
KyAgICBpdC5hZHZhbmNlKGZyb20pOworICAgIGZsb2F0IGJlZm9yZVdpZHRoID0gaXQucnVuV2lk
dGhTb0ZhcigpOworICAgIGl0LmFkdmFuY2UodG8pOworICAgIGZsb2F0IGFmdGVyV2lkdGggPSBp
dC5ydW5XaWR0aFNvRmFyKCk7CisKKyAgICAvLyBVc2luZyByb3VuZGYoKSByYXRoZXIgdGhhbiBj
ZWlsZigpIGZvciB0aGUgcmlnaHQgZWRnZSBhcyBhIGNvbXByb21pc2UgdG8gZW5zdXJlIGNvcnJl
Y3QgY2FyZXQgcG9zaXRpb25pbmcKKyAgICBpZiAocnVuLnJ0bCgpKSB7CisgICAgICAgIGl0LmFk
dmFuY2UocnVuLmxlbmd0aCgpKTsKKyAgICAgICAgZmxvYXQgdG90YWxXaWR0aCA9IGl0LnJ1bldp
ZHRoU29GYXIoKTsKKyAgICAgICAgcmV0dXJuIEZsb2F0UmVjdChwb2ludC54KCkgKyBmbG9vcmYo
dG90YWxXaWR0aCAtIGFmdGVyV2lkdGgpLCBwb2ludC55KCksIHJvdW5kZih0b3RhbFdpZHRoIC0g
YmVmb3JlV2lkdGgpIC0gZmxvb3JmKHRvdGFsV2lkdGggLSBhZnRlcldpZHRoKSwgaCk7CisgICAg
fSAKKyAgICAKKyAgICByZXR1cm4gRmxvYXRSZWN0KHBvaW50LngoKSArIGZsb29yZihiZWZvcmVX
aWR0aCksIHBvaW50LnkoKSwgcm91bmRmKGFmdGVyV2lkdGgpIC0gZmxvb3JmKGJlZm9yZVdpZHRo
KSwgaCk7Cit9CisKK3ZvaWQgRm9udDo6ZHJhd0NvbXBsZXhUZXh0KEdyYXBoaWNzQ29udGV4dCog
Y29udGV4dCwgY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0Cit7CisgICAg
Ly8gVGhpcyBnbHlwaCBidWZmZXIgaG9sZHMgb3VyIGdseXBocyArIGFkdmFuY2VzICsgZm9udCBk
YXRhIGZvciBlYWNoIGdseXBoLgorICAgIEdseXBoQnVmZmVyIGdseXBoQnVmZmVyOworCisgICAg
ZmxvYXQgc3RhcnRYID0gcG9pbnQueCgpOworICAgIFVuaXNjcmliZUNvbnRyb2xsZXIgY29udHJv
bGxlcih0aGlzLCBydW4pOworICAgIGNvbnRyb2xsZXIuYWR2YW5jZShmcm9tKTsKKyAgICBmbG9h
dCBiZWZvcmVXaWR0aCA9IGNvbnRyb2xsZXIucnVuV2lkdGhTb0ZhcigpOworICAgIGNvbnRyb2xs
ZXIuYWR2YW5jZSh0bywgJmdseXBoQnVmZmVyKTsKKyAgICAKKyAgICAvLyBXZSBjb3VsZG4ndCBn
ZW5lcmF0ZSBhbnkgZ2x5cGhzIGZvciB0aGUgcnVuLiAgR2l2ZSB1cC4KKyAgICBpZiAoZ2x5cGhC
dWZmZXIuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgZmxvYXQgYWZ0ZXJX
aWR0aCA9IGNvbnRyb2xsZXIucnVuV2lkdGhTb0ZhcigpOworCisgICAgaWYgKHJ1bi5ydGwoKSkg
eworICAgICAgICBjb250cm9sbGVyLmFkdmFuY2UocnVuLmxlbmd0aCgpKTsKKyAgICAgICAgc3Rh
cnRYICs9IGNvbnRyb2xsZXIucnVuV2lkdGhTb0ZhcigpIC0gYWZ0ZXJXaWR0aDsKKyAgICB9IGVs
c2UKKyAgICAgICAgc3RhcnRYICs9IGJlZm9yZVdpZHRoOworCisgICAgLy8gRHJhdyB0aGUgZ2x5
cGggYnVmZmVyIG5vdyBhdCB0aGUgc3RhcnRpbmcgcG9pbnQgcmV0dXJuZWQgaW4gc3RhcnRYLgor
ICAgIEZsb2F0UG9pbnQgc3RhcnRQb2ludChzdGFydFgsIHBvaW50LnkoKSk7CisgICAgZHJhd0ds
eXBoQnVmZmVyKGNvbnRleHQsIGdseXBoQnVmZmVyLCBydW4sIHN0YXJ0UG9pbnQpOworfQorCitm
bG9hdCBGb250OjpmbG9hdFdpZHRoRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuKSBj
b25zdAoreworICAgIFVuaXNjcmliZUNvbnRyb2xsZXIgY29udHJvbGxlcih0aGlzLCBydW4pOwor
ICAgIGNvbnRyb2xsZXIuYWR2YW5jZShydW4ubGVuZ3RoKCkpOworICAgIHJldHVybiBjb250cm9s
bGVyLnJ1bldpZHRoU29GYXIoKTsKK30KKworaW50IEZvbnQ6Om9mZnNldEZvclBvc2l0aW9uRm9y
Q29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBpbnQgeCwgYm9vbCBpbmNsdWRlUGFydGlh
bEdseXBocykgY29uc3QKK3sKKyAgICBVbmlzY3JpYmVDb250cm9sbGVyIGNvbnRyb2xsZXIodGhp
cywgcnVuKTsKKyAgICByZXR1cm4gY29udHJvbGxlci5vZmZzZXRGb3JQb3NpdGlvbih4LCBpbmNs
dWRlUGFydGlhbEdseXBocyk7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0ZvbnRDR1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW4vRm9udENHV2luLmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbi9Gb250Q0dXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEs
NSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmln
aHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIElu
Yy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
QEAgLTI2LDExICsyNiw5IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiRm9udC5o
IgogCi0jaW5jbHVkZSAiRm9udEZhbGxiYWNrTGlzdC5oIgogI2luY2x1ZGUgIkdseXBoQnVmZmVy
LmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCiAjaW5jbHVkZSAiSW50UmVjdC5oIgot
I2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCiAjaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIK
ICNpbmNsdWRlICJVbmlzY3JpYmVDb250cm9sbGVyLmgiCiAjaW5jbHVkZSA8QXBwbGljYXRpb25T
ZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CkBAIC02OCwxNSArNjYsNyBAQCB2b2lkIEZv
bnQ6OmRyYXdHbHlwaHMoR3JhcGhpY3NDb250ZXh0KiBnCiAKICAgICAgICAgLy8gU2V0IHRoZSBj
b3JyZWN0IGNvbG9yLgogICAgICAgICBIREMgdGV4dERyYXdpbmdEQyA9IGhkYzsKLSAgICAgICAg
LyppZiAoZmlsbENvbG9yLmhhc0FscGhhKCkgfHwgZ3JhcGhpY3NDb250ZXh0LT5pblRyYW5zcGFy
ZW5jeUxheWVyKCkpIHsKLSAgICAgICAgICAgIC8vIEdESSBjYW4ndCBoYW5kbGUgZHJhd2luZyB0
cmFuc3BhcmVudCB0ZXh0LiAgV2UgaGF2ZSB0byBkcmF3IGludG8gYSBtYXNrLiAgV2UgZHJhdyBi
bGFjayB0ZXh0IG9uIGEgd2hpdGUtZmlsbGVkIGJhY2tncm91bmQuCi0gICAgICAgICAgICAvLyBX
ZSBhbHNvIGRvIHRoaXMgd2hlbiBpbnNpZGUgdHJhbnNwYXJlbmN5IGxheWVycywgc2luY2UgR0RJ
IGFsc28gY2FuJ3QgZHJhdyBvbnRvIGEgc3VyZmFjZSB3aXRoIGFscGhhLgotICAgICAgICAgICAg
Z3JhcGhpY3NDb250ZXh0LT5zYXZlKCk7Ci0gICAgICAgICAgICBncmFwaGljc0NvbnRleHQtPnNl
dEZpbGxDb2xvcihDb2xvcjo6d2hpdGUpOwotICAgICAgICAgICAgdGV4dERyYXdpbmdEQyA9IGdy
YXBoaWNzQ29udGV4dC0+Z2V0V2luZG93c0JpdG1hcENvbnRleHQodGV4dFJlY3QpOwotICAgICAg
ICAgICAgU2V0VGV4dENvbG9yKGhkYywgUkdCKDAsIDAsIDApKTsKLSAgICAgICAgfSBlbHNlKi8K
LSAgICAgICAgICAgIFNldFRleHRDb2xvcihoZGMsIFJHQihmaWxsQ29sb3IucmVkKCksIGZpbGxD
b2xvci5ncmVlbigpLCBmaWxsQ29sb3IuYmx1ZSgpKSk7CisgICAgICAgIFNldFRleHRDb2xvciho
ZGMsIFJHQihmaWxsQ29sb3IucmVkKCksIGZpbGxDb2xvci5ncmVlbigpLCBmaWxsQ29sb3IuYmx1
ZSgpKSk7CiAKICAgICAgICAgU2V0QmtNb2RlKGhkYywgVFJBTlNQQVJFTlQpOwogICAgICAgICBT
ZXRUZXh0QWxpZ24oaGRjLCBUQV9MRUZUIHwgVEFfQkFTRUxJTkUpOwpAQCAtOTUsMzQgKzg1LDYg
QEAgdm9pZCBGb250OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCogZwogICAgICAgICB9CiAg
ICAgICAgIEV4dFRleHRPdXQoaGRjLCBwb2ludC54KCksIHBvaW50LnkoKSwgRVRPX0dMWVBIX0lO
REVYLCAwLCAoV0NIQVIqKWdseXBoQnVmZmVyLmdseXBocyhmcm9tKSwgbnVtR2x5cGhzLCBnZGlB
ZHZhbmNlcy5kYXRhKCkpOwogCi0gICAgICAgIC8qaWYgKGZpbGxDb2xvci5oYXNBbHBoYSgpIHx8
IGdyYXBoaWNzQ29udGV4dC0+aW5UcmFuc3BhcmVuY3lMYXllcigpKSB7Ci0gICAgICAgICAgICAv
LyBUT0RPRDogV2UgaGF2ZSB0byB3YWxrIHRoZSBiaXRzIG9mIHRoZSBiaXRtYXAgYW5kIGludmVy
dCB0aGVtLiAgV2UgYWxzbyBjb3B5IG92ZXIgdGhlIGdyZWVuIGNvbXBvbmVudCB2YWx1ZSBpbnRv
IHRoZSBhbHBoYSB2YWx1ZQotICAgICAgICAgICAgLy8gdG8ga2VlcCBDbGVhclR5cGUgbG9va2lu
ZyByZWFzb25hYmxlLgotCi0gICAgICAgICAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGRyYXduIHRo
ZSB0ZXh0IGludG8gYSBiaXRtYXAgYW5kIGludmVydGVkIGl0LCBvYnRhaW4gYSBDR0ltYWdlUmVm
IG1hc2suCi0gICAgICAgICAgICBDR0ltYWdlUmVmIG1hc2sgPSBncmFwaGljc0NvbnRleHQtPnJl
bGVhc2VXaW5kb3dzQml0bWFwQ29udGV4dEludG9NYXNrKHRleHREcmF3aW5nREMsIHRleHRSZWN0
KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQXBwbHkgdGhlIG1hc2sgdG8gdGhlIGZp
bGwgY29sb3IuCi0gICAgICAgICAgICBDR0NvbnRleHRSZWYgYml0bWFwQ29udGV4dCA9IGdyYXBo
aWNzQ29udGV4dC0+Z2V0V2luZG93c0NvbXBhdGlibGVDR0JpdG1hcENvbnRleHQodGV4dFJlY3Qu
c2l6ZSgpKTsKLSAgICAgICAgICAgIENHRmxvYXQgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGE7Ci0g
ICAgICAgICAgICBjb2xvci5nZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLSAgICAg
ICAgICAgIENHQ29udGV4dFNldFJHQkZpbGxDb2xvcihjb250ZXh0LCByZWQsIGdyZWVuLCBibHVl
LCBhbHBoYSk7Ci0gICAgICAgICAgICBDR0NvbnRleHRGaWxsUmVjdChiaXRtYXBDb250ZXh0LCBJ
bnRSZWN0KDAsIDAsIHRleHRSZWN0LndpZHRoKCksIHRleHRSZWN0LmhlaWdodCgpKSk7Ci0gICAg
ICAgICAgICBDR0ltYWdlUmVmIGZpbGxDb2xvckltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRl
SW1hZ2UoYml0bWFwQ29udGV4dCk7Ci0gICAgICAgIAotICAgICAgICAgICAgLy8gQXBwbHkgdGhl
IG1hc2suCi0gICAgICAgICAgICBDR0ltYWdlUmVmIGZpbmFsSW1hZ2UgPSBDR0ltYWdlQ3JlYXRl
V2l0aE1hc2soZmlsbENvbG9ySW1hZ2UsIG1hc2spOwotCi0gICAgICAgICAgICAvLyBUaGUgYml0
bWFwIGltYWdlIG5lZWRzIHRvIGJlIGRyYXduIGludG8gdGhlIEhEQy4KLSAgICAgICAgICAgIGdy
YXBoaWNzQ29udGV4dC0+ZHJhd0ltYWdlSW50b1dpbmRvd3NDb250ZXh0KGhkYywgZmluYWxJbWFn
ZSk7Ci0KLSAgICAgICAgICAgIC8vIFJlbGVhc2Ugb3VyIGltYWdlcyBhbmQgY29udGV4dHMuCi0g
ICAgICAgICAgICBDR0ltYWdlUmVsZWFzZShtYXNrKTsKLSAgICAgICAgICAgIENHSW1hZ2VSZWxl
YXNlKGZpbGxDb2xvckltYWdlKTsKLSAgICAgICAgICAgIENHSW1hZ2VSZWxlYXNlKGZpbmFsSW1h
Z2UpOwotICAgICAgICAgICAgQ0dDb250ZXh0UmVsZWFzZShiaXRtYXBDb250ZXh0KTsKLSAgICAg
ICAgfSovCi0KICAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5yZWxlYXNlV2luZG93c0NvbnRleHQo
aGRjLCB0ZXh0UmVjdCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xMzksOSArMTAxLDgg
QEAgdm9pZCBGb250OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCogZwogICAgIG1hdHJpeC5i
ID0gLW1hdHJpeC5iOwogICAgIG1hdHJpeC5kID0gLW1hdHJpeC5kOwogCi0gICAgaWYgKHBsYXRm
b3JtRGF0YS5zeW50aGV0aWNPYmxpcXVlKCkpCi0gICAgewotICAgICAgICBzdGF0aWMgZmxvYXQg
c2tldyA9IC10YW5mKHN5bnRoZXRpY09ibGlxdWVBbmdsZSAqIGFjb3NmKDApIC8gOTApOworICAg
IGlmIChwbGF0Zm9ybURhdGEuc3ludGhldGljT2JsaXF1ZSgpKSB7CisgICAgICAgIHN0YXRpYyBm
bG9hdCBza2V3ID0gLXRhbmYoc3ludGhldGljT2JsaXF1ZUFuZ2xlICogYWNvc2YoMCkgLyA5MC4w
Zik7CiAgICAgICAgIG1hdHJpeCA9IENHQWZmaW5lVHJhbnNmb3JtQ29uY2F0KG1hdHJpeCwgQ0dB
ZmZpbmVUcmFuc2Zvcm1NYWtlKDEsIDAsIHNrZXcsIDEsIDAsIDApKTsKICAgICB9CiAKQEAgLTE2
Myw2NSArMTI0LDQgQEAgdm9pZCBGb250OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCogZwog
ICAgIHdrUmVzdG9yZUZvbnRTbW9vdGhpbmdTdHlsZShjZ0NvbnRleHQsIG9sZEZvbnRTbW9vdGhp
bmdTdHlsZSk7CiB9CiAKLUZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRl
eHQoY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCBoLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IHRv
KSBjb25zdAotewotICAgIFVuaXNjcmliZUNvbnRyb2xsZXIgaXQodGhpcywgcnVuKTsKLSAgICBp
dC5hZHZhbmNlKGZyb20pOwotICAgIGZsb2F0IGJlZm9yZVdpZHRoID0gaXQucnVuV2lkdGhTb0Zh
cigpOwotICAgIGl0LmFkdmFuY2UodG8pOwotICAgIGZsb2F0IGFmdGVyV2lkdGggPSBpdC5ydW5X
aWR0aFNvRmFyKCk7Ci0KLSAgICAvLyBVc2luZyByb3VuZGYoKSByYXRoZXIgdGhhbiBjZWlsZigp
IGZvciB0aGUgcmlnaHQgZWRnZSBhcyBhIGNvbXByb21pc2UgdG8gZW5zdXJlIGNvcnJlY3QgY2Fy
ZXQgcG9zaXRpb25pbmcKLSAgICBpZiAocnVuLnJ0bCgpKSB7Ci0gICAgICAgIGl0LmFkdmFuY2Uo
cnVuLmxlbmd0aCgpKTsKLSAgICAgICAgZmxvYXQgdG90YWxXaWR0aCA9IGl0LnJ1bldpZHRoU29G
YXIoKTsKLSAgICAgICAgcmV0dXJuIEZsb2F0UmVjdChwb2ludC54KCkgKyBmbG9vcmYodG90YWxX
aWR0aCAtIGFmdGVyV2lkdGgpLCBwb2ludC55KCksIHJvdW5kZih0b3RhbFdpZHRoIC0gYmVmb3Jl
V2lkdGgpIC0gZmxvb3JmKHRvdGFsV2lkdGggLSBhZnRlcldpZHRoKSwgaCk7Ci0gICAgfSAKLSAg
ICAKLSAgICByZXR1cm4gRmxvYXRSZWN0KHBvaW50LngoKSArIGZsb29yZihiZWZvcmVXaWR0aCks
IHBvaW50LnkoKSwgcm91bmRmKGFmdGVyV2lkdGgpIC0gZmxvb3JmKGJlZm9yZVdpZHRoKSwgaCk7
Ci19Ci0KLXZvaWQgRm9udDo6ZHJhd0NvbXBsZXhUZXh0KEdyYXBoaWNzQ29udGV4dCogY29udGV4
dCwgY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0Ci17Ci0gICAgLy8gVGhp
cyBnbHlwaCBidWZmZXIgaG9sZHMgb3VyIGdseXBocyArIGFkdmFuY2VzICsgZm9udCBkYXRhIGZv
ciBlYWNoIGdseXBoLgotICAgIEdseXBoQnVmZmVyIGdseXBoQnVmZmVyOwotCi0gICAgZmxvYXQg
c3RhcnRYID0gcG9pbnQueCgpOwotICAgIFVuaXNjcmliZUNvbnRyb2xsZXIgY29udHJvbGxlcih0
aGlzLCBydW4pOwotICAgIGNvbnRyb2xsZXIuYWR2YW5jZShmcm9tKTsKLSAgICBmbG9hdCBiZWZv
cmVXaWR0aCA9IGNvbnRyb2xsZXIucnVuV2lkdGhTb0ZhcigpOwotICAgIGNvbnRyb2xsZXIuYWR2
YW5jZSh0bywgJmdseXBoQnVmZmVyKTsKLSAgICAKLSAgICAvLyBXZSBjb3VsZG4ndCBnZW5lcmF0
ZSBhbnkgZ2x5cGhzIGZvciB0aGUgcnVuLiAgR2l2ZSB1cC4KLSAgICBpZiAoZ2x5cGhCdWZmZXIu
aXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgZmxvYXQgYWZ0ZXJXaWR0aCA9
IGNvbnRyb2xsZXIucnVuV2lkdGhTb0ZhcigpOwotCi0gICAgaWYgKHJ1bi5ydGwoKSkgewotICAg
ICAgICBjb250cm9sbGVyLmFkdmFuY2UocnVuLmxlbmd0aCgpKTsKLSAgICAgICAgc3RhcnRYICs9
IGNvbnRyb2xsZXIucnVuV2lkdGhTb0ZhcigpIC0gYWZ0ZXJXaWR0aDsKLSAgICB9IGVsc2UKLSAg
ICAgICAgc3RhcnRYICs9IGJlZm9yZVdpZHRoOwotCi0gICAgLy8gRHJhdyB0aGUgZ2x5cGggYnVm
ZmVyIG5vdyBhdCB0aGUgc3RhcnRpbmcgcG9pbnQgcmV0dXJuZWQgaW4gc3RhcnRYLgotICAgIEZs
b2F0UG9pbnQgc3RhcnRQb2ludChzdGFydFgsIHBvaW50LnkoKSk7Ci0gICAgZHJhd0dseXBoQnVm
ZmVyKGNvbnRleHQsIGdseXBoQnVmZmVyLCBydW4sIHN0YXJ0UG9pbnQpOwotfQotCi1mbG9hdCBG
b250OjpmbG9hdFdpZHRoRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuKSBjb25zdAot
ewotICAgIFVuaXNjcmliZUNvbnRyb2xsZXIgY29udHJvbGxlcih0aGlzLCBydW4pOwotICAgIGNv
bnRyb2xsZXIuYWR2YW5jZShydW4ubGVuZ3RoKCkpOwotICAgIHJldHVybiBjb250cm9sbGVyLnJ1
bldpZHRoU29GYXIoKTsKLX0KLQotaW50IEZvbnQ6Om9mZnNldEZvclBvc2l0aW9uRm9yQ29tcGxl
eFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBpbnQgeCwgYm9vbCBpbmNsdWRlUGFydGlhbEdseXBo
cykgY29uc3QKLXsKLSAgICBVbmlzY3JpYmVDb250cm9sbGVyIGNvbnRyb2xsZXIodGhpcywgcnVu
KTsKLSAgICByZXR1cm4gY29udHJvbGxlci5vZmZzZXRGb3JQb3NpdGlvbih4LCBpbmNsdWRlUGFy
dGlhbEdseXBocyk7Ci19Ci0KIH0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0ZvbnRDYWlyb1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW4vRm9udENhaXJvV2luLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL0ZvbnRDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDIg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
Q09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZvbnQuaCIKKwor
I2luY2x1ZGUgIkdseXBoQnVmZmVyLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisj
aW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJTaW1wbGVGb250RGF0YS5oIgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3ZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFwaGljc0Nv
bnRleHQqIGdyYXBoaWNzQ29udGV4dCwgY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnQsIGNvbnN0
IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZlciwgCisgICAgICAgICAgICAgICAgICAgICAgaW50IGZy
b20sIGludCBudW1HbHlwaHMsIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KSBjb25zdAoreworICAg
IG5vdEltcGxlbWVudGVkKCk7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0ZvbnRXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0ZvbnRXaW4uY3BwCShyZXZpc2lvbiAzMDA0OCkKKysrIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL0ZvbnRXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAog
LyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4gIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTMz
LDEzNiArMzMsMTAgQEAKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1ZGUgIlNp
bXBsZUZvbnREYXRhLmgiCiAjaW5jbHVkZSAiVW5pc2NyaWJlQ29udHJvbGxlci5oIgotI2luY2x1
ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgotI2luY2x1ZGUg
PFdlYktpdFN5c3RlbUludGVyZmFjZS9XZWJLaXRTeXN0ZW1JbnRlcmZhY2UuaD4KICNpbmNsdWRl
IDx3dGYvTWF0aEV4dHJhcy5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLWNvbnN0IGludCBz
eW50aGV0aWNPYmxpcXVlQW5nbGUgPSAxNDsKLQotdm9pZCBGb250OjpkcmF3R2x5cGhzKEdyYXBo
aWNzQ29udGV4dCogZ3JhcGhpY3NDb250ZXh0LCBjb25zdCBTaW1wbGVGb250RGF0YSogZm9udCwg
Y29uc3QgR2x5cGhCdWZmZXImIGdseXBoQnVmZmVyLCAKLSAgICAgICAgICAgICAgICAgICAgICBp
bnQgZnJvbSwgaW50IG51bUdseXBocywgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpIGNvbnN0Ci17
Ci0gICAgaWYgKGZvbnQtPm1fZm9udC51c2VHREkoKSkgewotICAgICAgICAvLyBGSVhNRTogU3Vw
cG9ydCBhbHBoYSBibGVuZGluZy4KLSAgICAgICAgLy8gRklYTUU6IFN1cHBvcnQgdGV4dCBzdHJv
a2UvZmlsbC4KLSAgICAgICAgLy8gRklYTUU6IFN1cHBvcnQgdGV4dCBzaGFkb3cuCi0gICAgICAg
IENvbG9yIGZpbGxDb2xvciA9IGdyYXBoaWNzQ29udGV4dC0+ZmlsbENvbG9yKCk7Ci0gICAgICAg
IGlmIChmaWxsQ29sb3IuYWxwaGEoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAg
ICAgIC8vIFdlIGhhdmUgdG8gY29udmVydCBDRydzIHR3by1kaW1lbnNpb25hbCBmbG9hdGluZyBw
b2ludCBhZHZhbmNlcyB0byBqdXN0IGhvcml6b250YWwgaW50ZWdlciBhZHZhbmNlcy4KLSAgICAg
ICAgVmVjdG9yPGludCwgMjA0OD4gZ2RpQWR2YW5jZXM7Ci0gICAgICAgIGludCB0b3RhbFdpZHRo
ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1HbHlwaHM7IGkrKykgewotICAg
ICAgICAgICAgZ2RpQWR2YW5jZXMuYXBwZW5kKGxyb3VuZGYoZ2x5cGhCdWZmZXIuYWR2YW5jZUF0
KGZyb20gKyBpKSkpOwotICAgICAgICAgICAgdG90YWxXaWR0aCArPSBnZGlBZHZhbmNlc1tpXTsK
LSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIHB1dCBzbG9wIGludG8gdGhpcyByZWN0LCBzaW5j
ZSBnbHlwaHMgY2FuIG92ZXJmbG93IHRoZSBhc2NlbnQvZGVzY2VudCBib3VuZHMgYW5kIHRoZSBs
ZWZ0L3JpZ2h0IGVkZ2VzLgotICAgICAgICBpbnQgbGluZUdhcCA9IGZvbnQtPmxpbmVHYXAoKTsK
LSAgICAgICAgSW50UmVjdCB0ZXh0UmVjdChwb2ludC54KCkgLSBsaW5lR2FwLCBwb2ludC55KCkg
LSBmb250LT5hc2NlbnQoKSAtIGxpbmVHYXAsIHRvdGFsV2lkdGggKyAyICogbGluZUdhcCwgZm9u
dC0+bGluZVNwYWNpbmcoKSk7Ci0gICAgICAgIEhEQyBoZGMgPSBncmFwaGljc0NvbnRleHQtPmdl
dFdpbmRvd3NDb250ZXh0KHRleHRSZWN0KTsKLSAgICAgICAgU2VsZWN0T2JqZWN0KGhkYywgZm9u
dC0+bV9mb250Lmhmb250KCkpOwotCi0gICAgICAgIC8vIFNldCB0aGUgY29ycmVjdCBjb2xvci4K
LSAgICAgICAgSERDIHRleHREcmF3aW5nREMgPSBoZGM7Ci0gICAgICAgIC8qaWYgKGZpbGxDb2xv
ci5oYXNBbHBoYSgpIHx8IGdyYXBoaWNzQ29udGV4dC0+aW5UcmFuc3BhcmVuY3lMYXllcigpKSB7
Ci0gICAgICAgICAgICAvLyBHREkgY2FuJ3QgaGFuZGxlIGRyYXdpbmcgdHJhbnNwYXJlbnQgdGV4
dC4gIFdlIGhhdmUgdG8gZHJhdyBpbnRvIGEgbWFzay4gIFdlIGRyYXcgYmxhY2sgdGV4dCBvbiBh
IHdoaXRlLWZpbGxlZCBiYWNrZ3JvdW5kLgotICAgICAgICAgICAgLy8gV2UgYWxzbyBkbyB0aGlz
IHdoZW4gaW5zaWRlIHRyYW5zcGFyZW5jeSBsYXllcnMsIHNpbmNlIEdESSBhbHNvIGNhbid0IGRy
YXcgb250byBhIHN1cmZhY2Ugd2l0aCBhbHBoYS4KLSAgICAgICAgICAgIGdyYXBoaWNzQ29udGV4
dC0+c2F2ZSgpOwotICAgICAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5zZXRGaWxsQ29sb3IoQ29s
b3I6OndoaXRlKTsKLSAgICAgICAgICAgIHRleHREcmF3aW5nREMgPSBncmFwaGljc0NvbnRleHQt
PmdldFdpbmRvd3NCaXRtYXBDb250ZXh0KHRleHRSZWN0KTsKLSAgICAgICAgICAgIFNldFRleHRD
b2xvcihoZGMsIFJHQigwLCAwLCAwKSk7Ci0gICAgICAgIH0gZWxzZSovCi0gICAgICAgICAgICBT
ZXRUZXh0Q29sb3IoaGRjLCBSR0IoZmlsbENvbG9yLnJlZCgpLCBmaWxsQ29sb3IuZ3JlZW4oKSwg
ZmlsbENvbG9yLmJsdWUoKSkpOwotCi0gICAgICAgIFNldEJrTW9kZShoZGMsIFRSQU5TUEFSRU5U
KTsKLSAgICAgICAgU2V0VGV4dEFsaWduKGhkYywgVEFfTEVGVCB8IFRBX0JBU0VMSU5FKTsKLQot
ICAgICAgICAvLyBVbmlzY3JpYmUgZ2l2ZXMgdXMgb2Zmc2V0cyB0byBoZWxwIHJlZmluZSB0aGUg
cG9zaXRpb25pbmcgb2YgY29tYmluaW5nIGdseXBocy4KLSAgICAgICAgRmxvYXRTaXplIHRyYW5z
bGF0aW9uID0gZ2x5cGhCdWZmZXIub2Zmc2V0QXQoZnJvbSk7Ci0gICAgICAgIGlmICh0cmFuc2xh
dGlvbi53aWR0aCgpIHx8IHRyYW5zbGF0aW9uLmhlaWdodCgpKSB7Ci0gICAgICAgICAgICBYRk9S
TSB4Zm9ybTsKLSAgICAgICAgICAgIHhmb3JtLmVNMTEgPSAxLjA7Ci0gICAgICAgICAgICB4Zm9y
bS5lTTEyID0gMDsKLSAgICAgICAgICAgIHhmb3JtLmVNMjEgPSAwOwotICAgICAgICAgICAgeGZv
cm0uZU0yMiA9IDEuMDsKLSAgICAgICAgICAgIHhmb3JtLmVEeCA9IHRyYW5zbGF0aW9uLndpZHRo
KCk7Ci0gICAgICAgICAgICB4Zm9ybS5lRHkgPSB0cmFuc2xhdGlvbi5oZWlnaHQoKTsKLSAgICAg
ICAgICAgIE1vZGlmeVdvcmxkVHJhbnNmb3JtKGhkYywgJnhmb3JtLCBNV1RfTEVGVE1VTFRJUExZ
KTsKLSAgICAgICAgfQotICAgICAgICBFeHRUZXh0T3V0KGhkYywgcG9pbnQueCgpLCBwb2ludC55
KCksIEVUT19HTFlQSF9JTkRFWCwgMCwgKFdDSEFSKilnbHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSks
IG51bUdseXBocywgZ2RpQWR2YW5jZXMuZGF0YSgpKTsKLQotICAgICAgICAvKmlmIChmaWxsQ29s
b3IuaGFzQWxwaGEoKSB8fCBncmFwaGljc0NvbnRleHQtPmluVHJhbnNwYXJlbmN5TGF5ZXIoKSkg
ewotICAgICAgICAgICAgLy8gVE9ET0Q6IFdlIGhhdmUgdG8gd2FsayB0aGUgYml0cyBvZiB0aGUg
Yml0bWFwIGFuZCBpbnZlcnQgdGhlbS4gIFdlIGFsc28gY29weSBvdmVyIHRoZSBncmVlbiBjb21w
b25lbnQgdmFsdWUgaW50byB0aGUgYWxwaGEgdmFsdWUKLSAgICAgICAgICAgIC8vIHRvIGtlZXAg
Q2xlYXJUeXBlIGxvb2tpbmcgcmVhc29uYWJsZS4KLQotICAgICAgICAgICAgLy8gTm93IHRoYXQg
d2UgaGF2ZSBkcmF3biB0aGUgdGV4dCBpbnRvIGEgYml0bWFwIGFuZCBpbnZlcnRlZCBpdCwgb2J0
YWluIGEgQ0dJbWFnZVJlZiBtYXNrLgotICAgICAgICAgICAgQ0dJbWFnZVJlZiBtYXNrID0gZ3Jh
cGhpY3NDb250ZXh0LT5yZWxlYXNlV2luZG93c0JpdG1hcENvbnRleHRJbnRvTWFzayh0ZXh0RHJh
d2luZ0RDLCB0ZXh0UmVjdCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEFwcGx5IHRo
ZSBtYXNrIHRvIHRoZSBmaWxsIGNvbG9yLgotICAgICAgICAgICAgQ0dDb250ZXh0UmVmIGJpdG1h
cENvbnRleHQgPSBncmFwaGljc0NvbnRleHQtPmdldFdpbmRvd3NDb21wYXRpYmxlQ0dCaXRtYXBD
b250ZXh0KHRleHRSZWN0LnNpemUoKSk7Ci0gICAgICAgICAgICBDR0Zsb2F0IHJlZCwgZ3JlZW4s
IGJsdWUsIGFscGhhOwotICAgICAgICAgICAgY29sb3IuZ2V0UkdCQShyZWQsIGdyZWVuLCBibHVl
LCBhbHBoYSk7Ci0gICAgICAgICAgICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoY29udGV4dCwg
cmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotICAgICAgICAgICAgQ0dDb250ZXh0RmlsbFJlY3Qo
Yml0bWFwQ29udGV4dCwgSW50UmVjdCgwLCAwLCB0ZXh0UmVjdC53aWR0aCgpLCB0ZXh0UmVjdC5o
ZWlnaHQoKSkpOwotICAgICAgICAgICAgQ0dJbWFnZVJlZiBmaWxsQ29sb3JJbWFnZSA9IENHQml0
bWFwQ29udGV4dENyZWF0ZUltYWdlKGJpdG1hcENvbnRleHQpOwotICAgICAgICAKLSAgICAgICAg
ICAgIC8vIEFwcGx5IHRoZSBtYXNrLgotICAgICAgICAgICAgQ0dJbWFnZVJlZiBmaW5hbEltYWdl
ID0gQ0dJbWFnZUNyZWF0ZVdpdGhNYXNrKGZpbGxDb2xvckltYWdlLCBtYXNrKTsKLQotICAgICAg
ICAgICAgLy8gVGhlIGJpdG1hcCBpbWFnZSBuZWVkcyB0byBiZSBkcmF3biBpbnRvIHRoZSBIREMu
Ci0gICAgICAgICAgICBncmFwaGljc0NvbnRleHQtPmRyYXdJbWFnZUludG9XaW5kb3dzQ29udGV4
dChoZGMsIGZpbmFsSW1hZ2UpOwotCi0gICAgICAgICAgICAvLyBSZWxlYXNlIG91ciBpbWFnZXMg
YW5kIGNvbnRleHRzLgotICAgICAgICAgICAgQ0dJbWFnZVJlbGVhc2UobWFzayk7Ci0gICAgICAg
ICAgICBDR0ltYWdlUmVsZWFzZShmaWxsQ29sb3JJbWFnZSk7Ci0gICAgICAgICAgICBDR0ltYWdl
UmVsZWFzZShmaW5hbEltYWdlKTsKLSAgICAgICAgICAgIENHQ29udGV4dFJlbGVhc2UoYml0bWFw
Q29udGV4dCk7Ci0gICAgICAgIH0qLwotCi0gICAgICAgIGdyYXBoaWNzQ29udGV4dC0+cmVsZWFz
ZVdpbmRvd3NDb250ZXh0KGhkYywgdGV4dFJlY3QpOwotICAgICAgICByZXR1cm47Ci0gICAgfQot
Ci0gICAgQ0dDb250ZXh0UmVmIGNnQ29udGV4dCA9IGdyYXBoaWNzQ29udGV4dC0+cGxhdGZvcm1D
b250ZXh0KCk7Ci0KLSAgICB1aW50MzJfdCBvbGRGb250U21vb3RoaW5nU3R5bGUgPSB3a1NldEZv
bnRTbW9vdGhpbmdTdHlsZShjZ0NvbnRleHQpOwotCi0gICAgY29uc3QgRm9udFBsYXRmb3JtRGF0
YSYgcGxhdGZvcm1EYXRhID0gZm9udC0+cGxhdGZvcm1EYXRhKCk7Ci0KLSAgICBDR0NvbnRleHRT
ZXRGb250KGNnQ29udGV4dCwgcGxhdGZvcm1EYXRhLmNnRm9udCgpKTsKLQotICAgIENHQWZmaW5l
VHJhbnNmb3JtIG1hdHJpeCA9IENHQWZmaW5lVHJhbnNmb3JtSWRlbnRpdHk7Ci0gICAgbWF0cml4
LmIgPSAtbWF0cml4LmI7Ci0gICAgbWF0cml4LmQgPSAtbWF0cml4LmQ7Ci0KLSAgICBpZiAocGxh
dGZvcm1EYXRhLnN5bnRoZXRpY09ibGlxdWUoKSkKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBmbG9h
dCBza2V3ID0gLXRhbmYoc3ludGhldGljT2JsaXF1ZUFuZ2xlICogYWNvc2YoMCkgLyA5MCk7Ci0g
ICAgICAgIG1hdHJpeCA9IENHQWZmaW5lVHJhbnNmb3JtQ29uY2F0KG1hdHJpeCwgQ0dBZmZpbmVU
cmFuc2Zvcm1NYWtlKDEsIDAsIHNrZXcsIDEsIDAsIDApKTsKLSAgICB9Ci0KLSAgICAvLyBVbmlz
Y3JpYmUgZ2l2ZXMgdXMgb2Zmc2V0cyB0byBoZWxwIHJlZmluZSB0aGUgcG9zaXRpb25pbmcgb2Yg
Y29tYmluaW5nIGdseXBocy4KLSAgICBGbG9hdFNpemUgdHJhbnNsYXRpb24gPSBnbHlwaEJ1ZmZl
ci5vZmZzZXRBdChmcm9tKTsKLSAgICBpZiAodHJhbnNsYXRpb24ud2lkdGgoKSB8fCB0cmFuc2xh
dGlvbi5oZWlnaHQoKSkKLSAgICAgICAgQ0dBZmZpbmVUcmFuc2Zvcm1UcmFuc2xhdGUobWF0cml4
LCB0cmFuc2xhdGlvbi53aWR0aCgpLCB0cmFuc2xhdGlvbi5oZWlnaHQoKSk7Ci0gICAgCi0gICAg
Q0dDb250ZXh0U2V0VGV4dE1hdHJpeChjZ0NvbnRleHQsIG1hdHJpeCk7Ci0KLSAgICBDR0NvbnRl
eHRTZXRGb250U2l6ZShjZ0NvbnRleHQsIHBsYXRmb3JtRGF0YS5zaXplKCkpOwotICAgIENHQ29u
dGV4dFNldFRleHRQb3NpdGlvbihjZ0NvbnRleHQsIHBvaW50LngoKSwgcG9pbnQueSgpKTsKLSAg
ICBDR0NvbnRleHRTaG93R2x5cGhzV2l0aEFkdmFuY2VzKGNnQ29udGV4dCwgZ2x5cGhCdWZmZXIu
Z2x5cGhzKGZyb20pLCBnbHlwaEJ1ZmZlci5hZHZhbmNlcyhmcm9tKSwgbnVtR2x5cGhzKTsKLSAg
ICBpZiAoZm9udC0+bV9zeW50aGV0aWNCb2xkT2Zmc2V0KSB7Ci0gICAgICAgIENHQ29udGV4dFNl
dFRleHRQb3NpdGlvbihjZ0NvbnRleHQsIHBvaW50LngoKSArIGZvbnQtPm1fc3ludGhldGljQm9s
ZE9mZnNldCwgcG9pbnQueSgpKTsKLSAgICAgICAgQ0dDb250ZXh0U2hvd0dseXBoc1dpdGhBZHZh
bmNlcyhjZ0NvbnRleHQsIGdseXBoQnVmZmVyLmdseXBocyhmcm9tKSwgZ2x5cGhCdWZmZXIuYWR2
YW5jZXMoZnJvbSksIG51bUdseXBocyk7Ci0gICAgfQotCi0gICAgd2tSZXN0b3JlRm9udFNtb290
aGluZ1N0eWxlKGNnQ29udGV4dCwgb2xkRm9udFNtb290aGluZ1N0eWxlKTsKLX0KLQogRmxvYXRS
ZWN0IEZvbnQ6OnNlbGVjdGlvblJlY3RGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4s
IGNvbnN0IEludFBvaW50JiBwb2ludCwgaW50IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0CiB7CkluZGV4OiBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRDR1dpbi5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0Q0dX
aW4uY3BwCShyZXZpc2lvbiAyOTgzNCkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW4vR3JhcGhpY3NDb250ZXh0V2luLmNwcDoyOTgzNCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDM4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwg
MjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKworI2luY2x1ZGUgIkFmZmlu
ZVRyYW5zZm9ybS5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGF0
aC5oIgorI2luY2x1ZGUgPENvcmVHcmFwaGljcy9DR0JpdG1hcENvbnRleHQuaD4KKyNpbmNsdWRl
IDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+CisjaW5jbHVk
ZSA8d3RmL01hdGhFeHRyYXMuaD4KKworI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFBsYXRmb3Jt
UHJpdmF0ZS5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK2NsYXNzIFNWR1Jlc291cmNlSW1hZ2U7CisKK3N0YXRpYyBDR0NvbnRleHRSZWYgQ0dDb250
ZXh0V2l0aEhEQyhIREMgaGRjKQoreworICAgIEhCSVRNQVAgYml0bWFwID0gKEhCSVRNQVApR2V0
Q3VycmVudE9iamVjdChoZGMsIE9CSl9CSVRNQVApOworICAgIENHQ29sb3JTcGFjZVJlZiBkZXZp
Y2VSR0IgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKKyAgICBCSVRNQVAgaW5mbzsK
KworICAgIEdldE9iamVjdChiaXRtYXAsIHNpemVvZihpbmZvKSwgJmluZm8pOworICAgIEFTU0VS
VChpbmZvLmJtQml0c1BpeGVsID09IDMyKTsKKyAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IENH
Qml0bWFwQ29udGV4dENyZWF0ZShpbmZvLmJtQml0cywgaW5mby5ibVdpZHRoLCBpbmZvLmJtSGVp
Z2h0LCA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGluZm8uYm1XaWR0aEJ5dGVzLCBkZXZpY2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxl
IHwga0NHSW1hZ2VBbHBoYU5vbmVTa2lwRmlyc3QpOworICAgIENHQ29sb3JTcGFjZVJlbGVhc2Uo
ZGV2aWNlUkdCKTsKKworICAgIC8vIEZsaXAgY29vcmRzCisgICAgQ0dDb250ZXh0VHJhbnNsYXRl
Q1RNKGNvbnRleHQsIDAsIGluZm8uYm1IZWlnaHQpOworICAgIENHQ29udGV4dFNjYWxlQ1RNKGNv
bnRleHQsIDEsIC0xKTsKKyAgICAKKyAgICAvLyBQdXQgdGhlIEhEQyBJbiBhZHZhbmNlZCBtb2Rl
IHNvIGl0IHdpbGwgaG9ub3IgYWZmaW5lIHRyYW5zZm9ybXMuCisgICAgU2V0R3JhcGhpY3NNb2Rl
KGhkYywgR01fQURWQU5DRUQpOworICAgIAorICAgIHJldHVybiBjb250ZXh0OworfQorCitHcmFw
aGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dChIREMgaGRjKQorICAgIDogbV9jb21tb24oY3Jl
YXRlR3JhcGhpY3NDb250ZXh0UHJpdmF0ZSgpKQorICAgICwgbV9kYXRhKG5ldyBHcmFwaGljc0Nv
bnRleHRQbGF0Zm9ybVByaXZhdGUoQ0dDb250ZXh0V2l0aEhEQyhoZGMpKSkKK3sKKyAgICBDR0Nv
bnRleHRSZWxlYXNlKG1fZGF0YS0+bV9jZ0NvbnRleHQpOworICAgIG1fZGF0YS0+bV9oZGMgPSBo
ZGM7CisgICAgc2V0UGFpbnRpbmdEaXNhYmxlZCghbV9kYXRhLT5tX2NnQ29udGV4dCk7CisgICAg
aWYgKG1fZGF0YS0+bV9jZ0NvbnRleHQpIHsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBjb250
ZXh0IHN0YXJ0cyBpbiBzeW5jIHdpdGggb3VyIHN0YXRlLgorICAgICAgICBzZXRQbGF0Zm9ybUZp
bGxDb2xvcihmaWxsQ29sb3IoKSk7CisgICAgICAgIHNldFBsYXRmb3JtU3Ryb2tlQ29sb3Ioc3Ry
b2tlQ29sb3IoKSk7CisgICAgfQorfQorCitIREMgR3JhcGhpY3NDb250ZXh0OjpnZXRXaW5kb3dz
Q29udGV4dChjb25zdCBJbnRSZWN0JiBkc3RSZWN0LCBib29sIHN1cHBvcnRBbHBoYUJsZW5kKQor
eworICAgIGlmIChpblRyYW5zcGFyZW5jeUxheWVyKCkpIHsKKyAgICAgICAgaWYgKGRzdFJlY3Qu
aXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEg
Yml0bWFwIERDIGluIHdoaWNoIHRvIGRyYXcuCisgICAgICAgIEJJVE1BUElORk8gYml0bWFwSW5m
bzsKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlTaXplICAgICAgICAgID0gc2l6ZW9m
KEJJVE1BUElORk9IRUFERVIpOworICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVdpZHRo
ICAgICAgICAgPSBkc3RSZWN0LndpZHRoKCk7IAorICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRl
ci5iaUhlaWdodCAgICAgICAgPSBkc3RSZWN0LmhlaWdodCgpOworICAgICAgICBiaXRtYXBJbmZv
LmJtaUhlYWRlci5iaVBsYW5lcyAgICAgICAgPSAxOworICAgICAgICBiaXRtYXBJbmZvLmJtaUhl
YWRlci5iaUJpdENvdW50ICAgICAgPSAzMjsKKyAgICAgICAgYml0bWFwSW5mby5ibWlIZWFkZXIu
YmlDb21wcmVzc2lvbiAgID0gQklfUkdCOworICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5i
aVNpemVJbWFnZSAgICAgPSAwOworICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVhQZWxz
UGVyTWV0ZXIgPSAwOworICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVlQZWxzUGVyTWV0
ZXIgPSAwOworICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUNsclVzZWQgICAgICAgPSAw
OworICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUNsckltcG9ydGFudCAgPSAwOworCisg
ICAgICAgIHZvaWQqIHBpeGVscyA9IDA7CisgICAgICAgIEhCSVRNQVAgYml0bWFwID0gOjpDcmVh
dGVESUJTZWN0aW9uKE5VTEwsICZiaXRtYXBJbmZvLCBESUJfUkdCX0NPTE9SUywgJnBpeGVscywg
MCwgMCk7CisgICAgICAgIGlmICghYml0bWFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAg
ICAgICAgSERDIGJpdG1hcERDID0gOjpDcmVhdGVDb21wYXRpYmxlREMobV9kYXRhLT5tX2hkYyk7
CisgICAgICAgIDo6U2VsZWN0T2JqZWN0KGJpdG1hcERDLCBiaXRtYXApOworCisgICAgICAgIC8v
IEZpbGwgb3VyIGJ1ZmZlciB3aXRoIGNsZWFyIGlmIHdlJ3JlIGdvaW5nIHRvIGFscGhhIGJsZW5k
LgorICAgICAgICBpZiAoc3VwcG9ydEFscGhhQmxlbmQpIHsKKyAgICAgICAgICAgIEJJVE1BUCBi
bXBJbmZvOworICAgICAgICAgICAgR2V0T2JqZWN0KGJpdG1hcCwgc2l6ZW9mKGJtcEluZm8pLCAm
Ym1wSW5mbyk7CisgICAgICAgICAgICBpbnQgYnVmZmVyU2l6ZSA9IGJtcEluZm8uYm1XaWR0aEJ5
dGVzICogYm1wSW5mby5ibUhlaWdodDsKKyAgICAgICAgICAgIG1lbXNldChibXBJbmZvLmJtQml0
cywgMCwgYnVmZmVyU2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBNYWtlIHN1cmUgd2Ug
Y2FuIGRvIHdvcmxkIHRyYW5zZm9ybXMuCisgICAgICAgIFNldEdyYXBoaWNzTW9kZShiaXRtYXBE
QywgR01fQURWQU5DRUQpOworCisgICAgICAgIC8vIEFwcGx5IGEgdHJhbnNsYXRpb24gdG8gb3Vy
IGNvbnRleHQgc28gdGhhdCB0aGUgZHJhd2luZyBkb25lIHdpbGwgYmUgYXQgKDAsMCkgb2YgdGhl
IGJpdG1hcC4KKyAgICAgICAgWEZPUk0geGZvcm07CisgICAgICAgIHhmb3JtLmVNMTEgPSAxLjA7
CisgICAgICAgIHhmb3JtLmVNMTIgPSAwOworICAgICAgICB4Zm9ybS5lTTIxID0gMDsKKyAgICAg
ICAgeGZvcm0uZU0yMiA9IDEuMDsKKyAgICAgICAgeGZvcm0uZUR4ID0gLWRzdFJlY3QueCgpOwor
ICAgICAgICB4Zm9ybS5lRHkgPSAtZHN0UmVjdC55KCk7CisgICAgICAgIDo6U2V0V29ybGRUcmFu
c2Zvcm0oYml0bWFwREMsICZ4Zm9ybSk7CisKKyAgICAgICAgcmV0dXJuIGJpdG1hcERDOworICAg
IH0KKworICAgIENHQ29udGV4dEZsdXNoKHBsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBtX2RhdGEt
PnNhdmUoKTsKKyAgICByZXR1cm4gbV9kYXRhLT5tX2hkYzsKK30KKworYm9vbCBHcmFwaGljc0Nv
bnRleHQ6OmluVHJhbnNwYXJlbmN5TGF5ZXIoKSBjb25zdCB7IHJldHVybiBtX2RhdGEtPm1fdHJh
bnNwYXJlbmN5Q291bnQ7IH0KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnJlbGVhc2VXaW5kb3dz
Q29udGV4dChIREMgaGRjLCBjb25zdCBJbnRSZWN0JiBkc3RSZWN0LCBib29sIHN1cHBvcnRBbHBo
YUJsZW5kKQoreworICAgIGlmIChoZGMgJiYgaW5UcmFuc3BhcmVuY3lMYXllcigpKSB7CisgICAg
ICAgIGlmIChkc3RSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAg
ICBIQklUTUFQIGJpdG1hcCA9IChIQklUTUFQKUdldEN1cnJlbnRPYmplY3QoaGRjLCBPQkpfQklU
TUFQKTsKKworICAgICAgICAvLyBOZWVkIHRvIG1ha2UgYSBDR0ltYWdlIG91dCBvZiB0aGUgYml0
bWFwJ3MgcGl4ZWwgYnVmZmVyIGFuZCB0aGVuIGRyYXcKKyAgICAgICAgLy8gaXQgaW50byBvdXIg
Y29udGV4dC4KKyAgICAgICAgQklUTUFQIGluZm87CisgICAgICAgIEdldE9iamVjdChiaXRtYXAs
IHNpemVvZihpbmZvKSwgJmluZm8pOworICAgICAgICBBU1NFUlQoaW5mby5ibUJpdHNQaXhlbCA9
PSAzMik7CisKKyAgICAgICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29sb3JTcGFj
ZUNyZWF0ZURldmljZVJHQigpOworICAgICAgICBDR0NvbnRleHRSZWYgYml0bWFwQ29udGV4dCA9
IENHQml0bWFwQ29udGV4dENyZWF0ZShpbmZvLmJtQml0cywgaW5mby5ibVdpZHRoLCBpbmZvLmJt
SGVpZ2h0LCA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBpbmZvLmJtV2lkdGhCeXRlcywgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRl
T3JkZXIzMkxpdHRsZSB8IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAoc3VwcG9ydEFscGhhQmxlbmQgPyBrQ0dJbWFnZUFscGhhUHJl
bXVsdGlwbGllZEZpcnN0IDoga0NHSW1hZ2VBbHBoYU5vbmVTa2lwRmlyc3QpKTsKKyAgICAgICAg
Q0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOworCisgICAgICAgIENHSW1hZ2VSZWYgaW1h
Z2UgPSBDR0JpdG1hcENvbnRleHRDcmVhdGVJbWFnZShiaXRtYXBDb250ZXh0KTsKKyAgICAgICAg
Q0dDb250ZXh0RHJhd0ltYWdlKG1fZGF0YS0+bV9jZ0NvbnRleHQsIGRzdFJlY3QsIGltYWdlKTsK
KyAgICAgICAgCisgICAgICAgIC8vIERlbGV0ZSBhbGwgb3VyIGp1bmsuCisgICAgICAgIENHSW1h
Z2VSZWxlYXNlKGltYWdlKTsKKyAgICAgICAgQ0dDb250ZXh0UmVsZWFzZShiaXRtYXBDb250ZXh0
KTsKKyAgICAgICAgOjpEZWxldGVEQyhoZGMpOworICAgICAgICA6OkRlbGV0ZU9iamVjdChiaXRt
YXApOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtX2RhdGEtPnJlc3RvcmUoKTsK
K30KKwordm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnNhdmUoKQoreworICAg
IGlmICghbV9oZGMpCisgICAgICAgIHJldHVybjsKKyAgICBTYXZlREMobV9oZGMpOworfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6cmVzdG9yZSgpCit7CisgICAgaWYg
KCFtX2hkYykKKyAgICAgICAgcmV0dXJuOworICAgIFJlc3RvcmVEQyhtX2hkYywgLTEpOworfQor
Cit2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y2xpcChjb25zdCBJbnRSZWN0
JiBjbGlwUmVjdCkKK3sKKyAgICBpZiAoIW1faGRjKQorICAgICAgICByZXR1cm47CisgICAgSW50
ZXJzZWN0Q2xpcFJlY3QobV9oZGMsIGNsaXBSZWN0LngoKSwgY2xpcFJlY3QueSgpLCBjbGlwUmVj
dC5yaWdodCgpLCBjbGlwUmVjdC5ib3R0b20oKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlOjpjbGlwKGNvbnN0IFBhdGgmKQoreworICAgIG5vdEltcGxlbWVudGVk
KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpzY2FsZShjb25z
dCBGbG9hdFNpemUmIHNpemUpCit7CisgICAgaWYgKCFtX2hkYykKKyAgICAgICAgcmV0dXJuOwor
ICAgIFhGT1JNIHhmb3JtOworICAgIHhmb3JtLmVNMTEgPSBzaXplLndpZHRoKCk7CisgICAgeGZv
cm0uZU0xMiA9IDA7CisgICAgeGZvcm0uZU0yMSA9IDA7CisgICAgeGZvcm0uZU0yMiA9IHNpemUu
aGVpZ2h0KCk7CisgICAgeGZvcm0uZUR4ID0gMDsKKyAgICB4Zm9ybS5lRHkgPSAwOworICAgIE1v
ZGlmeVdvcmxkVHJhbnNmb3JtKG1faGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOworfQor
CitzdGF0aWMgY29uc3QgZG91YmxlIGRlZzJyYWQgPSAwLjAxNzQ1MzI5MjUxOTk0MzI5NTc2OTsg
Ly8gcGkvMTgwCisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpyb3RhdGUo
ZmxvYXQgZGVncmVlc0FuZ2xlKQoreworICAgIGZsb2F0IHJhZGlhbnNBbmdsZSA9IGRlZ3JlZXNB
bmdsZSAqIGRlZzJyYWQ7CisgICAgZmxvYXQgY29zQW5nbGUgPSBjb3NmKHJhZGlhbnNBbmdsZSk7
CisgICAgZmxvYXQgc2luQW5nbGUgPSBzaW5mKHJhZGlhbnNBbmdsZSk7CisgICAgWEZPUk0geGZv
cm07CisgICAgeGZvcm0uZU0xMSA9IGNvc0FuZ2xlOworICAgIHhmb3JtLmVNMTIgPSAtc2luQW5n
bGU7CisgICAgeGZvcm0uZU0yMSA9IHNpbkFuZ2xlOworICAgIHhmb3JtLmVNMjIgPSBjb3NBbmds
ZTsKKyAgICB4Zm9ybS5lRHggPSAwOworICAgIHhmb3JtLmVEeSA9IDA7CisgICAgTW9kaWZ5V29y
bGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjp0cmFuc2xhdGUoZmxvYXQgeCAsIGZsb2F0
IHkpCit7CisgICAgaWYgKCFtX2hkYykKKyAgICAgICAgcmV0dXJuOworICAgIFhGT1JNIHhmb3Jt
OworICAgIHhmb3JtLmVNMTEgPSAxLjA7CisgICAgeGZvcm0uZU0xMiA9IDA7CisgICAgeGZvcm0u
ZU0yMSA9IDA7CisgICAgeGZvcm0uZU0yMiA9IDEuMDsKKyAgICB4Zm9ybS5lRHggPSB4OworICAg
IHhmb3JtLmVEeSA9IHk7CisgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwg
TVdUX0xFRlRNVUxUSVBMWSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2
YXRlOjpjb25jYXRDVE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFuc2Zvcm0pCit7CisgICAg
aWYgKCFtX2hkYykKKyAgICAgICAgcmV0dXJuOworICAgIENHQWZmaW5lVHJhbnNmb3JtIG1hdCA9
IHRyYW5zZm9ybTsKKyAgICBYRk9STSB4Zm9ybTsKKyAgICB4Zm9ybS5lTTExID0gbWF0LmE7Cisg
ICAgeGZvcm0uZU0xMiA9IG1hdC5iOworICAgIHhmb3JtLmVNMjEgPSBtYXQuYzsKKyAgICB4Zm9y
bS5lTTIyID0gbWF0LmQ7CisgICAgeGZvcm0uZUR4ID0gbWF0LnR4OworICAgIHhmb3JtLmVEeSA9
IG1hdC50eTsKKyAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShtX2hkYywgJnhmb3JtLCBNV1RfTEVG
VE1VTFRJUExZKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1c1JpbmcoY29u
c3QgQ29sb3ImIGNvbG9yKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAg
IHJldHVybjsKKworICAgIGZsb2F0IHJhZGl1cyA9IChmb2N1c1JpbmdXaWR0aCgpIC0gMSkgLyAy
LjBmOworICAgIGludCBvZmZzZXQgPSByYWRpdXMgKyBmb2N1c1JpbmdPZmZzZXQoKTsKKyAgICBD
R0NvbG9yUmVmIGNvbG9yUmVmID0gY29sb3IuaXNWYWxpZCgpID8gY2dDb2xvcihjb2xvcikgOiAw
OworCisgICAgQ0dNdXRhYmxlUGF0aFJlZiBmb2N1c1JpbmdQYXRoID0gQ0dQYXRoQ3JlYXRlTXV0
YWJsZSgpOworICAgIGNvbnN0IFZlY3RvcjxJbnRSZWN0PiYgcmVjdHMgPSBmb2N1c1JpbmdSZWN0
cygpOworICAgIHVuc2lnbmVkIHJlY3RDb3VudCA9IHJlY3RzLnNpemUoKTsKKyAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgcmVjdENvdW50OyBpKyspCisgICAgICAgIENHUGF0aEFkZFJlY3Qo
Zm9jdXNSaW5nUGF0aCwgMCwgQ0dSZWN0SW5zZXQocmVjdHNbaV0sIC1vZmZzZXQsIC1vZmZzZXQp
KTsKKworICAgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCk7CisgICAg
Q0dDb250ZXh0U2F2ZUdTdGF0ZShjb250ZXh0KTsKKworICAgIENHQ29udGV4dEJlZ2luUGF0aChj
b250ZXh0KTsKKyAgICBDR0NvbnRleHRBZGRQYXRoKGNvbnRleHQsIGZvY3VzUmluZ1BhdGgpOwor
CisgICAgd2tEcmF3Rm9jdXNSaW5nKGNvbnRleHQsIGNvbG9yUmVmLCByYWRpdXMpOworCisgICAg
Q0dDb2xvclJlbGVhc2UoY29sb3JSZWYpOworCisgICAgQ0dQYXRoUmVsZWFzZShmb2N1c1JpbmdQ
YXRoKTsKKworICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29udGV4dCk7Cit9CisKK3N0YXRp
YyBjb25zdCBDb2xvciYgc3BlbGxpbmdQYXR0ZXJuQ29sb3IoKSB7CisgICAgc3RhdGljIGNvbnN0
IENvbG9yIHNwZWxsaW5nQ29sb3IoMjU1LCAwLCAwKTsKKyAgICByZXR1cm4gc3BlbGxpbmdDb2xv
cjsKK30KKworc3RhdGljIGNvbnN0IENvbG9yJiBncmFtbWFyUGF0dGVybkNvbG9yKCkgeworICAg
IHN0YXRpYyBjb25zdCBDb2xvciBncmFtbWFyQ29sb3IoMCwgMTI4LCAwKTsKKyAgICByZXR1cm4g
Z3JhbW1hckNvbG9yOworfQorCisvLyBQdWxsZWQgZnJvbSBHcmFwaGljc0NvbnRleHRDRworc3Rh
dGljIHZvaWQgc2V0Q0dTdHJva2VDb2xvcihDR0NvbnRleHRSZWYgY29udGV4dCwgY29uc3QgQ29s
b3ImIGNvbG9yKQoreworICAgIENHRmxvYXQgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGE7CisgICAg
Y29sb3IuZ2V0UkdCQShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisgICAgQ0dDb250ZXh0U2V0
UkdCU3Ryb2tlQ29sb3IoY29udGV4dCwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JNaXNzcGVsbGluZ09yQmFkR3JhbW1hcihj
b25zdCBJbnRQb2ludCYgcG9pbnQsIGludCB3aWR0aCwgYm9vbCBncmFtbWFyKQoreworICAgIGlm
IChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICAvLyBUaGVz
ZSBhcmUgdGhlIHNhbWUgZm9yIG1pc3NwZWxsaW5nIG9yIGJhZCBncmFtbWFyCisgICAgY29uc3Qg
aW50IHBhdHRlcm5IZWlnaHQgPSAzOyAvLyAzIHJvd3MKKyAgICBBU1NFUlQoY01pc3NwZWxsaW5n
TGluZVRoaWNrbmVzcyA9PSBwYXR0ZXJuSGVpZ2h0KTsKKyAgICBjb25zdCBpbnQgcGF0dGVybldp
ZHRoID0gNDsgLy8gNCBwaXhlbHMKKyAgICBBU1NFUlQocGF0dGVybldpZHRoID09IGNNaXNzcGVs
bGluZ0xpbmVQYXR0ZXJuV2lkdGgpOworCisgICAgLy8gTWFrZSBzdXJlIHRvIGRyYXcgb25seSBj
b21wbGV0ZSBkb3RzLgorICAgIC8vIE5PVEU6IENvZGUgaGVyZSB1c2VkIHRvIHNoaWZ0IHRoZSB1
bmRlcmxpbmUgdG8gdGhlIGxlZnQgYW5kIGluY3JlYXNlIHRoZSB3aWR0aAorICAgIC8vIHRvIG1h
a2Ugc3VyZSBldmVyeXRoaW5nIGdldHMgdW5kZXJsaW5lZCwgYnV0IHRoYXQgcmVzdWx0cyBpbiBk
cmF3aW5nIG91dCBvZgorICAgIC8vIGJvdW5kcyAoZS5nLiB3aGVuIGF0IHRoZSBlZGdlIG9mIGEg
dmlldykgYW5kIGNvdWxkIG1ha2UgaXQgYXBwZWFyIHRoYXQgdGhlCisgICAgLy8gc3BhY2UgYmV0
d2VlbiBhZGphY2VudCBtaXNzcGVsbGVkIHdvcmRzIHdhcyB1bmRlcmxpbmVkLgorICAgIC8vIGFs
bG93IHNsaWdodGx5IG1vcmUgY29uc2lkZXJpbmcgdGhhdCB0aGUgcGF0dGVybiBlbmRzIHdpdGgg
YSB0cmFuc3BhcmVudCBwaXhlbAorICAgIGludCB3aWR0aE1vZCA9IHdpZHRoICUgcGF0dGVybldp
ZHRoOworICAgIGlmIChwYXR0ZXJuV2lkdGggLSB3aWR0aE1vZCA+IGNNaXNzcGVsbGluZ0xpbmVQ
YXR0ZXJuR2FwV2lkdGgpCisgICAgICAgIHdpZHRoIC09IHdpZHRoTW9kOworICAgICAgCisgICAg
Ly8gRHJhdyB0aGUgdW5kZXJsaW5lCisgICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBwbGF0Zm9y
bUNvbnRleHQoKTsKKyAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQpOworCisgICAgY29u
c3QgQ29sb3ImIHBhdHRlcm5Db2xvciA9IGdyYW1tYXIgPyBncmFtbWFyUGF0dGVybkNvbG9yKCkg
OiBzcGVsbGluZ1BhdHRlcm5Db2xvcigpOworICAgIHNldENHU3Ryb2tlQ29sb3IoY29udGV4dCwg
cGF0dGVybkNvbG9yKTsKKworICAgIHdrU2V0UGF0dGVyblBoYXNlSW5Vc2VyU3BhY2UoY29udGV4
dCwgcG9pbnQpOworICAgIENHQ29udGV4dFNldEJsZW5kTW9kZShjb250ZXh0LCBrQ0dCbGVuZE1v
ZGVOb3JtYWwpOworICAgIAorICAgIC8vIDMgcm93cywgZWFjaCBvZmZzZXQgYnkgaGFsZiBhIHBp
eGVsIGZvciBibGVuZGluZyBwdXJwb3NlcworICAgIGNvbnN0IENHUG9pbnQgdXBwZXJQb2ludHMg
W10gPSB7e3BvaW50LngoKSwgcG9pbnQueSgpICsgcGF0dGVybkhlaWdodCAtIDIuNSB9LCB7cG9p
bnQueCgpICsgd2lkdGgsIHBvaW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAyLjV9fTsKKyAgICBj
b25zdCBDR1BvaW50IG1pZGRsZVBvaW50cyBbXSA9IHt7cG9pbnQueCgpLCBwb2ludC55KCkgKyBw
YXR0ZXJuSGVpZ2h0IC0gMS41IH0sIHtwb2ludC54KCkgKyB3aWR0aCwgcG9pbnQueSgpICsgcGF0
dGVybkhlaWdodCAtIDEuNX19OworICAgIGNvbnN0IENHUG9pbnQgbG93ZXJQb2ludHMgW10gPSB7
e3BvaW50LngoKSwgcG9pbnQueSgpICsgcGF0dGVybkhlaWdodCAtIDAuNSB9LCB7cG9pbnQueCgp
ICsgd2lkdGgsIHBvaW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAwLjUgfX07CisgICAgCisgICAg
Ly8gRGFzaCBsZW5ndGhzIGZvciB0aGUgdG9wIGFuZCBib3R0b20gb2YgdGhlIGVycm9yIHVuZGVy
bGluZSBhcmUgdGhlIHNhbWUuCisgICAgLy8gVGhlc2UgYXJlIG1hZ2ljLgorICAgIHN0YXRpYyBj
b25zdCBmbG9hdCBlZGdlX2Rhc2hfbGVuZ3Roc1tdID0gezIsIDJ9OworICAgIHN0YXRpYyBjb25z
dCBmbG9hdCBtaWRkbGVfZGFzaF9sZW5ndGhzW10gPSB7Mi43NmYsIDEuMjRmfTsKKyAgICBzdGF0
aWMgY29uc3QgZmxvYXQgZWRnZV9vZmZzZXQgPSAtKGVkZ2VfZGFzaF9sZW5ndGhzWzFdIC0gMS4w
ZikgLyAyLjBmOworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBtaWRkbGVfb2Zmc2V0ID0gLShtaWRk
bGVfZGFzaF9sZW5ndGhzWzFdIC0gMS4wZikgLyAyLjBmOworCisgICAgLy8gTGluZSBvcGFjaXRp
ZXMuICBPbmNlIGFnYWluLCB0aGVzZSBhcmUgbWFnaWMuCisgICAgY29uc3QgZmxvYXQgdXBwZXJP
cGFjaXR5ID0gMC4zM2Y7CisgICAgY29uc3QgZmxvYXQgbWlkZGxlT3BhY2l0eSA9IDAuNzVmOwor
ICAgIGNvbnN0IGZsb2F0IGxvd2VyT3BhY2l0eSA9IDAuODhmOworCisgICAgLy9Ub3AgbGluZQor
ICAgIENHQ29udGV4dFNldExpbmVEYXNoKGNvbnRleHQsIGVkZ2Vfb2Zmc2V0LCBlZGdlX2Rhc2hf
bGVuZ3RocywgCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVkZ2VfZGFzaF9sZW5n
dGhzKSAvIHNpemVvZihlZGdlX2Rhc2hfbGVuZ3Roc1swXSkpOworICAgIENHQ29udGV4dFNldEFs
cGhhKGNvbnRleHQsIHVwcGVyT3BhY2l0eSk7CisgICAgQ0dDb250ZXh0U3Ryb2tlTGluZVNlZ21l
bnRzKGNvbnRleHQsIHVwcGVyUG9pbnRzLCAyKTsKKyAKKyAgICAvLyBNaWRkbGUgbGluZQorICAg
IENHQ29udGV4dFNldExpbmVEYXNoKGNvbnRleHQsIG1pZGRsZV9vZmZzZXQsIG1pZGRsZV9kYXNo
X2xlbmd0aHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihtaWRkbGVfZGFzaF9s
ZW5ndGhzKSAvIHNpemVvZihtaWRkbGVfZGFzaF9sZW5ndGhzWzBdKSk7CisgICAgQ0dDb250ZXh0
U2V0QWxwaGEoY29udGV4dCwgbWlkZGxlT3BhY2l0eSk7CisgICAgQ0dDb250ZXh0U3Ryb2tlTGlu
ZVNlZ21lbnRzKGNvbnRleHQsIG1pZGRsZVBvaW50cywgMik7CisgICAgCisgICAgLy8gQm90dG9t
IGxpbmUKKyAgICBDR0NvbnRleHRTZXRMaW5lRGFzaChjb250ZXh0LCBlZGdlX29mZnNldCwgZWRn
ZV9kYXNoX2xlbmd0aHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVkZ2VfZGFz
aF9sZW5ndGhzKSAvIHNpemVvZihlZGdlX2Rhc2hfbGVuZ3Roc1swXSkpOworICAgIENHQ29udGV4
dFNldEFscGhhKGNvbnRleHQsIGxvd2VyT3BhY2l0eSk7CisgICAgQ0dDb250ZXh0U3Ryb2tlTGlu
ZVNlZ21lbnRzKGNvbnRleHQsIGxvd2VyUG9pbnRzLCAyKTsKKworICAgIENHQ29udGV4dFJlc3Rv
cmVHU3RhdGUoY29udGV4dCk7Cit9CisKKyNpZiBFTkFCTEUoU1ZHKQorR3JhcGhpY3NDb250ZXh0
KiBjb250ZXh0Rm9ySW1hZ2UoU1ZHUmVzb3VyY2VJbWFnZSopCit7CisgICAgLy8gRklYTUU6IFRo
aXMgc2hvdWxkIGdvIGluIEdyYXBoaWNzQ29udGV4dENHLmNwcAorICAgIG5vdEltcGxlbWVudGVk
KCk7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0Q0dXaW4uY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENHV2luLmNwcAkocmV2
aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0Nv
bnRleHRDR1dpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29w
eXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwg
MjAwNywgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKQEAgLTI5LDIxICsyOSwxOCBAQAogI2luY2x1ZGUgIkFmZmluZVRy
YW5zZm9ybS5oIgogI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCiAjaW5jbHVkZSAiUGF0aC5o
IgorCiAjaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NHQml0bWFwQ29udGV4dC5oPgogI2luY2x1ZGUg
PFdlYktpdFN5c3RlbUludGVyZmFjZS9XZWJLaXRTeXN0ZW1JbnRlcmZhY2UuaD4KLSNpbmNsdWRl
IDx3dGYvTWF0aEV4dHJhcy5oPgotCi0jaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlQ0cuaCIK
IAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1jbGFzcyBT
VkdSZXNvdXJjZUltYWdlOwotCiBzdGF0aWMgQ0dDb250ZXh0UmVmIENHQ29udGV4dFdpdGhIREMo
SERDIGhkYykKIHsKLSAgICBIQklUTUFQIGJpdG1hcCA9IChIQklUTUFQKUdldEN1cnJlbnRPYmpl
Y3QoaGRjLCBPQkpfQklUTUFQKTsKKyAgICBIQklUTUFQIGJpdG1hcCA9IHN0YXRpY19jYXN0PEhC
SVRNQVA+KEdldEN1cnJlbnRPYmplY3QoaGRjLCBPQkpfQklUTUFQKSk7CiAgICAgQ0dDb2xvclNw
YWNlUmVmIGRldmljZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwogICAgIEJJ
VE1BUCBpbmZvOwogCkBAIC03Nyw2ICs3NCw4IEBAIEdyYXBoaWNzQ29udGV4dDo6R3JhcGhpY3ND
b250ZXh0KEhEQyBoZGMKICAgICB9CiB9CiAKK2Jvb2wgR3JhcGhpY3NDb250ZXh0OjppblRyYW5z
cGFyZW5jeUxheWVyKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLT5tX3RyYW5zcGFyZW5jeUNvdW50
OyB9CisKIEhEQyBHcmFwaGljc0NvbnRleHQ6OmdldFdpbmRvd3NDb250ZXh0KGNvbnN0IEludFJl
Y3QmIGRzdFJlY3QsIGJvb2wgc3VwcG9ydEFscGhhQmxlbmQpCiB7CiAgICAgaWYgKGluVHJhbnNw
YXJlbmN5TGF5ZXIoKSkgewpAQCAtMTE4LDEwICsxMTcsMTAgQEAgSERDIEdyYXBoaWNzQ29udGV4
dDo6Z2V0V2luZG93c0NvbnRleHQoYwogCiAgICAgICAgIC8vIEFwcGx5IGEgdHJhbnNsYXRpb24g
dG8gb3VyIGNvbnRleHQgc28gdGhhdCB0aGUgZHJhd2luZyBkb25lIHdpbGwgYmUgYXQgKDAsMCkg
b2YgdGhlIGJpdG1hcC4KICAgICAgICAgWEZPUk0geGZvcm07Ci0gICAgICAgIHhmb3JtLmVNMTEg
PSAxLjA7Ci0gICAgICAgIHhmb3JtLmVNMTIgPSAwOwotICAgICAgICB4Zm9ybS5lTTIxID0gMDsK
LSAgICAgICAgeGZvcm0uZU0yMiA9IDEuMDsKKyAgICAgICAgeGZvcm0uZU0xMSA9IDEuMGY7Cisg
ICAgICAgIHhmb3JtLmVNMTIgPSAwLjBmOworICAgICAgICB4Zm9ybS5lTTIxID0gMC4wZjsKKyAg
ICAgICAgeGZvcm0uZU0yMiA9IDEuMGY7CiAgICAgICAgIHhmb3JtLmVEeCA9IC1kc3RSZWN0Lngo
KTsKICAgICAgICAgeGZvcm0uZUR5ID0gLWRzdFJlY3QueSgpOwogICAgICAgICA6OlNldFdvcmxk
VHJhbnNmb3JtKGJpdG1hcERDLCAmeGZvcm0pOwpAQCAtMTM0LDE1ICsxMzMsMTMgQEAgSERDIEdy
YXBoaWNzQ29udGV4dDo6Z2V0V2luZG93c0NvbnRleHQoYwogICAgIHJldHVybiBtX2RhdGEtPm1f
aGRjOwogfQogCi1ib29sIEdyYXBoaWNzQ29udGV4dDo6aW5UcmFuc3BhcmVuY3lMYXllcigpIGNv
bnN0IHsgcmV0dXJuIG1fZGF0YS0+bV90cmFuc3BhcmVuY3lDb3VudDsgfQotCiB2b2lkIEdyYXBo
aWNzQ29udGV4dDo6cmVsZWFzZVdpbmRvd3NDb250ZXh0KEhEQyBoZGMsIGNvbnN0IEludFJlY3Qm
IGRzdFJlY3QsIGJvb2wgc3VwcG9ydEFscGhhQmxlbmQpCiB7CiAgICAgaWYgKGhkYyAmJiBpblRy
YW5zcGFyZW5jeUxheWVyKCkpIHsKICAgICAgICAgaWYgKGRzdFJlY3QuaXNFbXB0eSgpKQogICAg
ICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIEhCSVRNQVAgYml0bWFwID0gKEhCSVRNQVApR2V0
Q3VycmVudE9iamVjdChoZGMsIE9CSl9CSVRNQVApOworICAgICAgICBIQklUTUFQIGJpdG1hcCA9
IHN0YXRpY19jYXN0PEhCSVRNQVA+KEdldEN1cnJlbnRPYmplY3QoaGRjLCBPQkpfQklUTUFQKSk7
CiAKICAgICAgICAgLy8gTmVlZCB0byBtYWtlIGEgQ0dJbWFnZSBvdXQgb2YgdGhlIGJpdG1hcCdz
IHBpeGVsIGJ1ZmZlciBhbmQgdGhlbiBkcmF3CiAgICAgICAgIC8vIGl0IGludG8gb3VyIGNvbnRl
eHQuCkBAIC0yMDMsMTEgKzIwMCwxMSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZTo6c2NhCiAgICAgICAgIHJldHVybjsKICAgICBYRk9STSB4Zm9ybTsKICAgICB4Zm9ybS5l
TTExID0gc2l6ZS53aWR0aCgpOwotICAgIHhmb3JtLmVNMTIgPSAwOwotICAgIHhmb3JtLmVNMjEg
PSAwOworICAgIHhmb3JtLmVNMTIgPSAwLjBmOworICAgIHhmb3JtLmVNMjEgPSAwLjBmOwogICAg
IHhmb3JtLmVNMjIgPSBzaXplLmhlaWdodCgpOwotICAgIHhmb3JtLmVEeCA9IDA7Ci0gICAgeGZv
cm0uZUR5ID0gMDsKKyAgICB4Zm9ybS5lRHggPSAwLjBmOworICAgIHhmb3JtLmVEeSA9IDAuMGY7
CiAgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBM
WSk7CiB9CiAKQEAgLTIyMyw4ICsyMjAsOCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dFBsYXRmb3Jt
UHJpdmF0ZTo6cm90CiAgICAgeGZvcm0uZU0xMiA9IC1zaW5BbmdsZTsKICAgICB4Zm9ybS5lTTIx
ID0gc2luQW5nbGU7CiAgICAgeGZvcm0uZU0yMiA9IGNvc0FuZ2xlOwotICAgIHhmb3JtLmVEeCA9
IDA7Ci0gICAgeGZvcm0uZUR5ID0gMDsKKyAgICB4Zm9ybS5lRHggPSAwLjBmOworICAgIHhmb3Jt
LmVEeSA9IDAuMGY7CiAgICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0obV9oZGMsICZ4Zm9ybSwgTVdU
X0xFRlRNVUxUSVBMWSk7CiB9CiAKQEAgLTIzMywxMCArMjMwLDEwIEBAIHZvaWQgR3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlOjp0cmEKICAgICBpZiAoIW1faGRjKQogICAgICAgICByZXR1
cm47CiAgICAgWEZPUk0geGZvcm07Ci0gICAgeGZvcm0uZU0xMSA9IDEuMDsKLSAgICB4Zm9ybS5l
TTEyID0gMDsKLSAgICB4Zm9ybS5lTTIxID0gMDsKLSAgICB4Zm9ybS5lTTIyID0gMS4wOworICAg
IHhmb3JtLmVNMTEgPSAxLjBmOworICAgIHhmb3JtLmVNMTIgPSAwLjBmOworICAgIHhmb3JtLmVN
MjEgPSAwLjBmOworICAgIHhmb3JtLmVNMjIgPSAxLjBmOwogICAgIHhmb3JtLmVEeCA9IHg7CiAg
ICAgeGZvcm0uZUR5ID0geTsKICAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShtX2hkYywgJnhmb3Jt
LCBNV1RfTEVGVE1VTFRJUExZKTsKQEAgLTI0Niw2ICsyNDMsNyBAQCB2b2lkIEdyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y29uCiB7CiAgICAgaWYgKCFtX2hkYykKICAgICAgICAgcmV0
dXJuOworCiAgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbWF0ID0gdHJhbnNmb3JtOwogICAgIFhGT1JN
IHhmb3JtOwogICAgIHhmb3JtLmVNMTEgPSBtYXQuYTsKQEAgLTI1NCw2ICsyNTIsNyBAQCB2b2lk
IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y29uCiAgICAgeGZvcm0uZU0yMiA9IG1h
dC5kOwogICAgIHhmb3JtLmVEeCA9IG1hdC50eDsKICAgICB4Zm9ybS5lRHkgPSBtYXQudHk7CisK
ICAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShtX2hkYywgJnhmb3JtLCBNV1RfTEVGVE1VTFRJUExZ
KTsKIH0KIApAQCAtMjg3LDYgKzI4NiwxNCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0Zv
Y3VzUmluZyhjb25zCiAgICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShjb250ZXh0KTsKIH0KIAor
Ly8gUHVsbGVkIGZyb20gR3JhcGhpY3NDb250ZXh0Q0cKK3N0YXRpYyB2b2lkIHNldENHU3Ryb2tl
Q29sb3IoQ0dDb250ZXh0UmVmIGNvbnRleHQsIGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBD
R0Zsb2F0IHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhOworICAgIGNvbG9yLmdldFJHQkEocmVkLCBn
cmVlbiwgYmx1ZSwgYWxwaGEpOworICAgIENHQ29udGV4dFNldFJHQlN0cm9rZUNvbG9yKGNvbnRl
eHQsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKK30KKwogc3RhdGljIGNvbnN0IENvbG9yJiBz
cGVsbGluZ1BhdHRlcm5Db2xvcigpIHsKICAgICBzdGF0aWMgY29uc3QgQ29sb3Igc3BlbGxpbmdD
b2xvcigyNTUsIDAsIDApOwogICAgIHJldHVybiBzcGVsbGluZ0NvbG9yOwpAQCAtMjk3LDE5ICsz
MDQsMTEgQEAgc3RhdGljIGNvbnN0IENvbG9yJiBncmFtbWFyUGF0dGVybkNvbG9yKAogICAgIHJl
dHVybiBncmFtbWFyQ29sb3I7CiB9CiAKLS8vIFB1bGxlZCBmcm9tIEdyYXBoaWNzQ29udGV4dENH
Ci1zdGF0aWMgdm9pZCBzZXRDR1N0cm9rZUNvbG9yKENHQ29udGV4dFJlZiBjb250ZXh0LCBjb25z
dCBDb2xvciYgY29sb3IpCi17Ci0gICAgQ0dGbG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsK
LSAgICBjb2xvci5nZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLSAgICBDR0NvbnRl
eHRTZXRSR0JTdHJva2VDb2xvcihjb250ZXh0LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci19
Ci0KIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvck1pc3NwZWxsaW5nT3JCYWRHcmFt
bWFyKGNvbnN0IEludFBvaW50JiBwb2ludCwgaW50IHdpZHRoLCBib29sIGdyYW1tYXIpCiB7CiAg
ICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKICAgICAgICAgcmV0dXJuOwotICAgIAorCiAgICAg
Ly8gVGhlc2UgYXJlIHRoZSBzYW1lIGZvciBtaXNzcGVsbGluZyBvciBiYWQgZ3JhbW1hcgogICAg
IGNvbnN0IGludCBwYXR0ZXJuSGVpZ2h0ID0gMzsgLy8gMyByb3dzCiAgICAgQVNTRVJUKGNNaXNz
cGVsbGluZ0xpbmVUaGlja25lc3MgPT0gcGF0dGVybkhlaWdodCk7CkBAIC0zNDMsNyArMzQyLDcg
QEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yTWlzc3BlbAogICAgIAogICAgIC8v
IERhc2ggbGVuZ3RocyBmb3IgdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBlcnJvciB1bmRlcmxp
bmUgYXJlIHRoZSBzYW1lLgogICAgIC8vIFRoZXNlIGFyZSBtYWdpYy4KLSAgICBzdGF0aWMgY29u
c3QgZmxvYXQgZWRnZV9kYXNoX2xlbmd0aHNbXSA9IHsyLCAyfTsKKyAgICBzdGF0aWMgY29uc3Qg
ZmxvYXQgZWRnZV9kYXNoX2xlbmd0aHNbXSA9IHsyLjBmLCAyLjBmfTsKICAgICBzdGF0aWMgY29u
c3QgZmxvYXQgbWlkZGxlX2Rhc2hfbGVuZ3Roc1tdID0gezIuNzZmLCAxLjI0Zn07CiAgICAgc3Rh
dGljIGNvbnN0IGZsb2F0IGVkZ2Vfb2Zmc2V0ID0gLShlZGdlX2Rhc2hfbGVuZ3Roc1sxXSAtIDEu
MGYpIC8gMi4wZjsKICAgICBzdGF0aWMgY29uc3QgZmxvYXQgbWlkZGxlX29mZnNldCA9IC0obWlk
ZGxlX2Rhc2hfbGVuZ3Roc1sxXSAtIDEuMGYpIC8gMi4wZjsKQEAgLTM3NCwxMyArMzczLDQgQEAg
dm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yTWlzc3BlbAogICAgIENHQ29udGV4dFJl
c3RvcmVHU3RhdGUoY29udGV4dCk7CiB9CiAKLSNpZiBFTkFCTEUoU1ZHKQotR3JhcGhpY3NDb250
ZXh0KiBjb250ZXh0Rm9ySW1hZ2UoU1ZHUmVzb3VyY2VJbWFnZSopCi17Ci0gICAgLy8gRklYTUU6
IFRoaXMgc2hvdWxkIGdvIGluIEdyYXBoaWNzQ29udGV4dENHLmNwcAotICAgIG5vdEltcGxlbWVu
dGVkKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQogfQpJbmRleDogV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0Q2Fpcm9XaW4uY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzQ29udGV4dENhaXJvV2lu
LmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBo
aWNzQ29udGV4dENhaXJvV2luLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMTQgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVU
RVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRF
UiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0Lmgi
CisKKyNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRl
ZC5oIgorI2luY2x1ZGUgIlBhdGguaCIKKworI2luY2x1ZGUgPGNhaXJvLXdpbjMyLmg+CisjaW5j
bHVkZSAiR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlQ2Fpcm8uaCIKKwordXNpbmcgbmFt
ZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitHcmFwaGljc0NvbnRleHQ6Okdy
YXBoaWNzQ29udGV4dChIREMgZGMpCisgICAgOiBtX2NvbW1vbihjcmVhdGVHcmFwaGljc0NvbnRl
eHRQcml2YXRlKCkpCisgICAgLCBtX2RhdGEobmV3IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZSkKK3sKKyAgICBpZiAoZGMpIHsKKyAgICAgICAgY2Fpcm9fc3VyZmFjZV90KiBzdXJmYWNl
ID0gY2Fpcm9fd2luMzJfc3VyZmFjZV9jcmVhdGUoZGMpOworICAgICAgICBtX2RhdGEtPmNyID0g
Y2Fpcm9fY3JlYXRlKHN1cmZhY2UpOworICAgICAgICBtX2RhdGEtPm1faGRjID0gZGM7CisgICAg
fSBlbHNlIHsKKyAgICAgICAgc2V0UGFpbnRpbmdEaXNhYmxlZCh0cnVlKTsKKyAgICAgICAgbV9k
YXRhLT5jciA9IDA7CisgICAgICAgIG1fZGF0YS0+bV9oZGMgPSAwOworICAgIH0KKworICAgIGlm
IChtX2RhdGEtPmNyKSB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGV4dCBzdGFydHMg
aW4gc3luYyB3aXRoIG91ciBzdGF0ZS4KKyAgICAgICAgc2V0UGxhdGZvcm1GaWxsQ29sb3IoZmls
bENvbG9yKCkpOworICAgICAgICBzZXRQbGF0Zm9ybVN0cm9rZUNvbG9yKHN0cm9rZUNvbG9yKCkp
OworICAgIH0KK30KKworSERDIEdyYXBoaWNzQ29udGV4dDo6Z2V0V2luZG93c0NvbnRleHQoY29u
c3QgSW50UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVuZCkKK3sKKyAgICAvLyBU
aGlzIGlzIHByb2JhYmx5IHdyb25nLCBhbmQgZGVmaW5pdGVseSBvdXQgb2YgZGF0ZS4gIFB1bGxl
ZCBmcm9tIG9sZCBTVk4KKyAgICBjYWlyb19zdXJmYWNlX3QqIHN1cmZhY2UgPSBjYWlyb19nZXRf
dGFyZ2V0KHBsYXRmb3JtQ29udGV4dCgpKTsKKyAgICBIREMgaGRjID0gY2Fpcm9fd2luMzJfc3Vy
ZmFjZV9nZXRfZGMoc3VyZmFjZSk7ICAgCisgICAgU2F2ZURDKGhkYyk7CisKKyAgICAvLyBGSVhN
RTogV2UgbmVlZCB0byBtYWtlIHN1cmUgYSBjbGlwIGlzIHJlYWxseSBzZXQgb24gdGhlIEhEQy4K
KyAgICAvLyBDYWxsIFNldFdvcmxkVHJhbnNmb3JtIHRvIGhvbm9yIHRoZSBjdXJyZW50IENhaXJv
IHRyYW5zZm9ybS4KKyAgICBTZXRHcmFwaGljc01vZGUoaGRjLCBHTV9BRFZBTkNFRCk7IC8vIFdl
IG5lZWQgdGhpcyBjYWxsIGZvciB0aGVtZXMgdG8gaG9ub3Igd29ybGQgdHJhbnNmb3Jtcy4KKyAg
ICBjYWlyb19tYXRyaXhfdCBtYXQ7CisgICAgY2Fpcm9fZ2V0X21hdHJpeChwbGF0Zm9ybUNvbnRl
eHQoKSwgJm1hdCk7CisgICAgWEZPUk0geGZvcm07CisgICAgeGZvcm0uZU0xMSA9IG1hdC54eDsK
KyAgICB4Zm9ybS5lTTEyID0gbWF0Lnh5OworICAgIHhmb3JtLmVNMjEgPSBtYXQueXg7CisgICAg
eGZvcm0uZU0yMiA9IG1hdC55eTsKKyAgICB4Zm9ybS5lRHggPSBtYXQueDA7CisgICAgeGZvcm0u
ZUR5ID0gbWF0LnkwOworICAgIFNldFdvcmxkVHJhbnNmb3JtKGhkYywgJnhmb3JtKTsKKworICAg
IHJldHVybiBoZGM7Cit9CisKK2Jvb2wgR3JhcGhpY3NDb250ZXh0OjppblRyYW5zcGFyZW5jeUxh
eWVyKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLT5tX3RyYW5zcGFyZW5jeUNvdW50OyB9CisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0OjpyZWxlYXNlV2luZG93c0NvbnRleHQoSERDIGhkYywgY29uc3Qg
SW50UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVuZCkKK3sKKyAgICBjYWlyb19z
dXJmYWNlX3QqIHN1cmZhY2UgPSBjYWlyb19nZXRfdGFyZ2V0KHBsYXRmb3JtQ29udGV4dCgpKTsK
KyAgICBIREMgaGRjMiA9IGNhaXJvX3dpbjMyX3N1cmZhY2VfZ2V0X2RjKHN1cmZhY2UpOworICAg
IFJlc3RvcmVEQyhoZGMyLCAtMSk7CisgICAgY2Fpcm9fc3VyZmFjZV9tYXJrX2RpcnR5KHN1cmZh
Y2UpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y29uY2F0Q1RNKGNvbnN0IEFmZmluZVRy
YW5zZm9ybSYgdHJhbnNmb3JtKQoreworICAgIGNhaXJvX3N1cmZhY2VfdCogc3VyZmFjZSA9IGNh
aXJvX2dldF90YXJnZXQocGxhdGZvcm1Db250ZXh0KCkpOworICAgIEhEQyBoZGMgPSBjYWlyb193
aW4zMl9zdXJmYWNlX2dldF9kYyhzdXJmYWNlKTsgICAKKyAgICBTYXZlREMoaGRjKTsKKworICAg
IGNhaXJvX21hdHJpeF90IG1hdDsKKyAgICBjYWlyb19nZXRfbWF0cml4KHBsYXRmb3JtQ29udGV4
dCgpLCAmbWF0KTsKKyAgICBYRk9STSB4Zm9ybTsKKyAgICB4Zm9ybS5lTTExID0gbWF0Lnh4Owor
ICAgIHhmb3JtLmVNMTIgPSBtYXQueHk7CisgICAgeGZvcm0uZU0yMSA9IG1hdC55eDsKKyAgICB4
Zm9ybS5lTTIyID0gbWF0Lnl5OworICAgIHhmb3JtLmVEeCA9IG1hdC54MDsKKyAgICB4Zm9ybS5l
RHkgPSBtYXQueTA7CisKKyAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShoZGMsICZ4Zm9ybSwgTVdU
X0xFRlRNVUxUSVBMWSk7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luL0dyYXBoaWNzQ29udGV4dFdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vR3JhcGhpY3NDb250ZXh0V2luLmNwcAkocmV2aXNpb24gMzAwNDgpCisr
KyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0NvbnRleHRXaW4uY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMywg
MjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CkBAIC0yOSwzNTEgKzI5LDE0IEBACiAjaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCiAjaW5j
bHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRlICJQYXRoLmgiCi0jaW5jbHVkZSA8Q29y
ZUdyYXBoaWNzL0NHQml0bWFwQ29udGV4dC5oPgotI2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVy
ZmFjZS9XZWJLaXRTeXN0ZW1JbnRlcmZhY2UuaD4KICNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5o
PgogCi0jaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmgiCi0KIHVzaW5n
IG5hbWVzcGFjZSBzdGQ7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xhc3MgU1ZHUmVzb3Vy
Y2VJbWFnZTsKIAotc3RhdGljIENHQ29udGV4dFJlZiBDR0NvbnRleHRXaXRoSERDKEhEQyBoZGMp
Ci17Ci0gICAgSEJJVE1BUCBiaXRtYXAgPSAoSEJJVE1BUClHZXRDdXJyZW50T2JqZWN0KGhkYywg
T0JKX0JJVE1BUCk7Ci0gICAgQ0dDb2xvclNwYWNlUmVmIGRldmljZVJHQiA9IENHQ29sb3JTcGFj
ZUNyZWF0ZURldmljZVJHQigpOwotICAgIEJJVE1BUCBpbmZvOwotCi0gICAgR2V0T2JqZWN0KGJp
dG1hcCwgc2l6ZW9mKGluZm8pLCAmaW5mbyk7Ci0gICAgQVNTRVJUKGluZm8uYm1CaXRzUGl4ZWwg
PT0gMzIpOwotICAgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRl
KGluZm8uYm1CaXRzLCBpbmZvLmJtV2lkdGgsIGluZm8uYm1IZWlnaHQsIDgsCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5ibVdpZHRoQnl0ZXMs
IGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhhTm9u
ZVNraXBGaXJzdCk7Ci0gICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOwotCi0gICAg
Ly8gRmxpcCBjb29yZHMKLSAgICBDR0NvbnRleHRUcmFuc2xhdGVDVE0oY29udGV4dCwgMCwgaW5m
by5ibUhlaWdodCk7Ci0gICAgQ0dDb250ZXh0U2NhbGVDVE0oY29udGV4dCwgMSwgLTEpOwotICAg
IAotICAgIC8vIFB1dCB0aGUgSERDIEluIGFkdmFuY2VkIG1vZGUgc28gaXQgd2lsbCBob25vciBh
ZmZpbmUgdHJhbnNmb3Jtcy4KLSAgICBTZXRHcmFwaGljc01vZGUoaGRjLCBHTV9BRFZBTkNFRCk7
Ci0gICAgCi0gICAgcmV0dXJuIGNvbnRleHQ7Ci19Ci0KLUdyYXBoaWNzQ29udGV4dDo6R3JhcGhp
Y3NDb250ZXh0KEhEQyBoZGMpCi0gICAgOiBtX2NvbW1vbihjcmVhdGVHcmFwaGljc0NvbnRleHRQ
cml2YXRlKCkpCi0gICAgLCBtX2RhdGEobmV3IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0
ZShDR0NvbnRleHRXaXRoSERDKGhkYykpKQotewotICAgIENHQ29udGV4dFJlbGVhc2UobV9kYXRh
LT5tX2NnQ29udGV4dCk7Ci0gICAgbV9kYXRhLT5tX2hkYyA9IGhkYzsKLSAgICBzZXRQYWludGlu
Z0Rpc2FibGVkKCFtX2RhdGEtPm1fY2dDb250ZXh0KTsKLSAgICBpZiAobV9kYXRhLT5tX2NnQ29u
dGV4dCkgewotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGNvbnRleHQgc3RhcnRzIGluIHN5bmMg
d2l0aCBvdXIgc3RhdGUuCi0gICAgICAgIHNldFBsYXRmb3JtRmlsbENvbG9yKGZpbGxDb2xvcigp
KTsKLSAgICAgICAgc2V0UGxhdGZvcm1TdHJva2VDb2xvcihzdHJva2VDb2xvcigpKTsKLSAgICB9
Ci19Ci0KLUhEQyBHcmFwaGljc0NvbnRleHQ6OmdldFdpbmRvd3NDb250ZXh0KGNvbnN0IEludFJl
Y3QmIGRzdFJlY3QsIGJvb2wgc3VwcG9ydEFscGhhQmxlbmQpCi17Ci0gICAgaWYgKGluVHJhbnNw
YXJlbmN5TGF5ZXIoKSkgewotICAgICAgICBpZiAoZHN0UmVjdC5pc0VtcHR5KCkpCi0gICAgICAg
ICAgICByZXR1cm4gMDsKLQotICAgICAgICAvLyBDcmVhdGUgYSBiaXRtYXAgREMgaW4gd2hpY2gg
dG8gZHJhdy4KLSAgICAgICAgQklUTUFQSU5GTyBiaXRtYXBJbmZvOwotICAgICAgICBiaXRtYXBJ
bmZvLmJtaUhlYWRlci5iaVNpemUgICAgICAgICAgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7
Ci0gICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpV2lkdGggICAgICAgICA9IGRzdFJlY3Qu
d2lkdGgoKTsgCi0gICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpSGVpZ2h0ICAgICAgICA9
IGRzdFJlY3QuaGVpZ2h0KCk7Ci0gICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpUGxhbmVz
ICAgICAgICA9IDE7Ci0gICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpQml0Q291bnQgICAg
ICA9IDMyOwotICAgICAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUNvbXByZXNzaW9uICAgPSBC
SV9SR0I7Ci0gICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpU2l6ZUltYWdlICAgICA9IDA7
Ci0gICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpWFBlbHNQZXJNZXRlciA9IDA7Ci0gICAg
ICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpWVBlbHNQZXJNZXRlciA9IDA7Ci0gICAgICAgIGJp
dG1hcEluZm8uYm1pSGVhZGVyLmJpQ2xyVXNlZCAgICAgICA9IDA7Ci0gICAgICAgIGJpdG1hcElu
Zm8uYm1pSGVhZGVyLmJpQ2xySW1wb3J0YW50ICA9IDA7Ci0KLSAgICAgICAgdm9pZCogcGl4ZWxz
ID0gMDsKLSAgICAgICAgSEJJVE1BUCBiaXRtYXAgPSA6OkNyZWF0ZURJQlNlY3Rpb24oTlVMTCwg
JmJpdG1hcEluZm8sIERJQl9SR0JfQ09MT1JTLCAmcGl4ZWxzLCAwLCAwKTsKLSAgICAgICAgaWYg
KCFiaXRtYXApCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBIREMgYml0bWFwREMg
PSA6OkNyZWF0ZUNvbXBhdGlibGVEQyhtX2RhdGEtPm1faGRjKTsKLSAgICAgICAgOjpTZWxlY3RP
YmplY3QoYml0bWFwREMsIGJpdG1hcCk7Ci0KLSAgICAgICAgLy8gRmlsbCBvdXIgYnVmZmVyIHdp
dGggY2xlYXIgaWYgd2UncmUgZ29pbmcgdG8gYWxwaGEgYmxlbmQuCi0gICAgICAgIGlmIChzdXBw
b3J0QWxwaGFCbGVuZCkgewotICAgICAgICAgICAgQklUTUFQIGJtcEluZm87Ci0gICAgICAgICAg
ICBHZXRPYmplY3QoYml0bWFwLCBzaXplb2YoYm1wSW5mbyksICZibXBJbmZvKTsKLSAgICAgICAg
ICAgIGludCBidWZmZXJTaXplID0gYm1wSW5mby5ibVdpZHRoQnl0ZXMgKiBibXBJbmZvLmJtSGVp
Z2h0OwotICAgICAgICAgICAgbWVtc2V0KGJtcEluZm8uYm1CaXRzLCAwLCBidWZmZXJTaXplKTsK
LSAgICAgICAgfQotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBjYW4gZG8gd29ybGQgdHJhbnNm
b3Jtcy4KLSAgICAgICAgU2V0R3JhcGhpY3NNb2RlKGJpdG1hcERDLCBHTV9BRFZBTkNFRCk7Ci0K
LSAgICAgICAgLy8gQXBwbHkgYSB0cmFuc2xhdGlvbiB0byBvdXIgY29udGV4dCBzbyB0aGF0IHRo
ZSBkcmF3aW5nIGRvbmUgd2lsbCBiZSBhdCAoMCwwKSBvZiB0aGUgYml0bWFwLgotICAgICAgICBY
Rk9STSB4Zm9ybTsKLSAgICAgICAgeGZvcm0uZU0xMSA9IDEuMDsKLSAgICAgICAgeGZvcm0uZU0x
MiA9IDA7Ci0gICAgICAgIHhmb3JtLmVNMjEgPSAwOwotICAgICAgICB4Zm9ybS5lTTIyID0gMS4w
OwotICAgICAgICB4Zm9ybS5lRHggPSAtZHN0UmVjdC54KCk7Ci0gICAgICAgIHhmb3JtLmVEeSA9
IC1kc3RSZWN0LnkoKTsKLSAgICAgICAgOjpTZXRXb3JsZFRyYW5zZm9ybShiaXRtYXBEQywgJnhm
b3JtKTsKLQotICAgICAgICByZXR1cm4gYml0bWFwREM7Ci0gICAgfQotCi0gICAgQ0dDb250ZXh0
Rmx1c2gocGxhdGZvcm1Db250ZXh0KCkpOwotICAgIG1fZGF0YS0+c2F2ZSgpOwotICAgIHJldHVy
biBtX2RhdGEtPm1faGRjOwotfQotCi1ib29sIEdyYXBoaWNzQ29udGV4dDo6aW5UcmFuc3BhcmVu
Y3lMYXllcigpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS0+bV90cmFuc3BhcmVuY3lDb3VudDsgfQot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDo6cmVsZWFzZVdpbmRvd3NDb250ZXh0KEhEQyBoZGMsIGNv
bnN0IEludFJlY3QmIGRzdFJlY3QsIGJvb2wgc3VwcG9ydEFscGhhQmxlbmQpCi17Ci0gICAgaWYg
KGhkYyAmJiBpblRyYW5zcGFyZW5jeUxheWVyKCkpIHsKLSAgICAgICAgaWYgKGRzdFJlY3QuaXNF
bXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIEhCSVRNQVAgYml0bWFwID0g
KEhCSVRNQVApR2V0Q3VycmVudE9iamVjdChoZGMsIE9CSl9CSVRNQVApOwotCi0gICAgICAgIC8v
IE5lZWQgdG8gbWFrZSBhIENHSW1hZ2Ugb3V0IG9mIHRoZSBiaXRtYXAncyBwaXhlbCBidWZmZXIg
YW5kIHRoZW4gZHJhdwotICAgICAgICAvLyBpdCBpbnRvIG91ciBjb250ZXh0LgotICAgICAgICBC
SVRNQVAgaW5mbzsKLSAgICAgICAgR2V0T2JqZWN0KGJpdG1hcCwgc2l6ZW9mKGluZm8pLCAmaW5m
byk7Ci0gICAgICAgIEFTU0VSVChpbmZvLmJtQml0c1BpeGVsID09IDMyKTsKLQotICAgICAgICBD
R0NvbG9yU3BhY2VSZWYgZGV2aWNlUkdCID0gQ0dDb2xvclNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7
Ci0gICAgICAgIENHQ29udGV4dFJlZiBiaXRtYXBDb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3Jl
YXRlKGluZm8uYm1CaXRzLCBpbmZvLmJtV2lkdGgsIGluZm8uYm1IZWlnaHQsIDgsCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8u
Ym1XaWR0aEJ5dGVzLCBkZXZpY2VSR0IsIGtDR0JpdG1hcEJ5dGVPcmRlcjMyTGl0dGxlIHwgCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChzdXBwb3J0QWxwaGFCbGVuZCA/IGtDR0ltYWdlQWxwaGFQcmVtdWx0aXBsaWVkRmlyc3QgOiBr
Q0dJbWFnZUFscGhhTm9uZVNraXBGaXJzdCkpOwotICAgICAgICBDR0NvbG9yU3BhY2VSZWxlYXNl
KGRldmljZVJHQik7Ci0KLSAgICAgICAgQ0dJbWFnZVJlZiBpbWFnZSA9IENHQml0bWFwQ29udGV4
dENyZWF0ZUltYWdlKGJpdG1hcENvbnRleHQpOwotICAgICAgICBDR0NvbnRleHREcmF3SW1hZ2Uo
bV9kYXRhLT5tX2NnQ29udGV4dCwgZHN0UmVjdCwgaW1hZ2UpOwotICAgICAgICAKLSAgICAgICAg
Ly8gRGVsZXRlIGFsbCBvdXIganVuay4KLSAgICAgICAgQ0dJbWFnZVJlbGVhc2UoaW1hZ2UpOwot
ICAgICAgICBDR0NvbnRleHRSZWxlYXNlKGJpdG1hcENvbnRleHQpOwotICAgICAgICA6OkRlbGV0
ZURDKGhkYyk7Ci0gICAgICAgIDo6RGVsZXRlT2JqZWN0KGJpdG1hcCk7Ci0KLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLQotICAgIG1fZGF0YS0+cmVzdG9yZSgpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6c2F2ZSgpCi17Ci0gICAgaWYgKCFtX2hkYykKLSAgICAg
ICAgcmV0dXJuOwotICAgIFNhdmVEQyhtX2hkYyk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
UGxhdGZvcm1Qcml2YXRlOjpyZXN0b3JlKCkKLXsKLSAgICBpZiAoIW1faGRjKQotICAgICAgICBy
ZXR1cm47Ci0gICAgUmVzdG9yZURDKG1faGRjLCAtMSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0UGxhdGZvcm1Qcml2YXRlOjpjbGlwKGNvbnN0IEludFJlY3QmIGNsaXBSZWN0KQotewotICAg
IGlmICghbV9oZGMpCi0gICAgICAgIHJldHVybjsKLSAgICBJbnRlcnNlY3RDbGlwUmVjdChtX2hk
YywgY2xpcFJlY3QueCgpLCBjbGlwUmVjdC55KCksIGNsaXBSZWN0LnJpZ2h0KCksIGNsaXBSZWN0
LmJvdHRvbSgpKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNs
aXAoY29uc3QgUGF0aCYpCi17Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnNjYWxlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkK
LXsKLSAgICBpZiAoIW1faGRjKQotICAgICAgICByZXR1cm47Ci0gICAgWEZPUk0geGZvcm07Ci0g
ICAgeGZvcm0uZU0xMSA9IHNpemUud2lkdGgoKTsKLSAgICB4Zm9ybS5lTTEyID0gMDsKLSAgICB4
Zm9ybS5lTTIxID0gMDsKLSAgICB4Zm9ybS5lTTIyID0gc2l6ZS5oZWlnaHQoKTsKLSAgICB4Zm9y
bS5lRHggPSAwOwotICAgIHhmb3JtLmVEeSA9IDA7Ci0gICAgTW9kaWZ5V29ybGRUcmFuc2Zvcm0o
bV9oZGMsICZ4Zm9ybSwgTVdUX0xFRlRNVUxUSVBMWSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBkb3Vi
bGUgZGVnMnJhZCA9IDAuMDE3NDUzMjkyNTE5OTQzMjk1NzY5OyAvLyBwaS8xODAKLQotdm9pZCBH
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OnJvdGF0ZShmbG9hdCBkZWdyZWVzQW5nbGUp
Ci17Ci0gICAgZmxvYXQgcmFkaWFuc0FuZ2xlID0gZGVncmVlc0FuZ2xlICogZGVnMnJhZDsKLSAg
ICBmbG9hdCBjb3NBbmdsZSA9IGNvc2YocmFkaWFuc0FuZ2xlKTsKLSAgICBmbG9hdCBzaW5Bbmds
ZSA9IHNpbmYocmFkaWFuc0FuZ2xlKTsKLSAgICBYRk9STSB4Zm9ybTsKLSAgICB4Zm9ybS5lTTEx
ID0gY29zQW5nbGU7Ci0gICAgeGZvcm0uZU0xMiA9IC1zaW5BbmdsZTsKLSAgICB4Zm9ybS5lTTIx
ID0gc2luQW5nbGU7Ci0gICAgeGZvcm0uZU0yMiA9IGNvc0FuZ2xlOwotICAgIHhmb3JtLmVEeCA9
IDA7Ci0gICAgeGZvcm0uZUR5ID0gMDsKLSAgICBNb2RpZnlXb3JsZFRyYW5zZm9ybShtX2hkYywg
Jnhmb3JtLCBNV1RfTEVGVE1VTFRJUExZKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGU6OnRyYW5zbGF0ZShmbG9hdCB4ICwgZmxvYXQgeSkKLXsKLSAgICBpZiAoIW1f
aGRjKQotICAgICAgICByZXR1cm47Ci0gICAgWEZPUk0geGZvcm07Ci0gICAgeGZvcm0uZU0xMSA9
IDEuMDsKLSAgICB4Zm9ybS5lTTEyID0gMDsKLSAgICB4Zm9ybS5lTTIxID0gMDsKLSAgICB4Zm9y
bS5lTTIyID0gMS4wOwotICAgIHhmb3JtLmVEeCA9IHg7Ci0gICAgeGZvcm0uZUR5ID0geTsKLSAg
ICBNb2RpZnlXb3JsZFRyYW5zZm9ybShtX2hkYywgJnhmb3JtLCBNV1RfTEVGVE1VTFRJUExZKTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGU6OmNvbmNhdENUTShjb25z
dCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSkKLXsKLSAgICBpZiAoIW1faGRjKQotICAgICAg
ICByZXR1cm47Ci0gICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbWF0ID0gdHJhbnNmb3JtOwotICAgIFhG
T1JNIHhmb3JtOwotICAgIHhmb3JtLmVNMTEgPSBtYXQuYTsKLSAgICB4Zm9ybS5lTTEyID0gbWF0
LmI7Ci0gICAgeGZvcm0uZU0yMSA9IG1hdC5jOwotICAgIHhmb3JtLmVNMjIgPSBtYXQuZDsKLSAg
ICB4Zm9ybS5lRHggPSBtYXQudHg7Ci0gICAgeGZvcm0uZUR5ID0gbWF0LnR5OwotICAgIE1vZGlm
eVdvcmxkVHJhbnNmb3JtKG1faGRjLCAmeGZvcm0sIE1XVF9MRUZUTVVMVElQTFkpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0ZvY3VzUmluZyhjb25zdCBDb2xvciYgY29sb3IpCi17
Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZmxv
YXQgcmFkaXVzID0gKGZvY3VzUmluZ1dpZHRoKCkgLSAxKSAvIDIuMGY7Ci0gICAgaW50IG9mZnNl
dCA9IHJhZGl1cyArIGZvY3VzUmluZ09mZnNldCgpOwotICAgIENHQ29sb3JSZWYgY29sb3JSZWYg
PSBjb2xvci5pc1ZhbGlkKCkgPyBjZ0NvbG9yKGNvbG9yKSA6IDA7Ci0KLSAgICBDR011dGFibGVQ
YXRoUmVmIGZvY3VzUmluZ1BhdGggPSBDR1BhdGhDcmVhdGVNdXRhYmxlKCk7Ci0gICAgY29uc3Qg
VmVjdG9yPEludFJlY3Q+JiByZWN0cyA9IGZvY3VzUmluZ1JlY3RzKCk7Ci0gICAgdW5zaWduZWQg
cmVjdENvdW50ID0gcmVjdHMuc2l6ZSgpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBy
ZWN0Q291bnQ7IGkrKykKLSAgICAgICAgQ0dQYXRoQWRkUmVjdChmb2N1c1JpbmdQYXRoLCAwLCBD
R1JlY3RJbnNldChyZWN0c1tpXSwgLW9mZnNldCwgLW9mZnNldCkpOwotCi0gICAgQ0dDb250ZXh0
UmVmIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKTsKLSAgICBDR0NvbnRleHRTYXZlR1N0YXRl
KGNvbnRleHQpOwotCi0gICAgQ0dDb250ZXh0QmVnaW5QYXRoKGNvbnRleHQpOwotICAgIENHQ29u
dGV4dEFkZFBhdGgoY29udGV4dCwgZm9jdXNSaW5nUGF0aCk7Ci0KLSAgICB3a0RyYXdGb2N1c1Jp
bmcoY29udGV4dCwgY29sb3JSZWYsIHJhZGl1cyk7Ci0KLSAgICBDR0NvbG9yUmVsZWFzZShjb2xv
clJlZik7Ci0KLSAgICBDR1BhdGhSZWxlYXNlKGZvY3VzUmluZ1BhdGgpOwotCi0gICAgQ0dDb250
ZXh0UmVzdG9yZUdTdGF0ZShjb250ZXh0KTsKLX0KLQotc3RhdGljIGNvbnN0IENvbG9yJiBzcGVs
bGluZ1BhdHRlcm5Db2xvcigpIHsKLSAgICBzdGF0aWMgY29uc3QgQ29sb3Igc3BlbGxpbmdDb2xv
cigyNTUsIDAsIDApOwotICAgIHJldHVybiBzcGVsbGluZ0NvbG9yOwotfQotCi1zdGF0aWMgY29u
c3QgQ29sb3ImIGdyYW1tYXJQYXR0ZXJuQ29sb3IoKSB7Ci0gICAgc3RhdGljIGNvbnN0IENvbG9y
IGdyYW1tYXJDb2xvcigwLCAxMjgsIDApOwotICAgIHJldHVybiBncmFtbWFyQ29sb3I7Ci19Ci0K
LS8vIFB1bGxlZCBmcm9tIEdyYXBoaWNzQ29udGV4dENHCi1zdGF0aWMgdm9pZCBzZXRDR1N0cm9r
ZUNvbG9yKENHQ29udGV4dFJlZiBjb250ZXh0LCBjb25zdCBDb2xvciYgY29sb3IpCi17Ci0gICAg
Q0dGbG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKLSAgICBjb2xvci5nZXRSR0JBKHJlZCwg
Z3JlZW4sIGJsdWUsIGFscGhhKTsKLSAgICBDR0NvbnRleHRTZXRSR0JTdHJva2VDb2xvcihjb250
ZXh0LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
OjpkcmF3TGluZUZvck1pc3NwZWxsaW5nT3JCYWRHcmFtbWFyKGNvbnN0IEludFBvaW50JiBwb2lu
dCwgaW50IHdpZHRoLCBib29sIGdyYW1tYXIpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQo
KSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIC8vIFRoZXNlIGFyZSB0aGUgc2FtZSBmb3Ig
bWlzc3BlbGxpbmcgb3IgYmFkIGdyYW1tYXIKLSAgICBjb25zdCBpbnQgcGF0dGVybkhlaWdodCA9
IDM7IC8vIDMgcm93cwotICAgIEFTU0VSVChjTWlzc3BlbGxpbmdMaW5lVGhpY2tuZXNzID09IHBh
dHRlcm5IZWlnaHQpOwotICAgIGNvbnN0IGludCBwYXR0ZXJuV2lkdGggPSA0OyAvLyA0IHBpeGVs
cwotICAgIEFTU0VSVChwYXR0ZXJuV2lkdGggPT0gY01pc3NwZWxsaW5nTGluZVBhdHRlcm5XaWR0
aCk7Ci0KLSAgICAvLyBNYWtlIHN1cmUgdG8gZHJhdyBvbmx5IGNvbXBsZXRlIGRvdHMuCi0gICAg
Ly8gTk9URTogQ29kZSBoZXJlIHVzZWQgdG8gc2hpZnQgdGhlIHVuZGVybGluZSB0byB0aGUgbGVm
dCBhbmQgaW5jcmVhc2UgdGhlIHdpZHRoCi0gICAgLy8gdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcg
Z2V0cyB1bmRlcmxpbmVkLCBidXQgdGhhdCByZXN1bHRzIGluIGRyYXdpbmcgb3V0IG9mCi0gICAg
Ly8gYm91bmRzIChlLmcuIHdoZW4gYXQgdGhlIGVkZ2Ugb2YgYSB2aWV3KSBhbmQgY291bGQgbWFr
ZSBpdCBhcHBlYXIgdGhhdCB0aGUKLSAgICAvLyBzcGFjZSBiZXR3ZWVuIGFkamFjZW50IG1pc3Nw
ZWxsZWQgd29yZHMgd2FzIHVuZGVybGluZWQuCi0gICAgLy8gYWxsb3cgc2xpZ2h0bHkgbW9yZSBj
b25zaWRlcmluZyB0aGF0IHRoZSBwYXR0ZXJuIGVuZHMgd2l0aCBhIHRyYW5zcGFyZW50IHBpeGVs
Ci0gICAgaW50IHdpZHRoTW9kID0gd2lkdGggJSBwYXR0ZXJuV2lkdGg7Ci0gICAgaWYgKHBhdHRl
cm5XaWR0aCAtIHdpZHRoTW9kID4gY01pc3NwZWxsaW5nTGluZVBhdHRlcm5HYXBXaWR0aCkKLSAg
ICAgICAgd2lkdGggLT0gd2lkdGhNb2Q7Ci0gICAgICAKLSAgICAvLyBEcmF3IHRoZSB1bmRlcmxp
bmUKLSAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpOwotICAgIENH
Q29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7Ci0KLSAgICBjb25zdCBDb2xvciYgcGF0dGVybkNv
bG9yID0gZ3JhbW1hciA/IGdyYW1tYXJQYXR0ZXJuQ29sb3IoKSA6IHNwZWxsaW5nUGF0dGVybkNv
bG9yKCk7Ci0gICAgc2V0Q0dTdHJva2VDb2xvcihjb250ZXh0LCBwYXR0ZXJuQ29sb3IpOwotCi0g
ICAgd2tTZXRQYXR0ZXJuUGhhc2VJblVzZXJTcGFjZShjb250ZXh0LCBwb2ludCk7Ci0gICAgQ0dD
b250ZXh0U2V0QmxlbmRNb2RlKGNvbnRleHQsIGtDR0JsZW5kTW9kZU5vcm1hbCk7Ci0gICAgCi0g
ICAgLy8gMyByb3dzLCBlYWNoIG9mZnNldCBieSBoYWxmIGEgcGl4ZWwgZm9yIGJsZW5kaW5nIHB1
cnBvc2VzCi0gICAgY29uc3QgQ0dQb2ludCB1cHBlclBvaW50cyBbXSA9IHt7cG9pbnQueCgpLCBw
b2ludC55KCkgKyBwYXR0ZXJuSGVpZ2h0IC0gMi41IH0sIHtwb2ludC54KCkgKyB3aWR0aCwgcG9p
bnQueSgpICsgcGF0dGVybkhlaWdodCAtIDIuNX19OwotICAgIGNvbnN0IENHUG9pbnQgbWlkZGxl
UG9pbnRzIFtdID0ge3twb2ludC54KCksIHBvaW50LnkoKSArIHBhdHRlcm5IZWlnaHQgLSAxLjUg
fSwge3BvaW50LngoKSArIHdpZHRoLCBwb2ludC55KCkgKyBwYXR0ZXJuSGVpZ2h0IC0gMS41fX07
Ci0gICAgY29uc3QgQ0dQb2ludCBsb3dlclBvaW50cyBbXSA9IHt7cG9pbnQueCgpLCBwb2ludC55
KCkgKyBwYXR0ZXJuSGVpZ2h0IC0gMC41IH0sIHtwb2ludC54KCkgKyB3aWR0aCwgcG9pbnQueSgp
ICsgcGF0dGVybkhlaWdodCAtIDAuNSB9fTsKLSAgICAKLSAgICAvLyBEYXNoIGxlbmd0aHMgZm9y
IHRoZSB0b3AgYW5kIGJvdHRvbSBvZiB0aGUgZXJyb3IgdW5kZXJsaW5lIGFyZSB0aGUgc2FtZS4K
LSAgICAvLyBUaGVzZSBhcmUgbWFnaWMuCi0gICAgc3RhdGljIGNvbnN0IGZsb2F0IGVkZ2VfZGFz
aF9sZW5ndGhzW10gPSB7MiwgMn07Ci0gICAgc3RhdGljIGNvbnN0IGZsb2F0IG1pZGRsZV9kYXNo
X2xlbmd0aHNbXSA9IHsyLjc2ZiwgMS4yNGZ9OwotICAgIHN0YXRpYyBjb25zdCBmbG9hdCBlZGdl
X29mZnNldCA9IC0oZWRnZV9kYXNoX2xlbmd0aHNbMV0gLSAxLjBmKSAvIDIuMGY7Ci0gICAgc3Rh
dGljIGNvbnN0IGZsb2F0IG1pZGRsZV9vZmZzZXQgPSAtKG1pZGRsZV9kYXNoX2xlbmd0aHNbMV0g
LSAxLjBmKSAvIDIuMGY7Ci0KLSAgICAvLyBMaW5lIG9wYWNpdGllcy4gIE9uY2UgYWdhaW4sIHRo
ZXNlIGFyZSBtYWdpYy4KLSAgICBjb25zdCBmbG9hdCB1cHBlck9wYWNpdHkgPSAwLjMzZjsKLSAg
ICBjb25zdCBmbG9hdCBtaWRkbGVPcGFjaXR5ID0gMC43NWY7Ci0gICAgY29uc3QgZmxvYXQgbG93
ZXJPcGFjaXR5ID0gMC44OGY7Ci0KLSAgICAvL1RvcCBsaW5lCi0gICAgQ0dDb250ZXh0U2V0TGlu
ZURhc2goY29udGV4dCwgZWRnZV9vZmZzZXQsIGVkZ2VfZGFzaF9sZW5ndGhzLCAKLSAgICAgICAg
ICAgICAgICAgICAgICAgICBzaXplb2YoZWRnZV9kYXNoX2xlbmd0aHMpIC8gc2l6ZW9mKGVkZ2Vf
ZGFzaF9sZW5ndGhzWzBdKSk7Ci0gICAgQ0dDb250ZXh0U2V0QWxwaGEoY29udGV4dCwgdXBwZXJP
cGFjaXR5KTsKLSAgICBDR0NvbnRleHRTdHJva2VMaW5lU2VnbWVudHMoY29udGV4dCwgdXBwZXJQ
b2ludHMsIDIpOwotIAotICAgIC8vIE1pZGRsZSBsaW5lCi0gICAgQ0dDb250ZXh0U2V0TGluZURh
c2goY29udGV4dCwgbWlkZGxlX29mZnNldCwgbWlkZGxlX2Rhc2hfbGVuZ3RocywgCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgc2l6ZW9mKG1pZGRsZV9kYXNoX2xlbmd0aHMpIC8gc2l6ZW9mKG1p
ZGRsZV9kYXNoX2xlbmd0aHNbMF0pKTsKLSAgICBDR0NvbnRleHRTZXRBbHBoYShjb250ZXh0LCBt
aWRkbGVPcGFjaXR5KTsKLSAgICBDR0NvbnRleHRTdHJva2VMaW5lU2VnbWVudHMoY29udGV4dCwg
bWlkZGxlUG9pbnRzLCAyKTsKLSAgICAKLSAgICAvLyBCb3R0b20gbGluZQotICAgIENHQ29udGV4
dFNldExpbmVEYXNoKGNvbnRleHQsIGVkZ2Vfb2Zmc2V0LCBlZGdlX2Rhc2hfbGVuZ3RocywKLSAg
ICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZWRnZV9kYXNoX2xlbmd0aHMpIC8gc2l6ZW9m
KGVkZ2VfZGFzaF9sZW5ndGhzWzBdKSk7Ci0gICAgQ0dDb250ZXh0U2V0QWxwaGEoY29udGV4dCwg
bG93ZXJPcGFjaXR5KTsKLSAgICBDR0NvbnRleHRTdHJva2VMaW5lU2VnbWVudHMoY29udGV4dCwg
bG93ZXJQb2ludHMsIDIpOwotCi0gICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShjb250ZXh0KTsK
LX0KLQogI2lmIEVOQUJMRShTVkcpCiBHcmFwaGljc0NvbnRleHQqIGNvbnRleHRGb3JJbWFnZShT
VkdSZXNvdXJjZUltYWdlKikKIHsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0ltYWdlQ0dXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luL0ltYWdlQ0dXaW4uY3BwCShyZXZpc2lvbiAyOTgzNCkJKGZyb20gV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vSW1hZ2VXaW4uY3BwOjI5ODM0KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW4vSW1hZ2VDR1dpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMTAg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW1hZ2Uu
aCIKKyNpbmNsdWRlICJCaXRtYXBJbWFnZS5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5o
IgorI2luY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgor
CisjaW5jbHVkZSA8d2luc29jazIuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSAi
UGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJNSU1FVHlwZVJlZ2lzdHJ5LmgiCisjaW5jbHVk
ZSAiU2hhcmVkQnVmZmVyLmgiCisKKy8vIFRoaXMgZnVuY3Rpb24gbG9hZHMgcmVzb3VyY2VzIGZy
b20gV2ViS2l0CitQYXNzUmVmUHRyPFdlYkNvcmU6OlNoYXJlZEJ1ZmZlcj4gbG9hZFJlc291cmNl
SW50b0J1ZmZlcihjb25zdCBjaGFyKik7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9pZCBC
aXRtYXBJbWFnZTo6aW5pdFBsYXRmb3JtRGF0YSgpCit7Cit9CisKK3ZvaWQgQml0bWFwSW1hZ2U6
OmludmFsaWRhdGVQbGF0Zm9ybURhdGEoKQoreworfQorCitJbWFnZSogSW1hZ2U6OmxvYWRQbGF0
Zm9ybVJlc291cmNlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgUmVmUHRyPFNoYXJlZEJ1ZmZl
cj4gYnVmZmVyID0gbG9hZFJlc291cmNlSW50b0J1ZmZlcihuYW1lKTsKKyAgICBCaXRtYXBJbWFn
ZSogaW1nID0gbmV3IEJpdG1hcEltYWdlOworICAgIGltZy0+c2V0RGF0YShidWZmZXIucmVsZWFz
ZSgpLCB0cnVlKTsKKyAgICByZXR1cm4gaW1nOworfQorCitib29sIEJpdG1hcEltYWdlOjpnZXRI
QklUTUFQKEhCSVRNQVAgYm1wKQoreworICAgIHJldHVybiBnZXRIQklUTUFQT2ZTaXplKGJtcCwg
MCk7Cit9CisKK2Jvb2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVBPZlNpemUoSEJJVE1BUCBibXAs
IExQU0laRSBzaXplKQoreworICAgIEFTU0VSVChibXApOworCisgICAgQklUTUFQIGJtcEluZm87
CisgICAgR2V0T2JqZWN0KGJtcCwgc2l6ZW9mKEJJVE1BUCksICZibXBJbmZvKTsKKworICAgIEFT
U0VSVChibXBJbmZvLmJtQml0c1BpeGVsID09IDMyKTsKKyAgICBpbnQgYnVmZmVyU2l6ZSA9IGJt
cEluZm8uYm1XaWR0aEJ5dGVzICogYm1wSW5mby5ibUhlaWdodDsKKyAgICAKKyAgICBDR0NvbG9y
U3BhY2VSZWYgZGV2aWNlUkdCID0gQ0dDb2xvclNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7CisgICAg
Q0dDb250ZXh0UmVmIGNnQ29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZShibXBJbmZvLmJt
Qml0cywgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0LAorICAgICAgICA4LCBibXBJ
bmZvLmJtV2lkdGhCeXRlcywgZGV2aWNlUkdCLCBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZSB8
IGtDR0ltYWdlQWxwaGFQcmVtdWx0aXBsaWVkRmlyc3QpOworICAKKyAgICBHcmFwaGljc0NvbnRl
eHQgZ2MoY2dDb250ZXh0KTsKKyAgICBJbnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcEltYWdlOjpz
aXplKCk7CisgICAgaWYgKHNpemUpCisgICAgICAgIGRyYXdGcmFtZU1hdGNoaW5nU291cmNlU2l6
ZSgmZ2MsIEZsb2F0UmVjdCgwLCAwLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQp
LCBJbnRTaXplKCpzaXplKSwgQ29tcG9zaXRlQ29weSk7CisgICAgZWxzZQorICAgICAgICBkcmF3
KCZnYywgRmxvYXRSZWN0KDAsIDAsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCks
IEZsb2F0UmVjdCgwLCAwLCBpbWFnZVNpemUud2lkdGgoKSwgaW1hZ2VTaXplLmhlaWdodCgpKSwg
Q29tcG9zaXRlQ29weSk7CisKKyAgICAvLyBEbyBjbGVhbnVwCisgICAgQ0dDb250ZXh0UmVsZWFz
ZShjZ0NvbnRleHQpOworICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoZGV2aWNlUkdCKTsKKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBCaXRtYXBJbWFnZTo6ZHJhd0ZyYW1lTWF0Y2hpbmdTb3Vy
Y2VTaXplKEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBj
b25zdCBJbnRTaXplJiBzcmNTaXplLCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCkKK3sK
KyAgICBpbnQgZnJhbWVzID0gZnJhbWVDb3VudCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwg
ZnJhbWVzOyArK2kpIHsKKyAgICAgICAgQ0dJbWFnZVJlZiBpbWFnZSA9IGZyYW1lQXRJbmRleChp
KTsKKyAgICAgICAgaWYgKENHSW1hZ2VHZXRIZWlnaHQoaW1hZ2UpID09IChzaXplX3Qpc3JjU2l6
ZS5oZWlnaHQoKSAmJiBDR0ltYWdlR2V0V2lkdGgoaW1hZ2UpID09IChzaXplX3Qpc3JjU2l6ZS53
aWR0aCgpKSB7CisgICAgICAgICAgICBzaXplX3QgY3VycmVudEZyYW1lID0gbV9jdXJyZW50RnJh
bWU7CisgICAgICAgICAgICBtX2N1cnJlbnRGcmFtZSA9IGk7CisgICAgICAgICAgICBkcmF3KGN0
eHQsIGRzdFJlY3QsIEZsb2F0UmVjdCgwLCAwLCBzcmNTaXplLndpZHRoKCksIHNyY1NpemUuaGVp
Z2h0KCkpLCBjb21wb3NpdGVPcCk7CisgICAgICAgICAgICBtX2N1cnJlbnRGcmFtZSA9IGN1cnJl
bnRGcmFtZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8v
IE5vIGltYWdlIG9mIHRoZSBjb3JyZWN0IHNpemUgd2FzIGZvdW5kLCBmYWxsYmFjayB0byBkcmF3
aW5nIHRoZSBjdXJyZW50IGZyYW1lCisgICAgSW50U2l6ZSBpbWFnZVNpemUgPSBCaXRtYXBJbWFn
ZTo6c2l6ZSgpOworICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRSZWN0KDAsIDAsIGltYWdl
U2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBjb21wb3NpdGVPcCk7Cit9CisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L0ltYWdlQ0dXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luL0ltYWdlQ0dXaW4uY3BwCShyZXZpc2lvbiAyOTcyNikKKysrIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL0ltYWdlQ0dXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBA
QAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4g
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAg
LTI5LDM4ICsyOSwxMSBAQAogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2luY2x1ZGUg
PEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgogCi0jaW5jbHVkZSA8
d2luc29jazIuaD4KICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAjaW5jbHVkZSAiUGxhdGZvcm1TdHJp
bmcuaCIKLSNpbmNsdWRlICJNSU1FVHlwZVJlZ2lzdHJ5LmgiCi0jaW5jbHVkZSAiU2hhcmVkQnVm
ZmVyLmgiCi0KLS8vIFRoaXMgZnVuY3Rpb24gbG9hZHMgcmVzb3VyY2VzIGZyb20gV2ViS2l0Ci1Q
YXNzUmVmUHRyPFdlYkNvcmU6OlNoYXJlZEJ1ZmZlcj4gbG9hZFJlc291cmNlSW50b0J1ZmZlcihj
b25zdCBjaGFyKik7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotdm9pZCBCaXRtYXBJbWFnZTo6
aW5pdFBsYXRmb3JtRGF0YSgpCi17Ci19Ci0KLXZvaWQgQml0bWFwSW1hZ2U6OmludmFsaWRhdGVQ
bGF0Zm9ybURhdGEoKQotewotfQotCi1JbWFnZSogSW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNl
KGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gYnVmZmVyID0g
bG9hZFJlc291cmNlSW50b0J1ZmZlcihuYW1lKTsKLSAgICBCaXRtYXBJbWFnZSogaW1nID0gbmV3
IEJpdG1hcEltYWdlOwotICAgIGltZy0+c2V0RGF0YShidWZmZXIucmVsZWFzZSgpLCB0cnVlKTsK
LSAgICByZXR1cm4gaW1nOwotfQotCi1ib29sIEJpdG1hcEltYWdlOjpnZXRIQklUTUFQKEhCSVRN
QVAgYm1wKQotewotICAgIHJldHVybiBnZXRIQklUTUFQT2ZTaXplKGJtcCwgMCk7Ci19Ci0KIGJv
b2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVBPZlNpemUoSEJJVE1BUCBibXAsIExQU0laRSBzaXpl
KQogewogICAgIEFTU0VSVChibXApOwpAQCAtNzYsMTUgKzQ5LDE3IEBAIGJvb2wgQml0bWFwSW1h
Z2U6OmdldEhCSVRNQVBPZlNpemUoSEJJVE0KICAgICAgICAgOCwgYm1wSW5mby5ibVdpZHRoQnl0
ZXMsIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhh
UHJlbXVsdGlwbGllZEZpcnN0KTsKICAgCiAgICAgR3JhcGhpY3NDb250ZXh0IGdjKGNnQ29udGV4
dCk7CisKICAgICBJbnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcEltYWdlOjpzaXplKCk7CiAgICAg
aWYgKHNpemUpCi0gICAgICAgIGRyYXdGcmFtZU1hdGNoaW5nU291cmNlU2l6ZSgmZ2MsIEZsb2F0
UmVjdCgwLCAwLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQpLCBJbnRTaXplKCpz
aXplKSwgQ29tcG9zaXRlQ29weSk7CisgICAgICAgIGRyYXdGcmFtZU1hdGNoaW5nU291cmNlU2l6
ZSgmZ2MsIEZsb2F0UmVjdCgwLjBmLCAwLjBmLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1I
ZWlnaHQpLCBJbnRTaXplKCpzaXplKSwgQ29tcG9zaXRlQ29weSk7CiAgICAgZWxzZQotICAgICAg
ICBkcmF3KCZnYywgRmxvYXRSZWN0KDAsIDAsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhl
aWdodCksIEZsb2F0UmVjdCgwLCAwLCBpbWFnZVNpemUud2lkdGgoKSwgaW1hZ2VTaXplLmhlaWdo
dCgpKSwgQ29tcG9zaXRlQ29weSk7CisgICAgICAgIGRyYXcoJmdjLCBGbG9hdFJlY3QoMC4wZiwg
MC4wZiwgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwgRmxvYXRSZWN0KDAuMGYs
IDAuMGYsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpLCBDb21wb3NpdGVD
b3B5KTsKIAogICAgIC8vIERvIGNsZWFudXAKICAgICBDR0NvbnRleHRSZWxlYXNlKGNnQ29udGV4
dCk7CiAgICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOworCiAgICAgcmV0dXJuIHRy
dWU7CiB9CiAKQEAgLTkzLDEwICs2OCwxMCBAQCB2b2lkIEJpdG1hcEltYWdlOjpkcmF3RnJhbWVN
YXRjaGluZ1NvdXJjCiAgICAgaW50IGZyYW1lcyA9IGZyYW1lQ291bnQoKTsKICAgICBmb3IgKGlu
dCBpID0gMDsgaSA8IGZyYW1lczsgKytpKSB7CiAgICAgICAgIENHSW1hZ2VSZWYgaW1hZ2UgPSBm
cmFtZUF0SW5kZXgoaSk7Ci0gICAgICAgIGlmIChDR0ltYWdlR2V0SGVpZ2h0KGltYWdlKSA9PSAo
c2l6ZV90KXNyY1NpemUuaGVpZ2h0KCkgJiYgQ0dJbWFnZUdldFdpZHRoKGltYWdlKSA9PSAoc2l6
ZV90KXNyY1NpemUud2lkdGgoKSkgeworICAgICAgICBpZiAoQ0dJbWFnZUdldEhlaWdodChpbWFn
ZSkgPT0gc3RhdGljX2Nhc3Q8c2l6ZV90PihzcmNTaXplLmhlaWdodCgpKSAmJiBDR0ltYWdlR2V0
V2lkdGgoaW1hZ2UpID09IHN0YXRpY19jYXN0PHNpemVfdD4oc3JjU2l6ZS53aWR0aCgpKSkgewog
ICAgICAgICAgICAgc2l6ZV90IGN1cnJlbnRGcmFtZSA9IG1fY3VycmVudEZyYW1lOwogICAgICAg
ICAgICAgbV9jdXJyZW50RnJhbWUgPSBpOwotICAgICAgICAgICAgZHJhdyhjdHh0LCBkc3RSZWN0
LCBGbG9hdFJlY3QoMCwgMCwgc3JjU2l6ZS53aWR0aCgpLCBzcmNTaXplLmhlaWdodCgpKSwgY29t
cG9zaXRlT3ApOworICAgICAgICAgICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJlY3QoMC4w
ZiwgMC4wZiwgc3JjU2l6ZS53aWR0aCgpLCBzcmNTaXplLmhlaWdodCgpKSwgY29tcG9zaXRlT3Ap
OwogICAgICAgICAgICAgbV9jdXJyZW50RnJhbWUgPSBjdXJyZW50RnJhbWU7CiAgICAgICAgICAg
ICByZXR1cm47CiAgICAgICAgIH0KQEAgLTEwNCw3ICs3OSw3IEBAIHZvaWQgQml0bWFwSW1hZ2U6
OmRyYXdGcmFtZU1hdGNoaW5nU291cmMKIAogICAgIC8vIE5vIGltYWdlIG9mIHRoZSBjb3JyZWN0
IHNpemUgd2FzIGZvdW5kLCBmYWxsYmFjayB0byBkcmF3aW5nIHRoZSBjdXJyZW50IGZyYW1lCiAg
ICAgSW50U2l6ZSBpbWFnZVNpemUgPSBCaXRtYXBJbWFnZTo6c2l6ZSgpOwotICAgIGRyYXcoY3R4
dCwgZHN0UmVjdCwgRmxvYXRSZWN0KDAsIDAsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUu
aGVpZ2h0KCkpLCBjb21wb3NpdGVPcCk7CisgICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJl
Y3QoMC4wZiwgMC4wZiwgaW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIGNv
bXBvc2l0ZU9wKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VDYWlyb1dpbi5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vSW1hZ2VDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDAp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9JbWFnZUNhaXJvV2luLmNwcAkocmV2
aXNpb24gMCkKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBcHBs
ZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJJbWFnZS5oIgorI2luY2x1ZGUgIkJpdG1hcEltYWdlLmgiCisjaW5jbHVkZSAi
R3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSA8Y2Fpcm8uaD4KKworI2luY2x1ZGUgPHdpbmRv
d3MuaD4KKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK2Jvb2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVBPZlNpemUoSEJJVE1BUCBibXAsIExQU0la
RSBzaXplKQoreworICAgIEFTU0VSVChibXApOworCisgICAgQklUTUFQIGJtcEluZm87CisgICAg
R2V0T2JqZWN0KGJtcCwgc2l6ZW9mKEJJVE1BUCksICZibXBJbmZvKTsKKworICAgIC8vIElmIHRo
aXMgaXMgYSAzMmJwcCBiaXRtYXAsIHdoaWNoIGl0IGFsd2F5cyBzaG91bGQgYmUsIHdlJ2xsIGNs
ZWFyIGl0IHNvIGFscGhhLXdpc2UgaXQgd2lsbCBiZSB2aXNpYmxlCisgICAgaWYgKGJtcEluZm8u
Ym1CaXRzUGl4ZWwgPT0gMzIpIHsKKyAgICAgICAgaW50IGJ1ZmZlclNpemUgPSBibXBJbmZvLmJt
V2lkdGhCeXRlcyAqIGJtcEluZm8uYm1IZWlnaHQ7CisgICAgICAgIG1lbXNldChibXBJbmZvLmJt
Qml0cywgMjU1LCBidWZmZXJTaXplKTsKKyAgICB9CisgCQorICAgIEhEQyB0ZW1wREMgPSBDcmVh
dGVDb21wYXRpYmxlREMoMCk7CisgICAgaWYgKCF0ZW1wREMpIHsKKyAgICAgICAgTE9HX0VSUk9S
KCJGYWlsZWQgdG8gY3JlYXRlIGluLW1lbW9yeSBEQyBmb3IgSW1hZ2U6OmJsaXQoKSIpOworICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFNlbGVjdE9iamVjdCh0ZW1wREMsIGJtcCk7
CisgICAgR3JhcGhpY3NDb250ZXh0IGdjKHRlbXBEQyk7CisKKyAgICBJbnRTaXplIGltYWdlU2l6
ZSA9IEJpdG1hcEltYWdlOjpzaXplKCk7CisgICAgaWYgKHNpemUpCisgICAgICAgIGRyYXdGcmFt
ZU1hdGNoaW5nU291cmNlU2l6ZSgmZ2MsIEZsb2F0UmVjdCgwLjBmLCAwLjBmLCBibXBJbmZvLmJt
V2lkdGgsIGJtcEluZm8uYm1IZWlnaHQpLCBJbnRTaXplKCpzaXplKSwgQ29tcG9zaXRlQ29weSk7
CisgICAgZWxzZQorICAgICAgICBkcmF3KCZnYywgRmxvYXRSZWN0KDAuMGYsIDAuMGYsIGJtcElu
Zm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCksIEZsb2F0UmVjdCgwLjBmLCAwLjBmLCBpbWFn
ZVNpemUud2lkdGgoKSwgaW1hZ2VTaXplLmhlaWdodCgpKSwgQ29tcG9zaXRlQ29weSk7CisKKyAg
ICAvLyBEbyBjbGVhbnVwCisgICAgRGVsZXRlREModGVtcERDKTsKKworICAgIHJldHVybiB0cnVl
OworfQorCit2b2lkIEJpdG1hcEltYWdlOjpkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUoR3Jh
cGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBGbG9hdFJlY3QmIGRzdFJlY3QsIGNvbnN0IEludFNp
emUmIHNyY1NpemUsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQoreworICAgIGludCBm
cmFtZXMgPSBmcmFtZUNvdW50KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZXM7ICsr
aSkgeworICAgICAgICBjYWlyb19zdXJmYWNlX3QqIGltYWdlID0gZnJhbWVBdEluZGV4KGkpOwor
ICAgICAgICBpZiAoY2Fpcm9faW1hZ2Vfc3VyZmFjZV9nZXRfaGVpZ2h0KGltYWdlKSA9PSBzdGF0
aWNfY2FzdDxzaXplX3Q+KHNyY1NpemUuaGVpZ2h0KCkpICYmIGNhaXJvX2ltYWdlX3N1cmZhY2Vf
Z2V0X3dpZHRoKGltYWdlKSA9PSBzdGF0aWNfY2FzdDxzaXplX3Q+KHNyY1NpemUud2lkdGgoKSkp
IHsKKyAgICAgICAgICAgIHNpemVfdCBjdXJyZW50RnJhbWUgPSBtX2N1cnJlbnRGcmFtZTsKKyAg
ICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gaTsKKyAgICAgICAgICAgIGRyYXcoY3R4dCwgZHN0
UmVjdCwgRmxvYXRSZWN0KDAuMGYsIDAuMGYsIHNyY1NpemUud2lkdGgoKSwgc3JjU2l6ZS5oZWln
aHQoKSksIGNvbXBvc2l0ZU9wKTsKKyAgICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gY3VycmVu
dEZyYW1lOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8g
Tm8gaW1hZ2Ugb2YgdGhlIGNvcnJlY3Qgc2l6ZSB3YXMgZm91bmQsIGZhbGxiYWNrIHRvIGRyYXdp
bmcgdGhlIGN1cnJlbnQgZnJhbWUKKyAgICBJbnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcEltYWdl
OjpzaXplKCk7CisgICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJlY3QoMC4wZiwgMC4wZiwg
aW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsKK30K
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW4vSW1hZ2VXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luL0ltYWdlV2luLmNwcAkocmV2aXNpb24gMzAwNDgpCisrKyBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3dpbi9JbWFnZVdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBA
CiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUgSW5jLiAg
QWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAt
MjYsMTMgKzI2LDcgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJJbWFnZS5oIgog
I2luY2x1ZGUgIkJpdG1hcEltYWdlLmgiCi0jaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCi0j
aW5jbHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CiAKLSNp
bmNsdWRlIDx3aW5zb2NrMi5oPgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlICJQbGF0
Zm9ybVN0cmluZy5oIgotI2luY2x1ZGUgIk1JTUVUeXBlUmVnaXN0cnkuaCIKICNpbmNsdWRlICJT
aGFyZWRCdWZmZXIuaCIKIAogLy8gVGhpcyBmdW5jdGlvbiBsb2FkcyByZXNvdXJjZXMgZnJvbSBX
ZWJLaXQKQEAgLTYxLDUwICs1NSw0IEBAIGJvb2wgQml0bWFwSW1hZ2U6OmdldEhCSVRNQVAoSEJJ
VE1BUCBibXAKICAgICByZXR1cm4gZ2V0SEJJVE1BUE9mU2l6ZShibXAsIDApOwogfQogCi1ib29s
IEJpdG1hcEltYWdlOjpnZXRIQklUTUFQT2ZTaXplKEhCSVRNQVAgYm1wLCBMUFNJWkUgc2l6ZSkK
LXsKLSAgICBBU1NFUlQoYm1wKTsKLQotICAgIEJJVE1BUCBibXBJbmZvOwotICAgIEdldE9iamVj
dChibXAsIHNpemVvZihCSVRNQVApLCAmYm1wSW5mbyk7Ci0KLSAgICBBU1NFUlQoYm1wSW5mby5i
bUJpdHNQaXhlbCA9PSAzMik7Ci0gICAgaW50IGJ1ZmZlclNpemUgPSBibXBJbmZvLmJtV2lkdGhC
eXRlcyAqIGJtcEluZm8uYm1IZWlnaHQ7Ci0gICAgCi0gICAgQ0dDb2xvclNwYWNlUmVmIGRldmlj
ZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwotICAgIENHQ29udGV4dFJlZiBj
Z0NvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUoYm1wSW5mby5ibUJpdHMsIGJtcEluZm8u
Ym1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCwKLSAgICAgICAgOCwgYm1wSW5mby5ibVdpZHRoQnl0
ZXMsIGRldmljZVJHQiwga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhh
UHJlbXVsdGlwbGllZEZpcnN0KTsKLSAgCi0gICAgR3JhcGhpY3NDb250ZXh0IGdjKGNnQ29udGV4
dCk7Ci0gICAgSW50U2l6ZSBpbWFnZVNpemUgPSBCaXRtYXBJbWFnZTo6c2l6ZSgpOwotICAgIGlm
IChzaXplKQotICAgICAgICBkcmF3RnJhbWVNYXRjaGluZ1NvdXJjZVNpemUoJmdjLCBGbG9hdFJl
Y3QoMCwgMCwgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZvLmJtSGVpZ2h0KSwgSW50U2l6ZSgqc2l6
ZSksIENvbXBvc2l0ZUNvcHkpOwotICAgIGVsc2UKLSAgICAgICAgZHJhdygmZ2MsIEZsb2F0UmVj
dCgwLCAwLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQpLCBGbG9hdFJlY3QoMCwg
MCwgaW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIENvbXBvc2l0ZUNvcHkp
OwotCi0gICAgLy8gRG8gY2xlYW51cAotICAgIENHQ29udGV4dFJlbGVhc2UoY2dDb250ZXh0KTsK
LSAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKGRldmljZVJHQik7Ci0gICAgcmV0dXJuIHRydWU7Ci19
Ci0KLXZvaWQgQml0bWFwSW1hZ2U6OmRyYXdGcmFtZU1hdGNoaW5nU291cmNlU2l6ZShHcmFwaGlj
c0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgY29uc3QgSW50U2l6ZSYg
c3JjU2l6ZSwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApCi17Ci0gICAgaW50IGZyYW1l
cyA9IGZyYW1lQ291bnQoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lczsgKytpKSB7
Ci0gICAgICAgIENHSW1hZ2VSZWYgaW1hZ2UgPSBmcmFtZUF0SW5kZXgoaSk7Ci0gICAgICAgIGlm
IChDR0ltYWdlR2V0SGVpZ2h0KGltYWdlKSA9PSAoc2l6ZV90KXNyY1NpemUuaGVpZ2h0KCkgJiYg
Q0dJbWFnZUdldFdpZHRoKGltYWdlKSA9PSAoc2l6ZV90KXNyY1NpemUud2lkdGgoKSkgewotICAg
ICAgICAgICAgc2l6ZV90IGN1cnJlbnRGcmFtZSA9IG1fY3VycmVudEZyYW1lOwotICAgICAgICAg
ICAgbV9jdXJyZW50RnJhbWUgPSBpOwotICAgICAgICAgICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBG
bG9hdFJlY3QoMCwgMCwgc3JjU2l6ZS53aWR0aCgpLCBzcmNTaXplLmhlaWdodCgpKSwgY29tcG9z
aXRlT3ApOwotICAgICAgICAgICAgbV9jdXJyZW50RnJhbWUgPSBjdXJyZW50RnJhbWU7Ci0gICAg
ICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBObyBpbWFnZSBvZiB0
aGUgY29ycmVjdCBzaXplIHdhcyBmb3VuZCwgZmFsbGJhY2sgdG8gZHJhd2luZyB0aGUgY3VycmVu
dCBmcmFtZQotICAgIEludFNpemUgaW1hZ2VTaXplID0gQml0bWFwSW1hZ2U6OnNpemUoKTsKLSAg
ICBkcmF3KGN0eHQsIGRzdFJlY3QsIEZsb2F0UmVjdCgwLCAwLCBpbWFnZVNpemUud2lkdGgoKSwg
aW1hZ2VTaXplLmhlaWdodCgpKSwgY29tcG9zaXRlT3ApOwotfQotCiB9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0
YUNHV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9T
aW1wbGVGb250RGF0YUNHV2luLmNwcAkocmV2aXNpb24gMjk4MzQpCShmcm9tIFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhV2luLmNwcDoyOTgzNCkKKysrIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ0dXaW4uY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsMjgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3
IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAq
IDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAq
IDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBu
b3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBl
bmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0
d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAi
QVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAq
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIlNpbXBsZUZvbnREYXRhLmgiCisKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI2lu
Y2x1ZGUgIkZvbnQuaCIKKyNpbmNsdWRlICJGb250Q2FjaGUuaCIKKyNpbmNsdWRlICJGbG9hdFJl
Y3QuaCIKKyNpbmNsdWRlICJGb250RGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlIDx3dGYvTWF0aEV4
dHJhcy5oPgorI2luY2x1ZGUgPHVuaWNvZGUvdWNoYXIuaD4KKyNpbmNsdWRlIDx1bmljb2RlL3Vu
b3JtLmg+CisjaW5jbHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2Vz
Lmg+CisjaW5jbHVkZSA8bWxhbmcuaD4KKyNpbmNsdWRlIDx0Y2hhci5oPgorI2luY2x1ZGUgPFdl
YktpdFN5c3RlbUludGVyZmFjZS9XZWJLaXRTeXN0ZW1JbnRlcmZhY2UuaD4KKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCit1c2luZyBzdGQ6Om1heDsKKworY29uc3QgZmxvYXQgY1NtYWxsQ2Fwc0Zv
bnRTaXplTXVsdGlwbGllciA9IDAuN2Y7CisKK3N0YXRpYyBib29sIHNob3VsZEFwcGx5TWFjQXNj
ZW50SGFjazsKKworc3RhdGljIGlubGluZSBmbG9hdCBzY2FsZUVtVG9Vbml0cyhmbG9hdCB4LCB1
bnNpZ25lZCB1bml0c1BlckVtKSB7IHJldHVybiB1bml0c1BlckVtID8geCAvIChmbG9hdCl1bml0
c1BlckVtIDogeDsgfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpzZXRTaG91bGRBcHBseU1hY0Fz
Y2VudEhhY2soYm9vbCBiKQoreworICAgIHNob3VsZEFwcGx5TWFjQXNjZW50SGFjayA9IGI7Cit9
CisKK3ZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtSW5pdCgpCit7ICAgIAorICAgIG1fc3lu
dGhldGljQm9sZE9mZnNldCA9IG1fZm9udC5zeW50aGV0aWNCb2xkKCkgPyAxLjBmIDogMC5mOwor
ICAgIG1fc2NyaXB0Q2FjaGUgPSAwOworICAgIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMgPSAwOwor
ICAgIG1faXNTeXN0ZW1Gb250ID0gZmFsc2U7CisgICAgCisgICAgaWYgKG1fZm9udC51c2VHREko
KSkgeworICAgICAgICBIREMgaGRjID0gR2V0REMoMCk7CisgICAgICAgIEhHRElPQkogb2xkRm9u
dCA9IFNlbGVjdE9iamVjdChoZGMsIG1fZm9udC5oZm9udCgpKTsKKyAgICAgICAgT1VUTElORVRF
WFRNRVRSSUMgbWV0cmljczsKKyAgICAgICAgR2V0T3V0bGluZVRleHRNZXRyaWNzKGhkYywgc2l6
ZW9mKG1ldHJpY3MpLCAmbWV0cmljcyk7CisgICAgICAgIFRFWFRNRVRSSUMmIHRleHRNZXRyaWNz
ID0gbWV0cmljcy5vdG1UZXh0TWV0cmljczsKKyAgICAgICAgbV9hc2NlbnQgPSB0ZXh0TWV0cmlj
cy50bUFzY2VudDsKKyAgICAgICAgbV9kZXNjZW50ID0gdGV4dE1ldHJpY3MudG1EZXNjZW50Owor
ICAgICAgICBtX2xpbmVHYXAgPSB0ZXh0TWV0cmljcy50bUV4dGVybmFsTGVhZGluZzsKKyAgICAg
ICAgbV9saW5lU3BhY2luZyA9IG1fYXNjZW50ICsgbV9kZXNjZW50ICsgbV9saW5lR2FwOworICAg
ICAgICBtX3hIZWlnaHQgPSBtX2FzY2VudCAqIDAuNTZmOyAvLyBCZXN0IGd1ZXNzIGZvciB4SGVp
Z2h0IGlmIG5vIHggZ2x5cGggaXMgcHJlc2VudC4KKworICAgICAgICBHTFlQSE1FVFJJQ1MgZ207
CisgICAgICAgIE1BVDIgbWF0ID0geyAxLCAwLCAwLCAxIH07CisgICAgICAgIERXT1JEIGxlbiA9
IEdldEdseXBoT3V0bGluZShoZGMsICd4JywgR0dPX01FVFJJQ1MsICZnbSwgMCwgMCwgJm1hdCk7
CisgICAgICAgIGlmIChsZW4gIT0gR0RJX0VSUk9SICYmIGdtLmdtcHRHbHlwaE9yaWdpbi55ID4g
MCkKKyAgICAgICAgICAgIG1feEhlaWdodCA9IGdtLmdtcHRHbHlwaE9yaWdpbi55OworCisgICAg
ICAgIG1fdW5pdHNQZXJFbSA9IG1ldHJpY3Mub3RtRU1TcXVhcmU7CisKKyAgICAgICAgU2VsZWN0
T2JqZWN0KGhkYywgb2xkRm9udCk7CisgICAgICAgIFJlbGVhc2VEQygwLCBoZGMpOworCisgICAg
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDR0ZvbnRSZWYgZm9udCA9IG1fZm9udC5jZ0ZvbnQo
KTsKKyAgICBpbnQgaUFzY2VudCA9IENHRm9udEdldEFzY2VudChmb250KTsKKyAgICBpbnQgaURl
c2NlbnQgPSBDR0ZvbnRHZXREZXNjZW50KGZvbnQpOworICAgIGludCBpTGluZUdhcCA9IENHRm9u
dEdldExlYWRpbmcoZm9udCk7CisgICAgbV91bml0c1BlckVtID0gQ0dGb250R2V0VW5pdHNQZXJF
bShmb250KTsKKyAgICBmbG9hdCBwb2ludFNpemUgPSBtX2ZvbnQuc2l6ZSgpOworICAgIGZsb2F0
IGZBc2NlbnQgPSBzY2FsZUVtVG9Vbml0cyhpQXNjZW50LCBtX3VuaXRzUGVyRW0pICogcG9pbnRT
aXplOworICAgIGZsb2F0IGZEZXNjZW50ID0gLXNjYWxlRW1Ub1VuaXRzKGlEZXNjZW50LCBtX3Vu
aXRzUGVyRW0pICogcG9pbnRTaXplOworICAgIGZsb2F0IGZMaW5lR2FwID0gc2NhbGVFbVRvVW5p
dHMoaUxpbmVHYXAsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7CisKKyAgICBpZiAoIWlzQ3Vz
dG9tRm9udCgpKSB7CisgICAgICAgIEhEQyBkYyA9IEdldERDKDApOworICAgICAgICBIR0RJT0JK
IG9sZEZvbnQgPSBTZWxlY3RPYmplY3QoZGMsIG1fZm9udC5oZm9udCgpKTsKKyAgICAgICAgaW50
IGZhY2VMZW5ndGggPSBHZXRUZXh0RmFjZShkYywgMCwgMCk7CisgICAgICAgIFZlY3RvcjxUQ0hB
Uj4gZmFjZU5hbWUoZmFjZUxlbmd0aCk7CisgICAgICAgIEdldFRleHRGYWNlKGRjLCBmYWNlTGVu
Z3RoLCBmYWNlTmFtZS5kYXRhKCkpOworICAgICAgICBtX2lzU3lzdGVtRm9udCA9ICFfdGNzY21w
KGZhY2VOYW1lLmRhdGEoKSwgX1QoIkx1Y2lkYSBHcmFuZGUiKSk7CisgICAgICAgIFNlbGVjdE9i
amVjdChkYywgb2xkRm9udCk7CisgICAgICAgIFJlbGVhc2VEQygwLCBkYyk7CisKKyAgICAgICAg
aWYgKHNob3VsZEFwcGx5TWFjQXNjZW50SGFjaykgeworICAgICAgICAgICAgLy8gVGhpcyBjb2Rl
IGNvbWVzIGZyb20gRm9udERhdGFNYWMubW0uIFdlIG9ubHkgZXZlciBkbyB0aGlzIHdoZW4gcnVu
bmluZyByZWdyZXNzaW9uIHRlc3RzIHNvIHRoYXQgb3VyIG1ldHJpY3Mgd2lsbCBtYXRjaCBNYWMu
CisKKyAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYWRqdXN0IFRpbWVzLCBIZWx2ZXRpY2EsIGFu
ZCBDb3VyaWVyIHRvIGNsb3NlbHkgbWF0Y2ggdGhlCisgICAgICAgICAgICAvLyB2ZXJ0aWNhbCBt
ZXRyaWNzIG9mIHRoZWlyIE1pY3Jvc29mdCBjb3VudGVycGFydHMgdGhhdCBhcmUgdGhlIGRlIGZh
Y3RvCisgICAgICAgICAgICAvLyB3ZWIgc3RhbmRhcmQuIFRoZSBBcHBLaXQgYWRqdXN0bWVudCBv
ZiAyMCUgaXMgdG9vIGJpZyBhbmQgaXMKKyAgICAgICAgICAgIC8vIGluY29ycmVjdGx5IGFkZGVk
IHRvIGxpbmUgc3BhY2luZywgc28gd2UgdXNlIGEgMTUlIGFkanVzdG1lbnQgaW5zdGVhZAorICAg
ICAgICAgICAgLy8gYW5kIGFkZCBpdCB0byB0aGUgYXNjZW50LgorICAgICAgICAgICAgaWYgKCFf
dGNzY21wKGZhY2VOYW1lLmRhdGEoKSwgX1QoIlRpbWVzIikpIHx8ICFfdGNzY21wKGZhY2VOYW1l
LmRhdGEoKSwgX1QoIkhlbHZldGljYSIpKSB8fCAhX3Rjc2NtcChmYWNlTmFtZS5kYXRhKCksIF9U
KCJDb3VyaWVyIikpKQorICAgICAgICAgICAgICAgIGZBc2NlbnQgKz0gZmxvb3JmKCgoZkFzY2Vu
dCArIGZEZXNjZW50KSAqIDAuMTVmKSArIDAuNWYpOworICAgICAgICB9CisgICAgfQorCisgICAg
bV9hc2NlbnQgPSBscm91bmRmKGZBc2NlbnQpOworICAgIG1fZGVzY2VudCA9IGxyb3VuZGYoZkRl
c2NlbnQpOworICAgIG1fbGluZUdhcCA9IGxyb3VuZGYoZkxpbmVHYXApOworICAgIG1fbGluZVNw
YWNpbmcgPSBtX2FzY2VudCArIG1fZGVzY2VudCArIG1fbGluZUdhcDsKKworICAgIC8vIE1lYXN1
cmUgdGhlIGFjdHVhbCBjaGFyYWN0ZXIgIngiLCBiZWNhdXNlIEFwcEtpdCBzeW50aGVzaXplcyBY
IGhlaWdodCByYXRoZXIgdGhhbiBnZXR0aW5nIGl0IGZyb20gdGhlIGZvbnQuCisgICAgLy8gVW5m
b3J0dW5hdGVseSwgTlNGb250IHdpbGwgcm91bmQgdGhpcyBmb3IgdXMgc28gd2UgZG9uJ3QgcXVp
dGUgZ2V0IHRoZSByaWdodCB2YWx1ZS4KKyAgICBHbHlwaFBhZ2UqIGdseXBoUGFnZVplcm8gPSBH
bHlwaFBhZ2VUcmVlTm9kZTo6Z2V0Um9vdENoaWxkKHRoaXMsIDApLT5wYWdlKCk7CisgICAgR2x5
cGggeEdseXBoID0gZ2x5cGhQYWdlWmVybyA/IGdseXBoUGFnZVplcm8tPmdseXBoRGF0YUZvckNo
YXJhY3RlcigneCcpLmdseXBoIDogMDsKKyAgICBpZiAoeEdseXBoKSB7CisgICAgICAgIENHUmVj
dCB4Qm94OworICAgICAgICBDR0ZvbnRHZXRHbHlwaEJCb3hlcyhmb250LCAmeEdseXBoLCAxLCAm
eEJveCk7CisgICAgICAgIC8vIFVzZSB0aGUgbWF4aW11bSBvZiBlaXRoZXIgd2lkdGggb3IgaGVp
Z2h0IGJlY2F1c2UgIngiIGlzIG5lYXJseSBzcXVhcmUKKyAgICAgICAgLy8gYW5kIHdlYiBwYWdl
cyB0aGF0IGZvb2xpc2hseSB1c2UgdGhpcyBtZXRyaWMgZm9yIHdpZHRoIHdpbGwgYmUgbGFpZCBv
dXQKKyAgICAgICAgLy8gcG9vcmx5IGlmIHdlIHJldHVybiBhbiBhY2N1cmF0ZSBoZWlnaHQuIENs
YXNzaWMgY2FzZSBpcyBUaW1lcyAxMyBwb2ludCwKKyAgICAgICAgLy8gd2hpY2ggaGFzIGFuICJ4
IiB0aGF0IGlzIDd4NiBwaXhlbHMuCisgICAgICAgIG1feEhlaWdodCA9IHNjYWxlRW1Ub1VuaXRz
KG1heChDR1JlY3RHZXRNYXhYKHhCb3gpLCBDR1JlY3RHZXRNYXhZKHhCb3gpKSwgbV91bml0c1Bl
ckVtKSAqIHBvaW50U2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgaVhIZWlnaHQgPSBD
R0ZvbnRHZXRYSGVpZ2h0KGZvbnQpOworICAgICAgICBtX3hIZWlnaHQgPSBzY2FsZUVtVG9Vbml0
cyhpWEhlaWdodCwgbV91bml0c1BlckVtKSAqIHBvaW50U2l6ZTsKKyAgICB9Cit9CisKK3ZvaWQg
U2ltcGxlRm9udERhdGE6OnBsYXRmb3JtRGVzdHJveSgpCit7CisgICAgaWYgKCFpc0N1c3RvbUZv
bnQoKSkgeworICAgICAgICBEZWxldGVPYmplY3QobV9mb250Lmhmb250KCkpOworICAgICAgICBD
R0ZvbnRSZWxlYXNlKG1fZm9udC5jZ0ZvbnQoKSk7CisgICAgfQorCisgICAgLy8gV2UgZG9uJ3Qg
aGFzaCB0aGlzIG9uIFdpbjMyLCBzbyBpdCdzIGVmZmVjdGl2ZWx5IG93bmVkIGJ5IHVzLgorICAg
IGRlbGV0ZSBtX3NtYWxsQ2Fwc0ZvbnREYXRhOworCisgICAgU2NyaXB0RnJlZUNhY2hlKCZtX3Nj
cmlwdENhY2hlKTsKKyAgICBkZWxldGUgbV9zY3JpcHRGb250UHJvcGVydGllczsKK30KKworU2lt
cGxlRm9udERhdGEqIFNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNGb250RGF0YShjb25zdCBGb250
RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKK3sKKyAgICBpZiAoIW1fc21hbGxD
YXBzRm9udERhdGEpIHsKKyAgICAgICAgZmxvYXQgc21hbGxDYXBzSGVpZ2h0ID0gY1NtYWxsQ2Fw
c0ZvbnRTaXplTXVsdGlwbGllciAqIG1fZm9udC5zaXplKCk7CisgICAgICAgIGlmIChpc0N1c3Rv
bUZvbnQoKSkgeworICAgICAgICAgICAgRm9udFBsYXRmb3JtRGF0YSBzbWFsbENhcHNGb250RGF0
YShtX2ZvbnQpOworICAgICAgICAgICAgc21hbGxDYXBzRm9udERhdGEuc2V0U2l6ZShzbWFsbENh
cHNIZWlnaHQpOworICAgICAgICAgICAgbV9zbWFsbENhcHNGb250RGF0YSA9IG5ldyBTaW1wbGVG
b250RGF0YShzbWFsbENhcHNGb250RGF0YSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgTE9HRk9OVCB3aW5mb250OworICAgICAgICAgICAgR2V0T2JqZWN0KG1f
Zm9udC5oZm9udCgpLCBzaXplb2YoTE9HRk9OVCksICZ3aW5mb250KTsKKyAgICAgICAgICAgIHdp
bmZvbnQubGZIZWlnaHQgPSAtbHJvdW5kZihzbWFsbENhcHNIZWlnaHQgKiAobV9mb250LnVzZUdE
SSgpID8gMSA6IDMyKSk7CisgICAgICAgICAgICBIRk9OVCBoZm9udCA9IENyZWF0ZUZvbnRJbmRp
cmVjdCgmd2luZm9udCk7CisgICAgICAgICAgICBtX3NtYWxsQ2Fwc0ZvbnREYXRhID0gbmV3IFNp
bXBsZUZvbnREYXRhKEZvbnRQbGF0Zm9ybURhdGEoaGZvbnQsIHNtYWxsQ2Fwc0hlaWdodCwgZm9u
dERlc2NyaXB0aW9uLmJvbGQoKSwgZm9udERlc2NyaXB0aW9uLml0YWxpYygpLCBtX2ZvbnQudXNl
R0RJKCkpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbV9zbWFsbENhcHNGb250RGF0
YTsKK30KKworYm9vbCBTaW1wbGVGb250RGF0YTo6Y29udGFpbnNDaGFyYWN0ZXJzKGNvbnN0IFVD
aGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3RoKSBjb25zdAoreworICAgIC8vIEZJWE1FOiBTdXBw
b3J0IGN1c3RvbSBmb250cy4KKyAgICBpZiAoaXNDdXN0b21Gb250KCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIC8vIEZJWE1FOiBNaWNyb3NvZnQgZG9jdW1lbnRhdGlvbiBzZWVtcyB0
byBpbXBseSB0aGF0IGNoYXJhY3RlcnMgY2FuIGJlIG91dHB1dCB1c2luZyBhIGdpdmVuIGZvbnQg
YW5kIERDCisgICAgLy8gbWVyZWx5IGJ5IHRlc3RpbmcgY29kZSBwYWdlIGludGVyc2VjdGlvbi4g
IFRoaXMgc2VlbXMgc3VzcGVjdCB0aG91Z2guICBDYW4ndCBhIGZvbnQgb25seSBwYXJ0aWFsbHkK
KyAgICAvLyBjb3ZlciBhIGdpdmVuIGNvZGUgcGFnZT8KKyAgICBJTUxhbmdGb250TGluazIqIGxh
bmdGb250TGluayA9IEZvbnRDYWNoZTo6Z2V0Rm9udExpbmtJbnRlcmZhY2UoKTsKKyAgICBpZiAo
IWxhbmdGb250TGluaykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgSERDIGRjID0gR2V0
REMoMCk7CisgICAgCisgICAgRFdPUkQgYWNwQ29kZVBhZ2VzOworICAgIGxhbmdGb250TGluay0+
Q29kZVBhZ2VUb0NvZGVQYWdlcyhDUF9BQ1AsICZhY3BDb2RlUGFnZXMpOworCisgICAgRFdPUkQg
Zm9udENvZGVQYWdlczsKKyAgICBsYW5nRm9udExpbmstPkdldEZvbnRDb2RlUGFnZXMoZGMsIG1f
Zm9udC5oZm9udCgpLCAmZm9udENvZGVQYWdlcyk7CisKKyAgICBEV09SRCBhY3R1YWxDb2RlUGFn
ZXM7CisgICAgbG9uZyBudW1DaGFyYWN0ZXJzUHJvY2Vzc2VkOworICAgIGxvbmcgb2Zmc2V0ID0g
MDsKKyAgICB3aGlsZSAob2Zmc2V0IDwgbGVuZ3RoKSB7CisgICAgICAgIGxhbmdGb250TGluay0+
R2V0U3RyQ29kZVBhZ2VzKGNoYXJhY3RlcnMsIGxlbmd0aCwgYWNwQ29kZVBhZ2VzLCAmYWN0dWFs
Q29kZVBhZ2VzLCAmbnVtQ2hhcmFjdGVyc1Byb2Nlc3NlZCk7CisgICAgICAgIGlmICgoYWN0dWFs
Q29kZVBhZ2VzICYgZm9udENvZGVQYWdlcykgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgb2Zmc2V0ICs9IG51bUNoYXJhY3RlcnNQcm9jZXNzZWQ7CisgICAgfQorCisg
ICAgUmVsZWFzZURDKDAsIGRjKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNpbXBs
ZUZvbnREYXRhOjpkZXRlcm1pbmVQaXRjaCgpCit7CisgICAgaWYgKGlzQ3VzdG9tRm9udCgpKSB7
CisgICAgICAgIG1fdHJlYXRBc0ZpeGVkUGl0Y2ggPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKworICAgIC8vIFRFWFRNRVRSSUNTIGhhdmUgdGhpcy4gIFNldCBtX3RyZWF0QXNGaXhl
ZFBpdGNoIGJhc2VkIG9mZiB0aGF0LgorICAgIEhEQyBkYyA9IEdldERDKDApOworICAgIFNhdmVE
QyhkYyk7CisgICAgU2VsZWN0T2JqZWN0KGRjLCBtX2ZvbnQuaGZvbnQoKSk7CisKKyAgICAvLyBZ
ZXMsIHRoaXMgbG9va3MgYmFja3dhcmRzLCBidXQgdGhlIGZpeGVkIHBpdGNoIGJpdCBpcyBhY3R1
YWxseSBzZXQgaWYgdGhlIGZvbnQKKyAgICAvLyBpcyAqbm90KiBmaXhlZCBwaXRjaC4gIFVuYmVs
aWV2YWJsZSBidXQgdHJ1ZS4KKyAgICBURVhUTUVUUklDIHRtOworICAgIEdldFRleHRNZXRyaWNz
KGRjLCAmdG0pOworICAgIG1fdHJlYXRBc0ZpeGVkUGl0Y2ggPSAoKHRtLnRtUGl0Y2hBbmRGYW1p
bHkgJiBUTVBGX0ZJWEVEX1BJVENIKSA9PSAwKTsKKworICAgIFJlc3RvcmVEQyhkYywgLTEpOwor
ICAgIFJlbGVhc2VEQygwLCBkYyk7Cit9CisKK2Zsb2F0IFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9y
bVdpZHRoRm9yR2x5cGgoR2x5cGggZ2x5cGgpIGNvbnN0Cit7CisgICAgaWYgKG1fZm9udC51c2VH
REkoKSkgeworICAgICAgICBIREMgaGRjID0gR2V0REMoMCk7CisgICAgICAgIEhHRElPQkogb2xk
Rm9udCA9IFNlbGVjdE9iamVjdChoZGMsIG1fZm9udC5oZm9udCgpKTsKKyAgICAgICAgaW50IHdp
ZHRoOworICAgICAgICBHZXRDaGFyV2lkdGhJKGhkYywgZ2x5cGgsIDEsIDAsICZ3aWR0aCk7Cisg
ICAgICAgIFNlbGVjdE9iamVjdChoZGMsIG9sZEZvbnQpOworICAgICAgICBSZWxlYXNlREMoMCwg
aGRjKTsKKyAgICAgICAgcmV0dXJuIHdpZHRoOworICAgIH0KKworICAgIENHRm9udFJlZiBmb250
ID0gbV9mb250LmNnRm9udCgpOworICAgIGZsb2F0IHBvaW50U2l6ZSA9IG1fZm9udC5zaXplKCk7
CisgICAgQ0dTaXplIGFkdmFuY2U7CisgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENHQWZmaW5l
VHJhbnNmb3JtTWFrZVNjYWxlKHBvaW50U2l6ZSwgcG9pbnRTaXplKTsKKyAgICAvLyBGSVhNRTog
TmVlZCB0byBhZGQgcmVhbCBzdXBwb3J0IGZvciBwcmludGVyIGZvbnRzLgorICAgIGJvb2wgaXNQ
cmludGVyRm9udCA9IGZhbHNlOworICAgIHdrR2V0R2x5cGhBZHZhbmNlcyhmb250LCBtLCBtX2lz
U3lzdGVtRm9udCwgaXNQcmludGVyRm9udCwgZ2x5cGgsIGFkdmFuY2UpOworICAgIHJldHVybiBh
ZHZhbmNlLndpZHRoICsgbV9zeW50aGV0aWNCb2xkT2Zmc2V0OworfQorCitTQ1JJUFRfRk9OVFBS
T1BFUlRJRVMqIFNpbXBsZUZvbnREYXRhOjpzY3JpcHRGb250UHJvcGVydGllcygpIGNvbnN0Cit7
CisgICAgaWYgKCFtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzKSB7CisgICAgICAgIG1fc2NyaXB0Rm9u
dFByb3BlcnRpZXMgPSBuZXcgU0NSSVBUX0ZPTlRQUk9QRVJUSUVTOworICAgICAgICBtZW1zZXQo
bV9zY3JpcHRGb250UHJvcGVydGllcywgMCwgc2l6ZW9mKFNDUklQVF9GT05UUFJPUEVSVElFUykp
OworICAgICAgICBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzLT5jQnl0ZXMgPSBzaXplb2YoU0NSSVBU
X0ZPTlRQUk9QRVJUSUVTKTsKKyAgICAgICAgSFJFU1VMVCByZXN1bHQgPSBTY3JpcHRHZXRGb250
UHJvcGVydGllcygwLCBzY3JpcHRDYWNoZSgpLCBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzKTsKKyAg
ICAgICAgaWYgKHJlc3VsdCA9PSBFX1BFTkRJTkcpIHsKKyAgICAgICAgICAgIEhEQyBkYyA9IEdl
dERDKDApOworICAgICAgICAgICAgU2F2ZURDKGRjKTsKKyAgICAgICAgICAgIFNlbGVjdE9iamVj
dChkYywgbV9mb250Lmhmb250KCkpOworICAgICAgICAgICAgU2NyaXB0R2V0Rm9udFByb3BlcnRp
ZXMoZGMsIHNjcmlwdENhY2hlKCksIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMpOworICAgICAgICAg
ICAgUmVzdG9yZURDKGRjLCAtMSk7CisgICAgICAgICAgICBSZWxlYXNlREMoMCwgZGMpOworICAg
ICAgICB9CisgICAgfQorICAgIHJldHVybiBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzOworfQorCit9
CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNHV2lu
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVG
b250RGF0YUNHV2luLmNwcAkocmV2aXNpb24gMjk3MjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YUNHV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1
ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCBBcHBs
ZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCkBAIC0zOCwyNyArMzgsMTggQEAKICNpbmNsdWRlIDx1bmljb2RlL3VjaGFyLmg+CiAjaW5j
bHVkZSA8dW5pY29kZS91bm9ybS5oPgogI2luY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBw
bGljYXRpb25TZXJ2aWNlcy5oPgorI2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVyZmFjZS9XZWJL
aXRTeXN0ZW1JbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtbGFuZy5oPgogI2luY2x1ZGUgPHRjaGFy
Lmg+Ci0jaW5jbHVkZSA8V2ViS2l0U3lzdGVtSW50ZXJmYWNlL1dlYktpdFN5c3RlbUludGVyZmFj
ZS5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIHVzaW5nIHN0ZDo6bWF4OwogCi1jb25zdCBm
bG9hdCBjU21hbGxDYXBzRm9udFNpemVNdWx0aXBsaWVyID0gMC43ZjsKLQotc3RhdGljIGJvb2wg
c2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrOwotCi1zdGF0aWMgaW5saW5lIGZsb2F0IHNjYWxlRW1U
b1VuaXRzKGZsb2F0IHgsIHVuc2lnbmVkIHVuaXRzUGVyRW0pIHsgcmV0dXJuIHVuaXRzUGVyRW0g
PyB4IC8gKGZsb2F0KXVuaXRzUGVyRW0gOiB4OyB9Ci0KLXZvaWQgU2ltcGxlRm9udERhdGE6OnNl
dFNob3VsZEFwcGx5TWFjQXNjZW50SGFjayhib29sIGIpCi17Ci0gICAgc2hvdWxkQXBwbHlNYWNB
c2NlbnRIYWNrID0gYjsKLX0KK3N0YXRpYyBpbmxpbmUgZmxvYXQgc2NhbGVFbVRvVW5pdHMoZmxv
YXQgeCwgdW5zaWduZWQgdW5pdHNQZXJFbSkgeyByZXR1cm4gdW5pdHNQZXJFbSA/IHggLyBzdGF0
aWNfY2FzdDxmbG9hdD4odW5pdHNQZXJFbSkgOiB4OyB9CiAKIHZvaWQgU2ltcGxlRm9udERhdGE6
OnBsYXRmb3JtSW5pdCgpCi17ICAgIAorewogICAgIG1fc3ludGhldGljQm9sZE9mZnNldCA9IG1f
Zm9udC5zeW50aGV0aWNCb2xkKCkgPyAxLjBmIDogMC5mOwogICAgIG1fc2NyaXB0Q2FjaGUgPSAw
OwogICAgIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMgPSAwOwpAQCAtMTEwLDcgKzEwMSw3IEBAIHZv
aWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtSW5pdCgpCiAgICAgICAgIFNlbGVjdE9iamVjdChk
Yywgb2xkRm9udCk7CiAgICAgICAgIFJlbGVhc2VEQygwLCBkYyk7CiAKLSAgICAgICAgaWYgKHNo
b3VsZEFwcGx5TWFjQXNjZW50SGFjaykgeworICAgICAgICBpZiAoc2hvdWxkQXBwbHlNYWNBc2Nl
bnRIYWNrKCkpIHsKICAgICAgICAgICAgIC8vIFRoaXMgY29kZSBjb21lcyBmcm9tIEZvbnREYXRh
TWFjLm1tLiBXZSBvbmx5IGV2ZXIgZG8gdGhpcyB3aGVuIHJ1bm5pbmcgcmVncmVzc2lvbiB0ZXN0
cyBzbyB0aGF0IG91ciBtZXRyaWNzIHdpbGwgbWF0Y2ggTWFjLgogCiAgICAgICAgICAgICAvLyBX
ZSBuZWVkIHRvIGFkanVzdCBUaW1lcywgSGVsdmV0aWNhLCBhbmQgQ291cmllciB0byBjbG9zZWx5
IG1hdGNoIHRoZQpAQCAtMTYwLDgzICsxNTEsNiBAQCB2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0
Zm9ybURlc3Ryb3koKQogICAgIGRlbGV0ZSBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzOwogfQogCi1T
aW1wbGVGb250RGF0YSogU2ltcGxlRm9udERhdGE6OnNtYWxsQ2Fwc0ZvbnREYXRhKGNvbnN0IEZv
bnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uKSBjb25zdAotewotICAgIGlmICghbV9zbWFs
bENhcHNGb250RGF0YSkgewotICAgICAgICBmbG9hdCBzbWFsbENhcHNIZWlnaHQgPSBjU21hbGxD
YXBzRm9udFNpemVNdWx0aXBsaWVyICogbV9mb250LnNpemUoKTsKLSAgICAgICAgaWYgKGlzQ3Vz
dG9tRm9udCgpKSB7Ci0gICAgICAgICAgICBGb250UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnRE
YXRhKG1fZm9udCk7Ci0gICAgICAgICAgICBzbWFsbENhcHNGb250RGF0YS5zZXRTaXplKHNtYWxs
Q2Fwc0hlaWdodCk7Ci0gICAgICAgICAgICBtX3NtYWxsQ2Fwc0ZvbnREYXRhID0gbmV3IFNpbXBs
ZUZvbnREYXRhKHNtYWxsQ2Fwc0ZvbnREYXRhLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIH0gZWxz
ZSB7Ci0gICAgICAgICAgICBMT0dGT05UIHdpbmZvbnQ7Ci0gICAgICAgICAgICBHZXRPYmplY3Qo
bV9mb250Lmhmb250KCksIHNpemVvZihMT0dGT05UKSwgJndpbmZvbnQpOwotICAgICAgICAgICAg
d2luZm9udC5sZkhlaWdodCA9IC1scm91bmRmKHNtYWxsQ2Fwc0hlaWdodCAqIChtX2ZvbnQudXNl
R0RJKCkgPyAxIDogMzIpKTsKLSAgICAgICAgICAgIEhGT05UIGhmb250ID0gQ3JlYXRlRm9udElu
ZGlyZWN0KCZ3aW5mb250KTsKLSAgICAgICAgICAgIG1fc21hbGxDYXBzRm9udERhdGEgPSBuZXcg
U2ltcGxlRm9udERhdGEoRm9udFBsYXRmb3JtRGF0YShoZm9udCwgc21hbGxDYXBzSGVpZ2h0LCBm
b250RGVzY3JpcHRpb24uYm9sZCgpLCBmb250RGVzY3JpcHRpb24uaXRhbGljKCksIG1fZm9udC51
c2VHREkoKSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtX3NtYWxsQ2Fwc0ZvbnRE
YXRhOwotfQotCi1ib29sIFNpbXBsZUZvbnREYXRhOjpjb250YWluc0NoYXJhY3RlcnMoY29uc3Qg
VUNoYXIqIGNoYXJhY3RlcnMsIGludCBsZW5ndGgpIGNvbnN0Ci17Ci0gICAgLy8gRklYTUU6IFN1
cHBvcnQgY3VzdG9tIGZvbnRzLgotICAgIGlmIChpc0N1c3RvbUZvbnQoKSkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotCi0gICAgLy8gRklYTUU6IE1pY3Jvc29mdCBkb2N1bWVudGF0aW9uIHNlZW1z
IHRvIGltcGx5IHRoYXQgY2hhcmFjdGVycyBjYW4gYmUgb3V0cHV0IHVzaW5nIGEgZ2l2ZW4gZm9u
dCBhbmQgREMKLSAgICAvLyBtZXJlbHkgYnkgdGVzdGluZyBjb2RlIHBhZ2UgaW50ZXJzZWN0aW9u
LiAgVGhpcyBzZWVtcyBzdXNwZWN0IHRob3VnaC4gIENhbid0IGEgZm9udCBvbmx5IHBhcnRpYWxs
eQotICAgIC8vIGNvdmVyIGEgZ2l2ZW4gY29kZSBwYWdlPwotICAgIElNTGFuZ0ZvbnRMaW5rMiog
bGFuZ0ZvbnRMaW5rID0gRm9udENhY2hlOjpnZXRGb250TGlua0ludGVyZmFjZSgpOwotICAgIGlm
ICghbGFuZ0ZvbnRMaW5rKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBIREMgZGMgPSBH
ZXREQygwKTsKLSAgICAKLSAgICBEV09SRCBhY3BDb2RlUGFnZXM7Ci0gICAgbGFuZ0ZvbnRMaW5r
LT5Db2RlUGFnZVRvQ29kZVBhZ2VzKENQX0FDUCwgJmFjcENvZGVQYWdlcyk7Ci0KLSAgICBEV09S
RCBmb250Q29kZVBhZ2VzOwotICAgIGxhbmdGb250TGluay0+R2V0Rm9udENvZGVQYWdlcyhkYywg
bV9mb250Lmhmb250KCksICZmb250Q29kZVBhZ2VzKTsKLQotICAgIERXT1JEIGFjdHVhbENvZGVQ
YWdlczsKLSAgICBsb25nIG51bUNoYXJhY3RlcnNQcm9jZXNzZWQ7Ci0gICAgbG9uZyBvZmZzZXQg
PSAwOwotICAgIHdoaWxlIChvZmZzZXQgPCBsZW5ndGgpIHsKLSAgICAgICAgbGFuZ0ZvbnRMaW5r
LT5HZXRTdHJDb2RlUGFnZXMoY2hhcmFjdGVycywgbGVuZ3RoLCBhY3BDb2RlUGFnZXMsICZhY3R1
YWxDb2RlUGFnZXMsICZudW1DaGFyYWN0ZXJzUHJvY2Vzc2VkKTsKLSAgICAgICAgaWYgKChhY3R1
YWxDb2RlUGFnZXMgJiBmb250Q29kZVBhZ2VzKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgICAgICBvZmZzZXQgKz0gbnVtQ2hhcmFjdGVyc1Byb2Nlc3NlZDsKLSAgICB9Ci0K
LSAgICBSZWxlYXNlREMoMCwgZGMpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU2lt
cGxlRm9udERhdGE6OmRldGVybWluZVBpdGNoKCkKLXsKLSAgICBpZiAoaXNDdXN0b21Gb250KCkp
IHsKLSAgICAgICAgbV90cmVhdEFzRml4ZWRQaXRjaCA9IGZhbHNlOwotICAgICAgICByZXR1cm47
Ci0gICAgfQotCi0gICAgLy8gVEVYVE1FVFJJQ1MgaGF2ZSB0aGlzLiAgU2V0IG1fdHJlYXRBc0Zp
eGVkUGl0Y2ggYmFzZWQgb2ZmIHRoYXQuCi0gICAgSERDIGRjID0gR2V0REMoMCk7Ci0gICAgU2F2
ZURDKGRjKTsKLSAgICBTZWxlY3RPYmplY3QoZGMsIG1fZm9udC5oZm9udCgpKTsKLQotICAgIC8v
IFllcywgdGhpcyBsb29rcyBiYWNrd2FyZHMsIGJ1dCB0aGUgZml4ZWQgcGl0Y2ggYml0IGlzIGFj
dHVhbGx5IHNldCBpZiB0aGUgZm9udAotICAgIC8vIGlzICpub3QqIGZpeGVkIHBpdGNoLiAgVW5i
ZWxpZXZhYmxlIGJ1dCB0cnVlLgotICAgIFRFWFRNRVRSSUMgdG07Ci0gICAgR2V0VGV4dE1ldHJp
Y3MoZGMsICZ0bSk7Ci0gICAgbV90cmVhdEFzRml4ZWRQaXRjaCA9ICgodG0udG1QaXRjaEFuZEZh
bWlseSAmIFRNUEZfRklYRURfUElUQ0gpID09IDApOwotCi0gICAgUmVzdG9yZURDKGRjLCAtMSk7
Ci0gICAgUmVsZWFzZURDKDAsIGRjKTsKLX0KLQogZmxvYXQgU2ltcGxlRm9udERhdGE6OnBsYXRm
b3JtV2lkdGhGb3JHbHlwaChHbHlwaCBnbHlwaCkgY29uc3QKIHsKICAgICBpZiAobV9mb250LnVz
ZUdESSgpKSB7CkBAIC0yNTMsMjkgKzE2NywxMiBAQCBmbG9hdCBTaW1wbGVGb250RGF0YTo6cGxh
dGZvcm1XaWR0aEZvckdsCiAgICAgZmxvYXQgcG9pbnRTaXplID0gbV9mb250LnNpemUoKTsKICAg
ICBDR1NpemUgYWR2YW5jZTsKICAgICBDR0FmZmluZVRyYW5zZm9ybSBtID0gQ0dBZmZpbmVUcmFu
c2Zvcm1NYWtlU2NhbGUocG9pbnRTaXplLCBwb2ludFNpemUpOworIAogICAgIC8vIEZJWE1FOiBO
ZWVkIHRvIGFkZCByZWFsIHN1cHBvcnQgZm9yIHByaW50ZXIgZm9udHMuCiAgICAgYm9vbCBpc1By
aW50ZXJGb250ID0gZmFsc2U7CiAgICAgd2tHZXRHbHlwaEFkdmFuY2VzKGZvbnQsIG0sIG1faXNT
eXN0ZW1Gb250LCBpc1ByaW50ZXJGb250LCBnbHlwaCwgYWR2YW5jZSk7Ci0gICAgcmV0dXJuIGFk
dmFuY2Uud2lkdGggKyBtX3N5bnRoZXRpY0JvbGRPZmZzZXQ7Ci19CiAKLVNDUklQVF9GT05UUFJP
UEVSVElFUyogU2ltcGxlRm9udERhdGE6OnNjcmlwdEZvbnRQcm9wZXJ0aWVzKCkgY29uc3QKLXsK
LSAgICBpZiAoIW1fc2NyaXB0Rm9udFByb3BlcnRpZXMpIHsKLSAgICAgICAgbV9zY3JpcHRGb250
UHJvcGVydGllcyA9IG5ldyBTQ1JJUFRfRk9OVFBST1BFUlRJRVM7Ci0gICAgICAgIG1lbXNldCht
X3NjcmlwdEZvbnRQcm9wZXJ0aWVzLCAwLCBzaXplb2YoU0NSSVBUX0ZPTlRQUk9QRVJUSUVTKSk7
Ci0gICAgICAgIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMtPmNCeXRlcyA9IHNpemVvZihTQ1JJUFRf
Rk9OVFBST1BFUlRJRVMpOwotICAgICAgICBIUkVTVUxUIHJlc3VsdCA9IFNjcmlwdEdldEZvbnRQ
cm9wZXJ0aWVzKDAsIHNjcmlwdENhY2hlKCksIG1fc2NyaXB0Rm9udFByb3BlcnRpZXMpOwotICAg
ICAgICBpZiAocmVzdWx0ID09IEVfUEVORElORykgewotICAgICAgICAgICAgSERDIGRjID0gR2V0
REMoMCk7Ci0gICAgICAgICAgICBTYXZlREMoZGMpOwotICAgICAgICAgICAgU2VsZWN0T2JqZWN0
KGRjLCBtX2ZvbnQuaGZvbnQoKSk7Ci0gICAgICAgICAgICBTY3JpcHRHZXRGb250UHJvcGVydGll
cyhkYywgc2NyaXB0Q2FjaGUoKSwgbV9zY3JpcHRGb250UHJvcGVydGllcyk7Ci0gICAgICAgICAg
ICBSZXN0b3JlREMoZGMsIC0xKTsKLSAgICAgICAgICAgIFJlbGVhc2VEQygwLCBkYyk7Ci0gICAg
ICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1fc2NyaXB0Rm9udFByb3BlcnRpZXM7CisgICAgcmV0
dXJuIGFkdmFuY2Uud2lkdGggKyBtX3N5bnRoZXRpY0JvbGRPZmZzZXQ7CiB9CiAKIH0KSW5kZXg6
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnREYXRhQ2Fpcm9XaW4uY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1NpbXBsZUZvbnRE
YXRhQ2Fpcm9XaW4uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW4vU2ltcGxlRm9udERhdGFDYWlyb1dpbi5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
MTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9m
IEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAg
aXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVj
dHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHBy
aW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNpbXBsZUZvbnREYXRh
LmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJGb250LmgiCisjaW5jbHVk
ZSAiRm9udENhY2hlLmgiCisjaW5jbHVkZSAiRm9udERlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSAi
Tm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlIDxtbGFuZy5oPgorI2luY2x1ZGUgPHRjaGFyLmg+
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1J
bml0KCkKK3sKKyAgICBtX3NjcmlwdENhY2hlID0gMDsKKyAgICBtX3NjcmlwdEZvbnRQcm9wZXJ0
aWVzID0gMDsKKyAgICBtX2lzU3lzdGVtRm9udCA9IGZhbHNlOworICAgIAorICAgIGlmIChtX2Zv
bnQudXNlR0RJKCkpIHsKKyAgICAgICAgSERDIGhkYyA9IEdldERDKDApOworICAgICAgICBIR0RJ
T0JKIG9sZEZvbnQgPSBTZWxlY3RPYmplY3QoaGRjLCBtX2ZvbnQuaGZvbnQoKSk7CisgICAgICAg
IE9VVExJTkVURVhUTUVUUklDIG1ldHJpY3M7CisgICAgICAgIEdldE91dGxpbmVUZXh0TWV0cmlj
cyhoZGMsIHNpemVvZihtZXRyaWNzKSwgJm1ldHJpY3MpOworICAgICAgICBURVhUTUVUUklDJiB0
ZXh0TWV0cmljcyA9IG1ldHJpY3Mub3RtVGV4dE1ldHJpY3M7CisgICAgICAgIG1fYXNjZW50ID0g
dGV4dE1ldHJpY3MudG1Bc2NlbnQ7CisgICAgICAgIG1fZGVzY2VudCA9IHRleHRNZXRyaWNzLnRt
RGVzY2VudDsKKyAgICAgICAgbV9saW5lR2FwID0gdGV4dE1ldHJpY3MudG1FeHRlcm5hbExlYWRp
bmc7CisgICAgICAgIG1fbGluZVNwYWNpbmcgPSBtX2FzY2VudCArIG1fZGVzY2VudCArIG1fbGlu
ZUdhcDsKKyAgICAgICAgbV94SGVpZ2h0ID0gbV9hc2NlbnQgKiAwLjU2ZjsgLy8gQmVzdCBndWVz
cyBmb3IgeEhlaWdodCBpZiBubyB4IGdseXBoIGlzIHByZXNlbnQuCisKKyAgICAgICAgR0xZUEhN
RVRSSUNTIGdtOworICAgICAgICBNQVQyIG1hdCA9IHsgMSwgMCwgMCwgMSB9OworICAgICAgICBE
V09SRCBsZW4gPSBHZXRHbHlwaE91dGxpbmUoaGRjLCAneCcsIEdHT19NRVRSSUNTLCAmZ20sIDAs
IDAsICZtYXQpOworICAgICAgICBpZiAobGVuICE9IEdESV9FUlJPUiAmJiBnbS5nbXB0R2x5cGhP
cmlnaW4ueSA+IDApCisgICAgICAgICAgICBtX3hIZWlnaHQgPSBnbS5nbXB0R2x5cGhPcmlnaW4u
eTsKKworICAgICAgICBtX3VuaXRzUGVyRW0gPSBtZXRyaWNzLm90bUVNU3F1YXJlOworCisgICAg
ICAgIFNlbGVjdE9iamVjdChoZGMsIG9sZEZvbnQpOworICAgICAgICBSZWxlYXNlREMoMCwgaGRj
KTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gRklYTUU6IFRoaXMgc2VjdGlv
biBzaG91bGQgZGV0ZXJtaW5lIGZvbnQgZGltZW5zaW9ucyAoc2VlIENHIGltcGxlbWVudGF0aW9u
KS4KKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0
Zm9ybURlc3Ryb3koKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK2Zsb2F0IFNpbXBs
ZUZvbnREYXRhOjpwbGF0Zm9ybVdpZHRoRm9yR2x5cGgoR2x5cGggZ2x5cGgpIGNvbnN0Cit7Cisg
ICAgaWYgKG1fZm9udC51c2VHREkoKSkgeworICAgICAgICBIREMgaGRjID0gR2V0REMoMCk7Cisg
ICAgICAgIEhHRElPQkogb2xkRm9udCA9IFNlbGVjdE9iamVjdChoZGMsIG1fZm9udC5oZm9udCgp
KTsKKyAgICAgICAgaW50IHdpZHRoOworICAgICAgICBHZXRDaGFyV2lkdGhJKGhkYywgZ2x5cGgs
IDEsIDAsICZ3aWR0aCk7CisgICAgICAgIFNlbGVjdE9iamVjdChoZGMsIG9sZEZvbnQpOworICAg
ICAgICBSZWxlYXNlREMoMCwgaGRjKTsKKyAgICAgICAgcmV0dXJuIHdpZHRoOworICAgIH0KKwor
ICAgIC8vIEZJWE1FOiBGbGVzaCBvdXQgd2l0aCBDYWlyby93aW4zMiBmb250IGltcGxlbWVudGF0
aW9uCisgICAgbm90SW1wbGVtZW50ZWQoKTsKKworICAgIHJldHVybiAwOworfQorCit9CkluZGV4
OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9TaW1wbGVGb250RGF0YVdpbi5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vU2ltcGxlRm9udERhdGFX
aW4uY3BwCShyZXZpc2lvbiAzMDA0OCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L1NpbXBsZUZvbnREYXRhV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8q
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuICBBbGwg
cmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC00OCwx
MTYgKzQ4LDE2IEBAIHVzaW5nIHN0ZDo6bWF4OwogCiBjb25zdCBmbG9hdCBjU21hbGxDYXBzRm9u
dFNpemVNdWx0aXBsaWVyID0gMC43ZjsKIAotc3RhdGljIGJvb2wgc2hvdWxkQXBwbHlNYWNBc2Nl
bnRIYWNrOwotCi1zdGF0aWMgaW5saW5lIGZsb2F0IHNjYWxlRW1Ub1VuaXRzKGZsb2F0IHgsIHVu
c2lnbmVkIHVuaXRzUGVyRW0pIHsgcmV0dXJuIHVuaXRzUGVyRW0gPyB4IC8gKGZsb2F0KXVuaXRz
UGVyRW0gOiB4OyB9CitzdGF0aWMgYm9vbCBnX3Nob3VsZEFwcGx5TWFjQXNjZW50SGFjazsKIAog
dm9pZCBTaW1wbGVGb250RGF0YTo6c2V0U2hvdWxkQXBwbHlNYWNBc2NlbnRIYWNrKGJvb2wgYikK
IHsKLSAgICBzaG91bGRBcHBseU1hY0FzY2VudEhhY2sgPSBiOwotfQotCi12b2lkIFNpbXBsZUZv
bnREYXRhOjpwbGF0Zm9ybUluaXQoKQoteyAgICAKLSAgICBtX3N5bnRoZXRpY0JvbGRPZmZzZXQg
PSBtX2ZvbnQuc3ludGhldGljQm9sZCgpID8gMS4wZiA6IDAuZjsKLSAgICBtX3NjcmlwdENhY2hl
ID0gMDsKLSAgICBtX3NjcmlwdEZvbnRQcm9wZXJ0aWVzID0gMDsKLSAgICBtX2lzU3lzdGVtRm9u
dCA9IGZhbHNlOwotICAgIAotICAgIGlmIChtX2ZvbnQudXNlR0RJKCkpIHsKLSAgICAgICAgSERD
IGhkYyA9IEdldERDKDApOwotICAgICAgICBIR0RJT0JKIG9sZEZvbnQgPSBTZWxlY3RPYmplY3Qo
aGRjLCBtX2ZvbnQuaGZvbnQoKSk7Ci0gICAgICAgIE9VVExJTkVURVhUTUVUUklDIG1ldHJpY3M7
Ci0gICAgICAgIEdldE91dGxpbmVUZXh0TWV0cmljcyhoZGMsIHNpemVvZihtZXRyaWNzKSwgJm1l
dHJpY3MpOwotICAgICAgICBURVhUTUVUUklDJiB0ZXh0TWV0cmljcyA9IG1ldHJpY3Mub3RtVGV4
dE1ldHJpY3M7Ci0gICAgICAgIG1fYXNjZW50ID0gdGV4dE1ldHJpY3MudG1Bc2NlbnQ7Ci0gICAg
ICAgIG1fZGVzY2VudCA9IHRleHRNZXRyaWNzLnRtRGVzY2VudDsKLSAgICAgICAgbV9saW5lR2Fw
ID0gdGV4dE1ldHJpY3MudG1FeHRlcm5hbExlYWRpbmc7Ci0gICAgICAgIG1fbGluZVNwYWNpbmcg
PSBtX2FzY2VudCArIG1fZGVzY2VudCArIG1fbGluZUdhcDsKLSAgICAgICAgbV94SGVpZ2h0ID0g
bV9hc2NlbnQgKiAwLjU2ZjsgLy8gQmVzdCBndWVzcyBmb3IgeEhlaWdodCBpZiBubyB4IGdseXBo
IGlzIHByZXNlbnQuCi0KLSAgICAgICAgR0xZUEhNRVRSSUNTIGdtOwotICAgICAgICBNQVQyIG1h
dCA9IHsgMSwgMCwgMCwgMSB9OwotICAgICAgICBEV09SRCBsZW4gPSBHZXRHbHlwaE91dGxpbmUo
aGRjLCAneCcsIEdHT19NRVRSSUNTLCAmZ20sIDAsIDAsICZtYXQpOwotICAgICAgICBpZiAobGVu
ICE9IEdESV9FUlJPUiAmJiBnbS5nbXB0R2x5cGhPcmlnaW4ueSA+IDApCi0gICAgICAgICAgICBt
X3hIZWlnaHQgPSBnbS5nbXB0R2x5cGhPcmlnaW4ueTsKLQotICAgICAgICBtX3VuaXRzUGVyRW0g
PSBtZXRyaWNzLm90bUVNU3F1YXJlOwotCi0gICAgICAgIFNlbGVjdE9iamVjdChoZGMsIG9sZEZv
bnQpOwotICAgICAgICBSZWxlYXNlREMoMCwgaGRjKTsKLQotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgQ0dGb250UmVmIGZvbnQgPSBtX2ZvbnQuY2dGb250KCk7Ci0gICAgaW50IGlBc2Nl
bnQgPSBDR0ZvbnRHZXRBc2NlbnQoZm9udCk7Ci0gICAgaW50IGlEZXNjZW50ID0gQ0dGb250R2V0
RGVzY2VudChmb250KTsKLSAgICBpbnQgaUxpbmVHYXAgPSBDR0ZvbnRHZXRMZWFkaW5nKGZvbnQp
OwotICAgIG1fdW5pdHNQZXJFbSA9IENHRm9udEdldFVuaXRzUGVyRW0oZm9udCk7Ci0gICAgZmxv
YXQgcG9pbnRTaXplID0gbV9mb250LnNpemUoKTsKLSAgICBmbG9hdCBmQXNjZW50ID0gc2NhbGVF
bVRvVW5pdHMoaUFzY2VudCwgbV91bml0c1BlckVtKSAqIHBvaW50U2l6ZTsKLSAgICBmbG9hdCBm
RGVzY2VudCA9IC1zY2FsZUVtVG9Vbml0cyhpRGVzY2VudCwgbV91bml0c1BlckVtKSAqIHBvaW50
U2l6ZTsKLSAgICBmbG9hdCBmTGluZUdhcCA9IHNjYWxlRW1Ub1VuaXRzKGlMaW5lR2FwLCBtX3Vu
aXRzUGVyRW0pICogcG9pbnRTaXplOwotCi0gICAgaWYgKCFpc0N1c3RvbUZvbnQoKSkgewotICAg
ICAgICBIREMgZGMgPSBHZXREQygwKTsKLSAgICAgICAgSEdESU9CSiBvbGRGb250ID0gU2VsZWN0
T2JqZWN0KGRjLCBtX2ZvbnQuaGZvbnQoKSk7Ci0gICAgICAgIGludCBmYWNlTGVuZ3RoID0gR2V0
VGV4dEZhY2UoZGMsIDAsIDApOwotICAgICAgICBWZWN0b3I8VENIQVI+IGZhY2VOYW1lKGZhY2VM
ZW5ndGgpOwotICAgICAgICBHZXRUZXh0RmFjZShkYywgZmFjZUxlbmd0aCwgZmFjZU5hbWUuZGF0
YSgpKTsKLSAgICAgICAgbV9pc1N5c3RlbUZvbnQgPSAhX3Rjc2NtcChmYWNlTmFtZS5kYXRhKCks
IF9UKCJMdWNpZGEgR3JhbmRlIikpOwotICAgICAgICBTZWxlY3RPYmplY3QoZGMsIG9sZEZvbnQp
OwotICAgICAgICBSZWxlYXNlREMoMCwgZGMpOwotCi0gICAgICAgIGlmIChzaG91bGRBcHBseU1h
Y0FzY2VudEhhY2spIHsKLSAgICAgICAgICAgIC8vIFRoaXMgY29kZSBjb21lcyBmcm9tIEZvbnRE
YXRhTWFjLm1tLiBXZSBvbmx5IGV2ZXIgZG8gdGhpcyB3aGVuIHJ1bm5pbmcgcmVncmVzc2lvbiB0
ZXN0cyBzbyB0aGF0IG91ciBtZXRyaWNzIHdpbGwgbWF0Y2ggTWFjLgotCi0gICAgICAgICAgICAv
LyBXZSBuZWVkIHRvIGFkanVzdCBUaW1lcywgSGVsdmV0aWNhLCBhbmQgQ291cmllciB0byBjbG9z
ZWx5IG1hdGNoIHRoZQotICAgICAgICAgICAgLy8gdmVydGljYWwgbWV0cmljcyBvZiB0aGVpciBN
aWNyb3NvZnQgY291bnRlcnBhcnRzIHRoYXQgYXJlIHRoZSBkZSBmYWN0bwotICAgICAgICAgICAg
Ly8gd2ViIHN0YW5kYXJkLiBUaGUgQXBwS2l0IGFkanVzdG1lbnQgb2YgMjAlIGlzIHRvbyBiaWcg
YW5kIGlzCi0gICAgICAgICAgICAvLyBpbmNvcnJlY3RseSBhZGRlZCB0byBsaW5lIHNwYWNpbmcs
IHNvIHdlIHVzZSBhIDE1JSBhZGp1c3RtZW50IGluc3RlYWQKLSAgICAgICAgICAgIC8vIGFuZCBh
ZGQgaXQgdG8gdGhlIGFzY2VudC4KLSAgICAgICAgICAgIGlmICghX3Rjc2NtcChmYWNlTmFtZS5k
YXRhKCksIF9UKCJUaW1lcyIpKSB8fCAhX3Rjc2NtcChmYWNlTmFtZS5kYXRhKCksIF9UKCJIZWx2
ZXRpY2EiKSkgfHwgIV90Y3NjbXAoZmFjZU5hbWUuZGF0YSgpLCBfVCgiQ291cmllciIpKSkKLSAg
ICAgICAgICAgICAgICBmQXNjZW50ICs9IGZsb29yZigoKGZBc2NlbnQgKyBmRGVzY2VudCkgKiAw
LjE1ZikgKyAwLjVmKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1fYXNjZW50ID0gbHJvdW5k
ZihmQXNjZW50KTsKLSAgICBtX2Rlc2NlbnQgPSBscm91bmRmKGZEZXNjZW50KTsKLSAgICBtX2xp
bmVHYXAgPSBscm91bmRmKGZMaW5lR2FwKTsKLSAgICBtX2xpbmVTcGFjaW5nID0gbV9hc2NlbnQg
KyBtX2Rlc2NlbnQgKyBtX2xpbmVHYXA7Ci0KLSAgICAvLyBNZWFzdXJlIHRoZSBhY3R1YWwgY2hh
cmFjdGVyICJ4IiwgYmVjYXVzZSBBcHBLaXQgc3ludGhlc2l6ZXMgWCBoZWlnaHQgcmF0aGVyIHRo
YW4gZ2V0dGluZyBpdCBmcm9tIHRoZSBmb250LgotICAgIC8vIFVuZm9ydHVuYXRlbHksIE5TRm9u
dCB3aWxsIHJvdW5kIHRoaXMgZm9yIHVzIHNvIHdlIGRvbid0IHF1aXRlIGdldCB0aGUgcmlnaHQg
dmFsdWUuCi0gICAgR2x5cGhQYWdlKiBnbHlwaFBhZ2VaZXJvID0gR2x5cGhQYWdlVHJlZU5vZGU6
OmdldFJvb3RDaGlsZCh0aGlzLCAwKS0+cGFnZSgpOwotICAgIEdseXBoIHhHbHlwaCA9IGdseXBo
UGFnZVplcm8gPyBnbHlwaFBhZ2VaZXJvLT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoJ3gnKS5nbHlw
aCA6IDA7Ci0gICAgaWYgKHhHbHlwaCkgewotICAgICAgICBDR1JlY3QgeEJveDsKLSAgICAgICAg
Q0dGb250R2V0R2x5cGhCQm94ZXMoZm9udCwgJnhHbHlwaCwgMSwgJnhCb3gpOwotICAgICAgICAv
LyBVc2UgdGhlIG1heGltdW0gb2YgZWl0aGVyIHdpZHRoIG9yIGhlaWdodCBiZWNhdXNlICJ4IiBp
cyBuZWFybHkgc3F1YXJlCi0gICAgICAgIC8vIGFuZCB3ZWIgcGFnZXMgdGhhdCBmb29saXNobHkg
dXNlIHRoaXMgbWV0cmljIGZvciB3aWR0aCB3aWxsIGJlIGxhaWQgb3V0Ci0gICAgICAgIC8vIHBv
b3JseSBpZiB3ZSByZXR1cm4gYW4gYWNjdXJhdGUgaGVpZ2h0LiBDbGFzc2ljIGNhc2UgaXMgVGlt
ZXMgMTMgcG9pbnQsCi0gICAgICAgIC8vIHdoaWNoIGhhcyBhbiAieCIgdGhhdCBpcyA3eDYgcGl4
ZWxzLgotICAgICAgICBtX3hIZWlnaHQgPSBzY2FsZUVtVG9Vbml0cyhtYXgoQ0dSZWN0R2V0TWF4
WCh4Qm94KSwgQ0dSZWN0R2V0TWF4WSh4Qm94KSksIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7
Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IGlYSGVpZ2h0ID0gQ0dGb250R2V0WEhlaWdodChm
b250KTsKLSAgICAgICAgbV94SGVpZ2h0ID0gc2NhbGVFbVRvVW5pdHMoaVhIZWlnaHQsIG1fdW5p
dHNQZXJFbSkgKiBwb2ludFNpemU7Ci0gICAgfQorICAgIGdfc2hvdWxkQXBwbHlNYWNBc2NlbnRI
YWNrID0gYjsKIH0KIAotdm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1EZXN0cm95KCkKK2Jv
b2wgU2ltcGxlRm9udERhdGE6OnNob3VsZEFwcGx5TWFjQXNjZW50SGFjaygpCiB7Ci0gICAgaWYg
KCFpc0N1c3RvbUZvbnQoKSkgewotICAgICAgICBEZWxldGVPYmplY3QobV9mb250Lmhmb250KCkp
OwotICAgICAgICBDR0ZvbnRSZWxlYXNlKG1fZm9udC5jZ0ZvbnQoKSk7Ci0gICAgfQotCi0gICAg
Ly8gV2UgZG9uJ3QgaGFzaCB0aGlzIG9uIFdpbjMyLCBzbyBpdCdzIGVmZmVjdGl2ZWx5IG93bmVk
IGJ5IHVzLgotICAgIGRlbGV0ZSBtX3NtYWxsQ2Fwc0ZvbnREYXRhOwotCi0gICAgU2NyaXB0RnJl
ZUNhY2hlKCZtX3NjcmlwdENhY2hlKTsKLSAgICBkZWxldGUgbV9zY3JpcHRGb250UHJvcGVydGll
czsKKyAgICByZXR1cm4gZ19zaG91bGRBcHBseU1hY0FzY2VudEhhY2s7CiB9CiAKIFNpbXBsZUZv
bnREYXRhKiBTaW1wbGVGb250RGF0YTo6c21hbGxDYXBzRm9udERhdGEoY29uc3QgRm9udERlc2Ny
aXB0aW9uJiBmb250RGVzY3JpcHRpb24pIGNvbnN0CkBAIC0yMzcsMjggKzEzNyw2IEBAIHZvaWQg
U2ltcGxlRm9udERhdGE6OmRldGVybWluZVBpdGNoKCkKICAgICBSZWxlYXNlREMoMCwgZGMpOwog
fQogCi1mbG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZvckdseXBoKEdseXBoIGds
eXBoKSBjb25zdAotewotICAgIGlmIChtX2ZvbnQudXNlR0RJKCkpIHsKLSAgICAgICAgSERDIGhk
YyA9IEdldERDKDApOwotICAgICAgICBIR0RJT0JKIG9sZEZvbnQgPSBTZWxlY3RPYmplY3QoaGRj
LCBtX2ZvbnQuaGZvbnQoKSk7Ci0gICAgICAgIGludCB3aWR0aDsKLSAgICAgICAgR2V0Q2hhcldp
ZHRoSShoZGMsIGdseXBoLCAxLCAwLCAmd2lkdGgpOwotICAgICAgICBTZWxlY3RPYmplY3QoaGRj
LCBvbGRGb250KTsKLSAgICAgICAgUmVsZWFzZURDKDAsIGhkYyk7Ci0gICAgICAgIHJldHVybiB3
aWR0aDsKLSAgICB9Ci0KLSAgICBDR0ZvbnRSZWYgZm9udCA9IG1fZm9udC5jZ0ZvbnQoKTsKLSAg
ICBmbG9hdCBwb2ludFNpemUgPSBtX2ZvbnQuc2l6ZSgpOwotICAgIENHU2l6ZSBhZHZhbmNlOwot
ICAgIENHQWZmaW5lVHJhbnNmb3JtIG0gPSBDR0FmZmluZVRyYW5zZm9ybU1ha2VTY2FsZShwb2lu
dFNpemUsIHBvaW50U2l6ZSk7Ci0gICAgLy8gRklYTUU6IE5lZWQgdG8gYWRkIHJlYWwgc3VwcG9y
dCBmb3IgcHJpbnRlciBmb250cy4KLSAgICBib29sIGlzUHJpbnRlckZvbnQgPSBmYWxzZTsKLSAg
ICB3a0dldEdseXBoQWR2YW5jZXMoZm9udCwgbSwgbV9pc1N5c3RlbUZvbnQsIGlzUHJpbnRlckZv
bnQsIGdseXBoLCBhZHZhbmNlKTsKLSAgICByZXR1cm4gYWR2YW5jZS53aWR0aCArIG1fc3ludGhl
dGljQm9sZE9mZnNldDsKLX0KLQogU0NSSVBUX0ZPTlRQUk9QRVJUSUVTKiBTaW1wbGVGb250RGF0
YTo6c2NyaXB0Rm9udFByb3BlcnRpZXMoKSBjb25zdAogewogICAgIGlmICghbV9zY3JpcHRGb250
UHJvcGVydGllcykgewpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlQ0dXaW4u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNHV2luLmNw
cAkocmV2aXNpb24gMjk4MzQpCShmcm9tIFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZVdp
bi5jcHA6Mjk4MzQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFnSW1hZ2VDR1dpbi5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIkRyYWdJbWFnZS5oIgorCisjaW5jbHVkZSAiQ2FjaGVkSW1hZ2Uu
aCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbWFnZS5oIgorI2lu
Y2x1ZGUgIlJldGFpblB0ci5oIgorCisjaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NvcmVHcmFwaGlj
cy5oPgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0lu
dFNpemUgZHJhZ0ltYWdlU2l6ZShEcmFnSW1hZ2VSZWYgaW1hZ2UpCit7CisgICAgaWYgKCFpbWFn
ZSkKKyAgICAgICAgcmV0dXJuIEludFNpemUoKTsKKyAgICBCSVRNQVAgYjsKKyAgICBHZXRPYmpl
Y3QoaW1hZ2UsIHNpemVvZihCSVRNQVApLCAmYik7CisgICAgcmV0dXJuIEludFNpemUoYi5ibVdp
ZHRoLCBiLmJtSGVpZ2h0KTsKK30KKwordm9pZCBkZWxldGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVm
IGltYWdlKQoreworICAgIGlmIChpbWFnZSkKKyAgICAgICAgOjpEZWxldGVPYmplY3QoaW1hZ2Up
OworfQorCitIQklUTUFQIGFsbG9jSW1hZ2UoSERDIGRjLCBJbnRTaXplIHNpemUsIENHQ29udGV4
dFJlZiAqdGFyZ2V0UmVmKQoreworICAgIEhCSVRNQVAgaGJtcDsKKyAgICBCSVRNQVBJTkZPIGJt
cEluZm8gPSB7MH07CisgICAgYm1wSW5mby5ibWlIZWFkZXIuYmlTaXplID0gc2l6ZW9mKEJJVE1B
UElORk9IRUFERVIpOworICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpV2lkdGggPSBzaXplLndpZHRo
KCk7CisgICAgYm1wSW5mby5ibWlIZWFkZXIuYmlIZWlnaHQgPSBzaXplLmhlaWdodCgpOworICAg
IGJtcEluZm8uYm1pSGVhZGVyLmJpUGxhbmVzID0gMTsKKyAgICBibXBJbmZvLmJtaUhlYWRlci5i
aUJpdENvdW50ID0gMzI7CisgICAgYm1wSW5mby5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiA9IEJJ
X1JHQjsKKyAgICBMUFZPSUQgYml0czsKKyAgICBoYm1wID0gQ3JlYXRlRElCU2VjdGlvbihkYywg
JmJtcEluZm8sIERJQl9SR0JfQ09MT1JTLCAmYml0cywgMCwgMCk7CisKKyAgICBpZiAoIXRhcmdl
dFJlZikKKyAgICAgICAgcmV0dXJuIGhibXA7CisKKyAgICBDR0NvbG9yU3BhY2VSZWYgZGV2aWNl
UkdCID0gQ0dDb2xvclNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7CisgICAgQ0dDb250ZXh0UmVmIGJp
dG1hcENvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUoYml0cywgYm1wSW5mby5ibWlIZWFk
ZXIuYmlXaWR0aCwgYm1wSW5mby5ibWlIZWFkZXIuYmlIZWlnaHQsIDgsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wSW5mby5ibWlIZWFk
ZXIuYmlXaWR0aCAqIDQsIGRldmljZVJHQiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBr
Q0dJbWFnZUFscGhhTm9uZVNraXBGaXJzdCk7CisgICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZp
Y2VSR0IpOworICAgIGlmICghYml0bWFwQ29udGV4dCkgeworICAgICAgICBEZWxldGVPYmplY3Qo
aGJtcCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgICp0YXJnZXRSZWYgPSBiaXRt
YXBDb250ZXh0OworICAgIHJldHVybiBoYm1wOworfQorCitzdGF0aWMgQ0dDb250ZXh0UmVmIGNy
ZWF0ZUNnQ29udGV4dEZyb21CaXRtYXAoSEJJVE1BUCBiaXRtYXApCit7CisgICAgQklUTUFQIGlu
Zm87CisgICAgR2V0T2JqZWN0KGJpdG1hcCwgc2l6ZW9mKGluZm8pLCAmaW5mbyk7CisgICAgQVNT
RVJUKGluZm8uYm1CaXRzUGl4ZWwgPT0gMzIpOworCisgICAgQ0dDb2xvclNwYWNlUmVmIGRldmlj
ZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOworICAgIENHQ29udGV4dFJlZiBi
aXRtYXBDb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGluZm8uYm1CaXRzLCBpbmZvLmJt
V2lkdGgsIGluZm8uYm1IZWlnaHQsIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJHQiwga0NH
Qml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhhTm9uZVNraXBGaXJzdCk7Cisg
ICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOworICAgIHJldHVybiBiaXRtYXBDb250
ZXh0OworfQorCitEcmFnSW1hZ2VSZWYgc2NhbGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVmIGltYWdl
LCBGbG9hdFNpemUgc2NhbGUpCit7CisgICAgLy8gRklYTUU6IGR1ZSB0byB0aGUgd2F5IGRyYWcg
aW1hZ2VzIGFyZSBkb25lIG9uIHdpbmRvd3Mgd2UgbmVlZCAKKyAgICAvLyB0byBwcmVwcm9jZXNz
IHRoZSBhbHBoYSBjaGFubmVsIDxyZGFyOi8vcHJvYmxlbS81MDE1OTQ2PgorCisgICAgaWYgKCFp
bWFnZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgQ0dDb250ZXh0UmVmIHRhcmdldENvbnRleHQ7
CisgICAgQ0dDb250ZXh0UmVmIHNyY0NvbnRleHQ7CisgICAgQ0dJbWFnZVJlZiBzcmNJbWFnZTsK
KyAgICBJbnRTaXplIHNyY1NpemUgPSBkcmFnSW1hZ2VTaXplKGltYWdlKTsKKyAgICBJbnRTaXpl
IGRzdFNpemUoKGludCkoc3JjU2l6ZS53aWR0aCgpICogc2NhbGUud2lkdGgoKSksIChpbnQpKHNy
Y1NpemUuaGVpZ2h0KCkgKiBzY2FsZS5oZWlnaHQoKSkpOworICAgIEhCSVRNQVAgaGJtcCA9IDA7
CisgICAgSERDIGRjID0gR2V0REMoMCk7CisgICAgSERDIGRzdERDID0gQ3JlYXRlQ29tcGF0aWJs
ZURDKGRjKTsKKyAgICBpZiAoIWRzdERDKQorICAgICAgICBnb3RvIGV4aXQ7CisKKyAgICBoYm1w
ID0gYWxsb2NJbWFnZShkc3REQywgZHN0U2l6ZSwgJnRhcmdldENvbnRleHQpOworICAgIGlmICgh
aGJtcCkKKyAgICAgICAgZ290byBleGl0OworCisgICAgc3JjQ29udGV4dCA9IGNyZWF0ZUNnQ29u
dGV4dEZyb21CaXRtYXAoaW1hZ2UpOworICAgIHNyY0ltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3Jl
YXRlSW1hZ2Uoc3JjQ29udGV4dCk7CisgICAgQ0dSZWN0IHJlY3Q7CisgICAgcmVjdC5vcmlnaW4u
eCA9IDA7CisgICAgcmVjdC5vcmlnaW4ueSA9IDA7CisgICAgcmVjdC5zaXplID0gZHN0U2l6ZTsK
KyAgICBDR0NvbnRleHREcmF3SW1hZ2UodGFyZ2V0Q29udGV4dCwgcmVjdCwgc3JjSW1hZ2UpOwor
ICAgIENHSW1hZ2VSZWxlYXNlKHNyY0ltYWdlKTsKKyAgICBDR0NvbnRleHRSZWxlYXNlKHNyY0Nv
bnRleHQpOworICAgIENHQ29udGV4dFJlbGVhc2UodGFyZ2V0Q29udGV4dCk7CisgICAgOjpEZWxl
dGVPYmplY3QoaW1hZ2UpOworICAgIGltYWdlID0gMDsKKworZXhpdDoKKyAgICBpZiAoIWhibXAp
CisgICAgICAgIGhibXAgPSBpbWFnZTsKKyAgICBpZiAoZHN0REMpCisgICAgICAgIERlbGV0ZURD
KGRzdERDKTsKKyAgICBSZWxlYXNlREMoMCwgZGMpOworICAgIHJldHVybiBoYm1wOworfQorICAg
IAorRHJhZ0ltYWdlUmVmIGRpc3NvbHZlRHJhZ0ltYWdlVG9GcmFjdGlvbihEcmFnSW1hZ2VSZWYg
aW1hZ2UsIGZsb2F0KQoreworICAgIC8vV2UgZG9uJ3QgZG8gdGhpcyBvbiB3aW5kb3dzIGFzIHRo
ZSBkcmFnaW1hZ2UgaXMgYmxlbmRlZCBieSB0aGUgT1MKKyAgICByZXR1cm4gaW1hZ2U7Cit9Cisg
ICAgICAgIAorRHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZyb21JbWFnZShJbWFnZSogaW1n
KQoreyAgICAKKyAgICBIQklUTUFQIGhibXAgPSAwOworICAgIEhEQyBkYyA9IEdldERDKDApOwor
ICAgIEhEQyB3b3JraW5nREMgPSBDcmVhdGVDb21wYXRpYmxlREMoZGMpOworICAgIENHQ29udGV4
dFJlZiBkcmF3Q29udGV4dCA9IDA7CisgICAgaWYgKCF3b3JraW5nREMpCisgICAgICAgIGdvdG8g
ZXhpdDsKKworICAgIGhibXAgPSBhbGxvY0ltYWdlKHdvcmtpbmdEQywgaW1nLT5zaXplKCksICZk
cmF3Q29udGV4dCk7CisKKyAgICBpZiAoIWhibXApCisgICAgICAgIGdvdG8gZXhpdDsKKworICAg
IGlmICghZHJhd0NvbnRleHQpIHsKKyAgICAgICAgOjpEZWxldGVPYmplY3QoaGJtcCk7CisgICAg
ICAgIGhibXAgPSAwOworICAgIH0KKworICAgIENHSW1hZ2VSZWYgc3JjSW1hZ2UgPSBpbWctPmdl
dENHSW1hZ2VSZWYoKTsKKyAgICBDR1JlY3QgcmVjdDsKKyAgICByZWN0LnNpemUgPSBpbWctPnNp
emUoKTsKKyAgICByZWN0Lm9yaWdpbi54ID0gMDsKKyAgICByZWN0Lm9yaWdpbi55ID0gLXJlY3Qu
c2l6ZS5oZWlnaHQ7CisgICAgc3RhdGljIGNvbnN0IENHRmxvYXQgd2hpdGUgW10gPSB7MS4wLCAx
LjAsIDEuMCwgMS4wfTsKKyAgICBDR0NvbnRleHRTY2FsZUNUTShkcmF3Q29udGV4dCwgMSwgLTEp
OworICAgIENHQ29udGV4dFNldEZpbGxDb2xvcihkcmF3Q29udGV4dCwgd2hpdGUpOworICAgIENH
Q29udGV4dEZpbGxSZWN0KGRyYXdDb250ZXh0LCByZWN0KTsKKyAgICBDR0NvbnRleHRTZXRCbGVu
ZE1vZGUoZHJhd0NvbnRleHQsIGtDR0JsZW5kTW9kZU5vcm1hbCk7CisgICAgQ0dDb250ZXh0RHJh
d0ltYWdlKGRyYXdDb250ZXh0LCByZWN0LCBzcmNJbWFnZSk7CisgICAgQ0dDb250ZXh0UmVsZWFz
ZShkcmF3Q29udGV4dCk7CisKK2V4aXQ6CisgICAgaWYgKHdvcmtpbmdEQykKKyAgICAgICAgRGVs
ZXRlREMod29ya2luZ0RDKTsKKyAgICBSZWxlYXNlREMoMCwgZGMpOworICAgIHJldHVybiBoYm1w
OworfQorICAgIAorRHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUljb25Gb3JDYWNoZWRJbWFn
ZShDYWNoZWRJbWFnZSopCit7CisgICAgLy9GSVhNRTogUHJvdmlkZSBpY29uIGZvciBpbWFnZSB0
eXBlIDxyZGFyOi8vcHJvYmxlbS81MDE1OTQ5PgorICAgIHJldHVybiAwOyAgICAgCit9CisgICAg
Cit9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFnSW1hZ2VDR1dpbi5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdlQ0dXaW4uY3BwCShyZXZpc2lv
biAyOTcyNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luL0RyYWdJbWFnZUNHV2luLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBw
bGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNywgMjAw
OCBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCkBAIC0zNywyMSArMzcsNiBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLUlu
dFNpemUgZHJhZ0ltYWdlU2l6ZShEcmFnSW1hZ2VSZWYgaW1hZ2UpCi17Ci0gICAgaWYgKCFpbWFn
ZSkKLSAgICAgICAgcmV0dXJuIEludFNpemUoKTsKLSAgICBCSVRNQVAgYjsKLSAgICBHZXRPYmpl
Y3QoaW1hZ2UsIHNpemVvZihCSVRNQVApLCAmYik7Ci0gICAgcmV0dXJuIEludFNpemUoYi5ibVdp
ZHRoLCBiLmJtSGVpZ2h0KTsKLX0KLQotdm9pZCBkZWxldGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVm
IGltYWdlKQotewotICAgIGlmIChpbWFnZSkKLSAgICAgICAgOjpEZWxldGVPYmplY3QoaW1hZ2Up
OwotfQotCiBIQklUTUFQIGFsbG9jSW1hZ2UoSERDIGRjLCBJbnRTaXplIHNpemUsIENHQ29udGV4
dFJlZiAqdGFyZ2V0UmVmKQogewogICAgIEhCSVRNQVAgaGJtcDsKQEAgLTEwNiw3ICs5MSw3IEBA
IERyYWdJbWFnZVJlZiBzY2FsZURyYWdJbWFnZShEcmFnSW1hZ2VSZWYKICAgICBDR0NvbnRleHRS
ZWYgc3JjQ29udGV4dDsKICAgICBDR0ltYWdlUmVmIHNyY0ltYWdlOwogICAgIEludFNpemUgc3Jj
U2l6ZSA9IGRyYWdJbWFnZVNpemUoaW1hZ2UpOwotICAgIEludFNpemUgZHN0U2l6ZSgoaW50KShz
cmNTaXplLndpZHRoKCkgKiBzY2FsZS53aWR0aCgpKSwgKGludCkoc3JjU2l6ZS5oZWlnaHQoKSAq
IHNjYWxlLmhlaWdodCgpKSk7CisgICAgSW50U2l6ZSBkc3RTaXplKHN0YXRpY19jYXN0PGludD4o
c3JjU2l6ZS53aWR0aCgpICogc2NhbGUud2lkdGgoKSksIHN0YXRpY19jYXN0PGludD4oc3JjU2l6
ZS5oZWlnaHQoKSAqIHNjYWxlLmhlaWdodCgpKSk7CiAgICAgSEJJVE1BUCBoYm1wID0gMDsKICAg
ICBIREMgZGMgPSBHZXREQygwKTsKICAgICBIREMgZHN0REMgPSBDcmVhdGVDb21wYXRpYmxlREMo
ZGMpOwpAQCAtMTM5LDE0ICsxMjQsOCBAQCBleGl0OgogICAgIHJldHVybiBoYm1wOwogfQogICAg
IAotRHJhZ0ltYWdlUmVmIGRpc3NvbHZlRHJhZ0ltYWdlVG9GcmFjdGlvbihEcmFnSW1hZ2VSZWYg
aW1hZ2UsIGZsb2F0KQotewotICAgIC8vV2UgZG9uJ3QgZG8gdGhpcyBvbiB3aW5kb3dzIGFzIHRo
ZSBkcmFnaW1hZ2UgaXMgYmxlbmRlZCBieSB0aGUgT1MKLSAgICByZXR1cm4gaW1hZ2U7Ci19Ci0g
ICAgICAgIAogRHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZyb21JbWFnZShJbWFnZSogaW1n
KQoteyAgICAKK3sKICAgICBIQklUTUFQIGhibXAgPSAwOwogICAgIEhEQyBkYyA9IEdldERDKDAp
OwogICAgIEhEQyB3b3JraW5nREMgPSBDcmVhdGVDb21wYXRpYmxlREMoZGMpOwpAQCAtMTg0LDEw
ICsxNjMsNCBAQCBleGl0OgogICAgIHJldHVybiBoYm1wOwogfQogICAgIAotRHJhZ0ltYWdlUmVm
IGNyZWF0ZURyYWdJbWFnZUljb25Gb3JDYWNoZWRJbWFnZShDYWNoZWRJbWFnZSopCi17Ci0gICAg
Ly9GSVhNRTogUHJvdmlkZSBpY29uIGZvciBpbWFnZSB0eXBlIDxyZGFyOi8vcHJvYmxlbS81MDE1
OTQ5PgotICAgIHJldHVybiAwOyAgICAgCi19Ci0gICAgCiB9CkluZGV4OiBXZWJDb3JlL3BsYXRm
b3JtL3dpbi9EcmFnSW1hZ2VDYWlyb1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0
Zm9ybS93aW4vRHJhZ0ltYWdlQ2Fpcm9XaW4uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9w
bGF0Zm9ybS93aW4vRHJhZ0ltYWdlQ2Fpcm9XaW4uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsx
LDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJEcmFnSW1h
Z2UuaCIKKworI2luY2x1ZGUgIkNhY2hlZEltYWdlLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250
ZXh0LmgiCisjaW5jbHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgor
I2luY2x1ZGUgIlJldGFpblB0ci5oIgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKK0RyYWdJbWFnZVJlZiBzY2FsZURyYWdJbWFnZShEcmFnSW1hZ2VSZWYg
aW1hZ2UsIEZsb2F0U2l6ZSBzY2FsZSkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworCisgICAg
cmV0dXJuIGltYWdlOworfQorICAgIAorRHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZyb21J
bWFnZShJbWFnZSogaW1nKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisKKyAgICBEcmFnSW1h
Z2VSZWYgdGVtcDsKKyAgICByZXR1cm4gdGVtcDsKK30KKyAgICAKK30KSW5kZXg6IFdlYkNvcmUv
cGxhdGZvcm0vd2luL0RyYWdJbWFnZVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0
Zm9ybS93aW4vRHJhZ0ltYWdlV2luLmNwcAkocmV2aXNpb24gMzAwNDgpCisrKyBXZWJDb3JlL3Bs
YXRmb3JtL3dpbi9EcmFnSW1hZ2VXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBA
QAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTMxLDggKzMxLDYg
QEAKICNpbmNsdWRlICJJbWFnZS5oIgogI2luY2x1ZGUgIlJldGFpblB0ci5oIgogCi0jaW5jbHVk
ZSA8Q29yZUdyYXBoaWNzL0NvcmVHcmFwaGljcy5oPgotCiAjaW5jbHVkZSA8d2luZG93cy5oPgog
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CkBAIC01MiwxMzggKzUwLDEyIEBAIHZvaWQgZGVsZXRlRHJh
Z0ltYWdlKERyYWdJbWFnZVJlZiBpbWFnZSkKICAgICAgICAgOjpEZWxldGVPYmplY3QoaW1hZ2Up
OwogfQogCi1IQklUTUFQIGFsbG9jSW1hZ2UoSERDIGRjLCBJbnRTaXplIHNpemUsIENHQ29udGV4
dFJlZiAqdGFyZ2V0UmVmKQotewotICAgIEhCSVRNQVAgaGJtcDsKLSAgICBCSVRNQVBJTkZPIGJt
cEluZm8gPSB7MH07Ci0gICAgYm1wSW5mby5ibWlIZWFkZXIuYmlTaXplID0gc2l6ZW9mKEJJVE1B
UElORk9IRUFERVIpOwotICAgIGJtcEluZm8uYm1pSGVhZGVyLmJpV2lkdGggPSBzaXplLndpZHRo
KCk7Ci0gICAgYm1wSW5mby5ibWlIZWFkZXIuYmlIZWlnaHQgPSBzaXplLmhlaWdodCgpOwotICAg
IGJtcEluZm8uYm1pSGVhZGVyLmJpUGxhbmVzID0gMTsKLSAgICBibXBJbmZvLmJtaUhlYWRlci5i
aUJpdENvdW50ID0gMzI7Ci0gICAgYm1wSW5mby5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiA9IEJJ
X1JHQjsKLSAgICBMUFZPSUQgYml0czsKLSAgICBoYm1wID0gQ3JlYXRlRElCU2VjdGlvbihkYywg
JmJtcEluZm8sIERJQl9SR0JfQ09MT1JTLCAmYml0cywgMCwgMCk7Ci0KLSAgICBpZiAoIXRhcmdl
dFJlZikKLSAgICAgICAgcmV0dXJuIGhibXA7Ci0KLSAgICBDR0NvbG9yU3BhY2VSZWYgZGV2aWNl
UkdCID0gQ0dDb2xvclNwYWNlQ3JlYXRlRGV2aWNlUkdCKCk7Ci0gICAgQ0dDb250ZXh0UmVmIGJp
dG1hcENvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUoYml0cywgYm1wSW5mby5ibWlIZWFk
ZXIuYmlXaWR0aCwgYm1wSW5mby5ibWlIZWFkZXIuYmlIZWlnaHQsIDgsCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wSW5mby5ibWlIZWFk
ZXIuYmlXaWR0aCAqIDQsIGRldmljZVJHQiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBr
Q0dJbWFnZUFscGhhTm9uZVNraXBGaXJzdCk7Ci0gICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZp
Y2VSR0IpOwotICAgIGlmICghYml0bWFwQ29udGV4dCkgewotICAgICAgICBEZWxldGVPYmplY3Qo
aGJtcCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgICp0YXJnZXRSZWYgPSBiaXRt
YXBDb250ZXh0OwotICAgIHJldHVybiBoYm1wOwotfQotCi1zdGF0aWMgQ0dDb250ZXh0UmVmIGNy
ZWF0ZUNnQ29udGV4dEZyb21CaXRtYXAoSEJJVE1BUCBiaXRtYXApCi17Ci0gICAgQklUTUFQIGlu
Zm87Ci0gICAgR2V0T2JqZWN0KGJpdG1hcCwgc2l6ZW9mKGluZm8pLCAmaW5mbyk7Ci0gICAgQVNT
RVJUKGluZm8uYm1CaXRzUGl4ZWwgPT0gMzIpOwotCi0gICAgQ0dDb2xvclNwYWNlUmVmIGRldmlj
ZVJHQiA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOwotICAgIENHQ29udGV4dFJlZiBi
aXRtYXBDb250ZXh0ID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlKGluZm8uYm1CaXRzLCBpbmZvLmJt
V2lkdGgsIGluZm8uYm1IZWlnaHQsIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5ibVdpZHRoQnl0ZXMsIGRldmljZVJHQiwga0NH
Qml0bWFwQnl0ZU9yZGVyMzJMaXR0bGUgfCBrQ0dJbWFnZUFscGhhTm9uZVNraXBGaXJzdCk7Ci0g
ICAgQ0dDb2xvclNwYWNlUmVsZWFzZShkZXZpY2VSR0IpOwotICAgIHJldHVybiBiaXRtYXBDb250
ZXh0OwotfQotCi1EcmFnSW1hZ2VSZWYgc2NhbGVEcmFnSW1hZ2UoRHJhZ0ltYWdlUmVmIGltYWdl
LCBGbG9hdFNpemUgc2NhbGUpCi17Ci0gICAgLy8gRklYTUU6IGR1ZSB0byB0aGUgd2F5IGRyYWcg
aW1hZ2VzIGFyZSBkb25lIG9uIHdpbmRvd3Mgd2UgbmVlZCAKLSAgICAvLyB0byBwcmVwcm9jZXNz
IHRoZSBhbHBoYSBjaGFubmVsIDxyZGFyOi8vcHJvYmxlbS81MDE1OTQ2PgotCi0gICAgaWYgKCFp
bWFnZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgQ0dDb250ZXh0UmVmIHRhcmdldENvbnRleHQ7
Ci0gICAgQ0dDb250ZXh0UmVmIHNyY0NvbnRleHQ7Ci0gICAgQ0dJbWFnZVJlZiBzcmNJbWFnZTsK
LSAgICBJbnRTaXplIHNyY1NpemUgPSBkcmFnSW1hZ2VTaXplKGltYWdlKTsKLSAgICBJbnRTaXpl
IGRzdFNpemUoKGludCkoc3JjU2l6ZS53aWR0aCgpICogc2NhbGUud2lkdGgoKSksIChpbnQpKHNy
Y1NpemUuaGVpZ2h0KCkgKiBzY2FsZS5oZWlnaHQoKSkpOwotICAgIEhCSVRNQVAgaGJtcCA9IDA7
Ci0gICAgSERDIGRjID0gR2V0REMoMCk7Ci0gICAgSERDIGRzdERDID0gQ3JlYXRlQ29tcGF0aWJs
ZURDKGRjKTsKLSAgICBpZiAoIWRzdERDKQotICAgICAgICBnb3RvIGV4aXQ7Ci0KLSAgICBoYm1w
ID0gYWxsb2NJbWFnZShkc3REQywgZHN0U2l6ZSwgJnRhcmdldENvbnRleHQpOwotICAgIGlmICgh
aGJtcCkKLSAgICAgICAgZ290byBleGl0OwotCi0gICAgc3JjQ29udGV4dCA9IGNyZWF0ZUNnQ29u
dGV4dEZyb21CaXRtYXAoaW1hZ2UpOwotICAgIHNyY0ltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3Jl
YXRlSW1hZ2Uoc3JjQ29udGV4dCk7Ci0gICAgQ0dSZWN0IHJlY3Q7Ci0gICAgcmVjdC5vcmlnaW4u
eCA9IDA7Ci0gICAgcmVjdC5vcmlnaW4ueSA9IDA7Ci0gICAgcmVjdC5zaXplID0gZHN0U2l6ZTsK
LSAgICBDR0NvbnRleHREcmF3SW1hZ2UodGFyZ2V0Q29udGV4dCwgcmVjdCwgc3JjSW1hZ2UpOwot
ICAgIENHSW1hZ2VSZWxlYXNlKHNyY0ltYWdlKTsKLSAgICBDR0NvbnRleHRSZWxlYXNlKHNyY0Nv
bnRleHQpOwotICAgIENHQ29udGV4dFJlbGVhc2UodGFyZ2V0Q29udGV4dCk7Ci0gICAgOjpEZWxl
dGVPYmplY3QoaW1hZ2UpOwotICAgIGltYWdlID0gMDsKLQotZXhpdDoKLSAgICBpZiAoIWhibXAp
Ci0gICAgICAgIGhibXAgPSBpbWFnZTsKLSAgICBpZiAoZHN0REMpCi0gICAgICAgIERlbGV0ZURD
KGRzdERDKTsKLSAgICBSZWxlYXNlREMoMCwgZGMpOwotICAgIHJldHVybiBoYm1wOwotfQotICAg
IAogRHJhZ0ltYWdlUmVmIGRpc3NvbHZlRHJhZ0ltYWdlVG9GcmFjdGlvbihEcmFnSW1hZ2VSZWYg
aW1hZ2UsIGZsb2F0KQogewogICAgIC8vV2UgZG9uJ3QgZG8gdGhpcyBvbiB3aW5kb3dzIGFzIHRo
ZSBkcmFnaW1hZ2UgaXMgYmxlbmRlZCBieSB0aGUgT1MKICAgICByZXR1cm4gaW1hZ2U7CiB9CiAg
ICAgICAgIAotRHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZyb21JbWFnZShJbWFnZSogaW1n
KQoteyAgICAKLSAgICBIQklUTUFQIGhibXAgPSAwOwotICAgIEhEQyBkYyA9IEdldERDKDApOwot
ICAgIEhEQyB3b3JraW5nREMgPSBDcmVhdGVDb21wYXRpYmxlREMoZGMpOwotICAgIENHQ29udGV4
dFJlZiBkcmF3Q29udGV4dCA9IDA7Ci0gICAgaWYgKCF3b3JraW5nREMpCi0gICAgICAgIGdvdG8g
ZXhpdDsKLQotICAgIGhibXAgPSBhbGxvY0ltYWdlKHdvcmtpbmdEQywgaW1nLT5zaXplKCksICZk
cmF3Q29udGV4dCk7Ci0KLSAgICBpZiAoIWhibXApCi0gICAgICAgIGdvdG8gZXhpdDsKLQotICAg
IGlmICghZHJhd0NvbnRleHQpIHsKLSAgICAgICAgOjpEZWxldGVPYmplY3QoaGJtcCk7Ci0gICAg
ICAgIGhibXAgPSAwOwotICAgIH0KLQotICAgIENHSW1hZ2VSZWYgc3JjSW1hZ2UgPSBpbWctPmdl
dENHSW1hZ2VSZWYoKTsKLSAgICBDR1JlY3QgcmVjdDsKLSAgICByZWN0LnNpemUgPSBpbWctPnNp
emUoKTsKLSAgICByZWN0Lm9yaWdpbi54ID0gMDsKLSAgICByZWN0Lm9yaWdpbi55ID0gLXJlY3Qu
c2l6ZS5oZWlnaHQ7Ci0gICAgc3RhdGljIGNvbnN0IENHRmxvYXQgd2hpdGUgW10gPSB7MS4wLCAx
LjAsIDEuMCwgMS4wfTsKLSAgICBDR0NvbnRleHRTY2FsZUNUTShkcmF3Q29udGV4dCwgMSwgLTEp
OwotICAgIENHQ29udGV4dFNldEZpbGxDb2xvcihkcmF3Q29udGV4dCwgd2hpdGUpOwotICAgIENH
Q29udGV4dEZpbGxSZWN0KGRyYXdDb250ZXh0LCByZWN0KTsKLSAgICBDR0NvbnRleHRTZXRCbGVu
ZE1vZGUoZHJhd0NvbnRleHQsIGtDR0JsZW5kTW9kZU5vcm1hbCk7Ci0gICAgQ0dDb250ZXh0RHJh
d0ltYWdlKGRyYXdDb250ZXh0LCByZWN0LCBzcmNJbWFnZSk7Ci0gICAgQ0dDb250ZXh0UmVsZWFz
ZShkcmF3Q29udGV4dCk7Ci0KLWV4aXQ6Ci0gICAgaWYgKHdvcmtpbmdEQykKLSAgICAgICAgRGVs
ZXRlREMod29ya2luZ0RDKTsKLSAgICBSZWxlYXNlREMoMCwgZGMpOwotICAgIHJldHVybiBoYm1w
OwotfQotICAgIAogRHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUljb25Gb3JDYWNoZWRJbWFn
ZShDYWNoZWRJbWFnZSopCiB7CiAgICAgLy9GSVhNRTogUHJvdmlkZSBpY29uIGZvciBpbWFnZSB0
eXBlIDxyZGFyOi8vcHJvYmxlbS81MDE1OTQ5Pgo=
</data>

          </attachment>
      

    </bug>

</bugzilla>