<?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>37287</bug_id>
          
          <creation_ts>2010-04-08 13:49:34 -0700</creation_ts>
          <short_desc>Rename Wince file to WinCE</short_desc>
          <delta_ts>2010-09-18 13:46:32 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Web Template Framework</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>Other</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P5</priority>
          <bug_severity>Trivial</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Patrick R. Gansterer">paroga</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>cjerdonek</cc>
    
    <cc>commit-queue</cc>
    
    <cc>eric</cc>
    
    <cc>skyul</cc>
    
    <cc>tkent</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>210362</commentid>
    <comment_count>0</comment_count>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-04-08 13:49:34 -0700</bug_when>
    <thetext>See patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>210363</commentid>
    <comment_count>1</comment_count>
      <attachid>52892</attachid>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-04-08 13:51:35 -0700</bug_when>
    <thetext>Created attachment 52892
The patch - part 1 (JSC/WTF)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>210364</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-04-08 13:53:44 -0700</bug_when>
    <thetext>Attachment 52892 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
Last 3072 characters of output:
 is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
JavaScriptCore/wtf/unicode/wince/UnicodeWinCE.h:72:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
JavaScriptCore/wtf/unicode/wince/UnicodeWinCE.h:211:  One space before end of line comments  [whitespace/comments] [5]
JavaScriptCore/wtf/unicode/wince/UnicodeWinCE.h:213:  One space before end of line comments  [whitespace/comments] [5]
JavaScriptCore/wtf/unicode/wince/UnicodeWinCE.cpp:97:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
JavaScriptCore/wtf/unicode/wince/UnicodeWinCE.cpp:121:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
WARNING: Skipping non-existent file: JavaScriptCore/wtf/unicode/wince/UnicodeWince.h
JavaScriptCore/wtf/wince/FastMallocWinCE.h:22:  #ifndef header guard has wrong style, please use: FastMallocWinCE_h  [build/header_guard] [5]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:29:  Alphabetical sorting problem.  [build/include_order] [4]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:34:  n_elements is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:34:  element_size is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:41:  n_elements is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:41:  element_size is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:83:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:86:  One space before end of line comments  [whitespace/comments] [5]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:87:  One space before end of line comments  [whitespace/comments] [5]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:88:  One space before end of line comments  [whitespace/comments] [5]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:89:  One space before end of line comments  [whitespace/comments] [5]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:90:  One space before end of line comments  [whitespace/comments] [5]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:91:  One space before end of line comments  [whitespace/comments] [5]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:92:  One space before end of line comments  [whitespace/comments] [5]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:93:  One space before end of line comments  [whitespace/comments] [5]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:156:  One space before end of line comments  [whitespace/comments] [5]
WARNING: Skipping non-existent file: JavaScriptCore/wtf/unicode/wince/UnicodeWince.cpp
Total errors found: 25 in 5 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>210432</commentid>
    <comment_count>3</comment_count>
      <attachid>52902</attachid>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-04-08 15:26:50 -0700</bug_when>
    <thetext>Created attachment 52902
The patch - part 2 (WebCore)

It is very big, but there are no real changes in this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>210435</commentid>
    <comment_count>4</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-04-08 15:29:09 -0700</bug_when>
    <thetext>Attachment 52902 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
Last 3072 characters of output:
/null] [5]
WebCore/platform/graphics/wince/GraphicsContextWinCE.cpp:1922:  Use 0 instead of NULL.  [readability/null] [5]
WARNING: Skipping non-existent file: WebCore/storage/wince/LocalStorageThreadWince.cpp
WebCore/platform/wince/MIMETypeRegistryWinCE.cpp:31:  Alphabetical sorting problem.  [build/include_order] [4]
WebCore/platform/wince/MIMETypeRegistryWinCE.cpp:61:  Should have a space between // and comment  [whitespace/comments] [4]
WebCore/platform/wince/PasteboardWinCE.cpp:239:  An else statement can be removed when the prior &quot;if&quot; concludes with a return, break, continue or goto statement.  [readability/control_flow] [4]
WebCore/platform/wince/PasteboardWinCE.cpp:251:  An else statement can be removed when the prior &quot;if&quot; concludes with a return, break, continue or goto statement.  [readability/control_flow] [4]
WebCore/platform/wince/PasteboardWinCE.cpp:273:  cf_html is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
WARNING: Skipping non-existent file: WebCore/platform/wince/SearchPopupMenuWince.cpp
WARNING: Skipping non-existent file: WebCore/storage/wince/DatabaseThreadWince.cpp
WARNING: Skipping non-existent file: WebCore/platform/wince/SharedTimerWince.cpp
WebCore/storage/wince/DatabaseThreadWinCE.h:32:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
WebCore/platform/wince/FileSystemWinCE.cpp:38:  Alphabetical sorting problem.  [build/include_order] [4]
WebCore/platform/wince/FileSystemWinCE.cpp:39:  Alphabetical sorting problem.  [build/include_order] [4]
WebCore/storage/wince/LocalStorageThreadWinCE.h:33:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
WARNING: Skipping non-existent file: WebCore/platform/text/wince/TextBoundariesWince.cpp
WebCore/rendering/RenderThemeWinCE..h:24:  #ifndef header guard has wrong style, please use: RenderThemeWinCE__h  [build/header_guard] [5]
WebCore/rendering/RenderThemeWinCE..h:35:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
WARNING: Skipping non-existent file: WebCore/storage/wince/DatabaseThreadWince.h
WARNING: Skipping non-existent file: WebCore/platform/graphics/wince/PlatformPathWince.cpp
WARNING: Skipping non-existent file: WebCore/platform/graphics/wince/FontCacheWince.cpp
WARNING: Skipping non-existent file: WebCore/platform/graphics/wince/WinceGraphicsExtras.h
WARNING: Skipping non-existent file: WebCore/platform/wince/DragImageWince.cpp
WARNING: Skipping non-existent file: WebCore/platform/graphics/wince/MediaPlayerPrivateWince.h
WARNING: Skipping non-existent file: WebCore/loader/icon/wince/IconDatabaseWince.cpp
WARNING: Skipping non-existent file: WebCore/platform/wince/FileChooserWince.cpp
WebCore/platform/graphics/wince/GlyphPageTreeNodeWinCE.cpp:44:  An else if statement should be written as an if statement when the prior &quot;if&quot; concludes with a return, break, continue or goto statement.  [readability/control_flow] [4]
WARNING: Skipping non-existent file: WebCore/platform/wince/CursorWince.cpp
Total errors found: 54 in 38 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>210448</commentid>
    <comment_count>5</comment_count>
      <attachid>52907</attachid>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-04-08 15:55:19 -0700</bug_when>
    <thetext>Created attachment 52907
The patch - part 1 (JSC/WTF)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>210451</commentid>
    <comment_count>6</comment_count>
      <attachid>52908</attachid>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-04-08 15:56:29 -0700</bug_when>
    <thetext>Created attachment 52908
The patch - part 2 (WebCore)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>210455</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-04-08 15:59:44 -0700</bug_when>
    <thetext>Attachment 52907 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
Last 3072 characters of output:
 is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
JavaScriptCore/wtf/unicode/wince/UnicodeWinCE.h:72:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
JavaScriptCore/wtf/unicode/wince/UnicodeWinCE.h:211:  One space before end of line comments  [whitespace/comments] [5]
JavaScriptCore/wtf/unicode/wince/UnicodeWinCE.h:213:  One space before end of line comments  [whitespace/comments] [5]
JavaScriptCore/wtf/unicode/wince/UnicodeWinCE.cpp:97:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
JavaScriptCore/wtf/unicode/wince/UnicodeWinCE.cpp:121:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
WARNING: Skipping non-existent file: JavaScriptCore/wtf/unicode/wince/UnicodeWince.h
JavaScriptCore/wtf/wince/FastMallocWinCE.h:22:  #ifndef header guard has wrong style, please use: FastMallocWinCE_h  [build/header_guard] [5]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:29:  Alphabetical sorting problem.  [build/include_order] [4]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:34:  n_elements is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:34:  element_size is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:41:  n_elements is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:41:  element_size is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:83:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:86:  One space before end of line comments  [whitespace/comments] [5]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:87:  One space before end of line comments  [whitespace/comments] [5]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:88:  One space before end of line comments  [whitespace/comments] [5]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:89:  One space before end of line comments  [whitespace/comments] [5]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:90:  One space before end of line comments  [whitespace/comments] [5]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:91:  One space before end of line comments  [whitespace/comments] [5]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:92:  One space before end of line comments  [whitespace/comments] [5]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:93:  One space before end of line comments  [whitespace/comments] [5]
JavaScriptCore/wtf/wince/FastMallocWinCE.h:156:  One space before end of line comments  [whitespace/comments] [5]
WARNING: Skipping non-existent file: JavaScriptCore/wtf/unicode/wince/UnicodeWince.cpp
Total errors found: 25 in 5 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>210458</commentid>
    <comment_count>8</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-04-08 16:03:50 -0700</bug_when>
    <thetext>Attachment 52908 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
Last 3072 characters of output:
/null] [5]
WebCore/platform/graphics/wince/GraphicsContextWinCE.cpp:1922:  Use 0 instead of NULL.  [readability/null] [5]
WARNING: Skipping non-existent file: WebCore/storage/wince/LocalStorageThreadWince.cpp
WebCore/platform/wince/MIMETypeRegistryWinCE.cpp:31:  Alphabetical sorting problem.  [build/include_order] [4]
WebCore/platform/wince/MIMETypeRegistryWinCE.cpp:61:  Should have a space between // and comment  [whitespace/comments] [4]
WebCore/platform/wince/PasteboardWinCE.cpp:239:  An else statement can be removed when the prior &quot;if&quot; concludes with a return, break, continue or goto statement.  [readability/control_flow] [4]
WebCore/platform/wince/PasteboardWinCE.cpp:251:  An else statement can be removed when the prior &quot;if&quot; concludes with a return, break, continue or goto statement.  [readability/control_flow] [4]
WebCore/platform/wince/PasteboardWinCE.cpp:273:  cf_html is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
WARNING: Skipping non-existent file: WebCore/platform/wince/SearchPopupMenuWince.cpp
WARNING: Skipping non-existent file: WebCore/storage/wince/DatabaseThreadWince.cpp
WARNING: Skipping non-existent file: WebCore/platform/wince/SharedTimerWince.cpp
WebCore/storage/wince/DatabaseThreadWinCE.h:32:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
WebCore/platform/wince/FileSystemWinCE.cpp:38:  Alphabetical sorting problem.  [build/include_order] [4]
WebCore/platform/wince/FileSystemWinCE.cpp:39:  Alphabetical sorting problem.  [build/include_order] [4]
WebCore/storage/wince/LocalStorageThreadWinCE.h:33:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
WARNING: Skipping non-existent file: WebCore/platform/text/wince/TextBoundariesWince.cpp
WebCore/rendering/RenderThemeWinCE..h:24:  #ifndef header guard has wrong style, please use: RenderThemeWinCE__h  [build/header_guard] [5]
WebCore/rendering/RenderThemeWinCE..h:35:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
WARNING: Skipping non-existent file: WebCore/storage/wince/DatabaseThreadWince.h
WARNING: Skipping non-existent file: WebCore/platform/graphics/wince/PlatformPathWince.cpp
WARNING: Skipping non-existent file: WebCore/platform/graphics/wince/FontCacheWince.cpp
WARNING: Skipping non-existent file: WebCore/platform/graphics/wince/WinceGraphicsExtras.h
WARNING: Skipping non-existent file: WebCore/platform/wince/DragImageWince.cpp
WARNING: Skipping non-existent file: WebCore/platform/graphics/wince/MediaPlayerPrivateWince.h
WARNING: Skipping non-existent file: WebCore/loader/icon/wince/IconDatabaseWince.cpp
WARNING: Skipping non-existent file: WebCore/platform/wince/FileChooserWince.cpp
WebCore/platform/graphics/wince/GlyphPageTreeNodeWinCE.cpp:44:  An else if statement should be written as an if statement when the prior &quot;if&quot; concludes with a return, break, continue or goto statement.  [readability/control_flow] [4]
WARNING: Skipping non-existent file: WebCore/platform/wince/CursorWince.cpp
Total errors found: 54 in 38 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>210896</commentid>
    <comment_count>9</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-04-09 13:41:45 -0700</bug_when>
    <thetext>Style explosion!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>210897</commentid>
    <comment_count>10</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-04-09 13:42:39 -0700</bug_when>
    <thetext>We have a script for doing these types of renames called &quot;do-webcore-rename&quot;.   We might consider using that instead.  Basically we queue up a bunch of renames and do them at once at some later date.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>211123</commentid>
    <comment_count>11</comment_count>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-04-10 01:37:02 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; Style explosion!
What to do against it? Are style patches welcome?

(In reply to comment #10)
&gt; We have a script for doing these types of renames called &quot;do-webcore-rename&quot;.  
&gt; We might consider using that instead.  Basically we queue up a bunch of renames
&gt; and do them at once at some later date.

What should I do now? Post a patch for &quot;do-webcore-rename&quot;?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>211351</commentid>
    <comment_count>12</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-04-11 05:27:16 -0700</bug_when>
    <thetext>Attachment 52907 did not build on win:
Build output: http://webkit-commit-queue.appspot.com/results/1574389</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>211372</commentid>
    <comment_count>13</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-11 10:57:35 -0700</bug_when>
    <thetext>&gt; Build output: http://webkit-commit-queue.appspot.com/results/1574389

Sorry, looks like a bug in the win-ews.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>211373</commentid>
    <comment_count>14</comment_count>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-04-11 11:00:04 -0700</bug_when>
    <thetext>(In reply to comment #13)
&gt; &gt; Build output: http://webkit-commit-queue.appspot.com/results/1574389
&gt; 
&gt; Sorry, looks like a bug in the win-ews.
I think this a a general problem with subversion on windows, because windows has no case sensitive filesystem. :-/</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>211376</commentid>
    <comment_count>15</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-11 11:06:02 -0700</bug_when>
    <thetext>&gt; I think this a a general problem with subversion on windows, because windows
&gt; has no case sensitive filesystem. :-/

Does that mean this patch is going to cause a problem for all our windows developers?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>211377</commentid>
    <comment_count>16</comment_count>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-04-11 11:11:09 -0700</bug_when>
    <thetext>(In reply to comment #15)
&gt; &gt; I think this a a general problem with subversion on windows, because windows
&gt; &gt; has no case sensitive filesystem. :-/
&gt; 
&gt; Does that mean this patch is going to cause a problem for all our windows
&gt; developers?
They won&apos;t be able to apply it on their working copy. If someone  apply it on a case sensitive filesystem an commit it, there won&apos;t be a problem when checking out on windows.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>236778</commentid>
    <comment_count>17</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-06-11 04:46:39 -0700</bug_when>
    <thetext>(In reply to comment #16)
&gt; (In reply to comment #15)
&gt; &gt; &gt; I think this a a general problem with subversion on windows, because windows
&gt; &gt; &gt; has no case sensitive filesystem. :-/
&gt; &gt; 
&gt; &gt; Does that mean this patch is going to cause a problem for all our windows
&gt; &gt; developers?
&gt; They won&apos;t be able to apply it on their working copy. If someone  apply it on a case sensitive filesystem an commit it, there won&apos;t be a problem when checking out on windows.

Is it same for Mac?
How about git pull/merge on Windows or Mac?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>237286</commentid>
    <comment_count>18</comment_count>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-06-12 05:40:06 -0700</bug_when>
    <thetext>(In reply to comment #17)
&gt; Is it same for Mac?
If Mac as a case-sensitve filesystem ther is no problem.

&gt; How about git pull/merge on Windows or Mac?
It should work with git.
The problem is caused by the &quot;.svn&quot; folder where the &quot;metadata&quot; for each file is stored. Because renaming is a &quot;delete and add&quot; action in SVN it needs a file to store the delete action and one for the add action, but Windows can&apos;t store them because of its caseinsensitve filesystem.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>242891</commentid>
    <comment_count>19</comment_count>
      <attachid>52907</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-06-25 01:43:49 -0700</bug_when>
    <thetext>Comment on attachment 52907
The patch - part 1 (JSC/WTF)

Rejecting patch 52907 from commit-queue.

Failed to run &quot;[u&apos;/Users/eseidel/Projects/CommitQueue/WebKitTools/Scripts/svn-apply&apos;, u&apos;--reviewer&apos;, u&apos;Darin Adler&apos;, u&apos;--force&apos;]&quot; exit_code: 2
Parsed 11 diffs from patch file(s).
cp: JavaScriptCore/wtf/unicode/wince/UnicodeWinCE.cpp and JavaScriptCore/wtf/unicode/wince/UnicodeWince.cpp are identical (not copied).
Failed to copy JavaScriptCore/wtf/unicode/wince/UnicodeWince.cpp JavaScriptCore/wtf/unicode/wince/UnicodeWinCE.cpp. at /Users/eseidel/Projects/CommitQueue/WebKitTools/Scripts/svn-apply line 416.

Full output: http://webkit-commit-queue.appspot.com/results/3295777</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>242896</commentid>
    <comment_count>20</comment_count>
      <attachid>52908</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-06-25 02:08:02 -0700</bug_when>
    <thetext>Comment on attachment 52908
The patch - part 2 (WebCore)

Rejecting patch 52908 from commit-queue.

Failed to run &quot;[u&apos;/Users/eseidel/Projects/CommitQueue/WebKitTools/Scripts/svn-apply&apos;, u&apos;--reviewer&apos;, u&apos;Darin Adler&apos;, u&apos;--force&apos;]&quot; exit_code: 2
Parsed 100 diffs from patch file(s).
cp: WebCore/loader/icon/wince/IconDatabaseWinCE.cpp and WebCore/loader/icon/wince/IconDatabaseWince.cpp are identical (not copied).
Failed to copy WebCore/loader/icon/wince/IconDatabaseWince.cpp WebCore/loader/icon/wince/IconDatabaseWinCE.cpp. at /Users/eseidel/Projects/CommitQueue/WebKitTools/Scripts/svn-apply line 416.

Full output: http://webkit-commit-queue.appspot.com/results/3280747</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>242897</commentid>
    <comment_count>21</comment_count>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-06-25 02:12:15 -0700</bug_when>
    <thetext>I will update the patch to match the current trunk.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>242898</commentid>
    <comment_count>22</comment_count>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-06-25 02:15:51 -0700</bug_when>
    <thetext>(In reply to comment #21)
&gt; I will update the patch to match the current trunk.
Sorry, seams to be a problem of the commit queue, not of the patch?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>242900</commentid>
    <comment_count>23</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-06-25 02:24:23 -0700</bug_when>
    <thetext>The commit queue is running on a case insensitive (but case preserving) file system (HFS+).  It can&apos;t land case-renaming patches, no.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>243359</commentid>
    <comment_count>24</comment_count>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-06-26 04:18:17 -0700</bug_when>
    <thetext>(In reply to comment #23)
&gt; The commit queue is running on a case insensitive (but case preserving) file system (HFS+).  It can&apos;t land case-renaming patches, no.
Who will commit the patch? I&apos;m not a committer by now. ;-)
I can split every patch into a &quot;remove&quot; and a &quot;add again&quot; part, if we can land it with the commit queue then.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>243526</commentid>
    <comment_count>25</comment_count>
    <who name="Kwang Yul Seo">skyul</who>
    <bug_when>2010-06-27 17:15:32 -0700</bug_when>
    <thetext>I don&apos;t see much value in renaming Wince. It becomes very hard to track commit logs once WinCE files are removed and committed again.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>243648</commentid>
    <comment_count>26</comment_count>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-06-28 03:56:54 -0700</bug_when>
    <thetext>(In reply to comment #25)
&gt; I don&apos;t see much value in renaming Wince.
It was requested by Darin at bug 32169.

&gt; It becomes very hard to track commit logs once WinCE files are removed and committed again.
If we do a svn-add from a previous revision, this shouldn&apos;t be no problem.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>281171</commentid>
    <comment_count>27</comment_count>
      <attachid>52907</attachid>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-09-18 13:45:22 -0700</bug_when>
    <thetext>Comment on attachment 52907
The patch - part 1 (JSC/WTF)

Clearing flags on attachment: 52907

Manually committed r67788: &lt;http://trac.webkit.org/changeset/67788&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>281172</commentid>
    <comment_count>28</comment_count>
      <attachid>52908</attachid>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-09-18 13:45:46 -0700</bug_when>
    <thetext>Comment on attachment 52908
The patch - part 2 (WebCore)

Clearing flags on attachment: 52908

Manually committed r67788: &lt;http://trac.webkit.org/changeset/67788&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>281174</commentid>
    <comment_count>29</comment_count>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-09-18 13:46:32 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>52892</attachid>
            <date>2010-04-08 13:51:35 -0700</date>
            <delta_ts>2010-04-08 15:55:19 -0700</delta_ts>
            <desc>The patch - part 1 (JSC/WTF)</desc>
            <filename>bug-37287-JSC.patch</filename>
            <type>text/plain</type>
            <size>45558</size>
            <attacher name="Patrick R. Gansterer">paroga</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDU3Mjg5KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTggQEAKKzIwMTAtMDQtMDggIFBhdHJpY2sg
R2Fuc3RlcmVyICA8cGFyb2dhQHBhcm9nYS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgUmVuYW1lIFdpbmNlIGZpbGVzIHRvIFdpbkNFLgorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9WFhYWFgKKworICAg
ICAgICAqIHd0Zi91bmljb2RlL1VuaWNvZGUuaDoKKyAgICAgICAgKiB3dGYvdW5pY29kZS93aW5j
ZS9Vbmljb2RlV2luQ0UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiB3dGYvdW5pY29kZS93aW5jZS9V
bmljb2RlV2luQ0UuaDogQWRkZWQuCisgICAgICAgICogd3RmL3VuaWNvZGUvd2luY2UvVW5pY29k
ZVdpbmNlLmNwcDogUmVtb3ZlZC4KKyAgICAgICAgKiB3dGYvdW5pY29kZS93aW5jZS9Vbmljb2Rl
V2luY2UuaDogUmVtb3ZlZC4KKyAgICAgICAgKiB3dGYvd2luY2UvRmFzdE1hbGxvY1dpbkNFLmg6
IEFkZGVkLgorICAgICAgICAqIHd0Zi93aW5jZS9GYXN0TWFsbG9jV2luY2UuaDogUmVtb3ZlZC4K
KwogMjAxMC0wNC0wOCAgS3dhbmcgWXVsIFNlbyAgPHNreXVsQGNvbXBhbnkxMDAubmV0PgogCiAg
ICAgICAgIFJldmlld2VkIGJ5IFNpbW9uIEhhdXNtYW5uLgpJbmRleDogSmF2YVNjcmlwdENvcmUv
d3RmL3VuaWNvZGUvVW5pY29kZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3d0Zi91
bmljb2RlL1VuaWNvZGUuaAkocmV2aXNpb24gNTcyODkpCisrKyBKYXZhU2NyaXB0Q29yZS93dGYv
dW5pY29kZS9Vbmljb2RlLmgJKHdvcmtpbmcgY29weSkKQEAgLTMyLDcgKzMyLDcgQEAKICNlbGlm
IFVTRShHTElCX1VOSUNPREUpCiAjaW5jbHVkZSA8d3RmL3VuaWNvZGUvZ2xpYi9Vbmljb2RlR0xp
Yi5oPgogI2VsaWYgVVNFKFdJTkNFX1VOSUNPREUpCi0jaW5jbHVkZSA8d3RmL3VuaWNvZGUvd2lu
Y2UvVW5pY29kZVdpbmNlLmg+CisjaW5jbHVkZSA8d3RmL3VuaWNvZGUvd2luY2UvVW5pY29kZVdp
bkNFLmg+CiAjZWxzZQogI2Vycm9yICJVbmtub3duIFVuaWNvZGUgaW1wbGVtZW50YXRpb24iCiAj
ZW5kaWYKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi91bmljb2RlL3dpbmNlL1VuaWNvZGVXaW5D
RS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvd3RmL3VuaWNvZGUvd2luY2UvVW5p
Y29kZVdpbkNFLmNwcAkocmV2aXNpb24gNTcyODkpCShmcm9tIEphdmFTY3JpcHRDb3JlL3d0Zi91
bmljb2RlL3dpbmNlL1VuaWNvZGVXaW5jZS5jcHA6NTcyODkpCisrKyBKYXZhU2NyaXB0Q29yZS93
dGYvdW5pY29kZS93aW5jZS9Vbmljb2RlV2luQ0UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsMTc2IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwNiBHZW9yZ2UgU3RhaWtvcyA8c3Rh
aWtvc0BrZGUub3JnPgorICogIENvcHlyaWdodCAoQykgMjAwNiBBbGV4ZXkgUHJvc2t1cnlha292
IDxhcEBueXBvcC5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxl
LCBJbmMuCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl
ZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg
KiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi
ZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
CisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4g
IElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMu
LCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAt
MTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJVbmljb2Rl
V2luY2UuaCIKKworI2luY2x1ZGUgPHdjaGFyLmg+CisKK25hbWVzcGFjZSBXVEYgeworbmFtZXNw
YWNlIFVuaWNvZGUgeworCit3Y2hhcl90IHRvTG93ZXIod2NoYXJfdCBjKQoreworICAgIHJldHVy
biB0b3dsb3dlcihjKTsKK30KKword2NoYXJfdCB0b1VwcGVyKHdjaGFyX3QgYykKK3sKKyAgICBy
ZXR1cm4gdG93dXBwZXIoYyk7Cit9CisKK3djaGFyX3QgZm9sZENhc2Uod2NoYXJfdCBjKQorewor
ICAgIHJldHVybiB0b3dsb3dlcihjKTsKK30KKworYm9vbCBpc1ByaW50YWJsZUNoYXIod2NoYXJf
dCBjKQoreworICAgIHJldHVybiAhIWlzd3ByaW50KGMpOworfQorCitib29sIGlzU3BhY2Uod2No
YXJfdCBjKQoreworICAgIHJldHVybiAhIWlzd3NwYWNlKGMpOworfQorCitib29sIGlzTGV0dGVy
KHdjaGFyX3QgYykKK3sKKyAgICByZXR1cm4gISFpc3dhbHBoYShjKTsKK30KKworYm9vbCBpc1Vw
cGVyKHdjaGFyX3QgYykKK3sKKyAgICByZXR1cm4gISFpc3d1cHBlcihjKTsKK30KKworYm9vbCBp
c0xvd2VyKHdjaGFyX3QgYykKK3sKKyAgICByZXR1cm4gISFpc3dsb3dlcihjKTsKK30KKworYm9v
bCBpc0RpZ2l0KHdjaGFyX3QgYykKK3sKKyAgICByZXR1cm4gISFpc3dkaWdpdChjKTsKK30KKwor
Ym9vbCBpc1B1bmN0KHdjaGFyX3QgYykKK3sKKyAgICByZXR1cm4gISFpc3dwdW5jdChjKTsKK30K
KworaW50IHRvTG93ZXIod2NoYXJfdCogcmVzdWx0LCBpbnQgcmVzdWx0TGVuZ3RoLCBjb25zdCB3
Y2hhcl90KiBzb3VyY2UsIGludCBzb3VyY2VMZW5ndGgsIGJvb2wqIGlzRXJyb3IpCit7CisgICAg
Y29uc3QgVUNoYXIqIHNvdXJjZUl0ZXJhdG9yID0gc291cmNlOworICAgIGNvbnN0IFVDaGFyKiBz
b3VyY2VFbmQgPSBzb3VyY2UgKyBzb3VyY2VMZW5ndGg7CisgICAgVUNoYXIqIHJlc3VsdEl0ZXJh
dG9yID0gcmVzdWx0OworICAgIFVDaGFyKiByZXN1bHRFbmQgPSByZXN1bHQgKyByZXN1bHRMZW5n
dGg7CisKKyAgICBpbnQgcmVtYWluaW5nQ2hhcmFjdGVycyA9IDA7CisgICAgaWYgKHNvdXJjZUxl
bmd0aCA8PSByZXN1bHRMZW5ndGgpCisgICAgICAgIHdoaWxlIChzb3VyY2VJdGVyYXRvciA8IHNv
dXJjZUVuZCkKKyAgICAgICAgICAgICpyZXN1bHRJdGVyYXRvcisrID0gdG93bG93ZXIoKnNvdXJj
ZUl0ZXJhdG9yKyspOworICAgIGVsc2UKKyAgICAgICAgd2hpbGUgKHJlc3VsdEl0ZXJhdG9yIDwg
cmVzdWx0RW5kKQorICAgICAgICAgICAgKnJlc3VsdEl0ZXJhdG9yKysgPSB0b3dsb3dlcigqc291
cmNlSXRlcmF0b3IrKyk7CisKKyAgICBpZiAoc291cmNlSXRlcmF0b3IgPCBzb3VyY2VFbmQpCisg
ICAgICAgIHJlbWFpbmluZ0NoYXJhY3RlcnMgKz0gc291cmNlRW5kIC0gc291cmNlSXRlcmF0b3I7
CisgICAgKmlzRXJyb3IgPSAocmVtYWluaW5nQ2hhcmFjdGVycyAhPSAwKTsKKyAgICBpZiAocmVz
dWx0SXRlcmF0b3IgPCByZXN1bHRFbmQpCisgICAgICAgICpyZXN1bHRJdGVyYXRvciA9IDA7CisK
KyAgICByZXR1cm4gKHJlc3VsdEl0ZXJhdG9yIC0gcmVzdWx0KSArIHJlbWFpbmluZ0NoYXJhY3Rl
cnM7Cit9CisKK2ludCB0b1VwcGVyKHdjaGFyX3QqIHJlc3VsdCwgaW50IHJlc3VsdExlbmd0aCwg
Y29uc3Qgd2NoYXJfdCogc291cmNlLCBpbnQgc291cmNlTGVuZ3RoLCBib29sKiBpc0Vycm9yKQor
eworICAgIGNvbnN0IFVDaGFyKiBzb3VyY2VJdGVyYXRvciA9IHNvdXJjZTsKKyAgICBjb25zdCBV
Q2hhciogc291cmNlRW5kID0gc291cmNlICsgc291cmNlTGVuZ3RoOworICAgIFVDaGFyKiByZXN1
bHRJdGVyYXRvciA9IHJlc3VsdDsKKyAgICBVQ2hhciogcmVzdWx0RW5kID0gcmVzdWx0ICsgcmVz
dWx0TGVuZ3RoOworCisgICAgaW50IHJlbWFpbmluZ0NoYXJhY3RlcnMgPSAwOworICAgIGlmIChz
b3VyY2VMZW5ndGggPD0gcmVzdWx0TGVuZ3RoKQorICAgICAgICB3aGlsZSAoc291cmNlSXRlcmF0
b3IgPCBzb3VyY2VFbmQpCisgICAgICAgICAgICAqcmVzdWx0SXRlcmF0b3IrKyA9IHRvd3VwcGVy
KCpzb3VyY2VJdGVyYXRvcisrKTsKKyAgICBlbHNlCisgICAgICAgIHdoaWxlIChyZXN1bHRJdGVy
YXRvciA8IHJlc3VsdEVuZCkKKyAgICAgICAgICAgICpyZXN1bHRJdGVyYXRvcisrID0gdG93dXBw
ZXIoKnNvdXJjZUl0ZXJhdG9yKyspOworCisgICAgaWYgKHNvdXJjZUl0ZXJhdG9yIDwgc291cmNl
RW5kKQorICAgICAgICByZW1haW5pbmdDaGFyYWN0ZXJzICs9IHNvdXJjZUVuZCAtIHNvdXJjZUl0
ZXJhdG9yOworICAgICppc0Vycm9yID0gKHJlbWFpbmluZ0NoYXJhY3RlcnMgIT0gMCk7CisgICAg
aWYgKHJlc3VsdEl0ZXJhdG9yIDwgcmVzdWx0RW5kKQorICAgICAgICAqcmVzdWx0SXRlcmF0b3Ig
PSAwOworCisgICAgcmV0dXJuIChyZXN1bHRJdGVyYXRvciAtIHJlc3VsdCkgKyByZW1haW5pbmdD
aGFyYWN0ZXJzOworfQorCitpbnQgZm9sZENhc2Uod2NoYXJfdCogcmVzdWx0LCBpbnQgcmVzdWx0
TGVuZ3RoLCBjb25zdCB3Y2hhcl90KiBzb3VyY2UsIGludCBzb3VyY2VMZW5ndGgsIGJvb2wqIGlz
RXJyb3IpCit7CisgICAgKmlzRXJyb3IgPSBmYWxzZTsKKyAgICBpZiAocmVzdWx0TGVuZ3RoIDwg
c291cmNlTGVuZ3RoKSB7CisgICAgICAgICppc0Vycm9yID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJu
IHNvdXJjZUxlbmd0aDsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VMZW5n
dGg7ICsraSkKKyAgICAgICAgcmVzdWx0W2ldID0gZm9sZENhc2Uoc291cmNlW2ldKTsKKyAgICBy
ZXR1cm4gc291cmNlTGVuZ3RoOworfQorCit3Y2hhcl90IHRvVGl0bGVDYXNlKHdjaGFyX3QgYykK
K3sKKyAgICByZXR1cm4gdG93dXBwZXIoYyk7Cit9CisKK0RpcmVjdGlvbiBkaXJlY3Rpb24oVUNo
YXIzMiBjKQoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxEaXJlY3Rpb24+KFVuaWNvZGVDRTo6
ZGlyZWN0aW9uKGMpKTsKK30KKworQ2hhckNhdGVnb3J5IGNhdGVnb3J5KHVuc2lnbmVkIGludCBj
KQoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxDaGFyQ2F0ZWdvcnk+KFRPX01BU0soKF9faW50
OCkgVW5pY29kZUNFOjpjYXRlZ29yeShjKSkpOworfQorCitEZWNvbXBvc2l0aW9uVHlwZSBkZWNv
bXBvc2l0aW9uVHlwZShVQ2hhcjMyIGMpCit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PERlY29t
cG9zaXRpb25UeXBlPihVbmljb2RlQ0U6OmRlY29tcG9zaXRpb25UeXBlKGMpKTsKK30KKwordW5z
aWduZWQgY2hhciBjb21iaW5pbmdDbGFzcyhVQ2hhcjMyIGMpCit7CisgICAgcmV0dXJuIFVuaWNv
ZGVDRTo6Y29tYmluaW5nQ2xhc3MoYyk7Cit9CisKK3djaGFyX3QgbWlycm9yZWRDaGFyKFVDaGFy
MzIgYykKK3sKKyAgICByZXR1cm4gVW5pY29kZUNFOjptaXJyb3JlZENoYXIoYyk7Cit9CisKK2lu
dCBkaWdpdFZhbHVlKHdjaGFyX3QgYykKK3sKKyAgICByZXR1cm4gVW5pY29kZUNFOjpkaWdpdFZh
bHVlKGMpOworfQorCit9IC8vIG5hbWVzcGFjZSBVbmljb2RlCit9IC8vIG5hbWVzcGFjZSBXVEYK
SW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi91bmljb2RlL3dpbmNlL1VuaWNvZGVXaW5DRS5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvd3RmL3VuaWNvZGUvd2luY2UvVW5pY29kZVdp
bkNFLmNwcAkocmV2aXNpb24gNTcyODkpCisrKyBKYXZhU2NyaXB0Q29yZS93dGYvdW5pY29kZS93
aW5jZS9Vbmljb2RlV2luQ0UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMCw3ICsyMCw3IEBACiAg
Ki8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlVuaWNvZGVXaW5jZS5oIgorI2lu
Y2x1ZGUgIlVuaWNvZGVXaW5DRS5oIgogCiAjaW5jbHVkZSA8d2NoYXIuaD4KIApJbmRleDogSmF2
YVNjcmlwdENvcmUvd3RmL3VuaWNvZGUvd2luY2UvVW5pY29kZVdpbkNFLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gSmF2YVNjcmlwdENvcmUvd3RmL3VuaWNvZGUvd2luY2UvVW5pY29kZVdpbkNFLmgJKHJldmlz
aW9uIDU3Mjg5KQkoZnJvbSBKYXZhU2NyaXB0Q29yZS93dGYvdW5pY29kZS93aW5jZS9Vbmljb2Rl
V2luY2UuaDo1NzI4OSkKKysrIEphdmFTY3JpcHRDb3JlL3d0Zi91bmljb2RlL3dpbmNlL1VuaWNv
ZGVXaW5DRS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogIENvcHly
aWdodCAoQykgMjAwNiBHZW9yZ2UgU3RhaWtvcyA8c3RhaWtvc0BrZGUub3JnPgorICogIENvcHly
aWdodCAoQykgMjAwNiBBbGV4ZXkgUHJvc2t1cnlha292IDxhcEBueXBvcC5jb20+CisgKiAgQ29w
eXJpZ2h0IChDKSAyMDA3IEFwcGxlIENvbXB1dGVyLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICog
IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3Ig
KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5
IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAg
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm
b3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0
aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUg
dG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBT
dHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoK
KyAqLworCisjaWZuZGVmIFVOSUNPREVfV0lOQ0VfSAorI2RlZmluZSBVTklDT0RFX1dJTkNFX0gK
KworI2luY2x1ZGUgImNlX3VuaWNvZGUuaCIKKworI2RlZmluZSBUT19NQVNLKHgpICgxIDw8ICh4
KSkKKworLy8gc29tZSBkZWZpbmVzIGZyb20gSUNVIG5lZWRlZCBvbmUgb3IgdHdvIHBsYWNlcwor
CisjZGVmaW5lIFUxNl9JU19MRUFEKGMpICgoKGMpICYgMHhmZmZmZmMwMCkgPT0gMHhkODAwKQor
I2RlZmluZSBVMTZfSVNfVFJBSUwoYykgKCgoYykgJiAweGZmZmZmYzAwKSA9PSAweGRjMDApCisj
ZGVmaW5lIFUxNl9TVVJST0dBVEVfT0ZGU0VUICgoMHhkODAwIDw8IDEwVUwpICsgMHhkYzAwIC0g
MHgxMDAwMCkKKyNkZWZpbmUgVTE2X0dFVF9TVVBQTEVNRU5UQVJZKGxlYWQsIHRyYWlsKSBcCisg
ICAgKCgoVUNoYXIzMikobGVhZCkgPDwgMTBVTCkgKyAoVUNoYXIzMikodHJhaWwpIC0gVTE2X1NV
UlJPR0FURV9PRkZTRVQpCisKKyNkZWZpbmUgVTE2X0xFQUQoc3VwcGxlbWVudGFyeSkgKFVDaGFy
KSgoKHN1cHBsZW1lbnRhcnkpID4+IDEwKSArIDB4ZDdjMCkKKyNkZWZpbmUgVTE2X1RSQUlMKHN1
cHBsZW1lbnRhcnkpIChVQ2hhcikoKChzdXBwbGVtZW50YXJ5KSAmIDB4M2ZmKSB8IDB4ZGMwMCkK
KworI2RlZmluZSBVX0lTX1NVUlJPR0FURShjKSAoKChjKSAmIDB4ZmZmZmY4MDApID09IDB4ZDgw
MCkKKyNkZWZpbmUgVTE2X0lTX1NVUlJPR0FURShjKSBVX0lTX1NVUlJPR0FURShjKQorI2RlZmlu
ZSBVMTZfSVNfU1VSUk9HQVRFX0xFQUQoYykgKCgoYykgJiAweDQwMCkgPT0gMCkKKworI2RlZmlu
ZSBVMTZfTkVYVChzLCBpLCBsZW5ndGgsIGMpIHsgXAorICAgIChjKT0ocylbKGkpKytdOyBcCisg
ICAgaWYgKFUxNl9JU19MRUFEKGMpKSB7IFwKKyAgICAgICAgdWludDE2X3QgX19jMjsgXAorICAg
ICAgICBpZiAoKGkpIDwgKGxlbmd0aCkgJiYgVTE2X0lTX1RSQUlMKF9fYzIgPSAocylbKGkpXSkp
IHsgXAorICAgICAgICAgICAgKysoaSk7IFwKKyAgICAgICAgICAgIChjKSA9IFUxNl9HRVRfU1VQ
UExFTUVOVEFSWSgoYyksIF9fYzIpOyBcCisgICAgICAgIH0gXAorICAgIH0gXAorfQorCisjZGVm
aW5lIFUxNl9QUkVWKHMsIHN0YXJ0LCBpLCBjKSB7IFwKKyAgICAoYyk9KHMpWy0tKGkpXTsgXAor
ICAgIGlmIChVMTZfSVNfVFJBSUwoYykpIHsgXAorICAgICAgICB1aW50MTZfdCBfX2MyOyBcCisg
ICAgICAgIGlmICgoaSkgPiAoc3RhcnQpICYmIFUxNl9JU19MRUFEKF9fYzIgPSAocylbKGkpIC0g
MV0pKSB7IFwKKyAgICAgICAgICAgIC0tKGkpOyBcCisgICAgICAgICAgICAoYykgPSBVMTZfR0VU
X1NVUFBMRU1FTlRBUlkoX19jMiwgKGMpKTsgXAorICAgICAgICB9IFwKKyAgICB9IFwKK30KKwor
I2RlZmluZSBVMTZfSVNfU0lOR0xFKGMpICFVX0lTX1NVUlJPR0FURShjKQorCituYW1lc3BhY2Ug
V1RGIHsKKworICAgIG5hbWVzcGFjZSBVbmljb2RlIHsKKworICAgICAgICBlbnVtIERpcmVjdGlv
biB7CisgICAgICAgICAgICBMZWZ0VG9SaWdodCA9IFVuaWNvZGVDRTo6VV9MRUZUX1RPX1JJR0hU
LAorICAgICAgICAgICAgUmlnaHRUb0xlZnQgPSBVbmljb2RlQ0U6OlVfUklHSFRfVE9fTEVGVCwK
KyAgICAgICAgICAgIEV1cm9wZWFuTnVtYmVyID0gVW5pY29kZUNFOjpVX0VVUk9QRUFOX05VTUJF
UiwKKyAgICAgICAgICAgIEV1cm9wZWFuTnVtYmVyU2VwYXJhdG9yID0gVW5pY29kZUNFOjpVX0VV
Uk9QRUFOX05VTUJFUl9TRVBBUkFUT1IsCisgICAgICAgICAgICBFdXJvcGVhbk51bWJlclRlcm1p
bmF0b3IgPSBVbmljb2RlQ0U6OlVfRVVST1BFQU5fTlVNQkVSX1RFUk1JTkFUT1IsCisgICAgICAg
ICAgICBBcmFiaWNOdW1iZXIgPSBVbmljb2RlQ0U6OlVfQVJBQklDX05VTUJFUiwKKyAgICAgICAg
ICAgIENvbW1vbk51bWJlclNlcGFyYXRvciA9IFVuaWNvZGVDRTo6VV9DT01NT05fTlVNQkVSX1NF
UEFSQVRPUiwKKyAgICAgICAgICAgIEJsb2NrU2VwYXJhdG9yID0gVW5pY29kZUNFOjpVX0JMT0NL
X1NFUEFSQVRPUiwKKyAgICAgICAgICAgIFNlZ21lbnRTZXBhcmF0b3IgPSBVbmljb2RlQ0U6OlVf
U0VHTUVOVF9TRVBBUkFUT1IsCisgICAgICAgICAgICBXaGl0ZVNwYWNlTmV1dHJhbCA9IFVuaWNv
ZGVDRTo6VV9XSElURV9TUEFDRV9ORVVUUkFMLAorICAgICAgICAgICAgT3RoZXJOZXV0cmFsID0g
VW5pY29kZUNFOjpVX09USEVSX05FVVRSQUwsCisgICAgICAgICAgICBMZWZ0VG9SaWdodEVtYmVk
ZGluZyA9IFVuaWNvZGVDRTo6VV9MRUZUX1RPX1JJR0hUX0VNQkVERElORywKKyAgICAgICAgICAg
IExlZnRUb1JpZ2h0T3ZlcnJpZGUgPSBVbmljb2RlQ0U6OlVfTEVGVF9UT19SSUdIVF9PVkVSUklE
RSwKKyAgICAgICAgICAgIFJpZ2h0VG9MZWZ0QXJhYmljID0gVW5pY29kZUNFOjpVX1JJR0hUX1RP
X0xFRlRfQVJBQklDLAorICAgICAgICAgICAgUmlnaHRUb0xlZnRFbWJlZGRpbmcgPSBVbmljb2Rl
Q0U6OlVfUklHSFRfVE9fTEVGVF9FTUJFRERJTkcsCisgICAgICAgICAgICBSaWdodFRvTGVmdE92
ZXJyaWRlID0gVW5pY29kZUNFOjpVX1JJR0hUX1RPX0xFRlRfT1ZFUlJJREUsCisgICAgICAgICAg
ICBQb3BEaXJlY3Rpb25hbEZvcm1hdCA9IFVuaWNvZGVDRTo6VV9QT1BfRElSRUNUSU9OQUxfRk9S
TUFULAorICAgICAgICAgICAgTm9uU3BhY2luZ01hcmsgPSBVbmljb2RlQ0U6OlVfRElSX05PTl9T
UEFDSU5HX01BUkssCisgICAgICAgICAgICBCb3VuZGFyeU5ldXRyYWwgPSBVbmljb2RlQ0U6OlVf
Qk9VTkRBUllfTkVVVFJBTAorICAgICAgICB9OworCisgICAgICAgIGVudW0gRGVjb21wb3NpdGlv
blR5cGUgeworICAgICAgICAgIERlY29tcG9zaXRpb25Ob25lID0gVW5pY29kZUNFOjpVX0RUX05P
TkUsCisgICAgICAgICAgRGVjb21wb3NpdGlvbkNhbm9uaWNhbCA9IFVuaWNvZGVDRTo6VV9EVF9D
QU5PTklDQUwsCisgICAgICAgICAgRGVjb21wb3NpdGlvbkNvbXBhdCA9IFVuaWNvZGVDRTo6VV9E
VF9DT01QQVQsCisgICAgICAgICAgRGVjb21wb3NpdGlvbkNpcmNsZSA9IFVuaWNvZGVDRTo6VV9E
VF9DSVJDTEUsCisgICAgICAgICAgRGVjb21wb3NpdGlvbkZpbmFsID0gVW5pY29kZUNFOjpVX0RU
X0ZJTkFMLAorICAgICAgICAgIERlY29tcG9zaXRpb25Gb250ID0gVW5pY29kZUNFOjpVX0RUX0ZP
TlQsCisgICAgICAgICAgRGVjb21wb3NpdGlvbkZyYWN0aW9uID0gVW5pY29kZUNFOjpVX0RUX0ZS
QUNUSU9OLAorICAgICAgICAgIERlY29tcG9zaXRpb25Jbml0aWFsID0gVW5pY29kZUNFOjpVX0RU
X0lOSVRJQUwsCisgICAgICAgICAgRGVjb21wb3NpdGlvbklzb2xhdGVkID0gVW5pY29kZUNFOjpV
X0RUX0lTT0xBVEVELAorICAgICAgICAgIERlY29tcG9zaXRpb25NZWRpYWwgPSBVbmljb2RlQ0U6
OlVfRFRfTUVESUFMLAorICAgICAgICAgIERlY29tcG9zaXRpb25OYXJyb3cgPSBVbmljb2RlQ0U6
OlVfRFRfTkFSUk9XLAorICAgICAgICAgIERlY29tcG9zaXRpb25Ob0JyZWFrID0gVW5pY29kZUNF
OjpVX0RUX05PQlJFQUssCisgICAgICAgICAgRGVjb21wb3NpdGlvblNtYWxsID0gVW5pY29kZUNF
OjpVX0RUX1NNQUxMLAorICAgICAgICAgIERlY29tcG9zaXRpb25TcXVhcmUgPSBVbmljb2RlQ0U6
OlVfRFRfU1FVQVJFLAorICAgICAgICAgIERlY29tcG9zaXRpb25TdWIgPSBVbmljb2RlQ0U6OlVf
RFRfU1VCLAorICAgICAgICAgIERlY29tcG9zaXRpb25TdXBlciA9IFVuaWNvZGVDRTo6VV9EVF9T
VVBFUiwKKyAgICAgICAgICBEZWNvbXBvc2l0aW9uVmVydGljYWwgPSBVbmljb2RlQ0U6OlVfRFRf
VkVSVElDQUwsCisgICAgICAgICAgRGVjb21wb3NpdGlvbldpZGUgPSBVbmljb2RlQ0U6OlVfRFRf
V0lERSwKKyAgICAgICAgfTsKKworICAgICAgICBlbnVtIENoYXJDYXRlZ29yeSB7CisgICAgICAg
ICAgTm9DYXRlZ29yeSA9ICAwLAorICAgICAgICAgIE90aGVyX05vdEFzc2lnbmVkID0gVE9fTUFT
SyhVbmljb2RlQ0U6OlVfR0VORVJBTF9PVEhFUl9UWVBFUyksCisgICAgICAgICAgTGV0dGVyX1Vw
cGVyY2FzZSA9IFRPX01BU0soVW5pY29kZUNFOjpVX1VQUEVSQ0FTRV9MRVRURVIpLAorICAgICAg
ICAgIExldHRlcl9Mb3dlcmNhc2UgPSBUT19NQVNLKFVuaWNvZGVDRTo6VV9MT1dFUkNBU0VfTEVU
VEVSKSwKKyAgICAgICAgICBMZXR0ZXJfVGl0bGVjYXNlID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVf
VElUTEVDQVNFX0xFVFRFUiksCisgICAgICAgICAgTGV0dGVyX01vZGlmaWVyID0gVE9fTUFTSyhV
bmljb2RlQ0U6OlVfTU9ESUZJRVJfTEVUVEVSKSwKKyAgICAgICAgICBMZXR0ZXJfT3RoZXIgPSBU
T19NQVNLKFVuaWNvZGVDRTo6VV9PVEhFUl9MRVRURVIpLAorCisgICAgICAgICAgTWFya19Ob25T
cGFjaW5nID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVfTk9OX1NQQUNJTkdfTUFSSyksCisgICAgICAg
ICAgTWFya19FbmNsb3NpbmcgPSBUT19NQVNLKFVuaWNvZGVDRTo6VV9FTkNMT1NJTkdfTUFSSyks
CisgICAgICAgICAgTWFya19TcGFjaW5nQ29tYmluaW5nID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVf
Q09NQklOSU5HX1NQQUNJTkdfTUFSSyksCisKKyAgICAgICAgICBOdW1iZXJfRGVjaW1hbERpZ2l0
ID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVfREVDSU1BTF9ESUdJVF9OVU1CRVIpLAorICAgICAgICAg
IE51bWJlcl9MZXR0ZXIgPSBUT19NQVNLKFVuaWNvZGVDRTo6VV9MRVRURVJfTlVNQkVSKSwKKyAg
ICAgICAgICBOdW1iZXJfT3RoZXIgPSBUT19NQVNLKFVuaWNvZGVDRTo6VV9PVEhFUl9OVU1CRVIp
LAorCisgICAgICAgICAgU2VwYXJhdG9yX1NwYWNlID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVfU1BB
Q0VfU0VQQVJBVE9SKSwKKyAgICAgICAgICBTZXBhcmF0b3JfTGluZSA9IFRPX01BU0soVW5pY29k
ZUNFOjpVX0xJTkVfU0VQQVJBVE9SKSwKKyAgICAgICAgICBTZXBhcmF0b3JfUGFyYWdyYXBoID0g
VE9fTUFTSyhVbmljb2RlQ0U6OlVfUEFSQUdSQVBIX1NFUEFSQVRPUiksCisKKyAgICAgICAgICBP
dGhlcl9Db250cm9sID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVfQ09OVFJPTF9DSEFSKSwKKyAgICAg
ICAgICBPdGhlcl9Gb3JtYXQgPSBUT19NQVNLKFVuaWNvZGVDRTo6VV9GT1JNQVRfQ0hBUiksCisg
ICAgICAgICAgT3RoZXJfUHJpdmF0ZVVzZSA9IFRPX01BU0soVW5pY29kZUNFOjpVX1BSSVZBVEVf
VVNFX0NIQVIpLAorICAgICAgICAgIE90aGVyX1N1cnJvZ2F0ZSA9IFRPX01BU0soVW5pY29kZUNF
OjpVX1NVUlJPR0FURSksCisKKyAgICAgICAgICBQdW5jdHVhdGlvbl9EYXNoID0gVE9fTUFTSyhV
bmljb2RlQ0U6OlVfREFTSF9QVU5DVFVBVElPTiksCisgICAgICAgICAgUHVuY3R1YXRpb25fT3Bl
biA9IFRPX01BU0soVW5pY29kZUNFOjpVX1NUQVJUX1BVTkNUVUFUSU9OKSwKKyAgICAgICAgICBQ
dW5jdHVhdGlvbl9DbG9zZSA9IFRPX01BU0soVW5pY29kZUNFOjpVX0VORF9QVU5DVFVBVElPTiks
CisgICAgICAgICAgUHVuY3R1YXRpb25fQ29ubmVjdG9yID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVf
Q09OTkVDVE9SX1BVTkNUVUFUSU9OKSwKKyAgICAgICAgICBQdW5jdHVhdGlvbl9PdGhlciA9IFRP
X01BU0soVW5pY29kZUNFOjpVX09USEVSX1BVTkNUVUFUSU9OKSwKKworICAgICAgICAgIFN5bWJv
bF9NYXRoID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVfTUFUSF9TWU1CT0wpLAorICAgICAgICAgIFN5
bWJvbF9DdXJyZW5jeSA9IFRPX01BU0soVW5pY29kZUNFOjpVX0NVUlJFTkNZX1NZTUJPTCksCisg
ICAgICAgICAgU3ltYm9sX01vZGlmaWVyID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVfTU9ESUZJRVJf
U1lNQk9MKSwKKyAgICAgICAgICBTeW1ib2xfT3RoZXIgPSBUT19NQVNLKFVuaWNvZGVDRTo6VV9P
VEhFUl9TWU1CT0wpLAorCisgICAgICAgICAgUHVuY3R1YXRpb25fSW5pdGlhbFF1b3RlID0gVE9f
TUFTSyhVbmljb2RlQ0U6OlVfSU5JVElBTF9QVU5DVFVBVElPTiksCisgICAgICAgICAgUHVuY3R1
YXRpb25fRmluYWxRdW90ZSA9IFRPX01BU0soVW5pY29kZUNFOjpVX0ZJTkFMX1BVTkNUVUFUSU9O
KQorICAgICAgICB9OworCisgICAgICAgIENoYXJDYXRlZ29yeSBjYXRlZ29yeSh1bnNpZ25lZCBp
bnQpOworCisgICAgICAgIGJvb2wgaXNTcGFjZSh3Y2hhcl90KTsKKyAgICAgICAgYm9vbCBpc0xl
dHRlcih3Y2hhcl90KTsKKyAgICAgICAgYm9vbCBpc1ByaW50YWJsZUNoYXIod2NoYXJfdCk7Cisg
ICAgICAgIGJvb2wgaXNVcHBlcih3Y2hhcl90KTsKKyAgICAgICAgYm9vbCBpc0xvd2VyKHdjaGFy
X3QpOworICAgICAgICBib29sIGlzUHVuY3Qod2NoYXJfdCk7CisgICAgICAgIGJvb2wgaXNEaWdp
dCh3Y2hhcl90KTsKKyAgICAgICAgaW5saW5lIGJvb2wgaXNTZXBhcmF0b3JTcGFjZSh3Y2hhcl90
IGMpIHsgcmV0dXJuIGNhdGVnb3J5KGMpID09IFNlcGFyYXRvcl9TcGFjZTsgfQorICAgICAgICBp
bmxpbmUgYm9vbCBpc0hpZ2hTdXJyb2dhdGUod2NoYXJfdCBjKSB7IHJldHVybiAoYyAmIDB4ZmMw
MCkgPT0gMHhkODAwOyB9CisgICAgICAgIGlubGluZSBib29sIGlzTG93U3Vycm9nYXRlKHdjaGFy
X3QgYykgeyByZXR1cm4gKGMgJiAweGZjMDApID09IDB4ZGMwMDsgfQorCisgICAgICAgIHdjaGFy
X3QgdG9Mb3dlcih3Y2hhcl90KTsKKyAgICAgICAgd2NoYXJfdCB0b1VwcGVyKHdjaGFyX3QpOwor
ICAgICAgICB3Y2hhcl90IGZvbGRDYXNlKHdjaGFyX3QpOworICAgICAgICB3Y2hhcl90IHRvVGl0
bGVDYXNlKHdjaGFyX3QpOworICAgICAgICBpbnQgdG9Mb3dlcih3Y2hhcl90KiByZXN1bHQsIGlu
dCByZXN1bHRMZW5ndGgsIGNvbnN0IHdjaGFyX3QqIHNvdXJjZSwgaW50IHNvdXJjZUxlbmd0aCwg
Ym9vbCogaXNFcnJvcik7CisgICAgICAgIGludCB0b1VwcGVyKHdjaGFyX3QqIHJlc3VsdCwgaW50
IHJlc3VsdExlbmd0aCwgY29uc3Qgd2NoYXJfdCogc291cmNlLCBpbnQgc291cmNlTGVuZ3RoLCBi
b29sKiBpc0Vycm9yKTsKKyAgICAgICAgaW50IGZvbGRDYXNlKFVDaGFyKiByZXN1bHQsIGludCBy
ZXN1bHRMZW5ndGgsIGNvbnN0IHdjaGFyX3QqIHNvdXJjZSwgaW50IHNvdXJjZUxlbmd0aCwgYm9v
bCogaXNFcnJvcik7CisKKyAgICAgICAgaW50IGRpZ2l0VmFsdWUod2NoYXJfdCk7CisKKyAgICAg
ICAgd2NoYXJfdCBtaXJyb3JlZENoYXIoVUNoYXIzMik7CisgICAgICAgIHVuc2lnbmVkIGNoYXIg
Y29tYmluaW5nQ2xhc3MoVUNoYXIzMik7CisgICAgICAgIERlY29tcG9zaXRpb25UeXBlIGRlY29t
cG9zaXRpb25UeXBlKFVDaGFyMzIpOworICAgICAgICBEaXJlY3Rpb24gZGlyZWN0aW9uKFVDaGFy
MzIpOworICAgICAgICBpbmxpbmUgYm9vbCBpc0FyYWJpY0NoYXIoVUNoYXIzMikKKyAgICAgICAg
eworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBGSVhNRTogaW1wbGVtZW50IQorICAgICAg
ICB9CisKKyAgICAgICAgaW5saW5lIGJvb2wgaGFzTGluZUJyZWFraW5nUHJvcGVydHlDb21wbGV4
Q29udGV4dChVQ2hhcjMyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8v
IEZJWE1FOiBpbXBsZW1lbnQhCisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgaW50IHVtZW1j
YXNlY21wKGNvbnN0IHdjaGFyX3QqIGEsIGNvbnN0IHdjaGFyX3QqIGIsIGludCBsZW4pCisgICAg
ICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAg
ICAgICAgICAgICB3Y2hhcl90IGMxID0gZm9sZENhc2UoYVtpXSk7CisgICAgICAgICAgICAgICAg
d2NoYXJfdCBjMiA9IGZvbGRDYXNlKGJbaV0pOworICAgICAgICAgICAgICAgIGlmIChjMSAhPSBj
MikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMxIC0gYzI7CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSBVQ2hhcjMy
IHN1cnJvZ2F0ZVRvVWNzNCh3Y2hhcl90IGhpZ2gsIHdjaGFyX3QgbG93KQorICAgICAgICB7Cisg
ICAgICAgICAgICByZXR1cm4gKFVDaGFyMzIoaGlnaCkgPDwgMTApICsgbG93IC0gMHgzNWZkYzAw
OworICAgICAgICB9CisKKyAgICB9ICAgLy8gbmFtZXNwYWNlIFVuaWNvZGUKKworfSAgIC8vIG5h
bWVzcGFjZSBXVEYKKworI2VuZGlmCisvLyB2aW06IHRzPTIgc3c9MiBldApJbmRleDogSmF2YVNj
cmlwdENvcmUvd3RmL3VuaWNvZGUvd2luY2UvVW5pY29kZVdpbkNFLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
SmF2YVNjcmlwdENvcmUvd3RmL3VuaWNvZGUvd2luY2UvVW5pY29kZVdpbkNFLmgJKHJldmlzaW9u
IDU3Mjg5KQorKysgSmF2YVNjcmlwdENvcmUvd3RmL3VuaWNvZGUvd2luY2UvVW5pY29kZVdpbkNF
LmgJKHdvcmtpbmcgY29weSkKQEAgLTIxLDggKzIxLDggQEAKICAqCiAgKi8KIAotI2lmbmRlZiBV
TklDT0RFX1dJTkNFX0gKLSNkZWZpbmUgVU5JQ09ERV9XSU5DRV9ICisjaWZuZGVmIFdURl9Vbmlj
b2RlV2luQ0VfaAorI2RlZmluZSBXVEZfVW5pY29kZVdpbkNFX2gKIAogI2luY2x1ZGUgImNlX3Vu
aWNvZGUuaCIKIApAQCAtMjEyLDUgKzIxMiw0IEBAIG5hbWVzcGFjZSBXVEYgewogCiB9ICAgLy8g
bmFtZXNwYWNlIFdURgogCi0jZW5kaWYKLS8vIHZpbTogdHM9MiBzdz0yIGV0CisjZW5kaWYgLy8g
V1RGX1VuaWNvZGVXaW5DRV9oCkluZGV4OiBKYXZhU2NyaXB0Q29yZS93dGYvdW5pY29kZS93aW5j
ZS9Vbmljb2RlV2luY2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3d0Zi91bmlj
b2RlL3dpbmNlL1VuaWNvZGVXaW5jZS5jcHAJKHJldmlzaW9uIDU3Mjg5KQorKysgSmF2YVNjcmlw
dENvcmUvd3RmL3VuaWNvZGUvd2luY2UvVW5pY29kZVdpbmNlLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMSwxNzYgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDYgR2VvcmdlIFN0YWlr
b3MgPHN0YWlrb3NAa2RlLm9yZz4KLSAqICBDb3B5cmlnaHQgKEMpIDIwMDYgQWxleGV5IFByb3Nr
dXJ5YWtvdiA8YXBAbnlwb3AuY29tPgotICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNo
IE1vYmlsZSwgSW5jLgotICoKLSAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91
IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt
cyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqICBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqICB2ZXJzaW9u
IDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24u
Ci0gKgotICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0
IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl
dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqICBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3Vs
ZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlO
Ry5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
biwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqICBCb3N0b24sIE1B
IDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAi
VW5pY29kZVdpbmNlLmgiCi0KLSNpbmNsdWRlIDx3Y2hhci5oPgotCi1uYW1lc3BhY2UgV1RGIHsK
LW5hbWVzcGFjZSBVbmljb2RlIHsKLQotd2NoYXJfdCB0b0xvd2VyKHdjaGFyX3QgYykKLXsKLSAg
ICByZXR1cm4gdG93bG93ZXIoYyk7Ci19Ci0KLXdjaGFyX3QgdG9VcHBlcih3Y2hhcl90IGMpCi17
Ci0gICAgcmV0dXJuIHRvd3VwcGVyKGMpOwotfQotCi13Y2hhcl90IGZvbGRDYXNlKHdjaGFyX3Qg
YykKLXsKLSAgICByZXR1cm4gdG93bG93ZXIoYyk7Ci19Ci0KLWJvb2wgaXNQcmludGFibGVDaGFy
KHdjaGFyX3QgYykKLXsKLSAgICByZXR1cm4gISFpc3dwcmludChjKTsKLX0KLQotYm9vbCBpc1Nw
YWNlKHdjaGFyX3QgYykKLXsKLSAgICByZXR1cm4gISFpc3dzcGFjZShjKTsKLX0KLQotYm9vbCBp
c0xldHRlcih3Y2hhcl90IGMpCi17Ci0gICAgcmV0dXJuICEhaXN3YWxwaGEoYyk7Ci19Ci0KLWJv
b2wgaXNVcHBlcih3Y2hhcl90IGMpCi17Ci0gICAgcmV0dXJuICEhaXN3dXBwZXIoYyk7Ci19Ci0K
LWJvb2wgaXNMb3dlcih3Y2hhcl90IGMpCi17Ci0gICAgcmV0dXJuICEhaXN3bG93ZXIoYyk7Ci19
Ci0KLWJvb2wgaXNEaWdpdCh3Y2hhcl90IGMpCi17Ci0gICAgcmV0dXJuICEhaXN3ZGlnaXQoYyk7
Ci19Ci0KLWJvb2wgaXNQdW5jdCh3Y2hhcl90IGMpCi17Ci0gICAgcmV0dXJuICEhaXN3cHVuY3Qo
Yyk7Ci19Ci0KLWludCB0b0xvd2VyKHdjaGFyX3QqIHJlc3VsdCwgaW50IHJlc3VsdExlbmd0aCwg
Y29uc3Qgd2NoYXJfdCogc291cmNlLCBpbnQgc291cmNlTGVuZ3RoLCBib29sKiBpc0Vycm9yKQot
ewotICAgIGNvbnN0IFVDaGFyKiBzb3VyY2VJdGVyYXRvciA9IHNvdXJjZTsKLSAgICBjb25zdCBV
Q2hhciogc291cmNlRW5kID0gc291cmNlICsgc291cmNlTGVuZ3RoOwotICAgIFVDaGFyKiByZXN1
bHRJdGVyYXRvciA9IHJlc3VsdDsKLSAgICBVQ2hhciogcmVzdWx0RW5kID0gcmVzdWx0ICsgcmVz
dWx0TGVuZ3RoOwotCi0gICAgaW50IHJlbWFpbmluZ0NoYXJhY3RlcnMgPSAwOwotICAgIGlmIChz
b3VyY2VMZW5ndGggPD0gcmVzdWx0TGVuZ3RoKQotICAgICAgICB3aGlsZSAoc291cmNlSXRlcmF0
b3IgPCBzb3VyY2VFbmQpCi0gICAgICAgICAgICAqcmVzdWx0SXRlcmF0b3IrKyA9IHRvd2xvd2Vy
KCpzb3VyY2VJdGVyYXRvcisrKTsKLSAgICBlbHNlCi0gICAgICAgIHdoaWxlIChyZXN1bHRJdGVy
YXRvciA8IHJlc3VsdEVuZCkKLSAgICAgICAgICAgICpyZXN1bHRJdGVyYXRvcisrID0gdG93bG93
ZXIoKnNvdXJjZUl0ZXJhdG9yKyspOwotCi0gICAgaWYgKHNvdXJjZUl0ZXJhdG9yIDwgc291cmNl
RW5kKQotICAgICAgICByZW1haW5pbmdDaGFyYWN0ZXJzICs9IHNvdXJjZUVuZCAtIHNvdXJjZUl0
ZXJhdG9yOwotICAgICppc0Vycm9yID0gKHJlbWFpbmluZ0NoYXJhY3RlcnMgIT0gMCk7Ci0gICAg
aWYgKHJlc3VsdEl0ZXJhdG9yIDwgcmVzdWx0RW5kKQotICAgICAgICAqcmVzdWx0SXRlcmF0b3Ig
PSAwOwotCi0gICAgcmV0dXJuIChyZXN1bHRJdGVyYXRvciAtIHJlc3VsdCkgKyByZW1haW5pbmdD
aGFyYWN0ZXJzOwotfQotCi1pbnQgdG9VcHBlcih3Y2hhcl90KiByZXN1bHQsIGludCByZXN1bHRM
ZW5ndGgsIGNvbnN0IHdjaGFyX3QqIHNvdXJjZSwgaW50IHNvdXJjZUxlbmd0aCwgYm9vbCogaXNF
cnJvcikKLXsKLSAgICBjb25zdCBVQ2hhciogc291cmNlSXRlcmF0b3IgPSBzb3VyY2U7Ci0gICAg
Y29uc3QgVUNoYXIqIHNvdXJjZUVuZCA9IHNvdXJjZSArIHNvdXJjZUxlbmd0aDsKLSAgICBVQ2hh
ciogcmVzdWx0SXRlcmF0b3IgPSByZXN1bHQ7Ci0gICAgVUNoYXIqIHJlc3VsdEVuZCA9IHJlc3Vs
dCArIHJlc3VsdExlbmd0aDsKLQotICAgIGludCByZW1haW5pbmdDaGFyYWN0ZXJzID0gMDsKLSAg
ICBpZiAoc291cmNlTGVuZ3RoIDw9IHJlc3VsdExlbmd0aCkKLSAgICAgICAgd2hpbGUgKHNvdXJj
ZUl0ZXJhdG9yIDwgc291cmNlRW5kKQotICAgICAgICAgICAgKnJlc3VsdEl0ZXJhdG9yKysgPSB0
b3d1cHBlcigqc291cmNlSXRlcmF0b3IrKyk7Ci0gICAgZWxzZQotICAgICAgICB3aGlsZSAocmVz
dWx0SXRlcmF0b3IgPCByZXN1bHRFbmQpCi0gICAgICAgICAgICAqcmVzdWx0SXRlcmF0b3IrKyA9
IHRvd3VwcGVyKCpzb3VyY2VJdGVyYXRvcisrKTsKLQotICAgIGlmIChzb3VyY2VJdGVyYXRvciA8
IHNvdXJjZUVuZCkKLSAgICAgICAgcmVtYWluaW5nQ2hhcmFjdGVycyArPSBzb3VyY2VFbmQgLSBz
b3VyY2VJdGVyYXRvcjsKLSAgICAqaXNFcnJvciA9IChyZW1haW5pbmdDaGFyYWN0ZXJzICE9IDAp
OwotICAgIGlmIChyZXN1bHRJdGVyYXRvciA8IHJlc3VsdEVuZCkKLSAgICAgICAgKnJlc3VsdEl0
ZXJhdG9yID0gMDsKLQotICAgIHJldHVybiAocmVzdWx0SXRlcmF0b3IgLSByZXN1bHQpICsgcmVt
YWluaW5nQ2hhcmFjdGVyczsKLX0KLQotaW50IGZvbGRDYXNlKHdjaGFyX3QqIHJlc3VsdCwgaW50
IHJlc3VsdExlbmd0aCwgY29uc3Qgd2NoYXJfdCogc291cmNlLCBpbnQgc291cmNlTGVuZ3RoLCBi
b29sKiBpc0Vycm9yKQotewotICAgICppc0Vycm9yID0gZmFsc2U7Ci0gICAgaWYgKHJlc3VsdExl
bmd0aCA8IHNvdXJjZUxlbmd0aCkgewotICAgICAgICAqaXNFcnJvciA9IHRydWU7Ci0gICAgICAg
IHJldHVybiBzb3VyY2VMZW5ndGg7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc291
cmNlTGVuZ3RoOyArK2kpCi0gICAgICAgIHJlc3VsdFtpXSA9IGZvbGRDYXNlKHNvdXJjZVtpXSk7
Ci0gICAgcmV0dXJuIHNvdXJjZUxlbmd0aDsKLX0KLQotd2NoYXJfdCB0b1RpdGxlQ2FzZSh3Y2hh
cl90IGMpCi17Ci0gICAgcmV0dXJuIHRvd3VwcGVyKGMpOwotfQotCi1EaXJlY3Rpb24gZGlyZWN0
aW9uKFVDaGFyMzIgYykKLXsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RGlyZWN0aW9uPihVbmlj
b2RlQ0U6OmRpcmVjdGlvbihjKSk7Ci19Ci0KLUNoYXJDYXRlZ29yeSBjYXRlZ29yeSh1bnNpZ25l
ZCBpbnQgYykKLXsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2hhckNhdGVnb3J5PihUT19NQVNL
KChfX2ludDgpIFVuaWNvZGVDRTo6Y2F0ZWdvcnkoYykpKTsKLX0KLQotRGVjb21wb3NpdGlvblR5
cGUgZGVjb21wb3NpdGlvblR5cGUoVUNoYXIzMiBjKQotewotICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxEZWNvbXBvc2l0aW9uVHlwZT4oVW5pY29kZUNFOjpkZWNvbXBvc2l0aW9uVHlwZShjKSk7Ci19
Ci0KLXVuc2lnbmVkIGNoYXIgY29tYmluaW5nQ2xhc3MoVUNoYXIzMiBjKQotewotICAgIHJldHVy
biBVbmljb2RlQ0U6OmNvbWJpbmluZ0NsYXNzKGMpOwotfQotCi13Y2hhcl90IG1pcnJvcmVkQ2hh
cihVQ2hhcjMyIGMpCi17Ci0gICAgcmV0dXJuIFVuaWNvZGVDRTo6bWlycm9yZWRDaGFyKGMpOwot
fQotCi1pbnQgZGlnaXRWYWx1ZSh3Y2hhcl90IGMpCi17Ci0gICAgcmV0dXJuIFVuaWNvZGVDRTo6
ZGlnaXRWYWx1ZShjKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgVW5pY29kZQotfSAvLyBuYW1lc3Bh
Y2UgV1RGCkluZGV4OiBKYXZhU2NyaXB0Q29yZS93dGYvdW5pY29kZS93aW5jZS9Vbmljb2RlV2lu
Y2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvdW5pY29kZS93aW5jZS9Vbmlj
b2RlV2luY2UuaAkocmV2aXNpb24gNTcyODkpCisrKyBKYXZhU2NyaXB0Q29yZS93dGYvdW5pY29k
ZS93aW5jZS9Vbmljb2RlV2luY2UuaAkod29ya2luZyBjb3B5KQpAQCAtMSwyMTYgKzAsMCBAQAot
LyoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDYgR2VvcmdlIFN0YWlrb3MgPHN0YWlrb3NAa2RlLm9y
Zz4KLSAqICBDb3B5cmlnaHQgKEMpIDIwMDYgQWxleGV5IFByb3NrdXJ5YWtvdiA8YXBAbnlwb3Au
Y29tPgotICogIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBDb21wdXRlciwgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgotICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwg
SW5jLgotICoKLSAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqICB2ZXJzaW9uIDIgb2YgdGhl
IExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICog
IFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
dXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqICBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQot
ICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJ
ZiBub3QsIHdyaXRlIHRvCi0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwg
NTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqICBCb3N0b24sIE1BIDAyMTEwLTEz
MDEsIFVTQS4KLSAqCi0gKi8KLQotI2lmbmRlZiBVTklDT0RFX1dJTkNFX0gKLSNkZWZpbmUgVU5J
Q09ERV9XSU5DRV9ICi0KLSNpbmNsdWRlICJjZV91bmljb2RlLmgiCi0KLSNkZWZpbmUgVE9fTUFT
Syh4KSAoMSA8PCAoeCkpCi0KLS8vIHNvbWUgZGVmaW5lcyBmcm9tIElDVSBuZWVkZWQgb25lIG9y
IHR3byBwbGFjZXMKLQotI2RlZmluZSBVMTZfSVNfTEVBRChjKSAoKChjKSAmIDB4ZmZmZmZjMDAp
ID09IDB4ZDgwMCkKLSNkZWZpbmUgVTE2X0lTX1RSQUlMKGMpICgoKGMpICYgMHhmZmZmZmMwMCkg
PT0gMHhkYzAwKQotI2RlZmluZSBVMTZfU1VSUk9HQVRFX09GRlNFVCAoKDB4ZDgwMCA8PCAxMFVM
KSArIDB4ZGMwMCAtIDB4MTAwMDApCi0jZGVmaW5lIFUxNl9HRVRfU1VQUExFTUVOVEFSWShsZWFk
LCB0cmFpbCkgXAotICAgICgoKFVDaGFyMzIpKGxlYWQpIDw8IDEwVUwpICsgKFVDaGFyMzIpKHRy
YWlsKSAtIFUxNl9TVVJST0dBVEVfT0ZGU0VUKQotCi0jZGVmaW5lIFUxNl9MRUFEKHN1cHBsZW1l
bnRhcnkpIChVQ2hhcikoKChzdXBwbGVtZW50YXJ5KSA+PiAxMCkgKyAweGQ3YzApCi0jZGVmaW5l
IFUxNl9UUkFJTChzdXBwbGVtZW50YXJ5KSAoVUNoYXIpKCgoc3VwcGxlbWVudGFyeSkgJiAweDNm
ZikgfCAweGRjMDApCi0KLSNkZWZpbmUgVV9JU19TVVJST0dBVEUoYykgKCgoYykgJiAweGZmZmZm
ODAwKSA9PSAweGQ4MDApCi0jZGVmaW5lIFUxNl9JU19TVVJST0dBVEUoYykgVV9JU19TVVJST0dB
VEUoYykKLSNkZWZpbmUgVTE2X0lTX1NVUlJPR0FURV9MRUFEKGMpICgoKGMpICYgMHg0MDApID09
IDApCi0KLSNkZWZpbmUgVTE2X05FWFQocywgaSwgbGVuZ3RoLCBjKSB7IFwKLSAgICAoYyk9KHMp
WyhpKSsrXTsgXAotICAgIGlmIChVMTZfSVNfTEVBRChjKSkgeyBcCi0gICAgICAgIHVpbnQxNl90
IF9fYzI7IFwKLSAgICAgICAgaWYgKChpKSA8IChsZW5ndGgpICYmIFUxNl9JU19UUkFJTChfX2My
ID0gKHMpWyhpKV0pKSB7IFwKLSAgICAgICAgICAgICsrKGkpOyBcCi0gICAgICAgICAgICAoYykg
PSBVMTZfR0VUX1NVUFBMRU1FTlRBUlkoKGMpLCBfX2MyKTsgXAotICAgICAgICB9IFwKLSAgICB9
IFwKLX0KLQotI2RlZmluZSBVMTZfUFJFVihzLCBzdGFydCwgaSwgYykgeyBcCi0gICAgKGMpPShz
KVstLShpKV07IFwKLSAgICBpZiAoVTE2X0lTX1RSQUlMKGMpKSB7IFwKLSAgICAgICAgdWludDE2
X3QgX19jMjsgXAotICAgICAgICBpZiAoKGkpID4gKHN0YXJ0KSAmJiBVMTZfSVNfTEVBRChfX2My
ID0gKHMpWyhpKSAtIDFdKSkgeyBcCi0gICAgICAgICAgICAtLShpKTsgXAotICAgICAgICAgICAg
KGMpID0gVTE2X0dFVF9TVVBQTEVNRU5UQVJZKF9fYzIsIChjKSk7IFwKLSAgICAgICAgfSBcCi0g
ICAgfSBcCi19Ci0KLSNkZWZpbmUgVTE2X0lTX1NJTkdMRShjKSAhVV9JU19TVVJST0dBVEUoYykK
LQotbmFtZXNwYWNlIFdURiB7Ci0KLSAgICBuYW1lc3BhY2UgVW5pY29kZSB7Ci0KLSAgICAgICAg
ZW51bSBEaXJlY3Rpb24gewotICAgICAgICAgICAgTGVmdFRvUmlnaHQgPSBVbmljb2RlQ0U6OlVf
TEVGVF9UT19SSUdIVCwKLSAgICAgICAgICAgIFJpZ2h0VG9MZWZ0ID0gVW5pY29kZUNFOjpVX1JJ
R0hUX1RPX0xFRlQsCi0gICAgICAgICAgICBFdXJvcGVhbk51bWJlciA9IFVuaWNvZGVDRTo6VV9F
VVJPUEVBTl9OVU1CRVIsCi0gICAgICAgICAgICBFdXJvcGVhbk51bWJlclNlcGFyYXRvciA9IFVu
aWNvZGVDRTo6VV9FVVJPUEVBTl9OVU1CRVJfU0VQQVJBVE9SLAotICAgICAgICAgICAgRXVyb3Bl
YW5OdW1iZXJUZXJtaW5hdG9yID0gVW5pY29kZUNFOjpVX0VVUk9QRUFOX05VTUJFUl9URVJNSU5B
VE9SLAotICAgICAgICAgICAgQXJhYmljTnVtYmVyID0gVW5pY29kZUNFOjpVX0FSQUJJQ19OVU1C
RVIsCi0gICAgICAgICAgICBDb21tb25OdW1iZXJTZXBhcmF0b3IgPSBVbmljb2RlQ0U6OlVfQ09N
TU9OX05VTUJFUl9TRVBBUkFUT1IsCi0gICAgICAgICAgICBCbG9ja1NlcGFyYXRvciA9IFVuaWNv
ZGVDRTo6VV9CTE9DS19TRVBBUkFUT1IsCi0gICAgICAgICAgICBTZWdtZW50U2VwYXJhdG9yID0g
VW5pY29kZUNFOjpVX1NFR01FTlRfU0VQQVJBVE9SLAotICAgICAgICAgICAgV2hpdGVTcGFjZU5l
dXRyYWwgPSBVbmljb2RlQ0U6OlVfV0hJVEVfU1BBQ0VfTkVVVFJBTCwKLSAgICAgICAgICAgIE90
aGVyTmV1dHJhbCA9IFVuaWNvZGVDRTo6VV9PVEhFUl9ORVVUUkFMLAotICAgICAgICAgICAgTGVm
dFRvUmlnaHRFbWJlZGRpbmcgPSBVbmljb2RlQ0U6OlVfTEVGVF9UT19SSUdIVF9FTUJFRERJTkcs
Ci0gICAgICAgICAgICBMZWZ0VG9SaWdodE92ZXJyaWRlID0gVW5pY29kZUNFOjpVX0xFRlRfVE9f
UklHSFRfT1ZFUlJJREUsCi0gICAgICAgICAgICBSaWdodFRvTGVmdEFyYWJpYyA9IFVuaWNvZGVD
RTo6VV9SSUdIVF9UT19MRUZUX0FSQUJJQywKLSAgICAgICAgICAgIFJpZ2h0VG9MZWZ0RW1iZWRk
aW5nID0gVW5pY29kZUNFOjpVX1JJR0hUX1RPX0xFRlRfRU1CRURESU5HLAotICAgICAgICAgICAg
UmlnaHRUb0xlZnRPdmVycmlkZSA9IFVuaWNvZGVDRTo6VV9SSUdIVF9UT19MRUZUX09WRVJSSURF
LAotICAgICAgICAgICAgUG9wRGlyZWN0aW9uYWxGb3JtYXQgPSBVbmljb2RlQ0U6OlVfUE9QX0RJ
UkVDVElPTkFMX0ZPUk1BVCwKLSAgICAgICAgICAgIE5vblNwYWNpbmdNYXJrID0gVW5pY29kZUNF
OjpVX0RJUl9OT05fU1BBQ0lOR19NQVJLLAotICAgICAgICAgICAgQm91bmRhcnlOZXV0cmFsID0g
VW5pY29kZUNFOjpVX0JPVU5EQVJZX05FVVRSQUwKLSAgICAgICAgfTsKLQotICAgICAgICBlbnVt
IERlY29tcG9zaXRpb25UeXBlIHsKLSAgICAgICAgICBEZWNvbXBvc2l0aW9uTm9uZSA9IFVuaWNv
ZGVDRTo6VV9EVF9OT05FLAotICAgICAgICAgIERlY29tcG9zaXRpb25DYW5vbmljYWwgPSBVbmlj
b2RlQ0U6OlVfRFRfQ0FOT05JQ0FMLAotICAgICAgICAgIERlY29tcG9zaXRpb25Db21wYXQgPSBV
bmljb2RlQ0U6OlVfRFRfQ09NUEFULAotICAgICAgICAgIERlY29tcG9zaXRpb25DaXJjbGUgPSBV
bmljb2RlQ0U6OlVfRFRfQ0lSQ0xFLAotICAgICAgICAgIERlY29tcG9zaXRpb25GaW5hbCA9IFVu
aWNvZGVDRTo6VV9EVF9GSU5BTCwKLSAgICAgICAgICBEZWNvbXBvc2l0aW9uRm9udCA9IFVuaWNv
ZGVDRTo6VV9EVF9GT05ULAotICAgICAgICAgIERlY29tcG9zaXRpb25GcmFjdGlvbiA9IFVuaWNv
ZGVDRTo6VV9EVF9GUkFDVElPTiwKLSAgICAgICAgICBEZWNvbXBvc2l0aW9uSW5pdGlhbCA9IFVu
aWNvZGVDRTo6VV9EVF9JTklUSUFMLAotICAgICAgICAgIERlY29tcG9zaXRpb25Jc29sYXRlZCA9
IFVuaWNvZGVDRTo6VV9EVF9JU09MQVRFRCwKLSAgICAgICAgICBEZWNvbXBvc2l0aW9uTWVkaWFs
ID0gVW5pY29kZUNFOjpVX0RUX01FRElBTCwKLSAgICAgICAgICBEZWNvbXBvc2l0aW9uTmFycm93
ID0gVW5pY29kZUNFOjpVX0RUX05BUlJPVywKLSAgICAgICAgICBEZWNvbXBvc2l0aW9uTm9CcmVh
ayA9IFVuaWNvZGVDRTo6VV9EVF9OT0JSRUFLLAotICAgICAgICAgIERlY29tcG9zaXRpb25TbWFs
bCA9IFVuaWNvZGVDRTo6VV9EVF9TTUFMTCwKLSAgICAgICAgICBEZWNvbXBvc2l0aW9uU3F1YXJl
ID0gVW5pY29kZUNFOjpVX0RUX1NRVUFSRSwKLSAgICAgICAgICBEZWNvbXBvc2l0aW9uU3ViID0g
VW5pY29kZUNFOjpVX0RUX1NVQiwKLSAgICAgICAgICBEZWNvbXBvc2l0aW9uU3VwZXIgPSBVbmlj
b2RlQ0U6OlVfRFRfU1VQRVIsCi0gICAgICAgICAgRGVjb21wb3NpdGlvblZlcnRpY2FsID0gVW5p
Y29kZUNFOjpVX0RUX1ZFUlRJQ0FMLAotICAgICAgICAgIERlY29tcG9zaXRpb25XaWRlID0gVW5p
Y29kZUNFOjpVX0RUX1dJREUsCi0gICAgICAgIH07Ci0KLSAgICAgICAgZW51bSBDaGFyQ2F0ZWdv
cnkgewotICAgICAgICAgIE5vQ2F0ZWdvcnkgPSAgMCwKLSAgICAgICAgICBPdGhlcl9Ob3RBc3Np
Z25lZCA9IFRPX01BU0soVW5pY29kZUNFOjpVX0dFTkVSQUxfT1RIRVJfVFlQRVMpLAotICAgICAg
ICAgIExldHRlcl9VcHBlcmNhc2UgPSBUT19NQVNLKFVuaWNvZGVDRTo6VV9VUFBFUkNBU0VfTEVU
VEVSKSwKLSAgICAgICAgICBMZXR0ZXJfTG93ZXJjYXNlID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVf
TE9XRVJDQVNFX0xFVFRFUiksCi0gICAgICAgICAgTGV0dGVyX1RpdGxlY2FzZSA9IFRPX01BU0so
VW5pY29kZUNFOjpVX1RJVExFQ0FTRV9MRVRURVIpLAotICAgICAgICAgIExldHRlcl9Nb2RpZmll
ciA9IFRPX01BU0soVW5pY29kZUNFOjpVX01PRElGSUVSX0xFVFRFUiksCi0gICAgICAgICAgTGV0
dGVyX090aGVyID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVfT1RIRVJfTEVUVEVSKSwKLQotICAgICAg
ICAgIE1hcmtfTm9uU3BhY2luZyA9IFRPX01BU0soVW5pY29kZUNFOjpVX05PTl9TUEFDSU5HX01B
UkspLAotICAgICAgICAgIE1hcmtfRW5jbG9zaW5nID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVfRU5D
TE9TSU5HX01BUkspLAotICAgICAgICAgIE1hcmtfU3BhY2luZ0NvbWJpbmluZyA9IFRPX01BU0so
VW5pY29kZUNFOjpVX0NPTUJJTklOR19TUEFDSU5HX01BUkspLAotCi0gICAgICAgICAgTnVtYmVy
X0RlY2ltYWxEaWdpdCA9IFRPX01BU0soVW5pY29kZUNFOjpVX0RFQ0lNQUxfRElHSVRfTlVNQkVS
KSwKLSAgICAgICAgICBOdW1iZXJfTGV0dGVyID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVfTEVUVEVS
X05VTUJFUiksCi0gICAgICAgICAgTnVtYmVyX090aGVyID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVf
T1RIRVJfTlVNQkVSKSwKLQotICAgICAgICAgIFNlcGFyYXRvcl9TcGFjZSA9IFRPX01BU0soVW5p
Y29kZUNFOjpVX1NQQUNFX1NFUEFSQVRPUiksCi0gICAgICAgICAgU2VwYXJhdG9yX0xpbmUgPSBU
T19NQVNLKFVuaWNvZGVDRTo6VV9MSU5FX1NFUEFSQVRPUiksCi0gICAgICAgICAgU2VwYXJhdG9y
X1BhcmFncmFwaCA9IFRPX01BU0soVW5pY29kZUNFOjpVX1BBUkFHUkFQSF9TRVBBUkFUT1IpLAot
Ci0gICAgICAgICAgT3RoZXJfQ29udHJvbCA9IFRPX01BU0soVW5pY29kZUNFOjpVX0NPTlRST0xf
Q0hBUiksCi0gICAgICAgICAgT3RoZXJfRm9ybWF0ID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVfRk9S
TUFUX0NIQVIpLAotICAgICAgICAgIE90aGVyX1ByaXZhdGVVc2UgPSBUT19NQVNLKFVuaWNvZGVD
RTo6VV9QUklWQVRFX1VTRV9DSEFSKSwKLSAgICAgICAgICBPdGhlcl9TdXJyb2dhdGUgPSBUT19N
QVNLKFVuaWNvZGVDRTo6VV9TVVJST0dBVEUpLAotCi0gICAgICAgICAgUHVuY3R1YXRpb25fRGFz
aCA9IFRPX01BU0soVW5pY29kZUNFOjpVX0RBU0hfUFVOQ1RVQVRJT04pLAotICAgICAgICAgIFB1
bmN0dWF0aW9uX09wZW4gPSBUT19NQVNLKFVuaWNvZGVDRTo6VV9TVEFSVF9QVU5DVFVBVElPTiks
Ci0gICAgICAgICAgUHVuY3R1YXRpb25fQ2xvc2UgPSBUT19NQVNLKFVuaWNvZGVDRTo6VV9FTkRf
UFVOQ1RVQVRJT04pLAotICAgICAgICAgIFB1bmN0dWF0aW9uX0Nvbm5lY3RvciA9IFRPX01BU0so
VW5pY29kZUNFOjpVX0NPTk5FQ1RPUl9QVU5DVFVBVElPTiksCi0gICAgICAgICAgUHVuY3R1YXRp
b25fT3RoZXIgPSBUT19NQVNLKFVuaWNvZGVDRTo6VV9PVEhFUl9QVU5DVFVBVElPTiksCi0KLSAg
ICAgICAgICBTeW1ib2xfTWF0aCA9IFRPX01BU0soVW5pY29kZUNFOjpVX01BVEhfU1lNQk9MKSwK
LSAgICAgICAgICBTeW1ib2xfQ3VycmVuY3kgPSBUT19NQVNLKFVuaWNvZGVDRTo6VV9DVVJSRU5D
WV9TWU1CT0wpLAotICAgICAgICAgIFN5bWJvbF9Nb2RpZmllciA9IFRPX01BU0soVW5pY29kZUNF
OjpVX01PRElGSUVSX1NZTUJPTCksCi0gICAgICAgICAgU3ltYm9sX090aGVyID0gVE9fTUFTSyhV
bmljb2RlQ0U6OlVfT1RIRVJfU1lNQk9MKSwKLQotICAgICAgICAgIFB1bmN0dWF0aW9uX0luaXRp
YWxRdW90ZSA9IFRPX01BU0soVW5pY29kZUNFOjpVX0lOSVRJQUxfUFVOQ1RVQVRJT04pLAotICAg
ICAgICAgIFB1bmN0dWF0aW9uX0ZpbmFsUXVvdGUgPSBUT19NQVNLKFVuaWNvZGVDRTo6VV9GSU5B
TF9QVU5DVFVBVElPTikKLSAgICAgICAgfTsKLQotICAgICAgICBDaGFyQ2F0ZWdvcnkgY2F0ZWdv
cnkodW5zaWduZWQgaW50KTsKLQotICAgICAgICBib29sIGlzU3BhY2Uod2NoYXJfdCk7Ci0gICAg
ICAgIGJvb2wgaXNMZXR0ZXIod2NoYXJfdCk7Ci0gICAgICAgIGJvb2wgaXNQcmludGFibGVDaGFy
KHdjaGFyX3QpOwotICAgICAgICBib29sIGlzVXBwZXIod2NoYXJfdCk7Ci0gICAgICAgIGJvb2wg
aXNMb3dlcih3Y2hhcl90KTsKLSAgICAgICAgYm9vbCBpc1B1bmN0KHdjaGFyX3QpOwotICAgICAg
ICBib29sIGlzRGlnaXQod2NoYXJfdCk7Ci0gICAgICAgIGlubGluZSBib29sIGlzU2VwYXJhdG9y
U3BhY2Uod2NoYXJfdCBjKSB7IHJldHVybiBjYXRlZ29yeShjKSA9PSBTZXBhcmF0b3JfU3BhY2U7
IH0KLSAgICAgICAgaW5saW5lIGJvb2wgaXNIaWdoU3Vycm9nYXRlKHdjaGFyX3QgYykgeyByZXR1
cm4gKGMgJiAweGZjMDApID09IDB4ZDgwMDsgfQotICAgICAgICBpbmxpbmUgYm9vbCBpc0xvd1N1
cnJvZ2F0ZSh3Y2hhcl90IGMpIHsgcmV0dXJuIChjICYgMHhmYzAwKSA9PSAweGRjMDA7IH0KLQot
ICAgICAgICB3Y2hhcl90IHRvTG93ZXIod2NoYXJfdCk7Ci0gICAgICAgIHdjaGFyX3QgdG9VcHBl
cih3Y2hhcl90KTsKLSAgICAgICAgd2NoYXJfdCBmb2xkQ2FzZSh3Y2hhcl90KTsKLSAgICAgICAg
d2NoYXJfdCB0b1RpdGxlQ2FzZSh3Y2hhcl90KTsKLSAgICAgICAgaW50IHRvTG93ZXIod2NoYXJf
dCogcmVzdWx0LCBpbnQgcmVzdWx0TGVuZ3RoLCBjb25zdCB3Y2hhcl90KiBzb3VyY2UsIGludCBz
b3VyY2VMZW5ndGgsIGJvb2wqIGlzRXJyb3IpOwotICAgICAgICBpbnQgdG9VcHBlcih3Y2hhcl90
KiByZXN1bHQsIGludCByZXN1bHRMZW5ndGgsIGNvbnN0IHdjaGFyX3QqIHNvdXJjZSwgaW50IHNv
dXJjZUxlbmd0aCwgYm9vbCogaXNFcnJvcik7Ci0gICAgICAgIGludCBmb2xkQ2FzZShVQ2hhciog
cmVzdWx0LCBpbnQgcmVzdWx0TGVuZ3RoLCBjb25zdCB3Y2hhcl90KiBzb3VyY2UsIGludCBzb3Vy
Y2VMZW5ndGgsIGJvb2wqIGlzRXJyb3IpOwotCi0gICAgICAgIGludCBkaWdpdFZhbHVlKHdjaGFy
X3QpOwotCi0gICAgICAgIHdjaGFyX3QgbWlycm9yZWRDaGFyKFVDaGFyMzIpOwotICAgICAgICB1
bnNpZ25lZCBjaGFyIGNvbWJpbmluZ0NsYXNzKFVDaGFyMzIpOwotICAgICAgICBEZWNvbXBvc2l0
aW9uVHlwZSBkZWNvbXBvc2l0aW9uVHlwZShVQ2hhcjMyKTsKLSAgICAgICAgRGlyZWN0aW9uIGRp
cmVjdGlvbihVQ2hhcjMyKTsKLSAgICAgICAgaW5saW5lIGJvb2wgaXNBcmFiaWNDaGFyKFVDaGFy
MzIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gRklYTUU6IGltcGxl
bWVudCEKLSAgICAgICAgfQotCi0gICAgICAgIGlubGluZSBib29sIGhhc0xpbmVCcmVha2luZ1By
b3BlcnR5Q29tcGxleENvbnRleHQoVUNoYXIzMikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOyAvLyBGSVhNRTogaW1wbGVtZW50IQotICAgICAgICB9Ci0KLSAgICAgICAgaW5s
aW5lIGludCB1bWVtY2FzZWNtcChjb25zdCB3Y2hhcl90KiBhLCBjb25zdCB3Y2hhcl90KiBiLCBp
bnQgbGVuKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsg
KytpKSB7Ci0gICAgICAgICAgICAgICAgd2NoYXJfdCBjMSA9IGZvbGRDYXNlKGFbaV0pOwotICAg
ICAgICAgICAgICAgIHdjaGFyX3QgYzIgPSBmb2xkQ2FzZShiW2ldKTsKLSAgICAgICAgICAgICAg
ICBpZiAoYzEgIT0gYzIpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjMSAtIGMyOwotICAg
ICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBp
bmxpbmUgVUNoYXIzMiBzdXJyb2dhdGVUb1VjczQod2NoYXJfdCBoaWdoLCB3Y2hhcl90IGxvdykK
LSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChVQ2hhcjMyKGhpZ2gpIDw8IDEwKSArIGxv
dyAtIDB4MzVmZGMwMDsKLSAgICAgICAgfQotCi0gICAgfSAgIC8vIG5hbWVzcGFjZSBVbmljb2Rl
Ci0KLX0gICAvLyBuYW1lc3BhY2UgV1RGCi0KLSNlbmRpZgotLy8gdmltOiB0cz0yIHN3PTIgZXQK
SW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi93aW5jZS9GYXN0TWFsbG9jV2luQ0UuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvd2luY2UvRmFzdE1hbGxvY1dpbkNFLmgJKHJldmlz
aW9uIDU3Mjg5KQkoZnJvbSBKYXZhU2NyaXB0Q29yZS93dGYvd2luY2UvRmFzdE1hbGxvY1dpbmNl
Lmg6NTcyODkpCisrKyBKYXZhU2NyaXB0Q29yZS93dGYvd2luY2UvRmFzdE1hbGxvY1dpbkNFLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAy
MDA1LCAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
ICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZAorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2Yg
dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgor
ICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo
ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZl
IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIu
ICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j
LiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEw
LTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBGYXN0TWFsbG9jV2luY2VfaAorI2RlZmlu
ZSBGYXN0TWFsbG9jV2luY2VfaAorCisjaW5jbHVkZSA8bmV3Lmg+CisKKyNpZmRlZiBfX2NwbHVz
cGx1cworI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlICJNZW1vcnlNYW5hZ2VyLmgiCitleHRlcm4g
IkMiIHsKKyNlbmRpZgorCit2b2lkKiBmYXN0TWFsbG9jKHNpemVfdCBuKTsKK3ZvaWQqIGZhc3RD
YWxsb2Moc2l6ZV90IG5fZWxlbWVudHMsIHNpemVfdCBlbGVtZW50X3NpemUpOwordm9pZCBmYXN0
RnJlZSh2b2lkKiBwKTsKK3ZvaWQqIGZhc3RSZWFsbG9jKHZvaWQqIHAsIHNpemVfdCBuKTsKK3Zv
aWQqIGZhc3RaZXJvZWRNYWxsb2Moc2l6ZV90IG4pOworLy8gVGhlc2UgZnVuY3Rpb25zIHJldHVy
biAwIGlmIGFuIGFsbG9jYXRpb24gZmFpbHMuCit2b2lkKiB0cnlGYXN0TWFsbG9jKHNpemVfdCBu
KTsKK3ZvaWQqIHRyeUZhc3RaZXJvZWRNYWxsb2Moc2l6ZV90IG4pOwordm9pZCogdHJ5RmFzdENh
bGxvYyhzaXplX3Qgbl9lbGVtZW50cywgc2l6ZV90IGVsZW1lbnRfc2l6ZSk7Cit2b2lkKiB0cnlG
YXN0UmVhbGxvYyh2b2lkKiBwLCBzaXplX3Qgbik7CitjaGFyKiBmYXN0U3RyRHVwKGNvbnN0IGNo
YXIqKTsKKworI2lmbmRlZiBOREVCVUcKK3ZvaWQgZmFzdE1hbGxvY0ZvcmJpZCgpOwordm9pZCBm
YXN0TWFsbG9jQWxsb3coKTsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoVVNFX1NZU1RFTV9NQUxM
T0MpIHx8ICFVU0VfU1lTVEVNX01BTExPQworCisjZGVmaW5lIG1hbGxvYyhuKSAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGZhc3RNYWxsb2MobikKKyNkZWZpbmUgY2FsbG9jKG5fZWxlbWVudHMs
IGVsZW1lbnRfc2l6ZSkgICAgZmFzdENhbGxvYyhuX2VsZW1lbnRzLCBlbGVtZW50X3NpemUpCisj
ZGVmaW5lIHJlYWxsb2MocCwgbikgICAgICAgICAgICAgICAgICAgICAgIGZhc3RSZWFsbG9jKHAs
IG4pCisjZGVmaW5lIGZyZWUocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhc3RGcmVl
KHApCisjZGVmaW5lIHN0cmR1cChwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhc3RTdHJE
dXAocCkKKworI2Vsc2UKKworI2RlZmluZSBzdHJkdXAocCkgICAgICAgICAgICAgICAgICAgICAg
ICAgICBfc3RyZHVwKHApCisKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRp
ZgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpZiAhZGVmaW5lZChVU0VfU1lTVEVNX01BTExPQykg
fHwgIVVTRV9TWVNURU1fTUFMTE9DCitzdGF0aWMgaW5saW5lIHZvaWQqIF9fY2RlY2wgb3BlcmF0
b3IgbmV3KHNpemVfdCBzKSB7IHJldHVybiBmYXN0TWFsbG9jKHMpOyB9CitzdGF0aWMgaW5saW5l
IHZvaWQgX19jZGVjbCBvcGVyYXRvciBkZWxldGUodm9pZCogcCkgeyBmYXN0RnJlZShwKTsgfQor
c3RhdGljIGlubGluZSB2b2lkKiBfX2NkZWNsIG9wZXJhdG9yIG5ld1tdKHNpemVfdCBzKSB7IHJl
dHVybiBmYXN0TWFsbG9jKHMpOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgX19jZGVjbCBvcGVyYXRv
ciBkZWxldGVbXSh2b2lkKiBwKSB7IGZhc3RGcmVlKHApOyB9CitzdGF0aWMgaW5saW5lIHZvaWQq
IG9wZXJhdG9yIG5ldyhzaXplX3QgcywgY29uc3Qgc3RkOjpub3Rocm93X3QmKSB0aHJvdygpIHsg
cmV0dXJuIGZhc3RNYWxsb2Mocyk7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciBkZWxl
dGUodm9pZCogcCwgY29uc3Qgc3RkOjpub3Rocm93X3QmKSB0aHJvdygpIHsgZmFzdEZyZWUocCk7
IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCogb3BlcmF0b3IgbmV3W10oc2l6ZV90IHMsIGNvbnN0IHN0
ZDo6bm90aHJvd190JikgdGhyb3coKSB7IHJldHVybiBmYXN0TWFsbG9jKHMpOyB9CitzdGF0aWMg
aW5saW5lIHZvaWQgb3BlcmF0b3IgZGVsZXRlW10odm9pZCogcCwgY29uc3Qgc3RkOjpub3Rocm93
X3QmKSB0aHJvdygpIHsgZmFzdEZyZWUocCk7IH0KKyNlbmRpZgorCituYW1lc3BhY2UgV1RGIHsK
KyAgICAvLyBUaGlzIGRlZmluZXMgYSB0eXBlIHdoaWNoIGhvbGRzIGFuIHVuc2lnbmVkIGludGVn
ZXIgYW5kIGlzIHRoZSBzYW1lCisgICAgLy8gc2l6ZSBhcyB0aGUgbWluaW1hbGx5IGFsaWduZWQg
bWVtb3J5IGFsbG9jYXRpb24uCisgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgQWxsb2NB
bGlnbm1lbnRJbnRlZ2VyOworCisgICAgbmFtZXNwYWNlIEludGVybmFsIHsKKyAgICAgICAgZW51
bSBBbGxvY1R5cGUgeyAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgd2l0aCBhbiB1bnVzdWFs
IG51bWJlciBpbnN0ZWFkIG9mIHplcm8sIGJlY2F1c2UgemVybyBpcyBjb21tb24uCisgICAgICAg
ICAgICBBbGxvY1R5cGVNYWxsb2MgPSAweDM3NWQ2NzUwLCAgIC8vIEVuY29tcGFzc2VzIGZhc3RN
YWxsb2MsIGZhc3RaZXJvZWRNYWxsb2MsIGZhc3RDYWxsb2MsIGZhc3RSZWFsbG9jLgorICAgICAg
ICAgICAgQWxsb2NUeXBlQ2xhc3NOZXcsICAgICAgICAgICAgICAvLyBFbmNvbXBhc3NlcyBjbGFz
cyBvcGVyYXRvciBuZXcgZnJvbSBGYXN0QWxsb2NCYXNlLgorICAgICAgICAgICAgQWxsb2NUeXBl
Q2xhc3NOZXdBcnJheSwgICAgICAgICAvLyBFbmNvbXBhc3NlcyBjbGFzcyBvcGVyYXRvciBuZXdb
XSBmcm9tIEZhc3RBbGxvY0Jhc2UuCisgICAgICAgICAgICBBbGxvY1R5cGVGYXN0TmV3LCAgICAg
ICAgICAgICAgIC8vIEVuY29tcGFzc2VzIGZhc3ROZXcuCisgICAgICAgICAgICBBbGxvY1R5cGVG
YXN0TmV3QXJyYXksICAgICAgICAgIC8vIEVuY29tcGFzc2VzIGZhc3ROZXdBcnJheS4KKyAgICAg
ICAgICAgIEFsbG9jVHlwZU5ldywgICAgICAgICAgICAgICAgICAgLy8gRW5jb21wYXNzZXMgZ2xv
YmFsIG9wZXJhdG9yIG5ldy4KKyAgICAgICAgICAgIEFsbG9jVHlwZU5ld0FycmF5ICAgICAgICAg
ICAgICAgLy8gRW5jb21wYXNzZXMgZ2xvYmFsIG9wZXJhdG9yIG5ld1tdLgorICAgICAgICB9Owor
ICAgIH0KKworCisjaWYgRU5BQkxFKEZBU1RfTUFMTE9DX01BVENIX1ZBTElEQVRJT04pCisKKyAg
ICAvLyBNYWxsb2MgdmFsaWRhdGlvbiBpcyBhIHNjaGVtZSB3aGVyZWJ5IGEgdGFnIGlzIGF0dGFj
aGVkIHRvIGFuCisgICAgLy8gYWxsb2NhdGlvbiB3aGljaCBpZGVudGlmaWVzIGhvdyBpdCB3YXMg
b3JpZ2luYWxseSBhbGxvY2F0ZWQuCisgICAgLy8gVGhpcyBhbGxvd3MgdXMgdG8gdmVyaWZ5IHRo
YXQgdGhlIGZyZWVpbmcgb3BlcmF0aW9uIG1hdGNoZXMgdGhlCisgICAgLy8gYWxsb2NhdGlvbiBv
cGVyYXRpb24uIElmIG1lbW9yeSBpcyBhbGxvY2F0ZWQgd2l0aCBvcGVyYXRvciBuZXdbXQorICAg
IC8vIGJ1dCBmcmVlZCB3aXRoIGZyZWUgb3IgZGVsZXRlLCB0aGlzIHN5c3RlbSB3b3VsZCBkZXRl
Y3QgdGhhdC4KKyAgICAvLyBJbiB0aGUgaW1wbGVtZW50YXRpb24gaGVyZSwgdGhlIHRhZyBpcyBh
biBpbnRlZ2VyIHByZXBlbmRlZCB0bworICAgIC8vIHRoZSBhbGxvY2F0aW9uIG1lbW9yeSB3aGlj
aCBpcyBhc3NpZ25lZCBvbmUgb2YgdGhlIEFsbG9jVHlwZQorICAgIC8vIGVudW1lcmF0aW9uIHZh
bHVlcy4gQW4gYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgdGhpcworICAgIC8vIHNjaGVt
ZSBjb3VsZCBzdG9yZSB0aGUgdGFnIHNvbWV3aGVyZSBlbHNlIG9yIGlnbm9yZSBpdC4KKyAgICAv
LyBVc2VycyBvZiBGYXN0TWFsbG9jIGRvbid0IG5lZWQgdG8ga25vdyBvciBjYXJlIGhvdyB0aGlz
IHRhZ2dpbmcKKyAgICAvLyBpcyBpbXBsZW1lbnRlZC4KKworICAgIG5hbWVzcGFjZSBJbnRlcm5h
bCB7CisKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBBbGxvY1R5cGUgdGFnIGFzc29jaWF0ZWQgd2l0
aCB0aGUgYWxsb2NhdGVkIGJsb2NrIHAuCisgICAgICAgIGlubGluZSBBbGxvY1R5cGUgZmFzdE1h
bGxvY01hdGNoVmFsaWRhdGlvblR5cGUoY29uc3Qgdm9pZCogcCkKKyAgICAgICAgeworICAgICAg
ICAgICAgY29uc3QgQWxsb2NBbGlnbm1lbnRJbnRlZ2VyKiB0eXBlID0gc3RhdGljX2Nhc3Q8Y29u
c3QgQWxsb2NBbGlnbm1lbnRJbnRlZ2VyKj4ocCkgLSAxOworICAgICAgICAgICAgcmV0dXJuIHN0
YXRpY19jYXN0PEFsbG9jVHlwZT4oKnR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0
dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBBbGxvY1R5cGUgdGFnIGFzc29jaWF0ZWQgd2l0aCB0aGUg
YWxsb2NhdGVkIGJsb2NrIHAuCisgICAgICAgIGlubGluZSBBbGxvY0FsaWdubWVudEludGVnZXIq
IGZhc3RNYWxsb2NNYXRjaFZhbGlkYXRpb25WYWx1ZSh2b2lkKiBwKQorICAgICAgICB7CisgICAg
ICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxBbGxvY0FsaWdubWVudEludGVnZXIqPihz
dGF0aWNfY2FzdDxjaGFyKj4ocCkgLSBzaXplb2YoQWxsb2NBbGlnbm1lbnRJbnRlZ2VyKSk7Cisg
ICAgICAgIH0KKworICAgICAgICAvLyBTZXQgdGhlIEFsbG9jVHlwZSB0YWcgdG8gYmUgYXNzb2Np
YWdlZCB3aXRoIHRoZSBhbGxvY2F0ZWQgYmxvY2sgcC4KKyAgICAgICAgaW5saW5lIHZvaWQgc2V0
RmFzdE1hbGxvY01hdGNoVmFsaWRhdGlvblR5cGUodm9pZCogcCwgQWxsb2NUeXBlIGFsbG9jVHlw
ZSkKKyAgICAgICAgeworICAgICAgICAgICAgQWxsb2NBbGlnbm1lbnRJbnRlZ2VyKiB0eXBlID0g
c3RhdGljX2Nhc3Q8QWxsb2NBbGlnbm1lbnRJbnRlZ2VyKj4ocCkgLSAxOworICAgICAgICAgICAg
KnR5cGUgPSBzdGF0aWNfY2FzdDxBbGxvY0FsaWdubWVudEludGVnZXI+KGFsbG9jVHlwZSk7Cisg
ICAgICAgIH0KKworICAgICAgICAvLyBIYW5kbGUgYSBkZXRlY3RlZCBhbGxvYy9mcmVlIG1pc21h
dGNoLiBCeSBkZWZhdWx0IHRoaXMgY2FsbHMgQ1JBU0goKS4KKyAgICAgICAgdm9pZCBmYXN0TWFs
bG9jTWF0Y2hGYWlsZWQodm9pZCogcCk7CisKKyAgICB9IC8vIG5hbWVzcGFjZSBJbnRlcm5hbAor
CisgICAgLy8gVGhpcyBpcyBhIGhpZ2hlciBsZXZlbCBmdW5jdGlvbiB3aGljaCBpcyB1c2VkIGJ5
IEZhc3RNYWxsb2MtdXNpbmcgY29kZS4KKyAgICBpbmxpbmUgdm9pZCBmYXN0TWFsbG9jTWF0Y2hW
YWxpZGF0ZU1hbGxvYyh2b2lkKiBwLCBJbnRlcm5hbDo6QWxsb2NUeXBlIGFsbG9jVHlwZSkKKyAg
ICB7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBJbnRl
cm5hbDo6c2V0RmFzdE1hbGxvY01hdGNoVmFsaWRhdGlvblR5cGUocCwgYWxsb2NUeXBlKTsKKyAg
ICB9CisKKyAgICAvLyBUaGlzIGlzIGEgaGlnaGVyIGxldmVsIGZ1bmN0aW9uIHdoaWNoIGlzIHVz
ZWQgYnkgRmFzdE1hbGxvYy11c2luZyBjb2RlLgorICAgIGlubGluZSB2b2lkIGZhc3RNYWxsb2NN
YXRjaFZhbGlkYXRlRnJlZSh2b2lkKiBwLCBJbnRlcm5hbDo6QWxsb2NUeXBlIGFsbG9jVHlwZSkK
KyAgICB7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBp
ZiAoSW50ZXJuYWw6OmZhc3RNYWxsb2NNYXRjaFZhbGlkYXRpb25UeXBlKHApICE9IGFsbG9jVHlw
ZSkKKyAgICAgICAgICAgIEludGVybmFsOjpmYXN0TWFsbG9jTWF0Y2hGYWlsZWQocCk7CisgICAg
ICAgIEludGVybmFsOjpzZXRGYXN0TWFsbG9jTWF0Y2hWYWxpZGF0aW9uVHlwZShwLCBJbnRlcm5h
bDo6QWxsb2NUeXBlTWFsbG9jKTsgIC8vIFNldCBpdCB0byB0aGlzIHNvIHRoYXQgZmFzdEZyZWUg
dGhpbmtzIGl0J3MgT0suCisgICAgfQorCisjZWxzZQorCisgICAgaW5saW5lIHZvaWQgZmFzdE1h
bGxvY01hdGNoVmFsaWRhdGVNYWxsb2Modm9pZCosIEludGVybmFsOjpBbGxvY1R5cGUpCisgICAg
eworICAgIH0KKworICAgIGlubGluZSB2b2lkIGZhc3RNYWxsb2NNYXRjaFZhbGlkYXRlRnJlZSh2
b2lkKiwgSW50ZXJuYWw6OkFsbG9jVHlwZSkKKyAgICB7CisgICAgfQorCisjZW5kaWYKKworfSAv
LyBuYW1lc3BhY2UgV1RGCisKKyNlbmRpZgorCisjZW5kaWYgLy8gRmFzdE1hbGxvY1dpbmNlX2gK
KwpJbmRleDogSmF2YVNjcmlwdENvcmUvd3RmL3dpbmNlL0Zhc3RNYWxsb2NXaW5DRS5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3d0Zi93aW5jZS9GYXN0TWFsbG9jV2luQ0UuaAkocmV2
aXNpb24gNTcyODkpCisrKyBKYXZhU2NyaXB0Q29yZS93dGYvd2luY2UvRmFzdE1hbGxvY1dpbkNF
LmgJKHdvcmtpbmcgY29weSkKQEAgLTE5LDggKzE5LDggQEAKICAqCiAgKi8KIAotI2lmbmRlZiBG
YXN0TWFsbG9jV2luY2VfaAotI2RlZmluZSBGYXN0TWFsbG9jV2luY2VfaAorI2lmbmRlZiBXVEZf
RmFzdE1hbGxvY1dpbkNFX2gKKyNkZWZpbmUgV1RGX0Zhc3RNYWxsb2NXaW5DRV9oCiAKICNpbmNs
dWRlIDxuZXcuaD4KIApAQCAtMTcyLDUgKzE3Miw0IEBAIG5hbWVzcGFjZSBXVEYgewogCiAjZW5k
aWYKIAotI2VuZGlmIC8vIEZhc3RNYWxsb2NXaW5jZV9oCi0KKyNlbmRpZiAvLyBXVEZfRmFzdE1h
bGxvY1dpbkNFX2gKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi93aW5jZS9GYXN0TWFsbG9jV2lu
Y2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvd2luY2UvRmFzdE1hbGxvY1dp
bmNlLmgJKHJldmlzaW9uIDU3Mjg5KQorKysgSmF2YVNjcmlwdENvcmUvd3RmL3dpbmNlL0Zhc3RN
YWxsb2NXaW5jZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDE3NiArMCwwIEBACi0vKgotICogIENv
cHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqCi0gKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogIG1vZGlmeSBpdCB1bmRlciB0
aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gKiAgTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiAg
dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2
ZXJzaW9uLgotICoKLSAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg
dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBv
ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiAgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlv
dSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxl
IENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0gKiAgQm9z
dG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0gKgotICovCi0KLSNpZm5kZWYgRmFzdE1hbGxvY1dp
bmNlX2gKLSNkZWZpbmUgRmFzdE1hbGxvY1dpbmNlX2gKLQotI2luY2x1ZGUgPG5ldy5oPgotCi0j
aWZkZWYgX19jcGx1c3BsdXMKLSNpbmNsdWRlIDxuZXc+Ci0jaW5jbHVkZSAiTWVtb3J5TWFuYWdl
ci5oIgotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotdm9pZCogZmFzdE1hbGxvYyhzaXplX3Qgbik7
Ci12b2lkKiBmYXN0Q2FsbG9jKHNpemVfdCBuX2VsZW1lbnRzLCBzaXplX3QgZWxlbWVudF9zaXpl
KTsKLXZvaWQgZmFzdEZyZWUodm9pZCogcCk7Ci12b2lkKiBmYXN0UmVhbGxvYyh2b2lkKiBwLCBz
aXplX3Qgbik7Ci12b2lkKiBmYXN0WmVyb2VkTWFsbG9jKHNpemVfdCBuKTsKLS8vIFRoZXNlIGZ1
bmN0aW9ucyByZXR1cm4gMCBpZiBhbiBhbGxvY2F0aW9uIGZhaWxzLgotdm9pZCogdHJ5RmFzdE1h
bGxvYyhzaXplX3Qgbik7Ci12b2lkKiB0cnlGYXN0WmVyb2VkTWFsbG9jKHNpemVfdCBuKTsKLXZv
aWQqIHRyeUZhc3RDYWxsb2Moc2l6ZV90IG5fZWxlbWVudHMsIHNpemVfdCBlbGVtZW50X3NpemUp
Owotdm9pZCogdHJ5RmFzdFJlYWxsb2Modm9pZCogcCwgc2l6ZV90IG4pOwotY2hhciogZmFzdFN0
ckR1cChjb25zdCBjaGFyKik7Ci0KLSNpZm5kZWYgTkRFQlVHCi12b2lkIGZhc3RNYWxsb2NGb3Ji
aWQoKTsKLXZvaWQgZmFzdE1hbGxvY0FsbG93KCk7Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkKFVT
RV9TWVNURU1fTUFMTE9DKSB8fCAhVVNFX1NZU1RFTV9NQUxMT0MKLQotI2RlZmluZSBtYWxsb2Mo
bikgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXN0TWFsbG9jKG4pCi0jZGVmaW5lIGNhbGxv
YyhuX2VsZW1lbnRzLCBlbGVtZW50X3NpemUpICAgIGZhc3RDYWxsb2Mobl9lbGVtZW50cywgZWxl
bWVudF9zaXplKQotI2RlZmluZSByZWFsbG9jKHAsIG4pICAgICAgICAgICAgICAgICAgICAgICBm
YXN0UmVhbGxvYyhwLCBuKQotI2RlZmluZSBmcmVlKHApICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBmYXN0RnJlZShwKQotI2RlZmluZSBzdHJkdXAocCkgICAgICAgICAgICAgICAgICAgICAg
ICAgICBmYXN0U3RyRHVwKHApCi0KLSNlbHNlCi0KLSNkZWZpbmUgc3RyZHVwKHApICAgICAgICAg
ICAgICAgICAgICAgICAgICAgX3N0cmR1cChwKQotCi0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNw
bHVzCi19Ci0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jaWYgIWRlZmluZWQoVVNFX1NZ
U1RFTV9NQUxMT0MpIHx8ICFVU0VfU1lTVEVNX01BTExPQwotc3RhdGljIGlubGluZSB2b2lkKiBf
X2NkZWNsIG9wZXJhdG9yIG5ldyhzaXplX3QgcykgeyByZXR1cm4gZmFzdE1hbGxvYyhzKTsgfQot
c3RhdGljIGlubGluZSB2b2lkIF9fY2RlY2wgb3BlcmF0b3IgZGVsZXRlKHZvaWQqIHApIHsgZmFz
dEZyZWUocCk7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCogX19jZGVjbCBvcGVyYXRvciBuZXdbXShz
aXplX3QgcykgeyByZXR1cm4gZmFzdE1hbGxvYyhzKTsgfQotc3RhdGljIGlubGluZSB2b2lkIF9f
Y2RlY2wgb3BlcmF0b3IgZGVsZXRlW10odm9pZCogcCkgeyBmYXN0RnJlZShwKTsgfQotc3RhdGlj
IGlubGluZSB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHMsIGNvbnN0IHN0ZDo6bm90aHJvd190
JikgdGhyb3coKSB7IHJldHVybiBmYXN0TWFsbG9jKHMpOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQg
b3BlcmF0b3IgZGVsZXRlKHZvaWQqIHAsIGNvbnN0IHN0ZDo6bm90aHJvd190JikgdGhyb3coKSB7
IGZhc3RGcmVlKHApOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQqIG9wZXJhdG9yIG5ld1tdKHNpemVf
dCBzLCBjb25zdCBzdGQ6Om5vdGhyb3dfdCYpIHRocm93KCkgeyByZXR1cm4gZmFzdE1hbGxvYyhz
KTsgfQotc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqIHAsIGNvbnN0
IHN0ZDo6bm90aHJvd190JikgdGhyb3coKSB7IGZhc3RGcmVlKHApOyB9Ci0jZW5kaWYKLQotbmFt
ZXNwYWNlIFdURiB7Ci0gICAgLy8gVGhpcyBkZWZpbmVzIGEgdHlwZSB3aGljaCBob2xkcyBhbiB1
bnNpZ25lZCBpbnRlZ2VyIGFuZCBpcyB0aGUgc2FtZQotICAgIC8vIHNpemUgYXMgdGhlIG1pbmlt
YWxseSBhbGlnbmVkIG1lbW9yeSBhbGxvY2F0aW9uLgotICAgIHR5cGVkZWYgdW5zaWduZWQgbG9u
ZyBsb25nIEFsbG9jQWxpZ25tZW50SW50ZWdlcjsKLQotICAgIG5hbWVzcGFjZSBJbnRlcm5hbCB7
Ci0gICAgICAgIGVudW0gQWxsb2NUeXBlIHsgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHdp
dGggYW4gdW51c3VhbCBudW1iZXIgaW5zdGVhZCBvZiB6ZXJvLCBiZWNhdXNlIHplcm8gaXMgY29t
bW9uLgotICAgICAgICAgICAgQWxsb2NUeXBlTWFsbG9jID0gMHgzNzVkNjc1MCwgICAvLyBFbmNv
bXBhc3NlcyBmYXN0TWFsbG9jLCBmYXN0WmVyb2VkTWFsbG9jLCBmYXN0Q2FsbG9jLCBmYXN0UmVh
bGxvYy4KLSAgICAgICAgICAgIEFsbG9jVHlwZUNsYXNzTmV3LCAgICAgICAgICAgICAgLy8gRW5j
b21wYXNzZXMgY2xhc3Mgb3BlcmF0b3IgbmV3IGZyb20gRmFzdEFsbG9jQmFzZS4KLSAgICAgICAg
ICAgIEFsbG9jVHlwZUNsYXNzTmV3QXJyYXksICAgICAgICAgLy8gRW5jb21wYXNzZXMgY2xhc3Mg
b3BlcmF0b3IgbmV3W10gZnJvbSBGYXN0QWxsb2NCYXNlLgotICAgICAgICAgICAgQWxsb2NUeXBl
RmFzdE5ldywgICAgICAgICAgICAgICAvLyBFbmNvbXBhc3NlcyBmYXN0TmV3LgotICAgICAgICAg
ICAgQWxsb2NUeXBlRmFzdE5ld0FycmF5LCAgICAgICAgICAvLyBFbmNvbXBhc3NlcyBmYXN0TmV3
QXJyYXkuCi0gICAgICAgICAgICBBbGxvY1R5cGVOZXcsICAgICAgICAgICAgICAgICAgIC8vIEVu
Y29tcGFzc2VzIGdsb2JhbCBvcGVyYXRvciBuZXcuCi0gICAgICAgICAgICBBbGxvY1R5cGVOZXdB
cnJheSAgICAgICAgICAgICAgIC8vIEVuY29tcGFzc2VzIGdsb2JhbCBvcGVyYXRvciBuZXdbXS4K
LSAgICAgICAgfTsKLSAgICB9Ci0KLQotI2lmIEVOQUJMRShGQVNUX01BTExPQ19NQVRDSF9WQUxJ
REFUSU9OKQotCi0gICAgLy8gTWFsbG9jIHZhbGlkYXRpb24gaXMgYSBzY2hlbWUgd2hlcmVieSBh
IHRhZyBpcyBhdHRhY2hlZCB0byBhbgotICAgIC8vIGFsbG9jYXRpb24gd2hpY2ggaWRlbnRpZmll
cyBob3cgaXQgd2FzIG9yaWdpbmFsbHkgYWxsb2NhdGVkLgotICAgIC8vIFRoaXMgYWxsb3dzIHVz
IHRvIHZlcmlmeSB0aGF0IHRoZSBmcmVlaW5nIG9wZXJhdGlvbiBtYXRjaGVzIHRoZQotICAgIC8v
IGFsbG9jYXRpb24gb3BlcmF0aW9uLiBJZiBtZW1vcnkgaXMgYWxsb2NhdGVkIHdpdGggb3BlcmF0
b3IgbmV3W10KLSAgICAvLyBidXQgZnJlZWQgd2l0aCBmcmVlIG9yIGRlbGV0ZSwgdGhpcyBzeXN0
ZW0gd291bGQgZGV0ZWN0IHRoYXQuCi0gICAgLy8gSW4gdGhlIGltcGxlbWVudGF0aW9uIGhlcmUs
IHRoZSB0YWcgaXMgYW4gaW50ZWdlciBwcmVwZW5kZWQgdG8KLSAgICAvLyB0aGUgYWxsb2NhdGlv
biBtZW1vcnkgd2hpY2ggaXMgYXNzaWduZWQgb25lIG9mIHRoZSBBbGxvY1R5cGUKLSAgICAvLyBl
bnVtZXJhdGlvbiB2YWx1ZXMuIEFuIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMK
LSAgICAvLyBzY2hlbWUgY291bGQgc3RvcmUgdGhlIHRhZyBzb21ld2hlcmUgZWxzZSBvciBpZ25v
cmUgaXQuCi0gICAgLy8gVXNlcnMgb2YgRmFzdE1hbGxvYyBkb24ndCBuZWVkIHRvIGtub3cgb3Ig
Y2FyZSBob3cgdGhpcyB0YWdnaW5nCi0gICAgLy8gaXMgaW1wbGVtZW50ZWQuCi0KLSAgICBuYW1l
c3BhY2UgSW50ZXJuYWwgewotCi0gICAgICAgIC8vIFJldHVybiB0aGUgQWxsb2NUeXBlIHRhZyBh
c3NvY2lhdGVkIHdpdGggdGhlIGFsbG9jYXRlZCBibG9jayBwLgotICAgICAgICBpbmxpbmUgQWxs
b2NUeXBlIGZhc3RNYWxsb2NNYXRjaFZhbGlkYXRpb25UeXBlKGNvbnN0IHZvaWQqIHApCi0gICAg
ICAgIHsKLSAgICAgICAgICAgIGNvbnN0IEFsbG9jQWxpZ25tZW50SW50ZWdlciogdHlwZSA9IHN0
YXRpY19jYXN0PGNvbnN0IEFsbG9jQWxpZ25tZW50SW50ZWdlcio+KHApIC0gMTsKLSAgICAgICAg
ICAgIHJldHVybiBzdGF0aWNfY2FzdDxBbGxvY1R5cGU+KCp0eXBlKTsKLSAgICAgICAgfQotCi0g
ICAgICAgIC8vIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgQWxsb2NUeXBlIHRhZyBhc3NvY2lh
dGVkIHdpdGggdGhlIGFsbG9jYXRlZCBibG9jayBwLgotICAgICAgICBpbmxpbmUgQWxsb2NBbGln
bm1lbnRJbnRlZ2VyKiBmYXN0TWFsbG9jTWF0Y2hWYWxpZGF0aW9uVmFsdWUodm9pZCogcCkKLSAg
ICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8QWxsb2NBbGlnbm1l
bnRJbnRlZ2VyKj4oc3RhdGljX2Nhc3Q8Y2hhcio+KHApIC0gc2l6ZW9mKEFsbG9jQWxpZ25tZW50
SW50ZWdlcikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBBbGxvY1R5cGUgdGFn
IHRvIGJlIGFzc29jaWFnZWQgd2l0aCB0aGUgYWxsb2NhdGVkIGJsb2NrIHAuCi0gICAgICAgIGlu
bGluZSB2b2lkIHNldEZhc3RNYWxsb2NNYXRjaFZhbGlkYXRpb25UeXBlKHZvaWQqIHAsIEFsbG9j
VHlwZSBhbGxvY1R5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFsbG9jQWxpZ25tZW50SW50
ZWdlciogdHlwZSA9IHN0YXRpY19jYXN0PEFsbG9jQWxpZ25tZW50SW50ZWdlcio+KHApIC0gMTsK
LSAgICAgICAgICAgICp0eXBlID0gc3RhdGljX2Nhc3Q8QWxsb2NBbGlnbm1lbnRJbnRlZ2VyPihh
bGxvY1R5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSGFuZGxlIGEgZGV0ZWN0ZWQgYWxs
b2MvZnJlZSBtaXNtYXRjaC4gQnkgZGVmYXVsdCB0aGlzIGNhbGxzIENSQVNIKCkuCi0gICAgICAg
IHZvaWQgZmFzdE1hbGxvY01hdGNoRmFpbGVkKHZvaWQqIHApOwotCi0gICAgfSAvLyBuYW1lc3Bh
Y2UgSW50ZXJuYWwKLQotICAgIC8vIFRoaXMgaXMgYSBoaWdoZXIgbGV2ZWwgZnVuY3Rpb24gd2hp
Y2ggaXMgdXNlZCBieSBGYXN0TWFsbG9jLXVzaW5nIGNvZGUuCi0gICAgaW5saW5lIHZvaWQgZmFz
dE1hbGxvY01hdGNoVmFsaWRhdGVNYWxsb2Modm9pZCogcCwgSW50ZXJuYWw6OkFsbG9jVHlwZSBh
bGxvY1R5cGUpCi0gICAgewotICAgICAgICBpZiAoIXApCi0gICAgICAgICAgICByZXR1cm47Ci0K
LSAgICAgICAgSW50ZXJuYWw6OnNldEZhc3RNYWxsb2NNYXRjaFZhbGlkYXRpb25UeXBlKHAsIGFs
bG9jVHlwZSk7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBpcyBhIGhpZ2hlciBsZXZlbCBmdW5jdGlv
biB3aGljaCBpcyB1c2VkIGJ5IEZhc3RNYWxsb2MtdXNpbmcgY29kZS4KLSAgICBpbmxpbmUgdm9p
ZCBmYXN0TWFsbG9jTWF0Y2hWYWxpZGF0ZUZyZWUodm9pZCogcCwgSW50ZXJuYWw6OkFsbG9jVHlw
ZSBhbGxvY1R5cGUpCi0gICAgewotICAgICAgICBpZiAoIXApCi0gICAgICAgICAgICByZXR1cm47
Ci0KLSAgICAgICAgaWYgKEludGVybmFsOjpmYXN0TWFsbG9jTWF0Y2hWYWxpZGF0aW9uVHlwZShw
KSAhPSBhbGxvY1R5cGUpCi0gICAgICAgICAgICBJbnRlcm5hbDo6ZmFzdE1hbGxvY01hdGNoRmFp
bGVkKHApOwotICAgICAgICBJbnRlcm5hbDo6c2V0RmFzdE1hbGxvY01hdGNoVmFsaWRhdGlvblR5
cGUocCwgSW50ZXJuYWw6OkFsbG9jVHlwZU1hbGxvYyk7ICAvLyBTZXQgaXQgdG8gdGhpcyBzbyB0
aGF0IGZhc3RGcmVlIHRoaW5rcyBpdCdzIE9LLgotICAgIH0KLQotI2Vsc2UKLQotICAgIGlubGlu
ZSB2b2lkIGZhc3RNYWxsb2NNYXRjaFZhbGlkYXRlTWFsbG9jKHZvaWQqLCBJbnRlcm5hbDo6QWxs
b2NUeXBlKQotICAgIHsKLSAgICB9Ci0KLSAgICBpbmxpbmUgdm9pZCBmYXN0TWFsbG9jTWF0Y2hW
YWxpZGF0ZUZyZWUodm9pZCosIEludGVybmFsOjpBbGxvY1R5cGUpCi0gICAgewotICAgIH0KLQot
I2VuZGlmCi0KLX0gLy8gbmFtZXNwYWNlIFdURgotCi0jZW5kaWYKLQotI2VuZGlmIC8vIEZhc3RN
YWxsb2NXaW5jZV9oCi0K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>52902</attachid>
            <date>2010-04-08 15:26:50 -0700</date>
            <delta_ts>2010-04-08 15:56:29 -0700</delta_ts>
            <desc>The patch - part 2 (WebCore)</desc>
            <filename>bug-37287-WebCore.patch</filename>
            <type>text/plain</type>
            <size>569222</size>
            <attacher name="Patrick R. Gansterer">paroga</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NzI5NikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTM2IEBACisyMDEwLTA0LTA4ICBQYXRyaWNrIFJvbGFuZCBHYW5zdGVyZXIgIDxw
YXJvZ2FAcGFyb2dhLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4K
KworICAgICAgICBOZWVkIGEgc2hvcnQgZGVzY3JpcHRpb24gYW5kIGJ1ZyBVUkwgKE9PUFMhKQor
CisgICAgICAgIE5vIG5ldyB0ZXN0cy4gKE9PUFMhKQorCisgICAgICAgICogbG9hZGVyL2ljb24v
d2luY2UvSWNvbkRhdGFiYXNlV2luQ0UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBsb2FkZXIvaWNv
bi93aW5jZS9JY29uRGF0YWJhc2VXaW5jZS5jcHA6IFJlbW92ZWQuCisgICAgICAgICogcGFnZS93
aW5jZS9GcmFtZVdpbkNFLmNwcDogQWRkZWQuCisgICAgICAgICogcGFnZS93aW5jZS9GcmFtZVdp
bmNlLmNwcDogUmVtb3ZlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9NZWRpYVBsYXll
ci5jcHA6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvQ29sb3JXaW5DRS5jcHA6
IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0NvbG9yV2luY2UuY3Bw
OiBSZW1vdmVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ZvbnRDYWNoZVdp
bkNFLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvRm9udENh
Y2hlV2luY2UuY3BwOiBSZW1vdmVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNl
L0ZvbnRQbGF0Zm9ybURhdGEuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9G
b250V2luQ0UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9G
b250V2luY2UuY3BwOiBSZW1vdmVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNl
L0dseXBoUGFnZVRyZWVOb2RlV2luQ0UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy93aW5jZS9HbHlwaFBhZ2VUcmVlTm9kZVdpbmNlLmNwcDogUmVtb3ZlZC4KKyAgICAg
ICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HcmFkaWVudFdpbkNFLmNwcDogQWRkZWQuCisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvR3JhZGllbnRXaW5jZS5jcHA6IFJlbW92
ZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvR3JhcGhpY3NDb250ZXh0V2lu
Q0UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HcmFwaGlj
c0NvbnRleHRXaW5jZS5jcHA6IFJlbW92ZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luY2UvSW1hZ2VCdWZmZXJXaW5DRS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL3dpbmNlL0ltYWdlQnVmZmVyV2luY2UuY3BwOiBSZW1vdmVkLgorICAgICAgICAqIHBs
YXRmb3JtL2dyYXBoaWNzL3dpbmNlL01lZGlhUGxheWVyUHJpdmF0ZVdpbkNFLmg6IEFkZGVkLgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01lZGlhUGxheWVyUHJpdmF0ZVdpbmNl
Lmg6IFJlbW92ZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGF0aFdpbkNF
LmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGF0aFdpbmNl
LmNwcDogUmVtb3ZlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QbGF0Zm9y
bVBhdGhXaW5DRS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNl
L1BsYXRmb3JtUGF0aFdpbkNFLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L3dpbmNlL1BsYXRmb3JtUGF0aFdpbmNlLmNwcDogUmVtb3ZlZC4KKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy93aW5jZS9QbGF0Zm9ybVBhdGhXaW5jZS5oOiBSZW1vdmVkLgorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NpbXBsZUZvbnREYXRhV2luQ0UuY3BwOiBBZGRlZC4K
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaW1wbGVGb250RGF0YVdpbmNlLmNw
cDogUmVtb3ZlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9XaW5DRUdyYXBo
aWNzRXh0cmFzLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1dp
bmNlR3JhcGhpY3NFeHRyYXMuaDogUmVtb3ZlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS90ZXh0L1Rl
eHRFbmNvZGluZ1JlZ2lzdHJ5LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmJ1aWxkQmFzZVRleHRD
b2RlY01hcHMpOgorICAgICAgICAoV2ViQ29yZTo6ZXh0ZW5kVGV4dENvZGVjTWFwcyk6CisgICAg
ICAgICogcGxhdGZvcm0vdGV4dC93aW5jZS9UZXh0Qm91bmRhcmllc1dpbkNFLmNwcDogQWRkZWQu
CisgICAgICAgICogcGxhdGZvcm0vdGV4dC93aW5jZS9UZXh0Qm91bmRhcmllc1dpbmNlLmNwcDog
UmVtb3ZlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS90ZXh0L3dpbmNlL1RleHRCcmVha0l0ZXJhdG9y
V2luQ0UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS90ZXh0L3dpbmNlL1RleHRCcmVh
a0l0ZXJhdG9yV2luY2UuY3BwOiBSZW1vdmVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0N1
cnNvcldpbkNFLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vd2luY2UvQ3Vyc29yV2lu
Y2UuY3BwOiBSZW1vdmVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0RyYWdEYXRhV2luQ0Uu
Y3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9EcmFnRGF0YVdpbmNlLmNwcDog
UmVtb3ZlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9EcmFnSW1hZ2VXaW5DRS5jcHA6IEFk
ZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0RyYWdJbWFnZVdpbmNlLmNwcDogUmVtb3Zl
ZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9FZGl0b3JXaW5DRS5jcHA6IEFkZGVkLgorICAg
ICAgICAoV2ViQ29yZTo6RWRpdG9yOjpuZXdHZW5lcmFsQ2xpcGJvYXJkKToKKyAgICAgICAgKiBw
bGF0Zm9ybS93aW5jZS9FZGl0b3JXaW5jZS5jcHA6IFJlbW92ZWQuCisgICAgICAgICogcGxhdGZv
cm0vd2luY2UvRmlsZUNob29zZXJXaW5DRS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3Jt
L3dpbmNlL0ZpbGVDaG9vc2VyV2luY2UuY3BwOiBSZW1vdmVkLgorICAgICAgICAqIHBsYXRmb3Jt
L3dpbmNlL0ZpbGVTeXN0ZW1XaW5DRS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dp
bmNlL0ZpbGVTeXN0ZW1XaW5jZS5jcHA6IFJlbW92ZWQuCisgICAgICAgICogcGxhdGZvcm0vd2lu
Y2UvS1VSTFdpbkNFLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vd2luY2UvS1VSTFdp
bmNlLmNwcDogUmVtb3ZlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9LZXlnZW5XaW5DRS5j
cHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0tleWdlbldpbmNlLmNwcDogUmVt
b3ZlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9NSU1FVHlwZVJlZ2lzdHJ5V2luQ0UuY3Bw
OiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9NSU1FVHlwZVJlZ2lzdHJ5V2luY2Uu
Y3BwOiBSZW1vdmVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL1Bhc3RlYm9hcmRXaW5DRS5j
cHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL1Bhc3RlYm9hcmRXaW5jZS5jcHA6
IFJlbW92ZWQuCisgICAgICAgICogcGxhdGZvcm0vd2luY2UvU2VhcmNoUG9wdXBNZW51V2luQ0Uu
Y3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9TZWFyY2hQb3B1cE1lbnVXaW5j
ZS5jcHA6IFJlbW92ZWQuCisgICAgICAgICogcGxhdGZvcm0vd2luY2UvU2hhcmVkVGltZXJXaW5j
ZS5jcHA6IFJlbW92ZWQuCisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlclRoZW1lV2luQ0UuLmg6
IEFkZGVkLgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUaGVtZVdpbkNFLmNwcDogQWRkZWQu
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZVdpbkNFOjpjcmVhdGUpOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyVGhlbWU6OnRoZW1lRm9yUGFnZSk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJUaGVtZVdpbkNFOjpSZW5kZXJUaGVtZVdpbkNFKToKKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlclRoZW1lV2luQ0U6On5SZW5kZXJUaGVtZVdpbkNFKToKKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlclRoZW1lV2luQ0U6OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6OnBsYXRmb3JtSW5hY3RpdmVTZWxl
Y3Rpb25CYWNrZ3JvdW5kQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVXaW5D
RTo6cGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6cGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkZvcmVncm91
bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZVdpbkNFOjpzdXBwb3J0c0Zv
Y3VzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6OnN1cHBvcnRzRm9jdXNS
aW5nKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6OmRldGVybWluZUNsYXNz
aWNTdGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZVdpbkNFOjpnZXRUaGVtZURh
dGEpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6cGFpbnRCdXR0b24pOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6c2V0Q2hlY2tib3hTaXplKToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6OnBhaW50VGV4dEZpZWxkKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6OmFkanVzdE1lbnVMaXN0U3R5bGUpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6cGFpbnRNZW51TGlzdCk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJUaGVtZVdpbkNFOjpwYWludE1lbnVMaXN0QnV0dG9uKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6OnN5c3RlbUZvbnQpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6dGhlbWVDaGFuZ2VkKToKKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlclRoZW1lV2luQ0U6OmV4dHJhRGVmYXVsdFN0eWxlU2hlZXQpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6ZXh0cmFRdWlya3NTdHlsZVNoZWV0KToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6OnN1cHBvcnRzSG92ZXIpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6c3lzdGVtQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGhlbWVXaW5DRTo6YWRqdXN0U2xpZGVyVGh1bWJTaXplKToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlclRoZW1lV2luQ0U6OmFkanVzdEJ1dHRvbklubmVyU3R5bGUpOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6YWRqdXN0U2VhcmNoRmllbGRTdHlsZSk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZVdpbkNFOjpwYWludFNlYXJjaEZpZWxkKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6OnBhaW50U2VhcmNoRmllbGRDYW5jZWxCdXR0
b24pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6YWRqdXN0U2VhcmNoRmll
bGRDYW5jZWxCdXR0b25TdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZVdpbkNF
OjphZGp1c3RTZWFyY2hGaWVsZERlY29yYXRpb25TdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJUaGVtZVdpbkNFOjphZGp1c3RTZWFyY2hGaWVsZFJlc3VsdHNEZWNvcmF0aW9uU3R5bGUp
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6cGFpbnRTZWFyY2hGaWVsZFJl
c3VsdHNEZWNvcmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6OmFk
anVzdFNlYXJjaEZpZWxkUmVzdWx0c0J1dHRvblN0eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlclRoZW1lV2luQ0U6OnBhaW50U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uKToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6OmFkanVzdE1lbnVMaXN0QnV0dG9uU3R5bGUpOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6cGFpbnRTbGlkZXJUcmFjayk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZVdpbkNFOjpwYWludFNsaWRlclRodW1iKToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6OmJ1dHRvbkludGVybmFsUGFkZGluZ0xl
ZnQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6YnV0dG9uSW50ZXJuYWxQ
YWRkaW5nUmlnaHQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6YnV0dG9u
SW50ZXJuYWxQYWRkaW5nVG9wKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6
OmJ1dHRvbkludGVybmFsUGFkZGluZ0JvdHRvbSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJU
aGVtZVdpbkNFOjpwYWludE1lZGlhRnVsbHNjcmVlbkJ1dHRvbik6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJUaGVtZVdpbkNFOjpwYWludE1lZGlhTXV0ZUJ1dHRvbik6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJUaGVtZVdpbkNFOjpwYWludE1lZGlhUGxheUJ1dHRvbik6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUaGVtZVdpbkNFOjpwYWludE1lZGlhU2Vla0JhY2tCdXR0b24pOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6cGFpbnRNZWRpYVNlZWtGb3J3YXJkQnV0
dG9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6OnBhaW50TWVkaWFTbGlk
ZXJUcmFjayk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZVdpbkNFOjpwYWludE1lZGlh
U2xpZGVyVGh1bWIpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUaGVtZVdpbmNlLmNwcDog
UmVtb3ZlZC4KKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGhlbWVXaW5jZS5oOiBSZW1vdmVk
LgorICAgICAgICAqIHN0b3JhZ2Uvd2luY2UvRGF0YWJhc2VUaHJlYWRXaW5DRS5jcHA6IEFkZGVk
LgorICAgICAgICAqIHN0b3JhZ2Uvd2luY2UvRGF0YWJhc2VUaHJlYWRXaW5DRS5oOiBBZGRlZC4K
KyAgICAgICAgKiBzdG9yYWdlL3dpbmNlL0RhdGFiYXNlVGhyZWFkV2luY2UuY3BwOiBSZW1vdmVk
LgorICAgICAgICAqIHN0b3JhZ2Uvd2luY2UvRGF0YWJhc2VUaHJlYWRXaW5jZS5oOiBSZW1vdmVk
LgorICAgICAgICAqIHN0b3JhZ2Uvd2luY2UvTG9jYWxTdG9yYWdlVGhyZWFkV2luQ0UuY3BwOiBB
ZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL3dpbmNlL0xvY2FsU3RvcmFnZVRocmVhZFdpbkNFLmg6
IEFkZGVkLgorICAgICAgICAqIHN0b3JhZ2Uvd2luY2UvTG9jYWxTdG9yYWdlVGhyZWFkV2luY2Uu
Y3BwOiBSZW1vdmVkLgorICAgICAgICAqIHN0b3JhZ2Uvd2luY2UvTG9jYWxTdG9yYWdlVGhyZWFk
V2luY2UuaDogUmVtb3ZlZC4KKwogMjAxMC0wNC0wNyAgRGF2aWQgSHlhdHQgIDxoeWF0dEBhcHBs
ZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgT2xpdmVyIEh1bnQuCkluZGV4OiBXZWJDb3Jl
L2xvYWRlci9pY29uL3dpbmNlL0ljb25EYXRhYmFzZVdpbkNFLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL2xvYWRlci9pY29uL3dpbmNlL0ljb25EYXRhYmFzZVdpbkNFLmNwcAkocmV2aXNpb24g
NTcyODkpCShmcm9tIFdlYkNvcmUvbG9hZGVyL2ljb24vd2luY2UvSWNvbkRhdGFiYXNlV2luY2Uu
Y3BwOjU3Mjg5KQorKysgV2ViQ29yZS9sb2FkZXIvaWNvbi93aW5jZS9JY29uRGF0YWJhc2VXaW5D
RS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqICBDb3B5cmlnaHQg
KEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUgSW5jLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAq
ICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBl
aXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikg
YW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBp
biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBX
QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hB
TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH
TlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4K
KyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBz
ZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9v
ciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkljb25EYXRhYmFzZS5oIgorCisjaW5jbHVkZSAiQXV0b2Ry
YWluZWRQb29sLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIKKyNpbmNsdWRlICJGaWxl
U3lzdGVtLmgiCisjaW5jbHVkZSAiSWNvbkRhdGFiYXNlQ2xpZW50LmgiCisjaW5jbHVkZSAiSWNv
blJlY29yZC5oIgorI2luY2x1ZGUgIkltYWdlLmgiCisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmlu
Zy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIEZ1bmN0aW9uIHRvIG9idGFpbiB0aGUg
Z2xvYmFsIGljb24gZGF0YWJhc2UuCitJY29uRGF0YWJhc2UqIGljb25EYXRhYmFzZSgpIHsgcmV0
dXJuIDA7IH0KKworSWNvbkRhdGFiYXNlOjpJY29uRGF0YWJhc2UoKSB7fQorSWNvbkRhdGFiYXNl
Ojp+SWNvbkRhdGFiYXNlKCkge30KKwordm9pZCBJY29uRGF0YWJhc2U6OnNldENsaWVudChJY29u
RGF0YWJhc2VDbGllbnQqKSB7fQorCitib29sIEljb25EYXRhYmFzZTo6b3Blbihjb25zdCBTdHJp
bmcmIHBhdGgpIHsgcmV0dXJuIGZhbHNlOyB9Cit2b2lkIEljb25EYXRhYmFzZTo6Y2xvc2UoKSB7
fQorCit2b2lkIEljb25EYXRhYmFzZTo6cmVtb3ZlQWxsSWNvbnMoKSB7fQorCitJbWFnZSogSWNv
bkRhdGFiYXNlOjppY29uRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmLCBjb25zdCBJbnRTaXplJikg
eyByZXR1cm4gMDsgfQordm9pZCBJY29uRGF0YWJhc2U6OnJlYWRJY29uRm9yUGFnZVVSTEZyb21E
aXNrKGNvbnN0IFN0cmluZyYpIHt9CitTdHJpbmcgSWNvbkRhdGFiYXNlOjppY29uVVJMRm9yUGFn
ZVVSTChjb25zdCBTdHJpbmcmKSB7IHJldHVybiBTdHJpbmcoKTsgfQorSW1hZ2UqIEljb25EYXRh
YmFzZTo6ZGVmYXVsdEljb24oY29uc3QgSW50U2l6ZSYpIHsgcmV0dXJuIDA7fQorCit2b2lkIElj
b25EYXRhYmFzZTo6cmV0YWluSWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJikge30KK3ZvaWQg
SWNvbkRhdGFiYXNlOjpyZWxlYXNlSWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJikge30KKwor
dm9pZCBJY29uRGF0YWJhc2U6OnNldEljb25EYXRhRm9ySWNvblVSTChQYXNzUmVmUHRyPFNoYXJl
ZEJ1ZmZlcj4gZGF0YSwgY29uc3QgU3RyaW5nJikge30KK3ZvaWQgSWNvbkRhdGFiYXNlOjpzZXRJ
Y29uVVJMRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmIGljb25VUkwsIGNvbnN0IFN0cmluZyYgcGFn
ZVVSTCkge30KKworSWNvbkxvYWREZWNpc2lvbiBJY29uRGF0YWJhc2U6OmxvYWREZWNpc2lvbkZv
ckljb25VUkwoY29uc3QgU3RyaW5nJiwgRG9jdW1lbnRMb2FkZXIqKSB7IHJldHVybiBJY29uTG9h
ZE5vOyB9Citib29sIEljb25EYXRhYmFzZTo6aWNvbkRhdGFLbm93bkZvckljb25VUkwoY29uc3Qg
U3RyaW5nJikgeyByZXR1cm4gZmFsc2U7IH0KKwordm9pZCBJY29uRGF0YWJhc2U6OnNldEVuYWJs
ZWQoYm9vbCBlbmFibGVkKSB7fQorYm9vbCBJY29uRGF0YWJhc2U6OmlzRW5hYmxlZCgpIGNvbnN0
IHsgcmV0dXJuIGZhbHNlOyB9CisKK3ZvaWQgSWNvbkRhdGFiYXNlOjpzZXRQcml2YXRlQnJvd3Np
bmdFbmFibGVkKGJvb2wgZmxhZykge30KK2Jvb2wgSWNvbkRhdGFiYXNlOjppc1ByaXZhdGVCcm93
c2luZ0VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCit2b2lkIEljb25EYXRhYmFz
ZTo6ZGVsYXlEYXRhYmFzZUNsZWFudXAoKSB7fQordm9pZCBJY29uRGF0YWJhc2U6OmFsbG93RGF0
YWJhc2VDbGVhbnVwKCkge30KK3ZvaWQgSWNvbkRhdGFiYXNlOjpjaGVja0ludGVncml0eUJlZm9y
ZU9wZW5pbmcoKSB7fQorCisvLyBTdXBwb3J0IGZvciBXZWJDb3JlU3RhdGlzdGljcyBpbiBXZWJL
aXQKK3NpemVfdCBJY29uRGF0YWJhc2U6OnBhZ2VVUkxNYXBwaW5nQ291bnQoKSB7IHJldHVybiAw
OyB9CitzaXplX3QgSWNvbkRhdGFiYXNlOjpyZXRhaW5lZFBhZ2VVUkxDb3VudCgpIHtyZXR1cm4g
MDsgfQorc2l6ZV90IEljb25EYXRhYmFzZTo6aWNvblJlY29yZENvdW50KCkgeyByZXR1cm4gMDsg
fQorc2l6ZV90IEljb25EYXRhYmFzZTo6aWNvblJlY29yZENvdW50V2l0aERhdGEoKSB7IHJldHVy
biAwOyB9CisKK2Jvb2wgSWNvbkRhdGFiYXNlOjppc09wZW4oKSBjb25zdCB7IHJldHVybiBmYWxz
ZTsgfQorU3RyaW5nIEljb25EYXRhYmFzZTo6ZGF0YWJhc2VQYXRoKCkgY29uc3QgeyByZXR1cm4g
U3RyaW5nKCk7IH0KK1N0cmluZyBJY29uRGF0YWJhc2U6OmRlZmF1bHREYXRhYmFzZUZpbGVuYW1l
KCkgeyByZXR1cm4gU3RyaW5nKCk7IH0KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDog
V2ViQ29yZS9sb2FkZXIvaWNvbi93aW5jZS9JY29uRGF0YWJhc2VXaW5jZS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9sb2FkZXIvaWNvbi93aW5jZS9JY29uRGF0YWJhc2VXaW5jZS5jcHAJKHJl
dmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9sb2FkZXIvaWNvbi93aW5jZS9JY29uRGF0YWJhc2VX
aW5jZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqICBDb3B5cmln
aHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUgSW5jLgotICoKLSAqICBUaGlzIGxpYnJhcnkg
aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK
LSAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKLSAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRl
ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFO
WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVS
Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo
ZSBHTlUKLSAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls
cy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5
OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiAgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBG
bG9vciwKLSAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqCi0gKi8KLQotI2luY2x1
ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkljb25EYXRhYmFzZS5oIgotCi0jaW5jbHVkZSAiQXV0
b2RyYWluZWRQb29sLmgiCi0jaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIKLSNpbmNsdWRlICJG
aWxlU3lzdGVtLmgiCi0jaW5jbHVkZSAiSWNvbkRhdGFiYXNlQ2xpZW50LmgiCi0jaW5jbHVkZSAi
SWNvblJlY29yZC5oIgotI2luY2x1ZGUgIkltYWdlLmgiCi0jaW5jbHVkZSA8d3RmL3RleHQvQ1N0
cmluZy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLS8vIEZ1bmN0aW9uIHRvIG9idGFpbiB0
aGUgZ2xvYmFsIGljb24gZGF0YWJhc2UuCi1JY29uRGF0YWJhc2UqIGljb25EYXRhYmFzZSgpIHsg
cmV0dXJuIDA7IH0KLQotSWNvbkRhdGFiYXNlOjpJY29uRGF0YWJhc2UoKSB7fQotSWNvbkRhdGFi
YXNlOjp+SWNvbkRhdGFiYXNlKCkge30KLQotdm9pZCBJY29uRGF0YWJhc2U6OnNldENsaWVudChJ
Y29uRGF0YWJhc2VDbGllbnQqKSB7fQotCi1ib29sIEljb25EYXRhYmFzZTo6b3Blbihjb25zdCBT
dHJpbmcmIHBhdGgpIHsgcmV0dXJuIGZhbHNlOyB9Ci12b2lkIEljb25EYXRhYmFzZTo6Y2xvc2Uo
KSB7fQotCi12b2lkIEljb25EYXRhYmFzZTo6cmVtb3ZlQWxsSWNvbnMoKSB7fQotCi1JbWFnZSog
SWNvbkRhdGFiYXNlOjppY29uRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmLCBjb25zdCBJbnRTaXpl
JikgeyByZXR1cm4gMDsgfQotdm9pZCBJY29uRGF0YWJhc2U6OnJlYWRJY29uRm9yUGFnZVVSTEZy
b21EaXNrKGNvbnN0IFN0cmluZyYpIHt9Ci1TdHJpbmcgSWNvbkRhdGFiYXNlOjppY29uVVJMRm9y
UGFnZVVSTChjb25zdCBTdHJpbmcmKSB7IHJldHVybiBTdHJpbmcoKTsgfQotSW1hZ2UqIEljb25E
YXRhYmFzZTo6ZGVmYXVsdEljb24oY29uc3QgSW50U2l6ZSYpIHsgcmV0dXJuIDA7fQotCi12b2lk
IEljb25EYXRhYmFzZTo6cmV0YWluSWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJikge30KLXZv
aWQgSWNvbkRhdGFiYXNlOjpyZWxlYXNlSWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJikge30K
LQotdm9pZCBJY29uRGF0YWJhc2U6OnNldEljb25EYXRhRm9ySWNvblVSTChQYXNzUmVmUHRyPFNo
YXJlZEJ1ZmZlcj4gZGF0YSwgY29uc3QgU3RyaW5nJikge30KLXZvaWQgSWNvbkRhdGFiYXNlOjpz
ZXRJY29uVVJMRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmIGljb25VUkwsIGNvbnN0IFN0cmluZyYg
cGFnZVVSTCkge30KLQotSWNvbkxvYWREZWNpc2lvbiBJY29uRGF0YWJhc2U6OmxvYWREZWNpc2lv
bkZvckljb25VUkwoY29uc3QgU3RyaW5nJiwgRG9jdW1lbnRMb2FkZXIqKSB7IHJldHVybiBJY29u
TG9hZE5vOyB9Ci1ib29sIEljb25EYXRhYmFzZTo6aWNvbkRhdGFLbm93bkZvckljb25VUkwoY29u
c3QgU3RyaW5nJikgeyByZXR1cm4gZmFsc2U7IH0KLQotdm9pZCBJY29uRGF0YWJhc2U6OnNldEVu
YWJsZWQoYm9vbCBlbmFibGVkKSB7fQotYm9vbCBJY29uRGF0YWJhc2U6OmlzRW5hYmxlZCgpIGNv
bnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLXZvaWQgSWNvbkRhdGFiYXNlOjpzZXRQcml2YXRlQnJv
d3NpbmdFbmFibGVkKGJvb2wgZmxhZykge30KLWJvb2wgSWNvbkRhdGFiYXNlOjppc1ByaXZhdGVC
cm93c2luZ0VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi12b2lkIEljb25EYXRh
YmFzZTo6ZGVsYXlEYXRhYmFzZUNsZWFudXAoKSB7fQotdm9pZCBJY29uRGF0YWJhc2U6OmFsbG93
RGF0YWJhc2VDbGVhbnVwKCkge30KLXZvaWQgSWNvbkRhdGFiYXNlOjpjaGVja0ludGVncml0eUJl
Zm9yZU9wZW5pbmcoKSB7fQotCi0vLyBTdXBwb3J0IGZvciBXZWJDb3JlU3RhdGlzdGljcyBpbiBX
ZWJLaXQKLXNpemVfdCBJY29uRGF0YWJhc2U6OnBhZ2VVUkxNYXBwaW5nQ291bnQoKSB7IHJldHVy
biAwOyB9Ci1zaXplX3QgSWNvbkRhdGFiYXNlOjpyZXRhaW5lZFBhZ2VVUkxDb3VudCgpIHtyZXR1
cm4gMDsgfQotc2l6ZV90IEljb25EYXRhYmFzZTo6aWNvblJlY29yZENvdW50KCkgeyByZXR1cm4g
MDsgfQotc2l6ZV90IEljb25EYXRhYmFzZTo6aWNvblJlY29yZENvdW50V2l0aERhdGEoKSB7IHJl
dHVybiAwOyB9Ci0KLWJvb2wgSWNvbkRhdGFiYXNlOjppc09wZW4oKSBjb25zdCB7IHJldHVybiBm
YWxzZTsgfQotU3RyaW5nIEljb25EYXRhYmFzZTo6ZGF0YWJhc2VQYXRoKCkgY29uc3QgeyByZXR1
cm4gU3RyaW5nKCk7IH0KLVN0cmluZyBJY29uRGF0YWJhc2U6OmRlZmF1bHREYXRhYmFzZUZpbGVu
YW1lKCkgeyByZXR1cm4gU3RyaW5nKCk7IH0KLQotfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRl
eDogV2ViQ29yZS9wYWdlL3dpbmNlL0ZyYW1lV2luQ0UuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcGFnZS93aW5jZS9GcmFtZVdpbkNFLmNwcAkocmV2aXNpb24gNTcyODkpCShmcm9tIFdlYkNv
cmUvcGFnZS93aW5jZS9GcmFtZVdpbmNlLmNwcDo1NzI4OSkKKysrIFdlYkNvcmUvcGFnZS93aW5j
ZS9GcmFtZVdpbkNFLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgorCisjaW5jbHVkZSAiRG9j
dW1lbnQuaCIKKyNpbmNsdWRlICJFZGl0b3JDbGllbnQuaCIKKyNpbmNsdWRlICJGbG9hdFJlY3Qu
aCIKKyNpbmNsdWRlICJGcmFtZUxvYWRlci5oIgorI2luY2x1ZGUgIkZyYW1lTG9hZFJlcXVlc3Qu
aCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIK
KyNpbmNsdWRlICJIVE1MSUZyYW1lRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgor
I2luY2x1ZGUgIkhUTUxUYWJsZUNlbGxFbGVtZW50LmgiCisjaW5jbHVkZSAiS2V5Ym9hcmRFdmVu
dC5oIgorI2luY2x1ZGUgIk5QX2pzb2JqZWN0LmgiCisjaW5jbHVkZSAibnBydW50aW1lX2ltcGwu
aCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAiUGx1Z2luLmgiCisjaW5jbHVkZSAiUmVn
dWxhckV4cHJlc3Npb24uaCIKKyNpbmNsdWRlICJSZW5kZXJGcmFtZS5oIgorI2luY2x1ZGUgIlJl
bmRlclRhYmxlQ2VsbC5oIgorI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKKyNpbmNsdWRlICJSZXNv
dXJjZUhhbmRsZS5oIgorI2luY2x1ZGUgInJ1bnRpbWVfcm9vdC5oIgorI2luY2x1ZGUgIlNldHRp
bmdzLmgiCisjaW5jbHVkZSAiVGV4dFJlc291cmNlRGVjb2Rlci5oIgorCisjaW5jbHVkZSA8d2lu
ZG93cy5oPgorCit1c2luZyBzdGQ6Om1pbjsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit1c2lu
ZyBuYW1lc3BhY2UgSFRNTE5hbWVzOworCitleHRlcm4gSERDIGdfc2NyZWVuREM7CisKK3ZvaWQg
Y29tcHV0ZVBhZ2VSZWN0c0ZvckZyYW1lKEZyYW1lKiBmcmFtZSwgY29uc3QgSW50UmVjdCYgcHJp
bnRSZWN0LCBmbG9hdCBoZWFkZXJIZWlnaHQsIGZsb2F0IGZvb3RlckhlaWdodCwgZmxvYXQgdXNl
clNjYWxlRmFjdG9yLCBWZWN0b3I8SW50UmVjdD4mIHBhZ2VzLCBpbnQmIG91dFBhZ2VIZWlnaHQp
Cit7CisgICAgQVNTRVJUKGZyYW1lKTsKKworICAgIHBhZ2VzLmNsZWFyKCk7CisgICAgb3V0UGFn
ZUhlaWdodCA9IDA7CisKKyAgICBpZiAoIWZyYW1lLT5kb2N1bWVudCgpIHx8ICFmcmFtZS0+dmll
dygpIHx8ICFmcmFtZS0+ZG9jdW1lbnQoKS0+cmVuZGVyZXIoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgUmVuZGVyVmlldyogcm9vdCA9IHRvUmVuZGVyVmlldyhmcmFtZS0+ZG9jdW1lbnQoKS0+
cmVuZGVyZXIoKSk7CisKKyAgICBpZiAoIXJvb3QpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJkb2N1
bWVudCB0byBiZSBwcmludGVkIGhhcyBubyByZW5kZXJlciIpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgaWYgKHVzZXJTY2FsZUZhY3RvciA8PSAwKSB7CisgICAgICAgIExPR19FUlJP
UigidXNlclNjYWxlRmFjdG9yIGhhcyBiYWQgdmFsdWUgJS4yZiIsIHVzZXJTY2FsZUZhY3Rvcik7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmbG9hdCByYXRpbyA9IChmbG9hdClwcmlu
dFJlY3QuaGVpZ2h0KCkgLyAoZmxvYXQpcHJpbnRSZWN0LndpZHRoKCk7CisKKyAgICBmbG9hdCBw
YWdlV2lkdGggID0gKGZsb2F0KSByb290LT5vdmVyZmxvd1dpZHRoKCk7CisgICAgZmxvYXQgcGFn
ZUhlaWdodCA9IHBhZ2VXaWR0aCAqIHJhdGlvOworICAgIG91dFBhZ2VIZWlnaHQgPSAoaW50KSBw
YWdlSGVpZ2h0OyAgIC8vIHRoaXMgaXMgdGhlIGhlaWdodCBvZiB0aGUgcGFnZSBhZGp1c3RlZCBi
eSBtYXJnaW5zCisgICAgcGFnZUhlaWdodCAtPSAoaGVhZGVySGVpZ2h0ICsgZm9vdGVySGVpZ2h0
KTsKKworICAgIGlmIChwYWdlSGVpZ2h0IDw9IDApIHsKKyAgICAgICAgTE9HX0VSUk9SKCJwYWdl
SGVpZ2h0IGhhcyBiYWQgdmFsdWUgJS4yZiIsIHBhZ2VIZWlnaHQpOworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgZmxvYXQgY3VyclBhZ2VIZWlnaHQgPSBwYWdlSGVpZ2h0IC8gdXNlclNj
YWxlRmFjdG9yOworICAgIGZsb2F0IGRvY0hlaWdodCAgICAgID0gcm9vdC0+bGF5ZXIoKS0+aGVp
Z2h0KCk7CisgICAgZmxvYXQgZG9jV2lkdGggICAgICAgPSByb290LT5sYXllcigpLT53aWR0aCgp
OworICAgIGZsb2F0IGN1cnJQYWdlV2lkdGggID0gcGFnZVdpZHRoIC8gdXNlclNjYWxlRmFjdG9y
OworCisKKyAgICAvLyBhbHdheXMgcmV0dXJuIGF0IGxlYXN0IG9uZSBwYWdlLCBzaW5jZSBlbXB0
eSBmaWxlcyBzaG91bGQgcHJpbnQgYSBibGFuayBwYWdlCisgICAgZmxvYXQgcHJpbnRlZFBhZ2Vz
SGVpZ2h0ID0gMC4wOworICAgIGRvIHsKKyAgICAgICAgZmxvYXQgcHJvcG9zZWRCb3R0b20gPSBt
aW4oZG9jSGVpZ2h0LCBwcmludGVkUGFnZXNIZWlnaHQgKyBwYWdlSGVpZ2h0KTsKKyAgICAgICAg
ZnJhbWUtPnZpZXcoKS0+YWRqdXN0UGFnZUhlaWdodCgmcHJvcG9zZWRCb3R0b20sIHByaW50ZWRQ
YWdlc0hlaWdodCwgcHJvcG9zZWRCb3R0b20sIHByaW50ZWRQYWdlc0hlaWdodCk7CisgICAgICAg
IGN1cnJQYWdlSGVpZ2h0ID0gbWF4KDEuMGYsIHByb3Bvc2VkQm90dG9tIC0gcHJpbnRlZFBhZ2Vz
SGVpZ2h0KTsKKworICAgICAgICBwYWdlcy5hcHBlbmQoSW50UmVjdCgwLCBwcmludGVkUGFnZXNI
ZWlnaHQsIGN1cnJQYWdlV2lkdGgsIGN1cnJQYWdlSGVpZ2h0KSk7CisgICAgICAgIHByaW50ZWRQ
YWdlc0hlaWdodCArPSBjdXJyUGFnZUhlaWdodDsKKyAgICB9IHdoaWxlIChwcmludGVkUGFnZXNI
ZWlnaHQgPCBkb2NIZWlnaHQpOworfQorCitIQklUTUFQIGltYWdlRnJvbVNlbGVjdGlvbihGcmFt
ZSogZnJhbWUsIGJvb2wgZm9yY2VCbGFja1RleHQpCit7CisgICAgaWYgKCFmcmFtZS0+dmlldygp
KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZyYW1lLT52aWV3KCktPnNldFBhaW50UmVzdHJp
Y3Rpb24oZm9yY2VCbGFja1RleHQgPyBQYWludFJlc3RyaWN0aW9uU2VsZWN0aW9uT25seUJsYWNr
VGV4dCA6IFBhaW50UmVzdHJpY3Rpb25TZWxlY3Rpb25Pbmx5KTsKKyAgICBGbG9hdFJlY3QgZnIg
PSBmcmFtZS0+c2VsZWN0aW9uQm91bmRzKCk7CisgICAgSW50UmVjdCBpcigoaW50KWZyLngoKSwg
KGludClmci55KCksIChpbnQpZnIud2lkdGgoKSwgKGludClmci5oZWlnaHQoKSk7CisgICAgaWYg
KGlyLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpbnQgdzsKKyAgICBpbnQg
aDsKKyAgICBGcmFtZVZpZXcqIHZpZXcgPSBmcmFtZS0+dmlldygpOworICAgIGlmICh2aWV3LT5w
YXJlbnQoKSkgeworICAgICAgICBpci5zZXRMb2NhdGlvbih2aWV3LT5wYXJlbnQoKS0+Y29udmVy
dENoaWxkVG9TZWxmKHZpZXcsIGlyLmxvY2F0aW9uKCkpKTsKKyAgICAgICAgdyA9IGlyLndpZHRo
KCkgKiB2aWV3LT5zY2FsZSgpICsgMC41OworICAgICAgICBoID0gaXIuaGVpZ2h0KCkgKiB2aWV3
LT5zY2FsZSgpICsgMC41OworICAgIH0gZWxzZSB7CisgICAgICAgIGlyID0gdmlldy0+Y29udGVu
dHNUb1dpbmRvdyhpcik7CisgICAgICAgIHcgPSBpci53aWR0aCgpOworICAgICAgICBoID0gaXIu
aGVpZ2h0KCk7CisgICAgfQorCisgICAgT3duUHRyPEhEQz4gYm1wREMoQ3JlYXRlQ29tcGF0aWJs
ZURDKGdfc2NyZWVuREMpKTsKKyAgICBIQklUTUFQIGhCbXAgPSBNZW1vcnlNYW5hZ2VyOjpjcmVh
dGVDb21wYXRpYmxlQml0bWFwKGdfc2NyZWVuREMsIHcsIGgpOworICAgIGlmICghaEJtcCkKKyAg
ICAgICAgcmV0dXJuIDA7CisKKyAgICBIQklUTUFQIGhibXBPbGQgPSAoSEJJVE1BUClTZWxlY3RP
YmplY3QoYm1wREMuZ2V0KCksIGhCbXApOworCisgICAgeworICAgICAgICBHcmFwaGljc0NvbnRl
eHQgZ2MoYm1wREMuZ2V0KCkpOworICAgICAgICBmcmFtZS0+ZG9jdW1lbnQoKS0+dXBkYXRlTGF5
b3V0KCk7CisgICAgICAgIHZpZXctPnBhaW50KCZnYywgaXIpOworICAgIH0KKworICAgIFNlbGVj
dE9iamVjdChibXBEQy5nZXQoKSwgaGJtcE9sZCk7CisKKyAgICBmcmFtZS0+dmlldygpLT5zZXRQ
YWludFJlc3RyaWN0aW9uKFBhaW50UmVzdHJpY3Rpb25Ob25lKTsKKworICAgIHJldHVybiBoQm1w
OworfQorCitEcmFnSW1hZ2VSZWYgRnJhbWU6OmRyYWdJbWFnZUZvclNlbGVjdGlvbigpCit7Cisg
ICAgaWYgKHNlbGVjdGlvbigpLT5pc1JhbmdlKCkpCisgICAgICAgIHJldHVybiBpbWFnZUZyb21T
ZWxlY3Rpb24odGhpcywgZmFsc2UpOworCisgICAgcmV0dXJuIDA7Cit9CisKK30gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGFnZS93aW5jZS9GcmFtZVdpbmNlLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3BhZ2Uvd2luY2UvRnJhbWVXaW5jZS5jcHAJKHJldmlzaW9uIDU3
Mjg5KQorKysgV2ViQ29yZS9wYWdlL3dpbmNlL0ZyYW1lV2luY2UuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0xLDE2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxl
IEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBU
b3JjaCBNb2JpbGUsIEluYy4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJl
IG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUg
IkZyYW1lLmgiCi0KLSNpbmNsdWRlICJEb2N1bWVudC5oIgotI2luY2x1ZGUgIkVkaXRvckNsaWVu
dC5oIgotI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgotI2luY2x1ZGUgIkZyYW1lTG9hZGVyLmgiCi0j
aW5jbHVkZSAiRnJhbWVMb2FkUmVxdWVzdC5oIgotI2luY2x1ZGUgIkZyYW1lVmlldy5oIgotI2lu
Y2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgotI2luY2x1ZGUgIkhUTUxJRnJhbWVFbGVtZW50Lmgi
Ci0jaW5jbHVkZSAiSFRNTE5hbWVzLmgiCi0jaW5jbHVkZSAiSFRNTFRhYmxlQ2VsbEVsZW1lbnQu
aCIKLSNpbmNsdWRlICJLZXlib2FyZEV2ZW50LmgiCi0jaW5jbHVkZSAiTlBfanNvYmplY3QuaCIK
LSNpbmNsdWRlICJucHJ1bnRpbWVfaW1wbC5oIgotI2luY2x1ZGUgIlBhZ2UuaCIKLSNpbmNsdWRl
ICJQbHVnaW4uaCIKLSNpbmNsdWRlICJSZWd1bGFyRXhwcmVzc2lvbi5oIgotI2luY2x1ZGUgIlJl
bmRlckZyYW1lLmgiCi0jaW5jbHVkZSAiUmVuZGVyVGFibGVDZWxsLmgiCi0jaW5jbHVkZSAiUmVu
ZGVyVmlldy5oIgotI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlLmgiCi0jaW5jbHVkZSAicnVudGlt
ZV9yb290LmgiCi0jaW5jbHVkZSAiU2V0dGluZ3MuaCIKLSNpbmNsdWRlICJUZXh0UmVzb3VyY2VE
ZWNvZGVyLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLXVzaW5nIHN0ZDo6bWluOwotCi1u
YW1lc3BhY2UgV2ViQ29yZSB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7Ci0KLWV4dGVy
biBIREMgZ19zY3JlZW5EQzsKLQotdm9pZCBjb21wdXRlUGFnZVJlY3RzRm9yRnJhbWUoRnJhbWUq
IGZyYW1lLCBjb25zdCBJbnRSZWN0JiBwcmludFJlY3QsIGZsb2F0IGhlYWRlckhlaWdodCwgZmxv
YXQgZm9vdGVySGVpZ2h0LCBmbG9hdCB1c2VyU2NhbGVGYWN0b3IsIFZlY3RvcjxJbnRSZWN0PiYg
cGFnZXMsIGludCYgb3V0UGFnZUhlaWdodCkKLXsKLSAgICBBU1NFUlQoZnJhbWUpOwotCi0gICAg
cGFnZXMuY2xlYXIoKTsKLSAgICBvdXRQYWdlSGVpZ2h0ID0gMDsKLQotICAgIGlmICghZnJhbWUt
PmRvY3VtZW50KCkgfHwgIWZyYW1lLT52aWV3KCkgfHwgIWZyYW1lLT5kb2N1bWVudCgpLT5yZW5k
ZXJlcigpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBSZW5kZXJWaWV3KiByb290ID0gdG9SZW5k
ZXJWaWV3KGZyYW1lLT5kb2N1bWVudCgpLT5yZW5kZXJlcigpKTsKLQotICAgIGlmICghcm9vdCkg
ewotICAgICAgICBMT0dfRVJST1IoImRvY3VtZW50IHRvIGJlIHByaW50ZWQgaGFzIG5vIHJlbmRl
cmVyIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAodXNlclNjYWxlRmFjdG9y
IDw9IDApIHsKLSAgICAgICAgTE9HX0VSUk9SKCJ1c2VyU2NhbGVGYWN0b3IgaGFzIGJhZCB2YWx1
ZSAlLjJmIiwgdXNlclNjYWxlRmFjdG9yKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAg
IGZsb2F0IHJhdGlvID0gKGZsb2F0KXByaW50UmVjdC5oZWlnaHQoKSAvIChmbG9hdClwcmludFJl
Y3Qud2lkdGgoKTsKLQotICAgIGZsb2F0IHBhZ2VXaWR0aCAgPSAoZmxvYXQpIHJvb3QtPm92ZXJm
bG93V2lkdGgoKTsKLSAgICBmbG9hdCBwYWdlSGVpZ2h0ID0gcGFnZVdpZHRoICogcmF0aW87Ci0g
ICAgb3V0UGFnZUhlaWdodCA9IChpbnQpIHBhZ2VIZWlnaHQ7ICAgLy8gdGhpcyBpcyB0aGUgaGVp
Z2h0IG9mIHRoZSBwYWdlIGFkanVzdGVkIGJ5IG1hcmdpbnMKLSAgICBwYWdlSGVpZ2h0IC09ICho
ZWFkZXJIZWlnaHQgKyBmb290ZXJIZWlnaHQpOwotCi0gICAgaWYgKHBhZ2VIZWlnaHQgPD0gMCkg
ewotICAgICAgICBMT0dfRVJST1IoInBhZ2VIZWlnaHQgaGFzIGJhZCB2YWx1ZSAlLjJmIiwgcGFn
ZUhlaWdodCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmbG9hdCBjdXJyUGFnZUhl
aWdodCA9IHBhZ2VIZWlnaHQgLyB1c2VyU2NhbGVGYWN0b3I7Ci0gICAgZmxvYXQgZG9jSGVpZ2h0
ICAgICAgPSByb290LT5sYXllcigpLT5oZWlnaHQoKTsKLSAgICBmbG9hdCBkb2NXaWR0aCAgICAg
ICA9IHJvb3QtPmxheWVyKCktPndpZHRoKCk7Ci0gICAgZmxvYXQgY3VyclBhZ2VXaWR0aCAgPSBw
YWdlV2lkdGggLyB1c2VyU2NhbGVGYWN0b3I7Ci0KLQotICAgIC8vIGFsd2F5cyByZXR1cm4gYXQg
bGVhc3Qgb25lIHBhZ2UsIHNpbmNlIGVtcHR5IGZpbGVzIHNob3VsZCBwcmludCBhIGJsYW5rIHBh
Z2UKLSAgICBmbG9hdCBwcmludGVkUGFnZXNIZWlnaHQgPSAwLjA7Ci0gICAgZG8gewotICAgICAg
ICBmbG9hdCBwcm9wb3NlZEJvdHRvbSA9IG1pbihkb2NIZWlnaHQsIHByaW50ZWRQYWdlc0hlaWdo
dCArIHBhZ2VIZWlnaHQpOwotICAgICAgICBmcmFtZS0+dmlldygpLT5hZGp1c3RQYWdlSGVpZ2h0
KCZwcm9wb3NlZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0LCBwcm9wb3NlZEJvdHRvbSwgcHJp
bnRlZFBhZ2VzSGVpZ2h0KTsKLSAgICAgICAgY3VyclBhZ2VIZWlnaHQgPSBtYXgoMS4wZiwgcHJv
cG9zZWRCb3R0b20gLSBwcmludGVkUGFnZXNIZWlnaHQpOwotCi0gICAgICAgIHBhZ2VzLmFwcGVu
ZChJbnRSZWN0KDAsIHByaW50ZWRQYWdlc0hlaWdodCwgY3VyclBhZ2VXaWR0aCwgY3VyclBhZ2VI
ZWlnaHQpKTsKLSAgICAgICAgcHJpbnRlZFBhZ2VzSGVpZ2h0ICs9IGN1cnJQYWdlSGVpZ2h0Owot
ICAgIH0gd2hpbGUgKHByaW50ZWRQYWdlc0hlaWdodCA8IGRvY0hlaWdodCk7Ci19Ci0KLUhCSVRN
QVAgaW1hZ2VGcm9tU2VsZWN0aW9uKEZyYW1lKiBmcmFtZSwgYm9vbCBmb3JjZUJsYWNrVGV4dCkK
LXsKLSAgICBpZiAoIWZyYW1lLT52aWV3KCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgZnJh
bWUtPnZpZXcoKS0+c2V0UGFpbnRSZXN0cmljdGlvbihmb3JjZUJsYWNrVGV4dCA/IFBhaW50UmVz
dHJpY3Rpb25TZWxlY3Rpb25Pbmx5QmxhY2tUZXh0IDogUGFpbnRSZXN0cmljdGlvblNlbGVjdGlv
bk9ubHkpOwotICAgIEZsb2F0UmVjdCBmciA9IGZyYW1lLT5zZWxlY3Rpb25Cb3VuZHMoKTsKLSAg
ICBJbnRSZWN0IGlyKChpbnQpZnIueCgpLCAoaW50KWZyLnkoKSwgKGludClmci53aWR0aCgpLCAo
aW50KWZyLmhlaWdodCgpKTsKLSAgICBpZiAoaXIuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4g
MDsKLQotICAgIGludCB3OwotICAgIGludCBoOwotICAgIEZyYW1lVmlldyogdmlldyA9IGZyYW1l
LT52aWV3KCk7Ci0gICAgaWYgKHZpZXctPnBhcmVudCgpKSB7Ci0gICAgICAgIGlyLnNldExvY2F0
aW9uKHZpZXctPnBhcmVudCgpLT5jb252ZXJ0Q2hpbGRUb1NlbGYodmlldywgaXIubG9jYXRpb24o
KSkpOwotICAgICAgICB3ID0gaXIud2lkdGgoKSAqIHZpZXctPnNjYWxlKCkgKyAwLjU7Ci0gICAg
ICAgIGggPSBpci5oZWlnaHQoKSAqIHZpZXctPnNjYWxlKCkgKyAwLjU7Ci0gICAgfSBlbHNlIHsK
LSAgICAgICAgaXIgPSB2aWV3LT5jb250ZW50c1RvV2luZG93KGlyKTsKLSAgICAgICAgdyA9IGly
LndpZHRoKCk7Ci0gICAgICAgIGggPSBpci5oZWlnaHQoKTsKLSAgICB9Ci0KLSAgICBPd25QdHI8
SERDPiBibXBEQyhDcmVhdGVDb21wYXRpYmxlREMoZ19zY3JlZW5EQykpOwotICAgIEhCSVRNQVAg
aEJtcCA9IE1lbW9yeU1hbmFnZXI6OmNyZWF0ZUNvbXBhdGlibGVCaXRtYXAoZ19zY3JlZW5EQywg
dywgaCk7Ci0gICAgaWYgKCFoQm1wKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIEhCSVRNQVAg
aGJtcE9sZCA9IChIQklUTUFQKVNlbGVjdE9iamVjdChibXBEQy5nZXQoKSwgaEJtcCk7Ci0KLSAg
ICB7Ci0gICAgICAgIEdyYXBoaWNzQ29udGV4dCBnYyhibXBEQy5nZXQoKSk7Ci0gICAgICAgIGZy
YW1lLT5kb2N1bWVudCgpLT51cGRhdGVMYXlvdXQoKTsKLSAgICAgICAgdmlldy0+cGFpbnQoJmdj
LCBpcik7Ci0gICAgfQotCi0gICAgU2VsZWN0T2JqZWN0KGJtcERDLmdldCgpLCBoYm1wT2xkKTsK
LQotICAgIGZyYW1lLT52aWV3KCktPnNldFBhaW50UmVzdHJpY3Rpb24oUGFpbnRSZXN0cmljdGlv
bk5vbmUpOwotCi0gICAgcmV0dXJuIGhCbXA7Ci19Ci0KLURyYWdJbWFnZVJlZiBGcmFtZTo6ZHJh
Z0ltYWdlRm9yU2VsZWN0aW9uKCkKLXsKLSAgICBpZiAoc2VsZWN0aW9uKCktPmlzUmFuZ2UoKSkK
LSAgICAgICAgcmV0dXJuIGltYWdlRnJvbVNlbGVjdGlvbih0aGlzLCBmYWxzZSk7Ci0KLSAgICBy
ZXR1cm4gMDsKLX0KLQotfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9NZWRpYVBsYXllci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9NZWRpYVBsYXllci5jcHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9NZWRpYVBsYXllci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ0
LDcgKzQ0LDcgQEAKICNpZiBQTEFURk9STShNQUMpCiAjaW5jbHVkZSAiTWVkaWFQbGF5ZXJQcml2
YXRlUVRLaXQuaCIKICNlbGlmIE9TKFdJTkNFKSAmJiAhUExBVEZPUk0oUVQpCi0jaW5jbHVkZSAi
TWVkaWFQbGF5ZXJQcml2YXRlV2luY2UuaCIKKyNpbmNsdWRlICJNZWRpYVBsYXllclByaXZhdGVX
aW5DRS5oIgogI2VsaWYgUExBVEZPUk0oV0lOKQogI2luY2x1ZGUgIk1lZGlhUGxheWVyUHJpdmF0
ZVF1aWNrVGltZVdpbi5oIgogI2VsaWYgUExBVEZPUk0oR1RLKQpJbmRleDogV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9Db2xvcldpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0NvbG9yV2luQ0UuY3BwCShyZXZpc2lvbiA1NzI4OSkJ
KGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9Db2xvcldpbmNlLmNwcDo1NzI4
OSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvQ29sb3JXaW5DRS5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDct
MjAwOCBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisg
KiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl
ciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv
cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7
IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElU
WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICog
IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBm
aWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAg
Qm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJDb2xvci5oIgorCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCitDb2xvciBmb2N1c1JpbmdDb2xvcigpCit7CisgICAgcmV0
dXJuIENvbG9yKDAsIDAsIDApOworfQorCit2b2lkIHNldEZvY3VzUmluZ0NvbG9yQ2hhbmdlRnVu
Y3Rpb24odm9pZCAoKikoKSkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0Nv
bG9yV2luY2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
Y2UvQ29sb3JXaW5jZS5jcHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW5jZS9Db2xvcldpbmNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSwzOCArMCww
IEBACi0vKgotICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRvcmNoIE1vYmlsZSwgSW5jLgot
ICoKLSAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1
dGUgaXQgYW5kL29yCi0gKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs
LAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk
IHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk
IGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3Qs
IHdyaXRlIHRvCi0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVT
QS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkNvbG9yLmgiCi0K
LSNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLUNv
bG9yIGZvY3VzUmluZ0NvbG9yKCkKLXsKLSAgICByZXR1cm4gQ29sb3IoMCwgMCwgMCk7Ci19Ci0K
LXZvaWQgc2V0Rm9jdXNSaW5nQ29sb3JDaGFuZ2VGdW5jdGlvbih2b2lkICgqKSgpKQotewotICAg
IG5vdEltcGxlbWVudGVkKCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvRm9udENhY2hlV2luQ0UuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvRm9udENhY2hlV2luQ0UuY3Bw
CShyZXZpc2lvbiA1NzI4OSkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9G
b250Q2FjaGVXaW5jZS5jcHA6NTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL0ZvbnRDYWNoZVdpbkNFLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM1MiBAQAor
LyoKKyogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5j
LgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisqIGFyZSBtZXQ6CisqCisqIDEuICBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLiAKKyogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisqICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisqICAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLiAKKyogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIElu
Yy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyogICAgIGl0cyBjb250cmlidXRvcnMgbWF5
IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyogICAgIGZy
b20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lv
bi4gCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05U
UklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyogV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
IEFSRQorKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisqIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsKKyogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisqIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRgorKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIkZvbnRDYWNoZS5oIgorCisjaW5jbHVkZSAiRm9udC5oIgorI2luY2x1ZGUgIkZv
bnREYXRhLmgiCisjaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIKKyNpbmNsdWRlICJVbmljb2Rl
UmFuZ2UuaCIKKyNpbmNsdWRlICJ3dGYvT3duUHRyLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+
CisjaW5jbHVkZSA8bWxhbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitleHRlcm4gSERD
IGdfc2NyZWVuREM7CisKK3N0YXRpYyBJTXVsdGlMYW5ndWFnZSAqbXVsdGlMYW5ndWFnZSA9IDA7
CisKKyNpZiBkZWZpbmVkKElNTEFOR19GT05UX0xJTkspICYmIChJTUxBTkdfRk9OVF9MSU5LID09
IDIpCitzdGF0aWMgSU1MYW5nRm9udExpbmsyKiBsYW5nRm9udExpbmsgPSAwOworI2Vsc2UKK3N0
YXRpYyBJTUxhbmdGb250TGluayogbGFuZ0ZvbnRMaW5rID0gMDsKKyNlbmRpZgorCitJTXVsdGlM
YW5ndWFnZSogZ2V0TXVsdGlMYW5ndWFnZUludGVyZmFjZSgpCit7CisgICAgaWYgKCFtdWx0aUxh
bmd1YWdlKQorICAgICAgICBDb0NyZWF0ZUluc3RhbmNlKENMU0lEX0NNdWx0aUxhbmd1YWdlLCAw
LCBDTFNDVFhfSU5QUk9DX1NFUlZFUiwgSUlEX0lNdWx0aUxhbmd1YWdlLCAodm9pZCoqKSZtdWx0
aUxhbmd1YWdlKTsKKworICAgIHJldHVybiBtdWx0aUxhbmd1YWdlOworfQorCisjaWYgZGVmaW5l
ZChJTUxBTkdfRk9OVF9MSU5LKSAmJiAoSU1MQU5HX0ZPTlRfTElOSyA9PSAyKQorSU1MYW5nRm9u
dExpbmsyKiBGb250Q2FjaGU6OmdldEZvbnRMaW5rSW50ZXJmYWNlKCkKKyNlbHNlCitJTUxhbmdG
b250TGluayogRm9udENhY2hlOjpnZXRGb250TGlua0ludGVyZmFjZSgpCisjZW5kaWYKK3sKKyAg
ICBpZiAoIWxhbmdGb250TGluaykgeworICAgICAgICBpZiAoSU11bHRpTGFuZ3VhZ2UqIG1saSA9
IGdldE11bHRpTGFuZ3VhZ2VJbnRlcmZhY2UoKSkKKyAgICAgICAgICAgIG1saS0+UXVlcnlJbnRl
cmZhY2UoJmxhbmdGb250TGluayk7CisgICAgfQorCisgICAgcmV0dXJuIGxhbmdGb250TGluazsK
K30KKworI2lmIGRlZmluZWQoSU1MQU5HX0ZPTlRfTElOSykgJiYgKElNTEFOR19GT05UX0xJTksg
PT0gMikKK3N0YXRpYyBib29sIGN1cnJlbnRGb250Q29udGFpbnNDaGFyYWN0ZXIoSU1MYW5nRm9u
dExpbmsyKiBsYW5nRm9udExpbmssIEhEQyBoZGMsIFVDaGFyIGNoYXJhY3RlcikKK3sKKyAgICBV
SU5UIHVuaWNvZGVSYW5nZXM7CisgICAgaWYgKFNfT0sgIT0gbGFuZ0ZvbnRMaW5rLT5HZXRGb250
VW5pY29kZVJhbmdlcyhoZGMsICZ1bmljb2RlUmFuZ2VzLCAwKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgc3RhdGljIFZlY3RvcjxVTklDT0RFUkFOR0UsIDY0PiBnbHlwaHNldEJ1ZmZl
cjsKKyAgICBnbHlwaHNldEJ1ZmZlci5yZXNpemUodW5pY29kZVJhbmdlcyk7CisKKyAgICBpZiAo
U19PSyAhPSBsYW5nRm9udExpbmstPkdldEZvbnRVbmljb2RlUmFuZ2VzKGhkYywgJnVuaWNvZGVS
YW5nZXMsIGdseXBoc2V0QnVmZmVyLmRhdGEoKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIC8vIEZJWE1FOiBDaGFuZ2UgdGhpcyB0byBhIGJpbmFyeSBzZWFyY2guIChZb25nIExpOiBU
aGF0J3MgZWFzeS4gQnV0LCBpcyBpdCBndWFyYW50ZWVkIHRoYXQgdGhlIHJhbmdlcyBhcmUgc29y
dGVkPykKKyAgICBmb3IgKFZlY3RvcjxVTklDT0RFUkFOR0UsIDY0Pjo6Y29uc3RfaXRlcmF0b3Ig
aSA9IGdseXBoc2V0QnVmZmVyLmJlZ2luKCk7IGkgIT0gZ2x5cGhzZXRCdWZmZXIuZW5kKCk7ICsr
aSkgeworICAgICAgICBpZiAoaS0+d2NUbyA+PSBjaGFyYWN0ZXIpCisgICAgICAgICAgICByZXR1
cm4gaS0+d2NGcm9tIDw9IGNoYXJhY3RlcjsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9
CisjZWxzZQorc3RhdGljIGJvb2wgY3VycmVudEZvbnRDb250YWluc0NoYXJhY3RlcihJTUxhbmdG
b250TGluayogbGFuZ0ZvbnRMaW5rLCBIREMgaGRjLCBIRk9OVCBoZm9udCwgVUNoYXIgY2hhcmFj
dGVyLCBjb25zdCB3Y2hhcl90KiBmYWNlTmFtZSkKK3sKKyAgICBEV09SRCBmb250Q29kZVBhZ2Vz
ID0gMCwgY2hhckNvZGVQYWdlcyA9IDA7CisgICAgSFJFU1VMVCByZXN1bHQgPSBsYW5nRm9udExp
bmstPkdldEZvbnRDb2RlUGFnZXMoaGRjLCBoZm9udCwgJmZvbnRDb2RlUGFnZXMpOworICAgIGlm
IChyZXN1bHQgIT0gU19PSykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJlc3VsdCA9IGxh
bmdGb250TGluay0+R2V0Q2hhckNvZGVQYWdlcyhjaGFyYWN0ZXIsICZjaGFyQ29kZVBhZ2VzKTsK
KyAgICBpZiAocmVzdWx0ICE9IFNfT0spCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGZv
bnRDb2RlUGFnZXMgfD0gRm9udFBsYXRmb3JtRGF0YTo6Z2V0S25vd25Gb250Q29kZVBhZ2VzKGZh
Y2VOYW1lKTsKKyAgICBpZiAoZm9udENvZGVQYWdlcyAmIGNoYXJDb2RlUGFnZXMpCisgICAgICAg
IHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworfQorI2VuZGlmCisKKyNpZiBkZWZp
bmVkKElNTEFOR19GT05UX0xJTkspICYmIChJTUxBTkdfRk9OVF9MSU5LID09IDIpCitzdGF0aWMg
SEZPTlQgY3JlYXRlTUxhbmdGb250KElNTGFuZ0ZvbnRMaW5rMiogbGFuZ0ZvbnRMaW5rLCBIREMg
aGRjLCBEV09SRCBjb2RlUGFnZU1hc2ssIFVDaGFyIGNoYXJhY3RlciA9IDApCit7CisgICAgSEZP
TlQgbWxhbmdGb250OworICAgIGlmIChTVUNDRUVERUQobGFuZ0ZvbnRMaW5rLT5NYXBGb250KGhk
YywgY29kZVBhZ2VNYXNrLCBjaGFyYWN0ZXIsICZtbGFuZ0ZvbnQpKSkKKyAgICAgICAgcmV0dXJu
IG1sYW5nRm9udDsKKworICAgIHJldHVybiAwOworfQorI2Vsc2UKK3N0YXRpYyBIRk9OVCBjcmVh
dGVNTGFuZ0ZvbnQoSU1MYW5nRm9udExpbmsqIGxhbmdGb250TGluaywgSERDIGhkYywgY29uc3Qg
Rm9udFBsYXRmb3JtRGF0YSYgcmVmRm9udCwgRFdPUkQgY29kZVBhZ2VNYXNrKQoreworICAgIEhG
T05UIG1sYW5nRm9udDsKKyAgICBMUkVTVUxUIHJlc3VsdCA9IGxhbmdGb250TGluay0+TWFwRm9u
dChoZGMsIGNvZGVQYWdlTWFzaywgcmVmRm9udC5oZm9udCgpLCAmbWxhbmdGb250KTsKKworICAg
IHJldHVybiByZXN1bHQgPT0gU19PSyA/IG1sYW5nRm9udCA6IDA7Cit9CisjZW5kaWYKKworc3Rh
dGljIGNvbnN0IFZlY3RvcjxEV09SRCwgND4mIGdldENKS0NvZGVQYWdlTWFza3MoKQoreworICAg
IC8vIFRoZSBkZWZhdWx0IG9yZGVyIGluIHdoaWNoIHdlIGxvb2sgZm9yIGEgZm9udCBmb3IgYSBD
SksgY2hhcmFjdGVyLiBJZiB0aGUgdXNlcidzIGRlZmF1bHQgY29kZSBwYWdlIGlzCisgICAgLy8g
b25lIG9mIHRoZXNlLCB3ZSB3aWxsIHVzZSBpdCBmaXJzdC4KKyAgICBzdGF0aWMgY29uc3QgVUlO
VCBDSktDb2RlUGFnZXNbXSA9IHsKKyAgICAgICAgOTMyLCAvKiBKYXBhbmVzZSAqLworICAgICAg
ICA5MzYsIC8qIFNpbXBsaWZpZWQgQ2hpbmVzZSAqLworICAgICAgICA5NTAsIC8qIFRyYWRpdGlv
bmFsIENoaW5lc2UgKi8KKyAgICAgICAgOTQ5ICAvKiBLb3JlYW4gKi8KKyAgICB9OworCisgICAg
c3RhdGljIFZlY3RvcjxEV09SRCwgND4gY29kZVBhZ2VNYXNrczsKKyAgICBzdGF0aWMgYm9vbCBp
bml0aWFsaXplZDsKKyAgICBpZiAoIWluaXRpYWxpemVkKSB7CisgICAgICAgIGluaXRpYWxpemVk
ID0gdHJ1ZTsKKyNpZiBkZWZpbmVkKElNTEFOR19GT05UX0xJTkspICYmIChJTUxBTkdfRk9OVF9M
SU5LID09IDIpCisgICAgICAgIElNTGFuZ0ZvbnRMaW5rMiogbGFuZ0ZvbnRMaW5rID0gZm9udENh
Y2hlKCktPmdldEZvbnRMaW5rSW50ZXJmYWNlKCk7CisjZWxzZQorICAgICAgICBJTUxhbmdGb250
TGluayogbGFuZ0ZvbnRMaW5rID0gZm9udENhY2hlKCktPmdldEZvbnRMaW5rSW50ZXJmYWNlKCk7
CisjZW5kaWYKKyAgICAgICAgaWYgKCFsYW5nRm9udExpbmspCisgICAgICAgICAgICByZXR1cm4g
Y29kZVBhZ2VNYXNrczsKKworICAgICAgICBVSU5UIGRlZmF1bHRDb2RlUGFnZTsKKyAgICAgICAg
RFdPUkQgZGVmYXVsdENvZGVQYWdlTWFzayA9IDA7CisgICAgICAgIGlmIChHZXRMb2NhbGVJbmZv
KExPQ0FMRV9VU0VSX0RFRkFVTFQsIExPQ0FMRV9SRVRVUk5fTlVNQkVSIHwgTE9DQUxFX0lERUZB
VUxUQU5TSUNPREVQQUdFLCByZWludGVycHJldF9jYXN0PExQV1NUUj4oJmRlZmF1bHRDb2RlUGFn
ZSksIHNpemVvZihkZWZhdWx0Q29kZVBhZ2UpKSkKKyAgICAgICAgICAgIGxhbmdGb250TGluay0+
Q29kZVBhZ2VUb0NvZGVQYWdlcyhkZWZhdWx0Q29kZVBhZ2UsICZkZWZhdWx0Q29kZVBhZ2VNYXNr
KTsKKworICAgICAgICBpZiAoZGVmYXVsdENvZGVQYWdlID09IENKS0NvZGVQYWdlc1swXSB8fCBk
ZWZhdWx0Q29kZVBhZ2UgPT0gQ0pLQ29kZVBhZ2VzWzFdIHx8IGRlZmF1bHRDb2RlUGFnZSA9PSBD
SktDb2RlUGFnZXNbMl0gfHwgZGVmYXVsdENvZGVQYWdlID09IENKS0NvZGVQYWdlc1szXSkKKyAg
ICAgICAgICAgIGNvZGVQYWdlTWFza3MuYXBwZW5kKGRlZmF1bHRDb2RlUGFnZU1hc2spOworICAg
ICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgICAgICBpZiAo
ZGVmYXVsdENvZGVQYWdlICE9IENKS0NvZGVQYWdlc1tpXSkgeworICAgICAgICAgICAgICAgIERX
T1JEIGNvZGVQYWdlTWFzazsKKyAgICAgICAgICAgICAgICBsYW5nRm9udExpbmstPkNvZGVQYWdl
VG9Db2RlUGFnZXMoQ0pLQ29kZVBhZ2VzW2ldLCAmY29kZVBhZ2VNYXNrKTsKKyAgICAgICAgICAg
ICAgICBjb2RlUGFnZU1hc2tzLmFwcGVuZChjb2RlUGFnZU1hc2spOworICAgICAgICAgICAgfQor
ICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb2RlUGFnZU1hc2tzOworfQorCisKK3N0cnVj
dCBUcmFpdHNJbkZhbWlseVByb2NEYXRhIHsKKyAgICBUcmFpdHNJbkZhbWlseVByb2NEYXRhKGNv
bnN0IEF0b21pY1N0cmluZyYgZmFtaWx5TmFtZSkKKyAgICAgICAgOiBtX2ZhbWlseU5hbWUoZmFt
aWx5TmFtZSkKKyAgICB7CisgICAgfQorCisgICAgY29uc3QgQXRvbWljU3RyaW5nJiBtX2ZhbWls
eU5hbWU7CisgICAgSGFzaFNldDx1bnNpZ25lZD4gbV90cmFpdHNNYXNrczsKK307CisKK3N0YXRp
YyBpbnQgQ0FMTEJBQ0sgdHJhaXRzSW5GYW1pbHlFbnVtUHJvYyhDT05TVCBMT0dGT05UKiBsb2dG
b250LCBDT05TVCBURVhUTUVUUklDKiBtZXRyaWNzLCBEV09SRCBmb250VHlwZSwgTFBBUkFNIGxQ
YXJhbSkKK3sKKyAgICBUcmFpdHNJbkZhbWlseVByb2NEYXRhKiBwcm9jRGF0YSA9IHJlaW50ZXJw
cmV0X2Nhc3Q8VHJhaXRzSW5GYW1pbHlQcm9jRGF0YSo+KGxQYXJhbSk7CisKKyAgICB1bnNpZ25l
ZCB0cmFpdHNNYXNrID0gMDsKKyAgICB0cmFpdHNNYXNrIHw9IGxvZ0ZvbnQtPmxmSXRhbGljID8g
Rm9udFN0eWxlSXRhbGljTWFzayA6IEZvbnRTdHlsZU5vcm1hbE1hc2s7CisgICAgdHJhaXRzTWFz
ayB8PSBGb250VmFyaWFudE5vcm1hbE1hc2s7CisgICAgTE9ORyB3ZWlnaHQgPSBGb250UGxhdGZv
cm1EYXRhOjphZGp1c3RlZEdESUZvbnRXZWlnaHQobG9nRm9udC0+bGZXZWlnaHQsIHByb2NEYXRh
LT5tX2ZhbWlseU5hbWUpOworICAgIHRyYWl0c01hc2sgfD0gd2VpZ2h0ID09IEZXX1RISU4gPyBG
b250V2VpZ2h0MTAwTWFzayA6CisgICAgICAgIHdlaWdodCA9PSBGV19FWFRSQUxJR0hUID8gRm9u
dFdlaWdodDIwME1hc2sgOgorICAgICAgICB3ZWlnaHQgPT0gRldfTElHSFQgPyBGb250V2VpZ2h0
MzAwTWFzayA6CisgICAgICAgIHdlaWdodCA9PSBGV19OT1JNQUwgPyBGb250V2VpZ2h0NDAwTWFz
ayA6CisgICAgICAgIHdlaWdodCA9PSBGV19NRURJVU0gPyBGb250V2VpZ2h0NTAwTWFzayA6Cisg
ICAgICAgIHdlaWdodCA9PSBGV19TRU1JQk9MRCA/IEZvbnRXZWlnaHQ2MDBNYXNrIDoKKyAgICAg
ICAgd2VpZ2h0ID09IEZXX0JPTEQgPyBGb250V2VpZ2h0NzAwTWFzayA6CisgICAgICAgIHdlaWdo
dCA9PSBGV19FWFRSQUJPTEQgPyBGb250V2VpZ2h0ODAwTWFzayA6CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBGb250V2VpZ2h0OTAwTWFzazsKKyAgICBwcm9jRGF0YS0+bV90cmFp
dHNNYXNrcy5hZGQodHJhaXRzTWFzayk7CisgICAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgRm9udENh
Y2hlOjpwbGF0Zm9ybUluaXQoKQoreworfQorCit2b2lkIEZvbnRDYWNoZTo6Y29tSW5pdGlhbGl6
ZSgpCit7Cit9CisKK3ZvaWQgRm9udENhY2hlOjpjb21VbmluaXRpYWxpemUoKQoreworICAgIGlm
IChsYW5nRm9udExpbmspIHsKKyAgICAgICAgbGFuZ0ZvbnRMaW5rLT5SZWxlYXNlKCk7CisgICAg
ICAgIGxhbmdGb250TGluayA9IDA7CisgICAgfQorICAgIGlmIChtdWx0aUxhbmd1YWdlKSB7Cisg
ICAgICAgIG11bHRpTGFuZ3VhZ2UtPlJlbGVhc2UoKTsKKyAgICAgICAgbXVsdGlMYW5ndWFnZSA9
IDA7CisgICAgfQorfQorCitjb25zdCBTaW1wbGVGb250RGF0YSogRm9udENhY2hlOjpnZXRGb250
RGF0YUZvckNoYXJhY3RlcnMoY29uc3QgRm9udCYgZm9udCwgY29uc3QgVUNoYXIqIGNoYXJhY3Rl
cnMsIGludCBsZW5ndGgpCit7CisgICAgU3RyaW5nIGZhbWlseU5hbWU7CisgICAgV0NIQVIgbmFt
ZVtMRl9GQUNFU0laRV07CisKKyAgICBVQ2hhciBjaGFyYWN0ZXIgPSBjaGFyYWN0ZXJzWzBdOwor
ICAgIGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIG9yaWdGb250ID0gZm9udC5wcmltYXJ5Rm9udCgp
LT5mb250RGF0YUZvckNoYXJhY3RlcihjaGFyYWN0ZXIpLT5wbGF0Zm9ybURhdGEoKTsKKyAgICB1
bnNpZ25lZCB1bmljb2RlUmFuZ2UgPSBmaW5kQ2hhclVuaWNvZGVSYW5nZShjaGFyYWN0ZXIpOwor
CisjaWYgZGVmaW5lZChJTUxBTkdfRk9OVF9MSU5LKSAmJiAoSU1MQU5HX0ZPTlRfTElOSyA9PSAy
KQorICAgIGlmIChJTUxhbmdGb250TGluazIqIGxhbmdGb250TGluayA9IGdldEZvbnRMaW5rSW50
ZXJmYWNlKCkpIHsKKyNlbHNlCisgICAgaWYgKElNTGFuZ0ZvbnRMaW5rKiBsYW5nRm9udExpbmsg
PSBnZXRGb250TGlua0ludGVyZmFjZSgpKSB7CisjZW5kaWYKKyAgICAgICAgSEdESU9CSiBvbGRG
b250ID0gR2V0Q3VycmVudE9iamVjdChnX3NjcmVlbkRDLCBPQkpfRk9OVCk7CisgICAgICAgIEhG
T05UIGhmb250ID0gMDsKKyAgICAgICAgRFdPUkQgY29kZVBhZ2VzID0gMDsKKyAgICAgICAgVUlO
VCBjb2RlUGFnZSA9IDA7CisgICAgICAgIC8vIFRyeSBNTGFuZyBmb250IGxpbmtpbmcgZmlyc3Qu
CisgICAgICAgIGxhbmdGb250TGluay0+R2V0Q2hhckNvZGVQYWdlcyhjaGFyYWN0ZXIsICZjb2Rl
UGFnZXMpOworICAgICAgICBpZiAoY29kZVBhZ2VzICYmIHVuaWNvZGVSYW5nZSA9PSBjUmFuZ2VT
ZXRDSkspIHsKKyAgICAgICAgICAgIC8vIFRoZSBDSksgY2hhcmFjdGVyIG1heSBiZWxvbmcgdG8g
bXVsdGlwbGUgY29kZSBwYWdlcy4gV2Ugd2FudCB0bworICAgICAgICAgICAgLy8gZG8gZm9udCBs
aW5raW5nIGFnYWluc3QgYSBzaW5nbGUgb25lIG9mIHRoZW0sIHByZWZlcnJpbmcgdGhlIGRlZmF1
bHQKKyAgICAgICAgICAgIC8vIGNvZGUgcGFnZSBmb3IgdGhlIHVzZXIncyBsb2NhbGUuCisgICAg
ICAgICAgICBjb25zdCBWZWN0b3I8RFdPUkQsIDQ+JiBDSktDb2RlUGFnZU1hc2tzID0gZ2V0Q0pL
Q29kZVBhZ2VNYXNrcygpOworICAgICAgICAgICAgdW5zaWduZWQgbnVtQ29kZVBhZ2VzID0gQ0pL
Q29kZVBhZ2VNYXNrcy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgbnVtQ29kZVBhZ2VzOyArK2kpIHsKKyNpZiBkZWZpbmVkKElNTEFOR19GT05UX0xJTkspICYm
IChJTUxBTkdfRk9OVF9MSU5LID09IDIpCisgICAgICAgICAgICAgICAgaGZvbnQgPSBjcmVhdGVN
TGFuZ0ZvbnQobGFuZ0ZvbnRMaW5rLCBnX3NjcmVlbkRDLCBDSktDb2RlUGFnZU1hc2tzW2ldKTsK
KyNlbHNlCisgICAgICAgICAgICAgICAgaGZvbnQgPSBjcmVhdGVNTGFuZ0ZvbnQobGFuZ0ZvbnRM
aW5rLCBnX3NjcmVlbkRDLCBvcmlnRm9udCwgQ0pLQ29kZVBhZ2VNYXNrc1tpXSk7CisjZW5kaWYK
KyAgICAgICAgICAgICAgICBpZiAoIWhmb250KQorICAgICAgICAgICAgICAgICAgICBjb250aW51
ZTsKKworICAgICAgICAgICAgICAgIFNlbGVjdE9iamVjdChnX3NjcmVlbkRDLCBoZm9udCk7Cisg
ICAgICAgICAgICAgICAgR2V0VGV4dEZhY2UoZ19zY3JlZW5EQywgTEZfRkFDRVNJWkUsIG5hbWUp
OworCisgICAgICAgICAgICAgICAgaWYgKGhmb250ICYmICEoY29kZVBhZ2VzICYgQ0pLQ29kZVBh
Z2VNYXNrc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXNrZWQgYWJvdXQgYSBj
b2RlIHBhZ2UgdGhhdCBpcyBub3Qgb25lIG9mIHRoZSBjb2RlIHBhZ2VzCisgICAgICAgICAgICAg
ICAgICAgIC8vIHJldHVybmVkIGJ5IE1MYW5nLCBzbyB0aGUgZm9udCBtaWdodCBub3QgY29udGFp
biB0aGUgY2hhcmFjdGVyLgorI2lmIGRlZmluZWQoSU1MQU5HX0ZPTlRfTElOSykgJiYgKElNTEFO
R19GT05UX0xJTksgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50Rm9udENv
bnRhaW5zQ2hhcmFjdGVyKGxhbmdGb250TGluaywgZ19zY3JlZW5EQywgY2hhcmFjdGVyKSkgewor
I2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50Rm9udENvbnRhaW5zQ2hhcmFj
dGVyKGxhbmdGb250TGluaywgZ19zY3JlZW5EQywgaGZvbnQsIGNoYXJhY3RlciwgbmFtZSkpIHsK
KyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGdfc2NyZWVuREMs
IG9sZEZvbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ0ZvbnRMaW5rLT5SZWxlYXNl
Rm9udChoZm9udCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoZm9udCA9IDA7CisgICAgICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfSBlbHNlIHsKKyNpZiBkZWZpbmVkKElNTEFOR19GT05UX0xJTkspICYmIChJTUxBTkdfRk9O
VF9MSU5LID09IDIpCisgICAgICAgICAgICBoZm9udCA9IGNyZWF0ZU1MYW5nRm9udChsYW5nRm9u
dExpbmssIGdfc2NyZWVuREMsIGNvZGVQYWdlcywgY2hhcmFjdGVyKTsKKyNlbHNlCisgICAgICAg
ICAgICBoZm9udCA9IGNyZWF0ZU1MYW5nRm9udChsYW5nRm9udExpbmssIGdfc2NyZWVuREMsIG9y
aWdGb250LCBjb2RlUGFnZXMpOworI2VuZGlmCisgICAgICAgICAgICBTZWxlY3RPYmplY3QoZ19z
Y3JlZW5EQywgaGZvbnQpOworICAgICAgICAgICAgR2V0VGV4dEZhY2UoZ19zY3JlZW5EQywgTEZf
RkFDRVNJWkUsIG5hbWUpOworICAgICAgICB9CisgICAgICAgIFNlbGVjdE9iamVjdChnX3NjcmVl
bkRDLCBvbGRGb250KTsKKworICAgICAgICBpZiAoaGZvbnQpIHsKKyAgICAgICAgICAgIGZhbWls
eU5hbWUgPSBuYW1lOworICAgICAgICAgICAgbGFuZ0ZvbnRMaW5rLT5SZWxlYXNlRm9udChoZm9u
dCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgRm9udFBsYXRmb3JtRGF0YTo6bWFwS25v
d25Gb250KGNvZGVQYWdlcywgZmFtaWx5TmFtZSk7CisgICAgfQorCisgICAgaWYgKGZhbWlseU5h
bWUuaXNFbXB0eSgpKQorICAgICAgICBmYW1pbHlOYW1lID0gRm9udFBsYXRmb3JtRGF0YTo6ZGVm
YXVsdEZvbnRGYW1pbHkoKTsKKworICAgIGlmICghZmFtaWx5TmFtZS5pc0VtcHR5KCkpIHsKKyAg
ICAgICAgLy8gRklYTUU6IHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBUaGFpIGZvbnQgcHJvYmxl
bQorICAgICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uKGZvbnQuZm9udERlc2Ny
aXB0aW9uKCkpOworICAgICAgICBpZiAodW5pY29kZVJhbmdlID09IGNSYW5nZVRoYWkgJiYgZm9u
dERlc2NyaXB0aW9uLndlaWdodCgpID4gRm9udFdlaWdodE5vcm1hbCkKKyAgICAgICAgICAgIGZv
bnREZXNjcmlwdGlvbi5zZXRXZWlnaHQoRm9udFdlaWdodE5vcm1hbCk7CisKKyAgICAgICAgRm9u
dFBsYXRmb3JtRGF0YSogcmVzdWx0ID0gZ2V0Q2FjaGVkRm9udFBsYXRmb3JtRGF0YShmb250RGVz
Y3JpcHRpb24sIGZhbWlseU5hbWUpOworICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC0+aGFz
aCgpICE9IG9yaWdGb250Lmhhc2goKSkgeworICAgICAgICAgICAgaWYgKFNpbXBsZUZvbnREYXRh
KiBmb250RGF0YSA9IGdldENhY2hlZEZvbnREYXRhKHJlc3VsdCkpCisgICAgICAgICAgICAgICAg
cmV0dXJuIGZvbnREYXRhOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisK
K1NpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldFNpbWlsYXJGb250UGxhdGZvcm1EYXRhKGNv
bnN0IEZvbnQmIGZvbnQpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK1NpbXBsZUZvbnREYXRhKiBG
b250Q2FjaGU6OmdldExhc3RSZXNvcnRGYWxsYmFja0ZvbnQoY29uc3QgRm9udERlc2NyaXB0aW9u
JiBmb250RGVzYykKK3sKKyAgICAvLyBGSVhNRTogV291bGQgYmUgZXZlbiBiZXR0ZXIgdG8gc29t
ZWhvdyBnZXQgdGhlIHVzZXIncyBkZWZhdWx0IGZvbnQgaGVyZS4gIEZvciBub3cgd2UnbGwgcGlj
aworICAgIC8vIHRoZSBkZWZhdWx0IHRoYXQgdGhlIHVzZXIgd291bGQgZ2V0IHdpdGhvdXQgY2hh
bmdpbmcgYW55IHByZWZzLgorICAgIHJldHVybiBnZXRDYWNoZWRGb250RGF0YShmb250RGVzYywg
Rm9udFBsYXRmb3JtRGF0YTo6ZGVmYXVsdEZvbnRGYW1pbHkoKSk7Cit9CisKK0ZvbnRQbGF0Zm9y
bURhdGEqIEZvbnRDYWNoZTo6Y3JlYXRlRm9udFBsYXRmb3JtRGF0YShjb25zdCBGb250RGVzY3Jp
cHRpb24mIGZvbnREZXNjcmlwdGlvbiwgY29uc3QgQXRvbWljU3RyaW5nJiBmYW1pbHkpCit7Cisg
ICAgRm9udFBsYXRmb3JtRGF0YSogcmVzdWx0ID0gbmV3IEZvbnRQbGF0Zm9ybURhdGEoZm9udERl
c2NyaXB0aW9uLCBmYW1pbHkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRm9udENh
Y2hlOjpnZXRUcmFpdHNJbkZhbWlseShjb25zdCBBdG9taWNTdHJpbmcmIGZhbWlseU5hbWUsIFZl
Y3Rvcjx1bnNpZ25lZD4mIHRyYWl0c01hc2tzKQoreworICAgIExPR0ZPTlQgbG9nRm9udDsKKyAg
ICBsb2dGb250LmxmQ2hhclNldCA9IERFRkFVTFRfQ0hBUlNFVDsKKyAgICB1bnNpZ25lZCBmYW1p
bHlMZW5ndGggPSBzdGQ6Om1pbihmYW1pbHlOYW1lLmxlbmd0aCgpLCBzdGF0aWNfY2FzdDx1bnNp
Z25lZD4oTEZfRkFDRVNJWkUgLSAxKSk7CisgICAgbWVtY3B5KGxvZ0ZvbnQubGZGYWNlTmFtZSwg
ZmFtaWx5TmFtZS5jaGFyYWN0ZXJzKCksIGZhbWlseUxlbmd0aCAqIHNpemVvZihVQ2hhcikpOwor
ICAgIGxvZ0ZvbnQubGZGYWNlTmFtZVtmYW1pbHlMZW5ndGhdID0gMDsKKyAgICBsb2dGb250Lmxm
UGl0Y2hBbmRGYW1pbHkgPSAwOworCisgICAgVHJhaXRzSW5GYW1pbHlQcm9jRGF0YSBwcm9jRGF0
YShmYW1pbHlOYW1lKTsKKyAgICBFbnVtRm9udEZhbWlsaWVzRXgoZ19zY3JlZW5EQywgJmxvZ0Zv
bnQsIHRyYWl0c0luRmFtaWx5RW51bVByb2MsIHJlaW50ZXJwcmV0X2Nhc3Q8TFBBUkFNPigmcHJv
Y0RhdGEpLCAwKTsKKyAgICBjb3B5VG9WZWN0b3IocHJvY0RhdGEubV90cmFpdHNNYXNrcywgdHJh
aXRzTWFza3MpOworfQorCit9CisKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
Y2UvRm9udENhY2hlV2luQ0UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luY2UvRm9udENhY2hlV2luQ0UuY3BwCShyZXZpc2lvbiA1NzI4OSkKKysrIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvRm9udENhY2hlV2luQ0UuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0zNDgsNSArMzQ4LDQgQEAgdm9pZCBGb250Q2FjaGU6OmdldFRyYWl0c0luRmFtaWx5
KGNvbnN0CiAgICAgY29weVRvVmVjdG9yKHByb2NEYXRhLm1fdHJhaXRzTWFza3MsIHRyYWl0c01h
c2tzKTsKIH0KIAotfQotCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ZvbnRDYWNoZVdpbmNlLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ZvbnRDYWNoZVdpbmNlLmNwcAkocmV2aXNp
b24gNTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ZvbnRDYWNoZVdp
bmNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSwzNTIgKzAsMCBAQAotLyoKLSogQ29weXJpZ2h0
IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0q
IENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLgotKgotKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAK
LSogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0Ci0qICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0qICAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKLSog
My4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5v
ciB0aGUgbmFtZXMgb2YKLSogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5k
b3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSogICAgIGZyb20gdGhpcyBzb2Z0d2Fy
ZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCi0qCi0qIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElT
IiBBTkQgQU5ZCi0qIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZCi0qIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0qIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSog
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0qIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RgotKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgotKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkZvbnRD
YWNoZS5oIgotCi0jaW5jbHVkZSAiRm9udC5oIgotI2luY2x1ZGUgIkZvbnREYXRhLmgiCi0jaW5j
bHVkZSAiU2ltcGxlRm9udERhdGEuaCIKLSNpbmNsdWRlICJVbmljb2RlUmFuZ2UuaCIKLSNpbmNs
dWRlICJ3dGYvT3duUHRyLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8bWxh
bmcuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1leHRlcm4gSERDIGdfc2NyZWVuREM7Ci0K
LXN0YXRpYyBJTXVsdGlMYW5ndWFnZSAqbXVsdGlMYW5ndWFnZSA9IDA7Ci0KLSNpZiBkZWZpbmVk
KElNTEFOR19GT05UX0xJTkspICYmIChJTUxBTkdfRk9OVF9MSU5LID09IDIpCi1zdGF0aWMgSU1M
YW5nRm9udExpbmsyKiBsYW5nRm9udExpbmsgPSAwOwotI2Vsc2UKLXN0YXRpYyBJTUxhbmdGb250
TGluayogbGFuZ0ZvbnRMaW5rID0gMDsKLSNlbmRpZgotCi1JTXVsdGlMYW5ndWFnZSogZ2V0TXVs
dGlMYW5ndWFnZUludGVyZmFjZSgpCi17Ci0gICAgaWYgKCFtdWx0aUxhbmd1YWdlKQotICAgICAg
ICBDb0NyZWF0ZUluc3RhbmNlKENMU0lEX0NNdWx0aUxhbmd1YWdlLCAwLCBDTFNDVFhfSU5QUk9D
X1NFUlZFUiwgSUlEX0lNdWx0aUxhbmd1YWdlLCAodm9pZCoqKSZtdWx0aUxhbmd1YWdlKTsKLQot
ICAgIHJldHVybiBtdWx0aUxhbmd1YWdlOwotfQotCi0jaWYgZGVmaW5lZChJTUxBTkdfRk9OVF9M
SU5LKSAmJiAoSU1MQU5HX0ZPTlRfTElOSyA9PSAyKQotSU1MYW5nRm9udExpbmsyKiBGb250Q2Fj
aGU6OmdldEZvbnRMaW5rSW50ZXJmYWNlKCkKLSNlbHNlCi1JTUxhbmdGb250TGluayogRm9udENh
Y2hlOjpnZXRGb250TGlua0ludGVyZmFjZSgpCi0jZW5kaWYKLXsKLSAgICBpZiAoIWxhbmdGb250
TGluaykgewotICAgICAgICBpZiAoSU11bHRpTGFuZ3VhZ2UqIG1saSA9IGdldE11bHRpTGFuZ3Vh
Z2VJbnRlcmZhY2UoKSkKLSAgICAgICAgICAgIG1saS0+UXVlcnlJbnRlcmZhY2UoJmxhbmdGb250
TGluayk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGxhbmdGb250TGluazsKLX0KLQotI2lmIGRlZmlu
ZWQoSU1MQU5HX0ZPTlRfTElOSykgJiYgKElNTEFOR19GT05UX0xJTksgPT0gMikKLXN0YXRpYyBi
b29sIGN1cnJlbnRGb250Q29udGFpbnNDaGFyYWN0ZXIoSU1MYW5nRm9udExpbmsyKiBsYW5nRm9u
dExpbmssIEhEQyBoZGMsIFVDaGFyIGNoYXJhY3RlcikKLXsKLSAgICBVSU5UIHVuaWNvZGVSYW5n
ZXM7Ci0gICAgaWYgKFNfT0sgIT0gbGFuZ0ZvbnRMaW5rLT5HZXRGb250VW5pY29kZVJhbmdlcyho
ZGMsICZ1bmljb2RlUmFuZ2VzLCAwKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgc3Rh
dGljIFZlY3RvcjxVTklDT0RFUkFOR0UsIDY0PiBnbHlwaHNldEJ1ZmZlcjsKLSAgICBnbHlwaHNl
dEJ1ZmZlci5yZXNpemUodW5pY29kZVJhbmdlcyk7Ci0KLSAgICBpZiAoU19PSyAhPSBsYW5nRm9u
dExpbmstPkdldEZvbnRVbmljb2RlUmFuZ2VzKGhkYywgJnVuaWNvZGVSYW5nZXMsIGdseXBoc2V0
QnVmZmVyLmRhdGEoKSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIEZJWE1FOiBD
aGFuZ2UgdGhpcyB0byBhIGJpbmFyeSBzZWFyY2guIChZb25nIExpOiBUaGF0J3MgZWFzeS4gQnV0
LCBpcyBpdCBndWFyYW50ZWVkIHRoYXQgdGhlIHJhbmdlcyBhcmUgc29ydGVkPykKLSAgICBmb3Ig
KFZlY3RvcjxVTklDT0RFUkFOR0UsIDY0Pjo6Y29uc3RfaXRlcmF0b3IgaSA9IGdseXBoc2V0QnVm
ZmVyLmJlZ2luKCk7IGkgIT0gZ2x5cGhzZXRCdWZmZXIuZW5kKCk7ICsraSkgewotICAgICAgICBp
ZiAoaS0+d2NUbyA+PSBjaGFyYWN0ZXIpCi0gICAgICAgICAgICByZXR1cm4gaS0+d2NGcm9tIDw9
IGNoYXJhY3RlcjsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0jZWxzZQotc3RhdGlj
IGJvb2wgY3VycmVudEZvbnRDb250YWluc0NoYXJhY3RlcihJTUxhbmdGb250TGluayogbGFuZ0Zv
bnRMaW5rLCBIREMgaGRjLCBIRk9OVCBoZm9udCwgVUNoYXIgY2hhcmFjdGVyLCBjb25zdCB3Y2hh
cl90KiBmYWNlTmFtZSkKLXsKLSAgICBEV09SRCBmb250Q29kZVBhZ2VzID0gMCwgY2hhckNvZGVQ
YWdlcyA9IDA7Ci0gICAgSFJFU1VMVCByZXN1bHQgPSBsYW5nRm9udExpbmstPkdldEZvbnRDb2Rl
UGFnZXMoaGRjLCBoZm9udCwgJmZvbnRDb2RlUGFnZXMpOwotICAgIGlmIChyZXN1bHQgIT0gU19P
SykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJlc3VsdCA9IGxhbmdGb250TGluay0+R2V0
Q2hhckNvZGVQYWdlcyhjaGFyYWN0ZXIsICZjaGFyQ29kZVBhZ2VzKTsKLSAgICBpZiAocmVzdWx0
ICE9IFNfT0spCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGZvbnRDb2RlUGFnZXMgfD0g
Rm9udFBsYXRmb3JtRGF0YTo6Z2V0S25vd25Gb250Q29kZVBhZ2VzKGZhY2VOYW1lKTsKLSAgICBp
ZiAoZm9udENvZGVQYWdlcyAmIGNoYXJDb2RlUGFnZXMpCi0gICAgICAgIHJldHVybiB0cnVlOwot
Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKElNTEFOR19GT05U
X0xJTkspICYmIChJTUxBTkdfRk9OVF9MSU5LID09IDIpCi1zdGF0aWMgSEZPTlQgY3JlYXRlTUxh
bmdGb250KElNTGFuZ0ZvbnRMaW5rMiogbGFuZ0ZvbnRMaW5rLCBIREMgaGRjLCBEV09SRCBjb2Rl
UGFnZU1hc2ssIFVDaGFyIGNoYXJhY3RlciA9IDApCi17Ci0gICAgSEZPTlQgbWxhbmdGb250Owot
ICAgIGlmIChTVUNDRUVERUQobGFuZ0ZvbnRMaW5rLT5NYXBGb250KGhkYywgY29kZVBhZ2VNYXNr
LCBjaGFyYWN0ZXIsICZtbGFuZ0ZvbnQpKSkKLSAgICAgICAgcmV0dXJuIG1sYW5nRm9udDsKLQot
ICAgIHJldHVybiAwOwotfQotI2Vsc2UKLXN0YXRpYyBIRk9OVCBjcmVhdGVNTGFuZ0ZvbnQoSU1M
YW5nRm9udExpbmsqIGxhbmdGb250TGluaywgSERDIGhkYywgY29uc3QgRm9udFBsYXRmb3JtRGF0
YSYgcmVmRm9udCwgRFdPUkQgY29kZVBhZ2VNYXNrKQotewotICAgIEhGT05UIG1sYW5nRm9udDsK
LSAgICBMUkVTVUxUIHJlc3VsdCA9IGxhbmdGb250TGluay0+TWFwRm9udChoZGMsIGNvZGVQYWdl
TWFzaywgcmVmRm9udC5oZm9udCgpLCAmbWxhbmdGb250KTsKLQotICAgIHJldHVybiByZXN1bHQg
PT0gU19PSyA/IG1sYW5nRm9udCA6IDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGNvbnN0IFZlY3Rv
cjxEV09SRCwgND4mIGdldENKS0NvZGVQYWdlTWFza3MoKQotewotICAgIC8vIFRoZSBkZWZhdWx0
IG9yZGVyIGluIHdoaWNoIHdlIGxvb2sgZm9yIGEgZm9udCBmb3IgYSBDSksgY2hhcmFjdGVyLiBJ
ZiB0aGUgdXNlcidzIGRlZmF1bHQgY29kZSBwYWdlIGlzCi0gICAgLy8gb25lIG9mIHRoZXNlLCB3
ZSB3aWxsIHVzZSBpdCBmaXJzdC4KLSAgICBzdGF0aWMgY29uc3QgVUlOVCBDSktDb2RlUGFnZXNb
XSA9IHsKLSAgICAgICAgOTMyLCAvKiBKYXBhbmVzZSAqLwotICAgICAgICA5MzYsIC8qIFNpbXBs
aWZpZWQgQ2hpbmVzZSAqLwotICAgICAgICA5NTAsIC8qIFRyYWRpdGlvbmFsIENoaW5lc2UgKi8K
LSAgICAgICAgOTQ5ICAvKiBLb3JlYW4gKi8KLSAgICB9OwotCi0gICAgc3RhdGljIFZlY3RvcjxE
V09SRCwgND4gY29kZVBhZ2VNYXNrczsKLSAgICBzdGF0aWMgYm9vbCBpbml0aWFsaXplZDsKLSAg
ICBpZiAoIWluaXRpYWxpemVkKSB7Ci0gICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKLSNpZiBk
ZWZpbmVkKElNTEFOR19GT05UX0xJTkspICYmIChJTUxBTkdfRk9OVF9MSU5LID09IDIpCi0gICAg
ICAgIElNTGFuZ0ZvbnRMaW5rMiogbGFuZ0ZvbnRMaW5rID0gZm9udENhY2hlKCktPmdldEZvbnRM
aW5rSW50ZXJmYWNlKCk7Ci0jZWxzZQotICAgICAgICBJTUxhbmdGb250TGluayogbGFuZ0ZvbnRM
aW5rID0gZm9udENhY2hlKCktPmdldEZvbnRMaW5rSW50ZXJmYWNlKCk7Ci0jZW5kaWYKLSAgICAg
ICAgaWYgKCFsYW5nRm9udExpbmspCi0gICAgICAgICAgICByZXR1cm4gY29kZVBhZ2VNYXNrczsK
LQotICAgICAgICBVSU5UIGRlZmF1bHRDb2RlUGFnZTsKLSAgICAgICAgRFdPUkQgZGVmYXVsdENv
ZGVQYWdlTWFzayA9IDA7Ci0gICAgICAgIGlmIChHZXRMb2NhbGVJbmZvKExPQ0FMRV9VU0VSX0RF
RkFVTFQsIExPQ0FMRV9SRVRVUk5fTlVNQkVSIHwgTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdF
LCByZWludGVycHJldF9jYXN0PExQV1NUUj4oJmRlZmF1bHRDb2RlUGFnZSksIHNpemVvZihkZWZh
dWx0Q29kZVBhZ2UpKSkKLSAgICAgICAgICAgIGxhbmdGb250TGluay0+Q29kZVBhZ2VUb0NvZGVQ
YWdlcyhkZWZhdWx0Q29kZVBhZ2UsICZkZWZhdWx0Q29kZVBhZ2VNYXNrKTsKLQotICAgICAgICBp
ZiAoZGVmYXVsdENvZGVQYWdlID09IENKS0NvZGVQYWdlc1swXSB8fCBkZWZhdWx0Q29kZVBhZ2Ug
PT0gQ0pLQ29kZVBhZ2VzWzFdIHx8IGRlZmF1bHRDb2RlUGFnZSA9PSBDSktDb2RlUGFnZXNbMl0g
fHwgZGVmYXVsdENvZGVQYWdlID09IENKS0NvZGVQYWdlc1szXSkKLSAgICAgICAgICAgIGNvZGVQ
YWdlTWFza3MuYXBwZW5kKGRlZmF1bHRDb2RlUGFnZU1hc2spOwotICAgICAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgNDsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoZGVmYXVsdENvZGVQYWdl
ICE9IENKS0NvZGVQYWdlc1tpXSkgewotICAgICAgICAgICAgICAgIERXT1JEIGNvZGVQYWdlTWFz
azsKLSAgICAgICAgICAgICAgICBsYW5nRm9udExpbmstPkNvZGVQYWdlVG9Db2RlUGFnZXMoQ0pL
Q29kZVBhZ2VzW2ldLCAmY29kZVBhZ2VNYXNrKTsKLSAgICAgICAgICAgICAgICBjb2RlUGFnZU1h
c2tzLmFwcGVuZChjb2RlUGFnZU1hc2spOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAg
fQotICAgIHJldHVybiBjb2RlUGFnZU1hc2tzOwotfQotCi0KLXN0cnVjdCBUcmFpdHNJbkZhbWls
eVByb2NEYXRhIHsKLSAgICBUcmFpdHNJbkZhbWlseVByb2NEYXRhKGNvbnN0IEF0b21pY1N0cmlu
ZyYgZmFtaWx5TmFtZSkKLSAgICAgICAgOiBtX2ZhbWlseU5hbWUoZmFtaWx5TmFtZSkKLSAgICB7
Ci0gICAgfQotCi0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBtX2ZhbWlseU5hbWU7Ci0gICAgSGFz
aFNldDx1bnNpZ25lZD4gbV90cmFpdHNNYXNrczsKLX07Ci0KLXN0YXRpYyBpbnQgQ0FMTEJBQ0sg
dHJhaXRzSW5GYW1pbHlFbnVtUHJvYyhDT05TVCBMT0dGT05UKiBsb2dGb250LCBDT05TVCBURVhU
TUVUUklDKiBtZXRyaWNzLCBEV09SRCBmb250VHlwZSwgTFBBUkFNIGxQYXJhbSkKLXsKLSAgICBU
cmFpdHNJbkZhbWlseVByb2NEYXRhKiBwcm9jRGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VHJhaXRz
SW5GYW1pbHlQcm9jRGF0YSo+KGxQYXJhbSk7Ci0KLSAgICB1bnNpZ25lZCB0cmFpdHNNYXNrID0g
MDsKLSAgICB0cmFpdHNNYXNrIHw9IGxvZ0ZvbnQtPmxmSXRhbGljID8gRm9udFN0eWxlSXRhbGlj
TWFzayA6IEZvbnRTdHlsZU5vcm1hbE1hc2s7Ci0gICAgdHJhaXRzTWFzayB8PSBGb250VmFyaWFu
dE5vcm1hbE1hc2s7Ci0gICAgTE9ORyB3ZWlnaHQgPSBGb250UGxhdGZvcm1EYXRhOjphZGp1c3Rl
ZEdESUZvbnRXZWlnaHQobG9nRm9udC0+bGZXZWlnaHQsIHByb2NEYXRhLT5tX2ZhbWlseU5hbWUp
OwotICAgIHRyYWl0c01hc2sgfD0gd2VpZ2h0ID09IEZXX1RISU4gPyBGb250V2VpZ2h0MTAwTWFz
ayA6Ci0gICAgICAgIHdlaWdodCA9PSBGV19FWFRSQUxJR0hUID8gRm9udFdlaWdodDIwME1hc2sg
OgotICAgICAgICB3ZWlnaHQgPT0gRldfTElHSFQgPyBGb250V2VpZ2h0MzAwTWFzayA6Ci0gICAg
ICAgIHdlaWdodCA9PSBGV19OT1JNQUwgPyBGb250V2VpZ2h0NDAwTWFzayA6Ci0gICAgICAgIHdl
aWdodCA9PSBGV19NRURJVU0gPyBGb250V2VpZ2h0NTAwTWFzayA6Ci0gICAgICAgIHdlaWdodCA9
PSBGV19TRU1JQk9MRCA/IEZvbnRXZWlnaHQ2MDBNYXNrIDoKLSAgICAgICAgd2VpZ2h0ID09IEZX
X0JPTEQgPyBGb250V2VpZ2h0NzAwTWFzayA6Ci0gICAgICAgIHdlaWdodCA9PSBGV19FWFRSQUJP
TEQgPyBGb250V2VpZ2h0ODAwTWFzayA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBGb250V2VpZ2h0OTAwTWFzazsKLSAgICBwcm9jRGF0YS0+bV90cmFpdHNNYXNrcy5hZGQodHJh
aXRzTWFzayk7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgRm9udENhY2hlOjpwbGF0Zm9ybUlu
aXQoKQotewotfQotCi12b2lkIEZvbnRDYWNoZTo6Y29tSW5pdGlhbGl6ZSgpCi17Ci19Ci0KLXZv
aWQgRm9udENhY2hlOjpjb21VbmluaXRpYWxpemUoKQotewotICAgIGlmIChsYW5nRm9udExpbmsp
IHsKLSAgICAgICAgbGFuZ0ZvbnRMaW5rLT5SZWxlYXNlKCk7Ci0gICAgICAgIGxhbmdGb250TGlu
ayA9IDA7Ci0gICAgfQotICAgIGlmIChtdWx0aUxhbmd1YWdlKSB7Ci0gICAgICAgIG11bHRpTGFu
Z3VhZ2UtPlJlbGVhc2UoKTsKLSAgICAgICAgbXVsdGlMYW5ndWFnZSA9IDA7Ci0gICAgfQotfQot
Ci1jb25zdCBTaW1wbGVGb250RGF0YSogRm9udENhY2hlOjpnZXRGb250RGF0YUZvckNoYXJhY3Rl
cnMoY29uc3QgRm9udCYgZm9udCwgY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIGludCBsZW5ndGgp
Ci17Ci0gICAgU3RyaW5nIGZhbWlseU5hbWU7Ci0gICAgV0NIQVIgbmFtZVtMRl9GQUNFU0laRV07
Ci0KLSAgICBVQ2hhciBjaGFyYWN0ZXIgPSBjaGFyYWN0ZXJzWzBdOwotICAgIGNvbnN0IEZvbnRQ
bGF0Zm9ybURhdGEmIG9yaWdGb250ID0gZm9udC5wcmltYXJ5Rm9udCgpLT5mb250RGF0YUZvckNo
YXJhY3RlcihjaGFyYWN0ZXIpLT5wbGF0Zm9ybURhdGEoKTsKLSAgICB1bnNpZ25lZCB1bmljb2Rl
UmFuZ2UgPSBmaW5kQ2hhclVuaWNvZGVSYW5nZShjaGFyYWN0ZXIpOwotCi0jaWYgZGVmaW5lZChJ
TUxBTkdfRk9OVF9MSU5LKSAmJiAoSU1MQU5HX0ZPTlRfTElOSyA9PSAyKQotICAgIGlmIChJTUxh
bmdGb250TGluazIqIGxhbmdGb250TGluayA9IGdldEZvbnRMaW5rSW50ZXJmYWNlKCkpIHsKLSNl
bHNlCi0gICAgaWYgKElNTGFuZ0ZvbnRMaW5rKiBsYW5nRm9udExpbmsgPSBnZXRGb250TGlua0lu
dGVyZmFjZSgpKSB7Ci0jZW5kaWYKLSAgICAgICAgSEdESU9CSiBvbGRGb250ID0gR2V0Q3VycmVu
dE9iamVjdChnX3NjcmVlbkRDLCBPQkpfRk9OVCk7Ci0gICAgICAgIEhGT05UIGhmb250ID0gMDsK
LSAgICAgICAgRFdPUkQgY29kZVBhZ2VzID0gMDsKLSAgICAgICAgVUlOVCBjb2RlUGFnZSA9IDA7
Ci0gICAgICAgIC8vIFRyeSBNTGFuZyBmb250IGxpbmtpbmcgZmlyc3QuCi0gICAgICAgIGxhbmdG
b250TGluay0+R2V0Q2hhckNvZGVQYWdlcyhjaGFyYWN0ZXIsICZjb2RlUGFnZXMpOwotICAgICAg
ICBpZiAoY29kZVBhZ2VzICYmIHVuaWNvZGVSYW5nZSA9PSBjUmFuZ2VTZXRDSkspIHsKLSAgICAg
ICAgICAgIC8vIFRoZSBDSksgY2hhcmFjdGVyIG1heSBiZWxvbmcgdG8gbXVsdGlwbGUgY29kZSBw
YWdlcy4gV2Ugd2FudCB0bwotICAgICAgICAgICAgLy8gZG8gZm9udCBsaW5raW5nIGFnYWluc3Qg
YSBzaW5nbGUgb25lIG9mIHRoZW0sIHByZWZlcnJpbmcgdGhlIGRlZmF1bHQKLSAgICAgICAgICAg
IC8vIGNvZGUgcGFnZSBmb3IgdGhlIHVzZXIncyBsb2NhbGUuCi0gICAgICAgICAgICBjb25zdCBW
ZWN0b3I8RFdPUkQsIDQ+JiBDSktDb2RlUGFnZU1hc2tzID0gZ2V0Q0pLQ29kZVBhZ2VNYXNrcygp
OwotICAgICAgICAgICAgdW5zaWduZWQgbnVtQ29kZVBhZ2VzID0gQ0pLQ29kZVBhZ2VNYXNrcy5z
aXplKCk7Ci0gICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtQ29kZVBhZ2Vz
OyArK2kpIHsKLSNpZiBkZWZpbmVkKElNTEFOR19GT05UX0xJTkspICYmIChJTUxBTkdfRk9OVF9M
SU5LID09IDIpCi0gICAgICAgICAgICAgICAgaGZvbnQgPSBjcmVhdGVNTGFuZ0ZvbnQobGFuZ0Zv
bnRMaW5rLCBnX3NjcmVlbkRDLCBDSktDb2RlUGFnZU1hc2tzW2ldKTsKLSNlbHNlCi0gICAgICAg
ICAgICAgICAgaGZvbnQgPSBjcmVhdGVNTGFuZ0ZvbnQobGFuZ0ZvbnRMaW5rLCBnX3NjcmVlbkRD
LCBvcmlnRm9udCwgQ0pLQ29kZVBhZ2VNYXNrc1tpXSk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAg
ICBpZiAoIWhmb250KQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAg
ICAgICAgIFNlbGVjdE9iamVjdChnX3NjcmVlbkRDLCBoZm9udCk7Ci0gICAgICAgICAgICAgICAg
R2V0VGV4dEZhY2UoZ19zY3JlZW5EQywgTEZfRkFDRVNJWkUsIG5hbWUpOwotCi0gICAgICAgICAg
ICAgICAgaWYgKGhmb250ICYmICEoY29kZVBhZ2VzICYgQ0pLQ29kZVBhZ2VNYXNrc1tpXSkpIHsK
LSAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXNrZWQgYWJvdXQgYSBjb2RlIHBhZ2UgdGhhdCBp
cyBub3Qgb25lIG9mIHRoZSBjb2RlIHBhZ2VzCi0gICAgICAgICAgICAgICAgICAgIC8vIHJldHVy
bmVkIGJ5IE1MYW5nLCBzbyB0aGUgZm9udCBtaWdodCBub3QgY29udGFpbiB0aGUgY2hhcmFjdGVy
LgotI2lmIGRlZmluZWQoSU1MQU5HX0ZPTlRfTElOSykgJiYgKElNTEFOR19GT05UX0xJTksgPT0g
MikKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50Rm9udENvbnRhaW5zQ2hhcmFjdGVy
KGxhbmdGb250TGluaywgZ19zY3JlZW5EQywgY2hhcmFjdGVyKSkgewotI2Vsc2UKLSAgICAgICAg
ICAgICAgICAgICAgaWYgKCFjdXJyZW50Rm9udENvbnRhaW5zQ2hhcmFjdGVyKGxhbmdGb250TGlu
aywgZ19zY3JlZW5EQywgaGZvbnQsIGNoYXJhY3RlciwgbmFtZSkpIHsKLSNlbmRpZgotICAgICAg
ICAgICAgICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGdfc2NyZWVuREMsIG9sZEZvbnQpOwotICAg
ICAgICAgICAgICAgICAgICAgICAgbGFuZ0ZvbnRMaW5rLT5SZWxlYXNlRm9udChoZm9udCk7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICBoZm9udCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSNp
ZiBkZWZpbmVkKElNTEFOR19GT05UX0xJTkspICYmIChJTUxBTkdfRk9OVF9MSU5LID09IDIpCi0g
ICAgICAgICAgICBoZm9udCA9IGNyZWF0ZU1MYW5nRm9udChsYW5nRm9udExpbmssIGdfc2NyZWVu
REMsIGNvZGVQYWdlcywgY2hhcmFjdGVyKTsKLSNlbHNlCi0gICAgICAgICAgICBoZm9udCA9IGNy
ZWF0ZU1MYW5nRm9udChsYW5nRm9udExpbmssIGdfc2NyZWVuREMsIG9yaWdGb250LCBjb2RlUGFn
ZXMpOwotI2VuZGlmCi0gICAgICAgICAgICBTZWxlY3RPYmplY3QoZ19zY3JlZW5EQywgaGZvbnQp
OwotICAgICAgICAgICAgR2V0VGV4dEZhY2UoZ19zY3JlZW5EQywgTEZfRkFDRVNJWkUsIG5hbWUp
OwotICAgICAgICB9Ci0gICAgICAgIFNlbGVjdE9iamVjdChnX3NjcmVlbkRDLCBvbGRGb250KTsK
LQotICAgICAgICBpZiAoaGZvbnQpIHsKLSAgICAgICAgICAgIGZhbWlseU5hbWUgPSBuYW1lOwot
ICAgICAgICAgICAgbGFuZ0ZvbnRMaW5rLT5SZWxlYXNlRm9udChoZm9udCk7Ci0gICAgICAgIH0g
ZWxzZQotICAgICAgICAgICAgRm9udFBsYXRmb3JtRGF0YTo6bWFwS25vd25Gb250KGNvZGVQYWdl
cywgZmFtaWx5TmFtZSk7Ci0gICAgfQotCi0gICAgaWYgKGZhbWlseU5hbWUuaXNFbXB0eSgpKQot
ICAgICAgICBmYW1pbHlOYW1lID0gRm9udFBsYXRmb3JtRGF0YTo6ZGVmYXVsdEZvbnRGYW1pbHko
KTsKLQotICAgIGlmICghZmFtaWx5TmFtZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgLy8gRklYTUU6
IHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBUaGFpIGZvbnQgcHJvYmxlbQotICAgICAgICBGb250
RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uKGZvbnQuZm9udERlc2NyaXB0aW9uKCkpOwotICAg
ICAgICBpZiAodW5pY29kZVJhbmdlID09IGNSYW5nZVRoYWkgJiYgZm9udERlc2NyaXB0aW9uLndl
aWdodCgpID4gRm9udFdlaWdodE5vcm1hbCkKLSAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5z
ZXRXZWlnaHQoRm9udFdlaWdodE5vcm1hbCk7Ci0KLSAgICAgICAgRm9udFBsYXRmb3JtRGF0YSog
cmVzdWx0ID0gZ2V0Q2FjaGVkRm9udFBsYXRmb3JtRGF0YShmb250RGVzY3JpcHRpb24sIGZhbWls
eU5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC0+aGFzaCgpICE9IG9yaWdGb250
Lmhhc2goKSkgewotICAgICAgICAgICAgaWYgKFNpbXBsZUZvbnREYXRhKiBmb250RGF0YSA9IGdl
dENhY2hlZEZvbnREYXRhKHJlc3VsdCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZvbnREYXRh
OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLVNpbXBsZUZvbnREYXRh
KiBGb250Q2FjaGU6OmdldFNpbWlsYXJGb250UGxhdGZvcm1EYXRhKGNvbnN0IEZvbnQmIGZvbnQp
Ci17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLVNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldExh
c3RSZXNvcnRGYWxsYmFja0ZvbnQoY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzYykKLXsK
LSAgICAvLyBGSVhNRTogV291bGQgYmUgZXZlbiBiZXR0ZXIgdG8gc29tZWhvdyBnZXQgdGhlIHVz
ZXIncyBkZWZhdWx0IGZvbnQgaGVyZS4gIEZvciBub3cgd2UnbGwgcGljawotICAgIC8vIHRoZSBk
ZWZhdWx0IHRoYXQgdGhlIHVzZXIgd291bGQgZ2V0IHdpdGhvdXQgY2hhbmdpbmcgYW55IHByZWZz
LgotICAgIHJldHVybiBnZXRDYWNoZWRGb250RGF0YShmb250RGVzYywgRm9udFBsYXRmb3JtRGF0
YTo6ZGVmYXVsdEZvbnRGYW1pbHkoKSk7Ci19Ci0KLUZvbnRQbGF0Zm9ybURhdGEqIEZvbnRDYWNo
ZTo6Y3JlYXRlRm9udFBsYXRmb3JtRGF0YShjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNj
cmlwdGlvbiwgY29uc3QgQXRvbWljU3RyaW5nJiBmYW1pbHkpCi17Ci0gICAgRm9udFBsYXRmb3Jt
RGF0YSogcmVzdWx0ID0gbmV3IEZvbnRQbGF0Zm9ybURhdGEoZm9udERlc2NyaXB0aW9uLCBmYW1p
bHkpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgRm9udENhY2hlOjpnZXRUcmFpdHNJ
bkZhbWlseShjb25zdCBBdG9taWNTdHJpbmcmIGZhbWlseU5hbWUsIFZlY3Rvcjx1bnNpZ25lZD4m
IHRyYWl0c01hc2tzKQotewotICAgIExPR0ZPTlQgbG9nRm9udDsKLSAgICBsb2dGb250LmxmQ2hh
clNldCA9IERFRkFVTFRfQ0hBUlNFVDsKLSAgICB1bnNpZ25lZCBmYW1pbHlMZW5ndGggPSBzdGQ6
Om1pbihmYW1pbHlOYW1lLmxlbmd0aCgpLCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oTEZfRkFDRVNJ
WkUgLSAxKSk7Ci0gICAgbWVtY3B5KGxvZ0ZvbnQubGZGYWNlTmFtZSwgZmFtaWx5TmFtZS5jaGFy
YWN0ZXJzKCksIGZhbWlseUxlbmd0aCAqIHNpemVvZihVQ2hhcikpOwotICAgIGxvZ0ZvbnQubGZG
YWNlTmFtZVtmYW1pbHlMZW5ndGhdID0gMDsKLSAgICBsb2dGb250LmxmUGl0Y2hBbmRGYW1pbHkg
PSAwOwotCi0gICAgVHJhaXRzSW5GYW1pbHlQcm9jRGF0YSBwcm9jRGF0YShmYW1pbHlOYW1lKTsK
LSAgICBFbnVtRm9udEZhbWlsaWVzRXgoZ19zY3JlZW5EQywgJmxvZ0ZvbnQsIHRyYWl0c0luRmFt
aWx5RW51bVByb2MsIHJlaW50ZXJwcmV0X2Nhc3Q8TFBBUkFNPigmcHJvY0RhdGEpLCAwKTsKLSAg
ICBjb3B5VG9WZWN0b3IocHJvY0RhdGEubV90cmFpdHNNYXNrcywgdHJhaXRzTWFza3MpOwotfQot
Ci19Ci0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvRm9udFBsYXRmb3Jt
RGF0YS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvRm9u
dFBsYXRmb3JtRGF0YS5oCShyZXZpc2lvbiA1NzI4OSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luY2UvRm9udFBsYXRmb3JtRGF0YS5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMiw4ICsy
Miw4IEBACiAgKgogICovCiAKLSNpZm5kZWYgRm9udFBsYXRmb3JtRGF0YVdpbmNlX0gKLSNkZWZp
bmUgRm9udFBsYXRmb3JtRGF0YVdpbmNlX0gKKyNpZm5kZWYgRm9udFBsYXRmb3JtRGF0YVdpbkNF
X2gKKyNkZWZpbmUgRm9udFBsYXRmb3JtRGF0YVdpbkNFX2gKIAogI2luY2x1ZGUgIkZvbnREZXNj
cmlwdGlvbi5oIgogI2luY2x1ZGUgIlN0cmluZ0ltcGwuaCIKQEAgLTg3LDQgKzg3LDQgQEAgbmFt
ZXNwYWNlIFdlYkNvcmUgewogCiB9CiAKLSNlbmRpZgorI2VuZGlmIC8vIEZvbnRQbGF0Zm9ybURh
dGFXaW5DRV9oCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ZvbnRXaW5D
RS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9Gb250
V2luQ0UuY3BwCShyZXZpc2lvbiA1NzI4OSkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW5jZS9Gb250V2luY2UuY3BwOjU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW5jZS9Gb250V2luQ0UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzMzIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KKyAq
IENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlh
cnkoLWllcykKKyAqIENvcHlyaWdodCAoQykgMjAwOCBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhl
cgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09N
UFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01Q
VVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRm9udC5oIgorCisjaW5j
bHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCisjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVk
ZSAiRm9udENhY2hlLmgiCisjaW5jbHVkZSAiRm9udERhdGEuaCIKKyNpbmNsdWRlICJGb250RmFs
bGJhY2tMaXN0LmgiCisjaW5jbHVkZSAiR2x5cGhCdWZmZXIuaCIKKyNpbmNsdWRlICJHcmFwaGlj
c0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50
ZWQuaCIKKyNpbmNsdWRlICJXaWR0aEl0ZXJhdG9yLmgiCisjaW5jbHVkZSA8d3RmL01hdGhFeHRy
YXMuaD4KKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL3VuaWNvZGUvVW5p
Y29kZS5oPgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCit1c2luZyBuYW1lc3BhY2UgV1RGOjpV
bmljb2RlOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0hEQyBnX3NjcmVlbkRDID0gR2V0REMo
MCk7CisKK2NsYXNzIFNjcmVlbkRjUmVsZWFzZXIgeworcHVibGljOgorICAgIH5TY3JlZW5EY1Jl
bGVhc2VyKCkKKyAgICB7CisgICAgICAgIFJlbGVhc2VEQygwLCBnX3NjcmVlbkRDKTsKKyAgICB9
Cit9OworCitTY3JlZW5EY1JlbGVhc2VyIHJlbGVhc2VTY3JlZW5EYzsKKwordm9pZCBGb250Ojpk
cmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3NDb250ZXh0LCBjb25zdCBTaW1wbGVG
b250RGF0YSogZm9udERhdGEsIGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZlciwKKyAgICAg
ICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IG51bUdseXBocywgY29uc3QgRmxvYXRQb2lu
dCYgcG9pbnQpIGNvbnN0Cit7CisgICAgZ3JhcGhpY3NDb250ZXh0LT5kcmF3VGV4dChmb250RGF0
YSwgZ2x5cGhCdWZmZXIsIGZyb20sIG51bUdseXBocywgcG9pbnQpOworfQorCitjbGFzcyBUZXh0
UnVuQ29tcG9uZW50IHsKK3B1YmxpYzoKKyAgICBUZXh0UnVuQ29tcG9uZW50KCkgOiBtX3RleHRS
dW4oMCwgMCkge30KKyAgICBUZXh0UnVuQ29tcG9uZW50KGNvbnN0IFVDaGFyICpzdGFydCwgaW50
IGxlbmd0aCwgY29uc3QgVGV4dFJ1biYgcGFyZW50VGV4dFJ1biwgY29uc3QgRm9udCAmZm9udCwg
aW50IG9mZnNldCk7CisgICAgVGV4dFJ1bkNvbXBvbmVudChpbnQgc3BhY2VzLCBjb25zdCBGb250
ICZmb250LCBpbnQgb2Zmc2V0KTsKKyAgICB+VGV4dFJ1bkNvbXBvbmVudCgpIHsgbV90ZXh0UnVu
OyB9CisKKyAgICBib29sIGlzU3BhY2UoKSBjb25zdCB7IHJldHVybiBtX3NwYWNlczsgfQorICAg
IGludCB0ZXh0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9zcGFjZXMgPyBtX3NwYWNlcyA6IG1f
dGV4dFJ1bi5sZW5ndGgoKTsgfQorCisgICAgVGV4dFJ1biBtX3RleHRSdW47CisgICAgZmxvYXQg
bV93aWR0aDsKKyAgICBpbnQgbV9vZmZzZXQ7CisgICAgaW50IG1fc3BhY2VzOworfTsKKworVGV4
dFJ1bkNvbXBvbmVudDo6VGV4dFJ1bkNvbXBvbmVudChjb25zdCBVQ2hhciAqc3RhcnQsIGludCBs
ZW5ndGgsIGNvbnN0IFRleHRSdW4mIHBhcmVudFRleHRSdW4sIGNvbnN0IEZvbnQgJmZvbnQsIGlu
dCBvKQorICAgIDogbV90ZXh0UnVuKHN0YXJ0LCBsZW5ndGgsIHBhcmVudFRleHRSdW4uYWxsb3dU
YWJzKCksIDAsIDAKKyAgICAgICAgLCBwYXJlbnRUZXh0UnVuLnJ0bCgpCisgICAgICAgICwgcGFy
ZW50VGV4dFJ1bi5kaXJlY3Rpb25hbE92ZXJyaWRlKCkKKyAgICAgICAgLCBwYXJlbnRUZXh0UnVu
LmFwcGx5UnVuUm91bmRpbmcoKQorICAgICAgICAsIHBhcmVudFRleHRSdW4uYXBwbHlXb3JkUm91
bmRpbmcoKSkKKyAgICAsIG1fb2Zmc2V0KG8pCisgICAgLCBtX3NwYWNlcygwKQoreworICAgIFdp
ZHRoSXRlcmF0b3IgaXQoJmZvbnQsIG1fdGV4dFJ1bik7CisgICAgaXQuYWR2YW5jZShtX3RleHRS
dW4ubGVuZ3RoKCksIDApOworICAgIG1fd2lkdGggPSBpdC5tX3J1bldpZHRoU29GYXI7Cit9CisK
K1RleHRSdW5Db21wb25lbnQ6OlRleHRSdW5Db21wb25lbnQoaW50IHMsIGNvbnN0IEZvbnQgJmZv
bnQsIGludCBvKQorICAgIDogbV90ZXh0UnVuKDAsIDApCisgICAgLCBtX29mZnNldChvKQorICAg
ICwgbV9zcGFjZXMocykKK3sKKyAgICBtX3dpZHRoID0gcyAqIGZvbnQucHJpbWFyeUZvbnQoKS0+
d2lkdGhGb3JHbHlwaCgnICcpOworfQorCit0eXBlZGVmIFZlY3RvcjxUZXh0UnVuQ29tcG9uZW50
LCAxMjg+IFRleHRSdW5Db21wb25lbnRzOworCitzdGF0aWMgaW50IGdlbmVyYXRlQ29tcG9uZW50
cyhUZXh0UnVuQ29tcG9uZW50cyogY29tcG9uZW50cywgY29uc3QgRm9udCAmZm9udCwgY29uc3Qg
VGV4dFJ1biAmcnVuKQoreworICAgIGludCBsZXR0ZXJTcGFjaW5nID0gZm9udC5sZXR0ZXJTcGFj
aW5nKCk7CisgICAgaW50IHdvcmRTcGFjaW5nID0gZm9udC53b3JkU3BhY2luZygpOworICAgIGlu
dCBwYWRkaW5nID0gcnVuLnBhZGRpbmcoKTsKKyAgICBpbnQgbnVtU3BhY2VzID0gMDsKKyAgICBp
ZiAocGFkZGluZykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJ1bi5sZW5ndGgoKTsg
aSsrKQorICAgICAgICAgICAgaWYgKEZvbnQ6OnRyZWF0QXNTcGFjZShydW5baV0pKQorICAgICAg
ICAgICAgICAgICsrbnVtU3BhY2VzOworICAgIH0KKworICAgIGludCBvZmZzZXQgPSAwOworICAg
IGlmIChsZXR0ZXJTcGFjaW5nKSB7CisgICAgICAgIC8vIG5lZWQgdG8gZHJhdyBldmVyeSBsZXR0
ZXIgb24gaXQncyBvd24KKyAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgaWYgKEZvbnQ6
OnRyZWF0QXNTcGFjZShydW5bMF0pKSB7CisgICAgICAgICAgICBpbnQgYWRkID0gMDsKKyAgICAg
ICAgICAgIGlmIChudW1TcGFjZXMpIHsKKyAgICAgICAgICAgICAgICBhZGQgPSBwYWRkaW5nL251
bVNwYWNlczsKKyAgICAgICAgICAgICAgICBwYWRkaW5nIC09IGFkZDsKKyAgICAgICAgICAgICAg
ICAtLW51bVNwYWNlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbXBvbmVudHMtPmFw
cGVuZChUZXh0UnVuQ29tcG9uZW50KDEsIGZvbnQsIG9mZnNldCkpOworICAgICAgICAgICAgb2Zm
c2V0ICs9IGFkZCArIGxldHRlclNwYWNpbmcgKyBjb21wb25lbnRzLT5sYXN0KCkubV93aWR0aDsK
KyAgICAgICAgICAgIHN0YXJ0ID0gMTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0g
MTsgaSA8IHJ1bi5sZW5ndGgoKTsgKytpKSB7CisgICAgICAgICAgICB1aW50IGNoID0gcnVuW2ld
OworICAgICAgICAgICAgaWYgKGlzSGlnaFN1cnJvZ2F0ZShjaCkgJiYgaXNMb3dTdXJyb2dhdGUo
cnVuW2ktMV0pKQorICAgICAgICAgICAgICAgIGNoID0gc3Vycm9nYXRlVG9VY3M0KGNoLCBydW5b
aS0xXSk7CisgICAgICAgICAgICBpZiAoaXNMb3dTdXJyb2dhdGUoY2gpIHx8IGNhdGVnb3J5KGNo
KSA9PSBNYXJrX05vblNwYWNpbmcpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICBpZiAoRm9udDo6dHJlYXRBc1NwYWNlKHJ1bltpXSkpIHsKKyAgICAgICAgICAgICAgICBp
bnQgYWRkID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoaSAtIHN0YXJ0ID4gMCkgeworICAgICAg
ICAgICAgICAgICAgICBjb21wb25lbnRzLT5hcHBlbmQoVGV4dFJ1bkNvbXBvbmVudChydW4uY2hh
cmFjdGVycygpICsgc3RhcnQsIGkgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuLCBmb250LCBvZmZzZXQpKTsKKyAgICAg
ICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGNvbXBvbmVudHMtPmxhc3QoKS5tX3dpZHRoICsgbGV0
dGVyU3BhY2luZzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG51bVNw
YWNlcykgeworICAgICAgICAgICAgICAgICAgICBhZGQgPSBwYWRkaW5nL251bVNwYWNlczsKKyAg
ICAgICAgICAgICAgICAgICAgcGFkZGluZyAtPSBhZGQ7CisgICAgICAgICAgICAgICAgICAgIC0t
bnVtU3BhY2VzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb21wb25lbnRz
LT5hcHBlbmQoVGV4dFJ1bkNvbXBvbmVudCgxLCBmb250LCBvZmZzZXQpKTsKKyAgICAgICAgICAg
ICAgICBvZmZzZXQgKz0gd29yZFNwYWNpbmcgKyBhZGQgKyBjb21wb25lbnRzLT5sYXN0KCkubV93
aWR0aCArIGxldHRlclNwYWNpbmc7CisgICAgICAgICAgICAgICAgc3RhcnQgPSBpICsgMTsKKyAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChp
IC0gc3RhcnQgPiAwKSB7CisgICAgICAgICAgICAgICAgY29tcG9uZW50cy0+YXBwZW5kKFRleHRS
dW5Db21wb25lbnQocnVuLmNoYXJhY3RlcnMoKSArIHN0YXJ0LCBpIC0gc3RhcnQsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQsIG9mZnNl
dCkpOworICAgICAgICAgICAgICAgIG9mZnNldCArPSBjb21wb25lbnRzLT5sYXN0KCkubV93aWR0
aCArIGxldHRlclNwYWNpbmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGFydCA9IGk7
CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJ1bi5sZW5ndGgoKSAtIHN0YXJ0ID4gMCkgeworICAg
ICAgICAgICAgY29tcG9uZW50cy0+YXBwZW5kKFRleHRSdW5Db21wb25lbnQocnVuLmNoYXJhY3Rl
cnMoKSArIHN0YXJ0LCBydW4ubGVuZ3RoKCkgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQsIG9mZnNldCkpOworICAgICAgICAgICAgb2Zm
c2V0ICs9IGNvbXBvbmVudHMtPmxhc3QoKS5tX3dpZHRoOworICAgICAgICB9CisgICAgICAgIG9m
ZnNldCArPSBsZXR0ZXJTcGFjaW5nOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBzdGFydCA9
IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVuLmxlbmd0aCgpOyArK2kpIHsKKyAg
ICAgICAgICAgIGlmIChGb250Ojp0cmVhdEFzU3BhY2UocnVuW2ldKSkgeworICAgICAgICAgICAg
ICAgIGlmIChpIC0gc3RhcnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMt
PmFwcGVuZChUZXh0UnVuQ29tcG9uZW50KHJ1bi5jaGFyYWN0ZXJzKCkgKyBzdGFydCwgaSAtIHN0
YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBydW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGZvbnQsIG9mZnNldCkpOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0g
Y29tcG9uZW50cy0+bGFzdCgpLm1fd2lkdGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgIGludCBhZGQgPSAwOworICAgICAgICAgICAgICAgIGlmIChudW1TcGFjZXMpIHsKKyAg
ICAgICAgICAgICAgICAgICAgYWRkID0gcGFkZGluZy9udW1TcGFjZXM7CisgICAgICAgICAgICAg
ICAgICAgIHBhZGRpbmcgLT0gYWRkOworICAgICAgICAgICAgICAgICAgICAtLW51bVNwYWNlczsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29tcG9uZW50cy0+YXBwZW5kKFRl
eHRSdW5Db21wb25lbnQoMSwgZm9udCwgb2Zmc2V0KSk7CisgICAgICAgICAgICAgICAgb2Zmc2V0
ICs9IGFkZCArIGNvbXBvbmVudHMtPmxhc3QoKS5tX3dpZHRoOworICAgICAgICAgICAgICAgIGlm
IChpKQorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gd29yZFNwYWNpbmc7CisgICAgICAg
ICAgICAgICAgc3RhcnQgPSBpICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAg
ICBpZiAocnVuLmxlbmd0aCgpIC0gc3RhcnQgPiAwKSB7CisgICAgICAgICAgICBjb21wb25lbnRz
LT5hcHBlbmQoVGV4dFJ1bkNvbXBvbmVudChydW4uY2hhcmFjdGVycygpICsgc3RhcnQsIHJ1bi5s
ZW5ndGgoKSAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgcnVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgZm9udCwgb2Zmc2V0KSk7CisgICAgICAgICAgICBvZmZzZXQgKz0gY29tcG9uZW50cy0+
bGFzdCgpLm1fd2lkdGg7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG9mZnNldDsKK30K
Kwordm9pZCBGb250OjpkcmF3Q29tcGxleFRleHQoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBj
b25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaW50IGZyb20sIGludCB0bykgY29uc3QKK3sKKyAgICBpZiAodG8gPCAw
KQorICAgICAgICB0byA9IHJ1bi5sZW5ndGgoKTsKKyAgICBpZiAoZnJvbSA8IDApCisgICAgICAg
IGZyb20gPSAwOworCisgICAgVGV4dFJ1bkNvbXBvbmVudHMgY29tcG9uZW50czsKKyAgICBpbnQg
dyA9IGdlbmVyYXRlQ29tcG9uZW50cygmY29tcG9uZW50cywgKnRoaXMsIHJ1bik7CisKKyAgICBp
bnQgY3VyUG9zID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpY29tcG9uZW50cy5z
aXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBUZXh0UnVuQ29tcG9uZW50JiBjb21wID0gY29t
cG9uZW50cy5hdChpKTsKKyAgICAgICAgaW50IGxlbiA9IGNvbXAudGV4dExlbmd0aCgpOworICAg
ICAgICBpbnQgY3VyRW5kID0gY3VyUG9zICsgbGVuOworICAgICAgICBpZiAoY3VyUG9zIDwgdG8g
JiYgZnJvbSA8IGN1ckVuZCAmJiAhY29tcC5pc1NwYWNlKCkpIHsKKyAgICAgICAgICAgIEZsb2F0
UG9pbnQgcHQgPSBwb2ludDsKKyAgICAgICAgICAgIGlmIChydW4ucnRsKCkpCisgICAgICAgICAg
ICAgICAgcHQuc2V0WChwb2ludC54KCkgKyB3IC0gY29tcC5tX29mZnNldCAtIGNvbXAubV93aWR0
aCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHQuc2V0WChwb2ludC54KCkg
KyBjb21wLm1fb2Zmc2V0KTsKKyAgICAgICAgICAgIGRyYXdTaW1wbGVUZXh0KGNvbnRleHQsIGNv
bXAubV90ZXh0UnVuLCBwdCwgZnJvbSAtIGN1clBvcywgc3RkOjptaW4odG8sIGN1ckVuZCkgLSBj
dXJQb3MpOworICAgICAgICB9CisgICAgICAgIGN1clBvcyArPSBsZW47CisgICAgICAgIGlmIChm
cm9tIDwgY3VyUG9zKQorICAgICAgICAgICAgZnJvbSA9IGN1clBvczsKKyAgICB9Cit9CisKK2Zs
b2F0IEZvbnQ6OmZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIEhh
c2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiogZmFsbGJhY2tGb250cywgR2x5cGhPdmVyZmxv
dyogZ2x5cGhPdmVyZmxvdykgY29uc3QKK3sKKyAgICBUZXh0UnVuQ29tcG9uZW50cyBjb21wb25l
bnRzOworICAgIGludCB3ID0gZ2VuZXJhdGVDb21wb25lbnRzKCZjb21wb25lbnRzLCAqdGhpcywg
cnVuKTsKKyAgICByZXR1cm4gdzsKK30KKworaW50IEZvbnQ6Om9mZnNldEZvclBvc2l0aW9uRm9y
Q29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBpbnQgcG9zaXRpb24sIGJvb2wgaW5jbHVk
ZVBhcnRpYWxHbHlwaHMpIGNvbnN0Cit7CisgICAgVGV4dFJ1bkNvbXBvbmVudHMgY29tcG9uZW50
czsKKyAgICBpbnQgdyA9IGdlbmVyYXRlQ29tcG9uZW50cygmY29tcG9uZW50cywgKnRoaXMsIHJ1
bik7CisKKyAgICBpZiAocG9zaXRpb24gPj0gdykKKyAgICAgICAgcmV0dXJuIHJ1bi5sZW5ndGgo
KTsKKworICAgIGludCBvZmZzZXQgPSAwOworICAgIGlmIChydW4ucnRsKCkpIHsKKyAgICAgICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb21wb25lbnRzLnNpemUoKTsgKytpKSB7CisgICAgICAg
ICAgICBjb25zdCBUZXh0UnVuQ29tcG9uZW50JiBjb21wID0gY29tcG9uZW50cy5hdChpKTsKKyAg
ICAgICAgICAgIGludCB4ZSA9IHcgLSBjb21wLm1fb2Zmc2V0OworICAgICAgICAgICAgaW50IHhz
ID0geGUgLSBjb21wLm1fd2lkdGg7CisgICAgICAgICAgICBpZiAocG9zaXRpb24gPj0geHMpCisg
ICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldCArIChjb21wLmlzU3BhY2UoKQorICAgICAgICAg
ICAgICAgICAgICA/IHN0YXRpY19jYXN0PGludD4oKHBvc2l0aW9uIC0geGUpICogY29tcC5tX3Nw
YWNlcyAvIHN0ZDo6bWF4KDEuZiwgY29tcC5tX3dpZHRoKSArIDAuNSkKKyAgICAgICAgICAgICAg
ICAgICAgOiBvZmZzZXRGb3JQb3NpdGlvbkZvclNpbXBsZVRleHQoY29tcC5tX3RleHRSdW4sIHBv
c2l0aW9uIC0geHMsIGluY2x1ZGVQYXJ0aWFsR2x5cGhzKSk7CisKKyAgICAgICAgICAgIG9mZnNl
dCArPSBjb21wLnRleHRMZW5ndGgoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29tcG9uZW50cy5zaXplKCk7ICsraSkgeworICAgICAg
ICAgICAgY29uc3QgVGV4dFJ1bkNvbXBvbmVudCYgY29tcCA9IGNvbXBvbmVudHMuYXQoaSk7Cisg
ICAgICAgICAgICBpbnQgeHMgPSBjb21wLm1fb2Zmc2V0OworICAgICAgICAgICAgaW50IHhlID0g
eHMgKyBjb21wLm1fd2lkdGg7CisgICAgICAgICAgICBpZiAocG9zaXRpb24gPD0geGUpIHsKKyAg
ICAgICAgICAgICAgICBpZiAocG9zaXRpb24gLSB4cyA+PSB4ZSkKKyAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIG9mZnNldCArIGNvbXAudGV4dExlbmd0aCgpOworICAgICAgICAgICAgICAgIHJl
dHVybiBvZmZzZXQgKyAoY29tcC5pc1NwYWNlKCkKKyAgICAgICAgICAgICAgICAgICAgPyBzdGF0
aWNfY2FzdDxpbnQ+KChwb3NpdGlvbiAtIHhzKSAqIGNvbXAubV9zcGFjZXMgLyBzdGQ6Om1heCgx
LmYsIGNvbXAubV93aWR0aCkgKyAwLjUpCisgICAgICAgICAgICAgICAgICAgIDogb2Zmc2V0Rm9y
UG9zaXRpb25Gb3JTaW1wbGVUZXh0KGNvbXAubV90ZXh0UnVuLCBwb3NpdGlvbiAtIHhzLCBpbmNs
dWRlUGFydGlhbEdseXBocykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2Zmc2V0ICs9
IGNvbXAudGV4dExlbmd0aCgpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBydW4ubGVu
Z3RoKCk7Cit9CisKKworc3RhdGljIGZsb2F0IGN1cnNvclRvWChjb25zdCBGb250KiBmb250LCBj
b25zdCBUZXh0UnVuQ29tcG9uZW50cyYgY29tcG9uZW50cywgaW50IHdpZHRoLCBib29sIHJ0bCwg
aW50IGN1cnNvcikKK3sKKyAgICBpbnQgc3RhcnQgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAw
OyBpIDwgY29tcG9uZW50cy5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBUZXh0UnVuQ29t
cG9uZW50JiBjb21wID0gY29tcG9uZW50cy5hdChpKTsKKyAgICAgICAgaWYgKHN0YXJ0ICsgY29t
cC50ZXh0TGVuZ3RoKCkgPD0gY3Vyc29yKSB7CisgICAgICAgICAgICBzdGFydCArPSBjb21wLnRl
eHRMZW5ndGgoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlu
dCB4cyA9IGNvbXAubV9vZmZzZXQ7CisgICAgICAgIGlmIChydGwpCisgICAgICAgICAgICB4cyA9
IHdpZHRoIC0geHMgLSBjb21wLm1fd2lkdGg7CisKKyAgICAgICAgaW50IHBvcyA9IGN1cnNvciAt
IHN0YXJ0OworICAgICAgICBpZiAoY29tcC5pc1NwYWNlKCkpIHsKKyAgICAgICAgICAgIGlmIChy
dGwpCisgICAgICAgICAgICAgICAgcG9zID0gY29tcC50ZXh0TGVuZ3RoKCkgLSBwb3M7CisgICAg
ICAgICAgICByZXR1cm4geHMgKyBwb3MgKiBjb21wLm1fd2lkdGggLyBjb21wLm1fc3BhY2VzOwor
ICAgICAgICB9CisgICAgICAgIFdpZHRoSXRlcmF0b3IgaXQoZm9udCwgY29tcC5tX3RleHRSdW4p
OworICAgICAgICBpdC5hZHZhbmNlKHBvcyk7CisgICAgICAgIHJldHVybiB4cyArIGl0Lm1fcnVu
V2lkdGhTb0ZhcjsKKyAgICB9CisgICAgcmV0dXJuIHdpZHRoOworfQorCitGbG9hdFJlY3QgRm9u
dDo6c2VsZWN0aW9uUmVjdEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3Qg
SW50UG9pbnQmIHB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBo
LCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAoreworICAgIFRleHRSdW5Db21wb25lbnRzIGNvbXBv
bmVudHM7CisgICAgaW50IHcgPSBnZW5lcmF0ZUNvbXBvbmVudHMoJmNvbXBvbmVudHMsICp0aGlz
LCBydW4pOworCisgICAgaWYgKCFmcm9tICYmIHRvID09IHJ1bi5sZW5ndGgoKSkKKyAgICAgICAg
cmV0dXJuIEZsb2F0UmVjdChwdC54KCksIHB0LnkoKSwgdywgaCk7CisKKyAgICBmbG9hdCB4MSA9
IGN1cnNvclRvWCh0aGlzLCBjb21wb25lbnRzLCB3LCBydW4ucnRsKCksIGZyb20pOworICAgIGZs
b2F0IHgyID0gY3Vyc29yVG9YKHRoaXMsIGNvbXBvbmVudHMsIHcsIHJ1bi5ydGwoKSwgdG8pOwor
ICAgIGlmICh4MiA8IHgxKQorICAgICAgICBzdGQ6OnN3YXAoeDEsIHgyKTsKKworICAgIHJldHVy
biBGbG9hdFJlY3QocHQueCgpICsgeDEsIHB0LnkoKSwgeDIgLSB4MSwgaCk7Cit9CisKK2Jvb2wg
Rm9udDo6Y2FuUmV0dXJuRmFsbGJhY2tGb250c0ZvckNvbXBsZXhUZXh0KCkKK3sKKyAgICByZXR1
cm4gZmFsc2U7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2Uv
Rm9udFdpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL0ZvbnRXaW5DRS5jcHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW5jZS9Gb250V2luQ0UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMzAsNCArMzMw
LDQgQEAgYm9vbCBGb250OjpjYW5SZXR1cm5GYWxsYmFja0ZvbnRzRm9yQ29tcAogICAgIHJldHVy
biBmYWxzZTsKIH0KIAotfQorfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW5jZS9Gb250V2luY2UuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvRm9udFdpbmNlLmNwcAkocmV2aXNpb24gNTcyODkp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ZvbnRXaW5jZS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTEsMzMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIw
MDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoQykgMjAw
Ny0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENv
cnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQotICogQ29weXJpZ2h0IChDKSAy
MDA4IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCi0gKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0g
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAotICovCi0KLSNpbmNsdWRlICJjb25maWcu
aCIKLSNpbmNsdWRlICJGb250LmgiCi0KLSNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKLSNp
bmNsdWRlICJGbG9hdFJlY3QuaCIKLSNpbmNsdWRlICJGb250Q2FjaGUuaCIKLSNpbmNsdWRlICJG
b250RGF0YS5oIgotI2luY2x1ZGUgIkZvbnRGYWxsYmFja0xpc3QuaCIKLSNpbmNsdWRlICJHbHlw
aEJ1ZmZlci5oIgotI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgotI2luY2x1ZGUgIkludFJl
Y3QuaCIKLSNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgotI2luY2x1ZGUgIldpZHRoSXRlcmF0
b3IuaCIKLSNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgotI2luY2x1ZGUgPHd0Zi9Pd25QdHIu
aD4KLSNpbmNsdWRlIDx3dGYvdW5pY29kZS9Vbmljb2RlLmg+Ci0KLSNpbmNsdWRlIDx3aW5kb3dz
Lmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBXVEY6OlVuaWNvZGU7Ci0KLW5hbWVzcGFjZSBXZWJDb3Jl
IHsKLQotSERDIGdfc2NyZWVuREMgPSBHZXREQygwKTsKLQotY2xhc3MgU2NyZWVuRGNSZWxlYXNl
ciB7Ci1wdWJsaWM6Ci0gICAgflNjcmVlbkRjUmVsZWFzZXIoKQotICAgIHsKLSAgICAgICAgUmVs
ZWFzZURDKDAsIGdfc2NyZWVuREMpOwotICAgIH0KLX07Ci0KLVNjcmVlbkRjUmVsZWFzZXIgcmVs
ZWFzZVNjcmVlbkRjOwotCi12b2lkIEZvbnQ6OmRyYXdHbHlwaHMoR3JhcGhpY3NDb250ZXh0KiBn
cmFwaGljc0NvbnRleHQsIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250RGF0YSwgY29uc3QgR2x5
cGhCdWZmZXImIGdseXBoQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgIGludCBmcm9tLCBp
bnQgbnVtR2x5cGhzLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29uc3QKLXsKLSAgICBncmFw
aGljc0NvbnRleHQtPmRyYXdUZXh0KGZvbnREYXRhLCBnbHlwaEJ1ZmZlciwgZnJvbSwgbnVtR2x5
cGhzLCBwb2ludCk7Ci19Ci0KLWNsYXNzIFRleHRSdW5Db21wb25lbnQgewotcHVibGljOgotICAg
IFRleHRSdW5Db21wb25lbnQoKSA6IG1fdGV4dFJ1bigwLCAwKSB7fQotICAgIFRleHRSdW5Db21w
b25lbnQoY29uc3QgVUNoYXIgKnN0YXJ0LCBpbnQgbGVuZ3RoLCBjb25zdCBUZXh0UnVuJiBwYXJl
bnRUZXh0UnVuLCBjb25zdCBGb250ICZmb250LCBpbnQgb2Zmc2V0KTsKLSAgICBUZXh0UnVuQ29t
cG9uZW50KGludCBzcGFjZXMsIGNvbnN0IEZvbnQgJmZvbnQsIGludCBvZmZzZXQpOwotICAgIH5U
ZXh0UnVuQ29tcG9uZW50KCkgeyBtX3RleHRSdW47IH0KLQotICAgIGJvb2wgaXNTcGFjZSgpIGNv
bnN0IHsgcmV0dXJuIG1fc3BhY2VzOyB9Ci0gICAgaW50IHRleHRMZW5ndGgoKSBjb25zdCB7IHJl
dHVybiBtX3NwYWNlcyA/IG1fc3BhY2VzIDogbV90ZXh0UnVuLmxlbmd0aCgpOyB9Ci0KLSAgICBU
ZXh0UnVuIG1fdGV4dFJ1bjsKLSAgICBmbG9hdCBtX3dpZHRoOwotICAgIGludCBtX29mZnNldDsK
LSAgICBpbnQgbV9zcGFjZXM7Ci19OwotCi1UZXh0UnVuQ29tcG9uZW50OjpUZXh0UnVuQ29tcG9u
ZW50KGNvbnN0IFVDaGFyICpzdGFydCwgaW50IGxlbmd0aCwgY29uc3QgVGV4dFJ1biYgcGFyZW50
VGV4dFJ1biwgY29uc3QgRm9udCAmZm9udCwgaW50IG8pCi0gICAgOiBtX3RleHRSdW4oc3RhcnQs
IGxlbmd0aCwgcGFyZW50VGV4dFJ1bi5hbGxvd1RhYnMoKSwgMCwgMAotICAgICAgICAsIHBhcmVu
dFRleHRSdW4ucnRsKCkKLSAgICAgICAgLCBwYXJlbnRUZXh0UnVuLmRpcmVjdGlvbmFsT3ZlcnJp
ZGUoKQotICAgICAgICAsIHBhcmVudFRleHRSdW4uYXBwbHlSdW5Sb3VuZGluZygpCi0gICAgICAg
ICwgcGFyZW50VGV4dFJ1bi5hcHBseVdvcmRSb3VuZGluZygpKQotICAgICwgbV9vZmZzZXQobykK
LSAgICAsIG1fc3BhY2VzKDApCi17Ci0gICAgV2lkdGhJdGVyYXRvciBpdCgmZm9udCwgbV90ZXh0
UnVuKTsKLSAgICBpdC5hZHZhbmNlKG1fdGV4dFJ1bi5sZW5ndGgoKSwgMCk7Ci0gICAgbV93aWR0
aCA9IGl0Lm1fcnVuV2lkdGhTb0ZhcjsKLX0KLQotVGV4dFJ1bkNvbXBvbmVudDo6VGV4dFJ1bkNv
bXBvbmVudChpbnQgcywgY29uc3QgRm9udCAmZm9udCwgaW50IG8pCi0gICAgOiBtX3RleHRSdW4o
MCwgMCkKLSAgICAsIG1fb2Zmc2V0KG8pCi0gICAgLCBtX3NwYWNlcyhzKQotewotICAgIG1fd2lk
dGggPSBzICogZm9udC5wcmltYXJ5Rm9udCgpLT53aWR0aEZvckdseXBoKCcgJyk7Ci19Ci0KLXR5
cGVkZWYgVmVjdG9yPFRleHRSdW5Db21wb25lbnQsIDEyOD4gVGV4dFJ1bkNvbXBvbmVudHM7Ci0K
LXN0YXRpYyBpbnQgZ2VuZXJhdGVDb21wb25lbnRzKFRleHRSdW5Db21wb25lbnRzKiBjb21wb25l
bnRzLCBjb25zdCBGb250ICZmb250LCBjb25zdCBUZXh0UnVuICZydW4pCi17Ci0gICAgaW50IGxl
dHRlclNwYWNpbmcgPSBmb250LmxldHRlclNwYWNpbmcoKTsKLSAgICBpbnQgd29yZFNwYWNpbmcg
PSBmb250LndvcmRTcGFjaW5nKCk7Ci0gICAgaW50IHBhZGRpbmcgPSBydW4ucGFkZGluZygpOwot
ICAgIGludCBudW1TcGFjZXMgPSAwOwotICAgIGlmIChwYWRkaW5nKSB7Ci0gICAgICAgIGZvciAo
aW50IGkgPSAwOyBpIDwgcnVuLmxlbmd0aCgpOyBpKyspCi0gICAgICAgICAgICBpZiAoRm9udDo6
dHJlYXRBc1NwYWNlKHJ1bltpXSkpCi0gICAgICAgICAgICAgICAgKytudW1TcGFjZXM7Ci0gICAg
fQotCi0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgaWYgKGxldHRlclNwYWNpbmcpIHsKLSAgICAg
ICAgLy8gbmVlZCB0byBkcmF3IGV2ZXJ5IGxldHRlciBvbiBpdCdzIG93bgotICAgICAgICBpbnQg
c3RhcnQgPSAwOwotICAgICAgICBpZiAoRm9udDo6dHJlYXRBc1NwYWNlKHJ1blswXSkpIHsKLSAg
ICAgICAgICAgIGludCBhZGQgPSAwOwotICAgICAgICAgICAgaWYgKG51bVNwYWNlcykgewotICAg
ICAgICAgICAgICAgIGFkZCA9IHBhZGRpbmcvbnVtU3BhY2VzOwotICAgICAgICAgICAgICAgIHBh
ZGRpbmcgLT0gYWRkOwotICAgICAgICAgICAgICAgIC0tbnVtU3BhY2VzOwotICAgICAgICAgICAg
fQotICAgICAgICAgICAgY29tcG9uZW50cy0+YXBwZW5kKFRleHRSdW5Db21wb25lbnQoMSwgZm9u
dCwgb2Zmc2V0KSk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gYWRkICsgbGV0dGVyU3BhY2luZyAr
IGNvbXBvbmVudHMtPmxhc3QoKS5tX3dpZHRoOwotICAgICAgICAgICAgc3RhcnQgPSAxOwotICAg
ICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcnVuLmxlbmd0aCgpOyArK2kpIHsK
LSAgICAgICAgICAgIHVpbnQgY2ggPSBydW5baV07Ci0gICAgICAgICAgICBpZiAoaXNIaWdoU3Vy
cm9nYXRlKGNoKSAmJiBpc0xvd1N1cnJvZ2F0ZShydW5baS0xXSkpCi0gICAgICAgICAgICAgICAg
Y2ggPSBzdXJyb2dhdGVUb1VjczQoY2gsIHJ1bltpLTFdKTsKLSAgICAgICAgICAgIGlmIChpc0xv
d1N1cnJvZ2F0ZShjaCkgfHwgY2F0ZWdvcnkoY2gpID09IE1hcmtfTm9uU3BhY2luZykKLSAgICAg
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChGb250Ojp0cmVhdEFzU3BhY2Uo
cnVuW2ldKSkgewotICAgICAgICAgICAgICAgIGludCBhZGQgPSAwOwotICAgICAgICAgICAgICAg
IGlmIChpIC0gc3RhcnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMtPmFw
cGVuZChUZXh0UnVuQ29tcG9uZW50KHJ1bi5jaGFyYWN0ZXJzKCkgKyBzdGFydCwgaSAtIHN0YXJ0
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBydW4sIGZvbnQsIG9mZnNldCkpOwotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gY29t
cG9uZW50cy0+bGFzdCgpLm1fd2lkdGggKyBsZXR0ZXJTcGFjaW5nOwotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICBpZiAobnVtU3BhY2VzKSB7Ci0gICAgICAgICAgICAgICAgICAg
IGFkZCA9IHBhZGRpbmcvbnVtU3BhY2VzOwotICAgICAgICAgICAgICAgICAgICBwYWRkaW5nIC09
IGFkZDsKLSAgICAgICAgICAgICAgICAgICAgLS1udW1TcGFjZXM7Ci0gICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgICAgIGNvbXBvbmVudHMtPmFwcGVuZChUZXh0UnVuQ29tcG9uZW50KDEs
IGZvbnQsIG9mZnNldCkpOwotICAgICAgICAgICAgICAgIG9mZnNldCArPSB3b3JkU3BhY2luZyAr
IGFkZCArIGNvbXBvbmVudHMtPmxhc3QoKS5tX3dpZHRoICsgbGV0dGVyU3BhY2luZzsKLSAgICAg
ICAgICAgICAgICBzdGFydCA9IGkgKyAxOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAg
ICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkgLSBzdGFydCA+IDApIHsKLSAgICAgICAgICAg
ICAgICBjb21wb25lbnRzLT5hcHBlbmQoVGV4dFJ1bkNvbXBvbmVudChydW4uY2hhcmFjdGVycygp
ICsgc3RhcnQsIGkgLSBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBydW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZm9udCwgb2Zmc2V0KSk7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0
ICs9IGNvbXBvbmVudHMtPmxhc3QoKS5tX3dpZHRoICsgbGV0dGVyU3BhY2luZzsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIHN0YXJ0ID0gaTsKLSAgICAgICAgfQotICAgICAgICBpZiAocnVu
Lmxlbmd0aCgpIC0gc3RhcnQgPiAwKSB7Ci0gICAgICAgICAgICBjb21wb25lbnRzLT5hcHBlbmQo
VGV4dFJ1bkNvbXBvbmVudChydW4uY2hhcmFjdGVycygpICsgc3RhcnQsIHJ1bi5sZW5ndGgoKSAt
IHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
cnVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9u
dCwgb2Zmc2V0KSk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gY29tcG9uZW50cy0+bGFzdCgpLm1f
d2lkdGg7Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0ICs9IGxldHRlclNwYWNpbmc7Ci0gICAg
fSBlbHNlIHsKLSAgICAgICAgaW50IHN0YXJ0ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7
IGkgPCBydW4ubGVuZ3RoKCk7ICsraSkgewotICAgICAgICAgICAgaWYgKEZvbnQ6OnRyZWF0QXNT
cGFjZShydW5baV0pKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGkgLSBzdGFydCA+IDApIHsKLSAg
ICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy0+YXBwZW5kKFRleHRSdW5Db21wb25lbnQocnVu
LmNoYXJhY3RlcnMoKSArIHN0YXJ0LCBpIC0gc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udCwgb2Zmc2V0KSk7Ci0g
ICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBjb21wb25lbnRzLT5sYXN0KCkubV93aWR0aDsK
LSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IGFkZCA9IDA7Ci0gICAgICAg
ICAgICAgICAgaWYgKG51bVNwYWNlcykgewotICAgICAgICAgICAgICAgICAgICBhZGQgPSBwYWRk
aW5nL251bVNwYWNlczsKLSAgICAgICAgICAgICAgICAgICAgcGFkZGluZyAtPSBhZGQ7Ci0gICAg
ICAgICAgICAgICAgICAgIC0tbnVtU3BhY2VzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgICAgICBjb21wb25lbnRzLT5hcHBlbmQoVGV4dFJ1bkNvbXBvbmVudCgxLCBmb250LCBvZmZz
ZXQpKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gYWRkICsgY29tcG9uZW50cy0+bGFzdCgp
Lm1fd2lkdGg7Ci0gICAgICAgICAgICAgICAgaWYgKGkpCi0gICAgICAgICAgICAgICAgICAgIG9m
ZnNldCArPSB3b3JkU3BhY2luZzsKLSAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOwotICAg
ICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChydW4ubGVuZ3RoKCkgLSBzdGFydCA+
IDApIHsKLSAgICAgICAgICAgIGNvbXBvbmVudHMtPmFwcGVuZChUZXh0UnVuQ29tcG9uZW50KHJ1
bi5jaGFyYWN0ZXJzKCkgKyBzdGFydCwgcnVuLmxlbmd0aCgpIC0gc3RhcnQsCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW4sCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LCBvZmZzZXQpKTsKLSAgICAg
ICAgICAgIG9mZnNldCArPSBjb21wb25lbnRzLT5sYXN0KCkubV93aWR0aDsKLSAgICAgICAgfQot
ICAgIH0KLSAgICByZXR1cm4gb2Zmc2V0OwotfQotCi12b2lkIEZvbnQ6OmRyYXdDb21wbGV4VGV4
dChHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxv
YXRQb2ludCYgcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50
IHRvKSBjb25zdAotewotICAgIGlmICh0byA8IDApCi0gICAgICAgIHRvID0gcnVuLmxlbmd0aCgp
OwotICAgIGlmIChmcm9tIDwgMCkKLSAgICAgICAgZnJvbSA9IDA7Ci0KLSAgICBUZXh0UnVuQ29t
cG9uZW50cyBjb21wb25lbnRzOwotICAgIGludCB3ID0gZ2VuZXJhdGVDb21wb25lbnRzKCZjb21w
b25lbnRzLCAqdGhpcywgcnVuKTsKLQotICAgIGludCBjdXJQb3MgPSAwOwotICAgIGZvciAoaW50
IGkgPSAwOyBpIDwgKGludCljb21wb25lbnRzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0
IFRleHRSdW5Db21wb25lbnQmIGNvbXAgPSBjb21wb25lbnRzLmF0KGkpOwotICAgICAgICBpbnQg
bGVuID0gY29tcC50ZXh0TGVuZ3RoKCk7Ci0gICAgICAgIGludCBjdXJFbmQgPSBjdXJQb3MgKyBs
ZW47Ci0gICAgICAgIGlmIChjdXJQb3MgPCB0byAmJiBmcm9tIDwgY3VyRW5kICYmICFjb21wLmlz
U3BhY2UoKSkgewotICAgICAgICAgICAgRmxvYXRQb2ludCBwdCA9IHBvaW50OwotICAgICAgICAg
ICAgaWYgKHJ1bi5ydGwoKSkKLSAgICAgICAgICAgICAgICBwdC5zZXRYKHBvaW50LngoKSArIHcg
LSBjb21wLm1fb2Zmc2V0IC0gY29tcC5tX3dpZHRoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAg
ICAgICAgICAgICBwdC5zZXRYKHBvaW50LngoKSArIGNvbXAubV9vZmZzZXQpOwotICAgICAgICAg
ICAgZHJhd1NpbXBsZVRleHQoY29udGV4dCwgY29tcC5tX3RleHRSdW4sIHB0LCBmcm9tIC0gY3Vy
UG9zLCBzdGQ6Om1pbih0bywgY3VyRW5kKSAtIGN1clBvcyk7Ci0gICAgICAgIH0KLSAgICAgICAg
Y3VyUG9zICs9IGxlbjsKLSAgICAgICAgaWYgKGZyb20gPCBjdXJQb3MpCi0gICAgICAgICAgICBm
cm9tID0gY3VyUG9zOwotICAgIH0KLX0KLQotZmxvYXQgRm9udDo6ZmxvYXRXaWR0aEZvckNvbXBs
ZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+
KiBmYWxsYmFja0ZvbnRzLCBHbHlwaE92ZXJmbG93KiBnbHlwaE92ZXJmbG93KSBjb25zdAotewot
ICAgIFRleHRSdW5Db21wb25lbnRzIGNvbXBvbmVudHM7Ci0gICAgaW50IHcgPSBnZW5lcmF0ZUNv
bXBvbmVudHMoJmNvbXBvbmVudHMsICp0aGlzLCBydW4pOwotICAgIHJldHVybiB3OwotfQotCi1p
bnQgRm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25Gb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBy
dW4sIGludCBwb3NpdGlvbiwgYm9vbCBpbmNsdWRlUGFydGlhbEdseXBocykgY29uc3QKLXsKLSAg
ICBUZXh0UnVuQ29tcG9uZW50cyBjb21wb25lbnRzOwotICAgIGludCB3ID0gZ2VuZXJhdGVDb21w
b25lbnRzKCZjb21wb25lbnRzLCAqdGhpcywgcnVuKTsKLQotICAgIGlmIChwb3NpdGlvbiA+PSB3
KQotICAgICAgICByZXR1cm4gcnVuLmxlbmd0aCgpOwotCi0gICAgaW50IG9mZnNldCA9IDA7Ci0g
ICAgaWYgKHJ1bi5ydGwoKSkgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbXBv
bmVudHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGNvbnN0IFRleHRSdW5Db21wb25lbnQm
IGNvbXAgPSBjb21wb25lbnRzLmF0KGkpOwotICAgICAgICAgICAgaW50IHhlID0gdyAtIGNvbXAu
bV9vZmZzZXQ7Ci0gICAgICAgICAgICBpbnQgeHMgPSB4ZSAtIGNvbXAubV93aWR0aDsKLSAgICAg
ICAgICAgIGlmIChwb3NpdGlvbiA+PSB4cykKLSAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0
ICsgKGNvbXAuaXNTcGFjZSgpCi0gICAgICAgICAgICAgICAgICAgID8gc3RhdGljX2Nhc3Q8aW50
PigocG9zaXRpb24gLSB4ZSkgKiBjb21wLm1fc3BhY2VzIC8gc3RkOjptYXgoMS5mLCBjb21wLm1f
d2lkdGgpICsgMC41KQotICAgICAgICAgICAgICAgICAgICA6IG9mZnNldEZvclBvc2l0aW9uRm9y
U2ltcGxlVGV4dChjb21wLm1fdGV4dFJ1biwgcG9zaXRpb24gLSB4cywgaW5jbHVkZVBhcnRpYWxH
bHlwaHMpKTsKLQotICAgICAgICAgICAgb2Zmc2V0ICs9IGNvbXAudGV4dExlbmd0aCgpOwotICAg
ICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb21w
b25lbnRzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBjb25zdCBUZXh0UnVuQ29tcG9uZW50
JiBjb21wID0gY29tcG9uZW50cy5hdChpKTsKLSAgICAgICAgICAgIGludCB4cyA9IGNvbXAubV9v
ZmZzZXQ7Ci0gICAgICAgICAgICBpbnQgeGUgPSB4cyArIGNvbXAubV93aWR0aDsKLSAgICAgICAg
ICAgIGlmIChwb3NpdGlvbiA8PSB4ZSkgewotICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiAt
IHhzID49IHhlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0ICsgY29tcC50ZXh0
TGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldCArIChjb21wLmlzU3BhY2Uo
KQotICAgICAgICAgICAgICAgICAgICA/IHN0YXRpY19jYXN0PGludD4oKHBvc2l0aW9uIC0geHMp
ICogY29tcC5tX3NwYWNlcyAvIHN0ZDo6bWF4KDEuZiwgY29tcC5tX3dpZHRoKSArIDAuNSkKLSAg
ICAgICAgICAgICAgICAgICAgOiBvZmZzZXRGb3JQb3NpdGlvbkZvclNpbXBsZVRleHQoY29tcC5t
X3RleHRSdW4sIHBvc2l0aW9uIC0geHMsIGluY2x1ZGVQYXJ0aWFsR2x5cGhzKSk7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgICAgICBvZmZzZXQgKz0gY29tcC50ZXh0TGVuZ3RoKCk7Ci0gICAgICAg
IH0KLSAgICB9Ci0gICAgcmV0dXJuIHJ1bi5sZW5ndGgoKTsKLX0KLQotCi1zdGF0aWMgZmxvYXQg
Y3Vyc29yVG9YKGNvbnN0IEZvbnQqIGZvbnQsIGNvbnN0IFRleHRSdW5Db21wb25lbnRzJiBjb21w
b25lbnRzLCBpbnQgd2lkdGgsIGJvb2wgcnRsLCBpbnQgY3Vyc29yKQotewotICAgIGludCBzdGFy
dCA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb21wb25lbnRzLnNpemUoKTsgKytp
KSB7Ci0gICAgICAgIGNvbnN0IFRleHRSdW5Db21wb25lbnQmIGNvbXAgPSBjb21wb25lbnRzLmF0
KGkpOwotICAgICAgICBpZiAoc3RhcnQgKyBjb21wLnRleHRMZW5ndGgoKSA8PSBjdXJzb3IpIHsK
LSAgICAgICAgICAgIHN0YXJ0ICs9IGNvbXAudGV4dExlbmd0aCgpOwotICAgICAgICAgICAgY29u
dGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHhzID0gY29tcC5tX29mZnNldDsKLSAgICAg
ICAgaWYgKHJ0bCkKLSAgICAgICAgICAgIHhzID0gd2lkdGggLSB4cyAtIGNvbXAubV93aWR0aDsK
LQotICAgICAgICBpbnQgcG9zID0gY3Vyc29yIC0gc3RhcnQ7Ci0gICAgICAgIGlmIChjb21wLmlz
U3BhY2UoKSkgewotICAgICAgICAgICAgaWYgKHJ0bCkKLSAgICAgICAgICAgICAgICBwb3MgPSBj
b21wLnRleHRMZW5ndGgoKSAtIHBvczsKLSAgICAgICAgICAgIHJldHVybiB4cyArIHBvcyAqIGNv
bXAubV93aWR0aCAvIGNvbXAubV9zcGFjZXM7Ci0gICAgICAgIH0KLSAgICAgICAgV2lkdGhJdGVy
YXRvciBpdChmb250LCBjb21wLm1fdGV4dFJ1bik7Ci0gICAgICAgIGl0LmFkdmFuY2UocG9zKTsK
LSAgICAgICAgcmV0dXJuIHhzICsgaXQubV9ydW5XaWR0aFNvRmFyOwotICAgIH0KLSAgICByZXR1
cm4gd2lkdGg7Ci19Ci0KLUZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRl
eHQoY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBJbnRQb2ludCYgcHQsCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0Ci17
Ci0gICAgVGV4dFJ1bkNvbXBvbmVudHMgY29tcG9uZW50czsKLSAgICBpbnQgdyA9IGdlbmVyYXRl
Q29tcG9uZW50cygmY29tcG9uZW50cywgKnRoaXMsIHJ1bik7Ci0KLSAgICBpZiAoIWZyb20gJiYg
dG8gPT0gcnVuLmxlbmd0aCgpKQotICAgICAgICByZXR1cm4gRmxvYXRSZWN0KHB0LngoKSwgcHQu
eSgpLCB3LCBoKTsKLQotICAgIGZsb2F0IHgxID0gY3Vyc29yVG9YKHRoaXMsIGNvbXBvbmVudHMs
IHcsIHJ1bi5ydGwoKSwgZnJvbSk7Ci0gICAgZmxvYXQgeDIgPSBjdXJzb3JUb1godGhpcywgY29t
cG9uZW50cywgdywgcnVuLnJ0bCgpLCB0byk7Ci0gICAgaWYgKHgyIDwgeDEpCi0gICAgICAgIHN0
ZDo6c3dhcCh4MSwgeDIpOwotCi0gICAgcmV0dXJuIEZsb2F0UmVjdChwdC54KCkgKyB4MSwgcHQu
eSgpLCB4MiAtIHgxLCBoKTsKLX0KLQotYm9vbCBGb250OjpjYW5SZXR1cm5GYWxsYmFja0ZvbnRz
Rm9yQ29tcGxleFRleHQoKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotfQpJbmRleDogV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HbHlwaFBhZ2VUcmVlTm9kZVdpbkNFLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0dseXBoUGFnZVRy
ZWVOb2RlV2luQ0UuY3BwCShyZXZpc2lvbiA1NzI4OSkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW5jZS9HbHlwaFBhZ2VUcmVlTm9kZVdpbmNlLmNwcDo1NzI4OSkKKysrIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvR2x5cGhQYWdlVHJlZU5vZGVXaW5DRS5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDct
MjAwOSBUb3JjaCBNb2JpbGUgSW5jLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNl
IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAq
ICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w
ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg
d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZ
IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAg
WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZp
bGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBC
b3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkdseXBoUGFnZVRyZWVOb2RlLmgiCisKKyNpbmNsdWRlICJGb250LmgiCisj
aW5jbHVkZSAiRm9udENhY2hlLmgiCisjaW5jbHVkZSAiRm9udERhdGEuaCIKKyNpbmNsdWRlICJT
aW1wbGVGb250RGF0YS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0RXT1JEIGdldEtub3du
Rm9udENvZGVQYWdlcyhjb25zdCB3Y2hhcl90KiBmYW1pbHkpOworCit0eXBlZGVmIHVuc2lnbmVk
ICgqZnVuY0dldENoYXJDb2RlUGFnZXMpKHVuc2lnbmVkIHNob3J0IGMsIHVuc2lnbmVkJiBsYXN0
UG9zKTsKK2Z1bmNHZXRDaGFyQ29kZVBhZ2VzIGdldENoYXJDb2RlUGFnZXMgPSAwOworCitib29s
IEdseXBoUGFnZTo6ZmlsbCh1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGxlbmd0aCwgVUNoYXIq
IGJ1ZmZlciwgdW5zaWduZWQgYnVmZmVyTGVuZ3RoLCBjb25zdCBTaW1wbGVGb250RGF0YSogZm9u
dERhdGEpCit7CisgICAgaWYgKGxlbmd0aCAhPSBidWZmZXJMZW5ndGgpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIGlmIChmb250RGF0YS0+cGxhdGZvcm1EYXRhKCkuaGZvbnQoKSkgewor
ICAgICAgICBEV09SRCBmb250Q29kZVBhZ2VzID0gZm9udERhdGEtPnBsYXRmb3JtRGF0YSgpLmNv
ZGVQYWdlcygpOworICAgICAgICBpZiAoZm9udENvZGVQYWdlcykgeworICAgICAgICAgICAgaWYg
KGdldENoYXJDb2RlUGFnZXMpIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsYXN0UG9zID0g
MDsKKyAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgYnVmZmVyTGVuZ3Ro
OyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgRFdPUkQgYWN0dWFsQ29kZVBhZ2VzID0gZ2V0
Q2hhckNvZGVQYWdlcyhidWZmZXJbaV0sIGxhc3RQb3MpOworICAgICAgICAgICAgICAgICAgICBp
ZiAoIWFjdHVhbENvZGVQYWdlcyB8fCAoYWN0dWFsQ29kZVBhZ2VzICYgZm9udENvZGVQYWdlcykp
CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRHbHlwaERhdGFGb3JJbmRleChvZmZzZXQgKyBp
LCBidWZmZXJbaV0sIGZvbnREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAg
ICAgICAgICAgICAgICAgICAgc2V0R2x5cGhEYXRhRm9ySW5kZXgob2Zmc2V0ICsgaSwgYnVmZmVy
W2ldLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisjaWYgZGVmaW5lZChJTUxBTkdfRk9OVF9MSU5LKSAmJiAoSU1MQU5HX0ZPTlRfTElOSyA9PSAy
KQorICAgICAgICAgICAgfSBlbHNlIGlmIChJTUxhbmdGb250TGluazIqIGxhbmdGb250TGluayA9
IGZvbnRDYWNoZSgpLT5nZXRGb250TGlua0ludGVyZmFjZSgpKSB7CisjZWxzZQorICAgICAgICAg
ICAgfSBlbHNlIGlmIChJTUxhbmdGb250TGluayogbGFuZ0ZvbnRMaW5rID0gZm9udENhY2hlKCkt
PmdldEZvbnRMaW5rSW50ZXJmYWNlKCkpIHsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBidWZmZXJMZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAg
ICAgICBEV09SRCBhY3R1YWxDb2RlUGFnZXM7CisgICAgICAgICAgICAgICAgICAgIGxhbmdGb250
TGluay0+R2V0Q2hhckNvZGVQYWdlcyhidWZmZXJbaV0sICZhY3R1YWxDb2RlUGFnZXMpOworICAg
ICAgICAgICAgICAgICAgICBpZiAoIWFjdHVhbENvZGVQYWdlcyB8fCAoYWN0dWFsQ29kZVBhZ2Vz
ICYgZm9udENvZGVQYWdlcykpCisgICAgICAgICAgICAgICAgICAgICAgICBzZXRHbHlwaERhdGFG
b3JJbmRleChvZmZzZXQgKyBpLCBidWZmZXJbaV0sIGZvbnREYXRhKTsKKyAgICAgICAgICAgICAg
ICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0R2x5cGhEYXRhRm9ySW5kZXgo
b2Zmc2V0ICsgaSwgYnVmZmVyW2ldLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpCisgICAgICAgIHNldEdseXBo
RGF0YUZvckluZGV4KG9mZnNldCArIGksIGJ1ZmZlcltpXSwgZm9udERhdGEpOworCisgICAgcmV0
dXJuIHRydWU7Cit9CisKK30KKwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5j
ZS9HbHlwaFBhZ2VUcmVlTm9kZVdpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbmNlL0dseXBoUGFnZVRyZWVOb2RlV2luQ0UuY3BwCShyZXZpc2lvbiA1
NzI4OSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvR2x5cGhQYWdlVHJlZU5v
ZGVXaW5DRS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTc1LDUgKzc1LDQgQEAgYm9vbCBHbHlwaFBh
Z2U6OmZpbGwodW5zaWduZWQgb2Zmc2V0LCB1bgogICAgIHJldHVybiB0cnVlOwogfQogCi19Ci0K
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luY2UvR2x5cGhQYWdlVHJlZU5vZGVXaW5jZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HbHlwaFBhZ2VUcmVlTm9kZVdpbmNlLmNwcAkocmV2aXNp
b24gNTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0dseXBoUGFnZVRy
ZWVOb2RlV2luY2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiAg
Q29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlIEluYy4KLSAqCi0gKiAgVGhpcyBs
aWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgot
ICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljCi0gKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbjsgZWl0aGVyCi0gKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91
ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUaGlzIGxpYnJhcnkgaXMgZGlz
dHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lU
SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgot
ICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g
IFNlZSB0aGUgR05VCi0gKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl
IGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhl
IEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMg
bGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICog
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwg
RmlmdGggRmxvb3IsCi0gKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0gKgotICovCi0K
LSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJHbHlwaFBhZ2VUcmVlTm9kZS5oIgotCi0j
aW5jbHVkZSAiRm9udC5oIgotI2luY2x1ZGUgIkZvbnRDYWNoZS5oIgotI2luY2x1ZGUgIkZvbnRE
YXRhLmgiCi0jaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUg
ewotCi1EV09SRCBnZXRLbm93bkZvbnRDb2RlUGFnZXMoY29uc3Qgd2NoYXJfdCogZmFtaWx5KTsK
LQotdHlwZWRlZiB1bnNpZ25lZCAoKmZ1bmNHZXRDaGFyQ29kZVBhZ2VzKSh1bnNpZ25lZCBzaG9y
dCBjLCB1bnNpZ25lZCYgbGFzdFBvcyk7Ci1mdW5jR2V0Q2hhckNvZGVQYWdlcyBnZXRDaGFyQ29k
ZVBhZ2VzID0gMDsKLQotYm9vbCBHbHlwaFBhZ2U6OmZpbGwodW5zaWduZWQgb2Zmc2V0LCB1bnNp
Z25lZCBsZW5ndGgsIFVDaGFyKiBidWZmZXIsIHVuc2lnbmVkIGJ1ZmZlckxlbmd0aCwgY29uc3Qg
U2ltcGxlRm9udERhdGEqIGZvbnREYXRhKQotewotICAgIGlmIChsZW5ndGggIT0gYnVmZmVyTGVu
Z3RoKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoZm9udERhdGEtPnBsYXRmb3Jt
RGF0YSgpLmhmb250KCkpIHsKLSAgICAgICAgRFdPUkQgZm9udENvZGVQYWdlcyA9IGZvbnREYXRh
LT5wbGF0Zm9ybURhdGEoKS5jb2RlUGFnZXMoKTsKLSAgICAgICAgaWYgKGZvbnRDb2RlUGFnZXMp
IHsKLSAgICAgICAgICAgIGlmIChnZXRDaGFyQ29kZVBhZ2VzKSB7Ci0gICAgICAgICAgICAgICAg
dW5zaWduZWQgbGFzdFBvcyA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IGJ1ZmZlckxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERXT1JEIGFj
dHVhbENvZGVQYWdlcyA9IGdldENoYXJDb2RlUGFnZXMoYnVmZmVyW2ldLCBsYXN0UG9zKTsKLSAg
ICAgICAgICAgICAgICAgICAgaWYgKCFhY3R1YWxDb2RlUGFnZXMgfHwgKGFjdHVhbENvZGVQYWdl
cyAmIGZvbnRDb2RlUGFnZXMpKQotICAgICAgICAgICAgICAgICAgICAgICAgc2V0R2x5cGhEYXRh
Rm9ySW5kZXgob2Zmc2V0ICsgaSwgYnVmZmVyW2ldLCBmb250RGF0YSk7Ci0gICAgICAgICAgICAg
ICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEdseXBoRGF0YUZvckluZGV4
KG9mZnNldCArIGksIGJ1ZmZlcltpXSwgMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgICAgIHJldHVybiB0cnVlOwotI2lmIGRlZmluZWQoSU1MQU5HX0ZPTlRfTElOSykgJiYgKElN
TEFOR19GT05UX0xJTksgPT0gMikKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoSU1MYW5nRm9udExp
bmsyKiBsYW5nRm9udExpbmsgPSBmb250Q2FjaGUoKS0+Z2V0Rm9udExpbmtJbnRlcmZhY2UoKSkg
ewotI2Vsc2UKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoSU1MYW5nRm9udExpbmsqIGxhbmdGb250
TGluayA9IGZvbnRDYWNoZSgpLT5nZXRGb250TGlua0ludGVyZmFjZSgpKSB7Ci0jZW5kaWYKLSAg
ICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgYnVmZmVyTGVuZ3RoOyArK2kp
IHsKLSAgICAgICAgICAgICAgICAgICAgRFdPUkQgYWN0dWFsQ29kZVBhZ2VzOwotICAgICAgICAg
ICAgICAgICAgICBsYW5nRm9udExpbmstPkdldENoYXJDb2RlUGFnZXMoYnVmZmVyW2ldLCAmYWN0
dWFsQ29kZVBhZ2VzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFhY3R1YWxDb2RlUGFnZXMg
fHwgKGFjdHVhbENvZGVQYWdlcyAmIGZvbnRDb2RlUGFnZXMpKQotICAgICAgICAgICAgICAgICAg
ICAgICAgc2V0R2x5cGhEYXRhRm9ySW5kZXgob2Zmc2V0ICsgaSwgYnVmZmVyW2ldLCBmb250RGF0
YSk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHNl
dEdseXBoRGF0YUZvckluZGV4KG9mZnNldCArIGksIGJ1ZmZlcltpXSwgMCk7Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbmd0aDsgKytp
KQotICAgICAgICBzZXRHbHlwaERhdGFGb3JJbmRleChvZmZzZXQgKyBpLCBidWZmZXJbaV0sIGZv
bnREYXRhKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi19Ci0KSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luY2UvR3JhZGllbnRXaW5DRS5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HcmFkaWVudFdpbkNFLmNwcAkocmV2aXNpb24g
NTcyODkpCShmcm9tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvR3JhZGllbnRXaW5j
ZS5jcHA6NTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0dyYWRpZW50
V2luQ0UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp
dCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg
KiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy
cmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj
b3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcg
d2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3Jp
dGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xp
biBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgor
ICovCisKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkdyYWRpZW50LmgiCisKKyNp
bmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2b2lk
IEdyYWRpZW50OjpwbGF0Zm9ybURlc3Ryb3koKQoreworfQorCitzdGF0aWMgaW5saW5lIGJvb2wg
Y29tcGFyZVN0b3BzKGNvbnN0IEdyYWRpZW50OjpDb2xvclN0b3AmIGEsIGNvbnN0IEdyYWRpZW50
OjpDb2xvclN0b3AmIGIpCit7CisgICAgcmV0dXJuIGEuc3RvcCA8IGIuc3RvcDsKK30KKworY29u
c3QgVmVjdG9yPEdyYWRpZW50OjpDb2xvclN0b3A+JiBHcmFkaWVudDo6Z2V0U3RvcHMoKSBjb25z
dAoreworICAgIGlmICghbV9zdG9wc1NvcnRlZCkgeworICAgICAgICBpZiAobV9zdG9wcy5zaXpl
KCkpCisgICAgICAgICAgICBzdGQ6OnN0YWJsZV9zb3J0KG1fc3RvcHMuYmVnaW4oKSwgbV9zdG9w
cy5lbmQoKSwgY29tcGFyZVN0b3BzKTsKKyAgICAgICAgbV9zdG9wc1NvcnRlZCA9IHRydWU7Cisg
ICAgfQorICAgIHJldHVybiBtX3N0b3BzOworfQorCit2b2lkIEdyYWRpZW50OjpmaWxsKEdyYXBo
aWNzQ29udGV4dCogYywgY29uc3QgRmxvYXRSZWN0JiByKQoreworICAgIGMtPmZpbGxSZWN0KHIs
IHRoaXMpOworfQorCit9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0dy
YWRpZW50V2luQ0UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luY2UvR3JhZGllbnRXaW5DRS5jcHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9HcmFkaWVudFdpbkNFLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
NDksNCArNDksNCBAQCB2b2lkIEdyYWRpZW50OjpmaWxsKEdyYXBoaWNzQ29udGV4dCogYywKICAg
ICBjLT5maWxsUmVjdChyLCB0aGlzKTsKIH0KIAotfQorfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HcmFkaWVudFdpbmNlLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0dyYWRpZW50V2lu
Y2UuY3BwCShyZXZpc2lvbiA1NzI4OSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
Y2UvR3JhZGllbnRXaW5jZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNTIgKzAsMCBAQAotLyoK
LSAqIENvcHlyaWdodCAoQykgMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KLSAqCi0gKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk
aXN0cmlidXRlIGl0IGFuZC9vcgotICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl
IEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiAgdmVyc2lvbiAyIG9mIHRo
ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAq
ICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg
aW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiAgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSBy
ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UK
LSAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAg
SWYgbm90LCB3cml0ZSB0bwotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4s
IDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0gKiAgQm9zdG9uLCBNQSAwMjExMC0x
MzAxLCBVU0EuCi0gKi8KLQotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiR3JhZGll
bnQuaCIKLQotI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgotCi1uYW1lc3BhY2UgV2ViQ29y
ZSB7Ci0KLXZvaWQgR3JhZGllbnQ6OnBsYXRmb3JtRGVzdHJveSgpCi17Ci19Ci0KLXN0YXRpYyBp
bmxpbmUgYm9vbCBjb21wYXJlU3RvcHMoY29uc3QgR3JhZGllbnQ6OkNvbG9yU3RvcCYgYSwgY29u
c3QgR3JhZGllbnQ6OkNvbG9yU3RvcCYgYikKLXsKLSAgICByZXR1cm4gYS5zdG9wIDwgYi5zdG9w
OwotfQotCi1jb25zdCBWZWN0b3I8R3JhZGllbnQ6OkNvbG9yU3RvcD4mIEdyYWRpZW50OjpnZXRT
dG9wcygpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3N0b3BzU29ydGVkKSB7Ci0gICAgICAgIGlmICht
X3N0b3BzLnNpemUoKSkKLSAgICAgICAgICAgIHN0ZDo6c3RhYmxlX3NvcnQobV9zdG9wcy5iZWdp
bigpLCBtX3N0b3BzLmVuZCgpLCBjb21wYXJlU3RvcHMpOwotICAgICAgICBtX3N0b3BzU29ydGVk
ID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIG1fc3RvcHM7Ci19Ci0KLXZvaWQgR3JhZGllbnQ6
OmZpbGwoR3JhcGhpY3NDb250ZXh0KiBjLCBjb25zdCBGbG9hdFJlY3QmIHIpCi17Ci0gICAgYy0+
ZmlsbFJlY3QociwgdGhpcyk7Ci19Ci0KLX0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luY2UvR3JhcGhpY3NDb250ZXh0V2luQ0UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvR3JhcGhpY3NDb250ZXh0V2luQ0UuY3BwCShyZXZpc2lv
biA1NzI4OSkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HcmFwaGljc0Nv
bnRleHRXaW5jZS5jcHA6NTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNl
L0dyYXBoaWNzQ29udGV4dFdpbkNFLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE5NDAg
QEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlIEluYy4KKyAq
CisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl
IGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxp
YnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwK
KyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3
cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5r
bGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0Eu
CisgKgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRl
eHQuaCIKKworI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgorI2luY2x1ZGUgIkNoYXJhY3Rl
ck5hbWVzLmgiCisjaW5jbHVkZSAiRm9udC5oIgorI2luY2x1ZGUgIkdseXBoQnVmZmVyLmgiCisj
aW5jbHVkZSAiR3JhZGllbnQuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHRQcml2YXRlLmgi
CisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQYXRoLmgiCisjaW5jbHVk
ZSAiUGxhdGZvcm1QYXRoV2luY2UuaCIKKyNpbmNsdWRlICJTaGFyZWRCaXRtYXAuaCIKKyNpbmNs
dWRlICJTaW1wbGVGb250RGF0YS5oIgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKworI2luY2x1
ZGUgPHdpbmRvd3MuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit0eXBlZGVmIHZvaWQgKCpG
dW5jR3JhZGllbnRGaWxsUmVjdExpbmVhcikoSERDIGhkYywgY29uc3QgSW50UmVjdCYgciwgY29u
c3QgSW50UG9pbnQmIHAwLCBjb25zdCBJbnRQb2ludCYgcDEsIGNvbnN0IFZlY3RvcjxHcmFkaWVu
dDo6Q29sb3JTdG9wPiYgc3RvcHMpOwordHlwZWRlZiB2b2lkICgqRnVuY0dyYWRpZW50RmlsbFJl
Y3RSYWRpYWwpKEhEQyBoZGMsIGNvbnN0IEludFJlY3QmIHIsIGNvbnN0IEludFBvaW50JiBwMCwg
Y29uc3QgSW50UG9pbnQmIHAxLCBmbG9hdCByMCwgZmxvYXQgcjEsIGNvbnN0IFZlY3RvcjxHcmFk
aWVudDo6Q29sb3JTdG9wPiYgc3RvcHMpOworRnVuY0dyYWRpZW50RmlsbFJlY3RMaW5lYXIgZ19s
aW5lYXJHcmFkaWVudEZpbGxlciA9IDA7CitGdW5jR3JhZGllbnRGaWxsUmVjdFJhZGlhbCBnX3Jh
ZGlhbEdyYWRpZW50RmlsbGVyID0gMDsKKworc3RhdGljIGlubGluZSBib29sIGlzWmVybyhkb3Vi
bGUgZCkKK3sKKyAgICByZXR1cm4gZCA+IDAgPyBkIDw9IDEuRS0xMCA6IGQgPj0gLTEuRS0xMDsK
K30KKworLy8gc3RhYmxlUm91bmQgcm91bmRzIC0wLjUgdG8gMCwgd2hlcmUgbHJvdW5kIHJvdW5k
cyAtMC41IHRvIC0xLgorc3RhdGljIGlubGluZSBpbnQgc3RhYmxlUm91bmQoZG91YmxlIGQpCit7
CisgICAgaWYgKGQgPiAwKQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihkICsgMC41
KTsKKworICAgIGludCBpID0gc3RhdGljX2Nhc3Q8aW50PihkKTsKKyAgICByZXR1cm4gaSAtIGQg
PiAwLjUgPyBpIC0gMSA6IGk7Cit9CisKKy8vIFVubGlrZSBlbmNsb3NpbmdJbnRSZWN0KCksIHRo
aXMgZnVuY3Rpb24gZG9lcyBzdHJpY3Qgcm91bmRpbmcuCitzdGF0aWMgaW5saW5lIEludFJlY3Qg
cm91bmRSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcikKK3sKKyAgICByZXR1cm4gSW50UmVjdChzdGFi
bGVSb3VuZChyLngoKSksIHN0YWJsZVJvdW5kKHIueSgpKSwgc3RhYmxlUm91bmQoci5yaWdodCgp
KSAtIHN0YWJsZVJvdW5kKHIueCgpKSwgc3RhYmxlUm91bmQoci5ib3R0b20oKSkgLSBzdGFibGVS
b3VuZChyLnkoKSkpOworfQorCisvLyBSb3RhdGlvbiB0cmFuc2Zvcm1hdGlvbgorY2xhc3MgUm90
YXRpb25UcmFuc2Zvcm0geworcHVibGljOgorICAgIFJvdGF0aW9uVHJhbnNmb3JtKCkKKyAgICAg
ICAgOiBtX2Nvc0EoMS4pCisgICAgICAgICwgbV9zaW5BKDAuKQorICAgICAgICAsIG1fcHJlU2hp
ZnRYKDApCisgICAgICAgICwgbV9wcmVTaGlmdFkoMCkKKyAgICAgICAgLCBtX3Bvc3RTaGlmdFgo
MCkKKyAgICAgICAgLCBtX3Bvc3RTaGlmdFkoMCkKKyAgICB7CisgICAgfQorICAgIFJvdGF0aW9u
VHJhbnNmb3JtIG9wZXJhdG9yLSgpIGNvbnN0CisgICAgeworICAgICAgICBSb3RhdGlvblRyYW5z
Zm9ybSBydG47CisgICAgICAgIHJ0bi5tX2Nvc0EgPSBtX2Nvc0E7CisgICAgICAgIHJ0bi5tX3Np
bkEgPSAtbV9zaW5BOworICAgICAgICBydG4ubV9wcmVTaGlmdFggPSBtX3Bvc3RTaGlmdFg7Cisg
ICAgICAgIHJ0bi5tX3ByZVNoaWZ0WSA9IG1fcG9zdFNoaWZ0WTsKKyAgICAgICAgcnRuLm1fcG9z
dFNoaWZ0WCA9IG1fcHJlU2hpZnRYOworICAgICAgICBydG4ubV9wb3N0U2hpZnRZID0gbV9wcmVT
aGlmdFk7CisgICAgICAgIHJldHVybiBydG47CisgICAgfQorICAgIHZvaWQgbWFwKGRvdWJsZSB4
MSwgZG91YmxlIHkxLCBkb3VibGUqIHgyLCBkb3VibGUqIHkyKSBjb25zdAorICAgIHsKKyAgICAg
ICAgeDEgKz0gbV9wcmVTaGlmdFg7CisgICAgICAgIHkxICs9IG1fcHJlU2hpZnRZOworICAgICAg
ICAqeDIgPSB4MSAqIG1fY29zQSArIHkxICogbV9zaW5BICsgbV9wb3N0U2hpZnRYOworICAgICAg
ICAqeTIgPSB5MSAqIG1fY29zQSAtIHgxICogbV9zaW5BICsgbV9wb3N0U2hpZnRZOworICAgIH0K
KyAgICB2b2lkIG1hcChpbnQgeDEsIGludCB5MSwgaW50KiB4MiwgaW50KiB5MikgY29uc3QKKyAg
ICB7CisgICAgICAgIHgxICs9IG1fcHJlU2hpZnRYOworICAgICAgICB5MSArPSBtX3ByZVNoaWZ0
WTsKKyAgICAgICAgKngyID0gc3RhYmxlUm91bmQoeDEgKiBtX2Nvc0EgKyB5MSAqIG1fc2luQSkg
KyBtX3Bvc3RTaGlmdFg7CisgICAgICAgICp5MiA9IHN0YWJsZVJvdW5kKHkxICogbV9jb3NBIC0g
eDEgKiBtX3NpbkEpICsgbV9wb3N0U2hpZnRZOworICAgIH0KKworICAgIGRvdWJsZSBtX2Nvc0E7
CisgICAgZG91YmxlIG1fc2luQTsKKyAgICBpbnQgbV9wcmVTaGlmdFg7CisgICAgaW50IG1fcHJl
U2hpZnRZOworICAgIGludCBtX3Bvc3RTaGlmdFg7CisgICAgaW50IG1fcG9zdFNoaWZ0WTsKK307
CisKK3RlbXBsYXRlPGNsYXNzIFQ+IHN0YXRpYyBpbmxpbmUgSW50UG9pbnQgbWFwUG9pbnQoY29u
c3QgSW50UG9pbnQmIHAsIGNvbnN0IFQmIHQpCit7CisgICAgaW50IHgsIHk7CisgICAgdC5tYXAo
cC54KCksIHAueSgpLCAmeCwgJnkpOworICAgIHJldHVybiBJbnRQb2ludCh4LCB5KTsKK30KKwor
dGVtcGxhdGU8Y2xhc3MgVD4gc3RhdGljIGlubGluZSBGbG9hdFBvaW50IG1hcFBvaW50KGNvbnN0
IEZsb2F0UG9pbnQmIHAsIGNvbnN0IFQmIHQpCit7CisgICAgZG91YmxlIHgsIHk7CisgICAgdC5t
YXAocC54KCksIHAueSgpLCAmeCwgJnkpOworICAgIHJldHVybiBGbG9hdFBvaW50KHN0YXRpY19j
YXN0PGZsb2F0Pih4KSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHkpKTsKK30KKwordGVtcGxhdGU8Y2xh
c3MgVHJhbnNmb3JtLCBjbGFzcyBSZWN0LCBjbGFzcyBWYWx1ZT4gc3RhdGljIGlubGluZSBSZWN0
IG1hcFJlY3QoY29uc3QgUmVjdCYgcmVjdCwgY29uc3QgVHJhbnNmb3JtJiB0cmFuc2Zvcm0pCit7
CisgICAgVmFsdWUgeFs0XSwgeVs0XTsKKyAgICBWYWx1ZSBsLCB0LCByLCBiOworICAgIHIgPSBy
ZWN0LnJpZ2h0KCkgLSAxOworICAgIGIgPSByZWN0LmJvdHRvbSgpIC0gMTsKKyAgICB0cmFuc2Zv
cm0ubWFwKHJlY3QueCgpLCByZWN0LnkoKSwgeCwgeSk7CisgICAgdHJhbnNmb3JtLm1hcChyZWN0
LngoKSwgYiwgeCArIDEsIHkgKyAxKTsKKyAgICB0cmFuc2Zvcm0ubWFwKHIsIGIsIHggKyAyLCB5
ICsgMik7CisgICAgdHJhbnNmb3JtLm1hcChyLCByZWN0LnkoKSwgeCArIDMsIHkgKyAzKTsKKyAg
ICBsID0gciA9IHhbM107CisgICAgdCA9IGIgPSB5WzNdOworICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgMzsgKytpKSB7CisgICAgICAgIGlmICh4W2ldIDwgbCkKKyAgICAgICAgICAgIGwgPSB4W2ld
OworICAgICAgICBlbHNlIGlmICh4W2ldID4gcikKKyAgICAgICAgICAgIHIgPSB4W2ldOworCisg
ICAgICAgIGlmICh5W2ldIDwgdCkKKyAgICAgICAgICAgIHQgPSB5W2ldOworICAgICAgICBlbHNl
IGlmICh5W2ldID4gYikKKyAgICAgICAgICAgIGIgPSB5W2ldOworICAgIH0KKworICAgIHJldHVy
biBJbnRSZWN0KGwsIHQsIHIgLSBsICsgMSwgYiAtIHQgKyAxKTsKK30KKwordGVtcGxhdGU8Y2xh
c3MgVD4gc3RhdGljIGlubGluZSBJbnRSZWN0IG1hcFJlY3QoY29uc3QgSW50UmVjdCYgcmVjdCwg
Y29uc3QgVCYgdHJhbnNmb3JtKQoreworICAgIHJldHVybiBtYXBSZWN0PFQsIEludFJlY3QsIGlu
dD4ocmVjdCwgdHJhbnNmb3JtKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4gc3RhdGljIGlubGlu
ZSBGbG9hdFJlY3QgbWFwUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0IFQmIHRyYW5z
Zm9ybSkKK3sKKyAgICByZXR1cm4gbWFwUmVjdDxULCBGbG9hdFJlY3QsIGRvdWJsZT4ocmVjdCwg
dHJhbnNmb3JtKTsKK30KKworY2xhc3MgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlRGF0
YSB7CitwdWJsaWM6CisgICAgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlRGF0YSgpCisg
ICAgICAgIDogbV90cmFuc2Zvcm0oKQorICAgICAgICAsIG1fb3BhY2l0eSgxLjApCisgICAgewor
ICAgIH0KKworICAgIEFmZmluZVRyYW5zZm9ybSBtX3RyYW5zZm9ybTsKKyAgICBmbG9hdCBtX29w
YWNpdHk7CisgICAgVmVjdG9yPFBhdGg+IG1fcGF0aHM7Cit9OworCitlbnVtIEFscGhhUGFpbnRU
eXBlIHsKKyAgICBBbHBoYVBhaW50Tm9uZSwKKyAgICBBbHBoYVBhaW50SW1hZ2UsCisgICAgQWxw
aGFQYWludE90aGVyLAorfTsKKworY2xhc3MgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRl
IDogcHVibGljIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZURhdGEgeworcHVibGljOgor
ICAgIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZShIREMgZGMpCisgICAgICAgIDogbV9k
YyhkYykKKyAgICB7CisgICAgfQorICAgIH5HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUo
KQorICAgIHsKKyAgICAgICAgd2hpbGUgKCFtX2JhY2t1cERhdGEuaXNFbXB0eSgpKQorICAgICAg
ICAgICAgcmVzdG9yZSgpOworICAgIH0KKworICAgIEludFBvaW50IG9yaWdpbigpIGNvbnN0Cisg
ICAgeworICAgICAgICByZXR1cm4gSW50UG9pbnQoc3RhYmxlUm91bmQoLW1fdHJhbnNmb3JtLmUo
KSksIHN0YWJsZVJvdW5kKC1tX3RyYW5zZm9ybS5mKCkpKTsKKyAgICB9CisKKyAgICB2b2lkIHRy
YW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5KQorICAgIHsKKyAgICAgICAgbV90cmFuc2Zvcm0udHJh
bnNsYXRlKHgsIHkpOworICAgIH0KKworICAgIHZvaWQgc2NhbGUoY29uc3QgRmxvYXRTaXplJiBz
aXplKQorICAgIHsKKyAgICAgICAgbV90cmFuc2Zvcm0uc2NhbGVOb25Vbmlmb3JtKHNpemUud2lk
dGgoKSwgc2l6ZS5oZWlnaHQoKSk7CisgICAgfQorCisgICAgdm9pZCByb3RhdGUoZmxvYXQgcmFk
aWFucykKKyAgICB7CisgICAgICAgIG1fdHJhbnNmb3JtLnJvdGF0ZShyYWQyZGVnKHJhZGlhbnMp
KTsKKyAgICB9CisKKyAgICB2b2lkICBjb25jYXRDVE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0
cmFuc2Zvcm0pCisgICAgeworICAgICAgICBtX3RyYW5zZm9ybSA9IHRyYW5zZm9ybSAqIG1fdHJh
bnNmb3JtOworICAgIH0KKworICAgIEludFJlY3QgbWFwUmVjdChjb25zdCBJbnRSZWN0JiByZWN0
KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fdHJhbnNmb3JtLm1hcFJlY3QocmVjdCk7
CisgICAgfQorCisgICAgRmxvYXRSZWN0IG1hcFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KSBj
b25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fdHJhbnNmb3JtLm1hcFJlY3QocmVjdCk7Cisg
ICAgfQorCisgICAgSW50UG9pbnQgbWFwUG9pbnQoY29uc3QgSW50UG9pbnQmIHBvaW50KSBjb25z
dAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fdHJhbnNmb3JtLm1hcFBvaW50KHBvaW50KTsKKyAg
ICB9CisKKyAgICBGbG9hdFBvaW50IG1hcFBvaW50KGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KSBj
b25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fdHJhbnNmb3JtLm1hcFBvaW50KHBvaW50KTsK
KyAgICB9CisKKyAgICBGbG9hdFNpemUgbWFwU2l6ZShjb25zdCBGbG9hdFNpemUmIHNpemUpIGNv
bnN0CisgICAgeworICAgICAgICBkb3VibGUgdywgaDsKKyAgICAgICAgbV90cmFuc2Zvcm0ubWFw
KHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSwgdywgaCk7CisgICAgICAgIHJldHVybiBGbG9h
dFNpemUoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHcpLCBzdGF0aWNfY2FzdDxmbG9hdD4oaCkpOworICAg
IH0KKworICAgIHZvaWQgc2F2ZSgpCisgICAgeworICAgICAgICBpZiAobV9kYykKKyAgICAgICAg
ICAgIFNhdmVEQyhtX2RjKTsKKworICAgICAgICBtX2JhY2t1cERhdGEuYXBwZW5kKCpzdGF0aWNf
Y2FzdDxHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVEYXRhKj4odGhpcykpOworICAgIH0K
KworICAgIHZvaWQgcmVzdG9yZSgpCisgICAgeworICAgICAgICBpZiAobV9iYWNrdXBEYXRhLmlz
RW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAobV9kYykKKyAgICAg
ICAgICAgIFJlc3RvcmVEQyhtX2RjLCAtMSk7CisKKyAgICAgICAgR3JhcGhpY3NDb250ZXh0UGxh
dGZvcm1Qcml2YXRlRGF0YTo6b3BlcmF0b3I9KG1fYmFja3VwRGF0YS5sYXN0KCkpOworICAgICAg
ICBtX2JhY2t1cERhdGEucmVtb3ZlTGFzdCgpOworICAgIH0KKworICAgIGJvb2wgaGFzQWxwaGEo
KSBjb25zdCB7IHJldHVybiBtX2JpdG1hcCAmJiBtX2JpdG1hcC0+aGFzQWxwaGEoKTsgfQorCisg
ICAgUGFzc1JlZlB0cjxTaGFyZWRCaXRtYXA+IGdldFRyYW5zcGFyZW50TGF5ZXJCaXRtYXAoSW50
UmVjdCYgb3JpZ1JlY3QsIEFscGhhUGFpbnRUeXBlIGFscGhhUGFpbnQsIFJFQ1QmIGJtcFJlY3Qs
IGJvb2wgY2hlY2tDbGlwQm94LCBib29sIGZvcmNlKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYg
KG1fb3BhY2l0eSA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaWYgKGZv
cmNlIHx8IG1fb3BhY2l0eSA8IDEuKSAgeworICAgICAgICAgICAgaWYgKGNoZWNrQ2xpcEJveCkg
eworICAgICAgICAgICAgICAgIFJFQ1QgY2xpcEJveDsKKyAgICAgICAgICAgICAgICBpbnQgY2xp
cFR5cGUgPSBHZXRDbGlwQm94KG1fZGMsICZjbGlwQm94KTsKKyAgICAgICAgICAgICAgICBpZiAo
Y2xpcFR5cGUgPT0gU0lNUExFUkVHSU9OIHx8IGNsaXBUeXBlID09IENPTVBMRVhSRUdJT04pCisg
ICAgICAgICAgICAgICAgICAgIG9yaWdSZWN0LmludGVyc2VjdChjbGlwQm94KTsKKyAgICAgICAg
ICAgICAgICBpZiAob3JpZ1JlY3QuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgICAgICByZXR1
cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUmVmUHRyPFNoYXJlZEJpdG1hcD4g
Ym1wID0gU2hhcmVkQml0bWFwOjpjcmVhdGVJbnN0YW5jZShhbHBoYVBhaW50ID09IEFscGhhUGFp
bnROb25lLCBvcmlnUmVjdC53aWR0aCgpLCBvcmlnUmVjdC5oZWlnaHQoKSwgZmFsc2UpOworICAg
ICAgICAgICAgU2V0UmVjdCgmYm1wUmVjdCwgMCwgMCwgb3JpZ1JlY3Qud2lkdGgoKSwgb3JpZ1Jl
Y3QuaGVpZ2h0KCkpOworICAgICAgICAgICAgaWYgKGJtcCkgeworICAgICAgICAgICAgICAgIHN3
aXRjaCAoYWxwaGFQYWludCkgeworICAgICAgICAgICAgICAgIGNhc2UgQWxwaGFQYWludE5vbmU6
CisgICAgICAgICAgICAgICAgY2FzZSBBbHBoYVBhaW50SW1hZ2U6CisgICAgICAgICAgICAgICAg
ICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNoYXJlZEJpdG1hcDo6RENIb2xkZXIgZGMo
Ym1wLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYy5nZXQoKSkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIEJpdEJsdChkYy5nZXQoKSwgMCwgMCwgb3JpZ1JlY3Qu
d2lkdGgoKSwgb3JpZ1JlY3QuaGVpZ2h0KCksIG1fZGMsIG9yaWdSZWN0LngoKSwgb3JpZ1JlY3Qu
eSgpLCBTUkNDT1BZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm1wLT5pczMy
Yml0KCkgJiYgKCFtX2JpdG1hcCB8fCBtX2JpdG1hcC0+aXMxNmJpdCgpKSkgeworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgYWxwaGEgY2hhbm5lbAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCogcGl4ZWxzID0gKHVuc2lnbmVkKilibXAtPmJ5
dGVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkKiBj
b25zdCBwaXhlbHNFbmQgPSBwaXhlbHMgKyBibXAtPmJpdG1hcEluZm8oKS5udW1QaXhlbHMoKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBpeGVscyA8IHBpeGVsc0Vu
ZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBpeGVscyB8PSAweEZG
MDAwMDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytwaXhlbHM7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJtcDsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvL2Nhc2UgQWxwaGFQYWludE90aGVyOgorICAg
ICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChibXAtPmJ5
dGVzKCksIDB4RkYsIGJtcC0+Yml0bWFwSW5mbygpLm51bVBpeGVscygpICogNCk7CisgICAgICAg
ICAgICAgICAgICAgIHJldHVybiBibXA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJtcFJl
Y3QgPSBvcmlnUmVjdDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdm9pZCBwYWlu
dEJhY2tUcmFuc3BhcmVudExheWVyQml0bWFwKEhEQyBoZGMsIFNoYXJlZEJpdG1hcCogYm1wLCBj
b25zdCBJbnRSZWN0JiBvcmlnUmVjdCwgQWxwaGFQYWludFR5cGUgYWxwaGFQYWludCwgY29uc3Qg
UkVDVCYgYm1wUmVjdCkKKyAgICB7CisgICAgICAgIGlmIChoZGMgPT0gbV9kYykKKyAgICAgICAg
ICAgIHJldHVybjsKKworI2lmICFkZWZpbmVkKE5PX0FMUEhBQkxFTkQpCisgICAgICAgIGlmIChh
bHBoYVBhaW50ID09IEFscGhhUGFpbnRPdGhlcikgeworICAgICAgICAgICAgQVNTRVJUKGJtcCAm
JiBibXAtPmJ5dGVzKCkgJiYgYm1wLT5pczMyYml0KCkpOworICAgICAgICAgICAgdW5zaWduZWQq
IHBpeGVscyA9ICh1bnNpZ25lZCopYm1wLT5ieXRlcygpOworICAgICAgICAgICAgY29uc3QgdW5z
aWduZWQqIGNvbnN0IHBpeGVsc0VuZCA9IHBpeGVscyArIGJtcC0+Yml0bWFwSW5mbygpLm51bVBp
eGVscygpOworICAgICAgICAgICAgd2hpbGUgKHBpeGVscyA8IHBpeGVsc0VuZCkgeworICAgICAg
ICAgICAgICAgICpwaXhlbHMgXj0gMHhGRjAwMDAwMDsKKyAgICAgICAgICAgICAgICArK3BpeGVs
czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobV9vcGFjaXR5IDwgMS4g
fHwgYWxwaGFQYWludCA9PSBBbHBoYVBhaW50T3RoZXIpIHsKKyAgICAgICAgICAgIGNvbnN0IEJM
RU5ERlVOQ1RJT04gYmxlbmQgPSB7IEFDX1NSQ19PVkVSLCAwCisgICAgICAgICAgICAgICAgLCBt
X29wYWNpdHkgPj0gMS4gPyAyNTUgOiAoQllURSkobV9vcGFjaXR5ICogMjU1KQorICAgICAgICAg
ICAgICAgICwgYWxwaGFQYWludCA9PSBBbHBoYVBhaW50Tm9uZSA/IDAgOiBBQ19TUkNfQUxQSEEg
fTsKKyAgICAgICAgICAgIEFscGhhQmxlbmQobV9kYywgb3JpZ1JlY3QueCgpLCBvcmlnUmVjdC55
KCksIG9yaWdSZWN0LndpZHRoKCksIG9yaWdSZWN0LmhlaWdodCgpLCBoZGMsIDAsIDAsIGJtcFJl
Y3QucmlnaHQsIGJtcFJlY3QuYm90dG9tLCBibGVuZCk7CisgICAgICAgIH0gZWxzZQorI2VuZGlm
CisgICAgICAgICAgICBTdHJldGNoQmx0KG1fZGMsIG9yaWdSZWN0LngoKSwgb3JpZ1JlY3QueSgp
LCBvcmlnUmVjdC53aWR0aCgpLCBvcmlnUmVjdC5oZWlnaHQoKSwgaGRjLCAwLCAwLCBibXBSZWN0
LnJpZ2h0LCBibXBSZWN0LmJvdHRvbSwgU1JDQ09QWSk7CisgICAgfQorCisgICAgSERDIG1fZGM7
CisgICAgUmVmUHRyPFNoYXJlZEJpdG1hcD4gbV9iaXRtYXA7CisgICAgVmVjdG9yPEdyYXBoaWNz
Q29udGV4dFBsYXRmb3JtUHJpdmF0ZURhdGE+IG1fYmFja3VwRGF0YTsKK307CisKK3N0YXRpYyBI
UEVOIGNyZWF0ZVBlbihjb25zdCBDb2xvciYgY29sLCBkb3VibGUgZldpZHRoLCBTdHJva2VTdHls
ZSBzdHlsZSkKK3sKKyAgICBpbnQgd2lkdGggPSBzdGFibGVSb3VuZChmV2lkdGgpOworICAgIGlm
ICh3aWR0aCA8IDEpCisgICAgICAgIHdpZHRoID0gMTsKKworICAgIGludCBwZW5TdHlsZSA9IFBT
X05VTEw7CisgICAgc3dpdGNoIChzdHlsZSkgeworICAgICAgICBjYXNlIFNvbGlkU3Ryb2tlOgor
ICAgICAgICAgICAgcGVuU3R5bGUgPSBQU19TT0xJRDsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIERvdHRlZFN0cm9rZTogIC8vIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cyBDRQor
ICAgICAgICBjYXNlIERhc2hlZFN0cm9rZToKKyAgICAgICAgICAgIHBlblN0eWxlID0gUFNfREFT
SDsKKyAgICAgICAgICAgIHdpZHRoID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBk
ZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIENyZWF0ZVBl
bihwZW5TdHlsZSwgd2lkdGgsIFJHQihjb2wucmVkKCksIGNvbC5ncmVlbigpLCBjb2wuYmx1ZSgp
KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgSEdESU9CSiBjcmVhdGVCcnVzaChjb25zdCBDb2xvciYg
Y29sKQoreworICAgIHJldHVybiBDcmVhdGVTb2xpZEJydXNoKFJHQihjb2wucmVkKCksIGNvbC5n
cmVlbigpLCBjb2wuYmx1ZSgpKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBQaXhlbFR5cGUs
IGJvb2wgSXMxNmJpdD4gc3RhdGljIHZvaWQgX3JvdGF0ZUJpdG1hcChTaGFyZWRCaXRtYXAqIGRl
c3RCbXAsIGNvbnN0IFNoYXJlZEJpdG1hcCogc291cmNlQm1wLCBjb25zdCBSb3RhdGlvblRyYW5z
Zm9ybSYgdHJhbnNmb3JtKQoreworICAgIGludCBkZXN0VyA9IGRlc3RCbXAtPndpZHRoKCk7Cisg
ICAgaW50IGRlc3RIID0gZGVzdEJtcC0+aGVpZ2h0KCk7CisgICAgaW50IHNvdXJjZVcgPSBzb3Vy
Y2VCbXAtPndpZHRoKCk7CisgICAgaW50IHNvdXJjZUggPSBzb3VyY2VCbXAtPmhlaWdodCgpOwor
ICAgIFBpeGVsVHlwZSogZGVzdCA9IChQaXhlbFR5cGUqKWRlc3RCbXAtPmJ5dGVzKCk7CisgICAg
Y29uc3QgUGl4ZWxUeXBlKiBzb3VyY2UgPSAoY29uc3QgUGl4ZWxUeXBlKilzb3VyY2VCbXAtPmJ5
dGVzKCk7CisgICAgaW50IHBhZGRpbmc7CisgICAgaW50IHBhZGRlZFNvdXJjZVc7CisgICAgaWYg
KElzMTZiaXQpIHsKKyAgICAgICAgcGFkZGluZyA9IGRlc3RXICYgMTsKKyAgICAgICAgcGFkZGVk
U291cmNlVyA9IHNvdXJjZVcgKyAoc291cmNlVyAmIDEpOworICAgIH0gZWxzZSB7CisgICAgICAg
IHBhZGRpbmcgPSAwOworICAgICAgICBwYWRkZWRTb3VyY2VXID0gc291cmNlVzsKKyAgICB9Cisg
ICAgaWYgKGlzWmVybyh0cmFuc2Zvcm0ubV9zaW5BKSkgeworICAgICAgICBpbnQgY29zQSA9IHRy
YW5zZm9ybS5tX2Nvc0EgPiAwID8gMSA6IC0xOworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8
IGRlc3RIOyArK3kpIHsKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgZGVzdFc7ICsr
eCkgeworICAgICAgICAgICAgICAgIGludCB4MSA9IHggKyB0cmFuc2Zvcm0ubV9wcmVTaGlmdFg7
CisgICAgICAgICAgICAgICAgaW50IHkxID0geSArIHRyYW5zZm9ybS5tX3ByZVNoaWZ0WTsKKyAg
ICAgICAgICAgICAgICBpbnQgc3JjWCA9IHgxICogY29zQSArIHRyYW5zZm9ybS5tX3Bvc3RTaGlm
dFg7CisgICAgICAgICAgICAgICAgaW50IHNyY1kgPSB5MSAqIGNvc0EgLSB0cmFuc2Zvcm0ubV9w
b3N0U2hpZnRZOworICAgICAgICAgICAgICAgIGlmIChzcmNYID49IDAgJiYgc3JjWCA8PSBzb3Vy
Y2VXICYmIHNyY1kgPj0gMCAmJiBzcmNZIDw9IHNvdXJjZUgpCisgICAgICAgICAgICAgICAgICAg
ICpkZXN0KysgPSBzb3VyY2Vbc3JjWSAqIHBhZGRlZFNvdXJjZVcgKyBzcmNYXSB8IDB4RkYwMDAw
MDA7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZGVzdCsrIHw9
IDB4RkY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0ICs9IHBhZGRpbmc7CisgICAg
ICAgIH0KKyAgICB9IGVsc2UgaWYgKGlzWmVybyh0cmFuc2Zvcm0ubV9jb3NBKSkgeworICAgICAg
ICBpbnQgc2luQSA9IHRyYW5zZm9ybS5tX3NpbkEgPiAwID8gMSA6IC0xOworICAgICAgICBmb3Ig
KGludCB5ID0gMDsgeSA8IGRlc3RIOyArK3kpIHsKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAw
OyB4IDwgZGVzdFc7ICsreCkgeworICAgICAgICAgICAgICAgIGludCB4MSA9IHggKyB0cmFuc2Zv
cm0ubV9wcmVTaGlmdFg7CisgICAgICAgICAgICAgICAgaW50IHkxID0geSArIHRyYW5zZm9ybS5t
X3ByZVNoaWZ0WTsKKyAgICAgICAgICAgICAgICBpbnQgc3JjWCA9IHkxICogc2luQSArIHRyYW5z
Zm9ybS5tX3Bvc3RTaGlmdFg7CisgICAgICAgICAgICAgICAgaW50IHNyY1kgPSAteDEgKiBzaW5B
ICsgdHJhbnNmb3JtLm1fcG9zdFNoaWZ0WTsKKyAgICAgICAgICAgICAgICBpZiAoc3JjWCA+PSAw
ICYmIHNyY1ggPD0gc291cmNlVyAmJiBzcmNZID49IDAgJiYgc3JjWSA8PSBzb3VyY2VIKQorICAg
ICAgICAgICAgICAgICAgICAqZGVzdCsrID0gc291cmNlW3NyY1kgKiBwYWRkZWRTb3VyY2VXICsg
c3JjWF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0ICs9IHBhZGRpbmc7CisgICAg
ICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGRlc3RIOyAr
K3kpIHsKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgZGVzdFc7ICsreCkgeworICAg
ICAgICAgICAgICAgIC8vIEZJWE1FOiBmb3IgYmVzdCBxdWFsaXR5LCB3ZSBzaG91bGQgZ2V0IHdl
aWdodGVkIHN1bSBvZiBmb3VyIG5laWdoYm91cnMsCisgICAgICAgICAgICAgICAgLy8gYnV0IHRo
YXQgd2lsbCBiZSB0b28gZXhwZW5zaXZlCisgICAgICAgICAgICAgICAgaW50IHNyY1gsIHNyY1k7
CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtLm1hcCh4LCB5LCAmc3JjWCwgJnNyY1kpOworICAg
ICAgICAgICAgICAgIGlmIChzcmNYID49IDAgJiYgc3JjWCA8PSBzb3VyY2VXICYmIHNyY1kgPj0g
MCAmJiBzcmNZIDw9IHNvdXJjZUgpCisgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBzb3Vy
Y2Vbc3JjWSAqIHBhZGRlZFNvdXJjZVcgKyBzcmNYXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGRlc3QgKz0gcGFkZGluZzsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQg
cm90YXRlQml0bWFwKFNoYXJlZEJpdG1hcCogZGVzdEJtcCwgY29uc3QgU2hhcmVkQml0bWFwKiBz
b3VyY2VCbXAsIGNvbnN0IFJvdGF0aW9uVHJhbnNmb3JtJiB0cmFuc2Zvcm0pCit7CisgICAgQVNT
RVJUKGRlc3RCbXAtPmlzMTZiaXQoKSA9PSBzb3VyY2VCbXAtPmlzMTZiaXQoKSk7CisgICAgaWYg
KGRlc3RCbXAtPmlzMTZiaXQoKSkKKyAgICAgICAgX3JvdGF0ZUJpdG1hcDx1bnNpZ25lZCBzaG9y
dCwgdHJ1ZT4oZGVzdEJtcCwgc291cmNlQm1wLCB0cmFuc2Zvcm0pOworICAgIGVsc2UKKyAgICAg
ICAgX3JvdGF0ZUJpdG1hcDx1bnNpZ25lZCwgZmFsc2U+KGRlc3RCbXAsIHNvdXJjZUJtcCwgdHJh
bnNmb3JtKTsKK30KKworY2xhc3MgVHJhbnNwYXJlbnRMYXllckRDIDogTm9uY29weWFibGUgewor
cHVibGljOgorICAgIFRyYW5zcGFyZW50TGF5ZXJEQyhHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVBy
aXZhdGUqIGRhdGEsIEludFJlY3QmIG9yaWdSZWN0LCBjb25zdCBJbnRSZWN0KiByZWN0QmVmb3Jl
VHJhbnNmb3JtID0gMCwgaW50IGFscGhhID0gMjU1LCBib29sIHBhaW50SW1hZ2UgPSBmYWxzZSk7
CisgICAgflRyYW5zcGFyZW50TGF5ZXJEQygpOworCisgICAgSERDIGhkYygpIGNvbnN0IHsgcmV0
dXJuIG1fbWVtRGM7IH0KKyAgICBjb25zdCBSRUNUJiByZWN0KCkgY29uc3QgeyByZXR1cm4gbV9i
bXBSZWN0OyB9CisgICAgSW50U2l6ZSB0b1NoaWZ0KCkgY29uc3QgeyByZXR1cm4gSW50U2l6ZSht
X2JtcFJlY3QubGVmdCAtIG1fb3JpZ1JlY3QueCgpLCBtX2JtcFJlY3QudG9wIC0gbV9vcmlnUmVj
dC55KCkpOyB9CisgICAgdm9pZCBmaWxsQWxwaGFDaGFubmVsKCk7CisKK3ByaXZhdGU6CisgICAg
R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKiBtX2RhdGE7CisgICAgSW50UmVjdCBtX29y
aWdSZWN0OworICAgIEludFJlY3QgbV9yb3RhdGVkT3JpZ1JlY3Q7CisgICAgSERDIG1fbWVtRGM7
CisgICAgUmVmUHRyPFNoYXJlZEJpdG1hcD4gbV9iaXRtYXA7CisgICAgUmVmUHRyPFNoYXJlZEJp
dG1hcD4gbV9yb3RhdGVkQml0bWFwOworICAgIFJFQ1QgbV9ibXBSZWN0OworICAgIHVuc2lnbmVk
IG1fa2V5MTsKKyAgICB1bnNpZ25lZCBtX2tleTI7CisgICAgUm90YXRpb25UcmFuc2Zvcm0gbV9y
b3RhdGlvbjsKKyAgICBmbG9hdCBtX29sZE9wYWNpdHk7CisgICAgQWxwaGFQYWludFR5cGUgbV9h
bHBoYVBhaW50VHlwZTsKK307CisKK1RyYW5zcGFyZW50TGF5ZXJEQzo6VHJhbnNwYXJlbnRMYXll
ckRDKEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSogZGF0YSwgSW50UmVjdCYgb3JpZ1Jl
Y3QsIGNvbnN0IEludFJlY3QqIHJlY3RCZWZvcmVUcmFuc2Zvcm0sIGludCBhbHBoYSwgYm9vbCBw
YWludEltYWdlKQorOiBtX2RhdGEoZGF0YSkKKywgbV9vcmlnUmVjdChvcmlnUmVjdCkKKywgbV9v
bGRPcGFjaXR5KGRhdGEtPm1fb3BhY2l0eSkKKy8vIG1fa2V5MSBhbmQgbV9rZXkyIGFyZSBub3Qg
aW5pdGFsaXplZCBoZXJlLiBUaGV5IGFyZSB1c2VkIG9ubHkgaW4gdGhlIGNhc2UgdGhhdAorLy8g
U2hhcmVkQml0bWFwOjpnZXREQygpIGlzIGNhbGxlZCwgSS5FLiwgd2hlbiBtX2JpdG1hcCBpcyBu
b3QgbnVsbC4KK3sKKyAgICBtX2RhdGEtPm1fb3BhY2l0eSAqPSBhbHBoYSAvIDI1NS47CisgICAg
Ym9vbCBtdXN0Q3JlYXRlTGF5ZXI7CisgICAgaWYgKCFtX2RhdGEtPmhhc0FscGhhKCkpIHsKKyAg
ICAgICAgbXVzdENyZWF0ZUxheWVyID0gZmFsc2U7CisgICAgICAgIG1fYWxwaGFQYWludFR5cGUg
PSBBbHBoYVBhaW50Tm9uZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtdXN0Q3JlYXRlTGF5ZXIg
PSB0cnVlOworICAgICAgICBtX2FscGhhUGFpbnRUeXBlID0gcGFpbnRJbWFnZSA/IEFscGhhUGFp
bnRJbWFnZSA6IEFscGhhUGFpbnRPdGhlcjsKKyAgICB9CisgICAgaWYgKHJlY3RCZWZvcmVUcmFu
c2Zvcm0gJiYgIWlzWmVybyhtX2RhdGEtPm1fdHJhbnNmb3JtLmIoKSkpIHsKKyAgICAgICAgbV9y
b3RhdGVkT3JpZ1JlY3QgPSBvcmlnUmVjdDsKKyAgICAgICAgbV9yb3RhdGVkQml0bWFwID0gbV9k
YXRhLT5nZXRUcmFuc3BhcmVudExheWVyQml0bWFwKG1fcm90YXRlZE9yaWdSZWN0LCBtX2FscGhh
UGFpbnRUeXBlLCBtX2JtcFJlY3QsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgaWYgKG1fcm90YXRl
ZEJpdG1hcCkgeworICAgICAgICAgICAgZG91YmxlIGEgPSBtX2RhdGEtPm1fdHJhbnNmb3JtLmEo
KTsKKyAgICAgICAgICAgIGRvdWJsZSBiID0gbV9kYXRhLT5tX3RyYW5zZm9ybS5iKCk7CisgICAg
ICAgICAgICBkb3VibGUgYyA9IF9oeXBvdChhLCBiKTsKKyAgICAgICAgICAgIG1fcm90YXRpb24u
bV9jb3NBID0gYSAvIGM7CisgICAgICAgICAgICBtX3JvdGF0aW9uLm1fc2luQSA9IGIgLyBjOwor
CisgICAgICAgICAgICBpbnQgY2VudGVyWCA9IG9yaWdSZWN0LngoKSArIG9yaWdSZWN0LndpZHRo
KCkgLyAyOworICAgICAgICAgICAgaW50IGNlbnRlclkgPSBvcmlnUmVjdC55KCkgKyBvcmlnUmVj
dC5oZWlnaHQoKSAvIDI7CisgICAgICAgICAgICBtX3JvdGF0aW9uLm1fcHJlU2hpZnRYID0gLWNl
bnRlclg7CisgICAgICAgICAgICBtX3JvdGF0aW9uLm1fcHJlU2hpZnRZID0gLWNlbnRlclk7Cisg
ICAgICAgICAgICBtX3JvdGF0aW9uLm1fcG9zdFNoaWZ0WCA9IGNlbnRlclg7CisgICAgICAgICAg
ICBtX3JvdGF0aW9uLm1fcG9zdFNoaWZ0WSA9IGNlbnRlclk7CisKKyAgICAgICAgICAgIG1fb3Jp
Z1JlY3QgPSBtYXBSZWN0KG1fcm90YXRlZE9yaWdSZWN0LCBtX3JvdGF0aW9uKTsKKworICAgICAg
ICAgICAgbV9yb3RhdGlvbi5tX3ByZVNoaWZ0WCArPSBtX3JvdGF0ZWRPcmlnUmVjdC54KCk7Cisg
ICAgICAgICAgICBtX3JvdGF0aW9uLm1fcHJlU2hpZnRZICs9IG1fcm90YXRlZE9yaWdSZWN0Lnko
KTsKKyAgICAgICAgICAgIG1fcm90YXRpb24ubV9wb3N0U2hpZnRYIC09IG1fb3JpZ1JlY3QueCgp
OworICAgICAgICAgICAgbV9yb3RhdGlvbi5tX3Bvc3RTaGlmdFkgLT0gbV9vcmlnUmVjdC55KCk7
CisKKyAgICAgICAgICAgIEZsb2F0UG9pbnQgdG9wTGVmdCA9IG1fZGF0YS0+bV90cmFuc2Zvcm0u
bWFwUG9pbnQoRmxvYXRQb2ludChyZWN0QmVmb3JlVHJhbnNmb3JtLT50b3BMZWZ0KCkpKTsKKyAg
ICAgICAgICAgIEZsb2F0UG9pbnQgdG9wUmlnaHQocmVjdEJlZm9yZVRyYW5zZm9ybS0+cmlnaHQo
KSAtIDEsIHJlY3RCZWZvcmVUcmFuc2Zvcm0tPnkoKSk7CisgICAgICAgICAgICB0b3BSaWdodCA9
IG1fZGF0YS0+bV90cmFuc2Zvcm0ubWFwUG9pbnQodG9wUmlnaHQpOworICAgICAgICAgICAgRmxv
YXRQb2ludCBib3R0b21MZWZ0KHJlY3RCZWZvcmVUcmFuc2Zvcm0tPngoKSwgcmVjdEJlZm9yZVRy
YW5zZm9ybS0+Ym90dG9tKCkgLSAxKTsKKyAgICAgICAgICAgIGJvdHRvbUxlZnQgPSBtX2RhdGEt
Pm1fdHJhbnNmb3JtLm1hcFBvaW50KGJvdHRvbUxlZnQpOworICAgICAgICAgICAgRmxvYXRTaXpl
IHNpZGVUb3AgPSB0b3BSaWdodCAtIHRvcExlZnQ7CisgICAgICAgICAgICBGbG9hdFNpemUgc2lk
ZUxlZnQgPSBib3R0b21MZWZ0IC0gdG9wTGVmdDsKKyAgICAgICAgICAgIGZsb2F0IHdpZHRoID0g
X2h5cG90KHNpZGVUb3Aud2lkdGgoKSArIDEsIHNpZGVUb3AuaGVpZ2h0KCkgKyAxKTsKKyAgICAg
ICAgICAgIGZsb2F0IGhlaWdodCA9IF9oeXBvdChzaWRlTGVmdC53aWR0aCgpICsgMSwgc2lkZUxl
ZnQuaGVpZ2h0KCkgKyAxKTsKKworICAgICAgICAgICAgb3JpZ1JlY3QuaW5mbGF0ZVgoc3RhYmxl
Um91bmQoKHdpZHRoIC0gb3JpZ1JlY3Qud2lkdGgoKSkgKiAwLjUpKTsKKyAgICAgICAgICAgIG9y
aWdSZWN0LmluZmxhdGVZKHN0YWJsZVJvdW5kKChoZWlnaHQgLSBvcmlnUmVjdC5oZWlnaHQoKSkg
KiAwLjUpKTsKKworICAgICAgICAgICAgbV9iaXRtYXAgPSBTaGFyZWRCaXRtYXA6OmNyZWF0ZUlu
c3RhbmNlKG1fcm90YXRlZEJpdG1hcC0+aXMxNmJpdCgpLCBtX29yaWdSZWN0LndpZHRoKCksIG1f
b3JpZ1JlY3QuaGVpZ2h0KCksIHRydWUpOworICAgICAgICAgICAgaWYgKG1fYml0bWFwKQorICAg
ICAgICAgICAgICAgIHJvdGF0ZUJpdG1hcChtX2JpdG1hcC5nZXQoKSwgbV9yb3RhdGVkQml0bWFw
LmdldCgpLCAtbV9yb3RhdGlvbik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAg
bV9yb3RhdGVkQml0bWFwID0gMDsKKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICBtX2Jp
dG1hcCA9IG1fZGF0YS0+Z2V0VHJhbnNwYXJlbnRMYXllckJpdG1hcChtX29yaWdSZWN0LCBtX2Fs
cGhhUGFpbnRUeXBlLCBtX2JtcFJlY3QsIHRydWUsIG11c3RDcmVhdGVMYXllcik7CisgICAgaWYg
KG1fYml0bWFwKQorICAgICAgICBtX21lbURjID0gbV9iaXRtYXAtPmdldERDKCZtX2tleTEsICZt
X2tleTIpOworICAgIGVsc2UKKyAgICAgICAgbV9tZW1EYyA9IG1fZGF0YS0+bV9kYzsKK30KKwor
VHJhbnNwYXJlbnRMYXllckRDOjp+VHJhbnNwYXJlbnRMYXllckRDKCkKK3sKKyAgICBpZiAobV9y
b3RhdGVkQml0bWFwKSB7CisgICAgICAgIG1fYml0bWFwLT5yZWxlYXNlREMobV9tZW1EYywgbV9r
ZXkxLCBtX2tleTIpOworICAgICAgICBtX2tleTEgPSBtX2tleTIgPSAwOworICAgICAgICByb3Rh
dGVCaXRtYXAobV9yb3RhdGVkQml0bWFwLmdldCgpLCBtX2JpdG1hcC5nZXQoKSwgbV9yb3RhdGlv
bik7CisgICAgICAgIG1fbWVtRGMgPSBtX3JvdGF0ZWRCaXRtYXAtPmdldERDKCZtX2tleTEsICZt
X2tleTIpOworICAgICAgICBtX2RhdGEtPnBhaW50QmFja1RyYW5zcGFyZW50TGF5ZXJCaXRtYXAo
bV9tZW1EYywgbV9yb3RhdGVkQml0bWFwLmdldCgpLCBtX3JvdGF0ZWRPcmlnUmVjdCwgbV9hbHBo
YVBhaW50VHlwZSwgbV9ibXBSZWN0KTsKKyAgICAgICAgbV9yb3RhdGVkQml0bWFwLT5yZWxlYXNl
REMobV9tZW1EYywgbV9rZXkxLCBtX2tleTIpOworICAgIH0gZWxzZSBpZiAobV9iaXRtYXApIHsK
KyAgICAgICAgbV9kYXRhLT5wYWludEJhY2tUcmFuc3BhcmVudExheWVyQml0bWFwKG1fbWVtRGMs
IG1fYml0bWFwLmdldCgpLCBtX29yaWdSZWN0LCBtX2FscGhhUGFpbnRUeXBlLCBtX2JtcFJlY3Qp
OworICAgICAgICBtX2JpdG1hcC0+cmVsZWFzZURDKG1fbWVtRGMsIG1fa2V5MSwgbV9rZXkyKTsK
KyAgICB9CisgICAgbV9kYXRhLT5tX29wYWNpdHkgPSBtX29sZE9wYWNpdHk7Cit9CisKK3ZvaWQg
VHJhbnNwYXJlbnRMYXllckRDOjpmaWxsQWxwaGFDaGFubmVsKCkKK3sKKyAgICBpZiAoIW1fYml0
bWFwIHx8ICFtX2JpdG1hcC0+aXMzMmJpdCgpKQorICAgICAgICByZXR1cm47CisKKyAgICB1bnNp
Z25lZCogcGl4ZWxzID0gKHVuc2lnbmVkKiltX2JpdG1hcC0+Ynl0ZXMoKTsKKyAgICBjb25zdCB1
bnNpZ25lZCogY29uc3QgcGl4ZWxzRW5kID0gcGl4ZWxzICsgbV9iaXRtYXAtPmJpdG1hcEluZm8o
KS5udW1QaXhlbHMoKTsKKyAgICB3aGlsZSAocGl4ZWxzIDwgcGl4ZWxzRW5kKSB7CisgICAgICAg
ICpwaXhlbHMgfD0gMHhGRjAwMDAwMDsKKyAgICAgICAgKytwaXhlbHM7CisgICAgfQorfQorCitj
bGFzcyBTY29wZURDUHJvdmlkZXIgOiBOb25jb3B5YWJsZSB7CitwdWJsaWM6CisgICAgZXhwbGlj
aXQgU2NvcGVEQ1Byb3ZpZGVyKEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSogZGF0YSkK
KyAgICAgICAgOiBtX2RhdGEoZGF0YSkKKyAgICB7CisgICAgICAgIGlmIChtX2RhdGEtPm1fYml0
bWFwKQorICAgICAgICAgICAgbV9kYXRhLT5tX2RjID0gbV9kYXRhLT5tX2JpdG1hcC0+Z2V0REMo
Jm1fa2V5MSwgJm1fa2V5Mik7CisgICAgfQorICAgIH5TY29wZURDUHJvdmlkZXIoKQorICAgIHsK
KyAgICAgICAgaWYgKG1fZGF0YS0+bV9iaXRtYXApIHsKKyAgICAgICAgICAgIG1fZGF0YS0+bV9i
aXRtYXAtPnJlbGVhc2VEQyhtX2RhdGEtPm1fZGMsIG1fa2V5MSwgbV9rZXkyKTsKKyAgICAgICAg
ICAgIG1fZGF0YS0+bV9kYyA9IDA7CisgICAgICAgIH0KKyAgICB9Citwcml2YXRlOgorICAgIEdy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSogbV9kYXRhOworICAgIHVuc2lnbmVkIG1fa2V5
MTsKKyAgICB1bnNpZ25lZCBtX2tleTI7Cit9OworCisKK0dyYXBoaWNzQ29udGV4dDo6R3JhcGhp
Y3NDb250ZXh0KFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiBkYykKKzogbV9jb21tb24oY3JlYXRl
R3JhcGhpY3NDb250ZXh0UHJpdmF0ZSgpKQorLCBtX2RhdGEobmV3IEdyYXBoaWNzQ29udGV4dFBs
YXRmb3JtUHJpdmF0ZShkYykpCit7Cit9CisKK0dyYXBoaWNzQ29udGV4dDo6fkdyYXBoaWNzQ29u
dGV4dCgpCit7CisgICAgZGVzdHJveUdyYXBoaWNzQ29udGV4dFByaXZhdGUobV9jb21tb24pOwor
ICAgIGRlbGV0ZSBtX2RhdGE7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRCaXRtYXAo
UGFzc1JlZlB0cjxTaGFyZWRCaXRtYXA+IGJtcCkKK3sKKyAgICBBU1NFUlQoIW1fZGF0YS0+bV9k
Yyk7CisgICAgbV9kYXRhLT5tX2JpdG1hcCA9IGJtcDsKK30KKworSERDIEdyYXBoaWNzQ29udGV4
dDo6Z2V0V2luZG93c0NvbnRleHQoY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0
QWxwaGFCbGVuZCwgYm9vbCBtYXlDcmVhdGVCaXRtYXApCit7CisgICAgbm90SW1wbGVtZW50ZWQo
KTsKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHQ6OnJlbGVhc2VXaW5kb3dzQ29udGV4dChIREMgaGRjLCBjb25zdCBJbnRS
ZWN0JiBkc3RSZWN0LCBib29sIHN1cHBvcnRBbHBoYUJsZW5kLCBib29sIG1heUNyZWF0ZUJpdG1h
cCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2F2ZVBsYXRmb3JtU3RhdGUoKQoreworICAgIG1f
ZGF0YS0+c2F2ZSgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6cmVzdG9yZVBsYXRmb3Jt
U3RhdGUoKQoreworICAgIG1fZGF0YS0+cmVzdG9yZSgpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6ZHJhd1JlY3QoY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAoIW1fZGF0YS0+
bV9vcGFjaXR5IHx8IHBhaW50aW5nRGlzYWJsZWQoKSB8fCByZWN0LmlzRW1wdHkoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgU2NvcGVEQ1Byb3ZpZGVyIGRjUHJvdmlkZXIobV9kYXRhKTsKKyAg
ICBpZiAoIW1fZGF0YS0+bV9kYykKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50UmVjdCB0clJl
Y3QgPSBtX2RhdGEtPm1hcFJlY3QocmVjdCk7CisgICAgVHJhbnNwYXJlbnRMYXllckRDIHRyYW5z
cGFyZW50REMobV9kYXRhLCB0clJlY3QsICZyZWN0KTsKKyAgICBIREMgZGMgPSB0cmFuc3BhcmVu
dERDLmhkYygpOworICAgIGlmICghZGMpCisgICAgICAgIHJldHVybjsKKyAgICB0clJlY3QubW92
ZSh0cmFuc3BhcmVudERDLnRvU2hpZnQoKSk7CisKKyAgICBIR0RJT0JKIGJydXNoID0gMDsKKyAg
ICBIR0RJT0JKIG9sZEJydXNoOworICAgIGlmIChmaWxsQ29sb3IoKS5hbHBoYSgpKSB7CisgICAg
ICAgIGJydXNoID0gY3JlYXRlQnJ1c2goZmlsbENvbG9yKCkpOworICAgICAgICBvbGRCcnVzaCA9
IFNlbGVjdE9iamVjdChkYywgYnJ1c2gpOworICAgIH0gZWxzZQorICAgICAgICBTZWxlY3RPYmpl
Y3QoZGMsIEdldFN0b2NrT2JqZWN0KE5VTExfQlJVU0gpKTsKKworICAgIEhHRElPQkogcGVuID0g
MDsKKyAgICBIR0RJT0JKIG9sZFBlbjsKKyAgICBpZiAoc3Ryb2tlU3R5bGUoKSAhPSBOb1N0cm9r
ZSkgeworICAgICAgICBwZW4gPSBjcmVhdGVQZW4oc3Ryb2tlQ29sb3IoKSwgc3Ryb2tlVGhpY2tu
ZXNzKCksIHN0cm9rZVN0eWxlKCkpOworICAgICAgICBvbGRQZW4gPSBTZWxlY3RPYmplY3QoZGMs
IHBlbik7CisgICAgfSBlbHNlCisgICAgICAgIFNlbGVjdE9iamVjdChkYywgR2V0U3RvY2tPYmpl
Y3QoTlVMTF9QRU4pKTsKKworICAgIGlmICghYnJ1c2ggJiYgIXBlbikKKyAgICAgICAgcmV0dXJu
OworCisgICAgaWYgKHRyUmVjdC53aWR0aCgpIDw9IDApCisgICAgICAgIHRyUmVjdC5zZXRXaWR0
aCgxKTsKKyAgICBpZiAodHJSZWN0LmhlaWdodCgpIDw9IDApCisgICAgICAgIHRyUmVjdC5zZXRI
ZWlnaHQoMSk7CisKKyAgICBSZWN0YW5nbGUoZGMsIHRyUmVjdC54KCksIHRyUmVjdC55KCksIHRy
UmVjdC5yaWdodCgpLCB0clJlY3QuYm90dG9tKCkpOworCisgICAgaWYgKHBlbikgeworICAgICAg
ICBTZWxlY3RPYmplY3QoZGMsIG9sZFBlbik7CisgICAgICAgIERlbGV0ZU9iamVjdChwZW4pOwor
ICAgIH0KKworICAgIGlmIChicnVzaCkgeworICAgICAgICBTZWxlY3RPYmplY3QoZGMsIG9sZEJy
dXNoKTsKKyAgICAgICAgRGVsZXRlT2JqZWN0KGJydXNoKTsKKyAgICB9Cit9CisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpkcmF3TGluZShjb25zdCBJbnRQb2ludCYgcG9pbnQxLCBjb25zdCBJbnRQ
b2ludCYgcG9pbnQyKQoreworICAgIGlmICghbV9kYXRhLT5tX29wYWNpdHkgfHwgcGFpbnRpbmdE
aXNhYmxlZCgpIHx8IHN0cm9rZVN0eWxlKCkgPT0gTm9TdHJva2UgfHwgIXN0cm9rZUNvbG9yKCku
YWxwaGEoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU2NvcGVEQ1Byb3ZpZGVyIGRjUHJvdmlk
ZXIobV9kYXRhKTsKKyAgICBpZiAoIW1fZGF0YS0+bV9kYykKKyAgICAgICAgcmV0dXJuOworCisg
ICAgSW50UG9pbnQgdHJQb2ludDEgPSBtX2RhdGEtPm1hcFBvaW50KHBvaW50MSk7CisgICAgSW50
UG9pbnQgdHJQb2ludDIgPSBtX2RhdGEtPm1hcFBvaW50KHBvaW50Mik7CisKKyAgICBJbnRSZWN0
IGxpbmVSZWN0KHRyUG9pbnQxLCB0clBvaW50MiAtIHRyUG9pbnQxKTsKKyAgICBsaW5lUmVjdC5z
ZXRIZWlnaHQobGluZVJlY3QuaGVpZ2h0KCkgKyBzdHJva2VUaGlja25lc3MoKSk7CisgICAgVHJh
bnNwYXJlbnRMYXllckRDIHRyYW5zcGFyZW50REMobV9kYXRhLCBsaW5lUmVjdCwgMCwgc3Ryb2tl
Q29sb3IoKS5hbHBoYSgpKTsKKyAgICBIREMgZGMgPSB0cmFuc3BhcmVudERDLmhkYygpOworICAg
IGlmICghZGMpCisgICAgICAgIHJldHVybjsKKyAgICB0clBvaW50MSArPSB0cmFuc3BhcmVudERD
LnRvU2hpZnQoKTsKKyAgICB0clBvaW50MiArPSB0cmFuc3BhcmVudERDLnRvU2hpZnQoKTsKKwor
ICAgIEhHRElPQkogcGVuID0gY3JlYXRlUGVuKHN0cm9rZUNvbG9yKCksIHN0cm9rZVRoaWNrbmVz
cygpLCBzdHJva2VTdHlsZSgpKTsKKyAgICBIR0RJT0JKIG9sZFBlbiA9IFNlbGVjdE9iamVjdChk
YywgcGVuKTsKKworICAgIE1vdmVUb0V4KGRjLCB0clBvaW50MS54KCksIHRyUG9pbnQxLnkoKSwg
MCk7CisgICAgTGluZVRvKGRjLCB0clBvaW50Mi54KCksIHRyUG9pbnQyLnkoKSk7CisKKyAgICBT
ZWxlY3RPYmplY3QoZGMsIG9sZFBlbik7CisgICAgRGVsZXRlT2JqZWN0KHBlbik7Cit9CisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3RWxsaXBzZShjb25zdCBJbnRSZWN0JiByZWN0KQorewor
ICAgIGlmICghbV9kYXRhLT5tX29wYWNpdHkgfHwgcGFpbnRpbmdEaXNhYmxlZCgpIHx8ICghZmls
bENvbG9yKCkuYWxwaGEoKSAmJiBzdHJva2VTdHlsZSgpID09IE5vU3Ryb2tlKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgU2NvcGVEQ1Byb3ZpZGVyIGRjUHJvdmlkZXIobV9kYXRhKTsKKyAgICBp
ZiAoIW1fZGF0YS0+bV9kYykKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50UmVjdCB0clJlY3Qg
PSBtX2RhdGEtPm1hcFJlY3QocmVjdCk7CisgICAgVHJhbnNwYXJlbnRMYXllckRDIHRyYW5zcGFy
ZW50REMobV9kYXRhLCB0clJlY3QsICZyZWN0KTsKKyAgICBIREMgZGMgPSB0cmFuc3BhcmVudERD
LmhkYygpOworICAgIGlmICghZGMpCisgICAgICAgIHJldHVybjsKKyAgICB0clJlY3QubW92ZSh0
cmFuc3BhcmVudERDLnRvU2hpZnQoKSk7CisKKyAgICBIR0RJT0JKIGJydXNoID0gMDsKKyAgICBI
R0RJT0JKIG9sZEJydXNoOworICAgIGlmIChmaWxsQ29sb3IoKS5hbHBoYSgpKSB7CisgICAgICAg
IGJydXNoID0gY3JlYXRlQnJ1c2goZmlsbENvbG9yKCkpOworICAgICAgICBvbGRCcnVzaCA9IFNl
bGVjdE9iamVjdChkYywgYnJ1c2gpOworICAgIH0gZWxzZQorICAgICAgICBTZWxlY3RPYmplY3Qo
ZGMsIEdldFN0b2NrT2JqZWN0KE5VTExfQlJVU0gpKTsKKyAgICBIR0RJT0JKIHBlbiA9IDA7Cisg
ICAgSEdESU9CSiBvbGRQZW47CisgICAgaWYgKHN0cm9rZVN0eWxlKCkgIT0gTm9TdHJva2UpIHsK
KyAgICAgICAgcGVuID0gY3JlYXRlUGVuKHN0cm9rZUNvbG9yKCksIHN0cm9rZVRoaWNrbmVzcygp
LCBzdHJva2VTdHlsZSgpKTsKKyAgICAgICAgb2xkUGVuID0gU2VsZWN0T2JqZWN0KGRjLCBwZW4p
OworICAgIH0gZWxzZQorICAgICAgICBTZWxlY3RPYmplY3QoZGMsIEdldFN0b2NrT2JqZWN0KE5V
TExfUEVOKSk7CisKKyAgICBFbGxpcHNlKGRjLCB0clJlY3QueCgpLCB0clJlY3QueSgpLCB0clJl
Y3QucmlnaHQoKSwgdHJSZWN0LmJvdHRvbSgpKTsKKworICAgIGlmIChwZW4pIHsKKyAgICAgICAg
U2VsZWN0T2JqZWN0KGRjLCBvbGRQZW4pOworICAgICAgICBEZWxldGVPYmplY3QocGVuKTsKKyAg
ICB9CisKKyAgICBpZiAoYnJ1c2gpIHsKKyAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBvbGRCcnVz
aCk7CisgICAgICAgIERlbGV0ZU9iamVjdChicnVzaCk7CisgICAgfQorfQorCitzdGF0aWMgaW5s
aW5lIGJvb2wgZXF1YWxBbmdsZShkb3VibGUgYSwgZG91YmxlIGIpIAoreworICAgIHJldHVybiBm
YWJzKGEgLSBiKSA8IDFFLTU7Cit9CisKK3ZvaWQgZ2V0RWxsaXBzZVBvaW50QnlBbmdsZShkb3Vi
bGUgYW5nbGUsIGRvdWJsZSBhLCBkb3VibGUgYiwgZmxvYXQmIHgsIGZsb2F0JiB5KQoreworICAg
IHdoaWxlIChhbmdsZSA8IDApCisgICAgICAgIGFuZ2xlICs9IDIgKiBwaURvdWJsZTsKKyAgICB3
aGlsZSAoYW5nbGUgPj0gMiAqIHBpRG91YmxlKQorICAgICAgICBhbmdsZSAtPSAyICogcGlEb3Vi
bGU7CisKKyAgICBpZiAoZXF1YWxBbmdsZShhbmdsZSwgMCkgfHwgZXF1YWxBbmdsZShhbmdsZSwg
MiAqIHBpRG91YmxlKSkgeworICAgICAgICB4ID0gYTsKKyAgICAgICAgeSA9IDA7CisgICAgfSBl
bHNlIGlmIChlcXVhbEFuZ2xlKGFuZ2xlLCBwaURvdWJsZSkpIHsKKyAgICAgICAgeCA9IC1hOwor
ICAgICAgICB5ID0gMDsKKyAgICB9IGVsc2UgaWYgKGVxdWFsQW5nbGUoYW5nbGUsIC41ICogcGlE
b3VibGUpKSB7CisgICAgICAgIHggPSAwOworICAgICAgICB5ID0gYjsKKyAgICB9IGVsc2UgaWYg
KGVxdWFsQW5nbGUoYW5nbGUsIDEuNSAqIHBpRG91YmxlKSkgeworICAgICAgICB4ID0gMDsKKyAg
ICAgICAgeSA9IC1iOworICAgIH0gZWxzZSB7CisgICAgICAgIGRvdWJsZSBrID0gdGFuKGFuZ2xl
KTsKKyAgICAgICAgZG91YmxlIHNxQSA9IGEgKiBhOworICAgICAgICBkb3VibGUgc3FCID0gYiAq
IGI7CisgICAgICAgIGRvdWJsZSB0bXAgPSAxLiAvICgxLiAvIHNxQSArIChrICogaykgLyBzcUIp
OworICAgICAgICB0bXAgPSB0bXAgPD0gMCA/IDAgOiBzcXJ0KHRtcCk7CisgICAgICAgIGlmIChh
bmdsZSA+IC41ICogcGlEb3VibGUgJiYgYW5nbGUgPCAxLjUgKiBwaURvdWJsZSkKKyAgICAgICAg
ICAgIHRtcCA9IC10bXA7CisgICAgICAgIHggPSB0bXA7CisKKyAgICAgICAgayA9IHRhbiguNSAq
IHBpRG91YmxlIC0gYW5nbGUpOworICAgICAgICB0bXAgPSAxLiAvICgoayAqIGspIC8gc3FBICsg
MSAvIHNxQik7CisgICAgICAgIHRtcCA9IHRtcCA8PSAwID8gMCA6IHNxcnQodG1wKTsKKyAgICAg
ICAgaWYgKGFuZ2xlID4gcGlEb3VibGUpCisgICAgICAgICAgICB0bXAgPSAtdG1wOworICAgICAg
ICB5ID0gdG1wOworICAgIH0KK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnN0cm9rZUFyYyhj
b25zdCBJbnRSZWN0JiByZWN0LCBpbnQgc3RhcnRBbmdsZSwgaW50IGFuZ2xlU3BhbikKK3sKKyAg
ICBpZiAoIW1fZGF0YS0+bV9vcGFjaXR5IHx8IHBhaW50aW5nRGlzYWJsZWQoKSB8fCBzdHJva2VT
dHlsZSgpID09IE5vU3Ryb2tlIHx8IHJlY3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisK
KyAgICBTY29wZURDUHJvdmlkZXIgZGNQcm92aWRlcihtX2RhdGEpOworICAgIGlmICghbV9kYXRh
LT5tX2RjKQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRSZWN0IHRyUmVjdCA9IG1fZGF0YS0+
bWFwUmVjdChyZWN0KTsKKyAgICBUcmFuc3BhcmVudExheWVyREMgdHJhbnNwYXJlbnREQyhtX2Rh
dGEsIHRyUmVjdCwgJnJlY3QpOworICAgIEhEQyBkYyA9IHRyYW5zcGFyZW50REMuaGRjKCk7Cisg
ICAgaWYgKCFkYykKKyAgICAgICAgcmV0dXJuOworICAgIHRyUmVjdC5tb3ZlKHRyYW5zcGFyZW50
REMudG9TaGlmdCgpKTsKKworICAgIEhHRElPQkogcGVuID0gY3JlYXRlUGVuKHN0cm9rZUNvbG9y
KCksIHN0cm9rZVRoaWNrbmVzcygpLCBzdHJva2VTdHlsZSgpKTsKKyAgICBIR0RJT0JKIG9sZFBl
biA9IFNlbGVjdE9iamVjdChkYywgcGVuKTsKKworICAgIGRvdWJsZSBhID0gdHJSZWN0LndpZHRo
KCkgKiAwLjU7CisgICAgZG91YmxlIGIgPSB0clJlY3QuaGVpZ2h0KCkgKiAwLjU7CisgICAgaW50
IGNlbnRlclggPSBzdGFibGVSb3VuZCh0clJlY3QueCgpICsgYSk7CisgICAgaW50IGNlbnRlclkg
PSBzdGFibGVSb3VuZCh0clJlY3QueSgpICsgYik7CisgICAgZmxvYXQgZnN0YXJ0WCwgZnN0YXJ0
WSwgZmVuZFgsIGZlbmRZOworICAgIGludCBzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWTsKKyAg
ICBnZXRFbGxpcHNlUG9pbnRCeUFuZ2xlKGRlZzJyYWQoKGRvdWJsZSlzdGFydEFuZ2xlKSwgYSwg
YiwgZnN0YXJ0WCwgZnN0YXJ0WSk7CisgICAgZ2V0RWxsaXBzZVBvaW50QnlBbmdsZShkZWcycmFk
KChkb3VibGUpc3RhcnRBbmdsZSArIGFuZ2xlU3BhbiksIGEsIGIsIGZlbmRYLCBmZW5kWSk7Cisg
ICAgc3RhcnRYID0gc3RhYmxlUm91bmQoZnN0YXJ0WCk7CisgICAgc3RhcnRZID0gc3RhYmxlUm91
bmQoZnN0YXJ0WSk7CisgICAgZW5kWCA9IHN0YWJsZVJvdW5kKGZlbmRYKTsKKyAgICBlbmRZID0g
c3RhYmxlUm91bmQoZmVuZFkpOworCisgICAgc3RhcnRYICs9IGNlbnRlclg7CisgICAgc3RhcnRZ
ID0gY2VudGVyWSAtIHN0YXJ0WTsKKyAgICBlbmRYICs9IGNlbnRlclg7CisgICAgZW5kWSA9IGNl
bnRlclkgLSBlbmRZOworICAgIFJFQ1QgY2xpcFJlY3Q7CisgICAgaWYgKHN0YXJ0WCA8IGVuZFgp
IHsKKyAgICAgICAgY2xpcFJlY3QubGVmdCA9IHN0YXJ0WDsKKyAgICAgICAgY2xpcFJlY3Qucmln
aHQgPSBlbmRYOworICAgIH0gZWxzZSB7CisgICAgICAgIGNsaXBSZWN0LmxlZnQgPSBlbmRYOwor
ICAgICAgICBjbGlwUmVjdC5yaWdodCA9IHN0YXJ0WDsKKyAgICB9CisgICAgaWYgKHN0YXJ0WSA8
IGVuZFkpIHsKKyAgICAgICAgY2xpcFJlY3QudG9wID0gc3RhcnRZOworICAgICAgICBjbGlwUmVj
dC5ib3R0b20gPSBlbmRZOworICAgIH0gZWxzZSB7CisgICAgICAgIGNsaXBSZWN0LnRvcCA9IGVu
ZFk7CisgICAgICAgIGNsaXBSZWN0LmJvdHRvbSA9IHN0YXJ0WTsKKyAgICB9CisKKyAgICBPd25Q
dHI8SFJHTj4gY2xpcFJnbihDcmVhdGVSZWN0UmduKDAsIDAsIDAsIDApKTsKKyAgICBib29sIG5l
d0NsaXA7CisgICAgaWYgKEdldENsaXBSZ24oZGMsIGNsaXBSZ24uZ2V0KCkpIDw9IDApIHsKKyAg
ICAgICAgbmV3Q2xpcCA9IHRydWU7CisgICAgICAgIGNsaXBSZ24uc2V0KENyZWF0ZVJlY3RSZ24o
Y2xpcFJlY3QubGVmdCwgY2xpcFJlY3QudG9wLCBjbGlwUmVjdC5yaWdodCwgY2xpcFJlY3QuYm90
dG9tKSk7CisgICAgICAgIFNlbGVjdENsaXBSZ24oZGMsIGNsaXBSZ24uZ2V0KCkpOworICAgIH0g
ZWxzZSB7CisgICAgICAgIG5ld0NsaXAgPSBmYWxzZTsKKyAgICAgICAgSW50ZXJzZWN0Q2xpcFJl
Y3QoZGMsIGNsaXBSZWN0LmxlZnQsIGNsaXBSZWN0LnRvcCwgY2xpcFJlY3QucmlnaHQsIGNsaXBS
ZWN0LmJvdHRvbSk7CisgICAgfQorCisgICAgSEdESU9CSiBvbGRCcnVzaCA9IFNlbGVjdE9iamVj
dChkYywgR2V0U3RvY2tPYmplY3QoTlVMTF9CUlVTSCkpOworICAgIEVsbGlwc2UoZGMsIHRyUmVj
dC54KCksIHRyUmVjdC55KCksIHRyUmVjdC5yaWdodCgpLCB0clJlY3QuYm90dG9tKCkpOworICAg
IFNlbGVjdE9iamVjdChkYywgb2xkQnJ1c2gpOworCisgICAgaWYgKG5ld0NsaXApCisgICAgICAg
IFNlbGVjdENsaXBSZ24oZGMsIDApOworICAgIGVsc2UKKyAgICAgICAgU2VsZWN0Q2xpcFJnbihk
YywgY2xpcFJnbi5nZXQoKSk7CisKKyAgICBTZWxlY3RPYmplY3QoZGMsIG9sZFBlbik7CisgICAg
RGVsZXRlT2JqZWN0KHBlbik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3Q29udmV4
UG9seWdvbihzaXplX3QgbnBvaW50cywgY29uc3QgRmxvYXRQb2ludCogcG9pbnRzLCBib29sIHNo
b3VsZEFudGlhbGlhcykKK3sKKyAgICBpZiAoIW1fZGF0YS0+bV9vcGFjaXR5IHx8IHBhaW50aW5n
RGlzYWJsZWQoKSB8fCBucG9pbnRzIDw9IDEgfHwgIXBvaW50cykKKyAgICAgICAgcmV0dXJuOwor
CisgICAgU2NvcGVEQ1Byb3ZpZGVyIGRjUHJvdmlkZXIobV9kYXRhKTsKKyAgICBpZiAoIW1fZGF0
YS0+bV9kYykKKyAgICAgICAgcmV0dXJuOworCisgICAgVmVjdG9yPFBPSU5ULCAyMD4gd2luUG9p
bnRzKG5wb2ludHMpOworICAgIEZsb2F0UG9pbnQgdHJQb2ludCA9IG1fZGF0YS0+bWFwUG9pbnQo
cG9pbnRzWzBdKTsKKyAgICB3aW5Qb2ludHNbMF0ueCA9IHN0YWJsZVJvdW5kKHRyUG9pbnQueCgp
KTsKKyAgICB3aW5Qb2ludHNbMF0ueSA9IHN0YWJsZVJvdW5kKHRyUG9pbnQueSgpKTsKKyAgICBS
RUNUIHJlY3QgPSB7IHdpblBvaW50c1swXS54LCB3aW5Qb2ludHNbMF0ueSwgd2luUG9pbnRzWzBd
LngsIHdpblBvaW50c1swXS55IH07CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBucG9pbnRz
OyArK2kpIHsKKyAgICAgICAgdHJQb2ludCA9IG1fZGF0YS0+bWFwUG9pbnQocG9pbnRzW2ldKTsK
KyAgICAgICAgd2luUG9pbnRzW2ldLnggPSBzdGFibGVSb3VuZCh0clBvaW50LngoKSk7CisgICAg
ICAgIHdpblBvaW50c1tpXS55ID0gc3RhYmxlUm91bmQodHJQb2ludC55KCkpOworICAgICAgICBp
ZiAocmVjdC5sZWZ0ID4gd2luUG9pbnRzW2ldLngpCisgICAgICAgICAgICByZWN0LmxlZnQgPSB3
aW5Qb2ludHNbaV0ueDsKKyAgICAgICAgZWxzZSBpZiAocmVjdC5yaWdodCA8IHdpblBvaW50c1tp
XS54KQorICAgICAgICAgICAgcmVjdC5yaWdodCA9IHdpblBvaW50c1tpXS54OworICAgICAgICBp
ZiAocmVjdC50b3AgPiB3aW5Qb2ludHNbaV0ueSkKKyAgICAgICAgICAgIHJlY3QudG9wID0gd2lu
UG9pbnRzW2ldLnk7CisgICAgICAgIGVsc2UgaWYgKHJlY3QuYm90dG9tIDwgd2luUG9pbnRzW2ld
LnkpCisgICAgICAgICAgICByZWN0LmJvdHRvbSA9IHdpblBvaW50c1tpXS55OworICAgIH0KKyAg
ICByZWN0LmJvdHRvbSArPSAxOworICAgIHJlY3QucmlnaHQgKz0gMTsKKworICAgIEludFJlY3Qg
aW50UmVjdChyZWN0KTsKKyAgICBUcmFuc3BhcmVudExheWVyREMgdHJhbnNwYXJlbnREQyhtX2Rh
dGEsIGludFJlY3QpOworICAgIEhEQyBkYyA9IHRyYW5zcGFyZW50REMuaGRjKCk7CisgICAgaWYg
KCFkYykKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBucG9p
bnRzOyArK2kpIHsKKyAgICAgICAgd2luUG9pbnRzW2ldLnggKz0gdHJhbnNwYXJlbnREQy50b1No
aWZ0KCkud2lkdGgoKTsKKyAgICAgICAgd2luUG9pbnRzW2ldLnkgKz0gdHJhbnNwYXJlbnREQy50
b1NoaWZ0KCkuaGVpZ2h0KCk7CisgICAgfQorCisgICAgSEdESU9CSiBicnVzaCA9IDA7CisgICAg
SEdESU9CSiBvbGRCcnVzaDsKKyAgICBpZiAoZmlsbENvbG9yKCkuYWxwaGEoKSkgeworICAgICAg
ICBicnVzaCA9IGNyZWF0ZUJydXNoKGZpbGxDb2xvcigpKTsKKyAgICAgICAgb2xkQnJ1c2ggPSBT
ZWxlY3RPYmplY3QoZGMsIGJydXNoKTsKKyAgICB9IGVsc2UKKyAgICAgICAgU2VsZWN0T2JqZWN0
KGRjLCBHZXRTdG9ja09iamVjdChOVUxMX0JSVVNIKSk7CisKKyAgICBIR0RJT0JKIHBlbiA9IDA7
CisgICAgSEdESU9CSiBvbGRQZW47CisgICAgaWYgKHN0cm9rZVN0eWxlKCkgIT0gTm9TdHJva2Up
IHsKKyAgICAgICAgcGVuID0gY3JlYXRlUGVuKHN0cm9rZUNvbG9yKCksIHN0cm9rZVRoaWNrbmVz
cygpLCBzdHJva2VTdHlsZSgpKTsKKyAgICAgICAgb2xkUGVuID0gU2VsZWN0T2JqZWN0KGRjLCBw
ZW4pOworICAgIH0gZWxzZQorICAgICAgICBTZWxlY3RPYmplY3QoZGMsIEdldFN0b2NrT2JqZWN0
KE5VTExfUEVOKSk7CisKKyAgICBpZiAoIWJydXNoICYmICFwZW4pCisgICAgICAgIHJldHVybjsK
KworICAgIFBvbHlnb24oZGMsIHdpblBvaW50cy5kYXRhKCksIG5wb2ludHMpOworCisgICAgaWYg
KHBlbikgeworICAgICAgICBTZWxlY3RPYmplY3QoZGMsIG9sZFBlbik7CisgICAgICAgIERlbGV0
ZU9iamVjdChwZW4pOworICAgIH0KKworICAgIGlmIChicnVzaCkgeworICAgICAgICBTZWxlY3RP
YmplY3QoZGMsIG9sZEJydXNoKTsKKyAgICAgICAgRGVsZXRlT2JqZWN0KGJydXNoKTsKKyAgICB9
Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpmaWxsUmVjdChjb25zdCBGbG9hdFJlY3QmIHJl
Y3QsIGNvbnN0IENvbG9yJiBjb2xvciwgQ29sb3JTcGFjZSBjb2xvclNwYWNlKQoreworICAgIGlm
IChwYWludGluZ0Rpc2FibGVkKCkgfHwgIW1fZGF0YS0+bV9vcGFjaXR5KQorICAgICAgICByZXR1
cm47CisKKyAgICBpbnQgYWxwaGEgPSBjb2xvci5hbHBoYSgpOworICAgIGlmICghYWxwaGEpCisg
ICAgICAgIHJldHVybjsKKworICAgIFNjb3BlRENQcm92aWRlciBkY1Byb3ZpZGVyKG1fZGF0YSk7
CisgICAgaWYgKCFtX2RhdGEtPm1fZGMpCisgICAgICAgIHJldHVybjsKKworICAgIEludFJlY3Qg
aW50UmVjdCA9IGVuY2xvc2luZ0ludFJlY3QocmVjdCk7CisgICAgVHJhbnNwYXJlbnRMYXllckRD
IHRyYW5zcGFyZW50REMobV9kYXRhLCBtX2RhdGEtPm1hcFJlY3QoaW50UmVjdCksICZpbnRSZWN0
LCBhbHBoYSk7CisKKyAgICBpZiAoIXRyYW5zcGFyZW50REMuaGRjKCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIE93blB0cjxIQlJVU0g+IGhicnVzaChDcmVhdGVTb2xpZEJydXNoKFJHQihjb2xv
ci5yZWQoKSwgY29sb3IuZ3JlZW4oKSwgY29sb3IuYmx1ZSgpKSkpOworICAgIEZpbGxSZWN0KHRy
YW5zcGFyZW50REMuaGRjKCksICZ0cmFuc3BhcmVudERDLnJlY3QoKSwgaGJydXNoLmdldCgpKTsK
K30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXAoY29uc3QgRmxvYXRSZWN0JiByZWN0KQor
eworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlm
ICghbV9kYXRhLT5tX2RjKQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRSZWN0IHRyUmVjdCA9
IGVuY2xvc2luZ0ludFJlY3QobV9kYXRhLT5tYXBSZWN0KHJlY3QpKTsKKworICAgIE93blB0cjxI
UkdOPiBjbGlwUmduKENyZWF0ZVJlY3RSZ24oMCwgMCwgMCwgMCkpOworICAgIGlmIChHZXRDbGlw
UmduKG1fZGF0YS0+bV9kYywgY2xpcFJnbi5nZXQoKSkgPiAwKQorICAgICAgICBJbnRlcnNlY3RD
bGlwUmVjdChtX2RhdGEtPm1fZGMsIHRyUmVjdC54KCksIHRyUmVjdC55KCksIHRyUmVjdC5yaWdo
dCgpLCB0clJlY3QuYm90dG9tKCkpOworICAgIGVsc2UgeworICAgICAgICBjbGlwUmduLnNldChD
cmVhdGVSZWN0UmduKHRyUmVjdC54KCksIHRyUmVjdC55KCksIHRyUmVjdC5yaWdodCgpLCB0clJl
Y3QuYm90dG9tKCkpKTsKKyAgICAgICAgU2VsZWN0Q2xpcFJnbihtX2RhdGEtPm1fZGMsIGNsaXBS
Z24uZ2V0KCkpOworICAgIH0KK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBPdXQoY29u
c3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBpZiAoIW1fZGF0YS0+bV9kYykKKyAgICAgICAgcmV0dXJuOworCisg
ICAgSW50UmVjdCB0clJlY3QgPSBtX2RhdGEtPm1hcFJlY3QocmVjdCk7CisKKyAgICBFeGNsdWRl
Q2xpcFJlY3QobV9kYXRhLT5tX2RjLCB0clJlY3QueCgpLCB0clJlY3QueSgpLCB0clJlY3Qucmln
aHQoKSwgdHJSZWN0LmJvdHRvbSgpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdG
b2N1c1JpbmcoY29uc3QgVmVjdG9yPFBhdGg+JiBwYXRocywgaW50IHdpZHRoLCBpbnQgb2Zmc2V0
LCBjb25zdCBDb2xvciYgY29sb3IpCit7CisgICAgLy8gRklYTUU6IGltcGxlbWVudAorfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0ZvY3VzUmluZyhjb25zdCBWZWN0b3I8SW50UmVjdD4m
IHJlY3RzLCBpbnQgd2lkdGgsIGludCBvZmZzZXQsIGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAg
ICBpZiAoIW1fZGF0YS0+bV9vcGFjaXR5IHx8IHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgU2NvcGVEQ1Byb3ZpZGVyIGRjUHJvdmlkZXIobV9kYXRhKTsKKyAgICBp
ZiAoIW1fZGF0YS0+bV9kYykKKyAgICAgICAgcmV0dXJuOworCisgICAgaW50IHJhZGl1cyA9ICh3
aWR0aCAtIDEpIC8gMjsKKyAgICBvZmZzZXQgKz0gcmFkaXVzOworCisgICAgdW5zaWduZWQgcmVj
dENvdW50ID0gcmVjdHMuc2l6ZSgpOworICAgIEludFJlY3QgZmluYWxGb2N1c1JlY3Q7CisgICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlY3RDb3VudDsgaSsrKSB7CisgICAgICAgIEludFJl
Y3QgZm9jdXNSZWN0ID0gcmVjdHNbaV07CisgICAgICAgIGZvY3VzUmVjdC5pbmZsYXRlKG9mZnNl
dCk7CisgICAgICAgIGZpbmFsRm9jdXNSZWN0LnVuaXRlKGZvY3VzUmVjdCk7CisgICAgfQorCisg
ICAgSW50UmVjdCBpbnRSZWN0ID0gZmluYWxGb2N1c1JlY3Q7CisgICAgSW50UmVjdCB0clJlY3Qg
PSBtX2RhdGEtPm1hcFJlY3QoZmluYWxGb2N1c1JlY3QpOworICAgIFRyYW5zcGFyZW50TGF5ZXJE
QyB0cmFuc3BhcmVudERDKG1fZGF0YSwgdHJSZWN0LCAmaW50UmVjdCk7CisgICAgSERDIGRjID0g
dHJhbnNwYXJlbnREQy5oZGMoKTsKKyAgICBpZiAoIWRjKQorICAgICAgICByZXR1cm47CisgICAg
dHJSZWN0Lm1vdmUodHJhbnNwYXJlbnREQy50b1NoaWZ0KCkpOworCisgICAgUkVDVCByZWN0ID0g
dHJSZWN0OworICAgIERyYXdGb2N1c1JlY3QoZGMsICZyZWN0KTsKK30KKwordm9pZCBHcmFwaGlj
c0NvbnRleHQ6OmRyYXdMaW5lRm9yVGV4dChjb25zdCBJbnRQb2ludCYgb3JpZ2luLCBpbnQgd2lk
dGgsIGJvb2wgcHJpbnRpbmcpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgU3Ryb2tlU3R5bGUgb2xkU3R5bGUgPSBzdHJva2VTdHlsZSgpOwor
ICAgIHNldFN0cm9rZVN0eWxlKFNvbGlkU3Ryb2tlKTsKKyAgICBkcmF3TGluZShvcmlnaW4sIG9y
aWdpbiArIEludFNpemUod2lkdGgsIDApKTsKKyAgICBzZXRTdHJva2VTdHlsZShvbGRTdHlsZSk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvck1pc3NwZWxsaW5nT3JCYWRH
cmFtbWFyKGNvbnN0IEludFBvaW50JiwgaW50IHdpZHRoLCBib29sIGdyYW1tYXIpCit7CisgICAg
bm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3Jt
RmlsbENvbG9yKGNvbnN0IENvbG9yJiBjb2wsIENvbG9yU3BhY2UgY29sb3JTcGFjZSkKK3sKKyAg
ICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZv
cm1TdHJva2VDb2xvcihjb25zdCBDb2xvciYgY29sLCBDb2xvclNwYWNlIGNvbG9yU3BhY2UpCit7
CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBs
YXRmb3JtU3Ryb2tlVGhpY2tuZXNzKGZsb2F0IHN0cm9rZVRoaWNrbmVzcykKK3sKKyAgICBub3RJ
bXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0VVJMRm9yUmVjdChj
b25zdCBLVVJMJiBsaW5rLCBjb25zdCBJbnRSZWN0JiBkZXN0UmVjdCkKK3sKKyAgICBub3RJbXBs
ZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6YWRkSW5uZXJSb3VuZGVkUmVj
dENsaXAoY29uc3QgSW50UmVjdCYgcmVjdCwgaW50IHRoaWNrbmVzcykKK3sKKyAgICAvLyBXZSBj
YW4gb25seSBjbGlwIHJlY3RhbmdsZXMgb24gV0lOQ0UKKyAgICBjbGlwKHJlY3QpOworfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xlYXJSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sK
KyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAo
bV9kYXRhLT5oYXNBbHBoYSgpKSB7CisgICAgICAgIEludFJlY3QgdHJSZWN0ID0gZW5jbG9zaW5n
SW50UmVjdChtX2RhdGEtPm1hcFJlY3QocmVjdCkpOworICAgICAgICBtX2RhdGEtPm1fYml0bWFw
LT5jbGVhclBpeGVscyh0clJlY3QpOworICAgICAgICByZXR1cm47CisgICAgfSAKKworICAgIGZp
bGxSZWN0KHJlY3QsIENvbG9yKENvbG9yOjp3aGl0ZSksIERldmljZUNvbG9yU3BhY2UpOworfQor
Cit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c3Ryb2tlUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3Qs
IGZsb2F0IHdpZHRoKQoreworICAgIGlmICghbV9kYXRhLT5tX29wYWNpdHkgfHwgcGFpbnRpbmdE
aXNhYmxlZCgpIHx8IHN0cm9rZVN0eWxlKCkgPT0gTm9TdHJva2UpCisgICAgICAgIHJldHVybjsK
KworICAgIFNjb3BlRENQcm92aWRlciBkY1Byb3ZpZGVyKG1fZGF0YSk7CisgICAgaWYgKCFtX2Rh
dGEtPm1fZGMpCisgICAgICAgIHJldHVybjsKKworICAgIEludFJlY3QgaW50UmVjdCA9IGVuY2xv
c2luZ0ludFJlY3QocmVjdCk7CisgICAgSW50UmVjdCB0clJlY3QgPSBtX2RhdGEtPm1hcFJlY3Qo
aW50UmVjdCk7CisgICAgVHJhbnNwYXJlbnRMYXllckRDIHRyYW5zcGFyZW50REMobV9kYXRhLCB0
clJlY3QsICZpbnRSZWN0KTsKKyAgICBIREMgZGMgPSB0cmFuc3BhcmVudERDLmhkYygpOworICAg
IGlmICghZGMpCisgICAgICAgIHJldHVybjsKKyAgICB0clJlY3QubW92ZSh0cmFuc3BhcmVudERD
LnRvU2hpZnQoKSk7CisKKyAgICBIR0RJT0JKIHBlbiA9IGNyZWF0ZVBlbihzdHJva2VDb2xvcigp
LCBzdHJva2VUaGlja25lc3MoKSwgc3Ryb2tlU3R5bGUoKSk7CisgICAgSEdESU9CSiBvbGRQZW4g
PSBTZWxlY3RPYmplY3QoZGMsIHBlbik7CisKKyAgICBpbnQgcmlnaHQgPSB0clJlY3QucmlnaHQo
KSAtIDE7CisgICAgaW50IGJvdHRvbSA9IHRyUmVjdC5ib3R0b20oKSAtIDE7CisgICAgY29uc3Qg
UE9JTlQgaW50UG9pbnRzWzVdID0KKyAgICB7CisgICAgICAgIHsgdHJSZWN0LngoKSwgdHJSZWN0
LnkoKSB9LAorICAgICAgICB7IHJpZ2h0LCB0clJlY3QueSgpIH0sCisgICAgICAgIHsgcmlnaHQs
IGJvdHRvbSB9LAorICAgICAgICB7IHRyUmVjdC54KCksIGJvdHRvbSB9LAorICAgICAgICB7IHRy
UmVjdC54KCksIHRyUmVjdC55KCkgfQorICAgIH07CisKKyAgICBQb2x5bGluZShkYywgaW50UG9p
bnRzLCA1KTsKKworICAgIFNlbGVjdE9iamVjdChkYywgb2xkUGVuKTsKKyAgICBEZWxldGVPYmpl
Y3QocGVuKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmJlZ2luVHJhbnNwYXJlbmN5TGF5
ZXIoZmxvYXQgb3BhY2l0eSkKK3sKKyAgICBtX2RhdGEtPnNhdmUoKTsKKyAgICBtX2RhdGEtPm1f
b3BhY2l0eSAqPSBvcGFjaXR5OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZW5kVHJhbnNw
YXJlbmN5TGF5ZXIoKQoreworICAgIG1fZGF0YS0+cmVzdG9yZSgpOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDo6Y29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdHJhbnNmb3JtKQor
eworICAgIG1fZGF0YS0+Y29uY2F0Q1RNKHRyYW5zZm9ybSk7Cit9CisKK1RyYW5zZm9ybWF0aW9u
TWF0cml4JiBHcmFwaGljc0NvbnRleHQ6OmFmZmluZVRyYW5zZm9ybSgpCit7CisgICAgcmV0dXJu
IG1fZGF0YS0+bV90cmFuc2Zvcm07Cit9CisKK2NvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBH
cmFwaGljc0NvbnRleHQ6OmFmZmluZVRyYW5zZm9ybSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1f
ZGF0YS0+bV90cmFuc2Zvcm07Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpyZXNldEFmZmlu
ZVRyYW5zZm9ybSgpCit7CisgICAgbV9kYXRhLT5tX3RyYW5zZm9ybS5tYWtlSWRlbnRpdHkoKTsK
K30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5KQor
eworICAgIG1fZGF0YS0+dHJhbnNsYXRlKHgsIHkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dDo6cm90YXRlKGZsb2F0IHJhZGlhbnMpCit7CisgICAgbV9kYXRhLT5yb3RhdGUocmFkaWFucyk7
Cit9CisKK0ludFBvaW50IEdyYXBoaWNzQ29udGV4dDo6b3JpZ2luKCkKK3sKKyAgICByZXR1cm4g
bV9kYXRhLT5vcmlnaW4oKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNjYWxlKGNvbnN0
IEZsb2F0U2l6ZSYgc2l6ZSkKK3sKKyAgICBtX2RhdGEtPnNjYWxlKHNpemUpOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dDo6c2V0TGluZUNhcChMaW5lQ2FwIGxpbmVDYXApCit7CisgICAgbm90
SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldExpbmVKb2luKExp
bmVKb2luIGxpbmVKb2luKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpzZXRNaXRlckxpbWl0KGZsb2F0IG1pdGVyKQoreworICAgIG5vdEltcGxl
bWVudGVkKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRBbHBoYShmbG9hdCBhbHBo
YSkKK3sKKyAgICBtX2RhdGEtPm1fb3BhY2l0eSA9IGFscGhhOworfQorCit2b2lkIEdyYXBoaWNz
Q29udGV4dDo6c2V0Q29tcG9zaXRlT3BlcmF0aW9uKENvbXBvc2l0ZU9wZXJhdG9yIG9wKQorewor
ICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpiZWdpblBh
dGgoKQoreworICAgIG1fZGF0YS0+bV9wYXRocy5jbGVhcigpOworfQorCit2b2lkIEdyYXBoaWNz
Q29udGV4dDo6YWRkUGF0aChjb25zdCBQYXRoJiBwYXRoKQoreworICAgIG1fZGF0YS0+bV9wYXRo
cy5hcHBlbmQocGF0aCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwKGNvbnN0IFBh
dGgmIHBhdGgpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQ6OmNhbnZhc0NsaXAoY29uc3QgUGF0aCYgcGF0aCkKK3sKKyAgICBjbGlwKHBhdGgpOwor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcE91dChjb25zdCBQYXRoJikKK3sKKyAgICBu
b3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcE91dEVsbGlw
c2VJblJlY3QoY29uc3QgSW50UmVjdCYpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwor
c3RhdGljIGlubGluZSBJbnRQb2ludCByZWN0Q2VudGVyUG9pbnQoY29uc3QgUkVDVCYgcmVjdCkK
K3sKKyAgICByZXR1cm4gSW50UG9pbnQocmVjdC5sZWZ0ICsgKHJlY3QucmlnaHQgLSByZWN0Lmxl
ZnQpIC8gMiwgcmVjdC50b3AgKyAocmVjdC5ib3R0b20gLSByZWN0LnRvcCkgLyAyKTsKK30KK3Zv
aWQgR3JhcGhpY3NDb250ZXh0OjpmaWxsUm91bmRlZFJlY3QoY29uc3QgSW50UmVjdCYgZmlsbFJl
Y3QsIGNvbnN0IEludFNpemUmIHRvcExlZnQsIGNvbnN0IEludFNpemUmIHRvcFJpZ2h0LCBjb25z
dCBJbnRTaXplJiBib3R0b21MZWZ0LCBjb25zdCBJbnRTaXplJiBib3R0b21SaWdodCwgY29uc3Qg
Q29sb3ImIGMsIENvbG9yU3BhY2UgY29sb3JTcGFjZSkKK3sKKyAgICBTY29wZURDUHJvdmlkZXIg
ZGNQcm92aWRlcihtX2RhdGEpOworICAgIGlmICghbV9kYXRhLT5tX2RjKQorICAgICAgICByZXR1
cm47CisKKyAgICBJbnRTaXplIHNoYWRvd1NpemU7CisgICAgaW50IHNoYWRvd0JsdXIgPSAwOwor
ICAgIENvbG9yIHNoYWRvd0NvbG9yOworICAgICAgICAKKyAgICBnZXRTaGFkb3coc2hhZG93U2l6
ZSwgc2hhZG93Qmx1ciwgc2hhZG93Q29sb3IpOworICAgIAorICAgIEludFJlY3QgZHN0UmVjdCA9
IGZpbGxSZWN0OworICAgIAorICAgIGRzdFJlY3QubW92ZShzaGFkb3dTaXplKTsKKyAgICBkc3RS
ZWN0LmluZmxhdGUoc2hhZG93Qmx1cik7CisgICAgZHN0UmVjdCA9IG1fZGF0YS0+bWFwUmVjdChk
c3RSZWN0KTsKKyAgCisgICAgRmxvYXRTaXplIG5ld1RvcExlZnQobV9kYXRhLT5tYXBTaXplKHRv
cExlZnQpKTsKKyAgICBGbG9hdFNpemUgbmV3VG9wUmlnaHQobV9kYXRhLT5tYXBTaXplKHRvcFJp
Z2h0KSk7CisgICAgRmxvYXRTaXplIG5ld0JvdHRvbUxlZnQobV9kYXRhLT5tYXBTaXplKGJvdHRv
bUxlZnQpKTsKKyAgICBGbG9hdFNpemUgbmV3Qm90dG9tUmlnaHQobV9kYXRhLT5tYXBTaXplKGJv
dHRvbVJpZ2h0KSk7CisKKyAgICBUcmFuc3BhcmVudExheWVyREMgdHJhbnNwYXJlbnREYyhtX2Rh
dGEsIGRzdFJlY3QsICZmaWxsUmVjdCk7CisgICAgSERDIGRjID0gdHJhbnNwYXJlbnREYy5oZGMo
KTsKKyAgICBpZiAoIWRjKQorICAgICAgICByZXR1cm47CisKKyAgICBkc3RSZWN0Lm1vdmUodHJh
bnNwYXJlbnREYy50b1NoaWZ0KCkpOworCisgICAgUkVDVCByZWN0V2luID0gZHN0UmVjdDsKKwor
ICAgIEhHRElPQkogYnJ1c2ggPSBjcmVhdGVCcnVzaChzaGFkb3dDb2xvcik7CisgICAgSEdESU9C
SiBvbGRCcnVzaCA9IFNlbGVjdE9iamVjdChkYywgYnJ1c2gpOworICAgCisgICAgU2VsZWN0T2Jq
ZWN0KGRjLCBHZXRTdG9ja09iamVjdChOVUxMX1BFTikpOworCisgICAgSW50UG9pbnQgY2VudGVy
UG9pbnQgPSByZWN0Q2VudGVyUG9pbnQocmVjdFdpbik7CisgICAgLy8gRHJhdyB0b3AgbGVmdCBo
YWxmCisgICAgUkVDVCBjbGlwUmVjdChyZWN0V2luKTsKKyAgICBjbGlwUmVjdC5yaWdodCA9IGNl
bnRlclBvaW50LngoKTsKKyAgICBjbGlwUmVjdC5ib3R0b20gPSBjZW50ZXJQb2ludC55KCk7CisK
KyAgICBPd25QdHI8SFJHTj4gY2xpcFJnbihDcmVhdGVSZWN0UmduKDAsIDAsIDAsIDApKTsKKyAg
ICBib29sIG5lZWRzTmV3Q2xpcCA9IChHZXRDbGlwUmduKGRjLCBjbGlwUmduLmdldCgpKSA8PSAw
KTsKKyAgICAKKyAgICBkcmF3Um91bmRDb3JuZXIobmVlZHNOZXdDbGlwLCBjbGlwUmVjdCwgcmVj
dFdpbiwgZGMsIHN0YWJsZVJvdW5kKG5ld1RvcExlZnQud2lkdGgoKSAqIDIpLCBzdGFibGVSb3Vu
ZChuZXdUb3BMZWZ0LmhlaWdodCgpICogMikpOworCisgICAgLy8gRHJhdyB0b3AgcmlnaHQKKyAg
ICBjbGlwUmVjdCA9IHJlY3RXaW47CisgICAgY2xpcFJlY3QubGVmdCA9IGNlbnRlclBvaW50Lngo
KTsKKyAgICBjbGlwUmVjdC5ib3R0b20gPSBjZW50ZXJQb2ludC55KCk7CisKKyAgICBkcmF3Um91
bmRDb3JuZXIobmVlZHNOZXdDbGlwLCBjbGlwUmVjdCwgcmVjdFdpbiwgZGMsIHN0YWJsZVJvdW5k
KG5ld1RvcFJpZ2h0LndpZHRoKCkgKiAyKSwgc3RhYmxlUm91bmQobmV3VG9wUmlnaHQuaGVpZ2h0
KCkgKiAyKSk7CisKKyAgICAgLy8gRHJhdyBib3R0b20gbGVmdAorICAgIGNsaXBSZWN0ID0gcmVj
dFdpbjsKKyAgICBjbGlwUmVjdC5yaWdodCA9IGNlbnRlclBvaW50LngoKTsKKyAgICBjbGlwUmVj
dC50b3AgPSBjZW50ZXJQb2ludC55KCk7CisKKyAgICBkcmF3Um91bmRDb3JuZXIobmVlZHNOZXdD
bGlwLCBjbGlwUmVjdCwgcmVjdFdpbiwgZGMsIHN0YWJsZVJvdW5kKG5ld0JvdHRvbUxlZnQud2lk
dGgoKSAqIDIpLCBzdGFibGVSb3VuZChuZXdCb3R0b21MZWZ0LmhlaWdodCgpICogMikpOworCisg
ICAgLy8gRHJhdyBib3R0b20gcmlnaHQKKyAgICBjbGlwUmVjdCA9IHJlY3RXaW47CisgICAgY2xp
cFJlY3QubGVmdCA9IGNlbnRlclBvaW50LngoKTsKKyAgICBjbGlwUmVjdC50b3AgPSBjZW50ZXJQ
b2ludC55KCk7CisKKyAgICBkcmF3Um91bmRDb3JuZXIobmVlZHNOZXdDbGlwLCBjbGlwUmVjdCwg
cmVjdFdpbiwgZGMsIHN0YWJsZVJvdW5kKG5ld0JvdHRvbVJpZ2h0LndpZHRoKCkgKiAyKSwgc3Rh
YmxlUm91bmQobmV3Qm90dG9tUmlnaHQuaGVpZ2h0KCkgKiAyKSk7CisKKyAgICBTZWxlY3RPYmpl
Y3QoZGMsIG9sZEJydXNoKTsKKyAgICBEZWxldGVPYmplY3QoYnJ1c2gpOworfQorCisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0OjpkcmF3Um91bmRDb3JuZXIoYm9vbCBuZWVkc05ld0NsaXAsIFJFQ1Qg
Y2xpcFJlY3QsIFJFQ1QgcmVjdFdpbiwgSERDIGRjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7
CisgICAgaWYgKCFkYykKKyAgICAgICAgcmV0dXJuOworCisgICAgT3duUHRyPEhSR04+IGNsaXBS
Z24oQ3JlYXRlUmVjdFJnbigwLCAwLCAwLCAwKSk7CisgICAgaWYgKG5lZWRzTmV3Q2xpcCkgIHsK
KyAgICAgICAgY2xpcFJnbi5zZXQoQ3JlYXRlUmVjdFJnbihjbGlwUmVjdC5sZWZ0LCBjbGlwUmVj
dC50b3AsIGNsaXBSZWN0LnJpZ2h0LCBjbGlwUmVjdC5ib3R0b20pKTsKKyAgICAgICAgU2VsZWN0
Q2xpcFJnbihkYywgY2xpcFJnbi5nZXQoKSk7CisgICAgfSBlbHNlIAorICAgICAgICBJbnRlcnNl
Y3RDbGlwUmVjdChkYywgY2xpcFJlY3QubGVmdCwgY2xpcFJlY3QudG9wLCBjbGlwUmVjdC5yaWdo
dCwgY2xpcFJlY3QuYm90dG9tKTsKKyAgICAKKyAgICA6OlJvdW5kUmVjdChkYywgcmVjdFdpbi5s
ZWZ0ICwgcmVjdFdpbi50b3AgLCByZWN0V2luLnJpZ2h0ICwgcmVjdFdpbi5ib3R0b20gLCB3aWR0
aCwgaGVpZ2h0KTsKKyAgICAKKyAgICBTZWxlY3RDbGlwUmduKGRjLCBuZWVkc05ld0NsaXAgPyAw
IDogY2xpcFJnbi5nZXQoKSk7Cit9CisKKworRmxvYXRSZWN0IEdyYXBoaWNzQ29udGV4dDo6cm91
bmRUb0RldmljZVBpeGVscyhjb25zdCBGbG9hdFJlY3QmIGZyZWN0KQoreworICAgIG5vdEltcGxl
bWVudGVkKCk7CisgICAgcmV0dXJuIGZyZWN0OworfQorCitDb2xvciBncmFkaWVudEF2ZXJhZ2VD
b2xvcihjb25zdCBHcmFkaWVudCogZ3JhZGllbnQpCit7CisgICAgY29uc3QgVmVjdG9yPEdyYWRp
ZW50OjpDb2xvclN0b3A+JiBzdG9wcyA9IGdyYWRpZW50LT5nZXRTdG9wcygpOworICAgIGlmIChz
dG9wcy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBDb2xvcigpOworCisgICAgY29uc3QgR3Jh
ZGllbnQ6OkNvbG9yU3RvcCYgc3RvcCA9IHN0b3BzLmZpcnN0KCk7CisgICAgaWYgKHN0b3BzLnNp
emUoKSA9PSAxKQorICAgICAgICByZXR1cm4gQ29sb3Ioc3RvcC5yZWQsIHN0b3AuZ3JlZW4sIHN0
b3AuYmx1ZSwgc3RvcC5hbHBoYSk7CisKKyAgICBjb25zdCBHcmFkaWVudDo6Q29sb3JTdG9wJiBs
YXN0U3RvcCA9IHN0b3BzLmxhc3QoKTsKKyAgICByZXR1cm4gQ29sb3IoKHN0b3AucmVkICsgbGFz
dFN0b3AucmVkKSAqIDAuNWYKKyAgICAgICAgLCAoc3RvcC5ncmVlbiArIGxhc3RTdG9wLmdyZWVu
KSAqIDAuNWYKKyAgICAgICAgLCAoc3RvcC5ibHVlICsgbGFzdFN0b3AuYmx1ZSkgKiAwLjVmCisg
ICAgICAgICwgKHN0b3AuYWxwaGEgKyBsYXN0U3RvcC5hbHBoYSkgKiAwLjVmKTsKK30KKwordm9p
ZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxQYXRoKCkKK3sKKyAgICBDb2xvciBjID0gbV9jb21tb24t
PnN0YXRlLmZpbGxHcmFkaWVudAorICAgICAgICA/IGdyYWRpZW50QXZlcmFnZUNvbG9yKG1fY29t
bW9uLT5zdGF0ZS5maWxsR3JhZGllbnQuZ2V0KCkpCisgICAgICAgIDogZmlsbENvbG9yKCk7CisK
KyAgICBpZiAoIWMuYWxwaGEoKSB8fCAhbV9kYXRhLT5tX29wYWNpdHkpCisgICAgICAgIHJldHVy
bjsKKworICAgIFNjb3BlRENQcm92aWRlciBkY1Byb3ZpZGVyKG1fZGF0YSk7CisgICAgaWYgKCFt
X2RhdGEtPm1fZGMpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChtX2RhdGEtPm1fb3BhY2l0
eSA8IDEuMGYgfHwgbV9kYXRhLT5oYXNBbHBoYSgpKSB7CisgICAgICAgIEhHRElPQkogYnJ1c2gg
PSBjcmVhdGVCcnVzaChjKTsKKyAgICAgICAgZm9yIChWZWN0b3I8UGF0aD46OmNvbnN0X2l0ZXJh
dG9yIGkgPSBtX2RhdGEtPm1fcGF0aHMuYmVnaW4oKTsgaSAhPSBtX2RhdGEtPm1fcGF0aHMuZW5k
KCk7ICsraSkgeworICAgICAgICAgICAgSW50UmVjdCB0clJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0
KG1fZGF0YS0+bWFwUmVjdChpLT5ib3VuZGluZ1JlY3QoKSkpOworICAgICAgICAgICAgdHJSZWN0
LmluZmxhdGUoMSk7CisgICAgICAgICAgICBUcmFuc3BhcmVudExheWVyREMgdHJhbnNwYXJlbnRE
QyhtX2RhdGEsIHRyUmVjdCk7CisgICAgICAgICAgICBIREMgZGMgPSB0cmFuc3BhcmVudERDLmhk
YygpOworICAgICAgICAgICAgaWYgKCFkYykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKwor
ICAgICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHRyID0gbV9kYXRhLT5tX3RyYW5zZm9ybTsKKyAg
ICAgICAgICAgIHRyLnRyYW5zbGF0ZSh0cmFuc3BhcmVudERDLnRvU2hpZnQoKS53aWR0aCgpLCB0
cmFuc3BhcmVudERDLnRvU2hpZnQoKS5oZWlnaHQoKSk7CisKKyAgICAgICAgICAgIFNlbGVjdE9i
amVjdChkYywgR2V0U3RvY2tPYmplY3QoTlVMTF9QRU4pKTsKKyAgICAgICAgICAgIEhHRElPQkog
b2xkQnJ1c2ggPSBTZWxlY3RPYmplY3QoZGMsIGJydXNoKTsKKyAgICAgICAgICAgIGktPnBsYXRm
b3JtUGF0aCgpLT5maWxsUGF0aChkYywgJnRyKTsKKyAgICAgICAgICAgIFNlbGVjdE9iamVjdChk
Yywgb2xkQnJ1c2gpOworICAgICAgICB9CisgICAgICAgIERlbGV0ZU9iamVjdChicnVzaCk7Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgU2VsZWN0T2JqZWN0KG1fZGF0YS0+bV9kYywgR2V0U3RvY2tP
YmplY3QoTlVMTF9QRU4pKTsKKyAgICAgICAgSEdESU9CSiBicnVzaCA9IGNyZWF0ZUJydXNoKGMp
OworICAgICAgICBIR0RJT0JKIG9sZEJydXNoID0gU2VsZWN0T2JqZWN0KG1fZGF0YS0+bV9kYywg
YnJ1c2gpOworICAgICAgICBmb3IgKFZlY3RvcjxQYXRoPjo6Y29uc3RfaXRlcmF0b3IgaSA9IG1f
ZGF0YS0+bV9wYXRocy5iZWdpbigpOyBpICE9IG1fZGF0YS0+bV9wYXRocy5lbmQoKTsgKytpKQor
ICAgICAgICAgICAgaS0+cGxhdGZvcm1QYXRoKCktPmZpbGxQYXRoKG1fZGF0YS0+bV9kYywgJm1f
ZGF0YS0+bV90cmFuc2Zvcm0pOworICAgICAgICBTZWxlY3RPYmplY3QobV9kYXRhLT5tX2RjLCBv
bGRCcnVzaCk7CisgICAgICAgIERlbGV0ZU9iamVjdChicnVzaCk7CisgICAgfQorfQorCisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0OjpzdHJva2VQYXRoKCkKK3sKKyAgICBpZiAoIW1fZGF0YS0+bV9v
cGFjaXR5KQorICAgICAgICByZXR1cm47CisKKyAgICBTY29wZURDUHJvdmlkZXIgZGNQcm92aWRl
cihtX2RhdGEpOworICAgIGlmICghbV9kYXRhLT5tX2RjKQorICAgICAgICByZXR1cm47CisKKyAg
ICBpZiAobV9kYXRhLT5tX29wYWNpdHkgPCAxLjBmIHx8IG1fZGF0YS0+aGFzQWxwaGEoKSkgewor
ICAgICAgICBIR0RJT0JKIHBlbiA9IGNyZWF0ZVBlbihzdHJva2VDb2xvcigpLCBzdHJva2VUaGlj
a25lc3MoKSwgc3Ryb2tlU3R5bGUoKSk7CisgICAgICAgIGZvciAoVmVjdG9yPFBhdGg+Ojpjb25z
dF9pdGVyYXRvciBpID0gbV9kYXRhLT5tX3BhdGhzLmJlZ2luKCk7IGkgIT0gbV9kYXRhLT5tX3Bh
dGhzLmVuZCgpOyArK2kpIHsKKyAgICAgICAgICAgIEludFJlY3QgdHJSZWN0ID0gZW5jbG9zaW5n
SW50UmVjdChtX2RhdGEtPm1hcFJlY3QoaS0+Ym91bmRpbmdSZWN0KCkpKTsKKyAgICAgICAgICAg
IHRyUmVjdC5pbmZsYXRlKDEpOworICAgICAgICAgICAgVHJhbnNwYXJlbnRMYXllckRDIHRyYW5z
cGFyZW50REMobV9kYXRhLCB0clJlY3QpOworICAgICAgICAgICAgSERDIGRjID0gdHJhbnNwYXJl
bnREQy5oZGMoKTsKKyAgICAgICAgICAgIGlmICghZGMpCisgICAgICAgICAgICAgICAgY29udGlu
dWU7CisKKyAgICAgICAgICAgIEFmZmluZVRyYW5zZm9ybSB0ciA9IG1fZGF0YS0+bV90cmFuc2Zv
cm07CisgICAgICAgICAgICB0ci50cmFuc2xhdGUodHJhbnNwYXJlbnREQy50b1NoaWZ0KCkud2lk
dGgoKSwgdHJhbnNwYXJlbnREQy50b1NoaWZ0KCkuaGVpZ2h0KCkpOworCisgICAgICAgICAgICBT
ZWxlY3RPYmplY3QoZGMsIEdldFN0b2NrT2JqZWN0KE5VTExfQlJVU0gpKTsKKyAgICAgICAgICAg
IEhHRElPQkogb2xkUGVuID0gU2VsZWN0T2JqZWN0KGRjLCBwZW4pOworICAgICAgICAgICAgaS0+
cGxhdGZvcm1QYXRoKCktPnN0cm9rZVBhdGgoZGMsICZ0cik7CisgICAgICAgICAgICBTZWxlY3RP
YmplY3QoZGMsIG9sZFBlbik7CisgICAgICAgIH0KKyAgICAgICAgRGVsZXRlT2JqZWN0KHBlbik7
CisgICAgfSBlbHNlIHsKKyAgICAgICAgU2VsZWN0T2JqZWN0KG1fZGF0YS0+bV9kYywgR2V0U3Rv
Y2tPYmplY3QoTlVMTF9CUlVTSCkpOworICAgICAgICBIR0RJT0JKIHBlbiA9IGNyZWF0ZVBlbihz
dHJva2VDb2xvcigpLCBzdHJva2VUaGlja25lc3MoKSwgc3Ryb2tlU3R5bGUoKSk7CisgICAgICAg
IEhHRElPQkogb2xkUGVuID0gU2VsZWN0T2JqZWN0KG1fZGF0YS0+bV9kYywgcGVuKTsKKyAgICAg
ICAgZm9yIChWZWN0b3I8UGF0aD46OmNvbnN0X2l0ZXJhdG9yIGkgPSBtX2RhdGEtPm1fcGF0aHMu
YmVnaW4oKTsgaSAhPSBtX2RhdGEtPm1fcGF0aHMuZW5kKCk7ICsraSkKKyAgICAgICAgICAgIGkt
PnBsYXRmb3JtUGF0aCgpLT5zdHJva2VQYXRoKG1fZGF0YS0+bV9kYywgJm1fZGF0YS0+bV90cmFu
c2Zvcm0pOworICAgICAgICBTZWxlY3RPYmplY3QobV9kYXRhLT5tX2RjLCBvbGRQZW4pOworICAg
ICAgICBEZWxldGVPYmplY3QocGVuKTsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
OjpmaWxsUmVjdChjb25zdCBGbG9hdFJlY3QmIHIsIGNvbnN0IEdyYWRpZW50KiBncmFkaWVudCkK
K3sKKyAgICBpZiAoIW1fZGF0YS0+bV9vcGFjaXR5KQorICAgICAgICByZXR1cm47CisKKyAgICBj
b25zdCBWZWN0b3I8R3JhZGllbnQ6OkNvbG9yU3RvcD4mIHN0b3BzID0gZ3JhZGllbnQtPmdldFN0
b3BzKCk7CisgICAgaWYgKHN0b3BzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
c2l6ZV90IG51bVN0b3BzID0gc3RvcHMuc2l6ZSgpOworICAgIGlmIChudW1TdG9wcyA9PSAxKSB7
CisgICAgICAgIGNvbnN0IEdyYWRpZW50OjpDb2xvclN0b3AmIHN0b3AgPSBzdG9wcy5maXJzdCgp
OworICAgICAgICBDb2xvciBjb2xvcihzdG9wLnJlZCwgc3RvcC5ncmVlbiwgc3RvcC5ibHVlLCBz
dG9wLmFscGhhKTsKKyAgICAgICAgZmlsbFJlY3QociwgY29sb3IsIERldmljZUNvbG9yU3BhY2Up
OworICAgICAgICByZXR1cm47CisgICAgfSAKKyAgICAKKyAgICBTY29wZURDUHJvdmlkZXIgZGNQ
cm92aWRlcihtX2RhdGEpOworICAgIGlmICghbV9kYXRhLT5tX2RjKQorICAgICAgICByZXR1cm47
CisKKyAgICBJbnRSZWN0IGludFJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KHIpOworICAgIEludFJl
Y3QgcmVjdCA9IG1fZGF0YS0+bWFwUmVjdChpbnRSZWN0KTsKKyAgICBUcmFuc3BhcmVudExheWVy
REMgdHJhbnNwYXJlbnREQyhtX2RhdGEsIHJlY3QsICZpbnRSZWN0LCAyNTUsIHRydWUpOworICAg
IEhEQyBkYyA9IHRyYW5zcGFyZW50REMuaGRjKCk7CisgICAgaWYgKCFkYykKKyAgICAgICAgcmV0
dXJuOworCisgICAgcmVjdC5tb3ZlKHRyYW5zcGFyZW50REMudG9TaGlmdCgpKTsKKyAgICBGbG9h
dFBvaW50IGZwMCA9IG1fZGF0YS0+bWFwUG9pbnQoZ3JhZGllbnQtPnAwKCkpOworICAgIEZsb2F0
UG9pbnQgZnAxID0gbV9kYXRhLT5tYXBQb2ludChncmFkaWVudC0+cDEoKSk7CisgICAgSW50UG9p
bnQgcDAoc3RhYmxlUm91bmQoZnAwLngoKSksIHN0YWJsZVJvdW5kKGZwMC55KCkpKTsKKyAgICBJ
bnRQb2ludCBwMShzdGFibGVSb3VuZChmcDEueCgpKSwgc3RhYmxlUm91bmQoZnAxLnkoKSkpOwor
ICAgIHAwICs9IHRyYW5zcGFyZW50REMudG9TaGlmdCgpOworICAgIHAxICs9IHRyYW5zcGFyZW50
REMudG9TaGlmdCgpOworCisgICAgaWYgKGdyYWRpZW50LT5pc1JhZGlhbCgpKSB7CisgICAgICAg
IGlmIChnX3JhZGlhbEdyYWRpZW50RmlsbGVyKSB7CisgICAgICAgICAgICAvLyBGSVhNRTogZG9u
J3Qgc3VwcG9ydCAyRCBzY2FsaW5nIGF0IHRoaXMgdGltZQorICAgICAgICAgICAgZG91YmxlIHNj
YWxlID0gKG1fZGF0YS0+bV90cmFuc2Zvcm0uYSgpICsgbV9kYXRhLT5tX3RyYW5zZm9ybS5kKCkp
ICogMC41OworICAgICAgICAgICAgZmxvYXQgcjAgPSBncmFkaWVudC0+cjAoKSAqIHNjYWxlOwor
ICAgICAgICAgICAgZmxvYXQgcjEgPSBncmFkaWVudC0+cjEoKSAqIHNjYWxlOworICAgICAgICAg
ICAgZ19yYWRpYWxHcmFkaWVudEZpbGxlcihkYywgcmVjdCwgcDAsIHAxLCByMCwgcjEsIGdyYWRp
ZW50LT5nZXRTdG9wcygpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0g
ZWxzZSBpZiAoZ19saW5lYXJHcmFkaWVudEZpbGxlcikgeworICAgICAgICBnX2xpbmVhckdyYWRp
ZW50RmlsbGVyKGRjLCByZWN0LCBwMCwgcDEsIGdyYWRpZW50LT5nZXRTdG9wcygpKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFNpbXBsZSAxRCBsaW5lYXIgc29sdXRpb24gdGhh
dCBhc3N1bWVzIHAwIGlzIG9uIHRoZSB0b3Agb3IgbGVmdCBzaWRlLCBhbmQgcDEgaXMgb24gdGhl
IHJpZ2h0IG9yIGJvdHRvbSBzaWRlCisgICAgc2l6ZV90IG51bVJlY3RzID0gKG51bVN0b3BzIC0g
MSk7CisgICAgVmVjdG9yPFRSSVZFUlRFWCwgMjA+IHR2OworICAgIHR2LnJlc2l6ZShudW1SZWN0
cyAqIDIpOworICAgIFZlY3RvcjxHUkFESUVOVF9SRUNULCAxMD4gbWVzaDsKKyAgICBtZXNoLnJl
c2l6ZShudW1SZWN0cyk7CisgICAgaW50IHggPSByZWN0LngoKTsKKyAgICBpbnQgeSA9IHJlY3Qu
eSgpOworICAgIGludCB3aWR0aCA9IHJlY3Qud2lkdGgoKTsKKyAgICBpbnQgaGVpZ2h0ID0gcmVj
dC5oZWlnaHQoKTsKKyAgICBGbG9hdFNpemUgZCA9IGdyYWRpZW50LT5wMSgpIC0gZ3JhZGllbnQt
PnAwKCk7CisgICAgYm9vbCB2ZXJ0aWNhbCA9IGFicyhkLmhlaWdodCgpKSA+IGFicyhkLndpZHRo
KCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3RvcHM7ICsraSkgeworICAgICAg
ICBjb25zdCBHcmFkaWVudDo6Q29sb3JTdG9wJiBzdG9wID0gc3RvcHNbaV07CisgICAgICAgIGlu
dCBpVHYgPSBpID8gMiAqIGkgLSAxIDogMDsKKyAgICAgICAgdHZbaVR2XS5SZWQgPSBzdG9wLnJl
ZCAqIDB4RkZGRjsKKyAgICAgICAgdHZbaVR2XS5HcmVlbiA9IHN0b3AuZ3JlZW4gKiAweEZGRkY7
CisgICAgICAgIHR2W2lUdl0uQmx1ZSA9IHN0b3AuYmx1ZSAqIDB4RkZGRjsKKyAgICAgICAgdHZb
aVR2XS5BbHBoYSA9IHN0b3AuYWxwaGEgKiAweEZGRkY7CisgICAgICAgIGlmIChpKSB7CisgICAg
ICAgICAgICB0dltpVHZdLnggPSB2ZXJ0aWNhbCA/IHggKyB3aWR0aDogeCArIHdpZHRoICogc3Rv
cC5zdG9wOworICAgICAgICAgICAgdHZbaVR2XS55ID0gdmVydGljYWwgPyB5ICsgaGVpZ2h0ICog
c3RvcC5zdG9wIDogeSArIGhlaWdodDsKKyAgICAgICAgICAgIG1lc2hbaSAtIDFdLlVwcGVyTGVm
dCA9IGlUdiAtIDE7CisgICAgICAgICAgICBtZXNoW2kgLSAxXS5Mb3dlclJpZ2h0ID0gaVR2Owor
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHZbaVR2XS54ID0geDsKKyAgICAgICAgICAg
IHR2W2lUdl0ueSA9IHk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaSAmJiBpIDwgbnVtUmVj
dHMpIHsKKyAgICAgICAgICAgIHR2W2lUdiArIDFdID0gdHZbaVR2XTsKKyAgICAgICAgICAgIGlm
ICh2ZXJ0aWNhbCkKKyAgICAgICAgICAgICAgICB0dltpVHYgKyAxXS54ID0geDsKKyAgICAgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0dltpVHYgKyAxXS55ID0geTsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIEdyYWRpZW50RmlsbChkYywgdHYuZGF0YSgpLCB0di5zaXplKCksIG1lc2gu
ZGF0YSgpLCBtZXNoLnNpemUoKSwgdmVydGljYWwgPyBHUkFESUVOVF9GSUxMX1JFQ1RfViA6IEdS
QURJRU5UX0ZJTExfUkVDVF9IKTsKK30KKworQWZmaW5lVHJhbnNmb3JtIEdyYXBoaWNzQ29udGV4
dDo6Z2V0Q1RNKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9kYXRhLT5tX3RyYW5zZm9ybTsKK30K
Kwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBUb0ltYWdlQnVmZmVyKGNvbnN0IEZsb2F0UmVj
dCYsIGNvbnN0IEltYWdlQnVmZmVyKikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KQorewor
ICAgIGlmIChtX2NvbW1vbi0+c3RhdGUuZmlsbEdyYWRpZW50KQorICAgICAgICBmaWxsUmVjdChy
ZWN0LCBtX2NvbW1vbi0+c3RhdGUuZmlsbEdyYWRpZW50LmdldCgpKTsKKyAgICBlbHNlCisgICAg
ICAgIGZpbGxSZWN0KHJlY3QsIGZpbGxDb2xvcigpLCBEZXZpY2VDb2xvclNwYWNlKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtU2hhZG93KGNvbnN0IEludFNpemUmLCBp
bnQsIGNvbnN0IENvbG9yJiwgQ29sb3JTcGFjZSkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOwor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xlYXJQbGF0Zm9ybVNoYWRvdygpCit7CisgICAg
bm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldEltYWdlSW50
ZXJwb2xhdGlvblF1YWxpdHkoSW50ZXJwb2xhdGlvblF1YWxpdHkpCit7CisgICAgbm90SW1wbGVt
ZW50ZWQoKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzQ2hhclZpc2libGUoVUNoYXIgYykK
K3sKKyAgICByZXR1cm4gYyAmJiBjICE9IHplcm9XaWR0aFNwYWNlOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDo6ZHJhd1RleHQoY29uc3QgRm9udCYgZm9udCwgY29uc3QgVGV4dFJ1biYgcnVu
LCBjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCBmcm9tLCBpbnQgdG8pCit7CisgICAgaWYgKHBh
aW50aW5nRGlzYWJsZWQoKSB8fCAhZmlsbENvbG9yKCkuYWxwaGEoKSB8fCAhbV9kYXRhLT5tX29w
YWNpdHkpCisgICAgICAgIHJldHVybjsKKworICAgIGJvb2wgbXVzdFN1cHBvcnRBbHBoYSA9IG1f
ZGF0YS0+aGFzQWxwaGEoKTsKKworICAgIGlmICghbXVzdFN1cHBvcnRBbHBoYSAmJiBmaWxsQ29s
b3IoKS5hbHBoYSgpID09IDB4RkYgJiYgbV9kYXRhLT5tX29wYWNpdHkgPj0gMS4wKSB7CisgICAg
ICAgIGZvbnQuZHJhd1RleHQodGhpcywgcnVuLCBwb2ludCwgZnJvbSwgdG8pOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgZmxvYXQgb2xkT3BhY2l0eSA9IG1fZGF0YS0+bV9vcGFjaXR5
OworICAgIG1fZGF0YS0+bV9vcGFjaXR5ICo9IGZpbGxDb2xvcigpLmFscGhhKCkgLyAyNTUuMDsK
KworICAgIEZsb2F0UmVjdCB0ZXh0UmVjdCA9IGZvbnQuc2VsZWN0aW9uUmVjdEZvclRleHQocnVu
LCBwb2ludCwgZm9udC5oZWlnaHQoKSwgZnJvbSwgdG8pOworICAgIHRleHRSZWN0LnNldFkodGV4
dFJlY3QueSgpIC0gZm9udC5hc2NlbnQoKSk7CisgICAgSW50UmVjdCB0clJlY3QgPSBlbmNsb3Np
bmdJbnRSZWN0KG1fZGF0YS0+bWFwUmVjdCh0ZXh0UmVjdCkpOworICAgIFJFQ1QgYm1wUmVjdDsK
KyAgICBBbHBoYVBhaW50VHlwZSBhbHBoYVBhaW50VHlwZSA9IG11c3RTdXBwb3J0QWxwaGEgPyBB
bHBoYVBhaW50T3RoZXIgOiBBbHBoYVBhaW50Tm9uZTsKKyAgICBpZiAoUmVmUHRyPFNoYXJlZEJp
dG1hcD4gYm1wID0gbV9kYXRhLT5nZXRUcmFuc3BhcmVudExheWVyQml0bWFwKHRyUmVjdCwgYWxw
aGFQYWludFR5cGUsIGJtcFJlY3QsIHRydWUsIG11c3RTdXBwb3J0QWxwaGEpKSB7CisgICAgICAg
IHsKKyAgICAgICAgICAgIEdyYXBoaWNzQ29udGV4dCBnYygwKTsKKyAgICAgICAgICAgIGdjLnNl
dEJpdG1hcChibXApOworICAgICAgICAgICAgZ2Muc2NhbGUoRmxvYXRTaXplKG1fZGF0YS0+bV90
cmFuc2Zvcm0uYSgpLCBtX2RhdGEtPm1fdHJhbnNmb3JtLmQoKSkpOworICAgICAgICAgICAgZm9u
dC5kcmF3VGV4dCgmZ2MsIHJ1biwgSW50UG9pbnQoMCwgZm9udC5hc2NlbnQoKSksIGZyb20sIHRv
KTsKKyAgICAgICAgfQorICAgICAgICB1bnNpZ25lZCBrZXkxLCBrZXkyOworICAgICAgICBIREMg
bWVtREMgPSBibXAtPmdldERDKCZrZXkxLCAma2V5Mik7CisgICAgICAgIGlmIChtZW1EQykgewor
ICAgICAgICAgICAgbV9kYXRhLT5wYWludEJhY2tUcmFuc3BhcmVudExheWVyQml0bWFwKG1lbURD
LCBibXAuZ2V0KCksIHRyUmVjdCwgYWxwaGFQYWludFR5cGUsIGJtcFJlY3QpOworICAgICAgICAg
ICAgYm1wLT5yZWxlYXNlREMobWVtREMsIGtleTEsIGtleTIpOworICAgICAgICB9CisgICAgfQor
CisgICAgbV9kYXRhLT5tX29wYWNpdHkgPSBvbGRPcGFjaXR5OworfQorCit2b2lkIEdyYXBoaWNz
Q29udGV4dDo6ZHJhd1RleHQoY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnREYXRhLCBjb25zdCBH
bHlwaEJ1ZmZlciYgZ2x5cGhCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGZyb20s
IGludCBudW1HbHlwaHMsIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KQoreworICAgIGlmICghbV9k
YXRhLT5tX29wYWNpdHkpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAoOzspIHsKKyAgICAg
ICAgaWYgKCFudW1HbHlwaHMpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChpc0No
YXJWaXNpYmxlKCpnbHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSkpKQorICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICsrZnJvbTsKKyAgICAgICAgLS1udW1HbHlwaHM7CisgICAgfQorCisgICAgZG91
YmxlIHNjYWxlWCA9IG1fZGF0YS0+bV90cmFuc2Zvcm0uYSgpOworICAgIGRvdWJsZSBzY2FsZVkg
PSBtX2RhdGEtPm1fdHJhbnNmb3JtLmQoKTsKKworICAgIGludCBoZWlnaHQgPSBmb250RGF0YS0+
cGxhdGZvcm1EYXRhKCkuc2l6ZSgpICogc2NhbGVZOworICAgIGludCB3aWR0aCA9IGZvbnREYXRh
LT5wbGF0Zm9ybURhdGEoKS5hdmVyYWdlQ2hhcldpZHRoKCkgKiBzY2FsZVg7CisKKyAgICBpZiAo
IWhlaWdodCB8fCAhd2lkdGgpCisgICAgICAgIHJldHVybjsKKworICAgIFNjb3BlRENQcm92aWRl
ciBkY1Byb3ZpZGVyKG1fZGF0YSk7CisgICAgaWYgKCFtX2RhdGEtPm1fZGMpCisgICAgICAgIHJl
dHVybjsKKworICAgIEhGT05UIGhGb250ID0gaGVpZ2h0ID4gMQorICAgICAgICA/IGZvbnREYXRh
LT5wbGF0Zm9ybURhdGEoKS5nZXRTY2FsZWRGb250SGFuZGxlKGhlaWdodCwgc2NhbGVYID09IHNj
YWxlWSA/IDAgOiB3aWR0aCkKKyAgICAgICAgOiAwOworCisgICAgRmxvYXRQb2ludCBzdGFydFBv
aW50KHBvaW50LngoKSwgcG9pbnQueSgpIC0gZm9udERhdGEtPmFzY2VudCgpKTsKKyAgICBGbG9h
dFBvaW50IHRyUG9pbnQgPSBtX2RhdGEtPm1hcFBvaW50KHN0YXJ0UG9pbnQpOworICAgIGludCB5
ID0gc3RhYmxlUm91bmQodHJQb2ludC55KCkpOworCisgICAgQ29sb3IgY29sb3IgPSBmaWxsQ29s
b3IoKTsKKyAgICBpZiAoIWNvbG9yLmFscGhhKCkpCisgICAgICAgIHJldHVybjsKKworICAgIENP
TE9SUkVGIGZvbnRDb2xvciA9IFJHQihjb2xvci5yZWQoKSwgY29sb3IuZ3JlZW4oKSwgY29sb3Iu
Ymx1ZSgpKTsKKworICAgIGlmICghaEZvbnQpIHsKKyAgICAgICAgZG91YmxlIG9mZnNldCA9IHRy
UG9pbnQueCgpOworICAgICAgICBjb25zdCBHbHlwaEJ1ZmZlckFkdmFuY2UqIGFkdmFuY2UgPSBn
bHlwaEJ1ZmZlci5hZHZhbmNlcyhmcm9tKTsKKyAgICAgICAgaWYgKHNjYWxlWCA9PSAxLikKKyAg
ICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbnVtR2x5cGhzOyArK2kpCisgICAgICAgICAg
ICAgICAgb2Zmc2V0ICs9ICphZHZhbmNlKys7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZv
ciAoaW50IGkgPSAxOyBpIDwgbnVtR2x5cGhzOyArK2kpCisgICAgICAgICAgICAgICAgb2Zmc2V0
ICs9ICphZHZhbmNlKysgKiBzY2FsZVg7CisKKyAgICAgICAgb2Zmc2V0ICs9IHdpZHRoOworCisg
ICAgICAgIE93blB0cjxIUEVOPiBoUGVuKENyZWF0ZVBlbihQU19EQVNILCAxLCBmb250Q29sb3Ip
KTsKKyAgICAgICAgSEdESU9CSiBvbGRQZW4gPSBTZWxlY3RPYmplY3QobV9kYXRhLT5tX2RjLCBo
UGVuLmdldCgpKTsKKworICAgICAgICBNb3ZlVG9FeChtX2RhdGEtPm1fZGMsIHN0YWJsZVJvdW5k
KHRyUG9pbnQueCgpKSwgeSwgMCk7CisgICAgICAgIExpbmVUbyhtX2RhdGEtPm1fZGMsIHN0YWJs
ZVJvdW5kKG9mZnNldCksIHkpOworCisgICAgICAgIFNlbGVjdE9iamVjdChtX2RhdGEtPm1fZGMs
IG9sZFBlbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBJbnRTaXplIHNoYWRvd1Np
emU7CisgICAgaW50IHNoYWRvd0JsdXIgPSAwOworICAgIENvbG9yIHNoYWRvd0NvbG9yOworICAg
IGJvb2wgaGFzU2hhZG93ID0gdGV4dERyYXdpbmdNb2RlKCkgPT0gY1RleHRGaWxsCisgICAgICAg
ICYmIGdldFNoYWRvdyhzaGFkb3dTaXplLCBzaGFkb3dCbHVyLCBzaGFkb3dDb2xvcikKKyAgICAg
ICAgJiYgc2hhZG93Q29sb3IuYWxwaGEoKTsKKyAgICBDT0xPUlJFRiBzaGFkb3dSR0JDb2xvcjsK
KyAgICBGbG9hdFBvaW50IHRyU2hhZG93UG9pbnQ7CisgICAgaWYgKGhhc1NoYWRvdykgeworICAg
ICAgICBzaGFkb3dSR0JDb2xvciA9IFJHQihzaGFkb3dDb2xvci5yZWQoKSwgc2hhZG93Q29sb3Iu
Z3JlZW4oKSwgc2hhZG93Q29sb3IuYmx1ZSgpKTsKKyAgICAgICAgdHJTaGFkb3dQb2ludCA9IG1f
ZGF0YS0+bWFwUG9pbnQoc3RhcnRQb2ludCArIHNoYWRvd1NpemUpOworICAgIH0KKworICAgIEhH
RElPQkogaE9sZEZvbnQgPSBTZWxlY3RPYmplY3QobV9kYXRhLT5tX2RjLCBoRm9udCk7CisgICAg
Q09MT1JSRUYgb2xkVGV4dENvbG9yID0gR2V0VGV4dENvbG9yKG1fZGF0YS0+bV9kYyk7CisgICAg
aW50IG9sZFRleHRBbGlnbiA9IEdldFRleHRBbGlnbihtX2RhdGEtPm1fZGMpOworICAgIFNldFRl
eHRBbGlnbihtX2RhdGEtPm1fZGMsIDApOworCisgICAgaW50IG9sZEJrTW9kZSA9IEdldEJrTW9k
ZShtX2RhdGEtPm1fZGMpOworICAgIFNldEJrTW9kZShtX2RhdGEtPm1fZGMsIFRSQU5TUEFSRU5U
KTsKKworICAgIGlmIChudW1HbHlwaHMgPiAxKSB7CisgICAgICAgIGRvdWJsZSBvZmZzZXQgPSB0
clBvaW50LngoKTsKKyAgICAgICAgVmVjdG9yPGludCwgMjU2PiBnbHlwaFNwYWNlKG51bUdseXBo
cyk7CisgICAgICAgIFZlY3RvcjxVQ2hhciwgMjU2PiB0ZXh0KG51bUdseXBocyk7CisgICAgICAg
IGludCogY3VyU3BhY2UgPSBnbHlwaFNwYWNlLmRhdGEoKTsKKyAgICAgICAgVUNoYXIqIGN1ckNo
YXIgPSB0ZXh0LmRhdGEoKTsKKyAgICAgICAgY29uc3QgVUNoYXIqIHNyY0NoYXIgPSBnbHlwaEJ1
ZmZlci5nbHlwaHMoZnJvbSk7CisgICAgICAgIGNvbnN0IFVDaGFyKiBjb25zdCBzcmNDaGFyRW5k
ID0gc3JjQ2hhciArIG51bUdseXBoczsKKyAgICAgICAgKmN1ckNoYXIrKyA9ICpzcmNDaGFyKys7
CisgICAgICAgIGludCBmaXJzdE9mZnNldCA9IHN0YWJsZVJvdW5kKG9mZnNldCk7CisgICAgICAg
IGludCBsYXN0T2Zmc2V0ID0gZmlyc3RPZmZzZXQ7CisgICAgICAgIGNvbnN0IEdseXBoQnVmZmVy
QWR2YW5jZSogYWR2YW5jZSA9IGdseXBoQnVmZmVyLmFkdmFuY2VzKGZyb20pOworICAgICAgICAv
LyBGSVhNRTogRXh0VGV4dE91dCgpIGNhbiBmbGlwIG92ZXIgZWFjaCB3b3JkIGZvciBSVEwgbGFu
Z3VhZ2VzLCBldmVuIHdoZW4gVEFfUlRMUkVBRElORyBpcyBvZmYuCisgICAgICAgIC8vICh0aGlz
IGNhbiBiZSBHREkgYnVnIG9yIGZvbnQgZHJpdmVyIGJ1Zz8pCisgICAgICAgIC8vIFdlIGFyZSBu
b3QgY2xlYXIgaG93IGl0IHByb2Nlc3NlcyBjaGFyYWN0ZXJzIGFuZCBoYW5kbGVzIHNwZWNpZmll
ZCBzcGFjZXMuIE9uIHRoZSBvdGhlciBzaWRlLAorICAgICAgICAvLyBvdXIgZ2x5cGggYnVmZmVy
IGlzIGFscmVhZHkgaW4gdGhlIGNvcnJlY3Qgb3JkZXIgZm9yIHJlbmRlcmluZy4gU28sIHRoZSBz
b2x1dGlvbiBpcyB0aGF0IHdlCisgICAgICAgIC8vIGNhbGwgRXh0VGV4dE91dCgpIGZvciBlYWNo
IHNpbmdsZSBjaGFyYWN0ZXIgd2hlbiB0aGUgdGV4dCBjb250YWlucyBhbnkgUlRMIGNoYXJhY3Rl
ci4KKyAgICAgICAgLy8gVGhpcyBzb2x1dGlvbiBpcyBub3QgcGVyZmVjdCBhcyBpdCBpcyBzbG93
ZXIgdGhhbiBjYWxsaW5nIEV4dFRleHRPdXQoKSBvbmUgdGltZSBmb3IgYWxsIGNoYXJhY3RlcnMu
CisgICAgICAgIC8vIERyYXdpbmcgY2hhcmFjdGVycyBvbmUgYnkgb25lIG1heSBiZSB0b28gc2xv
dy4KKyAgICAgICAgYm9vbCBkcmF3T25lQnlPbmUgPSBmYWxzZTsKKyAgICAgICAgaWYgKHNjYWxl
WCA9PSAxLikgeworICAgICAgICAgICAgZm9yICg7IHNyY0NoYXIgPCBzcmNDaGFyRW5kOyArK3Ny
Y0NoYXIpIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gKmFkdmFuY2UrKzsKKyAgICAgICAg
ICAgICAgICBpbnQgb2Zmc2V0SW50ID0gc3RhYmxlUm91bmQob2Zmc2V0KTsKKyAgICAgICAgICAg
ICAgICBpZiAoaXNDaGFyVmlzaWJsZSgqc3JjQ2hhcikpIHsKKyAgICAgICAgICAgICAgICAgICAg
aWYgKCFkcmF3T25lQnlPbmUgJiYgV1RGOjpVbmljb2RlOjpkaXJlY3Rpb24oKnNyY0NoYXIpID09
IFdURjo6VW5pY29kZTo6UmlnaHRUb0xlZnQpCisgICAgICAgICAgICAgICAgICAgICAgICBkcmF3
T25lQnlPbmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAqY3VyQ2hhcisrID0gKnNyY0No
YXI7CisgICAgICAgICAgICAgICAgICAgICpjdXJTcGFjZSsrID0gb2Zmc2V0SW50IC0gbGFzdE9m
ZnNldDsKKyAgICAgICAgICAgICAgICAgICAgbGFzdE9mZnNldCA9IG9mZnNldEludDsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICBmb3IgKDsgc3JjQ2hhciA8IHNyY0NoYXJFbmQ7ICsrc3JjQ2hhcikgeworICAgICAgICAgICAg
ICAgIG9mZnNldCArPSAqYWR2YW5jZSsrICogc2NhbGVYOworICAgICAgICAgICAgICAgIGludCBv
ZmZzZXRJbnQgPSBzdGFibGVSb3VuZChvZmZzZXQpOworICAgICAgICAgICAgICAgIGlmIChpc0No
YXJWaXNpYmxlKCpzcmNDaGFyKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWRyYXdPbmVC
eU9uZSAmJiBXVEY6OlVuaWNvZGU6OmRpcmVjdGlvbigqc3JjQ2hhcikgPT0gV1RGOjpVbmljb2Rl
OjpSaWdodFRvTGVmdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdPbmVCeU9uZSA9IHRy
dWU7CisgICAgICAgICAgICAgICAgICAgICpjdXJDaGFyKysgPSAqc3JjQ2hhcjsKKyAgICAgICAg
ICAgICAgICAgICAgKmN1clNwYWNlKysgPSBvZmZzZXRJbnQgLSBsYXN0T2Zmc2V0OworICAgICAg
ICAgICAgICAgICAgICBsYXN0T2Zmc2V0ID0gb2Zmc2V0SW50OworICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBudW1HbHlwaHMgPSBjdXJDaGFyIC0g
dGV4dC5kYXRhKCk7CisgICAgICAgIGlmIChoYXNTaGFkb3cpIHsKKyAgICAgICAgICAgIFNldFRl
eHRDb2xvcihtX2RhdGEtPm1fZGMsIHNoYWRvd1JHQkNvbG9yKTsKKyAgICAgICAgICAgIGlmIChk
cmF3T25lQnlPbmUpIHsKKyAgICAgICAgICAgICAgICBpbnQgeFNoYWRvdyA9IGZpcnN0T2Zmc2V0
ICsgc3RhYmxlUm91bmQodHJTaGFkb3dQb2ludC54KCkgLSB0clBvaW50LngoKSk7CisgICAgICAg
ICAgICAgICAgaW50IHlTaGFkb3cgPSBzdGFibGVSb3VuZCh0clNoYWRvd1BvaW50LnkoKSk7Cisg
ICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1HbHlwaHM7ICsraSkgeworICAg
ICAgICAgICAgICAgICAgICBFeHRUZXh0T3V0KG1fZGF0YS0+bV9kYywgeFNoYWRvdywgeVNoYWRv
dywgMCwgTlVMTCwgdGV4dC5kYXRhKCkgKyBpLCAxLCAwKTsKKyAgICAgICAgICAgICAgICAgICAg
eFNoYWRvdyArPSBnbHlwaFNwYWNlW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IH0gZWxzZQorICAgICAgICAgICAgICAgIEV4dFRleHRPdXQobV9kYXRhLT5tX2RjLCBmaXJzdE9m
ZnNldCArIHN0YWJsZVJvdW5kKHRyU2hhZG93UG9pbnQueCgpIC0gdHJQb2ludC54KCkpLCBzdGFi
bGVSb3VuZCh0clNoYWRvd1BvaW50LnkoKSksIDAsIE5VTEwsIHRleHQuZGF0YSgpLCBudW1HbHlw
aHMsIGdseXBoU3BhY2UuZGF0YSgpKTsKKyAgICAgICAgfQorICAgICAgICBTZXRUZXh0Q29sb3Io
bV9kYXRhLT5tX2RjLCBmb250Q29sb3IpOworICAgICAgICBpZiAoZHJhd09uZUJ5T25lKSB7Cisg
ICAgICAgICAgICBpbnQgeCA9IGZpcnN0T2Zmc2V0OworICAgICAgICAgICAgZm9yIChpbnQgaSA9
IDA7IGkgPCBudW1HbHlwaHM7ICsraSkgeworICAgICAgICAgICAgICAgIEV4dFRleHRPdXQobV9k
YXRhLT5tX2RjLCB4LCB5LCAwLCBOVUxMLCB0ZXh0LmRhdGEoKSArIGksIDEsIDApOworICAgICAg
ICAgICAgICAgIHggKz0gZ2x5cGhTcGFjZVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBl
bHNlCisgICAgICAgICAgICBFeHRUZXh0T3V0KG1fZGF0YS0+bV9kYywgZmlyc3RPZmZzZXQsIHks
IDAsIE5VTEwsIHRleHQuZGF0YSgpLCBudW1HbHlwaHMsIGdseXBoU3BhY2UuZGF0YSgpKTsKKyAg
ICB9IGVsc2UgeworICAgICAgICBVQ2hhciBjID0gKmdseXBoQnVmZmVyLmdseXBocyhmcm9tKTsK
KyAgICAgICAgaWYgKGhhc1NoYWRvdykgeworICAgICAgICAgICAgU2V0VGV4dENvbG9yKG1fZGF0
YS0+bV9kYywgc2hhZG93UkdCQ29sb3IpOworICAgICAgICAgICAgRXh0VGV4dE91dChtX2RhdGEt
Pm1fZGMsIHN0YWJsZVJvdW5kKHRyU2hhZG93UG9pbnQueCgpKSwgc3RhYmxlUm91bmQodHJTaGFk
b3dQb2ludC55KCkpLCAwLCBOVUxMLCAmYywgMSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgU2V0
VGV4dENvbG9yKG1fZGF0YS0+bV9kYywgZm9udENvbG9yKTsKKyAgICAgICAgRXh0VGV4dE91dCht
X2RhdGEtPm1fZGMsIHN0YWJsZVJvdW5kKHRyUG9pbnQueCgpKSwgeSwgMCwgTlVMTCwgJmMsIDEs
IDApOworICAgIH0KKworICAgIFNldFRleHRBbGlnbihtX2RhdGEtPm1fZGMsIG9sZFRleHRBbGln
bik7CisgICAgU2V0VGV4dENvbG9yKG1fZGF0YS0+bV9kYywgb2xkVGV4dENvbG9yKTsKKyAgICBT
ZXRCa01vZGUobV9kYXRhLT5tX2RjLCBvbGRCa01vZGUpOworICAgIFNlbGVjdE9iamVjdChtX2Rh
dGEtPm1fZGMsIGhPbGRGb250KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdGcmFt
ZUNvbnRyb2woY29uc3QgSW50UmVjdCYgcmVjdCwgdW5zaWduZWQgdHlwZSwgdW5zaWduZWQgc3Rh
dGUpCit7CisgICAgaWYgKCFtX2RhdGEtPm1fb3BhY2l0eSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgY29uc3QgaW50IGJveFdpZHRoQmVzdCA9IDg7CisgICAgY29uc3QgaW50IGJveEhlaWdodEJl
c3QgPSA4OworCisgICAgU2NvcGVEQ1Byb3ZpZGVyIGRjUHJvdmlkZXIobV9kYXRhKTsKKyAgICBp
ZiAoIW1fZGF0YS0+bV9kYykKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50UmVjdCB0clJlY3Qg
PSBtX2RhdGEtPm1hcFJlY3QocmVjdCk7CisgICAgVHJhbnNwYXJlbnRMYXllckRDIHRyYW5zcGFy
ZW50REMobV9kYXRhLCB0clJlY3QsICZyZWN0LCAyNTUsIHRydWUpOworICAgIEhEQyBkYyA9IHRy
YW5zcGFyZW50REMuaGRjKCk7CisgICAgaWYgKCFkYykKKyAgICAgICAgcmV0dXJuOworICAgIHRy
UmVjdC5tb3ZlKHRyYW5zcGFyZW50REMudG9TaGlmdCgpKTsKKworICAgIFJFQ1QgcmVjdFdpbiA9
IHRyUmVjdDsKKworICAgIGlmICgocmVjdFdpbi5yaWdodCAtIHJlY3RXaW4ubGVmdCkgPCBib3hX
aWR0aEJlc3QpIHsKKyAgICAgICAgUmVmUHRyPFNoYXJlZEJpdG1hcD4gYm1wID0gU2hhcmVkQml0
bWFwOjpjcmVhdGVJbnN0YW5jZSh0cnVlLCBib3hXaWR0aEJlc3QsIGJveEhlaWdodEJlc3QsIHRy
dWUpOworICAgICAgICBTaGFyZWRCaXRtYXA6OkRDSG9sZGVyIG1lbURDKGJtcC5nZXQoKSk7Cisg
ICAgICAgIGlmIChtZW1EQy5nZXQoKSkgeworICAgICAgICAgICAgUkVDVCB0ZW1wUmVjdCA9IHsw
LCAwLCBib3hXaWR0aEJlc3QsIGJveEhlaWdodEJlc3R9OworICAgICAgICAgICAgRHJhd0ZyYW1l
Q29udHJvbChtZW1EQy5nZXQoKSwgJnRlbXBSZWN0LCB0eXBlLCBzdGF0ZSk7CisKKyAgICAgICAg
ICAgIDo6U3RyZXRjaEJsdChkYywgcmVjdFdpbi5sZWZ0LCByZWN0V2luLnRvcCwgcmVjdFdpbi5y
aWdodCAtIHJlY3RXaW4ubGVmdCwgcmVjdFdpbi5ib3R0b20gLSByZWN0V2luLnRvcCwgbWVtREMu
Z2V0KCksIDAsIDAsIGJveFdpZHRoQmVzdCwgYm94SGVpZ2h0QmVzdCwgU1JDQ09QWSk7CisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBEcmF3RnJhbWVDb250cm9s
KGRjLCAmcmVjdFdpbiwgdHlwZSwgc3RhdGUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6
ZHJhd0ZvY3VzUmVjdChjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmICghbV9kYXRhLT5t
X29wYWNpdHkpCisgICAgICAgIHJldHVybjsKKworICAgIFNjb3BlRENQcm92aWRlciBkY1Byb3Zp
ZGVyKG1fZGF0YSk7CisgICAgaWYgKCFtX2RhdGEtPm1fZGMpCisgICAgICAgIHJldHVybjsKKwor
ICAgIEludFJlY3QgdHJSZWN0ID0gbV9kYXRhLT5tYXBSZWN0KHJlY3QpOworICAgIFRyYW5zcGFy
ZW50TGF5ZXJEQyB0cmFuc3BhcmVudERDKG1fZGF0YSwgdHJSZWN0LCAmcmVjdCk7CisgICAgSERD
IGRjID0gdHJhbnNwYXJlbnREQy5oZGMoKTsKKyAgICBpZiAoIWRjKQorICAgICAgICByZXR1cm47
CisgICAgdHJSZWN0Lm1vdmUodHJhbnNwYXJlbnREQy50b1NoaWZ0KCkpOworCisgICAgUkVDVCBy
ZWN0V2luID0gdHJSZWN0OworICAgIERyYXdGb2N1c1JlY3QoZGMsICZyZWN0V2luKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OnBhaW50VGV4dEZpZWxkKGNvbnN0IEludFJlY3QmIHJlY3Qs
IHVuc2lnbmVkIHN0YXRlKQoreworICAgIGlmICghbV9kYXRhLT5tX29wYWNpdHkpCisgICAgICAg
IHJldHVybjsKKworICAgIFNjb3BlRENQcm92aWRlciBkY1Byb3ZpZGVyKG1fZGF0YSk7CisgICAg
aWYgKCFtX2RhdGEtPm1fZGMpCisgICAgICAgIHJldHVybjsKKworICAgIEludFJlY3QgdHJSZWN0
ID0gbV9kYXRhLT5tYXBSZWN0KHJlY3QpOworICAgIFRyYW5zcGFyZW50TGF5ZXJEQyB0cmFuc3Bh
cmVudERDKG1fZGF0YSwgdHJSZWN0LCAmcmVjdCk7CisgICAgSERDIGRjID0gdHJhbnNwYXJlbnRE
Qy5oZGMoKTsKKyAgICBpZiAoIWRjKQorICAgICAgICByZXR1cm47CisgICAgdHJSZWN0Lm1vdmUo
dHJhbnNwYXJlbnREQy50b1NoaWZ0KCkpOworCisgICAgUkVDVCByZWN0V2luID0gdHJSZWN0Owor
ICAgIERyYXdFZGdlKGRjLCAmcmVjdFdpbiwgRURHRV9FVENIRUQsIEJGX1JFQ1QgfCBCRl9BREpV
U1QpOworICAgIEZpbGxSZWN0KGRjLCAmcmVjdFdpbiwgcmVpbnRlcnByZXRfY2FzdDxIQlJVU0g+
KCgoc3RhdGUgJiBERkNTX0lOQUNUSVZFKSA/IENPTE9SX0JUTkZBQ0UgOiBDT0xPUl9XSU5ET1cp
ICsgMSkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0JpdG1hcChTaGFyZWRCaXRt
YXAqIGJtcCwgY29uc3QgSW50UmVjdCYgZHN0UmVjdEluLCBjb25zdCBJbnRSZWN0JiBzcmNSZWN0
LCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCkKK3sKKyAgICBpZiAoIW1fZGF0YS0+bV9v
cGFjaXR5KQorICAgICAgICByZXR1cm47CisKKyAgICBTY29wZURDUHJvdmlkZXIgZGNQcm92aWRl
cihtX2RhdGEpOworICAgIGlmICghbV9kYXRhLT5tX2RjKQorICAgICAgICByZXR1cm47CisKKyAg
ICBJbnRSZWN0IGRzdFJlY3QgPSBtX2RhdGEtPm1hcFJlY3QoZHN0UmVjdEluKTsKKyAgICBUcmFu
c3BhcmVudExheWVyREMgdHJhbnNwYXJlbnREQyhtX2RhdGEsIGRzdFJlY3QsICZkc3RSZWN0SW4s
IDI1NSwgdHJ1ZSk7CisgICAgSERDIGRjID0gdHJhbnNwYXJlbnREQy5oZGMoKTsKKyAgICBpZiAo
IWRjKQorICAgICAgICByZXR1cm47CisgICAgZHN0UmVjdC5tb3ZlKHRyYW5zcGFyZW50REMudG9T
aGlmdCgpKTsKKworICAgIGJtcC0+ZHJhdyhkYywgZHN0UmVjdCwgc3JjUmVjdCwgY29tcG9zaXRl
T3ApOworCisgICAgaWYgKGJtcC0+aXMxNmJpdCgpKQorICAgICAgICB0cmFuc3BhcmVudERDLmZp
bGxBbHBoYUNoYW5uZWwoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdCaXRtYXBQ
YXR0ZXJuKFNoYXJlZEJpdG1hcCogYm1wLCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4sIGNv
bnN0IEFmZmluZVRyYW5zZm9ybSYgcGF0dGVyblRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICBj
b25zdCBGbG9hdFBvaW50JiBwaGFzZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIGNvbnN0IEZsb2F0
UmVjdCYgZGVzdFJlY3RJbiwgY29uc3QgSW50U2l6ZSYgb3JpZ1NvdXJjZVNpemUpCit7CisgICAg
aWYgKCFtX2RhdGEtPm1fb3BhY2l0eSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU2NvcGVEQ1By
b3ZpZGVyIGRjUHJvdmlkZXIobV9kYXRhKTsKKyAgICBpZiAoIW1fZGF0YS0+bV9kYykKKyAgICAg
ICAgcmV0dXJuOworCisgICAgSW50UmVjdCBpbnREc3RSZWN0ID0gZW5jbG9zaW5nSW50UmVjdChk
ZXN0UmVjdEluKTsKKyAgICBJbnRSZWN0IHRyUmVjdCA9IG1fZGF0YS0+bWFwUmVjdChpbnREc3RS
ZWN0KTsKKyAgICBUcmFuc3BhcmVudExheWVyREMgdHJhbnNwYXJlbnREQyhtX2RhdGEsIHRyUmVj
dCwgJmludERzdFJlY3QsIDI1NSwgdHJ1ZSk7CisgICAgSERDIGRjID0gdHJhbnNwYXJlbnREQy5o
ZGMoKTsKKyAgICBpZiAoIWRjKQorICAgICAgICByZXR1cm47CisgICAgdHJSZWN0Lm1vdmUodHJh
bnNwYXJlbnREQy50b1NoaWZ0KCkpOworICAgIEZsb2F0UmVjdCBtb3ZlZERzdFJlY3QgPSBtX2Rh
dGEtPm1fdHJhbnNmb3JtLmludmVyc2UoKS5tYXBSZWN0KEZsb2F0UmVjdCh0clJlY3QpKTsKKyAg
ICBGbG9hdFNpemUgbW92ZWQobW92ZWREc3RSZWN0LmxvY2F0aW9uKCkgLSBkZXN0UmVjdEluLmxv
Y2F0aW9uKCkpOworICAgIEFmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBtX2RhdGEtPm1fdHJh
bnNmb3JtOworICAgIHRyYW5zZm9ybS50cmFuc2xhdGUobW92ZWQud2lkdGgoKSwgbW92ZWQuaGVp
Z2h0KCkpOworCisgICAgYm1wLT5kcmF3UGF0dGVybihkYywgdHJhbnNmb3JtLCB0aWxlUmVjdElu
LCBwYXR0ZXJuVHJhbnNmb3JtLCBwaGFzZSwgb3AsIGRlc3RSZWN0SW4sIG9yaWdTb3VyY2VTaXpl
KTsKKworICAgIGlmICghYm1wLT5oYXNBbHBoYSgpKQorICAgICAgICB0cmFuc3BhcmVudERDLmZp
bGxBbHBoYUNoYW5uZWwoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdJY29uKEhJ
Q09OIGljb24sIGNvbnN0IEludFJlY3QmIGRzdFJlY3RJbiwgVUlOVCBmbGFncykKK3sKKyAgICBp
ZiAoIW1fZGF0YS0+bV9vcGFjaXR5KQorICAgICAgICByZXR1cm47CisKKyAgICBTY29wZURDUHJv
dmlkZXIgZGNQcm92aWRlcihtX2RhdGEpOworICAgIGlmICghbV9kYXRhLT5tX2RjKQorICAgICAg
ICByZXR1cm47CisKKyAgICBJbnRSZWN0IGRzdFJlY3QgPSBtX2RhdGEtPm1hcFJlY3QoZHN0UmVj
dEluKTsKKyAgICBUcmFuc3BhcmVudExheWVyREMgdHJhbnNwYXJlbnREQyhtX2RhdGEsIGRzdFJl
Y3QsICZkc3RSZWN0SW4sIDI1NSwgdHJ1ZSk7CisgICAgSERDIGRjID0gdHJhbnNwYXJlbnREQy5o
ZGMoKTsKKyAgICBpZiAoIWRjKQorICAgICAgICByZXR1cm47CisgICAgZHN0UmVjdC5tb3ZlKHRy
YW5zcGFyZW50REMudG9TaGlmdCgpKTsKKworICAgIERyYXdJY29uRXgoZGMsIGRzdFJlY3QueCgp
LCBkc3RSZWN0LnkoKSwgaWNvbiwgZHN0UmVjdC53aWR0aCgpLCBkc3RSZWN0LmhlaWdodCgpLCAw
LCBOVUxMLCBmbGFncyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVNo
b3VsZEFudGlhbGlhcyhib29sKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0OjpzZXRMaW5lRGFzaChjb25zdCBEYXNoQXJyYXkmLCBmbG9hdCkKK3sK
KyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcFBh
dGgoV2luZFJ1bGUpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HcmFwaGlj
c0NvbnRleHRXaW5DRS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW5jZS9HcmFwaGljc0NvbnRleHRXaW5DRS5jcHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HcmFwaGljc0NvbnRleHRXaW5DRS5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHRQ
cml2YXRlLmgiCiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRlICJQYXRoLmgi
Ci0jaW5jbHVkZSAiUGxhdGZvcm1QYXRoV2luY2UuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVBhdGhX
aW5DRS5oIgogI2luY2x1ZGUgIlNoYXJlZEJpdG1hcC5oIgogI2luY2x1ZGUgIlNpbXBsZUZvbnRE
YXRhLmgiCiAjaW5jbHVkZSA8d3RmL093blB0ci5oPgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW5jZS9HcmFwaGljc0NvbnRleHRXaW5jZS5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HcmFwaGljc0NvbnRleHRXaW5jZS5jcHAJKHJl
dmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HcmFwaGlj
c0NvbnRleHRXaW5jZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsMTk0MCArMCwwIEBACi0vKgot
ICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSBJbmMuCi0gKgotICogIFRo
aXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv
b3IKLSAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYwotICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb247IGVpdGhlcgotICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0
IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBsaWJyYXJ5IGlz
IGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UuICBTZWUgdGhlIEdOVQotICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m
IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYWxvbmcgd2l0aCB0
aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8K
LSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJl
ZXQsIEZpZnRoIEZsb29yLAotICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICoKLSAq
LwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCi0K
LSNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKLSNpbmNsdWRlICJDaGFyYWN0ZXJOYW1lcy5o
IgotI2luY2x1ZGUgIkZvbnQuaCIKLSNpbmNsdWRlICJHbHlwaEJ1ZmZlci5oIgotI2luY2x1ZGUg
IkdyYWRpZW50LmgiCi0jaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0UHJpdmF0ZS5oIgotI2luY2x1
ZGUgIk5vdEltcGxlbWVudGVkLmgiCi0jaW5jbHVkZSAiUGF0aC5oIgotI2luY2x1ZGUgIlBsYXRm
b3JtUGF0aFdpbmNlLmgiCi0jaW5jbHVkZSAiU2hhcmVkQml0bWFwLmgiCi0jaW5jbHVkZSAiU2lt
cGxlRm9udERhdGEuaCIKLSNpbmNsdWRlIDx3dGYvT3duUHRyLmg+Ci0KLSNpbmNsdWRlIDx3aW5k
b3dzLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotdHlwZWRlZiB2b2lkICgqRnVuY0dyYWRp
ZW50RmlsbFJlY3RMaW5lYXIpKEhEQyBoZGMsIGNvbnN0IEludFJlY3QmIHIsIGNvbnN0IEludFBv
aW50JiBwMCwgY29uc3QgSW50UG9pbnQmIHAxLCBjb25zdCBWZWN0b3I8R3JhZGllbnQ6OkNvbG9y
U3RvcD4mIHN0b3BzKTsKLXR5cGVkZWYgdm9pZCAoKkZ1bmNHcmFkaWVudEZpbGxSZWN0UmFkaWFs
KShIREMgaGRjLCBjb25zdCBJbnRSZWN0JiByLCBjb25zdCBJbnRQb2ludCYgcDAsIGNvbnN0IElu
dFBvaW50JiBwMSwgZmxvYXQgcjAsIGZsb2F0IHIxLCBjb25zdCBWZWN0b3I8R3JhZGllbnQ6OkNv
bG9yU3RvcD4mIHN0b3BzKTsKLUZ1bmNHcmFkaWVudEZpbGxSZWN0TGluZWFyIGdfbGluZWFyR3Jh
ZGllbnRGaWxsZXIgPSAwOwotRnVuY0dyYWRpZW50RmlsbFJlY3RSYWRpYWwgZ19yYWRpYWxHcmFk
aWVudEZpbGxlciA9IDA7Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc1plcm8oZG91YmxlIGQpCi17
Ci0gICAgcmV0dXJuIGQgPiAwID8gZCA8PSAxLkUtMTAgOiBkID49IC0xLkUtMTA7Ci19Ci0KLS8v
IHN0YWJsZVJvdW5kIHJvdW5kcyAtMC41IHRvIDAsIHdoZXJlIGxyb3VuZCByb3VuZHMgLTAuNSB0
byAtMS4KLXN0YXRpYyBpbmxpbmUgaW50IHN0YWJsZVJvdW5kKGRvdWJsZSBkKQotewotICAgIGlm
IChkID4gMCkKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oZCArIDAuNSk7Ci0KLSAg
ICBpbnQgaSA9IHN0YXRpY19jYXN0PGludD4oZCk7Ci0gICAgcmV0dXJuIGkgLSBkID4gMC41ID8g
aSAtIDEgOiBpOwotfQotCi0vLyBVbmxpa2UgZW5jbG9zaW5nSW50UmVjdCgpLCB0aGlzIGZ1bmN0
aW9uIGRvZXMgc3RyaWN0IHJvdW5kaW5nLgotc3RhdGljIGlubGluZSBJbnRSZWN0IHJvdW5kUmVj
dChjb25zdCBGbG9hdFJlY3QmIHIpCi17Ci0gICAgcmV0dXJuIEludFJlY3Qoc3RhYmxlUm91bmQo
ci54KCkpLCBzdGFibGVSb3VuZChyLnkoKSksIHN0YWJsZVJvdW5kKHIucmlnaHQoKSkgLSBzdGFi
bGVSb3VuZChyLngoKSksIHN0YWJsZVJvdW5kKHIuYm90dG9tKCkpIC0gc3RhYmxlUm91bmQoci55
KCkpKTsKLX0KLQotLy8gUm90YXRpb24gdHJhbnNmb3JtYXRpb24KLWNsYXNzIFJvdGF0aW9uVHJh
bnNmb3JtIHsKLXB1YmxpYzoKLSAgICBSb3RhdGlvblRyYW5zZm9ybSgpCi0gICAgICAgIDogbV9j
b3NBKDEuKQotICAgICAgICAsIG1fc2luQSgwLikKLSAgICAgICAgLCBtX3ByZVNoaWZ0WCgwKQot
ICAgICAgICAsIG1fcHJlU2hpZnRZKDApCi0gICAgICAgICwgbV9wb3N0U2hpZnRYKDApCi0gICAg
ICAgICwgbV9wb3N0U2hpZnRZKDApCi0gICAgewotICAgIH0KLSAgICBSb3RhdGlvblRyYW5zZm9y
bSBvcGVyYXRvci0oKSBjb25zdAotICAgIHsKLSAgICAgICAgUm90YXRpb25UcmFuc2Zvcm0gcnRu
OwotICAgICAgICBydG4ubV9jb3NBID0gbV9jb3NBOwotICAgICAgICBydG4ubV9zaW5BID0gLW1f
c2luQTsKLSAgICAgICAgcnRuLm1fcHJlU2hpZnRYID0gbV9wb3N0U2hpZnRYOwotICAgICAgICBy
dG4ubV9wcmVTaGlmdFkgPSBtX3Bvc3RTaGlmdFk7Ci0gICAgICAgIHJ0bi5tX3Bvc3RTaGlmdFgg
PSBtX3ByZVNoaWZ0WDsKLSAgICAgICAgcnRuLm1fcG9zdFNoaWZ0WSA9IG1fcHJlU2hpZnRZOwot
ICAgICAgICByZXR1cm4gcnRuOwotICAgIH0KLSAgICB2b2lkIG1hcChkb3VibGUgeDEsIGRvdWJs
ZSB5MSwgZG91YmxlKiB4MiwgZG91YmxlKiB5MikgY29uc3QKLSAgICB7Ci0gICAgICAgIHgxICs9
IG1fcHJlU2hpZnRYOwotICAgICAgICB5MSArPSBtX3ByZVNoaWZ0WTsKLSAgICAgICAgKngyID0g
eDEgKiBtX2Nvc0EgKyB5MSAqIG1fc2luQSArIG1fcG9zdFNoaWZ0WDsKLSAgICAgICAgKnkyID0g
eTEgKiBtX2Nvc0EgLSB4MSAqIG1fc2luQSArIG1fcG9zdFNoaWZ0WTsKLSAgICB9Ci0gICAgdm9p
ZCBtYXAoaW50IHgxLCBpbnQgeTEsIGludCogeDIsIGludCogeTIpIGNvbnN0Ci0gICAgewotICAg
ICAgICB4MSArPSBtX3ByZVNoaWZ0WDsKLSAgICAgICAgeTEgKz0gbV9wcmVTaGlmdFk7Ci0gICAg
ICAgICp4MiA9IHN0YWJsZVJvdW5kKHgxICogbV9jb3NBICsgeTEgKiBtX3NpbkEpICsgbV9wb3N0
U2hpZnRYOwotICAgICAgICAqeTIgPSBzdGFibGVSb3VuZCh5MSAqIG1fY29zQSAtIHgxICogbV9z
aW5BKSArIG1fcG9zdFNoaWZ0WTsKLSAgICB9Ci0KLSAgICBkb3VibGUgbV9jb3NBOwotICAgIGRv
dWJsZSBtX3NpbkE7Ci0gICAgaW50IG1fcHJlU2hpZnRYOwotICAgIGludCBtX3ByZVNoaWZ0WTsK
LSAgICBpbnQgbV9wb3N0U2hpZnRYOwotICAgIGludCBtX3Bvc3RTaGlmdFk7Ci19OwotCi10ZW1w
bGF0ZTxjbGFzcyBUPiBzdGF0aWMgaW5saW5lIEludFBvaW50IG1hcFBvaW50KGNvbnN0IEludFBv
aW50JiBwLCBjb25zdCBUJiB0KQotewotICAgIGludCB4LCB5OwotICAgIHQubWFwKHAueCgpLCBw
LnkoKSwgJngsICZ5KTsKLSAgICByZXR1cm4gSW50UG9pbnQoeCwgeSk7Ci19Ci0KLXRlbXBsYXRl
PGNsYXNzIFQ+IHN0YXRpYyBpbmxpbmUgRmxvYXRQb2ludCBtYXBQb2ludChjb25zdCBGbG9hdFBv
aW50JiBwLCBjb25zdCBUJiB0KQotewotICAgIGRvdWJsZSB4LCB5OwotICAgIHQubWFwKHAueCgp
LCBwLnkoKSwgJngsICZ5KTsKLSAgICByZXR1cm4gRmxvYXRQb2ludChzdGF0aWNfY2FzdDxmbG9h
dD4oeCksIHN0YXRpY19jYXN0PGZsb2F0Pih5KSk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRyYW5z
Zm9ybSwgY2xhc3MgUmVjdCwgY2xhc3MgVmFsdWU+IHN0YXRpYyBpbmxpbmUgUmVjdCBtYXBSZWN0
KGNvbnN0IFJlY3QmIHJlY3QsIGNvbnN0IFRyYW5zZm9ybSYgdHJhbnNmb3JtKQotewotICAgIFZh
bHVlIHhbNF0sIHlbNF07Ci0gICAgVmFsdWUgbCwgdCwgciwgYjsKLSAgICByID0gcmVjdC5yaWdo
dCgpIC0gMTsKLSAgICBiID0gcmVjdC5ib3R0b20oKSAtIDE7Ci0gICAgdHJhbnNmb3JtLm1hcChy
ZWN0LngoKSwgcmVjdC55KCksIHgsIHkpOwotICAgIHRyYW5zZm9ybS5tYXAocmVjdC54KCksIGIs
IHggKyAxLCB5ICsgMSk7Ci0gICAgdHJhbnNmb3JtLm1hcChyLCBiLCB4ICsgMiwgeSArIDIpOwot
ICAgIHRyYW5zZm9ybS5tYXAociwgcmVjdC55KCksIHggKyAzLCB5ICsgMyk7Ci0gICAgbCA9IHIg
PSB4WzNdOwotICAgIHQgPSBiID0geVszXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsr
aSkgewotICAgICAgICBpZiAoeFtpXSA8IGwpCi0gICAgICAgICAgICBsID0geFtpXTsKLSAgICAg
ICAgZWxzZSBpZiAoeFtpXSA+IHIpCi0gICAgICAgICAgICByID0geFtpXTsKLQotICAgICAgICBp
ZiAoeVtpXSA8IHQpCi0gICAgICAgICAgICB0ID0geVtpXTsKLSAgICAgICAgZWxzZSBpZiAoeVtp
XSA+IGIpCi0gICAgICAgICAgICBiID0geVtpXTsKLSAgICB9Ci0KLSAgICByZXR1cm4gSW50UmVj
dChsLCB0LCByIC0gbCArIDEsIGIgLSB0ICsgMSk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+IHN0
YXRpYyBpbmxpbmUgSW50UmVjdCBtYXBSZWN0KGNvbnN0IEludFJlY3QmIHJlY3QsIGNvbnN0IFQm
IHRyYW5zZm9ybSkKLXsKLSAgICByZXR1cm4gbWFwUmVjdDxULCBJbnRSZWN0LCBpbnQ+KHJlY3Qs
IHRyYW5zZm9ybSk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+IHN0YXRpYyBpbmxpbmUgRmxvYXRS
ZWN0IG1hcFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0LCBjb25zdCBUJiB0cmFuc2Zvcm0pCi17
Ci0gICAgcmV0dXJuIG1hcFJlY3Q8VCwgRmxvYXRSZWN0LCBkb3VibGU+KHJlY3QsIHRyYW5zZm9y
bSk7Ci19Ci0KLWNsYXNzIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZURhdGEgewotcHVi
bGljOgotICAgIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZURhdGEoKQotICAgICAgICA6
IG1fdHJhbnNmb3JtKCkKLSAgICAgICAgLCBtX29wYWNpdHkoMS4wKQotICAgIHsKLSAgICB9Ci0K
LSAgICBBZmZpbmVUcmFuc2Zvcm0gbV90cmFuc2Zvcm07Ci0gICAgZmxvYXQgbV9vcGFjaXR5Owot
ICAgIFZlY3RvcjxQYXRoPiBtX3BhdGhzOwotfTsKLQotZW51bSBBbHBoYVBhaW50VHlwZSB7Ci0g
ICAgQWxwaGFQYWludE5vbmUsCi0gICAgQWxwaGFQYWludEltYWdlLAotICAgIEFscGhhUGFpbnRP
dGhlciwKLX07Ci0KLWNsYXNzIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSA6IHB1Ymxp
YyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVEYXRhIHsKLXB1YmxpYzoKLSAgICBHcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoSERDIGRjKQotICAgICAgICA6IG1fZGMoZGMpCi0g
ICAgewotICAgIH0KLSAgICB+R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKCkKLSAgICB7
Ci0gICAgICAgIHdoaWxlICghbV9iYWNrdXBEYXRhLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJl
c3RvcmUoKTsKLSAgICB9Ci0KLSAgICBJbnRQb2ludCBvcmlnaW4oKSBjb25zdAotICAgIHsKLSAg
ICAgICAgcmV0dXJuIEludFBvaW50KHN0YWJsZVJvdW5kKC1tX3RyYW5zZm9ybS5lKCkpLCBzdGFi
bGVSb3VuZCgtbV90cmFuc2Zvcm0uZigpKSk7Ci0gICAgfQotCi0gICAgdm9pZCB0cmFuc2xhdGUo
ZmxvYXQgeCwgZmxvYXQgeSkKLSAgICB7Ci0gICAgICAgIG1fdHJhbnNmb3JtLnRyYW5zbGF0ZSh4
LCB5KTsKLSAgICB9Ci0KLSAgICB2b2lkIHNjYWxlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKLSAg
ICB7Ci0gICAgICAgIG1fdHJhbnNmb3JtLnNjYWxlTm9uVW5pZm9ybShzaXplLndpZHRoKCksIHNp
emUuaGVpZ2h0KCkpOwotICAgIH0KLQotICAgIHZvaWQgcm90YXRlKGZsb2F0IHJhZGlhbnMpCi0g
ICAgewotICAgICAgICBtX3RyYW5zZm9ybS5yb3RhdGUocmFkMmRlZyhyYWRpYW5zKSk7Ci0gICAg
fQotCi0gICAgdm9pZCAgY29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdHJhbnNmb3Jt
KQotICAgIHsKLSAgICAgICAgbV90cmFuc2Zvcm0gPSB0cmFuc2Zvcm0gKiBtX3RyYW5zZm9ybTsK
LSAgICB9Ci0KLSAgICBJbnRSZWN0IG1hcFJlY3QoY29uc3QgSW50UmVjdCYgcmVjdCkgY29uc3QK
LSAgICB7Ci0gICAgICAgIHJldHVybiBtX3RyYW5zZm9ybS5tYXBSZWN0KHJlY3QpOwotICAgIH0K
LQotICAgIEZsb2F0UmVjdCBtYXBSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkgY29uc3QKLSAg
ICB7Ci0gICAgICAgIHJldHVybiBtX3RyYW5zZm9ybS5tYXBSZWN0KHJlY3QpOwotICAgIH0KLQot
ICAgIEludFBvaW50IG1hcFBvaW50KGNvbnN0IEludFBvaW50JiBwb2ludCkgY29uc3QKLSAgICB7
Ci0gICAgICAgIHJldHVybiBtX3RyYW5zZm9ybS5tYXBQb2ludChwb2ludCk7Ci0gICAgfQotCi0g
ICAgRmxvYXRQb2ludCBtYXBQb2ludChjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29uc3QKLSAg
ICB7Ci0gICAgICAgIHJldHVybiBtX3RyYW5zZm9ybS5tYXBQb2ludChwb2ludCk7Ci0gICAgfQot
Ci0gICAgRmxvYXRTaXplIG1hcFNpemUoY29uc3QgRmxvYXRTaXplJiBzaXplKSBjb25zdAotICAg
IHsKLSAgICAgICAgZG91YmxlIHcsIGg7Ci0gICAgICAgIG1fdHJhbnNmb3JtLm1hcChzaXplLndp
ZHRoKCksIHNpemUuaGVpZ2h0KCksIHcsIGgpOwotICAgICAgICByZXR1cm4gRmxvYXRTaXplKHN0
YXRpY19jYXN0PGZsb2F0Pih3KSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGgpKTsKLSAgICB9Ci0KLSAg
ICB2b2lkIHNhdmUoKQotICAgIHsKLSAgICAgICAgaWYgKG1fZGMpCi0gICAgICAgICAgICBTYXZl
REMobV9kYyk7Ci0KLSAgICAgICAgbV9iYWNrdXBEYXRhLmFwcGVuZCgqc3RhdGljX2Nhc3Q8R3Jh
cGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlRGF0YSo+KHRoaXMpKTsKLSAgICB9Ci0KLSAgICB2
b2lkIHJlc3RvcmUoKQotICAgIHsKLSAgICAgICAgaWYgKG1fYmFja3VwRGF0YS5pc0VtcHR5KCkp
Ci0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKG1fZGMpCi0gICAgICAgICAgICBS
ZXN0b3JlREMobV9kYywgLTEpOwotCi0gICAgICAgIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJp
dmF0ZURhdGE6Om9wZXJhdG9yPShtX2JhY2t1cERhdGEubGFzdCgpKTsKLSAgICAgICAgbV9iYWNr
dXBEYXRhLnJlbW92ZUxhc3QoKTsKLSAgICB9Ci0KLSAgICBib29sIGhhc0FscGhhKCkgY29uc3Qg
eyByZXR1cm4gbV9iaXRtYXAgJiYgbV9iaXRtYXAtPmhhc0FscGhhKCk7IH0KLQotICAgIFBhc3NS
ZWZQdHI8U2hhcmVkQml0bWFwPiBnZXRUcmFuc3BhcmVudExheWVyQml0bWFwKEludFJlY3QmIG9y
aWdSZWN0LCBBbHBoYVBhaW50VHlwZSBhbHBoYVBhaW50LCBSRUNUJiBibXBSZWN0LCBib29sIGNo
ZWNrQ2xpcEJveCwgYm9vbCBmb3JjZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmIChtX29wYWNp
dHkgPD0gMCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGlmIChmb3JjZSB8fCBt
X29wYWNpdHkgPCAxLikgIHsKLSAgICAgICAgICAgIGlmIChjaGVja0NsaXBCb3gpIHsKLSAgICAg
ICAgICAgICAgICBSRUNUIGNsaXBCb3g7Ci0gICAgICAgICAgICAgICAgaW50IGNsaXBUeXBlID0g
R2V0Q2xpcEJveChtX2RjLCAmY2xpcEJveCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaXBUeXBl
ID09IFNJTVBMRVJFR0lPTiB8fCBjbGlwVHlwZSA9PSBDT01QTEVYUkVHSU9OKQotICAgICAgICAg
ICAgICAgICAgICBvcmlnUmVjdC5pbnRlcnNlY3QoY2xpcEJveCk7Ci0gICAgICAgICAgICAgICAg
aWYgKG9yaWdSZWN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFJlZlB0cjxTaGFyZWRCaXRtYXA+IGJtcCA9IFNo
YXJlZEJpdG1hcDo6Y3JlYXRlSW5zdGFuY2UoYWxwaGFQYWludCA9PSBBbHBoYVBhaW50Tm9uZSwg
b3JpZ1JlY3Qud2lkdGgoKSwgb3JpZ1JlY3QuaGVpZ2h0KCksIGZhbHNlKTsKLSAgICAgICAgICAg
IFNldFJlY3QoJmJtcFJlY3QsIDAsIDAsIG9yaWdSZWN0LndpZHRoKCksIG9yaWdSZWN0LmhlaWdo
dCgpKTsKLSAgICAgICAgICAgIGlmIChibXApIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFs
cGhhUGFpbnQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEFscGhhUGFpbnROb25lOgotICAgICAg
ICAgICAgICAgIGNhc2UgQWxwaGFQYWludEltYWdlOgotICAgICAgICAgICAgICAgICAgICB7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICBTaGFyZWRCaXRtYXA6OkRDSG9sZGVyIGRjKGJtcC5nZXQo
KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGMuZ2V0KCkpIHsKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBCaXRCbHQoZGMuZ2V0KCksIDAsIDAsIG9yaWdSZWN0LndpZHRoKCks
IG9yaWdSZWN0LmhlaWdodCgpLCBtX2RjLCBvcmlnUmVjdC54KCksIG9yaWdSZWN0LnkoKSwgU1JD
Q09QWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJtcC0+aXMzMmJpdCgpICYm
ICghbV9iaXRtYXAgfHwgbV9iaXRtYXAtPmlzMTZiaXQoKSkpIHsKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgLy8gU2V0IGFscGhhIGNoYW5uZWwKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdW5zaWduZWQqIHBpeGVscyA9ICh1bnNpZ25lZCopYm1wLT5ieXRlcygpOwot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCogY29uc3QgcGl4
ZWxzRW5kID0gcGl4ZWxzICsgYm1wLT5iaXRtYXBJbmZvKCkubnVtUGl4ZWxzKCk7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwaXhlbHMgPCBwaXhlbHNFbmQpIHsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwaXhlbHMgfD0gMHhGRjAwMDAwMDsK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrcGl4ZWxzOwotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBibXA7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgICAgICAgICAgLy9jYXNlIEFscGhhUGFpbnRPdGhlcjoKLSAgICAgICAgICAg
ICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoYm1wLT5ieXRlcygpLCAw
eEZGLCBibXAtPmJpdG1hcEluZm8oKS5udW1QaXhlbHMoKSAqIDQpOwotICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gYm1wOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBibXBSZWN0ID0gb3Jp
Z1JlY3Q7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHZvaWQgcGFpbnRCYWNrVHJh
bnNwYXJlbnRMYXllckJpdG1hcChIREMgaGRjLCBTaGFyZWRCaXRtYXAqIGJtcCwgY29uc3QgSW50
UmVjdCYgb3JpZ1JlY3QsIEFscGhhUGFpbnRUeXBlIGFscGhhUGFpbnQsIGNvbnN0IFJFQ1QmIGJt
cFJlY3QpCi0gICAgewotICAgICAgICBpZiAoaGRjID09IG1fZGMpCi0gICAgICAgICAgICByZXR1
cm47Ci0KLSNpZiAhZGVmaW5lZChOT19BTFBIQUJMRU5EKQotICAgICAgICBpZiAoYWxwaGFQYWlu
dCA9PSBBbHBoYVBhaW50T3RoZXIpIHsKLSAgICAgICAgICAgIEFTU0VSVChibXAgJiYgYm1wLT5i
eXRlcygpICYmIGJtcC0+aXMzMmJpdCgpKTsKLSAgICAgICAgICAgIHVuc2lnbmVkKiBwaXhlbHMg
PSAodW5zaWduZWQqKWJtcC0+Ynl0ZXMoKTsKLSAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkKiBj
b25zdCBwaXhlbHNFbmQgPSBwaXhlbHMgKyBibXAtPmJpdG1hcEluZm8oKS5udW1QaXhlbHMoKTsK
LSAgICAgICAgICAgIHdoaWxlIChwaXhlbHMgPCBwaXhlbHNFbmQpIHsKLSAgICAgICAgICAgICAg
ICAqcGl4ZWxzIF49IDB4RkYwMDAwMDA7Ci0gICAgICAgICAgICAgICAgKytwaXhlbHM7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fb3BhY2l0eSA8IDEuIHx8IGFscGhh
UGFpbnQgPT0gQWxwaGFQYWludE90aGVyKSB7Ci0gICAgICAgICAgICBjb25zdCBCTEVOREZVTkNU
SU9OIGJsZW5kID0geyBBQ19TUkNfT1ZFUiwgMAotICAgICAgICAgICAgICAgICwgbV9vcGFjaXR5
ID49IDEuID8gMjU1IDogKEJZVEUpKG1fb3BhY2l0eSAqIDI1NSkKLSAgICAgICAgICAgICAgICAs
IGFscGhhUGFpbnQgPT0gQWxwaGFQYWludE5vbmUgPyAwIDogQUNfU1JDX0FMUEhBIH07Ci0gICAg
ICAgICAgICBBbHBoYUJsZW5kKG1fZGMsIG9yaWdSZWN0LngoKSwgb3JpZ1JlY3QueSgpLCBvcmln
UmVjdC53aWR0aCgpLCBvcmlnUmVjdC5oZWlnaHQoKSwgaGRjLCAwLCAwLCBibXBSZWN0LnJpZ2h0
LCBibXBSZWN0LmJvdHRvbSwgYmxlbmQpOwotICAgICAgICB9IGVsc2UKLSNlbmRpZgotICAgICAg
ICAgICAgU3RyZXRjaEJsdChtX2RjLCBvcmlnUmVjdC54KCksIG9yaWdSZWN0LnkoKSwgb3JpZ1Jl
Y3Qud2lkdGgoKSwgb3JpZ1JlY3QuaGVpZ2h0KCksIGhkYywgMCwgMCwgYm1wUmVjdC5yaWdodCwg
Ym1wUmVjdC5ib3R0b20sIFNSQ0NPUFkpOwotICAgIH0KLQotICAgIEhEQyBtX2RjOwotICAgIFJl
ZlB0cjxTaGFyZWRCaXRtYXA+IG1fYml0bWFwOwotICAgIFZlY3RvcjxHcmFwaGljc0NvbnRleHRQ
bGF0Zm9ybVByaXZhdGVEYXRhPiBtX2JhY2t1cERhdGE7Ci19OwotCi1zdGF0aWMgSFBFTiBjcmVh
dGVQZW4oY29uc3QgQ29sb3ImIGNvbCwgZG91YmxlIGZXaWR0aCwgU3Ryb2tlU3R5bGUgc3R5bGUp
Ci17Ci0gICAgaW50IHdpZHRoID0gc3RhYmxlUm91bmQoZldpZHRoKTsKLSAgICBpZiAod2lkdGgg
PCAxKQotICAgICAgICB3aWR0aCA9IDE7Ci0KLSAgICBpbnQgcGVuU3R5bGUgPSBQU19OVUxMOwot
ICAgIHN3aXRjaCAoc3R5bGUpIHsKLSAgICAgICAgY2FzZSBTb2xpZFN0cm9rZToKLSAgICAgICAg
ICAgIHBlblN0eWxlID0gUFNfU09MSUQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2Fz
ZSBEb3R0ZWRTdHJva2U6ICAvLyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MgQ0UKLSAgICAgICAg
Y2FzZSBEYXNoZWRTdHJva2U6Ci0gICAgICAgICAgICBwZW5TdHlsZSA9IFBTX0RBU0g7Ci0gICAg
ICAgICAgICB3aWR0aCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoK
LSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBDcmVhdGVQZW4ocGVuU3R5
bGUsIHdpZHRoLCBSR0IoY29sLnJlZCgpLCBjb2wuZ3JlZW4oKSwgY29sLmJsdWUoKSkpOwotfQot
Ci1zdGF0aWMgaW5saW5lIEhHRElPQkogY3JlYXRlQnJ1c2goY29uc3QgQ29sb3ImIGNvbCkKLXsK
LSAgICByZXR1cm4gQ3JlYXRlU29saWRCcnVzaChSR0IoY29sLnJlZCgpLCBjb2wuZ3JlZW4oKSwg
Y29sLmJsdWUoKSkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUGl4ZWxUeXBlLCBib29sIElz
MTZiaXQ+IHN0YXRpYyB2b2lkIF9yb3RhdGVCaXRtYXAoU2hhcmVkQml0bWFwKiBkZXN0Qm1wLCBj
b25zdCBTaGFyZWRCaXRtYXAqIHNvdXJjZUJtcCwgY29uc3QgUm90YXRpb25UcmFuc2Zvcm0mIHRy
YW5zZm9ybSkKLXsKLSAgICBpbnQgZGVzdFcgPSBkZXN0Qm1wLT53aWR0aCgpOwotICAgIGludCBk
ZXN0SCA9IGRlc3RCbXAtPmhlaWdodCgpOwotICAgIGludCBzb3VyY2VXID0gc291cmNlQm1wLT53
aWR0aCgpOwotICAgIGludCBzb3VyY2VIID0gc291cmNlQm1wLT5oZWlnaHQoKTsKLSAgICBQaXhl
bFR5cGUqIGRlc3QgPSAoUGl4ZWxUeXBlKilkZXN0Qm1wLT5ieXRlcygpOwotICAgIGNvbnN0IFBp
eGVsVHlwZSogc291cmNlID0gKGNvbnN0IFBpeGVsVHlwZSopc291cmNlQm1wLT5ieXRlcygpOwot
ICAgIGludCBwYWRkaW5nOwotICAgIGludCBwYWRkZWRTb3VyY2VXOwotICAgIGlmIChJczE2Yml0
KSB7Ci0gICAgICAgIHBhZGRpbmcgPSBkZXN0VyAmIDE7Ci0gICAgICAgIHBhZGRlZFNvdXJjZVcg
PSBzb3VyY2VXICsgKHNvdXJjZVcgJiAxKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwYWRkaW5n
ID0gMDsKLSAgICAgICAgcGFkZGVkU291cmNlVyA9IHNvdXJjZVc7Ci0gICAgfQotICAgIGlmIChp
c1plcm8odHJhbnNmb3JtLm1fc2luQSkpIHsKLSAgICAgICAgaW50IGNvc0EgPSB0cmFuc2Zvcm0u
bV9jb3NBID4gMCA/IDEgOiAtMTsKLSAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBkZXN0SDsg
Kyt5KSB7Ci0gICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IGRlc3RXOyArK3gpIHsKLSAg
ICAgICAgICAgICAgICBpbnQgeDEgPSB4ICsgdHJhbnNmb3JtLm1fcHJlU2hpZnRYOwotICAgICAg
ICAgICAgICAgIGludCB5MSA9IHkgKyB0cmFuc2Zvcm0ubV9wcmVTaGlmdFk7Ci0gICAgICAgICAg
ICAgICAgaW50IHNyY1ggPSB4MSAqIGNvc0EgKyB0cmFuc2Zvcm0ubV9wb3N0U2hpZnRYOwotICAg
ICAgICAgICAgICAgIGludCBzcmNZID0geTEgKiBjb3NBIC0gdHJhbnNmb3JtLm1fcG9zdFNoaWZ0
WTsKLSAgICAgICAgICAgICAgICBpZiAoc3JjWCA+PSAwICYmIHNyY1ggPD0gc291cmNlVyAmJiBz
cmNZID49IDAgJiYgc3JjWSA8PSBzb3VyY2VIKQotICAgICAgICAgICAgICAgICAgICAqZGVzdCsr
ID0gc291cmNlW3NyY1kgKiBwYWRkZWRTb3VyY2VXICsgc3JjWF0gfCAweEZGMDAwMDAwOwotICAg
ICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyB8PSAweEZGOwot
ICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdCArPSBwYWRkaW5nOwotICAgICAgICB9Ci0g
ICAgfSBlbHNlIGlmIChpc1plcm8odHJhbnNmb3JtLm1fY29zQSkpIHsKLSAgICAgICAgaW50IHNp
bkEgPSB0cmFuc2Zvcm0ubV9zaW5BID4gMCA/IDEgOiAtMTsKLSAgICAgICAgZm9yIChpbnQgeSA9
IDA7IHkgPCBkZXN0SDsgKyt5KSB7Ci0gICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IGRl
c3RXOyArK3gpIHsKLSAgICAgICAgICAgICAgICBpbnQgeDEgPSB4ICsgdHJhbnNmb3JtLm1fcHJl
U2hpZnRYOwotICAgICAgICAgICAgICAgIGludCB5MSA9IHkgKyB0cmFuc2Zvcm0ubV9wcmVTaGlm
dFk7Ci0gICAgICAgICAgICAgICAgaW50IHNyY1ggPSB5MSAqIHNpbkEgKyB0cmFuc2Zvcm0ubV9w
b3N0U2hpZnRYOwotICAgICAgICAgICAgICAgIGludCBzcmNZID0gLXgxICogc2luQSArIHRyYW5z
Zm9ybS5tX3Bvc3RTaGlmdFk7Ci0gICAgICAgICAgICAgICAgaWYgKHNyY1ggPj0gMCAmJiBzcmNY
IDw9IHNvdXJjZVcgJiYgc3JjWSA+PSAwICYmIHNyY1kgPD0gc291cmNlSCkKLSAgICAgICAgICAg
ICAgICAgICAgKmRlc3QrKyA9IHNvdXJjZVtzcmNZICogcGFkZGVkU291cmNlVyArIHNyY1hdOwot
ICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdCArPSBwYWRkaW5nOwotICAgICAgICB9Ci0g
ICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBkZXN0SDsgKyt5KSB7Ci0g
ICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IGRlc3RXOyArK3gpIHsKLSAgICAgICAgICAg
ICAgICAvLyBGSVhNRTogZm9yIGJlc3QgcXVhbGl0eSwgd2Ugc2hvdWxkIGdldCB3ZWlnaHRlZCBz
dW0gb2YgZm91ciBuZWlnaGJvdXJzLAotICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGF0IHdpbGwg
YmUgdG9vIGV4cGVuc2l2ZQotICAgICAgICAgICAgICAgIGludCBzcmNYLCBzcmNZOwotICAgICAg
ICAgICAgICAgIHRyYW5zZm9ybS5tYXAoeCwgeSwgJnNyY1gsICZzcmNZKTsKLSAgICAgICAgICAg
ICAgICBpZiAoc3JjWCA+PSAwICYmIHNyY1ggPD0gc291cmNlVyAmJiBzcmNZID49IDAgJiYgc3Jj
WSA8PSBzb3VyY2VIKQotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gc291cmNlW3NyY1kg
KiBwYWRkZWRTb3VyY2VXICsgc3JjWF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0
ICs9IHBhZGRpbmc7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHJvdGF0ZUJp
dG1hcChTaGFyZWRCaXRtYXAqIGRlc3RCbXAsIGNvbnN0IFNoYXJlZEJpdG1hcCogc291cmNlQm1w
LCBjb25zdCBSb3RhdGlvblRyYW5zZm9ybSYgdHJhbnNmb3JtKQotewotICAgIEFTU0VSVChkZXN0
Qm1wLT5pczE2Yml0KCkgPT0gc291cmNlQm1wLT5pczE2Yml0KCkpOwotICAgIGlmIChkZXN0Qm1w
LT5pczE2Yml0KCkpCi0gICAgICAgIF9yb3RhdGVCaXRtYXA8dW5zaWduZWQgc2hvcnQsIHRydWU+
KGRlc3RCbXAsIHNvdXJjZUJtcCwgdHJhbnNmb3JtKTsKLSAgICBlbHNlCi0gICAgICAgIF9yb3Rh
dGVCaXRtYXA8dW5zaWduZWQsIGZhbHNlPihkZXN0Qm1wLCBzb3VyY2VCbXAsIHRyYW5zZm9ybSk7
Ci19Ci0KLWNsYXNzIFRyYW5zcGFyZW50TGF5ZXJEQyA6IE5vbmNvcHlhYmxlIHsKLXB1YmxpYzoK
LSAgICBUcmFuc3BhcmVudExheWVyREMoR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKiBk
YXRhLCBJbnRSZWN0JiBvcmlnUmVjdCwgY29uc3QgSW50UmVjdCogcmVjdEJlZm9yZVRyYW5zZm9y
bSA9IDAsIGludCBhbHBoYSA9IDI1NSwgYm9vbCBwYWludEltYWdlID0gZmFsc2UpOwotICAgIH5U
cmFuc3BhcmVudExheWVyREMoKTsKLQotICAgIEhEQyBoZGMoKSBjb25zdCB7IHJldHVybiBtX21l
bURjOyB9Ci0gICAgY29uc3QgUkVDVCYgcmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fYm1wUmVjdDsg
fQotICAgIEludFNpemUgdG9TaGlmdCgpIGNvbnN0IHsgcmV0dXJuIEludFNpemUobV9ibXBSZWN0
LmxlZnQgLSBtX29yaWdSZWN0LngoKSwgbV9ibXBSZWN0LnRvcCAtIG1fb3JpZ1JlY3QueSgpKTsg
fQotICAgIHZvaWQgZmlsbEFscGhhQ2hhbm5lbCgpOwotCi1wcml2YXRlOgotICAgIEdyYXBoaWNz
Q29udGV4dFBsYXRmb3JtUHJpdmF0ZSogbV9kYXRhOwotICAgIEludFJlY3QgbV9vcmlnUmVjdDsK
LSAgICBJbnRSZWN0IG1fcm90YXRlZE9yaWdSZWN0OwotICAgIEhEQyBtX21lbURjOwotICAgIFJl
ZlB0cjxTaGFyZWRCaXRtYXA+IG1fYml0bWFwOwotICAgIFJlZlB0cjxTaGFyZWRCaXRtYXA+IG1f
cm90YXRlZEJpdG1hcDsKLSAgICBSRUNUIG1fYm1wUmVjdDsKLSAgICB1bnNpZ25lZCBtX2tleTE7
Ci0gICAgdW5zaWduZWQgbV9rZXkyOwotICAgIFJvdGF0aW9uVHJhbnNmb3JtIG1fcm90YXRpb247
Ci0gICAgZmxvYXQgbV9vbGRPcGFjaXR5OwotICAgIEFscGhhUGFpbnRUeXBlIG1fYWxwaGFQYWlu
dFR5cGU7Ci19OwotCi1UcmFuc3BhcmVudExheWVyREM6OlRyYW5zcGFyZW50TGF5ZXJEQyhHcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUqIGRhdGEsIEludFJlY3QmIG9yaWdSZWN0LCBjb25z
dCBJbnRSZWN0KiByZWN0QmVmb3JlVHJhbnNmb3JtLCBpbnQgYWxwaGEsIGJvb2wgcGFpbnRJbWFn
ZSkKLTogbV9kYXRhKGRhdGEpCi0sIG1fb3JpZ1JlY3Qob3JpZ1JlY3QpCi0sIG1fb2xkT3BhY2l0
eShkYXRhLT5tX29wYWNpdHkpCi0vLyBtX2tleTEgYW5kIG1fa2V5MiBhcmUgbm90IGluaXRhbGl6
ZWQgaGVyZS4gVGhleSBhcmUgdXNlZCBvbmx5IGluIHRoZSBjYXNlIHRoYXQKLS8vIFNoYXJlZEJp
dG1hcDo6Z2V0REMoKSBpcyBjYWxsZWQsIEkuRS4sIHdoZW4gbV9iaXRtYXAgaXMgbm90IG51bGwu
Ci17Ci0gICAgbV9kYXRhLT5tX29wYWNpdHkgKj0gYWxwaGEgLyAyNTUuOwotICAgIGJvb2wgbXVz
dENyZWF0ZUxheWVyOwotICAgIGlmICghbV9kYXRhLT5oYXNBbHBoYSgpKSB7Ci0gICAgICAgIG11
c3RDcmVhdGVMYXllciA9IGZhbHNlOwotICAgICAgICBtX2FscGhhUGFpbnRUeXBlID0gQWxwaGFQ
YWludE5vbmU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbXVzdENyZWF0ZUxheWVyID0gdHJ1ZTsK
LSAgICAgICAgbV9hbHBoYVBhaW50VHlwZSA9IHBhaW50SW1hZ2UgPyBBbHBoYVBhaW50SW1hZ2Ug
OiBBbHBoYVBhaW50T3RoZXI7Ci0gICAgfQotICAgIGlmIChyZWN0QmVmb3JlVHJhbnNmb3JtICYm
ICFpc1plcm8obV9kYXRhLT5tX3RyYW5zZm9ybS5iKCkpKSB7Ci0gICAgICAgIG1fcm90YXRlZE9y
aWdSZWN0ID0gb3JpZ1JlY3Q7Ci0gICAgICAgIG1fcm90YXRlZEJpdG1hcCA9IG1fZGF0YS0+Z2V0
VHJhbnNwYXJlbnRMYXllckJpdG1hcChtX3JvdGF0ZWRPcmlnUmVjdCwgbV9hbHBoYVBhaW50VHlw
ZSwgbV9ibXBSZWN0LCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgIGlmIChtX3JvdGF0ZWRCaXRtYXAp
IHsKLSAgICAgICAgICAgIGRvdWJsZSBhID0gbV9kYXRhLT5tX3RyYW5zZm9ybS5hKCk7Ci0gICAg
ICAgICAgICBkb3VibGUgYiA9IG1fZGF0YS0+bV90cmFuc2Zvcm0uYigpOwotICAgICAgICAgICAg
ZG91YmxlIGMgPSBfaHlwb3QoYSwgYik7Ci0gICAgICAgICAgICBtX3JvdGF0aW9uLm1fY29zQSA9
IGEgLyBjOwotICAgICAgICAgICAgbV9yb3RhdGlvbi5tX3NpbkEgPSBiIC8gYzsKLQotICAgICAg
ICAgICAgaW50IGNlbnRlclggPSBvcmlnUmVjdC54KCkgKyBvcmlnUmVjdC53aWR0aCgpIC8gMjsK
LSAgICAgICAgICAgIGludCBjZW50ZXJZID0gb3JpZ1JlY3QueSgpICsgb3JpZ1JlY3QuaGVpZ2h0
KCkgLyAyOwotICAgICAgICAgICAgbV9yb3RhdGlvbi5tX3ByZVNoaWZ0WCA9IC1jZW50ZXJYOwot
ICAgICAgICAgICAgbV9yb3RhdGlvbi5tX3ByZVNoaWZ0WSA9IC1jZW50ZXJZOwotICAgICAgICAg
ICAgbV9yb3RhdGlvbi5tX3Bvc3RTaGlmdFggPSBjZW50ZXJYOwotICAgICAgICAgICAgbV9yb3Rh
dGlvbi5tX3Bvc3RTaGlmdFkgPSBjZW50ZXJZOwotCi0gICAgICAgICAgICBtX29yaWdSZWN0ID0g
bWFwUmVjdChtX3JvdGF0ZWRPcmlnUmVjdCwgbV9yb3RhdGlvbik7Ci0KLSAgICAgICAgICAgIG1f
cm90YXRpb24ubV9wcmVTaGlmdFggKz0gbV9yb3RhdGVkT3JpZ1JlY3QueCgpOwotICAgICAgICAg
ICAgbV9yb3RhdGlvbi5tX3ByZVNoaWZ0WSArPSBtX3JvdGF0ZWRPcmlnUmVjdC55KCk7Ci0gICAg
ICAgICAgICBtX3JvdGF0aW9uLm1fcG9zdFNoaWZ0WCAtPSBtX29yaWdSZWN0LngoKTsKLSAgICAg
ICAgICAgIG1fcm90YXRpb24ubV9wb3N0U2hpZnRZIC09IG1fb3JpZ1JlY3QueSgpOwotCi0gICAg
ICAgICAgICBGbG9hdFBvaW50IHRvcExlZnQgPSBtX2RhdGEtPm1fdHJhbnNmb3JtLm1hcFBvaW50
KEZsb2F0UG9pbnQocmVjdEJlZm9yZVRyYW5zZm9ybS0+dG9wTGVmdCgpKSk7Ci0gICAgICAgICAg
ICBGbG9hdFBvaW50IHRvcFJpZ2h0KHJlY3RCZWZvcmVUcmFuc2Zvcm0tPnJpZ2h0KCkgLSAxLCBy
ZWN0QmVmb3JlVHJhbnNmb3JtLT55KCkpOwotICAgICAgICAgICAgdG9wUmlnaHQgPSBtX2RhdGEt
Pm1fdHJhbnNmb3JtLm1hcFBvaW50KHRvcFJpZ2h0KTsKLSAgICAgICAgICAgIEZsb2F0UG9pbnQg
Ym90dG9tTGVmdChyZWN0QmVmb3JlVHJhbnNmb3JtLT54KCksIHJlY3RCZWZvcmVUcmFuc2Zvcm0t
PmJvdHRvbSgpIC0gMSk7Ci0gICAgICAgICAgICBib3R0b21MZWZ0ID0gbV9kYXRhLT5tX3RyYW5z
Zm9ybS5tYXBQb2ludChib3R0b21MZWZ0KTsKLSAgICAgICAgICAgIEZsb2F0U2l6ZSBzaWRlVG9w
ID0gdG9wUmlnaHQgLSB0b3BMZWZ0OwotICAgICAgICAgICAgRmxvYXRTaXplIHNpZGVMZWZ0ID0g
Ym90dG9tTGVmdCAtIHRvcExlZnQ7Ci0gICAgICAgICAgICBmbG9hdCB3aWR0aCA9IF9oeXBvdChz
aWRlVG9wLndpZHRoKCkgKyAxLCBzaWRlVG9wLmhlaWdodCgpICsgMSk7Ci0gICAgICAgICAgICBm
bG9hdCBoZWlnaHQgPSBfaHlwb3Qoc2lkZUxlZnQud2lkdGgoKSArIDEsIHNpZGVMZWZ0LmhlaWdo
dCgpICsgMSk7Ci0KLSAgICAgICAgICAgIG9yaWdSZWN0LmluZmxhdGVYKHN0YWJsZVJvdW5kKCh3
aWR0aCAtIG9yaWdSZWN0LndpZHRoKCkpICogMC41KSk7Ci0gICAgICAgICAgICBvcmlnUmVjdC5p
bmZsYXRlWShzdGFibGVSb3VuZCgoaGVpZ2h0IC0gb3JpZ1JlY3QuaGVpZ2h0KCkpICogMC41KSk7
Ci0KLSAgICAgICAgICAgIG1fYml0bWFwID0gU2hhcmVkQml0bWFwOjpjcmVhdGVJbnN0YW5jZSht
X3JvdGF0ZWRCaXRtYXAtPmlzMTZiaXQoKSwgbV9vcmlnUmVjdC53aWR0aCgpLCBtX29yaWdSZWN0
LmhlaWdodCgpLCB0cnVlKTsKLSAgICAgICAgICAgIGlmIChtX2JpdG1hcCkKLSAgICAgICAgICAg
ICAgICByb3RhdGVCaXRtYXAobV9iaXRtYXAuZ2V0KCksIG1fcm90YXRlZEJpdG1hcC5nZXQoKSwg
LW1fcm90YXRpb24pOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1fcm90YXRl
ZEJpdG1hcCA9IDA7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UKLSAgICAgICAgbV9iaXRtYXAgPSBt
X2RhdGEtPmdldFRyYW5zcGFyZW50TGF5ZXJCaXRtYXAobV9vcmlnUmVjdCwgbV9hbHBoYVBhaW50
VHlwZSwgbV9ibXBSZWN0LCB0cnVlLCBtdXN0Q3JlYXRlTGF5ZXIpOwotICAgIGlmIChtX2JpdG1h
cCkKLSAgICAgICAgbV9tZW1EYyA9IG1fYml0bWFwLT5nZXREQygmbV9rZXkxLCAmbV9rZXkyKTsK
LSAgICBlbHNlCi0gICAgICAgIG1fbWVtRGMgPSBtX2RhdGEtPm1fZGM7Ci19Ci0KLVRyYW5zcGFy
ZW50TGF5ZXJEQzo6flRyYW5zcGFyZW50TGF5ZXJEQygpCi17Ci0gICAgaWYgKG1fcm90YXRlZEJp
dG1hcCkgewotICAgICAgICBtX2JpdG1hcC0+cmVsZWFzZURDKG1fbWVtRGMsIG1fa2V5MSwgbV9r
ZXkyKTsKLSAgICAgICAgbV9rZXkxID0gbV9rZXkyID0gMDsKLSAgICAgICAgcm90YXRlQml0bWFw
KG1fcm90YXRlZEJpdG1hcC5nZXQoKSwgbV9iaXRtYXAuZ2V0KCksIG1fcm90YXRpb24pOwotICAg
ICAgICBtX21lbURjID0gbV9yb3RhdGVkQml0bWFwLT5nZXREQygmbV9rZXkxLCAmbV9rZXkyKTsK
LSAgICAgICAgbV9kYXRhLT5wYWludEJhY2tUcmFuc3BhcmVudExheWVyQml0bWFwKG1fbWVtRGMs
IG1fcm90YXRlZEJpdG1hcC5nZXQoKSwgbV9yb3RhdGVkT3JpZ1JlY3QsIG1fYWxwaGFQYWludFR5
cGUsIG1fYm1wUmVjdCk7Ci0gICAgICAgIG1fcm90YXRlZEJpdG1hcC0+cmVsZWFzZURDKG1fbWVt
RGMsIG1fa2V5MSwgbV9rZXkyKTsKLSAgICB9IGVsc2UgaWYgKG1fYml0bWFwKSB7Ci0gICAgICAg
IG1fZGF0YS0+cGFpbnRCYWNrVHJhbnNwYXJlbnRMYXllckJpdG1hcChtX21lbURjLCBtX2JpdG1h
cC5nZXQoKSwgbV9vcmlnUmVjdCwgbV9hbHBoYVBhaW50VHlwZSwgbV9ibXBSZWN0KTsKLSAgICAg
ICAgbV9iaXRtYXAtPnJlbGVhc2VEQyhtX21lbURjLCBtX2tleTEsIG1fa2V5Mik7Ci0gICAgfQot
ICAgIG1fZGF0YS0+bV9vcGFjaXR5ID0gbV9vbGRPcGFjaXR5OwotfQotCi12b2lkIFRyYW5zcGFy
ZW50TGF5ZXJEQzo6ZmlsbEFscGhhQ2hhbm5lbCgpCi17Ci0gICAgaWYgKCFtX2JpdG1hcCB8fCAh
bV9iaXRtYXAtPmlzMzJiaXQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgdW5zaWduZWQqIHBp
eGVscyA9ICh1bnNpZ25lZCopbV9iaXRtYXAtPmJ5dGVzKCk7Ci0gICAgY29uc3QgdW5zaWduZWQq
IGNvbnN0IHBpeGVsc0VuZCA9IHBpeGVscyArIG1fYml0bWFwLT5iaXRtYXBJbmZvKCkubnVtUGl4
ZWxzKCk7Ci0gICAgd2hpbGUgKHBpeGVscyA8IHBpeGVsc0VuZCkgewotICAgICAgICAqcGl4ZWxz
IHw9IDB4RkYwMDAwMDA7Ci0gICAgICAgICsrcGl4ZWxzOwotICAgIH0KLX0KLQotY2xhc3MgU2Nv
cGVEQ1Byb3ZpZGVyIDogTm9uY29weWFibGUgewotcHVibGljOgotICAgIGV4cGxpY2l0IFNjb3Bl
RENQcm92aWRlcihHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUqIGRhdGEpCi0gICAgICAg
IDogbV9kYXRhKGRhdGEpCi0gICAgewotICAgICAgICBpZiAobV9kYXRhLT5tX2JpdG1hcCkKLSAg
ICAgICAgICAgIG1fZGF0YS0+bV9kYyA9IG1fZGF0YS0+bV9iaXRtYXAtPmdldERDKCZtX2tleTEs
ICZtX2tleTIpOwotICAgIH0KLSAgICB+U2NvcGVEQ1Byb3ZpZGVyKCkKLSAgICB7Ci0gICAgICAg
IGlmIChtX2RhdGEtPm1fYml0bWFwKSB7Ci0gICAgICAgICAgICBtX2RhdGEtPm1fYml0bWFwLT5y
ZWxlYXNlREMobV9kYXRhLT5tX2RjLCBtX2tleTEsIG1fa2V5Mik7Ci0gICAgICAgICAgICBtX2Rh
dGEtPm1fZGMgPSAwOwotICAgICAgICB9Ci0gICAgfQotcHJpdmF0ZToKLSAgICBHcmFwaGljc0Nv
bnRleHRQbGF0Zm9ybVByaXZhdGUqIG1fZGF0YTsKLSAgICB1bnNpZ25lZCBtX2tleTE7Ci0gICAg
dW5zaWduZWQgbV9rZXkyOwotfTsKLQotCi1HcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4
dChQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCogZGMpCi06IG1fY29tbW9uKGNyZWF0ZUdyYXBoaWNz
Q29udGV4dFByaXZhdGUoKSkKLSwgbV9kYXRhKG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVBy
aXZhdGUoZGMpKQotewotfQotCi1HcmFwaGljc0NvbnRleHQ6On5HcmFwaGljc0NvbnRleHQoKQot
ewotICAgIGRlc3Ryb3lHcmFwaGljc0NvbnRleHRQcml2YXRlKG1fY29tbW9uKTsKLSAgICBkZWxl
dGUgbV9kYXRhOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0Qml0bWFwKFBhc3NSZWZQ
dHI8U2hhcmVkQml0bWFwPiBibXApCi17Ci0gICAgQVNTRVJUKCFtX2RhdGEtPm1fZGMpOwotICAg
IG1fZGF0YS0+bV9iaXRtYXAgPSBibXA7Ci19Ci0KLUhEQyBHcmFwaGljc0NvbnRleHQ6OmdldFdp
bmRvd3NDb250ZXh0KGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGJvb2wgc3VwcG9ydEFscGhhQmxl
bmQsIGJvb2wgbWF5Q3JlYXRlQml0bWFwKQotewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgR3JhcGhpY3ND
b250ZXh0OjpyZWxlYXNlV2luZG93c0NvbnRleHQoSERDIGhkYywgY29uc3QgSW50UmVjdCYgZHN0
UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVuZCwgYm9vbCBtYXlDcmVhdGVCaXRtYXApCi17Ci0g
ICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLX0KLQotdm9p
ZCBHcmFwaGljc0NvbnRleHQ6OnNhdmVQbGF0Zm9ybVN0YXRlKCkKLXsKLSAgICBtX2RhdGEtPnNh
dmUoKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnJlc3RvcmVQbGF0Zm9ybVN0YXRlKCkK
LXsKLSAgICBtX2RhdGEtPnJlc3RvcmUoKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRy
YXdSZWN0KGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgaWYgKCFtX2RhdGEtPm1fb3BhY2l0
eSB8fCBwYWludGluZ0Rpc2FibGVkKCkgfHwgcmVjdC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIFNjb3BlRENQcm92aWRlciBkY1Byb3ZpZGVyKG1fZGF0YSk7Ci0gICAgaWYgKCFt
X2RhdGEtPm1fZGMpCi0gICAgICAgIHJldHVybjsKLQotICAgIEludFJlY3QgdHJSZWN0ID0gbV9k
YXRhLT5tYXBSZWN0KHJlY3QpOwotICAgIFRyYW5zcGFyZW50TGF5ZXJEQyB0cmFuc3BhcmVudERD
KG1fZGF0YSwgdHJSZWN0LCAmcmVjdCk7Ci0gICAgSERDIGRjID0gdHJhbnNwYXJlbnREQy5oZGMo
KTsKLSAgICBpZiAoIWRjKQotICAgICAgICByZXR1cm47Ci0gICAgdHJSZWN0Lm1vdmUodHJhbnNw
YXJlbnREQy50b1NoaWZ0KCkpOwotCi0gICAgSEdESU9CSiBicnVzaCA9IDA7Ci0gICAgSEdESU9C
SiBvbGRCcnVzaDsKLSAgICBpZiAoZmlsbENvbG9yKCkuYWxwaGEoKSkgewotICAgICAgICBicnVz
aCA9IGNyZWF0ZUJydXNoKGZpbGxDb2xvcigpKTsKLSAgICAgICAgb2xkQnJ1c2ggPSBTZWxlY3RP
YmplY3QoZGMsIGJydXNoKTsKLSAgICB9IGVsc2UKLSAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBH
ZXRTdG9ja09iamVjdChOVUxMX0JSVVNIKSk7Ci0KLSAgICBIR0RJT0JKIHBlbiA9IDA7Ci0gICAg
SEdESU9CSiBvbGRQZW47Ci0gICAgaWYgKHN0cm9rZVN0eWxlKCkgIT0gTm9TdHJva2UpIHsKLSAg
ICAgICAgcGVuID0gY3JlYXRlUGVuKHN0cm9rZUNvbG9yKCksIHN0cm9rZVRoaWNrbmVzcygpLCBz
dHJva2VTdHlsZSgpKTsKLSAgICAgICAgb2xkUGVuID0gU2VsZWN0T2JqZWN0KGRjLCBwZW4pOwot
ICAgIH0gZWxzZQotICAgICAgICBTZWxlY3RPYmplY3QoZGMsIEdldFN0b2NrT2JqZWN0KE5VTExf
UEVOKSk7Ci0KLSAgICBpZiAoIWJydXNoICYmICFwZW4pCi0gICAgICAgIHJldHVybjsKLQotICAg
IGlmICh0clJlY3Qud2lkdGgoKSA8PSAwKQotICAgICAgICB0clJlY3Quc2V0V2lkdGgoMSk7Ci0g
ICAgaWYgKHRyUmVjdC5oZWlnaHQoKSA8PSAwKQotICAgICAgICB0clJlY3Quc2V0SGVpZ2h0KDEp
OwotCi0gICAgUmVjdGFuZ2xlKGRjLCB0clJlY3QueCgpLCB0clJlY3QueSgpLCB0clJlY3Qucmln
aHQoKSwgdHJSZWN0LmJvdHRvbSgpKTsKLQotICAgIGlmIChwZW4pIHsKLSAgICAgICAgU2VsZWN0
T2JqZWN0KGRjLCBvbGRQZW4pOwotICAgICAgICBEZWxldGVPYmplY3QocGVuKTsKLSAgICB9Ci0K
LSAgICBpZiAoYnJ1c2gpIHsKLSAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBvbGRCcnVzaCk7Ci0g
ICAgICAgIERlbGV0ZU9iamVjdChicnVzaCk7Ci0gICAgfQotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDo6ZHJhd0xpbmUoY29uc3QgSW50UG9pbnQmIHBvaW50MSwgY29uc3QgSW50UG9pbnQmIHBv
aW50MikKLXsKLSAgICBpZiAoIW1fZGF0YS0+bV9vcGFjaXR5IHx8IHBhaW50aW5nRGlzYWJsZWQo
KSB8fCBzdHJva2VTdHlsZSgpID09IE5vU3Ryb2tlIHx8ICFzdHJva2VDb2xvcigpLmFscGhhKCkp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIFNjb3BlRENQcm92aWRlciBkY1Byb3ZpZGVyKG1fZGF0
YSk7Ci0gICAgaWYgKCFtX2RhdGEtPm1fZGMpCi0gICAgICAgIHJldHVybjsKLQotICAgIEludFBv
aW50IHRyUG9pbnQxID0gbV9kYXRhLT5tYXBQb2ludChwb2ludDEpOwotICAgIEludFBvaW50IHRy
UG9pbnQyID0gbV9kYXRhLT5tYXBQb2ludChwb2ludDIpOwotCi0gICAgSW50UmVjdCBsaW5lUmVj
dCh0clBvaW50MSwgdHJQb2ludDIgLSB0clBvaW50MSk7Ci0gICAgbGluZVJlY3Quc2V0SGVpZ2h0
KGxpbmVSZWN0LmhlaWdodCgpICsgc3Ryb2tlVGhpY2tuZXNzKCkpOwotICAgIFRyYW5zcGFyZW50
TGF5ZXJEQyB0cmFuc3BhcmVudERDKG1fZGF0YSwgbGluZVJlY3QsIDAsIHN0cm9rZUNvbG9yKCku
YWxwaGEoKSk7Ci0gICAgSERDIGRjID0gdHJhbnNwYXJlbnREQy5oZGMoKTsKLSAgICBpZiAoIWRj
KQotICAgICAgICByZXR1cm47Ci0gICAgdHJQb2ludDEgKz0gdHJhbnNwYXJlbnREQy50b1NoaWZ0
KCk7Ci0gICAgdHJQb2ludDIgKz0gdHJhbnNwYXJlbnREQy50b1NoaWZ0KCk7Ci0KLSAgICBIR0RJ
T0JKIHBlbiA9IGNyZWF0ZVBlbihzdHJva2VDb2xvcigpLCBzdHJva2VUaGlja25lc3MoKSwgc3Ry
b2tlU3R5bGUoKSk7Ci0gICAgSEdESU9CSiBvbGRQZW4gPSBTZWxlY3RPYmplY3QoZGMsIHBlbik7
Ci0KLSAgICBNb3ZlVG9FeChkYywgdHJQb2ludDEueCgpLCB0clBvaW50MS55KCksIDApOwotICAg
IExpbmVUbyhkYywgdHJQb2ludDIueCgpLCB0clBvaW50Mi55KCkpOwotCi0gICAgU2VsZWN0T2Jq
ZWN0KGRjLCBvbGRQZW4pOwotICAgIERlbGV0ZU9iamVjdChwZW4pOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDo6ZHJhd0VsbGlwc2UoY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICBpZiAo
IW1fZGF0YS0+bV9vcGFjaXR5IHx8IHBhaW50aW5nRGlzYWJsZWQoKSB8fCAoIWZpbGxDb2xvcigp
LmFscGhhKCkgJiYgc3Ryb2tlU3R5bGUoKSA9PSBOb1N0cm9rZSkpCi0gICAgICAgIHJldHVybjsK
LQotICAgIFNjb3BlRENQcm92aWRlciBkY1Byb3ZpZGVyKG1fZGF0YSk7Ci0gICAgaWYgKCFtX2Rh
dGEtPm1fZGMpCi0gICAgICAgIHJldHVybjsKLQotICAgIEludFJlY3QgdHJSZWN0ID0gbV9kYXRh
LT5tYXBSZWN0KHJlY3QpOwotICAgIFRyYW5zcGFyZW50TGF5ZXJEQyB0cmFuc3BhcmVudERDKG1f
ZGF0YSwgdHJSZWN0LCAmcmVjdCk7Ci0gICAgSERDIGRjID0gdHJhbnNwYXJlbnREQy5oZGMoKTsK
LSAgICBpZiAoIWRjKQotICAgICAgICByZXR1cm47Ci0gICAgdHJSZWN0Lm1vdmUodHJhbnNwYXJl
bnREQy50b1NoaWZ0KCkpOwotCi0gICAgSEdESU9CSiBicnVzaCA9IDA7Ci0gICAgSEdESU9CSiBv
bGRCcnVzaDsKLSAgICBpZiAoZmlsbENvbG9yKCkuYWxwaGEoKSkgewotICAgICAgICBicnVzaCA9
IGNyZWF0ZUJydXNoKGZpbGxDb2xvcigpKTsKLSAgICAgICAgb2xkQnJ1c2ggPSBTZWxlY3RPYmpl
Y3QoZGMsIGJydXNoKTsKLSAgICB9IGVsc2UKLSAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBHZXRT
dG9ja09iamVjdChOVUxMX0JSVVNIKSk7Ci0gICAgSEdESU9CSiBwZW4gPSAwOwotICAgIEhHRElP
Qkogb2xkUGVuOwotICAgIGlmIChzdHJva2VTdHlsZSgpICE9IE5vU3Ryb2tlKSB7Ci0gICAgICAg
IHBlbiA9IGNyZWF0ZVBlbihzdHJva2VDb2xvcigpLCBzdHJva2VUaGlja25lc3MoKSwgc3Ryb2tl
U3R5bGUoKSk7Ci0gICAgICAgIG9sZFBlbiA9IFNlbGVjdE9iamVjdChkYywgcGVuKTsKLSAgICB9
IGVsc2UKLSAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBHZXRTdG9ja09iamVjdChOVUxMX1BFTikp
OwotCi0gICAgRWxsaXBzZShkYywgdHJSZWN0LngoKSwgdHJSZWN0LnkoKSwgdHJSZWN0LnJpZ2h0
KCksIHRyUmVjdC5ib3R0b20oKSk7Ci0KLSAgICBpZiAocGVuKSB7Ci0gICAgICAgIFNlbGVjdE9i
amVjdChkYywgb2xkUGVuKTsKLSAgICAgICAgRGVsZXRlT2JqZWN0KHBlbik7Ci0gICAgfQotCi0g
ICAgaWYgKGJydXNoKSB7Ci0gICAgICAgIFNlbGVjdE9iamVjdChkYywgb2xkQnJ1c2gpOwotICAg
ICAgICBEZWxldGVPYmplY3QoYnJ1c2gpOwotICAgIH0KLX0KLQotc3RhdGljIGlubGluZSBib29s
IGVxdWFsQW5nbGUoZG91YmxlIGEsIGRvdWJsZSBiKSAKLXsKLSAgICByZXR1cm4gZmFicyhhIC0g
YikgPCAxRS01OwotfQotCi12b2lkIGdldEVsbGlwc2VQb2ludEJ5QW5nbGUoZG91YmxlIGFuZ2xl
LCBkb3VibGUgYSwgZG91YmxlIGIsIGZsb2F0JiB4LCBmbG9hdCYgeSkKLXsKLSAgICB3aGlsZSAo
YW5nbGUgPCAwKQotICAgICAgICBhbmdsZSArPSAyICogcGlEb3VibGU7Ci0gICAgd2hpbGUgKGFu
Z2xlID49IDIgKiBwaURvdWJsZSkKLSAgICAgICAgYW5nbGUgLT0gMiAqIHBpRG91YmxlOwotCi0g
ICAgaWYgKGVxdWFsQW5nbGUoYW5nbGUsIDApIHx8IGVxdWFsQW5nbGUoYW5nbGUsIDIgKiBwaURv
dWJsZSkpIHsKLSAgICAgICAgeCA9IGE7Ci0gICAgICAgIHkgPSAwOwotICAgIH0gZWxzZSBpZiAo
ZXF1YWxBbmdsZShhbmdsZSwgcGlEb3VibGUpKSB7Ci0gICAgICAgIHggPSAtYTsKLSAgICAgICAg
eSA9IDA7Ci0gICAgfSBlbHNlIGlmIChlcXVhbEFuZ2xlKGFuZ2xlLCAuNSAqIHBpRG91YmxlKSkg
ewotICAgICAgICB4ID0gMDsKLSAgICAgICAgeSA9IGI7Ci0gICAgfSBlbHNlIGlmIChlcXVhbEFu
Z2xlKGFuZ2xlLCAxLjUgKiBwaURvdWJsZSkpIHsKLSAgICAgICAgeCA9IDA7Ci0gICAgICAgIHkg
PSAtYjsKLSAgICB9IGVsc2UgewotICAgICAgICBkb3VibGUgayA9IHRhbihhbmdsZSk7Ci0gICAg
ICAgIGRvdWJsZSBzcUEgPSBhICogYTsKLSAgICAgICAgZG91YmxlIHNxQiA9IGIgKiBiOwotICAg
ICAgICBkb3VibGUgdG1wID0gMS4gLyAoMS4gLyBzcUEgKyAoayAqIGspIC8gc3FCKTsKLSAgICAg
ICAgdG1wID0gdG1wIDw9IDAgPyAwIDogc3FydCh0bXApOwotICAgICAgICBpZiAoYW5nbGUgPiAu
NSAqIHBpRG91YmxlICYmIGFuZ2xlIDwgMS41ICogcGlEb3VibGUpCi0gICAgICAgICAgICB0bXAg
PSAtdG1wOwotICAgICAgICB4ID0gdG1wOwotCi0gICAgICAgIGsgPSB0YW4oLjUgKiBwaURvdWJs
ZSAtIGFuZ2xlKTsKLSAgICAgICAgdG1wID0gMS4gLyAoKGsgKiBrKSAvIHNxQSArIDEgLyBzcUIp
OwotICAgICAgICB0bXAgPSB0bXAgPD0gMCA/IDAgOiBzcXJ0KHRtcCk7Ci0gICAgICAgIGlmIChh
bmdsZSA+IHBpRG91YmxlKQotICAgICAgICAgICAgdG1wID0gLXRtcDsKLSAgICAgICAgeSA9IHRt
cDsKLSAgICB9Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzdHJva2VBcmMoY29uc3QgSW50
UmVjdCYgcmVjdCwgaW50IHN0YXJ0QW5nbGUsIGludCBhbmdsZVNwYW4pCi17Ci0gICAgaWYgKCFt
X2RhdGEtPm1fb3BhY2l0eSB8fCBwYWludGluZ0Rpc2FibGVkKCkgfHwgc3Ryb2tlU3R5bGUoKSA9
PSBOb1N0cm9rZSB8fCByZWN0LmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgU2Nv
cGVEQ1Byb3ZpZGVyIGRjUHJvdmlkZXIobV9kYXRhKTsKLSAgICBpZiAoIW1fZGF0YS0+bV9kYykK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgSW50UmVjdCB0clJlY3QgPSBtX2RhdGEtPm1hcFJlY3Qo
cmVjdCk7Ci0gICAgVHJhbnNwYXJlbnRMYXllckRDIHRyYW5zcGFyZW50REMobV9kYXRhLCB0clJl
Y3QsICZyZWN0KTsKLSAgICBIREMgZGMgPSB0cmFuc3BhcmVudERDLmhkYygpOwotICAgIGlmICgh
ZGMpCi0gICAgICAgIHJldHVybjsKLSAgICB0clJlY3QubW92ZSh0cmFuc3BhcmVudERDLnRvU2hp
ZnQoKSk7Ci0KLSAgICBIR0RJT0JKIHBlbiA9IGNyZWF0ZVBlbihzdHJva2VDb2xvcigpLCBzdHJv
a2VUaGlja25lc3MoKSwgc3Ryb2tlU3R5bGUoKSk7Ci0gICAgSEdESU9CSiBvbGRQZW4gPSBTZWxl
Y3RPYmplY3QoZGMsIHBlbik7Ci0KLSAgICBkb3VibGUgYSA9IHRyUmVjdC53aWR0aCgpICogMC41
OwotICAgIGRvdWJsZSBiID0gdHJSZWN0LmhlaWdodCgpICogMC41OwotICAgIGludCBjZW50ZXJY
ID0gc3RhYmxlUm91bmQodHJSZWN0LngoKSArIGEpOwotICAgIGludCBjZW50ZXJZID0gc3RhYmxl
Um91bmQodHJSZWN0LnkoKSArIGIpOwotICAgIGZsb2F0IGZzdGFydFgsIGZzdGFydFksIGZlbmRY
LCBmZW5kWTsKLSAgICBpbnQgc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFk7Ci0gICAgZ2V0RWxs
aXBzZVBvaW50QnlBbmdsZShkZWcycmFkKChkb3VibGUpc3RhcnRBbmdsZSksIGEsIGIsIGZzdGFy
dFgsIGZzdGFydFkpOwotICAgIGdldEVsbGlwc2VQb2ludEJ5QW5nbGUoZGVnMnJhZCgoZG91Ymxl
KXN0YXJ0QW5nbGUgKyBhbmdsZVNwYW4pLCBhLCBiLCBmZW5kWCwgZmVuZFkpOwotICAgIHN0YXJ0
WCA9IHN0YWJsZVJvdW5kKGZzdGFydFgpOwotICAgIHN0YXJ0WSA9IHN0YWJsZVJvdW5kKGZzdGFy
dFkpOwotICAgIGVuZFggPSBzdGFibGVSb3VuZChmZW5kWCk7Ci0gICAgZW5kWSA9IHN0YWJsZVJv
dW5kKGZlbmRZKTsKLQotICAgIHN0YXJ0WCArPSBjZW50ZXJYOwotICAgIHN0YXJ0WSA9IGNlbnRl
clkgLSBzdGFydFk7Ci0gICAgZW5kWCArPSBjZW50ZXJYOwotICAgIGVuZFkgPSBjZW50ZXJZIC0g
ZW5kWTsKLSAgICBSRUNUIGNsaXBSZWN0OwotICAgIGlmIChzdGFydFggPCBlbmRYKSB7Ci0gICAg
ICAgIGNsaXBSZWN0LmxlZnQgPSBzdGFydFg7Ci0gICAgICAgIGNsaXBSZWN0LnJpZ2h0ID0gZW5k
WDsKLSAgICB9IGVsc2UgewotICAgICAgICBjbGlwUmVjdC5sZWZ0ID0gZW5kWDsKLSAgICAgICAg
Y2xpcFJlY3QucmlnaHQgPSBzdGFydFg7Ci0gICAgfQotICAgIGlmIChzdGFydFkgPCBlbmRZKSB7
Ci0gICAgICAgIGNsaXBSZWN0LnRvcCA9IHN0YXJ0WTsKLSAgICAgICAgY2xpcFJlY3QuYm90dG9t
ID0gZW5kWTsKLSAgICB9IGVsc2UgewotICAgICAgICBjbGlwUmVjdC50b3AgPSBlbmRZOwotICAg
ICAgICBjbGlwUmVjdC5ib3R0b20gPSBzdGFydFk7Ci0gICAgfQotCi0gICAgT3duUHRyPEhSR04+
IGNsaXBSZ24oQ3JlYXRlUmVjdFJnbigwLCAwLCAwLCAwKSk7Ci0gICAgYm9vbCBuZXdDbGlwOwot
ICAgIGlmIChHZXRDbGlwUmduKGRjLCBjbGlwUmduLmdldCgpKSA8PSAwKSB7Ci0gICAgICAgIG5l
d0NsaXAgPSB0cnVlOwotICAgICAgICBjbGlwUmduLnNldChDcmVhdGVSZWN0UmduKGNsaXBSZWN0
LmxlZnQsIGNsaXBSZWN0LnRvcCwgY2xpcFJlY3QucmlnaHQsIGNsaXBSZWN0LmJvdHRvbSkpOwot
ICAgICAgICBTZWxlY3RDbGlwUmduKGRjLCBjbGlwUmduLmdldCgpKTsKLSAgICB9IGVsc2Ugewot
ICAgICAgICBuZXdDbGlwID0gZmFsc2U7Ci0gICAgICAgIEludGVyc2VjdENsaXBSZWN0KGRjLCBj
bGlwUmVjdC5sZWZ0LCBjbGlwUmVjdC50b3AsIGNsaXBSZWN0LnJpZ2h0LCBjbGlwUmVjdC5ib3R0
b20pOwotICAgIH0KLQotICAgIEhHRElPQkogb2xkQnJ1c2ggPSBTZWxlY3RPYmplY3QoZGMsIEdl
dFN0b2NrT2JqZWN0KE5VTExfQlJVU0gpKTsKLSAgICBFbGxpcHNlKGRjLCB0clJlY3QueCgpLCB0
clJlY3QueSgpLCB0clJlY3QucmlnaHQoKSwgdHJSZWN0LmJvdHRvbSgpKTsKLSAgICBTZWxlY3RP
YmplY3QoZGMsIG9sZEJydXNoKTsKLQotICAgIGlmIChuZXdDbGlwKQotICAgICAgICBTZWxlY3RD
bGlwUmduKGRjLCAwKTsKLSAgICBlbHNlCi0gICAgICAgIFNlbGVjdENsaXBSZ24oZGMsIGNsaXBS
Z24uZ2V0KCkpOwotCi0gICAgU2VsZWN0T2JqZWN0KGRjLCBvbGRQZW4pOwotICAgIERlbGV0ZU9i
amVjdChwZW4pOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0NvbnZleFBvbHlnb24o
c2l6ZV90IG5wb2ludHMsIGNvbnN0IEZsb2F0UG9pbnQqIHBvaW50cywgYm9vbCBzaG91bGRBbnRp
YWxpYXMpCi17Ci0gICAgaWYgKCFtX2RhdGEtPm1fb3BhY2l0eSB8fCBwYWludGluZ0Rpc2FibGVk
KCkgfHwgbnBvaW50cyA8PSAxIHx8ICFwb2ludHMpCi0gICAgICAgIHJldHVybjsKLQotICAgIFNj
b3BlRENQcm92aWRlciBkY1Byb3ZpZGVyKG1fZGF0YSk7Ci0gICAgaWYgKCFtX2RhdGEtPm1fZGMp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIFZlY3RvcjxQT0lOVCwgMjA+IHdpblBvaW50cyhucG9p
bnRzKTsKLSAgICBGbG9hdFBvaW50IHRyUG9pbnQgPSBtX2RhdGEtPm1hcFBvaW50KHBvaW50c1sw
XSk7Ci0gICAgd2luUG9pbnRzWzBdLnggPSBzdGFibGVSb3VuZCh0clBvaW50LngoKSk7Ci0gICAg
d2luUG9pbnRzWzBdLnkgPSBzdGFibGVSb3VuZCh0clBvaW50LnkoKSk7Ci0gICAgUkVDVCByZWN0
ID0geyB3aW5Qb2ludHNbMF0ueCwgd2luUG9pbnRzWzBdLnksIHdpblBvaW50c1swXS54LCB3aW5Q
b2ludHNbMF0ueSB9OwotICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbnBvaW50czsgKytpKSB7
Ci0gICAgICAgIHRyUG9pbnQgPSBtX2RhdGEtPm1hcFBvaW50KHBvaW50c1tpXSk7Ci0gICAgICAg
IHdpblBvaW50c1tpXS54ID0gc3RhYmxlUm91bmQodHJQb2ludC54KCkpOwotICAgICAgICB3aW5Q
b2ludHNbaV0ueSA9IHN0YWJsZVJvdW5kKHRyUG9pbnQueSgpKTsKLSAgICAgICAgaWYgKHJlY3Qu
bGVmdCA+IHdpblBvaW50c1tpXS54KQotICAgICAgICAgICAgcmVjdC5sZWZ0ID0gd2luUG9pbnRz
W2ldLng7Ci0gICAgICAgIGVsc2UgaWYgKHJlY3QucmlnaHQgPCB3aW5Qb2ludHNbaV0ueCkKLSAg
ICAgICAgICAgIHJlY3QucmlnaHQgPSB3aW5Qb2ludHNbaV0ueDsKLSAgICAgICAgaWYgKHJlY3Qu
dG9wID4gd2luUG9pbnRzW2ldLnkpCi0gICAgICAgICAgICByZWN0LnRvcCA9IHdpblBvaW50c1tp
XS55OwotICAgICAgICBlbHNlIGlmIChyZWN0LmJvdHRvbSA8IHdpblBvaW50c1tpXS55KQotICAg
ICAgICAgICAgcmVjdC5ib3R0b20gPSB3aW5Qb2ludHNbaV0ueTsKLSAgICB9Ci0gICAgcmVjdC5i
b3R0b20gKz0gMTsKLSAgICByZWN0LnJpZ2h0ICs9IDE7Ci0KLSAgICBJbnRSZWN0IGludFJlY3Qo
cmVjdCk7Ci0gICAgVHJhbnNwYXJlbnRMYXllckRDIHRyYW5zcGFyZW50REMobV9kYXRhLCBpbnRS
ZWN0KTsKLSAgICBIREMgZGMgPSB0cmFuc3BhcmVudERDLmhkYygpOwotICAgIGlmICghZGMpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnBvaW50czsgKytp
KSB7Ci0gICAgICAgIHdpblBvaW50c1tpXS54ICs9IHRyYW5zcGFyZW50REMudG9TaGlmdCgpLndp
ZHRoKCk7Ci0gICAgICAgIHdpblBvaW50c1tpXS55ICs9IHRyYW5zcGFyZW50REMudG9TaGlmdCgp
LmhlaWdodCgpOwotICAgIH0KLQotICAgIEhHRElPQkogYnJ1c2ggPSAwOwotICAgIEhHRElPQkog
b2xkQnJ1c2g7Ci0gICAgaWYgKGZpbGxDb2xvcigpLmFscGhhKCkpIHsKLSAgICAgICAgYnJ1c2gg
PSBjcmVhdGVCcnVzaChmaWxsQ29sb3IoKSk7Ci0gICAgICAgIG9sZEJydXNoID0gU2VsZWN0T2Jq
ZWN0KGRjLCBicnVzaCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIFNlbGVjdE9iamVjdChkYywgR2V0
U3RvY2tPYmplY3QoTlVMTF9CUlVTSCkpOwotCi0gICAgSEdESU9CSiBwZW4gPSAwOwotICAgIEhH
RElPQkogb2xkUGVuOwotICAgIGlmIChzdHJva2VTdHlsZSgpICE9IE5vU3Ryb2tlKSB7Ci0gICAg
ICAgIHBlbiA9IGNyZWF0ZVBlbihzdHJva2VDb2xvcigpLCBzdHJva2VUaGlja25lc3MoKSwgc3Ry
b2tlU3R5bGUoKSk7Ci0gICAgICAgIG9sZFBlbiA9IFNlbGVjdE9iamVjdChkYywgcGVuKTsKLSAg
ICB9IGVsc2UKLSAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBHZXRTdG9ja09iamVjdChOVUxMX1BF
TikpOwotCi0gICAgaWYgKCFicnVzaCAmJiAhcGVuKQotICAgICAgICByZXR1cm47Ci0KLSAgICBQ
b2x5Z29uKGRjLCB3aW5Qb2ludHMuZGF0YSgpLCBucG9pbnRzKTsKLQotICAgIGlmIChwZW4pIHsK
LSAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBvbGRQZW4pOwotICAgICAgICBEZWxldGVPYmplY3Qo
cGVuKTsKLSAgICB9Ci0KLSAgICBpZiAoYnJ1c2gpIHsKLSAgICAgICAgU2VsZWN0T2JqZWN0KGRj
LCBvbGRCcnVzaCk7Ci0gICAgICAgIERlbGV0ZU9iamVjdChicnVzaCk7Ci0gICAgfQotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0LCBjb25z
dCBDb2xvciYgY29sb3IsIENvbG9yU3BhY2UgY29sb3JTcGFjZSkKLXsKLSAgICBpZiAocGFpbnRp
bmdEaXNhYmxlZCgpIHx8ICFtX2RhdGEtPm1fb3BhY2l0eSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgaW50IGFscGhhID0gY29sb3IuYWxwaGEoKTsKLSAgICBpZiAoIWFscGhhKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBTY29wZURDUHJvdmlkZXIgZGNQcm92aWRlcihtX2RhdGEpOwotICAgIGlm
ICghbV9kYXRhLT5tX2RjKQotICAgICAgICByZXR1cm47Ci0KLSAgICBJbnRSZWN0IGludFJlY3Qg
PSBlbmNsb3NpbmdJbnRSZWN0KHJlY3QpOwotICAgIFRyYW5zcGFyZW50TGF5ZXJEQyB0cmFuc3Bh
cmVudERDKG1fZGF0YSwgbV9kYXRhLT5tYXBSZWN0KGludFJlY3QpLCAmaW50UmVjdCwgYWxwaGEp
OwotCi0gICAgaWYgKCF0cmFuc3BhcmVudERDLmhkYygpKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBPd25QdHI8SEJSVVNIPiBoYnJ1c2goQ3JlYXRlU29saWRCcnVzaChSR0IoY29sb3IucmVkKCks
IGNvbG9yLmdyZWVuKCksIGNvbG9yLmJsdWUoKSkpKTsKLSAgICBGaWxsUmVjdCh0cmFuc3BhcmVu
dERDLmhkYygpLCAmdHJhbnNwYXJlbnREQy5yZWN0KCksIGhicnVzaC5nZXQoKSk7Ci19Ci0KLXZv
aWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwKGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKLXsKLSAgICBp
ZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoIW1fZGF0
YS0+bV9kYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgSW50UmVjdCB0clJlY3QgPSBlbmNsb3Np
bmdJbnRSZWN0KG1fZGF0YS0+bWFwUmVjdChyZWN0KSk7Ci0KLSAgICBPd25QdHI8SFJHTj4gY2xp
cFJnbihDcmVhdGVSZWN0UmduKDAsIDAsIDAsIDApKTsKLSAgICBpZiAoR2V0Q2xpcFJnbihtX2Rh
dGEtPm1fZGMsIGNsaXBSZ24uZ2V0KCkpID4gMCkKLSAgICAgICAgSW50ZXJzZWN0Q2xpcFJlY3Qo
bV9kYXRhLT5tX2RjLCB0clJlY3QueCgpLCB0clJlY3QueSgpLCB0clJlY3QucmlnaHQoKSwgdHJS
ZWN0LmJvdHRvbSgpKTsKLSAgICBlbHNlIHsKLSAgICAgICAgY2xpcFJnbi5zZXQoQ3JlYXRlUmVj
dFJnbih0clJlY3QueCgpLCB0clJlY3QueSgpLCB0clJlY3QucmlnaHQoKSwgdHJSZWN0LmJvdHRv
bSgpKSk7Ci0gICAgICAgIFNlbGVjdENsaXBSZ24obV9kYXRhLT5tX2RjLCBjbGlwUmduLmdldCgp
KTsKLSAgICB9Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwT3V0KGNvbnN0IEludFJl
Y3QmIHJlY3QpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgaWYgKCFtX2RhdGEtPm1fZGMpCi0gICAgICAgIHJldHVybjsKLQotICAgIEludFJl
Y3QgdHJSZWN0ID0gbV9kYXRhLT5tYXBSZWN0KHJlY3QpOwotCi0gICAgRXhjbHVkZUNsaXBSZWN0
KG1fZGF0YS0+bV9kYywgdHJSZWN0LngoKSwgdHJSZWN0LnkoKSwgdHJSZWN0LnJpZ2h0KCksIHRy
UmVjdC5ib3R0b20oKSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3Rm9jdXNSaW5n
KGNvbnN0IFZlY3RvcjxQYXRoPiYgcGF0aHMsIGludCB3aWR0aCwgaW50IG9mZnNldCwgY29uc3Qg
Q29sb3ImIGNvbG9yKQotewotICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQ6OmRyYXdGb2N1c1JpbmcoY29uc3QgVmVjdG9yPEludFJlY3Q+JiByZWN0cywg
aW50IHdpZHRoLCBpbnQgb2Zmc2V0LCBjb25zdCBDb2xvciYgY29sb3IpCi17Ci0gICAgaWYgKCFt
X2RhdGEtPm1fb3BhY2l0eSB8fCBwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybjsK
LQotICAgIFNjb3BlRENQcm92aWRlciBkY1Byb3ZpZGVyKG1fZGF0YSk7Ci0gICAgaWYgKCFtX2Rh
dGEtPm1fZGMpCi0gICAgICAgIHJldHVybjsKLQotICAgIGludCByYWRpdXMgPSAod2lkdGggLSAx
KSAvIDI7Ci0gICAgb2Zmc2V0ICs9IHJhZGl1czsKLQotICAgIHVuc2lnbmVkIHJlY3RDb3VudCA9
IHJlY3RzLnNpemUoKTsKLSAgICBJbnRSZWN0IGZpbmFsRm9jdXNSZWN0OwotICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCByZWN0Q291bnQ7IGkrKykgewotICAgICAgICBJbnRSZWN0IGZvY3Vz
UmVjdCA9IHJlY3RzW2ldOwotICAgICAgICBmb2N1c1JlY3QuaW5mbGF0ZShvZmZzZXQpOwotICAg
ICAgICBmaW5hbEZvY3VzUmVjdC51bml0ZShmb2N1c1JlY3QpOwotICAgIH0KLQotICAgIEludFJl
Y3QgaW50UmVjdCA9IGZpbmFsRm9jdXNSZWN0OwotICAgIEludFJlY3QgdHJSZWN0ID0gbV9kYXRh
LT5tYXBSZWN0KGZpbmFsRm9jdXNSZWN0KTsKLSAgICBUcmFuc3BhcmVudExheWVyREMgdHJhbnNw
YXJlbnREQyhtX2RhdGEsIHRyUmVjdCwgJmludFJlY3QpOwotICAgIEhEQyBkYyA9IHRyYW5zcGFy
ZW50REMuaGRjKCk7Ci0gICAgaWYgKCFkYykKLSAgICAgICAgcmV0dXJuOwotICAgIHRyUmVjdC5t
b3ZlKHRyYW5zcGFyZW50REMudG9TaGlmdCgpKTsKLQotICAgIFJFQ1QgcmVjdCA9IHRyUmVjdDsK
LSAgICBEcmF3Rm9jdXNSZWN0KGRjLCAmcmVjdCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
OjpkcmF3TGluZUZvclRleHQoY29uc3QgSW50UG9pbnQmIG9yaWdpbiwgaW50IHdpZHRoLCBib29s
IHByaW50aW5nKQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIFN0cm9rZVN0eWxlIG9sZFN0eWxlID0gc3Ryb2tlU3R5bGUoKTsKLSAgICBzZXRT
dHJva2VTdHlsZShTb2xpZFN0cm9rZSk7Ci0gICAgZHJhd0xpbmUob3JpZ2luLCBvcmlnaW4gKyBJ
bnRTaXplKHdpZHRoLCAwKSk7Ci0gICAgc2V0U3Ryb2tlU3R5bGUob2xkU3R5bGUpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JNaXNzcGVsbGluZ09yQmFkR3JhbW1hcihj
b25zdCBJbnRQb2ludCYsIGludCB3aWR0aCwgYm9vbCBncmFtbWFyKQotewotICAgIG5vdEltcGxl
bWVudGVkKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybUZpbGxDb2xv
cihjb25zdCBDb2xvciYgY29sLCBDb2xvclNwYWNlIGNvbG9yU3BhY2UpCi17Ci0gICAgbm90SW1w
bGVtZW50ZWQoKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtU3Ryb2tl
Q29sb3IoY29uc3QgQ29sb3ImIGNvbCwgQ29sb3JTcGFjZSBjb2xvclNwYWNlKQotewotICAgIG5v
dEltcGxlbWVudGVkKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVN0
cm9rZVRoaWNrbmVzcyhmbG9hdCBzdHJva2VUaGlja25lc3MpCi17Ci0gICAgbm90SW1wbGVtZW50
ZWQoKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFVSTEZvclJlY3QoY29uc3QgS1VS
TCYgbGluaywgY29uc3QgSW50UmVjdCYgZGVzdFJlY3QpCi17Ci0gICAgbm90SW1wbGVtZW50ZWQo
KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmFkZElubmVyUm91bmRlZFJlY3RDbGlwKGNv
bnN0IEludFJlY3QmIHJlY3QsIGludCB0aGlja25lc3MpCi17Ci0gICAgLy8gV2UgY2FuIG9ubHkg
Y2xpcCByZWN0YW5nbGVzIG9uIFdJTkNFCi0gICAgY2xpcChyZWN0KTsKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQ6OmNsZWFyUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCi17Ci0gICAgaWYg
KHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKG1fZGF0YS0+
aGFzQWxwaGEoKSkgewotICAgICAgICBJbnRSZWN0IHRyUmVjdCA9IGVuY2xvc2luZ0ludFJlY3Qo
bV9kYXRhLT5tYXBSZWN0KHJlY3QpKTsKLSAgICAgICAgbV9kYXRhLT5tX2JpdG1hcC0+Y2xlYXJQ
aXhlbHModHJSZWN0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gCi0KLSAgICBmaWxsUmVjdChy
ZWN0LCBDb2xvcihDb2xvcjo6d2hpdGUpLCBEZXZpY2VDb2xvclNwYWNlKTsKLX0KLQotdm9pZCBH
cmFwaGljc0NvbnRleHQ6OnN0cm9rZVJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0LCBmbG9hdCB3
aWR0aCkKLXsKLSAgICBpZiAoIW1fZGF0YS0+bV9vcGFjaXR5IHx8IHBhaW50aW5nRGlzYWJsZWQo
KSB8fCBzdHJva2VTdHlsZSgpID09IE5vU3Ryb2tlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBT
Y29wZURDUHJvdmlkZXIgZGNQcm92aWRlcihtX2RhdGEpOwotICAgIGlmICghbV9kYXRhLT5tX2Rj
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBJbnRSZWN0IGludFJlY3QgPSBlbmNsb3NpbmdJbnRS
ZWN0KHJlY3QpOwotICAgIEludFJlY3QgdHJSZWN0ID0gbV9kYXRhLT5tYXBSZWN0KGludFJlY3Qp
OwotICAgIFRyYW5zcGFyZW50TGF5ZXJEQyB0cmFuc3BhcmVudERDKG1fZGF0YSwgdHJSZWN0LCAm
aW50UmVjdCk7Ci0gICAgSERDIGRjID0gdHJhbnNwYXJlbnREQy5oZGMoKTsKLSAgICBpZiAoIWRj
KQotICAgICAgICByZXR1cm47Ci0gICAgdHJSZWN0Lm1vdmUodHJhbnNwYXJlbnREQy50b1NoaWZ0
KCkpOwotCi0gICAgSEdESU9CSiBwZW4gPSBjcmVhdGVQZW4oc3Ryb2tlQ29sb3IoKSwgc3Ryb2tl
VGhpY2tuZXNzKCksIHN0cm9rZVN0eWxlKCkpOwotICAgIEhHRElPQkogb2xkUGVuID0gU2VsZWN0
T2JqZWN0KGRjLCBwZW4pOwotCi0gICAgaW50IHJpZ2h0ID0gdHJSZWN0LnJpZ2h0KCkgLSAxOwot
ICAgIGludCBib3R0b20gPSB0clJlY3QuYm90dG9tKCkgLSAxOwotICAgIGNvbnN0IFBPSU5UIGlu
dFBvaW50c1s1XSA9Ci0gICAgewotICAgICAgICB7IHRyUmVjdC54KCksIHRyUmVjdC55KCkgfSwK
LSAgICAgICAgeyByaWdodCwgdHJSZWN0LnkoKSB9LAotICAgICAgICB7IHJpZ2h0LCBib3R0b20g
fSwKLSAgICAgICAgeyB0clJlY3QueCgpLCBib3R0b20gfSwKLSAgICAgICAgeyB0clJlY3QueCgp
LCB0clJlY3QueSgpIH0KLSAgICB9OwotCi0gICAgUG9seWxpbmUoZGMsIGludFBvaW50cywgNSk7
Ci0KLSAgICBTZWxlY3RPYmplY3QoZGMsIG9sZFBlbik7Ci0gICAgRGVsZXRlT2JqZWN0KHBlbik7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpiZWdpblRyYW5zcGFyZW5jeUxheWVyKGZsb2F0
IG9wYWNpdHkpCi17Ci0gICAgbV9kYXRhLT5zYXZlKCk7Ci0gICAgbV9kYXRhLT5tX29wYWNpdHkg
Kj0gb3BhY2l0eTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmVuZFRyYW5zcGFyZW5jeUxh
eWVyKCkKLXsKLSAgICBtX2RhdGEtPnJlc3RvcmUoKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQ6OmNvbmNhdENUTShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSkKLXsKLSAgICBt
X2RhdGEtPmNvbmNhdENUTSh0cmFuc2Zvcm0pOwotfQotCi1UcmFuc2Zvcm1hdGlvbk1hdHJpeCYg
R3JhcGhpY3NDb250ZXh0OjphZmZpbmVUcmFuc2Zvcm0oKQotewotICAgIHJldHVybiBtX2RhdGEt
Pm1fdHJhbnNmb3JtOwotfQotCi1jb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgR3JhcGhpY3ND
b250ZXh0OjphZmZpbmVUcmFuc2Zvcm0oKSBjb25zdAotewotICAgIHJldHVybiBtX2RhdGEtPm1f
dHJhbnNmb3JtOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6cmVzZXRBZmZpbmVUcmFuc2Zv
cm0oKQotewotICAgIG1fZGF0YS0+bV90cmFuc2Zvcm0ubWFrZUlkZW50aXR5KCk7Ci19Ci0KLXZv
aWQgR3JhcGhpY3NDb250ZXh0Ojp0cmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSkKLXsKLSAgICBt
X2RhdGEtPnRyYW5zbGF0ZSh4LCB5KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnJvdGF0
ZShmbG9hdCByYWRpYW5zKQotewotICAgIG1fZGF0YS0+cm90YXRlKHJhZGlhbnMpOwotfQotCi1J
bnRQb2ludCBHcmFwaGljc0NvbnRleHQ6Om9yaWdpbigpCi17Ci0gICAgcmV0dXJuIG1fZGF0YS0+
b3JpZ2luKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzY2FsZShjb25zdCBGbG9hdFNp
emUmIHNpemUpCi17Ci0gICAgbV9kYXRhLT5zY2FsZShzaXplKTsKLX0KLQotdm9pZCBHcmFwaGlj
c0NvbnRleHQ6OnNldExpbmVDYXAoTGluZUNhcCBsaW5lQ2FwKQotewotICAgIG5vdEltcGxlbWVu
dGVkKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRMaW5lSm9pbihMaW5lSm9pbiBs
aW5lSm9pbikKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDo6c2V0TWl0ZXJMaW1pdChmbG9hdCBtaXRlcikKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgp
OwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0QWxwaGEoZmxvYXQgYWxwaGEpCi17Ci0g
ICAgbV9kYXRhLT5tX29wYWNpdHkgPSBhbHBoYTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6
OnNldENvbXBvc2l0ZU9wZXJhdGlvbihDb21wb3NpdGVPcGVyYXRvciBvcCkKLXsKLSAgICBub3RJ
bXBsZW1lbnRlZCgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6YmVnaW5QYXRoKCkKLXsK
LSAgICBtX2RhdGEtPm1fcGF0aHMuY2xlYXIoKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6
OmFkZFBhdGgoY29uc3QgUGF0aCYgcGF0aCkKLXsKLSAgICBtX2RhdGEtPm1fcGF0aHMuYXBwZW5k
KHBhdGgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcChjb25zdCBQYXRoJiBwYXRo
KQotewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0Ojpj
YW52YXNDbGlwKGNvbnN0IFBhdGgmIHBhdGgpCi17Ci0gICAgY2xpcChwYXRoKTsKLX0KLQotdm9p
ZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBPdXQoY29uc3QgUGF0aCYpCi17Ci0gICAgbm90SW1wbGVt
ZW50ZWQoKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBPdXRFbGxpcHNlSW5SZWN0
KGNvbnN0IEludFJlY3QmKQotewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci19Ci0KLXN0YXRpYyBp
bmxpbmUgSW50UG9pbnQgcmVjdENlbnRlclBvaW50KGNvbnN0IFJFQ1QmIHJlY3QpCi17Ci0gICAg
cmV0dXJuIEludFBvaW50KHJlY3QubGVmdCArIChyZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0KSAvIDIs
IHJlY3QudG9wICsgKHJlY3QuYm90dG9tIC0gcmVjdC50b3ApIC8gMik7Ci19Ci12b2lkIEdyYXBo
aWNzQ29udGV4dDo6ZmlsbFJvdW5kZWRSZWN0KGNvbnN0IEludFJlY3QmIGZpbGxSZWN0LCBjb25z
dCBJbnRTaXplJiB0b3BMZWZ0LCBjb25zdCBJbnRTaXplJiB0b3BSaWdodCwgY29uc3QgSW50U2l6
ZSYgYm90dG9tTGVmdCwgY29uc3QgSW50U2l6ZSYgYm90dG9tUmlnaHQsIGNvbnN0IENvbG9yJiBj
LCBDb2xvclNwYWNlIGNvbG9yU3BhY2UpCi17Ci0gICAgU2NvcGVEQ1Byb3ZpZGVyIGRjUHJvdmlk
ZXIobV9kYXRhKTsKLSAgICBpZiAoIW1fZGF0YS0+bV9kYykKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgSW50U2l6ZSBzaGFkb3dTaXplOwotICAgIGludCBzaGFkb3dCbHVyID0gMDsKLSAgICBDb2xv
ciBzaGFkb3dDb2xvcjsKLSAgICAgICAgCi0gICAgZ2V0U2hhZG93KHNoYWRvd1NpemUsIHNoYWRv
d0JsdXIsIHNoYWRvd0NvbG9yKTsKLSAgICAKLSAgICBJbnRSZWN0IGRzdFJlY3QgPSBmaWxsUmVj
dDsKLSAgICAKLSAgICBkc3RSZWN0Lm1vdmUoc2hhZG93U2l6ZSk7Ci0gICAgZHN0UmVjdC5pbmZs
YXRlKHNoYWRvd0JsdXIpOwotICAgIGRzdFJlY3QgPSBtX2RhdGEtPm1hcFJlY3QoZHN0UmVjdCk7
Ci0gIAotICAgIEZsb2F0U2l6ZSBuZXdUb3BMZWZ0KG1fZGF0YS0+bWFwU2l6ZSh0b3BMZWZ0KSk7
Ci0gICAgRmxvYXRTaXplIG5ld1RvcFJpZ2h0KG1fZGF0YS0+bWFwU2l6ZSh0b3BSaWdodCkpOwot
ICAgIEZsb2F0U2l6ZSBuZXdCb3R0b21MZWZ0KG1fZGF0YS0+bWFwU2l6ZShib3R0b21MZWZ0KSk7
Ci0gICAgRmxvYXRTaXplIG5ld0JvdHRvbVJpZ2h0KG1fZGF0YS0+bWFwU2l6ZShib3R0b21SaWdo
dCkpOwotCi0gICAgVHJhbnNwYXJlbnRMYXllckRDIHRyYW5zcGFyZW50RGMobV9kYXRhLCBkc3RS
ZWN0LCAmZmlsbFJlY3QpOwotICAgIEhEQyBkYyA9IHRyYW5zcGFyZW50RGMuaGRjKCk7Ci0gICAg
aWYgKCFkYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZHN0UmVjdC5tb3ZlKHRyYW5zcGFyZW50
RGMudG9TaGlmdCgpKTsKLQotICAgIFJFQ1QgcmVjdFdpbiA9IGRzdFJlY3Q7Ci0KLSAgICBIR0RJ
T0JKIGJydXNoID0gY3JlYXRlQnJ1c2goc2hhZG93Q29sb3IpOwotICAgIEhHRElPQkogb2xkQnJ1
c2ggPSBTZWxlY3RPYmplY3QoZGMsIGJydXNoKTsKLSAgIAotICAgIFNlbGVjdE9iamVjdChkYywg
R2V0U3RvY2tPYmplY3QoTlVMTF9QRU4pKTsKLQotICAgIEludFBvaW50IGNlbnRlclBvaW50ID0g
cmVjdENlbnRlclBvaW50KHJlY3RXaW4pOwotICAgIC8vIERyYXcgdG9wIGxlZnQgaGFsZgotICAg
IFJFQ1QgY2xpcFJlY3QocmVjdFdpbik7Ci0gICAgY2xpcFJlY3QucmlnaHQgPSBjZW50ZXJQb2lu
dC54KCk7Ci0gICAgY2xpcFJlY3QuYm90dG9tID0gY2VudGVyUG9pbnQueSgpOwotCi0gICAgT3du
UHRyPEhSR04+IGNsaXBSZ24oQ3JlYXRlUmVjdFJnbigwLCAwLCAwLCAwKSk7Ci0gICAgYm9vbCBu
ZWVkc05ld0NsaXAgPSAoR2V0Q2xpcFJnbihkYywgY2xpcFJnbi5nZXQoKSkgPD0gMCk7Ci0gICAg
Ci0gICAgZHJhd1JvdW5kQ29ybmVyKG5lZWRzTmV3Q2xpcCwgY2xpcFJlY3QsIHJlY3RXaW4sIGRj
LCBzdGFibGVSb3VuZChuZXdUb3BMZWZ0LndpZHRoKCkgKiAyKSwgc3RhYmxlUm91bmQobmV3VG9w
TGVmdC5oZWlnaHQoKSAqIDIpKTsKLQotICAgIC8vIERyYXcgdG9wIHJpZ2h0Ci0gICAgY2xpcFJl
Y3QgPSByZWN0V2luOwotICAgIGNsaXBSZWN0LmxlZnQgPSBjZW50ZXJQb2ludC54KCk7Ci0gICAg
Y2xpcFJlY3QuYm90dG9tID0gY2VudGVyUG9pbnQueSgpOwotCi0gICAgZHJhd1JvdW5kQ29ybmVy
KG5lZWRzTmV3Q2xpcCwgY2xpcFJlY3QsIHJlY3RXaW4sIGRjLCBzdGFibGVSb3VuZChuZXdUb3BS
aWdodC53aWR0aCgpICogMiksIHN0YWJsZVJvdW5kKG5ld1RvcFJpZ2h0LmhlaWdodCgpICogMikp
OwotCi0gICAgIC8vIERyYXcgYm90dG9tIGxlZnQKLSAgICBjbGlwUmVjdCA9IHJlY3RXaW47Ci0g
ICAgY2xpcFJlY3QucmlnaHQgPSBjZW50ZXJQb2ludC54KCk7Ci0gICAgY2xpcFJlY3QudG9wID0g
Y2VudGVyUG9pbnQueSgpOwotCi0gICAgZHJhd1JvdW5kQ29ybmVyKG5lZWRzTmV3Q2xpcCwgY2xp
cFJlY3QsIHJlY3RXaW4sIGRjLCBzdGFibGVSb3VuZChuZXdCb3R0b21MZWZ0LndpZHRoKCkgKiAy
KSwgc3RhYmxlUm91bmQobmV3Qm90dG9tTGVmdC5oZWlnaHQoKSAqIDIpKTsKLQotICAgIC8vIERy
YXcgYm90dG9tIHJpZ2h0Ci0gICAgY2xpcFJlY3QgPSByZWN0V2luOwotICAgIGNsaXBSZWN0Lmxl
ZnQgPSBjZW50ZXJQb2ludC54KCk7Ci0gICAgY2xpcFJlY3QudG9wID0gY2VudGVyUG9pbnQueSgp
OwotCi0gICAgZHJhd1JvdW5kQ29ybmVyKG5lZWRzTmV3Q2xpcCwgY2xpcFJlY3QsIHJlY3RXaW4s
IGRjLCBzdGFibGVSb3VuZChuZXdCb3R0b21SaWdodC53aWR0aCgpICogMiksIHN0YWJsZVJvdW5k
KG5ld0JvdHRvbVJpZ2h0LmhlaWdodCgpICogMikpOwotCi0gICAgU2VsZWN0T2JqZWN0KGRjLCBv
bGRCcnVzaCk7Ci0gICAgRGVsZXRlT2JqZWN0KGJydXNoKTsKLX0KLQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDo6ZHJhd1JvdW5kQ29ybmVyKGJvb2wgbmVlZHNOZXdDbGlwLCBSRUNUIGNsaXBSZWN0
LCBSRUNUIHJlY3RXaW4sIEhEQyBkYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotewotICAgIGlm
ICghZGMpCi0gICAgICAgIHJldHVybjsKLQotICAgIE93blB0cjxIUkdOPiBjbGlwUmduKENyZWF0
ZVJlY3RSZ24oMCwgMCwgMCwgMCkpOwotICAgIGlmIChuZWVkc05ld0NsaXApICB7Ci0gICAgICAg
IGNsaXBSZ24uc2V0KENyZWF0ZVJlY3RSZ24oY2xpcFJlY3QubGVmdCwgY2xpcFJlY3QudG9wLCBj
bGlwUmVjdC5yaWdodCwgY2xpcFJlY3QuYm90dG9tKSk7Ci0gICAgICAgIFNlbGVjdENsaXBSZ24o
ZGMsIGNsaXBSZ24uZ2V0KCkpOwotICAgIH0gZWxzZSAKLSAgICAgICAgSW50ZXJzZWN0Q2xpcFJl
Y3QoZGMsIGNsaXBSZWN0LmxlZnQsIGNsaXBSZWN0LnRvcCwgY2xpcFJlY3QucmlnaHQsIGNsaXBS
ZWN0LmJvdHRvbSk7Ci0gICAgCi0gICAgOjpSb3VuZFJlY3QoZGMsIHJlY3RXaW4ubGVmdCAsIHJl
Y3RXaW4udG9wICwgcmVjdFdpbi5yaWdodCAsIHJlY3RXaW4uYm90dG9tICwgd2lkdGgsIGhlaWdo
dCk7Ci0gICAgCi0gICAgU2VsZWN0Q2xpcFJnbihkYywgbmVlZHNOZXdDbGlwID8gMCA6IGNsaXBS
Z24uZ2V0KCkpOwotfQotCi0KLUZsb2F0UmVjdCBHcmFwaGljc0NvbnRleHQ6OnJvdW5kVG9EZXZp
Y2VQaXhlbHMoY29uc3QgRmxvYXRSZWN0JiBmcmVjdCkKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgp
OwotICAgIHJldHVybiBmcmVjdDsKLX0KLQotQ29sb3IgZ3JhZGllbnRBdmVyYWdlQ29sb3IoY29u
c3QgR3JhZGllbnQqIGdyYWRpZW50KQotewotICAgIGNvbnN0IFZlY3RvcjxHcmFkaWVudDo6Q29s
b3JTdG9wPiYgc3RvcHMgPSBncmFkaWVudC0+Z2V0U3RvcHMoKTsKLSAgICBpZiAoc3RvcHMuaXNF
bXB0eSgpKQotICAgICAgICByZXR1cm4gQ29sb3IoKTsKLQotICAgIGNvbnN0IEdyYWRpZW50OjpD
b2xvclN0b3AmIHN0b3AgPSBzdG9wcy5maXJzdCgpOwotICAgIGlmIChzdG9wcy5zaXplKCkgPT0g
MSkKLSAgICAgICAgcmV0dXJuIENvbG9yKHN0b3AucmVkLCBzdG9wLmdyZWVuLCBzdG9wLmJsdWUs
IHN0b3AuYWxwaGEpOwotCi0gICAgY29uc3QgR3JhZGllbnQ6OkNvbG9yU3RvcCYgbGFzdFN0b3Ag
PSBzdG9wcy5sYXN0KCk7Ci0gICAgcmV0dXJuIENvbG9yKChzdG9wLnJlZCArIGxhc3RTdG9wLnJl
ZCkgKiAwLjVmCi0gICAgICAgICwgKHN0b3AuZ3JlZW4gKyBsYXN0U3RvcC5ncmVlbikgKiAwLjVm
Ci0gICAgICAgICwgKHN0b3AuYmx1ZSArIGxhc3RTdG9wLmJsdWUpICogMC41ZgotICAgICAgICAs
IChzdG9wLmFscGhhICsgbGFzdFN0b3AuYWxwaGEpICogMC41Zik7Ci19Ci0KLXZvaWQgR3JhcGhp
Y3NDb250ZXh0OjpmaWxsUGF0aCgpCi17Ci0gICAgQ29sb3IgYyA9IG1fY29tbW9uLT5zdGF0ZS5m
aWxsR3JhZGllbnQKLSAgICAgICAgPyBncmFkaWVudEF2ZXJhZ2VDb2xvcihtX2NvbW1vbi0+c3Rh
dGUuZmlsbEdyYWRpZW50LmdldCgpKQotICAgICAgICA6IGZpbGxDb2xvcigpOwotCi0gICAgaWYg
KCFjLmFscGhhKCkgfHwgIW1fZGF0YS0+bV9vcGFjaXR5KQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBTY29wZURDUHJvdmlkZXIgZGNQcm92aWRlcihtX2RhdGEpOwotICAgIGlmICghbV9kYXRhLT5t
X2RjKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAobV9kYXRhLT5tX29wYWNpdHkgPCAxLjBm
IHx8IG1fZGF0YS0+aGFzQWxwaGEoKSkgewotICAgICAgICBIR0RJT0JKIGJydXNoID0gY3JlYXRl
QnJ1c2goYyk7Ci0gICAgICAgIGZvciAoVmVjdG9yPFBhdGg+Ojpjb25zdF9pdGVyYXRvciBpID0g
bV9kYXRhLT5tX3BhdGhzLmJlZ2luKCk7IGkgIT0gbV9kYXRhLT5tX3BhdGhzLmVuZCgpOyArK2kp
IHsKLSAgICAgICAgICAgIEludFJlY3QgdHJSZWN0ID0gZW5jbG9zaW5nSW50UmVjdChtX2RhdGEt
Pm1hcFJlY3QoaS0+Ym91bmRpbmdSZWN0KCkpKTsKLSAgICAgICAgICAgIHRyUmVjdC5pbmZsYXRl
KDEpOwotICAgICAgICAgICAgVHJhbnNwYXJlbnRMYXllckRDIHRyYW5zcGFyZW50REMobV9kYXRh
LCB0clJlY3QpOwotICAgICAgICAgICAgSERDIGRjID0gdHJhbnNwYXJlbnREQy5oZGMoKTsKLSAg
ICAgICAgICAgIGlmICghZGMpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAg
ICAgIEFmZmluZVRyYW5zZm9ybSB0ciA9IG1fZGF0YS0+bV90cmFuc2Zvcm07Ci0gICAgICAgICAg
ICB0ci50cmFuc2xhdGUodHJhbnNwYXJlbnREQy50b1NoaWZ0KCkud2lkdGgoKSwgdHJhbnNwYXJl
bnREQy50b1NoaWZ0KCkuaGVpZ2h0KCkpOwotCi0gICAgICAgICAgICBTZWxlY3RPYmplY3QoZGMs
IEdldFN0b2NrT2JqZWN0KE5VTExfUEVOKSk7Ci0gICAgICAgICAgICBIR0RJT0JKIG9sZEJydXNo
ID0gU2VsZWN0T2JqZWN0KGRjLCBicnVzaCk7Ci0gICAgICAgICAgICBpLT5wbGF0Zm9ybVBhdGgo
KS0+ZmlsbFBhdGgoZGMsICZ0cik7Ci0gICAgICAgICAgICBTZWxlY3RPYmplY3QoZGMsIG9sZEJy
dXNoKTsKLSAgICAgICAgfQotICAgICAgICBEZWxldGVPYmplY3QoYnJ1c2gpOwotICAgIH0gZWxz
ZSB7Ci0gICAgICAgIFNlbGVjdE9iamVjdChtX2RhdGEtPm1fZGMsIEdldFN0b2NrT2JqZWN0KE5V
TExfUEVOKSk7Ci0gICAgICAgIEhHRElPQkogYnJ1c2ggPSBjcmVhdGVCcnVzaChjKTsKLSAgICAg
ICAgSEdESU9CSiBvbGRCcnVzaCA9IFNlbGVjdE9iamVjdChtX2RhdGEtPm1fZGMsIGJydXNoKTsK
LSAgICAgICAgZm9yIChWZWN0b3I8UGF0aD46OmNvbnN0X2l0ZXJhdG9yIGkgPSBtX2RhdGEtPm1f
cGF0aHMuYmVnaW4oKTsgaSAhPSBtX2RhdGEtPm1fcGF0aHMuZW5kKCk7ICsraSkKLSAgICAgICAg
ICAgIGktPnBsYXRmb3JtUGF0aCgpLT5maWxsUGF0aChtX2RhdGEtPm1fZGMsICZtX2RhdGEtPm1f
dHJhbnNmb3JtKTsKLSAgICAgICAgU2VsZWN0T2JqZWN0KG1fZGF0YS0+bV9kYywgb2xkQnJ1c2gp
OwotICAgICAgICBEZWxldGVPYmplY3QoYnJ1c2gpOwotICAgIH0KLX0KLQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDo6c3Ryb2tlUGF0aCgpCi17Ci0gICAgaWYgKCFtX2RhdGEtPm1fb3BhY2l0eSkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgU2NvcGVEQ1Byb3ZpZGVyIGRjUHJvdmlkZXIobV9kYXRh
KTsKLSAgICBpZiAoIW1fZGF0YS0+bV9kYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKG1f
ZGF0YS0+bV9vcGFjaXR5IDwgMS4wZiB8fCBtX2RhdGEtPmhhc0FscGhhKCkpIHsKLSAgICAgICAg
SEdESU9CSiBwZW4gPSBjcmVhdGVQZW4oc3Ryb2tlQ29sb3IoKSwgc3Ryb2tlVGhpY2tuZXNzKCks
IHN0cm9rZVN0eWxlKCkpOwotICAgICAgICBmb3IgKFZlY3RvcjxQYXRoPjo6Y29uc3RfaXRlcmF0
b3IgaSA9IG1fZGF0YS0+bV9wYXRocy5iZWdpbigpOyBpICE9IG1fZGF0YS0+bV9wYXRocy5lbmQo
KTsgKytpKSB7Ci0gICAgICAgICAgICBJbnRSZWN0IHRyUmVjdCA9IGVuY2xvc2luZ0ludFJlY3Qo
bV9kYXRhLT5tYXBSZWN0KGktPmJvdW5kaW5nUmVjdCgpKSk7Ci0gICAgICAgICAgICB0clJlY3Qu
aW5mbGF0ZSgxKTsKLSAgICAgICAgICAgIFRyYW5zcGFyZW50TGF5ZXJEQyB0cmFuc3BhcmVudERD
KG1fZGF0YSwgdHJSZWN0KTsKLSAgICAgICAgICAgIEhEQyBkYyA9IHRyYW5zcGFyZW50REMuaGRj
KCk7Ci0gICAgICAgICAgICBpZiAoIWRjKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0g
ICAgICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdHIgPSBtX2RhdGEtPm1fdHJhbnNmb3JtOwotICAg
ICAgICAgICAgdHIudHJhbnNsYXRlKHRyYW5zcGFyZW50REMudG9TaGlmdCgpLndpZHRoKCksIHRy
YW5zcGFyZW50REMudG9TaGlmdCgpLmhlaWdodCgpKTsKLQotICAgICAgICAgICAgU2VsZWN0T2Jq
ZWN0KGRjLCBHZXRTdG9ja09iamVjdChOVUxMX0JSVVNIKSk7Ci0gICAgICAgICAgICBIR0RJT0JK
IG9sZFBlbiA9IFNlbGVjdE9iamVjdChkYywgcGVuKTsKLSAgICAgICAgICAgIGktPnBsYXRmb3Jt
UGF0aCgpLT5zdHJva2VQYXRoKGRjLCAmdHIpOwotICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGRj
LCBvbGRQZW4pOwotICAgICAgICB9Ci0gICAgICAgIERlbGV0ZU9iamVjdChwZW4pOwotICAgIH0g
ZWxzZSB7Ci0gICAgICAgIFNlbGVjdE9iamVjdChtX2RhdGEtPm1fZGMsIEdldFN0b2NrT2JqZWN0
KE5VTExfQlJVU0gpKTsKLSAgICAgICAgSEdESU9CSiBwZW4gPSBjcmVhdGVQZW4oc3Ryb2tlQ29s
b3IoKSwgc3Ryb2tlVGhpY2tuZXNzKCksIHN0cm9rZVN0eWxlKCkpOwotICAgICAgICBIR0RJT0JK
IG9sZFBlbiA9IFNlbGVjdE9iamVjdChtX2RhdGEtPm1fZGMsIHBlbik7Ci0gICAgICAgIGZvciAo
VmVjdG9yPFBhdGg+Ojpjb25zdF9pdGVyYXRvciBpID0gbV9kYXRhLT5tX3BhdGhzLmJlZ2luKCk7
IGkgIT0gbV9kYXRhLT5tX3BhdGhzLmVuZCgpOyArK2kpCi0gICAgICAgICAgICBpLT5wbGF0Zm9y
bVBhdGgoKS0+c3Ryb2tlUGF0aChtX2RhdGEtPm1fZGMsICZtX2RhdGEtPm1fdHJhbnNmb3JtKTsK
LSAgICAgICAgU2VsZWN0T2JqZWN0KG1fZGF0YS0+bV9kYywgb2xkUGVuKTsKLSAgICAgICAgRGVs
ZXRlT2JqZWN0KHBlbik7Ci0gICAgfQotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJl
Y3QoY29uc3QgRmxvYXRSZWN0JiByLCBjb25zdCBHcmFkaWVudCogZ3JhZGllbnQpCi17Ci0gICAg
aWYgKCFtX2RhdGEtPm1fb3BhY2l0eSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY29uc3QgVmVj
dG9yPEdyYWRpZW50OjpDb2xvclN0b3A+JiBzdG9wcyA9IGdyYWRpZW50LT5nZXRTdG9wcygpOwot
ICAgIGlmIChzdG9wcy5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIHNpemVfdCBu
dW1TdG9wcyA9IHN0b3BzLnNpemUoKTsKLSAgICBpZiAobnVtU3RvcHMgPT0gMSkgewotICAgICAg
ICBjb25zdCBHcmFkaWVudDo6Q29sb3JTdG9wJiBzdG9wID0gc3RvcHMuZmlyc3QoKTsKLSAgICAg
ICAgQ29sb3IgY29sb3Ioc3RvcC5yZWQsIHN0b3AuZ3JlZW4sIHN0b3AuYmx1ZSwgc3RvcC5hbHBo
YSk7Ci0gICAgICAgIGZpbGxSZWN0KHIsIGNvbG9yLCBEZXZpY2VDb2xvclNwYWNlKTsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0gCi0gICAgCi0gICAgU2NvcGVEQ1Byb3ZpZGVyIGRjUHJvdmlkZXIo
bV9kYXRhKTsKLSAgICBpZiAoIW1fZGF0YS0+bV9kYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
SW50UmVjdCBpbnRSZWN0ID0gZW5jbG9zaW5nSW50UmVjdChyKTsKLSAgICBJbnRSZWN0IHJlY3Qg
PSBtX2RhdGEtPm1hcFJlY3QoaW50UmVjdCk7Ci0gICAgVHJhbnNwYXJlbnRMYXllckRDIHRyYW5z
cGFyZW50REMobV9kYXRhLCByZWN0LCAmaW50UmVjdCwgMjU1LCB0cnVlKTsKLSAgICBIREMgZGMg
PSB0cmFuc3BhcmVudERDLmhkYygpOwotICAgIGlmICghZGMpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIHJlY3QubW92ZSh0cmFuc3BhcmVudERDLnRvU2hpZnQoKSk7Ci0gICAgRmxvYXRQb2ludCBm
cDAgPSBtX2RhdGEtPm1hcFBvaW50KGdyYWRpZW50LT5wMCgpKTsKLSAgICBGbG9hdFBvaW50IGZw
MSA9IG1fZGF0YS0+bWFwUG9pbnQoZ3JhZGllbnQtPnAxKCkpOwotICAgIEludFBvaW50IHAwKHN0
YWJsZVJvdW5kKGZwMC54KCkpLCBzdGFibGVSb3VuZChmcDAueSgpKSk7Ci0gICAgSW50UG9pbnQg
cDEoc3RhYmxlUm91bmQoZnAxLngoKSksIHN0YWJsZVJvdW5kKGZwMS55KCkpKTsKLSAgICBwMCAr
PSB0cmFuc3BhcmVudERDLnRvU2hpZnQoKTsKLSAgICBwMSArPSB0cmFuc3BhcmVudERDLnRvU2hp
ZnQoKTsKLQotICAgIGlmIChncmFkaWVudC0+aXNSYWRpYWwoKSkgewotICAgICAgICBpZiAoZ19y
YWRpYWxHcmFkaWVudEZpbGxlcikgewotICAgICAgICAgICAgLy8gRklYTUU6IGRvbid0IHN1cHBv
cnQgMkQgc2NhbGluZyBhdCB0aGlzIHRpbWUKLSAgICAgICAgICAgIGRvdWJsZSBzY2FsZSA9ICht
X2RhdGEtPm1fdHJhbnNmb3JtLmEoKSArIG1fZGF0YS0+bV90cmFuc2Zvcm0uZCgpKSAqIDAuNTsK
LSAgICAgICAgICAgIGZsb2F0IHIwID0gZ3JhZGllbnQtPnIwKCkgKiBzY2FsZTsKLSAgICAgICAg
ICAgIGZsb2F0IHIxID0gZ3JhZGllbnQtPnIxKCkgKiBzY2FsZTsKLSAgICAgICAgICAgIGdfcmFk
aWFsR3JhZGllbnRGaWxsZXIoZGMsIHJlY3QsIHAwLCBwMSwgcjAsIHIxLCBncmFkaWVudC0+Z2V0
U3RvcHMoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYg
KGdfbGluZWFyR3JhZGllbnRGaWxsZXIpIHsKLSAgICAgICAgZ19saW5lYXJHcmFkaWVudEZpbGxl
cihkYywgcmVjdCwgcDAsIHAxLCBncmFkaWVudC0+Z2V0U3RvcHMoKSk7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0KLSAgICAvLyBTaW1wbGUgMUQgbGluZWFyIHNvbHV0aW9uIHRoYXQgYXNzdW1l
cyBwMCBpcyBvbiB0aGUgdG9wIG9yIGxlZnQgc2lkZSwgYW5kIHAxIGlzIG9uIHRoZSByaWdodCBv
ciBib3R0b20gc2lkZQotICAgIHNpemVfdCBudW1SZWN0cyA9IChudW1TdG9wcyAtIDEpOwotICAg
IFZlY3RvcjxUUklWRVJURVgsIDIwPiB0djsKLSAgICB0di5yZXNpemUobnVtUmVjdHMgKiAyKTsK
LSAgICBWZWN0b3I8R1JBRElFTlRfUkVDVCwgMTA+IG1lc2g7Ci0gICAgbWVzaC5yZXNpemUobnVt
UmVjdHMpOwotICAgIGludCB4ID0gcmVjdC54KCk7Ci0gICAgaW50IHkgPSByZWN0LnkoKTsKLSAg
ICBpbnQgd2lkdGggPSByZWN0LndpZHRoKCk7Ci0gICAgaW50IGhlaWdodCA9IHJlY3QuaGVpZ2h0
KCk7Ci0gICAgRmxvYXRTaXplIGQgPSBncmFkaWVudC0+cDEoKSAtIGdyYWRpZW50LT5wMCgpOwot
ICAgIGJvb2wgdmVydGljYWwgPSBhYnMoZC5oZWlnaHQoKSkgPiBhYnMoZC53aWR0aCgpKTsKLSAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVN0b3BzOyArK2kpIHsKLSAgICAgICAgY29uc3Qg
R3JhZGllbnQ6OkNvbG9yU3RvcCYgc3RvcCA9IHN0b3BzW2ldOwotICAgICAgICBpbnQgaVR2ID0g
aSA/IDIgKiBpIC0gMSA6IDA7Ci0gICAgICAgIHR2W2lUdl0uUmVkID0gc3RvcC5yZWQgKiAweEZG
RkY7Ci0gICAgICAgIHR2W2lUdl0uR3JlZW4gPSBzdG9wLmdyZWVuICogMHhGRkZGOwotICAgICAg
ICB0dltpVHZdLkJsdWUgPSBzdG9wLmJsdWUgKiAweEZGRkY7Ci0gICAgICAgIHR2W2lUdl0uQWxw
aGEgPSBzdG9wLmFscGhhICogMHhGRkZGOwotICAgICAgICBpZiAoaSkgewotICAgICAgICAgICAg
dHZbaVR2XS54ID0gdmVydGljYWwgPyB4ICsgd2lkdGg6IHggKyB3aWR0aCAqIHN0b3Auc3RvcDsK
LSAgICAgICAgICAgIHR2W2lUdl0ueSA9IHZlcnRpY2FsID8geSArIGhlaWdodCAqIHN0b3Auc3Rv
cCA6IHkgKyBoZWlnaHQ7Ci0gICAgICAgICAgICBtZXNoW2kgLSAxXS5VcHBlckxlZnQgPSBpVHYg
LSAxOwotICAgICAgICAgICAgbWVzaFtpIC0gMV0uTG93ZXJSaWdodCA9IGlUdjsKLSAgICAgICAg
fSBlbHNlIHsKLSAgICAgICAgICAgIHR2W2lUdl0ueCA9IHg7Ci0gICAgICAgICAgICB0dltpVHZd
LnkgPSB5OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGkgJiYgaSA8IG51bVJlY3RzKSB7Ci0g
ICAgICAgICAgICB0dltpVHYgKyAxXSA9IHR2W2lUdl07Ci0gICAgICAgICAgICBpZiAodmVydGlj
YWwpCi0gICAgICAgICAgICAgICAgdHZbaVR2ICsgMV0ueCA9IHg7Ci0gICAgICAgICAgICBlbHNl
Ci0gICAgICAgICAgICAgICAgdHZbaVR2ICsgMV0ueSA9IHk7Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICBHcmFkaWVudEZpbGwoZGMsIHR2LmRhdGEoKSwgdHYuc2l6ZSgpLCBtZXNoLmRhdGEoKSwg
bWVzaC5zaXplKCksIHZlcnRpY2FsID8gR1JBRElFTlRfRklMTF9SRUNUX1YgOiBHUkFESUVOVF9G
SUxMX1JFQ1RfSCk7Ci19Ci0KLUFmZmluZVRyYW5zZm9ybSBHcmFwaGljc0NvbnRleHQ6OmdldENU
TSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fZGF0YS0+bV90cmFuc2Zvcm07Ci19Ci0KLXZvaWQg
R3JhcGhpY3NDb250ZXh0OjpjbGlwVG9JbWFnZUJ1ZmZlcihjb25zdCBGbG9hdFJlY3QmLCBjb25z
dCBJbWFnZUJ1ZmZlciopCi17Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQ6OmZpbGxSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKLXsKLSAgICBpZiAo
bV9jb21tb24tPnN0YXRlLmZpbGxHcmFkaWVudCkKLSAgICAgICAgZmlsbFJlY3QocmVjdCwgbV9j
b21tb24tPnN0YXRlLmZpbGxHcmFkaWVudC5nZXQoKSk7Ci0gICAgZWxzZQotICAgICAgICBmaWxs
UmVjdChyZWN0LCBmaWxsQ29sb3IoKSwgRGV2aWNlQ29sb3JTcGFjZSk7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVNoYWRvdyhjb25zdCBJbnRTaXplJiwgaW50LCBjb25z
dCBDb2xvciYsIENvbG9yU3BhY2UpCi17Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLX0KLQotdm9p
ZCBHcmFwaGljc0NvbnRleHQ6OmNsZWFyUGxhdGZvcm1TaGFkb3coKQotewotICAgIG5vdEltcGxl
bWVudGVkKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRJbWFnZUludGVycG9sYXRp
b25RdWFsaXR5KEludGVycG9sYXRpb25RdWFsaXR5KQotewotICAgIG5vdEltcGxlbWVudGVkKCk7
Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc0NoYXJWaXNpYmxlKFVDaGFyIGMpCi17Ci0gICAg
cmV0dXJuIGMgJiYgYyAhPSB6ZXJvV2lkdGhTcGFjZTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQ6OmRyYXdUZXh0KGNvbnN0IEZvbnQmIGZvbnQsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3Qg
SW50UG9pbnQmIHBvaW50LCBpbnQgZnJvbSwgaW50IHRvKQotewotICAgIGlmIChwYWludGluZ0Rp
c2FibGVkKCkgfHwgIWZpbGxDb2xvcigpLmFscGhhKCkgfHwgIW1fZGF0YS0+bV9vcGFjaXR5KQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBib29sIG11c3RTdXBwb3J0QWxwaGEgPSBtX2RhdGEtPmhh
c0FscGhhKCk7Ci0KLSAgICBpZiAoIW11c3RTdXBwb3J0QWxwaGEgJiYgZmlsbENvbG9yKCkuYWxw
aGEoKSA9PSAweEZGICYmIG1fZGF0YS0+bV9vcGFjaXR5ID49IDEuMCkgewotICAgICAgICBmb250
LmRyYXdUZXh0KHRoaXMsIHJ1biwgcG9pbnQsIGZyb20sIHRvKTsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLQotICAgIGZsb2F0IG9sZE9wYWNpdHkgPSBtX2RhdGEtPm1fb3BhY2l0eTsKLSAgICBt
X2RhdGEtPm1fb3BhY2l0eSAqPSBmaWxsQ29sb3IoKS5hbHBoYSgpIC8gMjU1LjA7Ci0KLSAgICBG
bG9hdFJlY3QgdGV4dFJlY3QgPSBmb250LnNlbGVjdGlvblJlY3RGb3JUZXh0KHJ1biwgcG9pbnQs
IGZvbnQuaGVpZ2h0KCksIGZyb20sIHRvKTsKLSAgICB0ZXh0UmVjdC5zZXRZKHRleHRSZWN0Lnko
KSAtIGZvbnQuYXNjZW50KCkpOwotICAgIEludFJlY3QgdHJSZWN0ID0gZW5jbG9zaW5nSW50UmVj
dChtX2RhdGEtPm1hcFJlY3QodGV4dFJlY3QpKTsKLSAgICBSRUNUIGJtcFJlY3Q7Ci0gICAgQWxw
aGFQYWludFR5cGUgYWxwaGFQYWludFR5cGUgPSBtdXN0U3VwcG9ydEFscGhhID8gQWxwaGFQYWlu
dE90aGVyIDogQWxwaGFQYWludE5vbmU7Ci0gICAgaWYgKFJlZlB0cjxTaGFyZWRCaXRtYXA+IGJt
cCA9IG1fZGF0YS0+Z2V0VHJhbnNwYXJlbnRMYXllckJpdG1hcCh0clJlY3QsIGFscGhhUGFpbnRU
eXBlLCBibXBSZWN0LCB0cnVlLCBtdXN0U3VwcG9ydEFscGhhKSkgewotICAgICAgICB7Ci0gICAg
ICAgICAgICBHcmFwaGljc0NvbnRleHQgZ2MoMCk7Ci0gICAgICAgICAgICBnYy5zZXRCaXRtYXAo
Ym1wKTsKLSAgICAgICAgICAgIGdjLnNjYWxlKEZsb2F0U2l6ZShtX2RhdGEtPm1fdHJhbnNmb3Jt
LmEoKSwgbV9kYXRhLT5tX3RyYW5zZm9ybS5kKCkpKTsKLSAgICAgICAgICAgIGZvbnQuZHJhd1Rl
eHQoJmdjLCBydW4sIEludFBvaW50KDAsIGZvbnQuYXNjZW50KCkpLCBmcm9tLCB0byk7Ci0gICAg
ICAgIH0KLSAgICAgICAgdW5zaWduZWQga2V5MSwga2V5MjsKLSAgICAgICAgSERDIG1lbURDID0g
Ym1wLT5nZXREQygma2V5MSwgJmtleTIpOwotICAgICAgICBpZiAobWVtREMpIHsKLSAgICAgICAg
ICAgIG1fZGF0YS0+cGFpbnRCYWNrVHJhbnNwYXJlbnRMYXllckJpdG1hcChtZW1EQywgYm1wLmdl
dCgpLCB0clJlY3QsIGFscGhhUGFpbnRUeXBlLCBibXBSZWN0KTsKLSAgICAgICAgICAgIGJtcC0+
cmVsZWFzZURDKG1lbURDLCBrZXkxLCBrZXkyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1f
ZGF0YS0+bV9vcGFjaXR5ID0gb2xkT3BhY2l0eTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6
OmRyYXdUZXh0KGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250RGF0YSwgY29uc3QgR2x5cGhCdWZm
ZXImIGdseXBoQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgIGludCBmcm9tLCBpbnQgbnVt
R2x5cGhzLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCkKLXsKLSAgICBpZiAoIW1fZGF0YS0+bV9v
cGFjaXR5KQotICAgICAgICByZXR1cm47Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGlmICgh
bnVtR2x5cGhzKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZiAoaXNDaGFyVmlzaWJs
ZSgqZ2x5cGhCdWZmZXIuZ2x5cGhzKGZyb20pKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICArK2Zyb207Ci0gICAgICAgIC0tbnVtR2x5cGhzOwotICAgIH0KLQotICAgIGRvdWJsZSBzY2Fs
ZVggPSBtX2RhdGEtPm1fdHJhbnNmb3JtLmEoKTsKLSAgICBkb3VibGUgc2NhbGVZID0gbV9kYXRh
LT5tX3RyYW5zZm9ybS5kKCk7Ci0KLSAgICBpbnQgaGVpZ2h0ID0gZm9udERhdGEtPnBsYXRmb3Jt
RGF0YSgpLnNpemUoKSAqIHNjYWxlWTsKLSAgICBpbnQgd2lkdGggPSBmb250RGF0YS0+cGxhdGZv
cm1EYXRhKCkuYXZlcmFnZUNoYXJXaWR0aCgpICogc2NhbGVYOwotCi0gICAgaWYgKCFoZWlnaHQg
fHwgIXdpZHRoKQotICAgICAgICByZXR1cm47Ci0KLSAgICBTY29wZURDUHJvdmlkZXIgZGNQcm92
aWRlcihtX2RhdGEpOwotICAgIGlmICghbV9kYXRhLT5tX2RjKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBIRk9OVCBoRm9udCA9IGhlaWdodCA+IDEKLSAgICAgICAgPyBmb250RGF0YS0+cGxhdGZv
cm1EYXRhKCkuZ2V0U2NhbGVkRm9udEhhbmRsZShoZWlnaHQsIHNjYWxlWCA9PSBzY2FsZVkgPyAw
IDogd2lkdGgpCi0gICAgICAgIDogMDsKLQotICAgIEZsb2F0UG9pbnQgc3RhcnRQb2ludChwb2lu
dC54KCksIHBvaW50LnkoKSAtIGZvbnREYXRhLT5hc2NlbnQoKSk7Ci0gICAgRmxvYXRQb2ludCB0
clBvaW50ID0gbV9kYXRhLT5tYXBQb2ludChzdGFydFBvaW50KTsKLSAgICBpbnQgeSA9IHN0YWJs
ZVJvdW5kKHRyUG9pbnQueSgpKTsKLQotICAgIENvbG9yIGNvbG9yID0gZmlsbENvbG9yKCk7Ci0g
ICAgaWYgKCFjb2xvci5hbHBoYSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBDT0xPUlJFRiBm
b250Q29sb3IgPSBSR0IoY29sb3IucmVkKCksIGNvbG9yLmdyZWVuKCksIGNvbG9yLmJsdWUoKSk7
Ci0KLSAgICBpZiAoIWhGb250KSB7Ci0gICAgICAgIGRvdWJsZSBvZmZzZXQgPSB0clBvaW50Lngo
KTsKLSAgICAgICAgY29uc3QgR2x5cGhCdWZmZXJBZHZhbmNlKiBhZHZhbmNlID0gZ2x5cGhCdWZm
ZXIuYWR2YW5jZXMoZnJvbSk7Ci0gICAgICAgIGlmIChzY2FsZVggPT0gMS4pCi0gICAgICAgICAg
ICBmb3IgKGludCBpID0gMTsgaSA8IG51bUdseXBoczsgKytpKQotICAgICAgICAgICAgICAgIG9m
ZnNldCArPSAqYWR2YW5jZSsrOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmb3IgKGludCBp
ID0gMTsgaSA8IG51bUdseXBoczsgKytpKQotICAgICAgICAgICAgICAgIG9mZnNldCArPSAqYWR2
YW5jZSsrICogc2NhbGVYOwotCi0gICAgICAgIG9mZnNldCArPSB3aWR0aDsKLQotICAgICAgICBP
d25QdHI8SFBFTj4gaFBlbihDcmVhdGVQZW4oUFNfREFTSCwgMSwgZm9udENvbG9yKSk7Ci0gICAg
ICAgIEhHRElPQkogb2xkUGVuID0gU2VsZWN0T2JqZWN0KG1fZGF0YS0+bV9kYywgaFBlbi5nZXQo
KSk7Ci0KLSAgICAgICAgTW92ZVRvRXgobV9kYXRhLT5tX2RjLCBzdGFibGVSb3VuZCh0clBvaW50
LngoKSksIHksIDApOwotICAgICAgICBMaW5lVG8obV9kYXRhLT5tX2RjLCBzdGFibGVSb3VuZChv
ZmZzZXQpLCB5KTsKLQotICAgICAgICBTZWxlY3RPYmplY3QobV9kYXRhLT5tX2RjLCBvbGRQZW4p
OwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgSW50U2l6ZSBzaGFkb3dTaXplOwotICAg
IGludCBzaGFkb3dCbHVyID0gMDsKLSAgICBDb2xvciBzaGFkb3dDb2xvcjsKLSAgICBib29sIGhh
c1NoYWRvdyA9IHRleHREcmF3aW5nTW9kZSgpID09IGNUZXh0RmlsbAotICAgICAgICAmJiBnZXRT
aGFkb3coc2hhZG93U2l6ZSwgc2hhZG93Qmx1ciwgc2hhZG93Q29sb3IpCi0gICAgICAgICYmIHNo
YWRvd0NvbG9yLmFscGhhKCk7Ci0gICAgQ09MT1JSRUYgc2hhZG93UkdCQ29sb3I7Ci0gICAgRmxv
YXRQb2ludCB0clNoYWRvd1BvaW50OwotICAgIGlmIChoYXNTaGFkb3cpIHsKLSAgICAgICAgc2hh
ZG93UkdCQ29sb3IgPSBSR0Ioc2hhZG93Q29sb3IucmVkKCksIHNoYWRvd0NvbG9yLmdyZWVuKCks
IHNoYWRvd0NvbG9yLmJsdWUoKSk7Ci0gICAgICAgIHRyU2hhZG93UG9pbnQgPSBtX2RhdGEtPm1h
cFBvaW50KHN0YXJ0UG9pbnQgKyBzaGFkb3dTaXplKTsKLSAgICB9Ci0KLSAgICBIR0RJT0JKIGhP
bGRGb250ID0gU2VsZWN0T2JqZWN0KG1fZGF0YS0+bV9kYywgaEZvbnQpOwotICAgIENPTE9SUkVG
IG9sZFRleHRDb2xvciA9IEdldFRleHRDb2xvcihtX2RhdGEtPm1fZGMpOwotICAgIGludCBvbGRU
ZXh0QWxpZ24gPSBHZXRUZXh0QWxpZ24obV9kYXRhLT5tX2RjKTsKLSAgICBTZXRUZXh0QWxpZ24o
bV9kYXRhLT5tX2RjLCAwKTsKLQotICAgIGludCBvbGRCa01vZGUgPSBHZXRCa01vZGUobV9kYXRh
LT5tX2RjKTsKLSAgICBTZXRCa01vZGUobV9kYXRhLT5tX2RjLCBUUkFOU1BBUkVOVCk7Ci0KLSAg
ICBpZiAobnVtR2x5cGhzID4gMSkgewotICAgICAgICBkb3VibGUgb2Zmc2V0ID0gdHJQb2ludC54
KCk7Ci0gICAgICAgIFZlY3RvcjxpbnQsIDI1Nj4gZ2x5cGhTcGFjZShudW1HbHlwaHMpOwotICAg
ICAgICBWZWN0b3I8VUNoYXIsIDI1Nj4gdGV4dChudW1HbHlwaHMpOwotICAgICAgICBpbnQqIGN1
clNwYWNlID0gZ2x5cGhTcGFjZS5kYXRhKCk7Ci0gICAgICAgIFVDaGFyKiBjdXJDaGFyID0gdGV4
dC5kYXRhKCk7Ci0gICAgICAgIGNvbnN0IFVDaGFyKiBzcmNDaGFyID0gZ2x5cGhCdWZmZXIuZ2x5
cGhzKGZyb20pOwotICAgICAgICBjb25zdCBVQ2hhciogY29uc3Qgc3JjQ2hhckVuZCA9IHNyY0No
YXIgKyBudW1HbHlwaHM7Ci0gICAgICAgICpjdXJDaGFyKysgPSAqc3JjQ2hhcisrOwotICAgICAg
ICBpbnQgZmlyc3RPZmZzZXQgPSBzdGFibGVSb3VuZChvZmZzZXQpOwotICAgICAgICBpbnQgbGFz
dE9mZnNldCA9IGZpcnN0T2Zmc2V0OwotICAgICAgICBjb25zdCBHbHlwaEJ1ZmZlckFkdmFuY2Uq
IGFkdmFuY2UgPSBnbHlwaEJ1ZmZlci5hZHZhbmNlcyhmcm9tKTsKLSAgICAgICAgLy8gRklYTUU6
IEV4dFRleHRPdXQoKSBjYW4gZmxpcCBvdmVyIGVhY2ggd29yZCBmb3IgUlRMIGxhbmd1YWdlcywg
ZXZlbiB3aGVuIFRBX1JUTFJFQURJTkcgaXMgb2ZmLgotICAgICAgICAvLyAodGhpcyBjYW4gYmUg
R0RJIGJ1ZyBvciBmb250IGRyaXZlciBidWc/KQotICAgICAgICAvLyBXZSBhcmUgbm90IGNsZWFy
IGhvdyBpdCBwcm9jZXNzZXMgY2hhcmFjdGVycyBhbmQgaGFuZGxlcyBzcGVjaWZpZWQgc3BhY2Vz
LiBPbiB0aGUgb3RoZXIgc2lkZSwKLSAgICAgICAgLy8gb3VyIGdseXBoIGJ1ZmZlciBpcyBhbHJl
YWR5IGluIHRoZSBjb3JyZWN0IG9yZGVyIGZvciByZW5kZXJpbmcuIFNvLCB0aGUgc29sdXRpb24g
aXMgdGhhdCB3ZQotICAgICAgICAvLyBjYWxsIEV4dFRleHRPdXQoKSBmb3IgZWFjaCBzaW5nbGUg
Y2hhcmFjdGVyIHdoZW4gdGhlIHRleHQgY29udGFpbnMgYW55IFJUTCBjaGFyYWN0ZXIuCi0gICAg
ICAgIC8vIFRoaXMgc29sdXRpb24gaXMgbm90IHBlcmZlY3QgYXMgaXQgaXMgc2xvd2VyIHRoYW4g
Y2FsbGluZyBFeHRUZXh0T3V0KCkgb25lIHRpbWUgZm9yIGFsbCBjaGFyYWN0ZXJzLgotICAgICAg
ICAvLyBEcmF3aW5nIGNoYXJhY3RlcnMgb25lIGJ5IG9uZSBtYXkgYmUgdG9vIHNsb3cuCi0gICAg
ICAgIGJvb2wgZHJhd09uZUJ5T25lID0gZmFsc2U7Ci0gICAgICAgIGlmIChzY2FsZVggPT0gMS4p
IHsKLSAgICAgICAgICAgIGZvciAoOyBzcmNDaGFyIDwgc3JjQ2hhckVuZDsgKytzcmNDaGFyKSB7
Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9ICphZHZhbmNlKys7Ci0gICAgICAgICAgICAgICAg
aW50IG9mZnNldEludCA9IHN0YWJsZVJvdW5kKG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgaWYg
KGlzQ2hhclZpc2libGUoKnNyY0NoYXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZHJh
d09uZUJ5T25lICYmIFdURjo6VW5pY29kZTo6ZGlyZWN0aW9uKCpzcmNDaGFyKSA9PSBXVEY6OlVu
aWNvZGU6OlJpZ2h0VG9MZWZ0KQotICAgICAgICAgICAgICAgICAgICAgICAgZHJhd09uZUJ5T25l
ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgKmN1ckNoYXIrKyA9ICpzcmNDaGFyOwotICAg
ICAgICAgICAgICAgICAgICAqY3VyU3BhY2UrKyA9IG9mZnNldEludCAtIGxhc3RPZmZzZXQ7Ci0g
ICAgICAgICAgICAgICAgICAgIGxhc3RPZmZzZXQgPSBvZmZzZXRJbnQ7Ci0gICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yICg7
IHNyY0NoYXIgPCBzcmNDaGFyRW5kOyArK3NyY0NoYXIpIHsKLSAgICAgICAgICAgICAgICBvZmZz
ZXQgKz0gKmFkdmFuY2UrKyAqIHNjYWxlWDsKLSAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0SW50
ID0gc3RhYmxlUm91bmQob2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBpZiAoaXNDaGFyVmlzaWJs
ZSgqc3JjQ2hhcikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFkcmF3T25lQnlPbmUgJiYg
V1RGOjpVbmljb2RlOjpkaXJlY3Rpb24oKnNyY0NoYXIpID09IFdURjo6VW5pY29kZTo6UmlnaHRU
b0xlZnQpCi0gICAgICAgICAgICAgICAgICAgICAgICBkcmF3T25lQnlPbmUgPSB0cnVlOwotICAg
ICAgICAgICAgICAgICAgICAqY3VyQ2hhcisrID0gKnNyY0NoYXI7Ci0gICAgICAgICAgICAgICAg
ICAgICpjdXJTcGFjZSsrID0gb2Zmc2V0SW50IC0gbGFzdE9mZnNldDsKLSAgICAgICAgICAgICAg
ICAgICAgbGFzdE9mZnNldCA9IG9mZnNldEludDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbnVtR2x5cGhzID0gY3VyQ2hhciAtIHRleHQuZGF0
YSgpOwotICAgICAgICBpZiAoaGFzU2hhZG93KSB7Ci0gICAgICAgICAgICBTZXRUZXh0Q29sb3Io
bV9kYXRhLT5tX2RjLCBzaGFkb3dSR0JDb2xvcik7Ci0gICAgICAgICAgICBpZiAoZHJhd09uZUJ5
T25lKSB7Ci0gICAgICAgICAgICAgICAgaW50IHhTaGFkb3cgPSBmaXJzdE9mZnNldCArIHN0YWJs
ZVJvdW5kKHRyU2hhZG93UG9pbnQueCgpIC0gdHJQb2ludC54KCkpOwotICAgICAgICAgICAgICAg
IGludCB5U2hhZG93ID0gc3RhYmxlUm91bmQodHJTaGFkb3dQb2ludC55KCkpOwotICAgICAgICAg
ICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtR2x5cGhzOyArK2kpIHsKLSAgICAgICAgICAg
ICAgICAgICAgRXh0VGV4dE91dChtX2RhdGEtPm1fZGMsIHhTaGFkb3csIHlTaGFkb3csIDAsIE5V
TEwsIHRleHQuZGF0YSgpICsgaSwgMSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIHhTaGFkb3cg
Kz0gZ2x5cGhTcGFjZVtpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UK
LSAgICAgICAgICAgICAgICBFeHRUZXh0T3V0KG1fZGF0YS0+bV9kYywgZmlyc3RPZmZzZXQgKyBz
dGFibGVSb3VuZCh0clNoYWRvd1BvaW50LngoKSAtIHRyUG9pbnQueCgpKSwgc3RhYmxlUm91bmQo
dHJTaGFkb3dQb2ludC55KCkpLCAwLCBOVUxMLCB0ZXh0LmRhdGEoKSwgbnVtR2x5cGhzLCBnbHlw
aFNwYWNlLmRhdGEoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgU2V0VGV4dENvbG9yKG1fZGF0YS0+
bV9kYywgZm9udENvbG9yKTsKLSAgICAgICAgaWYgKGRyYXdPbmVCeU9uZSkgewotICAgICAgICAg
ICAgaW50IHggPSBmaXJzdE9mZnNldDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwg
bnVtR2x5cGhzOyArK2kpIHsKLSAgICAgICAgICAgICAgICBFeHRUZXh0T3V0KG1fZGF0YS0+bV9k
YywgeCwgeSwgMCwgTlVMTCwgdGV4dC5kYXRhKCkgKyBpLCAxLCAwKTsKLSAgICAgICAgICAgICAg
ICB4ICs9IGdseXBoU3BhY2VbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAg
ICAgICAgICAgRXh0VGV4dE91dChtX2RhdGEtPm1fZGMsIGZpcnN0T2Zmc2V0LCB5LCAwLCBOVUxM
LCB0ZXh0LmRhdGEoKSwgbnVtR2x5cGhzLCBnbHlwaFNwYWNlLmRhdGEoKSk7Ci0gICAgfSBlbHNl
IHsKLSAgICAgICAgVUNoYXIgYyA9ICpnbHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSk7Ci0gICAgICAg
IGlmIChoYXNTaGFkb3cpIHsKLSAgICAgICAgICAgIFNldFRleHRDb2xvcihtX2RhdGEtPm1fZGMs
IHNoYWRvd1JHQkNvbG9yKTsKLSAgICAgICAgICAgIEV4dFRleHRPdXQobV9kYXRhLT5tX2RjLCBz
dGFibGVSb3VuZCh0clNoYWRvd1BvaW50LngoKSksIHN0YWJsZVJvdW5kKHRyU2hhZG93UG9pbnQu
eSgpKSwgMCwgTlVMTCwgJmMsIDEsIDApOwotICAgICAgICB9Ci0gICAgICAgIFNldFRleHRDb2xv
cihtX2RhdGEtPm1fZGMsIGZvbnRDb2xvcik7Ci0gICAgICAgIEV4dFRleHRPdXQobV9kYXRhLT5t
X2RjLCBzdGFibGVSb3VuZCh0clBvaW50LngoKSksIHksIDAsIE5VTEwsICZjLCAxLCAwKTsKLSAg
ICB9Ci0KLSAgICBTZXRUZXh0QWxpZ24obV9kYXRhLT5tX2RjLCBvbGRUZXh0QWxpZ24pOwotICAg
IFNldFRleHRDb2xvcihtX2RhdGEtPm1fZGMsIG9sZFRleHRDb2xvcik7Ci0gICAgU2V0QmtNb2Rl
KG1fZGF0YS0+bV9kYywgb2xkQmtNb2RlKTsKLSAgICBTZWxlY3RPYmplY3QobV9kYXRhLT5tX2Rj
LCBoT2xkRm9udCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3RnJhbWVDb250cm9s
KGNvbnN0IEludFJlY3QmIHJlY3QsIHVuc2lnbmVkIHR5cGUsIHVuc2lnbmVkIHN0YXRlKQotewot
ICAgIGlmICghbV9kYXRhLT5tX29wYWNpdHkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNvbnN0
IGludCBib3hXaWR0aEJlc3QgPSA4OwotICAgIGNvbnN0IGludCBib3hIZWlnaHRCZXN0ID0gODsK
LQotICAgIFNjb3BlRENQcm92aWRlciBkY1Byb3ZpZGVyKG1fZGF0YSk7Ci0gICAgaWYgKCFtX2Rh
dGEtPm1fZGMpCi0gICAgICAgIHJldHVybjsKLQotICAgIEludFJlY3QgdHJSZWN0ID0gbV9kYXRh
LT5tYXBSZWN0KHJlY3QpOwotICAgIFRyYW5zcGFyZW50TGF5ZXJEQyB0cmFuc3BhcmVudERDKG1f
ZGF0YSwgdHJSZWN0LCAmcmVjdCwgMjU1LCB0cnVlKTsKLSAgICBIREMgZGMgPSB0cmFuc3BhcmVu
dERDLmhkYygpOwotICAgIGlmICghZGMpCi0gICAgICAgIHJldHVybjsKLSAgICB0clJlY3QubW92
ZSh0cmFuc3BhcmVudERDLnRvU2hpZnQoKSk7Ci0KLSAgICBSRUNUIHJlY3RXaW4gPSB0clJlY3Q7
Ci0KLSAgICBpZiAoKHJlY3RXaW4ucmlnaHQgLSByZWN0V2luLmxlZnQpIDwgYm94V2lkdGhCZXN0
KSB7Ci0gICAgICAgIFJlZlB0cjxTaGFyZWRCaXRtYXA+IGJtcCA9IFNoYXJlZEJpdG1hcDo6Y3Jl
YXRlSW5zdGFuY2UodHJ1ZSwgYm94V2lkdGhCZXN0LCBib3hIZWlnaHRCZXN0LCB0cnVlKTsKLSAg
ICAgICAgU2hhcmVkQml0bWFwOjpEQ0hvbGRlciBtZW1EQyhibXAuZ2V0KCkpOwotICAgICAgICBp
ZiAobWVtREMuZ2V0KCkpIHsKLSAgICAgICAgICAgIFJFQ1QgdGVtcFJlY3QgPSB7MCwgMCwgYm94
V2lkdGhCZXN0LCBib3hIZWlnaHRCZXN0fTsKLSAgICAgICAgICAgIERyYXdGcmFtZUNvbnRyb2wo
bWVtREMuZ2V0KCksICZ0ZW1wUmVjdCwgdHlwZSwgc3RhdGUpOwotCi0gICAgICAgICAgICA6OlN0
cmV0Y2hCbHQoZGMsIHJlY3RXaW4ubGVmdCwgcmVjdFdpbi50b3AsIHJlY3RXaW4ucmlnaHQgLSBy
ZWN0V2luLmxlZnQsIHJlY3RXaW4uYm90dG9tIC0gcmVjdFdpbi50b3AsIG1lbURDLmdldCgpLCAw
LCAwLCBib3hXaWR0aEJlc3QsIGJveEhlaWdodEJlc3QsIFNSQ0NPUFkpOwotICAgICAgICAgICAg
cmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgRHJhd0ZyYW1lQ29udHJvbChkYywgJnJl
Y3RXaW4sIHR5cGUsIHN0YXRlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1
c1JlY3QoY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICBpZiAoIW1fZGF0YS0+bV9vcGFjaXR5
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBTY29wZURDUHJvdmlkZXIgZGNQcm92aWRlcihtX2Rh
dGEpOwotICAgIGlmICghbV9kYXRhLT5tX2RjKQotICAgICAgICByZXR1cm47Ci0KLSAgICBJbnRS
ZWN0IHRyUmVjdCA9IG1fZGF0YS0+bWFwUmVjdChyZWN0KTsKLSAgICBUcmFuc3BhcmVudExheWVy
REMgdHJhbnNwYXJlbnREQyhtX2RhdGEsIHRyUmVjdCwgJnJlY3QpOwotICAgIEhEQyBkYyA9IHRy
YW5zcGFyZW50REMuaGRjKCk7Ci0gICAgaWYgKCFkYykKLSAgICAgICAgcmV0dXJuOwotICAgIHRy
UmVjdC5tb3ZlKHRyYW5zcGFyZW50REMudG9TaGlmdCgpKTsKLQotICAgIFJFQ1QgcmVjdFdpbiA9
IHRyUmVjdDsKLSAgICBEcmF3Rm9jdXNSZWN0KGRjLCAmcmVjdFdpbik7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpwYWludFRleHRGaWVsZChjb25zdCBJbnRSZWN0JiByZWN0LCB1bnNpZ25l
ZCBzdGF0ZSkKLXsKLSAgICBpZiAoIW1fZGF0YS0+bV9vcGFjaXR5KQotICAgICAgICByZXR1cm47
Ci0KLSAgICBTY29wZURDUHJvdmlkZXIgZGNQcm92aWRlcihtX2RhdGEpOwotICAgIGlmICghbV9k
YXRhLT5tX2RjKQotICAgICAgICByZXR1cm47Ci0KLSAgICBJbnRSZWN0IHRyUmVjdCA9IG1fZGF0
YS0+bWFwUmVjdChyZWN0KTsKLSAgICBUcmFuc3BhcmVudExheWVyREMgdHJhbnNwYXJlbnREQyht
X2RhdGEsIHRyUmVjdCwgJnJlY3QpOwotICAgIEhEQyBkYyA9IHRyYW5zcGFyZW50REMuaGRjKCk7
Ci0gICAgaWYgKCFkYykKLSAgICAgICAgcmV0dXJuOwotICAgIHRyUmVjdC5tb3ZlKHRyYW5zcGFy
ZW50REMudG9TaGlmdCgpKTsKLQotICAgIFJFQ1QgcmVjdFdpbiA9IHRyUmVjdDsKLSAgICBEcmF3
RWRnZShkYywgJnJlY3RXaW4sIEVER0VfRVRDSEVELCBCRl9SRUNUIHwgQkZfQURKVVNUKTsKLSAg
ICBGaWxsUmVjdChkYywgJnJlY3RXaW4sIHJlaW50ZXJwcmV0X2Nhc3Q8SEJSVVNIPigoKHN0YXRl
ICYgREZDU19JTkFDVElWRSkgPyBDT0xPUl9CVE5GQUNFIDogQ09MT1JfV0lORE9XKSArIDEpKTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdCaXRtYXAoU2hhcmVkQml0bWFwKiBibXAs
IGNvbnN0IEludFJlY3QmIGRzdFJlY3RJbiwgY29uc3QgSW50UmVjdCYgc3JjUmVjdCwgQ29tcG9z
aXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApCi17Ci0gICAgaWYgKCFtX2RhdGEtPm1fb3BhY2l0eSkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgU2NvcGVEQ1Byb3ZpZGVyIGRjUHJvdmlkZXIobV9kYXRh
KTsKLSAgICBpZiAoIW1fZGF0YS0+bV9kYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgSW50UmVj
dCBkc3RSZWN0ID0gbV9kYXRhLT5tYXBSZWN0KGRzdFJlY3RJbik7Ci0gICAgVHJhbnNwYXJlbnRM
YXllckRDIHRyYW5zcGFyZW50REMobV9kYXRhLCBkc3RSZWN0LCAmZHN0UmVjdEluLCAyNTUsIHRy
dWUpOwotICAgIEhEQyBkYyA9IHRyYW5zcGFyZW50REMuaGRjKCk7Ci0gICAgaWYgKCFkYykKLSAg
ICAgICAgcmV0dXJuOwotICAgIGRzdFJlY3QubW92ZSh0cmFuc3BhcmVudERDLnRvU2hpZnQoKSk7
Ci0KLSAgICBibXAtPmRyYXcoZGMsIGRzdFJlY3QsIHNyY1JlY3QsIGNvbXBvc2l0ZU9wKTsKLQot
ICAgIGlmIChibXAtPmlzMTZiaXQoKSkKLSAgICAgICAgdHJhbnNwYXJlbnREQy5maWxsQWxwaGFD
aGFubmVsKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3Qml0bWFwUGF0dGVybihT
aGFyZWRCaXRtYXAqIGJtcCwgY29uc3QgRmxvYXRSZWN0JiB0aWxlUmVjdEluLCBjb25zdCBBZmZp
bmVUcmFuc2Zvcm0mIHBhdHRlcm5UcmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgY29uc3QgRmxv
YXRQb2ludCYgcGhhc2UsIENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBjb25zdCBGbG9hdFJlY3QmIGRl
c3RSZWN0SW4sIGNvbnN0IEludFNpemUmIG9yaWdTb3VyY2VTaXplKQotewotICAgIGlmICghbV9k
YXRhLT5tX29wYWNpdHkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFNjb3BlRENQcm92aWRlciBk
Y1Byb3ZpZGVyKG1fZGF0YSk7Ci0gICAgaWYgKCFtX2RhdGEtPm1fZGMpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIEludFJlY3QgaW50RHN0UmVjdCA9IGVuY2xvc2luZ0ludFJlY3QoZGVzdFJlY3RJ
bik7Ci0gICAgSW50UmVjdCB0clJlY3QgPSBtX2RhdGEtPm1hcFJlY3QoaW50RHN0UmVjdCk7Ci0g
ICAgVHJhbnNwYXJlbnRMYXllckRDIHRyYW5zcGFyZW50REMobV9kYXRhLCB0clJlY3QsICZpbnRE
c3RSZWN0LCAyNTUsIHRydWUpOwotICAgIEhEQyBkYyA9IHRyYW5zcGFyZW50REMuaGRjKCk7Ci0g
ICAgaWYgKCFkYykKLSAgICAgICAgcmV0dXJuOwotICAgIHRyUmVjdC5tb3ZlKHRyYW5zcGFyZW50
REMudG9TaGlmdCgpKTsKLSAgICBGbG9hdFJlY3QgbW92ZWREc3RSZWN0ID0gbV9kYXRhLT5tX3Ry
YW5zZm9ybS5pbnZlcnNlKCkubWFwUmVjdChGbG9hdFJlY3QodHJSZWN0KSk7Ci0gICAgRmxvYXRT
aXplIG1vdmVkKG1vdmVkRHN0UmVjdC5sb2NhdGlvbigpIC0gZGVzdFJlY3RJbi5sb2NhdGlvbigp
KTsKLSAgICBBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtID0gbV9kYXRhLT5tX3RyYW5zZm9ybTsK
LSAgICB0cmFuc2Zvcm0udHJhbnNsYXRlKG1vdmVkLndpZHRoKCksIG1vdmVkLmhlaWdodCgpKTsK
LQotICAgIGJtcC0+ZHJhd1BhdHRlcm4oZGMsIHRyYW5zZm9ybSwgdGlsZVJlY3RJbiwgcGF0dGVy
blRyYW5zZm9ybSwgcGhhc2UsIG9wLCBkZXN0UmVjdEluLCBvcmlnU291cmNlU2l6ZSk7Ci0KLSAg
ICBpZiAoIWJtcC0+aGFzQWxwaGEoKSkKLSAgICAgICAgdHJhbnNwYXJlbnREQy5maWxsQWxwaGFD
aGFubmVsKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3SWNvbihISUNPTiBpY29u
LCBjb25zdCBJbnRSZWN0JiBkc3RSZWN0SW4sIFVJTlQgZmxhZ3MpCi17Ci0gICAgaWYgKCFtX2Rh
dGEtPm1fb3BhY2l0eSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgU2NvcGVEQ1Byb3ZpZGVyIGRj
UHJvdmlkZXIobV9kYXRhKTsKLSAgICBpZiAoIW1fZGF0YS0+bV9kYykKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgSW50UmVjdCBkc3RSZWN0ID0gbV9kYXRhLT5tYXBSZWN0KGRzdFJlY3RJbik7Ci0g
ICAgVHJhbnNwYXJlbnRMYXllckRDIHRyYW5zcGFyZW50REMobV9kYXRhLCBkc3RSZWN0LCAmZHN0
UmVjdEluLCAyNTUsIHRydWUpOwotICAgIEhEQyBkYyA9IHRyYW5zcGFyZW50REMuaGRjKCk7Ci0g
ICAgaWYgKCFkYykKLSAgICAgICAgcmV0dXJuOwotICAgIGRzdFJlY3QubW92ZSh0cmFuc3BhcmVu
dERDLnRvU2hpZnQoKSk7Ci0KLSAgICBEcmF3SWNvbkV4KGRjLCBkc3RSZWN0LngoKSwgZHN0UmVj
dC55KCksIGljb24sIGRzdFJlY3Qud2lkdGgoKSwgZHN0UmVjdC5oZWlnaHQoKSwgMCwgTlVMTCwg
ZmxhZ3MpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TaG91bGRBbnRp
YWxpYXMoYm9vbCkKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDo6c2V0TGluZURhc2goY29uc3QgRGFzaEFycmF5JiwgZmxvYXQpCi17Ci0gICAgbm90
SW1wbGVtZW50ZWQoKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBQYXRoKFdpbmRS
dWxlKQotewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VCdWZmZXJXaW5D
RS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFn
ZUJ1ZmZlcldpbkNFLmNwcAkocmV2aXNpb24gNTcyODkpCShmcm9tIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luY2UvSW1hZ2VCdWZmZXJXaW5jZS5jcHA6NTcyODkpCisrKyBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlQnVmZmVyV2luQ0UuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsMjQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmls
ZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJl
ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBM
aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo
ZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55
IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJS
QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRB
QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUK
KyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAq
CisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUg
dGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwK
KyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiSW1hZ2VCdWZmZXIuaCIKKworI2luY2x1ZGUgIkJhc2U2NC5oIgorI2lu
Y2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkltYWdlLmgiCisjaW5jbHVkZSAi
SW1hZ2VEYXRhLmgiCisjaW5jbHVkZSAiSlBFR0VuY29kZXIuaCIKKyNpbmNsdWRlICJQTkdFbmNv
ZGVyLmgiCisjaW5jbHVkZSAiU2hhcmVkQml0bWFwLmgiCisjaW5jbHVkZSA8d3RmL1VudXNlZFBh
cmFtLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQnVmZmVyZWRJbWFnZTogcHVi
bGljIEltYWdlIHsKKworcHVibGljOgorICAgIEJ1ZmZlcmVkSW1hZ2UoY29uc3QgSW1hZ2VCdWZm
ZXJEYXRhKiBkYXRhKQorICAgICAgICA6IG1fZGF0YShkYXRhKQorICAgIHsKKyAgICB9CisKKyAg
ICB2aXJ0dWFsIEludFNpemUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEludFNpemUobV9kYXRhLT5t
X2JpdG1hcC0+d2lkdGgoKSwgbV9kYXRhLT5tX2JpdG1hcC0+aGVpZ2h0KCkpOyB9CisgICAgdmly
dHVhbCB2b2lkIGRlc3Ryb3lEZWNvZGVkRGF0YShib29sIGRlc3Ryb3lBbGwgPSB0cnVlKSB7fQor
ICAgIHZpcnR1YWwgdW5zaWduZWQgZGVjb2RlZFNpemUoKSBjb25zdCB7IHJldHVybiAwOyB9Cisg
ICAgdmlydHVhbCB2b2lkIGRyYXcoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgRmxvYXRSZWN0JiBk
c3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yKTsKKyAg
ICB2aXJ0dWFsIHZvaWQgZHJhd1BhdHRlcm4oR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgRmxvYXRS
ZWN0JiBzcmNSZWN0LCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHBhdHRlcm5UcmFuc2Zvcm0sCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIHBoYXNlLCBDb21w
b3NpdGVPcGVyYXRvciwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCk7CisKKyAgICBjb25zdCBJ
bWFnZUJ1ZmZlckRhdGEqIG1fZGF0YTsKK307CisKK3ZvaWQgQnVmZmVyZWRJbWFnZTo6ZHJhdyhH
cmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgY29uc3QgRmxv
YXRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCkKK3sKKyAgICBJ
bnRSZWN0IGludERzdFJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KGRzdFJlY3QpOworICAgIEludFJl
Y3QgaW50U3JjUmVjdChzcmNSZWN0KTsKKyAgICBtX2RhdGEtPm1fYml0bWFwLT5kcmF3KGN0eHQs
IGludERzdFJlY3QsIGludFNyY1JlY3QsIGNvbXBvc2l0ZU9wKTsKK30KKwordm9pZCBCdWZmZXJl
ZEltYWdlOjpkcmF3UGF0dGVybihHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVj
dCYgdGlsZVJlY3RJbiwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBwYXR0ZXJuVHJhbnNmb3JtLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbG9hdFBvaW50JiBwaGFzZSwgQ29t
cG9zaXRlT3BlcmF0b3Igb3AsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QpCit7CisgICAgbV9k
YXRhLT5tX2JpdG1hcC0+ZHJhd1BhdHRlcm4oY3R4dCwgdGlsZVJlY3RJbiwgcGF0dGVyblRyYW5z
Zm9ybSwgcGhhc2UsIG9wLCBkZXN0UmVjdCwgc2l6ZSgpKTsKK30KKworSW1hZ2VCdWZmZXJEYXRh
OjpJbWFnZUJ1ZmZlckRhdGEoY29uc3QgSW50U2l6ZSYgc2l6ZSkKKzogbV9iaXRtYXAoU2hhcmVk
Qml0bWFwOjpjcmVhdGVJbnN0YW5jZShmYWxzZSwgc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgp
LCBmYWxzZSkpCit7CisgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwOS9XRC1odG1sNS0y
MDA5MDIxMi90aGUtY2FudmFzLWVsZW1lbnQuaHRtbCNjYW52YXNwaXhlbGFycmF5CisgICAgLy8g
IldoZW4gdGhlIGNhbnZhcyBpcyBpbml0aWFsaXplZCBpdCBtdXN0IGJlIHNldCB0byBmdWxseSB0
cmFuc3BhcmVudCBibGFjay4iCisgICAgbV9iaXRtYXAtPnJlc2V0UGl4ZWxzKHRydWUpOworICAg
IG1fYml0bWFwLT5zZXRIYXNBbHBoYSh0cnVlKTsKK30KKworSW1hZ2VCdWZmZXI6OkltYWdlQnVm
ZmVyKGNvbnN0IEludFNpemUmIHNpemUsIEltYWdlQ29sb3JTcGFjZSBjb2xvclNwYWNlLCBib29s
JiBzdWNjZXNzKQorICAgIDogbV9kYXRhKHNpemUpCisgICAgLCBtX3NpemUoc2l6ZSkKK3sKKyAg
ICAvLyBGSVhNRTogY29sb3JTcGFjZSBpcyBub3QgdXNlZAorICAgIFVOVVNFRF9QQVJBTShjb2xv
clNwYWNlKTsKKworICAgIG1fY29udGV4dC5zZXQobmV3IEdyYXBoaWNzQ29udGV4dCgwKSk7Cisg
ICAgbV9jb250ZXh0LT5zZXRCaXRtYXAobV9kYXRhLm1fYml0bWFwKTsKKyAgICBzdWNjZXNzID0g
dHJ1ZTsKK30KKworSW1hZ2VCdWZmZXI6On5JbWFnZUJ1ZmZlcigpCit7Cit9CisKK0dyYXBoaWNz
Q29udGV4dCogSW1hZ2VCdWZmZXI6OmNvbnRleHQoKSBjb25zdAoreworICAgIHJldHVybiBtX2Nv
bnRleHQuZ2V0KCk7Cit9CisKK0ltYWdlKiBJbWFnZUJ1ZmZlcjo6aW1hZ2UoKSBjb25zdAorewor
ICAgIGlmICghbV9pbWFnZSkKKyAgICAgICAgbV9pbWFnZSA9IGFkb3B0UmVmKG5ldyBCdWZmZXJl
ZEltYWdlKCZtX2RhdGEpKTsKKworICAgIHJldHVybiBtX2ltYWdlLmdldCgpOworfQorCit0ZW1w
bGF0ZSA8Ym9vbCBwcmVtdWx0aXBsaWVkPiBQYXNzUmVmUHRyPEltYWdlRGF0YT4KK3N0YXRpYyBn
ZXRJbWFnZURhdGEoY29uc3QgSW50UmVjdCYgcmVjdCwgY29uc3QgU2hhcmVkQml0bWFwKiBiaXRt
YXApCit7CisgICAgUGFzc1JlZlB0cjxJbWFnZURhdGE+IGltYWdlRGF0YSA9IEltYWdlRGF0YTo6
Y3JlYXRlKHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7CisKKyAgICBjb25zdCB1bnNpZ25l
ZCBjaGFyKiBzcmMgPSBzdGF0aWNfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oYml0bWFwLT5i
eXRlcygpKTsKKyAgICBpZiAoIXNyYykKKyAgICAgICAgcmV0dXJuIGltYWdlRGF0YTsKKworICAg
IEludFJlY3Qgc291cmNlUmVjdCgwLCAwLCBiaXRtYXAtPndpZHRoKCksIGJpdG1hcC0+aGVpZ2h0
KCkpOworICAgIHNvdXJjZVJlY3QuaW50ZXJzZWN0KHJlY3QpOworICAgIGlmIChzb3VyY2VSZWN0
LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGltYWdlRGF0YTsKKworICAgIHVuc2lnbmVkIGNo
YXIqIGRzdCA9IGltYWdlRGF0YS0+ZGF0YSgpLT5kYXRhKCktPmRhdGEoKTsKKyAgICBtZW1zZXQo
ZHN0LCAwLCBpbWFnZURhdGEtPmRhdGEoKS0+ZGF0YSgpLT5sZW5ndGgoKSk7CisgICAgc3JjICs9
IChzb3VyY2VSZWN0LnkoKSAqIGJpdG1hcC0+d2lkdGgoKSArIHNvdXJjZVJlY3QueCgpKSAqIDQ7
CisgICAgZHN0ICs9ICgoc291cmNlUmVjdC55KCkgLSByZWN0LnkoKSkgKiBpbWFnZURhdGEtPndp
ZHRoKCkgKyBzb3VyY2VSZWN0LngoKSAtIHJlY3QueCgpKSAqIDQ7CisgICAgaW50IGJ5dGVzVG9D
b3B5ID0gc291cmNlUmVjdC53aWR0aCgpICogNDsKKyAgICBpbnQgc3JjU2tpcCA9IChiaXRtYXAt
PndpZHRoKCkgLSBzb3VyY2VSZWN0LndpZHRoKCkpICogNDsKKyAgICBpbnQgZHN0U2tpcCA9IChp
bWFnZURhdGEtPndpZHRoKCkgLSBzb3VyY2VSZWN0LndpZHRoKCkpICogNDsKKyAgICBjb25zdCB1
bnNpZ25lZCBjaGFyKiBkc3RFbmQgPSBkc3QgKyBzb3VyY2VSZWN0LmhlaWdodCgpICogaW1hZ2VE
YXRhLT53aWR0aCgpICogNDsKKyAgICB3aGlsZSAoZHN0IDwgZHN0RW5kKSB7CisgICAgICAgIGNv
bnN0IHVuc2lnbmVkIGNoYXIqIGRzdFJvd0VuZCA9IGRzdCArIGJ5dGVzVG9Db3B5OworICAgICAg
ICB3aGlsZSAoZHN0IDwgZHN0Um93RW5kKSB7CisgICAgICAgICAgICAvLyBDb252ZXJ0IEFSR0Ig
bGl0dGxlIGVuZGlhbiB0byBSR0JBIGJpZyBlbmRpYW4KKyAgICAgICAgICAgIGludCBibHVlID0g
KnNyYysrOworICAgICAgICAgICAgaW50IGdyZWVuID0gKnNyYysrOworICAgICAgICAgICAgaW50
IHJlZCA9ICpzcmMrKzsKKyAgICAgICAgICAgIGludCBhbHBoYSA9ICpzcmMrKzsKKyAgICAgICAg
ICAgIGlmIChwcmVtdWx0aXBsaWVkKSB7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gc3RhdGlj
X2Nhc3Q8dW5zaWduZWQgY2hhcj4oKHJlZCAqIGFscGhhICsgMjU0KSAvIDI1NSk7CisgICAgICAg
ICAgICAgICAgKmRzdCsrID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oKGdyZWVuICogYWxw
aGEgKyAyNTQpIC8gMjU1KTsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBzdGF0aWNfY2FzdDx1
bnNpZ25lZCBjaGFyPigoYmx1ZSAqIGFscGhhICsgMjU0KSAvIDI1NSk7CisgICAgICAgICAgICAg
ICAgKmRzdCsrID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYWxwaGEpOworICAgICAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBzdGF0aWNfY2FzdDx1bnNpZ25l
ZCBjaGFyPihyZWQpOworICAgICAgICAgICAgICAgICpkc3QrKyA9IHN0YXRpY19jYXN0PHVuc2ln
bmVkIGNoYXI+KGdyZWVuKTsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBzdGF0aWNfY2FzdDx1
bnNpZ25lZCBjaGFyPihibHVlKTsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBzdGF0aWNfY2Fz
dDx1bnNpZ25lZCBjaGFyPihhbHBoYSk7CisgICAgICAgICAgICAgICAgKytzcmM7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3JjICs9IHNyY1NraXA7CisgICAgICAgIGRzdCAr
PSBkc3RTa2lwOworICAgIH0KKworICAgIHJldHVybiBpbWFnZURhdGE7Cit9CisKK1Bhc3NSZWZQ
dHI8SW1hZ2VEYXRhPiBJbWFnZUJ1ZmZlcjo6Z2V0VW5tdWx0aXBsaWVkSW1hZ2VEYXRhKGNvbnN0
IEludFJlY3QmIHJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIGdldEltYWdlRGF0YTxmYWxzZT4o
cmVjdCwgbV9kYXRhLm1fYml0bWFwLmdldCgpKTsKK30KKworUGFzc1JlZlB0cjxJbWFnZURhdGE+
IEltYWdlQnVmZmVyOjpnZXRQcmVtdWx0aXBsaWVkSW1hZ2VEYXRhKGNvbnN0IEludFJlY3QmIHJl
Y3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIGdldEltYWdlRGF0YTx0cnVlPihyZWN0LCBtX2RhdGEu
bV9iaXRtYXAuZ2V0KCkpOworfQorCit0ZW1wbGF0ZSA8Ym9vbCBwcmVtdWx0aXBsaWVkPgorc3Rh
dGljIHZvaWQgcHV0SW1hZ2VEYXRhKEltYWdlRGF0YSogc291cmNlLCBjb25zdCBJbnRSZWN0JiBz
b3VyY2VSZWN0LCBjb25zdCBJbnRQb2ludCYgZGVzdFBvaW50LCBTaGFyZWRCaXRtYXAqIGJpdG1h
cCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyKiBkc3QgPSAodW5zaWduZWQgY2hhciopYml0bWFwLT5i
eXRlcygpOworICAgIGlmICghZHN0KQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRSZWN0IGRl
c3RSZWN0KGRlc3RQb2ludCwgc291cmNlUmVjdC5zaXplKCkpOworICAgIGRlc3RSZWN0LmludGVy
c2VjdChJbnRSZWN0KDAsIDAsIGJpdG1hcC0+d2lkdGgoKSwgYml0bWFwLT5oZWlnaHQoKSkpOwor
CisgICAgaWYgKGRlc3RSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY29u
c3QgdW5zaWduZWQgY2hhciogc3JjID0gc291cmNlLT5kYXRhKCktPmRhdGEoKS0+ZGF0YSgpOwor
ICAgIGRzdCArPSAoZGVzdFJlY3QueSgpICogYml0bWFwLT53aWR0aCgpICsgZGVzdFJlY3QueCgp
KSAqIDQ7CisgICAgc3JjICs9IChzb3VyY2VSZWN0LnkoKSAqIHNvdXJjZS0+d2lkdGgoKSArIHNv
dXJjZVJlY3QueCgpKSAqIDQ7CisgICAgaW50IGJ5dGVzVG9Db3B5ID0gZGVzdFJlY3Qud2lkdGgo
KSAqIDQ7CisgICAgaW50IGRzdFNraXAgPSAoYml0bWFwLT53aWR0aCgpIC0gZGVzdFJlY3Qud2lk
dGgoKSkgKiA0OworICAgIGludCBzcmNTa2lwID0gKHNvdXJjZS0+d2lkdGgoKSAtIGRlc3RSZWN0
LndpZHRoKCkpICogNDsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBkc3RFbmQgPSBkc3QgKyBk
ZXN0UmVjdC5oZWlnaHQoKSAqIGJpdG1hcC0+d2lkdGgoKSAqIDQ7CisgICAgd2hpbGUgKGRzdCA8
IGRzdEVuZCkgeworICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBkc3RSb3dFbmQgPSBkc3Qg
KyBieXRlc1RvQ29weTsKKyAgICAgICAgd2hpbGUgKGRzdCA8IGRzdFJvd0VuZCkgeworICAgICAg
ICAgICAgLy8gQ29udmVydCBSR0JBIGJpZyBlbmRpYW4gdG8gQVJHQiBsaXR0bGUgZW5kaWFuCisg
ICAgICAgICAgICBpbnQgcmVkID0gKnNyYysrOworICAgICAgICAgICAgaW50IGdyZWVuID0gKnNy
YysrOworICAgICAgICAgICAgaW50IGJsdWUgPSAqc3JjKys7CisgICAgICAgICAgICBpbnQgYWxw
aGEgPSAqc3JjKys7CisgICAgICAgICAgICBpZiAocHJlbXVsdGlwbGllZCkgeworICAgICAgICAg
ICAgICAgICpkc3QrKyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGJsdWUgKiAyNTUgLyBh
bHBoYSk7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hh
cj4oZ3JlZW4gKiAyNTUgLyBhbHBoYSk7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gc3RhdGlj
X2Nhc3Q8dW5zaWduZWQgY2hhcj4ocmVkICogMjU1IC8gYWxwaGEpOworICAgICAgICAgICAgICAg
ICpkc3QrKyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGFscGhhKTsKKyAgICAgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQg
Y2hhcj4oYmx1ZSk7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gc3RhdGljX2Nhc3Q8dW5zaWdu
ZWQgY2hhcj4oZ3JlZW4pOworICAgICAgICAgICAgICAgICpkc3QrKyA9IHN0YXRpY19jYXN0PHVu
c2lnbmVkIGNoYXI+KHJlZCk7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gc3RhdGljX2Nhc3Q8
dW5zaWduZWQgY2hhcj4oYWxwaGEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAg
IHNyYyArPSBzcmNTa2lwOworICAgICAgICBkc3QgKz0gZHN0U2tpcDsKKyAgICB9Cit9CisKK3Zv
aWQgSW1hZ2VCdWZmZXI6OnB1dFVubXVsdGlwbGllZEltYWdlRGF0YShJbWFnZURhdGEqIHNvdXJj
ZSwgY29uc3QgSW50UmVjdCYgc291cmNlUmVjdCwgY29uc3QgSW50UG9pbnQmIGRlc3RQb2ludCkK
K3sKKyAgICBwdXRJbWFnZURhdGE8ZmFsc2U+KHNvdXJjZSwgc291cmNlUmVjdCwgZGVzdFBvaW50
LCBtX2RhdGEubV9iaXRtYXAuZ2V0KCkpOworfQorCit2b2lkIEltYWdlQnVmZmVyOjpwdXRQcmVt
dWx0aXBsaWVkSW1hZ2VEYXRhKEltYWdlRGF0YSogc291cmNlLCBjb25zdCBJbnRSZWN0JiBzb3Vy
Y2VSZWN0LCBjb25zdCBJbnRQb2ludCYgZGVzdFBvaW50KQoreworICAgIHB1dEltYWdlRGF0YTx0
cnVlPihzb3VyY2UsIHNvdXJjZVJlY3QsIGRlc3RQb2ludCwgbV9kYXRhLm1fYml0bWFwLmdldCgp
KTsKK30KKworU3RyaW5nIEltYWdlQnVmZmVyOjp0b0RhdGFVUkwoY29uc3QgU3RyaW5nJiBtaW1l
VHlwZSkgY29uc3QKK3sKKyAgICBpZiAoIW1fZGF0YS5tX2JpdG1hcC0+Ynl0ZXMoKSkKKyAgICAg
ICAgcmV0dXJuICJkYXRhOiwiOworCisgICAgVmVjdG9yPGNoYXI+IG91dHB1dDsKKyAgICBjb25z
dCBjaGFyKiBoZWFkZXI7CisgICAgaWYgKG1pbWVUeXBlLmxvd2VyKCkgPT0gImltYWdlL3BuZyIp
IHsKKyAgICAgICAgaWYgKCFjb21wcmVzc0JpdG1hcFRvUG5nKG1fZGF0YS5tX2JpdG1hcC5nZXQo
KSwgb3V0cHV0KSkKKyAgICAgICAgICAgIHJldHVybiAiZGF0YTosIjsKKyAgICAgICAgaGVhZGVy
ID0gImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwiOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgh
Y29tcHJlc3NCaXRtYXBUb0pwZWcobV9kYXRhLm1fYml0bWFwLmdldCgpLCBvdXRwdXQpKQorICAg
ICAgICAgICAgcmV0dXJuICJkYXRhOiwiOworICAgICAgICBoZWFkZXIgPSAiZGF0YTppbWFnZS9q
cGVnO2Jhc2U2NCwiOworICAgIH0KKworICAgIFZlY3RvcjxjaGFyPiBiYXNlNjQ7CisgICAgYmFz
ZTY0RW5jb2RlKG91dHB1dCwgYmFzZTY0KTsKKworICAgIG91dHB1dC5jbGVhcigpOworCisgICAg
VmVjdG9yPGNoYXI+IHVybDsKKyAgICB1cmwuYXBwZW5kKGhlYWRlciwgc3RybGVuKGhlYWRlcikp
OworICAgIHVybC5hcHBlbmQoYmFzZTY0KTsKKworICAgIHJldHVybiBTdHJpbmcodXJsLmRhdGEo
KSwgdXJsLnNpemUoKSk7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luY2UvSW1hZ2VCdWZmZXJXaW5DRS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW5jZS9JbWFnZUJ1ZmZlcldpbkNFLmNwcAkocmV2aXNpb24gNTcyODkpCisr
KyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlQnVmZmVyV2luQ0UuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0yNDQsNCArMjQ0LDQgQEAgU3RyaW5nIEltYWdlQnVmZmVyOjp0b0Rh
dGFVUkwoY29uc3QgU3RyaQogICAgIHJldHVybiBTdHJpbmcodXJsLmRhdGEoKSwgdXJsLnNpemUo
KSk7CiB9CiAKLX0KK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VCdWZmZXJXaW5jZS5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZUJ1ZmZlcldpbmNlLmNwcAkocmV2aXNp
b24gNTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlQnVmZmVy
V2luY2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDI0NyArMCwwIEBACi0vKgotICogQ29weXJp
Z2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoK
LSAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg
aXQgYW5kL29yCi0gKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMKLSAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2Us
IG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMgbGli
cmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAot
ICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh
cnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vu
c2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg
Y29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25n
IHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdy
aXRlIHRvCi0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmts
aW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4K
LSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiSW1hZ2VCdWZmZXIuaCIKLQot
I2luY2x1ZGUgIkJhc2U2NC5oIgotI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgotI2luY2x1
ZGUgIkltYWdlLmgiCi0jaW5jbHVkZSAiSW1hZ2VEYXRhLmgiCi0jaW5jbHVkZSAiSlBFR0VuY29k
ZXIuaCIKLSNpbmNsdWRlICJQTkdFbmNvZGVyLmgiCi0jaW5jbHVkZSAiU2hhcmVkQml0bWFwLmgi
Ci0jaW5jbHVkZSA8d3RmL1VudXNlZFBhcmFtLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQot
Y2xhc3MgQnVmZmVyZWRJbWFnZTogcHVibGljIEltYWdlIHsKLQotcHVibGljOgotICAgIEJ1ZmZl
cmVkSW1hZ2UoY29uc3QgSW1hZ2VCdWZmZXJEYXRhKiBkYXRhKQotICAgICAgICA6IG1fZGF0YShk
YXRhKQotICAgIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIEludFNpemUgc2l6ZSgpIGNvbnN0IHsg
cmV0dXJuIEludFNpemUobV9kYXRhLT5tX2JpdG1hcC0+d2lkdGgoKSwgbV9kYXRhLT5tX2JpdG1h
cC0+aGVpZ2h0KCkpOyB9Ci0gICAgdmlydHVhbCB2b2lkIGRlc3Ryb3lEZWNvZGVkRGF0YShib29s
IGRlc3Ryb3lBbGwgPSB0cnVlKSB7fQotICAgIHZpcnR1YWwgdW5zaWduZWQgZGVjb2RlZFNpemUo
KSBjb25zdCB7IHJldHVybiAwOyB9Ci0gICAgdmlydHVhbCB2b2lkIGRyYXcoR3JhcGhpY3NDb250
ZXh0KiwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3Qs
IENvbXBvc2l0ZU9wZXJhdG9yKTsKLSAgICB2aXJ0dWFsIHZvaWQgZHJhd1BhdHRlcm4oR3JhcGhp
Y3NDb250ZXh0KiwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBjb25zdCBBZmZpbmVUcmFuc2Zv
cm0mIHBhdHRlcm5UcmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0
IEZsb2F0UG9pbnQmIHBoYXNlLCBDb21wb3NpdGVPcGVyYXRvciwgY29uc3QgRmxvYXRSZWN0JiBk
ZXN0UmVjdCk7Ci0KLSAgICBjb25zdCBJbWFnZUJ1ZmZlckRhdGEqIG1fZGF0YTsKLX07Ci0KLXZv
aWQgQnVmZmVyZWRJbWFnZTo6ZHJhdyhHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0
UmVjdCYgZHN0UmVjdCwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRv
ciBjb21wb3NpdGVPcCkKLXsKLSAgICBJbnRSZWN0IGludERzdFJlY3QgPSBlbmNsb3NpbmdJbnRS
ZWN0KGRzdFJlY3QpOwotICAgIEludFJlY3QgaW50U3JjUmVjdChzcmNSZWN0KTsKLSAgICBtX2Rh
dGEtPm1fYml0bWFwLT5kcmF3KGN0eHQsIGludERzdFJlY3QsIGludFNyY1JlY3QsIGNvbXBvc2l0
ZU9wKTsKLX0KLQotdm9pZCBCdWZmZXJlZEltYWdlOjpkcmF3UGF0dGVybihHcmFwaGljc0NvbnRl
eHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgdGlsZVJlY3RJbiwgY29uc3QgQWZmaW5lVHJhbnNm
b3JtJiBwYXR0ZXJuVHJhbnNmb3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25z
dCBGbG9hdFBvaW50JiBwaGFzZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIGNvbnN0IEZsb2F0UmVj
dCYgZGVzdFJlY3QpCi17Ci0gICAgbV9kYXRhLT5tX2JpdG1hcC0+ZHJhd1BhdHRlcm4oY3R4dCwg
dGlsZVJlY3RJbiwgcGF0dGVyblRyYW5zZm9ybSwgcGhhc2UsIG9wLCBkZXN0UmVjdCwgc2l6ZSgp
KTsKLX0KLQotSW1hZ2VCdWZmZXJEYXRhOjpJbWFnZUJ1ZmZlckRhdGEoY29uc3QgSW50U2l6ZSYg
c2l6ZSkKLTogbV9iaXRtYXAoU2hhcmVkQml0bWFwOjpjcmVhdGVJbnN0YW5jZShmYWxzZSwgc2l6
ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpLCBmYWxzZSkpCi17Ci0gICAgLy8gaHR0cDovL3d3dy53
My5vcmcvVFIvMjAwOS9XRC1odG1sNS0yMDA5MDIxMi90aGUtY2FudmFzLWVsZW1lbnQuaHRtbCNj
YW52YXNwaXhlbGFycmF5Ci0gICAgLy8gIldoZW4gdGhlIGNhbnZhcyBpcyBpbml0aWFsaXplZCBp
dCBtdXN0IGJlIHNldCB0byBmdWxseSB0cmFuc3BhcmVudCBibGFjay4iCi0gICAgbV9iaXRtYXAt
PnJlc2V0UGl4ZWxzKHRydWUpOwotICAgIG1fYml0bWFwLT5zZXRIYXNBbHBoYSh0cnVlKTsKLX0K
LQotSW1hZ2VCdWZmZXI6OkltYWdlQnVmZmVyKGNvbnN0IEludFNpemUmIHNpemUsIEltYWdlQ29s
b3JTcGFjZSBjb2xvclNwYWNlLCBib29sJiBzdWNjZXNzKQotICAgIDogbV9kYXRhKHNpemUpCi0g
ICAgLCBtX3NpemUoc2l6ZSkKLXsKLSAgICAvLyBGSVhNRTogY29sb3JTcGFjZSBpcyBub3QgdXNl
ZAotICAgIFVOVVNFRF9QQVJBTShjb2xvclNwYWNlKTsKLQotICAgIG1fY29udGV4dC5zZXQobmV3
IEdyYXBoaWNzQ29udGV4dCgwKSk7Ci0gICAgbV9jb250ZXh0LT5zZXRCaXRtYXAobV9kYXRhLm1f
Yml0bWFwKTsKLSAgICBzdWNjZXNzID0gdHJ1ZTsKLX0KLQotSW1hZ2VCdWZmZXI6On5JbWFnZUJ1
ZmZlcigpCi17Ci19Ci0KLUdyYXBoaWNzQ29udGV4dCogSW1hZ2VCdWZmZXI6OmNvbnRleHQoKSBj
b25zdAotewotICAgIHJldHVybiBtX2NvbnRleHQuZ2V0KCk7Ci19Ci0KLUltYWdlKiBJbWFnZUJ1
ZmZlcjo6aW1hZ2UoKSBjb25zdAotewotICAgIGlmICghbV9pbWFnZSkKLSAgICAgICAgbV9pbWFn
ZSA9IGFkb3B0UmVmKG5ldyBCdWZmZXJlZEltYWdlKCZtX2RhdGEpKTsKLQotICAgIHJldHVybiBt
X2ltYWdlLmdldCgpOwotfQotCi10ZW1wbGF0ZSA8Ym9vbCBwcmVtdWx0aXBsaWVkPiBQYXNzUmVm
UHRyPEltYWdlRGF0YT4KLXN0YXRpYyBnZXRJbWFnZURhdGEoY29uc3QgSW50UmVjdCYgcmVjdCwg
Y29uc3QgU2hhcmVkQml0bWFwKiBiaXRtYXApCi17Ci0gICAgUGFzc1JlZlB0cjxJbWFnZURhdGE+
IGltYWdlRGF0YSA9IEltYWdlRGF0YTo6Y3JlYXRlKHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQo
KSk7Ci0KLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBzcmMgPSBzdGF0aWNfY2FzdDxjb25zdCB1
bnNpZ25lZCBjaGFyKj4oYml0bWFwLT5ieXRlcygpKTsKLSAgICBpZiAoIXNyYykKLSAgICAgICAg
cmV0dXJuIGltYWdlRGF0YTsKLQotICAgIEludFJlY3Qgc291cmNlUmVjdCgwLCAwLCBiaXRtYXAt
PndpZHRoKCksIGJpdG1hcC0+aGVpZ2h0KCkpOwotICAgIHNvdXJjZVJlY3QuaW50ZXJzZWN0KHJl
Y3QpOwotICAgIGlmIChzb3VyY2VSZWN0LmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIGltYWdl
RGF0YTsKLQotICAgIHVuc2lnbmVkIGNoYXIqIGRzdCA9IGltYWdlRGF0YS0+ZGF0YSgpLT5kYXRh
KCktPmRhdGEoKTsKLSAgICBtZW1zZXQoZHN0LCAwLCBpbWFnZURhdGEtPmRhdGEoKS0+ZGF0YSgp
LT5sZW5ndGgoKSk7Ci0gICAgc3JjICs9IChzb3VyY2VSZWN0LnkoKSAqIGJpdG1hcC0+d2lkdGgo
KSArIHNvdXJjZVJlY3QueCgpKSAqIDQ7Ci0gICAgZHN0ICs9ICgoc291cmNlUmVjdC55KCkgLSBy
ZWN0LnkoKSkgKiBpbWFnZURhdGEtPndpZHRoKCkgKyBzb3VyY2VSZWN0LngoKSAtIHJlY3QueCgp
KSAqIDQ7Ci0gICAgaW50IGJ5dGVzVG9Db3B5ID0gc291cmNlUmVjdC53aWR0aCgpICogNDsKLSAg
ICBpbnQgc3JjU2tpcCA9IChiaXRtYXAtPndpZHRoKCkgLSBzb3VyY2VSZWN0LndpZHRoKCkpICog
NDsKLSAgICBpbnQgZHN0U2tpcCA9IChpbWFnZURhdGEtPndpZHRoKCkgLSBzb3VyY2VSZWN0Lndp
ZHRoKCkpICogNDsKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBkc3RFbmQgPSBkc3QgKyBzb3Vy
Y2VSZWN0LmhlaWdodCgpICogaW1hZ2VEYXRhLT53aWR0aCgpICogNDsKLSAgICB3aGlsZSAoZHN0
IDwgZHN0RW5kKSB7Ci0gICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRzdFJvd0VuZCA9IGRz
dCArIGJ5dGVzVG9Db3B5OwotICAgICAgICB3aGlsZSAoZHN0IDwgZHN0Um93RW5kKSB7Ci0gICAg
ICAgICAgICAvLyBDb252ZXJ0IEFSR0IgbGl0dGxlIGVuZGlhbiB0byBSR0JBIGJpZyBlbmRpYW4K
LSAgICAgICAgICAgIGludCBibHVlID0gKnNyYysrOwotICAgICAgICAgICAgaW50IGdyZWVuID0g
KnNyYysrOwotICAgICAgICAgICAgaW50IHJlZCA9ICpzcmMrKzsKLSAgICAgICAgICAgIGludCBh
bHBoYSA9ICpzcmMrKzsKLSAgICAgICAgICAgIGlmIChwcmVtdWx0aXBsaWVkKSB7Ci0gICAgICAg
ICAgICAgICAgKmRzdCsrID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oKHJlZCAqIGFscGhh
ICsgMjU0KSAvIDI1NSk7Ci0gICAgICAgICAgICAgICAgKmRzdCsrID0gc3RhdGljX2Nhc3Q8dW5z
aWduZWQgY2hhcj4oKGdyZWVuICogYWxwaGEgKyAyNTQpIC8gMjU1KTsKLSAgICAgICAgICAgICAg
ICAqZHN0KysgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigoYmx1ZSAqIGFscGhhICsgMjU0
KSAvIDI1NSk7Ci0gICAgICAgICAgICAgICAgKmRzdCsrID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQg
Y2hhcj4oYWxwaGEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAqZHN0
KysgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihyZWQpOwotICAgICAgICAgICAgICAgICpk
c3QrKyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGdyZWVuKTsKLSAgICAgICAgICAgICAg
ICAqZHN0KysgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihibHVlKTsKLSAgICAgICAgICAg
ICAgICAqZHN0KysgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihhbHBoYSk7Ci0gICAgICAg
ICAgICAgICAgKytzcmM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3JjICs9
IHNyY1NraXA7Ci0gICAgICAgIGRzdCArPSBkc3RTa2lwOwotICAgIH0KLQotICAgIHJldHVybiBp
bWFnZURhdGE7Ci19Ci0KLVBhc3NSZWZQdHI8SW1hZ2VEYXRhPiBJbWFnZUJ1ZmZlcjo6Z2V0VW5t
dWx0aXBsaWVkSW1hZ2VEYXRhKGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIGdldEltYWdlRGF0YTxmYWxzZT4ocmVjdCwgbV9kYXRhLm1fYml0bWFwLmdldCgpKTsKLX0K
LQotUGFzc1JlZlB0cjxJbWFnZURhdGE+IEltYWdlQnVmZmVyOjpnZXRQcmVtdWx0aXBsaWVkSW1h
Z2VEYXRhKGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEltYWdl
RGF0YTx0cnVlPihyZWN0LCBtX2RhdGEubV9iaXRtYXAuZ2V0KCkpOwotfQotCi10ZW1wbGF0ZSA8
Ym9vbCBwcmVtdWx0aXBsaWVkPgotc3RhdGljIHZvaWQgcHV0SW1hZ2VEYXRhKEltYWdlRGF0YSog
c291cmNlLCBjb25zdCBJbnRSZWN0JiBzb3VyY2VSZWN0LCBjb25zdCBJbnRQb2ludCYgZGVzdFBv
aW50LCBTaGFyZWRCaXRtYXAqIGJpdG1hcCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyKiBkc3QgPSAo
dW5zaWduZWQgY2hhciopYml0bWFwLT5ieXRlcygpOwotICAgIGlmICghZHN0KQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBJbnRSZWN0IGRlc3RSZWN0KGRlc3RQb2ludCwgc291cmNlUmVjdC5zaXpl
KCkpOwotICAgIGRlc3RSZWN0LmludGVyc2VjdChJbnRSZWN0KDAsIDAsIGJpdG1hcC0+d2lkdGgo
KSwgYml0bWFwLT5oZWlnaHQoKSkpOwotCi0gICAgaWYgKGRlc3RSZWN0LmlzRW1wdHkoKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciogc3JjID0gc291cmNlLT5k
YXRhKCktPmRhdGEoKS0+ZGF0YSgpOwotICAgIGRzdCArPSAoZGVzdFJlY3QueSgpICogYml0bWFw
LT53aWR0aCgpICsgZGVzdFJlY3QueCgpKSAqIDQ7Ci0gICAgc3JjICs9IChzb3VyY2VSZWN0Lnko
KSAqIHNvdXJjZS0+d2lkdGgoKSArIHNvdXJjZVJlY3QueCgpKSAqIDQ7Ci0gICAgaW50IGJ5dGVz
VG9Db3B5ID0gZGVzdFJlY3Qud2lkdGgoKSAqIDQ7Ci0gICAgaW50IGRzdFNraXAgPSAoYml0bWFw
LT53aWR0aCgpIC0gZGVzdFJlY3Qud2lkdGgoKSkgKiA0OwotICAgIGludCBzcmNTa2lwID0gKHNv
dXJjZS0+d2lkdGgoKSAtIGRlc3RSZWN0LndpZHRoKCkpICogNDsKLSAgICBjb25zdCB1bnNpZ25l
ZCBjaGFyKiBkc3RFbmQgPSBkc3QgKyBkZXN0UmVjdC5oZWlnaHQoKSAqIGJpdG1hcC0+d2lkdGgo
KSAqIDQ7Ci0gICAgd2hpbGUgKGRzdCA8IGRzdEVuZCkgewotICAgICAgICBjb25zdCB1bnNpZ25l
ZCBjaGFyKiBkc3RSb3dFbmQgPSBkc3QgKyBieXRlc1RvQ29weTsKLSAgICAgICAgd2hpbGUgKGRz
dCA8IGRzdFJvd0VuZCkgewotICAgICAgICAgICAgLy8gQ29udmVydCBSR0JBIGJpZyBlbmRpYW4g
dG8gQVJHQiBsaXR0bGUgZW5kaWFuCi0gICAgICAgICAgICBpbnQgcmVkID0gKnNyYysrOwotICAg
ICAgICAgICAgaW50IGdyZWVuID0gKnNyYysrOwotICAgICAgICAgICAgaW50IGJsdWUgPSAqc3Jj
Kys7Ci0gICAgICAgICAgICBpbnQgYWxwaGEgPSAqc3JjKys7Ci0gICAgICAgICAgICBpZiAocHJl
bXVsdGlwbGllZCkgewotICAgICAgICAgICAgICAgICpkc3QrKyA9IHN0YXRpY19jYXN0PHVuc2ln
bmVkIGNoYXI+KGJsdWUgKiAyNTUgLyBhbHBoYSk7Ci0gICAgICAgICAgICAgICAgKmRzdCsrID0g
c3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oZ3JlZW4gKiAyNTUgLyBhbHBoYSk7Ci0gICAgICAg
ICAgICAgICAgKmRzdCsrID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4ocmVkICogMjU1IC8g
YWxwaGEpOwotICAgICAgICAgICAgICAgICpkc3QrKyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNo
YXI+KGFscGhhKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKmRzdCsr
ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYmx1ZSk7Ci0gICAgICAgICAgICAgICAgKmRz
dCsrID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oZ3JlZW4pOwotICAgICAgICAgICAgICAg
ICpkc3QrKyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KHJlZCk7Ci0gICAgICAgICAgICAg
ICAgKmRzdCsrID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYWxwaGEpOwotICAgICAgICAg
ICAgfQotICAgICAgICB9Ci0gICAgICAgIHNyYyArPSBzcmNTa2lwOwotICAgICAgICBkc3QgKz0g
ZHN0U2tpcDsKLSAgICB9Ci19Ci0KLXZvaWQgSW1hZ2VCdWZmZXI6OnB1dFVubXVsdGlwbGllZElt
YWdlRGF0YShJbWFnZURhdGEqIHNvdXJjZSwgY29uc3QgSW50UmVjdCYgc291cmNlUmVjdCwgY29u
c3QgSW50UG9pbnQmIGRlc3RQb2ludCkKLXsKLSAgICBwdXRJbWFnZURhdGE8ZmFsc2U+KHNvdXJj
ZSwgc291cmNlUmVjdCwgZGVzdFBvaW50LCBtX2RhdGEubV9iaXRtYXAuZ2V0KCkpOwotfQotCi12
b2lkIEltYWdlQnVmZmVyOjpwdXRQcmVtdWx0aXBsaWVkSW1hZ2VEYXRhKEltYWdlRGF0YSogc291
cmNlLCBjb25zdCBJbnRSZWN0JiBzb3VyY2VSZWN0LCBjb25zdCBJbnRQb2ludCYgZGVzdFBvaW50
KQotewotICAgIHB1dEltYWdlRGF0YTx0cnVlPihzb3VyY2UsIHNvdXJjZVJlY3QsIGRlc3RQb2lu
dCwgbV9kYXRhLm1fYml0bWFwLmdldCgpKTsKLX0KLQotU3RyaW5nIEltYWdlQnVmZmVyOjp0b0Rh
dGFVUkwoY29uc3QgU3RyaW5nJiBtaW1lVHlwZSkgY29uc3QKLXsKLSAgICBpZiAoIW1fZGF0YS5t
X2JpdG1hcC0+Ynl0ZXMoKSkKLSAgICAgICAgcmV0dXJuICJkYXRhOiwiOwotCi0gICAgVmVjdG9y
PGNoYXI+IG91dHB1dDsKLSAgICBjb25zdCBjaGFyKiBoZWFkZXI7Ci0gICAgaWYgKG1pbWVUeXBl
Lmxvd2VyKCkgPT0gImltYWdlL3BuZyIpIHsKLSAgICAgICAgaWYgKCFjb21wcmVzc0JpdG1hcFRv
UG5nKG1fZGF0YS5tX2JpdG1hcC5nZXQoKSwgb3V0cHV0KSkKLSAgICAgICAgICAgIHJldHVybiAi
ZGF0YTosIjsKLSAgICAgICAgaGVhZGVyID0gImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwiOwotICAg
IH0gZWxzZSB7Ci0gICAgICAgIGlmICghY29tcHJlc3NCaXRtYXBUb0pwZWcobV9kYXRhLm1fYml0
bWFwLmdldCgpLCBvdXRwdXQpKQotICAgICAgICAgICAgcmV0dXJuICJkYXRhOiwiOwotICAgICAg
ICBoZWFkZXIgPSAiZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwiOwotICAgIH0KLQotICAgIFZlY3Rv
cjxjaGFyPiBiYXNlNjQ7Ci0gICAgYmFzZTY0RW5jb2RlKG91dHB1dCwgYmFzZTY0KTsKLQotICAg
IG91dHB1dC5jbGVhcigpOwotCi0gICAgVmVjdG9yPGNoYXI+IHVybDsKLSAgICB1cmwuYXBwZW5k
KGhlYWRlciwgc3RybGVuKGhlYWRlcikpOwotICAgIHVybC5hcHBlbmQoYmFzZTY0KTsKLQotICAg
IHJldHVybiBTdHJpbmcodXJsLmRhdGEoKSwgdXJsLnNpemUoKSk7Ci19Ci0KLX0KSW5kZXg6IFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVkaWFQbGF5ZXJQcml2YXRlV2luQ0UuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01lZGlhUGxheWVy
UHJpdmF0ZVdpbkNFLmgJKHJldmlzaW9uIDU3Mjg5KQkoZnJvbSBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbmNlL01lZGlhUGxheWVyUHJpdmF0ZVdpbmNlLmg6NTcyODkpCisrKyBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01lZGlhUGxheWVyUHJpdmF0ZVdpbkNFLmgJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIw
MDgsIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChD
KSAyMDA5IFRvcmNoIE1vYmlsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
Zm5kZWYgTWVkaWFQbGF5ZXJQcml2YXRlV2luY2VfaAorI2RlZmluZSBNZWRpYVBsYXllclByaXZh
dGVXaW5jZV9oCisKKyNpZiBFTkFCTEUoVklERU8pCisKKyNpbmNsdWRlICJNZWRpYVBsYXllclBy
aXZhdGUuaCIKKyNpbmNsdWRlICJUaW1lci5oIgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAgY2xhc3MgR3JhcGhpY3NDb250ZXh0OworICAgIGNs
YXNzIEludFNpemU7CisgICAgY2xhc3MgSW50UmVjdDsKKyAgICBjbGFzcyBTdHJpbmc7CisKKyAg
ICBjbGFzcyBNZWRpYVBsYXllclByaXZhdGUgOiBwdWJsaWMgTWVkaWFQbGF5ZXJQcml2YXRlSW50
ZXJmYWNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHN0YXRpYyB2b2lkIHJlZ2lzdGVyTWVkaWFF
bmdpbmUoTWVkaWFFbmdpbmVSZWdpc3RyYXIpOworCisgICAgICAgIH5NZWRpYVBsYXllclByaXZh
dGUoKTsKKworICAgICAgICBJbnRTaXplIG5hdHVyYWxTaXplKCkgY29uc3Q7CisgICAgICAgIGJv
b2wgaGFzVmlkZW8oKSBjb25zdDsKKworICAgICAgICB2b2lkIGxvYWQoY29uc3QgU3RyaW5nJiB1
cmwpOworICAgICAgICB2b2lkIGNhbmNlbExvYWQoKTsKKworICAgICAgICB2b2lkIHBsYXkoKTsK
KyAgICAgICAgdm9pZCBwYXVzZSgpOworCisgICAgICAgIGJvb2wgcGF1c2VkKCkgY29uc3Q7Cisg
ICAgICAgIGJvb2wgc2Vla2luZygpIGNvbnN0OworCisgICAgICAgIGZsb2F0IGR1cmF0aW9uKCkg
Y29uc3Q7CisgICAgICAgIGZsb2F0IGN1cnJlbnRUaW1lKCkgY29uc3Q7CisgICAgICAgIHZvaWQg
c2VlayhmbG9hdCB0aW1lKTsKKworICAgICAgICB2b2lkIHNldFJhdGUoZmxvYXQpOworICAgICAg
ICB2b2lkIHNldFZvbHVtZShmbG9hdCk7CisKKyAgICAgICAgTWVkaWFQbGF5ZXI6Ok5ldHdvcmtT
dGF0ZSBuZXR3b3JrU3RhdGUoKSBjb25zdCB7IHJldHVybiBtX25ldHdvcmtTdGF0ZTsgfQorICAg
ICAgICBNZWRpYVBsYXllcjo6UmVhZHlTdGF0ZSByZWFkeVN0YXRlKCkgY29uc3QgeyByZXR1cm4g
bV9yZWFkeVN0YXRlOyB9CisKKyAgICAgICAgUGFzc1JlZlB0cjxUaW1lUmFuZ2VzPiBidWZmZXJl
ZCgpIGNvbnN0OworICAgICAgICBmbG9hdCBtYXhUaW1lU2Vla2FibGUoKSBjb25zdDsKKyAgICAg
ICAgdW5zaWduZWQgYnl0ZXNMb2FkZWQoKSBjb25zdDsKKyAgICAgICAgdW5zaWduZWQgdG90YWxC
eXRlcygpIGNvbnN0OworCisgICAgICAgIHZvaWQgc2V0VmlzaWJsZShib29sKTsKKyAgICAgICAg
dm9pZCBzZXRTaXplKGNvbnN0IEludFNpemUmKTsKKworICAgICAgICB2b2lkIGxvYWRTdGF0ZUNo
YW5nZWQoKTsKKyAgICAgICAgdm9pZCBkaWRFbmQoKTsKKworICAgICAgICB2b2lkIHBhaW50KEdy
YXBoaWNzQ29udGV4dCosIGNvbnN0IEludFJlY3QmKTsKKworICAgIHByaXZhdGU6CisgICAgICAg
IE1lZGlhUGxheWVyUHJpdmF0ZShNZWRpYVBsYXllciopOworCisgICAgICAgIHZvaWQgdXBkYXRl
U3RhdGVzKCk7CisgICAgICAgIHZvaWQgZG9TZWVrKCk7CisgICAgICAgIHZvaWQgY2FuY2VsU2Vl
aygpOworICAgICAgICB2b2lkIHNlZWtUaW1lckZpcmVkKFRpbWVyPE1lZGlhUGxheWVyUHJpdmF0
ZT4qKTsKKyAgICAgICAgZmxvYXQgbWF4VGltZUxvYWRlZCgpIGNvbnN0OworICAgICAgICB2b2lk
IHNhd1Vuc3VwcG9ydGVkVHJhY2tzKCk7CisjaWYgRU5BQkxFKFBMVUdJTl9QUk9YWV9GT1JfVklE
RU8pCisgICAgICAgIHZvaWQgc2V0TWVkaWFQbGF5ZXJQcm94eShXZWJNZWRpYVBsYXllclByb3h5
Kik7CisgICAgICAgIHZvaWQgc2V0UG9zdGVyKGNvbnN0IFN0cmluZyYgdXJsKTsKKyAgICAgICAg
dm9pZCBkZWxpdmVyTm90aWZpY2F0aW9uKE1lZGlhUGxheWVyUHJveHlOb3RpZmljYXRpb25UeXBl
KTsKKyNlbmRpZgorCisgICAgICAgIC8vIGVuZ2luZSBzdXBwb3J0CisgICAgICAgIHN0YXRpYyBN
ZWRpYVBsYXllclByaXZhdGVJbnRlcmZhY2UqIGNyZWF0ZShNZWRpYVBsYXllciopOworICAgICAg
ICBzdGF0aWMgdm9pZCBnZXRTdXBwb3J0ZWRUeXBlcyhIYXNoU2V0PFN0cmluZz4mIHR5cGVzKTsK
KyAgICAgICAgc3RhdGljIE1lZGlhUGxheWVyOjpTdXBwb3J0c1R5cGUgc3VwcG9ydHNUeXBlKGNv
bnN0IFN0cmluZyYgdHlwZSwgY29uc3QgU3RyaW5nJiBjb2RlY3MpOworICAgICAgICBzdGF0aWMg
Ym9vbCBpc0F2YWlsYWJsZSgpOworCisgICAgICAgIE1lZGlhUGxheWVyKiBtX3BsYXllcjsKKyAg
ICAgICAgZmxvYXQgbV9zZWVrVG87CisgICAgICAgIGZsb2F0IG1fZW5kVGltZTsKKyAgICAgICAg
VGltZXI8TWVkaWFQbGF5ZXJQcml2YXRlPiBtX3NlZWtUaW1lcjsKKyAgICAgICAgTWVkaWFQbGF5
ZXI6Ok5ldHdvcmtTdGF0ZSBtX25ldHdvcmtTdGF0ZTsKKyAgICAgICAgTWVkaWFQbGF5ZXI6OlJl
YWR5U3RhdGUgbV9yZWFkeVN0YXRlOworICAgICAgICB1bnNpZ25lZCBtX2VuYWJsZWRUcmFja0Nv
dW50OworICAgICAgICB1bnNpZ25lZCBtX3RvdGFsVHJhY2tDb3VudDsKKyAgICAgICAgYm9vbCBt
X2hhc1Vuc3VwcG9ydGVkVHJhY2tzOworICAgICAgICBib29sIG1fc3RhcnRlZFBsYXlpbmc7Cisg
ICAgICAgIGJvb2wgbV9pc1N0cmVhbWluZzsKKyNpZiBFTkFCTEUoUExVR0lOX1BST1hZX0ZPUl9W
SURFTykKKyAgICAgICAgV2ViTWVkaWFQbGF5ZXJQcm94eSogbV9wcm94eTsKKyNlbmRpZgorICAg
IH07CisKK30KKworI2VuZGlmCisKKyNlbmRpZgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW5jZS9NZWRpYVBsYXllclByaXZhdGVXaW5DRS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVkaWFQbGF5ZXJQcml2YXRlV2luQ0UuaAkocmV2
aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01lZGlhUGxh
eWVyUHJpdmF0ZVdpbkNFLmgJKHdvcmtpbmcgY29weSkKQEAgLTI0LDggKzI0LDggQEAKICAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAogICovCiAKLSNpZm5kZWYgTWVkaWFQbGF5ZXJQcml2YXRlV2luY2VfaAotI2Rl
ZmluZSBNZWRpYVBsYXllclByaXZhdGVXaW5jZV9oCisjaWZuZGVmIE1lZGlhUGxheWVyUHJpdmF0
ZVdpbkNFX2gKKyNkZWZpbmUgTWVkaWFQbGF5ZXJQcml2YXRlV2luQ0VfaAogCiAjaWYgRU5BQkxF
KFZJREVPKQogCkBAIC0xMjAsNiArMTIwLDYgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiB9CiAK
LSNlbmRpZgorI2VuZGlmIC8vIEVOQUJMRShWSURFTykKIAotI2VuZGlmCisjZW5kaWYgLy8gTWVk
aWFQbGF5ZXJQcml2YXRlV2luQ0VfaApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW5jZS9NZWRpYVBsYXllclByaXZhdGVXaW5jZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVkaWFQbGF5ZXJQcml2YXRlV2luY2UuaAkocmV2aXNpb24g
NTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01lZGlhUGxheWVyUHJp
dmF0ZVdpbmNlLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBDb3B5
cmlnaHQgKEMpIDIwMDcsIDIwMDgsIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IENPTVBVVEVSLCBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAotICovCi0KLSNpZm5kZWYgTWVkaWFQbGF5ZXJQcml2YXRlV2luY2VfaAotI2RlZmlu
ZSBNZWRpYVBsYXllclByaXZhdGVXaW5jZV9oCi0KLSNpZiBFTkFCTEUoVklERU8pCi0KLSNpbmNs
dWRlICJNZWRpYVBsYXllclByaXZhdGUuaCIKLSNpbmNsdWRlICJUaW1lci5oIgotI2luY2x1ZGUg
PHd0Zi9Pd25QdHIuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi0gICAgY2xhc3MgR3JhcGhp
Y3NDb250ZXh0OwotICAgIGNsYXNzIEludFNpemU7Ci0gICAgY2xhc3MgSW50UmVjdDsKLSAgICBj
bGFzcyBTdHJpbmc7Ci0KLSAgICBjbGFzcyBNZWRpYVBsYXllclByaXZhdGUgOiBwdWJsaWMgTWVk
aWFQbGF5ZXJQcml2YXRlSW50ZXJmYWNlIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIHN0YXRpYyB2
b2lkIHJlZ2lzdGVyTWVkaWFFbmdpbmUoTWVkaWFFbmdpbmVSZWdpc3RyYXIpOwotCi0gICAgICAg
IH5NZWRpYVBsYXllclByaXZhdGUoKTsKLQotICAgICAgICBJbnRTaXplIG5hdHVyYWxTaXplKCkg
Y29uc3Q7Ci0gICAgICAgIGJvb2wgaGFzVmlkZW8oKSBjb25zdDsKLQotICAgICAgICB2b2lkIGxv
YWQoY29uc3QgU3RyaW5nJiB1cmwpOwotICAgICAgICB2b2lkIGNhbmNlbExvYWQoKTsKLQotICAg
ICAgICB2b2lkIHBsYXkoKTsKLSAgICAgICAgdm9pZCBwYXVzZSgpOwotCi0gICAgICAgIGJvb2wg
cGF1c2VkKCkgY29uc3Q7Ci0gICAgICAgIGJvb2wgc2Vla2luZygpIGNvbnN0OwotCi0gICAgICAg
IGZsb2F0IGR1cmF0aW9uKCkgY29uc3Q7Ci0gICAgICAgIGZsb2F0IGN1cnJlbnRUaW1lKCkgY29u
c3Q7Ci0gICAgICAgIHZvaWQgc2VlayhmbG9hdCB0aW1lKTsKLQotICAgICAgICB2b2lkIHNldFJh
dGUoZmxvYXQpOwotICAgICAgICB2b2lkIHNldFZvbHVtZShmbG9hdCk7Ci0KLSAgICAgICAgTWVk
aWFQbGF5ZXI6Ok5ldHdvcmtTdGF0ZSBuZXR3b3JrU3RhdGUoKSBjb25zdCB7IHJldHVybiBtX25l
dHdvcmtTdGF0ZTsgfQotICAgICAgICBNZWRpYVBsYXllcjo6UmVhZHlTdGF0ZSByZWFkeVN0YXRl
KCkgY29uc3QgeyByZXR1cm4gbV9yZWFkeVN0YXRlOyB9Ci0KLSAgICAgICAgUGFzc1JlZlB0cjxU
aW1lUmFuZ2VzPiBidWZmZXJlZCgpIGNvbnN0OwotICAgICAgICBmbG9hdCBtYXhUaW1lU2Vla2Fi
bGUoKSBjb25zdDsKLSAgICAgICAgdW5zaWduZWQgYnl0ZXNMb2FkZWQoKSBjb25zdDsKLSAgICAg
ICAgdW5zaWduZWQgdG90YWxCeXRlcygpIGNvbnN0OwotCi0gICAgICAgIHZvaWQgc2V0VmlzaWJs
ZShib29sKTsKLSAgICAgICAgdm9pZCBzZXRTaXplKGNvbnN0IEludFNpemUmKTsKLQotICAgICAg
ICB2b2lkIGxvYWRTdGF0ZUNoYW5nZWQoKTsKLSAgICAgICAgdm9pZCBkaWRFbmQoKTsKLQotICAg
ICAgICB2b2lkIHBhaW50KEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IEludFJlY3QmKTsKLQotICAg
IHByaXZhdGU6Ci0gICAgICAgIE1lZGlhUGxheWVyUHJpdmF0ZShNZWRpYVBsYXllciopOwotCi0g
ICAgICAgIHZvaWQgdXBkYXRlU3RhdGVzKCk7Ci0gICAgICAgIHZvaWQgZG9TZWVrKCk7Ci0gICAg
ICAgIHZvaWQgY2FuY2VsU2VlaygpOwotICAgICAgICB2b2lkIHNlZWtUaW1lckZpcmVkKFRpbWVy
PE1lZGlhUGxheWVyUHJpdmF0ZT4qKTsKLSAgICAgICAgZmxvYXQgbWF4VGltZUxvYWRlZCgpIGNv
bnN0OwotICAgICAgICB2b2lkIHNhd1Vuc3VwcG9ydGVkVHJhY2tzKCk7Ci0jaWYgRU5BQkxFKFBM
VUdJTl9QUk9YWV9GT1JfVklERU8pCi0gICAgICAgIHZvaWQgc2V0TWVkaWFQbGF5ZXJQcm94eShX
ZWJNZWRpYVBsYXllclByb3h5Kik7Ci0gICAgICAgIHZvaWQgc2V0UG9zdGVyKGNvbnN0IFN0cmlu
ZyYgdXJsKTsKLSAgICAgICAgdm9pZCBkZWxpdmVyTm90aWZpY2F0aW9uKE1lZGlhUGxheWVyUHJv
eHlOb3RpZmljYXRpb25UeXBlKTsKLSNlbmRpZgotCi0gICAgICAgIC8vIGVuZ2luZSBzdXBwb3J0
Ci0gICAgICAgIHN0YXRpYyBNZWRpYVBsYXllclByaXZhdGVJbnRlcmZhY2UqIGNyZWF0ZShNZWRp
YVBsYXllciopOwotICAgICAgICBzdGF0aWMgdm9pZCBnZXRTdXBwb3J0ZWRUeXBlcyhIYXNoU2V0
PFN0cmluZz4mIHR5cGVzKTsKLSAgICAgICAgc3RhdGljIE1lZGlhUGxheWVyOjpTdXBwb3J0c1R5
cGUgc3VwcG9ydHNUeXBlKGNvbnN0IFN0cmluZyYgdHlwZSwgY29uc3QgU3RyaW5nJiBjb2RlY3Mp
OwotICAgICAgICBzdGF0aWMgYm9vbCBpc0F2YWlsYWJsZSgpOwotCi0gICAgICAgIE1lZGlhUGxh
eWVyKiBtX3BsYXllcjsKLSAgICAgICAgZmxvYXQgbV9zZWVrVG87Ci0gICAgICAgIGZsb2F0IG1f
ZW5kVGltZTsKLSAgICAgICAgVGltZXI8TWVkaWFQbGF5ZXJQcml2YXRlPiBtX3NlZWtUaW1lcjsK
LSAgICAgICAgTWVkaWFQbGF5ZXI6Ok5ldHdvcmtTdGF0ZSBtX25ldHdvcmtTdGF0ZTsKLSAgICAg
ICAgTWVkaWFQbGF5ZXI6OlJlYWR5U3RhdGUgbV9yZWFkeVN0YXRlOwotICAgICAgICB1bnNpZ25l
ZCBtX2VuYWJsZWRUcmFja0NvdW50OwotICAgICAgICB1bnNpZ25lZCBtX3RvdGFsVHJhY2tDb3Vu
dDsKLSAgICAgICAgYm9vbCBtX2hhc1Vuc3VwcG9ydGVkVHJhY2tzOwotICAgICAgICBib29sIG1f
c3RhcnRlZFBsYXlpbmc7Ci0gICAgICAgIGJvb2wgbV9pc1N0cmVhbWluZzsKLSNpZiBFTkFCTEUo
UExVR0lOX1BST1hZX0ZPUl9WSURFTykKLSAgICAgICAgV2ViTWVkaWFQbGF5ZXJQcm94eSogbV9w
cm94eTsKLSNlbmRpZgotICAgIH07Ci0KLX0KLQotI2VuZGlmCi0KLSNlbmRpZgpJbmRleDogV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QYXRoV2luQ0UuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGF0aFdpbkNFLmNwcAkocmV2aXNpb24g
NTcyODkpCShmcm9tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGF0aFdpbmNlLmNw
cDo1NzI4OSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGF0aFdpbkNFLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMp
IDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZy
ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBp
dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAg
TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0
aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4g
dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FS
UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
CisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2Vl
IHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3Is
CisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIlBhdGguaCIKKworI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgor
I2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5j
bHVkZSAiUGxhdGZvcm1QYXRoV2luY2UuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgor
I2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitQYXRoOjpQ
YXRoKCkKKyAgICA6IG1fcGF0aChuZXcgUGxhdGZvcm1QYXRoKCkpCit7Cit9CisKK1BhdGg6OlBh
dGgoY29uc3QgUGF0aCYgb3RoZXIpCisgICAgOiBtX3BhdGgobmV3IFBsYXRmb3JtUGF0aCgqb3Ro
ZXIubV9wYXRoKSkKK3sKK30KKworUGF0aDo6flBhdGgoKQoreworICAgIGRlbGV0ZSBtX3BhdGg7
Cit9CisKK1BhdGgmIFBhdGg6Om9wZXJhdG9yPShjb25zdCBQYXRoJiBvdGhlcikKK3sKKyAgICBp
ZiAoJm90aGVyICE9IHRoaXMpIHsKKyAgICAgICAgZGVsZXRlIG1fcGF0aDsKKyAgICAgICAgbV9w
YXRoID0gbmV3IFBsYXRmb3JtUGF0aCgqb3RoZXIubV9wYXRoKTsKKyAgICB9CisgICAgcmV0dXJu
ICp0aGlzOworfQorCitib29sIFBhdGg6OmNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50
LCBXaW5kUnVsZSBydWxlKSBjb25zdAoreworICAgIHJldHVybiBtX3BhdGgtPmNvbnRhaW5zKHBv
aW50LCBydWxlKTsKK30KKwordm9pZCBQYXRoOjp0cmFuc2xhdGUoY29uc3QgRmxvYXRTaXplJiBz
aXplKQoreworICAgIG1fcGF0aC0+dHJhbnNsYXRlKHNpemUpOworfQorCitGbG9hdFJlY3QgUGF0
aDo6Ym91bmRpbmdSZWN0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wYXRoLT5ib3VuZGluZ1Jl
Y3QoKTsKK30KKwordm9pZCBQYXRoOjptb3ZlVG8oY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpCit7
CisgICAgbV9wYXRoLT5tb3ZlVG8ocG9pbnQpOworfQorCit2b2lkIFBhdGg6OmFkZExpbmVUbyhj
b25zdCBGbG9hdFBvaW50JiBwb2ludCkKK3sKKyAgICBtX3BhdGgtPmFkZExpbmVUbyhwb2ludCk7
Cit9CisKK3ZvaWQgUGF0aDo6YWRkUXVhZEN1cnZlVG8oY29uc3QgRmxvYXRQb2ludCYgY3AsIGNv
bnN0IEZsb2F0UG9pbnQmIHApCit7CisgICAgbV9wYXRoLT5hZGRRdWFkQ3VydmVUbyhjcCwgcCk7
Cit9CisKK3ZvaWQgUGF0aDo6YWRkQmV6aWVyQ3VydmVUbyhjb25zdCBGbG9hdFBvaW50JiBjcDEs
IGNvbnN0IEZsb2F0UG9pbnQmIGNwMiwgY29uc3QgRmxvYXRQb2ludCYgcCkKK3sKKyAgICBtX3Bh
dGgtPmFkZEJlemllckN1cnZlVG8oY3AxLCBjcDIsIHApOworfQorCit2b2lkIFBhdGg6OmFkZEFy
Y1RvKGNvbnN0IEZsb2F0UG9pbnQmIHAxLCBjb25zdCBGbG9hdFBvaW50JiBwMiwgZmxvYXQgcmFk
aXVzKQoreworICAgIG1fcGF0aC0+YWRkQXJjVG8ocDEsIHAyLCByYWRpdXMpOworfQorCit2b2lk
IFBhdGg6OmNsb3NlU3VicGF0aCgpCit7CisgICAgbV9wYXRoLT5jbG9zZVN1YnBhdGgoKTsKK30K
Kwordm9pZCBQYXRoOjphZGRBcmMoY29uc3QgRmxvYXRQb2ludCYgcCwgZmxvYXQgciwgZmxvYXQg
c2FyLCBmbG9hdCBlYXIsIGJvb2wgYW50aWNsb2Nrd2lzZSkKK3sKKyAgICBtX3BhdGgtPmFkZEVs
bGlwc2UocCwgciwgciwgc2FyLCBlYXIsIGFudGljbG9ja3dpc2UpOworfQorCit2b2lkIFBhdGg6
OmFkZFJlY3QoY29uc3QgRmxvYXRSZWN0JiByKQoreworICAgIG1fcGF0aC0+YWRkUmVjdChyKTsK
K30KKwordm9pZCBQYXRoOjphZGRFbGxpcHNlKGNvbnN0IEZsb2F0UmVjdCYgcikKK3sKKyAgICBt
X3BhdGgtPmFkZEVsbGlwc2Uocik7Cit9CisKK3ZvaWQgUGF0aDo6Y2xlYXIoKQoreworICAgIG1f
cGF0aC0+Y2xlYXIoKTsKK30KKworYm9vbCBQYXRoOjppc0VtcHR5KCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gbV9wYXRoLT5pc0VtcHR5KCk7Cit9CisKK1N0cmluZyBQYXRoOjpkZWJ1Z1N0cmluZygp
IGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcGF0aC0+ZGVidWdTdHJpbmcoKTsKK30KKwordm9pZCBQ
YXRoOjphcHBseSh2b2lkKiBpbmZvLCBQYXRoQXBwbGllckZ1bmN0aW9uIGZ1bmN0aW9uKSBjb25z
dAoreworICAgIG1fcGF0aC0+YXBwbHkoaW5mbywgZnVuY3Rpb24pOworfQorCit2b2lkIFBhdGg6
OnRyYW5zZm9ybShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHQpCit7CisgICAgbV9wYXRoLT50cmFu
c2Zvcm0odCk7Cit9CisKK0Zsb2F0UmVjdCBQYXRoOjpzdHJva2VCb3VuZGluZ1JlY3QoU3Ryb2tl
U3R5bGVBcHBsaWVyICopCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gRmxv
YXRSZWN0KCk7Cit9CisKK2Jvb2wgUGF0aDo6c3Ryb2tlQ29udGFpbnMoU3Ryb2tlU3R5bGVBcHBs
aWVyKiwgY29uc3QgRmxvYXRQb2ludCYpIGNvbnN0Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsK
KyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUGF0aDo6aGFzQ3VycmVudFBvaW50KCkgY29u
c3QKK3sKKyAgICAvLyBOb3Qgc3VyZSBpZiB0aGlzIGlzIGNvcnJlY3QuIEF0IHRoZSBtZWFudGlt
ZSwgd2UgZG8gd2hhdCBvdGhlciBwb3J0cworICAgIC8vIGRvLgorICAgIC8vIFNlZSBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjcyNjYsCisgICAgLy8gaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI3MTg3LCBhbmQgCisgICAgLy8gaHR0cDov
L3RyYWMud2Via2l0Lm9yZy9jaGFuZ2VzZXQvNDU4NzMKKyAgICByZXR1cm4gIWlzRW1wdHkoKTsK
K30KKworfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QYXRoV2luQ0Uu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGF0aFdp
bkNFLmNwcAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL1BhdGhXaW5DRS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNs
dWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKICNpbmNsdWRlICJGbG9hdFJlY3QuaCIKICNpbmNsdWRl
ICJOb3RJbXBsZW1lbnRlZC5oIgotI2luY2x1ZGUgIlBsYXRmb3JtUGF0aFdpbmNlLmgiCisjaW5j
bHVkZSAiUGxhdGZvcm1QYXRoV2luQ0UuaCIKICNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgog
I2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KIApAQCAtMTYwLDQgKzE2MCw0IEBAIGJvb2wgUGF0aDo6
aGFzQ3VycmVudFBvaW50KCkgY29uc3QKICAgICByZXR1cm4gIWlzRW1wdHkoKTsKIH0KIAotfQor
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW5jZS9QYXRoV2luY2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luY2UvUGF0aFdpbmNlLmNwcAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbmNlL1BhdGhXaW5jZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsMTYz
ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJ
bmMuCi0gKgotICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IKLSAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogIHZlcnNpb24gMiBvZiB0aGUg
TGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAg
VGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt
cGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0g
KiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElm
IG5vdCwgd3JpdGUgdG8KLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1
MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICogIEJvc3RvbiwgTUEgMDIxMTAtMTMw
MSwgVVNBLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJQYXRoLmgiCi0K
LSNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKLSNpbmNsdWRlICJGbG9hdFJlY3QuaCIKLSNp
bmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgotI2luY2x1ZGUgIlBsYXRmb3JtUGF0aFdpbmNlLmgi
Ci0jaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKLSNpbmNsdWRlIDx3dGYvT3duUHRyLmg+Ci0K
LW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotUGF0aDo6UGF0aCgpCi0gICAgOiBtX3BhdGgobmV3IFBs
YXRmb3JtUGF0aCgpKQotewotfQotCi1QYXRoOjpQYXRoKGNvbnN0IFBhdGgmIG90aGVyKQotICAg
IDogbV9wYXRoKG5ldyBQbGF0Zm9ybVBhdGgoKm90aGVyLm1fcGF0aCkpCi17Ci19Ci0KLVBhdGg6
On5QYXRoKCkKLXsKLSAgICBkZWxldGUgbV9wYXRoOwotfQotCi1QYXRoJiBQYXRoOjpvcGVyYXRv
cj0oY29uc3QgUGF0aCYgb3RoZXIpCi17Ci0gICAgaWYgKCZvdGhlciAhPSB0aGlzKSB7Ci0gICAg
ICAgIGRlbGV0ZSBtX3BhdGg7Ci0gICAgICAgIG1fcGF0aCA9IG5ldyBQbGF0Zm9ybVBhdGgoKm90
aGVyLm1fcGF0aCk7Ci0gICAgfQotICAgIHJldHVybiAqdGhpczsKLX0KLQotYm9vbCBQYXRoOjpj
b250YWlucyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgV2luZFJ1bGUgcnVsZSkgY29uc3QKLXsK
LSAgICByZXR1cm4gbV9wYXRoLT5jb250YWlucyhwb2ludCwgcnVsZSk7Ci19Ci0KLXZvaWQgUGF0
aDo6dHJhbnNsYXRlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKLXsKLSAgICBtX3BhdGgtPnRyYW5z
bGF0ZShzaXplKTsKLX0KLQotRmxvYXRSZWN0IFBhdGg6OmJvdW5kaW5nUmVjdCgpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIG1fcGF0aC0+Ym91bmRpbmdSZWN0KCk7Ci19Ci0KLXZvaWQgUGF0aDo6bW92
ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KQotewotICAgIG1fcGF0aC0+bW92ZVRvKHBvaW50
KTsKLX0KLQotdm9pZCBQYXRoOjphZGRMaW5lVG8oY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpCi17
Ci0gICAgbV9wYXRoLT5hZGRMaW5lVG8ocG9pbnQpOwotfQotCi12b2lkIFBhdGg6OmFkZFF1YWRD
dXJ2ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIGNwLCBjb25zdCBGbG9hdFBvaW50JiBwKQotewotICAg
IG1fcGF0aC0+YWRkUXVhZEN1cnZlVG8oY3AsIHApOwotfQotCi12b2lkIFBhdGg6OmFkZEJlemll
ckN1cnZlVG8oY29uc3QgRmxvYXRQb2ludCYgY3AxLCBjb25zdCBGbG9hdFBvaW50JiBjcDIsIGNv
bnN0IEZsb2F0UG9pbnQmIHApCi17Ci0gICAgbV9wYXRoLT5hZGRCZXppZXJDdXJ2ZVRvKGNwMSwg
Y3AyLCBwKTsKLX0KLQotdm9pZCBQYXRoOjphZGRBcmNUbyhjb25zdCBGbG9hdFBvaW50JiBwMSwg
Y29uc3QgRmxvYXRQb2ludCYgcDIsIGZsb2F0IHJhZGl1cykKLXsKLSAgICBtX3BhdGgtPmFkZEFy
Y1RvKHAxLCBwMiwgcmFkaXVzKTsKLX0KLQotdm9pZCBQYXRoOjpjbG9zZVN1YnBhdGgoKQotewot
ICAgIG1fcGF0aC0+Y2xvc2VTdWJwYXRoKCk7Ci19Ci0KLXZvaWQgUGF0aDo6YWRkQXJjKGNvbnN0
IEZsb2F0UG9pbnQmIHAsIGZsb2F0IHIsIGZsb2F0IHNhciwgZmxvYXQgZWFyLCBib29sIGFudGlj
bG9ja3dpc2UpCi17Ci0gICAgbV9wYXRoLT5hZGRFbGxpcHNlKHAsIHIsIHIsIHNhciwgZWFyLCBh
bnRpY2xvY2t3aXNlKTsKLX0KLQotdm9pZCBQYXRoOjphZGRSZWN0KGNvbnN0IEZsb2F0UmVjdCYg
cikKLXsKLSAgICBtX3BhdGgtPmFkZFJlY3Qocik7Ci19Ci0KLXZvaWQgUGF0aDo6YWRkRWxsaXBz
ZShjb25zdCBGbG9hdFJlY3QmIHIpCi17Ci0gICAgbV9wYXRoLT5hZGRFbGxpcHNlKHIpOwotfQot
Ci12b2lkIFBhdGg6OmNsZWFyKCkKLXsKLSAgICBtX3BhdGgtPmNsZWFyKCk7Ci19Ci0KLWJvb2wg
UGF0aDo6aXNFbXB0eSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcGF0aC0+aXNFbXB0eSgpOwot
fQotCi1TdHJpbmcgUGF0aDo6ZGVidWdTdHJpbmcoKSBjb25zdAotewotICAgIHJldHVybiBtX3Bh
dGgtPmRlYnVnU3RyaW5nKCk7Ci19Ci0KLXZvaWQgUGF0aDo6YXBwbHkodm9pZCogaW5mbywgUGF0
aEFwcGxpZXJGdW5jdGlvbiBmdW5jdGlvbikgY29uc3QKLXsKLSAgICBtX3BhdGgtPmFwcGx5KGlu
Zm8sIGZ1bmN0aW9uKTsKLX0KLQotdm9pZCBQYXRoOjp0cmFuc2Zvcm0oY29uc3QgQWZmaW5lVHJh
bnNmb3JtJiB0KQotewotICAgIG1fcGF0aC0+dHJhbnNmb3JtKHQpOwotfQotCi1GbG9hdFJlY3Qg
UGF0aDo6c3Ryb2tlQm91bmRpbmdSZWN0KFN0cm9rZVN0eWxlQXBwbGllciAqKQotewotICAgIG5v
dEltcGxlbWVudGVkKCk7Ci0gICAgcmV0dXJuIEZsb2F0UmVjdCgpOwotfQotCi1ib29sIFBhdGg6
OnN0cm9rZUNvbnRhaW5zKFN0cm9rZVN0eWxlQXBwbGllciosIGNvbnN0IEZsb2F0UG9pbnQmKSBj
b25zdAotewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1i
b29sIFBhdGg6Omhhc0N1cnJlbnRQb2ludCgpIGNvbnN0Ci17Ci0gICAgLy8gTm90IHN1cmUgaWYg
dGhpcyBpcyBjb3JyZWN0LiBBdCB0aGUgbWVhbnRpbWUsIHdlIGRvIHdoYXQgb3RoZXIgcG9ydHMK
LSAgICAvLyBkby4KLSAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTI3MjY2LAotICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD0yNzE4NywgYW5kIAotICAgIC8vIGh0dHA6Ly90cmFjLndlYmtpdC5vcmcvY2hhbmdlc2V0
LzQ1ODczCi0gICAgcmV0dXJuICFpc0VtcHR5KCk7Ci19Ci0KLX0KSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGxhdGZvcm1QYXRoV2luQ0UuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGxhdGZvcm1QYXRoV2luQ0UuY3BwCShy
ZXZpc2lvbiA1NzI4OSkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QbGF0
Zm9ybVBhdGhXaW5jZS5jcHA6NTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL1BsYXRmb3JtUGF0aFdpbkNFLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDgxMCBA
QAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KKyAq
CisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl
IGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxp
YnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwK
KyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3
cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5r
bGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0Eu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlBsYXRmb3JtUGF0aFdpbmNl
LmgiCisKKyNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKKyNpbmNsdWRlICJGbG9hdFJlY3Qu
aCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJQYXRoLmgiCisjaW5j
bHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJXaW5jZUdyYXBoaWNzRXh0cmFzLmgi
CisjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisK
KyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gSW1wbGVt
ZW50ZWQgaW4gR3JhcGhpY3NDb250ZXh0V2luY2UuY3BwCit2b2lkIGdldEVsbGlwc2VQb2ludEJ5
QW5nbGUoZG91YmxlIGFuZ2xlLCBkb3VibGUgYSwgZG91YmxlIGIsIGZsb2F0JiB4LCBmbG9hdCYg
eSk7CisKK3N0YXRpYyB2b2lkIHF1YWRDdXJ2ZShpbnQgc2VnbWVudHMsIFZlY3RvcjxQYXRoUG9p
bnQ+JiBwdHMsIGNvbnN0IFBhdGhQb2ludCogY29udHJvbCkKK3sKKyAgICBjb25zdCBmbG9hdCBz
dGVwID0gMS4wIC8gc2VnbWVudHM7CisgICAgcmVnaXN0ZXIgZmxvYXQgdEEgPSAwLjA7CisgICAg
cmVnaXN0ZXIgZmxvYXQgdEIgPSAxLjA7CisKKyAgICBmbG9hdCBjMXggPSBjb250cm9sWzBdLngo
KTsKKyAgICBmbG9hdCBjMXkgPSBjb250cm9sWzBdLnkoKTsKKyAgICBmbG9hdCBjMnggPSBjb250
cm9sWzFdLngoKTsKKyAgICBmbG9hdCBjMnkgPSBjb250cm9sWzFdLnkoKTsKKyAgICBmbG9hdCBj
M3ggPSBjb250cm9sWzJdLngoKTsKKyAgICBmbG9hdCBjM3kgPSBjb250cm9sWzJdLnkoKTsKKwor
ICAgIGNvbnN0IGludCBvZmZzZXQgPSBwdHMuc2l6ZSgpOworICAgIHB0cy5yZXNpemUob2Zmc2V0
ICsgc2VnbWVudHMpOworICAgIFBhdGhQb2ludCBwcDsKKyAgICBwcC5tX3ggPSBjMXg7CisgICAg
cHAubV95ID0gYzF5OworCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzZWdtZW50czsgKytpKSB7
CisgICAgICAgIHRBICs9IHN0ZXA7CisgICAgICAgIHRCIC09IHN0ZXA7CisKKyAgICAgICAgY29u
c3QgZmxvYXQgYSA9IHRCICogdEI7CisgICAgICAgIGNvbnN0IGZsb2F0IGIgPSAyLjAgKiB0QSAq
IHRCOworICAgICAgICBjb25zdCBmbG9hdCBjID0gdEEgKiB0QTsKKworICAgICAgICBwcC5tX3gg
PSBjMXggKiBhICsgYzJ4ICogYiArIGMzeCAqIGM7CisgICAgICAgIHBwLm1feSA9IGMxeSAqIGEg
KyBjMnkgKiBiICsgYzN5ICogYzsKKworICAgICAgICBwdHNbb2Zmc2V0ICsgaSAtIDFdID0gcHA7
CisgICAgfQorCisgICAgcHAubV94ID0gYzN4OworICAgIHBwLm1feSA9IGMzeTsKKyAgICBwdHNb
b2Zmc2V0ICsgc2VnbWVudHMgLSAxXSA9IHBwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmV6
aWVyKGludCBzZWdtZW50cywgVmVjdG9yPFBhdGhQb2ludD4mIHB0cywgY29uc3QgUGF0aFBvaW50
KiBjb250cm9sKQoreworICAgIGNvbnN0IGZsb2F0IHN0ZXAgPSAxLjAgLyBzZWdtZW50czsKKyAg
ICByZWdpc3RlciBmbG9hdCB0QSA9IDAuMDsKKyAgICByZWdpc3RlciBmbG9hdCB0QiA9IDEuMDsK
KworICAgIGZsb2F0IGMxeCA9IGNvbnRyb2xbMF0ueCgpOworICAgIGZsb2F0IGMxeSA9IGNvbnRy
b2xbMF0ueSgpOworICAgIGZsb2F0IGMyeCA9IGNvbnRyb2xbMV0ueCgpOworICAgIGZsb2F0IGMy
eSA9IGNvbnRyb2xbMV0ueSgpOworICAgIGZsb2F0IGMzeCA9IGNvbnRyb2xbMl0ueCgpOworICAg
IGZsb2F0IGMzeSA9IGNvbnRyb2xbMl0ueSgpOworICAgIGZsb2F0IGM0eCA9IGNvbnRyb2xbM10u
eCgpOworICAgIGZsb2F0IGM0eSA9IGNvbnRyb2xbM10ueSgpOworCisgICAgY29uc3QgaW50IG9m
ZnNldCA9IHB0cy5zaXplKCk7CisgICAgcHRzLnJlc2l6ZShvZmZzZXQgKyBzZWdtZW50cyk7Cisg
ICAgUGF0aFBvaW50IHBwOworICAgIHBwLm1feCA9IGMxeDsKKyAgICBwcC5tX3kgPSBjMXk7CisK
KyAgICBmb3IgKGludCBpID0gMTsgaSA8IHNlZ21lbnRzOyArK2kpIHsKKyAgICAgICAgdEEgKz0g
c3RlcDsKKyAgICAgICAgdEIgLT0gc3RlcDsKKyAgICAgICAgY29uc3QgZmxvYXQgdEFzcSA9IHRB
ICogdEE7CisgICAgICAgIGNvbnN0IGZsb2F0IHRCc3EgPSB0QiAqIHRCOworCisgICAgICAgIGNv
bnN0IGZsb2F0IGEgPSB0QnNxICogdEI7CisgICAgICAgIGNvbnN0IGZsb2F0IGIgPSAzLjAgKiB0
QSAqIHRCc3E7CisgICAgICAgIGNvbnN0IGZsb2F0IGMgPSAzLjAgKiB0QiAqIHRBc3E7CisgICAg
ICAgIGNvbnN0IGZsb2F0IGQgPSB0QXNxICogdEE7CisKKyAgICAgICAgcHAubV94ID0gYzF4ICog
YSArIGMyeCAqIGIgKyBjM3ggKiBjICsgYzR4ICogZDsKKyAgICAgICAgcHAubV95ID0gYzF5ICog
YSArIGMyeSAqIGIgKyBjM3kgKiBjICsgYzR5ICogZDsKKworICAgICAgICBwdHNbb2Zmc2V0ICsg
aSAtIDFdID0gcHA7CisgICAgfQorCisgICAgcHAubV94ID0gYzR4OworICAgIHBwLm1feSA9IGM0
eTsKKyAgICBwdHNbb2Zmc2V0ICsgc2VnbWVudHMgLSAxXSA9IHBwOworfQorCitzdGF0aWMgYm9v
bCBjb250YWluc1BvaW50KGNvbnN0IEZsb2F0UmVjdCYgciwgY29uc3QgRmxvYXRQb2ludCYgcCkK
K3sKKyAgICByZXR1cm4gcC54KCkgPj0gci54KCkgJiYgcC55KCkgPj0gci55KCkgJiYgcC54KCkg
PCByLnJpZ2h0KCkgJiYgcC55KCkgPCByLmJvdHRvbSgpOworfQorCitzdGF0aWMgdm9pZCBub3Jt
YWxpemVBbmdsZShmbG9hdCYgYW5nbGUpCit7CisgICAgYW5nbGUgPSBmbW9kKGFuZ2xlLCAyICog
cGlGbG9hdCk7CisgICAgaWYgKGFuZ2xlIDwgMCkKKyAgICAgICAgYW5nbGUgKz0gMiAqIHBpRmxv
YXQ7CisgICAgaWYgKGFuZ2xlIDwgMC4wMDAwMWYpCisgICAgICAgIGFuZ2xlID0gMDsKK30KKwor
c3RhdGljIHZvaWQgdHJhbnNmb3JtQXJjUG9pbnQoZmxvYXQmIHgsIGZsb2F0JiB5LCBjb25zdCBG
bG9hdFBvaW50JiBjKQoreworICAgIHggKz0gYy54KCk7CisgICAgeSArPSBjLnkoKTsKK30KKwor
c3RhdGljIHZvaWQgaW5mbGF0ZVJlY3RUb0NvbnRhaW5Qb2ludChGbG9hdFJlY3QmIHIsIGZsb2F0
IHgsIGZsb2F0IHkpCit7CisgICAgaWYgKHIuaXNFbXB0eSgpKSB7CisgICAgICAgIHIuc2V0WCh4
KTsKKyAgICAgICAgci5zZXRZKHkpOworICAgICAgICByLnNldFNpemUoRmxvYXRTaXplKDEsIDEp
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoeCA8IHIueCgpKSB7CisgICAgICAg
IHIuc2V0V2lkdGgoci5yaWdodCgpIC0geCk7CisgICAgICAgIHIuc2V0WCh4KTsKKyAgICB9IGVs
c2UgeworICAgICAgICBmbG9hdCB3ID0geCAtIHIueCgpICsgMTsKKyAgICAgICAgaWYgKHcgPiBy
LndpZHRoKCkpCisgICAgICAgICAgICByLnNldFdpZHRoKHcpOworICAgIH0KKyAgICBpZiAoeSA8
IHIueSgpKSB7CisgICAgICAgIHIuc2V0SGVpZ2h0KHIuYm90dG9tKCkgLSB5KTsKKyAgICAgICAg
ci5zZXRZKHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZsb2F0IGggPSAgeSAtIHIueSgpICsg
MTsKKyAgICAgICAgaWYgKGggPiByLmhlaWdodCgpKQorICAgICAgICAgICAgci5zZXRIZWlnaHQo
aCk7CisgICAgfQorfQorCisvLyByZXR1cm4gMC1iYXNlZCB2YWx1ZTogMCAtIGZpcnN0IFF1YWRy
YW50ICggMCAtIDkwIGRlZ3JlZSkKK3N0YXRpYyBpbmxpbmUgaW50IHF1YWRyYW50KGNvbnN0IFBh
dGhQb2ludCYgcG9pbnQsIGNvbnN0IFBhdGhQb2ludCYgb3JpZ2luKQoreworICAgIHJldHVybiBw
b2ludC5tX3ggPCBvcmlnaW4ubV94ID8KKyAgICAgICAgKHBvaW50Lm1feSA8IG9yaWdpbi5tX3kg
PyAyIDogMSkKKyAgICAgICAgOiAocG9pbnQubV95IDwgb3JpZ2luLm1feSA/IDMgOiAwKTsKK30K
Kworc3RhdGljIGlubGluZSBib29sIGlzUXVhZHJhbnRPbkxlZnQoaW50IHEpIHsgcmV0dXJuIHEg
PT0gMSB8fCBxID09IDI7IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1F1YWRyYW50T25SaWdodChp
bnQgcSkgeyByZXR1cm4gcSA9PSAwIHx8IHEgPT0gMzsgfQorc3RhdGljIGlubGluZSBib29sIGlz
UXVhZHJhbnRPblRvcChpbnQgcSkgeyByZXR1cm4gcSA9PSAyIHx8IHEgPT0gMzsgfQorc3RhdGlj
IGlubGluZSBib29sIGlzUXVhZHJhbnRPbkJvdHRvbShpbnQgcSkgeyByZXR1cm4gcSA9PSAwIHx8
IHEgPT0gMTsgfQorCitzdGF0aWMgaW5saW5lIGludCBuZXh0UXVhZHJhbnQoaW50IHEpIHsgcmV0
dXJuIHEgPT0gMyA/IDAgOiBxICsgMTsgfQorc3RhdGljIGlubGluZSBpbnQgcXVhZHJhbnREaWZm
KGludCBxMSwgaW50IHEyKQoreworICAgIGludCBkID0gcTEgLSBxMjsKKyAgICB3aGlsZSAoZCA8
IDApCisgICAgICAgIGQgKz0gNDsKKyAgICByZXR1cm4gZDsKK30KKworc3RydWN0IFBhdGhWZWN0
b3IgeworICAgIGZsb2F0IG1feDsKKyAgICBmbG9hdCBtX3k7CisKKyAgICBQYXRoVmVjdG9yKCkg
OiBtX3goMCksIG1feSgwKSB7fQorICAgIFBhdGhWZWN0b3IoZmxvYXQgeCwgZmxvYXQgeSkgOiBt
X3goeCksIG1feSh5KSB7fQorICAgIGRvdWJsZSBhbmdsZSgpIGNvbnN0IHsgcmV0dXJuIGF0YW4y
KG1feSwgbV94KTsgfQorICAgIG9wZXJhdG9yIGRvdWJsZSAoKSBjb25zdCB7IHJldHVybiBhbmds
ZSgpOyB9CisgICAgZG91YmxlIGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIF9oeXBvdChtX3gsIG1f
eSk7IH0KK307CisKK1BhdGhWZWN0b3Igb3BlcmF0b3ItKGNvbnN0IFBhdGhQb2ludCYgcDEsIGNv
bnN0IFBhdGhQb2ludCYgcDIpCit7CisgICAgcmV0dXJuIFBhdGhWZWN0b3IocDEubV94IC0gcDIu
bV94LCBwMS5tX3kgLSBwMi5tX3kpOworfQorCitzdGF0aWMgdm9pZCBhZGRBcmNQb2ludChQYXRo
UG9seWdvbiYgcG9seSwgY29uc3QgUGF0aFBvaW50JiBjZW50ZXIsIGNvbnN0IFBhdGhQb2ludCYg
cmFkaXVzLCBkb3VibGUgYW5nbGUpCit7CisgICAgUGF0aFBvaW50IHA7CisgICAgZ2V0RWxsaXBz
ZVBvaW50QnlBbmdsZShhbmdsZSwgcmFkaXVzLm1feCwgcmFkaXVzLm1feSwgcC5tX3gsIHAubV95
KTsKKyAgICB0cmFuc2Zvcm1BcmNQb2ludChwLm1feCwgcC5tX3ksIGNlbnRlcik7CisgICAgaWYg
KHBvbHkuaXNFbXB0eSgpIHx8IHBvbHkubGFzdCgpICE9IHApCisgICAgICAgIHBvbHkuYXBwZW5k
KHApOworfQorCitzdGF0aWMgdm9pZCBhZGRBcmNQb2ludHMoUGF0aFBvbHlnb24mIHBvbHksIGNv
bnN0IFBsYXRmb3JtUGF0aEVsZW1lbnQ6OkFyY1RvJiBkYXRhKQoreworICAgIGNvbnN0IFBhdGhQ
b2ludCYgc3RhcnRQb2ludCA9IHBvbHkubGFzdCgpOworICAgIGRvdWJsZSBjdXJBbmdsZSA9IHN0
YXJ0UG9pbnQgLSBkYXRhLm1fY2VudGVyOworICAgIGRvdWJsZSBlbmRBbmdsZSA9IGRhdGEubV9l
bmQgLSBkYXRhLm1fY2VudGVyOworICAgIGRvdWJsZSBhbmdsZVN0ZXAgPSAyLiAvIHN0ZDo6bWF4
KGRhdGEubV9yYWRpdXMubV94LCBkYXRhLm1fcmFkaXVzLm1feSk7CisgICAgaWYgKGRhdGEubV9j
bG9ja3dpc2UpIHsKKyAgICAgICAgaWYgKGVuZEFuZ2xlIDw9IGN1ckFuZ2xlIHx8IHN0YXJ0UG9p
bnQgPT0gZGF0YS5tX2VuZCkKKyAgICAgICAgICAgIGVuZEFuZ2xlICs9IDIgKiBwaURvdWJsZTsK
KyAgICB9IGVsc2UgeworICAgICAgICBhbmdsZVN0ZXAgPSAtYW5nbGVTdGVwOworICAgICAgICBp
ZiAoZW5kQW5nbGUgPj0gY3VyQW5nbGUgfHwgc3RhcnRQb2ludCA9PSBkYXRhLm1fZW5kKQorICAg
ICAgICAgICAgZW5kQW5nbGUgLT0gMiAqIHBpRG91YmxlOworICAgIH0KKworICAgIGZvciAoY3Vy
QW5nbGUgKz0gYW5nbGVTdGVwOyBkYXRhLm1fY2xvY2t3aXNlID8gY3VyQW5nbGUgPCBlbmRBbmds
ZSA6IGN1ckFuZ2xlID4gZW5kQW5nbGU7IGN1ckFuZ2xlICs9IGFuZ2xlU3RlcCkKKyAgICAgICAg
YWRkQXJjUG9pbnQocG9seSwgZGF0YS5tX2NlbnRlciwgZGF0YS5tX3JhZGl1cywgY3VyQW5nbGUp
OworCisgICAgaWYgKHBvbHkuaXNFbXB0eSgpIHx8IHBvbHkubGFzdCgpICE9IGRhdGEubV9lbmQp
CisgICAgICAgIHBvbHkuYXBwZW5kKGRhdGEubV9lbmQpOworfQorCitzdGF0aWMgdm9pZCBkcmF3
UG9seWdvbnMoSERDIGRjLCBjb25zdCBWZWN0b3I8UGF0aFBvbHlnb24+JiBwb2x5Z29ucywgYm9v
bCBmaWxsLCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0qIHRyYW5zZm9ybWF0aW9uKQoreworICAgIE1l
bW9yeUFsbG9jYXRpb25DYW5GYWlsIGNhbkZhaWw7CisgICAgZm9yIChWZWN0b3I8UGF0aFBvbHln
b24+Ojpjb25zdF9pdGVyYXRvciBpID0gcG9seWdvbnMuYmVnaW4oKTsgaSAhPSBwb2x5Z29ucy5l
bmQoKTsgKytpKSB7CisgICAgICAgIGludCBucG9pbnRzID0gaS0+c2l6ZSgpOworICAgICAgICBp
ZiAoIW5wb2ludHMpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBQT0lOVCogd2lu
UG9pbnRzID0gMDsKKyAgICAgICAgaWYgKGZpbGwpIHsKKyAgICAgICAgICAgIGlmIChucG9pbnRz
ID4gMikKKyAgICAgICAgICAgICAgICB3aW5Qb2ludHMgPSBuZXcgUE9JTlRbbnBvaW50cyArIDFd
OworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHdpblBvaW50cyA9IG5ldyBQT0lOVFtucG9p
bnRzXTsKKworICAgICAgICBpZiAod2luUG9pbnRzKSB7CisgICAgICAgICAgICBpZiAodHJhbnNm
b3JtYXRpb24pIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpMiA9IDA7IGkyIDwgbnBvaW50
czsgKytpMikgeworICAgICAgICAgICAgICAgICAgICBGbG9hdFBvaW50IHRyUG9pbnQgPSB0cmFu
c2Zvcm1hdGlvbi0+bWFwUG9pbnQoaS0+YXQoaTIpKTsKKyAgICAgICAgICAgICAgICAgICAgd2lu
UG9pbnRzW2kyXS54ID0gc3RhYmxlUm91bmQodHJQb2ludC54KCkpOworICAgICAgICAgICAgICAg
ICAgICB3aW5Qb2ludHNbaTJdLnkgPSBzdGFibGVSb3VuZCh0clBvaW50LnkoKSk7CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGlu
dCBpMiA9IDA7IGkyIDwgbnBvaW50czsgKytpMikgeworICAgICAgICAgICAgICAgICAgICB3aW5Q
b2ludHNbaTJdLnggPSBzdGFibGVSb3VuZChpLT5hdChpMikueCgpKTsKKyAgICAgICAgICAgICAg
ICAgICAgd2luUG9pbnRzW2kyXS55ID0gc3RhYmxlUm91bmQoaS0+YXQoaTIpLnkoKSk7CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmlsbCAmJiB3
aW5Qb2ludHNbbnBvaW50cyAtIDFdICE9IHdpblBvaW50c1swXSkgeworICAgICAgICAgICAgICAg
IHdpblBvaW50c1tucG9pbnRzXS54ID0gd2luUG9pbnRzWzBdLng7CisgICAgICAgICAgICAgICAg
d2luUG9pbnRzW25wb2ludHNdLnkgPSB3aW5Qb2ludHNbMF0ueTsKKyAgICAgICAgICAgICAgICAr
K25wb2ludHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmaWxsKQorICAgICAg
ICAgICAgICAgIDo6UG9seWdvbihkYywgd2luUG9pbnRzLCBucG9pbnRzKTsKKyAgICAgICAgICAg
IGVsc2UKKyAgICAgICAgICAgICAgICA6OlBvbHlsaW5lKGRjLCB3aW5Qb2ludHMsIG5wb2ludHMp
OworICAgICAgICAgICAgZGVsZXRlW10gd2luUG9pbnRzOworICAgICAgICB9CisgICAgfQorfQor
CisKK2ludCBQbGF0Zm9ybVBhdGhFbGVtZW50OjpudW1Db250cm9sUG9pbnRzKCkgY29uc3QKK3sK
KyAgICBzd2l0Y2ggKG1fdHlwZSkgeworICAgIGNhc2UgUGF0aE1vdmVUbzoKKyAgICBjYXNlIFBh
dGhMaW5lVG86CisgICAgICAgIHJldHVybiAxOworICAgIGNhc2UgUGF0aFF1YWRDdXJ2ZVRvOgor
ICAgIGNhc2UgUGF0aEFyY1RvOgorICAgICAgICByZXR1cm4gMjsKKyAgICBjYXNlIFBhdGhCZXpp
ZXJDdXJ2ZVRvOgorICAgICAgICByZXR1cm4gMzsKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NF
UlQobV90eXBlID09IFBhdGhDbG9zZVN1YnBhdGgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9
Cit9CisKK2ludCBQbGF0Zm9ybVBhdGhFbGVtZW50OjpudW1Qb2ludHMoKSBjb25zdAoreworICAg
IHN3aXRjaCAobV90eXBlKSB7CisgICAgY2FzZSBQYXRoTW92ZVRvOgorICAgIGNhc2UgUGF0aExp
bmVUbzoKKyAgICBjYXNlIFBhdGhBcmNUbzoKKyAgICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBQ
YXRoUXVhZEN1cnZlVG86CisgICAgICAgIHJldHVybiAyOworICAgIGNhc2UgUGF0aEJlemllckN1
cnZlVG86CisgICAgICAgIHJldHVybiAzOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVCht
X3R5cGUgPT0gUGF0aENsb3NlU3VicGF0aCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30K
Kwordm9pZCBQYXRoUG9seWdvbjo6bW92ZShjb25zdCBGbG9hdFNpemUmIG9mZnNldCkKK3sKKyAg
ICBmb3IgKFZlY3RvcjxQYXRoUG9pbnQ+OjppdGVyYXRvciBpID0gYmVnaW4oKTsgaSA8IGVuZCgp
OyArK2kpCisgICAgICAgIGktPm1vdmUob2Zmc2V0KTsKK30KKwordm9pZCBQYXRoUG9seWdvbjo6
dHJhbnNmb3JtKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdCkKK3sKKyAgICBmb3IgKFZlY3RvcjxQ
YXRoUG9pbnQ+OjppdGVyYXRvciBpID0gYmVnaW4oKTsgaSA8IGVuZCgpOyArK2kpCisgICAgICAg
ICppID0gdC5tYXBQb2ludCgqaSk7Cit9CisKK2Jvb2wgUGF0aFBvbHlnb246OmNvbnRhaW5zKGNv
bnN0IEZsb2F0UG9pbnQmIHBvaW50KSBjb25zdAoreworICAgIGlmIChzaXplKCkgPCAzKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBUZXN0IGludGVyc2VjdGlvbnMgYmV0d2VlbiB0
aGUgcG9seWdvbiBhbmQgdGhlIHZlcnRpY2FsIGxpbmU6IHggPSBwb2ludC54KCkKKworICAgIGlu
dCBpbnRlcnNlY3RlZCA9IDA7CisgICAgY29uc3QgUGF0aFBvaW50KiBwb2ludDEgPSAmbGFzdCgp
OworICAgIFZlY3RvcjxQYXRoUG9pbnQ+Ojpjb25zdF9pdGVyYXRvciBsYXN0ID0gZW5kKCk7Cisg
ICAgLy8gd2FzTmVnYXRpdmU6IC0xIG1lYW5zIHVua25vd24sIDAgbWVhbnMgZmFsc2UsIDEgbWVh
bnMgdHJ1ZS4KKyAgICBpbnQgd2FzTmVnYXRpdmUgPSAtMTsKKyAgICBmb3IgKFZlY3RvcjxQYXRo
UG9pbnQ+Ojpjb25zdF9pdGVyYXRvciBpID0gYmVnaW4oKTsgaSAhPSBsYXN0OyArK2kpIHsKKyAg
ICAgICAgY29uc3QgUGF0aFBvaW50JiBwb2ludDIgPSAqaTsKKyAgICAgICAgaWYgKHBvaW50MS0+
eCgpICE9IHBvaW50LngoKSkgeworICAgICAgICAgICAgaWYgKHBvaW50Mi54KCkgPT0gcG9pbnQu
eCgpKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGdldHRpbmcgb24gdGhlIHZlcnRpY2Fs
IGxpbmUKKyAgICAgICAgICAgICAgICB3YXNOZWdhdGl2ZSA9IHBvaW50MS0+eCgpIDwgcG9pbnQu
eCgpID8gMSA6IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBvaW50Mi54KCkgPCBwb2ludC54
KCkgIT0gcG9pbnQxLT54KCkgPCBwb2ludC54KCkpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB5
ID0gKHBvaW50Mi55KCkgLSBwb2ludDEtPnkoKSkgLyAocG9pbnQyLngoKSAtIHBvaW50MS0+eCgp
KSAqIChwb2ludC54KCkgLSBwb2ludDEtPngoKSkgKyBwb2ludDEtPnkoKTsKKyAgICAgICAgICAg
ICAgICBpZiAoeSA+PSBwb2ludC55KCkpCisgICAgICAgICAgICAgICAgICAgICsraW50ZXJzZWN0
ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBXZSB3
ZXJlIG9uIHRoZSB2ZXJ0aWNhbCBsaW5lCisKKyAgICAgICAgICAgIC8vIGhhbmRsZSBzcGVjaWFs
IGNhc2UKKyAgICAgICAgICAgIGlmIChwb2ludDEtPnkoKSA9PSBwb2ludC55KCkpCisgICAgICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgICAgIGlmIChwb2ludDEtPnkoKSA+IHBv
aW50LnkoKSkgeworICAgICAgICAgICAgICAgIGlmIChwb2ludDIueCgpID09IHBvaW50LngoKSkg
eworICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaWYgdGhlIHBvaW50IGlzIG9uIHRoaXMgc2Vn
bWVudAorICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnQyLnkoKSA8PSBwb2ludC55KCkpCisg
ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgICAgICAg
ICAvLyBXZSBhcmUgc3RpbGwgb24gdGhlIGxpbmUKKyAgICAgICAgICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgbGVhdmluZyB0aGUgbGluZSBub3cuCisgICAg
ICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gZ2V0IGJhY2sgdG8gc2VlIHdoaWNoIHNpZGUg
d2UgY29tZSBmcm9tLiBJZiB3ZSBjb21lIGZyb20KKyAgICAgICAgICAgICAgICAgICAgLy8gdGhl
IHNhbWUgc2lkZSB3ZSBhcmUgbGVhdmluZywgbm8gaW50ZXJzZWN0aW9uIHNob3VsZCBiZSBjb3Vu
dGVkCisgICAgICAgICAgICAgICAgICAgIGlmICh3YXNOZWdhdGl2ZSA8IDApIHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIFZlY3RvcjxQYXRoUG9pbnQ+Ojpjb25zdF9pdGVyYXRvciBqTGFzdCA9
IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8UGF0aFBvaW50Pjo6Y29uc3RfaXRl
cmF0b3IgaiA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKGogPT0gYmVnaW4oKSkKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaiA9IGxhc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWo7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKGotPngoKSAhPSBwb2ludC54KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKGotPngoKSA+IHBvaW50LngoKSkKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHdhc05lZ2F0aXZlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzTmVnYXRp
dmUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChq
ICE9IGpMYXN0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdhc05lZ2F0aXZlIDwg
MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHdhc05lZ2F0aXZlID8gcG9pbnQy
LngoKSA+IHBvaW50LngoKSA6IHBvaW50Mi54KCkgPCBwb2ludC54KCkpCisgICAgICAgICAgICAg
ICAgICAgICAgICArK2ludGVyc2VjdGVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IH0gZWxzZSBpZiAocG9pbnQyLngoKSA9PSBwb2ludC54KCkgJiYgcG9pbnQyLnkoKSA+PSBwb2lu
dC55KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAg
cG9pbnQxID0gJnBvaW50MjsKKyAgICB9CisKKyAgICByZXR1cm4gaW50ZXJzZWN0ZWQgJiAxOwor
fQorCit2b2lkIFBsYXRmb3JtUGF0aEVsZW1lbnQ6Om1vdmUoY29uc3QgRmxvYXRTaXplJiBvZmZz
ZXQpCit7CisgICAgaW50IG4gPSBudW1Db250cm9sUG9pbnRzKCk7CisgICAgZm9yIChpbnQgaSA9
IDA7IGkgPCBuOyArK2kpCisgICAgICAgIG1fZGF0YS5tX3BvaW50c1tpXS5tb3ZlKG9mZnNldCk7
Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoRWxlbWVudDo6dHJhbnNmb3JtKGNvbnN0IEFmZmluZVRy
YW5zZm9ybSYgdCkKK3sKKyAgICBpbnQgbiA9IG51bUNvbnRyb2xQb2ludHMoKTsKKyAgICBmb3Ig
KGludCBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBGbG9hdFBvaW50IHAgPSB0Lm1hcFBv
aW50KG1fZGF0YS5tX3BvaW50c1tpXSk7CisgICAgICAgIG1fZGF0YS5tX3BvaW50c1tpXS5zZXQo
cC54KCksIHAueSgpKTsKKyAgICB9Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoRWxlbWVudDo6aW5m
bGF0ZVJlY3RUb0NvbnRhaW5NZShGbG9hdFJlY3QmIHIsIGNvbnN0IEZsb2F0UG9pbnQmIGxhc3RQ
b2ludCkgY29uc3QKK3sKKyAgICBpZiAobV90eXBlID09IFBhdGhBcmNUbykgeworICAgICAgICBj
b25zdCBBcmNUbyYgZGF0YSA9IG1fZGF0YS5tX2FyY1RvRGF0YTsKKyAgICAgICAgUGF0aFBvaW50
IHN0YXJ0UG9pbnQ7CisgICAgICAgIHN0YXJ0UG9pbnQgPSBsYXN0UG9pbnQ7CisgICAgICAgIFBh
dGhQb2ludCBlbmRQb2ludCA9IGRhdGEubV9lbmQ7CisgICAgICAgIGlmICghZGF0YS5tX2Nsb2Nr
d2lzZSkKKyAgICAgICAgICAgIHN0ZDo6c3dhcChzdGFydFBvaW50LCBlbmRQb2ludCk7CisKKyAg
ICAgICAgaW50IHEwID0gcXVhZHJhbnQoc3RhcnRQb2ludCwgZGF0YS5tX2NlbnRlcik7CisgICAg
ICAgIGludCBxMSA9IHF1YWRyYW50KGVuZFBvaW50LCBkYXRhLm1fY2VudGVyKTsKKyAgICAgICAg
Ym9vbCBjb250YWluc0V4dHJlbWVzWzRdID0geyBmYWxzZSB9OyAvLyBib3R0b20sIGxlZnQsIHRv
cCwgcmlnaHQKKyAgICAgICAgc3RhdGljIGNvbnN0IFBhdGhQb2ludCBleHRyZW1lVmVjdG9yc1s0
XSA9IHsgeyAwLCAxIH0sIHsgLTEsIDAgfSwgeyAwLCAtMSB9LCB7IDEsIDAgfSB9OworICAgICAg
ICBpZiAocTAgPT0gcTEpIHsKKyAgICAgICAgICAgIGlmIChzdGFydFBvaW50Lm1feCA9PSBlbmRQ
b2ludC5tX3ggfHwgaXNRdWFkcmFudE9uQm90dG9tKHEwKSAhPSBzdGFydFBvaW50Lm1feCA+IGVu
ZFBvaW50Lm1feCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytp
KQorICAgICAgICAgICAgICAgICAgICBjb250YWluc0V4dHJlbWVzW2ldID0gdHJ1ZTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBleHRyZW1lID0gcTA7
CisgICAgICAgICAgICBpbnQgZGlmZiA9IHF1YWRyYW50RGlmZihxMSwgcTApOworICAgICAgICAg
ICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaWZmOyArK2kpIHsKKyAgICAgICAgICAgICAgICBjb250
YWluc0V4dHJlbWVzW2V4dHJlbWVdID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBleHRyZW1lID0g
bmV4dFF1YWRyYW50KGV4dHJlbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAg
ICAgaW5mbGF0ZVJlY3RUb0NvbnRhaW5Qb2ludChyLCBzdGFydFBvaW50Lm1feCwgc3RhcnRQb2lu
dC5tX3kpOworICAgICAgICBpbmZsYXRlUmVjdFRvQ29udGFpblBvaW50KHIsIGVuZFBvaW50Lm1f
eCwgZW5kUG9pbnQubV95KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsK
KyAgICAgICAgICAgIGlmIChjb250YWluc0V4dHJlbWVzW2ldKQorICAgICAgICAgICAgICAgIGlu
ZmxhdGVSZWN0VG9Db250YWluUG9pbnQociwgZGF0YS5tX2NlbnRlci5tX3ggKyBkYXRhLm1fcmFk
aXVzLm1feCAqIGV4dHJlbWVWZWN0b3JzW2ldLm1feCwgZGF0YS5tX2NlbnRlci5tX3kgKyBkYXRh
Lm1fcmFkaXVzLm1feSAqIGV4dHJlbWVWZWN0b3JzW2ldLm1feSk7CisgICAgICAgIH0KKyAgICB9
IGVsc2UgeworICAgICAgICBpbnQgbiA9IG51bVBvaW50cygpOworICAgICAgICBmb3IgKGludCBp
ID0gMDsgaSA8IG47ICsraSkKKyAgICAgICAgICAgIGluZmxhdGVSZWN0VG9Db250YWluUG9pbnQo
ciwgbV9kYXRhLm1fcG9pbnRzW2ldLm1feCwgbV9kYXRhLm1fcG9pbnRzW2ldLm1feSk7CisgICAg
fQorfQorCitQYXRoRWxlbWVudFR5cGUgUGxhdGZvcm1QYXRoRWxlbWVudDo6dHlwZSgpIGNvbnN0
Cit7CisgICAgc3dpdGNoIChtX3R5cGUpIHsKKyAgICBjYXNlIFBhdGhNb3ZlVG86CisgICAgICAg
IHJldHVybiBQYXRoRWxlbWVudE1vdmVUb1BvaW50OworICAgIGNhc2UgUGF0aExpbmVUbzoKKyAg
ICAgICAgcmV0dXJuIFBhdGhFbGVtZW50QWRkTGluZVRvUG9pbnQ7CisgICAgY2FzZSBQYXRoQXJj
VG86CisgICAgICAgIC8vIEZJWE1FOiB0aGVyZSdzIG5vIGFyY1RvIHR5cGUgZm9yIFBhdGhFbGVt
ZW50CisgICAgICAgIHJldHVybiBQYXRoRWxlbWVudEFkZExpbmVUb1BvaW50OworICAgICAgICAv
LyByZXR1cm4gUGF0aEVsZW1lbnRBZGRRdWFkQ3VydmVUb1BvaW50OworICAgIGNhc2UgUGF0aFF1
YWRDdXJ2ZVRvOgorICAgICAgICByZXR1cm4gUGF0aEVsZW1lbnRBZGRRdWFkQ3VydmVUb1BvaW50
OworICAgIGNhc2UgUGF0aEJlemllckN1cnZlVG86CisgICAgICAgIHJldHVybiBQYXRoRWxlbWVu
dEFkZEN1cnZlVG9Qb2ludDsKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NFUlQobV90eXBlID09
IFBhdGhDbG9zZVN1YnBhdGgpOworICAgICAgICByZXR1cm4gUGF0aEVsZW1lbnRDbG9zZVN1YnBh
dGg7CisgICAgfQorfQorCitQbGF0Zm9ybVBhdGg6OlBsYXRmb3JtUGF0aCgpCisgICAgOiBtX3Bl
bkxpZnRlZCh0cnVlKQoreworICAgIG1fY3VycmVudFBvaW50LmNsZWFyKCk7Cit9CisKK3ZvaWQg
UGxhdGZvcm1QYXRoOjplbnN1cmVTdWJwYXRoKCkKK3sKKyAgICBpZiAobV9wZW5MaWZ0ZWQpIHsK
KyAgICAgICAgbV9wZW5MaWZ0ZWQgPSBmYWxzZTsKKyAgICAgICAgbV9zdWJwYXRocy5hcHBlbmQo
UGF0aFBvbHlnb24oKSk7CisgICAgICAgIG1fc3VicGF0aHMubGFzdCgpLmFwcGVuZChtX2N1cnJl
bnRQb2ludCk7CisgICAgfSBlbHNlCisgICAgICAgIEFTU0VSVCghbV9zdWJwYXRocy5pc0VtcHR5
KCkpOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6YWRkVG9TdWJwYXRoKGNvbnN0IFBsYXRmb3Jt
UGF0aEVsZW1lbnQmIGUpCit7CisgICAgaWYgKGUucGxhdGZvcm1UeXBlKCkgPT0gUGxhdGZvcm1Q
YXRoRWxlbWVudDo6UGF0aE1vdmVUbykgeworICAgICAgICBtX3BlbkxpZnRlZCA9IHRydWU7Cisg
ICAgICAgIG1fY3VycmVudFBvaW50ID0gZS5wb2ludEF0KDApOworICAgIH0gZWxzZSBpZiAoZS5w
bGF0Zm9ybVR5cGUoKSA9PSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoQ2xvc2VTdWJwYXRoKSB7
CisgICAgICAgIG1fcGVuTGlmdGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKCFtX3N1YnBhdGhzLmlz
RW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKG1fY3VycmVudFBvaW50ICE9IG1fc3VicGF0aHMu
bGFzdCgpWzBdKSB7CisgICAgICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRvIFczQywgd2UgaGF2
ZSB0byBkcmF3IGEgbGluZSBmcm9tIGN1cnJlbnQgcG9pbnQgdG8gdGhlIGluaXRpYWwgcG9pbnQK
KyAgICAgICAgICAgICAgICBtX3N1YnBhdGhzLmxhc3QoKS5hcHBlbmQobV9zdWJwYXRocy5sYXN0
KClbMF0pOworICAgICAgICAgICAgICAgIG1fY3VycmVudFBvaW50ID0gbV9zdWJwYXRocy5sYXN0
KClbMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbV9jdXJy
ZW50UG9pbnQuY2xlYXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBlbnN1cmVTdWJwYXRoKCk7
CisgICAgICAgIHN3aXRjaCAoZS5wbGF0Zm9ybVR5cGUoKSkgeworICAgICAgICBjYXNlIFBsYXRm
b3JtUGF0aEVsZW1lbnQ6OlBhdGhMaW5lVG86CisgICAgICAgICAgICBtX3N1YnBhdGhzLmxhc3Qo
KS5hcHBlbmQoZS5wb2ludEF0KDApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNl
IFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhBcmNUbzoKKyAgICAgICAgICAgIGFkZEFyY1BvaW50
cyhtX3N1YnBhdGhzLmxhc3QoKSwgZS5hcmNUbygpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhRdWFkQ3VydmVUbzoKKyAgICAgICAg
ICAgIHsKKyAgICAgICAgICAgICAgICBQYXRoUG9pbnQgY29udHJvbFtdID0geworICAgICAgICAg
ICAgICAgICAgICBtX2N1cnJlbnRQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgZS5wb2ludEF0
KDApLAorICAgICAgICAgICAgICAgICAgICBlLnBvaW50QXQoMSksCisgICAgICAgICAgICAgICAg
fTsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogbWFnaWMgbnVtYmVyPworICAgICAgICAgICAg
ICAgIHF1YWRDdXJ2ZSg1MCwgbV9zdWJwYXRocy5sYXN0KCksIGNvbnRyb2wpOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUGxhdGZvcm1QYXRoRWxlbWVu
dDo6UGF0aEJlemllckN1cnZlVG86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUGF0
aFBvaW50IGNvbnRyb2xbXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50UG9pbnQs
CisgICAgICAgICAgICAgICAgICAgIGUucG9pbnRBdCgwKSwKKyAgICAgICAgICAgICAgICAgICAg
ZS5wb2ludEF0KDEpLAorICAgICAgICAgICAgICAgICAgICBlLnBvaW50QXQoMiksCisgICAgICAg
ICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogbWFnaWMgbnVtYmVyPworICAg
ICAgICAgICAgICAgIGJlemllcigxMDAsIG1fc3VicGF0aHMubGFzdCgpLCBjb250cm9sKTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
fQorICAgICAgICBtX2N1cnJlbnRQb2ludCA9IG1fc3VicGF0aHMubGFzdCgpLmxhc3QoKTsKKyAg
ICB9Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphcHBlbmQoY29uc3QgUGxhdGZvcm1QYXRoRWxl
bWVudCYgZSkKK3sKKyAgICBlLmluZmxhdGVSZWN0VG9Db250YWluTWUobV9ib3VuZGluZ1JlY3Qs
IGxhc3RQb2ludCgpKTsKKyAgICBhZGRUb1N1YnBhdGgoZSk7CisgICAgbV9lbGVtZW50cy5hcHBl
bmQoZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphcHBlbmQoY29uc3QgUGxhdGZvcm1QYXRo
JiBwKQoreworICAgIGNvbnN0IFBsYXRmb3JtUGF0aEVsZW1lbnRzJiBlID0gcC5lbGVtZW50cygp
OworICAgIGZvciAoUGxhdGZvcm1QYXRoRWxlbWVudHM6OmNvbnN0X2l0ZXJhdG9yIGl0KGUuYmVn
aW4oKSk7IGl0ICE9IGUuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgYWRkVG9TdWJwYXRoKCppdCk7
CisgICAgICAgIGl0LT5pbmZsYXRlUmVjdFRvQ29udGFpbk1lKG1fYm91bmRpbmdSZWN0LCBsYXN0
UG9pbnQoKSk7CisgICAgICAgIG1fZWxlbWVudHMuYXBwZW5kKCppdCk7CisgICAgfQorfQorCit2
b2lkIFBsYXRmb3JtUGF0aDo6Y2xlYXIoKQoreworICAgIG1fZWxlbWVudHMuY2xlYXIoKTsKKyAg
ICBtX2JvdW5kaW5nUmVjdCA9IEZsb2F0UmVjdCgpOworICAgIG1fc3VicGF0aHMuY2xlYXIoKTsK
KyAgICBtX2N1cnJlbnRQb2ludC5jbGVhcigpOworICAgIG1fcGVuTGlmdGVkID0gdHJ1ZTsKK30K
Kwordm9pZCBQbGF0Zm9ybVBhdGg6OnN0cm9rZVBhdGgoSERDIGRjLCBjb25zdCBBZmZpbmVUcmFu
c2Zvcm0qIHRyYW5zZm9ybWF0aW9uKSBjb25zdAoreworICAgIGRyYXdQb2x5Z29ucyhkYywgbV9z
dWJwYXRocywgZmFsc2UsIHRyYW5zZm9ybWF0aW9uKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6
OmZpbGxQYXRoKEhEQyBkYywgY29uc3QgQWZmaW5lVHJhbnNmb3JtKiB0cmFuc2Zvcm1hdGlvbikg
Y29uc3QKK3sKKyAgICBIR0RJT0JKIG9sZFBlbiA9IFNlbGVjdE9iamVjdChkYywgR2V0U3RvY2tP
YmplY3QoTlVMTF9QRU4pKTsKKyAgICBkcmF3UG9seWdvbnMoZGMsIG1fc3VicGF0aHMsIHRydWUs
IHRyYW5zZm9ybWF0aW9uKTsKKyAgICBTZWxlY3RPYmplY3QoZGMsIG9sZFBlbik7Cit9CisKK3Zv
aWQgUGxhdGZvcm1QYXRoOjp0cmFuc2xhdGUoY29uc3QgRmxvYXRTaXplJiBzaXplKQoreworICAg
IGZvciAoUGxhdGZvcm1QYXRoRWxlbWVudHM6Oml0ZXJhdG9yIGl0KG1fZWxlbWVudHMuYmVnaW4o
KSk7IGl0ICE9IG1fZWxlbWVudHMuZW5kKCk7ICsraXQpCisgICAgICAgIGl0LT5tb3ZlKHNpemUp
OworCisgICAgbV9ib3VuZGluZ1JlY3QubW92ZShzaXplKTsKKyAgICBmb3IgKFZlY3RvcjxQYXRo
UG9seWdvbj46Oml0ZXJhdG9yIGl0ID0gbV9zdWJwYXRocy5iZWdpbigpOyBpdCAhPSBtX3N1YnBh
dGhzLmVuZCgpOyArK2l0KQorICAgICAgICBpdC0+bW92ZShzaXplKTsKK30KKwordm9pZCBQbGF0
Zm9ybVBhdGg6OnRyYW5zZm9ybShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHQpCit7CisgICAgZm9y
IChQbGF0Zm9ybVBhdGhFbGVtZW50czo6aXRlcmF0b3IgaXQobV9lbGVtZW50cy5iZWdpbigpKTsg
aXQgIT0gbV9lbGVtZW50cy5lbmQoKTsgKytpdCkKKyAgICAgICAgaXQtPnRyYW5zZm9ybSh0KTsK
KworICAgIG1fYm91bmRpbmdSZWN0ID0gdC5tYXBSZWN0KG1fYm91bmRpbmdSZWN0KTsKKyAgICBm
b3IgKFZlY3RvcjxQYXRoUG9seWdvbj46Oml0ZXJhdG9yIGl0ID0gbV9zdWJwYXRocy5iZWdpbigp
OyBpdCAhPSBtX3N1YnBhdGhzLmVuZCgpOyArK2l0KQorICAgICAgICBpdC0+dHJhbnNmb3JtKHQp
OworfQorCitib29sIFBsYXRmb3JtUGF0aDo6Y29udGFpbnMoY29uc3QgRmxvYXRQb2ludCYgcG9p
bnQsIFdpbmRSdWxlIHJ1bGUpIGNvbnN0Cit7CisgICAgLy8gb3B0aW1pemF0aW9uOiBjaGVjayB0
aGUgYm91bmRpbmcgcmVjdCBmaXJzdAorICAgIGlmICghY29udGFpbnNQb2ludChtX2JvdW5kaW5n
UmVjdCwgcG9pbnQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBmb3IgKFZlY3RvcjxQ
YXRoUG9seWdvbj46OmNvbnN0X2l0ZXJhdG9yIGkgPSBtX3N1YnBhdGhzLmJlZ2luKCk7IGkgIT0g
bV9zdWJwYXRocy5lbmQoKTsgKytpKSB7CisgICAgICAgIGlmIChpLT5jb250YWlucyhwb2ludCkp
CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9
CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjptb3ZlVG8oY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpCit7
CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6TW92ZVRvIGRhdGEgPSB7IHsgcG9pbnQueCgpLCBw
b2ludC55KCkgfSB9OworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQgcGUoZGF0YSk7CisgICAgYXBw
ZW5kKHBlKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmFkZExpbmVUbyhjb25zdCBGbG9hdFBv
aW50JiBwb2ludCkKK3sKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50OjpMaW5lVG8gZGF0YSA9IHsg
eyBwb2ludC54KCksIHBvaW50LnkoKSB9IH07CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudCBwZShk
YXRhKTsKKyAgICBhcHBlbmQocGUpOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6YWRkUXVhZEN1
cnZlVG8oY29uc3QgRmxvYXRQb2ludCYgY3AsIGNvbnN0IEZsb2F0UG9pbnQmIHApCit7CisgICAg
UGxhdGZvcm1QYXRoRWxlbWVudDo6UXVhZEN1cnZlVG8gZGF0YSA9IHsgeyBjcC54KCksIGNwLnko
KSB9LCB7IHAueCgpLCBwLnkoKSB9IH07CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudCBwZShkYXRh
KTsKKyAgICBhcHBlbmQocGUpOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6YWRkQmV6aWVyQ3Vy
dmVUbyhjb25zdCBGbG9hdFBvaW50JiBjcDEsIGNvbnN0IEZsb2F0UG9pbnQmIGNwMiwgY29uc3Qg
RmxvYXRQb2ludCYgcCkKK3sKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50OjpCZXppZXJDdXJ2ZVRv
IGRhdGEgPSB7IHsgY3AxLngoKSwgY3AxLnkoKSB9LCB7IGNwMi54KCksIGNwMi55KCkgfSwgeyBw
LngoKSwgcC55KCkgfSB9OworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQgcGUoZGF0YSk7CisgICAg
YXBwZW5kKHBlKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmFkZEFyY1RvKGNvbnN0IEZsb2F0
UG9pbnQmIGZwMSwgY29uc3QgRmxvYXRQb2ludCYgZnAyLCBmbG9hdCByYWRpdXMpCit7CisgICAg
Y29uc3QgUGF0aFBvaW50JiBwMCA9IG1fY3VycmVudFBvaW50OworICAgIFBhdGhQb2ludCBwMTsK
KyAgICBwMSA9IGZwMTsKKyAgICBQYXRoUG9pbnQgcDI7CisgICAgcDIgPSBmcDI7CisgICAgaWYg
KCFyYWRpdXMgfHwgcDAgPT0gcDEgfHwgcDEgPT0gcDIpIHsKKyAgICAgICAgYWRkTGluZVRvKHAx
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBhdGhWZWN0b3IgdjAxID0gcDAgLSBw
MTsKKyAgICBQYXRoVmVjdG9yIHYyMSA9IHAyIC0gcDE7CisKKyAgICAvLyBzaW4oQSAtIEIpID0g
c2luKEEpICogY29zKEIpIC0gc2luKEIpICogY29zKEEpCisgICAgZG91YmxlIGNyb3NzID0gdjAx
Lm1feCAqIHYyMS5tX3kgLSB2MDEubV95ICogdjIxLm1feDsKKworICAgIGlmIChmYWJzKGNyb3Nz
KSA8IDFFLTEwKSB7CisgICAgICAgIC8vIG9uIG9uZSBsaW5lCisgICAgICAgIGFkZExpbmVUbyhw
MSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkb3VibGUgZDAxID0gdjAxLmxlbmd0
aCgpOworICAgIGRvdWJsZSBkMjEgPSB2MjEubGVuZ3RoKCk7CisgICAgZG91YmxlIGFuZ2xlID0g
KHBpRG91YmxlIC0gYWJzKGFzaW4oY3Jvc3MgLyAoZDAxICogZDIxKSkpKSAqIDAuNTsKKyAgICBk
b3VibGUgc3BhbiA9IHJhZGl1cyAqIHRhbihhbmdsZSk7CisgICAgZG91YmxlIHJhdGUgPSBzcGFu
IC8gZDAxOworICAgIFBhdGhQb2ludCBzdGFydFBvaW50OworICAgIHN0YXJ0UG9pbnQubV94ID0g
cDEubV94ICsgdjAxLm1feCAqIHJhdGU7CisgICAgc3RhcnRQb2ludC5tX3kgPSBwMS5tX3kgKyB2
MDEubV95ICogcmF0ZTsKKworICAgIGFkZExpbmVUbyhzdGFydFBvaW50KTsKKworICAgIFBhdGhQ
b2ludCBlbmRQb2ludDsKKyAgICByYXRlID0gc3BhbiAvIGQyMTsKKyAgICBlbmRQb2ludC5tX3gg
PSBwMS5tX3ggKyB2MjEubV94ICogcmF0ZTsKKyAgICBlbmRQb2ludC5tX3kgPSBwMS5tX3kgKyB2
MjEubV95ICogcmF0ZTsKKworICAgIFBhdGhQb2ludCBtaWRQb2ludDsKKyAgICBtaWRQb2ludC5t
X3ggPSAoc3RhcnRQb2ludC5tX3ggKyBlbmRQb2ludC5tX3gpICogMC41OworICAgIG1pZFBvaW50
Lm1feSA9IChzdGFydFBvaW50Lm1feSArIGVuZFBvaW50Lm1feSkgKiAwLjU7CisKKyAgICBQYXRo
VmVjdG9yIHZtMSA9IG1pZFBvaW50IC0gcDE7CisgICAgZG91YmxlIGRtMSA9IHZtMS5sZW5ndGgo
KTsKKyAgICBkb3VibGUgZCA9IF9oeXBvdChyYWRpdXMsIHNwYW4pOworCisgICAgUGF0aFBvaW50
IGNlbnRlclBvaW50OworICAgIHJhdGUgPSBkIC8gZG0xOworICAgIGNlbnRlclBvaW50Lm1feCA9
IHAxLm1feCArIHZtMS5tX3ggKiByYXRlOworICAgIGNlbnRlclBvaW50Lm1feSA9IHAxLm1feSAr
IHZtMS5tX3kgKiByYXRlOworCisgICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6QXJjVG8gZGF0YSA9
IHsKKyAgICAgICAgZW5kUG9pbnQsCisgICAgICAgIGNlbnRlclBvaW50LAorICAgICAgICB7IHJh
ZGl1cywgcmFkaXVzIH0sCisgICAgICAgIGNyb3NzIDwgMAorICAgIH07CisgICAgUGxhdGZvcm1Q
YXRoRWxlbWVudCBwZShkYXRhKTsKKyAgICBhcHBlbmQocGUpOworfQorCit2b2lkIFBsYXRmb3Jt
UGF0aDo6Y2xvc2VTdWJwYXRoKCkKK3sKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50IHBlOworICAg
IGFwcGVuZChwZSk7Cit9CisKKy8vIGFkZCBhIGNpcmN1bGFyIGFyYyBjZW50cmVkIGF0IHAgd2l0
aCByYWRpdXMgciBmcm9tIHN0YXJ0IGFuZ2xlIHNhciAocmFkaWFucykgdG8gZW5kIGFuZ2xlIGVh
cgordm9pZCBQbGF0Zm9ybVBhdGg6OmFkZEVsbGlwc2UoY29uc3QgRmxvYXRQb2ludCYgcCwgZmxv
YXQgYSwgZmxvYXQgYiwgZmxvYXQgc2FyLCBmbG9hdCBlYXIsIGJvb2wgYW50aWNsb2Nrd2lzZSkK
K3sKKyAgICBmbG9hdCBzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWTsKKworICAgIG5vcm1hbGl6
ZUFuZ2xlKHNhcik7CisgICAgbm9ybWFsaXplQW5nbGUoZWFyKTsKKworICAgIGdldEVsbGlwc2VQ
b2ludEJ5QW5nbGUoc2FyLCBhLCBiLCBzdGFydFgsIHN0YXJ0WSk7CisgICAgZ2V0RWxsaXBzZVBv
aW50QnlBbmdsZShlYXIsIGEsIGIsIGVuZFgsIGVuZFkpOworCisgICAgdHJhbnNmb3JtQXJjUG9p
bnQoc3RhcnRYLCBzdGFydFksIHApOworICAgIHRyYW5zZm9ybUFyY1BvaW50KGVuZFgsIGVuZFks
IHApOworCisgICAgRmxvYXRQb2ludCBzdGFydChzdGFydFgsIHN0YXJ0WSk7CisgICAgbW92ZVRv
KHN0YXJ0KTsKKworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OkFyY1RvIGRhdGEgPSB7IHsgZW5k
WCwgZW5kWSB9LCB7IHAueCgpLCBwLnkoKSB9LCAgeyBhLCBiIH0sICFhbnRpY2xvY2t3aXNlIH07
CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudCBwZShkYXRhKTsKKyAgICBhcHBlbmQocGUpOworfQor
CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphZGRSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcikKK3sKKyAg
ICBtb3ZlVG8oci5sb2NhdGlvbigpKTsKKworICAgIGZsb2F0IHJpZ2h0ID0gci5yaWdodCgpIC0g
MTsKKyAgICBmbG9hdCBib3R0b20gPSByLmJvdHRvbSgpIC0gMTsKKyAgICBhZGRMaW5lVG8oRmxv
YXRQb2ludChyaWdodCwgci55KCkpKTsKKyAgICBhZGRMaW5lVG8oRmxvYXRQb2ludChyaWdodCwg
Ym90dG9tKSk7CisgICAgYWRkTGluZVRvKEZsb2F0UG9pbnQoci54KCksIGJvdHRvbSkpOworICAg
IGFkZExpbmVUbyhyLmxvY2F0aW9uKCkpOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6YWRkRWxs
aXBzZShjb25zdCBGbG9hdFJlY3QmIHIpCit7CisgICAgRmxvYXRTaXplIHJhZGl1cyhyLndpZHRo
KCkgKiAwLjUsIHIuaGVpZ2h0KCkgKiAwLjUpOworICAgIGFkZEVsbGlwc2Uoci5sb2NhdGlvbigp
ICsgcmFkaXVzLCByYWRpdXMud2lkdGgoKSwgcmFkaXVzLmhlaWdodCgpLCAwLCAwLCB0cnVlKTsK
K30KKworU3RyaW5nIFBsYXRmb3JtUGF0aDo6ZGVidWdTdHJpbmcoKSBjb25zdAoreworICAgIFN0
cmluZyByZXQ7CisgICAgZm9yIChQbGF0Zm9ybVBhdGhFbGVtZW50czo6Y29uc3RfaXRlcmF0b3Ig
aShtX2VsZW1lbnRzLmJlZ2luKCkpOyBpICE9IG1fZWxlbWVudHMuZW5kKCk7ICsraSkgeworICAg
ICAgICBzd2l0Y2ggKGktPnBsYXRmb3JtVHlwZSgpKSB7CisgICAgICAgIGNhc2UgUGxhdGZvcm1Q
YXRoRWxlbWVudDo6UGF0aE1vdmVUbzoKKyAgICAgICAgY2FzZSBQbGF0Zm9ybVBhdGhFbGVtZW50
OjpQYXRoTGluZVRvOgorICAgICAgICAgICAgcmV0ICs9IFN0cmluZzo6Zm9ybWF0KCJNICVmICVm
XG4iLCBpLT5wb2ludEF0KDApLm1feCwgaS0+cG9pbnRBdCgwKS5tX3kpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aEFyY1RvOgorICAg
ICAgICAgICAgcmV0ICs9IFN0cmluZzo6Zm9ybWF0KCJBICVmICVmICVmICVmICVmICVmICVjXG4i
CisgICAgICAgICAgICAgICAgLCBpLT5hcmNUbygpLm1fZW5kLm1feCwgaS0+YXJjVG8oKS5tX2Vu
ZC5tX3kKKyAgICAgICAgICAgICAgICAsIGktPmFyY1RvKCkubV9jZW50ZXIubV94LCBpLT5hcmNU
bygpLm1fY2VudGVyLm1feQorICAgICAgICAgICAgICAgICwgaS0+YXJjVG8oKS5tX3JhZGl1cy5t
X3gsIGktPmFyY1RvKCkubV9yYWRpdXMubV95CisgICAgICAgICAgICAgICAgLCBpLT5hcmNUbygp
Lm1fY2xvY2t3aXNlPyAnWScgOiAnTicpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNh
c2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aFF1YWRDdXJ2ZVRvOgorICAgICAgICAgICAgcmV0
ICs9IFN0cmluZzo6Zm9ybWF0KCJRICVmICVmICVmICVmXG4iCisgICAgICAgICAgICAgICAgLCBp
LT5wb2ludEF0KDApLm1feCwgaS0+cG9pbnRBdCgwKS5tX3kKKyAgICAgICAgICAgICAgICAsIGkt
PnBvaW50QXQoMSkubV94LCBpLT5wb2ludEF0KDEpLm1feSk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgY2FzZSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoQmV6aWVyQ3VydmVUbzoKKyAg
ICAgICAgICAgIHJldCArPSBTdHJpbmc6OmZvcm1hdCgiQiAlZiAlZiAlZiAlZiAlZiAlZlxuIgor
ICAgICAgICAgICAgICAgICwgaS0+cG9pbnRBdCgwKS5tX3gsIGktPnBvaW50QXQoMCkubV95Cisg
ICAgICAgICAgICAgICAgLCBpLT5wb2ludEF0KDEpLm1feCwgaS0+cG9pbnRBdCgxKS5tX3kKKyAg
ICAgICAgICAgICAgICAsIGktPnBvaW50QXQoMikubV94LCBpLT5wb2ludEF0KDIpLm1feSk7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVChp
LT5wbGF0Zm9ybVR5cGUoKSA9PSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoQ2xvc2VTdWJwYXRo
KTsKKyAgICAgICAgICAgIHJldCArPSAiU1xuIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmFw
cGx5KHZvaWQqIGluZm8sIFBhdGhBcHBsaWVyRnVuY3Rpb24gZnVuY3Rpb24pIGNvbnN0Cit7Cisg
ICAgUGF0aEVsZW1lbnQgcGVsZW1lbnQ7CisgICAgRmxvYXRQb2ludCBwb2ludHNbM107CisgICAg
cGVsZW1lbnQucG9pbnRzID0gcG9pbnRzOworCisgICAgZm9yIChQbGF0Zm9ybVBhdGhFbGVtZW50
czo6Y29uc3RfaXRlcmF0b3IgaXQobV9lbGVtZW50cy5iZWdpbigpKTsgaXQgIT0gbV9lbGVtZW50
cy5lbmQoKTsgKytpdCkgeworICAgICAgICBwZWxlbWVudC50eXBlID0gaXQtPnR5cGUoKTsKKyAg
ICAgICAgaW50IG4gPSBpdC0+bnVtUG9pbnRzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgbjsgKytpKQorICAgICAgICAgICAgcG9pbnRzW2ldID0gaXQtPnBvaW50QXQoaSk7CisgICAg
ICAgIGZ1bmN0aW9uKGluZm8sICZwZWxlbWVudCk7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFj
ZSBXZWJjb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1BsYXRmb3Jt
UGF0aFdpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL1BsYXRmb3JtUGF0aFdpbkNFLmNwcAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbmNlL1BsYXRmb3JtUGF0aFdpbkNFLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMTgsMTQgKzE4LDE0IEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1
ZGUgIlBsYXRmb3JtUGF0aFdpbmNlLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1QYXRoV2luQ0UuaCIK
IAogI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgogI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgog
I2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2luY2x1ZGUgIlBhdGguaCIKICNpbmNsdWRl
ICJQbGF0Zm9ybVN0cmluZy5oIgotI2luY2x1ZGUgIldpbmNlR3JhcGhpY3NFeHRyYXMuaCIKKyNp
bmNsdWRlICJXaW5DRUdyYXBoaWNzRXh0cmFzLmgiCiAjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMu
aD4KICNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CiAKQEAgLTMzLDcgKzMzLDcgQEAKIAogbmFtZXNw
YWNlIFdlYkNvcmUgewogCi0vLyBJbXBsZW1lbnRlZCBpbiBHcmFwaGljc0NvbnRleHRXaW5jZS5j
cHAKKy8vIEltcGxlbWVudGVkIGluIEdyYXBoaWNzQ29udGV4dFdpbkNFLmNwcAogdm9pZCBnZXRF
bGxpcHNlUG9pbnRCeUFuZ2xlKGRvdWJsZSBhbmdsZSwgZG91YmxlIGEsIGRvdWJsZSBiLCBmbG9h
dCYgeCwgZmxvYXQmIHkpOwogCiBzdGF0aWMgdm9pZCBxdWFkQ3VydmUoaW50IHNlZ21lbnRzLCBW
ZWN0b3I8UGF0aFBvaW50PiYgcHRzLCBjb25zdCBQYXRoUG9pbnQqIGNvbnRyb2wpCkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1BsYXRmb3JtUGF0aFdpbkNFLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QbGF0Zm9ybVBhdGhXaW5D
RS5oCShyZXZpc2lvbiA1NzI4OSkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5j
ZS9QbGF0Zm9ybVBhdGhXaW5jZS5oOjU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW5jZS9QbGF0Zm9ybVBhdGhXaW5DRS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTgz
IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLgor
ICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1
dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs
LAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk
IHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk
IGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3Qs
IHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVT
QS4KKyAqLworCisjaWZuZGVmIFBsYXRmb3JtUGF0aFdpbmNlX2gKKyNkZWZpbmUgUGxhdGZvcm1Q
YXRoV2luY2VfaAorCisjaW5jbHVkZSAiRmxvYXRQb2ludC5oIgorI2luY2x1ZGUgIkZsb2F0UmVj
dC5oIgorI2luY2x1ZGUgIlBhdGguaCIKKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworICAgIGNsYXNzIEdyYXBoaWNzQ29udGV4dDsKKworICAgIHN0cnVj
dCBQYXRoUG9pbnQgeworICAgICAgICBmbG9hdCBtX3g7CisgICAgICAgIGZsb2F0IG1feTsKKyAg
ICAgICAgY29uc3QgZmxvYXQmIHgoKSBjb25zdCB7IHJldHVybiBtX3g7IH0KKyAgICAgICAgY29u
c3QgZmxvYXQmIHkoKSBjb25zdCB7IHJldHVybiBtX3k7IH0KKyAgICAgICAgdm9pZCBzZXQoZmxv
YXQgeCwgZmxvYXQgeSkKKyAgICAgICAgeworICAgICAgICAgICAgbV94ID0geDsKKyAgICAgICAg
ICAgIG1feSA9IHk7CisgICAgICAgIH07CisgICAgICAgIG9wZXJhdG9yIEZsb2F0UG9pbnQoKSBj
b25zdCB7IHJldHVybiBGbG9hdFBvaW50KG1feCwgbV95KTsgfQorICAgICAgICB2b2lkIG1vdmUo
Y29uc3QgRmxvYXRTaXplJiBvZmZzZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1feCArPSBv
ZmZzZXQud2lkdGgoKTsKKyAgICAgICAgICAgIG1feSArPSBvZmZzZXQuaGVpZ2h0KCk7CisgICAg
ICAgIH0KKyAgICAgICAgUGF0aFBvaW50JiBvcGVyYXRvcj0oY29uc3QgRmxvYXRQb2ludCYgcCkK
KyAgICAgICAgeworICAgICAgICAgICAgbV94ID0gcC54KCk7CisgICAgICAgICAgICBtX3kgPSBw
LnkoKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICB2b2lk
IGNsZWFyKCkgeyBtX3ggPSBtX3kgPSAwOyB9CisgICAgfTsKKworICAgIHN0cnVjdCBQYXRoUG9s
eWdvbjogcHVibGljIFZlY3RvcjxQYXRoUG9pbnQ+IHsKKyAgICAgICAgdm9pZCBtb3ZlKGNvbnN0
IEZsb2F0U2l6ZSYgb2Zmc2V0KTsKKyAgICAgICAgdm9pZCB0cmFuc2Zvcm0oY29uc3QgQWZmaW5l
VHJhbnNmb3JtJiB0KTsKKyAgICAgICAgYm9vbCBjb250YWlucyhjb25zdCBGbG9hdFBvaW50JiBw
b2ludCkgY29uc3Q7CisgICAgfTsKKworICAgIGNsYXNzIFBsYXRmb3JtUGF0aEVsZW1lbnQgewor
ICAgIHB1YmxpYzoKKyAgICAgICAgZW51bSBQbGFmb3JtUGF0aEVsZW1lbnRUeXBlIHsKKyAgICAg
ICAgICAgIFBhdGhNb3ZlVG8sCisgICAgICAgICAgICBQYXRoTGluZVRvLAorICAgICAgICAgICAg
UGF0aEFyY1RvLAorICAgICAgICAgICAgUGF0aFF1YWRDdXJ2ZVRvLAorICAgICAgICAgICAgUGF0
aEJlemllckN1cnZlVG8sCisgICAgICAgICAgICBQYXRoQ2xvc2VTdWJwYXRoLAorICAgICAgICB9
OworCisgICAgICAgIHN0cnVjdCBNb3ZlVG8geworICAgICAgICAgICAgUGF0aFBvaW50IG1fZW5k
OworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBMaW5lVG8geworICAgICAgICAgICAgUGF0
aFBvaW50IG1fZW5kOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBBcmNUbyB7CisgICAg
ICAgICAgICBQYXRoUG9pbnQgbV9lbmQ7CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9jZW50ZXI7
CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9yYWRpdXM7CisgICAgICAgICAgICBib29sIG1fY2xv
Y2t3aXNlOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBRdWFkQ3VydmVUbyB7CisgICAg
ICAgICAgICBQYXRoUG9pbnQgbV9wb2ludDA7CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9wb2lu
dDE7CisgICAgICAgIH07CisKKyAgICAgICAgc3RydWN0IEJlemllckN1cnZlVG8geworICAgICAg
ICAgICAgUGF0aFBvaW50IG1fcG9pbnQwOworICAgICAgICAgICAgUGF0aFBvaW50IG1fcG9pbnQx
OworICAgICAgICAgICAgUGF0aFBvaW50IG1fcG9pbnQyOworICAgICAgICB9OworCisgICAgICAg
IFBsYXRmb3JtUGF0aEVsZW1lbnQoKTogbV90eXBlKFBhdGhDbG9zZVN1YnBhdGgpIHsgbV9kYXRh
Lm1fcG9pbnRzWzBdLnNldCgwLCAwKTsgICAgfQorICAgICAgICBQbGF0Zm9ybVBhdGhFbGVtZW50
KGNvbnN0IE1vdmVUbyYgZGF0YSk6IG1fdHlwZShQYXRoTW92ZVRvKSB7IG1fZGF0YS5tX21vdmVU
b0RhdGEgPSBkYXRhOyB9CisgICAgICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQoY29uc3QgTGluZVRv
JiBkYXRhKTogbV90eXBlKFBhdGhMaW5lVG8pIHsgbV9kYXRhLm1fbGluZVRvRGF0YSA9IGRhdGE7
IH0KKyAgICAgICAgUGxhdGZvcm1QYXRoRWxlbWVudChjb25zdCBBcmNUbyYgZGF0YSk6IG1fdHlw
ZShQYXRoQXJjVG8pIHsgbV9kYXRhLm1fYXJjVG9EYXRhID0gZGF0YTsgfQorICAgICAgICBQbGF0
Zm9ybVBhdGhFbGVtZW50KGNvbnN0IFF1YWRDdXJ2ZVRvJiBkYXRhKTogbV90eXBlKFBhdGhRdWFk
Q3VydmVUbykgeyBtX2RhdGEubV9xdWFkQ3VydmVUb0RhdGEgPSBkYXRhOyB9CisgICAgICAgIFBs
YXRmb3JtUGF0aEVsZW1lbnQoY29uc3QgQmV6aWVyQ3VydmVUbyYgZGF0YSk6IG1fdHlwZShQYXRo
QmV6aWVyQ3VydmVUbykgeyBtX2RhdGEubV9iZXppZXJDdXJ2ZVRvRGF0YSA9IGRhdGE7IH0KKwor
ICAgICAgICBjb25zdCBNb3ZlVG8mIG1vdmVUbygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5tX21v
dmVUb0RhdGE7IH0KKyAgICAgICAgY29uc3QgTGluZVRvJiBsaW5lVG8oKSBjb25zdCB7IHJldHVy
biBtX2RhdGEubV9saW5lVG9EYXRhOyB9CisgICAgICAgIGNvbnN0IEFyY1RvJiBhcmNUbygpIGNv
bnN0IHsgcmV0dXJuIG1fZGF0YS5tX2FyY1RvRGF0YTsgfQorICAgICAgICBjb25zdCBRdWFkQ3Vy
dmVUbyYgcXVhZEN1cnZlVG8oKSBjb25zdCB7IHJldHVybiBtX2RhdGEubV9xdWFkQ3VydmVUb0Rh
dGE7IH0KKyAgICAgICAgY29uc3QgQmV6aWVyQ3VydmVUbyYgYmV6aWVyQ3VydmVUbygpIGNvbnN0
IHsgcmV0dXJuIG1fZGF0YS5tX2JlemllckN1cnZlVG9EYXRhOyB9CisgICAgICAgIGNvbnN0IFBh
dGhQb2ludCYgbGFzdFBvaW50KCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG4g
PSBudW1Qb2ludHMoKTsKKyAgICAgICAgICAgIHJldHVybiBuID4gMSA/IG1fZGF0YS5tX3BvaW50
c1tuIC0gMV0gOiBtX2RhdGEubV9wb2ludHNbMF07CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qg
UGF0aFBvaW50JiBwb2ludEF0KGludCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLm1fcG9p
bnRzW2luZGV4XTsgfQorICAgICAgICBpbnQgbnVtUG9pbnRzKCkgY29uc3Q7CisgICAgICAgIGlu
dCBudW1Db250cm9sUG9pbnRzKCkgY29uc3Q7CisgICAgICAgIHZvaWQgbW92ZShjb25zdCBGbG9h
dFNpemUmIG9mZnNldCk7CisgICAgICAgIHZvaWQgdHJhbnNmb3JtKGNvbnN0IEFmZmluZVRyYW5z
Zm9ybSYgdCk7CisgICAgICAgIFBhdGhFbGVtZW50VHlwZSB0eXBlKCkgY29uc3Q7CisgICAgICAg
IFBsYWZvcm1QYXRoRWxlbWVudFR5cGUgcGxhdGZvcm1UeXBlKCkgY29uc3QgeyByZXR1cm4gbV90
eXBlOyB9CisgICAgICAgIHZvaWQgaW5mbGF0ZVJlY3RUb0NvbnRhaW5NZShGbG9hdFJlY3QmIHIs
IGNvbnN0IEZsb2F0UG9pbnQmIGxhc3RQb2ludCkgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAg
ICAgICBQbGFmb3JtUGF0aEVsZW1lbnRUeXBlIG1fdHlwZTsKKyAgICAgICAgdW5pb24geworICAg
ICAgICAgICAgTW92ZVRvIG1fbW92ZVRvRGF0YTsKKyAgICAgICAgICAgIExpbmVUbyBtX2xpbmVU
b0RhdGE7CisgICAgICAgICAgICBBcmNUbyBtX2FyY1RvRGF0YTsKKyAgICAgICAgICAgIFF1YWRD
dXJ2ZVRvIG1fcXVhZEN1cnZlVG9EYXRhOworICAgICAgICAgICAgQmV6aWVyQ3VydmVUbyBtX2Jl
emllckN1cnZlVG9EYXRhOworICAgICAgICAgICAgUGF0aFBvaW50IG1fcG9pbnRzWzRdOworICAg
ICAgICB9IG1fZGF0YTsKKyAgICB9OworCisgICAgdHlwZWRlZiBWZWN0b3I8UGxhdGZvcm1QYXRo
RWxlbWVudD4gUGxhdGZvcm1QYXRoRWxlbWVudHM7CisKKyAgICBjbGFzcyBQbGF0Zm9ybVBhdGgg
eworICAgIHB1YmxpYzoKKyAgICAgICAgUGxhdGZvcm1QYXRoKCk7CisgICAgICAgIGNvbnN0IFBs
YXRmb3JtUGF0aEVsZW1lbnRzJiBlbGVtZW50cygpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudHM7
IH0KKyAgICAgICAgdm9pZCBhcHBlbmQoY29uc3QgUGxhdGZvcm1QYXRoRWxlbWVudCYgZSk7Cisg
ICAgICAgIHZvaWQgYXBwZW5kKGNvbnN0IFBsYXRmb3JtUGF0aCYgcCk7CisgICAgICAgIHZvaWQg
Y2xlYXIoKTsKKyAgICAgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50
cy5pc0VtcHR5KCk7IH0KKworICAgICAgICB2b2lkIHN0cm9rZVBhdGgoSERDLCBjb25zdCBBZmZp
bmVUcmFuc2Zvcm0qIHRyKSBjb25zdDsKKyAgICAgICAgdm9pZCBmaWxsUGF0aChIREMsIGNvbnN0
IEFmZmluZVRyYW5zZm9ybSogdHIpIGNvbnN0OworICAgICAgICBGbG9hdFBvaW50IGxhc3RQb2lu
dCgpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudHMuaXNFbXB0eSgpID8gRmxvYXRQb2ludCgwLCAw
KSA6IG1fZWxlbWVudHMubGFzdCgpLmxhc3RQb2ludCgpOyB9CisKKyAgICAgICAgY29uc3QgRmxv
YXRSZWN0JiBib3VuZGluZ1JlY3QoKSBjb25zdCB7IHJldHVybiBtX2JvdW5kaW5nUmVjdDsgfQor
ICAgICAgICBib29sIGNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBXaW5kUnVsZSBy
dWxlKSBjb25zdDsKKyAgICAgICAgdm9pZCB0cmFuc2xhdGUoY29uc3QgRmxvYXRTaXplJiBzaXpl
KTsKKyAgICAgICAgdm9pZCB0cmFuc2Zvcm0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0KTsKKwor
ICAgICAgICB2b2lkIG1vdmVUbyhjb25zdCBGbG9hdFBvaW50Jik7CisgICAgICAgIHZvaWQgYWRk
TGluZVRvKGNvbnN0IEZsb2F0UG9pbnQmKTsKKyAgICAgICAgdm9pZCBhZGRRdWFkQ3VydmVUbyhj
b25zdCBGbG9hdFBvaW50JiBjb250cm9sUG9pbnQsIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KTsK
KyAgICAgICAgdm9pZCBhZGRCZXppZXJDdXJ2ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIGNvbnRyb2xQ
b2ludDEsIGNvbnN0IEZsb2F0UG9pbnQmIGNvbnRyb2xQb2ludDIsIGNvbnN0IEZsb2F0UG9pbnQm
KTsKKyAgICAgICAgdm9pZCBhZGRBcmNUbyhjb25zdCBGbG9hdFBvaW50JiwgY29uc3QgRmxvYXRQ
b2ludCYsIGZsb2F0IHJhZGl1cyk7CisgICAgICAgIHZvaWQgY2xvc2VTdWJwYXRoKCk7CisgICAg
ICAgIHZvaWQgYWRkRWxsaXBzZShjb25zdCBGbG9hdFBvaW50JiBwLCBmbG9hdCBhLCBmbG9hdCBi
LCBmbG9hdCBzYXIsIGZsb2F0IGVhciwgYm9vbCBhbnRpY2xvY2t3aXNlKTsKKyAgICAgICAgdm9p
ZCBhZGRSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcik7CisgICAgICAgIHZvaWQgYWRkRWxsaXBzZShj
b25zdCBGbG9hdFJlY3QmIHIpOworICAgICAgICBTdHJpbmcgZGVidWdTdHJpbmcoKSBjb25zdDsK
KyAgICAgICAgdm9pZCBhcHBseSh2b2lkKiBpbmZvLCBQYXRoQXBwbGllckZ1bmN0aW9uIGZ1bmN0
aW9uKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgZW5zdXJlU3VicGF0aCgp
OworICAgICAgICB2b2lkIGFkZFRvU3VicGF0aChjb25zdCBQbGF0Zm9ybVBhdGhFbGVtZW50JiBl
KTsKKworICAgICAgICBQbGF0Zm9ybVBhdGhFbGVtZW50cyBtX2VsZW1lbnRzOworICAgICAgICBG
bG9hdFJlY3QgbV9ib3VuZGluZ1JlY3Q7CisgICAgICAgIFZlY3RvcjxQYXRoUG9seWdvbj4gbV9z
dWJwYXRoczsKKyAgICAgICAgUGF0aFBvaW50IG1fY3VycmVudFBvaW50OworICAgICAgICBib29s
IG1fcGVuTGlmdGVkOworICAgIH07CisKK30KKworI2VuZGlmIC8vIFBsYXRmb3JtUGF0aFdpbmNl
X2gKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGxhdGZvcm1QYXRoV2lu
Q0UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1BsYXRm
b3JtUGF0aFdpbkNFLmgJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW5jZS9QbGF0Zm9ybVBhdGhXaW5DRS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xNyw4ICsx
Nyw4IEBACiAgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCiAgKi8KIAotI2lmbmRlZiBQ
bGF0Zm9ybVBhdGhXaW5jZV9oCi0jZGVmaW5lIFBsYXRmb3JtUGF0aFdpbmNlX2gKKyNpZm5kZWYg
UGxhdGZvcm1QYXRoV2luQ0VfaAorI2RlZmluZSBQbGF0Zm9ybVBhdGhXaW5DRV9oCiAKICNpbmNs
dWRlICJGbG9hdFBvaW50LmgiCiAjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCkBAIC0xODAsNCArMTgw
LDQgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiB9CiAKLSNlbmRpZiAvLyBQbGF0Zm9ybVBhdGhX
aW5jZV9oCisjZW5kaWYgLy8gUGxhdGZvcm1QYXRoV2luQ0VfaApJbmRleDogV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9QbGF0Zm9ybVBhdGhXaW5jZS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QbGF0Zm9ybVBhdGhXaW5jZS5jcHAJKHJl
dmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QbGF0Zm9y
bVBhdGhXaW5jZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsODEwICswLDAgQEAKLS8qCi0gKiAg
Q29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCi0gKgotICogIFRoaXMg
bGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IK
LSAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYwotICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb247IGVpdGhlcgotICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlv
dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBsaWJyYXJ5IGlzIGRp
c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJ
VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK
LSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu
ICBTZWUgdGhlIEdOVQotICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9y
ZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAq
ICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQs
IEZpZnRoIEZsb29yLAotICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICovCi0KLSNp
bmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJQbGF0Zm9ybVBhdGhXaW5jZS5oIgotCi0jaW5j
bHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCi0jaW5jbHVkZSAiRmxvYXRSZWN0LmgiCi0jaW5jbHVk
ZSAiR3JhcGhpY3NDb250ZXh0LmgiCi0jaW5jbHVkZSAiUGF0aC5oIgotI2luY2x1ZGUgIlBsYXRm
b3JtU3RyaW5nLmgiCi0jaW5jbHVkZSAiV2luY2VHcmFwaGljc0V4dHJhcy5oIgotI2luY2x1ZGUg
PHd0Zi9NYXRoRXh0cmFzLmg+Ci0jaW5jbHVkZSA8d3RmL093blB0ci5oPgotCi0jaW5jbHVkZSA8
d2luZG93cy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLS8vIEltcGxlbWVudGVkIGluIEdy
YXBoaWNzQ29udGV4dFdpbmNlLmNwcAotdm9pZCBnZXRFbGxpcHNlUG9pbnRCeUFuZ2xlKGRvdWJs
ZSBhbmdsZSwgZG91YmxlIGEsIGRvdWJsZSBiLCBmbG9hdCYgeCwgZmxvYXQmIHkpOwotCi1zdGF0
aWMgdm9pZCBxdWFkQ3VydmUoaW50IHNlZ21lbnRzLCBWZWN0b3I8UGF0aFBvaW50PiYgcHRzLCBj
b25zdCBQYXRoUG9pbnQqIGNvbnRyb2wpCi17Ci0gICAgY29uc3QgZmxvYXQgc3RlcCA9IDEuMCAv
IHNlZ21lbnRzOwotICAgIHJlZ2lzdGVyIGZsb2F0IHRBID0gMC4wOwotICAgIHJlZ2lzdGVyIGZs
b2F0IHRCID0gMS4wOwotCi0gICAgZmxvYXQgYzF4ID0gY29udHJvbFswXS54KCk7Ci0gICAgZmxv
YXQgYzF5ID0gY29udHJvbFswXS55KCk7Ci0gICAgZmxvYXQgYzJ4ID0gY29udHJvbFsxXS54KCk7
Ci0gICAgZmxvYXQgYzJ5ID0gY29udHJvbFsxXS55KCk7Ci0gICAgZmxvYXQgYzN4ID0gY29udHJv
bFsyXS54KCk7Ci0gICAgZmxvYXQgYzN5ID0gY29udHJvbFsyXS55KCk7Ci0KLSAgICBjb25zdCBp
bnQgb2Zmc2V0ID0gcHRzLnNpemUoKTsKLSAgICBwdHMucmVzaXplKG9mZnNldCArIHNlZ21lbnRz
KTsKLSAgICBQYXRoUG9pbnQgcHA7Ci0gICAgcHAubV94ID0gYzF4OwotICAgIHBwLm1feSA9IGMx
eTsKLQotICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2VnbWVudHM7ICsraSkgewotICAgICAgICB0
QSArPSBzdGVwOwotICAgICAgICB0QiAtPSBzdGVwOwotCi0gICAgICAgIGNvbnN0IGZsb2F0IGEg
PSB0QiAqIHRCOwotICAgICAgICBjb25zdCBmbG9hdCBiID0gMi4wICogdEEgKiB0QjsKLSAgICAg
ICAgY29uc3QgZmxvYXQgYyA9IHRBICogdEE7Ci0KLSAgICAgICAgcHAubV94ID0gYzF4ICogYSAr
IGMyeCAqIGIgKyBjM3ggKiBjOwotICAgICAgICBwcC5tX3kgPSBjMXkgKiBhICsgYzJ5ICogYiAr
IGMzeSAqIGM7Ci0KLSAgICAgICAgcHRzW29mZnNldCArIGkgLSAxXSA9IHBwOwotICAgIH0KLQot
ICAgIHBwLm1feCA9IGMzeDsKLSAgICBwcC5tX3kgPSBjM3k7Ci0gICAgcHRzW29mZnNldCArIHNl
Z21lbnRzIC0gMV0gPSBwcDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGJlemllcihpbnQgc2Vn
bWVudHMsIFZlY3RvcjxQYXRoUG9pbnQ+JiBwdHMsIGNvbnN0IFBhdGhQb2ludCogY29udHJvbCkK
LXsKLSAgICBjb25zdCBmbG9hdCBzdGVwID0gMS4wIC8gc2VnbWVudHM7Ci0gICAgcmVnaXN0ZXIg
ZmxvYXQgdEEgPSAwLjA7Ci0gICAgcmVnaXN0ZXIgZmxvYXQgdEIgPSAxLjA7Ci0KLSAgICBmbG9h
dCBjMXggPSBjb250cm9sWzBdLngoKTsKLSAgICBmbG9hdCBjMXkgPSBjb250cm9sWzBdLnkoKTsK
LSAgICBmbG9hdCBjMnggPSBjb250cm9sWzFdLngoKTsKLSAgICBmbG9hdCBjMnkgPSBjb250cm9s
WzFdLnkoKTsKLSAgICBmbG9hdCBjM3ggPSBjb250cm9sWzJdLngoKTsKLSAgICBmbG9hdCBjM3kg
PSBjb250cm9sWzJdLnkoKTsKLSAgICBmbG9hdCBjNHggPSBjb250cm9sWzNdLngoKTsKLSAgICBm
bG9hdCBjNHkgPSBjb250cm9sWzNdLnkoKTsKLQotICAgIGNvbnN0IGludCBvZmZzZXQgPSBwdHMu
c2l6ZSgpOwotICAgIHB0cy5yZXNpemUob2Zmc2V0ICsgc2VnbWVudHMpOwotICAgIFBhdGhQb2lu
dCBwcDsKLSAgICBwcC5tX3ggPSBjMXg7Ci0gICAgcHAubV95ID0gYzF5OwotCi0gICAgZm9yIChp
bnQgaSA9IDE7IGkgPCBzZWdtZW50czsgKytpKSB7Ci0gICAgICAgIHRBICs9IHN0ZXA7Ci0gICAg
ICAgIHRCIC09IHN0ZXA7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHRBc3EgPSB0QSAqIHRBOwotICAg
ICAgICBjb25zdCBmbG9hdCB0QnNxID0gdEIgKiB0QjsKLQotICAgICAgICBjb25zdCBmbG9hdCBh
ID0gdEJzcSAqIHRCOwotICAgICAgICBjb25zdCBmbG9hdCBiID0gMy4wICogdEEgKiB0QnNxOwot
ICAgICAgICBjb25zdCBmbG9hdCBjID0gMy4wICogdEIgKiB0QXNxOwotICAgICAgICBjb25zdCBm
bG9hdCBkID0gdEFzcSAqIHRBOwotCi0gICAgICAgIHBwLm1feCA9IGMxeCAqIGEgKyBjMnggKiBi
ICsgYzN4ICogYyArIGM0eCAqIGQ7Ci0gICAgICAgIHBwLm1feSA9IGMxeSAqIGEgKyBjMnkgKiBi
ICsgYzN5ICogYyArIGM0eSAqIGQ7Ci0KLSAgICAgICAgcHRzW29mZnNldCArIGkgLSAxXSA9IHBw
OwotICAgIH0KLQotICAgIHBwLm1feCA9IGM0eDsKLSAgICBwcC5tX3kgPSBjNHk7Ci0gICAgcHRz
W29mZnNldCArIHNlZ21lbnRzIC0gMV0gPSBwcDsKLX0KLQotc3RhdGljIGJvb2wgY29udGFpbnNQ
b2ludChjb25zdCBGbG9hdFJlY3QmIHIsIGNvbnN0IEZsb2F0UG9pbnQmIHApCi17Ci0gICAgcmV0
dXJuIHAueCgpID49IHIueCgpICYmIHAueSgpID49IHIueSgpICYmIHAueCgpIDwgci5yaWdodCgp
ICYmIHAueSgpIDwgci5ib3R0b20oKTsKLX0KLQotc3RhdGljIHZvaWQgbm9ybWFsaXplQW5nbGUo
ZmxvYXQmIGFuZ2xlKQotewotICAgIGFuZ2xlID0gZm1vZChhbmdsZSwgMiAqIHBpRmxvYXQpOwot
ICAgIGlmIChhbmdsZSA8IDApCi0gICAgICAgIGFuZ2xlICs9IDIgKiBwaUZsb2F0OwotICAgIGlm
IChhbmdsZSA8IDAuMDAwMDFmKQotICAgICAgICBhbmdsZSA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lk
IHRyYW5zZm9ybUFyY1BvaW50KGZsb2F0JiB4LCBmbG9hdCYgeSwgY29uc3QgRmxvYXRQb2ludCYg
YykKLXsKLSAgICB4ICs9IGMueCgpOwotICAgIHkgKz0gYy55KCk7Ci19Ci0KLXN0YXRpYyB2b2lk
IGluZmxhdGVSZWN0VG9Db250YWluUG9pbnQoRmxvYXRSZWN0JiByLCBmbG9hdCB4LCBmbG9hdCB5
KQotewotICAgIGlmIChyLmlzRW1wdHkoKSkgewotICAgICAgICByLnNldFgoeCk7Ci0gICAgICAg
IHIuc2V0WSh5KTsKLSAgICAgICAgci5zZXRTaXplKEZsb2F0U2l6ZSgxLCAxKSk7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHggPCByLngoKSkgewotICAgICAgICByLnNldFdpZHRo
KHIucmlnaHQoKSAtIHgpOwotICAgICAgICByLnNldFgoeCk7Ci0gICAgfSBlbHNlIHsKLSAgICAg
ICAgZmxvYXQgdyA9IHggLSByLngoKSArIDE7Ci0gICAgICAgIGlmICh3ID4gci53aWR0aCgpKQot
ICAgICAgICAgICAgci5zZXRXaWR0aCh3KTsKLSAgICB9Ci0gICAgaWYgKHkgPCByLnkoKSkgewot
ICAgICAgICByLnNldEhlaWdodChyLmJvdHRvbSgpIC0geSk7Ci0gICAgICAgIHIuc2V0WSh5KTsK
LSAgICB9IGVsc2UgewotICAgICAgICBmbG9hdCBoID0gIHkgLSByLnkoKSArIDE7Ci0gICAgICAg
IGlmIChoID4gci5oZWlnaHQoKSkKLSAgICAgICAgICAgIHIuc2V0SGVpZ2h0KGgpOwotICAgIH0K
LX0KLQotLy8gcmV0dXJuIDAtYmFzZWQgdmFsdWU6IDAgLSBmaXJzdCBRdWFkcmFudCAoIDAgLSA5
MCBkZWdyZWUpCi1zdGF0aWMgaW5saW5lIGludCBxdWFkcmFudChjb25zdCBQYXRoUG9pbnQmIHBv
aW50LCBjb25zdCBQYXRoUG9pbnQmIG9yaWdpbikKLXsKLSAgICByZXR1cm4gcG9pbnQubV94IDwg
b3JpZ2luLm1feCA/Ci0gICAgICAgIChwb2ludC5tX3kgPCBvcmlnaW4ubV95ID8gMiA6IDEpCi0g
ICAgICAgIDogKHBvaW50Lm1feSA8IG9yaWdpbi5tX3kgPyAzIDogMCk7Ci19Ci0KLXN0YXRpYyBp
bmxpbmUgYm9vbCBpc1F1YWRyYW50T25MZWZ0KGludCBxKSB7IHJldHVybiBxID09IDEgfHwgcSA9
PSAyOyB9Ci1zdGF0aWMgaW5saW5lIGJvb2wgaXNRdWFkcmFudE9uUmlnaHQoaW50IHEpIHsgcmV0
dXJuIHEgPT0gMCB8fCBxID09IDM7IH0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc1F1YWRyYW50T25U
b3AoaW50IHEpIHsgcmV0dXJuIHEgPT0gMiB8fCBxID09IDM7IH0KLXN0YXRpYyBpbmxpbmUgYm9v
bCBpc1F1YWRyYW50T25Cb3R0b20oaW50IHEpIHsgcmV0dXJuIHEgPT0gMCB8fCBxID09IDE7IH0K
LQotc3RhdGljIGlubGluZSBpbnQgbmV4dFF1YWRyYW50KGludCBxKSB7IHJldHVybiBxID09IDMg
PyAwIDogcSArIDE7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHF1YWRyYW50RGlmZihpbnQgcTEsIGlu
dCBxMikKLXsKLSAgICBpbnQgZCA9IHExIC0gcTI7Ci0gICAgd2hpbGUgKGQgPCAwKQotICAgICAg
ICBkICs9IDQ7Ci0gICAgcmV0dXJuIGQ7Ci19Ci0KLXN0cnVjdCBQYXRoVmVjdG9yIHsKLSAgICBm
bG9hdCBtX3g7Ci0gICAgZmxvYXQgbV95OwotCi0gICAgUGF0aFZlY3RvcigpIDogbV94KDApLCBt
X3koMCkge30KLSAgICBQYXRoVmVjdG9yKGZsb2F0IHgsIGZsb2F0IHkpIDogbV94KHgpLCBtX3ko
eSkge30KLSAgICBkb3VibGUgYW5nbGUoKSBjb25zdCB7IHJldHVybiBhdGFuMihtX3ksIG1feCk7
IH0KLSAgICBvcGVyYXRvciBkb3VibGUgKCkgY29uc3QgeyByZXR1cm4gYW5nbGUoKTsgfQotICAg
IGRvdWJsZSBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBfaHlwb3QobV94LCBtX3kpOyB9Ci19Owot
Ci1QYXRoVmVjdG9yIG9wZXJhdG9yLShjb25zdCBQYXRoUG9pbnQmIHAxLCBjb25zdCBQYXRoUG9p
bnQmIHAyKQotewotICAgIHJldHVybiBQYXRoVmVjdG9yKHAxLm1feCAtIHAyLm1feCwgcDEubV95
IC0gcDIubV95KTsKLX0KLQotc3RhdGljIHZvaWQgYWRkQXJjUG9pbnQoUGF0aFBvbHlnb24mIHBv
bHksIGNvbnN0IFBhdGhQb2ludCYgY2VudGVyLCBjb25zdCBQYXRoUG9pbnQmIHJhZGl1cywgZG91
YmxlIGFuZ2xlKQotewotICAgIFBhdGhQb2ludCBwOwotICAgIGdldEVsbGlwc2VQb2ludEJ5QW5n
bGUoYW5nbGUsIHJhZGl1cy5tX3gsIHJhZGl1cy5tX3ksIHAubV94LCBwLm1feSk7Ci0gICAgdHJh
bnNmb3JtQXJjUG9pbnQocC5tX3gsIHAubV95LCBjZW50ZXIpOwotICAgIGlmIChwb2x5LmlzRW1w
dHkoKSB8fCBwb2x5Lmxhc3QoKSAhPSBwKQotICAgICAgICBwb2x5LmFwcGVuZChwKTsKLX0KLQot
c3RhdGljIHZvaWQgYWRkQXJjUG9pbnRzKFBhdGhQb2x5Z29uJiBwb2x5LCBjb25zdCBQbGF0Zm9y
bVBhdGhFbGVtZW50OjpBcmNUbyYgZGF0YSkKLXsKLSAgICBjb25zdCBQYXRoUG9pbnQmIHN0YXJ0
UG9pbnQgPSBwb2x5Lmxhc3QoKTsKLSAgICBkb3VibGUgY3VyQW5nbGUgPSBzdGFydFBvaW50IC0g
ZGF0YS5tX2NlbnRlcjsKLSAgICBkb3VibGUgZW5kQW5nbGUgPSBkYXRhLm1fZW5kIC0gZGF0YS5t
X2NlbnRlcjsKLSAgICBkb3VibGUgYW5nbGVTdGVwID0gMi4gLyBzdGQ6Om1heChkYXRhLm1fcmFk
aXVzLm1feCwgZGF0YS5tX3JhZGl1cy5tX3kpOwotICAgIGlmIChkYXRhLm1fY2xvY2t3aXNlKSB7
Ci0gICAgICAgIGlmIChlbmRBbmdsZSA8PSBjdXJBbmdsZSB8fCBzdGFydFBvaW50ID09IGRhdGEu
bV9lbmQpCi0gICAgICAgICAgICBlbmRBbmdsZSArPSAyICogcGlEb3VibGU7Ci0gICAgfSBlbHNl
IHsKLSAgICAgICAgYW5nbGVTdGVwID0gLWFuZ2xlU3RlcDsKLSAgICAgICAgaWYgKGVuZEFuZ2xl
ID49IGN1ckFuZ2xlIHx8IHN0YXJ0UG9pbnQgPT0gZGF0YS5tX2VuZCkKLSAgICAgICAgICAgIGVu
ZEFuZ2xlIC09IDIgKiBwaURvdWJsZTsKLSAgICB9Ci0KLSAgICBmb3IgKGN1ckFuZ2xlICs9IGFu
Z2xlU3RlcDsgZGF0YS5tX2Nsb2Nrd2lzZSA/IGN1ckFuZ2xlIDwgZW5kQW5nbGUgOiBjdXJBbmds
ZSA+IGVuZEFuZ2xlOyBjdXJBbmdsZSArPSBhbmdsZVN0ZXApCi0gICAgICAgIGFkZEFyY1BvaW50
KHBvbHksIGRhdGEubV9jZW50ZXIsIGRhdGEubV9yYWRpdXMsIGN1ckFuZ2xlKTsKLQotICAgIGlm
IChwb2x5LmlzRW1wdHkoKSB8fCBwb2x5Lmxhc3QoKSAhPSBkYXRhLm1fZW5kKQotICAgICAgICBw
b2x5LmFwcGVuZChkYXRhLm1fZW5kKTsKLX0KLQotc3RhdGljIHZvaWQgZHJhd1BvbHlnb25zKEhE
QyBkYywgY29uc3QgVmVjdG9yPFBhdGhQb2x5Z29uPiYgcG9seWdvbnMsIGJvb2wgZmlsbCwgY29u
c3QgQWZmaW5lVHJhbnNmb3JtKiB0cmFuc2Zvcm1hdGlvbikKLXsKLSAgICBNZW1vcnlBbGxvY2F0
aW9uQ2FuRmFpbCBjYW5GYWlsOwotICAgIGZvciAoVmVjdG9yPFBhdGhQb2x5Z29uPjo6Y29uc3Rf
aXRlcmF0b3IgaSA9IHBvbHlnb25zLmJlZ2luKCk7IGkgIT0gcG9seWdvbnMuZW5kKCk7ICsraSkg
ewotICAgICAgICBpbnQgbnBvaW50cyA9IGktPnNpemUoKTsKLSAgICAgICAgaWYgKCFucG9pbnRz
KQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgUE9JTlQqIHdpblBvaW50cyA9IDA7
Ci0gICAgICAgIGlmIChmaWxsKSB7Ci0gICAgICAgICAgICBpZiAobnBvaW50cyA+IDIpCi0gICAg
ICAgICAgICAgICAgd2luUG9pbnRzID0gbmV3IFBPSU5UW25wb2ludHMgKyAxXTsKLSAgICAgICAg
fSBlbHNlCi0gICAgICAgICAgICB3aW5Qb2ludHMgPSBuZXcgUE9JTlRbbnBvaW50c107Ci0KLSAg
ICAgICAgaWYgKHdpblBvaW50cykgewotICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWF0aW9uKSB7
Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaTIgPSAwOyBpMiA8IG5wb2ludHM7ICsraTIpIHsK
LSAgICAgICAgICAgICAgICAgICAgRmxvYXRQb2ludCB0clBvaW50ID0gdHJhbnNmb3JtYXRpb24t
Pm1hcFBvaW50KGktPmF0KGkyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHdpblBvaW50c1tpMl0u
eCA9IHN0YWJsZVJvdW5kKHRyUG9pbnQueCgpKTsKLSAgICAgICAgICAgICAgICAgICAgd2luUG9p
bnRzW2kyXS55ID0gc3RhYmxlUm91bmQodHJQb2ludC55KCkpOwotICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaTIgPSAwOyBp
MiA8IG5wb2ludHM7ICsraTIpIHsKLSAgICAgICAgICAgICAgICAgICAgd2luUG9pbnRzW2kyXS54
ID0gc3RhYmxlUm91bmQoaS0+YXQoaTIpLngoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHdpblBv
aW50c1tpMl0ueSA9IHN0YWJsZVJvdW5kKGktPmF0KGkyKS55KCkpOwotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZpbGwgJiYgd2luUG9pbnRzW25w
b2ludHMgLSAxXSAhPSB3aW5Qb2ludHNbMF0pIHsKLSAgICAgICAgICAgICAgICB3aW5Qb2ludHNb
bnBvaW50c10ueCA9IHdpblBvaW50c1swXS54OwotICAgICAgICAgICAgICAgIHdpblBvaW50c1tu
cG9pbnRzXS55ID0gd2luUG9pbnRzWzBdLnk7Ci0gICAgICAgICAgICAgICAgKytucG9pbnRzOwot
ICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZmlsbCkKLSAgICAgICAgICAgICAgICA6
OlBvbHlnb24oZGMsIHdpblBvaW50cywgbnBvaW50cyk7Ci0gICAgICAgICAgICBlbHNlCi0gICAg
ICAgICAgICAgICAgOjpQb2x5bGluZShkYywgd2luUG9pbnRzLCBucG9pbnRzKTsKLSAgICAgICAg
ICAgIGRlbGV0ZVtdIHdpblBvaW50czsKLSAgICAgICAgfQotICAgIH0KLX0KLQotCi1pbnQgUGxh
dGZvcm1QYXRoRWxlbWVudDo6bnVtQ29udHJvbFBvaW50cygpIGNvbnN0Ci17Ci0gICAgc3dpdGNo
IChtX3R5cGUpIHsKLSAgICBjYXNlIFBhdGhNb3ZlVG86Ci0gICAgY2FzZSBQYXRoTGluZVRvOgot
ICAgICAgICByZXR1cm4gMTsKLSAgICBjYXNlIFBhdGhRdWFkQ3VydmVUbzoKLSAgICBjYXNlIFBh
dGhBcmNUbzoKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgY2FzZSBQYXRoQmV6aWVyQ3VydmVUbzoK
LSAgICAgICAgcmV0dXJuIDM7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQVNTRVJUKG1fdHlwZSA9
PSBQYXRoQ2xvc2VTdWJwYXRoKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi1pbnQg
UGxhdGZvcm1QYXRoRWxlbWVudDo6bnVtUG9pbnRzKCkgY29uc3QKLXsKLSAgICBzd2l0Y2ggKG1f
dHlwZSkgewotICAgIGNhc2UgUGF0aE1vdmVUbzoKLSAgICBjYXNlIFBhdGhMaW5lVG86Ci0gICAg
Y2FzZSBQYXRoQXJjVG86Ci0gICAgICAgIHJldHVybiAxOwotICAgIGNhc2UgUGF0aFF1YWRDdXJ2
ZVRvOgotICAgICAgICByZXR1cm4gMjsKLSAgICBjYXNlIFBhdGhCZXppZXJDdXJ2ZVRvOgotICAg
ICAgICByZXR1cm4gMzsKLSAgICBkZWZhdWx0OgotICAgICAgICBBU1NFUlQobV90eXBlID09IFBh
dGhDbG9zZVN1YnBhdGgpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLXZvaWQgUGF0
aFBvbHlnb246Om1vdmUoY29uc3QgRmxvYXRTaXplJiBvZmZzZXQpCi17Ci0gICAgZm9yIChWZWN0
b3I8UGF0aFBvaW50Pjo6aXRlcmF0b3IgaSA9IGJlZ2luKCk7IGkgPCBlbmQoKTsgKytpKQotICAg
ICAgICBpLT5tb3ZlKG9mZnNldCk7Ci19Ci0KLXZvaWQgUGF0aFBvbHlnb246OnRyYW5zZm9ybShj
b25zdCBBZmZpbmVUcmFuc2Zvcm0mIHQpCi17Ci0gICAgZm9yIChWZWN0b3I8UGF0aFBvaW50Pjo6
aXRlcmF0b3IgaSA9IGJlZ2luKCk7IGkgPCBlbmQoKTsgKytpKQotICAgICAgICAqaSA9IHQubWFw
UG9pbnQoKmkpOwotfQotCi1ib29sIFBhdGhQb2x5Z29uOjpjb250YWlucyhjb25zdCBGbG9hdFBv
aW50JiBwb2ludCkgY29uc3QKLXsKLSAgICBpZiAoc2l6ZSgpIDwgMykKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotCi0gICAgLy8gVGVzdCBpbnRlcnNlY3Rpb25zIGJldHdlZW4gdGhlIHBvbHlnb24g
YW5kIHRoZSB2ZXJ0aWNhbCBsaW5lOiB4ID0gcG9pbnQueCgpCi0KLSAgICBpbnQgaW50ZXJzZWN0
ZWQgPSAwOwotICAgIGNvbnN0IFBhdGhQb2ludCogcG9pbnQxID0gJmxhc3QoKTsKLSAgICBWZWN0
b3I8UGF0aFBvaW50Pjo6Y29uc3RfaXRlcmF0b3IgbGFzdCA9IGVuZCgpOwotICAgIC8vIHdhc05l
Z2F0aXZlOiAtMSBtZWFucyB1bmtub3duLCAwIG1lYW5zIGZhbHNlLCAxIG1lYW5zIHRydWUuCi0g
ICAgaW50IHdhc05lZ2F0aXZlID0gLTE7Ci0gICAgZm9yIChWZWN0b3I8UGF0aFBvaW50Pjo6Y29u
c3RfaXRlcmF0b3IgaSA9IGJlZ2luKCk7IGkgIT0gbGFzdDsgKytpKSB7Ci0gICAgICAgIGNvbnN0
IFBhdGhQb2ludCYgcG9pbnQyID0gKmk7Ci0gICAgICAgIGlmIChwb2ludDEtPngoKSAhPSBwb2lu
dC54KCkpIHsKLSAgICAgICAgICAgIGlmIChwb2ludDIueCgpID09IHBvaW50LngoKSkgewotICAg
ICAgICAgICAgICAgIC8vIFdlIGFyZSBnZXR0aW5nIG9uIHRoZSB2ZXJ0aWNhbCBsaW5lCi0gICAg
ICAgICAgICAgICAgd2FzTmVnYXRpdmUgPSBwb2ludDEtPngoKSA8IHBvaW50LngoKSA/IDEgOiAw
OwotICAgICAgICAgICAgfSBlbHNlIGlmIChwb2ludDIueCgpIDwgcG9pbnQueCgpICE9IHBvaW50
MS0+eCgpIDwgcG9pbnQueCgpKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgeSA9IChwb2ludDIu
eSgpIC0gcG9pbnQxLT55KCkpIC8gKHBvaW50Mi54KCkgLSBwb2ludDEtPngoKSkgKiAocG9pbnQu
eCgpIC0gcG9pbnQxLT54KCkpICsgcG9pbnQxLT55KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHkg
Pj0gcG9pbnQueSgpKQotICAgICAgICAgICAgICAgICAgICArK2ludGVyc2VjdGVkOwotICAgICAg
ICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gV2Ugd2VyZSBvbiB0aGUg
dmVydGljYWwgbGluZQotCi0gICAgICAgICAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlCi0gICAg
ICAgICAgICBpZiAocG9pbnQxLT55KCkgPT0gcG9pbnQueSgpKQotICAgICAgICAgICAgICAgIHJl
dHVybiB0cnVlOwotCi0gICAgICAgICAgICBpZiAocG9pbnQxLT55KCkgPiBwb2ludC55KCkpIHsK
LSAgICAgICAgICAgICAgICBpZiAocG9pbnQyLngoKSA9PSBwb2ludC54KCkpIHsKLSAgICAgICAg
ICAgICAgICAgICAgLy8gc2VlIGlmIHRoZSBwb2ludCBpcyBvbiB0aGlzIHNlZ21lbnQKLSAgICAg
ICAgICAgICAgICAgICAgaWYgKHBvaW50Mi55KCkgPD0gcG9pbnQueSgpKQotICAgICAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJl
IHN0aWxsIG9uIHRoZSBsaW5lCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg
ICAgICAgICAgLy8gV2UgYXJlIGxlYXZpbmcgdGhlIGxpbmUgbm93LgotICAgICAgICAgICAgICAg
ICAgICAvLyBXZSBoYXZlIHRvIGdldCBiYWNrIHRvIHNlZSB3aGljaCBzaWRlIHdlIGNvbWUgZnJv
bS4gSWYgd2UgY29tZSBmcm9tCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzYW1lIHNpZGUg
d2UgYXJlIGxlYXZpbmcsIG5vIGludGVyc2VjdGlvbiBzaG91bGQgYmUgY291bnRlZAotICAgICAg
ICAgICAgICAgICAgICBpZiAod2FzTmVnYXRpdmUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICBWZWN0b3I8UGF0aFBvaW50Pjo6Y29uc3RfaXRlcmF0b3Igakxhc3QgPSBpOwotICAgICAg
ICAgICAgICAgICAgICAgICAgVmVjdG9yPFBhdGhQb2ludD46OmNvbnN0X2l0ZXJhdG9yIGogPSBp
OwotICAgICAgICAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGlmIChqID09IGJlZ2luKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGog
PSBsYXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgLS1qOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChq
LT54KCkgIT0gcG9pbnQueCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlm
IChqLT54KCkgPiBwb2ludC54KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB3YXNOZWdhdGl2ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhc05lZ2F0aXZlID0gMTsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoaiAhPSBqTGFzdCk7
Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3YXNOZWdhdGl2ZSA8IDApCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3YXNOZWdhdGl2ZSA/IHBvaW50Mi54KCkgPiBwb2lu
dC54KCkgOiBwb2ludDIueCgpIDwgcG9pbnQueCgpKQotICAgICAgICAgICAgICAgICAgICAgICAg
KytpbnRlcnNlY3RlZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYg
KHBvaW50Mi54KCkgPT0gcG9pbnQueCgpICYmIHBvaW50Mi55KCkgPj0gcG9pbnQueSgpKQotICAg
ICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHBvaW50MSA9ICZw
b2ludDI7Ci0gICAgfQotCi0gICAgcmV0dXJuIGludGVyc2VjdGVkICYgMTsKLX0KLQotdm9pZCBQ
bGF0Zm9ybVBhdGhFbGVtZW50Ojptb3ZlKGNvbnN0IEZsb2F0U2l6ZSYgb2Zmc2V0KQotewotICAg
IGludCBuID0gbnVtQ29udHJvbFBvaW50cygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsg
KytpKQotICAgICAgICBtX2RhdGEubV9wb2ludHNbaV0ubW92ZShvZmZzZXQpOwotfQotCi12b2lk
IFBsYXRmb3JtUGF0aEVsZW1lbnQ6OnRyYW5zZm9ybShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHQp
Ci17Ci0gICAgaW50IG4gPSBudW1Db250cm9sUG9pbnRzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7
IGkgPCBuOyArK2kpIHsKLSAgICAgICAgRmxvYXRQb2ludCBwID0gdC5tYXBQb2ludChtX2RhdGEu
bV9wb2ludHNbaV0pOwotICAgICAgICBtX2RhdGEubV9wb2ludHNbaV0uc2V0KHAueCgpLCBwLnko
KSk7Ci0gICAgfQotfQotCi12b2lkIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OmluZmxhdGVSZWN0VG9D
b250YWluTWUoRmxvYXRSZWN0JiByLCBjb25zdCBGbG9hdFBvaW50JiBsYXN0UG9pbnQpIGNvbnN0
Ci17Ci0gICAgaWYgKG1fdHlwZSA9PSBQYXRoQXJjVG8pIHsKLSAgICAgICAgY29uc3QgQXJjVG8m
IGRhdGEgPSBtX2RhdGEubV9hcmNUb0RhdGE7Ci0gICAgICAgIFBhdGhQb2ludCBzdGFydFBvaW50
OwotICAgICAgICBzdGFydFBvaW50ID0gbGFzdFBvaW50OwotICAgICAgICBQYXRoUG9pbnQgZW5k
UG9pbnQgPSBkYXRhLm1fZW5kOwotICAgICAgICBpZiAoIWRhdGEubV9jbG9ja3dpc2UpCi0gICAg
ICAgICAgICBzdGQ6OnN3YXAoc3RhcnRQb2ludCwgZW5kUG9pbnQpOwotCi0gICAgICAgIGludCBx
MCA9IHF1YWRyYW50KHN0YXJ0UG9pbnQsIGRhdGEubV9jZW50ZXIpOwotICAgICAgICBpbnQgcTEg
PSBxdWFkcmFudChlbmRQb2ludCwgZGF0YS5tX2NlbnRlcik7Ci0gICAgICAgIGJvb2wgY29udGFp
bnNFeHRyZW1lc1s0XSA9IHsgZmFsc2UgfTsgLy8gYm90dG9tLCBsZWZ0LCB0b3AsIHJpZ2h0Ci0g
ICAgICAgIHN0YXRpYyBjb25zdCBQYXRoUG9pbnQgZXh0cmVtZVZlY3RvcnNbNF0gPSB7IHsgMCwg
MSB9LCB7IC0xLCAwIH0sIHsgMCwgLTEgfSwgeyAxLCAwIH0gfTsKLSAgICAgICAgaWYgKHEwID09
IHExKSB7Ci0gICAgICAgICAgICBpZiAoc3RhcnRQb2ludC5tX3ggPT0gZW5kUG9pbnQubV94IHx8
IGlzUXVhZHJhbnRPbkJvdHRvbShxMCkgIT0gc3RhcnRQb2ludC5tX3ggPiBlbmRQb2ludC5tX3gp
IHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkKLSAgICAgICAg
ICAgICAgICAgICAgY29udGFpbnNFeHRyZW1lc1tpXSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgZXh0cmVtZSA9IHEwOwotICAgICAgICAg
ICAgaW50IGRpZmYgPSBxdWFkcmFudERpZmYocTEsIHEwKTsKLSAgICAgICAgICAgIGZvciAoaW50
IGkgPSAwOyBpIDwgZGlmZjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgY29udGFpbnNFeHRyZW1l
c1tleHRyZW1lXSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZXh0cmVtZSA9IG5leHRRdWFkcmFu
dChleHRyZW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGluZmxhdGVS
ZWN0VG9Db250YWluUG9pbnQociwgc3RhcnRQb2ludC5tX3gsIHN0YXJ0UG9pbnQubV95KTsKLSAg
ICAgICAgaW5mbGF0ZVJlY3RUb0NvbnRhaW5Qb2ludChyLCBlbmRQb2ludC5tX3gsIGVuZFBvaW50
Lm1feSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7Ci0gICAgICAgICAg
ICBpZiAoY29udGFpbnNFeHRyZW1lc1tpXSkKLSAgICAgICAgICAgICAgICBpbmZsYXRlUmVjdFRv
Q29udGFpblBvaW50KHIsIGRhdGEubV9jZW50ZXIubV94ICsgZGF0YS5tX3JhZGl1cy5tX3ggKiBl
eHRyZW1lVmVjdG9yc1tpXS5tX3gsIGRhdGEubV9jZW50ZXIubV95ICsgZGF0YS5tX3JhZGl1cy5t
X3kgKiBleHRyZW1lVmVjdG9yc1tpXS5tX3kpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAg
ICAgICAgaW50IG4gPSBudW1Qb2ludHMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBu
OyArK2kpCi0gICAgICAgICAgICBpbmZsYXRlUmVjdFRvQ29udGFpblBvaW50KHIsIG1fZGF0YS5t
X3BvaW50c1tpXS5tX3gsIG1fZGF0YS5tX3BvaW50c1tpXS5tX3kpOwotICAgIH0KLX0KLQotUGF0
aEVsZW1lbnRUeXBlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OnR5cGUoKSBjb25zdAotewotICAgIHN3
aXRjaCAobV90eXBlKSB7Ci0gICAgY2FzZSBQYXRoTW92ZVRvOgotICAgICAgICByZXR1cm4gUGF0
aEVsZW1lbnRNb3ZlVG9Qb2ludDsKLSAgICBjYXNlIFBhdGhMaW5lVG86Ci0gICAgICAgIHJldHVy
biBQYXRoRWxlbWVudEFkZExpbmVUb1BvaW50OwotICAgIGNhc2UgUGF0aEFyY1RvOgotICAgICAg
ICAvLyBGSVhNRTogdGhlcmUncyBubyBhcmNUbyB0eXBlIGZvciBQYXRoRWxlbWVudAotICAgICAg
ICByZXR1cm4gUGF0aEVsZW1lbnRBZGRMaW5lVG9Qb2ludDsKLSAgICAgICAgLy8gcmV0dXJuIFBh
dGhFbGVtZW50QWRkUXVhZEN1cnZlVG9Qb2ludDsKLSAgICBjYXNlIFBhdGhRdWFkQ3VydmVUbzoK
LSAgICAgICAgcmV0dXJuIFBhdGhFbGVtZW50QWRkUXVhZEN1cnZlVG9Qb2ludDsKLSAgICBjYXNl
IFBhdGhCZXppZXJDdXJ2ZVRvOgotICAgICAgICByZXR1cm4gUGF0aEVsZW1lbnRBZGRDdXJ2ZVRv
UG9pbnQ7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQVNTRVJUKG1fdHlwZSA9PSBQYXRoQ2xvc2VT
dWJwYXRoKTsKLSAgICAgICAgcmV0dXJuIFBhdGhFbGVtZW50Q2xvc2VTdWJwYXRoOwotICAgIH0K
LX0KLQotUGxhdGZvcm1QYXRoOjpQbGF0Zm9ybVBhdGgoKQotICAgIDogbV9wZW5MaWZ0ZWQodHJ1
ZSkKLXsKLSAgICBtX2N1cnJlbnRQb2ludC5jbGVhcigpOwotfQotCi12b2lkIFBsYXRmb3JtUGF0
aDo6ZW5zdXJlU3VicGF0aCgpCi17Ci0gICAgaWYgKG1fcGVuTGlmdGVkKSB7Ci0gICAgICAgIG1f
cGVuTGlmdGVkID0gZmFsc2U7Ci0gICAgICAgIG1fc3VicGF0aHMuYXBwZW5kKFBhdGhQb2x5Z29u
KCkpOwotICAgICAgICBtX3N1YnBhdGhzLmxhc3QoKS5hcHBlbmQobV9jdXJyZW50UG9pbnQpOwot
ICAgIH0gZWxzZQotICAgICAgICBBU1NFUlQoIW1fc3VicGF0aHMuaXNFbXB0eSgpKTsKLX0KLQot
dm9pZCBQbGF0Zm9ybVBhdGg6OmFkZFRvU3VicGF0aChjb25zdCBQbGF0Zm9ybVBhdGhFbGVtZW50
JiBlKQotewotICAgIGlmIChlLnBsYXRmb3JtVHlwZSgpID09IFBsYXRmb3JtUGF0aEVsZW1lbnQ6
OlBhdGhNb3ZlVG8pIHsKLSAgICAgICAgbV9wZW5MaWZ0ZWQgPSB0cnVlOwotICAgICAgICBtX2N1
cnJlbnRQb2ludCA9IGUucG9pbnRBdCgwKTsKLSAgICB9IGVsc2UgaWYgKGUucGxhdGZvcm1UeXBl
KCkgPT0gUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aENsb3NlU3VicGF0aCkgewotICAgICAgICBt
X3BlbkxpZnRlZCA9IHRydWU7Ci0gICAgICAgIGlmICghbV9zdWJwYXRocy5pc0VtcHR5KCkpIHsK
LSAgICAgICAgICAgIGlmIChtX2N1cnJlbnRQb2ludCAhPSBtX3N1YnBhdGhzLmxhc3QoKVswXSkg
ewotICAgICAgICAgICAgICAgIC8vIEFjY29yZGluZyB0byBXM0MsIHdlIGhhdmUgdG8gZHJhdyBh
IGxpbmUgZnJvbSBjdXJyZW50IHBvaW50IHRvIHRoZSBpbml0aWFsIHBvaW50Ci0gICAgICAgICAg
ICAgICAgbV9zdWJwYXRocy5sYXN0KCkuYXBwZW5kKG1fc3VicGF0aHMubGFzdCgpWzBdKTsKLSAg
ICAgICAgICAgICAgICBtX2N1cnJlbnRQb2ludCA9IG1fc3VicGF0aHMubGFzdCgpWzBdOwotICAg
ICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG1fY3VycmVudFBvaW50LmNs
ZWFyKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZW5zdXJlU3VicGF0aCgpOwotICAgICAgICBz
d2l0Y2ggKGUucGxhdGZvcm1UeXBlKCkpIHsKLSAgICAgICAgY2FzZSBQbGF0Zm9ybVBhdGhFbGVt
ZW50OjpQYXRoTGluZVRvOgotICAgICAgICAgICAgbV9zdWJwYXRocy5sYXN0KCkuYXBwZW5kKGUu
cG9pbnRBdCgwKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQbGF0Zm9ybVBh
dGhFbGVtZW50OjpQYXRoQXJjVG86Ci0gICAgICAgICAgICBhZGRBcmNQb2ludHMobV9zdWJwYXRo
cy5sYXN0KCksIGUuYXJjVG8oKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQ
bGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoUXVhZEN1cnZlVG86Ci0gICAgICAgICAgICB7Ci0gICAg
ICAgICAgICAgICAgUGF0aFBvaW50IGNvbnRyb2xbXSA9IHsKLSAgICAgICAgICAgICAgICAgICAg
bV9jdXJyZW50UG9pbnQsCi0gICAgICAgICAgICAgICAgICAgIGUucG9pbnRBdCgwKSwKLSAgICAg
ICAgICAgICAgICAgICAgZS5wb2ludEF0KDEpLAotICAgICAgICAgICAgICAgIH07Ci0gICAgICAg
ICAgICAgICAgLy8gRklYTUU6IG1hZ2ljIG51bWJlcj8KLSAgICAgICAgICAgICAgICBxdWFkQ3Vy
dmUoNTAsIG1fc3VicGF0aHMubGFzdCgpLCBjb250cm9sKTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhCZXpp
ZXJDdXJ2ZVRvOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBhdGhQb2ludCBjb250
cm9sW10gPSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fY3VycmVudFBvaW50LAotICAgICAgICAg
ICAgICAgICAgICBlLnBvaW50QXQoMCksCi0gICAgICAgICAgICAgICAgICAgIGUucG9pbnRBdCgx
KSwKLSAgICAgICAgICAgICAgICAgICAgZS5wb2ludEF0KDIpLAotICAgICAgICAgICAgICAgIH07
Ci0gICAgICAgICAgICAgICAgLy8gRklYTUU6IG1hZ2ljIG51bWJlcj8KLSAgICAgICAgICAgICAg
ICBiZXppZXIoMTAwLCBtX3N1YnBhdGhzLmxhc3QoKSwgY29udHJvbCk7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAg
bV9jdXJyZW50UG9pbnQgPSBtX3N1YnBhdGhzLmxhc3QoKS5sYXN0KCk7Ci0gICAgfQotfQotCi12
b2lkIFBsYXRmb3JtUGF0aDo6YXBwZW5kKGNvbnN0IFBsYXRmb3JtUGF0aEVsZW1lbnQmIGUpCi17
Ci0gICAgZS5pbmZsYXRlUmVjdFRvQ29udGFpbk1lKG1fYm91bmRpbmdSZWN0LCBsYXN0UG9pbnQo
KSk7Ci0gICAgYWRkVG9TdWJwYXRoKGUpOwotICAgIG1fZWxlbWVudHMuYXBwZW5kKGUpOwotfQot
Ci12b2lkIFBsYXRmb3JtUGF0aDo6YXBwZW5kKGNvbnN0IFBsYXRmb3JtUGF0aCYgcCkKLXsKLSAg
ICBjb25zdCBQbGF0Zm9ybVBhdGhFbGVtZW50cyYgZSA9IHAuZWxlbWVudHMoKTsKLSAgICBmb3Ig
KFBsYXRmb3JtUGF0aEVsZW1lbnRzOjpjb25zdF9pdGVyYXRvciBpdChlLmJlZ2luKCkpOyBpdCAh
PSBlLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIGFkZFRvU3VicGF0aCgqaXQpOwotICAgICAgICBp
dC0+aW5mbGF0ZVJlY3RUb0NvbnRhaW5NZShtX2JvdW5kaW5nUmVjdCwgbGFzdFBvaW50KCkpOwot
ICAgICAgICBtX2VsZW1lbnRzLmFwcGVuZCgqaXQpOwotICAgIH0KLX0KLQotdm9pZCBQbGF0Zm9y
bVBhdGg6OmNsZWFyKCkKLXsKLSAgICBtX2VsZW1lbnRzLmNsZWFyKCk7Ci0gICAgbV9ib3VuZGlu
Z1JlY3QgPSBGbG9hdFJlY3QoKTsKLSAgICBtX3N1YnBhdGhzLmNsZWFyKCk7Ci0gICAgbV9jdXJy
ZW50UG9pbnQuY2xlYXIoKTsKLSAgICBtX3BlbkxpZnRlZCA9IHRydWU7Ci19Ci0KLXZvaWQgUGxh
dGZvcm1QYXRoOjpzdHJva2VQYXRoKEhEQyBkYywgY29uc3QgQWZmaW5lVHJhbnNmb3JtKiB0cmFu
c2Zvcm1hdGlvbikgY29uc3QKLXsKLSAgICBkcmF3UG9seWdvbnMoZGMsIG1fc3VicGF0aHMsIGZh
bHNlLCB0cmFuc2Zvcm1hdGlvbik7Ci19Ci0KLXZvaWQgUGxhdGZvcm1QYXRoOjpmaWxsUGF0aChI
REMgZGMsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSogdHJhbnNmb3JtYXRpb24pIGNvbnN0Ci17Ci0g
ICAgSEdESU9CSiBvbGRQZW4gPSBTZWxlY3RPYmplY3QoZGMsIEdldFN0b2NrT2JqZWN0KE5VTExf
UEVOKSk7Ci0gICAgZHJhd1BvbHlnb25zKGRjLCBtX3N1YnBhdGhzLCB0cnVlLCB0cmFuc2Zvcm1h
dGlvbik7Ci0gICAgU2VsZWN0T2JqZWN0KGRjLCBvbGRQZW4pOwotfQotCi12b2lkIFBsYXRmb3Jt
UGF0aDo6dHJhbnNsYXRlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKLXsKLSAgICBmb3IgKFBsYXRm
b3JtUGF0aEVsZW1lbnRzOjppdGVyYXRvciBpdChtX2VsZW1lbnRzLmJlZ2luKCkpOyBpdCAhPSBt
X2VsZW1lbnRzLmVuZCgpOyArK2l0KQotICAgICAgICBpdC0+bW92ZShzaXplKTsKLQotICAgIG1f
Ym91bmRpbmdSZWN0Lm1vdmUoc2l6ZSk7Ci0gICAgZm9yIChWZWN0b3I8UGF0aFBvbHlnb24+Ojpp
dGVyYXRvciBpdCA9IG1fc3VicGF0aHMuYmVnaW4oKTsgaXQgIT0gbV9zdWJwYXRocy5lbmQoKTsg
KytpdCkKLSAgICAgICAgaXQtPm1vdmUoc2l6ZSk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1QYXRoOjp0
cmFuc2Zvcm0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0KQotewotICAgIGZvciAoUGxhdGZvcm1Q
YXRoRWxlbWVudHM6Oml0ZXJhdG9yIGl0KG1fZWxlbWVudHMuYmVnaW4oKSk7IGl0ICE9IG1fZWxl
bWVudHMuZW5kKCk7ICsraXQpCi0gICAgICAgIGl0LT50cmFuc2Zvcm0odCk7Ci0KLSAgICBtX2Jv
dW5kaW5nUmVjdCA9IHQubWFwUmVjdChtX2JvdW5kaW5nUmVjdCk7Ci0gICAgZm9yIChWZWN0b3I8
UGF0aFBvbHlnb24+OjppdGVyYXRvciBpdCA9IG1fc3VicGF0aHMuYmVnaW4oKTsgaXQgIT0gbV9z
dWJwYXRocy5lbmQoKTsgKytpdCkKLSAgICAgICAgaXQtPnRyYW5zZm9ybSh0KTsKLX0KLQotYm9v
bCBQbGF0Zm9ybVBhdGg6OmNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBXaW5kUnVs
ZSBydWxlKSBjb25zdAotewotICAgIC8vIG9wdGltaXphdGlvbjogY2hlY2sgdGhlIGJvdW5kaW5n
IHJlY3QgZmlyc3QKLSAgICBpZiAoIWNvbnRhaW5zUG9pbnQobV9ib3VuZGluZ1JlY3QsIHBvaW50
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgZm9yIChWZWN0b3I8UGF0aFBvbHlnb24+
Ojpjb25zdF9pdGVyYXRvciBpID0gbV9zdWJwYXRocy5iZWdpbigpOyBpICE9IG1fc3VicGF0aHMu
ZW5kKCk7ICsraSkgewotICAgICAgICBpZiAoaS0+Y29udGFpbnMocG9pbnQpKQotICAgICAgICAg
ICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFBs
YXRmb3JtUGF0aDo6bW92ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KQotewotICAgIFBsYXRm
b3JtUGF0aEVsZW1lbnQ6Ok1vdmVUbyBkYXRhID0geyB7IHBvaW50LngoKSwgcG9pbnQueSgpIH0g
fTsKLSAgICBQbGF0Zm9ybVBhdGhFbGVtZW50IHBlKGRhdGEpOwotICAgIGFwcGVuZChwZSk7Ci19
Ci0KLXZvaWQgUGxhdGZvcm1QYXRoOjphZGRMaW5lVG8oY29uc3QgRmxvYXRQb2ludCYgcG9pbnQp
Ci17Ci0gICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6TGluZVRvIGRhdGEgPSB7IHsgcG9pbnQueCgp
LCBwb2ludC55KCkgfSB9OwotICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQgcGUoZGF0YSk7Ci0gICAg
YXBwZW5kKHBlKTsKLX0KLQotdm9pZCBQbGF0Zm9ybVBhdGg6OmFkZFF1YWRDdXJ2ZVRvKGNvbnN0
IEZsb2F0UG9pbnQmIGNwLCBjb25zdCBGbG9hdFBvaW50JiBwKQotewotICAgIFBsYXRmb3JtUGF0
aEVsZW1lbnQ6OlF1YWRDdXJ2ZVRvIGRhdGEgPSB7IHsgY3AueCgpLCBjcC55KCkgfSwgeyBwLngo
KSwgcC55KCkgfSB9OwotICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQgcGUoZGF0YSk7Ci0gICAgYXBw
ZW5kKHBlKTsKLX0KLQotdm9pZCBQbGF0Zm9ybVBhdGg6OmFkZEJlemllckN1cnZlVG8oY29uc3Qg
RmxvYXRQb2ludCYgY3AxLCBjb25zdCBGbG9hdFBvaW50JiBjcDIsIGNvbnN0IEZsb2F0UG9pbnQm
IHApCi17Ci0gICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6QmV6aWVyQ3VydmVUbyBkYXRhID0geyB7
IGNwMS54KCksIGNwMS55KCkgfSwgeyBjcDIueCgpLCBjcDIueSgpIH0sIHsgcC54KCksIHAueSgp
IH0gfTsKLSAgICBQbGF0Zm9ybVBhdGhFbGVtZW50IHBlKGRhdGEpOwotICAgIGFwcGVuZChwZSk7
Ci19Ci0KLXZvaWQgUGxhdGZvcm1QYXRoOjphZGRBcmNUbyhjb25zdCBGbG9hdFBvaW50JiBmcDEs
IGNvbnN0IEZsb2F0UG9pbnQmIGZwMiwgZmxvYXQgcmFkaXVzKQotewotICAgIGNvbnN0IFBhdGhQ
b2ludCYgcDAgPSBtX2N1cnJlbnRQb2ludDsKLSAgICBQYXRoUG9pbnQgcDE7Ci0gICAgcDEgPSBm
cDE7Ci0gICAgUGF0aFBvaW50IHAyOwotICAgIHAyID0gZnAyOwotICAgIGlmICghcmFkaXVzIHx8
IHAwID09IHAxIHx8IHAxID09IHAyKSB7Ci0gICAgICAgIGFkZExpbmVUbyhwMSk7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0KLSAgICBQYXRoVmVjdG9yIHYwMSA9IHAwIC0gcDE7Ci0gICAgUGF0
aFZlY3RvciB2MjEgPSBwMiAtIHAxOwotCi0gICAgLy8gc2luKEEgLSBCKSA9IHNpbihBKSAqIGNv
cyhCKSAtIHNpbihCKSAqIGNvcyhBKQotICAgIGRvdWJsZSBjcm9zcyA9IHYwMS5tX3ggKiB2MjEu
bV95IC0gdjAxLm1feSAqIHYyMS5tX3g7Ci0KLSAgICBpZiAoZmFicyhjcm9zcykgPCAxRS0xMCkg
ewotICAgICAgICAvLyBvbiBvbmUgbGluZQotICAgICAgICBhZGRMaW5lVG8ocDEpOwotICAgICAg
ICByZXR1cm47Ci0gICAgfQotCi0gICAgZG91YmxlIGQwMSA9IHYwMS5sZW5ndGgoKTsKLSAgICBk
b3VibGUgZDIxID0gdjIxLmxlbmd0aCgpOwotICAgIGRvdWJsZSBhbmdsZSA9IChwaURvdWJsZSAt
IGFicyhhc2luKGNyb3NzIC8gKGQwMSAqIGQyMSkpKSkgKiAwLjU7Ci0gICAgZG91YmxlIHNwYW4g
PSByYWRpdXMgKiB0YW4oYW5nbGUpOwotICAgIGRvdWJsZSByYXRlID0gc3BhbiAvIGQwMTsKLSAg
ICBQYXRoUG9pbnQgc3RhcnRQb2ludDsKLSAgICBzdGFydFBvaW50Lm1feCA9IHAxLm1feCArIHYw
MS5tX3ggKiByYXRlOwotICAgIHN0YXJ0UG9pbnQubV95ID0gcDEubV95ICsgdjAxLm1feSAqIHJh
dGU7Ci0KLSAgICBhZGRMaW5lVG8oc3RhcnRQb2ludCk7Ci0KLSAgICBQYXRoUG9pbnQgZW5kUG9p
bnQ7Ci0gICAgcmF0ZSA9IHNwYW4gLyBkMjE7Ci0gICAgZW5kUG9pbnQubV94ID0gcDEubV94ICsg
djIxLm1feCAqIHJhdGU7Ci0gICAgZW5kUG9pbnQubV95ID0gcDEubV95ICsgdjIxLm1feSAqIHJh
dGU7Ci0KLSAgICBQYXRoUG9pbnQgbWlkUG9pbnQ7Ci0gICAgbWlkUG9pbnQubV94ID0gKHN0YXJ0
UG9pbnQubV94ICsgZW5kUG9pbnQubV94KSAqIDAuNTsKLSAgICBtaWRQb2ludC5tX3kgPSAoc3Rh
cnRQb2ludC5tX3kgKyBlbmRQb2ludC5tX3kpICogMC41OwotCi0gICAgUGF0aFZlY3RvciB2bTEg
PSBtaWRQb2ludCAtIHAxOwotICAgIGRvdWJsZSBkbTEgPSB2bTEubGVuZ3RoKCk7Ci0gICAgZG91
YmxlIGQgPSBfaHlwb3QocmFkaXVzLCBzcGFuKTsKLQotICAgIFBhdGhQb2ludCBjZW50ZXJQb2lu
dDsKLSAgICByYXRlID0gZCAvIGRtMTsKLSAgICBjZW50ZXJQb2ludC5tX3ggPSBwMS5tX3ggKyB2
bTEubV94ICogcmF0ZTsKLSAgICBjZW50ZXJQb2ludC5tX3kgPSBwMS5tX3kgKyB2bTEubV95ICog
cmF0ZTsKLQotICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OkFyY1RvIGRhdGEgPSB7Ci0gICAgICAg
IGVuZFBvaW50LAotICAgICAgICBjZW50ZXJQb2ludCwKLSAgICAgICAgeyByYWRpdXMsIHJhZGl1
cyB9LAotICAgICAgICBjcm9zcyA8IDAKLSAgICB9OwotICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQg
cGUoZGF0YSk7Ci0gICAgYXBwZW5kKHBlKTsKLX0KLQotdm9pZCBQbGF0Zm9ybVBhdGg6OmNsb3Nl
U3VicGF0aCgpCi17Ci0gICAgUGxhdGZvcm1QYXRoRWxlbWVudCBwZTsKLSAgICBhcHBlbmQocGUp
OwotfQotCi0vLyBhZGQgYSBjaXJjdWxhciBhcmMgY2VudHJlZCBhdCBwIHdpdGggcmFkaXVzIHIg
ZnJvbSBzdGFydCBhbmdsZSBzYXIgKHJhZGlhbnMpIHRvIGVuZCBhbmdsZSBlYXIKLXZvaWQgUGxh
dGZvcm1QYXRoOjphZGRFbGxpcHNlKGNvbnN0IEZsb2F0UG9pbnQmIHAsIGZsb2F0IGEsIGZsb2F0
IGIsIGZsb2F0IHNhciwgZmxvYXQgZWFyLCBib29sIGFudGljbG9ja3dpc2UpCi17Ci0gICAgZmxv
YXQgc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFk7Ci0KLSAgICBub3JtYWxpemVBbmdsZShzYXIp
OwotICAgIG5vcm1hbGl6ZUFuZ2xlKGVhcik7Ci0KLSAgICBnZXRFbGxpcHNlUG9pbnRCeUFuZ2xl
KHNhciwgYSwgYiwgc3RhcnRYLCBzdGFydFkpOwotICAgIGdldEVsbGlwc2VQb2ludEJ5QW5nbGUo
ZWFyLCBhLCBiLCBlbmRYLCBlbmRZKTsKLQotICAgIHRyYW5zZm9ybUFyY1BvaW50KHN0YXJ0WCwg
c3RhcnRZLCBwKTsKLSAgICB0cmFuc2Zvcm1BcmNQb2ludChlbmRYLCBlbmRZLCBwKTsKLQotICAg
IEZsb2F0UG9pbnQgc3RhcnQoc3RhcnRYLCBzdGFydFkpOwotICAgIG1vdmVUbyhzdGFydCk7Ci0K
LSAgICBQbGF0Zm9ybVBhdGhFbGVtZW50OjpBcmNUbyBkYXRhID0geyB7IGVuZFgsIGVuZFkgfSwg
eyBwLngoKSwgcC55KCkgfSwgIHsgYSwgYiB9LCAhYW50aWNsb2Nrd2lzZSB9OwotICAgIFBsYXRm
b3JtUGF0aEVsZW1lbnQgcGUoZGF0YSk7Ci0gICAgYXBwZW5kKHBlKTsKLX0KLQotCi12b2lkIFBs
YXRmb3JtUGF0aDo6YWRkUmVjdChjb25zdCBGbG9hdFJlY3QmIHIpCi17Ci0gICAgbW92ZVRvKHIu
bG9jYXRpb24oKSk7Ci0KLSAgICBmbG9hdCByaWdodCA9IHIucmlnaHQoKSAtIDE7Ci0gICAgZmxv
YXQgYm90dG9tID0gci5ib3R0b20oKSAtIDE7Ci0gICAgYWRkTGluZVRvKEZsb2F0UG9pbnQocmln
aHQsIHIueSgpKSk7Ci0gICAgYWRkTGluZVRvKEZsb2F0UG9pbnQocmlnaHQsIGJvdHRvbSkpOwot
ICAgIGFkZExpbmVUbyhGbG9hdFBvaW50KHIueCgpLCBib3R0b20pKTsKLSAgICBhZGRMaW5lVG8o
ci5sb2NhdGlvbigpKTsKLX0KLQotdm9pZCBQbGF0Zm9ybVBhdGg6OmFkZEVsbGlwc2UoY29uc3Qg
RmxvYXRSZWN0JiByKQotewotICAgIEZsb2F0U2l6ZSByYWRpdXMoci53aWR0aCgpICogMC41LCBy
LmhlaWdodCgpICogMC41KTsKLSAgICBhZGRFbGxpcHNlKHIubG9jYXRpb24oKSArIHJhZGl1cywg
cmFkaXVzLndpZHRoKCksIHJhZGl1cy5oZWlnaHQoKSwgMCwgMCwgdHJ1ZSk7Ci19Ci0KLVN0cmlu
ZyBQbGF0Zm9ybVBhdGg6OmRlYnVnU3RyaW5nKCkgY29uc3QKLXsKLSAgICBTdHJpbmcgcmV0Owot
ICAgIGZvciAoUGxhdGZvcm1QYXRoRWxlbWVudHM6OmNvbnN0X2l0ZXJhdG9yIGkobV9lbGVtZW50
cy5iZWdpbigpKTsgaSAhPSBtX2VsZW1lbnRzLmVuZCgpOyArK2kpIHsKLSAgICAgICAgc3dpdGNo
IChpLT5wbGF0Zm9ybVR5cGUoKSkgewotICAgICAgICBjYXNlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6
OlBhdGhNb3ZlVG86Ci0gICAgICAgIGNhc2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aExpbmVU
bzoKLSAgICAgICAgICAgIHJldCArPSBTdHJpbmc6OmZvcm1hdCgiTSAlZiAlZlxuIiwgaS0+cG9p
bnRBdCgwKS5tX3gsIGktPnBvaW50QXQoMCkubV95KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICBjYXNlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhBcmNUbzoKLSAgICAgICAgICAgIHJl
dCArPSBTdHJpbmc6OmZvcm1hdCgiQSAlZiAlZiAlZiAlZiAlZiAlZiAlY1xuIgotICAgICAgICAg
ICAgICAgICwgaS0+YXJjVG8oKS5tX2VuZC5tX3gsIGktPmFyY1RvKCkubV9lbmQubV95Ci0gICAg
ICAgICAgICAgICAgLCBpLT5hcmNUbygpLm1fY2VudGVyLm1feCwgaS0+YXJjVG8oKS5tX2NlbnRl
ci5tX3kKLSAgICAgICAgICAgICAgICAsIGktPmFyY1RvKCkubV9yYWRpdXMubV94LCBpLT5hcmNU
bygpLm1fcmFkaXVzLm1feQotICAgICAgICAgICAgICAgICwgaS0+YXJjVG8oKS5tX2Nsb2Nrd2lz
ZT8gJ1knIDogJ04nKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBsYXRmb3Jt
UGF0aEVsZW1lbnQ6OlBhdGhRdWFkQ3VydmVUbzoKLSAgICAgICAgICAgIHJldCArPSBTdHJpbmc6
OmZvcm1hdCgiUSAlZiAlZiAlZiAlZlxuIgotICAgICAgICAgICAgICAgICwgaS0+cG9pbnRBdCgw
KS5tX3gsIGktPnBvaW50QXQoMCkubV95Ci0gICAgICAgICAgICAgICAgLCBpLT5wb2ludEF0KDEp
Lm1feCwgaS0+cG9pbnRBdCgxKS5tX3kpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNh
c2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aEJlemllckN1cnZlVG86Ci0gICAgICAgICAgICBy
ZXQgKz0gU3RyaW5nOjpmb3JtYXQoIkIgJWYgJWYgJWYgJWYgJWYgJWZcbiIKLSAgICAgICAgICAg
ICAgICAsIGktPnBvaW50QXQoMCkubV94LCBpLT5wb2ludEF0KDApLm1feQotICAgICAgICAgICAg
ICAgICwgaS0+cG9pbnRBdCgxKS5tX3gsIGktPnBvaW50QXQoMSkubV95Ci0gICAgICAgICAgICAg
ICAgLCBpLT5wb2ludEF0KDIpLm1feCwgaS0+cG9pbnRBdCgyKS5tX3kpOwotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBU1NFUlQoaS0+cGxhdGZvcm1U
eXBlKCkgPT0gUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aENsb3NlU3VicGF0aCk7Ci0gICAgICAg
ICAgICByZXQgKz0gIlNcbiI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0K
LQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgUGxhdGZvcm1QYXRoOjphcHBseSh2b2lkKiBp
bmZvLCBQYXRoQXBwbGllckZ1bmN0aW9uIGZ1bmN0aW9uKSBjb25zdAotewotICAgIFBhdGhFbGVt
ZW50IHBlbGVtZW50OwotICAgIEZsb2F0UG9pbnQgcG9pbnRzWzNdOwotICAgIHBlbGVtZW50LnBv
aW50cyA9IHBvaW50czsKLQotICAgIGZvciAoUGxhdGZvcm1QYXRoRWxlbWVudHM6OmNvbnN0X2l0
ZXJhdG9yIGl0KG1fZWxlbWVudHMuYmVnaW4oKSk7IGl0ICE9IG1fZWxlbWVudHMuZW5kKCk7ICsr
aXQpIHsKLSAgICAgICAgcGVsZW1lbnQudHlwZSA9IGl0LT50eXBlKCk7Ci0gICAgICAgIGludCBu
ID0gaXQtPm51bVBvaW50cygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkK
LSAgICAgICAgICAgIHBvaW50c1tpXSA9IGl0LT5wb2ludEF0KGkpOwotICAgICAgICBmdW5jdGlv
bihpbmZvLCAmcGVsZW1lbnQpOwotICAgIH0KLX0KLQotfSAvLyBuYW1lc3BhY2UgV2ViY29yZQpJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QbGF0Zm9ybVBhdGhXaW5jZS5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGxhdGZvcm1Q
YXRoV2luY2UuaAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbmNlL1BsYXRmb3JtUGF0aFdpbmNlLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsMTgzICswLDAg
QEAKLS8qCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCi0g
KgotICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKLSAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYwotICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5z
ZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
Ci0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg
d2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg
YSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYWxv
bmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwg
d3JpdGUgdG8KLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFu
a2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNB
LgotICovCi0KLSNpZm5kZWYgUGxhdGZvcm1QYXRoV2luY2VfaAotI2RlZmluZSBQbGF0Zm9ybVBh
dGhXaW5jZV9oCi0KLSNpbmNsdWRlICJGbG9hdFBvaW50LmgiCi0jaW5jbHVkZSAiRmxvYXRSZWN0
LmgiCi0jaW5jbHVkZSAiUGF0aC5oIgotI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KLQotbmFtZXNw
YWNlIFdlYkNvcmUgewotCi0gICAgY2xhc3MgR3JhcGhpY3NDb250ZXh0OwotCi0gICAgc3RydWN0
IFBhdGhQb2ludCB7Ci0gICAgICAgIGZsb2F0IG1feDsKLSAgICAgICAgZmxvYXQgbV95OwotICAg
ICAgICBjb25zdCBmbG9hdCYgeCgpIGNvbnN0IHsgcmV0dXJuIG1feDsgfQotICAgICAgICBjb25z
dCBmbG9hdCYgeSgpIGNvbnN0IHsgcmV0dXJuIG1feTsgfQotICAgICAgICB2b2lkIHNldChmbG9h
dCB4LCBmbG9hdCB5KQotICAgICAgICB7Ci0gICAgICAgICAgICBtX3ggPSB4OwotICAgICAgICAg
ICAgbV95ID0geTsKLSAgICAgICAgfTsKLSAgICAgICAgb3BlcmF0b3IgRmxvYXRQb2ludCgpIGNv
bnN0IHsgcmV0dXJuIEZsb2F0UG9pbnQobV94LCBtX3kpOyB9Ci0gICAgICAgIHZvaWQgbW92ZShj
b25zdCBGbG9hdFNpemUmIG9mZnNldCkKLSAgICAgICAgewotICAgICAgICAgICAgbV94ICs9IG9m
ZnNldC53aWR0aCgpOwotICAgICAgICAgICAgbV95ICs9IG9mZnNldC5oZWlnaHQoKTsKLSAgICAg
ICAgfQotICAgICAgICBQYXRoUG9pbnQmIG9wZXJhdG9yPShjb25zdCBGbG9hdFBvaW50JiBwKQot
ICAgICAgICB7Ci0gICAgICAgICAgICBtX3ggPSBwLngoKTsKLSAgICAgICAgICAgIG1feSA9IHAu
eSgpOwotICAgICAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgICB9Ci0gICAgICAgIHZvaWQg
Y2xlYXIoKSB7IG1feCA9IG1feSA9IDA7IH0KLSAgICB9OwotCi0gICAgc3RydWN0IFBhdGhQb2x5
Z29uOiBwdWJsaWMgVmVjdG9yPFBhdGhQb2ludD4gewotICAgICAgICB2b2lkIG1vdmUoY29uc3Qg
RmxvYXRTaXplJiBvZmZzZXQpOwotICAgICAgICB2b2lkIHRyYW5zZm9ybShjb25zdCBBZmZpbmVU
cmFuc2Zvcm0mIHQpOwotICAgICAgICBib29sIGNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBv
aW50KSBjb25zdDsKLSAgICB9OwotCi0gICAgY2xhc3MgUGxhdGZvcm1QYXRoRWxlbWVudCB7Ci0g
ICAgcHVibGljOgotICAgICAgICBlbnVtIFBsYWZvcm1QYXRoRWxlbWVudFR5cGUgewotICAgICAg
ICAgICAgUGF0aE1vdmVUbywKLSAgICAgICAgICAgIFBhdGhMaW5lVG8sCi0gICAgICAgICAgICBQ
YXRoQXJjVG8sCi0gICAgICAgICAgICBQYXRoUXVhZEN1cnZlVG8sCi0gICAgICAgICAgICBQYXRo
QmV6aWVyQ3VydmVUbywKLSAgICAgICAgICAgIFBhdGhDbG9zZVN1YnBhdGgsCi0gICAgICAgIH07
Ci0KLSAgICAgICAgc3RydWN0IE1vdmVUbyB7Ci0gICAgICAgICAgICBQYXRoUG9pbnQgbV9lbmQ7
Ci0gICAgICAgIH07Ci0KLSAgICAgICAgc3RydWN0IExpbmVUbyB7Ci0gICAgICAgICAgICBQYXRo
UG9pbnQgbV9lbmQ7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgc3RydWN0IEFyY1RvIHsKLSAgICAg
ICAgICAgIFBhdGhQb2ludCBtX2VuZDsKLSAgICAgICAgICAgIFBhdGhQb2ludCBtX2NlbnRlcjsK
LSAgICAgICAgICAgIFBhdGhQb2ludCBtX3JhZGl1czsKLSAgICAgICAgICAgIGJvb2wgbV9jbG9j
a3dpc2U7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgc3RydWN0IFF1YWRDdXJ2ZVRvIHsKLSAgICAg
ICAgICAgIFBhdGhQb2ludCBtX3BvaW50MDsKLSAgICAgICAgICAgIFBhdGhQb2ludCBtX3BvaW50
MTsKLSAgICAgICAgfTsKLQotICAgICAgICBzdHJ1Y3QgQmV6aWVyQ3VydmVUbyB7Ci0gICAgICAg
ICAgICBQYXRoUG9pbnQgbV9wb2ludDA7Ci0gICAgICAgICAgICBQYXRoUG9pbnQgbV9wb2ludDE7
Ci0gICAgICAgICAgICBQYXRoUG9pbnQgbV9wb2ludDI7Ci0gICAgICAgIH07Ci0KLSAgICAgICAg
UGxhdGZvcm1QYXRoRWxlbWVudCgpOiBtX3R5cGUoUGF0aENsb3NlU3VicGF0aCkgeyBtX2RhdGEu
bV9wb2ludHNbMF0uc2V0KDAsIDApOyAgICB9Ci0gICAgICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQo
Y29uc3QgTW92ZVRvJiBkYXRhKTogbV90eXBlKFBhdGhNb3ZlVG8pIHsgbV9kYXRhLm1fbW92ZVRv
RGF0YSA9IGRhdGE7IH0KLSAgICAgICAgUGxhdGZvcm1QYXRoRWxlbWVudChjb25zdCBMaW5lVG8m
IGRhdGEpOiBtX3R5cGUoUGF0aExpbmVUbykgeyBtX2RhdGEubV9saW5lVG9EYXRhID0gZGF0YTsg
fQotICAgICAgICBQbGF0Zm9ybVBhdGhFbGVtZW50KGNvbnN0IEFyY1RvJiBkYXRhKTogbV90eXBl
KFBhdGhBcmNUbykgeyBtX2RhdGEubV9hcmNUb0RhdGEgPSBkYXRhOyB9Ci0gICAgICAgIFBsYXRm
b3JtUGF0aEVsZW1lbnQoY29uc3QgUXVhZEN1cnZlVG8mIGRhdGEpOiBtX3R5cGUoUGF0aFF1YWRD
dXJ2ZVRvKSB7IG1fZGF0YS5tX3F1YWRDdXJ2ZVRvRGF0YSA9IGRhdGE7IH0KLSAgICAgICAgUGxh
dGZvcm1QYXRoRWxlbWVudChjb25zdCBCZXppZXJDdXJ2ZVRvJiBkYXRhKTogbV90eXBlKFBhdGhC
ZXppZXJDdXJ2ZVRvKSB7IG1fZGF0YS5tX2JlemllckN1cnZlVG9EYXRhID0gZGF0YTsgfQotCi0g
ICAgICAgIGNvbnN0IE1vdmVUbyYgbW92ZVRvKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLm1fbW92
ZVRvRGF0YTsgfQotICAgICAgICBjb25zdCBMaW5lVG8mIGxpbmVUbygpIGNvbnN0IHsgcmV0dXJu
IG1fZGF0YS5tX2xpbmVUb0RhdGE7IH0KLSAgICAgICAgY29uc3QgQXJjVG8mIGFyY1RvKCkgY29u
c3QgeyByZXR1cm4gbV9kYXRhLm1fYXJjVG9EYXRhOyB9Ci0gICAgICAgIGNvbnN0IFF1YWRDdXJ2
ZVRvJiBxdWFkQ3VydmVUbygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5tX3F1YWRDdXJ2ZVRvRGF0
YTsgfQotICAgICAgICBjb25zdCBCZXppZXJDdXJ2ZVRvJiBiZXppZXJDdXJ2ZVRvKCkgY29uc3Qg
eyByZXR1cm4gbV9kYXRhLm1fYmV6aWVyQ3VydmVUb0RhdGE7IH0KLSAgICAgICAgY29uc3QgUGF0
aFBvaW50JiBsYXN0UG9pbnQoKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbiA9
IG51bVBvaW50cygpOwotICAgICAgICAgICAgcmV0dXJuIG4gPiAxID8gbV9kYXRhLm1fcG9pbnRz
W24gLSAxXSA6IG1fZGF0YS5tX3BvaW50c1swXTsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBQ
YXRoUG9pbnQmIHBvaW50QXQoaW50IGluZGV4KSBjb25zdCB7IHJldHVybiBtX2RhdGEubV9wb2lu
dHNbaW5kZXhdOyB9Ci0gICAgICAgIGludCBudW1Qb2ludHMoKSBjb25zdDsKLSAgICAgICAgaW50
IG51bUNvbnRyb2xQb2ludHMoKSBjb25zdDsKLSAgICAgICAgdm9pZCBtb3ZlKGNvbnN0IEZsb2F0
U2l6ZSYgb2Zmc2V0KTsKLSAgICAgICAgdm9pZCB0cmFuc2Zvcm0oY29uc3QgQWZmaW5lVHJhbnNm
b3JtJiB0KTsKLSAgICAgICAgUGF0aEVsZW1lbnRUeXBlIHR5cGUoKSBjb25zdDsKLSAgICAgICAg
UGxhZm9ybVBhdGhFbGVtZW50VHlwZSBwbGF0Zm9ybVR5cGUoKSBjb25zdCB7IHJldHVybiBtX3R5
cGU7IH0KLSAgICAgICAgdm9pZCBpbmZsYXRlUmVjdFRvQ29udGFpbk1lKEZsb2F0UmVjdCYgciwg
Y29uc3QgRmxvYXRQb2ludCYgbGFzdFBvaW50KSBjb25zdDsKLQotICAgIHByaXZhdGU6Ci0gICAg
ICAgIFBsYWZvcm1QYXRoRWxlbWVudFR5cGUgbV90eXBlOwotICAgICAgICB1bmlvbiB7Ci0gICAg
ICAgICAgICBNb3ZlVG8gbV9tb3ZlVG9EYXRhOwotICAgICAgICAgICAgTGluZVRvIG1fbGluZVRv
RGF0YTsKLSAgICAgICAgICAgIEFyY1RvIG1fYXJjVG9EYXRhOwotICAgICAgICAgICAgUXVhZEN1
cnZlVG8gbV9xdWFkQ3VydmVUb0RhdGE7Ci0gICAgICAgICAgICBCZXppZXJDdXJ2ZVRvIG1fYmV6
aWVyQ3VydmVUb0RhdGE7Ci0gICAgICAgICAgICBQYXRoUG9pbnQgbV9wb2ludHNbNF07Ci0gICAg
ICAgIH0gbV9kYXRhOwotICAgIH07Ci0KLSAgICB0eXBlZGVmIFZlY3RvcjxQbGF0Zm9ybVBhdGhF
bGVtZW50PiBQbGF0Zm9ybVBhdGhFbGVtZW50czsKLQotICAgIGNsYXNzIFBsYXRmb3JtUGF0aCB7
Ci0gICAgcHVibGljOgotICAgICAgICBQbGF0Zm9ybVBhdGgoKTsKLSAgICAgICAgY29uc3QgUGxh
dGZvcm1QYXRoRWxlbWVudHMmIGVsZW1lbnRzKCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50czsg
fQotICAgICAgICB2b2lkIGFwcGVuZChjb25zdCBQbGF0Zm9ybVBhdGhFbGVtZW50JiBlKTsKLSAg
ICAgICAgdm9pZCBhcHBlbmQoY29uc3QgUGxhdGZvcm1QYXRoJiBwKTsKLSAgICAgICAgdm9pZCBj
bGVhcigpOwotICAgICAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnRz
LmlzRW1wdHkoKTsgfQotCi0gICAgICAgIHZvaWQgc3Ryb2tlUGF0aChIREMsIGNvbnN0IEFmZmlu
ZVRyYW5zZm9ybSogdHIpIGNvbnN0OwotICAgICAgICB2b2lkIGZpbGxQYXRoKEhEQywgY29uc3Qg
QWZmaW5lVHJhbnNmb3JtKiB0cikgY29uc3Q7Ci0gICAgICAgIEZsb2F0UG9pbnQgbGFzdFBvaW50
KCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50cy5pc0VtcHR5KCkgPyBGbG9hdFBvaW50KDAsIDAp
IDogbV9lbGVtZW50cy5sYXN0KCkubGFzdFBvaW50KCk7IH0KLQotICAgICAgICBjb25zdCBGbG9h
dFJlY3QmIGJvdW5kaW5nUmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fYm91bmRpbmdSZWN0OyB9Ci0g
ICAgICAgIGJvb2wgY29udGFpbnMoY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIFdpbmRSdWxlIHJ1
bGUpIGNvbnN0OwotICAgICAgICB2b2lkIHRyYW5zbGF0ZShjb25zdCBGbG9hdFNpemUmIHNpemUp
OwotICAgICAgICB2b2lkIHRyYW5zZm9ybShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHQpOwotCi0g
ICAgICAgIHZvaWQgbW92ZVRvKGNvbnN0IEZsb2F0UG9pbnQmKTsKLSAgICAgICAgdm9pZCBhZGRM
aW5lVG8oY29uc3QgRmxvYXRQb2ludCYpOwotICAgICAgICB2b2lkIGFkZFF1YWRDdXJ2ZVRvKGNv
bnN0IEZsb2F0UG9pbnQmIGNvbnRyb2xQb2ludCwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpOwot
ICAgICAgICB2b2lkIGFkZEJlemllckN1cnZlVG8oY29uc3QgRmxvYXRQb2ludCYgY29udHJvbFBv
aW50MSwgY29uc3QgRmxvYXRQb2ludCYgY29udHJvbFBvaW50MiwgY29uc3QgRmxvYXRQb2ludCYp
OwotICAgICAgICB2b2lkIGFkZEFyY1RvKGNvbnN0IEZsb2F0UG9pbnQmLCBjb25zdCBGbG9hdFBv
aW50JiwgZmxvYXQgcmFkaXVzKTsKLSAgICAgICAgdm9pZCBjbG9zZVN1YnBhdGgoKTsKLSAgICAg
ICAgdm9pZCBhZGRFbGxpcHNlKGNvbnN0IEZsb2F0UG9pbnQmIHAsIGZsb2F0IGEsIGZsb2F0IGIs
IGZsb2F0IHNhciwgZmxvYXQgZWFyLCBib29sIGFudGljbG9ja3dpc2UpOwotICAgICAgICB2b2lk
IGFkZFJlY3QoY29uc3QgRmxvYXRSZWN0JiByKTsKLSAgICAgICAgdm9pZCBhZGRFbGxpcHNlKGNv
bnN0IEZsb2F0UmVjdCYgcik7Ci0gICAgICAgIFN0cmluZyBkZWJ1Z1N0cmluZygpIGNvbnN0Owot
ICAgICAgICB2b2lkIGFwcGx5KHZvaWQqIGluZm8sIFBhdGhBcHBsaWVyRnVuY3Rpb24gZnVuY3Rp
b24pIGNvbnN0OwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgdm9pZCBlbnN1cmVTdWJwYXRoKCk7
Ci0gICAgICAgIHZvaWQgYWRkVG9TdWJwYXRoKGNvbnN0IFBsYXRmb3JtUGF0aEVsZW1lbnQmIGUp
OwotCi0gICAgICAgIFBsYXRmb3JtUGF0aEVsZW1lbnRzIG1fZWxlbWVudHM7Ci0gICAgICAgIEZs
b2F0UmVjdCBtX2JvdW5kaW5nUmVjdDsKLSAgICAgICAgVmVjdG9yPFBhdGhQb2x5Z29uPiBtX3N1
YnBhdGhzOwotICAgICAgICBQYXRoUG9pbnQgbV9jdXJyZW50UG9pbnQ7Ci0gICAgICAgIGJvb2wg
bV9wZW5MaWZ0ZWQ7Ci0gICAgfTsKLQotfQotCi0jZW5kaWYgLy8gUGxhdGZvcm1QYXRoV2luY2Vf
aApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaW1wbGVGb250RGF0YVdp
bkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1Np
bXBsZUZvbnREYXRhV2luQ0UuY3BwCShyZXZpc2lvbiA1NzI4OSkJKGZyb20gV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9TaW1wbGVGb250RGF0YVdpbmNlLmNwcDo1NzI4OSkKKysrIFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2ltcGxlRm9udERhdGFXaW5DRS5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYs
IDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykg
MjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKiAyLiAg
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAzLiAg
TmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRo
ZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUg
d2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElT
IiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIlNpbXBsZUZvbnREYXRhLmgiCisKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNs
dWRlICJGb250LmgiCisjaW5jbHVkZSAiRm9udENhY2hlLmgiCisjaW5jbHVkZSAiRm9udERlc2Ny
aXB0aW9uLmgiCisjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KKyNpbmNsdWRlIDxtbGFuZy5o
PgorI2luY2x1ZGUgPHRjaGFyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworZXh0ZXJuIEhE
QyBnX3NjcmVlbkRDOworCit2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUluaXQoKQorewor
ICAgIGlmICghbV9wbGF0Zm9ybURhdGEuaXNWYWxpZCgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBjb25zdCBURVhUTUVUUklDJiB0bSA9IG1fcGxhdGZvcm1EYXRhLm1ldHJpY3MoKTsKKyAgICBt
X2lzU3lzdGVtRm9udCA9IG1fcGxhdGZvcm1EYXRhLmlzU3lzdGVtRm9udCgpOworCisgICAgbV9h
c2NlbnQgPSAodG0udG1Bc2NlbnQgKiBtX3BsYXRmb3JtRGF0YS5zaXplKCkgKyAzNikgLyA3MjsK
KyAgICBtX2Rlc2NlbnQgPSAodG0udG1EZXNjZW50ICogbV9wbGF0Zm9ybURhdGEuc2l6ZSgpICsg
MzYpIC8gNzI7CisgICAgbV9saW5lR2FwID0gKHRtLnRtRXh0ZXJuYWxMZWFkaW5nICogbV9wbGF0
Zm9ybURhdGEuc2l6ZSgpICsgMzYpIC8gNzI7CisgICAgbV9saW5lU3BhY2luZyA9IG1fYXNjZW50
ICsgbV9kZXNjZW50ICsgbV9saW5lR2FwOworICAgIG1feEhlaWdodCA9IG1fYXNjZW50ICogMC41
NmY7Cit9CisKK3ZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtRGVzdHJveSgpCit7CisgICAg
ZGVsZXRlIG1fc21hbGxDYXBzRm9udERhdGE7CisgICAgbV9zbWFsbENhcHNGb250RGF0YSA9IDA7
Cit9CisKK1NpbXBsZUZvbnREYXRhKiBTaW1wbGVGb250RGF0YTo6c21hbGxDYXBzRm9udERhdGEo
Y29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIGNvbnN0Cit7CisgICAgaWYg
KCFtX3NtYWxsQ2Fwc0ZvbnREYXRhKSB7CisgICAgICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVz
Yyhmb250RGVzY3JpcHRpb24pOworICAgICAgICBmb250RGVzYy5zZXRDb21wdXRlZFNpemUobHJv
dW5kZigwLjcwZiAqIGZvbnREZXNjLmNvbXB1dGVkU2l6ZSgpKSk7CisgICAgICAgIGZvbnREZXNj
LnNldFNwZWNpZmllZFNpemUobHJvdW5kZigwLjcwZiAqIGZvbnREZXNjLnNwZWNpZmllZFNpemUo
KSkpOworICAgICAgICBmb250RGVzYy5zZXRLZXl3b3JkU2l6ZShscm91bmRmKDAuNzBmICogZm9u
dERlc2Mua2V5d29yZFNpemUoKSkpOworICAgICAgICBGb250UGxhdGZvcm1EYXRhKiByZXN1bHQg
PSBmb250Q2FjaGUoKS0+Z2V0Q2FjaGVkRm9udFBsYXRmb3JtRGF0YShmb250RGVzYywgbV9wbGF0
Zm9ybURhdGEuZmFtaWx5KCkpOworICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAgICAgbV9z
bWFsbENhcHNGb250RGF0YSA9IG5ldyBTaW1wbGVGb250RGF0YSgqcmVzdWx0KTsKKyAgICB9Cisg
ICAgcmV0dXJuIG1fc21hbGxDYXBzRm9udERhdGE7Cit9CisKK0RXT1JEIGdldEtub3duRm9udENv
ZGVQYWdlcyhjb25zdCB3Y2hhcl90KiBmYW1pbHkpOworCitib29sIFNpbXBsZUZvbnREYXRhOjpj
b250YWluc0NoYXJhY3RlcnMoY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIGludCBsZW5ndGgpIGNv
bnN0Cit7CisgICAgaWYgKG1fcGxhdGZvcm1EYXRhLmlzRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0
dXJuIHRydWU7CisKKyAgICAvLyBGSVhNRTogTWljcm9zb2Z0IGRvY3VtZW50YXRpb24gc2VlbXMg
dG8gaW1wbHkgdGhhdCBjaGFyYWN0ZXJzIGNhbiBiZSBvdXRwdXQgdXNpbmcgYSBnaXZlbiBmb250
IGFuZCBEQworICAgIC8vIG1lcmVseSBieSB0ZXN0aW5nIGNvZGUgcGFnZSBpbnRlcnNlY3Rpb24u
ICBUaGlzIHNlZW1zIHN1c3BlY3QgdGhvdWdoLiAgQ2FuJ3QgYSBmb250IG9ubHkgcGFydGlhbGx5
CisgICAgLy8gY292ZXIgYSBnaXZlbiBjb2RlIHBhZ2U/CisKKyAgICAvLyBGSVhNRTogaW4gdGhl
IGNhc2UgdGhhdCB3ZSBmYWlsZWQgdG8gZ2V0IHRoZSBpbnRlcmZhY2UsIHN0aWxsIHVzZSB0aGUg
Zm9udC4KKyNpZiBkZWZpbmVkKElNTEFOR19GT05UX0xJTkspICYmIChJTUxBTkdfRk9OVF9MSU5L
ID09IDIpCisgICAgSU1MYW5nRm9udExpbmsyKiBsYW5nRm9udExpbmsgPSBmb250Q2FjaGUoKS0+
Z2V0Rm9udExpbmtJbnRlcmZhY2UoKTsKKyNlbHNlCisgICAgSU1MYW5nRm9udExpbmsqIGxhbmdG
b250TGluayA9IGZvbnRDYWNoZSgpLT5nZXRGb250TGlua0ludGVyZmFjZSgpOworI2VuZGlmCisg
ICAgaWYgKCFsYW5nRm9udExpbmspCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgRFdPUkQg
Zm9udENvZGVQYWdlcyA9IG1fcGxhdGZvcm1EYXRhLmNvZGVQYWdlcygpOworICAgIGlmICghZm9u
dENvZGVQYWdlcykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgRFdPUkQgYWNwQ29kZVBh
Z2VzID0gMDsKKyAgICBsYW5nRm9udExpbmstPkNvZGVQYWdlVG9Db2RlUGFnZXMoQ1BfQUNQLCAm
YWNwQ29kZVBhZ2VzKTsKKworICAgIERXT1JEIGFjdHVhbENvZGVQYWdlczsKKyAgICBsb25nIG51
bUNoYXJhY3RlcnNQcm9jZXNzZWQ7CisgICAgd2hpbGUgKGxlbmd0aCkgeworICAgICAgICBsYW5n
Rm9udExpbmstPkdldFN0ckNvZGVQYWdlcyhjaGFyYWN0ZXJzLCBsZW5ndGgsIGFjcENvZGVQYWdl
cywgJmFjdHVhbENvZGVQYWdlcywgJm51bUNoYXJhY3RlcnNQcm9jZXNzZWQpOworICAgICAgICBp
ZiAoYWN0dWFsQ29kZVBhZ2VzICYmICEoYWN0dWFsQ29kZVBhZ2VzICYgZm9udENvZGVQYWdlcykp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgbGVuZ3RoIC09IG51bUNoYXJh
Y3RlcnNQcm9jZXNzZWQ7CisgICAgICAgIGNoYXJhY3RlcnMgKz0gbnVtQ2hhcmFjdGVyc1Byb2Nl
c3NlZDsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTaW1wbGVGb250RGF0
YTo6ZGV0ZXJtaW5lUGl0Y2goKQoreworICAgIGlmICghbV9wbGF0Zm9ybURhdGEuaXNWYWxpZCgp
KQorICAgICAgICByZXR1cm47CisKKyAgICBjb25zdCBURVhUTUVUUklDJiB0bSA9IG1fcGxhdGZv
cm1EYXRhLm1ldHJpY3MoKTsKKworICAgIC8vIFllcywgdGhpcyBsb29rcyBiYWNrd2FyZHMsIGJ1
dCB0aGUgZml4ZWQgcGl0Y2ggYml0IGlzIGFjdHVhbGx5IHNldCBpZiB0aGUgZm9udAorICAgIC8v
IGlzICpub3QqIGZpeGVkIHBpdGNoLiAgVW5iZWxpZXZhYmxlIGJ1dCB0cnVlLgorICAgIG1fdHJl
YXRBc0ZpeGVkUGl0Y2ggPSAhKHRtLnRtUGl0Y2hBbmRGYW1pbHkgJiBUTVBGX0ZJWEVEX1BJVENI
KTsKK30KKworZmxvYXQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtV2lkdGhGb3JHbHlwaChHbHlw
aCBnbHlwaCkgY29uc3QKK3sKKyAgICBpZiAobV9wbGF0Zm9ybURhdGEuaXNEaXNhYmxlZCgpKQor
ICAgICAgICByZXR1cm4gMDsKKworICAgIEhHRElPQkogaE9sZEZvbnQgPSBTZWxlY3RPYmplY3Qo
Z19zY3JlZW5EQywgbV9wbGF0Zm9ybURhdGEuaGZvbnQoKSk7CisKKyAgICBTSVpFIGZvbnRTaXpl
OworICAgIHdjaGFyX3QgYyA9IGdseXBoOworICAgIEdldFRleHRFeHRlbnRQb2ludDMyKGdfc2Ny
ZWVuREMsICZjLCAxLCAmZm9udFNpemUpOworCisgICAgU2VsZWN0T2JqZWN0KGdfc2NyZWVuREMs
IGhPbGRGb250KTsKKworICAgIHJldHVybiAoZmxvYXQpZm9udFNpemUuY3ggKiAoZmxvYXQpbV9w
bGF0Zm9ybURhdGEuc2l6ZSgpIC8gNzIuZjsKK30KKworCit2b2lkIFNpbXBsZUZvbnREYXRhOjpw
bGF0Zm9ybUNoYXJXaWR0aEluaXQoKQoreworICAgIGlmICghbV9wbGF0Zm9ybURhdGEuaXNWYWxp
ZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjb25zdCBURVhUTUVUUklDJiB0bSA9IG1fcGxh
dGZvcm1EYXRhLm1ldHJpY3MoKTsKKyAgICBtX2F2Z0NoYXJXaWR0aCA9ICh0bS50bUF2ZUNoYXJX
aWR0aCAqIG1fcGxhdGZvcm1EYXRhLnNpemUoKSArIDM2KSAvIDcyOworICAgIG1fbWF4Q2hhcldp
ZHRoID0gKHRtLnRtTWF4Q2hhcldpZHRoICogbV9wbGF0Zm9ybURhdGEuc2l6ZSgpICsgMzYpIC8g
NzI7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2ltcGxl
Rm9udERhdGFXaW5DRS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW5jZS9TaW1wbGVGb250RGF0YVdpbkNFLmNwcAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NpbXBsZUZvbnREYXRhV2luQ0UuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xNTgsNCArMTU4LDQgQEAgdm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZv
cm1DaGFyV2lkdGhJbgogICAgIG1fbWF4Q2hhcldpZHRoID0gKHRtLnRtTWF4Q2hhcldpZHRoICog
bV9wbGF0Zm9ybURhdGEuc2l6ZSgpICsgMzYpIC8gNzI7CiB9CiAKLX0KK30gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2ltcGxlRm9u
dERhdGFXaW5jZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW5jZS9TaW1wbGVGb250RGF0YVdpbmNlLmNwcAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NpbXBsZUZvbnREYXRhV2luY2UuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0xLDE2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3
IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDct
MjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwot
ICogYXJlIG1ldDoKLSAqCi0gKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICogMi4gIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0Ci0gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAotICogMy4gIE5laXRo
ZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFt
ZXMgb2YKLSAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3Ig
cHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhv
dXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKLSAqCi0gKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5E
IEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAq
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRl
ICJTaW1wbGVGb250RGF0YS5oIgotCi0jaW5jbHVkZSAiRmxvYXRSZWN0LmgiCi0jaW5jbHVkZSAi
Rm9udC5oIgotI2luY2x1ZGUgIkZvbnRDYWNoZS5oIgotI2luY2x1ZGUgIkZvbnREZXNjcmlwdGlv
bi5oIgotI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+Ci0jaW5jbHVkZSA8bWxhbmcuaD4KLSNp
bmNsdWRlIDx0Y2hhci5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLWV4dGVybiBIREMgZ19z
Y3JlZW5EQzsKLQotdm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKLXsKLSAgICBp
ZiAoIW1fcGxhdGZvcm1EYXRhLmlzVmFsaWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY29u
c3QgVEVYVE1FVFJJQyYgdG0gPSBtX3BsYXRmb3JtRGF0YS5tZXRyaWNzKCk7Ci0gICAgbV9pc1N5
c3RlbUZvbnQgPSBtX3BsYXRmb3JtRGF0YS5pc1N5c3RlbUZvbnQoKTsKLQotICAgIG1fYXNjZW50
ID0gKHRtLnRtQXNjZW50ICogbV9wbGF0Zm9ybURhdGEuc2l6ZSgpICsgMzYpIC8gNzI7Ci0gICAg
bV9kZXNjZW50ID0gKHRtLnRtRGVzY2VudCAqIG1fcGxhdGZvcm1EYXRhLnNpemUoKSArIDM2KSAv
IDcyOwotICAgIG1fbGluZUdhcCA9ICh0bS50bUV4dGVybmFsTGVhZGluZyAqIG1fcGxhdGZvcm1E
YXRhLnNpemUoKSArIDM2KSAvIDcyOwotICAgIG1fbGluZVNwYWNpbmcgPSBtX2FzY2VudCArIG1f
ZGVzY2VudCArIG1fbGluZUdhcDsKLSAgICBtX3hIZWlnaHQgPSBtX2FzY2VudCAqIDAuNTZmOwot
fQotCi12b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3koKQotewotICAgIGRlbGV0
ZSBtX3NtYWxsQ2Fwc0ZvbnREYXRhOwotICAgIG1fc21hbGxDYXBzRm9udERhdGEgPSAwOwotfQot
Ci1TaW1wbGVGb250RGF0YSogU2ltcGxlRm9udERhdGE6OnNtYWxsQ2Fwc0ZvbnREYXRhKGNvbnN0
IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uKSBjb25zdAotewotICAgIGlmICghbV9z
bWFsbENhcHNGb250RGF0YSkgewotICAgICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2MoZm9u
dERlc2NyaXB0aW9uKTsKLSAgICAgICAgZm9udERlc2Muc2V0Q29tcHV0ZWRTaXplKGxyb3VuZGYo
MC43MGYgKiBmb250RGVzYy5jb21wdXRlZFNpemUoKSkpOwotICAgICAgICBmb250RGVzYy5zZXRT
cGVjaWZpZWRTaXplKGxyb3VuZGYoMC43MGYgKiBmb250RGVzYy5zcGVjaWZpZWRTaXplKCkpKTsK
LSAgICAgICAgZm9udERlc2Muc2V0S2V5d29yZFNpemUobHJvdW5kZigwLjcwZiAqIGZvbnREZXNj
LmtleXdvcmRTaXplKCkpKTsKLSAgICAgICAgRm9udFBsYXRmb3JtRGF0YSogcmVzdWx0ID0gZm9u
dENhY2hlKCktPmdldENhY2hlZEZvbnRQbGF0Zm9ybURhdGEoZm9udERlc2MsIG1fcGxhdGZvcm1E
YXRhLmZhbWlseSgpKTsKLSAgICAgICAgaWYgKHJlc3VsdCkKLSAgICAgICAgICAgIG1fc21hbGxD
YXBzRm9udERhdGEgPSBuZXcgU2ltcGxlRm9udERhdGEoKnJlc3VsdCk7Ci0gICAgfQotICAgIHJl
dHVybiBtX3NtYWxsQ2Fwc0ZvbnREYXRhOwotfQotCi1EV09SRCBnZXRLbm93bkZvbnRDb2RlUGFn
ZXMoY29uc3Qgd2NoYXJfdCogZmFtaWx5KTsKLQotYm9vbCBTaW1wbGVGb250RGF0YTo6Y29udGFp
bnNDaGFyYWN0ZXJzKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3RoKSBjb25zdAot
ewotICAgIGlmIChtX3BsYXRmb3JtRGF0YS5pc0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybiB0
cnVlOwotCi0gICAgLy8gRklYTUU6IE1pY3Jvc29mdCBkb2N1bWVudGF0aW9uIHNlZW1zIHRvIGlt
cGx5IHRoYXQgY2hhcmFjdGVycyBjYW4gYmUgb3V0cHV0IHVzaW5nIGEgZ2l2ZW4gZm9udCBhbmQg
REMKLSAgICAvLyBtZXJlbHkgYnkgdGVzdGluZyBjb2RlIHBhZ2UgaW50ZXJzZWN0aW9uLiAgVGhp
cyBzZWVtcyBzdXNwZWN0IHRob3VnaC4gIENhbid0IGEgZm9udCBvbmx5IHBhcnRpYWxseQotICAg
IC8vIGNvdmVyIGEgZ2l2ZW4gY29kZSBwYWdlPwotCi0gICAgLy8gRklYTUU6IGluIHRoZSBjYXNl
IHRoYXQgd2UgZmFpbGVkIHRvIGdldCB0aGUgaW50ZXJmYWNlLCBzdGlsbCB1c2UgdGhlIGZvbnQu
Ci0jaWYgZGVmaW5lZChJTUxBTkdfRk9OVF9MSU5LKSAmJiAoSU1MQU5HX0ZPTlRfTElOSyA9PSAy
KQotICAgIElNTGFuZ0ZvbnRMaW5rMiogbGFuZ0ZvbnRMaW5rID0gZm9udENhY2hlKCktPmdldEZv
bnRMaW5rSW50ZXJmYWNlKCk7Ci0jZWxzZQotICAgIElNTGFuZ0ZvbnRMaW5rKiBsYW5nRm9udExp
bmsgPSBmb250Q2FjaGUoKS0+Z2V0Rm9udExpbmtJbnRlcmZhY2UoKTsKLSNlbmRpZgotICAgIGlm
ICghbGFuZ0ZvbnRMaW5rKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIERXT1JEIGZvbnRD
b2RlUGFnZXMgPSBtX3BsYXRmb3JtRGF0YS5jb2RlUGFnZXMoKTsKLSAgICBpZiAoIWZvbnRDb2Rl
UGFnZXMpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIERXT1JEIGFjcENvZGVQYWdlcyA9
IDA7Ci0gICAgbGFuZ0ZvbnRMaW5rLT5Db2RlUGFnZVRvQ29kZVBhZ2VzKENQX0FDUCwgJmFjcENv
ZGVQYWdlcyk7Ci0KLSAgICBEV09SRCBhY3R1YWxDb2RlUGFnZXM7Ci0gICAgbG9uZyBudW1DaGFy
YWN0ZXJzUHJvY2Vzc2VkOwotICAgIHdoaWxlIChsZW5ndGgpIHsKLSAgICAgICAgbGFuZ0ZvbnRM
aW5rLT5HZXRTdHJDb2RlUGFnZXMoY2hhcmFjdGVycywgbGVuZ3RoLCBhY3BDb2RlUGFnZXMsICZh
Y3R1YWxDb2RlUGFnZXMsICZudW1DaGFyYWN0ZXJzUHJvY2Vzc2VkKTsKLSAgICAgICAgaWYgKGFj
dHVhbENvZGVQYWdlcyAmJiAhKGFjdHVhbENvZGVQYWdlcyAmIGZvbnRDb2RlUGFnZXMpKQotICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGxlbmd0aCAtPSBudW1DaGFyYWN0ZXJz
UHJvY2Vzc2VkOwotICAgICAgICBjaGFyYWN0ZXJzICs9IG51bUNoYXJhY3RlcnNQcm9jZXNzZWQ7
Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU2ltcGxlRm9udERhdGE6OmRl
dGVybWluZVBpdGNoKCkKLXsKLSAgICBpZiAoIW1fcGxhdGZvcm1EYXRhLmlzVmFsaWQoKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgY29uc3QgVEVYVE1FVFJJQyYgdG0gPSBtX3BsYXRmb3JtRGF0
YS5tZXRyaWNzKCk7Ci0KLSAgICAvLyBZZXMsIHRoaXMgbG9va3MgYmFja3dhcmRzLCBidXQgdGhl
IGZpeGVkIHBpdGNoIGJpdCBpcyBhY3R1YWxseSBzZXQgaWYgdGhlIGZvbnQKLSAgICAvLyBpcyAq
bm90KiBmaXhlZCBwaXRjaC4gIFVuYmVsaWV2YWJsZSBidXQgdHJ1ZS4KLSAgICBtX3RyZWF0QXNG
aXhlZFBpdGNoID0gISh0bS50bVBpdGNoQW5kRmFtaWx5ICYgVE1QRl9GSVhFRF9QSVRDSCk7Ci19
Ci0KLWZsb2F0IFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybVdpZHRoRm9yR2x5cGgoR2x5cGggZ2x5
cGgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcGxhdGZvcm1EYXRhLmlzRGlzYWJsZWQoKSkKLSAgICAg
ICAgcmV0dXJuIDA7Ci0KLSAgICBIR0RJT0JKIGhPbGRGb250ID0gU2VsZWN0T2JqZWN0KGdfc2Ny
ZWVuREMsIG1fcGxhdGZvcm1EYXRhLmhmb250KCkpOwotCi0gICAgU0laRSBmb250U2l6ZTsKLSAg
ICB3Y2hhcl90IGMgPSBnbHlwaDsKLSAgICBHZXRUZXh0RXh0ZW50UG9pbnQzMihnX3NjcmVlbkRD
LCAmYywgMSwgJmZvbnRTaXplKTsKLQotICAgIFNlbGVjdE9iamVjdChnX3NjcmVlbkRDLCBoT2xk
Rm9udCk7Ci0KLSAgICByZXR1cm4gKGZsb2F0KWZvbnRTaXplLmN4ICogKGZsb2F0KW1fcGxhdGZv
cm1EYXRhLnNpemUoKSAvIDcyLmY7Ci19Ci0KLQotdm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZv
cm1DaGFyV2lkdGhJbml0KCkKLXsKLSAgICBpZiAoIW1fcGxhdGZvcm1EYXRhLmlzVmFsaWQoKSkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgY29uc3QgVEVYVE1FVFJJQyYgdG0gPSBtX3BsYXRmb3Jt
RGF0YS5tZXRyaWNzKCk7Ci0gICAgbV9hdmdDaGFyV2lkdGggPSAodG0udG1BdmVDaGFyV2lkdGgg
KiBtX3BsYXRmb3JtRGF0YS5zaXplKCkgKyAzNikgLyA3MjsKLSAgICBtX21heENoYXJXaWR0aCA9
ICh0bS50bU1heENoYXJXaWR0aCAqIG1fcGxhdGZvcm1EYXRhLnNpemUoKSArIDM2KSAvIDcyOwot
fQotCi19CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1dpbkNFR3JhcGhp
Y3NFeHRyYXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNl
L1dpbkNFR3JhcGhpY3NFeHRyYXMuaAkocmV2aXNpb24gNTcyODkpCShmcm9tIFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luY2UvV2luY2VHcmFwaGljc0V4dHJhcy5oOjU3Mjg5KQorKysgV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9XaW5DRUdyYXBoaWNzRXh0cmFzLmgJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDctMjAw
OSBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0
aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAg
dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2
ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg
dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBv
ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlv
dSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxl
IENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9z
dG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBXaW5jZUdyYXBoaWNzRXh0
cmFzX2gKKyNkZWZpbmUgV2luY2VHcmFwaGljc0V4dHJhc19oCisKKy8vIFRoaXMgZmlsZSBpcyB1
c2VkIHRvIGNvbnRhaW4gc21hbGwgdXRpbGl0aWVzIHVzZWQgYnkgV0lOQ0UgZ3JhcGhpY3MgY29k
ZS4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworICAgIC8vIEFsd2F5cyByb3VuZCB0byBzYW1lIGRp
cmVjdGlvbi4gMC41IGlzIHJvdW5kZWQgdG8gMSwKKyAgICAvLyBhbmQgLTAuNSAoMC41IC0gMSkg
aXMgcm91bmRlZCB0byAwICgxIC0gMSksIHNvIHRoYXQgaXQKKyAgICAvLyBpcyBjb25zaXN0ZW50
IHdoZW4gdHJhbnNmb3JtYXRpb24gc2hpZnRzLgorICAgIHN0YXRpYyBpbmxpbmUgaW50IHN0YWJs
ZVJvdW5kKGRvdWJsZSBkKQorICAgIHsKKyAgICAgICAgaWYgKGQgPiAwKQorICAgICAgICAgICAg
cmV0dXJuIHN0YXRpY19jYXN0PGludD4oZCArIDAuNSk7CisKKyAgICAgICAgaW50IGkgPSBzdGF0
aWNfY2FzdDxpbnQ+KGQpOworICAgICAgICByZXR1cm4gaSAtIGQgPiAwLjUgPyBpIC0gMSA6IGk7
CisgICAgfQorfQorCisjZW5kaWYgV2luY2VHcmFwaGljc0V4dHJhc19oCkluZGV4OiBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1dpbkNFR3JhcGhpY3NFeHRyYXMuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1dpbkNFR3JhcGhpY3NFeHRyYXMu
aAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1dp
bkNFR3JhcGhpY3NFeHRyYXMuaAkod29ya2luZyBjb3B5KQpAQCAtMTcsOCArMTcsOCBAQAogICog
IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgogICovCiAKLSNpZm5kZWYgV2luY2VHcmFwaGlj
c0V4dHJhc19oCi0jZGVmaW5lIFdpbmNlR3JhcGhpY3NFeHRyYXNfaAorI2lmbmRlZiBXaW5DRUdy
YXBoaWNzRXh0cmFzX2gKKyNkZWZpbmUgV2luQ0VHcmFwaGljc0V4dHJhc19oCiAKIC8vIFRoaXMg
ZmlsZSBpcyB1c2VkIHRvIGNvbnRhaW4gc21hbGwgdXRpbGl0aWVzIHVzZWQgYnkgV0lOQ0UgZ3Jh
cGhpY3MgY29kZS4KIApAQCAtMzYsNCArMzYsNCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAg
fQogfQogCi0jZW5kaWYgV2luY2VHcmFwaGljc0V4dHJhc19oCisjZW5kaWYgV2luQ0VHcmFwaGlj
c0V4dHJhc19oCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1dpbmNlR3Jh
cGhpY3NFeHRyYXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL1dpbmNlR3JhcGhpY3NFeHRyYXMuaAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbmNlL1dpbmNlR3JhcGhpY3NFeHRyYXMuaAkod29ya2luZyBjb3B5
KQpAQCAtMSwzOSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNo
IE1vYmlsZSwgSW5jLgotICoKLSAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91
IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt
cyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqICBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqICB2ZXJzaW9u
IDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24u
Ci0gKgotICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0
IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl
dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqICBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3Vs
ZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlO
Ry5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
biwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqICBCb3N0b24sIE1B
IDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0jaWZuZGVmIFdpbmNlR3JhcGhpY3NFeHRyYXNfaAot
I2RlZmluZSBXaW5jZUdyYXBoaWNzRXh0cmFzX2gKLQotLy8gVGhpcyBmaWxlIGlzIHVzZWQgdG8g
Y29udGFpbiBzbWFsbCB1dGlsaXRpZXMgdXNlZCBieSBXSU5DRSBncmFwaGljcyBjb2RlLgotCi1u
YW1lc3BhY2UgV2ViQ29yZSB7Ci0gICAgLy8gQWx3YXlzIHJvdW5kIHRvIHNhbWUgZGlyZWN0aW9u
LiAwLjUgaXMgcm91bmRlZCB0byAxLAotICAgIC8vIGFuZCAtMC41ICgwLjUgLSAxKSBpcyByb3Vu
ZGVkIHRvIDAgKDEgLSAxKSwgc28gdGhhdCBpdAotICAgIC8vIGlzIGNvbnNpc3RlbnQgd2hlbiB0
cmFuc2Zvcm1hdGlvbiBzaGlmdHMuCi0gICAgc3RhdGljIGlubGluZSBpbnQgc3RhYmxlUm91bmQo
ZG91YmxlIGQpCi0gICAgewotICAgICAgICBpZiAoZCA+IDApCi0gICAgICAgICAgICByZXR1cm4g
c3RhdGljX2Nhc3Q8aW50PihkICsgMC41KTsKLQotICAgICAgICBpbnQgaSA9IHN0YXRpY19jYXN0
PGludD4oZCk7Ci0gICAgICAgIHJldHVybiBpIC0gZCA+IDAuNSA/IGkgLSAxIDogaTsKLSAgICB9
Ci19Ci0KLSNlbmRpZiBXaW5jZUdyYXBoaWNzRXh0cmFzX2gKSW5kZXg6IFdlYkNvcmUvcGxhdGZv
cm0vdGV4dC9UZXh0RW5jb2RpbmdSZWdpc3RyeS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9w
bGF0Zm9ybS90ZXh0L1RleHRFbmNvZGluZ1JlZ2lzdHJ5LmNwcAkocmV2aXNpb24gNTcyODkpCisr
KyBXZWJDb3JlL3BsYXRmb3JtL3RleHQvVGV4dEVuY29kaW5nUmVnaXN0cnkuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC01Miw3ICs1Miw3IEBACiAjaW5jbHVkZSAiZ3RrL1RleHRDb2RlY0d0ay5oIgog
I2VuZGlmCiAjaWYgT1MoV0lOQ0UpICYmICFQTEFURk9STShRVCkKLSNpbmNsdWRlICJUZXh0Q29k
ZWNXaW5jZS5oIgorI2luY2x1ZGUgIlRleHRDb2RlY1dpbkNFLmgiCiAjZW5kaWYKIAogdXNpbmcg
bmFtZXNwYWNlIFdURjsKQEAgLTIzMSw4ICsyMzEsOCBAQCBzdGF0aWMgdm9pZCBidWlsZEJhc2VU
ZXh0Q29kZWNNYXBzKCkKICNlbmRpZgogCiAjaWYgT1MoV0lOQ0UpICYmICFQTEFURk9STShRVCkK
LSAgICBUZXh0Q29kZWNXaW5jZTo6cmVnaXN0ZXJCYXNlRW5jb2RpbmdOYW1lcyhhZGRUb1RleHRF
bmNvZGluZ05hbWVNYXApOwotICAgIFRleHRDb2RlY1dpbmNlOjpyZWdpc3RlckJhc2VDb2RlY3Mo
YWRkVG9UZXh0Q29kZWNNYXApOworICAgIFRleHRDb2RlY1dpbkNFOjpyZWdpc3RlckJhc2VFbmNv
ZGluZ05hbWVzKGFkZFRvVGV4dEVuY29kaW5nTmFtZU1hcCk7CisgICAgVGV4dENvZGVjV2luQ0U6
OnJlZ2lzdGVyQmFzZUNvZGVjcyhhZGRUb1RleHRDb2RlY01hcCk7CiAjZW5kaWYKIH0KIApAQCAt
MjU5LDggKzI1OSw4IEBAIHN0YXRpYyB2b2lkIGV4dGVuZFRleHRDb2RlY01hcHMoKQogI2VuZGlm
CiAKICNpZiBPUyhXSU5DRSkgJiYgIVBMQVRGT1JNKFFUKQotICAgIFRleHRDb2RlY1dpbmNlOjpy
ZWdpc3RlckV4dGVuZGVkRW5jb2RpbmdOYW1lcyhhZGRUb1RleHRFbmNvZGluZ05hbWVNYXApOwot
ICAgIFRleHRDb2RlY1dpbmNlOjpyZWdpc3RlckV4dGVuZGVkQ29kZWNzKGFkZFRvVGV4dENvZGVj
TWFwKTsKKyAgICBUZXh0Q29kZWNXaW5DRTo6cmVnaXN0ZXJFeHRlbmRlZEVuY29kaW5nTmFtZXMo
YWRkVG9UZXh0RW5jb2RpbmdOYW1lTWFwKTsKKyAgICBUZXh0Q29kZWNXaW5DRTo6cmVnaXN0ZXJF
eHRlbmRlZENvZGVjcyhhZGRUb1RleHRDb2RlY01hcCk7CiAjZW5kaWYKIAogICAgIHBydW5lQmxh
Y2tsaXN0ZWRDb2RlY3MoKTsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vdGV4dC93aW5jZS9UZXh0
Qm91bmRhcmllc1dpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3RleHQv
d2luY2UvVGV4dEJvdW5kYXJpZXNXaW5DRS5jcHAJKHJldmlzaW9uIDU3Mjg5KQkoZnJvbSBXZWJD
b3JlL3BsYXRmb3JtL3RleHQvd2luY2UvVGV4dEJvdW5kYXJpZXNXaW5jZS5jcHA6NTcyODkpCisr
KyBXZWJDb3JlL3BsYXRmb3JtL3RleHQvd2luY2UvVGV4dEJvdW5kYXJpZXNXaW5DRS5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBa
YWNrIFJ1c2luIDx6YWNrQGtkZS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3Jj
aCBNb2JpbGUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiVGV4dEJvdW5kYXJpZXMuaCIKKworI2luY2x1ZGUgIk5vdEltcGxl
bWVudGVkLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKwordXNpbmcgbmFtZXNwYWNl
IFdURjo6VW5pY29kZTsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitpbnQgZmluZE5leHRXb3Jk
RnJvbUluZGV4KGNvbnN0IFVDaGFyICogYnVmZmVyLCBpbnQgbGVuLCBpbnQgcG9zaXRpb24sIGJv
b2wgZm9yd2FyZCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQor
Cit2b2lkIGZpbmRXb3JkQm91bmRhcnkoY29uc3QgVUNoYXIgKiBidWZmZXIsIGludCBsZW4sIGlu
dCBwb3NpdGlvbiwgaW50KiBzdGFydCwgaW50KiBlbmQpCit7CisgICAgaWYgKHBvc2l0aW9uID4g
bGVuKSB7CisgICAgICAgICpzdGFydCA9IDA7CisgICAgICAgICplbmQgPSAwOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgU3RyaW5nIHN0cihidWZmZXIsIGxlbik7CisKKyAgICBpbnQg
Y3VycmVudFBvc2l0aW9uID0gcG9zaXRpb24gLSAxOworICAgIFN0cmluZyBmb3VuZFdvcmQ7Cisg
ICAgd2hpbGUgKGN1cnJlbnRQb3NpdGlvbiA+PSAwICYmIGlzTGV0dGVyKHN0cltjdXJyZW50UG9z
aXRpb25dKSkgeworICAgICAgICBVQ2hhciBjID0gc3RyW2N1cnJlbnRQb3NpdGlvbl07CisgICAg
ICAgIGZvdW5kV29yZC5pbnNlcnQoJmMsIDEsIDApOworICAgICAgICAtLWN1cnJlbnRQb3NpdGlv
bjsKKyAgICB9CisKKyAgICAvLyBjdXJyZW50UG9zaXRpb24gPT0gMCBtZWFucyB0aGUgZmlyc3Qg
Y2hhciBpcyBub3QgbGV0dGVyCisgICAgLy8gY3VycmVudFBvc2l0aW9uID09IC0xIG1lYW5zIHdl
IHJlYWNoZWQgdGhlIGJlZ2lubmluZworICAgIGludCBzdGFydFBvcyA9IChjdXJyZW50UG9zaXRp
b24gPCAwKSA/IDAgOiArK2N1cnJlbnRQb3NpdGlvbjsKKyAgICBjdXJyZW50UG9zaXRpb24gPSBw
b3NpdGlvbjsKKyAgICB3aGlsZSAoaXNMZXR0ZXIoc3RyW2N1cnJlbnRQb3NpdGlvbl0pKSB7Cisg
ICAgICAgIGZvdW5kV29yZC5hcHBlbmQoc3RyW2N1cnJlbnRQb3NpdGlvbl0pOworICAgICAgICAr
K2N1cnJlbnRQb3NpdGlvbjsKKyAgICB9CisKKyAgICAqc3RhcnQgPSBzdGFydFBvczsKKyAgICAq
ZW5kID0gY3VycmVudFBvc2l0aW9uOworfQorCisKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0v
dGV4dC93aW5jZS9UZXh0Qm91bmRhcmllc1dpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL3RleHQvd2luY2UvVGV4dEJvdW5kYXJpZXNXaW5DRS5jcHAJKHJldmlzaW9uIDU3
Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L3dpbmNlL1RleHRCb3VuZGFyaWVzV2luQ0Uu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC03MSw1ICs3MSw0IEBAIHZvaWQgZmluZFdvcmRCb3VuZGFy
eShjb25zdCBVQ2hhciAqIGJ1ZmYKICAgICAqZW5kID0gY3VycmVudFBvc2l0aW9uOwogfQogCi0K
LX0KK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vdGV4dC93
aW5jZS9UZXh0Qm91bmRhcmllc1dpbmNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRm
b3JtL3RleHQvd2luY2UvVGV4dEJvdW5kYXJpZXNXaW5jZS5jcHAJKHJldmlzaW9uIDU3Mjg5KQor
KysgV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L3dpbmNlL1RleHRCb3VuZGFyaWVzV2luY2UuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYg
WmFjayBSdXNpbiA8emFja0BrZGUub3JnPgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9y
Y2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0g
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCi0gKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNv
bmZpZy5oIgotI2luY2x1ZGUgIlRleHRCb3VuZGFyaWVzLmgiCi0KLSNpbmNsdWRlICJOb3RJbXBs
ZW1lbnRlZC5oIgotI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCi0KLXVzaW5nIG5hbWVzcGFj
ZSBXVEY6OlVuaWNvZGU7Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotaW50IGZpbmROZXh0V29y
ZEZyb21JbmRleChjb25zdCBVQ2hhciAqIGJ1ZmZlciwgaW50IGxlbiwgaW50IHBvc2l0aW9uLCBi
b29sIGZvcndhcmQpCi17Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1cm4gMDsKLX0K
LQotdm9pZCBmaW5kV29yZEJvdW5kYXJ5KGNvbnN0IFVDaGFyICogYnVmZmVyLCBpbnQgbGVuLCBp
bnQgcG9zaXRpb24sIGludCogc3RhcnQsIGludCogZW5kKQotewotICAgIGlmIChwb3NpdGlvbiA+
IGxlbikgewotICAgICAgICAqc3RhcnQgPSAwOwotICAgICAgICAqZW5kID0gMDsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLQotICAgIFN0cmluZyBzdHIoYnVmZmVyLCBsZW4pOwotCi0gICAgaW50
IGN1cnJlbnRQb3NpdGlvbiA9IHBvc2l0aW9uIC0gMTsKLSAgICBTdHJpbmcgZm91bmRXb3JkOwot
ICAgIHdoaWxlIChjdXJyZW50UG9zaXRpb24gPj0gMCAmJiBpc0xldHRlcihzdHJbY3VycmVudFBv
c2l0aW9uXSkpIHsKLSAgICAgICAgVUNoYXIgYyA9IHN0cltjdXJyZW50UG9zaXRpb25dOwotICAg
ICAgICBmb3VuZFdvcmQuaW5zZXJ0KCZjLCAxLCAwKTsKLSAgICAgICAgLS1jdXJyZW50UG9zaXRp
b247Ci0gICAgfQotCi0gICAgLy8gY3VycmVudFBvc2l0aW9uID09IDAgbWVhbnMgdGhlIGZpcnN0
IGNoYXIgaXMgbm90IGxldHRlcgotICAgIC8vIGN1cnJlbnRQb3NpdGlvbiA9PSAtMSBtZWFucyB3
ZSByZWFjaGVkIHRoZSBiZWdpbm5pbmcKLSAgICBpbnQgc3RhcnRQb3MgPSAoY3VycmVudFBvc2l0
aW9uIDwgMCkgPyAwIDogKytjdXJyZW50UG9zaXRpb247Ci0gICAgY3VycmVudFBvc2l0aW9uID0g
cG9zaXRpb247Ci0gICAgd2hpbGUgKGlzTGV0dGVyKHN0cltjdXJyZW50UG9zaXRpb25dKSkgewot
ICAgICAgICBmb3VuZFdvcmQuYXBwZW5kKHN0cltjdXJyZW50UG9zaXRpb25dKTsKLSAgICAgICAg
KytjdXJyZW50UG9zaXRpb247Ci0gICAgfQotCi0gICAgKnN0YXJ0ID0gc3RhcnRQb3M7Ci0gICAg
KmVuZCA9IGN1cnJlbnRQb3NpdGlvbjsKLX0KLQotCi19CkluZGV4OiBXZWJDb3JlL3BsYXRmb3Jt
L3RleHQvd2luY2UvVGV4dEJyZWFrSXRlcmF0b3JXaW5DRS5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS90ZXh0L3dpbmNlL1RleHRCcmVha0l0ZXJhdG9yV2luQ0UuY3BwCShyZXZp
c2lvbiA1NzI4OSkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L3dpbmNlL1RleHRCcmVha0l0
ZXJhdG9yV2luY2UuY3BwOjU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L3dpbmNlL1Rl
eHRCcmVha0l0ZXJhdG9yV2luQ0UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzEyIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IExhcnMgS25vbGwgPGxhcnNAdHJvbGx0ZWNoLmNv
bT4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLgorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0
IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMg
ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBX
SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m
CisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu
ICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl
IGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxp
YnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRl
IDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiVGV4dEJyZWFrSXRlcmF0b3IuaCIKKworI2luY2x1ZGUg
IlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorI2luY2x1
ZGUgPHd0Zi91bmljb2RlL1VuaWNvZGUuaD4KKwordXNpbmcgbmFtZXNwYWNlIFdURjo6VW5pY29k
ZTsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBIYWNrLCBub3QgZW50aXJlbHkgY29ycmVj
dAorc3RhdGljIGlubGluZSBib29sIGlzQ2hhclN0b3AoVUNoYXIgYykKK3sKKyAgICBDaGFyQ2F0
ZWdvcnkgY2hhckNhdGVnb3J5ID0gY2F0ZWdvcnkoYyk7CisgICAgcmV0dXJuIGNoYXJDYXRlZ29y
eSAhPSBNYXJrX05vblNwYWNpbmcgJiYgKGNoYXJDYXRlZ29yeSAhPSBPdGhlcl9TdXJyb2dhdGUg
fHwgKGMgPCAweGQ4MDAgfHwgYyA+PSAweGRjMDApKTsKK30KKworc3RhdGljIGlubGluZSBib29s
IGlzTGluZVN0b3AoVUNoYXIgYykKK3sKKyAgICByZXR1cm4gY2F0ZWdvcnkoYykgIT0gU2VwYXJh
dG9yX0xpbmU7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1NlbnRlbmNlU3RvcChVQ2hhciBj
KQoreworICAgIHJldHVybiBpc1B1bmN0KGMpOworfQorCitjbGFzcyBUZXh0QnJlYWtJdGVyYXRv
ciB7CitwdWJsaWM6CisgICAgdm9pZCByZXNldChjb25zdCBVQ2hhciogc3RyLCBpbnQgbGVuKQor
ICAgIHsKKyAgICAgICAgc3RyaW5nID0gc3RyOworICAgICAgICBsZW5ndGggPSBsZW47CisgICAg
ICAgIGN1cnJlbnRQb3MgPSAwOworICAgIH0KKyAgICB2aXJ0dWFsIGludCBmaXJzdCgpID0gMDsK
KyAgICB2aXJ0dWFsIGludCBuZXh0KCkgPSAwOworICAgIHZpcnR1YWwgaW50IHByZXZpb3VzKCkg
PSAwOworICAgIGludCBmb2xsb3dpbmcoaW50IHBvc2l0aW9uKQorICAgIHsKKyAgICAgICAgY3Vy
cmVudFBvcyA9IHBvc2l0aW9uOworICAgICAgICByZXR1cm4gbmV4dCgpOworICAgIH0KKyAgICBp
bnQgcHJlY2VkaW5nKGludCBwb3NpdGlvbikKKyAgICB7CisgICAgICAgIGN1cnJlbnRQb3MgPSBw
b3NpdGlvbjsKKyAgICAgICAgcmV0dXJuIHByZXZpb3VzKCk7CisgICAgfQorCisgICAgaW50IGN1
cnJlbnRQb3M7CisgICAgY29uc3QgVUNoYXIqIHN0cmluZzsKKyAgICBpbnQgbGVuZ3RoOworfTsK
Kworc3RydWN0IFdvcmRCcmVha0l0ZXJhdG9yOiBUZXh0QnJlYWtJdGVyYXRvciB7CisgICAgdmly
dHVhbCBpbnQgZmlyc3QoKTsKKyAgICB2aXJ0dWFsIGludCBuZXh0KCk7CisgICAgdmlydHVhbCBp
bnQgcHJldmlvdXMoKTsKK307CisKK3N0cnVjdCBDaGFyQnJlYWtJdGVyYXRvcjogVGV4dEJyZWFr
SXRlcmF0b3IgeworICAgIHZpcnR1YWwgaW50IGZpcnN0KCk7CisgICAgdmlydHVhbCBpbnQgbmV4
dCgpOworICAgIHZpcnR1YWwgaW50IHByZXZpb3VzKCk7Cit9OworCitzdHJ1Y3QgTGluZUJyZWFr
SXRlcmF0b3I6IFRleHRCcmVha0l0ZXJhdG9yIHsKKyAgICB2aXJ0dWFsIGludCBmaXJzdCgpOwor
ICAgIHZpcnR1YWwgaW50IG5leHQoKTsKKyAgICB2aXJ0dWFsIGludCBwcmV2aW91cygpOworfTsK
Kworc3RydWN0IFNlbnRlbmNlQnJlYWtJdGVyYXRvciA6IFRleHRCcmVha0l0ZXJhdG9yIHsKKyAg
ICB2aXJ0dWFsIGludCBmaXJzdCgpOworICAgIHZpcnR1YWwgaW50IG5leHQoKTsKKyAgICB2aXJ0
dWFsIGludCBwcmV2aW91cygpOworfTsKKworaW50IFdvcmRCcmVha0l0ZXJhdG9yOjpmaXJzdCgp
Cit7CisgICAgY3VycmVudFBvcyA9IDA7CisgICAgcmV0dXJuIGN1cnJlbnRQb3M7Cit9CisKK2lu
dCBXb3JkQnJlYWtJdGVyYXRvcjo6bmV4dCgpCit7CisgICAgaWYgKGN1cnJlbnRQb3MgPT0gbGVu
Z3RoKSB7CisgICAgICAgIGN1cnJlbnRQb3MgPSAtMTsKKyAgICAgICAgcmV0dXJuIGN1cnJlbnRQ
b3M7CisgICAgfQorICAgIGJvb2wgaGF2ZVNwYWNlID0gZmFsc2U7CisgICAgd2hpbGUgKGN1cnJl
bnRQb3MgPCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKGhhdmVTcGFjZSAmJiAhaXNTcGFjZShzdHJp
bmdbY3VycmVudFBvc10pKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChpc1NwYWNl
KHN0cmluZ1tjdXJyZW50UG9zXSkpCisgICAgICAgICAgICBoYXZlU3BhY2UgPSB0cnVlOworICAg
ICAgICArK2N1cnJlbnRQb3M7CisgICAgfQorICAgIHJldHVybiBjdXJyZW50UG9zOworfQorCitp
bnQgV29yZEJyZWFrSXRlcmF0b3I6OnByZXZpb3VzKCkKK3sKKyAgICBpZiAoIWN1cnJlbnRQb3Mp
IHsKKyAgICAgICAgY3VycmVudFBvcyA9IC0xOworICAgICAgICByZXR1cm4gY3VycmVudFBvczsK
KyAgICB9CisgICAgYm9vbCBoYXZlU3BhY2UgPSBmYWxzZTsKKyAgICB3aGlsZSAoY3VycmVudFBv
cyA+IDApIHsKKyAgICAgICAgaWYgKGhhdmVTcGFjZSAmJiAhaXNTcGFjZShzdHJpbmdbY3VycmVu
dFBvc10pKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChpc1NwYWNlKHN0cmluZ1tj
dXJyZW50UG9zXSkpCisgICAgICAgICAgICBoYXZlU3BhY2UgPSB0cnVlOworICAgICAgICAtLWN1
cnJlbnRQb3M7CisgICAgfQorICAgIHJldHVybiBjdXJyZW50UG9zOworfQorCitpbnQgQ2hhckJy
ZWFrSXRlcmF0b3I6OmZpcnN0KCkKK3sKKyAgICBjdXJyZW50UG9zID0gMDsKKyAgICByZXR1cm4g
Y3VycmVudFBvczsKK30KKworaW50IENoYXJCcmVha0l0ZXJhdG9yOjpuZXh0KCkKK3sKKyAgICBp
ZiAoY3VycmVudFBvcyA+PSBsZW5ndGgpCisgICAgICAgIHJldHVybiAtMTsKKyAgICArK2N1cnJl
bnRQb3M7CisgICAgd2hpbGUgKGN1cnJlbnRQb3MgPCBsZW5ndGggJiYgIWlzQ2hhclN0b3Aoc3Ry
aW5nW2N1cnJlbnRQb3NdKSkKKyAgICAgICAgKytjdXJyZW50UG9zOworICAgIHJldHVybiBjdXJy
ZW50UG9zOworfQorCitpbnQgQ2hhckJyZWFrSXRlcmF0b3I6OnByZXZpb3VzKCkKK3sKKyAgICBp
ZiAoY3VycmVudFBvcyA8PSAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGN1cnJlbnRQ
b3MgPiBsZW5ndGgpCisgICAgICAgIGN1cnJlbnRQb3MgPSBsZW5ndGg7CisgICAgLS1jdXJyZW50
UG9zOworICAgIHdoaWxlIChjdXJyZW50UG9zID4gMCAmJiAhaXNDaGFyU3RvcChzdHJpbmdbY3Vy
cmVudFBvc10pKQorICAgICAgICAtLWN1cnJlbnRQb3M7CisgICAgcmV0dXJuIGN1cnJlbnRQb3M7
Cit9CisKK2ludCBMaW5lQnJlYWtJdGVyYXRvcjo6Zmlyc3QoKQoreworICAgIGN1cnJlbnRQb3Mg
PSAwOworICAgIHJldHVybiBjdXJyZW50UG9zOworfQorCitpbnQgTGluZUJyZWFrSXRlcmF0b3I6
Om5leHQoKQoreworICAgIGlmIChjdXJyZW50UG9zID09IGxlbmd0aCkgeworICAgICAgICBjdXJy
ZW50UG9zID0gLTE7CisgICAgICAgIHJldHVybiBjdXJyZW50UG9zOworICAgIH0KKyAgICBib29s
IGhhdmVTcGFjZSA9IGZhbHNlOworICAgIHdoaWxlIChjdXJyZW50UG9zIDwgbGVuZ3RoKSB7Cisg
ICAgICAgIGlmIChoYXZlU3BhY2UgJiYgIWlzTGluZVN0b3Aoc3RyaW5nW2N1cnJlbnRQb3NdKSkK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoaXNMaW5lU3RvcChzdHJpbmdbY3VycmVu
dFBvc10pKQorICAgICAgICAgICAgaGF2ZVNwYWNlID0gdHJ1ZTsKKyAgICAgICAgKytjdXJyZW50
UG9zOworICAgIH0KKyAgICByZXR1cm4gY3VycmVudFBvczsKK30KKworaW50IExpbmVCcmVha0l0
ZXJhdG9yOjpwcmV2aW91cygpCit7CisgICAgaWYgKCFjdXJyZW50UG9zKSB7CisgICAgICAgIGN1
cnJlbnRQb3MgPSAtMTsKKyAgICAgICAgcmV0dXJuIGN1cnJlbnRQb3M7CisgICAgfQorICAgIGJv
b2wgaGF2ZVNwYWNlID0gZmFsc2U7CisgICAgd2hpbGUgKGN1cnJlbnRQb3MgPiAwKSB7CisgICAg
ICAgIGlmIChoYXZlU3BhY2UgJiYgIWlzTGluZVN0b3Aoc3RyaW5nW2N1cnJlbnRQb3NdKSkKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoaXNMaW5lU3RvcChzdHJpbmdbY3VycmVudFBv
c10pKQorICAgICAgICAgICAgaGF2ZVNwYWNlID0gdHJ1ZTsKKyAgICAgICAgLS1jdXJyZW50UG9z
OworICAgIH0KKyAgICByZXR1cm4gY3VycmVudFBvczsKK30KKworaW50IFNlbnRlbmNlQnJlYWtJ
dGVyYXRvcjo6Zmlyc3QoKQoreworICAgIGN1cnJlbnRQb3MgPSAwOworICAgIHJldHVybiBjdXJy
ZW50UG9zOworfQorCitpbnQgU2VudGVuY2VCcmVha0l0ZXJhdG9yOjpuZXh0KCkKK3sKKyAgICBp
ZiAoY3VycmVudFBvcyA9PSBsZW5ndGgpIHsKKyAgICAgICAgY3VycmVudFBvcyA9IC0xOworICAg
ICAgICByZXR1cm4gY3VycmVudFBvczsKKyAgICB9CisgICAgYm9vbCBoYXZlU3BhY2UgPSBmYWxz
ZTsKKyAgICB3aGlsZSAoY3VycmVudFBvcyA8IGxlbmd0aCkgeworICAgICAgICBpZiAoaGF2ZVNw
YWNlICYmICFpc1NlbnRlbmNlU3RvcChzdHJpbmdbY3VycmVudFBvc10pKQorICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGlmIChpc1NlbnRlbmNlU3RvcChzdHJpbmdbY3VycmVudFBvc10pKQor
ICAgICAgICAgICAgaGF2ZVNwYWNlID0gdHJ1ZTsKKyAgICAgICAgKytjdXJyZW50UG9zOworICAg
IH0KKyAgICByZXR1cm4gY3VycmVudFBvczsKK30KKworaW50IFNlbnRlbmNlQnJlYWtJdGVyYXRv
cjo6cHJldmlvdXMoKQoreworICAgIGlmICghY3VycmVudFBvcykgeworICAgICAgICBjdXJyZW50
UG9zID0gLTE7CisgICAgICAgIHJldHVybiBjdXJyZW50UG9zOworICAgIH0KKyAgICBib29sIGhh
dmVTcGFjZSA9IGZhbHNlOworICAgIHdoaWxlIChjdXJyZW50UG9zID4gMCkgeworICAgICAgICBp
ZiAoaGF2ZVNwYWNlICYmICFpc1NlbnRlbmNlU3RvcChzdHJpbmdbY3VycmVudFBvc10pKQorICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChpc1NlbnRlbmNlU3RvcChzdHJpbmdbY3VycmVu
dFBvc10pKQorICAgICAgICAgICAgaGF2ZVNwYWNlID0gdHJ1ZTsKKyAgICAgICAgLS1jdXJyZW50
UG9zOworICAgIH0KKyAgICByZXR1cm4gY3VycmVudFBvczsKK30KKworVGV4dEJyZWFrSXRlcmF0
b3IqIHdvcmRCcmVha0l0ZXJhdG9yKGNvbnN0IFVDaGFyKiBzdHJpbmcsIGludCBsZW5ndGgpCit7
CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChXb3JkQnJlYWtJdGVyYXRvciwgaXRlcmF0b3IsICgp
KTsKKyAgICBpdGVyYXRvci5yZXNldChzdHJpbmcsIGxlbmd0aCk7CisgICAgcmV0dXJuICZpdGVy
YXRvcjsKK30KKworVGV4dEJyZWFrSXRlcmF0b3IqIGNoYXJhY3RlckJyZWFrSXRlcmF0b3IoY29u
c3QgVUNoYXIqIHN0cmluZywgaW50IGxlbmd0aCkKK3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FM
KENoYXJCcmVha0l0ZXJhdG9yLCBpdGVyYXRvciwgKCkpOworICAgIGl0ZXJhdG9yLnJlc2V0KHN0
cmluZywgbGVuZ3RoKTsKKyAgICByZXR1cm4gJml0ZXJhdG9yOworfQorCitUZXh0QnJlYWtJdGVy
YXRvciogbGluZUJyZWFrSXRlcmF0b3IoY29uc3QgVUNoYXIqIHN0cmluZywgaW50IGxlbmd0aCkK
K3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKExpbmVCcmVha0l0ZXJhdG9yICwgaXRlcmF0b3Is
ICgpKTsKKyAgICBpdGVyYXRvci5yZXNldChzdHJpbmcsIGxlbmd0aCk7CisgICAgcmV0dXJuICZp
dGVyYXRvcjsKK30KKworVGV4dEJyZWFrSXRlcmF0b3IqIHNlbnRlbmNlQnJlYWtJdGVyYXRvcihj
b25zdCBVQ2hhciogc3RyaW5nLCBpbnQgbGVuZ3RoKQoreworICAgIERFRklORV9TVEFUSUNfTE9D
QUwoU2VudGVuY2VCcmVha0l0ZXJhdG9yLCBpdGVyYXRvciwgKCkpOworICAgIGl0ZXJhdG9yLnJl
c2V0KHN0cmluZywgbGVuZ3RoKTsKKyAgICByZXR1cm4gJml0ZXJhdG9yOworfQorCitpbnQgdGV4
dEJyZWFrRmlyc3QoVGV4dEJyZWFrSXRlcmF0b3IqIGJyZWFrSXRlcmF0b3IpCit7CisgICAgcmV0
dXJuIGJyZWFrSXRlcmF0b3ItPmZpcnN0KCk7Cit9CisKK2ludCB0ZXh0QnJlYWtOZXh0KFRleHRC
cmVha0l0ZXJhdG9yKiBicmVha0l0ZXJhdG9yKQoreworICAgIHJldHVybiBicmVha0l0ZXJhdG9y
LT5uZXh0KCk7Cit9CisKK2ludCB0ZXh0QnJlYWtQcmVjZWRpbmcoVGV4dEJyZWFrSXRlcmF0b3Iq
IGJyZWFrSXRlcmF0b3IsIGludCBwb3NpdGlvbikKK3sKKyAgICByZXR1cm4gYnJlYWtJdGVyYXRv
ci0+cHJlY2VkaW5nKHBvc2l0aW9uKTsKK30KKworaW50IHRleHRCcmVha0ZvbGxvd2luZyhUZXh0
QnJlYWtJdGVyYXRvciogYnJlYWtJdGVyYXRvciwgaW50IHBvc2l0aW9uKQoreworICAgIHJldHVy
biBicmVha0l0ZXJhdG9yLT5mb2xsb3dpbmcocG9zaXRpb24pOworfQorCitpbnQgdGV4dEJyZWFr
Q3VycmVudChUZXh0QnJlYWtJdGVyYXRvciogYnJlYWtJdGVyYXRvcikKK3sKKyAgICByZXR1cm4g
YnJlYWtJdGVyYXRvci0+Y3VycmVudFBvczsKK30KKworYm9vbCBpc1RleHRCcmVhayhUZXh0QnJl
YWtJdGVyYXRvciosIGludCkKK3sKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworVGV4dEJyZWFrSXRl
cmF0b3IqIGN1cnNvck1vdmVtZW50SXRlcmF0b3IoY29uc3QgVUNoYXIqIHN0cmluZywgaW50IGxl
bmd0aCkKK3sKKyAgICByZXR1cm4gY2hhcmFjdGVyQnJlYWtJdGVyYXRvcihzdHJpbmcsIGxlbmd0
aCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0v
dGV4dC93aW5jZS9UZXh0QnJlYWtJdGVyYXRvcldpbmNlLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3BsYXRmb3JtL3RleHQvd2luY2UvVGV4dEJyZWFrSXRlcmF0b3JXaW5jZS5jcHAJKHJldmlz
aW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L3dpbmNlL1RleHRCcmVha0l0ZXJh
dG9yV2luY2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMxMiArMCwwIEBACi0vKgotICogQ29w
eXJpZ2h0IChDKSAyMDA2IExhcnMgS25vbGwgPGxhcnNAdHJvbGx0ZWNoLmNvbT4KLSAqIENvcHly
aWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLgotICoKLSAqIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
Ci0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9u
KSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBX
QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFO
VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdO
VQotICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0g
KgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0
aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAqIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAqIEJv
c3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgi
Ci0jaW5jbHVkZSAiVGV4dEJyZWFrSXRlcmF0b3IuaCIKLQotI2luY2x1ZGUgIlBsYXRmb3JtU3Ry
aW5nLmgiCi0jaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgotI2luY2x1ZGUgPHd0Zi91bmlj
b2RlL1VuaWNvZGUuaD4KLQotdXNpbmcgbmFtZXNwYWNlIFdURjo6VW5pY29kZTsKLQotbmFtZXNw
YWNlIFdlYkNvcmUgewotCi0vLyBIYWNrLCBub3QgZW50aXJlbHkgY29ycmVjdAotc3RhdGljIGlu
bGluZSBib29sIGlzQ2hhclN0b3AoVUNoYXIgYykKLXsKLSAgICBDaGFyQ2F0ZWdvcnkgY2hhckNh
dGVnb3J5ID0gY2F0ZWdvcnkoYyk7Ci0gICAgcmV0dXJuIGNoYXJDYXRlZ29yeSAhPSBNYXJrX05v
blNwYWNpbmcgJiYgKGNoYXJDYXRlZ29yeSAhPSBPdGhlcl9TdXJyb2dhdGUgfHwgKGMgPCAweGQ4
MDAgfHwgYyA+PSAweGRjMDApKTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGlzTGluZVN0b3Ao
VUNoYXIgYykKLXsKLSAgICByZXR1cm4gY2F0ZWdvcnkoYykgIT0gU2VwYXJhdG9yX0xpbmU7Ci19
Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc1NlbnRlbmNlU3RvcChVQ2hhciBjKQotewotICAgIHJl
dHVybiBpc1B1bmN0KGMpOwotfQotCi1jbGFzcyBUZXh0QnJlYWtJdGVyYXRvciB7Ci1wdWJsaWM6
Ci0gICAgdm9pZCByZXNldChjb25zdCBVQ2hhciogc3RyLCBpbnQgbGVuKQotICAgIHsKLSAgICAg
ICAgc3RyaW5nID0gc3RyOwotICAgICAgICBsZW5ndGggPSBsZW47Ci0gICAgICAgIGN1cnJlbnRQ
b3MgPSAwOwotICAgIH0KLSAgICB2aXJ0dWFsIGludCBmaXJzdCgpID0gMDsKLSAgICB2aXJ0dWFs
IGludCBuZXh0KCkgPSAwOwotICAgIHZpcnR1YWwgaW50IHByZXZpb3VzKCkgPSAwOwotICAgIGlu
dCBmb2xsb3dpbmcoaW50IHBvc2l0aW9uKQotICAgIHsKLSAgICAgICAgY3VycmVudFBvcyA9IHBv
c2l0aW9uOwotICAgICAgICByZXR1cm4gbmV4dCgpOwotICAgIH0KLSAgICBpbnQgcHJlY2VkaW5n
KGludCBwb3NpdGlvbikKLSAgICB7Ci0gICAgICAgIGN1cnJlbnRQb3MgPSBwb3NpdGlvbjsKLSAg
ICAgICAgcmV0dXJuIHByZXZpb3VzKCk7Ci0gICAgfQotCi0gICAgaW50IGN1cnJlbnRQb3M7Ci0g
ICAgY29uc3QgVUNoYXIqIHN0cmluZzsKLSAgICBpbnQgbGVuZ3RoOwotfTsKLQotc3RydWN0IFdv
cmRCcmVha0l0ZXJhdG9yOiBUZXh0QnJlYWtJdGVyYXRvciB7Ci0gICAgdmlydHVhbCBpbnQgZmly
c3QoKTsKLSAgICB2aXJ0dWFsIGludCBuZXh0KCk7Ci0gICAgdmlydHVhbCBpbnQgcHJldmlvdXMo
KTsKLX07Ci0KLXN0cnVjdCBDaGFyQnJlYWtJdGVyYXRvcjogVGV4dEJyZWFrSXRlcmF0b3Igewot
ICAgIHZpcnR1YWwgaW50IGZpcnN0KCk7Ci0gICAgdmlydHVhbCBpbnQgbmV4dCgpOwotICAgIHZp
cnR1YWwgaW50IHByZXZpb3VzKCk7Ci19OwotCi1zdHJ1Y3QgTGluZUJyZWFrSXRlcmF0b3I6IFRl
eHRCcmVha0l0ZXJhdG9yIHsKLSAgICB2aXJ0dWFsIGludCBmaXJzdCgpOwotICAgIHZpcnR1YWwg
aW50IG5leHQoKTsKLSAgICB2aXJ0dWFsIGludCBwcmV2aW91cygpOwotfTsKLQotc3RydWN0IFNl
bnRlbmNlQnJlYWtJdGVyYXRvciA6IFRleHRCcmVha0l0ZXJhdG9yIHsKLSAgICB2aXJ0dWFsIGlu
dCBmaXJzdCgpOwotICAgIHZpcnR1YWwgaW50IG5leHQoKTsKLSAgICB2aXJ0dWFsIGludCBwcmV2
aW91cygpOwotfTsKLQotaW50IFdvcmRCcmVha0l0ZXJhdG9yOjpmaXJzdCgpCi17Ci0gICAgY3Vy
cmVudFBvcyA9IDA7Ci0gICAgcmV0dXJuIGN1cnJlbnRQb3M7Ci19Ci0KLWludCBXb3JkQnJlYWtJ
dGVyYXRvcjo6bmV4dCgpCi17Ci0gICAgaWYgKGN1cnJlbnRQb3MgPT0gbGVuZ3RoKSB7Ci0gICAg
ICAgIGN1cnJlbnRQb3MgPSAtMTsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnRQb3M7Ci0gICAgfQot
ICAgIGJvb2wgaGF2ZVNwYWNlID0gZmFsc2U7Ci0gICAgd2hpbGUgKGN1cnJlbnRQb3MgPCBsZW5n
dGgpIHsKLSAgICAgICAgaWYgKGhhdmVTcGFjZSAmJiAhaXNTcGFjZShzdHJpbmdbY3VycmVudFBv
c10pKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmIChpc1NwYWNlKHN0cmluZ1tjdXJy
ZW50UG9zXSkpCi0gICAgICAgICAgICBoYXZlU3BhY2UgPSB0cnVlOwotICAgICAgICArK2N1cnJl
bnRQb3M7Ci0gICAgfQotICAgIHJldHVybiBjdXJyZW50UG9zOwotfQotCi1pbnQgV29yZEJyZWFr
SXRlcmF0b3I6OnByZXZpb3VzKCkKLXsKLSAgICBpZiAoIWN1cnJlbnRQb3MpIHsKLSAgICAgICAg
Y3VycmVudFBvcyA9IC0xOwotICAgICAgICByZXR1cm4gY3VycmVudFBvczsKLSAgICB9Ci0gICAg
Ym9vbCBoYXZlU3BhY2UgPSBmYWxzZTsKLSAgICB3aGlsZSAoY3VycmVudFBvcyA+IDApIHsKLSAg
ICAgICAgaWYgKGhhdmVTcGFjZSAmJiAhaXNTcGFjZShzdHJpbmdbY3VycmVudFBvc10pKQotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmIChpc1NwYWNlKHN0cmluZ1tjdXJyZW50UG9zXSkp
Ci0gICAgICAgICAgICBoYXZlU3BhY2UgPSB0cnVlOwotICAgICAgICAtLWN1cnJlbnRQb3M7Ci0g
ICAgfQotICAgIHJldHVybiBjdXJyZW50UG9zOwotfQotCi1pbnQgQ2hhckJyZWFrSXRlcmF0b3I6
OmZpcnN0KCkKLXsKLSAgICBjdXJyZW50UG9zID0gMDsKLSAgICByZXR1cm4gY3VycmVudFBvczsK
LX0KLQotaW50IENoYXJCcmVha0l0ZXJhdG9yOjpuZXh0KCkKLXsKLSAgICBpZiAoY3VycmVudFBv
cyA+PSBsZW5ndGgpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICArK2N1cnJlbnRQb3M7Ci0gICAg
d2hpbGUgKGN1cnJlbnRQb3MgPCBsZW5ndGggJiYgIWlzQ2hhclN0b3Aoc3RyaW5nW2N1cnJlbnRQ
b3NdKSkKLSAgICAgICAgKytjdXJyZW50UG9zOwotICAgIHJldHVybiBjdXJyZW50UG9zOwotfQot
Ci1pbnQgQ2hhckJyZWFrSXRlcmF0b3I6OnByZXZpb3VzKCkKLXsKLSAgICBpZiAoY3VycmVudFBv
cyA8PSAwKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgaWYgKGN1cnJlbnRQb3MgPiBsZW5ndGgp
Ci0gICAgICAgIGN1cnJlbnRQb3MgPSBsZW5ndGg7Ci0gICAgLS1jdXJyZW50UG9zOwotICAgIHdo
aWxlIChjdXJyZW50UG9zID4gMCAmJiAhaXNDaGFyU3RvcChzdHJpbmdbY3VycmVudFBvc10pKQot
ICAgICAgICAtLWN1cnJlbnRQb3M7Ci0gICAgcmV0dXJuIGN1cnJlbnRQb3M7Ci19Ci0KLWludCBM
aW5lQnJlYWtJdGVyYXRvcjo6Zmlyc3QoKQotewotICAgIGN1cnJlbnRQb3MgPSAwOwotICAgIHJl
dHVybiBjdXJyZW50UG9zOwotfQotCi1pbnQgTGluZUJyZWFrSXRlcmF0b3I6Om5leHQoKQotewot
ICAgIGlmIChjdXJyZW50UG9zID09IGxlbmd0aCkgewotICAgICAgICBjdXJyZW50UG9zID0gLTE7
Ci0gICAgICAgIHJldHVybiBjdXJyZW50UG9zOwotICAgIH0KLSAgICBib29sIGhhdmVTcGFjZSA9
IGZhbHNlOwotICAgIHdoaWxlIChjdXJyZW50UG9zIDwgbGVuZ3RoKSB7Ci0gICAgICAgIGlmICho
YXZlU3BhY2UgJiYgIWlzTGluZVN0b3Aoc3RyaW5nW2N1cnJlbnRQb3NdKSkKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICBpZiAoaXNMaW5lU3RvcChzdHJpbmdbY3VycmVudFBvc10pKQotICAg
ICAgICAgICAgaGF2ZVNwYWNlID0gdHJ1ZTsKLSAgICAgICAgKytjdXJyZW50UG9zOwotICAgIH0K
LSAgICByZXR1cm4gY3VycmVudFBvczsKLX0KLQotaW50IExpbmVCcmVha0l0ZXJhdG9yOjpwcmV2
aW91cygpCi17Ci0gICAgaWYgKCFjdXJyZW50UG9zKSB7Ci0gICAgICAgIGN1cnJlbnRQb3MgPSAt
MTsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnRQb3M7Ci0gICAgfQotICAgIGJvb2wgaGF2ZVNwYWNl
ID0gZmFsc2U7Ci0gICAgd2hpbGUgKGN1cnJlbnRQb3MgPiAwKSB7Ci0gICAgICAgIGlmIChoYXZl
U3BhY2UgJiYgIWlzTGluZVN0b3Aoc3RyaW5nW2N1cnJlbnRQb3NdKSkKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICBpZiAoaXNMaW5lU3RvcChzdHJpbmdbY3VycmVudFBvc10pKQotICAgICAg
ICAgICAgaGF2ZVNwYWNlID0gdHJ1ZTsKLSAgICAgICAgLS1jdXJyZW50UG9zOwotICAgIH0KLSAg
ICByZXR1cm4gY3VycmVudFBvczsKLX0KLQotaW50IFNlbnRlbmNlQnJlYWtJdGVyYXRvcjo6Zmly
c3QoKQotewotICAgIGN1cnJlbnRQb3MgPSAwOwotICAgIHJldHVybiBjdXJyZW50UG9zOwotfQot
Ci1pbnQgU2VudGVuY2VCcmVha0l0ZXJhdG9yOjpuZXh0KCkKLXsKLSAgICBpZiAoY3VycmVudFBv
cyA9PSBsZW5ndGgpIHsKLSAgICAgICAgY3VycmVudFBvcyA9IC0xOwotICAgICAgICByZXR1cm4g
Y3VycmVudFBvczsKLSAgICB9Ci0gICAgYm9vbCBoYXZlU3BhY2UgPSBmYWxzZTsKLSAgICB3aGls
ZSAoY3VycmVudFBvcyA8IGxlbmd0aCkgewotICAgICAgICBpZiAoaGF2ZVNwYWNlICYmICFpc1Nl
bnRlbmNlU3RvcChzdHJpbmdbY3VycmVudFBvc10pKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIGlmIChpc1NlbnRlbmNlU3RvcChzdHJpbmdbY3VycmVudFBvc10pKQotICAgICAgICAgICAg
aGF2ZVNwYWNlID0gdHJ1ZTsKLSAgICAgICAgKytjdXJyZW50UG9zOwotICAgIH0KLSAgICByZXR1
cm4gY3VycmVudFBvczsKLX0KLQotaW50IFNlbnRlbmNlQnJlYWtJdGVyYXRvcjo6cHJldmlvdXMo
KQotewotICAgIGlmICghY3VycmVudFBvcykgewotICAgICAgICBjdXJyZW50UG9zID0gLTE7Ci0g
ICAgICAgIHJldHVybiBjdXJyZW50UG9zOwotICAgIH0KLSAgICBib29sIGhhdmVTcGFjZSA9IGZh
bHNlOwotICAgIHdoaWxlIChjdXJyZW50UG9zID4gMCkgewotICAgICAgICBpZiAoaGF2ZVNwYWNl
ICYmICFpc1NlbnRlbmNlU3RvcChzdHJpbmdbY3VycmVudFBvc10pKQotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIGlmIChpc1NlbnRlbmNlU3RvcChzdHJpbmdbY3VycmVudFBvc10pKQotICAg
ICAgICAgICAgaGF2ZVNwYWNlID0gdHJ1ZTsKLSAgICAgICAgLS1jdXJyZW50UG9zOwotICAgIH0K
LSAgICByZXR1cm4gY3VycmVudFBvczsKLX0KLQotVGV4dEJyZWFrSXRlcmF0b3IqIHdvcmRCcmVh
a0l0ZXJhdG9yKGNvbnN0IFVDaGFyKiBzdHJpbmcsIGludCBsZW5ndGgpCi17Ci0gICAgREVGSU5F
X1NUQVRJQ19MT0NBTChXb3JkQnJlYWtJdGVyYXRvciwgaXRlcmF0b3IsICgpKTsKLSAgICBpdGVy
YXRvci5yZXNldChzdHJpbmcsIGxlbmd0aCk7Ci0gICAgcmV0dXJuICZpdGVyYXRvcjsKLX0KLQot
VGV4dEJyZWFrSXRlcmF0b3IqIGNoYXJhY3RlckJyZWFrSXRlcmF0b3IoY29uc3QgVUNoYXIqIHN0
cmluZywgaW50IGxlbmd0aCkKLXsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKENoYXJCcmVha0l0
ZXJhdG9yLCBpdGVyYXRvciwgKCkpOwotICAgIGl0ZXJhdG9yLnJlc2V0KHN0cmluZywgbGVuZ3Ro
KTsKLSAgICByZXR1cm4gJml0ZXJhdG9yOwotfQotCi1UZXh0QnJlYWtJdGVyYXRvciogbGluZUJy
ZWFrSXRlcmF0b3IoY29uc3QgVUNoYXIqIHN0cmluZywgaW50IGxlbmd0aCkKLXsKLSAgICBERUZJ
TkVfU1RBVElDX0xPQ0FMKExpbmVCcmVha0l0ZXJhdG9yICwgaXRlcmF0b3IsICgpKTsKLSAgICBp
dGVyYXRvci5yZXNldChzdHJpbmcsIGxlbmd0aCk7Ci0gICAgcmV0dXJuICZpdGVyYXRvcjsKLX0K
LQotVGV4dEJyZWFrSXRlcmF0b3IqIHNlbnRlbmNlQnJlYWtJdGVyYXRvcihjb25zdCBVQ2hhciog
c3RyaW5nLCBpbnQgbGVuZ3RoKQotewotICAgIERFRklORV9TVEFUSUNfTE9DQUwoU2VudGVuY2VC
cmVha0l0ZXJhdG9yLCBpdGVyYXRvciwgKCkpOwotICAgIGl0ZXJhdG9yLnJlc2V0KHN0cmluZywg
bGVuZ3RoKTsKLSAgICByZXR1cm4gJml0ZXJhdG9yOwotfQotCi1pbnQgdGV4dEJyZWFrRmlyc3Qo
VGV4dEJyZWFrSXRlcmF0b3IqIGJyZWFrSXRlcmF0b3IpCi17Ci0gICAgcmV0dXJuIGJyZWFrSXRl
cmF0b3ItPmZpcnN0KCk7Ci19Ci0KLWludCB0ZXh0QnJlYWtOZXh0KFRleHRCcmVha0l0ZXJhdG9y
KiBicmVha0l0ZXJhdG9yKQotewotICAgIHJldHVybiBicmVha0l0ZXJhdG9yLT5uZXh0KCk7Ci19
Ci0KLWludCB0ZXh0QnJlYWtQcmVjZWRpbmcoVGV4dEJyZWFrSXRlcmF0b3IqIGJyZWFrSXRlcmF0
b3IsIGludCBwb3NpdGlvbikKLXsKLSAgICByZXR1cm4gYnJlYWtJdGVyYXRvci0+cHJlY2VkaW5n
KHBvc2l0aW9uKTsKLX0KLQotaW50IHRleHRCcmVha0ZvbGxvd2luZyhUZXh0QnJlYWtJdGVyYXRv
ciogYnJlYWtJdGVyYXRvciwgaW50IHBvc2l0aW9uKQotewotICAgIHJldHVybiBicmVha0l0ZXJh
dG9yLT5mb2xsb3dpbmcocG9zaXRpb24pOwotfQotCi1pbnQgdGV4dEJyZWFrQ3VycmVudChUZXh0
QnJlYWtJdGVyYXRvciogYnJlYWtJdGVyYXRvcikKLXsKLSAgICByZXR1cm4gYnJlYWtJdGVyYXRv
ci0+Y3VycmVudFBvczsKLX0KLQotYm9vbCBpc1RleHRCcmVhayhUZXh0QnJlYWtJdGVyYXRvcios
IGludCkKLXsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotVGV4dEJyZWFrSXRlcmF0b3IqIGN1cnNv
ck1vdmVtZW50SXRlcmF0b3IoY29uc3QgVUNoYXIqIHN0cmluZywgaW50IGxlbmd0aCkKLXsKLSAg
ICByZXR1cm4gY2hhcmFjdGVyQnJlYWtJdGVyYXRvcihzdHJpbmcsIGxlbmd0aCk7Ci19Ci0KLX0g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvQ3Vyc29y
V2luQ0UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvQ3Vyc29yV2lu
Q0UuY3BwCShyZXZpc2lvbiA1NzI4OSkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DdXJz
b3JXaW5jZS5jcHA6NTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0N1cnNvcldpbkNF
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAwOC0yMDA5IFRvcmNoIE1vYmlsZSBJbmMuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZy
ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExp
Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
cgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBs
YXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg
aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ
OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElU
WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZ
b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxl
IENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3Rv
biwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJDdXJzb3IuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdHJ1Y3QgQWxsQ3Vyc29y
cyB7CisgICAgQWxsQ3Vyc29ycygpCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8
IE51bUN1cnNvclR5cGVzOyArK2kpCisgICAgICAgICAgICBtX2N1cnNvcnNbaV0gPSAoQ3Vyc29y
VHlwZSkgaTsKKyAgICB9CisgICAgQ3Vyc29yIG1fY3Vyc29yc1tOdW1DdXJzb3JUeXBlc107Cit9
OworCitzdGF0aWMgY29uc3QgQ3Vyc29yJiBnZXRDdXJzb3IoQ3Vyc29yVHlwZSB0eXBlKQorewor
ICAgIHN0YXRpYyBBbGxDdXJzb3JzIGFsbEN1cnNvcnM7CisgICAgcmV0dXJuIGFsbEN1cnNvcnMu
bV9jdXJzb3JzW3R5cGVdOworfQorCitDdXJzb3I6OkN1cnNvcihjb25zdCBDdXJzb3ImIG90aGVy
KQorOiBtX2ltcGwob3RoZXIubV9pbXBsKQoreworfQorCitDdXJzb3I6OkN1cnNvcihJbWFnZSog
aW1nLCBjb25zdCBJbnRQb2ludCYgaG90c3BvdCkKKzogbV9pbXBsKEN1cnNvck5vbmUpCit7Cit9
CisKK0N1cnNvcjo6fkN1cnNvcigpCit7Cit9CisKK0N1cnNvciYgQ3Vyc29yOjpvcGVyYXRvcj0o
Y29uc3QgQ3Vyc29yJiBvdGhlcikKK3sKKyAgICBtX2ltcGwgPSBvdGhlci5tX2ltcGw7CisgICAg
cmV0dXJuICp0aGlzOworfQorCitDdXJzb3I6OkN1cnNvcihQbGF0Zm9ybUN1cnNvciBjKQorOiBt
X2ltcGwoYykKK3sKK30KKworY29uc3QgQ3Vyc29yJiBub25lQ3Vyc29yKCkgeyByZXR1cm4gZ2V0
Q3Vyc29yKEN1cnNvck5vbmUpOyB9Citjb25zdCBDdXJzb3ImIHBvaW50ZXJDdXJzb3IoKSB7IHJl
dHVybiBnZXRDdXJzb3IoQ3Vyc29yUG9pbnRlcik7IH0KK2NvbnN0IEN1cnNvciYgY3Jvc3NDdXJz
b3IoKSAgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvckNyb3NzKTsgfQorY29uc3QgQ3Vyc29yJiBo
YW5kQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvckhhbmQpOyB9Citjb25zdCBDdXJz
b3ImIGlCZWFtQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvckJlYW0pOyB9Citjb25z
dCBDdXJzb3ImIHdhaXRDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yV2FpdCk7IH0K
K2NvbnN0IEN1cnNvciYgaGVscEN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JIZWxw
KTsgfQorY29uc3QgQ3Vyc29yJiBtb3ZlQ3Vyc29yKCkgIHsgcmV0dXJuIGdldEN1cnNvcihDdXJz
b3JNb3ZlKTsgfQorY29uc3QgQ3Vyc29yJiBlYXN0UmVzaXplQ3Vyc29yKCkgeyByZXR1cm4gZ2V0
Q3Vyc29yKEN1cnNvckVhc3RSZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIG5vcnRoUmVzaXplQ3Vy
c29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvck5vcnRoUmVzaXplKTsgfQorY29uc3QgQ3Vy
c29yJiBub3J0aEVhc3RSZXNpemVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yTm9y
dGhFYXN0UmVzaXplKTsgfQorY29uc3QgQ3Vyc29yJiBub3J0aFdlc3RSZXNpemVDdXJzb3IoKSB7
IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yTm9ydGhXZXN0UmVzaXplKTsgfQorY29uc3QgQ3Vyc29y
JiBzb3V0aFJlc2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JTb3V0aFJlc2l6
ZSk7IH0KK2NvbnN0IEN1cnNvciYgc291dGhFYXN0UmVzaXplQ3Vyc29yKCkgeyByZXR1cm4gZ2V0
Q3Vyc29yKEN1cnNvclNvdXRoRWFzdFJlc2l6ZSk7IH0KK2NvbnN0IEN1cnNvciYgc291dGhXZXN0
UmVzaXplQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvclNvdXRoV2VzdFJlc2l6ZSk7
IH0KK2NvbnN0IEN1cnNvciYgd2VzdFJlc2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihD
dXJzb3JXZXN0UmVzaXplKTsgfQorY29uc3QgQ3Vyc29yJiBub3J0aFNvdXRoUmVzaXplQ3Vyc29y
KCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvck5vcnRoU291dGhSZXNpemUpOyB9Citjb25zdCBD
dXJzb3ImIGVhc3RXZXN0UmVzaXplQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvckVh
c3RXZXN0UmVzaXplKTsgfQorY29uc3QgQ3Vyc29yJiBub3J0aEVhc3RTb3V0aFdlc3RSZXNpemVD
dXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yTm9ydGhFYXN0U291dGhXZXN0UmVzaXpl
KTsgfQorY29uc3QgQ3Vyc29yJiBub3J0aFdlc3RTb3V0aEVhc3RSZXNpemVDdXJzb3IoKSB7IHJl
dHVybiBnZXRDdXJzb3IoQ3Vyc29yTm9ydGhXZXN0U291dGhFYXN0UmVzaXplKTsgfQorY29uc3Qg
Q3Vyc29yJiBjb2x1bW5SZXNpemVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yQ29s
dW1uUmVzaXplKTsgfQorY29uc3QgQ3Vyc29yJiByb3dSZXNpemVDdXJzb3IoKSB7IHJldHVybiBn
ZXRDdXJzb3IoQ3Vyc29yUm93UmVzaXplKTsgfQorY29uc3QgQ3Vyc29yJiB2ZXJ0aWNhbFRleHRD
dXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yVmVydGljYWxUZXh0KTsgfQorY29uc3Qg
Q3Vyc29yJiBjZWxsQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvckNlbGwpOyB9Citj
b25zdCBDdXJzb3ImIGNvbnRleHRNZW51Q3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNv
ckNvbnRleHRNZW51KTsgfQorY29uc3QgQ3Vyc29yJiBub0Ryb3BDdXJzb3IoKSB7IHJldHVybiBn
ZXRDdXJzb3IoQ3Vyc29yTm9Ecm9wKTsgfQorY29uc3QgQ3Vyc29yJiBub3RBbGxvd2VkQ3Vyc29y
KCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvck5vdEFsbG93ZWQpOyB9Citjb25zdCBDdXJzb3Im
IHByb2dyZXNzQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvclByb2dyZXNzKTsgfQor
Y29uc3QgQ3Vyc29yJiBhbGlhc0N1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JBbGlh
cyk7IH0KK2NvbnN0IEN1cnNvciYgem9vbUluQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1
cnNvclpvb21Jbik7IH0KK2NvbnN0IEN1cnNvciYgem9vbU91dEN1cnNvcigpIHsgcmV0dXJuIGdl
dEN1cnNvcihDdXJzb3Jab29tT3V0KTsgfQorY29uc3QgQ3Vyc29yJiBjb3B5Q3Vyc29yKCkgeyBy
ZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvckNvcHkpOyB9Citjb25zdCBDdXJzb3ImIG1pZGRsZVBhbm5p
bmdDdXJzb3IoKSB7IHJldHVybiBjcm9zc0N1cnNvcigpOyB9Citjb25zdCBDdXJzb3ImIGVhc3RQ
YW5uaW5nQ3Vyc29yKCkgeyByZXR1cm4gY3Jvc3NDdXJzb3IoKTsgfQorY29uc3QgQ3Vyc29yJiBu
b3J0aFBhbm5pbmdDdXJzb3IoKSB7IHJldHVybiBjcm9zc0N1cnNvcigpOyB9Citjb25zdCBDdXJz
b3ImIG5vcnRoRWFzdFBhbm5pbmdDdXJzb3IoKSB7IHJldHVybiBjcm9zc0N1cnNvcigpOyB9Citj
b25zdCBDdXJzb3ImIG5vcnRoV2VzdFBhbm5pbmdDdXJzb3IoKSB7IHJldHVybiBjcm9zc0N1cnNv
cigpOyB9Citjb25zdCBDdXJzb3ImIHNvdXRoUGFubmluZ0N1cnNvcigpIHsgcmV0dXJuIGNyb3Nz
Q3Vyc29yKCk7IH0KK2NvbnN0IEN1cnNvciYgc291dGhFYXN0UGFubmluZ0N1cnNvcigpIHsgcmV0
dXJuIGNyb3NzQ3Vyc29yKCk7IH0KK2NvbnN0IEN1cnNvciYgc291dGhXZXN0UGFubmluZ0N1cnNv
cigpIHsgcmV0dXJuIGNyb3NzQ3Vyc29yKCk7IH0KK2NvbnN0IEN1cnNvciYgd2VzdFBhbm5pbmdD
dXJzb3IoKSB7IHJldHVybiBjcm9zc0N1cnNvcigpOyB9Citjb25zdCBDdXJzb3ImIGdyYWJiaW5n
Q3Vyc29yKCkgeyByZXR1cm4gbW92ZUN1cnNvcigpOyB9Citjb25zdCBDdXJzb3ImIGdyYWJDdXJz
b3IoKSB7IHJldHVybiBtb3ZlQ3Vyc29yKCk7IH0KKworfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9y
bS93aW5jZS9DdXJzb3JXaW5DRS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93
aW5jZS9DdXJzb3JXaW5DRS5jcHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9y
bS93aW5jZS9DdXJzb3JXaW5DRS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEwNiw0ICsxMDYsNCBA
QCBjb25zdCBDdXJzb3ImIHdlc3RQYW5uaW5nQ3Vyc29yKCkgeyByZXR1CiBjb25zdCBDdXJzb3Im
IGdyYWJiaW5nQ3Vyc29yKCkgeyByZXR1cm4gbW92ZUN1cnNvcigpOyB9CiBjb25zdCBDdXJzb3Im
IGdyYWJDdXJzb3IoKSB7IHJldHVybiBtb3ZlQ3Vyc29yKCk7IH0KIAotfQorfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DdXJzb3JXaW5jZS5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DdXJzb3JXaW5jZS5jcHAJKHJl
dmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DdXJzb3JXaW5jZS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIw
MDgtMjAwOSBUb3JjaCBNb2JpbGUgSW5jLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNv
ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNl
IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAq
IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg
dmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg
dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0
aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3Ig
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGlicmFy
eSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNo
b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZ
SU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
b24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0gKiBCb3N0b24sIE1B
IDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAi
Q3Vyc29yLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotc3RydWN0IEFsbEN1cnNvcnMgewot
ICAgIEFsbEN1cnNvcnMoKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOdW1D
dXJzb3JUeXBlczsgKytpKQotICAgICAgICAgICAgbV9jdXJzb3JzW2ldID0gKEN1cnNvclR5cGUp
IGk7Ci0gICAgfQotICAgIEN1cnNvciBtX2N1cnNvcnNbTnVtQ3Vyc29yVHlwZXNdOwotfTsKLQot
c3RhdGljIGNvbnN0IEN1cnNvciYgZ2V0Q3Vyc29yKEN1cnNvclR5cGUgdHlwZSkKLXsKLSAgICBz
dGF0aWMgQWxsQ3Vyc29ycyBhbGxDdXJzb3JzOwotICAgIHJldHVybiBhbGxDdXJzb3JzLm1fY3Vy
c29yc1t0eXBlXTsKLX0KLQotQ3Vyc29yOjpDdXJzb3IoY29uc3QgQ3Vyc29yJiBvdGhlcikKLTog
bV9pbXBsKG90aGVyLm1faW1wbCkKLXsKLX0KLQotQ3Vyc29yOjpDdXJzb3IoSW1hZ2UqIGltZywg
Y29uc3QgSW50UG9pbnQmIGhvdHNwb3QpCi06IG1faW1wbChDdXJzb3JOb25lKQotewotfQotCi1D
dXJzb3I6On5DdXJzb3IoKQotewotfQotCi1DdXJzb3ImIEN1cnNvcjo6b3BlcmF0b3I9KGNvbnN0
IEN1cnNvciYgb3RoZXIpCi17Ci0gICAgbV9pbXBsID0gb3RoZXIubV9pbXBsOwotICAgIHJldHVy
biAqdGhpczsKLX0KLQotQ3Vyc29yOjpDdXJzb3IoUGxhdGZvcm1DdXJzb3IgYykKLTogbV9pbXBs
KGMpCi17Ci19Ci0KLWNvbnN0IEN1cnNvciYgbm9uZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNv
cihDdXJzb3JOb25lKTsgfQotY29uc3QgQ3Vyc29yJiBwb2ludGVyQ3Vyc29yKCkgeyByZXR1cm4g
Z2V0Q3Vyc29yKEN1cnNvclBvaW50ZXIpOyB9Ci1jb25zdCBDdXJzb3ImIGNyb3NzQ3Vyc29yKCkg
IHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JDcm9zcyk7IH0KLWNvbnN0IEN1cnNvciYgaGFuZEN1
cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JIYW5kKTsgfQotY29uc3QgQ3Vyc29yJiBp
QmVhbUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JCZWFtKTsgfQotY29uc3QgQ3Vy
c29yJiB3YWl0Q3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvcldhaXQpOyB9Ci1jb25z
dCBDdXJzb3ImIGhlbHBDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29ySGVscCk7IH0K
LWNvbnN0IEN1cnNvciYgbW92ZUN1cnNvcigpICB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yTW92
ZSk7IH0KLWNvbnN0IEN1cnNvciYgZWFzdFJlc2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNv
cihDdXJzb3JFYXN0UmVzaXplKTsgfQotY29uc3QgQ3Vyc29yJiBub3J0aFJlc2l6ZUN1cnNvcigp
IHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JOb3J0aFJlc2l6ZSk7IH0KLWNvbnN0IEN1cnNvciYg
bm9ydGhFYXN0UmVzaXplQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvck5vcnRoRWFz
dFJlc2l6ZSk7IH0KLWNvbnN0IEN1cnNvciYgbm9ydGhXZXN0UmVzaXplQ3Vyc29yKCkgeyByZXR1
cm4gZ2V0Q3Vyc29yKEN1cnNvck5vcnRoV2VzdFJlc2l6ZSk7IH0KLWNvbnN0IEN1cnNvciYgc291
dGhSZXNpemVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yU291dGhSZXNpemUpOyB9
Ci1jb25zdCBDdXJzb3ImIHNvdXRoRWFzdFJlc2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNv
cihDdXJzb3JTb3V0aEVhc3RSZXNpemUpOyB9Ci1jb25zdCBDdXJzb3ImIHNvdXRoV2VzdFJlc2l6
ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JTb3V0aFdlc3RSZXNpemUpOyB9Ci1j
b25zdCBDdXJzb3ImIHdlc3RSZXNpemVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29y
V2VzdFJlc2l6ZSk7IH0KLWNvbnN0IEN1cnNvciYgbm9ydGhTb3V0aFJlc2l6ZUN1cnNvcigpIHsg
cmV0dXJuIGdldEN1cnNvcihDdXJzb3JOb3J0aFNvdXRoUmVzaXplKTsgfQotY29uc3QgQ3Vyc29y
JiBlYXN0V2VzdFJlc2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JFYXN0V2Vz
dFJlc2l6ZSk7IH0KLWNvbnN0IEN1cnNvciYgbm9ydGhFYXN0U291dGhXZXN0UmVzaXplQ3Vyc29y
KCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvck5vcnRoRWFzdFNvdXRoV2VzdFJlc2l6ZSk7IH0K
LWNvbnN0IEN1cnNvciYgbm9ydGhXZXN0U291dGhFYXN0UmVzaXplQ3Vyc29yKCkgeyByZXR1cm4g
Z2V0Q3Vyc29yKEN1cnNvck5vcnRoV2VzdFNvdXRoRWFzdFJlc2l6ZSk7IH0KLWNvbnN0IEN1cnNv
ciYgY29sdW1uUmVzaXplQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvckNvbHVtblJl
c2l6ZSk7IH0KLWNvbnN0IEN1cnNvciYgcm93UmVzaXplQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vy
c29yKEN1cnNvclJvd1Jlc2l6ZSk7IH0KLWNvbnN0IEN1cnNvciYgdmVydGljYWxUZXh0Q3Vyc29y
KCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvclZlcnRpY2FsVGV4dCk7IH0KLWNvbnN0IEN1cnNv
ciYgY2VsbEN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JDZWxsKTsgfQotY29uc3Qg
Q3Vyc29yJiBjb250ZXh0TWVudUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JDb250
ZXh0TWVudSk7IH0KLWNvbnN0IEN1cnNvciYgbm9Ecm9wQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vy
c29yKEN1cnNvck5vRHJvcCk7IH0KLWNvbnN0IEN1cnNvciYgbm90QWxsb3dlZEN1cnNvcigpIHsg
cmV0dXJuIGdldEN1cnNvcihDdXJzb3JOb3RBbGxvd2VkKTsgfQotY29uc3QgQ3Vyc29yJiBwcm9n
cmVzc0N1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JQcm9ncmVzcyk7IH0KLWNvbnN0
IEN1cnNvciYgYWxpYXNDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yQWxpYXMpOyB9
Ci1jb25zdCBDdXJzb3ImIHpvb21JbkN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3Ja
b29tSW4pOyB9Ci1jb25zdCBDdXJzb3ImIHpvb21PdXRDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJz
b3IoQ3Vyc29yWm9vbU91dCk7IH0KLWNvbnN0IEN1cnNvciYgY29weUN1cnNvcigpIHsgcmV0dXJu
IGdldEN1cnNvcihDdXJzb3JDb3B5KTsgfQotY29uc3QgQ3Vyc29yJiBtaWRkbGVQYW5uaW5nQ3Vy
c29yKCkgeyByZXR1cm4gY3Jvc3NDdXJzb3IoKTsgfQotY29uc3QgQ3Vyc29yJiBlYXN0UGFubmlu
Z0N1cnNvcigpIHsgcmV0dXJuIGNyb3NzQ3Vyc29yKCk7IH0KLWNvbnN0IEN1cnNvciYgbm9ydGhQ
YW5uaW5nQ3Vyc29yKCkgeyByZXR1cm4gY3Jvc3NDdXJzb3IoKTsgfQotY29uc3QgQ3Vyc29yJiBu
b3J0aEVhc3RQYW5uaW5nQ3Vyc29yKCkgeyByZXR1cm4gY3Jvc3NDdXJzb3IoKTsgfQotY29uc3Qg
Q3Vyc29yJiBub3J0aFdlc3RQYW5uaW5nQ3Vyc29yKCkgeyByZXR1cm4gY3Jvc3NDdXJzb3IoKTsg
fQotY29uc3QgQ3Vyc29yJiBzb3V0aFBhbm5pbmdDdXJzb3IoKSB7IHJldHVybiBjcm9zc0N1cnNv
cigpOyB9Ci1jb25zdCBDdXJzb3ImIHNvdXRoRWFzdFBhbm5pbmdDdXJzb3IoKSB7IHJldHVybiBj
cm9zc0N1cnNvcigpOyB9Ci1jb25zdCBDdXJzb3ImIHNvdXRoV2VzdFBhbm5pbmdDdXJzb3IoKSB7
IHJldHVybiBjcm9zc0N1cnNvcigpOyB9Ci1jb25zdCBDdXJzb3ImIHdlc3RQYW5uaW5nQ3Vyc29y
KCkgeyByZXR1cm4gY3Jvc3NDdXJzb3IoKTsgfQotY29uc3QgQ3Vyc29yJiBncmFiYmluZ0N1cnNv
cigpIHsgcmV0dXJuIG1vdmVDdXJzb3IoKTsgfQotY29uc3QgQ3Vyc29yJiBncmFiQ3Vyc29yKCkg
eyByZXR1cm4gbW92ZUN1cnNvcigpOyB9Ci0KLX0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2lu
Y2UvRHJhZ0RhdGFXaW5DRS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW5j
ZS9EcmFnRGF0YVdpbkNFLmNwcAkocmV2aXNpb24gNTcyODkpCShmcm9tIFdlYkNvcmUvcGxhdGZv
cm0vd2luY2UvRHJhZ0RhdGFXaW5jZS5jcHA6NTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dp
bmNlL0RyYWdEYXRhV2luQ0UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsOTAgQEAKKy8q
CisgKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICog
IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3Ig
KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5
IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAg
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm
b3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0
aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUg
dG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBT
dHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoK
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRHJhZ0RhdGEuaCIKKworI2lu
Y2x1ZGUgIkNsaXBib2FyZC5oIgorI2luY2x1ZGUgIkRvY3VtZW50RnJhZ21lbnQuaCIKKyNpbmNs
dWRlICJQbGF0Zm9ybVN0cmluZy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1Bhc3NSZWZQ
dHI8Q2xpcGJvYXJkPiBEcmFnRGF0YTo6Y3JlYXRlQ2xpcGJvYXJkKENsaXBib2FyZEFjY2Vzc1Bv
bGljeSBwb2xpY3kpIGNvbnN0Cit7CisgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgRHJhZ0RhdGE6
OmNvbnRhaW5zVVJMKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1N0cmluZyBE
cmFnRGF0YTo6YXNVUkwoU3RyaW5nKiB0aXRsZSkgY29uc3QKK3sKKyAgICByZXR1cm4gU3RyaW5n
KCk7Cit9CisKK2Jvb2wgRHJhZ0RhdGE6OmNvbnRhaW5zRmlsZXMoKSBjb25zdAoreworICAgIHJl
dHVybiBmYWxzZTsKK30KKwordm9pZCBEcmFnRGF0YTo6YXNGaWxlbmFtZXMoVmVjdG9yPFN0cmlu
Zz4mKSBjb25zdAoreworfQorCitib29sIERyYWdEYXRhOjpjb250YWluc1BsYWluVGV4dCgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitTdHJpbmcgRHJhZ0RhdGE6OmFzUGxhaW5U
ZXh0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gU3RyaW5nKCk7Cit9CisKK2Jvb2wgRHJhZ0RhdGE6
OmNvbnRhaW5zQ29sb3IoKSBjb25zdAoreworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBE
cmFnRGF0YTo6Y2FuU21hcnRSZXBsYWNlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9
CisKK2Jvb2wgRHJhZ0RhdGE6OmNvbnRhaW5zQ29tcGF0aWJsZUNvbnRlbnQoKSBjb25zdAorewor
ICAgIHJldHVybiBmYWxzZTsKK30KKworUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBEcmFn
RGF0YTo6YXNGcmFnbWVudChEb2N1bWVudCogZG9jKSBjb25zdAoreworICAgICByZXR1cm4gMDsK
K30KKworQ29sb3IgRHJhZ0RhdGE6OmFzQ29sb3IoKSBjb25zdAoreworICAgIHJldHVybiBDb2xv
cigpOworfQorCit9CisKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvRHJhZ0RhdGFXaW5D
RS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9EcmFnRGF0YVdpbkNF
LmNwcAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0RyYWdEYXRh
V2luQ0UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04Niw1ICs4Niw0IEBAIENvbG9yIERyYWdEYXRh
Ojphc0NvbG9yKCkgY29uc3QKICAgICByZXR1cm4gQ29sb3IoKTsKIH0KIAotfQotCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0RyYWdEYXRhV2lu
Y2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvRHJhZ0RhdGFXaW5j
ZS5jcHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9EcmFnRGF0
YVdpbmNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw5MCArMCwwIEBACi0vKgotICogIENvcHly
aWdodCAoQykgMjAwNy0yMDA4IFRvcmNoIE1vYmlsZSwgSW5jLgotICoKLSAqICBUaGlzIGxpYnJh
cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAg
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMKLSAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uOyBlaXRoZXIKLSAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmli
dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VU
IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAg
TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl
IHRoZSBHTlUKLSAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0
YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBsaWJy
YXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiAgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0
aCBGbG9vciwKLSAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqCi0gKi8KLQotI2lu
Y2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkRyYWdEYXRhLmgiCi0KLSNpbmNsdWRlICJDbGlw
Ym9hcmQuaCIKLSNpbmNsdWRlICJEb2N1bWVudEZyYWdtZW50LmgiCi0jaW5jbHVkZSAiUGxhdGZv
cm1TdHJpbmcuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1QYXNzUmVmUHRyPENsaXBib2Fy
ZD4gRHJhZ0RhdGE6OmNyZWF0ZUNsaXBib2FyZChDbGlwYm9hcmRBY2Nlc3NQb2xpY3kgcG9saWN5
KSBjb25zdAotewotICAgIHJldHVybiAwOwotfQotCi1ib29sIERyYWdEYXRhOjpjb250YWluc1VS
TCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1TdHJpbmcgRHJhZ0RhdGE6OmFz
VVJMKFN0cmluZyogdGl0bGUpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIFN0cmluZygpOwotfQotCi1i
b29sIERyYWdEYXRhOjpjb250YWluc0ZpbGVzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZmFsc2U7
Ci19Ci0KLXZvaWQgRHJhZ0RhdGE6OmFzRmlsZW5hbWVzKFZlY3RvcjxTdHJpbmc+JikgY29uc3QK
LXsKLX0KLQotYm9vbCBEcmFnRGF0YTo6Y29udGFpbnNQbGFpblRleHQoKSBjb25zdAotewotICAg
IHJldHVybiBmYWxzZTsKLX0KLQotU3RyaW5nIERyYWdEYXRhOjphc1BsYWluVGV4dCgpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIFN0cmluZygpOwotfQotCi1ib29sIERyYWdEYXRhOjpjb250YWluc0Nv
bG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgRHJhZ0RhdGE6OmNh
blNtYXJ0UmVwbGFjZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIERy
YWdEYXRhOjpjb250YWluc0NvbXBhdGlibGVDb250ZW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4g
ZmFsc2U7Ci19Ci0KLVBhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gRHJhZ0RhdGE6OmFzRnJh
Z21lbnQoRG9jdW1lbnQqIGRvYykgY29uc3QKLXsKLSAgICAgcmV0dXJuIDA7Ci19Ci0KLUNvbG9y
IERyYWdEYXRhOjphc0NvbG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gQ29sb3IoKTsKLX0KLQot
fQotCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0RyYWdJbWFnZVdpbkNFLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0RyYWdJbWFnZVdpbkNFLmNwcAkocmV2
aXNpb24gNTcyODkpCShmcm9tIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvRHJhZ0ltYWdlV2luY2Uu
Y3BwOjU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9EcmFnSW1hZ2VXaW5DRS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIw
MDctMjAwOCBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGlj
ZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy
CisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBs
YXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhl
IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFO
VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
KiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgor
ICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRo
ZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisg
KiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJEcmFnSW1hZ2UuaCIKKworI2luY2x1ZGUgIkNhY2hlZEltYWdlLmgi
CisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiSW1hZ2UuaCIKKworI2lu
Y2x1ZGUgPHdpbmRvd3MuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitJbnRTaXplIGRyYWdJ
bWFnZVNpemUoRHJhZ0ltYWdlUmVmKQoreworICAgIHJldHVybiBJbnRTaXplKDAsIDApOworfQor
Cit2b2lkIGRlbGV0ZURyYWdJbWFnZShEcmFnSW1hZ2VSZWYgaW1hZ2UpCit7CisgICAgaWYgKGlt
YWdlKQorICAgICAgICA6OkRlbGV0ZU9iamVjdChpbWFnZSk7Cit9CisKK0RyYWdJbWFnZVJlZiBz
Y2FsZURyYWdJbWFnZShEcmFnSW1hZ2VSZWYsIEZsb2F0U2l6ZSkKK3sKKyAgICByZXR1cm4gMDsK
K30KKworRHJhZ0ltYWdlUmVmIGRpc3NvbHZlRHJhZ0ltYWdlVG9GcmFjdGlvbihEcmFnSW1hZ2VS
ZWYgaW1hZ2UsIGZsb2F0KQoreworICAgIHJldHVybiBpbWFnZTsKK30KKworRHJhZ0ltYWdlUmVm
IGNyZWF0ZURyYWdJbWFnZUZyb21JbWFnZShJbWFnZSopCit7CisgICAgcmV0dXJuIDA7Cit9CisK
K0RyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VJY29uRm9yQ2FjaGVkSW1hZ2UoQ2FjaGVkSW1h
Z2UqKQoreworICAgIHJldHVybiAwOworfQorCit9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dp
bmNlL0RyYWdJbWFnZVdpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3dp
bmNlL0RyYWdJbWFnZVdpbkNFLmNwcAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL3dpbmNlL0RyYWdJbWFnZVdpbkNFLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjAsNCArNjAs
NCBAQCBEcmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlSWNvbkZvckNhY2hlCiAgICAgcmV0dXJu
IDA7CiB9CiAKLX0KK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZv
cm0vd2luY2UvRHJhZ0ltYWdlV2luY2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZv
cm0vd2luY2UvRHJhZ0ltYWdlV2luY2UuY3BwCShyZXZpc2lvbiA1NzI4OSkKKysrIFdlYkNvcmUv
cGxhdGZvcm0vd2luY2UvRHJhZ0ltYWdlV2luY2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDYz
ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVG9yY2ggTW9iaWxlLCBJ
bmMuCi0gKgotICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IKLSAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogIHZlcnNpb24gMiBvZiB0aGUg
TGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAg
VGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt
cGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0g
KiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElm
IG5vdCwgd3JpdGUgdG8KLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1
MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICogIEJvc3RvbiwgTUEgMDIxMTAtMTMw
MSwgVVNBLgotICoKLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiRHJhZ0lt
YWdlLmgiCi0KLSNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgotI2luY2x1ZGUgIkdyYXBoaWNzQ29u
dGV4dC5oIgotI2luY2x1ZGUgIkltYWdlLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLW5h
bWVzcGFjZSBXZWJDb3JlIHsKLQotSW50U2l6ZSBkcmFnSW1hZ2VTaXplKERyYWdJbWFnZVJlZikK
LXsKLSAgICByZXR1cm4gSW50U2l6ZSgwLCAwKTsKLX0KLQotdm9pZCBkZWxldGVEcmFnSW1hZ2Uo
RHJhZ0ltYWdlUmVmIGltYWdlKQotewotICAgIGlmIChpbWFnZSkKLSAgICAgICAgOjpEZWxldGVP
YmplY3QoaW1hZ2UpOwotfQotCi1EcmFnSW1hZ2VSZWYgc2NhbGVEcmFnSW1hZ2UoRHJhZ0ltYWdl
UmVmLCBGbG9hdFNpemUpCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLURyYWdJbWFnZVJlZiBkaXNz
b2x2ZURyYWdJbWFnZVRvRnJhY3Rpb24oRHJhZ0ltYWdlUmVmIGltYWdlLCBmbG9hdCkKLXsKLSAg
ICByZXR1cm4gaW1hZ2U7Ci19Ci0KLURyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VGcm9tSW1h
Z2UoSW1hZ2UqKQotewotICAgIHJldHVybiAwOwotfQotCi1EcmFnSW1hZ2VSZWYgY3JlYXRlRHJh
Z0ltYWdlSWNvbkZvckNhY2hlZEltYWdlKENhY2hlZEltYWdlKikKLXsKLSAgICByZXR1cm4gMDsK
LX0KLQotfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9FZGl0b3JXaW5DRS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9FZGl0b3JXaW5DRS5jcHAJKHJldmlz
aW9uIDU3Mjg5KQkoZnJvbSBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0VkaXRvcldpbmNlLmNwcDo1
NzI4OSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvRWRpdG9yV2luQ0UuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDgg
VG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJl
OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZl
cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy
c2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo
YXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo
b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3Ig
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ug
c2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBD
T1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3Rv
biwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisK
KyNpbmNsdWRlICJFZGl0b3IuaCIKKworI2luY2x1ZGUgIkNsaXBib2FyZFdpbmNlLmgiCisjaW5j
bHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJFZGl0b3JDbGllbnQuaCIKKyNpbmNsdWRlICJF
bGVtZW50LmgiCisjaW5jbHVkZSAiSHRtbEVkaXRpbmcuaCIKKyNpbmNsdWRlICJUZXh0SXRlcmF0
b3IuaCIKKyNpbmNsdWRlICJ2aXNpYmxlX3VuaXRzLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+
CisjZGVmaW5lIF9TWVNfR1VJRF9PUEVSQVRPUlNfCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
UGFzc1JlZlB0cjxDbGlwYm9hcmQ+IEVkaXRvcjo6bmV3R2VuZXJhbENsaXBib2FyZChDbGlwYm9h
cmRBY2Nlc3NQb2xpY3kgcG9saWN5KQoreworICAgIHJldHVybiBhZG9wdFJlZihuZXcgQ2xpcGJv
YXJkV2luY2UocG9saWN5LCBmYWxzZSkpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCklu
ZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0VkaXRvcldpbkNFLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0VkaXRvcldpbkNFLmNwcAkocmV2aXNpb24gNTcyODkp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0VkaXRvcldpbkNFLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVkZSAiRWRpdG9yLmgiCiAKLSNpbmNsdWRlICJD
bGlwYm9hcmRXaW5jZS5oIgorI2luY2x1ZGUgIkNsaXBib2FyZFdpbkNFLmgiCiAjaW5jbHVkZSAi
RG9jdW1lbnQuaCIKICNpbmNsdWRlICJFZGl0b3JDbGllbnQuaCIKICNpbmNsdWRlICJFbGVtZW50
LmgiCkBAIC0zNyw3ICszNyw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogUGFzc1JlZlB0cjxD
bGlwYm9hcmQ+IEVkaXRvcjo6bmV3R2VuZXJhbENsaXBib2FyZChDbGlwYm9hcmRBY2Nlc3NQb2xp
Y3kgcG9saWN5KQogewotICAgIHJldHVybiBhZG9wdFJlZihuZXcgQ2xpcGJvYXJkV2luY2UocG9s
aWN5LCBmYWxzZSkpOworICAgIHJldHVybiBhZG9wdFJlZihuZXcgQ2xpcGJvYXJkV2luQ0UocG9s
aWN5LCBmYWxzZSkpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3Jl
L3BsYXRmb3JtL3dpbmNlL0VkaXRvcldpbmNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Bs
YXRmb3JtL3dpbmNlL0VkaXRvcldpbmNlLmNwcAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3Jl
L3BsYXRmb3JtL3dpbmNlL0VkaXRvcldpbmNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw0MyAr
MCwwIEBACi0vKgotICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRvcmNoIE1vYmlsZSwgSW5j
LgotICoKLSAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCi0gKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqICB2ZXJzaW9uIDIgb2YgdGhlIExp
Y2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRo
aXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl
ZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs
aWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2Vp
dmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICog
IGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBu
b3QsIHdyaXRlIHRvCi0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEg
RnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEs
IFVTQS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSAiRWRpdG9y
LmgiCi0KLSNpbmNsdWRlICJDbGlwYm9hcmRXaW5jZS5oIgotI2luY2x1ZGUgIkRvY3VtZW50Lmgi
Ci0jaW5jbHVkZSAiRWRpdG9yQ2xpZW50LmgiCi0jaW5jbHVkZSAiRWxlbWVudC5oIgotI2luY2x1
ZGUgIkh0bWxFZGl0aW5nLmgiCi0jaW5jbHVkZSAiVGV4dEl0ZXJhdG9yLmgiCi0jaW5jbHVkZSAi
dmlzaWJsZV91bml0cy5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2RlZmluZSBfU1lTX0dV
SURfT1BFUkFUT1JTXwotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLVBhc3NSZWZQdHI8Q2xpcGJv
YXJkPiBFZGl0b3I6Om5ld0dlbmVyYWxDbGlwYm9hcmQoQ2xpcGJvYXJkQWNjZXNzUG9saWN5IHBv
bGljeSkKLXsKLSAgICByZXR1cm4gYWRvcHRSZWYobmV3IENsaXBib2FyZFdpbmNlKHBvbGljeSwg
ZmFsc2UpKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0
Zm9ybS93aW5jZS9GaWxlQ2hvb3NlcldpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Bs
YXRmb3JtL3dpbmNlL0ZpbGVDaG9vc2VyV2luQ0UuY3BwCShyZXZpc2lvbiA1NzI4OSkJKGZyb20g
V2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9GaWxlQ2hvb3NlcldpbmNlLmNwcDo1NzI4OSkKKysrIFdl
YkNvcmUvcGxhdGZvcm0vd2luY2UvRmlsZUNob29zZXJXaW5DRS5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3Jj
aCBNb2JpbGUsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZp
bGVDaG9vc2VyLmgiCisKKyNpbmNsdWRlICJDaHJvbWUuaCIKKyNpbmNsdWRlICJDaHJvbWVDbGll
bnQuaCIKKyNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVk
ZSAiSWNvbi5oIgorI2luY2x1ZGUgIkxvY2FsaXplZFN0cmluZ3MuaCIKKyNpbmNsdWRlICJQYWdl
LmgiCisjaW5jbHVkZSAiU3RyaW5nVHJ1bmNhdG9yLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworU3RyaW5nIHBhdGhHZXRGaWxlTmFtZShjb25zdCBTdHJpbmcmIHBhdGgpOworCitTdHJpbmcg
RmlsZUNob29zZXI6OmJhc2VuYW1lRm9yV2lkdGgoY29uc3QgRm9udCYgZm9udCwgaW50IHdpZHRo
KSBjb25zdAoreworICAgIGlmICh3aWR0aCA8PSAwKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7
CisKKyAgICBTdHJpbmcgc3RyaW5nOworICAgIGlmIChtX2ZpbGVuYW1lcy5pc0VtcHR5KCkpCisg
ICAgICAgIHN0cmluZyA9IGZpbGVCdXR0b25Ob0ZpbGVTZWxlY3RlZExhYmVsKCk7CisgICAgZWxz
ZSBpZiAobV9maWxlbmFtZXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgU3RyaW5nIHRtcEZpbGVu
YW1lID0gbV9maWxlbmFtZXNbMF07CisgICAgICAgIHN0cmluZyA9IHBhdGhHZXRGaWxlTmFtZSh0
bXBGaWxlbmFtZSk7CisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBTdHJpbmdUcnVuY2F0b3I6
OnJpZ2h0VHJ1bmNhdGUoU3RyaW5nOjpudW1iZXIobV9maWxlbmFtZXMuc2l6ZSgpKSArICIgZmls
ZXMiLCB3aWR0aCwgZm9udCwgZmFsc2UpOworCisgICAgcmV0dXJuIFN0cmluZ1RydW5jYXRvcjo6
Y2VudGVyVHJ1bmNhdGUoc3RyaW5nLCB3aWR0aCwgZm9udCwgZmFsc2UpOworfQorCit9CkluZGV4
OiBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0ZpbGVDaG9vc2VyV2luQ0UuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvRmlsZUNob29zZXJXaW5DRS5jcHAJKHJldmlzaW9u
IDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9GaWxlQ2hvb3NlcldpbkNFLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNTcsNCArNTcsNCBAQCBTdHJpbmcgRmlsZUNob29zZXI6OmJhc2Vu
YW1lRm9yV2lkdGgoY29uCiAgICAgcmV0dXJuIFN0cmluZ1RydW5jYXRvcjo6Y2VudGVyVHJ1bmNh
dGUoc3RyaW5nLCB3aWR0aCwgZm9udCwgZmFsc2UpOwogfQogCi19Cit9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0ZpbGVDaG9vc2VyV2luY2UuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvRmlsZUNob29zZXJXaW5jZS5j
cHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9GaWxlQ2hvb3Nl
cldpbmNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJp
Z2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENv
cHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLgotICoKLSAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgotICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
LSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKLSAqLwotCi0jaW5jbHVk
ZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiRmlsZUNob29zZXIuaCIKLQotI2luY2x1ZGUgIkNocm9t
ZS5oIgotI2luY2x1ZGUgIkNocm9tZUNsaWVudC5oIgotI2luY2x1ZGUgIkRvY3VtZW50LmgiCi0j
aW5jbHVkZSAiRnJhbWUuaCIKLSNpbmNsdWRlICJJY29uLmgiCi0jaW5jbHVkZSAiTG9jYWxpemVk
U3RyaW5ncy5oIgotI2luY2x1ZGUgIlBhZ2UuaCIKLSNpbmNsdWRlICJTdHJpbmdUcnVuY2F0b3Iu
aCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1TdHJpbmcgcGF0aEdldEZpbGVOYW1lKGNvbnN0
IFN0cmluZyYgcGF0aCk7Ci0KLVN0cmluZyBGaWxlQ2hvb3Nlcjo6YmFzZW5hbWVGb3JXaWR0aChj
b25zdCBGb250JiBmb250LCBpbnQgd2lkdGgpIGNvbnN0Ci17Ci0gICAgaWYgKHdpZHRoIDw9IDAp
Ci0gICAgICAgIHJldHVybiBTdHJpbmcoKTsKLQotICAgIFN0cmluZyBzdHJpbmc7Ci0gICAgaWYg
KG1fZmlsZW5hbWVzLmlzRW1wdHkoKSkKLSAgICAgICAgc3RyaW5nID0gZmlsZUJ1dHRvbk5vRmls
ZVNlbGVjdGVkTGFiZWwoKTsKLSAgICBlbHNlIGlmIChtX2ZpbGVuYW1lcy5zaXplKCkgPT0gMSkg
ewotICAgICAgICBTdHJpbmcgdG1wRmlsZW5hbWUgPSBtX2ZpbGVuYW1lc1swXTsKLSAgICAgICAg
c3RyaW5nID0gcGF0aEdldEZpbGVOYW1lKHRtcEZpbGVuYW1lKTsKLSAgICB9IGVsc2UKLSAgICAg
ICAgcmV0dXJuIFN0cmluZ1RydW5jYXRvcjo6cmlnaHRUcnVuY2F0ZShTdHJpbmc6Om51bWJlciht
X2ZpbGVuYW1lcy5zaXplKCkpICsgIiBmaWxlcyIsIHdpZHRoLCBmb250LCBmYWxzZSk7Ci0KLSAg
ICByZXR1cm4gU3RyaW5nVHJ1bmNhdG9yOjpjZW50ZXJUcnVuY2F0ZShzdHJpbmcsIHdpZHRoLCBm
b250LCBmYWxzZSk7Ci19Ci0KLX0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvRmlsZVN5
c3RlbVdpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0ZpbGVT
eXN0ZW1XaW5DRS5jcHAJKHJldmlzaW9uIDU3Mjg5KQkoZnJvbSBXZWJDb3JlL3BsYXRmb3JtL3dp
bmNlL0ZpbGVTeXN0ZW1XaW5jZS5jcHA6NTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbmNl
L0ZpbGVTeXN0ZW1XaW5DRS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyODQgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICogQ29weXJpZ2h0IChDKSAyMDA4IENvbGxhYm9yYSwgTHRkLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICog
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
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZpbGVTeXN0ZW0uaCIKKworI2luY2x1ZGUgIk5vdElt
cGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlIDx3dGYv
dGV4dC9DU3RyaW5nLmg+CisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8d2luY3J5
cHQuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgYm9vbCBnZXRGaWxlSW5mbyhj
b25zdCBTdHJpbmcmIHBhdGgsIEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OJiBmaWxlSW5mbykK
K3sKKyAgICBTdHJpbmcgZmlsZW5hbWUgPSBwYXRoOworICAgIEhBTkRMRSBoRmlsZSA9IENyZWF0
ZUZpbGUoZmlsZW5hbWUuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSwgR0VORVJJQ19S
RUFELCBGSUxFX1NIQVJFX1JFQUQsIDAKKyAgICAgICAgLCBPUEVOX0VYSVNUSU5HLCBGSUxFX0ZM
QUdfTk9fQlVGRkVSSU5HLCAwKTsKKworICAgIGlmIChoRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9W
QUxVRSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbCBydG4gPSBHZXRGaWxlSW5m
b3JtYXRpb25CeUhhbmRsZShoRmlsZSwgJmZpbGVJbmZvKSA/IHRydWUgOiBmYWxzZTsKKworICAg
IENsb3NlSGFuZGxlKGhGaWxlKTsKKyAgICByZXR1cm4gcnRuOworfQorCitib29sIGdldEZpbGVT
aXplKGNvbnN0IFN0cmluZyYgcGF0aCwgbG9uZyBsb25nJiByZXN1bHQpCit7CisgICAgQllfSEFO
RExFX0ZJTEVfSU5GT1JNQVRJT04gZmlsZUluZm9ybWF0aW9uOworICAgIGlmICghZ2V0RmlsZUlu
Zm8ocGF0aCwgZmlsZUluZm9ybWF0aW9uKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
VUxBUkdFX0lOVEVHRVIgZmlsZVNpemU7CisgICAgZmlsZVNpemUuTG93UGFydCA9IGZpbGVJbmZv
cm1hdGlvbi5uRmlsZVNpemVMb3c7CisgICAgZmlsZVNpemUuSGlnaFBhcnQgPSBmaWxlSW5mb3Jt
YXRpb24ubkZpbGVTaXplSGlnaDsKKworICAgIHJlc3VsdCA9IGZpbGVTaXplLlF1YWRQYXJ0Owor
CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgZ2V0RmlsZU1vZGlmaWNhdGlvblRpbWUoY29u
c3QgU3RyaW5nJiBwYXRoLCB0aW1lX3QmIHJlc3VsdCkKK3sKKyAgICBCWV9IQU5ETEVfRklMRV9J
TkZPUk1BVElPTiBmaWxlSW5mb3JtYXRpb247CisgICAgaWYgKCFnZXRGaWxlSW5mbyhwYXRoLCBm
aWxlSW5mb3JtYXRpb24pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBVTEFSR0VfSU5U
RUdFUiB0OworICAgIG1lbWNweSgmdCwgJmZpbGVJbmZvcm1hdGlvbi5mdExhc3RXcml0ZVRpbWUs
IHNpemVvZih0KSk7CisgICAgCisgICAgcmVzdWx0ID0gdC5RdWFkUGFydCAqIDAuMDAwMDAwMSAt
IDExNjQ0NDczNjAwLjA7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBmaWxlRXhpc3Rz
KGNvbnN0IFN0cmluZyYgcGF0aCkgCit7CisgICAgU3RyaW5nIGZpbGVuYW1lID0gcGF0aDsKKyAg
ICBIQU5ETEUgaEZpbGUgPSBDcmVhdGVGaWxlKGZpbGVuYW1lLmNoYXJhY3RlcnNXaXRoTnVsbFRl
cm1pbmF0aW9uKCksIDAsIEZJTEVfU0hBUkVfUkVBRCB8IEZJTEVfU0hBUkVfV1JJVEUKKyAgICAg
ICAgLCAwLCBPUEVOX0VYSVNUSU5HLCBGSUxFX0ZMQUdfTk9fQlVGRkVSSU5HLCAwKTsKKworICAg
IENsb3NlSGFuZGxlKGhGaWxlKTsKKworICAgIHJldHVybiBoRmlsZSAhPSBJTlZBTElEX0hBTkRM
RV9WQUxVRTsKK30KKworYm9vbCBkZWxldGVGaWxlKGNvbnN0IFN0cmluZyYgcGF0aCkKK3sKKyAg
ICBTdHJpbmcgZmlsZW5hbWUgPSBwYXRoOworICAgIHJldHVybiAhIURlbGV0ZUZpbGVXKGZpbGVu
YW1lLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkpOworfQorCisKK2Jvb2wgZGVsZXRl
RW1wdHlEaXJlY3RvcnkoY29uc3QgU3RyaW5nJiBwYXRoKQoreworICAgIFN0cmluZyBmaWxlbmFt
ZSA9IHBhdGg7CisgICAgcmV0dXJuICEhUmVtb3ZlRGlyZWN0b3J5VyhmaWxlbmFtZS5jaGFyYWN0
ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpKTsKK30KKworU3RyaW5nIHBhdGhCeUFwcGVuZGluZ0Nv
bXBvbmVudChjb25zdCBTdHJpbmcmIHBhdGgsIGNvbnN0IFN0cmluZyYgY29tcG9uZW50KQorewor
ICAgIGlmIChjb21wb25lbnQuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gcGF0aDsKKworICAg
IFZlY3RvcjxVQ2hhciwgTUFYX1BBVEg+IGJ1ZmZlcjsKKworICAgIGJ1ZmZlci5hcHBlbmQocGF0
aC5jaGFyYWN0ZXJzKCksIHBhdGgubGVuZ3RoKCkpOworCisgICAgaWYgKGJ1ZmZlci5sYXN0KCkg
IT0gTCdcXCcgJiYgYnVmZmVyLmxhc3QoKSAhPSBMJy8nCisgICAgICAgICYmIGNvbXBvbmVudFsw
XSAhPSBMJ1xcJyAmJiBjb21wb25lbnRbMF0gIT0gTCcvJykKKyAgICAgICAgYnVmZmVyLmFwcGVu
ZChMJ1xcJyk7CisKKyAgICBidWZmZXIuYXBwZW5kKGNvbXBvbmVudC5jaGFyYWN0ZXJzKCksIGNv
bXBvbmVudC5sZW5ndGgoKSk7CisKKyAgICByZXR1cm4gU3RyaW5nKGJ1ZmZlci5kYXRhKCksIGJ1
ZmZlci5zaXplKCkpOworfQorCitDU3RyaW5nIGZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbihjb25z
dCBTdHJpbmcmKQoreworICAgIHJldHVybiAiIjsKK30KKworYm9vbCBtYWtlQWxsRGlyZWN0b3Jp
ZXMoY29uc3QgU3RyaW5nJiBwYXRoKQoreworICAgIGludCBsYXN0RGl2UG9zID0gc3RkOjptYXgo
cGF0aC5yZXZlcnNlRmluZCgnLycpLCBwYXRoLnJldmVyc2VGaW5kKCdcXCcpKTsKKyAgICBpbnQg
ZW5kUG9zID0gcGF0aC5sZW5ndGgoKTsKKyAgICBpZiAobGFzdERpdlBvcyA9PSBwYXRoLmxlbmd0
aCgpIC0gMSkgeworICAgICAgICBlbmRQb3MgLT0gMTsKKyAgICAgICAgbGFzdERpdlBvcyA9IHN0
ZDo6bWF4KHBhdGgucmV2ZXJzZUZpbmQoJy8nLCBsYXN0RGl2UG9zKSwgcGF0aC5yZXZlcnNlRmlu
ZCgnXFwnLCBsYXN0RGl2UG9zKSk7CisgICAgfQorCisgICAgaWYgKGxhc3REaXZQb3MgPiAwKSB7
CisgICAgICAgIGlmICghbWFrZUFsbERpcmVjdG9yaWVzKHBhdGguc3Vic3RyaW5nKDAsIGxhc3RE
aXZQb3MpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBTdHJpbmcg
Zm9sZGVyKHBhdGguc3Vic3RyaW5nKDAsIGVuZFBvcykpOworICAgIENyZWF0ZURpcmVjdG9yeShm
b2xkZXIuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSwgMCk7CisKKyAgICBEV09SRCBm
aWxlQXR0ciA9IEdldEZpbGVBdHRyaWJ1dGVzKGZvbGRlci5jaGFyYWN0ZXJzV2l0aE51bGxUZXJt
aW5hdGlvbigpKTsKKyAgICByZXR1cm4gZmlsZUF0dHIgIT0gMHhGRkZGRkZGRiAmJiAoZmlsZUF0
dHIgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpOworfQorCitTdHJpbmcgaG9tZURpcmVjdG9y
eVBhdGgoKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuICIiOworfQorCitT
dHJpbmcgcGF0aEdldEZpbGVOYW1lKGNvbnN0IFN0cmluZyYgcGF0aCkKK3sKKyAgICByZXR1cm4g
cGF0aC5zdWJzdHJpbmcoc3RkOjptYXgocGF0aC5yZXZlcnNlRmluZCgnLycpLCBwYXRoLnJldmVy
c2VGaW5kKCdcXCcpKSArIDEpOworfQorCitTdHJpbmcgZGlyZWN0b3J5TmFtZShjb25zdCBTdHJp
bmcmIHBhdGgpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gU3RyaW5nKCk7
Cit9CisKK0NTdHJpbmcgb3BlblRlbXBvcmFyeUZpbGUoY29uc3QgY2hhciosIFBsYXRmb3JtRmls
ZUhhbmRsZSYgaGFuZGxlKQoreworICAgIGhhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOwor
CisgICAgd2NoYXJfdCB0ZW1wUGF0aFtNQVhfUEFUSF07CisgICAgaW50IHRlbXBQYXRoTGVuZ3Ro
ID0gOjpHZXRUZW1wUGF0aChfY291bnRvZih0ZW1wUGF0aCksIHRlbXBQYXRoKTsKKyAgICBpZiAo
dGVtcFBhdGhMZW5ndGggPD0gMCB8fCB0ZW1wUGF0aExlbmd0aCA+IF9jb3VudG9mKHRlbXBQYXRo
KSkKKyAgICAgICAgcmV0dXJuIENTdHJpbmcoKTsKKworICAgIEhDUllQVFBST1YgaENyeXB0UHJv
diA9IDA7CisgICAgaWYgKCFDcnlwdEFjcXVpcmVDb250ZXh0KCZoQ3J5cHRQcm92LCAwLCAwLCBQ
Uk9WX1JTQV9GVUxMLCBDUllQVF9WRVJJRllDT05URVhUKSkKKyAgICAgICAgcmV0dXJuIENTdHJp
bmcoKTsKKworICAgIFN0cmluZyBwcm9wb3NlZFBhdGg7CisgICAgd2hpbGUgKDEpIHsKKworICAg
ICAgICB3Y2hhcl90IHRlbXBGaWxlW10gPSBMIlhYWFhYWFhYLnRtcCI7IC8vIFVzZSA4LjMgc3R5
bGUgbmFtZSAobW9yZSBjaGFyYWN0ZXJzIGFyZW4ndCBoZWxwZnVsIGR1ZSB0byA4LjMgc2hvcnQg
ZmlsZSBuYW1lcykKKyAgICAgICAgY29uc3QgaW50IHJhbmRvbVBhcnRMZW5ndGggPSA4OworICAg
ICAgICBpZiAoIUNyeXB0R2VuUmFuZG9tKGhDcnlwdFByb3YsIHJhbmRvbVBhcnRMZW5ndGggKiAy
LCByZWludGVycHJldF9jYXN0PEJZVEUqPih0ZW1wRmlsZSkpKQorICAgICAgICAgICAgYnJlYWs7
CisKKyAgICAgICAgLy8gTGltaXQgdG8gdmFsaWQgZmlsZXN5c3RlbSBjaGFyYWN0ZXJzLCBhbHNv
IGV4Y2x1ZGluZyBvdGhlcnMgdGhhdCBjb3VsZCBiZSBwcm9ibGVtYXRpYywgbGlrZSBwdW5jdHVh
dGlvbi4KKyAgICAgICAgLy8gZG9uJ3QgaW5jbHVkZSBib3RoIHVwcGVyIGFuZCBsb3dlcmNhc2Ug
c2luY2UgV2luZG93cyBmaWxlIHN5c3RlbXMgYXJlIHR5cGljYWxseSBub3QgY2FzZSBzZW5zaXRp
dmUuCisgICAgICAgIGNvbnN0IGNoYXIgdmFsaWRDaGFyc1tdID0gIjAxMjM0NTY3ODlhYmNkZWZn
aGlqa2xtbm9wcXJzdHV2d3h5eiI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmFuZG9t
UGFydExlbmd0aDsgKytpKQorICAgICAgICAgICAgdGVtcEZpbGVbaV0gPSB2YWxpZENoYXJzW3Rl
bXBGaWxlW2ldICUgKHNpemVvZih2YWxpZENoYXJzKSAtIDEpXTsKKworICAgICAgICBBU1NFUlQo
d2NzbGVuKHRlbXBGaWxlKSAqIDIgPT0gc2l6ZW9mKHRlbXBGaWxlKSAtIDIpOworCisgICAgICAg
IHByb3Bvc2VkUGF0aCA9IHBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChTdHJpbmcodGVtcFBhdGgp
LCBTdHJpbmcodGVtcEZpbGUpKTsKKworICAgICAgICAvLyB1c2UgQ1JFQVRFX05FVyB0byBhdm9p
ZCBvdmVyd3JpdGluZyBhbiBleGlzdGluZyBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZQorICAgICAg
ICBoYW5kbGUgPSBDcmVhdGVGaWxlKHByb3Bvc2VkUGF0aC5jaGFyYWN0ZXJzV2l0aE51bGxUZXJt
aW5hdGlvbigpLCBHRU5FUklDX1JFQUQgfCBHRU5FUklDX1dSSVRFLCAwLCAwLCBDUkVBVEVfTkVX
LCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIDApOworICAgICAgICBpZiAoIWlzSGFuZGxlVmFsaWQo
aGFuZGxlKSAmJiBHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9BTFJFQURZX0VYSVNUUykKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIENyeXB0UmVs
ZWFzZUNvbnRleHQoaENyeXB0UHJvdiwgMCk7CisKKyAgICBpZiAoIWlzSGFuZGxlVmFsaWQoaGFu
ZGxlKSkKKyAgICAgICAgcmV0dXJuIENTdHJpbmcoKTsKKworICAgIHJldHVybiBwcm9wb3NlZFBh
dGgubGF0aW4xKCk7Cit9CisKK3ZvaWQgY2xvc2VGaWxlKFBsYXRmb3JtRmlsZUhhbmRsZSYgaGFu
ZGxlKQoreworICAgIGlmIChpc0hhbmRsZVZhbGlkKGhhbmRsZSkpIHsKKyAgICAgICAgOjpDbG9z
ZUhhbmRsZShoYW5kbGUpOworICAgICAgICBoYW5kbGUgPSBpbnZhbGlkUGxhdGZvcm1GaWxlSGFu
ZGxlOworICAgIH0KK30KKworaW50IHdyaXRlVG9GaWxlKFBsYXRmb3JtRmlsZUhhbmRsZSBoYW5k
bGUsIGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW5ndGgpCit7CisgICAgaWYgKCFpc0hhbmRsZVZh
bGlkKGhhbmRsZSkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIERXT1JEIGJ5dGVzV3JpdHRl
bjsKKyAgICBib29sIHN1Y2Nlc3MgPSBXcml0ZUZpbGUoaGFuZGxlLCBkYXRhLCBsZW5ndGgsICZi
eXRlc1dyaXR0ZW4sIDApOworCisgICAgaWYgKCFzdWNjZXNzKQorICAgICAgICByZXR1cm4gLTE7
CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oYnl0ZXNXcml0dGVuKTsKK30KKworYm9vbCB1
bmxvYWRNb2R1bGUoUGxhdGZvcm1Nb2R1bGUgbW9kdWxlKQoreworICAgIHJldHVybiA6OkZyZWVM
aWJyYXJ5KG1vZHVsZSk7Cit9CisKK1N0cmluZyBsb2NhbFVzZXJTcGVjaWZpY1N0b3JhZ2VEaXJl
Y3RvcnkoKQoreworICAgIHJldHVybiBTdHJpbmcoTCJcXCIpOworfQorCitTdHJpbmcgcm9hbWlu
Z1VzZXJTcGVjaWZpY1N0b3JhZ2VEaXJlY3RvcnkoKQoreworICAgIHJldHVybiBTdHJpbmcoTCJc
XCIpOworfQorCitWZWN0b3I8U3RyaW5nPiBsaXN0RGlyZWN0b3J5KGNvbnN0IFN0cmluZyYgcGF0
aCwgY29uc3QgU3RyaW5nJiBmaWx0ZXIpCit7CisgICAgVmVjdG9yPFN0cmluZz4gZW50cmllczsK
KworICAgIFZlY3RvcjxVQ2hhciwgMjU2PiBwYXR0ZXJuOworICAgIHBhdHRlcm4uYXBwZW5kKHBh
dGguY2hhcmFjdGVycygpLCBwYXRoLmxlbmd0aCgpKTsKKyAgICBpZiAocGF0dGVybi5sYXN0KCkg
IT0gTCcvJyAmJiBwYXR0ZXJuLmxhc3QoKSAhPSBMJ1xcJykKKyAgICAgICAgcGF0dGVybi5hcHBl
bmQoTCdcXCcpOworCisgICAgU3RyaW5nIHJvb3QocGF0dGVybi5kYXRhKCksIHBhdHRlcm4uc2l6
ZSgpKTsKKyAgICBwYXR0ZXJuLmFwcGVuZChmaWx0ZXIuY2hhcmFjdGVycygpLCBmaWx0ZXIubGVu
Z3RoKCkpOworICAgIHBhdHRlcm4uYXBwZW5kKDApOworCisgICAgV0lOMzJfRklORF9EQVRBIGZp
bmREYXRhOworICAgIEhBTkRMRSBoRmluZCA9IEZpbmRGaXJzdEZpbGUocGF0dGVybi5kYXRhKCks
ICZmaW5kRGF0YSk7CisgICAgaWYgKElOVkFMSURfSEFORExFX1ZBTFVFICE9IGhGaW5kKSB7Cisg
ICAgICAgIGRvIHsKKyAgICAgICAgICAgIC8vIEZJWEVNRTogc2hvdWxkIHdlIGFsc28gYWRkIHRo
ZSBmb2xkZXJzPyBUaGlzIGZ1bmN0aW9uCisgICAgICAgICAgICAvLyBpcyBzbyBmYXIgb25seSBj
YWxsZWQgYnkgUGx1Z2luRGF0YWJhc2UuY3BwIHRvIGxpc3QKKyAgICAgICAgICAgIC8vIGFsbCBw
bHVnaW5zIGluIGEgZm9sZGVyLCB3aGVyZSBpdCdzIG5vdCBzdXBwb3NlZCB0byBsaXN0IHN1Yi1m
b2xkZXJzLgorICAgICAgICAgICAgaWYgKCEoZmluZERhdGEuZHdGaWxlQXR0cmlidXRlcyAmIEZJ
TEVfQVRUUklCVVRFX0RJUkVDVE9SWSkpCisgICAgICAgICAgICAgICAgZW50cmllcy5hcHBlbmQo
cm9vdCArIGZpbmREYXRhLmNGaWxlTmFtZSk7CisgICAgICAgIH0gd2hpbGUgKEZpbmROZXh0Rmls
ZShoRmluZCwgJmZpbmREYXRhKSk7CisgICAgICAgIEZpbmRDbG9zZShoRmluZCk7CisgICAgfQor
CisgICAgcmV0dXJuIGVudHJpZXM7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2lu
Y2UvRmlsZVN5c3RlbVdpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3dp
bmNlL0ZpbGVTeXN0ZW1XaW5DRS5jcHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0
Zm9ybS93aW5jZS9GaWxlU3lzdGVtV2luQ0UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yODEsNCAr
MjgxLDQgQEAgVmVjdG9yPFN0cmluZz4gbGlzdERpcmVjdG9yeShjb25zdCBTdHJpbgogICAgIHJl
dHVybiBlbnRyaWVzOwogfQogCi19Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJD
b3JlL3BsYXRmb3JtL3dpbmNlL0ZpbGVTeXN0ZW1XaW5jZS5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS93aW5jZS9GaWxlU3lzdGVtV2luY2UuY3BwCShyZXZpc2lvbiA1NzI4OSkK
KysrIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvRmlsZVN5c3RlbVdpbmNlLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMSwyODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggQ29sbGFib3Jh
LCBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBU
b3JjaCBNb2JpbGUsIEluYy4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJl
IG1ldDoKLSAqCi0gKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICogMi4gIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0g
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQotICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAotICogMy4gIE5laXRoZXIgdGhl
IG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YK
LSAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90
ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQot
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1Mg
T0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgot
ICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiRmlsZVN5
c3RlbS5oIgotCi0jaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKLSNpbmNsdWRlICJQbGF0Zm9y
bVN0cmluZy5oIgotI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KLQotI2luY2x1ZGUgPHdp
bmRvd3MuaD4KLSNpbmNsdWRlIDx3aW5jcnlwdC5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0K
LXN0YXRpYyBib29sIGdldEZpbGVJbmZvKGNvbnN0IFN0cmluZyYgcGF0aCwgQllfSEFORExFX0ZJ
TEVfSU5GT1JNQVRJT04mIGZpbGVJbmZvKQotewotICAgIFN0cmluZyBmaWxlbmFtZSA9IHBhdGg7
Ci0gICAgSEFORExFIGhGaWxlID0gQ3JlYXRlRmlsZShmaWxlbmFtZS5jaGFyYWN0ZXJzV2l0aE51
bGxUZXJtaW5hdGlvbigpLCBHRU5FUklDX1JFQUQsIEZJTEVfU0hBUkVfUkVBRCwgMAotICAgICAg
ICAsIE9QRU5fRVhJU1RJTkcsIEZJTEVfRkxBR19OT19CVUZGRVJJTkcsIDApOwotCi0gICAgaWYg
KGhGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICBib29sIHJ0biA9IEdldEZpbGVJbmZvcm1hdGlvbkJ5SGFuZGxlKGhGaWxlLCAmZmlsZUlu
Zm8pID8gdHJ1ZSA6IGZhbHNlOwotCi0gICAgQ2xvc2VIYW5kbGUoaEZpbGUpOwotICAgIHJldHVy
biBydG47Ci19Ci0KLWJvb2wgZ2V0RmlsZVNpemUoY29uc3QgU3RyaW5nJiBwYXRoLCBsb25nIGxv
bmcmIHJlc3VsdCkKLXsKLSAgICBCWV9IQU5ETEVfRklMRV9JTkZPUk1BVElPTiBmaWxlSW5mb3Jt
YXRpb247Ci0gICAgaWYgKCFnZXRGaWxlSW5mbyhwYXRoLCBmaWxlSW5mb3JtYXRpb24pKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBVTEFSR0VfSU5URUdFUiBmaWxlU2l6ZTsKLSAgICBm
aWxlU2l6ZS5Mb3dQYXJ0ID0gZmlsZUluZm9ybWF0aW9uLm5GaWxlU2l6ZUxvdzsKLSAgICBmaWxl
U2l6ZS5IaWdoUGFydCA9IGZpbGVJbmZvcm1hdGlvbi5uRmlsZVNpemVIaWdoOwotCi0gICAgcmVz
dWx0ID0gZmlsZVNpemUuUXVhZFBhcnQ7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBn
ZXRGaWxlTW9kaWZpY2F0aW9uVGltZShjb25zdCBTdHJpbmcmIHBhdGgsIHRpbWVfdCYgcmVzdWx0
KQotewotICAgIEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OIGZpbGVJbmZvcm1hdGlvbjsKLSAg
ICBpZiAoIWdldEZpbGVJbmZvKHBhdGgsIGZpbGVJbmZvcm1hdGlvbikpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgIFVMQVJHRV9JTlRFR0VSIHQ7Ci0gICAgbWVtY3B5KCZ0LCAmZmlsZUlu
Zm9ybWF0aW9uLmZ0TGFzdFdyaXRlVGltZSwgc2l6ZW9mKHQpKTsKLSAgICAKLSAgICByZXN1bHQg
PSB0LlF1YWRQYXJ0ICogMC4wMDAwMDAxIC0gMTE2NDQ0NzM2MDAuMDsKLQotICAgIHJldHVybiB0
cnVlOwotfQotCi1ib29sIGZpbGVFeGlzdHMoY29uc3QgU3RyaW5nJiBwYXRoKSAKLXsKLSAgICBT
dHJpbmcgZmlsZW5hbWUgPSBwYXRoOwotICAgIEhBTkRMRSBoRmlsZSA9IENyZWF0ZUZpbGUoZmls
ZW5hbWUuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSwgMCwgRklMRV9TSEFSRV9SRUFE
IHwgRklMRV9TSEFSRV9XUklURQotICAgICAgICAsIDAsIE9QRU5fRVhJU1RJTkcsIEZJTEVfRkxB
R19OT19CVUZGRVJJTkcsIDApOwotCi0gICAgQ2xvc2VIYW5kbGUoaEZpbGUpOwotCi0gICAgcmV0
dXJuIGhGaWxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFOwotfQotCi1ib29sIGRlbGV0ZUZpbGUo
Y29uc3QgU3RyaW5nJiBwYXRoKQotewotICAgIFN0cmluZyBmaWxlbmFtZSA9IHBhdGg7Ci0gICAg
cmV0dXJuICEhRGVsZXRlRmlsZVcoZmlsZW5hbWUuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRp
b24oKSk7Ci19Ci0KLQotYm9vbCBkZWxldGVFbXB0eURpcmVjdG9yeShjb25zdCBTdHJpbmcmIHBh
dGgpCi17Ci0gICAgU3RyaW5nIGZpbGVuYW1lID0gcGF0aDsKLSAgICByZXR1cm4gISFSZW1vdmVE
aXJlY3RvcnlXKGZpbGVuYW1lLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkpOwotfQot
Ci1TdHJpbmcgcGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KGNvbnN0IFN0cmluZyYgcGF0aCwgY29u
c3QgU3RyaW5nJiBjb21wb25lbnQpCi17Ci0gICAgaWYgKGNvbXBvbmVudC5pc0VtcHR5KCkpCi0g
ICAgICAgIHJldHVybiBwYXRoOwotCi0gICAgVmVjdG9yPFVDaGFyLCBNQVhfUEFUSD4gYnVmZmVy
OwotCi0gICAgYnVmZmVyLmFwcGVuZChwYXRoLmNoYXJhY3RlcnMoKSwgcGF0aC5sZW5ndGgoKSk7
Ci0KLSAgICBpZiAoYnVmZmVyLmxhc3QoKSAhPSBMJ1xcJyAmJiBidWZmZXIubGFzdCgpICE9IEwn
LycKLSAgICAgICAgJiYgY29tcG9uZW50WzBdICE9IEwnXFwnICYmIGNvbXBvbmVudFswXSAhPSBM
Jy8nKQotICAgICAgICBidWZmZXIuYXBwZW5kKEwnXFwnKTsKLQotICAgIGJ1ZmZlci5hcHBlbmQo
Y29tcG9uZW50LmNoYXJhY3RlcnMoKSwgY29tcG9uZW50Lmxlbmd0aCgpKTsKLQotICAgIHJldHVy
biBTdHJpbmcoYnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSk7Ci19Ci0KLUNTdHJpbmcgZmls
ZVN5c3RlbVJlcHJlc2VudGF0aW9uKGNvbnN0IFN0cmluZyYpCi17Ci0gICAgcmV0dXJuICIiOwot
fQotCi1ib29sIG1ha2VBbGxEaXJlY3Rvcmllcyhjb25zdCBTdHJpbmcmIHBhdGgpCi17Ci0gICAg
aW50IGxhc3REaXZQb3MgPSBzdGQ6Om1heChwYXRoLnJldmVyc2VGaW5kKCcvJyksIHBhdGgucmV2
ZXJzZUZpbmQoJ1xcJykpOwotICAgIGludCBlbmRQb3MgPSBwYXRoLmxlbmd0aCgpOwotICAgIGlm
IChsYXN0RGl2UG9zID09IHBhdGgubGVuZ3RoKCkgLSAxKSB7Ci0gICAgICAgIGVuZFBvcyAtPSAx
OwotICAgICAgICBsYXN0RGl2UG9zID0gc3RkOjptYXgocGF0aC5yZXZlcnNlRmluZCgnLycsIGxh
c3REaXZQb3MpLCBwYXRoLnJldmVyc2VGaW5kKCdcXCcsIGxhc3REaXZQb3MpKTsKLSAgICB9Ci0K
LSAgICBpZiAobGFzdERpdlBvcyA+IDApIHsKLSAgICAgICAgaWYgKCFtYWtlQWxsRGlyZWN0b3Jp
ZXMocGF0aC5zdWJzdHJpbmcoMCwgbGFzdERpdlBvcykpKQotICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIH0KLQotICAgIFN0cmluZyBmb2xkZXIocGF0aC5zdWJzdHJpbmcoMCwgZW5kUG9z
KSk7Ci0gICAgQ3JlYXRlRGlyZWN0b3J5KGZvbGRlci5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5h
dGlvbigpLCAwKTsKLQotICAgIERXT1JEIGZpbGVBdHRyID0gR2V0RmlsZUF0dHJpYnV0ZXMoZm9s
ZGVyLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkpOwotICAgIHJldHVybiBmaWxlQXR0
ciAhPSAweEZGRkZGRkZGICYmIChmaWxlQXR0ciAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSk7
Ci19Ci0KLVN0cmluZyBob21lRGlyZWN0b3J5UGF0aCgpCi17Ci0gICAgbm90SW1wbGVtZW50ZWQo
KTsKLSAgICByZXR1cm4gIiI7Ci19Ci0KLVN0cmluZyBwYXRoR2V0RmlsZU5hbWUoY29uc3QgU3Ry
aW5nJiBwYXRoKQotewotICAgIHJldHVybiBwYXRoLnN1YnN0cmluZyhzdGQ6Om1heChwYXRoLnJl
dmVyc2VGaW5kKCcvJyksIHBhdGgucmV2ZXJzZUZpbmQoJ1xcJykpICsgMSk7Ci19Ci0KLVN0cmlu
ZyBkaXJlY3RvcnlOYW1lKGNvbnN0IFN0cmluZyYgcGF0aCkKLXsKLSAgICBub3RJbXBsZW1lbnRl
ZCgpOwotICAgIHJldHVybiBTdHJpbmcoKTsKLX0KLQotQ1N0cmluZyBvcGVuVGVtcG9yYXJ5Rmls
ZShjb25zdCBjaGFyKiwgUGxhdGZvcm1GaWxlSGFuZGxlJiBoYW5kbGUpCi17Ci0gICAgaGFuZGxl
ID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0KLSAgICB3Y2hhcl90IHRlbXBQYXRoW01BWF9QQVRI
XTsKLSAgICBpbnQgdGVtcFBhdGhMZW5ndGggPSA6OkdldFRlbXBQYXRoKF9jb3VudG9mKHRlbXBQ
YXRoKSwgdGVtcFBhdGgpOwotICAgIGlmICh0ZW1wUGF0aExlbmd0aCA8PSAwIHx8IHRlbXBQYXRo
TGVuZ3RoID4gX2NvdW50b2YodGVtcFBhdGgpKQotICAgICAgICByZXR1cm4gQ1N0cmluZygpOwot
Ci0gICAgSENSWVBUUFJPViBoQ3J5cHRQcm92ID0gMDsKLSAgICBpZiAoIUNyeXB0QWNxdWlyZUNv
bnRleHQoJmhDcnlwdFByb3YsIDAsIDAsIFBST1ZfUlNBX0ZVTEwsIENSWVBUX1ZFUklGWUNPTlRF
WFQpKQotICAgICAgICByZXR1cm4gQ1N0cmluZygpOwotCi0gICAgU3RyaW5nIHByb3Bvc2VkUGF0
aDsKLSAgICB3aGlsZSAoMSkgewotCi0gICAgICAgIHdjaGFyX3QgdGVtcEZpbGVbXSA9IEwiWFhY
WFhYWFgudG1wIjsgLy8gVXNlIDguMyBzdHlsZSBuYW1lIChtb3JlIGNoYXJhY3RlcnMgYXJlbid0
IGhlbHBmdWwgZHVlIHRvIDguMyBzaG9ydCBmaWxlIG5hbWVzKQotICAgICAgICBjb25zdCBpbnQg
cmFuZG9tUGFydExlbmd0aCA9IDg7Ci0gICAgICAgIGlmICghQ3J5cHRHZW5SYW5kb20oaENyeXB0
UHJvdiwgcmFuZG9tUGFydExlbmd0aCAqIDIsIHJlaW50ZXJwcmV0X2Nhc3Q8QllURSo+KHRlbXBG
aWxlKSkpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvLyBMaW1pdCB0byB2YWxpZCBm
aWxlc3lzdGVtIGNoYXJhY3RlcnMsIGFsc28gZXhjbHVkaW5nIG90aGVycyB0aGF0IGNvdWxkIGJl
IHByb2JsZW1hdGljLCBsaWtlIHB1bmN0dWF0aW9uLgotICAgICAgICAvLyBkb24ndCBpbmNsdWRl
IGJvdGggdXBwZXIgYW5kIGxvd2VyY2FzZSBzaW5jZSBXaW5kb3dzIGZpbGUgc3lzdGVtcyBhcmUg
dHlwaWNhbGx5IG5vdCBjYXNlIHNlbnNpdGl2ZS4KLSAgICAgICAgY29uc3QgY2hhciB2YWxpZENo
YXJzW10gPSAiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKLSAgICAgICAg
Zm9yIChpbnQgaSA9IDA7IGkgPCByYW5kb21QYXJ0TGVuZ3RoOyArK2kpCi0gICAgICAgICAgICB0
ZW1wRmlsZVtpXSA9IHZhbGlkQ2hhcnNbdGVtcEZpbGVbaV0gJSAoc2l6ZW9mKHZhbGlkQ2hhcnMp
IC0gMSldOwotCi0gICAgICAgIEFTU0VSVCh3Y3NsZW4odGVtcEZpbGUpICogMiA9PSBzaXplb2Yo
dGVtcEZpbGUpIC0gMik7Ci0KLSAgICAgICAgcHJvcG9zZWRQYXRoID0gcGF0aEJ5QXBwZW5kaW5n
Q29tcG9uZW50KFN0cmluZyh0ZW1wUGF0aCksIFN0cmluZyh0ZW1wRmlsZSkpOwotCi0gICAgICAg
IC8vIHVzZSBDUkVBVEVfTkVXIHRvIGF2b2lkIG92ZXJ3cml0aW5nIGFuIGV4aXN0aW5nIGZpbGUg
d2l0aCB0aGUgc2FtZSBuYW1lCi0gICAgICAgIGhhbmRsZSA9IENyZWF0ZUZpbGUocHJvcG9zZWRQ
YXRoLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCksIEdFTkVSSUNfUkVBRCB8IEdFTkVS
SUNfV1JJVEUsIDAsIDAsIENSRUFURV9ORVcsIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgMCk7Ci0g
ICAgICAgIGlmICghaXNIYW5kbGVWYWxpZChoYW5kbGUpICYmIEdldExhc3RFcnJvcigpID09IEVS
Uk9SX0FMUkVBRFlfRVhJU1RTKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgYnJl
YWs7Ci0gICAgfQotCi0gICAgQ3J5cHRSZWxlYXNlQ29udGV4dChoQ3J5cHRQcm92LCAwKTsKLQot
ICAgIGlmICghaXNIYW5kbGVWYWxpZChoYW5kbGUpKQotICAgICAgICByZXR1cm4gQ1N0cmluZygp
OwotCi0gICAgcmV0dXJuIHByb3Bvc2VkUGF0aC5sYXRpbjEoKTsKLX0KLQotdm9pZCBjbG9zZUZp
bGUoUGxhdGZvcm1GaWxlSGFuZGxlJiBoYW5kbGUpCi17Ci0gICAgaWYgKGlzSGFuZGxlVmFsaWQo
aGFuZGxlKSkgewotICAgICAgICA6OkNsb3NlSGFuZGxlKGhhbmRsZSk7Ci0gICAgICAgIGhhbmRs
ZSA9IGludmFsaWRQbGF0Zm9ybUZpbGVIYW5kbGU7Ci0gICAgfQotfQotCi1pbnQgd3JpdGVUb0Zp
bGUoUGxhdGZvcm1GaWxlSGFuZGxlIGhhbmRsZSwgY29uc3QgY2hhciogZGF0YSwgaW50IGxlbmd0
aCkKLXsKLSAgICBpZiAoIWlzSGFuZGxlVmFsaWQoaGFuZGxlKSkKLSAgICAgICAgcmV0dXJuIC0x
OwotCi0gICAgRFdPUkQgYnl0ZXNXcml0dGVuOwotICAgIGJvb2wgc3VjY2VzcyA9IFdyaXRlRmls
ZShoYW5kbGUsIGRhdGEsIGxlbmd0aCwgJmJ5dGVzV3JpdHRlbiwgMCk7Ci0KLSAgICBpZiAoIXN1
Y2Nlc3MpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pihi
eXRlc1dyaXR0ZW4pOwotfQotCi1ib29sIHVubG9hZE1vZHVsZShQbGF0Zm9ybU1vZHVsZSBtb2R1
bGUpCi17Ci0gICAgcmV0dXJuIDo6RnJlZUxpYnJhcnkobW9kdWxlKTsKLX0KLQotU3RyaW5nIGxv
Y2FsVXNlclNwZWNpZmljU3RvcmFnZURpcmVjdG9yeSgpCi17Ci0gICAgcmV0dXJuIFN0cmluZyhM
IlxcIik7Ci19Ci0KLVN0cmluZyByb2FtaW5nVXNlclNwZWNpZmljU3RvcmFnZURpcmVjdG9yeSgp
Ci17Ci0gICAgcmV0dXJuIFN0cmluZyhMIlxcIik7Ci19Ci0KLVZlY3RvcjxTdHJpbmc+IGxpc3RE
aXJlY3RvcnkoY29uc3QgU3RyaW5nJiBwYXRoLCBjb25zdCBTdHJpbmcmIGZpbHRlcikKLXsKLSAg
ICBWZWN0b3I8U3RyaW5nPiBlbnRyaWVzOwotCi0gICAgVmVjdG9yPFVDaGFyLCAyNTY+IHBhdHRl
cm47Ci0gICAgcGF0dGVybi5hcHBlbmQocGF0aC5jaGFyYWN0ZXJzKCksIHBhdGgubGVuZ3RoKCkp
OwotICAgIGlmIChwYXR0ZXJuLmxhc3QoKSAhPSBMJy8nICYmIHBhdHRlcm4ubGFzdCgpICE9IEwn
XFwnKQotICAgICAgICBwYXR0ZXJuLmFwcGVuZChMJ1xcJyk7Ci0KLSAgICBTdHJpbmcgcm9vdChw
YXR0ZXJuLmRhdGEoKSwgcGF0dGVybi5zaXplKCkpOwotICAgIHBhdHRlcm4uYXBwZW5kKGZpbHRl
ci5jaGFyYWN0ZXJzKCksIGZpbHRlci5sZW5ndGgoKSk7Ci0gICAgcGF0dGVybi5hcHBlbmQoMCk7
Ci0KLSAgICBXSU4zMl9GSU5EX0RBVEEgZmluZERhdGE7Ci0gICAgSEFORExFIGhGaW5kID0gRmlu
ZEZpcnN0RmlsZShwYXR0ZXJuLmRhdGEoKSwgJmZpbmREYXRhKTsKLSAgICBpZiAoSU5WQUxJRF9I
QU5ETEVfVkFMVUUgIT0gaEZpbmQpIHsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgLy8gRklY
RU1FOiBzaG91bGQgd2UgYWxzbyBhZGQgdGhlIGZvbGRlcnM/IFRoaXMgZnVuY3Rpb24KLSAgICAg
ICAgICAgIC8vIGlzIHNvIGZhciBvbmx5IGNhbGxlZCBieSBQbHVnaW5EYXRhYmFzZS5jcHAgdG8g
bGlzdAotICAgICAgICAgICAgLy8gYWxsIHBsdWdpbnMgaW4gYSBmb2xkZXIsIHdoZXJlIGl0J3Mg
bm90IHN1cHBvc2VkIHRvIGxpc3Qgc3ViLWZvbGRlcnMuCi0gICAgICAgICAgICBpZiAoIShmaW5k
RGF0YS5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSkKLSAgICAg
ICAgICAgICAgICBlbnRyaWVzLmFwcGVuZChyb290ICsgZmluZERhdGEuY0ZpbGVOYW1lKTsKLSAg
ICAgICAgfSB3aGlsZSAoRmluZE5leHRGaWxlKGhGaW5kLCAmZmluZERhdGEpKTsKLSAgICAgICAg
RmluZENsb3NlKGhGaW5kKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZW50cmllczsKLX0KLQotfQpJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9LVVJMV2luQ0UuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvS1VSTFdpbkNFLmNwcAkocmV2aXNpb24gNTcyODkpCShm
cm9tIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvS1VSTFdpbmNlLmNwcDo1NzI4OSkKKysrIFdlYkNv
cmUvcGxhdGZvcm0vd2luY2UvS1VSTFdpbkNFLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSBJbmMuCisgKgor
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBp
cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMg
bGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICog
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG
aWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJLVVJMLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworU3RyaW5nIEtVUkw6OmZpbGVTeXN0ZW1QYXRoKCkgY29uc3QKK3sKKyAgICByZXR1cm4gcGF0
aCgpOworfQorCit9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0tVUkxXaW5DRS5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9LVVJMV2luQ0UuY3BwCShyZXZp
c2lvbiA1NzI4OSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvS1VSTFdpbkNFLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMjcsNCArMjcsNCBAQCBTdHJpbmcgS1VSTDo6ZmlsZVN5c3RlbVBhdGgo
KSBjb25zdAogICAgIHJldHVybiBwYXRoKCk7CiB9CiAKLX0KK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvS1VSTFdpbmNlLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0tVUkxXaW5jZS5jcHAJKHJldmlzaW9uIDU3Mjg5
KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9LVVJMV2luY2UuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVG9yY2ggTW9iaWxl
IEluYy4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIgb2YgdGhlIExp
Y2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhp
cyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm
dWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll
ZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25n
IHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdy
aXRlIHRvCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xp
biBTdHJlZXQsIEZpZnRoIEZsb29yLAotICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0g
Ki8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIktVUkwuaCIKLQotbmFtZXNwYWNl
IFdlYkNvcmUgewotCi1TdHJpbmcgS1VSTDo6ZmlsZVN5c3RlbVBhdGgoKSBjb25zdAotewotICAg
IHJldHVybiBwYXRoKCk7Ci19Ci0KLX0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvS2V5
Z2VuV2luQ0UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvS2V5Z2Vu
V2luQ0UuY3BwCShyZXZpc2lvbiA1NzI4OSkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9L
ZXlnZW5XaW5jZS5jcHA6NTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0tleWdlbldp
bkNFLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAwOC0yMDA5IFRvcmNoIE1vYmlsZSBJbmMuCisgKgorICogVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAq
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
KiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisg
KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBm
aWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJv
c3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJTU0xLZXlHZW5lcmF0b3IuaCIKKworI2luY2x1ZGUgIkJhc2U2NC5oIgorI2luY2x1
ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRl
IDx3aW5jcnlwdC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3ZvaWQgV2ViQ29yZTo6Z2V0
U3VwcG9ydGVkS2V5U2l6ZXMoVmVjdG9yPFN0cmluZz4mIHYpCit7CisgICAgdi5hcHBlbmQoIkhp
Z2ggR3JhZGUiKTsKKyAgICB2LmFwcGVuZCgiTWVkaXVtIEdyYWRlIik7Cit9CisKK1N0cmluZyBX
ZWJDb3JlOjpzaWduZWRQdWJsaWNLZXlBbmRDaGFsbGVuZ2VTdHJpbmcodW5zaWduZWQgaW5kZXgs
IGNvbnN0IFN0cmluZyYgY2hhbGxlbmdlLCBjb25zdCBLVVJMJiB1cmwpCit7CisgICAgU3RyaW5n
IGtleVN0cmluZzsKKworICAgIEhDUllQVFBST1YgaENvbnRleHQgPSAwOworICAgIEhDUllQVEtF
WSBoS2V5ID0gMDsKKyAgICBQQ0VSVF9QVUJMSUNfS0VZX0lORk8gcFB1YkluZm8gPSAwOworCisg
ICAgLy8gVHJ5IHRvIGRlbGV0ZSBpdCBpZiBpdCBleGlzdHMgYWxyZWFkeQorICAgIENyeXB0QWNx
dWlyZUNvbnRleHQoJmhDb250ZXh0LCBfVCgia2V5Z2VuX2NvbnRhaW5lciIpLCBNU19FTkhBTkNF
RF9QUk9WLCBQUk9WX1JTQV9GVUxMLCBDUllQVF9ERUxFVEVLRVlTRVQpOworCisgICAgZG8gewor
ICAgICAgICBpZiAoIUNyeXB0QWNxdWlyZUNvbnRleHQoJmhDb250ZXh0LCBfVCgia2V5Z2VuX2Nv
bnRhaW5lciIpLCBNU19FTkhBTkNFRF9QUk9WLCBQUk9WX1JTQV9GVUxMLCBDUllQVF9ORVdLRVlT
RVQpKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgRFdPUkQgZHdQdWJJbmZvTGVuZ3Ro
ID0gMDsKKyAgICAgICAgaWYgKCFDcnlwdEdlbktleShoQ29udGV4dCwgQVRfS0VZRVhDSEFOR0Us
IDAsICZoS2V5KSB8fCAhQ3J5cHRFeHBvcnRQdWJsaWNLZXlJbmZvKGhDb250ZXh0LCBBVF9LRVlF
WENIQU5HRSwgWDUwOV9BU05fRU5DT0RJTkcsIDAsICZkd1B1YkluZm9MZW5ndGgpKQorICAgICAg
ICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gVXNlIG1hbGxvYyBpbnN0ZWFkIG9mIG5ldywgYmVj
YXVzZSBtYWxsb2MgZ3VhcmFudGVlcyB0byByZXR1cm4gYSBwb2ludGVyIGFsaWduZWQgZm9yIGFs
bCBkYXRhIHR5cGVzLgorICAgICAgICBwUHViSW5mbyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UENFUlRf
UFVCTElDX0tFWV9JTkZPPihmYXN0TWFsbG9jKGR3UHViSW5mb0xlbmd0aCkpOworCisgICAgICAg
IGlmICghQ3J5cHRFeHBvcnRQdWJsaWNLZXlJbmZvKGhDb250ZXh0LCBBVF9LRVlFWENIQU5HRSwg
WDUwOV9BU05fRU5DT0RJTkcsIHBQdWJJbmZvLCAmZHdQdWJJbmZvTGVuZ3RoKSkKKyAgICAgICAg
ICAgIGJyZWFrOworCisgICAgICAgIENFUlRfS0VZR0VOX1JFUVVFU1RfSU5GTyByZXF1ZXN0SW5m
byA9IHsgMCB9OworICAgICAgICByZXF1ZXN0SW5mby5kd1ZlcnNpb24gPSBDRVJUX0tFWUdFTl9S
RVFVRVNUX1YxOworICAgICAgICByZXF1ZXN0SW5mby5wd3N6Q2hhbGxlbmdlU3RyaW5nID0gTCIi
OworICAgICAgICByZXF1ZXN0SW5mby5TdWJqZWN0UHVibGljS2V5SW5mbyA9ICpwUHViSW5mbzsK
KworICAgICAgICBTdHJpbmcgbG9jYWxDaGFsbGVuZ2UgPSBjaGFsbGVuZ2U7CisKKyAgICAgICAg
Ly8gV2luZG93cyBBUEkgd29uJ3Qgd3JpdGUgdG8gb3VyIGJ1ZmZlciwgYWx0aG91Z2ggaXQncyBu
b3QgZGVjbGFyZWQgd2l0aCBjb25zdC4KKyAgICAgICAgcmVxdWVzdEluZm8ucHdzekNoYWxsZW5n
ZVN0cmluZyA9IGNvbnN0X2Nhc3Q8d2NoYXJfdCo+KGxvY2FsQ2hhbGxlbmdlLmNoYXJhY3RlcnNX
aXRoTnVsbFRlcm1pbmF0aW9uKCkpOworCisgICAgICAgIENSWVBUX0FMR09SSVRITV9JREVOVElG
SUVSIHNpZ25BbGdvID0geyAwIH07CisgICAgICAgIHNpZ25BbGdvLnBzek9iaklkID0gc3pPSURf
UlNBX1NIQTFSU0E7CisKKyAgICAgICAgRFdPUkQgZHdFbmNvZGVkTGVuZ3RoOworICAgICAgICBp
ZiAoIUNyeXB0U2lnbkFuZEVuY29kZUNlcnRpZmljYXRlKGhDb250ZXh0LCBBVF9LRVlFWENIQU5H
RSwgWDUwOV9BU05fRU5DT0RJTkcsIFg1MDlfS0VZR0VOX1JFUVVFU1RfVE9fQkVfU0lHTkVELCAm
cmVxdWVzdEluZm8sICZzaWduQWxnbywgMCwgMCwgJmR3RW5jb2RlZExlbmd0aCkpCisgICAgICAg
ICAgICBicmVhazsKKworICAgICAgICBWZWN0b3I8Y2hhcj4gYmluYXJ5KGR3RW5jb2RlZExlbmd0
aCk7CisgICAgICAgIGlmICghQ3J5cHRTaWduQW5kRW5jb2RlQ2VydGlmaWNhdGUoaENvbnRleHQs
IEFUX0tFWUVYQ0hBTkdFLCBYNTA5X0FTTl9FTkNPRElORywgWDUwOV9LRVlHRU5fUkVRVUVTVF9U
T19CRV9TSUdORUQsICZyZXF1ZXN0SW5mbywgJnNpZ25BbGdvLCAwLCByZWludGVycHJldF9jYXN0
PExQQllURT4oYmluYXJ5LmRhdGEoKSksICZkd0VuY29kZWRMZW5ndGgpKQorICAgICAgICAgICAg
YnJlYWs7CisKKyAgICAgICAgVmVjdG9yPGNoYXI+IGJhc2U2NDsKKyAgICAgICAgYmFzZTY0RW5j
b2RlKGJpbmFyeSwgYmFzZTY0KTsKKyAgICAgICAga2V5U3RyaW5nID0gU3RyaW5nKGJhc2U2NC5k
YXRhKCksIGJhc2U2NC5zaXplKCkpOworCisgICAgfSB3aGlsZSgwKTsKKworICAgIGlmIChwUHVi
SW5mbykKKyAgICAgICAgZmFzdEZyZWUocFB1YkluZm8pOworICAgICAgIAorICAgIGlmIChoS2V5
KQorICAgICAgICBDcnlwdERlc3Ryb3lLZXkoaEtleSk7CisKKyAgICBpZiAoaENvbnRleHQpCisg
ICAgICAgIENyeXB0UmVsZWFzZUNvbnRleHQoaENvbnRleHQsIDApOworCisgICAgcmV0dXJuIGtl
eVN0cmluZzsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0
Zm9ybS93aW5jZS9LZXlnZW5XaW5jZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9y
bS93aW5jZS9LZXlnZW5XaW5jZS5jcHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0
Zm9ybS93aW5jZS9LZXlnZW5XaW5jZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsMTAxICswLDAg
QEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBUb3JjaCBNb2JpbGUgSW5jLgotICoK
LSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp
dCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3Ig
KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkg
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1
dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5
IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UuICBTZWUgdGhlIEdOVQotICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt
b3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAq
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwg
RmlmdGggRmxvb3IsCi0gKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0jaW5j
bHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiU1NMS2V5R2VuZXJhdG9yLmgiCi0KLSNpbmNsdWRl
ICJCYXNlNjQuaCIKLSNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDx3
aW5kb3dzLmg+Ci0jaW5jbHVkZSA8d2luY3J5cHQuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewot
Ci12b2lkIFdlYkNvcmU6OmdldFN1cHBvcnRlZEtleVNpemVzKFZlY3RvcjxTdHJpbmc+JiB2KQot
ewotICAgIHYuYXBwZW5kKCJIaWdoIEdyYWRlIik7Ci0gICAgdi5hcHBlbmQoIk1lZGl1bSBHcmFk
ZSIpOwotfQotCi1TdHJpbmcgV2ViQ29yZTo6c2lnbmVkUHVibGljS2V5QW5kQ2hhbGxlbmdlU3Ry
aW5nKHVuc2lnbmVkIGluZGV4LCBjb25zdCBTdHJpbmcmIGNoYWxsZW5nZSwgY29uc3QgS1VSTCYg
dXJsKQotewotICAgIFN0cmluZyBrZXlTdHJpbmc7Ci0KLSAgICBIQ1JZUFRQUk9WIGhDb250ZXh0
ID0gMDsKLSAgICBIQ1JZUFRLRVkgaEtleSA9IDA7Ci0gICAgUENFUlRfUFVCTElDX0tFWV9JTkZP
IHBQdWJJbmZvID0gMDsKLQotICAgIC8vIFRyeSB0byBkZWxldGUgaXQgaWYgaXQgZXhpc3RzIGFs
cmVhZHkKLSAgICBDcnlwdEFjcXVpcmVDb250ZXh0KCZoQ29udGV4dCwgX1QoImtleWdlbl9jb250
YWluZXIiKSwgTVNfRU5IQU5DRURfUFJPViwgUFJPVl9SU0FfRlVMTCwgQ1JZUFRfREVMRVRFS0VZ
U0VUKTsKLQotICAgIGRvIHsKLSAgICAgICAgaWYgKCFDcnlwdEFjcXVpcmVDb250ZXh0KCZoQ29u
dGV4dCwgX1QoImtleWdlbl9jb250YWluZXIiKSwgTVNfRU5IQU5DRURfUFJPViwgUFJPVl9SU0Ff
RlVMTCwgQ1JZUFRfTkVXS0VZU0VUKSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIERX
T1JEIGR3UHViSW5mb0xlbmd0aCA9IDA7Ci0gICAgICAgIGlmICghQ3J5cHRHZW5LZXkoaENvbnRl
eHQsIEFUX0tFWUVYQ0hBTkdFLCAwLCAmaEtleSkgfHwgIUNyeXB0RXhwb3J0UHVibGljS2V5SW5m
byhoQ29udGV4dCwgQVRfS0VZRVhDSEFOR0UsIFg1MDlfQVNOX0VOQ09ESU5HLCAwLCAmZHdQdWJJ
bmZvTGVuZ3RoKSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8vIFVzZSBtYWxsb2Mg
aW5zdGVhZCBvZiBuZXcsIGJlY2F1c2UgbWFsbG9jIGd1YXJhbnRlZXMgdG8gcmV0dXJuIGEgcG9p
bnRlciBhbGlnbmVkIGZvciBhbGwgZGF0YSB0eXBlcy4KLSAgICAgICAgcFB1YkluZm8gPSByZWlu
dGVycHJldF9jYXN0PFBDRVJUX1BVQkxJQ19LRVlfSU5GTz4oZmFzdE1hbGxvYyhkd1B1YkluZm9M
ZW5ndGgpKTsKLQotICAgICAgICBpZiAoIUNyeXB0RXhwb3J0UHVibGljS2V5SW5mbyhoQ29udGV4
dCwgQVRfS0VZRVhDSEFOR0UsIFg1MDlfQVNOX0VOQ09ESU5HLCBwUHViSW5mbywgJmR3UHViSW5m
b0xlbmd0aCkpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBDRVJUX0tFWUdFTl9SRVFV
RVNUX0lORk8gcmVxdWVzdEluZm8gPSB7IDAgfTsKLSAgICAgICAgcmVxdWVzdEluZm8uZHdWZXJz
aW9uID0gQ0VSVF9LRVlHRU5fUkVRVUVTVF9WMTsKLSAgICAgICAgcmVxdWVzdEluZm8ucHdzekNo
YWxsZW5nZVN0cmluZyA9IEwiIjsKLSAgICAgICAgcmVxdWVzdEluZm8uU3ViamVjdFB1YmxpY0tl
eUluZm8gPSAqcFB1YkluZm87Ci0KLSAgICAgICAgU3RyaW5nIGxvY2FsQ2hhbGxlbmdlID0gY2hh
bGxlbmdlOwotCi0gICAgICAgIC8vIFdpbmRvd3MgQVBJIHdvbid0IHdyaXRlIHRvIG91ciBidWZm
ZXIsIGFsdGhvdWdoIGl0J3Mgbm90IGRlY2xhcmVkIHdpdGggY29uc3QuCi0gICAgICAgIHJlcXVl
c3RJbmZvLnB3c3pDaGFsbGVuZ2VTdHJpbmcgPSBjb25zdF9jYXN0PHdjaGFyX3QqPihsb2NhbENo
YWxsZW5nZS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpKTsKLQotICAgICAgICBDUllQ
VF9BTEdPUklUSE1fSURFTlRJRklFUiBzaWduQWxnbyA9IHsgMCB9OwotICAgICAgICBzaWduQWxn
by5wc3pPYmpJZCA9IHN6T0lEX1JTQV9TSEExUlNBOwotCi0gICAgICAgIERXT1JEIGR3RW5jb2Rl
ZExlbmd0aDsKLSAgICAgICAgaWYgKCFDcnlwdFNpZ25BbmRFbmNvZGVDZXJ0aWZpY2F0ZShoQ29u
dGV4dCwgQVRfS0VZRVhDSEFOR0UsIFg1MDlfQVNOX0VOQ09ESU5HLCBYNTA5X0tFWUdFTl9SRVFV
RVNUX1RPX0JFX1NJR05FRCwgJnJlcXVlc3RJbmZvLCAmc2lnbkFsZ28sIDAsIDAsICZkd0VuY29k
ZWRMZW5ndGgpKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgVmVjdG9yPGNoYXI+IGJp
bmFyeShkd0VuY29kZWRMZW5ndGgpOwotICAgICAgICBpZiAoIUNyeXB0U2lnbkFuZEVuY29kZUNl
cnRpZmljYXRlKGhDb250ZXh0LCBBVF9LRVlFWENIQU5HRSwgWDUwOV9BU05fRU5DT0RJTkcsIFg1
MDlfS0VZR0VOX1JFUVVFU1RfVE9fQkVfU0lHTkVELCAmcmVxdWVzdEluZm8sICZzaWduQWxnbywg
MCwgcmVpbnRlcnByZXRfY2FzdDxMUEJZVEU+KGJpbmFyeS5kYXRhKCkpLCAmZHdFbmNvZGVkTGVu
Z3RoKSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIFZlY3RvcjxjaGFyPiBiYXNlNjQ7
Ci0gICAgICAgIGJhc2U2NEVuY29kZShiaW5hcnksIGJhc2U2NCk7Ci0gICAgICAgIGtleVN0cmlu
ZyA9IFN0cmluZyhiYXNlNjQuZGF0YSgpLCBiYXNlNjQuc2l6ZSgpKTsKLQotICAgIH0gd2hpbGUo
MCk7Ci0KLSAgICBpZiAocFB1YkluZm8pCi0gICAgICAgIGZhc3RGcmVlKHBQdWJJbmZvKTsKLSAg
ICAgICAKLSAgICBpZiAoaEtleSkKLSAgICAgICAgQ3J5cHREZXN0cm95S2V5KGhLZXkpOwotCi0g
ICAgaWYgKGhDb250ZXh0KQotICAgICAgICBDcnlwdFJlbGVhc2VDb250ZXh0KGhDb250ZXh0LCAw
KTsKLQotICAgIHJldHVybiBrZXlTdHJpbmc7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
SW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvTUlNRVR5cGVSZWdpc3RyeVdpbkNFLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL01JTUVUeXBlUmVnaXN0cnlXaW5D
RS5jcHAJKHJldmlzaW9uIDU3Mjg5KQkoZnJvbSBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL01JTUVU
eXBlUmVnaXN0cnlXaW5jZS5jcHA6NTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL01J
TUVUeXBlUmVnaXN0cnlXaW5DRS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNDEgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVU
RVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRF
UiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJNSU1FVHlwZVJlZ2lzdHJ5Lmgi
CisKKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNs
dWRlIDx3aW5yZWcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgU3RyaW5nIG1p
bWVUeXBlRm9yRXh0ZW5zaW9uKGNvbnN0IFN0cmluZyYgZXh0ZW5zaW9uKQoreworICAgIFN0cmlu
ZyBleHQgPSAiLiIgKyBleHRlbnNpb247CisgICAgV0NIQVIgY29udGVudFR5cGVTdHJbMjU2XTsK
KyAgICBEV09SRCBjb250ZW50VHlwZVN0ckxlbiA9IHNpemVvZihjb250ZW50VHlwZVN0cik7Cisg
ICAgRFdPUkQgdmFsdWVUeXBlOworCisgICAgSEtFWSBrZXk7CisgICAgU3RyaW5nIHJlc3VsdDsK
KyAgICBpZiAoRVJST1JfU1VDQ0VTUyAhPSBSZWdPcGVuS2V5RXgoSEtFWV9DTEFTU0VTX1JPT1Qs
IGV4dC5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpLCAwLCAwLCAma2V5KSkKKyAgICAg
ICAgcmV0dXJuIHJlc3VsdDsKKworICAgIGlmIChFUlJPUl9TVUNDRVNTID09IFJlZ1F1ZXJ5VmFs
dWVFeChrZXksIEwiQ29udGVudCBUeXBlIiwgMCwgJnZhbHVlVHlwZSwgKExQQllURSljb250ZW50
VHlwZVN0ciwgJmNvbnRlbnRUeXBlU3RyTGVuKSAmJiB2YWx1ZVR5cGUgPT0gUkVHX1NaKQorICAg
ICAgICByZXN1bHQgPSBTdHJpbmcoY29udGVudFR5cGVTdHIsIGNvbnRlbnRUeXBlU3RyTGVuIC8g
c2l6ZW9mKGNvbnRlbnRUeXBlU3RyWzBdKSAtIDEpOworCisgICAgUmVnQ2xvc2VLZXkoa2V5KTsK
KworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBIYXNoTWFwPFN0cmluZywgU3RyaW5n
PiBtaW1ldHlwZU1hcDsKKworc3RhdGljIHZvaWQgaW5pdE1JTUVUeXBlRW50ZW5zaW9uTWFwKCkK
K3sKKyAgICBpZiAobWltZXR5cGVNYXAuaXNFbXB0eSgpKSB7CisgICAgICAgIC8vZmlsbCB3aXRo
IGluaXRpYWwgdmFsdWVzCisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgidHh0IiwgInRleHQvcGxh
aW4iKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJwZGYiLCAiYXBwbGljYXRpb24vcGRmIik7
CisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgicHMiLCAiYXBwbGljYXRpb24vcG9zdHNjcmlwdCIp
OworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoImh0bWwiLCAidGV4dC9odG1sIik7CisgICAgICAg
IG1pbWV0eXBlTWFwLmFkZCgiaHRtIiwgInRleHQvaHRtbCIpOworICAgICAgICBtaW1ldHlwZU1h
cC5hZGQoInhtbCIsICJ0ZXh0L3htbCIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoInhzbCIs
ICJ0ZXh0L3hzbCIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoImpzIiwgImFwcGxpY2F0aW9u
L3gtamF2YXNjcmlwdCIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoInhodG1sIiwgImFwcGxp
Y2F0aW9uL3hodG1sK3htbCIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoInJzcyIsICJhcHBs
aWNhdGlvbi9yc3MreG1sIik7CisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgid2ViYXJjaGl2ZSIs
ICJhcHBsaWNhdGlvbi94LXdlYmFyY2hpdmUiKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJz
dmciLCAiaW1hZ2Uvc3ZnK3htbCIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoInN2Z3oiLCAi
aW1hZ2Uvc3ZnK3htbCIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoImpwZyIsICJpbWFnZS9q
cGVnIik7CisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgianBlZyIsICJpbWFnZS9qcGVnIik7Cisg
ICAgICAgIG1pbWV0eXBlTWFwLmFkZCgicG5nIiwgImltYWdlL3BuZyIpOworICAgICAgICBtaW1l
dHlwZU1hcC5hZGQoInRpZiIsICJpbWFnZS90aWZmIik7CisgICAgICAgIG1pbWV0eXBlTWFwLmFk
ZCgidGlmZiIsICJpbWFnZS90aWZmIik7CisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgiaWNvIiwg
ImltYWdlL2ljbyIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoImN1ciIsICJpbWFnZS9pY28i
KTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJibXAiLCAiaW1hZ2UvYm1wIik7CisgICAgICAg
IG1pbWV0eXBlTWFwLmFkZCgiY3NzIiwgInRleHQvY3NzIik7CisgICAgICAgIC8vIEZJWE1FOiBD
dXN0b20gZm9udCB3b3JrcyBvbmx5IHdoZW4gTUlNRSBpcyAidGV4dC9wbGFpbiIKKyAgICAgICAg
bWltZXR5cGVNYXAuYWRkKCJ0dGYiLCAidGV4dC9wbGFpbiIpOyAvLyAiZm9udC90dGYiCisgICAg
ICAgIG1pbWV0eXBlTWFwLmFkZCgib3RmIiwgInRleHQvcGxhaW4iKTsgLy8gImZvbnQvb3RmIgor
I2lmIEVOQUJMRShXTUwpCisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgid21sIiwgInRleHQvdm5k
LndhcC53bWwiKTsKKyNlbmRpZgorI2lmIEVOQUJMRShXQlhNTCkKKyAgICAgICAgbWltZXR5cGVN
YXAuYWRkKCJ3YnhtbCIsICJhcHBsaWNhdGlvbi92bmQud2FwLndtbGMiKTsKKyNlbmRpZgorICAg
IH0KK30KKworU3RyaW5nIE1JTUVUeXBlUmVnaXN0cnk6OmdldFByZWZlcnJlZEV4dGVuc2lvbkZv
ck1JTUVUeXBlKGNvbnN0IFN0cmluZyYgdHlwZSkKK3sKKyAgICBpZiAodHlwZS5pc0VtcHR5KCkp
CisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKworICAgIC8vIEF2b2lkIGNvbmZsaWN0cyB3aXRo
ICJ0dGYiIGFuZCAib3RmIgorICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0eXBlLCAidGV4dC9w
bGFpbiIpKQorICAgICAgICByZXR1cm4gInR4dCI7CisKKyAgICBpbml0TUlNRVR5cGVFbnRlbnNp
b25NYXAoKTsKKworICAgIGZvciAoSGFzaE1hcDxTdHJpbmcsIFN0cmluZz46Oml0ZXJhdG9yIGkg
PSBtaW1ldHlwZU1hcC5iZWdpbigpOyBpICE9IG1pbWV0eXBlTWFwLmVuZCgpOyArK2kpIHsKKyAg
ICAgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGktPnNlY29uZCwgdHlwZSkpCisgICAgICAgICAg
ICByZXR1cm4gaS0+Zmlyc3Q7CisgICAgfQorCisjaWYgRU5BQkxFKFhIVE1MTVApCisgICAgaWYg
KGVxdWFsSWdub3JpbmdDYXNlKCJhcHBsaWNhdGlvbi92bmQud2FwLnhodG1sK3htbCIsIHR5cGUp
KQorICAgICAgICByZXR1cm4gU3RyaW5nKCJ4bWwiKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIFN0
cmluZygpOworfQorCitTdHJpbmcgTUlNRVR5cGVSZWdpc3RyeTo6Z2V0TUlNRVR5cGVGb3JFeHRl
bnNpb24oY29uc3QgU3RyaW5nICZleHQpCit7CisgICAgaWYgKGV4dC5pc0VtcHR5KCkpCisgICAg
ICAgIHJldHVybiBTdHJpbmcoKTsKKworICAgIGluaXRNSU1FVHlwZUVudGVuc2lvbk1hcCgpOwor
CisgICAgU3RyaW5nIHJlc3VsdCA9IG1pbWV0eXBlTWFwLmdldChleHQubG93ZXIoKSk7CisgICAg
aWYgKHJlc3VsdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmVzdWx0ID0gbWltZVR5cGVGb3JFeHRl
bnNpb24oZXh0KTsKKyAgICAgICAgaWYgKCFyZXN1bHQuaXNFbXB0eSgpKQorICAgICAgICAgICAg
bWltZXR5cGVNYXAuYWRkKGV4dCwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdC5p
c0VtcHR5KCkgPyAidW5rbm93bi91bmtub3duIiA6IHJlc3VsdDsKK30KKworYm9vbCBNSU1FVHlw
ZVJlZ2lzdHJ5Ojppc0FwcGxpY2F0aW9uUGx1Z2luTUlNRVR5cGUoY29uc3QgU3RyaW5nJikKK3sK
KyAgICByZXR1cm4gZmFsc2U7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luY2Uv
TUlNRVR5cGVSZWdpc3RyeVdpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3Jt
L3dpbmNlL01JTUVUeXBlUmVnaXN0cnlXaW5DRS5jcHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2Vi
Q29yZS9wbGF0Zm9ybS93aW5jZS9NSU1FVHlwZVJlZ2lzdHJ5V2luQ0UuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0xMzgsNCArMTM4LDQgQEAgYm9vbCBNSU1FVHlwZVJlZ2lzdHJ5Ojppc0FwcGxpY2F0
aW9uUGx1ZwogICAgIHJldHVybiBmYWxzZTsKIH0KIAotfQorfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9NSU1FVHlwZVJlZ2lzdHJ5V2luY2UuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvTUlNRVR5cGVSZWdpc3RyeVdp
bmNlLmNwcAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL01JTUVU
eXBlUmVnaXN0cnlXaW5jZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsMTQxICswLDAgQEAKLS8q
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNl
cnZlZC4KLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLgotICoK
LSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIs
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwg
SU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICov
Ci0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJNSU1FVHlwZVJlZ2lzdHJ5LmgiCi0K
LSNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRl
IDx3aW5yZWcuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1zdGF0aWMgU3RyaW5nIG1pbWVU
eXBlRm9yRXh0ZW5zaW9uKGNvbnN0IFN0cmluZyYgZXh0ZW5zaW9uKQotewotICAgIFN0cmluZyBl
eHQgPSAiLiIgKyBleHRlbnNpb247Ci0gICAgV0NIQVIgY29udGVudFR5cGVTdHJbMjU2XTsKLSAg
ICBEV09SRCBjb250ZW50VHlwZVN0ckxlbiA9IHNpemVvZihjb250ZW50VHlwZVN0cik7Ci0gICAg
RFdPUkQgdmFsdWVUeXBlOwotCi0gICAgSEtFWSBrZXk7Ci0gICAgU3RyaW5nIHJlc3VsdDsKLSAg
ICBpZiAoRVJST1JfU1VDQ0VTUyAhPSBSZWdPcGVuS2V5RXgoSEtFWV9DTEFTU0VTX1JPT1QsIGV4
dC5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpLCAwLCAwLCAma2V5KSkKLSAgICAgICAg
cmV0dXJuIHJlc3VsdDsKLQotICAgIGlmIChFUlJPUl9TVUNDRVNTID09IFJlZ1F1ZXJ5VmFsdWVF
eChrZXksIEwiQ29udGVudCBUeXBlIiwgMCwgJnZhbHVlVHlwZSwgKExQQllURSljb250ZW50VHlw
ZVN0ciwgJmNvbnRlbnRUeXBlU3RyTGVuKSAmJiB2YWx1ZVR5cGUgPT0gUkVHX1NaKQotICAgICAg
ICByZXN1bHQgPSBTdHJpbmcoY29udGVudFR5cGVTdHIsIGNvbnRlbnRUeXBlU3RyTGVuIC8gc2l6
ZW9mKGNvbnRlbnRUeXBlU3RyWzBdKSAtIDEpOwotCi0gICAgUmVnQ2xvc2VLZXkoa2V5KTsKLQot
ICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBt
aW1ldHlwZU1hcDsKLQotc3RhdGljIHZvaWQgaW5pdE1JTUVUeXBlRW50ZW5zaW9uTWFwKCkKLXsK
LSAgICBpZiAobWltZXR5cGVNYXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgIC8vZmlsbCB3aXRoIGlu
aXRpYWwgdmFsdWVzCi0gICAgICAgIG1pbWV0eXBlTWFwLmFkZCgidHh0IiwgInRleHQvcGxhaW4i
KTsKLSAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJwZGYiLCAiYXBwbGljYXRpb24vcGRmIik7Ci0g
ICAgICAgIG1pbWV0eXBlTWFwLmFkZCgicHMiLCAiYXBwbGljYXRpb24vcG9zdHNjcmlwdCIpOwot
ICAgICAgICBtaW1ldHlwZU1hcC5hZGQoImh0bWwiLCAidGV4dC9odG1sIik7Ci0gICAgICAgIG1p
bWV0eXBlTWFwLmFkZCgiaHRtIiwgInRleHQvaHRtbCIpOwotICAgICAgICBtaW1ldHlwZU1hcC5h
ZGQoInhtbCIsICJ0ZXh0L3htbCIpOwotICAgICAgICBtaW1ldHlwZU1hcC5hZGQoInhzbCIsICJ0
ZXh0L3hzbCIpOwotICAgICAgICBtaW1ldHlwZU1hcC5hZGQoImpzIiwgImFwcGxpY2F0aW9uL3gt
amF2YXNjcmlwdCIpOwotICAgICAgICBtaW1ldHlwZU1hcC5hZGQoInhodG1sIiwgImFwcGxpY2F0
aW9uL3hodG1sK3htbCIpOwotICAgICAgICBtaW1ldHlwZU1hcC5hZGQoInJzcyIsICJhcHBsaWNh
dGlvbi9yc3MreG1sIik7Ci0gICAgICAgIG1pbWV0eXBlTWFwLmFkZCgid2ViYXJjaGl2ZSIsICJh
cHBsaWNhdGlvbi94LXdlYmFyY2hpdmUiKTsKLSAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJzdmci
LCAiaW1hZ2Uvc3ZnK3htbCIpOwotICAgICAgICBtaW1ldHlwZU1hcC5hZGQoInN2Z3oiLCAiaW1h
Z2Uvc3ZnK3htbCIpOwotICAgICAgICBtaW1ldHlwZU1hcC5hZGQoImpwZyIsICJpbWFnZS9qcGVn
Iik7Ci0gICAgICAgIG1pbWV0eXBlTWFwLmFkZCgianBlZyIsICJpbWFnZS9qcGVnIik7Ci0gICAg
ICAgIG1pbWV0eXBlTWFwLmFkZCgicG5nIiwgImltYWdlL3BuZyIpOwotICAgICAgICBtaW1ldHlw
ZU1hcC5hZGQoInRpZiIsICJpbWFnZS90aWZmIik7Ci0gICAgICAgIG1pbWV0eXBlTWFwLmFkZCgi
dGlmZiIsICJpbWFnZS90aWZmIik7Ci0gICAgICAgIG1pbWV0eXBlTWFwLmFkZCgiaWNvIiwgImlt
YWdlL2ljbyIpOwotICAgICAgICBtaW1ldHlwZU1hcC5hZGQoImN1ciIsICJpbWFnZS9pY28iKTsK
LSAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJibXAiLCAiaW1hZ2UvYm1wIik7Ci0gICAgICAgIG1p
bWV0eXBlTWFwLmFkZCgiY3NzIiwgInRleHQvY3NzIik7Ci0gICAgICAgIC8vIEZJWE1FOiBDdXN0
b20gZm9udCB3b3JrcyBvbmx5IHdoZW4gTUlNRSBpcyAidGV4dC9wbGFpbiIKLSAgICAgICAgbWlt
ZXR5cGVNYXAuYWRkKCJ0dGYiLCAidGV4dC9wbGFpbiIpOyAvLyAiZm9udC90dGYiCi0gICAgICAg
IG1pbWV0eXBlTWFwLmFkZCgib3RmIiwgInRleHQvcGxhaW4iKTsgLy8gImZvbnQvb3RmIgotI2lm
IEVOQUJMRShXTUwpCi0gICAgICAgIG1pbWV0eXBlTWFwLmFkZCgid21sIiwgInRleHQvdm5kLndh
cC53bWwiKTsKLSNlbmRpZgotI2lmIEVOQUJMRShXQlhNTCkKLSAgICAgICAgbWltZXR5cGVNYXAu
YWRkKCJ3YnhtbCIsICJhcHBsaWNhdGlvbi92bmQud2FwLndtbGMiKTsKLSNlbmRpZgotICAgIH0K
LX0KLQotU3RyaW5nIE1JTUVUeXBlUmVnaXN0cnk6OmdldFByZWZlcnJlZEV4dGVuc2lvbkZvck1J
TUVUeXBlKGNvbnN0IFN0cmluZyYgdHlwZSkKLXsKLSAgICBpZiAodHlwZS5pc0VtcHR5KCkpCi0g
ICAgICAgIHJldHVybiBTdHJpbmcoKTsKLQotICAgIC8vIEF2b2lkIGNvbmZsaWN0cyB3aXRoICJ0
dGYiIGFuZCAib3RmIgotICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0eXBlLCAidGV4dC9wbGFp
biIpKQotICAgICAgICByZXR1cm4gInR4dCI7Ci0KLSAgICBpbml0TUlNRVR5cGVFbnRlbnNpb25N
YXAoKTsKLQotICAgIGZvciAoSGFzaE1hcDxTdHJpbmcsIFN0cmluZz46Oml0ZXJhdG9yIGkgPSBt
aW1ldHlwZU1hcC5iZWdpbigpOyBpICE9IG1pbWV0eXBlTWFwLmVuZCgpOyArK2kpIHsKLSAgICAg
ICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGktPnNlY29uZCwgdHlwZSkpCi0gICAgICAgICAgICBy
ZXR1cm4gaS0+Zmlyc3Q7Ci0gICAgfQotCi0jaWYgRU5BQkxFKFhIVE1MTVApCi0gICAgaWYgKGVx
dWFsSWdub3JpbmdDYXNlKCJhcHBsaWNhdGlvbi92bmQud2FwLnhodG1sK3htbCIsIHR5cGUpKQot
ICAgICAgICByZXR1cm4gU3RyaW5nKCJ4bWwiKTsKLSNlbmRpZgotCi0gICAgcmV0dXJuIFN0cmlu
ZygpOwotfQotCi1TdHJpbmcgTUlNRVR5cGVSZWdpc3RyeTo6Z2V0TUlNRVR5cGVGb3JFeHRlbnNp
b24oY29uc3QgU3RyaW5nICZleHQpCi17Ci0gICAgaWYgKGV4dC5pc0VtcHR5KCkpCi0gICAgICAg
IHJldHVybiBTdHJpbmcoKTsKLQotICAgIGluaXRNSU1FVHlwZUVudGVuc2lvbk1hcCgpOwotCi0g
ICAgU3RyaW5nIHJlc3VsdCA9IG1pbWV0eXBlTWFwLmdldChleHQubG93ZXIoKSk7Ci0gICAgaWYg
KHJlc3VsdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgcmVzdWx0ID0gbWltZVR5cGVGb3JFeHRlbnNp
b24oZXh0KTsKLSAgICAgICAgaWYgKCFyZXN1bHQuaXNFbXB0eSgpKQotICAgICAgICAgICAgbWlt
ZXR5cGVNYXAuYWRkKGV4dCwgcmVzdWx0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdC5pc0Vt
cHR5KCkgPyAidW5rbm93bi91bmtub3duIiA6IHJlc3VsdDsKLX0KLQotYm9vbCBNSU1FVHlwZVJl
Z2lzdHJ5Ojppc0FwcGxpY2F0aW9uUGx1Z2luTUlNRVR5cGUoY29uc3QgU3RyaW5nJikKLXsKLSAg
ICByZXR1cm4gZmFsc2U7Ci19Ci0KLX0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvUGFz
dGVib2FyZFdpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1Bh
c3RlYm9hcmRXaW5DRS5jcHAJKHJldmlzaW9uIDU3Mjg5KQkoZnJvbSBXZWJDb3JlL3BsYXRmb3Jt
L3dpbmNlL1Bhc3RlYm9hcmRXaW5jZS5jcHA6NTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dp
bmNlL1Bhc3RlYm9hcmRXaW5DRS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzMzEgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVU
RVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRF
UiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJQYXN0ZWJvYXJkLmgiCisK
KyNpbmNsdWRlICJDbGlwYm9hcmRVdGlsaXRpZXNXaW4uaCIKKyNpbmNsdWRlICJEb2N1bWVudC5o
IgorI2luY2x1ZGUgIkRvY3VtZW50RnJhZ21lbnQuaCIKKyNpbmNsdWRlICJFbGVtZW50LmgiCisj
aW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJIaXRUZXN0UmVzdWx0LmgiCisjaW5jbHVkZSAi
SW1hZ2UuaCIKKyNpbmNsdWRlICJLVVJMLmgiCisjaW5jbHVkZSAiUGFnZS5oIgorI2luY2x1ZGUg
IlJhbmdlLmgiCisjaW5jbHVkZSAiUmVuZGVySW1hZ2UuaCIKKyNpbmNsdWRlICJUZXh0RW5jb2Rp
bmcuaCIKKyNpbmNsdWRlICJXZWJDb3JlSW5zdGFuY2VIYW5kbGUuaCIKKyNpbmNsdWRlICJtYXJr
dXAuaCIKKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworc3RhdGljIFVJTlQgSFRNTENsaXBib2FyZEZvcm1hdCA9IDA7CitzdGF0aWMgVUlOVCBC
b29rbWFya0NsaXBib2FyZEZvcm1hdCA9IDA7CitzdGF0aWMgVUlOVCBXZWJTbWFydFBhc3RlRm9y
bWF0ID0gMDsKKworZXh0ZXJuIEhEQyBoU2NyZWVuREM7CisKK3N0YXRpYyBMUkVTVUxUIENBTExC
QUNLIFBhc3RlYm9hcmRPd25lclduZFByb2MoSFdORCBoV25kLCBVSU5UIG1lc3NhZ2UsIFdQQVJB
TSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgTFJFU1VMVCBscmVzdWx0ID0gMDsKKyAg
ICBMT05HIGxvbmdQdHIgPSBHZXRXaW5kb3dMb25nKGhXbmQsIDApOworCisgICAgc3dpdGNoICht
ZXNzYWdlKSB7CisgICAgY2FzZSBXTV9SRU5ERVJGT1JNQVQ6CisgICAgICAgIC8vIFRoaXMgbWVz
c2FnZSBjb21lcyB3aGVuIFNldENsaXBib2FyZERhdGEgd2FzIHNlbnQgYSBudWxsIGRhdGEgaGFu
ZGxlCisgICAgICAgIC8vIGFuZCBub3cgaXQncyBjb21lIHRpbWUgdG8gcHV0IHRoZSBkYXRhIG9u
IHRoZSBjbGlwYm9hcmQuCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV01fUkVOREVSQUxMRk9S
TUFUUzoKKyAgICAgICAgLy8gVGhpcyBtZXNzYWdlIGNvbWVzIHdoZW4gU2V0Q2xpcGJvYXJkRGF0
YSB3YXMgc2VudCBhIG51bGwgZGF0YSBoYW5kbGUKKyAgICAgICAgLy8gYW5kIG5vdyB0aGlzIGFw
cGxpY2F0aW9uIGlzIGFib3V0IHRvIHF1aXQsIHNvIGl0IG11c3QgcHV0IGRhdGEgb24KKyAgICAg
ICAgLy8gdGhlIGNsaXBib2FyZCBiZWZvcmUgaXQgZXhpdHMuCisgICAgICAgIGJyZWFrOworICAg
IGNhc2UgV01fREVTVFJPWToKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAg
bHJlc3VsdCA9IERlZldpbmRvd1Byb2MoaFduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwor
ICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGxyZXN1bHQ7Cit9CisKK1Bhc3RlYm9h
cmQqIFBhc3RlYm9hcmQ6OmdlbmVyYWxQYXN0ZWJvYXJkKCkKK3sKKyAgICBzdGF0aWMgUGFzdGVi
b2FyZCogcGFzdGVib2FyZCA9IG5ldyBQYXN0ZWJvYXJkOworICAgIHJldHVybiBwYXN0ZWJvYXJk
OworfQorCitQYXN0ZWJvYXJkOjpQYXN0ZWJvYXJkKCkKK3sKKyAgICAvLyBtYWtlIGEgZHVtbXkg
SFdORCB0byBiZSB0aGUgV2luZG93cyBjbGlwYm9hcmQncyBvd25lcgorICAgIFdORENMQVNTIHdj
ID0gezB9OworICAgIG1lbXNldCgmd2MsIDAsIHNpemVvZih3YykpOworICAgIHdjLmxwZm5XbmRQ
cm9jICAgID0gUGFzdGVib2FyZE93bmVyV25kUHJvYzsKKyAgICB3Yy5oSW5zdGFuY2UgICAgICA9
IFdlYkNvcmU6Omluc3RhbmNlSGFuZGxlKCk7CisgICAgd2MubHBzekNsYXNzTmFtZSAgPSBMIlBh
c3RlYm9hcmRPd25lcldpbmRvd0NsYXNzIjsKKyAgICA6OlJlZ2lzdGVyQ2xhc3MoJndjKTsKKwor
ICAgIG1fb3duZXIgPSA6OkNyZWF0ZVdpbmRvdyhMIlBhc3RlYm9hcmRPd25lcldpbmRvd0NsYXNz
IiwgTCJQYXN0ZWJvYXJkT3duZXJXaW5kb3ciLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICBIV05E
X01FU1NBR0UsIDAsIDAsIDApOworCisgICAgSFRNTENsaXBib2FyZEZvcm1hdCA9IDo6UmVnaXN0
ZXJDbGlwYm9hcmRGb3JtYXQoTCJIVE1MIEZvcm1hdCIpOworICAgIEJvb2ttYXJrQ2xpcGJvYXJk
Rm9ybWF0ID0gOjpSZWdpc3RlckNsaXBib2FyZEZvcm1hdChMIlVuaWZvcm1SZXNvdXJjZUxvY2F0
b3JXIik7CisgICAgV2ViU21hcnRQYXN0ZUZvcm1hdCA9IDo6UmVnaXN0ZXJDbGlwYm9hcmRGb3Jt
YXQoTCJXZWJLaXQgU21hcnQgUGFzdGUgRm9ybWF0Iik7Cit9CisKK3ZvaWQgUGFzdGVib2FyZDo6
Y2xlYXIoKQoreworICAgIGlmICg6Ok9wZW5DbGlwYm9hcmQobV9vd25lcikpIHsKKyAgICAgICAg
OjpFbXB0eUNsaXBib2FyZCgpOworICAgICAgICA6OkNsb3NlQ2xpcGJvYXJkKCk7CisgICAgfQor
fQorCit2b2lkIFBhc3RlYm9hcmQ6OndyaXRlU2VsZWN0aW9uKFJhbmdlKiBzZWxlY3RlZFJhbmdl
LCBib29sIGNhblNtYXJ0Q29weU9yRGVsZXRlLCBGcmFtZSogZnJhbWUpCit7CisgICAgY2xlYXIo
KTsKKworICAgIC8vIFB1dCBDRl9IVE1MIGZvcm1hdCBvbiB0aGUgcGFzdGVib2FyZAorICAgIGlm
ICg6Ok9wZW5DbGlwYm9hcmQobV9vd25lcikpIHsKKyAgICAgICAgRXhjZXB0aW9uQ29kZSBlYyA9
IDA7CisgICAgICAgIFZlY3RvcjxjaGFyPiBkYXRhOworICAgICAgICBtYXJrdXBUb0NGX0hUTUwo
Y3JlYXRlTWFya3VwKHNlbGVjdGVkUmFuZ2UsIDAsIEFubm90YXRlRm9ySW50ZXJjaGFuZ2UpLCBz
ZWxlY3RlZFJhbmdlLT5zdGFydENvbnRhaW5lcihlYyktPmRvY3VtZW50KCktPnVybCgpLCBkYXRh
KTsKKyAgICAgICAgSEdMT0JBTCBjYkRhdGEgPSBjcmVhdGVHbG9iYWxEYXRhKGRhdGEpOworICAg
ICAgICBpZiAoITo6U2V0Q2xpcGJvYXJkRGF0YShIVE1MQ2xpcGJvYXJkRm9ybWF0LCBjYkRhdGEp
KQorICAgICAgICAgICAgOjpHbG9iYWxGcmVlKGNiRGF0YSk7CisgICAgICAgIDo6Q2xvc2VDbGlw
Ym9hcmQoKTsKKyAgICB9CisKKyAgICAvLyBQdXQgcGxhaW4gc3RyaW5nIG9uIHRoZSBwYXN0ZWJv
YXJkLiBDRl9VTklDT0RFVEVYVCBjb3ZlcnMgQ0ZfVEVYVCBhcyB3ZWxsCisgICAgU3RyaW5nIHN0
ciA9IGZyYW1lLT5zZWxlY3RlZFRleHQoKTsKKyAgICByZXBsYWNlTmV3bGluZXNXaXRoV2luZG93
c1N0eWxlTmV3bGluZXMoc3RyKTsKKyAgICByZXBsYWNlTkJTUFdpdGhTcGFjZShzdHIpOworICAg
IGlmICg6Ok9wZW5DbGlwYm9hcmQobV9vd25lcikpIHsKKyAgICAgICAgSEdMT0JBTCBjYkRhdGEg
PSBjcmVhdGVHbG9iYWxEYXRhKHN0cik7CisgICAgICAgIGlmICghOjpTZXRDbGlwYm9hcmREYXRh
KENGX1VOSUNPREVURVhULCBjYkRhdGEpKQorICAgICAgICAgICAgOjpHbG9iYWxGcmVlKGNiRGF0
YSk7CisgICAgICAgIDo6Q2xvc2VDbGlwYm9hcmQoKTsKKyAgICB9CisKKyAgICAvLyBlbmFibGUg
c21hcnQtcmVwbGFjaW5nIGxhdGVyIG9uIGJ5IHB1dHRpbmcgZHVtbXkgZGF0YSBvbiB0aGUgcGFz
dGVib2FyZAorICAgIGlmIChjYW5TbWFydENvcHlPckRlbGV0ZSkgeworICAgICAgICBpZiAoOjpP
cGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7CisgICAgICAgICAgICA6OlNldENsaXBib2FyZERhdGEo
V2ViU21hcnRQYXN0ZUZvcm1hdCwgMCk7CisgICAgICAgICAgICA6OkNsb3NlQ2xpcGJvYXJkKCk7
CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgUGFzdGVib2FyZDo6d3JpdGVQbGFpblRleHQo
Y29uc3QgU3RyaW5nJiB0ZXh0KQoreworICAgIGNsZWFyKCk7CisKKyAgICAvLyBQdXQgcGxhaW4g
c3RyaW5nIG9uIHRoZSBwYXN0ZWJvYXJkLiBDRl9VTklDT0RFVEVYVCBjb3ZlcnMgQ0ZfVEVYVCBh
cyB3ZWxsCisgICAgU3RyaW5nIHN0ciA9IHRleHQ7CisgICAgcmVwbGFjZU5ld2xpbmVzV2l0aFdp
bmRvd3NTdHlsZU5ld2xpbmVzKHN0cik7CisgICAgaWYgKDo6T3BlbkNsaXBib2FyZChtX293bmVy
KSkgeworICAgICAgICBIR0xPQkFMIGNiRGF0YSA9IGNyZWF0ZUdsb2JhbERhdGEoc3RyKTsKKyAg
ICAgICAgaWYgKCE6OlNldENsaXBib2FyZERhdGEoQ0ZfVU5JQ09ERVRFWFQsIGNiRGF0YSkpCisg
ICAgICAgICAgICA6Okdsb2JhbEZyZWUoY2JEYXRhKTsKKyAgICAgICAgOjpDbG9zZUNsaXBib2Fy
ZCgpOworICAgIH0KK30KKwordm9pZCBQYXN0ZWJvYXJkOjp3cml0ZVVSTChjb25zdCBLVVJMJiB1
cmwsIGNvbnN0IFN0cmluZyYgdGl0bGVTdHIsIEZyYW1lKiBmcmFtZSkKK3sKKyAgICBBU1NFUlQo
IXVybC5pc0VtcHR5KCkpOworCisgICAgY2xlYXIoKTsKKworICAgIFN0cmluZyB0aXRsZSh0aXRs
ZVN0cik7CisgICAgaWYgKHRpdGxlLmlzRW1wdHkoKSkgeworICAgICAgICB0aXRsZSA9IHVybC5s
YXN0UGF0aENvbXBvbmVudCgpOworICAgICAgICBpZiAodGl0bGUuaXNFbXB0eSgpKQorICAgICAg
ICAgICAgdGl0bGUgPSB1cmwuaG9zdCgpOworICAgIH0KKworICAgIC8vIHdyaXRlIHRvIGNsaXBi
b2FyZCBpbiBmb3JtYXQgY29tLmFwcGxlLnNhZmFyaS5ib29rbWFya2RhdGEgdG8gYmUgYWJsZSB0
byBwYXN0ZSBpbnRvIHRoZSBib29rbWFya3MgdmlldyB3aXRoIGFwcHJvcHJpYXRlIHRpdGxlCisg
ICAgaWYgKDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgeworICAgICAgICBIR0xPQkFMIGNiRGF0
YSA9IGNyZWF0ZUdsb2JhbERhdGEodXJsLCB0aXRsZSk7CisgICAgICAgIGlmICghOjpTZXRDbGlw
Ym9hcmREYXRhKEJvb2ttYXJrQ2xpcGJvYXJkRm9ybWF0LCBjYkRhdGEpKQorICAgICAgICAgICAg
OjpHbG9iYWxGcmVlKGNiRGF0YSk7CisgICAgICAgIDo6Q2xvc2VDbGlwYm9hcmQoKTsKKyAgICB9
CisKKyAgICAvLyB3cml0ZSB0byBjbGlwYm9hcmQgaW4gZm9ybWF0IENGX0hUTUwgdG8gYmUgYWJs
ZSB0byBwYXN0ZSBpbnRvIGNvbnRlbnRlZGl0YWJsZSBhcmVhcyBhcyBhIGxpbmsKKyAgICBpZiAo
OjpPcGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7CisgICAgICAgIFZlY3RvcjxjaGFyPiBkYXRhOwor
ICAgICAgICBtYXJrdXBUb0NGX0hUTUwodXJsVG9NYXJrdXAodXJsLCB0aXRsZSksICIiLCBkYXRh
KTsKKyAgICAgICAgSEdMT0JBTCBjYkRhdGEgPSBjcmVhdGVHbG9iYWxEYXRhKGRhdGEpOworICAg
ICAgICBpZiAoITo6U2V0Q2xpcGJvYXJkRGF0YShIVE1MQ2xpcGJvYXJkRm9ybWF0LCBjYkRhdGEp
KQorICAgICAgICAgICAgOjpHbG9iYWxGcmVlKGNiRGF0YSk7CisgICAgICAgIDo6Q2xvc2VDbGlw
Ym9hcmQoKTsKKyAgICB9CisKKyAgICAvLyBiYXJlLWJvbmVzIENGX1VOSUNPREVURVhUIHN1cHBv
cnQKKyAgICBpZiAoOjpPcGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7CisgICAgICAgIEhHTE9CQUwg
Y2JEYXRhID0gY3JlYXRlR2xvYmFsRGF0YSh1cmwuc3RyaW5nKCkpOworICAgICAgICBpZiAoITo6
U2V0Q2xpcGJvYXJkRGF0YShDRl9VTklDT0RFVEVYVCwgY2JEYXRhKSkKKyAgICAgICAgICAgIDo6
R2xvYmFsRnJlZShjYkRhdGEpOworICAgICAgICA6OkNsb3NlQ2xpcGJvYXJkKCk7CisgICAgfQor
fQorCit2b2lkIFBhc3RlYm9hcmQ6OndyaXRlSW1hZ2UoTm9kZSogbm9kZSwgY29uc3QgS1VSTCYs
IGNvbnN0IFN0cmluZyYpCit7CisgICAgQVNTRVJUKG5vZGUgJiYgbm9kZS0+cmVuZGVyZXIoKSAm
JiBub2RlLT5yZW5kZXJlcigpLT5pc0ltYWdlKCkpOworICAgIFJlbmRlckltYWdlKiByZW5kZXJl
ciA9IHN0YXRpY19jYXN0PFJlbmRlckltYWdlKj4obm9kZS0+cmVuZGVyZXIoKSk7CisgICAgQ2Fj
aGVkSW1hZ2UqIGNhY2hlZEltYWdlID0gc3RhdGljX2Nhc3Q8Q2FjaGVkSW1hZ2UqPihyZW5kZXJl
ci0+Y2FjaGVkSW1hZ2UoKSk7CisgICAgQVNTRVJUKGNhY2hlZEltYWdlKTsKKyAgICBJbWFnZSog
aW1hZ2UgPSBjYWNoZWRJbWFnZS0+aW1hZ2UoKTsKKyAgICBBU1NFUlQoaW1hZ2UpOworCisgICAg
Y2xlYXIoKTsKKworICAgIFJlZlB0cjxTaGFyZWRCaXRtYXA+IHNvdXJjZUJtcCA9IGltYWdlLT5u
YXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgpOworICAgIGlmICghc291cmNlQm1wKQorICAgICAg
ICByZXR1cm47CisKKyAgICBJbnRSZWN0IHJlY3QoMCwgMCwgc291cmNlQm1wLT53aWR0aCgpLCBz
b3VyY2VCbXAtPmhlaWdodCgpKTsKKyAgICBCaXRtYXBJbmZvIGJtcEluZm87CisgICAgdm9pZCog
cGl4ZWxzOworICAgIEhCSVRNQVAgcmVzdWx0Qml0bWFwID0gc291cmNlQm1wLT5jbGlwQml0bWFw
KHJlY3QsIHRydWUsIGJtcEluZm8sIHBpeGVscyk7CisgICAgaWYgKCFyZXN1bHRCaXRtYXApCisg
ICAgICAgIHJldHVybjsKKworICAgIGlmICg6Ok9wZW5DbGlwYm9hcmQobV9vd25lcikpIHsKKyAg
ICAgICAgOjpTZXRDbGlwYm9hcmREYXRhKENGX0JJVE1BUCwgcmVzdWx0Qml0bWFwKTsKKyAgICAg
ICAgOjpDbG9zZUNsaXBib2FyZCgpOworICAgIH0gZWxzZQorICAgICAgICBEZWxldGVPYmplY3Qo
cmVzdWx0Qml0bWFwKTsKK30KKworYm9vbCBQYXN0ZWJvYXJkOjpjYW5TbWFydFJlcGxhY2UoKQor
eworICAgIHJldHVybiA6OklzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlKFdlYlNtYXJ0UGFzdGVG
b3JtYXQpOworfQorCitTdHJpbmcgUGFzdGVib2FyZDo6cGxhaW5UZXh0KEZyYW1lKiBmcmFtZSkK
K3sKKyAgICBpZiAoOjpJc0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZShDRl9VTklDT0RFVEVYVCkg
JiYgOjpPcGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7CisgICAgICAgIEhBTkRMRSBjYkRhdGEgPSA6
OkdldENsaXBib2FyZERhdGEoQ0ZfVU5JQ09ERVRFWFQpOworICAgICAgICBpZiAoY2JEYXRhKSB7
CisgICAgICAgICAgICBVQ2hhciogYnVmZmVyID0gKFVDaGFyKilHbG9iYWxMb2NrKGNiRGF0YSk7
CisgICAgICAgICAgICBTdHJpbmcgZnJvbUNsaXBib2FyZChidWZmZXIpOworICAgICAgICAgICAg
R2xvYmFsVW5sb2NrKGNiRGF0YSk7CisgICAgICAgICAgICBDbG9zZUNsaXBib2FyZCgpOworICAg
ICAgICAgICAgcmV0dXJuIGZyb21DbGlwYm9hcmQ7CisgICAgICAgIH0gZWxzZQorICAgICAgICAg
ICAgQ2xvc2VDbGlwYm9hcmQoKTsKKyAgICB9CisKKyAgICBpZiAoOjpJc0NsaXBib2FyZEZvcm1h
dEF2YWlsYWJsZShDRl9URVhUKSAmJiA6Ok9wZW5DbGlwYm9hcmQobV9vd25lcikpIHsKKyAgICAg
ICAgSEFORExFIGNiRGF0YSA9IDo6R2V0Q2xpcGJvYXJkRGF0YShDRl9URVhUKTsKKyAgICAgICAg
aWYgKGNiRGF0YSkgeworICAgICAgICAgICAgY2hhciogYnVmZmVyID0gKGNoYXIqKUdsb2JhbExv
Y2soY2JEYXRhKTsKKyAgICAgICAgICAgIFN0cmluZyBmcm9tQ2xpcGJvYXJkKGJ1ZmZlcik7Cisg
ICAgICAgICAgICBHbG9iYWxVbmxvY2soY2JEYXRhKTsKKyAgICAgICAgICAgIENsb3NlQ2xpcGJv
YXJkKCk7CisgICAgICAgICAgICByZXR1cm4gZnJvbUNsaXBib2FyZDsKKyAgICAgICAgfSBlbHNl
CisgICAgICAgICAgICBDbG9zZUNsaXBib2FyZCgpOworICAgIH0KKworICAgIHJldHVybiBTdHJp
bmcoKTsKK30KKworUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBQYXN0ZWJvYXJkOjpkb2N1
bWVudEZyYWdtZW50KEZyYW1lKiBmcmFtZSwgUGFzc1JlZlB0cjxSYW5nZT4gY29udGV4dCwgYm9v
bCBhbGxvd1BsYWluVGV4dCwgYm9vbCYgY2hvc2VQbGFpblRleHQpCit7CisgICAgY2hvc2VQbGFp
blRleHQgPSBmYWxzZTsKKworICAgIGlmICg6OklzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlKEhU
TUxDbGlwYm9hcmRGb3JtYXQpICYmIDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgeworICAgICAg
ICAvLyBnZXQgZGF0YSBvZmYgb2YgY2xpcGJvYXJkCisgICAgICAgIEhBTkRMRSBjYkRhdGEgPSA6
OkdldENsaXBib2FyZERhdGEoSFRNTENsaXBib2FyZEZvcm1hdCk7CisgICAgICAgIGlmIChjYkRh
dGEpIHsKKyAgICAgICAgICAgIFNJWkVfVCBkYXRhU2l6ZSA9IDo6R2xvYmFsU2l6ZShjYkRhdGEp
OworICAgICAgICAgICAgU3RyaW5nIGNmX2h0bWwoVVRGOEVuY29kaW5nKCkuZGVjb2RlKChjaGFy
KilHbG9iYWxMb2NrKGNiRGF0YSksIGRhdGFTaXplKSk7CisgICAgICAgICAgICBHbG9iYWxVbmxv
Y2soY2JEYXRhKTsKKyAgICAgICAgICAgIENsb3NlQ2xpcGJvYXJkKCk7CisKKyAgICAgICAgICAg
IFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gZnJhZ21lbnQgPSBmcmFnbWVudEZyb21DRl9I
VE1MKGZyYW1lLT5kb2N1bWVudCgpLCBjZl9odG1sKTsKKyAgICAgICAgICAgIGlmIChmcmFnbWVu
dCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZnJhZ21lbnQ7CisgICAgICAgIH0gZWxzZQorICAg
ICAgICAgICAgQ2xvc2VDbGlwYm9hcmQoKTsKKyAgICB9CisKKyAgICBpZiAoYWxsb3dQbGFpblRl
eHQgJiYgSXNDbGlwYm9hcmRGb3JtYXRBdmFpbGFibGUoQ0ZfVU5JQ09ERVRFWFQpKSB7CisgICAg
ICAgIGNob3NlUGxhaW5UZXh0ID0gdHJ1ZTsKKyAgICAgICAgaWYgKE9wZW5DbGlwYm9hcmQobV9v
d25lcikpIHsKKyAgICAgICAgICAgIEhBTkRMRSBjYkRhdGEgPSBHZXRDbGlwYm9hcmREYXRhKENG
X1VOSUNPREVURVhUKTsKKyAgICAgICAgICAgIGlmIChjYkRhdGEpIHsKKyAgICAgICAgICAgICAg
ICBVQ2hhciogYnVmZmVyID0gKFVDaGFyKilHbG9iYWxMb2NrKGNiRGF0YSk7CisgICAgICAgICAg
ICAgICAgU3RyaW5nIHN0cihidWZmZXIpOworICAgICAgICAgICAgICAgIEdsb2JhbFVubG9jayhj
YkRhdGEpOworICAgICAgICAgICAgICAgIENsb3NlQ2xpcGJvYXJkKCk7CisgICAgICAgICAgICAg
ICAgUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnRGcm9t
VGV4dChjb250ZXh0LmdldCgpLCBzdHIpOworICAgICAgICAgICAgICAgIGlmIChmcmFnbWVudCkK
KyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyYWdtZW50LnJlbGVhc2UoKTsKKyAgICAgICAg
ICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIENsb3NlQ2xpcGJvYXJkKCk7CisgICAgICAgIH0K
KyAgICB9CisKKyAgICBpZiAoYWxsb3dQbGFpblRleHQgJiYgOjpJc0NsaXBib2FyZEZvcm1hdEF2
YWlsYWJsZShDRl9URVhUKSkgeworICAgICAgICBjaG9zZVBsYWluVGV4dCA9IHRydWU7CisgICAg
ICAgIGlmICg6Ok9wZW5DbGlwYm9hcmQobV9vd25lcikpIHsKKyAgICAgICAgICAgIEhBTkRMRSBj
YkRhdGEgPSA6OkdldENsaXBib2FyZERhdGEoQ0ZfVEVYVCk7CisgICAgICAgICAgICBpZiAoY2JE
YXRhKSB7CisgICAgICAgICAgICAgICAgY2hhciogYnVmZmVyID0gKGNoYXIqKUdsb2JhbExvY2so
Y2JEYXRhKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc3RyKGJ1ZmZlcik7CisgICAgICAgICAg
ICAgICAgR2xvYmFsVW5sb2NrKGNiRGF0YSk7CisgICAgICAgICAgICAgICAgQ2xvc2VDbGlwYm9h
cmQoKTsKKyAgICAgICAgICAgICAgICBSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gZnJhZ21lbnQg
PSBjcmVhdGVGcmFnbWVudEZyb21UZXh0KGNvbnRleHQuZ2V0KCksIHN0cik7CisgICAgICAgICAg
ICAgICAgaWYgKGZyYWdtZW50KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJhZ21lbnQu
cmVsZWFzZSgpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgQ2xvc2VDbGlw
Ym9hcmQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitib29sIFBh
c3RlYm9hcmQ6Omhhc0RhdGEoKQoreworICAgIHJldHVybiBoYXNEYXRhSW5Gb3JtYXQoQ0ZfVU5J
Q09ERVRFWFQpIHx8IGhhc0RhdGFJbkZvcm1hdChDRl9URVhUKTsKK30KKworYm9vbCBQYXN0ZWJv
YXJkOjpoYXNEYXRhSW5Gb3JtYXQodW5zaWduZWQgaW50IGZvcm1hdCkKK3sKKyAgICByZXR1cm4g
OjpJc0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZShmb3JtYXQpOworfQorCit9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1Bhc3RlYm9hcmRXaW5jZS5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9QYXN0ZWJvYXJkV2luY2Uu
Y3BwCShyZXZpc2lvbiA1NzI4OSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvUGFzdGVib2Fy
ZFdpbmNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSwzMzEgKzAsMCBAQAotLyoKLSAqIENvcHly
aWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICog
Q29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCi0gKgotICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgot
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgot
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCi0g
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAotICovCi0KLQotI2lu
Y2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlBhc3RlYm9hcmQuaCIKLQotI2luY2x1ZGUgIkNs
aXBib2FyZFV0aWxpdGllc1dpbi5oIgotI2luY2x1ZGUgIkRvY3VtZW50LmgiCi0jaW5jbHVkZSAi
RG9jdW1lbnRGcmFnbWVudC5oIgotI2luY2x1ZGUgIkVsZW1lbnQuaCIKLSNpbmNsdWRlICJGcmFt
ZS5oIgotI2luY2x1ZGUgIkhpdFRlc3RSZXN1bHQuaCIKLSNpbmNsdWRlICJJbWFnZS5oIgotI2lu
Y2x1ZGUgIktVUkwuaCIKLSNpbmNsdWRlICJQYWdlLmgiCi0jaW5jbHVkZSAiUmFuZ2UuaCIKLSNp
bmNsdWRlICJSZW5kZXJJbWFnZS5oIgotI2luY2x1ZGUgIlRleHRFbmNvZGluZy5oIgotI2luY2x1
ZGUgIldlYkNvcmVJbnN0YW5jZUhhbmRsZS5oIgotI2luY2x1ZGUgIm1hcmt1cC5oIgotI2luY2x1
ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1zdGF0aWMg
VUlOVCBIVE1MQ2xpcGJvYXJkRm9ybWF0ID0gMDsKLXN0YXRpYyBVSU5UIEJvb2ttYXJrQ2xpcGJv
YXJkRm9ybWF0ID0gMDsKLXN0YXRpYyBVSU5UIFdlYlNtYXJ0UGFzdGVGb3JtYXQgPSAwOwotCi1l
eHRlcm4gSERDIGhTY3JlZW5EQzsKLQotc3RhdGljIExSRVNVTFQgQ0FMTEJBQ0sgUGFzdGVib2Fy
ZE93bmVyV25kUHJvYyhIV05EIGhXbmQsIFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBB
UkFNIGxQYXJhbSkKLXsKLSAgICBMUkVTVUxUIGxyZXN1bHQgPSAwOwotICAgIExPTkcgbG9uZ1B0
ciA9IEdldFdpbmRvd0xvbmcoaFduZCwgMCk7Ci0KLSAgICBzd2l0Y2ggKG1lc3NhZ2UpIHsKLSAg
ICBjYXNlIFdNX1JFTkRFUkZPUk1BVDoKLSAgICAgICAgLy8gVGhpcyBtZXNzYWdlIGNvbWVzIHdo
ZW4gU2V0Q2xpcGJvYXJkRGF0YSB3YXMgc2VudCBhIG51bGwgZGF0YSBoYW5kbGUKLSAgICAgICAg
Ly8gYW5kIG5vdyBpdCdzIGNvbWUgdGltZSB0byBwdXQgdGhlIGRhdGEgb24gdGhlIGNsaXBib2Fy
ZC4KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXTV9SRU5ERVJBTExGT1JNQVRTOgotICAgICAg
ICAvLyBUaGlzIG1lc3NhZ2UgY29tZXMgd2hlbiBTZXRDbGlwYm9hcmREYXRhIHdhcyBzZW50IGEg
bnVsbCBkYXRhIGhhbmRsZQotICAgICAgICAvLyBhbmQgbm93IHRoaXMgYXBwbGljYXRpb24gaXMg
YWJvdXQgdG8gcXVpdCwgc28gaXQgbXVzdCBwdXQgZGF0YSBvbgotICAgICAgICAvLyB0aGUgY2xp
cGJvYXJkIGJlZm9yZSBpdCBleGl0cy4KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXTV9ERVNU
Uk9ZOgotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBscmVzdWx0ID0gRGVm
V2luZG93UHJvYyhoV25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgICAgIGJyZWFr
OwotICAgIH0KLSAgICByZXR1cm4gbHJlc3VsdDsKLX0KLQotUGFzdGVib2FyZCogUGFzdGVib2Fy
ZDo6Z2VuZXJhbFBhc3RlYm9hcmQoKQotewotICAgIHN0YXRpYyBQYXN0ZWJvYXJkKiBwYXN0ZWJv
YXJkID0gbmV3IFBhc3RlYm9hcmQ7Ci0gICAgcmV0dXJuIHBhc3RlYm9hcmQ7Ci19Ci0KLVBhc3Rl
Ym9hcmQ6OlBhc3RlYm9hcmQoKQotewotICAgIC8vIG1ha2UgYSBkdW1teSBIV05EIHRvIGJlIHRo
ZSBXaW5kb3dzIGNsaXBib2FyZCdzIG93bmVyCi0gICAgV05EQ0xBU1Mgd2MgPSB7MH07Ci0gICAg
bWVtc2V0KCZ3YywgMCwgc2l6ZW9mKHdjKSk7Ci0gICAgd2MubHBmblduZFByb2MgICAgPSBQYXN0
ZWJvYXJkT3duZXJXbmRQcm9jOwotICAgIHdjLmhJbnN0YW5jZSAgICAgID0gV2ViQ29yZTo6aW5z
dGFuY2VIYW5kbGUoKTsKLSAgICB3Yy5scHN6Q2xhc3NOYW1lICA9IEwiUGFzdGVib2FyZE93bmVy
V2luZG93Q2xhc3MiOwotICAgIDo6UmVnaXN0ZXJDbGFzcygmd2MpOwotCi0gICAgbV9vd25lciA9
IDo6Q3JlYXRlV2luZG93KEwiUGFzdGVib2FyZE93bmVyV2luZG93Q2xhc3MiLCBMIlBhc3RlYm9h
cmRPd25lcldpbmRvdyIsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAgIEhXTkRfTUVTU0FHRSwgMCwg
MCwgMCk7Ci0KLSAgICBIVE1MQ2xpcGJvYXJkRm9ybWF0ID0gOjpSZWdpc3RlckNsaXBib2FyZEZv
cm1hdChMIkhUTUwgRm9ybWF0Iik7Ci0gICAgQm9va21hcmtDbGlwYm9hcmRGb3JtYXQgPSA6OlJl
Z2lzdGVyQ2xpcGJvYXJkRm9ybWF0KEwiVW5pZm9ybVJlc291cmNlTG9jYXRvclciKTsKLSAgICBX
ZWJTbWFydFBhc3RlRm9ybWF0ID0gOjpSZWdpc3RlckNsaXBib2FyZEZvcm1hdChMIldlYktpdCBT
bWFydCBQYXN0ZSBGb3JtYXQiKTsKLX0KLQotdm9pZCBQYXN0ZWJvYXJkOjpjbGVhcigpCi17Ci0g
ICAgaWYgKDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgewotICAgICAgICA6OkVtcHR5Q2xpcGJv
YXJkKCk7Ci0gICAgICAgIDo6Q2xvc2VDbGlwYm9hcmQoKTsKLSAgICB9Ci19Ci0KLXZvaWQgUGFz
dGVib2FyZDo6d3JpdGVTZWxlY3Rpb24oUmFuZ2UqIHNlbGVjdGVkUmFuZ2UsIGJvb2wgY2FuU21h
cnRDb3B5T3JEZWxldGUsIEZyYW1lKiBmcmFtZSkKLXsKLSAgICBjbGVhcigpOwotCi0gICAgLy8g
UHV0IENGX0hUTUwgZm9ybWF0IG9uIHRoZSBwYXN0ZWJvYXJkCi0gICAgaWYgKDo6T3BlbkNsaXBi
b2FyZChtX293bmVyKSkgewotICAgICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICAgICAg
VmVjdG9yPGNoYXI+IGRhdGE7Ci0gICAgICAgIG1hcmt1cFRvQ0ZfSFRNTChjcmVhdGVNYXJrdXAo
c2VsZWN0ZWRSYW5nZSwgMCwgQW5ub3RhdGVGb3JJbnRlcmNoYW5nZSksIHNlbGVjdGVkUmFuZ2Ut
PnN0YXJ0Q29udGFpbmVyKGVjKS0+ZG9jdW1lbnQoKS0+dXJsKCksIGRhdGEpOwotICAgICAgICBI
R0xPQkFMIGNiRGF0YSA9IGNyZWF0ZUdsb2JhbERhdGEoZGF0YSk7Ci0gICAgICAgIGlmICghOjpT
ZXRDbGlwYm9hcmREYXRhKEhUTUxDbGlwYm9hcmRGb3JtYXQsIGNiRGF0YSkpCi0gICAgICAgICAg
ICA6Okdsb2JhbEZyZWUoY2JEYXRhKTsKLSAgICAgICAgOjpDbG9zZUNsaXBib2FyZCgpOwotICAg
IH0KLQotICAgIC8vIFB1dCBwbGFpbiBzdHJpbmcgb24gdGhlIHBhc3RlYm9hcmQuIENGX1VOSUNP
REVURVhUIGNvdmVycyBDRl9URVhUIGFzIHdlbGwKLSAgICBTdHJpbmcgc3RyID0gZnJhbWUtPnNl
bGVjdGVkVGV4dCgpOwotICAgIHJlcGxhY2VOZXdsaW5lc1dpdGhXaW5kb3dzU3R5bGVOZXdsaW5l
cyhzdHIpOwotICAgIHJlcGxhY2VOQlNQV2l0aFNwYWNlKHN0cik7Ci0gICAgaWYgKDo6T3BlbkNs
aXBib2FyZChtX293bmVyKSkgewotICAgICAgICBIR0xPQkFMIGNiRGF0YSA9IGNyZWF0ZUdsb2Jh
bERhdGEoc3RyKTsKLSAgICAgICAgaWYgKCE6OlNldENsaXBib2FyZERhdGEoQ0ZfVU5JQ09ERVRF
WFQsIGNiRGF0YSkpCi0gICAgICAgICAgICA6Okdsb2JhbEZyZWUoY2JEYXRhKTsKLSAgICAgICAg
OjpDbG9zZUNsaXBib2FyZCgpOwotICAgIH0KLQotICAgIC8vIGVuYWJsZSBzbWFydC1yZXBsYWNp
bmcgbGF0ZXIgb24gYnkgcHV0dGluZyBkdW1teSBkYXRhIG9uIHRoZSBwYXN0ZWJvYXJkCi0gICAg
aWYgKGNhblNtYXJ0Q29weU9yRGVsZXRlKSB7Ci0gICAgICAgIGlmICg6Ok9wZW5DbGlwYm9hcmQo
bV9vd25lcikpIHsKLSAgICAgICAgICAgIDo6U2V0Q2xpcGJvYXJkRGF0YShXZWJTbWFydFBhc3Rl
Rm9ybWF0LCAwKTsKLSAgICAgICAgICAgIDo6Q2xvc2VDbGlwYm9hcmQoKTsKLSAgICAgICAgfQot
ICAgIH0KLX0KLQotdm9pZCBQYXN0ZWJvYXJkOjp3cml0ZVBsYWluVGV4dChjb25zdCBTdHJpbmcm
IHRleHQpCi17Ci0gICAgY2xlYXIoKTsKLQotICAgIC8vIFB1dCBwbGFpbiBzdHJpbmcgb24gdGhl
IHBhc3RlYm9hcmQuIENGX1VOSUNPREVURVhUIGNvdmVycyBDRl9URVhUIGFzIHdlbGwKLSAgICBT
dHJpbmcgc3RyID0gdGV4dDsKLSAgICByZXBsYWNlTmV3bGluZXNXaXRoV2luZG93c1N0eWxlTmV3
bGluZXMoc3RyKTsKLSAgICBpZiAoOjpPcGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7Ci0gICAgICAg
IEhHTE9CQUwgY2JEYXRhID0gY3JlYXRlR2xvYmFsRGF0YShzdHIpOwotICAgICAgICBpZiAoITo6
U2V0Q2xpcGJvYXJkRGF0YShDRl9VTklDT0RFVEVYVCwgY2JEYXRhKSkKLSAgICAgICAgICAgIDo6
R2xvYmFsRnJlZShjYkRhdGEpOwotICAgICAgICA6OkNsb3NlQ2xpcGJvYXJkKCk7Ci0gICAgfQot
fQotCi12b2lkIFBhc3RlYm9hcmQ6OndyaXRlVVJMKGNvbnN0IEtVUkwmIHVybCwgY29uc3QgU3Ry
aW5nJiB0aXRsZVN0ciwgRnJhbWUqIGZyYW1lKQotewotICAgIEFTU0VSVCghdXJsLmlzRW1wdHko
KSk7Ci0KLSAgICBjbGVhcigpOwotCi0gICAgU3RyaW5nIHRpdGxlKHRpdGxlU3RyKTsKLSAgICBp
ZiAodGl0bGUuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHRpdGxlID0gdXJsLmxhc3RQYXRoQ29tcG9u
ZW50KCk7Ci0gICAgICAgIGlmICh0aXRsZS5pc0VtcHR5KCkpCi0gICAgICAgICAgICB0aXRsZSA9
IHVybC5ob3N0KCk7Ci0gICAgfQotCi0gICAgLy8gd3JpdGUgdG8gY2xpcGJvYXJkIGluIGZvcm1h
dCBjb20uYXBwbGUuc2FmYXJpLmJvb2ttYXJrZGF0YSB0byBiZSBhYmxlIHRvIHBhc3RlIGludG8g
dGhlIGJvb2ttYXJrcyB2aWV3IHdpdGggYXBwcm9wcmlhdGUgdGl0bGUKLSAgICBpZiAoOjpPcGVu
Q2xpcGJvYXJkKG1fb3duZXIpKSB7Ci0gICAgICAgIEhHTE9CQUwgY2JEYXRhID0gY3JlYXRlR2xv
YmFsRGF0YSh1cmwsIHRpdGxlKTsKLSAgICAgICAgaWYgKCE6OlNldENsaXBib2FyZERhdGEoQm9v
a21hcmtDbGlwYm9hcmRGb3JtYXQsIGNiRGF0YSkpCi0gICAgICAgICAgICA6Okdsb2JhbEZyZWUo
Y2JEYXRhKTsKLSAgICAgICAgOjpDbG9zZUNsaXBib2FyZCgpOwotICAgIH0KLQotICAgIC8vIHdy
aXRlIHRvIGNsaXBib2FyZCBpbiBmb3JtYXQgQ0ZfSFRNTCB0byBiZSBhYmxlIHRvIHBhc3RlIGlu
dG8gY29udGVudGVkaXRhYmxlIGFyZWFzIGFzIGEgbGluawotICAgIGlmICg6Ok9wZW5DbGlwYm9h
cmQobV9vd25lcikpIHsKLSAgICAgICAgVmVjdG9yPGNoYXI+IGRhdGE7Ci0gICAgICAgIG1hcmt1
cFRvQ0ZfSFRNTCh1cmxUb01hcmt1cCh1cmwsIHRpdGxlKSwgIiIsIGRhdGEpOwotICAgICAgICBI
R0xPQkFMIGNiRGF0YSA9IGNyZWF0ZUdsb2JhbERhdGEoZGF0YSk7Ci0gICAgICAgIGlmICghOjpT
ZXRDbGlwYm9hcmREYXRhKEhUTUxDbGlwYm9hcmRGb3JtYXQsIGNiRGF0YSkpCi0gICAgICAgICAg
ICA6Okdsb2JhbEZyZWUoY2JEYXRhKTsKLSAgICAgICAgOjpDbG9zZUNsaXBib2FyZCgpOwotICAg
IH0KLQotICAgIC8vIGJhcmUtYm9uZXMgQ0ZfVU5JQ09ERVRFWFQgc3VwcG9ydAotICAgIGlmICg6
Ok9wZW5DbGlwYm9hcmQobV9vd25lcikpIHsKLSAgICAgICAgSEdMT0JBTCBjYkRhdGEgPSBjcmVh
dGVHbG9iYWxEYXRhKHVybC5zdHJpbmcoKSk7Ci0gICAgICAgIGlmICghOjpTZXRDbGlwYm9hcmRE
YXRhKENGX1VOSUNPREVURVhULCBjYkRhdGEpKQotICAgICAgICAgICAgOjpHbG9iYWxGcmVlKGNi
RGF0YSk7Ci0gICAgICAgIDo6Q2xvc2VDbGlwYm9hcmQoKTsKLSAgICB9Ci19Ci0KLXZvaWQgUGFz
dGVib2FyZDo6d3JpdGVJbWFnZShOb2RlKiBub2RlLCBjb25zdCBLVVJMJiwgY29uc3QgU3RyaW5n
JikKLXsKLSAgICBBU1NFUlQobm9kZSAmJiBub2RlLT5yZW5kZXJlcigpICYmIG5vZGUtPnJlbmRl
cmVyKCktPmlzSW1hZ2UoKSk7Ci0gICAgUmVuZGVySW1hZ2UqIHJlbmRlcmVyID0gc3RhdGljX2Nh
c3Q8UmVuZGVySW1hZ2UqPihub2RlLT5yZW5kZXJlcigpKTsKLSAgICBDYWNoZWRJbWFnZSogY2Fj
aGVkSW1hZ2UgPSBzdGF0aWNfY2FzdDxDYWNoZWRJbWFnZSo+KHJlbmRlcmVyLT5jYWNoZWRJbWFn
ZSgpKTsKLSAgICBBU1NFUlQoY2FjaGVkSW1hZ2UpOwotICAgIEltYWdlKiBpbWFnZSA9IGNhY2hl
ZEltYWdlLT5pbWFnZSgpOwotICAgIEFTU0VSVChpbWFnZSk7Ci0KLSAgICBjbGVhcigpOwotCi0g
ICAgUmVmUHRyPFNoYXJlZEJpdG1hcD4gc291cmNlQm1wID0gaW1hZ2UtPm5hdGl2ZUltYWdlRm9y
Q3VycmVudEZyYW1lKCk7Ci0gICAgaWYgKCFzb3VyY2VCbXApCi0gICAgICAgIHJldHVybjsKLQot
ICAgIEludFJlY3QgcmVjdCgwLCAwLCBzb3VyY2VCbXAtPndpZHRoKCksIHNvdXJjZUJtcC0+aGVp
Z2h0KCkpOwotICAgIEJpdG1hcEluZm8gYm1wSW5mbzsKLSAgICB2b2lkKiBwaXhlbHM7Ci0gICAg
SEJJVE1BUCByZXN1bHRCaXRtYXAgPSBzb3VyY2VCbXAtPmNsaXBCaXRtYXAocmVjdCwgdHJ1ZSwg
Ym1wSW5mbywgcGl4ZWxzKTsKLSAgICBpZiAoIXJlc3VsdEJpdG1hcCkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgaWYgKDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgewotICAgICAgICA6OlNldENs
aXBib2FyZERhdGEoQ0ZfQklUTUFQLCByZXN1bHRCaXRtYXApOwotICAgICAgICA6OkNsb3NlQ2xp
cGJvYXJkKCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIERlbGV0ZU9iamVjdChyZXN1bHRCaXRtYXAp
OwotfQotCi1ib29sIFBhc3RlYm9hcmQ6OmNhblNtYXJ0UmVwbGFjZSgpCi17Ci0gICAgcmV0dXJu
IDo6SXNDbGlwYm9hcmRGb3JtYXRBdmFpbGFibGUoV2ViU21hcnRQYXN0ZUZvcm1hdCk7Ci19Ci0K
LVN0cmluZyBQYXN0ZWJvYXJkOjpwbGFpblRleHQoRnJhbWUqIGZyYW1lKQotewotICAgIGlmICg6
OklzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlKENGX1VOSUNPREVURVhUKSAmJiA6Ok9wZW5DbGlw
Ym9hcmQobV9vd25lcikpIHsKLSAgICAgICAgSEFORExFIGNiRGF0YSA9IDo6R2V0Q2xpcGJvYXJk
RGF0YShDRl9VTklDT0RFVEVYVCk7Ci0gICAgICAgIGlmIChjYkRhdGEpIHsKLSAgICAgICAgICAg
IFVDaGFyKiBidWZmZXIgPSAoVUNoYXIqKUdsb2JhbExvY2soY2JEYXRhKTsKLSAgICAgICAgICAg
IFN0cmluZyBmcm9tQ2xpcGJvYXJkKGJ1ZmZlcik7Ci0gICAgICAgICAgICBHbG9iYWxVbmxvY2so
Y2JEYXRhKTsKLSAgICAgICAgICAgIENsb3NlQ2xpcGJvYXJkKCk7Ci0gICAgICAgICAgICByZXR1
cm4gZnJvbUNsaXBib2FyZDsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBDbG9zZUNsaXBi
b2FyZCgpOwotICAgIH0KLQotICAgIGlmICg6OklzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlKENG
X1RFWFQpICYmIDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgewotICAgICAgICBIQU5ETEUgY2JE
YXRhID0gOjpHZXRDbGlwYm9hcmREYXRhKENGX1RFWFQpOwotICAgICAgICBpZiAoY2JEYXRhKSB7
Ci0gICAgICAgICAgICBjaGFyKiBidWZmZXIgPSAoY2hhciopR2xvYmFsTG9jayhjYkRhdGEpOwot
ICAgICAgICAgICAgU3RyaW5nIGZyb21DbGlwYm9hcmQoYnVmZmVyKTsKLSAgICAgICAgICAgIEds
b2JhbFVubG9jayhjYkRhdGEpOwotICAgICAgICAgICAgQ2xvc2VDbGlwYm9hcmQoKTsKLSAgICAg
ICAgICAgIHJldHVybiBmcm9tQ2xpcGJvYXJkOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAg
IENsb3NlQ2xpcGJvYXJkKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFN0cmluZygpOwotfQotCi1Q
YXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IFBhc3RlYm9hcmQ6OmRvY3VtZW50RnJhZ21lbnQo
RnJhbWUqIGZyYW1lLCBQYXNzUmVmUHRyPFJhbmdlPiBjb250ZXh0LCBib29sIGFsbG93UGxhaW5U
ZXh0LCBib29sJiBjaG9zZVBsYWluVGV4dCkKLXsKLSAgICBjaG9zZVBsYWluVGV4dCA9IGZhbHNl
OwotCi0gICAgaWYgKDo6SXNDbGlwYm9hcmRGb3JtYXRBdmFpbGFibGUoSFRNTENsaXBib2FyZEZv
cm1hdCkgJiYgOjpPcGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7Ci0gICAgICAgIC8vIGdldCBkYXRh
IG9mZiBvZiBjbGlwYm9hcmQKLSAgICAgICAgSEFORExFIGNiRGF0YSA9IDo6R2V0Q2xpcGJvYXJk
RGF0YShIVE1MQ2xpcGJvYXJkRm9ybWF0KTsKLSAgICAgICAgaWYgKGNiRGF0YSkgewotICAgICAg
ICAgICAgU0laRV9UIGRhdGFTaXplID0gOjpHbG9iYWxTaXplKGNiRGF0YSk7Ci0gICAgICAgICAg
ICBTdHJpbmcgY2ZfaHRtbChVVEY4RW5jb2RpbmcoKS5kZWNvZGUoKGNoYXIqKUdsb2JhbExvY2so
Y2JEYXRhKSwgZGF0YVNpemUpKTsKLSAgICAgICAgICAgIEdsb2JhbFVubG9jayhjYkRhdGEpOwot
ICAgICAgICAgICAgQ2xvc2VDbGlwYm9hcmQoKTsKLQotICAgICAgICAgICAgUGFzc1JlZlB0cjxE
b2N1bWVudEZyYWdtZW50PiBmcmFnbWVudCA9IGZyYWdtZW50RnJvbUNGX0hUTUwoZnJhbWUtPmRv
Y3VtZW50KCksIGNmX2h0bWwpOwotICAgICAgICAgICAgaWYgKGZyYWdtZW50KQotICAgICAgICAg
ICAgICAgIHJldHVybiBmcmFnbWVudDsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBDbG9z
ZUNsaXBib2FyZCgpOwotICAgIH0KLQotICAgIGlmIChhbGxvd1BsYWluVGV4dCAmJiBJc0NsaXBi
b2FyZEZvcm1hdEF2YWlsYWJsZShDRl9VTklDT0RFVEVYVCkpIHsKLSAgICAgICAgY2hvc2VQbGFp
blRleHQgPSB0cnVlOwotICAgICAgICBpZiAoT3BlbkNsaXBib2FyZChtX293bmVyKSkgewotICAg
ICAgICAgICAgSEFORExFIGNiRGF0YSA9IEdldENsaXBib2FyZERhdGEoQ0ZfVU5JQ09ERVRFWFQp
OwotICAgICAgICAgICAgaWYgKGNiRGF0YSkgewotICAgICAgICAgICAgICAgIFVDaGFyKiBidWZm
ZXIgPSAoVUNoYXIqKUdsb2JhbExvY2soY2JEYXRhKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcg
c3RyKGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgR2xvYmFsVW5sb2NrKGNiRGF0YSk7Ci0gICAg
ICAgICAgICAgICAgQ2xvc2VDbGlwYm9hcmQoKTsKLSAgICAgICAgICAgICAgICBSZWZQdHI8RG9j
dW1lbnRGcmFnbWVudD4gZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudEZyb21UZXh0KGNvbnRleHQu
Z2V0KCksIHN0cik7Ci0gICAgICAgICAgICAgICAgaWYgKGZyYWdtZW50KQotICAgICAgICAgICAg
ICAgICAgICByZXR1cm4gZnJhZ21lbnQucmVsZWFzZSgpOwotICAgICAgICAgICAgfSBlbHNlCi0g
ICAgICAgICAgICAgICAgQ2xvc2VDbGlwYm9hcmQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAg
IGlmIChhbGxvd1BsYWluVGV4dCAmJiA6OklzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlKENGX1RF
WFQpKSB7Ci0gICAgICAgIGNob3NlUGxhaW5UZXh0ID0gdHJ1ZTsKLSAgICAgICAgaWYgKDo6T3Bl
bkNsaXBib2FyZChtX293bmVyKSkgewotICAgICAgICAgICAgSEFORExFIGNiRGF0YSA9IDo6R2V0
Q2xpcGJvYXJkRGF0YShDRl9URVhUKTsKLSAgICAgICAgICAgIGlmIChjYkRhdGEpIHsKLSAgICAg
ICAgICAgICAgICBjaGFyKiBidWZmZXIgPSAoY2hhciopR2xvYmFsTG9jayhjYkRhdGEpOwotICAg
ICAgICAgICAgICAgIFN0cmluZyBzdHIoYnVmZmVyKTsKLSAgICAgICAgICAgICAgICBHbG9iYWxV
bmxvY2soY2JEYXRhKTsKLSAgICAgICAgICAgICAgICBDbG9zZUNsaXBib2FyZCgpOwotICAgICAg
ICAgICAgICAgIFJlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBmcmFnbWVudCA9IGNyZWF0ZUZyYWdt
ZW50RnJvbVRleHQoY29udGV4dC5nZXQoKSwgc3RyKTsKLSAgICAgICAgICAgICAgICBpZiAoZnJh
Z21lbnQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmcmFnbWVudC5yZWxlYXNlKCk7Ci0g
ICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBDbG9zZUNsaXBib2FyZCgpOwotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWJvb2wgUGFzdGVib2FyZDo6aGFz
RGF0YSgpCi17Ci0gICAgcmV0dXJuIGhhc0RhdGFJbkZvcm1hdChDRl9VTklDT0RFVEVYVCkgfHwg
aGFzRGF0YUluRm9ybWF0KENGX1RFWFQpOwotfQotCi1ib29sIFBhc3RlYm9hcmQ6Omhhc0RhdGFJ
bkZvcm1hdCh1bnNpZ25lZCBpbnQgZm9ybWF0KQotewotICAgIHJldHVybiA6OklzQ2xpcGJvYXJk
Rm9ybWF0QXZhaWxhYmxlKGZvcm1hdCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5k
ZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2VhcmNoUG9wdXBNZW51V2luQ0UuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2VhcmNoUG9wdXBNZW51V2luQ0UuY3Bw
CShyZXZpc2lvbiA1NzI4OSkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TZWFyY2hQb3B1
cE1lbnVXaW5jZS5jcHA6NTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1NlYXJjaFBv
cHVwTWVudVdpbkNFLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU0IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSBJbmMuCisgKgorICogVGhpcyBsaWJyYXJ5
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK
KyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24p
IGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBp
biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdB
UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
CisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAq
CisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRo
ZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAq
IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJTZWFyY2hQb3B1cE1lbnUuaCIKKworI2luY2x1ZGUgIkF0b21pY1N0cmluZy5o
IgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
U2VhcmNoUG9wdXBNZW51OjpTZWFyY2hQb3B1cE1lbnUoUG9wdXBNZW51Q2xpZW50KiBjbGllbnQp
Cis6IFBvcHVwTWVudShjbGllbnQpCit7Cit9CisKK2Jvb2wgU2VhcmNoUG9wdXBNZW51OjplbmFi
bGVkKCkKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgU2VhcmNoUG9wdXBNZW51Ojpz
YXZlUmVjZW50U2VhcmNoZXMoY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lLCBjb25zdCBWZWN0b3I8
U3RyaW5nPiYgc2VhcmNoSXRlbXMpCit7CisgICAgaWYgKG5hbWUuaXNFbXB0eSgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIFNlYXJjaFBvcHVw
TWVudTo6bG9hZFJlY2VudFNlYXJjaGVzKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSwgVmVjdG9y
PFN0cmluZz4mIHNlYXJjaEl0ZW1zKQoreworICAgIGlmIChuYW1lLmlzRW1wdHkoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworfQpJbmRleDogV2ViQ29y
ZS9wbGF0Zm9ybS93aW5jZS9TZWFyY2hQb3B1cE1lbnVXaW5DRS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TZWFyY2hQb3B1cE1lbnVXaW5DRS5jcHAJKHJldmlzaW9u
IDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TZWFyY2hQb3B1cE1lbnVXaW5DRS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTUxLDQgKzUxLDQgQEAgdm9pZCBTZWFyY2hQb3B1cE1lbnU6
OmxvYWRSZWNlbnRTZWFyY2hlcwogICAgIG5vdEltcGxlbWVudGVkKCk7CiB9CiAKLX0KK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2VhcmNoUG9w
dXBNZW51V2luY2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2Vh
cmNoUG9wdXBNZW51V2luY2UuY3BwCShyZXZpc2lvbiA1NzI4OSkKKysrIFdlYkNvcmUvcGxhdGZv
cm0vd2luY2UvU2VhcmNoUG9wdXBNZW51V2luY2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDU0
ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVG9yY2ggTW9iaWxlIEluYy4KLSAq
Ci0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg
aXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9y
IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5
IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBi
dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50
eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFLiAgU2VlIHRoZSBHTlUKLSAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhp
cyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0g
KiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQs
IEZpZnRoIEZsb29yLAotICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0gKi8KLQotI2lu
Y2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlNlYXJjaFBvcHVwTWVudS5oIgotCi0jaW5jbHVk
ZSAiQXRvbWljU3RyaW5nLmgiCi0jaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKLQotbmFtZXNw
YWNlIFdlYkNvcmUgewotCi1TZWFyY2hQb3B1cE1lbnU6OlNlYXJjaFBvcHVwTWVudShQb3B1cE1l
bnVDbGllbnQqIGNsaWVudCkKLTogUG9wdXBNZW51KGNsaWVudCkKLXsKLX0KLQotYm9vbCBTZWFy
Y2hQb3B1cE1lbnU6OmVuYWJsZWQoKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBT
ZWFyY2hQb3B1cE1lbnU6OnNhdmVSZWNlbnRTZWFyY2hlcyhjb25zdCBBdG9taWNTdHJpbmcmIG5h
bWUsIGNvbnN0IFZlY3RvcjxTdHJpbmc+JiBzZWFyY2hJdGVtcykKLXsKLSAgICBpZiAobmFtZS5p
c0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIG5vdEltcGxlbWVudGVkKCk7Ci19Ci0K
LXZvaWQgU2VhcmNoUG9wdXBNZW51Ojpsb2FkUmVjZW50U2VhcmNoZXMoY29uc3QgQXRvbWljU3Ry
aW5nJiBuYW1lLCBWZWN0b3I8U3RyaW5nPiYgc2VhcmNoSXRlbXMpCi17Ci0gICAgaWYgKG5hbWUu
aXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBub3RJbXBsZW1lbnRlZCgpOwotfQot
Ci19CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1NoYXJlZFRpbWVyV2luY2UuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2hhcmVkVGltZXJXaW5jZS5jcHAJ
KHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TaGFyZWRUaW1lcldp
bmNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSwxMzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdo
dCAoQykgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAq
IENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRvcmNoIE1vYmlsZSwgSW5jLgotICoKLSAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
LSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoK
LSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgot
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKLSAqLwotCi0jaW5j
bHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiU2hhcmVkVGltZXIuaCIKLQotI2luY2x1ZGUgIlBh
Z2UuaCIKLSNpbmNsdWRlICJTeXN0ZW1UaW1lLmgiCi0jaW5jbHVkZSAiV2ViQ29yZUluc3RhbmNl
SGFuZGxlLmgiCi0jaW5jbHVkZSAiV2lkZ2V0LmgiCi0jaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMu
aD4KLSNpbmNsdWRlIDx3dGYvQ3VycmVudFRpbWUuaD4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0K
LW5hbWVzcGFjZSBKU0MgewotZXh0ZXJuIHZvaWQqIGdfc3RhY2tCYXNlOwotfQotCi1uYW1lc3Bh
Y2UgV2ViQ29yZSB7Ci0KLWVudW0gewotICAgIFRpbWVySWROb25lID0gMCwKLSAgICBUaW1lcklk
QXV0bywKLSAgICBUaW1lcklkTWFudWFsLAotfTsKLXN0YXRpYyBVSU5UIHRpbWVySUQgPSBUaW1l
cklkTm9uZTsKLQotc3RhdGljIHZvaWQgKCpzaGFyZWRUaW1lckZpcmVkRnVuY3Rpb24pKCk7Ci0K
LXN0YXRpYyBIV05EIHRpbWVyV2luZG93SGFuZGxlID0gMDsKLWNvbnN0IExQQ1dTVFIga1RpbWVy
V2luZG93Q2xhc3NOYW1lID0gTCJUaW1lcldpbmRvd0NsYXNzIjsKLQotTFJFU1VMVCBDQUxMQkFD
SyBUaW1lcldpbmRvd1duZFByb2MoSFdORCBoV25kLCBVSU5UIG1lc3NhZ2UsIFdQQVJBTSB3UGFy
YW0sIExQQVJBTSBsUGFyYW0pCi17Ci0gICAgaW50IGR1bW15OwotICAgIEpTQzo6Z19zdGFja0Jh
c2UgPSAmZHVtbXk7Ci0KLSAgICBpZiAobWVzc2FnZSA9PSBXTV9USU1FUikgewotICAgICAgICBp
ZiAodGltZXJJRCAhPSBUaW1lcklkTm9uZSkKLSAgICAgICAgICAgIHNoYXJlZFRpbWVyRmlyZWRG
dW5jdGlvbigpOwotICAgIH0gZWxzZSBpZiAobWVzc2FnZSA9PSBXTV9VU0VSKSAgICB7Ci0gICAg
ICAgIGlmICh0aW1lcklEID0gVGltZXJJZE1hbnVhbCkgewotICAgICAgICAgICAgc2hhcmVkVGlt
ZXJGaXJlZEZ1bmN0aW9uKCk7Ci0gICAgICAgICAgICBQb3N0TWVzc2FnZShoV25kLCBXTV9VU0VS
LCAwLCAwKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEpTQzo6Z19zdGFja0Jh
c2UgPSAwOwotICAgICAgICByZXR1cm4gRGVmV2luZG93UHJvYyhoV25kLCBtZXNzYWdlLCB3UGFy
YW0sIGxQYXJhbSk7Ci0gICAgfQotICAgIEpTQzo6Z19zdGFja0Jhc2UgPSAwOwotICAgIHJldHVy
biAwOwotfQotCi1zdGF0aWMgdm9pZCBpbml0aWFsaXplT2ZmU2NyZWVuVGltZXJXaW5kb3coKQot
ewotICAgIGlmICh0aW1lcldpbmRvd0hhbmRsZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgV05E
Q0xBU1Mgd2NleCA9IHswfTsKLSAgICB3Y2V4LmxwZm5XbmRQcm9jICAgID0gVGltZXJXaW5kb3dX
bmRQcm9jOwotICAgIHdjZXguaEluc3RhbmNlICAgICAgPSBXZWJDb3JlOjppbnN0YW5jZUhhbmRs
ZSgpOwotICAgIHdjZXgubHBzekNsYXNzTmFtZSAgPSBrVGltZXJXaW5kb3dDbGFzc05hbWU7Ci0g
ICAgUmVnaXN0ZXJDbGFzcygmd2NleCk7Ci0KLSAgICB0aW1lcldpbmRvd0hhbmRsZSA9IENyZWF0
ZVdpbmRvdyhrVGltZXJXaW5kb3dDbGFzc05hbWUsIDAsIDAsCi0gICAgICAgQ1dfVVNFREVGQVVM
VCwgMCwgQ1dfVVNFREVGQVVMVCwgMCwgMCwgMCwgV2ViQ29yZTo6aW5zdGFuY2VIYW5kbGUoKSwg
MCk7Ci19Ci0KLXZvaWQgc2V0U2hhcmVkVGltZXJGaXJlZEZ1bmN0aW9uKHZvaWQgKCpmKSgpKQot
ewotICAgIHNoYXJlZFRpbWVyRmlyZWRGdW5jdGlvbiA9IGY7Ci19Ci0KLSNkZWZpbmUgVVNFUl9U
SU1FUl9NQVhJTVVNICAweDdGRkZGRkZGCi0jZGVmaW5lIFVTRVJfVElNRVJfTUlOSU1VTSAgMHgw
MDAwMDAwQQotCi12b2lkIHNldFNoYXJlZFRpbWVyRmlyZVRpbWUoZG91YmxlIGZpcmVUaW1lKQot
ewotICAgIEFTU0VSVChzaGFyZWRUaW1lckZpcmVkRnVuY3Rpb24pOwotCi0gICAgZG91YmxlIGlu
dGVydmFsID0gKGZpcmVUaW1lIC0gY3VycmVudFRpbWUoKSkgKiAxMDAwLjsKLSAgICB1bnNpZ25l
ZCBpbnRlcnZhbEluTVMgPSBpbnRlcnZhbCA8IFVTRVJfVElNRVJfTUlOSU1VTQotICAgICAgICA/
IFVTRVJfVElNRVJfTUlOSU1VTQotICAgICAgICA6IGludGVydmFsID4gVVNFUl9USU1FUl9NQVhJ
TVVNCi0gICAgICAgID8gVVNFUl9USU1FUl9NQVhJTVVNCi0gICAgICAgIDogc3RhdGljX2Nhc3Q8
dW5zaWduZWQ+KGludGVydmFsKTsKLQotICAgIGlmICh0aW1lcklEID09IFRpbWVySWRBdXRvKSB7
Ci0gICAgICAgIEtpbGxUaW1lcih0aW1lcldpbmRvd0hhbmRsZSwgVGltZXJJZEF1dG8pOwotICAg
ICAgICB0aW1lcklEID0gVGltZXJJZE5vbmU7Ci0gICAgfQotCi0gICAgaW5pdGlhbGl6ZU9mZlNj
cmVlblRpbWVyV2luZG93KCk7Ci0gICAgaWYgKFNldFRpbWVyKHRpbWVyV2luZG93SGFuZGxlLCBU
aW1lcklkQXV0bywgaW50ZXJ2YWxJbk1TLCAwKSkKLSAgICAgICAgdGltZXJJRCA9IFRpbWVySWRB
dXRvOwotICAgIGVsc2UgaWYgKHRpbWVySUQgIT0gVGltZXJJZE1hbnVhbCkKLSAgICAgICAgUG9z
dE1lc3NhZ2UodGltZXJXaW5kb3dIYW5kbGUsIFdNX1VTRVIsIDAsIDApOwotfQotCi12b2lkIHN0
b3BTaGFyZWRUaW1lcigpCi17Ci0gICAgaWYgKHRpbWVySUQgPT0gVGltZXJJZEF1dG8pCi0gICAg
ICAgIEtpbGxUaW1lcih0aW1lcldpbmRvd0hhbmRsZSwgVGltZXJJZEF1dG8pOwotCi0gICAgdGlt
ZXJJRCA9IFRpbWVySWROb25lOwotfQotCi19CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJUaGVtZVdpbkNFLi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRo
ZW1lV2luQ0UuLmgJKHJldmlzaW9uIDU3Mjg5KQkoZnJvbSBXZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJUaGVtZVdpbmNlLmg6NTcyODkpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZVdp
bkNFLi5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogVGhpcyBmaWxl
IGlzIHBhcnQgb2YgdGhlIFdlYktpdCBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAw
NiwgMjAwOCBBcHBsZSBDb21wdXRlciwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRvcmNo
IE1vYmlsZSwgSW5jLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBv
ZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs
IGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo
ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQor
ICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElm
IG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUx
IEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEs
IFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBSZW5kZXJUaGVtZVdpbmNlX2gKKyNkZWZpbmUgUmVu
ZGVyVGhlbWVXaW5jZV9oCisKKyNpbmNsdWRlICJSZW5kZXJUaGVtZS5oIgorCit0eXBlZGVmIHZv
aWQqIEhBTkRMRTsKK3R5cGVkZWYgc3RydWN0IEhJTlNUQU5DRV9fKiBISU5TVEFOQ0U7Cit0eXBl
ZGVmIEhJTlNUQU5DRSBITU9EVUxFOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyAgICBzdHJ1
Y3QgVGhlbWVEYXRhIHsKKyAgICAgICAgVGhlbWVEYXRhKCkgOm1fcGFydCgwKSwgbV9zdGF0ZSgw
KSwgbV9jbGFzc2ljU3RhdGUoMCkge30KKyAgICAgICAgVGhlbWVEYXRhKGludCBwYXJ0LCBpbnQg
c3RhdGUpCisgICAgICAgICAgICA6IG1fcGFydChwYXJ0KQorICAgICAgICAgICAgLCBtX3N0YXRl
KHN0YXRlKQorICAgICAgICAgICAgLCBtX2NsYXNzaWNTdGF0ZSgwKQorICAgICAgICB7IH0KKwor
ICAgICAgICB1bnNpZ25lZCBtX3BhcnQ7CisgICAgICAgIHVuc2lnbmVkIG1fc3RhdGU7CisgICAg
ICAgIHVuc2lnbmVkIG1fY2xhc3NpY1N0YXRlOworICAgIH07CisKKyAgICBjbGFzcyBSZW5kZXJU
aGVtZVdpbmNlIDogcHVibGljIFJlbmRlclRoZW1lIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHN0
YXRpYyBQYXNzUmVmUHRyPFJlbmRlclRoZW1lPiBjcmVhdGUoKTsKKyAgICAgICAgflJlbmRlclRo
ZW1lV2luY2UoKTsKKworICAgICAgICB2aXJ0dWFsIFN0cmluZyBleHRyYURlZmF1bHRTdHlsZVNo
ZWV0KCk7CisgICAgICAgIHZpcnR1YWwgU3RyaW5nIGV4dHJhUXVpcmtzU3R5bGVTaGVldCgpOwor
CisgICAgICAgIC8vIEEgbWV0aG9kIGFza2luZyBpZiB0aGUgdGhlbWUncyBjb250cm9scyBhY3R1
YWxseSBjYXJlIGFib3V0IHJlZHJhd2luZyB3aGVuIGhvdmVyZWQuCisgICAgICAgIHZpcnR1YWwg
Ym9vbCBzdXBwb3J0c0hvdmVyKGNvbnN0IFJlbmRlclN0eWxlKikgY29uc3Q7CisKKyAgICAgICAg
dmlydHVhbCBDb2xvciBwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNv
bnN0OworICAgICAgICB2aXJ0dWFsIENvbG9yIHBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25CYWNr
Z3JvdW5kQ29sb3IoKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybUFjdGl2
ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0OworICAgICAgICB2aXJ0dWFsIENvbG9y
IHBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdDsKKworICAg
ICAgICAvLyBTeXN0ZW0gZm9udHMuCisgICAgICAgIHZpcnR1YWwgdm9pZCBzeXN0ZW1Gb250KGlu
dCBwcm9wSWQsIEZvbnREZXNjcmlwdGlvbiYpIGNvbnN0OworICAgICAgICB2aXJ0dWFsIENvbG9y
IHN5c3RlbUNvbG9yKGludCBjc3NWYWx1ZUlkKSBjb25zdDsKKworICAgICAgICB2aXJ0dWFsIGJv
b2wgcGFpbnRDaGVja2JveChSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFp
bnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByKQorICAgICAgICB7IHJldHVybiBwYWludEJ1dHRv
bihvLCBpLCByKTsgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0Q2hlY2tib3hTaXplKFJlbmRl
clN0eWxlKikgY29uc3Q7CisKKyAgICAgICAgdmlydHVhbCBib29sIHBhaW50UmFkaW8oUmVuZGVy
T2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgaSwgY29uc3QgSW50UmVj
dCYgcikKKyAgICAgICAgeyByZXR1cm4gcGFpbnRCdXR0b24obywgaSwgcik7IH0KKyAgICAgICAg
dmlydHVhbCB2b2lkIHNldFJhZGlvU2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0CisgICAg
ICAgIHsgcmV0dXJuIHNldENoZWNrYm94U2l6ZShzdHlsZSk7IH0KKworICAgICAgICB2aXJ0dWFs
IGJvb2wgcGFpbnRCdXR0b24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWlu
dEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisKKyAgICAgICAgdmlydHVhbCBib29sIHBhaW50VGV4
dEZpZWxkKFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgY29u
c3QgSW50UmVjdCYpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBwYWludFRleHRBcmVhKFJlbmRl
ck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIGksIGNvbnN0IEludFJl
Y3QmIHIpCisgICAgICAgIHsgcmV0dXJuIHBhaW50VGV4dEZpZWxkKG8sIGksIHIpOyB9CisKKyAg
ICAgICAgdmlydHVhbCB2b2lkIGFkanVzdE1lbnVMaXN0U3R5bGUoQ1NTU3R5bGVTZWxlY3Rvciog
c2VsZWN0b3IsIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCogZSkgY29uc3Q7CisgICAgICAg
IHZpcnR1YWwgYm9vbCBwYWludE1lbnVMaXN0KFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlck9i
amVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgICAgICB2aXJ0dWFsIHZvaWQg
YWRqdXN0TWVudUxpc3RCdXR0b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVu
ZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlKSBjb25zdDsKKworICAgICAgICB2aXJ0dWFsIGJv
b2wgcGFpbnRNZW51TGlzdEJ1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6
OlBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgcGFp
bnRTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJ
bmZvJiBpLCBjb25zdCBJbnRSZWN0JiByKTsKKyAgICAgICAgdmlydHVhbCBib29sIHBhaW50U2xp
ZGVyVGh1bWIoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYg
aSwgY29uc3QgSW50UmVjdCYgcik7CisgICAgICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RTbGlkZXJU
aHVtYlNpemUoUmVuZGVyT2JqZWN0KikgY29uc3Q7CisKKyAgICAgICAgdmlydHVhbCBib29sIHBv
cHVwT3B0aW9uU3VwcG9ydHNUZXh0SW5kZW50KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisg
ICAgICAgIHZpcnR1YWwgaW50IGJ1dHRvbkludGVybmFsUGFkZGluZ0xlZnQoKSBjb25zdDsKKyAg
ICAgICAgdmlydHVhbCBpbnQgYnV0dG9uSW50ZXJuYWxQYWRkaW5nUmlnaHQoKSBjb25zdDsKKyAg
ICAgICAgdmlydHVhbCBpbnQgYnV0dG9uSW50ZXJuYWxQYWRkaW5nVG9wKCkgY29uc3Q7CisgICAg
ICAgIHZpcnR1YWwgaW50IGJ1dHRvbkludGVybmFsUGFkZGluZ0JvdHRvbSgpIGNvbnN0OworCisg
ICAgICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RTZWFyY2hGaWVsZFN0eWxlKENTU1N0eWxlU2VsZWN0
b3IqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBib29s
IHBhaW50U2VhcmNoRmllbGQoUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWlu
dEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFkanVzdFNl
YXJjaEZpZWxkQ2FuY2VsQnV0dG9uU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxl
KiwgRWxlbWVudCopIGNvbnN0OworICAgICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTZWFyY2hGaWVs
ZENhbmNlbEJ1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5m
byYsIGNvbnN0IEludFJlY3QmKTsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0U2VhcmNo
RmllbGREZWNvcmF0aW9uU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiwgRWxl
bWVudCopIGNvbnN0OworICAgICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTZWFyY2hGaWVsZERlY29y
YXRpb24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25z
dCBJbnRSZWN0JikgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgYWRq
dXN0U2VhcmNoRmllbGRSZXN1bHRzRGVjb3JhdGlvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBS
ZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBib29sIHBhaW50
U2VhcmNoRmllbGRSZXN1bHRzRGVjb3JhdGlvbihSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJP
YmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworICAgICAgICB2aXJ0dWFsIHZv
aWQgYWRqdXN0U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uU3R5bGUoQ1NTU3R5bGVTZWxlY3Rvcios
IFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0OworICAgICAgICB2aXJ0dWFsIGJvb2wgcGFp
bnRTZWFyY2hGaWVsZFJlc3VsdHNCdXR0b24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisKKyAgICAgICAgdmlydHVhbCB2b2lk
IHRoZW1lQ2hhbmdlZCgpOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RCdXR0b25TdHls
ZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3Qg
e30KKyAgICAgICAgdmlydHVhbCB2b2lkIGFkanVzdFRleHRGaWVsZFN0eWxlKENTU1N0eWxlU2Vs
ZWN0b3IqLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdCB7fQorICAgICAgICB2
aXJ0dWFsIHZvaWQgYWRqdXN0VGV4dEFyZWFTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVy
U3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3Qge30KKworICAgICAgICBzdGF0aWMgdm9pZCBz
ZXRXZWJLaXRJc0JlaW5nVW5sb2FkZWQoKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgc3VwcG9y
dHNGb2N1c1JpbmcoY29uc3QgUmVuZGVyU3R5bGUqKSBjb25zdDsKKworICAgICNpZiBFTkFCTEUo
VklERU8pCisgICAgICAgIHZpcnR1YWwgYm9vbCBwYWludE1lZGlhRnVsbHNjcmVlbkJ1dHRvbihS
ZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0IEludFJl
Y3QmKTsKKyAgICAgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFQbGF5QnV0dG9uKFJlbmRlck9i
amVjdCosIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwor
ICAgICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRNZWRpYU11dGVCdXR0b24oUmVuZGVyT2JqZWN0Kiwg
Y29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgICAg
IHZpcnR1YWwgYm9vbCBwYWludE1lZGlhU2Vla0JhY2tCdXR0b24oUmVuZGVyT2JqZWN0KiwgY29u
c3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgICAgIHZp
cnR1YWwgYm9vbCBwYWludE1lZGlhU2Vla0ZvcndhcmRCdXR0b24oUmVuZGVyT2JqZWN0KiwgY29u
c3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgICAgIHZp
cnR1YWwgYm9vbCBwYWludE1lZGlhU2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVu
ZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgICAgIHZpcnR1YWwg
Ym9vbCBwYWludE1lZGlhU2xpZGVyVGh1bWIoUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgI2VuZGlmCisKKyAgICBwcml2
YXRlOgorICAgICAgICBSZW5kZXJUaGVtZVdpbmNlKCk7CisKKyAgICAgICAgdW5zaWduZWQgZGV0
ZXJtaW5lQ2xhc3NpY1N0YXRlKFJlbmRlck9iamVjdCopOworICAgICAgICBib29sIHN1cHBvcnRz
Rm9jdXMoQ29udHJvbFBhcnQpIGNvbnN0OworCisgICAgICAgIFRoZW1lRGF0YSBnZXRUaGVtZURh
dGEoUmVuZGVyT2JqZWN0Kik7CisgICAgfTsKKworfTsKKworI2VuZGlmCkluZGV4OiBXZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJUaGVtZVdpbkNFLi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlclRoZW1lV2luQ0UuLmgJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVyVGhlbWVXaW5DRS4uaAkod29ya2luZyBjb3B5KQpAQCAtMjEsOCArMjEs
OCBAQAogICoKICAqLwogCi0jaWZuZGVmIFJlbmRlclRoZW1lV2luY2VfaAotI2RlZmluZSBSZW5k
ZXJUaGVtZVdpbmNlX2gKKyNpZm5kZWYgUmVuZGVyVGhlbWVXaW5DRV9oCisjZGVmaW5lIFJlbmRl
clRoZW1lV2luQ0VfaAogCiAjaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKIApAQCAtNDUsMTAgKzQ1
LDEwIEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgdW5zaWduZWQgbV9jbGFzc2ljU3Rh
dGU7CiAgICAgfTsKIAotICAgIGNsYXNzIFJlbmRlclRoZW1lV2luY2UgOiBwdWJsaWMgUmVuZGVy
VGhlbWUgeworICAgIGNsYXNzIFJlbmRlclRoZW1lV2luQ0UgOiBwdWJsaWMgUmVuZGVyVGhlbWUg
ewogICAgIHB1YmxpYzoKICAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8UmVuZGVyVGhlbWU+IGNy
ZWF0ZSgpOwotICAgICAgICB+UmVuZGVyVGhlbWVXaW5jZSgpOworICAgICAgICB+UmVuZGVyVGhl
bWVXaW5DRSgpOwogCiAgICAgICAgIHZpcnR1YWwgU3RyaW5nIGV4dHJhRGVmYXVsdFN0eWxlU2hl
ZXQoKTsKICAgICAgICAgdmlydHVhbCBTdHJpbmcgZXh0cmFRdWlya3NTdHlsZVNoZWV0KCk7CkBA
IC0xMzQsNyArMTM0LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICNlbmRpZgogCiAgICAg
cHJpdmF0ZToKLSAgICAgICAgUmVuZGVyVGhlbWVXaW5jZSgpOworICAgICAgICBSZW5kZXJUaGVt
ZVdpbkNFKCk7CiAKICAgICAgICAgdW5zaWduZWQgZGV0ZXJtaW5lQ2xhc3NpY1N0YXRlKFJlbmRl
ck9iamVjdCopOwogICAgICAgICBib29sIHN1cHBvcnRzRm9jdXMoQ29udHJvbFBhcnQpIGNvbnN0
OwpAQCAtMTQ0LDQgKzE0NCw0IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogfTsKIAotI2VuZGlm
CisjZW5kaWYgLy8gUmVuZGVyVGhlbWVXaW5DRV9oCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJUaGVtZVdpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJUaGVtZVdpbkNFLmNwcAkocmV2aXNpb24gNTcyODkpCShmcm9tIFdlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlclRoZW1lV2luY2UuY3BwOjU3Mjg5KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
VGhlbWVXaW5DRS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2NjggQEAKKy8qCisgKiBU
aGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgV2ViS2l0IHByb2plY3QuCisgKgorICogQ29weXJpZ2h0
IChDKSAyMDA2LCAyMDA3IEFwcGxlIENvbXB1dGVyLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5k
ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisg
KiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9y
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBz
aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09Q
WUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBN
QSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJSZW5kZXJUaGVtZVdpbmNlLmgiCisKKyNpbmNsdWRlICJDU1NTdHlsZVNoZWV0LmgiCisj
aW5jbHVkZSAiQ1NTVmFsdWVLZXl3b3Jkcy5oIgorI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5j
bHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNp
ZiBFTkFCTEUoVklERU8pCisjaW5jbHVkZSAiSFRNTE1lZGlhRWxlbWVudC5oIgorI2VuZGlmCisK
KyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKy8qIAorICogVGhlIGZvbGxvd2luZyBjb25zdGFudHMg
YXJlIHVzZWQgdG8gZGV0ZXJtaW5lIGhvdyBhIHdpZGdldCBpcyBkcmF3biB1c2luZworICogV2lu
ZG93cycgVGhlbWUgQVBJLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVtZSBwYXJ0cyBhbmQg
c3RhdGVzIHNlZQorICogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2RlZmF1bHQu
YXNwP3VybD0vbGlicmFyeS9lbi11cy9zaGVsbGNjL3BsYXRmb3JtL2NvbW1jdGxzL3VzZXJleC90
b3BpY3MvcGFydHNhbmRzdGF0ZXMuYXNwCisgKi8KKyNkZWZpbmUgVEhFTUVfQ09MT1IgMjA0Cisj
ZGVmaW5lIFRIRU1FX0ZPTlQgIDIxMAorCisvLyBHZW5lcmljIHN0YXRlIGNvbnN0YW50cworI2Rl
ZmluZSBUU19OT1JNQUwgICAgMQorI2RlZmluZSBUU19IT1ZFUiAgICAgMgorI2RlZmluZSBUU19B
Q1RJVkUgICAgMworI2RlZmluZSBUU19ESVNBQkxFRCAgNAorI2RlZmluZSBUU19GT0NVU0VEICAg
NQorCisvLyBCdXR0b24gY29uc3RhbnRzCisjZGVmaW5lIEJQX0JVVFRPTiAgICAxCisjZGVmaW5l
IEJQX1JBRElPICAgICAyCisjZGVmaW5lIEJQX0NIRUNLQk9YICAzCisKKy8vIFRleHRmaWVsZCBj
b25zdGFudHMKKyNkZWZpbmUgVEZQX1RFWFRGSUVMRCAxCisjZGVmaW5lIFRGU19SRUFET05MWSAg
NgorCit0eXBlZGVmIEhBTkRMRSAoV0lOQVBJKm9wZW5UaGVtZURhdGFQdHIpKEhXTkQgaHduZCwg
TFBDV1NUUiBwc3pDbGFzc0xpc3QpOwordHlwZWRlZiBIUkVTVUxUIChXSU5BUEkqY2xvc2VUaGVt
ZURhdGFQdHIpKEhBTkRMRSBoVGhlbWUpOwordHlwZWRlZiBIUkVTVUxUIChXSU5BUEkqZHJhd1Ro
ZW1lQmFja2dyb3VuZFB0cikoSEFORExFIGhUaGVtZSwgSERDIGhkYywgaW50IGlQYXJ0SWQsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaVN0YXRlSWQsIGNv
bnN0IFJFQ1QgKnBSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY29uc3QgUkVDVCogcENsaXBSZWN0KTsKK3R5cGVkZWYgSFJFU1VMVCAoV0lOQVBJKmRyYXdU
aGVtZUVkZ2VQdHIpKEhBTkRMRSBoVGhlbWUsIEhEQyBoZGMsIGludCBpUGFydElkLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlTdGF0ZUlkLCBjb25zdCBS
RUNUICpwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVu
c2lnbmVkIHVFZGdlLCB1bnNpZ25lZCB1RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBSRUNUKiBwQ2xpcFJlY3QpOwordHlwZWRlZiBIUkVTVUxU
IChXSU5BUEkqZ2V0VGhlbWVDb250ZW50UmVjdFB0cikoSEFORExFIGhUaGVtZSwgSERDIGhkYywg
aW50IGlQYXJ0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBp
bnQgaVN0YXRlSWQsIGNvbnN0IFJFQ1QqIHBSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgUkVDVCogcENvbnRlbnRSZWN0KTsKK3R5cGVkZWYgSFJFU1VMVCAo
V0lOQVBJKmdldFRoZW1lUGFydFNpemVQdHIpKEhBTkRMRSBoVGhlbWUsIEhEQyBoZGMsIGludCBp
UGFydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlTdGF0
ZUlkLCBSRUNUKiBwcmMsIGludCB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFNJWkUqIHBzeik7Cit0eXBlZGVmIEhSRVNVTFQgKFdJTkFQSSpnZXRUaGVtZVN5c0Zv
bnRQdHIpKEhBTkRMRSBoVGhlbWUsIGludCBpRm9udElkLCBPVVQgTE9HRk9OVCogcEZvbnQpOwor
dHlwZWRlZiBIUkVTVUxUIChXSU5BUEkqZ2V0VGhlbWVDb2xvclB0cikoSEFORExFIGhUaGVtZSwg
SERDIGhkYywgaW50IGlQYXJ0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGludCBpU3RhdGVJZCwgaW50IGlQcm9wSWQsIE9VVCBDT0xPUlJFRiogcEZvbnQpOworCituYW1l
c3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyBjb25zdCBpbnQgZHJvcERvd25CdXR0b25XaWR0aCA9
IDE3Oworc3RhdGljIGNvbnN0IGludCB0cmFja1dpZHRoID0gNDsKKworUGFzc1JlZlB0cjxSZW5k
ZXJUaGVtZT4gUmVuZGVyVGhlbWVXaW5jZTo6Y3JlYXRlKCkKK3sKKyAgICByZXR1cm4gYWRvcHRS
ZWYobmV3IFJlbmRlclRoZW1lV2luY2UpOworfQorCitQYXNzUmVmUHRyPFJlbmRlclRoZW1lPiBS
ZW5kZXJUaGVtZTo6dGhlbWVGb3JQYWdlKFBhZ2UqIHBhZ2UpCit7CisgICAgc3RhdGljIFJlbmRl
clRoZW1lKiB3aW5jZVRoZW1lID0gUmVuZGVyVGhlbWVXaW5jZTo6Y3JlYXRlKCkucmVsZWFzZVJl
ZigpOworICAgIHJldHVybiB3aW5jZVRoZW1lOworfQorCitSZW5kZXJUaGVtZVdpbmNlOjpSZW5k
ZXJUaGVtZVdpbmNlKCkKK3sKK30KKworUmVuZGVyVGhlbWVXaW5jZTo6flJlbmRlclRoZW1lV2lu
Y2UoKQoreworfQorCitDb2xvciBSZW5kZXJUaGVtZVdpbmNlOjpwbGF0Zm9ybUFjdGl2ZVNlbGVj
dGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0Cit7CisgICAgQ09MT1JSRUYgY29sb3IgPSBHZXRT
eXNDb2xvcihDT0xPUl9ISUdITElHSFQpOworICAgIHJldHVybiBDb2xvcihHZXRSVmFsdWUoY29s
b3IpLCBHZXRHVmFsdWUoY29sb3IpLCBHZXRCVmFsdWUoY29sb3IpLCAyNTUpOworfQorCitDb2xv
ciBSZW5kZXJUaGVtZVdpbmNlOjpwbGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENv
bG9yKCkgY29uc3QKK3sKKyAgICBDT0xPUlJFRiBjb2xvciA9IEdldFN5c0NvbG9yKENPTE9SX0dS
QVlURVhUKTsKKyAgICByZXR1cm4gQ29sb3IoR2V0UlZhbHVlKGNvbG9yKSwgR2V0R1ZhbHVlKGNv
bG9yKSwgR2V0QlZhbHVlKGNvbG9yKSwgMjU1KTsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVXaW5j
ZTo6cGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAg
IENPTE9SUkVGIGNvbG9yID0gR2V0U3lzQ29sb3IoQ09MT1JfSElHSExJR0hUVEVYVCk7CisgICAg
cmV0dXJuIENvbG9yKEdldFJWYWx1ZShjb2xvciksIEdldEdWYWx1ZShjb2xvciksIEdldEJWYWx1
ZShjb2xvciksIDI1NSk7Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lV2luY2U6OnBsYXRmb3JtSW5h
Y3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAgIHJldHVybiBDb2xv
cjo6d2hpdGU7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVXaW5jZTo6c3VwcG9ydHNGb2N1cyhDb250
cm9sUGFydCBhcHBlYXJhbmNlKSBjb25zdAoreworICAgIHN3aXRjaCAoYXBwZWFyYW5jZSkgewor
ICAgIGNhc2UgUHVzaEJ1dHRvblBhcnQ6CisgICAgY2FzZSBCdXR0b25QYXJ0OgorICAgIGNhc2Ug
VGV4dEZpZWxkUGFydDoKKyAgICBjYXNlIFRleHRBcmVhUGFydDoKKyAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJl
dHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpzdXBwb3J0c0ZvY3VzUmlu
Zyhjb25zdCBSZW5kZXJTdHlsZSAqc3R5bGUpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN1cHBvcnRz
Rm9jdXMoc3R5bGUtPmFwcGVhcmFuY2UoKSk7Cit9CisKK3Vuc2lnbmVkIFJlbmRlclRoZW1lV2lu
Y2U6OmRldGVybWluZUNsYXNzaWNTdGF0ZShSZW5kZXJPYmplY3QqIG8pCit7CisgICAgdW5zaWdu
ZWQgcmVzdWx0ID0gMDsKKyAgICBpZiAoIWlzRW5hYmxlZChvKSB8fCBpc1JlYWRPbmx5Q29udHJv
bChvKSkKKyAgICAgICAgcmVzdWx0ID0gREZDU19JTkFDVElWRTsKKyAgICBlbHNlIGlmIChpc1By
ZXNzZWQobykpIC8vIEFjdGl2ZSBzdXBlcnNlZGVzIGhvdmVyCisgICAgICAgIHJlc3VsdCA9IERG
Q1NfUFVTSEVEOworCisgICAgaWYgKGlzQ2hlY2tlZChvKSkKKyAgICAgICAgcmVzdWx0IHw9IERG
Q1NfQ0hFQ0tFRDsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitUaGVtZURhdGEgUmVuZGVyVGhl
bWVXaW5jZTo6Z2V0VGhlbWVEYXRhKFJlbmRlck9iamVjdCogbykKK3sKKyAgICBUaGVtZURhdGEg
cmVzdWx0OworICAgIHN3aXRjaCAoby0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpKSB7CisgICAgY2Fz
ZSBQdXNoQnV0dG9uUGFydDoKKyAgICBjYXNlIEJ1dHRvblBhcnQ6CisgICAgICAgIHJlc3VsdC5t
X3BhcnQgPSBCUF9CVVRUT047CisgICAgICAgIHJlc3VsdC5tX2NsYXNzaWNTdGF0ZSA9IERGQ1Nf
QlVUVE9OUFVTSDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDaGVja2JveFBhcnQ6CisgICAg
ICAgIHJlc3VsdC5tX3BhcnQgPSBCUF9DSEVDS0JPWDsKKyAgICAgICAgcmVzdWx0Lm1fY2xhc3Np
Y1N0YXRlID0gREZDU19CVVRUT05DSEVDSzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSYWRp
b1BhcnQ6CisgICAgICAgIHJlc3VsdC5tX3BhcnQgPSBCUF9SQURJTzsKKyAgICAgICAgcmVzdWx0
Lm1fY2xhc3NpY1N0YXRlID0gREZDU19CVVRUT05SQURJTzsKKyAgICAgICAgYnJlYWs7CisgICAg
Y2FzZSBMaXN0Ym94UGFydDoKKyAgICBjYXNlIE1lbnVsaXN0UGFydDoKKyAgICBjYXNlIFRleHRG
aWVsZFBhcnQ6CisgICAgY2FzZSBUZXh0QXJlYVBhcnQ6CisgICAgICAgIHJlc3VsdC5tX3BhcnQg
PSBURlBfVEVYVEZJRUxEOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXN1bHQubV9j
bGFzc2ljU3RhdGUgfD0gZGV0ZXJtaW5lQ2xhc3NpY1N0YXRlKG8pOworCisgICAgcmV0dXJuIHJl
c3VsdDsKK30KKworYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludEJ1dHRvbihSZW5kZXJPYmpl
Y3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiBy
KQoreworICAgIC8vIEdldCB0aGUgY29ycmVjdCB0aGVtZSBkYXRhIGZvciBhIGJ1dHRvbgorICAg
IFRoZW1lRGF0YSB0aGVtZURhdGEgPSBnZXRUaGVtZURhdGEobyk7CisKKyAgICAvLyBOb3cgcGFp
bnQgdGhlIGJ1dHRvbi4KKyAgICBpLmNvbnRleHQtPmRyYXdGcmFtZUNvbnRyb2wociwgREZDX0JV
VFRPTiwgdGhlbWVEYXRhLm1fY2xhc3NpY1N0YXRlKTsKKyAgICBpZiAoaXNGb2N1c2VkKG8pKSB7
CisgICAgICAgIGlmICh0aGVtZURhdGEubV9wYXJ0ID09IEJQX0JVVFRPTikgeworICAgICAgICAg
ICAgSW50UmVjdCBmb2N1c1JlY3Qocik7CisgICAgICAgICAgICBmb2N1c1JlY3QuaW5mbGF0ZSgt
Mik7CisgICAgICAgICAgICBpLmNvbnRleHQtPmRyYXdGb2N1c1JlY3QoZm9jdXNSZWN0KTsKKyAg
ICAgICAgfSBlbHNlCisgICAgICAgICAgICBpLmNvbnRleHQtPmRyYXdGb2N1c1JlY3Qocik7Cisg
ICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFJlbmRlclRoZW1lV2luY2U6OnNl
dENoZWNrYm94U2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgLy8gSWYgdGhl
IHdpZHRoIGFuZCBoZWlnaHQgYXJlIGJvdGggc3BlY2lmaWVkLCB0aGVuIHdlIGhhdmUgbm90aGlu
ZyB0byBkby4KKyAgICBpZiAoIXN0eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkgJiYg
IXN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gRklY
TUU6ICBBIGhhcmQtY29kZWQgc2l6ZSBvZiAxMyBpcyB1c2VkLiAgVGhpcyBpcyB3cm9uZyBidXQg
bmVjZXNzYXJ5IGZvciBub3cuICBJdCBtYXRjaGVzIEZpcmVmb3guCisgICAgLy8gQXQgZGlmZmVy
ZW50IERQSSBzZXR0aW5ncyBvbiBXaW5kb3dzLCBxdWVyeWluZyB0aGUgdGhlbWUgZ2l2ZXMgeW91
IGEgbGFyZ2VyIHNpemUgdGhhdCBhY2NvdW50cyBmb3IKKyAgICAvLyB0aGUgaGlnaGVyIERQSS4g
IFVudGlsIG91ciBlbnRpcmUgZW5naW5lIGhvbm9ycyBhIERQSSBzZXR0aW5nIG90aGVyIHRoYW4g
OTYsIHdlIGNhbid0IHJlbHkgb24gdGhlIHRoZW1lJ3MKKyAgICAvLyBtZXRyaWNzLgorICAgIGlm
IChzdHlsZS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpKQorICAgICAgICBzdHlsZS0+c2V0
V2lkdGgoTGVuZ3RoKDEzLCBGaXhlZCkpOworICAgIGlmIChzdHlsZS0+aGVpZ2h0KCkuaXNBdXRv
KCkpCisgICAgICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKDEzLCBGaXhlZCkpOworfQorCiti
b29sIFJlbmRlclRoZW1lV2luY2U6OnBhaW50VGV4dEZpZWxkKFJlbmRlck9iamVjdCogbywgY29u
c3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIGksIGNvbnN0IEludFJlY3QmIHIpCit7CisgICAg
Ly8gR2V0IHRoZSBjb3JyZWN0IHRoZW1lIGRhdGEgZm9yIGEgdGV4dGZpZWxkCisgICAgVGhlbWVE
YXRhIHRoZW1lRGF0YSA9IGdldFRoZW1lRGF0YShvKTsKKworICAgIC8vIE5vdyBwYWludCB0aGUg
dGV4dCBmaWVsZC4KKyAgICBpLmNvbnRleHQtPnBhaW50VGV4dEZpZWxkKHIsIHRoZW1lRGF0YS5t
X2NsYXNzaWNTdGF0ZSk7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUmVuZGVyVGhl
bWVXaW5jZTo6YWRqdXN0TWVudUxpc3RTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3Rvciwg
UmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlKSBjb25zdAoreworICAgIHN0eWxlLT5yZXNl
dEJvcmRlcigpOworICAgIGFkanVzdE1lbnVMaXN0QnV0dG9uU3R5bGUoc2VsZWN0b3IsIHN0eWxl
LCBlKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludE1lbnVMaXN0KFJlbmRlck9i
amVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIGksIGNvbnN0IEludFJlY3Qm
IHIpCit7CisgICAgcGFpbnRUZXh0RmllbGQobywgaSwgcik7CisgICAgcGFpbnRNZW51TGlzdEJ1
dHRvbihvLCBpLCByKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBSZW5kZXJUaGVtZVdp
bmNlOjpwYWludE1lbnVMaXN0QnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mIGksIGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgSW50UmVjdCBidXR0
b25SZWN0KHIucmlnaHQoKSAtIGRyb3BEb3duQnV0dG9uV2lkdGggLSAxLCByLnkoKSwgZHJvcERv
d25CdXR0b25XaWR0aCwgci5oZWlnaHQoKSk7CisgICAgYnV0dG9uUmVjdC5pbmZsYXRlWSgtMSk7
CisgICAgaS5jb250ZXh0LT5kcmF3RnJhbWVDb250cm9sKGJ1dHRvblJlY3QsIERGQ19TQ1JPTEws
IERGQ1NfU0NST0xMQ09NQk9CT1ggfCBkZXRlcm1pbmVDbGFzc2ljU3RhdGUobykpOworICAgIHJl
dHVybiB0cnVlOworfQorCit2b2lkIFJlbmRlclRoZW1lV2luY2U6OnN5c3RlbUZvbnQoaW50IHBy
b3BJZCwgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIGNvbnN0Cit7CisgICAgbm90
SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZVdpbmNlOjp0aGVtZUNoYW5nZWQo
KQoreworfQorCitTdHJpbmcgUmVuZGVyVGhlbWVXaW5jZTo6ZXh0cmFEZWZhdWx0U3R5bGVTaGVl
dCgpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gU3RyaW5nKCk7Cit9CisK
K1N0cmluZyBSZW5kZXJUaGVtZVdpbmNlOjpleHRyYVF1aXJrc1N0eWxlU2hlZXQoKQoreworICAg
IG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIFN0cmluZygpOworfQorCitib29sIFJlbmRl
clRoZW1lV2luY2U6OnN1cHBvcnRzSG92ZXIoY29uc3QgUmVuZGVyU3R5bGUqKSBjb25zdAorewor
ICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gTWFwIGEgQ1NTVmFsdWUqIHN5c3RlbSBjb2xvciB0
byBhbiBpbmRleCB1bmRlcnN0b29kIGJ5IEdldFN5c0NvbG9yCitzdGF0aWMgaW50IGNzc1ZhbHVl
SWRUb1N5c0NvbG9ySW5kZXgoaW50IGNzc1ZhbHVlSWQpCit7CisgICAgc3dpdGNoIChjc3NWYWx1
ZUlkKSB7CisgICAgY2FzZSBDU1NWYWx1ZUFjdGl2ZWJvcmRlcjogcmV0dXJuIENPTE9SX0FDVElW
RUJPUkRFUjsKKyAgICBjYXNlIENTU1ZhbHVlQWN0aXZlY2FwdGlvbjogcmV0dXJuIENPTE9SX0FD
VElWRUNBUFRJT047CisgICAgY2FzZSBDU1NWYWx1ZUFwcHdvcmtzcGFjZTogcmV0dXJuIENPTE9S
X0FQUFdPUktTUEFDRTsKKyAgICBjYXNlIENTU1ZhbHVlQmFja2dyb3VuZDogcmV0dXJuIENPTE9S
X0JBQ0tHUk9VTkQ7CisgICAgY2FzZSBDU1NWYWx1ZUJ1dHRvbmZhY2U6IHJldHVybiBDT0xPUl9C
VE5GQUNFOworICAgIGNhc2UgQ1NTVmFsdWVCdXR0b25oaWdobGlnaHQ6IHJldHVybiBDT0xPUl9C
VE5ISUdITElHSFQ7CisgICAgY2FzZSBDU1NWYWx1ZUJ1dHRvbnNoYWRvdzogcmV0dXJuIENPTE9S
X0JUTlNIQURPVzsKKyAgICBjYXNlIENTU1ZhbHVlQnV0dG9udGV4dDogcmV0dXJuIENPTE9SX0JU
TlRFWFQ7CisgICAgY2FzZSBDU1NWYWx1ZUNhcHRpb250ZXh0OiByZXR1cm4gQ09MT1JfQ0FQVElP
TlRFWFQ7CisgICAgY2FzZSBDU1NWYWx1ZUdyYXl0ZXh0OiByZXR1cm4gQ09MT1JfR1JBWVRFWFQ7
CisgICAgY2FzZSBDU1NWYWx1ZUhpZ2hsaWdodDogcmV0dXJuIENPTE9SX0hJR0hMSUdIVDsKKyAg
ICBjYXNlIENTU1ZhbHVlSGlnaGxpZ2h0dGV4dDogcmV0dXJuIENPTE9SX0hJR0hMSUdIVFRFWFQ7
CisgICAgY2FzZSBDU1NWYWx1ZUluYWN0aXZlYm9yZGVyOiByZXR1cm4gQ09MT1JfSU5BQ1RJVkVC
T1JERVI7CisgICAgY2FzZSBDU1NWYWx1ZUluYWN0aXZlY2FwdGlvbjogcmV0dXJuIENPTE9SX0lO
QUNUSVZFQ0FQVElPTjsKKyAgICBjYXNlIENTU1ZhbHVlSW5hY3RpdmVjYXB0aW9udGV4dDogcmV0
dXJuIENPTE9SX0lOQUNUSVZFQ0FQVElPTlRFWFQ7CisgICAgY2FzZSBDU1NWYWx1ZUluZm9iYWNr
Z3JvdW5kOiByZXR1cm4gQ09MT1JfSU5GT0JLOworICAgIGNhc2UgQ1NTVmFsdWVJbmZvdGV4dDog
cmV0dXJuIENPTE9SX0lORk9URVhUOworICAgIGNhc2UgQ1NTVmFsdWVNZW51OiByZXR1cm4gQ09M
T1JfTUVOVTsKKyAgICBjYXNlIENTU1ZhbHVlTWVudXRleHQ6IHJldHVybiBDT0xPUl9NRU5VVEVY
VDsKKyAgICBjYXNlIENTU1ZhbHVlU2Nyb2xsYmFyOiByZXR1cm4gQ09MT1JfU0NST0xMQkFSOwor
ICAgIGNhc2UgQ1NTVmFsdWVUaHJlZWRkYXJrc2hhZG93OiByZXR1cm4gQ09MT1JfM0RES1NIQURP
VzsKKyAgICBjYXNlIENTU1ZhbHVlVGhyZWVkZmFjZTogcmV0dXJuIENPTE9SXzNERkFDRTsKKyAg
ICBjYXNlIENTU1ZhbHVlVGhyZWVkaGlnaGxpZ2h0OiByZXR1cm4gQ09MT1JfM0RISUdITElHSFQ7
CisgICAgY2FzZSBDU1NWYWx1ZVRocmVlZGxpZ2h0c2hhZG93OiByZXR1cm4gQ09MT1JfM0RMSUdI
VDsKKyAgICBjYXNlIENTU1ZhbHVlVGhyZWVkc2hhZG93OiByZXR1cm4gQ09MT1JfM0RTSEFET1c7
CisgICAgY2FzZSBDU1NWYWx1ZVdpbmRvdzogcmV0dXJuIENPTE9SX1dJTkRPVzsKKyAgICBjYXNl
IENTU1ZhbHVlV2luZG93ZnJhbWU6IHJldHVybiBDT0xPUl9XSU5ET1dGUkFNRTsKKyAgICBjYXNl
IENTU1ZhbHVlV2luZG93dGV4dDogcmV0dXJuIENPTE9SX1dJTkRPV1RFWFQ7CisgICAgZGVmYXVs
dDogcmV0dXJuIC0xOyAvLyBVbnN1cHBvcnRlZCBDU1NWYWx1ZQorICAgIH0KK30KKworQ29sb3Ig
UmVuZGVyVGhlbWVXaW5jZTo6c3lzdGVtQ29sb3IoaW50IGNzc1ZhbHVlSWQpIGNvbnN0Cit7Cisg
ICAgaW50IHN5c0NvbG9ySW5kZXggPSBjc3NWYWx1ZUlkVG9TeXNDb2xvckluZGV4KGNzc1ZhbHVl
SWQpOworICAgIGlmIChzeXNDb2xvckluZGV4ID09IC0xKQorICAgICAgICByZXR1cm4gUmVuZGVy
VGhlbWU6OnN5c3RlbUNvbG9yKGNzc1ZhbHVlSWQpOworCisgICAgQ09MT1JSRUYgY29sb3IgPSBH
ZXRTeXNDb2xvcihzeXNDb2xvckluZGV4KTsKKyAgICByZXR1cm4gQ29sb3IoR2V0UlZhbHVlKGNv
bG9yKSwgR2V0R1ZhbHVlKGNvbG9yKSwgR2V0QlZhbHVlKGNvbG9yKSk7Cit9CisKK2NvbnN0IGlu
dCBzbGlkZXJUaHVtYldpZHRoID0gNzsKK2NvbnN0IGludCBzbGlkZXJUaHVtYkhlaWdodCA9IDE1
OworCit2b2lkIFJlbmRlclRoZW1lV2luY2U6OmFkanVzdFNsaWRlclRodW1iU2l6ZShSZW5kZXJP
YmplY3QqIG8pIGNvbnN0Cit7CisgICAgaWYgKG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKSA9PSBT
bGlkZXJUaHVtYlZlcnRpY2FsUGFydCkgeworICAgICAgICBvLT5zdHlsZSgpLT5zZXRXaWR0aChM
ZW5ndGgoc2xpZGVyVGh1bWJIZWlnaHQsIEZpeGVkKSk7CisgICAgICAgIG8tPnN0eWxlKCktPnNl
dEhlaWdodChMZW5ndGgoc2xpZGVyVGh1bWJXaWR0aCwgRml4ZWQpKTsKKyAgICB9IGVsc2UgaWYg
KG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKSA9PSBTbGlkZXJUaHVtYkhvcml6b250YWxQYXJ0KSB7
CisgICAgICAgIG8tPnN0eWxlKCktPnNldFdpZHRoKExlbmd0aChzbGlkZXJUaHVtYldpZHRoLCBG
aXhlZCkpOworICAgICAgICBvLT5zdHlsZSgpLT5zZXRIZWlnaHQoTGVuZ3RoKHNsaWRlclRodW1i
SGVpZ2h0LCBGaXhlZCkpOworICAgIH0KK30KKworI2lmIDAKK3ZvaWQgUmVuZGVyVGhlbWVXaW5j
ZTo6YWRqdXN0QnV0dG9uSW5uZXJTdHlsZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7Cisg
ICAgLy8gVGhpcyBpbm5lciBwYWRkaW5nIG1hdGNoZXMgRmlyZWZveC4KKyAgICBzdHlsZS0+c2V0
UGFkZGluZ1RvcChMZW5ndGgoMSwgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0UGFkZGluZ1JpZ2h0
KExlbmd0aCgzLCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRQYWRkaW5nQm90dG9tKExlbmd0aCgx
LCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRQYWRkaW5nTGVmdChMZW5ndGgoMywgRml4ZWQpKTsK
K30KKwordm9pZCBSZW5kZXJUaGVtZVdpbmNlOjphZGp1c3RTZWFyY2hGaWVsZFN0eWxlKENTU1N0
eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpIGNv
bnN0Cit7CisgICAgLy8gT3ZlcnJpZGUgcGFkZGluZyBzaXplIHRvIG1hdGNoIEFwcEtpdCB0ZXh0
IHBvc2l0aW9uaW5nLgorICAgIGNvbnN0IGludCBwYWRkaW5nID0gMTsKKyAgICBzdHlsZS0+c2V0
UGFkZGluZ0xlZnQoTGVuZ3RoKHBhZGRpbmcsIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldFBhZGRp
bmdSaWdodChMZW5ndGgocGFkZGluZywgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0UGFkZGluZ1Rv
cChMZW5ndGgocGFkZGluZywgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0UGFkZGluZ0JvdHRvbShM
ZW5ndGgocGFkZGluZywgRml4ZWQpKTsKK30KKyNlbmRpZgorCitib29sIFJlbmRlclRoZW1lV2lu
Y2U6OnBhaW50U2VhcmNoRmllbGQoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6
OlBhaW50SW5mbyYgaSwgY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICByZXR1cm4gcGFpbnRUZXh0
RmllbGQobywgaSwgcik7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVXaW5jZTo6cGFpbnRTZWFyY2hG
aWVsZENhbmNlbEJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFp
bnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgQ29sb3IgYnV0dG9u
Q29sb3IgPSAoby0+bm9kZSgpICYmIG8tPm5vZGUoKS0+YWN0aXZlKCkpID8gQ29sb3IoMTM4LCAx
MzgsIDEzOCkgOiBDb2xvcigxODYsIDE4NiwgMTg2KTsKKworICAgIEludFNpemUgY2FuY2VsU2l6
ZSgxMCwgMTApOworICAgIEludFNpemUgY2FuY2VsUmFkaXVzKGNhbmNlbFNpemUud2lkdGgoKSAv
IDIsIGNhbmNlbFNpemUuaGVpZ2h0KCkgLyAyKTsKKyAgICBpbnQgeCA9IHIueCgpICsgKHIud2lk
dGgoKSAtIGNhbmNlbFNpemUud2lkdGgoKSkgLyAyOworICAgIGludCB5ID0gci55KCkgKyAoci5o
ZWlnaHQoKSAtIGNhbmNlbFNpemUuaGVpZ2h0KCkpIC8gMiArIDE7CisgICAgSW50UmVjdCBjYW5j
ZWxCb3VuZHMoSW50UG9pbnQoeCwgeSksIGNhbmNlbFNpemUpOworICAgIHBhaW50SW5mby5jb250
ZXh0LT5zYXZlKCk7CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPmFkZFJvdW5kZWRSZWN0Q2xpcChj
YW5jZWxCb3VuZHMsIGNhbmNlbFJhZGl1cywgY2FuY2VsUmFkaXVzLCBjYW5jZWxSYWRpdXMsIGNh
bmNlbFJhZGl1cyk7CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPmZpbGxSZWN0KGNhbmNlbEJvdW5k
cywgYnV0dG9uQ29sb3IsIERldmljZUNvbG9yU3BhY2UpOworCisgICAgLy8gRHJhdyB0aGUgJ3gn
CisgICAgSW50U2l6ZSB4U2l6ZSgzLCAzKTsKKyAgICBJbnRSZWN0IHhCb3VuZHMoY2FuY2VsQm91
bmRzLmxvY2F0aW9uKCkgKyBJbnRTaXplKDMsIDMpLCB4U2l6ZSk7CisgICAgcGFpbnRJbmZvLmNv
bnRleHQtPnNldFN0cm9rZUNvbG9yKENvbG9yOjp3aGl0ZSwgRGV2aWNlQ29sb3JTcGFjZSk7Cisg
ICAgcGFpbnRJbmZvLmNvbnRleHQtPmRyYXdMaW5lKHhCb3VuZHMubG9jYXRpb24oKSwgIHhCb3Vu
ZHMubG9jYXRpb24oKSArIHhCb3VuZHMuc2l6ZSgpKTsKKyAgICBwYWludEluZm8uY29udGV4dC0+
ZHJhd0xpbmUoSW50UG9pbnQoeEJvdW5kcy5yaWdodCgpLCB4Qm91bmRzLnkoKSksICBJbnRQb2lu
dCh4Qm91bmRzLngoKSwgeEJvdW5kcy5ib3R0b20oKSkpOworCisgICAgcGFpbnRJbmZvLmNvbnRl
eHQtPnJlc3RvcmUoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVX
aW5jZTo6YWRqdXN0U2VhcmNoRmllbGRDYW5jZWxCdXR0b25TdHlsZShDU1NTdHlsZVNlbGVjdG9y
KiBzZWxlY3RvciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlKSBjb25zdAoreworICAg
IEludFNpemUgY2FuY2VsU2l6ZSgxMywgMTEpOworICAgIHN0eWxlLT5zZXRXaWR0aChMZW5ndGgo
Y2FuY2VsU2l6ZS53aWR0aCgpLCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3Ro
KGNhbmNlbFNpemUuaGVpZ2h0KCksIEZpeGVkKSk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVXaW5j
ZTo6YWRqdXN0U2VhcmNoRmllbGREZWNvcmF0aW9uU3R5bGUoQ1NTU3R5bGVTZWxlY3Rvciogc2Vs
ZWN0b3IsIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCogZSkgY29uc3QKK3sKKyAgICBJbnRT
aXplIGVtcHR5U2l6ZSgxLCAxMSk7CisgICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChlbXB0eVNp
emUud2lkdGgoKSwgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0SGVpZ2h0KExlbmd0aChlbXB0eVNp
emUuaGVpZ2h0KCksIEZpeGVkKSk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVXaW5jZTo6YWRqdXN0
U2VhcmNoRmllbGRSZXN1bHRzRGVjb3JhdGlvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVj
dG9yLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0Cit7CisgICAgSW50U2l6
ZSBtYWduaWZpZXJTaXplKDE1LCAxMSk7CisgICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChtYWdu
aWZpZXJTaXplLndpZHRoKCksIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgo
bWFnbmlmaWVyU2l6ZS5oZWlnaHQoKSwgRml4ZWQpKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZVdp
bmNlOjpwYWludFNlYXJjaEZpZWxkUmVzdWx0c0RlY29yYXRpb24oUmVuZGVyT2JqZWN0KiBvLCBj
b25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiBy
KQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lk
IFJlbmRlclRoZW1lV2luY2U6OmFkanVzdFNlYXJjaEZpZWxkUmVzdWx0c0J1dHRvblN0eWxlKENT
U1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUp
IGNvbnN0Cit7CisgICAgSW50U2l6ZSBtYWduaWZpZXJTaXplKDE1LCAxMSk7CisgICAgc3R5bGUt
PnNldFdpZHRoKExlbmd0aChtYWduaWZpZXJTaXplLndpZHRoKCksIEZpeGVkKSk7CisgICAgc3R5
bGUtPnNldEhlaWdodChMZW5ndGgobWFnbmlmaWVyU2l6ZS5oZWlnaHQoKSwgRml4ZWQpKTsKK30K
KworYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludFNlYXJjaEZpZWxkUmVzdWx0c0J1dHRvbihS
ZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8s
IGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgcGFpbnRTZWFyY2hGaWVsZFJlc3VsdHNEZWNvcmF0
aW9uKG8sIHBhaW50SW5mbywgcik7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFJlbmRl
clRoZW1lV2luY2U6OmFkanVzdE1lbnVMaXN0QnV0dG9uU3R5bGUoQ1NTU3R5bGVTZWxlY3Rvciog
c2VsZWN0b3IsIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCogZSkgY29uc3QKK3sKKyAgICAv
LyBUaGVzZSBhcmUgdGhlIHBhZGRpbmdzIG5lZWRlZCB0byBwbGFjZSB0aGUgdGV4dCBjb3JyZWN0
bHkgaW4gdGhlIDxzZWxlY3Q+IGJveAorICAgIGNvbnN0IGludCBkcm9wRG93bkJveFBhZGRpbmdU
b3AgICAgPSAyOworICAgIGNvbnN0IGludCBkcm9wRG93bkJveFBhZGRpbmdSaWdodCAgPSBzdHls
ZS0+ZGlyZWN0aW9uKCkgPT0gTFRSID8gNCArIGRyb3BEb3duQnV0dG9uV2lkdGggOiA0OworICAg
IGNvbnN0IGludCBkcm9wRG93bkJveFBhZGRpbmdCb3R0b20gPSAyOworICAgIGNvbnN0IGludCBk
cm9wRG93bkJveFBhZGRpbmdMZWZ0ICAgPSBzdHlsZS0+ZGlyZWN0aW9uKCkgPT0gTFRSID8gNCA6
IDQgKyBkcm9wRG93bkJ1dHRvbldpZHRoOworICAgIC8vIFRoZSA8c2VsZWN0PiBib3ggbXVzdCBi
ZSBhdCBsZWFzdCAxMnB4IGhpZ2ggZm9yIHRoZSBidXR0b24gdG8gcmVuZGVyIG5pY2VseSBvbiBX
aW5kb3dzCisgICAgY29uc3QgaW50IGRyb3BEb3duQm94TWluSGVpZ2h0ID0gMTI7CisKKyAgICAv
LyBQb3NpdGlvbiB0aGUgdGV4dCBjb3JyZWN0bHkgd2l0aGluIHRoZSBzZWxlY3QgYm94IGFuZCBt
YWtlIHRoZSBib3ggd2lkZSBlbm91Z2ggdG8gZml0IHRoZSBkcm9wZG93biBidXR0b24KKyAgICBz
dHlsZS0+c2V0UGFkZGluZ1RvcChMZW5ndGgoZHJvcERvd25Cb3hQYWRkaW5nVG9wLCBGaXhlZCkp
OworICAgIHN0eWxlLT5zZXRQYWRkaW5nUmlnaHQoTGVuZ3RoKGRyb3BEb3duQm94UGFkZGluZ1Jp
Z2h0LCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRQYWRkaW5nQm90dG9tKExlbmd0aChkcm9wRG93
bkJveFBhZGRpbmdCb3R0b20sIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldFBhZGRpbmdMZWZ0KExl
bmd0aChkcm9wRG93bkJveFBhZGRpbmdMZWZ0LCBGaXhlZCkpOworCisgICAgLy8gSGVpZ2h0IGlz
IGxvY2tlZCB0byBhdXRvCisgICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgoQXV0bykpOworCisg
ICAgLy8gQ2FsY3VsYXRlIG91ciBtaW4taGVpZ2h0CisgICAgaW50IG1pbkhlaWdodCA9IHN0eWxl
LT5mb250KCkuaGVpZ2h0KCk7CisgICAgbWluSGVpZ2h0ID0gbWF4KG1pbkhlaWdodCwgZHJvcERv
d25Cb3hNaW5IZWlnaHQpOworCisgICAgc3R5bGUtPnNldE1pbkhlaWdodChMZW5ndGgobWluSGVp
Z2h0LCBGaXhlZCkpOworCisgICAgLy8gV2hpdGUtc3BhY2UgaXMgbG9ja2VkIHRvIHByZQorICAg
IHN0eWxlLT5zZXRXaGl0ZVNwYWNlKFBSRSk7CisKKyAgICBEV09SRCBjb2xvck1lbnUgPSBHZXRT
eXNDb2xvcihDT0xPUl9NRU5VKTsKKyAgICBEV09SRCBjb2xvck1lbnVUZXh0ID0gR2V0U3lzQ29s
b3IoQ09MT1JfTUVOVVRFWFQpOworICAgIENvbG9yIGJnQ29sb3IoR2V0UlZhbHVlKGNvbG9yTWVu
dSksIEdldEdWYWx1ZShjb2xvck1lbnUpLCBHZXRCVmFsdWUoY29sb3JNZW51KSwgMjU1KTsKKyAg
ICBDb2xvciB0ZXh0Q29sb3IoR2V0UlZhbHVlKGNvbG9yTWVudVRleHQpLCBHZXRHVmFsdWUoY29s
b3JNZW51VGV4dCksIEdldEJWYWx1ZShjb2xvck1lbnVUZXh0KSwgMjU1KTsKKyAgICBpZiAoYmdD
b2xvciA9PSB0ZXh0Q29sb3IpCisgICAgICAgIHRleHRDb2xvci5zZXRSR0IoKH5iZ0NvbG9yLnJn
YigpKSB8IDB4RkYwMDAwMDApOworICAgIHN0eWxlLT5jbGVhckJhY2tncm91bmRMYXllcnMoKTsK
KyAgICBzdHlsZS0+YWNjZXNzQmFja2dyb3VuZExheWVycygpLT5zZXRDbGlwKENvbnRlbnRGaWxs
Qm94KTsKKyAgICBzdHlsZS0+c2V0QmFja2dyb3VuZENvbG9yKGJnQ29sb3IpOworICAgIHN0eWxl
LT5zZXRDb2xvcih0ZXh0Q29sb3IpOworfQorCisjaWYgRU5BQkxFKFZJREVPKQorLy8gQXR0ZW1w
dCB0byByZXRyaWV2ZSBhIEhUTUxNZWRpYUVsZW1lbnQgZnJvbSBhIE5vZGUuIFJldHVybnMgMCBp
ZiBvbmUgY2Fubm90IGJlIGZvdW5kLgorc3RhdGljIEhUTUxNZWRpYUVsZW1lbnQqIG1lZGlhRWxl
bWVudFBhcmVudChOb2RlKiBub2RlKQoreworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJu
IDA7CisgICAgTm9kZSogbWVkaWFOb2RlID0gbm9kZS0+c2hhZG93QW5jZXN0b3JOb2RlKCk7Cisg
ICAgaWYgKCFtZWRpYU5vZGUgfHwgKCFtZWRpYU5vZGUtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjp2
aWRlb1RhZykgJiYgIW1lZGlhTm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmF1ZGlvVGFnKSkp
CisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxNZWRpYUVs
ZW1lbnQqPihtZWRpYU5vZGUpOworfQorI2VuZGlmCisKK2Jvb2wgUmVuZGVyVGhlbWVXaW5jZTo6
cGFpbnRTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFp
bnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByKQoreworICAgIGJvb2wgcmMgPSBSZW5kZXJUaGVt
ZTo6cGFpbnRTbGlkZXJUcmFjayhvLCBpLCByKTsKKyAgICBJbnRQb2ludCBsZWZ0ID0gSW50UG9p
bnQoci54KCkgKyAyLCAoci55KCkgKyByLmJvdHRvbSgpKSAvIDIpOworICAgIGkuY29udGV4dC0+
c2F2ZSgpOworICAgIGkuY29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoQ29sb3I6OmdyYXksIERldmlj
ZUNvbG9yU3BhY2UpOworICAgIGkuY29udGV4dC0+c2V0RmlsbENvbG9yKENvbG9yOjpncmF5LCBE
ZXZpY2VDb2xvclNwYWNlKTsKKyAgICBpLmNvbnRleHQtPmZpbGxSZWN0KHIpOworI2lmIEVOQUJM
RShWSURFTykKKyAgICBIVE1MTWVkaWFFbGVtZW50KiBtZWRpYUVsZW1lbnQgPSBtZWRpYUVsZW1l
bnRQYXJlbnQoby0+bm9kZSgpKTsKKyAgICBpZiAobWVkaWFFbGVtZW50KSB7CisgICAgICAgIGku
Y29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoQ29sb3IoMCwgMHhmZiwgMCkpOworICAgICAgICBJbnRQ
b2ludCByaWdodCA9IEludFBvaW50KGxlZnQueCgpICsgbWVkaWFFbGVtZW50LT5wZXJjZW50TG9h
ZGVkKCkgKiAoci5yaWdodCgpIC0gci54KCkgLSA0KSwgKHIueSgpICsgci5ib3R0b20oKSkgLyAy
KTsKKyAgICAgICAgaS5jb250ZXh0LT5kcmF3TGluZShsZWZ0LCByaWdodCk7CisgICAgICAgIGxl
ZnQgPSByaWdodDsKKyAgICB9CisjZW5kaWYKKyAgICBpLmNvbnRleHQtPnNldFN0cm9rZUNvbG9y
KENvbG9yOjpibGFjaywgRGV2aWNlQ29sb3JTcGFjZSk7CisgICAgaS5jb250ZXh0LT5kcmF3TGlu
ZShsZWZ0LCBJbnRQb2ludChyLnJpZ2h0KCkgLSAyLCBsZWZ0LnkoKSkpOworICAgIGkuY29udGV4
dC0+cmVzdG9yZSgpOworICAgIHJldHVybiByYzsKK30KKworYm9vbCBSZW5kZXJUaGVtZVdpbmNl
OjpwYWludFNsaWRlclRodW1iKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQ
YWludEluZm8mIGksIGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgYm9vbCByYyA9IFJlbmRlclRo
ZW1lOjpwYWludFNsaWRlclRodW1iKG8sIGksIHIpOworICAgIGkuY29udGV4dC0+c2F2ZSgpOwor
ICAgIGkuY29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoQ29sb3I6OmJsYWNrLCBEZXZpY2VDb2xvclNw
YWNlKTsKKyAgICBpLmNvbnRleHQtPnNldEZpbGxDb2xvcihDb2xvcjo6YmxhY2ssIERldmljZUNv
bG9yU3BhY2UpOworI2lmIEVOQUJMRShWSURFTykKKyAgICBIVE1MTWVkaWFFbGVtZW50KiBtZWRp
YUVsZW1lbnQgPSBtZWRpYUVsZW1lbnRQYXJlbnQoby0+bm9kZSgpKTsKKyAgICBpZiAobWVkaWFF
bGVtZW50KSB7CisgICAgICAgIGZsb2F0IHB0ID0gKG1lZGlhRWxlbWVudC0+Y3VycmVudFRpbWUo
KSAtIG1lZGlhRWxlbWVudC0+c3RhcnRUaW1lKCkpIC8gbWVkaWFFbGVtZW50LT5kdXJhdGlvbigp
OworICAgICAgICBGbG9hdFJlY3QgaW50UmVjdCA9IHI7CisgICAgICAgIGludFJlY3Quc2V0WChp
bnRSZWN0LngoKSArIGludFJlY3Qud2lkdGgoKSAqIHB0IC0gMik7CisgICAgICAgIGludFJlY3Qu
c2V0V2lkdGgoNSk7CisgICAgICAgIGkuY29udGV4dC0+ZmlsbFJlY3QoaW50UmVjdCk7CisgICAg
fQorI2VuZGlmCisgICAgaS5jb250ZXh0LT5yZXN0b3JlKCk7CisgICAgcmV0dXJuIHJjOworfQor
CitpbnQgUmVuZGVyVGhlbWVXaW5jZTo6YnV0dG9uSW50ZXJuYWxQYWRkaW5nTGVmdCgpIGNvbnN0
Cit7CisgICAgcmV0dXJuIDM7Cit9CisKK2ludCBSZW5kZXJUaGVtZVdpbmNlOjpidXR0b25JbnRl
cm5hbFBhZGRpbmdSaWdodCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIDM7Cit9CisKK2ludCBSZW5k
ZXJUaGVtZVdpbmNlOjpidXR0b25JbnRlcm5hbFBhZGRpbmdUb3AoKSBjb25zdAoreworICAgIHJl
dHVybiAxOworfQorCitpbnQgUmVuZGVyVGhlbWVXaW5jZTo6YnV0dG9uSW50ZXJuYWxQYWRkaW5n
Qm90dG9tKCkgY29uc3QKK3sKKyAgICByZXR1cm4gMTsKK30KKwordm9pZCBSZW5kZXJUaGVtZVdp
bmNlOjphZGp1c3RTZWFyY2hGaWVsZFN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBS
ZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0Cit7CisgICAgY29uc3QgaW50IHBh
ZGRpbmcgPSAxOworICAgIHN0eWxlLT5zZXRQYWRkaW5nTGVmdChMZW5ndGgocGFkZGluZywgRml4
ZWQpKTsKKyAgICBzdHlsZS0+c2V0UGFkZGluZ1JpZ2h0KExlbmd0aChwYWRkaW5nLCBGaXhlZCkp
OworICAgIHN0eWxlLT5zZXRQYWRkaW5nVG9wKExlbmd0aChwYWRkaW5nLCBGaXhlZCkpOworICAg
IHN0eWxlLT5zZXRQYWRkaW5nQm90dG9tKExlbmd0aChwYWRkaW5nLCBGaXhlZCkpOworfQorCisj
aWYgRU5BQkxFKFZJREVPKQorCitib29sIFJlbmRlclRoZW1lV2luY2U6OnBhaW50TWVkaWFGdWxs
c2NyZWVuQnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludElu
Zm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBib29sIHJjID0gcGFpbnRC
dXR0b24obywgcGFpbnRJbmZvLCByKTsKKyAgICBGbG9hdFJlY3QgaW1SZWN0ID0gcjsKKyAgICBp
bVJlY3QuaW5mbGF0ZSgtMik7CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNhdmUoKTsKKyAgICBw
YWludEluZm8uY29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoQ29sb3I6OmJsYWNrKTsKKyAgICBwYWlu
dEluZm8uY29udGV4dC0+c2V0RmlsbENvbG9yKENvbG9yOjpncmF5KTsKKyAgICBwYWludEluZm8u
Y29udGV4dC0+ZmlsbFJlY3QoaW1SZWN0KTsKKyAgICBwYWludEluZm8uY29udGV4dC0+cmVzdG9y
ZSgpOworICAgIHJldHVybiByYzsKK30KKworYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludE1l
ZGlhTXV0ZUJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJ
bmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgYm9vbCByYyA9IHBhaW50
QnV0dG9uKG8sIHBhaW50SW5mbywgcik7CisgICAgSFRNTE1lZGlhRWxlbWVudCogbWVkaWFFbGVt
ZW50ID0gbWVkaWFFbGVtZW50UGFyZW50KG8tPm5vZGUoKSk7CisgICAgYm9vbCBtdXRlZCA9ICFt
ZWRpYUVsZW1lbnQgfHwgbWVkaWFFbGVtZW50LT5tdXRlZCgpOworICAgIEZsb2F0UmVjdCBpbVJl
Y3QgPSByOworICAgIGltUmVjdC5pbmZsYXRlKC0yKTsKKyAgICBwYWludEluZm8uY29udGV4dC0+
c2F2ZSgpOworICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRTdHJva2VDb2xvcihDb2xvcjo6Ymxh
Y2spOworICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRGaWxsQ29sb3IoQ29sb3I6OmJsYWNrKTsK
KyAgICBGbG9hdFBvaW50IHB0c1s2XSA9IHsKKyAgICAgICAgRmxvYXRQb2ludChpbVJlY3QueCgp
ICsgMSwgaW1SZWN0LnkoKSArIGltUmVjdC5oZWlnaHQoKSAvIDMuMCksCisgICAgICAgIEZsb2F0
UG9pbnQoaW1SZWN0LngoKSArIDEgKyBpbVJlY3Qud2lkdGgoKSAvIDIuMCwgaW1SZWN0LnkoKSAr
IGltUmVjdC5oZWlnaHQoKSAvIDMuMCksCisgICAgICAgIEZsb2F0UG9pbnQoaW1SZWN0LnJpZ2h0
KCkgLSAxLCBpbVJlY3QueSgpKSwKKyAgICAgICAgRmxvYXRQb2ludChpbVJlY3QucmlnaHQoKSAt
IDEsIGltUmVjdC5ib3R0b20oKSksCisgICAgICAgIEZsb2F0UG9pbnQoaW1SZWN0LngoKSArIDEg
KyBpbVJlY3Qud2lkdGgoKSAvIDIuMCwgaW1SZWN0LnkoKSArIDIuMCAqIGltUmVjdC5oZWlnaHQo
KSAvIDMuMCksCisgICAgICAgIEZsb2F0UG9pbnQoaW1SZWN0LngoKSArIDEsIGltUmVjdC55KCkg
KyAyLjAgKiBpbVJlY3QuaGVpZ2h0KCkgLyAzLjApCisgICAgfTsKKyAgICBwYWludEluZm8uY29u
dGV4dC0+ZHJhd0NvbnZleFBvbHlnb24oNiwgcHRzKTsKKyAgICBpZiAobXV0ZWQpCisgICAgICAg
IHBhaW50SW5mby5jb250ZXh0LT5kcmF3TGluZShJbnRQb2ludChpbVJlY3QucmlnaHQoKSwgaW1S
ZWN0LnkoKSksIEludFBvaW50KGltUmVjdC54KCksIGltUmVjdC5ib3R0b20oKSkpOworICAgIHBh
aW50SW5mby5jb250ZXh0LT5yZXN0b3JlKCk7CisgICAgcmV0dXJuIHJjOworfQorCitib29sIFJl
bmRlclRoZW1lV2luY2U6OnBhaW50TWVkaWFQbGF5QnV0dG9uKFJlbmRlck9iamVjdCogbywgY29u
c3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikK
K3sKKyAgICBib29sIHJjID0gcGFpbnRCdXR0b24obywgcGFpbnRJbmZvLCByKTsKKyAgICBGbG9h
dFJlY3QgaW1SZWN0ID0gcjsKKyAgICBpbVJlY3QuaW5mbGF0ZSgtMyk7CisgICAgcGFpbnRJbmZv
LmNvbnRleHQtPnNhdmUoKTsKKyAgICBwYWludEluZm8uY29udGV4dC0+c2V0U3Ryb2tlQ29sb3Io
Q29sb3I6OmJsYWNrKTsKKyAgICBwYWludEluZm8uY29udGV4dC0+c2V0RmlsbENvbG9yKENvbG9y
OjpibGFjayk7CisgICAgSFRNTE1lZGlhRWxlbWVudCogbWVkaWFFbGVtZW50ID0gbWVkaWFFbGVt
ZW50UGFyZW50KG8tPm5vZGUoKSk7CisgICAgYm9vbCBwYXVzZWQgPSAhbWVkaWFFbGVtZW50IHx8
IG1lZGlhRWxlbWVudC0+cGF1c2VkKCk7CisgICAgaWYgKHBhdXNlZCkgeworICAgICAgICBmbG9h
dCB3aWR0aCA9IGltUmVjdC53aWR0aCgpOworICAgICAgICBpbVJlY3Quc2V0V2lkdGgod2lkdGgg
LyAzLjApOworICAgICAgICBwYWludEluZm8uY29udGV4dC0+ZmlsbFJlY3QoaW1SZWN0KTsKKyAg
ICAgICAgaW1SZWN0Lm1vdmUoMi4wICogd2lkdGggLyAzLjAsIDApOworICAgICAgICBwYWludElu
Zm8uY29udGV4dC0+ZmlsbFJlY3QoaW1SZWN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBGbG9h
dFBvaW50IHB0c1szXSA9IHsgRmxvYXRQb2ludChpbVJlY3QueCgpLCBpbVJlY3QueSgpKSwgRmxv
YXRQb2ludChpbVJlY3QucmlnaHQoKSwgKGltUmVjdC55KCkgKyBpbVJlY3QuYm90dG9tKCkpIC8g
Mi4wKSwgRmxvYXRQb2ludChpbVJlY3QueCgpLCBpbVJlY3QuYm90dG9tKCkpIH07CisgICAgICAg
IHBhaW50SW5mby5jb250ZXh0LT5kcmF3Q29udmV4UG9seWdvbigzLCBwdHMpOworICAgIH0KKyAg
ICBwYWludEluZm8uY29udGV4dC0+cmVzdG9yZSgpOworICAgIHJldHVybiByYzsKK30KKworYm9v
bCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludE1lZGlhU2Vla0JhY2tCdXR0b24oUmVuZGVyT2JqZWN0
KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRS
ZWN0JiByKQoreworICAgIGJvb2wgcmMgPSBwYWludEJ1dHRvbihvLCBwYWludEluZm8sIHIpOwor
ICAgIEZsb2F0UmVjdCBpbVJlY3QgPSByOworICAgIGltUmVjdC5pbmZsYXRlKC0zKTsKKyAgICBG
bG9hdFBvaW50IHB0c1szXSA9IHsgRmxvYXRQb2ludCgoaW1SZWN0LngoKSArIGltUmVjdC5yaWdo
dCgpKSAvIDIuMCwgaW1SZWN0LnkoKSksIEZsb2F0UG9pbnQoaW1SZWN0LngoKSwgKGltUmVjdC55
KCkgKyBpbVJlY3QuYm90dG9tKCkpIC8gMi4wKSwgRmxvYXRQb2ludCgoaW1SZWN0LngoKSArIGlt
UmVjdC5yaWdodCgpKSAvIDIuMCwgaW1SZWN0LmJvdHRvbSgpKSB9OworICAgIEZsb2F0UG9pbnQg
cHRzMlszXSA9IHsgRmxvYXRQb2ludChpbVJlY3QucmlnaHQoKSwgaW1SZWN0LnkoKSksIEZsb2F0
UG9pbnQoKGltUmVjdC54KCkgKyBpbVJlY3QucmlnaHQoKSkgLyAyLjAsIChpbVJlY3QueSgpICsg
aW1SZWN0LmJvdHRvbSgpKSAvIDIuMCksIEZsb2F0UG9pbnQoaW1SZWN0LnJpZ2h0KCksIGltUmVj
dC5ib3R0b20oKSkgfTsKKyAgICBwYWludEluZm8uY29udGV4dC0+c2F2ZSgpOworICAgIHBhaW50
SW5mby5jb250ZXh0LT5zZXRTdHJva2VDb2xvcihDb2xvcjo6YmxhY2spOworICAgIHBhaW50SW5m
by5jb250ZXh0LT5zZXRGaWxsQ29sb3IoQ29sb3I6OmJsYWNrKTsKKyAgICBwYWludEluZm8uY29u
dGV4dC0+ZHJhd0NvbnZleFBvbHlnb24oMywgcHRzKTsKKyAgICBwYWludEluZm8uY29udGV4dC0+
ZHJhd0NvbnZleFBvbHlnb24oMywgcHRzMik7CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnJlc3Rv
cmUoKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVXaW5jZTo6cGFpbnRN
ZWRpYVNlZWtGb3J3YXJkQnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0
OjpQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBib29sIHJj
ID0gcGFpbnRCdXR0b24obywgcGFpbnRJbmZvLCByKTsKKyAgICBGbG9hdFJlY3QgaW1SZWN0ID0g
cjsKKyAgICBpbVJlY3QuaW5mbGF0ZSgtMyk7CisgICAgRmxvYXRQb2ludCBwdHNbM10gPSB7IEZs
b2F0UG9pbnQoaW1SZWN0LngoKSwgaW1SZWN0LnkoKSksIEZsb2F0UG9pbnQoKGltUmVjdC54KCkg
KyBpbVJlY3QucmlnaHQoKSkgLyAyLjAsIChpbVJlY3QueSgpICsgaW1SZWN0LmJvdHRvbSgpKSAv
IDIuMCksIEZsb2F0UG9pbnQoaW1SZWN0LngoKSwgaW1SZWN0LmJvdHRvbSgpKSB9OworICAgIEZs
b2F0UG9pbnQgcHRzMlszXSA9IHsgRmxvYXRQb2ludCgoaW1SZWN0LngoKSArIGltUmVjdC5yaWdo
dCgpKSAvIDIuMCwgaW1SZWN0LnkoKSksIEZsb2F0UG9pbnQoaW1SZWN0LnJpZ2h0KCksIChpbVJl
Y3QueSgpICsgaW1SZWN0LmJvdHRvbSgpKSAvIDIuMCksIEZsb2F0UG9pbnQoKGltUmVjdC54KCkg
KyBpbVJlY3QucmlnaHQoKSkgLyAyLjAsIGltUmVjdC5ib3R0b20oKSkgfTsKKyAgICBwYWludElu
Zm8uY29udGV4dC0+c2F2ZSgpOworICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRTdHJva2VDb2xv
cihDb2xvcjo6YmxhY2spOworICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRGaWxsQ29sb3IoQ29s
b3I6OmJsYWNrKTsKKyAgICBwYWludEluZm8uY29udGV4dC0+ZHJhd0NvbnZleFBvbHlnb24oMywg
cHRzKTsKKyAgICBwYWludEluZm8uY29udGV4dC0+ZHJhd0NvbnZleFBvbHlnb24oMywgcHRzMik7
CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnJlc3RvcmUoKTsKKyAgICByZXR1cm4gcmM7Cit9CisK
K2Jvb2wgUmVuZGVyVGhlbWVXaW5jZTo6cGFpbnRNZWRpYVNsaWRlclRyYWNrKFJlbmRlck9iamVj
dCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50
UmVjdCYgcikKK3sKKyAgICByZXR1cm4gcGFpbnRTbGlkZXJUcmFjayhvLCBwYWludEluZm8sIHIp
OworfQorCitib29sIFJlbmRlclRoZW1lV2luY2U6OnBhaW50TWVkaWFTbGlkZXJUaHVtYihSZW5k
ZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGNv
bnN0IEludFJlY3QmIHIpCit7CisgICAgcmV0dXJuIHBhaW50U2xpZGVyVGh1bWIobywgcGFpbnRJ
bmZvLCByKTsKK30KKyNlbmRpZgorCit9CisKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
clRoZW1lV2luQ0UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRo
ZW1lV2luQ0UuY3BwCShyZXZpc2lvbiA1NzI4OSkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
clRoZW1lV2luQ0UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMiw3ICsyMiw3IEBACiAgKi8KIAog
I2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlJlbmRlclRoZW1lV2luY2UuaCIKKyNpbmNs
dWRlICJSZW5kZXJUaGVtZVdpbkNFLmgiCiAKICNpbmNsdWRlICJDU1NTdHlsZVNoZWV0LmgiCiAj
aW5jbHVkZSAiQ1NTVmFsdWVLZXl3b3Jkcy5oIgpAQCAtODMsNDkgKzgzLDQ5IEBAIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKIHN0YXRpYyBjb25zdCBpbnQgZHJvcERvd25CdXR0b25XaWR0aCA9IDE3Owog
c3RhdGljIGNvbnN0IGludCB0cmFja1dpZHRoID0gNDsKIAotUGFzc1JlZlB0cjxSZW5kZXJUaGVt
ZT4gUmVuZGVyVGhlbWVXaW5jZTo6Y3JlYXRlKCkKK1Bhc3NSZWZQdHI8UmVuZGVyVGhlbWU+IFJl
bmRlclRoZW1lV2luQ0U6OmNyZWF0ZSgpCiB7Ci0gICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBSZW5k
ZXJUaGVtZVdpbmNlKTsKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IFJlbmRlclRoZW1lV2luQ0Up
OwogfQogCiBQYXNzUmVmUHRyPFJlbmRlclRoZW1lPiBSZW5kZXJUaGVtZTo6dGhlbWVGb3JQYWdl
KFBhZ2UqIHBhZ2UpCiB7Ci0gICAgc3RhdGljIFJlbmRlclRoZW1lKiB3aW5jZVRoZW1lID0gUmVu
ZGVyVGhlbWVXaW5jZTo6Y3JlYXRlKCkucmVsZWFzZVJlZigpOworICAgIHN0YXRpYyBSZW5kZXJU
aGVtZSogd2luY2VUaGVtZSA9IFJlbmRlclRoZW1lV2luQ0U6OmNyZWF0ZSgpLnJlbGVhc2VSZWYo
KTsKICAgICByZXR1cm4gd2luY2VUaGVtZTsKIH0KIAotUmVuZGVyVGhlbWVXaW5jZTo6UmVuZGVy
VGhlbWVXaW5jZSgpCitSZW5kZXJUaGVtZVdpbkNFOjpSZW5kZXJUaGVtZVdpbkNFKCkKIHsKIH0K
IAotUmVuZGVyVGhlbWVXaW5jZTo6flJlbmRlclRoZW1lV2luY2UoKQorUmVuZGVyVGhlbWVXaW5D
RTo6flJlbmRlclRoZW1lV2luQ0UoKQogewogfQogCi1Db2xvciBSZW5kZXJUaGVtZVdpbmNlOjpw
bGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0CitDb2xvciBSZW5k
ZXJUaGVtZVdpbkNFOjpwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNv
bnN0CiB7CiAgICAgQ09MT1JSRUYgY29sb3IgPSBHZXRTeXNDb2xvcihDT0xPUl9ISUdITElHSFQp
OwogICAgIHJldHVybiBDb2xvcihHZXRSVmFsdWUoY29sb3IpLCBHZXRHVmFsdWUoY29sb3IpLCBH
ZXRCVmFsdWUoY29sb3IpLCAyNTUpOwogfQogCi1Db2xvciBSZW5kZXJUaGVtZVdpbmNlOjpwbGF0
Zm9ybUluYWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QKK0NvbG9yIFJlbmRl
clRoZW1lV2luQ0U6OnBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBj
b25zdAogewogICAgIENPTE9SUkVGIGNvbG9yID0gR2V0U3lzQ29sb3IoQ09MT1JfR1JBWVRFWFQp
OwogICAgIHJldHVybiBDb2xvcihHZXRSVmFsdWUoY29sb3IpLCBHZXRHVmFsdWUoY29sb3IpLCBH
ZXRCVmFsdWUoY29sb3IpLCAyNTUpOwogfQogCi1Db2xvciBSZW5kZXJUaGVtZVdpbmNlOjpwbGF0
Zm9ybUFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0CitDb2xvciBSZW5kZXJU
aGVtZVdpbkNFOjpwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0
CiB7CiAgICAgQ09MT1JSRUYgY29sb3IgPSBHZXRTeXNDb2xvcihDT0xPUl9ISUdITElHSFRURVhU
KTsKICAgICByZXR1cm4gQ29sb3IoR2V0UlZhbHVlKGNvbG9yKSwgR2V0R1ZhbHVlKGNvbG9yKSwg
R2V0QlZhbHVlKGNvbG9yKSwgMjU1KTsKIH0KIAotQ29sb3IgUmVuZGVyVGhlbWVXaW5jZTo6cGxh
dGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0CitDb2xvciBSZW5k
ZXJUaGVtZVdpbkNFOjpwbGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkg
Y29uc3QKIHsKICAgICByZXR1cm4gQ29sb3I6OndoaXRlOwogfQogCi1ib29sIFJlbmRlclRoZW1l
V2luY2U6OnN1cHBvcnRzRm9jdXMoQ29udHJvbFBhcnQgYXBwZWFyYW5jZSkgY29uc3QKK2Jvb2wg
UmVuZGVyVGhlbWVXaW5DRTo6c3VwcG9ydHNGb2N1cyhDb250cm9sUGFydCBhcHBlYXJhbmNlKSBj
b25zdAogewogICAgIHN3aXRjaCAoYXBwZWFyYW5jZSkgewogICAgIGNhc2UgUHVzaEJ1dHRvblBh
cnQ6CkBAIC0xNDAsMTIgKzE0MCwxMiBAQCBib29sIFJlbmRlclRoZW1lV2luY2U6OnN1cHBvcnRz
Rm9jdXMoQ29uCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIFJlbmRlclRoZW1lV2luY2U6
OnN1cHBvcnRzRm9jdXNSaW5nKGNvbnN0IFJlbmRlclN0eWxlICpzdHlsZSkgY29uc3QKK2Jvb2wg
UmVuZGVyVGhlbWVXaW5DRTo6c3VwcG9ydHNGb2N1c1JpbmcoY29uc3QgUmVuZGVyU3R5bGUgKnN0
eWxlKSBjb25zdAogewogICAgIHJldHVybiBzdXBwb3J0c0ZvY3VzKHN0eWxlLT5hcHBlYXJhbmNl
KCkpOwogfQogCi11bnNpZ25lZCBSZW5kZXJUaGVtZVdpbmNlOjpkZXRlcm1pbmVDbGFzc2ljU3Rh
dGUoUmVuZGVyT2JqZWN0KiBvKQordW5zaWduZWQgUmVuZGVyVGhlbWVXaW5DRTo6ZGV0ZXJtaW5l
Q2xhc3NpY1N0YXRlKFJlbmRlck9iamVjdCogbykKIHsKICAgICB1bnNpZ25lZCByZXN1bHQgPSAw
OwogICAgIGlmICghaXNFbmFibGVkKG8pIHx8IGlzUmVhZE9ubHlDb250cm9sKG8pKQpAQCAtMTU4
LDcgKzE1OCw3IEBAIHVuc2lnbmVkIFJlbmRlclRoZW1lV2luY2U6OmRldGVybWluZUNsYXMKICAg
ICByZXR1cm4gcmVzdWx0OwogfQogCi1UaGVtZURhdGEgUmVuZGVyVGhlbWVXaW5jZTo6Z2V0VGhl
bWVEYXRhKFJlbmRlck9iamVjdCogbykKK1RoZW1lRGF0YSBSZW5kZXJUaGVtZVdpbkNFOjpnZXRU
aGVtZURhdGEoUmVuZGVyT2JqZWN0KiBvKQogewogICAgIFRoZW1lRGF0YSByZXN1bHQ7CiAgICAg
c3dpdGNoIChvLT5zdHlsZSgpLT5hcHBlYXJhbmNlKCkpIHsKQEAgLTE4OCw3ICsxODgsNyBAQCBU
aGVtZURhdGEgUmVuZGVyVGhlbWVXaW5jZTo6Z2V0VGhlbWVEYXRhCiAgICAgcmV0dXJuIHJlc3Vs
dDsKIH0KIAotYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludEJ1dHRvbihSZW5kZXJPYmplY3Qq
IG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByKQor
Ym9vbCBSZW5kZXJUaGVtZVdpbkNFOjpwYWludEJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0
IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByKQogewogICAgIC8v
IEdldCB0aGUgY29ycmVjdCB0aGVtZSBkYXRhIGZvciBhIGJ1dHRvbgogICAgIFRoZW1lRGF0YSB0
aGVtZURhdGEgPSBnZXRUaGVtZURhdGEobyk7CkBAIC0yMDcsNyArMjA3LDcgQEAgYm9vbCBSZW5k
ZXJUaGVtZVdpbmNlOjpwYWludEJ1dHRvbihSZW5kZQogICAgIHJldHVybiBmYWxzZTsKIH0KIAot
dm9pZCBSZW5kZXJUaGVtZVdpbmNlOjpzZXRDaGVja2JveFNpemUoUmVuZGVyU3R5bGUqIHN0eWxl
KSBjb25zdAordm9pZCBSZW5kZXJUaGVtZVdpbkNFOjpzZXRDaGVja2JveFNpemUoUmVuZGVyU3R5
bGUqIHN0eWxlKSBjb25zdAogewogICAgIC8vIElmIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBi
b3RoIHNwZWNpZmllZCwgdGhlbiB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8uCiAgICAgaWYgKCFzdHls
ZS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpICYmICFzdHlsZS0+aGVpZ2h0KCkuaXNBdXRv
KCkpCkBAIC0yMjMsNyArMjIzLDcgQEAgdm9pZCBSZW5kZXJUaGVtZVdpbmNlOjpzZXRDaGVja2Jv
eFNpemUoUgogICAgICAgICBzdHlsZS0+c2V0SGVpZ2h0KExlbmd0aCgxMywgRml4ZWQpKTsKIH0K
IAotYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludFRleHRGaWVsZChSZW5kZXJPYmplY3QqIG8s
IGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByKQorYm9v
bCBSZW5kZXJUaGVtZVdpbkNFOjpwYWludFRleHRGaWVsZChSZW5kZXJPYmplY3QqIG8sIGNvbnN0
IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByKQogewogICAgIC8v
IEdldCB0aGUgY29ycmVjdCB0aGVtZSBkYXRhIGZvciBhIHRleHRmaWVsZAogICAgIFRoZW1lRGF0
YSB0aGVtZURhdGEgPSBnZXRUaGVtZURhdGEobyk7CkBAIC0yMzQsMjAgKzIzNCwyMCBAQCBib29s
IFJlbmRlclRoZW1lV2luY2U6OnBhaW50VGV4dEZpZWxkKFJlCiAgICAgcmV0dXJuIGZhbHNlOwog
fQogCi12b2lkIFJlbmRlclRoZW1lV2luY2U6OmFkanVzdE1lbnVMaXN0U3R5bGUoQ1NTU3R5bGVT
ZWxlY3Rvciogc2VsZWN0b3IsIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCogZSkgY29uc3QK
K3ZvaWQgUmVuZGVyVGhlbWVXaW5DRTo6YWRqdXN0TWVudUxpc3RTdHlsZShDU1NTdHlsZVNlbGVj
dG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlKSBjb25zdAogewog
ICAgIHN0eWxlLT5yZXNldEJvcmRlcigpOwogICAgIGFkanVzdE1lbnVMaXN0QnV0dG9uU3R5bGUo
c2VsZWN0b3IsIHN0eWxlLCBlKTsKIH0KIAotYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludE1l
bnVMaXN0KFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIGks
IGNvbnN0IEludFJlY3QmIHIpCitib29sIFJlbmRlclRoZW1lV2luQ0U6OnBhaW50TWVudUxpc3Qo
UmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgaSwgY29uc3Qg
SW50UmVjdCYgcikKIHsKICAgICBwYWludFRleHRGaWVsZChvLCBpLCByKTsKICAgICBwYWludE1l
bnVMaXN0QnV0dG9uKG8sIGksIHIpOwogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIFJlbmRl
clRoZW1lV2luY2U6OnBhaW50TWVudUxpc3RCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBS
ZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgaSwgY29uc3QgSW50UmVjdCYgcikKK2Jvb2wgUmVuZGVy
VGhlbWVXaW5DRTo6cGFpbnRNZW51TGlzdEJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJl
bmRlck9iamVjdDo6UGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByKQogewogICAgIEludFJl
Y3QgYnV0dG9uUmVjdChyLnJpZ2h0KCkgLSBkcm9wRG93bkJ1dHRvbldpZHRoIC0gMSwgci55KCks
IGRyb3BEb3duQnV0dG9uV2lkdGgsIHIuaGVpZ2h0KCkpOwogICAgIGJ1dHRvblJlY3QuaW5mbGF0
ZVkoLTEpOwpAQCAtMjU1LDI4ICsyNTUsMjggQEAgYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWlu
dE1lbnVMaXN0QnV0dAogICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIFJlbmRlclRoZW1lV2lu
Y2U6OnN5c3RlbUZvbnQoaW50IHByb3BJZCwgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRp
b24pIGNvbnN0Cit2b2lkIFJlbmRlclRoZW1lV2luQ0U6OnN5c3RlbUZvbnQoaW50IHByb3BJZCwg
Rm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIGNvbnN0CiB7CiAgICAgbm90SW1wbGVt
ZW50ZWQoKTsKIH0KIAotdm9pZCBSZW5kZXJUaGVtZVdpbmNlOjp0aGVtZUNoYW5nZWQoKQordm9p
ZCBSZW5kZXJUaGVtZVdpbkNFOjp0aGVtZUNoYW5nZWQoKQogewogfQogCi1TdHJpbmcgUmVuZGVy
VGhlbWVXaW5jZTo6ZXh0cmFEZWZhdWx0U3R5bGVTaGVldCgpCitTdHJpbmcgUmVuZGVyVGhlbWVX
aW5DRTo6ZXh0cmFEZWZhdWx0U3R5bGVTaGVldCgpCiB7CiAgICAgbm90SW1wbGVtZW50ZWQoKTsK
ICAgICByZXR1cm4gU3RyaW5nKCk7CiB9CiAKLVN0cmluZyBSZW5kZXJUaGVtZVdpbmNlOjpleHRy
YVF1aXJrc1N0eWxlU2hlZXQoKQorU3RyaW5nIFJlbmRlclRoZW1lV2luQ0U6OmV4dHJhUXVpcmtz
U3R5bGVTaGVldCgpCiB7CiAgICAgbm90SW1wbGVtZW50ZWQoKTsKICAgICByZXR1cm4gU3RyaW5n
KCk7CiB9CiAKLWJvb2wgUmVuZGVyVGhlbWVXaW5jZTo6c3VwcG9ydHNIb3Zlcihjb25zdCBSZW5k
ZXJTdHlsZSopIGNvbnN0Citib29sIFJlbmRlclRoZW1lV2luQ0U6OnN1cHBvcnRzSG92ZXIoY29u
c3QgUmVuZGVyU3R5bGUqKSBjb25zdAogewogICAgIHJldHVybiBmYWxzZTsKIH0KQEAgLTMxNyw3
ICszMTcsNyBAQCBzdGF0aWMgaW50IGNzc1ZhbHVlSWRUb1N5c0NvbG9ySW5kZXgoaW50CiAgICAg
fQogfQogCi1Db2xvciBSZW5kZXJUaGVtZVdpbmNlOjpzeXN0ZW1Db2xvcihpbnQgY3NzVmFsdWVJ
ZCkgY29uc3QKK0NvbG9yIFJlbmRlclRoZW1lV2luQ0U6OnN5c3RlbUNvbG9yKGludCBjc3NWYWx1
ZUlkKSBjb25zdAogewogICAgIGludCBzeXNDb2xvckluZGV4ID0gY3NzVmFsdWVJZFRvU3lzQ29s
b3JJbmRleChjc3NWYWx1ZUlkKTsKICAgICBpZiAoc3lzQ29sb3JJbmRleCA9PSAtMSkKQEAgLTMz
MCw3ICszMzAsNyBAQCBDb2xvciBSZW5kZXJUaGVtZVdpbmNlOjpzeXN0ZW1Db2xvcihpbnQKIGNv
bnN0IGludCBzbGlkZXJUaHVtYldpZHRoID0gNzsKIGNvbnN0IGludCBzbGlkZXJUaHVtYkhlaWdo
dCA9IDE1OwogCi12b2lkIFJlbmRlclRoZW1lV2luY2U6OmFkanVzdFNsaWRlclRodW1iU2l6ZShS
ZW5kZXJPYmplY3QqIG8pIGNvbnN0Cit2b2lkIFJlbmRlclRoZW1lV2luQ0U6OmFkanVzdFNsaWRl
clRodW1iU2l6ZShSZW5kZXJPYmplY3QqIG8pIGNvbnN0CiB7CiAgICAgaWYgKG8tPnN0eWxlKCkt
PmFwcGVhcmFuY2UoKSA9PSBTbGlkZXJUaHVtYlZlcnRpY2FsUGFydCkgewogICAgICAgICBvLT5z
dHlsZSgpLT5zZXRXaWR0aChMZW5ndGgoc2xpZGVyVGh1bWJIZWlnaHQsIEZpeGVkKSk7CkBAIC0z
NDIsNyArMzQyLDcgQEAgdm9pZCBSZW5kZXJUaGVtZVdpbmNlOjphZGp1c3RTbGlkZXJUaHVtYgog
fQogCiAjaWYgMAotdm9pZCBSZW5kZXJUaGVtZVdpbmNlOjphZGp1c3RCdXR0b25Jbm5lclN0eWxl
KFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3ZvaWQgUmVuZGVyVGhlbWVXaW5DRTo6YWRqdXN0
QnV0dG9uSW5uZXJTdHlsZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0CiB7CiAgICAgLy8gVGhp
cyBpbm5lciBwYWRkaW5nIG1hdGNoZXMgRmlyZWZveC4KICAgICBzdHlsZS0+c2V0UGFkZGluZ1Rv
cChMZW5ndGgoMSwgRml4ZWQpKTsKQEAgLTM1MSw3ICszNTEsNyBAQCB2b2lkIFJlbmRlclRoZW1l
V2luY2U6OmFkanVzdEJ1dHRvbklubmVyCiAgICAgc3R5bGUtPnNldFBhZGRpbmdMZWZ0KExlbmd0
aCgzLCBGaXhlZCkpOwogfQogCi12b2lkIFJlbmRlclRoZW1lV2luY2U6OmFkanVzdFNlYXJjaEZp
ZWxkU3R5bGUoQ1NTU3R5bGVTZWxlY3Rvciogc2VsZWN0b3IsIFJlbmRlclN0eWxlKiBzdHlsZSwg
RWxlbWVudCogZSkgY29uc3QKK3ZvaWQgUmVuZGVyVGhlbWVXaW5DRTo6YWRqdXN0U2VhcmNoRmll
bGRTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBF
bGVtZW50KiBlKSBjb25zdAogewogICAgIC8vIE92ZXJyaWRlIHBhZGRpbmcgc2l6ZSB0byBtYXRj
aCBBcHBLaXQgdGV4dCBwb3NpdGlvbmluZy4KICAgICBjb25zdCBpbnQgcGFkZGluZyA9IDE7CkBA
IC0zNjIsMTIgKzM2MiwxMiBAQCB2b2lkIFJlbmRlclRoZW1lV2luY2U6OmFkanVzdFNlYXJjaEZp
ZWxkCiB9CiAjZW5kaWYKIAotYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludFNlYXJjaEZpZWxk
KFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIGksIGNvbnN0
IEludFJlY3QmIHIpCitib29sIFJlbmRlclRoZW1lV2luQ0U6OnBhaW50U2VhcmNoRmllbGQoUmVu
ZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgaSwgY29uc3QgSW50
UmVjdCYgcikKIHsKICAgICByZXR1cm4gcGFpbnRUZXh0RmllbGQobywgaSwgcik7CiB9CiAKLWJv
b2wgUmVuZGVyVGhlbWVXaW5jZTo6cGFpbnRTZWFyY2hGaWVsZENhbmNlbEJ1dHRvbihSZW5kZXJP
YmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0
IEludFJlY3QmIHIpCitib29sIFJlbmRlclRoZW1lV2luQ0U6OnBhaW50U2VhcmNoRmllbGRDYW5j
ZWxCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYg
cGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQogewogICAgIENvbG9yIGJ1dHRvbkNvbG9yID0g
KG8tPm5vZGUoKSAmJiBvLT5ub2RlKCktPmFjdGl2ZSgpKSA/IENvbG9yKDEzOCwgMTM4LCAxMzgp
IDogQ29sb3IoMTg2LCAxODYsIDE4Nik7CiAKQEAgLTM5MSw0NyArMzkxLDQ3IEBAIGJvb2wgUmVu
ZGVyVGhlbWVXaW5jZTo6cGFpbnRTZWFyY2hGaWVsZEMKICAgICByZXR1cm4gZmFsc2U7CiB9CiAK
LXZvaWQgUmVuZGVyVGhlbWVXaW5jZTo6YWRqdXN0U2VhcmNoRmllbGRDYW5jZWxCdXR0b25TdHls
ZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50
KiBlKSBjb25zdAordm9pZCBSZW5kZXJUaGVtZVdpbkNFOjphZGp1c3RTZWFyY2hGaWVsZENhbmNl
bEJ1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHlsZSogc3R5
bGUsIEVsZW1lbnQqIGUpIGNvbnN0CiB7CiAgICAgSW50U2l6ZSBjYW5jZWxTaXplKDEzLCAxMSk7
CiAgICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChjYW5jZWxTaXplLndpZHRoKCksIEZpeGVkKSk7
CiAgICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgoY2FuY2VsU2l6ZS5oZWlnaHQoKSwgRml4ZWQp
KTsKIH0KIAotdm9pZCBSZW5kZXJUaGVtZVdpbmNlOjphZGp1c3RTZWFyY2hGaWVsZERlY29yYXRp
b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBF
bGVtZW50KiBlKSBjb25zdAordm9pZCBSZW5kZXJUaGVtZVdpbkNFOjphZGp1c3RTZWFyY2hGaWVs
ZERlY29yYXRpb25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUq
IHN0eWxlLCBFbGVtZW50KiBlKSBjb25zdAogewogICAgIEludFNpemUgZW1wdHlTaXplKDEsIDEx
KTsKICAgICBzdHlsZS0+c2V0V2lkdGgoTGVuZ3RoKGVtcHR5U2l6ZS53aWR0aCgpLCBGaXhlZCkp
OwogICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKGVtcHR5U2l6ZS5oZWlnaHQoKSwgRml4ZWQp
KTsKIH0KIAotdm9pZCBSZW5kZXJUaGVtZVdpbmNlOjphZGp1c3RTZWFyY2hGaWVsZFJlc3VsdHNE
ZWNvcmF0aW9uU3R5bGUoQ1NTU3R5bGVTZWxlY3Rvciogc2VsZWN0b3IsIFJlbmRlclN0eWxlKiBz
dHlsZSwgRWxlbWVudCogZSkgY29uc3QKK3ZvaWQgUmVuZGVyVGhlbWVXaW5DRTo6YWRqdXN0U2Vh
cmNoRmllbGRSZXN1bHRzRGVjb3JhdGlvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9y
LCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0CiB7CiAgICAgSW50U2l6ZSBt
YWduaWZpZXJTaXplKDE1LCAxMSk7CiAgICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChtYWduaWZp
ZXJTaXplLndpZHRoKCksIEZpeGVkKSk7CiAgICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgobWFn
bmlmaWVyU2l6ZS5oZWlnaHQoKSwgRml4ZWQpKTsKIH0KIAotYm9vbCBSZW5kZXJUaGVtZVdpbmNl
OjpwYWludFNlYXJjaEZpZWxkUmVzdWx0c0RlY29yYXRpb24oUmVuZGVyT2JqZWN0KiBvLCBjb25z
dCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQor
Ym9vbCBSZW5kZXJUaGVtZVdpbkNFOjpwYWludFNlYXJjaEZpZWxkUmVzdWx0c0RlY29yYXRpb24o
UmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZv
LCBjb25zdCBJbnRSZWN0JiByKQogewogICAgIG5vdEltcGxlbWVudGVkKCk7CiAgICAgcmV0dXJu
IGZhbHNlOwogfQogCi12b2lkIFJlbmRlclRoZW1lV2luY2U6OmFkanVzdFNlYXJjaEZpZWxkUmVz
dWx0c0J1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHlsZSog
c3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0Cit2b2lkIFJlbmRlclRoZW1lV2luQ0U6OmFkanVzdFNl
YXJjaEZpZWxkUmVzdWx0c0J1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBS
ZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0CiB7CiAgICAgSW50U2l6ZSBtYWdu
aWZpZXJTaXplKDE1LCAxMSk7CiAgICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChtYWduaWZpZXJT
aXplLndpZHRoKCksIEZpeGVkKSk7CiAgICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgobWFnbmlm
aWVyU2l6ZS5oZWlnaHQoKSwgRml4ZWQpKTsKIH0KIAotYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpw
YWludFNlYXJjaEZpZWxkUmVzdWx0c0J1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRl
ck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCitib29sIFJl
bmRlclRoZW1lV2luQ0U6OnBhaW50U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uKFJlbmRlck9iamVj
dCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50
UmVjdCYgcikKIHsKICAgICBwYWludFNlYXJjaEZpZWxkUmVzdWx0c0RlY29yYXRpb24obywgcGFp
bnRJbmZvLCByKTsKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgUmVuZGVyVGhlbWVXaW5j
ZTo6YWRqdXN0TWVudUxpc3RCdXR0b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3Rvciwg
UmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlKSBjb25zdAordm9pZCBSZW5kZXJUaGVtZVdp
bkNFOjphZGp1c3RNZW51TGlzdEJ1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9y
LCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0CiB7CiAgICAgLy8gVGhlc2Ug
YXJlIHRoZSBwYWRkaW5ncyBuZWVkZWQgdG8gcGxhY2UgdGhlIHRleHQgY29ycmVjdGx5IGluIHRo
ZSA8c2VsZWN0PiBib3gKICAgICBjb25zdCBpbnQgZHJvcERvd25Cb3hQYWRkaW5nVG9wICAgID0g
MjsKQEAgLTQ4NSw3ICs0ODUsNyBAQCBzdGF0aWMgSFRNTE1lZGlhRWxlbWVudCogbWVkaWFFbGVt
ZW50UGFyCiB9CiAjZW5kaWYKIAotYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludFNsaWRlclRy
YWNrKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIGksIGNv
bnN0IEludFJlY3QmIHIpCitib29sIFJlbmRlclRoZW1lV2luQ0U6OnBhaW50U2xpZGVyVHJhY2so
UmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgaSwgY29uc3Qg
SW50UmVjdCYgcikKIHsKICAgICBib29sIHJjID0gUmVuZGVyVGhlbWU6OnBhaW50U2xpZGVyVHJh
Y2sobywgaSwgcik7CiAgICAgSW50UG9pbnQgbGVmdCA9IEludFBvaW50KHIueCgpICsgMiwgKHIu
eSgpICsgci5ib3R0b20oKSkgLyAyKTsKQEAgLTUwOCw3ICs1MDgsNyBAQCBib29sIFJlbmRlclRo
ZW1lV2luY2U6OnBhaW50U2xpZGVyVHJhY2soCiAgICAgcmV0dXJuIHJjOwogfQogCi1ib29sIFJl
bmRlclRoZW1lV2luY2U6OnBhaW50U2xpZGVyVGh1bWIoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBS
ZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgaSwgY29uc3QgSW50UmVjdCYgcikKK2Jvb2wgUmVuZGVy
VGhlbWVXaW5DRTo6cGFpbnRTbGlkZXJUaHVtYihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRl
ck9iamVjdDo6UGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByKQogewogICAgIGJvb2wgcmMg
PSBSZW5kZXJUaGVtZTo6cGFpbnRTbGlkZXJUaHVtYihvLCBpLCByKTsKICAgICBpLmNvbnRleHQt
PnNhdmUoKTsKQEAgLTUyOCwyNyArNTI4LDI3IEBAIGJvb2wgUmVuZGVyVGhlbWVXaW5jZTo6cGFp
bnRTbGlkZXJUaHVtYigKICAgICByZXR1cm4gcmM7CiB9CiAKLWludCBSZW5kZXJUaGVtZVdpbmNl
OjpidXR0b25JbnRlcm5hbFBhZGRpbmdMZWZ0KCkgY29uc3QKK2ludCBSZW5kZXJUaGVtZVdpbkNF
OjpidXR0b25JbnRlcm5hbFBhZGRpbmdMZWZ0KCkgY29uc3QKIHsKICAgICByZXR1cm4gMzsKIH0K
IAotaW50IFJlbmRlclRoZW1lV2luY2U6OmJ1dHRvbkludGVybmFsUGFkZGluZ1JpZ2h0KCkgY29u
c3QKK2ludCBSZW5kZXJUaGVtZVdpbkNFOjpidXR0b25JbnRlcm5hbFBhZGRpbmdSaWdodCgpIGNv
bnN0CiB7CiAgICAgcmV0dXJuIDM7CiB9CiAKLWludCBSZW5kZXJUaGVtZVdpbmNlOjpidXR0b25J
bnRlcm5hbFBhZGRpbmdUb3AoKSBjb25zdAoraW50IFJlbmRlclRoZW1lV2luQ0U6OmJ1dHRvbklu
dGVybmFsUGFkZGluZ1RvcCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIDE7CiB9CiAKLWludCBSZW5k
ZXJUaGVtZVdpbmNlOjpidXR0b25JbnRlcm5hbFBhZGRpbmdCb3R0b20oKSBjb25zdAoraW50IFJl
bmRlclRoZW1lV2luQ0U6OmJ1dHRvbkludGVybmFsUGFkZGluZ0JvdHRvbSgpIGNvbnN0CiB7CiAg
ICAgcmV0dXJuIDE7CiB9CiAKLXZvaWQgUmVuZGVyVGhlbWVXaW5jZTo6YWRqdXN0U2VhcmNoRmll
bGRTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBF
bGVtZW50KiBlKSBjb25zdAordm9pZCBSZW5kZXJUaGVtZVdpbkNFOjphZGp1c3RTZWFyY2hGaWVs
ZFN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVs
ZW1lbnQqIGUpIGNvbnN0CiB7CiAgICAgY29uc3QgaW50IHBhZGRpbmcgPSAxOwogICAgIHN0eWxl
LT5zZXRQYWRkaW5nTGVmdChMZW5ndGgocGFkZGluZywgRml4ZWQpKTsKQEAgLTU1OSw3ICs1NTks
NyBAQCB2b2lkIFJlbmRlclRoZW1lV2luY2U6OmFkanVzdFNlYXJjaEZpZWxkCiAKICNpZiBFTkFC
TEUoVklERU8pCiAKLWJvb2wgUmVuZGVyVGhlbWVXaW5jZTo6cGFpbnRNZWRpYUZ1bGxzY3JlZW5C
dXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFp
bnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQorYm9vbCBSZW5kZXJUaGVtZVdpbkNFOjpwYWludE1l
ZGlhRnVsbHNjcmVlbkJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6
UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCiB7CiAgICAgYm9vbCByYyA9
IHBhaW50QnV0dG9uKG8sIHBhaW50SW5mbywgcik7CiAgICAgRmxvYXRSZWN0IGltUmVjdCA9IHI7
CkBAIC01NzIsNyArNTcyLDcgQEAgYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludE1lZGlhRnVs
bHNjcgogICAgIHJldHVybiByYzsKIH0KIAotYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludE1l
ZGlhTXV0ZUJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJ
bmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCitib29sIFJlbmRlclRoZW1lV2luQ0U6
OnBhaW50TWVkaWFNdXRlQnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0
OjpQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKIHsKICAgICBib29sIHJj
ID0gcGFpbnRCdXR0b24obywgcGFpbnRJbmZvLCByKTsKICAgICBIVE1MTWVkaWFFbGVtZW50KiBt
ZWRpYUVsZW1lbnQgPSBtZWRpYUVsZW1lbnRQYXJlbnQoby0+bm9kZSgpKTsKQEAgLTU5Nyw3ICs1
OTcsNyBAQCBib29sIFJlbmRlclRoZW1lV2luY2U6OnBhaW50TWVkaWFNdXRlQnV0CiAgICAgcmV0
dXJuIHJjOwogfQogCi1ib29sIFJlbmRlclRoZW1lV2luY2U6OnBhaW50TWVkaWFQbGF5QnV0dG9u
KFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5m
bywgY29uc3QgSW50UmVjdCYgcikKK2Jvb2wgUmVuZGVyVGhlbWVXaW5DRTo6cGFpbnRNZWRpYVBs
YXlCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYg
cGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQogewogICAgIGJvb2wgcmMgPSBwYWludEJ1dHRv
bihvLCBwYWludEluZm8sIHIpOwogICAgIEZsb2F0UmVjdCBpbVJlY3QgPSByOwpAQCAtNjIxLDcg
KzYyMSw3IEBAIGJvb2wgUmVuZGVyVGhlbWVXaW5jZTo6cGFpbnRNZWRpYVBsYXlCdXQKICAgICBy
ZXR1cm4gcmM7CiB9CiAKLWJvb2wgUmVuZGVyVGhlbWVXaW5jZTo6cGFpbnRNZWRpYVNlZWtCYWNr
QnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBh
aW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKK2Jvb2wgUmVuZGVyVGhlbWVXaW5DRTo6cGFpbnRN
ZWRpYVNlZWtCYWNrQnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQ
YWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKIHsKICAgICBib29sIHJjID0g
cGFpbnRCdXR0b24obywgcGFpbnRJbmZvLCByKTsKICAgICBGbG9hdFJlY3QgaW1SZWN0ID0gcjsK
QEAgLTYzNyw3ICs2MzcsNyBAQCBib29sIFJlbmRlclRoZW1lV2luY2U6OnBhaW50TWVkaWFTZWVr
QmFjCiAgICAgcmV0dXJuIHJjOwogfQogCi1ib29sIFJlbmRlclRoZW1lV2luY2U6OnBhaW50TWVk
aWFTZWVrRm9yd2FyZEJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6
UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCitib29sIFJlbmRlclRoZW1l
V2luQ0U6OnBhaW50TWVkaWFTZWVrRm9yd2FyZEJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0
IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCiB7
CiAgICAgYm9vbCByYyA9IHBhaW50QnV0dG9uKG8sIHBhaW50SW5mbywgcik7CiAgICAgRmxvYXRS
ZWN0IGltUmVjdCA9IHI7CkBAIC02NTMsMTYgKzY1MywxNSBAQCBib29sIFJlbmRlclRoZW1lV2lu
Y2U6OnBhaW50TWVkaWFTZWVrRm9yCiAgICAgcmV0dXJuIHJjOwogfQogCi1ib29sIFJlbmRlclRo
ZW1lV2luY2U6OnBhaW50TWVkaWFTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJl
bmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCitib29s
IFJlbmRlclRoZW1lV2luQ0U6OnBhaW50TWVkaWFTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqIG8s
IGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3Qm
IHIpCiB7CiAgICAgcmV0dXJuIHBhaW50U2xpZGVyVHJhY2sobywgcGFpbnRJbmZvLCByKTsKIH0K
IAotYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludE1lZGlhU2xpZGVyVGh1bWIoUmVuZGVyT2Jq
ZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJ
bnRSZWN0JiByKQorYm9vbCBSZW5kZXJUaGVtZVdpbkNFOjpwYWludE1lZGlhU2xpZGVyVGh1bWIo
UmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZv
LCBjb25zdCBJbnRSZWN0JiByKQogewogICAgIHJldHVybiBwYWludFNsaWRlclRodW1iKG8sIHBh
aW50SW5mbywgcik7CiB9CiAjZW5kaWYKIAotfQotCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCklu
ZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZVdpbmNlLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZVdpbmNlLmNwcAkocmV2aXNpb24gNTcyODkp
CisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZVdpbmNlLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMSw2NjggKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBXZWJL
aXQgcHJvamVjdC4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgQ29tcHV0
ZXIsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLgot
ICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQotICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0
aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8K
LSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVl
dCwgRmlmdGggRmxvb3IsCi0gKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqCi0gKi8K
LQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlJlbmRlclRoZW1lV2luY2UuaCIKLQot
I2luY2x1ZGUgIkNTU1N0eWxlU2hlZXQuaCIKLSNpbmNsdWRlICJDU1NWYWx1ZUtleXdvcmRzLmgi
Ci0jaW5jbHVkZSAiRG9jdW1lbnQuaCIKLSNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKLSNp
bmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgotI2lmIEVOQUJMRShWSURFTykKLSNpbmNsdWRlICJI
VE1MTWVkaWFFbGVtZW50LmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotLyog
Ci0gKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBhcmUgdXNlZCB0byBkZXRlcm1pbmUgaG93IGEg
d2lkZ2V0IGlzIGRyYXduIHVzaW5nCi0gKiBXaW5kb3dzJyBUaGVtZSBBUEkuIEZvciBtb3JlIGlu
Zm9ybWF0aW9uIG9uIHRoZW1lIHBhcnRzIGFuZCBzdGF0ZXMgc2VlCi0gKiBodHRwOi8vbXNkbi5t
aWNyb3NvZnQuY29tL2xpYnJhcnkvZGVmYXVsdC5hc3A/dXJsPS9saWJyYXJ5L2VuLXVzL3NoZWxs
Y2MvcGxhdGZvcm0vY29tbWN0bHMvdXNlcmV4L3RvcGljcy9wYXJ0c2FuZHN0YXRlcy5hc3AKLSAq
LwotI2RlZmluZSBUSEVNRV9DT0xPUiAyMDQKLSNkZWZpbmUgVEhFTUVfRk9OVCAgMjEwCi0KLS8v
IEdlbmVyaWMgc3RhdGUgY29uc3RhbnRzCi0jZGVmaW5lIFRTX05PUk1BTCAgICAxCi0jZGVmaW5l
IFRTX0hPVkVSICAgICAyCi0jZGVmaW5lIFRTX0FDVElWRSAgICAzCi0jZGVmaW5lIFRTX0RJU0FC
TEVEICA0Ci0jZGVmaW5lIFRTX0ZPQ1VTRUQgICA1Ci0KLS8vIEJ1dHRvbiBjb25zdGFudHMKLSNk
ZWZpbmUgQlBfQlVUVE9OICAgIDEKLSNkZWZpbmUgQlBfUkFESU8gICAgIDIKLSNkZWZpbmUgQlBf
Q0hFQ0tCT1ggIDMKLQotLy8gVGV4dGZpZWxkIGNvbnN0YW50cwotI2RlZmluZSBURlBfVEVYVEZJ
RUxEIDEKLSNkZWZpbmUgVEZTX1JFQURPTkxZICA2Ci0KLXR5cGVkZWYgSEFORExFIChXSU5BUEkq
b3BlblRoZW1lRGF0YVB0cikoSFdORCBod25kLCBMUENXU1RSIHBzekNsYXNzTGlzdCk7Ci10eXBl
ZGVmIEhSRVNVTFQgKFdJTkFQSSpjbG9zZVRoZW1lRGF0YVB0cikoSEFORExFIGhUaGVtZSk7Ci10
eXBlZGVmIEhSRVNVTFQgKFdJTkFQSSpkcmF3VGhlbWVCYWNrZ3JvdW5kUHRyKShIQU5ETEUgaFRo
ZW1lLCBIREMgaGRjLCBpbnQgaVBhcnRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGludCBpU3RhdGVJZCwgY29uc3QgUkVDVCAqcFJlY3QsCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSRUNUKiBwQ2xpcFJlY3QpOwot
dHlwZWRlZiBIUkVTVUxUIChXSU5BUEkqZHJhd1RoZW1lRWRnZVB0cikoSEFORExFIGhUaGVtZSwg
SERDIGhkYywgaW50IGlQYXJ0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBpbnQgaVN0YXRlSWQsIGNvbnN0IFJFQ1QgKnBSZWN0LAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdUVkZ2UsIHVuc2lnbmVkIHVGbGFn
cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJFQ1Qq
IHBDbGlwUmVjdCk7Ci10eXBlZGVmIEhSRVNVTFQgKFdJTkFQSSpnZXRUaGVtZUNvbnRlbnRSZWN0
UHRyKShIQU5ETEUgaFRoZW1lLCBIREMgaGRjLCBpbnQgaVBhcnRJZCwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpU3RhdGVJZCwgY29uc3QgUkVDVCogcFJl
Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNUKiBwQ29u
dGVudFJlY3QpOwotdHlwZWRlZiBIUkVTVUxUIChXSU5BUEkqZ2V0VGhlbWVQYXJ0U2l6ZVB0ciko
SEFORExFIGhUaGVtZSwgSERDIGhkYywgaW50IGlQYXJ0SWQsCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBpbnQgaVN0YXRlSWQsIFJFQ1QqIHByYywgaW50IHRzLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0laRSogcHN6KTsKLXR5cGVkZWYg
SFJFU1VMVCAoV0lOQVBJKmdldFRoZW1lU3lzRm9udFB0cikoSEFORExFIGhUaGVtZSwgaW50IGlG
b250SWQsIE9VVCBMT0dGT05UKiBwRm9udCk7Ci10eXBlZGVmIEhSRVNVTFQgKFdJTkFQSSpnZXRU
aGVtZUNvbG9yUHRyKShIQU5ETEUgaFRoZW1lLCBIREMgaGRjLCBpbnQgaVBhcnRJZCwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlTdGF0ZUlkLCBpbnQgaVByb3BJZCwg
T1VUIENPTE9SUkVGKiBwRm9udCk7Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotc3RhdGljIGNv
bnN0IGludCBkcm9wRG93bkJ1dHRvbldpZHRoID0gMTc7Ci1zdGF0aWMgY29uc3QgaW50IHRyYWNr
V2lkdGggPSA0OwotCi1QYXNzUmVmUHRyPFJlbmRlclRoZW1lPiBSZW5kZXJUaGVtZVdpbmNlOjpj
cmVhdGUoKQotewotICAgIHJldHVybiBhZG9wdFJlZihuZXcgUmVuZGVyVGhlbWVXaW5jZSk7Ci19
Ci0KLVBhc3NSZWZQdHI8UmVuZGVyVGhlbWU+IFJlbmRlclRoZW1lOjp0aGVtZUZvclBhZ2UoUGFn
ZSogcGFnZSkKLXsKLSAgICBzdGF0aWMgUmVuZGVyVGhlbWUqIHdpbmNlVGhlbWUgPSBSZW5kZXJU
aGVtZVdpbmNlOjpjcmVhdGUoKS5yZWxlYXNlUmVmKCk7Ci0gICAgcmV0dXJuIHdpbmNlVGhlbWU7
Ci19Ci0KLVJlbmRlclRoZW1lV2luY2U6OlJlbmRlclRoZW1lV2luY2UoKQotewotfQotCi1SZW5k
ZXJUaGVtZVdpbmNlOjp+UmVuZGVyVGhlbWVXaW5jZSgpCi17Ci19Ci0KLUNvbG9yIFJlbmRlclRo
ZW1lV2luY2U6OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QK
LXsKLSAgICBDT0xPUlJFRiBjb2xvciA9IEdldFN5c0NvbG9yKENPTE9SX0hJR0hMSUdIVCk7Ci0g
ICAgcmV0dXJuIENvbG9yKEdldFJWYWx1ZShjb2xvciksIEdldEdWYWx1ZShjb2xvciksIEdldEJW
YWx1ZShjb2xvciksIDI1NSk7Ci19Ci0KLUNvbG9yIFJlbmRlclRoZW1lV2luY2U6OnBsYXRmb3Jt
SW5hY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdAotewotICAgIENPTE9SUkVG
IGNvbG9yID0gR2V0U3lzQ29sb3IoQ09MT1JfR1JBWVRFWFQpOwotICAgIHJldHVybiBDb2xvcihH
ZXRSVmFsdWUoY29sb3IpLCBHZXRHVmFsdWUoY29sb3IpLCBHZXRCVmFsdWUoY29sb3IpLCAyNTUp
OwotfQotCi1Db2xvciBSZW5kZXJUaGVtZVdpbmNlOjpwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkZv
cmVncm91bmRDb2xvcigpIGNvbnN0Ci17Ci0gICAgQ09MT1JSRUYgY29sb3IgPSBHZXRTeXNDb2xv
cihDT0xPUl9ISUdITElHSFRURVhUKTsKLSAgICByZXR1cm4gQ29sb3IoR2V0UlZhbHVlKGNvbG9y
KSwgR2V0R1ZhbHVlKGNvbG9yKSwgR2V0QlZhbHVlKGNvbG9yKSwgMjU1KTsKLX0KLQotQ29sb3Ig
UmVuZGVyVGhlbWVXaW5jZTo6cGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xv
cigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIENvbG9yOjp3aGl0ZTsKLX0KLQotYm9vbCBSZW5kZXJU
aGVtZVdpbmNlOjpzdXBwb3J0c0ZvY3VzKENvbnRyb2xQYXJ0IGFwcGVhcmFuY2UpIGNvbnN0Ci17
Ci0gICAgc3dpdGNoIChhcHBlYXJhbmNlKSB7Ci0gICAgY2FzZSBQdXNoQnV0dG9uUGFydDoKLSAg
ICBjYXNlIEJ1dHRvblBhcnQ6Ci0gICAgY2FzZSBUZXh0RmllbGRQYXJ0OgotICAgIGNhc2UgVGV4
dEFyZWFQYXJ0OgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIFJlbmRl
clRoZW1lV2luY2U6OnN1cHBvcnRzRm9jdXNSaW5nKGNvbnN0IFJlbmRlclN0eWxlICpzdHlsZSkg
Y29uc3QKLXsKLSAgICByZXR1cm4gc3VwcG9ydHNGb2N1cyhzdHlsZS0+YXBwZWFyYW5jZSgpKTsK
LX0KLQotdW5zaWduZWQgUmVuZGVyVGhlbWVXaW5jZTo6ZGV0ZXJtaW5lQ2xhc3NpY1N0YXRlKFJl
bmRlck9iamVjdCogbykKLXsKLSAgICB1bnNpZ25lZCByZXN1bHQgPSAwOwotICAgIGlmICghaXNF
bmFibGVkKG8pIHx8IGlzUmVhZE9ubHlDb250cm9sKG8pKQotICAgICAgICByZXN1bHQgPSBERkNT
X0lOQUNUSVZFOwotICAgIGVsc2UgaWYgKGlzUHJlc3NlZChvKSkgLy8gQWN0aXZlIHN1cGVyc2Vk
ZXMgaG92ZXIKLSAgICAgICAgcmVzdWx0ID0gREZDU19QVVNIRUQ7Ci0KLSAgICBpZiAoaXNDaGVj
a2VkKG8pKQotICAgICAgICByZXN1bHQgfD0gREZDU19DSEVDS0VEOwotICAgIHJldHVybiByZXN1
bHQ7Ci19Ci0KLVRoZW1lRGF0YSBSZW5kZXJUaGVtZVdpbmNlOjpnZXRUaGVtZURhdGEoUmVuZGVy
T2JqZWN0KiBvKQotewotICAgIFRoZW1lRGF0YSByZXN1bHQ7Ci0gICAgc3dpdGNoIChvLT5zdHls
ZSgpLT5hcHBlYXJhbmNlKCkpIHsKLSAgICBjYXNlIFB1c2hCdXR0b25QYXJ0OgotICAgIGNhc2Ug
QnV0dG9uUGFydDoKLSAgICAgICAgcmVzdWx0Lm1fcGFydCA9IEJQX0JVVFRPTjsKLSAgICAgICAg
cmVzdWx0Lm1fY2xhc3NpY1N0YXRlID0gREZDU19CVVRUT05QVVNIOwotICAgICAgICBicmVhazsK
LSAgICBjYXNlIENoZWNrYm94UGFydDoKLSAgICAgICAgcmVzdWx0Lm1fcGFydCA9IEJQX0NIRUNL
Qk9YOwotICAgICAgICByZXN1bHQubV9jbGFzc2ljU3RhdGUgPSBERkNTX0JVVFRPTkNIRUNLOwot
ICAgICAgICBicmVhazsKLSAgICBjYXNlIFJhZGlvUGFydDoKLSAgICAgICAgcmVzdWx0Lm1fcGFy
dCA9IEJQX1JBRElPOwotICAgICAgICByZXN1bHQubV9jbGFzc2ljU3RhdGUgPSBERkNTX0JVVFRP
TlJBRElPOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIExpc3Rib3hQYXJ0OgotICAgIGNhc2Ug
TWVudWxpc3RQYXJ0OgotICAgIGNhc2UgVGV4dEZpZWxkUGFydDoKLSAgICBjYXNlIFRleHRBcmVh
UGFydDoKLSAgICAgICAgcmVzdWx0Lm1fcGFydCA9IFRGUF9URVhURklFTEQ7Ci0gICAgICAgIGJy
ZWFrOwotICAgIH0KLQotICAgIHJlc3VsdC5tX2NsYXNzaWNTdGF0ZSB8PSBkZXRlcm1pbmVDbGFz
c2ljU3RhdGUobyk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1ib29sIFJlbmRlclRoZW1l
V2luY2U6OnBhaW50QnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQ
YWludEluZm8mIGksIGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgLy8gR2V0IHRoZSBjb3JyZWN0
IHRoZW1lIGRhdGEgZm9yIGEgYnV0dG9uCi0gICAgVGhlbWVEYXRhIHRoZW1lRGF0YSA9IGdldFRo
ZW1lRGF0YShvKTsKLQotICAgIC8vIE5vdyBwYWludCB0aGUgYnV0dG9uLgotICAgIGkuY29udGV4
dC0+ZHJhd0ZyYW1lQ29udHJvbChyLCBERkNfQlVUVE9OLCB0aGVtZURhdGEubV9jbGFzc2ljU3Rh
dGUpOwotICAgIGlmIChpc0ZvY3VzZWQobykpIHsKLSAgICAgICAgaWYgKHRoZW1lRGF0YS5tX3Bh
cnQgPT0gQlBfQlVUVE9OKSB7Ci0gICAgICAgICAgICBJbnRSZWN0IGZvY3VzUmVjdChyKTsKLSAg
ICAgICAgICAgIGZvY3VzUmVjdC5pbmZsYXRlKC0yKTsKLSAgICAgICAgICAgIGkuY29udGV4dC0+
ZHJhd0ZvY3VzUmVjdChmb2N1c1JlY3QpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGku
Y29udGV4dC0+ZHJhd0ZvY3VzUmVjdChyKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19
Ci0KLXZvaWQgUmVuZGVyVGhlbWVXaW5jZTo6c2V0Q2hlY2tib3hTaXplKFJlbmRlclN0eWxlKiBz
dHlsZSkgY29uc3QKLXsKLSAgICAvLyBJZiB0aGUgd2lkdGggYW5kIGhlaWdodCBhcmUgYm90aCBz
cGVjaWZpZWQsIHRoZW4gd2UgaGF2ZSBub3RoaW5nIHRvIGRvLgotICAgIGlmICghc3R5bGUtPndp
ZHRoKCkuaXNJbnRyaW5zaWNPckF1dG8oKSAmJiAhc3R5bGUtPmhlaWdodCgpLmlzQXV0bygpKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBGSVhNRTogIEEgaGFyZC1jb2RlZCBzaXplIG9mIDEz
IGlzIHVzZWQuICBUaGlzIGlzIHdyb25nIGJ1dCBuZWNlc3NhcnkgZm9yIG5vdy4gIEl0IG1hdGNo
ZXMgRmlyZWZveC4KLSAgICAvLyBBdCBkaWZmZXJlbnQgRFBJIHNldHRpbmdzIG9uIFdpbmRvd3Ms
IHF1ZXJ5aW5nIHRoZSB0aGVtZSBnaXZlcyB5b3UgYSBsYXJnZXIgc2l6ZSB0aGF0IGFjY291bnRz
IGZvcgotICAgIC8vIHRoZSBoaWdoZXIgRFBJLiAgVW50aWwgb3VyIGVudGlyZSBlbmdpbmUgaG9u
b3JzIGEgRFBJIHNldHRpbmcgb3RoZXIgdGhhbiA5Niwgd2UgY2FuJ3QgcmVseSBvbiB0aGUgdGhl
bWUncwotICAgIC8vIG1ldHJpY3MuCi0gICAgaWYgKHN0eWxlLT53aWR0aCgpLmlzSW50cmluc2lj
T3JBdXRvKCkpCi0gICAgICAgIHN0eWxlLT5zZXRXaWR0aChMZW5ndGgoMTMsIEZpeGVkKSk7Ci0g
ICAgaWYgKHN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkKLSAgICAgICAgc3R5bGUtPnNldEhlaWdo
dChMZW5ndGgoMTMsIEZpeGVkKSk7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVXaW5jZTo6cGFpbnRU
ZXh0RmllbGQoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYg
aSwgY29uc3QgSW50UmVjdCYgcikKLXsKLSAgICAvLyBHZXQgdGhlIGNvcnJlY3QgdGhlbWUgZGF0
YSBmb3IgYSB0ZXh0ZmllbGQKLSAgICBUaGVtZURhdGEgdGhlbWVEYXRhID0gZ2V0VGhlbWVEYXRh
KG8pOwotCi0gICAgLy8gTm93IHBhaW50IHRoZSB0ZXh0IGZpZWxkLgotICAgIGkuY29udGV4dC0+
cGFpbnRUZXh0RmllbGQociwgdGhlbWVEYXRhLm1fY2xhc3NpY1N0YXRlKTsKLQotICAgIHJldHVy
biBmYWxzZTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZVdpbmNlOjphZGp1c3RNZW51TGlzdFN0eWxl
KENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQq
IGUpIGNvbnN0Ci17Ci0gICAgc3R5bGUtPnJlc2V0Qm9yZGVyKCk7Ci0gICAgYWRqdXN0TWVudUxp
c3RCdXR0b25TdHlsZShzZWxlY3Rvciwgc3R5bGUsIGUpOwotfQotCi1ib29sIFJlbmRlclRoZW1l
V2luY2U6OnBhaW50TWVudUxpc3QoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6
OlBhaW50SW5mbyYgaSwgY29uc3QgSW50UmVjdCYgcikKLXsKLSAgICBwYWludFRleHRGaWVsZChv
LCBpLCByKTsKLSAgICBwYWludE1lbnVMaXN0QnV0dG9uKG8sIGksIHIpOwotICAgIHJldHVybiB0
cnVlOwotfQotCi1ib29sIFJlbmRlclRoZW1lV2luY2U6OnBhaW50TWVudUxpc3RCdXR0b24oUmVu
ZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgaSwgY29uc3QgSW50
UmVjdCYgcikKLXsKLSAgICBJbnRSZWN0IGJ1dHRvblJlY3Qoci5yaWdodCgpIC0gZHJvcERvd25C
dXR0b25XaWR0aCAtIDEsIHIueSgpLCBkcm9wRG93bkJ1dHRvbldpZHRoLCByLmhlaWdodCgpKTsK
LSAgICBidXR0b25SZWN0LmluZmxhdGVZKC0xKTsKLSAgICBpLmNvbnRleHQtPmRyYXdGcmFtZUNv
bnRyb2woYnV0dG9uUmVjdCwgREZDX1NDUk9MTCwgREZDU19TQ1JPTExDT01CT0JPWCB8IGRldGVy
bWluZUNsYXNzaWNTdGF0ZShvKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUmVuZGVy
VGhlbWVXaW5jZTo6c3lzdGVtRm9udChpbnQgcHJvcElkLCBGb250RGVzY3JpcHRpb24mIGZvbnRE
ZXNjcmlwdGlvbikgY29uc3QKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotfQotCi12b2lkIFJl
bmRlclRoZW1lV2luY2U6OnRoZW1lQ2hhbmdlZCgpCi17Ci19Ci0KLVN0cmluZyBSZW5kZXJUaGVt
ZVdpbmNlOjpleHRyYURlZmF1bHRTdHlsZVNoZWV0KCkKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgp
OwotICAgIHJldHVybiBTdHJpbmcoKTsKLX0KLQotU3RyaW5nIFJlbmRlclRoZW1lV2luY2U6OmV4
dHJhUXVpcmtzU3R5bGVTaGVldCgpCi17Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1
cm4gU3RyaW5nKCk7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVXaW5jZTo6c3VwcG9ydHNIb3Zlcihj
b25zdCBSZW5kZXJTdHlsZSopIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBN
YXAgYSBDU1NWYWx1ZSogc3lzdGVtIGNvbG9yIHRvIGFuIGluZGV4IHVuZGVyc3Rvb2QgYnkgR2V0
U3lzQ29sb3IKLXN0YXRpYyBpbnQgY3NzVmFsdWVJZFRvU3lzQ29sb3JJbmRleChpbnQgY3NzVmFs
dWVJZCkKLXsKLSAgICBzd2l0Y2ggKGNzc1ZhbHVlSWQpIHsKLSAgICBjYXNlIENTU1ZhbHVlQWN0
aXZlYm9yZGVyOiByZXR1cm4gQ09MT1JfQUNUSVZFQk9SREVSOwotICAgIGNhc2UgQ1NTVmFsdWVB
Y3RpdmVjYXB0aW9uOiByZXR1cm4gQ09MT1JfQUNUSVZFQ0FQVElPTjsKLSAgICBjYXNlIENTU1Zh
bHVlQXBwd29ya3NwYWNlOiByZXR1cm4gQ09MT1JfQVBQV09SS1NQQUNFOwotICAgIGNhc2UgQ1NT
VmFsdWVCYWNrZ3JvdW5kOiByZXR1cm4gQ09MT1JfQkFDS0dST1VORDsKLSAgICBjYXNlIENTU1Zh
bHVlQnV0dG9uZmFjZTogcmV0dXJuIENPTE9SX0JUTkZBQ0U7Ci0gICAgY2FzZSBDU1NWYWx1ZUJ1
dHRvbmhpZ2hsaWdodDogcmV0dXJuIENPTE9SX0JUTkhJR0hMSUdIVDsKLSAgICBjYXNlIENTU1Zh
bHVlQnV0dG9uc2hhZG93OiByZXR1cm4gQ09MT1JfQlROU0hBRE9XOwotICAgIGNhc2UgQ1NTVmFs
dWVCdXR0b250ZXh0OiByZXR1cm4gQ09MT1JfQlROVEVYVDsKLSAgICBjYXNlIENTU1ZhbHVlQ2Fw
dGlvbnRleHQ6IHJldHVybiBDT0xPUl9DQVBUSU9OVEVYVDsKLSAgICBjYXNlIENTU1ZhbHVlR3Jh
eXRleHQ6IHJldHVybiBDT0xPUl9HUkFZVEVYVDsKLSAgICBjYXNlIENTU1ZhbHVlSGlnaGxpZ2h0
OiByZXR1cm4gQ09MT1JfSElHSExJR0hUOwotICAgIGNhc2UgQ1NTVmFsdWVIaWdobGlnaHR0ZXh0
OiByZXR1cm4gQ09MT1JfSElHSExJR0hUVEVYVDsKLSAgICBjYXNlIENTU1ZhbHVlSW5hY3RpdmVi
b3JkZXI6IHJldHVybiBDT0xPUl9JTkFDVElWRUJPUkRFUjsKLSAgICBjYXNlIENTU1ZhbHVlSW5h
Y3RpdmVjYXB0aW9uOiByZXR1cm4gQ09MT1JfSU5BQ1RJVkVDQVBUSU9OOwotICAgIGNhc2UgQ1NT
VmFsdWVJbmFjdGl2ZWNhcHRpb250ZXh0OiByZXR1cm4gQ09MT1JfSU5BQ1RJVkVDQVBUSU9OVEVY
VDsKLSAgICBjYXNlIENTU1ZhbHVlSW5mb2JhY2tncm91bmQ6IHJldHVybiBDT0xPUl9JTkZPQks7
Ci0gICAgY2FzZSBDU1NWYWx1ZUluZm90ZXh0OiByZXR1cm4gQ09MT1JfSU5GT1RFWFQ7Ci0gICAg
Y2FzZSBDU1NWYWx1ZU1lbnU6IHJldHVybiBDT0xPUl9NRU5VOwotICAgIGNhc2UgQ1NTVmFsdWVN
ZW51dGV4dDogcmV0dXJuIENPTE9SX01FTlVURVhUOwotICAgIGNhc2UgQ1NTVmFsdWVTY3JvbGxi
YXI6IHJldHVybiBDT0xPUl9TQ1JPTExCQVI7Ci0gICAgY2FzZSBDU1NWYWx1ZVRocmVlZGRhcmtz
aGFkb3c6IHJldHVybiBDT0xPUl8zRERLU0hBRE9XOwotICAgIGNhc2UgQ1NTVmFsdWVUaHJlZWRm
YWNlOiByZXR1cm4gQ09MT1JfM0RGQUNFOwotICAgIGNhc2UgQ1NTVmFsdWVUaHJlZWRoaWdobGln
aHQ6IHJldHVybiBDT0xPUl8zREhJR0hMSUdIVDsKLSAgICBjYXNlIENTU1ZhbHVlVGhyZWVkbGln
aHRzaGFkb3c6IHJldHVybiBDT0xPUl8zRExJR0hUOwotICAgIGNhc2UgQ1NTVmFsdWVUaHJlZWRz
aGFkb3c6IHJldHVybiBDT0xPUl8zRFNIQURPVzsKLSAgICBjYXNlIENTU1ZhbHVlV2luZG93OiBy
ZXR1cm4gQ09MT1JfV0lORE9XOwotICAgIGNhc2UgQ1NTVmFsdWVXaW5kb3dmcmFtZTogcmV0dXJu
IENPTE9SX1dJTkRPV0ZSQU1FOwotICAgIGNhc2UgQ1NTVmFsdWVXaW5kb3d0ZXh0OiByZXR1cm4g
Q09MT1JfV0lORE9XVEVYVDsKLSAgICBkZWZhdWx0OiByZXR1cm4gLTE7IC8vIFVuc3VwcG9ydGVk
IENTU1ZhbHVlCi0gICAgfQotfQotCi1Db2xvciBSZW5kZXJUaGVtZVdpbmNlOjpzeXN0ZW1Db2xv
cihpbnQgY3NzVmFsdWVJZCkgY29uc3QKLXsKLSAgICBpbnQgc3lzQ29sb3JJbmRleCA9IGNzc1Zh
bHVlSWRUb1N5c0NvbG9ySW5kZXgoY3NzVmFsdWVJZCk7Ci0gICAgaWYgKHN5c0NvbG9ySW5kZXgg
PT0gLTEpCi0gICAgICAgIHJldHVybiBSZW5kZXJUaGVtZTo6c3lzdGVtQ29sb3IoY3NzVmFsdWVJ
ZCk7Ci0KLSAgICBDT0xPUlJFRiBjb2xvciA9IEdldFN5c0NvbG9yKHN5c0NvbG9ySW5kZXgpOwot
ICAgIHJldHVybiBDb2xvcihHZXRSVmFsdWUoY29sb3IpLCBHZXRHVmFsdWUoY29sb3IpLCBHZXRC
VmFsdWUoY29sb3IpKTsKLX0KLQotY29uc3QgaW50IHNsaWRlclRodW1iV2lkdGggPSA3OwotY29u
c3QgaW50IHNsaWRlclRodW1iSGVpZ2h0ID0gMTU7Ci0KLXZvaWQgUmVuZGVyVGhlbWVXaW5jZTo6
YWRqdXN0U2xpZGVyVGh1bWJTaXplKFJlbmRlck9iamVjdCogbykgY29uc3QKLXsKLSAgICBpZiAo
by0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0KSB7Ci0g
ICAgICAgIG8tPnN0eWxlKCktPnNldFdpZHRoKExlbmd0aChzbGlkZXJUaHVtYkhlaWdodCwgRml4
ZWQpKTsKLSAgICAgICAgby0+c3R5bGUoKS0+c2V0SGVpZ2h0KExlbmd0aChzbGlkZXJUaHVtYldp
ZHRoLCBGaXhlZCkpOwotICAgIH0gZWxzZSBpZiAoby0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpID09
IFNsaWRlclRodW1iSG9yaXpvbnRhbFBhcnQpIHsKLSAgICAgICAgby0+c3R5bGUoKS0+c2V0V2lk
dGgoTGVuZ3RoKHNsaWRlclRodW1iV2lkdGgsIEZpeGVkKSk7Ci0gICAgICAgIG8tPnN0eWxlKCkt
PnNldEhlaWdodChMZW5ndGgoc2xpZGVyVGh1bWJIZWlnaHQsIEZpeGVkKSk7Ci0gICAgfQotfQot
Ci0jaWYgMAotdm9pZCBSZW5kZXJUaGVtZVdpbmNlOjphZGp1c3RCdXR0b25Jbm5lclN0eWxlKFJl
bmRlclN0eWxlKiBzdHlsZSkgY29uc3QKLXsKLSAgICAvLyBUaGlzIGlubmVyIHBhZGRpbmcgbWF0
Y2hlcyBGaXJlZm94LgotICAgIHN0eWxlLT5zZXRQYWRkaW5nVG9wKExlbmd0aCgxLCBGaXhlZCkp
OwotICAgIHN0eWxlLT5zZXRQYWRkaW5nUmlnaHQoTGVuZ3RoKDMsIEZpeGVkKSk7Ci0gICAgc3R5
bGUtPnNldFBhZGRpbmdCb3R0b20oTGVuZ3RoKDEsIEZpeGVkKSk7Ci0gICAgc3R5bGUtPnNldFBh
ZGRpbmdMZWZ0KExlbmd0aCgzLCBGaXhlZCkpOwotfQotCi12b2lkIFJlbmRlclRoZW1lV2luY2U6
OmFkanVzdFNlYXJjaEZpZWxkU3R5bGUoQ1NTU3R5bGVTZWxlY3Rvciogc2VsZWN0b3IsIFJlbmRl
clN0eWxlKiBzdHlsZSwgRWxlbWVudCogZSkgY29uc3QKLXsKLSAgICAvLyBPdmVycmlkZSBwYWRk
aW5nIHNpemUgdG8gbWF0Y2ggQXBwS2l0IHRleHQgcG9zaXRpb25pbmcuCi0gICAgY29uc3QgaW50
IHBhZGRpbmcgPSAxOwotICAgIHN0eWxlLT5zZXRQYWRkaW5nTGVmdChMZW5ndGgocGFkZGluZywg
Rml4ZWQpKTsKLSAgICBzdHlsZS0+c2V0UGFkZGluZ1JpZ2h0KExlbmd0aChwYWRkaW5nLCBGaXhl
ZCkpOwotICAgIHN0eWxlLT5zZXRQYWRkaW5nVG9wKExlbmd0aChwYWRkaW5nLCBGaXhlZCkpOwot
ICAgIHN0eWxlLT5zZXRQYWRkaW5nQm90dG9tKExlbmd0aChwYWRkaW5nLCBGaXhlZCkpOwotfQot
I2VuZGlmCi0KLWJvb2wgUmVuZGVyVGhlbWVXaW5jZTo6cGFpbnRTZWFyY2hGaWVsZChSZW5kZXJP
YmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0
JiByKQotewotICAgIHJldHVybiBwYWludFRleHRGaWVsZChvLCBpLCByKTsKLX0KLQotYm9vbCBS
ZW5kZXJUaGVtZVdpbmNlOjpwYWludFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uKFJlbmRlck9iamVj
dCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50
UmVjdCYgcikKLXsKLSAgICBDb2xvciBidXR0b25Db2xvciA9IChvLT5ub2RlKCkgJiYgby0+bm9k
ZSgpLT5hY3RpdmUoKSkgPyBDb2xvcigxMzgsIDEzOCwgMTM4KSA6IENvbG9yKDE4NiwgMTg2LCAx
ODYpOwotCi0gICAgSW50U2l6ZSBjYW5jZWxTaXplKDEwLCAxMCk7Ci0gICAgSW50U2l6ZSBjYW5j
ZWxSYWRpdXMoY2FuY2VsU2l6ZS53aWR0aCgpIC8gMiwgY2FuY2VsU2l6ZS5oZWlnaHQoKSAvIDIp
OwotICAgIGludCB4ID0gci54KCkgKyAoci53aWR0aCgpIC0gY2FuY2VsU2l6ZS53aWR0aCgpKSAv
IDI7Ci0gICAgaW50IHkgPSByLnkoKSArIChyLmhlaWdodCgpIC0gY2FuY2VsU2l6ZS5oZWlnaHQo
KSkgLyAyICsgMTsKLSAgICBJbnRSZWN0IGNhbmNlbEJvdW5kcyhJbnRQb2ludCh4LCB5KSwgY2Fu
Y2VsU2l6ZSk7Ci0gICAgcGFpbnRJbmZvLmNvbnRleHQtPnNhdmUoKTsKLSAgICBwYWludEluZm8u
Y29udGV4dC0+YWRkUm91bmRlZFJlY3RDbGlwKGNhbmNlbEJvdW5kcywgY2FuY2VsUmFkaXVzLCBj
YW5jZWxSYWRpdXMsIGNhbmNlbFJhZGl1cywgY2FuY2VsUmFkaXVzKTsKLSAgICBwYWludEluZm8u
Y29udGV4dC0+ZmlsbFJlY3QoY2FuY2VsQm91bmRzLCBidXR0b25Db2xvciwgRGV2aWNlQ29sb3JT
cGFjZSk7Ci0KLSAgICAvLyBEcmF3IHRoZSAneCcKLSAgICBJbnRTaXplIHhTaXplKDMsIDMpOwot
ICAgIEludFJlY3QgeEJvdW5kcyhjYW5jZWxCb3VuZHMubG9jYXRpb24oKSArIEludFNpemUoMywg
MyksIHhTaXplKTsKLSAgICBwYWludEluZm8uY29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoQ29sb3I6
OndoaXRlLCBEZXZpY2VDb2xvclNwYWNlKTsKLSAgICBwYWludEluZm8uY29udGV4dC0+ZHJhd0xp
bmUoeEJvdW5kcy5sb2NhdGlvbigpLCAgeEJvdW5kcy5sb2NhdGlvbigpICsgeEJvdW5kcy5zaXpl
KCkpOwotICAgIHBhaW50SW5mby5jb250ZXh0LT5kcmF3TGluZShJbnRQb2ludCh4Qm91bmRzLnJp
Z2h0KCksIHhCb3VuZHMueSgpKSwgIEludFBvaW50KHhCb3VuZHMueCgpLCB4Qm91bmRzLmJvdHRv
bSgpKSk7Ci0KLSAgICBwYWludEluZm8uY29udGV4dC0+cmVzdG9yZSgpOwotICAgIHJldHVybiBm
YWxzZTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZVdpbmNlOjphZGp1c3RTZWFyY2hGaWVsZENhbmNl
bEJ1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHlsZSogc3R5
bGUsIEVsZW1lbnQqIGUpIGNvbnN0Ci17Ci0gICAgSW50U2l6ZSBjYW5jZWxTaXplKDEzLCAxMSk7
Ci0gICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChjYW5jZWxTaXplLndpZHRoKCksIEZpeGVkKSk7
Ci0gICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgoY2FuY2VsU2l6ZS5oZWlnaHQoKSwgRml4ZWQp
KTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZVdpbmNlOjphZGp1c3RTZWFyY2hGaWVsZERlY29yYXRp
b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBF
bGVtZW50KiBlKSBjb25zdAotewotICAgIEludFNpemUgZW1wdHlTaXplKDEsIDExKTsKLSAgICBz
dHlsZS0+c2V0V2lkdGgoTGVuZ3RoKGVtcHR5U2l6ZS53aWR0aCgpLCBGaXhlZCkpOwotICAgIHN0
eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKGVtcHR5U2l6ZS5oZWlnaHQoKSwgRml4ZWQpKTsKLX0KLQot
dm9pZCBSZW5kZXJUaGVtZVdpbmNlOjphZGp1c3RTZWFyY2hGaWVsZFJlc3VsdHNEZWNvcmF0aW9u
U3R5bGUoQ1NTU3R5bGVTZWxlY3Rvciogc2VsZWN0b3IsIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxl
bWVudCogZSkgY29uc3QKLXsKLSAgICBJbnRTaXplIG1hZ25pZmllclNpemUoMTUsIDExKTsKLSAg
ICBzdHlsZS0+c2V0V2lkdGgoTGVuZ3RoKG1hZ25pZmllclNpemUud2lkdGgoKSwgRml4ZWQpKTsK
LSAgICBzdHlsZS0+c2V0SGVpZ2h0KExlbmd0aChtYWduaWZpZXJTaXplLmhlaWdodCgpLCBGaXhl
ZCkpOwotfQotCi1ib29sIFJlbmRlclRoZW1lV2luY2U6OnBhaW50U2VhcmNoRmllbGRSZXN1bHRz
RGVjb3JhdGlvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZv
JiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsK
LSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVXaW5jZTo6YWRqdXN0U2Vh
cmNoRmllbGRSZXN1bHRzQnV0dG9uU3R5bGUoQ1NTU3R5bGVTZWxlY3Rvciogc2VsZWN0b3IsIFJl
bmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCogZSkgY29uc3QKLXsKLSAgICBJbnRTaXplIG1hZ25p
ZmllclNpemUoMTUsIDExKTsKLSAgICBzdHlsZS0+c2V0V2lkdGgoTGVuZ3RoKG1hZ25pZmllclNp
emUud2lkdGgoKSwgRml4ZWQpKTsKLSAgICBzdHlsZS0+c2V0SGVpZ2h0KExlbmd0aChtYWduaWZp
ZXJTaXplLmhlaWdodCgpLCBGaXhlZCkpOwotfQotCi1ib29sIFJlbmRlclRoZW1lV2luY2U6OnBh
aW50U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVy
T2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKLXsKLSAgICBw
YWludFNlYXJjaEZpZWxkUmVzdWx0c0RlY29yYXRpb24obywgcGFpbnRJbmZvLCByKTsKLSAgICBy
ZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVXaW5jZTo6YWRqdXN0TWVudUxpc3RC
dXR0b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUqIHN0eWxl
LCBFbGVtZW50KiBlKSBjb25zdAotewotICAgIC8vIFRoZXNlIGFyZSB0aGUgcGFkZGluZ3MgbmVl
ZGVkIHRvIHBsYWNlIHRoZSB0ZXh0IGNvcnJlY3RseSBpbiB0aGUgPHNlbGVjdD4gYm94Ci0gICAg
Y29uc3QgaW50IGRyb3BEb3duQm94UGFkZGluZ1RvcCAgICA9IDI7Ci0gICAgY29uc3QgaW50IGRy
b3BEb3duQm94UGFkZGluZ1JpZ2h0ICA9IHN0eWxlLT5kaXJlY3Rpb24oKSA9PSBMVFIgPyA0ICsg
ZHJvcERvd25CdXR0b25XaWR0aCA6IDQ7Ci0gICAgY29uc3QgaW50IGRyb3BEb3duQm94UGFkZGlu
Z0JvdHRvbSA9IDI7Ci0gICAgY29uc3QgaW50IGRyb3BEb3duQm94UGFkZGluZ0xlZnQgICA9IHN0
eWxlLT5kaXJlY3Rpb24oKSA9PSBMVFIgPyA0IDogNCArIGRyb3BEb3duQnV0dG9uV2lkdGg7Ci0g
ICAgLy8gVGhlIDxzZWxlY3Q+IGJveCBtdXN0IGJlIGF0IGxlYXN0IDEycHggaGlnaCBmb3IgdGhl
IGJ1dHRvbiB0byByZW5kZXIgbmljZWx5IG9uIFdpbmRvd3MKLSAgICBjb25zdCBpbnQgZHJvcERv
d25Cb3hNaW5IZWlnaHQgPSAxMjsKLQotICAgIC8vIFBvc2l0aW9uIHRoZSB0ZXh0IGNvcnJlY3Rs
eSB3aXRoaW4gdGhlIHNlbGVjdCBib3ggYW5kIG1ha2UgdGhlIGJveCB3aWRlIGVub3VnaCB0byBm
aXQgdGhlIGRyb3Bkb3duIGJ1dHRvbgotICAgIHN0eWxlLT5zZXRQYWRkaW5nVG9wKExlbmd0aChk
cm9wRG93bkJveFBhZGRpbmdUb3AsIEZpeGVkKSk7Ci0gICAgc3R5bGUtPnNldFBhZGRpbmdSaWdo
dChMZW5ndGgoZHJvcERvd25Cb3hQYWRkaW5nUmlnaHQsIEZpeGVkKSk7Ci0gICAgc3R5bGUtPnNl
dFBhZGRpbmdCb3R0b20oTGVuZ3RoKGRyb3BEb3duQm94UGFkZGluZ0JvdHRvbSwgRml4ZWQpKTsK
LSAgICBzdHlsZS0+c2V0UGFkZGluZ0xlZnQoTGVuZ3RoKGRyb3BEb3duQm94UGFkZGluZ0xlZnQs
IEZpeGVkKSk7Ci0KLSAgICAvLyBIZWlnaHQgaXMgbG9ja2VkIHRvIGF1dG8KLSAgICBzdHlsZS0+
c2V0SGVpZ2h0KExlbmd0aChBdXRvKSk7Ci0KLSAgICAvLyBDYWxjdWxhdGUgb3VyIG1pbi1oZWln
aHQKLSAgICBpbnQgbWluSGVpZ2h0ID0gc3R5bGUtPmZvbnQoKS5oZWlnaHQoKTsKLSAgICBtaW5I
ZWlnaHQgPSBtYXgobWluSGVpZ2h0LCBkcm9wRG93bkJveE1pbkhlaWdodCk7Ci0KLSAgICBzdHls
ZS0+c2V0TWluSGVpZ2h0KExlbmd0aChtaW5IZWlnaHQsIEZpeGVkKSk7Ci0KLSAgICAvLyBXaGl0
ZS1zcGFjZSBpcyBsb2NrZWQgdG8gcHJlCi0gICAgc3R5bGUtPnNldFdoaXRlU3BhY2UoUFJFKTsK
LQotICAgIERXT1JEIGNvbG9yTWVudSA9IEdldFN5c0NvbG9yKENPTE9SX01FTlUpOwotICAgIERX
T1JEIGNvbG9yTWVudVRleHQgPSBHZXRTeXNDb2xvcihDT0xPUl9NRU5VVEVYVCk7Ci0gICAgQ29s
b3IgYmdDb2xvcihHZXRSVmFsdWUoY29sb3JNZW51KSwgR2V0R1ZhbHVlKGNvbG9yTWVudSksIEdl
dEJWYWx1ZShjb2xvck1lbnUpLCAyNTUpOwotICAgIENvbG9yIHRleHRDb2xvcihHZXRSVmFsdWUo
Y29sb3JNZW51VGV4dCksIEdldEdWYWx1ZShjb2xvck1lbnVUZXh0KSwgR2V0QlZhbHVlKGNvbG9y
TWVudVRleHQpLCAyNTUpOwotICAgIGlmIChiZ0NvbG9yID09IHRleHRDb2xvcikKLSAgICAgICAg
dGV4dENvbG9yLnNldFJHQigofmJnQ29sb3IucmdiKCkpIHwgMHhGRjAwMDAwMCk7Ci0gICAgc3R5
bGUtPmNsZWFyQmFja2dyb3VuZExheWVycygpOwotICAgIHN0eWxlLT5hY2Nlc3NCYWNrZ3JvdW5k
TGF5ZXJzKCktPnNldENsaXAoQ29udGVudEZpbGxCb3gpOwotICAgIHN0eWxlLT5zZXRCYWNrZ3Jv
dW5kQ29sb3IoYmdDb2xvcik7Ci0gICAgc3R5bGUtPnNldENvbG9yKHRleHRDb2xvcik7Ci19Ci0K
LSNpZiBFTkFCTEUoVklERU8pCi0vLyBBdHRlbXB0IHRvIHJldHJpZXZlIGEgSFRNTE1lZGlhRWxl
bWVudCBmcm9tIGEgTm9kZS4gUmV0dXJucyAwIGlmIG9uZSBjYW5ub3QgYmUgZm91bmQuCi1zdGF0
aWMgSFRNTE1lZGlhRWxlbWVudCogbWVkaWFFbGVtZW50UGFyZW50KE5vZGUqIG5vZGUpCi17Ci0g
ICAgaWYgKCFub2RlKQotICAgICAgICByZXR1cm4gMDsKLSAgICBOb2RlKiBtZWRpYU5vZGUgPSBu
b2RlLT5zaGFkb3dBbmNlc3Rvck5vZGUoKTsKLSAgICBpZiAoIW1lZGlhTm9kZSB8fCAoIW1lZGlh
Tm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OnZpZGVvVGFnKSAmJiAhbWVkaWFOb2RlLT5oYXNU
YWdOYW1lKEhUTUxOYW1lczo6YXVkaW9UYWcpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTE1lZGlhRWxlbWVudCo+KG1lZGlhTm9kZSk7Ci19Ci0jZW5k
aWYKLQotYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludFNsaWRlclRyYWNrKFJlbmRlck9iamVj
dCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIGksIGNvbnN0IEludFJlY3QmIHIp
Ci17Ci0gICAgYm9vbCByYyA9IFJlbmRlclRoZW1lOjpwYWludFNsaWRlclRyYWNrKG8sIGksIHIp
OwotICAgIEludFBvaW50IGxlZnQgPSBJbnRQb2ludChyLngoKSArIDIsIChyLnkoKSArIHIuYm90
dG9tKCkpIC8gMik7Ci0gICAgaS5jb250ZXh0LT5zYXZlKCk7Ci0gICAgaS5jb250ZXh0LT5zZXRT
dHJva2VDb2xvcihDb2xvcjo6Z3JheSwgRGV2aWNlQ29sb3JTcGFjZSk7Ci0gICAgaS5jb250ZXh0
LT5zZXRGaWxsQ29sb3IoQ29sb3I6OmdyYXksIERldmljZUNvbG9yU3BhY2UpOwotICAgIGkuY29u
dGV4dC0+ZmlsbFJlY3Qocik7Ci0jaWYgRU5BQkxFKFZJREVPKQotICAgIEhUTUxNZWRpYUVsZW1l
bnQqIG1lZGlhRWxlbWVudCA9IG1lZGlhRWxlbWVudFBhcmVudChvLT5ub2RlKCkpOwotICAgIGlm
IChtZWRpYUVsZW1lbnQpIHsKLSAgICAgICAgaS5jb250ZXh0LT5zZXRTdHJva2VDb2xvcihDb2xv
cigwLCAweGZmLCAwKSk7Ci0gICAgICAgIEludFBvaW50IHJpZ2h0ID0gSW50UG9pbnQobGVmdC54
KCkgKyBtZWRpYUVsZW1lbnQtPnBlcmNlbnRMb2FkZWQoKSAqIChyLnJpZ2h0KCkgLSByLngoKSAt
IDQpLCAoci55KCkgKyByLmJvdHRvbSgpKSAvIDIpOwotICAgICAgICBpLmNvbnRleHQtPmRyYXdM
aW5lKGxlZnQsIHJpZ2h0KTsKLSAgICAgICAgbGVmdCA9IHJpZ2h0OwotICAgIH0KLSNlbmRpZgot
ICAgIGkuY29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoQ29sb3I6OmJsYWNrLCBEZXZpY2VDb2xvclNw
YWNlKTsKLSAgICBpLmNvbnRleHQtPmRyYXdMaW5lKGxlZnQsIEludFBvaW50KHIucmlnaHQoKSAt
IDIsIGxlZnQueSgpKSk7Ci0gICAgaS5jb250ZXh0LT5yZXN0b3JlKCk7Ci0gICAgcmV0dXJuIHJj
OwotfQotCi1ib29sIFJlbmRlclRoZW1lV2luY2U6OnBhaW50U2xpZGVyVGh1bWIoUmVuZGVyT2Jq
ZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgaSwgY29uc3QgSW50UmVjdCYg
cikKLXsKLSAgICBib29sIHJjID0gUmVuZGVyVGhlbWU6OnBhaW50U2xpZGVyVGh1bWIobywgaSwg
cik7Ci0gICAgaS5jb250ZXh0LT5zYXZlKCk7Ci0gICAgaS5jb250ZXh0LT5zZXRTdHJva2VDb2xv
cihDb2xvcjo6YmxhY2ssIERldmljZUNvbG9yU3BhY2UpOwotICAgIGkuY29udGV4dC0+c2V0Rmls
bENvbG9yKENvbG9yOjpibGFjaywgRGV2aWNlQ29sb3JTcGFjZSk7Ci0jaWYgRU5BQkxFKFZJREVP
KQotICAgIEhUTUxNZWRpYUVsZW1lbnQqIG1lZGlhRWxlbWVudCA9IG1lZGlhRWxlbWVudFBhcmVu
dChvLT5ub2RlKCkpOwotICAgIGlmIChtZWRpYUVsZW1lbnQpIHsKLSAgICAgICAgZmxvYXQgcHQg
PSAobWVkaWFFbGVtZW50LT5jdXJyZW50VGltZSgpIC0gbWVkaWFFbGVtZW50LT5zdGFydFRpbWUo
KSkgLyBtZWRpYUVsZW1lbnQtPmR1cmF0aW9uKCk7Ci0gICAgICAgIEZsb2F0UmVjdCBpbnRSZWN0
ID0gcjsKLSAgICAgICAgaW50UmVjdC5zZXRYKGludFJlY3QueCgpICsgaW50UmVjdC53aWR0aCgp
ICogcHQgLSAyKTsKLSAgICAgICAgaW50UmVjdC5zZXRXaWR0aCg1KTsKLSAgICAgICAgaS5jb250
ZXh0LT5maWxsUmVjdChpbnRSZWN0KTsKLSAgICB9Ci0jZW5kaWYKLSAgICBpLmNvbnRleHQtPnJl
c3RvcmUoKTsKLSAgICByZXR1cm4gcmM7Ci19Ci0KLWludCBSZW5kZXJUaGVtZVdpbmNlOjpidXR0
b25JbnRlcm5hbFBhZGRpbmdMZWZ0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gMzsKLX0KLQotaW50
IFJlbmRlclRoZW1lV2luY2U6OmJ1dHRvbkludGVybmFsUGFkZGluZ1JpZ2h0KCkgY29uc3QKLXsK
LSAgICByZXR1cm4gMzsKLX0KLQotaW50IFJlbmRlclRoZW1lV2luY2U6OmJ1dHRvbkludGVybmFs
UGFkZGluZ1RvcCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLWludCBSZW5kZXJUaGVt
ZVdpbmNlOjpidXR0b25JbnRlcm5hbFBhZGRpbmdCb3R0b20oKSBjb25zdAotewotICAgIHJldHVy
biAxOwotfQotCi12b2lkIFJlbmRlclRoZW1lV2luY2U6OmFkanVzdFNlYXJjaEZpZWxkU3R5bGUo
Q1NTU3R5bGVTZWxlY3Rvciogc2VsZWN0b3IsIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCog
ZSkgY29uc3QKLXsKLSAgICBjb25zdCBpbnQgcGFkZGluZyA9IDE7Ci0gICAgc3R5bGUtPnNldFBh
ZGRpbmdMZWZ0KExlbmd0aChwYWRkaW5nLCBGaXhlZCkpOwotICAgIHN0eWxlLT5zZXRQYWRkaW5n
UmlnaHQoTGVuZ3RoKHBhZGRpbmcsIEZpeGVkKSk7Ci0gICAgc3R5bGUtPnNldFBhZGRpbmdUb3Ao
TGVuZ3RoKHBhZGRpbmcsIEZpeGVkKSk7Ci0gICAgc3R5bGUtPnNldFBhZGRpbmdCb3R0b20oTGVu
Z3RoKHBhZGRpbmcsIEZpeGVkKSk7Ci19Ci0KLSNpZiBFTkFCTEUoVklERU8pCi0KLWJvb2wgUmVu
ZGVyVGhlbWVXaW5jZTo6cGFpbnRNZWRpYUZ1bGxzY3JlZW5CdXR0b24oUmVuZGVyT2JqZWN0KiBv
LCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0
JiByKQotewotICAgIGJvb2wgcmMgPSBwYWludEJ1dHRvbihvLCBwYWludEluZm8sIHIpOwotICAg
IEZsb2F0UmVjdCBpbVJlY3QgPSByOwotICAgIGltUmVjdC5pbmZsYXRlKC0yKTsKLSAgICBwYWlu
dEluZm8uY29udGV4dC0+c2F2ZSgpOwotICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRTdHJva2VD
b2xvcihDb2xvcjo6YmxhY2spOwotICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRGaWxsQ29sb3Io
Q29sb3I6OmdyYXkpOwotICAgIHBhaW50SW5mby5jb250ZXh0LT5maWxsUmVjdChpbVJlY3QpOwot
ICAgIHBhaW50SW5mby5jb250ZXh0LT5yZXN0b3JlKCk7Ci0gICAgcmV0dXJuIHJjOwotfQotCi1i
b29sIFJlbmRlclRoZW1lV2luY2U6OnBhaW50TWVkaWFNdXRlQnV0dG9uKFJlbmRlck9iamVjdCog
bywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVj
dCYgcikKLXsKLSAgICBib29sIHJjID0gcGFpbnRCdXR0b24obywgcGFpbnRJbmZvLCByKTsKLSAg
ICBIVE1MTWVkaWFFbGVtZW50KiBtZWRpYUVsZW1lbnQgPSBtZWRpYUVsZW1lbnRQYXJlbnQoby0+
bm9kZSgpKTsKLSAgICBib29sIG11dGVkID0gIW1lZGlhRWxlbWVudCB8fCBtZWRpYUVsZW1lbnQt
Pm11dGVkKCk7Ci0gICAgRmxvYXRSZWN0IGltUmVjdCA9IHI7Ci0gICAgaW1SZWN0LmluZmxhdGUo
LTIpOwotICAgIHBhaW50SW5mby5jb250ZXh0LT5zYXZlKCk7Ci0gICAgcGFpbnRJbmZvLmNvbnRl
eHQtPnNldFN0cm9rZUNvbG9yKENvbG9yOjpibGFjayk7Ci0gICAgcGFpbnRJbmZvLmNvbnRleHQt
PnNldEZpbGxDb2xvcihDb2xvcjo6YmxhY2spOwotICAgIEZsb2F0UG9pbnQgcHRzWzZdID0gewot
ICAgICAgICBGbG9hdFBvaW50KGltUmVjdC54KCkgKyAxLCBpbVJlY3QueSgpICsgaW1SZWN0Lmhl
aWdodCgpIC8gMy4wKSwKLSAgICAgICAgRmxvYXRQb2ludChpbVJlY3QueCgpICsgMSArIGltUmVj
dC53aWR0aCgpIC8gMi4wLCBpbVJlY3QueSgpICsgaW1SZWN0LmhlaWdodCgpIC8gMy4wKSwKLSAg
ICAgICAgRmxvYXRQb2ludChpbVJlY3QucmlnaHQoKSAtIDEsIGltUmVjdC55KCkpLAotICAgICAg
ICBGbG9hdFBvaW50KGltUmVjdC5yaWdodCgpIC0gMSwgaW1SZWN0LmJvdHRvbSgpKSwKLSAgICAg
ICAgRmxvYXRQb2ludChpbVJlY3QueCgpICsgMSArIGltUmVjdC53aWR0aCgpIC8gMi4wLCBpbVJl
Y3QueSgpICsgMi4wICogaW1SZWN0LmhlaWdodCgpIC8gMy4wKSwKLSAgICAgICAgRmxvYXRQb2lu
dChpbVJlY3QueCgpICsgMSwgaW1SZWN0LnkoKSArIDIuMCAqIGltUmVjdC5oZWlnaHQoKSAvIDMu
MCkKLSAgICB9OwotICAgIHBhaW50SW5mby5jb250ZXh0LT5kcmF3Q29udmV4UG9seWdvbig2LCBw
dHMpOwotICAgIGlmIChtdXRlZCkKLSAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPmRyYXdMaW5l
KEludFBvaW50KGltUmVjdC5yaWdodCgpLCBpbVJlY3QueSgpKSwgSW50UG9pbnQoaW1SZWN0Lngo
KSwgaW1SZWN0LmJvdHRvbSgpKSk7Ci0gICAgcGFpbnRJbmZvLmNvbnRleHQtPnJlc3RvcmUoKTsK
LSAgICByZXR1cm4gcmM7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVXaW5jZTo6cGFpbnRNZWRpYVBs
YXlCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYg
cGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQotewotICAgIGJvb2wgcmMgPSBwYWludEJ1dHRv
bihvLCBwYWludEluZm8sIHIpOwotICAgIEZsb2F0UmVjdCBpbVJlY3QgPSByOwotICAgIGltUmVj
dC5pbmZsYXRlKC0zKTsKLSAgICBwYWludEluZm8uY29udGV4dC0+c2F2ZSgpOwotICAgIHBhaW50
SW5mby5jb250ZXh0LT5zZXRTdHJva2VDb2xvcihDb2xvcjo6YmxhY2spOwotICAgIHBhaW50SW5m
by5jb250ZXh0LT5zZXRGaWxsQ29sb3IoQ29sb3I6OmJsYWNrKTsKLSAgICBIVE1MTWVkaWFFbGVt
ZW50KiBtZWRpYUVsZW1lbnQgPSBtZWRpYUVsZW1lbnRQYXJlbnQoby0+bm9kZSgpKTsKLSAgICBi
b29sIHBhdXNlZCA9ICFtZWRpYUVsZW1lbnQgfHwgbWVkaWFFbGVtZW50LT5wYXVzZWQoKTsKLSAg
ICBpZiAocGF1c2VkKSB7Ci0gICAgICAgIGZsb2F0IHdpZHRoID0gaW1SZWN0LndpZHRoKCk7Ci0g
ICAgICAgIGltUmVjdC5zZXRXaWR0aCh3aWR0aCAvIDMuMCk7Ci0gICAgICAgIHBhaW50SW5mby5j
b250ZXh0LT5maWxsUmVjdChpbVJlY3QpOwotICAgICAgICBpbVJlY3QubW92ZSgyLjAgKiB3aWR0
aCAvIDMuMCwgMCk7Ci0gICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5maWxsUmVjdChpbVJlY3Qp
OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEZsb2F0UG9pbnQgcHRzWzNdID0geyBGbG9hdFBvaW50
KGltUmVjdC54KCksIGltUmVjdC55KCkpLCBGbG9hdFBvaW50KGltUmVjdC5yaWdodCgpLCAoaW1S
ZWN0LnkoKSArIGltUmVjdC5ib3R0b20oKSkgLyAyLjApLCBGbG9hdFBvaW50KGltUmVjdC54KCks
IGltUmVjdC5ib3R0b20oKSkgfTsKLSAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPmRyYXdDb252
ZXhQb2x5Z29uKDMsIHB0cyk7Ci0gICAgfQotICAgIHBhaW50SW5mby5jb250ZXh0LT5yZXN0b3Jl
KCk7Ci0gICAgcmV0dXJuIHJjOwotfQotCi1ib29sIFJlbmRlclRoZW1lV2luY2U6OnBhaW50TWVk
aWFTZWVrQmFja0J1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFp
bnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgYm9vbCByYyA9IHBh
aW50QnV0dG9uKG8sIHBhaW50SW5mbywgcik7Ci0gICAgRmxvYXRSZWN0IGltUmVjdCA9IHI7Ci0g
ICAgaW1SZWN0LmluZmxhdGUoLTMpOwotICAgIEZsb2F0UG9pbnQgcHRzWzNdID0geyBGbG9hdFBv
aW50KChpbVJlY3QueCgpICsgaW1SZWN0LnJpZ2h0KCkpIC8gMi4wLCBpbVJlY3QueSgpKSwgRmxv
YXRQb2ludChpbVJlY3QueCgpLCAoaW1SZWN0LnkoKSArIGltUmVjdC5ib3R0b20oKSkgLyAyLjAp
LCBGbG9hdFBvaW50KChpbVJlY3QueCgpICsgaW1SZWN0LnJpZ2h0KCkpIC8gMi4wLCBpbVJlY3Qu
Ym90dG9tKCkpIH07Ci0gICAgRmxvYXRQb2ludCBwdHMyWzNdID0geyBGbG9hdFBvaW50KGltUmVj
dC5yaWdodCgpLCBpbVJlY3QueSgpKSwgRmxvYXRQb2ludCgoaW1SZWN0LngoKSArIGltUmVjdC5y
aWdodCgpKSAvIDIuMCwgKGltUmVjdC55KCkgKyBpbVJlY3QuYm90dG9tKCkpIC8gMi4wKSwgRmxv
YXRQb2ludChpbVJlY3QucmlnaHQoKSwgaW1SZWN0LmJvdHRvbSgpKSB9OwotICAgIHBhaW50SW5m
by5jb250ZXh0LT5zYXZlKCk7Ci0gICAgcGFpbnRJbmZvLmNvbnRleHQtPnNldFN0cm9rZUNvbG9y
KENvbG9yOjpibGFjayk7Ci0gICAgcGFpbnRJbmZvLmNvbnRleHQtPnNldEZpbGxDb2xvcihDb2xv
cjo6YmxhY2spOwotICAgIHBhaW50SW5mby5jb250ZXh0LT5kcmF3Q29udmV4UG9seWdvbigzLCBw
dHMpOwotICAgIHBhaW50SW5mby5jb250ZXh0LT5kcmF3Q29udmV4UG9seWdvbigzLCBwdHMyKTsK
LSAgICBwYWludEluZm8uY29udGV4dC0+cmVzdG9yZSgpOwotICAgIHJldHVybiByYzsKLX0KLQot
Ym9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludE1lZGlhU2Vla0ZvcndhcmRCdXR0b24oUmVuZGVy
T2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25z
dCBJbnRSZWN0JiByKQotewotICAgIGJvb2wgcmMgPSBwYWludEJ1dHRvbihvLCBwYWludEluZm8s
IHIpOwotICAgIEZsb2F0UmVjdCBpbVJlY3QgPSByOwotICAgIGltUmVjdC5pbmZsYXRlKC0zKTsK
LSAgICBGbG9hdFBvaW50IHB0c1szXSA9IHsgRmxvYXRQb2ludChpbVJlY3QueCgpLCBpbVJlY3Qu
eSgpKSwgRmxvYXRQb2ludCgoaW1SZWN0LngoKSArIGltUmVjdC5yaWdodCgpKSAvIDIuMCwgKGlt
UmVjdC55KCkgKyBpbVJlY3QuYm90dG9tKCkpIC8gMi4wKSwgRmxvYXRQb2ludChpbVJlY3QueCgp
LCBpbVJlY3QuYm90dG9tKCkpIH07Ci0gICAgRmxvYXRQb2ludCBwdHMyWzNdID0geyBGbG9hdFBv
aW50KChpbVJlY3QueCgpICsgaW1SZWN0LnJpZ2h0KCkpIC8gMi4wLCBpbVJlY3QueSgpKSwgRmxv
YXRQb2ludChpbVJlY3QucmlnaHQoKSwgKGltUmVjdC55KCkgKyBpbVJlY3QuYm90dG9tKCkpIC8g
Mi4wKSwgRmxvYXRQb2ludCgoaW1SZWN0LngoKSArIGltUmVjdC5yaWdodCgpKSAvIDIuMCwgaW1S
ZWN0LmJvdHRvbSgpKSB9OwotICAgIHBhaW50SW5mby5jb250ZXh0LT5zYXZlKCk7Ci0gICAgcGFp
bnRJbmZvLmNvbnRleHQtPnNldFN0cm9rZUNvbG9yKENvbG9yOjpibGFjayk7Ci0gICAgcGFpbnRJ
bmZvLmNvbnRleHQtPnNldEZpbGxDb2xvcihDb2xvcjo6YmxhY2spOwotICAgIHBhaW50SW5mby5j
b250ZXh0LT5kcmF3Q29udmV4UG9seWdvbigzLCBwdHMpOwotICAgIHBhaW50SW5mby5jb250ZXh0
LT5kcmF3Q29udmV4UG9seWdvbigzLCBwdHMyKTsKLSAgICBwYWludEluZm8uY29udGV4dC0+cmVz
dG9yZSgpOwotICAgIHJldHVybiByYzsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWlu
dE1lZGlhU2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBh
aW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQotewotICAgIHJldHVybiBwYWlu
dFNsaWRlclRyYWNrKG8sIHBhaW50SW5mbywgcik7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVXaW5j
ZTo6cGFpbnRNZWRpYVNsaWRlclRodW1iKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKLXsKLSAgICByZXR1
cm4gcGFpbnRTbGlkZXJUaHVtYihvLCBwYWludEluZm8sIHIpOwotfQotI2VuZGlmCi0KLX0KLQpJ
bmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVXaW5jZS5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lV2luY2UuaAkocmV2aXNpb24gNTcyODkpCisr
KyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZVdpbmNlLmgJKHdvcmtpbmcgY29weSkKQEAg
LTEsMTQ3ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgV2ViS2l0IHBy
b2plY3QuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA4IEFwcGxlIENvbXB1dGVyLCBJ
bmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCi0gKgotICogVGhp
cyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v
cgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91
ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0
cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhP
VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAq
IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl
ZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0
YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFy
eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICogdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBG
bG9vciwKLSAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICoKLSAqLwotCi0jaWZuZGVm
IFJlbmRlclRoZW1lV2luY2VfaAotI2RlZmluZSBSZW5kZXJUaGVtZVdpbmNlX2gKLQotI2luY2x1
ZGUgIlJlbmRlclRoZW1lLmgiCi0KLXR5cGVkZWYgdm9pZCogSEFORExFOwotdHlwZWRlZiBzdHJ1
Y3QgSElOU1RBTkNFX18qIEhJTlNUQU5DRTsKLXR5cGVkZWYgSElOU1RBTkNFIEhNT0RVTEU7Ci0K
LW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotICAgIHN0cnVjdCBUaGVtZURhdGEgewotICAgICAgICBU
aGVtZURhdGEoKSA6bV9wYXJ0KDApLCBtX3N0YXRlKDApLCBtX2NsYXNzaWNTdGF0ZSgwKSB7fQot
ICAgICAgICBUaGVtZURhdGEoaW50IHBhcnQsIGludCBzdGF0ZSkKLSAgICAgICAgICAgIDogbV9w
YXJ0KHBhcnQpCi0gICAgICAgICAgICAsIG1fc3RhdGUoc3RhdGUpCi0gICAgICAgICAgICAsIG1f
Y2xhc3NpY1N0YXRlKDApCi0gICAgICAgIHsgfQotCi0gICAgICAgIHVuc2lnbmVkIG1fcGFydDsK
LSAgICAgICAgdW5zaWduZWQgbV9zdGF0ZTsKLSAgICAgICAgdW5zaWduZWQgbV9jbGFzc2ljU3Rh
dGU7Ci0gICAgfTsKLQotICAgIGNsYXNzIFJlbmRlclRoZW1lV2luY2UgOiBwdWJsaWMgUmVuZGVy
VGhlbWUgewotICAgIHB1YmxpYzoKLSAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8UmVuZGVyVGhl
bWU+IGNyZWF0ZSgpOwotICAgICAgICB+UmVuZGVyVGhlbWVXaW5jZSgpOwotCi0gICAgICAgIHZp
cnR1YWwgU3RyaW5nIGV4dHJhRGVmYXVsdFN0eWxlU2hlZXQoKTsKLSAgICAgICAgdmlydHVhbCBT
dHJpbmcgZXh0cmFRdWlya3NTdHlsZVNoZWV0KCk7Ci0KLSAgICAgICAgLy8gQSBtZXRob2QgYXNr
aW5nIGlmIHRoZSB0aGVtZSdzIGNvbnRyb2xzIGFjdHVhbGx5IGNhcmUgYWJvdXQgcmVkcmF3aW5n
IHdoZW4gaG92ZXJlZC4KLSAgICAgICAgdmlydHVhbCBib29sIHN1cHBvcnRzSG92ZXIoY29uc3Qg
UmVuZGVyU3R5bGUqKSBjb25zdDsKLQotICAgICAgICB2aXJ0dWFsIENvbG9yIHBsYXRmb3JtQWN0
aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgQ29s
b3IgcGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0OwotICAg
ICAgICB2aXJ0dWFsIENvbG9yIHBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9y
KCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgQ29sb3IgcGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlv
bkZvcmVncm91bmRDb2xvcigpIGNvbnN0OwotCi0gICAgICAgIC8vIFN5c3RlbSBmb250cy4KLSAg
ICAgICAgdmlydHVhbCB2b2lkIHN5c3RlbUZvbnQoaW50IHByb3BJZCwgRm9udERlc2NyaXB0aW9u
JikgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgQ29sb3Igc3lzdGVtQ29sb3IoaW50IGNzc1ZhbHVl
SWQpIGNvbnN0OwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCBwYWludENoZWNrYm94KFJlbmRlck9i
amVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIGksIGNvbnN0IEludFJlY3Qm
IHIpCi0gICAgICAgIHsgcmV0dXJuIHBhaW50QnV0dG9uKG8sIGksIHIpOyB9Ci0gICAgICAgIHZp
cnR1YWwgdm9pZCBzZXRDaGVja2JveFNpemUoUmVuZGVyU3R5bGUqKSBjb25zdDsKLQotICAgICAg
ICB2aXJ0dWFsIGJvb2wgcGFpbnRSYWRpbyhSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9i
amVjdDo6UGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByKQotICAgICAgICB7IHJldHVybiBw
YWludEJ1dHRvbihvLCBpLCByKTsgfQotICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UmFkaW9TaXpl
KFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKLSAgICAgICAgeyByZXR1cm4gc2V0Q2hlY2tib3hT
aXplKHN0eWxlKTsgfQotCi0gICAgICAgIHZpcnR1YWwgYm9vbCBwYWludEJ1dHRvbihSZW5kZXJP
YmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsK
LQotICAgICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRUZXh0RmllbGQoUmVuZGVyT2JqZWN0KiwgY29u
c3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7Ci0KLSAgICAgICAg
dmlydHVhbCBib29sIHBhaW50VGV4dEFyZWEoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJP
YmplY3Q6OlBhaW50SW5mbyYgaSwgY29uc3QgSW50UmVjdCYgcikKLSAgICAgICAgeyByZXR1cm4g
cGFpbnRUZXh0RmllbGQobywgaSwgcik7IH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0
TWVudUxpc3RTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUqIHN0
eWxlLCBFbGVtZW50KiBlKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCBib29sIHBhaW50TWVudUxp
c3QoUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBJ
bnRSZWN0Jik7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RNZW51TGlzdEJ1dHRvblN0eWxl
KENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQq
IGUpIGNvbnN0OwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCBwYWludE1lbnVMaXN0QnV0dG9uKFJl
bmRlck9iamVjdCosIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50UmVj
dCYpOwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCBwYWludFNsaWRlclRyYWNrKFJlbmRlck9iamVj
dCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIGksIGNvbnN0IEludFJlY3QmIHIp
OwotICAgICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTbGlkZXJUaHVtYihSZW5kZXJPYmplY3QqIG8s
IGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByKTsKLSAg
ICAgICAgdmlydHVhbCB2b2lkIGFkanVzdFNsaWRlclRodW1iU2l6ZShSZW5kZXJPYmplY3QqKSBj
b25zdDsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgcG9wdXBPcHRpb25TdXBwb3J0c1RleHRJbmRl
bnQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICAgICAgdmlydHVhbCBpbnQgYnV0dG9u
SW50ZXJuYWxQYWRkaW5nTGVmdCgpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIGludCBidXR0b25J
bnRlcm5hbFBhZGRpbmdSaWdodCgpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIGludCBidXR0b25J
bnRlcm5hbFBhZGRpbmdUb3AoKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCBpbnQgYnV0dG9uSW50
ZXJuYWxQYWRkaW5nQm90dG9tKCkgY29uc3Q7Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIGFkanVz
dFNlYXJjaEZpZWxkU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiwgRWxlbWVu
dCopIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTZWFyY2hGaWVsZChSZW5kZXJP
YmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsK
LQotICAgICAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0U2VhcmNoRmllbGRDYW5jZWxCdXR0b25TdHls
ZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7Ci0gICAg
ICAgIHZpcnR1YWwgYm9vbCBwYWludFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uKFJlbmRlck9iamVj
dCosIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwotCi0g
ICAgICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RTZWFyY2hGaWVsZERlY29yYXRpb25TdHlsZShDU1NT
dHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7Ci0gICAgICAgIHZp
cnR1YWwgYm9vbCBwYWludFNlYXJjaEZpZWxkRGVjb3JhdGlvbihSZW5kZXJPYmplY3QqLCBjb25z
dCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKSB7IHJldHVybiBmYWxz
ZTsgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RTZWFyY2hGaWVsZFJlc3VsdHNEZWNv
cmF0aW9uU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNv
bnN0OwotICAgICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTZWFyY2hGaWVsZFJlc3VsdHNEZWNvcmF0
aW9uKFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3Qg
SW50UmVjdCYpOwotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RTZWFyY2hGaWVsZFJlc3Vs
dHNCdXR0b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50Kikg
Y29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBwYWludFNlYXJjaEZpZWxkUmVzdWx0c0J1dHRv
bihSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0IElu
dFJlY3QmKTsKLQotICAgICAgICB2aXJ0dWFsIHZvaWQgdGhlbWVDaGFuZ2VkKCk7Ci0KLSAgICAg
ICAgdmlydHVhbCB2b2lkIGFkanVzdEJ1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5k
ZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdCB7fQotICAgICAgICB2aXJ0dWFsIHZvaWQg
YWRqdXN0VGV4dEZpZWxkU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiBzdHls
ZSwgRWxlbWVudCopIGNvbnN0IHt9Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RUZXh0QXJl
YVN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBj
b25zdCB7fQotCi0gICAgICAgIHN0YXRpYyB2b2lkIHNldFdlYktpdElzQmVpbmdVbmxvYWRlZCgp
OwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0ZvY3VzUmluZyhjb25zdCBSZW5kZXJT
dHlsZSopIGNvbnN0OwotCi0gICAgI2lmIEVOQUJMRShWSURFTykKLSAgICAgICAgdmlydHVhbCBi
b29sIHBhaW50TWVkaWFGdWxsc2NyZWVuQnV0dG9uKFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRl
ck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwotICAgICAgICB2aXJ0dWFsIGJv
b2wgcGFpbnRNZWRpYVBsYXlCdXR0b24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2JqZWN0
OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBwYWlu
dE1lZGlhTXV0ZUJ1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50
SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKLSAgICAgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFT
ZWVrQmFja0J1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5m
byYsIGNvbnN0IEludFJlY3QmKTsKLSAgICAgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFTZWVr
Rm9yd2FyZEJ1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5m
byYsIGNvbnN0IEludFJlY3QmKTsKLSAgICAgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFTbGlk
ZXJUcmFjayhSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNv
bnN0IEludFJlY3QmKTsKLSAgICAgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFTbGlkZXJUaHVt
YihSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0IElu
dFJlY3QmKTsKLSAgICAjZW5kaWYKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIFJlbmRlclRoZW1l
V2luY2UoKTsKLQotICAgICAgICB1bnNpZ25lZCBkZXRlcm1pbmVDbGFzc2ljU3RhdGUoUmVuZGVy
T2JqZWN0Kik7Ci0gICAgICAgIGJvb2wgc3VwcG9ydHNGb2N1cyhDb250cm9sUGFydCkgY29uc3Q7
Ci0KLSAgICAgICAgVGhlbWVEYXRhIGdldFRoZW1lRGF0YShSZW5kZXJPYmplY3QqKTsKLSAgICB9
OwotCi19OwotCi0jZW5kaWYKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS93aW5jZS9EYXRhYmFzZVRo
cmVhZFdpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2Uvd2luY2UvRGF0YWJh
c2VUaHJlYWRXaW5DRS5jcHAJKHJldmlzaW9uIDU3Mjg5KQkoZnJvbSBXZWJDb3JlL3N0b3JhZ2Uv
d2luY2UvRGF0YWJhc2VUaHJlYWRXaW5jZS5jcHA6NTcyODkpCisrKyBXZWJDb3JlL3N0b3JhZ2Uv
d2luY2UvRGF0YWJhc2VUaHJlYWRXaW5DRS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw5
NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1
dGVkIGluIHRoZSBob3BlIHRoYXQgaSB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBB
TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1F
UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0
aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp
bHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFy
eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGgg
Rmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkRhdGFiYXNlVGhyZWFkLmgiCisKKyNpbmNsdWRlICJEYXRh
YmFzZS5oIgorI2luY2x1ZGUgIkRhdGFiYXNlVGFzay5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK0RhdGFiYXNlVGhyZWFkOjpEYXRhYmFzZVRocmVhZCgpCis6IG1fdGltZXIodGhpcywgJkRh
dGFiYXNlVGhyZWFkOjp0aW1lckZpcmVkKQoreworfQorCitEYXRhYmFzZVRocmVhZDo6fkRhdGFi
YXNlVGhyZWFkKCkKK3sKK30KKwordm9pZCBEYXRhYmFzZVRocmVhZDo6cmVxdWVzdFRlcm1pbmF0
aW9uKCkKK3sKKyAgICBtX3F1ZXVlLmNsZWFyKCk7Cit9CisKK2Jvb2wgRGF0YWJhc2VUaHJlYWQ6
OnRlcm1pbmF0aW9uUmVxdWVzdGVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9xdWV1ZS5pc0Vt
cHR5KCk7Cit9CisKK3ZvaWQgRGF0YWJhc2VUaHJlYWQ6OnRpbWVyRmlyZWQoVGltZXI8RGF0YWJh
c2VUaHJlYWQ+KikKK3sKKyAgICBpZiAoIW1fcXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgIFJl
ZlB0cjxEYXRhYmFzZVRhc2s+IHRhc2sgPSBtX3F1ZXVlLmZpcnN0KCk7CisgICAgICAgIHRhc2st
PnBlcmZvcm1UYXNrKCk7CisgICAgICAgIG1fcXVldWUucmVtb3ZlRmlyc3QoKTsKKyAgICAgICAg
aWYgKCFtX3F1ZXVlLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIG1fdGltZXIuc3RhcnRPbmVTaG90
KDApOworICAgIH0KK30KKwordm9pZCBEYXRhYmFzZVRocmVhZDo6c2NoZWR1bGVUYXNrKFBhc3NS
ZWZQdHI8RGF0YWJhc2VUYXNrPiB0YXNrKQoreworICAgIG1fcXVldWUuYXBwZW5kKHRhc2spOwor
ICAgIGlmICghbV90aW1lci5pc0FjdGl2ZSgpKQorICAgICAgICBtX3RpbWVyLnN0YXJ0T25lU2hv
dCgwKTsKK30KKwordm9pZCBEYXRhYmFzZVRocmVhZDo6c2NoZWR1bGVJbW1lZGlhdGVUYXNrKFBh
c3NSZWZQdHI8RGF0YWJhc2VUYXNrPiB0YXNrKQoreworICAgIHRhc2stPnBlcmZvcm1UYXNrKCk7
Cit9CisKK3ZvaWQgRGF0YWJhc2VUaHJlYWQ6OnVuc2NoZWR1bGVEYXRhYmFzZVRhc2tzKERhdGFi
YXNlKiBkYXRhYmFzZSkKK3sKKyAgICBEZXF1ZTxSZWZQdHI8RGF0YWJhc2VUYXNrPiA+IHJlc2Vy
dmVkVGFza3M7CisgICAgZm9yIChEZXF1ZTxSZWZQdHI8RGF0YWJhc2VUYXNrPiA+Ojpjb25zdF9p
dGVyYXRvciBpID0gbV9xdWV1ZS5iZWdpbigpOyBpICE9IG1fcXVldWUuZW5kKCk7ICsraSkgewor
ICAgICAgICBpZiAoKCppKS0+ZGF0YWJhc2UoKSAhPSBkYXRhYmFzZSkKKyAgICAgICAgICAgIHJl
c2VydmVkVGFza3MuYXBwZW5kKCppKTsKKyAgICB9CisKKyAgICBtX3F1ZXVlLnN3YXAocmVzZXJ2
ZWRUYXNrcyk7Cit9CisKK3ZvaWQgRGF0YWJhc2VUaHJlYWQ6OnJlY29yZERhdGFiYXNlT3BlbihE
YXRhYmFzZSogZGF0YWJhc2UpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBE
YXRhYmFzZVRocmVhZDo6cmVjb3JkRGF0YWJhc2VDbG9zZWQoRGF0YWJhc2UqIGRhdGFiYXNlKQor
eworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5k
ZXg6IFdlYkNvcmUvc3RvcmFnZS93aW5jZS9EYXRhYmFzZVRocmVhZFdpbkNFLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9zdG9yYWdlL3dpbmNlL0RhdGFiYXNlVGhyZWFkV2luQ0UuaAkocmV2aXNp
b24gNTcyODkpCShmcm9tIFdlYkNvcmUvc3RvcmFnZS93aW5jZS9EYXRhYmFzZVRocmVhZFdpbmNl
Lmg6NTcyODkpCisrKyBXZWJDb3JlL3N0b3JhZ2Uvd2luY2UvRGF0YWJhc2VUaHJlYWRXaW5DRS5o
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDkgVG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGkgd2lsbCBi
ZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
CisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4g
IElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMu
LCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAt
MTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgRGF0YWJhc2VUaHJlYWRXaW5jZV9oCisjZGVmaW5l
IERhdGFiYXNlVGhyZWFkV2luY2VfaAorCisjaW5jbHVkZSA8d3RmL0RlcXVlLmg+CisjaW5jbHVk
ZSA8d3RmL1JlZkNvdW50ZWQuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAgY2xhc3Mg
RGF0YWJhc2U7CisgICAgY2xhc3MgRGF0YWJhc2VUYXNrOworCisgICAgY2xhc3MgRGF0YWJhc2VU
aHJlYWQ6IHB1YmxpYyBXVEY6OlJlZkNvdW50ZWQ8RGF0YWJhc2VUaHJlYWQ+IHsKKworICAgIHB1
YmxpYzoKKyAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8RGF0YWJhc2VUaHJlYWQ+IGNyZWF0ZSgp
IHsgcmV0dXJuIGFkb3B0UmVmKG5ldyBEYXRhYmFzZVRocmVhZCk7IH0KKyAgICAgICAgfkRhdGFi
YXNlVGhyZWFkKCk7CisKKyAgICAgICAgYm9vbCBzdGFydCgpIHsgcmV0dXJuIHRydWU7IH0KKyAg
ICAgICAgdm9pZCByZXF1ZXN0VGVybWluYXRpb24oKTsKKyAgICAgICAgYm9vbCB0ZXJtaW5hdGlv
blJlcXVlc3RlZCgpIGNvbnN0OworCisgICAgICAgIHZvaWQgc2NoZWR1bGVUYXNrKFBhc3NSZWZQ
dHI8RGF0YWJhc2VUYXNrPik7CisgICAgICAgIHZvaWQgc2NoZWR1bGVJbW1lZGlhdGVUYXNrKFBh
c3NSZWZQdHI8RGF0YWJhc2VUYXNrPik7CisgICAgICAgIHZvaWQgdW5zY2hlZHVsZURhdGFiYXNl
VGFza3MoRGF0YWJhc2UqKTsKKyAgICAgICAgdm9pZCByZWNvcmREYXRhYmFzZU9wZW4oRGF0YWJh
c2UqKTsKKyAgICAgICAgdm9pZCByZWNvcmREYXRhYmFzZUNsb3NlZChEYXRhYmFzZSopOworI2lm
bmRlZiBOREVCVUcKKyAgICAgICAgVGhyZWFkSWRlbnRpZmllciBnZXRUaHJlYWRJRCgpIGNvbnN0
IHsgcmV0dXJuIGN1cnJlbnRUaHJlYWQoKTsgfQorI2VuZGlmCisKKyAgICBwcml2YXRlOgorICAg
ICAgICBEYXRhYmFzZVRocmVhZCgpOworCisgICAgICAgIHZvaWQgdGltZXJGaXJlZChUaW1lcjxE
YXRhYmFzZVRocmVhZD4qKTsKKworICAgICAgICBEZXF1ZTxSZWZQdHI8RGF0YWJhc2VUYXNrPiA+
IG1fcXVldWU7CisgICAgICAgIFRpbWVyPERhdGFiYXNlVGhyZWFkPiBtX3RpbWVyOworICAgIH07
CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIERhdGFiYXNlVGhyZWFkV2lu
Y2UKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS93aW5jZS9EYXRhYmFzZVRocmVhZFdpbkNFLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL3dpbmNlL0RhdGFiYXNlVGhyZWFkV2luQ0UuaAko
cmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3N0b3JhZ2Uvd2luY2UvRGF0YWJhc2VUaHJlYWRX
aW5DRS5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMSw4ICsyMSw4IEBACiAgKiAgQm9zdG9uLCBNQSAw
MjExMC0xMzAxLCBVU0EuCiAgKi8KIAotI2lmbmRlZiBEYXRhYmFzZVRocmVhZFdpbmNlX2gKLSNk
ZWZpbmUgRGF0YWJhc2VUaHJlYWRXaW5jZV9oCisjaWZuZGVmIERhdGFiYXNlVGhyZWFkV2luQ0Vf
aAorI2RlZmluZSBEYXRhYmFzZVRocmVhZFdpbkNFX2gKIAogI2luY2x1ZGUgPHd0Zi9EZXF1ZS5o
PgogI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CkBAIC02Miw0ICs2Miw0IEBAIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQogCi0jZW5kaWYgLy8gRGF0YWJh
c2VUaHJlYWRXaW5jZQorI2VuZGlmIC8vIERhdGFiYXNlVGhyZWFkV2luQ0VfaApJbmRleDogV2Vi
Q29yZS9zdG9yYWdlL3dpbmNlL0RhdGFiYXNlVGhyZWFkV2luY2UuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvc3RvcmFnZS93aW5jZS9EYXRhYmFzZVRocmVhZFdpbmNlLmNwcAkocmV2aXNpb24g
NTcyODkpCisrKyBXZWJDb3JlL3N0b3JhZ2Uvd2luY2UvRGF0YWJhc2VUaHJlYWRXaW5jZS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAw
OSBUb3JjaCBNb2JpbGUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0g
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0g
KiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaSB3aWxsIGJl
IHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg
aW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiAgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSBy
ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UK
LSAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAg
SWYgbm90LCB3cml0ZSB0bwotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4s
IDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0gKiAgQm9zdG9uLCBNQSAwMjExMC0x
MzAxLCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkRhdGFiYXNl
VGhyZWFkLmgiCi0KLSNpbmNsdWRlICJEYXRhYmFzZS5oIgotI2luY2x1ZGUgIkRhdGFiYXNlVGFz
ay5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLURhdGFiYXNlVGhyZWFkOjpEYXRhYmFzZVRo
cmVhZCgpCi06IG1fdGltZXIodGhpcywgJkRhdGFiYXNlVGhyZWFkOjp0aW1lckZpcmVkKQotewot
fQotCi1EYXRhYmFzZVRocmVhZDo6fkRhdGFiYXNlVGhyZWFkKCkKLXsKLX0KLQotdm9pZCBEYXRh
YmFzZVRocmVhZDo6cmVxdWVzdFRlcm1pbmF0aW9uKCkKLXsKLSAgICBtX3F1ZXVlLmNsZWFyKCk7
Ci19Ci0KLWJvb2wgRGF0YWJhc2VUaHJlYWQ6OnRlcm1pbmF0aW9uUmVxdWVzdGVkKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gbV9xdWV1ZS5pc0VtcHR5KCk7Ci19Ci0KLXZvaWQgRGF0YWJhc2VUaHJl
YWQ6OnRpbWVyRmlyZWQoVGltZXI8RGF0YWJhc2VUaHJlYWQ+KikKLXsKLSAgICBpZiAoIW1fcXVl
dWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgIFJlZlB0cjxEYXRhYmFzZVRhc2s+IHRhc2sgPSBtX3F1
ZXVlLmZpcnN0KCk7Ci0gICAgICAgIHRhc2stPnBlcmZvcm1UYXNrKCk7Ci0gICAgICAgIG1fcXVl
dWUucmVtb3ZlRmlyc3QoKTsKLSAgICAgICAgaWYgKCFtX3F1ZXVlLmlzRW1wdHkoKSkKLSAgICAg
ICAgICAgIG1fdGltZXIuc3RhcnRPbmVTaG90KDApOwotICAgIH0KLX0KLQotdm9pZCBEYXRhYmFz
ZVRocmVhZDo6c2NoZWR1bGVUYXNrKFBhc3NSZWZQdHI8RGF0YWJhc2VUYXNrPiB0YXNrKQotewot
ICAgIG1fcXVldWUuYXBwZW5kKHRhc2spOwotICAgIGlmICghbV90aW1lci5pc0FjdGl2ZSgpKQot
ICAgICAgICBtX3RpbWVyLnN0YXJ0T25lU2hvdCgwKTsKLX0KLQotdm9pZCBEYXRhYmFzZVRocmVh
ZDo6c2NoZWR1bGVJbW1lZGlhdGVUYXNrKFBhc3NSZWZQdHI8RGF0YWJhc2VUYXNrPiB0YXNrKQot
ewotICAgIHRhc2stPnBlcmZvcm1UYXNrKCk7Ci19Ci0KLXZvaWQgRGF0YWJhc2VUaHJlYWQ6OnVu
c2NoZWR1bGVEYXRhYmFzZVRhc2tzKERhdGFiYXNlKiBkYXRhYmFzZSkKLXsKLSAgICBEZXF1ZTxS
ZWZQdHI8RGF0YWJhc2VUYXNrPiA+IHJlc2VydmVkVGFza3M7Ci0gICAgZm9yIChEZXF1ZTxSZWZQ
dHI8RGF0YWJhc2VUYXNrPiA+Ojpjb25zdF9pdGVyYXRvciBpID0gbV9xdWV1ZS5iZWdpbigpOyBp
ICE9IG1fcXVldWUuZW5kKCk7ICsraSkgewotICAgICAgICBpZiAoKCppKS0+ZGF0YWJhc2UoKSAh
PSBkYXRhYmFzZSkKLSAgICAgICAgICAgIHJlc2VydmVkVGFza3MuYXBwZW5kKCppKTsKLSAgICB9
Ci0KLSAgICBtX3F1ZXVlLnN3YXAocmVzZXJ2ZWRUYXNrcyk7Ci19Ci0KLXZvaWQgRGF0YWJhc2VU
aHJlYWQ6OnJlY29yZERhdGFiYXNlT3BlbihEYXRhYmFzZSogZGF0YWJhc2UpCi17Ci0gICAgbm90
SW1wbGVtZW50ZWQoKTsKLX0KLQotdm9pZCBEYXRhYmFzZVRocmVhZDo6cmVjb3JkRGF0YWJhc2VD
bG9zZWQoRGF0YWJhc2UqIGRhdGFiYXNlKQotewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci19Ci0K
LX0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS93aW5jZS9EYXRh
YmFzZVRocmVhZFdpbmNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL3dpbmNlL0Rh
dGFiYXNlVGhyZWFkV2luY2UuaAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3N0b3JhZ2Uv
d2luY2UvRGF0YWJhc2VUaHJlYWRXaW5jZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDY1ICswLDAg
QEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6
Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRl
ZCBpbiB0aGUgaG9wZSB0aGF0IGkgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5Z
IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJD
SEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhl
IEdOVQotICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz
LgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7
IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAqICB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZs
b29yLAotICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICovCi0KLSNpZm5kZWYgRGF0
YWJhc2VUaHJlYWRXaW5jZV9oCi0jZGVmaW5lIERhdGFiYXNlVGhyZWFkV2luY2VfaAotCi0jaW5j
bHVkZSA8d3RmL0RlcXVlLmg+Ci0jaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KLQotbmFtZXNw
YWNlIFdlYkNvcmUgewotCi0gICAgY2xhc3MgRGF0YWJhc2U7Ci0gICAgY2xhc3MgRGF0YWJhc2VU
YXNrOwotCi0gICAgY2xhc3MgRGF0YWJhc2VUaHJlYWQ6IHB1YmxpYyBXVEY6OlJlZkNvdW50ZWQ8
RGF0YWJhc2VUaHJlYWQ+IHsKLQotICAgIHB1YmxpYzoKLSAgICAgICAgc3RhdGljIFBhc3NSZWZQ
dHI8RGF0YWJhc2VUaHJlYWQ+IGNyZWF0ZSgpIHsgcmV0dXJuIGFkb3B0UmVmKG5ldyBEYXRhYmFz
ZVRocmVhZCk7IH0KLSAgICAgICAgfkRhdGFiYXNlVGhyZWFkKCk7Ci0KLSAgICAgICAgYm9vbCBz
dGFydCgpIHsgcmV0dXJuIHRydWU7IH0KLSAgICAgICAgdm9pZCByZXF1ZXN0VGVybWluYXRpb24o
KTsKLSAgICAgICAgYm9vbCB0ZXJtaW5hdGlvblJlcXVlc3RlZCgpIGNvbnN0OwotCi0gICAgICAg
IHZvaWQgc2NoZWR1bGVUYXNrKFBhc3NSZWZQdHI8RGF0YWJhc2VUYXNrPik7Ci0gICAgICAgIHZv
aWQgc2NoZWR1bGVJbW1lZGlhdGVUYXNrKFBhc3NSZWZQdHI8RGF0YWJhc2VUYXNrPik7Ci0gICAg
ICAgIHZvaWQgdW5zY2hlZHVsZURhdGFiYXNlVGFza3MoRGF0YWJhc2UqKTsKLSAgICAgICAgdm9p
ZCByZWNvcmREYXRhYmFzZU9wZW4oRGF0YWJhc2UqKTsKLSAgICAgICAgdm9pZCByZWNvcmREYXRh
YmFzZUNsb3NlZChEYXRhYmFzZSopOwotI2lmbmRlZiBOREVCVUcKLSAgICAgICAgVGhyZWFkSWRl
bnRpZmllciBnZXRUaHJlYWRJRCgpIGNvbnN0IHsgcmV0dXJuIGN1cnJlbnRUaHJlYWQoKTsgfQot
I2VuZGlmCi0KLSAgICBwcml2YXRlOgotICAgICAgICBEYXRhYmFzZVRocmVhZCgpOwotCi0gICAg
ICAgIHZvaWQgdGltZXJGaXJlZChUaW1lcjxEYXRhYmFzZVRocmVhZD4qKTsKLQotICAgICAgICBE
ZXF1ZTxSZWZQdHI8RGF0YWJhc2VUYXNrPiA+IG1fcXVldWU7Ci0gICAgICAgIFRpbWVyPERhdGFi
YXNlVGhyZWFkPiBtX3RpbWVyOwotICAgIH07Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKLQot
I2VuZGlmIC8vIERhdGFiYXNlVGhyZWFkV2luY2UKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS93aW5j
ZS9Mb2NhbFN0b3JhZ2VUaHJlYWRXaW5DRS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9y
YWdlL3dpbmNlL0xvY2FsU3RvcmFnZVRocmVhZFdpbkNFLmNwcAkocmV2aXNpb24gNTcyODkpCShm
cm9tIFdlYkNvcmUvc3RvcmFnZS93aW5jZS9Mb2NhbFN0b3JhZ2VUaHJlYWRXaW5jZS5jcHA6NTcy
ODkpCisrKyBXZWJDb3JlL3N0b3JhZ2Uvd2luY2UvTG9jYWxTdG9yYWdlVGhyZWFkV2luQ0UuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDkgVG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGkgd2lsbCBi
ZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
CisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4g
IElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMu
LCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAt
MTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJMb2NhbFN0
b3JhZ2VUaHJlYWQuaCIKKworI2luY2x1ZGUgIkxvY2FsU3RvcmFnZVRhc2suaCIKKyNpbmNsdWRl
ICJTdG9yYWdlQXJlYVN5bmMuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitMb2NhbFN0b3Jh
Z2VUaHJlYWQ6OkxvY2FsU3RvcmFnZVRocmVhZCgpCis6IG1fdGltZXIodGhpcywgJkxvY2FsU3Rv
cmFnZVRocmVhZDo6dGltZXJGaXJlZCkKK3sKK30KKworTG9jYWxTdG9yYWdlVGhyZWFkOjp+TG9j
YWxTdG9yYWdlVGhyZWFkKCkKK3sKK30KKworYm9vbCBMb2NhbFN0b3JhZ2VUaHJlYWQ6OnN0YXJ0
KCkKK3sKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBMb2NhbFN0b3JhZ2VUaHJlYWQ6OnRp
bWVyRmlyZWQoVGltZXI8TG9jYWxTdG9yYWdlVGhyZWFkPiopCit7CisgICAgaWYgKCFtX3F1ZXVl
LmlzRW1wdHkoKSkgeworICAgICAgICBSZWZQdHI8TG9jYWxTdG9yYWdlVGFzaz4gdGFzayA9IG1f
cXVldWUuZmlyc3QoKTsKKyAgICAgICAgdGFzay0+cGVyZm9ybVRhc2soKTsKKyAgICAgICAgbV9x
dWV1ZS5yZW1vdmVGaXJzdCgpOworICAgICAgICBpZiAoIW1fcXVldWUuaXNFbXB0eSgpKQorICAg
ICAgICAgICAgbV90aW1lci5zdGFydE9uZVNob3QoMCk7CisgICAgfQorfQorCit2b2lkIExvY2Fs
U3RvcmFnZVRocmVhZDo6c2NoZWR1bGVJbXBvcnQoUGFzc1JlZlB0cjxTdG9yYWdlQXJlYVN5bmM+
IGFyZWEpCit7CisgICAgbV9xdWV1ZS5hcHBlbmQoTG9jYWxTdG9yYWdlVGFzazo6Y3JlYXRlSW1w
b3J0KGFyZWEpKTsKKyAgICBpZiAoIW1fdGltZXIuaXNBY3RpdmUoKSkKKyAgICAgICAgbV90aW1l
ci5zdGFydE9uZVNob3QoMCk7Cit9CisKK3ZvaWQgTG9jYWxTdG9yYWdlVGhyZWFkOjpzY2hlZHVs
ZVN5bmMoUGFzc1JlZlB0cjxTdG9yYWdlQXJlYVN5bmM+IGFyZWEpCit7CisgICAgbV9xdWV1ZS5h
cHBlbmQoTG9jYWxTdG9yYWdlVGFzazo6Y3JlYXRlU3luYyhhcmVhKSk7CisgICAgaWYgKCFtX3Rp
bWVyLmlzQWN0aXZlKCkpCisgICAgICAgIG1fdGltZXIuc3RhcnRPbmVTaG90KDApOworfQorCit2
b2lkIExvY2FsU3RvcmFnZVRocmVhZDo6dGVybWluYXRlKCkKK3sKKyAgICBtX3F1ZXVlLmNsZWFy
KCk7CisgICAgbV90aW1lci5zdG9wKCk7Cit9CisKK3ZvaWQgTG9jYWxTdG9yYWdlVGhyZWFkOjpw
ZXJmb3JtVGVybWluYXRlKCkKK3sKKyAgICBtX3F1ZXVlLmNsZWFyKCk7CisgICAgbV90aW1lci5z
dG9wKCk7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS93aW5jZS9Mb2NhbFN0b3JhZ2VU
aHJlYWRXaW5DRS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL3dpbmNlL0xvY2Fs
U3RvcmFnZVRocmVhZFdpbkNFLmNwcAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3N0b3Jh
Z2Uvd2luY2UvTG9jYWxTdG9yYWdlVGhyZWFkV2luQ0UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04
MCw0ICs4MCw0IEBAIHZvaWQgTG9jYWxTdG9yYWdlVGhyZWFkOjpwZXJmb3JtVGVybWluYXQKICAg
ICBtX3RpbWVyLnN0b3AoKTsKIH0KIAotfQorfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDog
V2ViQ29yZS9zdG9yYWdlL3dpbmNlL0xvY2FsU3RvcmFnZVRocmVhZFdpbkNFLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9zdG9yYWdlL3dpbmNlL0xvY2FsU3RvcmFnZVRocmVhZFdpbkNFLmgJKHJl
dmlzaW9uIDU3Mjg5KQkoZnJvbSBXZWJDb3JlL3N0b3JhZ2Uvd2luY2UvTG9jYWxTdG9yYWdlVGhy
ZWFkV2luY2UuaDo1NzI4OSkKKysrIFdlYkNvcmUvc3RvcmFnZS93aW5jZS9Mb2NhbFN0b3JhZ2VU
aHJlYWRXaW5DRS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0
aGF0IGkgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo
b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3Ig
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ug
c2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBD
T1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3Rv
biwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBMb2NhbFN0b3JhZ2VUaHJl
YWRXaW5jZV9oCisjZGVmaW5lIExvY2FsU3RvcmFnZVRocmVhZFdpbmNlX2gKKworI2luY2x1ZGUg
PHd0Zi9EZXF1ZS5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworICAgIGNsYXNzIFN0b3JhZ2VBcmVhU3luYzsKKyAgICBjbGFzcyBMb2NhbFN0
b3JhZ2VUYXNrOworCisgICAgY2xhc3MgTG9jYWxTdG9yYWdlVGhyZWFkIDogcHVibGljIFJlZkNv
dW50ZWQ8TG9jYWxTdG9yYWdlVGhyZWFkPiB7CisgICAgcHVibGljOgorICAgICAgICBzdGF0aWMg
UGFzc1JlZlB0cjxMb2NhbFN0b3JhZ2VUaHJlYWQ+IGNyZWF0ZSgpIHsgcmV0dXJuIGFkb3B0UmVm
KG5ldyBMb2NhbFN0b3JhZ2VUaHJlYWQpOyB9CisKKyAgICAgICAgfkxvY2FsU3RvcmFnZVRocmVh
ZCgpOworICAgICAgICBib29sIHN0YXJ0KCk7CisgICAgICAgIHZvaWQgc2NoZWR1bGVJbXBvcnQo
UGFzc1JlZlB0cjxTdG9yYWdlQXJlYVN5bmM+KTsKKyAgICAgICAgdm9pZCBzY2hlZHVsZVN5bmMo
UGFzc1JlZlB0cjxTdG9yYWdlQXJlYVN5bmM+KTsKKyAgICAgICAgdm9pZCB0ZXJtaW5hdGUoKTsK
KyAgICAgICAgdm9pZCBwZXJmb3JtVGVybWluYXRlKCk7CisKKyAgICBwcml2YXRlOgorICAgICAg
ICBMb2NhbFN0b3JhZ2VUaHJlYWQoKTsKKworICAgICAgICB2b2lkIHRpbWVyRmlyZWQoVGltZXI8
TG9jYWxTdG9yYWdlVGhyZWFkPiopOworCisgICAgICAgIERlcXVlPFJlZlB0cjxMb2NhbFN0b3Jh
Z2VUYXNrPiA+IG1fcXVldWU7CisgICAgICAgIFRpbWVyPExvY2FsU3RvcmFnZVRocmVhZD4gbV90
aW1lcjsKKyAgICB9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBMb2Nh
bFN0b3JhZ2VUaHJlYWRXaW5jZV9oCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2Uvd2luY2UvTG9jYWxT
dG9yYWdlVGhyZWFkV2luQ0UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2Uvd2luY2Uv
TG9jYWxTdG9yYWdlVGhyZWFkV2luQ0UuaAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3N0
b3JhZ2Uvd2luY2UvTG9jYWxTdG9yYWdlVGhyZWFkV2luQ0UuaAkod29ya2luZyBjb3B5KQpAQCAt
MjIsOCArMjIsOCBAQAogICovCiAKIAotI2lmbmRlZiBMb2NhbFN0b3JhZ2VUaHJlYWRXaW5jZV9o
Ci0jZGVmaW5lIExvY2FsU3RvcmFnZVRocmVhZFdpbmNlX2gKKyNpZm5kZWYgTG9jYWxTdG9yYWdl
VGhyZWFkV2luQ0VfaAorI2RlZmluZSBMb2NhbFN0b3JhZ2VUaHJlYWRXaW5DRV9oCiAKICNpbmNs
dWRlIDx3dGYvRGVxdWUuaD4KICNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgpAQCAtNTUsNCAr
NTUsNCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAot
I2VuZGlmIC8vIExvY2FsU3RvcmFnZVRocmVhZFdpbmNlX2gKKyNlbmRpZiAvLyBMb2NhbFN0b3Jh
Z2VUaHJlYWRXaW5DRV9oCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2Uvd2luY2UvTG9jYWxTdG9yYWdl
VGhyZWFkV2luY2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS93aW5jZS9Mb2Nh
bFN0b3JhZ2VUaHJlYWRXaW5jZS5jcHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9zdG9y
YWdlL3dpbmNlL0xvY2FsU3RvcmFnZVRocmVhZFdpbmNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSwgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0g
KiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqICBUaGlzIGxpYnJhcnkgaXMg
ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpIHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBX
SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m
Ci0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
LiAgU2VlIHRoZSBHTlUKLSAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhp
cyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0g
KiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0
LCBGaWZ0aCBGbG9vciwKLSAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0j
aW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiTG9jYWxTdG9yYWdlVGhyZWFkLmgiCi0KLSNp
bmNsdWRlICJMb2NhbFN0b3JhZ2VUYXNrLmgiCi0jaW5jbHVkZSAiU3RvcmFnZUFyZWFTeW5jLmgi
Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotTG9jYWxTdG9yYWdlVGhyZWFkOjpMb2NhbFN0b3Jh
Z2VUaHJlYWQoKQotOiBtX3RpbWVyKHRoaXMsICZMb2NhbFN0b3JhZ2VUaHJlYWQ6OnRpbWVyRmly
ZWQpCi17Ci19Ci0KLUxvY2FsU3RvcmFnZVRocmVhZDo6fkxvY2FsU3RvcmFnZVRocmVhZCgpCi17
Ci19Ci0KLWJvb2wgTG9jYWxTdG9yYWdlVGhyZWFkOjpzdGFydCgpCi17Ci0gICAgcmV0dXJuIHRy
dWU7Ci19Ci0KLXZvaWQgTG9jYWxTdG9yYWdlVGhyZWFkOjp0aW1lckZpcmVkKFRpbWVyPExvY2Fs
U3RvcmFnZVRocmVhZD4qKQotewotICAgIGlmICghbV9xdWV1ZS5pc0VtcHR5KCkpIHsKLSAgICAg
ICAgUmVmUHRyPExvY2FsU3RvcmFnZVRhc2s+IHRhc2sgPSBtX3F1ZXVlLmZpcnN0KCk7Ci0gICAg
ICAgIHRhc2stPnBlcmZvcm1UYXNrKCk7Ci0gICAgICAgIG1fcXVldWUucmVtb3ZlRmlyc3QoKTsK
LSAgICAgICAgaWYgKCFtX3F1ZXVlLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIG1fdGltZXIuc3Rh
cnRPbmVTaG90KDApOwotICAgIH0KLX0KLQotdm9pZCBMb2NhbFN0b3JhZ2VUaHJlYWQ6OnNjaGVk
dWxlSW1wb3J0KFBhc3NSZWZQdHI8U3RvcmFnZUFyZWFTeW5jPiBhcmVhKQotewotICAgIG1fcXVl
dWUuYXBwZW5kKExvY2FsU3RvcmFnZVRhc2s6OmNyZWF0ZUltcG9ydChhcmVhKSk7Ci0gICAgaWYg
KCFtX3RpbWVyLmlzQWN0aXZlKCkpCi0gICAgICAgIG1fdGltZXIuc3RhcnRPbmVTaG90KDApOwot
fQotCi12b2lkIExvY2FsU3RvcmFnZVRocmVhZDo6c2NoZWR1bGVTeW5jKFBhc3NSZWZQdHI8U3Rv
cmFnZUFyZWFTeW5jPiBhcmVhKQotewotICAgIG1fcXVldWUuYXBwZW5kKExvY2FsU3RvcmFnZVRh
c2s6OmNyZWF0ZVN5bmMoYXJlYSkpOwotICAgIGlmICghbV90aW1lci5pc0FjdGl2ZSgpKQotICAg
ICAgICBtX3RpbWVyLnN0YXJ0T25lU2hvdCgwKTsKLX0KLQotdm9pZCBMb2NhbFN0b3JhZ2VUaHJl
YWQ6OnRlcm1pbmF0ZSgpCi17Ci0gICAgbV9xdWV1ZS5jbGVhcigpOwotICAgIG1fdGltZXIuc3Rv
cCgpOwotfQotCi12b2lkIExvY2FsU3RvcmFnZVRocmVhZDo6cGVyZm9ybVRlcm1pbmF0ZSgpCi17
Ci0gICAgbV9xdWV1ZS5jbGVhcigpOwotICAgIG1fdGltZXIuc3RvcCgpOwotfQotCi19CkluZGV4
OiBXZWJDb3JlL3N0b3JhZ2Uvd2luY2UvTG9jYWxTdG9yYWdlVGhyZWFkV2luY2UuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2Uvd2luY2UvTG9jYWxTdG9yYWdlVGhyZWFkV2luY2UuaAko
cmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3N0b3JhZ2Uvd2luY2UvTG9jYWxTdG9yYWdlVGhy
ZWFkV2luY2UuaAkod29ya2luZyBjb3B5KQpAQCAtMSw1OCArMCwwIEBACi0vKgotICogQ29weXJp
Z2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoK
LSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgotICoKLSAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh
dCBpIHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91
dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqICBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNo
b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09Q
WUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqICBCb3N0b24s
IE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0KLSNpZm5kZWYgTG9jYWxTdG9yYWdlVGhyZWFk
V2luY2VfaAotI2RlZmluZSBMb2NhbFN0b3JhZ2VUaHJlYWRXaW5jZV9oCi0KLSNpbmNsdWRlIDx3
dGYvRGVxdWUuaD4KLSNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgotCi1uYW1lc3BhY2UgV2Vi
Q29yZSB7Ci0KLSAgICBjbGFzcyBTdG9yYWdlQXJlYVN5bmM7Ci0gICAgY2xhc3MgTG9jYWxTdG9y
YWdlVGFzazsKLQotICAgIGNsYXNzIExvY2FsU3RvcmFnZVRocmVhZCA6IHB1YmxpYyBSZWZDb3Vu
dGVkPExvY2FsU3RvcmFnZVRocmVhZD4gewotICAgIHB1YmxpYzoKLSAgICAgICAgc3RhdGljIFBh
c3NSZWZQdHI8TG9jYWxTdG9yYWdlVGhyZWFkPiBjcmVhdGUoKSB7IHJldHVybiBhZG9wdFJlZihu
ZXcgTG9jYWxTdG9yYWdlVGhyZWFkKTsgfQotCi0gICAgICAgIH5Mb2NhbFN0b3JhZ2VUaHJlYWQo
KTsKLSAgICAgICAgYm9vbCBzdGFydCgpOwotICAgICAgICB2b2lkIHNjaGVkdWxlSW1wb3J0KFBh
c3NSZWZQdHI8U3RvcmFnZUFyZWFTeW5jPik7Ci0gICAgICAgIHZvaWQgc2NoZWR1bGVTeW5jKFBh
c3NSZWZQdHI8U3RvcmFnZUFyZWFTeW5jPik7Ci0gICAgICAgIHZvaWQgdGVybWluYXRlKCk7Ci0g
ICAgICAgIHZvaWQgcGVyZm9ybVRlcm1pbmF0ZSgpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAg
TG9jYWxTdG9yYWdlVGhyZWFkKCk7Ci0KLSAgICAgICAgdm9pZCB0aW1lckZpcmVkKFRpbWVyPExv
Y2FsU3RvcmFnZVRocmVhZD4qKTsKLQotICAgICAgICBEZXF1ZTxSZWZQdHI8TG9jYWxTdG9yYWdl
VGFzaz4gPiBtX3F1ZXVlOwotICAgICAgICBUaW1lcjxMb2NhbFN0b3JhZ2VUaHJlYWQ+IG1fdGlt
ZXI7Ci0gICAgfTsKLQotfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQotCi0jZW5kaWYgLy8gTG9jYWxT
dG9yYWdlVGhyZWFkV2luY2VfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>52907</attachid>
            <date>2010-04-08 15:55:19 -0700</date>
            <delta_ts>2010-09-18 13:45:22 -0700</delta_ts>
            <desc>The patch - part 1 (JSC/WTF)</desc>
            <filename>bug-37287-JSC.patch</filename>
            <type>text/plain</type>
            <size>45558</size>
            <attacher name="Patrick R. Gansterer">paroga</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDU3Mjg5KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTggQEAKKzIwMTAtMDQtMDggIFBhdHJpY2sg
R2Fuc3RlcmVyICA8cGFyb2dhQHBhcm9nYS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgUmVuYW1lIFdpbmNlIGZpbGVzIHRvIFdpbkNFLgorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzcyODcKKworICAg
ICAgICAqIHd0Zi91bmljb2RlL1VuaWNvZGUuaDoKKyAgICAgICAgKiB3dGYvdW5pY29kZS93aW5j
ZS9Vbmljb2RlV2luQ0UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiB3dGYvdW5pY29kZS93aW5jZS9V
bmljb2RlV2luQ0UuaDogQWRkZWQuCisgICAgICAgICogd3RmL3VuaWNvZGUvd2luY2UvVW5pY29k
ZVdpbmNlLmNwcDogUmVtb3ZlZC4KKyAgICAgICAgKiB3dGYvdW5pY29kZS93aW5jZS9Vbmljb2Rl
V2luY2UuaDogUmVtb3ZlZC4KKyAgICAgICAgKiB3dGYvd2luY2UvRmFzdE1hbGxvY1dpbkNFLmg6
IEFkZGVkLgorICAgICAgICAqIHd0Zi93aW5jZS9GYXN0TWFsbG9jV2luY2UuaDogUmVtb3ZlZC4K
KwogMjAxMC0wNC0wOCAgS3dhbmcgWXVsIFNlbyAgPHNreXVsQGNvbXBhbnkxMDAubmV0PgogCiAg
ICAgICAgIFJldmlld2VkIGJ5IFNpbW9uIEhhdXNtYW5uLgpJbmRleDogSmF2YVNjcmlwdENvcmUv
d3RmL3VuaWNvZGUvVW5pY29kZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3d0Zi91
bmljb2RlL1VuaWNvZGUuaAkocmV2aXNpb24gNTcyODkpCisrKyBKYXZhU2NyaXB0Q29yZS93dGYv
dW5pY29kZS9Vbmljb2RlLmgJKHdvcmtpbmcgY29weSkKQEAgLTMyLDcgKzMyLDcgQEAKICNlbGlm
IFVTRShHTElCX1VOSUNPREUpCiAjaW5jbHVkZSA8d3RmL3VuaWNvZGUvZ2xpYi9Vbmljb2RlR0xp
Yi5oPgogI2VsaWYgVVNFKFdJTkNFX1VOSUNPREUpCi0jaW5jbHVkZSA8d3RmL3VuaWNvZGUvd2lu
Y2UvVW5pY29kZVdpbmNlLmg+CisjaW5jbHVkZSA8d3RmL3VuaWNvZGUvd2luY2UvVW5pY29kZVdp
bkNFLmg+CiAjZWxzZQogI2Vycm9yICJVbmtub3duIFVuaWNvZGUgaW1wbGVtZW50YXRpb24iCiAj
ZW5kaWYKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi91bmljb2RlL3dpbmNlL1VuaWNvZGVXaW5D
RS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvd3RmL3VuaWNvZGUvd2luY2UvVW5p
Y29kZVdpbkNFLmNwcAkocmV2aXNpb24gNTcyODkpCShmcm9tIEphdmFTY3JpcHRDb3JlL3d0Zi91
bmljb2RlL3dpbmNlL1VuaWNvZGVXaW5jZS5jcHA6NTcyODkpCisrKyBKYXZhU2NyaXB0Q29yZS93
dGYvdW5pY29kZS93aW5jZS9Vbmljb2RlV2luQ0UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsMTc2IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwNiBHZW9yZ2UgU3RhaWtvcyA8c3Rh
aWtvc0BrZGUub3JnPgorICogIENvcHlyaWdodCAoQykgMjAwNiBBbGV4ZXkgUHJvc2t1cnlha292
IDxhcEBueXBvcC5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxl
LCBJbmMuCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl
ZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg
KiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi
ZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
CisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4g
IElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMu
LCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAt
MTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJVbmljb2Rl
V2luY2UuaCIKKworI2luY2x1ZGUgPHdjaGFyLmg+CisKK25hbWVzcGFjZSBXVEYgeworbmFtZXNw
YWNlIFVuaWNvZGUgeworCit3Y2hhcl90IHRvTG93ZXIod2NoYXJfdCBjKQoreworICAgIHJldHVy
biB0b3dsb3dlcihjKTsKK30KKword2NoYXJfdCB0b1VwcGVyKHdjaGFyX3QgYykKK3sKKyAgICBy
ZXR1cm4gdG93dXBwZXIoYyk7Cit9CisKK3djaGFyX3QgZm9sZENhc2Uod2NoYXJfdCBjKQorewor
ICAgIHJldHVybiB0b3dsb3dlcihjKTsKK30KKworYm9vbCBpc1ByaW50YWJsZUNoYXIod2NoYXJf
dCBjKQoreworICAgIHJldHVybiAhIWlzd3ByaW50KGMpOworfQorCitib29sIGlzU3BhY2Uod2No
YXJfdCBjKQoreworICAgIHJldHVybiAhIWlzd3NwYWNlKGMpOworfQorCitib29sIGlzTGV0dGVy
KHdjaGFyX3QgYykKK3sKKyAgICByZXR1cm4gISFpc3dhbHBoYShjKTsKK30KKworYm9vbCBpc1Vw
cGVyKHdjaGFyX3QgYykKK3sKKyAgICByZXR1cm4gISFpc3d1cHBlcihjKTsKK30KKworYm9vbCBp
c0xvd2VyKHdjaGFyX3QgYykKK3sKKyAgICByZXR1cm4gISFpc3dsb3dlcihjKTsKK30KKworYm9v
bCBpc0RpZ2l0KHdjaGFyX3QgYykKK3sKKyAgICByZXR1cm4gISFpc3dkaWdpdChjKTsKK30KKwor
Ym9vbCBpc1B1bmN0KHdjaGFyX3QgYykKK3sKKyAgICByZXR1cm4gISFpc3dwdW5jdChjKTsKK30K
KworaW50IHRvTG93ZXIod2NoYXJfdCogcmVzdWx0LCBpbnQgcmVzdWx0TGVuZ3RoLCBjb25zdCB3
Y2hhcl90KiBzb3VyY2UsIGludCBzb3VyY2VMZW5ndGgsIGJvb2wqIGlzRXJyb3IpCit7CisgICAg
Y29uc3QgVUNoYXIqIHNvdXJjZUl0ZXJhdG9yID0gc291cmNlOworICAgIGNvbnN0IFVDaGFyKiBz
b3VyY2VFbmQgPSBzb3VyY2UgKyBzb3VyY2VMZW5ndGg7CisgICAgVUNoYXIqIHJlc3VsdEl0ZXJh
dG9yID0gcmVzdWx0OworICAgIFVDaGFyKiByZXN1bHRFbmQgPSByZXN1bHQgKyByZXN1bHRMZW5n
dGg7CisKKyAgICBpbnQgcmVtYWluaW5nQ2hhcmFjdGVycyA9IDA7CisgICAgaWYgKHNvdXJjZUxl
bmd0aCA8PSByZXN1bHRMZW5ndGgpCisgICAgICAgIHdoaWxlIChzb3VyY2VJdGVyYXRvciA8IHNv
dXJjZUVuZCkKKyAgICAgICAgICAgICpyZXN1bHRJdGVyYXRvcisrID0gdG93bG93ZXIoKnNvdXJj
ZUl0ZXJhdG9yKyspOworICAgIGVsc2UKKyAgICAgICAgd2hpbGUgKHJlc3VsdEl0ZXJhdG9yIDwg
cmVzdWx0RW5kKQorICAgICAgICAgICAgKnJlc3VsdEl0ZXJhdG9yKysgPSB0b3dsb3dlcigqc291
cmNlSXRlcmF0b3IrKyk7CisKKyAgICBpZiAoc291cmNlSXRlcmF0b3IgPCBzb3VyY2VFbmQpCisg
ICAgICAgIHJlbWFpbmluZ0NoYXJhY3RlcnMgKz0gc291cmNlRW5kIC0gc291cmNlSXRlcmF0b3I7
CisgICAgKmlzRXJyb3IgPSAocmVtYWluaW5nQ2hhcmFjdGVycyAhPSAwKTsKKyAgICBpZiAocmVz
dWx0SXRlcmF0b3IgPCByZXN1bHRFbmQpCisgICAgICAgICpyZXN1bHRJdGVyYXRvciA9IDA7CisK
KyAgICByZXR1cm4gKHJlc3VsdEl0ZXJhdG9yIC0gcmVzdWx0KSArIHJlbWFpbmluZ0NoYXJhY3Rl
cnM7Cit9CisKK2ludCB0b1VwcGVyKHdjaGFyX3QqIHJlc3VsdCwgaW50IHJlc3VsdExlbmd0aCwg
Y29uc3Qgd2NoYXJfdCogc291cmNlLCBpbnQgc291cmNlTGVuZ3RoLCBib29sKiBpc0Vycm9yKQor
eworICAgIGNvbnN0IFVDaGFyKiBzb3VyY2VJdGVyYXRvciA9IHNvdXJjZTsKKyAgICBjb25zdCBV
Q2hhciogc291cmNlRW5kID0gc291cmNlICsgc291cmNlTGVuZ3RoOworICAgIFVDaGFyKiByZXN1
bHRJdGVyYXRvciA9IHJlc3VsdDsKKyAgICBVQ2hhciogcmVzdWx0RW5kID0gcmVzdWx0ICsgcmVz
dWx0TGVuZ3RoOworCisgICAgaW50IHJlbWFpbmluZ0NoYXJhY3RlcnMgPSAwOworICAgIGlmIChz
b3VyY2VMZW5ndGggPD0gcmVzdWx0TGVuZ3RoKQorICAgICAgICB3aGlsZSAoc291cmNlSXRlcmF0
b3IgPCBzb3VyY2VFbmQpCisgICAgICAgICAgICAqcmVzdWx0SXRlcmF0b3IrKyA9IHRvd3VwcGVy
KCpzb3VyY2VJdGVyYXRvcisrKTsKKyAgICBlbHNlCisgICAgICAgIHdoaWxlIChyZXN1bHRJdGVy
YXRvciA8IHJlc3VsdEVuZCkKKyAgICAgICAgICAgICpyZXN1bHRJdGVyYXRvcisrID0gdG93dXBw
ZXIoKnNvdXJjZUl0ZXJhdG9yKyspOworCisgICAgaWYgKHNvdXJjZUl0ZXJhdG9yIDwgc291cmNl
RW5kKQorICAgICAgICByZW1haW5pbmdDaGFyYWN0ZXJzICs9IHNvdXJjZUVuZCAtIHNvdXJjZUl0
ZXJhdG9yOworICAgICppc0Vycm9yID0gKHJlbWFpbmluZ0NoYXJhY3RlcnMgIT0gMCk7CisgICAg
aWYgKHJlc3VsdEl0ZXJhdG9yIDwgcmVzdWx0RW5kKQorICAgICAgICAqcmVzdWx0SXRlcmF0b3Ig
PSAwOworCisgICAgcmV0dXJuIChyZXN1bHRJdGVyYXRvciAtIHJlc3VsdCkgKyByZW1haW5pbmdD
aGFyYWN0ZXJzOworfQorCitpbnQgZm9sZENhc2Uod2NoYXJfdCogcmVzdWx0LCBpbnQgcmVzdWx0
TGVuZ3RoLCBjb25zdCB3Y2hhcl90KiBzb3VyY2UsIGludCBzb3VyY2VMZW5ndGgsIGJvb2wqIGlz
RXJyb3IpCit7CisgICAgKmlzRXJyb3IgPSBmYWxzZTsKKyAgICBpZiAocmVzdWx0TGVuZ3RoIDwg
c291cmNlTGVuZ3RoKSB7CisgICAgICAgICppc0Vycm9yID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJu
IHNvdXJjZUxlbmd0aDsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VMZW5n
dGg7ICsraSkKKyAgICAgICAgcmVzdWx0W2ldID0gZm9sZENhc2Uoc291cmNlW2ldKTsKKyAgICBy
ZXR1cm4gc291cmNlTGVuZ3RoOworfQorCit3Y2hhcl90IHRvVGl0bGVDYXNlKHdjaGFyX3QgYykK
K3sKKyAgICByZXR1cm4gdG93dXBwZXIoYyk7Cit9CisKK0RpcmVjdGlvbiBkaXJlY3Rpb24oVUNo
YXIzMiBjKQoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxEaXJlY3Rpb24+KFVuaWNvZGVDRTo6
ZGlyZWN0aW9uKGMpKTsKK30KKworQ2hhckNhdGVnb3J5IGNhdGVnb3J5KHVuc2lnbmVkIGludCBj
KQoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxDaGFyQ2F0ZWdvcnk+KFRPX01BU0soKF9faW50
OCkgVW5pY29kZUNFOjpjYXRlZ29yeShjKSkpOworfQorCitEZWNvbXBvc2l0aW9uVHlwZSBkZWNv
bXBvc2l0aW9uVHlwZShVQ2hhcjMyIGMpCit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PERlY29t
cG9zaXRpb25UeXBlPihVbmljb2RlQ0U6OmRlY29tcG9zaXRpb25UeXBlKGMpKTsKK30KKwordW5z
aWduZWQgY2hhciBjb21iaW5pbmdDbGFzcyhVQ2hhcjMyIGMpCit7CisgICAgcmV0dXJuIFVuaWNv
ZGVDRTo6Y29tYmluaW5nQ2xhc3MoYyk7Cit9CisKK3djaGFyX3QgbWlycm9yZWRDaGFyKFVDaGFy
MzIgYykKK3sKKyAgICByZXR1cm4gVW5pY29kZUNFOjptaXJyb3JlZENoYXIoYyk7Cit9CisKK2lu
dCBkaWdpdFZhbHVlKHdjaGFyX3QgYykKK3sKKyAgICByZXR1cm4gVW5pY29kZUNFOjpkaWdpdFZh
bHVlKGMpOworfQorCit9IC8vIG5hbWVzcGFjZSBVbmljb2RlCit9IC8vIG5hbWVzcGFjZSBXVEYK
SW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi91bmljb2RlL3dpbmNlL1VuaWNvZGVXaW5DRS5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvd3RmL3VuaWNvZGUvd2luY2UvVW5pY29kZVdp
bkNFLmNwcAkocmV2aXNpb24gNTcyODkpCisrKyBKYXZhU2NyaXB0Q29yZS93dGYvdW5pY29kZS93
aW5jZS9Vbmljb2RlV2luQ0UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMCw3ICsyMCw3IEBACiAg
Ki8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlVuaWNvZGVXaW5jZS5oIgorI2lu
Y2x1ZGUgIlVuaWNvZGVXaW5DRS5oIgogCiAjaW5jbHVkZSA8d2NoYXIuaD4KIApJbmRleDogSmF2
YVNjcmlwdENvcmUvd3RmL3VuaWNvZGUvd2luY2UvVW5pY29kZVdpbkNFLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gSmF2YVNjcmlwdENvcmUvd3RmL3VuaWNvZGUvd2luY2UvVW5pY29kZVdpbkNFLmgJKHJldmlz
aW9uIDU3Mjg5KQkoZnJvbSBKYXZhU2NyaXB0Q29yZS93dGYvdW5pY29kZS93aW5jZS9Vbmljb2Rl
V2luY2UuaDo1NzI4OSkKKysrIEphdmFTY3JpcHRDb3JlL3d0Zi91bmljb2RlL3dpbmNlL1VuaWNv
ZGVXaW5DRS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogIENvcHly
aWdodCAoQykgMjAwNiBHZW9yZ2UgU3RhaWtvcyA8c3RhaWtvc0BrZGUub3JnPgorICogIENvcHly
aWdodCAoQykgMjAwNiBBbGV4ZXkgUHJvc2t1cnlha292IDxhcEBueXBvcC5jb20+CisgKiAgQ29w
eXJpZ2h0IChDKSAyMDA3IEFwcGxlIENvbXB1dGVyLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICog
IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3Ig
KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5
IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAg
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm
b3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0
aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUg
dG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBT
dHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoK
KyAqLworCisjaWZuZGVmIFVOSUNPREVfV0lOQ0VfSAorI2RlZmluZSBVTklDT0RFX1dJTkNFX0gK
KworI2luY2x1ZGUgImNlX3VuaWNvZGUuaCIKKworI2RlZmluZSBUT19NQVNLKHgpICgxIDw8ICh4
KSkKKworLy8gc29tZSBkZWZpbmVzIGZyb20gSUNVIG5lZWRlZCBvbmUgb3IgdHdvIHBsYWNlcwor
CisjZGVmaW5lIFUxNl9JU19MRUFEKGMpICgoKGMpICYgMHhmZmZmZmMwMCkgPT0gMHhkODAwKQor
I2RlZmluZSBVMTZfSVNfVFJBSUwoYykgKCgoYykgJiAweGZmZmZmYzAwKSA9PSAweGRjMDApCisj
ZGVmaW5lIFUxNl9TVVJST0dBVEVfT0ZGU0VUICgoMHhkODAwIDw8IDEwVUwpICsgMHhkYzAwIC0g
MHgxMDAwMCkKKyNkZWZpbmUgVTE2X0dFVF9TVVBQTEVNRU5UQVJZKGxlYWQsIHRyYWlsKSBcCisg
ICAgKCgoVUNoYXIzMikobGVhZCkgPDwgMTBVTCkgKyAoVUNoYXIzMikodHJhaWwpIC0gVTE2X1NV
UlJPR0FURV9PRkZTRVQpCisKKyNkZWZpbmUgVTE2X0xFQUQoc3VwcGxlbWVudGFyeSkgKFVDaGFy
KSgoKHN1cHBsZW1lbnRhcnkpID4+IDEwKSArIDB4ZDdjMCkKKyNkZWZpbmUgVTE2X1RSQUlMKHN1
cHBsZW1lbnRhcnkpIChVQ2hhcikoKChzdXBwbGVtZW50YXJ5KSAmIDB4M2ZmKSB8IDB4ZGMwMCkK
KworI2RlZmluZSBVX0lTX1NVUlJPR0FURShjKSAoKChjKSAmIDB4ZmZmZmY4MDApID09IDB4ZDgw
MCkKKyNkZWZpbmUgVTE2X0lTX1NVUlJPR0FURShjKSBVX0lTX1NVUlJPR0FURShjKQorI2RlZmlu
ZSBVMTZfSVNfU1VSUk9HQVRFX0xFQUQoYykgKCgoYykgJiAweDQwMCkgPT0gMCkKKworI2RlZmlu
ZSBVMTZfTkVYVChzLCBpLCBsZW5ndGgsIGMpIHsgXAorICAgIChjKT0ocylbKGkpKytdOyBcCisg
ICAgaWYgKFUxNl9JU19MRUFEKGMpKSB7IFwKKyAgICAgICAgdWludDE2X3QgX19jMjsgXAorICAg
ICAgICBpZiAoKGkpIDwgKGxlbmd0aCkgJiYgVTE2X0lTX1RSQUlMKF9fYzIgPSAocylbKGkpXSkp
IHsgXAorICAgICAgICAgICAgKysoaSk7IFwKKyAgICAgICAgICAgIChjKSA9IFUxNl9HRVRfU1VQ
UExFTUVOVEFSWSgoYyksIF9fYzIpOyBcCisgICAgICAgIH0gXAorICAgIH0gXAorfQorCisjZGVm
aW5lIFUxNl9QUkVWKHMsIHN0YXJ0LCBpLCBjKSB7IFwKKyAgICAoYyk9KHMpWy0tKGkpXTsgXAor
ICAgIGlmIChVMTZfSVNfVFJBSUwoYykpIHsgXAorICAgICAgICB1aW50MTZfdCBfX2MyOyBcCisg
ICAgICAgIGlmICgoaSkgPiAoc3RhcnQpICYmIFUxNl9JU19MRUFEKF9fYzIgPSAocylbKGkpIC0g
MV0pKSB7IFwKKyAgICAgICAgICAgIC0tKGkpOyBcCisgICAgICAgICAgICAoYykgPSBVMTZfR0VU
X1NVUFBMRU1FTlRBUlkoX19jMiwgKGMpKTsgXAorICAgICAgICB9IFwKKyAgICB9IFwKK30KKwor
I2RlZmluZSBVMTZfSVNfU0lOR0xFKGMpICFVX0lTX1NVUlJPR0FURShjKQorCituYW1lc3BhY2Ug
V1RGIHsKKworICAgIG5hbWVzcGFjZSBVbmljb2RlIHsKKworICAgICAgICBlbnVtIERpcmVjdGlv
biB7CisgICAgICAgICAgICBMZWZ0VG9SaWdodCA9IFVuaWNvZGVDRTo6VV9MRUZUX1RPX1JJR0hU
LAorICAgICAgICAgICAgUmlnaHRUb0xlZnQgPSBVbmljb2RlQ0U6OlVfUklHSFRfVE9fTEVGVCwK
KyAgICAgICAgICAgIEV1cm9wZWFuTnVtYmVyID0gVW5pY29kZUNFOjpVX0VVUk9QRUFOX05VTUJF
UiwKKyAgICAgICAgICAgIEV1cm9wZWFuTnVtYmVyU2VwYXJhdG9yID0gVW5pY29kZUNFOjpVX0VV
Uk9QRUFOX05VTUJFUl9TRVBBUkFUT1IsCisgICAgICAgICAgICBFdXJvcGVhbk51bWJlclRlcm1p
bmF0b3IgPSBVbmljb2RlQ0U6OlVfRVVST1BFQU5fTlVNQkVSX1RFUk1JTkFUT1IsCisgICAgICAg
ICAgICBBcmFiaWNOdW1iZXIgPSBVbmljb2RlQ0U6OlVfQVJBQklDX05VTUJFUiwKKyAgICAgICAg
ICAgIENvbW1vbk51bWJlclNlcGFyYXRvciA9IFVuaWNvZGVDRTo6VV9DT01NT05fTlVNQkVSX1NF
UEFSQVRPUiwKKyAgICAgICAgICAgIEJsb2NrU2VwYXJhdG9yID0gVW5pY29kZUNFOjpVX0JMT0NL
X1NFUEFSQVRPUiwKKyAgICAgICAgICAgIFNlZ21lbnRTZXBhcmF0b3IgPSBVbmljb2RlQ0U6OlVf
U0VHTUVOVF9TRVBBUkFUT1IsCisgICAgICAgICAgICBXaGl0ZVNwYWNlTmV1dHJhbCA9IFVuaWNv
ZGVDRTo6VV9XSElURV9TUEFDRV9ORVVUUkFMLAorICAgICAgICAgICAgT3RoZXJOZXV0cmFsID0g
VW5pY29kZUNFOjpVX09USEVSX05FVVRSQUwsCisgICAgICAgICAgICBMZWZ0VG9SaWdodEVtYmVk
ZGluZyA9IFVuaWNvZGVDRTo6VV9MRUZUX1RPX1JJR0hUX0VNQkVERElORywKKyAgICAgICAgICAg
IExlZnRUb1JpZ2h0T3ZlcnJpZGUgPSBVbmljb2RlQ0U6OlVfTEVGVF9UT19SSUdIVF9PVkVSUklE
RSwKKyAgICAgICAgICAgIFJpZ2h0VG9MZWZ0QXJhYmljID0gVW5pY29kZUNFOjpVX1JJR0hUX1RP
X0xFRlRfQVJBQklDLAorICAgICAgICAgICAgUmlnaHRUb0xlZnRFbWJlZGRpbmcgPSBVbmljb2Rl
Q0U6OlVfUklHSFRfVE9fTEVGVF9FTUJFRERJTkcsCisgICAgICAgICAgICBSaWdodFRvTGVmdE92
ZXJyaWRlID0gVW5pY29kZUNFOjpVX1JJR0hUX1RPX0xFRlRfT1ZFUlJJREUsCisgICAgICAgICAg
ICBQb3BEaXJlY3Rpb25hbEZvcm1hdCA9IFVuaWNvZGVDRTo6VV9QT1BfRElSRUNUSU9OQUxfRk9S
TUFULAorICAgICAgICAgICAgTm9uU3BhY2luZ01hcmsgPSBVbmljb2RlQ0U6OlVfRElSX05PTl9T
UEFDSU5HX01BUkssCisgICAgICAgICAgICBCb3VuZGFyeU5ldXRyYWwgPSBVbmljb2RlQ0U6OlVf
Qk9VTkRBUllfTkVVVFJBTAorICAgICAgICB9OworCisgICAgICAgIGVudW0gRGVjb21wb3NpdGlv
blR5cGUgeworICAgICAgICAgIERlY29tcG9zaXRpb25Ob25lID0gVW5pY29kZUNFOjpVX0RUX05P
TkUsCisgICAgICAgICAgRGVjb21wb3NpdGlvbkNhbm9uaWNhbCA9IFVuaWNvZGVDRTo6VV9EVF9D
QU5PTklDQUwsCisgICAgICAgICAgRGVjb21wb3NpdGlvbkNvbXBhdCA9IFVuaWNvZGVDRTo6VV9E
VF9DT01QQVQsCisgICAgICAgICAgRGVjb21wb3NpdGlvbkNpcmNsZSA9IFVuaWNvZGVDRTo6VV9E
VF9DSVJDTEUsCisgICAgICAgICAgRGVjb21wb3NpdGlvbkZpbmFsID0gVW5pY29kZUNFOjpVX0RU
X0ZJTkFMLAorICAgICAgICAgIERlY29tcG9zaXRpb25Gb250ID0gVW5pY29kZUNFOjpVX0RUX0ZP
TlQsCisgICAgICAgICAgRGVjb21wb3NpdGlvbkZyYWN0aW9uID0gVW5pY29kZUNFOjpVX0RUX0ZS
QUNUSU9OLAorICAgICAgICAgIERlY29tcG9zaXRpb25Jbml0aWFsID0gVW5pY29kZUNFOjpVX0RU
X0lOSVRJQUwsCisgICAgICAgICAgRGVjb21wb3NpdGlvbklzb2xhdGVkID0gVW5pY29kZUNFOjpV
X0RUX0lTT0xBVEVELAorICAgICAgICAgIERlY29tcG9zaXRpb25NZWRpYWwgPSBVbmljb2RlQ0U6
OlVfRFRfTUVESUFMLAorICAgICAgICAgIERlY29tcG9zaXRpb25OYXJyb3cgPSBVbmljb2RlQ0U6
OlVfRFRfTkFSUk9XLAorICAgICAgICAgIERlY29tcG9zaXRpb25Ob0JyZWFrID0gVW5pY29kZUNF
OjpVX0RUX05PQlJFQUssCisgICAgICAgICAgRGVjb21wb3NpdGlvblNtYWxsID0gVW5pY29kZUNF
OjpVX0RUX1NNQUxMLAorICAgICAgICAgIERlY29tcG9zaXRpb25TcXVhcmUgPSBVbmljb2RlQ0U6
OlVfRFRfU1FVQVJFLAorICAgICAgICAgIERlY29tcG9zaXRpb25TdWIgPSBVbmljb2RlQ0U6OlVf
RFRfU1VCLAorICAgICAgICAgIERlY29tcG9zaXRpb25TdXBlciA9IFVuaWNvZGVDRTo6VV9EVF9T
VVBFUiwKKyAgICAgICAgICBEZWNvbXBvc2l0aW9uVmVydGljYWwgPSBVbmljb2RlQ0U6OlVfRFRf
VkVSVElDQUwsCisgICAgICAgICAgRGVjb21wb3NpdGlvbldpZGUgPSBVbmljb2RlQ0U6OlVfRFRf
V0lERSwKKyAgICAgICAgfTsKKworICAgICAgICBlbnVtIENoYXJDYXRlZ29yeSB7CisgICAgICAg
ICAgTm9DYXRlZ29yeSA9ICAwLAorICAgICAgICAgIE90aGVyX05vdEFzc2lnbmVkID0gVE9fTUFT
SyhVbmljb2RlQ0U6OlVfR0VORVJBTF9PVEhFUl9UWVBFUyksCisgICAgICAgICAgTGV0dGVyX1Vw
cGVyY2FzZSA9IFRPX01BU0soVW5pY29kZUNFOjpVX1VQUEVSQ0FTRV9MRVRURVIpLAorICAgICAg
ICAgIExldHRlcl9Mb3dlcmNhc2UgPSBUT19NQVNLKFVuaWNvZGVDRTo6VV9MT1dFUkNBU0VfTEVU
VEVSKSwKKyAgICAgICAgICBMZXR0ZXJfVGl0bGVjYXNlID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVf
VElUTEVDQVNFX0xFVFRFUiksCisgICAgICAgICAgTGV0dGVyX01vZGlmaWVyID0gVE9fTUFTSyhV
bmljb2RlQ0U6OlVfTU9ESUZJRVJfTEVUVEVSKSwKKyAgICAgICAgICBMZXR0ZXJfT3RoZXIgPSBU
T19NQVNLKFVuaWNvZGVDRTo6VV9PVEhFUl9MRVRURVIpLAorCisgICAgICAgICAgTWFya19Ob25T
cGFjaW5nID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVfTk9OX1NQQUNJTkdfTUFSSyksCisgICAgICAg
ICAgTWFya19FbmNsb3NpbmcgPSBUT19NQVNLKFVuaWNvZGVDRTo6VV9FTkNMT1NJTkdfTUFSSyks
CisgICAgICAgICAgTWFya19TcGFjaW5nQ29tYmluaW5nID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVf
Q09NQklOSU5HX1NQQUNJTkdfTUFSSyksCisKKyAgICAgICAgICBOdW1iZXJfRGVjaW1hbERpZ2l0
ID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVfREVDSU1BTF9ESUdJVF9OVU1CRVIpLAorICAgICAgICAg
IE51bWJlcl9MZXR0ZXIgPSBUT19NQVNLKFVuaWNvZGVDRTo6VV9MRVRURVJfTlVNQkVSKSwKKyAg
ICAgICAgICBOdW1iZXJfT3RoZXIgPSBUT19NQVNLKFVuaWNvZGVDRTo6VV9PVEhFUl9OVU1CRVIp
LAorCisgICAgICAgICAgU2VwYXJhdG9yX1NwYWNlID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVfU1BB
Q0VfU0VQQVJBVE9SKSwKKyAgICAgICAgICBTZXBhcmF0b3JfTGluZSA9IFRPX01BU0soVW5pY29k
ZUNFOjpVX0xJTkVfU0VQQVJBVE9SKSwKKyAgICAgICAgICBTZXBhcmF0b3JfUGFyYWdyYXBoID0g
VE9fTUFTSyhVbmljb2RlQ0U6OlVfUEFSQUdSQVBIX1NFUEFSQVRPUiksCisKKyAgICAgICAgICBP
dGhlcl9Db250cm9sID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVfQ09OVFJPTF9DSEFSKSwKKyAgICAg
ICAgICBPdGhlcl9Gb3JtYXQgPSBUT19NQVNLKFVuaWNvZGVDRTo6VV9GT1JNQVRfQ0hBUiksCisg
ICAgICAgICAgT3RoZXJfUHJpdmF0ZVVzZSA9IFRPX01BU0soVW5pY29kZUNFOjpVX1BSSVZBVEVf
VVNFX0NIQVIpLAorICAgICAgICAgIE90aGVyX1N1cnJvZ2F0ZSA9IFRPX01BU0soVW5pY29kZUNF
OjpVX1NVUlJPR0FURSksCisKKyAgICAgICAgICBQdW5jdHVhdGlvbl9EYXNoID0gVE9fTUFTSyhV
bmljb2RlQ0U6OlVfREFTSF9QVU5DVFVBVElPTiksCisgICAgICAgICAgUHVuY3R1YXRpb25fT3Bl
biA9IFRPX01BU0soVW5pY29kZUNFOjpVX1NUQVJUX1BVTkNUVUFUSU9OKSwKKyAgICAgICAgICBQ
dW5jdHVhdGlvbl9DbG9zZSA9IFRPX01BU0soVW5pY29kZUNFOjpVX0VORF9QVU5DVFVBVElPTiks
CisgICAgICAgICAgUHVuY3R1YXRpb25fQ29ubmVjdG9yID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVf
Q09OTkVDVE9SX1BVTkNUVUFUSU9OKSwKKyAgICAgICAgICBQdW5jdHVhdGlvbl9PdGhlciA9IFRP
X01BU0soVW5pY29kZUNFOjpVX09USEVSX1BVTkNUVUFUSU9OKSwKKworICAgICAgICAgIFN5bWJv
bF9NYXRoID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVfTUFUSF9TWU1CT0wpLAorICAgICAgICAgIFN5
bWJvbF9DdXJyZW5jeSA9IFRPX01BU0soVW5pY29kZUNFOjpVX0NVUlJFTkNZX1NZTUJPTCksCisg
ICAgICAgICAgU3ltYm9sX01vZGlmaWVyID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVfTU9ESUZJRVJf
U1lNQk9MKSwKKyAgICAgICAgICBTeW1ib2xfT3RoZXIgPSBUT19NQVNLKFVuaWNvZGVDRTo6VV9P
VEhFUl9TWU1CT0wpLAorCisgICAgICAgICAgUHVuY3R1YXRpb25fSW5pdGlhbFF1b3RlID0gVE9f
TUFTSyhVbmljb2RlQ0U6OlVfSU5JVElBTF9QVU5DVFVBVElPTiksCisgICAgICAgICAgUHVuY3R1
YXRpb25fRmluYWxRdW90ZSA9IFRPX01BU0soVW5pY29kZUNFOjpVX0ZJTkFMX1BVTkNUVUFUSU9O
KQorICAgICAgICB9OworCisgICAgICAgIENoYXJDYXRlZ29yeSBjYXRlZ29yeSh1bnNpZ25lZCBp
bnQpOworCisgICAgICAgIGJvb2wgaXNTcGFjZSh3Y2hhcl90KTsKKyAgICAgICAgYm9vbCBpc0xl
dHRlcih3Y2hhcl90KTsKKyAgICAgICAgYm9vbCBpc1ByaW50YWJsZUNoYXIod2NoYXJfdCk7Cisg
ICAgICAgIGJvb2wgaXNVcHBlcih3Y2hhcl90KTsKKyAgICAgICAgYm9vbCBpc0xvd2VyKHdjaGFy
X3QpOworICAgICAgICBib29sIGlzUHVuY3Qod2NoYXJfdCk7CisgICAgICAgIGJvb2wgaXNEaWdp
dCh3Y2hhcl90KTsKKyAgICAgICAgaW5saW5lIGJvb2wgaXNTZXBhcmF0b3JTcGFjZSh3Y2hhcl90
IGMpIHsgcmV0dXJuIGNhdGVnb3J5KGMpID09IFNlcGFyYXRvcl9TcGFjZTsgfQorICAgICAgICBp
bmxpbmUgYm9vbCBpc0hpZ2hTdXJyb2dhdGUod2NoYXJfdCBjKSB7IHJldHVybiAoYyAmIDB4ZmMw
MCkgPT0gMHhkODAwOyB9CisgICAgICAgIGlubGluZSBib29sIGlzTG93U3Vycm9nYXRlKHdjaGFy
X3QgYykgeyByZXR1cm4gKGMgJiAweGZjMDApID09IDB4ZGMwMDsgfQorCisgICAgICAgIHdjaGFy
X3QgdG9Mb3dlcih3Y2hhcl90KTsKKyAgICAgICAgd2NoYXJfdCB0b1VwcGVyKHdjaGFyX3QpOwor
ICAgICAgICB3Y2hhcl90IGZvbGRDYXNlKHdjaGFyX3QpOworICAgICAgICB3Y2hhcl90IHRvVGl0
bGVDYXNlKHdjaGFyX3QpOworICAgICAgICBpbnQgdG9Mb3dlcih3Y2hhcl90KiByZXN1bHQsIGlu
dCByZXN1bHRMZW5ndGgsIGNvbnN0IHdjaGFyX3QqIHNvdXJjZSwgaW50IHNvdXJjZUxlbmd0aCwg
Ym9vbCogaXNFcnJvcik7CisgICAgICAgIGludCB0b1VwcGVyKHdjaGFyX3QqIHJlc3VsdCwgaW50
IHJlc3VsdExlbmd0aCwgY29uc3Qgd2NoYXJfdCogc291cmNlLCBpbnQgc291cmNlTGVuZ3RoLCBi
b29sKiBpc0Vycm9yKTsKKyAgICAgICAgaW50IGZvbGRDYXNlKFVDaGFyKiByZXN1bHQsIGludCBy
ZXN1bHRMZW5ndGgsIGNvbnN0IHdjaGFyX3QqIHNvdXJjZSwgaW50IHNvdXJjZUxlbmd0aCwgYm9v
bCogaXNFcnJvcik7CisKKyAgICAgICAgaW50IGRpZ2l0VmFsdWUod2NoYXJfdCk7CisKKyAgICAg
ICAgd2NoYXJfdCBtaXJyb3JlZENoYXIoVUNoYXIzMik7CisgICAgICAgIHVuc2lnbmVkIGNoYXIg
Y29tYmluaW5nQ2xhc3MoVUNoYXIzMik7CisgICAgICAgIERlY29tcG9zaXRpb25UeXBlIGRlY29t
cG9zaXRpb25UeXBlKFVDaGFyMzIpOworICAgICAgICBEaXJlY3Rpb24gZGlyZWN0aW9uKFVDaGFy
MzIpOworICAgICAgICBpbmxpbmUgYm9vbCBpc0FyYWJpY0NoYXIoVUNoYXIzMikKKyAgICAgICAg
eworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBGSVhNRTogaW1wbGVtZW50IQorICAgICAg
ICB9CisKKyAgICAgICAgaW5saW5lIGJvb2wgaGFzTGluZUJyZWFraW5nUHJvcGVydHlDb21wbGV4
Q29udGV4dChVQ2hhcjMyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8v
IEZJWE1FOiBpbXBsZW1lbnQhCisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgaW50IHVtZW1j
YXNlY21wKGNvbnN0IHdjaGFyX3QqIGEsIGNvbnN0IHdjaGFyX3QqIGIsIGludCBsZW4pCisgICAg
ICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAg
ICAgICAgICAgICB3Y2hhcl90IGMxID0gZm9sZENhc2UoYVtpXSk7CisgICAgICAgICAgICAgICAg
d2NoYXJfdCBjMiA9IGZvbGRDYXNlKGJbaV0pOworICAgICAgICAgICAgICAgIGlmIChjMSAhPSBj
MikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMxIC0gYzI7CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSBVQ2hhcjMy
IHN1cnJvZ2F0ZVRvVWNzNCh3Y2hhcl90IGhpZ2gsIHdjaGFyX3QgbG93KQorICAgICAgICB7Cisg
ICAgICAgICAgICByZXR1cm4gKFVDaGFyMzIoaGlnaCkgPDwgMTApICsgbG93IC0gMHgzNWZkYzAw
OworICAgICAgICB9CisKKyAgICB9ICAgLy8gbmFtZXNwYWNlIFVuaWNvZGUKKworfSAgIC8vIG5h
bWVzcGFjZSBXVEYKKworI2VuZGlmCisvLyB2aW06IHRzPTIgc3c9MiBldApJbmRleDogSmF2YVNj
cmlwdENvcmUvd3RmL3VuaWNvZGUvd2luY2UvVW5pY29kZVdpbkNFLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
SmF2YVNjcmlwdENvcmUvd3RmL3VuaWNvZGUvd2luY2UvVW5pY29kZVdpbkNFLmgJKHJldmlzaW9u
IDU3Mjg5KQorKysgSmF2YVNjcmlwdENvcmUvd3RmL3VuaWNvZGUvd2luY2UvVW5pY29kZVdpbkNF
LmgJKHdvcmtpbmcgY29weSkKQEAgLTIxLDggKzIxLDggQEAKICAqCiAgKi8KIAotI2lmbmRlZiBV
TklDT0RFX1dJTkNFX0gKLSNkZWZpbmUgVU5JQ09ERV9XSU5DRV9ICisjaWZuZGVmIFdURl9Vbmlj
b2RlV2luQ0VfaAorI2RlZmluZSBXVEZfVW5pY29kZVdpbkNFX2gKIAogI2luY2x1ZGUgImNlX3Vu
aWNvZGUuaCIKIApAQCAtMjEyLDUgKzIxMiw0IEBAIG5hbWVzcGFjZSBXVEYgewogCiB9ICAgLy8g
bmFtZXNwYWNlIFdURgogCi0jZW5kaWYKLS8vIHZpbTogdHM9MiBzdz0yIGV0CisjZW5kaWYgLy8g
V1RGX1VuaWNvZGVXaW5DRV9oCkluZGV4OiBKYXZhU2NyaXB0Q29yZS93dGYvdW5pY29kZS93aW5j
ZS9Vbmljb2RlV2luY2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3d0Zi91bmlj
b2RlL3dpbmNlL1VuaWNvZGVXaW5jZS5jcHAJKHJldmlzaW9uIDU3Mjg5KQorKysgSmF2YVNjcmlw
dENvcmUvd3RmL3VuaWNvZGUvd2luY2UvVW5pY29kZVdpbmNlLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMSwxNzYgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDYgR2VvcmdlIFN0YWlr
b3MgPHN0YWlrb3NAa2RlLm9yZz4KLSAqICBDb3B5cmlnaHQgKEMpIDIwMDYgQWxleGV5IFByb3Nr
dXJ5YWtvdiA8YXBAbnlwb3AuY29tPgotICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNo
IE1vYmlsZSwgSW5jLgotICoKLSAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91
IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt
cyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqICBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqICB2ZXJzaW9u
IDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24u
Ci0gKgotICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0
IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl
dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqICBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3Vs
ZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlO
Ry5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
biwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqICBCb3N0b24sIE1B
IDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAi
VW5pY29kZVdpbmNlLmgiCi0KLSNpbmNsdWRlIDx3Y2hhci5oPgotCi1uYW1lc3BhY2UgV1RGIHsK
LW5hbWVzcGFjZSBVbmljb2RlIHsKLQotd2NoYXJfdCB0b0xvd2VyKHdjaGFyX3QgYykKLXsKLSAg
ICByZXR1cm4gdG93bG93ZXIoYyk7Ci19Ci0KLXdjaGFyX3QgdG9VcHBlcih3Y2hhcl90IGMpCi17
Ci0gICAgcmV0dXJuIHRvd3VwcGVyKGMpOwotfQotCi13Y2hhcl90IGZvbGRDYXNlKHdjaGFyX3Qg
YykKLXsKLSAgICByZXR1cm4gdG93bG93ZXIoYyk7Ci19Ci0KLWJvb2wgaXNQcmludGFibGVDaGFy
KHdjaGFyX3QgYykKLXsKLSAgICByZXR1cm4gISFpc3dwcmludChjKTsKLX0KLQotYm9vbCBpc1Nw
YWNlKHdjaGFyX3QgYykKLXsKLSAgICByZXR1cm4gISFpc3dzcGFjZShjKTsKLX0KLQotYm9vbCBp
c0xldHRlcih3Y2hhcl90IGMpCi17Ci0gICAgcmV0dXJuICEhaXN3YWxwaGEoYyk7Ci19Ci0KLWJv
b2wgaXNVcHBlcih3Y2hhcl90IGMpCi17Ci0gICAgcmV0dXJuICEhaXN3dXBwZXIoYyk7Ci19Ci0K
LWJvb2wgaXNMb3dlcih3Y2hhcl90IGMpCi17Ci0gICAgcmV0dXJuICEhaXN3bG93ZXIoYyk7Ci19
Ci0KLWJvb2wgaXNEaWdpdCh3Y2hhcl90IGMpCi17Ci0gICAgcmV0dXJuICEhaXN3ZGlnaXQoYyk7
Ci19Ci0KLWJvb2wgaXNQdW5jdCh3Y2hhcl90IGMpCi17Ci0gICAgcmV0dXJuICEhaXN3cHVuY3Qo
Yyk7Ci19Ci0KLWludCB0b0xvd2VyKHdjaGFyX3QqIHJlc3VsdCwgaW50IHJlc3VsdExlbmd0aCwg
Y29uc3Qgd2NoYXJfdCogc291cmNlLCBpbnQgc291cmNlTGVuZ3RoLCBib29sKiBpc0Vycm9yKQot
ewotICAgIGNvbnN0IFVDaGFyKiBzb3VyY2VJdGVyYXRvciA9IHNvdXJjZTsKLSAgICBjb25zdCBV
Q2hhciogc291cmNlRW5kID0gc291cmNlICsgc291cmNlTGVuZ3RoOwotICAgIFVDaGFyKiByZXN1
bHRJdGVyYXRvciA9IHJlc3VsdDsKLSAgICBVQ2hhciogcmVzdWx0RW5kID0gcmVzdWx0ICsgcmVz
dWx0TGVuZ3RoOwotCi0gICAgaW50IHJlbWFpbmluZ0NoYXJhY3RlcnMgPSAwOwotICAgIGlmIChz
b3VyY2VMZW5ndGggPD0gcmVzdWx0TGVuZ3RoKQotICAgICAgICB3aGlsZSAoc291cmNlSXRlcmF0
b3IgPCBzb3VyY2VFbmQpCi0gICAgICAgICAgICAqcmVzdWx0SXRlcmF0b3IrKyA9IHRvd2xvd2Vy
KCpzb3VyY2VJdGVyYXRvcisrKTsKLSAgICBlbHNlCi0gICAgICAgIHdoaWxlIChyZXN1bHRJdGVy
YXRvciA8IHJlc3VsdEVuZCkKLSAgICAgICAgICAgICpyZXN1bHRJdGVyYXRvcisrID0gdG93bG93
ZXIoKnNvdXJjZUl0ZXJhdG9yKyspOwotCi0gICAgaWYgKHNvdXJjZUl0ZXJhdG9yIDwgc291cmNl
RW5kKQotICAgICAgICByZW1haW5pbmdDaGFyYWN0ZXJzICs9IHNvdXJjZUVuZCAtIHNvdXJjZUl0
ZXJhdG9yOwotICAgICppc0Vycm9yID0gKHJlbWFpbmluZ0NoYXJhY3RlcnMgIT0gMCk7Ci0gICAg
aWYgKHJlc3VsdEl0ZXJhdG9yIDwgcmVzdWx0RW5kKQotICAgICAgICAqcmVzdWx0SXRlcmF0b3Ig
PSAwOwotCi0gICAgcmV0dXJuIChyZXN1bHRJdGVyYXRvciAtIHJlc3VsdCkgKyByZW1haW5pbmdD
aGFyYWN0ZXJzOwotfQotCi1pbnQgdG9VcHBlcih3Y2hhcl90KiByZXN1bHQsIGludCByZXN1bHRM
ZW5ndGgsIGNvbnN0IHdjaGFyX3QqIHNvdXJjZSwgaW50IHNvdXJjZUxlbmd0aCwgYm9vbCogaXNF
cnJvcikKLXsKLSAgICBjb25zdCBVQ2hhciogc291cmNlSXRlcmF0b3IgPSBzb3VyY2U7Ci0gICAg
Y29uc3QgVUNoYXIqIHNvdXJjZUVuZCA9IHNvdXJjZSArIHNvdXJjZUxlbmd0aDsKLSAgICBVQ2hh
ciogcmVzdWx0SXRlcmF0b3IgPSByZXN1bHQ7Ci0gICAgVUNoYXIqIHJlc3VsdEVuZCA9IHJlc3Vs
dCArIHJlc3VsdExlbmd0aDsKLQotICAgIGludCByZW1haW5pbmdDaGFyYWN0ZXJzID0gMDsKLSAg
ICBpZiAoc291cmNlTGVuZ3RoIDw9IHJlc3VsdExlbmd0aCkKLSAgICAgICAgd2hpbGUgKHNvdXJj
ZUl0ZXJhdG9yIDwgc291cmNlRW5kKQotICAgICAgICAgICAgKnJlc3VsdEl0ZXJhdG9yKysgPSB0
b3d1cHBlcigqc291cmNlSXRlcmF0b3IrKyk7Ci0gICAgZWxzZQotICAgICAgICB3aGlsZSAocmVz
dWx0SXRlcmF0b3IgPCByZXN1bHRFbmQpCi0gICAgICAgICAgICAqcmVzdWx0SXRlcmF0b3IrKyA9
IHRvd3VwcGVyKCpzb3VyY2VJdGVyYXRvcisrKTsKLQotICAgIGlmIChzb3VyY2VJdGVyYXRvciA8
IHNvdXJjZUVuZCkKLSAgICAgICAgcmVtYWluaW5nQ2hhcmFjdGVycyArPSBzb3VyY2VFbmQgLSBz
b3VyY2VJdGVyYXRvcjsKLSAgICAqaXNFcnJvciA9IChyZW1haW5pbmdDaGFyYWN0ZXJzICE9IDAp
OwotICAgIGlmIChyZXN1bHRJdGVyYXRvciA8IHJlc3VsdEVuZCkKLSAgICAgICAgKnJlc3VsdEl0
ZXJhdG9yID0gMDsKLQotICAgIHJldHVybiAocmVzdWx0SXRlcmF0b3IgLSByZXN1bHQpICsgcmVt
YWluaW5nQ2hhcmFjdGVyczsKLX0KLQotaW50IGZvbGRDYXNlKHdjaGFyX3QqIHJlc3VsdCwgaW50
IHJlc3VsdExlbmd0aCwgY29uc3Qgd2NoYXJfdCogc291cmNlLCBpbnQgc291cmNlTGVuZ3RoLCBi
b29sKiBpc0Vycm9yKQotewotICAgICppc0Vycm9yID0gZmFsc2U7Ci0gICAgaWYgKHJlc3VsdExl
bmd0aCA8IHNvdXJjZUxlbmd0aCkgewotICAgICAgICAqaXNFcnJvciA9IHRydWU7Ci0gICAgICAg
IHJldHVybiBzb3VyY2VMZW5ndGg7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc291
cmNlTGVuZ3RoOyArK2kpCi0gICAgICAgIHJlc3VsdFtpXSA9IGZvbGRDYXNlKHNvdXJjZVtpXSk7
Ci0gICAgcmV0dXJuIHNvdXJjZUxlbmd0aDsKLX0KLQotd2NoYXJfdCB0b1RpdGxlQ2FzZSh3Y2hh
cl90IGMpCi17Ci0gICAgcmV0dXJuIHRvd3VwcGVyKGMpOwotfQotCi1EaXJlY3Rpb24gZGlyZWN0
aW9uKFVDaGFyMzIgYykKLXsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RGlyZWN0aW9uPihVbmlj
b2RlQ0U6OmRpcmVjdGlvbihjKSk7Ci19Ci0KLUNoYXJDYXRlZ29yeSBjYXRlZ29yeSh1bnNpZ25l
ZCBpbnQgYykKLXsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2hhckNhdGVnb3J5PihUT19NQVNL
KChfX2ludDgpIFVuaWNvZGVDRTo6Y2F0ZWdvcnkoYykpKTsKLX0KLQotRGVjb21wb3NpdGlvblR5
cGUgZGVjb21wb3NpdGlvblR5cGUoVUNoYXIzMiBjKQotewotICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxEZWNvbXBvc2l0aW9uVHlwZT4oVW5pY29kZUNFOjpkZWNvbXBvc2l0aW9uVHlwZShjKSk7Ci19
Ci0KLXVuc2lnbmVkIGNoYXIgY29tYmluaW5nQ2xhc3MoVUNoYXIzMiBjKQotewotICAgIHJldHVy
biBVbmljb2RlQ0U6OmNvbWJpbmluZ0NsYXNzKGMpOwotfQotCi13Y2hhcl90IG1pcnJvcmVkQ2hh
cihVQ2hhcjMyIGMpCi17Ci0gICAgcmV0dXJuIFVuaWNvZGVDRTo6bWlycm9yZWRDaGFyKGMpOwot
fQotCi1pbnQgZGlnaXRWYWx1ZSh3Y2hhcl90IGMpCi17Ci0gICAgcmV0dXJuIFVuaWNvZGVDRTo6
ZGlnaXRWYWx1ZShjKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgVW5pY29kZQotfSAvLyBuYW1lc3Bh
Y2UgV1RGCkluZGV4OiBKYXZhU2NyaXB0Q29yZS93dGYvdW5pY29kZS93aW5jZS9Vbmljb2RlV2lu
Y2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvdW5pY29kZS93aW5jZS9Vbmlj
b2RlV2luY2UuaAkocmV2aXNpb24gNTcyODkpCisrKyBKYXZhU2NyaXB0Q29yZS93dGYvdW5pY29k
ZS93aW5jZS9Vbmljb2RlV2luY2UuaAkod29ya2luZyBjb3B5KQpAQCAtMSwyMTYgKzAsMCBAQAot
LyoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDYgR2VvcmdlIFN0YWlrb3MgPHN0YWlrb3NAa2RlLm9y
Zz4KLSAqICBDb3B5cmlnaHQgKEMpIDIwMDYgQWxleGV5IFByb3NrdXJ5YWtvdiA8YXBAbnlwb3Au
Y29tPgotICogIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBDb21wdXRlciwgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgotICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwg
SW5jLgotICoKLSAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqICB2ZXJzaW9uIDIgb2YgdGhl
IExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICog
IFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
dXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqICBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQot
ICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJ
ZiBub3QsIHdyaXRlIHRvCi0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwg
NTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqICBCb3N0b24sIE1BIDAyMTEwLTEz
MDEsIFVTQS4KLSAqCi0gKi8KLQotI2lmbmRlZiBVTklDT0RFX1dJTkNFX0gKLSNkZWZpbmUgVU5J
Q09ERV9XSU5DRV9ICi0KLSNpbmNsdWRlICJjZV91bmljb2RlLmgiCi0KLSNkZWZpbmUgVE9fTUFT
Syh4KSAoMSA8PCAoeCkpCi0KLS8vIHNvbWUgZGVmaW5lcyBmcm9tIElDVSBuZWVkZWQgb25lIG9y
IHR3byBwbGFjZXMKLQotI2RlZmluZSBVMTZfSVNfTEVBRChjKSAoKChjKSAmIDB4ZmZmZmZjMDAp
ID09IDB4ZDgwMCkKLSNkZWZpbmUgVTE2X0lTX1RSQUlMKGMpICgoKGMpICYgMHhmZmZmZmMwMCkg
PT0gMHhkYzAwKQotI2RlZmluZSBVMTZfU1VSUk9HQVRFX09GRlNFVCAoKDB4ZDgwMCA8PCAxMFVM
KSArIDB4ZGMwMCAtIDB4MTAwMDApCi0jZGVmaW5lIFUxNl9HRVRfU1VQUExFTUVOVEFSWShsZWFk
LCB0cmFpbCkgXAotICAgICgoKFVDaGFyMzIpKGxlYWQpIDw8IDEwVUwpICsgKFVDaGFyMzIpKHRy
YWlsKSAtIFUxNl9TVVJST0dBVEVfT0ZGU0VUKQotCi0jZGVmaW5lIFUxNl9MRUFEKHN1cHBsZW1l
bnRhcnkpIChVQ2hhcikoKChzdXBwbGVtZW50YXJ5KSA+PiAxMCkgKyAweGQ3YzApCi0jZGVmaW5l
IFUxNl9UUkFJTChzdXBwbGVtZW50YXJ5KSAoVUNoYXIpKCgoc3VwcGxlbWVudGFyeSkgJiAweDNm
ZikgfCAweGRjMDApCi0KLSNkZWZpbmUgVV9JU19TVVJST0dBVEUoYykgKCgoYykgJiAweGZmZmZm
ODAwKSA9PSAweGQ4MDApCi0jZGVmaW5lIFUxNl9JU19TVVJST0dBVEUoYykgVV9JU19TVVJST0dB
VEUoYykKLSNkZWZpbmUgVTE2X0lTX1NVUlJPR0FURV9MRUFEKGMpICgoKGMpICYgMHg0MDApID09
IDApCi0KLSNkZWZpbmUgVTE2X05FWFQocywgaSwgbGVuZ3RoLCBjKSB7IFwKLSAgICAoYyk9KHMp
WyhpKSsrXTsgXAotICAgIGlmIChVMTZfSVNfTEVBRChjKSkgeyBcCi0gICAgICAgIHVpbnQxNl90
IF9fYzI7IFwKLSAgICAgICAgaWYgKChpKSA8IChsZW5ndGgpICYmIFUxNl9JU19UUkFJTChfX2My
ID0gKHMpWyhpKV0pKSB7IFwKLSAgICAgICAgICAgICsrKGkpOyBcCi0gICAgICAgICAgICAoYykg
PSBVMTZfR0VUX1NVUFBMRU1FTlRBUlkoKGMpLCBfX2MyKTsgXAotICAgICAgICB9IFwKLSAgICB9
IFwKLX0KLQotI2RlZmluZSBVMTZfUFJFVihzLCBzdGFydCwgaSwgYykgeyBcCi0gICAgKGMpPShz
KVstLShpKV07IFwKLSAgICBpZiAoVTE2X0lTX1RSQUlMKGMpKSB7IFwKLSAgICAgICAgdWludDE2
X3QgX19jMjsgXAotICAgICAgICBpZiAoKGkpID4gKHN0YXJ0KSAmJiBVMTZfSVNfTEVBRChfX2My
ID0gKHMpWyhpKSAtIDFdKSkgeyBcCi0gICAgICAgICAgICAtLShpKTsgXAotICAgICAgICAgICAg
KGMpID0gVTE2X0dFVF9TVVBQTEVNRU5UQVJZKF9fYzIsIChjKSk7IFwKLSAgICAgICAgfSBcCi0g
ICAgfSBcCi19Ci0KLSNkZWZpbmUgVTE2X0lTX1NJTkdMRShjKSAhVV9JU19TVVJST0dBVEUoYykK
LQotbmFtZXNwYWNlIFdURiB7Ci0KLSAgICBuYW1lc3BhY2UgVW5pY29kZSB7Ci0KLSAgICAgICAg
ZW51bSBEaXJlY3Rpb24gewotICAgICAgICAgICAgTGVmdFRvUmlnaHQgPSBVbmljb2RlQ0U6OlVf
TEVGVF9UT19SSUdIVCwKLSAgICAgICAgICAgIFJpZ2h0VG9MZWZ0ID0gVW5pY29kZUNFOjpVX1JJ
R0hUX1RPX0xFRlQsCi0gICAgICAgICAgICBFdXJvcGVhbk51bWJlciA9IFVuaWNvZGVDRTo6VV9F
VVJPUEVBTl9OVU1CRVIsCi0gICAgICAgICAgICBFdXJvcGVhbk51bWJlclNlcGFyYXRvciA9IFVu
aWNvZGVDRTo6VV9FVVJPUEVBTl9OVU1CRVJfU0VQQVJBVE9SLAotICAgICAgICAgICAgRXVyb3Bl
YW5OdW1iZXJUZXJtaW5hdG9yID0gVW5pY29kZUNFOjpVX0VVUk9QRUFOX05VTUJFUl9URVJNSU5B
VE9SLAotICAgICAgICAgICAgQXJhYmljTnVtYmVyID0gVW5pY29kZUNFOjpVX0FSQUJJQ19OVU1C
RVIsCi0gICAgICAgICAgICBDb21tb25OdW1iZXJTZXBhcmF0b3IgPSBVbmljb2RlQ0U6OlVfQ09N
TU9OX05VTUJFUl9TRVBBUkFUT1IsCi0gICAgICAgICAgICBCbG9ja1NlcGFyYXRvciA9IFVuaWNv
ZGVDRTo6VV9CTE9DS19TRVBBUkFUT1IsCi0gICAgICAgICAgICBTZWdtZW50U2VwYXJhdG9yID0g
VW5pY29kZUNFOjpVX1NFR01FTlRfU0VQQVJBVE9SLAotICAgICAgICAgICAgV2hpdGVTcGFjZU5l
dXRyYWwgPSBVbmljb2RlQ0U6OlVfV0hJVEVfU1BBQ0VfTkVVVFJBTCwKLSAgICAgICAgICAgIE90
aGVyTmV1dHJhbCA9IFVuaWNvZGVDRTo6VV9PVEhFUl9ORVVUUkFMLAotICAgICAgICAgICAgTGVm
dFRvUmlnaHRFbWJlZGRpbmcgPSBVbmljb2RlQ0U6OlVfTEVGVF9UT19SSUdIVF9FTUJFRERJTkcs
Ci0gICAgICAgICAgICBMZWZ0VG9SaWdodE92ZXJyaWRlID0gVW5pY29kZUNFOjpVX0xFRlRfVE9f
UklHSFRfT1ZFUlJJREUsCi0gICAgICAgICAgICBSaWdodFRvTGVmdEFyYWJpYyA9IFVuaWNvZGVD
RTo6VV9SSUdIVF9UT19MRUZUX0FSQUJJQywKLSAgICAgICAgICAgIFJpZ2h0VG9MZWZ0RW1iZWRk
aW5nID0gVW5pY29kZUNFOjpVX1JJR0hUX1RPX0xFRlRfRU1CRURESU5HLAotICAgICAgICAgICAg
UmlnaHRUb0xlZnRPdmVycmlkZSA9IFVuaWNvZGVDRTo6VV9SSUdIVF9UT19MRUZUX09WRVJSSURF
LAotICAgICAgICAgICAgUG9wRGlyZWN0aW9uYWxGb3JtYXQgPSBVbmljb2RlQ0U6OlVfUE9QX0RJ
UkVDVElPTkFMX0ZPUk1BVCwKLSAgICAgICAgICAgIE5vblNwYWNpbmdNYXJrID0gVW5pY29kZUNF
OjpVX0RJUl9OT05fU1BBQ0lOR19NQVJLLAotICAgICAgICAgICAgQm91bmRhcnlOZXV0cmFsID0g
VW5pY29kZUNFOjpVX0JPVU5EQVJZX05FVVRSQUwKLSAgICAgICAgfTsKLQotICAgICAgICBlbnVt
IERlY29tcG9zaXRpb25UeXBlIHsKLSAgICAgICAgICBEZWNvbXBvc2l0aW9uTm9uZSA9IFVuaWNv
ZGVDRTo6VV9EVF9OT05FLAotICAgICAgICAgIERlY29tcG9zaXRpb25DYW5vbmljYWwgPSBVbmlj
b2RlQ0U6OlVfRFRfQ0FOT05JQ0FMLAotICAgICAgICAgIERlY29tcG9zaXRpb25Db21wYXQgPSBV
bmljb2RlQ0U6OlVfRFRfQ09NUEFULAotICAgICAgICAgIERlY29tcG9zaXRpb25DaXJjbGUgPSBV
bmljb2RlQ0U6OlVfRFRfQ0lSQ0xFLAotICAgICAgICAgIERlY29tcG9zaXRpb25GaW5hbCA9IFVu
aWNvZGVDRTo6VV9EVF9GSU5BTCwKLSAgICAgICAgICBEZWNvbXBvc2l0aW9uRm9udCA9IFVuaWNv
ZGVDRTo6VV9EVF9GT05ULAotICAgICAgICAgIERlY29tcG9zaXRpb25GcmFjdGlvbiA9IFVuaWNv
ZGVDRTo6VV9EVF9GUkFDVElPTiwKLSAgICAgICAgICBEZWNvbXBvc2l0aW9uSW5pdGlhbCA9IFVu
aWNvZGVDRTo6VV9EVF9JTklUSUFMLAotICAgICAgICAgIERlY29tcG9zaXRpb25Jc29sYXRlZCA9
IFVuaWNvZGVDRTo6VV9EVF9JU09MQVRFRCwKLSAgICAgICAgICBEZWNvbXBvc2l0aW9uTWVkaWFs
ID0gVW5pY29kZUNFOjpVX0RUX01FRElBTCwKLSAgICAgICAgICBEZWNvbXBvc2l0aW9uTmFycm93
ID0gVW5pY29kZUNFOjpVX0RUX05BUlJPVywKLSAgICAgICAgICBEZWNvbXBvc2l0aW9uTm9CcmVh
ayA9IFVuaWNvZGVDRTo6VV9EVF9OT0JSRUFLLAotICAgICAgICAgIERlY29tcG9zaXRpb25TbWFs
bCA9IFVuaWNvZGVDRTo6VV9EVF9TTUFMTCwKLSAgICAgICAgICBEZWNvbXBvc2l0aW9uU3F1YXJl
ID0gVW5pY29kZUNFOjpVX0RUX1NRVUFSRSwKLSAgICAgICAgICBEZWNvbXBvc2l0aW9uU3ViID0g
VW5pY29kZUNFOjpVX0RUX1NVQiwKLSAgICAgICAgICBEZWNvbXBvc2l0aW9uU3VwZXIgPSBVbmlj
b2RlQ0U6OlVfRFRfU1VQRVIsCi0gICAgICAgICAgRGVjb21wb3NpdGlvblZlcnRpY2FsID0gVW5p
Y29kZUNFOjpVX0RUX1ZFUlRJQ0FMLAotICAgICAgICAgIERlY29tcG9zaXRpb25XaWRlID0gVW5p
Y29kZUNFOjpVX0RUX1dJREUsCi0gICAgICAgIH07Ci0KLSAgICAgICAgZW51bSBDaGFyQ2F0ZWdv
cnkgewotICAgICAgICAgIE5vQ2F0ZWdvcnkgPSAgMCwKLSAgICAgICAgICBPdGhlcl9Ob3RBc3Np
Z25lZCA9IFRPX01BU0soVW5pY29kZUNFOjpVX0dFTkVSQUxfT1RIRVJfVFlQRVMpLAotICAgICAg
ICAgIExldHRlcl9VcHBlcmNhc2UgPSBUT19NQVNLKFVuaWNvZGVDRTo6VV9VUFBFUkNBU0VfTEVU
VEVSKSwKLSAgICAgICAgICBMZXR0ZXJfTG93ZXJjYXNlID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVf
TE9XRVJDQVNFX0xFVFRFUiksCi0gICAgICAgICAgTGV0dGVyX1RpdGxlY2FzZSA9IFRPX01BU0so
VW5pY29kZUNFOjpVX1RJVExFQ0FTRV9MRVRURVIpLAotICAgICAgICAgIExldHRlcl9Nb2RpZmll
ciA9IFRPX01BU0soVW5pY29kZUNFOjpVX01PRElGSUVSX0xFVFRFUiksCi0gICAgICAgICAgTGV0
dGVyX090aGVyID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVfT1RIRVJfTEVUVEVSKSwKLQotICAgICAg
ICAgIE1hcmtfTm9uU3BhY2luZyA9IFRPX01BU0soVW5pY29kZUNFOjpVX05PTl9TUEFDSU5HX01B
UkspLAotICAgICAgICAgIE1hcmtfRW5jbG9zaW5nID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVfRU5D
TE9TSU5HX01BUkspLAotICAgICAgICAgIE1hcmtfU3BhY2luZ0NvbWJpbmluZyA9IFRPX01BU0so
VW5pY29kZUNFOjpVX0NPTUJJTklOR19TUEFDSU5HX01BUkspLAotCi0gICAgICAgICAgTnVtYmVy
X0RlY2ltYWxEaWdpdCA9IFRPX01BU0soVW5pY29kZUNFOjpVX0RFQ0lNQUxfRElHSVRfTlVNQkVS
KSwKLSAgICAgICAgICBOdW1iZXJfTGV0dGVyID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVfTEVUVEVS
X05VTUJFUiksCi0gICAgICAgICAgTnVtYmVyX090aGVyID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVf
T1RIRVJfTlVNQkVSKSwKLQotICAgICAgICAgIFNlcGFyYXRvcl9TcGFjZSA9IFRPX01BU0soVW5p
Y29kZUNFOjpVX1NQQUNFX1NFUEFSQVRPUiksCi0gICAgICAgICAgU2VwYXJhdG9yX0xpbmUgPSBU
T19NQVNLKFVuaWNvZGVDRTo6VV9MSU5FX1NFUEFSQVRPUiksCi0gICAgICAgICAgU2VwYXJhdG9y
X1BhcmFncmFwaCA9IFRPX01BU0soVW5pY29kZUNFOjpVX1BBUkFHUkFQSF9TRVBBUkFUT1IpLAot
Ci0gICAgICAgICAgT3RoZXJfQ29udHJvbCA9IFRPX01BU0soVW5pY29kZUNFOjpVX0NPTlRST0xf
Q0hBUiksCi0gICAgICAgICAgT3RoZXJfRm9ybWF0ID0gVE9fTUFTSyhVbmljb2RlQ0U6OlVfRk9S
TUFUX0NIQVIpLAotICAgICAgICAgIE90aGVyX1ByaXZhdGVVc2UgPSBUT19NQVNLKFVuaWNvZGVD
RTo6VV9QUklWQVRFX1VTRV9DSEFSKSwKLSAgICAgICAgICBPdGhlcl9TdXJyb2dhdGUgPSBUT19N
QVNLKFVuaWNvZGVDRTo6VV9TVVJST0dBVEUpLAotCi0gICAgICAgICAgUHVuY3R1YXRpb25fRGFz
aCA9IFRPX01BU0soVW5pY29kZUNFOjpVX0RBU0hfUFVOQ1RVQVRJT04pLAotICAgICAgICAgIFB1
bmN0dWF0aW9uX09wZW4gPSBUT19NQVNLKFVuaWNvZGVDRTo6VV9TVEFSVF9QVU5DVFVBVElPTiks
Ci0gICAgICAgICAgUHVuY3R1YXRpb25fQ2xvc2UgPSBUT19NQVNLKFVuaWNvZGVDRTo6VV9FTkRf
UFVOQ1RVQVRJT04pLAotICAgICAgICAgIFB1bmN0dWF0aW9uX0Nvbm5lY3RvciA9IFRPX01BU0so
VW5pY29kZUNFOjpVX0NPTk5FQ1RPUl9QVU5DVFVBVElPTiksCi0gICAgICAgICAgUHVuY3R1YXRp
b25fT3RoZXIgPSBUT19NQVNLKFVuaWNvZGVDRTo6VV9PVEhFUl9QVU5DVFVBVElPTiksCi0KLSAg
ICAgICAgICBTeW1ib2xfTWF0aCA9IFRPX01BU0soVW5pY29kZUNFOjpVX01BVEhfU1lNQk9MKSwK
LSAgICAgICAgICBTeW1ib2xfQ3VycmVuY3kgPSBUT19NQVNLKFVuaWNvZGVDRTo6VV9DVVJSRU5D
WV9TWU1CT0wpLAotICAgICAgICAgIFN5bWJvbF9Nb2RpZmllciA9IFRPX01BU0soVW5pY29kZUNF
OjpVX01PRElGSUVSX1NZTUJPTCksCi0gICAgICAgICAgU3ltYm9sX090aGVyID0gVE9fTUFTSyhV
bmljb2RlQ0U6OlVfT1RIRVJfU1lNQk9MKSwKLQotICAgICAgICAgIFB1bmN0dWF0aW9uX0luaXRp
YWxRdW90ZSA9IFRPX01BU0soVW5pY29kZUNFOjpVX0lOSVRJQUxfUFVOQ1RVQVRJT04pLAotICAg
ICAgICAgIFB1bmN0dWF0aW9uX0ZpbmFsUXVvdGUgPSBUT19NQVNLKFVuaWNvZGVDRTo6VV9GSU5B
TF9QVU5DVFVBVElPTikKLSAgICAgICAgfTsKLQotICAgICAgICBDaGFyQ2F0ZWdvcnkgY2F0ZWdv
cnkodW5zaWduZWQgaW50KTsKLQotICAgICAgICBib29sIGlzU3BhY2Uod2NoYXJfdCk7Ci0gICAg
ICAgIGJvb2wgaXNMZXR0ZXIod2NoYXJfdCk7Ci0gICAgICAgIGJvb2wgaXNQcmludGFibGVDaGFy
KHdjaGFyX3QpOwotICAgICAgICBib29sIGlzVXBwZXIod2NoYXJfdCk7Ci0gICAgICAgIGJvb2wg
aXNMb3dlcih3Y2hhcl90KTsKLSAgICAgICAgYm9vbCBpc1B1bmN0KHdjaGFyX3QpOwotICAgICAg
ICBib29sIGlzRGlnaXQod2NoYXJfdCk7Ci0gICAgICAgIGlubGluZSBib29sIGlzU2VwYXJhdG9y
U3BhY2Uod2NoYXJfdCBjKSB7IHJldHVybiBjYXRlZ29yeShjKSA9PSBTZXBhcmF0b3JfU3BhY2U7
IH0KLSAgICAgICAgaW5saW5lIGJvb2wgaXNIaWdoU3Vycm9nYXRlKHdjaGFyX3QgYykgeyByZXR1
cm4gKGMgJiAweGZjMDApID09IDB4ZDgwMDsgfQotICAgICAgICBpbmxpbmUgYm9vbCBpc0xvd1N1
cnJvZ2F0ZSh3Y2hhcl90IGMpIHsgcmV0dXJuIChjICYgMHhmYzAwKSA9PSAweGRjMDA7IH0KLQot
ICAgICAgICB3Y2hhcl90IHRvTG93ZXIod2NoYXJfdCk7Ci0gICAgICAgIHdjaGFyX3QgdG9VcHBl
cih3Y2hhcl90KTsKLSAgICAgICAgd2NoYXJfdCBmb2xkQ2FzZSh3Y2hhcl90KTsKLSAgICAgICAg
d2NoYXJfdCB0b1RpdGxlQ2FzZSh3Y2hhcl90KTsKLSAgICAgICAgaW50IHRvTG93ZXIod2NoYXJf
dCogcmVzdWx0LCBpbnQgcmVzdWx0TGVuZ3RoLCBjb25zdCB3Y2hhcl90KiBzb3VyY2UsIGludCBz
b3VyY2VMZW5ndGgsIGJvb2wqIGlzRXJyb3IpOwotICAgICAgICBpbnQgdG9VcHBlcih3Y2hhcl90
KiByZXN1bHQsIGludCByZXN1bHRMZW5ndGgsIGNvbnN0IHdjaGFyX3QqIHNvdXJjZSwgaW50IHNv
dXJjZUxlbmd0aCwgYm9vbCogaXNFcnJvcik7Ci0gICAgICAgIGludCBmb2xkQ2FzZShVQ2hhciog
cmVzdWx0LCBpbnQgcmVzdWx0TGVuZ3RoLCBjb25zdCB3Y2hhcl90KiBzb3VyY2UsIGludCBzb3Vy
Y2VMZW5ndGgsIGJvb2wqIGlzRXJyb3IpOwotCi0gICAgICAgIGludCBkaWdpdFZhbHVlKHdjaGFy
X3QpOwotCi0gICAgICAgIHdjaGFyX3QgbWlycm9yZWRDaGFyKFVDaGFyMzIpOwotICAgICAgICB1
bnNpZ25lZCBjaGFyIGNvbWJpbmluZ0NsYXNzKFVDaGFyMzIpOwotICAgICAgICBEZWNvbXBvc2l0
aW9uVHlwZSBkZWNvbXBvc2l0aW9uVHlwZShVQ2hhcjMyKTsKLSAgICAgICAgRGlyZWN0aW9uIGRp
cmVjdGlvbihVQ2hhcjMyKTsKLSAgICAgICAgaW5saW5lIGJvb2wgaXNBcmFiaWNDaGFyKFVDaGFy
MzIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gRklYTUU6IGltcGxl
bWVudCEKLSAgICAgICAgfQotCi0gICAgICAgIGlubGluZSBib29sIGhhc0xpbmVCcmVha2luZ1By
b3BlcnR5Q29tcGxleENvbnRleHQoVUNoYXIzMikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOyAvLyBGSVhNRTogaW1wbGVtZW50IQotICAgICAgICB9Ci0KLSAgICAgICAgaW5s
aW5lIGludCB1bWVtY2FzZWNtcChjb25zdCB3Y2hhcl90KiBhLCBjb25zdCB3Y2hhcl90KiBiLCBp
bnQgbGVuKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsg
KytpKSB7Ci0gICAgICAgICAgICAgICAgd2NoYXJfdCBjMSA9IGZvbGRDYXNlKGFbaV0pOwotICAg
ICAgICAgICAgICAgIHdjaGFyX3QgYzIgPSBmb2xkQ2FzZShiW2ldKTsKLSAgICAgICAgICAgICAg
ICBpZiAoYzEgIT0gYzIpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjMSAtIGMyOwotICAg
ICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBp
bmxpbmUgVUNoYXIzMiBzdXJyb2dhdGVUb1VjczQod2NoYXJfdCBoaWdoLCB3Y2hhcl90IGxvdykK
LSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChVQ2hhcjMyKGhpZ2gpIDw8IDEwKSArIGxv
dyAtIDB4MzVmZGMwMDsKLSAgICAgICAgfQotCi0gICAgfSAgIC8vIG5hbWVzcGFjZSBVbmljb2Rl
Ci0KLX0gICAvLyBuYW1lc3BhY2UgV1RGCi0KLSNlbmRpZgotLy8gdmltOiB0cz0yIHN3PTIgZXQK
SW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi93aW5jZS9GYXN0TWFsbG9jV2luQ0UuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvd2luY2UvRmFzdE1hbGxvY1dpbkNFLmgJKHJldmlz
aW9uIDU3Mjg5KQkoZnJvbSBKYXZhU2NyaXB0Q29yZS93dGYvd2luY2UvRmFzdE1hbGxvY1dpbmNl
Lmg6NTcyODkpCisrKyBKYXZhU2NyaXB0Q29yZS93dGYvd2luY2UvRmFzdE1hbGxvY1dpbkNFLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAy
MDA1LCAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
ICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZAorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2Yg
dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgor
ICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo
ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZl
IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIu
ICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j
LiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEw
LTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBGYXN0TWFsbG9jV2luY2VfaAorI2RlZmlu
ZSBGYXN0TWFsbG9jV2luY2VfaAorCisjaW5jbHVkZSA8bmV3Lmg+CisKKyNpZmRlZiBfX2NwbHVz
cGx1cworI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlICJNZW1vcnlNYW5hZ2VyLmgiCitleHRlcm4g
IkMiIHsKKyNlbmRpZgorCit2b2lkKiBmYXN0TWFsbG9jKHNpemVfdCBuKTsKK3ZvaWQqIGZhc3RD
YWxsb2Moc2l6ZV90IG5fZWxlbWVudHMsIHNpemVfdCBlbGVtZW50X3NpemUpOwordm9pZCBmYXN0
RnJlZSh2b2lkKiBwKTsKK3ZvaWQqIGZhc3RSZWFsbG9jKHZvaWQqIHAsIHNpemVfdCBuKTsKK3Zv
aWQqIGZhc3RaZXJvZWRNYWxsb2Moc2l6ZV90IG4pOworLy8gVGhlc2UgZnVuY3Rpb25zIHJldHVy
biAwIGlmIGFuIGFsbG9jYXRpb24gZmFpbHMuCit2b2lkKiB0cnlGYXN0TWFsbG9jKHNpemVfdCBu
KTsKK3ZvaWQqIHRyeUZhc3RaZXJvZWRNYWxsb2Moc2l6ZV90IG4pOwordm9pZCogdHJ5RmFzdENh
bGxvYyhzaXplX3Qgbl9lbGVtZW50cywgc2l6ZV90IGVsZW1lbnRfc2l6ZSk7Cit2b2lkKiB0cnlG
YXN0UmVhbGxvYyh2b2lkKiBwLCBzaXplX3Qgbik7CitjaGFyKiBmYXN0U3RyRHVwKGNvbnN0IGNo
YXIqKTsKKworI2lmbmRlZiBOREVCVUcKK3ZvaWQgZmFzdE1hbGxvY0ZvcmJpZCgpOwordm9pZCBm
YXN0TWFsbG9jQWxsb3coKTsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoVVNFX1NZU1RFTV9NQUxM
T0MpIHx8ICFVU0VfU1lTVEVNX01BTExPQworCisjZGVmaW5lIG1hbGxvYyhuKSAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGZhc3RNYWxsb2MobikKKyNkZWZpbmUgY2FsbG9jKG5fZWxlbWVudHMs
IGVsZW1lbnRfc2l6ZSkgICAgZmFzdENhbGxvYyhuX2VsZW1lbnRzLCBlbGVtZW50X3NpemUpCisj
ZGVmaW5lIHJlYWxsb2MocCwgbikgICAgICAgICAgICAgICAgICAgICAgIGZhc3RSZWFsbG9jKHAs
IG4pCisjZGVmaW5lIGZyZWUocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhc3RGcmVl
KHApCisjZGVmaW5lIHN0cmR1cChwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhc3RTdHJE
dXAocCkKKworI2Vsc2UKKworI2RlZmluZSBzdHJkdXAocCkgICAgICAgICAgICAgICAgICAgICAg
ICAgICBfc3RyZHVwKHApCisKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRp
ZgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpZiAhZGVmaW5lZChVU0VfU1lTVEVNX01BTExPQykg
fHwgIVVTRV9TWVNURU1fTUFMTE9DCitzdGF0aWMgaW5saW5lIHZvaWQqIF9fY2RlY2wgb3BlcmF0
b3IgbmV3KHNpemVfdCBzKSB7IHJldHVybiBmYXN0TWFsbG9jKHMpOyB9CitzdGF0aWMgaW5saW5l
IHZvaWQgX19jZGVjbCBvcGVyYXRvciBkZWxldGUodm9pZCogcCkgeyBmYXN0RnJlZShwKTsgfQor
c3RhdGljIGlubGluZSB2b2lkKiBfX2NkZWNsIG9wZXJhdG9yIG5ld1tdKHNpemVfdCBzKSB7IHJl
dHVybiBmYXN0TWFsbG9jKHMpOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgX19jZGVjbCBvcGVyYXRv
ciBkZWxldGVbXSh2b2lkKiBwKSB7IGZhc3RGcmVlKHApOyB9CitzdGF0aWMgaW5saW5lIHZvaWQq
IG9wZXJhdG9yIG5ldyhzaXplX3QgcywgY29uc3Qgc3RkOjpub3Rocm93X3QmKSB0aHJvdygpIHsg
cmV0dXJuIGZhc3RNYWxsb2Mocyk7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciBkZWxl
dGUodm9pZCogcCwgY29uc3Qgc3RkOjpub3Rocm93X3QmKSB0aHJvdygpIHsgZmFzdEZyZWUocCk7
IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCogb3BlcmF0b3IgbmV3W10oc2l6ZV90IHMsIGNvbnN0IHN0
ZDo6bm90aHJvd190JikgdGhyb3coKSB7IHJldHVybiBmYXN0TWFsbG9jKHMpOyB9CitzdGF0aWMg
aW5saW5lIHZvaWQgb3BlcmF0b3IgZGVsZXRlW10odm9pZCogcCwgY29uc3Qgc3RkOjpub3Rocm93
X3QmKSB0aHJvdygpIHsgZmFzdEZyZWUocCk7IH0KKyNlbmRpZgorCituYW1lc3BhY2UgV1RGIHsK
KyAgICAvLyBUaGlzIGRlZmluZXMgYSB0eXBlIHdoaWNoIGhvbGRzIGFuIHVuc2lnbmVkIGludGVn
ZXIgYW5kIGlzIHRoZSBzYW1lCisgICAgLy8gc2l6ZSBhcyB0aGUgbWluaW1hbGx5IGFsaWduZWQg
bWVtb3J5IGFsbG9jYXRpb24uCisgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgQWxsb2NB
bGlnbm1lbnRJbnRlZ2VyOworCisgICAgbmFtZXNwYWNlIEludGVybmFsIHsKKyAgICAgICAgZW51
bSBBbGxvY1R5cGUgeyAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgd2l0aCBhbiB1bnVzdWFs
IG51bWJlciBpbnN0ZWFkIG9mIHplcm8sIGJlY2F1c2UgemVybyBpcyBjb21tb24uCisgICAgICAg
ICAgICBBbGxvY1R5cGVNYWxsb2MgPSAweDM3NWQ2NzUwLCAgIC8vIEVuY29tcGFzc2VzIGZhc3RN
YWxsb2MsIGZhc3RaZXJvZWRNYWxsb2MsIGZhc3RDYWxsb2MsIGZhc3RSZWFsbG9jLgorICAgICAg
ICAgICAgQWxsb2NUeXBlQ2xhc3NOZXcsICAgICAgICAgICAgICAvLyBFbmNvbXBhc3NlcyBjbGFz
cyBvcGVyYXRvciBuZXcgZnJvbSBGYXN0QWxsb2NCYXNlLgorICAgICAgICAgICAgQWxsb2NUeXBl
Q2xhc3NOZXdBcnJheSwgICAgICAgICAvLyBFbmNvbXBhc3NlcyBjbGFzcyBvcGVyYXRvciBuZXdb
XSBmcm9tIEZhc3RBbGxvY0Jhc2UuCisgICAgICAgICAgICBBbGxvY1R5cGVGYXN0TmV3LCAgICAg
ICAgICAgICAgIC8vIEVuY29tcGFzc2VzIGZhc3ROZXcuCisgICAgICAgICAgICBBbGxvY1R5cGVG
YXN0TmV3QXJyYXksICAgICAgICAgIC8vIEVuY29tcGFzc2VzIGZhc3ROZXdBcnJheS4KKyAgICAg
ICAgICAgIEFsbG9jVHlwZU5ldywgICAgICAgICAgICAgICAgICAgLy8gRW5jb21wYXNzZXMgZ2xv
YmFsIG9wZXJhdG9yIG5ldy4KKyAgICAgICAgICAgIEFsbG9jVHlwZU5ld0FycmF5ICAgICAgICAg
ICAgICAgLy8gRW5jb21wYXNzZXMgZ2xvYmFsIG9wZXJhdG9yIG5ld1tdLgorICAgICAgICB9Owor
ICAgIH0KKworCisjaWYgRU5BQkxFKEZBU1RfTUFMTE9DX01BVENIX1ZBTElEQVRJT04pCisKKyAg
ICAvLyBNYWxsb2MgdmFsaWRhdGlvbiBpcyBhIHNjaGVtZSB3aGVyZWJ5IGEgdGFnIGlzIGF0dGFj
aGVkIHRvIGFuCisgICAgLy8gYWxsb2NhdGlvbiB3aGljaCBpZGVudGlmaWVzIGhvdyBpdCB3YXMg
b3JpZ2luYWxseSBhbGxvY2F0ZWQuCisgICAgLy8gVGhpcyBhbGxvd3MgdXMgdG8gdmVyaWZ5IHRo
YXQgdGhlIGZyZWVpbmcgb3BlcmF0aW9uIG1hdGNoZXMgdGhlCisgICAgLy8gYWxsb2NhdGlvbiBv
cGVyYXRpb24uIElmIG1lbW9yeSBpcyBhbGxvY2F0ZWQgd2l0aCBvcGVyYXRvciBuZXdbXQorICAg
IC8vIGJ1dCBmcmVlZCB3aXRoIGZyZWUgb3IgZGVsZXRlLCB0aGlzIHN5c3RlbSB3b3VsZCBkZXRl
Y3QgdGhhdC4KKyAgICAvLyBJbiB0aGUgaW1wbGVtZW50YXRpb24gaGVyZSwgdGhlIHRhZyBpcyBh
biBpbnRlZ2VyIHByZXBlbmRlZCB0bworICAgIC8vIHRoZSBhbGxvY2F0aW9uIG1lbW9yeSB3aGlj
aCBpcyBhc3NpZ25lZCBvbmUgb2YgdGhlIEFsbG9jVHlwZQorICAgIC8vIGVudW1lcmF0aW9uIHZh
bHVlcy4gQW4gYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgdGhpcworICAgIC8vIHNjaGVt
ZSBjb3VsZCBzdG9yZSB0aGUgdGFnIHNvbWV3aGVyZSBlbHNlIG9yIGlnbm9yZSBpdC4KKyAgICAv
LyBVc2VycyBvZiBGYXN0TWFsbG9jIGRvbid0IG5lZWQgdG8ga25vdyBvciBjYXJlIGhvdyB0aGlz
IHRhZ2dpbmcKKyAgICAvLyBpcyBpbXBsZW1lbnRlZC4KKworICAgIG5hbWVzcGFjZSBJbnRlcm5h
bCB7CisKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBBbGxvY1R5cGUgdGFnIGFzc29jaWF0ZWQgd2l0
aCB0aGUgYWxsb2NhdGVkIGJsb2NrIHAuCisgICAgICAgIGlubGluZSBBbGxvY1R5cGUgZmFzdE1h
bGxvY01hdGNoVmFsaWRhdGlvblR5cGUoY29uc3Qgdm9pZCogcCkKKyAgICAgICAgeworICAgICAg
ICAgICAgY29uc3QgQWxsb2NBbGlnbm1lbnRJbnRlZ2VyKiB0eXBlID0gc3RhdGljX2Nhc3Q8Y29u
c3QgQWxsb2NBbGlnbm1lbnRJbnRlZ2VyKj4ocCkgLSAxOworICAgICAgICAgICAgcmV0dXJuIHN0
YXRpY19jYXN0PEFsbG9jVHlwZT4oKnR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0
dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBBbGxvY1R5cGUgdGFnIGFzc29jaWF0ZWQgd2l0aCB0aGUg
YWxsb2NhdGVkIGJsb2NrIHAuCisgICAgICAgIGlubGluZSBBbGxvY0FsaWdubWVudEludGVnZXIq
IGZhc3RNYWxsb2NNYXRjaFZhbGlkYXRpb25WYWx1ZSh2b2lkKiBwKQorICAgICAgICB7CisgICAg
ICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxBbGxvY0FsaWdubWVudEludGVnZXIqPihz
dGF0aWNfY2FzdDxjaGFyKj4ocCkgLSBzaXplb2YoQWxsb2NBbGlnbm1lbnRJbnRlZ2VyKSk7Cisg
ICAgICAgIH0KKworICAgICAgICAvLyBTZXQgdGhlIEFsbG9jVHlwZSB0YWcgdG8gYmUgYXNzb2Np
YWdlZCB3aXRoIHRoZSBhbGxvY2F0ZWQgYmxvY2sgcC4KKyAgICAgICAgaW5saW5lIHZvaWQgc2V0
RmFzdE1hbGxvY01hdGNoVmFsaWRhdGlvblR5cGUodm9pZCogcCwgQWxsb2NUeXBlIGFsbG9jVHlw
ZSkKKyAgICAgICAgeworICAgICAgICAgICAgQWxsb2NBbGlnbm1lbnRJbnRlZ2VyKiB0eXBlID0g
c3RhdGljX2Nhc3Q8QWxsb2NBbGlnbm1lbnRJbnRlZ2VyKj4ocCkgLSAxOworICAgICAgICAgICAg
KnR5cGUgPSBzdGF0aWNfY2FzdDxBbGxvY0FsaWdubWVudEludGVnZXI+KGFsbG9jVHlwZSk7Cisg
ICAgICAgIH0KKworICAgICAgICAvLyBIYW5kbGUgYSBkZXRlY3RlZCBhbGxvYy9mcmVlIG1pc21h
dGNoLiBCeSBkZWZhdWx0IHRoaXMgY2FsbHMgQ1JBU0goKS4KKyAgICAgICAgdm9pZCBmYXN0TWFs
bG9jTWF0Y2hGYWlsZWQodm9pZCogcCk7CisKKyAgICB9IC8vIG5hbWVzcGFjZSBJbnRlcm5hbAor
CisgICAgLy8gVGhpcyBpcyBhIGhpZ2hlciBsZXZlbCBmdW5jdGlvbiB3aGljaCBpcyB1c2VkIGJ5
IEZhc3RNYWxsb2MtdXNpbmcgY29kZS4KKyAgICBpbmxpbmUgdm9pZCBmYXN0TWFsbG9jTWF0Y2hW
YWxpZGF0ZU1hbGxvYyh2b2lkKiBwLCBJbnRlcm5hbDo6QWxsb2NUeXBlIGFsbG9jVHlwZSkKKyAg
ICB7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBJbnRl
cm5hbDo6c2V0RmFzdE1hbGxvY01hdGNoVmFsaWRhdGlvblR5cGUocCwgYWxsb2NUeXBlKTsKKyAg
ICB9CisKKyAgICAvLyBUaGlzIGlzIGEgaGlnaGVyIGxldmVsIGZ1bmN0aW9uIHdoaWNoIGlzIHVz
ZWQgYnkgRmFzdE1hbGxvYy11c2luZyBjb2RlLgorICAgIGlubGluZSB2b2lkIGZhc3RNYWxsb2NN
YXRjaFZhbGlkYXRlRnJlZSh2b2lkKiBwLCBJbnRlcm5hbDo6QWxsb2NUeXBlIGFsbG9jVHlwZSkK
KyAgICB7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBp
ZiAoSW50ZXJuYWw6OmZhc3RNYWxsb2NNYXRjaFZhbGlkYXRpb25UeXBlKHApICE9IGFsbG9jVHlw
ZSkKKyAgICAgICAgICAgIEludGVybmFsOjpmYXN0TWFsbG9jTWF0Y2hGYWlsZWQocCk7CisgICAg
ICAgIEludGVybmFsOjpzZXRGYXN0TWFsbG9jTWF0Y2hWYWxpZGF0aW9uVHlwZShwLCBJbnRlcm5h
bDo6QWxsb2NUeXBlTWFsbG9jKTsgIC8vIFNldCBpdCB0byB0aGlzIHNvIHRoYXQgZmFzdEZyZWUg
dGhpbmtzIGl0J3MgT0suCisgICAgfQorCisjZWxzZQorCisgICAgaW5saW5lIHZvaWQgZmFzdE1h
bGxvY01hdGNoVmFsaWRhdGVNYWxsb2Modm9pZCosIEludGVybmFsOjpBbGxvY1R5cGUpCisgICAg
eworICAgIH0KKworICAgIGlubGluZSB2b2lkIGZhc3RNYWxsb2NNYXRjaFZhbGlkYXRlRnJlZSh2
b2lkKiwgSW50ZXJuYWw6OkFsbG9jVHlwZSkKKyAgICB7CisgICAgfQorCisjZW5kaWYKKworfSAv
LyBuYW1lc3BhY2UgV1RGCisKKyNlbmRpZgorCisjZW5kaWYgLy8gRmFzdE1hbGxvY1dpbmNlX2gK
KwpJbmRleDogSmF2YVNjcmlwdENvcmUvd3RmL3dpbmNlL0Zhc3RNYWxsb2NXaW5DRS5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3d0Zi93aW5jZS9GYXN0TWFsbG9jV2luQ0UuaAkocmV2
aXNpb24gNTcyODkpCisrKyBKYXZhU2NyaXB0Q29yZS93dGYvd2luY2UvRmFzdE1hbGxvY1dpbkNF
LmgJKHdvcmtpbmcgY29weSkKQEAgLTE5LDggKzE5LDggQEAKICAqCiAgKi8KIAotI2lmbmRlZiBG
YXN0TWFsbG9jV2luY2VfaAotI2RlZmluZSBGYXN0TWFsbG9jV2luY2VfaAorI2lmbmRlZiBXVEZf
RmFzdE1hbGxvY1dpbkNFX2gKKyNkZWZpbmUgV1RGX0Zhc3RNYWxsb2NXaW5DRV9oCiAKICNpbmNs
dWRlIDxuZXcuaD4KIApAQCAtMTcyLDUgKzE3Miw0IEBAIG5hbWVzcGFjZSBXVEYgewogCiAjZW5k
aWYKIAotI2VuZGlmIC8vIEZhc3RNYWxsb2NXaW5jZV9oCi0KKyNlbmRpZiAvLyBXVEZfRmFzdE1h
bGxvY1dpbkNFX2gKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi93aW5jZS9GYXN0TWFsbG9jV2lu
Y2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvd2luY2UvRmFzdE1hbGxvY1dp
bmNlLmgJKHJldmlzaW9uIDU3Mjg5KQorKysgSmF2YVNjcmlwdENvcmUvd3RmL3dpbmNlL0Zhc3RN
YWxsb2NXaW5jZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDE3NiArMCwwIEBACi0vKgotICogIENv
cHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqCi0gKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogIG1vZGlmeSBpdCB1bmRlciB0
aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gKiAgTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiAg
dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2
ZXJzaW9uLgotICoKLSAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg
dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBv
ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiAgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlv
dSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxl
IENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0gKiAgQm9z
dG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0gKgotICovCi0KLSNpZm5kZWYgRmFzdE1hbGxvY1dp
bmNlX2gKLSNkZWZpbmUgRmFzdE1hbGxvY1dpbmNlX2gKLQotI2luY2x1ZGUgPG5ldy5oPgotCi0j
aWZkZWYgX19jcGx1c3BsdXMKLSNpbmNsdWRlIDxuZXc+Ci0jaW5jbHVkZSAiTWVtb3J5TWFuYWdl
ci5oIgotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotdm9pZCogZmFzdE1hbGxvYyhzaXplX3Qgbik7
Ci12b2lkKiBmYXN0Q2FsbG9jKHNpemVfdCBuX2VsZW1lbnRzLCBzaXplX3QgZWxlbWVudF9zaXpl
KTsKLXZvaWQgZmFzdEZyZWUodm9pZCogcCk7Ci12b2lkKiBmYXN0UmVhbGxvYyh2b2lkKiBwLCBz
aXplX3Qgbik7Ci12b2lkKiBmYXN0WmVyb2VkTWFsbG9jKHNpemVfdCBuKTsKLS8vIFRoZXNlIGZ1
bmN0aW9ucyByZXR1cm4gMCBpZiBhbiBhbGxvY2F0aW9uIGZhaWxzLgotdm9pZCogdHJ5RmFzdE1h
bGxvYyhzaXplX3Qgbik7Ci12b2lkKiB0cnlGYXN0WmVyb2VkTWFsbG9jKHNpemVfdCBuKTsKLXZv
aWQqIHRyeUZhc3RDYWxsb2Moc2l6ZV90IG5fZWxlbWVudHMsIHNpemVfdCBlbGVtZW50X3NpemUp
Owotdm9pZCogdHJ5RmFzdFJlYWxsb2Modm9pZCogcCwgc2l6ZV90IG4pOwotY2hhciogZmFzdFN0
ckR1cChjb25zdCBjaGFyKik7Ci0KLSNpZm5kZWYgTkRFQlVHCi12b2lkIGZhc3RNYWxsb2NGb3Ji
aWQoKTsKLXZvaWQgZmFzdE1hbGxvY0FsbG93KCk7Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkKFVT
RV9TWVNURU1fTUFMTE9DKSB8fCAhVVNFX1NZU1RFTV9NQUxMT0MKLQotI2RlZmluZSBtYWxsb2Mo
bikgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXN0TWFsbG9jKG4pCi0jZGVmaW5lIGNhbGxv
YyhuX2VsZW1lbnRzLCBlbGVtZW50X3NpemUpICAgIGZhc3RDYWxsb2Mobl9lbGVtZW50cywgZWxl
bWVudF9zaXplKQotI2RlZmluZSByZWFsbG9jKHAsIG4pICAgICAgICAgICAgICAgICAgICAgICBm
YXN0UmVhbGxvYyhwLCBuKQotI2RlZmluZSBmcmVlKHApICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBmYXN0RnJlZShwKQotI2RlZmluZSBzdHJkdXAocCkgICAgICAgICAgICAgICAgICAgICAg
ICAgICBmYXN0U3RyRHVwKHApCi0KLSNlbHNlCi0KLSNkZWZpbmUgc3RyZHVwKHApICAgICAgICAg
ICAgICAgICAgICAgICAgICAgX3N0cmR1cChwKQotCi0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNw
bHVzCi19Ci0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jaWYgIWRlZmluZWQoVVNFX1NZ
U1RFTV9NQUxMT0MpIHx8ICFVU0VfU1lTVEVNX01BTExPQwotc3RhdGljIGlubGluZSB2b2lkKiBf
X2NkZWNsIG9wZXJhdG9yIG5ldyhzaXplX3QgcykgeyByZXR1cm4gZmFzdE1hbGxvYyhzKTsgfQot
c3RhdGljIGlubGluZSB2b2lkIF9fY2RlY2wgb3BlcmF0b3IgZGVsZXRlKHZvaWQqIHApIHsgZmFz
dEZyZWUocCk7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCogX19jZGVjbCBvcGVyYXRvciBuZXdbXShz
aXplX3QgcykgeyByZXR1cm4gZmFzdE1hbGxvYyhzKTsgfQotc3RhdGljIGlubGluZSB2b2lkIF9f
Y2RlY2wgb3BlcmF0b3IgZGVsZXRlW10odm9pZCogcCkgeyBmYXN0RnJlZShwKTsgfQotc3RhdGlj
IGlubGluZSB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHMsIGNvbnN0IHN0ZDo6bm90aHJvd190
JikgdGhyb3coKSB7IHJldHVybiBmYXN0TWFsbG9jKHMpOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQg
b3BlcmF0b3IgZGVsZXRlKHZvaWQqIHAsIGNvbnN0IHN0ZDo6bm90aHJvd190JikgdGhyb3coKSB7
IGZhc3RGcmVlKHApOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQqIG9wZXJhdG9yIG5ld1tdKHNpemVf
dCBzLCBjb25zdCBzdGQ6Om5vdGhyb3dfdCYpIHRocm93KCkgeyByZXR1cm4gZmFzdE1hbGxvYyhz
KTsgfQotc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqIHAsIGNvbnN0
IHN0ZDo6bm90aHJvd190JikgdGhyb3coKSB7IGZhc3RGcmVlKHApOyB9Ci0jZW5kaWYKLQotbmFt
ZXNwYWNlIFdURiB7Ci0gICAgLy8gVGhpcyBkZWZpbmVzIGEgdHlwZSB3aGljaCBob2xkcyBhbiB1
bnNpZ25lZCBpbnRlZ2VyIGFuZCBpcyB0aGUgc2FtZQotICAgIC8vIHNpemUgYXMgdGhlIG1pbmlt
YWxseSBhbGlnbmVkIG1lbW9yeSBhbGxvY2F0aW9uLgotICAgIHR5cGVkZWYgdW5zaWduZWQgbG9u
ZyBsb25nIEFsbG9jQWxpZ25tZW50SW50ZWdlcjsKLQotICAgIG5hbWVzcGFjZSBJbnRlcm5hbCB7
Ci0gICAgICAgIGVudW0gQWxsb2NUeXBlIHsgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHdp
dGggYW4gdW51c3VhbCBudW1iZXIgaW5zdGVhZCBvZiB6ZXJvLCBiZWNhdXNlIHplcm8gaXMgY29t
bW9uLgotICAgICAgICAgICAgQWxsb2NUeXBlTWFsbG9jID0gMHgzNzVkNjc1MCwgICAvLyBFbmNv
bXBhc3NlcyBmYXN0TWFsbG9jLCBmYXN0WmVyb2VkTWFsbG9jLCBmYXN0Q2FsbG9jLCBmYXN0UmVh
bGxvYy4KLSAgICAgICAgICAgIEFsbG9jVHlwZUNsYXNzTmV3LCAgICAgICAgICAgICAgLy8gRW5j
b21wYXNzZXMgY2xhc3Mgb3BlcmF0b3IgbmV3IGZyb20gRmFzdEFsbG9jQmFzZS4KLSAgICAgICAg
ICAgIEFsbG9jVHlwZUNsYXNzTmV3QXJyYXksICAgICAgICAgLy8gRW5jb21wYXNzZXMgY2xhc3Mg
b3BlcmF0b3IgbmV3W10gZnJvbSBGYXN0QWxsb2NCYXNlLgotICAgICAgICAgICAgQWxsb2NUeXBl
RmFzdE5ldywgICAgICAgICAgICAgICAvLyBFbmNvbXBhc3NlcyBmYXN0TmV3LgotICAgICAgICAg
ICAgQWxsb2NUeXBlRmFzdE5ld0FycmF5LCAgICAgICAgICAvLyBFbmNvbXBhc3NlcyBmYXN0TmV3
QXJyYXkuCi0gICAgICAgICAgICBBbGxvY1R5cGVOZXcsICAgICAgICAgICAgICAgICAgIC8vIEVu
Y29tcGFzc2VzIGdsb2JhbCBvcGVyYXRvciBuZXcuCi0gICAgICAgICAgICBBbGxvY1R5cGVOZXdB
cnJheSAgICAgICAgICAgICAgIC8vIEVuY29tcGFzc2VzIGdsb2JhbCBvcGVyYXRvciBuZXdbXS4K
LSAgICAgICAgfTsKLSAgICB9Ci0KLQotI2lmIEVOQUJMRShGQVNUX01BTExPQ19NQVRDSF9WQUxJ
REFUSU9OKQotCi0gICAgLy8gTWFsbG9jIHZhbGlkYXRpb24gaXMgYSBzY2hlbWUgd2hlcmVieSBh
IHRhZyBpcyBhdHRhY2hlZCB0byBhbgotICAgIC8vIGFsbG9jYXRpb24gd2hpY2ggaWRlbnRpZmll
cyBob3cgaXQgd2FzIG9yaWdpbmFsbHkgYWxsb2NhdGVkLgotICAgIC8vIFRoaXMgYWxsb3dzIHVz
IHRvIHZlcmlmeSB0aGF0IHRoZSBmcmVlaW5nIG9wZXJhdGlvbiBtYXRjaGVzIHRoZQotICAgIC8v
IGFsbG9jYXRpb24gb3BlcmF0aW9uLiBJZiBtZW1vcnkgaXMgYWxsb2NhdGVkIHdpdGggb3BlcmF0
b3IgbmV3W10KLSAgICAvLyBidXQgZnJlZWQgd2l0aCBmcmVlIG9yIGRlbGV0ZSwgdGhpcyBzeXN0
ZW0gd291bGQgZGV0ZWN0IHRoYXQuCi0gICAgLy8gSW4gdGhlIGltcGxlbWVudGF0aW9uIGhlcmUs
IHRoZSB0YWcgaXMgYW4gaW50ZWdlciBwcmVwZW5kZWQgdG8KLSAgICAvLyB0aGUgYWxsb2NhdGlv
biBtZW1vcnkgd2hpY2ggaXMgYXNzaWduZWQgb25lIG9mIHRoZSBBbGxvY1R5cGUKLSAgICAvLyBl
bnVtZXJhdGlvbiB2YWx1ZXMuIEFuIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMK
LSAgICAvLyBzY2hlbWUgY291bGQgc3RvcmUgdGhlIHRhZyBzb21ld2hlcmUgZWxzZSBvciBpZ25v
cmUgaXQuCi0gICAgLy8gVXNlcnMgb2YgRmFzdE1hbGxvYyBkb24ndCBuZWVkIHRvIGtub3cgb3Ig
Y2FyZSBob3cgdGhpcyB0YWdnaW5nCi0gICAgLy8gaXMgaW1wbGVtZW50ZWQuCi0KLSAgICBuYW1l
c3BhY2UgSW50ZXJuYWwgewotCi0gICAgICAgIC8vIFJldHVybiB0aGUgQWxsb2NUeXBlIHRhZyBh
c3NvY2lhdGVkIHdpdGggdGhlIGFsbG9jYXRlZCBibG9jayBwLgotICAgICAgICBpbmxpbmUgQWxs
b2NUeXBlIGZhc3RNYWxsb2NNYXRjaFZhbGlkYXRpb25UeXBlKGNvbnN0IHZvaWQqIHApCi0gICAg
ICAgIHsKLSAgICAgICAgICAgIGNvbnN0IEFsbG9jQWxpZ25tZW50SW50ZWdlciogdHlwZSA9IHN0
YXRpY19jYXN0PGNvbnN0IEFsbG9jQWxpZ25tZW50SW50ZWdlcio+KHApIC0gMTsKLSAgICAgICAg
ICAgIHJldHVybiBzdGF0aWNfY2FzdDxBbGxvY1R5cGU+KCp0eXBlKTsKLSAgICAgICAgfQotCi0g
ICAgICAgIC8vIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgQWxsb2NUeXBlIHRhZyBhc3NvY2lh
dGVkIHdpdGggdGhlIGFsbG9jYXRlZCBibG9jayBwLgotICAgICAgICBpbmxpbmUgQWxsb2NBbGln
bm1lbnRJbnRlZ2VyKiBmYXN0TWFsbG9jTWF0Y2hWYWxpZGF0aW9uVmFsdWUodm9pZCogcCkKLSAg
ICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8QWxsb2NBbGlnbm1l
bnRJbnRlZ2VyKj4oc3RhdGljX2Nhc3Q8Y2hhcio+KHApIC0gc2l6ZW9mKEFsbG9jQWxpZ25tZW50
SW50ZWdlcikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBBbGxvY1R5cGUgdGFn
IHRvIGJlIGFzc29jaWFnZWQgd2l0aCB0aGUgYWxsb2NhdGVkIGJsb2NrIHAuCi0gICAgICAgIGlu
bGluZSB2b2lkIHNldEZhc3RNYWxsb2NNYXRjaFZhbGlkYXRpb25UeXBlKHZvaWQqIHAsIEFsbG9j
VHlwZSBhbGxvY1R5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFsbG9jQWxpZ25tZW50SW50
ZWdlciogdHlwZSA9IHN0YXRpY19jYXN0PEFsbG9jQWxpZ25tZW50SW50ZWdlcio+KHApIC0gMTsK
LSAgICAgICAgICAgICp0eXBlID0gc3RhdGljX2Nhc3Q8QWxsb2NBbGlnbm1lbnRJbnRlZ2VyPihh
bGxvY1R5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSGFuZGxlIGEgZGV0ZWN0ZWQgYWxs
b2MvZnJlZSBtaXNtYXRjaC4gQnkgZGVmYXVsdCB0aGlzIGNhbGxzIENSQVNIKCkuCi0gICAgICAg
IHZvaWQgZmFzdE1hbGxvY01hdGNoRmFpbGVkKHZvaWQqIHApOwotCi0gICAgfSAvLyBuYW1lc3Bh
Y2UgSW50ZXJuYWwKLQotICAgIC8vIFRoaXMgaXMgYSBoaWdoZXIgbGV2ZWwgZnVuY3Rpb24gd2hp
Y2ggaXMgdXNlZCBieSBGYXN0TWFsbG9jLXVzaW5nIGNvZGUuCi0gICAgaW5saW5lIHZvaWQgZmFz
dE1hbGxvY01hdGNoVmFsaWRhdGVNYWxsb2Modm9pZCogcCwgSW50ZXJuYWw6OkFsbG9jVHlwZSBh
bGxvY1R5cGUpCi0gICAgewotICAgICAgICBpZiAoIXApCi0gICAgICAgICAgICByZXR1cm47Ci0K
LSAgICAgICAgSW50ZXJuYWw6OnNldEZhc3RNYWxsb2NNYXRjaFZhbGlkYXRpb25UeXBlKHAsIGFs
bG9jVHlwZSk7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBpcyBhIGhpZ2hlciBsZXZlbCBmdW5jdGlv
biB3aGljaCBpcyB1c2VkIGJ5IEZhc3RNYWxsb2MtdXNpbmcgY29kZS4KLSAgICBpbmxpbmUgdm9p
ZCBmYXN0TWFsbG9jTWF0Y2hWYWxpZGF0ZUZyZWUodm9pZCogcCwgSW50ZXJuYWw6OkFsbG9jVHlw
ZSBhbGxvY1R5cGUpCi0gICAgewotICAgICAgICBpZiAoIXApCi0gICAgICAgICAgICByZXR1cm47
Ci0KLSAgICAgICAgaWYgKEludGVybmFsOjpmYXN0TWFsbG9jTWF0Y2hWYWxpZGF0aW9uVHlwZShw
KSAhPSBhbGxvY1R5cGUpCi0gICAgICAgICAgICBJbnRlcm5hbDo6ZmFzdE1hbGxvY01hdGNoRmFp
bGVkKHApOwotICAgICAgICBJbnRlcm5hbDo6c2V0RmFzdE1hbGxvY01hdGNoVmFsaWRhdGlvblR5
cGUocCwgSW50ZXJuYWw6OkFsbG9jVHlwZU1hbGxvYyk7ICAvLyBTZXQgaXQgdG8gdGhpcyBzbyB0
aGF0IGZhc3RGcmVlIHRoaW5rcyBpdCdzIE9LLgotICAgIH0KLQotI2Vsc2UKLQotICAgIGlubGlu
ZSB2b2lkIGZhc3RNYWxsb2NNYXRjaFZhbGlkYXRlTWFsbG9jKHZvaWQqLCBJbnRlcm5hbDo6QWxs
b2NUeXBlKQotICAgIHsKLSAgICB9Ci0KLSAgICBpbmxpbmUgdm9pZCBmYXN0TWFsbG9jTWF0Y2hW
YWxpZGF0ZUZyZWUodm9pZCosIEludGVybmFsOjpBbGxvY1R5cGUpCi0gICAgewotICAgIH0KLQot
I2VuZGlmCi0KLX0gLy8gbmFtZXNwYWNlIFdURgotCi0jZW5kaWYKLQotI2VuZGlmIC8vIEZhc3RN
YWxsb2NXaW5jZV9oCi0K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>52908</attachid>
            <date>2010-04-08 15:56:29 -0700</date>
            <delta_ts>2010-09-18 13:45:46 -0700</delta_ts>
            <desc>The patch - part 2 (WebCore)</desc>
            <filename>bug-37287-WebCore.patch</filename>
            <type>text/plain</type>
            <size>569228</size>
            <attacher name="Patrick R. Gansterer">paroga</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NzI5NikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTM1IEBACisyMDEwLTA0LTA4ICBQYXRyaWNrIFJvbGFuZCBHYW5zdGVyZXIgIDxw
YXJvZ2FAcGFyb2dhLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4K
KworICAgICAgICBSZW5hbWUgV2luY2UgZmlsZXMgdG8gV2luQ0UuCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNzI4NworCisgICAgICAgICogbG9hZGVy
L2ljb24vd2luY2UvSWNvbkRhdGFiYXNlV2luQ0UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBsb2Fk
ZXIvaWNvbi93aW5jZS9JY29uRGF0YWJhc2VXaW5jZS5jcHA6IFJlbW92ZWQuCisgICAgICAgICog
cGFnZS93aW5jZS9GcmFtZVdpbkNFLmNwcDogQWRkZWQuCisgICAgICAgICogcGFnZS93aW5jZS9G
cmFtZVdpbmNlLmNwcDogUmVtb3ZlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9NZWRp
YVBsYXllci5jcHA6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvQ29sb3JXaW5D
RS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0NvbG9yV2lu
Y2UuY3BwOiBSZW1vdmVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ZvbnRD
YWNoZVdpbkNFLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2Uv
Rm9udENhY2hlV2luY2UuY3BwOiBSZW1vdmVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L3dpbmNlL0ZvbnRQbGF0Zm9ybURhdGEuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93
aW5jZS9Gb250V2luQ0UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93
aW5jZS9Gb250V2luY2UuY3BwOiBSZW1vdmVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L3dpbmNlL0dseXBoUGFnZVRyZWVOb2RlV2luQ0UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9HbHlwaFBhZ2VUcmVlTm9kZVdpbmNlLmNwcDogUmVtb3ZlZC4K
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HcmFkaWVudFdpbkNFLmNwcDogQWRk
ZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvR3JhZGllbnRXaW5jZS5jcHA6
IFJlbW92ZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvR3JhcGhpY3NDb250
ZXh0V2luQ0UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9H
cmFwaGljc0NvbnRleHRXaW5jZS5jcHA6IFJlbW92ZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luY2UvSW1hZ2VCdWZmZXJXaW5DRS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlQnVmZmVyV2luY2UuY3BwOiBSZW1vdmVkLgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01lZGlhUGxheWVyUHJpdmF0ZVdpbkNFLmg6IEFk
ZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01lZGlhUGxheWVyUHJpdmF0
ZVdpbmNlLmg6IFJlbW92ZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGF0
aFdpbkNFLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGF0
aFdpbmNlLmNwcDogUmVtb3ZlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9Q
bGF0Zm9ybVBhdGhXaW5DRS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L3dpbmNlL1BsYXRmb3JtUGF0aFdpbkNFLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL3dpbmNlL1BsYXRmb3JtUGF0aFdpbmNlLmNwcDogUmVtb3ZlZC4KKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QbGF0Zm9ybVBhdGhXaW5jZS5oOiBSZW1vdmVkLgorICAg
ICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NpbXBsZUZvbnREYXRhV2luQ0UuY3BwOiBB
ZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaW1wbGVGb250RGF0YVdp
bmNlLmNwcDogUmVtb3ZlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9XaW5D
RUdyYXBoaWNzRXh0cmFzLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL1dpbmNlR3JhcGhpY3NFeHRyYXMuaDogUmVtb3ZlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS90
ZXh0L1RleHRFbmNvZGluZ1JlZ2lzdHJ5LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmJ1aWxkQmFz
ZVRleHRDb2RlY01hcHMpOgorICAgICAgICAoV2ViQ29yZTo6ZXh0ZW5kVGV4dENvZGVjTWFwcyk6
CisgICAgICAgICogcGxhdGZvcm0vdGV4dC93aW5jZS9UZXh0Qm91bmRhcmllc1dpbkNFLmNwcDog
QWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vdGV4dC93aW5jZS9UZXh0Qm91bmRhcmllc1dpbmNl
LmNwcDogUmVtb3ZlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS90ZXh0L3dpbmNlL1RleHRCcmVha0l0
ZXJhdG9yV2luQ0UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS90ZXh0L3dpbmNlL1Rl
eHRCcmVha0l0ZXJhdG9yV2luY2UuY3BwOiBSZW1vdmVkLgorICAgICAgICAqIHBsYXRmb3JtL3dp
bmNlL0N1cnNvcldpbkNFLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vd2luY2UvQ3Vy
c29yV2luY2UuY3BwOiBSZW1vdmVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0RyYWdEYXRh
V2luQ0UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9EcmFnRGF0YVdpbmNl
LmNwcDogUmVtb3ZlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9EcmFnSW1hZ2VXaW5DRS5j
cHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0RyYWdJbWFnZVdpbmNlLmNwcDog
UmVtb3ZlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9FZGl0b3JXaW5DRS5jcHA6IEFkZGVk
LgorICAgICAgICAoV2ViQ29yZTo6RWRpdG9yOjpuZXdHZW5lcmFsQ2xpcGJvYXJkKToKKyAgICAg
ICAgKiBwbGF0Zm9ybS93aW5jZS9FZGl0b3JXaW5jZS5jcHA6IFJlbW92ZWQuCisgICAgICAgICog
cGxhdGZvcm0vd2luY2UvRmlsZUNob29zZXJXaW5DRS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBs
YXRmb3JtL3dpbmNlL0ZpbGVDaG9vc2VyV2luY2UuY3BwOiBSZW1vdmVkLgorICAgICAgICAqIHBs
YXRmb3JtL3dpbmNlL0ZpbGVTeXN0ZW1XaW5DRS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRm
b3JtL3dpbmNlL0ZpbGVTeXN0ZW1XaW5jZS5jcHA6IFJlbW92ZWQuCisgICAgICAgICogcGxhdGZv
cm0vd2luY2UvS1VSTFdpbkNFLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vd2luY2Uv
S1VSTFdpbmNlLmNwcDogUmVtb3ZlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9LZXlnZW5X
aW5DRS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0tleWdlbldpbmNlLmNw
cDogUmVtb3ZlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9NSU1FVHlwZVJlZ2lzdHJ5V2lu
Q0UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9NSU1FVHlwZVJlZ2lzdHJ5
V2luY2UuY3BwOiBSZW1vdmVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL1Bhc3RlYm9hcmRX
aW5DRS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL1Bhc3RlYm9hcmRXaW5j
ZS5jcHA6IFJlbW92ZWQuCisgICAgICAgICogcGxhdGZvcm0vd2luY2UvU2VhcmNoUG9wdXBNZW51
V2luQ0UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9TZWFyY2hQb3B1cE1l
bnVXaW5jZS5jcHA6IFJlbW92ZWQuCisgICAgICAgICogcGxhdGZvcm0vd2luY2UvU2hhcmVkVGlt
ZXJXaW5jZS5jcHA6IFJlbW92ZWQuCisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlclRoZW1lV2lu
Q0UuLmg6IEFkZGVkLgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUaGVtZVdpbkNFLmNwcDog
QWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZVdpbkNFOjpjcmVhdGUpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWU6OnRoZW1lRm9yUGFnZSk6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJUaGVtZVdpbkNFOjpSZW5kZXJUaGVtZVdpbkNFKToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlclRoZW1lV2luQ0U6On5SZW5kZXJUaGVtZVdpbkNFKToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlclRoZW1lV2luQ0U6OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENv
bG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6OnBsYXRmb3JtSW5hY3Rp
dmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhl
bWVXaW5DRTo6cGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6cGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkZv
cmVncm91bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZVdpbkNFOjpzdXBw
b3J0c0ZvY3VzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6OnN1cHBvcnRz
Rm9jdXNSaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6OmRldGVybWlu
ZUNsYXNzaWNTdGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZVdpbkNFOjpnZXRU
aGVtZURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6cGFpbnRCdXR0
b24pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6c2V0Q2hlY2tib3hTaXpl
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6OnBhaW50VGV4dEZpZWxkKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6OmFkanVzdE1lbnVMaXN0U3R5bGUp
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6cGFpbnRNZW51TGlzdCk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZVdpbkNFOjpwYWludE1lbnVMaXN0QnV0dG9uKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6OnN5c3RlbUZvbnQpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6dGhlbWVDaGFuZ2VkKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6OmV4dHJhRGVmYXVsdFN0eWxlU2hlZXQpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6ZXh0cmFRdWlya3NTdHlsZVNoZWV0KToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6OnN1cHBvcnRzSG92ZXIpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6c3lzdGVtQ29sb3IpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6YWRqdXN0U2xpZGVyVGh1bWJTaXplKToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6OmFkanVzdEJ1dHRvbklubmVyU3R5bGUpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6YWRqdXN0U2VhcmNoRmllbGRTdHlsZSk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZVdpbkNFOjpwYWludFNlYXJjaEZpZWxkKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6OnBhaW50U2VhcmNoRmllbGRDYW5j
ZWxCdXR0b24pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6YWRqdXN0U2Vh
cmNoRmllbGRDYW5jZWxCdXR0b25TdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZVdpbkNFOjphZGp1c3RTZWFyY2hGaWVsZERlY29yYXRpb25TdHlsZSk6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJUaGVtZVdpbkNFOjphZGp1c3RTZWFyY2hGaWVsZFJlc3VsdHNEZWNvcmF0aW9u
U3R5bGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6cGFpbnRTZWFyY2hG
aWVsZFJlc3VsdHNEZWNvcmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2lu
Q0U6OmFkanVzdFNlYXJjaEZpZWxkUmVzdWx0c0J1dHRvblN0eWxlKToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlclRoZW1lV2luQ0U6OnBhaW50U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uKToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6OmFkanVzdE1lbnVMaXN0QnV0dG9uU3R5
bGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6cGFpbnRTbGlkZXJUcmFj
ayk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZVdpbkNFOjpwYWludFNsaWRlclRodW1i
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6OmJ1dHRvbkludGVybmFsUGFk
ZGluZ0xlZnQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6YnV0dG9uSW50
ZXJuYWxQYWRkaW5nUmlnaHQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6
YnV0dG9uSW50ZXJuYWxQYWRkaW5nVG9wKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1l
V2luQ0U6OmJ1dHRvbkludGVybmFsUGFkZGluZ0JvdHRvbSk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJUaGVtZVdpbkNFOjpwYWludE1lZGlhRnVsbHNjcmVlbkJ1dHRvbik6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUaGVtZVdpbkNFOjpwYWludE1lZGlhTXV0ZUJ1dHRvbik6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJUaGVtZVdpbkNFOjpwYWludE1lZGlhUGxheUJ1dHRvbik6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZVdpbkNFOjpwYWludE1lZGlhU2Vla0JhY2tCdXR0b24p
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVXaW5DRTo6cGFpbnRNZWRpYVNlZWtGb3J3
YXJkQnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luQ0U6OnBhaW50TWVk
aWFTbGlkZXJUcmFjayk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZVdpbkNFOjpwYWlu
dE1lZGlhU2xpZGVyVGh1bWIpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUaGVtZVdpbmNl
LmNwcDogUmVtb3ZlZC4KKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGhlbWVXaW5jZS5oOiBS
ZW1vdmVkLgorICAgICAgICAqIHN0b3JhZ2Uvd2luY2UvRGF0YWJhc2VUaHJlYWRXaW5DRS5jcHA6
IEFkZGVkLgorICAgICAgICAqIHN0b3JhZ2Uvd2luY2UvRGF0YWJhc2VUaHJlYWRXaW5DRS5oOiBB
ZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL3dpbmNlL0RhdGFiYXNlVGhyZWFkV2luY2UuY3BwOiBS
ZW1vdmVkLgorICAgICAgICAqIHN0b3JhZ2Uvd2luY2UvRGF0YWJhc2VUaHJlYWRXaW5jZS5oOiBS
ZW1vdmVkLgorICAgICAgICAqIHN0b3JhZ2Uvd2luY2UvTG9jYWxTdG9yYWdlVGhyZWFkV2luQ0Uu
Y3BwOiBBZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL3dpbmNlL0xvY2FsU3RvcmFnZVRocmVhZFdp
bkNFLmg6IEFkZGVkLgorICAgICAgICAqIHN0b3JhZ2Uvd2luY2UvTG9jYWxTdG9yYWdlVGhyZWFk
V2luY2UuY3BwOiBSZW1vdmVkLgorICAgICAgICAqIHN0b3JhZ2Uvd2luY2UvTG9jYWxTdG9yYWdl
VGhyZWFkV2luY2UuaDogUmVtb3ZlZC4KKwogMjAxMC0wNC0wNyAgRGF2aWQgSHlhdHQgIDxoeWF0
dEBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgT2xpdmVyIEh1bnQuCkluZGV4OiBX
ZWJDb3JlL2xvYWRlci9pY29uL3dpbmNlL0ljb25EYXRhYmFzZVdpbkNFLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL2xvYWRlci9pY29uL3dpbmNlL0ljb25EYXRhYmFzZVdpbkNFLmNwcAkocmV2
aXNpb24gNTcyODkpCShmcm9tIFdlYkNvcmUvbG9hZGVyL2ljb24vd2luY2UvSWNvbkRhdGFiYXNl
V2luY2UuY3BwOjU3Mjg5KQorKysgV2ViQ29yZS9sb2FkZXIvaWNvbi93aW5jZS9JY29uRGF0YWJh
c2VXaW5DRS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqICBDb3B5
cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUgSW5jLgorICoKKyAqICBUaGlzIGxpYnJh
cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAg
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmli
dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VU
IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAg
TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl
IHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0
YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJy
YXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0
aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkljb25EYXRhYmFzZS5oIgorCisjaW5jbHVkZSAi
QXV0b2RyYWluZWRQb29sLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIKKyNpbmNsdWRl
ICJGaWxlU3lzdGVtLmgiCisjaW5jbHVkZSAiSWNvbkRhdGFiYXNlQ2xpZW50LmgiCisjaW5jbHVk
ZSAiSWNvblJlY29yZC5oIgorI2luY2x1ZGUgIkltYWdlLmgiCisjaW5jbHVkZSA8d3RmL3RleHQv
Q1N0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIEZ1bmN0aW9uIHRvIG9idGFp
biB0aGUgZ2xvYmFsIGljb24gZGF0YWJhc2UuCitJY29uRGF0YWJhc2UqIGljb25EYXRhYmFzZSgp
IHsgcmV0dXJuIDA7IH0KKworSWNvbkRhdGFiYXNlOjpJY29uRGF0YWJhc2UoKSB7fQorSWNvbkRh
dGFiYXNlOjp+SWNvbkRhdGFiYXNlKCkge30KKwordm9pZCBJY29uRGF0YWJhc2U6OnNldENsaWVu
dChJY29uRGF0YWJhc2VDbGllbnQqKSB7fQorCitib29sIEljb25EYXRhYmFzZTo6b3Blbihjb25z
dCBTdHJpbmcmIHBhdGgpIHsgcmV0dXJuIGZhbHNlOyB9Cit2b2lkIEljb25EYXRhYmFzZTo6Y2xv
c2UoKSB7fQorCit2b2lkIEljb25EYXRhYmFzZTo6cmVtb3ZlQWxsSWNvbnMoKSB7fQorCitJbWFn
ZSogSWNvbkRhdGFiYXNlOjppY29uRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmLCBjb25zdCBJbnRT
aXplJikgeyByZXR1cm4gMDsgfQordm9pZCBJY29uRGF0YWJhc2U6OnJlYWRJY29uRm9yUGFnZVVS
TEZyb21EaXNrKGNvbnN0IFN0cmluZyYpIHt9CitTdHJpbmcgSWNvbkRhdGFiYXNlOjppY29uVVJM
Rm9yUGFnZVVSTChjb25zdCBTdHJpbmcmKSB7IHJldHVybiBTdHJpbmcoKTsgfQorSW1hZ2UqIElj
b25EYXRhYmFzZTo6ZGVmYXVsdEljb24oY29uc3QgSW50U2l6ZSYpIHsgcmV0dXJuIDA7fQorCit2
b2lkIEljb25EYXRhYmFzZTo6cmV0YWluSWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJikge30K
K3ZvaWQgSWNvbkRhdGFiYXNlOjpyZWxlYXNlSWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJikg
e30KKwordm9pZCBJY29uRGF0YWJhc2U6OnNldEljb25EYXRhRm9ySWNvblVSTChQYXNzUmVmUHRy
PFNoYXJlZEJ1ZmZlcj4gZGF0YSwgY29uc3QgU3RyaW5nJikge30KK3ZvaWQgSWNvbkRhdGFiYXNl
OjpzZXRJY29uVVJMRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmIGljb25VUkwsIGNvbnN0IFN0cmlu
ZyYgcGFnZVVSTCkge30KKworSWNvbkxvYWREZWNpc2lvbiBJY29uRGF0YWJhc2U6OmxvYWREZWNp
c2lvbkZvckljb25VUkwoY29uc3QgU3RyaW5nJiwgRG9jdW1lbnRMb2FkZXIqKSB7IHJldHVybiBJ
Y29uTG9hZE5vOyB9Citib29sIEljb25EYXRhYmFzZTo6aWNvbkRhdGFLbm93bkZvckljb25VUkwo
Y29uc3QgU3RyaW5nJikgeyByZXR1cm4gZmFsc2U7IH0KKwordm9pZCBJY29uRGF0YWJhc2U6OnNl
dEVuYWJsZWQoYm9vbCBlbmFibGVkKSB7fQorYm9vbCBJY29uRGF0YWJhc2U6OmlzRW5hYmxlZCgp
IGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKK3ZvaWQgSWNvbkRhdGFiYXNlOjpzZXRQcml2YXRl
QnJvd3NpbmdFbmFibGVkKGJvb2wgZmxhZykge30KK2Jvb2wgSWNvbkRhdGFiYXNlOjppc1ByaXZh
dGVCcm93c2luZ0VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCit2b2lkIEljb25E
YXRhYmFzZTo6ZGVsYXlEYXRhYmFzZUNsZWFudXAoKSB7fQordm9pZCBJY29uRGF0YWJhc2U6OmFs
bG93RGF0YWJhc2VDbGVhbnVwKCkge30KK3ZvaWQgSWNvbkRhdGFiYXNlOjpjaGVja0ludGVncml0
eUJlZm9yZU9wZW5pbmcoKSB7fQorCisvLyBTdXBwb3J0IGZvciBXZWJDb3JlU3RhdGlzdGljcyBp
biBXZWJLaXQKK3NpemVfdCBJY29uRGF0YWJhc2U6OnBhZ2VVUkxNYXBwaW5nQ291bnQoKSB7IHJl
dHVybiAwOyB9CitzaXplX3QgSWNvbkRhdGFiYXNlOjpyZXRhaW5lZFBhZ2VVUkxDb3VudCgpIHty
ZXR1cm4gMDsgfQorc2l6ZV90IEljb25EYXRhYmFzZTo6aWNvblJlY29yZENvdW50KCkgeyByZXR1
cm4gMDsgfQorc2l6ZV90IEljb25EYXRhYmFzZTo6aWNvblJlY29yZENvdW50V2l0aERhdGEoKSB7
IHJldHVybiAwOyB9CisKK2Jvb2wgSWNvbkRhdGFiYXNlOjppc09wZW4oKSBjb25zdCB7IHJldHVy
biBmYWxzZTsgfQorU3RyaW5nIEljb25EYXRhYmFzZTo6ZGF0YWJhc2VQYXRoKCkgY29uc3QgeyBy
ZXR1cm4gU3RyaW5nKCk7IH0KK1N0cmluZyBJY29uRGF0YWJhc2U6OmRlZmF1bHREYXRhYmFzZUZp
bGVuYW1lKCkgeyByZXR1cm4gU3RyaW5nKCk7IH0KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJ
bmRleDogV2ViQ29yZS9sb2FkZXIvaWNvbi93aW5jZS9JY29uRGF0YWJhc2VXaW5jZS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9sb2FkZXIvaWNvbi93aW5jZS9JY29uRGF0YWJhc2VXaW5jZS5j
cHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9sb2FkZXIvaWNvbi93aW5jZS9JY29uRGF0
YWJhc2VXaW5jZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqICBD
b3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUgSW5jLgotICoKLSAqICBUaGlzIGxp
YnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0g
KiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMKLSAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uOyBlaXRoZXIKLSAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3Vy
IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMgbGlicmFyeSBpcyBkaXN0
cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRI
T1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0g
KiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg
U2VlIHRoZSBHTlUKLSAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg
ZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBs
aWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiAg
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG
aWZ0aCBGbG9vciwKLSAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqCi0gKi8KLQot
I2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkljb25EYXRhYmFzZS5oIgotCi0jaW5jbHVk
ZSAiQXV0b2RyYWluZWRQb29sLmgiCi0jaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIKLSNpbmNs
dWRlICJGaWxlU3lzdGVtLmgiCi0jaW5jbHVkZSAiSWNvbkRhdGFiYXNlQ2xpZW50LmgiCi0jaW5j
bHVkZSAiSWNvblJlY29yZC5oIgotI2luY2x1ZGUgIkltYWdlLmgiCi0jaW5jbHVkZSA8d3RmL3Rl
eHQvQ1N0cmluZy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLS8vIEZ1bmN0aW9uIHRvIG9i
dGFpbiB0aGUgZ2xvYmFsIGljb24gZGF0YWJhc2UuCi1JY29uRGF0YWJhc2UqIGljb25EYXRhYmFz
ZSgpIHsgcmV0dXJuIDA7IH0KLQotSWNvbkRhdGFiYXNlOjpJY29uRGF0YWJhc2UoKSB7fQotSWNv
bkRhdGFiYXNlOjp+SWNvbkRhdGFiYXNlKCkge30KLQotdm9pZCBJY29uRGF0YWJhc2U6OnNldENs
aWVudChJY29uRGF0YWJhc2VDbGllbnQqKSB7fQotCi1ib29sIEljb25EYXRhYmFzZTo6b3Blbihj
b25zdCBTdHJpbmcmIHBhdGgpIHsgcmV0dXJuIGZhbHNlOyB9Ci12b2lkIEljb25EYXRhYmFzZTo6
Y2xvc2UoKSB7fQotCi12b2lkIEljb25EYXRhYmFzZTo6cmVtb3ZlQWxsSWNvbnMoKSB7fQotCi1J
bWFnZSogSWNvbkRhdGFiYXNlOjppY29uRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmLCBjb25zdCBJ
bnRTaXplJikgeyByZXR1cm4gMDsgfQotdm9pZCBJY29uRGF0YWJhc2U6OnJlYWRJY29uRm9yUGFn
ZVVSTEZyb21EaXNrKGNvbnN0IFN0cmluZyYpIHt9Ci1TdHJpbmcgSWNvbkRhdGFiYXNlOjppY29u
VVJMRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmKSB7IHJldHVybiBTdHJpbmcoKTsgfQotSW1hZ2Uq
IEljb25EYXRhYmFzZTo6ZGVmYXVsdEljb24oY29uc3QgSW50U2l6ZSYpIHsgcmV0dXJuIDA7fQot
Ci12b2lkIEljb25EYXRhYmFzZTo6cmV0YWluSWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJikg
e30KLXZvaWQgSWNvbkRhdGFiYXNlOjpyZWxlYXNlSWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5n
Jikge30KLQotdm9pZCBJY29uRGF0YWJhc2U6OnNldEljb25EYXRhRm9ySWNvblVSTChQYXNzUmVm
UHRyPFNoYXJlZEJ1ZmZlcj4gZGF0YSwgY29uc3QgU3RyaW5nJikge30KLXZvaWQgSWNvbkRhdGFi
YXNlOjpzZXRJY29uVVJMRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmIGljb25VUkwsIGNvbnN0IFN0
cmluZyYgcGFnZVVSTCkge30KLQotSWNvbkxvYWREZWNpc2lvbiBJY29uRGF0YWJhc2U6OmxvYWRE
ZWNpc2lvbkZvckljb25VUkwoY29uc3QgU3RyaW5nJiwgRG9jdW1lbnRMb2FkZXIqKSB7IHJldHVy
biBJY29uTG9hZE5vOyB9Ci1ib29sIEljb25EYXRhYmFzZTo6aWNvbkRhdGFLbm93bkZvckljb25V
UkwoY29uc3QgU3RyaW5nJikgeyByZXR1cm4gZmFsc2U7IH0KLQotdm9pZCBJY29uRGF0YWJhc2U6
OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKSB7fQotYm9vbCBJY29uRGF0YWJhc2U6OmlzRW5hYmxl
ZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLXZvaWQgSWNvbkRhdGFiYXNlOjpzZXRQcml2
YXRlQnJvd3NpbmdFbmFibGVkKGJvb2wgZmxhZykge30KLWJvb2wgSWNvbkRhdGFiYXNlOjppc1By
aXZhdGVCcm93c2luZ0VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi12b2lkIElj
b25EYXRhYmFzZTo6ZGVsYXlEYXRhYmFzZUNsZWFudXAoKSB7fQotdm9pZCBJY29uRGF0YWJhc2U6
OmFsbG93RGF0YWJhc2VDbGVhbnVwKCkge30KLXZvaWQgSWNvbkRhdGFiYXNlOjpjaGVja0ludGVn
cml0eUJlZm9yZU9wZW5pbmcoKSB7fQotCi0vLyBTdXBwb3J0IGZvciBXZWJDb3JlU3RhdGlzdGlj
cyBpbiBXZWJLaXQKLXNpemVfdCBJY29uRGF0YWJhc2U6OnBhZ2VVUkxNYXBwaW5nQ291bnQoKSB7
IHJldHVybiAwOyB9Ci1zaXplX3QgSWNvbkRhdGFiYXNlOjpyZXRhaW5lZFBhZ2VVUkxDb3VudCgp
IHtyZXR1cm4gMDsgfQotc2l6ZV90IEljb25EYXRhYmFzZTo6aWNvblJlY29yZENvdW50KCkgeyBy
ZXR1cm4gMDsgfQotc2l6ZV90IEljb25EYXRhYmFzZTo6aWNvblJlY29yZENvdW50V2l0aERhdGEo
KSB7IHJldHVybiAwOyB9Ci0KLWJvb2wgSWNvbkRhdGFiYXNlOjppc09wZW4oKSBjb25zdCB7IHJl
dHVybiBmYWxzZTsgfQotU3RyaW5nIEljb25EYXRhYmFzZTo6ZGF0YWJhc2VQYXRoKCkgY29uc3Qg
eyByZXR1cm4gU3RyaW5nKCk7IH0KLVN0cmluZyBJY29uRGF0YWJhc2U6OmRlZmF1bHREYXRhYmFz
ZUZpbGVuYW1lKCkgeyByZXR1cm4gU3RyaW5nKCk7IH0KLQotfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQpJbmRleDogV2ViQ29yZS9wYWdlL3dpbmNlL0ZyYW1lV2luQ0UuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGFnZS93aW5jZS9GcmFtZVdpbkNFLmNwcAkocmV2aXNpb24gNTcyODkpCShmcm9t
IFdlYkNvcmUvcGFnZS93aW5jZS9GcmFtZVdpbmNlLmNwcDo1NzI4OSkKKysrIFdlYkNvcmUvcGFn
ZS93aW5jZS9GcmFtZVdpbkNFLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE2OCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRF
UiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVS
LCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgorCisjaW5jbHVk
ZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJFZGl0b3JDbGllbnQuaCIKKyNpbmNsdWRlICJGbG9h
dFJlY3QuaCIKKyNpbmNsdWRlICJGcmFtZUxvYWRlci5oIgorI2luY2x1ZGUgIkZyYW1lTG9hZFJl
cXVlc3QuaCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRl
eHQuaCIKKyNpbmNsdWRlICJIVE1MSUZyYW1lRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxOYW1l
cy5oIgorI2luY2x1ZGUgIkhUTUxUYWJsZUNlbGxFbGVtZW50LmgiCisjaW5jbHVkZSAiS2V5Ym9h
cmRFdmVudC5oIgorI2luY2x1ZGUgIk5QX2pzb2JqZWN0LmgiCisjaW5jbHVkZSAibnBydW50aW1l
X2ltcGwuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAiUGx1Z2luLmgiCisjaW5jbHVk
ZSAiUmVndWxhckV4cHJlc3Npb24uaCIKKyNpbmNsdWRlICJSZW5kZXJGcmFtZS5oIgorI2luY2x1
ZGUgIlJlbmRlclRhYmxlQ2VsbC5oIgorI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKKyNpbmNsdWRl
ICJSZXNvdXJjZUhhbmRsZS5oIgorI2luY2x1ZGUgInJ1bnRpbWVfcm9vdC5oIgorI2luY2x1ZGUg
IlNldHRpbmdzLmgiCisjaW5jbHVkZSAiVGV4dFJlc291cmNlRGVjb2Rlci5oIgorCisjaW5jbHVk
ZSA8d2luZG93cy5oPgorCit1c2luZyBzdGQ6Om1pbjsKKworbmFtZXNwYWNlIFdlYkNvcmUgewor
Cit1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOworCitleHRlcm4gSERDIGdfc2NyZWVuREM7CisK
K3ZvaWQgY29tcHV0ZVBhZ2VSZWN0c0ZvckZyYW1lKEZyYW1lKiBmcmFtZSwgY29uc3QgSW50UmVj
dCYgcHJpbnRSZWN0LCBmbG9hdCBoZWFkZXJIZWlnaHQsIGZsb2F0IGZvb3RlckhlaWdodCwgZmxv
YXQgdXNlclNjYWxlRmFjdG9yLCBWZWN0b3I8SW50UmVjdD4mIHBhZ2VzLCBpbnQmIG91dFBhZ2VI
ZWlnaHQpCit7CisgICAgQVNTRVJUKGZyYW1lKTsKKworICAgIHBhZ2VzLmNsZWFyKCk7CisgICAg
b3V0UGFnZUhlaWdodCA9IDA7CisKKyAgICBpZiAoIWZyYW1lLT5kb2N1bWVudCgpIHx8ICFmcmFt
ZS0+dmlldygpIHx8ICFmcmFtZS0+ZG9jdW1lbnQoKS0+cmVuZGVyZXIoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgUmVuZGVyVmlldyogcm9vdCA9IHRvUmVuZGVyVmlldyhmcmFtZS0+ZG9jdW1l
bnQoKS0+cmVuZGVyZXIoKSk7CisKKyAgICBpZiAoIXJvb3QpIHsKKyAgICAgICAgTE9HX0VSUk9S
KCJkb2N1bWVudCB0byBiZSBwcmludGVkIGhhcyBubyByZW5kZXJlciIpOworICAgICAgICByZXR1
cm47CisgICAgfQorCisgICAgaWYgKHVzZXJTY2FsZUZhY3RvciA8PSAwKSB7CisgICAgICAgIExP
R19FUlJPUigidXNlclNjYWxlRmFjdG9yIGhhcyBiYWQgdmFsdWUgJS4yZiIsIHVzZXJTY2FsZUZh
Y3Rvcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmbG9hdCByYXRpbyA9IChmbG9h
dClwcmludFJlY3QuaGVpZ2h0KCkgLyAoZmxvYXQpcHJpbnRSZWN0LndpZHRoKCk7CisKKyAgICBm
bG9hdCBwYWdlV2lkdGggID0gKGZsb2F0KSByb290LT5vdmVyZmxvd1dpZHRoKCk7CisgICAgZmxv
YXQgcGFnZUhlaWdodCA9IHBhZ2VXaWR0aCAqIHJhdGlvOworICAgIG91dFBhZ2VIZWlnaHQgPSAo
aW50KSBwYWdlSGVpZ2h0OyAgIC8vIHRoaXMgaXMgdGhlIGhlaWdodCBvZiB0aGUgcGFnZSBhZGp1
c3RlZCBieSBtYXJnaW5zCisgICAgcGFnZUhlaWdodCAtPSAoaGVhZGVySGVpZ2h0ICsgZm9vdGVy
SGVpZ2h0KTsKKworICAgIGlmIChwYWdlSGVpZ2h0IDw9IDApIHsKKyAgICAgICAgTE9HX0VSUk9S
KCJwYWdlSGVpZ2h0IGhhcyBiYWQgdmFsdWUgJS4yZiIsIHBhZ2VIZWlnaHQpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgZmxvYXQgY3VyclBhZ2VIZWlnaHQgPSBwYWdlSGVpZ2h0IC8g
dXNlclNjYWxlRmFjdG9yOworICAgIGZsb2F0IGRvY0hlaWdodCAgICAgID0gcm9vdC0+bGF5ZXIo
KS0+aGVpZ2h0KCk7CisgICAgZmxvYXQgZG9jV2lkdGggICAgICAgPSByb290LT5sYXllcigpLT53
aWR0aCgpOworICAgIGZsb2F0IGN1cnJQYWdlV2lkdGggID0gcGFnZVdpZHRoIC8gdXNlclNjYWxl
RmFjdG9yOworCisKKyAgICAvLyBhbHdheXMgcmV0dXJuIGF0IGxlYXN0IG9uZSBwYWdlLCBzaW5j
ZSBlbXB0eSBmaWxlcyBzaG91bGQgcHJpbnQgYSBibGFuayBwYWdlCisgICAgZmxvYXQgcHJpbnRl
ZFBhZ2VzSGVpZ2h0ID0gMC4wOworICAgIGRvIHsKKyAgICAgICAgZmxvYXQgcHJvcG9zZWRCb3R0
b20gPSBtaW4oZG9jSGVpZ2h0LCBwcmludGVkUGFnZXNIZWlnaHQgKyBwYWdlSGVpZ2h0KTsKKyAg
ICAgICAgZnJhbWUtPnZpZXcoKS0+YWRqdXN0UGFnZUhlaWdodCgmcHJvcG9zZWRCb3R0b20sIHBy
aW50ZWRQYWdlc0hlaWdodCwgcHJvcG9zZWRCb3R0b20sIHByaW50ZWRQYWdlc0hlaWdodCk7Cisg
ICAgICAgIGN1cnJQYWdlSGVpZ2h0ID0gbWF4KDEuMGYsIHByb3Bvc2VkQm90dG9tIC0gcHJpbnRl
ZFBhZ2VzSGVpZ2h0KTsKKworICAgICAgICBwYWdlcy5hcHBlbmQoSW50UmVjdCgwLCBwcmludGVk
UGFnZXNIZWlnaHQsIGN1cnJQYWdlV2lkdGgsIGN1cnJQYWdlSGVpZ2h0KSk7CisgICAgICAgIHBy
aW50ZWRQYWdlc0hlaWdodCArPSBjdXJyUGFnZUhlaWdodDsKKyAgICB9IHdoaWxlIChwcmludGVk
UGFnZXNIZWlnaHQgPCBkb2NIZWlnaHQpOworfQorCitIQklUTUFQIGltYWdlRnJvbVNlbGVjdGlv
bihGcmFtZSogZnJhbWUsIGJvb2wgZm9yY2VCbGFja1RleHQpCit7CisgICAgaWYgKCFmcmFtZS0+
dmlldygpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZyYW1lLT52aWV3KCktPnNldFBhaW50
UmVzdHJpY3Rpb24oZm9yY2VCbGFja1RleHQgPyBQYWludFJlc3RyaWN0aW9uU2VsZWN0aW9uT25s
eUJsYWNrVGV4dCA6IFBhaW50UmVzdHJpY3Rpb25TZWxlY3Rpb25Pbmx5KTsKKyAgICBGbG9hdFJl
Y3QgZnIgPSBmcmFtZS0+c2VsZWN0aW9uQm91bmRzKCk7CisgICAgSW50UmVjdCBpcigoaW50KWZy
LngoKSwgKGludClmci55KCksIChpbnQpZnIud2lkdGgoKSwgKGludClmci5oZWlnaHQoKSk7Cisg
ICAgaWYgKGlyLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpbnQgdzsKKyAg
ICBpbnQgaDsKKyAgICBGcmFtZVZpZXcqIHZpZXcgPSBmcmFtZS0+dmlldygpOworICAgIGlmICh2
aWV3LT5wYXJlbnQoKSkgeworICAgICAgICBpci5zZXRMb2NhdGlvbih2aWV3LT5wYXJlbnQoKS0+
Y29udmVydENoaWxkVG9TZWxmKHZpZXcsIGlyLmxvY2F0aW9uKCkpKTsKKyAgICAgICAgdyA9IGly
LndpZHRoKCkgKiB2aWV3LT5zY2FsZSgpICsgMC41OworICAgICAgICBoID0gaXIuaGVpZ2h0KCkg
KiB2aWV3LT5zY2FsZSgpICsgMC41OworICAgIH0gZWxzZSB7CisgICAgICAgIGlyID0gdmlldy0+
Y29udGVudHNUb1dpbmRvdyhpcik7CisgICAgICAgIHcgPSBpci53aWR0aCgpOworICAgICAgICBo
ID0gaXIuaGVpZ2h0KCk7CisgICAgfQorCisgICAgT3duUHRyPEhEQz4gYm1wREMoQ3JlYXRlQ29t
cGF0aWJsZURDKGdfc2NyZWVuREMpKTsKKyAgICBIQklUTUFQIGhCbXAgPSBNZW1vcnlNYW5hZ2Vy
OjpjcmVhdGVDb21wYXRpYmxlQml0bWFwKGdfc2NyZWVuREMsIHcsIGgpOworICAgIGlmICghaEJt
cCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBIQklUTUFQIGhibXBPbGQgPSAoSEJJVE1BUClT
ZWxlY3RPYmplY3QoYm1wREMuZ2V0KCksIGhCbXApOworCisgICAgeworICAgICAgICBHcmFwaGlj
c0NvbnRleHQgZ2MoYm1wREMuZ2V0KCkpOworICAgICAgICBmcmFtZS0+ZG9jdW1lbnQoKS0+dXBk
YXRlTGF5b3V0KCk7CisgICAgICAgIHZpZXctPnBhaW50KCZnYywgaXIpOworICAgIH0KKworICAg
IFNlbGVjdE9iamVjdChibXBEQy5nZXQoKSwgaGJtcE9sZCk7CisKKyAgICBmcmFtZS0+dmlldygp
LT5zZXRQYWludFJlc3RyaWN0aW9uKFBhaW50UmVzdHJpY3Rpb25Ob25lKTsKKworICAgIHJldHVy
biBoQm1wOworfQorCitEcmFnSW1hZ2VSZWYgRnJhbWU6OmRyYWdJbWFnZUZvclNlbGVjdGlvbigp
Cit7CisgICAgaWYgKHNlbGVjdGlvbigpLT5pc1JhbmdlKCkpCisgICAgICAgIHJldHVybiBpbWFn
ZUZyb21TZWxlY3Rpb24odGhpcywgZmFsc2UpOworCisgICAgcmV0dXJuIDA7Cit9CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGFnZS93aW5jZS9GcmFtZVdpbmNlLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BhZ2Uvd2luY2UvRnJhbWVXaW5jZS5jcHAJKHJldmlz
aW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wYWdlL3dpbmNlL0ZyYW1lV2luY2UuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0xLDE2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3
IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDct
MjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwot
ICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2lu
Y2x1ZGUgIkZyYW1lLmgiCi0KLSNpbmNsdWRlICJEb2N1bWVudC5oIgotI2luY2x1ZGUgIkVkaXRv
ckNsaWVudC5oIgotI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgotI2luY2x1ZGUgIkZyYW1lTG9hZGVy
LmgiCi0jaW5jbHVkZSAiRnJhbWVMb2FkUmVxdWVzdC5oIgotI2luY2x1ZGUgIkZyYW1lVmlldy5o
IgotI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgotI2luY2x1ZGUgIkhUTUxJRnJhbWVFbGVt
ZW50LmgiCi0jaW5jbHVkZSAiSFRNTE5hbWVzLmgiCi0jaW5jbHVkZSAiSFRNTFRhYmxlQ2VsbEVs
ZW1lbnQuaCIKLSNpbmNsdWRlICJLZXlib2FyZEV2ZW50LmgiCi0jaW5jbHVkZSAiTlBfanNvYmpl
Y3QuaCIKLSNpbmNsdWRlICJucHJ1bnRpbWVfaW1wbC5oIgotI2luY2x1ZGUgIlBhZ2UuaCIKLSNp
bmNsdWRlICJQbHVnaW4uaCIKLSNpbmNsdWRlICJSZWd1bGFyRXhwcmVzc2lvbi5oIgotI2luY2x1
ZGUgIlJlbmRlckZyYW1lLmgiCi0jaW5jbHVkZSAiUmVuZGVyVGFibGVDZWxsLmgiCi0jaW5jbHVk
ZSAiUmVuZGVyVmlldy5oIgotI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlLmgiCi0jaW5jbHVkZSAi
cnVudGltZV9yb290LmgiCi0jaW5jbHVkZSAiU2V0dGluZ3MuaCIKLSNpbmNsdWRlICJUZXh0UmVz
b3VyY2VEZWNvZGVyLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLXVzaW5nIHN0ZDo6bWlu
OwotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7Ci0K
LWV4dGVybiBIREMgZ19zY3JlZW5EQzsKLQotdm9pZCBjb21wdXRlUGFnZVJlY3RzRm9yRnJhbWUo
RnJhbWUqIGZyYW1lLCBjb25zdCBJbnRSZWN0JiBwcmludFJlY3QsIGZsb2F0IGhlYWRlckhlaWdo
dCwgZmxvYXQgZm9vdGVySGVpZ2h0LCBmbG9hdCB1c2VyU2NhbGVGYWN0b3IsIFZlY3RvcjxJbnRS
ZWN0PiYgcGFnZXMsIGludCYgb3V0UGFnZUhlaWdodCkKLXsKLSAgICBBU1NFUlQoZnJhbWUpOwot
Ci0gICAgcGFnZXMuY2xlYXIoKTsKLSAgICBvdXRQYWdlSGVpZ2h0ID0gMDsKLQotICAgIGlmICgh
ZnJhbWUtPmRvY3VtZW50KCkgfHwgIWZyYW1lLT52aWV3KCkgfHwgIWZyYW1lLT5kb2N1bWVudCgp
LT5yZW5kZXJlcigpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBSZW5kZXJWaWV3KiByb290ID0g
dG9SZW5kZXJWaWV3KGZyYW1lLT5kb2N1bWVudCgpLT5yZW5kZXJlcigpKTsKLQotICAgIGlmICgh
cm9vdCkgewotICAgICAgICBMT0dfRVJST1IoImRvY3VtZW50IHRvIGJlIHByaW50ZWQgaGFzIG5v
IHJlbmRlcmVyIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAodXNlclNjYWxl
RmFjdG9yIDw9IDApIHsKLSAgICAgICAgTE9HX0VSUk9SKCJ1c2VyU2NhbGVGYWN0b3IgaGFzIGJh
ZCB2YWx1ZSAlLjJmIiwgdXNlclNjYWxlRmFjdG9yKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0K
LQotICAgIGZsb2F0IHJhdGlvID0gKGZsb2F0KXByaW50UmVjdC5oZWlnaHQoKSAvIChmbG9hdClw
cmludFJlY3Qud2lkdGgoKTsKLQotICAgIGZsb2F0IHBhZ2VXaWR0aCAgPSAoZmxvYXQpIHJvb3Qt
Pm92ZXJmbG93V2lkdGgoKTsKLSAgICBmbG9hdCBwYWdlSGVpZ2h0ID0gcGFnZVdpZHRoICogcmF0
aW87Ci0gICAgb3V0UGFnZUhlaWdodCA9IChpbnQpIHBhZ2VIZWlnaHQ7ICAgLy8gdGhpcyBpcyB0
aGUgaGVpZ2h0IG9mIHRoZSBwYWdlIGFkanVzdGVkIGJ5IG1hcmdpbnMKLSAgICBwYWdlSGVpZ2h0
IC09IChoZWFkZXJIZWlnaHQgKyBmb290ZXJIZWlnaHQpOwotCi0gICAgaWYgKHBhZ2VIZWlnaHQg
PD0gMCkgewotICAgICAgICBMT0dfRVJST1IoInBhZ2VIZWlnaHQgaGFzIGJhZCB2YWx1ZSAlLjJm
IiwgcGFnZUhlaWdodCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmbG9hdCBjdXJy
UGFnZUhlaWdodCA9IHBhZ2VIZWlnaHQgLyB1c2VyU2NhbGVGYWN0b3I7Ci0gICAgZmxvYXQgZG9j
SGVpZ2h0ICAgICAgPSByb290LT5sYXllcigpLT5oZWlnaHQoKTsKLSAgICBmbG9hdCBkb2NXaWR0
aCAgICAgICA9IHJvb3QtPmxheWVyKCktPndpZHRoKCk7Ci0gICAgZmxvYXQgY3VyclBhZ2VXaWR0
aCAgPSBwYWdlV2lkdGggLyB1c2VyU2NhbGVGYWN0b3I7Ci0KLQotICAgIC8vIGFsd2F5cyByZXR1
cm4gYXQgbGVhc3Qgb25lIHBhZ2UsIHNpbmNlIGVtcHR5IGZpbGVzIHNob3VsZCBwcmludCBhIGJs
YW5rIHBhZ2UKLSAgICBmbG9hdCBwcmludGVkUGFnZXNIZWlnaHQgPSAwLjA7Ci0gICAgZG8gewot
ICAgICAgICBmbG9hdCBwcm9wb3NlZEJvdHRvbSA9IG1pbihkb2NIZWlnaHQsIHByaW50ZWRQYWdl
c0hlaWdodCArIHBhZ2VIZWlnaHQpOwotICAgICAgICBmcmFtZS0+dmlldygpLT5hZGp1c3RQYWdl
SGVpZ2h0KCZwcm9wb3NlZEJvdHRvbSwgcHJpbnRlZFBhZ2VzSGVpZ2h0LCBwcm9wb3NlZEJvdHRv
bSwgcHJpbnRlZFBhZ2VzSGVpZ2h0KTsKLSAgICAgICAgY3VyclBhZ2VIZWlnaHQgPSBtYXgoMS4w
ZiwgcHJvcG9zZWRCb3R0b20gLSBwcmludGVkUGFnZXNIZWlnaHQpOwotCi0gICAgICAgIHBhZ2Vz
LmFwcGVuZChJbnRSZWN0KDAsIHByaW50ZWRQYWdlc0hlaWdodCwgY3VyclBhZ2VXaWR0aCwgY3Vy
clBhZ2VIZWlnaHQpKTsKLSAgICAgICAgcHJpbnRlZFBhZ2VzSGVpZ2h0ICs9IGN1cnJQYWdlSGVp
Z2h0OwotICAgIH0gd2hpbGUgKHByaW50ZWRQYWdlc0hlaWdodCA8IGRvY0hlaWdodCk7Ci19Ci0K
LUhCSVRNQVAgaW1hZ2VGcm9tU2VsZWN0aW9uKEZyYW1lKiBmcmFtZSwgYm9vbCBmb3JjZUJsYWNr
VGV4dCkKLXsKLSAgICBpZiAoIWZyYW1lLT52aWV3KCkpCi0gICAgICAgIHJldHVybiAwOwotCi0g
ICAgZnJhbWUtPnZpZXcoKS0+c2V0UGFpbnRSZXN0cmljdGlvbihmb3JjZUJsYWNrVGV4dCA/IFBh
aW50UmVzdHJpY3Rpb25TZWxlY3Rpb25Pbmx5QmxhY2tUZXh0IDogUGFpbnRSZXN0cmljdGlvblNl
bGVjdGlvbk9ubHkpOwotICAgIEZsb2F0UmVjdCBmciA9IGZyYW1lLT5zZWxlY3Rpb25Cb3VuZHMo
KTsKLSAgICBJbnRSZWN0IGlyKChpbnQpZnIueCgpLCAoaW50KWZyLnkoKSwgKGludClmci53aWR0
aCgpLCAoaW50KWZyLmhlaWdodCgpKTsKLSAgICBpZiAoaXIuaXNFbXB0eSgpKQotICAgICAgICBy
ZXR1cm4gMDsKLQotICAgIGludCB3OwotICAgIGludCBoOwotICAgIEZyYW1lVmlldyogdmlldyA9
IGZyYW1lLT52aWV3KCk7Ci0gICAgaWYgKHZpZXctPnBhcmVudCgpKSB7Ci0gICAgICAgIGlyLnNl
dExvY2F0aW9uKHZpZXctPnBhcmVudCgpLT5jb252ZXJ0Q2hpbGRUb1NlbGYodmlldywgaXIubG9j
YXRpb24oKSkpOwotICAgICAgICB3ID0gaXIud2lkdGgoKSAqIHZpZXctPnNjYWxlKCkgKyAwLjU7
Ci0gICAgICAgIGggPSBpci5oZWlnaHQoKSAqIHZpZXctPnNjYWxlKCkgKyAwLjU7Ci0gICAgfSBl
bHNlIHsKLSAgICAgICAgaXIgPSB2aWV3LT5jb250ZW50c1RvV2luZG93KGlyKTsKLSAgICAgICAg
dyA9IGlyLndpZHRoKCk7Ci0gICAgICAgIGggPSBpci5oZWlnaHQoKTsKLSAgICB9Ci0KLSAgICBP
d25QdHI8SERDPiBibXBEQyhDcmVhdGVDb21wYXRpYmxlREMoZ19zY3JlZW5EQykpOwotICAgIEhC
SVRNQVAgaEJtcCA9IE1lbW9yeU1hbmFnZXI6OmNyZWF0ZUNvbXBhdGlibGVCaXRtYXAoZ19zY3Jl
ZW5EQywgdywgaCk7Ci0gICAgaWYgKCFoQm1wKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIEhC
SVRNQVAgaGJtcE9sZCA9IChIQklUTUFQKVNlbGVjdE9iamVjdChibXBEQy5nZXQoKSwgaEJtcCk7
Ci0KLSAgICB7Ci0gICAgICAgIEdyYXBoaWNzQ29udGV4dCBnYyhibXBEQy5nZXQoKSk7Ci0gICAg
ICAgIGZyYW1lLT5kb2N1bWVudCgpLT51cGRhdGVMYXlvdXQoKTsKLSAgICAgICAgdmlldy0+cGFp
bnQoJmdjLCBpcik7Ci0gICAgfQotCi0gICAgU2VsZWN0T2JqZWN0KGJtcERDLmdldCgpLCBoYm1w
T2xkKTsKLQotICAgIGZyYW1lLT52aWV3KCktPnNldFBhaW50UmVzdHJpY3Rpb24oUGFpbnRSZXN0
cmljdGlvbk5vbmUpOwotCi0gICAgcmV0dXJuIGhCbXA7Ci19Ci0KLURyYWdJbWFnZVJlZiBGcmFt
ZTo6ZHJhZ0ltYWdlRm9yU2VsZWN0aW9uKCkKLXsKLSAgICBpZiAoc2VsZWN0aW9uKCktPmlzUmFu
Z2UoKSkKLSAgICAgICAgcmV0dXJuIGltYWdlRnJvbVNlbGVjdGlvbih0aGlzLCBmYWxzZSk7Ci0K
LSAgICByZXR1cm4gMDsKLX0KLQotfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9NZWRpYVBsYXllci5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9NZWRpYVBsYXllci5jcHAJKHJldmlzaW9uIDU3Mjg5KQorKysg
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9NZWRpYVBsYXllci5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTQ0LDcgKzQ0LDcgQEAKICNpZiBQTEFURk9STShNQUMpCiAjaW5jbHVkZSAiTWVkaWFQbGF5
ZXJQcml2YXRlUVRLaXQuaCIKICNlbGlmIE9TKFdJTkNFKSAmJiAhUExBVEZPUk0oUVQpCi0jaW5j
bHVkZSAiTWVkaWFQbGF5ZXJQcml2YXRlV2luY2UuaCIKKyNpbmNsdWRlICJNZWRpYVBsYXllclBy
aXZhdGVXaW5DRS5oIgogI2VsaWYgUExBVEZPUk0oV0lOKQogI2luY2x1ZGUgIk1lZGlhUGxheWVy
UHJpdmF0ZVF1aWNrVGltZVdpbi5oIgogI2VsaWYgUExBVEZPUk0oR1RLKQpJbmRleDogV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9Db2xvcldpbkNFLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0NvbG9yV2luQ0UuY3BwCShyZXZpc2lvbiA1
NzI4OSkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9Db2xvcldpbmNlLmNw
cDo1NzI4OSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvQ29sb3JXaW5DRS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMp
IDIwMDctMjAwOCBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZy
ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBp
dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAg
TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0
aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4g
dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FS
UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
CisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2Vl
IHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3Is
CisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJDb2xvci5oIgorCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQu
aCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitDb2xvciBmb2N1c1JpbmdDb2xvcigpCit7Cisg
ICAgcmV0dXJuIENvbG9yKDAsIDAsIDApOworfQorCit2b2lkIHNldEZvY3VzUmluZ0NvbG9yQ2hh
bmdlRnVuY3Rpb24odm9pZCAoKikoKSkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL0NvbG9yV2luY2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luY2UvQ29sb3JXaW5jZS5jcHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9Db2xvcldpbmNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSwz
OCArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRvcmNoIE1vYmlsZSwg
SW5jLgotICoKLSAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqICB2ZXJzaW9uIDIgb2YgdGhl
IExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICog
IFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
dXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqICBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQot
ICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJ
ZiBub3QsIHdyaXRlIHRvCi0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwg
NTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqICBCb3N0b24sIE1BIDAyMTEwLTEz
MDEsIFVTQS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkNvbG9y
LmgiCi0KLSNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7
Ci0KLUNvbG9yIGZvY3VzUmluZ0NvbG9yKCkKLXsKLSAgICByZXR1cm4gQ29sb3IoMCwgMCwgMCk7
Ci19Ci0KLXZvaWQgc2V0Rm9jdXNSaW5nQ29sb3JDaGFuZ2VGdW5jdGlvbih2b2lkICgqKSgpKQot
ewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5k
ZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvRm9udENhY2hlV2luQ0UuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvRm9udENhY2hlV2lu
Q0UuY3BwCShyZXZpc2lvbiA1NzI4OSkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW5jZS9Gb250Q2FjaGVXaW5jZS5jcHA6NTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbmNlL0ZvbnRDYWNoZVdpbkNFLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM1
MiBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4gIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmls
ZSwgSW5jLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisqIGFyZSBtZXQ6CisqCisqIDEu
ICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLiAKKyogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisqICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisq
ICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLiAKKyogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0
ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyogICAgIGl0cyBjb250cmlidXRv
cnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyog
ICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVy
bWlzc2lvbi4gCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElU
UyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyogV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRQorKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMg
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisqIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsKKyogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisqIE9OIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkZvbnRDYWNoZS5oIgorCisjaW5jbHVkZSAiRm9udC5oIgorI2luY2x1
ZGUgIkZvbnREYXRhLmgiCisjaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIKKyNpbmNsdWRlICJV
bmljb2RlUmFuZ2UuaCIKKyNpbmNsdWRlICJ3dGYvT3duUHRyLmgiCisKKyNpbmNsdWRlIDx3aW5k
b3dzLmg+CisjaW5jbHVkZSA8bWxhbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitleHRl
cm4gSERDIGdfc2NyZWVuREM7CisKK3N0YXRpYyBJTXVsdGlMYW5ndWFnZSAqbXVsdGlMYW5ndWFn
ZSA9IDA7CisKKyNpZiBkZWZpbmVkKElNTEFOR19GT05UX0xJTkspICYmIChJTUxBTkdfRk9OVF9M
SU5LID09IDIpCitzdGF0aWMgSU1MYW5nRm9udExpbmsyKiBsYW5nRm9udExpbmsgPSAwOworI2Vs
c2UKK3N0YXRpYyBJTUxhbmdGb250TGluayogbGFuZ0ZvbnRMaW5rID0gMDsKKyNlbmRpZgorCitJ
TXVsdGlMYW5ndWFnZSogZ2V0TXVsdGlMYW5ndWFnZUludGVyZmFjZSgpCit7CisgICAgaWYgKCFt
dWx0aUxhbmd1YWdlKQorICAgICAgICBDb0NyZWF0ZUluc3RhbmNlKENMU0lEX0NNdWx0aUxhbmd1
YWdlLCAwLCBDTFNDVFhfSU5QUk9DX1NFUlZFUiwgSUlEX0lNdWx0aUxhbmd1YWdlLCAodm9pZCoq
KSZtdWx0aUxhbmd1YWdlKTsKKworICAgIHJldHVybiBtdWx0aUxhbmd1YWdlOworfQorCisjaWYg
ZGVmaW5lZChJTUxBTkdfRk9OVF9MSU5LKSAmJiAoSU1MQU5HX0ZPTlRfTElOSyA9PSAyKQorSU1M
YW5nRm9udExpbmsyKiBGb250Q2FjaGU6OmdldEZvbnRMaW5rSW50ZXJmYWNlKCkKKyNlbHNlCitJ
TUxhbmdGb250TGluayogRm9udENhY2hlOjpnZXRGb250TGlua0ludGVyZmFjZSgpCisjZW5kaWYK
K3sKKyAgICBpZiAoIWxhbmdGb250TGluaykgeworICAgICAgICBpZiAoSU11bHRpTGFuZ3VhZ2Uq
IG1saSA9IGdldE11bHRpTGFuZ3VhZ2VJbnRlcmZhY2UoKSkKKyAgICAgICAgICAgIG1saS0+UXVl
cnlJbnRlcmZhY2UoJmxhbmdGb250TGluayk7CisgICAgfQorCisgICAgcmV0dXJuIGxhbmdGb250
TGluazsKK30KKworI2lmIGRlZmluZWQoSU1MQU5HX0ZPTlRfTElOSykgJiYgKElNTEFOR19GT05U
X0xJTksgPT0gMikKK3N0YXRpYyBib29sIGN1cnJlbnRGb250Q29udGFpbnNDaGFyYWN0ZXIoSU1M
YW5nRm9udExpbmsyKiBsYW5nRm9udExpbmssIEhEQyBoZGMsIFVDaGFyIGNoYXJhY3RlcikKK3sK
KyAgICBVSU5UIHVuaWNvZGVSYW5nZXM7CisgICAgaWYgKFNfT0sgIT0gbGFuZ0ZvbnRMaW5rLT5H
ZXRGb250VW5pY29kZVJhbmdlcyhoZGMsICZ1bmljb2RlUmFuZ2VzLCAwKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgc3RhdGljIFZlY3RvcjxVTklDT0RFUkFOR0UsIDY0PiBnbHlwaHNl
dEJ1ZmZlcjsKKyAgICBnbHlwaHNldEJ1ZmZlci5yZXNpemUodW5pY29kZVJhbmdlcyk7CisKKyAg
ICBpZiAoU19PSyAhPSBsYW5nRm9udExpbmstPkdldEZvbnRVbmljb2RlUmFuZ2VzKGhkYywgJnVu
aWNvZGVSYW5nZXMsIGdseXBoc2V0QnVmZmVyLmRhdGEoKSkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIC8vIEZJWE1FOiBDaGFuZ2UgdGhpcyB0byBhIGJpbmFyeSBzZWFyY2guIChZb25n
IExpOiBUaGF0J3MgZWFzeS4gQnV0LCBpcyBpdCBndWFyYW50ZWVkIHRoYXQgdGhlIHJhbmdlcyBh
cmUgc29ydGVkPykKKyAgICBmb3IgKFZlY3RvcjxVTklDT0RFUkFOR0UsIDY0Pjo6Y29uc3RfaXRl
cmF0b3IgaSA9IGdseXBoc2V0QnVmZmVyLmJlZ2luKCk7IGkgIT0gZ2x5cGhzZXRCdWZmZXIuZW5k
KCk7ICsraSkgeworICAgICAgICBpZiAoaS0+d2NUbyA+PSBjaGFyYWN0ZXIpCisgICAgICAgICAg
ICByZXR1cm4gaS0+d2NGcm9tIDw9IGNoYXJhY3RlcjsKKyAgICB9CisKKyAgICByZXR1cm4gZmFs
c2U7Cit9CisjZWxzZQorc3RhdGljIGJvb2wgY3VycmVudEZvbnRDb250YWluc0NoYXJhY3RlcihJ
TUxhbmdGb250TGluayogbGFuZ0ZvbnRMaW5rLCBIREMgaGRjLCBIRk9OVCBoZm9udCwgVUNoYXIg
Y2hhcmFjdGVyLCBjb25zdCB3Y2hhcl90KiBmYWNlTmFtZSkKK3sKKyAgICBEV09SRCBmb250Q29k
ZVBhZ2VzID0gMCwgY2hhckNvZGVQYWdlcyA9IDA7CisgICAgSFJFU1VMVCByZXN1bHQgPSBsYW5n
Rm9udExpbmstPkdldEZvbnRDb2RlUGFnZXMoaGRjLCBoZm9udCwgJmZvbnRDb2RlUGFnZXMpOwor
ICAgIGlmIChyZXN1bHQgIT0gU19PSykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJlc3Vs
dCA9IGxhbmdGb250TGluay0+R2V0Q2hhckNvZGVQYWdlcyhjaGFyYWN0ZXIsICZjaGFyQ29kZVBh
Z2VzKTsKKyAgICBpZiAocmVzdWx0ICE9IFNfT0spCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIGZvbnRDb2RlUGFnZXMgfD0gRm9udFBsYXRmb3JtRGF0YTo6Z2V0S25vd25Gb250Q29kZVBh
Z2VzKGZhY2VOYW1lKTsKKyAgICBpZiAoZm9udENvZGVQYWdlcyAmIGNoYXJDb2RlUGFnZXMpCisg
ICAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworfQorI2VuZGlmCisKKyNp
ZiBkZWZpbmVkKElNTEFOR19GT05UX0xJTkspICYmIChJTUxBTkdfRk9OVF9MSU5LID09IDIpCitz
dGF0aWMgSEZPTlQgY3JlYXRlTUxhbmdGb250KElNTGFuZ0ZvbnRMaW5rMiogbGFuZ0ZvbnRMaW5r
LCBIREMgaGRjLCBEV09SRCBjb2RlUGFnZU1hc2ssIFVDaGFyIGNoYXJhY3RlciA9IDApCit7Cisg
ICAgSEZPTlQgbWxhbmdGb250OworICAgIGlmIChTVUNDRUVERUQobGFuZ0ZvbnRMaW5rLT5NYXBG
b250KGhkYywgY29kZVBhZ2VNYXNrLCBjaGFyYWN0ZXIsICZtbGFuZ0ZvbnQpKSkKKyAgICAgICAg
cmV0dXJuIG1sYW5nRm9udDsKKworICAgIHJldHVybiAwOworfQorI2Vsc2UKK3N0YXRpYyBIRk9O
VCBjcmVhdGVNTGFuZ0ZvbnQoSU1MYW5nRm9udExpbmsqIGxhbmdGb250TGluaywgSERDIGhkYywg
Y29uc3QgRm9udFBsYXRmb3JtRGF0YSYgcmVmRm9udCwgRFdPUkQgY29kZVBhZ2VNYXNrKQorewor
ICAgIEhGT05UIG1sYW5nRm9udDsKKyAgICBMUkVTVUxUIHJlc3VsdCA9IGxhbmdGb250TGluay0+
TWFwRm9udChoZGMsIGNvZGVQYWdlTWFzaywgcmVmRm9udC5oZm9udCgpLCAmbWxhbmdGb250KTsK
KworICAgIHJldHVybiByZXN1bHQgPT0gU19PSyA/IG1sYW5nRm9udCA6IDA7Cit9CisjZW5kaWYK
Kworc3RhdGljIGNvbnN0IFZlY3RvcjxEV09SRCwgND4mIGdldENKS0NvZGVQYWdlTWFza3MoKQor
eworICAgIC8vIFRoZSBkZWZhdWx0IG9yZGVyIGluIHdoaWNoIHdlIGxvb2sgZm9yIGEgZm9udCBm
b3IgYSBDSksgY2hhcmFjdGVyLiBJZiB0aGUgdXNlcidzIGRlZmF1bHQgY29kZSBwYWdlIGlzCisg
ICAgLy8gb25lIG9mIHRoZXNlLCB3ZSB3aWxsIHVzZSBpdCBmaXJzdC4KKyAgICBzdGF0aWMgY29u
c3QgVUlOVCBDSktDb2RlUGFnZXNbXSA9IHsKKyAgICAgICAgOTMyLCAvKiBKYXBhbmVzZSAqLwor
ICAgICAgICA5MzYsIC8qIFNpbXBsaWZpZWQgQ2hpbmVzZSAqLworICAgICAgICA5NTAsIC8qIFRy
YWRpdGlvbmFsIENoaW5lc2UgKi8KKyAgICAgICAgOTQ5ICAvKiBLb3JlYW4gKi8KKyAgICB9Owor
CisgICAgc3RhdGljIFZlY3RvcjxEV09SRCwgND4gY29kZVBhZ2VNYXNrczsKKyAgICBzdGF0aWMg
Ym9vbCBpbml0aWFsaXplZDsKKyAgICBpZiAoIWluaXRpYWxpemVkKSB7CisgICAgICAgIGluaXRp
YWxpemVkID0gdHJ1ZTsKKyNpZiBkZWZpbmVkKElNTEFOR19GT05UX0xJTkspICYmIChJTUxBTkdf
Rk9OVF9MSU5LID09IDIpCisgICAgICAgIElNTGFuZ0ZvbnRMaW5rMiogbGFuZ0ZvbnRMaW5rID0g
Zm9udENhY2hlKCktPmdldEZvbnRMaW5rSW50ZXJmYWNlKCk7CisjZWxzZQorICAgICAgICBJTUxh
bmdGb250TGluayogbGFuZ0ZvbnRMaW5rID0gZm9udENhY2hlKCktPmdldEZvbnRMaW5rSW50ZXJm
YWNlKCk7CisjZW5kaWYKKyAgICAgICAgaWYgKCFsYW5nRm9udExpbmspCisgICAgICAgICAgICBy
ZXR1cm4gY29kZVBhZ2VNYXNrczsKKworICAgICAgICBVSU5UIGRlZmF1bHRDb2RlUGFnZTsKKyAg
ICAgICAgRFdPUkQgZGVmYXVsdENvZGVQYWdlTWFzayA9IDA7CisgICAgICAgIGlmIChHZXRMb2Nh
bGVJbmZvKExPQ0FMRV9VU0VSX0RFRkFVTFQsIExPQ0FMRV9SRVRVUk5fTlVNQkVSIHwgTE9DQUxF
X0lERUZBVUxUQU5TSUNPREVQQUdFLCByZWludGVycHJldF9jYXN0PExQV1NUUj4oJmRlZmF1bHRD
b2RlUGFnZSksIHNpemVvZihkZWZhdWx0Q29kZVBhZ2UpKSkKKyAgICAgICAgICAgIGxhbmdGb250
TGluay0+Q29kZVBhZ2VUb0NvZGVQYWdlcyhkZWZhdWx0Q29kZVBhZ2UsICZkZWZhdWx0Q29kZVBh
Z2VNYXNrKTsKKworICAgICAgICBpZiAoZGVmYXVsdENvZGVQYWdlID09IENKS0NvZGVQYWdlc1sw
XSB8fCBkZWZhdWx0Q29kZVBhZ2UgPT0gQ0pLQ29kZVBhZ2VzWzFdIHx8IGRlZmF1bHRDb2RlUGFn
ZSA9PSBDSktDb2RlUGFnZXNbMl0gfHwgZGVmYXVsdENvZGVQYWdlID09IENKS0NvZGVQYWdlc1sz
XSkKKyAgICAgICAgICAgIGNvZGVQYWdlTWFza3MuYXBwZW5kKGRlZmF1bHRDb2RlUGFnZU1hc2sp
OworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgICAg
ICBpZiAoZGVmYXVsdENvZGVQYWdlICE9IENKS0NvZGVQYWdlc1tpXSkgeworICAgICAgICAgICAg
ICAgIERXT1JEIGNvZGVQYWdlTWFzazsKKyAgICAgICAgICAgICAgICBsYW5nRm9udExpbmstPkNv
ZGVQYWdlVG9Db2RlUGFnZXMoQ0pLQ29kZVBhZ2VzW2ldLCAmY29kZVBhZ2VNYXNrKTsKKyAgICAg
ICAgICAgICAgICBjb2RlUGFnZU1hc2tzLmFwcGVuZChjb2RlUGFnZU1hc2spOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb2RlUGFnZU1hc2tzOworfQorCisK
K3N0cnVjdCBUcmFpdHNJbkZhbWlseVByb2NEYXRhIHsKKyAgICBUcmFpdHNJbkZhbWlseVByb2NE
YXRhKGNvbnN0IEF0b21pY1N0cmluZyYgZmFtaWx5TmFtZSkKKyAgICAgICAgOiBtX2ZhbWlseU5h
bWUoZmFtaWx5TmFtZSkKKyAgICB7CisgICAgfQorCisgICAgY29uc3QgQXRvbWljU3RyaW5nJiBt
X2ZhbWlseU5hbWU7CisgICAgSGFzaFNldDx1bnNpZ25lZD4gbV90cmFpdHNNYXNrczsKK307CisK
K3N0YXRpYyBpbnQgQ0FMTEJBQ0sgdHJhaXRzSW5GYW1pbHlFbnVtUHJvYyhDT05TVCBMT0dGT05U
KiBsb2dGb250LCBDT05TVCBURVhUTUVUUklDKiBtZXRyaWNzLCBEV09SRCBmb250VHlwZSwgTFBB
UkFNIGxQYXJhbSkKK3sKKyAgICBUcmFpdHNJbkZhbWlseVByb2NEYXRhKiBwcm9jRGF0YSA9IHJl
aW50ZXJwcmV0X2Nhc3Q8VHJhaXRzSW5GYW1pbHlQcm9jRGF0YSo+KGxQYXJhbSk7CisKKyAgICB1
bnNpZ25lZCB0cmFpdHNNYXNrID0gMDsKKyAgICB0cmFpdHNNYXNrIHw9IGxvZ0ZvbnQtPmxmSXRh
bGljID8gRm9udFN0eWxlSXRhbGljTWFzayA6IEZvbnRTdHlsZU5vcm1hbE1hc2s7CisgICAgdHJh
aXRzTWFzayB8PSBGb250VmFyaWFudE5vcm1hbE1hc2s7CisgICAgTE9ORyB3ZWlnaHQgPSBGb250
UGxhdGZvcm1EYXRhOjphZGp1c3RlZEdESUZvbnRXZWlnaHQobG9nRm9udC0+bGZXZWlnaHQsIHBy
b2NEYXRhLT5tX2ZhbWlseU5hbWUpOworICAgIHRyYWl0c01hc2sgfD0gd2VpZ2h0ID09IEZXX1RI
SU4gPyBGb250V2VpZ2h0MTAwTWFzayA6CisgICAgICAgIHdlaWdodCA9PSBGV19FWFRSQUxJR0hU
ID8gRm9udFdlaWdodDIwME1hc2sgOgorICAgICAgICB3ZWlnaHQgPT0gRldfTElHSFQgPyBGb250
V2VpZ2h0MzAwTWFzayA6CisgICAgICAgIHdlaWdodCA9PSBGV19OT1JNQUwgPyBGb250V2VpZ2h0
NDAwTWFzayA6CisgICAgICAgIHdlaWdodCA9PSBGV19NRURJVU0gPyBGb250V2VpZ2h0NTAwTWFz
ayA6CisgICAgICAgIHdlaWdodCA9PSBGV19TRU1JQk9MRCA/IEZvbnRXZWlnaHQ2MDBNYXNrIDoK
KyAgICAgICAgd2VpZ2h0ID09IEZXX0JPTEQgPyBGb250V2VpZ2h0NzAwTWFzayA6CisgICAgICAg
IHdlaWdodCA9PSBGV19FWFRSQUJPTEQgPyBGb250V2VpZ2h0ODAwTWFzayA6CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBGb250V2VpZ2h0OTAwTWFzazsKKyAgICBwcm9jRGF0YS0+
bV90cmFpdHNNYXNrcy5hZGQodHJhaXRzTWFzayk7CisgICAgcmV0dXJuIDE7Cit9CisKK3ZvaWQg
Rm9udENhY2hlOjpwbGF0Zm9ybUluaXQoKQoreworfQorCit2b2lkIEZvbnRDYWNoZTo6Y29tSW5p
dGlhbGl6ZSgpCit7Cit9CisKK3ZvaWQgRm9udENhY2hlOjpjb21VbmluaXRpYWxpemUoKQorewor
ICAgIGlmIChsYW5nRm9udExpbmspIHsKKyAgICAgICAgbGFuZ0ZvbnRMaW5rLT5SZWxlYXNlKCk7
CisgICAgICAgIGxhbmdGb250TGluayA9IDA7CisgICAgfQorICAgIGlmIChtdWx0aUxhbmd1YWdl
KSB7CisgICAgICAgIG11bHRpTGFuZ3VhZ2UtPlJlbGVhc2UoKTsKKyAgICAgICAgbXVsdGlMYW5n
dWFnZSA9IDA7CisgICAgfQorfQorCitjb25zdCBTaW1wbGVGb250RGF0YSogRm9udENhY2hlOjpn
ZXRGb250RGF0YUZvckNoYXJhY3RlcnMoY29uc3QgRm9udCYgZm9udCwgY29uc3QgVUNoYXIqIGNo
YXJhY3RlcnMsIGludCBsZW5ndGgpCit7CisgICAgU3RyaW5nIGZhbWlseU5hbWU7CisgICAgV0NI
QVIgbmFtZVtMRl9GQUNFU0laRV07CisKKyAgICBVQ2hhciBjaGFyYWN0ZXIgPSBjaGFyYWN0ZXJz
WzBdOworICAgIGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIG9yaWdGb250ID0gZm9udC5wcmltYXJ5
Rm9udCgpLT5mb250RGF0YUZvckNoYXJhY3RlcihjaGFyYWN0ZXIpLT5wbGF0Zm9ybURhdGEoKTsK
KyAgICB1bnNpZ25lZCB1bmljb2RlUmFuZ2UgPSBmaW5kQ2hhclVuaWNvZGVSYW5nZShjaGFyYWN0
ZXIpOworCisjaWYgZGVmaW5lZChJTUxBTkdfRk9OVF9MSU5LKSAmJiAoSU1MQU5HX0ZPTlRfTElO
SyA9PSAyKQorICAgIGlmIChJTUxhbmdGb250TGluazIqIGxhbmdGb250TGluayA9IGdldEZvbnRM
aW5rSW50ZXJmYWNlKCkpIHsKKyNlbHNlCisgICAgaWYgKElNTGFuZ0ZvbnRMaW5rKiBsYW5nRm9u
dExpbmsgPSBnZXRGb250TGlua0ludGVyZmFjZSgpKSB7CisjZW5kaWYKKyAgICAgICAgSEdESU9C
SiBvbGRGb250ID0gR2V0Q3VycmVudE9iamVjdChnX3NjcmVlbkRDLCBPQkpfRk9OVCk7CisgICAg
ICAgIEhGT05UIGhmb250ID0gMDsKKyAgICAgICAgRFdPUkQgY29kZVBhZ2VzID0gMDsKKyAgICAg
ICAgVUlOVCBjb2RlUGFnZSA9IDA7CisgICAgICAgIC8vIFRyeSBNTGFuZyBmb250IGxpbmtpbmcg
Zmlyc3QuCisgICAgICAgIGxhbmdGb250TGluay0+R2V0Q2hhckNvZGVQYWdlcyhjaGFyYWN0ZXIs
ICZjb2RlUGFnZXMpOworICAgICAgICBpZiAoY29kZVBhZ2VzICYmIHVuaWNvZGVSYW5nZSA9PSBj
UmFuZ2VTZXRDSkspIHsKKyAgICAgICAgICAgIC8vIFRoZSBDSksgY2hhcmFjdGVyIG1heSBiZWxv
bmcgdG8gbXVsdGlwbGUgY29kZSBwYWdlcy4gV2Ugd2FudCB0bworICAgICAgICAgICAgLy8gZG8g
Zm9udCBsaW5raW5nIGFnYWluc3QgYSBzaW5nbGUgb25lIG9mIHRoZW0sIHByZWZlcnJpbmcgdGhl
IGRlZmF1bHQKKyAgICAgICAgICAgIC8vIGNvZGUgcGFnZSBmb3IgdGhlIHVzZXIncyBsb2NhbGUu
CisgICAgICAgICAgICBjb25zdCBWZWN0b3I8RFdPUkQsIDQ+JiBDSktDb2RlUGFnZU1hc2tzID0g
Z2V0Q0pLQ29kZVBhZ2VNYXNrcygpOworICAgICAgICAgICAgdW5zaWduZWQgbnVtQ29kZVBhZ2Vz
ID0gQ0pLQ29kZVBhZ2VNYXNrcy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgbnVtQ29kZVBhZ2VzOyArK2kpIHsKKyNpZiBkZWZpbmVkKElNTEFOR19GT05UX0xJ
TkspICYmIChJTUxBTkdfRk9OVF9MSU5LID09IDIpCisgICAgICAgICAgICAgICAgaGZvbnQgPSBj
cmVhdGVNTGFuZ0ZvbnQobGFuZ0ZvbnRMaW5rLCBnX3NjcmVlbkRDLCBDSktDb2RlUGFnZU1hc2tz
W2ldKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgaGZvbnQgPSBjcmVhdGVNTGFuZ0ZvbnQobGFu
Z0ZvbnRMaW5rLCBnX3NjcmVlbkRDLCBvcmlnRm9udCwgQ0pLQ29kZVBhZ2VNYXNrc1tpXSk7Cisj
ZW5kaWYKKyAgICAgICAgICAgICAgICBpZiAoIWhmb250KQorICAgICAgICAgICAgICAgICAgICBj
b250aW51ZTsKKworICAgICAgICAgICAgICAgIFNlbGVjdE9iamVjdChnX3NjcmVlbkRDLCBoZm9u
dCk7CisgICAgICAgICAgICAgICAgR2V0VGV4dEZhY2UoZ19zY3JlZW5EQywgTEZfRkFDRVNJWkUs
IG5hbWUpOworCisgICAgICAgICAgICAgICAgaWYgKGhmb250ICYmICEoY29kZVBhZ2VzICYgQ0pL
Q29kZVBhZ2VNYXNrc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXNrZWQgYWJv
dXQgYSBjb2RlIHBhZ2UgdGhhdCBpcyBub3Qgb25lIG9mIHRoZSBjb2RlIHBhZ2VzCisgICAgICAg
ICAgICAgICAgICAgIC8vIHJldHVybmVkIGJ5IE1MYW5nLCBzbyB0aGUgZm9udCBtaWdodCBub3Qg
Y29udGFpbiB0aGUgY2hhcmFjdGVyLgorI2lmIGRlZmluZWQoSU1MQU5HX0ZPTlRfTElOSykgJiYg
KElNTEFOR19GT05UX0xJTksgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50
Rm9udENvbnRhaW5zQ2hhcmFjdGVyKGxhbmdGb250TGluaywgZ19zY3JlZW5EQywgY2hhcmFjdGVy
KSkgeworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50Rm9udENvbnRhaW5z
Q2hhcmFjdGVyKGxhbmdGb250TGluaywgZ19zY3JlZW5EQywgaGZvbnQsIGNoYXJhY3RlciwgbmFt
ZSkpIHsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGdfc2Ny
ZWVuREMsIG9sZEZvbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ0ZvbnRMaW5rLT5S
ZWxlYXNlRm9udChoZm9udCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoZm9udCA9IDA7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfSBlbHNlIHsKKyNpZiBkZWZpbmVkKElNTEFOR19GT05UX0xJTkspICYmIChJTUxB
TkdfRk9OVF9MSU5LID09IDIpCisgICAgICAgICAgICBoZm9udCA9IGNyZWF0ZU1MYW5nRm9udChs
YW5nRm9udExpbmssIGdfc2NyZWVuREMsIGNvZGVQYWdlcywgY2hhcmFjdGVyKTsKKyNlbHNlCisg
ICAgICAgICAgICBoZm9udCA9IGNyZWF0ZU1MYW5nRm9udChsYW5nRm9udExpbmssIGdfc2NyZWVu
REMsIG9yaWdGb250LCBjb2RlUGFnZXMpOworI2VuZGlmCisgICAgICAgICAgICBTZWxlY3RPYmpl
Y3QoZ19zY3JlZW5EQywgaGZvbnQpOworICAgICAgICAgICAgR2V0VGV4dEZhY2UoZ19zY3JlZW5E
QywgTEZfRkFDRVNJWkUsIG5hbWUpOworICAgICAgICB9CisgICAgICAgIFNlbGVjdE9iamVjdChn
X3NjcmVlbkRDLCBvbGRGb250KTsKKworICAgICAgICBpZiAoaGZvbnQpIHsKKyAgICAgICAgICAg
IGZhbWlseU5hbWUgPSBuYW1lOworICAgICAgICAgICAgbGFuZ0ZvbnRMaW5rLT5SZWxlYXNlRm9u
dChoZm9udCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgRm9udFBsYXRmb3JtRGF0YTo6
bWFwS25vd25Gb250KGNvZGVQYWdlcywgZmFtaWx5TmFtZSk7CisgICAgfQorCisgICAgaWYgKGZh
bWlseU5hbWUuaXNFbXB0eSgpKQorICAgICAgICBmYW1pbHlOYW1lID0gRm9udFBsYXRmb3JtRGF0
YTo6ZGVmYXVsdEZvbnRGYW1pbHkoKTsKKworICAgIGlmICghZmFtaWx5TmFtZS5pc0VtcHR5KCkp
IHsKKyAgICAgICAgLy8gRklYTUU6IHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBUaGFpIGZvbnQg
cHJvYmxlbQorICAgICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uKGZvbnQuZm9u
dERlc2NyaXB0aW9uKCkpOworICAgICAgICBpZiAodW5pY29kZVJhbmdlID09IGNSYW5nZVRoYWkg
JiYgZm9udERlc2NyaXB0aW9uLndlaWdodCgpID4gRm9udFdlaWdodE5vcm1hbCkKKyAgICAgICAg
ICAgIGZvbnREZXNjcmlwdGlvbi5zZXRXZWlnaHQoRm9udFdlaWdodE5vcm1hbCk7CisKKyAgICAg
ICAgRm9udFBsYXRmb3JtRGF0YSogcmVzdWx0ID0gZ2V0Q2FjaGVkRm9udFBsYXRmb3JtRGF0YShm
b250RGVzY3JpcHRpb24sIGZhbWlseU5hbWUpOworICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3Vs
dC0+aGFzaCgpICE9IG9yaWdGb250Lmhhc2goKSkgeworICAgICAgICAgICAgaWYgKFNpbXBsZUZv
bnREYXRhKiBmb250RGF0YSA9IGdldENhY2hlZEZvbnREYXRhKHJlc3VsdCkpCisgICAgICAgICAg
ICAgICAgcmV0dXJuIGZvbnREYXRhOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7
Cit9CisKK1NpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldFNpbWlsYXJGb250UGxhdGZvcm1E
YXRhKGNvbnN0IEZvbnQmIGZvbnQpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK1NpbXBsZUZvbnRE
YXRhKiBGb250Q2FjaGU6OmdldExhc3RSZXNvcnRGYWxsYmFja0ZvbnQoY29uc3QgRm9udERlc2Ny
aXB0aW9uJiBmb250RGVzYykKK3sKKyAgICAvLyBGSVhNRTogV291bGQgYmUgZXZlbiBiZXR0ZXIg
dG8gc29tZWhvdyBnZXQgdGhlIHVzZXIncyBkZWZhdWx0IGZvbnQgaGVyZS4gIEZvciBub3cgd2Un
bGwgcGljaworICAgIC8vIHRoZSBkZWZhdWx0IHRoYXQgdGhlIHVzZXIgd291bGQgZ2V0IHdpdGhv
dXQgY2hhbmdpbmcgYW55IHByZWZzLgorICAgIHJldHVybiBnZXRDYWNoZWRGb250RGF0YShmb250
RGVzYywgRm9udFBsYXRmb3JtRGF0YTo6ZGVmYXVsdEZvbnRGYW1pbHkoKSk7Cit9CisKK0ZvbnRQ
bGF0Zm9ybURhdGEqIEZvbnRDYWNoZTo6Y3JlYXRlRm9udFBsYXRmb3JtRGF0YShjb25zdCBGb250
RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbiwgY29uc3QgQXRvbWljU3RyaW5nJiBmYW1pbHkp
Cit7CisgICAgRm9udFBsYXRmb3JtRGF0YSogcmVzdWx0ID0gbmV3IEZvbnRQbGF0Zm9ybURhdGEo
Zm9udERlc2NyaXB0aW9uLCBmYW1pbHkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQg
Rm9udENhY2hlOjpnZXRUcmFpdHNJbkZhbWlseShjb25zdCBBdG9taWNTdHJpbmcmIGZhbWlseU5h
bWUsIFZlY3Rvcjx1bnNpZ25lZD4mIHRyYWl0c01hc2tzKQoreworICAgIExPR0ZPTlQgbG9nRm9u
dDsKKyAgICBsb2dGb250LmxmQ2hhclNldCA9IERFRkFVTFRfQ0hBUlNFVDsKKyAgICB1bnNpZ25l
ZCBmYW1pbHlMZW5ndGggPSBzdGQ6Om1pbihmYW1pbHlOYW1lLmxlbmd0aCgpLCBzdGF0aWNfY2Fz
dDx1bnNpZ25lZD4oTEZfRkFDRVNJWkUgLSAxKSk7CisgICAgbWVtY3B5KGxvZ0ZvbnQubGZGYWNl
TmFtZSwgZmFtaWx5TmFtZS5jaGFyYWN0ZXJzKCksIGZhbWlseUxlbmd0aCAqIHNpemVvZihVQ2hh
cikpOworICAgIGxvZ0ZvbnQubGZGYWNlTmFtZVtmYW1pbHlMZW5ndGhdID0gMDsKKyAgICBsb2dG
b250LmxmUGl0Y2hBbmRGYW1pbHkgPSAwOworCisgICAgVHJhaXRzSW5GYW1pbHlQcm9jRGF0YSBw
cm9jRGF0YShmYW1pbHlOYW1lKTsKKyAgICBFbnVtRm9udEZhbWlsaWVzRXgoZ19zY3JlZW5EQywg
JmxvZ0ZvbnQsIHRyYWl0c0luRmFtaWx5RW51bVByb2MsIHJlaW50ZXJwcmV0X2Nhc3Q8TFBBUkFN
PigmcHJvY0RhdGEpLCAwKTsKKyAgICBjb3B5VG9WZWN0b3IocHJvY0RhdGEubV90cmFpdHNNYXNr
cywgdHJhaXRzTWFza3MpOworfQorCit9CisKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luY2UvRm9udENhY2hlV2luQ0UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luY2UvRm9udENhY2hlV2luQ0UuY3BwCShyZXZpc2lvbiA1NzI4OSkKKysr
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvRm9udENhY2hlV2luQ0UuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0zNDgsNSArMzQ4LDQgQEAgdm9pZCBGb250Q2FjaGU6OmdldFRyYWl0c0lu
RmFtaWx5KGNvbnN0CiAgICAgY29weVRvVmVjdG9yKHByb2NEYXRhLm1fdHJhaXRzTWFza3MsIHRy
YWl0c01hc2tzKTsKIH0KIAotfQotCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ZvbnRDYWNoZVdpbmNlLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ZvbnRDYWNoZVdpbmNlLmNwcAko
cmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ZvbnRD
YWNoZVdpbmNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSwzNTIgKzAsMCBAQAotLyoKLSogQ29w
eXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCi0qIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLgotKgotKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCi0qIGFyZSBtZXQ6Ci0qCi0qIDEuICBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLiAKLSogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0qICAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LiAKLSogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBs
ZSIpIG5vciB0aGUgbmFtZXMgb2YKLSogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQg
dG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSogICAgIGZyb20gdGhpcyBz
b2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCi0qCi0q
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMg
IkFTIElTIiBBTkQgQU5ZCi0qIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSogV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZCi0qIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0qIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsKLSogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0qIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0qIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRgotKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgotKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUg
IkZvbnRDYWNoZS5oIgotCi0jaW5jbHVkZSAiRm9udC5oIgotI2luY2x1ZGUgIkZvbnREYXRhLmgi
Ci0jaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIKLSNpbmNsdWRlICJVbmljb2RlUmFuZ2UuaCIK
LSNpbmNsdWRlICJ3dGYvT3duUHRyLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVk
ZSA8bWxhbmcuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1leHRlcm4gSERDIGdfc2NyZWVu
REM7Ci0KLXN0YXRpYyBJTXVsdGlMYW5ndWFnZSAqbXVsdGlMYW5ndWFnZSA9IDA7Ci0KLSNpZiBk
ZWZpbmVkKElNTEFOR19GT05UX0xJTkspICYmIChJTUxBTkdfRk9OVF9MSU5LID09IDIpCi1zdGF0
aWMgSU1MYW5nRm9udExpbmsyKiBsYW5nRm9udExpbmsgPSAwOwotI2Vsc2UKLXN0YXRpYyBJTUxh
bmdGb250TGluayogbGFuZ0ZvbnRMaW5rID0gMDsKLSNlbmRpZgotCi1JTXVsdGlMYW5ndWFnZSog
Z2V0TXVsdGlMYW5ndWFnZUludGVyZmFjZSgpCi17Ci0gICAgaWYgKCFtdWx0aUxhbmd1YWdlKQot
ICAgICAgICBDb0NyZWF0ZUluc3RhbmNlKENMU0lEX0NNdWx0aUxhbmd1YWdlLCAwLCBDTFNDVFhf
SU5QUk9DX1NFUlZFUiwgSUlEX0lNdWx0aUxhbmd1YWdlLCAodm9pZCoqKSZtdWx0aUxhbmd1YWdl
KTsKLQotICAgIHJldHVybiBtdWx0aUxhbmd1YWdlOwotfQotCi0jaWYgZGVmaW5lZChJTUxBTkdf
Rk9OVF9MSU5LKSAmJiAoSU1MQU5HX0ZPTlRfTElOSyA9PSAyKQotSU1MYW5nRm9udExpbmsyKiBG
b250Q2FjaGU6OmdldEZvbnRMaW5rSW50ZXJmYWNlKCkKLSNlbHNlCi1JTUxhbmdGb250TGluayog
Rm9udENhY2hlOjpnZXRGb250TGlua0ludGVyZmFjZSgpCi0jZW5kaWYKLXsKLSAgICBpZiAoIWxh
bmdGb250TGluaykgewotICAgICAgICBpZiAoSU11bHRpTGFuZ3VhZ2UqIG1saSA9IGdldE11bHRp
TGFuZ3VhZ2VJbnRlcmZhY2UoKSkKLSAgICAgICAgICAgIG1saS0+UXVlcnlJbnRlcmZhY2UoJmxh
bmdGb250TGluayk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGxhbmdGb250TGluazsKLX0KLQotI2lm
IGRlZmluZWQoSU1MQU5HX0ZPTlRfTElOSykgJiYgKElNTEFOR19GT05UX0xJTksgPT0gMikKLXN0
YXRpYyBib29sIGN1cnJlbnRGb250Q29udGFpbnNDaGFyYWN0ZXIoSU1MYW5nRm9udExpbmsyKiBs
YW5nRm9udExpbmssIEhEQyBoZGMsIFVDaGFyIGNoYXJhY3RlcikKLXsKLSAgICBVSU5UIHVuaWNv
ZGVSYW5nZXM7Ci0gICAgaWYgKFNfT0sgIT0gbGFuZ0ZvbnRMaW5rLT5HZXRGb250VW5pY29kZVJh
bmdlcyhoZGMsICZ1bmljb2RlUmFuZ2VzLCAwKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0g
ICAgc3RhdGljIFZlY3RvcjxVTklDT0RFUkFOR0UsIDY0PiBnbHlwaHNldEJ1ZmZlcjsKLSAgICBn
bHlwaHNldEJ1ZmZlci5yZXNpemUodW5pY29kZVJhbmdlcyk7Ci0KLSAgICBpZiAoU19PSyAhPSBs
YW5nRm9udExpbmstPkdldEZvbnRVbmljb2RlUmFuZ2VzKGhkYywgJnVuaWNvZGVSYW5nZXMsIGds
eXBoc2V0QnVmZmVyLmRhdGEoKSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIEZJ
WE1FOiBDaGFuZ2UgdGhpcyB0byBhIGJpbmFyeSBzZWFyY2guIChZb25nIExpOiBUaGF0J3MgZWFz
eS4gQnV0LCBpcyBpdCBndWFyYW50ZWVkIHRoYXQgdGhlIHJhbmdlcyBhcmUgc29ydGVkPykKLSAg
ICBmb3IgKFZlY3RvcjxVTklDT0RFUkFOR0UsIDY0Pjo6Y29uc3RfaXRlcmF0b3IgaSA9IGdseXBo
c2V0QnVmZmVyLmJlZ2luKCk7IGkgIT0gZ2x5cGhzZXRCdWZmZXIuZW5kKCk7ICsraSkgewotICAg
ICAgICBpZiAoaS0+d2NUbyA+PSBjaGFyYWN0ZXIpCi0gICAgICAgICAgICByZXR1cm4gaS0+d2NG
cm9tIDw9IGNoYXJhY3RlcjsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0jZWxzZQot
c3RhdGljIGJvb2wgY3VycmVudEZvbnRDb250YWluc0NoYXJhY3RlcihJTUxhbmdGb250TGluayog
bGFuZ0ZvbnRMaW5rLCBIREMgaGRjLCBIRk9OVCBoZm9udCwgVUNoYXIgY2hhcmFjdGVyLCBjb25z
dCB3Y2hhcl90KiBmYWNlTmFtZSkKLXsKLSAgICBEV09SRCBmb250Q29kZVBhZ2VzID0gMCwgY2hh
ckNvZGVQYWdlcyA9IDA7Ci0gICAgSFJFU1VMVCByZXN1bHQgPSBsYW5nRm9udExpbmstPkdldEZv
bnRDb2RlUGFnZXMoaGRjLCBoZm9udCwgJmZvbnRDb2RlUGFnZXMpOwotICAgIGlmIChyZXN1bHQg
IT0gU19PSykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJlc3VsdCA9IGxhbmdGb250TGlu
ay0+R2V0Q2hhckNvZGVQYWdlcyhjaGFyYWN0ZXIsICZjaGFyQ29kZVBhZ2VzKTsKLSAgICBpZiAo
cmVzdWx0ICE9IFNfT0spCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGZvbnRDb2RlUGFn
ZXMgfD0gRm9udFBsYXRmb3JtRGF0YTo6Z2V0S25vd25Gb250Q29kZVBhZ2VzKGZhY2VOYW1lKTsK
LSAgICBpZiAoZm9udENvZGVQYWdlcyAmIGNoYXJDb2RlUGFnZXMpCi0gICAgICAgIHJldHVybiB0
cnVlOwotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKElNTEFO
R19GT05UX0xJTkspICYmIChJTUxBTkdfRk9OVF9MSU5LID09IDIpCi1zdGF0aWMgSEZPTlQgY3Jl
YXRlTUxhbmdGb250KElNTGFuZ0ZvbnRMaW5rMiogbGFuZ0ZvbnRMaW5rLCBIREMgaGRjLCBEV09S
RCBjb2RlUGFnZU1hc2ssIFVDaGFyIGNoYXJhY3RlciA9IDApCi17Ci0gICAgSEZPTlQgbWxhbmdG
b250OwotICAgIGlmIChTVUNDRUVERUQobGFuZ0ZvbnRMaW5rLT5NYXBGb250KGhkYywgY29kZVBh
Z2VNYXNrLCBjaGFyYWN0ZXIsICZtbGFuZ0ZvbnQpKSkKLSAgICAgICAgcmV0dXJuIG1sYW5nRm9u
dDsKLQotICAgIHJldHVybiAwOwotfQotI2Vsc2UKLXN0YXRpYyBIRk9OVCBjcmVhdGVNTGFuZ0Zv
bnQoSU1MYW5nRm9udExpbmsqIGxhbmdGb250TGluaywgSERDIGhkYywgY29uc3QgRm9udFBsYXRm
b3JtRGF0YSYgcmVmRm9udCwgRFdPUkQgY29kZVBhZ2VNYXNrKQotewotICAgIEhGT05UIG1sYW5n
Rm9udDsKLSAgICBMUkVTVUxUIHJlc3VsdCA9IGxhbmdGb250TGluay0+TWFwRm9udChoZGMsIGNv
ZGVQYWdlTWFzaywgcmVmRm9udC5oZm9udCgpLCAmbWxhbmdGb250KTsKLQotICAgIHJldHVybiBy
ZXN1bHQgPT0gU19PSyA/IG1sYW5nRm9udCA6IDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGNvbnN0
IFZlY3RvcjxEV09SRCwgND4mIGdldENKS0NvZGVQYWdlTWFza3MoKQotewotICAgIC8vIFRoZSBk
ZWZhdWx0IG9yZGVyIGluIHdoaWNoIHdlIGxvb2sgZm9yIGEgZm9udCBmb3IgYSBDSksgY2hhcmFj
dGVyLiBJZiB0aGUgdXNlcidzIGRlZmF1bHQgY29kZSBwYWdlIGlzCi0gICAgLy8gb25lIG9mIHRo
ZXNlLCB3ZSB3aWxsIHVzZSBpdCBmaXJzdC4KLSAgICBzdGF0aWMgY29uc3QgVUlOVCBDSktDb2Rl
UGFnZXNbXSA9IHsKLSAgICAgICAgOTMyLCAvKiBKYXBhbmVzZSAqLwotICAgICAgICA5MzYsIC8q
IFNpbXBsaWZpZWQgQ2hpbmVzZSAqLwotICAgICAgICA5NTAsIC8qIFRyYWRpdGlvbmFsIENoaW5l
c2UgKi8KLSAgICAgICAgOTQ5ICAvKiBLb3JlYW4gKi8KLSAgICB9OwotCi0gICAgc3RhdGljIFZl
Y3RvcjxEV09SRCwgND4gY29kZVBhZ2VNYXNrczsKLSAgICBzdGF0aWMgYm9vbCBpbml0aWFsaXpl
ZDsKLSAgICBpZiAoIWluaXRpYWxpemVkKSB7Ci0gICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsK
LSNpZiBkZWZpbmVkKElNTEFOR19GT05UX0xJTkspICYmIChJTUxBTkdfRk9OVF9MSU5LID09IDIp
Ci0gICAgICAgIElNTGFuZ0ZvbnRMaW5rMiogbGFuZ0ZvbnRMaW5rID0gZm9udENhY2hlKCktPmdl
dEZvbnRMaW5rSW50ZXJmYWNlKCk7Ci0jZWxzZQotICAgICAgICBJTUxhbmdGb250TGluayogbGFu
Z0ZvbnRMaW5rID0gZm9udENhY2hlKCktPmdldEZvbnRMaW5rSW50ZXJmYWNlKCk7Ci0jZW5kaWYK
LSAgICAgICAgaWYgKCFsYW5nRm9udExpbmspCi0gICAgICAgICAgICByZXR1cm4gY29kZVBhZ2VN
YXNrczsKLQotICAgICAgICBVSU5UIGRlZmF1bHRDb2RlUGFnZTsKLSAgICAgICAgRFdPUkQgZGVm
YXVsdENvZGVQYWdlTWFzayA9IDA7Ci0gICAgICAgIGlmIChHZXRMb2NhbGVJbmZvKExPQ0FMRV9V
U0VSX0RFRkFVTFQsIExPQ0FMRV9SRVRVUk5fTlVNQkVSIHwgTE9DQUxFX0lERUZBVUxUQU5TSUNP
REVQQUdFLCByZWludGVycHJldF9jYXN0PExQV1NUUj4oJmRlZmF1bHRDb2RlUGFnZSksIHNpemVv
ZihkZWZhdWx0Q29kZVBhZ2UpKSkKLSAgICAgICAgICAgIGxhbmdGb250TGluay0+Q29kZVBhZ2VU
b0NvZGVQYWdlcyhkZWZhdWx0Q29kZVBhZ2UsICZkZWZhdWx0Q29kZVBhZ2VNYXNrKTsKLQotICAg
ICAgICBpZiAoZGVmYXVsdENvZGVQYWdlID09IENKS0NvZGVQYWdlc1swXSB8fCBkZWZhdWx0Q29k
ZVBhZ2UgPT0gQ0pLQ29kZVBhZ2VzWzFdIHx8IGRlZmF1bHRDb2RlUGFnZSA9PSBDSktDb2RlUGFn
ZXNbMl0gfHwgZGVmYXVsdENvZGVQYWdlID09IENKS0NvZGVQYWdlc1szXSkKLSAgICAgICAgICAg
IGNvZGVQYWdlTWFza3MuYXBwZW5kKGRlZmF1bHRDb2RlUGFnZU1hc2spOwotICAgICAgICBmb3Ig
KHVuc2lnbmVkIGkgPSAwOyBpIDwgNDsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoZGVmYXVsdENv
ZGVQYWdlICE9IENKS0NvZGVQYWdlc1tpXSkgewotICAgICAgICAgICAgICAgIERXT1JEIGNvZGVQ
YWdlTWFzazsKLSAgICAgICAgICAgICAgICBsYW5nRm9udExpbmstPkNvZGVQYWdlVG9Db2RlUGFn
ZXMoQ0pLQ29kZVBhZ2VzW2ldLCAmY29kZVBhZ2VNYXNrKTsKLSAgICAgICAgICAgICAgICBjb2Rl
UGFnZU1hc2tzLmFwcGVuZChjb2RlUGFnZU1hc2spOwotICAgICAgICAgICAgfQotICAgICAgICB9
Ci0gICAgfQotICAgIHJldHVybiBjb2RlUGFnZU1hc2tzOwotfQotCi0KLXN0cnVjdCBUcmFpdHNJ
bkZhbWlseVByb2NEYXRhIHsKLSAgICBUcmFpdHNJbkZhbWlseVByb2NEYXRhKGNvbnN0IEF0b21p
Y1N0cmluZyYgZmFtaWx5TmFtZSkKLSAgICAgICAgOiBtX2ZhbWlseU5hbWUoZmFtaWx5TmFtZSkK
LSAgICB7Ci0gICAgfQotCi0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBtX2ZhbWlseU5hbWU7Ci0g
ICAgSGFzaFNldDx1bnNpZ25lZD4gbV90cmFpdHNNYXNrczsKLX07Ci0KLXN0YXRpYyBpbnQgQ0FM
TEJBQ0sgdHJhaXRzSW5GYW1pbHlFbnVtUHJvYyhDT05TVCBMT0dGT05UKiBsb2dGb250LCBDT05T
VCBURVhUTUVUUklDKiBtZXRyaWNzLCBEV09SRCBmb250VHlwZSwgTFBBUkFNIGxQYXJhbSkKLXsK
LSAgICBUcmFpdHNJbkZhbWlseVByb2NEYXRhKiBwcm9jRGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8
VHJhaXRzSW5GYW1pbHlQcm9jRGF0YSo+KGxQYXJhbSk7Ci0KLSAgICB1bnNpZ25lZCB0cmFpdHNN
YXNrID0gMDsKLSAgICB0cmFpdHNNYXNrIHw9IGxvZ0ZvbnQtPmxmSXRhbGljID8gRm9udFN0eWxl
SXRhbGljTWFzayA6IEZvbnRTdHlsZU5vcm1hbE1hc2s7Ci0gICAgdHJhaXRzTWFzayB8PSBGb250
VmFyaWFudE5vcm1hbE1hc2s7Ci0gICAgTE9ORyB3ZWlnaHQgPSBGb250UGxhdGZvcm1EYXRhOjph
ZGp1c3RlZEdESUZvbnRXZWlnaHQobG9nRm9udC0+bGZXZWlnaHQsIHByb2NEYXRhLT5tX2ZhbWls
eU5hbWUpOwotICAgIHRyYWl0c01hc2sgfD0gd2VpZ2h0ID09IEZXX1RISU4gPyBGb250V2VpZ2h0
MTAwTWFzayA6Ci0gICAgICAgIHdlaWdodCA9PSBGV19FWFRSQUxJR0hUID8gRm9udFdlaWdodDIw
ME1hc2sgOgotICAgICAgICB3ZWlnaHQgPT0gRldfTElHSFQgPyBGb250V2VpZ2h0MzAwTWFzayA6
Ci0gICAgICAgIHdlaWdodCA9PSBGV19OT1JNQUwgPyBGb250V2VpZ2h0NDAwTWFzayA6Ci0gICAg
ICAgIHdlaWdodCA9PSBGV19NRURJVU0gPyBGb250V2VpZ2h0NTAwTWFzayA6Ci0gICAgICAgIHdl
aWdodCA9PSBGV19TRU1JQk9MRCA/IEZvbnRXZWlnaHQ2MDBNYXNrIDoKLSAgICAgICAgd2VpZ2h0
ID09IEZXX0JPTEQgPyBGb250V2VpZ2h0NzAwTWFzayA6Ci0gICAgICAgIHdlaWdodCA9PSBGV19F
WFRSQUJPTEQgPyBGb250V2VpZ2h0ODAwTWFzayA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBGb250V2VpZ2h0OTAwTWFzazsKLSAgICBwcm9jRGF0YS0+bV90cmFpdHNNYXNrcy5h
ZGQodHJhaXRzTWFzayk7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgRm9udENhY2hlOjpwbGF0
Zm9ybUluaXQoKQotewotfQotCi12b2lkIEZvbnRDYWNoZTo6Y29tSW5pdGlhbGl6ZSgpCi17Ci19
Ci0KLXZvaWQgRm9udENhY2hlOjpjb21VbmluaXRpYWxpemUoKQotewotICAgIGlmIChsYW5nRm9u
dExpbmspIHsKLSAgICAgICAgbGFuZ0ZvbnRMaW5rLT5SZWxlYXNlKCk7Ci0gICAgICAgIGxhbmdG
b250TGluayA9IDA7Ci0gICAgfQotICAgIGlmIChtdWx0aUxhbmd1YWdlKSB7Ci0gICAgICAgIG11
bHRpTGFuZ3VhZ2UtPlJlbGVhc2UoKTsKLSAgICAgICAgbXVsdGlMYW5ndWFnZSA9IDA7Ci0gICAg
fQotfQotCi1jb25zdCBTaW1wbGVGb250RGF0YSogRm9udENhY2hlOjpnZXRGb250RGF0YUZvckNo
YXJhY3RlcnMoY29uc3QgRm9udCYgZm9udCwgY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIGludCBs
ZW5ndGgpCi17Ci0gICAgU3RyaW5nIGZhbWlseU5hbWU7Ci0gICAgV0NIQVIgbmFtZVtMRl9GQUNF
U0laRV07Ci0KLSAgICBVQ2hhciBjaGFyYWN0ZXIgPSBjaGFyYWN0ZXJzWzBdOwotICAgIGNvbnN0
IEZvbnRQbGF0Zm9ybURhdGEmIG9yaWdGb250ID0gZm9udC5wcmltYXJ5Rm9udCgpLT5mb250RGF0
YUZvckNoYXJhY3RlcihjaGFyYWN0ZXIpLT5wbGF0Zm9ybURhdGEoKTsKLSAgICB1bnNpZ25lZCB1
bmljb2RlUmFuZ2UgPSBmaW5kQ2hhclVuaWNvZGVSYW5nZShjaGFyYWN0ZXIpOwotCi0jaWYgZGVm
aW5lZChJTUxBTkdfRk9OVF9MSU5LKSAmJiAoSU1MQU5HX0ZPTlRfTElOSyA9PSAyKQotICAgIGlm
IChJTUxhbmdGb250TGluazIqIGxhbmdGb250TGluayA9IGdldEZvbnRMaW5rSW50ZXJmYWNlKCkp
IHsKLSNlbHNlCi0gICAgaWYgKElNTGFuZ0ZvbnRMaW5rKiBsYW5nRm9udExpbmsgPSBnZXRGb250
TGlua0ludGVyZmFjZSgpKSB7Ci0jZW5kaWYKLSAgICAgICAgSEdESU9CSiBvbGRGb250ID0gR2V0
Q3VycmVudE9iamVjdChnX3NjcmVlbkRDLCBPQkpfRk9OVCk7Ci0gICAgICAgIEhGT05UIGhmb250
ID0gMDsKLSAgICAgICAgRFdPUkQgY29kZVBhZ2VzID0gMDsKLSAgICAgICAgVUlOVCBjb2RlUGFn
ZSA9IDA7Ci0gICAgICAgIC8vIFRyeSBNTGFuZyBmb250IGxpbmtpbmcgZmlyc3QuCi0gICAgICAg
IGxhbmdGb250TGluay0+R2V0Q2hhckNvZGVQYWdlcyhjaGFyYWN0ZXIsICZjb2RlUGFnZXMpOwot
ICAgICAgICBpZiAoY29kZVBhZ2VzICYmIHVuaWNvZGVSYW5nZSA9PSBjUmFuZ2VTZXRDSkspIHsK
LSAgICAgICAgICAgIC8vIFRoZSBDSksgY2hhcmFjdGVyIG1heSBiZWxvbmcgdG8gbXVsdGlwbGUg
Y29kZSBwYWdlcy4gV2Ugd2FudCB0bwotICAgICAgICAgICAgLy8gZG8gZm9udCBsaW5raW5nIGFn
YWluc3QgYSBzaW5nbGUgb25lIG9mIHRoZW0sIHByZWZlcnJpbmcgdGhlIGRlZmF1bHQKLSAgICAg
ICAgICAgIC8vIGNvZGUgcGFnZSBmb3IgdGhlIHVzZXIncyBsb2NhbGUuCi0gICAgICAgICAgICBj
b25zdCBWZWN0b3I8RFdPUkQsIDQ+JiBDSktDb2RlUGFnZU1hc2tzID0gZ2V0Q0pLQ29kZVBhZ2VN
YXNrcygpOwotICAgICAgICAgICAgdW5zaWduZWQgbnVtQ29kZVBhZ2VzID0gQ0pLQ29kZVBhZ2VN
YXNrcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtQ29k
ZVBhZ2VzOyArK2kpIHsKLSNpZiBkZWZpbmVkKElNTEFOR19GT05UX0xJTkspICYmIChJTUxBTkdf
Rk9OVF9MSU5LID09IDIpCi0gICAgICAgICAgICAgICAgaGZvbnQgPSBjcmVhdGVNTGFuZ0ZvbnQo
bGFuZ0ZvbnRMaW5rLCBnX3NjcmVlbkRDLCBDSktDb2RlUGFnZU1hc2tzW2ldKTsKLSNlbHNlCi0g
ICAgICAgICAgICAgICAgaGZvbnQgPSBjcmVhdGVNTGFuZ0ZvbnQobGFuZ0ZvbnRMaW5rLCBnX3Nj
cmVlbkRDLCBvcmlnRm9udCwgQ0pLQ29kZVBhZ2VNYXNrc1tpXSk7Ci0jZW5kaWYKLSAgICAgICAg
ICAgICAgICBpZiAoIWhmb250KQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAg
ICAgICAgICAgICAgIFNlbGVjdE9iamVjdChnX3NjcmVlbkRDLCBoZm9udCk7Ci0gICAgICAgICAg
ICAgICAgR2V0VGV4dEZhY2UoZ19zY3JlZW5EQywgTEZfRkFDRVNJWkUsIG5hbWUpOwotCi0gICAg
ICAgICAgICAgICAgaWYgKGhmb250ICYmICEoY29kZVBhZ2VzICYgQ0pLQ29kZVBhZ2VNYXNrc1tp
XSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXNrZWQgYWJvdXQgYSBjb2RlIHBhZ2Ug
dGhhdCBpcyBub3Qgb25lIG9mIHRoZSBjb2RlIHBhZ2VzCi0gICAgICAgICAgICAgICAgICAgIC8v
IHJldHVybmVkIGJ5IE1MYW5nLCBzbyB0aGUgZm9udCBtaWdodCBub3QgY29udGFpbiB0aGUgY2hh
cmFjdGVyLgotI2lmIGRlZmluZWQoSU1MQU5HX0ZPTlRfTElOSykgJiYgKElNTEFOR19GT05UX0xJ
TksgPT0gMikKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50Rm9udENvbnRhaW5zQ2hh
cmFjdGVyKGxhbmdGb250TGluaywgZ19zY3JlZW5EQywgY2hhcmFjdGVyKSkgewotI2Vsc2UKLSAg
ICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50Rm9udENvbnRhaW5zQ2hhcmFjdGVyKGxhbmdG
b250TGluaywgZ19zY3JlZW5EQywgaGZvbnQsIGNoYXJhY3RlciwgbmFtZSkpIHsKLSNlbmRpZgot
ICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGdfc2NyZWVuREMsIG9sZEZvbnQp
OwotICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ0ZvbnRMaW5rLT5SZWxlYXNlRm9udChoZm9u
dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoZm9udCA9IDA7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNl
IHsKLSNpZiBkZWZpbmVkKElNTEFOR19GT05UX0xJTkspICYmIChJTUxBTkdfRk9OVF9MSU5LID09
IDIpCi0gICAgICAgICAgICBoZm9udCA9IGNyZWF0ZU1MYW5nRm9udChsYW5nRm9udExpbmssIGdf
c2NyZWVuREMsIGNvZGVQYWdlcywgY2hhcmFjdGVyKTsKLSNlbHNlCi0gICAgICAgICAgICBoZm9u
dCA9IGNyZWF0ZU1MYW5nRm9udChsYW5nRm9udExpbmssIGdfc2NyZWVuREMsIG9yaWdGb250LCBj
b2RlUGFnZXMpOwotI2VuZGlmCi0gICAgICAgICAgICBTZWxlY3RPYmplY3QoZ19zY3JlZW5EQywg
aGZvbnQpOwotICAgICAgICAgICAgR2V0VGV4dEZhY2UoZ19zY3JlZW5EQywgTEZfRkFDRVNJWkUs
IG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIFNlbGVjdE9iamVjdChnX3NjcmVlbkRDLCBvbGRG
b250KTsKLQotICAgICAgICBpZiAoaGZvbnQpIHsKLSAgICAgICAgICAgIGZhbWlseU5hbWUgPSBu
YW1lOwotICAgICAgICAgICAgbGFuZ0ZvbnRMaW5rLT5SZWxlYXNlRm9udChoZm9udCk7Ci0gICAg
ICAgIH0gZWxzZQotICAgICAgICAgICAgRm9udFBsYXRmb3JtRGF0YTo6bWFwS25vd25Gb250KGNv
ZGVQYWdlcywgZmFtaWx5TmFtZSk7Ci0gICAgfQotCi0gICAgaWYgKGZhbWlseU5hbWUuaXNFbXB0
eSgpKQotICAgICAgICBmYW1pbHlOYW1lID0gRm9udFBsYXRmb3JtRGF0YTo6ZGVmYXVsdEZvbnRG
YW1pbHkoKTsKLQotICAgIGlmICghZmFtaWx5TmFtZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgLy8g
RklYTUU6IHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBUaGFpIGZvbnQgcHJvYmxlbQotICAgICAg
ICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uKGZvbnQuZm9udERlc2NyaXB0aW9uKCkp
OwotICAgICAgICBpZiAodW5pY29kZVJhbmdlID09IGNSYW5nZVRoYWkgJiYgZm9udERlc2NyaXB0
aW9uLndlaWdodCgpID4gRm9udFdlaWdodE5vcm1hbCkKLSAgICAgICAgICAgIGZvbnREZXNjcmlw
dGlvbi5zZXRXZWlnaHQoRm9udFdlaWdodE5vcm1hbCk7Ci0KLSAgICAgICAgRm9udFBsYXRmb3Jt
RGF0YSogcmVzdWx0ID0gZ2V0Q2FjaGVkRm9udFBsYXRmb3JtRGF0YShmb250RGVzY3JpcHRpb24s
IGZhbWlseU5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC0+aGFzaCgpICE9IG9y
aWdGb250Lmhhc2goKSkgewotICAgICAgICAgICAgaWYgKFNpbXBsZUZvbnREYXRhKiBmb250RGF0
YSA9IGdldENhY2hlZEZvbnREYXRhKHJlc3VsdCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZv
bnREYXRhOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLVNpbXBsZUZv
bnREYXRhKiBGb250Q2FjaGU6OmdldFNpbWlsYXJGb250UGxhdGZvcm1EYXRhKGNvbnN0IEZvbnQm
IGZvbnQpCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLVNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6
OmdldExhc3RSZXNvcnRGYWxsYmFja0ZvbnQoY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVz
YykKLXsKLSAgICAvLyBGSVhNRTogV291bGQgYmUgZXZlbiBiZXR0ZXIgdG8gc29tZWhvdyBnZXQg
dGhlIHVzZXIncyBkZWZhdWx0IGZvbnQgaGVyZS4gIEZvciBub3cgd2UnbGwgcGljawotICAgIC8v
IHRoZSBkZWZhdWx0IHRoYXQgdGhlIHVzZXIgd291bGQgZ2V0IHdpdGhvdXQgY2hhbmdpbmcgYW55
IHByZWZzLgotICAgIHJldHVybiBnZXRDYWNoZWRGb250RGF0YShmb250RGVzYywgRm9udFBsYXRm
b3JtRGF0YTo6ZGVmYXVsdEZvbnRGYW1pbHkoKSk7Ci19Ci0KLUZvbnRQbGF0Zm9ybURhdGEqIEZv
bnRDYWNoZTo6Y3JlYXRlRm9udFBsYXRmb3JtRGF0YShjb25zdCBGb250RGVzY3JpcHRpb24mIGZv
bnREZXNjcmlwdGlvbiwgY29uc3QgQXRvbWljU3RyaW5nJiBmYW1pbHkpCi17Ci0gICAgRm9udFBs
YXRmb3JtRGF0YSogcmVzdWx0ID0gbmV3IEZvbnRQbGF0Zm9ybURhdGEoZm9udERlc2NyaXB0aW9u
LCBmYW1pbHkpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgRm9udENhY2hlOjpnZXRU
cmFpdHNJbkZhbWlseShjb25zdCBBdG9taWNTdHJpbmcmIGZhbWlseU5hbWUsIFZlY3Rvcjx1bnNp
Z25lZD4mIHRyYWl0c01hc2tzKQotewotICAgIExPR0ZPTlQgbG9nRm9udDsKLSAgICBsb2dGb250
LmxmQ2hhclNldCA9IERFRkFVTFRfQ0hBUlNFVDsKLSAgICB1bnNpZ25lZCBmYW1pbHlMZW5ndGgg
PSBzdGQ6Om1pbihmYW1pbHlOYW1lLmxlbmd0aCgpLCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oTEZf
RkFDRVNJWkUgLSAxKSk7Ci0gICAgbWVtY3B5KGxvZ0ZvbnQubGZGYWNlTmFtZSwgZmFtaWx5TmFt
ZS5jaGFyYWN0ZXJzKCksIGZhbWlseUxlbmd0aCAqIHNpemVvZihVQ2hhcikpOwotICAgIGxvZ0Zv
bnQubGZGYWNlTmFtZVtmYW1pbHlMZW5ndGhdID0gMDsKLSAgICBsb2dGb250LmxmUGl0Y2hBbmRG
YW1pbHkgPSAwOwotCi0gICAgVHJhaXRzSW5GYW1pbHlQcm9jRGF0YSBwcm9jRGF0YShmYW1pbHlO
YW1lKTsKLSAgICBFbnVtRm9udEZhbWlsaWVzRXgoZ19zY3JlZW5EQywgJmxvZ0ZvbnQsIHRyYWl0
c0luRmFtaWx5RW51bVByb2MsIHJlaW50ZXJwcmV0X2Nhc3Q8TFBBUkFNPigmcHJvY0RhdGEpLCAw
KTsKLSAgICBjb3B5VG9WZWN0b3IocHJvY0RhdGEubV90cmFpdHNNYXNrcywgdHJhaXRzTWFza3Mp
OwotfQotCi19Ci0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvRm9udFBs
YXRmb3JtRGF0YS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
Y2UvRm9udFBsYXRmb3JtRGF0YS5oCShyZXZpc2lvbiA1NzI4OSkKKysrIFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luY2UvRm9udFBsYXRmb3JtRGF0YS5oCSh3b3JraW5nIGNvcHkpCkBAIC0y
Miw4ICsyMiw4IEBACiAgKgogICovCiAKLSNpZm5kZWYgRm9udFBsYXRmb3JtRGF0YVdpbmNlX0gK
LSNkZWZpbmUgRm9udFBsYXRmb3JtRGF0YVdpbmNlX0gKKyNpZm5kZWYgRm9udFBsYXRmb3JtRGF0
YVdpbkNFX2gKKyNkZWZpbmUgRm9udFBsYXRmb3JtRGF0YVdpbkNFX2gKIAogI2luY2x1ZGUgIkZv
bnREZXNjcmlwdGlvbi5oIgogI2luY2x1ZGUgIlN0cmluZ0ltcGwuaCIKQEAgLTg3LDQgKzg3LDQg
QEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiB9CiAKLSNlbmRpZgorI2VuZGlmIC8vIEZvbnRQbGF0
Zm9ybURhdGFXaW5DRV9oCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0Zv
bnRXaW5DRS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5j
ZS9Gb250V2luQ0UuY3BwCShyZXZpc2lvbiA1NzI4OSkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW5jZS9Gb250V2luY2UuY3BwOjU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW5jZS9Gb250V2luQ0UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzMz
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIElu
Yy4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1
YnNpZGlhcnkoLWllcykKKyAqIENvcHlyaWdodCAoQykgMjAwOCBIb2xnZXIgSGFucyBQZXRlciBG
cmV5dGhlcgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRm9udC5oIgor
CisjaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCisjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCisj
aW5jbHVkZSAiRm9udENhY2hlLmgiCisjaW5jbHVkZSAiRm9udERhdGEuaCIKKyNpbmNsdWRlICJG
b250RmFsbGJhY2tMaXN0LmgiCisjaW5jbHVkZSAiR2x5cGhCdWZmZXIuaCIKKyNpbmNsdWRlICJH
cmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiTm90SW1w
bGVtZW50ZWQuaCIKKyNpbmNsdWRlICJXaWR0aEl0ZXJhdG9yLmgiCisjaW5jbHVkZSA8d3RmL01h
dGhFeHRyYXMuaD4KKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL3VuaWNv
ZGUvVW5pY29kZS5oPgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCit1c2luZyBuYW1lc3BhY2Ug
V1RGOjpVbmljb2RlOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0hEQyBnX3NjcmVlbkRDID0g
R2V0REMoMCk7CisKK2NsYXNzIFNjcmVlbkRjUmVsZWFzZXIgeworcHVibGljOgorICAgIH5TY3Jl
ZW5EY1JlbGVhc2VyKCkKKyAgICB7CisgICAgICAgIFJlbGVhc2VEQygwLCBnX3NjcmVlbkRDKTsK
KyAgICB9Cit9OworCitTY3JlZW5EY1JlbGVhc2VyIHJlbGVhc2VTY3JlZW5EYzsKKwordm9pZCBG
b250OjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3NDb250ZXh0LCBjb25zdCBT
aW1wbGVGb250RGF0YSogZm9udERhdGEsIGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZlciwK
KyAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSwgaW50IG51bUdseXBocywgY29uc3QgRmxv
YXRQb2ludCYgcG9pbnQpIGNvbnN0Cit7CisgICAgZ3JhcGhpY3NDb250ZXh0LT5kcmF3VGV4dChm
b250RGF0YSwgZ2x5cGhCdWZmZXIsIGZyb20sIG51bUdseXBocywgcG9pbnQpOworfQorCitjbGFz
cyBUZXh0UnVuQ29tcG9uZW50IHsKK3B1YmxpYzoKKyAgICBUZXh0UnVuQ29tcG9uZW50KCkgOiBt
X3RleHRSdW4oMCwgMCkge30KKyAgICBUZXh0UnVuQ29tcG9uZW50KGNvbnN0IFVDaGFyICpzdGFy
dCwgaW50IGxlbmd0aCwgY29uc3QgVGV4dFJ1biYgcGFyZW50VGV4dFJ1biwgY29uc3QgRm9udCAm
Zm9udCwgaW50IG9mZnNldCk7CisgICAgVGV4dFJ1bkNvbXBvbmVudChpbnQgc3BhY2VzLCBjb25z
dCBGb250ICZmb250LCBpbnQgb2Zmc2V0KTsKKyAgICB+VGV4dFJ1bkNvbXBvbmVudCgpIHsgbV90
ZXh0UnVuOyB9CisKKyAgICBib29sIGlzU3BhY2UoKSBjb25zdCB7IHJldHVybiBtX3NwYWNlczsg
fQorICAgIGludCB0ZXh0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9zcGFjZXMgPyBtX3NwYWNl
cyA6IG1fdGV4dFJ1bi5sZW5ndGgoKTsgfQorCisgICAgVGV4dFJ1biBtX3RleHRSdW47CisgICAg
ZmxvYXQgbV93aWR0aDsKKyAgICBpbnQgbV9vZmZzZXQ7CisgICAgaW50IG1fc3BhY2VzOworfTsK
KworVGV4dFJ1bkNvbXBvbmVudDo6VGV4dFJ1bkNvbXBvbmVudChjb25zdCBVQ2hhciAqc3RhcnQs
IGludCBsZW5ndGgsIGNvbnN0IFRleHRSdW4mIHBhcmVudFRleHRSdW4sIGNvbnN0IEZvbnQgJmZv
bnQsIGludCBvKQorICAgIDogbV90ZXh0UnVuKHN0YXJ0LCBsZW5ndGgsIHBhcmVudFRleHRSdW4u
YWxsb3dUYWJzKCksIDAsIDAKKyAgICAgICAgLCBwYXJlbnRUZXh0UnVuLnJ0bCgpCisgICAgICAg
ICwgcGFyZW50VGV4dFJ1bi5kaXJlY3Rpb25hbE92ZXJyaWRlKCkKKyAgICAgICAgLCBwYXJlbnRU
ZXh0UnVuLmFwcGx5UnVuUm91bmRpbmcoKQorICAgICAgICAsIHBhcmVudFRleHRSdW4uYXBwbHlX
b3JkUm91bmRpbmcoKSkKKyAgICAsIG1fb2Zmc2V0KG8pCisgICAgLCBtX3NwYWNlcygwKQorewor
ICAgIFdpZHRoSXRlcmF0b3IgaXQoJmZvbnQsIG1fdGV4dFJ1bik7CisgICAgaXQuYWR2YW5jZSht
X3RleHRSdW4ubGVuZ3RoKCksIDApOworICAgIG1fd2lkdGggPSBpdC5tX3J1bldpZHRoU29GYXI7
Cit9CisKK1RleHRSdW5Db21wb25lbnQ6OlRleHRSdW5Db21wb25lbnQoaW50IHMsIGNvbnN0IEZv
bnQgJmZvbnQsIGludCBvKQorICAgIDogbV90ZXh0UnVuKDAsIDApCisgICAgLCBtX29mZnNldChv
KQorICAgICwgbV9zcGFjZXMocykKK3sKKyAgICBtX3dpZHRoID0gcyAqIGZvbnQucHJpbWFyeUZv
bnQoKS0+d2lkdGhGb3JHbHlwaCgnICcpOworfQorCit0eXBlZGVmIFZlY3RvcjxUZXh0UnVuQ29t
cG9uZW50LCAxMjg+IFRleHRSdW5Db21wb25lbnRzOworCitzdGF0aWMgaW50IGdlbmVyYXRlQ29t
cG9uZW50cyhUZXh0UnVuQ29tcG9uZW50cyogY29tcG9uZW50cywgY29uc3QgRm9udCAmZm9udCwg
Y29uc3QgVGV4dFJ1biAmcnVuKQoreworICAgIGludCBsZXR0ZXJTcGFjaW5nID0gZm9udC5sZXR0
ZXJTcGFjaW5nKCk7CisgICAgaW50IHdvcmRTcGFjaW5nID0gZm9udC53b3JkU3BhY2luZygpOwor
ICAgIGludCBwYWRkaW5nID0gcnVuLnBhZGRpbmcoKTsKKyAgICBpbnQgbnVtU3BhY2VzID0gMDsK
KyAgICBpZiAocGFkZGluZykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJ1bi5sZW5n
dGgoKTsgaSsrKQorICAgICAgICAgICAgaWYgKEZvbnQ6OnRyZWF0QXNTcGFjZShydW5baV0pKQor
ICAgICAgICAgICAgICAgICsrbnVtU3BhY2VzOworICAgIH0KKworICAgIGludCBvZmZzZXQgPSAw
OworICAgIGlmIChsZXR0ZXJTcGFjaW5nKSB7CisgICAgICAgIC8vIG5lZWQgdG8gZHJhdyBldmVy
eSBsZXR0ZXIgb24gaXQncyBvd24KKyAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgaWYg
KEZvbnQ6OnRyZWF0QXNTcGFjZShydW5bMF0pKSB7CisgICAgICAgICAgICBpbnQgYWRkID0gMDsK
KyAgICAgICAgICAgIGlmIChudW1TcGFjZXMpIHsKKyAgICAgICAgICAgICAgICBhZGQgPSBwYWRk
aW5nL251bVNwYWNlczsKKyAgICAgICAgICAgICAgICBwYWRkaW5nIC09IGFkZDsKKyAgICAgICAg
ICAgICAgICAtLW51bVNwYWNlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbXBvbmVu
dHMtPmFwcGVuZChUZXh0UnVuQ29tcG9uZW50KDEsIGZvbnQsIG9mZnNldCkpOworICAgICAgICAg
ICAgb2Zmc2V0ICs9IGFkZCArIGxldHRlclNwYWNpbmcgKyBjb21wb25lbnRzLT5sYXN0KCkubV93
aWR0aDsKKyAgICAgICAgICAgIHN0YXJ0ID0gMTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGlu
dCBpID0gMTsgaSA8IHJ1bi5sZW5ndGgoKTsgKytpKSB7CisgICAgICAgICAgICB1aW50IGNoID0g
cnVuW2ldOworICAgICAgICAgICAgaWYgKGlzSGlnaFN1cnJvZ2F0ZShjaCkgJiYgaXNMb3dTdXJy
b2dhdGUocnVuW2ktMV0pKQorICAgICAgICAgICAgICAgIGNoID0gc3Vycm9nYXRlVG9VY3M0KGNo
LCBydW5baS0xXSk7CisgICAgICAgICAgICBpZiAoaXNMb3dTdXJyb2dhdGUoY2gpIHx8IGNhdGVn
b3J5KGNoKSA9PSBNYXJrX05vblNwYWNpbmcpCisgICAgICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgICAgICBpZiAoRm9udDo6dHJlYXRBc1NwYWNlKHJ1bltpXSkpIHsKKyAgICAgICAgICAg
ICAgICBpbnQgYWRkID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoaSAtIHN0YXJ0ID4gMCkgewor
ICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLT5hcHBlbmQoVGV4dFJ1bkNvbXBvbmVudChy
dW4uY2hhcmFjdGVycygpICsgc3RhcnQsIGkgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuLCBmb250LCBvZmZzZXQpKTsK
KyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGNvbXBvbmVudHMtPmxhc3QoKS5tX3dpZHRo
ICsgbGV0dGVyU3BhY2luZzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYg
KG51bVNwYWNlcykgeworICAgICAgICAgICAgICAgICAgICBhZGQgPSBwYWRkaW5nL251bVNwYWNl
czsKKyAgICAgICAgICAgICAgICAgICAgcGFkZGluZyAtPSBhZGQ7CisgICAgICAgICAgICAgICAg
ICAgIC0tbnVtU3BhY2VzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb21w
b25lbnRzLT5hcHBlbmQoVGV4dFJ1bkNvbXBvbmVudCgxLCBmb250LCBvZmZzZXQpKTsKKyAgICAg
ICAgICAgICAgICBvZmZzZXQgKz0gd29yZFNwYWNpbmcgKyBhZGQgKyBjb21wb25lbnRzLT5sYXN0
KCkubV93aWR0aCArIGxldHRlclNwYWNpbmc7CisgICAgICAgICAgICAgICAgc3RhcnQgPSBpICsg
MTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IGlmIChpIC0gc3RhcnQgPiAwKSB7CisgICAgICAgICAgICAgICAgY29tcG9uZW50cy0+YXBwZW5k
KFRleHRSdW5Db21wb25lbnQocnVuLmNoYXJhY3RlcnMoKSArIHN0YXJ0LCBpIC0gc3RhcnQsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQs
IG9mZnNldCkpOworICAgICAgICAgICAgICAgIG9mZnNldCArPSBjb21wb25lbnRzLT5sYXN0KCku
bV93aWR0aCArIGxldHRlclNwYWNpbmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGFy
dCA9IGk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJ1bi5sZW5ndGgoKSAtIHN0YXJ0ID4gMCkg
eworICAgICAgICAgICAgY29tcG9uZW50cy0+YXBwZW5kKFRleHRSdW5Db21wb25lbnQocnVuLmNo
YXJhY3RlcnMoKSArIHN0YXJ0LCBydW4ubGVuZ3RoKCkgLSBzdGFydCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQsIG9mZnNldCkpOworICAgICAgICAg
ICAgb2Zmc2V0ICs9IGNvbXBvbmVudHMtPmxhc3QoKS5tX3dpZHRoOworICAgICAgICB9CisgICAg
ICAgIG9mZnNldCArPSBsZXR0ZXJTcGFjaW5nOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBz
dGFydCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVuLmxlbmd0aCgpOyArK2kp
IHsKKyAgICAgICAgICAgIGlmIChGb250Ojp0cmVhdEFzU3BhY2UocnVuW2ldKSkgeworICAgICAg
ICAgICAgICAgIGlmIChpIC0gc3RhcnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbXBv
bmVudHMtPmFwcGVuZChUZXh0UnVuQ29tcG9uZW50KHJ1bi5jaGFyYWN0ZXJzKCkgKyBzdGFydCwg
aSAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBydW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGZvbnQsIG9mZnNldCkpOworICAgICAgICAgICAgICAgICAgICBvZmZz
ZXQgKz0gY29tcG9uZW50cy0+bGFzdCgpLm1fd2lkdGg7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIGludCBhZGQgPSAwOworICAgICAgICAgICAgICAgIGlmIChudW1TcGFjZXMp
IHsKKyAgICAgICAgICAgICAgICAgICAgYWRkID0gcGFkZGluZy9udW1TcGFjZXM7CisgICAgICAg
ICAgICAgICAgICAgIHBhZGRpbmcgLT0gYWRkOworICAgICAgICAgICAgICAgICAgICAtLW51bVNw
YWNlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29tcG9uZW50cy0+YXBw
ZW5kKFRleHRSdW5Db21wb25lbnQoMSwgZm9udCwgb2Zmc2V0KSk7CisgICAgICAgICAgICAgICAg
b2Zmc2V0ICs9IGFkZCArIGNvbXBvbmVudHMtPmxhc3QoKS5tX3dpZHRoOworICAgICAgICAgICAg
ICAgIGlmIChpKQorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gd29yZFNwYWNpbmc7Cisg
ICAgICAgICAgICAgICAgc3RhcnQgPSBpICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgICAgICBpZiAocnVuLmxlbmd0aCgpIC0gc3RhcnQgPiAwKSB7CisgICAgICAgICAgICBjb21w
b25lbnRzLT5hcHBlbmQoVGV4dFJ1bkNvbXBvbmVudChydW4uY2hhcmFjdGVycygpICsgc3RhcnQs
IHJ1bi5sZW5ndGgoKSAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgcnVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZm9udCwgb2Zmc2V0KSk7CisgICAgICAgICAgICBvZmZzZXQgKz0gY29tcG9u
ZW50cy0+bGFzdCgpLm1fd2lkdGg7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG9mZnNl
dDsKK30KKwordm9pZCBGb250OjpkcmF3Q29tcGxleFRleHQoR3JhcGhpY3NDb250ZXh0KiBjb250
ZXh0LCBjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgaW50IGZyb20sIGludCB0bykgY29uc3QKK3sKKyAgICBpZiAo
dG8gPCAwKQorICAgICAgICB0byA9IHJ1bi5sZW5ndGgoKTsKKyAgICBpZiAoZnJvbSA8IDApCisg
ICAgICAgIGZyb20gPSAwOworCisgICAgVGV4dFJ1bkNvbXBvbmVudHMgY29tcG9uZW50czsKKyAg
ICBpbnQgdyA9IGdlbmVyYXRlQ29tcG9uZW50cygmY29tcG9uZW50cywgKnRoaXMsIHJ1bik7CisK
KyAgICBpbnQgY3VyUG9zID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpY29tcG9u
ZW50cy5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBUZXh0UnVuQ29tcG9uZW50JiBjb21w
ID0gY29tcG9uZW50cy5hdChpKTsKKyAgICAgICAgaW50IGxlbiA9IGNvbXAudGV4dExlbmd0aCgp
OworICAgICAgICBpbnQgY3VyRW5kID0gY3VyUG9zICsgbGVuOworICAgICAgICBpZiAoY3VyUG9z
IDwgdG8gJiYgZnJvbSA8IGN1ckVuZCAmJiAhY29tcC5pc1NwYWNlKCkpIHsKKyAgICAgICAgICAg
IEZsb2F0UG9pbnQgcHQgPSBwb2ludDsKKyAgICAgICAgICAgIGlmIChydW4ucnRsKCkpCisgICAg
ICAgICAgICAgICAgcHQuc2V0WChwb2ludC54KCkgKyB3IC0gY29tcC5tX29mZnNldCAtIGNvbXAu
bV93aWR0aCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHQuc2V0WChwb2lu
dC54KCkgKyBjb21wLm1fb2Zmc2V0KTsKKyAgICAgICAgICAgIGRyYXdTaW1wbGVUZXh0KGNvbnRl
eHQsIGNvbXAubV90ZXh0UnVuLCBwdCwgZnJvbSAtIGN1clBvcywgc3RkOjptaW4odG8sIGN1ckVu
ZCkgLSBjdXJQb3MpOworICAgICAgICB9CisgICAgICAgIGN1clBvcyArPSBsZW47CisgICAgICAg
IGlmIChmcm9tIDwgY3VyUG9zKQorICAgICAgICAgICAgZnJvbSA9IGN1clBvczsKKyAgICB9Cit9
CisKK2Zsb2F0IEZvbnQ6OmZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBy
dW4sIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiogZmFsbGJhY2tGb250cywgR2x5cGhP
dmVyZmxvdyogZ2x5cGhPdmVyZmxvdykgY29uc3QKK3sKKyAgICBUZXh0UnVuQ29tcG9uZW50cyBj
b21wb25lbnRzOworICAgIGludCB3ID0gZ2VuZXJhdGVDb21wb25lbnRzKCZjb21wb25lbnRzLCAq
dGhpcywgcnVuKTsKKyAgICByZXR1cm4gdzsKK30KKworaW50IEZvbnQ6Om9mZnNldEZvclBvc2l0
aW9uRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBpbnQgcG9zaXRpb24sIGJvb2wg
aW5jbHVkZVBhcnRpYWxHbHlwaHMpIGNvbnN0Cit7CisgICAgVGV4dFJ1bkNvbXBvbmVudHMgY29t
cG9uZW50czsKKyAgICBpbnQgdyA9IGdlbmVyYXRlQ29tcG9uZW50cygmY29tcG9uZW50cywgKnRo
aXMsIHJ1bik7CisKKyAgICBpZiAocG9zaXRpb24gPj0gdykKKyAgICAgICAgcmV0dXJuIHJ1bi5s
ZW5ndGgoKTsKKworICAgIGludCBvZmZzZXQgPSAwOworICAgIGlmIChydW4ucnRsKCkpIHsKKyAg
ICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb21wb25lbnRzLnNpemUoKTsgKytpKSB7Cisg
ICAgICAgICAgICBjb25zdCBUZXh0UnVuQ29tcG9uZW50JiBjb21wID0gY29tcG9uZW50cy5hdChp
KTsKKyAgICAgICAgICAgIGludCB4ZSA9IHcgLSBjb21wLm1fb2Zmc2V0OworICAgICAgICAgICAg
aW50IHhzID0geGUgLSBjb21wLm1fd2lkdGg7CisgICAgICAgICAgICBpZiAocG9zaXRpb24gPj0g
eHMpCisgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldCArIChjb21wLmlzU3BhY2UoKQorICAg
ICAgICAgICAgICAgICAgICA/IHN0YXRpY19jYXN0PGludD4oKHBvc2l0aW9uIC0geGUpICogY29t
cC5tX3NwYWNlcyAvIHN0ZDo6bWF4KDEuZiwgY29tcC5tX3dpZHRoKSArIDAuNSkKKyAgICAgICAg
ICAgICAgICAgICAgOiBvZmZzZXRGb3JQb3NpdGlvbkZvclNpbXBsZVRleHQoY29tcC5tX3RleHRS
dW4sIHBvc2l0aW9uIC0geHMsIGluY2x1ZGVQYXJ0aWFsR2x5cGhzKSk7CisKKyAgICAgICAgICAg
IG9mZnNldCArPSBjb21wLnRleHRMZW5ndGgoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7Cisg
ICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29tcG9uZW50cy5zaXplKCk7ICsraSkgewor
ICAgICAgICAgICAgY29uc3QgVGV4dFJ1bkNvbXBvbmVudCYgY29tcCA9IGNvbXBvbmVudHMuYXQo
aSk7CisgICAgICAgICAgICBpbnQgeHMgPSBjb21wLm1fb2Zmc2V0OworICAgICAgICAgICAgaW50
IHhlID0geHMgKyBjb21wLm1fd2lkdGg7CisgICAgICAgICAgICBpZiAocG9zaXRpb24gPD0geGUp
IHsKKyAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gLSB4cyA+PSB4ZSkKKyAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIG9mZnNldCArIGNvbXAudGV4dExlbmd0aCgpOworICAgICAgICAgICAg
ICAgIHJldHVybiBvZmZzZXQgKyAoY29tcC5pc1NwYWNlKCkKKyAgICAgICAgICAgICAgICAgICAg
PyBzdGF0aWNfY2FzdDxpbnQ+KChwb3NpdGlvbiAtIHhzKSAqIGNvbXAubV9zcGFjZXMgLyBzdGQ6
Om1heCgxLmYsIGNvbXAubV93aWR0aCkgKyAwLjUpCisgICAgICAgICAgICAgICAgICAgIDogb2Zm
c2V0Rm9yUG9zaXRpb25Gb3JTaW1wbGVUZXh0KGNvbXAubV90ZXh0UnVuLCBwb3NpdGlvbiAtIHhz
LCBpbmNsdWRlUGFydGlhbEdseXBocykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2Zm
c2V0ICs9IGNvbXAudGV4dExlbmd0aCgpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBy
dW4ubGVuZ3RoKCk7Cit9CisKKworc3RhdGljIGZsb2F0IGN1cnNvclRvWChjb25zdCBGb250KiBm
b250LCBjb25zdCBUZXh0UnVuQ29tcG9uZW50cyYgY29tcG9uZW50cywgaW50IHdpZHRoLCBib29s
IHJ0bCwgaW50IGN1cnNvcikKK3sKKyAgICBpbnQgc3RhcnQgPSAwOworICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgY29tcG9uZW50cy5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBUZXh0
UnVuQ29tcG9uZW50JiBjb21wID0gY29tcG9uZW50cy5hdChpKTsKKyAgICAgICAgaWYgKHN0YXJ0
ICsgY29tcC50ZXh0TGVuZ3RoKCkgPD0gY3Vyc29yKSB7CisgICAgICAgICAgICBzdGFydCArPSBj
b21wLnRleHRMZW5ndGgoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAg
ICAgIGludCB4cyA9IGNvbXAubV9vZmZzZXQ7CisgICAgICAgIGlmIChydGwpCisgICAgICAgICAg
ICB4cyA9IHdpZHRoIC0geHMgLSBjb21wLm1fd2lkdGg7CisKKyAgICAgICAgaW50IHBvcyA9IGN1
cnNvciAtIHN0YXJ0OworICAgICAgICBpZiAoY29tcC5pc1NwYWNlKCkpIHsKKyAgICAgICAgICAg
IGlmIChydGwpCisgICAgICAgICAgICAgICAgcG9zID0gY29tcC50ZXh0TGVuZ3RoKCkgLSBwb3M7
CisgICAgICAgICAgICByZXR1cm4geHMgKyBwb3MgKiBjb21wLm1fd2lkdGggLyBjb21wLm1fc3Bh
Y2VzOworICAgICAgICB9CisgICAgICAgIFdpZHRoSXRlcmF0b3IgaXQoZm9udCwgY29tcC5tX3Rl
eHRSdW4pOworICAgICAgICBpdC5hZHZhbmNlKHBvcyk7CisgICAgICAgIHJldHVybiB4cyArIGl0
Lm1fcnVuV2lkdGhTb0ZhcjsKKyAgICB9CisgICAgcmV0dXJuIHdpZHRoOworfQorCitGbG9hdFJl
Y3QgRm9udDo6c2VsZWN0aW9uUmVjdEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwg
Y29uc3QgSW50UG9pbnQmIHB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGludCBoLCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAoreworICAgIFRleHRSdW5Db21wb25lbnRz
IGNvbXBvbmVudHM7CisgICAgaW50IHcgPSBnZW5lcmF0ZUNvbXBvbmVudHMoJmNvbXBvbmVudHMs
ICp0aGlzLCBydW4pOworCisgICAgaWYgKCFmcm9tICYmIHRvID09IHJ1bi5sZW5ndGgoKSkKKyAg
ICAgICAgcmV0dXJuIEZsb2F0UmVjdChwdC54KCksIHB0LnkoKSwgdywgaCk7CisKKyAgICBmbG9h
dCB4MSA9IGN1cnNvclRvWCh0aGlzLCBjb21wb25lbnRzLCB3LCBydW4ucnRsKCksIGZyb20pOwor
ICAgIGZsb2F0IHgyID0gY3Vyc29yVG9YKHRoaXMsIGNvbXBvbmVudHMsIHcsIHJ1bi5ydGwoKSwg
dG8pOworICAgIGlmICh4MiA8IHgxKQorICAgICAgICBzdGQ6OnN3YXAoeDEsIHgyKTsKKworICAg
IHJldHVybiBGbG9hdFJlY3QocHQueCgpICsgeDEsIHB0LnkoKSwgeDIgLSB4MSwgaCk7Cit9CisK
K2Jvb2wgRm9udDo6Y2FuUmV0dXJuRmFsbGJhY2tGb250c0ZvckNvbXBsZXhUZXh0KCkKK3sKKyAg
ICByZXR1cm4gZmFsc2U7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luY2UvRm9udFdpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbmNlL0ZvbnRXaW5DRS5jcHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9Gb250V2luQ0UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMzAs
NCArMzMwLDQgQEAgYm9vbCBGb250OjpjYW5SZXR1cm5GYWxsYmFja0ZvbnRzRm9yQ29tcAogICAg
IHJldHVybiBmYWxzZTsKIH0KIAotfQorfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9Gb250V2luY2UuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvRm9udFdpbmNlLmNwcAkocmV2aXNpb24g
NTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ZvbnRXaW5jZS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTEsMzMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIw
MDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAo
QykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA4IE5v
a2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQotICogQ29weXJpZ2h0
IChDKSAyMDA4IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCi0gKgotICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0g
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCi0gKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAotICovCi0KLSNpbmNsdWRlICJj
b25maWcuaCIKLSNpbmNsdWRlICJGb250LmgiCi0KLSNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0u
aCIKLSNpbmNsdWRlICJGbG9hdFJlY3QuaCIKLSNpbmNsdWRlICJGb250Q2FjaGUuaCIKLSNpbmNs
dWRlICJGb250RGF0YS5oIgotI2luY2x1ZGUgIkZvbnRGYWxsYmFja0xpc3QuaCIKLSNpbmNsdWRl
ICJHbHlwaEJ1ZmZlci5oIgotI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgotI2luY2x1ZGUg
IkludFJlY3QuaCIKLSNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgotI2luY2x1ZGUgIldpZHRo
SXRlcmF0b3IuaCIKLSNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgotI2luY2x1ZGUgPHd0Zi9P
d25QdHIuaD4KLSNpbmNsdWRlIDx3dGYvdW5pY29kZS9Vbmljb2RlLmg+Ci0KLSNpbmNsdWRlIDx3
aW5kb3dzLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBXVEY6OlVuaWNvZGU7Ci0KLW5hbWVzcGFjZSBX
ZWJDb3JlIHsKLQotSERDIGdfc2NyZWVuREMgPSBHZXREQygwKTsKLQotY2xhc3MgU2NyZWVuRGNS
ZWxlYXNlciB7Ci1wdWJsaWM6Ci0gICAgflNjcmVlbkRjUmVsZWFzZXIoKQotICAgIHsKLSAgICAg
ICAgUmVsZWFzZURDKDAsIGdfc2NyZWVuREMpOwotICAgIH0KLX07Ci0KLVNjcmVlbkRjUmVsZWFz
ZXIgcmVsZWFzZVNjcmVlbkRjOwotCi12b2lkIEZvbnQ6OmRyYXdHbHlwaHMoR3JhcGhpY3NDb250
ZXh0KiBncmFwaGljc0NvbnRleHQsIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250RGF0YSwgY29u
c3QgR2x5cGhCdWZmZXImIGdseXBoQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgIGludCBm
cm9tLCBpbnQgbnVtR2x5cGhzLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29uc3QKLXsKLSAg
ICBncmFwaGljc0NvbnRleHQtPmRyYXdUZXh0KGZvbnREYXRhLCBnbHlwaEJ1ZmZlciwgZnJvbSwg
bnVtR2x5cGhzLCBwb2ludCk7Ci19Ci0KLWNsYXNzIFRleHRSdW5Db21wb25lbnQgewotcHVibGlj
OgotICAgIFRleHRSdW5Db21wb25lbnQoKSA6IG1fdGV4dFJ1bigwLCAwKSB7fQotICAgIFRleHRS
dW5Db21wb25lbnQoY29uc3QgVUNoYXIgKnN0YXJ0LCBpbnQgbGVuZ3RoLCBjb25zdCBUZXh0UnVu
JiBwYXJlbnRUZXh0UnVuLCBjb25zdCBGb250ICZmb250LCBpbnQgb2Zmc2V0KTsKLSAgICBUZXh0
UnVuQ29tcG9uZW50KGludCBzcGFjZXMsIGNvbnN0IEZvbnQgJmZvbnQsIGludCBvZmZzZXQpOwot
ICAgIH5UZXh0UnVuQ29tcG9uZW50KCkgeyBtX3RleHRSdW47IH0KLQotICAgIGJvb2wgaXNTcGFj
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3BhY2VzOyB9Ci0gICAgaW50IHRleHRMZW5ndGgoKSBjb25z
dCB7IHJldHVybiBtX3NwYWNlcyA/IG1fc3BhY2VzIDogbV90ZXh0UnVuLmxlbmd0aCgpOyB9Ci0K
LSAgICBUZXh0UnVuIG1fdGV4dFJ1bjsKLSAgICBmbG9hdCBtX3dpZHRoOwotICAgIGludCBtX29m
ZnNldDsKLSAgICBpbnQgbV9zcGFjZXM7Ci19OwotCi1UZXh0UnVuQ29tcG9uZW50OjpUZXh0UnVu
Q29tcG9uZW50KGNvbnN0IFVDaGFyICpzdGFydCwgaW50IGxlbmd0aCwgY29uc3QgVGV4dFJ1biYg
cGFyZW50VGV4dFJ1biwgY29uc3QgRm9udCAmZm9udCwgaW50IG8pCi0gICAgOiBtX3RleHRSdW4o
c3RhcnQsIGxlbmd0aCwgcGFyZW50VGV4dFJ1bi5hbGxvd1RhYnMoKSwgMCwgMAotICAgICAgICAs
IHBhcmVudFRleHRSdW4ucnRsKCkKLSAgICAgICAgLCBwYXJlbnRUZXh0UnVuLmRpcmVjdGlvbmFs
T3ZlcnJpZGUoKQotICAgICAgICAsIHBhcmVudFRleHRSdW4uYXBwbHlSdW5Sb3VuZGluZygpCi0g
ICAgICAgICwgcGFyZW50VGV4dFJ1bi5hcHBseVdvcmRSb3VuZGluZygpKQotICAgICwgbV9vZmZz
ZXQobykKLSAgICAsIG1fc3BhY2VzKDApCi17Ci0gICAgV2lkdGhJdGVyYXRvciBpdCgmZm9udCwg
bV90ZXh0UnVuKTsKLSAgICBpdC5hZHZhbmNlKG1fdGV4dFJ1bi5sZW5ndGgoKSwgMCk7Ci0gICAg
bV93aWR0aCA9IGl0Lm1fcnVuV2lkdGhTb0ZhcjsKLX0KLQotVGV4dFJ1bkNvbXBvbmVudDo6VGV4
dFJ1bkNvbXBvbmVudChpbnQgcywgY29uc3QgRm9udCAmZm9udCwgaW50IG8pCi0gICAgOiBtX3Rl
eHRSdW4oMCwgMCkKLSAgICAsIG1fb2Zmc2V0KG8pCi0gICAgLCBtX3NwYWNlcyhzKQotewotICAg
IG1fd2lkdGggPSBzICogZm9udC5wcmltYXJ5Rm9udCgpLT53aWR0aEZvckdseXBoKCcgJyk7Ci19
Ci0KLXR5cGVkZWYgVmVjdG9yPFRleHRSdW5Db21wb25lbnQsIDEyOD4gVGV4dFJ1bkNvbXBvbmVu
dHM7Ci0KLXN0YXRpYyBpbnQgZ2VuZXJhdGVDb21wb25lbnRzKFRleHRSdW5Db21wb25lbnRzKiBj
b21wb25lbnRzLCBjb25zdCBGb250ICZmb250LCBjb25zdCBUZXh0UnVuICZydW4pCi17Ci0gICAg
aW50IGxldHRlclNwYWNpbmcgPSBmb250LmxldHRlclNwYWNpbmcoKTsKLSAgICBpbnQgd29yZFNw
YWNpbmcgPSBmb250LndvcmRTcGFjaW5nKCk7Ci0gICAgaW50IHBhZGRpbmcgPSBydW4ucGFkZGlu
ZygpOwotICAgIGludCBudW1TcGFjZXMgPSAwOwotICAgIGlmIChwYWRkaW5nKSB7Ci0gICAgICAg
IGZvciAoaW50IGkgPSAwOyBpIDwgcnVuLmxlbmd0aCgpOyBpKyspCi0gICAgICAgICAgICBpZiAo
Rm9udDo6dHJlYXRBc1NwYWNlKHJ1bltpXSkpCi0gICAgICAgICAgICAgICAgKytudW1TcGFjZXM7
Ci0gICAgfQotCi0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgaWYgKGxldHRlclNwYWNpbmcpIHsK
LSAgICAgICAgLy8gbmVlZCB0byBkcmF3IGV2ZXJ5IGxldHRlciBvbiBpdCdzIG93bgotICAgICAg
ICBpbnQgc3RhcnQgPSAwOwotICAgICAgICBpZiAoRm9udDo6dHJlYXRBc1NwYWNlKHJ1blswXSkp
IHsKLSAgICAgICAgICAgIGludCBhZGQgPSAwOwotICAgICAgICAgICAgaWYgKG51bVNwYWNlcykg
ewotICAgICAgICAgICAgICAgIGFkZCA9IHBhZGRpbmcvbnVtU3BhY2VzOwotICAgICAgICAgICAg
ICAgIHBhZGRpbmcgLT0gYWRkOwotICAgICAgICAgICAgICAgIC0tbnVtU3BhY2VzOwotICAgICAg
ICAgICAgfQotICAgICAgICAgICAgY29tcG9uZW50cy0+YXBwZW5kKFRleHRSdW5Db21wb25lbnQo
MSwgZm9udCwgb2Zmc2V0KSk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gYWRkICsgbGV0dGVyU3Bh
Y2luZyArIGNvbXBvbmVudHMtPmxhc3QoKS5tX3dpZHRoOwotICAgICAgICAgICAgc3RhcnQgPSAx
OwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcnVuLmxlbmd0aCgpOyAr
K2kpIHsKLSAgICAgICAgICAgIHVpbnQgY2ggPSBydW5baV07Ci0gICAgICAgICAgICBpZiAoaXNI
aWdoU3Vycm9nYXRlKGNoKSAmJiBpc0xvd1N1cnJvZ2F0ZShydW5baS0xXSkpCi0gICAgICAgICAg
ICAgICAgY2ggPSBzdXJyb2dhdGVUb1VjczQoY2gsIHJ1bltpLTFdKTsKLSAgICAgICAgICAgIGlm
IChpc0xvd1N1cnJvZ2F0ZShjaCkgfHwgY2F0ZWdvcnkoY2gpID09IE1hcmtfTm9uU3BhY2luZykK
LSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChGb250Ojp0cmVhdEFz
U3BhY2UocnVuW2ldKSkgewotICAgICAgICAgICAgICAgIGludCBhZGQgPSAwOwotICAgICAgICAg
ICAgICAgIGlmIChpIC0gc3RhcnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVu
dHMtPmFwcGVuZChUZXh0UnVuQ29tcG9uZW50KHJ1bi5jaGFyYWN0ZXJzKCkgKyBzdGFydCwgaSAt
IHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBydW4sIGZvbnQsIG9mZnNldCkpOwotICAgICAgICAgICAgICAgICAgICBvZmZzZXQg
Kz0gY29tcG9uZW50cy0+bGFzdCgpLm1fd2lkdGggKyBsZXR0ZXJTcGFjaW5nOwotICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobnVtU3BhY2VzKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIGFkZCA9IHBhZGRpbmcvbnVtU3BhY2VzOwotICAgICAgICAgICAgICAgICAgICBwYWRk
aW5nIC09IGFkZDsKLSAgICAgICAgICAgICAgICAgICAgLS1udW1TcGFjZXM7Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgICAgIGNvbXBvbmVudHMtPmFwcGVuZChUZXh0UnVuQ29tcG9u
ZW50KDEsIGZvbnQsIG9mZnNldCkpOwotICAgICAgICAgICAgICAgIG9mZnNldCArPSB3b3JkU3Bh
Y2luZyArIGFkZCArIGNvbXBvbmVudHMtPmxhc3QoKS5tX3dpZHRoICsgbGV0dGVyU3BhY2luZzsK
LSAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOwotICAgICAgICAgICAgICAgIGNvbnRpbnVl
OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkgLSBzdGFydCA+IDApIHsKLSAgICAg
ICAgICAgICAgICBjb21wb25lbnRzLT5hcHBlbmQoVGV4dFJ1bkNvbXBvbmVudChydW4uY2hhcmFj
dGVycygpICsgc3RhcnQsIGkgLSBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBydW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZm9udCwgb2Zmc2V0KSk7Ci0gICAgICAgICAgICAgICAg
b2Zmc2V0ICs9IGNvbXBvbmVudHMtPmxhc3QoKS5tX3dpZHRoICsgbGV0dGVyU3BhY2luZzsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXJ0ID0gaTsKLSAgICAgICAgfQotICAgICAgICBp
ZiAocnVuLmxlbmd0aCgpIC0gc3RhcnQgPiAwKSB7Ci0gICAgICAgICAgICBjb21wb25lbnRzLT5h
cHBlbmQoVGV4dFJ1bkNvbXBvbmVudChydW4uY2hhcmFjdGVycygpICsgc3RhcnQsIHJ1bi5sZW5n
dGgoKSAtIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcnVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZm9udCwgb2Zmc2V0KSk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gY29tcG9uZW50cy0+bGFz
dCgpLm1fd2lkdGg7Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0ICs9IGxldHRlclNwYWNpbmc7
Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IHN0YXJ0ID0gMDsKLSAgICAgICAgZm9yIChpbnQg
aSA9IDA7IGkgPCBydW4ubGVuZ3RoKCk7ICsraSkgewotICAgICAgICAgICAgaWYgKEZvbnQ6OnRy
ZWF0QXNTcGFjZShydW5baV0pKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGkgLSBzdGFydCA+IDAp
IHsKLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy0+YXBwZW5kKFRleHRSdW5Db21wb25l
bnQocnVuLmNoYXJhY3RlcnMoKSArIHN0YXJ0LCBpIC0gc3RhcnQsCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udCwgb2Zmc2V0
KSk7Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBjb21wb25lbnRzLT5sYXN0KCkubV93
aWR0aDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IGFkZCA9IDA7Ci0g
ICAgICAgICAgICAgICAgaWYgKG51bVNwYWNlcykgewotICAgICAgICAgICAgICAgICAgICBhZGQg
PSBwYWRkaW5nL251bVNwYWNlczsKLSAgICAgICAgICAgICAgICAgICAgcGFkZGluZyAtPSBhZGQ7
Ci0gICAgICAgICAgICAgICAgICAgIC0tbnVtU3BhY2VzOwotICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgICAgICBjb21wb25lbnRzLT5hcHBlbmQoVGV4dFJ1bkNvbXBvbmVudCgxLCBmb250
LCBvZmZzZXQpKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gYWRkICsgY29tcG9uZW50cy0+
bGFzdCgpLm1fd2lkdGg7Ci0gICAgICAgICAgICAgICAgaWYgKGkpCi0gICAgICAgICAgICAgICAg
ICAgIG9mZnNldCArPSB3b3JkU3BhY2luZzsKLSAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAx
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChydW4ubGVuZ3RoKCkgLSBz
dGFydCA+IDApIHsKLSAgICAgICAgICAgIGNvbXBvbmVudHMtPmFwcGVuZChUZXh0UnVuQ29tcG9u
ZW50KHJ1bi5jaGFyYWN0ZXJzKCkgKyBzdGFydCwgcnVuLmxlbmd0aCgpIC0gc3RhcnQsCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW4sCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LCBvZmZzZXQpKTsK
LSAgICAgICAgICAgIG9mZnNldCArPSBjb21wb25lbnRzLT5sYXN0KCkubV93aWR0aDsKLSAgICAg
ICAgfQotICAgIH0KLSAgICByZXR1cm4gb2Zmc2V0OwotfQotCi12b2lkIEZvbnQ6OmRyYXdDb21w
bGV4VGV4dChHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29u
c3QgRmxvYXRQb2ludCYgcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJv
bSwgaW50IHRvKSBjb25zdAotewotICAgIGlmICh0byA8IDApCi0gICAgICAgIHRvID0gcnVuLmxl
bmd0aCgpOwotICAgIGlmIChmcm9tIDwgMCkKLSAgICAgICAgZnJvbSA9IDA7Ci0KLSAgICBUZXh0
UnVuQ29tcG9uZW50cyBjb21wb25lbnRzOwotICAgIGludCB3ID0gZ2VuZXJhdGVDb21wb25lbnRz
KCZjb21wb25lbnRzLCAqdGhpcywgcnVuKTsKLQotICAgIGludCBjdXJQb3MgPSAwOwotICAgIGZv
ciAoaW50IGkgPSAwOyBpIDwgKGludCljb21wb25lbnRzLnNpemUoKTsgKytpKSB7Ci0gICAgICAg
IGNvbnN0IFRleHRSdW5Db21wb25lbnQmIGNvbXAgPSBjb21wb25lbnRzLmF0KGkpOwotICAgICAg
ICBpbnQgbGVuID0gY29tcC50ZXh0TGVuZ3RoKCk7Ci0gICAgICAgIGludCBjdXJFbmQgPSBjdXJQ
b3MgKyBsZW47Ci0gICAgICAgIGlmIChjdXJQb3MgPCB0byAmJiBmcm9tIDwgY3VyRW5kICYmICFj
b21wLmlzU3BhY2UoKSkgewotICAgICAgICAgICAgRmxvYXRQb2ludCBwdCA9IHBvaW50OwotICAg
ICAgICAgICAgaWYgKHJ1bi5ydGwoKSkKLSAgICAgICAgICAgICAgICBwdC5zZXRYKHBvaW50Lngo
KSArIHcgLSBjb21wLm1fb2Zmc2V0IC0gY29tcC5tX3dpZHRoKTsKLSAgICAgICAgICAgIGVsc2UK
LSAgICAgICAgICAgICAgICBwdC5zZXRYKHBvaW50LngoKSArIGNvbXAubV9vZmZzZXQpOwotICAg
ICAgICAgICAgZHJhd1NpbXBsZVRleHQoY29udGV4dCwgY29tcC5tX3RleHRSdW4sIHB0LCBmcm9t
IC0gY3VyUG9zLCBzdGQ6Om1pbih0bywgY3VyRW5kKSAtIGN1clBvcyk7Ci0gICAgICAgIH0KLSAg
ICAgICAgY3VyUG9zICs9IGxlbjsKLSAgICAgICAgaWYgKGZyb20gPCBjdXJQb3MpCi0gICAgICAg
ICAgICBmcm9tID0gY3VyUG9zOwotICAgIH0KLX0KLQotZmxvYXQgRm9udDo6ZmxvYXRXaWR0aEZv
ckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250
RGF0YSo+KiBmYWxsYmFja0ZvbnRzLCBHbHlwaE92ZXJmbG93KiBnbHlwaE92ZXJmbG93KSBjb25z
dAotewotICAgIFRleHRSdW5Db21wb25lbnRzIGNvbXBvbmVudHM7Ci0gICAgaW50IHcgPSBnZW5l
cmF0ZUNvbXBvbmVudHMoJmNvbXBvbmVudHMsICp0aGlzLCBydW4pOwotICAgIHJldHVybiB3Owot
fQotCi1pbnQgRm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25Gb3JDb21wbGV4VGV4dChjb25zdCBUZXh0
UnVuJiBydW4sIGludCBwb3NpdGlvbiwgYm9vbCBpbmNsdWRlUGFydGlhbEdseXBocykgY29uc3QK
LXsKLSAgICBUZXh0UnVuQ29tcG9uZW50cyBjb21wb25lbnRzOwotICAgIGludCB3ID0gZ2VuZXJh
dGVDb21wb25lbnRzKCZjb21wb25lbnRzLCAqdGhpcywgcnVuKTsKLQotICAgIGlmIChwb3NpdGlv
biA+PSB3KQotICAgICAgICByZXR1cm4gcnVuLmxlbmd0aCgpOwotCi0gICAgaW50IG9mZnNldCA9
IDA7Ci0gICAgaWYgKHJ1bi5ydGwoKSkgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IGNvbXBvbmVudHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGNvbnN0IFRleHRSdW5Db21w
b25lbnQmIGNvbXAgPSBjb21wb25lbnRzLmF0KGkpOwotICAgICAgICAgICAgaW50IHhlID0gdyAt
IGNvbXAubV9vZmZzZXQ7Ci0gICAgICAgICAgICBpbnQgeHMgPSB4ZSAtIGNvbXAubV93aWR0aDsK
LSAgICAgICAgICAgIGlmIChwb3NpdGlvbiA+PSB4cykKLSAgICAgICAgICAgICAgICByZXR1cm4g
b2Zmc2V0ICsgKGNvbXAuaXNTcGFjZSgpCi0gICAgICAgICAgICAgICAgICAgID8gc3RhdGljX2Nh
c3Q8aW50PigocG9zaXRpb24gLSB4ZSkgKiBjb21wLm1fc3BhY2VzIC8gc3RkOjptYXgoMS5mLCBj
b21wLm1fd2lkdGgpICsgMC41KQotICAgICAgICAgICAgICAgICAgICA6IG9mZnNldEZvclBvc2l0
aW9uRm9yU2ltcGxlVGV4dChjb21wLm1fdGV4dFJ1biwgcG9zaXRpb24gLSB4cywgaW5jbHVkZVBh
cnRpYWxHbHlwaHMpKTsKLQotICAgICAgICAgICAgb2Zmc2V0ICs9IGNvbXAudGV4dExlbmd0aCgp
OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBjb21wb25lbnRzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBjb25zdCBUZXh0UnVuQ29t
cG9uZW50JiBjb21wID0gY29tcG9uZW50cy5hdChpKTsKLSAgICAgICAgICAgIGludCB4cyA9IGNv
bXAubV9vZmZzZXQ7Ci0gICAgICAgICAgICBpbnQgeGUgPSB4cyArIGNvbXAubV93aWR0aDsKLSAg
ICAgICAgICAgIGlmIChwb3NpdGlvbiA8PSB4ZSkgewotICAgICAgICAgICAgICAgIGlmIChwb3Np
dGlvbiAtIHhzID49IHhlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0ICsgY29t
cC50ZXh0TGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldCArIChjb21wLmlz
U3BhY2UoKQotICAgICAgICAgICAgICAgICAgICA/IHN0YXRpY19jYXN0PGludD4oKHBvc2l0aW9u
IC0geHMpICogY29tcC5tX3NwYWNlcyAvIHN0ZDo6bWF4KDEuZiwgY29tcC5tX3dpZHRoKSArIDAu
NSkKLSAgICAgICAgICAgICAgICAgICAgOiBvZmZzZXRGb3JQb3NpdGlvbkZvclNpbXBsZVRleHQo
Y29tcC5tX3RleHRSdW4sIHBvc2l0aW9uIC0geHMsIGluY2x1ZGVQYXJ0aWFsR2x5cGhzKSk7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgICBvZmZzZXQgKz0gY29tcC50ZXh0TGVuZ3RoKCk7Ci0g
ICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJ1bi5sZW5ndGgoKTsKLX0KLQotCi1zdGF0aWMg
ZmxvYXQgY3Vyc29yVG9YKGNvbnN0IEZvbnQqIGZvbnQsIGNvbnN0IFRleHRSdW5Db21wb25lbnRz
JiBjb21wb25lbnRzLCBpbnQgd2lkdGgsIGJvb2wgcnRsLCBpbnQgY3Vyc29yKQotewotICAgIGlu
dCBzdGFydCA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb21wb25lbnRzLnNpemUo
KTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IFRleHRSdW5Db21wb25lbnQmIGNvbXAgPSBjb21wb25l
bnRzLmF0KGkpOwotICAgICAgICBpZiAoc3RhcnQgKyBjb21wLnRleHRMZW5ndGgoKSA8PSBjdXJz
b3IpIHsKLSAgICAgICAgICAgIHN0YXJ0ICs9IGNvbXAudGV4dExlbmd0aCgpOwotICAgICAgICAg
ICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHhzID0gY29tcC5tX29mZnNldDsK
LSAgICAgICAgaWYgKHJ0bCkKLSAgICAgICAgICAgIHhzID0gd2lkdGggLSB4cyAtIGNvbXAubV93
aWR0aDsKLQotICAgICAgICBpbnQgcG9zID0gY3Vyc29yIC0gc3RhcnQ7Ci0gICAgICAgIGlmIChj
b21wLmlzU3BhY2UoKSkgewotICAgICAgICAgICAgaWYgKHJ0bCkKLSAgICAgICAgICAgICAgICBw
b3MgPSBjb21wLnRleHRMZW5ndGgoKSAtIHBvczsKLSAgICAgICAgICAgIHJldHVybiB4cyArIHBv
cyAqIGNvbXAubV93aWR0aCAvIGNvbXAubV9zcGFjZXM7Ci0gICAgICAgIH0KLSAgICAgICAgV2lk
dGhJdGVyYXRvciBpdChmb250LCBjb21wLm1fdGV4dFJ1bik7Ci0gICAgICAgIGl0LmFkdmFuY2Uo
cG9zKTsKLSAgICAgICAgcmV0dXJuIHhzICsgaXQubV9ydW5XaWR0aFNvRmFyOwotICAgIH0KLSAg
ICByZXR1cm4gd2lkdGg7Ci19Ci0KLUZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9yQ29t
cGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBJbnRQb2ludCYgcHQsCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCBmcm9tLCBpbnQgdG8pIGNv
bnN0Ci17Ci0gICAgVGV4dFJ1bkNvbXBvbmVudHMgY29tcG9uZW50czsKLSAgICBpbnQgdyA9IGdl
bmVyYXRlQ29tcG9uZW50cygmY29tcG9uZW50cywgKnRoaXMsIHJ1bik7Ci0KLSAgICBpZiAoIWZy
b20gJiYgdG8gPT0gcnVuLmxlbmd0aCgpKQotICAgICAgICByZXR1cm4gRmxvYXRSZWN0KHB0Lngo
KSwgcHQueSgpLCB3LCBoKTsKLQotICAgIGZsb2F0IHgxID0gY3Vyc29yVG9YKHRoaXMsIGNvbXBv
bmVudHMsIHcsIHJ1bi5ydGwoKSwgZnJvbSk7Ci0gICAgZmxvYXQgeDIgPSBjdXJzb3JUb1godGhp
cywgY29tcG9uZW50cywgdywgcnVuLnJ0bCgpLCB0byk7Ci0gICAgaWYgKHgyIDwgeDEpCi0gICAg
ICAgIHN0ZDo6c3dhcCh4MSwgeDIpOwotCi0gICAgcmV0dXJuIEZsb2F0UmVjdChwdC54KCkgKyB4
MSwgcHQueSgpLCB4MiAtIHgxLCBoKTsKLX0KLQotYm9vbCBGb250OjpjYW5SZXR1cm5GYWxsYmFj
a0ZvbnRzRm9yQ29tcGxleFRleHQoKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotfQpJbmRl
eDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HbHlwaFBhZ2VUcmVlTm9kZVdpbkNF
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0dseXBo
UGFnZVRyZWVOb2RlV2luQ0UuY3BwCShyZXZpc2lvbiA1NzI4OSkJKGZyb20gV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9HbHlwaFBhZ2VUcmVlTm9kZVdpbmNlLmNwcDo1NzI4OSkKKysr
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvR2x5cGhQYWdlVHJlZU5vZGVXaW5DRS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMp
IDIwMDctMjAwOSBUb3JjaCBNb2JpbGUgSW5jLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJl
ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBM
aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo
ZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55
IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJS
QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRB
QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUK
KyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAq
CisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUg
dGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwK
KyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIkdseXBoUGFnZVRyZWVOb2RlLmgiCisKKyNpbmNsdWRlICJGb250
LmgiCisjaW5jbHVkZSAiRm9udENhY2hlLmgiCisjaW5jbHVkZSAiRm9udERhdGEuaCIKKyNpbmNs
dWRlICJTaW1wbGVGb250RGF0YS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0RXT1JEIGdl
dEtub3duRm9udENvZGVQYWdlcyhjb25zdCB3Y2hhcl90KiBmYW1pbHkpOworCit0eXBlZGVmIHVu
c2lnbmVkICgqZnVuY0dldENoYXJDb2RlUGFnZXMpKHVuc2lnbmVkIHNob3J0IGMsIHVuc2lnbmVk
JiBsYXN0UG9zKTsKK2Z1bmNHZXRDaGFyQ29kZVBhZ2VzIGdldENoYXJDb2RlUGFnZXMgPSAwOwor
Citib29sIEdseXBoUGFnZTo6ZmlsbCh1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGxlbmd0aCwg
VUNoYXIqIGJ1ZmZlciwgdW5zaWduZWQgYnVmZmVyTGVuZ3RoLCBjb25zdCBTaW1wbGVGb250RGF0
YSogZm9udERhdGEpCit7CisgICAgaWYgKGxlbmd0aCAhPSBidWZmZXJMZW5ndGgpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIGlmIChmb250RGF0YS0+cGxhdGZvcm1EYXRhKCkuaGZvbnQo
KSkgeworICAgICAgICBEV09SRCBmb250Q29kZVBhZ2VzID0gZm9udERhdGEtPnBsYXRmb3JtRGF0
YSgpLmNvZGVQYWdlcygpOworICAgICAgICBpZiAoZm9udENvZGVQYWdlcykgeworICAgICAgICAg
ICAgaWYgKGdldENoYXJDb2RlUGFnZXMpIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsYXN0
UG9zID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgYnVmZmVy
TGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgRFdPUkQgYWN0dWFsQ29kZVBhZ2Vz
ID0gZ2V0Q2hhckNvZGVQYWdlcyhidWZmZXJbaV0sIGxhc3RQb3MpOworICAgICAgICAgICAgICAg
ICAgICBpZiAoIWFjdHVhbENvZGVQYWdlcyB8fCAoYWN0dWFsQ29kZVBhZ2VzICYgZm9udENvZGVQ
YWdlcykpCisgICAgICAgICAgICAgICAgICAgICAgICBzZXRHbHlwaERhdGFGb3JJbmRleChvZmZz
ZXQgKyBpLCBidWZmZXJbaV0sIGZvbnREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQor
ICAgICAgICAgICAgICAgICAgICAgICAgc2V0R2x5cGhEYXRhRm9ySW5kZXgob2Zmc2V0ICsgaSwg
YnVmZmVyW2ldLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJu
IHRydWU7CisjaWYgZGVmaW5lZChJTUxBTkdfRk9OVF9MSU5LKSAmJiAoSU1MQU5HX0ZPTlRfTElO
SyA9PSAyKQorICAgICAgICAgICAgfSBlbHNlIGlmIChJTUxhbmdGb250TGluazIqIGxhbmdGb250
TGluayA9IGZvbnRDYWNoZSgpLT5nZXRGb250TGlua0ludGVyZmFjZSgpKSB7CisjZWxzZQorICAg
ICAgICAgICAgfSBlbHNlIGlmIChJTUxhbmdGb250TGluayogbGFuZ0ZvbnRMaW5rID0gZm9udENh
Y2hlKCktPmdldEZvbnRMaW5rSW50ZXJmYWNlKCkpIHsKKyNlbmRpZgorICAgICAgICAgICAgICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBidWZmZXJMZW5ndGg7ICsraSkgeworICAgICAgICAg
ICAgICAgICAgICBEV09SRCBhY3R1YWxDb2RlUGFnZXM7CisgICAgICAgICAgICAgICAgICAgIGxh
bmdGb250TGluay0+R2V0Q2hhckNvZGVQYWdlcyhidWZmZXJbaV0sICZhY3R1YWxDb2RlUGFnZXMp
OworICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdHVhbENvZGVQYWdlcyB8fCAoYWN0dWFsQ29k
ZVBhZ2VzICYgZm9udENvZGVQYWdlcykpCisgICAgICAgICAgICAgICAgICAgICAgICBzZXRHbHlw
aERhdGFGb3JJbmRleChvZmZzZXQgKyBpLCBidWZmZXJbaV0sIGZvbnREYXRhKTsKKyAgICAgICAg
ICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0R2x5cGhEYXRhRm9y
SW5kZXgob2Zmc2V0ICsgaSwgYnVmZmVyW2ldLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9
CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpCisgICAgICAgIHNl
dEdseXBoRGF0YUZvckluZGV4KG9mZnNldCArIGksIGJ1ZmZlcltpXSwgZm9udERhdGEpOworCisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK30KKwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW5jZS9HbHlwaFBhZ2VUcmVlTm9kZVdpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0dseXBoUGFnZVRyZWVOb2RlV2luQ0UuY3BwCShyZXZp
c2lvbiA1NzI4OSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvR2x5cGhQYWdl
VHJlZU5vZGVXaW5DRS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTc1LDUgKzc1LDQgQEAgYm9vbCBH
bHlwaFBhZ2U6OmZpbGwodW5zaWduZWQgb2Zmc2V0LCB1bgogICAgIHJldHVybiB0cnVlOwogfQog
Ci19Ci0KK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luY2UvR2x5cGhQYWdlVHJlZU5vZGVXaW5jZS5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HbHlwaFBhZ2VUcmVlTm9kZVdpbmNlLmNwcAko
cmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0dseXBo
UGFnZVRyZWVOb2RlV2luY2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDc5ICswLDAgQEAKLS8q
Ci0gKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlIEluYy4KLSAqCi0gKiAg
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcgotICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljCi0gKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUaGlzIGxpYnJhcnkg
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBi
dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50
eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCi0gKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0
bwotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0
cmVldCwgRmlmdGggRmxvb3IsCi0gKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0gKgot
ICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJHbHlwaFBhZ2VUcmVlTm9kZS5o
IgotCi0jaW5jbHVkZSAiRm9udC5oIgotI2luY2x1ZGUgIkZvbnRDYWNoZS5oIgotI2luY2x1ZGUg
IkZvbnREYXRhLmgiCi0jaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIKLQotbmFtZXNwYWNlIFdl
YkNvcmUgewotCi1EV09SRCBnZXRLbm93bkZvbnRDb2RlUGFnZXMoY29uc3Qgd2NoYXJfdCogZmFt
aWx5KTsKLQotdHlwZWRlZiB1bnNpZ25lZCAoKmZ1bmNHZXRDaGFyQ29kZVBhZ2VzKSh1bnNpZ25l
ZCBzaG9ydCBjLCB1bnNpZ25lZCYgbGFzdFBvcyk7Ci1mdW5jR2V0Q2hhckNvZGVQYWdlcyBnZXRD
aGFyQ29kZVBhZ2VzID0gMDsKLQotYm9vbCBHbHlwaFBhZ2U6OmZpbGwodW5zaWduZWQgb2Zmc2V0
LCB1bnNpZ25lZCBsZW5ndGgsIFVDaGFyKiBidWZmZXIsIHVuc2lnbmVkIGJ1ZmZlckxlbmd0aCwg
Y29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnREYXRhKQotewotICAgIGlmIChsZW5ndGggIT0gYnVm
ZmVyTGVuZ3RoKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoZm9udERhdGEtPnBs
YXRmb3JtRGF0YSgpLmhmb250KCkpIHsKLSAgICAgICAgRFdPUkQgZm9udENvZGVQYWdlcyA9IGZv
bnREYXRhLT5wbGF0Zm9ybURhdGEoKS5jb2RlUGFnZXMoKTsKLSAgICAgICAgaWYgKGZvbnRDb2Rl
UGFnZXMpIHsKLSAgICAgICAgICAgIGlmIChnZXRDaGFyQ29kZVBhZ2VzKSB7Ci0gICAgICAgICAg
ICAgICAgdW5zaWduZWQgbGFzdFBvcyA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IGJ1ZmZlckxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERX
T1JEIGFjdHVhbENvZGVQYWdlcyA9IGdldENoYXJDb2RlUGFnZXMoYnVmZmVyW2ldLCBsYXN0UG9z
KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFhY3R1YWxDb2RlUGFnZXMgfHwgKGFjdHVhbENv
ZGVQYWdlcyAmIGZvbnRDb2RlUGFnZXMpKQotICAgICAgICAgICAgICAgICAgICAgICAgc2V0R2x5
cGhEYXRhRm9ySW5kZXgob2Zmc2V0ICsgaSwgYnVmZmVyW2ldLCBmb250RGF0YSk7Ci0gICAgICAg
ICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEdseXBoRGF0YUZv
ckluZGV4KG9mZnNldCArIGksIGJ1ZmZlcltpXSwgMCk7Ci0gICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIHJldHVybiB0cnVlOwotI2lmIGRlZmluZWQoSU1MQU5HX0ZPTlRfTElOSykg
JiYgKElNTEFOR19GT05UX0xJTksgPT0gMikKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoSU1MYW5n
Rm9udExpbmsyKiBsYW5nRm9udExpbmsgPSBmb250Q2FjaGUoKS0+Z2V0Rm9udExpbmtJbnRlcmZh
Y2UoKSkgewotI2Vsc2UKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoSU1MYW5nRm9udExpbmsqIGxh
bmdGb250TGluayA9IGZvbnRDYWNoZSgpLT5nZXRGb250TGlua0ludGVyZmFjZSgpKSB7Ci0jZW5k
aWYKLSAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgYnVmZmVyTGVuZ3Ro
OyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgRFdPUkQgYWN0dWFsQ29kZVBhZ2VzOwotICAg
ICAgICAgICAgICAgICAgICBsYW5nRm9udExpbmstPkdldENoYXJDb2RlUGFnZXMoYnVmZmVyW2ld
LCAmYWN0dWFsQ29kZVBhZ2VzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFhY3R1YWxDb2Rl
UGFnZXMgfHwgKGFjdHVhbENvZGVQYWdlcyAmIGZvbnRDb2RlUGFnZXMpKQotICAgICAgICAgICAg
ICAgICAgICAgICAgc2V0R2x5cGhEYXRhRm9ySW5kZXgob2Zmc2V0ICsgaSwgYnVmZmVyW2ldLCBm
b250RGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAg
ICAgIHNldEdseXBoRGF0YUZvckluZGV4KG9mZnNldCArIGksIGJ1ZmZlcltpXSwgMCk7Ci0gICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAg
fQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbmd0
aDsgKytpKQotICAgICAgICBzZXRHbHlwaERhdGFGb3JJbmRleChvZmZzZXQgKyBpLCBidWZmZXJb
aV0sIGZvbnREYXRhKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi19Ci0KSW5kZXg6IFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvR3JhZGllbnRXaW5DRS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HcmFkaWVudFdpbkNFLmNwcAkocmV2
aXNpb24gNTcyODkpCShmcm9tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvR3JhZGll
bnRXaW5jZS5jcHA6NTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0dy
YWRpZW50V2luQ0UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp
YnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGlj
ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhp
cyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm
dWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp
ZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAg
YWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5v
dCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBG
cmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwg
VVNBLgorICovCisKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkdyYWRpZW50Lmgi
CisKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgewor
Cit2b2lkIEdyYWRpZW50OjpwbGF0Zm9ybURlc3Ryb3koKQoreworfQorCitzdGF0aWMgaW5saW5l
IGJvb2wgY29tcGFyZVN0b3BzKGNvbnN0IEdyYWRpZW50OjpDb2xvclN0b3AmIGEsIGNvbnN0IEdy
YWRpZW50OjpDb2xvclN0b3AmIGIpCit7CisgICAgcmV0dXJuIGEuc3RvcCA8IGIuc3RvcDsKK30K
KworY29uc3QgVmVjdG9yPEdyYWRpZW50OjpDb2xvclN0b3A+JiBHcmFkaWVudDo6Z2V0U3RvcHMo
KSBjb25zdAoreworICAgIGlmICghbV9zdG9wc1NvcnRlZCkgeworICAgICAgICBpZiAobV9zdG9w
cy5zaXplKCkpCisgICAgICAgICAgICBzdGQ6OnN0YWJsZV9zb3J0KG1fc3RvcHMuYmVnaW4oKSwg
bV9zdG9wcy5lbmQoKSwgY29tcGFyZVN0b3BzKTsKKyAgICAgICAgbV9zdG9wc1NvcnRlZCA9IHRy
dWU7CisgICAgfQorICAgIHJldHVybiBtX3N0b3BzOworfQorCit2b2lkIEdyYWRpZW50OjpmaWxs
KEdyYXBoaWNzQ29udGV4dCogYywgY29uc3QgRmxvYXRSZWN0JiByKQoreworICAgIGMtPmZpbGxS
ZWN0KHIsIHRoaXMpOworfQorCit9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL0dyYWRpZW50V2luQ0UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luY2UvR3JhZGllbnRXaW5DRS5jcHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HcmFkaWVudFdpbkNFLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNDksNCArNDksNCBAQCB2b2lkIEdyYWRpZW50OjpmaWxsKEdyYXBoaWNzQ29udGV4dCog
YywKICAgICBjLT5maWxsUmVjdChyLCB0aGlzKTsKIH0KIAotfQorfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HcmFkaWVudFdpbmNl
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0dyYWRp
ZW50V2luY2UuY3BwCShyZXZpc2lvbiA1NzI4OSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luY2UvR3JhZGllbnRXaW5jZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNTIgKzAsMCBA
QAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KLSAqCi0gKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gKiAgTGljZW5zZSBhcyBwdWJsaXNo
ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiAgdmVyc2lvbiAy
IG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgot
ICoKLSAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3
aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl
biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiAgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQg
aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcu
TElCLiAgSWYgbm90LCB3cml0ZSB0bwotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24s
IEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0gKiAgQm9zdG9uLCBNQSAw
MjExMC0xMzAxLCBVU0EuCi0gKi8KLQotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAi
R3JhZGllbnQuaCIKLQotI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgotCi1uYW1lc3BhY2Ug
V2ViQ29yZSB7Ci0KLXZvaWQgR3JhZGllbnQ6OnBsYXRmb3JtRGVzdHJveSgpCi17Ci19Ci0KLXN0
YXRpYyBpbmxpbmUgYm9vbCBjb21wYXJlU3RvcHMoY29uc3QgR3JhZGllbnQ6OkNvbG9yU3RvcCYg
YSwgY29uc3QgR3JhZGllbnQ6OkNvbG9yU3RvcCYgYikKLXsKLSAgICByZXR1cm4gYS5zdG9wIDwg
Yi5zdG9wOwotfQotCi1jb25zdCBWZWN0b3I8R3JhZGllbnQ6OkNvbG9yU3RvcD4mIEdyYWRpZW50
OjpnZXRTdG9wcygpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3N0b3BzU29ydGVkKSB7Ci0gICAgICAg
IGlmIChtX3N0b3BzLnNpemUoKSkKLSAgICAgICAgICAgIHN0ZDo6c3RhYmxlX3NvcnQobV9zdG9w
cy5iZWdpbigpLCBtX3N0b3BzLmVuZCgpLCBjb21wYXJlU3RvcHMpOwotICAgICAgICBtX3N0b3Bz
U29ydGVkID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIG1fc3RvcHM7Ci19Ci0KLXZvaWQgR3Jh
ZGllbnQ6OmZpbGwoR3JhcGhpY3NDb250ZXh0KiBjLCBjb25zdCBGbG9hdFJlY3QmIHIpCi17Ci0g
ICAgYy0+ZmlsbFJlY3QociwgdGhpcyk7Ci19Ci0KLX0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luY2UvR3JhcGhpY3NDb250ZXh0V2luQ0UuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvR3JhcGhpY3NDb250ZXh0V2luQ0UuY3BwCShy
ZXZpc2lvbiA1NzI4OSkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HcmFw
aGljc0NvbnRleHRXaW5jZS5jcHA6NTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbmNlL0dyYXBoaWNzQ29udGV4dFdpbkNFLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDE5NDAgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlIElu
Yy4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBM
aWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBU
aGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz
ZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w
bGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNl
aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAq
ICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYg
bm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUx
IEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAx
LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJHcmFwaGlj
c0NvbnRleHQuaCIKKworI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgorI2luY2x1ZGUgIkNo
YXJhY3Rlck5hbWVzLmgiCisjaW5jbHVkZSAiRm9udC5oIgorI2luY2x1ZGUgIkdseXBoQnVmZmVy
LmgiCisjaW5jbHVkZSAiR3JhZGllbnQuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHRQcml2
YXRlLmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQYXRoLmgiCisj
aW5jbHVkZSAiUGxhdGZvcm1QYXRoV2luY2UuaCIKKyNpbmNsdWRlICJTaGFyZWRCaXRtYXAuaCIK
KyNpbmNsdWRlICJTaW1wbGVGb250RGF0YS5oIgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKwor
I2luY2x1ZGUgPHdpbmRvd3MuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit0eXBlZGVmIHZv
aWQgKCpGdW5jR3JhZGllbnRGaWxsUmVjdExpbmVhcikoSERDIGhkYywgY29uc3QgSW50UmVjdCYg
ciwgY29uc3QgSW50UG9pbnQmIHAwLCBjb25zdCBJbnRQb2ludCYgcDEsIGNvbnN0IFZlY3RvcjxH
cmFkaWVudDo6Q29sb3JTdG9wPiYgc3RvcHMpOwordHlwZWRlZiB2b2lkICgqRnVuY0dyYWRpZW50
RmlsbFJlY3RSYWRpYWwpKEhEQyBoZGMsIGNvbnN0IEludFJlY3QmIHIsIGNvbnN0IEludFBvaW50
JiBwMCwgY29uc3QgSW50UG9pbnQmIHAxLCBmbG9hdCByMCwgZmxvYXQgcjEsIGNvbnN0IFZlY3Rv
cjxHcmFkaWVudDo6Q29sb3JTdG9wPiYgc3RvcHMpOworRnVuY0dyYWRpZW50RmlsbFJlY3RMaW5l
YXIgZ19saW5lYXJHcmFkaWVudEZpbGxlciA9IDA7CitGdW5jR3JhZGllbnRGaWxsUmVjdFJhZGlh
bCBnX3JhZGlhbEdyYWRpZW50RmlsbGVyID0gMDsKKworc3RhdGljIGlubGluZSBib29sIGlzWmVy
byhkb3VibGUgZCkKK3sKKyAgICByZXR1cm4gZCA+IDAgPyBkIDw9IDEuRS0xMCA6IGQgPj0gLTEu
RS0xMDsKK30KKworLy8gc3RhYmxlUm91bmQgcm91bmRzIC0wLjUgdG8gMCwgd2hlcmUgbHJvdW5k
IHJvdW5kcyAtMC41IHRvIC0xLgorc3RhdGljIGlubGluZSBpbnQgc3RhYmxlUm91bmQoZG91Ymxl
IGQpCit7CisgICAgaWYgKGQgPiAwKQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pihk
ICsgMC41KTsKKworICAgIGludCBpID0gc3RhdGljX2Nhc3Q8aW50PihkKTsKKyAgICByZXR1cm4g
aSAtIGQgPiAwLjUgPyBpIC0gMSA6IGk7Cit9CisKKy8vIFVubGlrZSBlbmNsb3NpbmdJbnRSZWN0
KCksIHRoaXMgZnVuY3Rpb24gZG9lcyBzdHJpY3Qgcm91bmRpbmcuCitzdGF0aWMgaW5saW5lIElu
dFJlY3Qgcm91bmRSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcikKK3sKKyAgICByZXR1cm4gSW50UmVj
dChzdGFibGVSb3VuZChyLngoKSksIHN0YWJsZVJvdW5kKHIueSgpKSwgc3RhYmxlUm91bmQoci5y
aWdodCgpKSAtIHN0YWJsZVJvdW5kKHIueCgpKSwgc3RhYmxlUm91bmQoci5ib3R0b20oKSkgLSBz
dGFibGVSb3VuZChyLnkoKSkpOworfQorCisvLyBSb3RhdGlvbiB0cmFuc2Zvcm1hdGlvbgorY2xh
c3MgUm90YXRpb25UcmFuc2Zvcm0geworcHVibGljOgorICAgIFJvdGF0aW9uVHJhbnNmb3JtKCkK
KyAgICAgICAgOiBtX2Nvc0EoMS4pCisgICAgICAgICwgbV9zaW5BKDAuKQorICAgICAgICAsIG1f
cHJlU2hpZnRYKDApCisgICAgICAgICwgbV9wcmVTaGlmdFkoMCkKKyAgICAgICAgLCBtX3Bvc3RT
aGlmdFgoMCkKKyAgICAgICAgLCBtX3Bvc3RTaGlmdFkoMCkKKyAgICB7CisgICAgfQorICAgIFJv
dGF0aW9uVHJhbnNmb3JtIG9wZXJhdG9yLSgpIGNvbnN0CisgICAgeworICAgICAgICBSb3RhdGlv
blRyYW5zZm9ybSBydG47CisgICAgICAgIHJ0bi5tX2Nvc0EgPSBtX2Nvc0E7CisgICAgICAgIHJ0
bi5tX3NpbkEgPSAtbV9zaW5BOworICAgICAgICBydG4ubV9wcmVTaGlmdFggPSBtX3Bvc3RTaGlm
dFg7CisgICAgICAgIHJ0bi5tX3ByZVNoaWZ0WSA9IG1fcG9zdFNoaWZ0WTsKKyAgICAgICAgcnRu
Lm1fcG9zdFNoaWZ0WCA9IG1fcHJlU2hpZnRYOworICAgICAgICBydG4ubV9wb3N0U2hpZnRZID0g
bV9wcmVTaGlmdFk7CisgICAgICAgIHJldHVybiBydG47CisgICAgfQorICAgIHZvaWQgbWFwKGRv
dWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUqIHgyLCBkb3VibGUqIHkyKSBjb25zdAorICAgIHsK
KyAgICAgICAgeDEgKz0gbV9wcmVTaGlmdFg7CisgICAgICAgIHkxICs9IG1fcHJlU2hpZnRZOwor
ICAgICAgICAqeDIgPSB4MSAqIG1fY29zQSArIHkxICogbV9zaW5BICsgbV9wb3N0U2hpZnRYOwor
ICAgICAgICAqeTIgPSB5MSAqIG1fY29zQSAtIHgxICogbV9zaW5BICsgbV9wb3N0U2hpZnRZOwor
ICAgIH0KKyAgICB2b2lkIG1hcChpbnQgeDEsIGludCB5MSwgaW50KiB4MiwgaW50KiB5MikgY29u
c3QKKyAgICB7CisgICAgICAgIHgxICs9IG1fcHJlU2hpZnRYOworICAgICAgICB5MSArPSBtX3By
ZVNoaWZ0WTsKKyAgICAgICAgKngyID0gc3RhYmxlUm91bmQoeDEgKiBtX2Nvc0EgKyB5MSAqIG1f
c2luQSkgKyBtX3Bvc3RTaGlmdFg7CisgICAgICAgICp5MiA9IHN0YWJsZVJvdW5kKHkxICogbV9j
b3NBIC0geDEgKiBtX3NpbkEpICsgbV9wb3N0U2hpZnRZOworICAgIH0KKworICAgIGRvdWJsZSBt
X2Nvc0E7CisgICAgZG91YmxlIG1fc2luQTsKKyAgICBpbnQgbV9wcmVTaGlmdFg7CisgICAgaW50
IG1fcHJlU2hpZnRZOworICAgIGludCBtX3Bvc3RTaGlmdFg7CisgICAgaW50IG1fcG9zdFNoaWZ0
WTsKK307CisKK3RlbXBsYXRlPGNsYXNzIFQ+IHN0YXRpYyBpbmxpbmUgSW50UG9pbnQgbWFwUG9p
bnQoY29uc3QgSW50UG9pbnQmIHAsIGNvbnN0IFQmIHQpCit7CisgICAgaW50IHgsIHk7CisgICAg
dC5tYXAocC54KCksIHAueSgpLCAmeCwgJnkpOworICAgIHJldHVybiBJbnRQb2ludCh4LCB5KTsK
K30KKwordGVtcGxhdGU8Y2xhc3MgVD4gc3RhdGljIGlubGluZSBGbG9hdFBvaW50IG1hcFBvaW50
KGNvbnN0IEZsb2F0UG9pbnQmIHAsIGNvbnN0IFQmIHQpCit7CisgICAgZG91YmxlIHgsIHk7Cisg
ICAgdC5tYXAocC54KCksIHAueSgpLCAmeCwgJnkpOworICAgIHJldHVybiBGbG9hdFBvaW50KHN0
YXRpY19jYXN0PGZsb2F0Pih4KSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHkpKTsKK30KKwordGVtcGxh
dGU8Y2xhc3MgVHJhbnNmb3JtLCBjbGFzcyBSZWN0LCBjbGFzcyBWYWx1ZT4gc3RhdGljIGlubGlu
ZSBSZWN0IG1hcFJlY3QoY29uc3QgUmVjdCYgcmVjdCwgY29uc3QgVHJhbnNmb3JtJiB0cmFuc2Zv
cm0pCit7CisgICAgVmFsdWUgeFs0XSwgeVs0XTsKKyAgICBWYWx1ZSBsLCB0LCByLCBiOworICAg
IHIgPSByZWN0LnJpZ2h0KCkgLSAxOworICAgIGIgPSByZWN0LmJvdHRvbSgpIC0gMTsKKyAgICB0
cmFuc2Zvcm0ubWFwKHJlY3QueCgpLCByZWN0LnkoKSwgeCwgeSk7CisgICAgdHJhbnNmb3JtLm1h
cChyZWN0LngoKSwgYiwgeCArIDEsIHkgKyAxKTsKKyAgICB0cmFuc2Zvcm0ubWFwKHIsIGIsIHgg
KyAyLCB5ICsgMik7CisgICAgdHJhbnNmb3JtLm1hcChyLCByZWN0LnkoKSwgeCArIDMsIHkgKyAz
KTsKKyAgICBsID0gciA9IHhbM107CisgICAgdCA9IGIgPSB5WzNdOworICAgIGZvciAoaW50IGkg
PSAwOyBpIDwgMzsgKytpKSB7CisgICAgICAgIGlmICh4W2ldIDwgbCkKKyAgICAgICAgICAgIGwg
PSB4W2ldOworICAgICAgICBlbHNlIGlmICh4W2ldID4gcikKKyAgICAgICAgICAgIHIgPSB4W2ld
OworCisgICAgICAgIGlmICh5W2ldIDwgdCkKKyAgICAgICAgICAgIHQgPSB5W2ldOworICAgICAg
ICBlbHNlIGlmICh5W2ldID4gYikKKyAgICAgICAgICAgIGIgPSB5W2ldOworICAgIH0KKworICAg
IHJldHVybiBJbnRSZWN0KGwsIHQsIHIgLSBsICsgMSwgYiAtIHQgKyAxKTsKK30KKwordGVtcGxh
dGU8Y2xhc3MgVD4gc3RhdGljIGlubGluZSBJbnRSZWN0IG1hcFJlY3QoY29uc3QgSW50UmVjdCYg
cmVjdCwgY29uc3QgVCYgdHJhbnNmb3JtKQoreworICAgIHJldHVybiBtYXBSZWN0PFQsIEludFJl
Y3QsIGludD4ocmVjdCwgdHJhbnNmb3JtKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4gc3RhdGlj
IGlubGluZSBGbG9hdFJlY3QgbWFwUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0IFQm
IHRyYW5zZm9ybSkKK3sKKyAgICByZXR1cm4gbWFwUmVjdDxULCBGbG9hdFJlY3QsIGRvdWJsZT4o
cmVjdCwgdHJhbnNmb3JtKTsKK30KKworY2xhc3MgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2
YXRlRGF0YSB7CitwdWJsaWM6CisgICAgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlRGF0
YSgpCisgICAgICAgIDogbV90cmFuc2Zvcm0oKQorICAgICAgICAsIG1fb3BhY2l0eSgxLjApCisg
ICAgeworICAgIH0KKworICAgIEFmZmluZVRyYW5zZm9ybSBtX3RyYW5zZm9ybTsKKyAgICBmbG9h
dCBtX29wYWNpdHk7CisgICAgVmVjdG9yPFBhdGg+IG1fcGF0aHM7Cit9OworCitlbnVtIEFscGhh
UGFpbnRUeXBlIHsKKyAgICBBbHBoYVBhaW50Tm9uZSwKKyAgICBBbHBoYVBhaW50SW1hZ2UsCisg
ICAgQWxwaGFQYWludE90aGVyLAorfTsKKworY2xhc3MgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlIDogcHVibGljIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZURhdGEgeworcHVi
bGljOgorICAgIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZShIREMgZGMpCisgICAgICAg
IDogbV9kYyhkYykKKyAgICB7CisgICAgfQorICAgIH5HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVBy
aXZhdGUoKQorICAgIHsKKyAgICAgICAgd2hpbGUgKCFtX2JhY2t1cERhdGEuaXNFbXB0eSgpKQor
ICAgICAgICAgICAgcmVzdG9yZSgpOworICAgIH0KKworICAgIEludFBvaW50IG9yaWdpbigpIGNv
bnN0CisgICAgeworICAgICAgICByZXR1cm4gSW50UG9pbnQoc3RhYmxlUm91bmQoLW1fdHJhbnNm
b3JtLmUoKSksIHN0YWJsZVJvdW5kKC1tX3RyYW5zZm9ybS5mKCkpKTsKKyAgICB9CisKKyAgICB2
b2lkIHRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5KQorICAgIHsKKyAgICAgICAgbV90cmFuc2Zv
cm0udHJhbnNsYXRlKHgsIHkpOworICAgIH0KKworICAgIHZvaWQgc2NhbGUoY29uc3QgRmxvYXRT
aXplJiBzaXplKQorICAgIHsKKyAgICAgICAgbV90cmFuc2Zvcm0uc2NhbGVOb25Vbmlmb3JtKHNp
emUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSk7CisgICAgfQorCisgICAgdm9pZCByb3RhdGUoZmxv
YXQgcmFkaWFucykKKyAgICB7CisgICAgICAgIG1fdHJhbnNmb3JtLnJvdGF0ZShyYWQyZGVnKHJh
ZGlhbnMpKTsKKyAgICB9CisKKyAgICB2b2lkICBjb25jYXRDVE0oY29uc3QgQWZmaW5lVHJhbnNm
b3JtJiB0cmFuc2Zvcm0pCisgICAgeworICAgICAgICBtX3RyYW5zZm9ybSA9IHRyYW5zZm9ybSAq
IG1fdHJhbnNmb3JtOworICAgIH0KKworICAgIEludFJlY3QgbWFwUmVjdChjb25zdCBJbnRSZWN0
JiByZWN0KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fdHJhbnNmb3JtLm1hcFJlY3Qo
cmVjdCk7CisgICAgfQorCisgICAgRmxvYXRSZWN0IG1hcFJlY3QoY29uc3QgRmxvYXRSZWN0JiBy
ZWN0KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fdHJhbnNmb3JtLm1hcFJlY3QocmVj
dCk7CisgICAgfQorCisgICAgSW50UG9pbnQgbWFwUG9pbnQoY29uc3QgSW50UG9pbnQmIHBvaW50
KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fdHJhbnNmb3JtLm1hcFBvaW50KHBvaW50
KTsKKyAgICB9CisKKyAgICBGbG9hdFBvaW50IG1hcFBvaW50KGNvbnN0IEZsb2F0UG9pbnQmIHBv
aW50KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fdHJhbnNmb3JtLm1hcFBvaW50KHBv
aW50KTsKKyAgICB9CisKKyAgICBGbG9hdFNpemUgbWFwU2l6ZShjb25zdCBGbG9hdFNpemUmIHNp
emUpIGNvbnN0CisgICAgeworICAgICAgICBkb3VibGUgdywgaDsKKyAgICAgICAgbV90cmFuc2Zv
cm0ubWFwKHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSwgdywgaCk7CisgICAgICAgIHJldHVy
biBGbG9hdFNpemUoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHcpLCBzdGF0aWNfY2FzdDxmbG9hdD4oaCkp
OworICAgIH0KKworICAgIHZvaWQgc2F2ZSgpCisgICAgeworICAgICAgICBpZiAobV9kYykKKyAg
ICAgICAgICAgIFNhdmVEQyhtX2RjKTsKKworICAgICAgICBtX2JhY2t1cERhdGEuYXBwZW5kKCpz
dGF0aWNfY2FzdDxHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVEYXRhKj4odGhpcykpOwor
ICAgIH0KKworICAgIHZvaWQgcmVzdG9yZSgpCisgICAgeworICAgICAgICBpZiAobV9iYWNrdXBE
YXRhLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAobV9kYykK
KyAgICAgICAgICAgIFJlc3RvcmVEQyhtX2RjLCAtMSk7CisKKyAgICAgICAgR3JhcGhpY3NDb250
ZXh0UGxhdGZvcm1Qcml2YXRlRGF0YTo6b3BlcmF0b3I9KG1fYmFja3VwRGF0YS5sYXN0KCkpOwor
ICAgICAgICBtX2JhY2t1cERhdGEucmVtb3ZlTGFzdCgpOworICAgIH0KKworICAgIGJvb2wgaGFz
QWxwaGEoKSBjb25zdCB7IHJldHVybiBtX2JpdG1hcCAmJiBtX2JpdG1hcC0+aGFzQWxwaGEoKTsg
fQorCisgICAgUGFzc1JlZlB0cjxTaGFyZWRCaXRtYXA+IGdldFRyYW5zcGFyZW50TGF5ZXJCaXRt
YXAoSW50UmVjdCYgb3JpZ1JlY3QsIEFscGhhUGFpbnRUeXBlIGFscGhhUGFpbnQsIFJFQ1QmIGJt
cFJlY3QsIGJvb2wgY2hlY2tDbGlwQm94LCBib29sIGZvcmNlKSBjb25zdAorICAgIHsKKyAgICAg
ICAgaWYgKG1fb3BhY2l0eSA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAg
aWYgKGZvcmNlIHx8IG1fb3BhY2l0eSA8IDEuKSAgeworICAgICAgICAgICAgaWYgKGNoZWNrQ2xp
cEJveCkgeworICAgICAgICAgICAgICAgIFJFQ1QgY2xpcEJveDsKKyAgICAgICAgICAgICAgICBp
bnQgY2xpcFR5cGUgPSBHZXRDbGlwQm94KG1fZGMsICZjbGlwQm94KTsKKyAgICAgICAgICAgICAg
ICBpZiAoY2xpcFR5cGUgPT0gU0lNUExFUkVHSU9OIHx8IGNsaXBUeXBlID09IENPTVBMRVhSRUdJ
T04pCisgICAgICAgICAgICAgICAgICAgIG9yaWdSZWN0LmludGVyc2VjdChjbGlwQm94KTsKKyAg
ICAgICAgICAgICAgICBpZiAob3JpZ1JlY3QuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUmVmUHRyPFNoYXJlZEJp
dG1hcD4gYm1wID0gU2hhcmVkQml0bWFwOjpjcmVhdGVJbnN0YW5jZShhbHBoYVBhaW50ID09IEFs
cGhhUGFpbnROb25lLCBvcmlnUmVjdC53aWR0aCgpLCBvcmlnUmVjdC5oZWlnaHQoKSwgZmFsc2Up
OworICAgICAgICAgICAgU2V0UmVjdCgmYm1wUmVjdCwgMCwgMCwgb3JpZ1JlY3Qud2lkdGgoKSwg
b3JpZ1JlY3QuaGVpZ2h0KCkpOworICAgICAgICAgICAgaWYgKGJtcCkgeworICAgICAgICAgICAg
ICAgIHN3aXRjaCAoYWxwaGFQYWludCkgeworICAgICAgICAgICAgICAgIGNhc2UgQWxwaGFQYWlu
dE5vbmU6CisgICAgICAgICAgICAgICAgY2FzZSBBbHBoYVBhaW50SW1hZ2U6CisgICAgICAgICAg
ICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNoYXJlZEJpdG1hcDo6RENIb2xk
ZXIgZGMoYm1wLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYy5nZXQoKSkg
eworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdEJsdChkYy5nZXQoKSwgMCwgMCwgb3Jp
Z1JlY3Qud2lkdGgoKSwgb3JpZ1JlY3QuaGVpZ2h0KCksIG1fZGMsIG9yaWdSZWN0LngoKSwgb3Jp
Z1JlY3QueSgpLCBTUkNDT1BZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm1w
LT5pczMyYml0KCkgJiYgKCFtX2JpdG1hcCB8fCBtX2JpdG1hcC0+aXMxNmJpdCgpKSkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgYWxwaGEgY2hhbm5lbAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCogcGl4ZWxzID0gKHVuc2lnbmVkKili
bXAtPmJ5dGVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2ln
bmVkKiBjb25zdCBwaXhlbHNFbmQgPSBwaXhlbHMgKyBibXAtPmJpdG1hcEluZm8oKS5udW1QaXhl
bHMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBpeGVscyA8IHBp
eGVsc0VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBpeGVscyB8
PSAweEZGMDAwMDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytwaXhl
bHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJtcDsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvL2Nhc2UgQWxwaGFQYWludE90aGVy
OgorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChi
bXAtPmJ5dGVzKCksIDB4RkYsIGJtcC0+Yml0bWFwSW5mbygpLm51bVBpeGVscygpICogNCk7Cisg
ICAgICAgICAgICAgICAgICAgIHJldHVybiBibXA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAg
IGJtcFJlY3QgPSBvcmlnUmVjdDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdm9p
ZCBwYWludEJhY2tUcmFuc3BhcmVudExheWVyQml0bWFwKEhEQyBoZGMsIFNoYXJlZEJpdG1hcCog
Ym1wLCBjb25zdCBJbnRSZWN0JiBvcmlnUmVjdCwgQWxwaGFQYWludFR5cGUgYWxwaGFQYWludCwg
Y29uc3QgUkVDVCYgYm1wUmVjdCkKKyAgICB7CisgICAgICAgIGlmIChoZGMgPT0gbV9kYykKKyAg
ICAgICAgICAgIHJldHVybjsKKworI2lmICFkZWZpbmVkKE5PX0FMUEhBQkxFTkQpCisgICAgICAg
IGlmIChhbHBoYVBhaW50ID09IEFscGhhUGFpbnRPdGhlcikgeworICAgICAgICAgICAgQVNTRVJU
KGJtcCAmJiBibXAtPmJ5dGVzKCkgJiYgYm1wLT5pczMyYml0KCkpOworICAgICAgICAgICAgdW5z
aWduZWQqIHBpeGVscyA9ICh1bnNpZ25lZCopYm1wLT5ieXRlcygpOworICAgICAgICAgICAgY29u
c3QgdW5zaWduZWQqIGNvbnN0IHBpeGVsc0VuZCA9IHBpeGVscyArIGJtcC0+Yml0bWFwSW5mbygp
Lm51bVBpeGVscygpOworICAgICAgICAgICAgd2hpbGUgKHBpeGVscyA8IHBpeGVsc0VuZCkgewor
ICAgICAgICAgICAgICAgICpwaXhlbHMgXj0gMHhGRjAwMDAwMDsKKyAgICAgICAgICAgICAgICAr
K3BpeGVsczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobV9vcGFjaXR5
IDwgMS4gfHwgYWxwaGFQYWludCA9PSBBbHBoYVBhaW50T3RoZXIpIHsKKyAgICAgICAgICAgIGNv
bnN0IEJMRU5ERlVOQ1RJT04gYmxlbmQgPSB7IEFDX1NSQ19PVkVSLCAwCisgICAgICAgICAgICAg
ICAgLCBtX29wYWNpdHkgPj0gMS4gPyAyNTUgOiAoQllURSkobV9vcGFjaXR5ICogMjU1KQorICAg
ICAgICAgICAgICAgICwgYWxwaGFQYWludCA9PSBBbHBoYVBhaW50Tm9uZSA/IDAgOiBBQ19TUkNf
QUxQSEEgfTsKKyAgICAgICAgICAgIEFscGhhQmxlbmQobV9kYywgb3JpZ1JlY3QueCgpLCBvcmln
UmVjdC55KCksIG9yaWdSZWN0LndpZHRoKCksIG9yaWdSZWN0LmhlaWdodCgpLCBoZGMsIDAsIDAs
IGJtcFJlY3QucmlnaHQsIGJtcFJlY3QuYm90dG9tLCBibGVuZCk7CisgICAgICAgIH0gZWxzZQor
I2VuZGlmCisgICAgICAgICAgICBTdHJldGNoQmx0KG1fZGMsIG9yaWdSZWN0LngoKSwgb3JpZ1Jl
Y3QueSgpLCBvcmlnUmVjdC53aWR0aCgpLCBvcmlnUmVjdC5oZWlnaHQoKSwgaGRjLCAwLCAwLCBi
bXBSZWN0LnJpZ2h0LCBibXBSZWN0LmJvdHRvbSwgU1JDQ09QWSk7CisgICAgfQorCisgICAgSERD
IG1fZGM7CisgICAgUmVmUHRyPFNoYXJlZEJpdG1hcD4gbV9iaXRtYXA7CisgICAgVmVjdG9yPEdy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZURhdGE+IG1fYmFja3VwRGF0YTsKK307CisKK3N0
YXRpYyBIUEVOIGNyZWF0ZVBlbihjb25zdCBDb2xvciYgY29sLCBkb3VibGUgZldpZHRoLCBTdHJv
a2VTdHlsZSBzdHlsZSkKK3sKKyAgICBpbnQgd2lkdGggPSBzdGFibGVSb3VuZChmV2lkdGgpOwor
ICAgIGlmICh3aWR0aCA8IDEpCisgICAgICAgIHdpZHRoID0gMTsKKworICAgIGludCBwZW5TdHls
ZSA9IFBTX05VTEw7CisgICAgc3dpdGNoIChzdHlsZSkgeworICAgICAgICBjYXNlIFNvbGlkU3Ry
b2tlOgorICAgICAgICAgICAgcGVuU3R5bGUgPSBQU19TT0xJRDsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIERvdHRlZFN0cm9rZTogIC8vIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93
cyBDRQorICAgICAgICBjYXNlIERhc2hlZFN0cm9rZToKKyAgICAgICAgICAgIHBlblN0eWxlID0g
UFNfREFTSDsKKyAgICAgICAgICAgIHdpZHRoID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIENy
ZWF0ZVBlbihwZW5TdHlsZSwgd2lkdGgsIFJHQihjb2wucmVkKCksIGNvbC5ncmVlbigpLCBjb2wu
Ymx1ZSgpKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgSEdESU9CSiBjcmVhdGVCcnVzaChjb25zdCBD
b2xvciYgY29sKQoreworICAgIHJldHVybiBDcmVhdGVTb2xpZEJydXNoKFJHQihjb2wucmVkKCks
IGNvbC5ncmVlbigpLCBjb2wuYmx1ZSgpKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBQaXhl
bFR5cGUsIGJvb2wgSXMxNmJpdD4gc3RhdGljIHZvaWQgX3JvdGF0ZUJpdG1hcChTaGFyZWRCaXRt
YXAqIGRlc3RCbXAsIGNvbnN0IFNoYXJlZEJpdG1hcCogc291cmNlQm1wLCBjb25zdCBSb3RhdGlv
blRyYW5zZm9ybSYgdHJhbnNmb3JtKQoreworICAgIGludCBkZXN0VyA9IGRlc3RCbXAtPndpZHRo
KCk7CisgICAgaW50IGRlc3RIID0gZGVzdEJtcC0+aGVpZ2h0KCk7CisgICAgaW50IHNvdXJjZVcg
PSBzb3VyY2VCbXAtPndpZHRoKCk7CisgICAgaW50IHNvdXJjZUggPSBzb3VyY2VCbXAtPmhlaWdo
dCgpOworICAgIFBpeGVsVHlwZSogZGVzdCA9IChQaXhlbFR5cGUqKWRlc3RCbXAtPmJ5dGVzKCk7
CisgICAgY29uc3QgUGl4ZWxUeXBlKiBzb3VyY2UgPSAoY29uc3QgUGl4ZWxUeXBlKilzb3VyY2VC
bXAtPmJ5dGVzKCk7CisgICAgaW50IHBhZGRpbmc7CisgICAgaW50IHBhZGRlZFNvdXJjZVc7Cisg
ICAgaWYgKElzMTZiaXQpIHsKKyAgICAgICAgcGFkZGluZyA9IGRlc3RXICYgMTsKKyAgICAgICAg
cGFkZGVkU291cmNlVyA9IHNvdXJjZVcgKyAoc291cmNlVyAmIDEpOworICAgIH0gZWxzZSB7Cisg
ICAgICAgIHBhZGRpbmcgPSAwOworICAgICAgICBwYWRkZWRTb3VyY2VXID0gc291cmNlVzsKKyAg
ICB9CisgICAgaWYgKGlzWmVybyh0cmFuc2Zvcm0ubV9zaW5BKSkgeworICAgICAgICBpbnQgY29z
QSA9IHRyYW5zZm9ybS5tX2Nvc0EgPiAwID8gMSA6IC0xOworICAgICAgICBmb3IgKGludCB5ID0g
MDsgeSA8IGRlc3RIOyArK3kpIHsKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgZGVz
dFc7ICsreCkgeworICAgICAgICAgICAgICAgIGludCB4MSA9IHggKyB0cmFuc2Zvcm0ubV9wcmVT
aGlmdFg7CisgICAgICAgICAgICAgICAgaW50IHkxID0geSArIHRyYW5zZm9ybS5tX3ByZVNoaWZ0
WTsKKyAgICAgICAgICAgICAgICBpbnQgc3JjWCA9IHgxICogY29zQSArIHRyYW5zZm9ybS5tX3Bv
c3RTaGlmdFg7CisgICAgICAgICAgICAgICAgaW50IHNyY1kgPSB5MSAqIGNvc0EgLSB0cmFuc2Zv
cm0ubV9wb3N0U2hpZnRZOworICAgICAgICAgICAgICAgIGlmIChzcmNYID49IDAgJiYgc3JjWCA8
PSBzb3VyY2VXICYmIHNyY1kgPj0gMCAmJiBzcmNZIDw9IHNvdXJjZUgpCisgICAgICAgICAgICAg
ICAgICAgICpkZXN0KysgPSBzb3VyY2Vbc3JjWSAqIHBhZGRlZFNvdXJjZVcgKyBzcmNYXSB8IDB4
RkYwMDAwMDA7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZGVz
dCsrIHw9IDB4RkY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0ICs9IHBhZGRpbmc7
CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGlzWmVybyh0cmFuc2Zvcm0ubV9jb3NBKSkgewor
ICAgICAgICBpbnQgc2luQSA9IHRyYW5zZm9ybS5tX3NpbkEgPiAwID8gMSA6IC0xOworICAgICAg
ICBmb3IgKGludCB5ID0gMDsgeSA8IGRlc3RIOyArK3kpIHsKKyAgICAgICAgICAgIGZvciAoaW50
IHggPSAwOyB4IDwgZGVzdFc7ICsreCkgeworICAgICAgICAgICAgICAgIGludCB4MSA9IHggKyB0
cmFuc2Zvcm0ubV9wcmVTaGlmdFg7CisgICAgICAgICAgICAgICAgaW50IHkxID0geSArIHRyYW5z
Zm9ybS5tX3ByZVNoaWZ0WTsKKyAgICAgICAgICAgICAgICBpbnQgc3JjWCA9IHkxICogc2luQSAr
IHRyYW5zZm9ybS5tX3Bvc3RTaGlmdFg7CisgICAgICAgICAgICAgICAgaW50IHNyY1kgPSAteDEg
KiBzaW5BICsgdHJhbnNmb3JtLm1fcG9zdFNoaWZ0WTsKKyAgICAgICAgICAgICAgICBpZiAoc3Jj
WCA+PSAwICYmIHNyY1ggPD0gc291cmNlVyAmJiBzcmNZID49IDAgJiYgc3JjWSA8PSBzb3VyY2VI
KQorICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gc291cmNlW3NyY1kgKiBwYWRkZWRTb3Vy
Y2VXICsgc3JjWF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0ICs9IHBhZGRpbmc7
CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGRl
c3RIOyArK3kpIHsKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgZGVzdFc7ICsreCkg
eworICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBmb3IgYmVzdCBxdWFsaXR5LCB3ZSBzaG91bGQg
Z2V0IHdlaWdodGVkIHN1bSBvZiBmb3VyIG5laWdoYm91cnMsCisgICAgICAgICAgICAgICAgLy8g
YnV0IHRoYXQgd2lsbCBiZSB0b28gZXhwZW5zaXZlCisgICAgICAgICAgICAgICAgaW50IHNyY1gs
IHNyY1k7CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtLm1hcCh4LCB5LCAmc3JjWCwgJnNyY1kp
OworICAgICAgICAgICAgICAgIGlmIChzcmNYID49IDAgJiYgc3JjWCA8PSBzb3VyY2VXICYmIHNy
Y1kgPj0gMCAmJiBzcmNZIDw9IHNvdXJjZUgpCisgICAgICAgICAgICAgICAgICAgICpkZXN0Kysg
PSBzb3VyY2Vbc3JjWSAqIHBhZGRlZFNvdXJjZVcgKyBzcmNYXTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGRlc3QgKz0gcGFkZGluZzsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGlj
IHZvaWQgcm90YXRlQml0bWFwKFNoYXJlZEJpdG1hcCogZGVzdEJtcCwgY29uc3QgU2hhcmVkQml0
bWFwKiBzb3VyY2VCbXAsIGNvbnN0IFJvdGF0aW9uVHJhbnNmb3JtJiB0cmFuc2Zvcm0pCit7Cisg
ICAgQVNTRVJUKGRlc3RCbXAtPmlzMTZiaXQoKSA9PSBzb3VyY2VCbXAtPmlzMTZiaXQoKSk7Cisg
ICAgaWYgKGRlc3RCbXAtPmlzMTZiaXQoKSkKKyAgICAgICAgX3JvdGF0ZUJpdG1hcDx1bnNpZ25l
ZCBzaG9ydCwgdHJ1ZT4oZGVzdEJtcCwgc291cmNlQm1wLCB0cmFuc2Zvcm0pOworICAgIGVsc2UK
KyAgICAgICAgX3JvdGF0ZUJpdG1hcDx1bnNpZ25lZCwgZmFsc2U+KGRlc3RCbXAsIHNvdXJjZUJt
cCwgdHJhbnNmb3JtKTsKK30KKworY2xhc3MgVHJhbnNwYXJlbnRMYXllckRDIDogTm9uY29weWFi
bGUgeworcHVibGljOgorICAgIFRyYW5zcGFyZW50TGF5ZXJEQyhHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGUqIGRhdGEsIEludFJlY3QmIG9yaWdSZWN0LCBjb25zdCBJbnRSZWN0KiByZWN0
QmVmb3JlVHJhbnNmb3JtID0gMCwgaW50IGFscGhhID0gMjU1LCBib29sIHBhaW50SW1hZ2UgPSBm
YWxzZSk7CisgICAgflRyYW5zcGFyZW50TGF5ZXJEQygpOworCisgICAgSERDIGhkYygpIGNvbnN0
IHsgcmV0dXJuIG1fbWVtRGM7IH0KKyAgICBjb25zdCBSRUNUJiByZWN0KCkgY29uc3QgeyByZXR1
cm4gbV9ibXBSZWN0OyB9CisgICAgSW50U2l6ZSB0b1NoaWZ0KCkgY29uc3QgeyByZXR1cm4gSW50
U2l6ZShtX2JtcFJlY3QubGVmdCAtIG1fb3JpZ1JlY3QueCgpLCBtX2JtcFJlY3QudG9wIC0gbV9v
cmlnUmVjdC55KCkpOyB9CisgICAgdm9pZCBmaWxsQWxwaGFDaGFubmVsKCk7CisKK3ByaXZhdGU6
CisgICAgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKiBtX2RhdGE7CisgICAgSW50UmVj
dCBtX29yaWdSZWN0OworICAgIEludFJlY3QgbV9yb3RhdGVkT3JpZ1JlY3Q7CisgICAgSERDIG1f
bWVtRGM7CisgICAgUmVmUHRyPFNoYXJlZEJpdG1hcD4gbV9iaXRtYXA7CisgICAgUmVmUHRyPFNo
YXJlZEJpdG1hcD4gbV9yb3RhdGVkQml0bWFwOworICAgIFJFQ1QgbV9ibXBSZWN0OworICAgIHVu
c2lnbmVkIG1fa2V5MTsKKyAgICB1bnNpZ25lZCBtX2tleTI7CisgICAgUm90YXRpb25UcmFuc2Zv
cm0gbV9yb3RhdGlvbjsKKyAgICBmbG9hdCBtX29sZE9wYWNpdHk7CisgICAgQWxwaGFQYWludFR5
cGUgbV9hbHBoYVBhaW50VHlwZTsKK307CisKK1RyYW5zcGFyZW50TGF5ZXJEQzo6VHJhbnNwYXJl
bnRMYXllckRDKEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSogZGF0YSwgSW50UmVjdCYg
b3JpZ1JlY3QsIGNvbnN0IEludFJlY3QqIHJlY3RCZWZvcmVUcmFuc2Zvcm0sIGludCBhbHBoYSwg
Ym9vbCBwYWludEltYWdlKQorOiBtX2RhdGEoZGF0YSkKKywgbV9vcmlnUmVjdChvcmlnUmVjdCkK
KywgbV9vbGRPcGFjaXR5KGRhdGEtPm1fb3BhY2l0eSkKKy8vIG1fa2V5MSBhbmQgbV9rZXkyIGFy
ZSBub3QgaW5pdGFsaXplZCBoZXJlLiBUaGV5IGFyZSB1c2VkIG9ubHkgaW4gdGhlIGNhc2UgdGhh
dAorLy8gU2hhcmVkQml0bWFwOjpnZXREQygpIGlzIGNhbGxlZCwgSS5FLiwgd2hlbiBtX2JpdG1h
cCBpcyBub3QgbnVsbC4KK3sKKyAgICBtX2RhdGEtPm1fb3BhY2l0eSAqPSBhbHBoYSAvIDI1NS47
CisgICAgYm9vbCBtdXN0Q3JlYXRlTGF5ZXI7CisgICAgaWYgKCFtX2RhdGEtPmhhc0FscGhhKCkp
IHsKKyAgICAgICAgbXVzdENyZWF0ZUxheWVyID0gZmFsc2U7CisgICAgICAgIG1fYWxwaGFQYWlu
dFR5cGUgPSBBbHBoYVBhaW50Tm9uZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtdXN0Q3JlYXRl
TGF5ZXIgPSB0cnVlOworICAgICAgICBtX2FscGhhUGFpbnRUeXBlID0gcGFpbnRJbWFnZSA/IEFs
cGhhUGFpbnRJbWFnZSA6IEFscGhhUGFpbnRPdGhlcjsKKyAgICB9CisgICAgaWYgKHJlY3RCZWZv
cmVUcmFuc2Zvcm0gJiYgIWlzWmVybyhtX2RhdGEtPm1fdHJhbnNmb3JtLmIoKSkpIHsKKyAgICAg
ICAgbV9yb3RhdGVkT3JpZ1JlY3QgPSBvcmlnUmVjdDsKKyAgICAgICAgbV9yb3RhdGVkQml0bWFw
ID0gbV9kYXRhLT5nZXRUcmFuc3BhcmVudExheWVyQml0bWFwKG1fcm90YXRlZE9yaWdSZWN0LCBt
X2FscGhhUGFpbnRUeXBlLCBtX2JtcFJlY3QsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgaWYgKG1f
cm90YXRlZEJpdG1hcCkgeworICAgICAgICAgICAgZG91YmxlIGEgPSBtX2RhdGEtPm1fdHJhbnNm
b3JtLmEoKTsKKyAgICAgICAgICAgIGRvdWJsZSBiID0gbV9kYXRhLT5tX3RyYW5zZm9ybS5iKCk7
CisgICAgICAgICAgICBkb3VibGUgYyA9IF9oeXBvdChhLCBiKTsKKyAgICAgICAgICAgIG1fcm90
YXRpb24ubV9jb3NBID0gYSAvIGM7CisgICAgICAgICAgICBtX3JvdGF0aW9uLm1fc2luQSA9IGIg
LyBjOworCisgICAgICAgICAgICBpbnQgY2VudGVyWCA9IG9yaWdSZWN0LngoKSArIG9yaWdSZWN0
LndpZHRoKCkgLyAyOworICAgICAgICAgICAgaW50IGNlbnRlclkgPSBvcmlnUmVjdC55KCkgKyBv
cmlnUmVjdC5oZWlnaHQoKSAvIDI7CisgICAgICAgICAgICBtX3JvdGF0aW9uLm1fcHJlU2hpZnRY
ID0gLWNlbnRlclg7CisgICAgICAgICAgICBtX3JvdGF0aW9uLm1fcHJlU2hpZnRZID0gLWNlbnRl
clk7CisgICAgICAgICAgICBtX3JvdGF0aW9uLm1fcG9zdFNoaWZ0WCA9IGNlbnRlclg7CisgICAg
ICAgICAgICBtX3JvdGF0aW9uLm1fcG9zdFNoaWZ0WSA9IGNlbnRlclk7CisKKyAgICAgICAgICAg
IG1fb3JpZ1JlY3QgPSBtYXBSZWN0KG1fcm90YXRlZE9yaWdSZWN0LCBtX3JvdGF0aW9uKTsKKwor
ICAgICAgICAgICAgbV9yb3RhdGlvbi5tX3ByZVNoaWZ0WCArPSBtX3JvdGF0ZWRPcmlnUmVjdC54
KCk7CisgICAgICAgICAgICBtX3JvdGF0aW9uLm1fcHJlU2hpZnRZICs9IG1fcm90YXRlZE9yaWdS
ZWN0LnkoKTsKKyAgICAgICAgICAgIG1fcm90YXRpb24ubV9wb3N0U2hpZnRYIC09IG1fb3JpZ1Jl
Y3QueCgpOworICAgICAgICAgICAgbV9yb3RhdGlvbi5tX3Bvc3RTaGlmdFkgLT0gbV9vcmlnUmVj
dC55KCk7CisKKyAgICAgICAgICAgIEZsb2F0UG9pbnQgdG9wTGVmdCA9IG1fZGF0YS0+bV90cmFu
c2Zvcm0ubWFwUG9pbnQoRmxvYXRQb2ludChyZWN0QmVmb3JlVHJhbnNmb3JtLT50b3BMZWZ0KCkp
KTsKKyAgICAgICAgICAgIEZsb2F0UG9pbnQgdG9wUmlnaHQocmVjdEJlZm9yZVRyYW5zZm9ybS0+
cmlnaHQoKSAtIDEsIHJlY3RCZWZvcmVUcmFuc2Zvcm0tPnkoKSk7CisgICAgICAgICAgICB0b3BS
aWdodCA9IG1fZGF0YS0+bV90cmFuc2Zvcm0ubWFwUG9pbnQodG9wUmlnaHQpOworICAgICAgICAg
ICAgRmxvYXRQb2ludCBib3R0b21MZWZ0KHJlY3RCZWZvcmVUcmFuc2Zvcm0tPngoKSwgcmVjdEJl
Zm9yZVRyYW5zZm9ybS0+Ym90dG9tKCkgLSAxKTsKKyAgICAgICAgICAgIGJvdHRvbUxlZnQgPSBt
X2RhdGEtPm1fdHJhbnNmb3JtLm1hcFBvaW50KGJvdHRvbUxlZnQpOworICAgICAgICAgICAgRmxv
YXRTaXplIHNpZGVUb3AgPSB0b3BSaWdodCAtIHRvcExlZnQ7CisgICAgICAgICAgICBGbG9hdFNp
emUgc2lkZUxlZnQgPSBib3R0b21MZWZ0IC0gdG9wTGVmdDsKKyAgICAgICAgICAgIGZsb2F0IHdp
ZHRoID0gX2h5cG90KHNpZGVUb3Aud2lkdGgoKSArIDEsIHNpZGVUb3AuaGVpZ2h0KCkgKyAxKTsK
KyAgICAgICAgICAgIGZsb2F0IGhlaWdodCA9IF9oeXBvdChzaWRlTGVmdC53aWR0aCgpICsgMSwg
c2lkZUxlZnQuaGVpZ2h0KCkgKyAxKTsKKworICAgICAgICAgICAgb3JpZ1JlY3QuaW5mbGF0ZVgo
c3RhYmxlUm91bmQoKHdpZHRoIC0gb3JpZ1JlY3Qud2lkdGgoKSkgKiAwLjUpKTsKKyAgICAgICAg
ICAgIG9yaWdSZWN0LmluZmxhdGVZKHN0YWJsZVJvdW5kKChoZWlnaHQgLSBvcmlnUmVjdC5oZWln
aHQoKSkgKiAwLjUpKTsKKworICAgICAgICAgICAgbV9iaXRtYXAgPSBTaGFyZWRCaXRtYXA6OmNy
ZWF0ZUluc3RhbmNlKG1fcm90YXRlZEJpdG1hcC0+aXMxNmJpdCgpLCBtX29yaWdSZWN0LndpZHRo
KCksIG1fb3JpZ1JlY3QuaGVpZ2h0KCksIHRydWUpOworICAgICAgICAgICAgaWYgKG1fYml0bWFw
KQorICAgICAgICAgICAgICAgIHJvdGF0ZUJpdG1hcChtX2JpdG1hcC5nZXQoKSwgbV9yb3RhdGVk
Qml0bWFwLmdldCgpLCAtbV9yb3RhdGlvbik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAg
ICAgICAgbV9yb3RhdGVkQml0bWFwID0gMDsKKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAg
ICBtX2JpdG1hcCA9IG1fZGF0YS0+Z2V0VHJhbnNwYXJlbnRMYXllckJpdG1hcChtX29yaWdSZWN0
LCBtX2FscGhhUGFpbnRUeXBlLCBtX2JtcFJlY3QsIHRydWUsIG11c3RDcmVhdGVMYXllcik7Cisg
ICAgaWYgKG1fYml0bWFwKQorICAgICAgICBtX21lbURjID0gbV9iaXRtYXAtPmdldERDKCZtX2tl
eTEsICZtX2tleTIpOworICAgIGVsc2UKKyAgICAgICAgbV9tZW1EYyA9IG1fZGF0YS0+bV9kYzsK
K30KKworVHJhbnNwYXJlbnRMYXllckRDOjp+VHJhbnNwYXJlbnRMYXllckRDKCkKK3sKKyAgICBp
ZiAobV9yb3RhdGVkQml0bWFwKSB7CisgICAgICAgIG1fYml0bWFwLT5yZWxlYXNlREMobV9tZW1E
YywgbV9rZXkxLCBtX2tleTIpOworICAgICAgICBtX2tleTEgPSBtX2tleTIgPSAwOworICAgICAg
ICByb3RhdGVCaXRtYXAobV9yb3RhdGVkQml0bWFwLmdldCgpLCBtX2JpdG1hcC5nZXQoKSwgbV9y
b3RhdGlvbik7CisgICAgICAgIG1fbWVtRGMgPSBtX3JvdGF0ZWRCaXRtYXAtPmdldERDKCZtX2tl
eTEsICZtX2tleTIpOworICAgICAgICBtX2RhdGEtPnBhaW50QmFja1RyYW5zcGFyZW50TGF5ZXJC
aXRtYXAobV9tZW1EYywgbV9yb3RhdGVkQml0bWFwLmdldCgpLCBtX3JvdGF0ZWRPcmlnUmVjdCwg
bV9hbHBoYVBhaW50VHlwZSwgbV9ibXBSZWN0KTsKKyAgICAgICAgbV9yb3RhdGVkQml0bWFwLT5y
ZWxlYXNlREMobV9tZW1EYywgbV9rZXkxLCBtX2tleTIpOworICAgIH0gZWxzZSBpZiAobV9iaXRt
YXApIHsKKyAgICAgICAgbV9kYXRhLT5wYWludEJhY2tUcmFuc3BhcmVudExheWVyQml0bWFwKG1f
bWVtRGMsIG1fYml0bWFwLmdldCgpLCBtX29yaWdSZWN0LCBtX2FscGhhUGFpbnRUeXBlLCBtX2Jt
cFJlY3QpOworICAgICAgICBtX2JpdG1hcC0+cmVsZWFzZURDKG1fbWVtRGMsIG1fa2V5MSwgbV9r
ZXkyKTsKKyAgICB9CisgICAgbV9kYXRhLT5tX29wYWNpdHkgPSBtX29sZE9wYWNpdHk7Cit9CisK
K3ZvaWQgVHJhbnNwYXJlbnRMYXllckRDOjpmaWxsQWxwaGFDaGFubmVsKCkKK3sKKyAgICBpZiAo
IW1fYml0bWFwIHx8ICFtX2JpdG1hcC0+aXMzMmJpdCgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICB1bnNpZ25lZCogcGl4ZWxzID0gKHVuc2lnbmVkKiltX2JpdG1hcC0+Ynl0ZXMoKTsKKyAgICBj
b25zdCB1bnNpZ25lZCogY29uc3QgcGl4ZWxzRW5kID0gcGl4ZWxzICsgbV9iaXRtYXAtPmJpdG1h
cEluZm8oKS5udW1QaXhlbHMoKTsKKyAgICB3aGlsZSAocGl4ZWxzIDwgcGl4ZWxzRW5kKSB7Cisg
ICAgICAgICpwaXhlbHMgfD0gMHhGRjAwMDAwMDsKKyAgICAgICAgKytwaXhlbHM7CisgICAgfQor
fQorCitjbGFzcyBTY29wZURDUHJvdmlkZXIgOiBOb25jb3B5YWJsZSB7CitwdWJsaWM6CisgICAg
ZXhwbGljaXQgU2NvcGVEQ1Byb3ZpZGVyKEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSog
ZGF0YSkKKyAgICAgICAgOiBtX2RhdGEoZGF0YSkKKyAgICB7CisgICAgICAgIGlmIChtX2RhdGEt
Pm1fYml0bWFwKQorICAgICAgICAgICAgbV9kYXRhLT5tX2RjID0gbV9kYXRhLT5tX2JpdG1hcC0+
Z2V0REMoJm1fa2V5MSwgJm1fa2V5Mik7CisgICAgfQorICAgIH5TY29wZURDUHJvdmlkZXIoKQor
ICAgIHsKKyAgICAgICAgaWYgKG1fZGF0YS0+bV9iaXRtYXApIHsKKyAgICAgICAgICAgIG1fZGF0
YS0+bV9iaXRtYXAtPnJlbGVhc2VEQyhtX2RhdGEtPm1fZGMsIG1fa2V5MSwgbV9rZXkyKTsKKyAg
ICAgICAgICAgIG1fZGF0YS0+bV9kYyA9IDA7CisgICAgICAgIH0KKyAgICB9Citwcml2YXRlOgor
ICAgIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSogbV9kYXRhOworICAgIHVuc2lnbmVk
IG1fa2V5MTsKKyAgICB1bnNpZ25lZCBtX2tleTI7Cit9OworCisKK0dyYXBoaWNzQ29udGV4dDo6
R3JhcGhpY3NDb250ZXh0KFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiBkYykKKzogbV9jb21tb24o
Y3JlYXRlR3JhcGhpY3NDb250ZXh0UHJpdmF0ZSgpKQorLCBtX2RhdGEobmV3IEdyYXBoaWNzQ29u
dGV4dFBsYXRmb3JtUHJpdmF0ZShkYykpCit7Cit9CisKK0dyYXBoaWNzQ29udGV4dDo6fkdyYXBo
aWNzQ29udGV4dCgpCit7CisgICAgZGVzdHJveUdyYXBoaWNzQ29udGV4dFByaXZhdGUobV9jb21t
b24pOworICAgIGRlbGV0ZSBtX2RhdGE7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRC
aXRtYXAoUGFzc1JlZlB0cjxTaGFyZWRCaXRtYXA+IGJtcCkKK3sKKyAgICBBU1NFUlQoIW1fZGF0
YS0+bV9kYyk7CisgICAgbV9kYXRhLT5tX2JpdG1hcCA9IGJtcDsKK30KKworSERDIEdyYXBoaWNz
Q29udGV4dDo6Z2V0V2luZG93c0NvbnRleHQoY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgYm9vbCBz
dXBwb3J0QWxwaGFCbGVuZCwgYm9vbCBtYXlDcmVhdGVCaXRtYXApCit7CisgICAgbm90SW1wbGVt
ZW50ZWQoKTsKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OnJlbGVhc2VXaW5kb3dzQ29udGV4dChIREMgaGRjLCBjb25z
dCBJbnRSZWN0JiBkc3RSZWN0LCBib29sIHN1cHBvcnRBbHBoYUJsZW5kLCBib29sIG1heUNyZWF0
ZUJpdG1hcCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2F2ZVBsYXRmb3JtU3RhdGUoKQorewor
ICAgIG1fZGF0YS0+c2F2ZSgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6cmVzdG9yZVBs
YXRmb3JtU3RhdGUoKQoreworICAgIG1fZGF0YS0+cmVzdG9yZSgpOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDo6ZHJhd1JlY3QoY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAoIW1f
ZGF0YS0+bV9vcGFjaXR5IHx8IHBhaW50aW5nRGlzYWJsZWQoKSB8fCByZWN0LmlzRW1wdHkoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgU2NvcGVEQ1Byb3ZpZGVyIGRjUHJvdmlkZXIobV9kYXRh
KTsKKyAgICBpZiAoIW1fZGF0YS0+bV9kYykKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50UmVj
dCB0clJlY3QgPSBtX2RhdGEtPm1hcFJlY3QocmVjdCk7CisgICAgVHJhbnNwYXJlbnRMYXllckRD
IHRyYW5zcGFyZW50REMobV9kYXRhLCB0clJlY3QsICZyZWN0KTsKKyAgICBIREMgZGMgPSB0cmFu
c3BhcmVudERDLmhkYygpOworICAgIGlmICghZGMpCisgICAgICAgIHJldHVybjsKKyAgICB0clJl
Y3QubW92ZSh0cmFuc3BhcmVudERDLnRvU2hpZnQoKSk7CisKKyAgICBIR0RJT0JKIGJydXNoID0g
MDsKKyAgICBIR0RJT0JKIG9sZEJydXNoOworICAgIGlmIChmaWxsQ29sb3IoKS5hbHBoYSgpKSB7
CisgICAgICAgIGJydXNoID0gY3JlYXRlQnJ1c2goZmlsbENvbG9yKCkpOworICAgICAgICBvbGRC
cnVzaCA9IFNlbGVjdE9iamVjdChkYywgYnJ1c2gpOworICAgIH0gZWxzZQorICAgICAgICBTZWxl
Y3RPYmplY3QoZGMsIEdldFN0b2NrT2JqZWN0KE5VTExfQlJVU0gpKTsKKworICAgIEhHRElPQkog
cGVuID0gMDsKKyAgICBIR0RJT0JKIG9sZFBlbjsKKyAgICBpZiAoc3Ryb2tlU3R5bGUoKSAhPSBO
b1N0cm9rZSkgeworICAgICAgICBwZW4gPSBjcmVhdGVQZW4oc3Ryb2tlQ29sb3IoKSwgc3Ryb2tl
VGhpY2tuZXNzKCksIHN0cm9rZVN0eWxlKCkpOworICAgICAgICBvbGRQZW4gPSBTZWxlY3RPYmpl
Y3QoZGMsIHBlbik7CisgICAgfSBlbHNlCisgICAgICAgIFNlbGVjdE9iamVjdChkYywgR2V0U3Rv
Y2tPYmplY3QoTlVMTF9QRU4pKTsKKworICAgIGlmICghYnJ1c2ggJiYgIXBlbikKKyAgICAgICAg
cmV0dXJuOworCisgICAgaWYgKHRyUmVjdC53aWR0aCgpIDw9IDApCisgICAgICAgIHRyUmVjdC5z
ZXRXaWR0aCgxKTsKKyAgICBpZiAodHJSZWN0LmhlaWdodCgpIDw9IDApCisgICAgICAgIHRyUmVj
dC5zZXRIZWlnaHQoMSk7CisKKyAgICBSZWN0YW5nbGUoZGMsIHRyUmVjdC54KCksIHRyUmVjdC55
KCksIHRyUmVjdC5yaWdodCgpLCB0clJlY3QuYm90dG9tKCkpOworCisgICAgaWYgKHBlbikgewor
ICAgICAgICBTZWxlY3RPYmplY3QoZGMsIG9sZFBlbik7CisgICAgICAgIERlbGV0ZU9iamVjdChw
ZW4pOworICAgIH0KKworICAgIGlmIChicnVzaCkgeworICAgICAgICBTZWxlY3RPYmplY3QoZGMs
IG9sZEJydXNoKTsKKyAgICAgICAgRGVsZXRlT2JqZWN0KGJydXNoKTsKKyAgICB9Cit9CisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZShjb25zdCBJbnRQb2ludCYgcG9pbnQxLCBjb25z
dCBJbnRQb2ludCYgcG9pbnQyKQoreworICAgIGlmICghbV9kYXRhLT5tX29wYWNpdHkgfHwgcGFp
bnRpbmdEaXNhYmxlZCgpIHx8IHN0cm9rZVN0eWxlKCkgPT0gTm9TdHJva2UgfHwgIXN0cm9rZUNv
bG9yKCkuYWxwaGEoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU2NvcGVEQ1Byb3ZpZGVyIGRj
UHJvdmlkZXIobV9kYXRhKTsKKyAgICBpZiAoIW1fZGF0YS0+bV9kYykKKyAgICAgICAgcmV0dXJu
OworCisgICAgSW50UG9pbnQgdHJQb2ludDEgPSBtX2RhdGEtPm1hcFBvaW50KHBvaW50MSk7Cisg
ICAgSW50UG9pbnQgdHJQb2ludDIgPSBtX2RhdGEtPm1hcFBvaW50KHBvaW50Mik7CisKKyAgICBJ
bnRSZWN0IGxpbmVSZWN0KHRyUG9pbnQxLCB0clBvaW50MiAtIHRyUG9pbnQxKTsKKyAgICBsaW5l
UmVjdC5zZXRIZWlnaHQobGluZVJlY3QuaGVpZ2h0KCkgKyBzdHJva2VUaGlja25lc3MoKSk7Cisg
ICAgVHJhbnNwYXJlbnRMYXllckRDIHRyYW5zcGFyZW50REMobV9kYXRhLCBsaW5lUmVjdCwgMCwg
c3Ryb2tlQ29sb3IoKS5hbHBoYSgpKTsKKyAgICBIREMgZGMgPSB0cmFuc3BhcmVudERDLmhkYygp
OworICAgIGlmICghZGMpCisgICAgICAgIHJldHVybjsKKyAgICB0clBvaW50MSArPSB0cmFuc3Bh
cmVudERDLnRvU2hpZnQoKTsKKyAgICB0clBvaW50MiArPSB0cmFuc3BhcmVudERDLnRvU2hpZnQo
KTsKKworICAgIEhHRElPQkogcGVuID0gY3JlYXRlUGVuKHN0cm9rZUNvbG9yKCksIHN0cm9rZVRo
aWNrbmVzcygpLCBzdHJva2VTdHlsZSgpKTsKKyAgICBIR0RJT0JKIG9sZFBlbiA9IFNlbGVjdE9i
amVjdChkYywgcGVuKTsKKworICAgIE1vdmVUb0V4KGRjLCB0clBvaW50MS54KCksIHRyUG9pbnQx
LnkoKSwgMCk7CisgICAgTGluZVRvKGRjLCB0clBvaW50Mi54KCksIHRyUG9pbnQyLnkoKSk7CisK
KyAgICBTZWxlY3RPYmplY3QoZGMsIG9sZFBlbik7CisgICAgRGVsZXRlT2JqZWN0KHBlbik7Cit9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3RWxsaXBzZShjb25zdCBJbnRSZWN0JiByZWN0
KQoreworICAgIGlmICghbV9kYXRhLT5tX29wYWNpdHkgfHwgcGFpbnRpbmdEaXNhYmxlZCgpIHx8
ICghZmlsbENvbG9yKCkuYWxwaGEoKSAmJiBzdHJva2VTdHlsZSgpID09IE5vU3Ryb2tlKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgU2NvcGVEQ1Byb3ZpZGVyIGRjUHJvdmlkZXIobV9kYXRhKTsK
KyAgICBpZiAoIW1fZGF0YS0+bV9kYykKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50UmVjdCB0
clJlY3QgPSBtX2RhdGEtPm1hcFJlY3QocmVjdCk7CisgICAgVHJhbnNwYXJlbnRMYXllckRDIHRy
YW5zcGFyZW50REMobV9kYXRhLCB0clJlY3QsICZyZWN0KTsKKyAgICBIREMgZGMgPSB0cmFuc3Bh
cmVudERDLmhkYygpOworICAgIGlmICghZGMpCisgICAgICAgIHJldHVybjsKKyAgICB0clJlY3Qu
bW92ZSh0cmFuc3BhcmVudERDLnRvU2hpZnQoKSk7CisKKyAgICBIR0RJT0JKIGJydXNoID0gMDsK
KyAgICBIR0RJT0JKIG9sZEJydXNoOworICAgIGlmIChmaWxsQ29sb3IoKS5hbHBoYSgpKSB7Cisg
ICAgICAgIGJydXNoID0gY3JlYXRlQnJ1c2goZmlsbENvbG9yKCkpOworICAgICAgICBvbGRCcnVz
aCA9IFNlbGVjdE9iamVjdChkYywgYnJ1c2gpOworICAgIH0gZWxzZQorICAgICAgICBTZWxlY3RP
YmplY3QoZGMsIEdldFN0b2NrT2JqZWN0KE5VTExfQlJVU0gpKTsKKyAgICBIR0RJT0JKIHBlbiA9
IDA7CisgICAgSEdESU9CSiBvbGRQZW47CisgICAgaWYgKHN0cm9rZVN0eWxlKCkgIT0gTm9TdHJv
a2UpIHsKKyAgICAgICAgcGVuID0gY3JlYXRlUGVuKHN0cm9rZUNvbG9yKCksIHN0cm9rZVRoaWNr
bmVzcygpLCBzdHJva2VTdHlsZSgpKTsKKyAgICAgICAgb2xkUGVuID0gU2VsZWN0T2JqZWN0KGRj
LCBwZW4pOworICAgIH0gZWxzZQorICAgICAgICBTZWxlY3RPYmplY3QoZGMsIEdldFN0b2NrT2Jq
ZWN0KE5VTExfUEVOKSk7CisKKyAgICBFbGxpcHNlKGRjLCB0clJlY3QueCgpLCB0clJlY3QueSgp
LCB0clJlY3QucmlnaHQoKSwgdHJSZWN0LmJvdHRvbSgpKTsKKworICAgIGlmIChwZW4pIHsKKyAg
ICAgICAgU2VsZWN0T2JqZWN0KGRjLCBvbGRQZW4pOworICAgICAgICBEZWxldGVPYmplY3QocGVu
KTsKKyAgICB9CisKKyAgICBpZiAoYnJ1c2gpIHsKKyAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBv
bGRCcnVzaCk7CisgICAgICAgIERlbGV0ZU9iamVjdChicnVzaCk7CisgICAgfQorfQorCitzdGF0
aWMgaW5saW5lIGJvb2wgZXF1YWxBbmdsZShkb3VibGUgYSwgZG91YmxlIGIpIAoreworICAgIHJl
dHVybiBmYWJzKGEgLSBiKSA8IDFFLTU7Cit9CisKK3ZvaWQgZ2V0RWxsaXBzZVBvaW50QnlBbmds
ZShkb3VibGUgYW5nbGUsIGRvdWJsZSBhLCBkb3VibGUgYiwgZmxvYXQmIHgsIGZsb2F0JiB5KQor
eworICAgIHdoaWxlIChhbmdsZSA8IDApCisgICAgICAgIGFuZ2xlICs9IDIgKiBwaURvdWJsZTsK
KyAgICB3aGlsZSAoYW5nbGUgPj0gMiAqIHBpRG91YmxlKQorICAgICAgICBhbmdsZSAtPSAyICog
cGlEb3VibGU7CisKKyAgICBpZiAoZXF1YWxBbmdsZShhbmdsZSwgMCkgfHwgZXF1YWxBbmdsZShh
bmdsZSwgMiAqIHBpRG91YmxlKSkgeworICAgICAgICB4ID0gYTsKKyAgICAgICAgeSA9IDA7Cisg
ICAgfSBlbHNlIGlmIChlcXVhbEFuZ2xlKGFuZ2xlLCBwaURvdWJsZSkpIHsKKyAgICAgICAgeCA9
IC1hOworICAgICAgICB5ID0gMDsKKyAgICB9IGVsc2UgaWYgKGVxdWFsQW5nbGUoYW5nbGUsIC41
ICogcGlEb3VibGUpKSB7CisgICAgICAgIHggPSAwOworICAgICAgICB5ID0gYjsKKyAgICB9IGVs
c2UgaWYgKGVxdWFsQW5nbGUoYW5nbGUsIDEuNSAqIHBpRG91YmxlKSkgeworICAgICAgICB4ID0g
MDsKKyAgICAgICAgeSA9IC1iOworICAgIH0gZWxzZSB7CisgICAgICAgIGRvdWJsZSBrID0gdGFu
KGFuZ2xlKTsKKyAgICAgICAgZG91YmxlIHNxQSA9IGEgKiBhOworICAgICAgICBkb3VibGUgc3FC
ID0gYiAqIGI7CisgICAgICAgIGRvdWJsZSB0bXAgPSAxLiAvICgxLiAvIHNxQSArIChrICogaykg
LyBzcUIpOworICAgICAgICB0bXAgPSB0bXAgPD0gMCA/IDAgOiBzcXJ0KHRtcCk7CisgICAgICAg
IGlmIChhbmdsZSA+IC41ICogcGlEb3VibGUgJiYgYW5nbGUgPCAxLjUgKiBwaURvdWJsZSkKKyAg
ICAgICAgICAgIHRtcCA9IC10bXA7CisgICAgICAgIHggPSB0bXA7CisKKyAgICAgICAgayA9IHRh
biguNSAqIHBpRG91YmxlIC0gYW5nbGUpOworICAgICAgICB0bXAgPSAxLiAvICgoayAqIGspIC8g
c3FBICsgMSAvIHNxQik7CisgICAgICAgIHRtcCA9IHRtcCA8PSAwID8gMCA6IHNxcnQodG1wKTsK
KyAgICAgICAgaWYgKGFuZ2xlID4gcGlEb3VibGUpCisgICAgICAgICAgICB0bXAgPSAtdG1wOwor
ICAgICAgICB5ID0gdG1wOworICAgIH0KK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnN0cm9r
ZUFyYyhjb25zdCBJbnRSZWN0JiByZWN0LCBpbnQgc3RhcnRBbmdsZSwgaW50IGFuZ2xlU3BhbikK
K3sKKyAgICBpZiAoIW1fZGF0YS0+bV9vcGFjaXR5IHx8IHBhaW50aW5nRGlzYWJsZWQoKSB8fCBz
dHJva2VTdHlsZSgpID09IE5vU3Ryb2tlIHx8IHJlY3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBTY29wZURDUHJvdmlkZXIgZGNQcm92aWRlcihtX2RhdGEpOworICAgIGlmICgh
bV9kYXRhLT5tX2RjKQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRSZWN0IHRyUmVjdCA9IG1f
ZGF0YS0+bWFwUmVjdChyZWN0KTsKKyAgICBUcmFuc3BhcmVudExheWVyREMgdHJhbnNwYXJlbnRE
QyhtX2RhdGEsIHRyUmVjdCwgJnJlY3QpOworICAgIEhEQyBkYyA9IHRyYW5zcGFyZW50REMuaGRj
KCk7CisgICAgaWYgKCFkYykKKyAgICAgICAgcmV0dXJuOworICAgIHRyUmVjdC5tb3ZlKHRyYW5z
cGFyZW50REMudG9TaGlmdCgpKTsKKworICAgIEhHRElPQkogcGVuID0gY3JlYXRlUGVuKHN0cm9r
ZUNvbG9yKCksIHN0cm9rZVRoaWNrbmVzcygpLCBzdHJva2VTdHlsZSgpKTsKKyAgICBIR0RJT0JK
IG9sZFBlbiA9IFNlbGVjdE9iamVjdChkYywgcGVuKTsKKworICAgIGRvdWJsZSBhID0gdHJSZWN0
LndpZHRoKCkgKiAwLjU7CisgICAgZG91YmxlIGIgPSB0clJlY3QuaGVpZ2h0KCkgKiAwLjU7Cisg
ICAgaW50IGNlbnRlclggPSBzdGFibGVSb3VuZCh0clJlY3QueCgpICsgYSk7CisgICAgaW50IGNl
bnRlclkgPSBzdGFibGVSb3VuZCh0clJlY3QueSgpICsgYik7CisgICAgZmxvYXQgZnN0YXJ0WCwg
ZnN0YXJ0WSwgZmVuZFgsIGZlbmRZOworICAgIGludCBzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5k
WTsKKyAgICBnZXRFbGxpcHNlUG9pbnRCeUFuZ2xlKGRlZzJyYWQoKGRvdWJsZSlzdGFydEFuZ2xl
KSwgYSwgYiwgZnN0YXJ0WCwgZnN0YXJ0WSk7CisgICAgZ2V0RWxsaXBzZVBvaW50QnlBbmdsZShk
ZWcycmFkKChkb3VibGUpc3RhcnRBbmdsZSArIGFuZ2xlU3BhbiksIGEsIGIsIGZlbmRYLCBmZW5k
WSk7CisgICAgc3RhcnRYID0gc3RhYmxlUm91bmQoZnN0YXJ0WCk7CisgICAgc3RhcnRZID0gc3Rh
YmxlUm91bmQoZnN0YXJ0WSk7CisgICAgZW5kWCA9IHN0YWJsZVJvdW5kKGZlbmRYKTsKKyAgICBl
bmRZID0gc3RhYmxlUm91bmQoZmVuZFkpOworCisgICAgc3RhcnRYICs9IGNlbnRlclg7CisgICAg
c3RhcnRZID0gY2VudGVyWSAtIHN0YXJ0WTsKKyAgICBlbmRYICs9IGNlbnRlclg7CisgICAgZW5k
WSA9IGNlbnRlclkgLSBlbmRZOworICAgIFJFQ1QgY2xpcFJlY3Q7CisgICAgaWYgKHN0YXJ0WCA8
IGVuZFgpIHsKKyAgICAgICAgY2xpcFJlY3QubGVmdCA9IHN0YXJ0WDsKKyAgICAgICAgY2xpcFJl
Y3QucmlnaHQgPSBlbmRYOworICAgIH0gZWxzZSB7CisgICAgICAgIGNsaXBSZWN0LmxlZnQgPSBl
bmRYOworICAgICAgICBjbGlwUmVjdC5yaWdodCA9IHN0YXJ0WDsKKyAgICB9CisgICAgaWYgKHN0
YXJ0WSA8IGVuZFkpIHsKKyAgICAgICAgY2xpcFJlY3QudG9wID0gc3RhcnRZOworICAgICAgICBj
bGlwUmVjdC5ib3R0b20gPSBlbmRZOworICAgIH0gZWxzZSB7CisgICAgICAgIGNsaXBSZWN0LnRv
cCA9IGVuZFk7CisgICAgICAgIGNsaXBSZWN0LmJvdHRvbSA9IHN0YXJ0WTsKKyAgICB9CisKKyAg
ICBPd25QdHI8SFJHTj4gY2xpcFJnbihDcmVhdGVSZWN0UmduKDAsIDAsIDAsIDApKTsKKyAgICBi
b29sIG5ld0NsaXA7CisgICAgaWYgKEdldENsaXBSZ24oZGMsIGNsaXBSZ24uZ2V0KCkpIDw9IDAp
IHsKKyAgICAgICAgbmV3Q2xpcCA9IHRydWU7CisgICAgICAgIGNsaXBSZ24uc2V0KENyZWF0ZVJl
Y3RSZ24oY2xpcFJlY3QubGVmdCwgY2xpcFJlY3QudG9wLCBjbGlwUmVjdC5yaWdodCwgY2xpcFJl
Y3QuYm90dG9tKSk7CisgICAgICAgIFNlbGVjdENsaXBSZ24oZGMsIGNsaXBSZ24uZ2V0KCkpOwor
ICAgIH0gZWxzZSB7CisgICAgICAgIG5ld0NsaXAgPSBmYWxzZTsKKyAgICAgICAgSW50ZXJzZWN0
Q2xpcFJlY3QoZGMsIGNsaXBSZWN0LmxlZnQsIGNsaXBSZWN0LnRvcCwgY2xpcFJlY3QucmlnaHQs
IGNsaXBSZWN0LmJvdHRvbSk7CisgICAgfQorCisgICAgSEdESU9CSiBvbGRCcnVzaCA9IFNlbGVj
dE9iamVjdChkYywgR2V0U3RvY2tPYmplY3QoTlVMTF9CUlVTSCkpOworICAgIEVsbGlwc2UoZGMs
IHRyUmVjdC54KCksIHRyUmVjdC55KCksIHRyUmVjdC5yaWdodCgpLCB0clJlY3QuYm90dG9tKCkp
OworICAgIFNlbGVjdE9iamVjdChkYywgb2xkQnJ1c2gpOworCisgICAgaWYgKG5ld0NsaXApCisg
ICAgICAgIFNlbGVjdENsaXBSZ24oZGMsIDApOworICAgIGVsc2UKKyAgICAgICAgU2VsZWN0Q2xp
cFJnbihkYywgY2xpcFJnbi5nZXQoKSk7CisKKyAgICBTZWxlY3RPYmplY3QoZGMsIG9sZFBlbik7
CisgICAgRGVsZXRlT2JqZWN0KHBlbik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3
Q29udmV4UG9seWdvbihzaXplX3QgbnBvaW50cywgY29uc3QgRmxvYXRQb2ludCogcG9pbnRzLCBi
b29sIHNob3VsZEFudGlhbGlhcykKK3sKKyAgICBpZiAoIW1fZGF0YS0+bV9vcGFjaXR5IHx8IHBh
aW50aW5nRGlzYWJsZWQoKSB8fCBucG9pbnRzIDw9IDEgfHwgIXBvaW50cykKKyAgICAgICAgcmV0
dXJuOworCisgICAgU2NvcGVEQ1Byb3ZpZGVyIGRjUHJvdmlkZXIobV9kYXRhKTsKKyAgICBpZiAo
IW1fZGF0YS0+bV9kYykKKyAgICAgICAgcmV0dXJuOworCisgICAgVmVjdG9yPFBPSU5ULCAyMD4g
d2luUG9pbnRzKG5wb2ludHMpOworICAgIEZsb2F0UG9pbnQgdHJQb2ludCA9IG1fZGF0YS0+bWFw
UG9pbnQocG9pbnRzWzBdKTsKKyAgICB3aW5Qb2ludHNbMF0ueCA9IHN0YWJsZVJvdW5kKHRyUG9p
bnQueCgpKTsKKyAgICB3aW5Qb2ludHNbMF0ueSA9IHN0YWJsZVJvdW5kKHRyUG9pbnQueSgpKTsK
KyAgICBSRUNUIHJlY3QgPSB7IHdpblBvaW50c1swXS54LCB3aW5Qb2ludHNbMF0ueSwgd2luUG9p
bnRzWzBdLngsIHdpblBvaW50c1swXS55IH07CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBu
cG9pbnRzOyArK2kpIHsKKyAgICAgICAgdHJQb2ludCA9IG1fZGF0YS0+bWFwUG9pbnQocG9pbnRz
W2ldKTsKKyAgICAgICAgd2luUG9pbnRzW2ldLnggPSBzdGFibGVSb3VuZCh0clBvaW50LngoKSk7
CisgICAgICAgIHdpblBvaW50c1tpXS55ID0gc3RhYmxlUm91bmQodHJQb2ludC55KCkpOworICAg
ICAgICBpZiAocmVjdC5sZWZ0ID4gd2luUG9pbnRzW2ldLngpCisgICAgICAgICAgICByZWN0Lmxl
ZnQgPSB3aW5Qb2ludHNbaV0ueDsKKyAgICAgICAgZWxzZSBpZiAocmVjdC5yaWdodCA8IHdpblBv
aW50c1tpXS54KQorICAgICAgICAgICAgcmVjdC5yaWdodCA9IHdpblBvaW50c1tpXS54OworICAg
ICAgICBpZiAocmVjdC50b3AgPiB3aW5Qb2ludHNbaV0ueSkKKyAgICAgICAgICAgIHJlY3QudG9w
ID0gd2luUG9pbnRzW2ldLnk7CisgICAgICAgIGVsc2UgaWYgKHJlY3QuYm90dG9tIDwgd2luUG9p
bnRzW2ldLnkpCisgICAgICAgICAgICByZWN0LmJvdHRvbSA9IHdpblBvaW50c1tpXS55OworICAg
IH0KKyAgICByZWN0LmJvdHRvbSArPSAxOworICAgIHJlY3QucmlnaHQgKz0gMTsKKworICAgIElu
dFJlY3QgaW50UmVjdChyZWN0KTsKKyAgICBUcmFuc3BhcmVudExheWVyREMgdHJhbnNwYXJlbnRE
QyhtX2RhdGEsIGludFJlY3QpOworICAgIEhEQyBkYyA9IHRyYW5zcGFyZW50REMuaGRjKCk7Cisg
ICAgaWYgKCFkYykKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBucG9pbnRzOyArK2kpIHsKKyAgICAgICAgd2luUG9pbnRzW2ldLnggKz0gdHJhbnNwYXJlbnRE
Qy50b1NoaWZ0KCkud2lkdGgoKTsKKyAgICAgICAgd2luUG9pbnRzW2ldLnkgKz0gdHJhbnNwYXJl
bnREQy50b1NoaWZ0KCkuaGVpZ2h0KCk7CisgICAgfQorCisgICAgSEdESU9CSiBicnVzaCA9IDA7
CisgICAgSEdESU9CSiBvbGRCcnVzaDsKKyAgICBpZiAoZmlsbENvbG9yKCkuYWxwaGEoKSkgewor
ICAgICAgICBicnVzaCA9IGNyZWF0ZUJydXNoKGZpbGxDb2xvcigpKTsKKyAgICAgICAgb2xkQnJ1
c2ggPSBTZWxlY3RPYmplY3QoZGMsIGJydXNoKTsKKyAgICB9IGVsc2UKKyAgICAgICAgU2VsZWN0
T2JqZWN0KGRjLCBHZXRTdG9ja09iamVjdChOVUxMX0JSVVNIKSk7CisKKyAgICBIR0RJT0JKIHBl
biA9IDA7CisgICAgSEdESU9CSiBvbGRQZW47CisgICAgaWYgKHN0cm9rZVN0eWxlKCkgIT0gTm9T
dHJva2UpIHsKKyAgICAgICAgcGVuID0gY3JlYXRlUGVuKHN0cm9rZUNvbG9yKCksIHN0cm9rZVRo
aWNrbmVzcygpLCBzdHJva2VTdHlsZSgpKTsKKyAgICAgICAgb2xkUGVuID0gU2VsZWN0T2JqZWN0
KGRjLCBwZW4pOworICAgIH0gZWxzZQorICAgICAgICBTZWxlY3RPYmplY3QoZGMsIEdldFN0b2Nr
T2JqZWN0KE5VTExfUEVOKSk7CisKKyAgICBpZiAoIWJydXNoICYmICFwZW4pCisgICAgICAgIHJl
dHVybjsKKworICAgIFBvbHlnb24oZGMsIHdpblBvaW50cy5kYXRhKCksIG5wb2ludHMpOworCisg
ICAgaWYgKHBlbikgeworICAgICAgICBTZWxlY3RPYmplY3QoZGMsIG9sZFBlbik7CisgICAgICAg
IERlbGV0ZU9iamVjdChwZW4pOworICAgIH0KKworICAgIGlmIChicnVzaCkgeworICAgICAgICBT
ZWxlY3RPYmplY3QoZGMsIG9sZEJydXNoKTsKKyAgICAgICAgRGVsZXRlT2JqZWN0KGJydXNoKTsK
KyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpmaWxsUmVjdChjb25zdCBGbG9hdFJl
Y3QmIHJlY3QsIGNvbnN0IENvbG9yJiBjb2xvciwgQ29sb3JTcGFjZSBjb2xvclNwYWNlKQorewor
ICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkgfHwgIW1fZGF0YS0+bV9vcGFjaXR5KQorICAgICAg
ICByZXR1cm47CisKKyAgICBpbnQgYWxwaGEgPSBjb2xvci5hbHBoYSgpOworICAgIGlmICghYWxw
aGEpCisgICAgICAgIHJldHVybjsKKworICAgIFNjb3BlRENQcm92aWRlciBkY1Byb3ZpZGVyKG1f
ZGF0YSk7CisgICAgaWYgKCFtX2RhdGEtPm1fZGMpCisgICAgICAgIHJldHVybjsKKworICAgIElu
dFJlY3QgaW50UmVjdCA9IGVuY2xvc2luZ0ludFJlY3QocmVjdCk7CisgICAgVHJhbnNwYXJlbnRM
YXllckRDIHRyYW5zcGFyZW50REMobV9kYXRhLCBtX2RhdGEtPm1hcFJlY3QoaW50UmVjdCksICZp
bnRSZWN0LCBhbHBoYSk7CisKKyAgICBpZiAoIXRyYW5zcGFyZW50REMuaGRjKCkpCisgICAgICAg
IHJldHVybjsKKworICAgIE93blB0cjxIQlJVU0g+IGhicnVzaChDcmVhdGVTb2xpZEJydXNoKFJH
Qihjb2xvci5yZWQoKSwgY29sb3IuZ3JlZW4oKSwgY29sb3IuYmx1ZSgpKSkpOworICAgIEZpbGxS
ZWN0KHRyYW5zcGFyZW50REMuaGRjKCksICZ0cmFuc3BhcmVudERDLnJlY3QoKSwgaGJydXNoLmdl
dCgpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXAoY29uc3QgRmxvYXRSZWN0JiBy
ZWN0KQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIGlmICghbV9kYXRhLT5tX2RjKQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRSZWN0IHRy
UmVjdCA9IGVuY2xvc2luZ0ludFJlY3QobV9kYXRhLT5tYXBSZWN0KHJlY3QpKTsKKworICAgIE93
blB0cjxIUkdOPiBjbGlwUmduKENyZWF0ZVJlY3RSZ24oMCwgMCwgMCwgMCkpOworICAgIGlmIChH
ZXRDbGlwUmduKG1fZGF0YS0+bV9kYywgY2xpcFJnbi5nZXQoKSkgPiAwKQorICAgICAgICBJbnRl
cnNlY3RDbGlwUmVjdChtX2RhdGEtPm1fZGMsIHRyUmVjdC54KCksIHRyUmVjdC55KCksIHRyUmVj
dC5yaWdodCgpLCB0clJlY3QuYm90dG9tKCkpOworICAgIGVsc2UgeworICAgICAgICBjbGlwUmdu
LnNldChDcmVhdGVSZWN0UmduKHRyUmVjdC54KCksIHRyUmVjdC55KCksIHRyUmVjdC5yaWdodCgp
LCB0clJlY3QuYm90dG9tKCkpKTsKKyAgICAgICAgU2VsZWN0Q2xpcFJnbihtX2RhdGEtPm1fZGMs
IGNsaXBSZ24uZ2V0KCkpOworICAgIH0KK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBP
dXQoY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIW1fZGF0YS0+bV9kYykKKyAgICAgICAgcmV0dXJu
OworCisgICAgSW50UmVjdCB0clJlY3QgPSBtX2RhdGEtPm1hcFJlY3QocmVjdCk7CisKKyAgICBF
eGNsdWRlQ2xpcFJlY3QobV9kYXRhLT5tX2RjLCB0clJlY3QueCgpLCB0clJlY3QueSgpLCB0clJl
Y3QucmlnaHQoKSwgdHJSZWN0LmJvdHRvbSgpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6
OmRyYXdGb2N1c1JpbmcoY29uc3QgVmVjdG9yPFBhdGg+JiBwYXRocywgaW50IHdpZHRoLCBpbnQg
b2Zmc2V0LCBjb25zdCBDb2xvciYgY29sb3IpCit7CisgICAgLy8gRklYTUU6IGltcGxlbWVudAor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0ZvY3VzUmluZyhjb25zdCBWZWN0b3I8SW50
UmVjdD4mIHJlY3RzLCBpbnQgd2lkdGgsIGludCBvZmZzZXQsIGNvbnN0IENvbG9yJiBjb2xvcikK
K3sKKyAgICBpZiAoIW1fZGF0YS0+bV9vcGFjaXR5IHx8IHBhaW50aW5nRGlzYWJsZWQoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgU2NvcGVEQ1Byb3ZpZGVyIGRjUHJvdmlkZXIobV9kYXRhKTsK
KyAgICBpZiAoIW1fZGF0YS0+bV9kYykKKyAgICAgICAgcmV0dXJuOworCisgICAgaW50IHJhZGl1
cyA9ICh3aWR0aCAtIDEpIC8gMjsKKyAgICBvZmZzZXQgKz0gcmFkaXVzOworCisgICAgdW5zaWdu
ZWQgcmVjdENvdW50ID0gcmVjdHMuc2l6ZSgpOworICAgIEludFJlY3QgZmluYWxGb2N1c1JlY3Q7
CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlY3RDb3VudDsgaSsrKSB7CisgICAgICAg
IEludFJlY3QgZm9jdXNSZWN0ID0gcmVjdHNbaV07CisgICAgICAgIGZvY3VzUmVjdC5pbmZsYXRl
KG9mZnNldCk7CisgICAgICAgIGZpbmFsRm9jdXNSZWN0LnVuaXRlKGZvY3VzUmVjdCk7CisgICAg
fQorCisgICAgSW50UmVjdCBpbnRSZWN0ID0gZmluYWxGb2N1c1JlY3Q7CisgICAgSW50UmVjdCB0
clJlY3QgPSBtX2RhdGEtPm1hcFJlY3QoZmluYWxGb2N1c1JlY3QpOworICAgIFRyYW5zcGFyZW50
TGF5ZXJEQyB0cmFuc3BhcmVudERDKG1fZGF0YSwgdHJSZWN0LCAmaW50UmVjdCk7CisgICAgSERD
IGRjID0gdHJhbnNwYXJlbnREQy5oZGMoKTsKKyAgICBpZiAoIWRjKQorICAgICAgICByZXR1cm47
CisgICAgdHJSZWN0Lm1vdmUodHJhbnNwYXJlbnREQy50b1NoaWZ0KCkpOworCisgICAgUkVDVCBy
ZWN0ID0gdHJSZWN0OworICAgIERyYXdGb2N1c1JlY3QoZGMsICZyZWN0KTsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yVGV4dChjb25zdCBJbnRQb2ludCYgb3JpZ2luLCBp
bnQgd2lkdGgsIGJvb2wgcHJpbnRpbmcpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgU3Ryb2tlU3R5bGUgb2xkU3R5bGUgPSBzdHJva2VTdHls
ZSgpOworICAgIHNldFN0cm9rZVN0eWxlKFNvbGlkU3Ryb2tlKTsKKyAgICBkcmF3TGluZShvcmln
aW4sIG9yaWdpbiArIEludFNpemUod2lkdGgsIDApKTsKKyAgICBzZXRTdHJva2VTdHlsZShvbGRT
dHlsZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvck1pc3NwZWxsaW5n
T3JCYWRHcmFtbWFyKGNvbnN0IEludFBvaW50JiwgaW50IHdpZHRoLCBib29sIGdyYW1tYXIpCit7
CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBs
YXRmb3JtRmlsbENvbG9yKGNvbnN0IENvbG9yJiBjb2wsIENvbG9yU3BhY2UgY29sb3JTcGFjZSkK
K3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0
UGxhdGZvcm1TdHJva2VDb2xvcihjb25zdCBDb2xvciYgY29sLCBDb2xvclNwYWNlIGNvbG9yU3Bh
Y2UpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6
OnNldFBsYXRmb3JtU3Ryb2tlVGhpY2tuZXNzKGZsb2F0IHN0cm9rZVRoaWNrbmVzcykKK3sKKyAg
ICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0VVJMRm9y
UmVjdChjb25zdCBLVVJMJiBsaW5rLCBjb25zdCBJbnRSZWN0JiBkZXN0UmVjdCkKK3sKKyAgICBu
b3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6YWRkSW5uZXJSb3Vu
ZGVkUmVjdENsaXAoY29uc3QgSW50UmVjdCYgcmVjdCwgaW50IHRoaWNrbmVzcykKK3sKKyAgICAv
LyBXZSBjYW4gb25seSBjbGlwIHJlY3RhbmdsZXMgb24gV0lOQ0UKKyAgICBjbGlwKHJlY3QpOwor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xlYXJSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVj
dCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBpZiAobV9kYXRhLT5oYXNBbHBoYSgpKSB7CisgICAgICAgIEludFJlY3QgdHJSZWN0ID0gZW5j
bG9zaW5nSW50UmVjdChtX2RhdGEtPm1hcFJlY3QocmVjdCkpOworICAgICAgICBtX2RhdGEtPm1f
Yml0bWFwLT5jbGVhclBpeGVscyh0clJlY3QpOworICAgICAgICByZXR1cm47CisgICAgfSAKKwor
ICAgIGZpbGxSZWN0KHJlY3QsIENvbG9yKENvbG9yOjp3aGl0ZSksIERldmljZUNvbG9yU3BhY2Up
OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c3Ryb2tlUmVjdChjb25zdCBGbG9hdFJlY3Qm
IHJlY3QsIGZsb2F0IHdpZHRoKQoreworICAgIGlmICghbV9kYXRhLT5tX29wYWNpdHkgfHwgcGFp
bnRpbmdEaXNhYmxlZCgpIHx8IHN0cm9rZVN0eWxlKCkgPT0gTm9TdHJva2UpCisgICAgICAgIHJl
dHVybjsKKworICAgIFNjb3BlRENQcm92aWRlciBkY1Byb3ZpZGVyKG1fZGF0YSk7CisgICAgaWYg
KCFtX2RhdGEtPm1fZGMpCisgICAgICAgIHJldHVybjsKKworICAgIEludFJlY3QgaW50UmVjdCA9
IGVuY2xvc2luZ0ludFJlY3QocmVjdCk7CisgICAgSW50UmVjdCB0clJlY3QgPSBtX2RhdGEtPm1h
cFJlY3QoaW50UmVjdCk7CisgICAgVHJhbnNwYXJlbnRMYXllckRDIHRyYW5zcGFyZW50REMobV9k
YXRhLCB0clJlY3QsICZpbnRSZWN0KTsKKyAgICBIREMgZGMgPSB0cmFuc3BhcmVudERDLmhkYygp
OworICAgIGlmICghZGMpCisgICAgICAgIHJldHVybjsKKyAgICB0clJlY3QubW92ZSh0cmFuc3Bh
cmVudERDLnRvU2hpZnQoKSk7CisKKyAgICBIR0RJT0JKIHBlbiA9IGNyZWF0ZVBlbihzdHJva2VD
b2xvcigpLCBzdHJva2VUaGlja25lc3MoKSwgc3Ryb2tlU3R5bGUoKSk7CisgICAgSEdESU9CSiBv
bGRQZW4gPSBTZWxlY3RPYmplY3QoZGMsIHBlbik7CisKKyAgICBpbnQgcmlnaHQgPSB0clJlY3Qu
cmlnaHQoKSAtIDE7CisgICAgaW50IGJvdHRvbSA9IHRyUmVjdC5ib3R0b20oKSAtIDE7CisgICAg
Y29uc3QgUE9JTlQgaW50UG9pbnRzWzVdID0KKyAgICB7CisgICAgICAgIHsgdHJSZWN0LngoKSwg
dHJSZWN0LnkoKSB9LAorICAgICAgICB7IHJpZ2h0LCB0clJlY3QueSgpIH0sCisgICAgICAgIHsg
cmlnaHQsIGJvdHRvbSB9LAorICAgICAgICB7IHRyUmVjdC54KCksIGJvdHRvbSB9LAorICAgICAg
ICB7IHRyUmVjdC54KCksIHRyUmVjdC55KCkgfQorICAgIH07CisKKyAgICBQb2x5bGluZShkYywg
aW50UG9pbnRzLCA1KTsKKworICAgIFNlbGVjdE9iamVjdChkYywgb2xkUGVuKTsKKyAgICBEZWxl
dGVPYmplY3QocGVuKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmJlZ2luVHJhbnNwYXJl
bmN5TGF5ZXIoZmxvYXQgb3BhY2l0eSkKK3sKKyAgICBtX2RhdGEtPnNhdmUoKTsKKyAgICBtX2Rh
dGEtPm1fb3BhY2l0eSAqPSBvcGFjaXR5OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZW5k
VHJhbnNwYXJlbmN5TGF5ZXIoKQoreworICAgIG1fZGF0YS0+cmVzdG9yZSgpOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dDo6Y29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdHJhbnNm
b3JtKQoreworICAgIG1fZGF0YS0+Y29uY2F0Q1RNKHRyYW5zZm9ybSk7Cit9CisKK1RyYW5zZm9y
bWF0aW9uTWF0cml4JiBHcmFwaGljc0NvbnRleHQ6OmFmZmluZVRyYW5zZm9ybSgpCit7CisgICAg
cmV0dXJuIG1fZGF0YS0+bV90cmFuc2Zvcm07Cit9CisKK2NvbnN0IFRyYW5zZm9ybWF0aW9uTWF0
cml4JiBHcmFwaGljc0NvbnRleHQ6OmFmZmluZVRyYW5zZm9ybSgpIGNvbnN0Cit7CisgICAgcmV0
dXJuIG1fZGF0YS0+bV90cmFuc2Zvcm07Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpyZXNl
dEFmZmluZVRyYW5zZm9ybSgpCit7CisgICAgbV9kYXRhLT5tX3RyYW5zZm9ybS5tYWtlSWRlbnRp
dHkoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnRyYW5zbGF0ZShmbG9hdCB4LCBmbG9h
dCB5KQoreworICAgIG1fZGF0YS0+dHJhbnNsYXRlKHgsIHkpOworfQorCit2b2lkIEdyYXBoaWNz
Q29udGV4dDo6cm90YXRlKGZsb2F0IHJhZGlhbnMpCit7CisgICAgbV9kYXRhLT5yb3RhdGUocmFk
aWFucyk7Cit9CisKK0ludFBvaW50IEdyYXBoaWNzQ29udGV4dDo6b3JpZ2luKCkKK3sKKyAgICBy
ZXR1cm4gbV9kYXRhLT5vcmlnaW4oKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNjYWxl
KGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sKKyAgICBtX2RhdGEtPnNjYWxlKHNpemUpOworfQor
Cit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0TGluZUNhcChMaW5lQ2FwIGxpbmVDYXApCit7Cisg
ICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldExpbmVK
b2luKExpbmVKb2luIGxpbmVKb2luKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0OjpzZXRNaXRlckxpbWl0KGZsb2F0IG1pdGVyKQoreworICAgIG5v
dEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRBbHBoYShmbG9h
dCBhbHBoYSkKK3sKKyAgICBtX2RhdGEtPm1fb3BhY2l0eSA9IGFscGhhOworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDo6c2V0Q29tcG9zaXRlT3BlcmF0aW9uKENvbXBvc2l0ZU9wZXJhdG9yIG9w
KQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpi
ZWdpblBhdGgoKQoreworICAgIG1fZGF0YS0+bV9wYXRocy5jbGVhcigpOworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDo6YWRkUGF0aChjb25zdCBQYXRoJiBwYXRoKQoreworICAgIG1fZGF0YS0+
bV9wYXRocy5hcHBlbmQocGF0aCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwKGNv
bnN0IFBhdGgmIHBhdGgpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHQ6OmNhbnZhc0NsaXAoY29uc3QgUGF0aCYgcGF0aCkKK3sKKyAgICBjbGlwKHBh
dGgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcE91dChjb25zdCBQYXRoJikKK3sK
KyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcE91
dEVsbGlwc2VJblJlY3QoY29uc3QgSW50UmVjdCYpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsK
K30KKworc3RhdGljIGlubGluZSBJbnRQb2ludCByZWN0Q2VudGVyUG9pbnQoY29uc3QgUkVDVCYg
cmVjdCkKK3sKKyAgICByZXR1cm4gSW50UG9pbnQocmVjdC5sZWZ0ICsgKHJlY3QucmlnaHQgLSBy
ZWN0LmxlZnQpIC8gMiwgcmVjdC50b3AgKyAocmVjdC5ib3R0b20gLSByZWN0LnRvcCkgLyAyKTsK
K30KK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpmaWxsUm91bmRlZFJlY3QoY29uc3QgSW50UmVjdCYg
ZmlsbFJlY3QsIGNvbnN0IEludFNpemUmIHRvcExlZnQsIGNvbnN0IEludFNpemUmIHRvcFJpZ2h0
LCBjb25zdCBJbnRTaXplJiBib3R0b21MZWZ0LCBjb25zdCBJbnRTaXplJiBib3R0b21SaWdodCwg
Y29uc3QgQ29sb3ImIGMsIENvbG9yU3BhY2UgY29sb3JTcGFjZSkKK3sKKyAgICBTY29wZURDUHJv
dmlkZXIgZGNQcm92aWRlcihtX2RhdGEpOworICAgIGlmICghbV9kYXRhLT5tX2RjKQorICAgICAg
ICByZXR1cm47CisKKyAgICBJbnRTaXplIHNoYWRvd1NpemU7CisgICAgaW50IHNoYWRvd0JsdXIg
PSAwOworICAgIENvbG9yIHNoYWRvd0NvbG9yOworICAgICAgICAKKyAgICBnZXRTaGFkb3coc2hh
ZG93U2l6ZSwgc2hhZG93Qmx1ciwgc2hhZG93Q29sb3IpOworICAgIAorICAgIEludFJlY3QgZHN0
UmVjdCA9IGZpbGxSZWN0OworICAgIAorICAgIGRzdFJlY3QubW92ZShzaGFkb3dTaXplKTsKKyAg
ICBkc3RSZWN0LmluZmxhdGUoc2hhZG93Qmx1cik7CisgICAgZHN0UmVjdCA9IG1fZGF0YS0+bWFw
UmVjdChkc3RSZWN0KTsKKyAgCisgICAgRmxvYXRTaXplIG5ld1RvcExlZnQobV9kYXRhLT5tYXBT
aXplKHRvcExlZnQpKTsKKyAgICBGbG9hdFNpemUgbmV3VG9wUmlnaHQobV9kYXRhLT5tYXBTaXpl
KHRvcFJpZ2h0KSk7CisgICAgRmxvYXRTaXplIG5ld0JvdHRvbUxlZnQobV9kYXRhLT5tYXBTaXpl
KGJvdHRvbUxlZnQpKTsKKyAgICBGbG9hdFNpemUgbmV3Qm90dG9tUmlnaHQobV9kYXRhLT5tYXBT
aXplKGJvdHRvbVJpZ2h0KSk7CisKKyAgICBUcmFuc3BhcmVudExheWVyREMgdHJhbnNwYXJlbnRE
YyhtX2RhdGEsIGRzdFJlY3QsICZmaWxsUmVjdCk7CisgICAgSERDIGRjID0gdHJhbnNwYXJlbnRE
Yy5oZGMoKTsKKyAgICBpZiAoIWRjKQorICAgICAgICByZXR1cm47CisKKyAgICBkc3RSZWN0Lm1v
dmUodHJhbnNwYXJlbnREYy50b1NoaWZ0KCkpOworCisgICAgUkVDVCByZWN0V2luID0gZHN0UmVj
dDsKKworICAgIEhHRElPQkogYnJ1c2ggPSBjcmVhdGVCcnVzaChzaGFkb3dDb2xvcik7CisgICAg
SEdESU9CSiBvbGRCcnVzaCA9IFNlbGVjdE9iamVjdChkYywgYnJ1c2gpOworICAgCisgICAgU2Vs
ZWN0T2JqZWN0KGRjLCBHZXRTdG9ja09iamVjdChOVUxMX1BFTikpOworCisgICAgSW50UG9pbnQg
Y2VudGVyUG9pbnQgPSByZWN0Q2VudGVyUG9pbnQocmVjdFdpbik7CisgICAgLy8gRHJhdyB0b3Ag
bGVmdCBoYWxmCisgICAgUkVDVCBjbGlwUmVjdChyZWN0V2luKTsKKyAgICBjbGlwUmVjdC5yaWdo
dCA9IGNlbnRlclBvaW50LngoKTsKKyAgICBjbGlwUmVjdC5ib3R0b20gPSBjZW50ZXJQb2ludC55
KCk7CisKKyAgICBPd25QdHI8SFJHTj4gY2xpcFJnbihDcmVhdGVSZWN0UmduKDAsIDAsIDAsIDAp
KTsKKyAgICBib29sIG5lZWRzTmV3Q2xpcCA9IChHZXRDbGlwUmduKGRjLCBjbGlwUmduLmdldCgp
KSA8PSAwKTsKKyAgICAKKyAgICBkcmF3Um91bmRDb3JuZXIobmVlZHNOZXdDbGlwLCBjbGlwUmVj
dCwgcmVjdFdpbiwgZGMsIHN0YWJsZVJvdW5kKG5ld1RvcExlZnQud2lkdGgoKSAqIDIpLCBzdGFi
bGVSb3VuZChuZXdUb3BMZWZ0LmhlaWdodCgpICogMikpOworCisgICAgLy8gRHJhdyB0b3Agcmln
aHQKKyAgICBjbGlwUmVjdCA9IHJlY3RXaW47CisgICAgY2xpcFJlY3QubGVmdCA9IGNlbnRlclBv
aW50LngoKTsKKyAgICBjbGlwUmVjdC5ib3R0b20gPSBjZW50ZXJQb2ludC55KCk7CisKKyAgICBk
cmF3Um91bmRDb3JuZXIobmVlZHNOZXdDbGlwLCBjbGlwUmVjdCwgcmVjdFdpbiwgZGMsIHN0YWJs
ZVJvdW5kKG5ld1RvcFJpZ2h0LndpZHRoKCkgKiAyKSwgc3RhYmxlUm91bmQobmV3VG9wUmlnaHQu
aGVpZ2h0KCkgKiAyKSk7CisKKyAgICAgLy8gRHJhdyBib3R0b20gbGVmdAorICAgIGNsaXBSZWN0
ID0gcmVjdFdpbjsKKyAgICBjbGlwUmVjdC5yaWdodCA9IGNlbnRlclBvaW50LngoKTsKKyAgICBj
bGlwUmVjdC50b3AgPSBjZW50ZXJQb2ludC55KCk7CisKKyAgICBkcmF3Um91bmRDb3JuZXIobmVl
ZHNOZXdDbGlwLCBjbGlwUmVjdCwgcmVjdFdpbiwgZGMsIHN0YWJsZVJvdW5kKG5ld0JvdHRvbUxl
ZnQud2lkdGgoKSAqIDIpLCBzdGFibGVSb3VuZChuZXdCb3R0b21MZWZ0LmhlaWdodCgpICogMikp
OworCisgICAgLy8gRHJhdyBib3R0b20gcmlnaHQKKyAgICBjbGlwUmVjdCA9IHJlY3RXaW47Cisg
ICAgY2xpcFJlY3QubGVmdCA9IGNlbnRlclBvaW50LngoKTsKKyAgICBjbGlwUmVjdC50b3AgPSBj
ZW50ZXJQb2ludC55KCk7CisKKyAgICBkcmF3Um91bmRDb3JuZXIobmVlZHNOZXdDbGlwLCBjbGlw
UmVjdCwgcmVjdFdpbiwgZGMsIHN0YWJsZVJvdW5kKG5ld0JvdHRvbVJpZ2h0LndpZHRoKCkgKiAy
KSwgc3RhYmxlUm91bmQobmV3Qm90dG9tUmlnaHQuaGVpZ2h0KCkgKiAyKSk7CisKKyAgICBTZWxl
Y3RPYmplY3QoZGMsIG9sZEJydXNoKTsKKyAgICBEZWxldGVPYmplY3QoYnJ1c2gpOworfQorCisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3Um91bmRDb3JuZXIoYm9vbCBuZWVkc05ld0NsaXAs
IFJFQ1QgY2xpcFJlY3QsIFJFQ1QgcmVjdFdpbiwgSERDIGRjLCBpbnQgd2lkdGgsIGludCBoZWln
aHQpCit7CisgICAgaWYgKCFkYykKKyAgICAgICAgcmV0dXJuOworCisgICAgT3duUHRyPEhSR04+
IGNsaXBSZ24oQ3JlYXRlUmVjdFJnbigwLCAwLCAwLCAwKSk7CisgICAgaWYgKG5lZWRzTmV3Q2xp
cCkgIHsKKyAgICAgICAgY2xpcFJnbi5zZXQoQ3JlYXRlUmVjdFJnbihjbGlwUmVjdC5sZWZ0LCBj
bGlwUmVjdC50b3AsIGNsaXBSZWN0LnJpZ2h0LCBjbGlwUmVjdC5ib3R0b20pKTsKKyAgICAgICAg
U2VsZWN0Q2xpcFJnbihkYywgY2xpcFJnbi5nZXQoKSk7CisgICAgfSBlbHNlIAorICAgICAgICBJ
bnRlcnNlY3RDbGlwUmVjdChkYywgY2xpcFJlY3QubGVmdCwgY2xpcFJlY3QudG9wLCBjbGlwUmVj
dC5yaWdodCwgY2xpcFJlY3QuYm90dG9tKTsKKyAgICAKKyAgICA6OlJvdW5kUmVjdChkYywgcmVj
dFdpbi5sZWZ0ICwgcmVjdFdpbi50b3AgLCByZWN0V2luLnJpZ2h0ICwgcmVjdFdpbi5ib3R0b20g
LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAKKyAgICBTZWxlY3RDbGlwUmduKGRjLCBuZWVkc05ld0Ns
aXAgPyAwIDogY2xpcFJnbi5nZXQoKSk7Cit9CisKKworRmxvYXRSZWN0IEdyYXBoaWNzQ29udGV4
dDo6cm91bmRUb0RldmljZVBpeGVscyhjb25zdCBGbG9hdFJlY3QmIGZyZWN0KQoreworICAgIG5v
dEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIGZyZWN0OworfQorCitDb2xvciBncmFkaWVudEF2
ZXJhZ2VDb2xvcihjb25zdCBHcmFkaWVudCogZ3JhZGllbnQpCit7CisgICAgY29uc3QgVmVjdG9y
PEdyYWRpZW50OjpDb2xvclN0b3A+JiBzdG9wcyA9IGdyYWRpZW50LT5nZXRTdG9wcygpOworICAg
IGlmIChzdG9wcy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBDb2xvcigpOworCisgICAgY29u
c3QgR3JhZGllbnQ6OkNvbG9yU3RvcCYgc3RvcCA9IHN0b3BzLmZpcnN0KCk7CisgICAgaWYgKHN0
b3BzLnNpemUoKSA9PSAxKQorICAgICAgICByZXR1cm4gQ29sb3Ioc3RvcC5yZWQsIHN0b3AuZ3Jl
ZW4sIHN0b3AuYmx1ZSwgc3RvcC5hbHBoYSk7CisKKyAgICBjb25zdCBHcmFkaWVudDo6Q29sb3JT
dG9wJiBsYXN0U3RvcCA9IHN0b3BzLmxhc3QoKTsKKyAgICByZXR1cm4gQ29sb3IoKHN0b3AucmVk
ICsgbGFzdFN0b3AucmVkKSAqIDAuNWYKKyAgICAgICAgLCAoc3RvcC5ncmVlbiArIGxhc3RTdG9w
LmdyZWVuKSAqIDAuNWYKKyAgICAgICAgLCAoc3RvcC5ibHVlICsgbGFzdFN0b3AuYmx1ZSkgKiAw
LjVmCisgICAgICAgICwgKHN0b3AuYWxwaGEgKyBsYXN0U3RvcC5hbHBoYSkgKiAwLjVmKTsKK30K
Kwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxQYXRoKCkKK3sKKyAgICBDb2xvciBjID0gbV9j
b21tb24tPnN0YXRlLmZpbGxHcmFkaWVudAorICAgICAgICA/IGdyYWRpZW50QXZlcmFnZUNvbG9y
KG1fY29tbW9uLT5zdGF0ZS5maWxsR3JhZGllbnQuZ2V0KCkpCisgICAgICAgIDogZmlsbENvbG9y
KCk7CisKKyAgICBpZiAoIWMuYWxwaGEoKSB8fCAhbV9kYXRhLT5tX29wYWNpdHkpCisgICAgICAg
IHJldHVybjsKKworICAgIFNjb3BlRENQcm92aWRlciBkY1Byb3ZpZGVyKG1fZGF0YSk7CisgICAg
aWYgKCFtX2RhdGEtPm1fZGMpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChtX2RhdGEtPm1f
b3BhY2l0eSA8IDEuMGYgfHwgbV9kYXRhLT5oYXNBbHBoYSgpKSB7CisgICAgICAgIEhHRElPQkog
YnJ1c2ggPSBjcmVhdGVCcnVzaChjKTsKKyAgICAgICAgZm9yIChWZWN0b3I8UGF0aD46OmNvbnN0
X2l0ZXJhdG9yIGkgPSBtX2RhdGEtPm1fcGF0aHMuYmVnaW4oKTsgaSAhPSBtX2RhdGEtPm1fcGF0
aHMuZW5kKCk7ICsraSkgeworICAgICAgICAgICAgSW50UmVjdCB0clJlY3QgPSBlbmNsb3NpbmdJ
bnRSZWN0KG1fZGF0YS0+bWFwUmVjdChpLT5ib3VuZGluZ1JlY3QoKSkpOworICAgICAgICAgICAg
dHJSZWN0LmluZmxhdGUoMSk7CisgICAgICAgICAgICBUcmFuc3BhcmVudExheWVyREMgdHJhbnNw
YXJlbnREQyhtX2RhdGEsIHRyUmVjdCk7CisgICAgICAgICAgICBIREMgZGMgPSB0cmFuc3BhcmVu
dERDLmhkYygpOworICAgICAgICAgICAgaWYgKCFkYykKKyAgICAgICAgICAgICAgICBjb250aW51
ZTsKKworICAgICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHRyID0gbV9kYXRhLT5tX3RyYW5zZm9y
bTsKKyAgICAgICAgICAgIHRyLnRyYW5zbGF0ZSh0cmFuc3BhcmVudERDLnRvU2hpZnQoKS53aWR0
aCgpLCB0cmFuc3BhcmVudERDLnRvU2hpZnQoKS5oZWlnaHQoKSk7CisKKyAgICAgICAgICAgIFNl
bGVjdE9iamVjdChkYywgR2V0U3RvY2tPYmplY3QoTlVMTF9QRU4pKTsKKyAgICAgICAgICAgIEhH
RElPQkogb2xkQnJ1c2ggPSBTZWxlY3RPYmplY3QoZGMsIGJydXNoKTsKKyAgICAgICAgICAgIGkt
PnBsYXRmb3JtUGF0aCgpLT5maWxsUGF0aChkYywgJnRyKTsKKyAgICAgICAgICAgIFNlbGVjdE9i
amVjdChkYywgb2xkQnJ1c2gpOworICAgICAgICB9CisgICAgICAgIERlbGV0ZU9iamVjdChicnVz
aCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgU2VsZWN0T2JqZWN0KG1fZGF0YS0+bV9kYywgR2V0
U3RvY2tPYmplY3QoTlVMTF9QRU4pKTsKKyAgICAgICAgSEdESU9CSiBicnVzaCA9IGNyZWF0ZUJy
dXNoKGMpOworICAgICAgICBIR0RJT0JKIG9sZEJydXNoID0gU2VsZWN0T2JqZWN0KG1fZGF0YS0+
bV9kYywgYnJ1c2gpOworICAgICAgICBmb3IgKFZlY3RvcjxQYXRoPjo6Y29uc3RfaXRlcmF0b3Ig
aSA9IG1fZGF0YS0+bV9wYXRocy5iZWdpbigpOyBpICE9IG1fZGF0YS0+bV9wYXRocy5lbmQoKTsg
KytpKQorICAgICAgICAgICAgaS0+cGxhdGZvcm1QYXRoKCktPmZpbGxQYXRoKG1fZGF0YS0+bV9k
YywgJm1fZGF0YS0+bV90cmFuc2Zvcm0pOworICAgICAgICBTZWxlY3RPYmplY3QobV9kYXRhLT5t
X2RjLCBvbGRCcnVzaCk7CisgICAgICAgIERlbGV0ZU9iamVjdChicnVzaCk7CisgICAgfQorfQor
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzdHJva2VQYXRoKCkKK3sKKyAgICBpZiAoIW1fZGF0
YS0+bV9vcGFjaXR5KQorICAgICAgICByZXR1cm47CisKKyAgICBTY29wZURDUHJvdmlkZXIgZGNQ
cm92aWRlcihtX2RhdGEpOworICAgIGlmICghbV9kYXRhLT5tX2RjKQorICAgICAgICByZXR1cm47
CisKKyAgICBpZiAobV9kYXRhLT5tX29wYWNpdHkgPCAxLjBmIHx8IG1fZGF0YS0+aGFzQWxwaGEo
KSkgeworICAgICAgICBIR0RJT0JKIHBlbiA9IGNyZWF0ZVBlbihzdHJva2VDb2xvcigpLCBzdHJv
a2VUaGlja25lc3MoKSwgc3Ryb2tlU3R5bGUoKSk7CisgICAgICAgIGZvciAoVmVjdG9yPFBhdGg+
Ojpjb25zdF9pdGVyYXRvciBpID0gbV9kYXRhLT5tX3BhdGhzLmJlZ2luKCk7IGkgIT0gbV9kYXRh
LT5tX3BhdGhzLmVuZCgpOyArK2kpIHsKKyAgICAgICAgICAgIEludFJlY3QgdHJSZWN0ID0gZW5j
bG9zaW5nSW50UmVjdChtX2RhdGEtPm1hcFJlY3QoaS0+Ym91bmRpbmdSZWN0KCkpKTsKKyAgICAg
ICAgICAgIHRyUmVjdC5pbmZsYXRlKDEpOworICAgICAgICAgICAgVHJhbnNwYXJlbnRMYXllckRD
IHRyYW5zcGFyZW50REMobV9kYXRhLCB0clJlY3QpOworICAgICAgICAgICAgSERDIGRjID0gdHJh
bnNwYXJlbnREQy5oZGMoKTsKKyAgICAgICAgICAgIGlmICghZGMpCisgICAgICAgICAgICAgICAg
Y29udGludWU7CisKKyAgICAgICAgICAgIEFmZmluZVRyYW5zZm9ybSB0ciA9IG1fZGF0YS0+bV90
cmFuc2Zvcm07CisgICAgICAgICAgICB0ci50cmFuc2xhdGUodHJhbnNwYXJlbnREQy50b1NoaWZ0
KCkud2lkdGgoKSwgdHJhbnNwYXJlbnREQy50b1NoaWZ0KCkuaGVpZ2h0KCkpOworCisgICAgICAg
ICAgICBTZWxlY3RPYmplY3QoZGMsIEdldFN0b2NrT2JqZWN0KE5VTExfQlJVU0gpKTsKKyAgICAg
ICAgICAgIEhHRElPQkogb2xkUGVuID0gU2VsZWN0T2JqZWN0KGRjLCBwZW4pOworICAgICAgICAg
ICAgaS0+cGxhdGZvcm1QYXRoKCktPnN0cm9rZVBhdGgoZGMsICZ0cik7CisgICAgICAgICAgICBT
ZWxlY3RPYmplY3QoZGMsIG9sZFBlbik7CisgICAgICAgIH0KKyAgICAgICAgRGVsZXRlT2JqZWN0
KHBlbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgU2VsZWN0T2JqZWN0KG1fZGF0YS0+bV9kYywg
R2V0U3RvY2tPYmplY3QoTlVMTF9CUlVTSCkpOworICAgICAgICBIR0RJT0JKIHBlbiA9IGNyZWF0
ZVBlbihzdHJva2VDb2xvcigpLCBzdHJva2VUaGlja25lc3MoKSwgc3Ryb2tlU3R5bGUoKSk7Cisg
ICAgICAgIEhHRElPQkogb2xkUGVuID0gU2VsZWN0T2JqZWN0KG1fZGF0YS0+bV9kYywgcGVuKTsK
KyAgICAgICAgZm9yIChWZWN0b3I8UGF0aD46OmNvbnN0X2l0ZXJhdG9yIGkgPSBtX2RhdGEtPm1f
cGF0aHMuYmVnaW4oKTsgaSAhPSBtX2RhdGEtPm1fcGF0aHMuZW5kKCk7ICsraSkKKyAgICAgICAg
ICAgIGktPnBsYXRmb3JtUGF0aCgpLT5zdHJva2VQYXRoKG1fZGF0YS0+bV9kYywgJm1fZGF0YS0+
bV90cmFuc2Zvcm0pOworICAgICAgICBTZWxlY3RPYmplY3QobV9kYXRhLT5tX2RjLCBvbGRQZW4p
OworICAgICAgICBEZWxldGVPYmplY3QocGVuKTsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0OjpmaWxsUmVjdChjb25zdCBGbG9hdFJlY3QmIHIsIGNvbnN0IEdyYWRpZW50KiBncmFk
aWVudCkKK3sKKyAgICBpZiAoIW1fZGF0YS0+bV9vcGFjaXR5KQorICAgICAgICByZXR1cm47CisK
KyAgICBjb25zdCBWZWN0b3I8R3JhZGllbnQ6OkNvbG9yU3RvcD4mIHN0b3BzID0gZ3JhZGllbnQt
PmdldFN0b3BzKCk7CisgICAgaWYgKHN0b3BzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgc2l6ZV90IG51bVN0b3BzID0gc3RvcHMuc2l6ZSgpOworICAgIGlmIChudW1TdG9wcyA9
PSAxKSB7CisgICAgICAgIGNvbnN0IEdyYWRpZW50OjpDb2xvclN0b3AmIHN0b3AgPSBzdG9wcy5m
aXJzdCgpOworICAgICAgICBDb2xvciBjb2xvcihzdG9wLnJlZCwgc3RvcC5ncmVlbiwgc3RvcC5i
bHVlLCBzdG9wLmFscGhhKTsKKyAgICAgICAgZmlsbFJlY3QociwgY29sb3IsIERldmljZUNvbG9y
U3BhY2UpOworICAgICAgICByZXR1cm47CisgICAgfSAKKyAgICAKKyAgICBTY29wZURDUHJvdmlk
ZXIgZGNQcm92aWRlcihtX2RhdGEpOworICAgIGlmICghbV9kYXRhLT5tX2RjKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBJbnRSZWN0IGludFJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KHIpOworICAg
IEludFJlY3QgcmVjdCA9IG1fZGF0YS0+bWFwUmVjdChpbnRSZWN0KTsKKyAgICBUcmFuc3BhcmVu
dExheWVyREMgdHJhbnNwYXJlbnREQyhtX2RhdGEsIHJlY3QsICZpbnRSZWN0LCAyNTUsIHRydWUp
OworICAgIEhEQyBkYyA9IHRyYW5zcGFyZW50REMuaGRjKCk7CisgICAgaWYgKCFkYykKKyAgICAg
ICAgcmV0dXJuOworCisgICAgcmVjdC5tb3ZlKHRyYW5zcGFyZW50REMudG9TaGlmdCgpKTsKKyAg
ICBGbG9hdFBvaW50IGZwMCA9IG1fZGF0YS0+bWFwUG9pbnQoZ3JhZGllbnQtPnAwKCkpOworICAg
IEZsb2F0UG9pbnQgZnAxID0gbV9kYXRhLT5tYXBQb2ludChncmFkaWVudC0+cDEoKSk7CisgICAg
SW50UG9pbnQgcDAoc3RhYmxlUm91bmQoZnAwLngoKSksIHN0YWJsZVJvdW5kKGZwMC55KCkpKTsK
KyAgICBJbnRQb2ludCBwMShzdGFibGVSb3VuZChmcDEueCgpKSwgc3RhYmxlUm91bmQoZnAxLnko
KSkpOworICAgIHAwICs9IHRyYW5zcGFyZW50REMudG9TaGlmdCgpOworICAgIHAxICs9IHRyYW5z
cGFyZW50REMudG9TaGlmdCgpOworCisgICAgaWYgKGdyYWRpZW50LT5pc1JhZGlhbCgpKSB7Cisg
ICAgICAgIGlmIChnX3JhZGlhbEdyYWRpZW50RmlsbGVyKSB7CisgICAgICAgICAgICAvLyBGSVhN
RTogZG9uJ3Qgc3VwcG9ydCAyRCBzY2FsaW5nIGF0IHRoaXMgdGltZQorICAgICAgICAgICAgZG91
YmxlIHNjYWxlID0gKG1fZGF0YS0+bV90cmFuc2Zvcm0uYSgpICsgbV9kYXRhLT5tX3RyYW5zZm9y
bS5kKCkpICogMC41OworICAgICAgICAgICAgZmxvYXQgcjAgPSBncmFkaWVudC0+cjAoKSAqIHNj
YWxlOworICAgICAgICAgICAgZmxvYXQgcjEgPSBncmFkaWVudC0+cjEoKSAqIHNjYWxlOworICAg
ICAgICAgICAgZ19yYWRpYWxHcmFkaWVudEZpbGxlcihkYywgcmVjdCwgcDAsIHAxLCByMCwgcjEs
IGdyYWRpZW50LT5nZXRTdG9wcygpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQor
ICAgIH0gZWxzZSBpZiAoZ19saW5lYXJHcmFkaWVudEZpbGxlcikgeworICAgICAgICBnX2xpbmVh
ckdyYWRpZW50RmlsbGVyKGRjLCByZWN0LCBwMCwgcDEsIGdyYWRpZW50LT5nZXRTdG9wcygpKTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFNpbXBsZSAxRCBsaW5lYXIgc29sdXRp
b24gdGhhdCBhc3N1bWVzIHAwIGlzIG9uIHRoZSB0b3Agb3IgbGVmdCBzaWRlLCBhbmQgcDEgaXMg
b24gdGhlIHJpZ2h0IG9yIGJvdHRvbSBzaWRlCisgICAgc2l6ZV90IG51bVJlY3RzID0gKG51bVN0
b3BzIC0gMSk7CisgICAgVmVjdG9yPFRSSVZFUlRFWCwgMjA+IHR2OworICAgIHR2LnJlc2l6ZShu
dW1SZWN0cyAqIDIpOworICAgIFZlY3RvcjxHUkFESUVOVF9SRUNULCAxMD4gbWVzaDsKKyAgICBt
ZXNoLnJlc2l6ZShudW1SZWN0cyk7CisgICAgaW50IHggPSByZWN0LngoKTsKKyAgICBpbnQgeSA9
IHJlY3QueSgpOworICAgIGludCB3aWR0aCA9IHJlY3Qud2lkdGgoKTsKKyAgICBpbnQgaGVpZ2h0
ID0gcmVjdC5oZWlnaHQoKTsKKyAgICBGbG9hdFNpemUgZCA9IGdyYWRpZW50LT5wMSgpIC0gZ3Jh
ZGllbnQtPnAwKCk7CisgICAgYm9vbCB2ZXJ0aWNhbCA9IGFicyhkLmhlaWdodCgpKSA+IGFicyhk
LndpZHRoKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3RvcHM7ICsraSkgewor
ICAgICAgICBjb25zdCBHcmFkaWVudDo6Q29sb3JTdG9wJiBzdG9wID0gc3RvcHNbaV07CisgICAg
ICAgIGludCBpVHYgPSBpID8gMiAqIGkgLSAxIDogMDsKKyAgICAgICAgdHZbaVR2XS5SZWQgPSBz
dG9wLnJlZCAqIDB4RkZGRjsKKyAgICAgICAgdHZbaVR2XS5HcmVlbiA9IHN0b3AuZ3JlZW4gKiAw
eEZGRkY7CisgICAgICAgIHR2W2lUdl0uQmx1ZSA9IHN0b3AuYmx1ZSAqIDB4RkZGRjsKKyAgICAg
ICAgdHZbaVR2XS5BbHBoYSA9IHN0b3AuYWxwaGEgKiAweEZGRkY7CisgICAgICAgIGlmIChpKSB7
CisgICAgICAgICAgICB0dltpVHZdLnggPSB2ZXJ0aWNhbCA/IHggKyB3aWR0aDogeCArIHdpZHRo
ICogc3RvcC5zdG9wOworICAgICAgICAgICAgdHZbaVR2XS55ID0gdmVydGljYWwgPyB5ICsgaGVp
Z2h0ICogc3RvcC5zdG9wIDogeSArIGhlaWdodDsKKyAgICAgICAgICAgIG1lc2hbaSAtIDFdLlVw
cGVyTGVmdCA9IGlUdiAtIDE7CisgICAgICAgICAgICBtZXNoW2kgLSAxXS5Mb3dlclJpZ2h0ID0g
aVR2OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHZbaVR2XS54ID0geDsKKyAgICAg
ICAgICAgIHR2W2lUdl0ueSA9IHk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaSAmJiBpIDwg
bnVtUmVjdHMpIHsKKyAgICAgICAgICAgIHR2W2lUdiArIDFdID0gdHZbaVR2XTsKKyAgICAgICAg
ICAgIGlmICh2ZXJ0aWNhbCkKKyAgICAgICAgICAgICAgICB0dltpVHYgKyAxXS54ID0geDsKKyAg
ICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0dltpVHYgKyAxXS55ID0geTsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIEdyYWRpZW50RmlsbChkYywgdHYuZGF0YSgpLCB0di5zaXplKCks
IG1lc2guZGF0YSgpLCBtZXNoLnNpemUoKSwgdmVydGljYWwgPyBHUkFESUVOVF9GSUxMX1JFQ1Rf
ViA6IEdSQURJRU5UX0ZJTExfUkVDVF9IKTsKK30KKworQWZmaW5lVHJhbnNmb3JtIEdyYXBoaWNz
Q29udGV4dDo6Z2V0Q1RNKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9kYXRhLT5tX3RyYW5zZm9y
bTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBUb0ltYWdlQnVmZmVyKGNvbnN0IEZs
b2F0UmVjdCYsIGNvbnN0IEltYWdlQnVmZmVyKikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOwor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0
KQoreworICAgIGlmIChtX2NvbW1vbi0+c3RhdGUuZmlsbEdyYWRpZW50KQorICAgICAgICBmaWxs
UmVjdChyZWN0LCBtX2NvbW1vbi0+c3RhdGUuZmlsbEdyYWRpZW50LmdldCgpKTsKKyAgICBlbHNl
CisgICAgICAgIGZpbGxSZWN0KHJlY3QsIGZpbGxDb2xvcigpLCBEZXZpY2VDb2xvclNwYWNlKTsK
K30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtU2hhZG93KGNvbnN0IEludFNp
emUmLCBpbnQsIGNvbnN0IENvbG9yJiwgQ29sb3JTcGFjZSkKK3sKKyAgICBub3RJbXBsZW1lbnRl
ZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xlYXJQbGF0Zm9ybVNoYWRvdygpCit7
CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldElt
YWdlSW50ZXJwb2xhdGlvblF1YWxpdHkoSW50ZXJwb2xhdGlvblF1YWxpdHkpCit7CisgICAgbm90
SW1wbGVtZW50ZWQoKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzQ2hhclZpc2libGUoVUNo
YXIgYykKK3sKKyAgICByZXR1cm4gYyAmJiBjICE9IHplcm9XaWR0aFNwYWNlOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dDo6ZHJhd1RleHQoY29uc3QgRm9udCYgZm9udCwgY29uc3QgVGV4dFJ1
biYgcnVuLCBjb25zdCBJbnRQb2ludCYgcG9pbnQsIGludCBmcm9tLCBpbnQgdG8pCit7CisgICAg
aWYgKHBhaW50aW5nRGlzYWJsZWQoKSB8fCAhZmlsbENvbG9yKCkuYWxwaGEoKSB8fCAhbV9kYXRh
LT5tX29wYWNpdHkpCisgICAgICAgIHJldHVybjsKKworICAgIGJvb2wgbXVzdFN1cHBvcnRBbHBo
YSA9IG1fZGF0YS0+aGFzQWxwaGEoKTsKKworICAgIGlmICghbXVzdFN1cHBvcnRBbHBoYSAmJiBm
aWxsQ29sb3IoKS5hbHBoYSgpID09IDB4RkYgJiYgbV9kYXRhLT5tX29wYWNpdHkgPj0gMS4wKSB7
CisgICAgICAgIGZvbnQuZHJhd1RleHQodGhpcywgcnVuLCBwb2ludCwgZnJvbSwgdG8pOworICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgZmxvYXQgb2xkT3BhY2l0eSA9IG1fZGF0YS0+bV9v
cGFjaXR5OworICAgIG1fZGF0YS0+bV9vcGFjaXR5ICo9IGZpbGxDb2xvcigpLmFscGhhKCkgLyAy
NTUuMDsKKworICAgIEZsb2F0UmVjdCB0ZXh0UmVjdCA9IGZvbnQuc2VsZWN0aW9uUmVjdEZvclRl
eHQocnVuLCBwb2ludCwgZm9udC5oZWlnaHQoKSwgZnJvbSwgdG8pOworICAgIHRleHRSZWN0LnNl
dFkodGV4dFJlY3QueSgpIC0gZm9udC5hc2NlbnQoKSk7CisgICAgSW50UmVjdCB0clJlY3QgPSBl
bmNsb3NpbmdJbnRSZWN0KG1fZGF0YS0+bWFwUmVjdCh0ZXh0UmVjdCkpOworICAgIFJFQ1QgYm1w
UmVjdDsKKyAgICBBbHBoYVBhaW50VHlwZSBhbHBoYVBhaW50VHlwZSA9IG11c3RTdXBwb3J0QWxw
aGEgPyBBbHBoYVBhaW50T3RoZXIgOiBBbHBoYVBhaW50Tm9uZTsKKyAgICBpZiAoUmVmUHRyPFNo
YXJlZEJpdG1hcD4gYm1wID0gbV9kYXRhLT5nZXRUcmFuc3BhcmVudExheWVyQml0bWFwKHRyUmVj
dCwgYWxwaGFQYWludFR5cGUsIGJtcFJlY3QsIHRydWUsIG11c3RTdXBwb3J0QWxwaGEpKSB7Cisg
ICAgICAgIHsKKyAgICAgICAgICAgIEdyYXBoaWNzQ29udGV4dCBnYygwKTsKKyAgICAgICAgICAg
IGdjLnNldEJpdG1hcChibXApOworICAgICAgICAgICAgZ2Muc2NhbGUoRmxvYXRTaXplKG1fZGF0
YS0+bV90cmFuc2Zvcm0uYSgpLCBtX2RhdGEtPm1fdHJhbnNmb3JtLmQoKSkpOworICAgICAgICAg
ICAgZm9udC5kcmF3VGV4dCgmZ2MsIHJ1biwgSW50UG9pbnQoMCwgZm9udC5hc2NlbnQoKSksIGZy
b20sIHRvKTsKKyAgICAgICAgfQorICAgICAgICB1bnNpZ25lZCBrZXkxLCBrZXkyOworICAgICAg
ICBIREMgbWVtREMgPSBibXAtPmdldERDKCZrZXkxLCAma2V5Mik7CisgICAgICAgIGlmIChtZW1E
QykgeworICAgICAgICAgICAgbV9kYXRhLT5wYWludEJhY2tUcmFuc3BhcmVudExheWVyQml0bWFw
KG1lbURDLCBibXAuZ2V0KCksIHRyUmVjdCwgYWxwaGFQYWludFR5cGUsIGJtcFJlY3QpOworICAg
ICAgICAgICAgYm1wLT5yZWxlYXNlREMobWVtREMsIGtleTEsIGtleTIpOworICAgICAgICB9Cisg
ICAgfQorCisgICAgbV9kYXRhLT5tX29wYWNpdHkgPSBvbGRPcGFjaXR5OworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDo6ZHJhd1RleHQoY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnREYXRhLCBj
b25zdCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgaW50
IGZyb20sIGludCBudW1HbHlwaHMsIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KQoreworICAgIGlm
ICghbV9kYXRhLT5tX29wYWNpdHkpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAoOzspIHsK
KyAgICAgICAgaWYgKCFudW1HbHlwaHMpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlm
IChpc0NoYXJWaXNpYmxlKCpnbHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSkpKQorICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICsrZnJvbTsKKyAgICAgICAgLS1udW1HbHlwaHM7CisgICAgfQorCisg
ICAgZG91YmxlIHNjYWxlWCA9IG1fZGF0YS0+bV90cmFuc2Zvcm0uYSgpOworICAgIGRvdWJsZSBz
Y2FsZVkgPSBtX2RhdGEtPm1fdHJhbnNmb3JtLmQoKTsKKworICAgIGludCBoZWlnaHQgPSBmb250
RGF0YS0+cGxhdGZvcm1EYXRhKCkuc2l6ZSgpICogc2NhbGVZOworICAgIGludCB3aWR0aCA9IGZv
bnREYXRhLT5wbGF0Zm9ybURhdGEoKS5hdmVyYWdlQ2hhcldpZHRoKCkgKiBzY2FsZVg7CisKKyAg
ICBpZiAoIWhlaWdodCB8fCAhd2lkdGgpCisgICAgICAgIHJldHVybjsKKworICAgIFNjb3BlRENQ
cm92aWRlciBkY1Byb3ZpZGVyKG1fZGF0YSk7CisgICAgaWYgKCFtX2RhdGEtPm1fZGMpCisgICAg
ICAgIHJldHVybjsKKworICAgIEhGT05UIGhGb250ID0gaGVpZ2h0ID4gMQorICAgICAgICA/IGZv
bnREYXRhLT5wbGF0Zm9ybURhdGEoKS5nZXRTY2FsZWRGb250SGFuZGxlKGhlaWdodCwgc2NhbGVY
ID09IHNjYWxlWSA/IDAgOiB3aWR0aCkKKyAgICAgICAgOiAwOworCisgICAgRmxvYXRQb2ludCBz
dGFydFBvaW50KHBvaW50LngoKSwgcG9pbnQueSgpIC0gZm9udERhdGEtPmFzY2VudCgpKTsKKyAg
ICBGbG9hdFBvaW50IHRyUG9pbnQgPSBtX2RhdGEtPm1hcFBvaW50KHN0YXJ0UG9pbnQpOworICAg
IGludCB5ID0gc3RhYmxlUm91bmQodHJQb2ludC55KCkpOworCisgICAgQ29sb3IgY29sb3IgPSBm
aWxsQ29sb3IoKTsKKyAgICBpZiAoIWNvbG9yLmFscGhhKCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIENPTE9SUkVGIGZvbnRDb2xvciA9IFJHQihjb2xvci5yZWQoKSwgY29sb3IuZ3JlZW4oKSwg
Y29sb3IuYmx1ZSgpKTsKKworICAgIGlmICghaEZvbnQpIHsKKyAgICAgICAgZG91YmxlIG9mZnNl
dCA9IHRyUG9pbnQueCgpOworICAgICAgICBjb25zdCBHbHlwaEJ1ZmZlckFkdmFuY2UqIGFkdmFu
Y2UgPSBnbHlwaEJ1ZmZlci5hZHZhbmNlcyhmcm9tKTsKKyAgICAgICAgaWYgKHNjYWxlWCA9PSAx
LikKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbnVtR2x5cGhzOyArK2kpCisgICAg
ICAgICAgICAgICAgb2Zmc2V0ICs9ICphZHZhbmNlKys7CisgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbnVtR2x5cGhzOyArK2kpCisgICAgICAgICAgICAgICAg
b2Zmc2V0ICs9ICphZHZhbmNlKysgKiBzY2FsZVg7CisKKyAgICAgICAgb2Zmc2V0ICs9IHdpZHRo
OworCisgICAgICAgIE93blB0cjxIUEVOPiBoUGVuKENyZWF0ZVBlbihQU19EQVNILCAxLCBmb250
Q29sb3IpKTsKKyAgICAgICAgSEdESU9CSiBvbGRQZW4gPSBTZWxlY3RPYmplY3QobV9kYXRhLT5t
X2RjLCBoUGVuLmdldCgpKTsKKworICAgICAgICBNb3ZlVG9FeChtX2RhdGEtPm1fZGMsIHN0YWJs
ZVJvdW5kKHRyUG9pbnQueCgpKSwgeSwgMCk7CisgICAgICAgIExpbmVUbyhtX2RhdGEtPm1fZGMs
IHN0YWJsZVJvdW5kKG9mZnNldCksIHkpOworCisgICAgICAgIFNlbGVjdE9iamVjdChtX2RhdGEt
Pm1fZGMsIG9sZFBlbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBJbnRTaXplIHNo
YWRvd1NpemU7CisgICAgaW50IHNoYWRvd0JsdXIgPSAwOworICAgIENvbG9yIHNoYWRvd0NvbG9y
OworICAgIGJvb2wgaGFzU2hhZG93ID0gdGV4dERyYXdpbmdNb2RlKCkgPT0gY1RleHRGaWxsCisg
ICAgICAgICYmIGdldFNoYWRvdyhzaGFkb3dTaXplLCBzaGFkb3dCbHVyLCBzaGFkb3dDb2xvcikK
KyAgICAgICAgJiYgc2hhZG93Q29sb3IuYWxwaGEoKTsKKyAgICBDT0xPUlJFRiBzaGFkb3dSR0JD
b2xvcjsKKyAgICBGbG9hdFBvaW50IHRyU2hhZG93UG9pbnQ7CisgICAgaWYgKGhhc1NoYWRvdykg
eworICAgICAgICBzaGFkb3dSR0JDb2xvciA9IFJHQihzaGFkb3dDb2xvci5yZWQoKSwgc2hhZG93
Q29sb3IuZ3JlZW4oKSwgc2hhZG93Q29sb3IuYmx1ZSgpKTsKKyAgICAgICAgdHJTaGFkb3dQb2lu
dCA9IG1fZGF0YS0+bWFwUG9pbnQoc3RhcnRQb2ludCArIHNoYWRvd1NpemUpOworICAgIH0KKwor
ICAgIEhHRElPQkogaE9sZEZvbnQgPSBTZWxlY3RPYmplY3QobV9kYXRhLT5tX2RjLCBoRm9udCk7
CisgICAgQ09MT1JSRUYgb2xkVGV4dENvbG9yID0gR2V0VGV4dENvbG9yKG1fZGF0YS0+bV9kYyk7
CisgICAgaW50IG9sZFRleHRBbGlnbiA9IEdldFRleHRBbGlnbihtX2RhdGEtPm1fZGMpOworICAg
IFNldFRleHRBbGlnbihtX2RhdGEtPm1fZGMsIDApOworCisgICAgaW50IG9sZEJrTW9kZSA9IEdl
dEJrTW9kZShtX2RhdGEtPm1fZGMpOworICAgIFNldEJrTW9kZShtX2RhdGEtPm1fZGMsIFRSQU5T
UEFSRU5UKTsKKworICAgIGlmIChudW1HbHlwaHMgPiAxKSB7CisgICAgICAgIGRvdWJsZSBvZmZz
ZXQgPSB0clBvaW50LngoKTsKKyAgICAgICAgVmVjdG9yPGludCwgMjU2PiBnbHlwaFNwYWNlKG51
bUdseXBocyk7CisgICAgICAgIFZlY3RvcjxVQ2hhciwgMjU2PiB0ZXh0KG51bUdseXBocyk7Cisg
ICAgICAgIGludCogY3VyU3BhY2UgPSBnbHlwaFNwYWNlLmRhdGEoKTsKKyAgICAgICAgVUNoYXIq
IGN1ckNoYXIgPSB0ZXh0LmRhdGEoKTsKKyAgICAgICAgY29uc3QgVUNoYXIqIHNyY0NoYXIgPSBn
bHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSk7CisgICAgICAgIGNvbnN0IFVDaGFyKiBjb25zdCBzcmND
aGFyRW5kID0gc3JjQ2hhciArIG51bUdseXBoczsKKyAgICAgICAgKmN1ckNoYXIrKyA9ICpzcmND
aGFyKys7CisgICAgICAgIGludCBmaXJzdE9mZnNldCA9IHN0YWJsZVJvdW5kKG9mZnNldCk7Cisg
ICAgICAgIGludCBsYXN0T2Zmc2V0ID0gZmlyc3RPZmZzZXQ7CisgICAgICAgIGNvbnN0IEdseXBo
QnVmZmVyQWR2YW5jZSogYWR2YW5jZSA9IGdseXBoQnVmZmVyLmFkdmFuY2VzKGZyb20pOworICAg
ICAgICAvLyBGSVhNRTogRXh0VGV4dE91dCgpIGNhbiBmbGlwIG92ZXIgZWFjaCB3b3JkIGZvciBS
VEwgbGFuZ3VhZ2VzLCBldmVuIHdoZW4gVEFfUlRMUkVBRElORyBpcyBvZmYuCisgICAgICAgIC8v
ICh0aGlzIGNhbiBiZSBHREkgYnVnIG9yIGZvbnQgZHJpdmVyIGJ1Zz8pCisgICAgICAgIC8vIFdl
IGFyZSBub3QgY2xlYXIgaG93IGl0IHByb2Nlc3NlcyBjaGFyYWN0ZXJzIGFuZCBoYW5kbGVzIHNw
ZWNpZmllZCBzcGFjZXMuIE9uIHRoZSBvdGhlciBzaWRlLAorICAgICAgICAvLyBvdXIgZ2x5cGgg
YnVmZmVyIGlzIGFscmVhZHkgaW4gdGhlIGNvcnJlY3Qgb3JkZXIgZm9yIHJlbmRlcmluZy4gU28s
IHRoZSBzb2x1dGlvbiBpcyB0aGF0IHdlCisgICAgICAgIC8vIGNhbGwgRXh0VGV4dE91dCgpIGZv
ciBlYWNoIHNpbmdsZSBjaGFyYWN0ZXIgd2hlbiB0aGUgdGV4dCBjb250YWlucyBhbnkgUlRMIGNo
YXJhY3Rlci4KKyAgICAgICAgLy8gVGhpcyBzb2x1dGlvbiBpcyBub3QgcGVyZmVjdCBhcyBpdCBp
cyBzbG93ZXIgdGhhbiBjYWxsaW5nIEV4dFRleHRPdXQoKSBvbmUgdGltZSBmb3IgYWxsIGNoYXJh
Y3RlcnMuCisgICAgICAgIC8vIERyYXdpbmcgY2hhcmFjdGVycyBvbmUgYnkgb25lIG1heSBiZSB0
b28gc2xvdy4KKyAgICAgICAgYm9vbCBkcmF3T25lQnlPbmUgPSBmYWxzZTsKKyAgICAgICAgaWYg
KHNjYWxlWCA9PSAxLikgeworICAgICAgICAgICAgZm9yICg7IHNyY0NoYXIgPCBzcmNDaGFyRW5k
OyArK3NyY0NoYXIpIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gKmFkdmFuY2UrKzsKKyAg
ICAgICAgICAgICAgICBpbnQgb2Zmc2V0SW50ID0gc3RhYmxlUm91bmQob2Zmc2V0KTsKKyAgICAg
ICAgICAgICAgICBpZiAoaXNDaGFyVmlzaWJsZSgqc3JjQ2hhcikpIHsKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKCFkcmF3T25lQnlPbmUgJiYgV1RGOjpVbmljb2RlOjpkaXJlY3Rpb24oKnNyY0No
YXIpID09IFdURjo6VW5pY29kZTo6UmlnaHRUb0xlZnQpCisgICAgICAgICAgICAgICAgICAgICAg
ICBkcmF3T25lQnlPbmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAqY3VyQ2hhcisrID0g
KnNyY0NoYXI7CisgICAgICAgICAgICAgICAgICAgICpjdXJTcGFjZSsrID0gb2Zmc2V0SW50IC0g
bGFzdE9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgbGFzdE9mZnNldCA9IG9mZnNldEludDsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgICBmb3IgKDsgc3JjQ2hhciA8IHNyY0NoYXJFbmQ7ICsrc3JjQ2hhcikgeworICAgICAg
ICAgICAgICAgIG9mZnNldCArPSAqYWR2YW5jZSsrICogc2NhbGVYOworICAgICAgICAgICAgICAg
IGludCBvZmZzZXRJbnQgPSBzdGFibGVSb3VuZChvZmZzZXQpOworICAgICAgICAgICAgICAgIGlm
IChpc0NoYXJWaXNpYmxlKCpzcmNDaGFyKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWRy
YXdPbmVCeU9uZSAmJiBXVEY6OlVuaWNvZGU6OmRpcmVjdGlvbigqc3JjQ2hhcikgPT0gV1RGOjpV
bmljb2RlOjpSaWdodFRvTGVmdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdPbmVCeU9u
ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICpjdXJDaGFyKysgPSAqc3JjQ2hhcjsKKyAg
ICAgICAgICAgICAgICAgICAgKmN1clNwYWNlKysgPSBvZmZzZXRJbnQgLSBsYXN0T2Zmc2V0Owor
ICAgICAgICAgICAgICAgICAgICBsYXN0T2Zmc2V0ID0gb2Zmc2V0SW50OworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBudW1HbHlwaHMgPSBjdXJD
aGFyIC0gdGV4dC5kYXRhKCk7CisgICAgICAgIGlmIChoYXNTaGFkb3cpIHsKKyAgICAgICAgICAg
IFNldFRleHRDb2xvcihtX2RhdGEtPm1fZGMsIHNoYWRvd1JHQkNvbG9yKTsKKyAgICAgICAgICAg
IGlmIChkcmF3T25lQnlPbmUpIHsKKyAgICAgICAgICAgICAgICBpbnQgeFNoYWRvdyA9IGZpcnN0
T2Zmc2V0ICsgc3RhYmxlUm91bmQodHJTaGFkb3dQb2ludC54KCkgLSB0clBvaW50LngoKSk7Cisg
ICAgICAgICAgICAgICAgaW50IHlTaGFkb3cgPSBzdGFibGVSb3VuZCh0clNoYWRvd1BvaW50Lnko
KSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1HbHlwaHM7ICsraSkg
eworICAgICAgICAgICAgICAgICAgICBFeHRUZXh0T3V0KG1fZGF0YS0+bV9kYywgeFNoYWRvdywg
eVNoYWRvdywgMCwgTlVMTCwgdGV4dC5kYXRhKCkgKyBpLCAxLCAwKTsKKyAgICAgICAgICAgICAg
ICAgICAgeFNoYWRvdyArPSBnbHlwaFNwYWNlW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIEV4dFRleHRPdXQobV9kYXRhLT5tX2RjLCBm
aXJzdE9mZnNldCArIHN0YWJsZVJvdW5kKHRyU2hhZG93UG9pbnQueCgpIC0gdHJQb2ludC54KCkp
LCBzdGFibGVSb3VuZCh0clNoYWRvd1BvaW50LnkoKSksIDAsIE5VTEwsIHRleHQuZGF0YSgpLCBu
dW1HbHlwaHMsIGdseXBoU3BhY2UuZGF0YSgpKTsKKyAgICAgICAgfQorICAgICAgICBTZXRUZXh0
Q29sb3IobV9kYXRhLT5tX2RjLCBmb250Q29sb3IpOworICAgICAgICBpZiAoZHJhd09uZUJ5T25l
KSB7CisgICAgICAgICAgICBpbnQgeCA9IGZpcnN0T2Zmc2V0OworICAgICAgICAgICAgZm9yIChp
bnQgaSA9IDA7IGkgPCBudW1HbHlwaHM7ICsraSkgeworICAgICAgICAgICAgICAgIEV4dFRleHRP
dXQobV9kYXRhLT5tX2RjLCB4LCB5LCAwLCBOVUxMLCB0ZXh0LmRhdGEoKSArIGksIDEsIDApOwor
ICAgICAgICAgICAgICAgIHggKz0gZ2x5cGhTcGFjZVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfSBlbHNlCisgICAgICAgICAgICBFeHRUZXh0T3V0KG1fZGF0YS0+bV9kYywgZmlyc3RPZmZz
ZXQsIHksIDAsIE5VTEwsIHRleHQuZGF0YSgpLCBudW1HbHlwaHMsIGdseXBoU3BhY2UuZGF0YSgp
KTsKKyAgICB9IGVsc2UgeworICAgICAgICBVQ2hhciBjID0gKmdseXBoQnVmZmVyLmdseXBocyhm
cm9tKTsKKyAgICAgICAgaWYgKGhhc1NoYWRvdykgeworICAgICAgICAgICAgU2V0VGV4dENvbG9y
KG1fZGF0YS0+bV9kYywgc2hhZG93UkdCQ29sb3IpOworICAgICAgICAgICAgRXh0VGV4dE91dCht
X2RhdGEtPm1fZGMsIHN0YWJsZVJvdW5kKHRyU2hhZG93UG9pbnQueCgpKSwgc3RhYmxlUm91bmQo
dHJTaGFkb3dQb2ludC55KCkpLCAwLCBOVUxMLCAmYywgMSwgMCk7CisgICAgICAgIH0KKyAgICAg
ICAgU2V0VGV4dENvbG9yKG1fZGF0YS0+bV9kYywgZm9udENvbG9yKTsKKyAgICAgICAgRXh0VGV4
dE91dChtX2RhdGEtPm1fZGMsIHN0YWJsZVJvdW5kKHRyUG9pbnQueCgpKSwgeSwgMCwgTlVMTCwg
JmMsIDEsIDApOworICAgIH0KKworICAgIFNldFRleHRBbGlnbihtX2RhdGEtPm1fZGMsIG9sZFRl
eHRBbGlnbik7CisgICAgU2V0VGV4dENvbG9yKG1fZGF0YS0+bV9kYywgb2xkVGV4dENvbG9yKTsK
KyAgICBTZXRCa01vZGUobV9kYXRhLT5tX2RjLCBvbGRCa01vZGUpOworICAgIFNlbGVjdE9iamVj
dChtX2RhdGEtPm1fZGMsIGhPbGRGb250KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRy
YXdGcmFtZUNvbnRyb2woY29uc3QgSW50UmVjdCYgcmVjdCwgdW5zaWduZWQgdHlwZSwgdW5zaWdu
ZWQgc3RhdGUpCit7CisgICAgaWYgKCFtX2RhdGEtPm1fb3BhY2l0eSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgY29uc3QgaW50IGJveFdpZHRoQmVzdCA9IDg7CisgICAgY29uc3QgaW50IGJveEhl
aWdodEJlc3QgPSA4OworCisgICAgU2NvcGVEQ1Byb3ZpZGVyIGRjUHJvdmlkZXIobV9kYXRhKTsK
KyAgICBpZiAoIW1fZGF0YS0+bV9kYykKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50UmVjdCB0
clJlY3QgPSBtX2RhdGEtPm1hcFJlY3QocmVjdCk7CisgICAgVHJhbnNwYXJlbnRMYXllckRDIHRy
YW5zcGFyZW50REMobV9kYXRhLCB0clJlY3QsICZyZWN0LCAyNTUsIHRydWUpOworICAgIEhEQyBk
YyA9IHRyYW5zcGFyZW50REMuaGRjKCk7CisgICAgaWYgKCFkYykKKyAgICAgICAgcmV0dXJuOwor
ICAgIHRyUmVjdC5tb3ZlKHRyYW5zcGFyZW50REMudG9TaGlmdCgpKTsKKworICAgIFJFQ1QgcmVj
dFdpbiA9IHRyUmVjdDsKKworICAgIGlmICgocmVjdFdpbi5yaWdodCAtIHJlY3RXaW4ubGVmdCkg
PCBib3hXaWR0aEJlc3QpIHsKKyAgICAgICAgUmVmUHRyPFNoYXJlZEJpdG1hcD4gYm1wID0gU2hh
cmVkQml0bWFwOjpjcmVhdGVJbnN0YW5jZSh0cnVlLCBib3hXaWR0aEJlc3QsIGJveEhlaWdodEJl
c3QsIHRydWUpOworICAgICAgICBTaGFyZWRCaXRtYXA6OkRDSG9sZGVyIG1lbURDKGJtcC5nZXQo
KSk7CisgICAgICAgIGlmIChtZW1EQy5nZXQoKSkgeworICAgICAgICAgICAgUkVDVCB0ZW1wUmVj
dCA9IHswLCAwLCBib3hXaWR0aEJlc3QsIGJveEhlaWdodEJlc3R9OworICAgICAgICAgICAgRHJh
d0ZyYW1lQ29udHJvbChtZW1EQy5nZXQoKSwgJnRlbXBSZWN0LCB0eXBlLCBzdGF0ZSk7CisKKyAg
ICAgICAgICAgIDo6U3RyZXRjaEJsdChkYywgcmVjdFdpbi5sZWZ0LCByZWN0V2luLnRvcCwgcmVj
dFdpbi5yaWdodCAtIHJlY3RXaW4ubGVmdCwgcmVjdFdpbi5ib3R0b20gLSByZWN0V2luLnRvcCwg
bWVtREMuZ2V0KCksIDAsIDAsIGJveFdpZHRoQmVzdCwgYm94SGVpZ2h0QmVzdCwgU1JDQ09QWSk7
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBEcmF3RnJhbWVD
b250cm9sKGRjLCAmcmVjdFdpbiwgdHlwZSwgc3RhdGUpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6ZHJhd0ZvY3VzUmVjdChjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmICghbV9k
YXRhLT5tX29wYWNpdHkpCisgICAgICAgIHJldHVybjsKKworICAgIFNjb3BlRENQcm92aWRlciBk
Y1Byb3ZpZGVyKG1fZGF0YSk7CisgICAgaWYgKCFtX2RhdGEtPm1fZGMpCisgICAgICAgIHJldHVy
bjsKKworICAgIEludFJlY3QgdHJSZWN0ID0gbV9kYXRhLT5tYXBSZWN0KHJlY3QpOworICAgIFRy
YW5zcGFyZW50TGF5ZXJEQyB0cmFuc3BhcmVudERDKG1fZGF0YSwgdHJSZWN0LCAmcmVjdCk7Cisg
ICAgSERDIGRjID0gdHJhbnNwYXJlbnREQy5oZGMoKTsKKyAgICBpZiAoIWRjKQorICAgICAgICBy
ZXR1cm47CisgICAgdHJSZWN0Lm1vdmUodHJhbnNwYXJlbnREQy50b1NoaWZ0KCkpOworCisgICAg
UkVDVCByZWN0V2luID0gdHJSZWN0OworICAgIERyYXdGb2N1c1JlY3QoZGMsICZyZWN0V2luKTsK
K30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnBhaW50VGV4dEZpZWxkKGNvbnN0IEludFJlY3Qm
IHJlY3QsIHVuc2lnbmVkIHN0YXRlKQoreworICAgIGlmICghbV9kYXRhLT5tX29wYWNpdHkpCisg
ICAgICAgIHJldHVybjsKKworICAgIFNjb3BlRENQcm92aWRlciBkY1Byb3ZpZGVyKG1fZGF0YSk7
CisgICAgaWYgKCFtX2RhdGEtPm1fZGMpCisgICAgICAgIHJldHVybjsKKworICAgIEludFJlY3Qg
dHJSZWN0ID0gbV9kYXRhLT5tYXBSZWN0KHJlY3QpOworICAgIFRyYW5zcGFyZW50TGF5ZXJEQyB0
cmFuc3BhcmVudERDKG1fZGF0YSwgdHJSZWN0LCAmcmVjdCk7CisgICAgSERDIGRjID0gdHJhbnNw
YXJlbnREQy5oZGMoKTsKKyAgICBpZiAoIWRjKQorICAgICAgICByZXR1cm47CisgICAgdHJSZWN0
Lm1vdmUodHJhbnNwYXJlbnREQy50b1NoaWZ0KCkpOworCisgICAgUkVDVCByZWN0V2luID0gdHJS
ZWN0OworICAgIERyYXdFZGdlKGRjLCAmcmVjdFdpbiwgRURHRV9FVENIRUQsIEJGX1JFQ1QgfCBC
Rl9BREpVU1QpOworICAgIEZpbGxSZWN0KGRjLCAmcmVjdFdpbiwgcmVpbnRlcnByZXRfY2FzdDxI
QlJVU0g+KCgoc3RhdGUgJiBERkNTX0lOQUNUSVZFKSA/IENPTE9SX0JUTkZBQ0UgOiBDT0xPUl9X
SU5ET1cpICsgMSkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0JpdG1hcChTaGFy
ZWRCaXRtYXAqIGJtcCwgY29uc3QgSW50UmVjdCYgZHN0UmVjdEluLCBjb25zdCBJbnRSZWN0JiBz
cmNSZWN0LCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCkKK3sKKyAgICBpZiAoIW1fZGF0
YS0+bV9vcGFjaXR5KQorICAgICAgICByZXR1cm47CisKKyAgICBTY29wZURDUHJvdmlkZXIgZGNQ
cm92aWRlcihtX2RhdGEpOworICAgIGlmICghbV9kYXRhLT5tX2RjKQorICAgICAgICByZXR1cm47
CisKKyAgICBJbnRSZWN0IGRzdFJlY3QgPSBtX2RhdGEtPm1hcFJlY3QoZHN0UmVjdEluKTsKKyAg
ICBUcmFuc3BhcmVudExheWVyREMgdHJhbnNwYXJlbnREQyhtX2RhdGEsIGRzdFJlY3QsICZkc3RS
ZWN0SW4sIDI1NSwgdHJ1ZSk7CisgICAgSERDIGRjID0gdHJhbnNwYXJlbnREQy5oZGMoKTsKKyAg
ICBpZiAoIWRjKQorICAgICAgICByZXR1cm47CisgICAgZHN0UmVjdC5tb3ZlKHRyYW5zcGFyZW50
REMudG9TaGlmdCgpKTsKKworICAgIGJtcC0+ZHJhdyhkYywgZHN0UmVjdCwgc3JjUmVjdCwgY29t
cG9zaXRlT3ApOworCisgICAgaWYgKGJtcC0+aXMxNmJpdCgpKQorICAgICAgICB0cmFuc3BhcmVu
dERDLmZpbGxBbHBoYUNoYW5uZWwoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdC
aXRtYXBQYXR0ZXJuKFNoYXJlZEJpdG1hcCogYm1wLCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0
SW4sIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgcGF0dGVyblRyYW5zZm9ybSwKKyAgICAgICAgICAg
ICAgICBjb25zdCBGbG9hdFBvaW50JiBwaGFzZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIGNvbnN0
IEZsb2F0UmVjdCYgZGVzdFJlY3RJbiwgY29uc3QgSW50U2l6ZSYgb3JpZ1NvdXJjZVNpemUpCit7
CisgICAgaWYgKCFtX2RhdGEtPm1fb3BhY2l0eSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU2Nv
cGVEQ1Byb3ZpZGVyIGRjUHJvdmlkZXIobV9kYXRhKTsKKyAgICBpZiAoIW1fZGF0YS0+bV9kYykK
KyAgICAgICAgcmV0dXJuOworCisgICAgSW50UmVjdCBpbnREc3RSZWN0ID0gZW5jbG9zaW5nSW50
UmVjdChkZXN0UmVjdEluKTsKKyAgICBJbnRSZWN0IHRyUmVjdCA9IG1fZGF0YS0+bWFwUmVjdChp
bnREc3RSZWN0KTsKKyAgICBUcmFuc3BhcmVudExheWVyREMgdHJhbnNwYXJlbnREQyhtX2RhdGEs
IHRyUmVjdCwgJmludERzdFJlY3QsIDI1NSwgdHJ1ZSk7CisgICAgSERDIGRjID0gdHJhbnNwYXJl
bnREQy5oZGMoKTsKKyAgICBpZiAoIWRjKQorICAgICAgICByZXR1cm47CisgICAgdHJSZWN0Lm1v
dmUodHJhbnNwYXJlbnREQy50b1NoaWZ0KCkpOworICAgIEZsb2F0UmVjdCBtb3ZlZERzdFJlY3Qg
PSBtX2RhdGEtPm1fdHJhbnNmb3JtLmludmVyc2UoKS5tYXBSZWN0KEZsb2F0UmVjdCh0clJlY3Qp
KTsKKyAgICBGbG9hdFNpemUgbW92ZWQobW92ZWREc3RSZWN0LmxvY2F0aW9uKCkgLSBkZXN0UmVj
dEluLmxvY2F0aW9uKCkpOworICAgIEFmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBtX2RhdGEt
Pm1fdHJhbnNmb3JtOworICAgIHRyYW5zZm9ybS50cmFuc2xhdGUobW92ZWQud2lkdGgoKSwgbW92
ZWQuaGVpZ2h0KCkpOworCisgICAgYm1wLT5kcmF3UGF0dGVybihkYywgdHJhbnNmb3JtLCB0aWxl
UmVjdEluLCBwYXR0ZXJuVHJhbnNmb3JtLCBwaGFzZSwgb3AsIGRlc3RSZWN0SW4sIG9yaWdTb3Vy
Y2VTaXplKTsKKworICAgIGlmICghYm1wLT5oYXNBbHBoYSgpKQorICAgICAgICB0cmFuc3BhcmVu
dERDLmZpbGxBbHBoYUNoYW5uZWwoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdJ
Y29uKEhJQ09OIGljb24sIGNvbnN0IEludFJlY3QmIGRzdFJlY3RJbiwgVUlOVCBmbGFncykKK3sK
KyAgICBpZiAoIW1fZGF0YS0+bV9vcGFjaXR5KQorICAgICAgICByZXR1cm47CisKKyAgICBTY29w
ZURDUHJvdmlkZXIgZGNQcm92aWRlcihtX2RhdGEpOworICAgIGlmICghbV9kYXRhLT5tX2RjKQor
ICAgICAgICByZXR1cm47CisKKyAgICBJbnRSZWN0IGRzdFJlY3QgPSBtX2RhdGEtPm1hcFJlY3Qo
ZHN0UmVjdEluKTsKKyAgICBUcmFuc3BhcmVudExheWVyREMgdHJhbnNwYXJlbnREQyhtX2RhdGEs
IGRzdFJlY3QsICZkc3RSZWN0SW4sIDI1NSwgdHJ1ZSk7CisgICAgSERDIGRjID0gdHJhbnNwYXJl
bnREQy5oZGMoKTsKKyAgICBpZiAoIWRjKQorICAgICAgICByZXR1cm47CisgICAgZHN0UmVjdC5t
b3ZlKHRyYW5zcGFyZW50REMudG9TaGlmdCgpKTsKKworICAgIERyYXdJY29uRXgoZGMsIGRzdFJl
Y3QueCgpLCBkc3RSZWN0LnkoKSwgaWNvbiwgZHN0UmVjdC53aWR0aCgpLCBkc3RSZWN0LmhlaWdo
dCgpLCAwLCBOVUxMLCBmbGFncyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0
Zm9ybVNob3VsZEFudGlhbGlhcyhib29sKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRMaW5lRGFzaChjb25zdCBEYXNoQXJyYXkmLCBmbG9h
dCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6
Y2xpcFBhdGgoV2luZFJ1bGUpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9H
cmFwaGljc0NvbnRleHRXaW5DRS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW5jZS9HcmFwaGljc0NvbnRleHRXaW5DRS5jcHAJKHJldmlzaW9uIDU3Mjg5KQor
KysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HcmFwaGljc0NvbnRleHRXaW5DRS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlICJHcmFwaGljc0Nv
bnRleHRQcml2YXRlLmgiCiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRlICJQ
YXRoLmgiCi0jaW5jbHVkZSAiUGxhdGZvcm1QYXRoV2luY2UuaCIKKyNpbmNsdWRlICJQbGF0Zm9y
bVBhdGhXaW5DRS5oIgogI2luY2x1ZGUgIlNoYXJlZEJpdG1hcC5oIgogI2luY2x1ZGUgIlNpbXBs
ZUZvbnREYXRhLmgiCiAjaW5jbHVkZSA8d3RmL093blB0ci5oPgpJbmRleDogV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9HcmFwaGljc0NvbnRleHRXaW5jZS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HcmFwaGljc0NvbnRleHRXaW5jZS5j
cHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9H
cmFwaGljc0NvbnRleHRXaW5jZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsMTk0MCArMCwwIEBA
Ci0vKgotICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSBJbmMuCi0gKgot
ICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp
dCBhbmQvb3IKLSAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYwotICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0g
KiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy
cmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj
b3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYWxvbmcg
d2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3Jp
dGUgdG8KLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xp
biBTdHJlZXQsIEZpZnRoIEZsb29yLAotICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgot
ICoKLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0
LmgiCi0KLSNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKLSNpbmNsdWRlICJDaGFyYWN0ZXJO
YW1lcy5oIgotI2luY2x1ZGUgIkZvbnQuaCIKLSNpbmNsdWRlICJHbHlwaEJ1ZmZlci5oIgotI2lu
Y2x1ZGUgIkdyYWRpZW50LmgiCi0jaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0UHJpdmF0ZS5oIgot
I2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCi0jaW5jbHVkZSAiUGF0aC5oIgotI2luY2x1ZGUg
IlBsYXRmb3JtUGF0aFdpbmNlLmgiCi0jaW5jbHVkZSAiU2hhcmVkQml0bWFwLmgiCi0jaW5jbHVk
ZSAiU2ltcGxlRm9udERhdGEuaCIKLSNpbmNsdWRlIDx3dGYvT3duUHRyLmg+Ci0KLSNpbmNsdWRl
IDx3aW5kb3dzLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotdHlwZWRlZiB2b2lkICgqRnVu
Y0dyYWRpZW50RmlsbFJlY3RMaW5lYXIpKEhEQyBoZGMsIGNvbnN0IEludFJlY3QmIHIsIGNvbnN0
IEludFBvaW50JiBwMCwgY29uc3QgSW50UG9pbnQmIHAxLCBjb25zdCBWZWN0b3I8R3JhZGllbnQ6
OkNvbG9yU3RvcD4mIHN0b3BzKTsKLXR5cGVkZWYgdm9pZCAoKkZ1bmNHcmFkaWVudEZpbGxSZWN0
UmFkaWFsKShIREMgaGRjLCBjb25zdCBJbnRSZWN0JiByLCBjb25zdCBJbnRQb2ludCYgcDAsIGNv
bnN0IEludFBvaW50JiBwMSwgZmxvYXQgcjAsIGZsb2F0IHIxLCBjb25zdCBWZWN0b3I8R3JhZGll
bnQ6OkNvbG9yU3RvcD4mIHN0b3BzKTsKLUZ1bmNHcmFkaWVudEZpbGxSZWN0TGluZWFyIGdfbGlu
ZWFyR3JhZGllbnRGaWxsZXIgPSAwOwotRnVuY0dyYWRpZW50RmlsbFJlY3RSYWRpYWwgZ19yYWRp
YWxHcmFkaWVudEZpbGxlciA9IDA7Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc1plcm8oZG91Ymxl
IGQpCi17Ci0gICAgcmV0dXJuIGQgPiAwID8gZCA8PSAxLkUtMTAgOiBkID49IC0xLkUtMTA7Ci19
Ci0KLS8vIHN0YWJsZVJvdW5kIHJvdW5kcyAtMC41IHRvIDAsIHdoZXJlIGxyb3VuZCByb3VuZHMg
LTAuNSB0byAtMS4KLXN0YXRpYyBpbmxpbmUgaW50IHN0YWJsZVJvdW5kKGRvdWJsZSBkKQotewot
ICAgIGlmIChkID4gMCkKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oZCArIDAuNSk7
Ci0KLSAgICBpbnQgaSA9IHN0YXRpY19jYXN0PGludD4oZCk7Ci0gICAgcmV0dXJuIGkgLSBkID4g
MC41ID8gaSAtIDEgOiBpOwotfQotCi0vLyBVbmxpa2UgZW5jbG9zaW5nSW50UmVjdCgpLCB0aGlz
IGZ1bmN0aW9uIGRvZXMgc3RyaWN0IHJvdW5kaW5nLgotc3RhdGljIGlubGluZSBJbnRSZWN0IHJv
dW5kUmVjdChjb25zdCBGbG9hdFJlY3QmIHIpCi17Ci0gICAgcmV0dXJuIEludFJlY3Qoc3RhYmxl
Um91bmQoci54KCkpLCBzdGFibGVSb3VuZChyLnkoKSksIHN0YWJsZVJvdW5kKHIucmlnaHQoKSkg
LSBzdGFibGVSb3VuZChyLngoKSksIHN0YWJsZVJvdW5kKHIuYm90dG9tKCkpIC0gc3RhYmxlUm91
bmQoci55KCkpKTsKLX0KLQotLy8gUm90YXRpb24gdHJhbnNmb3JtYXRpb24KLWNsYXNzIFJvdGF0
aW9uVHJhbnNmb3JtIHsKLXB1YmxpYzoKLSAgICBSb3RhdGlvblRyYW5zZm9ybSgpCi0gICAgICAg
IDogbV9jb3NBKDEuKQotICAgICAgICAsIG1fc2luQSgwLikKLSAgICAgICAgLCBtX3ByZVNoaWZ0
WCgwKQotICAgICAgICAsIG1fcHJlU2hpZnRZKDApCi0gICAgICAgICwgbV9wb3N0U2hpZnRYKDAp
Ci0gICAgICAgICwgbV9wb3N0U2hpZnRZKDApCi0gICAgewotICAgIH0KLSAgICBSb3RhdGlvblRy
YW5zZm9ybSBvcGVyYXRvci0oKSBjb25zdAotICAgIHsKLSAgICAgICAgUm90YXRpb25UcmFuc2Zv
cm0gcnRuOwotICAgICAgICBydG4ubV9jb3NBID0gbV9jb3NBOwotICAgICAgICBydG4ubV9zaW5B
ID0gLW1fc2luQTsKLSAgICAgICAgcnRuLm1fcHJlU2hpZnRYID0gbV9wb3N0U2hpZnRYOwotICAg
ICAgICBydG4ubV9wcmVTaGlmdFkgPSBtX3Bvc3RTaGlmdFk7Ci0gICAgICAgIHJ0bi5tX3Bvc3RT
aGlmdFggPSBtX3ByZVNoaWZ0WDsKLSAgICAgICAgcnRuLm1fcG9zdFNoaWZ0WSA9IG1fcHJlU2hp
ZnRZOwotICAgICAgICByZXR1cm4gcnRuOwotICAgIH0KLSAgICB2b2lkIG1hcChkb3VibGUgeDEs
IGRvdWJsZSB5MSwgZG91YmxlKiB4MiwgZG91YmxlKiB5MikgY29uc3QKLSAgICB7Ci0gICAgICAg
IHgxICs9IG1fcHJlU2hpZnRYOwotICAgICAgICB5MSArPSBtX3ByZVNoaWZ0WTsKLSAgICAgICAg
KngyID0geDEgKiBtX2Nvc0EgKyB5MSAqIG1fc2luQSArIG1fcG9zdFNoaWZ0WDsKLSAgICAgICAg
KnkyID0geTEgKiBtX2Nvc0EgLSB4MSAqIG1fc2luQSArIG1fcG9zdFNoaWZ0WTsKLSAgICB9Ci0g
ICAgdm9pZCBtYXAoaW50IHgxLCBpbnQgeTEsIGludCogeDIsIGludCogeTIpIGNvbnN0Ci0gICAg
ewotICAgICAgICB4MSArPSBtX3ByZVNoaWZ0WDsKLSAgICAgICAgeTEgKz0gbV9wcmVTaGlmdFk7
Ci0gICAgICAgICp4MiA9IHN0YWJsZVJvdW5kKHgxICogbV9jb3NBICsgeTEgKiBtX3NpbkEpICsg
bV9wb3N0U2hpZnRYOwotICAgICAgICAqeTIgPSBzdGFibGVSb3VuZCh5MSAqIG1fY29zQSAtIHgx
ICogbV9zaW5BKSArIG1fcG9zdFNoaWZ0WTsKLSAgICB9Ci0KLSAgICBkb3VibGUgbV9jb3NBOwot
ICAgIGRvdWJsZSBtX3NpbkE7Ci0gICAgaW50IG1fcHJlU2hpZnRYOwotICAgIGludCBtX3ByZVNo
aWZ0WTsKLSAgICBpbnQgbV9wb3N0U2hpZnRYOwotICAgIGludCBtX3Bvc3RTaGlmdFk7Ci19Owot
Ci10ZW1wbGF0ZTxjbGFzcyBUPiBzdGF0aWMgaW5saW5lIEludFBvaW50IG1hcFBvaW50KGNvbnN0
IEludFBvaW50JiBwLCBjb25zdCBUJiB0KQotewotICAgIGludCB4LCB5OwotICAgIHQubWFwKHAu
eCgpLCBwLnkoKSwgJngsICZ5KTsKLSAgICByZXR1cm4gSW50UG9pbnQoeCwgeSk7Ci19Ci0KLXRl
bXBsYXRlPGNsYXNzIFQ+IHN0YXRpYyBpbmxpbmUgRmxvYXRQb2ludCBtYXBQb2ludChjb25zdCBG
bG9hdFBvaW50JiBwLCBjb25zdCBUJiB0KQotewotICAgIGRvdWJsZSB4LCB5OwotICAgIHQubWFw
KHAueCgpLCBwLnkoKSwgJngsICZ5KTsKLSAgICByZXR1cm4gRmxvYXRQb2ludChzdGF0aWNfY2Fz
dDxmbG9hdD4oeCksIHN0YXRpY19jYXN0PGZsb2F0Pih5KSk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNz
IFRyYW5zZm9ybSwgY2xhc3MgUmVjdCwgY2xhc3MgVmFsdWU+IHN0YXRpYyBpbmxpbmUgUmVjdCBt
YXBSZWN0KGNvbnN0IFJlY3QmIHJlY3QsIGNvbnN0IFRyYW5zZm9ybSYgdHJhbnNmb3JtKQotewot
ICAgIFZhbHVlIHhbNF0sIHlbNF07Ci0gICAgVmFsdWUgbCwgdCwgciwgYjsKLSAgICByID0gcmVj
dC5yaWdodCgpIC0gMTsKLSAgICBiID0gcmVjdC5ib3R0b20oKSAtIDE7Ci0gICAgdHJhbnNmb3Jt
Lm1hcChyZWN0LngoKSwgcmVjdC55KCksIHgsIHkpOwotICAgIHRyYW5zZm9ybS5tYXAocmVjdC54
KCksIGIsIHggKyAxLCB5ICsgMSk7Ci0gICAgdHJhbnNmb3JtLm1hcChyLCBiLCB4ICsgMiwgeSAr
IDIpOwotICAgIHRyYW5zZm9ybS5tYXAociwgcmVjdC55KCksIHggKyAzLCB5ICsgMyk7Ci0gICAg
bCA9IHIgPSB4WzNdOwotICAgIHQgPSBiID0geVszXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8
IDM7ICsraSkgewotICAgICAgICBpZiAoeFtpXSA8IGwpCi0gICAgICAgICAgICBsID0geFtpXTsK
LSAgICAgICAgZWxzZSBpZiAoeFtpXSA+IHIpCi0gICAgICAgICAgICByID0geFtpXTsKLQotICAg
ICAgICBpZiAoeVtpXSA8IHQpCi0gICAgICAgICAgICB0ID0geVtpXTsKLSAgICAgICAgZWxzZSBp
ZiAoeVtpXSA+IGIpCi0gICAgICAgICAgICBiID0geVtpXTsKLSAgICB9Ci0KLSAgICByZXR1cm4g
SW50UmVjdChsLCB0LCByIC0gbCArIDEsIGIgLSB0ICsgMSk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNz
IFQ+IHN0YXRpYyBpbmxpbmUgSW50UmVjdCBtYXBSZWN0KGNvbnN0IEludFJlY3QmIHJlY3QsIGNv
bnN0IFQmIHRyYW5zZm9ybSkKLXsKLSAgICByZXR1cm4gbWFwUmVjdDxULCBJbnRSZWN0LCBpbnQ+
KHJlY3QsIHRyYW5zZm9ybSk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+IHN0YXRpYyBpbmxpbmUg
RmxvYXRSZWN0IG1hcFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0LCBjb25zdCBUJiB0cmFuc2Zv
cm0pCi17Ci0gICAgcmV0dXJuIG1hcFJlY3Q8VCwgRmxvYXRSZWN0LCBkb3VibGU+KHJlY3QsIHRy
YW5zZm9ybSk7Ci19Ci0KLWNsYXNzIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZURhdGEg
ewotcHVibGljOgotICAgIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZURhdGEoKQotICAg
ICAgICA6IG1fdHJhbnNmb3JtKCkKLSAgICAgICAgLCBtX29wYWNpdHkoMS4wKQotICAgIHsKLSAg
ICB9Ci0KLSAgICBBZmZpbmVUcmFuc2Zvcm0gbV90cmFuc2Zvcm07Ci0gICAgZmxvYXQgbV9vcGFj
aXR5OwotICAgIFZlY3RvcjxQYXRoPiBtX3BhdGhzOwotfTsKLQotZW51bSBBbHBoYVBhaW50VHlw
ZSB7Ci0gICAgQWxwaGFQYWludE5vbmUsCi0gICAgQWxwaGFQYWludEltYWdlLAotICAgIEFscGhh
UGFpbnRPdGhlciwKLX07Ci0KLWNsYXNzIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSA6
IHB1YmxpYyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVEYXRhIHsKLXB1YmxpYzoKLSAg
ICBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoSERDIGRjKQotICAgICAgICA6IG1fZGMo
ZGMpCi0gICAgewotICAgIH0KLSAgICB+R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKCkK
LSAgICB7Ci0gICAgICAgIHdoaWxlICghbV9iYWNrdXBEYXRhLmlzRW1wdHkoKSkKLSAgICAgICAg
ICAgIHJlc3RvcmUoKTsKLSAgICB9Ci0KLSAgICBJbnRQb2ludCBvcmlnaW4oKSBjb25zdAotICAg
IHsKLSAgICAgICAgcmV0dXJuIEludFBvaW50KHN0YWJsZVJvdW5kKC1tX3RyYW5zZm9ybS5lKCkp
LCBzdGFibGVSb3VuZCgtbV90cmFuc2Zvcm0uZigpKSk7Ci0gICAgfQotCi0gICAgdm9pZCB0cmFu
c2xhdGUoZmxvYXQgeCwgZmxvYXQgeSkKLSAgICB7Ci0gICAgICAgIG1fdHJhbnNmb3JtLnRyYW5z
bGF0ZSh4LCB5KTsKLSAgICB9Ci0KLSAgICB2b2lkIHNjYWxlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6
ZSkKLSAgICB7Ci0gICAgICAgIG1fdHJhbnNmb3JtLnNjYWxlTm9uVW5pZm9ybShzaXplLndpZHRo
KCksIHNpemUuaGVpZ2h0KCkpOwotICAgIH0KLQotICAgIHZvaWQgcm90YXRlKGZsb2F0IHJhZGlh
bnMpCi0gICAgewotICAgICAgICBtX3RyYW5zZm9ybS5yb3RhdGUocmFkMmRlZyhyYWRpYW5zKSk7
Ci0gICAgfQotCi0gICAgdm9pZCAgY29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdHJh
bnNmb3JtKQotICAgIHsKLSAgICAgICAgbV90cmFuc2Zvcm0gPSB0cmFuc2Zvcm0gKiBtX3RyYW5z
Zm9ybTsKLSAgICB9Ci0KLSAgICBJbnRSZWN0IG1hcFJlY3QoY29uc3QgSW50UmVjdCYgcmVjdCkg
Y29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3RyYW5zZm9ybS5tYXBSZWN0KHJlY3QpOwot
ICAgIH0KLQotICAgIEZsb2F0UmVjdCBtYXBSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkgY29u
c3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3RyYW5zZm9ybS5tYXBSZWN0KHJlY3QpOwotICAg
IH0KLQotICAgIEludFBvaW50IG1hcFBvaW50KGNvbnN0IEludFBvaW50JiBwb2ludCkgY29uc3QK
LSAgICB7Ci0gICAgICAgIHJldHVybiBtX3RyYW5zZm9ybS5tYXBQb2ludChwb2ludCk7Ci0gICAg
fQotCi0gICAgRmxvYXRQb2ludCBtYXBQb2ludChjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29u
c3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3RyYW5zZm9ybS5tYXBQb2ludChwb2ludCk7Ci0g
ICAgfQotCi0gICAgRmxvYXRTaXplIG1hcFNpemUoY29uc3QgRmxvYXRTaXplJiBzaXplKSBjb25z
dAotICAgIHsKLSAgICAgICAgZG91YmxlIHcsIGg7Ci0gICAgICAgIG1fdHJhbnNmb3JtLm1hcChz
aXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCksIHcsIGgpOwotICAgICAgICByZXR1cm4gRmxvYXRT
aXplKHN0YXRpY19jYXN0PGZsb2F0Pih3KSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGgpKTsKLSAgICB9
Ci0KLSAgICB2b2lkIHNhdmUoKQotICAgIHsKLSAgICAgICAgaWYgKG1fZGMpCi0gICAgICAgICAg
ICBTYXZlREMobV9kYyk7Ci0KLSAgICAgICAgbV9iYWNrdXBEYXRhLmFwcGVuZCgqc3RhdGljX2Nh
c3Q8R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlRGF0YSo+KHRoaXMpKTsKLSAgICB9Ci0K
LSAgICB2b2lkIHJlc3RvcmUoKQotICAgIHsKLSAgICAgICAgaWYgKG1fYmFja3VwRGF0YS5pc0Vt
cHR5KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKG1fZGMpCi0gICAgICAg
ICAgICBSZXN0b3JlREMobV9kYywgLTEpOwotCi0gICAgICAgIEdyYXBoaWNzQ29udGV4dFBsYXRm
b3JtUHJpdmF0ZURhdGE6Om9wZXJhdG9yPShtX2JhY2t1cERhdGEubGFzdCgpKTsKLSAgICAgICAg
bV9iYWNrdXBEYXRhLnJlbW92ZUxhc3QoKTsKLSAgICB9Ci0KLSAgICBib29sIGhhc0FscGhhKCkg
Y29uc3QgeyByZXR1cm4gbV9iaXRtYXAgJiYgbV9iaXRtYXAtPmhhc0FscGhhKCk7IH0KLQotICAg
IFBhc3NSZWZQdHI8U2hhcmVkQml0bWFwPiBnZXRUcmFuc3BhcmVudExheWVyQml0bWFwKEludFJl
Y3QmIG9yaWdSZWN0LCBBbHBoYVBhaW50VHlwZSBhbHBoYVBhaW50LCBSRUNUJiBibXBSZWN0LCBi
b29sIGNoZWNrQ2xpcEJveCwgYm9vbCBmb3JjZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmICht
X29wYWNpdHkgPD0gMCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGlmIChmb3Jj
ZSB8fCBtX29wYWNpdHkgPCAxLikgIHsKLSAgICAgICAgICAgIGlmIChjaGVja0NsaXBCb3gpIHsK
LSAgICAgICAgICAgICAgICBSRUNUIGNsaXBCb3g7Ci0gICAgICAgICAgICAgICAgaW50IGNsaXBU
eXBlID0gR2V0Q2xpcEJveChtX2RjLCAmY2xpcEJveCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNs
aXBUeXBlID09IFNJTVBMRVJFR0lPTiB8fCBjbGlwVHlwZSA9PSBDT01QTEVYUkVHSU9OKQotICAg
ICAgICAgICAgICAgICAgICBvcmlnUmVjdC5pbnRlcnNlY3QoY2xpcEJveCk7Ci0gICAgICAgICAg
ICAgICAgaWYgKG9yaWdSZWN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFJlZlB0cjxTaGFyZWRCaXRtYXA+IGJt
cCA9IFNoYXJlZEJpdG1hcDo6Y3JlYXRlSW5zdGFuY2UoYWxwaGFQYWludCA9PSBBbHBoYVBhaW50
Tm9uZSwgb3JpZ1JlY3Qud2lkdGgoKSwgb3JpZ1JlY3QuaGVpZ2h0KCksIGZhbHNlKTsKLSAgICAg
ICAgICAgIFNldFJlY3QoJmJtcFJlY3QsIDAsIDAsIG9yaWdSZWN0LndpZHRoKCksIG9yaWdSZWN0
LmhlaWdodCgpKTsKLSAgICAgICAgICAgIGlmIChibXApIHsKLSAgICAgICAgICAgICAgICBzd2l0
Y2ggKGFscGhhUGFpbnQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEFscGhhUGFpbnROb25lOgot
ICAgICAgICAgICAgICAgIGNhc2UgQWxwaGFQYWludEltYWdlOgotICAgICAgICAgICAgICAgICAg
ICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTaGFyZWRCaXRtYXA6OkRDSG9sZGVyIGRjKGJt
cC5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGMuZ2V0KCkpIHsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBCaXRCbHQoZGMuZ2V0KCksIDAsIDAsIG9yaWdSZWN0Lndp
ZHRoKCksIG9yaWdSZWN0LmhlaWdodCgpLCBtX2RjLCBvcmlnUmVjdC54KCksIG9yaWdSZWN0Lnko
KSwgU1JDQ09QWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJtcC0+aXMzMmJp
dCgpICYmICghbV9iaXRtYXAgfHwgbV9iaXRtYXAtPmlzMTZiaXQoKSkpIHsKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGFscGhhIGNoYW5uZWwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdW5zaWduZWQqIHBpeGVscyA9ICh1bnNpZ25lZCopYm1wLT5ieXRl
cygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCogY29u
c3QgcGl4ZWxzRW5kID0gcGl4ZWxzICsgYm1wLT5iaXRtYXBJbmZvKCkubnVtUGl4ZWxzKCk7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwaXhlbHMgPCBwaXhlbHNFbmQp
IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwaXhlbHMgfD0gMHhGRjAw
MDAwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrcGl4ZWxzOwotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBibXA7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgLy9jYXNlIEFscGhhUGFpbnRPdGhlcjoKLSAgICAg
ICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoYm1wLT5ieXRl
cygpLCAweEZGLCBibXAtPmJpdG1hcEluZm8oKS5udW1QaXhlbHMoKSAqIDQpOwotICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gYm1wOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBibXBSZWN0
ID0gb3JpZ1JlY3Q7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHZvaWQgcGFpbnRC
YWNrVHJhbnNwYXJlbnRMYXllckJpdG1hcChIREMgaGRjLCBTaGFyZWRCaXRtYXAqIGJtcCwgY29u
c3QgSW50UmVjdCYgb3JpZ1JlY3QsIEFscGhhUGFpbnRUeXBlIGFscGhhUGFpbnQsIGNvbnN0IFJF
Q1QmIGJtcFJlY3QpCi0gICAgewotICAgICAgICBpZiAoaGRjID09IG1fZGMpCi0gICAgICAgICAg
ICByZXR1cm47Ci0KLSNpZiAhZGVmaW5lZChOT19BTFBIQUJMRU5EKQotICAgICAgICBpZiAoYWxw
aGFQYWludCA9PSBBbHBoYVBhaW50T3RoZXIpIHsKLSAgICAgICAgICAgIEFTU0VSVChibXAgJiYg
Ym1wLT5ieXRlcygpICYmIGJtcC0+aXMzMmJpdCgpKTsKLSAgICAgICAgICAgIHVuc2lnbmVkKiBw
aXhlbHMgPSAodW5zaWduZWQqKWJtcC0+Ynl0ZXMoKTsKLSAgICAgICAgICAgIGNvbnN0IHVuc2ln
bmVkKiBjb25zdCBwaXhlbHNFbmQgPSBwaXhlbHMgKyBibXAtPmJpdG1hcEluZm8oKS5udW1QaXhl
bHMoKTsKLSAgICAgICAgICAgIHdoaWxlIChwaXhlbHMgPCBwaXhlbHNFbmQpIHsKLSAgICAgICAg
ICAgICAgICAqcGl4ZWxzIF49IDB4RkYwMDAwMDA7Ci0gICAgICAgICAgICAgICAgKytwaXhlbHM7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fb3BhY2l0eSA8IDEuIHx8
IGFscGhhUGFpbnQgPT0gQWxwaGFQYWludE90aGVyKSB7Ci0gICAgICAgICAgICBjb25zdCBCTEVO
REZVTkNUSU9OIGJsZW5kID0geyBBQ19TUkNfT1ZFUiwgMAotICAgICAgICAgICAgICAgICwgbV9v
cGFjaXR5ID49IDEuID8gMjU1IDogKEJZVEUpKG1fb3BhY2l0eSAqIDI1NSkKLSAgICAgICAgICAg
ICAgICAsIGFscGhhUGFpbnQgPT0gQWxwaGFQYWludE5vbmUgPyAwIDogQUNfU1JDX0FMUEhBIH07
Ci0gICAgICAgICAgICBBbHBoYUJsZW5kKG1fZGMsIG9yaWdSZWN0LngoKSwgb3JpZ1JlY3QueSgp
LCBvcmlnUmVjdC53aWR0aCgpLCBvcmlnUmVjdC5oZWlnaHQoKSwgaGRjLCAwLCAwLCBibXBSZWN0
LnJpZ2h0LCBibXBSZWN0LmJvdHRvbSwgYmxlbmQpOwotICAgICAgICB9IGVsc2UKLSNlbmRpZgot
ICAgICAgICAgICAgU3RyZXRjaEJsdChtX2RjLCBvcmlnUmVjdC54KCksIG9yaWdSZWN0LnkoKSwg
b3JpZ1JlY3Qud2lkdGgoKSwgb3JpZ1JlY3QuaGVpZ2h0KCksIGhkYywgMCwgMCwgYm1wUmVjdC5y
aWdodCwgYm1wUmVjdC5ib3R0b20sIFNSQ0NPUFkpOwotICAgIH0KLQotICAgIEhEQyBtX2RjOwot
ICAgIFJlZlB0cjxTaGFyZWRCaXRtYXA+IG1fYml0bWFwOwotICAgIFZlY3RvcjxHcmFwaGljc0Nv
bnRleHRQbGF0Zm9ybVByaXZhdGVEYXRhPiBtX2JhY2t1cERhdGE7Ci19OwotCi1zdGF0aWMgSFBF
TiBjcmVhdGVQZW4oY29uc3QgQ29sb3ImIGNvbCwgZG91YmxlIGZXaWR0aCwgU3Ryb2tlU3R5bGUg
c3R5bGUpCi17Ci0gICAgaW50IHdpZHRoID0gc3RhYmxlUm91bmQoZldpZHRoKTsKLSAgICBpZiAo
d2lkdGggPCAxKQotICAgICAgICB3aWR0aCA9IDE7Ci0KLSAgICBpbnQgcGVuU3R5bGUgPSBQU19O
VUxMOwotICAgIHN3aXRjaCAoc3R5bGUpIHsKLSAgICAgICAgY2FzZSBTb2xpZFN0cm9rZToKLSAg
ICAgICAgICAgIHBlblN0eWxlID0gUFNfU09MSUQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgY2FzZSBEb3R0ZWRTdHJva2U6ICAvLyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MgQ0UKLSAg
ICAgICAgY2FzZSBEYXNoZWRTdHJva2U6Ci0gICAgICAgICAgICBwZW5TdHlsZSA9IFBTX0RBU0g7
Ci0gICAgICAgICAgICB3aWR0aCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVm
YXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBDcmVhdGVQZW4o
cGVuU3R5bGUsIHdpZHRoLCBSR0IoY29sLnJlZCgpLCBjb2wuZ3JlZW4oKSwgY29sLmJsdWUoKSkp
OwotfQotCi1zdGF0aWMgaW5saW5lIEhHRElPQkogY3JlYXRlQnJ1c2goY29uc3QgQ29sb3ImIGNv
bCkKLXsKLSAgICByZXR1cm4gQ3JlYXRlU29saWRCcnVzaChSR0IoY29sLnJlZCgpLCBjb2wuZ3Jl
ZW4oKSwgY29sLmJsdWUoKSkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUGl4ZWxUeXBlLCBi
b29sIElzMTZiaXQ+IHN0YXRpYyB2b2lkIF9yb3RhdGVCaXRtYXAoU2hhcmVkQml0bWFwKiBkZXN0
Qm1wLCBjb25zdCBTaGFyZWRCaXRtYXAqIHNvdXJjZUJtcCwgY29uc3QgUm90YXRpb25UcmFuc2Zv
cm0mIHRyYW5zZm9ybSkKLXsKLSAgICBpbnQgZGVzdFcgPSBkZXN0Qm1wLT53aWR0aCgpOwotICAg
IGludCBkZXN0SCA9IGRlc3RCbXAtPmhlaWdodCgpOwotICAgIGludCBzb3VyY2VXID0gc291cmNl
Qm1wLT53aWR0aCgpOwotICAgIGludCBzb3VyY2VIID0gc291cmNlQm1wLT5oZWlnaHQoKTsKLSAg
ICBQaXhlbFR5cGUqIGRlc3QgPSAoUGl4ZWxUeXBlKilkZXN0Qm1wLT5ieXRlcygpOwotICAgIGNv
bnN0IFBpeGVsVHlwZSogc291cmNlID0gKGNvbnN0IFBpeGVsVHlwZSopc291cmNlQm1wLT5ieXRl
cygpOwotICAgIGludCBwYWRkaW5nOwotICAgIGludCBwYWRkZWRTb3VyY2VXOwotICAgIGlmIChJ
czE2Yml0KSB7Ci0gICAgICAgIHBhZGRpbmcgPSBkZXN0VyAmIDE7Ci0gICAgICAgIHBhZGRlZFNv
dXJjZVcgPSBzb3VyY2VXICsgKHNvdXJjZVcgJiAxKTsKLSAgICB9IGVsc2UgewotICAgICAgICBw
YWRkaW5nID0gMDsKLSAgICAgICAgcGFkZGVkU291cmNlVyA9IHNvdXJjZVc7Ci0gICAgfQotICAg
IGlmIChpc1plcm8odHJhbnNmb3JtLm1fc2luQSkpIHsKLSAgICAgICAgaW50IGNvc0EgPSB0cmFu
c2Zvcm0ubV9jb3NBID4gMCA/IDEgOiAtMTsKLSAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBk
ZXN0SDsgKyt5KSB7Ci0gICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IGRlc3RXOyArK3gp
IHsKLSAgICAgICAgICAgICAgICBpbnQgeDEgPSB4ICsgdHJhbnNmb3JtLm1fcHJlU2hpZnRYOwot
ICAgICAgICAgICAgICAgIGludCB5MSA9IHkgKyB0cmFuc2Zvcm0ubV9wcmVTaGlmdFk7Ci0gICAg
ICAgICAgICAgICAgaW50IHNyY1ggPSB4MSAqIGNvc0EgKyB0cmFuc2Zvcm0ubV9wb3N0U2hpZnRY
OwotICAgICAgICAgICAgICAgIGludCBzcmNZID0geTEgKiBjb3NBIC0gdHJhbnNmb3JtLm1fcG9z
dFNoaWZ0WTsKLSAgICAgICAgICAgICAgICBpZiAoc3JjWCA+PSAwICYmIHNyY1ggPD0gc291cmNl
VyAmJiBzcmNZID49IDAgJiYgc3JjWSA8PSBzb3VyY2VIKQotICAgICAgICAgICAgICAgICAgICAq
ZGVzdCsrID0gc291cmNlW3NyY1kgKiBwYWRkZWRTb3VyY2VXICsgc3JjWF0gfCAweEZGMDAwMDAw
OwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyB8PSAw
eEZGOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdCArPSBwYWRkaW5nOwotICAgICAg
ICB9Ci0gICAgfSBlbHNlIGlmIChpc1plcm8odHJhbnNmb3JtLm1fY29zQSkpIHsKLSAgICAgICAg
aW50IHNpbkEgPSB0cmFuc2Zvcm0ubV9zaW5BID4gMCA/IDEgOiAtMTsKLSAgICAgICAgZm9yIChp
bnQgeSA9IDA7IHkgPCBkZXN0SDsgKyt5KSB7Ci0gICAgICAgICAgICBmb3IgKGludCB4ID0gMDsg
eCA8IGRlc3RXOyArK3gpIHsKLSAgICAgICAgICAgICAgICBpbnQgeDEgPSB4ICsgdHJhbnNmb3Jt
Lm1fcHJlU2hpZnRYOwotICAgICAgICAgICAgICAgIGludCB5MSA9IHkgKyB0cmFuc2Zvcm0ubV9w
cmVTaGlmdFk7Ci0gICAgICAgICAgICAgICAgaW50IHNyY1ggPSB5MSAqIHNpbkEgKyB0cmFuc2Zv
cm0ubV9wb3N0U2hpZnRYOwotICAgICAgICAgICAgICAgIGludCBzcmNZID0gLXgxICogc2luQSAr
IHRyYW5zZm9ybS5tX3Bvc3RTaGlmdFk7Ci0gICAgICAgICAgICAgICAgaWYgKHNyY1ggPj0gMCAm
JiBzcmNYIDw9IHNvdXJjZVcgJiYgc3JjWSA+PSAwICYmIHNyY1kgPD0gc291cmNlSCkKLSAgICAg
ICAgICAgICAgICAgICAgKmRlc3QrKyA9IHNvdXJjZVtzcmNZICogcGFkZGVkU291cmNlVyArIHNy
Y1hdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdCArPSBwYWRkaW5nOwotICAgICAg
ICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBkZXN0SDsgKyt5
KSB7Ci0gICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IGRlc3RXOyArK3gpIHsKLSAgICAg
ICAgICAgICAgICAvLyBGSVhNRTogZm9yIGJlc3QgcXVhbGl0eSwgd2Ugc2hvdWxkIGdldCB3ZWln
aHRlZCBzdW0gb2YgZm91ciBuZWlnaGJvdXJzLAotICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGF0
IHdpbGwgYmUgdG9vIGV4cGVuc2l2ZQotICAgICAgICAgICAgICAgIGludCBzcmNYLCBzcmNZOwot
ICAgICAgICAgICAgICAgIHRyYW5zZm9ybS5tYXAoeCwgeSwgJnNyY1gsICZzcmNZKTsKLSAgICAg
ICAgICAgICAgICBpZiAoc3JjWCA+PSAwICYmIHNyY1ggPD0gc291cmNlVyAmJiBzcmNZID49IDAg
JiYgc3JjWSA8PSBzb3VyY2VIKQotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gc291cmNl
W3NyY1kgKiBwYWRkZWRTb3VyY2VXICsgc3JjWF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICBkZXN0ICs9IHBhZGRpbmc7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHJv
dGF0ZUJpdG1hcChTaGFyZWRCaXRtYXAqIGRlc3RCbXAsIGNvbnN0IFNoYXJlZEJpdG1hcCogc291
cmNlQm1wLCBjb25zdCBSb3RhdGlvblRyYW5zZm9ybSYgdHJhbnNmb3JtKQotewotICAgIEFTU0VS
VChkZXN0Qm1wLT5pczE2Yml0KCkgPT0gc291cmNlQm1wLT5pczE2Yml0KCkpOwotICAgIGlmIChk
ZXN0Qm1wLT5pczE2Yml0KCkpCi0gICAgICAgIF9yb3RhdGVCaXRtYXA8dW5zaWduZWQgc2hvcnQs
IHRydWU+KGRlc3RCbXAsIHNvdXJjZUJtcCwgdHJhbnNmb3JtKTsKLSAgICBlbHNlCi0gICAgICAg
IF9yb3RhdGVCaXRtYXA8dW5zaWduZWQsIGZhbHNlPihkZXN0Qm1wLCBzb3VyY2VCbXAsIHRyYW5z
Zm9ybSk7Ci19Ci0KLWNsYXNzIFRyYW5zcGFyZW50TGF5ZXJEQyA6IE5vbmNvcHlhYmxlIHsKLXB1
YmxpYzoKLSAgICBUcmFuc3BhcmVudExheWVyREMoR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2
YXRlKiBkYXRhLCBJbnRSZWN0JiBvcmlnUmVjdCwgY29uc3QgSW50UmVjdCogcmVjdEJlZm9yZVRy
YW5zZm9ybSA9IDAsIGludCBhbHBoYSA9IDI1NSwgYm9vbCBwYWludEltYWdlID0gZmFsc2UpOwot
ICAgIH5UcmFuc3BhcmVudExheWVyREMoKTsKLQotICAgIEhEQyBoZGMoKSBjb25zdCB7IHJldHVy
biBtX21lbURjOyB9Ci0gICAgY29uc3QgUkVDVCYgcmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fYm1w
UmVjdDsgfQotICAgIEludFNpemUgdG9TaGlmdCgpIGNvbnN0IHsgcmV0dXJuIEludFNpemUobV9i
bXBSZWN0LmxlZnQgLSBtX29yaWdSZWN0LngoKSwgbV9ibXBSZWN0LnRvcCAtIG1fb3JpZ1JlY3Qu
eSgpKTsgfQotICAgIHZvaWQgZmlsbEFscGhhQ2hhbm5lbCgpOwotCi1wcml2YXRlOgotICAgIEdy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSogbV9kYXRhOwotICAgIEludFJlY3QgbV9vcmln
UmVjdDsKLSAgICBJbnRSZWN0IG1fcm90YXRlZE9yaWdSZWN0OwotICAgIEhEQyBtX21lbURjOwot
ICAgIFJlZlB0cjxTaGFyZWRCaXRtYXA+IG1fYml0bWFwOwotICAgIFJlZlB0cjxTaGFyZWRCaXRt
YXA+IG1fcm90YXRlZEJpdG1hcDsKLSAgICBSRUNUIG1fYm1wUmVjdDsKLSAgICB1bnNpZ25lZCBt
X2tleTE7Ci0gICAgdW5zaWduZWQgbV9rZXkyOwotICAgIFJvdGF0aW9uVHJhbnNmb3JtIG1fcm90
YXRpb247Ci0gICAgZmxvYXQgbV9vbGRPcGFjaXR5OwotICAgIEFscGhhUGFpbnRUeXBlIG1fYWxw
aGFQYWludFR5cGU7Ci19OwotCi1UcmFuc3BhcmVudExheWVyREM6OlRyYW5zcGFyZW50TGF5ZXJE
QyhHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUqIGRhdGEsIEludFJlY3QmIG9yaWdSZWN0
LCBjb25zdCBJbnRSZWN0KiByZWN0QmVmb3JlVHJhbnNmb3JtLCBpbnQgYWxwaGEsIGJvb2wgcGFp
bnRJbWFnZSkKLTogbV9kYXRhKGRhdGEpCi0sIG1fb3JpZ1JlY3Qob3JpZ1JlY3QpCi0sIG1fb2xk
T3BhY2l0eShkYXRhLT5tX29wYWNpdHkpCi0vLyBtX2tleTEgYW5kIG1fa2V5MiBhcmUgbm90IGlu
aXRhbGl6ZWQgaGVyZS4gVGhleSBhcmUgdXNlZCBvbmx5IGluIHRoZSBjYXNlIHRoYXQKLS8vIFNo
YXJlZEJpdG1hcDo6Z2V0REMoKSBpcyBjYWxsZWQsIEkuRS4sIHdoZW4gbV9iaXRtYXAgaXMgbm90
IG51bGwuCi17Ci0gICAgbV9kYXRhLT5tX29wYWNpdHkgKj0gYWxwaGEgLyAyNTUuOwotICAgIGJv
b2wgbXVzdENyZWF0ZUxheWVyOwotICAgIGlmICghbV9kYXRhLT5oYXNBbHBoYSgpKSB7Ci0gICAg
ICAgIG11c3RDcmVhdGVMYXllciA9IGZhbHNlOwotICAgICAgICBtX2FscGhhUGFpbnRUeXBlID0g
QWxwaGFQYWludE5vbmU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbXVzdENyZWF0ZUxheWVyID0g
dHJ1ZTsKLSAgICAgICAgbV9hbHBoYVBhaW50VHlwZSA9IHBhaW50SW1hZ2UgPyBBbHBoYVBhaW50
SW1hZ2UgOiBBbHBoYVBhaW50T3RoZXI7Ci0gICAgfQotICAgIGlmIChyZWN0QmVmb3JlVHJhbnNm
b3JtICYmICFpc1plcm8obV9kYXRhLT5tX3RyYW5zZm9ybS5iKCkpKSB7Ci0gICAgICAgIG1fcm90
YXRlZE9yaWdSZWN0ID0gb3JpZ1JlY3Q7Ci0gICAgICAgIG1fcm90YXRlZEJpdG1hcCA9IG1fZGF0
YS0+Z2V0VHJhbnNwYXJlbnRMYXllckJpdG1hcChtX3JvdGF0ZWRPcmlnUmVjdCwgbV9hbHBoYVBh
aW50VHlwZSwgbV9ibXBSZWN0LCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgIGlmIChtX3JvdGF0ZWRC
aXRtYXApIHsKLSAgICAgICAgICAgIGRvdWJsZSBhID0gbV9kYXRhLT5tX3RyYW5zZm9ybS5hKCk7
Ci0gICAgICAgICAgICBkb3VibGUgYiA9IG1fZGF0YS0+bV90cmFuc2Zvcm0uYigpOwotICAgICAg
ICAgICAgZG91YmxlIGMgPSBfaHlwb3QoYSwgYik7Ci0gICAgICAgICAgICBtX3JvdGF0aW9uLm1f
Y29zQSA9IGEgLyBjOwotICAgICAgICAgICAgbV9yb3RhdGlvbi5tX3NpbkEgPSBiIC8gYzsKLQot
ICAgICAgICAgICAgaW50IGNlbnRlclggPSBvcmlnUmVjdC54KCkgKyBvcmlnUmVjdC53aWR0aCgp
IC8gMjsKLSAgICAgICAgICAgIGludCBjZW50ZXJZID0gb3JpZ1JlY3QueSgpICsgb3JpZ1JlY3Qu
aGVpZ2h0KCkgLyAyOwotICAgICAgICAgICAgbV9yb3RhdGlvbi5tX3ByZVNoaWZ0WCA9IC1jZW50
ZXJYOwotICAgICAgICAgICAgbV9yb3RhdGlvbi5tX3ByZVNoaWZ0WSA9IC1jZW50ZXJZOwotICAg
ICAgICAgICAgbV9yb3RhdGlvbi5tX3Bvc3RTaGlmdFggPSBjZW50ZXJYOwotICAgICAgICAgICAg
bV9yb3RhdGlvbi5tX3Bvc3RTaGlmdFkgPSBjZW50ZXJZOwotCi0gICAgICAgICAgICBtX29yaWdS
ZWN0ID0gbWFwUmVjdChtX3JvdGF0ZWRPcmlnUmVjdCwgbV9yb3RhdGlvbik7Ci0KLSAgICAgICAg
ICAgIG1fcm90YXRpb24ubV9wcmVTaGlmdFggKz0gbV9yb3RhdGVkT3JpZ1JlY3QueCgpOwotICAg
ICAgICAgICAgbV9yb3RhdGlvbi5tX3ByZVNoaWZ0WSArPSBtX3JvdGF0ZWRPcmlnUmVjdC55KCk7
Ci0gICAgICAgICAgICBtX3JvdGF0aW9uLm1fcG9zdFNoaWZ0WCAtPSBtX29yaWdSZWN0LngoKTsK
LSAgICAgICAgICAgIG1fcm90YXRpb24ubV9wb3N0U2hpZnRZIC09IG1fb3JpZ1JlY3QueSgpOwot
Ci0gICAgICAgICAgICBGbG9hdFBvaW50IHRvcExlZnQgPSBtX2RhdGEtPm1fdHJhbnNmb3JtLm1h
cFBvaW50KEZsb2F0UG9pbnQocmVjdEJlZm9yZVRyYW5zZm9ybS0+dG9wTGVmdCgpKSk7Ci0gICAg
ICAgICAgICBGbG9hdFBvaW50IHRvcFJpZ2h0KHJlY3RCZWZvcmVUcmFuc2Zvcm0tPnJpZ2h0KCkg
LSAxLCByZWN0QmVmb3JlVHJhbnNmb3JtLT55KCkpOwotICAgICAgICAgICAgdG9wUmlnaHQgPSBt
X2RhdGEtPm1fdHJhbnNmb3JtLm1hcFBvaW50KHRvcFJpZ2h0KTsKLSAgICAgICAgICAgIEZsb2F0
UG9pbnQgYm90dG9tTGVmdChyZWN0QmVmb3JlVHJhbnNmb3JtLT54KCksIHJlY3RCZWZvcmVUcmFu
c2Zvcm0tPmJvdHRvbSgpIC0gMSk7Ci0gICAgICAgICAgICBib3R0b21MZWZ0ID0gbV9kYXRhLT5t
X3RyYW5zZm9ybS5tYXBQb2ludChib3R0b21MZWZ0KTsKLSAgICAgICAgICAgIEZsb2F0U2l6ZSBz
aWRlVG9wID0gdG9wUmlnaHQgLSB0b3BMZWZ0OwotICAgICAgICAgICAgRmxvYXRTaXplIHNpZGVM
ZWZ0ID0gYm90dG9tTGVmdCAtIHRvcExlZnQ7Ci0gICAgICAgICAgICBmbG9hdCB3aWR0aCA9IF9o
eXBvdChzaWRlVG9wLndpZHRoKCkgKyAxLCBzaWRlVG9wLmhlaWdodCgpICsgMSk7Ci0gICAgICAg
ICAgICBmbG9hdCBoZWlnaHQgPSBfaHlwb3Qoc2lkZUxlZnQud2lkdGgoKSArIDEsIHNpZGVMZWZ0
LmhlaWdodCgpICsgMSk7Ci0KLSAgICAgICAgICAgIG9yaWdSZWN0LmluZmxhdGVYKHN0YWJsZVJv
dW5kKCh3aWR0aCAtIG9yaWdSZWN0LndpZHRoKCkpICogMC41KSk7Ci0gICAgICAgICAgICBvcmln
UmVjdC5pbmZsYXRlWShzdGFibGVSb3VuZCgoaGVpZ2h0IC0gb3JpZ1JlY3QuaGVpZ2h0KCkpICog
MC41KSk7Ci0KLSAgICAgICAgICAgIG1fYml0bWFwID0gU2hhcmVkQml0bWFwOjpjcmVhdGVJbnN0
YW5jZShtX3JvdGF0ZWRCaXRtYXAtPmlzMTZiaXQoKSwgbV9vcmlnUmVjdC53aWR0aCgpLCBtX29y
aWdSZWN0LmhlaWdodCgpLCB0cnVlKTsKLSAgICAgICAgICAgIGlmIChtX2JpdG1hcCkKLSAgICAg
ICAgICAgICAgICByb3RhdGVCaXRtYXAobV9iaXRtYXAuZ2V0KCksIG1fcm90YXRlZEJpdG1hcC5n
ZXQoKSwgLW1fcm90YXRpb24pOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1f
cm90YXRlZEJpdG1hcCA9IDA7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UKLSAgICAgICAgbV9iaXRt
YXAgPSBtX2RhdGEtPmdldFRyYW5zcGFyZW50TGF5ZXJCaXRtYXAobV9vcmlnUmVjdCwgbV9hbHBo
YVBhaW50VHlwZSwgbV9ibXBSZWN0LCB0cnVlLCBtdXN0Q3JlYXRlTGF5ZXIpOwotICAgIGlmICht
X2JpdG1hcCkKLSAgICAgICAgbV9tZW1EYyA9IG1fYml0bWFwLT5nZXREQygmbV9rZXkxLCAmbV9r
ZXkyKTsKLSAgICBlbHNlCi0gICAgICAgIG1fbWVtRGMgPSBtX2RhdGEtPm1fZGM7Ci19Ci0KLVRy
YW5zcGFyZW50TGF5ZXJEQzo6flRyYW5zcGFyZW50TGF5ZXJEQygpCi17Ci0gICAgaWYgKG1fcm90
YXRlZEJpdG1hcCkgewotICAgICAgICBtX2JpdG1hcC0+cmVsZWFzZURDKG1fbWVtRGMsIG1fa2V5
MSwgbV9rZXkyKTsKLSAgICAgICAgbV9rZXkxID0gbV9rZXkyID0gMDsKLSAgICAgICAgcm90YXRl
Qml0bWFwKG1fcm90YXRlZEJpdG1hcC5nZXQoKSwgbV9iaXRtYXAuZ2V0KCksIG1fcm90YXRpb24p
OwotICAgICAgICBtX21lbURjID0gbV9yb3RhdGVkQml0bWFwLT5nZXREQygmbV9rZXkxLCAmbV9r
ZXkyKTsKLSAgICAgICAgbV9kYXRhLT5wYWludEJhY2tUcmFuc3BhcmVudExheWVyQml0bWFwKG1f
bWVtRGMsIG1fcm90YXRlZEJpdG1hcC5nZXQoKSwgbV9yb3RhdGVkT3JpZ1JlY3QsIG1fYWxwaGFQ
YWludFR5cGUsIG1fYm1wUmVjdCk7Ci0gICAgICAgIG1fcm90YXRlZEJpdG1hcC0+cmVsZWFzZURD
KG1fbWVtRGMsIG1fa2V5MSwgbV9rZXkyKTsKLSAgICB9IGVsc2UgaWYgKG1fYml0bWFwKSB7Ci0g
ICAgICAgIG1fZGF0YS0+cGFpbnRCYWNrVHJhbnNwYXJlbnRMYXllckJpdG1hcChtX21lbURjLCBt
X2JpdG1hcC5nZXQoKSwgbV9vcmlnUmVjdCwgbV9hbHBoYVBhaW50VHlwZSwgbV9ibXBSZWN0KTsK
LSAgICAgICAgbV9iaXRtYXAtPnJlbGVhc2VEQyhtX21lbURjLCBtX2tleTEsIG1fa2V5Mik7Ci0g
ICAgfQotICAgIG1fZGF0YS0+bV9vcGFjaXR5ID0gbV9vbGRPcGFjaXR5OwotfQotCi12b2lkIFRy
YW5zcGFyZW50TGF5ZXJEQzo6ZmlsbEFscGhhQ2hhbm5lbCgpCi17Ci0gICAgaWYgKCFtX2JpdG1h
cCB8fCAhbV9iaXRtYXAtPmlzMzJiaXQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgdW5zaWdu
ZWQqIHBpeGVscyA9ICh1bnNpZ25lZCopbV9iaXRtYXAtPmJ5dGVzKCk7Ci0gICAgY29uc3QgdW5z
aWduZWQqIGNvbnN0IHBpeGVsc0VuZCA9IHBpeGVscyArIG1fYml0bWFwLT5iaXRtYXBJbmZvKCku
bnVtUGl4ZWxzKCk7Ci0gICAgd2hpbGUgKHBpeGVscyA8IHBpeGVsc0VuZCkgewotICAgICAgICAq
cGl4ZWxzIHw9IDB4RkYwMDAwMDA7Ci0gICAgICAgICsrcGl4ZWxzOwotICAgIH0KLX0KLQotY2xh
c3MgU2NvcGVEQ1Byb3ZpZGVyIDogTm9uY29weWFibGUgewotcHVibGljOgotICAgIGV4cGxpY2l0
IFNjb3BlRENQcm92aWRlcihHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUqIGRhdGEpCi0g
ICAgICAgIDogbV9kYXRhKGRhdGEpCi0gICAgewotICAgICAgICBpZiAobV9kYXRhLT5tX2JpdG1h
cCkKLSAgICAgICAgICAgIG1fZGF0YS0+bV9kYyA9IG1fZGF0YS0+bV9iaXRtYXAtPmdldERDKCZt
X2tleTEsICZtX2tleTIpOwotICAgIH0KLSAgICB+U2NvcGVEQ1Byb3ZpZGVyKCkKLSAgICB7Ci0g
ICAgICAgIGlmIChtX2RhdGEtPm1fYml0bWFwKSB7Ci0gICAgICAgICAgICBtX2RhdGEtPm1fYml0
bWFwLT5yZWxlYXNlREMobV9kYXRhLT5tX2RjLCBtX2tleTEsIG1fa2V5Mik7Ci0gICAgICAgICAg
ICBtX2RhdGEtPm1fZGMgPSAwOwotICAgICAgICB9Ci0gICAgfQotcHJpdmF0ZToKLSAgICBHcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUqIG1fZGF0YTsKLSAgICB1bnNpZ25lZCBtX2tleTE7
Ci0gICAgdW5zaWduZWQgbV9rZXkyOwotfTsKLQotCi1HcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNz
Q29udGV4dChQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCogZGMpCi06IG1fY29tbW9uKGNyZWF0ZUdy
YXBoaWNzQ29udGV4dFByaXZhdGUoKSkKLSwgbV9kYXRhKG5ldyBHcmFwaGljc0NvbnRleHRQbGF0
Zm9ybVByaXZhdGUoZGMpKQotewotfQotCi1HcmFwaGljc0NvbnRleHQ6On5HcmFwaGljc0NvbnRl
eHQoKQotewotICAgIGRlc3Ryb3lHcmFwaGljc0NvbnRleHRQcml2YXRlKG1fY29tbW9uKTsKLSAg
ICBkZWxldGUgbV9kYXRhOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0Qml0bWFwKFBh
c3NSZWZQdHI8U2hhcmVkQml0bWFwPiBibXApCi17Ci0gICAgQVNTRVJUKCFtX2RhdGEtPm1fZGMp
OwotICAgIG1fZGF0YS0+bV9iaXRtYXAgPSBibXA7Ci19Ci0KLUhEQyBHcmFwaGljc0NvbnRleHQ6
OmdldFdpbmRvd3NDb250ZXh0KGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGJvb2wgc3VwcG9ydEFs
cGhhQmxlbmQsIGJvb2wgbWF5Q3JlYXRlQml0bWFwKQotewotICAgIG5vdEltcGxlbWVudGVkKCk7
Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpyZWxlYXNlV2luZG93c0NvbnRleHQoSERDIGhkYywgY29uc3QgSW50UmVj
dCYgZHN0UmVjdCwgYm9vbCBzdXBwb3J0QWxwaGFCbGVuZCwgYm9vbCBtYXlDcmVhdGVCaXRtYXAp
Ci17Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNhdmVQbGF0Zm9ybVN0YXRlKCkKLXsKLSAgICBtX2Rh
dGEtPnNhdmUoKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnJlc3RvcmVQbGF0Zm9ybVN0
YXRlKCkKLXsKLSAgICBtX2RhdGEtPnJlc3RvcmUoKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQ6OmRyYXdSZWN0KGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgaWYgKCFtX2RhdGEtPm1f
b3BhY2l0eSB8fCBwYWludGluZ0Rpc2FibGVkKCkgfHwgcmVjdC5pc0VtcHR5KCkpCi0gICAgICAg
IHJldHVybjsKLQotICAgIFNjb3BlRENQcm92aWRlciBkY1Byb3ZpZGVyKG1fZGF0YSk7Ci0gICAg
aWYgKCFtX2RhdGEtPm1fZGMpCi0gICAgICAgIHJldHVybjsKLQotICAgIEludFJlY3QgdHJSZWN0
ID0gbV9kYXRhLT5tYXBSZWN0KHJlY3QpOwotICAgIFRyYW5zcGFyZW50TGF5ZXJEQyB0cmFuc3Bh
cmVudERDKG1fZGF0YSwgdHJSZWN0LCAmcmVjdCk7Ci0gICAgSERDIGRjID0gdHJhbnNwYXJlbnRE
Qy5oZGMoKTsKLSAgICBpZiAoIWRjKQotICAgICAgICByZXR1cm47Ci0gICAgdHJSZWN0Lm1vdmUo
dHJhbnNwYXJlbnREQy50b1NoaWZ0KCkpOwotCi0gICAgSEdESU9CSiBicnVzaCA9IDA7Ci0gICAg
SEdESU9CSiBvbGRCcnVzaDsKLSAgICBpZiAoZmlsbENvbG9yKCkuYWxwaGEoKSkgewotICAgICAg
ICBicnVzaCA9IGNyZWF0ZUJydXNoKGZpbGxDb2xvcigpKTsKLSAgICAgICAgb2xkQnJ1c2ggPSBT
ZWxlY3RPYmplY3QoZGMsIGJydXNoKTsKLSAgICB9IGVsc2UKLSAgICAgICAgU2VsZWN0T2JqZWN0
KGRjLCBHZXRTdG9ja09iamVjdChOVUxMX0JSVVNIKSk7Ci0KLSAgICBIR0RJT0JKIHBlbiA9IDA7
Ci0gICAgSEdESU9CSiBvbGRQZW47Ci0gICAgaWYgKHN0cm9rZVN0eWxlKCkgIT0gTm9TdHJva2Up
IHsKLSAgICAgICAgcGVuID0gY3JlYXRlUGVuKHN0cm9rZUNvbG9yKCksIHN0cm9rZVRoaWNrbmVz
cygpLCBzdHJva2VTdHlsZSgpKTsKLSAgICAgICAgb2xkUGVuID0gU2VsZWN0T2JqZWN0KGRjLCBw
ZW4pOwotICAgIH0gZWxzZQotICAgICAgICBTZWxlY3RPYmplY3QoZGMsIEdldFN0b2NrT2JqZWN0
KE5VTExfUEVOKSk7Ci0KLSAgICBpZiAoIWJydXNoICYmICFwZW4pCi0gICAgICAgIHJldHVybjsK
LQotICAgIGlmICh0clJlY3Qud2lkdGgoKSA8PSAwKQotICAgICAgICB0clJlY3Quc2V0V2lkdGgo
MSk7Ci0gICAgaWYgKHRyUmVjdC5oZWlnaHQoKSA8PSAwKQotICAgICAgICB0clJlY3Quc2V0SGVp
Z2h0KDEpOwotCi0gICAgUmVjdGFuZ2xlKGRjLCB0clJlY3QueCgpLCB0clJlY3QueSgpLCB0clJl
Y3QucmlnaHQoKSwgdHJSZWN0LmJvdHRvbSgpKTsKLQotICAgIGlmIChwZW4pIHsKLSAgICAgICAg
U2VsZWN0T2JqZWN0KGRjLCBvbGRQZW4pOwotICAgICAgICBEZWxldGVPYmplY3QocGVuKTsKLSAg
ICB9Ci0KLSAgICBpZiAoYnJ1c2gpIHsKLSAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBvbGRCcnVz
aCk7Ci0gICAgICAgIERlbGV0ZU9iamVjdChicnVzaCk7Ci0gICAgfQotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDo6ZHJhd0xpbmUoY29uc3QgSW50UG9pbnQmIHBvaW50MSwgY29uc3QgSW50UG9p
bnQmIHBvaW50MikKLXsKLSAgICBpZiAoIW1fZGF0YS0+bV9vcGFjaXR5IHx8IHBhaW50aW5nRGlz
YWJsZWQoKSB8fCBzdHJva2VTdHlsZSgpID09IE5vU3Ryb2tlIHx8ICFzdHJva2VDb2xvcigpLmFs
cGhhKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFNjb3BlRENQcm92aWRlciBkY1Byb3ZpZGVy
KG1fZGF0YSk7Ci0gICAgaWYgKCFtX2RhdGEtPm1fZGMpCi0gICAgICAgIHJldHVybjsKLQotICAg
IEludFBvaW50IHRyUG9pbnQxID0gbV9kYXRhLT5tYXBQb2ludChwb2ludDEpOwotICAgIEludFBv
aW50IHRyUG9pbnQyID0gbV9kYXRhLT5tYXBQb2ludChwb2ludDIpOwotCi0gICAgSW50UmVjdCBs
aW5lUmVjdCh0clBvaW50MSwgdHJQb2ludDIgLSB0clBvaW50MSk7Ci0gICAgbGluZVJlY3Quc2V0
SGVpZ2h0KGxpbmVSZWN0LmhlaWdodCgpICsgc3Ryb2tlVGhpY2tuZXNzKCkpOwotICAgIFRyYW5z
cGFyZW50TGF5ZXJEQyB0cmFuc3BhcmVudERDKG1fZGF0YSwgbGluZVJlY3QsIDAsIHN0cm9rZUNv
bG9yKCkuYWxwaGEoKSk7Ci0gICAgSERDIGRjID0gdHJhbnNwYXJlbnREQy5oZGMoKTsKLSAgICBp
ZiAoIWRjKQotICAgICAgICByZXR1cm47Ci0gICAgdHJQb2ludDEgKz0gdHJhbnNwYXJlbnREQy50
b1NoaWZ0KCk7Ci0gICAgdHJQb2ludDIgKz0gdHJhbnNwYXJlbnREQy50b1NoaWZ0KCk7Ci0KLSAg
ICBIR0RJT0JKIHBlbiA9IGNyZWF0ZVBlbihzdHJva2VDb2xvcigpLCBzdHJva2VUaGlja25lc3Mo
KSwgc3Ryb2tlU3R5bGUoKSk7Ci0gICAgSEdESU9CSiBvbGRQZW4gPSBTZWxlY3RPYmplY3QoZGMs
IHBlbik7Ci0KLSAgICBNb3ZlVG9FeChkYywgdHJQb2ludDEueCgpLCB0clBvaW50MS55KCksIDAp
OwotICAgIExpbmVUbyhkYywgdHJQb2ludDIueCgpLCB0clBvaW50Mi55KCkpOwotCi0gICAgU2Vs
ZWN0T2JqZWN0KGRjLCBvbGRQZW4pOwotICAgIERlbGV0ZU9iamVjdChwZW4pOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDo6ZHJhd0VsbGlwc2UoY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAg
ICBpZiAoIW1fZGF0YS0+bV9vcGFjaXR5IHx8IHBhaW50aW5nRGlzYWJsZWQoKSB8fCAoIWZpbGxD
b2xvcigpLmFscGhhKCkgJiYgc3Ryb2tlU3R5bGUoKSA9PSBOb1N0cm9rZSkpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIFNjb3BlRENQcm92aWRlciBkY1Byb3ZpZGVyKG1fZGF0YSk7Ci0gICAgaWYg
KCFtX2RhdGEtPm1fZGMpCi0gICAgICAgIHJldHVybjsKLQotICAgIEludFJlY3QgdHJSZWN0ID0g
bV9kYXRhLT5tYXBSZWN0KHJlY3QpOwotICAgIFRyYW5zcGFyZW50TGF5ZXJEQyB0cmFuc3BhcmVu
dERDKG1fZGF0YSwgdHJSZWN0LCAmcmVjdCk7Ci0gICAgSERDIGRjID0gdHJhbnNwYXJlbnREQy5o
ZGMoKTsKLSAgICBpZiAoIWRjKQotICAgICAgICByZXR1cm47Ci0gICAgdHJSZWN0Lm1vdmUodHJh
bnNwYXJlbnREQy50b1NoaWZ0KCkpOwotCi0gICAgSEdESU9CSiBicnVzaCA9IDA7Ci0gICAgSEdE
SU9CSiBvbGRCcnVzaDsKLSAgICBpZiAoZmlsbENvbG9yKCkuYWxwaGEoKSkgewotICAgICAgICBi
cnVzaCA9IGNyZWF0ZUJydXNoKGZpbGxDb2xvcigpKTsKLSAgICAgICAgb2xkQnJ1c2ggPSBTZWxl
Y3RPYmplY3QoZGMsIGJydXNoKTsKLSAgICB9IGVsc2UKLSAgICAgICAgU2VsZWN0T2JqZWN0KGRj
LCBHZXRTdG9ja09iamVjdChOVUxMX0JSVVNIKSk7Ci0gICAgSEdESU9CSiBwZW4gPSAwOwotICAg
IEhHRElPQkogb2xkUGVuOwotICAgIGlmIChzdHJva2VTdHlsZSgpICE9IE5vU3Ryb2tlKSB7Ci0g
ICAgICAgIHBlbiA9IGNyZWF0ZVBlbihzdHJva2VDb2xvcigpLCBzdHJva2VUaGlja25lc3MoKSwg
c3Ryb2tlU3R5bGUoKSk7Ci0gICAgICAgIG9sZFBlbiA9IFNlbGVjdE9iamVjdChkYywgcGVuKTsK
LSAgICB9IGVsc2UKLSAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBHZXRTdG9ja09iamVjdChOVUxM
X1BFTikpOwotCi0gICAgRWxsaXBzZShkYywgdHJSZWN0LngoKSwgdHJSZWN0LnkoKSwgdHJSZWN0
LnJpZ2h0KCksIHRyUmVjdC5ib3R0b20oKSk7Ci0KLSAgICBpZiAocGVuKSB7Ci0gICAgICAgIFNl
bGVjdE9iamVjdChkYywgb2xkUGVuKTsKLSAgICAgICAgRGVsZXRlT2JqZWN0KHBlbik7Ci0gICAg
fQotCi0gICAgaWYgKGJydXNoKSB7Ci0gICAgICAgIFNlbGVjdE9iamVjdChkYywgb2xkQnJ1c2gp
OwotICAgICAgICBEZWxldGVPYmplY3QoYnJ1c2gpOwotICAgIH0KLX0KLQotc3RhdGljIGlubGlu
ZSBib29sIGVxdWFsQW5nbGUoZG91YmxlIGEsIGRvdWJsZSBiKSAKLXsKLSAgICByZXR1cm4gZmFi
cyhhIC0gYikgPCAxRS01OwotfQotCi12b2lkIGdldEVsbGlwc2VQb2ludEJ5QW5nbGUoZG91Ymxl
IGFuZ2xlLCBkb3VibGUgYSwgZG91YmxlIGIsIGZsb2F0JiB4LCBmbG9hdCYgeSkKLXsKLSAgICB3
aGlsZSAoYW5nbGUgPCAwKQotICAgICAgICBhbmdsZSArPSAyICogcGlEb3VibGU7Ci0gICAgd2hp
bGUgKGFuZ2xlID49IDIgKiBwaURvdWJsZSkKLSAgICAgICAgYW5nbGUgLT0gMiAqIHBpRG91Ymxl
OwotCi0gICAgaWYgKGVxdWFsQW5nbGUoYW5nbGUsIDApIHx8IGVxdWFsQW5nbGUoYW5nbGUsIDIg
KiBwaURvdWJsZSkpIHsKLSAgICAgICAgeCA9IGE7Ci0gICAgICAgIHkgPSAwOwotICAgIH0gZWxz
ZSBpZiAoZXF1YWxBbmdsZShhbmdsZSwgcGlEb3VibGUpKSB7Ci0gICAgICAgIHggPSAtYTsKLSAg
ICAgICAgeSA9IDA7Ci0gICAgfSBlbHNlIGlmIChlcXVhbEFuZ2xlKGFuZ2xlLCAuNSAqIHBpRG91
YmxlKSkgewotICAgICAgICB4ID0gMDsKLSAgICAgICAgeSA9IGI7Ci0gICAgfSBlbHNlIGlmIChl
cXVhbEFuZ2xlKGFuZ2xlLCAxLjUgKiBwaURvdWJsZSkpIHsKLSAgICAgICAgeCA9IDA7Ci0gICAg
ICAgIHkgPSAtYjsKLSAgICB9IGVsc2UgewotICAgICAgICBkb3VibGUgayA9IHRhbihhbmdsZSk7
Ci0gICAgICAgIGRvdWJsZSBzcUEgPSBhICogYTsKLSAgICAgICAgZG91YmxlIHNxQiA9IGIgKiBi
OwotICAgICAgICBkb3VibGUgdG1wID0gMS4gLyAoMS4gLyBzcUEgKyAoayAqIGspIC8gc3FCKTsK
LSAgICAgICAgdG1wID0gdG1wIDw9IDAgPyAwIDogc3FydCh0bXApOwotICAgICAgICBpZiAoYW5n
bGUgPiAuNSAqIHBpRG91YmxlICYmIGFuZ2xlIDwgMS41ICogcGlEb3VibGUpCi0gICAgICAgICAg
ICB0bXAgPSAtdG1wOwotICAgICAgICB4ID0gdG1wOwotCi0gICAgICAgIGsgPSB0YW4oLjUgKiBw
aURvdWJsZSAtIGFuZ2xlKTsKLSAgICAgICAgdG1wID0gMS4gLyAoKGsgKiBrKSAvIHNxQSArIDEg
LyBzcUIpOwotICAgICAgICB0bXAgPSB0bXAgPD0gMCA/IDAgOiBzcXJ0KHRtcCk7Ci0gICAgICAg
IGlmIChhbmdsZSA+IHBpRG91YmxlKQotICAgICAgICAgICAgdG1wID0gLXRtcDsKLSAgICAgICAg
eSA9IHRtcDsKLSAgICB9Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzdHJva2VBcmMoY29u
c3QgSW50UmVjdCYgcmVjdCwgaW50IHN0YXJ0QW5nbGUsIGludCBhbmdsZVNwYW4pCi17Ci0gICAg
aWYgKCFtX2RhdGEtPm1fb3BhY2l0eSB8fCBwYWludGluZ0Rpc2FibGVkKCkgfHwgc3Ryb2tlU3R5
bGUoKSA9PSBOb1N0cm9rZSB8fCByZWN0LmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgU2NvcGVEQ1Byb3ZpZGVyIGRjUHJvdmlkZXIobV9kYXRhKTsKLSAgICBpZiAoIW1fZGF0YS0+
bV9kYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgSW50UmVjdCB0clJlY3QgPSBtX2RhdGEtPm1h
cFJlY3QocmVjdCk7Ci0gICAgVHJhbnNwYXJlbnRMYXllckRDIHRyYW5zcGFyZW50REMobV9kYXRh
LCB0clJlY3QsICZyZWN0KTsKLSAgICBIREMgZGMgPSB0cmFuc3BhcmVudERDLmhkYygpOwotICAg
IGlmICghZGMpCi0gICAgICAgIHJldHVybjsKLSAgICB0clJlY3QubW92ZSh0cmFuc3BhcmVudERD
LnRvU2hpZnQoKSk7Ci0KLSAgICBIR0RJT0JKIHBlbiA9IGNyZWF0ZVBlbihzdHJva2VDb2xvcigp
LCBzdHJva2VUaGlja25lc3MoKSwgc3Ryb2tlU3R5bGUoKSk7Ci0gICAgSEdESU9CSiBvbGRQZW4g
PSBTZWxlY3RPYmplY3QoZGMsIHBlbik7Ci0KLSAgICBkb3VibGUgYSA9IHRyUmVjdC53aWR0aCgp
ICogMC41OwotICAgIGRvdWJsZSBiID0gdHJSZWN0LmhlaWdodCgpICogMC41OwotICAgIGludCBj
ZW50ZXJYID0gc3RhYmxlUm91bmQodHJSZWN0LngoKSArIGEpOwotICAgIGludCBjZW50ZXJZID0g
c3RhYmxlUm91bmQodHJSZWN0LnkoKSArIGIpOwotICAgIGZsb2F0IGZzdGFydFgsIGZzdGFydFks
IGZlbmRYLCBmZW5kWTsKLSAgICBpbnQgc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFk7Ci0gICAg
Z2V0RWxsaXBzZVBvaW50QnlBbmdsZShkZWcycmFkKChkb3VibGUpc3RhcnRBbmdsZSksIGEsIGIs
IGZzdGFydFgsIGZzdGFydFkpOwotICAgIGdldEVsbGlwc2VQb2ludEJ5QW5nbGUoZGVnMnJhZCgo
ZG91YmxlKXN0YXJ0QW5nbGUgKyBhbmdsZVNwYW4pLCBhLCBiLCBmZW5kWCwgZmVuZFkpOwotICAg
IHN0YXJ0WCA9IHN0YWJsZVJvdW5kKGZzdGFydFgpOwotICAgIHN0YXJ0WSA9IHN0YWJsZVJvdW5k
KGZzdGFydFkpOwotICAgIGVuZFggPSBzdGFibGVSb3VuZChmZW5kWCk7Ci0gICAgZW5kWSA9IHN0
YWJsZVJvdW5kKGZlbmRZKTsKLQotICAgIHN0YXJ0WCArPSBjZW50ZXJYOwotICAgIHN0YXJ0WSA9
IGNlbnRlclkgLSBzdGFydFk7Ci0gICAgZW5kWCArPSBjZW50ZXJYOwotICAgIGVuZFkgPSBjZW50
ZXJZIC0gZW5kWTsKLSAgICBSRUNUIGNsaXBSZWN0OwotICAgIGlmIChzdGFydFggPCBlbmRYKSB7
Ci0gICAgICAgIGNsaXBSZWN0LmxlZnQgPSBzdGFydFg7Ci0gICAgICAgIGNsaXBSZWN0LnJpZ2h0
ID0gZW5kWDsKLSAgICB9IGVsc2UgewotICAgICAgICBjbGlwUmVjdC5sZWZ0ID0gZW5kWDsKLSAg
ICAgICAgY2xpcFJlY3QucmlnaHQgPSBzdGFydFg7Ci0gICAgfQotICAgIGlmIChzdGFydFkgPCBl
bmRZKSB7Ci0gICAgICAgIGNsaXBSZWN0LnRvcCA9IHN0YXJ0WTsKLSAgICAgICAgY2xpcFJlY3Qu
Ym90dG9tID0gZW5kWTsKLSAgICB9IGVsc2UgewotICAgICAgICBjbGlwUmVjdC50b3AgPSBlbmRZ
OwotICAgICAgICBjbGlwUmVjdC5ib3R0b20gPSBzdGFydFk7Ci0gICAgfQotCi0gICAgT3duUHRy
PEhSR04+IGNsaXBSZ24oQ3JlYXRlUmVjdFJnbigwLCAwLCAwLCAwKSk7Ci0gICAgYm9vbCBuZXdD
bGlwOwotICAgIGlmIChHZXRDbGlwUmduKGRjLCBjbGlwUmduLmdldCgpKSA8PSAwKSB7Ci0gICAg
ICAgIG5ld0NsaXAgPSB0cnVlOwotICAgICAgICBjbGlwUmduLnNldChDcmVhdGVSZWN0UmduKGNs
aXBSZWN0LmxlZnQsIGNsaXBSZWN0LnRvcCwgY2xpcFJlY3QucmlnaHQsIGNsaXBSZWN0LmJvdHRv
bSkpOwotICAgICAgICBTZWxlY3RDbGlwUmduKGRjLCBjbGlwUmduLmdldCgpKTsKLSAgICB9IGVs
c2UgewotICAgICAgICBuZXdDbGlwID0gZmFsc2U7Ci0gICAgICAgIEludGVyc2VjdENsaXBSZWN0
KGRjLCBjbGlwUmVjdC5sZWZ0LCBjbGlwUmVjdC50b3AsIGNsaXBSZWN0LnJpZ2h0LCBjbGlwUmVj
dC5ib3R0b20pOwotICAgIH0KLQotICAgIEhHRElPQkogb2xkQnJ1c2ggPSBTZWxlY3RPYmplY3Qo
ZGMsIEdldFN0b2NrT2JqZWN0KE5VTExfQlJVU0gpKTsKLSAgICBFbGxpcHNlKGRjLCB0clJlY3Qu
eCgpLCB0clJlY3QueSgpLCB0clJlY3QucmlnaHQoKSwgdHJSZWN0LmJvdHRvbSgpKTsKLSAgICBT
ZWxlY3RPYmplY3QoZGMsIG9sZEJydXNoKTsKLQotICAgIGlmIChuZXdDbGlwKQotICAgICAgICBT
ZWxlY3RDbGlwUmduKGRjLCAwKTsKLSAgICBlbHNlCi0gICAgICAgIFNlbGVjdENsaXBSZ24oZGMs
IGNsaXBSZ24uZ2V0KCkpOwotCi0gICAgU2VsZWN0T2JqZWN0KGRjLCBvbGRQZW4pOwotICAgIERl
bGV0ZU9iamVjdChwZW4pOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0NvbnZleFBv
bHlnb24oc2l6ZV90IG5wb2ludHMsIGNvbnN0IEZsb2F0UG9pbnQqIHBvaW50cywgYm9vbCBzaG91
bGRBbnRpYWxpYXMpCi17Ci0gICAgaWYgKCFtX2RhdGEtPm1fb3BhY2l0eSB8fCBwYWludGluZ0Rp
c2FibGVkKCkgfHwgbnBvaW50cyA8PSAxIHx8ICFwb2ludHMpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIFNjb3BlRENQcm92aWRlciBkY1Byb3ZpZGVyKG1fZGF0YSk7Ci0gICAgaWYgKCFtX2RhdGEt
Pm1fZGMpCi0gICAgICAgIHJldHVybjsKLQotICAgIFZlY3RvcjxQT0lOVCwgMjA+IHdpblBvaW50
cyhucG9pbnRzKTsKLSAgICBGbG9hdFBvaW50IHRyUG9pbnQgPSBtX2RhdGEtPm1hcFBvaW50KHBv
aW50c1swXSk7Ci0gICAgd2luUG9pbnRzWzBdLnggPSBzdGFibGVSb3VuZCh0clBvaW50LngoKSk7
Ci0gICAgd2luUG9pbnRzWzBdLnkgPSBzdGFibGVSb3VuZCh0clBvaW50LnkoKSk7Ci0gICAgUkVD
VCByZWN0ID0geyB3aW5Qb2ludHNbMF0ueCwgd2luUG9pbnRzWzBdLnksIHdpblBvaW50c1swXS54
LCB3aW5Qb2ludHNbMF0ueSB9OwotICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbnBvaW50czsg
KytpKSB7Ci0gICAgICAgIHRyUG9pbnQgPSBtX2RhdGEtPm1hcFBvaW50KHBvaW50c1tpXSk7Ci0g
ICAgICAgIHdpblBvaW50c1tpXS54ID0gc3RhYmxlUm91bmQodHJQb2ludC54KCkpOwotICAgICAg
ICB3aW5Qb2ludHNbaV0ueSA9IHN0YWJsZVJvdW5kKHRyUG9pbnQueSgpKTsKLSAgICAgICAgaWYg
KHJlY3QubGVmdCA+IHdpblBvaW50c1tpXS54KQotICAgICAgICAgICAgcmVjdC5sZWZ0ID0gd2lu
UG9pbnRzW2ldLng7Ci0gICAgICAgIGVsc2UgaWYgKHJlY3QucmlnaHQgPCB3aW5Qb2ludHNbaV0u
eCkKLSAgICAgICAgICAgIHJlY3QucmlnaHQgPSB3aW5Qb2ludHNbaV0ueDsKLSAgICAgICAgaWYg
KHJlY3QudG9wID4gd2luUG9pbnRzW2ldLnkpCi0gICAgICAgICAgICByZWN0LnRvcCA9IHdpblBv
aW50c1tpXS55OwotICAgICAgICBlbHNlIGlmIChyZWN0LmJvdHRvbSA8IHdpblBvaW50c1tpXS55
KQotICAgICAgICAgICAgcmVjdC5ib3R0b20gPSB3aW5Qb2ludHNbaV0ueTsKLSAgICB9Ci0gICAg
cmVjdC5ib3R0b20gKz0gMTsKLSAgICByZWN0LnJpZ2h0ICs9IDE7Ci0KLSAgICBJbnRSZWN0IGlu
dFJlY3QocmVjdCk7Ci0gICAgVHJhbnNwYXJlbnRMYXllckRDIHRyYW5zcGFyZW50REMobV9kYXRh
LCBpbnRSZWN0KTsKLSAgICBIREMgZGMgPSB0cmFuc3BhcmVudERDLmhkYygpOwotICAgIGlmICgh
ZGMpCi0gICAgICAgIHJldHVybjsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnBvaW50
czsgKytpKSB7Ci0gICAgICAgIHdpblBvaW50c1tpXS54ICs9IHRyYW5zcGFyZW50REMudG9TaGlm
dCgpLndpZHRoKCk7Ci0gICAgICAgIHdpblBvaW50c1tpXS55ICs9IHRyYW5zcGFyZW50REMudG9T
aGlmdCgpLmhlaWdodCgpOwotICAgIH0KLQotICAgIEhHRElPQkogYnJ1c2ggPSAwOwotICAgIEhH
RElPQkogb2xkQnJ1c2g7Ci0gICAgaWYgKGZpbGxDb2xvcigpLmFscGhhKCkpIHsKLSAgICAgICAg
YnJ1c2ggPSBjcmVhdGVCcnVzaChmaWxsQ29sb3IoKSk7Ci0gICAgICAgIG9sZEJydXNoID0gU2Vs
ZWN0T2JqZWN0KGRjLCBicnVzaCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIFNlbGVjdE9iamVjdChk
YywgR2V0U3RvY2tPYmplY3QoTlVMTF9CUlVTSCkpOwotCi0gICAgSEdESU9CSiBwZW4gPSAwOwot
ICAgIEhHRElPQkogb2xkUGVuOwotICAgIGlmIChzdHJva2VTdHlsZSgpICE9IE5vU3Ryb2tlKSB7
Ci0gICAgICAgIHBlbiA9IGNyZWF0ZVBlbihzdHJva2VDb2xvcigpLCBzdHJva2VUaGlja25lc3Mo
KSwgc3Ryb2tlU3R5bGUoKSk7Ci0gICAgICAgIG9sZFBlbiA9IFNlbGVjdE9iamVjdChkYywgcGVu
KTsKLSAgICB9IGVsc2UKLSAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBHZXRTdG9ja09iamVjdChO
VUxMX1BFTikpOwotCi0gICAgaWYgKCFicnVzaCAmJiAhcGVuKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBQb2x5Z29uKGRjLCB3aW5Qb2ludHMuZGF0YSgpLCBucG9pbnRzKTsKLQotICAgIGlmIChw
ZW4pIHsKLSAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBvbGRQZW4pOwotICAgICAgICBEZWxldGVP
YmplY3QocGVuKTsKLSAgICB9Ci0KLSAgICBpZiAoYnJ1c2gpIHsKLSAgICAgICAgU2VsZWN0T2Jq
ZWN0KGRjLCBvbGRCcnVzaCk7Ci0gICAgICAgIERlbGV0ZU9iamVjdChicnVzaCk7Ci0gICAgfQot
fQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0
LCBjb25zdCBDb2xvciYgY29sb3IsIENvbG9yU3BhY2UgY29sb3JTcGFjZSkKLXsKLSAgICBpZiAo
cGFpbnRpbmdEaXNhYmxlZCgpIHx8ICFtX2RhdGEtPm1fb3BhY2l0eSkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgaW50IGFscGhhID0gY29sb3IuYWxwaGEoKTsKLSAgICBpZiAoIWFscGhhKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBTY29wZURDUHJvdmlkZXIgZGNQcm92aWRlcihtX2RhdGEpOwot
ICAgIGlmICghbV9kYXRhLT5tX2RjKQotICAgICAgICByZXR1cm47Ci0KLSAgICBJbnRSZWN0IGlu
dFJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KHJlY3QpOwotICAgIFRyYW5zcGFyZW50TGF5ZXJEQyB0
cmFuc3BhcmVudERDKG1fZGF0YSwgbV9kYXRhLT5tYXBSZWN0KGludFJlY3QpLCAmaW50UmVjdCwg
YWxwaGEpOwotCi0gICAgaWYgKCF0cmFuc3BhcmVudERDLmhkYygpKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBPd25QdHI8SEJSVVNIPiBoYnJ1c2goQ3JlYXRlU29saWRCcnVzaChSR0IoY29sb3Iu
cmVkKCksIGNvbG9yLmdyZWVuKCksIGNvbG9yLmJsdWUoKSkpKTsKLSAgICBGaWxsUmVjdCh0cmFu
c3BhcmVudERDLmhkYygpLCAmdHJhbnNwYXJlbnREQy5yZWN0KCksIGhicnVzaC5nZXQoKSk7Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwKGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKLXsK
LSAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAo
IW1fZGF0YS0+bV9kYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgSW50UmVjdCB0clJlY3QgPSBl
bmNsb3NpbmdJbnRSZWN0KG1fZGF0YS0+bWFwUmVjdChyZWN0KSk7Ci0KLSAgICBPd25QdHI8SFJH
Tj4gY2xpcFJnbihDcmVhdGVSZWN0UmduKDAsIDAsIDAsIDApKTsKLSAgICBpZiAoR2V0Q2xpcFJn
bihtX2RhdGEtPm1fZGMsIGNsaXBSZ24uZ2V0KCkpID4gMCkKLSAgICAgICAgSW50ZXJzZWN0Q2xp
cFJlY3QobV9kYXRhLT5tX2RjLCB0clJlY3QueCgpLCB0clJlY3QueSgpLCB0clJlY3QucmlnaHQo
KSwgdHJSZWN0LmJvdHRvbSgpKTsKLSAgICBlbHNlIHsKLSAgICAgICAgY2xpcFJnbi5zZXQoQ3Jl
YXRlUmVjdFJnbih0clJlY3QueCgpLCB0clJlY3QueSgpLCB0clJlY3QucmlnaHQoKSwgdHJSZWN0
LmJvdHRvbSgpKSk7Ci0gICAgICAgIFNlbGVjdENsaXBSZ24obV9kYXRhLT5tX2RjLCBjbGlwUmdu
LmdldCgpKTsKLSAgICB9Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwT3V0KGNvbnN0
IEludFJlY3QmIHJlY3QpCi17Ci0gICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgaWYgKCFtX2RhdGEtPm1fZGMpCi0gICAgICAgIHJldHVybjsKLQotICAg
IEludFJlY3QgdHJSZWN0ID0gbV9kYXRhLT5tYXBSZWN0KHJlY3QpOwotCi0gICAgRXhjbHVkZUNs
aXBSZWN0KG1fZGF0YS0+bV9kYywgdHJSZWN0LngoKSwgdHJSZWN0LnkoKSwgdHJSZWN0LnJpZ2h0
KCksIHRyUmVjdC5ib3R0b20oKSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3Rm9j
dXNSaW5nKGNvbnN0IFZlY3RvcjxQYXRoPiYgcGF0aHMsIGludCB3aWR0aCwgaW50IG9mZnNldCwg
Y29uc3QgQ29sb3ImIGNvbG9yKQotewotICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQKLX0KLQotdm9p
ZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1c1JpbmcoY29uc3QgVmVjdG9yPEludFJlY3Q+JiBy
ZWN0cywgaW50IHdpZHRoLCBpbnQgb2Zmc2V0LCBjb25zdCBDb2xvciYgY29sb3IpCi17Ci0gICAg
aWYgKCFtX2RhdGEtPm1fb3BhY2l0eSB8fCBwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIFNjb3BlRENQcm92aWRlciBkY1Byb3ZpZGVyKG1fZGF0YSk7Ci0gICAgaWYg
KCFtX2RhdGEtPm1fZGMpCi0gICAgICAgIHJldHVybjsKLQotICAgIGludCByYWRpdXMgPSAod2lk
dGggLSAxKSAvIDI7Ci0gICAgb2Zmc2V0ICs9IHJhZGl1czsKLQotICAgIHVuc2lnbmVkIHJlY3RD
b3VudCA9IHJlY3RzLnNpemUoKTsKLSAgICBJbnRSZWN0IGZpbmFsRm9jdXNSZWN0OwotICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCByZWN0Q291bnQ7IGkrKykgewotICAgICAgICBJbnRSZWN0
IGZvY3VzUmVjdCA9IHJlY3RzW2ldOwotICAgICAgICBmb2N1c1JlY3QuaW5mbGF0ZShvZmZzZXQp
OwotICAgICAgICBmaW5hbEZvY3VzUmVjdC51bml0ZShmb2N1c1JlY3QpOwotICAgIH0KLQotICAg
IEludFJlY3QgaW50UmVjdCA9IGZpbmFsRm9jdXNSZWN0OwotICAgIEludFJlY3QgdHJSZWN0ID0g
bV9kYXRhLT5tYXBSZWN0KGZpbmFsRm9jdXNSZWN0KTsKLSAgICBUcmFuc3BhcmVudExheWVyREMg
dHJhbnNwYXJlbnREQyhtX2RhdGEsIHRyUmVjdCwgJmludFJlY3QpOwotICAgIEhEQyBkYyA9IHRy
YW5zcGFyZW50REMuaGRjKCk7Ci0gICAgaWYgKCFkYykKLSAgICAgICAgcmV0dXJuOwotICAgIHRy
UmVjdC5tb3ZlKHRyYW5zcGFyZW50REMudG9TaGlmdCgpKTsKLQotICAgIFJFQ1QgcmVjdCA9IHRy
UmVjdDsKLSAgICBEcmF3Rm9jdXNSZWN0KGRjLCAmcmVjdCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3ND
b250ZXh0OjpkcmF3TGluZUZvclRleHQoY29uc3QgSW50UG9pbnQmIG9yaWdpbiwgaW50IHdpZHRo
LCBib29sIHByaW50aW5nKQotewotICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAg
IHJldHVybjsKLQotICAgIFN0cm9rZVN0eWxlIG9sZFN0eWxlID0gc3Ryb2tlU3R5bGUoKTsKLSAg
ICBzZXRTdHJva2VTdHlsZShTb2xpZFN0cm9rZSk7Ci0gICAgZHJhd0xpbmUob3JpZ2luLCBvcmln
aW4gKyBJbnRTaXplKHdpZHRoLCAwKSk7Ci0gICAgc2V0U3Ryb2tlU3R5bGUob2xkU3R5bGUpOwot
fQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmVGb3JNaXNzcGVsbGluZ09yQmFkR3Jh
bW1hcihjb25zdCBJbnRQb2ludCYsIGludCB3aWR0aCwgYm9vbCBncmFtbWFyKQotewotICAgIG5v
dEltcGxlbWVudGVkKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybUZp
bGxDb2xvcihjb25zdCBDb2xvciYgY29sLCBDb2xvclNwYWNlIGNvbG9yU3BhY2UpCi17Ci0gICAg
bm90SW1wbGVtZW50ZWQoKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3Jt
U3Ryb2tlQ29sb3IoY29uc3QgQ29sb3ImIGNvbCwgQ29sb3JTcGFjZSBjb2xvclNwYWNlKQotewot
ICAgIG5vdEltcGxlbWVudGVkKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0
Zm9ybVN0cm9rZVRoaWNrbmVzcyhmbG9hdCBzdHJva2VUaGlja25lc3MpCi17Ci0gICAgbm90SW1w
bGVtZW50ZWQoKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFVSTEZvclJlY3QoY29u
c3QgS1VSTCYgbGluaywgY29uc3QgSW50UmVjdCYgZGVzdFJlY3QpCi17Ci0gICAgbm90SW1wbGVt
ZW50ZWQoKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmFkZElubmVyUm91bmRlZFJlY3RD
bGlwKGNvbnN0IEludFJlY3QmIHJlY3QsIGludCB0aGlja25lc3MpCi17Ci0gICAgLy8gV2UgY2Fu
IG9ubHkgY2xpcCByZWN0YW5nbGVzIG9uIFdJTkNFCi0gICAgY2xpcChyZWN0KTsKLX0KLQotdm9p
ZCBHcmFwaGljc0NvbnRleHQ6OmNsZWFyUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCi17Ci0g
ICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKG1f
ZGF0YS0+aGFzQWxwaGEoKSkgewotICAgICAgICBJbnRSZWN0IHRyUmVjdCA9IGVuY2xvc2luZ0lu
dFJlY3QobV9kYXRhLT5tYXBSZWN0KHJlY3QpKTsKLSAgICAgICAgbV9kYXRhLT5tX2JpdG1hcC0+
Y2xlYXJQaXhlbHModHJSZWN0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gCi0KLSAgICBmaWxs
UmVjdChyZWN0LCBDb2xvcihDb2xvcjo6d2hpdGUpLCBEZXZpY2VDb2xvclNwYWNlKTsKLX0KLQot
dm9pZCBHcmFwaGljc0NvbnRleHQ6OnN0cm9rZVJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0LCBm
bG9hdCB3aWR0aCkKLXsKLSAgICBpZiAoIW1fZGF0YS0+bV9vcGFjaXR5IHx8IHBhaW50aW5nRGlz
YWJsZWQoKSB8fCBzdHJva2VTdHlsZSgpID09IE5vU3Ryb2tlKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBTY29wZURDUHJvdmlkZXIgZGNQcm92aWRlcihtX2RhdGEpOwotICAgIGlmICghbV9kYXRh
LT5tX2RjKQotICAgICAgICByZXR1cm47Ci0KLSAgICBJbnRSZWN0IGludFJlY3QgPSBlbmNsb3Np
bmdJbnRSZWN0KHJlY3QpOwotICAgIEludFJlY3QgdHJSZWN0ID0gbV9kYXRhLT5tYXBSZWN0KGlu
dFJlY3QpOwotICAgIFRyYW5zcGFyZW50TGF5ZXJEQyB0cmFuc3BhcmVudERDKG1fZGF0YSwgdHJS
ZWN0LCAmaW50UmVjdCk7Ci0gICAgSERDIGRjID0gdHJhbnNwYXJlbnREQy5oZGMoKTsKLSAgICBp
ZiAoIWRjKQotICAgICAgICByZXR1cm47Ci0gICAgdHJSZWN0Lm1vdmUodHJhbnNwYXJlbnREQy50
b1NoaWZ0KCkpOwotCi0gICAgSEdESU9CSiBwZW4gPSBjcmVhdGVQZW4oc3Ryb2tlQ29sb3IoKSwg
c3Ryb2tlVGhpY2tuZXNzKCksIHN0cm9rZVN0eWxlKCkpOwotICAgIEhHRElPQkogb2xkUGVuID0g
U2VsZWN0T2JqZWN0KGRjLCBwZW4pOwotCi0gICAgaW50IHJpZ2h0ID0gdHJSZWN0LnJpZ2h0KCkg
LSAxOwotICAgIGludCBib3R0b20gPSB0clJlY3QuYm90dG9tKCkgLSAxOwotICAgIGNvbnN0IFBP
SU5UIGludFBvaW50c1s1XSA9Ci0gICAgewotICAgICAgICB7IHRyUmVjdC54KCksIHRyUmVjdC55
KCkgfSwKLSAgICAgICAgeyByaWdodCwgdHJSZWN0LnkoKSB9LAotICAgICAgICB7IHJpZ2h0LCBi
b3R0b20gfSwKLSAgICAgICAgeyB0clJlY3QueCgpLCBib3R0b20gfSwKLSAgICAgICAgeyB0clJl
Y3QueCgpLCB0clJlY3QueSgpIH0KLSAgICB9OwotCi0gICAgUG9seWxpbmUoZGMsIGludFBvaW50
cywgNSk7Ci0KLSAgICBTZWxlY3RPYmplY3QoZGMsIG9sZFBlbik7Ci0gICAgRGVsZXRlT2JqZWN0
KHBlbik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpiZWdpblRyYW5zcGFyZW5jeUxheWVy
KGZsb2F0IG9wYWNpdHkpCi17Ci0gICAgbV9kYXRhLT5zYXZlKCk7Ci0gICAgbV9kYXRhLT5tX29w
YWNpdHkgKj0gb3BhY2l0eTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmVuZFRyYW5zcGFy
ZW5jeUxheWVyKCkKLXsKLSAgICBtX2RhdGEtPnJlc3RvcmUoKTsKLX0KLQotdm9pZCBHcmFwaGlj
c0NvbnRleHQ6OmNvbmNhdENUTShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSkKLXsK
LSAgICBtX2RhdGEtPmNvbmNhdENUTSh0cmFuc2Zvcm0pOwotfQotCi1UcmFuc2Zvcm1hdGlvbk1h
dHJpeCYgR3JhcGhpY3NDb250ZXh0OjphZmZpbmVUcmFuc2Zvcm0oKQotewotICAgIHJldHVybiBt
X2RhdGEtPm1fdHJhbnNmb3JtOwotfQotCi1jb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgR3Jh
cGhpY3NDb250ZXh0OjphZmZpbmVUcmFuc2Zvcm0oKSBjb25zdAotewotICAgIHJldHVybiBtX2Rh
dGEtPm1fdHJhbnNmb3JtOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6cmVzZXRBZmZpbmVU
cmFuc2Zvcm0oKQotewotICAgIG1fZGF0YS0+bV90cmFuc2Zvcm0ubWFrZUlkZW50aXR5KCk7Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0Ojp0cmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSkKLXsK
LSAgICBtX2RhdGEtPnRyYW5zbGF0ZSh4LCB5KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6
OnJvdGF0ZShmbG9hdCByYWRpYW5zKQotewotICAgIG1fZGF0YS0+cm90YXRlKHJhZGlhbnMpOwot
fQotCi1JbnRQb2ludCBHcmFwaGljc0NvbnRleHQ6Om9yaWdpbigpCi17Ci0gICAgcmV0dXJuIG1f
ZGF0YS0+b3JpZ2luKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzY2FsZShjb25zdCBG
bG9hdFNpemUmIHNpemUpCi17Ci0gICAgbV9kYXRhLT5zY2FsZShzaXplKTsKLX0KLQotdm9pZCBH
cmFwaGljc0NvbnRleHQ6OnNldExpbmVDYXAoTGluZUNhcCBsaW5lQ2FwKQotewotICAgIG5vdElt
cGxlbWVudGVkKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRMaW5lSm9pbihMaW5l
Sm9pbiBsaW5lSm9pbikKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDo6c2V0TWl0ZXJMaW1pdChmbG9hdCBtaXRlcikKLXsKLSAgICBub3RJbXBsZW1l
bnRlZCgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0QWxwaGEoZmxvYXQgYWxwaGEp
Ci17Ci0gICAgbV9kYXRhLT5tX29wYWNpdHkgPSBhbHBoYTsKLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQ6OnNldENvbXBvc2l0ZU9wZXJhdGlvbihDb21wb3NpdGVPcGVyYXRvciBvcCkKLXsKLSAg
ICBub3RJbXBsZW1lbnRlZCgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6YmVnaW5QYXRo
KCkKLXsKLSAgICBtX2RhdGEtPm1fcGF0aHMuY2xlYXIoKTsKLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQ6OmFkZFBhdGgoY29uc3QgUGF0aCYgcGF0aCkKLXsKLSAgICBtX2RhdGEtPm1fcGF0aHMu
YXBwZW5kKHBhdGgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcChjb25zdCBQYXRo
JiBwYXRoKQotewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0OjpjYW52YXNDbGlwKGNvbnN0IFBhdGgmIHBhdGgpCi17Ci0gICAgY2xpcChwYXRoKTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBPdXQoY29uc3QgUGF0aCYpCi17Ci0gICAgbm90
SW1wbGVtZW50ZWQoKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBPdXRFbGxpcHNl
SW5SZWN0KGNvbnN0IEludFJlY3QmKQotewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci19Ci0KLXN0
YXRpYyBpbmxpbmUgSW50UG9pbnQgcmVjdENlbnRlclBvaW50KGNvbnN0IFJFQ1QmIHJlY3QpCi17
Ci0gICAgcmV0dXJuIEludFBvaW50KHJlY3QubGVmdCArIChyZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0
KSAvIDIsIHJlY3QudG9wICsgKHJlY3QuYm90dG9tIC0gcmVjdC50b3ApIC8gMik7Ci19Ci12b2lk
IEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJvdW5kZWRSZWN0KGNvbnN0IEludFJlY3QmIGZpbGxSZWN0
LCBjb25zdCBJbnRTaXplJiB0b3BMZWZ0LCBjb25zdCBJbnRTaXplJiB0b3BSaWdodCwgY29uc3Qg
SW50U2l6ZSYgYm90dG9tTGVmdCwgY29uc3QgSW50U2l6ZSYgYm90dG9tUmlnaHQsIGNvbnN0IENv
bG9yJiBjLCBDb2xvclNwYWNlIGNvbG9yU3BhY2UpCi17Ci0gICAgU2NvcGVEQ1Byb3ZpZGVyIGRj
UHJvdmlkZXIobV9kYXRhKTsKLSAgICBpZiAoIW1fZGF0YS0+bV9kYykKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgSW50U2l6ZSBzaGFkb3dTaXplOwotICAgIGludCBzaGFkb3dCbHVyID0gMDsKLSAg
ICBDb2xvciBzaGFkb3dDb2xvcjsKLSAgICAgICAgCi0gICAgZ2V0U2hhZG93KHNoYWRvd1NpemUs
IHNoYWRvd0JsdXIsIHNoYWRvd0NvbG9yKTsKLSAgICAKLSAgICBJbnRSZWN0IGRzdFJlY3QgPSBm
aWxsUmVjdDsKLSAgICAKLSAgICBkc3RSZWN0Lm1vdmUoc2hhZG93U2l6ZSk7Ci0gICAgZHN0UmVj
dC5pbmZsYXRlKHNoYWRvd0JsdXIpOwotICAgIGRzdFJlY3QgPSBtX2RhdGEtPm1hcFJlY3QoZHN0
UmVjdCk7Ci0gIAotICAgIEZsb2F0U2l6ZSBuZXdUb3BMZWZ0KG1fZGF0YS0+bWFwU2l6ZSh0b3BM
ZWZ0KSk7Ci0gICAgRmxvYXRTaXplIG5ld1RvcFJpZ2h0KG1fZGF0YS0+bWFwU2l6ZSh0b3BSaWdo
dCkpOwotICAgIEZsb2F0U2l6ZSBuZXdCb3R0b21MZWZ0KG1fZGF0YS0+bWFwU2l6ZShib3R0b21M
ZWZ0KSk7Ci0gICAgRmxvYXRTaXplIG5ld0JvdHRvbVJpZ2h0KG1fZGF0YS0+bWFwU2l6ZShib3R0
b21SaWdodCkpOwotCi0gICAgVHJhbnNwYXJlbnRMYXllckRDIHRyYW5zcGFyZW50RGMobV9kYXRh
LCBkc3RSZWN0LCAmZmlsbFJlY3QpOwotICAgIEhEQyBkYyA9IHRyYW5zcGFyZW50RGMuaGRjKCk7
Ci0gICAgaWYgKCFkYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZHN0UmVjdC5tb3ZlKHRyYW5z
cGFyZW50RGMudG9TaGlmdCgpKTsKLQotICAgIFJFQ1QgcmVjdFdpbiA9IGRzdFJlY3Q7Ci0KLSAg
ICBIR0RJT0JKIGJydXNoID0gY3JlYXRlQnJ1c2goc2hhZG93Q29sb3IpOwotICAgIEhHRElPQkog
b2xkQnJ1c2ggPSBTZWxlY3RPYmplY3QoZGMsIGJydXNoKTsKLSAgIAotICAgIFNlbGVjdE9iamVj
dChkYywgR2V0U3RvY2tPYmplY3QoTlVMTF9QRU4pKTsKLQotICAgIEludFBvaW50IGNlbnRlclBv
aW50ID0gcmVjdENlbnRlclBvaW50KHJlY3RXaW4pOwotICAgIC8vIERyYXcgdG9wIGxlZnQgaGFs
ZgotICAgIFJFQ1QgY2xpcFJlY3QocmVjdFdpbik7Ci0gICAgY2xpcFJlY3QucmlnaHQgPSBjZW50
ZXJQb2ludC54KCk7Ci0gICAgY2xpcFJlY3QuYm90dG9tID0gY2VudGVyUG9pbnQueSgpOwotCi0g
ICAgT3duUHRyPEhSR04+IGNsaXBSZ24oQ3JlYXRlUmVjdFJnbigwLCAwLCAwLCAwKSk7Ci0gICAg
Ym9vbCBuZWVkc05ld0NsaXAgPSAoR2V0Q2xpcFJnbihkYywgY2xpcFJnbi5nZXQoKSkgPD0gMCk7
Ci0gICAgCi0gICAgZHJhd1JvdW5kQ29ybmVyKG5lZWRzTmV3Q2xpcCwgY2xpcFJlY3QsIHJlY3RX
aW4sIGRjLCBzdGFibGVSb3VuZChuZXdUb3BMZWZ0LndpZHRoKCkgKiAyKSwgc3RhYmxlUm91bmQo
bmV3VG9wTGVmdC5oZWlnaHQoKSAqIDIpKTsKLQotICAgIC8vIERyYXcgdG9wIHJpZ2h0Ci0gICAg
Y2xpcFJlY3QgPSByZWN0V2luOwotICAgIGNsaXBSZWN0LmxlZnQgPSBjZW50ZXJQb2ludC54KCk7
Ci0gICAgY2xpcFJlY3QuYm90dG9tID0gY2VudGVyUG9pbnQueSgpOwotCi0gICAgZHJhd1JvdW5k
Q29ybmVyKG5lZWRzTmV3Q2xpcCwgY2xpcFJlY3QsIHJlY3RXaW4sIGRjLCBzdGFibGVSb3VuZChu
ZXdUb3BSaWdodC53aWR0aCgpICogMiksIHN0YWJsZVJvdW5kKG5ld1RvcFJpZ2h0LmhlaWdodCgp
ICogMikpOwotCi0gICAgIC8vIERyYXcgYm90dG9tIGxlZnQKLSAgICBjbGlwUmVjdCA9IHJlY3RX
aW47Ci0gICAgY2xpcFJlY3QucmlnaHQgPSBjZW50ZXJQb2ludC54KCk7Ci0gICAgY2xpcFJlY3Qu
dG9wID0gY2VudGVyUG9pbnQueSgpOwotCi0gICAgZHJhd1JvdW5kQ29ybmVyKG5lZWRzTmV3Q2xp
cCwgY2xpcFJlY3QsIHJlY3RXaW4sIGRjLCBzdGFibGVSb3VuZChuZXdCb3R0b21MZWZ0LndpZHRo
KCkgKiAyKSwgc3RhYmxlUm91bmQobmV3Qm90dG9tTGVmdC5oZWlnaHQoKSAqIDIpKTsKLQotICAg
IC8vIERyYXcgYm90dG9tIHJpZ2h0Ci0gICAgY2xpcFJlY3QgPSByZWN0V2luOwotICAgIGNsaXBS
ZWN0LmxlZnQgPSBjZW50ZXJQb2ludC54KCk7Ci0gICAgY2xpcFJlY3QudG9wID0gY2VudGVyUG9p
bnQueSgpOwotCi0gICAgZHJhd1JvdW5kQ29ybmVyKG5lZWRzTmV3Q2xpcCwgY2xpcFJlY3QsIHJl
Y3RXaW4sIGRjLCBzdGFibGVSb3VuZChuZXdCb3R0b21SaWdodC53aWR0aCgpICogMiksIHN0YWJs
ZVJvdW5kKG5ld0JvdHRvbVJpZ2h0LmhlaWdodCgpICogMikpOwotCi0gICAgU2VsZWN0T2JqZWN0
KGRjLCBvbGRCcnVzaCk7Ci0gICAgRGVsZXRlT2JqZWN0KGJydXNoKTsKLX0KLQotCi12b2lkIEdy
YXBoaWNzQ29udGV4dDo6ZHJhd1JvdW5kQ29ybmVyKGJvb2wgbmVlZHNOZXdDbGlwLCBSRUNUIGNs
aXBSZWN0LCBSRUNUIHJlY3RXaW4sIEhEQyBkYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotewot
ICAgIGlmICghZGMpCi0gICAgICAgIHJldHVybjsKLQotICAgIE93blB0cjxIUkdOPiBjbGlwUmdu
KENyZWF0ZVJlY3RSZ24oMCwgMCwgMCwgMCkpOwotICAgIGlmIChuZWVkc05ld0NsaXApICB7Ci0g
ICAgICAgIGNsaXBSZ24uc2V0KENyZWF0ZVJlY3RSZ24oY2xpcFJlY3QubGVmdCwgY2xpcFJlY3Qu
dG9wLCBjbGlwUmVjdC5yaWdodCwgY2xpcFJlY3QuYm90dG9tKSk7Ci0gICAgICAgIFNlbGVjdENs
aXBSZ24oZGMsIGNsaXBSZ24uZ2V0KCkpOwotICAgIH0gZWxzZSAKLSAgICAgICAgSW50ZXJzZWN0
Q2xpcFJlY3QoZGMsIGNsaXBSZWN0LmxlZnQsIGNsaXBSZWN0LnRvcCwgY2xpcFJlY3QucmlnaHQs
IGNsaXBSZWN0LmJvdHRvbSk7Ci0gICAgCi0gICAgOjpSb3VuZFJlY3QoZGMsIHJlY3RXaW4ubGVm
dCAsIHJlY3RXaW4udG9wICwgcmVjdFdpbi5yaWdodCAsIHJlY3RXaW4uYm90dG9tICwgd2lkdGgs
IGhlaWdodCk7Ci0gICAgCi0gICAgU2VsZWN0Q2xpcFJnbihkYywgbmVlZHNOZXdDbGlwID8gMCA6
IGNsaXBSZ24uZ2V0KCkpOwotfQotCi0KLUZsb2F0UmVjdCBHcmFwaGljc0NvbnRleHQ6OnJvdW5k
VG9EZXZpY2VQaXhlbHMoY29uc3QgRmxvYXRSZWN0JiBmcmVjdCkKLXsKLSAgICBub3RJbXBsZW1l
bnRlZCgpOwotICAgIHJldHVybiBmcmVjdDsKLX0KLQotQ29sb3IgZ3JhZGllbnRBdmVyYWdlQ29s
b3IoY29uc3QgR3JhZGllbnQqIGdyYWRpZW50KQotewotICAgIGNvbnN0IFZlY3RvcjxHcmFkaWVu
dDo6Q29sb3JTdG9wPiYgc3RvcHMgPSBncmFkaWVudC0+Z2V0U3RvcHMoKTsKLSAgICBpZiAoc3Rv
cHMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gQ29sb3IoKTsKLQotICAgIGNvbnN0IEdyYWRp
ZW50OjpDb2xvclN0b3AmIHN0b3AgPSBzdG9wcy5maXJzdCgpOwotICAgIGlmIChzdG9wcy5zaXpl
KCkgPT0gMSkKLSAgICAgICAgcmV0dXJuIENvbG9yKHN0b3AucmVkLCBzdG9wLmdyZWVuLCBzdG9w
LmJsdWUsIHN0b3AuYWxwaGEpOwotCi0gICAgY29uc3QgR3JhZGllbnQ6OkNvbG9yU3RvcCYgbGFz
dFN0b3AgPSBzdG9wcy5sYXN0KCk7Ci0gICAgcmV0dXJuIENvbG9yKChzdG9wLnJlZCArIGxhc3RT
dG9wLnJlZCkgKiAwLjVmCi0gICAgICAgICwgKHN0b3AuZ3JlZW4gKyBsYXN0U3RvcC5ncmVlbikg
KiAwLjVmCi0gICAgICAgICwgKHN0b3AuYmx1ZSArIGxhc3RTdG9wLmJsdWUpICogMC41ZgotICAg
ICAgICAsIChzdG9wLmFscGhhICsgbGFzdFN0b3AuYWxwaGEpICogMC41Zik7Ci19Ci0KLXZvaWQg
R3JhcGhpY3NDb250ZXh0OjpmaWxsUGF0aCgpCi17Ci0gICAgQ29sb3IgYyA9IG1fY29tbW9uLT5z
dGF0ZS5maWxsR3JhZGllbnQKLSAgICAgICAgPyBncmFkaWVudEF2ZXJhZ2VDb2xvcihtX2NvbW1v
bi0+c3RhdGUuZmlsbEdyYWRpZW50LmdldCgpKQotICAgICAgICA6IGZpbGxDb2xvcigpOwotCi0g
ICAgaWYgKCFjLmFscGhhKCkgfHwgIW1fZGF0YS0+bV9vcGFjaXR5KQotICAgICAgICByZXR1cm47
Ci0KLSAgICBTY29wZURDUHJvdmlkZXIgZGNQcm92aWRlcihtX2RhdGEpOwotICAgIGlmICghbV9k
YXRhLT5tX2RjKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAobV9kYXRhLT5tX29wYWNpdHkg
PCAxLjBmIHx8IG1fZGF0YS0+aGFzQWxwaGEoKSkgewotICAgICAgICBIR0RJT0JKIGJydXNoID0g
Y3JlYXRlQnJ1c2goYyk7Ci0gICAgICAgIGZvciAoVmVjdG9yPFBhdGg+Ojpjb25zdF9pdGVyYXRv
ciBpID0gbV9kYXRhLT5tX3BhdGhzLmJlZ2luKCk7IGkgIT0gbV9kYXRhLT5tX3BhdGhzLmVuZCgp
OyArK2kpIHsKLSAgICAgICAgICAgIEludFJlY3QgdHJSZWN0ID0gZW5jbG9zaW5nSW50UmVjdCht
X2RhdGEtPm1hcFJlY3QoaS0+Ym91bmRpbmdSZWN0KCkpKTsKLSAgICAgICAgICAgIHRyUmVjdC5p
bmZsYXRlKDEpOwotICAgICAgICAgICAgVHJhbnNwYXJlbnRMYXllckRDIHRyYW5zcGFyZW50REMo
bV9kYXRhLCB0clJlY3QpOwotICAgICAgICAgICAgSERDIGRjID0gdHJhbnNwYXJlbnREQy5oZGMo
KTsKLSAgICAgICAgICAgIGlmICghZGMpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAg
ICAgICAgICAgIEFmZmluZVRyYW5zZm9ybSB0ciA9IG1fZGF0YS0+bV90cmFuc2Zvcm07Ci0gICAg
ICAgICAgICB0ci50cmFuc2xhdGUodHJhbnNwYXJlbnREQy50b1NoaWZ0KCkud2lkdGgoKSwgdHJh
bnNwYXJlbnREQy50b1NoaWZ0KCkuaGVpZ2h0KCkpOwotCi0gICAgICAgICAgICBTZWxlY3RPYmpl
Y3QoZGMsIEdldFN0b2NrT2JqZWN0KE5VTExfUEVOKSk7Ci0gICAgICAgICAgICBIR0RJT0JKIG9s
ZEJydXNoID0gU2VsZWN0T2JqZWN0KGRjLCBicnVzaCk7Ci0gICAgICAgICAgICBpLT5wbGF0Zm9y
bVBhdGgoKS0+ZmlsbFBhdGgoZGMsICZ0cik7Ci0gICAgICAgICAgICBTZWxlY3RPYmplY3QoZGMs
IG9sZEJydXNoKTsKLSAgICAgICAgfQotICAgICAgICBEZWxldGVPYmplY3QoYnJ1c2gpOwotICAg
IH0gZWxzZSB7Ci0gICAgICAgIFNlbGVjdE9iamVjdChtX2RhdGEtPm1fZGMsIEdldFN0b2NrT2Jq
ZWN0KE5VTExfUEVOKSk7Ci0gICAgICAgIEhHRElPQkogYnJ1c2ggPSBjcmVhdGVCcnVzaChjKTsK
LSAgICAgICAgSEdESU9CSiBvbGRCcnVzaCA9IFNlbGVjdE9iamVjdChtX2RhdGEtPm1fZGMsIGJy
dXNoKTsKLSAgICAgICAgZm9yIChWZWN0b3I8UGF0aD46OmNvbnN0X2l0ZXJhdG9yIGkgPSBtX2Rh
dGEtPm1fcGF0aHMuYmVnaW4oKTsgaSAhPSBtX2RhdGEtPm1fcGF0aHMuZW5kKCk7ICsraSkKLSAg
ICAgICAgICAgIGktPnBsYXRmb3JtUGF0aCgpLT5maWxsUGF0aChtX2RhdGEtPm1fZGMsICZtX2Rh
dGEtPm1fdHJhbnNmb3JtKTsKLSAgICAgICAgU2VsZWN0T2JqZWN0KG1fZGF0YS0+bV9kYywgb2xk
QnJ1c2gpOwotICAgICAgICBEZWxldGVPYmplY3QoYnJ1c2gpOwotICAgIH0KLX0KLQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDo6c3Ryb2tlUGF0aCgpCi17Ci0gICAgaWYgKCFtX2RhdGEtPm1fb3Bh
Y2l0eSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgU2NvcGVEQ1Byb3ZpZGVyIGRjUHJvdmlkZXIo
bV9kYXRhKTsKLSAgICBpZiAoIW1fZGF0YS0+bV9kYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
aWYgKG1fZGF0YS0+bV9vcGFjaXR5IDwgMS4wZiB8fCBtX2RhdGEtPmhhc0FscGhhKCkpIHsKLSAg
ICAgICAgSEdESU9CSiBwZW4gPSBjcmVhdGVQZW4oc3Ryb2tlQ29sb3IoKSwgc3Ryb2tlVGhpY2tu
ZXNzKCksIHN0cm9rZVN0eWxlKCkpOwotICAgICAgICBmb3IgKFZlY3RvcjxQYXRoPjo6Y29uc3Rf
aXRlcmF0b3IgaSA9IG1fZGF0YS0+bV9wYXRocy5iZWdpbigpOyBpICE9IG1fZGF0YS0+bV9wYXRo
cy5lbmQoKTsgKytpKSB7Ci0gICAgICAgICAgICBJbnRSZWN0IHRyUmVjdCA9IGVuY2xvc2luZ0lu
dFJlY3QobV9kYXRhLT5tYXBSZWN0KGktPmJvdW5kaW5nUmVjdCgpKSk7Ci0gICAgICAgICAgICB0
clJlY3QuaW5mbGF0ZSgxKTsKLSAgICAgICAgICAgIFRyYW5zcGFyZW50TGF5ZXJEQyB0cmFuc3Bh
cmVudERDKG1fZGF0YSwgdHJSZWN0KTsKLSAgICAgICAgICAgIEhEQyBkYyA9IHRyYW5zcGFyZW50
REMuaGRjKCk7Ci0gICAgICAgICAgICBpZiAoIWRjKQotICAgICAgICAgICAgICAgIGNvbnRpbnVl
OwotCi0gICAgICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdHIgPSBtX2RhdGEtPm1fdHJhbnNmb3Jt
OwotICAgICAgICAgICAgdHIudHJhbnNsYXRlKHRyYW5zcGFyZW50REMudG9TaGlmdCgpLndpZHRo
KCksIHRyYW5zcGFyZW50REMudG9TaGlmdCgpLmhlaWdodCgpKTsKLQotICAgICAgICAgICAgU2Vs
ZWN0T2JqZWN0KGRjLCBHZXRTdG9ja09iamVjdChOVUxMX0JSVVNIKSk7Ci0gICAgICAgICAgICBI
R0RJT0JKIG9sZFBlbiA9IFNlbGVjdE9iamVjdChkYywgcGVuKTsKLSAgICAgICAgICAgIGktPnBs
YXRmb3JtUGF0aCgpLT5zdHJva2VQYXRoKGRjLCAmdHIpOwotICAgICAgICAgICAgU2VsZWN0T2Jq
ZWN0KGRjLCBvbGRQZW4pOwotICAgICAgICB9Ci0gICAgICAgIERlbGV0ZU9iamVjdChwZW4pOwot
ICAgIH0gZWxzZSB7Ci0gICAgICAgIFNlbGVjdE9iamVjdChtX2RhdGEtPm1fZGMsIEdldFN0b2Nr
T2JqZWN0KE5VTExfQlJVU0gpKTsKLSAgICAgICAgSEdESU9CSiBwZW4gPSBjcmVhdGVQZW4oc3Ry
b2tlQ29sb3IoKSwgc3Ryb2tlVGhpY2tuZXNzKCksIHN0cm9rZVN0eWxlKCkpOwotICAgICAgICBI
R0RJT0JKIG9sZFBlbiA9IFNlbGVjdE9iamVjdChtX2RhdGEtPm1fZGMsIHBlbik7Ci0gICAgICAg
IGZvciAoVmVjdG9yPFBhdGg+Ojpjb25zdF9pdGVyYXRvciBpID0gbV9kYXRhLT5tX3BhdGhzLmJl
Z2luKCk7IGkgIT0gbV9kYXRhLT5tX3BhdGhzLmVuZCgpOyArK2kpCi0gICAgICAgICAgICBpLT5w
bGF0Zm9ybVBhdGgoKS0+c3Ryb2tlUGF0aChtX2RhdGEtPm1fZGMsICZtX2RhdGEtPm1fdHJhbnNm
b3JtKTsKLSAgICAgICAgU2VsZWN0T2JqZWN0KG1fZGF0YS0+bV9kYywgb2xkUGVuKTsKLSAgICAg
ICAgRGVsZXRlT2JqZWN0KHBlbik7Ci0gICAgfQotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6
ZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0JiByLCBjb25zdCBHcmFkaWVudCogZ3JhZGllbnQpCi17
Ci0gICAgaWYgKCFtX2RhdGEtPm1fb3BhY2l0eSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY29u
c3QgVmVjdG9yPEdyYWRpZW50OjpDb2xvclN0b3A+JiBzdG9wcyA9IGdyYWRpZW50LT5nZXRTdG9w
cygpOwotICAgIGlmIChzdG9wcy5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIHNp
emVfdCBudW1TdG9wcyA9IHN0b3BzLnNpemUoKTsKLSAgICBpZiAobnVtU3RvcHMgPT0gMSkgewot
ICAgICAgICBjb25zdCBHcmFkaWVudDo6Q29sb3JTdG9wJiBzdG9wID0gc3RvcHMuZmlyc3QoKTsK
LSAgICAgICAgQ29sb3IgY29sb3Ioc3RvcC5yZWQsIHN0b3AuZ3JlZW4sIHN0b3AuYmx1ZSwgc3Rv
cC5hbHBoYSk7Ci0gICAgICAgIGZpbGxSZWN0KHIsIGNvbG9yLCBEZXZpY2VDb2xvclNwYWNlKTsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0gCi0gICAgCi0gICAgU2NvcGVEQ1Byb3ZpZGVyIGRjUHJv
dmlkZXIobV9kYXRhKTsKLSAgICBpZiAoIW1fZGF0YS0+bV9kYykKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgSW50UmVjdCBpbnRSZWN0ID0gZW5jbG9zaW5nSW50UmVjdChyKTsKLSAgICBJbnRSZWN0
IHJlY3QgPSBtX2RhdGEtPm1hcFJlY3QoaW50UmVjdCk7Ci0gICAgVHJhbnNwYXJlbnRMYXllckRD
IHRyYW5zcGFyZW50REMobV9kYXRhLCByZWN0LCAmaW50UmVjdCwgMjU1LCB0cnVlKTsKLSAgICBI
REMgZGMgPSB0cmFuc3BhcmVudERDLmhkYygpOwotICAgIGlmICghZGMpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIHJlY3QubW92ZSh0cmFuc3BhcmVudERDLnRvU2hpZnQoKSk7Ci0gICAgRmxvYXRQ
b2ludCBmcDAgPSBtX2RhdGEtPm1hcFBvaW50KGdyYWRpZW50LT5wMCgpKTsKLSAgICBGbG9hdFBv
aW50IGZwMSA9IG1fZGF0YS0+bWFwUG9pbnQoZ3JhZGllbnQtPnAxKCkpOwotICAgIEludFBvaW50
IHAwKHN0YWJsZVJvdW5kKGZwMC54KCkpLCBzdGFibGVSb3VuZChmcDAueSgpKSk7Ci0gICAgSW50
UG9pbnQgcDEoc3RhYmxlUm91bmQoZnAxLngoKSksIHN0YWJsZVJvdW5kKGZwMS55KCkpKTsKLSAg
ICBwMCArPSB0cmFuc3BhcmVudERDLnRvU2hpZnQoKTsKLSAgICBwMSArPSB0cmFuc3BhcmVudERD
LnRvU2hpZnQoKTsKLQotICAgIGlmIChncmFkaWVudC0+aXNSYWRpYWwoKSkgewotICAgICAgICBp
ZiAoZ19yYWRpYWxHcmFkaWVudEZpbGxlcikgewotICAgICAgICAgICAgLy8gRklYTUU6IGRvbid0
IHN1cHBvcnQgMkQgc2NhbGluZyBhdCB0aGlzIHRpbWUKLSAgICAgICAgICAgIGRvdWJsZSBzY2Fs
ZSA9IChtX2RhdGEtPm1fdHJhbnNmb3JtLmEoKSArIG1fZGF0YS0+bV90cmFuc2Zvcm0uZCgpKSAq
IDAuNTsKLSAgICAgICAgICAgIGZsb2F0IHIwID0gZ3JhZGllbnQtPnIwKCkgKiBzY2FsZTsKLSAg
ICAgICAgICAgIGZsb2F0IHIxID0gZ3JhZGllbnQtPnIxKCkgKiBzY2FsZTsKLSAgICAgICAgICAg
IGdfcmFkaWFsR3JhZGllbnRGaWxsZXIoZGMsIHJlY3QsIHAwLCBwMSwgcjAsIHIxLCBncmFkaWVu
dC0+Z2V0U3RvcHMoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9IGVs
c2UgaWYgKGdfbGluZWFyR3JhZGllbnRGaWxsZXIpIHsKLSAgICAgICAgZ19saW5lYXJHcmFkaWVu
dEZpbGxlcihkYywgcmVjdCwgcDAsIHAxLCBncmFkaWVudC0+Z2V0U3RvcHMoKSk7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBTaW1wbGUgMUQgbGluZWFyIHNvbHV0aW9uIHRoYXQg
YXNzdW1lcyBwMCBpcyBvbiB0aGUgdG9wIG9yIGxlZnQgc2lkZSwgYW5kIHAxIGlzIG9uIHRoZSBy
aWdodCBvciBib3R0b20gc2lkZQotICAgIHNpemVfdCBudW1SZWN0cyA9IChudW1TdG9wcyAtIDEp
OwotICAgIFZlY3RvcjxUUklWRVJURVgsIDIwPiB0djsKLSAgICB0di5yZXNpemUobnVtUmVjdHMg
KiAyKTsKLSAgICBWZWN0b3I8R1JBRElFTlRfUkVDVCwgMTA+IG1lc2g7Ci0gICAgbWVzaC5yZXNp
emUobnVtUmVjdHMpOwotICAgIGludCB4ID0gcmVjdC54KCk7Ci0gICAgaW50IHkgPSByZWN0Lnko
KTsKLSAgICBpbnQgd2lkdGggPSByZWN0LndpZHRoKCk7Ci0gICAgaW50IGhlaWdodCA9IHJlY3Qu
aGVpZ2h0KCk7Ci0gICAgRmxvYXRTaXplIGQgPSBncmFkaWVudC0+cDEoKSAtIGdyYWRpZW50LT5w
MCgpOwotICAgIGJvb2wgdmVydGljYWwgPSBhYnMoZC5oZWlnaHQoKSkgPiBhYnMoZC53aWR0aCgp
KTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVN0b3BzOyArK2kpIHsKLSAgICAgICAg
Y29uc3QgR3JhZGllbnQ6OkNvbG9yU3RvcCYgc3RvcCA9IHN0b3BzW2ldOwotICAgICAgICBpbnQg
aVR2ID0gaSA/IDIgKiBpIC0gMSA6IDA7Ci0gICAgICAgIHR2W2lUdl0uUmVkID0gc3RvcC5yZWQg
KiAweEZGRkY7Ci0gICAgICAgIHR2W2lUdl0uR3JlZW4gPSBzdG9wLmdyZWVuICogMHhGRkZGOwot
ICAgICAgICB0dltpVHZdLkJsdWUgPSBzdG9wLmJsdWUgKiAweEZGRkY7Ci0gICAgICAgIHR2W2lU
dl0uQWxwaGEgPSBzdG9wLmFscGhhICogMHhGRkZGOwotICAgICAgICBpZiAoaSkgewotICAgICAg
ICAgICAgdHZbaVR2XS54ID0gdmVydGljYWwgPyB4ICsgd2lkdGg6IHggKyB3aWR0aCAqIHN0b3Au
c3RvcDsKLSAgICAgICAgICAgIHR2W2lUdl0ueSA9IHZlcnRpY2FsID8geSArIGhlaWdodCAqIHN0
b3Auc3RvcCA6IHkgKyBoZWlnaHQ7Ci0gICAgICAgICAgICBtZXNoW2kgLSAxXS5VcHBlckxlZnQg
PSBpVHYgLSAxOwotICAgICAgICAgICAgbWVzaFtpIC0gMV0uTG93ZXJSaWdodCA9IGlUdjsKLSAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHR2W2lUdl0ueCA9IHg7Ci0gICAgICAgICAgICB0
dltpVHZdLnkgPSB5OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGkgJiYgaSA8IG51bVJlY3Rz
KSB7Ci0gICAgICAgICAgICB0dltpVHYgKyAxXSA9IHR2W2lUdl07Ci0gICAgICAgICAgICBpZiAo
dmVydGljYWwpCi0gICAgICAgICAgICAgICAgdHZbaVR2ICsgMV0ueCA9IHg7Ci0gICAgICAgICAg
ICBlbHNlCi0gICAgICAgICAgICAgICAgdHZbaVR2ICsgMV0ueSA9IHk7Ci0gICAgICAgIH0KLSAg
ICB9Ci0KLSAgICBHcmFkaWVudEZpbGwoZGMsIHR2LmRhdGEoKSwgdHYuc2l6ZSgpLCBtZXNoLmRh
dGEoKSwgbWVzaC5zaXplKCksIHZlcnRpY2FsID8gR1JBRElFTlRfRklMTF9SRUNUX1YgOiBHUkFE
SUVOVF9GSUxMX1JFQ1RfSCk7Ci19Ci0KLUFmZmluZVRyYW5zZm9ybSBHcmFwaGljc0NvbnRleHQ6
OmdldENUTSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fZGF0YS0+bV90cmFuc2Zvcm07Ci19Ci0K
LXZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwVG9JbWFnZUJ1ZmZlcihjb25zdCBGbG9hdFJlY3Qm
LCBjb25zdCBJbWFnZUJ1ZmZlciopCi17Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLX0KLQotdm9p
ZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKLXsKLSAg
ICBpZiAobV9jb21tb24tPnN0YXRlLmZpbGxHcmFkaWVudCkKLSAgICAgICAgZmlsbFJlY3QocmVj
dCwgbV9jb21tb24tPnN0YXRlLmZpbGxHcmFkaWVudC5nZXQoKSk7Ci0gICAgZWxzZQotICAgICAg
ICBmaWxsUmVjdChyZWN0LCBmaWxsQ29sb3IoKSwgRGV2aWNlQ29sb3JTcGFjZSk7Ci19Ci0KLXZv
aWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVNoYWRvdyhjb25zdCBJbnRTaXplJiwgaW50
LCBjb25zdCBDb2xvciYsIENvbG9yU3BhY2UpCi17Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsZWFyUGxhdGZvcm1TaGFkb3coKQotewotICAgIG5v
dEltcGxlbWVudGVkKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRJbWFnZUludGVy
cG9sYXRpb25RdWFsaXR5KEludGVycG9sYXRpb25RdWFsaXR5KQotewotICAgIG5vdEltcGxlbWVu
dGVkKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc0NoYXJWaXNpYmxlKFVDaGFyIGMpCi17
Ci0gICAgcmV0dXJuIGMgJiYgYyAhPSB6ZXJvV2lkdGhTcGFjZTsKLX0KLQotdm9pZCBHcmFwaGlj
c0NvbnRleHQ6OmRyYXdUZXh0KGNvbnN0IEZvbnQmIGZvbnQsIGNvbnN0IFRleHRSdW4mIHJ1biwg
Y29uc3QgSW50UG9pbnQmIHBvaW50LCBpbnQgZnJvbSwgaW50IHRvKQotewotICAgIGlmIChwYWlu
dGluZ0Rpc2FibGVkKCkgfHwgIWZpbGxDb2xvcigpLmFscGhhKCkgfHwgIW1fZGF0YS0+bV9vcGFj
aXR5KQotICAgICAgICByZXR1cm47Ci0KLSAgICBib29sIG11c3RTdXBwb3J0QWxwaGEgPSBtX2Rh
dGEtPmhhc0FscGhhKCk7Ci0KLSAgICBpZiAoIW11c3RTdXBwb3J0QWxwaGEgJiYgZmlsbENvbG9y
KCkuYWxwaGEoKSA9PSAweEZGICYmIG1fZGF0YS0+bV9vcGFjaXR5ID49IDEuMCkgewotICAgICAg
ICBmb250LmRyYXdUZXh0KHRoaXMsIHJ1biwgcG9pbnQsIGZyb20sIHRvKTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLQotICAgIGZsb2F0IG9sZE9wYWNpdHkgPSBtX2RhdGEtPm1fb3BhY2l0eTsK
LSAgICBtX2RhdGEtPm1fb3BhY2l0eSAqPSBmaWxsQ29sb3IoKS5hbHBoYSgpIC8gMjU1LjA7Ci0K
LSAgICBGbG9hdFJlY3QgdGV4dFJlY3QgPSBmb250LnNlbGVjdGlvblJlY3RGb3JUZXh0KHJ1biwg
cG9pbnQsIGZvbnQuaGVpZ2h0KCksIGZyb20sIHRvKTsKLSAgICB0ZXh0UmVjdC5zZXRZKHRleHRS
ZWN0LnkoKSAtIGZvbnQuYXNjZW50KCkpOwotICAgIEludFJlY3QgdHJSZWN0ID0gZW5jbG9zaW5n
SW50UmVjdChtX2RhdGEtPm1hcFJlY3QodGV4dFJlY3QpKTsKLSAgICBSRUNUIGJtcFJlY3Q7Ci0g
ICAgQWxwaGFQYWludFR5cGUgYWxwaGFQYWludFR5cGUgPSBtdXN0U3VwcG9ydEFscGhhID8gQWxw
aGFQYWludE90aGVyIDogQWxwaGFQYWludE5vbmU7Ci0gICAgaWYgKFJlZlB0cjxTaGFyZWRCaXRt
YXA+IGJtcCA9IG1fZGF0YS0+Z2V0VHJhbnNwYXJlbnRMYXllckJpdG1hcCh0clJlY3QsIGFscGhh
UGFpbnRUeXBlLCBibXBSZWN0LCB0cnVlLCBtdXN0U3VwcG9ydEFscGhhKSkgewotICAgICAgICB7
Ci0gICAgICAgICAgICBHcmFwaGljc0NvbnRleHQgZ2MoMCk7Ci0gICAgICAgICAgICBnYy5zZXRC
aXRtYXAoYm1wKTsKLSAgICAgICAgICAgIGdjLnNjYWxlKEZsb2F0U2l6ZShtX2RhdGEtPm1fdHJh
bnNmb3JtLmEoKSwgbV9kYXRhLT5tX3RyYW5zZm9ybS5kKCkpKTsKLSAgICAgICAgICAgIGZvbnQu
ZHJhd1RleHQoJmdjLCBydW4sIEludFBvaW50KDAsIGZvbnQuYXNjZW50KCkpLCBmcm9tLCB0byk7
Ci0gICAgICAgIH0KLSAgICAgICAgdW5zaWduZWQga2V5MSwga2V5MjsKLSAgICAgICAgSERDIG1l
bURDID0gYm1wLT5nZXREQygma2V5MSwgJmtleTIpOwotICAgICAgICBpZiAobWVtREMpIHsKLSAg
ICAgICAgICAgIG1fZGF0YS0+cGFpbnRCYWNrVHJhbnNwYXJlbnRMYXllckJpdG1hcChtZW1EQywg
Ym1wLmdldCgpLCB0clJlY3QsIGFscGhhUGFpbnRUeXBlLCBibXBSZWN0KTsKLSAgICAgICAgICAg
IGJtcC0+cmVsZWFzZURDKG1lbURDLCBrZXkxLCBrZXkyKTsKLSAgICAgICAgfQotICAgIH0KLQot
ICAgIG1fZGF0YS0+bV9vcGFjaXR5ID0gb2xkT3BhY2l0eTsKLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQ6OmRyYXdUZXh0KGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250RGF0YSwgY29uc3QgR2x5
cGhCdWZmZXImIGdseXBoQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgIGludCBmcm9tLCBp
bnQgbnVtR2x5cGhzLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCkKLXsKLSAgICBpZiAoIW1fZGF0
YS0+bV9vcGFjaXR5KQotICAgICAgICByZXR1cm47Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAg
IGlmICghbnVtR2x5cGhzKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZiAoaXNDaGFy
VmlzaWJsZSgqZ2x5cGhCdWZmZXIuZ2x5cGhzKGZyb20pKSkKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICArK2Zyb207Ci0gICAgICAgIC0tbnVtR2x5cGhzOwotICAgIH0KLQotICAgIGRvdWJs
ZSBzY2FsZVggPSBtX2RhdGEtPm1fdHJhbnNmb3JtLmEoKTsKLSAgICBkb3VibGUgc2NhbGVZID0g
bV9kYXRhLT5tX3RyYW5zZm9ybS5kKCk7Ci0KLSAgICBpbnQgaGVpZ2h0ID0gZm9udERhdGEtPnBs
YXRmb3JtRGF0YSgpLnNpemUoKSAqIHNjYWxlWTsKLSAgICBpbnQgd2lkdGggPSBmb250RGF0YS0+
cGxhdGZvcm1EYXRhKCkuYXZlcmFnZUNoYXJXaWR0aCgpICogc2NhbGVYOwotCi0gICAgaWYgKCFo
ZWlnaHQgfHwgIXdpZHRoKQotICAgICAgICByZXR1cm47Ci0KLSAgICBTY29wZURDUHJvdmlkZXIg
ZGNQcm92aWRlcihtX2RhdGEpOwotICAgIGlmICghbV9kYXRhLT5tX2RjKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBIRk9OVCBoRm9udCA9IGhlaWdodCA+IDEKLSAgICAgICAgPyBmb250RGF0YS0+
cGxhdGZvcm1EYXRhKCkuZ2V0U2NhbGVkRm9udEhhbmRsZShoZWlnaHQsIHNjYWxlWCA9PSBzY2Fs
ZVkgPyAwIDogd2lkdGgpCi0gICAgICAgIDogMDsKLQotICAgIEZsb2F0UG9pbnQgc3RhcnRQb2lu
dChwb2ludC54KCksIHBvaW50LnkoKSAtIGZvbnREYXRhLT5hc2NlbnQoKSk7Ci0gICAgRmxvYXRQ
b2ludCB0clBvaW50ID0gbV9kYXRhLT5tYXBQb2ludChzdGFydFBvaW50KTsKLSAgICBpbnQgeSA9
IHN0YWJsZVJvdW5kKHRyUG9pbnQueSgpKTsKLQotICAgIENvbG9yIGNvbG9yID0gZmlsbENvbG9y
KCk7Ci0gICAgaWYgKCFjb2xvci5hbHBoYSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBDT0xP
UlJFRiBmb250Q29sb3IgPSBSR0IoY29sb3IucmVkKCksIGNvbG9yLmdyZWVuKCksIGNvbG9yLmJs
dWUoKSk7Ci0KLSAgICBpZiAoIWhGb250KSB7Ci0gICAgICAgIGRvdWJsZSBvZmZzZXQgPSB0clBv
aW50LngoKTsKLSAgICAgICAgY29uc3QgR2x5cGhCdWZmZXJBZHZhbmNlKiBhZHZhbmNlID0gZ2x5
cGhCdWZmZXIuYWR2YW5jZXMoZnJvbSk7Ci0gICAgICAgIGlmIChzY2FsZVggPT0gMS4pCi0gICAg
ICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG51bUdseXBoczsgKytpKQotICAgICAgICAgICAg
ICAgIG9mZnNldCArPSAqYWR2YW5jZSsrOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmb3Ig
KGludCBpID0gMTsgaSA8IG51bUdseXBoczsgKytpKQotICAgICAgICAgICAgICAgIG9mZnNldCAr
PSAqYWR2YW5jZSsrICogc2NhbGVYOwotCi0gICAgICAgIG9mZnNldCArPSB3aWR0aDsKLQotICAg
ICAgICBPd25QdHI8SFBFTj4gaFBlbihDcmVhdGVQZW4oUFNfREFTSCwgMSwgZm9udENvbG9yKSk7
Ci0gICAgICAgIEhHRElPQkogb2xkUGVuID0gU2VsZWN0T2JqZWN0KG1fZGF0YS0+bV9kYywgaFBl
bi5nZXQoKSk7Ci0KLSAgICAgICAgTW92ZVRvRXgobV9kYXRhLT5tX2RjLCBzdGFibGVSb3VuZCh0
clBvaW50LngoKSksIHksIDApOwotICAgICAgICBMaW5lVG8obV9kYXRhLT5tX2RjLCBzdGFibGVS
b3VuZChvZmZzZXQpLCB5KTsKLQotICAgICAgICBTZWxlY3RPYmplY3QobV9kYXRhLT5tX2RjLCBv
bGRQZW4pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgSW50U2l6ZSBzaGFkb3dTaXpl
OwotICAgIGludCBzaGFkb3dCbHVyID0gMDsKLSAgICBDb2xvciBzaGFkb3dDb2xvcjsKLSAgICBi
b29sIGhhc1NoYWRvdyA9IHRleHREcmF3aW5nTW9kZSgpID09IGNUZXh0RmlsbAotICAgICAgICAm
JiBnZXRTaGFkb3coc2hhZG93U2l6ZSwgc2hhZG93Qmx1ciwgc2hhZG93Q29sb3IpCi0gICAgICAg
ICYmIHNoYWRvd0NvbG9yLmFscGhhKCk7Ci0gICAgQ09MT1JSRUYgc2hhZG93UkdCQ29sb3I7Ci0g
ICAgRmxvYXRQb2ludCB0clNoYWRvd1BvaW50OwotICAgIGlmIChoYXNTaGFkb3cpIHsKLSAgICAg
ICAgc2hhZG93UkdCQ29sb3IgPSBSR0Ioc2hhZG93Q29sb3IucmVkKCksIHNoYWRvd0NvbG9yLmdy
ZWVuKCksIHNoYWRvd0NvbG9yLmJsdWUoKSk7Ci0gICAgICAgIHRyU2hhZG93UG9pbnQgPSBtX2Rh
dGEtPm1hcFBvaW50KHN0YXJ0UG9pbnQgKyBzaGFkb3dTaXplKTsKLSAgICB9Ci0KLSAgICBIR0RJ
T0JKIGhPbGRGb250ID0gU2VsZWN0T2JqZWN0KG1fZGF0YS0+bV9kYywgaEZvbnQpOwotICAgIENP
TE9SUkVGIG9sZFRleHRDb2xvciA9IEdldFRleHRDb2xvcihtX2RhdGEtPm1fZGMpOwotICAgIGlu
dCBvbGRUZXh0QWxpZ24gPSBHZXRUZXh0QWxpZ24obV9kYXRhLT5tX2RjKTsKLSAgICBTZXRUZXh0
QWxpZ24obV9kYXRhLT5tX2RjLCAwKTsKLQotICAgIGludCBvbGRCa01vZGUgPSBHZXRCa01vZGUo
bV9kYXRhLT5tX2RjKTsKLSAgICBTZXRCa01vZGUobV9kYXRhLT5tX2RjLCBUUkFOU1BBUkVOVCk7
Ci0KLSAgICBpZiAobnVtR2x5cGhzID4gMSkgewotICAgICAgICBkb3VibGUgb2Zmc2V0ID0gdHJQ
b2ludC54KCk7Ci0gICAgICAgIFZlY3RvcjxpbnQsIDI1Nj4gZ2x5cGhTcGFjZShudW1HbHlwaHMp
OwotICAgICAgICBWZWN0b3I8VUNoYXIsIDI1Nj4gdGV4dChudW1HbHlwaHMpOwotICAgICAgICBp
bnQqIGN1clNwYWNlID0gZ2x5cGhTcGFjZS5kYXRhKCk7Ci0gICAgICAgIFVDaGFyKiBjdXJDaGFy
ID0gdGV4dC5kYXRhKCk7Ci0gICAgICAgIGNvbnN0IFVDaGFyKiBzcmNDaGFyID0gZ2x5cGhCdWZm
ZXIuZ2x5cGhzKGZyb20pOwotICAgICAgICBjb25zdCBVQ2hhciogY29uc3Qgc3JjQ2hhckVuZCA9
IHNyY0NoYXIgKyBudW1HbHlwaHM7Ci0gICAgICAgICpjdXJDaGFyKysgPSAqc3JjQ2hhcisrOwot
ICAgICAgICBpbnQgZmlyc3RPZmZzZXQgPSBzdGFibGVSb3VuZChvZmZzZXQpOwotICAgICAgICBp
bnQgbGFzdE9mZnNldCA9IGZpcnN0T2Zmc2V0OwotICAgICAgICBjb25zdCBHbHlwaEJ1ZmZlckFk
dmFuY2UqIGFkdmFuY2UgPSBnbHlwaEJ1ZmZlci5hZHZhbmNlcyhmcm9tKTsKLSAgICAgICAgLy8g
RklYTUU6IEV4dFRleHRPdXQoKSBjYW4gZmxpcCBvdmVyIGVhY2ggd29yZCBmb3IgUlRMIGxhbmd1
YWdlcywgZXZlbiB3aGVuIFRBX1JUTFJFQURJTkcgaXMgb2ZmLgotICAgICAgICAvLyAodGhpcyBj
YW4gYmUgR0RJIGJ1ZyBvciBmb250IGRyaXZlciBidWc/KQotICAgICAgICAvLyBXZSBhcmUgbm90
IGNsZWFyIGhvdyBpdCBwcm9jZXNzZXMgY2hhcmFjdGVycyBhbmQgaGFuZGxlcyBzcGVjaWZpZWQg
c3BhY2VzLiBPbiB0aGUgb3RoZXIgc2lkZSwKLSAgICAgICAgLy8gb3VyIGdseXBoIGJ1ZmZlciBp
cyBhbHJlYWR5IGluIHRoZSBjb3JyZWN0IG9yZGVyIGZvciByZW5kZXJpbmcuIFNvLCB0aGUgc29s
dXRpb24gaXMgdGhhdCB3ZQotICAgICAgICAvLyBjYWxsIEV4dFRleHRPdXQoKSBmb3IgZWFjaCBz
aW5nbGUgY2hhcmFjdGVyIHdoZW4gdGhlIHRleHQgY29udGFpbnMgYW55IFJUTCBjaGFyYWN0ZXIu
Ci0gICAgICAgIC8vIFRoaXMgc29sdXRpb24gaXMgbm90IHBlcmZlY3QgYXMgaXQgaXMgc2xvd2Vy
IHRoYW4gY2FsbGluZyBFeHRUZXh0T3V0KCkgb25lIHRpbWUgZm9yIGFsbCBjaGFyYWN0ZXJzLgot
ICAgICAgICAvLyBEcmF3aW5nIGNoYXJhY3RlcnMgb25lIGJ5IG9uZSBtYXkgYmUgdG9vIHNsb3cu
Ci0gICAgICAgIGJvb2wgZHJhd09uZUJ5T25lID0gZmFsc2U7Ci0gICAgICAgIGlmIChzY2FsZVgg
PT0gMS4pIHsKLSAgICAgICAgICAgIGZvciAoOyBzcmNDaGFyIDwgc3JjQ2hhckVuZDsgKytzcmND
aGFyKSB7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9ICphZHZhbmNlKys7Ci0gICAgICAgICAg
ICAgICAgaW50IG9mZnNldEludCA9IHN0YWJsZVJvdW5kKG9mZnNldCk7Ci0gICAgICAgICAgICAg
ICAgaWYgKGlzQ2hhclZpc2libGUoKnNyY0NoYXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlm
ICghZHJhd09uZUJ5T25lICYmIFdURjo6VW5pY29kZTo6ZGlyZWN0aW9uKCpzcmNDaGFyKSA9PSBX
VEY6OlVuaWNvZGU6OlJpZ2h0VG9MZWZ0KQotICAgICAgICAgICAgICAgICAgICAgICAgZHJhd09u
ZUJ5T25lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgKmN1ckNoYXIrKyA9ICpzcmNDaGFy
OwotICAgICAgICAgICAgICAgICAgICAqY3VyU3BhY2UrKyA9IG9mZnNldEludCAtIGxhc3RPZmZz
ZXQ7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RPZmZzZXQgPSBvZmZzZXRJbnQ7Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
Zm9yICg7IHNyY0NoYXIgPCBzcmNDaGFyRW5kOyArK3NyY0NoYXIpIHsKLSAgICAgICAgICAgICAg
ICBvZmZzZXQgKz0gKmFkdmFuY2UrKyAqIHNjYWxlWDsKLSAgICAgICAgICAgICAgICBpbnQgb2Zm
c2V0SW50ID0gc3RhYmxlUm91bmQob2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBpZiAoaXNDaGFy
VmlzaWJsZSgqc3JjQ2hhcikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFkcmF3T25lQnlP
bmUgJiYgV1RGOjpVbmljb2RlOjpkaXJlY3Rpb24oKnNyY0NoYXIpID09IFdURjo6VW5pY29kZTo6
UmlnaHRUb0xlZnQpCi0gICAgICAgICAgICAgICAgICAgICAgICBkcmF3T25lQnlPbmUgPSB0cnVl
OwotICAgICAgICAgICAgICAgICAgICAqY3VyQ2hhcisrID0gKnNyY0NoYXI7Ci0gICAgICAgICAg
ICAgICAgICAgICpjdXJTcGFjZSsrID0gb2Zmc2V0SW50IC0gbGFzdE9mZnNldDsKLSAgICAgICAg
ICAgICAgICAgICAgbGFzdE9mZnNldCA9IG9mZnNldEludDsKLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbnVtR2x5cGhzID0gY3VyQ2hhciAtIHRl
eHQuZGF0YSgpOwotICAgICAgICBpZiAoaGFzU2hhZG93KSB7Ci0gICAgICAgICAgICBTZXRUZXh0
Q29sb3IobV9kYXRhLT5tX2RjLCBzaGFkb3dSR0JDb2xvcik7Ci0gICAgICAgICAgICBpZiAoZHJh
d09uZUJ5T25lKSB7Ci0gICAgICAgICAgICAgICAgaW50IHhTaGFkb3cgPSBmaXJzdE9mZnNldCAr
IHN0YWJsZVJvdW5kKHRyU2hhZG93UG9pbnQueCgpIC0gdHJQb2ludC54KCkpOwotICAgICAgICAg
ICAgICAgIGludCB5U2hhZG93ID0gc3RhYmxlUm91bmQodHJTaGFkb3dQb2ludC55KCkpOwotICAg
ICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtR2x5cGhzOyArK2kpIHsKLSAgICAg
ICAgICAgICAgICAgICAgRXh0VGV4dE91dChtX2RhdGEtPm1fZGMsIHhTaGFkb3csIHlTaGFkb3cs
IDAsIE5VTEwsIHRleHQuZGF0YSgpICsgaSwgMSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIHhT
aGFkb3cgKz0gZ2x5cGhTcGFjZVtpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9
IGVsc2UKLSAgICAgICAgICAgICAgICBFeHRUZXh0T3V0KG1fZGF0YS0+bV9kYywgZmlyc3RPZmZz
ZXQgKyBzdGFibGVSb3VuZCh0clNoYWRvd1BvaW50LngoKSAtIHRyUG9pbnQueCgpKSwgc3RhYmxl
Um91bmQodHJTaGFkb3dQb2ludC55KCkpLCAwLCBOVUxMLCB0ZXh0LmRhdGEoKSwgbnVtR2x5cGhz
LCBnbHlwaFNwYWNlLmRhdGEoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgU2V0VGV4dENvbG9yKG1f
ZGF0YS0+bV9kYywgZm9udENvbG9yKTsKLSAgICAgICAgaWYgKGRyYXdPbmVCeU9uZSkgewotICAg
ICAgICAgICAgaW50IHggPSBmaXJzdE9mZnNldDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgbnVtR2x5cGhzOyArK2kpIHsKLSAgICAgICAgICAgICAgICBFeHRUZXh0T3V0KG1fZGF0
YS0+bV9kYywgeCwgeSwgMCwgTlVMTCwgdGV4dC5kYXRhKCkgKyBpLCAxLCAwKTsKLSAgICAgICAg
ICAgICAgICB4ICs9IGdseXBoU3BhY2VbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxz
ZQotICAgICAgICAgICAgRXh0VGV4dE91dChtX2RhdGEtPm1fZGMsIGZpcnN0T2Zmc2V0LCB5LCAw
LCBOVUxMLCB0ZXh0LmRhdGEoKSwgbnVtR2x5cGhzLCBnbHlwaFNwYWNlLmRhdGEoKSk7Ci0gICAg
fSBlbHNlIHsKLSAgICAgICAgVUNoYXIgYyA9ICpnbHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSk7Ci0g
ICAgICAgIGlmIChoYXNTaGFkb3cpIHsKLSAgICAgICAgICAgIFNldFRleHRDb2xvcihtX2RhdGEt
Pm1fZGMsIHNoYWRvd1JHQkNvbG9yKTsKLSAgICAgICAgICAgIEV4dFRleHRPdXQobV9kYXRhLT5t
X2RjLCBzdGFibGVSb3VuZCh0clNoYWRvd1BvaW50LngoKSksIHN0YWJsZVJvdW5kKHRyU2hhZG93
UG9pbnQueSgpKSwgMCwgTlVMTCwgJmMsIDEsIDApOwotICAgICAgICB9Ci0gICAgICAgIFNldFRl
eHRDb2xvcihtX2RhdGEtPm1fZGMsIGZvbnRDb2xvcik7Ci0gICAgICAgIEV4dFRleHRPdXQobV9k
YXRhLT5tX2RjLCBzdGFibGVSb3VuZCh0clBvaW50LngoKSksIHksIDAsIE5VTEwsICZjLCAxLCAw
KTsKLSAgICB9Ci0KLSAgICBTZXRUZXh0QWxpZ24obV9kYXRhLT5tX2RjLCBvbGRUZXh0QWxpZ24p
OwotICAgIFNldFRleHRDb2xvcihtX2RhdGEtPm1fZGMsIG9sZFRleHRDb2xvcik7Ci0gICAgU2V0
QmtNb2RlKG1fZGF0YS0+bV9kYywgb2xkQmtNb2RlKTsKLSAgICBTZWxlY3RPYmplY3QobV9kYXRh
LT5tX2RjLCBoT2xkRm9udCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3RnJhbWVD
b250cm9sKGNvbnN0IEludFJlY3QmIHJlY3QsIHVuc2lnbmVkIHR5cGUsIHVuc2lnbmVkIHN0YXRl
KQotewotICAgIGlmICghbV9kYXRhLT5tX29wYWNpdHkpCi0gICAgICAgIHJldHVybjsKLQotICAg
IGNvbnN0IGludCBib3hXaWR0aEJlc3QgPSA4OwotICAgIGNvbnN0IGludCBib3hIZWlnaHRCZXN0
ID0gODsKLQotICAgIFNjb3BlRENQcm92aWRlciBkY1Byb3ZpZGVyKG1fZGF0YSk7Ci0gICAgaWYg
KCFtX2RhdGEtPm1fZGMpCi0gICAgICAgIHJldHVybjsKLQotICAgIEludFJlY3QgdHJSZWN0ID0g
bV9kYXRhLT5tYXBSZWN0KHJlY3QpOwotICAgIFRyYW5zcGFyZW50TGF5ZXJEQyB0cmFuc3BhcmVu
dERDKG1fZGF0YSwgdHJSZWN0LCAmcmVjdCwgMjU1LCB0cnVlKTsKLSAgICBIREMgZGMgPSB0cmFu
c3BhcmVudERDLmhkYygpOwotICAgIGlmICghZGMpCi0gICAgICAgIHJldHVybjsKLSAgICB0clJl
Y3QubW92ZSh0cmFuc3BhcmVudERDLnRvU2hpZnQoKSk7Ci0KLSAgICBSRUNUIHJlY3RXaW4gPSB0
clJlY3Q7Ci0KLSAgICBpZiAoKHJlY3RXaW4ucmlnaHQgLSByZWN0V2luLmxlZnQpIDwgYm94V2lk
dGhCZXN0KSB7Ci0gICAgICAgIFJlZlB0cjxTaGFyZWRCaXRtYXA+IGJtcCA9IFNoYXJlZEJpdG1h
cDo6Y3JlYXRlSW5zdGFuY2UodHJ1ZSwgYm94V2lkdGhCZXN0LCBib3hIZWlnaHRCZXN0LCB0cnVl
KTsKLSAgICAgICAgU2hhcmVkQml0bWFwOjpEQ0hvbGRlciBtZW1EQyhibXAuZ2V0KCkpOwotICAg
ICAgICBpZiAobWVtREMuZ2V0KCkpIHsKLSAgICAgICAgICAgIFJFQ1QgdGVtcFJlY3QgPSB7MCwg
MCwgYm94V2lkdGhCZXN0LCBib3hIZWlnaHRCZXN0fTsKLSAgICAgICAgICAgIERyYXdGcmFtZUNv
bnRyb2wobWVtREMuZ2V0KCksICZ0ZW1wUmVjdCwgdHlwZSwgc3RhdGUpOwotCi0gICAgICAgICAg
ICA6OlN0cmV0Y2hCbHQoZGMsIHJlY3RXaW4ubGVmdCwgcmVjdFdpbi50b3AsIHJlY3RXaW4ucmln
aHQgLSByZWN0V2luLmxlZnQsIHJlY3RXaW4uYm90dG9tIC0gcmVjdFdpbi50b3AsIG1lbURDLmdl
dCgpLCAwLCAwLCBib3hXaWR0aEJlc3QsIGJveEhlaWdodEJlc3QsIFNSQ0NPUFkpOwotICAgICAg
ICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgRHJhd0ZyYW1lQ29udHJvbChk
YywgJnJlY3RXaW4sIHR5cGUsIHN0YXRlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRy
YXdGb2N1c1JlY3QoY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICBpZiAoIW1fZGF0YS0+bV9v
cGFjaXR5KQotICAgICAgICByZXR1cm47Ci0KLSAgICBTY29wZURDUHJvdmlkZXIgZGNQcm92aWRl
cihtX2RhdGEpOwotICAgIGlmICghbV9kYXRhLT5tX2RjKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBJbnRSZWN0IHRyUmVjdCA9IG1fZGF0YS0+bWFwUmVjdChyZWN0KTsKLSAgICBUcmFuc3BhcmVu
dExheWVyREMgdHJhbnNwYXJlbnREQyhtX2RhdGEsIHRyUmVjdCwgJnJlY3QpOwotICAgIEhEQyBk
YyA9IHRyYW5zcGFyZW50REMuaGRjKCk7Ci0gICAgaWYgKCFkYykKLSAgICAgICAgcmV0dXJuOwot
ICAgIHRyUmVjdC5tb3ZlKHRyYW5zcGFyZW50REMudG9TaGlmdCgpKTsKLQotICAgIFJFQ1QgcmVj
dFdpbiA9IHRyUmVjdDsKLSAgICBEcmF3Rm9jdXNSZWN0KGRjLCAmcmVjdFdpbik7Ci19Ci0KLXZv
aWQgR3JhcGhpY3NDb250ZXh0OjpwYWludFRleHRGaWVsZChjb25zdCBJbnRSZWN0JiByZWN0LCB1
bnNpZ25lZCBzdGF0ZSkKLXsKLSAgICBpZiAoIW1fZGF0YS0+bV9vcGFjaXR5KQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBTY29wZURDUHJvdmlkZXIgZGNQcm92aWRlcihtX2RhdGEpOwotICAgIGlm
ICghbV9kYXRhLT5tX2RjKQotICAgICAgICByZXR1cm47Ci0KLSAgICBJbnRSZWN0IHRyUmVjdCA9
IG1fZGF0YS0+bWFwUmVjdChyZWN0KTsKLSAgICBUcmFuc3BhcmVudExheWVyREMgdHJhbnNwYXJl
bnREQyhtX2RhdGEsIHRyUmVjdCwgJnJlY3QpOwotICAgIEhEQyBkYyA9IHRyYW5zcGFyZW50REMu
aGRjKCk7Ci0gICAgaWYgKCFkYykKLSAgICAgICAgcmV0dXJuOwotICAgIHRyUmVjdC5tb3ZlKHRy
YW5zcGFyZW50REMudG9TaGlmdCgpKTsKLQotICAgIFJFQ1QgcmVjdFdpbiA9IHRyUmVjdDsKLSAg
ICBEcmF3RWRnZShkYywgJnJlY3RXaW4sIEVER0VfRVRDSEVELCBCRl9SRUNUIHwgQkZfQURKVVNU
KTsKLSAgICBGaWxsUmVjdChkYywgJnJlY3RXaW4sIHJlaW50ZXJwcmV0X2Nhc3Q8SEJSVVNIPigo
KHN0YXRlICYgREZDU19JTkFDVElWRSkgPyBDT0xPUl9CVE5GQUNFIDogQ09MT1JfV0lORE9XKSAr
IDEpKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdCaXRtYXAoU2hhcmVkQml0bWFw
KiBibXAsIGNvbnN0IEludFJlY3QmIGRzdFJlY3RJbiwgY29uc3QgSW50UmVjdCYgc3JjUmVjdCwg
Q29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApCi17Ci0gICAgaWYgKCFtX2RhdGEtPm1fb3Bh
Y2l0eSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgU2NvcGVEQ1Byb3ZpZGVyIGRjUHJvdmlkZXIo
bV9kYXRhKTsKLSAgICBpZiAoIW1fZGF0YS0+bV9kYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
SW50UmVjdCBkc3RSZWN0ID0gbV9kYXRhLT5tYXBSZWN0KGRzdFJlY3RJbik7Ci0gICAgVHJhbnNw
YXJlbnRMYXllckRDIHRyYW5zcGFyZW50REMobV9kYXRhLCBkc3RSZWN0LCAmZHN0UmVjdEluLCAy
NTUsIHRydWUpOwotICAgIEhEQyBkYyA9IHRyYW5zcGFyZW50REMuaGRjKCk7Ci0gICAgaWYgKCFk
YykKLSAgICAgICAgcmV0dXJuOwotICAgIGRzdFJlY3QubW92ZSh0cmFuc3BhcmVudERDLnRvU2hp
ZnQoKSk7Ci0KLSAgICBibXAtPmRyYXcoZGMsIGRzdFJlY3QsIHNyY1JlY3QsIGNvbXBvc2l0ZU9w
KTsKLQotICAgIGlmIChibXAtPmlzMTZiaXQoKSkKLSAgICAgICAgdHJhbnNwYXJlbnREQy5maWxs
QWxwaGFDaGFubmVsKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3Qml0bWFwUGF0
dGVybihTaGFyZWRCaXRtYXAqIGJtcCwgY29uc3QgRmxvYXRSZWN0JiB0aWxlUmVjdEluLCBjb25z
dCBBZmZpbmVUcmFuc2Zvcm0mIHBhdHRlcm5UcmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgY29u
c3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBjb25zdCBGbG9hdFJl
Y3QmIGRlc3RSZWN0SW4sIGNvbnN0IEludFNpemUmIG9yaWdTb3VyY2VTaXplKQotewotICAgIGlm
ICghbV9kYXRhLT5tX29wYWNpdHkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFNjb3BlRENQcm92
aWRlciBkY1Byb3ZpZGVyKG1fZGF0YSk7Ci0gICAgaWYgKCFtX2RhdGEtPm1fZGMpCi0gICAgICAg
IHJldHVybjsKLQotICAgIEludFJlY3QgaW50RHN0UmVjdCA9IGVuY2xvc2luZ0ludFJlY3QoZGVz
dFJlY3RJbik7Ci0gICAgSW50UmVjdCB0clJlY3QgPSBtX2RhdGEtPm1hcFJlY3QoaW50RHN0UmVj
dCk7Ci0gICAgVHJhbnNwYXJlbnRMYXllckRDIHRyYW5zcGFyZW50REMobV9kYXRhLCB0clJlY3Qs
ICZpbnREc3RSZWN0LCAyNTUsIHRydWUpOwotICAgIEhEQyBkYyA9IHRyYW5zcGFyZW50REMuaGRj
KCk7Ci0gICAgaWYgKCFkYykKLSAgICAgICAgcmV0dXJuOwotICAgIHRyUmVjdC5tb3ZlKHRyYW5z
cGFyZW50REMudG9TaGlmdCgpKTsKLSAgICBGbG9hdFJlY3QgbW92ZWREc3RSZWN0ID0gbV9kYXRh
LT5tX3RyYW5zZm9ybS5pbnZlcnNlKCkubWFwUmVjdChGbG9hdFJlY3QodHJSZWN0KSk7Ci0gICAg
RmxvYXRTaXplIG1vdmVkKG1vdmVkRHN0UmVjdC5sb2NhdGlvbigpIC0gZGVzdFJlY3RJbi5sb2Nh
dGlvbigpKTsKLSAgICBBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtID0gbV9kYXRhLT5tX3RyYW5z
Zm9ybTsKLSAgICB0cmFuc2Zvcm0udHJhbnNsYXRlKG1vdmVkLndpZHRoKCksIG1vdmVkLmhlaWdo
dCgpKTsKLQotICAgIGJtcC0+ZHJhd1BhdHRlcm4oZGMsIHRyYW5zZm9ybSwgdGlsZVJlY3RJbiwg
cGF0dGVyblRyYW5zZm9ybSwgcGhhc2UsIG9wLCBkZXN0UmVjdEluLCBvcmlnU291cmNlU2l6ZSk7
Ci0KLSAgICBpZiAoIWJtcC0+aGFzQWxwaGEoKSkKLSAgICAgICAgdHJhbnNwYXJlbnREQy5maWxs
QWxwaGFDaGFubmVsKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3SWNvbihISUNP
TiBpY29uLCBjb25zdCBJbnRSZWN0JiBkc3RSZWN0SW4sIFVJTlQgZmxhZ3MpCi17Ci0gICAgaWYg
KCFtX2RhdGEtPm1fb3BhY2l0eSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgU2NvcGVEQ1Byb3Zp
ZGVyIGRjUHJvdmlkZXIobV9kYXRhKTsKLSAgICBpZiAoIW1fZGF0YS0+bV9kYykKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgSW50UmVjdCBkc3RSZWN0ID0gbV9kYXRhLT5tYXBSZWN0KGRzdFJlY3RJ
bik7Ci0gICAgVHJhbnNwYXJlbnRMYXllckRDIHRyYW5zcGFyZW50REMobV9kYXRhLCBkc3RSZWN0
LCAmZHN0UmVjdEluLCAyNTUsIHRydWUpOwotICAgIEhEQyBkYyA9IHRyYW5zcGFyZW50REMuaGRj
KCk7Ci0gICAgaWYgKCFkYykKLSAgICAgICAgcmV0dXJuOwotICAgIGRzdFJlY3QubW92ZSh0cmFu
c3BhcmVudERDLnRvU2hpZnQoKSk7Ci0KLSAgICBEcmF3SWNvbkV4KGRjLCBkc3RSZWN0LngoKSwg
ZHN0UmVjdC55KCksIGljb24sIGRzdFJlY3Qud2lkdGgoKSwgZHN0UmVjdC5oZWlnaHQoKSwgMCwg
TlVMTCwgZmxhZ3MpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TaG91
bGRBbnRpYWxpYXMoYm9vbCkKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotfQotCi12b2lkIEdy
YXBoaWNzQ29udGV4dDo6c2V0TGluZURhc2goY29uc3QgRGFzaEFycmF5JiwgZmxvYXQpCi17Ci0g
ICAgbm90SW1wbGVtZW50ZWQoKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBQYXRo
KFdpbmRSdWxlKQotewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VCdWZm
ZXJXaW5DRS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5j
ZS9JbWFnZUJ1ZmZlcldpbkNFLmNwcAkocmV2aXNpb24gNTcyODkpCShmcm9tIFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VCdWZmZXJXaW5jZS5jcHA6NTcyODkpCisrKyBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlQnVmZmVyV2luQ0UuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsMjQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRvcmNo
IE1vYmlsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBUaGlzIGxpYnJhcnkg
aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK
KyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRl
ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFO
WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVS
Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo
ZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls
cy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5
OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBG
bG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiSW1hZ2VCdWZmZXIuaCIKKworI2luY2x1ZGUgIkJhc2U2NC5o
IgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkltYWdlLmgiCisjaW5j
bHVkZSAiSW1hZ2VEYXRhLmgiCisjaW5jbHVkZSAiSlBFR0VuY29kZXIuaCIKKyNpbmNsdWRlICJQ
TkdFbmNvZGVyLmgiCisjaW5jbHVkZSAiU2hhcmVkQml0bWFwLmgiCisjaW5jbHVkZSA8d3RmL1Vu
dXNlZFBhcmFtLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQnVmZmVyZWRJbWFn
ZTogcHVibGljIEltYWdlIHsKKworcHVibGljOgorICAgIEJ1ZmZlcmVkSW1hZ2UoY29uc3QgSW1h
Z2VCdWZmZXJEYXRhKiBkYXRhKQorICAgICAgICA6IG1fZGF0YShkYXRhKQorICAgIHsKKyAgICB9
CisKKyAgICB2aXJ0dWFsIEludFNpemUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEludFNpemUobV9k
YXRhLT5tX2JpdG1hcC0+d2lkdGgoKSwgbV9kYXRhLT5tX2JpdG1hcC0+aGVpZ2h0KCkpOyB9Cisg
ICAgdmlydHVhbCB2b2lkIGRlc3Ryb3lEZWNvZGVkRGF0YShib29sIGRlc3Ryb3lBbGwgPSB0cnVl
KSB7fQorICAgIHZpcnR1YWwgdW5zaWduZWQgZGVjb2RlZFNpemUoKSBjb25zdCB7IHJldHVybiAw
OyB9CisgICAgdmlydHVhbCB2b2lkIGRyYXcoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgRmxvYXRS
ZWN0JiBkc3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9y
KTsKKyAgICB2aXJ0dWFsIHZvaWQgZHJhd1BhdHRlcm4oR3JhcGhpY3NDb250ZXh0KiwgY29uc3Qg
RmxvYXRSZWN0JiBzcmNSZWN0LCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHBhdHRlcm5UcmFuc2Zv
cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIHBoYXNl
LCBDb21wb3NpdGVPcGVyYXRvciwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCk7CisKKyAgICBj
b25zdCBJbWFnZUJ1ZmZlckRhdGEqIG1fZGF0YTsKK307CisKK3ZvaWQgQnVmZmVyZWRJbWFnZTo6
ZHJhdyhHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgY29u
c3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCkKK3sK
KyAgICBJbnRSZWN0IGludERzdFJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KGRzdFJlY3QpOworICAg
IEludFJlY3QgaW50U3JjUmVjdChzcmNSZWN0KTsKKyAgICBtX2RhdGEtPm1fYml0bWFwLT5kcmF3
KGN0eHQsIGludERzdFJlY3QsIGludFNyY1JlY3QsIGNvbXBvc2l0ZU9wKTsKK30KKwordm9pZCBC
dWZmZXJlZEltYWdlOjpkcmF3UGF0dGVybihHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZs
b2F0UmVjdCYgdGlsZVJlY3RJbiwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBwYXR0ZXJuVHJhbnNm
b3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbG9hdFBvaW50JiBwaGFz
ZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QpCit7Cisg
ICAgbV9kYXRhLT5tX2JpdG1hcC0+ZHJhd1BhdHRlcm4oY3R4dCwgdGlsZVJlY3RJbiwgcGF0dGVy
blRyYW5zZm9ybSwgcGhhc2UsIG9wLCBkZXN0UmVjdCwgc2l6ZSgpKTsKK30KKworSW1hZ2VCdWZm
ZXJEYXRhOjpJbWFnZUJ1ZmZlckRhdGEoY29uc3QgSW50U2l6ZSYgc2l6ZSkKKzogbV9iaXRtYXAo
U2hhcmVkQml0bWFwOjpjcmVhdGVJbnN0YW5jZShmYWxzZSwgc2l6ZS53aWR0aCgpLCBzaXplLmhl
aWdodCgpLCBmYWxzZSkpCit7CisgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwOS9XRC1o
dG1sNS0yMDA5MDIxMi90aGUtY2FudmFzLWVsZW1lbnQuaHRtbCNjYW52YXNwaXhlbGFycmF5Cisg
ICAgLy8gIldoZW4gdGhlIGNhbnZhcyBpcyBpbml0aWFsaXplZCBpdCBtdXN0IGJlIHNldCB0byBm
dWxseSB0cmFuc3BhcmVudCBibGFjay4iCisgICAgbV9iaXRtYXAtPnJlc2V0UGl4ZWxzKHRydWUp
OworICAgIG1fYml0bWFwLT5zZXRIYXNBbHBoYSh0cnVlKTsKK30KKworSW1hZ2VCdWZmZXI6Oklt
YWdlQnVmZmVyKGNvbnN0IEludFNpemUmIHNpemUsIEltYWdlQ29sb3JTcGFjZSBjb2xvclNwYWNl
LCBib29sJiBzdWNjZXNzKQorICAgIDogbV9kYXRhKHNpemUpCisgICAgLCBtX3NpemUoc2l6ZSkK
K3sKKyAgICAvLyBGSVhNRTogY29sb3JTcGFjZSBpcyBub3QgdXNlZAorICAgIFVOVVNFRF9QQVJB
TShjb2xvclNwYWNlKTsKKworICAgIG1fY29udGV4dC5zZXQobmV3IEdyYXBoaWNzQ29udGV4dCgw
KSk7CisgICAgbV9jb250ZXh0LT5zZXRCaXRtYXAobV9kYXRhLm1fYml0bWFwKTsKKyAgICBzdWNj
ZXNzID0gdHJ1ZTsKK30KKworSW1hZ2VCdWZmZXI6On5JbWFnZUJ1ZmZlcigpCit7Cit9CisKK0dy
YXBoaWNzQ29udGV4dCogSW1hZ2VCdWZmZXI6OmNvbnRleHQoKSBjb25zdAoreworICAgIHJldHVy
biBtX2NvbnRleHQuZ2V0KCk7Cit9CisKK0ltYWdlKiBJbWFnZUJ1ZmZlcjo6aW1hZ2UoKSBjb25z
dAoreworICAgIGlmICghbV9pbWFnZSkKKyAgICAgICAgbV9pbWFnZSA9IGFkb3B0UmVmKG5ldyBC
dWZmZXJlZEltYWdlKCZtX2RhdGEpKTsKKworICAgIHJldHVybiBtX2ltYWdlLmdldCgpOworfQor
Cit0ZW1wbGF0ZSA8Ym9vbCBwcmVtdWx0aXBsaWVkPiBQYXNzUmVmUHRyPEltYWdlRGF0YT4KK3N0
YXRpYyBnZXRJbWFnZURhdGEoY29uc3QgSW50UmVjdCYgcmVjdCwgY29uc3QgU2hhcmVkQml0bWFw
KiBiaXRtYXApCit7CisgICAgUGFzc1JlZlB0cjxJbWFnZURhdGE+IGltYWdlRGF0YSA9IEltYWdl
RGF0YTo6Y3JlYXRlKHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7CisKKyAgICBjb25zdCB1
bnNpZ25lZCBjaGFyKiBzcmMgPSBzdGF0aWNfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oYml0
bWFwLT5ieXRlcygpKTsKKyAgICBpZiAoIXNyYykKKyAgICAgICAgcmV0dXJuIGltYWdlRGF0YTsK
KworICAgIEludFJlY3Qgc291cmNlUmVjdCgwLCAwLCBiaXRtYXAtPndpZHRoKCksIGJpdG1hcC0+
aGVpZ2h0KCkpOworICAgIHNvdXJjZVJlY3QuaW50ZXJzZWN0KHJlY3QpOworICAgIGlmIChzb3Vy
Y2VSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGltYWdlRGF0YTsKKworICAgIHVuc2ln
bmVkIGNoYXIqIGRzdCA9IGltYWdlRGF0YS0+ZGF0YSgpLT5kYXRhKCktPmRhdGEoKTsKKyAgICBt
ZW1zZXQoZHN0LCAwLCBpbWFnZURhdGEtPmRhdGEoKS0+ZGF0YSgpLT5sZW5ndGgoKSk7CisgICAg
c3JjICs9IChzb3VyY2VSZWN0LnkoKSAqIGJpdG1hcC0+d2lkdGgoKSArIHNvdXJjZVJlY3QueCgp
KSAqIDQ7CisgICAgZHN0ICs9ICgoc291cmNlUmVjdC55KCkgLSByZWN0LnkoKSkgKiBpbWFnZURh
dGEtPndpZHRoKCkgKyBzb3VyY2VSZWN0LngoKSAtIHJlY3QueCgpKSAqIDQ7CisgICAgaW50IGJ5
dGVzVG9Db3B5ID0gc291cmNlUmVjdC53aWR0aCgpICogNDsKKyAgICBpbnQgc3JjU2tpcCA9IChi
aXRtYXAtPndpZHRoKCkgLSBzb3VyY2VSZWN0LndpZHRoKCkpICogNDsKKyAgICBpbnQgZHN0U2tp
cCA9IChpbWFnZURhdGEtPndpZHRoKCkgLSBzb3VyY2VSZWN0LndpZHRoKCkpICogNDsKKyAgICBj
b25zdCB1bnNpZ25lZCBjaGFyKiBkc3RFbmQgPSBkc3QgKyBzb3VyY2VSZWN0LmhlaWdodCgpICog
aW1hZ2VEYXRhLT53aWR0aCgpICogNDsKKyAgICB3aGlsZSAoZHN0IDwgZHN0RW5kKSB7CisgICAg
ICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRzdFJvd0VuZCA9IGRzdCArIGJ5dGVzVG9Db3B5Owor
ICAgICAgICB3aGlsZSAoZHN0IDwgZHN0Um93RW5kKSB7CisgICAgICAgICAgICAvLyBDb252ZXJ0
IEFSR0IgbGl0dGxlIGVuZGlhbiB0byBSR0JBIGJpZyBlbmRpYW4KKyAgICAgICAgICAgIGludCBi
bHVlID0gKnNyYysrOworICAgICAgICAgICAgaW50IGdyZWVuID0gKnNyYysrOworICAgICAgICAg
ICAgaW50IHJlZCA9ICpzcmMrKzsKKyAgICAgICAgICAgIGludCBhbHBoYSA9ICpzcmMrKzsKKyAg
ICAgICAgICAgIGlmIChwcmVtdWx0aXBsaWVkKSB7CisgICAgICAgICAgICAgICAgKmRzdCsrID0g
c3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oKHJlZCAqIGFscGhhICsgMjU0KSAvIDI1NSk7Cisg
ICAgICAgICAgICAgICAgKmRzdCsrID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oKGdyZWVu
ICogYWxwaGEgKyAyNTQpIC8gMjU1KTsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBzdGF0aWNf
Y2FzdDx1bnNpZ25lZCBjaGFyPigoYmx1ZSAqIGFscGhhICsgMjU0KSAvIDI1NSk7CisgICAgICAg
ICAgICAgICAgKmRzdCsrID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYWxwaGEpOworICAg
ICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBzdGF0aWNfY2FzdDx1
bnNpZ25lZCBjaGFyPihyZWQpOworICAgICAgICAgICAgICAgICpkc3QrKyA9IHN0YXRpY19jYXN0
PHVuc2lnbmVkIGNoYXI+KGdyZWVuKTsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBzdGF0aWNf
Y2FzdDx1bnNpZ25lZCBjaGFyPihibHVlKTsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBzdGF0
aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihhbHBoYSk7CisgICAgICAgICAgICAgICAgKytzcmM7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3JjICs9IHNyY1NraXA7CisgICAgICAg
IGRzdCArPSBkc3RTa2lwOworICAgIH0KKworICAgIHJldHVybiBpbWFnZURhdGE7Cit9CisKK1Bh
c3NSZWZQdHI8SW1hZ2VEYXRhPiBJbWFnZUJ1ZmZlcjo6Z2V0VW5tdWx0aXBsaWVkSW1hZ2VEYXRh
KGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIGdldEltYWdlRGF0YTxm
YWxzZT4ocmVjdCwgbV9kYXRhLm1fYml0bWFwLmdldCgpKTsKK30KKworUGFzc1JlZlB0cjxJbWFn
ZURhdGE+IEltYWdlQnVmZmVyOjpnZXRQcmVtdWx0aXBsaWVkSW1hZ2VEYXRhKGNvbnN0IEludFJl
Y3QmIHJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIGdldEltYWdlRGF0YTx0cnVlPihyZWN0LCBt
X2RhdGEubV9iaXRtYXAuZ2V0KCkpOworfQorCit0ZW1wbGF0ZSA8Ym9vbCBwcmVtdWx0aXBsaWVk
Pgorc3RhdGljIHZvaWQgcHV0SW1hZ2VEYXRhKEltYWdlRGF0YSogc291cmNlLCBjb25zdCBJbnRS
ZWN0JiBzb3VyY2VSZWN0LCBjb25zdCBJbnRQb2ludCYgZGVzdFBvaW50LCBTaGFyZWRCaXRtYXAq
IGJpdG1hcCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyKiBkc3QgPSAodW5zaWduZWQgY2hhciopYml0
bWFwLT5ieXRlcygpOworICAgIGlmICghZHN0KQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRS
ZWN0IGRlc3RSZWN0KGRlc3RQb2ludCwgc291cmNlUmVjdC5zaXplKCkpOworICAgIGRlc3RSZWN0
LmludGVyc2VjdChJbnRSZWN0KDAsIDAsIGJpdG1hcC0+d2lkdGgoKSwgYml0bWFwLT5oZWlnaHQo
KSkpOworCisgICAgaWYgKGRlc3RSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgY29uc3QgdW5zaWduZWQgY2hhciogc3JjID0gc291cmNlLT5kYXRhKCktPmRhdGEoKS0+ZGF0
YSgpOworICAgIGRzdCArPSAoZGVzdFJlY3QueSgpICogYml0bWFwLT53aWR0aCgpICsgZGVzdFJl
Y3QueCgpKSAqIDQ7CisgICAgc3JjICs9IChzb3VyY2VSZWN0LnkoKSAqIHNvdXJjZS0+d2lkdGgo
KSArIHNvdXJjZVJlY3QueCgpKSAqIDQ7CisgICAgaW50IGJ5dGVzVG9Db3B5ID0gZGVzdFJlY3Qu
d2lkdGgoKSAqIDQ7CisgICAgaW50IGRzdFNraXAgPSAoYml0bWFwLT53aWR0aCgpIC0gZGVzdFJl
Y3Qud2lkdGgoKSkgKiA0OworICAgIGludCBzcmNTa2lwID0gKHNvdXJjZS0+d2lkdGgoKSAtIGRl
c3RSZWN0LndpZHRoKCkpICogNDsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBkc3RFbmQgPSBk
c3QgKyBkZXN0UmVjdC5oZWlnaHQoKSAqIGJpdG1hcC0+d2lkdGgoKSAqIDQ7CisgICAgd2hpbGUg
KGRzdCA8IGRzdEVuZCkgeworICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBkc3RSb3dFbmQg
PSBkc3QgKyBieXRlc1RvQ29weTsKKyAgICAgICAgd2hpbGUgKGRzdCA8IGRzdFJvd0VuZCkgewor
ICAgICAgICAgICAgLy8gQ29udmVydCBSR0JBIGJpZyBlbmRpYW4gdG8gQVJHQiBsaXR0bGUgZW5k
aWFuCisgICAgICAgICAgICBpbnQgcmVkID0gKnNyYysrOworICAgICAgICAgICAgaW50IGdyZWVu
ID0gKnNyYysrOworICAgICAgICAgICAgaW50IGJsdWUgPSAqc3JjKys7CisgICAgICAgICAgICBp
bnQgYWxwaGEgPSAqc3JjKys7CisgICAgICAgICAgICBpZiAocHJlbXVsdGlwbGllZCkgeworICAg
ICAgICAgICAgICAgICpkc3QrKyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGJsdWUgKiAy
NTUgLyBhbHBoYSk7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gc3RhdGljX2Nhc3Q8dW5zaWdu
ZWQgY2hhcj4oZ3JlZW4gKiAyNTUgLyBhbHBoYSk7CisgICAgICAgICAgICAgICAgKmRzdCsrID0g
c3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4ocmVkICogMjU1IC8gYWxwaGEpOworICAgICAgICAg
ICAgICAgICpkc3QrKyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGFscGhhKTsKKyAgICAg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gc3RhdGljX2Nhc3Q8dW5z
aWduZWQgY2hhcj4oYmx1ZSk7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gc3RhdGljX2Nhc3Q8
dW5zaWduZWQgY2hhcj4oZ3JlZW4pOworICAgICAgICAgICAgICAgICpkc3QrKyA9IHN0YXRpY19j
YXN0PHVuc2lnbmVkIGNoYXI+KHJlZCk7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gc3RhdGlj
X2Nhc3Q8dW5zaWduZWQgY2hhcj4oYWxwaGEpOworICAgICAgICAgICAgfQorICAgICAgICB9Cisg
ICAgICAgIHNyYyArPSBzcmNTa2lwOworICAgICAgICBkc3QgKz0gZHN0U2tpcDsKKyAgICB9Cit9
CisKK3ZvaWQgSW1hZ2VCdWZmZXI6OnB1dFVubXVsdGlwbGllZEltYWdlRGF0YShJbWFnZURhdGEq
IHNvdXJjZSwgY29uc3QgSW50UmVjdCYgc291cmNlUmVjdCwgY29uc3QgSW50UG9pbnQmIGRlc3RQ
b2ludCkKK3sKKyAgICBwdXRJbWFnZURhdGE8ZmFsc2U+KHNvdXJjZSwgc291cmNlUmVjdCwgZGVz
dFBvaW50LCBtX2RhdGEubV9iaXRtYXAuZ2V0KCkpOworfQorCit2b2lkIEltYWdlQnVmZmVyOjpw
dXRQcmVtdWx0aXBsaWVkSW1hZ2VEYXRhKEltYWdlRGF0YSogc291cmNlLCBjb25zdCBJbnRSZWN0
JiBzb3VyY2VSZWN0LCBjb25zdCBJbnRQb2ludCYgZGVzdFBvaW50KQoreworICAgIHB1dEltYWdl
RGF0YTx0cnVlPihzb3VyY2UsIHNvdXJjZVJlY3QsIGRlc3RQb2ludCwgbV9kYXRhLm1fYml0bWFw
LmdldCgpKTsKK30KKworU3RyaW5nIEltYWdlQnVmZmVyOjp0b0RhdGFVUkwoY29uc3QgU3RyaW5n
JiBtaW1lVHlwZSkgY29uc3QKK3sKKyAgICBpZiAoIW1fZGF0YS5tX2JpdG1hcC0+Ynl0ZXMoKSkK
KyAgICAgICAgcmV0dXJuICJkYXRhOiwiOworCisgICAgVmVjdG9yPGNoYXI+IG91dHB1dDsKKyAg
ICBjb25zdCBjaGFyKiBoZWFkZXI7CisgICAgaWYgKG1pbWVUeXBlLmxvd2VyKCkgPT0gImltYWdl
L3BuZyIpIHsKKyAgICAgICAgaWYgKCFjb21wcmVzc0JpdG1hcFRvUG5nKG1fZGF0YS5tX2JpdG1h
cC5nZXQoKSwgb3V0cHV0KSkKKyAgICAgICAgICAgIHJldHVybiAiZGF0YTosIjsKKyAgICAgICAg
aGVhZGVyID0gImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwiOworICAgIH0gZWxzZSB7CisgICAgICAg
IGlmICghY29tcHJlc3NCaXRtYXBUb0pwZWcobV9kYXRhLm1fYml0bWFwLmdldCgpLCBvdXRwdXQp
KQorICAgICAgICAgICAgcmV0dXJuICJkYXRhOiwiOworICAgICAgICBoZWFkZXIgPSAiZGF0YTpp
bWFnZS9qcGVnO2Jhc2U2NCwiOworICAgIH0KKworICAgIFZlY3RvcjxjaGFyPiBiYXNlNjQ7Cisg
ICAgYmFzZTY0RW5jb2RlKG91dHB1dCwgYmFzZTY0KTsKKworICAgIG91dHB1dC5jbGVhcigpOwor
CisgICAgVmVjdG9yPGNoYXI+IHVybDsKKyAgICB1cmwuYXBwZW5kKGhlYWRlciwgc3RybGVuKGhl
YWRlcikpOworICAgIHVybC5hcHBlbmQoYmFzZTY0KTsKKworICAgIHJldHVybiBTdHJpbmcodXJs
LmRhdGEoKSwgdXJsLnNpemUoKSk7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luY2UvSW1hZ2VCdWZmZXJXaW5DRS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZUJ1ZmZlcldpbkNFLmNwcAkocmV2aXNpb24gNTcy
ODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlQnVmZmVyV2luQ0Uu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNDQsNCArMjQ0LDQgQEAgU3RyaW5nIEltYWdlQnVmZmVy
Ojp0b0RhdGFVUkwoY29uc3QgU3RyaQogICAgIHJldHVybiBTdHJpbmcodXJsLmRhdGEoKSwgdXJs
LnNpemUoKSk7CiB9CiAKLX0KK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VCdWZmZXJXaW5jZS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZUJ1ZmZlcldpbmNlLmNwcAko
cmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdl
QnVmZmVyV2luY2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDI0NyArMCwwIEBACi0vKgotICog
Q29weXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgotICoKLSAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCi0gKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqICB2ZXJzaW9uIDIgb2YgdGhlIExp
Y2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRo
aXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl
ZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs
aWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2Vp
dmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICog
IGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBu
b3QsIHdyaXRlIHRvCi0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEg
RnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEs
IFVTQS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiSW1hZ2VCdWZmZXIu
aCIKLQotI2luY2x1ZGUgIkJhc2U2NC5oIgotI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgot
I2luY2x1ZGUgIkltYWdlLmgiCi0jaW5jbHVkZSAiSW1hZ2VEYXRhLmgiCi0jaW5jbHVkZSAiSlBF
R0VuY29kZXIuaCIKLSNpbmNsdWRlICJQTkdFbmNvZGVyLmgiCi0jaW5jbHVkZSAiU2hhcmVkQml0
bWFwLmgiCi0jaW5jbHVkZSA8d3RmL1VudXNlZFBhcmFtLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3Jl
IHsKLQotY2xhc3MgQnVmZmVyZWRJbWFnZTogcHVibGljIEltYWdlIHsKLQotcHVibGljOgotICAg
IEJ1ZmZlcmVkSW1hZ2UoY29uc3QgSW1hZ2VCdWZmZXJEYXRhKiBkYXRhKQotICAgICAgICA6IG1f
ZGF0YShkYXRhKQotICAgIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIEludFNpemUgc2l6ZSgpIGNv
bnN0IHsgcmV0dXJuIEludFNpemUobV9kYXRhLT5tX2JpdG1hcC0+d2lkdGgoKSwgbV9kYXRhLT5t
X2JpdG1hcC0+aGVpZ2h0KCkpOyB9Ci0gICAgdmlydHVhbCB2b2lkIGRlc3Ryb3lEZWNvZGVkRGF0
YShib29sIGRlc3Ryb3lBbGwgPSB0cnVlKSB7fQotICAgIHZpcnR1YWwgdW5zaWduZWQgZGVjb2Rl
ZFNpemUoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0gICAgdmlydHVhbCB2b2lkIGRyYXcoR3JhcGhp
Y3NDb250ZXh0KiwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHNy
Y1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yKTsKLSAgICB2aXJ0dWFsIHZvaWQgZHJhd1BhdHRlcm4o
R3JhcGhpY3NDb250ZXh0KiwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBjb25zdCBBZmZpbmVU
cmFuc2Zvcm0mIHBhdHRlcm5UcmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IEZsb2F0UG9pbnQmIHBoYXNlLCBDb21wb3NpdGVPcGVyYXRvciwgY29uc3QgRmxvYXRS
ZWN0JiBkZXN0UmVjdCk7Ci0KLSAgICBjb25zdCBJbWFnZUJ1ZmZlckRhdGEqIG1fZGF0YTsKLX07
Ci0KLXZvaWQgQnVmZmVyZWRJbWFnZTo6ZHJhdyhHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0
IEZsb2F0UmVjdCYgZHN0UmVjdCwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVP
cGVyYXRvciBjb21wb3NpdGVPcCkKLXsKLSAgICBJbnRSZWN0IGludERzdFJlY3QgPSBlbmNsb3Np
bmdJbnRSZWN0KGRzdFJlY3QpOwotICAgIEludFJlY3QgaW50U3JjUmVjdChzcmNSZWN0KTsKLSAg
ICBtX2RhdGEtPm1fYml0bWFwLT5kcmF3KGN0eHQsIGludERzdFJlY3QsIGludFNyY1JlY3QsIGNv
bXBvc2l0ZU9wKTsKLX0KLQotdm9pZCBCdWZmZXJlZEltYWdlOjpkcmF3UGF0dGVybihHcmFwaGlj
c0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgdGlsZVJlY3RJbiwgY29uc3QgQWZmaW5l
VHJhbnNmb3JtJiBwYXR0ZXJuVHJhbnNmb3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjb25zdCBGbG9hdFBvaW50JiBwaGFzZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIGNvbnN0IEZs
b2F0UmVjdCYgZGVzdFJlY3QpCi17Ci0gICAgbV9kYXRhLT5tX2JpdG1hcC0+ZHJhd1BhdHRlcm4o
Y3R4dCwgdGlsZVJlY3RJbiwgcGF0dGVyblRyYW5zZm9ybSwgcGhhc2UsIG9wLCBkZXN0UmVjdCwg
c2l6ZSgpKTsKLX0KLQotSW1hZ2VCdWZmZXJEYXRhOjpJbWFnZUJ1ZmZlckRhdGEoY29uc3QgSW50
U2l6ZSYgc2l6ZSkKLTogbV9iaXRtYXAoU2hhcmVkQml0bWFwOjpjcmVhdGVJbnN0YW5jZShmYWxz
ZSwgc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpLCBmYWxzZSkpCi17Ci0gICAgLy8gaHR0cDov
L3d3dy53My5vcmcvVFIvMjAwOS9XRC1odG1sNS0yMDA5MDIxMi90aGUtY2FudmFzLWVsZW1lbnQu
aHRtbCNjYW52YXNwaXhlbGFycmF5Ci0gICAgLy8gIldoZW4gdGhlIGNhbnZhcyBpcyBpbml0aWFs
aXplZCBpdCBtdXN0IGJlIHNldCB0byBmdWxseSB0cmFuc3BhcmVudCBibGFjay4iCi0gICAgbV9i
aXRtYXAtPnJlc2V0UGl4ZWxzKHRydWUpOwotICAgIG1fYml0bWFwLT5zZXRIYXNBbHBoYSh0cnVl
KTsKLX0KLQotSW1hZ2VCdWZmZXI6OkltYWdlQnVmZmVyKGNvbnN0IEludFNpemUmIHNpemUsIElt
YWdlQ29sb3JTcGFjZSBjb2xvclNwYWNlLCBib29sJiBzdWNjZXNzKQotICAgIDogbV9kYXRhKHNp
emUpCi0gICAgLCBtX3NpemUoc2l6ZSkKLXsKLSAgICAvLyBGSVhNRTogY29sb3JTcGFjZSBpcyBu
b3QgdXNlZAotICAgIFVOVVNFRF9QQVJBTShjb2xvclNwYWNlKTsKLQotICAgIG1fY29udGV4dC5z
ZXQobmV3IEdyYXBoaWNzQ29udGV4dCgwKSk7Ci0gICAgbV9jb250ZXh0LT5zZXRCaXRtYXAobV9k
YXRhLm1fYml0bWFwKTsKLSAgICBzdWNjZXNzID0gdHJ1ZTsKLX0KLQotSW1hZ2VCdWZmZXI6On5J
bWFnZUJ1ZmZlcigpCi17Ci19Ci0KLUdyYXBoaWNzQ29udGV4dCogSW1hZ2VCdWZmZXI6OmNvbnRl
eHQoKSBjb25zdAotewotICAgIHJldHVybiBtX2NvbnRleHQuZ2V0KCk7Ci19Ci0KLUltYWdlKiBJ
bWFnZUJ1ZmZlcjo6aW1hZ2UoKSBjb25zdAotewotICAgIGlmICghbV9pbWFnZSkKLSAgICAgICAg
bV9pbWFnZSA9IGFkb3B0UmVmKG5ldyBCdWZmZXJlZEltYWdlKCZtX2RhdGEpKTsKLQotICAgIHJl
dHVybiBtX2ltYWdlLmdldCgpOwotfQotCi10ZW1wbGF0ZSA8Ym9vbCBwcmVtdWx0aXBsaWVkPiBQ
YXNzUmVmUHRyPEltYWdlRGF0YT4KLXN0YXRpYyBnZXRJbWFnZURhdGEoY29uc3QgSW50UmVjdCYg
cmVjdCwgY29uc3QgU2hhcmVkQml0bWFwKiBiaXRtYXApCi17Ci0gICAgUGFzc1JlZlB0cjxJbWFn
ZURhdGE+IGltYWdlRGF0YSA9IEltYWdlRGF0YTo6Y3JlYXRlKHJlY3Qud2lkdGgoKSwgcmVjdC5o
ZWlnaHQoKSk7Ci0KLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBzcmMgPSBzdGF0aWNfY2FzdDxj
b25zdCB1bnNpZ25lZCBjaGFyKj4oYml0bWFwLT5ieXRlcygpKTsKLSAgICBpZiAoIXNyYykKLSAg
ICAgICAgcmV0dXJuIGltYWdlRGF0YTsKLQotICAgIEludFJlY3Qgc291cmNlUmVjdCgwLCAwLCBi
aXRtYXAtPndpZHRoKCksIGJpdG1hcC0+aGVpZ2h0KCkpOwotICAgIHNvdXJjZVJlY3QuaW50ZXJz
ZWN0KHJlY3QpOwotICAgIGlmIChzb3VyY2VSZWN0LmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJu
IGltYWdlRGF0YTsKLQotICAgIHVuc2lnbmVkIGNoYXIqIGRzdCA9IGltYWdlRGF0YS0+ZGF0YSgp
LT5kYXRhKCktPmRhdGEoKTsKLSAgICBtZW1zZXQoZHN0LCAwLCBpbWFnZURhdGEtPmRhdGEoKS0+
ZGF0YSgpLT5sZW5ndGgoKSk7Ci0gICAgc3JjICs9IChzb3VyY2VSZWN0LnkoKSAqIGJpdG1hcC0+
d2lkdGgoKSArIHNvdXJjZVJlY3QueCgpKSAqIDQ7Ci0gICAgZHN0ICs9ICgoc291cmNlUmVjdC55
KCkgLSByZWN0LnkoKSkgKiBpbWFnZURhdGEtPndpZHRoKCkgKyBzb3VyY2VSZWN0LngoKSAtIHJl
Y3QueCgpKSAqIDQ7Ci0gICAgaW50IGJ5dGVzVG9Db3B5ID0gc291cmNlUmVjdC53aWR0aCgpICog
NDsKLSAgICBpbnQgc3JjU2tpcCA9IChiaXRtYXAtPndpZHRoKCkgLSBzb3VyY2VSZWN0LndpZHRo
KCkpICogNDsKLSAgICBpbnQgZHN0U2tpcCA9IChpbWFnZURhdGEtPndpZHRoKCkgLSBzb3VyY2VS
ZWN0LndpZHRoKCkpICogNDsKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBkc3RFbmQgPSBkc3Qg
KyBzb3VyY2VSZWN0LmhlaWdodCgpICogaW1hZ2VEYXRhLT53aWR0aCgpICogNDsKLSAgICB3aGls
ZSAoZHN0IDwgZHN0RW5kKSB7Ci0gICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRzdFJvd0Vu
ZCA9IGRzdCArIGJ5dGVzVG9Db3B5OwotICAgICAgICB3aGlsZSAoZHN0IDwgZHN0Um93RW5kKSB7
Ci0gICAgICAgICAgICAvLyBDb252ZXJ0IEFSR0IgbGl0dGxlIGVuZGlhbiB0byBSR0JBIGJpZyBl
bmRpYW4KLSAgICAgICAgICAgIGludCBibHVlID0gKnNyYysrOwotICAgICAgICAgICAgaW50IGdy
ZWVuID0gKnNyYysrOwotICAgICAgICAgICAgaW50IHJlZCA9ICpzcmMrKzsKLSAgICAgICAgICAg
IGludCBhbHBoYSA9ICpzcmMrKzsKLSAgICAgICAgICAgIGlmIChwcmVtdWx0aXBsaWVkKSB7Ci0g
ICAgICAgICAgICAgICAgKmRzdCsrID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oKHJlZCAq
IGFscGhhICsgMjU0KSAvIDI1NSk7Ci0gICAgICAgICAgICAgICAgKmRzdCsrID0gc3RhdGljX2Nh
c3Q8dW5zaWduZWQgY2hhcj4oKGdyZWVuICogYWxwaGEgKyAyNTQpIC8gMjU1KTsKLSAgICAgICAg
ICAgICAgICAqZHN0KysgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigoYmx1ZSAqIGFscGhh
ICsgMjU0KSAvIDI1NSk7Ci0gICAgICAgICAgICAgICAgKmRzdCsrID0gc3RhdGljX2Nhc3Q8dW5z
aWduZWQgY2hhcj4oYWxwaGEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAg
ICAqZHN0KysgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihyZWQpOwotICAgICAgICAgICAg
ICAgICpkc3QrKyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGdyZWVuKTsKLSAgICAgICAg
ICAgICAgICAqZHN0KysgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihibHVlKTsKLSAgICAg
ICAgICAgICAgICAqZHN0KysgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihhbHBoYSk7Ci0g
ICAgICAgICAgICAgICAgKytzcmM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAg
c3JjICs9IHNyY1NraXA7Ci0gICAgICAgIGRzdCArPSBkc3RTa2lwOwotICAgIH0KLQotICAgIHJl
dHVybiBpbWFnZURhdGE7Ci19Ci0KLVBhc3NSZWZQdHI8SW1hZ2VEYXRhPiBJbWFnZUJ1ZmZlcjo6
Z2V0VW5tdWx0aXBsaWVkSW1hZ2VEYXRhKGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGdldEltYWdlRGF0YTxmYWxzZT4ocmVjdCwgbV9kYXRhLm1fYml0bWFwLmdldCgp
KTsKLX0KLQotUGFzc1JlZlB0cjxJbWFnZURhdGE+IEltYWdlQnVmZmVyOjpnZXRQcmVtdWx0aXBs
aWVkSW1hZ2VEYXRhKGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdl
dEltYWdlRGF0YTx0cnVlPihyZWN0LCBtX2RhdGEubV9iaXRtYXAuZ2V0KCkpOwotfQotCi10ZW1w
bGF0ZSA8Ym9vbCBwcmVtdWx0aXBsaWVkPgotc3RhdGljIHZvaWQgcHV0SW1hZ2VEYXRhKEltYWdl
RGF0YSogc291cmNlLCBjb25zdCBJbnRSZWN0JiBzb3VyY2VSZWN0LCBjb25zdCBJbnRQb2ludCYg
ZGVzdFBvaW50LCBTaGFyZWRCaXRtYXAqIGJpdG1hcCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyKiBk
c3QgPSAodW5zaWduZWQgY2hhciopYml0bWFwLT5ieXRlcygpOwotICAgIGlmICghZHN0KQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBJbnRSZWN0IGRlc3RSZWN0KGRlc3RQb2ludCwgc291cmNlUmVj
dC5zaXplKCkpOwotICAgIGRlc3RSZWN0LmludGVyc2VjdChJbnRSZWN0KDAsIDAsIGJpdG1hcC0+
d2lkdGgoKSwgYml0bWFwLT5oZWlnaHQoKSkpOwotCi0gICAgaWYgKGRlc3RSZWN0LmlzRW1wdHko
KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciogc3JjID0gc291
cmNlLT5kYXRhKCktPmRhdGEoKS0+ZGF0YSgpOwotICAgIGRzdCArPSAoZGVzdFJlY3QueSgpICog
Yml0bWFwLT53aWR0aCgpICsgZGVzdFJlY3QueCgpKSAqIDQ7Ci0gICAgc3JjICs9IChzb3VyY2VS
ZWN0LnkoKSAqIHNvdXJjZS0+d2lkdGgoKSArIHNvdXJjZVJlY3QueCgpKSAqIDQ7Ci0gICAgaW50
IGJ5dGVzVG9Db3B5ID0gZGVzdFJlY3Qud2lkdGgoKSAqIDQ7Ci0gICAgaW50IGRzdFNraXAgPSAo
Yml0bWFwLT53aWR0aCgpIC0gZGVzdFJlY3Qud2lkdGgoKSkgKiA0OwotICAgIGludCBzcmNTa2lw
ID0gKHNvdXJjZS0+d2lkdGgoKSAtIGRlc3RSZWN0LndpZHRoKCkpICogNDsKLSAgICBjb25zdCB1
bnNpZ25lZCBjaGFyKiBkc3RFbmQgPSBkc3QgKyBkZXN0UmVjdC5oZWlnaHQoKSAqIGJpdG1hcC0+
d2lkdGgoKSAqIDQ7Ci0gICAgd2hpbGUgKGRzdCA8IGRzdEVuZCkgewotICAgICAgICBjb25zdCB1
bnNpZ25lZCBjaGFyKiBkc3RSb3dFbmQgPSBkc3QgKyBieXRlc1RvQ29weTsKLSAgICAgICAgd2hp
bGUgKGRzdCA8IGRzdFJvd0VuZCkgewotICAgICAgICAgICAgLy8gQ29udmVydCBSR0JBIGJpZyBl
bmRpYW4gdG8gQVJHQiBsaXR0bGUgZW5kaWFuCi0gICAgICAgICAgICBpbnQgcmVkID0gKnNyYysr
OwotICAgICAgICAgICAgaW50IGdyZWVuID0gKnNyYysrOwotICAgICAgICAgICAgaW50IGJsdWUg
PSAqc3JjKys7Ci0gICAgICAgICAgICBpbnQgYWxwaGEgPSAqc3JjKys7Ci0gICAgICAgICAgICBp
ZiAocHJlbXVsdGlwbGllZCkgewotICAgICAgICAgICAgICAgICpkc3QrKyA9IHN0YXRpY19jYXN0
PHVuc2lnbmVkIGNoYXI+KGJsdWUgKiAyNTUgLyBhbHBoYSk7Ci0gICAgICAgICAgICAgICAgKmRz
dCsrID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oZ3JlZW4gKiAyNTUgLyBhbHBoYSk7Ci0g
ICAgICAgICAgICAgICAgKmRzdCsrID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4ocmVkICog
MjU1IC8gYWxwaGEpOwotICAgICAgICAgICAgICAgICpkc3QrKyA9IHN0YXRpY19jYXN0PHVuc2ln
bmVkIGNoYXI+KGFscGhhKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAg
KmRzdCsrID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYmx1ZSk7Ci0gICAgICAgICAgICAg
ICAgKmRzdCsrID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oZ3JlZW4pOwotICAgICAgICAg
ICAgICAgICpkc3QrKyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KHJlZCk7Ci0gICAgICAg
ICAgICAgICAgKmRzdCsrID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYWxwaGEpOwotICAg
ICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNyYyArPSBzcmNTa2lwOwotICAgICAgICBk
c3QgKz0gZHN0U2tpcDsKLSAgICB9Ci19Ci0KLXZvaWQgSW1hZ2VCdWZmZXI6OnB1dFVubXVsdGlw
bGllZEltYWdlRGF0YShJbWFnZURhdGEqIHNvdXJjZSwgY29uc3QgSW50UmVjdCYgc291cmNlUmVj
dCwgY29uc3QgSW50UG9pbnQmIGRlc3RQb2ludCkKLXsKLSAgICBwdXRJbWFnZURhdGE8ZmFsc2U+
KHNvdXJjZSwgc291cmNlUmVjdCwgZGVzdFBvaW50LCBtX2RhdGEubV9iaXRtYXAuZ2V0KCkpOwot
fQotCi12b2lkIEltYWdlQnVmZmVyOjpwdXRQcmVtdWx0aXBsaWVkSW1hZ2VEYXRhKEltYWdlRGF0
YSogc291cmNlLCBjb25zdCBJbnRSZWN0JiBzb3VyY2VSZWN0LCBjb25zdCBJbnRQb2ludCYgZGVz
dFBvaW50KQotewotICAgIHB1dEltYWdlRGF0YTx0cnVlPihzb3VyY2UsIHNvdXJjZVJlY3QsIGRl
c3RQb2ludCwgbV9kYXRhLm1fYml0bWFwLmdldCgpKTsKLX0KLQotU3RyaW5nIEltYWdlQnVmZmVy
Ojp0b0RhdGFVUkwoY29uc3QgU3RyaW5nJiBtaW1lVHlwZSkgY29uc3QKLXsKLSAgICBpZiAoIW1f
ZGF0YS5tX2JpdG1hcC0+Ynl0ZXMoKSkKLSAgICAgICAgcmV0dXJuICJkYXRhOiwiOwotCi0gICAg
VmVjdG9yPGNoYXI+IG91dHB1dDsKLSAgICBjb25zdCBjaGFyKiBoZWFkZXI7Ci0gICAgaWYgKG1p
bWVUeXBlLmxvd2VyKCkgPT0gImltYWdlL3BuZyIpIHsKLSAgICAgICAgaWYgKCFjb21wcmVzc0Jp
dG1hcFRvUG5nKG1fZGF0YS5tX2JpdG1hcC5nZXQoKSwgb3V0cHV0KSkKLSAgICAgICAgICAgIHJl
dHVybiAiZGF0YTosIjsKLSAgICAgICAgaGVhZGVyID0gImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwi
OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghY29tcHJlc3NCaXRtYXBUb0pwZWcobV9kYXRh
Lm1fYml0bWFwLmdldCgpLCBvdXRwdXQpKQotICAgICAgICAgICAgcmV0dXJuICJkYXRhOiwiOwot
ICAgICAgICBoZWFkZXIgPSAiZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwiOwotICAgIH0KLQotICAg
IFZlY3RvcjxjaGFyPiBiYXNlNjQ7Ci0gICAgYmFzZTY0RW5jb2RlKG91dHB1dCwgYmFzZTY0KTsK
LQotICAgIG91dHB1dC5jbGVhcigpOwotCi0gICAgVmVjdG9yPGNoYXI+IHVybDsKLSAgICB1cmwu
YXBwZW5kKGhlYWRlciwgc3RybGVuKGhlYWRlcikpOwotICAgIHVybC5hcHBlbmQoYmFzZTY0KTsK
LQotICAgIHJldHVybiBTdHJpbmcodXJsLmRhdGEoKSwgdXJsLnNpemUoKSk7Ci19Ci0KLX0KSW5k
ZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVkaWFQbGF5ZXJQcml2YXRlV2lu
Q0UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01lZGlh
UGxheWVyUHJpdmF0ZVdpbkNFLmgJKHJldmlzaW9uIDU3Mjg5KQkoZnJvbSBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbmNlL01lZGlhUGxheWVyUHJpdmF0ZVdpbmNlLmg6NTcyODkpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01lZGlhUGxheWVyUHJpdmF0ZVdpbkNFLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDcsIDIwMDgsIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJp
Z2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpZm5kZWYgTWVkaWFQbGF5ZXJQcml2YXRlV2luY2VfaAorI2RlZmluZSBNZWRpYVBsYXll
clByaXZhdGVXaW5jZV9oCisKKyNpZiBFTkFCTEUoVklERU8pCisKKyNpbmNsdWRlICJNZWRpYVBs
YXllclByaXZhdGUuaCIKKyNpbmNsdWRlICJUaW1lci5oIgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIu
aD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAgY2xhc3MgR3JhcGhpY3NDb250ZXh0Owor
ICAgIGNsYXNzIEludFNpemU7CisgICAgY2xhc3MgSW50UmVjdDsKKyAgICBjbGFzcyBTdHJpbmc7
CisKKyAgICBjbGFzcyBNZWRpYVBsYXllclByaXZhdGUgOiBwdWJsaWMgTWVkaWFQbGF5ZXJQcml2
YXRlSW50ZXJmYWNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHN0YXRpYyB2b2lkIHJlZ2lzdGVy
TWVkaWFFbmdpbmUoTWVkaWFFbmdpbmVSZWdpc3RyYXIpOworCisgICAgICAgIH5NZWRpYVBsYXll
clByaXZhdGUoKTsKKworICAgICAgICBJbnRTaXplIG5hdHVyYWxTaXplKCkgY29uc3Q7CisgICAg
ICAgIGJvb2wgaGFzVmlkZW8oKSBjb25zdDsKKworICAgICAgICB2b2lkIGxvYWQoY29uc3QgU3Ry
aW5nJiB1cmwpOworICAgICAgICB2b2lkIGNhbmNlbExvYWQoKTsKKworICAgICAgICB2b2lkIHBs
YXkoKTsKKyAgICAgICAgdm9pZCBwYXVzZSgpOworCisgICAgICAgIGJvb2wgcGF1c2VkKCkgY29u
c3Q7CisgICAgICAgIGJvb2wgc2Vla2luZygpIGNvbnN0OworCisgICAgICAgIGZsb2F0IGR1cmF0
aW9uKCkgY29uc3Q7CisgICAgICAgIGZsb2F0IGN1cnJlbnRUaW1lKCkgY29uc3Q7CisgICAgICAg
IHZvaWQgc2VlayhmbG9hdCB0aW1lKTsKKworICAgICAgICB2b2lkIHNldFJhdGUoZmxvYXQpOwor
ICAgICAgICB2b2lkIHNldFZvbHVtZShmbG9hdCk7CisKKyAgICAgICAgTWVkaWFQbGF5ZXI6Ok5l
dHdvcmtTdGF0ZSBuZXR3b3JrU3RhdGUoKSBjb25zdCB7IHJldHVybiBtX25ldHdvcmtTdGF0ZTsg
fQorICAgICAgICBNZWRpYVBsYXllcjo6UmVhZHlTdGF0ZSByZWFkeVN0YXRlKCkgY29uc3QgeyBy
ZXR1cm4gbV9yZWFkeVN0YXRlOyB9CisKKyAgICAgICAgUGFzc1JlZlB0cjxUaW1lUmFuZ2VzPiBi
dWZmZXJlZCgpIGNvbnN0OworICAgICAgICBmbG9hdCBtYXhUaW1lU2Vla2FibGUoKSBjb25zdDsK
KyAgICAgICAgdW5zaWduZWQgYnl0ZXNMb2FkZWQoKSBjb25zdDsKKyAgICAgICAgdW5zaWduZWQg
dG90YWxCeXRlcygpIGNvbnN0OworCisgICAgICAgIHZvaWQgc2V0VmlzaWJsZShib29sKTsKKyAg
ICAgICAgdm9pZCBzZXRTaXplKGNvbnN0IEludFNpemUmKTsKKworICAgICAgICB2b2lkIGxvYWRT
dGF0ZUNoYW5nZWQoKTsKKyAgICAgICAgdm9pZCBkaWRFbmQoKTsKKworICAgICAgICB2b2lkIHBh
aW50KEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IEludFJlY3QmKTsKKworICAgIHByaXZhdGU6Cisg
ICAgICAgIE1lZGlhUGxheWVyUHJpdmF0ZShNZWRpYVBsYXllciopOworCisgICAgICAgIHZvaWQg
dXBkYXRlU3RhdGVzKCk7CisgICAgICAgIHZvaWQgZG9TZWVrKCk7CisgICAgICAgIHZvaWQgY2Fu
Y2VsU2VlaygpOworICAgICAgICB2b2lkIHNlZWtUaW1lckZpcmVkKFRpbWVyPE1lZGlhUGxheWVy
UHJpdmF0ZT4qKTsKKyAgICAgICAgZmxvYXQgbWF4VGltZUxvYWRlZCgpIGNvbnN0OworICAgICAg
ICB2b2lkIHNhd1Vuc3VwcG9ydGVkVHJhY2tzKCk7CisjaWYgRU5BQkxFKFBMVUdJTl9QUk9YWV9G
T1JfVklERU8pCisgICAgICAgIHZvaWQgc2V0TWVkaWFQbGF5ZXJQcm94eShXZWJNZWRpYVBsYXll
clByb3h5Kik7CisgICAgICAgIHZvaWQgc2V0UG9zdGVyKGNvbnN0IFN0cmluZyYgdXJsKTsKKyAg
ICAgICAgdm9pZCBkZWxpdmVyTm90aWZpY2F0aW9uKE1lZGlhUGxheWVyUHJveHlOb3RpZmljYXRp
b25UeXBlKTsKKyNlbmRpZgorCisgICAgICAgIC8vIGVuZ2luZSBzdXBwb3J0CisgICAgICAgIHN0
YXRpYyBNZWRpYVBsYXllclByaXZhdGVJbnRlcmZhY2UqIGNyZWF0ZShNZWRpYVBsYXllciopOwor
ICAgICAgICBzdGF0aWMgdm9pZCBnZXRTdXBwb3J0ZWRUeXBlcyhIYXNoU2V0PFN0cmluZz4mIHR5
cGVzKTsKKyAgICAgICAgc3RhdGljIE1lZGlhUGxheWVyOjpTdXBwb3J0c1R5cGUgc3VwcG9ydHNU
eXBlKGNvbnN0IFN0cmluZyYgdHlwZSwgY29uc3QgU3RyaW5nJiBjb2RlY3MpOworICAgICAgICBz
dGF0aWMgYm9vbCBpc0F2YWlsYWJsZSgpOworCisgICAgICAgIE1lZGlhUGxheWVyKiBtX3BsYXll
cjsKKyAgICAgICAgZmxvYXQgbV9zZWVrVG87CisgICAgICAgIGZsb2F0IG1fZW5kVGltZTsKKyAg
ICAgICAgVGltZXI8TWVkaWFQbGF5ZXJQcml2YXRlPiBtX3NlZWtUaW1lcjsKKyAgICAgICAgTWVk
aWFQbGF5ZXI6Ok5ldHdvcmtTdGF0ZSBtX25ldHdvcmtTdGF0ZTsKKyAgICAgICAgTWVkaWFQbGF5
ZXI6OlJlYWR5U3RhdGUgbV9yZWFkeVN0YXRlOworICAgICAgICB1bnNpZ25lZCBtX2VuYWJsZWRU
cmFja0NvdW50OworICAgICAgICB1bnNpZ25lZCBtX3RvdGFsVHJhY2tDb3VudDsKKyAgICAgICAg
Ym9vbCBtX2hhc1Vuc3VwcG9ydGVkVHJhY2tzOworICAgICAgICBib29sIG1fc3RhcnRlZFBsYXlp
bmc7CisgICAgICAgIGJvb2wgbV9pc1N0cmVhbWluZzsKKyNpZiBFTkFCTEUoUExVR0lOX1BST1hZ
X0ZPUl9WSURFTykKKyAgICAgICAgV2ViTWVkaWFQbGF5ZXJQcm94eSogbV9wcm94eTsKKyNlbmRp
ZgorICAgIH07CisKK30KKworI2VuZGlmCisKKyNlbmRpZgpJbmRleDogV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW5jZS9NZWRpYVBsYXllclByaXZhdGVXaW5DRS5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVkaWFQbGF5ZXJQcml2YXRlV2luQ0Uu
aAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01l
ZGlhUGxheWVyUHJpdmF0ZVdpbkNFLmgJKHdvcmtpbmcgY29weSkKQEAgLTI0LDggKzI0LDggQEAK
ICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAogICovCiAKLSNpZm5kZWYgTWVkaWFQbGF5ZXJQcml2YXRlV2luY2Vf
aAotI2RlZmluZSBNZWRpYVBsYXllclByaXZhdGVXaW5jZV9oCisjaWZuZGVmIE1lZGlhUGxheWVy
UHJpdmF0ZVdpbkNFX2gKKyNkZWZpbmUgTWVkaWFQbGF5ZXJQcml2YXRlV2luQ0VfaAogCiAjaWYg
RU5BQkxFKFZJREVPKQogCkBAIC0xMjAsNiArMTIwLDYgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewog
CiB9CiAKLSNlbmRpZgorI2VuZGlmIC8vIEVOQUJMRShWSURFTykKIAotI2VuZGlmCisjZW5kaWYg
Ly8gTWVkaWFQbGF5ZXJQcml2YXRlV2luQ0VfaApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW5jZS9NZWRpYVBsYXllclByaXZhdGVXaW5jZS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvTWVkaWFQbGF5ZXJQcml2YXRlV2luY2UuaAkocmV2
aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL01lZGlhUGxh
eWVyUHJpdmF0ZVdpbmNlLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0g
KiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDgsIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6
Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
LSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAotICovCi0KLSNpZm5kZWYgTWVkaWFQbGF5ZXJQcml2YXRlV2luY2VfaAot
I2RlZmluZSBNZWRpYVBsYXllclByaXZhdGVXaW5jZV9oCi0KLSNpZiBFTkFCTEUoVklERU8pCi0K
LSNpbmNsdWRlICJNZWRpYVBsYXllclByaXZhdGUuaCIKLSNpbmNsdWRlICJUaW1lci5oIgotI2lu
Y2x1ZGUgPHd0Zi9Pd25QdHIuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi0gICAgY2xhc3Mg
R3JhcGhpY3NDb250ZXh0OwotICAgIGNsYXNzIEludFNpemU7Ci0gICAgY2xhc3MgSW50UmVjdDsK
LSAgICBjbGFzcyBTdHJpbmc7Ci0KLSAgICBjbGFzcyBNZWRpYVBsYXllclByaXZhdGUgOiBwdWJs
aWMgTWVkaWFQbGF5ZXJQcml2YXRlSW50ZXJmYWNlIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIHN0
YXRpYyB2b2lkIHJlZ2lzdGVyTWVkaWFFbmdpbmUoTWVkaWFFbmdpbmVSZWdpc3RyYXIpOwotCi0g
ICAgICAgIH5NZWRpYVBsYXllclByaXZhdGUoKTsKLQotICAgICAgICBJbnRTaXplIG5hdHVyYWxT
aXplKCkgY29uc3Q7Ci0gICAgICAgIGJvb2wgaGFzVmlkZW8oKSBjb25zdDsKLQotICAgICAgICB2
b2lkIGxvYWQoY29uc3QgU3RyaW5nJiB1cmwpOwotICAgICAgICB2b2lkIGNhbmNlbExvYWQoKTsK
LQotICAgICAgICB2b2lkIHBsYXkoKTsKLSAgICAgICAgdm9pZCBwYXVzZSgpOwotCi0gICAgICAg
IGJvb2wgcGF1c2VkKCkgY29uc3Q7Ci0gICAgICAgIGJvb2wgc2Vla2luZygpIGNvbnN0OwotCi0g
ICAgICAgIGZsb2F0IGR1cmF0aW9uKCkgY29uc3Q7Ci0gICAgICAgIGZsb2F0IGN1cnJlbnRUaW1l
KCkgY29uc3Q7Ci0gICAgICAgIHZvaWQgc2VlayhmbG9hdCB0aW1lKTsKLQotICAgICAgICB2b2lk
IHNldFJhdGUoZmxvYXQpOwotICAgICAgICB2b2lkIHNldFZvbHVtZShmbG9hdCk7Ci0KLSAgICAg
ICAgTWVkaWFQbGF5ZXI6Ok5ldHdvcmtTdGF0ZSBuZXR3b3JrU3RhdGUoKSBjb25zdCB7IHJldHVy
biBtX25ldHdvcmtTdGF0ZTsgfQotICAgICAgICBNZWRpYVBsYXllcjo6UmVhZHlTdGF0ZSByZWFk
eVN0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9yZWFkeVN0YXRlOyB9Ci0KLSAgICAgICAgUGFzc1Jl
ZlB0cjxUaW1lUmFuZ2VzPiBidWZmZXJlZCgpIGNvbnN0OwotICAgICAgICBmbG9hdCBtYXhUaW1l
U2Vla2FibGUoKSBjb25zdDsKLSAgICAgICAgdW5zaWduZWQgYnl0ZXNMb2FkZWQoKSBjb25zdDsK
LSAgICAgICAgdW5zaWduZWQgdG90YWxCeXRlcygpIGNvbnN0OwotCi0gICAgICAgIHZvaWQgc2V0
VmlzaWJsZShib29sKTsKLSAgICAgICAgdm9pZCBzZXRTaXplKGNvbnN0IEludFNpemUmKTsKLQot
ICAgICAgICB2b2lkIGxvYWRTdGF0ZUNoYW5nZWQoKTsKLSAgICAgICAgdm9pZCBkaWRFbmQoKTsK
LQotICAgICAgICB2b2lkIHBhaW50KEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IEludFJlY3QmKTsK
LQotICAgIHByaXZhdGU6Ci0gICAgICAgIE1lZGlhUGxheWVyUHJpdmF0ZShNZWRpYVBsYXllciop
OwotCi0gICAgICAgIHZvaWQgdXBkYXRlU3RhdGVzKCk7Ci0gICAgICAgIHZvaWQgZG9TZWVrKCk7
Ci0gICAgICAgIHZvaWQgY2FuY2VsU2VlaygpOwotICAgICAgICB2b2lkIHNlZWtUaW1lckZpcmVk
KFRpbWVyPE1lZGlhUGxheWVyUHJpdmF0ZT4qKTsKLSAgICAgICAgZmxvYXQgbWF4VGltZUxvYWRl
ZCgpIGNvbnN0OwotICAgICAgICB2b2lkIHNhd1Vuc3VwcG9ydGVkVHJhY2tzKCk7Ci0jaWYgRU5B
QkxFKFBMVUdJTl9QUk9YWV9GT1JfVklERU8pCi0gICAgICAgIHZvaWQgc2V0TWVkaWFQbGF5ZXJQ
cm94eShXZWJNZWRpYVBsYXllclByb3h5Kik7Ci0gICAgICAgIHZvaWQgc2V0UG9zdGVyKGNvbnN0
IFN0cmluZyYgdXJsKTsKLSAgICAgICAgdm9pZCBkZWxpdmVyTm90aWZpY2F0aW9uKE1lZGlhUGxh
eWVyUHJveHlOb3RpZmljYXRpb25UeXBlKTsKLSNlbmRpZgotCi0gICAgICAgIC8vIGVuZ2luZSBz
dXBwb3J0Ci0gICAgICAgIHN0YXRpYyBNZWRpYVBsYXllclByaXZhdGVJbnRlcmZhY2UqIGNyZWF0
ZShNZWRpYVBsYXllciopOwotICAgICAgICBzdGF0aWMgdm9pZCBnZXRTdXBwb3J0ZWRUeXBlcyhI
YXNoU2V0PFN0cmluZz4mIHR5cGVzKTsKLSAgICAgICAgc3RhdGljIE1lZGlhUGxheWVyOjpTdXBw
b3J0c1R5cGUgc3VwcG9ydHNUeXBlKGNvbnN0IFN0cmluZyYgdHlwZSwgY29uc3QgU3RyaW5nJiBj
b2RlY3MpOwotICAgICAgICBzdGF0aWMgYm9vbCBpc0F2YWlsYWJsZSgpOwotCi0gICAgICAgIE1l
ZGlhUGxheWVyKiBtX3BsYXllcjsKLSAgICAgICAgZmxvYXQgbV9zZWVrVG87Ci0gICAgICAgIGZs
b2F0IG1fZW5kVGltZTsKLSAgICAgICAgVGltZXI8TWVkaWFQbGF5ZXJQcml2YXRlPiBtX3NlZWtU
aW1lcjsKLSAgICAgICAgTWVkaWFQbGF5ZXI6Ok5ldHdvcmtTdGF0ZSBtX25ldHdvcmtTdGF0ZTsK
LSAgICAgICAgTWVkaWFQbGF5ZXI6OlJlYWR5U3RhdGUgbV9yZWFkeVN0YXRlOwotICAgICAgICB1
bnNpZ25lZCBtX2VuYWJsZWRUcmFja0NvdW50OwotICAgICAgICB1bnNpZ25lZCBtX3RvdGFsVHJh
Y2tDb3VudDsKLSAgICAgICAgYm9vbCBtX2hhc1Vuc3VwcG9ydGVkVHJhY2tzOwotICAgICAgICBi
b29sIG1fc3RhcnRlZFBsYXlpbmc7Ci0gICAgICAgIGJvb2wgbV9pc1N0cmVhbWluZzsKLSNpZiBF
TkFCTEUoUExVR0lOX1BST1hZX0ZPUl9WSURFTykKLSAgICAgICAgV2ViTWVkaWFQbGF5ZXJQcm94
eSogbV9wcm94eTsKLSNlbmRpZgotICAgIH07Ci0KLX0KLQotI2VuZGlmCi0KLSNlbmRpZgpJbmRl
eDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QYXRoV2luQ0UuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGF0aFdpbkNFLmNwcAkocmV2
aXNpb24gNTcyODkpCShmcm9tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGF0aFdp
bmNlLmNwcDo1NzI4OSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGF0aFdp
bkNFLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqICBDb3B5cmln
aHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
CisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRp
b24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0
ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBB
TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1F
UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0
aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp
bHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFy
eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGgg
Rmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIlBhdGguaCIKKworI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9y
bS5oIgorI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgi
CisjaW5jbHVkZSAiUGxhdGZvcm1QYXRoV2luY2UuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmlu
Zy5oIgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitQ
YXRoOjpQYXRoKCkKKyAgICA6IG1fcGF0aChuZXcgUGxhdGZvcm1QYXRoKCkpCit7Cit9CisKK1Bh
dGg6OlBhdGgoY29uc3QgUGF0aCYgb3RoZXIpCisgICAgOiBtX3BhdGgobmV3IFBsYXRmb3JtUGF0
aCgqb3RoZXIubV9wYXRoKSkKK3sKK30KKworUGF0aDo6flBhdGgoKQoreworICAgIGRlbGV0ZSBt
X3BhdGg7Cit9CisKK1BhdGgmIFBhdGg6Om9wZXJhdG9yPShjb25zdCBQYXRoJiBvdGhlcikKK3sK
KyAgICBpZiAoJm90aGVyICE9IHRoaXMpIHsKKyAgICAgICAgZGVsZXRlIG1fcGF0aDsKKyAgICAg
ICAgbV9wYXRoID0gbmV3IFBsYXRmb3JtUGF0aCgqb3RoZXIubV9wYXRoKTsKKyAgICB9CisgICAg
cmV0dXJuICp0aGlzOworfQorCitib29sIFBhdGg6OmNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQm
IHBvaW50LCBXaW5kUnVsZSBydWxlKSBjb25zdAoreworICAgIHJldHVybiBtX3BhdGgtPmNvbnRh
aW5zKHBvaW50LCBydWxlKTsKK30KKwordm9pZCBQYXRoOjp0cmFuc2xhdGUoY29uc3QgRmxvYXRT
aXplJiBzaXplKQoreworICAgIG1fcGF0aC0+dHJhbnNsYXRlKHNpemUpOworfQorCitGbG9hdFJl
Y3QgUGF0aDo6Ym91bmRpbmdSZWN0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wYXRoLT5ib3Vu
ZGluZ1JlY3QoKTsKK30KKwordm9pZCBQYXRoOjptb3ZlVG8oY29uc3QgRmxvYXRQb2ludCYgcG9p
bnQpCit7CisgICAgbV9wYXRoLT5tb3ZlVG8ocG9pbnQpOworfQorCit2b2lkIFBhdGg6OmFkZExp
bmVUbyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCkKK3sKKyAgICBtX3BhdGgtPmFkZExpbmVUbyhw
b2ludCk7Cit9CisKK3ZvaWQgUGF0aDo6YWRkUXVhZEN1cnZlVG8oY29uc3QgRmxvYXRQb2ludCYg
Y3AsIGNvbnN0IEZsb2F0UG9pbnQmIHApCit7CisgICAgbV9wYXRoLT5hZGRRdWFkQ3VydmVUbyhj
cCwgcCk7Cit9CisKK3ZvaWQgUGF0aDo6YWRkQmV6aWVyQ3VydmVUbyhjb25zdCBGbG9hdFBvaW50
JiBjcDEsIGNvbnN0IEZsb2F0UG9pbnQmIGNwMiwgY29uc3QgRmxvYXRQb2ludCYgcCkKK3sKKyAg
ICBtX3BhdGgtPmFkZEJlemllckN1cnZlVG8oY3AxLCBjcDIsIHApOworfQorCit2b2lkIFBhdGg6
OmFkZEFyY1RvKGNvbnN0IEZsb2F0UG9pbnQmIHAxLCBjb25zdCBGbG9hdFBvaW50JiBwMiwgZmxv
YXQgcmFkaXVzKQoreworICAgIG1fcGF0aC0+YWRkQXJjVG8ocDEsIHAyLCByYWRpdXMpOworfQor
Cit2b2lkIFBhdGg6OmNsb3NlU3VicGF0aCgpCit7CisgICAgbV9wYXRoLT5jbG9zZVN1YnBhdGgo
KTsKK30KKwordm9pZCBQYXRoOjphZGRBcmMoY29uc3QgRmxvYXRQb2ludCYgcCwgZmxvYXQgciwg
ZmxvYXQgc2FyLCBmbG9hdCBlYXIsIGJvb2wgYW50aWNsb2Nrd2lzZSkKK3sKKyAgICBtX3BhdGgt
PmFkZEVsbGlwc2UocCwgciwgciwgc2FyLCBlYXIsIGFudGljbG9ja3dpc2UpOworfQorCit2b2lk
IFBhdGg6OmFkZFJlY3QoY29uc3QgRmxvYXRSZWN0JiByKQoreworICAgIG1fcGF0aC0+YWRkUmVj
dChyKTsKK30KKwordm9pZCBQYXRoOjphZGRFbGxpcHNlKGNvbnN0IEZsb2F0UmVjdCYgcikKK3sK
KyAgICBtX3BhdGgtPmFkZEVsbGlwc2Uocik7Cit9CisKK3ZvaWQgUGF0aDo6Y2xlYXIoKQorewor
ICAgIG1fcGF0aC0+Y2xlYXIoKTsKK30KKworYm9vbCBQYXRoOjppc0VtcHR5KCkgY29uc3QKK3sK
KyAgICByZXR1cm4gbV9wYXRoLT5pc0VtcHR5KCk7Cit9CisKK1N0cmluZyBQYXRoOjpkZWJ1Z1N0
cmluZygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcGF0aC0+ZGVidWdTdHJpbmcoKTsKK30KKwor
dm9pZCBQYXRoOjphcHBseSh2b2lkKiBpbmZvLCBQYXRoQXBwbGllckZ1bmN0aW9uIGZ1bmN0aW9u
KSBjb25zdAoreworICAgIG1fcGF0aC0+YXBwbHkoaW5mbywgZnVuY3Rpb24pOworfQorCit2b2lk
IFBhdGg6OnRyYW5zZm9ybShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHQpCit7CisgICAgbV9wYXRo
LT50cmFuc2Zvcm0odCk7Cit9CisKK0Zsb2F0UmVjdCBQYXRoOjpzdHJva2VCb3VuZGluZ1JlY3Qo
U3Ryb2tlU3R5bGVBcHBsaWVyICopCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1
cm4gRmxvYXRSZWN0KCk7Cit9CisKK2Jvb2wgUGF0aDo6c3Ryb2tlQ29udGFpbnMoU3Ryb2tlU3R5
bGVBcHBsaWVyKiwgY29uc3QgRmxvYXRQb2ludCYpIGNvbnN0Cit7CisgICAgbm90SW1wbGVtZW50
ZWQoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUGF0aDo6aGFzQ3VycmVudFBvaW50
KCkgY29uc3QKK3sKKyAgICAvLyBOb3Qgc3VyZSBpZiB0aGlzIGlzIGNvcnJlY3QuIEF0IHRoZSBt
ZWFudGltZSwgd2UgZG8gd2hhdCBvdGhlciBwb3J0cworICAgIC8vIGRvLgorICAgIC8vIFNlZSBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjcyNjYsCisgICAgLy8gaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI3MTg3LCBhbmQgCisgICAgLy8g
aHR0cDovL3RyYWMud2Via2l0Lm9yZy9jaGFuZ2VzZXQvNDU4NzMKKyAgICByZXR1cm4gIWlzRW1w
dHkoKTsKK30KKworfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QYXRo
V2luQ0UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2Uv
UGF0aFdpbkNFLmNwcAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbmNlL1BhdGhXaW5DRS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIzLDcgKzIzLDcgQEAK
ICNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKICNpbmNsdWRlICJGbG9hdFJlY3QuaCIKICNp
bmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgotI2luY2x1ZGUgIlBsYXRmb3JtUGF0aFdpbmNlLmgi
CisjaW5jbHVkZSAiUGxhdGZvcm1QYXRoV2luQ0UuaCIKICNpbmNsdWRlICJQbGF0Zm9ybVN0cmlu
Zy5oIgogI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KIApAQCAtMTYwLDQgKzE2MCw0IEBAIGJvb2wg
UGF0aDo6aGFzQ3VycmVudFBvaW50KCkgY29uc3QKICAgICByZXR1cm4gIWlzRW1wdHkoKTsKIH0K
IAotfQorfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW5jZS9QYXRoV2luY2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luY2UvUGF0aFdpbmNlLmNwcAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1BhdGhXaW5jZS5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTEsMTYzICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9i
aWxlLCBJbmMuCi0gKgotICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu
IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICogIExpY2Vuc2UgYXMgcHVibGlzaGVk
IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogIHZlcnNpb24gMiBv
ZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAq
Ci0gKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls
bCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g
dGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhh
dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlCi0gKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJ
Qi4gIElmIG5vdCwgd3JpdGUgdG8KLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJ
bmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICogIEJvc3RvbiwgTUEgMDIx
MTAtMTMwMSwgVVNBLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJQYXRo
LmgiCi0KLSNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKLSNpbmNsdWRlICJGbG9hdFJlY3Qu
aCIKLSNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgotI2luY2x1ZGUgIlBsYXRmb3JtUGF0aFdp
bmNlLmgiCi0jaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKLSNpbmNsdWRlIDx3dGYvT3duUHRy
Lmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotUGF0aDo6UGF0aCgpCi0gICAgOiBtX3BhdGgo
bmV3IFBsYXRmb3JtUGF0aCgpKQotewotfQotCi1QYXRoOjpQYXRoKGNvbnN0IFBhdGgmIG90aGVy
KQotICAgIDogbV9wYXRoKG5ldyBQbGF0Zm9ybVBhdGgoKm90aGVyLm1fcGF0aCkpCi17Ci19Ci0K
LVBhdGg6On5QYXRoKCkKLXsKLSAgICBkZWxldGUgbV9wYXRoOwotfQotCi1QYXRoJiBQYXRoOjpv
cGVyYXRvcj0oY29uc3QgUGF0aCYgb3RoZXIpCi17Ci0gICAgaWYgKCZvdGhlciAhPSB0aGlzKSB7
Ci0gICAgICAgIGRlbGV0ZSBtX3BhdGg7Ci0gICAgICAgIG1fcGF0aCA9IG5ldyBQbGF0Zm9ybVBh
dGgoKm90aGVyLm1fcGF0aCk7Ci0gICAgfQotICAgIHJldHVybiAqdGhpczsKLX0KLQotYm9vbCBQ
YXRoOjpjb250YWlucyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgV2luZFJ1bGUgcnVsZSkgY29u
c3QKLXsKLSAgICByZXR1cm4gbV9wYXRoLT5jb250YWlucyhwb2ludCwgcnVsZSk7Ci19Ci0KLXZv
aWQgUGF0aDo6dHJhbnNsYXRlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKLXsKLSAgICBtX3BhdGgt
PnRyYW5zbGF0ZShzaXplKTsKLX0KLQotRmxvYXRSZWN0IFBhdGg6OmJvdW5kaW5nUmVjdCgpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIG1fcGF0aC0+Ym91bmRpbmdSZWN0KCk7Ci19Ci0KLXZvaWQgUGF0
aDo6bW92ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KQotewotICAgIG1fcGF0aC0+bW92ZVRv
KHBvaW50KTsKLX0KLQotdm9pZCBQYXRoOjphZGRMaW5lVG8oY29uc3QgRmxvYXRQb2ludCYgcG9p
bnQpCi17Ci0gICAgbV9wYXRoLT5hZGRMaW5lVG8ocG9pbnQpOwotfQotCi12b2lkIFBhdGg6OmFk
ZFF1YWRDdXJ2ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIGNwLCBjb25zdCBGbG9hdFBvaW50JiBwKQot
ewotICAgIG1fcGF0aC0+YWRkUXVhZEN1cnZlVG8oY3AsIHApOwotfQotCi12b2lkIFBhdGg6OmFk
ZEJlemllckN1cnZlVG8oY29uc3QgRmxvYXRQb2ludCYgY3AxLCBjb25zdCBGbG9hdFBvaW50JiBj
cDIsIGNvbnN0IEZsb2F0UG9pbnQmIHApCi17Ci0gICAgbV9wYXRoLT5hZGRCZXppZXJDdXJ2ZVRv
KGNwMSwgY3AyLCBwKTsKLX0KLQotdm9pZCBQYXRoOjphZGRBcmNUbyhjb25zdCBGbG9hdFBvaW50
JiBwMSwgY29uc3QgRmxvYXRQb2ludCYgcDIsIGZsb2F0IHJhZGl1cykKLXsKLSAgICBtX3BhdGgt
PmFkZEFyY1RvKHAxLCBwMiwgcmFkaXVzKTsKLX0KLQotdm9pZCBQYXRoOjpjbG9zZVN1YnBhdGgo
KQotewotICAgIG1fcGF0aC0+Y2xvc2VTdWJwYXRoKCk7Ci19Ci0KLXZvaWQgUGF0aDo6YWRkQXJj
KGNvbnN0IEZsb2F0UG9pbnQmIHAsIGZsb2F0IHIsIGZsb2F0IHNhciwgZmxvYXQgZWFyLCBib29s
IGFudGljbG9ja3dpc2UpCi17Ci0gICAgbV9wYXRoLT5hZGRFbGxpcHNlKHAsIHIsIHIsIHNhciwg
ZWFyLCBhbnRpY2xvY2t3aXNlKTsKLX0KLQotdm9pZCBQYXRoOjphZGRSZWN0KGNvbnN0IEZsb2F0
UmVjdCYgcikKLXsKLSAgICBtX3BhdGgtPmFkZFJlY3Qocik7Ci19Ci0KLXZvaWQgUGF0aDo6YWRk
RWxsaXBzZShjb25zdCBGbG9hdFJlY3QmIHIpCi17Ci0gICAgbV9wYXRoLT5hZGRFbGxpcHNlKHIp
OwotfQotCi12b2lkIFBhdGg6OmNsZWFyKCkKLXsKLSAgICBtX3BhdGgtPmNsZWFyKCk7Ci19Ci0K
LWJvb2wgUGF0aDo6aXNFbXB0eSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcGF0aC0+aXNFbXB0
eSgpOwotfQotCi1TdHJpbmcgUGF0aDo6ZGVidWdTdHJpbmcoKSBjb25zdAotewotICAgIHJldHVy
biBtX3BhdGgtPmRlYnVnU3RyaW5nKCk7Ci19Ci0KLXZvaWQgUGF0aDo6YXBwbHkodm9pZCogaW5m
bywgUGF0aEFwcGxpZXJGdW5jdGlvbiBmdW5jdGlvbikgY29uc3QKLXsKLSAgICBtX3BhdGgtPmFw
cGx5KGluZm8sIGZ1bmN0aW9uKTsKLX0KLQotdm9pZCBQYXRoOjp0cmFuc2Zvcm0oY29uc3QgQWZm
aW5lVHJhbnNmb3JtJiB0KQotewotICAgIG1fcGF0aC0+dHJhbnNmb3JtKHQpOwotfQotCi1GbG9h
dFJlY3QgUGF0aDo6c3Ryb2tlQm91bmRpbmdSZWN0KFN0cm9rZVN0eWxlQXBwbGllciAqKQotewot
ICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0dXJuIEZsb2F0UmVjdCgpOwotfQotCi1ib29s
IFBhdGg6OnN0cm9rZUNvbnRhaW5zKFN0cm9rZVN0eWxlQXBwbGllciosIGNvbnN0IEZsb2F0UG9p
bnQmKSBjb25zdAotewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwot
fQotCi1ib29sIFBhdGg6Omhhc0N1cnJlbnRQb2ludCgpIGNvbnN0Ci17Ci0gICAgLy8gTm90IHN1
cmUgaWYgdGhpcyBpcyBjb3JyZWN0LiBBdCB0aGUgbWVhbnRpbWUsIHdlIGRvIHdoYXQgb3RoZXIg
cG9ydHMKLSAgICAvLyBkby4KLSAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTI3MjY2LAotICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0yNzE4NywgYW5kIAotICAgIC8vIGh0dHA6Ly90cmFjLndlYmtpdC5vcmcvY2hh
bmdlc2V0LzQ1ODczCi0gICAgcmV0dXJuICFpc0VtcHR5KCk7Ci19Ci0KLX0KSW5kZXg6IFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGxhdGZvcm1QYXRoV2luQ0UuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGxhdGZvcm1QYXRoV2luQ0Uu
Y3BwCShyZXZpc2lvbiA1NzI4OSkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5j
ZS9QbGF0Zm9ybVBhdGhXaW5jZS5jcHA6NTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbmNlL1BsYXRmb3JtUGF0aFdpbkNFLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDgxMCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIElu
Yy4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBM
aWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBU
aGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz
ZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w
bGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNl
aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAq
ICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYg
bm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUx
IEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAx
LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlBsYXRmb3JtUGF0
aFdpbmNlLmgiCisKKyNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKKyNpbmNsdWRlICJGbG9h
dFJlY3QuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJQYXRoLmgi
CisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJXaW5jZUdyYXBoaWNzRXh0
cmFzLmgiCisjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KKyNpbmNsdWRlIDx3dGYvT3duUHRy
Lmg+CisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8g
SW1wbGVtZW50ZWQgaW4gR3JhcGhpY3NDb250ZXh0V2luY2UuY3BwCit2b2lkIGdldEVsbGlwc2VQ
b2ludEJ5QW5nbGUoZG91YmxlIGFuZ2xlLCBkb3VibGUgYSwgZG91YmxlIGIsIGZsb2F0JiB4LCBm
bG9hdCYgeSk7CisKK3N0YXRpYyB2b2lkIHF1YWRDdXJ2ZShpbnQgc2VnbWVudHMsIFZlY3RvcjxQ
YXRoUG9pbnQ+JiBwdHMsIGNvbnN0IFBhdGhQb2ludCogY29udHJvbCkKK3sKKyAgICBjb25zdCBm
bG9hdCBzdGVwID0gMS4wIC8gc2VnbWVudHM7CisgICAgcmVnaXN0ZXIgZmxvYXQgdEEgPSAwLjA7
CisgICAgcmVnaXN0ZXIgZmxvYXQgdEIgPSAxLjA7CisKKyAgICBmbG9hdCBjMXggPSBjb250cm9s
WzBdLngoKTsKKyAgICBmbG9hdCBjMXkgPSBjb250cm9sWzBdLnkoKTsKKyAgICBmbG9hdCBjMngg
PSBjb250cm9sWzFdLngoKTsKKyAgICBmbG9hdCBjMnkgPSBjb250cm9sWzFdLnkoKTsKKyAgICBm
bG9hdCBjM3ggPSBjb250cm9sWzJdLngoKTsKKyAgICBmbG9hdCBjM3kgPSBjb250cm9sWzJdLnko
KTsKKworICAgIGNvbnN0IGludCBvZmZzZXQgPSBwdHMuc2l6ZSgpOworICAgIHB0cy5yZXNpemUo
b2Zmc2V0ICsgc2VnbWVudHMpOworICAgIFBhdGhQb2ludCBwcDsKKyAgICBwcC5tX3ggPSBjMXg7
CisgICAgcHAubV95ID0gYzF5OworCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzZWdtZW50czsg
KytpKSB7CisgICAgICAgIHRBICs9IHN0ZXA7CisgICAgICAgIHRCIC09IHN0ZXA7CisKKyAgICAg
ICAgY29uc3QgZmxvYXQgYSA9IHRCICogdEI7CisgICAgICAgIGNvbnN0IGZsb2F0IGIgPSAyLjAg
KiB0QSAqIHRCOworICAgICAgICBjb25zdCBmbG9hdCBjID0gdEEgKiB0QTsKKworICAgICAgICBw
cC5tX3ggPSBjMXggKiBhICsgYzJ4ICogYiArIGMzeCAqIGM7CisgICAgICAgIHBwLm1feSA9IGMx
eSAqIGEgKyBjMnkgKiBiICsgYzN5ICogYzsKKworICAgICAgICBwdHNbb2Zmc2V0ICsgaSAtIDFd
ID0gcHA7CisgICAgfQorCisgICAgcHAubV94ID0gYzN4OworICAgIHBwLm1feSA9IGMzeTsKKyAg
ICBwdHNbb2Zmc2V0ICsgc2VnbWVudHMgLSAxXSA9IHBwOworfQorCitzdGF0aWMgaW5saW5lIHZv
aWQgYmV6aWVyKGludCBzZWdtZW50cywgVmVjdG9yPFBhdGhQb2ludD4mIHB0cywgY29uc3QgUGF0
aFBvaW50KiBjb250cm9sKQoreworICAgIGNvbnN0IGZsb2F0IHN0ZXAgPSAxLjAgLyBzZWdtZW50
czsKKyAgICByZWdpc3RlciBmbG9hdCB0QSA9IDAuMDsKKyAgICByZWdpc3RlciBmbG9hdCB0QiA9
IDEuMDsKKworICAgIGZsb2F0IGMxeCA9IGNvbnRyb2xbMF0ueCgpOworICAgIGZsb2F0IGMxeSA9
IGNvbnRyb2xbMF0ueSgpOworICAgIGZsb2F0IGMyeCA9IGNvbnRyb2xbMV0ueCgpOworICAgIGZs
b2F0IGMyeSA9IGNvbnRyb2xbMV0ueSgpOworICAgIGZsb2F0IGMzeCA9IGNvbnRyb2xbMl0ueCgp
OworICAgIGZsb2F0IGMzeSA9IGNvbnRyb2xbMl0ueSgpOworICAgIGZsb2F0IGM0eCA9IGNvbnRy
b2xbM10ueCgpOworICAgIGZsb2F0IGM0eSA9IGNvbnRyb2xbM10ueSgpOworCisgICAgY29uc3Qg
aW50IG9mZnNldCA9IHB0cy5zaXplKCk7CisgICAgcHRzLnJlc2l6ZShvZmZzZXQgKyBzZWdtZW50
cyk7CisgICAgUGF0aFBvaW50IHBwOworICAgIHBwLm1feCA9IGMxeDsKKyAgICBwcC5tX3kgPSBj
MXk7CisKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IHNlZ21lbnRzOyArK2kpIHsKKyAgICAgICAg
dEEgKz0gc3RlcDsKKyAgICAgICAgdEIgLT0gc3RlcDsKKyAgICAgICAgY29uc3QgZmxvYXQgdEFz
cSA9IHRBICogdEE7CisgICAgICAgIGNvbnN0IGZsb2F0IHRCc3EgPSB0QiAqIHRCOworCisgICAg
ICAgIGNvbnN0IGZsb2F0IGEgPSB0QnNxICogdEI7CisgICAgICAgIGNvbnN0IGZsb2F0IGIgPSAz
LjAgKiB0QSAqIHRCc3E7CisgICAgICAgIGNvbnN0IGZsb2F0IGMgPSAzLjAgKiB0QiAqIHRBc3E7
CisgICAgICAgIGNvbnN0IGZsb2F0IGQgPSB0QXNxICogdEE7CisKKyAgICAgICAgcHAubV94ID0g
YzF4ICogYSArIGMyeCAqIGIgKyBjM3ggKiBjICsgYzR4ICogZDsKKyAgICAgICAgcHAubV95ID0g
YzF5ICogYSArIGMyeSAqIGIgKyBjM3kgKiBjICsgYzR5ICogZDsKKworICAgICAgICBwdHNbb2Zm
c2V0ICsgaSAtIDFdID0gcHA7CisgICAgfQorCisgICAgcHAubV94ID0gYzR4OworICAgIHBwLm1f
eSA9IGM0eTsKKyAgICBwdHNbb2Zmc2V0ICsgc2VnbWVudHMgLSAxXSA9IHBwOworfQorCitzdGF0
aWMgYm9vbCBjb250YWluc1BvaW50KGNvbnN0IEZsb2F0UmVjdCYgciwgY29uc3QgRmxvYXRQb2lu
dCYgcCkKK3sKKyAgICByZXR1cm4gcC54KCkgPj0gci54KCkgJiYgcC55KCkgPj0gci55KCkgJiYg
cC54KCkgPCByLnJpZ2h0KCkgJiYgcC55KCkgPCByLmJvdHRvbSgpOworfQorCitzdGF0aWMgdm9p
ZCBub3JtYWxpemVBbmdsZShmbG9hdCYgYW5nbGUpCit7CisgICAgYW5nbGUgPSBmbW9kKGFuZ2xl
LCAyICogcGlGbG9hdCk7CisgICAgaWYgKGFuZ2xlIDwgMCkKKyAgICAgICAgYW5nbGUgKz0gMiAq
IHBpRmxvYXQ7CisgICAgaWYgKGFuZ2xlIDwgMC4wMDAwMWYpCisgICAgICAgIGFuZ2xlID0gMDsK
K30KKworc3RhdGljIHZvaWQgdHJhbnNmb3JtQXJjUG9pbnQoZmxvYXQmIHgsIGZsb2F0JiB5LCBj
b25zdCBGbG9hdFBvaW50JiBjKQoreworICAgIHggKz0gYy54KCk7CisgICAgeSArPSBjLnkoKTsK
K30KKworc3RhdGljIHZvaWQgaW5mbGF0ZVJlY3RUb0NvbnRhaW5Qb2ludChGbG9hdFJlY3QmIHIs
IGZsb2F0IHgsIGZsb2F0IHkpCit7CisgICAgaWYgKHIuaXNFbXB0eSgpKSB7CisgICAgICAgIHIu
c2V0WCh4KTsKKyAgICAgICAgci5zZXRZKHkpOworICAgICAgICByLnNldFNpemUoRmxvYXRTaXpl
KDEsIDEpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoeCA8IHIueCgpKSB7Cisg
ICAgICAgIHIuc2V0V2lkdGgoci5yaWdodCgpIC0geCk7CisgICAgICAgIHIuc2V0WCh4KTsKKyAg
ICB9IGVsc2UgeworICAgICAgICBmbG9hdCB3ID0geCAtIHIueCgpICsgMTsKKyAgICAgICAgaWYg
KHcgPiByLndpZHRoKCkpCisgICAgICAgICAgICByLnNldFdpZHRoKHcpOworICAgIH0KKyAgICBp
ZiAoeSA8IHIueSgpKSB7CisgICAgICAgIHIuc2V0SGVpZ2h0KHIuYm90dG9tKCkgLSB5KTsKKyAg
ICAgICAgci5zZXRZKHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZsb2F0IGggPSAgeSAtIHIu
eSgpICsgMTsKKyAgICAgICAgaWYgKGggPiByLmhlaWdodCgpKQorICAgICAgICAgICAgci5zZXRI
ZWlnaHQoaCk7CisgICAgfQorfQorCisvLyByZXR1cm4gMC1iYXNlZCB2YWx1ZTogMCAtIGZpcnN0
IFF1YWRyYW50ICggMCAtIDkwIGRlZ3JlZSkKK3N0YXRpYyBpbmxpbmUgaW50IHF1YWRyYW50KGNv
bnN0IFBhdGhQb2ludCYgcG9pbnQsIGNvbnN0IFBhdGhQb2ludCYgb3JpZ2luKQoreworICAgIHJl
dHVybiBwb2ludC5tX3ggPCBvcmlnaW4ubV94ID8KKyAgICAgICAgKHBvaW50Lm1feSA8IG9yaWdp
bi5tX3kgPyAyIDogMSkKKyAgICAgICAgOiAocG9pbnQubV95IDwgb3JpZ2luLm1feSA/IDMgOiAw
KTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzUXVhZHJhbnRPbkxlZnQoaW50IHEpIHsgcmV0
dXJuIHEgPT0gMSB8fCBxID09IDI7IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1F1YWRyYW50T25S
aWdodChpbnQgcSkgeyByZXR1cm4gcSA9PSAwIHx8IHEgPT0gMzsgfQorc3RhdGljIGlubGluZSBi
b29sIGlzUXVhZHJhbnRPblRvcChpbnQgcSkgeyByZXR1cm4gcSA9PSAyIHx8IHEgPT0gMzsgfQor
c3RhdGljIGlubGluZSBib29sIGlzUXVhZHJhbnRPbkJvdHRvbShpbnQgcSkgeyByZXR1cm4gcSA9
PSAwIHx8IHEgPT0gMTsgfQorCitzdGF0aWMgaW5saW5lIGludCBuZXh0UXVhZHJhbnQoaW50IHEp
IHsgcmV0dXJuIHEgPT0gMyA/IDAgOiBxICsgMTsgfQorc3RhdGljIGlubGluZSBpbnQgcXVhZHJh
bnREaWZmKGludCBxMSwgaW50IHEyKQoreworICAgIGludCBkID0gcTEgLSBxMjsKKyAgICB3aGls
ZSAoZCA8IDApCisgICAgICAgIGQgKz0gNDsKKyAgICByZXR1cm4gZDsKK30KKworc3RydWN0IFBh
dGhWZWN0b3IgeworICAgIGZsb2F0IG1feDsKKyAgICBmbG9hdCBtX3k7CisKKyAgICBQYXRoVmVj
dG9yKCkgOiBtX3goMCksIG1feSgwKSB7fQorICAgIFBhdGhWZWN0b3IoZmxvYXQgeCwgZmxvYXQg
eSkgOiBtX3goeCksIG1feSh5KSB7fQorICAgIGRvdWJsZSBhbmdsZSgpIGNvbnN0IHsgcmV0dXJu
IGF0YW4yKG1feSwgbV94KTsgfQorICAgIG9wZXJhdG9yIGRvdWJsZSAoKSBjb25zdCB7IHJldHVy
biBhbmdsZSgpOyB9CisgICAgZG91YmxlIGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIF9oeXBvdCht
X3gsIG1feSk7IH0KK307CisKK1BhdGhWZWN0b3Igb3BlcmF0b3ItKGNvbnN0IFBhdGhQb2ludCYg
cDEsIGNvbnN0IFBhdGhQb2ludCYgcDIpCit7CisgICAgcmV0dXJuIFBhdGhWZWN0b3IocDEubV94
IC0gcDIubV94LCBwMS5tX3kgLSBwMi5tX3kpOworfQorCitzdGF0aWMgdm9pZCBhZGRBcmNQb2lu
dChQYXRoUG9seWdvbiYgcG9seSwgY29uc3QgUGF0aFBvaW50JiBjZW50ZXIsIGNvbnN0IFBhdGhQ
b2ludCYgcmFkaXVzLCBkb3VibGUgYW5nbGUpCit7CisgICAgUGF0aFBvaW50IHA7CisgICAgZ2V0
RWxsaXBzZVBvaW50QnlBbmdsZShhbmdsZSwgcmFkaXVzLm1feCwgcmFkaXVzLm1feSwgcC5tX3gs
IHAubV95KTsKKyAgICB0cmFuc2Zvcm1BcmNQb2ludChwLm1feCwgcC5tX3ksIGNlbnRlcik7Cisg
ICAgaWYgKHBvbHkuaXNFbXB0eSgpIHx8IHBvbHkubGFzdCgpICE9IHApCisgICAgICAgIHBvbHku
YXBwZW5kKHApOworfQorCitzdGF0aWMgdm9pZCBhZGRBcmNQb2ludHMoUGF0aFBvbHlnb24mIHBv
bHksIGNvbnN0IFBsYXRmb3JtUGF0aEVsZW1lbnQ6OkFyY1RvJiBkYXRhKQoreworICAgIGNvbnN0
IFBhdGhQb2ludCYgc3RhcnRQb2ludCA9IHBvbHkubGFzdCgpOworICAgIGRvdWJsZSBjdXJBbmds
ZSA9IHN0YXJ0UG9pbnQgLSBkYXRhLm1fY2VudGVyOworICAgIGRvdWJsZSBlbmRBbmdsZSA9IGRh
dGEubV9lbmQgLSBkYXRhLm1fY2VudGVyOworICAgIGRvdWJsZSBhbmdsZVN0ZXAgPSAyLiAvIHN0
ZDo6bWF4KGRhdGEubV9yYWRpdXMubV94LCBkYXRhLm1fcmFkaXVzLm1feSk7CisgICAgaWYgKGRh
dGEubV9jbG9ja3dpc2UpIHsKKyAgICAgICAgaWYgKGVuZEFuZ2xlIDw9IGN1ckFuZ2xlIHx8IHN0
YXJ0UG9pbnQgPT0gZGF0YS5tX2VuZCkKKyAgICAgICAgICAgIGVuZEFuZ2xlICs9IDIgKiBwaURv
dWJsZTsKKyAgICB9IGVsc2UgeworICAgICAgICBhbmdsZVN0ZXAgPSAtYW5nbGVTdGVwOworICAg
ICAgICBpZiAoZW5kQW5nbGUgPj0gY3VyQW5nbGUgfHwgc3RhcnRQb2ludCA9PSBkYXRhLm1fZW5k
KQorICAgICAgICAgICAgZW5kQW5nbGUgLT0gMiAqIHBpRG91YmxlOworICAgIH0KKworICAgIGZv
ciAoY3VyQW5nbGUgKz0gYW5nbGVTdGVwOyBkYXRhLm1fY2xvY2t3aXNlID8gY3VyQW5nbGUgPCBl
bmRBbmdsZSA6IGN1ckFuZ2xlID4gZW5kQW5nbGU7IGN1ckFuZ2xlICs9IGFuZ2xlU3RlcCkKKyAg
ICAgICAgYWRkQXJjUG9pbnQocG9seSwgZGF0YS5tX2NlbnRlciwgZGF0YS5tX3JhZGl1cywgY3Vy
QW5nbGUpOworCisgICAgaWYgKHBvbHkuaXNFbXB0eSgpIHx8IHBvbHkubGFzdCgpICE9IGRhdGEu
bV9lbmQpCisgICAgICAgIHBvbHkuYXBwZW5kKGRhdGEubV9lbmQpOworfQorCitzdGF0aWMgdm9p
ZCBkcmF3UG9seWdvbnMoSERDIGRjLCBjb25zdCBWZWN0b3I8UGF0aFBvbHlnb24+JiBwb2x5Z29u
cywgYm9vbCBmaWxsLCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0qIHRyYW5zZm9ybWF0aW9uKQorewor
ICAgIE1lbW9yeUFsbG9jYXRpb25DYW5GYWlsIGNhbkZhaWw7CisgICAgZm9yIChWZWN0b3I8UGF0
aFBvbHlnb24+Ojpjb25zdF9pdGVyYXRvciBpID0gcG9seWdvbnMuYmVnaW4oKTsgaSAhPSBwb2x5
Z29ucy5lbmQoKTsgKytpKSB7CisgICAgICAgIGludCBucG9pbnRzID0gaS0+c2l6ZSgpOworICAg
ICAgICBpZiAoIW5wb2ludHMpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBQT0lO
VCogd2luUG9pbnRzID0gMDsKKyAgICAgICAgaWYgKGZpbGwpIHsKKyAgICAgICAgICAgIGlmIChu
cG9pbnRzID4gMikKKyAgICAgICAgICAgICAgICB3aW5Qb2ludHMgPSBuZXcgUE9JTlRbbnBvaW50
cyArIDFdOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHdpblBvaW50cyA9IG5ldyBQT0lO
VFtucG9pbnRzXTsKKworICAgICAgICBpZiAod2luUG9pbnRzKSB7CisgICAgICAgICAgICBpZiAo
dHJhbnNmb3JtYXRpb24pIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpMiA9IDA7IGkyIDwg
bnBvaW50czsgKytpMikgeworICAgICAgICAgICAgICAgICAgICBGbG9hdFBvaW50IHRyUG9pbnQg
PSB0cmFuc2Zvcm1hdGlvbi0+bWFwUG9pbnQoaS0+YXQoaTIpKTsKKyAgICAgICAgICAgICAgICAg
ICAgd2luUG9pbnRzW2kyXS54ID0gc3RhYmxlUm91bmQodHJQb2ludC54KCkpOworICAgICAgICAg
ICAgICAgICAgICB3aW5Qb2ludHNbaTJdLnkgPSBzdGFibGVSb3VuZCh0clBvaW50LnkoKSk7Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBm
b3IgKGludCBpMiA9IDA7IGkyIDwgbnBvaW50czsgKytpMikgeworICAgICAgICAgICAgICAgICAg
ICB3aW5Qb2ludHNbaTJdLnggPSBzdGFibGVSb3VuZChpLT5hdChpMikueCgpKTsKKyAgICAgICAg
ICAgICAgICAgICAgd2luUG9pbnRzW2kyXS55ID0gc3RhYmxlUm91bmQoaS0+YXQoaTIpLnkoKSk7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmls
bCAmJiB3aW5Qb2ludHNbbnBvaW50cyAtIDFdICE9IHdpblBvaW50c1swXSkgeworICAgICAgICAg
ICAgICAgIHdpblBvaW50c1tucG9pbnRzXS54ID0gd2luUG9pbnRzWzBdLng7CisgICAgICAgICAg
ICAgICAgd2luUG9pbnRzW25wb2ludHNdLnkgPSB3aW5Qb2ludHNbMF0ueTsKKyAgICAgICAgICAg
ICAgICArK25wb2ludHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmaWxsKQor
ICAgICAgICAgICAgICAgIDo6UG9seWdvbihkYywgd2luUG9pbnRzLCBucG9pbnRzKTsKKyAgICAg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICA6OlBvbHlsaW5lKGRjLCB3aW5Qb2ludHMsIG5w
b2ludHMpOworICAgICAgICAgICAgZGVsZXRlW10gd2luUG9pbnRzOworICAgICAgICB9CisgICAg
fQorfQorCisKK2ludCBQbGF0Zm9ybVBhdGhFbGVtZW50OjpudW1Db250cm9sUG9pbnRzKCkgY29u
c3QKK3sKKyAgICBzd2l0Y2ggKG1fdHlwZSkgeworICAgIGNhc2UgUGF0aE1vdmVUbzoKKyAgICBj
YXNlIFBhdGhMaW5lVG86CisgICAgICAgIHJldHVybiAxOworICAgIGNhc2UgUGF0aFF1YWRDdXJ2
ZVRvOgorICAgIGNhc2UgUGF0aEFyY1RvOgorICAgICAgICByZXR1cm4gMjsKKyAgICBjYXNlIFBh
dGhCZXppZXJDdXJ2ZVRvOgorICAgICAgICByZXR1cm4gMzsKKyAgICBkZWZhdWx0OgorICAgICAg
ICBBU1NFUlQobV90eXBlID09IFBhdGhDbG9zZVN1YnBhdGgpOworICAgICAgICByZXR1cm4gMDsK
KyAgICB9Cit9CisKK2ludCBQbGF0Zm9ybVBhdGhFbGVtZW50OjpudW1Qb2ludHMoKSBjb25zdAor
eworICAgIHN3aXRjaCAobV90eXBlKSB7CisgICAgY2FzZSBQYXRoTW92ZVRvOgorICAgIGNhc2Ug
UGF0aExpbmVUbzoKKyAgICBjYXNlIFBhdGhBcmNUbzoKKyAgICAgICAgcmV0dXJuIDE7CisgICAg
Y2FzZSBQYXRoUXVhZEN1cnZlVG86CisgICAgICAgIHJldHVybiAyOworICAgIGNhc2UgUGF0aEJl
emllckN1cnZlVG86CisgICAgICAgIHJldHVybiAzOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFT
U0VSVChtX3R5cGUgPT0gUGF0aENsb3NlU3VicGF0aCk7CisgICAgICAgIHJldHVybiAwOworICAg
IH0KK30KKwordm9pZCBQYXRoUG9seWdvbjo6bW92ZShjb25zdCBGbG9hdFNpemUmIG9mZnNldCkK
K3sKKyAgICBmb3IgKFZlY3RvcjxQYXRoUG9pbnQ+OjppdGVyYXRvciBpID0gYmVnaW4oKTsgaSA8
IGVuZCgpOyArK2kpCisgICAgICAgIGktPm1vdmUob2Zmc2V0KTsKK30KKwordm9pZCBQYXRoUG9s
eWdvbjo6dHJhbnNmb3JtKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdCkKK3sKKyAgICBmb3IgKFZl
Y3RvcjxQYXRoUG9pbnQ+OjppdGVyYXRvciBpID0gYmVnaW4oKTsgaSA8IGVuZCgpOyArK2kpCisg
ICAgICAgICppID0gdC5tYXBQb2ludCgqaSk7Cit9CisKK2Jvb2wgUGF0aFBvbHlnb246OmNvbnRh
aW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KSBjb25zdAoreworICAgIGlmIChzaXplKCkgPCAz
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBUZXN0IGludGVyc2VjdGlvbnMgYmV0
d2VlbiB0aGUgcG9seWdvbiBhbmQgdGhlIHZlcnRpY2FsIGxpbmU6IHggPSBwb2ludC54KCkKKwor
ICAgIGludCBpbnRlcnNlY3RlZCA9IDA7CisgICAgY29uc3QgUGF0aFBvaW50KiBwb2ludDEgPSAm
bGFzdCgpOworICAgIFZlY3RvcjxQYXRoUG9pbnQ+Ojpjb25zdF9pdGVyYXRvciBsYXN0ID0gZW5k
KCk7CisgICAgLy8gd2FzTmVnYXRpdmU6IC0xIG1lYW5zIHVua25vd24sIDAgbWVhbnMgZmFsc2Us
IDEgbWVhbnMgdHJ1ZS4KKyAgICBpbnQgd2FzTmVnYXRpdmUgPSAtMTsKKyAgICBmb3IgKFZlY3Rv
cjxQYXRoUG9pbnQ+Ojpjb25zdF9pdGVyYXRvciBpID0gYmVnaW4oKTsgaSAhPSBsYXN0OyArK2kp
IHsKKyAgICAgICAgY29uc3QgUGF0aFBvaW50JiBwb2ludDIgPSAqaTsKKyAgICAgICAgaWYgKHBv
aW50MS0+eCgpICE9IHBvaW50LngoKSkgeworICAgICAgICAgICAgaWYgKHBvaW50Mi54KCkgPT0g
cG9pbnQueCgpKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGdldHRpbmcgb24gdGhlIHZl
cnRpY2FsIGxpbmUKKyAgICAgICAgICAgICAgICB3YXNOZWdhdGl2ZSA9IHBvaW50MS0+eCgpIDwg
cG9pbnQueCgpID8gMSA6IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBvaW50Mi54KCkgPCBw
b2ludC54KCkgIT0gcG9pbnQxLT54KCkgPCBwb2ludC54KCkpIHsKKyAgICAgICAgICAgICAgICBm
bG9hdCB5ID0gKHBvaW50Mi55KCkgLSBwb2ludDEtPnkoKSkgLyAocG9pbnQyLngoKSAtIHBvaW50
MS0+eCgpKSAqIChwb2ludC54KCkgLSBwb2ludDEtPngoKSkgKyBwb2ludDEtPnkoKTsKKyAgICAg
ICAgICAgICAgICBpZiAoeSA+PSBwb2ludC55KCkpCisgICAgICAgICAgICAgICAgICAgICsraW50
ZXJzZWN0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAv
LyBXZSB3ZXJlIG9uIHRoZSB2ZXJ0aWNhbCBsaW5lCisKKyAgICAgICAgICAgIC8vIGhhbmRsZSBz
cGVjaWFsIGNhc2UKKyAgICAgICAgICAgIGlmIChwb2ludDEtPnkoKSA9PSBwb2ludC55KCkpCisg
ICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgICAgIGlmIChwb2ludDEtPnko
KSA+IHBvaW50LnkoKSkgeworICAgICAgICAgICAgICAgIGlmIChwb2ludDIueCgpID09IHBvaW50
LngoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaWYgdGhlIHBvaW50IGlzIG9uIHRo
aXMgc2VnbWVudAorICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnQyLnkoKSA8PSBwb2ludC55
KCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAg
ICAgICAgICAvLyBXZSBhcmUgc3RpbGwgb24gdGhlIGxpbmUKKyAgICAgICAgICAgICAgICB9IGVs
c2UgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgbGVhdmluZyB0aGUgbGluZSBub3cu
CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gZ2V0IGJhY2sgdG8gc2VlIHdoaWNo
IHNpZGUgd2UgY29tZSBmcm9tLiBJZiB3ZSBjb21lIGZyb20KKyAgICAgICAgICAgICAgICAgICAg
Ly8gdGhlIHNhbWUgc2lkZSB3ZSBhcmUgbGVhdmluZywgbm8gaW50ZXJzZWN0aW9uIHNob3VsZCBi
ZSBjb3VudGVkCisgICAgICAgICAgICAgICAgICAgIGlmICh3YXNOZWdhdGl2ZSA8IDApIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIFZlY3RvcjxQYXRoUG9pbnQ+Ojpjb25zdF9pdGVyYXRvciBq
TGFzdCA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8UGF0aFBvaW50Pjo6Y29u
c3RfaXRlcmF0b3IgaiA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0gYmVnaW4oKSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaiA9IGxhc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxz
ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWo7CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKGotPngoKSAhPSBwb2ludC54KCkpIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKGotPngoKSA+IHBvaW50LngoKSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHdhc05lZ2F0aXZlID0gMDsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Fz
TmVnYXRpdmUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IHdo
aWxlIChqICE9IGpMYXN0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdhc05lZ2F0
aXZlIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHdhc05lZ2F0aXZlID8g
cG9pbnQyLngoKSA+IHBvaW50LngoKSA6IHBvaW50Mi54KCkgPCBwb2ludC54KCkpCisgICAgICAg
ICAgICAgICAgICAgICAgICArK2ludGVyc2VjdGVkOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIH0gZWxzZSBpZiAocG9pbnQyLngoKSA9PSBwb2ludC54KCkgJiYgcG9pbnQyLnkoKSA+
PSBwb2ludC55KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAg
ICAgICAgcG9pbnQxID0gJnBvaW50MjsKKyAgICB9CisKKyAgICByZXR1cm4gaW50ZXJzZWN0ZWQg
JiAxOworfQorCit2b2lkIFBsYXRmb3JtUGF0aEVsZW1lbnQ6Om1vdmUoY29uc3QgRmxvYXRTaXpl
JiBvZmZzZXQpCit7CisgICAgaW50IG4gPSBudW1Db250cm9sUG9pbnRzKCk7CisgICAgZm9yIChp
bnQgaSA9IDA7IGkgPCBuOyArK2kpCisgICAgICAgIG1fZGF0YS5tX3BvaW50c1tpXS5tb3ZlKG9m
ZnNldCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoRWxlbWVudDo6dHJhbnNmb3JtKGNvbnN0IEFm
ZmluZVRyYW5zZm9ybSYgdCkKK3sKKyAgICBpbnQgbiA9IG51bUNvbnRyb2xQb2ludHMoKTsKKyAg
ICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBGbG9hdFBvaW50IHAgPSB0
Lm1hcFBvaW50KG1fZGF0YS5tX3BvaW50c1tpXSk7CisgICAgICAgIG1fZGF0YS5tX3BvaW50c1tp
XS5zZXQocC54KCksIHAueSgpKTsKKyAgICB9Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoRWxlbWVu
dDo6aW5mbGF0ZVJlY3RUb0NvbnRhaW5NZShGbG9hdFJlY3QmIHIsIGNvbnN0IEZsb2F0UG9pbnQm
IGxhc3RQb2ludCkgY29uc3QKK3sKKyAgICBpZiAobV90eXBlID09IFBhdGhBcmNUbykgeworICAg
ICAgICBjb25zdCBBcmNUbyYgZGF0YSA9IG1fZGF0YS5tX2FyY1RvRGF0YTsKKyAgICAgICAgUGF0
aFBvaW50IHN0YXJ0UG9pbnQ7CisgICAgICAgIHN0YXJ0UG9pbnQgPSBsYXN0UG9pbnQ7CisgICAg
ICAgIFBhdGhQb2ludCBlbmRQb2ludCA9IGRhdGEubV9lbmQ7CisgICAgICAgIGlmICghZGF0YS5t
X2Nsb2Nrd2lzZSkKKyAgICAgICAgICAgIHN0ZDo6c3dhcChzdGFydFBvaW50LCBlbmRQb2ludCk7
CisKKyAgICAgICAgaW50IHEwID0gcXVhZHJhbnQoc3RhcnRQb2ludCwgZGF0YS5tX2NlbnRlcik7
CisgICAgICAgIGludCBxMSA9IHF1YWRyYW50KGVuZFBvaW50LCBkYXRhLm1fY2VudGVyKTsKKyAg
ICAgICAgYm9vbCBjb250YWluc0V4dHJlbWVzWzRdID0geyBmYWxzZSB9OyAvLyBib3R0b20sIGxl
ZnQsIHRvcCwgcmlnaHQKKyAgICAgICAgc3RhdGljIGNvbnN0IFBhdGhQb2ludCBleHRyZW1lVmVj
dG9yc1s0XSA9IHsgeyAwLCAxIH0sIHsgLTEsIDAgfSwgeyAwLCAtMSB9LCB7IDEsIDAgfSB9Owor
ICAgICAgICBpZiAocTAgPT0gcTEpIHsKKyAgICAgICAgICAgIGlmIChzdGFydFBvaW50Lm1feCA9
PSBlbmRQb2ludC5tX3ggfHwgaXNRdWFkcmFudE9uQm90dG9tKHEwKSAhPSBzdGFydFBvaW50Lm1f
eCA+IGVuZFBvaW50Lm1feCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwg
NDsgKytpKQorICAgICAgICAgICAgICAgICAgICBjb250YWluc0V4dHJlbWVzW2ldID0gdHJ1ZTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBleHRyZW1l
ID0gcTA7CisgICAgICAgICAgICBpbnQgZGlmZiA9IHF1YWRyYW50RGlmZihxMSwgcTApOworICAg
ICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaWZmOyArK2kpIHsKKyAgICAgICAgICAgICAg
ICBjb250YWluc0V4dHJlbWVzW2V4dHJlbWVdID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBleHRy
ZW1lID0gbmV4dFF1YWRyYW50KGV4dHJlbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisK
KyAgICAgICAgaW5mbGF0ZVJlY3RUb0NvbnRhaW5Qb2ludChyLCBzdGFydFBvaW50Lm1feCwgc3Rh
cnRQb2ludC5tX3kpOworICAgICAgICBpbmZsYXRlUmVjdFRvQ29udGFpblBvaW50KHIsIGVuZFBv
aW50Lm1feCwgZW5kUG9pbnQubV95KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyAr
K2kpIHsKKyAgICAgICAgICAgIGlmIChjb250YWluc0V4dHJlbWVzW2ldKQorICAgICAgICAgICAg
ICAgIGluZmxhdGVSZWN0VG9Db250YWluUG9pbnQociwgZGF0YS5tX2NlbnRlci5tX3ggKyBkYXRh
Lm1fcmFkaXVzLm1feCAqIGV4dHJlbWVWZWN0b3JzW2ldLm1feCwgZGF0YS5tX2NlbnRlci5tX3kg
KyBkYXRhLm1fcmFkaXVzLm1feSAqIGV4dHJlbWVWZWN0b3JzW2ldLm1feSk7CisgICAgICAgIH0K
KyAgICB9IGVsc2UgeworICAgICAgICBpbnQgbiA9IG51bVBvaW50cygpOworICAgICAgICBmb3Ig
KGludCBpID0gMDsgaSA8IG47ICsraSkKKyAgICAgICAgICAgIGluZmxhdGVSZWN0VG9Db250YWlu
UG9pbnQociwgbV9kYXRhLm1fcG9pbnRzW2ldLm1feCwgbV9kYXRhLm1fcG9pbnRzW2ldLm1feSk7
CisgICAgfQorfQorCitQYXRoRWxlbWVudFR5cGUgUGxhdGZvcm1QYXRoRWxlbWVudDo6dHlwZSgp
IGNvbnN0Cit7CisgICAgc3dpdGNoIChtX3R5cGUpIHsKKyAgICBjYXNlIFBhdGhNb3ZlVG86Cisg
ICAgICAgIHJldHVybiBQYXRoRWxlbWVudE1vdmVUb1BvaW50OworICAgIGNhc2UgUGF0aExpbmVU
bzoKKyAgICAgICAgcmV0dXJuIFBhdGhFbGVtZW50QWRkTGluZVRvUG9pbnQ7CisgICAgY2FzZSBQ
YXRoQXJjVG86CisgICAgICAgIC8vIEZJWE1FOiB0aGVyZSdzIG5vIGFyY1RvIHR5cGUgZm9yIFBh
dGhFbGVtZW50CisgICAgICAgIHJldHVybiBQYXRoRWxlbWVudEFkZExpbmVUb1BvaW50OworICAg
ICAgICAvLyByZXR1cm4gUGF0aEVsZW1lbnRBZGRRdWFkQ3VydmVUb1BvaW50OworICAgIGNhc2Ug
UGF0aFF1YWRDdXJ2ZVRvOgorICAgICAgICByZXR1cm4gUGF0aEVsZW1lbnRBZGRRdWFkQ3VydmVU
b1BvaW50OworICAgIGNhc2UgUGF0aEJlemllckN1cnZlVG86CisgICAgICAgIHJldHVybiBQYXRo
RWxlbWVudEFkZEN1cnZlVG9Qb2ludDsKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NFUlQobV90
eXBlID09IFBhdGhDbG9zZVN1YnBhdGgpOworICAgICAgICByZXR1cm4gUGF0aEVsZW1lbnRDbG9z
ZVN1YnBhdGg7CisgICAgfQorfQorCitQbGF0Zm9ybVBhdGg6OlBsYXRmb3JtUGF0aCgpCisgICAg
OiBtX3BlbkxpZnRlZCh0cnVlKQoreworICAgIG1fY3VycmVudFBvaW50LmNsZWFyKCk7Cit9CisK
K3ZvaWQgUGxhdGZvcm1QYXRoOjplbnN1cmVTdWJwYXRoKCkKK3sKKyAgICBpZiAobV9wZW5MaWZ0
ZWQpIHsKKyAgICAgICAgbV9wZW5MaWZ0ZWQgPSBmYWxzZTsKKyAgICAgICAgbV9zdWJwYXRocy5h
cHBlbmQoUGF0aFBvbHlnb24oKSk7CisgICAgICAgIG1fc3VicGF0aHMubGFzdCgpLmFwcGVuZCht
X2N1cnJlbnRQb2ludCk7CisgICAgfSBlbHNlCisgICAgICAgIEFTU0VSVCghbV9zdWJwYXRocy5p
c0VtcHR5KCkpOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6YWRkVG9TdWJwYXRoKGNvbnN0IFBs
YXRmb3JtUGF0aEVsZW1lbnQmIGUpCit7CisgICAgaWYgKGUucGxhdGZvcm1UeXBlKCkgPT0gUGxh
dGZvcm1QYXRoRWxlbWVudDo6UGF0aE1vdmVUbykgeworICAgICAgICBtX3BlbkxpZnRlZCA9IHRy
dWU7CisgICAgICAgIG1fY3VycmVudFBvaW50ID0gZS5wb2ludEF0KDApOworICAgIH0gZWxzZSBp
ZiAoZS5wbGF0Zm9ybVR5cGUoKSA9PSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoQ2xvc2VTdWJw
YXRoKSB7CisgICAgICAgIG1fcGVuTGlmdGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKCFtX3N1YnBh
dGhzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKG1fY3VycmVudFBvaW50ICE9IG1fc3Vi
cGF0aHMubGFzdCgpWzBdKSB7CisgICAgICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRvIFczQywg
d2UgaGF2ZSB0byBkcmF3IGEgbGluZSBmcm9tIGN1cnJlbnQgcG9pbnQgdG8gdGhlIGluaXRpYWwg
cG9pbnQKKyAgICAgICAgICAgICAgICBtX3N1YnBhdGhzLmxhc3QoKS5hcHBlbmQobV9zdWJwYXRo
cy5sYXN0KClbMF0pOworICAgICAgICAgICAgICAgIG1fY3VycmVudFBvaW50ID0gbV9zdWJwYXRo
cy5sYXN0KClbMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAg
bV9jdXJyZW50UG9pbnQuY2xlYXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBlbnN1cmVTdWJw
YXRoKCk7CisgICAgICAgIHN3aXRjaCAoZS5wbGF0Zm9ybVR5cGUoKSkgeworICAgICAgICBjYXNl
IFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhMaW5lVG86CisgICAgICAgICAgICBtX3N1YnBhdGhz
Lmxhc3QoKS5hcHBlbmQoZS5wb2ludEF0KDApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICBjYXNlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhBcmNUbzoKKyAgICAgICAgICAgIGFkZEFy
Y1BvaW50cyhtX3N1YnBhdGhzLmxhc3QoKSwgZS5hcmNUbygpKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhRdWFkQ3VydmVUbzoKKyAg
ICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQYXRoUG9pbnQgY29udHJvbFtdID0geworICAg
ICAgICAgICAgICAgICAgICBtX2N1cnJlbnRQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgZS5w
b2ludEF0KDApLAorICAgICAgICAgICAgICAgICAgICBlLnBvaW50QXQoMSksCisgICAgICAgICAg
ICAgICAgfTsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogbWFnaWMgbnVtYmVyPworICAgICAg
ICAgICAgICAgIHF1YWRDdXJ2ZSg1MCwgbV9zdWJwYXRocy5sYXN0KCksIGNvbnRyb2wpOworICAg
ICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUGxhdGZvcm1QYXRo
RWxlbWVudDo6UGF0aEJlemllckN1cnZlVG86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAg
ICAgUGF0aFBvaW50IGNvbnRyb2xbXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50
UG9pbnQsCisgICAgICAgICAgICAgICAgICAgIGUucG9pbnRBdCgwKSwKKyAgICAgICAgICAgICAg
ICAgICAgZS5wb2ludEF0KDEpLAorICAgICAgICAgICAgICAgICAgICBlLnBvaW50QXQoMiksCisg
ICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogbWFnaWMgbnVtYmVy
PworICAgICAgICAgICAgICAgIGJlemllcigxMDAsIG1fc3VicGF0aHMubGFzdCgpLCBjb250cm9s
KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0Ogor
ICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgfQorICAgICAgICBtX2N1cnJlbnRQb2ludCA9IG1fc3VicGF0aHMubGFzdCgpLmxhc3Qo
KTsKKyAgICB9Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphcHBlbmQoY29uc3QgUGxhdGZvcm1Q
YXRoRWxlbWVudCYgZSkKK3sKKyAgICBlLmluZmxhdGVSZWN0VG9Db250YWluTWUobV9ib3VuZGlu
Z1JlY3QsIGxhc3RQb2ludCgpKTsKKyAgICBhZGRUb1N1YnBhdGgoZSk7CisgICAgbV9lbGVtZW50
cy5hcHBlbmQoZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphcHBlbmQoY29uc3QgUGxhdGZv
cm1QYXRoJiBwKQoreworICAgIGNvbnN0IFBsYXRmb3JtUGF0aEVsZW1lbnRzJiBlID0gcC5lbGVt
ZW50cygpOworICAgIGZvciAoUGxhdGZvcm1QYXRoRWxlbWVudHM6OmNvbnN0X2l0ZXJhdG9yIGl0
KGUuYmVnaW4oKSk7IGl0ICE9IGUuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgYWRkVG9TdWJwYXRo
KCppdCk7CisgICAgICAgIGl0LT5pbmZsYXRlUmVjdFRvQ29udGFpbk1lKG1fYm91bmRpbmdSZWN0
LCBsYXN0UG9pbnQoKSk7CisgICAgICAgIG1fZWxlbWVudHMuYXBwZW5kKCppdCk7CisgICAgfQor
fQorCit2b2lkIFBsYXRmb3JtUGF0aDo6Y2xlYXIoKQoreworICAgIG1fZWxlbWVudHMuY2xlYXIo
KTsKKyAgICBtX2JvdW5kaW5nUmVjdCA9IEZsb2F0UmVjdCgpOworICAgIG1fc3VicGF0aHMuY2xl
YXIoKTsKKyAgICBtX2N1cnJlbnRQb2ludC5jbGVhcigpOworICAgIG1fcGVuTGlmdGVkID0gdHJ1
ZTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OnN0cm9rZVBhdGgoSERDIGRjLCBjb25zdCBBZmZp
bmVUcmFuc2Zvcm0qIHRyYW5zZm9ybWF0aW9uKSBjb25zdAoreworICAgIGRyYXdQb2x5Z29ucyhk
YywgbV9zdWJwYXRocywgZmFsc2UsIHRyYW5zZm9ybWF0aW9uKTsKK30KKwordm9pZCBQbGF0Zm9y
bVBhdGg6OmZpbGxQYXRoKEhEQyBkYywgY29uc3QgQWZmaW5lVHJhbnNmb3JtKiB0cmFuc2Zvcm1h
dGlvbikgY29uc3QKK3sKKyAgICBIR0RJT0JKIG9sZFBlbiA9IFNlbGVjdE9iamVjdChkYywgR2V0
U3RvY2tPYmplY3QoTlVMTF9QRU4pKTsKKyAgICBkcmF3UG9seWdvbnMoZGMsIG1fc3VicGF0aHMs
IHRydWUsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICBTZWxlY3RPYmplY3QoZGMsIG9sZFBlbik7Cit9
CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjp0cmFuc2xhdGUoY29uc3QgRmxvYXRTaXplJiBzaXplKQor
eworICAgIGZvciAoUGxhdGZvcm1QYXRoRWxlbWVudHM6Oml0ZXJhdG9yIGl0KG1fZWxlbWVudHMu
YmVnaW4oKSk7IGl0ICE9IG1fZWxlbWVudHMuZW5kKCk7ICsraXQpCisgICAgICAgIGl0LT5tb3Zl
KHNpemUpOworCisgICAgbV9ib3VuZGluZ1JlY3QubW92ZShzaXplKTsKKyAgICBmb3IgKFZlY3Rv
cjxQYXRoUG9seWdvbj46Oml0ZXJhdG9yIGl0ID0gbV9zdWJwYXRocy5iZWdpbigpOyBpdCAhPSBt
X3N1YnBhdGhzLmVuZCgpOyArK2l0KQorICAgICAgICBpdC0+bW92ZShzaXplKTsKK30KKwordm9p
ZCBQbGF0Zm9ybVBhdGg6OnRyYW5zZm9ybShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHQpCit7Cisg
ICAgZm9yIChQbGF0Zm9ybVBhdGhFbGVtZW50czo6aXRlcmF0b3IgaXQobV9lbGVtZW50cy5iZWdp
bigpKTsgaXQgIT0gbV9lbGVtZW50cy5lbmQoKTsgKytpdCkKKyAgICAgICAgaXQtPnRyYW5zZm9y
bSh0KTsKKworICAgIG1fYm91bmRpbmdSZWN0ID0gdC5tYXBSZWN0KG1fYm91bmRpbmdSZWN0KTsK
KyAgICBmb3IgKFZlY3RvcjxQYXRoUG9seWdvbj46Oml0ZXJhdG9yIGl0ID0gbV9zdWJwYXRocy5i
ZWdpbigpOyBpdCAhPSBtX3N1YnBhdGhzLmVuZCgpOyArK2l0KQorICAgICAgICBpdC0+dHJhbnNm
b3JtKHQpOworfQorCitib29sIFBsYXRmb3JtUGF0aDo6Y29udGFpbnMoY29uc3QgRmxvYXRQb2lu
dCYgcG9pbnQsIFdpbmRSdWxlIHJ1bGUpIGNvbnN0Cit7CisgICAgLy8gb3B0aW1pemF0aW9uOiBj
aGVjayB0aGUgYm91bmRpbmcgcmVjdCBmaXJzdAorICAgIGlmICghY29udGFpbnNQb2ludChtX2Jv
dW5kaW5nUmVjdCwgcG9pbnQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBmb3IgKFZl
Y3RvcjxQYXRoUG9seWdvbj46OmNvbnN0X2l0ZXJhdG9yIGkgPSBtX3N1YnBhdGhzLmJlZ2luKCk7
IGkgIT0gbV9zdWJwYXRocy5lbmQoKTsgKytpKSB7CisgICAgICAgIGlmIChpLT5jb250YWlucyhw
b2ludCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFs
c2U7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjptb3ZlVG8oY29uc3QgRmxvYXRQb2ludCYgcG9p
bnQpCit7CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6TW92ZVRvIGRhdGEgPSB7IHsgcG9pbnQu
eCgpLCBwb2ludC55KCkgfSB9OworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQgcGUoZGF0YSk7Cisg
ICAgYXBwZW5kKHBlKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmFkZExpbmVUbyhjb25zdCBG
bG9hdFBvaW50JiBwb2ludCkKK3sKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50OjpMaW5lVG8gZGF0
YSA9IHsgeyBwb2ludC54KCksIHBvaW50LnkoKSB9IH07CisgICAgUGxhdGZvcm1QYXRoRWxlbWVu
dCBwZShkYXRhKTsKKyAgICBhcHBlbmQocGUpOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6YWRk
UXVhZEN1cnZlVG8oY29uc3QgRmxvYXRQb2ludCYgY3AsIGNvbnN0IEZsb2F0UG9pbnQmIHApCit7
CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6UXVhZEN1cnZlVG8gZGF0YSA9IHsgeyBjcC54KCks
IGNwLnkoKSB9LCB7IHAueCgpLCBwLnkoKSB9IH07CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudCBw
ZShkYXRhKTsKKyAgICBhcHBlbmQocGUpOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6YWRkQmV6
aWVyQ3VydmVUbyhjb25zdCBGbG9hdFBvaW50JiBjcDEsIGNvbnN0IEZsb2F0UG9pbnQmIGNwMiwg
Y29uc3QgRmxvYXRQb2ludCYgcCkKK3sKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50OjpCZXppZXJD
dXJ2ZVRvIGRhdGEgPSB7IHsgY3AxLngoKSwgY3AxLnkoKSB9LCB7IGNwMi54KCksIGNwMi55KCkg
fSwgeyBwLngoKSwgcC55KCkgfSB9OworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQgcGUoZGF0YSk7
CisgICAgYXBwZW5kKHBlKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmFkZEFyY1RvKGNvbnN0
IEZsb2F0UG9pbnQmIGZwMSwgY29uc3QgRmxvYXRQb2ludCYgZnAyLCBmbG9hdCByYWRpdXMpCit7
CisgICAgY29uc3QgUGF0aFBvaW50JiBwMCA9IG1fY3VycmVudFBvaW50OworICAgIFBhdGhQb2lu
dCBwMTsKKyAgICBwMSA9IGZwMTsKKyAgICBQYXRoUG9pbnQgcDI7CisgICAgcDIgPSBmcDI7Cisg
ICAgaWYgKCFyYWRpdXMgfHwgcDAgPT0gcDEgfHwgcDEgPT0gcDIpIHsKKyAgICAgICAgYWRkTGlu
ZVRvKHAxKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBhdGhWZWN0b3IgdjAxID0g
cDAgLSBwMTsKKyAgICBQYXRoVmVjdG9yIHYyMSA9IHAyIC0gcDE7CisKKyAgICAvLyBzaW4oQSAt
IEIpID0gc2luKEEpICogY29zKEIpIC0gc2luKEIpICogY29zKEEpCisgICAgZG91YmxlIGNyb3Nz
ID0gdjAxLm1feCAqIHYyMS5tX3kgLSB2MDEubV95ICogdjIxLm1feDsKKworICAgIGlmIChmYWJz
KGNyb3NzKSA8IDFFLTEwKSB7CisgICAgICAgIC8vIG9uIG9uZSBsaW5lCisgICAgICAgIGFkZExp
bmVUbyhwMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkb3VibGUgZDAxID0gdjAx
Lmxlbmd0aCgpOworICAgIGRvdWJsZSBkMjEgPSB2MjEubGVuZ3RoKCk7CisgICAgZG91YmxlIGFu
Z2xlID0gKHBpRG91YmxlIC0gYWJzKGFzaW4oY3Jvc3MgLyAoZDAxICogZDIxKSkpKSAqIDAuNTsK
KyAgICBkb3VibGUgc3BhbiA9IHJhZGl1cyAqIHRhbihhbmdsZSk7CisgICAgZG91YmxlIHJhdGUg
PSBzcGFuIC8gZDAxOworICAgIFBhdGhQb2ludCBzdGFydFBvaW50OworICAgIHN0YXJ0UG9pbnQu
bV94ID0gcDEubV94ICsgdjAxLm1feCAqIHJhdGU7CisgICAgc3RhcnRQb2ludC5tX3kgPSBwMS5t
X3kgKyB2MDEubV95ICogcmF0ZTsKKworICAgIGFkZExpbmVUbyhzdGFydFBvaW50KTsKKworICAg
IFBhdGhQb2ludCBlbmRQb2ludDsKKyAgICByYXRlID0gc3BhbiAvIGQyMTsKKyAgICBlbmRQb2lu
dC5tX3ggPSBwMS5tX3ggKyB2MjEubV94ICogcmF0ZTsKKyAgICBlbmRQb2ludC5tX3kgPSBwMS5t
X3kgKyB2MjEubV95ICogcmF0ZTsKKworICAgIFBhdGhQb2ludCBtaWRQb2ludDsKKyAgICBtaWRQ
b2ludC5tX3ggPSAoc3RhcnRQb2ludC5tX3ggKyBlbmRQb2ludC5tX3gpICogMC41OworICAgIG1p
ZFBvaW50Lm1feSA9IChzdGFydFBvaW50Lm1feSArIGVuZFBvaW50Lm1feSkgKiAwLjU7CisKKyAg
ICBQYXRoVmVjdG9yIHZtMSA9IG1pZFBvaW50IC0gcDE7CisgICAgZG91YmxlIGRtMSA9IHZtMS5s
ZW5ndGgoKTsKKyAgICBkb3VibGUgZCA9IF9oeXBvdChyYWRpdXMsIHNwYW4pOworCisgICAgUGF0
aFBvaW50IGNlbnRlclBvaW50OworICAgIHJhdGUgPSBkIC8gZG0xOworICAgIGNlbnRlclBvaW50
Lm1feCA9IHAxLm1feCArIHZtMS5tX3ggKiByYXRlOworICAgIGNlbnRlclBvaW50Lm1feSA9IHAx
Lm1feSArIHZtMS5tX3kgKiByYXRlOworCisgICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6QXJjVG8g
ZGF0YSA9IHsKKyAgICAgICAgZW5kUG9pbnQsCisgICAgICAgIGNlbnRlclBvaW50LAorICAgICAg
ICB7IHJhZGl1cywgcmFkaXVzIH0sCisgICAgICAgIGNyb3NzIDwgMAorICAgIH07CisgICAgUGxh
dGZvcm1QYXRoRWxlbWVudCBwZShkYXRhKTsKKyAgICBhcHBlbmQocGUpOworfQorCit2b2lkIFBs
YXRmb3JtUGF0aDo6Y2xvc2VTdWJwYXRoKCkKK3sKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50IHBl
OworICAgIGFwcGVuZChwZSk7Cit9CisKKy8vIGFkZCBhIGNpcmN1bGFyIGFyYyBjZW50cmVkIGF0
IHAgd2l0aCByYWRpdXMgciBmcm9tIHN0YXJ0IGFuZ2xlIHNhciAocmFkaWFucykgdG8gZW5kIGFu
Z2xlIGVhcgordm9pZCBQbGF0Zm9ybVBhdGg6OmFkZEVsbGlwc2UoY29uc3QgRmxvYXRQb2ludCYg
cCwgZmxvYXQgYSwgZmxvYXQgYiwgZmxvYXQgc2FyLCBmbG9hdCBlYXIsIGJvb2wgYW50aWNsb2Nr
d2lzZSkKK3sKKyAgICBmbG9hdCBzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWTsKKworICAgIG5v
cm1hbGl6ZUFuZ2xlKHNhcik7CisgICAgbm9ybWFsaXplQW5nbGUoZWFyKTsKKworICAgIGdldEVs
bGlwc2VQb2ludEJ5QW5nbGUoc2FyLCBhLCBiLCBzdGFydFgsIHN0YXJ0WSk7CisgICAgZ2V0RWxs
aXBzZVBvaW50QnlBbmdsZShlYXIsIGEsIGIsIGVuZFgsIGVuZFkpOworCisgICAgdHJhbnNmb3Jt
QXJjUG9pbnQoc3RhcnRYLCBzdGFydFksIHApOworICAgIHRyYW5zZm9ybUFyY1BvaW50KGVuZFgs
IGVuZFksIHApOworCisgICAgRmxvYXRQb2ludCBzdGFydChzdGFydFgsIHN0YXJ0WSk7CisgICAg
bW92ZVRvKHN0YXJ0KTsKKworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OkFyY1RvIGRhdGEgPSB7
IHsgZW5kWCwgZW5kWSB9LCB7IHAueCgpLCBwLnkoKSB9LCAgeyBhLCBiIH0sICFhbnRpY2xvY2t3
aXNlIH07CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudCBwZShkYXRhKTsKKyAgICBhcHBlbmQocGUp
OworfQorCisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphZGRSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcikK
K3sKKyAgICBtb3ZlVG8oci5sb2NhdGlvbigpKTsKKworICAgIGZsb2F0IHJpZ2h0ID0gci5yaWdo
dCgpIC0gMTsKKyAgICBmbG9hdCBib3R0b20gPSByLmJvdHRvbSgpIC0gMTsKKyAgICBhZGRMaW5l
VG8oRmxvYXRQb2ludChyaWdodCwgci55KCkpKTsKKyAgICBhZGRMaW5lVG8oRmxvYXRQb2ludChy
aWdodCwgYm90dG9tKSk7CisgICAgYWRkTGluZVRvKEZsb2F0UG9pbnQoci54KCksIGJvdHRvbSkp
OworICAgIGFkZExpbmVUbyhyLmxvY2F0aW9uKCkpOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6
YWRkRWxsaXBzZShjb25zdCBGbG9hdFJlY3QmIHIpCit7CisgICAgRmxvYXRTaXplIHJhZGl1cyhy
LndpZHRoKCkgKiAwLjUsIHIuaGVpZ2h0KCkgKiAwLjUpOworICAgIGFkZEVsbGlwc2Uoci5sb2Nh
dGlvbigpICsgcmFkaXVzLCByYWRpdXMud2lkdGgoKSwgcmFkaXVzLmhlaWdodCgpLCAwLCAwLCB0
cnVlKTsKK30KKworU3RyaW5nIFBsYXRmb3JtUGF0aDo6ZGVidWdTdHJpbmcoKSBjb25zdAorewor
ICAgIFN0cmluZyByZXQ7CisgICAgZm9yIChQbGF0Zm9ybVBhdGhFbGVtZW50czo6Y29uc3RfaXRl
cmF0b3IgaShtX2VsZW1lbnRzLmJlZ2luKCkpOyBpICE9IG1fZWxlbWVudHMuZW5kKCk7ICsraSkg
eworICAgICAgICBzd2l0Y2ggKGktPnBsYXRmb3JtVHlwZSgpKSB7CisgICAgICAgIGNhc2UgUGxh
dGZvcm1QYXRoRWxlbWVudDo6UGF0aE1vdmVUbzoKKyAgICAgICAgY2FzZSBQbGF0Zm9ybVBhdGhF
bGVtZW50OjpQYXRoTGluZVRvOgorICAgICAgICAgICAgcmV0ICs9IFN0cmluZzo6Zm9ybWF0KCJN
ICVmICVmXG4iLCBpLT5wb2ludEF0KDApLm1feCwgaS0+cG9pbnRBdCgwKS5tX3kpOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aEFyY1Rv
OgorICAgICAgICAgICAgcmV0ICs9IFN0cmluZzo6Zm9ybWF0KCJBICVmICVmICVmICVmICVmICVm
ICVjXG4iCisgICAgICAgICAgICAgICAgLCBpLT5hcmNUbygpLm1fZW5kLm1feCwgaS0+YXJjVG8o
KS5tX2VuZC5tX3kKKyAgICAgICAgICAgICAgICAsIGktPmFyY1RvKCkubV9jZW50ZXIubV94LCBp
LT5hcmNUbygpLm1fY2VudGVyLm1feQorICAgICAgICAgICAgICAgICwgaS0+YXJjVG8oKS5tX3Jh
ZGl1cy5tX3gsIGktPmFyY1RvKCkubV9yYWRpdXMubV95CisgICAgICAgICAgICAgICAgLCBpLT5h
cmNUbygpLm1fY2xvY2t3aXNlPyAnWScgOiAnTicpOworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIGNhc2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aFF1YWRDdXJ2ZVRvOgorICAgICAgICAg
ICAgcmV0ICs9IFN0cmluZzo6Zm9ybWF0KCJRICVmICVmICVmICVmXG4iCisgICAgICAgICAgICAg
ICAgLCBpLT5wb2ludEF0KDApLm1feCwgaS0+cG9pbnRBdCgwKS5tX3kKKyAgICAgICAgICAgICAg
ICAsIGktPnBvaW50QXQoMSkubV94LCBpLT5wb2ludEF0KDEpLm1feSk7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgY2FzZSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoQmV6aWVyQ3VydmVU
bzoKKyAgICAgICAgICAgIHJldCArPSBTdHJpbmc6OmZvcm1hdCgiQiAlZiAlZiAlZiAlZiAlZiAl
ZlxuIgorICAgICAgICAgICAgICAgICwgaS0+cG9pbnRBdCgwKS5tX3gsIGktPnBvaW50QXQoMCku
bV95CisgICAgICAgICAgICAgICAgLCBpLT5wb2ludEF0KDEpLm1feCwgaS0+cG9pbnRBdCgxKS5t
X3kKKyAgICAgICAgICAgICAgICAsIGktPnBvaW50QXQoMikubV94LCBpLT5wb2ludEF0KDIpLm1f
eSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFT
U0VSVChpLT5wbGF0Zm9ybVR5cGUoKSA9PSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoQ2xvc2VT
dWJwYXRoKTsKKyAgICAgICAgICAgIHJldCArPSAiU1xuIjsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBQbGF0Zm9ybVBh
dGg6OmFwcGx5KHZvaWQqIGluZm8sIFBhdGhBcHBsaWVyRnVuY3Rpb24gZnVuY3Rpb24pIGNvbnN0
Cit7CisgICAgUGF0aEVsZW1lbnQgcGVsZW1lbnQ7CisgICAgRmxvYXRQb2ludCBwb2ludHNbM107
CisgICAgcGVsZW1lbnQucG9pbnRzID0gcG9pbnRzOworCisgICAgZm9yIChQbGF0Zm9ybVBhdGhF
bGVtZW50czo6Y29uc3RfaXRlcmF0b3IgaXQobV9lbGVtZW50cy5iZWdpbigpKTsgaXQgIT0gbV9l
bGVtZW50cy5lbmQoKTsgKytpdCkgeworICAgICAgICBwZWxlbWVudC50eXBlID0gaXQtPnR5cGUo
KTsKKyAgICAgICAgaW50IG4gPSBpdC0+bnVtUG9pbnRzKCk7CisgICAgICAgIGZvciAoaW50IGkg
PSAwOyBpIDwgbjsgKytpKQorICAgICAgICAgICAgcG9pbnRzW2ldID0gaXQtPnBvaW50QXQoaSk7
CisgICAgICAgIGZ1bmN0aW9uKGluZm8sICZwZWxlbWVudCk7CisgICAgfQorfQorCit9IC8vIG5h
bWVzcGFjZSBXZWJjb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1Bs
YXRmb3JtUGF0aFdpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbmNlL1BsYXRmb3JtUGF0aFdpbkNFLmNwcAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1BsYXRmb3JtUGF0aFdpbkNFLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMTgsMTQgKzE4LDE0IEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgot
I2luY2x1ZGUgIlBsYXRmb3JtUGF0aFdpbmNlLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1QYXRoV2lu
Q0UuaCIKIAogI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgogI2luY2x1ZGUgIkZsb2F0UmVj
dC5oIgogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2luY2x1ZGUgIlBhdGguaCIKICNp
bmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgotI2luY2x1ZGUgIldpbmNlR3JhcGhpY3NFeHRyYXMu
aCIKKyNpbmNsdWRlICJXaW5DRUdyYXBoaWNzRXh0cmFzLmgiCiAjaW5jbHVkZSA8d3RmL01hdGhF
eHRyYXMuaD4KICNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CiAKQEAgLTMzLDcgKzMzLDcgQEAKIAog
bmFtZXNwYWNlIFdlYkNvcmUgewogCi0vLyBJbXBsZW1lbnRlZCBpbiBHcmFwaGljc0NvbnRleHRX
aW5jZS5jcHAKKy8vIEltcGxlbWVudGVkIGluIEdyYXBoaWNzQ29udGV4dFdpbkNFLmNwcAogdm9p
ZCBnZXRFbGxpcHNlUG9pbnRCeUFuZ2xlKGRvdWJsZSBhbmdsZSwgZG91YmxlIGEsIGRvdWJsZSBi
LCBmbG9hdCYgeCwgZmxvYXQmIHkpOwogCiBzdGF0aWMgdm9pZCBxdWFkQ3VydmUoaW50IHNlZ21l
bnRzLCBWZWN0b3I8UGF0aFBvaW50PiYgcHRzLCBjb25zdCBQYXRoUG9pbnQqIGNvbnRyb2wpCklu
ZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1BsYXRmb3JtUGF0aFdpbkNFLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QbGF0Zm9ybVBh
dGhXaW5DRS5oCShyZXZpc2lvbiA1NzI4OSkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW5jZS9QbGF0Zm9ybVBhdGhXaW5jZS5oOjU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW5jZS9QbGF0Zm9ybVBhdGhXaW5DRS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsMTgzIEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwg
SW5jLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhl
IExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICog
IFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
dXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQor
ICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJ
ZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwg
NTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEz
MDEsIFVTQS4KKyAqLworCisjaWZuZGVmIFBsYXRmb3JtUGF0aFdpbmNlX2gKKyNkZWZpbmUgUGxh
dGZvcm1QYXRoV2luY2VfaAorCisjaW5jbHVkZSAiRmxvYXRQb2ludC5oIgorI2luY2x1ZGUgIkZs
b2F0UmVjdC5oIgorI2luY2x1ZGUgIlBhdGguaCIKKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworICAgIGNsYXNzIEdyYXBoaWNzQ29udGV4dDsKKworICAg
IHN0cnVjdCBQYXRoUG9pbnQgeworICAgICAgICBmbG9hdCBtX3g7CisgICAgICAgIGZsb2F0IG1f
eTsKKyAgICAgICAgY29uc3QgZmxvYXQmIHgoKSBjb25zdCB7IHJldHVybiBtX3g7IH0KKyAgICAg
ICAgY29uc3QgZmxvYXQmIHkoKSBjb25zdCB7IHJldHVybiBtX3k7IH0KKyAgICAgICAgdm9pZCBz
ZXQoZmxvYXQgeCwgZmxvYXQgeSkKKyAgICAgICAgeworICAgICAgICAgICAgbV94ID0geDsKKyAg
ICAgICAgICAgIG1feSA9IHk7CisgICAgICAgIH07CisgICAgICAgIG9wZXJhdG9yIEZsb2F0UG9p
bnQoKSBjb25zdCB7IHJldHVybiBGbG9hdFBvaW50KG1feCwgbV95KTsgfQorICAgICAgICB2b2lk
IG1vdmUoY29uc3QgRmxvYXRTaXplJiBvZmZzZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1f
eCArPSBvZmZzZXQud2lkdGgoKTsKKyAgICAgICAgICAgIG1feSArPSBvZmZzZXQuaGVpZ2h0KCk7
CisgICAgICAgIH0KKyAgICAgICAgUGF0aFBvaW50JiBvcGVyYXRvcj0oY29uc3QgRmxvYXRQb2lu
dCYgcCkKKyAgICAgICAgeworICAgICAgICAgICAgbV94ID0gcC54KCk7CisgICAgICAgICAgICBt
X3kgPSBwLnkoKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAg
ICB2b2lkIGNsZWFyKCkgeyBtX3ggPSBtX3kgPSAwOyB9CisgICAgfTsKKworICAgIHN0cnVjdCBQ
YXRoUG9seWdvbjogcHVibGljIFZlY3RvcjxQYXRoUG9pbnQ+IHsKKyAgICAgICAgdm9pZCBtb3Zl
KGNvbnN0IEZsb2F0U2l6ZSYgb2Zmc2V0KTsKKyAgICAgICAgdm9pZCB0cmFuc2Zvcm0oY29uc3Qg
QWZmaW5lVHJhbnNmb3JtJiB0KTsKKyAgICAgICAgYm9vbCBjb250YWlucyhjb25zdCBGbG9hdFBv
aW50JiBwb2ludCkgY29uc3Q7CisgICAgfTsKKworICAgIGNsYXNzIFBsYXRmb3JtUGF0aEVsZW1l
bnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgZW51bSBQbGFmb3JtUGF0aEVsZW1lbnRUeXBlIHsK
KyAgICAgICAgICAgIFBhdGhNb3ZlVG8sCisgICAgICAgICAgICBQYXRoTGluZVRvLAorICAgICAg
ICAgICAgUGF0aEFyY1RvLAorICAgICAgICAgICAgUGF0aFF1YWRDdXJ2ZVRvLAorICAgICAgICAg
ICAgUGF0aEJlemllckN1cnZlVG8sCisgICAgICAgICAgICBQYXRoQ2xvc2VTdWJwYXRoLAorICAg
ICAgICB9OworCisgICAgICAgIHN0cnVjdCBNb3ZlVG8geworICAgICAgICAgICAgUGF0aFBvaW50
IG1fZW5kOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBMaW5lVG8geworICAgICAgICAg
ICAgUGF0aFBvaW50IG1fZW5kOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBBcmNUbyB7
CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9lbmQ7CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9j
ZW50ZXI7CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9yYWRpdXM7CisgICAgICAgICAgICBib29s
IG1fY2xvY2t3aXNlOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBRdWFkQ3VydmVUbyB7
CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9wb2ludDA7CisgICAgICAgICAgICBQYXRoUG9pbnQg
bV9wb2ludDE7CisgICAgICAgIH07CisKKyAgICAgICAgc3RydWN0IEJlemllckN1cnZlVG8gewor
ICAgICAgICAgICAgUGF0aFBvaW50IG1fcG9pbnQwOworICAgICAgICAgICAgUGF0aFBvaW50IG1f
cG9pbnQxOworICAgICAgICAgICAgUGF0aFBvaW50IG1fcG9pbnQyOworICAgICAgICB9OworCisg
ICAgICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQoKTogbV90eXBlKFBhdGhDbG9zZVN1YnBhdGgpIHsg
bV9kYXRhLm1fcG9pbnRzWzBdLnNldCgwLCAwKTsgICAgfQorICAgICAgICBQbGF0Zm9ybVBhdGhF
bGVtZW50KGNvbnN0IE1vdmVUbyYgZGF0YSk6IG1fdHlwZShQYXRoTW92ZVRvKSB7IG1fZGF0YS5t
X21vdmVUb0RhdGEgPSBkYXRhOyB9CisgICAgICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQoY29uc3Qg
TGluZVRvJiBkYXRhKTogbV90eXBlKFBhdGhMaW5lVG8pIHsgbV9kYXRhLm1fbGluZVRvRGF0YSA9
IGRhdGE7IH0KKyAgICAgICAgUGxhdGZvcm1QYXRoRWxlbWVudChjb25zdCBBcmNUbyYgZGF0YSk6
IG1fdHlwZShQYXRoQXJjVG8pIHsgbV9kYXRhLm1fYXJjVG9EYXRhID0gZGF0YTsgfQorICAgICAg
ICBQbGF0Zm9ybVBhdGhFbGVtZW50KGNvbnN0IFF1YWRDdXJ2ZVRvJiBkYXRhKTogbV90eXBlKFBh
dGhRdWFkQ3VydmVUbykgeyBtX2RhdGEubV9xdWFkQ3VydmVUb0RhdGEgPSBkYXRhOyB9CisgICAg
ICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQoY29uc3QgQmV6aWVyQ3VydmVUbyYgZGF0YSk6IG1fdHlw
ZShQYXRoQmV6aWVyQ3VydmVUbykgeyBtX2RhdGEubV9iZXppZXJDdXJ2ZVRvRGF0YSA9IGRhdGE7
IH0KKworICAgICAgICBjb25zdCBNb3ZlVG8mIG1vdmVUbygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0
YS5tX21vdmVUb0RhdGE7IH0KKyAgICAgICAgY29uc3QgTGluZVRvJiBsaW5lVG8oKSBjb25zdCB7
IHJldHVybiBtX2RhdGEubV9saW5lVG9EYXRhOyB9CisgICAgICAgIGNvbnN0IEFyY1RvJiBhcmNU
bygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5tX2FyY1RvRGF0YTsgfQorICAgICAgICBjb25zdCBR
dWFkQ3VydmVUbyYgcXVhZEN1cnZlVG8oKSBjb25zdCB7IHJldHVybiBtX2RhdGEubV9xdWFkQ3Vy
dmVUb0RhdGE7IH0KKyAgICAgICAgY29uc3QgQmV6aWVyQ3VydmVUbyYgYmV6aWVyQ3VydmVUbygp
IGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5tX2JlemllckN1cnZlVG9EYXRhOyB9CisgICAgICAgIGNv
bnN0IFBhdGhQb2ludCYgbGFzdFBvaW50KCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAg
aW50IG4gPSBudW1Qb2ludHMoKTsKKyAgICAgICAgICAgIHJldHVybiBuID4gMSA/IG1fZGF0YS5t
X3BvaW50c1tuIC0gMV0gOiBtX2RhdGEubV9wb2ludHNbMF07CisgICAgICAgIH0KKyAgICAgICAg
Y29uc3QgUGF0aFBvaW50JiBwb2ludEF0KGludCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9kYXRh
Lm1fcG9pbnRzW2luZGV4XTsgfQorICAgICAgICBpbnQgbnVtUG9pbnRzKCkgY29uc3Q7CisgICAg
ICAgIGludCBudW1Db250cm9sUG9pbnRzKCkgY29uc3Q7CisgICAgICAgIHZvaWQgbW92ZShjb25z
dCBGbG9hdFNpemUmIG9mZnNldCk7CisgICAgICAgIHZvaWQgdHJhbnNmb3JtKGNvbnN0IEFmZmlu
ZVRyYW5zZm9ybSYgdCk7CisgICAgICAgIFBhdGhFbGVtZW50VHlwZSB0eXBlKCkgY29uc3Q7Cisg
ICAgICAgIFBsYWZvcm1QYXRoRWxlbWVudFR5cGUgcGxhdGZvcm1UeXBlKCkgY29uc3QgeyByZXR1
cm4gbV90eXBlOyB9CisgICAgICAgIHZvaWQgaW5mbGF0ZVJlY3RUb0NvbnRhaW5NZShGbG9hdFJl
Y3QmIHIsIGNvbnN0IEZsb2F0UG9pbnQmIGxhc3RQb2ludCkgY29uc3Q7CisKKyAgICBwcml2YXRl
OgorICAgICAgICBQbGFmb3JtUGF0aEVsZW1lbnRUeXBlIG1fdHlwZTsKKyAgICAgICAgdW5pb24g
eworICAgICAgICAgICAgTW92ZVRvIG1fbW92ZVRvRGF0YTsKKyAgICAgICAgICAgIExpbmVUbyBt
X2xpbmVUb0RhdGE7CisgICAgICAgICAgICBBcmNUbyBtX2FyY1RvRGF0YTsKKyAgICAgICAgICAg
IFF1YWRDdXJ2ZVRvIG1fcXVhZEN1cnZlVG9EYXRhOworICAgICAgICAgICAgQmV6aWVyQ3VydmVU
byBtX2JlemllckN1cnZlVG9EYXRhOworICAgICAgICAgICAgUGF0aFBvaW50IG1fcG9pbnRzWzRd
OworICAgICAgICB9IG1fZGF0YTsKKyAgICB9OworCisgICAgdHlwZWRlZiBWZWN0b3I8UGxhdGZv
cm1QYXRoRWxlbWVudD4gUGxhdGZvcm1QYXRoRWxlbWVudHM7CisKKyAgICBjbGFzcyBQbGF0Zm9y
bVBhdGggeworICAgIHB1YmxpYzoKKyAgICAgICAgUGxhdGZvcm1QYXRoKCk7CisgICAgICAgIGNv
bnN0IFBsYXRmb3JtUGF0aEVsZW1lbnRzJiBlbGVtZW50cygpIGNvbnN0IHsgcmV0dXJuIG1fZWxl
bWVudHM7IH0KKyAgICAgICAgdm9pZCBhcHBlbmQoY29uc3QgUGxhdGZvcm1QYXRoRWxlbWVudCYg
ZSk7CisgICAgICAgIHZvaWQgYXBwZW5kKGNvbnN0IFBsYXRmb3JtUGF0aCYgcCk7CisgICAgICAg
IHZvaWQgY2xlYXIoKTsKKyAgICAgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbV9l
bGVtZW50cy5pc0VtcHR5KCk7IH0KKworICAgICAgICB2b2lkIHN0cm9rZVBhdGgoSERDLCBjb25z
dCBBZmZpbmVUcmFuc2Zvcm0qIHRyKSBjb25zdDsKKyAgICAgICAgdm9pZCBmaWxsUGF0aChIREMs
IGNvbnN0IEFmZmluZVRyYW5zZm9ybSogdHIpIGNvbnN0OworICAgICAgICBGbG9hdFBvaW50IGxh
c3RQb2ludCgpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudHMuaXNFbXB0eSgpID8gRmxvYXRQb2lu
dCgwLCAwKSA6IG1fZWxlbWVudHMubGFzdCgpLmxhc3RQb2ludCgpOyB9CisKKyAgICAgICAgY29u
c3QgRmxvYXRSZWN0JiBib3VuZGluZ1JlY3QoKSBjb25zdCB7IHJldHVybiBtX2JvdW5kaW5nUmVj
dDsgfQorICAgICAgICBib29sIGNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBXaW5k
UnVsZSBydWxlKSBjb25zdDsKKyAgICAgICAgdm9pZCB0cmFuc2xhdGUoY29uc3QgRmxvYXRTaXpl
JiBzaXplKTsKKyAgICAgICAgdm9pZCB0cmFuc2Zvcm0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0
KTsKKworICAgICAgICB2b2lkIG1vdmVUbyhjb25zdCBGbG9hdFBvaW50Jik7CisgICAgICAgIHZv
aWQgYWRkTGluZVRvKGNvbnN0IEZsb2F0UG9pbnQmKTsKKyAgICAgICAgdm9pZCBhZGRRdWFkQ3Vy
dmVUbyhjb25zdCBGbG9hdFBvaW50JiBjb250cm9sUG9pbnQsIGNvbnN0IEZsb2F0UG9pbnQmIHBv
aW50KTsKKyAgICAgICAgdm9pZCBhZGRCZXppZXJDdXJ2ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIGNv
bnRyb2xQb2ludDEsIGNvbnN0IEZsb2F0UG9pbnQmIGNvbnRyb2xQb2ludDIsIGNvbnN0IEZsb2F0
UG9pbnQmKTsKKyAgICAgICAgdm9pZCBhZGRBcmNUbyhjb25zdCBGbG9hdFBvaW50JiwgY29uc3Qg
RmxvYXRQb2ludCYsIGZsb2F0IHJhZGl1cyk7CisgICAgICAgIHZvaWQgY2xvc2VTdWJwYXRoKCk7
CisgICAgICAgIHZvaWQgYWRkRWxsaXBzZShjb25zdCBGbG9hdFBvaW50JiBwLCBmbG9hdCBhLCBm
bG9hdCBiLCBmbG9hdCBzYXIsIGZsb2F0IGVhciwgYm9vbCBhbnRpY2xvY2t3aXNlKTsKKyAgICAg
ICAgdm9pZCBhZGRSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcik7CisgICAgICAgIHZvaWQgYWRkRWxs
aXBzZShjb25zdCBGbG9hdFJlY3QmIHIpOworICAgICAgICBTdHJpbmcgZGVidWdTdHJpbmcoKSBj
b25zdDsKKyAgICAgICAgdm9pZCBhcHBseSh2b2lkKiBpbmZvLCBQYXRoQXBwbGllckZ1bmN0aW9u
IGZ1bmN0aW9uKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgZW5zdXJlU3Vi
cGF0aCgpOworICAgICAgICB2b2lkIGFkZFRvU3VicGF0aChjb25zdCBQbGF0Zm9ybVBhdGhFbGVt
ZW50JiBlKTsKKworICAgICAgICBQbGF0Zm9ybVBhdGhFbGVtZW50cyBtX2VsZW1lbnRzOworICAg
ICAgICBGbG9hdFJlY3QgbV9ib3VuZGluZ1JlY3Q7CisgICAgICAgIFZlY3RvcjxQYXRoUG9seWdv
bj4gbV9zdWJwYXRoczsKKyAgICAgICAgUGF0aFBvaW50IG1fY3VycmVudFBvaW50OworICAgICAg
ICBib29sIG1fcGVuTGlmdGVkOworICAgIH07CisKK30KKworI2VuZGlmIC8vIFBsYXRmb3JtUGF0
aFdpbmNlX2gKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGxhdGZvcm1Q
YXRoV2luQ0UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNl
L1BsYXRmb3JtUGF0aFdpbkNFLmgJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW5jZS9QbGF0Zm9ybVBhdGhXaW5DRS5oCSh3b3JraW5nIGNvcHkpCkBAIC0x
Nyw4ICsxNyw4IEBACiAgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCiAgKi8KIAotI2lm
bmRlZiBQbGF0Zm9ybVBhdGhXaW5jZV9oCi0jZGVmaW5lIFBsYXRmb3JtUGF0aFdpbmNlX2gKKyNp
Zm5kZWYgUGxhdGZvcm1QYXRoV2luQ0VfaAorI2RlZmluZSBQbGF0Zm9ybVBhdGhXaW5DRV9oCiAK
ICNpbmNsdWRlICJGbG9hdFBvaW50LmgiCiAjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCkBAIC0xODAs
NCArMTgwLDQgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiB9CiAKLSNlbmRpZiAvLyBQbGF0Zm9y
bVBhdGhXaW5jZV9oCisjZW5kaWYgLy8gUGxhdGZvcm1QYXRoV2luQ0VfaApJbmRleDogV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QbGF0Zm9ybVBhdGhXaW5jZS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QbGF0Zm9ybVBhdGhXaW5jZS5j
cHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9Q
bGF0Zm9ybVBhdGhXaW5jZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsODEwICswLDAgQEAKLS8q
Ci0gKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCi0gKgotICog
IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IKLSAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYwotICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3Ig
KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBsaWJyYXJ5
IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAg
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQotICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm
b3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYWxvbmcgd2l0
aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUg
dG8KLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBT
dHJlZXQsIEZpZnRoIEZsb29yLAotICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICov
Ci0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJQbGF0Zm9ybVBhdGhXaW5jZS5oIgot
Ci0jaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCi0jaW5jbHVkZSAiRmxvYXRSZWN0LmgiCi0j
aW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCi0jaW5jbHVkZSAiUGF0aC5oIgotI2luY2x1ZGUg
IlBsYXRmb3JtU3RyaW5nLmgiCi0jaW5jbHVkZSAiV2luY2VHcmFwaGljc0V4dHJhcy5oIgotI2lu
Y2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+Ci0jaW5jbHVkZSA8d3RmL093blB0ci5oPgotCi0jaW5j
bHVkZSA8d2luZG93cy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLS8vIEltcGxlbWVudGVk
IGluIEdyYXBoaWNzQ29udGV4dFdpbmNlLmNwcAotdm9pZCBnZXRFbGxpcHNlUG9pbnRCeUFuZ2xl
KGRvdWJsZSBhbmdsZSwgZG91YmxlIGEsIGRvdWJsZSBiLCBmbG9hdCYgeCwgZmxvYXQmIHkpOwot
Ci1zdGF0aWMgdm9pZCBxdWFkQ3VydmUoaW50IHNlZ21lbnRzLCBWZWN0b3I8UGF0aFBvaW50PiYg
cHRzLCBjb25zdCBQYXRoUG9pbnQqIGNvbnRyb2wpCi17Ci0gICAgY29uc3QgZmxvYXQgc3RlcCA9
IDEuMCAvIHNlZ21lbnRzOwotICAgIHJlZ2lzdGVyIGZsb2F0IHRBID0gMC4wOwotICAgIHJlZ2lz
dGVyIGZsb2F0IHRCID0gMS4wOwotCi0gICAgZmxvYXQgYzF4ID0gY29udHJvbFswXS54KCk7Ci0g
ICAgZmxvYXQgYzF5ID0gY29udHJvbFswXS55KCk7Ci0gICAgZmxvYXQgYzJ4ID0gY29udHJvbFsx
XS54KCk7Ci0gICAgZmxvYXQgYzJ5ID0gY29udHJvbFsxXS55KCk7Ci0gICAgZmxvYXQgYzN4ID0g
Y29udHJvbFsyXS54KCk7Ci0gICAgZmxvYXQgYzN5ID0gY29udHJvbFsyXS55KCk7Ci0KLSAgICBj
b25zdCBpbnQgb2Zmc2V0ID0gcHRzLnNpemUoKTsKLSAgICBwdHMucmVzaXplKG9mZnNldCArIHNl
Z21lbnRzKTsKLSAgICBQYXRoUG9pbnQgcHA7Ci0gICAgcHAubV94ID0gYzF4OwotICAgIHBwLm1f
eSA9IGMxeTsKLQotICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2VnbWVudHM7ICsraSkgewotICAg
ICAgICB0QSArPSBzdGVwOwotICAgICAgICB0QiAtPSBzdGVwOwotCi0gICAgICAgIGNvbnN0IGZs
b2F0IGEgPSB0QiAqIHRCOwotICAgICAgICBjb25zdCBmbG9hdCBiID0gMi4wICogdEEgKiB0QjsK
LSAgICAgICAgY29uc3QgZmxvYXQgYyA9IHRBICogdEE7Ci0KLSAgICAgICAgcHAubV94ID0gYzF4
ICogYSArIGMyeCAqIGIgKyBjM3ggKiBjOwotICAgICAgICBwcC5tX3kgPSBjMXkgKiBhICsgYzJ5
ICogYiArIGMzeSAqIGM7Ci0KLSAgICAgICAgcHRzW29mZnNldCArIGkgLSAxXSA9IHBwOwotICAg
IH0KLQotICAgIHBwLm1feCA9IGMzeDsKLSAgICBwcC5tX3kgPSBjM3k7Ci0gICAgcHRzW29mZnNl
dCArIHNlZ21lbnRzIC0gMV0gPSBwcDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGJlemllcihp
bnQgc2VnbWVudHMsIFZlY3RvcjxQYXRoUG9pbnQ+JiBwdHMsIGNvbnN0IFBhdGhQb2ludCogY29u
dHJvbCkKLXsKLSAgICBjb25zdCBmbG9hdCBzdGVwID0gMS4wIC8gc2VnbWVudHM7Ci0gICAgcmVn
aXN0ZXIgZmxvYXQgdEEgPSAwLjA7Ci0gICAgcmVnaXN0ZXIgZmxvYXQgdEIgPSAxLjA7Ci0KLSAg
ICBmbG9hdCBjMXggPSBjb250cm9sWzBdLngoKTsKLSAgICBmbG9hdCBjMXkgPSBjb250cm9sWzBd
LnkoKTsKLSAgICBmbG9hdCBjMnggPSBjb250cm9sWzFdLngoKTsKLSAgICBmbG9hdCBjMnkgPSBj
b250cm9sWzFdLnkoKTsKLSAgICBmbG9hdCBjM3ggPSBjb250cm9sWzJdLngoKTsKLSAgICBmbG9h
dCBjM3kgPSBjb250cm9sWzJdLnkoKTsKLSAgICBmbG9hdCBjNHggPSBjb250cm9sWzNdLngoKTsK
LSAgICBmbG9hdCBjNHkgPSBjb250cm9sWzNdLnkoKTsKLQotICAgIGNvbnN0IGludCBvZmZzZXQg
PSBwdHMuc2l6ZSgpOwotICAgIHB0cy5yZXNpemUob2Zmc2V0ICsgc2VnbWVudHMpOwotICAgIFBh
dGhQb2ludCBwcDsKLSAgICBwcC5tX3ggPSBjMXg7Ci0gICAgcHAubV95ID0gYzF5OwotCi0gICAg
Zm9yIChpbnQgaSA9IDE7IGkgPCBzZWdtZW50czsgKytpKSB7Ci0gICAgICAgIHRBICs9IHN0ZXA7
Ci0gICAgICAgIHRCIC09IHN0ZXA7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHRBc3EgPSB0QSAqIHRB
OwotICAgICAgICBjb25zdCBmbG9hdCB0QnNxID0gdEIgKiB0QjsKLQotICAgICAgICBjb25zdCBm
bG9hdCBhID0gdEJzcSAqIHRCOwotICAgICAgICBjb25zdCBmbG9hdCBiID0gMy4wICogdEEgKiB0
QnNxOwotICAgICAgICBjb25zdCBmbG9hdCBjID0gMy4wICogdEIgKiB0QXNxOwotICAgICAgICBj
b25zdCBmbG9hdCBkID0gdEFzcSAqIHRBOwotCi0gICAgICAgIHBwLm1feCA9IGMxeCAqIGEgKyBj
MnggKiBiICsgYzN4ICogYyArIGM0eCAqIGQ7Ci0gICAgICAgIHBwLm1feSA9IGMxeSAqIGEgKyBj
MnkgKiBiICsgYzN5ICogYyArIGM0eSAqIGQ7Ci0KLSAgICAgICAgcHRzW29mZnNldCArIGkgLSAx
XSA9IHBwOwotICAgIH0KLQotICAgIHBwLm1feCA9IGM0eDsKLSAgICBwcC5tX3kgPSBjNHk7Ci0g
ICAgcHRzW29mZnNldCArIHNlZ21lbnRzIC0gMV0gPSBwcDsKLX0KLQotc3RhdGljIGJvb2wgY29u
dGFpbnNQb2ludChjb25zdCBGbG9hdFJlY3QmIHIsIGNvbnN0IEZsb2F0UG9pbnQmIHApCi17Ci0g
ICAgcmV0dXJuIHAueCgpID49IHIueCgpICYmIHAueSgpID49IHIueSgpICYmIHAueCgpIDwgci5y
aWdodCgpICYmIHAueSgpIDwgci5ib3R0b20oKTsKLX0KLQotc3RhdGljIHZvaWQgbm9ybWFsaXpl
QW5nbGUoZmxvYXQmIGFuZ2xlKQotewotICAgIGFuZ2xlID0gZm1vZChhbmdsZSwgMiAqIHBpRmxv
YXQpOwotICAgIGlmIChhbmdsZSA8IDApCi0gICAgICAgIGFuZ2xlICs9IDIgKiBwaUZsb2F0Owot
ICAgIGlmIChhbmdsZSA8IDAuMDAwMDFmKQotICAgICAgICBhbmdsZSA9IDA7Ci19Ci0KLXN0YXRp
YyB2b2lkIHRyYW5zZm9ybUFyY1BvaW50KGZsb2F0JiB4LCBmbG9hdCYgeSwgY29uc3QgRmxvYXRQ
b2ludCYgYykKLXsKLSAgICB4ICs9IGMueCgpOwotICAgIHkgKz0gYy55KCk7Ci19Ci0KLXN0YXRp
YyB2b2lkIGluZmxhdGVSZWN0VG9Db250YWluUG9pbnQoRmxvYXRSZWN0JiByLCBmbG9hdCB4LCBm
bG9hdCB5KQotewotICAgIGlmIChyLmlzRW1wdHkoKSkgewotICAgICAgICByLnNldFgoeCk7Ci0g
ICAgICAgIHIuc2V0WSh5KTsKLSAgICAgICAgci5zZXRTaXplKEZsb2F0U2l6ZSgxLCAxKSk7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHggPCByLngoKSkgewotICAgICAgICByLnNl
dFdpZHRoKHIucmlnaHQoKSAtIHgpOwotICAgICAgICByLnNldFgoeCk7Ci0gICAgfSBlbHNlIHsK
LSAgICAgICAgZmxvYXQgdyA9IHggLSByLngoKSArIDE7Ci0gICAgICAgIGlmICh3ID4gci53aWR0
aCgpKQotICAgICAgICAgICAgci5zZXRXaWR0aCh3KTsKLSAgICB9Ci0gICAgaWYgKHkgPCByLnko
KSkgewotICAgICAgICByLnNldEhlaWdodChyLmJvdHRvbSgpIC0geSk7Ci0gICAgICAgIHIuc2V0
WSh5KTsKLSAgICB9IGVsc2UgewotICAgICAgICBmbG9hdCBoID0gIHkgLSByLnkoKSArIDE7Ci0g
ICAgICAgIGlmIChoID4gci5oZWlnaHQoKSkKLSAgICAgICAgICAgIHIuc2V0SGVpZ2h0KGgpOwot
ICAgIH0KLX0KLQotLy8gcmV0dXJuIDAtYmFzZWQgdmFsdWU6IDAgLSBmaXJzdCBRdWFkcmFudCAo
IDAgLSA5MCBkZWdyZWUpCi1zdGF0aWMgaW5saW5lIGludCBxdWFkcmFudChjb25zdCBQYXRoUG9p
bnQmIHBvaW50LCBjb25zdCBQYXRoUG9pbnQmIG9yaWdpbikKLXsKLSAgICByZXR1cm4gcG9pbnQu
bV94IDwgb3JpZ2luLm1feCA/Ci0gICAgICAgIChwb2ludC5tX3kgPCBvcmlnaW4ubV95ID8gMiA6
IDEpCi0gICAgICAgIDogKHBvaW50Lm1feSA8IG9yaWdpbi5tX3kgPyAzIDogMCk7Ci19Ci0KLXN0
YXRpYyBpbmxpbmUgYm9vbCBpc1F1YWRyYW50T25MZWZ0KGludCBxKSB7IHJldHVybiBxID09IDEg
fHwgcSA9PSAyOyB9Ci1zdGF0aWMgaW5saW5lIGJvb2wgaXNRdWFkcmFudE9uUmlnaHQoaW50IHEp
IHsgcmV0dXJuIHEgPT0gMCB8fCBxID09IDM7IH0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc1F1YWRy
YW50T25Ub3AoaW50IHEpIHsgcmV0dXJuIHEgPT0gMiB8fCBxID09IDM7IH0KLXN0YXRpYyBpbmxp
bmUgYm9vbCBpc1F1YWRyYW50T25Cb3R0b20oaW50IHEpIHsgcmV0dXJuIHEgPT0gMCB8fCBxID09
IDE7IH0KLQotc3RhdGljIGlubGluZSBpbnQgbmV4dFF1YWRyYW50KGludCBxKSB7IHJldHVybiBx
ID09IDMgPyAwIDogcSArIDE7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHF1YWRyYW50RGlmZihpbnQg
cTEsIGludCBxMikKLXsKLSAgICBpbnQgZCA9IHExIC0gcTI7Ci0gICAgd2hpbGUgKGQgPCAwKQot
ICAgICAgICBkICs9IDQ7Ci0gICAgcmV0dXJuIGQ7Ci19Ci0KLXN0cnVjdCBQYXRoVmVjdG9yIHsK
LSAgICBmbG9hdCBtX3g7Ci0gICAgZmxvYXQgbV95OwotCi0gICAgUGF0aFZlY3RvcigpIDogbV94
KDApLCBtX3koMCkge30KLSAgICBQYXRoVmVjdG9yKGZsb2F0IHgsIGZsb2F0IHkpIDogbV94KHgp
LCBtX3koeSkge30KLSAgICBkb3VibGUgYW5nbGUoKSBjb25zdCB7IHJldHVybiBhdGFuMihtX3ks
IG1feCk7IH0KLSAgICBvcGVyYXRvciBkb3VibGUgKCkgY29uc3QgeyByZXR1cm4gYW5nbGUoKTsg
fQotICAgIGRvdWJsZSBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBfaHlwb3QobV94LCBtX3kpOyB9
Ci19OwotCi1QYXRoVmVjdG9yIG9wZXJhdG9yLShjb25zdCBQYXRoUG9pbnQmIHAxLCBjb25zdCBQ
YXRoUG9pbnQmIHAyKQotewotICAgIHJldHVybiBQYXRoVmVjdG9yKHAxLm1feCAtIHAyLm1feCwg
cDEubV95IC0gcDIubV95KTsKLX0KLQotc3RhdGljIHZvaWQgYWRkQXJjUG9pbnQoUGF0aFBvbHln
b24mIHBvbHksIGNvbnN0IFBhdGhQb2ludCYgY2VudGVyLCBjb25zdCBQYXRoUG9pbnQmIHJhZGl1
cywgZG91YmxlIGFuZ2xlKQotewotICAgIFBhdGhQb2ludCBwOwotICAgIGdldEVsbGlwc2VQb2lu
dEJ5QW5nbGUoYW5nbGUsIHJhZGl1cy5tX3gsIHJhZGl1cy5tX3ksIHAubV94LCBwLm1feSk7Ci0g
ICAgdHJhbnNmb3JtQXJjUG9pbnQocC5tX3gsIHAubV95LCBjZW50ZXIpOwotICAgIGlmIChwb2x5
LmlzRW1wdHkoKSB8fCBwb2x5Lmxhc3QoKSAhPSBwKQotICAgICAgICBwb2x5LmFwcGVuZChwKTsK
LX0KLQotc3RhdGljIHZvaWQgYWRkQXJjUG9pbnRzKFBhdGhQb2x5Z29uJiBwb2x5LCBjb25zdCBQ
bGF0Zm9ybVBhdGhFbGVtZW50OjpBcmNUbyYgZGF0YSkKLXsKLSAgICBjb25zdCBQYXRoUG9pbnQm
IHN0YXJ0UG9pbnQgPSBwb2x5Lmxhc3QoKTsKLSAgICBkb3VibGUgY3VyQW5nbGUgPSBzdGFydFBv
aW50IC0gZGF0YS5tX2NlbnRlcjsKLSAgICBkb3VibGUgZW5kQW5nbGUgPSBkYXRhLm1fZW5kIC0g
ZGF0YS5tX2NlbnRlcjsKLSAgICBkb3VibGUgYW5nbGVTdGVwID0gMi4gLyBzdGQ6Om1heChkYXRh
Lm1fcmFkaXVzLm1feCwgZGF0YS5tX3JhZGl1cy5tX3kpOwotICAgIGlmIChkYXRhLm1fY2xvY2t3
aXNlKSB7Ci0gICAgICAgIGlmIChlbmRBbmdsZSA8PSBjdXJBbmdsZSB8fCBzdGFydFBvaW50ID09
IGRhdGEubV9lbmQpCi0gICAgICAgICAgICBlbmRBbmdsZSArPSAyICogcGlEb3VibGU7Ci0gICAg
fSBlbHNlIHsKLSAgICAgICAgYW5nbGVTdGVwID0gLWFuZ2xlU3RlcDsKLSAgICAgICAgaWYgKGVu
ZEFuZ2xlID49IGN1ckFuZ2xlIHx8IHN0YXJ0UG9pbnQgPT0gZGF0YS5tX2VuZCkKLSAgICAgICAg
ICAgIGVuZEFuZ2xlIC09IDIgKiBwaURvdWJsZTsKLSAgICB9Ci0KLSAgICBmb3IgKGN1ckFuZ2xl
ICs9IGFuZ2xlU3RlcDsgZGF0YS5tX2Nsb2Nrd2lzZSA/IGN1ckFuZ2xlIDwgZW5kQW5nbGUgOiBj
dXJBbmdsZSA+IGVuZEFuZ2xlOyBjdXJBbmdsZSArPSBhbmdsZVN0ZXApCi0gICAgICAgIGFkZEFy
Y1BvaW50KHBvbHksIGRhdGEubV9jZW50ZXIsIGRhdGEubV9yYWRpdXMsIGN1ckFuZ2xlKTsKLQot
ICAgIGlmIChwb2x5LmlzRW1wdHkoKSB8fCBwb2x5Lmxhc3QoKSAhPSBkYXRhLm1fZW5kKQotICAg
ICAgICBwb2x5LmFwcGVuZChkYXRhLm1fZW5kKTsKLX0KLQotc3RhdGljIHZvaWQgZHJhd1BvbHln
b25zKEhEQyBkYywgY29uc3QgVmVjdG9yPFBhdGhQb2x5Z29uPiYgcG9seWdvbnMsIGJvb2wgZmls
bCwgY29uc3QgQWZmaW5lVHJhbnNmb3JtKiB0cmFuc2Zvcm1hdGlvbikKLXsKLSAgICBNZW1vcnlB
bGxvY2F0aW9uQ2FuRmFpbCBjYW5GYWlsOwotICAgIGZvciAoVmVjdG9yPFBhdGhQb2x5Z29uPjo6
Y29uc3RfaXRlcmF0b3IgaSA9IHBvbHlnb25zLmJlZ2luKCk7IGkgIT0gcG9seWdvbnMuZW5kKCk7
ICsraSkgewotICAgICAgICBpbnQgbnBvaW50cyA9IGktPnNpemUoKTsKLSAgICAgICAgaWYgKCFu
cG9pbnRzKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgUE9JTlQqIHdpblBvaW50
cyA9IDA7Ci0gICAgICAgIGlmIChmaWxsKSB7Ci0gICAgICAgICAgICBpZiAobnBvaW50cyA+IDIp
Ci0gICAgICAgICAgICAgICAgd2luUG9pbnRzID0gbmV3IFBPSU5UW25wb2ludHMgKyAxXTsKLSAg
ICAgICAgfSBlbHNlCi0gICAgICAgICAgICB3aW5Qb2ludHMgPSBuZXcgUE9JTlRbbnBvaW50c107
Ci0KLSAgICAgICAgaWYgKHdpblBvaW50cykgewotICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWF0
aW9uKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaTIgPSAwOyBpMiA8IG5wb2ludHM7ICsr
aTIpIHsKLSAgICAgICAgICAgICAgICAgICAgRmxvYXRQb2ludCB0clBvaW50ID0gdHJhbnNmb3Jt
YXRpb24tPm1hcFBvaW50KGktPmF0KGkyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHdpblBvaW50
c1tpMl0ueCA9IHN0YWJsZVJvdW5kKHRyUG9pbnQueCgpKTsKLSAgICAgICAgICAgICAgICAgICAg
d2luUG9pbnRzW2kyXS55ID0gc3RhYmxlUm91bmQodHJQb2ludC55KCkpOwotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaTIg
PSAwOyBpMiA8IG5wb2ludHM7ICsraTIpIHsKLSAgICAgICAgICAgICAgICAgICAgd2luUG9pbnRz
W2kyXS54ID0gc3RhYmxlUm91bmQoaS0+YXQoaTIpLngoKSk7Ci0gICAgICAgICAgICAgICAgICAg
IHdpblBvaW50c1tpMl0ueSA9IHN0YWJsZVJvdW5kKGktPmF0KGkyKS55KCkpOwotICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZpbGwgJiYgd2luUG9p
bnRzW25wb2ludHMgLSAxXSAhPSB3aW5Qb2ludHNbMF0pIHsKLSAgICAgICAgICAgICAgICB3aW5Q
b2ludHNbbnBvaW50c10ueCA9IHdpblBvaW50c1swXS54OwotICAgICAgICAgICAgICAgIHdpblBv
aW50c1tucG9pbnRzXS55ID0gd2luUG9pbnRzWzBdLnk7Ci0gICAgICAgICAgICAgICAgKytucG9p
bnRzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZmlsbCkKLSAgICAgICAgICAg
ICAgICA6OlBvbHlnb24oZGMsIHdpblBvaW50cywgbnBvaW50cyk7Ci0gICAgICAgICAgICBlbHNl
Ci0gICAgICAgICAgICAgICAgOjpQb2x5bGluZShkYywgd2luUG9pbnRzLCBucG9pbnRzKTsKLSAg
ICAgICAgICAgIGRlbGV0ZVtdIHdpblBvaW50czsKLSAgICAgICAgfQotICAgIH0KLX0KLQotCi1p
bnQgUGxhdGZvcm1QYXRoRWxlbWVudDo6bnVtQ29udHJvbFBvaW50cygpIGNvbnN0Ci17Ci0gICAg
c3dpdGNoIChtX3R5cGUpIHsKLSAgICBjYXNlIFBhdGhNb3ZlVG86Ci0gICAgY2FzZSBQYXRoTGlu
ZVRvOgotICAgICAgICByZXR1cm4gMTsKLSAgICBjYXNlIFBhdGhRdWFkQ3VydmVUbzoKLSAgICBj
YXNlIFBhdGhBcmNUbzoKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgY2FzZSBQYXRoQmV6aWVyQ3Vy
dmVUbzoKLSAgICAgICAgcmV0dXJuIDM7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQVNTRVJUKG1f
dHlwZSA9PSBQYXRoQ2xvc2VTdWJwYXRoKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQot
Ci1pbnQgUGxhdGZvcm1QYXRoRWxlbWVudDo6bnVtUG9pbnRzKCkgY29uc3QKLXsKLSAgICBzd2l0
Y2ggKG1fdHlwZSkgewotICAgIGNhc2UgUGF0aE1vdmVUbzoKLSAgICBjYXNlIFBhdGhMaW5lVG86
Ci0gICAgY2FzZSBQYXRoQXJjVG86Ci0gICAgICAgIHJldHVybiAxOwotICAgIGNhc2UgUGF0aFF1
YWRDdXJ2ZVRvOgotICAgICAgICByZXR1cm4gMjsKLSAgICBjYXNlIFBhdGhCZXppZXJDdXJ2ZVRv
OgotICAgICAgICByZXR1cm4gMzsKLSAgICBkZWZhdWx0OgotICAgICAgICBBU1NFUlQobV90eXBl
ID09IFBhdGhDbG9zZVN1YnBhdGgpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLXZv
aWQgUGF0aFBvbHlnb246Om1vdmUoY29uc3QgRmxvYXRTaXplJiBvZmZzZXQpCi17Ci0gICAgZm9y
IChWZWN0b3I8UGF0aFBvaW50Pjo6aXRlcmF0b3IgaSA9IGJlZ2luKCk7IGkgPCBlbmQoKTsgKytp
KQotICAgICAgICBpLT5tb3ZlKG9mZnNldCk7Ci19Ci0KLXZvaWQgUGF0aFBvbHlnb246OnRyYW5z
Zm9ybShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHQpCi17Ci0gICAgZm9yIChWZWN0b3I8UGF0aFBv
aW50Pjo6aXRlcmF0b3IgaSA9IGJlZ2luKCk7IGkgPCBlbmQoKTsgKytpKQotICAgICAgICAqaSA9
IHQubWFwUG9pbnQoKmkpOwotfQotCi1ib29sIFBhdGhQb2x5Z29uOjpjb250YWlucyhjb25zdCBG
bG9hdFBvaW50JiBwb2ludCkgY29uc3QKLXsKLSAgICBpZiAoc2l6ZSgpIDwgMykKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0gICAgLy8gVGVzdCBpbnRlcnNlY3Rpb25zIGJldHdlZW4gdGhlIHBv
bHlnb24gYW5kIHRoZSB2ZXJ0aWNhbCBsaW5lOiB4ID0gcG9pbnQueCgpCi0KLSAgICBpbnQgaW50
ZXJzZWN0ZWQgPSAwOwotICAgIGNvbnN0IFBhdGhQb2ludCogcG9pbnQxID0gJmxhc3QoKTsKLSAg
ICBWZWN0b3I8UGF0aFBvaW50Pjo6Y29uc3RfaXRlcmF0b3IgbGFzdCA9IGVuZCgpOwotICAgIC8v
IHdhc05lZ2F0aXZlOiAtMSBtZWFucyB1bmtub3duLCAwIG1lYW5zIGZhbHNlLCAxIG1lYW5zIHRy
dWUuCi0gICAgaW50IHdhc05lZ2F0aXZlID0gLTE7Ci0gICAgZm9yIChWZWN0b3I8UGF0aFBvaW50
Pjo6Y29uc3RfaXRlcmF0b3IgaSA9IGJlZ2luKCk7IGkgIT0gbGFzdDsgKytpKSB7Ci0gICAgICAg
IGNvbnN0IFBhdGhQb2ludCYgcG9pbnQyID0gKmk7Ci0gICAgICAgIGlmIChwb2ludDEtPngoKSAh
PSBwb2ludC54KCkpIHsKLSAgICAgICAgICAgIGlmIChwb2ludDIueCgpID09IHBvaW50LngoKSkg
ewotICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBnZXR0aW5nIG9uIHRoZSB2ZXJ0aWNhbCBsaW5l
Ci0gICAgICAgICAgICAgICAgd2FzTmVnYXRpdmUgPSBwb2ludDEtPngoKSA8IHBvaW50LngoKSA/
IDEgOiAwOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwb2ludDIueCgpIDwgcG9pbnQueCgpICE9
IHBvaW50MS0+eCgpIDwgcG9pbnQueCgpKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgeSA9IChw
b2ludDIueSgpIC0gcG9pbnQxLT55KCkpIC8gKHBvaW50Mi54KCkgLSBwb2ludDEtPngoKSkgKiAo
cG9pbnQueCgpIC0gcG9pbnQxLT54KCkpICsgcG9pbnQxLT55KCk7Ci0gICAgICAgICAgICAgICAg
aWYgKHkgPj0gcG9pbnQueSgpKQotICAgICAgICAgICAgICAgICAgICArK2ludGVyc2VjdGVkOwot
ICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gV2Ugd2VyZSBv
biB0aGUgdmVydGljYWwgbGluZQotCi0gICAgICAgICAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNl
Ci0gICAgICAgICAgICBpZiAocG9pbnQxLT55KCkgPT0gcG9pbnQueSgpKQotICAgICAgICAgICAg
ICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICBpZiAocG9pbnQxLT55KCkgPiBwb2ludC55
KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAocG9pbnQyLngoKSA9PSBwb2ludC54KCkpIHsKLSAg
ICAgICAgICAgICAgICAgICAgLy8gc2VlIGlmIHRoZSBwb2ludCBpcyBvbiB0aGlzIHNlZ21lbnQK
LSAgICAgICAgICAgICAgICAgICAgaWYgKHBvaW50Mi55KCkgPD0gcG9pbnQueSgpKQotICAgICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8g
V2UgYXJlIHN0aWxsIG9uIHRoZSBsaW5lCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAg
ICAgICAgICAgICAgICAgLy8gV2UgYXJlIGxlYXZpbmcgdGhlIGxpbmUgbm93LgotICAgICAgICAg
ICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGdldCBiYWNrIHRvIHNlZSB3aGljaCBzaWRlIHdlIGNv
bWUgZnJvbS4gSWYgd2UgY29tZSBmcm9tCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzYW1l
IHNpZGUgd2UgYXJlIGxlYXZpbmcsIG5vIGludGVyc2VjdGlvbiBzaG91bGQgYmUgY291bnRlZAot
ICAgICAgICAgICAgICAgICAgICBpZiAod2FzTmVnYXRpdmUgPCAwKSB7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBWZWN0b3I8UGF0aFBvaW50Pjo6Y29uc3RfaXRlcmF0b3Igakxhc3QgPSBpOwot
ICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPFBhdGhQb2ludD46OmNvbnN0X2l0ZXJhdG9y
IGogPSBpOwotICAgICAgICAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGlmIChqID09IGJlZ2luKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGogPSBsYXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgLS1qOwotICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGlmIChqLT54KCkgIT0gcG9pbnQueCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGlmIChqLT54KCkgPiBwb2ludC54KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB3YXNOZWdhdGl2ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhc05lZ2F0aXZlID0g
MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoaiAhPSBq
TGFzdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3YXNOZWdhdGl2ZSA8IDApCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3YXNOZWdhdGl2ZSA/IHBvaW50Mi54KCkg
PiBwb2ludC54KCkgOiBwb2ludDIueCgpIDwgcG9pbnQueCgpKQotICAgICAgICAgICAgICAgICAg
ICAgICAgKytpbnRlcnNlY3RlZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVs
c2UgaWYgKHBvaW50Mi54KCkgPT0gcG9pbnQueCgpICYmIHBvaW50Mi55KCkgPj0gcG9pbnQueSgp
KQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHBvaW50
MSA9ICZwb2ludDI7Ci0gICAgfQotCi0gICAgcmV0dXJuIGludGVyc2VjdGVkICYgMTsKLX0KLQot
dm9pZCBQbGF0Zm9ybVBhdGhFbGVtZW50Ojptb3ZlKGNvbnN0IEZsb2F0U2l6ZSYgb2Zmc2V0KQot
ewotICAgIGludCBuID0gbnVtQ29udHJvbFBvaW50cygpOwotICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgbjsgKytpKQotICAgICAgICBtX2RhdGEubV9wb2ludHNbaV0ubW92ZShvZmZzZXQpOwotfQot
Ci12b2lkIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OnRyYW5zZm9ybShjb25zdCBBZmZpbmVUcmFuc2Zv
cm0mIHQpCi17Ci0gICAgaW50IG4gPSBudW1Db250cm9sUG9pbnRzKCk7Ci0gICAgZm9yIChpbnQg
aSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgRmxvYXRQb2ludCBwID0gdC5tYXBQb2ludCht
X2RhdGEubV9wb2ludHNbaV0pOwotICAgICAgICBtX2RhdGEubV9wb2ludHNbaV0uc2V0KHAueCgp
LCBwLnkoKSk7Ci0gICAgfQotfQotCi12b2lkIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OmluZmxhdGVS
ZWN0VG9Db250YWluTWUoRmxvYXRSZWN0JiByLCBjb25zdCBGbG9hdFBvaW50JiBsYXN0UG9pbnQp
IGNvbnN0Ci17Ci0gICAgaWYgKG1fdHlwZSA9PSBQYXRoQXJjVG8pIHsKLSAgICAgICAgY29uc3Qg
QXJjVG8mIGRhdGEgPSBtX2RhdGEubV9hcmNUb0RhdGE7Ci0gICAgICAgIFBhdGhQb2ludCBzdGFy
dFBvaW50OwotICAgICAgICBzdGFydFBvaW50ID0gbGFzdFBvaW50OwotICAgICAgICBQYXRoUG9p
bnQgZW5kUG9pbnQgPSBkYXRhLm1fZW5kOwotICAgICAgICBpZiAoIWRhdGEubV9jbG9ja3dpc2Up
Ci0gICAgICAgICAgICBzdGQ6OnN3YXAoc3RhcnRQb2ludCwgZW5kUG9pbnQpOwotCi0gICAgICAg
IGludCBxMCA9IHF1YWRyYW50KHN0YXJ0UG9pbnQsIGRhdGEubV9jZW50ZXIpOwotICAgICAgICBp
bnQgcTEgPSBxdWFkcmFudChlbmRQb2ludCwgZGF0YS5tX2NlbnRlcik7Ci0gICAgICAgIGJvb2wg
Y29udGFpbnNFeHRyZW1lc1s0XSA9IHsgZmFsc2UgfTsgLy8gYm90dG9tLCBsZWZ0LCB0b3AsIHJp
Z2h0Ci0gICAgICAgIHN0YXRpYyBjb25zdCBQYXRoUG9pbnQgZXh0cmVtZVZlY3RvcnNbNF0gPSB7
IHsgMCwgMSB9LCB7IC0xLCAwIH0sIHsgMCwgLTEgfSwgeyAxLCAwIH0gfTsKLSAgICAgICAgaWYg
KHEwID09IHExKSB7Ci0gICAgICAgICAgICBpZiAoc3RhcnRQb2ludC5tX3ggPT0gZW5kUG9pbnQu
bV94IHx8IGlzUXVhZHJhbnRPbkJvdHRvbShxMCkgIT0gc3RhcnRQb2ludC5tX3ggPiBlbmRQb2lu
dC5tX3gpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkKLSAg
ICAgICAgICAgICAgICAgICAgY29udGFpbnNFeHRyZW1lc1tpXSA9IHRydWU7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgZXh0cmVtZSA9IHEwOwotICAg
ICAgICAgICAgaW50IGRpZmYgPSBxdWFkcmFudERpZmYocTEsIHEwKTsKLSAgICAgICAgICAgIGZv
ciAoaW50IGkgPSAwOyBpIDwgZGlmZjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgY29udGFpbnNF
eHRyZW1lc1tleHRyZW1lXSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZXh0cmVtZSA9IG5leHRR
dWFkcmFudChleHRyZW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlu
ZmxhdGVSZWN0VG9Db250YWluUG9pbnQociwgc3RhcnRQb2ludC5tX3gsIHN0YXJ0UG9pbnQubV95
KTsKLSAgICAgICAgaW5mbGF0ZVJlY3RUb0NvbnRhaW5Qb2ludChyLCBlbmRQb2ludC5tX3gsIGVu
ZFBvaW50Lm1feSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7Ci0gICAg
ICAgICAgICBpZiAoY29udGFpbnNFeHRyZW1lc1tpXSkKLSAgICAgICAgICAgICAgICBpbmZsYXRl
UmVjdFRvQ29udGFpblBvaW50KHIsIGRhdGEubV9jZW50ZXIubV94ICsgZGF0YS5tX3JhZGl1cy5t
X3ggKiBleHRyZW1lVmVjdG9yc1tpXS5tX3gsIGRhdGEubV9jZW50ZXIubV95ICsgZGF0YS5tX3Jh
ZGl1cy5tX3kgKiBleHRyZW1lVmVjdG9yc1tpXS5tX3kpOwotICAgICAgICB9Ci0gICAgfSBlbHNl
IHsKLSAgICAgICAgaW50IG4gPSBudW1Qb2ludHMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7
IGkgPCBuOyArK2kpCi0gICAgICAgICAgICBpbmZsYXRlUmVjdFRvQ29udGFpblBvaW50KHIsIG1f
ZGF0YS5tX3BvaW50c1tpXS5tX3gsIG1fZGF0YS5tX3BvaW50c1tpXS5tX3kpOwotICAgIH0KLX0K
LQotUGF0aEVsZW1lbnRUeXBlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OnR5cGUoKSBjb25zdAotewot
ICAgIHN3aXRjaCAobV90eXBlKSB7Ci0gICAgY2FzZSBQYXRoTW92ZVRvOgotICAgICAgICByZXR1
cm4gUGF0aEVsZW1lbnRNb3ZlVG9Qb2ludDsKLSAgICBjYXNlIFBhdGhMaW5lVG86Ci0gICAgICAg
IHJldHVybiBQYXRoRWxlbWVudEFkZExpbmVUb1BvaW50OwotICAgIGNhc2UgUGF0aEFyY1RvOgot
ICAgICAgICAvLyBGSVhNRTogdGhlcmUncyBubyBhcmNUbyB0eXBlIGZvciBQYXRoRWxlbWVudAot
ICAgICAgICByZXR1cm4gUGF0aEVsZW1lbnRBZGRMaW5lVG9Qb2ludDsKLSAgICAgICAgLy8gcmV0
dXJuIFBhdGhFbGVtZW50QWRkUXVhZEN1cnZlVG9Qb2ludDsKLSAgICBjYXNlIFBhdGhRdWFkQ3Vy
dmVUbzoKLSAgICAgICAgcmV0dXJuIFBhdGhFbGVtZW50QWRkUXVhZEN1cnZlVG9Qb2ludDsKLSAg
ICBjYXNlIFBhdGhCZXppZXJDdXJ2ZVRvOgotICAgICAgICByZXR1cm4gUGF0aEVsZW1lbnRBZGRD
dXJ2ZVRvUG9pbnQ7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQVNTRVJUKG1fdHlwZSA9PSBQYXRo
Q2xvc2VTdWJwYXRoKTsKLSAgICAgICAgcmV0dXJuIFBhdGhFbGVtZW50Q2xvc2VTdWJwYXRoOwot
ICAgIH0KLX0KLQotUGxhdGZvcm1QYXRoOjpQbGF0Zm9ybVBhdGgoKQotICAgIDogbV9wZW5MaWZ0
ZWQodHJ1ZSkKLXsKLSAgICBtX2N1cnJlbnRQb2ludC5jbGVhcigpOwotfQotCi12b2lkIFBsYXRm
b3JtUGF0aDo6ZW5zdXJlU3VicGF0aCgpCi17Ci0gICAgaWYgKG1fcGVuTGlmdGVkKSB7Ci0gICAg
ICAgIG1fcGVuTGlmdGVkID0gZmFsc2U7Ci0gICAgICAgIG1fc3VicGF0aHMuYXBwZW5kKFBhdGhQ
b2x5Z29uKCkpOwotICAgICAgICBtX3N1YnBhdGhzLmxhc3QoKS5hcHBlbmQobV9jdXJyZW50UG9p
bnQpOwotICAgIH0gZWxzZQotICAgICAgICBBU1NFUlQoIW1fc3VicGF0aHMuaXNFbXB0eSgpKTsK
LX0KLQotdm9pZCBQbGF0Zm9ybVBhdGg6OmFkZFRvU3VicGF0aChjb25zdCBQbGF0Zm9ybVBhdGhF
bGVtZW50JiBlKQotewotICAgIGlmIChlLnBsYXRmb3JtVHlwZSgpID09IFBsYXRmb3JtUGF0aEVs
ZW1lbnQ6OlBhdGhNb3ZlVG8pIHsKLSAgICAgICAgbV9wZW5MaWZ0ZWQgPSB0cnVlOwotICAgICAg
ICBtX2N1cnJlbnRQb2ludCA9IGUucG9pbnRBdCgwKTsKLSAgICB9IGVsc2UgaWYgKGUucGxhdGZv
cm1UeXBlKCkgPT0gUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aENsb3NlU3VicGF0aCkgewotICAg
ICAgICBtX3BlbkxpZnRlZCA9IHRydWU7Ci0gICAgICAgIGlmICghbV9zdWJwYXRocy5pc0VtcHR5
KCkpIHsKLSAgICAgICAgICAgIGlmIChtX2N1cnJlbnRQb2ludCAhPSBtX3N1YnBhdGhzLmxhc3Qo
KVswXSkgewotICAgICAgICAgICAgICAgIC8vIEFjY29yZGluZyB0byBXM0MsIHdlIGhhdmUgdG8g
ZHJhdyBhIGxpbmUgZnJvbSBjdXJyZW50IHBvaW50IHRvIHRoZSBpbml0aWFsIHBvaW50Ci0gICAg
ICAgICAgICAgICAgbV9zdWJwYXRocy5sYXN0KCkuYXBwZW5kKG1fc3VicGF0aHMubGFzdCgpWzBd
KTsKLSAgICAgICAgICAgICAgICBtX2N1cnJlbnRQb2ludCA9IG1fc3VicGF0aHMubGFzdCgpWzBd
OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG1fY3VycmVudFBv
aW50LmNsZWFyKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZW5zdXJlU3VicGF0aCgpOwotICAg
ICAgICBzd2l0Y2ggKGUucGxhdGZvcm1UeXBlKCkpIHsKLSAgICAgICAgY2FzZSBQbGF0Zm9ybVBh
dGhFbGVtZW50OjpQYXRoTGluZVRvOgotICAgICAgICAgICAgbV9zdWJwYXRocy5sYXN0KCkuYXBw
ZW5kKGUucG9pbnRBdCgwKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQbGF0
Zm9ybVBhdGhFbGVtZW50OjpQYXRoQXJjVG86Ci0gICAgICAgICAgICBhZGRBcmNQb2ludHMobV9z
dWJwYXRocy5sYXN0KCksIGUuYXJjVG8oKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAg
Y2FzZSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoUXVhZEN1cnZlVG86Ci0gICAgICAgICAgICB7
Ci0gICAgICAgICAgICAgICAgUGF0aFBvaW50IGNvbnRyb2xbXSA9IHsKLSAgICAgICAgICAgICAg
ICAgICAgbV9jdXJyZW50UG9pbnQsCi0gICAgICAgICAgICAgICAgICAgIGUucG9pbnRBdCgwKSwK
LSAgICAgICAgICAgICAgICAgICAgZS5wb2ludEF0KDEpLAotICAgICAgICAgICAgICAgIH07Ci0g
ICAgICAgICAgICAgICAgLy8gRklYTUU6IG1hZ2ljIG51bWJlcj8KLSAgICAgICAgICAgICAgICBx
dWFkQ3VydmUoNTAsIG1fc3VicGF0aHMubGFzdCgpLCBjb250cm9sKTsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBh
dGhCZXppZXJDdXJ2ZVRvOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBhdGhQb2lu
dCBjb250cm9sW10gPSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fY3VycmVudFBvaW50LAotICAg
ICAgICAgICAgICAgICAgICBlLnBvaW50QXQoMCksCi0gICAgICAgICAgICAgICAgICAgIGUucG9p
bnRBdCgxKSwKLSAgICAgICAgICAgICAgICAgICAgZS5wb2ludEF0KDIpLAotICAgICAgICAgICAg
ICAgIH07Ci0gICAgICAgICAgICAgICAgLy8gRklYTUU6IG1hZ2ljIG51bWJlcj8KLSAgICAgICAg
ICAgICAgICBiZXppZXIoMTAwLCBtX3N1YnBhdGhzLmxhc3QoKSwgY29udHJvbCk7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAg
ICAgICAgbV9jdXJyZW50UG9pbnQgPSBtX3N1YnBhdGhzLmxhc3QoKS5sYXN0KCk7Ci0gICAgfQot
fQotCi12b2lkIFBsYXRmb3JtUGF0aDo6YXBwZW5kKGNvbnN0IFBsYXRmb3JtUGF0aEVsZW1lbnQm
IGUpCi17Ci0gICAgZS5pbmZsYXRlUmVjdFRvQ29udGFpbk1lKG1fYm91bmRpbmdSZWN0LCBsYXN0
UG9pbnQoKSk7Ci0gICAgYWRkVG9TdWJwYXRoKGUpOwotICAgIG1fZWxlbWVudHMuYXBwZW5kKGUp
OwotfQotCi12b2lkIFBsYXRmb3JtUGF0aDo6YXBwZW5kKGNvbnN0IFBsYXRmb3JtUGF0aCYgcCkK
LXsKLSAgICBjb25zdCBQbGF0Zm9ybVBhdGhFbGVtZW50cyYgZSA9IHAuZWxlbWVudHMoKTsKLSAg
ICBmb3IgKFBsYXRmb3JtUGF0aEVsZW1lbnRzOjpjb25zdF9pdGVyYXRvciBpdChlLmJlZ2luKCkp
OyBpdCAhPSBlLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIGFkZFRvU3VicGF0aCgqaXQpOwotICAg
ICAgICBpdC0+aW5mbGF0ZVJlY3RUb0NvbnRhaW5NZShtX2JvdW5kaW5nUmVjdCwgbGFzdFBvaW50
KCkpOwotICAgICAgICBtX2VsZW1lbnRzLmFwcGVuZCgqaXQpOwotICAgIH0KLX0KLQotdm9pZCBQ
bGF0Zm9ybVBhdGg6OmNsZWFyKCkKLXsKLSAgICBtX2VsZW1lbnRzLmNsZWFyKCk7Ci0gICAgbV9i
b3VuZGluZ1JlY3QgPSBGbG9hdFJlY3QoKTsKLSAgICBtX3N1YnBhdGhzLmNsZWFyKCk7Ci0gICAg
bV9jdXJyZW50UG9pbnQuY2xlYXIoKTsKLSAgICBtX3BlbkxpZnRlZCA9IHRydWU7Ci19Ci0KLXZv
aWQgUGxhdGZvcm1QYXRoOjpzdHJva2VQYXRoKEhEQyBkYywgY29uc3QgQWZmaW5lVHJhbnNmb3Jt
KiB0cmFuc2Zvcm1hdGlvbikgY29uc3QKLXsKLSAgICBkcmF3UG9seWdvbnMoZGMsIG1fc3VicGF0
aHMsIGZhbHNlLCB0cmFuc2Zvcm1hdGlvbik7Ci19Ci0KLXZvaWQgUGxhdGZvcm1QYXRoOjpmaWxs
UGF0aChIREMgZGMsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSogdHJhbnNmb3JtYXRpb24pIGNvbnN0
Ci17Ci0gICAgSEdESU9CSiBvbGRQZW4gPSBTZWxlY3RPYmplY3QoZGMsIEdldFN0b2NrT2JqZWN0
KE5VTExfUEVOKSk7Ci0gICAgZHJhd1BvbHlnb25zKGRjLCBtX3N1YnBhdGhzLCB0cnVlLCB0cmFu
c2Zvcm1hdGlvbik7Ci0gICAgU2VsZWN0T2JqZWN0KGRjLCBvbGRQZW4pOwotfQotCi12b2lkIFBs
YXRmb3JtUGF0aDo6dHJhbnNsYXRlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKLXsKLSAgICBmb3Ig
KFBsYXRmb3JtUGF0aEVsZW1lbnRzOjppdGVyYXRvciBpdChtX2VsZW1lbnRzLmJlZ2luKCkpOyBp
dCAhPSBtX2VsZW1lbnRzLmVuZCgpOyArK2l0KQotICAgICAgICBpdC0+bW92ZShzaXplKTsKLQot
ICAgIG1fYm91bmRpbmdSZWN0Lm1vdmUoc2l6ZSk7Ci0gICAgZm9yIChWZWN0b3I8UGF0aFBvbHln
b24+OjppdGVyYXRvciBpdCA9IG1fc3VicGF0aHMuYmVnaW4oKTsgaXQgIT0gbV9zdWJwYXRocy5l
bmQoKTsgKytpdCkKLSAgICAgICAgaXQtPm1vdmUoc2l6ZSk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1Q
YXRoOjp0cmFuc2Zvcm0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0KQotewotICAgIGZvciAoUGxh
dGZvcm1QYXRoRWxlbWVudHM6Oml0ZXJhdG9yIGl0KG1fZWxlbWVudHMuYmVnaW4oKSk7IGl0ICE9
IG1fZWxlbWVudHMuZW5kKCk7ICsraXQpCi0gICAgICAgIGl0LT50cmFuc2Zvcm0odCk7Ci0KLSAg
ICBtX2JvdW5kaW5nUmVjdCA9IHQubWFwUmVjdChtX2JvdW5kaW5nUmVjdCk7Ci0gICAgZm9yIChW
ZWN0b3I8UGF0aFBvbHlnb24+OjppdGVyYXRvciBpdCA9IG1fc3VicGF0aHMuYmVnaW4oKTsgaXQg
IT0gbV9zdWJwYXRocy5lbmQoKTsgKytpdCkKLSAgICAgICAgaXQtPnRyYW5zZm9ybSh0KTsKLX0K
LQotYm9vbCBQbGF0Zm9ybVBhdGg6OmNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBX
aW5kUnVsZSBydWxlKSBjb25zdAotewotICAgIC8vIG9wdGltaXphdGlvbjogY2hlY2sgdGhlIGJv
dW5kaW5nIHJlY3QgZmlyc3QKLSAgICBpZiAoIWNvbnRhaW5zUG9pbnQobV9ib3VuZGluZ1JlY3Qs
IHBvaW50KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgZm9yIChWZWN0b3I8UGF0aFBv
bHlnb24+Ojpjb25zdF9pdGVyYXRvciBpID0gbV9zdWJwYXRocy5iZWdpbigpOyBpICE9IG1fc3Vi
cGF0aHMuZW5kKCk7ICsraSkgewotICAgICAgICBpZiAoaS0+Y29udGFpbnMocG9pbnQpKQotICAg
ICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12
b2lkIFBsYXRmb3JtUGF0aDo6bW92ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KQotewotICAg
IFBsYXRmb3JtUGF0aEVsZW1lbnQ6Ok1vdmVUbyBkYXRhID0geyB7IHBvaW50LngoKSwgcG9pbnQu
eSgpIH0gfTsKLSAgICBQbGF0Zm9ybVBhdGhFbGVtZW50IHBlKGRhdGEpOwotICAgIGFwcGVuZChw
ZSk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1QYXRoOjphZGRMaW5lVG8oY29uc3QgRmxvYXRQb2ludCYg
cG9pbnQpCi17Ci0gICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6TGluZVRvIGRhdGEgPSB7IHsgcG9p
bnQueCgpLCBwb2ludC55KCkgfSB9OwotICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQgcGUoZGF0YSk7
Ci0gICAgYXBwZW5kKHBlKTsKLX0KLQotdm9pZCBQbGF0Zm9ybVBhdGg6OmFkZFF1YWRDdXJ2ZVRv
KGNvbnN0IEZsb2F0UG9pbnQmIGNwLCBjb25zdCBGbG9hdFBvaW50JiBwKQotewotICAgIFBsYXRm
b3JtUGF0aEVsZW1lbnQ6OlF1YWRDdXJ2ZVRvIGRhdGEgPSB7IHsgY3AueCgpLCBjcC55KCkgfSwg
eyBwLngoKSwgcC55KCkgfSB9OwotICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQgcGUoZGF0YSk7Ci0g
ICAgYXBwZW5kKHBlKTsKLX0KLQotdm9pZCBQbGF0Zm9ybVBhdGg6OmFkZEJlemllckN1cnZlVG8o
Y29uc3QgRmxvYXRQb2ludCYgY3AxLCBjb25zdCBGbG9hdFBvaW50JiBjcDIsIGNvbnN0IEZsb2F0
UG9pbnQmIHApCi17Ci0gICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6QmV6aWVyQ3VydmVUbyBkYXRh
ID0geyB7IGNwMS54KCksIGNwMS55KCkgfSwgeyBjcDIueCgpLCBjcDIueSgpIH0sIHsgcC54KCks
IHAueSgpIH0gfTsKLSAgICBQbGF0Zm9ybVBhdGhFbGVtZW50IHBlKGRhdGEpOwotICAgIGFwcGVu
ZChwZSk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1QYXRoOjphZGRBcmNUbyhjb25zdCBGbG9hdFBvaW50
JiBmcDEsIGNvbnN0IEZsb2F0UG9pbnQmIGZwMiwgZmxvYXQgcmFkaXVzKQotewotICAgIGNvbnN0
IFBhdGhQb2ludCYgcDAgPSBtX2N1cnJlbnRQb2ludDsKLSAgICBQYXRoUG9pbnQgcDE7Ci0gICAg
cDEgPSBmcDE7Ci0gICAgUGF0aFBvaW50IHAyOwotICAgIHAyID0gZnAyOwotICAgIGlmICghcmFk
aXVzIHx8IHAwID09IHAxIHx8IHAxID09IHAyKSB7Ci0gICAgICAgIGFkZExpbmVUbyhwMSk7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBQYXRoVmVjdG9yIHYwMSA9IHAwIC0gcDE7Ci0g
ICAgUGF0aFZlY3RvciB2MjEgPSBwMiAtIHAxOwotCi0gICAgLy8gc2luKEEgLSBCKSA9IHNpbihB
KSAqIGNvcyhCKSAtIHNpbihCKSAqIGNvcyhBKQotICAgIGRvdWJsZSBjcm9zcyA9IHYwMS5tX3gg
KiB2MjEubV95IC0gdjAxLm1feSAqIHYyMS5tX3g7Ci0KLSAgICBpZiAoZmFicyhjcm9zcykgPCAx
RS0xMCkgewotICAgICAgICAvLyBvbiBvbmUgbGluZQotICAgICAgICBhZGRMaW5lVG8ocDEpOwot
ICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZG91YmxlIGQwMSA9IHYwMS5sZW5ndGgoKTsK
LSAgICBkb3VibGUgZDIxID0gdjIxLmxlbmd0aCgpOwotICAgIGRvdWJsZSBhbmdsZSA9IChwaURv
dWJsZSAtIGFicyhhc2luKGNyb3NzIC8gKGQwMSAqIGQyMSkpKSkgKiAwLjU7Ci0gICAgZG91Ymxl
IHNwYW4gPSByYWRpdXMgKiB0YW4oYW5nbGUpOwotICAgIGRvdWJsZSByYXRlID0gc3BhbiAvIGQw
MTsKLSAgICBQYXRoUG9pbnQgc3RhcnRQb2ludDsKLSAgICBzdGFydFBvaW50Lm1feCA9IHAxLm1f
eCArIHYwMS5tX3ggKiByYXRlOwotICAgIHN0YXJ0UG9pbnQubV95ID0gcDEubV95ICsgdjAxLm1f
eSAqIHJhdGU7Ci0KLSAgICBhZGRMaW5lVG8oc3RhcnRQb2ludCk7Ci0KLSAgICBQYXRoUG9pbnQg
ZW5kUG9pbnQ7Ci0gICAgcmF0ZSA9IHNwYW4gLyBkMjE7Ci0gICAgZW5kUG9pbnQubV94ID0gcDEu
bV94ICsgdjIxLm1feCAqIHJhdGU7Ci0gICAgZW5kUG9pbnQubV95ID0gcDEubV95ICsgdjIxLm1f
eSAqIHJhdGU7Ci0KLSAgICBQYXRoUG9pbnQgbWlkUG9pbnQ7Ci0gICAgbWlkUG9pbnQubV94ID0g
KHN0YXJ0UG9pbnQubV94ICsgZW5kUG9pbnQubV94KSAqIDAuNTsKLSAgICBtaWRQb2ludC5tX3kg
PSAoc3RhcnRQb2ludC5tX3kgKyBlbmRQb2ludC5tX3kpICogMC41OwotCi0gICAgUGF0aFZlY3Rv
ciB2bTEgPSBtaWRQb2ludCAtIHAxOwotICAgIGRvdWJsZSBkbTEgPSB2bTEubGVuZ3RoKCk7Ci0g
ICAgZG91YmxlIGQgPSBfaHlwb3QocmFkaXVzLCBzcGFuKTsKLQotICAgIFBhdGhQb2ludCBjZW50
ZXJQb2ludDsKLSAgICByYXRlID0gZCAvIGRtMTsKLSAgICBjZW50ZXJQb2ludC5tX3ggPSBwMS5t
X3ggKyB2bTEubV94ICogcmF0ZTsKLSAgICBjZW50ZXJQb2ludC5tX3kgPSBwMS5tX3kgKyB2bTEu
bV95ICogcmF0ZTsKLQotICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OkFyY1RvIGRhdGEgPSB7Ci0g
ICAgICAgIGVuZFBvaW50LAotICAgICAgICBjZW50ZXJQb2ludCwKLSAgICAgICAgeyByYWRpdXMs
IHJhZGl1cyB9LAotICAgICAgICBjcm9zcyA8IDAKLSAgICB9OwotICAgIFBsYXRmb3JtUGF0aEVs
ZW1lbnQgcGUoZGF0YSk7Ci0gICAgYXBwZW5kKHBlKTsKLX0KLQotdm9pZCBQbGF0Zm9ybVBhdGg6
OmNsb3NlU3VicGF0aCgpCi17Ci0gICAgUGxhdGZvcm1QYXRoRWxlbWVudCBwZTsKLSAgICBhcHBl
bmQocGUpOwotfQotCi0vLyBhZGQgYSBjaXJjdWxhciBhcmMgY2VudHJlZCBhdCBwIHdpdGggcmFk
aXVzIHIgZnJvbSBzdGFydCBhbmdsZSBzYXIgKHJhZGlhbnMpIHRvIGVuZCBhbmdsZSBlYXIKLXZv
aWQgUGxhdGZvcm1QYXRoOjphZGRFbGxpcHNlKGNvbnN0IEZsb2F0UG9pbnQmIHAsIGZsb2F0IGEs
IGZsb2F0IGIsIGZsb2F0IHNhciwgZmxvYXQgZWFyLCBib29sIGFudGljbG9ja3dpc2UpCi17Ci0g
ICAgZmxvYXQgc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFk7Ci0KLSAgICBub3JtYWxpemVBbmds
ZShzYXIpOwotICAgIG5vcm1hbGl6ZUFuZ2xlKGVhcik7Ci0KLSAgICBnZXRFbGxpcHNlUG9pbnRC
eUFuZ2xlKHNhciwgYSwgYiwgc3RhcnRYLCBzdGFydFkpOwotICAgIGdldEVsbGlwc2VQb2ludEJ5
QW5nbGUoZWFyLCBhLCBiLCBlbmRYLCBlbmRZKTsKLQotICAgIHRyYW5zZm9ybUFyY1BvaW50KHN0
YXJ0WCwgc3RhcnRZLCBwKTsKLSAgICB0cmFuc2Zvcm1BcmNQb2ludChlbmRYLCBlbmRZLCBwKTsK
LQotICAgIEZsb2F0UG9pbnQgc3RhcnQoc3RhcnRYLCBzdGFydFkpOwotICAgIG1vdmVUbyhzdGFy
dCk7Ci0KLSAgICBQbGF0Zm9ybVBhdGhFbGVtZW50OjpBcmNUbyBkYXRhID0geyB7IGVuZFgsIGVu
ZFkgfSwgeyBwLngoKSwgcC55KCkgfSwgIHsgYSwgYiB9LCAhYW50aWNsb2Nrd2lzZSB9OwotICAg
IFBsYXRmb3JtUGF0aEVsZW1lbnQgcGUoZGF0YSk7Ci0gICAgYXBwZW5kKHBlKTsKLX0KLQotCi12
b2lkIFBsYXRmb3JtUGF0aDo6YWRkUmVjdChjb25zdCBGbG9hdFJlY3QmIHIpCi17Ci0gICAgbW92
ZVRvKHIubG9jYXRpb24oKSk7Ci0KLSAgICBmbG9hdCByaWdodCA9IHIucmlnaHQoKSAtIDE7Ci0g
ICAgZmxvYXQgYm90dG9tID0gci5ib3R0b20oKSAtIDE7Ci0gICAgYWRkTGluZVRvKEZsb2F0UG9p
bnQocmlnaHQsIHIueSgpKSk7Ci0gICAgYWRkTGluZVRvKEZsb2F0UG9pbnQocmlnaHQsIGJvdHRv
bSkpOwotICAgIGFkZExpbmVUbyhGbG9hdFBvaW50KHIueCgpLCBib3R0b20pKTsKLSAgICBhZGRM
aW5lVG8oci5sb2NhdGlvbigpKTsKLX0KLQotdm9pZCBQbGF0Zm9ybVBhdGg6OmFkZEVsbGlwc2Uo
Y29uc3QgRmxvYXRSZWN0JiByKQotewotICAgIEZsb2F0U2l6ZSByYWRpdXMoci53aWR0aCgpICog
MC41LCByLmhlaWdodCgpICogMC41KTsKLSAgICBhZGRFbGxpcHNlKHIubG9jYXRpb24oKSArIHJh
ZGl1cywgcmFkaXVzLndpZHRoKCksIHJhZGl1cy5oZWlnaHQoKSwgMCwgMCwgdHJ1ZSk7Ci19Ci0K
LVN0cmluZyBQbGF0Zm9ybVBhdGg6OmRlYnVnU3RyaW5nKCkgY29uc3QKLXsKLSAgICBTdHJpbmcg
cmV0OwotICAgIGZvciAoUGxhdGZvcm1QYXRoRWxlbWVudHM6OmNvbnN0X2l0ZXJhdG9yIGkobV9l
bGVtZW50cy5iZWdpbigpKTsgaSAhPSBtX2VsZW1lbnRzLmVuZCgpOyArK2kpIHsKLSAgICAgICAg
c3dpdGNoIChpLT5wbGF0Zm9ybVR5cGUoKSkgewotICAgICAgICBjYXNlIFBsYXRmb3JtUGF0aEVs
ZW1lbnQ6OlBhdGhNb3ZlVG86Ci0gICAgICAgIGNhc2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0
aExpbmVUbzoKLSAgICAgICAgICAgIHJldCArPSBTdHJpbmc6OmZvcm1hdCgiTSAlZiAlZlxuIiwg
aS0+cG9pbnRBdCgwKS5tX3gsIGktPnBvaW50QXQoMCkubV95KTsKLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICBjYXNlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhBcmNUbzoKLSAgICAgICAg
ICAgIHJldCArPSBTdHJpbmc6OmZvcm1hdCgiQSAlZiAlZiAlZiAlZiAlZiAlZiAlY1xuIgotICAg
ICAgICAgICAgICAgICwgaS0+YXJjVG8oKS5tX2VuZC5tX3gsIGktPmFyY1RvKCkubV9lbmQubV95
Ci0gICAgICAgICAgICAgICAgLCBpLT5hcmNUbygpLm1fY2VudGVyLm1feCwgaS0+YXJjVG8oKS5t
X2NlbnRlci5tX3kKLSAgICAgICAgICAgICAgICAsIGktPmFyY1RvKCkubV9yYWRpdXMubV94LCBp
LT5hcmNUbygpLm1fcmFkaXVzLm1feQotICAgICAgICAgICAgICAgICwgaS0+YXJjVG8oKS5tX2Ns
b2Nrd2lzZT8gJ1knIDogJ04nKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBs
YXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhRdWFkQ3VydmVUbzoKLSAgICAgICAgICAgIHJldCArPSBT
dHJpbmc6OmZvcm1hdCgiUSAlZiAlZiAlZiAlZlxuIgotICAgICAgICAgICAgICAgICwgaS0+cG9p
bnRBdCgwKS5tX3gsIGktPnBvaW50QXQoMCkubV95Ci0gICAgICAgICAgICAgICAgLCBpLT5wb2lu
dEF0KDEpLm1feCwgaS0+cG9pbnRBdCgxKS5tX3kpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIGNhc2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aEJlemllckN1cnZlVG86Ci0gICAgICAg
ICAgICByZXQgKz0gU3RyaW5nOjpmb3JtYXQoIkIgJWYgJWYgJWYgJWYgJWYgJWZcbiIKLSAgICAg
ICAgICAgICAgICAsIGktPnBvaW50QXQoMCkubV94LCBpLT5wb2ludEF0KDApLm1feQotICAgICAg
ICAgICAgICAgICwgaS0+cG9pbnRBdCgxKS5tX3gsIGktPnBvaW50QXQoMSkubV95Ci0gICAgICAg
ICAgICAgICAgLCBpLT5wb2ludEF0KDIpLm1feCwgaS0+cG9pbnRBdCgyKS5tX3kpOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBU1NFUlQoaS0+cGxh
dGZvcm1UeXBlKCkgPT0gUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aENsb3NlU3VicGF0aCk7Ci0g
ICAgICAgICAgICByZXQgKz0gIlNcbiI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQot
ICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgUGxhdGZvcm1QYXRoOjphcHBseSh2
b2lkKiBpbmZvLCBQYXRoQXBwbGllckZ1bmN0aW9uIGZ1bmN0aW9uKSBjb25zdAotewotICAgIFBh
dGhFbGVtZW50IHBlbGVtZW50OwotICAgIEZsb2F0UG9pbnQgcG9pbnRzWzNdOwotICAgIHBlbGVt
ZW50LnBvaW50cyA9IHBvaW50czsKLQotICAgIGZvciAoUGxhdGZvcm1QYXRoRWxlbWVudHM6OmNv
bnN0X2l0ZXJhdG9yIGl0KG1fZWxlbWVudHMuYmVnaW4oKSk7IGl0ICE9IG1fZWxlbWVudHMuZW5k
KCk7ICsraXQpIHsKLSAgICAgICAgcGVsZW1lbnQudHlwZSA9IGl0LT50eXBlKCk7Ci0gICAgICAg
IGludCBuID0gaXQtPm51bVBvaW50cygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47
ICsraSkKLSAgICAgICAgICAgIHBvaW50c1tpXSA9IGl0LT5wb2ludEF0KGkpOwotICAgICAgICBm
dW5jdGlvbihpbmZvLCAmcGVsZW1lbnQpOwotICAgIH0KLX0KLQotfSAvLyBuYW1lc3BhY2UgV2Vi
Y29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QbGF0Zm9ybVBhdGhX
aW5jZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGxh
dGZvcm1QYXRoV2luY2UuaAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbmNlL1BsYXRmb3JtUGF0aFdpbmNlLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsMTgz
ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJ
bmMuCi0gKgotICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IKLSAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogIHZlcnNpb24gMiBvZiB0aGUg
TGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAg
VGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt
cGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0g
KiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElm
IG5vdCwgd3JpdGUgdG8KLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1
MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICogIEJvc3RvbiwgTUEgMDIxMTAtMTMw
MSwgVVNBLgotICovCi0KLSNpZm5kZWYgUGxhdGZvcm1QYXRoV2luY2VfaAotI2RlZmluZSBQbGF0
Zm9ybVBhdGhXaW5jZV9oCi0KLSNpbmNsdWRlICJGbG9hdFBvaW50LmgiCi0jaW5jbHVkZSAiRmxv
YXRSZWN0LmgiCi0jaW5jbHVkZSAiUGF0aC5oIgotI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KLQot
bmFtZXNwYWNlIFdlYkNvcmUgewotCi0gICAgY2xhc3MgR3JhcGhpY3NDb250ZXh0OwotCi0gICAg
c3RydWN0IFBhdGhQb2ludCB7Ci0gICAgICAgIGZsb2F0IG1feDsKLSAgICAgICAgZmxvYXQgbV95
OwotICAgICAgICBjb25zdCBmbG9hdCYgeCgpIGNvbnN0IHsgcmV0dXJuIG1feDsgfQotICAgICAg
ICBjb25zdCBmbG9hdCYgeSgpIGNvbnN0IHsgcmV0dXJuIG1feTsgfQotICAgICAgICB2b2lkIHNl
dChmbG9hdCB4LCBmbG9hdCB5KQotICAgICAgICB7Ci0gICAgICAgICAgICBtX3ggPSB4OwotICAg
ICAgICAgICAgbV95ID0geTsKLSAgICAgICAgfTsKLSAgICAgICAgb3BlcmF0b3IgRmxvYXRQb2lu
dCgpIGNvbnN0IHsgcmV0dXJuIEZsb2F0UG9pbnQobV94LCBtX3kpOyB9Ci0gICAgICAgIHZvaWQg
bW92ZShjb25zdCBGbG9hdFNpemUmIG9mZnNldCkKLSAgICAgICAgewotICAgICAgICAgICAgbV94
ICs9IG9mZnNldC53aWR0aCgpOwotICAgICAgICAgICAgbV95ICs9IG9mZnNldC5oZWlnaHQoKTsK
LSAgICAgICAgfQotICAgICAgICBQYXRoUG9pbnQmIG9wZXJhdG9yPShjb25zdCBGbG9hdFBvaW50
JiBwKQotICAgICAgICB7Ci0gICAgICAgICAgICBtX3ggPSBwLngoKTsKLSAgICAgICAgICAgIG1f
eSA9IHAueSgpOwotICAgICAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgICB9Ci0gICAgICAg
IHZvaWQgY2xlYXIoKSB7IG1feCA9IG1feSA9IDA7IH0KLSAgICB9OwotCi0gICAgc3RydWN0IFBh
dGhQb2x5Z29uOiBwdWJsaWMgVmVjdG9yPFBhdGhQb2ludD4gewotICAgICAgICB2b2lkIG1vdmUo
Y29uc3QgRmxvYXRTaXplJiBvZmZzZXQpOwotICAgICAgICB2b2lkIHRyYW5zZm9ybShjb25zdCBB
ZmZpbmVUcmFuc2Zvcm0mIHQpOwotICAgICAgICBib29sIGNvbnRhaW5zKGNvbnN0IEZsb2F0UG9p
bnQmIHBvaW50KSBjb25zdDsKLSAgICB9OwotCi0gICAgY2xhc3MgUGxhdGZvcm1QYXRoRWxlbWVu
dCB7Ci0gICAgcHVibGljOgotICAgICAgICBlbnVtIFBsYWZvcm1QYXRoRWxlbWVudFR5cGUgewot
ICAgICAgICAgICAgUGF0aE1vdmVUbywKLSAgICAgICAgICAgIFBhdGhMaW5lVG8sCi0gICAgICAg
ICAgICBQYXRoQXJjVG8sCi0gICAgICAgICAgICBQYXRoUXVhZEN1cnZlVG8sCi0gICAgICAgICAg
ICBQYXRoQmV6aWVyQ3VydmVUbywKLSAgICAgICAgICAgIFBhdGhDbG9zZVN1YnBhdGgsCi0gICAg
ICAgIH07Ci0KLSAgICAgICAgc3RydWN0IE1vdmVUbyB7Ci0gICAgICAgICAgICBQYXRoUG9pbnQg
bV9lbmQ7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgc3RydWN0IExpbmVUbyB7Ci0gICAgICAgICAg
ICBQYXRoUG9pbnQgbV9lbmQ7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgc3RydWN0IEFyY1RvIHsK
LSAgICAgICAgICAgIFBhdGhQb2ludCBtX2VuZDsKLSAgICAgICAgICAgIFBhdGhQb2ludCBtX2Nl
bnRlcjsKLSAgICAgICAgICAgIFBhdGhQb2ludCBtX3JhZGl1czsKLSAgICAgICAgICAgIGJvb2wg
bV9jbG9ja3dpc2U7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgc3RydWN0IFF1YWRDdXJ2ZVRvIHsK
LSAgICAgICAgICAgIFBhdGhQb2ludCBtX3BvaW50MDsKLSAgICAgICAgICAgIFBhdGhQb2ludCBt
X3BvaW50MTsKLSAgICAgICAgfTsKLQotICAgICAgICBzdHJ1Y3QgQmV6aWVyQ3VydmVUbyB7Ci0g
ICAgICAgICAgICBQYXRoUG9pbnQgbV9wb2ludDA7Ci0gICAgICAgICAgICBQYXRoUG9pbnQgbV9w
b2ludDE7Ci0gICAgICAgICAgICBQYXRoUG9pbnQgbV9wb2ludDI7Ci0gICAgICAgIH07Ci0KLSAg
ICAgICAgUGxhdGZvcm1QYXRoRWxlbWVudCgpOiBtX3R5cGUoUGF0aENsb3NlU3VicGF0aCkgeyBt
X2RhdGEubV9wb2ludHNbMF0uc2V0KDAsIDApOyAgICB9Ci0gICAgICAgIFBsYXRmb3JtUGF0aEVs
ZW1lbnQoY29uc3QgTW92ZVRvJiBkYXRhKTogbV90eXBlKFBhdGhNb3ZlVG8pIHsgbV9kYXRhLm1f
bW92ZVRvRGF0YSA9IGRhdGE7IH0KLSAgICAgICAgUGxhdGZvcm1QYXRoRWxlbWVudChjb25zdCBM
aW5lVG8mIGRhdGEpOiBtX3R5cGUoUGF0aExpbmVUbykgeyBtX2RhdGEubV9saW5lVG9EYXRhID0g
ZGF0YTsgfQotICAgICAgICBQbGF0Zm9ybVBhdGhFbGVtZW50KGNvbnN0IEFyY1RvJiBkYXRhKTog
bV90eXBlKFBhdGhBcmNUbykgeyBtX2RhdGEubV9hcmNUb0RhdGEgPSBkYXRhOyB9Ci0gICAgICAg
IFBsYXRmb3JtUGF0aEVsZW1lbnQoY29uc3QgUXVhZEN1cnZlVG8mIGRhdGEpOiBtX3R5cGUoUGF0
aFF1YWRDdXJ2ZVRvKSB7IG1fZGF0YS5tX3F1YWRDdXJ2ZVRvRGF0YSA9IGRhdGE7IH0KLSAgICAg
ICAgUGxhdGZvcm1QYXRoRWxlbWVudChjb25zdCBCZXppZXJDdXJ2ZVRvJiBkYXRhKTogbV90eXBl
KFBhdGhCZXppZXJDdXJ2ZVRvKSB7IG1fZGF0YS5tX2JlemllckN1cnZlVG9EYXRhID0gZGF0YTsg
fQotCi0gICAgICAgIGNvbnN0IE1vdmVUbyYgbW92ZVRvKCkgY29uc3QgeyByZXR1cm4gbV9kYXRh
Lm1fbW92ZVRvRGF0YTsgfQotICAgICAgICBjb25zdCBMaW5lVG8mIGxpbmVUbygpIGNvbnN0IHsg
cmV0dXJuIG1fZGF0YS5tX2xpbmVUb0RhdGE7IH0KLSAgICAgICAgY29uc3QgQXJjVG8mIGFyY1Rv
KCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLm1fYXJjVG9EYXRhOyB9Ci0gICAgICAgIGNvbnN0IFF1
YWRDdXJ2ZVRvJiBxdWFkQ3VydmVUbygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5tX3F1YWRDdXJ2
ZVRvRGF0YTsgfQotICAgICAgICBjb25zdCBCZXppZXJDdXJ2ZVRvJiBiZXppZXJDdXJ2ZVRvKCkg
Y29uc3QgeyByZXR1cm4gbV9kYXRhLm1fYmV6aWVyQ3VydmVUb0RhdGE7IH0KLSAgICAgICAgY29u
c3QgUGF0aFBvaW50JiBsYXN0UG9pbnQoKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICBp
bnQgbiA9IG51bVBvaW50cygpOwotICAgICAgICAgICAgcmV0dXJuIG4gPiAxID8gbV9kYXRhLm1f
cG9pbnRzW24gLSAxXSA6IG1fZGF0YS5tX3BvaW50c1swXTsKLSAgICAgICAgfQotICAgICAgICBj
b25zdCBQYXRoUG9pbnQmIHBvaW50QXQoaW50IGluZGV4KSBjb25zdCB7IHJldHVybiBtX2RhdGEu
bV9wb2ludHNbaW5kZXhdOyB9Ci0gICAgICAgIGludCBudW1Qb2ludHMoKSBjb25zdDsKLSAgICAg
ICAgaW50IG51bUNvbnRyb2xQb2ludHMoKSBjb25zdDsKLSAgICAgICAgdm9pZCBtb3ZlKGNvbnN0
IEZsb2F0U2l6ZSYgb2Zmc2V0KTsKLSAgICAgICAgdm9pZCB0cmFuc2Zvcm0oY29uc3QgQWZmaW5l
VHJhbnNmb3JtJiB0KTsKLSAgICAgICAgUGF0aEVsZW1lbnRUeXBlIHR5cGUoKSBjb25zdDsKLSAg
ICAgICAgUGxhZm9ybVBhdGhFbGVtZW50VHlwZSBwbGF0Zm9ybVR5cGUoKSBjb25zdCB7IHJldHVy
biBtX3R5cGU7IH0KLSAgICAgICAgdm9pZCBpbmZsYXRlUmVjdFRvQ29udGFpbk1lKEZsb2F0UmVj
dCYgciwgY29uc3QgRmxvYXRQb2ludCYgbGFzdFBvaW50KSBjb25zdDsKLQotICAgIHByaXZhdGU6
Ci0gICAgICAgIFBsYWZvcm1QYXRoRWxlbWVudFR5cGUgbV90eXBlOwotICAgICAgICB1bmlvbiB7
Ci0gICAgICAgICAgICBNb3ZlVG8gbV9tb3ZlVG9EYXRhOwotICAgICAgICAgICAgTGluZVRvIG1f
bGluZVRvRGF0YTsKLSAgICAgICAgICAgIEFyY1RvIG1fYXJjVG9EYXRhOwotICAgICAgICAgICAg
UXVhZEN1cnZlVG8gbV9xdWFkQ3VydmVUb0RhdGE7Ci0gICAgICAgICAgICBCZXppZXJDdXJ2ZVRv
IG1fYmV6aWVyQ3VydmVUb0RhdGE7Ci0gICAgICAgICAgICBQYXRoUG9pbnQgbV9wb2ludHNbNF07
Ci0gICAgICAgIH0gbV9kYXRhOwotICAgIH07Ci0KLSAgICB0eXBlZGVmIFZlY3RvcjxQbGF0Zm9y
bVBhdGhFbGVtZW50PiBQbGF0Zm9ybVBhdGhFbGVtZW50czsKLQotICAgIGNsYXNzIFBsYXRmb3Jt
UGF0aCB7Ci0gICAgcHVibGljOgotICAgICAgICBQbGF0Zm9ybVBhdGgoKTsKLSAgICAgICAgY29u
c3QgUGxhdGZvcm1QYXRoRWxlbWVudHMmIGVsZW1lbnRzKCkgY29uc3QgeyByZXR1cm4gbV9lbGVt
ZW50czsgfQotICAgICAgICB2b2lkIGFwcGVuZChjb25zdCBQbGF0Zm9ybVBhdGhFbGVtZW50JiBl
KTsKLSAgICAgICAgdm9pZCBhcHBlbmQoY29uc3QgUGxhdGZvcm1QYXRoJiBwKTsKLSAgICAgICAg
dm9pZCBjbGVhcigpOwotICAgICAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX2Vs
ZW1lbnRzLmlzRW1wdHkoKTsgfQotCi0gICAgICAgIHZvaWQgc3Ryb2tlUGF0aChIREMsIGNvbnN0
IEFmZmluZVRyYW5zZm9ybSogdHIpIGNvbnN0OwotICAgICAgICB2b2lkIGZpbGxQYXRoKEhEQywg
Y29uc3QgQWZmaW5lVHJhbnNmb3JtKiB0cikgY29uc3Q7Ci0gICAgICAgIEZsb2F0UG9pbnQgbGFz
dFBvaW50KCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50cy5pc0VtcHR5KCkgPyBGbG9hdFBvaW50
KDAsIDApIDogbV9lbGVtZW50cy5sYXN0KCkubGFzdFBvaW50KCk7IH0KLQotICAgICAgICBjb25z
dCBGbG9hdFJlY3QmIGJvdW5kaW5nUmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fYm91bmRpbmdSZWN0
OyB9Ci0gICAgICAgIGJvb2wgY29udGFpbnMoY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIFdpbmRS
dWxlIHJ1bGUpIGNvbnN0OwotICAgICAgICB2b2lkIHRyYW5zbGF0ZShjb25zdCBGbG9hdFNpemUm
IHNpemUpOwotICAgICAgICB2b2lkIHRyYW5zZm9ybShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHQp
OwotCi0gICAgICAgIHZvaWQgbW92ZVRvKGNvbnN0IEZsb2F0UG9pbnQmKTsKLSAgICAgICAgdm9p
ZCBhZGRMaW5lVG8oY29uc3QgRmxvYXRQb2ludCYpOwotICAgICAgICB2b2lkIGFkZFF1YWRDdXJ2
ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIGNvbnRyb2xQb2ludCwgY29uc3QgRmxvYXRQb2ludCYgcG9p
bnQpOwotICAgICAgICB2b2lkIGFkZEJlemllckN1cnZlVG8oY29uc3QgRmxvYXRQb2ludCYgY29u
dHJvbFBvaW50MSwgY29uc3QgRmxvYXRQb2ludCYgY29udHJvbFBvaW50MiwgY29uc3QgRmxvYXRQ
b2ludCYpOwotICAgICAgICB2b2lkIGFkZEFyY1RvKGNvbnN0IEZsb2F0UG9pbnQmLCBjb25zdCBG
bG9hdFBvaW50JiwgZmxvYXQgcmFkaXVzKTsKLSAgICAgICAgdm9pZCBjbG9zZVN1YnBhdGgoKTsK
LSAgICAgICAgdm9pZCBhZGRFbGxpcHNlKGNvbnN0IEZsb2F0UG9pbnQmIHAsIGZsb2F0IGEsIGZs
b2F0IGIsIGZsb2F0IHNhciwgZmxvYXQgZWFyLCBib29sIGFudGljbG9ja3dpc2UpOwotICAgICAg
ICB2b2lkIGFkZFJlY3QoY29uc3QgRmxvYXRSZWN0JiByKTsKLSAgICAgICAgdm9pZCBhZGRFbGxp
cHNlKGNvbnN0IEZsb2F0UmVjdCYgcik7Ci0gICAgICAgIFN0cmluZyBkZWJ1Z1N0cmluZygpIGNv
bnN0OwotICAgICAgICB2b2lkIGFwcGx5KHZvaWQqIGluZm8sIFBhdGhBcHBsaWVyRnVuY3Rpb24g
ZnVuY3Rpb24pIGNvbnN0OwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgdm9pZCBlbnN1cmVTdWJw
YXRoKCk7Ci0gICAgICAgIHZvaWQgYWRkVG9TdWJwYXRoKGNvbnN0IFBsYXRmb3JtUGF0aEVsZW1l
bnQmIGUpOwotCi0gICAgICAgIFBsYXRmb3JtUGF0aEVsZW1lbnRzIG1fZWxlbWVudHM7Ci0gICAg
ICAgIEZsb2F0UmVjdCBtX2JvdW5kaW5nUmVjdDsKLSAgICAgICAgVmVjdG9yPFBhdGhQb2x5Z29u
PiBtX3N1YnBhdGhzOwotICAgICAgICBQYXRoUG9pbnQgbV9jdXJyZW50UG9pbnQ7Ci0gICAgICAg
IGJvb2wgbV9wZW5MaWZ0ZWQ7Ci0gICAgfTsKLQotfQotCi0jZW5kaWYgLy8gUGxhdGZvcm1QYXRo
V2luY2VfaApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaW1wbGVGb250
RGF0YVdpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL1NpbXBsZUZvbnREYXRhV2luQ0UuY3BwCShyZXZpc2lvbiA1NzI4OSkJKGZyb20gV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaW1wbGVGb250RGF0YVdpbmNlLmNwcDo1NzI4OSkK
KysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2ltcGxlRm9udERhdGFXaW5DRS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdo
dCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisg
KiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisg
KiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikg
bm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8g
ZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29m
dHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMg
IkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisg
KiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIlNpbXBsZUZvbnREYXRhLmgiCisKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIK
KyNpbmNsdWRlICJGb250LmgiCisjaW5jbHVkZSAiRm9udENhY2hlLmgiCisjaW5jbHVkZSAiRm9u
dERlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KKyNpbmNsdWRlIDxt
bGFuZy5oPgorI2luY2x1ZGUgPHRjaGFyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworZXh0
ZXJuIEhEQyBnX3NjcmVlbkRDOworCit2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUluaXQo
KQoreworICAgIGlmICghbV9wbGF0Zm9ybURhdGEuaXNWYWxpZCgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBjb25zdCBURVhUTUVUUklDJiB0bSA9IG1fcGxhdGZvcm1EYXRhLm1ldHJpY3MoKTsK
KyAgICBtX2lzU3lzdGVtRm9udCA9IG1fcGxhdGZvcm1EYXRhLmlzU3lzdGVtRm9udCgpOworCisg
ICAgbV9hc2NlbnQgPSAodG0udG1Bc2NlbnQgKiBtX3BsYXRmb3JtRGF0YS5zaXplKCkgKyAzNikg
LyA3MjsKKyAgICBtX2Rlc2NlbnQgPSAodG0udG1EZXNjZW50ICogbV9wbGF0Zm9ybURhdGEuc2l6
ZSgpICsgMzYpIC8gNzI7CisgICAgbV9saW5lR2FwID0gKHRtLnRtRXh0ZXJuYWxMZWFkaW5nICog
bV9wbGF0Zm9ybURhdGEuc2l6ZSgpICsgMzYpIC8gNzI7CisgICAgbV9saW5lU3BhY2luZyA9IG1f
YXNjZW50ICsgbV9kZXNjZW50ICsgbV9saW5lR2FwOworICAgIG1feEhlaWdodCA9IG1fYXNjZW50
ICogMC41NmY7Cit9CisKK3ZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtRGVzdHJveSgpCit7
CisgICAgZGVsZXRlIG1fc21hbGxDYXBzRm9udERhdGE7CisgICAgbV9zbWFsbENhcHNGb250RGF0
YSA9IDA7Cit9CisKK1NpbXBsZUZvbnREYXRhKiBTaW1wbGVGb250RGF0YTo6c21hbGxDYXBzRm9u
dERhdGEoY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIGNvbnN0Cit7Cisg
ICAgaWYgKCFtX3NtYWxsQ2Fwc0ZvbnREYXRhKSB7CisgICAgICAgIEZvbnREZXNjcmlwdGlvbiBm
b250RGVzYyhmb250RGVzY3JpcHRpb24pOworICAgICAgICBmb250RGVzYy5zZXRDb21wdXRlZFNp
emUobHJvdW5kZigwLjcwZiAqIGZvbnREZXNjLmNvbXB1dGVkU2l6ZSgpKSk7CisgICAgICAgIGZv
bnREZXNjLnNldFNwZWNpZmllZFNpemUobHJvdW5kZigwLjcwZiAqIGZvbnREZXNjLnNwZWNpZmll
ZFNpemUoKSkpOworICAgICAgICBmb250RGVzYy5zZXRLZXl3b3JkU2l6ZShscm91bmRmKDAuNzBm
ICogZm9udERlc2Mua2V5d29yZFNpemUoKSkpOworICAgICAgICBGb250UGxhdGZvcm1EYXRhKiBy
ZXN1bHQgPSBmb250Q2FjaGUoKS0+Z2V0Q2FjaGVkRm9udFBsYXRmb3JtRGF0YShmb250RGVzYywg
bV9wbGF0Zm9ybURhdGEuZmFtaWx5KCkpOworICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAg
ICAgbV9zbWFsbENhcHNGb250RGF0YSA9IG5ldyBTaW1wbGVGb250RGF0YSgqcmVzdWx0KTsKKyAg
ICB9CisgICAgcmV0dXJuIG1fc21hbGxDYXBzRm9udERhdGE7Cit9CisKK0RXT1JEIGdldEtub3du
Rm9udENvZGVQYWdlcyhjb25zdCB3Y2hhcl90KiBmYW1pbHkpOworCitib29sIFNpbXBsZUZvbnRE
YXRhOjpjb250YWluc0NoYXJhY3RlcnMoY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIGludCBsZW5n
dGgpIGNvbnN0Cit7CisgICAgaWYgKG1fcGxhdGZvcm1EYXRhLmlzRGlzYWJsZWQoKSkKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBGSVhNRTogTWljcm9zb2Z0IGRvY3VtZW50YXRpb24g
c2VlbXMgdG8gaW1wbHkgdGhhdCBjaGFyYWN0ZXJzIGNhbiBiZSBvdXRwdXQgdXNpbmcgYSBnaXZl
biBmb250IGFuZCBEQworICAgIC8vIG1lcmVseSBieSB0ZXN0aW5nIGNvZGUgcGFnZSBpbnRlcnNl
Y3Rpb24uICBUaGlzIHNlZW1zIHN1c3BlY3QgdGhvdWdoLiAgQ2FuJ3QgYSBmb250IG9ubHkgcGFy
dGlhbGx5CisgICAgLy8gY292ZXIgYSBnaXZlbiBjb2RlIHBhZ2U/CisKKyAgICAvLyBGSVhNRTog
aW4gdGhlIGNhc2UgdGhhdCB3ZSBmYWlsZWQgdG8gZ2V0IHRoZSBpbnRlcmZhY2UsIHN0aWxsIHVz
ZSB0aGUgZm9udC4KKyNpZiBkZWZpbmVkKElNTEFOR19GT05UX0xJTkspICYmIChJTUxBTkdfRk9O
VF9MSU5LID09IDIpCisgICAgSU1MYW5nRm9udExpbmsyKiBsYW5nRm9udExpbmsgPSBmb250Q2Fj
aGUoKS0+Z2V0Rm9udExpbmtJbnRlcmZhY2UoKTsKKyNlbHNlCisgICAgSU1MYW5nRm9udExpbmsq
IGxhbmdGb250TGluayA9IGZvbnRDYWNoZSgpLT5nZXRGb250TGlua0ludGVyZmFjZSgpOworI2Vu
ZGlmCisgICAgaWYgKCFsYW5nRm9udExpbmspCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAg
RFdPUkQgZm9udENvZGVQYWdlcyA9IG1fcGxhdGZvcm1EYXRhLmNvZGVQYWdlcygpOworICAgIGlm
ICghZm9udENvZGVQYWdlcykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgRFdPUkQgYWNw
Q29kZVBhZ2VzID0gMDsKKyAgICBsYW5nRm9udExpbmstPkNvZGVQYWdlVG9Db2RlUGFnZXMoQ1Bf
QUNQLCAmYWNwQ29kZVBhZ2VzKTsKKworICAgIERXT1JEIGFjdHVhbENvZGVQYWdlczsKKyAgICBs
b25nIG51bUNoYXJhY3RlcnNQcm9jZXNzZWQ7CisgICAgd2hpbGUgKGxlbmd0aCkgeworICAgICAg
ICBsYW5nRm9udExpbmstPkdldFN0ckNvZGVQYWdlcyhjaGFyYWN0ZXJzLCBsZW5ndGgsIGFjcENv
ZGVQYWdlcywgJmFjdHVhbENvZGVQYWdlcywgJm51bUNoYXJhY3RlcnNQcm9jZXNzZWQpOworICAg
ICAgICBpZiAoYWN0dWFsQ29kZVBhZ2VzICYmICEoYWN0dWFsQ29kZVBhZ2VzICYgZm9udENvZGVQ
YWdlcykpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgbGVuZ3RoIC09IG51
bUNoYXJhY3RlcnNQcm9jZXNzZWQ7CisgICAgICAgIGNoYXJhY3RlcnMgKz0gbnVtQ2hhcmFjdGVy
c1Byb2Nlc3NlZDsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTaW1wbGVG
b250RGF0YTo6ZGV0ZXJtaW5lUGl0Y2goKQoreworICAgIGlmICghbV9wbGF0Zm9ybURhdGEuaXNW
YWxpZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjb25zdCBURVhUTUVUUklDJiB0bSA9IG1f
cGxhdGZvcm1EYXRhLm1ldHJpY3MoKTsKKworICAgIC8vIFllcywgdGhpcyBsb29rcyBiYWNrd2Fy
ZHMsIGJ1dCB0aGUgZml4ZWQgcGl0Y2ggYml0IGlzIGFjdHVhbGx5IHNldCBpZiB0aGUgZm9udAor
ICAgIC8vIGlzICpub3QqIGZpeGVkIHBpdGNoLiAgVW5iZWxpZXZhYmxlIGJ1dCB0cnVlLgorICAg
IG1fdHJlYXRBc0ZpeGVkUGl0Y2ggPSAhKHRtLnRtUGl0Y2hBbmRGYW1pbHkgJiBUTVBGX0ZJWEVE
X1BJVENIKTsKK30KKworZmxvYXQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtV2lkdGhGb3JHbHlw
aChHbHlwaCBnbHlwaCkgY29uc3QKK3sKKyAgICBpZiAobV9wbGF0Zm9ybURhdGEuaXNEaXNhYmxl
ZCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIEhHRElPQkogaE9sZEZvbnQgPSBTZWxlY3RP
YmplY3QoZ19zY3JlZW5EQywgbV9wbGF0Zm9ybURhdGEuaGZvbnQoKSk7CisKKyAgICBTSVpFIGZv
bnRTaXplOworICAgIHdjaGFyX3QgYyA9IGdseXBoOworICAgIEdldFRleHRFeHRlbnRQb2ludDMy
KGdfc2NyZWVuREMsICZjLCAxLCAmZm9udFNpemUpOworCisgICAgU2VsZWN0T2JqZWN0KGdfc2Ny
ZWVuREMsIGhPbGRGb250KTsKKworICAgIHJldHVybiAoZmxvYXQpZm9udFNpemUuY3ggKiAoZmxv
YXQpbV9wbGF0Zm9ybURhdGEuc2l6ZSgpIC8gNzIuZjsKK30KKworCit2b2lkIFNpbXBsZUZvbnRE
YXRhOjpwbGF0Zm9ybUNoYXJXaWR0aEluaXQoKQoreworICAgIGlmICghbV9wbGF0Zm9ybURhdGEu
aXNWYWxpZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjb25zdCBURVhUTUVUUklDJiB0bSA9
IG1fcGxhdGZvcm1EYXRhLm1ldHJpY3MoKTsKKyAgICBtX2F2Z0NoYXJXaWR0aCA9ICh0bS50bUF2
ZUNoYXJXaWR0aCAqIG1fcGxhdGZvcm1EYXRhLnNpemUoKSArIDM2KSAvIDcyOworICAgIG1fbWF4
Q2hhcldpZHRoID0gKHRtLnRtTWF4Q2hhcldpZHRoICogbV9wbGF0Zm9ybURhdGEuc2l6ZSgpICsg
MzYpIC8gNzI7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2Uv
U2ltcGxlRm9udERhdGFXaW5DRS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW5jZS9TaW1wbGVGb250RGF0YVdpbkNFLmNwcAkocmV2aXNpb24gNTcyODkpCisr
KyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NpbXBsZUZvbnREYXRhV2luQ0UuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0xNTgsNCArMTU4LDQgQEAgdm9pZCBTaW1wbGVGb250RGF0YTo6
cGxhdGZvcm1DaGFyV2lkdGhJbgogICAgIG1fbWF4Q2hhcldpZHRoID0gKHRtLnRtTWF4Q2hhcldp
ZHRoICogbV9wbGF0Zm9ybURhdGEuc2l6ZSgpICsgMzYpIC8gNzI7CiB9CiAKLX0KK30gLy8gbmFt
ZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2lt
cGxlRm9udERhdGFXaW5jZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW5jZS9TaW1wbGVGb250RGF0YVdpbmNlLmNwcAkocmV2aXNpb24gNTcyODkpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NpbXBsZUZvbnREYXRhV2luY2UuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0xLDE2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2
LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKEMp
IDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICogMi4g
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0Ci0gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAotICogMy4g
IE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0
aGUgbmFtZXMgb2YKLSAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9y
c2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJl
IHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKLSAqCi0gKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJ
UyIgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNp
bmNsdWRlICJTaW1wbGVGb250RGF0YS5oIgotCi0jaW5jbHVkZSAiRmxvYXRSZWN0LmgiCi0jaW5j
bHVkZSAiRm9udC5oIgotI2luY2x1ZGUgIkZvbnRDYWNoZS5oIgotI2luY2x1ZGUgIkZvbnREZXNj
cmlwdGlvbi5oIgotI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+Ci0jaW5jbHVkZSA8bWxhbmcu
aD4KLSNpbmNsdWRlIDx0Y2hhci5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLWV4dGVybiBI
REMgZ19zY3JlZW5EQzsKLQotdm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKLXsK
LSAgICBpZiAoIW1fcGxhdGZvcm1EYXRhLmlzVmFsaWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgY29uc3QgVEVYVE1FVFJJQyYgdG0gPSBtX3BsYXRmb3JtRGF0YS5tZXRyaWNzKCk7Ci0gICAg
bV9pc1N5c3RlbUZvbnQgPSBtX3BsYXRmb3JtRGF0YS5pc1N5c3RlbUZvbnQoKTsKLQotICAgIG1f
YXNjZW50ID0gKHRtLnRtQXNjZW50ICogbV9wbGF0Zm9ybURhdGEuc2l6ZSgpICsgMzYpIC8gNzI7
Ci0gICAgbV9kZXNjZW50ID0gKHRtLnRtRGVzY2VudCAqIG1fcGxhdGZvcm1EYXRhLnNpemUoKSAr
IDM2KSAvIDcyOwotICAgIG1fbGluZUdhcCA9ICh0bS50bUV4dGVybmFsTGVhZGluZyAqIG1fcGxh
dGZvcm1EYXRhLnNpemUoKSArIDM2KSAvIDcyOwotICAgIG1fbGluZVNwYWNpbmcgPSBtX2FzY2Vu
dCArIG1fZGVzY2VudCArIG1fbGluZUdhcDsKLSAgICBtX3hIZWlnaHQgPSBtX2FzY2VudCAqIDAu
NTZmOwotfQotCi12b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3koKQotewotICAg
IGRlbGV0ZSBtX3NtYWxsQ2Fwc0ZvbnREYXRhOwotICAgIG1fc21hbGxDYXBzRm9udERhdGEgPSAw
OwotfQotCi1TaW1wbGVGb250RGF0YSogU2ltcGxlRm9udERhdGE6OnNtYWxsQ2Fwc0ZvbnREYXRh
KGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uKSBjb25zdAotewotICAgIGlm
ICghbV9zbWFsbENhcHNGb250RGF0YSkgewotICAgICAgICBGb250RGVzY3JpcHRpb24gZm9udERl
c2MoZm9udERlc2NyaXB0aW9uKTsKLSAgICAgICAgZm9udERlc2Muc2V0Q29tcHV0ZWRTaXplKGxy
b3VuZGYoMC43MGYgKiBmb250RGVzYy5jb21wdXRlZFNpemUoKSkpOwotICAgICAgICBmb250RGVz
Yy5zZXRTcGVjaWZpZWRTaXplKGxyb3VuZGYoMC43MGYgKiBmb250RGVzYy5zcGVjaWZpZWRTaXpl
KCkpKTsKLSAgICAgICAgZm9udERlc2Muc2V0S2V5d29yZFNpemUobHJvdW5kZigwLjcwZiAqIGZv
bnREZXNjLmtleXdvcmRTaXplKCkpKTsKLSAgICAgICAgRm9udFBsYXRmb3JtRGF0YSogcmVzdWx0
ID0gZm9udENhY2hlKCktPmdldENhY2hlZEZvbnRQbGF0Zm9ybURhdGEoZm9udERlc2MsIG1fcGxh
dGZvcm1EYXRhLmZhbWlseSgpKTsKLSAgICAgICAgaWYgKHJlc3VsdCkKLSAgICAgICAgICAgIG1f
c21hbGxDYXBzRm9udERhdGEgPSBuZXcgU2ltcGxlRm9udERhdGEoKnJlc3VsdCk7Ci0gICAgfQot
ICAgIHJldHVybiBtX3NtYWxsQ2Fwc0ZvbnREYXRhOwotfQotCi1EV09SRCBnZXRLbm93bkZvbnRD
b2RlUGFnZXMoY29uc3Qgd2NoYXJfdCogZmFtaWx5KTsKLQotYm9vbCBTaW1wbGVGb250RGF0YTo6
Y29udGFpbnNDaGFyYWN0ZXJzKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3RoKSBj
b25zdAotewotICAgIGlmIChtX3BsYXRmb3JtRGF0YS5pc0Rpc2FibGVkKCkpCi0gICAgICAgIHJl
dHVybiB0cnVlOwotCi0gICAgLy8gRklYTUU6IE1pY3Jvc29mdCBkb2N1bWVudGF0aW9uIHNlZW1z
IHRvIGltcGx5IHRoYXQgY2hhcmFjdGVycyBjYW4gYmUgb3V0cHV0IHVzaW5nIGEgZ2l2ZW4gZm9u
dCBhbmQgREMKLSAgICAvLyBtZXJlbHkgYnkgdGVzdGluZyBjb2RlIHBhZ2UgaW50ZXJzZWN0aW9u
LiAgVGhpcyBzZWVtcyBzdXNwZWN0IHRob3VnaC4gIENhbid0IGEgZm9udCBvbmx5IHBhcnRpYWxs
eQotICAgIC8vIGNvdmVyIGEgZ2l2ZW4gY29kZSBwYWdlPwotCi0gICAgLy8gRklYTUU6IGluIHRo
ZSBjYXNlIHRoYXQgd2UgZmFpbGVkIHRvIGdldCB0aGUgaW50ZXJmYWNlLCBzdGlsbCB1c2UgdGhl
IGZvbnQuCi0jaWYgZGVmaW5lZChJTUxBTkdfRk9OVF9MSU5LKSAmJiAoSU1MQU5HX0ZPTlRfTElO
SyA9PSAyKQotICAgIElNTGFuZ0ZvbnRMaW5rMiogbGFuZ0ZvbnRMaW5rID0gZm9udENhY2hlKCkt
PmdldEZvbnRMaW5rSW50ZXJmYWNlKCk7Ci0jZWxzZQotICAgIElNTGFuZ0ZvbnRMaW5rKiBsYW5n
Rm9udExpbmsgPSBmb250Q2FjaGUoKS0+Z2V0Rm9udExpbmtJbnRlcmZhY2UoKTsKLSNlbmRpZgot
ICAgIGlmICghbGFuZ0ZvbnRMaW5rKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIERXT1JE
IGZvbnRDb2RlUGFnZXMgPSBtX3BsYXRmb3JtRGF0YS5jb2RlUGFnZXMoKTsKLSAgICBpZiAoIWZv
bnRDb2RlUGFnZXMpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIERXT1JEIGFjcENvZGVQ
YWdlcyA9IDA7Ci0gICAgbGFuZ0ZvbnRMaW5rLT5Db2RlUGFnZVRvQ29kZVBhZ2VzKENQX0FDUCwg
JmFjcENvZGVQYWdlcyk7Ci0KLSAgICBEV09SRCBhY3R1YWxDb2RlUGFnZXM7Ci0gICAgbG9uZyBu
dW1DaGFyYWN0ZXJzUHJvY2Vzc2VkOwotICAgIHdoaWxlIChsZW5ndGgpIHsKLSAgICAgICAgbGFu
Z0ZvbnRMaW5rLT5HZXRTdHJDb2RlUGFnZXMoY2hhcmFjdGVycywgbGVuZ3RoLCBhY3BDb2RlUGFn
ZXMsICZhY3R1YWxDb2RlUGFnZXMsICZudW1DaGFyYWN0ZXJzUHJvY2Vzc2VkKTsKLSAgICAgICAg
aWYgKGFjdHVhbENvZGVQYWdlcyAmJiAhKGFjdHVhbENvZGVQYWdlcyAmIGZvbnRDb2RlUGFnZXMp
KQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGxlbmd0aCAtPSBudW1DaGFy
YWN0ZXJzUHJvY2Vzc2VkOwotICAgICAgICBjaGFyYWN0ZXJzICs9IG51bUNoYXJhY3RlcnNQcm9j
ZXNzZWQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU2ltcGxlRm9udERh
dGE6OmRldGVybWluZVBpdGNoKCkKLXsKLSAgICBpZiAoIW1fcGxhdGZvcm1EYXRhLmlzVmFsaWQo
KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY29uc3QgVEVYVE1FVFJJQyYgdG0gPSBtX3BsYXRm
b3JtRGF0YS5tZXRyaWNzKCk7Ci0KLSAgICAvLyBZZXMsIHRoaXMgbG9va3MgYmFja3dhcmRzLCBi
dXQgdGhlIGZpeGVkIHBpdGNoIGJpdCBpcyBhY3R1YWxseSBzZXQgaWYgdGhlIGZvbnQKLSAgICAv
LyBpcyAqbm90KiBmaXhlZCBwaXRjaC4gIFVuYmVsaWV2YWJsZSBidXQgdHJ1ZS4KLSAgICBtX3Ry
ZWF0QXNGaXhlZFBpdGNoID0gISh0bS50bVBpdGNoQW5kRmFtaWx5ICYgVE1QRl9GSVhFRF9QSVRD
SCk7Ci19Ci0KLWZsb2F0IFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybVdpZHRoRm9yR2x5cGgoR2x5
cGggZ2x5cGgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcGxhdGZvcm1EYXRhLmlzRGlzYWJsZWQoKSkK
LSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBIR0RJT0JKIGhPbGRGb250ID0gU2VsZWN0T2JqZWN0
KGdfc2NyZWVuREMsIG1fcGxhdGZvcm1EYXRhLmhmb250KCkpOwotCi0gICAgU0laRSBmb250U2l6
ZTsKLSAgICB3Y2hhcl90IGMgPSBnbHlwaDsKLSAgICBHZXRUZXh0RXh0ZW50UG9pbnQzMihnX3Nj
cmVlbkRDLCAmYywgMSwgJmZvbnRTaXplKTsKLQotICAgIFNlbGVjdE9iamVjdChnX3NjcmVlbkRD
LCBoT2xkRm9udCk7Ci0KLSAgICByZXR1cm4gKGZsb2F0KWZvbnRTaXplLmN4ICogKGZsb2F0KW1f
cGxhdGZvcm1EYXRhLnNpemUoKSAvIDcyLmY7Ci19Ci0KLQotdm9pZCBTaW1wbGVGb250RGF0YTo6
cGxhdGZvcm1DaGFyV2lkdGhJbml0KCkKLXsKLSAgICBpZiAoIW1fcGxhdGZvcm1EYXRhLmlzVmFs
aWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY29uc3QgVEVYVE1FVFJJQyYgdG0gPSBtX3Bs
YXRmb3JtRGF0YS5tZXRyaWNzKCk7Ci0gICAgbV9hdmdDaGFyV2lkdGggPSAodG0udG1BdmVDaGFy
V2lkdGggKiBtX3BsYXRmb3JtRGF0YS5zaXplKCkgKyAzNikgLyA3MjsKLSAgICBtX21heENoYXJX
aWR0aCA9ICh0bS50bU1heENoYXJXaWR0aCAqIG1fcGxhdGZvcm1EYXRhLnNpemUoKSArIDM2KSAv
IDcyOwotfQotCi19CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1dpbkNF
R3JhcGhpY3NFeHRyYXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbmNlL1dpbkNFR3JhcGhpY3NFeHRyYXMuaAkocmV2aXNpb24gNTcyODkpCShmcm9tIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvV2luY2VHcmFwaGljc0V4dHJhcy5oOjU3Mjg5KQor
KysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9XaW5DRUdyYXBoaWNzRXh0cmFzLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIw
MDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGlj
ZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy
CisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBs
YXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhl
IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFO
VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
KiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgor
ICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRo
ZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisg
KiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBXaW5jZUdyYXBo
aWNzRXh0cmFzX2gKKyNkZWZpbmUgV2luY2VHcmFwaGljc0V4dHJhc19oCisKKy8vIFRoaXMgZmls
ZSBpcyB1c2VkIHRvIGNvbnRhaW4gc21hbGwgdXRpbGl0aWVzIHVzZWQgYnkgV0lOQ0UgZ3JhcGhp
Y3MgY29kZS4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworICAgIC8vIEFsd2F5cyByb3VuZCB0byBz
YW1lIGRpcmVjdGlvbi4gMC41IGlzIHJvdW5kZWQgdG8gMSwKKyAgICAvLyBhbmQgLTAuNSAoMC41
IC0gMSkgaXMgcm91bmRlZCB0byAwICgxIC0gMSksIHNvIHRoYXQgaXQKKyAgICAvLyBpcyBjb25z
aXN0ZW50IHdoZW4gdHJhbnNmb3JtYXRpb24gc2hpZnRzLgorICAgIHN0YXRpYyBpbmxpbmUgaW50
IHN0YWJsZVJvdW5kKGRvdWJsZSBkKQorICAgIHsKKyAgICAgICAgaWYgKGQgPiAwKQorICAgICAg
ICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oZCArIDAuNSk7CisKKyAgICAgICAgaW50IGkg
PSBzdGF0aWNfY2FzdDxpbnQ+KGQpOworICAgICAgICByZXR1cm4gaSAtIGQgPiAwLjUgPyBpIC0g
MSA6IGk7CisgICAgfQorfQorCisjZW5kaWYgV2luY2VHcmFwaGljc0V4dHJhc19oCkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1dpbkNFR3JhcGhpY3NFeHRyYXMuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1dpbkNFR3JhcGhpY3NF
eHRyYXMuaAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL1dpbkNFR3JhcGhpY3NFeHRyYXMuaAkod29ya2luZyBjb3B5KQpAQCAtMTcsOCArMTcsOCBA
QAogICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgogICovCiAKLSNpZm5kZWYgV2luY2VH
cmFwaGljc0V4dHJhc19oCi0jZGVmaW5lIFdpbmNlR3JhcGhpY3NFeHRyYXNfaAorI2lmbmRlZiBX
aW5DRUdyYXBoaWNzRXh0cmFzX2gKKyNkZWZpbmUgV2luQ0VHcmFwaGljc0V4dHJhc19oCiAKIC8v
IFRoaXMgZmlsZSBpcyB1c2VkIHRvIGNvbnRhaW4gc21hbGwgdXRpbGl0aWVzIHVzZWQgYnkgV0lO
Q0UgZ3JhcGhpY3MgY29kZS4KIApAQCAtMzYsNCArMzYsNCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7
CiAgICAgfQogfQogCi0jZW5kaWYgV2luY2VHcmFwaGljc0V4dHJhc19oCisjZW5kaWYgV2luQ0VH
cmFwaGljc0V4dHJhc19oCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1dp
bmNlR3JhcGhpY3NFeHRyYXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbmNlL1dpbmNlR3JhcGhpY3NFeHRyYXMuaAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1dpbmNlR3JhcGhpY3NFeHRyYXMuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMSwzOSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA5
IFRvcmNoIE1vYmlsZSwgSW5jLgotICoKLSAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2Fy
ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgbW9kaWZ5IGl0IHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqICBMaWNlbnNlIGFz
IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqICB2
ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl
cnNpb24uCi0gKgotICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0
aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0
aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9y
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqICBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91
IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUg
Q09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqICBCb3N0
b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0jaWZuZGVmIFdpbmNlR3JhcGhpY3NFeHRy
YXNfaAotI2RlZmluZSBXaW5jZUdyYXBoaWNzRXh0cmFzX2gKLQotLy8gVGhpcyBmaWxlIGlzIHVz
ZWQgdG8gY29udGFpbiBzbWFsbCB1dGlsaXRpZXMgdXNlZCBieSBXSU5DRSBncmFwaGljcyBjb2Rl
LgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0gICAgLy8gQWx3YXlzIHJvdW5kIHRvIHNhbWUgZGly
ZWN0aW9uLiAwLjUgaXMgcm91bmRlZCB0byAxLAotICAgIC8vIGFuZCAtMC41ICgwLjUgLSAxKSBp
cyByb3VuZGVkIHRvIDAgKDEgLSAxKSwgc28gdGhhdCBpdAotICAgIC8vIGlzIGNvbnNpc3RlbnQg
d2hlbiB0cmFuc2Zvcm1hdGlvbiBzaGlmdHMuCi0gICAgc3RhdGljIGlubGluZSBpbnQgc3RhYmxl
Um91bmQoZG91YmxlIGQpCi0gICAgewotICAgICAgICBpZiAoZCA+IDApCi0gICAgICAgICAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihkICsgMC41KTsKLQotICAgICAgICBpbnQgaSA9IHN0YXRp
Y19jYXN0PGludD4oZCk7Ci0gICAgICAgIHJldHVybiBpIC0gZCA+IDAuNSA/IGkgLSAxIDogaTsK
LSAgICB9Ci19Ci0KLSNlbmRpZiBXaW5jZUdyYXBoaWNzRXh0cmFzX2gKSW5kZXg6IFdlYkNvcmUv
cGxhdGZvcm0vdGV4dC9UZXh0RW5jb2RpbmdSZWdpc3RyeS5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS90ZXh0L1RleHRFbmNvZGluZ1JlZ2lzdHJ5LmNwcAkocmV2aXNpb24gNTcy
ODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3RleHQvVGV4dEVuY29kaW5nUmVnaXN0cnkuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC01Miw3ICs1Miw3IEBACiAjaW5jbHVkZSAiZ3RrL1RleHRDb2RlY0d0
ay5oIgogI2VuZGlmCiAjaWYgT1MoV0lOQ0UpICYmICFQTEFURk9STShRVCkKLSNpbmNsdWRlICJU
ZXh0Q29kZWNXaW5jZS5oIgorI2luY2x1ZGUgIlRleHRDb2RlY1dpbkNFLmgiCiAjZW5kaWYKIAog
dXNpbmcgbmFtZXNwYWNlIFdURjsKQEAgLTIzMSw4ICsyMzEsOCBAQCBzdGF0aWMgdm9pZCBidWls
ZEJhc2VUZXh0Q29kZWNNYXBzKCkKICNlbmRpZgogCiAjaWYgT1MoV0lOQ0UpICYmICFQTEFURk9S
TShRVCkKLSAgICBUZXh0Q29kZWNXaW5jZTo6cmVnaXN0ZXJCYXNlRW5jb2RpbmdOYW1lcyhhZGRU
b1RleHRFbmNvZGluZ05hbWVNYXApOwotICAgIFRleHRDb2RlY1dpbmNlOjpyZWdpc3RlckJhc2VD
b2RlY3MoYWRkVG9UZXh0Q29kZWNNYXApOworICAgIFRleHRDb2RlY1dpbkNFOjpyZWdpc3RlckJh
c2VFbmNvZGluZ05hbWVzKGFkZFRvVGV4dEVuY29kaW5nTmFtZU1hcCk7CisgICAgVGV4dENvZGVj
V2luQ0U6OnJlZ2lzdGVyQmFzZUNvZGVjcyhhZGRUb1RleHRDb2RlY01hcCk7CiAjZW5kaWYKIH0K
IApAQCAtMjU5LDggKzI1OSw4IEBAIHN0YXRpYyB2b2lkIGV4dGVuZFRleHRDb2RlY01hcHMoKQog
I2VuZGlmCiAKICNpZiBPUyhXSU5DRSkgJiYgIVBMQVRGT1JNKFFUKQotICAgIFRleHRDb2RlY1dp
bmNlOjpyZWdpc3RlckV4dGVuZGVkRW5jb2RpbmdOYW1lcyhhZGRUb1RleHRFbmNvZGluZ05hbWVN
YXApOwotICAgIFRleHRDb2RlY1dpbmNlOjpyZWdpc3RlckV4dGVuZGVkQ29kZWNzKGFkZFRvVGV4
dENvZGVjTWFwKTsKKyAgICBUZXh0Q29kZWNXaW5DRTo6cmVnaXN0ZXJFeHRlbmRlZEVuY29kaW5n
TmFtZXMoYWRkVG9UZXh0RW5jb2RpbmdOYW1lTWFwKTsKKyAgICBUZXh0Q29kZWNXaW5DRTo6cmVn
aXN0ZXJFeHRlbmRlZENvZGVjcyhhZGRUb1RleHRDb2RlY01hcCk7CiAjZW5kaWYKIAogICAgIHBy
dW5lQmxhY2tsaXN0ZWRDb2RlY3MoKTsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vdGV4dC93aW5j
ZS9UZXh0Qm91bmRhcmllc1dpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3Jt
L3RleHQvd2luY2UvVGV4dEJvdW5kYXJpZXNXaW5DRS5jcHAJKHJldmlzaW9uIDU3Mjg5KQkoZnJv
bSBXZWJDb3JlL3BsYXRmb3JtL3RleHQvd2luY2UvVGV4dEJvdW5kYXJpZXNXaW5jZS5jcHA6NTcy
ODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3RleHQvd2luY2UvVGV4dEJvdW5kYXJpZXNXaW5DRS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAwNiBaYWNrIFJ1c2luIDx6YWNrQGtkZS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAw
OSBUb3JjaCBNb2JpbGUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiVGV4dEJvdW5kYXJpZXMuaCIKKworI2luY2x1ZGUgIk5v
dEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKwordXNpbmcgbmFt
ZXNwYWNlIFdURjo6VW5pY29kZTsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitpbnQgZmluZE5l
eHRXb3JkRnJvbUluZGV4KGNvbnN0IFVDaGFyICogYnVmZmVyLCBpbnQgbGVuLCBpbnQgcG9zaXRp
b24sIGJvb2wgZm9yd2FyZCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAw
OworfQorCit2b2lkIGZpbmRXb3JkQm91bmRhcnkoY29uc3QgVUNoYXIgKiBidWZmZXIsIGludCBs
ZW4sIGludCBwb3NpdGlvbiwgaW50KiBzdGFydCwgaW50KiBlbmQpCit7CisgICAgaWYgKHBvc2l0
aW9uID4gbGVuKSB7CisgICAgICAgICpzdGFydCA9IDA7CisgICAgICAgICplbmQgPSAwOworICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgU3RyaW5nIHN0cihidWZmZXIsIGxlbik7CisKKyAg
ICBpbnQgY3VycmVudFBvc2l0aW9uID0gcG9zaXRpb24gLSAxOworICAgIFN0cmluZyBmb3VuZFdv
cmQ7CisgICAgd2hpbGUgKGN1cnJlbnRQb3NpdGlvbiA+PSAwICYmIGlzTGV0dGVyKHN0cltjdXJy
ZW50UG9zaXRpb25dKSkgeworICAgICAgICBVQ2hhciBjID0gc3RyW2N1cnJlbnRQb3NpdGlvbl07
CisgICAgICAgIGZvdW5kV29yZC5pbnNlcnQoJmMsIDEsIDApOworICAgICAgICAtLWN1cnJlbnRQ
b3NpdGlvbjsKKyAgICB9CisKKyAgICAvLyBjdXJyZW50UG9zaXRpb24gPT0gMCBtZWFucyB0aGUg
Zmlyc3QgY2hhciBpcyBub3QgbGV0dGVyCisgICAgLy8gY3VycmVudFBvc2l0aW9uID09IC0xIG1l
YW5zIHdlIHJlYWNoZWQgdGhlIGJlZ2lubmluZworICAgIGludCBzdGFydFBvcyA9IChjdXJyZW50
UG9zaXRpb24gPCAwKSA/IDAgOiArK2N1cnJlbnRQb3NpdGlvbjsKKyAgICBjdXJyZW50UG9zaXRp
b24gPSBwb3NpdGlvbjsKKyAgICB3aGlsZSAoaXNMZXR0ZXIoc3RyW2N1cnJlbnRQb3NpdGlvbl0p
KSB7CisgICAgICAgIGZvdW5kV29yZC5hcHBlbmQoc3RyW2N1cnJlbnRQb3NpdGlvbl0pOworICAg
ICAgICArK2N1cnJlbnRQb3NpdGlvbjsKKyAgICB9CisKKyAgICAqc3RhcnQgPSBzdGFydFBvczsK
KyAgICAqZW5kID0gY3VycmVudFBvc2l0aW9uOworfQorCisKK30KSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vdGV4dC93aW5jZS9UZXh0Qm91bmRhcmllc1dpbkNFLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL3RleHQvd2luY2UvVGV4dEJvdW5kYXJpZXNXaW5DRS5jcHAJKHJldmlz
aW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L3dpbmNlL1RleHRCb3VuZGFyaWVz
V2luQ0UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03MSw1ICs3MSw0IEBAIHZvaWQgZmluZFdvcmRC
b3VuZGFyeShjb25zdCBVQ2hhciAqIGJ1ZmYKICAgICAqZW5kID0gY3VycmVudFBvc2l0aW9uOwog
fQogCi0KLX0KK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0v
dGV4dC93aW5jZS9UZXh0Qm91bmRhcmllc1dpbmNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL3RleHQvd2luY2UvVGV4dEJvdW5kYXJpZXNXaW5jZS5jcHAJKHJldmlzaW9uIDU3
Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L3dpbmNlL1RleHRCb3VuZGFyaWVzV2luY2Uu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMp
IDIwMDYgWmFjayBSdXNpbiA8emFja0BrZGUub3JnPgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIw
MDkgVG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgot
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgot
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCi0g
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1
ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlRleHRCb3VuZGFyaWVzLmgiCi0KLSNpbmNsdWRlICJO
b3RJbXBsZW1lbnRlZC5oIgotI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCi0KLXVzaW5nIG5h
bWVzcGFjZSBXVEY6OlVuaWNvZGU7Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotaW50IGZpbmRO
ZXh0V29yZEZyb21JbmRleChjb25zdCBVQ2hhciAqIGJ1ZmZlciwgaW50IGxlbiwgaW50IHBvc2l0
aW9uLCBib29sIGZvcndhcmQpCi17Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1cm4g
MDsKLX0KLQotdm9pZCBmaW5kV29yZEJvdW5kYXJ5KGNvbnN0IFVDaGFyICogYnVmZmVyLCBpbnQg
bGVuLCBpbnQgcG9zaXRpb24sIGludCogc3RhcnQsIGludCogZW5kKQotewotICAgIGlmIChwb3Np
dGlvbiA+IGxlbikgewotICAgICAgICAqc3RhcnQgPSAwOwotICAgICAgICAqZW5kID0gMDsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFN0cmluZyBzdHIoYnVmZmVyLCBsZW4pOwotCi0g
ICAgaW50IGN1cnJlbnRQb3NpdGlvbiA9IHBvc2l0aW9uIC0gMTsKLSAgICBTdHJpbmcgZm91bmRX
b3JkOwotICAgIHdoaWxlIChjdXJyZW50UG9zaXRpb24gPj0gMCAmJiBpc0xldHRlcihzdHJbY3Vy
cmVudFBvc2l0aW9uXSkpIHsKLSAgICAgICAgVUNoYXIgYyA9IHN0cltjdXJyZW50UG9zaXRpb25d
OwotICAgICAgICBmb3VuZFdvcmQuaW5zZXJ0KCZjLCAxLCAwKTsKLSAgICAgICAgLS1jdXJyZW50
UG9zaXRpb247Ci0gICAgfQotCi0gICAgLy8gY3VycmVudFBvc2l0aW9uID09IDAgbWVhbnMgdGhl
IGZpcnN0IGNoYXIgaXMgbm90IGxldHRlcgotICAgIC8vIGN1cnJlbnRQb3NpdGlvbiA9PSAtMSBt
ZWFucyB3ZSByZWFjaGVkIHRoZSBiZWdpbm5pbmcKLSAgICBpbnQgc3RhcnRQb3MgPSAoY3VycmVu
dFBvc2l0aW9uIDwgMCkgPyAwIDogKytjdXJyZW50UG9zaXRpb247Ci0gICAgY3VycmVudFBvc2l0
aW9uID0gcG9zaXRpb247Ci0gICAgd2hpbGUgKGlzTGV0dGVyKHN0cltjdXJyZW50UG9zaXRpb25d
KSkgewotICAgICAgICBmb3VuZFdvcmQuYXBwZW5kKHN0cltjdXJyZW50UG9zaXRpb25dKTsKLSAg
ICAgICAgKytjdXJyZW50UG9zaXRpb247Ci0gICAgfQotCi0gICAgKnN0YXJ0ID0gc3RhcnRQb3M7
Ci0gICAgKmVuZCA9IGN1cnJlbnRQb3NpdGlvbjsKLX0KLQotCi19CkluZGV4OiBXZWJDb3JlL3Bs
YXRmb3JtL3RleHQvd2luY2UvVGV4dEJyZWFrSXRlcmF0b3JXaW5DRS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L3dpbmNlL1RleHRCcmVha0l0ZXJhdG9yV2luQ0UuY3Bw
CShyZXZpc2lvbiA1NzI4OSkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L3dpbmNlL1RleHRC
cmVha0l0ZXJhdG9yV2luY2UuY3BwOjU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L3dp
bmNlL1RleHRCcmVha0l0ZXJhdG9yV2luQ0UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MzEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IExhcnMgS25vbGwgPGxhcnNAdHJvbGx0
ZWNoLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0
aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8K
KyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAt
IFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiVGV4dEJyZWFrSXRlcmF0b3IuaCIKKworI2lu
Y2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgor
I2luY2x1ZGUgPHd0Zi91bmljb2RlL1VuaWNvZGUuaD4KKwordXNpbmcgbmFtZXNwYWNlIFdURjo6
VW5pY29kZTsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBIYWNrLCBub3QgZW50aXJlbHkg
Y29ycmVjdAorc3RhdGljIGlubGluZSBib29sIGlzQ2hhclN0b3AoVUNoYXIgYykKK3sKKyAgICBD
aGFyQ2F0ZWdvcnkgY2hhckNhdGVnb3J5ID0gY2F0ZWdvcnkoYyk7CisgICAgcmV0dXJuIGNoYXJD
YXRlZ29yeSAhPSBNYXJrX05vblNwYWNpbmcgJiYgKGNoYXJDYXRlZ29yeSAhPSBPdGhlcl9TdXJy
b2dhdGUgfHwgKGMgPCAweGQ4MDAgfHwgYyA+PSAweGRjMDApKTsKK30KKworc3RhdGljIGlubGlu
ZSBib29sIGlzTGluZVN0b3AoVUNoYXIgYykKK3sKKyAgICByZXR1cm4gY2F0ZWdvcnkoYykgIT0g
U2VwYXJhdG9yX0xpbmU7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1NlbnRlbmNlU3RvcChV
Q2hhciBjKQoreworICAgIHJldHVybiBpc1B1bmN0KGMpOworfQorCitjbGFzcyBUZXh0QnJlYWtJ
dGVyYXRvciB7CitwdWJsaWM6CisgICAgdm9pZCByZXNldChjb25zdCBVQ2hhciogc3RyLCBpbnQg
bGVuKQorICAgIHsKKyAgICAgICAgc3RyaW5nID0gc3RyOworICAgICAgICBsZW5ndGggPSBsZW47
CisgICAgICAgIGN1cnJlbnRQb3MgPSAwOworICAgIH0KKyAgICB2aXJ0dWFsIGludCBmaXJzdCgp
ID0gMDsKKyAgICB2aXJ0dWFsIGludCBuZXh0KCkgPSAwOworICAgIHZpcnR1YWwgaW50IHByZXZp
b3VzKCkgPSAwOworICAgIGludCBmb2xsb3dpbmcoaW50IHBvc2l0aW9uKQorICAgIHsKKyAgICAg
ICAgY3VycmVudFBvcyA9IHBvc2l0aW9uOworICAgICAgICByZXR1cm4gbmV4dCgpOworICAgIH0K
KyAgICBpbnQgcHJlY2VkaW5nKGludCBwb3NpdGlvbikKKyAgICB7CisgICAgICAgIGN1cnJlbnRQ
b3MgPSBwb3NpdGlvbjsKKyAgICAgICAgcmV0dXJuIHByZXZpb3VzKCk7CisgICAgfQorCisgICAg
aW50IGN1cnJlbnRQb3M7CisgICAgY29uc3QgVUNoYXIqIHN0cmluZzsKKyAgICBpbnQgbGVuZ3Ro
OworfTsKKworc3RydWN0IFdvcmRCcmVha0l0ZXJhdG9yOiBUZXh0QnJlYWtJdGVyYXRvciB7Cisg
ICAgdmlydHVhbCBpbnQgZmlyc3QoKTsKKyAgICB2aXJ0dWFsIGludCBuZXh0KCk7CisgICAgdmly
dHVhbCBpbnQgcHJldmlvdXMoKTsKK307CisKK3N0cnVjdCBDaGFyQnJlYWtJdGVyYXRvcjogVGV4
dEJyZWFrSXRlcmF0b3IgeworICAgIHZpcnR1YWwgaW50IGZpcnN0KCk7CisgICAgdmlydHVhbCBp
bnQgbmV4dCgpOworICAgIHZpcnR1YWwgaW50IHByZXZpb3VzKCk7Cit9OworCitzdHJ1Y3QgTGlu
ZUJyZWFrSXRlcmF0b3I6IFRleHRCcmVha0l0ZXJhdG9yIHsKKyAgICB2aXJ0dWFsIGludCBmaXJz
dCgpOworICAgIHZpcnR1YWwgaW50IG5leHQoKTsKKyAgICB2aXJ0dWFsIGludCBwcmV2aW91cygp
OworfTsKKworc3RydWN0IFNlbnRlbmNlQnJlYWtJdGVyYXRvciA6IFRleHRCcmVha0l0ZXJhdG9y
IHsKKyAgICB2aXJ0dWFsIGludCBmaXJzdCgpOworICAgIHZpcnR1YWwgaW50IG5leHQoKTsKKyAg
ICB2aXJ0dWFsIGludCBwcmV2aW91cygpOworfTsKKworaW50IFdvcmRCcmVha0l0ZXJhdG9yOjpm
aXJzdCgpCit7CisgICAgY3VycmVudFBvcyA9IDA7CisgICAgcmV0dXJuIGN1cnJlbnRQb3M7Cit9
CisKK2ludCBXb3JkQnJlYWtJdGVyYXRvcjo6bmV4dCgpCit7CisgICAgaWYgKGN1cnJlbnRQb3Mg
PT0gbGVuZ3RoKSB7CisgICAgICAgIGN1cnJlbnRQb3MgPSAtMTsKKyAgICAgICAgcmV0dXJuIGN1
cnJlbnRQb3M7CisgICAgfQorICAgIGJvb2wgaGF2ZVNwYWNlID0gZmFsc2U7CisgICAgd2hpbGUg
KGN1cnJlbnRQb3MgPCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKGhhdmVTcGFjZSAmJiAhaXNTcGFj
ZShzdHJpbmdbY3VycmVudFBvc10pKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChp
c1NwYWNlKHN0cmluZ1tjdXJyZW50UG9zXSkpCisgICAgICAgICAgICBoYXZlU3BhY2UgPSB0cnVl
OworICAgICAgICArK2N1cnJlbnRQb3M7CisgICAgfQorICAgIHJldHVybiBjdXJyZW50UG9zOwor
fQorCitpbnQgV29yZEJyZWFrSXRlcmF0b3I6OnByZXZpb3VzKCkKK3sKKyAgICBpZiAoIWN1cnJl
bnRQb3MpIHsKKyAgICAgICAgY3VycmVudFBvcyA9IC0xOworICAgICAgICByZXR1cm4gY3VycmVu
dFBvczsKKyAgICB9CisgICAgYm9vbCBoYXZlU3BhY2UgPSBmYWxzZTsKKyAgICB3aGlsZSAoY3Vy
cmVudFBvcyA+IDApIHsKKyAgICAgICAgaWYgKGhhdmVTcGFjZSAmJiAhaXNTcGFjZShzdHJpbmdb
Y3VycmVudFBvc10pKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChpc1NwYWNlKHN0
cmluZ1tjdXJyZW50UG9zXSkpCisgICAgICAgICAgICBoYXZlU3BhY2UgPSB0cnVlOworICAgICAg
ICAtLWN1cnJlbnRQb3M7CisgICAgfQorICAgIHJldHVybiBjdXJyZW50UG9zOworfQorCitpbnQg
Q2hhckJyZWFrSXRlcmF0b3I6OmZpcnN0KCkKK3sKKyAgICBjdXJyZW50UG9zID0gMDsKKyAgICBy
ZXR1cm4gY3VycmVudFBvczsKK30KKworaW50IENoYXJCcmVha0l0ZXJhdG9yOjpuZXh0KCkKK3sK
KyAgICBpZiAoY3VycmVudFBvcyA+PSBsZW5ndGgpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAr
K2N1cnJlbnRQb3M7CisgICAgd2hpbGUgKGN1cnJlbnRQb3MgPCBsZW5ndGggJiYgIWlzQ2hhclN0
b3Aoc3RyaW5nW2N1cnJlbnRQb3NdKSkKKyAgICAgICAgKytjdXJyZW50UG9zOworICAgIHJldHVy
biBjdXJyZW50UG9zOworfQorCitpbnQgQ2hhckJyZWFrSXRlcmF0b3I6OnByZXZpb3VzKCkKK3sK
KyAgICBpZiAoY3VycmVudFBvcyA8PSAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGN1
cnJlbnRQb3MgPiBsZW5ndGgpCisgICAgICAgIGN1cnJlbnRQb3MgPSBsZW5ndGg7CisgICAgLS1j
dXJyZW50UG9zOworICAgIHdoaWxlIChjdXJyZW50UG9zID4gMCAmJiAhaXNDaGFyU3RvcChzdHJp
bmdbY3VycmVudFBvc10pKQorICAgICAgICAtLWN1cnJlbnRQb3M7CisgICAgcmV0dXJuIGN1cnJl
bnRQb3M7Cit9CisKK2ludCBMaW5lQnJlYWtJdGVyYXRvcjo6Zmlyc3QoKQoreworICAgIGN1cnJl
bnRQb3MgPSAwOworICAgIHJldHVybiBjdXJyZW50UG9zOworfQorCitpbnQgTGluZUJyZWFrSXRl
cmF0b3I6Om5leHQoKQoreworICAgIGlmIChjdXJyZW50UG9zID09IGxlbmd0aCkgeworICAgICAg
ICBjdXJyZW50UG9zID0gLTE7CisgICAgICAgIHJldHVybiBjdXJyZW50UG9zOworICAgIH0KKyAg
ICBib29sIGhhdmVTcGFjZSA9IGZhbHNlOworICAgIHdoaWxlIChjdXJyZW50UG9zIDwgbGVuZ3Ro
KSB7CisgICAgICAgIGlmIChoYXZlU3BhY2UgJiYgIWlzTGluZVN0b3Aoc3RyaW5nW2N1cnJlbnRQ
b3NdKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoaXNMaW5lU3RvcChzdHJpbmdb
Y3VycmVudFBvc10pKQorICAgICAgICAgICAgaGF2ZVNwYWNlID0gdHJ1ZTsKKyAgICAgICAgKytj
dXJyZW50UG9zOworICAgIH0KKyAgICByZXR1cm4gY3VycmVudFBvczsKK30KKworaW50IExpbmVC
cmVha0l0ZXJhdG9yOjpwcmV2aW91cygpCit7CisgICAgaWYgKCFjdXJyZW50UG9zKSB7CisgICAg
ICAgIGN1cnJlbnRQb3MgPSAtMTsKKyAgICAgICAgcmV0dXJuIGN1cnJlbnRQb3M7CisgICAgfQor
ICAgIGJvb2wgaGF2ZVNwYWNlID0gZmFsc2U7CisgICAgd2hpbGUgKGN1cnJlbnRQb3MgPiAwKSB7
CisgICAgICAgIGlmIChoYXZlU3BhY2UgJiYgIWlzTGluZVN0b3Aoc3RyaW5nW2N1cnJlbnRQb3Nd
KSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoaXNMaW5lU3RvcChzdHJpbmdbY3Vy
cmVudFBvc10pKQorICAgICAgICAgICAgaGF2ZVNwYWNlID0gdHJ1ZTsKKyAgICAgICAgLS1jdXJy
ZW50UG9zOworICAgIH0KKyAgICByZXR1cm4gY3VycmVudFBvczsKK30KKworaW50IFNlbnRlbmNl
QnJlYWtJdGVyYXRvcjo6Zmlyc3QoKQoreworICAgIGN1cnJlbnRQb3MgPSAwOworICAgIHJldHVy
biBjdXJyZW50UG9zOworfQorCitpbnQgU2VudGVuY2VCcmVha0l0ZXJhdG9yOjpuZXh0KCkKK3sK
KyAgICBpZiAoY3VycmVudFBvcyA9PSBsZW5ndGgpIHsKKyAgICAgICAgY3VycmVudFBvcyA9IC0x
OworICAgICAgICByZXR1cm4gY3VycmVudFBvczsKKyAgICB9CisgICAgYm9vbCBoYXZlU3BhY2Ug
PSBmYWxzZTsKKyAgICB3aGlsZSAoY3VycmVudFBvcyA8IGxlbmd0aCkgeworICAgICAgICBpZiAo
aGF2ZVNwYWNlICYmICFpc1NlbnRlbmNlU3RvcChzdHJpbmdbY3VycmVudFBvc10pKQorICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIGlmIChpc1NlbnRlbmNlU3RvcChzdHJpbmdbY3VycmVudFBv
c10pKQorICAgICAgICAgICAgaGF2ZVNwYWNlID0gdHJ1ZTsKKyAgICAgICAgKytjdXJyZW50UG9z
OworICAgIH0KKyAgICByZXR1cm4gY3VycmVudFBvczsKK30KKworaW50IFNlbnRlbmNlQnJlYWtJ
dGVyYXRvcjo6cHJldmlvdXMoKQoreworICAgIGlmICghY3VycmVudFBvcykgeworICAgICAgICBj
dXJyZW50UG9zID0gLTE7CisgICAgICAgIHJldHVybiBjdXJyZW50UG9zOworICAgIH0KKyAgICBi
b29sIGhhdmVTcGFjZSA9IGZhbHNlOworICAgIHdoaWxlIChjdXJyZW50UG9zID4gMCkgeworICAg
ICAgICBpZiAoaGF2ZVNwYWNlICYmICFpc1NlbnRlbmNlU3RvcChzdHJpbmdbY3VycmVudFBvc10p
KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChpc1NlbnRlbmNlU3RvcChzdHJpbmdb
Y3VycmVudFBvc10pKQorICAgICAgICAgICAgaGF2ZVNwYWNlID0gdHJ1ZTsKKyAgICAgICAgLS1j
dXJyZW50UG9zOworICAgIH0KKyAgICByZXR1cm4gY3VycmVudFBvczsKK30KKworVGV4dEJyZWFr
SXRlcmF0b3IqIHdvcmRCcmVha0l0ZXJhdG9yKGNvbnN0IFVDaGFyKiBzdHJpbmcsIGludCBsZW5n
dGgpCit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChXb3JkQnJlYWtJdGVyYXRvciwgaXRlcmF0
b3IsICgpKTsKKyAgICBpdGVyYXRvci5yZXNldChzdHJpbmcsIGxlbmd0aCk7CisgICAgcmV0dXJu
ICZpdGVyYXRvcjsKK30KKworVGV4dEJyZWFrSXRlcmF0b3IqIGNoYXJhY3RlckJyZWFrSXRlcmF0
b3IoY29uc3QgVUNoYXIqIHN0cmluZywgaW50IGxlbmd0aCkKK3sKKyAgICBERUZJTkVfU1RBVElD
X0xPQ0FMKENoYXJCcmVha0l0ZXJhdG9yLCBpdGVyYXRvciwgKCkpOworICAgIGl0ZXJhdG9yLnJl
c2V0KHN0cmluZywgbGVuZ3RoKTsKKyAgICByZXR1cm4gJml0ZXJhdG9yOworfQorCitUZXh0QnJl
YWtJdGVyYXRvciogbGluZUJyZWFrSXRlcmF0b3IoY29uc3QgVUNoYXIqIHN0cmluZywgaW50IGxl
bmd0aCkKK3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKExpbmVCcmVha0l0ZXJhdG9yICwgaXRl
cmF0b3IsICgpKTsKKyAgICBpdGVyYXRvci5yZXNldChzdHJpbmcsIGxlbmd0aCk7CisgICAgcmV0
dXJuICZpdGVyYXRvcjsKK30KKworVGV4dEJyZWFrSXRlcmF0b3IqIHNlbnRlbmNlQnJlYWtJdGVy
YXRvcihjb25zdCBVQ2hhciogc3RyaW5nLCBpbnQgbGVuZ3RoKQoreworICAgIERFRklORV9TVEFU
SUNfTE9DQUwoU2VudGVuY2VCcmVha0l0ZXJhdG9yLCBpdGVyYXRvciwgKCkpOworICAgIGl0ZXJh
dG9yLnJlc2V0KHN0cmluZywgbGVuZ3RoKTsKKyAgICByZXR1cm4gJml0ZXJhdG9yOworfQorCitp
bnQgdGV4dEJyZWFrRmlyc3QoVGV4dEJyZWFrSXRlcmF0b3IqIGJyZWFrSXRlcmF0b3IpCit7Cisg
ICAgcmV0dXJuIGJyZWFrSXRlcmF0b3ItPmZpcnN0KCk7Cit9CisKK2ludCB0ZXh0QnJlYWtOZXh0
KFRleHRCcmVha0l0ZXJhdG9yKiBicmVha0l0ZXJhdG9yKQoreworICAgIHJldHVybiBicmVha0l0
ZXJhdG9yLT5uZXh0KCk7Cit9CisKK2ludCB0ZXh0QnJlYWtQcmVjZWRpbmcoVGV4dEJyZWFrSXRl
cmF0b3IqIGJyZWFrSXRlcmF0b3IsIGludCBwb3NpdGlvbikKK3sKKyAgICByZXR1cm4gYnJlYWtJ
dGVyYXRvci0+cHJlY2VkaW5nKHBvc2l0aW9uKTsKK30KKworaW50IHRleHRCcmVha0ZvbGxvd2lu
ZyhUZXh0QnJlYWtJdGVyYXRvciogYnJlYWtJdGVyYXRvciwgaW50IHBvc2l0aW9uKQoreworICAg
IHJldHVybiBicmVha0l0ZXJhdG9yLT5mb2xsb3dpbmcocG9zaXRpb24pOworfQorCitpbnQgdGV4
dEJyZWFrQ3VycmVudChUZXh0QnJlYWtJdGVyYXRvciogYnJlYWtJdGVyYXRvcikKK3sKKyAgICBy
ZXR1cm4gYnJlYWtJdGVyYXRvci0+Y3VycmVudFBvczsKK30KKworYm9vbCBpc1RleHRCcmVhayhU
ZXh0QnJlYWtJdGVyYXRvciosIGludCkKK3sKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworVGV4dEJy
ZWFrSXRlcmF0b3IqIGN1cnNvck1vdmVtZW50SXRlcmF0b3IoY29uc3QgVUNoYXIqIHN0cmluZywg
aW50IGxlbmd0aCkKK3sKKyAgICByZXR1cm4gY2hhcmFjdGVyQnJlYWtJdGVyYXRvcihzdHJpbmcs
IGxlbmd0aCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vdGV4dC93aW5jZS9UZXh0QnJlYWtJdGVyYXRvcldpbmNlLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3BsYXRmb3JtL3RleHQvd2luY2UvVGV4dEJyZWFrSXRlcmF0b3JXaW5jZS5jcHAJ
KHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L3dpbmNlL1RleHRCcmVh
a0l0ZXJhdG9yV2luY2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMxMiArMCwwIEBACi0vKgot
ICogQ29weXJpZ2h0IChDKSAyMDA2IExhcnMgS25vbGwgPGxhcnNAdHJvbGx0ZWNoLmNvbT4KLSAq
IENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLgotICoKLSAqIFRoaXMg
bGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IK
LSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIg
b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJp
YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VU
IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBN
RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg
dGhlIEdOVQotICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp
bHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7
IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAqIHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwK
LSAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqLwotCi0jaW5jbHVkZSAiY29u
ZmlnLmgiCi0jaW5jbHVkZSAiVGV4dEJyZWFrSXRlcmF0b3IuaCIKLQotI2luY2x1ZGUgIlBsYXRm
b3JtU3RyaW5nLmgiCi0jaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgotI2luY2x1ZGUgPHd0
Zi91bmljb2RlL1VuaWNvZGUuaD4KLQotdXNpbmcgbmFtZXNwYWNlIFdURjo6VW5pY29kZTsKLQot
bmFtZXNwYWNlIFdlYkNvcmUgewotCi0vLyBIYWNrLCBub3QgZW50aXJlbHkgY29ycmVjdAotc3Rh
dGljIGlubGluZSBib29sIGlzQ2hhclN0b3AoVUNoYXIgYykKLXsKLSAgICBDaGFyQ2F0ZWdvcnkg
Y2hhckNhdGVnb3J5ID0gY2F0ZWdvcnkoYyk7Ci0gICAgcmV0dXJuIGNoYXJDYXRlZ29yeSAhPSBN
YXJrX05vblNwYWNpbmcgJiYgKGNoYXJDYXRlZ29yeSAhPSBPdGhlcl9TdXJyb2dhdGUgfHwgKGMg
PCAweGQ4MDAgfHwgYyA+PSAweGRjMDApKTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGlzTGlu
ZVN0b3AoVUNoYXIgYykKLXsKLSAgICByZXR1cm4gY2F0ZWdvcnkoYykgIT0gU2VwYXJhdG9yX0xp
bmU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc1NlbnRlbmNlU3RvcChVQ2hhciBjKQotewot
ICAgIHJldHVybiBpc1B1bmN0KGMpOwotfQotCi1jbGFzcyBUZXh0QnJlYWtJdGVyYXRvciB7Ci1w
dWJsaWM6Ci0gICAgdm9pZCByZXNldChjb25zdCBVQ2hhciogc3RyLCBpbnQgbGVuKQotICAgIHsK
LSAgICAgICAgc3RyaW5nID0gc3RyOwotICAgICAgICBsZW5ndGggPSBsZW47Ci0gICAgICAgIGN1
cnJlbnRQb3MgPSAwOwotICAgIH0KLSAgICB2aXJ0dWFsIGludCBmaXJzdCgpID0gMDsKLSAgICB2
aXJ0dWFsIGludCBuZXh0KCkgPSAwOwotICAgIHZpcnR1YWwgaW50IHByZXZpb3VzKCkgPSAwOwot
ICAgIGludCBmb2xsb3dpbmcoaW50IHBvc2l0aW9uKQotICAgIHsKLSAgICAgICAgY3VycmVudFBv
cyA9IHBvc2l0aW9uOwotICAgICAgICByZXR1cm4gbmV4dCgpOwotICAgIH0KLSAgICBpbnQgcHJl
Y2VkaW5nKGludCBwb3NpdGlvbikKLSAgICB7Ci0gICAgICAgIGN1cnJlbnRQb3MgPSBwb3NpdGlv
bjsKLSAgICAgICAgcmV0dXJuIHByZXZpb3VzKCk7Ci0gICAgfQotCi0gICAgaW50IGN1cnJlbnRQ
b3M7Ci0gICAgY29uc3QgVUNoYXIqIHN0cmluZzsKLSAgICBpbnQgbGVuZ3RoOwotfTsKLQotc3Ry
dWN0IFdvcmRCcmVha0l0ZXJhdG9yOiBUZXh0QnJlYWtJdGVyYXRvciB7Ci0gICAgdmlydHVhbCBp
bnQgZmlyc3QoKTsKLSAgICB2aXJ0dWFsIGludCBuZXh0KCk7Ci0gICAgdmlydHVhbCBpbnQgcHJl
dmlvdXMoKTsKLX07Ci0KLXN0cnVjdCBDaGFyQnJlYWtJdGVyYXRvcjogVGV4dEJyZWFrSXRlcmF0
b3IgewotICAgIHZpcnR1YWwgaW50IGZpcnN0KCk7Ci0gICAgdmlydHVhbCBpbnQgbmV4dCgpOwot
ICAgIHZpcnR1YWwgaW50IHByZXZpb3VzKCk7Ci19OwotCi1zdHJ1Y3QgTGluZUJyZWFrSXRlcmF0
b3I6IFRleHRCcmVha0l0ZXJhdG9yIHsKLSAgICB2aXJ0dWFsIGludCBmaXJzdCgpOwotICAgIHZp
cnR1YWwgaW50IG5leHQoKTsKLSAgICB2aXJ0dWFsIGludCBwcmV2aW91cygpOwotfTsKLQotc3Ry
dWN0IFNlbnRlbmNlQnJlYWtJdGVyYXRvciA6IFRleHRCcmVha0l0ZXJhdG9yIHsKLSAgICB2aXJ0
dWFsIGludCBmaXJzdCgpOwotICAgIHZpcnR1YWwgaW50IG5leHQoKTsKLSAgICB2aXJ0dWFsIGlu
dCBwcmV2aW91cygpOwotfTsKLQotaW50IFdvcmRCcmVha0l0ZXJhdG9yOjpmaXJzdCgpCi17Ci0g
ICAgY3VycmVudFBvcyA9IDA7Ci0gICAgcmV0dXJuIGN1cnJlbnRQb3M7Ci19Ci0KLWludCBXb3Jk
QnJlYWtJdGVyYXRvcjo6bmV4dCgpCi17Ci0gICAgaWYgKGN1cnJlbnRQb3MgPT0gbGVuZ3RoKSB7
Ci0gICAgICAgIGN1cnJlbnRQb3MgPSAtMTsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnRQb3M7Ci0g
ICAgfQotICAgIGJvb2wgaGF2ZVNwYWNlID0gZmFsc2U7Ci0gICAgd2hpbGUgKGN1cnJlbnRQb3Mg
PCBsZW5ndGgpIHsKLSAgICAgICAgaWYgKGhhdmVTcGFjZSAmJiAhaXNTcGFjZShzdHJpbmdbY3Vy
cmVudFBvc10pKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmIChpc1NwYWNlKHN0cmlu
Z1tjdXJyZW50UG9zXSkpCi0gICAgICAgICAgICBoYXZlU3BhY2UgPSB0cnVlOwotICAgICAgICAr
K2N1cnJlbnRQb3M7Ci0gICAgfQotICAgIHJldHVybiBjdXJyZW50UG9zOwotfQotCi1pbnQgV29y
ZEJyZWFrSXRlcmF0b3I6OnByZXZpb3VzKCkKLXsKLSAgICBpZiAoIWN1cnJlbnRQb3MpIHsKLSAg
ICAgICAgY3VycmVudFBvcyA9IC0xOwotICAgICAgICByZXR1cm4gY3VycmVudFBvczsKLSAgICB9
Ci0gICAgYm9vbCBoYXZlU3BhY2UgPSBmYWxzZTsKLSAgICB3aGlsZSAoY3VycmVudFBvcyA+IDAp
IHsKLSAgICAgICAgaWYgKGhhdmVTcGFjZSAmJiAhaXNTcGFjZShzdHJpbmdbY3VycmVudFBvc10p
KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmIChpc1NwYWNlKHN0cmluZ1tjdXJyZW50
UG9zXSkpCi0gICAgICAgICAgICBoYXZlU3BhY2UgPSB0cnVlOwotICAgICAgICAtLWN1cnJlbnRQ
b3M7Ci0gICAgfQotICAgIHJldHVybiBjdXJyZW50UG9zOwotfQotCi1pbnQgQ2hhckJyZWFrSXRl
cmF0b3I6OmZpcnN0KCkKLXsKLSAgICBjdXJyZW50UG9zID0gMDsKLSAgICByZXR1cm4gY3VycmVu
dFBvczsKLX0KLQotaW50IENoYXJCcmVha0l0ZXJhdG9yOjpuZXh0KCkKLXsKLSAgICBpZiAoY3Vy
cmVudFBvcyA+PSBsZW5ndGgpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICArK2N1cnJlbnRQb3M7
Ci0gICAgd2hpbGUgKGN1cnJlbnRQb3MgPCBsZW5ndGggJiYgIWlzQ2hhclN0b3Aoc3RyaW5nW2N1
cnJlbnRQb3NdKSkKLSAgICAgICAgKytjdXJyZW50UG9zOwotICAgIHJldHVybiBjdXJyZW50UG9z
OwotfQotCi1pbnQgQ2hhckJyZWFrSXRlcmF0b3I6OnByZXZpb3VzKCkKLXsKLSAgICBpZiAoY3Vy
cmVudFBvcyA8PSAwKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgaWYgKGN1cnJlbnRQb3MgPiBs
ZW5ndGgpCi0gICAgICAgIGN1cnJlbnRQb3MgPSBsZW5ndGg7Ci0gICAgLS1jdXJyZW50UG9zOwot
ICAgIHdoaWxlIChjdXJyZW50UG9zID4gMCAmJiAhaXNDaGFyU3RvcChzdHJpbmdbY3VycmVudFBv
c10pKQotICAgICAgICAtLWN1cnJlbnRQb3M7Ci0gICAgcmV0dXJuIGN1cnJlbnRQb3M7Ci19Ci0K
LWludCBMaW5lQnJlYWtJdGVyYXRvcjo6Zmlyc3QoKQotewotICAgIGN1cnJlbnRQb3MgPSAwOwot
ICAgIHJldHVybiBjdXJyZW50UG9zOwotfQotCi1pbnQgTGluZUJyZWFrSXRlcmF0b3I6Om5leHQo
KQotewotICAgIGlmIChjdXJyZW50UG9zID09IGxlbmd0aCkgewotICAgICAgICBjdXJyZW50UG9z
ID0gLTE7Ci0gICAgICAgIHJldHVybiBjdXJyZW50UG9zOwotICAgIH0KLSAgICBib29sIGhhdmVT
cGFjZSA9IGZhbHNlOwotICAgIHdoaWxlIChjdXJyZW50UG9zIDwgbGVuZ3RoKSB7Ci0gICAgICAg
IGlmIChoYXZlU3BhY2UgJiYgIWlzTGluZVN0b3Aoc3RyaW5nW2N1cnJlbnRQb3NdKSkKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICBpZiAoaXNMaW5lU3RvcChzdHJpbmdbY3VycmVudFBvc10p
KQotICAgICAgICAgICAgaGF2ZVNwYWNlID0gdHJ1ZTsKLSAgICAgICAgKytjdXJyZW50UG9zOwot
ICAgIH0KLSAgICByZXR1cm4gY3VycmVudFBvczsKLX0KLQotaW50IExpbmVCcmVha0l0ZXJhdG9y
OjpwcmV2aW91cygpCi17Ci0gICAgaWYgKCFjdXJyZW50UG9zKSB7Ci0gICAgICAgIGN1cnJlbnRQ
b3MgPSAtMTsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnRQb3M7Ci0gICAgfQotICAgIGJvb2wgaGF2
ZVNwYWNlID0gZmFsc2U7Ci0gICAgd2hpbGUgKGN1cnJlbnRQb3MgPiAwKSB7Ci0gICAgICAgIGlm
IChoYXZlU3BhY2UgJiYgIWlzTGluZVN0b3Aoc3RyaW5nW2N1cnJlbnRQb3NdKSkKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICBpZiAoaXNMaW5lU3RvcChzdHJpbmdbY3VycmVudFBvc10pKQot
ICAgICAgICAgICAgaGF2ZVNwYWNlID0gdHJ1ZTsKLSAgICAgICAgLS1jdXJyZW50UG9zOwotICAg
IH0KLSAgICByZXR1cm4gY3VycmVudFBvczsKLX0KLQotaW50IFNlbnRlbmNlQnJlYWtJdGVyYXRv
cjo6Zmlyc3QoKQotewotICAgIGN1cnJlbnRQb3MgPSAwOwotICAgIHJldHVybiBjdXJyZW50UG9z
OwotfQotCi1pbnQgU2VudGVuY2VCcmVha0l0ZXJhdG9yOjpuZXh0KCkKLXsKLSAgICBpZiAoY3Vy
cmVudFBvcyA9PSBsZW5ndGgpIHsKLSAgICAgICAgY3VycmVudFBvcyA9IC0xOwotICAgICAgICBy
ZXR1cm4gY3VycmVudFBvczsKLSAgICB9Ci0gICAgYm9vbCBoYXZlU3BhY2UgPSBmYWxzZTsKLSAg
ICB3aGlsZSAoY3VycmVudFBvcyA8IGxlbmd0aCkgewotICAgICAgICBpZiAoaGF2ZVNwYWNlICYm
ICFpc1NlbnRlbmNlU3RvcChzdHJpbmdbY3VycmVudFBvc10pKQotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIGlmIChpc1NlbnRlbmNlU3RvcChzdHJpbmdbY3VycmVudFBvc10pKQotICAgICAg
ICAgICAgaGF2ZVNwYWNlID0gdHJ1ZTsKLSAgICAgICAgKytjdXJyZW50UG9zOwotICAgIH0KLSAg
ICByZXR1cm4gY3VycmVudFBvczsKLX0KLQotaW50IFNlbnRlbmNlQnJlYWtJdGVyYXRvcjo6cHJl
dmlvdXMoKQotewotICAgIGlmICghY3VycmVudFBvcykgewotICAgICAgICBjdXJyZW50UG9zID0g
LTE7Ci0gICAgICAgIHJldHVybiBjdXJyZW50UG9zOwotICAgIH0KLSAgICBib29sIGhhdmVTcGFj
ZSA9IGZhbHNlOwotICAgIHdoaWxlIChjdXJyZW50UG9zID4gMCkgewotICAgICAgICBpZiAoaGF2
ZVNwYWNlICYmICFpc1NlbnRlbmNlU3RvcChzdHJpbmdbY3VycmVudFBvc10pKQotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGlmIChpc1NlbnRlbmNlU3RvcChzdHJpbmdbY3VycmVudFBvc10p
KQotICAgICAgICAgICAgaGF2ZVNwYWNlID0gdHJ1ZTsKLSAgICAgICAgLS1jdXJyZW50UG9zOwot
ICAgIH0KLSAgICByZXR1cm4gY3VycmVudFBvczsKLX0KLQotVGV4dEJyZWFrSXRlcmF0b3IqIHdv
cmRCcmVha0l0ZXJhdG9yKGNvbnN0IFVDaGFyKiBzdHJpbmcsIGludCBsZW5ndGgpCi17Ci0gICAg
REVGSU5FX1NUQVRJQ19MT0NBTChXb3JkQnJlYWtJdGVyYXRvciwgaXRlcmF0b3IsICgpKTsKLSAg
ICBpdGVyYXRvci5yZXNldChzdHJpbmcsIGxlbmd0aCk7Ci0gICAgcmV0dXJuICZpdGVyYXRvcjsK
LX0KLQotVGV4dEJyZWFrSXRlcmF0b3IqIGNoYXJhY3RlckJyZWFrSXRlcmF0b3IoY29uc3QgVUNo
YXIqIHN0cmluZywgaW50IGxlbmd0aCkKLXsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKENoYXJC
cmVha0l0ZXJhdG9yLCBpdGVyYXRvciwgKCkpOwotICAgIGl0ZXJhdG9yLnJlc2V0KHN0cmluZywg
bGVuZ3RoKTsKLSAgICByZXR1cm4gJml0ZXJhdG9yOwotfQotCi1UZXh0QnJlYWtJdGVyYXRvciog
bGluZUJyZWFrSXRlcmF0b3IoY29uc3QgVUNoYXIqIHN0cmluZywgaW50IGxlbmd0aCkKLXsKLSAg
ICBERUZJTkVfU1RBVElDX0xPQ0FMKExpbmVCcmVha0l0ZXJhdG9yICwgaXRlcmF0b3IsICgpKTsK
LSAgICBpdGVyYXRvci5yZXNldChzdHJpbmcsIGxlbmd0aCk7Ci0gICAgcmV0dXJuICZpdGVyYXRv
cjsKLX0KLQotVGV4dEJyZWFrSXRlcmF0b3IqIHNlbnRlbmNlQnJlYWtJdGVyYXRvcihjb25zdCBV
Q2hhciogc3RyaW5nLCBpbnQgbGVuZ3RoKQotewotICAgIERFRklORV9TVEFUSUNfTE9DQUwoU2Vu
dGVuY2VCcmVha0l0ZXJhdG9yLCBpdGVyYXRvciwgKCkpOwotICAgIGl0ZXJhdG9yLnJlc2V0KHN0
cmluZywgbGVuZ3RoKTsKLSAgICByZXR1cm4gJml0ZXJhdG9yOwotfQotCi1pbnQgdGV4dEJyZWFr
Rmlyc3QoVGV4dEJyZWFrSXRlcmF0b3IqIGJyZWFrSXRlcmF0b3IpCi17Ci0gICAgcmV0dXJuIGJy
ZWFrSXRlcmF0b3ItPmZpcnN0KCk7Ci19Ci0KLWludCB0ZXh0QnJlYWtOZXh0KFRleHRCcmVha0l0
ZXJhdG9yKiBicmVha0l0ZXJhdG9yKQotewotICAgIHJldHVybiBicmVha0l0ZXJhdG9yLT5uZXh0
KCk7Ci19Ci0KLWludCB0ZXh0QnJlYWtQcmVjZWRpbmcoVGV4dEJyZWFrSXRlcmF0b3IqIGJyZWFr
SXRlcmF0b3IsIGludCBwb3NpdGlvbikKLXsKLSAgICByZXR1cm4gYnJlYWtJdGVyYXRvci0+cHJl
Y2VkaW5nKHBvc2l0aW9uKTsKLX0KLQotaW50IHRleHRCcmVha0ZvbGxvd2luZyhUZXh0QnJlYWtJ
dGVyYXRvciogYnJlYWtJdGVyYXRvciwgaW50IHBvc2l0aW9uKQotewotICAgIHJldHVybiBicmVh
a0l0ZXJhdG9yLT5mb2xsb3dpbmcocG9zaXRpb24pOwotfQotCi1pbnQgdGV4dEJyZWFrQ3VycmVu
dChUZXh0QnJlYWtJdGVyYXRvciogYnJlYWtJdGVyYXRvcikKLXsKLSAgICByZXR1cm4gYnJlYWtJ
dGVyYXRvci0+Y3VycmVudFBvczsKLX0KLQotYm9vbCBpc1RleHRCcmVhayhUZXh0QnJlYWtJdGVy
YXRvciosIGludCkKLXsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotVGV4dEJyZWFrSXRlcmF0b3Iq
IGN1cnNvck1vdmVtZW50SXRlcmF0b3IoY29uc3QgVUNoYXIqIHN0cmluZywgaW50IGxlbmd0aCkK
LXsKLSAgICByZXR1cm4gY2hhcmFjdGVyQnJlYWtJdGVyYXRvcihzdHJpbmcsIGxlbmd0aCk7Ci19
Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luY2Uv
Q3Vyc29yV2luQ0UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvQ3Vy
c29yV2luQ0UuY3BwCShyZXZpc2lvbiA1NzI4OSkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS93aW5j
ZS9DdXJzb3JXaW5jZS5jcHA6NTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0N1cnNv
cldpbkNFLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAwOC0yMDA5IFRvcmNoIE1vYmlsZSBJbmMuCisgKgorICogVGhpcyBsaWJyYXJ5
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK
KyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24p
IGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBp
biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdB
UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
CisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAq
CisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRo
ZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAq
IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJDdXJzb3IuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdHJ1Y3QgQWxs
Q3Vyc29ycyB7CisgICAgQWxsQ3Vyc29ycygpCisgICAgeworICAgICAgICBmb3IgKGludCBpID0g
MDsgaSA8IE51bUN1cnNvclR5cGVzOyArK2kpCisgICAgICAgICAgICBtX2N1cnNvcnNbaV0gPSAo
Q3Vyc29yVHlwZSkgaTsKKyAgICB9CisgICAgQ3Vyc29yIG1fY3Vyc29yc1tOdW1DdXJzb3JUeXBl
c107Cit9OworCitzdGF0aWMgY29uc3QgQ3Vyc29yJiBnZXRDdXJzb3IoQ3Vyc29yVHlwZSB0eXBl
KQoreworICAgIHN0YXRpYyBBbGxDdXJzb3JzIGFsbEN1cnNvcnM7CisgICAgcmV0dXJuIGFsbEN1
cnNvcnMubV9jdXJzb3JzW3R5cGVdOworfQorCitDdXJzb3I6OkN1cnNvcihjb25zdCBDdXJzb3Im
IG90aGVyKQorOiBtX2ltcGwob3RoZXIubV9pbXBsKQoreworfQorCitDdXJzb3I6OkN1cnNvcihJ
bWFnZSogaW1nLCBjb25zdCBJbnRQb2ludCYgaG90c3BvdCkKKzogbV9pbXBsKEN1cnNvck5vbmUp
Cit7Cit9CisKK0N1cnNvcjo6fkN1cnNvcigpCit7Cit9CisKK0N1cnNvciYgQ3Vyc29yOjpvcGVy
YXRvcj0oY29uc3QgQ3Vyc29yJiBvdGhlcikKK3sKKyAgICBtX2ltcGwgPSBvdGhlci5tX2ltcGw7
CisgICAgcmV0dXJuICp0aGlzOworfQorCitDdXJzb3I6OkN1cnNvcihQbGF0Zm9ybUN1cnNvciBj
KQorOiBtX2ltcGwoYykKK3sKK30KKworY29uc3QgQ3Vyc29yJiBub25lQ3Vyc29yKCkgeyByZXR1
cm4gZ2V0Q3Vyc29yKEN1cnNvck5vbmUpOyB9Citjb25zdCBDdXJzb3ImIHBvaW50ZXJDdXJzb3Io
KSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yUG9pbnRlcik7IH0KK2NvbnN0IEN1cnNvciYgY3Jv
c3NDdXJzb3IoKSAgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvckNyb3NzKTsgfQorY29uc3QgQ3Vy
c29yJiBoYW5kQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvckhhbmQpOyB9Citjb25z
dCBDdXJzb3ImIGlCZWFtQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvckJlYW0pOyB9
Citjb25zdCBDdXJzb3ImIHdhaXRDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yV2Fp
dCk7IH0KK2NvbnN0IEN1cnNvciYgaGVscEN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJz
b3JIZWxwKTsgfQorY29uc3QgQ3Vyc29yJiBtb3ZlQ3Vyc29yKCkgIHsgcmV0dXJuIGdldEN1cnNv
cihDdXJzb3JNb3ZlKTsgfQorY29uc3QgQ3Vyc29yJiBlYXN0UmVzaXplQ3Vyc29yKCkgeyByZXR1
cm4gZ2V0Q3Vyc29yKEN1cnNvckVhc3RSZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIG5vcnRoUmVz
aXplQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvck5vcnRoUmVzaXplKTsgfQorY29u
c3QgQ3Vyc29yJiBub3J0aEVhc3RSZXNpemVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vy
c29yTm9ydGhFYXN0UmVzaXplKTsgfQorY29uc3QgQ3Vyc29yJiBub3J0aFdlc3RSZXNpemVDdXJz
b3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yTm9ydGhXZXN0UmVzaXplKTsgfQorY29uc3Qg
Q3Vyc29yJiBzb3V0aFJlc2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JTb3V0
aFJlc2l6ZSk7IH0KK2NvbnN0IEN1cnNvciYgc291dGhFYXN0UmVzaXplQ3Vyc29yKCkgeyByZXR1
cm4gZ2V0Q3Vyc29yKEN1cnNvclNvdXRoRWFzdFJlc2l6ZSk7IH0KK2NvbnN0IEN1cnNvciYgc291
dGhXZXN0UmVzaXplQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvclNvdXRoV2VzdFJl
c2l6ZSk7IH0KK2NvbnN0IEN1cnNvciYgd2VzdFJlc2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1
cnNvcihDdXJzb3JXZXN0UmVzaXplKTsgfQorY29uc3QgQ3Vyc29yJiBub3J0aFNvdXRoUmVzaXpl
Q3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvck5vcnRoU291dGhSZXNpemUpOyB9Citj
b25zdCBDdXJzb3ImIGVhc3RXZXN0UmVzaXplQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1
cnNvckVhc3RXZXN0UmVzaXplKTsgfQorY29uc3QgQ3Vyc29yJiBub3J0aEVhc3RTb3V0aFdlc3RS
ZXNpemVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yTm9ydGhFYXN0U291dGhXZXN0
UmVzaXplKTsgfQorY29uc3QgQ3Vyc29yJiBub3J0aFdlc3RTb3V0aEVhc3RSZXNpemVDdXJzb3Io
KSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yTm9ydGhXZXN0U291dGhFYXN0UmVzaXplKTsgfQor
Y29uc3QgQ3Vyc29yJiBjb2x1bW5SZXNpemVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vy
c29yQ29sdW1uUmVzaXplKTsgfQorY29uc3QgQ3Vyc29yJiByb3dSZXNpemVDdXJzb3IoKSB7IHJl
dHVybiBnZXRDdXJzb3IoQ3Vyc29yUm93UmVzaXplKTsgfQorY29uc3QgQ3Vyc29yJiB2ZXJ0aWNh
bFRleHRDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yVmVydGljYWxUZXh0KTsgfQor
Y29uc3QgQ3Vyc29yJiBjZWxsQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvckNlbGwp
OyB9Citjb25zdCBDdXJzb3ImIGNvbnRleHRNZW51Q3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29y
KEN1cnNvckNvbnRleHRNZW51KTsgfQorY29uc3QgQ3Vyc29yJiBub0Ryb3BDdXJzb3IoKSB7IHJl
dHVybiBnZXRDdXJzb3IoQ3Vyc29yTm9Ecm9wKTsgfQorY29uc3QgQ3Vyc29yJiBub3RBbGxvd2Vk
Q3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvck5vdEFsbG93ZWQpOyB9Citjb25zdCBD
dXJzb3ImIHByb2dyZXNzQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvclByb2dyZXNz
KTsgfQorY29uc3QgQ3Vyc29yJiBhbGlhc0N1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJz
b3JBbGlhcyk7IH0KK2NvbnN0IEN1cnNvciYgem9vbUluQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vy
c29yKEN1cnNvclpvb21Jbik7IH0KK2NvbnN0IEN1cnNvciYgem9vbU91dEN1cnNvcigpIHsgcmV0
dXJuIGdldEN1cnNvcihDdXJzb3Jab29tT3V0KTsgfQorY29uc3QgQ3Vyc29yJiBjb3B5Q3Vyc29y
KCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvckNvcHkpOyB9Citjb25zdCBDdXJzb3ImIG1pZGRs
ZVBhbm5pbmdDdXJzb3IoKSB7IHJldHVybiBjcm9zc0N1cnNvcigpOyB9Citjb25zdCBDdXJzb3Im
IGVhc3RQYW5uaW5nQ3Vyc29yKCkgeyByZXR1cm4gY3Jvc3NDdXJzb3IoKTsgfQorY29uc3QgQ3Vy
c29yJiBub3J0aFBhbm5pbmdDdXJzb3IoKSB7IHJldHVybiBjcm9zc0N1cnNvcigpOyB9Citjb25z
dCBDdXJzb3ImIG5vcnRoRWFzdFBhbm5pbmdDdXJzb3IoKSB7IHJldHVybiBjcm9zc0N1cnNvcigp
OyB9Citjb25zdCBDdXJzb3ImIG5vcnRoV2VzdFBhbm5pbmdDdXJzb3IoKSB7IHJldHVybiBjcm9z
c0N1cnNvcigpOyB9Citjb25zdCBDdXJzb3ImIHNvdXRoUGFubmluZ0N1cnNvcigpIHsgcmV0dXJu
IGNyb3NzQ3Vyc29yKCk7IH0KK2NvbnN0IEN1cnNvciYgc291dGhFYXN0UGFubmluZ0N1cnNvcigp
IHsgcmV0dXJuIGNyb3NzQ3Vyc29yKCk7IH0KK2NvbnN0IEN1cnNvciYgc291dGhXZXN0UGFubmlu
Z0N1cnNvcigpIHsgcmV0dXJuIGNyb3NzQ3Vyc29yKCk7IH0KK2NvbnN0IEN1cnNvciYgd2VzdFBh
bm5pbmdDdXJzb3IoKSB7IHJldHVybiBjcm9zc0N1cnNvcigpOyB9Citjb25zdCBDdXJzb3ImIGdy
YWJiaW5nQ3Vyc29yKCkgeyByZXR1cm4gbW92ZUN1cnNvcigpOyB9Citjb25zdCBDdXJzb3ImIGdy
YWJDdXJzb3IoKSB7IHJldHVybiBtb3ZlQ3Vyc29yKCk7IH0KKworfQpJbmRleDogV2ViQ29yZS9w
bGF0Zm9ybS93aW5jZS9DdXJzb3JXaW5DRS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0
Zm9ybS93aW5jZS9DdXJzb3JXaW5DRS5jcHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9w
bGF0Zm9ybS93aW5jZS9DdXJzb3JXaW5DRS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEwNiw0ICsx
MDYsNCBAQCBjb25zdCBDdXJzb3ImIHdlc3RQYW5uaW5nQ3Vyc29yKCkgeyByZXR1CiBjb25zdCBD
dXJzb3ImIGdyYWJiaW5nQ3Vyc29yKCkgeyByZXR1cm4gbW92ZUN1cnNvcigpOyB9CiBjb25zdCBD
dXJzb3ImIGdyYWJDdXJzb3IoKSB7IHJldHVybiBtb3ZlQ3Vyc29yKCk7IH0KIAotfQorfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DdXJzb3JXaW5j
ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DdXJzb3JXaW5jZS5j
cHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DdXJzb3JXaW5j
ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQg
KEMpIDIwMDgtMjAwOSBUb3JjaCBNb2JpbGUgSW5jLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBm
cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBp
dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gKiBM
aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo
ZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg
bGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhl
IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5U
WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJ
VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICog
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICog
WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmls
ZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0gKiBCb3N0
b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5j
bHVkZSAiQ3Vyc29yLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotc3RydWN0IEFsbEN1cnNv
cnMgewotICAgIEFsbEN1cnNvcnMoKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkg
PCBOdW1DdXJzb3JUeXBlczsgKytpKQotICAgICAgICAgICAgbV9jdXJzb3JzW2ldID0gKEN1cnNv
clR5cGUpIGk7Ci0gICAgfQotICAgIEN1cnNvciBtX2N1cnNvcnNbTnVtQ3Vyc29yVHlwZXNdOwot
fTsKLQotc3RhdGljIGNvbnN0IEN1cnNvciYgZ2V0Q3Vyc29yKEN1cnNvclR5cGUgdHlwZSkKLXsK
LSAgICBzdGF0aWMgQWxsQ3Vyc29ycyBhbGxDdXJzb3JzOwotICAgIHJldHVybiBhbGxDdXJzb3Jz
Lm1fY3Vyc29yc1t0eXBlXTsKLX0KLQotQ3Vyc29yOjpDdXJzb3IoY29uc3QgQ3Vyc29yJiBvdGhl
cikKLTogbV9pbXBsKG90aGVyLm1faW1wbCkKLXsKLX0KLQotQ3Vyc29yOjpDdXJzb3IoSW1hZ2Uq
IGltZywgY29uc3QgSW50UG9pbnQmIGhvdHNwb3QpCi06IG1faW1wbChDdXJzb3JOb25lKQotewot
fQotCi1DdXJzb3I6On5DdXJzb3IoKQotewotfQotCi1DdXJzb3ImIEN1cnNvcjo6b3BlcmF0b3I9
KGNvbnN0IEN1cnNvciYgb3RoZXIpCi17Ci0gICAgbV9pbXBsID0gb3RoZXIubV9pbXBsOwotICAg
IHJldHVybiAqdGhpczsKLX0KLQotQ3Vyc29yOjpDdXJzb3IoUGxhdGZvcm1DdXJzb3IgYykKLTog
bV9pbXBsKGMpCi17Ci19Ci0KLWNvbnN0IEN1cnNvciYgbm9uZUN1cnNvcigpIHsgcmV0dXJuIGdl
dEN1cnNvcihDdXJzb3JOb25lKTsgfQotY29uc3QgQ3Vyc29yJiBwb2ludGVyQ3Vyc29yKCkgeyBy
ZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvclBvaW50ZXIpOyB9Ci1jb25zdCBDdXJzb3ImIGNyb3NzQ3Vy
c29yKCkgIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JDcm9zcyk7IH0KLWNvbnN0IEN1cnNvciYg
aGFuZEN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JIYW5kKTsgfQotY29uc3QgQ3Vy
c29yJiBpQmVhbUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JCZWFtKTsgfQotY29u
c3QgQ3Vyc29yJiB3YWl0Q3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvcldhaXQpOyB9
Ci1jb25zdCBDdXJzb3ImIGhlbHBDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29ySGVs
cCk7IH0KLWNvbnN0IEN1cnNvciYgbW92ZUN1cnNvcigpICB7IHJldHVybiBnZXRDdXJzb3IoQ3Vy
c29yTW92ZSk7IH0KLWNvbnN0IEN1cnNvciYgZWFzdFJlc2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdl
dEN1cnNvcihDdXJzb3JFYXN0UmVzaXplKTsgfQotY29uc3QgQ3Vyc29yJiBub3J0aFJlc2l6ZUN1
cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JOb3J0aFJlc2l6ZSk7IH0KLWNvbnN0IEN1
cnNvciYgbm9ydGhFYXN0UmVzaXplQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvck5v
cnRoRWFzdFJlc2l6ZSk7IH0KLWNvbnN0IEN1cnNvciYgbm9ydGhXZXN0UmVzaXplQ3Vyc29yKCkg
eyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvck5vcnRoV2VzdFJlc2l6ZSk7IH0KLWNvbnN0IEN1cnNv
ciYgc291dGhSZXNpemVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yU291dGhSZXNp
emUpOyB9Ci1jb25zdCBDdXJzb3ImIHNvdXRoRWFzdFJlc2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdl
dEN1cnNvcihDdXJzb3JTb3V0aEVhc3RSZXNpemUpOyB9Ci1jb25zdCBDdXJzb3ImIHNvdXRoV2Vz
dFJlc2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JTb3V0aFdlc3RSZXNpemUp
OyB9Ci1jb25zdCBDdXJzb3ImIHdlc3RSZXNpemVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3Io
Q3Vyc29yV2VzdFJlc2l6ZSk7IH0KLWNvbnN0IEN1cnNvciYgbm9ydGhTb3V0aFJlc2l6ZUN1cnNv
cigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JOb3J0aFNvdXRoUmVzaXplKTsgfQotY29uc3Qg
Q3Vyc29yJiBlYXN0V2VzdFJlc2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JF
YXN0V2VzdFJlc2l6ZSk7IH0KLWNvbnN0IEN1cnNvciYgbm9ydGhFYXN0U291dGhXZXN0UmVzaXpl
Q3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvck5vcnRoRWFzdFNvdXRoV2VzdFJlc2l6
ZSk7IH0KLWNvbnN0IEN1cnNvciYgbm9ydGhXZXN0U291dGhFYXN0UmVzaXplQ3Vyc29yKCkgeyBy
ZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvck5vcnRoV2VzdFNvdXRoRWFzdFJlc2l6ZSk7IH0KLWNvbnN0
IEN1cnNvciYgY29sdW1uUmVzaXplQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvckNv
bHVtblJlc2l6ZSk7IH0KLWNvbnN0IEN1cnNvciYgcm93UmVzaXplQ3Vyc29yKCkgeyByZXR1cm4g
Z2V0Q3Vyc29yKEN1cnNvclJvd1Jlc2l6ZSk7IH0KLWNvbnN0IEN1cnNvciYgdmVydGljYWxUZXh0
Q3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvclZlcnRpY2FsVGV4dCk7IH0KLWNvbnN0
IEN1cnNvciYgY2VsbEN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JDZWxsKTsgfQot
Y29uc3QgQ3Vyc29yJiBjb250ZXh0TWVudUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJz
b3JDb250ZXh0TWVudSk7IH0KLWNvbnN0IEN1cnNvciYgbm9Ecm9wQ3Vyc29yKCkgeyByZXR1cm4g
Z2V0Q3Vyc29yKEN1cnNvck5vRHJvcCk7IH0KLWNvbnN0IEN1cnNvciYgbm90QWxsb3dlZEN1cnNv
cigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JOb3RBbGxvd2VkKTsgfQotY29uc3QgQ3Vyc29y
JiBwcm9ncmVzc0N1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JQcm9ncmVzcyk7IH0K
LWNvbnN0IEN1cnNvciYgYWxpYXNDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yQWxp
YXMpOyB9Ci1jb25zdCBDdXJzb3ImIHpvb21JbkN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihD
dXJzb3Jab29tSW4pOyB9Ci1jb25zdCBDdXJzb3ImIHpvb21PdXRDdXJzb3IoKSB7IHJldHVybiBn
ZXRDdXJzb3IoQ3Vyc29yWm9vbU91dCk7IH0KLWNvbnN0IEN1cnNvciYgY29weUN1cnNvcigpIHsg
cmV0dXJuIGdldEN1cnNvcihDdXJzb3JDb3B5KTsgfQotY29uc3QgQ3Vyc29yJiBtaWRkbGVQYW5u
aW5nQ3Vyc29yKCkgeyByZXR1cm4gY3Jvc3NDdXJzb3IoKTsgfQotY29uc3QgQ3Vyc29yJiBlYXN0
UGFubmluZ0N1cnNvcigpIHsgcmV0dXJuIGNyb3NzQ3Vyc29yKCk7IH0KLWNvbnN0IEN1cnNvciYg
bm9ydGhQYW5uaW5nQ3Vyc29yKCkgeyByZXR1cm4gY3Jvc3NDdXJzb3IoKTsgfQotY29uc3QgQ3Vy
c29yJiBub3J0aEVhc3RQYW5uaW5nQ3Vyc29yKCkgeyByZXR1cm4gY3Jvc3NDdXJzb3IoKTsgfQot
Y29uc3QgQ3Vyc29yJiBub3J0aFdlc3RQYW5uaW5nQ3Vyc29yKCkgeyByZXR1cm4gY3Jvc3NDdXJz
b3IoKTsgfQotY29uc3QgQ3Vyc29yJiBzb3V0aFBhbm5pbmdDdXJzb3IoKSB7IHJldHVybiBjcm9z
c0N1cnNvcigpOyB9Ci1jb25zdCBDdXJzb3ImIHNvdXRoRWFzdFBhbm5pbmdDdXJzb3IoKSB7IHJl
dHVybiBjcm9zc0N1cnNvcigpOyB9Ci1jb25zdCBDdXJzb3ImIHNvdXRoV2VzdFBhbm5pbmdDdXJz
b3IoKSB7IHJldHVybiBjcm9zc0N1cnNvcigpOyB9Ci1jb25zdCBDdXJzb3ImIHdlc3RQYW5uaW5n
Q3Vyc29yKCkgeyByZXR1cm4gY3Jvc3NDdXJzb3IoKTsgfQotY29uc3QgQ3Vyc29yJiBncmFiYmlu
Z0N1cnNvcigpIHsgcmV0dXJuIG1vdmVDdXJzb3IoKTsgfQotY29uc3QgQ3Vyc29yJiBncmFiQ3Vy
c29yKCkgeyByZXR1cm4gbW92ZUN1cnNvcigpOyB9Ci0KLX0KSW5kZXg6IFdlYkNvcmUvcGxhdGZv
cm0vd2luY2UvRHJhZ0RhdGFXaW5DRS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9y
bS93aW5jZS9EcmFnRGF0YVdpbkNFLmNwcAkocmV2aXNpb24gNTcyODkpCShmcm9tIFdlYkNvcmUv
cGxhdGZvcm0vd2luY2UvRHJhZ0RhdGFXaW5jZS5jcHA6NTcyODkpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL3dpbmNlL0RyYWdEYXRhV2luQ0UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsOTAg
QEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVG9yY2ggTW9iaWxlLCBJbmMuCisg
KgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5z
ZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg
d2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg
YSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxv
bmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwg
d3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFu
a2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNB
LgorICoKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRHJhZ0RhdGEuaCIK
KworI2luY2x1ZGUgIkNsaXBib2FyZC5oIgorI2luY2x1ZGUgIkRvY3VtZW50RnJhZ21lbnQuaCIK
KyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1Bh
c3NSZWZQdHI8Q2xpcGJvYXJkPiBEcmFnRGF0YTo6Y3JlYXRlQ2xpcGJvYXJkKENsaXBib2FyZEFj
Y2Vzc1BvbGljeSBwb2xpY3kpIGNvbnN0Cit7CisgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgRHJh
Z0RhdGE6OmNvbnRhaW5zVVJMKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1N0
cmluZyBEcmFnRGF0YTo6YXNVUkwoU3RyaW5nKiB0aXRsZSkgY29uc3QKK3sKKyAgICByZXR1cm4g
U3RyaW5nKCk7Cit9CisKK2Jvb2wgRHJhZ0RhdGE6OmNvbnRhaW5zRmlsZXMoKSBjb25zdAorewor
ICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBEcmFnRGF0YTo6YXNGaWxlbmFtZXMoVmVjdG9y
PFN0cmluZz4mKSBjb25zdAoreworfQorCitib29sIERyYWdEYXRhOjpjb250YWluc1BsYWluVGV4
dCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitTdHJpbmcgRHJhZ0RhdGE6OmFz
UGxhaW5UZXh0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gU3RyaW5nKCk7Cit9CisKK2Jvb2wgRHJh
Z0RhdGE6OmNvbnRhaW5zQ29sb3IoKSBjb25zdAoreworICAgIHJldHVybiBmYWxzZTsKK30KKwor
Ym9vbCBEcmFnRGF0YTo6Y2FuU21hcnRSZXBsYWNlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFs
c2U7Cit9CisKK2Jvb2wgRHJhZ0RhdGE6OmNvbnRhaW5zQ29tcGF0aWJsZUNvbnRlbnQoKSBjb25z
dAoreworICAgIHJldHVybiBmYWxzZTsKK30KKworUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50
PiBEcmFnRGF0YTo6YXNGcmFnbWVudChEb2N1bWVudCogZG9jKSBjb25zdAoreworICAgICByZXR1
cm4gMDsKK30KKworQ29sb3IgRHJhZ0RhdGE6OmFzQ29sb3IoKSBjb25zdAoreworICAgIHJldHVy
biBDb2xvcigpOworfQorCit9CisKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvRHJhZ0Rh
dGFXaW5DRS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9EcmFnRGF0
YVdpbkNFLmNwcAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0Ry
YWdEYXRhV2luQ0UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04Niw1ICs4Niw0IEBAIENvbG9yIERy
YWdEYXRhOjphc0NvbG9yKCkgY29uc3QKICAgICByZXR1cm4gQ29sb3IoKTsKIH0KIAotfQotCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0RyYWdE
YXRhV2luY2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvRHJhZ0Rh
dGFXaW5jZS5jcHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9E
cmFnRGF0YVdpbmNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw5MCArMCwwIEBACi0vKgotICog
IENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRvcmNoIE1vYmlsZSwgSW5jLgotICoKLSAqICBUaGlz
IGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y
Ci0gKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMKLSAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uOyBlaXRoZXIKLSAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMgbGlicmFyeSBpcyBk
aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBX
SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m
Ci0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
LiAgU2VlIHRoZSBHTlUKLSAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhp
cyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0g
KiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0
LCBGaWZ0aCBGbG9vciwKLSAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqCi0gKi8K
LQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkRyYWdEYXRhLmgiCi0KLSNpbmNsdWRl
ICJDbGlwYm9hcmQuaCIKLSNpbmNsdWRlICJEb2N1bWVudEZyYWdtZW50LmgiCi0jaW5jbHVkZSAi
UGxhdGZvcm1TdHJpbmcuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1QYXNzUmVmUHRyPENs
aXBib2FyZD4gRHJhZ0RhdGE6OmNyZWF0ZUNsaXBib2FyZChDbGlwYm9hcmRBY2Nlc3NQb2xpY3kg
cG9saWN5KSBjb25zdAotewotICAgIHJldHVybiAwOwotfQotCi1ib29sIERyYWdEYXRhOjpjb250
YWluc1VSTCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1TdHJpbmcgRHJhZ0Rh
dGE6OmFzVVJMKFN0cmluZyogdGl0bGUpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIFN0cmluZygpOwot
fQotCi1ib29sIERyYWdEYXRhOjpjb250YWluc0ZpbGVzKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
ZmFsc2U7Ci19Ci0KLXZvaWQgRHJhZ0RhdGE6OmFzRmlsZW5hbWVzKFZlY3RvcjxTdHJpbmc+Jikg
Y29uc3QKLXsKLX0KLQotYm9vbCBEcmFnRGF0YTo6Y29udGFpbnNQbGFpblRleHQoKSBjb25zdAot
ewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotU3RyaW5nIERyYWdEYXRhOjphc1BsYWluVGV4dCgp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIFN0cmluZygpOwotfQotCi1ib29sIERyYWdEYXRhOjpjb250
YWluc0NvbG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgRHJhZ0Rh
dGE6OmNhblNtYXJ0UmVwbGFjZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1i
b29sIERyYWdEYXRhOjpjb250YWluc0NvbXBhdGlibGVDb250ZW50KCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gZmFsc2U7Ci19Ci0KLVBhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gRHJhZ0RhdGE6
OmFzRnJhZ21lbnQoRG9jdW1lbnQqIGRvYykgY29uc3QKLXsKLSAgICAgcmV0dXJuIDA7Ci19Ci0K
LUNvbG9yIERyYWdEYXRhOjphc0NvbG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gQ29sb3IoKTsK
LX0KLQotfQotCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0RyYWdJbWFnZVdpbkNFLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0RyYWdJbWFnZVdpbkNFLmNw
cAkocmV2aXNpb24gNTcyODkpCShmcm9tIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvRHJhZ0ltYWdl
V2luY2UuY3BwOjU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9EcmFnSW1hZ2VXaW5D
RS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqICBDb3B5cmlnaHQg
KEMpIDIwMDctMjAwOCBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlm
eSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisg
KiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg
ZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24p
IGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNI
QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUg
R05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu
CisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsg
c2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxv
b3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKyNpbmNsdWRlICJEcmFnSW1hZ2UuaCIKKworI2luY2x1ZGUgIkNhY2hlZElt
YWdlLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiSW1hZ2UuaCIK
KworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitJbnRTaXpl
IGRyYWdJbWFnZVNpemUoRHJhZ0ltYWdlUmVmKQoreworICAgIHJldHVybiBJbnRTaXplKDAsIDAp
OworfQorCit2b2lkIGRlbGV0ZURyYWdJbWFnZShEcmFnSW1hZ2VSZWYgaW1hZ2UpCit7CisgICAg
aWYgKGltYWdlKQorICAgICAgICA6OkRlbGV0ZU9iamVjdChpbWFnZSk7Cit9CisKK0RyYWdJbWFn
ZVJlZiBzY2FsZURyYWdJbWFnZShEcmFnSW1hZ2VSZWYsIEZsb2F0U2l6ZSkKK3sKKyAgICByZXR1
cm4gMDsKK30KKworRHJhZ0ltYWdlUmVmIGRpc3NvbHZlRHJhZ0ltYWdlVG9GcmFjdGlvbihEcmFn
SW1hZ2VSZWYgaW1hZ2UsIGZsb2F0KQoreworICAgIHJldHVybiBpbWFnZTsKK30KKworRHJhZ0lt
YWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZyb21JbWFnZShJbWFnZSopCit7CisgICAgcmV0dXJuIDA7
Cit9CisKK0RyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VJY29uRm9yQ2FjaGVkSW1hZ2UoQ2Fj
aGVkSW1hZ2UqKQoreworICAgIHJldHVybiAwOworfQorCit9CkluZGV4OiBXZWJDb3JlL3BsYXRm
b3JtL3dpbmNlL0RyYWdJbWFnZVdpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRm
b3JtL3dpbmNlL0RyYWdJbWFnZVdpbkNFLmNwcAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3Jl
L3BsYXRmb3JtL3dpbmNlL0RyYWdJbWFnZVdpbkNFLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjAs
NCArNjAsNCBAQCBEcmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlSWNvbkZvckNhY2hlCiAgICAg
cmV0dXJuIDA7CiB9CiAKLX0KK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUv
cGxhdGZvcm0vd2luY2UvRHJhZ0ltYWdlV2luY2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
cGxhdGZvcm0vd2luY2UvRHJhZ0ltYWdlV2luY2UuY3BwCShyZXZpc2lvbiA1NzI4OSkKKysrIFdl
YkNvcmUvcGxhdGZvcm0vd2luY2UvRHJhZ0ltYWdlV2luY2UuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDYzICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVG9yY2ggTW9i
aWxlLCBJbmMuCi0gKgotICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu
IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICogIExpY2Vuc2UgYXMgcHVibGlzaGVk
IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogIHZlcnNpb24gMiBv
ZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAq
Ci0gKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls
bCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g
dGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhh
dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlCi0gKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJ
Qi4gIElmIG5vdCwgd3JpdGUgdG8KLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJ
bmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICogIEJvc3RvbiwgTUEgMDIx
MTAtMTMwMSwgVVNBLgotICoKLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAi
RHJhZ0ltYWdlLmgiCi0KLSNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgotI2luY2x1ZGUgIkdyYXBo
aWNzQ29udGV4dC5oIgotI2luY2x1ZGUgIkltYWdlLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+
Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotSW50U2l6ZSBkcmFnSW1hZ2VTaXplKERyYWdJbWFn
ZVJlZikKLXsKLSAgICByZXR1cm4gSW50U2l6ZSgwLCAwKTsKLX0KLQotdm9pZCBkZWxldGVEcmFn
SW1hZ2UoRHJhZ0ltYWdlUmVmIGltYWdlKQotewotICAgIGlmIChpbWFnZSkKLSAgICAgICAgOjpE
ZWxldGVPYmplY3QoaW1hZ2UpOwotfQotCi1EcmFnSW1hZ2VSZWYgc2NhbGVEcmFnSW1hZ2UoRHJh
Z0ltYWdlUmVmLCBGbG9hdFNpemUpCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLURyYWdJbWFnZVJl
ZiBkaXNzb2x2ZURyYWdJbWFnZVRvRnJhY3Rpb24oRHJhZ0ltYWdlUmVmIGltYWdlLCBmbG9hdCkK
LXsKLSAgICByZXR1cm4gaW1hZ2U7Ci19Ci0KLURyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VG
cm9tSW1hZ2UoSW1hZ2UqKQotewotICAgIHJldHVybiAwOwotfQotCi1EcmFnSW1hZ2VSZWYgY3Jl
YXRlRHJhZ0ltYWdlSWNvbkZvckNhY2hlZEltYWdlKENhY2hlZEltYWdlKikKLXsKLSAgICByZXR1
cm4gMDsKLX0KLQotfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9FZGl0b3JXaW5DRS5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9FZGl0b3JXaW5DRS5jcHAJ
KHJldmlzaW9uIDU3Mjg5KQkoZnJvbSBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0VkaXRvcldpbmNl
LmNwcDo1NzI4OSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvRWRpdG9yV2luQ0UuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3
LTIwMDggVG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNv
ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5k
ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vu
c2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgor
ICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0
ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo
b3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ
OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJ
VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICog
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAq
ICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUg
ZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICog
IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisKKyNpbmNsdWRlICJFZGl0b3IuaCIKKworI2luY2x1ZGUgIkNsaXBib2FyZFdpbmNlLmgi
CisjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJFZGl0b3JDbGllbnQuaCIKKyNpbmNs
dWRlICJFbGVtZW50LmgiCisjaW5jbHVkZSAiSHRtbEVkaXRpbmcuaCIKKyNpbmNsdWRlICJUZXh0
SXRlcmF0b3IuaCIKKyNpbmNsdWRlICJ2aXNpYmxlX3VuaXRzLmgiCisKKyNpbmNsdWRlIDx3aW5k
b3dzLmg+CisjZGVmaW5lIF9TWVNfR1VJRF9PUEVSQVRPUlNfCisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworUGFzc1JlZlB0cjxDbGlwYm9hcmQ+IEVkaXRvcjo6bmV3R2VuZXJhbENsaXBib2FyZChD
bGlwYm9hcmRBY2Nlc3NQb2xpY3kgcG9saWN5KQoreworICAgIHJldHVybiBhZG9wdFJlZihuZXcg
Q2xpcGJvYXJkV2luY2UocG9saWN5LCBmYWxzZSkpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0VkaXRvcldpbkNFLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0VkaXRvcldpbkNFLmNwcAkocmV2aXNpb24g
NTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0VkaXRvcldpbkNFLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVkZSAiRWRpdG9yLmgiCiAKLSNpbmNs
dWRlICJDbGlwYm9hcmRXaW5jZS5oIgorI2luY2x1ZGUgIkNsaXBib2FyZFdpbkNFLmgiCiAjaW5j
bHVkZSAiRG9jdW1lbnQuaCIKICNpbmNsdWRlICJFZGl0b3JDbGllbnQuaCIKICNpbmNsdWRlICJF
bGVtZW50LmgiCkBAIC0zNyw3ICszNyw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogUGFzc1Jl
ZlB0cjxDbGlwYm9hcmQ+IEVkaXRvcjo6bmV3R2VuZXJhbENsaXBib2FyZChDbGlwYm9hcmRBY2Nl
c3NQb2xpY3kgcG9saWN5KQogewotICAgIHJldHVybiBhZG9wdFJlZihuZXcgQ2xpcGJvYXJkV2lu
Y2UocG9saWN5LCBmYWxzZSkpOworICAgIHJldHVybiBhZG9wdFJlZihuZXcgQ2xpcGJvYXJkV2lu
Q0UocG9saWN5LCBmYWxzZSkpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0VkaXRvcldpbmNlLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3BsYXRmb3JtL3dpbmNlL0VkaXRvcldpbmNlLmNwcAkocmV2aXNpb24gNTcyODkpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0VkaXRvcldpbmNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MSw0MyArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRvcmNoIE1vYmls
ZSwgSW5jLgotICoKLSAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqICB2ZXJzaW9uIDIgb2Yg
dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgot
ICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo
ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqICBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZl
IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZQotICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIu
ICBJZiBub3QsIHdyaXRlIHRvCi0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j
LiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqICBCb3N0b24sIE1BIDAyMTEw
LTEzMDEsIFVTQS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSAi
RWRpdG9yLmgiCi0KLSNpbmNsdWRlICJDbGlwYm9hcmRXaW5jZS5oIgotI2luY2x1ZGUgIkRvY3Vt
ZW50LmgiCi0jaW5jbHVkZSAiRWRpdG9yQ2xpZW50LmgiCi0jaW5jbHVkZSAiRWxlbWVudC5oIgot
I2luY2x1ZGUgIkh0bWxFZGl0aW5nLmgiCi0jaW5jbHVkZSAiVGV4dEl0ZXJhdG9yLmgiCi0jaW5j
bHVkZSAidmlzaWJsZV91bml0cy5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2RlZmluZSBf
U1lTX0dVSURfT1BFUkFUT1JTXwotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLVBhc3NSZWZQdHI8
Q2xpcGJvYXJkPiBFZGl0b3I6Om5ld0dlbmVyYWxDbGlwYm9hcmQoQ2xpcGJvYXJkQWNjZXNzUG9s
aWN5IHBvbGljeSkKLXsKLSAgICByZXR1cm4gYWRvcHRSZWYobmV3IENsaXBib2FyZFdpbmNlKHBv
bGljeSwgZmFsc2UpKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29y
ZS9wbGF0Zm9ybS93aW5jZS9GaWxlQ2hvb3NlcldpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3BsYXRmb3JtL3dpbmNlL0ZpbGVDaG9vc2VyV2luQ0UuY3BwCShyZXZpc2lvbiA1NzI4OSkJ
KGZyb20gV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9GaWxlQ2hvb3NlcldpbmNlLmNwcDo1NzI4OSkK
KysrIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvRmlsZUNob29zZXJXaW5DRS5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAw
OSBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIkZpbGVDaG9vc2VyLmgiCisKKyNpbmNsdWRlICJDaHJvbWUuaCIKKyNpbmNsdWRlICJDaHJv
bWVDbGllbnQuaCIKKyNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisj
aW5jbHVkZSAiSWNvbi5oIgorI2luY2x1ZGUgIkxvY2FsaXplZFN0cmluZ3MuaCIKKyNpbmNsdWRl
ICJQYWdlLmgiCisjaW5jbHVkZSAiU3RyaW5nVHJ1bmNhdG9yLmgiCisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworU3RyaW5nIHBhdGhHZXRGaWxlTmFtZShjb25zdCBTdHJpbmcmIHBhdGgpOworCitT
dHJpbmcgRmlsZUNob29zZXI6OmJhc2VuYW1lRm9yV2lkdGgoY29uc3QgRm9udCYgZm9udCwgaW50
IHdpZHRoKSBjb25zdAoreworICAgIGlmICh3aWR0aCA8PSAwKQorICAgICAgICByZXR1cm4gU3Ry
aW5nKCk7CisKKyAgICBTdHJpbmcgc3RyaW5nOworICAgIGlmIChtX2ZpbGVuYW1lcy5pc0VtcHR5
KCkpCisgICAgICAgIHN0cmluZyA9IGZpbGVCdXR0b25Ob0ZpbGVTZWxlY3RlZExhYmVsKCk7Cisg
ICAgZWxzZSBpZiAobV9maWxlbmFtZXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgU3RyaW5nIHRt
cEZpbGVuYW1lID0gbV9maWxlbmFtZXNbMF07CisgICAgICAgIHN0cmluZyA9IHBhdGhHZXRGaWxl
TmFtZSh0bXBGaWxlbmFtZSk7CisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBTdHJpbmdUcnVu
Y2F0b3I6OnJpZ2h0VHJ1bmNhdGUoU3RyaW5nOjpudW1iZXIobV9maWxlbmFtZXMuc2l6ZSgpKSAr
ICIgZmlsZXMiLCB3aWR0aCwgZm9udCwgZmFsc2UpOworCisgICAgcmV0dXJuIFN0cmluZ1RydW5j
YXRvcjo6Y2VudGVyVHJ1bmNhdGUoc3RyaW5nLCB3aWR0aCwgZm9udCwgZmFsc2UpOworfQorCit9
CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0ZpbGVDaG9vc2VyV2luQ0UuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvRmlsZUNob29zZXJXaW5DRS5jcHAJKHJl
dmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9GaWxlQ2hvb3NlcldpbkNF
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTcsNCArNTcsNCBAQCBTdHJpbmcgRmlsZUNob29zZXI6
OmJhc2VuYW1lRm9yV2lkdGgoY29uCiAgICAgcmV0dXJuIFN0cmluZ1RydW5jYXRvcjo6Y2VudGVy
VHJ1bmNhdGUoc3RyaW5nLCB3aWR0aCwgZm9udCwgZmFsc2UpOwogfQogCi19Cit9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0ZpbGVDaG9vc2VyV2lu
Y2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvRmlsZUNob29zZXJX
aW5jZS5jcHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9GaWxl
Q2hvb3NlcldpbmNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw2MCArMCwwIEBACi0vKgotICog
Q29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
LSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLgotICoKLSAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgot
ICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBP
UgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKLSAqLwotCi0j
aW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiRmlsZUNob29zZXIuaCIKLQotI2luY2x1ZGUg
IkNocm9tZS5oIgotI2luY2x1ZGUgIkNocm9tZUNsaWVudC5oIgotI2luY2x1ZGUgIkRvY3VtZW50
LmgiCi0jaW5jbHVkZSAiRnJhbWUuaCIKLSNpbmNsdWRlICJJY29uLmgiCi0jaW5jbHVkZSAiTG9j
YWxpemVkU3RyaW5ncy5oIgotI2luY2x1ZGUgIlBhZ2UuaCIKLSNpbmNsdWRlICJTdHJpbmdUcnVu
Y2F0b3IuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1TdHJpbmcgcGF0aEdldEZpbGVOYW1l
KGNvbnN0IFN0cmluZyYgcGF0aCk7Ci0KLVN0cmluZyBGaWxlQ2hvb3Nlcjo6YmFzZW5hbWVGb3JX
aWR0aChjb25zdCBGb250JiBmb250LCBpbnQgd2lkdGgpIGNvbnN0Ci17Ci0gICAgaWYgKHdpZHRo
IDw9IDApCi0gICAgICAgIHJldHVybiBTdHJpbmcoKTsKLQotICAgIFN0cmluZyBzdHJpbmc7Ci0g
ICAgaWYgKG1fZmlsZW5hbWVzLmlzRW1wdHkoKSkKLSAgICAgICAgc3RyaW5nID0gZmlsZUJ1dHRv
bk5vRmlsZVNlbGVjdGVkTGFiZWwoKTsKLSAgICBlbHNlIGlmIChtX2ZpbGVuYW1lcy5zaXplKCkg
PT0gMSkgewotICAgICAgICBTdHJpbmcgdG1wRmlsZW5hbWUgPSBtX2ZpbGVuYW1lc1swXTsKLSAg
ICAgICAgc3RyaW5nID0gcGF0aEdldEZpbGVOYW1lKHRtcEZpbGVuYW1lKTsKLSAgICB9IGVsc2UK
LSAgICAgICAgcmV0dXJuIFN0cmluZ1RydW5jYXRvcjo6cmlnaHRUcnVuY2F0ZShTdHJpbmc6Om51
bWJlcihtX2ZpbGVuYW1lcy5zaXplKCkpICsgIiBmaWxlcyIsIHdpZHRoLCBmb250LCBmYWxzZSk7
Ci0KLSAgICByZXR1cm4gU3RyaW5nVHJ1bmNhdG9yOjpjZW50ZXJUcnVuY2F0ZShzdHJpbmcsIHdp
ZHRoLCBmb250LCBmYWxzZSk7Ci19Ci0KLX0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luY2Uv
RmlsZVN5c3RlbVdpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3dpbmNl
L0ZpbGVTeXN0ZW1XaW5DRS5jcHAJKHJldmlzaW9uIDU3Mjg5KQkoZnJvbSBXZWJDb3JlL3BsYXRm
b3JtL3dpbmNlL0ZpbGVTeXN0ZW1XaW5jZS5jcHA6NTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3Jt
L3dpbmNlL0ZpbGVTeXN0ZW1XaW5DRS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyODQg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4IENvbGxhYm9yYSwgTHRkLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCisg
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
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZpbGVTeXN0ZW0uaCIKKworI2luY2x1ZGUg
Ik5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRl
IDx3dGYvdGV4dC9DU3RyaW5nLmg+CisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8
d2luY3J5cHQuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgYm9vbCBnZXRGaWxl
SW5mbyhjb25zdCBTdHJpbmcmIHBhdGgsIEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OJiBmaWxl
SW5mbykKK3sKKyAgICBTdHJpbmcgZmlsZW5hbWUgPSBwYXRoOworICAgIEhBTkRMRSBoRmlsZSA9
IENyZWF0ZUZpbGUoZmlsZW5hbWUuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSwgR0VO
RVJJQ19SRUFELCBGSUxFX1NIQVJFX1JFQUQsIDAKKyAgICAgICAgLCBPUEVOX0VYSVNUSU5HLCBG
SUxFX0ZMQUdfTk9fQlVGRkVSSU5HLCAwKTsKKworICAgIGlmIChoRmlsZSA9PSBJTlZBTElEX0hB
TkRMRV9WQUxVRSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbCBydG4gPSBHZXRG
aWxlSW5mb3JtYXRpb25CeUhhbmRsZShoRmlsZSwgJmZpbGVJbmZvKSA/IHRydWUgOiBmYWxzZTsK
KworICAgIENsb3NlSGFuZGxlKGhGaWxlKTsKKyAgICByZXR1cm4gcnRuOworfQorCitib29sIGdl
dEZpbGVTaXplKGNvbnN0IFN0cmluZyYgcGF0aCwgbG9uZyBsb25nJiByZXN1bHQpCit7CisgICAg
QllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04gZmlsZUluZm9ybWF0aW9uOworICAgIGlmICghZ2V0
RmlsZUluZm8ocGF0aCwgZmlsZUluZm9ybWF0aW9uKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgVUxBUkdFX0lOVEVHRVIgZmlsZVNpemU7CisgICAgZmlsZVNpemUuTG93UGFydCA9IGZp
bGVJbmZvcm1hdGlvbi5uRmlsZVNpemVMb3c7CisgICAgZmlsZVNpemUuSGlnaFBhcnQgPSBmaWxl
SW5mb3JtYXRpb24ubkZpbGVTaXplSGlnaDsKKworICAgIHJlc3VsdCA9IGZpbGVTaXplLlF1YWRQ
YXJ0OworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgZ2V0RmlsZU1vZGlmaWNhdGlvblRp
bWUoY29uc3QgU3RyaW5nJiBwYXRoLCB0aW1lX3QmIHJlc3VsdCkKK3sKKyAgICBCWV9IQU5ETEVf
RklMRV9JTkZPUk1BVElPTiBmaWxlSW5mb3JtYXRpb247CisgICAgaWYgKCFnZXRGaWxlSW5mbyhw
YXRoLCBmaWxlSW5mb3JtYXRpb24pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBVTEFS
R0VfSU5URUdFUiB0OworICAgIG1lbWNweSgmdCwgJmZpbGVJbmZvcm1hdGlvbi5mdExhc3RXcml0
ZVRpbWUsIHNpemVvZih0KSk7CisgICAgCisgICAgcmVzdWx0ID0gdC5RdWFkUGFydCAqIDAuMDAw
MDAwMSAtIDExNjQ0NDczNjAwLjA7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBmaWxl
RXhpc3RzKGNvbnN0IFN0cmluZyYgcGF0aCkgCit7CisgICAgU3RyaW5nIGZpbGVuYW1lID0gcGF0
aDsKKyAgICBIQU5ETEUgaEZpbGUgPSBDcmVhdGVGaWxlKGZpbGVuYW1lLmNoYXJhY3RlcnNXaXRo
TnVsbFRlcm1pbmF0aW9uKCksIDAsIEZJTEVfU0hBUkVfUkVBRCB8IEZJTEVfU0hBUkVfV1JJVEUK
KyAgICAgICAgLCAwLCBPUEVOX0VYSVNUSU5HLCBGSUxFX0ZMQUdfTk9fQlVGRkVSSU5HLCAwKTsK
KworICAgIENsb3NlSGFuZGxlKGhGaWxlKTsKKworICAgIHJldHVybiBoRmlsZSAhPSBJTlZBTElE
X0hBTkRMRV9WQUxVRTsKK30KKworYm9vbCBkZWxldGVGaWxlKGNvbnN0IFN0cmluZyYgcGF0aCkK
K3sKKyAgICBTdHJpbmcgZmlsZW5hbWUgPSBwYXRoOworICAgIHJldHVybiAhIURlbGV0ZUZpbGVX
KGZpbGVuYW1lLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkpOworfQorCisKK2Jvb2wg
ZGVsZXRlRW1wdHlEaXJlY3RvcnkoY29uc3QgU3RyaW5nJiBwYXRoKQoreworICAgIFN0cmluZyBm
aWxlbmFtZSA9IHBhdGg7CisgICAgcmV0dXJuICEhUmVtb3ZlRGlyZWN0b3J5VyhmaWxlbmFtZS5j
aGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpKTsKK30KKworU3RyaW5nIHBhdGhCeUFwcGVu
ZGluZ0NvbXBvbmVudChjb25zdCBTdHJpbmcmIHBhdGgsIGNvbnN0IFN0cmluZyYgY29tcG9uZW50
KQoreworICAgIGlmIChjb21wb25lbnQuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gcGF0aDsK
KworICAgIFZlY3RvcjxVQ2hhciwgTUFYX1BBVEg+IGJ1ZmZlcjsKKworICAgIGJ1ZmZlci5hcHBl
bmQocGF0aC5jaGFyYWN0ZXJzKCksIHBhdGgubGVuZ3RoKCkpOworCisgICAgaWYgKGJ1ZmZlci5s
YXN0KCkgIT0gTCdcXCcgJiYgYnVmZmVyLmxhc3QoKSAhPSBMJy8nCisgICAgICAgICYmIGNvbXBv
bmVudFswXSAhPSBMJ1xcJyAmJiBjb21wb25lbnRbMF0gIT0gTCcvJykKKyAgICAgICAgYnVmZmVy
LmFwcGVuZChMJ1xcJyk7CisKKyAgICBidWZmZXIuYXBwZW5kKGNvbXBvbmVudC5jaGFyYWN0ZXJz
KCksIGNvbXBvbmVudC5sZW5ndGgoKSk7CisKKyAgICByZXR1cm4gU3RyaW5nKGJ1ZmZlci5kYXRh
KCksIGJ1ZmZlci5zaXplKCkpOworfQorCitDU3RyaW5nIGZpbGVTeXN0ZW1SZXByZXNlbnRhdGlv
bihjb25zdCBTdHJpbmcmKQoreworICAgIHJldHVybiAiIjsKK30KKworYm9vbCBtYWtlQWxsRGly
ZWN0b3JpZXMoY29uc3QgU3RyaW5nJiBwYXRoKQoreworICAgIGludCBsYXN0RGl2UG9zID0gc3Rk
OjptYXgocGF0aC5yZXZlcnNlRmluZCgnLycpLCBwYXRoLnJldmVyc2VGaW5kKCdcXCcpKTsKKyAg
ICBpbnQgZW5kUG9zID0gcGF0aC5sZW5ndGgoKTsKKyAgICBpZiAobGFzdERpdlBvcyA9PSBwYXRo
Lmxlbmd0aCgpIC0gMSkgeworICAgICAgICBlbmRQb3MgLT0gMTsKKyAgICAgICAgbGFzdERpdlBv
cyA9IHN0ZDo6bWF4KHBhdGgucmV2ZXJzZUZpbmQoJy8nLCBsYXN0RGl2UG9zKSwgcGF0aC5yZXZl
cnNlRmluZCgnXFwnLCBsYXN0RGl2UG9zKSk7CisgICAgfQorCisgICAgaWYgKGxhc3REaXZQb3Mg
PiAwKSB7CisgICAgICAgIGlmICghbWFrZUFsbERpcmVjdG9yaWVzKHBhdGguc3Vic3RyaW5nKDAs
IGxhc3REaXZQb3MpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBT
dHJpbmcgZm9sZGVyKHBhdGguc3Vic3RyaW5nKDAsIGVuZFBvcykpOworICAgIENyZWF0ZURpcmVj
dG9yeShmb2xkZXIuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSwgMCk7CisKKyAgICBE
V09SRCBmaWxlQXR0ciA9IEdldEZpbGVBdHRyaWJ1dGVzKGZvbGRlci5jaGFyYWN0ZXJzV2l0aE51
bGxUZXJtaW5hdGlvbigpKTsKKyAgICByZXR1cm4gZmlsZUF0dHIgIT0gMHhGRkZGRkZGRiAmJiAo
ZmlsZUF0dHIgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpOworfQorCitTdHJpbmcgaG9tZURp
cmVjdG9yeVBhdGgoKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuICIiOwor
fQorCitTdHJpbmcgcGF0aEdldEZpbGVOYW1lKGNvbnN0IFN0cmluZyYgcGF0aCkKK3sKKyAgICBy
ZXR1cm4gcGF0aC5zdWJzdHJpbmcoc3RkOjptYXgocGF0aC5yZXZlcnNlRmluZCgnLycpLCBwYXRo
LnJldmVyc2VGaW5kKCdcXCcpKSArIDEpOworfQorCitTdHJpbmcgZGlyZWN0b3J5TmFtZShjb25z
dCBTdHJpbmcmIHBhdGgpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gU3Ry
aW5nKCk7Cit9CisKK0NTdHJpbmcgb3BlblRlbXBvcmFyeUZpbGUoY29uc3QgY2hhciosIFBsYXRm
b3JtRmlsZUhhbmRsZSYgaGFuZGxlKQoreworICAgIGhhbmRsZSA9IElOVkFMSURfSEFORExFX1ZB
TFVFOworCisgICAgd2NoYXJfdCB0ZW1wUGF0aFtNQVhfUEFUSF07CisgICAgaW50IHRlbXBQYXRo
TGVuZ3RoID0gOjpHZXRUZW1wUGF0aChfY291bnRvZih0ZW1wUGF0aCksIHRlbXBQYXRoKTsKKyAg
ICBpZiAodGVtcFBhdGhMZW5ndGggPD0gMCB8fCB0ZW1wUGF0aExlbmd0aCA+IF9jb3VudG9mKHRl
bXBQYXRoKSkKKyAgICAgICAgcmV0dXJuIENTdHJpbmcoKTsKKworICAgIEhDUllQVFBST1YgaENy
eXB0UHJvdiA9IDA7CisgICAgaWYgKCFDcnlwdEFjcXVpcmVDb250ZXh0KCZoQ3J5cHRQcm92LCAw
LCAwLCBQUk9WX1JTQV9GVUxMLCBDUllQVF9WRVJJRllDT05URVhUKSkKKyAgICAgICAgcmV0dXJu
IENTdHJpbmcoKTsKKworICAgIFN0cmluZyBwcm9wb3NlZFBhdGg7CisgICAgd2hpbGUgKDEpIHsK
KworICAgICAgICB3Y2hhcl90IHRlbXBGaWxlW10gPSBMIlhYWFhYWFhYLnRtcCI7IC8vIFVzZSA4
LjMgc3R5bGUgbmFtZSAobW9yZSBjaGFyYWN0ZXJzIGFyZW4ndCBoZWxwZnVsIGR1ZSB0byA4LjMg
c2hvcnQgZmlsZSBuYW1lcykKKyAgICAgICAgY29uc3QgaW50IHJhbmRvbVBhcnRMZW5ndGggPSA4
OworICAgICAgICBpZiAoIUNyeXB0R2VuUmFuZG9tKGhDcnlwdFByb3YsIHJhbmRvbVBhcnRMZW5n
dGggKiAyLCByZWludGVycHJldF9jYXN0PEJZVEUqPih0ZW1wRmlsZSkpKQorICAgICAgICAgICAg
YnJlYWs7CisKKyAgICAgICAgLy8gTGltaXQgdG8gdmFsaWQgZmlsZXN5c3RlbSBjaGFyYWN0ZXJz
LCBhbHNvIGV4Y2x1ZGluZyBvdGhlcnMgdGhhdCBjb3VsZCBiZSBwcm9ibGVtYXRpYywgbGlrZSBw
dW5jdHVhdGlvbi4KKyAgICAgICAgLy8gZG9uJ3QgaW5jbHVkZSBib3RoIHVwcGVyIGFuZCBsb3dl
cmNhc2Ugc2luY2UgV2luZG93cyBmaWxlIHN5c3RlbXMgYXJlIHR5cGljYWxseSBub3QgY2FzZSBz
ZW5zaXRpdmUuCisgICAgICAgIGNvbnN0IGNoYXIgdmFsaWRDaGFyc1tdID0gIjAxMjM0NTY3ODlh
YmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwg
cmFuZG9tUGFydExlbmd0aDsgKytpKQorICAgICAgICAgICAgdGVtcEZpbGVbaV0gPSB2YWxpZENo
YXJzW3RlbXBGaWxlW2ldICUgKHNpemVvZih2YWxpZENoYXJzKSAtIDEpXTsKKworICAgICAgICBB
U1NFUlQod2NzbGVuKHRlbXBGaWxlKSAqIDIgPT0gc2l6ZW9mKHRlbXBGaWxlKSAtIDIpOworCisg
ICAgICAgIHByb3Bvc2VkUGF0aCA9IHBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChTdHJpbmcodGVt
cFBhdGgpLCBTdHJpbmcodGVtcEZpbGUpKTsKKworICAgICAgICAvLyB1c2UgQ1JFQVRFX05FVyB0
byBhdm9pZCBvdmVyd3JpdGluZyBhbiBleGlzdGluZyBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZQor
ICAgICAgICBoYW5kbGUgPSBDcmVhdGVGaWxlKHByb3Bvc2VkUGF0aC5jaGFyYWN0ZXJzV2l0aE51
bGxUZXJtaW5hdGlvbigpLCBHRU5FUklDX1JFQUQgfCBHRU5FUklDX1dSSVRFLCAwLCAwLCBDUkVB
VEVfTkVXLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIDApOworICAgICAgICBpZiAoIWlzSGFuZGxl
VmFsaWQoaGFuZGxlKSAmJiBHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9BTFJFQURZX0VYSVNUUykK
KyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIENy
eXB0UmVsZWFzZUNvbnRleHQoaENyeXB0UHJvdiwgMCk7CisKKyAgICBpZiAoIWlzSGFuZGxlVmFs
aWQoaGFuZGxlKSkKKyAgICAgICAgcmV0dXJuIENTdHJpbmcoKTsKKworICAgIHJldHVybiBwcm9w
b3NlZFBhdGgubGF0aW4xKCk7Cit9CisKK3ZvaWQgY2xvc2VGaWxlKFBsYXRmb3JtRmlsZUhhbmRs
ZSYgaGFuZGxlKQoreworICAgIGlmIChpc0hhbmRsZVZhbGlkKGhhbmRsZSkpIHsKKyAgICAgICAg
OjpDbG9zZUhhbmRsZShoYW5kbGUpOworICAgICAgICBoYW5kbGUgPSBpbnZhbGlkUGxhdGZvcm1G
aWxlSGFuZGxlOworICAgIH0KK30KKworaW50IHdyaXRlVG9GaWxlKFBsYXRmb3JtRmlsZUhhbmRs
ZSBoYW5kbGUsIGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW5ndGgpCit7CisgICAgaWYgKCFpc0hh
bmRsZVZhbGlkKGhhbmRsZSkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIERXT1JEIGJ5dGVz
V3JpdHRlbjsKKyAgICBib29sIHN1Y2Nlc3MgPSBXcml0ZUZpbGUoaGFuZGxlLCBkYXRhLCBsZW5n
dGgsICZieXRlc1dyaXR0ZW4sIDApOworCisgICAgaWYgKCFzdWNjZXNzKQorICAgICAgICByZXR1
cm4gLTE7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oYnl0ZXNXcml0dGVuKTsKK30KKwor
Ym9vbCB1bmxvYWRNb2R1bGUoUGxhdGZvcm1Nb2R1bGUgbW9kdWxlKQoreworICAgIHJldHVybiA6
OkZyZWVMaWJyYXJ5KG1vZHVsZSk7Cit9CisKK1N0cmluZyBsb2NhbFVzZXJTcGVjaWZpY1N0b3Jh
Z2VEaXJlY3RvcnkoKQoreworICAgIHJldHVybiBTdHJpbmcoTCJcXCIpOworfQorCitTdHJpbmcg
cm9hbWluZ1VzZXJTcGVjaWZpY1N0b3JhZ2VEaXJlY3RvcnkoKQoreworICAgIHJldHVybiBTdHJp
bmcoTCJcXCIpOworfQorCitWZWN0b3I8U3RyaW5nPiBsaXN0RGlyZWN0b3J5KGNvbnN0IFN0cmlu
ZyYgcGF0aCwgY29uc3QgU3RyaW5nJiBmaWx0ZXIpCit7CisgICAgVmVjdG9yPFN0cmluZz4gZW50
cmllczsKKworICAgIFZlY3RvcjxVQ2hhciwgMjU2PiBwYXR0ZXJuOworICAgIHBhdHRlcm4uYXBw
ZW5kKHBhdGguY2hhcmFjdGVycygpLCBwYXRoLmxlbmd0aCgpKTsKKyAgICBpZiAocGF0dGVybi5s
YXN0KCkgIT0gTCcvJyAmJiBwYXR0ZXJuLmxhc3QoKSAhPSBMJ1xcJykKKyAgICAgICAgcGF0dGVy
bi5hcHBlbmQoTCdcXCcpOworCisgICAgU3RyaW5nIHJvb3QocGF0dGVybi5kYXRhKCksIHBhdHRl
cm4uc2l6ZSgpKTsKKyAgICBwYXR0ZXJuLmFwcGVuZChmaWx0ZXIuY2hhcmFjdGVycygpLCBmaWx0
ZXIubGVuZ3RoKCkpOworICAgIHBhdHRlcm4uYXBwZW5kKDApOworCisgICAgV0lOMzJfRklORF9E
QVRBIGZpbmREYXRhOworICAgIEhBTkRMRSBoRmluZCA9IEZpbmRGaXJzdEZpbGUocGF0dGVybi5k
YXRhKCksICZmaW5kRGF0YSk7CisgICAgaWYgKElOVkFMSURfSEFORExFX1ZBTFVFICE9IGhGaW5k
KSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIC8vIEZJWEVNRTogc2hvdWxkIHdlIGFsc28g
YWRkIHRoZSBmb2xkZXJzPyBUaGlzIGZ1bmN0aW9uCisgICAgICAgICAgICAvLyBpcyBzbyBmYXIg
b25seSBjYWxsZWQgYnkgUGx1Z2luRGF0YWJhc2UuY3BwIHRvIGxpc3QKKyAgICAgICAgICAgIC8v
IGFsbCBwbHVnaW5zIGluIGEgZm9sZGVyLCB3aGVyZSBpdCdzIG5vdCBzdXBwb3NlZCB0byBsaXN0
IHN1Yi1mb2xkZXJzLgorICAgICAgICAgICAgaWYgKCEoZmluZERhdGEuZHdGaWxlQXR0cmlidXRl
cyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkpCisgICAgICAgICAgICAgICAgZW50cmllcy5h
cHBlbmQocm9vdCArIGZpbmREYXRhLmNGaWxlTmFtZSk7CisgICAgICAgIH0gd2hpbGUgKEZpbmRO
ZXh0RmlsZShoRmluZCwgJmZpbmREYXRhKSk7CisgICAgICAgIEZpbmRDbG9zZShoRmluZCk7Cisg
ICAgfQorCisgICAgcmV0dXJuIGVudHJpZXM7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZv
cm0vd2luY2UvRmlsZVN5c3RlbVdpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRm
b3JtL3dpbmNlL0ZpbGVTeXN0ZW1XaW5DRS5jcHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29y
ZS9wbGF0Zm9ybS93aW5jZS9GaWxlU3lzdGVtV2luQ0UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0y
ODEsNCArMjgxLDQgQEAgVmVjdG9yPFN0cmluZz4gbGlzdERpcmVjdG9yeShjb25zdCBTdHJpbgog
ICAgIHJldHVybiBlbnRyaWVzOwogfQogCi19Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4
OiBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0ZpbGVTeXN0ZW1XaW5jZS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9GaWxlU3lzdGVtV2luY2UuY3BwCShyZXZpc2lvbiA1
NzI4OSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvRmlsZVN5c3RlbVdpbmNlLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMSwyODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggQ29s
bGFib3JhLCBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDct
MjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwot
ICogYXJlIG1ldDoKLSAqCi0gKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICogMi4gIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0Ci0gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAotICogMy4gIE5laXRo
ZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFt
ZXMgb2YKLSAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3Ig
cHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhv
dXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKLSAqCi0gKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5E
IEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAq
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAi
RmlsZVN5c3RlbS5oIgotCi0jaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKLSNpbmNsdWRlICJQ
bGF0Zm9ybVN0cmluZy5oIgotI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KLQotI2luY2x1
ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDx3aW5jcnlwdC5oPgotCi1uYW1lc3BhY2UgV2ViQ29y
ZSB7Ci0KLXN0YXRpYyBib29sIGdldEZpbGVJbmZvKGNvbnN0IFN0cmluZyYgcGF0aCwgQllfSEFO
RExFX0ZJTEVfSU5GT1JNQVRJT04mIGZpbGVJbmZvKQotewotICAgIFN0cmluZyBmaWxlbmFtZSA9
IHBhdGg7Ci0gICAgSEFORExFIGhGaWxlID0gQ3JlYXRlRmlsZShmaWxlbmFtZS5jaGFyYWN0ZXJz
V2l0aE51bGxUZXJtaW5hdGlvbigpLCBHRU5FUklDX1JFQUQsIEZJTEVfU0hBUkVfUkVBRCwgMAot
ICAgICAgICAsIE9QRU5fRVhJU1RJTkcsIEZJTEVfRkxBR19OT19CVUZGRVJJTkcsIDApOwotCi0g
ICAgaWYgKGhGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICBib29sIHJ0biA9IEdldEZpbGVJbmZvcm1hdGlvbkJ5SGFuZGxlKGhGaWxlLCAm
ZmlsZUluZm8pID8gdHJ1ZSA6IGZhbHNlOwotCi0gICAgQ2xvc2VIYW5kbGUoaEZpbGUpOwotICAg
IHJldHVybiBydG47Ci19Ci0KLWJvb2wgZ2V0RmlsZVNpemUoY29uc3QgU3RyaW5nJiBwYXRoLCBs
b25nIGxvbmcmIHJlc3VsdCkKLXsKLSAgICBCWV9IQU5ETEVfRklMRV9JTkZPUk1BVElPTiBmaWxl
SW5mb3JtYXRpb247Ci0gICAgaWYgKCFnZXRGaWxlSW5mbyhwYXRoLCBmaWxlSW5mb3JtYXRpb24p
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBVTEFSR0VfSU5URUdFUiBmaWxlU2l6ZTsK
LSAgICBmaWxlU2l6ZS5Mb3dQYXJ0ID0gZmlsZUluZm9ybWF0aW9uLm5GaWxlU2l6ZUxvdzsKLSAg
ICBmaWxlU2l6ZS5IaWdoUGFydCA9IGZpbGVJbmZvcm1hdGlvbi5uRmlsZVNpemVIaWdoOwotCi0g
ICAgcmVzdWx0ID0gZmlsZVNpemUuUXVhZFBhcnQ7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQot
Ym9vbCBnZXRGaWxlTW9kaWZpY2F0aW9uVGltZShjb25zdCBTdHJpbmcmIHBhdGgsIHRpbWVfdCYg
cmVzdWx0KQotewotICAgIEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OIGZpbGVJbmZvcm1hdGlv
bjsKLSAgICBpZiAoIWdldEZpbGVJbmZvKHBhdGgsIGZpbGVJbmZvcm1hdGlvbikpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIFVMQVJHRV9JTlRFR0VSIHQ7Ci0gICAgbWVtY3B5KCZ0LCAm
ZmlsZUluZm9ybWF0aW9uLmZ0TGFzdFdyaXRlVGltZSwgc2l6ZW9mKHQpKTsKLSAgICAKLSAgICBy
ZXN1bHQgPSB0LlF1YWRQYXJ0ICogMC4wMDAwMDAxIC0gMTE2NDQ0NzM2MDAuMDsKLQotICAgIHJl
dHVybiB0cnVlOwotfQotCi1ib29sIGZpbGVFeGlzdHMoY29uc3QgU3RyaW5nJiBwYXRoKSAKLXsK
LSAgICBTdHJpbmcgZmlsZW5hbWUgPSBwYXRoOwotICAgIEhBTkRMRSBoRmlsZSA9IENyZWF0ZUZp
bGUoZmlsZW5hbWUuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSwgMCwgRklMRV9TSEFS
RV9SRUFEIHwgRklMRV9TSEFSRV9XUklURQotICAgICAgICAsIDAsIE9QRU5fRVhJU1RJTkcsIEZJ
TEVfRkxBR19OT19CVUZGRVJJTkcsIDApOwotCi0gICAgQ2xvc2VIYW5kbGUoaEZpbGUpOwotCi0g
ICAgcmV0dXJuIGhGaWxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFOwotfQotCi1ib29sIGRlbGV0
ZUZpbGUoY29uc3QgU3RyaW5nJiBwYXRoKQotewotICAgIFN0cmluZyBmaWxlbmFtZSA9IHBhdGg7
Ci0gICAgcmV0dXJuICEhRGVsZXRlRmlsZVcoZmlsZW5hbWUuY2hhcmFjdGVyc1dpdGhOdWxsVGVy
bWluYXRpb24oKSk7Ci19Ci0KLQotYm9vbCBkZWxldGVFbXB0eURpcmVjdG9yeShjb25zdCBTdHJp
bmcmIHBhdGgpCi17Ci0gICAgU3RyaW5nIGZpbGVuYW1lID0gcGF0aDsKLSAgICByZXR1cm4gISFS
ZW1vdmVEaXJlY3RvcnlXKGZpbGVuYW1lLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkp
OwotfQotCi1TdHJpbmcgcGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KGNvbnN0IFN0cmluZyYgcGF0
aCwgY29uc3QgU3RyaW5nJiBjb21wb25lbnQpCi17Ci0gICAgaWYgKGNvbXBvbmVudC5pc0VtcHR5
KCkpCi0gICAgICAgIHJldHVybiBwYXRoOwotCi0gICAgVmVjdG9yPFVDaGFyLCBNQVhfUEFUSD4g
YnVmZmVyOwotCi0gICAgYnVmZmVyLmFwcGVuZChwYXRoLmNoYXJhY3RlcnMoKSwgcGF0aC5sZW5n
dGgoKSk7Ci0KLSAgICBpZiAoYnVmZmVyLmxhc3QoKSAhPSBMJ1xcJyAmJiBidWZmZXIubGFzdCgp
ICE9IEwnLycKLSAgICAgICAgJiYgY29tcG9uZW50WzBdICE9IEwnXFwnICYmIGNvbXBvbmVudFsw
XSAhPSBMJy8nKQotICAgICAgICBidWZmZXIuYXBwZW5kKEwnXFwnKTsKLQotICAgIGJ1ZmZlci5h
cHBlbmQoY29tcG9uZW50LmNoYXJhY3RlcnMoKSwgY29tcG9uZW50Lmxlbmd0aCgpKTsKLQotICAg
IHJldHVybiBTdHJpbmcoYnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSk7Ci19Ci0KLUNTdHJp
bmcgZmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKGNvbnN0IFN0cmluZyYpCi17Ci0gICAgcmV0dXJu
ICIiOwotfQotCi1ib29sIG1ha2VBbGxEaXJlY3Rvcmllcyhjb25zdCBTdHJpbmcmIHBhdGgpCi17
Ci0gICAgaW50IGxhc3REaXZQb3MgPSBzdGQ6Om1heChwYXRoLnJldmVyc2VGaW5kKCcvJyksIHBh
dGgucmV2ZXJzZUZpbmQoJ1xcJykpOwotICAgIGludCBlbmRQb3MgPSBwYXRoLmxlbmd0aCgpOwot
ICAgIGlmIChsYXN0RGl2UG9zID09IHBhdGgubGVuZ3RoKCkgLSAxKSB7Ci0gICAgICAgIGVuZFBv
cyAtPSAxOwotICAgICAgICBsYXN0RGl2UG9zID0gc3RkOjptYXgocGF0aC5yZXZlcnNlRmluZCgn
LycsIGxhc3REaXZQb3MpLCBwYXRoLnJldmVyc2VGaW5kKCdcXCcsIGxhc3REaXZQb3MpKTsKLSAg
ICB9Ci0KLSAgICBpZiAobGFzdERpdlBvcyA+IDApIHsKLSAgICAgICAgaWYgKCFtYWtlQWxsRGly
ZWN0b3JpZXMocGF0aC5zdWJzdHJpbmcoMCwgbGFzdERpdlBvcykpKQotICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFN0cmluZyBmb2xkZXIocGF0aC5zdWJzdHJpbmcoMCwg
ZW5kUG9zKSk7Ci0gICAgQ3JlYXRlRGlyZWN0b3J5KGZvbGRlci5jaGFyYWN0ZXJzV2l0aE51bGxU
ZXJtaW5hdGlvbigpLCAwKTsKLQotICAgIERXT1JEIGZpbGVBdHRyID0gR2V0RmlsZUF0dHJpYnV0
ZXMoZm9sZGVyLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkpOwotICAgIHJldHVybiBm
aWxlQXR0ciAhPSAweEZGRkZGRkZGICYmIChmaWxlQXR0ciAmIEZJTEVfQVRUUklCVVRFX0RJUkVD
VE9SWSk7Ci19Ci0KLVN0cmluZyBob21lRGlyZWN0b3J5UGF0aCgpCi17Ci0gICAgbm90SW1wbGVt
ZW50ZWQoKTsKLSAgICByZXR1cm4gIiI7Ci19Ci0KLVN0cmluZyBwYXRoR2V0RmlsZU5hbWUoY29u
c3QgU3RyaW5nJiBwYXRoKQotewotICAgIHJldHVybiBwYXRoLnN1YnN0cmluZyhzdGQ6Om1heChw
YXRoLnJldmVyc2VGaW5kKCcvJyksIHBhdGgucmV2ZXJzZUZpbmQoJ1xcJykpICsgMSk7Ci19Ci0K
LVN0cmluZyBkaXJlY3RvcnlOYW1lKGNvbnN0IFN0cmluZyYgcGF0aCkKLXsKLSAgICBub3RJbXBs
ZW1lbnRlZCgpOwotICAgIHJldHVybiBTdHJpbmcoKTsKLX0KLQotQ1N0cmluZyBvcGVuVGVtcG9y
YXJ5RmlsZShjb25zdCBjaGFyKiwgUGxhdGZvcm1GaWxlSGFuZGxlJiBoYW5kbGUpCi17Ci0gICAg
aGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0KLSAgICB3Y2hhcl90IHRlbXBQYXRoW01B
WF9QQVRIXTsKLSAgICBpbnQgdGVtcFBhdGhMZW5ndGggPSA6OkdldFRlbXBQYXRoKF9jb3VudG9m
KHRlbXBQYXRoKSwgdGVtcFBhdGgpOwotICAgIGlmICh0ZW1wUGF0aExlbmd0aCA8PSAwIHx8IHRl
bXBQYXRoTGVuZ3RoID4gX2NvdW50b2YodGVtcFBhdGgpKQotICAgICAgICByZXR1cm4gQ1N0cmlu
ZygpOwotCi0gICAgSENSWVBUUFJPViBoQ3J5cHRQcm92ID0gMDsKLSAgICBpZiAoIUNyeXB0QWNx
dWlyZUNvbnRleHQoJmhDcnlwdFByb3YsIDAsIDAsIFBST1ZfUlNBX0ZVTEwsIENSWVBUX1ZFUklG
WUNPTlRFWFQpKQotICAgICAgICByZXR1cm4gQ1N0cmluZygpOwotCi0gICAgU3RyaW5nIHByb3Bv
c2VkUGF0aDsKLSAgICB3aGlsZSAoMSkgewotCi0gICAgICAgIHdjaGFyX3QgdGVtcEZpbGVbXSA9
IEwiWFhYWFhYWFgudG1wIjsgLy8gVXNlIDguMyBzdHlsZSBuYW1lIChtb3JlIGNoYXJhY3RlcnMg
YXJlbid0IGhlbHBmdWwgZHVlIHRvIDguMyBzaG9ydCBmaWxlIG5hbWVzKQotICAgICAgICBjb25z
dCBpbnQgcmFuZG9tUGFydExlbmd0aCA9IDg7Ci0gICAgICAgIGlmICghQ3J5cHRHZW5SYW5kb20o
aENyeXB0UHJvdiwgcmFuZG9tUGFydExlbmd0aCAqIDIsIHJlaW50ZXJwcmV0X2Nhc3Q8QllURSo+
KHRlbXBGaWxlKSkpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvLyBMaW1pdCB0byB2
YWxpZCBmaWxlc3lzdGVtIGNoYXJhY3RlcnMsIGFsc28gZXhjbHVkaW5nIG90aGVycyB0aGF0IGNv
dWxkIGJlIHByb2JsZW1hdGljLCBsaWtlIHB1bmN0dWF0aW9uLgotICAgICAgICAvLyBkb24ndCBp
bmNsdWRlIGJvdGggdXBwZXIgYW5kIGxvd2VyY2FzZSBzaW5jZSBXaW5kb3dzIGZpbGUgc3lzdGVt
cyBhcmUgdHlwaWNhbGx5IG5vdCBjYXNlIHNlbnNpdGl2ZS4KLSAgICAgICAgY29uc3QgY2hhciB2
YWxpZENoYXJzW10gPSAiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKLSAg
ICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYW5kb21QYXJ0TGVuZ3RoOyArK2kpCi0gICAgICAg
ICAgICB0ZW1wRmlsZVtpXSA9IHZhbGlkQ2hhcnNbdGVtcEZpbGVbaV0gJSAoc2l6ZW9mKHZhbGlk
Q2hhcnMpIC0gMSldOwotCi0gICAgICAgIEFTU0VSVCh3Y3NsZW4odGVtcEZpbGUpICogMiA9PSBz
aXplb2YodGVtcEZpbGUpIC0gMik7Ci0KLSAgICAgICAgcHJvcG9zZWRQYXRoID0gcGF0aEJ5QXBw
ZW5kaW5nQ29tcG9uZW50KFN0cmluZyh0ZW1wUGF0aCksIFN0cmluZyh0ZW1wRmlsZSkpOwotCi0g
ICAgICAgIC8vIHVzZSBDUkVBVEVfTkVXIHRvIGF2b2lkIG92ZXJ3cml0aW5nIGFuIGV4aXN0aW5n
IGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lCi0gICAgICAgIGhhbmRsZSA9IENyZWF0ZUZpbGUocHJv
cG9zZWRQYXRoLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCksIEdFTkVSSUNfUkVBRCB8
IEdFTkVSSUNfV1JJVEUsIDAsIDAsIENSRUFURV9ORVcsIEZJTEVfQVRUUklCVVRFX05PUk1BTCwg
MCk7Ci0gICAgICAgIGlmICghaXNIYW5kbGVWYWxpZChoYW5kbGUpICYmIEdldExhc3RFcnJvcigp
ID09IEVSUk9SX0FMUkVBRFlfRVhJU1RTKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAg
ICAgYnJlYWs7Ci0gICAgfQotCi0gICAgQ3J5cHRSZWxlYXNlQ29udGV4dChoQ3J5cHRQcm92LCAw
KTsKLQotICAgIGlmICghaXNIYW5kbGVWYWxpZChoYW5kbGUpKQotICAgICAgICByZXR1cm4gQ1N0
cmluZygpOwotCi0gICAgcmV0dXJuIHByb3Bvc2VkUGF0aC5sYXRpbjEoKTsKLX0KLQotdm9pZCBj
bG9zZUZpbGUoUGxhdGZvcm1GaWxlSGFuZGxlJiBoYW5kbGUpCi17Ci0gICAgaWYgKGlzSGFuZGxl
VmFsaWQoaGFuZGxlKSkgewotICAgICAgICA6OkNsb3NlSGFuZGxlKGhhbmRsZSk7Ci0gICAgICAg
IGhhbmRsZSA9IGludmFsaWRQbGF0Zm9ybUZpbGVIYW5kbGU7Ci0gICAgfQotfQotCi1pbnQgd3Jp
dGVUb0ZpbGUoUGxhdGZvcm1GaWxlSGFuZGxlIGhhbmRsZSwgY29uc3QgY2hhciogZGF0YSwgaW50
IGxlbmd0aCkKLXsKLSAgICBpZiAoIWlzSGFuZGxlVmFsaWQoaGFuZGxlKSkKLSAgICAgICAgcmV0
dXJuIC0xOwotCi0gICAgRFdPUkQgYnl0ZXNXcml0dGVuOwotICAgIGJvb2wgc3VjY2VzcyA9IFdy
aXRlRmlsZShoYW5kbGUsIGRhdGEsIGxlbmd0aCwgJmJ5dGVzV3JpdHRlbiwgMCk7Ci0KLSAgICBp
ZiAoIXN1Y2Nlc3MpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8
aW50PihieXRlc1dyaXR0ZW4pOwotfQotCi1ib29sIHVubG9hZE1vZHVsZShQbGF0Zm9ybU1vZHVs
ZSBtb2R1bGUpCi17Ci0gICAgcmV0dXJuIDo6RnJlZUxpYnJhcnkobW9kdWxlKTsKLX0KLQotU3Ry
aW5nIGxvY2FsVXNlclNwZWNpZmljU3RvcmFnZURpcmVjdG9yeSgpCi17Ci0gICAgcmV0dXJuIFN0
cmluZyhMIlxcIik7Ci19Ci0KLVN0cmluZyByb2FtaW5nVXNlclNwZWNpZmljU3RvcmFnZURpcmVj
dG9yeSgpCi17Ci0gICAgcmV0dXJuIFN0cmluZyhMIlxcIik7Ci19Ci0KLVZlY3RvcjxTdHJpbmc+
IGxpc3REaXJlY3RvcnkoY29uc3QgU3RyaW5nJiBwYXRoLCBjb25zdCBTdHJpbmcmIGZpbHRlcikK
LXsKLSAgICBWZWN0b3I8U3RyaW5nPiBlbnRyaWVzOwotCi0gICAgVmVjdG9yPFVDaGFyLCAyNTY+
IHBhdHRlcm47Ci0gICAgcGF0dGVybi5hcHBlbmQocGF0aC5jaGFyYWN0ZXJzKCksIHBhdGgubGVu
Z3RoKCkpOwotICAgIGlmIChwYXR0ZXJuLmxhc3QoKSAhPSBMJy8nICYmIHBhdHRlcm4ubGFzdCgp
ICE9IEwnXFwnKQotICAgICAgICBwYXR0ZXJuLmFwcGVuZChMJ1xcJyk7Ci0KLSAgICBTdHJpbmcg
cm9vdChwYXR0ZXJuLmRhdGEoKSwgcGF0dGVybi5zaXplKCkpOwotICAgIHBhdHRlcm4uYXBwZW5k
KGZpbHRlci5jaGFyYWN0ZXJzKCksIGZpbHRlci5sZW5ndGgoKSk7Ci0gICAgcGF0dGVybi5hcHBl
bmQoMCk7Ci0KLSAgICBXSU4zMl9GSU5EX0RBVEEgZmluZERhdGE7Ci0gICAgSEFORExFIGhGaW5k
ID0gRmluZEZpcnN0RmlsZShwYXR0ZXJuLmRhdGEoKSwgJmZpbmREYXRhKTsKLSAgICBpZiAoSU5W
QUxJRF9IQU5ETEVfVkFMVUUgIT0gaEZpbmQpIHsKLSAgICAgICAgZG8gewotICAgICAgICAgICAg
Ly8gRklYRU1FOiBzaG91bGQgd2UgYWxzbyBhZGQgdGhlIGZvbGRlcnM/IFRoaXMgZnVuY3Rpb24K
LSAgICAgICAgICAgIC8vIGlzIHNvIGZhciBvbmx5IGNhbGxlZCBieSBQbHVnaW5EYXRhYmFzZS5j
cHAgdG8gbGlzdAotICAgICAgICAgICAgLy8gYWxsIHBsdWdpbnMgaW4gYSBmb2xkZXIsIHdoZXJl
IGl0J3Mgbm90IHN1cHBvc2VkIHRvIGxpc3Qgc3ViLWZvbGRlcnMuCi0gICAgICAgICAgICBpZiAo
IShmaW5kRGF0YS5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSkK
LSAgICAgICAgICAgICAgICBlbnRyaWVzLmFwcGVuZChyb290ICsgZmluZERhdGEuY0ZpbGVOYW1l
KTsKLSAgICAgICAgfSB3aGlsZSAoRmluZE5leHRGaWxlKGhGaW5kLCAmZmluZERhdGEpKTsKLSAg
ICAgICAgRmluZENsb3NlKGhGaW5kKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZW50cmllczsKLX0K
LQotfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9LVVJMV2luQ0UuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvS1VSTFdpbkNFLmNwcAkocmV2aXNpb24gNTcy
ODkpCShmcm9tIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvS1VSTFdpbmNlLmNwcDo1NzI4OSkKKysr
IFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvS1VSTFdpbkNFLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSBJbmMu
CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGli
cmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAor
ICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy
cmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
Zm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0
bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3Ry
ZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJLVVJMLmgiCisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworU3RyaW5nIEtVUkw6OmZpbGVTeXN0ZW1QYXRoKCkgY29uc3QKK3sKKyAgICByZXR1
cm4gcGF0aCgpOworfQorCit9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0tVUkxXaW5D
RS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9LVVJMV2luQ0UuY3Bw
CShyZXZpc2lvbiA1NzI4OSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvS1VSTFdpbkNFLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMjcsNCArMjcsNCBAQCBTdHJpbmcgS1VSTDo6ZmlsZVN5c3Rl
bVBhdGgoKSBjb25zdAogICAgIHJldHVybiBwYXRoKCk7CiB9CiAKLX0KK30gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvS1VSTFdpbmNlLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0tVUkxXaW5jZS5jcHAJKHJldmlzaW9u
IDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9LVVJMV2luY2UuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVG9yY2gg
TW9iaWxlIEluYy4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQg
YnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIgb2Yg
dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgot
ICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi
ZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg
aW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNl
aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAq
IGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBu
b3QsIHdyaXRlIHRvCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBG
cmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBV
U0EuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIktVUkwuaCIKLQotbmFt
ZXNwYWNlIFdlYkNvcmUgewotCi1TdHJpbmcgS1VSTDo6ZmlsZVN5c3RlbVBhdGgoKSBjb25zdAot
ewotICAgIHJldHVybiBwYXRoKCk7Ci19Ci0KLX0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2lu
Y2UvS2V5Z2VuV2luQ0UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luY2Uv
S2V5Z2VuV2luQ0UuY3BwCShyZXZpc2lvbiA1NzI4OSkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS93
aW5jZS9LZXlnZW5XaW5jZS5jcHA6NTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0tl
eWdlbldpbkNFLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAwOC0yMDA5IFRvcmNoIE1vYmlsZSBJbmMuCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICog
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
b247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRp
b24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRl
ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5Z
IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNI
QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUg
R05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4K
KyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2Vl
IHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwK
KyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJTU0xLZXlHZW5lcmF0b3IuaCIKKworI2luY2x1ZGUgIkJhc2U2NC5oIgor
I2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNp
bmNsdWRlIDx3aW5jcnlwdC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3ZvaWQgV2ViQ29y
ZTo6Z2V0U3VwcG9ydGVkS2V5U2l6ZXMoVmVjdG9yPFN0cmluZz4mIHYpCit7CisgICAgdi5hcHBl
bmQoIkhpZ2ggR3JhZGUiKTsKKyAgICB2LmFwcGVuZCgiTWVkaXVtIEdyYWRlIik7Cit9CisKK1N0
cmluZyBXZWJDb3JlOjpzaWduZWRQdWJsaWNLZXlBbmRDaGFsbGVuZ2VTdHJpbmcodW5zaWduZWQg
aW5kZXgsIGNvbnN0IFN0cmluZyYgY2hhbGxlbmdlLCBjb25zdCBLVVJMJiB1cmwpCit7CisgICAg
U3RyaW5nIGtleVN0cmluZzsKKworICAgIEhDUllQVFBST1YgaENvbnRleHQgPSAwOworICAgIEhD
UllQVEtFWSBoS2V5ID0gMDsKKyAgICBQQ0VSVF9QVUJMSUNfS0VZX0lORk8gcFB1YkluZm8gPSAw
OworCisgICAgLy8gVHJ5IHRvIGRlbGV0ZSBpdCBpZiBpdCBleGlzdHMgYWxyZWFkeQorICAgIENy
eXB0QWNxdWlyZUNvbnRleHQoJmhDb250ZXh0LCBfVCgia2V5Z2VuX2NvbnRhaW5lciIpLCBNU19F
TkhBTkNFRF9QUk9WLCBQUk9WX1JTQV9GVUxMLCBDUllQVF9ERUxFVEVLRVlTRVQpOworCisgICAg
ZG8geworICAgICAgICBpZiAoIUNyeXB0QWNxdWlyZUNvbnRleHQoJmhDb250ZXh0LCBfVCgia2V5
Z2VuX2NvbnRhaW5lciIpLCBNU19FTkhBTkNFRF9QUk9WLCBQUk9WX1JTQV9GVUxMLCBDUllQVF9O
RVdLRVlTRVQpKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgRFdPUkQgZHdQdWJJbmZv
TGVuZ3RoID0gMDsKKyAgICAgICAgaWYgKCFDcnlwdEdlbktleShoQ29udGV4dCwgQVRfS0VZRVhD
SEFOR0UsIDAsICZoS2V5KSB8fCAhQ3J5cHRFeHBvcnRQdWJsaWNLZXlJbmZvKGhDb250ZXh0LCBB
VF9LRVlFWENIQU5HRSwgWDUwOV9BU05fRU5DT0RJTkcsIDAsICZkd1B1YkluZm9MZW5ndGgpKQor
ICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gVXNlIG1hbGxvYyBpbnN0ZWFkIG9mIG5l
dywgYmVjYXVzZSBtYWxsb2MgZ3VhcmFudGVlcyB0byByZXR1cm4gYSBwb2ludGVyIGFsaWduZWQg
Zm9yIGFsbCBkYXRhIHR5cGVzLgorICAgICAgICBwUHViSW5mbyA9IHJlaW50ZXJwcmV0X2Nhc3Q8
UENFUlRfUFVCTElDX0tFWV9JTkZPPihmYXN0TWFsbG9jKGR3UHViSW5mb0xlbmd0aCkpOworCisg
ICAgICAgIGlmICghQ3J5cHRFeHBvcnRQdWJsaWNLZXlJbmZvKGhDb250ZXh0LCBBVF9LRVlFWENI
QU5HRSwgWDUwOV9BU05fRU5DT0RJTkcsIHBQdWJJbmZvLCAmZHdQdWJJbmZvTGVuZ3RoKSkKKyAg
ICAgICAgICAgIGJyZWFrOworCisgICAgICAgIENFUlRfS0VZR0VOX1JFUVVFU1RfSU5GTyByZXF1
ZXN0SW5mbyA9IHsgMCB9OworICAgICAgICByZXF1ZXN0SW5mby5kd1ZlcnNpb24gPSBDRVJUX0tF
WUdFTl9SRVFVRVNUX1YxOworICAgICAgICByZXF1ZXN0SW5mby5wd3N6Q2hhbGxlbmdlU3RyaW5n
ID0gTCIiOworICAgICAgICByZXF1ZXN0SW5mby5TdWJqZWN0UHVibGljS2V5SW5mbyA9ICpwUHVi
SW5mbzsKKworICAgICAgICBTdHJpbmcgbG9jYWxDaGFsbGVuZ2UgPSBjaGFsbGVuZ2U7CisKKyAg
ICAgICAgLy8gV2luZG93cyBBUEkgd29uJ3Qgd3JpdGUgdG8gb3VyIGJ1ZmZlciwgYWx0aG91Z2gg
aXQncyBub3QgZGVjbGFyZWQgd2l0aCBjb25zdC4KKyAgICAgICAgcmVxdWVzdEluZm8ucHdzekNo
YWxsZW5nZVN0cmluZyA9IGNvbnN0X2Nhc3Q8d2NoYXJfdCo+KGxvY2FsQ2hhbGxlbmdlLmNoYXJh
Y3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkpOworCisgICAgICAgIENSWVBUX0FMR09SSVRITV9J
REVOVElGSUVSIHNpZ25BbGdvID0geyAwIH07CisgICAgICAgIHNpZ25BbGdvLnBzek9iaklkID0g
c3pPSURfUlNBX1NIQTFSU0E7CisKKyAgICAgICAgRFdPUkQgZHdFbmNvZGVkTGVuZ3RoOworICAg
ICAgICBpZiAoIUNyeXB0U2lnbkFuZEVuY29kZUNlcnRpZmljYXRlKGhDb250ZXh0LCBBVF9LRVlF
WENIQU5HRSwgWDUwOV9BU05fRU5DT0RJTkcsIFg1MDlfS0VZR0VOX1JFUVVFU1RfVE9fQkVfU0lH
TkVELCAmcmVxdWVzdEluZm8sICZzaWduQWxnbywgMCwgMCwgJmR3RW5jb2RlZExlbmd0aCkpCisg
ICAgICAgICAgICBicmVhazsKKworICAgICAgICBWZWN0b3I8Y2hhcj4gYmluYXJ5KGR3RW5jb2Rl
ZExlbmd0aCk7CisgICAgICAgIGlmICghQ3J5cHRTaWduQW5kRW5jb2RlQ2VydGlmaWNhdGUoaENv
bnRleHQsIEFUX0tFWUVYQ0hBTkdFLCBYNTA5X0FTTl9FTkNPRElORywgWDUwOV9LRVlHRU5fUkVR
VUVTVF9UT19CRV9TSUdORUQsICZyZXF1ZXN0SW5mbywgJnNpZ25BbGdvLCAwLCByZWludGVycHJl
dF9jYXN0PExQQllURT4oYmluYXJ5LmRhdGEoKSksICZkd0VuY29kZWRMZW5ndGgpKQorICAgICAg
ICAgICAgYnJlYWs7CisKKyAgICAgICAgVmVjdG9yPGNoYXI+IGJhc2U2NDsKKyAgICAgICAgYmFz
ZTY0RW5jb2RlKGJpbmFyeSwgYmFzZTY0KTsKKyAgICAgICAga2V5U3RyaW5nID0gU3RyaW5nKGJh
c2U2NC5kYXRhKCksIGJhc2U2NC5zaXplKCkpOworCisgICAgfSB3aGlsZSgwKTsKKworICAgIGlm
IChwUHViSW5mbykKKyAgICAgICAgZmFzdEZyZWUocFB1YkluZm8pOworICAgICAgIAorICAgIGlm
IChoS2V5KQorICAgICAgICBDcnlwdERlc3Ryb3lLZXkoaEtleSk7CisKKyAgICBpZiAoaENvbnRl
eHQpCisgICAgICAgIENyeXB0UmVsZWFzZUNvbnRleHQoaENvbnRleHQsIDApOworCisgICAgcmV0
dXJuIGtleVN0cmluZzsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29y
ZS9wbGF0Zm9ybS93aW5jZS9LZXlnZW5XaW5jZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9w
bGF0Zm9ybS93aW5jZS9LZXlnZW5XaW5jZS5jcHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29y
ZS9wbGF0Zm9ybS93aW5jZS9LZXlnZW5XaW5jZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsMTAx
ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBUb3JjaCBNb2JpbGUgSW5j
LgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp
YnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5z
ZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxp
YnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwK
LSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh
cnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
IGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w
eSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0
aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUg
dG8KLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0
cmVldCwgRmlmdGggRmxvb3IsCi0gKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwot
Ci0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiU1NMS2V5R2VuZXJhdG9yLmgiCi0KLSNp
bmNsdWRlICJCYXNlNjQuaCIKLSNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+Ci0KLSNpbmNs
dWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8d2luY3J5cHQuaD4KLQotbmFtZXNwYWNlIFdlYkNv
cmUgewotCi12b2lkIFdlYkNvcmU6OmdldFN1cHBvcnRlZEtleVNpemVzKFZlY3RvcjxTdHJpbmc+
JiB2KQotewotICAgIHYuYXBwZW5kKCJIaWdoIEdyYWRlIik7Ci0gICAgdi5hcHBlbmQoIk1lZGl1
bSBHcmFkZSIpOwotfQotCi1TdHJpbmcgV2ViQ29yZTo6c2lnbmVkUHVibGljS2V5QW5kQ2hhbGxl
bmdlU3RyaW5nKHVuc2lnbmVkIGluZGV4LCBjb25zdCBTdHJpbmcmIGNoYWxsZW5nZSwgY29uc3Qg
S1VSTCYgdXJsKQotewotICAgIFN0cmluZyBrZXlTdHJpbmc7Ci0KLSAgICBIQ1JZUFRQUk9WIGhD
b250ZXh0ID0gMDsKLSAgICBIQ1JZUFRLRVkgaEtleSA9IDA7Ci0gICAgUENFUlRfUFVCTElDX0tF
WV9JTkZPIHBQdWJJbmZvID0gMDsKLQotICAgIC8vIFRyeSB0byBkZWxldGUgaXQgaWYgaXQgZXhp
c3RzIGFscmVhZHkKLSAgICBDcnlwdEFjcXVpcmVDb250ZXh0KCZoQ29udGV4dCwgX1QoImtleWdl
bl9jb250YWluZXIiKSwgTVNfRU5IQU5DRURfUFJPViwgUFJPVl9SU0FfRlVMTCwgQ1JZUFRfREVM
RVRFS0VZU0VUKTsKLQotICAgIGRvIHsKLSAgICAgICAgaWYgKCFDcnlwdEFjcXVpcmVDb250ZXh0
KCZoQ29udGV4dCwgX1QoImtleWdlbl9jb250YWluZXIiKSwgTVNfRU5IQU5DRURfUFJPViwgUFJP
Vl9SU0FfRlVMTCwgQ1JZUFRfTkVXS0VZU0VUKSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAg
ICAgIERXT1JEIGR3UHViSW5mb0xlbmd0aCA9IDA7Ci0gICAgICAgIGlmICghQ3J5cHRHZW5LZXko
aENvbnRleHQsIEFUX0tFWUVYQ0hBTkdFLCAwLCAmaEtleSkgfHwgIUNyeXB0RXhwb3J0UHVibGlj
S2V5SW5mbyhoQ29udGV4dCwgQVRfS0VZRVhDSEFOR0UsIFg1MDlfQVNOX0VOQ09ESU5HLCAwLCAm
ZHdQdWJJbmZvTGVuZ3RoKSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8vIFVzZSBt
YWxsb2MgaW5zdGVhZCBvZiBuZXcsIGJlY2F1c2UgbWFsbG9jIGd1YXJhbnRlZXMgdG8gcmV0dXJu
IGEgcG9pbnRlciBhbGlnbmVkIGZvciBhbGwgZGF0YSB0eXBlcy4KLSAgICAgICAgcFB1YkluZm8g
PSByZWludGVycHJldF9jYXN0PFBDRVJUX1BVQkxJQ19LRVlfSU5GTz4oZmFzdE1hbGxvYyhkd1B1
YkluZm9MZW5ndGgpKTsKLQotICAgICAgICBpZiAoIUNyeXB0RXhwb3J0UHVibGljS2V5SW5mbyho
Q29udGV4dCwgQVRfS0VZRVhDSEFOR0UsIFg1MDlfQVNOX0VOQ09ESU5HLCBwUHViSW5mbywgJmR3
UHViSW5mb0xlbmd0aCkpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBDRVJUX0tFWUdF
Tl9SRVFVRVNUX0lORk8gcmVxdWVzdEluZm8gPSB7IDAgfTsKLSAgICAgICAgcmVxdWVzdEluZm8u
ZHdWZXJzaW9uID0gQ0VSVF9LRVlHRU5fUkVRVUVTVF9WMTsKLSAgICAgICAgcmVxdWVzdEluZm8u
cHdzekNoYWxsZW5nZVN0cmluZyA9IEwiIjsKLSAgICAgICAgcmVxdWVzdEluZm8uU3ViamVjdFB1
YmxpY0tleUluZm8gPSAqcFB1YkluZm87Ci0KLSAgICAgICAgU3RyaW5nIGxvY2FsQ2hhbGxlbmdl
ID0gY2hhbGxlbmdlOwotCi0gICAgICAgIC8vIFdpbmRvd3MgQVBJIHdvbid0IHdyaXRlIHRvIG91
ciBidWZmZXIsIGFsdGhvdWdoIGl0J3Mgbm90IGRlY2xhcmVkIHdpdGggY29uc3QuCi0gICAgICAg
IHJlcXVlc3RJbmZvLnB3c3pDaGFsbGVuZ2VTdHJpbmcgPSBjb25zdF9jYXN0PHdjaGFyX3QqPihs
b2NhbENoYWxsZW5nZS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpKTsKLQotICAgICAg
ICBDUllQVF9BTEdPUklUSE1fSURFTlRJRklFUiBzaWduQWxnbyA9IHsgMCB9OwotICAgICAgICBz
aWduQWxnby5wc3pPYmpJZCA9IHN6T0lEX1JTQV9TSEExUlNBOwotCi0gICAgICAgIERXT1JEIGR3
RW5jb2RlZExlbmd0aDsKLSAgICAgICAgaWYgKCFDcnlwdFNpZ25BbmRFbmNvZGVDZXJ0aWZpY2F0
ZShoQ29udGV4dCwgQVRfS0VZRVhDSEFOR0UsIFg1MDlfQVNOX0VOQ09ESU5HLCBYNTA5X0tFWUdF
Tl9SRVFVRVNUX1RPX0JFX1NJR05FRCwgJnJlcXVlc3RJbmZvLCAmc2lnbkFsZ28sIDAsIDAsICZk
d0VuY29kZWRMZW5ndGgpKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgVmVjdG9yPGNo
YXI+IGJpbmFyeShkd0VuY29kZWRMZW5ndGgpOwotICAgICAgICBpZiAoIUNyeXB0U2lnbkFuZEVu
Y29kZUNlcnRpZmljYXRlKGhDb250ZXh0LCBBVF9LRVlFWENIQU5HRSwgWDUwOV9BU05fRU5DT0RJ
TkcsIFg1MDlfS0VZR0VOX1JFUVVFU1RfVE9fQkVfU0lHTkVELCAmcmVxdWVzdEluZm8sICZzaWdu
QWxnbywgMCwgcmVpbnRlcnByZXRfY2FzdDxMUEJZVEU+KGJpbmFyeS5kYXRhKCkpLCAmZHdFbmNv
ZGVkTGVuZ3RoKSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIFZlY3RvcjxjaGFyPiBi
YXNlNjQ7Ci0gICAgICAgIGJhc2U2NEVuY29kZShiaW5hcnksIGJhc2U2NCk7Ci0gICAgICAgIGtl
eVN0cmluZyA9IFN0cmluZyhiYXNlNjQuZGF0YSgpLCBiYXNlNjQuc2l6ZSgpKTsKLQotICAgIH0g
d2hpbGUoMCk7Ci0KLSAgICBpZiAocFB1YkluZm8pCi0gICAgICAgIGZhc3RGcmVlKHBQdWJJbmZv
KTsKLSAgICAgICAKLSAgICBpZiAoaEtleSkKLSAgICAgICAgQ3J5cHREZXN0cm95S2V5KGhLZXkp
OwotCi0gICAgaWYgKGhDb250ZXh0KQotICAgICAgICBDcnlwdFJlbGVhc2VDb250ZXh0KGhDb250
ZXh0LCAwKTsKLQotICAgIHJldHVybiBrZXlTdHJpbmc7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvTUlNRVR5cGVSZWdpc3RyeVdpbkNF
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL01JTUVUeXBlUmVnaXN0
cnlXaW5DRS5jcHAJKHJldmlzaW9uIDU3Mjg5KQkoZnJvbSBXZWJDb3JlL3BsYXRmb3JtL3dpbmNl
L01JTUVUeXBlUmVnaXN0cnlXaW5jZS5jcHA6NTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dp
bmNlL01JTUVUeXBlUmVnaXN0cnlXaW5DRS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwx
NDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwg
SW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
Q09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBD
T01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJNSU1FVHlwZVJlZ2lz
dHJ5LmgiCisKKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4K
KyNpbmNsdWRlIDx3aW5yZWcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgU3Ry
aW5nIG1pbWVUeXBlRm9yRXh0ZW5zaW9uKGNvbnN0IFN0cmluZyYgZXh0ZW5zaW9uKQoreworICAg
IFN0cmluZyBleHQgPSAiLiIgKyBleHRlbnNpb247CisgICAgV0NIQVIgY29udGVudFR5cGVTdHJb
MjU2XTsKKyAgICBEV09SRCBjb250ZW50VHlwZVN0ckxlbiA9IHNpemVvZihjb250ZW50VHlwZVN0
cik7CisgICAgRFdPUkQgdmFsdWVUeXBlOworCisgICAgSEtFWSBrZXk7CisgICAgU3RyaW5nIHJl
c3VsdDsKKyAgICBpZiAoRVJST1JfU1VDQ0VTUyAhPSBSZWdPcGVuS2V5RXgoSEtFWV9DTEFTU0VT
X1JPT1QsIGV4dC5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpLCAwLCAwLCAma2V5KSkK
KyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIGlmIChFUlJPUl9TVUNDRVNTID09IFJlZ1F1
ZXJ5VmFsdWVFeChrZXksIEwiQ29udGVudCBUeXBlIiwgMCwgJnZhbHVlVHlwZSwgKExQQllURSlj
b250ZW50VHlwZVN0ciwgJmNvbnRlbnRUeXBlU3RyTGVuKSAmJiB2YWx1ZVR5cGUgPT0gUkVHX1Na
KQorICAgICAgICByZXN1bHQgPSBTdHJpbmcoY29udGVudFR5cGVTdHIsIGNvbnRlbnRUeXBlU3Ry
TGVuIC8gc2l6ZW9mKGNvbnRlbnRUeXBlU3RyWzBdKSAtIDEpOworCisgICAgUmVnQ2xvc2VLZXko
a2V5KTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBIYXNoTWFwPFN0cmluZywg
U3RyaW5nPiBtaW1ldHlwZU1hcDsKKworc3RhdGljIHZvaWQgaW5pdE1JTUVUeXBlRW50ZW5zaW9u
TWFwKCkKK3sKKyAgICBpZiAobWltZXR5cGVNYXAuaXNFbXB0eSgpKSB7CisgICAgICAgIC8vZmls
bCB3aXRoIGluaXRpYWwgdmFsdWVzCisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgidHh0IiwgInRl
eHQvcGxhaW4iKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJwZGYiLCAiYXBwbGljYXRpb24v
cGRmIik7CisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgicHMiLCAiYXBwbGljYXRpb24vcG9zdHNj
cmlwdCIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoImh0bWwiLCAidGV4dC9odG1sIik7Cisg
ICAgICAgIG1pbWV0eXBlTWFwLmFkZCgiaHRtIiwgInRleHQvaHRtbCIpOworICAgICAgICBtaW1l
dHlwZU1hcC5hZGQoInhtbCIsICJ0ZXh0L3htbCIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQo
InhzbCIsICJ0ZXh0L3hzbCIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoImpzIiwgImFwcGxp
Y2F0aW9uL3gtamF2YXNjcmlwdCIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoInhodG1sIiwg
ImFwcGxpY2F0aW9uL3hodG1sK3htbCIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoInJzcyIs
ICJhcHBsaWNhdGlvbi9yc3MreG1sIik7CisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgid2ViYXJj
aGl2ZSIsICJhcHBsaWNhdGlvbi94LXdlYmFyY2hpdmUiKTsKKyAgICAgICAgbWltZXR5cGVNYXAu
YWRkKCJzdmciLCAiaW1hZ2Uvc3ZnK3htbCIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoInN2
Z3oiLCAiaW1hZ2Uvc3ZnK3htbCIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoImpwZyIsICJp
bWFnZS9qcGVnIik7CisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgianBlZyIsICJpbWFnZS9qcGVn
Iik7CisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgicG5nIiwgImltYWdlL3BuZyIpOworICAgICAg
ICBtaW1ldHlwZU1hcC5hZGQoInRpZiIsICJpbWFnZS90aWZmIik7CisgICAgICAgIG1pbWV0eXBl
TWFwLmFkZCgidGlmZiIsICJpbWFnZS90aWZmIik7CisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgi
aWNvIiwgImltYWdlL2ljbyIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoImN1ciIsICJpbWFn
ZS9pY28iKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJibXAiLCAiaW1hZ2UvYm1wIik7Cisg
ICAgICAgIG1pbWV0eXBlTWFwLmFkZCgiY3NzIiwgInRleHQvY3NzIik7CisgICAgICAgIC8vIEZJ
WE1FOiBDdXN0b20gZm9udCB3b3JrcyBvbmx5IHdoZW4gTUlNRSBpcyAidGV4dC9wbGFpbiIKKyAg
ICAgICAgbWltZXR5cGVNYXAuYWRkKCJ0dGYiLCAidGV4dC9wbGFpbiIpOyAvLyAiZm9udC90dGYi
CisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgib3RmIiwgInRleHQvcGxhaW4iKTsgLy8gImZvbnQv
b3RmIgorI2lmIEVOQUJMRShXTUwpCisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgid21sIiwgInRl
eHQvdm5kLndhcC53bWwiKTsKKyNlbmRpZgorI2lmIEVOQUJMRShXQlhNTCkKKyAgICAgICAgbWlt
ZXR5cGVNYXAuYWRkKCJ3YnhtbCIsICJhcHBsaWNhdGlvbi92bmQud2FwLndtbGMiKTsKKyNlbmRp
ZgorICAgIH0KK30KKworU3RyaW5nIE1JTUVUeXBlUmVnaXN0cnk6OmdldFByZWZlcnJlZEV4dGVu
c2lvbkZvck1JTUVUeXBlKGNvbnN0IFN0cmluZyYgdHlwZSkKK3sKKyAgICBpZiAodHlwZS5pc0Vt
cHR5KCkpCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKworICAgIC8vIEF2b2lkIGNvbmZsaWN0
cyB3aXRoICJ0dGYiIGFuZCAib3RmIgorICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0eXBlLCAi
dGV4dC9wbGFpbiIpKQorICAgICAgICByZXR1cm4gInR4dCI7CisKKyAgICBpbml0TUlNRVR5cGVF
bnRlbnNpb25NYXAoKTsKKworICAgIGZvciAoSGFzaE1hcDxTdHJpbmcsIFN0cmluZz46Oml0ZXJh
dG9yIGkgPSBtaW1ldHlwZU1hcC5iZWdpbigpOyBpICE9IG1pbWV0eXBlTWFwLmVuZCgpOyArK2kp
IHsKKyAgICAgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGktPnNlY29uZCwgdHlwZSkpCisgICAg
ICAgICAgICByZXR1cm4gaS0+Zmlyc3Q7CisgICAgfQorCisjaWYgRU5BQkxFKFhIVE1MTVApCisg
ICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKCJhcHBsaWNhdGlvbi92bmQud2FwLnhodG1sK3htbCIs
IHR5cGUpKQorICAgICAgICByZXR1cm4gU3RyaW5nKCJ4bWwiKTsKKyNlbmRpZgorCisgICAgcmV0
dXJuIFN0cmluZygpOworfQorCitTdHJpbmcgTUlNRVR5cGVSZWdpc3RyeTo6Z2V0TUlNRVR5cGVG
b3JFeHRlbnNpb24oY29uc3QgU3RyaW5nICZleHQpCit7CisgICAgaWYgKGV4dC5pc0VtcHR5KCkp
CisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKworICAgIGluaXRNSU1FVHlwZUVudGVuc2lvbk1h
cCgpOworCisgICAgU3RyaW5nIHJlc3VsdCA9IG1pbWV0eXBlTWFwLmdldChleHQubG93ZXIoKSk7
CisgICAgaWYgKHJlc3VsdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmVzdWx0ID0gbWltZVR5cGVG
b3JFeHRlbnNpb24oZXh0KTsKKyAgICAgICAgaWYgKCFyZXN1bHQuaXNFbXB0eSgpKQorICAgICAg
ICAgICAgbWltZXR5cGVNYXAuYWRkKGV4dCwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJl
c3VsdC5pc0VtcHR5KCkgPyAidW5rbm93bi91bmtub3duIiA6IHJlc3VsdDsKK30KKworYm9vbCBN
SU1FVHlwZVJlZ2lzdHJ5Ojppc0FwcGxpY2F0aW9uUGx1Z2luTUlNRVR5cGUoY29uc3QgU3RyaW5n
JikKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0v
d2luY2UvTUlNRVR5cGVSZWdpc3RyeVdpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Bs
YXRmb3JtL3dpbmNlL01JTUVUeXBlUmVnaXN0cnlXaW5DRS5jcHAJKHJldmlzaW9uIDU3Mjg5KQor
KysgV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9NSU1FVHlwZVJlZ2lzdHJ5V2luQ0UuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xMzgsNCArMTM4LDQgQEAgYm9vbCBNSU1FVHlwZVJlZ2lzdHJ5Ojppc0Fw
cGxpY2F0aW9uUGx1ZwogICAgIHJldHVybiBmYWxzZTsKIH0KIAotfQorfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9NSU1FVHlwZVJlZ2lzdHJ5V2lu
Y2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvTUlNRVR5cGVSZWdp
c3RyeVdpbmNlLmNwcAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbmNl
L01JTUVUeXBlUmVnaXN0cnlXaW5jZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsMTQxICswLDAg
QEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0
cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5j
LgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09N
UFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
LSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01Q
VVRFUiwgSU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJNSU1FVHlwZVJlZ2lzdHJ5
LmgiCi0KLSNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNp
bmNsdWRlIDx3aW5yZWcuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1zdGF0aWMgU3RyaW5n
IG1pbWVUeXBlRm9yRXh0ZW5zaW9uKGNvbnN0IFN0cmluZyYgZXh0ZW5zaW9uKQotewotICAgIFN0
cmluZyBleHQgPSAiLiIgKyBleHRlbnNpb247Ci0gICAgV0NIQVIgY29udGVudFR5cGVTdHJbMjU2
XTsKLSAgICBEV09SRCBjb250ZW50VHlwZVN0ckxlbiA9IHNpemVvZihjb250ZW50VHlwZVN0cik7
Ci0gICAgRFdPUkQgdmFsdWVUeXBlOwotCi0gICAgSEtFWSBrZXk7Ci0gICAgU3RyaW5nIHJlc3Vs
dDsKLSAgICBpZiAoRVJST1JfU1VDQ0VTUyAhPSBSZWdPcGVuS2V5RXgoSEtFWV9DTEFTU0VTX1JP
T1QsIGV4dC5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpLCAwLCAwLCAma2V5KSkKLSAg
ICAgICAgcmV0dXJuIHJlc3VsdDsKLQotICAgIGlmIChFUlJPUl9TVUNDRVNTID09IFJlZ1F1ZXJ5
VmFsdWVFeChrZXksIEwiQ29udGVudCBUeXBlIiwgMCwgJnZhbHVlVHlwZSwgKExQQllURSljb250
ZW50VHlwZVN0ciwgJmNvbnRlbnRUeXBlU3RyTGVuKSAmJiB2YWx1ZVR5cGUgPT0gUkVHX1NaKQot
ICAgICAgICByZXN1bHQgPSBTdHJpbmcoY29udGVudFR5cGVTdHIsIGNvbnRlbnRUeXBlU3RyTGVu
IC8gc2l6ZW9mKGNvbnRlbnRUeXBlU3RyWzBdKSAtIDEpOwotCi0gICAgUmVnQ2xvc2VLZXkoa2V5
KTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBIYXNoTWFwPFN0cmluZywgU3Ry
aW5nPiBtaW1ldHlwZU1hcDsKLQotc3RhdGljIHZvaWQgaW5pdE1JTUVUeXBlRW50ZW5zaW9uTWFw
KCkKLXsKLSAgICBpZiAobWltZXR5cGVNYXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgIC8vZmlsbCB3
aXRoIGluaXRpYWwgdmFsdWVzCi0gICAgICAgIG1pbWV0eXBlTWFwLmFkZCgidHh0IiwgInRleHQv
cGxhaW4iKTsKLSAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJwZGYiLCAiYXBwbGljYXRpb24vcGRm
Iik7Ci0gICAgICAgIG1pbWV0eXBlTWFwLmFkZCgicHMiLCAiYXBwbGljYXRpb24vcG9zdHNjcmlw
dCIpOwotICAgICAgICBtaW1ldHlwZU1hcC5hZGQoImh0bWwiLCAidGV4dC9odG1sIik7Ci0gICAg
ICAgIG1pbWV0eXBlTWFwLmFkZCgiaHRtIiwgInRleHQvaHRtbCIpOwotICAgICAgICBtaW1ldHlw
ZU1hcC5hZGQoInhtbCIsICJ0ZXh0L3htbCIpOwotICAgICAgICBtaW1ldHlwZU1hcC5hZGQoInhz
bCIsICJ0ZXh0L3hzbCIpOwotICAgICAgICBtaW1ldHlwZU1hcC5hZGQoImpzIiwgImFwcGxpY2F0
aW9uL3gtamF2YXNjcmlwdCIpOwotICAgICAgICBtaW1ldHlwZU1hcC5hZGQoInhodG1sIiwgImFw
cGxpY2F0aW9uL3hodG1sK3htbCIpOwotICAgICAgICBtaW1ldHlwZU1hcC5hZGQoInJzcyIsICJh
cHBsaWNhdGlvbi9yc3MreG1sIik7Ci0gICAgICAgIG1pbWV0eXBlTWFwLmFkZCgid2ViYXJjaGl2
ZSIsICJhcHBsaWNhdGlvbi94LXdlYmFyY2hpdmUiKTsKLSAgICAgICAgbWltZXR5cGVNYXAuYWRk
KCJzdmciLCAiaW1hZ2Uvc3ZnK3htbCIpOwotICAgICAgICBtaW1ldHlwZU1hcC5hZGQoInN2Z3oi
LCAiaW1hZ2Uvc3ZnK3htbCIpOwotICAgICAgICBtaW1ldHlwZU1hcC5hZGQoImpwZyIsICJpbWFn
ZS9qcGVnIik7Ci0gICAgICAgIG1pbWV0eXBlTWFwLmFkZCgianBlZyIsICJpbWFnZS9qcGVnIik7
Ci0gICAgICAgIG1pbWV0eXBlTWFwLmFkZCgicG5nIiwgImltYWdlL3BuZyIpOwotICAgICAgICBt
aW1ldHlwZU1hcC5hZGQoInRpZiIsICJpbWFnZS90aWZmIik7Ci0gICAgICAgIG1pbWV0eXBlTWFw
LmFkZCgidGlmZiIsICJpbWFnZS90aWZmIik7Ci0gICAgICAgIG1pbWV0eXBlTWFwLmFkZCgiaWNv
IiwgImltYWdlL2ljbyIpOwotICAgICAgICBtaW1ldHlwZU1hcC5hZGQoImN1ciIsICJpbWFnZS9p
Y28iKTsKLSAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJibXAiLCAiaW1hZ2UvYm1wIik7Ci0gICAg
ICAgIG1pbWV0eXBlTWFwLmFkZCgiY3NzIiwgInRleHQvY3NzIik7Ci0gICAgICAgIC8vIEZJWE1F
OiBDdXN0b20gZm9udCB3b3JrcyBvbmx5IHdoZW4gTUlNRSBpcyAidGV4dC9wbGFpbiIKLSAgICAg
ICAgbWltZXR5cGVNYXAuYWRkKCJ0dGYiLCAidGV4dC9wbGFpbiIpOyAvLyAiZm9udC90dGYiCi0g
ICAgICAgIG1pbWV0eXBlTWFwLmFkZCgib3RmIiwgInRleHQvcGxhaW4iKTsgLy8gImZvbnQvb3Rm
IgotI2lmIEVOQUJMRShXTUwpCi0gICAgICAgIG1pbWV0eXBlTWFwLmFkZCgid21sIiwgInRleHQv
dm5kLndhcC53bWwiKTsKLSNlbmRpZgotI2lmIEVOQUJMRShXQlhNTCkKLSAgICAgICAgbWltZXR5
cGVNYXAuYWRkKCJ3YnhtbCIsICJhcHBsaWNhdGlvbi92bmQud2FwLndtbGMiKTsKLSNlbmRpZgot
ICAgIH0KLX0KLQotU3RyaW5nIE1JTUVUeXBlUmVnaXN0cnk6OmdldFByZWZlcnJlZEV4dGVuc2lv
bkZvck1JTUVUeXBlKGNvbnN0IFN0cmluZyYgdHlwZSkKLXsKLSAgICBpZiAodHlwZS5pc0VtcHR5
KCkpCi0gICAgICAgIHJldHVybiBTdHJpbmcoKTsKLQotICAgIC8vIEF2b2lkIGNvbmZsaWN0cyB3
aXRoICJ0dGYiIGFuZCAib3RmIgotICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZSh0eXBlLCAidGV4
dC9wbGFpbiIpKQotICAgICAgICByZXR1cm4gInR4dCI7Ci0KLSAgICBpbml0TUlNRVR5cGVFbnRl
bnNpb25NYXAoKTsKLQotICAgIGZvciAoSGFzaE1hcDxTdHJpbmcsIFN0cmluZz46Oml0ZXJhdG9y
IGkgPSBtaW1ldHlwZU1hcC5iZWdpbigpOyBpICE9IG1pbWV0eXBlTWFwLmVuZCgpOyArK2kpIHsK
LSAgICAgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGktPnNlY29uZCwgdHlwZSkpCi0gICAgICAg
ICAgICByZXR1cm4gaS0+Zmlyc3Q7Ci0gICAgfQotCi0jaWYgRU5BQkxFKFhIVE1MTVApCi0gICAg
aWYgKGVxdWFsSWdub3JpbmdDYXNlKCJhcHBsaWNhdGlvbi92bmQud2FwLnhodG1sK3htbCIsIHR5
cGUpKQotICAgICAgICByZXR1cm4gU3RyaW5nKCJ4bWwiKTsKLSNlbmRpZgotCi0gICAgcmV0dXJu
IFN0cmluZygpOwotfQotCi1TdHJpbmcgTUlNRVR5cGVSZWdpc3RyeTo6Z2V0TUlNRVR5cGVGb3JF
eHRlbnNpb24oY29uc3QgU3RyaW5nICZleHQpCi17Ci0gICAgaWYgKGV4dC5pc0VtcHR5KCkpCi0g
ICAgICAgIHJldHVybiBTdHJpbmcoKTsKLQotICAgIGluaXRNSU1FVHlwZUVudGVuc2lvbk1hcCgp
OwotCi0gICAgU3RyaW5nIHJlc3VsdCA9IG1pbWV0eXBlTWFwLmdldChleHQubG93ZXIoKSk7Ci0g
ICAgaWYgKHJlc3VsdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgcmVzdWx0ID0gbWltZVR5cGVGb3JF
eHRlbnNpb24oZXh0KTsKLSAgICAgICAgaWYgKCFyZXN1bHQuaXNFbXB0eSgpKQotICAgICAgICAg
ICAgbWltZXR5cGVNYXAuYWRkKGV4dCwgcmVzdWx0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3Vs
dC5pc0VtcHR5KCkgPyAidW5rbm93bi91bmtub3duIiA6IHJlc3VsdDsKLX0KLQotYm9vbCBNSU1F
VHlwZVJlZ2lzdHJ5Ojppc0FwcGxpY2F0aW9uUGx1Z2luTUlNRVR5cGUoY29uc3QgU3RyaW5nJikK
LXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLX0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2lu
Y2UvUGFzdGVib2FyZFdpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3dp
bmNlL1Bhc3RlYm9hcmRXaW5DRS5jcHAJKHJldmlzaW9uIDU3Mjg5KQkoZnJvbSBXZWJDb3JlL3Bs
YXRmb3JtL3dpbmNlL1Bhc3RlYm9hcmRXaW5jZS5jcHA6NTcyODkpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL3dpbmNlL1Bhc3RlYm9hcmRXaW5DRS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwz
MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwg
SW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
Q09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBD
T01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJQYXN0ZWJvYXJk
LmgiCisKKyNpbmNsdWRlICJDbGlwYm9hcmRVdGlsaXRpZXNXaW4uaCIKKyNpbmNsdWRlICJEb2N1
bWVudC5oIgorI2luY2x1ZGUgIkRvY3VtZW50RnJhZ21lbnQuaCIKKyNpbmNsdWRlICJFbGVtZW50
LmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJIaXRUZXN0UmVzdWx0LmgiCisjaW5j
bHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJLVVJMLmgiCisjaW5jbHVkZSAiUGFnZS5oIgorI2lu
Y2x1ZGUgIlJhbmdlLmgiCisjaW5jbHVkZSAiUmVuZGVySW1hZ2UuaCIKKyNpbmNsdWRlICJUZXh0
RW5jb2RpbmcuaCIKKyNpbmNsdWRlICJXZWJDb3JlSW5zdGFuY2VIYW5kbGUuaCIKKyNpbmNsdWRl
ICJtYXJrdXAuaCIKKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworc3RhdGljIFVJTlQgSFRNTENsaXBib2FyZEZvcm1hdCA9IDA7CitzdGF0aWMg
VUlOVCBCb29rbWFya0NsaXBib2FyZEZvcm1hdCA9IDA7CitzdGF0aWMgVUlOVCBXZWJTbWFydFBh
c3RlRm9ybWF0ID0gMDsKKworZXh0ZXJuIEhEQyBoU2NyZWVuREM7CisKK3N0YXRpYyBMUkVTVUxU
IENBTExCQUNLIFBhc3RlYm9hcmRPd25lclduZFByb2MoSFdORCBoV25kLCBVSU5UIG1lc3NhZ2Us
IFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgTFJFU1VMVCBscmVzdWx0ID0g
MDsKKyAgICBMT05HIGxvbmdQdHIgPSBHZXRXaW5kb3dMb25nKGhXbmQsIDApOworCisgICAgc3dp
dGNoIChtZXNzYWdlKSB7CisgICAgY2FzZSBXTV9SRU5ERVJGT1JNQVQ6CisgICAgICAgIC8vIFRo
aXMgbWVzc2FnZSBjb21lcyB3aGVuIFNldENsaXBib2FyZERhdGEgd2FzIHNlbnQgYSBudWxsIGRh
dGEgaGFuZGxlCisgICAgICAgIC8vIGFuZCBub3cgaXQncyBjb21lIHRpbWUgdG8gcHV0IHRoZSBk
YXRhIG9uIHRoZSBjbGlwYm9hcmQuCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV01fUkVOREVS
QUxMRk9STUFUUzoKKyAgICAgICAgLy8gVGhpcyBtZXNzYWdlIGNvbWVzIHdoZW4gU2V0Q2xpcGJv
YXJkRGF0YSB3YXMgc2VudCBhIG51bGwgZGF0YSBoYW5kbGUKKyAgICAgICAgLy8gYW5kIG5vdyB0
aGlzIGFwcGxpY2F0aW9uIGlzIGFib3V0IHRvIHF1aXQsIHNvIGl0IG11c3QgcHV0IGRhdGEgb24K
KyAgICAgICAgLy8gdGhlIGNsaXBib2FyZCBiZWZvcmUgaXQgZXhpdHMuCisgICAgICAgIGJyZWFr
OworICAgIGNhc2UgV01fREVTVFJPWToKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAg
ICAgICAgbHJlc3VsdCA9IERlZldpbmRvd1Byb2MoaFduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFy
YW0pOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGxyZXN1bHQ7Cit9CisKK1Bh
c3RlYm9hcmQqIFBhc3RlYm9hcmQ6OmdlbmVyYWxQYXN0ZWJvYXJkKCkKK3sKKyAgICBzdGF0aWMg
UGFzdGVib2FyZCogcGFzdGVib2FyZCA9IG5ldyBQYXN0ZWJvYXJkOworICAgIHJldHVybiBwYXN0
ZWJvYXJkOworfQorCitQYXN0ZWJvYXJkOjpQYXN0ZWJvYXJkKCkKK3sKKyAgICAvLyBtYWtlIGEg
ZHVtbXkgSFdORCB0byBiZSB0aGUgV2luZG93cyBjbGlwYm9hcmQncyBvd25lcgorICAgIFdORENM
QVNTIHdjID0gezB9OworICAgIG1lbXNldCgmd2MsIDAsIHNpemVvZih3YykpOworICAgIHdjLmxw
Zm5XbmRQcm9jICAgID0gUGFzdGVib2FyZE93bmVyV25kUHJvYzsKKyAgICB3Yy5oSW5zdGFuY2Ug
ICAgICA9IFdlYkNvcmU6Omluc3RhbmNlSGFuZGxlKCk7CisgICAgd2MubHBzekNsYXNzTmFtZSAg
PSBMIlBhc3RlYm9hcmRPd25lcldpbmRvd0NsYXNzIjsKKyAgICA6OlJlZ2lzdGVyQ2xhc3MoJndj
KTsKKworICAgIG1fb3duZXIgPSA6OkNyZWF0ZVdpbmRvdyhMIlBhc3RlYm9hcmRPd25lcldpbmRv
d0NsYXNzIiwgTCJQYXN0ZWJvYXJkT3duZXJXaW5kb3ciLCAwLCAwLCAwLCAwLCAwLAorICAgICAg
ICBIV05EX01FU1NBR0UsIDAsIDAsIDApOworCisgICAgSFRNTENsaXBib2FyZEZvcm1hdCA9IDo6
UmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQoTCJIVE1MIEZvcm1hdCIpOworICAgIEJvb2ttYXJrQ2xp
cGJvYXJkRm9ybWF0ID0gOjpSZWdpc3RlckNsaXBib2FyZEZvcm1hdChMIlVuaWZvcm1SZXNvdXJj
ZUxvY2F0b3JXIik7CisgICAgV2ViU21hcnRQYXN0ZUZvcm1hdCA9IDo6UmVnaXN0ZXJDbGlwYm9h
cmRGb3JtYXQoTCJXZWJLaXQgU21hcnQgUGFzdGUgRm9ybWF0Iik7Cit9CisKK3ZvaWQgUGFzdGVi
b2FyZDo6Y2xlYXIoKQoreworICAgIGlmICg6Ok9wZW5DbGlwYm9hcmQobV9vd25lcikpIHsKKyAg
ICAgICAgOjpFbXB0eUNsaXBib2FyZCgpOworICAgICAgICA6OkNsb3NlQ2xpcGJvYXJkKCk7Cisg
ICAgfQorfQorCit2b2lkIFBhc3RlYm9hcmQ6OndyaXRlU2VsZWN0aW9uKFJhbmdlKiBzZWxlY3Rl
ZFJhbmdlLCBib29sIGNhblNtYXJ0Q29weU9yRGVsZXRlLCBGcmFtZSogZnJhbWUpCit7CisgICAg
Y2xlYXIoKTsKKworICAgIC8vIFB1dCBDRl9IVE1MIGZvcm1hdCBvbiB0aGUgcGFzdGVib2FyZAor
ICAgIGlmICg6Ok9wZW5DbGlwYm9hcmQobV9vd25lcikpIHsKKyAgICAgICAgRXhjZXB0aW9uQ29k
ZSBlYyA9IDA7CisgICAgICAgIFZlY3RvcjxjaGFyPiBkYXRhOworICAgICAgICBtYXJrdXBUb0NG
X0hUTUwoY3JlYXRlTWFya3VwKHNlbGVjdGVkUmFuZ2UsIDAsIEFubm90YXRlRm9ySW50ZXJjaGFu
Z2UpLCBzZWxlY3RlZFJhbmdlLT5zdGFydENvbnRhaW5lcihlYyktPmRvY3VtZW50KCktPnVybCgp
LCBkYXRhKTsKKyAgICAgICAgSEdMT0JBTCBjYkRhdGEgPSBjcmVhdGVHbG9iYWxEYXRhKGRhdGEp
OworICAgICAgICBpZiAoITo6U2V0Q2xpcGJvYXJkRGF0YShIVE1MQ2xpcGJvYXJkRm9ybWF0LCBj
YkRhdGEpKQorICAgICAgICAgICAgOjpHbG9iYWxGcmVlKGNiRGF0YSk7CisgICAgICAgIDo6Q2xv
c2VDbGlwYm9hcmQoKTsKKyAgICB9CisKKyAgICAvLyBQdXQgcGxhaW4gc3RyaW5nIG9uIHRoZSBw
YXN0ZWJvYXJkLiBDRl9VTklDT0RFVEVYVCBjb3ZlcnMgQ0ZfVEVYVCBhcyB3ZWxsCisgICAgU3Ry
aW5nIHN0ciA9IGZyYW1lLT5zZWxlY3RlZFRleHQoKTsKKyAgICByZXBsYWNlTmV3bGluZXNXaXRo
V2luZG93c1N0eWxlTmV3bGluZXMoc3RyKTsKKyAgICByZXBsYWNlTkJTUFdpdGhTcGFjZShzdHIp
OworICAgIGlmICg6Ok9wZW5DbGlwYm9hcmQobV9vd25lcikpIHsKKyAgICAgICAgSEdMT0JBTCBj
YkRhdGEgPSBjcmVhdGVHbG9iYWxEYXRhKHN0cik7CisgICAgICAgIGlmICghOjpTZXRDbGlwYm9h
cmREYXRhKENGX1VOSUNPREVURVhULCBjYkRhdGEpKQorICAgICAgICAgICAgOjpHbG9iYWxGcmVl
KGNiRGF0YSk7CisgICAgICAgIDo6Q2xvc2VDbGlwYm9hcmQoKTsKKyAgICB9CisKKyAgICAvLyBl
bmFibGUgc21hcnQtcmVwbGFjaW5nIGxhdGVyIG9uIGJ5IHB1dHRpbmcgZHVtbXkgZGF0YSBvbiB0
aGUgcGFzdGVib2FyZAorICAgIGlmIChjYW5TbWFydENvcHlPckRlbGV0ZSkgeworICAgICAgICBp
ZiAoOjpPcGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7CisgICAgICAgICAgICA6OlNldENsaXBib2Fy
ZERhdGEoV2ViU21hcnRQYXN0ZUZvcm1hdCwgMCk7CisgICAgICAgICAgICA6OkNsb3NlQ2xpcGJv
YXJkKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgUGFzdGVib2FyZDo6d3JpdGVQbGFp
blRleHQoY29uc3QgU3RyaW5nJiB0ZXh0KQoreworICAgIGNsZWFyKCk7CisKKyAgICAvLyBQdXQg
cGxhaW4gc3RyaW5nIG9uIHRoZSBwYXN0ZWJvYXJkLiBDRl9VTklDT0RFVEVYVCBjb3ZlcnMgQ0Zf
VEVYVCBhcyB3ZWxsCisgICAgU3RyaW5nIHN0ciA9IHRleHQ7CisgICAgcmVwbGFjZU5ld2xpbmVz
V2l0aFdpbmRvd3NTdHlsZU5ld2xpbmVzKHN0cik7CisgICAgaWYgKDo6T3BlbkNsaXBib2FyZCht
X293bmVyKSkgeworICAgICAgICBIR0xPQkFMIGNiRGF0YSA9IGNyZWF0ZUdsb2JhbERhdGEoc3Ry
KTsKKyAgICAgICAgaWYgKCE6OlNldENsaXBib2FyZERhdGEoQ0ZfVU5JQ09ERVRFWFQsIGNiRGF0
YSkpCisgICAgICAgICAgICA6Okdsb2JhbEZyZWUoY2JEYXRhKTsKKyAgICAgICAgOjpDbG9zZUNs
aXBib2FyZCgpOworICAgIH0KK30KKwordm9pZCBQYXN0ZWJvYXJkOjp3cml0ZVVSTChjb25zdCBL
VVJMJiB1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGVTdHIsIEZyYW1lKiBmcmFtZSkKK3sKKyAgICBB
U1NFUlQoIXVybC5pc0VtcHR5KCkpOworCisgICAgY2xlYXIoKTsKKworICAgIFN0cmluZyB0aXRs
ZSh0aXRsZVN0cik7CisgICAgaWYgKHRpdGxlLmlzRW1wdHkoKSkgeworICAgICAgICB0aXRsZSA9
IHVybC5sYXN0UGF0aENvbXBvbmVudCgpOworICAgICAgICBpZiAodGl0bGUuaXNFbXB0eSgpKQor
ICAgICAgICAgICAgdGl0bGUgPSB1cmwuaG9zdCgpOworICAgIH0KKworICAgIC8vIHdyaXRlIHRv
IGNsaXBib2FyZCBpbiBmb3JtYXQgY29tLmFwcGxlLnNhZmFyaS5ib29rbWFya2RhdGEgdG8gYmUg
YWJsZSB0byBwYXN0ZSBpbnRvIHRoZSBib29rbWFya3MgdmlldyB3aXRoIGFwcHJvcHJpYXRlIHRp
dGxlCisgICAgaWYgKDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgeworICAgICAgICBIR0xPQkFM
IGNiRGF0YSA9IGNyZWF0ZUdsb2JhbERhdGEodXJsLCB0aXRsZSk7CisgICAgICAgIGlmICghOjpT
ZXRDbGlwYm9hcmREYXRhKEJvb2ttYXJrQ2xpcGJvYXJkRm9ybWF0LCBjYkRhdGEpKQorICAgICAg
ICAgICAgOjpHbG9iYWxGcmVlKGNiRGF0YSk7CisgICAgICAgIDo6Q2xvc2VDbGlwYm9hcmQoKTsK
KyAgICB9CisKKyAgICAvLyB3cml0ZSB0byBjbGlwYm9hcmQgaW4gZm9ybWF0IENGX0hUTUwgdG8g
YmUgYWJsZSB0byBwYXN0ZSBpbnRvIGNvbnRlbnRlZGl0YWJsZSBhcmVhcyBhcyBhIGxpbmsKKyAg
ICBpZiAoOjpPcGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7CisgICAgICAgIFZlY3RvcjxjaGFyPiBk
YXRhOworICAgICAgICBtYXJrdXBUb0NGX0hUTUwodXJsVG9NYXJrdXAodXJsLCB0aXRsZSksICIi
LCBkYXRhKTsKKyAgICAgICAgSEdMT0JBTCBjYkRhdGEgPSBjcmVhdGVHbG9iYWxEYXRhKGRhdGEp
OworICAgICAgICBpZiAoITo6U2V0Q2xpcGJvYXJkRGF0YShIVE1MQ2xpcGJvYXJkRm9ybWF0LCBj
YkRhdGEpKQorICAgICAgICAgICAgOjpHbG9iYWxGcmVlKGNiRGF0YSk7CisgICAgICAgIDo6Q2xv
c2VDbGlwYm9hcmQoKTsKKyAgICB9CisKKyAgICAvLyBiYXJlLWJvbmVzIENGX1VOSUNPREVURVhU
IHN1cHBvcnQKKyAgICBpZiAoOjpPcGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7CisgICAgICAgIEhH
TE9CQUwgY2JEYXRhID0gY3JlYXRlR2xvYmFsRGF0YSh1cmwuc3RyaW5nKCkpOworICAgICAgICBp
ZiAoITo6U2V0Q2xpcGJvYXJkRGF0YShDRl9VTklDT0RFVEVYVCwgY2JEYXRhKSkKKyAgICAgICAg
ICAgIDo6R2xvYmFsRnJlZShjYkRhdGEpOworICAgICAgICA6OkNsb3NlQ2xpcGJvYXJkKCk7Cisg
ICAgfQorfQorCit2b2lkIFBhc3RlYm9hcmQ6OndyaXRlSW1hZ2UoTm9kZSogbm9kZSwgY29uc3Qg
S1VSTCYsIGNvbnN0IFN0cmluZyYpCit7CisgICAgQVNTRVJUKG5vZGUgJiYgbm9kZS0+cmVuZGVy
ZXIoKSAmJiBub2RlLT5yZW5kZXJlcigpLT5pc0ltYWdlKCkpOworICAgIFJlbmRlckltYWdlKiBy
ZW5kZXJlciA9IHN0YXRpY19jYXN0PFJlbmRlckltYWdlKj4obm9kZS0+cmVuZGVyZXIoKSk7Cisg
ICAgQ2FjaGVkSW1hZ2UqIGNhY2hlZEltYWdlID0gc3RhdGljX2Nhc3Q8Q2FjaGVkSW1hZ2UqPihy
ZW5kZXJlci0+Y2FjaGVkSW1hZ2UoKSk7CisgICAgQVNTRVJUKGNhY2hlZEltYWdlKTsKKyAgICBJ
bWFnZSogaW1hZ2UgPSBjYWNoZWRJbWFnZS0+aW1hZ2UoKTsKKyAgICBBU1NFUlQoaW1hZ2UpOwor
CisgICAgY2xlYXIoKTsKKworICAgIFJlZlB0cjxTaGFyZWRCaXRtYXA+IHNvdXJjZUJtcCA9IGlt
YWdlLT5uYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgpOworICAgIGlmICghc291cmNlQm1wKQor
ICAgICAgICByZXR1cm47CisKKyAgICBJbnRSZWN0IHJlY3QoMCwgMCwgc291cmNlQm1wLT53aWR0
aCgpLCBzb3VyY2VCbXAtPmhlaWdodCgpKTsKKyAgICBCaXRtYXBJbmZvIGJtcEluZm87CisgICAg
dm9pZCogcGl4ZWxzOworICAgIEhCSVRNQVAgcmVzdWx0Qml0bWFwID0gc291cmNlQm1wLT5jbGlw
Qml0bWFwKHJlY3QsIHRydWUsIGJtcEluZm8sIHBpeGVscyk7CisgICAgaWYgKCFyZXN1bHRCaXRt
YXApCisgICAgICAgIHJldHVybjsKKworICAgIGlmICg6Ok9wZW5DbGlwYm9hcmQobV9vd25lcikp
IHsKKyAgICAgICAgOjpTZXRDbGlwYm9hcmREYXRhKENGX0JJVE1BUCwgcmVzdWx0Qml0bWFwKTsK
KyAgICAgICAgOjpDbG9zZUNsaXBib2FyZCgpOworICAgIH0gZWxzZQorICAgICAgICBEZWxldGVP
YmplY3QocmVzdWx0Qml0bWFwKTsKK30KKworYm9vbCBQYXN0ZWJvYXJkOjpjYW5TbWFydFJlcGxh
Y2UoKQoreworICAgIHJldHVybiA6OklzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlKFdlYlNtYXJ0
UGFzdGVGb3JtYXQpOworfQorCitTdHJpbmcgUGFzdGVib2FyZDo6cGxhaW5UZXh0KEZyYW1lKiBm
cmFtZSkKK3sKKyAgICBpZiAoOjpJc0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZShDRl9VTklDT0RF
VEVYVCkgJiYgOjpPcGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7CisgICAgICAgIEhBTkRMRSBjYkRh
dGEgPSA6OkdldENsaXBib2FyZERhdGEoQ0ZfVU5JQ09ERVRFWFQpOworICAgICAgICBpZiAoY2JE
YXRhKSB7CisgICAgICAgICAgICBVQ2hhciogYnVmZmVyID0gKFVDaGFyKilHbG9iYWxMb2NrKGNi
RGF0YSk7CisgICAgICAgICAgICBTdHJpbmcgZnJvbUNsaXBib2FyZChidWZmZXIpOworICAgICAg
ICAgICAgR2xvYmFsVW5sb2NrKGNiRGF0YSk7CisgICAgICAgICAgICBDbG9zZUNsaXBib2FyZCgp
OworICAgICAgICAgICAgcmV0dXJuIGZyb21DbGlwYm9hcmQ7CisgICAgICAgIH0gZWxzZQorICAg
ICAgICAgICAgQ2xvc2VDbGlwYm9hcmQoKTsKKyAgICB9CisKKyAgICBpZiAoOjpJc0NsaXBib2Fy
ZEZvcm1hdEF2YWlsYWJsZShDRl9URVhUKSAmJiA6Ok9wZW5DbGlwYm9hcmQobV9vd25lcikpIHsK
KyAgICAgICAgSEFORExFIGNiRGF0YSA9IDo6R2V0Q2xpcGJvYXJkRGF0YShDRl9URVhUKTsKKyAg
ICAgICAgaWYgKGNiRGF0YSkgeworICAgICAgICAgICAgY2hhciogYnVmZmVyID0gKGNoYXIqKUds
b2JhbExvY2soY2JEYXRhKTsKKyAgICAgICAgICAgIFN0cmluZyBmcm9tQ2xpcGJvYXJkKGJ1ZmZl
cik7CisgICAgICAgICAgICBHbG9iYWxVbmxvY2soY2JEYXRhKTsKKyAgICAgICAgICAgIENsb3Nl
Q2xpcGJvYXJkKCk7CisgICAgICAgICAgICByZXR1cm4gZnJvbUNsaXBib2FyZDsKKyAgICAgICAg
fSBlbHNlCisgICAgICAgICAgICBDbG9zZUNsaXBib2FyZCgpOworICAgIH0KKworICAgIHJldHVy
biBTdHJpbmcoKTsKK30KKworUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBQYXN0ZWJvYXJk
Ojpkb2N1bWVudEZyYWdtZW50KEZyYW1lKiBmcmFtZSwgUGFzc1JlZlB0cjxSYW5nZT4gY29udGV4
dCwgYm9vbCBhbGxvd1BsYWluVGV4dCwgYm9vbCYgY2hvc2VQbGFpblRleHQpCit7CisgICAgY2hv
c2VQbGFpblRleHQgPSBmYWxzZTsKKworICAgIGlmICg6OklzQ2xpcGJvYXJkRm9ybWF0QXZhaWxh
YmxlKEhUTUxDbGlwYm9hcmRGb3JtYXQpICYmIDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgewor
ICAgICAgICAvLyBnZXQgZGF0YSBvZmYgb2YgY2xpcGJvYXJkCisgICAgICAgIEhBTkRMRSBjYkRh
dGEgPSA6OkdldENsaXBib2FyZERhdGEoSFRNTENsaXBib2FyZEZvcm1hdCk7CisgICAgICAgIGlm
IChjYkRhdGEpIHsKKyAgICAgICAgICAgIFNJWkVfVCBkYXRhU2l6ZSA9IDo6R2xvYmFsU2l6ZShj
YkRhdGEpOworICAgICAgICAgICAgU3RyaW5nIGNmX2h0bWwoVVRGOEVuY29kaW5nKCkuZGVjb2Rl
KChjaGFyKilHbG9iYWxMb2NrKGNiRGF0YSksIGRhdGFTaXplKSk7CisgICAgICAgICAgICBHbG9i
YWxVbmxvY2soY2JEYXRhKTsKKyAgICAgICAgICAgIENsb3NlQ2xpcGJvYXJkKCk7CisKKyAgICAg
ICAgICAgIFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gZnJhZ21lbnQgPSBmcmFnbWVudEZy
b21DRl9IVE1MKGZyYW1lLT5kb2N1bWVudCgpLCBjZl9odG1sKTsKKyAgICAgICAgICAgIGlmIChm
cmFnbWVudCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZnJhZ21lbnQ7CisgICAgICAgIH0gZWxz
ZQorICAgICAgICAgICAgQ2xvc2VDbGlwYm9hcmQoKTsKKyAgICB9CisKKyAgICBpZiAoYWxsb3dQ
bGFpblRleHQgJiYgSXNDbGlwYm9hcmRGb3JtYXRBdmFpbGFibGUoQ0ZfVU5JQ09ERVRFWFQpKSB7
CisgICAgICAgIGNob3NlUGxhaW5UZXh0ID0gdHJ1ZTsKKyAgICAgICAgaWYgKE9wZW5DbGlwYm9h
cmQobV9vd25lcikpIHsKKyAgICAgICAgICAgIEhBTkRMRSBjYkRhdGEgPSBHZXRDbGlwYm9hcmRE
YXRhKENGX1VOSUNPREVURVhUKTsKKyAgICAgICAgICAgIGlmIChjYkRhdGEpIHsKKyAgICAgICAg
ICAgICAgICBVQ2hhciogYnVmZmVyID0gKFVDaGFyKilHbG9iYWxMb2NrKGNiRGF0YSk7CisgICAg
ICAgICAgICAgICAgU3RyaW5nIHN0cihidWZmZXIpOworICAgICAgICAgICAgICAgIEdsb2JhbFVu
bG9jayhjYkRhdGEpOworICAgICAgICAgICAgICAgIENsb3NlQ2xpcGJvYXJkKCk7CisgICAgICAg
ICAgICAgICAgUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21l
bnRGcm9tVGV4dChjb250ZXh0LmdldCgpLCBzdHIpOworICAgICAgICAgICAgICAgIGlmIChmcmFn
bWVudCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyYWdtZW50LnJlbGVhc2UoKTsKKyAg
ICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIENsb3NlQ2xpcGJvYXJkKCk7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICBpZiAoYWxsb3dQbGFpblRleHQgJiYgOjpJc0NsaXBib2FyZEZv
cm1hdEF2YWlsYWJsZShDRl9URVhUKSkgeworICAgICAgICBjaG9zZVBsYWluVGV4dCA9IHRydWU7
CisgICAgICAgIGlmICg6Ok9wZW5DbGlwYm9hcmQobV9vd25lcikpIHsKKyAgICAgICAgICAgIEhB
TkRMRSBjYkRhdGEgPSA6OkdldENsaXBib2FyZERhdGEoQ0ZfVEVYVCk7CisgICAgICAgICAgICBp
ZiAoY2JEYXRhKSB7CisgICAgICAgICAgICAgICAgY2hhciogYnVmZmVyID0gKGNoYXIqKUdsb2Jh
bExvY2soY2JEYXRhKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc3RyKGJ1ZmZlcik7CisgICAg
ICAgICAgICAgICAgR2xvYmFsVW5sb2NrKGNiRGF0YSk7CisgICAgICAgICAgICAgICAgQ2xvc2VD
bGlwYm9hcmQoKTsKKyAgICAgICAgICAgICAgICBSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gZnJh
Z21lbnQgPSBjcmVhdGVGcmFnbWVudEZyb21UZXh0KGNvbnRleHQuZ2V0KCksIHN0cik7CisgICAg
ICAgICAgICAgICAgaWYgKGZyYWdtZW50KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJh
Z21lbnQucmVsZWFzZSgpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgQ2xv
c2VDbGlwYm9hcmQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCiti
b29sIFBhc3RlYm9hcmQ6Omhhc0RhdGEoKQoreworICAgIHJldHVybiBoYXNEYXRhSW5Gb3JtYXQo
Q0ZfVU5JQ09ERVRFWFQpIHx8IGhhc0RhdGFJbkZvcm1hdChDRl9URVhUKTsKK30KKworYm9vbCBQ
YXN0ZWJvYXJkOjpoYXNEYXRhSW5Gb3JtYXQodW5zaWduZWQgaW50IGZvcm1hdCkKK3sKKyAgICBy
ZXR1cm4gOjpJc0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZShmb3JtYXQpOworfQorCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1Bhc3RlYm9hcmRX
aW5jZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9QYXN0ZWJvYXJk
V2luY2UuY3BwCShyZXZpc2lvbiA1NzI4OSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvUGFz
dGVib2FyZFdpbmNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSwzMzEgKzAsMCBAQAotLyoKLSAq
IENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVk
LgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCi0gKgotICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
Ci0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMu
IE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAotICovCi0K
LQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlBhc3RlYm9hcmQuaCIKLQotI2luY2x1
ZGUgIkNsaXBib2FyZFV0aWxpdGllc1dpbi5oIgotI2luY2x1ZGUgIkRvY3VtZW50LmgiCi0jaW5j
bHVkZSAiRG9jdW1lbnRGcmFnbWVudC5oIgotI2luY2x1ZGUgIkVsZW1lbnQuaCIKLSNpbmNsdWRl
ICJGcmFtZS5oIgotI2luY2x1ZGUgIkhpdFRlc3RSZXN1bHQuaCIKLSNpbmNsdWRlICJJbWFnZS5o
IgotI2luY2x1ZGUgIktVUkwuaCIKLSNpbmNsdWRlICJQYWdlLmgiCi0jaW5jbHVkZSAiUmFuZ2Uu
aCIKLSNpbmNsdWRlICJSZW5kZXJJbWFnZS5oIgotI2luY2x1ZGUgIlRleHRFbmNvZGluZy5oIgot
I2luY2x1ZGUgIldlYkNvcmVJbnN0YW5jZUhhbmRsZS5oIgotI2luY2x1ZGUgIm1hcmt1cC5oIgot
I2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1z
dGF0aWMgVUlOVCBIVE1MQ2xpcGJvYXJkRm9ybWF0ID0gMDsKLXN0YXRpYyBVSU5UIEJvb2ttYXJr
Q2xpcGJvYXJkRm9ybWF0ID0gMDsKLXN0YXRpYyBVSU5UIFdlYlNtYXJ0UGFzdGVGb3JtYXQgPSAw
OwotCi1leHRlcm4gSERDIGhTY3JlZW5EQzsKLQotc3RhdGljIExSRVNVTFQgQ0FMTEJBQ0sgUGFz
dGVib2FyZE93bmVyV25kUHJvYyhIV05EIGhXbmQsIFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJh
bSwgTFBBUkFNIGxQYXJhbSkKLXsKLSAgICBMUkVTVUxUIGxyZXN1bHQgPSAwOwotICAgIExPTkcg
bG9uZ1B0ciA9IEdldFdpbmRvd0xvbmcoaFduZCwgMCk7Ci0KLSAgICBzd2l0Y2ggKG1lc3NhZ2Up
IHsKLSAgICBjYXNlIFdNX1JFTkRFUkZPUk1BVDoKLSAgICAgICAgLy8gVGhpcyBtZXNzYWdlIGNv
bWVzIHdoZW4gU2V0Q2xpcGJvYXJkRGF0YSB3YXMgc2VudCBhIG51bGwgZGF0YSBoYW5kbGUKLSAg
ICAgICAgLy8gYW5kIG5vdyBpdCdzIGNvbWUgdGltZSB0byBwdXQgdGhlIGRhdGEgb24gdGhlIGNs
aXBib2FyZC4KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXTV9SRU5ERVJBTExGT1JNQVRTOgot
ICAgICAgICAvLyBUaGlzIG1lc3NhZ2UgY29tZXMgd2hlbiBTZXRDbGlwYm9hcmREYXRhIHdhcyBz
ZW50IGEgbnVsbCBkYXRhIGhhbmRsZQotICAgICAgICAvLyBhbmQgbm93IHRoaXMgYXBwbGljYXRp
b24gaXMgYWJvdXQgdG8gcXVpdCwgc28gaXQgbXVzdCBwdXQgZGF0YSBvbgotICAgICAgICAvLyB0
aGUgY2xpcGJvYXJkIGJlZm9yZSBpdCBleGl0cy4KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBX
TV9ERVNUUk9ZOgotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBscmVzdWx0
ID0gRGVmV2luZG93UHJvYyhoV25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgICAg
IGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gbHJlc3VsdDsKLX0KLQotUGFzdGVib2FyZCogUGFz
dGVib2FyZDo6Z2VuZXJhbFBhc3RlYm9hcmQoKQotewotICAgIHN0YXRpYyBQYXN0ZWJvYXJkKiBw
YXN0ZWJvYXJkID0gbmV3IFBhc3RlYm9hcmQ7Ci0gICAgcmV0dXJuIHBhc3RlYm9hcmQ7Ci19Ci0K
LVBhc3RlYm9hcmQ6OlBhc3RlYm9hcmQoKQotewotICAgIC8vIG1ha2UgYSBkdW1teSBIV05EIHRv
IGJlIHRoZSBXaW5kb3dzIGNsaXBib2FyZCdzIG93bmVyCi0gICAgV05EQ0xBU1Mgd2MgPSB7MH07
Ci0gICAgbWVtc2V0KCZ3YywgMCwgc2l6ZW9mKHdjKSk7Ci0gICAgd2MubHBmblduZFByb2MgICAg
PSBQYXN0ZWJvYXJkT3duZXJXbmRQcm9jOwotICAgIHdjLmhJbnN0YW5jZSAgICAgID0gV2ViQ29y
ZTo6aW5zdGFuY2VIYW5kbGUoKTsKLSAgICB3Yy5scHN6Q2xhc3NOYW1lICA9IEwiUGFzdGVib2Fy
ZE93bmVyV2luZG93Q2xhc3MiOwotICAgIDo6UmVnaXN0ZXJDbGFzcygmd2MpOwotCi0gICAgbV9v
d25lciA9IDo6Q3JlYXRlV2luZG93KEwiUGFzdGVib2FyZE93bmVyV2luZG93Q2xhc3MiLCBMIlBh
c3RlYm9hcmRPd25lcldpbmRvdyIsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAgIEhXTkRfTUVTU0FH
RSwgMCwgMCwgMCk7Ci0KLSAgICBIVE1MQ2xpcGJvYXJkRm9ybWF0ID0gOjpSZWdpc3RlckNsaXBi
b2FyZEZvcm1hdChMIkhUTUwgRm9ybWF0Iik7Ci0gICAgQm9va21hcmtDbGlwYm9hcmRGb3JtYXQg
PSA6OlJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0KEwiVW5pZm9ybVJlc291cmNlTG9jYXRvclciKTsK
LSAgICBXZWJTbWFydFBhc3RlRm9ybWF0ID0gOjpSZWdpc3RlckNsaXBib2FyZEZvcm1hdChMIldl
YktpdCBTbWFydCBQYXN0ZSBGb3JtYXQiKTsKLX0KLQotdm9pZCBQYXN0ZWJvYXJkOjpjbGVhcigp
Ci17Ci0gICAgaWYgKDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgewotICAgICAgICA6OkVtcHR5
Q2xpcGJvYXJkKCk7Ci0gICAgICAgIDo6Q2xvc2VDbGlwYm9hcmQoKTsKLSAgICB9Ci19Ci0KLXZv
aWQgUGFzdGVib2FyZDo6d3JpdGVTZWxlY3Rpb24oUmFuZ2UqIHNlbGVjdGVkUmFuZ2UsIGJvb2wg
Y2FuU21hcnRDb3B5T3JEZWxldGUsIEZyYW1lKiBmcmFtZSkKLXsKLSAgICBjbGVhcigpOwotCi0g
ICAgLy8gUHV0IENGX0hUTUwgZm9ybWF0IG9uIHRoZSBwYXN0ZWJvYXJkCi0gICAgaWYgKDo6T3Bl
bkNsaXBib2FyZChtX293bmVyKSkgewotICAgICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAg
ICAgICAgVmVjdG9yPGNoYXI+IGRhdGE7Ci0gICAgICAgIG1hcmt1cFRvQ0ZfSFRNTChjcmVhdGVN
YXJrdXAoc2VsZWN0ZWRSYW5nZSwgMCwgQW5ub3RhdGVGb3JJbnRlcmNoYW5nZSksIHNlbGVjdGVk
UmFuZ2UtPnN0YXJ0Q29udGFpbmVyKGVjKS0+ZG9jdW1lbnQoKS0+dXJsKCksIGRhdGEpOwotICAg
ICAgICBIR0xPQkFMIGNiRGF0YSA9IGNyZWF0ZUdsb2JhbERhdGEoZGF0YSk7Ci0gICAgICAgIGlm
ICghOjpTZXRDbGlwYm9hcmREYXRhKEhUTUxDbGlwYm9hcmRGb3JtYXQsIGNiRGF0YSkpCi0gICAg
ICAgICAgICA6Okdsb2JhbEZyZWUoY2JEYXRhKTsKLSAgICAgICAgOjpDbG9zZUNsaXBib2FyZCgp
OwotICAgIH0KLQotICAgIC8vIFB1dCBwbGFpbiBzdHJpbmcgb24gdGhlIHBhc3RlYm9hcmQuIENG
X1VOSUNPREVURVhUIGNvdmVycyBDRl9URVhUIGFzIHdlbGwKLSAgICBTdHJpbmcgc3RyID0gZnJh
bWUtPnNlbGVjdGVkVGV4dCgpOwotICAgIHJlcGxhY2VOZXdsaW5lc1dpdGhXaW5kb3dzU3R5bGVO
ZXdsaW5lcyhzdHIpOwotICAgIHJlcGxhY2VOQlNQV2l0aFNwYWNlKHN0cik7Ci0gICAgaWYgKDo6
T3BlbkNsaXBib2FyZChtX293bmVyKSkgewotICAgICAgICBIR0xPQkFMIGNiRGF0YSA9IGNyZWF0
ZUdsb2JhbERhdGEoc3RyKTsKLSAgICAgICAgaWYgKCE6OlNldENsaXBib2FyZERhdGEoQ0ZfVU5J
Q09ERVRFWFQsIGNiRGF0YSkpCi0gICAgICAgICAgICA6Okdsb2JhbEZyZWUoY2JEYXRhKTsKLSAg
ICAgICAgOjpDbG9zZUNsaXBib2FyZCgpOwotICAgIH0KLQotICAgIC8vIGVuYWJsZSBzbWFydC1y
ZXBsYWNpbmcgbGF0ZXIgb24gYnkgcHV0dGluZyBkdW1teSBkYXRhIG9uIHRoZSBwYXN0ZWJvYXJk
Ci0gICAgaWYgKGNhblNtYXJ0Q29weU9yRGVsZXRlKSB7Ci0gICAgICAgIGlmICg6Ok9wZW5DbGlw
Ym9hcmQobV9vd25lcikpIHsKLSAgICAgICAgICAgIDo6U2V0Q2xpcGJvYXJkRGF0YShXZWJTbWFy
dFBhc3RlRm9ybWF0LCAwKTsKLSAgICAgICAgICAgIDo6Q2xvc2VDbGlwYm9hcmQoKTsKLSAgICAg
ICAgfQotICAgIH0KLX0KLQotdm9pZCBQYXN0ZWJvYXJkOjp3cml0ZVBsYWluVGV4dChjb25zdCBT
dHJpbmcmIHRleHQpCi17Ci0gICAgY2xlYXIoKTsKLQotICAgIC8vIFB1dCBwbGFpbiBzdHJpbmcg
b24gdGhlIHBhc3RlYm9hcmQuIENGX1VOSUNPREVURVhUIGNvdmVycyBDRl9URVhUIGFzIHdlbGwK
LSAgICBTdHJpbmcgc3RyID0gdGV4dDsKLSAgICByZXBsYWNlTmV3bGluZXNXaXRoV2luZG93c1N0
eWxlTmV3bGluZXMoc3RyKTsKLSAgICBpZiAoOjpPcGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7Ci0g
ICAgICAgIEhHTE9CQUwgY2JEYXRhID0gY3JlYXRlR2xvYmFsRGF0YShzdHIpOwotICAgICAgICBp
ZiAoITo6U2V0Q2xpcGJvYXJkRGF0YShDRl9VTklDT0RFVEVYVCwgY2JEYXRhKSkKLSAgICAgICAg
ICAgIDo6R2xvYmFsRnJlZShjYkRhdGEpOwotICAgICAgICA6OkNsb3NlQ2xpcGJvYXJkKCk7Ci0g
ICAgfQotfQotCi12b2lkIFBhc3RlYm9hcmQ6OndyaXRlVVJMKGNvbnN0IEtVUkwmIHVybCwgY29u
c3QgU3RyaW5nJiB0aXRsZVN0ciwgRnJhbWUqIGZyYW1lKQotewotICAgIEFTU0VSVCghdXJsLmlz
RW1wdHkoKSk7Ci0KLSAgICBjbGVhcigpOwotCi0gICAgU3RyaW5nIHRpdGxlKHRpdGxlU3RyKTsK
LSAgICBpZiAodGl0bGUuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHRpdGxlID0gdXJsLmxhc3RQYXRo
Q29tcG9uZW50KCk7Ci0gICAgICAgIGlmICh0aXRsZS5pc0VtcHR5KCkpCi0gICAgICAgICAgICB0
aXRsZSA9IHVybC5ob3N0KCk7Ci0gICAgfQotCi0gICAgLy8gd3JpdGUgdG8gY2xpcGJvYXJkIGlu
IGZvcm1hdCBjb20uYXBwbGUuc2FmYXJpLmJvb2ttYXJrZGF0YSB0byBiZSBhYmxlIHRvIHBhc3Rl
IGludG8gdGhlIGJvb2ttYXJrcyB2aWV3IHdpdGggYXBwcm9wcmlhdGUgdGl0bGUKLSAgICBpZiAo
OjpPcGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7Ci0gICAgICAgIEhHTE9CQUwgY2JEYXRhID0gY3Jl
YXRlR2xvYmFsRGF0YSh1cmwsIHRpdGxlKTsKLSAgICAgICAgaWYgKCE6OlNldENsaXBib2FyZERh
dGEoQm9va21hcmtDbGlwYm9hcmRGb3JtYXQsIGNiRGF0YSkpCi0gICAgICAgICAgICA6Okdsb2Jh
bEZyZWUoY2JEYXRhKTsKLSAgICAgICAgOjpDbG9zZUNsaXBib2FyZCgpOwotICAgIH0KLQotICAg
IC8vIHdyaXRlIHRvIGNsaXBib2FyZCBpbiBmb3JtYXQgQ0ZfSFRNTCB0byBiZSBhYmxlIHRvIHBh
c3RlIGludG8gY29udGVudGVkaXRhYmxlIGFyZWFzIGFzIGEgbGluawotICAgIGlmICg6Ok9wZW5D
bGlwYm9hcmQobV9vd25lcikpIHsKLSAgICAgICAgVmVjdG9yPGNoYXI+IGRhdGE7Ci0gICAgICAg
IG1hcmt1cFRvQ0ZfSFRNTCh1cmxUb01hcmt1cCh1cmwsIHRpdGxlKSwgIiIsIGRhdGEpOwotICAg
ICAgICBIR0xPQkFMIGNiRGF0YSA9IGNyZWF0ZUdsb2JhbERhdGEoZGF0YSk7Ci0gICAgICAgIGlm
ICghOjpTZXRDbGlwYm9hcmREYXRhKEhUTUxDbGlwYm9hcmRGb3JtYXQsIGNiRGF0YSkpCi0gICAg
ICAgICAgICA6Okdsb2JhbEZyZWUoY2JEYXRhKTsKLSAgICAgICAgOjpDbG9zZUNsaXBib2FyZCgp
OwotICAgIH0KLQotICAgIC8vIGJhcmUtYm9uZXMgQ0ZfVU5JQ09ERVRFWFQgc3VwcG9ydAotICAg
IGlmICg6Ok9wZW5DbGlwYm9hcmQobV9vd25lcikpIHsKLSAgICAgICAgSEdMT0JBTCBjYkRhdGEg
PSBjcmVhdGVHbG9iYWxEYXRhKHVybC5zdHJpbmcoKSk7Ci0gICAgICAgIGlmICghOjpTZXRDbGlw
Ym9hcmREYXRhKENGX1VOSUNPREVURVhULCBjYkRhdGEpKQotICAgICAgICAgICAgOjpHbG9iYWxG
cmVlKGNiRGF0YSk7Ci0gICAgICAgIDo6Q2xvc2VDbGlwYm9hcmQoKTsKLSAgICB9Ci19Ci0KLXZv
aWQgUGFzdGVib2FyZDo6d3JpdGVJbWFnZShOb2RlKiBub2RlLCBjb25zdCBLVVJMJiwgY29uc3Qg
U3RyaW5nJikKLXsKLSAgICBBU1NFUlQobm9kZSAmJiBub2RlLT5yZW5kZXJlcigpICYmIG5vZGUt
PnJlbmRlcmVyKCktPmlzSW1hZ2UoKSk7Ci0gICAgUmVuZGVySW1hZ2UqIHJlbmRlcmVyID0gc3Rh
dGljX2Nhc3Q8UmVuZGVySW1hZ2UqPihub2RlLT5yZW5kZXJlcigpKTsKLSAgICBDYWNoZWRJbWFn
ZSogY2FjaGVkSW1hZ2UgPSBzdGF0aWNfY2FzdDxDYWNoZWRJbWFnZSo+KHJlbmRlcmVyLT5jYWNo
ZWRJbWFnZSgpKTsKLSAgICBBU1NFUlQoY2FjaGVkSW1hZ2UpOwotICAgIEltYWdlKiBpbWFnZSA9
IGNhY2hlZEltYWdlLT5pbWFnZSgpOwotICAgIEFTU0VSVChpbWFnZSk7Ci0KLSAgICBjbGVhcigp
OwotCi0gICAgUmVmUHRyPFNoYXJlZEJpdG1hcD4gc291cmNlQm1wID0gaW1hZ2UtPm5hdGl2ZUlt
YWdlRm9yQ3VycmVudEZyYW1lKCk7Ci0gICAgaWYgKCFzb3VyY2VCbXApCi0gICAgICAgIHJldHVy
bjsKLQotICAgIEludFJlY3QgcmVjdCgwLCAwLCBzb3VyY2VCbXAtPndpZHRoKCksIHNvdXJjZUJt
cC0+aGVpZ2h0KCkpOwotICAgIEJpdG1hcEluZm8gYm1wSW5mbzsKLSAgICB2b2lkKiBwaXhlbHM7
Ci0gICAgSEJJVE1BUCByZXN1bHRCaXRtYXAgPSBzb3VyY2VCbXAtPmNsaXBCaXRtYXAocmVjdCwg
dHJ1ZSwgYm1wSW5mbywgcGl4ZWxzKTsKLSAgICBpZiAoIXJlc3VsdEJpdG1hcCkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgaWYgKDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgewotICAgICAgICA6
OlNldENsaXBib2FyZERhdGEoQ0ZfQklUTUFQLCByZXN1bHRCaXRtYXApOwotICAgICAgICA6OkNs
b3NlQ2xpcGJvYXJkKCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIERlbGV0ZU9iamVjdChyZXN1bHRC
aXRtYXApOwotfQotCi1ib29sIFBhc3RlYm9hcmQ6OmNhblNtYXJ0UmVwbGFjZSgpCi17Ci0gICAg
cmV0dXJuIDo6SXNDbGlwYm9hcmRGb3JtYXRBdmFpbGFibGUoV2ViU21hcnRQYXN0ZUZvcm1hdCk7
Ci19Ci0KLVN0cmluZyBQYXN0ZWJvYXJkOjpwbGFpblRleHQoRnJhbWUqIGZyYW1lKQotewotICAg
IGlmICg6OklzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlKENGX1VOSUNPREVURVhUKSAmJiA6Ok9w
ZW5DbGlwYm9hcmQobV9vd25lcikpIHsKLSAgICAgICAgSEFORExFIGNiRGF0YSA9IDo6R2V0Q2xp
cGJvYXJkRGF0YShDRl9VTklDT0RFVEVYVCk7Ci0gICAgICAgIGlmIChjYkRhdGEpIHsKLSAgICAg
ICAgICAgIFVDaGFyKiBidWZmZXIgPSAoVUNoYXIqKUdsb2JhbExvY2soY2JEYXRhKTsKLSAgICAg
ICAgICAgIFN0cmluZyBmcm9tQ2xpcGJvYXJkKGJ1ZmZlcik7Ci0gICAgICAgICAgICBHbG9iYWxV
bmxvY2soY2JEYXRhKTsKLSAgICAgICAgICAgIENsb3NlQ2xpcGJvYXJkKCk7Ci0gICAgICAgICAg
ICByZXR1cm4gZnJvbUNsaXBib2FyZDsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBDbG9z
ZUNsaXBib2FyZCgpOwotICAgIH0KLQotICAgIGlmICg6OklzQ2xpcGJvYXJkRm9ybWF0QXZhaWxh
YmxlKENGX1RFWFQpICYmIDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgewotICAgICAgICBIQU5E
TEUgY2JEYXRhID0gOjpHZXRDbGlwYm9hcmREYXRhKENGX1RFWFQpOwotICAgICAgICBpZiAoY2JE
YXRhKSB7Ci0gICAgICAgICAgICBjaGFyKiBidWZmZXIgPSAoY2hhciopR2xvYmFsTG9jayhjYkRh
dGEpOwotICAgICAgICAgICAgU3RyaW5nIGZyb21DbGlwYm9hcmQoYnVmZmVyKTsKLSAgICAgICAg
ICAgIEdsb2JhbFVubG9jayhjYkRhdGEpOwotICAgICAgICAgICAgQ2xvc2VDbGlwYm9hcmQoKTsK
LSAgICAgICAgICAgIHJldHVybiBmcm9tQ2xpcGJvYXJkOwotICAgICAgICB9IGVsc2UKLSAgICAg
ICAgICAgIENsb3NlQ2xpcGJvYXJkKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFN0cmluZygpOwot
fQotCi1QYXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IFBhc3RlYm9hcmQ6OmRvY3VtZW50RnJh
Z21lbnQoRnJhbWUqIGZyYW1lLCBQYXNzUmVmUHRyPFJhbmdlPiBjb250ZXh0LCBib29sIGFsbG93
UGxhaW5UZXh0LCBib29sJiBjaG9zZVBsYWluVGV4dCkKLXsKLSAgICBjaG9zZVBsYWluVGV4dCA9
IGZhbHNlOwotCi0gICAgaWYgKDo6SXNDbGlwYm9hcmRGb3JtYXRBdmFpbGFibGUoSFRNTENsaXBi
b2FyZEZvcm1hdCkgJiYgOjpPcGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7Ci0gICAgICAgIC8vIGdl
dCBkYXRhIG9mZiBvZiBjbGlwYm9hcmQKLSAgICAgICAgSEFORExFIGNiRGF0YSA9IDo6R2V0Q2xp
cGJvYXJkRGF0YShIVE1MQ2xpcGJvYXJkRm9ybWF0KTsKLSAgICAgICAgaWYgKGNiRGF0YSkgewot
ICAgICAgICAgICAgU0laRV9UIGRhdGFTaXplID0gOjpHbG9iYWxTaXplKGNiRGF0YSk7Ci0gICAg
ICAgICAgICBTdHJpbmcgY2ZfaHRtbChVVEY4RW5jb2RpbmcoKS5kZWNvZGUoKGNoYXIqKUdsb2Jh
bExvY2soY2JEYXRhKSwgZGF0YVNpemUpKTsKLSAgICAgICAgICAgIEdsb2JhbFVubG9jayhjYkRh
dGEpOwotICAgICAgICAgICAgQ2xvc2VDbGlwYm9hcmQoKTsKLQotICAgICAgICAgICAgUGFzc1Jl
ZlB0cjxEb2N1bWVudEZyYWdtZW50PiBmcmFnbWVudCA9IGZyYWdtZW50RnJvbUNGX0hUTUwoZnJh
bWUtPmRvY3VtZW50KCksIGNmX2h0bWwpOwotICAgICAgICAgICAgaWYgKGZyYWdtZW50KQotICAg
ICAgICAgICAgICAgIHJldHVybiBmcmFnbWVudDsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAg
ICBDbG9zZUNsaXBib2FyZCgpOwotICAgIH0KLQotICAgIGlmIChhbGxvd1BsYWluVGV4dCAmJiBJ
c0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZShDRl9VTklDT0RFVEVYVCkpIHsKLSAgICAgICAgY2hv
c2VQbGFpblRleHQgPSB0cnVlOwotICAgICAgICBpZiAoT3BlbkNsaXBib2FyZChtX293bmVyKSkg
ewotICAgICAgICAgICAgSEFORExFIGNiRGF0YSA9IEdldENsaXBib2FyZERhdGEoQ0ZfVU5JQ09E
RVRFWFQpOwotICAgICAgICAgICAgaWYgKGNiRGF0YSkgewotICAgICAgICAgICAgICAgIFVDaGFy
KiBidWZmZXIgPSAoVUNoYXIqKUdsb2JhbExvY2soY2JEYXRhKTsKLSAgICAgICAgICAgICAgICBT
dHJpbmcgc3RyKGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgR2xvYmFsVW5sb2NrKGNiRGF0YSk7
Ci0gICAgICAgICAgICAgICAgQ2xvc2VDbGlwYm9hcmQoKTsKLSAgICAgICAgICAgICAgICBSZWZQ
dHI8RG9jdW1lbnRGcmFnbWVudD4gZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudEZyb21UZXh0KGNv
bnRleHQuZ2V0KCksIHN0cik7Ci0gICAgICAgICAgICAgICAgaWYgKGZyYWdtZW50KQotICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gZnJhZ21lbnQucmVsZWFzZSgpOwotICAgICAgICAgICAgfSBl
bHNlCi0gICAgICAgICAgICAgICAgQ2xvc2VDbGlwYm9hcmQoKTsKLSAgICAgICAgfQotICAgIH0K
LQotICAgIGlmIChhbGxvd1BsYWluVGV4dCAmJiA6OklzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxl
KENGX1RFWFQpKSB7Ci0gICAgICAgIGNob3NlUGxhaW5UZXh0ID0gdHJ1ZTsKLSAgICAgICAgaWYg
KDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgewotICAgICAgICAgICAgSEFORExFIGNiRGF0YSA9
IDo6R2V0Q2xpcGJvYXJkRGF0YShDRl9URVhUKTsKLSAgICAgICAgICAgIGlmIChjYkRhdGEpIHsK
LSAgICAgICAgICAgICAgICBjaGFyKiBidWZmZXIgPSAoY2hhciopR2xvYmFsTG9jayhjYkRhdGEp
OwotICAgICAgICAgICAgICAgIFN0cmluZyBzdHIoYnVmZmVyKTsKLSAgICAgICAgICAgICAgICBH
bG9iYWxVbmxvY2soY2JEYXRhKTsKLSAgICAgICAgICAgICAgICBDbG9zZUNsaXBib2FyZCgpOwot
ICAgICAgICAgICAgICAgIFJlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBmcmFnbWVudCA9IGNyZWF0
ZUZyYWdtZW50RnJvbVRleHQoY29udGV4dC5nZXQoKSwgc3RyKTsKLSAgICAgICAgICAgICAgICBp
ZiAoZnJhZ21lbnQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmcmFnbWVudC5yZWxlYXNl
KCk7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBDbG9zZUNsaXBib2FyZCgp
OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWJvb2wgUGFzdGVib2Fy
ZDo6aGFzRGF0YSgpCi17Ci0gICAgcmV0dXJuIGhhc0RhdGFJbkZvcm1hdChDRl9VTklDT0RFVEVY
VCkgfHwgaGFzRGF0YUluRm9ybWF0KENGX1RFWFQpOwotfQotCi1ib29sIFBhc3RlYm9hcmQ6Omhh
c0RhdGFJbkZvcm1hdCh1bnNpZ25lZCBpbnQgZm9ybWF0KQotewotICAgIHJldHVybiA6OklzQ2xp
cGJvYXJkRm9ybWF0QXZhaWxhYmxlKGZvcm1hdCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2VhcmNoUG9wdXBNZW51V2luQ0UuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2VhcmNoUG9wdXBNZW51V2lu
Q0UuY3BwCShyZXZpc2lvbiA1NzI4OSkJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TZWFy
Y2hQb3B1cE1lbnVXaW5jZS5jcHA6NTcyODkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1Nl
YXJjaFBvcHVwTWVudVdpbkNFLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU0IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSBJbmMuCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgor
ICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBv
cHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmli
dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQg
QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1F
UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0
aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls
cy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsg
c2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9v
ciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJTZWFyY2hQb3B1cE1lbnUuaCIKKworI2luY2x1ZGUgIkF0b21pY1N0
cmluZy5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworU2VhcmNoUG9wdXBNZW51OjpTZWFyY2hQb3B1cE1lbnUoUG9wdXBNZW51Q2xpZW50KiBj
bGllbnQpCis6IFBvcHVwTWVudShjbGllbnQpCit7Cit9CisKK2Jvb2wgU2VhcmNoUG9wdXBNZW51
OjplbmFibGVkKCkKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgU2VhcmNoUG9wdXBN
ZW51OjpzYXZlUmVjZW50U2VhcmNoZXMoY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lLCBjb25zdCBW
ZWN0b3I8U3RyaW5nPiYgc2VhcmNoSXRlbXMpCit7CisgICAgaWYgKG5hbWUuaXNFbXB0eSgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIFNlYXJj
aFBvcHVwTWVudTo6bG9hZFJlY2VudFNlYXJjaGVzKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSwg
VmVjdG9yPFN0cmluZz4mIHNlYXJjaEl0ZW1zKQoreworICAgIGlmIChuYW1lLmlzRW1wdHkoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworfQpJbmRleDog
V2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TZWFyY2hQb3B1cE1lbnVXaW5DRS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TZWFyY2hQb3B1cE1lbnVXaW5DRS5jcHAJKHJl
dmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TZWFyY2hQb3B1cE1lbnVX
aW5DRS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTUxLDQgKzUxLDQgQEAgdm9pZCBTZWFyY2hQb3B1
cE1lbnU6OmxvYWRSZWNlbnRTZWFyY2hlcwogICAgIG5vdEltcGxlbWVudGVkKCk7CiB9CiAKLX0K
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2Vh
cmNoUG9wdXBNZW51V2luY2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2lu
Y2UvU2VhcmNoUG9wdXBNZW51V2luY2UuY3BwCShyZXZpc2lvbiA1NzI4OSkKKysrIFdlYkNvcmUv
cGxhdGZvcm0vd2luY2UvU2VhcmNoUG9wdXBNZW51V2luY2UuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVG9yY2ggTW9iaWxlIElu
Yy4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
Ci0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv
cHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdp
dGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRl
IHRvCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBT
dHJlZXQsIEZpZnRoIEZsb29yLAotICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0gKi8K
LQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlNlYXJjaFBvcHVwTWVudS5oIgotCi0j
aW5jbHVkZSAiQXRvbWljU3RyaW5nLmgiCi0jaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKLQot
bmFtZXNwYWNlIFdlYkNvcmUgewotCi1TZWFyY2hQb3B1cE1lbnU6OlNlYXJjaFBvcHVwTWVudShQ
b3B1cE1lbnVDbGllbnQqIGNsaWVudCkKLTogUG9wdXBNZW51KGNsaWVudCkKLXsKLX0KLQotYm9v
bCBTZWFyY2hQb3B1cE1lbnU6OmVuYWJsZWQoKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQot
dm9pZCBTZWFyY2hQb3B1cE1lbnU6OnNhdmVSZWNlbnRTZWFyY2hlcyhjb25zdCBBdG9taWNTdHJp
bmcmIG5hbWUsIGNvbnN0IFZlY3RvcjxTdHJpbmc+JiBzZWFyY2hJdGVtcykKLXsKLSAgICBpZiAo
bmFtZS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIG5vdEltcGxlbWVudGVkKCk7
Ci19Ci0KLXZvaWQgU2VhcmNoUG9wdXBNZW51Ojpsb2FkUmVjZW50U2VhcmNoZXMoY29uc3QgQXRv
bWljU3RyaW5nJiBuYW1lLCBWZWN0b3I8U3RyaW5nPiYgc2VhcmNoSXRlbXMpCi17Ci0gICAgaWYg
KG5hbWUuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBub3RJbXBsZW1lbnRlZCgp
OwotfQotCi19CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1NoYXJlZFRpbWVyV2luY2Uu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2hhcmVkVGltZXJXaW5j
ZS5jcHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TaGFyZWRU
aW1lcldpbmNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSwxMzEgKzAsMCBAQAotLyoKLSAqIENv
cHlyaWdodCAoQykgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRvcmNoIE1vYmlsZSwgSW5jLgotICoKLSAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5D
LiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKLSAqLwot
Ci0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiU2hhcmVkVGltZXIuaCIKLQotI2luY2x1
ZGUgIlBhZ2UuaCIKLSNpbmNsdWRlICJTeXN0ZW1UaW1lLmgiCi0jaW5jbHVkZSAiV2ViQ29yZUlu
c3RhbmNlSGFuZGxlLmgiCi0jaW5jbHVkZSAiV2lkZ2V0LmgiCi0jaW5jbHVkZSA8d3RmL0Fzc2Vy
dGlvbnMuaD4KLSNpbmNsdWRlIDx3dGYvQ3VycmVudFRpbWUuaD4KLSNpbmNsdWRlIDx3aW5kb3dz
Lmg+Ci0KLW5hbWVzcGFjZSBKU0MgewotZXh0ZXJuIHZvaWQqIGdfc3RhY2tCYXNlOwotfQotCi1u
YW1lc3BhY2UgV2ViQ29yZSB7Ci0KLWVudW0gewotICAgIFRpbWVySWROb25lID0gMCwKLSAgICBU
aW1lcklkQXV0bywKLSAgICBUaW1lcklkTWFudWFsLAotfTsKLXN0YXRpYyBVSU5UIHRpbWVySUQg
PSBUaW1lcklkTm9uZTsKLQotc3RhdGljIHZvaWQgKCpzaGFyZWRUaW1lckZpcmVkRnVuY3Rpb24p
KCk7Ci0KLXN0YXRpYyBIV05EIHRpbWVyV2luZG93SGFuZGxlID0gMDsKLWNvbnN0IExQQ1dTVFIg
a1RpbWVyV2luZG93Q2xhc3NOYW1lID0gTCJUaW1lcldpbmRvd0NsYXNzIjsKLQotTFJFU1VMVCBD
QUxMQkFDSyBUaW1lcldpbmRvd1duZFByb2MoSFdORCBoV25kLCBVSU5UIG1lc3NhZ2UsIFdQQVJB
TSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCi17Ci0gICAgaW50IGR1bW15OwotICAgIEpTQzo6Z19z
dGFja0Jhc2UgPSAmZHVtbXk7Ci0KLSAgICBpZiAobWVzc2FnZSA9PSBXTV9USU1FUikgewotICAg
ICAgICBpZiAodGltZXJJRCAhPSBUaW1lcklkTm9uZSkKLSAgICAgICAgICAgIHNoYXJlZFRpbWVy
RmlyZWRGdW5jdGlvbigpOwotICAgIH0gZWxzZSBpZiAobWVzc2FnZSA9PSBXTV9VU0VSKSAgICB7
Ci0gICAgICAgIGlmICh0aW1lcklEID0gVGltZXJJZE1hbnVhbCkgewotICAgICAgICAgICAgc2hh
cmVkVGltZXJGaXJlZEZ1bmN0aW9uKCk7Ci0gICAgICAgICAgICBQb3N0TWVzc2FnZShoV25kLCBX
TV9VU0VSLCAwLCAwKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEpTQzo6Z19z
dGFja0Jhc2UgPSAwOwotICAgICAgICByZXR1cm4gRGVmV2luZG93UHJvYyhoV25kLCBtZXNzYWdl
LCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgfQotICAgIEpTQzo6Z19zdGFja0Jhc2UgPSAwOwotICAg
IHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBpbml0aWFsaXplT2ZmU2NyZWVuVGltZXJXaW5k
b3coKQotewotICAgIGlmICh0aW1lcldpbmRvd0hhbmRsZSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgV05EQ0xBU1Mgd2NleCA9IHswfTsKLSAgICB3Y2V4LmxwZm5XbmRQcm9jICAgID0gVGltZXJX
aW5kb3dXbmRQcm9jOwotICAgIHdjZXguaEluc3RhbmNlICAgICAgPSBXZWJDb3JlOjppbnN0YW5j
ZUhhbmRsZSgpOwotICAgIHdjZXgubHBzekNsYXNzTmFtZSAgPSBrVGltZXJXaW5kb3dDbGFzc05h
bWU7Ci0gICAgUmVnaXN0ZXJDbGFzcygmd2NleCk7Ci0KLSAgICB0aW1lcldpbmRvd0hhbmRsZSA9
IENyZWF0ZVdpbmRvdyhrVGltZXJXaW5kb3dDbGFzc05hbWUsIDAsIDAsCi0gICAgICAgQ1dfVVNF
REVGQVVMVCwgMCwgQ1dfVVNFREVGQVVMVCwgMCwgMCwgMCwgV2ViQ29yZTo6aW5zdGFuY2VIYW5k
bGUoKSwgMCk7Ci19Ci0KLXZvaWQgc2V0U2hhcmVkVGltZXJGaXJlZEZ1bmN0aW9uKHZvaWQgKCpm
KSgpKQotewotICAgIHNoYXJlZFRpbWVyRmlyZWRGdW5jdGlvbiA9IGY7Ci19Ci0KLSNkZWZpbmUg
VVNFUl9USU1FUl9NQVhJTVVNICAweDdGRkZGRkZGCi0jZGVmaW5lIFVTRVJfVElNRVJfTUlOSU1V
TSAgMHgwMDAwMDAwQQotCi12b2lkIHNldFNoYXJlZFRpbWVyRmlyZVRpbWUoZG91YmxlIGZpcmVU
aW1lKQotewotICAgIEFTU0VSVChzaGFyZWRUaW1lckZpcmVkRnVuY3Rpb24pOwotCi0gICAgZG91
YmxlIGludGVydmFsID0gKGZpcmVUaW1lIC0gY3VycmVudFRpbWUoKSkgKiAxMDAwLjsKLSAgICB1
bnNpZ25lZCBpbnRlcnZhbEluTVMgPSBpbnRlcnZhbCA8IFVTRVJfVElNRVJfTUlOSU1VTQotICAg
ICAgICA/IFVTRVJfVElNRVJfTUlOSU1VTQotICAgICAgICA6IGludGVydmFsID4gVVNFUl9USU1F
Ul9NQVhJTVVNCi0gICAgICAgID8gVVNFUl9USU1FUl9NQVhJTVVNCi0gICAgICAgIDogc3RhdGlj
X2Nhc3Q8dW5zaWduZWQ+KGludGVydmFsKTsKLQotICAgIGlmICh0aW1lcklEID09IFRpbWVySWRB
dXRvKSB7Ci0gICAgICAgIEtpbGxUaW1lcih0aW1lcldpbmRvd0hhbmRsZSwgVGltZXJJZEF1dG8p
OwotICAgICAgICB0aW1lcklEID0gVGltZXJJZE5vbmU7Ci0gICAgfQotCi0gICAgaW5pdGlhbGl6
ZU9mZlNjcmVlblRpbWVyV2luZG93KCk7Ci0gICAgaWYgKFNldFRpbWVyKHRpbWVyV2luZG93SGFu
ZGxlLCBUaW1lcklkQXV0bywgaW50ZXJ2YWxJbk1TLCAwKSkKLSAgICAgICAgdGltZXJJRCA9IFRp
bWVySWRBdXRvOwotICAgIGVsc2UgaWYgKHRpbWVySUQgIT0gVGltZXJJZE1hbnVhbCkKLSAgICAg
ICAgUG9zdE1lc3NhZ2UodGltZXJXaW5kb3dIYW5kbGUsIFdNX1VTRVIsIDAsIDApOwotfQotCi12
b2lkIHN0b3BTaGFyZWRUaW1lcigpCi17Ci0gICAgaWYgKHRpbWVySUQgPT0gVGltZXJJZEF1dG8p
Ci0gICAgICAgIEtpbGxUaW1lcih0aW1lcldpbmRvd0hhbmRsZSwgVGltZXJJZEF1dG8pOwotCi0g
ICAgdGltZXJJRCA9IFRpbWVySWROb25lOwotfQotCi19CkluZGV4OiBXZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJUaGVtZVdpbkNFLi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlclRoZW1lV2luQ0UuLmgJKHJldmlzaW9uIDU3Mjg5KQkoZnJvbSBXZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJUaGVtZVdpbmNlLmg6NTcyODkpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJU
aGVtZVdpbkNFLi5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogVGhp
cyBmaWxlIGlzIHBhcnQgb2YgdGhlIFdlYktpdCBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAo
QykgMjAwNiwgMjAwOCBBcHBsZSBDb21wdXRlciwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA5
IFRvcmNoIE1vYmlsZSwgSW5jLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJl
OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUg
dGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1
Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNp
b24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv
bi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp
dCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl
dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBo
YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJ
Qi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEw
LTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBSZW5kZXJUaGVtZVdpbmNlX2gKKyNkZWZp
bmUgUmVuZGVyVGhlbWVXaW5jZV9oCisKKyNpbmNsdWRlICJSZW5kZXJUaGVtZS5oIgorCit0eXBl
ZGVmIHZvaWQqIEhBTkRMRTsKK3R5cGVkZWYgc3RydWN0IEhJTlNUQU5DRV9fKiBISU5TVEFOQ0U7
Cit0eXBlZGVmIEhJTlNUQU5DRSBITU9EVUxFOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyAg
ICBzdHJ1Y3QgVGhlbWVEYXRhIHsKKyAgICAgICAgVGhlbWVEYXRhKCkgOm1fcGFydCgwKSwgbV9z
dGF0ZSgwKSwgbV9jbGFzc2ljU3RhdGUoMCkge30KKyAgICAgICAgVGhlbWVEYXRhKGludCBwYXJ0
LCBpbnQgc3RhdGUpCisgICAgICAgICAgICA6IG1fcGFydChwYXJ0KQorICAgICAgICAgICAgLCBt
X3N0YXRlKHN0YXRlKQorICAgICAgICAgICAgLCBtX2NsYXNzaWNTdGF0ZSgwKQorICAgICAgICB7
IH0KKworICAgICAgICB1bnNpZ25lZCBtX3BhcnQ7CisgICAgICAgIHVuc2lnbmVkIG1fc3RhdGU7
CisgICAgICAgIHVuc2lnbmVkIG1fY2xhc3NpY1N0YXRlOworICAgIH07CisKKyAgICBjbGFzcyBS
ZW5kZXJUaGVtZVdpbmNlIDogcHVibGljIFJlbmRlclRoZW1lIHsKKyAgICBwdWJsaWM6CisgICAg
ICAgIHN0YXRpYyBQYXNzUmVmUHRyPFJlbmRlclRoZW1lPiBjcmVhdGUoKTsKKyAgICAgICAgflJl
bmRlclRoZW1lV2luY2UoKTsKKworICAgICAgICB2aXJ0dWFsIFN0cmluZyBleHRyYURlZmF1bHRT
dHlsZVNoZWV0KCk7CisgICAgICAgIHZpcnR1YWwgU3RyaW5nIGV4dHJhUXVpcmtzU3R5bGVTaGVl
dCgpOworCisgICAgICAgIC8vIEEgbWV0aG9kIGFza2luZyBpZiB0aGUgdGhlbWUncyBjb250cm9s
cyBhY3R1YWxseSBjYXJlIGFib3V0IHJlZHJhd2luZyB3aGVuIGhvdmVyZWQuCisgICAgICAgIHZp
cnR1YWwgYm9vbCBzdXBwb3J0c0hvdmVyKGNvbnN0IFJlbmRlclN0eWxlKikgY29uc3Q7CisKKyAg
ICAgICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xv
cigpIGNvbnN0OworICAgICAgICB2aXJ0dWFsIENvbG9yIHBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rp
b25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBDb2xvciBwbGF0Zm9y
bUFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0OworICAgICAgICB2aXJ0dWFs
IENvbG9yIHBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdDsK
KworICAgICAgICAvLyBTeXN0ZW0gZm9udHMuCisgICAgICAgIHZpcnR1YWwgdm9pZCBzeXN0ZW1G
b250KGludCBwcm9wSWQsIEZvbnREZXNjcmlwdGlvbiYpIGNvbnN0OworICAgICAgICB2aXJ0dWFs
IENvbG9yIHN5c3RlbUNvbG9yKGludCBjc3NWYWx1ZUlkKSBjb25zdDsKKworICAgICAgICB2aXJ0
dWFsIGJvb2wgcGFpbnRDaGVja2JveChSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVj
dDo6UGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByKQorICAgICAgICB7IHJldHVybiBwYWlu
dEJ1dHRvbihvLCBpLCByKTsgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0Q2hlY2tib3hTaXpl
KFJlbmRlclN0eWxlKikgY29uc3Q7CisKKyAgICAgICAgdmlydHVhbCBib29sIHBhaW50UmFkaW8o
UmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgaSwgY29uc3Qg
SW50UmVjdCYgcikKKyAgICAgICAgeyByZXR1cm4gcGFpbnRCdXR0b24obywgaSwgcik7IH0KKyAg
ICAgICAgdmlydHVhbCB2b2lkIHNldFJhZGlvU2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0
CisgICAgICAgIHsgcmV0dXJuIHNldENoZWNrYm94U2l6ZShzdHlsZSk7IH0KKworICAgICAgICB2
aXJ0dWFsIGJvb2wgcGFpbnRCdXR0b24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2JqZWN0
OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisKKyAgICAgICAgdmlydHVhbCBib29sIHBh
aW50VGV4dEZpZWxkKFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZv
JiwgY29uc3QgSW50UmVjdCYpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBwYWludFRleHRBcmVh
KFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIGksIGNvbnN0
IEludFJlY3QmIHIpCisgICAgICAgIHsgcmV0dXJuIHBhaW50VGV4dEZpZWxkKG8sIGksIHIpOyB9
CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFkanVzdE1lbnVMaXN0U3R5bGUoQ1NTU3R5bGVTZWxl
Y3Rvciogc2VsZWN0b3IsIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCogZSkgY29uc3Q7Cisg
ICAgICAgIHZpcnR1YWwgYm9vbCBwYWludE1lbnVMaXN0KFJlbmRlck9iamVjdCosIGNvbnN0IFJl
bmRlck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgICAgICB2aXJ0dWFs
IHZvaWQgYWRqdXN0TWVudUxpc3RCdXR0b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3Rv
ciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlKSBjb25zdDsKKworICAgICAgICB2aXJ0
dWFsIGJvb2wgcGFpbnRNZW51TGlzdEJ1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJP
YmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworICAgICAgICB2aXJ0dWFsIGJv
b2wgcGFpbnRTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6
UGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByKTsKKyAgICAgICAgdmlydHVhbCBib29sIHBh
aW50U2xpZGVyVGh1bWIoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50
SW5mbyYgaSwgY29uc3QgSW50UmVjdCYgcik7CisgICAgICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RT
bGlkZXJUaHVtYlNpemUoUmVuZGVyT2JqZWN0KikgY29uc3Q7CisKKyAgICAgICAgdmlydHVhbCBi
b29sIHBvcHVwT3B0aW9uU3VwcG9ydHNUZXh0SW5kZW50KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsg
fQorCisgICAgICAgIHZpcnR1YWwgaW50IGJ1dHRvbkludGVybmFsUGFkZGluZ0xlZnQoKSBjb25z
dDsKKyAgICAgICAgdmlydHVhbCBpbnQgYnV0dG9uSW50ZXJuYWxQYWRkaW5nUmlnaHQoKSBjb25z
dDsKKyAgICAgICAgdmlydHVhbCBpbnQgYnV0dG9uSW50ZXJuYWxQYWRkaW5nVG9wKCkgY29uc3Q7
CisgICAgICAgIHZpcnR1YWwgaW50IGJ1dHRvbkludGVybmFsUGFkZGluZ0JvdHRvbSgpIGNvbnN0
OworCisgICAgICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RTZWFyY2hGaWVsZFN0eWxlKENTU1N0eWxl
U2VsZWN0b3IqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKKyAgICAgICAgdmlydHVh
bCBib29sIHBhaW50U2VhcmNoRmllbGQoUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2JqZWN0
OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFk
anVzdFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRl
clN0eWxlKiwgRWxlbWVudCopIGNvbnN0OworICAgICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTZWFy
Y2hGaWVsZENhbmNlbEJ1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBh
aW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0
U2VhcmNoRmllbGREZWNvcmF0aW9uU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxl
KiwgRWxlbWVudCopIGNvbnN0OworICAgICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTZWFyY2hGaWVs
ZERlY29yYXRpb24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8m
LCBjb25zdCBJbnRSZWN0JikgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgICB2aXJ0dWFsIHZv
aWQgYWRqdXN0U2VhcmNoRmllbGRSZXN1bHRzRGVjb3JhdGlvblN0eWxlKENTU1N0eWxlU2VsZWN0
b3IqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBib29s
IHBhaW50U2VhcmNoRmllbGRSZXN1bHRzRGVjb3JhdGlvbihSZW5kZXJPYmplY3QqLCBjb25zdCBS
ZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworICAgICAgICB2aXJ0
dWFsIHZvaWQgYWRqdXN0U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uU3R5bGUoQ1NTU3R5bGVTZWxl
Y3RvciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0OworICAgICAgICB2aXJ0dWFsIGJv
b2wgcGFpbnRTZWFyY2hGaWVsZFJlc3VsdHNCdXR0b24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVu
ZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisKKyAgICAgICAgdmlydHVh
bCB2b2lkIHRoZW1lQ2hhbmdlZCgpOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RCdXR0
b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50Kikg
Y29uc3Qge30KKyAgICAgICAgdmlydHVhbCB2b2lkIGFkanVzdFRleHRGaWVsZFN0eWxlKENTU1N0
eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdCB7fQorICAg
ICAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0VGV4dEFyZWFTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwg
UmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3Qge30KKworICAgICAgICBzdGF0aWMg
dm9pZCBzZXRXZWJLaXRJc0JlaW5nVW5sb2FkZWQoKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wg
c3VwcG9ydHNGb2N1c1JpbmcoY29uc3QgUmVuZGVyU3R5bGUqKSBjb25zdDsKKworICAgICNpZiBF
TkFCTEUoVklERU8pCisgICAgICAgIHZpcnR1YWwgYm9vbCBwYWludE1lZGlhRnVsbHNjcmVlbkJ1
dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0
IEludFJlY3QmKTsKKyAgICAgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFQbGF5QnV0dG9uKFJl
bmRlck9iamVjdCosIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50UmVj
dCYpOworICAgICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRNZWRpYU11dGVCdXR0b24oUmVuZGVyT2Jq
ZWN0KiwgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7Cisg
ICAgICAgIHZpcnR1YWwgYm9vbCBwYWludE1lZGlhU2Vla0JhY2tCdXR0b24oUmVuZGVyT2JqZWN0
KiwgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAg
ICAgIHZpcnR1YWwgYm9vbCBwYWludE1lZGlhU2Vla0ZvcndhcmRCdXR0b24oUmVuZGVyT2JqZWN0
KiwgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAg
ICAgIHZpcnR1YWwgYm9vbCBwYWludE1lZGlhU2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0KiwgY29u
c3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgICAgIHZp
cnR1YWwgYm9vbCBwYWludE1lZGlhU2xpZGVyVGh1bWIoUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVu
ZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgI2VuZGlmCisKKyAg
ICBwcml2YXRlOgorICAgICAgICBSZW5kZXJUaGVtZVdpbmNlKCk7CisKKyAgICAgICAgdW5zaWdu
ZWQgZGV0ZXJtaW5lQ2xhc3NpY1N0YXRlKFJlbmRlck9iamVjdCopOworICAgICAgICBib29sIHN1
cHBvcnRzRm9jdXMoQ29udHJvbFBhcnQpIGNvbnN0OworCisgICAgICAgIFRoZW1lRGF0YSBnZXRU
aGVtZURhdGEoUmVuZGVyT2JqZWN0Kik7CisgICAgfTsKKworfTsKKworI2VuZGlmCkluZGV4OiBX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZVdpbkNFLi5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lV2luQ0UuLmgJKHJldmlzaW9uIDU3Mjg5KQorKysgV2Vi
Q29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVXaW5DRS4uaAkod29ya2luZyBjb3B5KQpAQCAtMjEs
OCArMjEsOCBAQAogICoKICAqLwogCi0jaWZuZGVmIFJlbmRlclRoZW1lV2luY2VfaAotI2RlZmlu
ZSBSZW5kZXJUaGVtZVdpbmNlX2gKKyNpZm5kZWYgUmVuZGVyVGhlbWVXaW5DRV9oCisjZGVmaW5l
IFJlbmRlclRoZW1lV2luQ0VfaAogCiAjaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKIApAQCAtNDUs
MTAgKzQ1LDEwIEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgdW5zaWduZWQgbV9jbGFz
c2ljU3RhdGU7CiAgICAgfTsKIAotICAgIGNsYXNzIFJlbmRlclRoZW1lV2luY2UgOiBwdWJsaWMg
UmVuZGVyVGhlbWUgeworICAgIGNsYXNzIFJlbmRlclRoZW1lV2luQ0UgOiBwdWJsaWMgUmVuZGVy
VGhlbWUgewogICAgIHB1YmxpYzoKICAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8UmVuZGVyVGhl
bWU+IGNyZWF0ZSgpOwotICAgICAgICB+UmVuZGVyVGhlbWVXaW5jZSgpOworICAgICAgICB+UmVu
ZGVyVGhlbWVXaW5DRSgpOwogCiAgICAgICAgIHZpcnR1YWwgU3RyaW5nIGV4dHJhRGVmYXVsdFN0
eWxlU2hlZXQoKTsKICAgICAgICAgdmlydHVhbCBTdHJpbmcgZXh0cmFRdWlya3NTdHlsZVNoZWV0
KCk7CkBAIC0xMzQsNyArMTM0LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICNlbmRpZgog
CiAgICAgcHJpdmF0ZToKLSAgICAgICAgUmVuZGVyVGhlbWVXaW5jZSgpOworICAgICAgICBSZW5k
ZXJUaGVtZVdpbkNFKCk7CiAKICAgICAgICAgdW5zaWduZWQgZGV0ZXJtaW5lQ2xhc3NpY1N0YXRl
KFJlbmRlck9iamVjdCopOwogICAgICAgICBib29sIHN1cHBvcnRzRm9jdXMoQ29udHJvbFBhcnQp
IGNvbnN0OwpAQCAtMTQ0LDQgKzE0NCw0IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogfTsKIAot
I2VuZGlmCisjZW5kaWYgLy8gUmVuZGVyVGhlbWVXaW5DRV9oCkluZGV4OiBXZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJUaGVtZVdpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJUaGVtZVdpbkNFLmNwcAkocmV2aXNpb24gNTcyODkpCShmcm9tIFdlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlclRoZW1lV2luY2UuY3BwOjU3Mjg5KQorKysgV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyVGhlbWVXaW5DRS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2NjggQEAKKy8q
CisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgV2ViS2l0IHByb2plY3QuCisgKgorICogQ29w
eXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIENvbXB1dGVyLCBJbmMuCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkg
aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICog
TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0
aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55
IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRo
ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFO
VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklM
SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAq
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAq
IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZp
bGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9z
dG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJSZW5kZXJUaGVtZVdpbmNlLmgiCisKKyNpbmNsdWRlICJDU1NTdHlsZVNoZWV0
LmgiCisjaW5jbHVkZSAiQ1NTVmFsdWVLZXl3b3Jkcy5oIgorI2luY2x1ZGUgIkRvY3VtZW50Lmgi
CisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQu
aCIKKyNpZiBFTkFCTEUoVklERU8pCisjaW5jbHVkZSAiSFRNTE1lZGlhRWxlbWVudC5oIgorI2Vu
ZGlmCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKy8qIAorICogVGhlIGZvbGxvd2luZyBjb25z
dGFudHMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIGhvdyBhIHdpZGdldCBpcyBkcmF3biB1c2luZwor
ICogV2luZG93cycgVGhlbWUgQVBJLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVtZSBwYXJ0
cyBhbmQgc3RhdGVzIHNlZQorICogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2Rl
ZmF1bHQuYXNwP3VybD0vbGlicmFyeS9lbi11cy9zaGVsbGNjL3BsYXRmb3JtL2NvbW1jdGxzL3Vz
ZXJleC90b3BpY3MvcGFydHNhbmRzdGF0ZXMuYXNwCisgKi8KKyNkZWZpbmUgVEhFTUVfQ09MT1Ig
MjA0CisjZGVmaW5lIFRIRU1FX0ZPTlQgIDIxMAorCisvLyBHZW5lcmljIHN0YXRlIGNvbnN0YW50
cworI2RlZmluZSBUU19OT1JNQUwgICAgMQorI2RlZmluZSBUU19IT1ZFUiAgICAgMgorI2RlZmlu
ZSBUU19BQ1RJVkUgICAgMworI2RlZmluZSBUU19ESVNBQkxFRCAgNAorI2RlZmluZSBUU19GT0NV
U0VEICAgNQorCisvLyBCdXR0b24gY29uc3RhbnRzCisjZGVmaW5lIEJQX0JVVFRPTiAgICAxCisj
ZGVmaW5lIEJQX1JBRElPICAgICAyCisjZGVmaW5lIEJQX0NIRUNLQk9YICAzCisKKy8vIFRleHRm
aWVsZCBjb25zdGFudHMKKyNkZWZpbmUgVEZQX1RFWFRGSUVMRCAxCisjZGVmaW5lIFRGU19SRUFE
T05MWSAgNgorCit0eXBlZGVmIEhBTkRMRSAoV0lOQVBJKm9wZW5UaGVtZURhdGFQdHIpKEhXTkQg
aHduZCwgTFBDV1NUUiBwc3pDbGFzc0xpc3QpOwordHlwZWRlZiBIUkVTVUxUIChXSU5BUEkqY2xv
c2VUaGVtZURhdGFQdHIpKEhBTkRMRSBoVGhlbWUpOwordHlwZWRlZiBIUkVTVUxUIChXSU5BUEkq
ZHJhd1RoZW1lQmFja2dyb3VuZFB0cikoSEFORExFIGhUaGVtZSwgSERDIGhkYywgaW50IGlQYXJ0
SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaVN0YXRl
SWQsIGNvbnN0IFJFQ1QgKnBSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY29uc3QgUkVDVCogcENsaXBSZWN0KTsKK3R5cGVkZWYgSFJFU1VMVCAoV0lOQVBJ
KmRyYXdUaGVtZUVkZ2VQdHIpKEhBTkRMRSBoVGhlbWUsIEhEQyBoZGMsIGludCBpUGFydElkLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlTdGF0ZUlkLCBj
b25zdCBSRUNUICpwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHVuc2lnbmVkIHVFZGdlLCB1bnNpZ25lZCB1RmxhZ3MsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSRUNUKiBwQ2xpcFJlY3QpOwordHlwZWRlZiBI
UkVTVUxUIChXSU5BUEkqZ2V0VGhlbWVDb250ZW50UmVjdFB0cikoSEFORExFIGhUaGVtZSwgSERD
IGhkYywgaW50IGlQYXJ0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBpbnQgaVN0YXRlSWQsIGNvbnN0IFJFQ1QqIHBSZWN0LAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgUkVDVCogcENvbnRlbnRSZWN0KTsKK3R5cGVkZWYgSFJF
U1VMVCAoV0lOQVBJKmdldFRoZW1lUGFydFNpemVQdHIpKEhBTkRMRSBoVGhlbWUsIEhEQyBoZGMs
IGludCBpUGFydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50
IGlTdGF0ZUlkLCBSRUNUKiBwcmMsIGludCB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFNJWkUqIHBzeik7Cit0eXBlZGVmIEhSRVNVTFQgKFdJTkFQSSpnZXRUaGVt
ZVN5c0ZvbnRQdHIpKEhBTkRMRSBoVGhlbWUsIGludCBpRm9udElkLCBPVVQgTE9HRk9OVCogcEZv
bnQpOwordHlwZWRlZiBIUkVTVUxUIChXSU5BUEkqZ2V0VGhlbWVDb2xvclB0cikoSEFORExFIGhU
aGVtZSwgSERDIGhkYywgaW50IGlQYXJ0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGludCBpU3RhdGVJZCwgaW50IGlQcm9wSWQsIE9VVCBDT0xPUlJFRiogcEZvbnQpOwor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyBjb25zdCBpbnQgZHJvcERvd25CdXR0b25X
aWR0aCA9IDE3Oworc3RhdGljIGNvbnN0IGludCB0cmFja1dpZHRoID0gNDsKKworUGFzc1JlZlB0
cjxSZW5kZXJUaGVtZT4gUmVuZGVyVGhlbWVXaW5jZTo6Y3JlYXRlKCkKK3sKKyAgICByZXR1cm4g
YWRvcHRSZWYobmV3IFJlbmRlclRoZW1lV2luY2UpOworfQorCitQYXNzUmVmUHRyPFJlbmRlclRo
ZW1lPiBSZW5kZXJUaGVtZTo6dGhlbWVGb3JQYWdlKFBhZ2UqIHBhZ2UpCit7CisgICAgc3RhdGlj
IFJlbmRlclRoZW1lKiB3aW5jZVRoZW1lID0gUmVuZGVyVGhlbWVXaW5jZTo6Y3JlYXRlKCkucmVs
ZWFzZVJlZigpOworICAgIHJldHVybiB3aW5jZVRoZW1lOworfQorCitSZW5kZXJUaGVtZVdpbmNl
OjpSZW5kZXJUaGVtZVdpbmNlKCkKK3sKK30KKworUmVuZGVyVGhlbWVXaW5jZTo6flJlbmRlclRo
ZW1lV2luY2UoKQoreworfQorCitDb2xvciBSZW5kZXJUaGVtZVdpbmNlOjpwbGF0Zm9ybUFjdGl2
ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0Cit7CisgICAgQ09MT1JSRUYgY29sb3Ig
PSBHZXRTeXNDb2xvcihDT0xPUl9ISUdITElHSFQpOworICAgIHJldHVybiBDb2xvcihHZXRSVmFs
dWUoY29sb3IpLCBHZXRHVmFsdWUoY29sb3IpLCBHZXRCVmFsdWUoY29sb3IpLCAyNTUpOworfQor
CitDb2xvciBSZW5kZXJUaGVtZVdpbmNlOjpwbGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uQmFja2dy
b3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBDT0xPUlJFRiBjb2xvciA9IEdldFN5c0NvbG9yKENP
TE9SX0dSQVlURVhUKTsKKyAgICByZXR1cm4gQ29sb3IoR2V0UlZhbHVlKGNvbG9yKSwgR2V0R1Zh
bHVlKGNvbG9yKSwgR2V0QlZhbHVlKGNvbG9yKSwgMjU1KTsKK30KKworQ29sb3IgUmVuZGVyVGhl
bWVXaW5jZTo6cGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdAor
eworICAgIENPTE9SUkVGIGNvbG9yID0gR2V0U3lzQ29sb3IoQ09MT1JfSElHSExJR0hUVEVYVCk7
CisgICAgcmV0dXJuIENvbG9yKEdldFJWYWx1ZShjb2xvciksIEdldEdWYWx1ZShjb2xvciksIEdl
dEJWYWx1ZShjb2xvciksIDI1NSk7Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lV2luY2U6OnBsYXRm
b3JtSW5hY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAgIHJldHVy
biBDb2xvcjo6d2hpdGU7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVXaW5jZTo6c3VwcG9ydHNGb2N1
cyhDb250cm9sUGFydCBhcHBlYXJhbmNlKSBjb25zdAoreworICAgIHN3aXRjaCAoYXBwZWFyYW5j
ZSkgeworICAgIGNhc2UgUHVzaEJ1dHRvblBhcnQ6CisgICAgY2FzZSBCdXR0b25QYXJ0OgorICAg
IGNhc2UgVGV4dEZpZWxkUGFydDoKKyAgICBjYXNlIFRleHRBcmVhUGFydDoKKyAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwor
ICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpzdXBwb3J0c0Zv
Y3VzUmluZyhjb25zdCBSZW5kZXJTdHlsZSAqc3R5bGUpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN1
cHBvcnRzRm9jdXMoc3R5bGUtPmFwcGVhcmFuY2UoKSk7Cit9CisKK3Vuc2lnbmVkIFJlbmRlclRo
ZW1lV2luY2U6OmRldGVybWluZUNsYXNzaWNTdGF0ZShSZW5kZXJPYmplY3QqIG8pCit7CisgICAg
dW5zaWduZWQgcmVzdWx0ID0gMDsKKyAgICBpZiAoIWlzRW5hYmxlZChvKSB8fCBpc1JlYWRPbmx5
Q29udHJvbChvKSkKKyAgICAgICAgcmVzdWx0ID0gREZDU19JTkFDVElWRTsKKyAgICBlbHNlIGlm
IChpc1ByZXNzZWQobykpIC8vIEFjdGl2ZSBzdXBlcnNlZGVzIGhvdmVyCisgICAgICAgIHJlc3Vs
dCA9IERGQ1NfUFVTSEVEOworCisgICAgaWYgKGlzQ2hlY2tlZChvKSkKKyAgICAgICAgcmVzdWx0
IHw9IERGQ1NfQ0hFQ0tFRDsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitUaGVtZURhdGEgUmVu
ZGVyVGhlbWVXaW5jZTo6Z2V0VGhlbWVEYXRhKFJlbmRlck9iamVjdCogbykKK3sKKyAgICBUaGVt
ZURhdGEgcmVzdWx0OworICAgIHN3aXRjaCAoby0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpKSB7Cisg
ICAgY2FzZSBQdXNoQnV0dG9uUGFydDoKKyAgICBjYXNlIEJ1dHRvblBhcnQ6CisgICAgICAgIHJl
c3VsdC5tX3BhcnQgPSBCUF9CVVRUT047CisgICAgICAgIHJlc3VsdC5tX2NsYXNzaWNTdGF0ZSA9
IERGQ1NfQlVUVE9OUFVTSDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDaGVja2JveFBhcnQ6
CisgICAgICAgIHJlc3VsdC5tX3BhcnQgPSBCUF9DSEVDS0JPWDsKKyAgICAgICAgcmVzdWx0Lm1f
Y2xhc3NpY1N0YXRlID0gREZDU19CVVRUT05DSEVDSzsKKyAgICAgICAgYnJlYWs7CisgICAgY2Fz
ZSBSYWRpb1BhcnQ6CisgICAgICAgIHJlc3VsdC5tX3BhcnQgPSBCUF9SQURJTzsKKyAgICAgICAg
cmVzdWx0Lm1fY2xhc3NpY1N0YXRlID0gREZDU19CVVRUT05SQURJTzsKKyAgICAgICAgYnJlYWs7
CisgICAgY2FzZSBMaXN0Ym94UGFydDoKKyAgICBjYXNlIE1lbnVsaXN0UGFydDoKKyAgICBjYXNl
IFRleHRGaWVsZFBhcnQ6CisgICAgY2FzZSBUZXh0QXJlYVBhcnQ6CisgICAgICAgIHJlc3VsdC5t
X3BhcnQgPSBURlBfVEVYVEZJRUxEOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXN1
bHQubV9jbGFzc2ljU3RhdGUgfD0gZGV0ZXJtaW5lQ2xhc3NpY1N0YXRlKG8pOworCisgICAgcmV0
dXJuIHJlc3VsdDsKK30KKworYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludEJ1dHRvbihSZW5k
ZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBpLCBjb25zdCBJbnRS
ZWN0JiByKQoreworICAgIC8vIEdldCB0aGUgY29ycmVjdCB0aGVtZSBkYXRhIGZvciBhIGJ1dHRv
bgorICAgIFRoZW1lRGF0YSB0aGVtZURhdGEgPSBnZXRUaGVtZURhdGEobyk7CisKKyAgICAvLyBO
b3cgcGFpbnQgdGhlIGJ1dHRvbi4KKyAgICBpLmNvbnRleHQtPmRyYXdGcmFtZUNvbnRyb2wociwg
REZDX0JVVFRPTiwgdGhlbWVEYXRhLm1fY2xhc3NpY1N0YXRlKTsKKyAgICBpZiAoaXNGb2N1c2Vk
KG8pKSB7CisgICAgICAgIGlmICh0aGVtZURhdGEubV9wYXJ0ID09IEJQX0JVVFRPTikgeworICAg
ICAgICAgICAgSW50UmVjdCBmb2N1c1JlY3Qocik7CisgICAgICAgICAgICBmb2N1c1JlY3QuaW5m
bGF0ZSgtMik7CisgICAgICAgICAgICBpLmNvbnRleHQtPmRyYXdGb2N1c1JlY3QoZm9jdXNSZWN0
KTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBpLmNvbnRleHQtPmRyYXdGb2N1c1JlY3Qo
cik7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFJlbmRlclRoZW1lV2lu
Y2U6OnNldENoZWNrYm94U2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgLy8g
SWYgdGhlIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGJvdGggc3BlY2lmaWVkLCB0aGVuIHdlIGhhdmUg
bm90aGluZyB0byBkby4KKyAgICBpZiAoIXN0eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRv
KCkgJiYgIXN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
Ly8gRklYTUU6ICBBIGhhcmQtY29kZWQgc2l6ZSBvZiAxMyBpcyB1c2VkLiAgVGhpcyBpcyB3cm9u
ZyBidXQgbmVjZXNzYXJ5IGZvciBub3cuICBJdCBtYXRjaGVzIEZpcmVmb3guCisgICAgLy8gQXQg
ZGlmZmVyZW50IERQSSBzZXR0aW5ncyBvbiBXaW5kb3dzLCBxdWVyeWluZyB0aGUgdGhlbWUgZ2l2
ZXMgeW91IGEgbGFyZ2VyIHNpemUgdGhhdCBhY2NvdW50cyBmb3IKKyAgICAvLyB0aGUgaGlnaGVy
IERQSS4gIFVudGlsIG91ciBlbnRpcmUgZW5naW5lIGhvbm9ycyBhIERQSSBzZXR0aW5nIG90aGVy
IHRoYW4gOTYsIHdlIGNhbid0IHJlbHkgb24gdGhlIHRoZW1lJ3MKKyAgICAvLyBtZXRyaWNzLgor
ICAgIGlmIChzdHlsZS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpKQorICAgICAgICBzdHls
ZS0+c2V0V2lkdGgoTGVuZ3RoKDEzLCBGaXhlZCkpOworICAgIGlmIChzdHlsZS0+aGVpZ2h0KCku
aXNBdXRvKCkpCisgICAgICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKDEzLCBGaXhlZCkpOwor
fQorCitib29sIFJlbmRlclRoZW1lV2luY2U6OnBhaW50VGV4dEZpZWxkKFJlbmRlck9iamVjdCog
bywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIGksIGNvbnN0IEludFJlY3QmIHIpCit7
CisgICAgLy8gR2V0IHRoZSBjb3JyZWN0IHRoZW1lIGRhdGEgZm9yIGEgdGV4dGZpZWxkCisgICAg
VGhlbWVEYXRhIHRoZW1lRGF0YSA9IGdldFRoZW1lRGF0YShvKTsKKworICAgIC8vIE5vdyBwYWlu
dCB0aGUgdGV4dCBmaWVsZC4KKyAgICBpLmNvbnRleHQtPnBhaW50VGV4dEZpZWxkKHIsIHRoZW1l
RGF0YS5tX2NsYXNzaWNTdGF0ZSk7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUmVu
ZGVyVGhlbWVXaW5jZTo6YWRqdXN0TWVudUxpc3RTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxl
Y3RvciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlKSBjb25zdAoreworICAgIHN0eWxl
LT5yZXNldEJvcmRlcigpOworICAgIGFkanVzdE1lbnVMaXN0QnV0dG9uU3R5bGUoc2VsZWN0b3Is
IHN0eWxlLCBlKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludE1lbnVMaXN0KFJl
bmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIGksIGNvbnN0IElu
dFJlY3QmIHIpCit7CisgICAgcGFpbnRUZXh0RmllbGQobywgaSwgcik7CisgICAgcGFpbnRNZW51
TGlzdEJ1dHRvbihvLCBpLCByKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBSZW5kZXJU
aGVtZVdpbmNlOjpwYWludE1lbnVMaXN0QnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVu
ZGVyT2JqZWN0OjpQYWludEluZm8mIGksIGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgSW50UmVj
dCBidXR0b25SZWN0KHIucmlnaHQoKSAtIGRyb3BEb3duQnV0dG9uV2lkdGggLSAxLCByLnkoKSwg
ZHJvcERvd25CdXR0b25XaWR0aCwgci5oZWlnaHQoKSk7CisgICAgYnV0dG9uUmVjdC5pbmZsYXRl
WSgtMSk7CisgICAgaS5jb250ZXh0LT5kcmF3RnJhbWVDb250cm9sKGJ1dHRvblJlY3QsIERGQ19T
Q1JPTEwsIERGQ1NfU0NST0xMQ09NQk9CT1ggfCBkZXRlcm1pbmVDbGFzc2ljU3RhdGUobykpOwor
ICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFJlbmRlclRoZW1lV2luY2U6OnN5c3RlbUZvbnQo
aW50IHByb3BJZCwgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIGNvbnN0Cit7Cisg
ICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZVdpbmNlOjp0aGVtZUNo
YW5nZWQoKQoreworfQorCitTdHJpbmcgUmVuZGVyVGhlbWVXaW5jZTo6ZXh0cmFEZWZhdWx0U3R5
bGVTaGVldCgpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gU3RyaW5nKCk7
Cit9CisKK1N0cmluZyBSZW5kZXJUaGVtZVdpbmNlOjpleHRyYVF1aXJrc1N0eWxlU2hlZXQoKQor
eworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIFN0cmluZygpOworfQorCitib29s
IFJlbmRlclRoZW1lV2luY2U6OnN1cHBvcnRzSG92ZXIoY29uc3QgUmVuZGVyU3R5bGUqKSBjb25z
dAoreworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gTWFwIGEgQ1NTVmFsdWUqIHN5c3RlbSBj
b2xvciB0byBhbiBpbmRleCB1bmRlcnN0b29kIGJ5IEdldFN5c0NvbG9yCitzdGF0aWMgaW50IGNz
c1ZhbHVlSWRUb1N5c0NvbG9ySW5kZXgoaW50IGNzc1ZhbHVlSWQpCit7CisgICAgc3dpdGNoIChj
c3NWYWx1ZUlkKSB7CisgICAgY2FzZSBDU1NWYWx1ZUFjdGl2ZWJvcmRlcjogcmV0dXJuIENPTE9S
X0FDVElWRUJPUkRFUjsKKyAgICBjYXNlIENTU1ZhbHVlQWN0aXZlY2FwdGlvbjogcmV0dXJuIENP
TE9SX0FDVElWRUNBUFRJT047CisgICAgY2FzZSBDU1NWYWx1ZUFwcHdvcmtzcGFjZTogcmV0dXJu
IENPTE9SX0FQUFdPUktTUEFDRTsKKyAgICBjYXNlIENTU1ZhbHVlQmFja2dyb3VuZDogcmV0dXJu
IENPTE9SX0JBQ0tHUk9VTkQ7CisgICAgY2FzZSBDU1NWYWx1ZUJ1dHRvbmZhY2U6IHJldHVybiBD
T0xPUl9CVE5GQUNFOworICAgIGNhc2UgQ1NTVmFsdWVCdXR0b25oaWdobGlnaHQ6IHJldHVybiBD
T0xPUl9CVE5ISUdITElHSFQ7CisgICAgY2FzZSBDU1NWYWx1ZUJ1dHRvbnNoYWRvdzogcmV0dXJu
IENPTE9SX0JUTlNIQURPVzsKKyAgICBjYXNlIENTU1ZhbHVlQnV0dG9udGV4dDogcmV0dXJuIENP
TE9SX0JUTlRFWFQ7CisgICAgY2FzZSBDU1NWYWx1ZUNhcHRpb250ZXh0OiByZXR1cm4gQ09MT1Jf
Q0FQVElPTlRFWFQ7CisgICAgY2FzZSBDU1NWYWx1ZUdyYXl0ZXh0OiByZXR1cm4gQ09MT1JfR1JB
WVRFWFQ7CisgICAgY2FzZSBDU1NWYWx1ZUhpZ2hsaWdodDogcmV0dXJuIENPTE9SX0hJR0hMSUdI
VDsKKyAgICBjYXNlIENTU1ZhbHVlSGlnaGxpZ2h0dGV4dDogcmV0dXJuIENPTE9SX0hJR0hMSUdI
VFRFWFQ7CisgICAgY2FzZSBDU1NWYWx1ZUluYWN0aXZlYm9yZGVyOiByZXR1cm4gQ09MT1JfSU5B
Q1RJVkVCT1JERVI7CisgICAgY2FzZSBDU1NWYWx1ZUluYWN0aXZlY2FwdGlvbjogcmV0dXJuIENP
TE9SX0lOQUNUSVZFQ0FQVElPTjsKKyAgICBjYXNlIENTU1ZhbHVlSW5hY3RpdmVjYXB0aW9udGV4
dDogcmV0dXJuIENPTE9SX0lOQUNUSVZFQ0FQVElPTlRFWFQ7CisgICAgY2FzZSBDU1NWYWx1ZUlu
Zm9iYWNrZ3JvdW5kOiByZXR1cm4gQ09MT1JfSU5GT0JLOworICAgIGNhc2UgQ1NTVmFsdWVJbmZv
dGV4dDogcmV0dXJuIENPTE9SX0lORk9URVhUOworICAgIGNhc2UgQ1NTVmFsdWVNZW51OiByZXR1
cm4gQ09MT1JfTUVOVTsKKyAgICBjYXNlIENTU1ZhbHVlTWVudXRleHQ6IHJldHVybiBDT0xPUl9N
RU5VVEVYVDsKKyAgICBjYXNlIENTU1ZhbHVlU2Nyb2xsYmFyOiByZXR1cm4gQ09MT1JfU0NST0xM
QkFSOworICAgIGNhc2UgQ1NTVmFsdWVUaHJlZWRkYXJrc2hhZG93OiByZXR1cm4gQ09MT1JfM0RE
S1NIQURPVzsKKyAgICBjYXNlIENTU1ZhbHVlVGhyZWVkZmFjZTogcmV0dXJuIENPTE9SXzNERkFD
RTsKKyAgICBjYXNlIENTU1ZhbHVlVGhyZWVkaGlnaGxpZ2h0OiByZXR1cm4gQ09MT1JfM0RISUdI
TElHSFQ7CisgICAgY2FzZSBDU1NWYWx1ZVRocmVlZGxpZ2h0c2hhZG93OiByZXR1cm4gQ09MT1Jf
M0RMSUdIVDsKKyAgICBjYXNlIENTU1ZhbHVlVGhyZWVkc2hhZG93OiByZXR1cm4gQ09MT1JfM0RT
SEFET1c7CisgICAgY2FzZSBDU1NWYWx1ZVdpbmRvdzogcmV0dXJuIENPTE9SX1dJTkRPVzsKKyAg
ICBjYXNlIENTU1ZhbHVlV2luZG93ZnJhbWU6IHJldHVybiBDT0xPUl9XSU5ET1dGUkFNRTsKKyAg
ICBjYXNlIENTU1ZhbHVlV2luZG93dGV4dDogcmV0dXJuIENPTE9SX1dJTkRPV1RFWFQ7CisgICAg
ZGVmYXVsdDogcmV0dXJuIC0xOyAvLyBVbnN1cHBvcnRlZCBDU1NWYWx1ZQorICAgIH0KK30KKwor
Q29sb3IgUmVuZGVyVGhlbWVXaW5jZTo6c3lzdGVtQ29sb3IoaW50IGNzc1ZhbHVlSWQpIGNvbnN0
Cit7CisgICAgaW50IHN5c0NvbG9ySW5kZXggPSBjc3NWYWx1ZUlkVG9TeXNDb2xvckluZGV4KGNz
c1ZhbHVlSWQpOworICAgIGlmIChzeXNDb2xvckluZGV4ID09IC0xKQorICAgICAgICByZXR1cm4g
UmVuZGVyVGhlbWU6OnN5c3RlbUNvbG9yKGNzc1ZhbHVlSWQpOworCisgICAgQ09MT1JSRUYgY29s
b3IgPSBHZXRTeXNDb2xvcihzeXNDb2xvckluZGV4KTsKKyAgICByZXR1cm4gQ29sb3IoR2V0UlZh
bHVlKGNvbG9yKSwgR2V0R1ZhbHVlKGNvbG9yKSwgR2V0QlZhbHVlKGNvbG9yKSk7Cit9CisKK2Nv
bnN0IGludCBzbGlkZXJUaHVtYldpZHRoID0gNzsKK2NvbnN0IGludCBzbGlkZXJUaHVtYkhlaWdo
dCA9IDE1OworCit2b2lkIFJlbmRlclRoZW1lV2luY2U6OmFkanVzdFNsaWRlclRodW1iU2l6ZShS
ZW5kZXJPYmplY3QqIG8pIGNvbnN0Cit7CisgICAgaWYgKG8tPnN0eWxlKCktPmFwcGVhcmFuY2Uo
KSA9PSBTbGlkZXJUaHVtYlZlcnRpY2FsUGFydCkgeworICAgICAgICBvLT5zdHlsZSgpLT5zZXRX
aWR0aChMZW5ndGgoc2xpZGVyVGh1bWJIZWlnaHQsIEZpeGVkKSk7CisgICAgICAgIG8tPnN0eWxl
KCktPnNldEhlaWdodChMZW5ndGgoc2xpZGVyVGh1bWJXaWR0aCwgRml4ZWQpKTsKKyAgICB9IGVs
c2UgaWYgKG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKSA9PSBTbGlkZXJUaHVtYkhvcml6b250YWxQ
YXJ0KSB7CisgICAgICAgIG8tPnN0eWxlKCktPnNldFdpZHRoKExlbmd0aChzbGlkZXJUaHVtYldp
ZHRoLCBGaXhlZCkpOworICAgICAgICBvLT5zdHlsZSgpLT5zZXRIZWlnaHQoTGVuZ3RoKHNsaWRl
clRodW1iSGVpZ2h0LCBGaXhlZCkpOworICAgIH0KK30KKworI2lmIDAKK3ZvaWQgUmVuZGVyVGhl
bWVXaW5jZTo6YWRqdXN0QnV0dG9uSW5uZXJTdHlsZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0
Cit7CisgICAgLy8gVGhpcyBpbm5lciBwYWRkaW5nIG1hdGNoZXMgRmlyZWZveC4KKyAgICBzdHls
ZS0+c2V0UGFkZGluZ1RvcChMZW5ndGgoMSwgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0UGFkZGlu
Z1JpZ2h0KExlbmd0aCgzLCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRQYWRkaW5nQm90dG9tKExl
bmd0aCgxLCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRQYWRkaW5nTGVmdChMZW5ndGgoMywgRml4
ZWQpKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZVdpbmNlOjphZGp1c3RTZWFyY2hGaWVsZFN0eWxl
KENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQq
IGUpIGNvbnN0Cit7CisgICAgLy8gT3ZlcnJpZGUgcGFkZGluZyBzaXplIHRvIG1hdGNoIEFwcEtp
dCB0ZXh0IHBvc2l0aW9uaW5nLgorICAgIGNvbnN0IGludCBwYWRkaW5nID0gMTsKKyAgICBzdHls
ZS0+c2V0UGFkZGluZ0xlZnQoTGVuZ3RoKHBhZGRpbmcsIEZpeGVkKSk7CisgICAgc3R5bGUtPnNl
dFBhZGRpbmdSaWdodChMZW5ndGgocGFkZGluZywgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0UGFk
ZGluZ1RvcChMZW5ndGgocGFkZGluZywgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0UGFkZGluZ0Jv
dHRvbShMZW5ndGgocGFkZGluZywgRml4ZWQpKTsKK30KKyNlbmRpZgorCitib29sIFJlbmRlclRo
ZW1lV2luY2U6OnBhaW50U2VhcmNoRmllbGQoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJP
YmplY3Q6OlBhaW50SW5mbyYgaSwgY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICByZXR1cm4gcGFp
bnRUZXh0RmllbGQobywgaSwgcik7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVXaW5jZTo6cGFpbnRT
ZWFyY2hGaWVsZENhbmNlbEJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVj
dDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgQ29sb3Ig
YnV0dG9uQ29sb3IgPSAoby0+bm9kZSgpICYmIG8tPm5vZGUoKS0+YWN0aXZlKCkpID8gQ29sb3Io
MTM4LCAxMzgsIDEzOCkgOiBDb2xvcigxODYsIDE4NiwgMTg2KTsKKworICAgIEludFNpemUgY2Fu
Y2VsU2l6ZSgxMCwgMTApOworICAgIEludFNpemUgY2FuY2VsUmFkaXVzKGNhbmNlbFNpemUud2lk
dGgoKSAvIDIsIGNhbmNlbFNpemUuaGVpZ2h0KCkgLyAyKTsKKyAgICBpbnQgeCA9IHIueCgpICsg
KHIud2lkdGgoKSAtIGNhbmNlbFNpemUud2lkdGgoKSkgLyAyOworICAgIGludCB5ID0gci55KCkg
KyAoci5oZWlnaHQoKSAtIGNhbmNlbFNpemUuaGVpZ2h0KCkpIC8gMiArIDE7CisgICAgSW50UmVj
dCBjYW5jZWxCb3VuZHMoSW50UG9pbnQoeCwgeSksIGNhbmNlbFNpemUpOworICAgIHBhaW50SW5m
by5jb250ZXh0LT5zYXZlKCk7CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPmFkZFJvdW5kZWRSZWN0
Q2xpcChjYW5jZWxCb3VuZHMsIGNhbmNlbFJhZGl1cywgY2FuY2VsUmFkaXVzLCBjYW5jZWxSYWRp
dXMsIGNhbmNlbFJhZGl1cyk7CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPmZpbGxSZWN0KGNhbmNl
bEJvdW5kcywgYnV0dG9uQ29sb3IsIERldmljZUNvbG9yU3BhY2UpOworCisgICAgLy8gRHJhdyB0
aGUgJ3gnCisgICAgSW50U2l6ZSB4U2l6ZSgzLCAzKTsKKyAgICBJbnRSZWN0IHhCb3VuZHMoY2Fu
Y2VsQm91bmRzLmxvY2F0aW9uKCkgKyBJbnRTaXplKDMsIDMpLCB4U2l6ZSk7CisgICAgcGFpbnRJ
bmZvLmNvbnRleHQtPnNldFN0cm9rZUNvbG9yKENvbG9yOjp3aGl0ZSwgRGV2aWNlQ29sb3JTcGFj
ZSk7CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPmRyYXdMaW5lKHhCb3VuZHMubG9jYXRpb24oKSwg
IHhCb3VuZHMubG9jYXRpb24oKSArIHhCb3VuZHMuc2l6ZSgpKTsKKyAgICBwYWludEluZm8uY29u
dGV4dC0+ZHJhd0xpbmUoSW50UG9pbnQoeEJvdW5kcy5yaWdodCgpLCB4Qm91bmRzLnkoKSksICBJ
bnRQb2ludCh4Qm91bmRzLngoKSwgeEJvdW5kcy5ib3R0b20oKSkpOworCisgICAgcGFpbnRJbmZv
LmNvbnRleHQtPnJlc3RvcmUoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUmVuZGVy
VGhlbWVXaW5jZTo6YWRqdXN0U2VhcmNoRmllbGRDYW5jZWxCdXR0b25TdHlsZShDU1NTdHlsZVNl
bGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlKSBjb25zdAor
eworICAgIEludFNpemUgY2FuY2VsU2l6ZSgxMywgMTEpOworICAgIHN0eWxlLT5zZXRXaWR0aChM
ZW5ndGgoY2FuY2VsU2l6ZS53aWR0aCgpLCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRIZWlnaHQo
TGVuZ3RoKGNhbmNlbFNpemUuaGVpZ2h0KCksIEZpeGVkKSk7Cit9CisKK3ZvaWQgUmVuZGVyVGhl
bWVXaW5jZTo6YWRqdXN0U2VhcmNoRmllbGREZWNvcmF0aW9uU3R5bGUoQ1NTU3R5bGVTZWxlY3Rv
ciogc2VsZWN0b3IsIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCogZSkgY29uc3QKK3sKKyAg
ICBJbnRTaXplIGVtcHR5U2l6ZSgxLCAxMSk7CisgICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChl
bXB0eVNpemUud2lkdGgoKSwgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0SGVpZ2h0KExlbmd0aChl
bXB0eVNpemUuaGVpZ2h0KCksIEZpeGVkKSk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVXaW5jZTo6
YWRqdXN0U2VhcmNoRmllbGRSZXN1bHRzRGVjb3JhdGlvblN0eWxlKENTU1N0eWxlU2VsZWN0b3Iq
IHNlbGVjdG9yLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0Cit7CisgICAg
SW50U2l6ZSBtYWduaWZpZXJTaXplKDE1LCAxMSk7CisgICAgc3R5bGUtPnNldFdpZHRoKExlbmd0
aChtYWduaWZpZXJTaXplLndpZHRoKCksIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldEhlaWdodChM
ZW5ndGgobWFnbmlmaWVyU2l6ZS5oZWlnaHQoKSwgRml4ZWQpKTsKK30KKworYm9vbCBSZW5kZXJU
aGVtZVdpbmNlOjpwYWludFNlYXJjaEZpZWxkUmVzdWx0c0RlY29yYXRpb24oUmVuZGVyT2JqZWN0
KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRS
ZWN0JiByKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIGZhbHNlOworfQor
Cit2b2lkIFJlbmRlclRoZW1lV2luY2U6OmFkanVzdFNlYXJjaEZpZWxkUmVzdWx0c0J1dHRvblN0
eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1l
bnQqIGUpIGNvbnN0Cit7CisgICAgSW50U2l6ZSBtYWduaWZpZXJTaXplKDE1LCAxMSk7CisgICAg
c3R5bGUtPnNldFdpZHRoKExlbmd0aChtYWduaWZpZXJTaXplLndpZHRoKCksIEZpeGVkKSk7Cisg
ICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgobWFnbmlmaWVyU2l6ZS5oZWlnaHQoKSwgRml4ZWQp
KTsKK30KKworYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludFNlYXJjaEZpZWxkUmVzdWx0c0J1
dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWlu
dEluZm8sIGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgcGFpbnRTZWFyY2hGaWVsZFJlc3VsdHNE
ZWNvcmF0aW9uKG8sIHBhaW50SW5mbywgcik7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lk
IFJlbmRlclRoZW1lV2luY2U6OmFkanVzdE1lbnVMaXN0QnV0dG9uU3R5bGUoQ1NTU3R5bGVTZWxl
Y3Rvciogc2VsZWN0b3IsIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCogZSkgY29uc3QKK3sK
KyAgICAvLyBUaGVzZSBhcmUgdGhlIHBhZGRpbmdzIG5lZWRlZCB0byBwbGFjZSB0aGUgdGV4dCBj
b3JyZWN0bHkgaW4gdGhlIDxzZWxlY3Q+IGJveAorICAgIGNvbnN0IGludCBkcm9wRG93bkJveFBh
ZGRpbmdUb3AgICAgPSAyOworICAgIGNvbnN0IGludCBkcm9wRG93bkJveFBhZGRpbmdSaWdodCAg
PSBzdHlsZS0+ZGlyZWN0aW9uKCkgPT0gTFRSID8gNCArIGRyb3BEb3duQnV0dG9uV2lkdGggOiA0
OworICAgIGNvbnN0IGludCBkcm9wRG93bkJveFBhZGRpbmdCb3R0b20gPSAyOworICAgIGNvbnN0
IGludCBkcm9wRG93bkJveFBhZGRpbmdMZWZ0ICAgPSBzdHlsZS0+ZGlyZWN0aW9uKCkgPT0gTFRS
ID8gNCA6IDQgKyBkcm9wRG93bkJ1dHRvbldpZHRoOworICAgIC8vIFRoZSA8c2VsZWN0PiBib3gg
bXVzdCBiZSBhdCBsZWFzdCAxMnB4IGhpZ2ggZm9yIHRoZSBidXR0b24gdG8gcmVuZGVyIG5pY2Vs
eSBvbiBXaW5kb3dzCisgICAgY29uc3QgaW50IGRyb3BEb3duQm94TWluSGVpZ2h0ID0gMTI7CisK
KyAgICAvLyBQb3NpdGlvbiB0aGUgdGV4dCBjb3JyZWN0bHkgd2l0aGluIHRoZSBzZWxlY3QgYm94
IGFuZCBtYWtlIHRoZSBib3ggd2lkZSBlbm91Z2ggdG8gZml0IHRoZSBkcm9wZG93biBidXR0b24K
KyAgICBzdHlsZS0+c2V0UGFkZGluZ1RvcChMZW5ndGgoZHJvcERvd25Cb3hQYWRkaW5nVG9wLCBG
aXhlZCkpOworICAgIHN0eWxlLT5zZXRQYWRkaW5nUmlnaHQoTGVuZ3RoKGRyb3BEb3duQm94UGFk
ZGluZ1JpZ2h0LCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRQYWRkaW5nQm90dG9tKExlbmd0aChk
cm9wRG93bkJveFBhZGRpbmdCb3R0b20sIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldFBhZGRpbmdM
ZWZ0KExlbmd0aChkcm9wRG93bkJveFBhZGRpbmdMZWZ0LCBGaXhlZCkpOworCisgICAgLy8gSGVp
Z2h0IGlzIGxvY2tlZCB0byBhdXRvCisgICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgoQXV0bykp
OworCisgICAgLy8gQ2FsY3VsYXRlIG91ciBtaW4taGVpZ2h0CisgICAgaW50IG1pbkhlaWdodCA9
IHN0eWxlLT5mb250KCkuaGVpZ2h0KCk7CisgICAgbWluSGVpZ2h0ID0gbWF4KG1pbkhlaWdodCwg
ZHJvcERvd25Cb3hNaW5IZWlnaHQpOworCisgICAgc3R5bGUtPnNldE1pbkhlaWdodChMZW5ndGgo
bWluSGVpZ2h0LCBGaXhlZCkpOworCisgICAgLy8gV2hpdGUtc3BhY2UgaXMgbG9ja2VkIHRvIHBy
ZQorICAgIHN0eWxlLT5zZXRXaGl0ZVNwYWNlKFBSRSk7CisKKyAgICBEV09SRCBjb2xvck1lbnUg
PSBHZXRTeXNDb2xvcihDT0xPUl9NRU5VKTsKKyAgICBEV09SRCBjb2xvck1lbnVUZXh0ID0gR2V0
U3lzQ29sb3IoQ09MT1JfTUVOVVRFWFQpOworICAgIENvbG9yIGJnQ29sb3IoR2V0UlZhbHVlKGNv
bG9yTWVudSksIEdldEdWYWx1ZShjb2xvck1lbnUpLCBHZXRCVmFsdWUoY29sb3JNZW51KSwgMjU1
KTsKKyAgICBDb2xvciB0ZXh0Q29sb3IoR2V0UlZhbHVlKGNvbG9yTWVudVRleHQpLCBHZXRHVmFs
dWUoY29sb3JNZW51VGV4dCksIEdldEJWYWx1ZShjb2xvck1lbnVUZXh0KSwgMjU1KTsKKyAgICBp
ZiAoYmdDb2xvciA9PSB0ZXh0Q29sb3IpCisgICAgICAgIHRleHRDb2xvci5zZXRSR0IoKH5iZ0Nv
bG9yLnJnYigpKSB8IDB4RkYwMDAwMDApOworICAgIHN0eWxlLT5jbGVhckJhY2tncm91bmRMYXll
cnMoKTsKKyAgICBzdHlsZS0+YWNjZXNzQmFja2dyb3VuZExheWVycygpLT5zZXRDbGlwKENvbnRl
bnRGaWxsQm94KTsKKyAgICBzdHlsZS0+c2V0QmFja2dyb3VuZENvbG9yKGJnQ29sb3IpOworICAg
IHN0eWxlLT5zZXRDb2xvcih0ZXh0Q29sb3IpOworfQorCisjaWYgRU5BQkxFKFZJREVPKQorLy8g
QXR0ZW1wdCB0byByZXRyaWV2ZSBhIEhUTUxNZWRpYUVsZW1lbnQgZnJvbSBhIE5vZGUuIFJldHVy
bnMgMCBpZiBvbmUgY2Fubm90IGJlIGZvdW5kLgorc3RhdGljIEhUTUxNZWRpYUVsZW1lbnQqIG1l
ZGlhRWxlbWVudFBhcmVudChOb2RlKiBub2RlKQoreworICAgIGlmICghbm9kZSkKKyAgICAgICAg
cmV0dXJuIDA7CisgICAgTm9kZSogbWVkaWFOb2RlID0gbm9kZS0+c2hhZG93QW5jZXN0b3JOb2Rl
KCk7CisgICAgaWYgKCFtZWRpYU5vZGUgfHwgKCFtZWRpYU5vZGUtPmhhc1RhZ05hbWUoSFRNTE5h
bWVzOjp2aWRlb1RhZykgJiYgIW1lZGlhTm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmF1ZGlv
VGFnKSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxN
ZWRpYUVsZW1lbnQqPihtZWRpYU5vZGUpOworfQorI2VuZGlmCisKK2Jvb2wgUmVuZGVyVGhlbWVX
aW5jZTo6cGFpbnRTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVj
dDo6UGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByKQoreworICAgIGJvb2wgcmMgPSBSZW5k
ZXJUaGVtZTo6cGFpbnRTbGlkZXJUcmFjayhvLCBpLCByKTsKKyAgICBJbnRQb2ludCBsZWZ0ID0g
SW50UG9pbnQoci54KCkgKyAyLCAoci55KCkgKyByLmJvdHRvbSgpKSAvIDIpOworICAgIGkuY29u
dGV4dC0+c2F2ZSgpOworICAgIGkuY29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoQ29sb3I6OmdyYXks
IERldmljZUNvbG9yU3BhY2UpOworICAgIGkuY29udGV4dC0+c2V0RmlsbENvbG9yKENvbG9yOjpn
cmF5LCBEZXZpY2VDb2xvclNwYWNlKTsKKyAgICBpLmNvbnRleHQtPmZpbGxSZWN0KHIpOworI2lm
IEVOQUJMRShWSURFTykKKyAgICBIVE1MTWVkaWFFbGVtZW50KiBtZWRpYUVsZW1lbnQgPSBtZWRp
YUVsZW1lbnRQYXJlbnQoby0+bm9kZSgpKTsKKyAgICBpZiAobWVkaWFFbGVtZW50KSB7CisgICAg
ICAgIGkuY29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoQ29sb3IoMCwgMHhmZiwgMCkpOworICAgICAg
ICBJbnRQb2ludCByaWdodCA9IEludFBvaW50KGxlZnQueCgpICsgbWVkaWFFbGVtZW50LT5wZXJj
ZW50TG9hZGVkKCkgKiAoci5yaWdodCgpIC0gci54KCkgLSA0KSwgKHIueSgpICsgci5ib3R0b20o
KSkgLyAyKTsKKyAgICAgICAgaS5jb250ZXh0LT5kcmF3TGluZShsZWZ0LCByaWdodCk7CisgICAg
ICAgIGxlZnQgPSByaWdodDsKKyAgICB9CisjZW5kaWYKKyAgICBpLmNvbnRleHQtPnNldFN0cm9r
ZUNvbG9yKENvbG9yOjpibGFjaywgRGV2aWNlQ29sb3JTcGFjZSk7CisgICAgaS5jb250ZXh0LT5k
cmF3TGluZShsZWZ0LCBJbnRQb2ludChyLnJpZ2h0KCkgLSAyLCBsZWZ0LnkoKSkpOworICAgIGku
Y29udGV4dC0+cmVzdG9yZSgpOworICAgIHJldHVybiByYzsKK30KKworYm9vbCBSZW5kZXJUaGVt
ZVdpbmNlOjpwYWludFNsaWRlclRodW1iKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mIGksIGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgYm9vbCByYyA9IFJl
bmRlclRoZW1lOjpwYWludFNsaWRlclRodW1iKG8sIGksIHIpOworICAgIGkuY29udGV4dC0+c2F2
ZSgpOworICAgIGkuY29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoQ29sb3I6OmJsYWNrLCBEZXZpY2VD
b2xvclNwYWNlKTsKKyAgICBpLmNvbnRleHQtPnNldEZpbGxDb2xvcihDb2xvcjo6YmxhY2ssIERl
dmljZUNvbG9yU3BhY2UpOworI2lmIEVOQUJMRShWSURFTykKKyAgICBIVE1MTWVkaWFFbGVtZW50
KiBtZWRpYUVsZW1lbnQgPSBtZWRpYUVsZW1lbnRQYXJlbnQoby0+bm9kZSgpKTsKKyAgICBpZiAo
bWVkaWFFbGVtZW50KSB7CisgICAgICAgIGZsb2F0IHB0ID0gKG1lZGlhRWxlbWVudC0+Y3VycmVu
dFRpbWUoKSAtIG1lZGlhRWxlbWVudC0+c3RhcnRUaW1lKCkpIC8gbWVkaWFFbGVtZW50LT5kdXJh
dGlvbigpOworICAgICAgICBGbG9hdFJlY3QgaW50UmVjdCA9IHI7CisgICAgICAgIGludFJlY3Qu
c2V0WChpbnRSZWN0LngoKSArIGludFJlY3Qud2lkdGgoKSAqIHB0IC0gMik7CisgICAgICAgIGlu
dFJlY3Quc2V0V2lkdGgoNSk7CisgICAgICAgIGkuY29udGV4dC0+ZmlsbFJlY3QoaW50UmVjdCk7
CisgICAgfQorI2VuZGlmCisgICAgaS5jb250ZXh0LT5yZXN0b3JlKCk7CisgICAgcmV0dXJuIHJj
OworfQorCitpbnQgUmVuZGVyVGhlbWVXaW5jZTo6YnV0dG9uSW50ZXJuYWxQYWRkaW5nTGVmdCgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIDM7Cit9CisKK2ludCBSZW5kZXJUaGVtZVdpbmNlOjpidXR0
b25JbnRlcm5hbFBhZGRpbmdSaWdodCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIDM7Cit9CisKK2lu
dCBSZW5kZXJUaGVtZVdpbmNlOjpidXR0b25JbnRlcm5hbFBhZGRpbmdUb3AoKSBjb25zdAorewor
ICAgIHJldHVybiAxOworfQorCitpbnQgUmVuZGVyVGhlbWVXaW5jZTo6YnV0dG9uSW50ZXJuYWxQ
YWRkaW5nQm90dG9tKCkgY29uc3QKK3sKKyAgICByZXR1cm4gMTsKK30KKwordm9pZCBSZW5kZXJU
aGVtZVdpbmNlOjphZGp1c3RTZWFyY2hGaWVsZFN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVj
dG9yLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0Cit7CisgICAgY29uc3Qg
aW50IHBhZGRpbmcgPSAxOworICAgIHN0eWxlLT5zZXRQYWRkaW5nTGVmdChMZW5ndGgocGFkZGlu
ZywgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0UGFkZGluZ1JpZ2h0KExlbmd0aChwYWRkaW5nLCBG
aXhlZCkpOworICAgIHN0eWxlLT5zZXRQYWRkaW5nVG9wKExlbmd0aChwYWRkaW5nLCBGaXhlZCkp
OworICAgIHN0eWxlLT5zZXRQYWRkaW5nQm90dG9tKExlbmd0aChwYWRkaW5nLCBGaXhlZCkpOwor
fQorCisjaWYgRU5BQkxFKFZJREVPKQorCitib29sIFJlbmRlclRoZW1lV2luY2U6OnBhaW50TWVk
aWFGdWxsc2NyZWVuQnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQ
YWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBib29sIHJjID0g
cGFpbnRCdXR0b24obywgcGFpbnRJbmZvLCByKTsKKyAgICBGbG9hdFJlY3QgaW1SZWN0ID0gcjsK
KyAgICBpbVJlY3QuaW5mbGF0ZSgtMik7CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNhdmUoKTsK
KyAgICBwYWludEluZm8uY29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoQ29sb3I6OmJsYWNrKTsKKyAg
ICBwYWludEluZm8uY29udGV4dC0+c2V0RmlsbENvbG9yKENvbG9yOjpncmF5KTsKKyAgICBwYWlu
dEluZm8uY29udGV4dC0+ZmlsbFJlY3QoaW1SZWN0KTsKKyAgICBwYWludEluZm8uY29udGV4dC0+
cmVzdG9yZSgpOworICAgIHJldHVybiByYzsKK30KKworYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpw
YWludE1lZGlhTXV0ZUJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6
UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgYm9vbCByYyA9
IHBhaW50QnV0dG9uKG8sIHBhaW50SW5mbywgcik7CisgICAgSFRNTE1lZGlhRWxlbWVudCogbWVk
aWFFbGVtZW50ID0gbWVkaWFFbGVtZW50UGFyZW50KG8tPm5vZGUoKSk7CisgICAgYm9vbCBtdXRl
ZCA9ICFtZWRpYUVsZW1lbnQgfHwgbWVkaWFFbGVtZW50LT5tdXRlZCgpOworICAgIEZsb2F0UmVj
dCBpbVJlY3QgPSByOworICAgIGltUmVjdC5pbmZsYXRlKC0yKTsKKyAgICBwYWludEluZm8uY29u
dGV4dC0+c2F2ZSgpOworICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRTdHJva2VDb2xvcihDb2xv
cjo6YmxhY2spOworICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRGaWxsQ29sb3IoQ29sb3I6OmJs
YWNrKTsKKyAgICBGbG9hdFBvaW50IHB0c1s2XSA9IHsKKyAgICAgICAgRmxvYXRQb2ludChpbVJl
Y3QueCgpICsgMSwgaW1SZWN0LnkoKSArIGltUmVjdC5oZWlnaHQoKSAvIDMuMCksCisgICAgICAg
IEZsb2F0UG9pbnQoaW1SZWN0LngoKSArIDEgKyBpbVJlY3Qud2lkdGgoKSAvIDIuMCwgaW1SZWN0
LnkoKSArIGltUmVjdC5oZWlnaHQoKSAvIDMuMCksCisgICAgICAgIEZsb2F0UG9pbnQoaW1SZWN0
LnJpZ2h0KCkgLSAxLCBpbVJlY3QueSgpKSwKKyAgICAgICAgRmxvYXRQb2ludChpbVJlY3Qucmln
aHQoKSAtIDEsIGltUmVjdC5ib3R0b20oKSksCisgICAgICAgIEZsb2F0UG9pbnQoaW1SZWN0Lngo
KSArIDEgKyBpbVJlY3Qud2lkdGgoKSAvIDIuMCwgaW1SZWN0LnkoKSArIDIuMCAqIGltUmVjdC5o
ZWlnaHQoKSAvIDMuMCksCisgICAgICAgIEZsb2F0UG9pbnQoaW1SZWN0LngoKSArIDEsIGltUmVj
dC55KCkgKyAyLjAgKiBpbVJlY3QuaGVpZ2h0KCkgLyAzLjApCisgICAgfTsKKyAgICBwYWludElu
Zm8uY29udGV4dC0+ZHJhd0NvbnZleFBvbHlnb24oNiwgcHRzKTsKKyAgICBpZiAobXV0ZWQpCisg
ICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5kcmF3TGluZShJbnRQb2ludChpbVJlY3QucmlnaHQo
KSwgaW1SZWN0LnkoKSksIEludFBvaW50KGltUmVjdC54KCksIGltUmVjdC5ib3R0b20oKSkpOwor
ICAgIHBhaW50SW5mby5jb250ZXh0LT5yZXN0b3JlKCk7CisgICAgcmV0dXJuIHJjOworfQorCiti
b29sIFJlbmRlclRoZW1lV2luY2U6OnBhaW50TWVkaWFQbGF5QnV0dG9uKFJlbmRlck9iamVjdCog
bywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVj
dCYgcikKK3sKKyAgICBib29sIHJjID0gcGFpbnRCdXR0b24obywgcGFpbnRJbmZvLCByKTsKKyAg
ICBGbG9hdFJlY3QgaW1SZWN0ID0gcjsKKyAgICBpbVJlY3QuaW5mbGF0ZSgtMyk7CisgICAgcGFp
bnRJbmZvLmNvbnRleHQtPnNhdmUoKTsKKyAgICBwYWludEluZm8uY29udGV4dC0+c2V0U3Ryb2tl
Q29sb3IoQ29sb3I6OmJsYWNrKTsKKyAgICBwYWludEluZm8uY29udGV4dC0+c2V0RmlsbENvbG9y
KENvbG9yOjpibGFjayk7CisgICAgSFRNTE1lZGlhRWxlbWVudCogbWVkaWFFbGVtZW50ID0gbWVk
aWFFbGVtZW50UGFyZW50KG8tPm5vZGUoKSk7CisgICAgYm9vbCBwYXVzZWQgPSAhbWVkaWFFbGVt
ZW50IHx8IG1lZGlhRWxlbWVudC0+cGF1c2VkKCk7CisgICAgaWYgKHBhdXNlZCkgeworICAgICAg
ICBmbG9hdCB3aWR0aCA9IGltUmVjdC53aWR0aCgpOworICAgICAgICBpbVJlY3Quc2V0V2lkdGgo
d2lkdGggLyAzLjApOworICAgICAgICBwYWludEluZm8uY29udGV4dC0+ZmlsbFJlY3QoaW1SZWN0
KTsKKyAgICAgICAgaW1SZWN0Lm1vdmUoMi4wICogd2lkdGggLyAzLjAsIDApOworICAgICAgICBw
YWludEluZm8uY29udGV4dC0+ZmlsbFJlY3QoaW1SZWN0KTsKKyAgICB9IGVsc2UgeworICAgICAg
ICBGbG9hdFBvaW50IHB0c1szXSA9IHsgRmxvYXRQb2ludChpbVJlY3QueCgpLCBpbVJlY3QueSgp
KSwgRmxvYXRQb2ludChpbVJlY3QucmlnaHQoKSwgKGltUmVjdC55KCkgKyBpbVJlY3QuYm90dG9t
KCkpIC8gMi4wKSwgRmxvYXRQb2ludChpbVJlY3QueCgpLCBpbVJlY3QuYm90dG9tKCkpIH07Cisg
ICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5kcmF3Q29udmV4UG9seWdvbigzLCBwdHMpOworICAg
IH0KKyAgICBwYWludEluZm8uY29udGV4dC0+cmVzdG9yZSgpOworICAgIHJldHVybiByYzsKK30K
KworYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludE1lZGlhU2Vla0JhY2tCdXR0b24oUmVuZGVy
T2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25z
dCBJbnRSZWN0JiByKQoreworICAgIGJvb2wgcmMgPSBwYWludEJ1dHRvbihvLCBwYWludEluZm8s
IHIpOworICAgIEZsb2F0UmVjdCBpbVJlY3QgPSByOworICAgIGltUmVjdC5pbmZsYXRlKC0zKTsK
KyAgICBGbG9hdFBvaW50IHB0c1szXSA9IHsgRmxvYXRQb2ludCgoaW1SZWN0LngoKSArIGltUmVj
dC5yaWdodCgpKSAvIDIuMCwgaW1SZWN0LnkoKSksIEZsb2F0UG9pbnQoaW1SZWN0LngoKSwgKGlt
UmVjdC55KCkgKyBpbVJlY3QuYm90dG9tKCkpIC8gMi4wKSwgRmxvYXRQb2ludCgoaW1SZWN0Lngo
KSArIGltUmVjdC5yaWdodCgpKSAvIDIuMCwgaW1SZWN0LmJvdHRvbSgpKSB9OworICAgIEZsb2F0
UG9pbnQgcHRzMlszXSA9IHsgRmxvYXRQb2ludChpbVJlY3QucmlnaHQoKSwgaW1SZWN0LnkoKSks
IEZsb2F0UG9pbnQoKGltUmVjdC54KCkgKyBpbVJlY3QucmlnaHQoKSkgLyAyLjAsIChpbVJlY3Qu
eSgpICsgaW1SZWN0LmJvdHRvbSgpKSAvIDIuMCksIEZsb2F0UG9pbnQoaW1SZWN0LnJpZ2h0KCks
IGltUmVjdC5ib3R0b20oKSkgfTsKKyAgICBwYWludEluZm8uY29udGV4dC0+c2F2ZSgpOworICAg
IHBhaW50SW5mby5jb250ZXh0LT5zZXRTdHJva2VDb2xvcihDb2xvcjo6YmxhY2spOworICAgIHBh
aW50SW5mby5jb250ZXh0LT5zZXRGaWxsQ29sb3IoQ29sb3I6OmJsYWNrKTsKKyAgICBwYWludElu
Zm8uY29udGV4dC0+ZHJhd0NvbnZleFBvbHlnb24oMywgcHRzKTsKKyAgICBwYWludEluZm8uY29u
dGV4dC0+ZHJhd0NvbnZleFBvbHlnb24oMywgcHRzMik7CisgICAgcGFpbnRJbmZvLmNvbnRleHQt
PnJlc3RvcmUoKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVXaW5jZTo6
cGFpbnRNZWRpYVNlZWtGb3J3YXJkQnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVy
T2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBi
b29sIHJjID0gcGFpbnRCdXR0b24obywgcGFpbnRJbmZvLCByKTsKKyAgICBGbG9hdFJlY3QgaW1S
ZWN0ID0gcjsKKyAgICBpbVJlY3QuaW5mbGF0ZSgtMyk7CisgICAgRmxvYXRQb2ludCBwdHNbM10g
PSB7IEZsb2F0UG9pbnQoaW1SZWN0LngoKSwgaW1SZWN0LnkoKSksIEZsb2F0UG9pbnQoKGltUmVj
dC54KCkgKyBpbVJlY3QucmlnaHQoKSkgLyAyLjAsIChpbVJlY3QueSgpICsgaW1SZWN0LmJvdHRv
bSgpKSAvIDIuMCksIEZsb2F0UG9pbnQoaW1SZWN0LngoKSwgaW1SZWN0LmJvdHRvbSgpKSB9Owor
ICAgIEZsb2F0UG9pbnQgcHRzMlszXSA9IHsgRmxvYXRQb2ludCgoaW1SZWN0LngoKSArIGltUmVj
dC5yaWdodCgpKSAvIDIuMCwgaW1SZWN0LnkoKSksIEZsb2F0UG9pbnQoaW1SZWN0LnJpZ2h0KCks
IChpbVJlY3QueSgpICsgaW1SZWN0LmJvdHRvbSgpKSAvIDIuMCksIEZsb2F0UG9pbnQoKGltUmVj
dC54KCkgKyBpbVJlY3QucmlnaHQoKSkgLyAyLjAsIGltUmVjdC5ib3R0b20oKSkgfTsKKyAgICBw
YWludEluZm8uY29udGV4dC0+c2F2ZSgpOworICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRTdHJv
a2VDb2xvcihDb2xvcjo6YmxhY2spOworICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRGaWxsQ29s
b3IoQ29sb3I6OmJsYWNrKTsKKyAgICBwYWludEluZm8uY29udGV4dC0+ZHJhd0NvbnZleFBvbHln
b24oMywgcHRzKTsKKyAgICBwYWludEluZm8uY29udGV4dC0+ZHJhd0NvbnZleFBvbHlnb24oMywg
cHRzMik7CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnJlc3RvcmUoKTsKKyAgICByZXR1cm4gcmM7
Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVXaW5jZTo6cGFpbnRNZWRpYVNsaWRlclRyYWNrKFJlbmRl
ck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgY29u
c3QgSW50UmVjdCYgcikKK3sKKyAgICByZXR1cm4gcGFpbnRTbGlkZXJUcmFjayhvLCBwYWludElu
Zm8sIHIpOworfQorCitib29sIFJlbmRlclRoZW1lV2luY2U6OnBhaW50TWVkaWFTbGlkZXJUaHVt
YihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludElu
Zm8sIGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgcmV0dXJuIHBhaW50U2xpZGVyVGh1bWIobywg
cGFpbnRJbmZvLCByKTsKK30KKyNlbmRpZgorCit9CisKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlclRoZW1lV2luQ0UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlclRoZW1lV2luQ0UuY3BwCShyZXZpc2lvbiA1NzI4OSkKKysrIFdlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlclRoZW1lV2luQ0UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMiw3ICsyMiw3IEBACiAg
Ki8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlJlbmRlclRoZW1lV2luY2UuaCIK
KyNpbmNsdWRlICJSZW5kZXJUaGVtZVdpbkNFLmgiCiAKICNpbmNsdWRlICJDU1NTdHlsZVNoZWV0
LmgiCiAjaW5jbHVkZSAiQ1NTVmFsdWVLZXl3b3Jkcy5oIgpAQCAtODMsNDkgKzgzLDQ5IEBAIG5h
bWVzcGFjZSBXZWJDb3JlIHsKIHN0YXRpYyBjb25zdCBpbnQgZHJvcERvd25CdXR0b25XaWR0aCA9
IDE3Owogc3RhdGljIGNvbnN0IGludCB0cmFja1dpZHRoID0gNDsKIAotUGFzc1JlZlB0cjxSZW5k
ZXJUaGVtZT4gUmVuZGVyVGhlbWVXaW5jZTo6Y3JlYXRlKCkKK1Bhc3NSZWZQdHI8UmVuZGVyVGhl
bWU+IFJlbmRlclRoZW1lV2luQ0U6OmNyZWF0ZSgpCiB7Ci0gICAgcmV0dXJuIGFkb3B0UmVmKG5l
dyBSZW5kZXJUaGVtZVdpbmNlKTsKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IFJlbmRlclRoZW1l
V2luQ0UpOwogfQogCiBQYXNzUmVmUHRyPFJlbmRlclRoZW1lPiBSZW5kZXJUaGVtZTo6dGhlbWVG
b3JQYWdlKFBhZ2UqIHBhZ2UpCiB7Ci0gICAgc3RhdGljIFJlbmRlclRoZW1lKiB3aW5jZVRoZW1l
ID0gUmVuZGVyVGhlbWVXaW5jZTo6Y3JlYXRlKCkucmVsZWFzZVJlZigpOworICAgIHN0YXRpYyBS
ZW5kZXJUaGVtZSogd2luY2VUaGVtZSA9IFJlbmRlclRoZW1lV2luQ0U6OmNyZWF0ZSgpLnJlbGVh
c2VSZWYoKTsKICAgICByZXR1cm4gd2luY2VUaGVtZTsKIH0KIAotUmVuZGVyVGhlbWVXaW5jZTo6
UmVuZGVyVGhlbWVXaW5jZSgpCitSZW5kZXJUaGVtZVdpbkNFOjpSZW5kZXJUaGVtZVdpbkNFKCkK
IHsKIH0KIAotUmVuZGVyVGhlbWVXaW5jZTo6flJlbmRlclRoZW1lV2luY2UoKQorUmVuZGVyVGhl
bWVXaW5DRTo6flJlbmRlclRoZW1lV2luQ0UoKQogewogfQogCi1Db2xvciBSZW5kZXJUaGVtZVdp
bmNlOjpwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0CitDb2xv
ciBSZW5kZXJUaGVtZVdpbkNFOjpwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xv
cigpIGNvbnN0CiB7CiAgICAgQ09MT1JSRUYgY29sb3IgPSBHZXRTeXNDb2xvcihDT0xPUl9ISUdI
TElHSFQpOwogICAgIHJldHVybiBDb2xvcihHZXRSVmFsdWUoY29sb3IpLCBHZXRHVmFsdWUoY29s
b3IpLCBHZXRCVmFsdWUoY29sb3IpLCAyNTUpOwogfQogCi1Db2xvciBSZW5kZXJUaGVtZVdpbmNl
OjpwbGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QKK0NvbG9y
IFJlbmRlclRoZW1lV2luQ0U6OnBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29s
b3IoKSBjb25zdAogewogICAgIENPTE9SUkVGIGNvbG9yID0gR2V0U3lzQ29sb3IoQ09MT1JfR1JB
WVRFWFQpOwogICAgIHJldHVybiBDb2xvcihHZXRSVmFsdWUoY29sb3IpLCBHZXRHVmFsdWUoY29s
b3IpLCBHZXRCVmFsdWUoY29sb3IpLCAyNTUpOwogfQogCi1Db2xvciBSZW5kZXJUaGVtZVdpbmNl
OjpwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0CitDb2xvciBS
ZW5kZXJUaGVtZVdpbkNFOjpwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigp
IGNvbnN0CiB7CiAgICAgQ09MT1JSRUYgY29sb3IgPSBHZXRTeXNDb2xvcihDT0xPUl9ISUdITElH
SFRURVhUKTsKICAgICByZXR1cm4gQ29sb3IoR2V0UlZhbHVlKGNvbG9yKSwgR2V0R1ZhbHVlKGNv
bG9yKSwgR2V0QlZhbHVlKGNvbG9yKSwgMjU1KTsKIH0KIAotQ29sb3IgUmVuZGVyVGhlbWVXaW5j
ZTo6cGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0CitDb2xv
ciBSZW5kZXJUaGVtZVdpbkNFOjpwbGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uRm9yZWdyb3VuZENv
bG9yKCkgY29uc3QKIHsKICAgICByZXR1cm4gQ29sb3I6OndoaXRlOwogfQogCi1ib29sIFJlbmRl
clRoZW1lV2luY2U6OnN1cHBvcnRzRm9jdXMoQ29udHJvbFBhcnQgYXBwZWFyYW5jZSkgY29uc3QK
K2Jvb2wgUmVuZGVyVGhlbWVXaW5DRTo6c3VwcG9ydHNGb2N1cyhDb250cm9sUGFydCBhcHBlYXJh
bmNlKSBjb25zdAogewogICAgIHN3aXRjaCAoYXBwZWFyYW5jZSkgewogICAgIGNhc2UgUHVzaEJ1
dHRvblBhcnQ6CkBAIC0xNDAsMTIgKzE0MCwxMiBAQCBib29sIFJlbmRlclRoZW1lV2luY2U6OnN1
cHBvcnRzRm9jdXMoQ29uCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIFJlbmRlclRoZW1l
V2luY2U6OnN1cHBvcnRzRm9jdXNSaW5nKGNvbnN0IFJlbmRlclN0eWxlICpzdHlsZSkgY29uc3QK
K2Jvb2wgUmVuZGVyVGhlbWVXaW5DRTo6c3VwcG9ydHNGb2N1c1JpbmcoY29uc3QgUmVuZGVyU3R5
bGUgKnN0eWxlKSBjb25zdAogewogICAgIHJldHVybiBzdXBwb3J0c0ZvY3VzKHN0eWxlLT5hcHBl
YXJhbmNlKCkpOwogfQogCi11bnNpZ25lZCBSZW5kZXJUaGVtZVdpbmNlOjpkZXRlcm1pbmVDbGFz
c2ljU3RhdGUoUmVuZGVyT2JqZWN0KiBvKQordW5zaWduZWQgUmVuZGVyVGhlbWVXaW5DRTo6ZGV0
ZXJtaW5lQ2xhc3NpY1N0YXRlKFJlbmRlck9iamVjdCogbykKIHsKICAgICB1bnNpZ25lZCByZXN1
bHQgPSAwOwogICAgIGlmICghaXNFbmFibGVkKG8pIHx8IGlzUmVhZE9ubHlDb250cm9sKG8pKQpA
QCAtMTU4LDcgKzE1OCw3IEBAIHVuc2lnbmVkIFJlbmRlclRoZW1lV2luY2U6OmRldGVybWluZUNs
YXMKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1UaGVtZURhdGEgUmVuZGVyVGhlbWVXaW5jZTo6
Z2V0VGhlbWVEYXRhKFJlbmRlck9iamVjdCogbykKK1RoZW1lRGF0YSBSZW5kZXJUaGVtZVdpbkNF
OjpnZXRUaGVtZURhdGEoUmVuZGVyT2JqZWN0KiBvKQogewogICAgIFRoZW1lRGF0YSByZXN1bHQ7
CiAgICAgc3dpdGNoIChvLT5zdHlsZSgpLT5hcHBlYXJhbmNlKCkpIHsKQEAgLTE4OCw3ICsxODgs
NyBAQCBUaGVtZURhdGEgUmVuZGVyVGhlbWVXaW5jZTo6Z2V0VGhlbWVEYXRhCiAgICAgcmV0dXJu
IHJlc3VsdDsKIH0KIAotYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludEJ1dHRvbihSZW5kZXJP
YmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0
JiByKQorYm9vbCBSZW5kZXJUaGVtZVdpbkNFOjpwYWludEJ1dHRvbihSZW5kZXJPYmplY3QqIG8s
IGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByKQogewog
ICAgIC8vIEdldCB0aGUgY29ycmVjdCB0aGVtZSBkYXRhIGZvciBhIGJ1dHRvbgogICAgIFRoZW1l
RGF0YSB0aGVtZURhdGEgPSBnZXRUaGVtZURhdGEobyk7CkBAIC0yMDcsNyArMjA3LDcgQEAgYm9v
bCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludEJ1dHRvbihSZW5kZQogICAgIHJldHVybiBmYWxzZTsK
IH0KIAotdm9pZCBSZW5kZXJUaGVtZVdpbmNlOjpzZXRDaGVja2JveFNpemUoUmVuZGVyU3R5bGUq
IHN0eWxlKSBjb25zdAordm9pZCBSZW5kZXJUaGVtZVdpbkNFOjpzZXRDaGVja2JveFNpemUoUmVu
ZGVyU3R5bGUqIHN0eWxlKSBjb25zdAogewogICAgIC8vIElmIHRoZSB3aWR0aCBhbmQgaGVpZ2h0
IGFyZSBib3RoIHNwZWNpZmllZCwgdGhlbiB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8uCiAgICAgaWYg
KCFzdHlsZS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpICYmICFzdHlsZS0+aGVpZ2h0KCku
aXNBdXRvKCkpCkBAIC0yMjMsNyArMjIzLDcgQEAgdm9pZCBSZW5kZXJUaGVtZVdpbmNlOjpzZXRD
aGVja2JveFNpemUoUgogICAgICAgICBzdHlsZS0+c2V0SGVpZ2h0KExlbmd0aCgxMywgRml4ZWQp
KTsKIH0KIAotYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludFRleHRGaWVsZChSZW5kZXJPYmpl
Y3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiBy
KQorYm9vbCBSZW5kZXJUaGVtZVdpbkNFOjpwYWludFRleHRGaWVsZChSZW5kZXJPYmplY3QqIG8s
IGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByKQogewog
ICAgIC8vIEdldCB0aGUgY29ycmVjdCB0aGVtZSBkYXRhIGZvciBhIHRleHRmaWVsZAogICAgIFRo
ZW1lRGF0YSB0aGVtZURhdGEgPSBnZXRUaGVtZURhdGEobyk7CkBAIC0yMzQsMjAgKzIzNCwyMCBA
QCBib29sIFJlbmRlclRoZW1lV2luY2U6OnBhaW50VGV4dEZpZWxkKFJlCiAgICAgcmV0dXJuIGZh
bHNlOwogfQogCi12b2lkIFJlbmRlclRoZW1lV2luY2U6OmFkanVzdE1lbnVMaXN0U3R5bGUoQ1NT
U3R5bGVTZWxlY3Rvciogc2VsZWN0b3IsIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCogZSkg
Y29uc3QKK3ZvaWQgUmVuZGVyVGhlbWVXaW5DRTo6YWRqdXN0TWVudUxpc3RTdHlsZShDU1NTdHls
ZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlKSBjb25z
dAogewogICAgIHN0eWxlLT5yZXNldEJvcmRlcigpOwogICAgIGFkanVzdE1lbnVMaXN0QnV0dG9u
U3R5bGUoc2VsZWN0b3IsIHN0eWxlLCBlKTsKIH0KIAotYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpw
YWludE1lbnVMaXN0KFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludElu
Zm8mIGksIGNvbnN0IEludFJlY3QmIHIpCitib29sIFJlbmRlclRoZW1lV2luQ0U6OnBhaW50TWVu
dUxpc3QoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgaSwg
Y29uc3QgSW50UmVjdCYgcikKIHsKICAgICBwYWludFRleHRGaWVsZChvLCBpLCByKTsKICAgICBw
YWludE1lbnVMaXN0QnV0dG9uKG8sIGksIHIpOwogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29s
IFJlbmRlclRoZW1lV2luY2U6OnBhaW50TWVudUxpc3RCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBj
b25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgaSwgY29uc3QgSW50UmVjdCYgcikKK2Jvb2wg
UmVuZGVyVGhlbWVXaW5DRTo6cGFpbnRNZW51TGlzdEJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNv
bnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByKQogewogICAg
IEludFJlY3QgYnV0dG9uUmVjdChyLnJpZ2h0KCkgLSBkcm9wRG93bkJ1dHRvbldpZHRoIC0gMSwg
ci55KCksIGRyb3BEb3duQnV0dG9uV2lkdGgsIHIuaGVpZ2h0KCkpOwogICAgIGJ1dHRvblJlY3Qu
aW5mbGF0ZVkoLTEpOwpAQCAtMjU1LDI4ICsyNTUsMjggQEAgYm9vbCBSZW5kZXJUaGVtZVdpbmNl
OjpwYWludE1lbnVMaXN0QnV0dAogICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIFJlbmRlclRo
ZW1lV2luY2U6OnN5c3RlbUZvbnQoaW50IHByb3BJZCwgRm9udERlc2NyaXB0aW9uJiBmb250RGVz
Y3JpcHRpb24pIGNvbnN0Cit2b2lkIFJlbmRlclRoZW1lV2luQ0U6OnN5c3RlbUZvbnQoaW50IHBy
b3BJZCwgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIGNvbnN0CiB7CiAgICAgbm90
SW1wbGVtZW50ZWQoKTsKIH0KIAotdm9pZCBSZW5kZXJUaGVtZVdpbmNlOjp0aGVtZUNoYW5nZWQo
KQordm9pZCBSZW5kZXJUaGVtZVdpbkNFOjp0aGVtZUNoYW5nZWQoKQogewogfQogCi1TdHJpbmcg
UmVuZGVyVGhlbWVXaW5jZTo6ZXh0cmFEZWZhdWx0U3R5bGVTaGVldCgpCitTdHJpbmcgUmVuZGVy
VGhlbWVXaW5DRTo6ZXh0cmFEZWZhdWx0U3R5bGVTaGVldCgpCiB7CiAgICAgbm90SW1wbGVtZW50
ZWQoKTsKICAgICByZXR1cm4gU3RyaW5nKCk7CiB9CiAKLVN0cmluZyBSZW5kZXJUaGVtZVdpbmNl
OjpleHRyYVF1aXJrc1N0eWxlU2hlZXQoKQorU3RyaW5nIFJlbmRlclRoZW1lV2luQ0U6OmV4dHJh
UXVpcmtzU3R5bGVTaGVldCgpCiB7CiAgICAgbm90SW1wbGVtZW50ZWQoKTsKICAgICByZXR1cm4g
U3RyaW5nKCk7CiB9CiAKLWJvb2wgUmVuZGVyVGhlbWVXaW5jZTo6c3VwcG9ydHNIb3Zlcihjb25z
dCBSZW5kZXJTdHlsZSopIGNvbnN0Citib29sIFJlbmRlclRoZW1lV2luQ0U6OnN1cHBvcnRzSG92
ZXIoY29uc3QgUmVuZGVyU3R5bGUqKSBjb25zdAogewogICAgIHJldHVybiBmYWxzZTsKIH0KQEAg
LTMxNyw3ICszMTcsNyBAQCBzdGF0aWMgaW50IGNzc1ZhbHVlSWRUb1N5c0NvbG9ySW5kZXgoaW50
CiAgICAgfQogfQogCi1Db2xvciBSZW5kZXJUaGVtZVdpbmNlOjpzeXN0ZW1Db2xvcihpbnQgY3Nz
VmFsdWVJZCkgY29uc3QKK0NvbG9yIFJlbmRlclRoZW1lV2luQ0U6OnN5c3RlbUNvbG9yKGludCBj
c3NWYWx1ZUlkKSBjb25zdAogewogICAgIGludCBzeXNDb2xvckluZGV4ID0gY3NzVmFsdWVJZFRv
U3lzQ29sb3JJbmRleChjc3NWYWx1ZUlkKTsKICAgICBpZiAoc3lzQ29sb3JJbmRleCA9PSAtMSkK
QEAgLTMzMCw3ICszMzAsNyBAQCBDb2xvciBSZW5kZXJUaGVtZVdpbmNlOjpzeXN0ZW1Db2xvcihp
bnQKIGNvbnN0IGludCBzbGlkZXJUaHVtYldpZHRoID0gNzsKIGNvbnN0IGludCBzbGlkZXJUaHVt
YkhlaWdodCA9IDE1OwogCi12b2lkIFJlbmRlclRoZW1lV2luY2U6OmFkanVzdFNsaWRlclRodW1i
U2l6ZShSZW5kZXJPYmplY3QqIG8pIGNvbnN0Cit2b2lkIFJlbmRlclRoZW1lV2luQ0U6OmFkanVz
dFNsaWRlclRodW1iU2l6ZShSZW5kZXJPYmplY3QqIG8pIGNvbnN0CiB7CiAgICAgaWYgKG8tPnN0
eWxlKCktPmFwcGVhcmFuY2UoKSA9PSBTbGlkZXJUaHVtYlZlcnRpY2FsUGFydCkgewogICAgICAg
ICBvLT5zdHlsZSgpLT5zZXRXaWR0aChMZW5ndGgoc2xpZGVyVGh1bWJIZWlnaHQsIEZpeGVkKSk7
CkBAIC0zNDIsNyArMzQyLDcgQEAgdm9pZCBSZW5kZXJUaGVtZVdpbmNlOjphZGp1c3RTbGlkZXJU
aHVtYgogfQogCiAjaWYgMAotdm9pZCBSZW5kZXJUaGVtZVdpbmNlOjphZGp1c3RCdXR0b25Jbm5l
clN0eWxlKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3ZvaWQgUmVuZGVyVGhlbWVXaW5DRTo6
YWRqdXN0QnV0dG9uSW5uZXJTdHlsZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0CiB7CiAgICAg
Ly8gVGhpcyBpbm5lciBwYWRkaW5nIG1hdGNoZXMgRmlyZWZveC4KICAgICBzdHlsZS0+c2V0UGFk
ZGluZ1RvcChMZW5ndGgoMSwgRml4ZWQpKTsKQEAgLTM1MSw3ICszNTEsNyBAQCB2b2lkIFJlbmRl
clRoZW1lV2luY2U6OmFkanVzdEJ1dHRvbklubmVyCiAgICAgc3R5bGUtPnNldFBhZGRpbmdMZWZ0
KExlbmd0aCgzLCBGaXhlZCkpOwogfQogCi12b2lkIFJlbmRlclRoZW1lV2luY2U6OmFkanVzdFNl
YXJjaEZpZWxkU3R5bGUoQ1NTU3R5bGVTZWxlY3Rvciogc2VsZWN0b3IsIFJlbmRlclN0eWxlKiBz
dHlsZSwgRWxlbWVudCogZSkgY29uc3QKK3ZvaWQgUmVuZGVyVGhlbWVXaW5DRTo6YWRqdXN0U2Vh
cmNoRmllbGRTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUqIHN0
eWxlLCBFbGVtZW50KiBlKSBjb25zdAogewogICAgIC8vIE92ZXJyaWRlIHBhZGRpbmcgc2l6ZSB0
byBtYXRjaCBBcHBLaXQgdGV4dCBwb3NpdGlvbmluZy4KICAgICBjb25zdCBpbnQgcGFkZGluZyA9
IDE7CkBAIC0zNjIsMTIgKzM2MiwxMiBAQCB2b2lkIFJlbmRlclRoZW1lV2luY2U6OmFkanVzdFNl
YXJjaEZpZWxkCiB9CiAjZW5kaWYKIAotYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludFNlYXJj
aEZpZWxkKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIGks
IGNvbnN0IEludFJlY3QmIHIpCitib29sIFJlbmRlclRoZW1lV2luQ0U6OnBhaW50U2VhcmNoRmll
bGQoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgaSwgY29u
c3QgSW50UmVjdCYgcikKIHsKICAgICByZXR1cm4gcGFpbnRUZXh0RmllbGQobywgaSwgcik7CiB9
CiAKLWJvb2wgUmVuZGVyVGhlbWVXaW5jZTo6cGFpbnRTZWFyY2hGaWVsZENhbmNlbEJ1dHRvbihS
ZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8s
IGNvbnN0IEludFJlY3QmIHIpCitib29sIFJlbmRlclRoZW1lV2luQ0U6OnBhaW50U2VhcmNoRmll
bGRDYW5jZWxCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50
SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQogewogICAgIENvbG9yIGJ1dHRvbkNv
bG9yID0gKG8tPm5vZGUoKSAmJiBvLT5ub2RlKCktPmFjdGl2ZSgpKSA/IENvbG9yKDEzOCwgMTM4
LCAxMzgpIDogQ29sb3IoMTg2LCAxODYsIDE4Nik7CiAKQEAgLTM5MSw0NyArMzkxLDQ3IEBAIGJv
b2wgUmVuZGVyVGhlbWVXaW5jZTo6cGFpbnRTZWFyY2hGaWVsZEMKICAgICByZXR1cm4gZmFsc2U7
CiB9CiAKLXZvaWQgUmVuZGVyVGhlbWVXaW5jZTo6YWRqdXN0U2VhcmNoRmllbGRDYW5jZWxCdXR0
b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBF
bGVtZW50KiBlKSBjb25zdAordm9pZCBSZW5kZXJUaGVtZVdpbkNFOjphZGp1c3RTZWFyY2hGaWVs
ZENhbmNlbEJ1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHls
ZSogc3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0CiB7CiAgICAgSW50U2l6ZSBjYW5jZWxTaXplKDEz
LCAxMSk7CiAgICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChjYW5jZWxTaXplLndpZHRoKCksIEZp
eGVkKSk7CiAgICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgoY2FuY2VsU2l6ZS5oZWlnaHQoKSwg
Rml4ZWQpKTsKIH0KIAotdm9pZCBSZW5kZXJUaGVtZVdpbmNlOjphZGp1c3RTZWFyY2hGaWVsZERl
Y29yYXRpb25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUqIHN0
eWxlLCBFbGVtZW50KiBlKSBjb25zdAordm9pZCBSZW5kZXJUaGVtZVdpbkNFOjphZGp1c3RTZWFy
Y2hGaWVsZERlY29yYXRpb25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVuZGVy
U3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlKSBjb25zdAogewogICAgIEludFNpemUgZW1wdHlTaXpl
KDEsIDExKTsKICAgICBzdHlsZS0+c2V0V2lkdGgoTGVuZ3RoKGVtcHR5U2l6ZS53aWR0aCgpLCBG
aXhlZCkpOwogICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKGVtcHR5U2l6ZS5oZWlnaHQoKSwg
Rml4ZWQpKTsKIH0KIAotdm9pZCBSZW5kZXJUaGVtZVdpbmNlOjphZGp1c3RTZWFyY2hGaWVsZFJl
c3VsdHNEZWNvcmF0aW9uU3R5bGUoQ1NTU3R5bGVTZWxlY3Rvciogc2VsZWN0b3IsIFJlbmRlclN0
eWxlKiBzdHlsZSwgRWxlbWVudCogZSkgY29uc3QKK3ZvaWQgUmVuZGVyVGhlbWVXaW5DRTo6YWRq
dXN0U2VhcmNoRmllbGRSZXN1bHRzRGVjb3JhdGlvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNl
bGVjdG9yLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0CiB7CiAgICAgSW50
U2l6ZSBtYWduaWZpZXJTaXplKDE1LCAxMSk7CiAgICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aCht
YWduaWZpZXJTaXplLndpZHRoKCksIEZpeGVkKSk7CiAgICAgc3R5bGUtPnNldEhlaWdodChMZW5n
dGgobWFnbmlmaWVyU2l6ZS5oZWlnaHQoKSwgRml4ZWQpKTsKIH0KIAotYm9vbCBSZW5kZXJUaGVt
ZVdpbmNlOjpwYWludFNlYXJjaEZpZWxkUmVzdWx0c0RlY29yYXRpb24oUmVuZGVyT2JqZWN0KiBv
LCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0
JiByKQorYm9vbCBSZW5kZXJUaGVtZVdpbkNFOjpwYWludFNlYXJjaEZpZWxkUmVzdWx0c0RlY29y
YXRpb24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFp
bnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQogewogICAgIG5vdEltcGxlbWVudGVkKCk7CiAgICAg
cmV0dXJuIGZhbHNlOwogfQogCi12b2lkIFJlbmRlclRoZW1lV2luY2U6OmFkanVzdFNlYXJjaEZp
ZWxkUmVzdWx0c0J1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJT
dHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0Cit2b2lkIFJlbmRlclRoZW1lV2luQ0U6OmFk
anVzdFNlYXJjaEZpZWxkUmVzdWx0c0J1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVj
dG9yLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0CiB7CiAgICAgSW50U2l6
ZSBtYWduaWZpZXJTaXplKDE1LCAxMSk7CiAgICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChtYWdu
aWZpZXJTaXplLndpZHRoKCksIEZpeGVkKSk7CiAgICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgo
bWFnbmlmaWVyU2l6ZS5oZWlnaHQoKSwgRml4ZWQpKTsKIH0KIAotYm9vbCBSZW5kZXJUaGVtZVdp
bmNlOjpwYWludFNlYXJjaEZpZWxkUmVzdWx0c0J1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0
IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCiti
b29sIFJlbmRlclRoZW1lV2luQ0U6OnBhaW50U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uKFJlbmRl
ck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgY29u
c3QgSW50UmVjdCYgcikKIHsKICAgICBwYWludFNlYXJjaEZpZWxkUmVzdWx0c0RlY29yYXRpb24o
bywgcGFpbnRJbmZvLCByKTsKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgUmVuZGVyVGhl
bWVXaW5jZTo6YWRqdXN0TWVudUxpc3RCdXR0b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxl
Y3RvciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlKSBjb25zdAordm9pZCBSZW5kZXJU
aGVtZVdpbkNFOjphZGp1c3RNZW51TGlzdEJ1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNl
bGVjdG9yLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0CiB7CiAgICAgLy8g
VGhlc2UgYXJlIHRoZSBwYWRkaW5ncyBuZWVkZWQgdG8gcGxhY2UgdGhlIHRleHQgY29ycmVjdGx5
IGluIHRoZSA8c2VsZWN0PiBib3gKICAgICBjb25zdCBpbnQgZHJvcERvd25Cb3hQYWRkaW5nVG9w
ICAgID0gMjsKQEAgLTQ4NSw3ICs0ODUsNyBAQCBzdGF0aWMgSFRNTE1lZGlhRWxlbWVudCogbWVk
aWFFbGVtZW50UGFyCiB9CiAjZW5kaWYKIAotYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludFNs
aWRlclRyYWNrKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8m
IGksIGNvbnN0IEludFJlY3QmIHIpCitib29sIFJlbmRlclRoZW1lV2luQ0U6OnBhaW50U2xpZGVy
VHJhY2soUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgaSwg
Y29uc3QgSW50UmVjdCYgcikKIHsKICAgICBib29sIHJjID0gUmVuZGVyVGhlbWU6OnBhaW50U2xp
ZGVyVHJhY2sobywgaSwgcik7CiAgICAgSW50UG9pbnQgbGVmdCA9IEludFBvaW50KHIueCgpICsg
MiwgKHIueSgpICsgci5ib3R0b20oKSkgLyAyKTsKQEAgLTUwOCw3ICs1MDgsNyBAQCBib29sIFJl
bmRlclRoZW1lV2luY2U6OnBhaW50U2xpZGVyVHJhY2soCiAgICAgcmV0dXJuIHJjOwogfQogCi1i
b29sIFJlbmRlclRoZW1lV2luY2U6OnBhaW50U2xpZGVyVGh1bWIoUmVuZGVyT2JqZWN0KiBvLCBj
b25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgaSwgY29uc3QgSW50UmVjdCYgcikKK2Jvb2wg
UmVuZGVyVGhlbWVXaW5DRTo6cGFpbnRTbGlkZXJUaHVtYihSZW5kZXJPYmplY3QqIG8sIGNvbnN0
IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByKQogewogICAgIGJv
b2wgcmMgPSBSZW5kZXJUaGVtZTo6cGFpbnRTbGlkZXJUaHVtYihvLCBpLCByKTsKICAgICBpLmNv
bnRleHQtPnNhdmUoKTsKQEAgLTUyOCwyNyArNTI4LDI3IEBAIGJvb2wgUmVuZGVyVGhlbWVXaW5j
ZTo6cGFpbnRTbGlkZXJUaHVtYigKICAgICByZXR1cm4gcmM7CiB9CiAKLWludCBSZW5kZXJUaGVt
ZVdpbmNlOjpidXR0b25JbnRlcm5hbFBhZGRpbmdMZWZ0KCkgY29uc3QKK2ludCBSZW5kZXJUaGVt
ZVdpbkNFOjpidXR0b25JbnRlcm5hbFBhZGRpbmdMZWZ0KCkgY29uc3QKIHsKICAgICByZXR1cm4g
MzsKIH0KIAotaW50IFJlbmRlclRoZW1lV2luY2U6OmJ1dHRvbkludGVybmFsUGFkZGluZ1JpZ2h0
KCkgY29uc3QKK2ludCBSZW5kZXJUaGVtZVdpbkNFOjpidXR0b25JbnRlcm5hbFBhZGRpbmdSaWdo
dCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIDM7CiB9CiAKLWludCBSZW5kZXJUaGVtZVdpbmNlOjpi
dXR0b25JbnRlcm5hbFBhZGRpbmdUb3AoKSBjb25zdAoraW50IFJlbmRlclRoZW1lV2luQ0U6OmJ1
dHRvbkludGVybmFsUGFkZGluZ1RvcCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIDE7CiB9CiAKLWlu
dCBSZW5kZXJUaGVtZVdpbmNlOjpidXR0b25JbnRlcm5hbFBhZGRpbmdCb3R0b20oKSBjb25zdAor
aW50IFJlbmRlclRoZW1lV2luQ0U6OmJ1dHRvbkludGVybmFsUGFkZGluZ0JvdHRvbSgpIGNvbnN0
CiB7CiAgICAgcmV0dXJuIDE7CiB9CiAKLXZvaWQgUmVuZGVyVGhlbWVXaW5jZTo6YWRqdXN0U2Vh
cmNoRmllbGRTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUqIHN0
eWxlLCBFbGVtZW50KiBlKSBjb25zdAordm9pZCBSZW5kZXJUaGVtZVdpbkNFOjphZGp1c3RTZWFy
Y2hGaWVsZFN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHlsZSogc3R5
bGUsIEVsZW1lbnQqIGUpIGNvbnN0CiB7CiAgICAgY29uc3QgaW50IHBhZGRpbmcgPSAxOwogICAg
IHN0eWxlLT5zZXRQYWRkaW5nTGVmdChMZW5ndGgocGFkZGluZywgRml4ZWQpKTsKQEAgLTU1OSw3
ICs1NTksNyBAQCB2b2lkIFJlbmRlclRoZW1lV2luY2U6OmFkanVzdFNlYXJjaEZpZWxkCiAKICNp
ZiBFTkFCTEUoVklERU8pCiAKLWJvb2wgUmVuZGVyVGhlbWVXaW5jZTo6cGFpbnRNZWRpYUZ1bGxz
Y3JlZW5CdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5m
byYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQorYm9vbCBSZW5kZXJUaGVtZVdpbkNFOjpw
YWludE1lZGlhRnVsbHNjcmVlbkJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9i
amVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCiB7CiAgICAgYm9v
bCByYyA9IHBhaW50QnV0dG9uKG8sIHBhaW50SW5mbywgcik7CiAgICAgRmxvYXRSZWN0IGltUmVj
dCA9IHI7CkBAIC01NzIsNyArNTcyLDcgQEAgYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludE1l
ZGlhRnVsbHNjcgogICAgIHJldHVybiByYzsKIH0KIAotYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpw
YWludE1lZGlhTXV0ZUJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6
UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCitib29sIFJlbmRlclRoZW1l
V2luQ0U6OnBhaW50TWVkaWFNdXRlQnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVy
T2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKIHsKICAgICBi
b29sIHJjID0gcGFpbnRCdXR0b24obywgcGFpbnRJbmZvLCByKTsKICAgICBIVE1MTWVkaWFFbGVt
ZW50KiBtZWRpYUVsZW1lbnQgPSBtZWRpYUVsZW1lbnRQYXJlbnQoby0+bm9kZSgpKTsKQEAgLTU5
Nyw3ICs1OTcsNyBAQCBib29sIFJlbmRlclRoZW1lV2luY2U6OnBhaW50TWVkaWFNdXRlQnV0CiAg
ICAgcmV0dXJuIHJjOwogfQogCi1ib29sIFJlbmRlclRoZW1lV2luY2U6OnBhaW50TWVkaWFQbGF5
QnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBh
aW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKK2Jvb2wgUmVuZGVyVGhlbWVXaW5DRTo6cGFpbnRN
ZWRpYVBsYXlCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50
SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQogewogICAgIGJvb2wgcmMgPSBwYWlu
dEJ1dHRvbihvLCBwYWludEluZm8sIHIpOwogICAgIEZsb2F0UmVjdCBpbVJlY3QgPSByOwpAQCAt
NjIxLDcgKzYyMSw3IEBAIGJvb2wgUmVuZGVyVGhlbWVXaW5jZTo6cGFpbnRNZWRpYVBsYXlCdXQK
ICAgICByZXR1cm4gcmM7CiB9CiAKLWJvb2wgUmVuZGVyVGhlbWVXaW5jZTo6cGFpbnRNZWRpYVNl
ZWtCYWNrQnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludElu
Zm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKK2Jvb2wgUmVuZGVyVGhlbWVXaW5DRTo6
cGFpbnRNZWRpYVNlZWtCYWNrQnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKIHsKICAgICBib29s
IHJjID0gcGFpbnRCdXR0b24obywgcGFpbnRJbmZvLCByKTsKICAgICBGbG9hdFJlY3QgaW1SZWN0
ID0gcjsKQEAgLTYzNyw3ICs2MzcsNyBAQCBib29sIFJlbmRlclRoZW1lV2luY2U6OnBhaW50TWVk
aWFTZWVrQmFjCiAgICAgcmV0dXJuIHJjOwogfQogCi1ib29sIFJlbmRlclRoZW1lV2luY2U6OnBh
aW50TWVkaWFTZWVrRm9yd2FyZEJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9i
amVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCitib29sIFJlbmRl
clRoZW1lV2luQ0U6OnBhaW50TWVkaWFTZWVrRm9yd2FyZEJ1dHRvbihSZW5kZXJPYmplY3QqIG8s
IGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3Qm
IHIpCiB7CiAgICAgYm9vbCByYyA9IHBhaW50QnV0dG9uKG8sIHBhaW50SW5mbywgcik7CiAgICAg
RmxvYXRSZWN0IGltUmVjdCA9IHI7CkBAIC02NTMsMTYgKzY1MywxNSBAQCBib29sIFJlbmRlclRo
ZW1lV2luY2U6OnBhaW50TWVkaWFTZWVrRm9yCiAgICAgcmV0dXJuIHJjOwogfQogCi1ib29sIFJl
bmRlclRoZW1lV2luY2U6OnBhaW50TWVkaWFTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqIG8sIGNv
bnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIp
Citib29sIFJlbmRlclRoZW1lV2luQ0U6OnBhaW50TWVkaWFTbGlkZXJUcmFjayhSZW5kZXJPYmpl
Y3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IElu
dFJlY3QmIHIpCiB7CiAgICAgcmV0dXJuIHBhaW50U2xpZGVyVHJhY2sobywgcGFpbnRJbmZvLCBy
KTsKIH0KIAotYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludE1lZGlhU2xpZGVyVGh1bWIoUmVu
ZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBj
b25zdCBJbnRSZWN0JiByKQorYm9vbCBSZW5kZXJUaGVtZVdpbkNFOjpwYWludE1lZGlhU2xpZGVy
VGh1bWIoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFp
bnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQogewogICAgIHJldHVybiBwYWludFNsaWRlclRodW1i
KG8sIHBhaW50SW5mbywgcik7CiB9CiAjZW5kaWYKIAotfQotCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZVdpbmNlLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZVdpbmNlLmNwcAkocmV2aXNpb24g
NTcyODkpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZVdpbmNlLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMSw2NjggKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRo
ZSBXZWJLaXQgcHJvamVjdC4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUg
Q29tcHV0ZXIsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwg
SW5jLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUgTGlj
ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlz
IGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1
bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk
IHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg
Y29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcg
d2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3Jp
dGUgdG8KLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGlu
IFN0cmVldCwgRmlmdGggRmxvb3IsCi0gKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAq
Ci0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlJlbmRlclRoZW1lV2luY2Uu
aCIKLQotI2luY2x1ZGUgIkNTU1N0eWxlU2hlZXQuaCIKLSNpbmNsdWRlICJDU1NWYWx1ZUtleXdv
cmRzLmgiCi0jaW5jbHVkZSAiRG9jdW1lbnQuaCIKLSNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQu
aCIKLSNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgotI2lmIEVOQUJMRShWSURFTykKLSNpbmNs
dWRlICJIVE1MTWVkaWFFbGVtZW50LmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4K
LQotLyogCi0gKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBhcmUgdXNlZCB0byBkZXRlcm1pbmUg
aG93IGEgd2lkZ2V0IGlzIGRyYXduIHVzaW5nCi0gKiBXaW5kb3dzJyBUaGVtZSBBUEkuIEZvciBt
b3JlIGluZm9ybWF0aW9uIG9uIHRoZW1lIHBhcnRzIGFuZCBzdGF0ZXMgc2VlCi0gKiBodHRwOi8v
bXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZGVmYXVsdC5hc3A/dXJsPS9saWJyYXJ5L2VuLXVz
L3NoZWxsY2MvcGxhdGZvcm0vY29tbWN0bHMvdXNlcmV4L3RvcGljcy9wYXJ0c2FuZHN0YXRlcy5h
c3AKLSAqLwotI2RlZmluZSBUSEVNRV9DT0xPUiAyMDQKLSNkZWZpbmUgVEhFTUVfRk9OVCAgMjEw
Ci0KLS8vIEdlbmVyaWMgc3RhdGUgY29uc3RhbnRzCi0jZGVmaW5lIFRTX05PUk1BTCAgICAxCi0j
ZGVmaW5lIFRTX0hPVkVSICAgICAyCi0jZGVmaW5lIFRTX0FDVElWRSAgICAzCi0jZGVmaW5lIFRT
X0RJU0FCTEVEICA0Ci0jZGVmaW5lIFRTX0ZPQ1VTRUQgICA1Ci0KLS8vIEJ1dHRvbiBjb25zdGFu
dHMKLSNkZWZpbmUgQlBfQlVUVE9OICAgIDEKLSNkZWZpbmUgQlBfUkFESU8gICAgIDIKLSNkZWZp
bmUgQlBfQ0hFQ0tCT1ggIDMKLQotLy8gVGV4dGZpZWxkIGNvbnN0YW50cwotI2RlZmluZSBURlBf
VEVYVEZJRUxEIDEKLSNkZWZpbmUgVEZTX1JFQURPTkxZICA2Ci0KLXR5cGVkZWYgSEFORExFIChX
SU5BUEkqb3BlblRoZW1lRGF0YVB0cikoSFdORCBod25kLCBMUENXU1RSIHBzekNsYXNzTGlzdCk7
Ci10eXBlZGVmIEhSRVNVTFQgKFdJTkFQSSpjbG9zZVRoZW1lRGF0YVB0cikoSEFORExFIGhUaGVt
ZSk7Ci10eXBlZGVmIEhSRVNVTFQgKFdJTkFQSSpkcmF3VGhlbWVCYWNrZ3JvdW5kUHRyKShIQU5E
TEUgaFRoZW1lLCBIREMgaGRjLCBpbnQgaVBhcnRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGludCBpU3RhdGVJZCwgY29uc3QgUkVDVCAqcFJlY3QsCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSRUNUKiBwQ2xpcFJl
Y3QpOwotdHlwZWRlZiBIUkVTVUxUIChXSU5BUEkqZHJhd1RoZW1lRWRnZVB0cikoSEFORExFIGhU
aGVtZSwgSERDIGhkYywgaW50IGlQYXJ0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBpbnQgaVN0YXRlSWQsIGNvbnN0IFJFQ1QgKnBSZWN0LAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdUVkZ2UsIHVuc2lnbmVk
IHVGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0
IFJFQ1QqIHBDbGlwUmVjdCk7Ci10eXBlZGVmIEhSRVNVTFQgKFdJTkFQSSpnZXRUaGVtZUNvbnRl
bnRSZWN0UHRyKShIQU5ETEUgaFRoZW1lLCBIREMgaGRjLCBpbnQgaVBhcnRJZCwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpU3RhdGVJZCwgY29uc3QgUkVD
VCogcFJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNU
KiBwQ29udGVudFJlY3QpOwotdHlwZWRlZiBIUkVTVUxUIChXSU5BUEkqZ2V0VGhlbWVQYXJ0U2l6
ZVB0cikoSEFORExFIGhUaGVtZSwgSERDIGhkYywgaW50IGlQYXJ0SWQsCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaVN0YXRlSWQsIFJFQ1QqIHByYywgaW50IHRz
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0laRSogcHN6KTsKLXR5
cGVkZWYgSFJFU1VMVCAoV0lOQVBJKmdldFRoZW1lU3lzRm9udFB0cikoSEFORExFIGhUaGVtZSwg
aW50IGlGb250SWQsIE9VVCBMT0dGT05UKiBwRm9udCk7Ci10eXBlZGVmIEhSRVNVTFQgKFdJTkFQ
SSpnZXRUaGVtZUNvbG9yUHRyKShIQU5ETEUgaFRoZW1lLCBIREMgaGRjLCBpbnQgaVBhcnRJZCwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlTdGF0ZUlkLCBpbnQgaVBy
b3BJZCwgT1VUIENPTE9SUkVGKiBwRm9udCk7Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotc3Rh
dGljIGNvbnN0IGludCBkcm9wRG93bkJ1dHRvbldpZHRoID0gMTc7Ci1zdGF0aWMgY29uc3QgaW50
IHRyYWNrV2lkdGggPSA0OwotCi1QYXNzUmVmUHRyPFJlbmRlclRoZW1lPiBSZW5kZXJUaGVtZVdp
bmNlOjpjcmVhdGUoKQotewotICAgIHJldHVybiBhZG9wdFJlZihuZXcgUmVuZGVyVGhlbWVXaW5j
ZSk7Ci19Ci0KLVBhc3NSZWZQdHI8UmVuZGVyVGhlbWU+IFJlbmRlclRoZW1lOjp0aGVtZUZvclBh
Z2UoUGFnZSogcGFnZSkKLXsKLSAgICBzdGF0aWMgUmVuZGVyVGhlbWUqIHdpbmNlVGhlbWUgPSBS
ZW5kZXJUaGVtZVdpbmNlOjpjcmVhdGUoKS5yZWxlYXNlUmVmKCk7Ci0gICAgcmV0dXJuIHdpbmNl
VGhlbWU7Ci19Ci0KLVJlbmRlclRoZW1lV2luY2U6OlJlbmRlclRoZW1lV2luY2UoKQotewotfQot
Ci1SZW5kZXJUaGVtZVdpbmNlOjp+UmVuZGVyVGhlbWVXaW5jZSgpCi17Ci19Ci0KLUNvbG9yIFJl
bmRlclRoZW1lV2luY2U6OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkg
Y29uc3QKLXsKLSAgICBDT0xPUlJFRiBjb2xvciA9IEdldFN5c0NvbG9yKENPTE9SX0hJR0hMSUdI
VCk7Ci0gICAgcmV0dXJuIENvbG9yKEdldFJWYWx1ZShjb2xvciksIEdldEdWYWx1ZShjb2xvciks
IEdldEJWYWx1ZShjb2xvciksIDI1NSk7Ci19Ci0KLUNvbG9yIFJlbmRlclRoZW1lV2luY2U6OnBs
YXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdAotewotICAgIENP
TE9SUkVGIGNvbG9yID0gR2V0U3lzQ29sb3IoQ09MT1JfR1JBWVRFWFQpOwotICAgIHJldHVybiBD
b2xvcihHZXRSVmFsdWUoY29sb3IpLCBHZXRHVmFsdWUoY29sb3IpLCBHZXRCVmFsdWUoY29sb3Ip
LCAyNTUpOwotfQotCi1Db2xvciBSZW5kZXJUaGVtZVdpbmNlOjpwbGF0Zm9ybUFjdGl2ZVNlbGVj
dGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0Ci17Ci0gICAgQ09MT1JSRUYgY29sb3IgPSBHZXRT
eXNDb2xvcihDT0xPUl9ISUdITElHSFRURVhUKTsKLSAgICByZXR1cm4gQ29sb3IoR2V0UlZhbHVl
KGNvbG9yKSwgR2V0R1ZhbHVlKGNvbG9yKSwgR2V0QlZhbHVlKGNvbG9yKSwgMjU1KTsKLX0KLQot
Q29sb3IgUmVuZGVyVGhlbWVXaW5jZTo6cGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkZvcmVncm91
bmRDb2xvcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIENvbG9yOjp3aGl0ZTsKLX0KLQotYm9vbCBS
ZW5kZXJUaGVtZVdpbmNlOjpzdXBwb3J0c0ZvY3VzKENvbnRyb2xQYXJ0IGFwcGVhcmFuY2UpIGNv
bnN0Ci17Ci0gICAgc3dpdGNoIChhcHBlYXJhbmNlKSB7Ci0gICAgY2FzZSBQdXNoQnV0dG9uUGFy
dDoKLSAgICBjYXNlIEJ1dHRvblBhcnQ6Ci0gICAgY2FzZSBUZXh0RmllbGRQYXJ0OgotICAgIGNh
c2UgVGV4dEFyZWFQYXJ0OgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29s
IFJlbmRlclRoZW1lV2luY2U6OnN1cHBvcnRzRm9jdXNSaW5nKGNvbnN0IFJlbmRlclN0eWxlICpz
dHlsZSkgY29uc3QKLXsKLSAgICByZXR1cm4gc3VwcG9ydHNGb2N1cyhzdHlsZS0+YXBwZWFyYW5j
ZSgpKTsKLX0KLQotdW5zaWduZWQgUmVuZGVyVGhlbWVXaW5jZTo6ZGV0ZXJtaW5lQ2xhc3NpY1N0
YXRlKFJlbmRlck9iamVjdCogbykKLXsKLSAgICB1bnNpZ25lZCByZXN1bHQgPSAwOwotICAgIGlm
ICghaXNFbmFibGVkKG8pIHx8IGlzUmVhZE9ubHlDb250cm9sKG8pKQotICAgICAgICByZXN1bHQg
PSBERkNTX0lOQUNUSVZFOwotICAgIGVsc2UgaWYgKGlzUHJlc3NlZChvKSkgLy8gQWN0aXZlIHN1
cGVyc2VkZXMgaG92ZXIKLSAgICAgICAgcmVzdWx0ID0gREZDU19QVVNIRUQ7Ci0KLSAgICBpZiAo
aXNDaGVja2VkKG8pKQotICAgICAgICByZXN1bHQgfD0gREZDU19DSEVDS0VEOwotICAgIHJldHVy
biByZXN1bHQ7Ci19Ci0KLVRoZW1lRGF0YSBSZW5kZXJUaGVtZVdpbmNlOjpnZXRUaGVtZURhdGEo
UmVuZGVyT2JqZWN0KiBvKQotewotICAgIFRoZW1lRGF0YSByZXN1bHQ7Ci0gICAgc3dpdGNoIChv
LT5zdHlsZSgpLT5hcHBlYXJhbmNlKCkpIHsKLSAgICBjYXNlIFB1c2hCdXR0b25QYXJ0OgotICAg
IGNhc2UgQnV0dG9uUGFydDoKLSAgICAgICAgcmVzdWx0Lm1fcGFydCA9IEJQX0JVVFRPTjsKLSAg
ICAgICAgcmVzdWx0Lm1fY2xhc3NpY1N0YXRlID0gREZDU19CVVRUT05QVVNIOwotICAgICAgICBi
cmVhazsKLSAgICBjYXNlIENoZWNrYm94UGFydDoKLSAgICAgICAgcmVzdWx0Lm1fcGFydCA9IEJQ
X0NIRUNLQk9YOwotICAgICAgICByZXN1bHQubV9jbGFzc2ljU3RhdGUgPSBERkNTX0JVVFRPTkNI
RUNLOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJhZGlvUGFydDoKLSAgICAgICAgcmVzdWx0
Lm1fcGFydCA9IEJQX1JBRElPOwotICAgICAgICByZXN1bHQubV9jbGFzc2ljU3RhdGUgPSBERkNT
X0JVVFRPTlJBRElPOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIExpc3Rib3hQYXJ0OgotICAg
IGNhc2UgTWVudWxpc3RQYXJ0OgotICAgIGNhc2UgVGV4dEZpZWxkUGFydDoKLSAgICBjYXNlIFRl
eHRBcmVhUGFydDoKLSAgICAgICAgcmVzdWx0Lm1fcGFydCA9IFRGUF9URVhURklFTEQ7Ci0gICAg
ICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJlc3VsdC5tX2NsYXNzaWNTdGF0ZSB8PSBkZXRlcm1p
bmVDbGFzc2ljU3RhdGUobyk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1ib29sIFJlbmRl
clRoZW1lV2luY2U6OnBhaW50QnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mIGksIGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgLy8gR2V0IHRoZSBj
b3JyZWN0IHRoZW1lIGRhdGEgZm9yIGEgYnV0dG9uCi0gICAgVGhlbWVEYXRhIHRoZW1lRGF0YSA9
IGdldFRoZW1lRGF0YShvKTsKLQotICAgIC8vIE5vdyBwYWludCB0aGUgYnV0dG9uLgotICAgIGku
Y29udGV4dC0+ZHJhd0ZyYW1lQ29udHJvbChyLCBERkNfQlVUVE9OLCB0aGVtZURhdGEubV9jbGFz
c2ljU3RhdGUpOwotICAgIGlmIChpc0ZvY3VzZWQobykpIHsKLSAgICAgICAgaWYgKHRoZW1lRGF0
YS5tX3BhcnQgPT0gQlBfQlVUVE9OKSB7Ci0gICAgICAgICAgICBJbnRSZWN0IGZvY3VzUmVjdChy
KTsKLSAgICAgICAgICAgIGZvY3VzUmVjdC5pbmZsYXRlKC0yKTsKLSAgICAgICAgICAgIGkuY29u
dGV4dC0+ZHJhd0ZvY3VzUmVjdChmb2N1c1JlY3QpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAg
ICAgIGkuY29udGV4dC0+ZHJhd0ZvY3VzUmVjdChyKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFs
c2U7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVXaW5jZTo6c2V0Q2hlY2tib3hTaXplKFJlbmRlclN0
eWxlKiBzdHlsZSkgY29uc3QKLXsKLSAgICAvLyBJZiB0aGUgd2lkdGggYW5kIGhlaWdodCBhcmUg
Ym90aCBzcGVjaWZpZWQsIHRoZW4gd2UgaGF2ZSBub3RoaW5nIHRvIGRvLgotICAgIGlmICghc3R5
bGUtPndpZHRoKCkuaXNJbnRyaW5zaWNPckF1dG8oKSAmJiAhc3R5bGUtPmhlaWdodCgpLmlzQXV0
bygpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBGSVhNRTogIEEgaGFyZC1jb2RlZCBzaXpl
IG9mIDEzIGlzIHVzZWQuICBUaGlzIGlzIHdyb25nIGJ1dCBuZWNlc3NhcnkgZm9yIG5vdy4gIEl0
IG1hdGNoZXMgRmlyZWZveC4KLSAgICAvLyBBdCBkaWZmZXJlbnQgRFBJIHNldHRpbmdzIG9uIFdp
bmRvd3MsIHF1ZXJ5aW5nIHRoZSB0aGVtZSBnaXZlcyB5b3UgYSBsYXJnZXIgc2l6ZSB0aGF0IGFj
Y291bnRzIGZvcgotICAgIC8vIHRoZSBoaWdoZXIgRFBJLiAgVW50aWwgb3VyIGVudGlyZSBlbmdp
bmUgaG9ub3JzIGEgRFBJIHNldHRpbmcgb3RoZXIgdGhhbiA5Niwgd2UgY2FuJ3QgcmVseSBvbiB0
aGUgdGhlbWUncwotICAgIC8vIG1ldHJpY3MuCi0gICAgaWYgKHN0eWxlLT53aWR0aCgpLmlzSW50
cmluc2ljT3JBdXRvKCkpCi0gICAgICAgIHN0eWxlLT5zZXRXaWR0aChMZW5ndGgoMTMsIEZpeGVk
KSk7Ci0gICAgaWYgKHN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkKLSAgICAgICAgc3R5bGUtPnNl
dEhlaWdodChMZW5ndGgoMTMsIEZpeGVkKSk7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVXaW5jZTo6
cGFpbnRUZXh0RmllbGQoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50
SW5mbyYgaSwgY29uc3QgSW50UmVjdCYgcikKLXsKLSAgICAvLyBHZXQgdGhlIGNvcnJlY3QgdGhl
bWUgZGF0YSBmb3IgYSB0ZXh0ZmllbGQKLSAgICBUaGVtZURhdGEgdGhlbWVEYXRhID0gZ2V0VGhl
bWVEYXRhKG8pOwotCi0gICAgLy8gTm93IHBhaW50IHRoZSB0ZXh0IGZpZWxkLgotICAgIGkuY29u
dGV4dC0+cGFpbnRUZXh0RmllbGQociwgdGhlbWVEYXRhLm1fY2xhc3NpY1N0YXRlKTsKLQotICAg
IHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZVdpbmNlOjphZGp1c3RNZW51TGlz
dFN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVs
ZW1lbnQqIGUpIGNvbnN0Ci17Ci0gICAgc3R5bGUtPnJlc2V0Qm9yZGVyKCk7Ci0gICAgYWRqdXN0
TWVudUxpc3RCdXR0b25TdHlsZShzZWxlY3Rvciwgc3R5bGUsIGUpOwotfQotCi1ib29sIFJlbmRl
clRoZW1lV2luY2U6OnBhaW50TWVudUxpc3QoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJP
YmplY3Q6OlBhaW50SW5mbyYgaSwgY29uc3QgSW50UmVjdCYgcikKLXsKLSAgICBwYWludFRleHRG
aWVsZChvLCBpLCByKTsKLSAgICBwYWludE1lbnVMaXN0QnV0dG9uKG8sIGksIHIpOwotICAgIHJl
dHVybiB0cnVlOwotfQotCi1ib29sIFJlbmRlclRoZW1lV2luY2U6OnBhaW50TWVudUxpc3RCdXR0
b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgaSwgY29u
c3QgSW50UmVjdCYgcikKLXsKLSAgICBJbnRSZWN0IGJ1dHRvblJlY3Qoci5yaWdodCgpIC0gZHJv
cERvd25CdXR0b25XaWR0aCAtIDEsIHIueSgpLCBkcm9wRG93bkJ1dHRvbldpZHRoLCByLmhlaWdo
dCgpKTsKLSAgICBidXR0b25SZWN0LmluZmxhdGVZKC0xKTsKLSAgICBpLmNvbnRleHQtPmRyYXdG
cmFtZUNvbnRyb2woYnV0dG9uUmVjdCwgREZDX1NDUk9MTCwgREZDU19TQ1JPTExDT01CT0JPWCB8
IGRldGVybWluZUNsYXNzaWNTdGF0ZShvKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQg
UmVuZGVyVGhlbWVXaW5jZTo6c3lzdGVtRm9udChpbnQgcHJvcElkLCBGb250RGVzY3JpcHRpb24m
IGZvbnREZXNjcmlwdGlvbikgY29uc3QKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotfQotCi12
b2lkIFJlbmRlclRoZW1lV2luY2U6OnRoZW1lQ2hhbmdlZCgpCi17Ci19Ci0KLVN0cmluZyBSZW5k
ZXJUaGVtZVdpbmNlOjpleHRyYURlZmF1bHRTdHlsZVNoZWV0KCkKLXsKLSAgICBub3RJbXBsZW1l
bnRlZCgpOwotICAgIHJldHVybiBTdHJpbmcoKTsKLX0KLQotU3RyaW5nIFJlbmRlclRoZW1lV2lu
Y2U6OmV4dHJhUXVpcmtzU3R5bGVTaGVldCgpCi17Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAg
ICByZXR1cm4gU3RyaW5nKCk7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVXaW5jZTo6c3VwcG9ydHNI
b3Zlcihjb25zdCBSZW5kZXJTdHlsZSopIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQot
Ci0vLyBNYXAgYSBDU1NWYWx1ZSogc3lzdGVtIGNvbG9yIHRvIGFuIGluZGV4IHVuZGVyc3Rvb2Qg
YnkgR2V0U3lzQ29sb3IKLXN0YXRpYyBpbnQgY3NzVmFsdWVJZFRvU3lzQ29sb3JJbmRleChpbnQg
Y3NzVmFsdWVJZCkKLXsKLSAgICBzd2l0Y2ggKGNzc1ZhbHVlSWQpIHsKLSAgICBjYXNlIENTU1Zh
bHVlQWN0aXZlYm9yZGVyOiByZXR1cm4gQ09MT1JfQUNUSVZFQk9SREVSOwotICAgIGNhc2UgQ1NT
VmFsdWVBY3RpdmVjYXB0aW9uOiByZXR1cm4gQ09MT1JfQUNUSVZFQ0FQVElPTjsKLSAgICBjYXNl
IENTU1ZhbHVlQXBwd29ya3NwYWNlOiByZXR1cm4gQ09MT1JfQVBQV09SS1NQQUNFOwotICAgIGNh
c2UgQ1NTVmFsdWVCYWNrZ3JvdW5kOiByZXR1cm4gQ09MT1JfQkFDS0dST1VORDsKLSAgICBjYXNl
IENTU1ZhbHVlQnV0dG9uZmFjZTogcmV0dXJuIENPTE9SX0JUTkZBQ0U7Ci0gICAgY2FzZSBDU1NW
YWx1ZUJ1dHRvbmhpZ2hsaWdodDogcmV0dXJuIENPTE9SX0JUTkhJR0hMSUdIVDsKLSAgICBjYXNl
IENTU1ZhbHVlQnV0dG9uc2hhZG93OiByZXR1cm4gQ09MT1JfQlROU0hBRE9XOwotICAgIGNhc2Ug
Q1NTVmFsdWVCdXR0b250ZXh0OiByZXR1cm4gQ09MT1JfQlROVEVYVDsKLSAgICBjYXNlIENTU1Zh
bHVlQ2FwdGlvbnRleHQ6IHJldHVybiBDT0xPUl9DQVBUSU9OVEVYVDsKLSAgICBjYXNlIENTU1Zh
bHVlR3JheXRleHQ6IHJldHVybiBDT0xPUl9HUkFZVEVYVDsKLSAgICBjYXNlIENTU1ZhbHVlSGln
aGxpZ2h0OiByZXR1cm4gQ09MT1JfSElHSExJR0hUOwotICAgIGNhc2UgQ1NTVmFsdWVIaWdobGln
aHR0ZXh0OiByZXR1cm4gQ09MT1JfSElHSExJR0hUVEVYVDsKLSAgICBjYXNlIENTU1ZhbHVlSW5h
Y3RpdmVib3JkZXI6IHJldHVybiBDT0xPUl9JTkFDVElWRUJPUkRFUjsKLSAgICBjYXNlIENTU1Zh
bHVlSW5hY3RpdmVjYXB0aW9uOiByZXR1cm4gQ09MT1JfSU5BQ1RJVkVDQVBUSU9OOwotICAgIGNh
c2UgQ1NTVmFsdWVJbmFjdGl2ZWNhcHRpb250ZXh0OiByZXR1cm4gQ09MT1JfSU5BQ1RJVkVDQVBU
SU9OVEVYVDsKLSAgICBjYXNlIENTU1ZhbHVlSW5mb2JhY2tncm91bmQ6IHJldHVybiBDT0xPUl9J
TkZPQks7Ci0gICAgY2FzZSBDU1NWYWx1ZUluZm90ZXh0OiByZXR1cm4gQ09MT1JfSU5GT1RFWFQ7
Ci0gICAgY2FzZSBDU1NWYWx1ZU1lbnU6IHJldHVybiBDT0xPUl9NRU5VOwotICAgIGNhc2UgQ1NT
VmFsdWVNZW51dGV4dDogcmV0dXJuIENPTE9SX01FTlVURVhUOwotICAgIGNhc2UgQ1NTVmFsdWVT
Y3JvbGxiYXI6IHJldHVybiBDT0xPUl9TQ1JPTExCQVI7Ci0gICAgY2FzZSBDU1NWYWx1ZVRocmVl
ZGRhcmtzaGFkb3c6IHJldHVybiBDT0xPUl8zRERLU0hBRE9XOwotICAgIGNhc2UgQ1NTVmFsdWVU
aHJlZWRmYWNlOiByZXR1cm4gQ09MT1JfM0RGQUNFOwotICAgIGNhc2UgQ1NTVmFsdWVUaHJlZWRo
aWdobGlnaHQ6IHJldHVybiBDT0xPUl8zREhJR0hMSUdIVDsKLSAgICBjYXNlIENTU1ZhbHVlVGhy
ZWVkbGlnaHRzaGFkb3c6IHJldHVybiBDT0xPUl8zRExJR0hUOwotICAgIGNhc2UgQ1NTVmFsdWVU
aHJlZWRzaGFkb3c6IHJldHVybiBDT0xPUl8zRFNIQURPVzsKLSAgICBjYXNlIENTU1ZhbHVlV2lu
ZG93OiByZXR1cm4gQ09MT1JfV0lORE9XOwotICAgIGNhc2UgQ1NTVmFsdWVXaW5kb3dmcmFtZTog
cmV0dXJuIENPTE9SX1dJTkRPV0ZSQU1FOwotICAgIGNhc2UgQ1NTVmFsdWVXaW5kb3d0ZXh0OiBy
ZXR1cm4gQ09MT1JfV0lORE9XVEVYVDsKLSAgICBkZWZhdWx0OiByZXR1cm4gLTE7IC8vIFVuc3Vw
cG9ydGVkIENTU1ZhbHVlCi0gICAgfQotfQotCi1Db2xvciBSZW5kZXJUaGVtZVdpbmNlOjpzeXN0
ZW1Db2xvcihpbnQgY3NzVmFsdWVJZCkgY29uc3QKLXsKLSAgICBpbnQgc3lzQ29sb3JJbmRleCA9
IGNzc1ZhbHVlSWRUb1N5c0NvbG9ySW5kZXgoY3NzVmFsdWVJZCk7Ci0gICAgaWYgKHN5c0NvbG9y
SW5kZXggPT0gLTEpCi0gICAgICAgIHJldHVybiBSZW5kZXJUaGVtZTo6c3lzdGVtQ29sb3IoY3Nz
VmFsdWVJZCk7Ci0KLSAgICBDT0xPUlJFRiBjb2xvciA9IEdldFN5c0NvbG9yKHN5c0NvbG9ySW5k
ZXgpOwotICAgIHJldHVybiBDb2xvcihHZXRSVmFsdWUoY29sb3IpLCBHZXRHVmFsdWUoY29sb3Ip
LCBHZXRCVmFsdWUoY29sb3IpKTsKLX0KLQotY29uc3QgaW50IHNsaWRlclRodW1iV2lkdGggPSA3
OwotY29uc3QgaW50IHNsaWRlclRodW1iSGVpZ2h0ID0gMTU7Ci0KLXZvaWQgUmVuZGVyVGhlbWVX
aW5jZTo6YWRqdXN0U2xpZGVyVGh1bWJTaXplKFJlbmRlck9iamVjdCogbykgY29uc3QKLXsKLSAg
ICBpZiAoby0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0
KSB7Ci0gICAgICAgIG8tPnN0eWxlKCktPnNldFdpZHRoKExlbmd0aChzbGlkZXJUaHVtYkhlaWdo
dCwgRml4ZWQpKTsKLSAgICAgICAgby0+c3R5bGUoKS0+c2V0SGVpZ2h0KExlbmd0aChzbGlkZXJU
aHVtYldpZHRoLCBGaXhlZCkpOwotICAgIH0gZWxzZSBpZiAoby0+c3R5bGUoKS0+YXBwZWFyYW5j
ZSgpID09IFNsaWRlclRodW1iSG9yaXpvbnRhbFBhcnQpIHsKLSAgICAgICAgby0+c3R5bGUoKS0+
c2V0V2lkdGgoTGVuZ3RoKHNsaWRlclRodW1iV2lkdGgsIEZpeGVkKSk7Ci0gICAgICAgIG8tPnN0
eWxlKCktPnNldEhlaWdodChMZW5ndGgoc2xpZGVyVGh1bWJIZWlnaHQsIEZpeGVkKSk7Ci0gICAg
fQotfQotCi0jaWYgMAotdm9pZCBSZW5kZXJUaGVtZVdpbmNlOjphZGp1c3RCdXR0b25Jbm5lclN0
eWxlKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKLXsKLSAgICAvLyBUaGlzIGlubmVyIHBhZGRp
bmcgbWF0Y2hlcyBGaXJlZm94LgotICAgIHN0eWxlLT5zZXRQYWRkaW5nVG9wKExlbmd0aCgxLCBG
aXhlZCkpOwotICAgIHN0eWxlLT5zZXRQYWRkaW5nUmlnaHQoTGVuZ3RoKDMsIEZpeGVkKSk7Ci0g
ICAgc3R5bGUtPnNldFBhZGRpbmdCb3R0b20oTGVuZ3RoKDEsIEZpeGVkKSk7Ci0gICAgc3R5bGUt
PnNldFBhZGRpbmdMZWZ0KExlbmd0aCgzLCBGaXhlZCkpOwotfQotCi12b2lkIFJlbmRlclRoZW1l
V2luY2U6OmFkanVzdFNlYXJjaEZpZWxkU3R5bGUoQ1NTU3R5bGVTZWxlY3Rvciogc2VsZWN0b3Is
IFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCogZSkgY29uc3QKLXsKLSAgICAvLyBPdmVycmlk
ZSBwYWRkaW5nIHNpemUgdG8gbWF0Y2ggQXBwS2l0IHRleHQgcG9zaXRpb25pbmcuCi0gICAgY29u
c3QgaW50IHBhZGRpbmcgPSAxOwotICAgIHN0eWxlLT5zZXRQYWRkaW5nTGVmdChMZW5ndGgocGFk
ZGluZywgRml4ZWQpKTsKLSAgICBzdHlsZS0+c2V0UGFkZGluZ1JpZ2h0KExlbmd0aChwYWRkaW5n
LCBGaXhlZCkpOwotICAgIHN0eWxlLT5zZXRQYWRkaW5nVG9wKExlbmd0aChwYWRkaW5nLCBGaXhl
ZCkpOwotICAgIHN0eWxlLT5zZXRQYWRkaW5nQm90dG9tKExlbmd0aChwYWRkaW5nLCBGaXhlZCkp
OwotfQotI2VuZGlmCi0KLWJvb2wgUmVuZGVyVGhlbWVXaW5jZTo6cGFpbnRTZWFyY2hGaWVsZChS
ZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBpLCBjb25zdCBJ
bnRSZWN0JiByKQotewotICAgIHJldHVybiBwYWludFRleHRGaWVsZChvLCBpLCByKTsKLX0KLQot
Ym9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uKFJlbmRl
ck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgY29u
c3QgSW50UmVjdCYgcikKLXsKLSAgICBDb2xvciBidXR0b25Db2xvciA9IChvLT5ub2RlKCkgJiYg
by0+bm9kZSgpLT5hY3RpdmUoKSkgPyBDb2xvcigxMzgsIDEzOCwgMTM4KSA6IENvbG9yKDE4Niwg
MTg2LCAxODYpOwotCi0gICAgSW50U2l6ZSBjYW5jZWxTaXplKDEwLCAxMCk7Ci0gICAgSW50U2l6
ZSBjYW5jZWxSYWRpdXMoY2FuY2VsU2l6ZS53aWR0aCgpIC8gMiwgY2FuY2VsU2l6ZS5oZWlnaHQo
KSAvIDIpOwotICAgIGludCB4ID0gci54KCkgKyAoci53aWR0aCgpIC0gY2FuY2VsU2l6ZS53aWR0
aCgpKSAvIDI7Ci0gICAgaW50IHkgPSByLnkoKSArIChyLmhlaWdodCgpIC0gY2FuY2VsU2l6ZS5o
ZWlnaHQoKSkgLyAyICsgMTsKLSAgICBJbnRSZWN0IGNhbmNlbEJvdW5kcyhJbnRQb2ludCh4LCB5
KSwgY2FuY2VsU2l6ZSk7Ci0gICAgcGFpbnRJbmZvLmNvbnRleHQtPnNhdmUoKTsKLSAgICBwYWlu
dEluZm8uY29udGV4dC0+YWRkUm91bmRlZFJlY3RDbGlwKGNhbmNlbEJvdW5kcywgY2FuY2VsUmFk
aXVzLCBjYW5jZWxSYWRpdXMsIGNhbmNlbFJhZGl1cywgY2FuY2VsUmFkaXVzKTsKLSAgICBwYWlu
dEluZm8uY29udGV4dC0+ZmlsbFJlY3QoY2FuY2VsQm91bmRzLCBidXR0b25Db2xvciwgRGV2aWNl
Q29sb3JTcGFjZSk7Ci0KLSAgICAvLyBEcmF3IHRoZSAneCcKLSAgICBJbnRTaXplIHhTaXplKDMs
IDMpOwotICAgIEludFJlY3QgeEJvdW5kcyhjYW5jZWxCb3VuZHMubG9jYXRpb24oKSArIEludFNp
emUoMywgMyksIHhTaXplKTsKLSAgICBwYWludEluZm8uY29udGV4dC0+c2V0U3Ryb2tlQ29sb3Io
Q29sb3I6OndoaXRlLCBEZXZpY2VDb2xvclNwYWNlKTsKLSAgICBwYWludEluZm8uY29udGV4dC0+
ZHJhd0xpbmUoeEJvdW5kcy5sb2NhdGlvbigpLCAgeEJvdW5kcy5sb2NhdGlvbigpICsgeEJvdW5k
cy5zaXplKCkpOwotICAgIHBhaW50SW5mby5jb250ZXh0LT5kcmF3TGluZShJbnRQb2ludCh4Qm91
bmRzLnJpZ2h0KCksIHhCb3VuZHMueSgpKSwgIEludFBvaW50KHhCb3VuZHMueCgpLCB4Qm91bmRz
LmJvdHRvbSgpKSk7Ci0KLSAgICBwYWludEluZm8uY29udGV4dC0+cmVzdG9yZSgpOwotICAgIHJl
dHVybiBmYWxzZTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZVdpbmNlOjphZGp1c3RTZWFyY2hGaWVs
ZENhbmNlbEJ1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHls
ZSogc3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0Ci17Ci0gICAgSW50U2l6ZSBjYW5jZWxTaXplKDEz
LCAxMSk7Ci0gICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChjYW5jZWxTaXplLndpZHRoKCksIEZp
eGVkKSk7Ci0gICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgoY2FuY2VsU2l6ZS5oZWlnaHQoKSwg
Rml4ZWQpKTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZVdpbmNlOjphZGp1c3RTZWFyY2hGaWVsZERl
Y29yYXRpb25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUqIHN0
eWxlLCBFbGVtZW50KiBlKSBjb25zdAotewotICAgIEludFNpemUgZW1wdHlTaXplKDEsIDExKTsK
LSAgICBzdHlsZS0+c2V0V2lkdGgoTGVuZ3RoKGVtcHR5U2l6ZS53aWR0aCgpLCBGaXhlZCkpOwot
ICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKGVtcHR5U2l6ZS5oZWlnaHQoKSwgRml4ZWQpKTsK
LX0KLQotdm9pZCBSZW5kZXJUaGVtZVdpbmNlOjphZGp1c3RTZWFyY2hGaWVsZFJlc3VsdHNEZWNv
cmF0aW9uU3R5bGUoQ1NTU3R5bGVTZWxlY3Rvciogc2VsZWN0b3IsIFJlbmRlclN0eWxlKiBzdHls
ZSwgRWxlbWVudCogZSkgY29uc3QKLXsKLSAgICBJbnRTaXplIG1hZ25pZmllclNpemUoMTUsIDEx
KTsKLSAgICBzdHlsZS0+c2V0V2lkdGgoTGVuZ3RoKG1hZ25pZmllclNpemUud2lkdGgoKSwgRml4
ZWQpKTsKLSAgICBzdHlsZS0+c2V0SGVpZ2h0KExlbmd0aChtYWduaWZpZXJTaXplLmhlaWdodCgp
LCBGaXhlZCkpOwotfQotCi1ib29sIFJlbmRlclRoZW1lV2luY2U6OnBhaW50U2VhcmNoRmllbGRS
ZXN1bHRzRGVjb3JhdGlvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFp
bnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgbm90SW1wbGVtZW50
ZWQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVXaW5jZTo6YWRq
dXN0U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uU3R5bGUoQ1NTU3R5bGVTZWxlY3Rvciogc2VsZWN0
b3IsIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCogZSkgY29uc3QKLXsKLSAgICBJbnRTaXpl
IG1hZ25pZmllclNpemUoMTUsIDExKTsKLSAgICBzdHlsZS0+c2V0V2lkdGgoTGVuZ3RoKG1hZ25p
ZmllclNpemUud2lkdGgoKSwgRml4ZWQpKTsKLSAgICBzdHlsZS0+c2V0SGVpZ2h0KExlbmd0aCht
YWduaWZpZXJTaXplLmhlaWdodCgpLCBGaXhlZCkpOwotfQotCi1ib29sIFJlbmRlclRoZW1lV2lu
Y2U6OnBhaW50U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3Qg
UmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKLXsK
LSAgICBwYWludFNlYXJjaEZpZWxkUmVzdWx0c0RlY29yYXRpb24obywgcGFpbnRJbmZvLCByKTsK
LSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVXaW5jZTo6YWRqdXN0TWVu
dUxpc3RCdXR0b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUq
IHN0eWxlLCBFbGVtZW50KiBlKSBjb25zdAotewotICAgIC8vIFRoZXNlIGFyZSB0aGUgcGFkZGlu
Z3MgbmVlZGVkIHRvIHBsYWNlIHRoZSB0ZXh0IGNvcnJlY3RseSBpbiB0aGUgPHNlbGVjdD4gYm94
Ci0gICAgY29uc3QgaW50IGRyb3BEb3duQm94UGFkZGluZ1RvcCAgICA9IDI7Ci0gICAgY29uc3Qg
aW50IGRyb3BEb3duQm94UGFkZGluZ1JpZ2h0ICA9IHN0eWxlLT5kaXJlY3Rpb24oKSA9PSBMVFIg
PyA0ICsgZHJvcERvd25CdXR0b25XaWR0aCA6IDQ7Ci0gICAgY29uc3QgaW50IGRyb3BEb3duQm94
UGFkZGluZ0JvdHRvbSA9IDI7Ci0gICAgY29uc3QgaW50IGRyb3BEb3duQm94UGFkZGluZ0xlZnQg
ICA9IHN0eWxlLT5kaXJlY3Rpb24oKSA9PSBMVFIgPyA0IDogNCArIGRyb3BEb3duQnV0dG9uV2lk
dGg7Ci0gICAgLy8gVGhlIDxzZWxlY3Q+IGJveCBtdXN0IGJlIGF0IGxlYXN0IDEycHggaGlnaCBm
b3IgdGhlIGJ1dHRvbiB0byByZW5kZXIgbmljZWx5IG9uIFdpbmRvd3MKLSAgICBjb25zdCBpbnQg
ZHJvcERvd25Cb3hNaW5IZWlnaHQgPSAxMjsKLQotICAgIC8vIFBvc2l0aW9uIHRoZSB0ZXh0IGNv
cnJlY3RseSB3aXRoaW4gdGhlIHNlbGVjdCBib3ggYW5kIG1ha2UgdGhlIGJveCB3aWRlIGVub3Vn
aCB0byBmaXQgdGhlIGRyb3Bkb3duIGJ1dHRvbgotICAgIHN0eWxlLT5zZXRQYWRkaW5nVG9wKExl
bmd0aChkcm9wRG93bkJveFBhZGRpbmdUb3AsIEZpeGVkKSk7Ci0gICAgc3R5bGUtPnNldFBhZGRp
bmdSaWdodChMZW5ndGgoZHJvcERvd25Cb3hQYWRkaW5nUmlnaHQsIEZpeGVkKSk7Ci0gICAgc3R5
bGUtPnNldFBhZGRpbmdCb3R0b20oTGVuZ3RoKGRyb3BEb3duQm94UGFkZGluZ0JvdHRvbSwgRml4
ZWQpKTsKLSAgICBzdHlsZS0+c2V0UGFkZGluZ0xlZnQoTGVuZ3RoKGRyb3BEb3duQm94UGFkZGlu
Z0xlZnQsIEZpeGVkKSk7Ci0KLSAgICAvLyBIZWlnaHQgaXMgbG9ja2VkIHRvIGF1dG8KLSAgICBz
dHlsZS0+c2V0SGVpZ2h0KExlbmd0aChBdXRvKSk7Ci0KLSAgICAvLyBDYWxjdWxhdGUgb3VyIG1p
bi1oZWlnaHQKLSAgICBpbnQgbWluSGVpZ2h0ID0gc3R5bGUtPmZvbnQoKS5oZWlnaHQoKTsKLSAg
ICBtaW5IZWlnaHQgPSBtYXgobWluSGVpZ2h0LCBkcm9wRG93bkJveE1pbkhlaWdodCk7Ci0KLSAg
ICBzdHlsZS0+c2V0TWluSGVpZ2h0KExlbmd0aChtaW5IZWlnaHQsIEZpeGVkKSk7Ci0KLSAgICAv
LyBXaGl0ZS1zcGFjZSBpcyBsb2NrZWQgdG8gcHJlCi0gICAgc3R5bGUtPnNldFdoaXRlU3BhY2Uo
UFJFKTsKLQotICAgIERXT1JEIGNvbG9yTWVudSA9IEdldFN5c0NvbG9yKENPTE9SX01FTlUpOwot
ICAgIERXT1JEIGNvbG9yTWVudVRleHQgPSBHZXRTeXNDb2xvcihDT0xPUl9NRU5VVEVYVCk7Ci0g
ICAgQ29sb3IgYmdDb2xvcihHZXRSVmFsdWUoY29sb3JNZW51KSwgR2V0R1ZhbHVlKGNvbG9yTWVu
dSksIEdldEJWYWx1ZShjb2xvck1lbnUpLCAyNTUpOwotICAgIENvbG9yIHRleHRDb2xvcihHZXRS
VmFsdWUoY29sb3JNZW51VGV4dCksIEdldEdWYWx1ZShjb2xvck1lbnVUZXh0KSwgR2V0QlZhbHVl
KGNvbG9yTWVudVRleHQpLCAyNTUpOwotICAgIGlmIChiZ0NvbG9yID09IHRleHRDb2xvcikKLSAg
ICAgICAgdGV4dENvbG9yLnNldFJHQigofmJnQ29sb3IucmdiKCkpIHwgMHhGRjAwMDAwMCk7Ci0g
ICAgc3R5bGUtPmNsZWFyQmFja2dyb3VuZExheWVycygpOwotICAgIHN0eWxlLT5hY2Nlc3NCYWNr
Z3JvdW5kTGF5ZXJzKCktPnNldENsaXAoQ29udGVudEZpbGxCb3gpOwotICAgIHN0eWxlLT5zZXRC
YWNrZ3JvdW5kQ29sb3IoYmdDb2xvcik7Ci0gICAgc3R5bGUtPnNldENvbG9yKHRleHRDb2xvcik7
Ci19Ci0KLSNpZiBFTkFCTEUoVklERU8pCi0vLyBBdHRlbXB0IHRvIHJldHJpZXZlIGEgSFRNTE1l
ZGlhRWxlbWVudCBmcm9tIGEgTm9kZS4gUmV0dXJucyAwIGlmIG9uZSBjYW5ub3QgYmUgZm91bmQu
Ci1zdGF0aWMgSFRNTE1lZGlhRWxlbWVudCogbWVkaWFFbGVtZW50UGFyZW50KE5vZGUqIG5vZGUp
Ci17Ci0gICAgaWYgKCFub2RlKQotICAgICAgICByZXR1cm4gMDsKLSAgICBOb2RlKiBtZWRpYU5v
ZGUgPSBub2RlLT5zaGFkb3dBbmNlc3Rvck5vZGUoKTsKLSAgICBpZiAoIW1lZGlhTm9kZSB8fCAo
IW1lZGlhTm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OnZpZGVvVGFnKSAmJiAhbWVkaWFOb2Rl
LT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6YXVkaW9UYWcpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0K
LSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTE1lZGlhRWxlbWVudCo+KG1lZGlhTm9kZSk7Ci19
Ci0jZW5kaWYKLQotYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludFNsaWRlclRyYWNrKFJlbmRl
ck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIGksIGNvbnN0IEludFJl
Y3QmIHIpCi17Ci0gICAgYm9vbCByYyA9IFJlbmRlclRoZW1lOjpwYWludFNsaWRlclRyYWNrKG8s
IGksIHIpOwotICAgIEludFBvaW50IGxlZnQgPSBJbnRQb2ludChyLngoKSArIDIsIChyLnkoKSAr
IHIuYm90dG9tKCkpIC8gMik7Ci0gICAgaS5jb250ZXh0LT5zYXZlKCk7Ci0gICAgaS5jb250ZXh0
LT5zZXRTdHJva2VDb2xvcihDb2xvcjo6Z3JheSwgRGV2aWNlQ29sb3JTcGFjZSk7Ci0gICAgaS5j
b250ZXh0LT5zZXRGaWxsQ29sb3IoQ29sb3I6OmdyYXksIERldmljZUNvbG9yU3BhY2UpOwotICAg
IGkuY29udGV4dC0+ZmlsbFJlY3Qocik7Ci0jaWYgRU5BQkxFKFZJREVPKQotICAgIEhUTUxNZWRp
YUVsZW1lbnQqIG1lZGlhRWxlbWVudCA9IG1lZGlhRWxlbWVudFBhcmVudChvLT5ub2RlKCkpOwot
ICAgIGlmIChtZWRpYUVsZW1lbnQpIHsKLSAgICAgICAgaS5jb250ZXh0LT5zZXRTdHJva2VDb2xv
cihDb2xvcigwLCAweGZmLCAwKSk7Ci0gICAgICAgIEludFBvaW50IHJpZ2h0ID0gSW50UG9pbnQo
bGVmdC54KCkgKyBtZWRpYUVsZW1lbnQtPnBlcmNlbnRMb2FkZWQoKSAqIChyLnJpZ2h0KCkgLSBy
LngoKSAtIDQpLCAoci55KCkgKyByLmJvdHRvbSgpKSAvIDIpOwotICAgICAgICBpLmNvbnRleHQt
PmRyYXdMaW5lKGxlZnQsIHJpZ2h0KTsKLSAgICAgICAgbGVmdCA9IHJpZ2h0OwotICAgIH0KLSNl
bmRpZgotICAgIGkuY29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoQ29sb3I6OmJsYWNrLCBEZXZpY2VD
b2xvclNwYWNlKTsKLSAgICBpLmNvbnRleHQtPmRyYXdMaW5lKGxlZnQsIEludFBvaW50KHIucmln
aHQoKSAtIDIsIGxlZnQueSgpKSk7Ci0gICAgaS5jb250ZXh0LT5yZXN0b3JlKCk7Ci0gICAgcmV0
dXJuIHJjOwotfQotCi1ib29sIFJlbmRlclRoZW1lV2luY2U6OnBhaW50U2xpZGVyVGh1bWIoUmVu
ZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgaSwgY29uc3QgSW50
UmVjdCYgcikKLXsKLSAgICBib29sIHJjID0gUmVuZGVyVGhlbWU6OnBhaW50U2xpZGVyVGh1bWIo
bywgaSwgcik7Ci0gICAgaS5jb250ZXh0LT5zYXZlKCk7Ci0gICAgaS5jb250ZXh0LT5zZXRTdHJv
a2VDb2xvcihDb2xvcjo6YmxhY2ssIERldmljZUNvbG9yU3BhY2UpOwotICAgIGkuY29udGV4dC0+
c2V0RmlsbENvbG9yKENvbG9yOjpibGFjaywgRGV2aWNlQ29sb3JTcGFjZSk7Ci0jaWYgRU5BQkxF
KFZJREVPKQotICAgIEhUTUxNZWRpYUVsZW1lbnQqIG1lZGlhRWxlbWVudCA9IG1lZGlhRWxlbWVu
dFBhcmVudChvLT5ub2RlKCkpOwotICAgIGlmIChtZWRpYUVsZW1lbnQpIHsKLSAgICAgICAgZmxv
YXQgcHQgPSAobWVkaWFFbGVtZW50LT5jdXJyZW50VGltZSgpIC0gbWVkaWFFbGVtZW50LT5zdGFy
dFRpbWUoKSkgLyBtZWRpYUVsZW1lbnQtPmR1cmF0aW9uKCk7Ci0gICAgICAgIEZsb2F0UmVjdCBp
bnRSZWN0ID0gcjsKLSAgICAgICAgaW50UmVjdC5zZXRYKGludFJlY3QueCgpICsgaW50UmVjdC53
aWR0aCgpICogcHQgLSAyKTsKLSAgICAgICAgaW50UmVjdC5zZXRXaWR0aCg1KTsKLSAgICAgICAg
aS5jb250ZXh0LT5maWxsUmVjdChpbnRSZWN0KTsKLSAgICB9Ci0jZW5kaWYKLSAgICBpLmNvbnRl
eHQtPnJlc3RvcmUoKTsKLSAgICByZXR1cm4gcmM7Ci19Ci0KLWludCBSZW5kZXJUaGVtZVdpbmNl
OjpidXR0b25JbnRlcm5hbFBhZGRpbmdMZWZ0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gMzsKLX0K
LQotaW50IFJlbmRlclRoZW1lV2luY2U6OmJ1dHRvbkludGVybmFsUGFkZGluZ1JpZ2h0KCkgY29u
c3QKLXsKLSAgICByZXR1cm4gMzsKLX0KLQotaW50IFJlbmRlclRoZW1lV2luY2U6OmJ1dHRvbklu
dGVybmFsUGFkZGluZ1RvcCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLWludCBSZW5k
ZXJUaGVtZVdpbmNlOjpidXR0b25JbnRlcm5hbFBhZGRpbmdCb3R0b20oKSBjb25zdAotewotICAg
IHJldHVybiAxOwotfQotCi12b2lkIFJlbmRlclRoZW1lV2luY2U6OmFkanVzdFNlYXJjaEZpZWxk
U3R5bGUoQ1NTU3R5bGVTZWxlY3Rvciogc2VsZWN0b3IsIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxl
bWVudCogZSkgY29uc3QKLXsKLSAgICBjb25zdCBpbnQgcGFkZGluZyA9IDE7Ci0gICAgc3R5bGUt
PnNldFBhZGRpbmdMZWZ0KExlbmd0aChwYWRkaW5nLCBGaXhlZCkpOwotICAgIHN0eWxlLT5zZXRQ
YWRkaW5nUmlnaHQoTGVuZ3RoKHBhZGRpbmcsIEZpeGVkKSk7Ci0gICAgc3R5bGUtPnNldFBhZGRp
bmdUb3AoTGVuZ3RoKHBhZGRpbmcsIEZpeGVkKSk7Ci0gICAgc3R5bGUtPnNldFBhZGRpbmdCb3R0
b20oTGVuZ3RoKHBhZGRpbmcsIEZpeGVkKSk7Ci19Ci0KLSNpZiBFTkFCTEUoVklERU8pCi0KLWJv
b2wgUmVuZGVyVGhlbWVXaW5jZTo6cGFpbnRNZWRpYUZ1bGxzY3JlZW5CdXR0b24oUmVuZGVyT2Jq
ZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJ
bnRSZWN0JiByKQotewotICAgIGJvb2wgcmMgPSBwYWludEJ1dHRvbihvLCBwYWludEluZm8sIHIp
OwotICAgIEZsb2F0UmVjdCBpbVJlY3QgPSByOwotICAgIGltUmVjdC5pbmZsYXRlKC0yKTsKLSAg
ICBwYWludEluZm8uY29udGV4dC0+c2F2ZSgpOwotICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRT
dHJva2VDb2xvcihDb2xvcjo6YmxhY2spOwotICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRGaWxs
Q29sb3IoQ29sb3I6OmdyYXkpOwotICAgIHBhaW50SW5mby5jb250ZXh0LT5maWxsUmVjdChpbVJl
Y3QpOwotICAgIHBhaW50SW5mby5jb250ZXh0LT5yZXN0b3JlKCk7Ci0gICAgcmV0dXJuIHJjOwot
fQotCi1ib29sIFJlbmRlclRoZW1lV2luY2U6OnBhaW50TWVkaWFNdXRlQnV0dG9uKFJlbmRlck9i
amVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgY29uc3Qg
SW50UmVjdCYgcikKLXsKLSAgICBib29sIHJjID0gcGFpbnRCdXR0b24obywgcGFpbnRJbmZvLCBy
KTsKLSAgICBIVE1MTWVkaWFFbGVtZW50KiBtZWRpYUVsZW1lbnQgPSBtZWRpYUVsZW1lbnRQYXJl
bnQoby0+bm9kZSgpKTsKLSAgICBib29sIG11dGVkID0gIW1lZGlhRWxlbWVudCB8fCBtZWRpYUVs
ZW1lbnQtPm11dGVkKCk7Ci0gICAgRmxvYXRSZWN0IGltUmVjdCA9IHI7Ci0gICAgaW1SZWN0Lmlu
ZmxhdGUoLTIpOwotICAgIHBhaW50SW5mby5jb250ZXh0LT5zYXZlKCk7Ci0gICAgcGFpbnRJbmZv
LmNvbnRleHQtPnNldFN0cm9rZUNvbG9yKENvbG9yOjpibGFjayk7Ci0gICAgcGFpbnRJbmZvLmNv
bnRleHQtPnNldEZpbGxDb2xvcihDb2xvcjo6YmxhY2spOwotICAgIEZsb2F0UG9pbnQgcHRzWzZd
ID0gewotICAgICAgICBGbG9hdFBvaW50KGltUmVjdC54KCkgKyAxLCBpbVJlY3QueSgpICsgaW1S
ZWN0LmhlaWdodCgpIC8gMy4wKSwKLSAgICAgICAgRmxvYXRQb2ludChpbVJlY3QueCgpICsgMSAr
IGltUmVjdC53aWR0aCgpIC8gMi4wLCBpbVJlY3QueSgpICsgaW1SZWN0LmhlaWdodCgpIC8gMy4w
KSwKLSAgICAgICAgRmxvYXRQb2ludChpbVJlY3QucmlnaHQoKSAtIDEsIGltUmVjdC55KCkpLAot
ICAgICAgICBGbG9hdFBvaW50KGltUmVjdC5yaWdodCgpIC0gMSwgaW1SZWN0LmJvdHRvbSgpKSwK
LSAgICAgICAgRmxvYXRQb2ludChpbVJlY3QueCgpICsgMSArIGltUmVjdC53aWR0aCgpIC8gMi4w
LCBpbVJlY3QueSgpICsgMi4wICogaW1SZWN0LmhlaWdodCgpIC8gMy4wKSwKLSAgICAgICAgRmxv
YXRQb2ludChpbVJlY3QueCgpICsgMSwgaW1SZWN0LnkoKSArIDIuMCAqIGltUmVjdC5oZWlnaHQo
KSAvIDMuMCkKLSAgICB9OwotICAgIHBhaW50SW5mby5jb250ZXh0LT5kcmF3Q29udmV4UG9seWdv
big2LCBwdHMpOwotICAgIGlmIChtdXRlZCkKLSAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPmRy
YXdMaW5lKEludFBvaW50KGltUmVjdC5yaWdodCgpLCBpbVJlY3QueSgpKSwgSW50UG9pbnQoaW1S
ZWN0LngoKSwgaW1SZWN0LmJvdHRvbSgpKSk7Ci0gICAgcGFpbnRJbmZvLmNvbnRleHQtPnJlc3Rv
cmUoKTsKLSAgICByZXR1cm4gcmM7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVXaW5jZTo6cGFpbnRN
ZWRpYVBsYXlCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50
SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQotewotICAgIGJvb2wgcmMgPSBwYWlu
dEJ1dHRvbihvLCBwYWludEluZm8sIHIpOwotICAgIEZsb2F0UmVjdCBpbVJlY3QgPSByOwotICAg
IGltUmVjdC5pbmZsYXRlKC0zKTsKLSAgICBwYWludEluZm8uY29udGV4dC0+c2F2ZSgpOwotICAg
IHBhaW50SW5mby5jb250ZXh0LT5zZXRTdHJva2VDb2xvcihDb2xvcjo6YmxhY2spOwotICAgIHBh
aW50SW5mby5jb250ZXh0LT5zZXRGaWxsQ29sb3IoQ29sb3I6OmJsYWNrKTsKLSAgICBIVE1MTWVk
aWFFbGVtZW50KiBtZWRpYUVsZW1lbnQgPSBtZWRpYUVsZW1lbnRQYXJlbnQoby0+bm9kZSgpKTsK
LSAgICBib29sIHBhdXNlZCA9ICFtZWRpYUVsZW1lbnQgfHwgbWVkaWFFbGVtZW50LT5wYXVzZWQo
KTsKLSAgICBpZiAocGF1c2VkKSB7Ci0gICAgICAgIGZsb2F0IHdpZHRoID0gaW1SZWN0LndpZHRo
KCk7Ci0gICAgICAgIGltUmVjdC5zZXRXaWR0aCh3aWR0aCAvIDMuMCk7Ci0gICAgICAgIHBhaW50
SW5mby5jb250ZXh0LT5maWxsUmVjdChpbVJlY3QpOwotICAgICAgICBpbVJlY3QubW92ZSgyLjAg
KiB3aWR0aCAvIDMuMCwgMCk7Ci0gICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5maWxsUmVjdChp
bVJlY3QpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEZsb2F0UG9pbnQgcHRzWzNdID0geyBGbG9h
dFBvaW50KGltUmVjdC54KCksIGltUmVjdC55KCkpLCBGbG9hdFBvaW50KGltUmVjdC5yaWdodCgp
LCAoaW1SZWN0LnkoKSArIGltUmVjdC5ib3R0b20oKSkgLyAyLjApLCBGbG9hdFBvaW50KGltUmVj
dC54KCksIGltUmVjdC5ib3R0b20oKSkgfTsKLSAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPmRy
YXdDb252ZXhQb2x5Z29uKDMsIHB0cyk7Ci0gICAgfQotICAgIHBhaW50SW5mby5jb250ZXh0LT5y
ZXN0b3JlKCk7Ci0gICAgcmV0dXJuIHJjOwotfQotCi1ib29sIFJlbmRlclRoZW1lV2luY2U6OnBh
aW50TWVkaWFTZWVrQmFja0J1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVj
dDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgYm9vbCBy
YyA9IHBhaW50QnV0dG9uKG8sIHBhaW50SW5mbywgcik7Ci0gICAgRmxvYXRSZWN0IGltUmVjdCA9
IHI7Ci0gICAgaW1SZWN0LmluZmxhdGUoLTMpOwotICAgIEZsb2F0UG9pbnQgcHRzWzNdID0geyBG
bG9hdFBvaW50KChpbVJlY3QueCgpICsgaW1SZWN0LnJpZ2h0KCkpIC8gMi4wLCBpbVJlY3QueSgp
KSwgRmxvYXRQb2ludChpbVJlY3QueCgpLCAoaW1SZWN0LnkoKSArIGltUmVjdC5ib3R0b20oKSkg
LyAyLjApLCBGbG9hdFBvaW50KChpbVJlY3QueCgpICsgaW1SZWN0LnJpZ2h0KCkpIC8gMi4wLCBp
bVJlY3QuYm90dG9tKCkpIH07Ci0gICAgRmxvYXRQb2ludCBwdHMyWzNdID0geyBGbG9hdFBvaW50
KGltUmVjdC5yaWdodCgpLCBpbVJlY3QueSgpKSwgRmxvYXRQb2ludCgoaW1SZWN0LngoKSArIGlt
UmVjdC5yaWdodCgpKSAvIDIuMCwgKGltUmVjdC55KCkgKyBpbVJlY3QuYm90dG9tKCkpIC8gMi4w
KSwgRmxvYXRQb2ludChpbVJlY3QucmlnaHQoKSwgaW1SZWN0LmJvdHRvbSgpKSB9OwotICAgIHBh
aW50SW5mby5jb250ZXh0LT5zYXZlKCk7Ci0gICAgcGFpbnRJbmZvLmNvbnRleHQtPnNldFN0cm9r
ZUNvbG9yKENvbG9yOjpibGFjayk7Ci0gICAgcGFpbnRJbmZvLmNvbnRleHQtPnNldEZpbGxDb2xv
cihDb2xvcjo6YmxhY2spOwotICAgIHBhaW50SW5mby5jb250ZXh0LT5kcmF3Q29udmV4UG9seWdv
bigzLCBwdHMpOwotICAgIHBhaW50SW5mby5jb250ZXh0LT5kcmF3Q29udmV4UG9seWdvbigzLCBw
dHMyKTsKLSAgICBwYWludEluZm8uY29udGV4dC0+cmVzdG9yZSgpOwotICAgIHJldHVybiByYzsK
LX0KLQotYm9vbCBSZW5kZXJUaGVtZVdpbmNlOjpwYWludE1lZGlhU2Vla0ZvcndhcmRCdXR0b24o
UmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZv
LCBjb25zdCBJbnRSZWN0JiByKQotewotICAgIGJvb2wgcmMgPSBwYWludEJ1dHRvbihvLCBwYWlu
dEluZm8sIHIpOwotICAgIEZsb2F0UmVjdCBpbVJlY3QgPSByOwotICAgIGltUmVjdC5pbmZsYXRl
KC0zKTsKLSAgICBGbG9hdFBvaW50IHB0c1szXSA9IHsgRmxvYXRQb2ludChpbVJlY3QueCgpLCBp
bVJlY3QueSgpKSwgRmxvYXRQb2ludCgoaW1SZWN0LngoKSArIGltUmVjdC5yaWdodCgpKSAvIDIu
MCwgKGltUmVjdC55KCkgKyBpbVJlY3QuYm90dG9tKCkpIC8gMi4wKSwgRmxvYXRQb2ludChpbVJl
Y3QueCgpLCBpbVJlY3QuYm90dG9tKCkpIH07Ci0gICAgRmxvYXRQb2ludCBwdHMyWzNdID0geyBG
bG9hdFBvaW50KChpbVJlY3QueCgpICsgaW1SZWN0LnJpZ2h0KCkpIC8gMi4wLCBpbVJlY3QueSgp
KSwgRmxvYXRQb2ludChpbVJlY3QucmlnaHQoKSwgKGltUmVjdC55KCkgKyBpbVJlY3QuYm90dG9t
KCkpIC8gMi4wKSwgRmxvYXRQb2ludCgoaW1SZWN0LngoKSArIGltUmVjdC5yaWdodCgpKSAvIDIu
MCwgaW1SZWN0LmJvdHRvbSgpKSB9OwotICAgIHBhaW50SW5mby5jb250ZXh0LT5zYXZlKCk7Ci0g
ICAgcGFpbnRJbmZvLmNvbnRleHQtPnNldFN0cm9rZUNvbG9yKENvbG9yOjpibGFjayk7Ci0gICAg
cGFpbnRJbmZvLmNvbnRleHQtPnNldEZpbGxDb2xvcihDb2xvcjo6YmxhY2spOwotICAgIHBhaW50
SW5mby5jb250ZXh0LT5kcmF3Q29udmV4UG9seWdvbigzLCBwdHMpOwotICAgIHBhaW50SW5mby5j
b250ZXh0LT5kcmF3Q29udmV4UG9seWdvbigzLCBwdHMyKTsKLSAgICBwYWludEluZm8uY29udGV4
dC0+cmVzdG9yZSgpOwotICAgIHJldHVybiByYzsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZVdpbmNl
OjpwYWludE1lZGlhU2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmpl
Y3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQotewotICAgIHJldHVy
biBwYWludFNsaWRlclRyYWNrKG8sIHBhaW50SW5mbywgcik7Ci19Ci0KLWJvb2wgUmVuZGVyVGhl
bWVXaW5jZTo6cGFpbnRNZWRpYVNsaWRlclRodW1iKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVu
ZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKLXsKLSAg
ICByZXR1cm4gcGFpbnRTbGlkZXJUaHVtYihvLCBwYWludEluZm8sIHIpOwotfQotI2VuZGlmCi0K
LX0KLQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVXaW5jZS5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lV2luY2UuaAkocmV2aXNpb24gNTcy
ODkpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZVdpbmNlLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgV2Vi
S2l0IHByb2plY3QuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA4IEFwcGxlIENvbXB1
dGVyLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCi0gKgot
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBp
cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMg
bGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICog
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG
aWZ0aCBGbG9vciwKLSAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICoKLSAqLwotCi0j
aWZuZGVmIFJlbmRlclRoZW1lV2luY2VfaAotI2RlZmluZSBSZW5kZXJUaGVtZVdpbmNlX2gKLQot
I2luY2x1ZGUgIlJlbmRlclRoZW1lLmgiCi0KLXR5cGVkZWYgdm9pZCogSEFORExFOwotdHlwZWRl
ZiBzdHJ1Y3QgSElOU1RBTkNFX18qIEhJTlNUQU5DRTsKLXR5cGVkZWYgSElOU1RBTkNFIEhNT0RV
TEU7Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotICAgIHN0cnVjdCBUaGVtZURhdGEgewotICAg
ICAgICBUaGVtZURhdGEoKSA6bV9wYXJ0KDApLCBtX3N0YXRlKDApLCBtX2NsYXNzaWNTdGF0ZSgw
KSB7fQotICAgICAgICBUaGVtZURhdGEoaW50IHBhcnQsIGludCBzdGF0ZSkKLSAgICAgICAgICAg
IDogbV9wYXJ0KHBhcnQpCi0gICAgICAgICAgICAsIG1fc3RhdGUoc3RhdGUpCi0gICAgICAgICAg
ICAsIG1fY2xhc3NpY1N0YXRlKDApCi0gICAgICAgIHsgfQotCi0gICAgICAgIHVuc2lnbmVkIG1f
cGFydDsKLSAgICAgICAgdW5zaWduZWQgbV9zdGF0ZTsKLSAgICAgICAgdW5zaWduZWQgbV9jbGFz
c2ljU3RhdGU7Ci0gICAgfTsKLQotICAgIGNsYXNzIFJlbmRlclRoZW1lV2luY2UgOiBwdWJsaWMg
UmVuZGVyVGhlbWUgewotICAgIHB1YmxpYzoKLSAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8UmVu
ZGVyVGhlbWU+IGNyZWF0ZSgpOwotICAgICAgICB+UmVuZGVyVGhlbWVXaW5jZSgpOwotCi0gICAg
ICAgIHZpcnR1YWwgU3RyaW5nIGV4dHJhRGVmYXVsdFN0eWxlU2hlZXQoKTsKLSAgICAgICAgdmly
dHVhbCBTdHJpbmcgZXh0cmFRdWlya3NTdHlsZVNoZWV0KCk7Ci0KLSAgICAgICAgLy8gQSBtZXRo
b2QgYXNraW5nIGlmIHRoZSB0aGVtZSdzIGNvbnRyb2xzIGFjdHVhbGx5IGNhcmUgYWJvdXQgcmVk
cmF3aW5nIHdoZW4gaG92ZXJlZC4KLSAgICAgICAgdmlydHVhbCBib29sIHN1cHBvcnRzSG92ZXIo
Y29uc3QgUmVuZGVyU3R5bGUqKSBjb25zdDsKLQotICAgICAgICB2aXJ0dWFsIENvbG9yIHBsYXRm
b3JtQWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1
YWwgQ29sb3IgcGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0
OwotICAgICAgICB2aXJ0dWFsIENvbG9yIHBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uRm9yZWdyb3Vu
ZENvbG9yKCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgQ29sb3IgcGxhdGZvcm1JbmFjdGl2ZVNl
bGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0OwotCi0gICAgICAgIC8vIFN5c3RlbSBmb250
cy4KLSAgICAgICAgdmlydHVhbCB2b2lkIHN5c3RlbUZvbnQoaW50IHByb3BJZCwgRm9udERlc2Ny
aXB0aW9uJikgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgQ29sb3Igc3lzdGVtQ29sb3IoaW50IGNz
c1ZhbHVlSWQpIGNvbnN0OwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCBwYWludENoZWNrYm94KFJl
bmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIGksIGNvbnN0IElu
dFJlY3QmIHIpCi0gICAgICAgIHsgcmV0dXJuIHBhaW50QnV0dG9uKG8sIGksIHIpOyB9Ci0gICAg
ICAgIHZpcnR1YWwgdm9pZCBzZXRDaGVja2JveFNpemUoUmVuZGVyU3R5bGUqKSBjb25zdDsKLQot
ICAgICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRSYWRpbyhSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJl
bmRlck9iamVjdDo6UGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByKQotICAgICAgICB7IHJl
dHVybiBwYWludEJ1dHRvbihvLCBpLCByKTsgfQotICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UmFk
aW9TaXplKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKLSAgICAgICAgeyByZXR1cm4gc2V0Q2hl
Y2tib3hTaXplKHN0eWxlKTsgfQotCi0gICAgICAgIHZpcnR1YWwgYm9vbCBwYWludEJ1dHRvbihS
ZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0IEludFJl
Y3QmKTsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRUZXh0RmllbGQoUmVuZGVyT2JqZWN0
KiwgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7Ci0KLSAg
ICAgICAgdmlydHVhbCBib29sIHBhaW50VGV4dEFyZWEoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBS
ZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgaSwgY29uc3QgSW50UmVjdCYgcikKLSAgICAgICAgeyBy
ZXR1cm4gcGFpbnRUZXh0RmllbGQobywgaSwgcik7IH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQg
YWRqdXN0TWVudUxpc3RTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5
bGUqIHN0eWxlLCBFbGVtZW50KiBlKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCBib29sIHBhaW50
TWVudUxpc3QoUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBj
b25zdCBJbnRSZWN0Jik7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RNZW51TGlzdEJ1dHRv
blN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVs
ZW1lbnQqIGUpIGNvbnN0OwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCBwYWludE1lbnVMaXN0QnV0
dG9uKFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3Qg
SW50UmVjdCYpOwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCBwYWludFNsaWRlclRyYWNrKFJlbmRl
ck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIGksIGNvbnN0IEludFJl
Y3QmIHIpOwotICAgICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTbGlkZXJUaHVtYihSZW5kZXJPYmpl
Y3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiBy
KTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGFkanVzdFNsaWRlclRodW1iU2l6ZShSZW5kZXJPYmpl
Y3QqKSBjb25zdDsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgcG9wdXBPcHRpb25TdXBwb3J0c1Rl
eHRJbmRlbnQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICAgICAgdmlydHVhbCBpbnQg
YnV0dG9uSW50ZXJuYWxQYWRkaW5nTGVmdCgpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIGludCBi
dXR0b25JbnRlcm5hbFBhZGRpbmdSaWdodCgpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIGludCBi
dXR0b25JbnRlcm5hbFBhZGRpbmdUb3AoKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCBpbnQgYnV0
dG9uSW50ZXJuYWxQYWRkaW5nQm90dG9tKCkgY29uc3Q7Ci0KLSAgICAgICAgdmlydHVhbCB2b2lk
IGFkanVzdFNlYXJjaEZpZWxkU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiwg
RWxlbWVudCopIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTZWFyY2hGaWVsZChS
ZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0IEludFJl
Y3QmKTsKLQotICAgICAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0U2VhcmNoRmllbGRDYW5jZWxCdXR0
b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7
Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBwYWludFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uKFJlbmRl
ck9iamVjdCosIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYp
OwotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RTZWFyY2hGaWVsZERlY29yYXRpb25TdHls
ZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7Ci0gICAg
ICAgIHZpcnR1YWwgYm9vbCBwYWludFNlYXJjaEZpZWxkRGVjb3JhdGlvbihSZW5kZXJPYmplY3Qq
LCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKSB7IHJldHVy
biBmYWxzZTsgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RTZWFyY2hGaWVsZFJlc3Vs
dHNEZWNvcmF0aW9uU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiwgRWxlbWVu
dCopIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTZWFyY2hGaWVsZFJlc3VsdHNE
ZWNvcmF0aW9uKFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwg
Y29uc3QgSW50UmVjdCYpOwotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RTZWFyY2hGaWVs
ZFJlc3VsdHNCdXR0b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVt
ZW50KikgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBwYWludFNlYXJjaEZpZWxkUmVzdWx0
c0J1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNv
bnN0IEludFJlY3QmKTsKLQotICAgICAgICB2aXJ0dWFsIHZvaWQgdGhlbWVDaGFuZ2VkKCk7Ci0K
LSAgICAgICAgdmlydHVhbCB2b2lkIGFkanVzdEJ1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3Iq
LCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdCB7fQotICAgICAgICB2aXJ0dWFs
IHZvaWQgYWRqdXN0VGV4dEZpZWxkU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxl
KiBzdHlsZSwgRWxlbWVudCopIGNvbnN0IHt9Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RU
ZXh0QXJlYVN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1l
bnQqKSBjb25zdCB7fQotCi0gICAgICAgIHN0YXRpYyB2b2lkIHNldFdlYktpdElzQmVpbmdVbmxv
YWRlZCgpOwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0ZvY3VzUmluZyhjb25zdCBS
ZW5kZXJTdHlsZSopIGNvbnN0OwotCi0gICAgI2lmIEVOQUJMRShWSURFTykKLSAgICAgICAgdmly
dHVhbCBib29sIHBhaW50TWVkaWFGdWxsc2NyZWVuQnV0dG9uKFJlbmRlck9iamVjdCosIGNvbnN0
IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwotICAgICAgICB2aXJ0
dWFsIGJvb2wgcGFpbnRNZWRpYVBsYXlCdXR0b24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVy
T2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7Ci0gICAgICAgIHZpcnR1YWwgYm9v
bCBwYWludE1lZGlhTXV0ZUJ1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6
OlBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKLSAgICAgICAgdmlydHVhbCBib29sIHBhaW50
TWVkaWFTZWVrQmFja0J1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBh
aW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKLSAgICAgICAgdmlydHVhbCBib29sIHBhaW50TWVk
aWFTZWVrRm9yd2FyZEJ1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBh
aW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKLSAgICAgICAgdmlydHVhbCBib29sIHBhaW50TWVk
aWFTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5m
byYsIGNvbnN0IEludFJlY3QmKTsKLSAgICAgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFTbGlk
ZXJUaHVtYihSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNv
bnN0IEludFJlY3QmKTsKLSAgICAjZW5kaWYKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIFJlbmRl
clRoZW1lV2luY2UoKTsKLQotICAgICAgICB1bnNpZ25lZCBkZXRlcm1pbmVDbGFzc2ljU3RhdGUo
UmVuZGVyT2JqZWN0Kik7Ci0gICAgICAgIGJvb2wgc3VwcG9ydHNGb2N1cyhDb250cm9sUGFydCkg
Y29uc3Q7Ci0KLSAgICAgICAgVGhlbWVEYXRhIGdldFRoZW1lRGF0YShSZW5kZXJPYmplY3QqKTsK
LSAgICB9OwotCi19OwotCi0jZW5kaWYKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS93aW5jZS9EYXRh
YmFzZVRocmVhZFdpbkNFLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2Uvd2luY2Uv
RGF0YWJhc2VUaHJlYWRXaW5DRS5jcHAJKHJldmlzaW9uIDU3Mjg5KQkoZnJvbSBXZWJDb3JlL3N0
b3JhZ2Uvd2luY2UvRGF0YWJhc2VUaHJlYWRXaW5jZS5jcHA6NTcyODkpCisrKyBXZWJDb3JlL3N0
b3JhZ2Uvd2luY2UvRGF0YWJhc2VUaHJlYWRXaW5DRS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRp
c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaSB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lU
SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgor
ICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g
IFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl
IGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhl
IEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMg
bGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICog
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwg
RmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkRhdGFiYXNlVGhyZWFkLmgiCisKKyNpbmNsdWRl
ICJEYXRhYmFzZS5oIgorI2luY2x1ZGUgIkRhdGFiYXNlVGFzay5oIgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKK0RhdGFiYXNlVGhyZWFkOjpEYXRhYmFzZVRocmVhZCgpCis6IG1fdGltZXIodGhp
cywgJkRhdGFiYXNlVGhyZWFkOjp0aW1lckZpcmVkKQoreworfQorCitEYXRhYmFzZVRocmVhZDo6
fkRhdGFiYXNlVGhyZWFkKCkKK3sKK30KKwordm9pZCBEYXRhYmFzZVRocmVhZDo6cmVxdWVzdFRl
cm1pbmF0aW9uKCkKK3sKKyAgICBtX3F1ZXVlLmNsZWFyKCk7Cit9CisKK2Jvb2wgRGF0YWJhc2VU
aHJlYWQ6OnRlcm1pbmF0aW9uUmVxdWVzdGVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9xdWV1
ZS5pc0VtcHR5KCk7Cit9CisKK3ZvaWQgRGF0YWJhc2VUaHJlYWQ6OnRpbWVyRmlyZWQoVGltZXI8
RGF0YWJhc2VUaHJlYWQ+KikKK3sKKyAgICBpZiAoIW1fcXVldWUuaXNFbXB0eSgpKSB7CisgICAg
ICAgIFJlZlB0cjxEYXRhYmFzZVRhc2s+IHRhc2sgPSBtX3F1ZXVlLmZpcnN0KCk7CisgICAgICAg
IHRhc2stPnBlcmZvcm1UYXNrKCk7CisgICAgICAgIG1fcXVldWUucmVtb3ZlRmlyc3QoKTsKKyAg
ICAgICAgaWYgKCFtX3F1ZXVlLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIG1fdGltZXIuc3RhcnRP
bmVTaG90KDApOworICAgIH0KK30KKwordm9pZCBEYXRhYmFzZVRocmVhZDo6c2NoZWR1bGVUYXNr
KFBhc3NSZWZQdHI8RGF0YWJhc2VUYXNrPiB0YXNrKQoreworICAgIG1fcXVldWUuYXBwZW5kKHRh
c2spOworICAgIGlmICghbV90aW1lci5pc0FjdGl2ZSgpKQorICAgICAgICBtX3RpbWVyLnN0YXJ0
T25lU2hvdCgwKTsKK30KKwordm9pZCBEYXRhYmFzZVRocmVhZDo6c2NoZWR1bGVJbW1lZGlhdGVU
YXNrKFBhc3NSZWZQdHI8RGF0YWJhc2VUYXNrPiB0YXNrKQoreworICAgIHRhc2stPnBlcmZvcm1U
YXNrKCk7Cit9CisKK3ZvaWQgRGF0YWJhc2VUaHJlYWQ6OnVuc2NoZWR1bGVEYXRhYmFzZVRhc2tz
KERhdGFiYXNlKiBkYXRhYmFzZSkKK3sKKyAgICBEZXF1ZTxSZWZQdHI8RGF0YWJhc2VUYXNrPiA+
IHJlc2VydmVkVGFza3M7CisgICAgZm9yIChEZXF1ZTxSZWZQdHI8RGF0YWJhc2VUYXNrPiA+Ojpj
b25zdF9pdGVyYXRvciBpID0gbV9xdWV1ZS5iZWdpbigpOyBpICE9IG1fcXVldWUuZW5kKCk7ICsr
aSkgeworICAgICAgICBpZiAoKCppKS0+ZGF0YWJhc2UoKSAhPSBkYXRhYmFzZSkKKyAgICAgICAg
ICAgIHJlc2VydmVkVGFza3MuYXBwZW5kKCppKTsKKyAgICB9CisKKyAgICBtX3F1ZXVlLnN3YXAo
cmVzZXJ2ZWRUYXNrcyk7Cit9CisKK3ZvaWQgRGF0YWJhc2VUaHJlYWQ6OnJlY29yZERhdGFiYXNl
T3BlbihEYXRhYmFzZSogZGF0YWJhc2UpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwor
dm9pZCBEYXRhYmFzZVRocmVhZDo6cmVjb3JkRGF0YWJhc2VDbG9zZWQoRGF0YWJhc2UqIGRhdGFi
YXNlKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS93aW5jZS9EYXRhYmFzZVRocmVhZFdpbkNFLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL3dpbmNlL0RhdGFiYXNlVGhyZWFkV2luQ0UuaAko
cmV2aXNpb24gNTcyODkpCShmcm9tIFdlYkNvcmUvc3RvcmFnZS93aW5jZS9EYXRhYmFzZVRocmVh
ZFdpbmNlLmg6NTcyODkpCisrKyBXZWJDb3JlL3N0b3JhZ2Uvd2luY2UvRGF0YWJhc2VUaHJlYWRX
aW5DRS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGkg
d2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2
ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxk
IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5H
LkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEg
MDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgRGF0YWJhc2VUaHJlYWRXaW5jZV9oCisj
ZGVmaW5lIERhdGFiYXNlVGhyZWFkV2luY2VfaAorCisjaW5jbHVkZSA8d3RmL0RlcXVlLmg+Cisj
aW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAg
Y2xhc3MgRGF0YWJhc2U7CisgICAgY2xhc3MgRGF0YWJhc2VUYXNrOworCisgICAgY2xhc3MgRGF0
YWJhc2VUaHJlYWQ6IHB1YmxpYyBXVEY6OlJlZkNvdW50ZWQ8RGF0YWJhc2VUaHJlYWQ+IHsKKwor
ICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8RGF0YWJhc2VUaHJlYWQ+IGNy
ZWF0ZSgpIHsgcmV0dXJuIGFkb3B0UmVmKG5ldyBEYXRhYmFzZVRocmVhZCk7IH0KKyAgICAgICAg
fkRhdGFiYXNlVGhyZWFkKCk7CisKKyAgICAgICAgYm9vbCBzdGFydCgpIHsgcmV0dXJuIHRydWU7
IH0KKyAgICAgICAgdm9pZCByZXF1ZXN0VGVybWluYXRpb24oKTsKKyAgICAgICAgYm9vbCB0ZXJt
aW5hdGlvblJlcXVlc3RlZCgpIGNvbnN0OworCisgICAgICAgIHZvaWQgc2NoZWR1bGVUYXNrKFBh
c3NSZWZQdHI8RGF0YWJhc2VUYXNrPik7CisgICAgICAgIHZvaWQgc2NoZWR1bGVJbW1lZGlhdGVU
YXNrKFBhc3NSZWZQdHI8RGF0YWJhc2VUYXNrPik7CisgICAgICAgIHZvaWQgdW5zY2hlZHVsZURh
dGFiYXNlVGFza3MoRGF0YWJhc2UqKTsKKyAgICAgICAgdm9pZCByZWNvcmREYXRhYmFzZU9wZW4o
RGF0YWJhc2UqKTsKKyAgICAgICAgdm9pZCByZWNvcmREYXRhYmFzZUNsb3NlZChEYXRhYmFzZSop
OworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgVGhyZWFkSWRlbnRpZmllciBnZXRUaHJlYWRJRCgp
IGNvbnN0IHsgcmV0dXJuIGN1cnJlbnRUaHJlYWQoKTsgfQorI2VuZGlmCisKKyAgICBwcml2YXRl
OgorICAgICAgICBEYXRhYmFzZVRocmVhZCgpOworCisgICAgICAgIHZvaWQgdGltZXJGaXJlZChU
aW1lcjxEYXRhYmFzZVRocmVhZD4qKTsKKworICAgICAgICBEZXF1ZTxSZWZQdHI8RGF0YWJhc2VU
YXNrPiA+IG1fcXVldWU7CisgICAgICAgIFRpbWVyPERhdGFiYXNlVGhyZWFkPiBtX3RpbWVyOwor
ICAgIH07CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIERhdGFiYXNlVGhy
ZWFkV2luY2UKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS93aW5jZS9EYXRhYmFzZVRocmVhZFdpbkNF
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL3dpbmNlL0RhdGFiYXNlVGhyZWFkV2lu
Q0UuaAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3N0b3JhZ2Uvd2luY2UvRGF0YWJhc2VU
aHJlYWRXaW5DRS5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMSw4ICsyMSw4IEBACiAgKiAgQm9zdG9u
LCBNQSAwMjExMC0xMzAxLCBVU0EuCiAgKi8KIAotI2lmbmRlZiBEYXRhYmFzZVRocmVhZFdpbmNl
X2gKLSNkZWZpbmUgRGF0YWJhc2VUaHJlYWRXaW5jZV9oCisjaWZuZGVmIERhdGFiYXNlVGhyZWFk
V2luQ0VfaAorI2RlZmluZSBEYXRhYmFzZVRocmVhZFdpbkNFX2gKIAogI2luY2x1ZGUgPHd0Zi9E
ZXF1ZS5oPgogI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CkBAIC02Miw0ICs2Miw0IEBAIG5h
bWVzcGFjZSBXZWJDb3JlIHsKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQogCi0jZW5kaWYgLy8g
RGF0YWJhc2VUaHJlYWRXaW5jZQorI2VuZGlmIC8vIERhdGFiYXNlVGhyZWFkV2luQ0VfaApJbmRl
eDogV2ViQ29yZS9zdG9yYWdlL3dpbmNlL0RhdGFiYXNlVGhyZWFkV2luY2UuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS93aW5jZS9EYXRhYmFzZVRocmVhZFdpbmNlLmNwcAkocmV2
aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3N0b3JhZ2Uvd2luY2UvRGF0YWJhc2VUaHJlYWRXaW5j
ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAo
QykgMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
LSAqCi0gKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaSB3
aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl
biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiAgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQg
aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcu
TElCLiAgSWYgbm90LCB3cml0ZSB0bwotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24s
IEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0gKiAgQm9zdG9uLCBNQSAw
MjExMC0xMzAxLCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkRh
dGFiYXNlVGhyZWFkLmgiCi0KLSNpbmNsdWRlICJEYXRhYmFzZS5oIgotI2luY2x1ZGUgIkRhdGFi
YXNlVGFzay5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLURhdGFiYXNlVGhyZWFkOjpEYXRh
YmFzZVRocmVhZCgpCi06IG1fdGltZXIodGhpcywgJkRhdGFiYXNlVGhyZWFkOjp0aW1lckZpcmVk
KQotewotfQotCi1EYXRhYmFzZVRocmVhZDo6fkRhdGFiYXNlVGhyZWFkKCkKLXsKLX0KLQotdm9p
ZCBEYXRhYmFzZVRocmVhZDo6cmVxdWVzdFRlcm1pbmF0aW9uKCkKLXsKLSAgICBtX3F1ZXVlLmNs
ZWFyKCk7Ci19Ci0KLWJvb2wgRGF0YWJhc2VUaHJlYWQ6OnRlcm1pbmF0aW9uUmVxdWVzdGVkKCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gbV9xdWV1ZS5pc0VtcHR5KCk7Ci19Ci0KLXZvaWQgRGF0YWJh
c2VUaHJlYWQ6OnRpbWVyRmlyZWQoVGltZXI8RGF0YWJhc2VUaHJlYWQ+KikKLXsKLSAgICBpZiAo
IW1fcXVldWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgIFJlZlB0cjxEYXRhYmFzZVRhc2s+IHRhc2sg
PSBtX3F1ZXVlLmZpcnN0KCk7Ci0gICAgICAgIHRhc2stPnBlcmZvcm1UYXNrKCk7Ci0gICAgICAg
IG1fcXVldWUucmVtb3ZlRmlyc3QoKTsKLSAgICAgICAgaWYgKCFtX3F1ZXVlLmlzRW1wdHkoKSkK
LSAgICAgICAgICAgIG1fdGltZXIuc3RhcnRPbmVTaG90KDApOwotICAgIH0KLX0KLQotdm9pZCBE
YXRhYmFzZVRocmVhZDo6c2NoZWR1bGVUYXNrKFBhc3NSZWZQdHI8RGF0YWJhc2VUYXNrPiB0YXNr
KQotewotICAgIG1fcXVldWUuYXBwZW5kKHRhc2spOwotICAgIGlmICghbV90aW1lci5pc0FjdGl2
ZSgpKQotICAgICAgICBtX3RpbWVyLnN0YXJ0T25lU2hvdCgwKTsKLX0KLQotdm9pZCBEYXRhYmFz
ZVRocmVhZDo6c2NoZWR1bGVJbW1lZGlhdGVUYXNrKFBhc3NSZWZQdHI8RGF0YWJhc2VUYXNrPiB0
YXNrKQotewotICAgIHRhc2stPnBlcmZvcm1UYXNrKCk7Ci19Ci0KLXZvaWQgRGF0YWJhc2VUaHJl
YWQ6OnVuc2NoZWR1bGVEYXRhYmFzZVRhc2tzKERhdGFiYXNlKiBkYXRhYmFzZSkKLXsKLSAgICBE
ZXF1ZTxSZWZQdHI8RGF0YWJhc2VUYXNrPiA+IHJlc2VydmVkVGFza3M7Ci0gICAgZm9yIChEZXF1
ZTxSZWZQdHI8RGF0YWJhc2VUYXNrPiA+Ojpjb25zdF9pdGVyYXRvciBpID0gbV9xdWV1ZS5iZWdp
bigpOyBpICE9IG1fcXVldWUuZW5kKCk7ICsraSkgewotICAgICAgICBpZiAoKCppKS0+ZGF0YWJh
c2UoKSAhPSBkYXRhYmFzZSkKLSAgICAgICAgICAgIHJlc2VydmVkVGFza3MuYXBwZW5kKCppKTsK
LSAgICB9Ci0KLSAgICBtX3F1ZXVlLnN3YXAocmVzZXJ2ZWRUYXNrcyk7Ci19Ci0KLXZvaWQgRGF0
YWJhc2VUaHJlYWQ6OnJlY29yZERhdGFiYXNlT3BlbihEYXRhYmFzZSogZGF0YWJhc2UpCi17Ci0g
ICAgbm90SW1wbGVtZW50ZWQoKTsKLX0KLQotdm9pZCBEYXRhYmFzZVRocmVhZDo6cmVjb3JkRGF0
YWJhc2VDbG9zZWQoRGF0YWJhc2UqIGRhdGFiYXNlKQotewotICAgIG5vdEltcGxlbWVudGVkKCk7
Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS93aW5j
ZS9EYXRhYmFzZVRocmVhZFdpbmNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL3dp
bmNlL0RhdGFiYXNlVGhyZWFkV2luY2UuaAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3N0
b3JhZ2Uvd2luY2UvRGF0YWJhc2VUaHJlYWRXaW5jZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDY1
ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFy
ZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogIFRoaXMgbGlicmFyeSBpcyBkaXN0
cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGkgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhP
VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAq
ICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT
ZWUgdGhlIEdOVQotICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk
ZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYWxvbmcgd2l0aCB0aGlzIGxp
YnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAqICB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZp
ZnRoIEZsb29yLAotICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICovCi0KLSNpZm5k
ZWYgRGF0YWJhc2VUaHJlYWRXaW5jZV9oCi0jZGVmaW5lIERhdGFiYXNlVGhyZWFkV2luY2VfaAot
Ci0jaW5jbHVkZSA8d3RmL0RlcXVlLmg+Ci0jaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KLQot
bmFtZXNwYWNlIFdlYkNvcmUgewotCi0gICAgY2xhc3MgRGF0YWJhc2U7Ci0gICAgY2xhc3MgRGF0
YWJhc2VUYXNrOwotCi0gICAgY2xhc3MgRGF0YWJhc2VUaHJlYWQ6IHB1YmxpYyBXVEY6OlJlZkNv
dW50ZWQ8RGF0YWJhc2VUaHJlYWQ+IHsKLQotICAgIHB1YmxpYzoKLSAgICAgICAgc3RhdGljIFBh
c3NSZWZQdHI8RGF0YWJhc2VUaHJlYWQ+IGNyZWF0ZSgpIHsgcmV0dXJuIGFkb3B0UmVmKG5ldyBE
YXRhYmFzZVRocmVhZCk7IH0KLSAgICAgICAgfkRhdGFiYXNlVGhyZWFkKCk7Ci0KLSAgICAgICAg
Ym9vbCBzdGFydCgpIHsgcmV0dXJuIHRydWU7IH0KLSAgICAgICAgdm9pZCByZXF1ZXN0VGVybWlu
YXRpb24oKTsKLSAgICAgICAgYm9vbCB0ZXJtaW5hdGlvblJlcXVlc3RlZCgpIGNvbnN0OwotCi0g
ICAgICAgIHZvaWQgc2NoZWR1bGVUYXNrKFBhc3NSZWZQdHI8RGF0YWJhc2VUYXNrPik7Ci0gICAg
ICAgIHZvaWQgc2NoZWR1bGVJbW1lZGlhdGVUYXNrKFBhc3NSZWZQdHI8RGF0YWJhc2VUYXNrPik7
Ci0gICAgICAgIHZvaWQgdW5zY2hlZHVsZURhdGFiYXNlVGFza3MoRGF0YWJhc2UqKTsKLSAgICAg
ICAgdm9pZCByZWNvcmREYXRhYmFzZU9wZW4oRGF0YWJhc2UqKTsKLSAgICAgICAgdm9pZCByZWNv
cmREYXRhYmFzZUNsb3NlZChEYXRhYmFzZSopOwotI2lmbmRlZiBOREVCVUcKLSAgICAgICAgVGhy
ZWFkSWRlbnRpZmllciBnZXRUaHJlYWRJRCgpIGNvbnN0IHsgcmV0dXJuIGN1cnJlbnRUaHJlYWQo
KTsgfQotI2VuZGlmCi0KLSAgICBwcml2YXRlOgotICAgICAgICBEYXRhYmFzZVRocmVhZCgpOwot
Ci0gICAgICAgIHZvaWQgdGltZXJGaXJlZChUaW1lcjxEYXRhYmFzZVRocmVhZD4qKTsKLQotICAg
ICAgICBEZXF1ZTxSZWZQdHI8RGF0YWJhc2VUYXNrPiA+IG1fcXVldWU7Ci0gICAgICAgIFRpbWVy
PERhdGFiYXNlVGhyZWFkPiBtX3RpbWVyOwotICAgIH07Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKLQotI2VuZGlmIC8vIERhdGFiYXNlVGhyZWFkV2luY2UKSW5kZXg6IFdlYkNvcmUvc3RvcmFn
ZS93aW5jZS9Mb2NhbFN0b3JhZ2VUaHJlYWRXaW5DRS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9zdG9yYWdlL3dpbmNlL0xvY2FsU3RvcmFnZVRocmVhZFdpbkNFLmNwcAkocmV2aXNpb24gNTcy
ODkpCShmcm9tIFdlYkNvcmUvc3RvcmFnZS93aW5jZS9Mb2NhbFN0b3JhZ2VUaHJlYWRXaW5jZS5j
cHA6NTcyODkpCisrKyBXZWJDb3JlL3N0b3JhZ2Uvd2luY2UvTG9jYWxTdG9yYWdlVGhyZWFkV2lu
Q0UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGkg
d2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2
ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxk
IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5H
LkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEg
MDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJM
b2NhbFN0b3JhZ2VUaHJlYWQuaCIKKworI2luY2x1ZGUgIkxvY2FsU3RvcmFnZVRhc2suaCIKKyNp
bmNsdWRlICJTdG9yYWdlQXJlYVN5bmMuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitMb2Nh
bFN0b3JhZ2VUaHJlYWQ6OkxvY2FsU3RvcmFnZVRocmVhZCgpCis6IG1fdGltZXIodGhpcywgJkxv
Y2FsU3RvcmFnZVRocmVhZDo6dGltZXJGaXJlZCkKK3sKK30KKworTG9jYWxTdG9yYWdlVGhyZWFk
Ojp+TG9jYWxTdG9yYWdlVGhyZWFkKCkKK3sKK30KKworYm9vbCBMb2NhbFN0b3JhZ2VUaHJlYWQ6
OnN0YXJ0KCkKK3sKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBMb2NhbFN0b3JhZ2VUaHJl
YWQ6OnRpbWVyRmlyZWQoVGltZXI8TG9jYWxTdG9yYWdlVGhyZWFkPiopCit7CisgICAgaWYgKCFt
X3F1ZXVlLmlzRW1wdHkoKSkgeworICAgICAgICBSZWZQdHI8TG9jYWxTdG9yYWdlVGFzaz4gdGFz
ayA9IG1fcXVldWUuZmlyc3QoKTsKKyAgICAgICAgdGFzay0+cGVyZm9ybVRhc2soKTsKKyAgICAg
ICAgbV9xdWV1ZS5yZW1vdmVGaXJzdCgpOworICAgICAgICBpZiAoIW1fcXVldWUuaXNFbXB0eSgp
KQorICAgICAgICAgICAgbV90aW1lci5zdGFydE9uZVNob3QoMCk7CisgICAgfQorfQorCit2b2lk
IExvY2FsU3RvcmFnZVRocmVhZDo6c2NoZWR1bGVJbXBvcnQoUGFzc1JlZlB0cjxTdG9yYWdlQXJl
YVN5bmM+IGFyZWEpCit7CisgICAgbV9xdWV1ZS5hcHBlbmQoTG9jYWxTdG9yYWdlVGFzazo6Y3Jl
YXRlSW1wb3J0KGFyZWEpKTsKKyAgICBpZiAoIW1fdGltZXIuaXNBY3RpdmUoKSkKKyAgICAgICAg
bV90aW1lci5zdGFydE9uZVNob3QoMCk7Cit9CisKK3ZvaWQgTG9jYWxTdG9yYWdlVGhyZWFkOjpz
Y2hlZHVsZVN5bmMoUGFzc1JlZlB0cjxTdG9yYWdlQXJlYVN5bmM+IGFyZWEpCit7CisgICAgbV9x
dWV1ZS5hcHBlbmQoTG9jYWxTdG9yYWdlVGFzazo6Y3JlYXRlU3luYyhhcmVhKSk7CisgICAgaWYg
KCFtX3RpbWVyLmlzQWN0aXZlKCkpCisgICAgICAgIG1fdGltZXIuc3RhcnRPbmVTaG90KDApOwor
fQorCit2b2lkIExvY2FsU3RvcmFnZVRocmVhZDo6dGVybWluYXRlKCkKK3sKKyAgICBtX3F1ZXVl
LmNsZWFyKCk7CisgICAgbV90aW1lci5zdG9wKCk7Cit9CisKK3ZvaWQgTG9jYWxTdG9yYWdlVGhy
ZWFkOjpwZXJmb3JtVGVybWluYXRlKCkKK3sKKyAgICBtX3F1ZXVlLmNsZWFyKCk7CisgICAgbV90
aW1lci5zdG9wKCk7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS93aW5jZS9Mb2NhbFN0
b3JhZ2VUaHJlYWRXaW5DRS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL3dpbmNl
L0xvY2FsU3RvcmFnZVRocmVhZFdpbkNFLmNwcAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3Jl
L3N0b3JhZ2Uvd2luY2UvTG9jYWxTdG9yYWdlVGhyZWFkV2luQ0UuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC04MCw0ICs4MCw0IEBAIHZvaWQgTG9jYWxTdG9yYWdlVGhyZWFkOjpwZXJmb3JtVGVybWlu
YXQKICAgICBtX3RpbWVyLnN0b3AoKTsKIH0KIAotfQorfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJ
bmRleDogV2ViQ29yZS9zdG9yYWdlL3dpbmNlL0xvY2FsU3RvcmFnZVRocmVhZFdpbkNFLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL3dpbmNlL0xvY2FsU3RvcmFnZVRocmVhZFdpbkNF
LmgJKHJldmlzaW9uIDU3Mjg5KQkoZnJvbSBXZWJDb3JlL3N0b3JhZ2Uvd2luY2UvTG9jYWxTdG9y
YWdlVGhyZWFkV2luY2UuaDo1NzI4OSkKKysrIFdlYkNvcmUvc3RvcmFnZS93aW5jZS9Mb2NhbFN0
b3JhZ2VUaHJlYWRXaW5DRS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTggQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg
aG9wZSB0aGF0IGkgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ
OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJ
VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICog
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAq
ICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUg
ZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICog
IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKworI2lmbmRlZiBMb2NhbFN0b3Jh
Z2VUaHJlYWRXaW5jZV9oCisjZGVmaW5lIExvY2FsU3RvcmFnZVRocmVhZFdpbmNlX2gKKworI2lu
Y2x1ZGUgPHd0Zi9EZXF1ZS5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworICAgIGNsYXNzIFN0b3JhZ2VBcmVhU3luYzsKKyAgICBjbGFzcyBM
b2NhbFN0b3JhZ2VUYXNrOworCisgICAgY2xhc3MgTG9jYWxTdG9yYWdlVGhyZWFkIDogcHVibGlj
IFJlZkNvdW50ZWQ8TG9jYWxTdG9yYWdlVGhyZWFkPiB7CisgICAgcHVibGljOgorICAgICAgICBz
dGF0aWMgUGFzc1JlZlB0cjxMb2NhbFN0b3JhZ2VUaHJlYWQ+IGNyZWF0ZSgpIHsgcmV0dXJuIGFk
b3B0UmVmKG5ldyBMb2NhbFN0b3JhZ2VUaHJlYWQpOyB9CisKKyAgICAgICAgfkxvY2FsU3RvcmFn
ZVRocmVhZCgpOworICAgICAgICBib29sIHN0YXJ0KCk7CisgICAgICAgIHZvaWQgc2NoZWR1bGVJ
bXBvcnQoUGFzc1JlZlB0cjxTdG9yYWdlQXJlYVN5bmM+KTsKKyAgICAgICAgdm9pZCBzY2hlZHVs
ZVN5bmMoUGFzc1JlZlB0cjxTdG9yYWdlQXJlYVN5bmM+KTsKKyAgICAgICAgdm9pZCB0ZXJtaW5h
dGUoKTsKKyAgICAgICAgdm9pZCBwZXJmb3JtVGVybWluYXRlKCk7CisKKyAgICBwcml2YXRlOgor
ICAgICAgICBMb2NhbFN0b3JhZ2VUaHJlYWQoKTsKKworICAgICAgICB2b2lkIHRpbWVyRmlyZWQo
VGltZXI8TG9jYWxTdG9yYWdlVGhyZWFkPiopOworCisgICAgICAgIERlcXVlPFJlZlB0cjxMb2Nh
bFN0b3JhZ2VUYXNrPiA+IG1fcXVldWU7CisgICAgICAgIFRpbWVyPExvY2FsU3RvcmFnZVRocmVh
ZD4gbV90aW1lcjsKKyAgICB9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAv
LyBMb2NhbFN0b3JhZ2VUaHJlYWRXaW5jZV9oCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2Uvd2luY2Uv
TG9jYWxTdG9yYWdlVGhyZWFkV2luQ0UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2Uv
d2luY2UvTG9jYWxTdG9yYWdlVGhyZWFkV2luQ0UuaAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJD
b3JlL3N0b3JhZ2Uvd2luY2UvTG9jYWxTdG9yYWdlVGhyZWFkV2luQ0UuaAkod29ya2luZyBjb3B5
KQpAQCAtMjIsOCArMjIsOCBAQAogICovCiAKIAotI2lmbmRlZiBMb2NhbFN0b3JhZ2VUaHJlYWRX
aW5jZV9oCi0jZGVmaW5lIExvY2FsU3RvcmFnZVRocmVhZFdpbmNlX2gKKyNpZm5kZWYgTG9jYWxT
dG9yYWdlVGhyZWFkV2luQ0VfaAorI2RlZmluZSBMb2NhbFN0b3JhZ2VUaHJlYWRXaW5DRV9oCiAK
ICNpbmNsdWRlIDx3dGYvRGVxdWUuaD4KICNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgpAQCAt
NTUsNCArNTUsNCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKIAotI2VuZGlmIC8vIExvY2FsU3RvcmFnZVRocmVhZFdpbmNlX2gKKyNlbmRpZiAvLyBMb2Nh
bFN0b3JhZ2VUaHJlYWRXaW5DRV9oCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2Uvd2luY2UvTG9jYWxT
dG9yYWdlVGhyZWFkV2luY2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS93aW5j
ZS9Mb2NhbFN0b3JhZ2VUaHJlYWRXaW5jZS5jcHAJKHJldmlzaW9uIDU3Mjg5KQorKysgV2ViQ29y
ZS9zdG9yYWdlL3dpbmNlL0xvY2FsU3RvcmFnZVRocmVhZFdpbmNlLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmls
ZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqICBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpIHdpbGwgYmUgdXNlZnVsLAotICog
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
Zm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w
eSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdp
dGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRl
IHRvCi0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4g
U3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAq
LwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiTG9jYWxTdG9yYWdlVGhyZWFkLmgi
Ci0KLSNpbmNsdWRlICJMb2NhbFN0b3JhZ2VUYXNrLmgiCi0jaW5jbHVkZSAiU3RvcmFnZUFyZWFT
eW5jLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotTG9jYWxTdG9yYWdlVGhyZWFkOjpMb2Nh
bFN0b3JhZ2VUaHJlYWQoKQotOiBtX3RpbWVyKHRoaXMsICZMb2NhbFN0b3JhZ2VUaHJlYWQ6OnRp
bWVyRmlyZWQpCi17Ci19Ci0KLUxvY2FsU3RvcmFnZVRocmVhZDo6fkxvY2FsU3RvcmFnZVRocmVh
ZCgpCi17Ci19Ci0KLWJvb2wgTG9jYWxTdG9yYWdlVGhyZWFkOjpzdGFydCgpCi17Ci0gICAgcmV0
dXJuIHRydWU7Ci19Ci0KLXZvaWQgTG9jYWxTdG9yYWdlVGhyZWFkOjp0aW1lckZpcmVkKFRpbWVy
PExvY2FsU3RvcmFnZVRocmVhZD4qKQotewotICAgIGlmICghbV9xdWV1ZS5pc0VtcHR5KCkpIHsK
LSAgICAgICAgUmVmUHRyPExvY2FsU3RvcmFnZVRhc2s+IHRhc2sgPSBtX3F1ZXVlLmZpcnN0KCk7
Ci0gICAgICAgIHRhc2stPnBlcmZvcm1UYXNrKCk7Ci0gICAgICAgIG1fcXVldWUucmVtb3ZlRmly
c3QoKTsKLSAgICAgICAgaWYgKCFtX3F1ZXVlLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIG1fdGlt
ZXIuc3RhcnRPbmVTaG90KDApOwotICAgIH0KLX0KLQotdm9pZCBMb2NhbFN0b3JhZ2VUaHJlYWQ6
OnNjaGVkdWxlSW1wb3J0KFBhc3NSZWZQdHI8U3RvcmFnZUFyZWFTeW5jPiBhcmVhKQotewotICAg
IG1fcXVldWUuYXBwZW5kKExvY2FsU3RvcmFnZVRhc2s6OmNyZWF0ZUltcG9ydChhcmVhKSk7Ci0g
ICAgaWYgKCFtX3RpbWVyLmlzQWN0aXZlKCkpCi0gICAgICAgIG1fdGltZXIuc3RhcnRPbmVTaG90
KDApOwotfQotCi12b2lkIExvY2FsU3RvcmFnZVRocmVhZDo6c2NoZWR1bGVTeW5jKFBhc3NSZWZQ
dHI8U3RvcmFnZUFyZWFTeW5jPiBhcmVhKQotewotICAgIG1fcXVldWUuYXBwZW5kKExvY2FsU3Rv
cmFnZVRhc2s6OmNyZWF0ZVN5bmMoYXJlYSkpOwotICAgIGlmICghbV90aW1lci5pc0FjdGl2ZSgp
KQotICAgICAgICBtX3RpbWVyLnN0YXJ0T25lU2hvdCgwKTsKLX0KLQotdm9pZCBMb2NhbFN0b3Jh
Z2VUaHJlYWQ6OnRlcm1pbmF0ZSgpCi17Ci0gICAgbV9xdWV1ZS5jbGVhcigpOwotICAgIG1fdGlt
ZXIuc3RvcCgpOwotfQotCi12b2lkIExvY2FsU3RvcmFnZVRocmVhZDo6cGVyZm9ybVRlcm1pbmF0
ZSgpCi17Ci0gICAgbV9xdWV1ZS5jbGVhcigpOwotICAgIG1fdGltZXIuc3RvcCgpOwotfQotCi19
CkluZGV4OiBXZWJDb3JlL3N0b3JhZ2Uvd2luY2UvTG9jYWxTdG9yYWdlVGhyZWFkV2luY2UuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2Uvd2luY2UvTG9jYWxTdG9yYWdlVGhyZWFkV2lu
Y2UuaAkocmV2aXNpb24gNTcyODkpCisrKyBXZWJDb3JlL3N0b3JhZ2Uvd2luY2UvTG9jYWxTdG9y
YWdlVGhyZWFkV2luY2UuaAkod29ya2luZyBjb3B5KQpAQCAtMSw1OCArMCwwIEBACi0vKgotICog
Q29weXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgotICoKLSAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv
cGUgdGhhdCBpIHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg
d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZ
IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqICBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAg
WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZp
bGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiAgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqICBC
b3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0KLSNpZm5kZWYgTG9jYWxTdG9yYWdl
VGhyZWFkV2luY2VfaAotI2RlZmluZSBMb2NhbFN0b3JhZ2VUaHJlYWRXaW5jZV9oCi0KLSNpbmNs
dWRlIDx3dGYvRGVxdWUuaD4KLSNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgotCi1uYW1lc3Bh
Y2UgV2ViQ29yZSB7Ci0KLSAgICBjbGFzcyBTdG9yYWdlQXJlYVN5bmM7Ci0gICAgY2xhc3MgTG9j
YWxTdG9yYWdlVGFzazsKLQotICAgIGNsYXNzIExvY2FsU3RvcmFnZVRocmVhZCA6IHB1YmxpYyBS
ZWZDb3VudGVkPExvY2FsU3RvcmFnZVRocmVhZD4gewotICAgIHB1YmxpYzoKLSAgICAgICAgc3Rh
dGljIFBhc3NSZWZQdHI8TG9jYWxTdG9yYWdlVGhyZWFkPiBjcmVhdGUoKSB7IHJldHVybiBhZG9w
dFJlZihuZXcgTG9jYWxTdG9yYWdlVGhyZWFkKTsgfQotCi0gICAgICAgIH5Mb2NhbFN0b3JhZ2VU
aHJlYWQoKTsKLSAgICAgICAgYm9vbCBzdGFydCgpOwotICAgICAgICB2b2lkIHNjaGVkdWxlSW1w
b3J0KFBhc3NSZWZQdHI8U3RvcmFnZUFyZWFTeW5jPik7Ci0gICAgICAgIHZvaWQgc2NoZWR1bGVT
eW5jKFBhc3NSZWZQdHI8U3RvcmFnZUFyZWFTeW5jPik7Ci0gICAgICAgIHZvaWQgdGVybWluYXRl
KCk7Ci0gICAgICAgIHZvaWQgcGVyZm9ybVRlcm1pbmF0ZSgpOwotCi0gICAgcHJpdmF0ZToKLSAg
ICAgICAgTG9jYWxTdG9yYWdlVGhyZWFkKCk7Ci0KLSAgICAgICAgdm9pZCB0aW1lckZpcmVkKFRp
bWVyPExvY2FsU3RvcmFnZVRocmVhZD4qKTsKLQotICAgICAgICBEZXF1ZTxSZWZQdHI8TG9jYWxT
dG9yYWdlVGFzaz4gPiBtX3F1ZXVlOwotICAgICAgICBUaW1lcjxMb2NhbFN0b3JhZ2VUaHJlYWQ+
IG1fdGltZXI7Ci0gICAgfTsKLQotfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQotCi0jZW5kaWYgLy8g
TG9jYWxTdG9yYWdlVGhyZWFkV2luY2VfaAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>