<?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>149409</bug_id>
          
          <creation_ts>2015-09-21 11:15:02 -0700</creation_ts>
          <short_desc>Implement try/catch in the FTL</short_desc>
          <delta_ts>2015-11-09 23:49:23 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>145295</dependson>
    
    <dependson>149601</dependson>
    
    <dependson>149970</dependson>
    
    <dependson>150039</dependson>
    
    <dependson>150104</dependson>
    
    <dependson>150760</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Saam Barati">saam</reporter>
          <assigned_to name="Saam Barati">saam</assigned_to>
          <cc>benjamin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>gskachkov</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>msaboff</cc>
    
    <cc>oliver</cc>
    
    <cc>sukolsak</cc>
    
    <cc>ysuzuki</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1127679</commentid>
    <comment_count>0</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-09-21 11:15:02 -0700</bug_when>
    <thetext>...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1132388</commentid>
    <comment_count>1</comment_count>
      <attachid>262908</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-10-12 11:24:06 -0700</bug_when>
    <thetext>Created attachment 262908
WIP</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1138039</commentid>
    <comment_count>2</comment_count>
      <attachid>264440</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-10-30 16:45:52 -0700</bug_when>
    <thetext>Created attachment 264440
WIP

Almost done.
I want to write a few more tests, clean up a bit of code, rebase the patch, and then I think this is done.

Tests I still want:
- exception thrown from inline cache miss (i.e, from operationGetByIdOptimize)
- exception from lazy slow path
- exception thrown and caught in correct inline frame.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1138044</commentid>
    <comment_count>3</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-10-30 16:49:30 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; Created attachment 264440 [details]
&gt; WIP
&gt; 
&gt; Almost done.
&gt; I want to write a few more tests, clean up a bit of code, rebase the patch,
&gt; and then I think this is done.
&gt; 
&gt; Tests I still want:
&gt; - exception thrown from inline cache miss (i.e, from
&gt; operationGetByIdOptimize)
&gt; - exception from lazy slow path
&gt; - exception thrown and caught in correct inline frame.

Add one more thing to do:
- Make the list of things we spill from a JSCall a number
  based on live values in the catch and not all volatile registers</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1138795</commentid>
    <comment_count>4</comment_count>
      <attachid>264653</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-11-02 18:29:22 -0800</bug_when>
    <thetext>Created attachment 264653
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1138796</commentid>
    <comment_count>5</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-11-02 18:31:17 -0800</bug_when>
    <thetext>Attachment 264653 did not pass style-queue:


ERROR: Source/JavaScriptCore/ftl/FTLCompile.cpp:469:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/JavaScriptCore/ftl/FTLCompile.cpp:599:  This { should be at the end of the previous line  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/ftl/FTLCompile.cpp:684:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/ftl/FTLOSRExit.cpp:56:  Wrong number of spaces before statement. (expected: 8)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/ftl/FTLOSRExit.cpp:57:  Wrong number of spaces before statement. (expected: 8)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/ftl/FTLOSRExit.cpp:58:  Wrong number of spaces before statement. (expected: 8)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/ftl/FTLOSRExit.cpp:59:  Wrong number of spaces before statement. (expected: 8)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/ftl/FTLOSRExit.cpp:60:  Wrong number of spaces before statement. (expected: 8)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/ftl/FTLOSRExit.cpp:96:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/ftl/FTLOSRExit.cpp:97:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
Total errors found: 10 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>1138797</commentid>
    <comment_count>6</comment_count>
      <attachid>264654</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-11-02 18:34:37 -0800</bug_when>
    <thetext>Created attachment 264654
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1138799</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-11-02 18:36:27 -0800</bug_when>
    <thetext>Attachment 264654 did not pass style-queue:


ERROR: Source/JavaScriptCore/ftl/FTLCompile.cpp:469:  Extra space before ( in function call  [whitespace/parens] [4]
ERROR: Source/JavaScriptCore/ftl/FTLCompile.cpp:600:  This { should be at the end of the previous line  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/ftl/FTLCompile.cpp:685:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/ftl/FTLOSRExit.cpp:56:  Wrong number of spaces before statement. (expected: 8)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/ftl/FTLOSRExit.cpp:57:  Wrong number of spaces before statement. (expected: 8)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/ftl/FTLOSRExit.cpp:58:  Wrong number of spaces before statement. (expected: 8)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/ftl/FTLOSRExit.cpp:59:  Wrong number of spaces before statement. (expected: 8)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/ftl/FTLOSRExit.cpp:60:  Wrong number of spaces before statement. (expected: 8)  [whitespace/indent] [4]
ERROR: Source/JavaScriptCore/ftl/FTLOSRExit.cpp:96:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
ERROR: Source/JavaScriptCore/ftl/FTLOSRExit.cpp:97:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
Total errors found: 10 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>1139154</commentid>
    <comment_count>8</comment_count>
      <attachid>264654</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-11-03 15:59:27 -0800</bug_when>
    <thetext>Comment on attachment 264654
patch

Let&apos;s do this!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1139447</commentid>
    <comment_count>9</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-11-04 14:36:48 -0800</bug_when>
    <thetext>perf numbers:
Benchmark report for SunSpider, LongSpider, V8Spider, Octane, Kraken, JSRegress, and CompressionBench on Saams-Mac-Pro (MacPro6,1).

VMs tested:
&quot;og&quot; at /Volumes/Data/WK/os-a/OpenSource/WebKitBuild/Release/jsc (r191931)
&quot;tryCatchFTL&quot; at /Volumes/Data/WK/os-b/OpenSource/WebKitBuild/Release/jsc (r191931)
    export JSC_useFTLTryCatch=1

Collected 8 samples per benchmark/VM, with 8 VM invocations per benchmark. Emitted a call to gc() between sample measurements.
Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific preciseTime() function to get microsecond-level
timing. Reporting benchmark execution times with 95% confidence intervals in milliseconds.

                                                            og                   tryCatchFTL                                    
SunSpider:
   3d-cube                                            7.7318+-0.2891     ?      7.7646+-0.3291        ?
   3d-morph                                           7.6685+-0.1132            7.5786+-0.0166          might be 1.0119x faster
   3d-raytrace                                        8.7827+-0.0470     !      8.9757+-0.1378        ! definitely 1.0220x slower
   access-binary-trees                                3.1983+-0.0861            3.1181+-0.0286          might be 1.0257x faster
   access-fannkuch                                    8.5316+-0.0204            8.5183+-0.0283        
   access-nbody                                       4.0146+-0.0128     !      4.0625+-0.0229        ! definitely 1.0119x slower
   access-nsieve                                      4.6482+-0.0631     ?      4.7240+-0.1315        ? might be 1.0163x slower
   bitops-3bit-bits-in-byte                           1.7445+-0.0116            1.7252+-0.0289          might be 1.0112x faster
   bitops-bits-in-byte                                4.7152+-0.0443            4.6540+-0.0510          might be 1.0131x faster
   bitops-bitwise-and                                 2.9341+-0.0209     ?      2.9499+-0.0345        ?
   bitops-nsieve-bits                                 4.2878+-0.0597     ?      4.3193+-0.0485        ?
   controlflow-recursive                              3.3498+-0.0420     ?      3.3818+-0.0887        ?
   crypto-aes                                         6.4524+-0.0433     ?      6.5012+-0.0659        ?
   crypto-md5                                         3.7576+-0.0690            3.7352+-0.0274        
   crypto-sha1                                        3.4822+-0.0216     ?      3.4908+-0.0269        ?
   date-format-tofte                                 13.1756+-0.1440           12.9432+-0.0935          might be 1.0180x faster
   date-format-xparb                                  7.5453+-0.0446     ?      7.8588+-0.4768        ? might be 1.0415x slower
   math-cordic                                        4.1428+-0.0180     !      4.2498+-0.0103        ! definitely 1.0258x slower
   math-partial-sums                                  7.6096+-0.0744     ?      7.6150+-0.0378        ?
   math-spectral-norm                                 2.8456+-0.0163            2.8391+-0.0195        
   regexp-dna                                         9.5471+-0.0929            9.4803+-0.0436        
   string-base64                                      6.4017+-0.0415            6.3494+-0.0387        
   string-fasta                                       8.4615+-0.0677     ?      8.5814+-0.0732        ? might be 1.0142x slower
   string-tagcloud                                   12.0362+-0.0682     ?     12.1867+-0.3330        ? might be 1.0125x slower
   string-unpack-code                                26.6557+-0.2382     !     27.5564+-0.2432        ! definitely 1.0338x slower
   string-validate-input                              6.3377+-0.0464            6.2983+-0.0812        

   &lt;arithmetic&gt;                                       6.9253+-0.0287     ?      6.9791+-0.0332        ? might be 1.0078x slower

                                                            og                   tryCatchFTL                                    
LongSpider:
   3d-cube                                         1188.8931+-9.5461         1187.4914+-11.3300       
   3d-morph                                        2083.0633+-1.2383         2082.9016+-1.3679        
   3d-raytrace                                      917.3685+-2.9928     ?    925.2569+-12.5572       ?
   access-binary-trees                             1198.9734+-3.9164     ?   1199.2009+-3.2474        ?
   access-fannkuch                                  488.3999+-3.9992     ?    492.0440+-5.3081        ?
   access-nbody                                     802.4822+-0.1273     ?    803.0908+-0.5761        ?
   access-nsieve                                    582.9100+-3.6242          580.0134+-2.9943        
   bitops-3bit-bits-in-byte                          50.8018+-0.0778     ?     51.0549+-0.4265        ?
   bitops-bits-in-byte                              135.2148+-2.1492     ?    135.6178+-1.1939        ?
   bitops-nsieve-bits                               587.4410+-2.6615     ?    589.9493+-0.7425        ?
   controlflow-recursive                            649.5424+-0.3307     ?    649.8575+-0.7843        ?
   crypto-aes                                       839.0770+-2.8150     ?    843.0469+-4.8519        ?
   crypto-md5                                       731.6777+-7.2102     ?    742.9239+-19.8971       ? might be 1.0154x slower
   crypto-sha1                                      975.5347+-5.6638          973.2252+-7.1624        
   date-format-tofte                               1044.2230+-11.6837        1020.2409+-20.7328         might be 1.0235x faster
   date-format-xparb                               1058.3864+-25.7146    ?   1072.6612+-14.3662       ? might be 1.0135x slower
   hash-map                                         225.3840+-1.7498     ^    219.4016+-3.2056        ^ definitely 1.0273x faster
   math-cordic                                      737.2517+-1.0281     ?    737.3510+-1.1992        ?
   math-partial-sums                                735.8625+-3.3264     ?    738.0363+-1.7039        ?
   math-spectral-norm                               769.3866+-1.1700     ?    770.1925+-2.6041        ?
   string-base64                                    538.6395+-1.2272     ?    539.2767+-1.3810        ?
   string-fasta                                     548.1288+-2.6840     ?    548.3836+-3.2819        ?
   string-tagcloud                                  265.6915+-4.6541     ?    267.5320+-0.9542        ?

   &lt;geometric&gt;                                      600.2040+-1.0248     ?    600.6379+-0.9728        ? might be 1.0007x slower

                                                            og                   tryCatchFTL                                    
V8Spider:
   crypto                                            71.3041+-0.2318           71.0136+-0.2334        
   deltablue                                         89.8814+-2.1664           89.3356+-2.0044        
   earley-boyer                                      60.3759+-0.3076     ?     60.5201+-0.2591        ?
   raytrace                                          41.5776+-0.5643           41.5698+-0.6973        
   regexp                                            98.2870+-0.3354     ?     98.5057+-0.5341        ?
   richards                                          73.4603+-0.3084           73.4511+-0.3076        
   splay                                             49.2939+-0.8303     ?     49.3256+-0.4574        ?

   &lt;geometric&gt;                                       66.4527+-0.3124           66.4037+-0.2446          might be 1.0007x faster

                                                            og                   tryCatchFTL                                    
Octane:
   encrypt                                           0.24868+-0.00449          0.24730+-0.00317       
   decrypt                                           4.43595+-0.00982    ?     4.44383+-0.02129       ?
   deltablue                                x2       0.20500+-0.00132          0.20477+-0.00151       
   earley                                            0.45570+-0.00212    ?     0.45650+-0.00072       ?
   boyer                                             6.86504+-0.02925    ?     6.87532+-0.02627       ?
   navier-stokes                            x2       6.90602+-0.00195    ?     6.91146+-0.00796       ?
   raytrace                                 x2       1.32399+-0.00776          1.31548+-0.00246       
   richards                                 x2       0.14132+-0.00044          0.14124+-0.00050       
   splay                                    x2       0.48201+-0.00215    ?     0.48402+-0.00298       ?
   regexp                                   x2      36.60402+-0.04381         36.57678+-0.14806       
   pdfjs                                    x2      56.05452+-0.15730    ?    56.34902+-0.27651       ?
   mandreel                                 x2      65.60110+-0.40834         65.58532+-0.43011       
   gbemu                                    x2      54.22581+-0.52596    ?    59.66801+-5.56773       ? might be 1.1004x slower
   closure                                           0.99907+-0.00316    !     1.01165+-0.00666       ! definitely 1.0126x slower
   jquery                                           12.95375+-0.05028    !    13.11738+-0.03357       ! definitely 1.0126x slower
   box2d                                    x2      16.27456+-0.06560    ?    16.30702+-0.04553       ?
   zlib                                     x2     525.38317+-17.48066   ?   530.76764+-16.74861      ? might be 1.0102x slower
   typescript                               x2    1138.17670+-9.50976    ?  1139.33826+-4.35283       ?

   &lt;geometric&gt;                                       8.29485+-0.02249    ?     8.36000+-0.05506       ? might be 1.0079x slower

                                                            og                   tryCatchFTL                                    
Kraken:
   ai-astar                                          225.313+-2.074            222.881+-2.281           might be 1.0109x faster
   audio-beat-detection                               73.704+-0.615      ?      73.806+-0.428         ?
   audio-dft                                         142.506+-0.299            142.504+-0.315         
   audio-fft                                          54.915+-0.192      ?      55.215+-0.830         ?
   audio-oscillator                                   89.005+-0.096      ?      89.144+-0.100         ?
   imaging-darkroom                                   93.997+-0.065      ^      93.898+-0.009         ^ definitely 1.0011x faster
   imaging-desaturate                                 86.545+-0.472      ^      84.000+-0.528         ^ definitely 1.0303x faster
   imaging-gaussian-blur                             152.696+-5.794            149.450+-1.171           might be 1.0217x faster
   json-parse-financial                               62.988+-0.275      ?      63.491+-0.336         ?
   json-stringify-tinderbox                           38.570+-0.062      !      38.979+-0.242         ! definitely 1.0106x slower
   stanford-crypto-aes                                64.545+-0.928      ?      65.250+-0.637         ? might be 1.0109x slower
   stanford-crypto-ccm                                58.422+-1.374      ?      60.002+-1.966         ? might be 1.0270x slower
   stanford-crypto-pbkdf2                            142.699+-1.068            140.808+-0.997           might be 1.0134x faster
   stanford-crypto-sha256-iterative                   56.398+-0.114      !      57.012+-0.403         ! definitely 1.0109x slower

   &lt;arithmetic&gt;                                       95.879+-0.511             95.460+-0.231           might be 1.0044x faster

                                                            og                   tryCatchFTL                                    
JSRegress:
   abc-forward-loop-equal                            63.3475+-0.4160           63.2240+-0.2044        
   abc-postfix-backward-loop                         62.8633+-0.2640     ?     63.0130+-0.4050        ?
   abc-simple-backward-loop                          62.4372+-0.4001     ?     62.6392+-0.4136        ?
   abc-simple-forward-loop                           62.5321+-0.2598           62.2620+-0.0832        
   abc-skippy-loop                                   43.0899+-0.2394           43.0164+-0.1408        
   abs-boolean                                        3.5862+-0.0996            3.5779+-0.0297        
   adapt-to-double-divide                            21.9794+-0.3256     ?     21.9898+-0.3125        ?
   aliased-arguments-getbyval                         1.6366+-0.0238     ?      1.6631+-0.0501        ? might be 1.0162x slower
   allocate-big-object                                3.1045+-0.0752     ?      3.1634+-0.0961        ? might be 1.0190x slower
   arguments-named-and-reflective                    15.0502+-0.3219           14.9253+-0.2813        
   arguments-out-of-bounds                           16.5513+-0.0896     ?     16.6654+-0.3284        ?
   arguments-strict-mode                             14.9821+-0.4023           14.7100+-0.6954          might be 1.0185x faster
   arguments                                         12.3274+-0.1512     ?     12.3915+-0.2026        ?
   arity-mismatch-inlining                            1.3090+-0.0185     ?      1.3254+-0.0335        ? might be 1.0126x slower
   array-access-polymorphic-structure                10.1241+-0.0399     ?     10.1441+-0.0947        ?
   array-nonarray-polymorhpic-access                 40.3380+-0.2734           40.3296+-0.8212        
   array-prototype-every                            114.0440+-2.1082          111.0172+-0.9801          might be 1.0273x faster
   array-prototype-forEach                          111.7209+-2.2576     ?    113.1471+-3.2510        ? might be 1.0128x slower
   array-prototype-map                              121.9940+-1.4139          121.7484+-1.5580        
   array-prototype-reduce                           107.4395+-0.4856     ?    109.5369+-3.4575        ? might be 1.0195x slower
   array-prototype-reduceRight                      107.0463+-0.9081     ?    108.6180+-1.7984        ? might be 1.0147x slower
   array-prototype-some                             113.1937+-2.3106          111.3853+-1.0041          might be 1.0162x faster
   array-splice-contiguous                           37.6819+-0.4250           37.5627+-0.2990        
   array-with-double-add                              5.6631+-0.0165     !      5.6981+-0.0147        ! definitely 1.0062x slower
   array-with-double-increment                        4.5035+-0.1151            4.3904+-0.0407          might be 1.0258x faster
   array-with-double-mul-add                          6.7439+-0.0295     !      6.8033+-0.0154        ! definitely 1.0088x slower
   array-with-double-sum                              4.3987+-0.0319     ?      4.4326+-0.1039        ?
   array-with-int32-add-sub                           9.3107+-0.0378     ?      9.3123+-0.0343        ?
   array-with-int32-or-double-sum                     4.4683+-0.0294            4.4663+-0.0158        
   ArrayBuffer-DataView-alloc-large-long-lived   
                                                     41.8414+-0.7454           41.0974+-0.6262          might be 1.0181x faster
   ArrayBuffer-DataView-alloc-long-lived             19.2403+-0.5667     ^     18.4660+-0.1250        ^ definitely 1.0419x faster
   ArrayBuffer-Int32Array-byteOffset                  5.0944+-0.0515            5.0836+-0.0223        
   ArrayBuffer-Int8Array-alloc-large-long-lived   
                                                     42.2101+-1.0536           41.7061+-0.3487          might be 1.0121x faster
   ArrayBuffer-Int8Array-alloc-long-lived-buffer   
                                                     30.8179+-1.4365           29.5974+-0.5716          might be 1.0412x faster
   ArrayBuffer-Int8Array-alloc-long-lived            17.9333+-0.7187     ^     16.8913+-0.0931        ^ definitely 1.0617x faster
   ArrayBuffer-Int8Array-alloc                       15.2933+-0.7130           14.5156+-0.2310          might be 1.0536x faster
   arrowfunction-call                                15.5807+-0.1875     ?     15.6777+-0.1370        ?
   asmjs_bool_bug                                    11.1322+-0.0324     ?     11.1454+-0.0500        ?
   assign-custom-setter-polymorphic                   4.1706+-0.0369     ?      4.1707+-0.0363        ?
   assign-custom-setter                               5.9839+-0.0558     !      6.1091+-0.0483        ! definitely 1.0209x slower
   basic-set                                         11.0205+-0.2735     ?     11.0829+-0.1842        ?
   big-int-mul                                        5.1796+-0.0192            5.1567+-0.0196        
   boolean-test                                       4.2112+-0.0188            4.2067+-0.0333        
   branch-fold                                        5.0700+-0.2137            5.0214+-0.0369        
   branch-on-string-as-boolean                       26.4431+-0.3909           26.4022+-0.1342        
   by-val-generic                                     3.3008+-0.0436     ?      3.3068+-0.0369        ?
   call-spread-apply                                 39.7921+-0.4558     ?     41.9557+-2.7748        ? might be 1.0544x slower
   call-spread-call                                  32.4424+-0.1999     !     34.0822+-0.5237        ! definitely 1.0505x slower
   captured-assignments                               0.7687+-0.0260     ?      0.7710+-0.0099        ?
   cast-int-to-double                                 7.0543+-0.1401            7.0345+-0.0750        
   cell-argument                                      9.3176+-0.0657            9.1951+-0.2594          might be 1.0133x faster
   cfg-simplify                                       3.7974+-0.0225            3.7856+-0.0249        
   chain-getter-access                               12.0040+-0.1887           11.9343+-0.2982        
   cmpeq-obj-to-obj-other                            12.7351+-0.0148     ?     12.7800+-0.0463        ?
   constant-test                                      6.4984+-0.0262     ?      6.5008+-0.0217        ?
   create-lots-of-functions                          13.2535+-0.1253     ?     13.5204+-0.2569        ? might be 1.0201x slower
   cse-new-array-buffer                               3.0907+-0.0333     ?      3.1250+-0.0955        ? might be 1.0111x slower
   cse-new-array                                      3.1567+-0.0460     ?      3.1840+-0.1885        ?
   custom-setter-getter-as-put-get-by-id              0.8945+-0.0926            0.8759+-0.0327          might be 1.0213x faster
   DataView-custom-properties                        49.8279+-0.6043     ^     48.3618+-0.6240        ^ definitely 1.0303x faster
   delay-tear-off-arguments-strictmode               18.5628+-0.2356     ?     19.0715+-0.4846        ? might be 1.0274x slower
   deltablue-varargs                                287.4734+-2.1344     ?    290.6596+-1.2205        ? might be 1.0111x slower
   destructuring-arguments                          236.8381+-1.1515     ?    239.4278+-1.7604        ? might be 1.0109x slower
   destructuring-parameters-overridden-by-function   
                                                      0.7963+-0.0139            0.7858+-0.0241          might be 1.0134x faster
   destructuring-swap                                 6.7498+-0.0338     ?      6.7670+-0.0508        ?
   direct-arguments-getbyval                          1.6193+-0.0196     ?      1.6400+-0.0270        ? might be 1.0128x slower
   div-boolean-double                                 6.7556+-0.0122     ?      6.7617+-0.0264        ?
   div-boolean                                       10.2124+-0.0247     ?     10.2531+-0.1326        ?
   double-get-by-val-out-of-bounds                    6.0294+-0.0654     ?      6.1205+-0.1200        ? might be 1.0151x slower
   double-pollution-getbyval                         11.2878+-0.0238     ?     11.2947+-0.0185        ?
   double-pollution-putbyoffset                       5.3757+-0.0609            5.3493+-0.0453        
   double-real-use                                   39.8454+-0.0766     ^     39.7216+-0.0317        ^ definitely 1.0031x faster
   double-to-int32-typed-array-no-inline              3.1541+-0.0256     ?      3.1846+-0.0194        ?
   double-to-int32-typed-array                        2.9898+-0.0265            2.9820+-0.0649        
   double-to-uint32-typed-array-no-inline             3.2617+-0.0186     ?      3.2979+-0.0270        ? might be 1.0111x slower
   double-to-uint32-typed-array                       3.0242+-0.0325     ?      3.0438+-0.0219        ?
   elidable-new-object-dag                           51.3011+-1.1899           50.5162+-0.5381          might be 1.0155x faster
   elidable-new-object-roflcopter                    47.4789+-1.2456           47.1147+-0.2583        
   elidable-new-object-then-call                     47.0069+-0.3236     ?     47.5357+-0.5389        ? might be 1.0112x slower
   elidable-new-object-tree                          56.2869+-1.0259           56.2137+-0.8332        
   empty-string-plus-int                              7.0761+-0.0231     !      7.2751+-0.0655        ! definitely 1.0281x slower
   emscripten-cube2hash                              53.6001+-0.6832     ?     53.9487+-0.6607        ?
   exit-length-on-plain-object                       22.1904+-0.1728           22.1891+-0.1559        
   external-arguments-getbyval                        1.8026+-0.0706            1.7785+-0.1044          might be 1.0136x faster
   external-arguments-putbyval                        3.2903+-0.0862     ?      3.2992+-0.1041        ?
   fixed-typed-array-storage-var-index                1.8135+-0.0233            1.8081+-0.0228        
   fixed-typed-array-storage                          1.4031+-0.0179     ?      1.4143+-0.0241        ?
   Float32Array-matrix-mult                           6.6340+-0.0231     !      6.6963+-0.0268        ! definitely 1.0094x slower
   Float32Array-to-Float64Array-set                  70.6493+-0.1014     !     71.9423+-0.4788        ! definitely 1.0183x slower
   Float64Array-alloc-long-lived                     85.6441+-0.2201     ?     86.0509+-0.6267        ?
   Float64Array-to-Int16Array-set                    89.7905+-1.4839     ^     87.8715+-0.1910        ^ definitely 1.0218x faster
   fold-double-to-int                                18.7237+-0.0625     ?     18.7568+-0.1217        ?
   fold-get-by-id-to-multi-get-by-offset-rare-int   
                                                     12.3238+-0.1989     ?     12.3763+-0.1128        ?
   fold-get-by-id-to-multi-get-by-offset             10.6235+-0.1098     ?     10.6833+-0.0393        ?
   fold-multi-get-by-offset-to-get-by-offset   
                                                      9.3647+-0.0458     ?      9.4112+-0.2775        ?
   fold-multi-get-by-offset-to-poly-get-by-offset   
                                                      9.8616+-0.0534            9.8482+-0.1664        
   fold-multi-put-by-offset-to-poly-put-by-offset   
                                                     11.9640+-0.0675           11.8901+-0.2101        
   fold-multi-put-by-offset-to-put-by-offset   
                                                     11.2238+-0.2140     ?     11.3748+-0.0530        ? might be 1.0135x slower
   fold-multi-put-by-offset-to-replace-or-transition-put-by-offset   
                                                     16.1220+-0.5298           15.7411+-0.4905          might be 1.0242x faster
   fold-put-by-id-to-multi-put-by-offset             13.6990+-0.4216           13.4791+-0.4680          might be 1.0163x faster
   fold-put-by-val-with-string-to-multi-put-by-offset   
                                                     13.3940+-0.4016     ?     13.4256+-0.2782        ?
   fold-put-by-val-with-symbol-to-multi-put-by-offset   
                                                     13.3386+-0.3677     ?     13.5568+-0.2472        ? might be 1.0164x slower
   fold-put-structure                                 8.8964+-0.1045     ?      8.9079+-0.2235        ?
   for-of-iterate-array-entries                      15.6947+-0.2514     ?     15.9901+-0.6257        ? might be 1.0188x slower
   for-of-iterate-array-keys                          5.3568+-0.1635            5.3110+-0.1652        
   for-of-iterate-array-values                        5.0169+-0.1207            4.9803+-0.1505        
   fround                                            24.2715+-0.2516     ?     24.3354+-0.1045        ?
   ftl-library-inlining-dataview                     93.0274+-0.8614     !     99.9131+-1.3118        ! definitely 1.0740x slower
   ftl-library-inlining                             147.8894+-6.0173          145.8124+-12.3890         might be 1.0142x faster
   ftl-object-sub                                   476.2159+-0.7933     !    485.3692+-6.2757        ! definitely 1.0192x slower
   function-call                                     15.5151+-0.0744           15.5065+-0.0383        
   function-dot-apply                                 3.0450+-0.0220     ?      3.0503+-0.0210        ?
   function-test                                      3.9062+-0.1057            3.8826+-0.0213        
   function-with-eval                               126.4147+-0.3327     ?    126.9628+-0.2279        ?
   gcse-poly-get-less-obvious                        37.6977+-0.3996           37.6294+-0.3703        
   gcse-poly-get                                     38.6885+-0.2604     ?     38.7752+-0.4515        ?
   gcse                                               5.3550+-0.0169     ?      5.3710+-0.0275        ?
   get-by-id-bimorphic-check-structure-elimination-simple   
                                                      3.6319+-0.1250            3.5868+-0.0488          might be 1.0126x faster
   get-by-id-bimorphic-check-structure-elimination   
                                                      7.0211+-0.0145     ?      7.0369+-0.0226        ?
   get-by-id-chain-from-try-block                     3.3831+-0.0151     !      3.8006+-0.2193        ! definitely 1.1234x slower
   get-by-id-check-structure-elimination              6.0628+-0.0296     ?      6.0722+-0.0373        ?
   get-by-id-proto-or-self                           26.5507+-1.9474     ?     27.6998+-2.1387        ? might be 1.0433x slower
   get-by-id-quadmorphic-check-structure-elimination-simple   
                                                      3.9896+-0.0311            3.9857+-0.0148        
   get-by-id-self-or-proto                           25.8584+-2.2019           25.8345+-1.4370        
   get-by-val-out-of-bounds                           5.8994+-0.0292     ?      6.0230+-0.1334        ? might be 1.0210x slower
   get-by-val-with-string-bimorphic-check-structure-elimination-simple   
                                                      3.6126+-0.0724            3.5635+-0.0238          might be 1.0138x faster
   get-by-val-with-string-bimorphic-check-structure-elimination   
                                                      8.9789+-0.0543            8.9727+-0.1299        
   get-by-val-with-string-chain-from-try-block   
                                                      3.4508+-0.0504     !      3.8726+-0.1293        ! definitely 1.1222x slower
   get-by-val-with-string-check-structure-elimination   
                                                      8.2385+-0.0331     ?      8.4088+-0.3553        ? might be 1.0207x slower
   get-by-val-with-string-proto-or-self              26.4005+-1.2542     ?     27.4069+-1.9019        ? might be 1.0381x slower
   get-by-val-with-string-quadmorphic-check-structure-elimination-simple   
                                                      4.6544+-0.0988     ?      4.7969+-0.0759        ? might be 1.0306x slower
   get-by-val-with-string-self-or-proto              28.2591+-2.0969           26.3063+-1.3100          might be 1.0742x faster
   get-by-val-with-symbol-bimorphic-check-structure-elimination-simple   
                                                      4.2567+-0.1068            4.2361+-0.0786        
   get-by-val-with-symbol-bimorphic-check-structure-elimination   
                                                     17.5234+-0.0270     ?     17.5573+-0.1736        ?
   get-by-val-with-symbol-chain-from-try-block   
                                                      3.4372+-0.0076     !      3.7966+-0.0178        ! definitely 1.1046x slower
   get-by-val-with-symbol-check-structure-elimination   
                                                     16.7152+-0.0596     ?     16.7858+-0.2490        ?
   get-by-val-with-symbol-proto-or-self              27.2650+-1.9350           26.2987+-1.3680          might be 1.0367x faster
   get-by-val-with-symbol-quadmorphic-check-structure-elimination-simple   
                                                      5.6559+-0.0207     ?      5.6646+-0.0154        ?
   get-by-val-with-symbol-self-or-proto              26.5221+-1.1958           25.9109+-1.3950          might be 1.0236x faster
   get_callee_monomorphic                             3.2519+-0.2390            3.0885+-0.0884          might be 1.0529x faster
   get_callee_polymorphic                             4.5540+-0.0461     ?      4.5554+-0.0475        ?
   getter-no-activation                               6.3225+-0.0364            6.2810+-0.0410        
   getter-prototype                                  13.9897+-0.1900     ?     14.1588+-0.4235        ? might be 1.0121x slower
   getter-richards-try-catch                       1856.7735+-54.3556        1799.2766+-60.9008         might be 1.0320x faster
   getter-richards                                  124.7777+-2.7445          124.7100+-1.2451        
   getter                                             6.9646+-0.0373     ?      7.0098+-0.0140        ?
   global-object-access-with-mutating-structure   
                                                      7.8669+-0.1385     ?      7.9810+-0.1031        ? might be 1.0145x slower
   global-var-const-infer-fire-from-opt               1.1701+-0.0188     ?      1.1826+-0.0252        ? might be 1.0107x slower
   global-var-const-infer                             1.0398+-0.0097     ?      1.0477+-0.0110        ?
   hard-overflow-check-equal                         51.6958+-0.5245           51.4435+-0.3018        
   hard-overflow-check                               51.0168+-0.0836           50.9966+-0.1417        
   HashMap-put-get-iterate-keys                      32.6160+-0.2056           32.4432+-0.2519        
   HashMap-put-get-iterate                           32.3198+-0.2830           32.1245+-0.5062        
   HashMap-string-put-get-iterate                    34.4770+-0.5328     ?     34.7271+-0.4656        ?
   hoist-make-rope                                   14.0040+-1.0939           13.4420+-0.7762          might be 1.0418x faster
   hoist-poly-check-structure-effectful-loop   
                                                      5.6544+-0.0255     ?      5.6994+-0.1064        ?
   hoist-poly-check-structure                         4.2924+-0.0151            4.2805+-0.0117        
   imul-double-only                                  10.1556+-0.5690     ?     10.5302+-0.7817        ? might be 1.0369x slower
   imul-int-only                                     12.9854+-0.0801     ?     13.0387+-0.0674        ?
   imul-mixed                                        10.1923+-0.0921           10.1434+-0.0848        
   in-four-cases                                     30.3595+-0.1533     ?     30.5879+-0.3466        ?
   in-one-case-false                                 14.8798+-0.0225           14.8780+-0.0299        
   in-one-case-true                                  14.8734+-0.0503     ?     14.8863+-0.0365        ?
   in-two-cases                                      16.0429+-0.0375     ?     16.0656+-0.0493        ?
   indexed-properties-in-objects                      3.8774+-0.0358            3.8638+-0.0195        
   infer-closure-const-then-mov-no-inline             5.3935+-0.0306     ^      5.2754+-0.0149        ^ definitely 1.0224x faster
   infer-closure-const-then-mov                      24.8385+-0.4711           24.6468+-0.3010        
   infer-closure-const-then-put-to-scope-no-inline   
                                                     17.6757+-0.0174     ?     17.7660+-0.1735        ?
   infer-closure-const-then-put-to-scope             30.9547+-0.2947           30.5397+-0.7284          might be 1.0136x faster
   infer-closure-const-then-reenter-no-inline   
                                                     76.4373+-0.1791           76.4079+-0.0813        
   infer-closure-const-then-reenter                  31.3224+-0.4680     ?     31.4838+-0.1849        ?
   infer-constant-global-property                     4.6881+-0.0162     ?      4.7290+-0.0382        ?
   infer-constant-property                            3.5950+-0.0410     ?      3.5982+-0.0271        ?
   infer-one-time-closure-ten-vars                   13.4149+-0.3159     ?     13.4872+-0.3516        ?
   infer-one-time-closure-two-vars                   13.0015+-0.2797           12.8218+-0.1699          might be 1.0140x faster
   infer-one-time-closure                            12.8049+-0.0298     ?     12.8207+-0.0621        ?
   infer-one-time-deep-closure                       21.0437+-0.3197           20.8588+-0.1900        
   inline-arguments-access                            5.2129+-0.1578            5.1299+-0.0644          might be 1.0162x faster
   inline-arguments-aliased-access                    5.2242+-0.1564     ?      5.2301+-0.1165        ?
   inline-arguments-local-escape                      5.1837+-0.0360     ?      5.2380+-0.1274        ? might be 1.0105x slower
   inline-get-scoped-var                              6.1866+-0.1032            6.1549+-0.0283        
   inlined-put-by-id-transition                      13.0531+-0.1596           13.0457+-0.0637        
   inlined-put-by-val-with-string-transition   
                                                     63.3443+-0.2408     !     64.2687+-0.6502        ! definitely 1.0146x slower
   inlined-put-by-val-with-symbol-transition   
                                                     64.2622+-0.6793           63.9568+-0.4055        
   int-or-other-abs-then-get-by-val                   6.1747+-0.0807            6.1513+-0.0102        
   int-or-other-abs-zero-then-get-by-val             23.2270+-0.6690           22.9088+-0.3377          might be 1.0139x faster
   int-or-other-add-then-get-by-val                   6.0398+-0.0302     ?      6.0794+-0.0411        ?
   int-or-other-add                                   7.2456+-0.3013            7.0909+-0.0731          might be 1.0218x faster
   int-or-other-div-then-get-by-val                   5.3155+-0.0073     ?      5.3452+-0.0551        ?
   int-or-other-max-then-get-by-val                   5.5203+-0.0908            5.4668+-0.0202        
   int-or-other-min-then-get-by-val                   5.5800+-0.0505            5.5340+-0.0861        
   int-or-other-mod-then-get-by-val                   5.0626+-0.0256     ?      5.1131+-0.0773        ?
   int-or-other-mul-then-get-by-val                   5.2667+-0.2918            5.2078+-0.1133          might be 1.0113x faster
   int-or-other-neg-then-get-by-val                   5.9263+-0.0255     ?      6.0001+-0.2106        ? might be 1.0125x slower
   int-or-other-neg-zero-then-get-by-val             22.6433+-0.0223     ?     22.8769+-0.5774        ? might be 1.0103x slower
   int-or-other-sub-then-get-by-val                   6.0096+-0.0201     ?      6.1768+-0.4171        ? might be 1.0278x slower
   int-or-other-sub                                   4.7269+-0.0700     ?      4.7401+-0.0535        ?
   int-overflow-local                                 5.8114+-0.0243     ?      5.8167+-0.0310        ?
   Int16Array-alloc-long-lived                       62.0482+-0.4430           61.7727+-0.4723        
   Int16Array-bubble-sort-with-byteLength            33.8951+-0.0413     ?     33.9199+-0.0357        ?
   Int16Array-bubble-sort                            32.3146+-0.3832     ?     32.6791+-0.6647        ? might be 1.0113x slower
   Int16Array-load-int-mul                            2.1502+-0.0209            2.1461+-0.0113        
   Int16Array-to-Int32Array-set                      65.5513+-0.1064     !     66.9551+-1.0596        ! definitely 1.0214x slower
   Int32Array-alloc-large                            23.5077+-0.7130           23.1040+-0.3614          might be 1.0175x faster
   Int32Array-alloc-long-lived                       69.5801+-0.7921           69.3700+-0.6409        
   Int32Array-alloc                                   3.3979+-0.0467     ?      3.4143+-0.0305        ?
   Int32Array-Int8Array-view-alloc                    9.1526+-0.3226            9.0344+-0.1482          might be 1.0131x faster
   int52-spill                                        6.9506+-0.0303     ?      7.0212+-0.0408        ? might be 1.0102x slower
   Int8Array-alloc-long-lived                        55.0830+-0.4828     ?     55.2060+-0.3125        ?
   Int8Array-load-with-byteLength                     4.4280+-0.0191     ?      4.4498+-0.0326        ?
   Int8Array-load                                     4.4645+-0.0530            4.4506+-0.0156        
   integer-divide                                    15.3066+-0.1551           15.2400+-0.0687        
   integer-modulo                                     2.6725+-0.0171     ?      2.6794+-0.0286        ?
   is-boolean-fold-tricky                             5.5119+-0.0371     ?      5.5133+-0.0176        ?
   is-boolean-fold                                    3.8093+-0.1570            3.7730+-0.0435        
   is-function-fold-tricky-internal-function   
                                                     15.1616+-0.0364           15.1263+-0.1508        
   is-function-fold-tricky                            5.6551+-0.0173     ?      5.6635+-0.0332        ?
   is-function-fold                                   3.7857+-0.0274     ?      3.8910+-0.1526        ? might be 1.0278x slower
   is-number-fold-tricky                              5.5328+-0.0585            5.5122+-0.0224        
   is-number-fold                                     3.7780+-0.0368     ?      3.7978+-0.0343        ?
   is-object-or-null-fold-functions                   3.8969+-0.0306     ?      3.9042+-0.0311        ?
   is-object-or-null-fold-less-tricky                 5.6267+-0.0195            5.6249+-0.0160        
   is-object-or-null-fold-tricky                      7.6111+-0.0067     ?      7.6181+-0.0201        ?
   is-object-or-null-fold                             3.8118+-0.0329     ?      3.8647+-0.0369        ? might be 1.0139x slower
   is-object-or-null-trickier-function                5.7387+-0.0327     ?      5.7529+-0.0192        ?
   is-object-or-null-trickier-internal-function   
                                                     15.6639+-0.0592     ^     15.4644+-0.0290        ^ definitely 1.0129x faster
   is-object-or-null-tricky-function                  5.7137+-0.0620            5.6886+-0.0168        
   is-object-or-null-tricky-internal-function   
                                                     11.6307+-0.0355     ?     11.7025+-0.1364        ?
   is-string-fold-tricky                              5.5241+-0.0257            5.5056+-0.0237        
   is-string-fold                                     3.7583+-0.0393     ?      3.7601+-0.0331        ?
   is-undefined-fold-tricky                           4.5741+-0.0264     ?      4.5911+-0.0320        ?
   is-undefined-fold                                  3.7713+-0.0191            3.7610+-0.0358        
   JSONP-negative-0                                   0.4697+-0.0139     ?      0.4730+-0.0177        ?
   large-int-captured                                 5.7663+-0.1180     ?      5.7776+-0.1061        ?
   large-int-neg                                     20.8974+-0.2739     ?     21.1514+-0.4169        ? might be 1.0122x slower
   large-int                                         18.7507+-0.4697     ?     18.8909+-0.6496        ?
   load-varargs-elimination                          30.3550+-0.1425     ?     30.4761+-0.6227        ?
   logical-not-weird-types                            4.5492+-0.0341     ?      4.5617+-0.0421        ?
   logical-not                                        6.2519+-0.0333            6.2330+-0.0223        
   lots-of-fields                                    15.5017+-0.2285     ?     15.6893+-0.2443        ? might be 1.0121x slower
   make-indexed-storage                               3.8999+-0.1890            3.8551+-0.2423          might be 1.0116x faster
   make-rope-cse                                      4.7989+-0.1870            4.7893+-0.1253        
   marsaglia-larger-ints                             49.0079+-0.1468           48.9558+-0.5654        
   marsaglia-osr-entry                               30.3190+-0.2560           30.1720+-0.2764        
   math-with-out-of-bounds-array-values              32.3479+-0.0783     ?     33.0661+-0.8934        ? might be 1.0222x slower
   max-boolean                                        3.3234+-0.0237            3.3083+-0.0205        
   method-on-number                                  23.0535+-0.1237     ?     23.1528+-0.1567        ?
   min-boolean                                        3.3259+-0.0252     ?      3.3350+-0.0253        ?
   minus-boolean-double                               4.2089+-0.0227     ?      4.2205+-0.0298        ?
   minus-boolean                                      3.1604+-0.0216            3.1340+-0.0180        
   misc-strict-eq                                    46.1942+-1.2908           46.1066+-0.9949        
   mod-boolean-double                                14.1957+-0.0235     ?     14.2286+-0.0700        ?
   mod-boolean                                       10.1890+-0.0375     ?     10.1983+-0.0179        ?
   mul-boolean-double                                 4.8908+-0.0159     ?      4.8969+-0.0211        ?
   mul-boolean                                        3.8256+-0.0336     ?      3.8337+-0.0333        ?
   neg-boolean                                        4.2029+-0.0202     ?      4.2231+-0.0125        ?
   negative-zero-divide                               0.6098+-0.0156            0.6073+-0.0085        
   negative-zero-modulo                               0.6016+-0.0090            0.5997+-0.0140        
   negative-zero-negate                               0.5951+-0.0118            0.5723+-0.0195          might be 1.0398x faster
   nested-function-parsing                           66.1806+-0.6127     ?     66.8495+-0.7212        ? might be 1.0101x slower
   new-array-buffer-dead                            126.4521+-0.4028     ?    127.7274+-2.6284        ? might be 1.0101x slower
   new-array-buffer-push                              8.4278+-0.1918            8.3834+-0.1417        
   new-array-dead                                    24.0793+-0.6772     ?     24.2290+-0.3362        ?
   new-array-push                                     5.1333+-0.3651            5.0118+-0.3099          might be 1.0242x faster
   no-inline-constructor                             48.2066+-0.4071     ?     48.2497+-0.3502        ?
   number-test                                        4.1570+-0.0433     ?      4.1679+-0.0305        ?
   object-closure-call                                6.9611+-0.0260     ?      7.0278+-0.1021        ?
   object-get-own-property-symbols-on-large-array   
                                                      5.0439+-0.0841            5.0230+-0.0890        
   object-test                                        3.8542+-0.0249     ?      3.8983+-0.0515        ? might be 1.0114x slower
   obvious-sink-pathology-taken                     147.2171+-0.4824     ?    147.3936+-0.3548        ?
   obvious-sink-pathology                            48.4109+-1.2648           47.2630+-0.3798          might be 1.0243x faster
   obviously-elidable-new-object                     42.5029+-0.4969           42.3176+-0.2107        
   plus-boolean-arith                                 3.3719+-0.0189     ?      3.3982+-0.0357        ?
   plus-boolean-double                                4.2336+-0.0109            4.2302+-0.0344        
   plus-boolean                                       3.2150+-0.0190            3.2082+-0.0244        
   poly-chain-access-different-prototypes-simple   
                                                      3.4883+-0.0149     ?      3.4960+-0.0170        ?
   poly-chain-access-different-prototypes             3.5261+-0.0178     ?      3.5311+-0.0129        ?
   poly-chain-access-simpler                          3.4964+-0.0298     ?      3.4968+-0.0216        ?
   poly-chain-access                                  3.5930+-0.2091            3.4789+-0.0135          might be 1.0328x faster
   poly-stricteq                                     85.3781+-0.1439     ^     84.8024+-0.0402        ^ definitely 1.0068x faster
   polymorphic-array-call                             1.9637+-0.0855            1.9196+-0.0444          might be 1.0230x faster
   polymorphic-get-by-id                              4.5781+-0.2795            4.4572+-0.0139          might be 1.0271x faster
   polymorphic-put-by-id                             47.8955+-0.9574           47.7018+-1.2013        
   polymorphic-put-by-val-with-string                48.2575+-0.1291           48.1401+-0.0890        
   polymorphic-put-by-val-with-symbol                48.1048+-0.1611           48.0009+-0.1271        
   polymorphic-structure                             18.0145+-0.2035           17.9283+-0.0332        
   polyvariant-monomorphic-get-by-id                 11.0250+-0.0192     ?     11.0368+-0.0443        ?
   proto-getter-access                               11.8499+-0.1543     ?     11.8517+-0.1541        ?
   prototype-access-with-mutating-prototype           7.5888+-0.1629     ?      7.8445+-0.2496        ? might be 1.0337x slower
   put-by-id-replace-and-transition                  11.4785+-0.2929           11.3941+-0.0875        
   put-by-id-slightly-polymorphic                     3.7780+-0.0178            3.7751+-0.0194        
   put-by-id                                         14.5816+-0.2941     ?     14.7108+-0.2355        ?
   put-by-val-direct                                  0.6218+-0.0085     ?      0.6381+-0.0239        ? might be 1.0262x slower
   put-by-val-large-index-blank-indexing-type   
                                                      7.2172+-0.0705     ?      7.3235+-0.0941        ? might be 1.0147x slower
   put-by-val-machine-int                             3.4830+-0.0552            3.4661+-0.0316        
   put-by-val-with-string-replace-and-transition   
                                                     16.4955+-0.1470           16.4267+-0.1676        
   put-by-val-with-string-slightly-polymorphic   
                                                      4.9906+-0.0194     ?      4.9942+-0.0223        ?
   put-by-val-with-string                            15.4738+-0.2959     ?     15.5500+-0.5163        ?
   put-by-val-with-symbol-replace-and-transition   
                                                     17.8430+-0.1608     ?     17.8630+-0.2150        ?
   put-by-val-with-symbol-slightly-polymorphic   
                                                      5.4245+-0.0983            5.3969+-0.0274        
   put-by-val-with-symbol                            15.4625+-0.1829     ?     15.5842+-0.1988        ?
   rare-osr-exit-on-local                            20.3449+-0.5166           20.1108+-0.0883          might be 1.0116x faster
   raytrace-with-empty-try-catch                      9.0645+-0.0769     ?      9.4269+-0.3479        ? might be 1.0400x slower
   raytrace-with-try-catch                           16.1974+-0.0928     !     16.7918+-0.1468        ! definitely 1.0367x slower
   register-pressure-from-osr                        26.7919+-0.0664           26.7467+-0.0362        
   repeat-multi-get-by-offset                        31.3455+-0.2489     ?     31.3967+-0.2630        ?
   richards-empty-try-catch                         113.0495+-0.2989     ^     84.1128+-0.5069        ^ definitely 1.3440x faster
   richards-try-catch                               367.6120+-0.9552     ^    347.9143+-0.7705        ^ definitely 1.0566x faster
   setter-prototype                                  11.2856+-0.1366           11.1988+-0.1101        
   setter                                             6.9842+-0.0367     !      7.5522+-0.0315        ! definitely 1.0813x slower
   simple-activation-demo                            34.2698+-0.0445     !     34.5722+-0.1346        ! definitely 1.0088x slower
   simple-getter-access                              15.0856+-0.1264           15.0750+-0.2182        
   simple-poly-call-nested                           10.9037+-0.0399     ?     10.9105+-0.0208        ?
   simple-poly-call                                   1.8523+-0.0123     ?      1.8658+-0.0406        ?
   sin-boolean                                       27.4172+-1.9574     ?     27.6710+-2.0016        ?
   singleton-scope                                   87.7592+-0.1571           87.7256+-0.0899        
   sink-function                                     14.3578+-0.3682           14.3050+-0.2608        
   sink-huge-activation                              23.7119+-0.7290     ?     23.8169+-0.7180        ?
   sinkable-new-object-dag                           80.7602+-1.0669           80.1509+-0.9389        
   sinkable-new-object-taken                         64.9570+-0.9753           64.5273+-0.5173        
   sinkable-new-object                               47.5326+-0.4805           47.3303+-0.3615        
   slow-array-profile-convergence                     4.0960+-0.0319            4.0625+-0.0944        
   slow-convergence                                   3.9076+-0.0240     ?      3.9310+-0.0628        ?
   slow-ternaries                                    25.9367+-1.8601           24.0780+-0.6306          might be 1.0772x faster
   sorting-benchmark                                 26.4254+-0.2587           26.2175+-0.2076        
   sparse-conditional                                 1.7572+-0.0197     ?      1.7801+-0.0262        ? might be 1.0130x slower
   splice-to-remove                                  19.8411+-0.2623     ?     20.3963+-0.7191        ? might be 1.0280x slower
   string-char-code-at                               21.8926+-0.1747     ?     22.0714+-0.1215        ?
   string-concat-object                               2.8061+-0.0315     ?      2.8091+-0.0266        ?
   string-concat-pair-object                          2.7487+-0.1042            2.7467+-0.0579        
   string-concat-pair-simple                         13.9155+-0.1368           13.7682+-0.2026          might be 1.0107x faster
   string-concat-simple                              14.3997+-0.1348     ?     14.4180+-0.2095        ?
   string-cons-repeat                                 9.4916+-0.0914     ?      9.5541+-0.1348        ?
   string-cons-tower                                  9.6812+-0.1287            9.5921+-0.0619        
   string-equality                                   26.3931+-0.2201     ^     26.1519+-0.0168        ^ definitely 1.0092x faster
   string-get-by-val-big-char                         9.4265+-0.1205     ?      9.6035+-0.4154        ? might be 1.0188x slower
   string-get-by-val-out-of-bounds-insane             5.0723+-0.0291     ^      4.9451+-0.0609        ^ definitely 1.0257x faster
   string-get-by-val-out-of-bounds                    6.7534+-0.0182     ?      6.7908+-0.1770        ?
   string-get-by-val                                  4.4754+-0.0157     ^      4.4182+-0.0278        ^ definitely 1.0130x faster
   string-hash                                        2.7596+-0.0245     !      2.8600+-0.0201        ! definitely 1.0364x slower
   string-long-ident-equality                        21.6338+-0.5646           21.3616+-0.0201          might be 1.0127x faster
   string-out-of-bounds                              17.7958+-0.3309           17.6335+-0.1310        
   string-repeat-arith                               42.7820+-0.0756     ^     41.9874+-0.3393        ^ definitely 1.0189x faster
   string-sub                                        55.4495+-0.5206     !     57.6474+-0.3389        ! definitely 1.0396x slower
   string-test                                        4.0044+-0.0505            3.9931+-0.0249        
   string-var-equality                               48.2370+-0.4813           48.0645+-0.1804        
   structure-hoist-over-transitions                   3.1841+-0.0306     ?      3.2639+-0.2128        ? might be 1.0251x slower
   substring-concat-weird                            52.3875+-0.2782     ?     53.1224+-0.9411        ? might be 1.0140x slower
   substring-concat                                  57.8740+-0.5279     ?     57.9377+-0.7254        ?
   substring                                         64.3088+-0.6575     ?     64.4199+-0.6815        ?
   switch-char-constant                               3.6063+-0.0202     ?      3.6458+-0.0862        ? might be 1.0110x slower
   switch-char                                        7.8962+-0.0241            7.8239+-0.1148        
   switch-constant                                   10.0418+-0.1114           10.0325+-0.0557        
   switch-string-basic-big-var                       26.2134+-0.2645           25.9732+-0.1420        
   switch-string-basic-big                           23.0507+-0.1689           22.8819+-0.4930        
   switch-string-basic-var                           21.2726+-0.1254     ?     21.2735+-0.1566        ?
   switch-string-basic                               19.6991+-0.0633           19.6801+-0.0799        
   switch-string-big-length-tower-var                27.1884+-0.0928           27.1245+-0.0329        
   switch-string-length-tower-var                    20.7887+-0.0413     ?     20.8838+-0.1592        ?
   switch-string-length-tower                        17.7304+-0.1589     ?     17.9085+-0.4269        ? might be 1.0100x slower
   switch-string-short                               17.9003+-0.4407           17.6361+-0.0411          might be 1.0150x faster
   switch                                            14.6163+-0.1979     ?     14.6401+-0.1343        ?
   tear-off-arguments-simple                          4.0258+-0.0663            3.9925+-0.0359        
   tear-off-arguments                                 5.4697+-0.1217     ?      5.4714+-0.1355        ?
   temporal-structure                                17.0435+-0.1432     ?     17.0510+-0.0782        ?
   to-int32-boolean                                  17.8025+-0.0191     ?     17.8228+-0.0356        ?
   try-catch-get-by-val-cloned-arguments             13.5372+-0.0931     !     14.6710+-0.5445        ! definitely 1.0837x slower
   try-catch-get-by-val-direct-arguments              2.9562+-0.0134     !      3.0598+-0.0896        ! definitely 1.0351x slower
   try-catch-get-by-val-scoped-arguments              6.0639+-0.0580     !      6.4113+-0.0431        ! definitely 1.0573x slower
   typed-array-get-set-by-val-profiling              39.2088+-0.3736     ?     39.4321+-0.4843        ?
   undefined-property-access                        478.5985+-6.0009          475.7620+-0.8805        
   undefined-test                                     4.0956+-0.0140     ?      4.1058+-0.0282        ?
   unprofiled-licm                                   17.5083+-0.1304           17.2962+-0.3002          might be 1.0123x faster
   v8-raytrace-with-empty-try-catch                  75.6069+-0.5258     !     81.1628+-0.7679        ! definitely 1.0735x slower
   v8-raytrace-with-try-catch                       108.2109+-0.4881     ?    109.2809+-0.5843        ?
   varargs-call                                      19.1720+-0.1382           19.1426+-0.1269        
   varargs-construct-inline                          33.4982+-0.1495     ?     33.4997+-0.2641        ?
   varargs-construct                                 28.3209+-0.5075           28.1606+-0.2136        
   varargs-inline                                    13.0551+-0.0453           13.0341+-0.0614        
   varargs-strict-mode                               14.6184+-0.2531           14.5505+-0.0515        
   varargs                                           14.3366+-0.0595     ?     14.3532+-0.0812        ?
   weird-inlining-const-prop                          3.0874+-0.1889            3.0166+-0.0291          might be 1.0235x faster

   &lt;geometric&gt;                                       11.9098+-0.0163     ?     11.9201+-0.0069        ? might be 1.0009x slower

                                                            og                   tryCatchFTL                                    
CompressionBench:
   huffman                                           77.7389+-0.2092           77.4119+-0.5537        
   arithmetic-simple                                459.2286+-2.4190          459.0173+-2.1644        
   arithmetic-precise                               372.5100+-2.4770          371.9389+-2.3667        
   arithmetic-complex-precise                       369.0174+-3.6257     ?    371.5642+-2.9929        ?
   arithmetic-precise-order-0                       473.1260+-2.6836     ?    475.1393+-2.4583        ?
   arithmetic-precise-order-1                       438.9898+-3.2065     ?    443.3207+-5.1113        ?
   arithmetic-precise-order-2                       524.1101+-1.7310     ?    528.2253+-4.8734        ?
   arithmetic-simple-order-1                        527.2271+-2.9088     ?    529.6829+-2.4231        ?
   arithmetic-simple-order-2                        603.3105+-1.3987          601.8619+-2.0701        
   lz-string                                        396.8121+-3.6034          392.1369+-4.0209          might be 1.0119x faster

   &lt;geometric&gt;                                      382.7134+-0.8489     ?    383.2058+-1.0862        ? might be 1.0013x slower

                                                            og                   tryCatchFTL                                    
Geomean of preferred means:
   &lt;scaled-result&gt;                                   51.8039+-0.0617     ?     51.9026+-0.0614        ? might be 1.0019x slower</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1139451</commentid>
    <comment_count>10</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-11-04 14:40:24 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; perf numbers:
&gt; Benchmark report for SunSpider, LongSpider, V8Spider, Octane, Kraken,
&gt; JSRegress, and CompressionBench on Saams-Mac-Pro (MacPro6,1).
&gt; 
&gt; VMs tested:
&gt; &quot;og&quot; at /Volumes/Data/WK/os-a/OpenSource/WebKitBuild/Release/jsc (r191931)

Does this have the try/catch patch?  Note that run-jsc-benchmarks isn&apos;t smart enough to clear environment between runs, so this will see JSC_useFTLTryCatch=1 for some subset of runs.  You can avoid this by explicitly giving it JSC_useFTLTryCatch=0.

&gt; &quot;tryCatchFTL&quot; at /Volumes/Data/WK/os-b/OpenSource/WebKitBuild/Release/jsc
&gt; (r191931)
&gt;     export JSC_useFTLTryCatch=1
&gt; 
&gt; Collected 8 samples per benchmark/VM, with 8 VM invocations per benchmark.
&gt; Emitted a call to gc() between sample measurements.
&gt; Used 1 benchmark iteration per VM invocation for warm-up. Used the
&gt; jsc-specific preciseTime() function to get microsecond-level
&gt; timing. Reporting benchmark execution times with 95% confidence intervals in
&gt; milliseconds.
&gt; 
&gt;                                                             og              
&gt; tryCatchFTL                                    
&gt; SunSpider:
&gt;    3d-cube                                            7.7318+-0.2891     ?  
&gt; 7.7646+-0.3291        ?
&gt;    3d-morph                                           7.6685+-0.1132        
&gt; 7.5786+-0.0166          might be 1.0119x faster
&gt;    3d-raytrace                                        8.7827+-0.0470     !  
&gt; 8.9757+-0.1378        ! definitely 1.0220x slower
&gt;    access-binary-trees                                3.1983+-0.0861        
&gt; 3.1181+-0.0286          might be 1.0257x faster
&gt;    access-fannkuch                                    8.5316+-0.0204        
&gt; 8.5183+-0.0283        
&gt;    access-nbody                                       4.0146+-0.0128     !  
&gt; 4.0625+-0.0229        ! definitely 1.0119x slower
&gt;    access-nsieve                                      4.6482+-0.0631     ?  
&gt; 4.7240+-0.1315        ? might be 1.0163x slower
&gt;    bitops-3bit-bits-in-byte                           1.7445+-0.0116        
&gt; 1.7252+-0.0289          might be 1.0112x faster
&gt;    bitops-bits-in-byte                                4.7152+-0.0443        
&gt; 4.6540+-0.0510          might be 1.0131x faster
&gt;    bitops-bitwise-and                                 2.9341+-0.0209     ?  
&gt; 2.9499+-0.0345        ?
&gt;    bitops-nsieve-bits                                 4.2878+-0.0597     ?  
&gt; 4.3193+-0.0485        ?
&gt;    controlflow-recursive                              3.3498+-0.0420     ?  
&gt; 3.3818+-0.0887        ?
&gt;    crypto-aes                                         6.4524+-0.0433     ?  
&gt; 6.5012+-0.0659        ?
&gt;    crypto-md5                                         3.7576+-0.0690        
&gt; 3.7352+-0.0274        
&gt;    crypto-sha1                                        3.4822+-0.0216     ?  
&gt; 3.4908+-0.0269        ?
&gt;    date-format-tofte                                 13.1756+-0.1440        
&gt; 12.9432+-0.0935          might be 1.0180x faster
&gt;    date-format-xparb                                  7.5453+-0.0446     ?  
&gt; 7.8588+-0.4768        ? might be 1.0415x slower
&gt;    math-cordic                                        4.1428+-0.0180     !  
&gt; 4.2498+-0.0103        ! definitely 1.0258x slower
&gt;    math-partial-sums                                  7.6096+-0.0744     ?  
&gt; 7.6150+-0.0378        ?
&gt;    math-spectral-norm                                 2.8456+-0.0163        
&gt; 2.8391+-0.0195        
&gt;    regexp-dna                                         9.5471+-0.0929        
&gt; 9.4803+-0.0436        
&gt;    string-base64                                      6.4017+-0.0415        
&gt; 6.3494+-0.0387        
&gt;    string-fasta                                       8.4615+-0.0677     ?  
&gt; 8.5814+-0.0732        ? might be 1.0142x slower
&gt;    string-tagcloud                                   12.0362+-0.0682     ?  
&gt; 12.1867+-0.3330        ? might be 1.0125x slower
&gt;    string-unpack-code                                26.6557+-0.2382     !  
&gt; 27.5564+-0.2432        ! definitely 1.0338x slower
&gt;    string-validate-input                              6.3377+-0.0464        
&gt; 6.2983+-0.0812        
&gt; 
&gt;    &lt;arithmetic&gt;                                       6.9253+-0.0287     ?  
&gt; 6.9791+-0.0332        ? might be 1.0078x slower

These almost-1% changes in SunSpider are often worth worrying about a bit.

&gt; 
&gt;                                                             og              
&gt; tryCatchFTL                                    
&gt; LongSpider:
&gt;    3d-cube                                         1188.8931+-9.5461        
&gt; 1187.4914+-11.3300       
&gt;    3d-morph                                        2083.0633+-1.2383        
&gt; 2082.9016+-1.3679        
&gt;    3d-raytrace                                      917.3685+-2.9928     ?  
&gt; 925.2569+-12.5572       ?
&gt;    access-binary-trees                             1198.9734+-3.9164     ?  
&gt; 1199.2009+-3.2474        ?
&gt;    access-fannkuch                                  488.3999+-3.9992     ?  
&gt; 492.0440+-5.3081        ?
&gt;    access-nbody                                     802.4822+-0.1273     ?  
&gt; 803.0908+-0.5761        ?
&gt;    access-nsieve                                    582.9100+-3.6242        
&gt; 580.0134+-2.9943        
&gt;    bitops-3bit-bits-in-byte                          50.8018+-0.0778     ?  
&gt; 51.0549+-0.4265        ?
&gt;    bitops-bits-in-byte                              135.2148+-2.1492     ?  
&gt; 135.6178+-1.1939        ?
&gt;    bitops-nsieve-bits                               587.4410+-2.6615     ?  
&gt; 589.9493+-0.7425        ?
&gt;    controlflow-recursive                            649.5424+-0.3307     ?  
&gt; 649.8575+-0.7843        ?
&gt;    crypto-aes                                       839.0770+-2.8150     ?  
&gt; 843.0469+-4.8519        ?
&gt;    crypto-md5                                       731.6777+-7.2102     ?  
&gt; 742.9239+-19.8971       ? might be 1.0154x slower
&gt;    crypto-sha1                                      975.5347+-5.6638        
&gt; 973.2252+-7.1624        
&gt;    date-format-tofte                               1044.2230+-11.6837       
&gt; 1020.2409+-20.7328         might be 1.0235x faster
&gt;    date-format-xparb                               1058.3864+-25.7146    ?  
&gt; 1072.6612+-14.3662       ? might be 1.0135x slower
&gt;    hash-map                                         225.3840+-1.7498     ^  
&gt; 219.4016+-3.2056        ^ definitely 1.0273x faster
&gt;    math-cordic                                      737.2517+-1.0281     ?  
&gt; 737.3510+-1.1992        ?
&gt;    math-partial-sums                                735.8625+-3.3264     ?  
&gt; 738.0363+-1.7039        ?
&gt;    math-spectral-norm                               769.3866+-1.1700     ?  
&gt; 770.1925+-2.6041        ?
&gt;    string-base64                                    538.6395+-1.2272     ?  
&gt; 539.2767+-1.3810        ?
&gt;    string-fasta                                     548.1288+-2.6840     ?  
&gt; 548.3836+-3.2819        ?
&gt;    string-tagcloud                                  265.6915+-4.6541     ?  
&gt; 267.5320+-0.9542        ?
&gt; 
&gt;    &lt;geometric&gt;                                      600.2040+-1.0248     ?  
&gt; 600.6379+-0.9728        ? might be 1.0007x slower
&gt; 
&gt;                                                             og              
&gt; tryCatchFTL                                    
&gt; V8Spider:
&gt;    crypto                                            71.3041+-0.2318        
&gt; 71.0136+-0.2334        
&gt;    deltablue                                         89.8814+-2.1664        
&gt; 89.3356+-2.0044        
&gt;    earley-boyer                                      60.3759+-0.3076     ?  
&gt; 60.5201+-0.2591        ?
&gt;    raytrace                                          41.5776+-0.5643        
&gt; 41.5698+-0.6973        
&gt;    regexp                                            98.2870+-0.3354     ?  
&gt; 98.5057+-0.5341        ?
&gt;    richards                                          73.4603+-0.3084        
&gt; 73.4511+-0.3076        
&gt;    splay                                             49.2939+-0.8303     ?  
&gt; 49.3256+-0.4574        ?
&gt; 
&gt;    &lt;geometric&gt;                                       66.4527+-0.3124        
&gt; 66.4037+-0.2446          might be 1.0007x faster
&gt; 
&gt;                                                             og              
&gt; tryCatchFTL                                    
&gt; Octane:
&gt;    encrypt                                           0.24868+-0.00449       
&gt; 0.24730+-0.00317       
&gt;    decrypt                                           4.43595+-0.00982    ?  
&gt; 4.44383+-0.02129       ?
&gt;    deltablue                                x2       0.20500+-0.00132       
&gt; 0.20477+-0.00151       
&gt;    earley                                            0.45570+-0.00212    ?  
&gt; 0.45650+-0.00072       ?
&gt;    boyer                                             6.86504+-0.02925    ?  
&gt; 6.87532+-0.02627       ?
&gt;    navier-stokes                            x2       6.90602+-0.00195    ?  
&gt; 6.91146+-0.00796       ?
&gt;    raytrace                                 x2       1.32399+-0.00776       
&gt; 1.31548+-0.00246       
&gt;    richards                                 x2       0.14132+-0.00044       
&gt; 0.14124+-0.00050       
&gt;    splay                                    x2       0.48201+-0.00215    ?  
&gt; 0.48402+-0.00298       ?
&gt;    regexp                                   x2      36.60402+-0.04381       
&gt; 36.57678+-0.14806       
&gt;    pdfjs                                    x2      56.05452+-0.15730    ?  
&gt; 56.34902+-0.27651       ?
&gt;    mandreel                                 x2      65.60110+-0.40834       
&gt; 65.58532+-0.43011       
&gt;    gbemu                                    x2      54.22581+-0.52596    ?  
&gt; 59.66801+-5.56773       ? might be 1.1004x slower

This could be a problem, but I think I remember the issue: there is one function that has try/catch and we compile it very badly with our optimizing compilers.  So, tiering up is hurting us.  Probably unavoidable, and probably shouldn&apos;t block landing.  We can always optimize that function later.

&gt;    closure                                           0.99907+-0.00316    !  
&gt; 1.01165+-0.00666       ! definitely 1.0126x slower
&gt;    jquery                                           12.95375+-0.05028    !  
&gt; 13.11738+-0.03357       ! definitely 1.0126x slower

Looks like you legitimately regressed load times.

&gt;    box2d                                    x2      16.27456+-0.06560    ?  
&gt; 16.30702+-0.04553       ?
&gt;    zlib                                     x2     525.38317+-17.48066   ?  
&gt; 530.76764+-16.74861      ? might be 1.0102x slower
&gt;    typescript                               x2    1138.17670+-9.50976    ? 
&gt; 1139.33826+-4.35283       ?
&gt; 
&gt;    &lt;geometric&gt;                                       8.29485+-0.02249    ?  
&gt; 8.36000+-0.05506       ? might be 1.0079x slower
&gt; 
&gt;                                                             og              
&gt; tryCatchFTL                                    
&gt; Kraken:
&gt;    ai-astar                                          225.313+-2.074         
&gt; 222.881+-2.281           might be 1.0109x faster
&gt;    audio-beat-detection                               73.704+-0.615      ?  
&gt; 73.806+-0.428         ?
&gt;    audio-dft                                         142.506+-0.299         
&gt; 142.504+-0.315         
&gt;    audio-fft                                          54.915+-0.192      ?  
&gt; 55.215+-0.830         ?
&gt;    audio-oscillator                                   89.005+-0.096      ?  
&gt; 89.144+-0.100         ?
&gt;    imaging-darkroom                                   93.997+-0.065      ^  
&gt; 93.898+-0.009         ^ definitely 1.0011x faster
&gt;    imaging-desaturate                                 86.545+-0.472      ^  
&gt; 84.000+-0.528         ^ definitely 1.0303x faster
&gt;    imaging-gaussian-blur                             152.696+-5.794         
&gt; 149.450+-1.171           might be 1.0217x faster
&gt;    json-parse-financial                               62.988+-0.275      ?  
&gt; 63.491+-0.336         ?
&gt;    json-stringify-tinderbox                           38.570+-0.062      !  
&gt; 38.979+-0.242         ! definitely 1.0106x slower
&gt;    stanford-crypto-aes                                64.545+-0.928      ?  
&gt; 65.250+-0.637         ? might be 1.0109x slower
&gt;    stanford-crypto-ccm                                58.422+-1.374      ?  
&gt; 60.002+-1.966         ? might be 1.0270x slower
&gt;    stanford-crypto-pbkdf2                            142.699+-1.068         
&gt; 140.808+-0.997           might be 1.0134x faster
&gt;    stanford-crypto-sha256-iterative                   56.398+-0.114      !  
&gt; 57.012+-0.403         ! definitely 1.0109x slower
&gt; 
&gt;    &lt;arithmetic&gt;                                       95.879+-0.511         
&gt; 95.460+-0.231           might be 1.0044x faster

Based on this result, I wouldn&apos;t worry about any individual Kraken tests.

&gt; 
&gt;                                                             og              
&gt; tryCatchFTL                                    
&gt; JSRegress:
&gt;    abc-forward-loop-equal                            63.3475+-0.4160        
&gt; 63.2240+-0.2044        
&gt;    abc-postfix-backward-loop                         62.8633+-0.2640     ?  
&gt; 63.0130+-0.4050        ?
&gt;    abc-simple-backward-loop                          62.4372+-0.4001     ?  
&gt; 62.6392+-0.4136        ?
&gt;    abc-simple-forward-loop                           62.5321+-0.2598        
&gt; 62.2620+-0.0832        
&gt;    abc-skippy-loop                                   43.0899+-0.2394        
&gt; 43.0164+-0.1408        
&gt;    abs-boolean                                        3.5862+-0.0996        
&gt; 3.5779+-0.0297        
&gt;    adapt-to-double-divide                            21.9794+-0.3256     ?  
&gt; 21.9898+-0.3125        ?
&gt;    aliased-arguments-getbyval                         1.6366+-0.0238     ?  
&gt; 1.6631+-0.0501        ? might be 1.0162x slower
&gt;    allocate-big-object                                3.1045+-0.0752     ?  
&gt; 3.1634+-0.0961        ? might be 1.0190x slower
&gt;    arguments-named-and-reflective                    15.0502+-0.3219        
&gt; 14.9253+-0.2813        
&gt;    arguments-out-of-bounds                           16.5513+-0.0896     ?  
&gt; 16.6654+-0.3284        ?
&gt;    arguments-strict-mode                             14.9821+-0.4023        
&gt; 14.7100+-0.6954          might be 1.0185x faster
&gt;    arguments                                         12.3274+-0.1512     ?  
&gt; 12.3915+-0.2026        ?
&gt;    arity-mismatch-inlining                            1.3090+-0.0185     ?  
&gt; 1.3254+-0.0335        ? might be 1.0126x slower
&gt;    array-access-polymorphic-structure                10.1241+-0.0399     ?  
&gt; 10.1441+-0.0947        ?
&gt;    array-nonarray-polymorhpic-access                 40.3380+-0.2734        
&gt; 40.3296+-0.8212        
&gt;    array-prototype-every                            114.0440+-2.1082        
&gt; 111.0172+-0.9801          might be 1.0273x faster
&gt;    array-prototype-forEach                          111.7209+-2.2576     ?  
&gt; 113.1471+-3.2510        ? might be 1.0128x slower
&gt;    array-prototype-map                              121.9940+-1.4139        
&gt; 121.7484+-1.5580        
&gt;    array-prototype-reduce                           107.4395+-0.4856     ?  
&gt; 109.5369+-3.4575        ? might be 1.0195x slower
&gt;    array-prototype-reduceRight                      107.0463+-0.9081     ?  
&gt; 108.6180+-1.7984        ? might be 1.0147x slower
&gt;    array-prototype-some                             113.1937+-2.3106        
&gt; 111.3853+-1.0041          might be 1.0162x faster
&gt;    array-splice-contiguous                           37.6819+-0.4250        
&gt; 37.5627+-0.2990        
&gt;    array-with-double-add                              5.6631+-0.0165     !  
&gt; 5.6981+-0.0147        ! definitely 1.0062x slower
&gt;    array-with-double-increment                        4.5035+-0.1151        
&gt; 4.3904+-0.0407          might be 1.0258x faster
&gt;    array-with-double-mul-add                          6.7439+-0.0295     !  
&gt; 6.8033+-0.0154        ! definitely 1.0088x slower
&gt;    array-with-double-sum                              4.3987+-0.0319     ?  
&gt; 4.4326+-0.1039        ?
&gt;    array-with-int32-add-sub                           9.3107+-0.0378     ?  
&gt; 9.3123+-0.0343        ?
&gt;    array-with-int32-or-double-sum                     4.4683+-0.0294        
&gt; 4.4663+-0.0158        
&gt;    ArrayBuffer-DataView-alloc-large-long-lived   
&gt;                                                      41.8414+-0.7454        
&gt; 41.0974+-0.6262          might be 1.0181x faster
&gt;    ArrayBuffer-DataView-alloc-long-lived             19.2403+-0.5667     ^  
&gt; 18.4660+-0.1250        ^ definitely 1.0419x faster
&gt;    ArrayBuffer-Int32Array-byteOffset                  5.0944+-0.0515        
&gt; 5.0836+-0.0223        
&gt;    ArrayBuffer-Int8Array-alloc-large-long-lived   
&gt;                                                      42.2101+-1.0536        
&gt; 41.7061+-0.3487          might be 1.0121x faster
&gt;    ArrayBuffer-Int8Array-alloc-long-lived-buffer   
&gt;                                                      30.8179+-1.4365        
&gt; 29.5974+-0.5716          might be 1.0412x faster
&gt;    ArrayBuffer-Int8Array-alloc-long-lived            17.9333+-0.7187     ^  
&gt; 16.8913+-0.0931        ^ definitely 1.0617x faster
&gt;    ArrayBuffer-Int8Array-alloc                       15.2933+-0.7130        
&gt; 14.5156+-0.2310          might be 1.0536x faster
&gt;    arrowfunction-call                                15.5807+-0.1875     ?  
&gt; 15.6777+-0.1370        ?
&gt;    asmjs_bool_bug                                    11.1322+-0.0324     ?  
&gt; 11.1454+-0.0500        ?
&gt;    assign-custom-setter-polymorphic                   4.1706+-0.0369     ?  
&gt; 4.1707+-0.0363        ?
&gt;    assign-custom-setter                               5.9839+-0.0558     !  
&gt; 6.1091+-0.0483        ! definitely 1.0209x slower
&gt;    basic-set                                         11.0205+-0.2735     ?  
&gt; 11.0829+-0.1842        ?
&gt;    big-int-mul                                        5.1796+-0.0192        
&gt; 5.1567+-0.0196        
&gt;    boolean-test                                       4.2112+-0.0188        
&gt; 4.2067+-0.0333        
&gt;    branch-fold                                        5.0700+-0.2137        
&gt; 5.0214+-0.0369        
&gt;    branch-on-string-as-boolean                       26.4431+-0.3909        
&gt; 26.4022+-0.1342        
&gt;    by-val-generic                                     3.3008+-0.0436     ?  
&gt; 3.3068+-0.0369        ?
&gt;    call-spread-apply                                 39.7921+-0.4558     ?  
&gt; 41.9557+-2.7748        ? might be 1.0544x slower
&gt;    call-spread-call                                  32.4424+-0.1999     !  
&gt; 34.0822+-0.5237        ! definitely 1.0505x slower
&gt;    captured-assignments                               0.7687+-0.0260     ?  
&gt; 0.7710+-0.0099        ?
&gt;    cast-int-to-double                                 7.0543+-0.1401        
&gt; 7.0345+-0.0750        
&gt;    cell-argument                                      9.3176+-0.0657        
&gt; 9.1951+-0.2594          might be 1.0133x faster
&gt;    cfg-simplify                                       3.7974+-0.0225        
&gt; 3.7856+-0.0249        
&gt;    chain-getter-access                               12.0040+-0.1887        
&gt; 11.9343+-0.2982        
&gt;    cmpeq-obj-to-obj-other                            12.7351+-0.0148     ?  
&gt; 12.7800+-0.0463        ?
&gt;    constant-test                                      6.4984+-0.0262     ?  
&gt; 6.5008+-0.0217        ?
&gt;    create-lots-of-functions                          13.2535+-0.1253     ?  
&gt; 13.5204+-0.2569        ? might be 1.0201x slower
&gt;    cse-new-array-buffer                               3.0907+-0.0333     ?  
&gt; 3.1250+-0.0955        ? might be 1.0111x slower
&gt;    cse-new-array                                      3.1567+-0.0460     ?  
&gt; 3.1840+-0.1885        ?
&gt;    custom-setter-getter-as-put-get-by-id              0.8945+-0.0926        
&gt; 0.8759+-0.0327          might be 1.0213x faster
&gt;    DataView-custom-properties                        49.8279+-0.6043     ^  
&gt; 48.3618+-0.6240        ^ definitely 1.0303x faster
&gt;    delay-tear-off-arguments-strictmode               18.5628+-0.2356     ?  
&gt; 19.0715+-0.4846        ? might be 1.0274x slower
&gt;    deltablue-varargs                                287.4734+-2.1344     ?  
&gt; 290.6596+-1.2205        ? might be 1.0111x slower
&gt;    destructuring-arguments                          236.8381+-1.1515     ?  
&gt; 239.4278+-1.7604        ? might be 1.0109x slower
&gt;    destructuring-parameters-overridden-by-function   
&gt;                                                       0.7963+-0.0139        
&gt; 0.7858+-0.0241          might be 1.0134x faster
&gt;    destructuring-swap                                 6.7498+-0.0338     ?  
&gt; 6.7670+-0.0508        ?
&gt;    direct-arguments-getbyval                          1.6193+-0.0196     ?  
&gt; 1.6400+-0.0270        ? might be 1.0128x slower
&gt;    div-boolean-double                                 6.7556+-0.0122     ?  
&gt; 6.7617+-0.0264        ?
&gt;    div-boolean                                       10.2124+-0.0247     ?  
&gt; 10.2531+-0.1326        ?
&gt;    double-get-by-val-out-of-bounds                    6.0294+-0.0654     ?  
&gt; 6.1205+-0.1200        ? might be 1.0151x slower
&gt;    double-pollution-getbyval                         11.2878+-0.0238     ?  
&gt; 11.2947+-0.0185        ?
&gt;    double-pollution-putbyoffset                       5.3757+-0.0609        
&gt; 5.3493+-0.0453        
&gt;    double-real-use                                   39.8454+-0.0766     ^  
&gt; 39.7216+-0.0317        ^ definitely 1.0031x faster
&gt;    double-to-int32-typed-array-no-inline              3.1541+-0.0256     ?  
&gt; 3.1846+-0.0194        ?
&gt;    double-to-int32-typed-array                        2.9898+-0.0265        
&gt; 2.9820+-0.0649        
&gt;    double-to-uint32-typed-array-no-inline             3.2617+-0.0186     ?  
&gt; 3.2979+-0.0270        ? might be 1.0111x slower
&gt;    double-to-uint32-typed-array                       3.0242+-0.0325     ?  
&gt; 3.0438+-0.0219        ?
&gt;    elidable-new-object-dag                           51.3011+-1.1899        
&gt; 50.5162+-0.5381          might be 1.0155x faster
&gt;    elidable-new-object-roflcopter                    47.4789+-1.2456        
&gt; 47.1147+-0.2583        
&gt;    elidable-new-object-then-call                     47.0069+-0.3236     ?  
&gt; 47.5357+-0.5389        ? might be 1.0112x slower
&gt;    elidable-new-object-tree                          56.2869+-1.0259        
&gt; 56.2137+-0.8332        
&gt;    empty-string-plus-int                              7.0761+-0.0231     !  
&gt; 7.2751+-0.0655        ! definitely 1.0281x slower
&gt;    emscripten-cube2hash                              53.6001+-0.6832     ?  
&gt; 53.9487+-0.6607        ?
&gt;    exit-length-on-plain-object                       22.1904+-0.1728        
&gt; 22.1891+-0.1559        
&gt;    external-arguments-getbyval                        1.8026+-0.0706        
&gt; 1.7785+-0.1044          might be 1.0136x faster
&gt;    external-arguments-putbyval                        3.2903+-0.0862     ?  
&gt; 3.2992+-0.1041        ?
&gt;    fixed-typed-array-storage-var-index                1.8135+-0.0233        
&gt; 1.8081+-0.0228        
&gt;    fixed-typed-array-storage                          1.4031+-0.0179     ?  
&gt; 1.4143+-0.0241        ?
&gt;    Float32Array-matrix-mult                           6.6340+-0.0231     !  
&gt; 6.6963+-0.0268        ! definitely 1.0094x slower
&gt;    Float32Array-to-Float64Array-set                  70.6493+-0.1014     !  
&gt; 71.9423+-0.4788        ! definitely 1.0183x slower
&gt;    Float64Array-alloc-long-lived                     85.6441+-0.2201     ?  
&gt; 86.0509+-0.6267        ?
&gt;    Float64Array-to-Int16Array-set                    89.7905+-1.4839     ^  
&gt; 87.8715+-0.1910        ^ definitely 1.0218x faster
&gt;    fold-double-to-int                                18.7237+-0.0625     ?  
&gt; 18.7568+-0.1217        ?
&gt;    fold-get-by-id-to-multi-get-by-offset-rare-int   
&gt;                                                      12.3238+-0.1989     ?  
&gt; 12.3763+-0.1128        ?
&gt;    fold-get-by-id-to-multi-get-by-offset             10.6235+-0.1098     ?  
&gt; 10.6833+-0.0393        ?
&gt;    fold-multi-get-by-offset-to-get-by-offset   
&gt;                                                       9.3647+-0.0458     ?  
&gt; 9.4112+-0.2775        ?
&gt;    fold-multi-get-by-offset-to-poly-get-by-offset   
&gt;                                                       9.8616+-0.0534        
&gt; 9.8482+-0.1664        
&gt;    fold-multi-put-by-offset-to-poly-put-by-offset   
&gt;                                                      11.9640+-0.0675        
&gt; 11.8901+-0.2101        
&gt;    fold-multi-put-by-offset-to-put-by-offset   
&gt;                                                      11.2238+-0.2140     ?  
&gt; 11.3748+-0.0530        ? might be 1.0135x slower
&gt;    fold-multi-put-by-offset-to-replace-or-transition-put-by-offset   
&gt;                                                      16.1220+-0.5298        
&gt; 15.7411+-0.4905          might be 1.0242x faster
&gt;    fold-put-by-id-to-multi-put-by-offset             13.6990+-0.4216        
&gt; 13.4791+-0.4680          might be 1.0163x faster
&gt;    fold-put-by-val-with-string-to-multi-put-by-offset   
&gt;                                                      13.3940+-0.4016     ?  
&gt; 13.4256+-0.2782        ?
&gt;    fold-put-by-val-with-symbol-to-multi-put-by-offset   
&gt;                                                      13.3386+-0.3677     ?  
&gt; 13.5568+-0.2472        ? might be 1.0164x slower
&gt;    fold-put-structure                                 8.8964+-0.1045     ?  
&gt; 8.9079+-0.2235        ?
&gt;    for-of-iterate-array-entries                      15.6947+-0.2514     ?  
&gt; 15.9901+-0.6257        ? might be 1.0188x slower
&gt;    for-of-iterate-array-keys                          5.3568+-0.1635        
&gt; 5.3110+-0.1652        
&gt;    for-of-iterate-array-values                        5.0169+-0.1207        
&gt; 4.9803+-0.1505        
&gt;    fround                                            24.2715+-0.2516     ?  
&gt; 24.3354+-0.1045        ?
&gt;    ftl-library-inlining-dataview                     93.0274+-0.8614     !  
&gt; 99.9131+-1.3118        ! definitely 1.0740x slower
&gt;    ftl-library-inlining                             147.8894+-6.0173        
&gt; 145.8124+-12.3890         might be 1.0142x faster
&gt;    ftl-object-sub                                   476.2159+-0.7933     !  
&gt; 485.3692+-6.2757        ! definitely 1.0192x slower
&gt;    function-call                                     15.5151+-0.0744        
&gt; 15.5065+-0.0383        
&gt;    function-dot-apply                                 3.0450+-0.0220     ?  
&gt; 3.0503+-0.0210        ?
&gt;    function-test                                      3.9062+-0.1057        
&gt; 3.8826+-0.0213        
&gt;    function-with-eval                               126.4147+-0.3327     ?  
&gt; 126.9628+-0.2279        ?
&gt;    gcse-poly-get-less-obvious                        37.6977+-0.3996        
&gt; 37.6294+-0.3703        
&gt;    gcse-poly-get                                     38.6885+-0.2604     ?  
&gt; 38.7752+-0.4515        ?
&gt;    gcse                                               5.3550+-0.0169     ?  
&gt; 5.3710+-0.0275        ?
&gt;    get-by-id-bimorphic-check-structure-elimination-simple   
&gt;                                                       3.6319+-0.1250        
&gt; 3.5868+-0.0488          might be 1.0126x faster
&gt;    get-by-id-bimorphic-check-structure-elimination   
&gt;                                                       7.0211+-0.0145     ?  
&gt; 7.0369+-0.0226        ?
&gt;    get-by-id-chain-from-try-block                     3.3831+-0.0151     !  
&gt; 3.8006+-0.2193        ! definitely 1.1234x slower
&gt;    get-by-id-check-structure-elimination              6.0628+-0.0296     ?  
&gt; 6.0722+-0.0373        ?
&gt;    get-by-id-proto-or-self                           26.5507+-1.9474     ?  
&gt; 27.6998+-2.1387        ? might be 1.0433x slower
&gt;    get-by-id-quadmorphic-check-structure-elimination-simple   
&gt;                                                       3.9896+-0.0311        
&gt; 3.9857+-0.0148        
&gt;    get-by-id-self-or-proto                           25.8584+-2.2019        
&gt; 25.8345+-1.4370        
&gt;    get-by-val-out-of-bounds                           5.8994+-0.0292     ?  
&gt; 6.0230+-0.1334        ? might be 1.0210x slower
&gt;    get-by-val-with-string-bimorphic-check-structure-elimination-simple   
&gt;                                                       3.6126+-0.0724        
&gt; 3.5635+-0.0238          might be 1.0138x faster
&gt;    get-by-val-with-string-bimorphic-check-structure-elimination   
&gt;                                                       8.9789+-0.0543        
&gt; 8.9727+-0.1299        
&gt;    get-by-val-with-string-chain-from-try-block   
&gt;                                                       3.4508+-0.0504     !  
&gt; 3.8726+-0.1293        ! definitely 1.1222x slower
&gt;    get-by-val-with-string-check-structure-elimination   
&gt;                                                       8.2385+-0.0331     ?  
&gt; 8.4088+-0.3553        ? might be 1.0207x slower
&gt;    get-by-val-with-string-proto-or-self              26.4005+-1.2542     ?  
&gt; 27.4069+-1.9019        ? might be 1.0381x slower
&gt;    get-by-val-with-string-quadmorphic-check-structure-elimination-simple   
&gt;                                                       4.6544+-0.0988     ?  
&gt; 4.7969+-0.0759        ? might be 1.0306x slower
&gt;    get-by-val-with-string-self-or-proto              28.2591+-2.0969        
&gt; 26.3063+-1.3100          might be 1.0742x faster
&gt;    get-by-val-with-symbol-bimorphic-check-structure-elimination-simple   
&gt;                                                       4.2567+-0.1068        
&gt; 4.2361+-0.0786        
&gt;    get-by-val-with-symbol-bimorphic-check-structure-elimination   
&gt;                                                      17.5234+-0.0270     ?  
&gt; 17.5573+-0.1736        ?
&gt;    get-by-val-with-symbol-chain-from-try-block   
&gt;                                                       3.4372+-0.0076     !  
&gt; 3.7966+-0.0178        ! definitely 1.1046x slower
&gt;    get-by-val-with-symbol-check-structure-elimination   
&gt;                                                      16.7152+-0.0596     ?  
&gt; 16.7858+-0.2490        ?
&gt;    get-by-val-with-symbol-proto-or-self              27.2650+-1.9350        
&gt; 26.2987+-1.3680          might be 1.0367x faster
&gt;    get-by-val-with-symbol-quadmorphic-check-structure-elimination-simple   
&gt;                                                       5.6559+-0.0207     ?  
&gt; 5.6646+-0.0154        ?
&gt;    get-by-val-with-symbol-self-or-proto              26.5221+-1.1958        
&gt; 25.9109+-1.3950          might be 1.0236x faster
&gt;    get_callee_monomorphic                             3.2519+-0.2390        
&gt; 3.0885+-0.0884          might be 1.0529x faster
&gt;    get_callee_polymorphic                             4.5540+-0.0461     ?  
&gt; 4.5554+-0.0475        ?
&gt;    getter-no-activation                               6.3225+-0.0364        
&gt; 6.2810+-0.0410        
&gt;    getter-prototype                                  13.9897+-0.1900     ?  
&gt; 14.1588+-0.4235        ? might be 1.0121x slower
&gt;    getter-richards-try-catch                       1856.7735+-54.3556       
&gt; 1799.2766+-60.9008         might be 1.0320x faster
&gt;    getter-richards                                  124.7777+-2.7445        
&gt; 124.7100+-1.2451        
&gt;    getter                                             6.9646+-0.0373     ?  
&gt; 7.0098+-0.0140        ?
&gt;    global-object-access-with-mutating-structure   
&gt;                                                       7.8669+-0.1385     ?  
&gt; 7.9810+-0.1031        ? might be 1.0145x slower
&gt;    global-var-const-infer-fire-from-opt               1.1701+-0.0188     ?  
&gt; 1.1826+-0.0252        ? might be 1.0107x slower
&gt;    global-var-const-infer                             1.0398+-0.0097     ?  
&gt; 1.0477+-0.0110        ?
&gt;    hard-overflow-check-equal                         51.6958+-0.5245        
&gt; 51.4435+-0.3018        
&gt;    hard-overflow-check                               51.0168+-0.0836        
&gt; 50.9966+-0.1417        
&gt;    HashMap-put-get-iterate-keys                      32.6160+-0.2056        
&gt; 32.4432+-0.2519        
&gt;    HashMap-put-get-iterate                           32.3198+-0.2830        
&gt; 32.1245+-0.5062        
&gt;    HashMap-string-put-get-iterate                    34.4770+-0.5328     ?  
&gt; 34.7271+-0.4656        ?
&gt;    hoist-make-rope                                   14.0040+-1.0939        
&gt; 13.4420+-0.7762          might be 1.0418x faster
&gt;    hoist-poly-check-structure-effectful-loop   
&gt;                                                       5.6544+-0.0255     ?  
&gt; 5.6994+-0.1064        ?
&gt;    hoist-poly-check-structure                         4.2924+-0.0151        
&gt; 4.2805+-0.0117        
&gt;    imul-double-only                                  10.1556+-0.5690     ?  
&gt; 10.5302+-0.7817        ? might be 1.0369x slower
&gt;    imul-int-only                                     12.9854+-0.0801     ?  
&gt; 13.0387+-0.0674        ?
&gt;    imul-mixed                                        10.1923+-0.0921        
&gt; 10.1434+-0.0848        
&gt;    in-four-cases                                     30.3595+-0.1533     ?  
&gt; 30.5879+-0.3466        ?
&gt;    in-one-case-false                                 14.8798+-0.0225        
&gt; 14.8780+-0.0299        
&gt;    in-one-case-true                                  14.8734+-0.0503     ?  
&gt; 14.8863+-0.0365        ?
&gt;    in-two-cases                                      16.0429+-0.0375     ?  
&gt; 16.0656+-0.0493        ?
&gt;    indexed-properties-in-objects                      3.8774+-0.0358        
&gt; 3.8638+-0.0195        
&gt;    infer-closure-const-then-mov-no-inline             5.3935+-0.0306     ^  
&gt; 5.2754+-0.0149        ^ definitely 1.0224x faster
&gt;    infer-closure-const-then-mov                      24.8385+-0.4711        
&gt; 24.6468+-0.3010        
&gt;    infer-closure-const-then-put-to-scope-no-inline   
&gt;                                                      17.6757+-0.0174     ?  
&gt; 17.7660+-0.1735        ?
&gt;    infer-closure-const-then-put-to-scope             30.9547+-0.2947        
&gt; 30.5397+-0.7284          might be 1.0136x faster
&gt;    infer-closure-const-then-reenter-no-inline   
&gt;                                                      76.4373+-0.1791        
&gt; 76.4079+-0.0813        
&gt;    infer-closure-const-then-reenter                  31.3224+-0.4680     ?  
&gt; 31.4838+-0.1849        ?
&gt;    infer-constant-global-property                     4.6881+-0.0162     ?  
&gt; 4.7290+-0.0382        ?
&gt;    infer-constant-property                            3.5950+-0.0410     ?  
&gt; 3.5982+-0.0271        ?
&gt;    infer-one-time-closure-ten-vars                   13.4149+-0.3159     ?  
&gt; 13.4872+-0.3516        ?
&gt;    infer-one-time-closure-two-vars                   13.0015+-0.2797        
&gt; 12.8218+-0.1699          might be 1.0140x faster
&gt;    infer-one-time-closure                            12.8049+-0.0298     ?  
&gt; 12.8207+-0.0621        ?
&gt;    infer-one-time-deep-closure                       21.0437+-0.3197        
&gt; 20.8588+-0.1900        
&gt;    inline-arguments-access                            5.2129+-0.1578        
&gt; 5.1299+-0.0644          might be 1.0162x faster
&gt;    inline-arguments-aliased-access                    5.2242+-0.1564     ?  
&gt; 5.2301+-0.1165        ?
&gt;    inline-arguments-local-escape                      5.1837+-0.0360     ?  
&gt; 5.2380+-0.1274        ? might be 1.0105x slower
&gt;    inline-get-scoped-var                              6.1866+-0.1032        
&gt; 6.1549+-0.0283        
&gt;    inlined-put-by-id-transition                      13.0531+-0.1596        
&gt; 13.0457+-0.0637        
&gt;    inlined-put-by-val-with-string-transition   
&gt;                                                      63.3443+-0.2408     !  
&gt; 64.2687+-0.6502        ! definitely 1.0146x slower
&gt;    inlined-put-by-val-with-symbol-transition   
&gt;                                                      64.2622+-0.6793        
&gt; 63.9568+-0.4055        
&gt;    int-or-other-abs-then-get-by-val                   6.1747+-0.0807        
&gt; 6.1513+-0.0102        
&gt;    int-or-other-abs-zero-then-get-by-val             23.2270+-0.6690        
&gt; 22.9088+-0.3377          might be 1.0139x faster
&gt;    int-or-other-add-then-get-by-val                   6.0398+-0.0302     ?  
&gt; 6.0794+-0.0411        ?
&gt;    int-or-other-add                                   7.2456+-0.3013        
&gt; 7.0909+-0.0731          might be 1.0218x faster
&gt;    int-or-other-div-then-get-by-val                   5.3155+-0.0073     ?  
&gt; 5.3452+-0.0551        ?
&gt;    int-or-other-max-then-get-by-val                   5.5203+-0.0908        
&gt; 5.4668+-0.0202        
&gt;    int-or-other-min-then-get-by-val                   5.5800+-0.0505        
&gt; 5.5340+-0.0861        
&gt;    int-or-other-mod-then-get-by-val                   5.0626+-0.0256     ?  
&gt; 5.1131+-0.0773        ?
&gt;    int-or-other-mul-then-get-by-val                   5.2667+-0.2918        
&gt; 5.2078+-0.1133          might be 1.0113x faster
&gt;    int-or-other-neg-then-get-by-val                   5.9263+-0.0255     ?  
&gt; 6.0001+-0.2106        ? might be 1.0125x slower
&gt;    int-or-other-neg-zero-then-get-by-val             22.6433+-0.0223     ?  
&gt; 22.8769+-0.5774        ? might be 1.0103x slower
&gt;    int-or-other-sub-then-get-by-val                   6.0096+-0.0201     ?  
&gt; 6.1768+-0.4171        ? might be 1.0278x slower
&gt;    int-or-other-sub                                   4.7269+-0.0700     ?  
&gt; 4.7401+-0.0535        ?
&gt;    int-overflow-local                                 5.8114+-0.0243     ?  
&gt; 5.8167+-0.0310        ?
&gt;    Int16Array-alloc-long-lived                       62.0482+-0.4430        
&gt; 61.7727+-0.4723        
&gt;    Int16Array-bubble-sort-with-byteLength            33.8951+-0.0413     ?  
&gt; 33.9199+-0.0357        ?
&gt;    Int16Array-bubble-sort                            32.3146+-0.3832     ?  
&gt; 32.6791+-0.6647        ? might be 1.0113x slower
&gt;    Int16Array-load-int-mul                            2.1502+-0.0209        
&gt; 2.1461+-0.0113        
&gt;    Int16Array-to-Int32Array-set                      65.5513+-0.1064     !  
&gt; 66.9551+-1.0596        ! definitely 1.0214x slower
&gt;    Int32Array-alloc-large                            23.5077+-0.7130        
&gt; 23.1040+-0.3614          might be 1.0175x faster
&gt;    Int32Array-alloc-long-lived                       69.5801+-0.7921        
&gt; 69.3700+-0.6409        
&gt;    Int32Array-alloc                                   3.3979+-0.0467     ?  
&gt; 3.4143+-0.0305        ?
&gt;    Int32Array-Int8Array-view-alloc                    9.1526+-0.3226        
&gt; 9.0344+-0.1482          might be 1.0131x faster
&gt;    int52-spill                                        6.9506+-0.0303     ?  
&gt; 7.0212+-0.0408        ? might be 1.0102x slower
&gt;    Int8Array-alloc-long-lived                        55.0830+-0.4828     ?  
&gt; 55.2060+-0.3125        ?
&gt;    Int8Array-load-with-byteLength                     4.4280+-0.0191     ?  
&gt; 4.4498+-0.0326        ?
&gt;    Int8Array-load                                     4.4645+-0.0530        
&gt; 4.4506+-0.0156        
&gt;    integer-divide                                    15.3066+-0.1551        
&gt; 15.2400+-0.0687        
&gt;    integer-modulo                                     2.6725+-0.0171     ?  
&gt; 2.6794+-0.0286        ?
&gt;    is-boolean-fold-tricky                             5.5119+-0.0371     ?  
&gt; 5.5133+-0.0176        ?
&gt;    is-boolean-fold                                    3.8093+-0.1570        
&gt; 3.7730+-0.0435        
&gt;    is-function-fold-tricky-internal-function   
&gt;                                                      15.1616+-0.0364        
&gt; 15.1263+-0.1508        
&gt;    is-function-fold-tricky                            5.6551+-0.0173     ?  
&gt; 5.6635+-0.0332        ?
&gt;    is-function-fold                                   3.7857+-0.0274     ?  
&gt; 3.8910+-0.1526        ? might be 1.0278x slower
&gt;    is-number-fold-tricky                              5.5328+-0.0585        
&gt; 5.5122+-0.0224        
&gt;    is-number-fold                                     3.7780+-0.0368     ?  
&gt; 3.7978+-0.0343        ?
&gt;    is-object-or-null-fold-functions                   3.8969+-0.0306     ?  
&gt; 3.9042+-0.0311        ?
&gt;    is-object-or-null-fold-less-tricky                 5.6267+-0.0195        
&gt; 5.6249+-0.0160        
&gt;    is-object-or-null-fold-tricky                      7.6111+-0.0067     ?  
&gt; 7.6181+-0.0201        ?
&gt;    is-object-or-null-fold                             3.8118+-0.0329     ?  
&gt; 3.8647+-0.0369        ? might be 1.0139x slower
&gt;    is-object-or-null-trickier-function                5.7387+-0.0327     ?  
&gt; 5.7529+-0.0192        ?
&gt;    is-object-or-null-trickier-internal-function   
&gt;                                                      15.6639+-0.0592     ^  
&gt; 15.4644+-0.0290        ^ definitely 1.0129x faster
&gt;    is-object-or-null-tricky-function                  5.7137+-0.0620        
&gt; 5.6886+-0.0168        
&gt;    is-object-or-null-tricky-internal-function   
&gt;                                                      11.6307+-0.0355     ?  
&gt; 11.7025+-0.1364        ?
&gt;    is-string-fold-tricky                              5.5241+-0.0257        
&gt; 5.5056+-0.0237        
&gt;    is-string-fold                                     3.7583+-0.0393     ?  
&gt; 3.7601+-0.0331        ?
&gt;    is-undefined-fold-tricky                           4.5741+-0.0264     ?  
&gt; 4.5911+-0.0320        ?
&gt;    is-undefined-fold                                  3.7713+-0.0191        
&gt; 3.7610+-0.0358        
&gt;    JSONP-negative-0                                   0.4697+-0.0139     ?  
&gt; 0.4730+-0.0177        ?
&gt;    large-int-captured                                 5.7663+-0.1180     ?  
&gt; 5.7776+-0.1061        ?
&gt;    large-int-neg                                     20.8974+-0.2739     ?  
&gt; 21.1514+-0.4169        ? might be 1.0122x slower
&gt;    large-int                                         18.7507+-0.4697     ?  
&gt; 18.8909+-0.6496        ?
&gt;    load-varargs-elimination                          30.3550+-0.1425     ?  
&gt; 30.4761+-0.6227        ?
&gt;    logical-not-weird-types                            4.5492+-0.0341     ?  
&gt; 4.5617+-0.0421        ?
&gt;    logical-not                                        6.2519+-0.0333        
&gt; 6.2330+-0.0223        
&gt;    lots-of-fields                                    15.5017+-0.2285     ?  
&gt; 15.6893+-0.2443        ? might be 1.0121x slower
&gt;    make-indexed-storage                               3.8999+-0.1890        
&gt; 3.8551+-0.2423          might be 1.0116x faster
&gt;    make-rope-cse                                      4.7989+-0.1870        
&gt; 4.7893+-0.1253        
&gt;    marsaglia-larger-ints                             49.0079+-0.1468        
&gt; 48.9558+-0.5654        
&gt;    marsaglia-osr-entry                               30.3190+-0.2560        
&gt; 30.1720+-0.2764        
&gt;    math-with-out-of-bounds-array-values              32.3479+-0.0783     ?  
&gt; 33.0661+-0.8934        ? might be 1.0222x slower
&gt;    max-boolean                                        3.3234+-0.0237        
&gt; 3.3083+-0.0205        
&gt;    method-on-number                                  23.0535+-0.1237     ?  
&gt; 23.1528+-0.1567        ?
&gt;    min-boolean                                        3.3259+-0.0252     ?  
&gt; 3.3350+-0.0253        ?
&gt;    minus-boolean-double                               4.2089+-0.0227     ?  
&gt; 4.2205+-0.0298        ?
&gt;    minus-boolean                                      3.1604+-0.0216        
&gt; 3.1340+-0.0180        
&gt;    misc-strict-eq                                    46.1942+-1.2908        
&gt; 46.1066+-0.9949        
&gt;    mod-boolean-double                                14.1957+-0.0235     ?  
&gt; 14.2286+-0.0700        ?
&gt;    mod-boolean                                       10.1890+-0.0375     ?  
&gt; 10.1983+-0.0179        ?
&gt;    mul-boolean-double                                 4.8908+-0.0159     ?  
&gt; 4.8969+-0.0211        ?
&gt;    mul-boolean                                        3.8256+-0.0336     ?  
&gt; 3.8337+-0.0333        ?
&gt;    neg-boolean                                        4.2029+-0.0202     ?  
&gt; 4.2231+-0.0125        ?
&gt;    negative-zero-divide                               0.6098+-0.0156        
&gt; 0.6073+-0.0085        
&gt;    negative-zero-modulo                               0.6016+-0.0090        
&gt; 0.5997+-0.0140        
&gt;    negative-zero-negate                               0.5951+-0.0118        
&gt; 0.5723+-0.0195          might be 1.0398x faster
&gt;    nested-function-parsing                           66.1806+-0.6127     ?  
&gt; 66.8495+-0.7212        ? might be 1.0101x slower
&gt;    new-array-buffer-dead                            126.4521+-0.4028     ?  
&gt; 127.7274+-2.6284        ? might be 1.0101x slower
&gt;    new-array-buffer-push                              8.4278+-0.1918        
&gt; 8.3834+-0.1417        
&gt;    new-array-dead                                    24.0793+-0.6772     ?  
&gt; 24.2290+-0.3362        ?
&gt;    new-array-push                                     5.1333+-0.3651        
&gt; 5.0118+-0.3099          might be 1.0242x faster
&gt;    no-inline-constructor                             48.2066+-0.4071     ?  
&gt; 48.2497+-0.3502        ?
&gt;    number-test                                        4.1570+-0.0433     ?  
&gt; 4.1679+-0.0305        ?
&gt;    object-closure-call                                6.9611+-0.0260     ?  
&gt; 7.0278+-0.1021        ?
&gt;    object-get-own-property-symbols-on-large-array   
&gt;                                                       5.0439+-0.0841        
&gt; 5.0230+-0.0890        
&gt;    object-test                                        3.8542+-0.0249     ?  
&gt; 3.8983+-0.0515        ? might be 1.0114x slower
&gt;    obvious-sink-pathology-taken                     147.2171+-0.4824     ?  
&gt; 147.3936+-0.3548        ?
&gt;    obvious-sink-pathology                            48.4109+-1.2648        
&gt; 47.2630+-0.3798          might be 1.0243x faster
&gt;    obviously-elidable-new-object                     42.5029+-0.4969        
&gt; 42.3176+-0.2107        
&gt;    plus-boolean-arith                                 3.3719+-0.0189     ?  
&gt; 3.3982+-0.0357        ?
&gt;    plus-boolean-double                                4.2336+-0.0109        
&gt; 4.2302+-0.0344        
&gt;    plus-boolean                                       3.2150+-0.0190        
&gt; 3.2082+-0.0244        
&gt;    poly-chain-access-different-prototypes-simple   
&gt;                                                       3.4883+-0.0149     ?  
&gt; 3.4960+-0.0170        ?
&gt;    poly-chain-access-different-prototypes             3.5261+-0.0178     ?  
&gt; 3.5311+-0.0129        ?
&gt;    poly-chain-access-simpler                          3.4964+-0.0298     ?  
&gt; 3.4968+-0.0216        ?
&gt;    poly-chain-access                                  3.5930+-0.2091        
&gt; 3.4789+-0.0135          might be 1.0328x faster
&gt;    poly-stricteq                                     85.3781+-0.1439     ^  
&gt; 84.8024+-0.0402        ^ definitely 1.0068x faster
&gt;    polymorphic-array-call                             1.9637+-0.0855        
&gt; 1.9196+-0.0444          might be 1.0230x faster
&gt;    polymorphic-get-by-id                              4.5781+-0.2795        
&gt; 4.4572+-0.0139          might be 1.0271x faster
&gt;    polymorphic-put-by-id                             47.8955+-0.9574        
&gt; 47.7018+-1.2013        
&gt;    polymorphic-put-by-val-with-string                48.2575+-0.1291        
&gt; 48.1401+-0.0890        
&gt;    polymorphic-put-by-val-with-symbol                48.1048+-0.1611        
&gt; 48.0009+-0.1271        
&gt;    polymorphic-structure                             18.0145+-0.2035        
&gt; 17.9283+-0.0332        
&gt;    polyvariant-monomorphic-get-by-id                 11.0250+-0.0192     ?  
&gt; 11.0368+-0.0443        ?
&gt;    proto-getter-access                               11.8499+-0.1543     ?  
&gt; 11.8517+-0.1541        ?
&gt;    prototype-access-with-mutating-prototype           7.5888+-0.1629     ?  
&gt; 7.8445+-0.2496        ? might be 1.0337x slower
&gt;    put-by-id-replace-and-transition                  11.4785+-0.2929        
&gt; 11.3941+-0.0875        
&gt;    put-by-id-slightly-polymorphic                     3.7780+-0.0178        
&gt; 3.7751+-0.0194        
&gt;    put-by-id                                         14.5816+-0.2941     ?  
&gt; 14.7108+-0.2355        ?
&gt;    put-by-val-direct                                  0.6218+-0.0085     ?  
&gt; 0.6381+-0.0239        ? might be 1.0262x slower
&gt;    put-by-val-large-index-blank-indexing-type   
&gt;                                                       7.2172+-0.0705     ?  
&gt; 7.3235+-0.0941        ? might be 1.0147x slower
&gt;    put-by-val-machine-int                             3.4830+-0.0552        
&gt; 3.4661+-0.0316        
&gt;    put-by-val-with-string-replace-and-transition   
&gt;                                                      16.4955+-0.1470        
&gt; 16.4267+-0.1676        
&gt;    put-by-val-with-string-slightly-polymorphic   
&gt;                                                       4.9906+-0.0194     ?  
&gt; 4.9942+-0.0223        ?
&gt;    put-by-val-with-string                            15.4738+-0.2959     ?  
&gt; 15.5500+-0.5163        ?
&gt;    put-by-val-with-symbol-replace-and-transition   
&gt;                                                      17.8430+-0.1608     ?  
&gt; 17.8630+-0.2150        ?
&gt;    put-by-val-with-symbol-slightly-polymorphic   
&gt;                                                       5.4245+-0.0983        
&gt; 5.3969+-0.0274        
&gt;    put-by-val-with-symbol                            15.4625+-0.1829     ?  
&gt; 15.5842+-0.1988        ?
&gt;    rare-osr-exit-on-local                            20.3449+-0.5166        
&gt; 20.1108+-0.0883          might be 1.0116x faster
&gt;    raytrace-with-empty-try-catch                      9.0645+-0.0769     ?  
&gt; 9.4269+-0.3479        ? might be 1.0400x slower
&gt;    raytrace-with-try-catch                           16.1974+-0.0928     !  
&gt; 16.7918+-0.1468        ! definitely 1.0367x slower
&gt;    register-pressure-from-osr                        26.7919+-0.0664        
&gt; 26.7467+-0.0362        
&gt;    repeat-multi-get-by-offset                        31.3455+-0.2489     ?  
&gt; 31.3967+-0.2630        ?
&gt;    richards-empty-try-catch                         113.0495+-0.2989     ^  
&gt; 84.1128+-0.5069        ^ definitely 1.3440x faster
&gt;    richards-try-catch                               367.6120+-0.9552     ^  
&gt; 347.9143+-0.7705        ^ definitely 1.0566x faster
&gt;    setter-prototype                                  11.2856+-0.1366        
&gt; 11.1988+-0.1101        
&gt;    setter                                             6.9842+-0.0367     !  
&gt; 7.5522+-0.0315        ! definitely 1.0813x slower
&gt;    simple-activation-demo                            34.2698+-0.0445     !  
&gt; 34.5722+-0.1346        ! definitely 1.0088x slower
&gt;    simple-getter-access                              15.0856+-0.1264        
&gt; 15.0750+-0.2182        
&gt;    simple-poly-call-nested                           10.9037+-0.0399     ?  
&gt; 10.9105+-0.0208        ?
&gt;    simple-poly-call                                   1.8523+-0.0123     ?  
&gt; 1.8658+-0.0406        ?
&gt;    sin-boolean                                       27.4172+-1.9574     ?  
&gt; 27.6710+-2.0016        ?
&gt;    singleton-scope                                   87.7592+-0.1571        
&gt; 87.7256+-0.0899        
&gt;    sink-function                                     14.3578+-0.3682        
&gt; 14.3050+-0.2608        
&gt;    sink-huge-activation                              23.7119+-0.7290     ?  
&gt; 23.8169+-0.7180        ?
&gt;    sinkable-new-object-dag                           80.7602+-1.0669        
&gt; 80.1509+-0.9389        
&gt;    sinkable-new-object-taken                         64.9570+-0.9753        
&gt; 64.5273+-0.5173        
&gt;    sinkable-new-object                               47.5326+-0.4805        
&gt; 47.3303+-0.3615        
&gt;    slow-array-profile-convergence                     4.0960+-0.0319        
&gt; 4.0625+-0.0944        
&gt;    slow-convergence                                   3.9076+-0.0240     ?  
&gt; 3.9310+-0.0628        ?
&gt;    slow-ternaries                                    25.9367+-1.8601        
&gt; 24.0780+-0.6306          might be 1.0772x faster
&gt;    sorting-benchmark                                 26.4254+-0.2587        
&gt; 26.2175+-0.2076        
&gt;    sparse-conditional                                 1.7572+-0.0197     ?  
&gt; 1.7801+-0.0262        ? might be 1.0130x slower
&gt;    splice-to-remove                                  19.8411+-0.2623     ?  
&gt; 20.3963+-0.7191        ? might be 1.0280x slower
&gt;    string-char-code-at                               21.8926+-0.1747     ?  
&gt; 22.0714+-0.1215        ?
&gt;    string-concat-object                               2.8061+-0.0315     ?  
&gt; 2.8091+-0.0266        ?
&gt;    string-concat-pair-object                          2.7487+-0.1042        
&gt; 2.7467+-0.0579        
&gt;    string-concat-pair-simple                         13.9155+-0.1368        
&gt; 13.7682+-0.2026          might be 1.0107x faster
&gt;    string-concat-simple                              14.3997+-0.1348     ?  
&gt; 14.4180+-0.2095        ?
&gt;    string-cons-repeat                                 9.4916+-0.0914     ?  
&gt; 9.5541+-0.1348        ?
&gt;    string-cons-tower                                  9.6812+-0.1287        
&gt; 9.5921+-0.0619        
&gt;    string-equality                                   26.3931+-0.2201     ^  
&gt; 26.1519+-0.0168        ^ definitely 1.0092x faster
&gt;    string-get-by-val-big-char                         9.4265+-0.1205     ?  
&gt; 9.6035+-0.4154        ? might be 1.0188x slower
&gt;    string-get-by-val-out-of-bounds-insane             5.0723+-0.0291     ^  
&gt; 4.9451+-0.0609        ^ definitely 1.0257x faster
&gt;    string-get-by-val-out-of-bounds                    6.7534+-0.0182     ?  
&gt; 6.7908+-0.1770        ?
&gt;    string-get-by-val                                  4.4754+-0.0157     ^  
&gt; 4.4182+-0.0278        ^ definitely 1.0130x faster
&gt;    string-hash                                        2.7596+-0.0245     !  
&gt; 2.8600+-0.0201        ! definitely 1.0364x slower
&gt;    string-long-ident-equality                        21.6338+-0.5646        
&gt; 21.3616+-0.0201          might be 1.0127x faster
&gt;    string-out-of-bounds                              17.7958+-0.3309        
&gt; 17.6335+-0.1310        
&gt;    string-repeat-arith                               42.7820+-0.0756     ^  
&gt; 41.9874+-0.3393        ^ definitely 1.0189x faster
&gt;    string-sub                                        55.4495+-0.5206     !  
&gt; 57.6474+-0.3389        ! definitely 1.0396x slower
&gt;    string-test                                        4.0044+-0.0505        
&gt; 3.9931+-0.0249        
&gt;    string-var-equality                               48.2370+-0.4813        
&gt; 48.0645+-0.1804        
&gt;    structure-hoist-over-transitions                   3.1841+-0.0306     ?  
&gt; 3.2639+-0.2128        ? might be 1.0251x slower
&gt;    substring-concat-weird                            52.3875+-0.2782     ?  
&gt; 53.1224+-0.9411        ? might be 1.0140x slower
&gt;    substring-concat                                  57.8740+-0.5279     ?  
&gt; 57.9377+-0.7254        ?
&gt;    substring                                         64.3088+-0.6575     ?  
&gt; 64.4199+-0.6815        ?
&gt;    switch-char-constant                               3.6063+-0.0202     ?  
&gt; 3.6458+-0.0862        ? might be 1.0110x slower
&gt;    switch-char                                        7.8962+-0.0241        
&gt; 7.8239+-0.1148        
&gt;    switch-constant                                   10.0418+-0.1114        
&gt; 10.0325+-0.0557        
&gt;    switch-string-basic-big-var                       26.2134+-0.2645        
&gt; 25.9732+-0.1420        
&gt;    switch-string-basic-big                           23.0507+-0.1689        
&gt; 22.8819+-0.4930        
&gt;    switch-string-basic-var                           21.2726+-0.1254     ?  
&gt; 21.2735+-0.1566        ?
&gt;    switch-string-basic                               19.6991+-0.0633        
&gt; 19.6801+-0.0799        
&gt;    switch-string-big-length-tower-var                27.1884+-0.0928        
&gt; 27.1245+-0.0329        
&gt;    switch-string-length-tower-var                    20.7887+-0.0413     ?  
&gt; 20.8838+-0.1592        ?
&gt;    switch-string-length-tower                        17.7304+-0.1589     ?  
&gt; 17.9085+-0.4269        ? might be 1.0100x slower
&gt;    switch-string-short                               17.9003+-0.4407        
&gt; 17.6361+-0.0411          might be 1.0150x faster
&gt;    switch                                            14.6163+-0.1979     ?  
&gt; 14.6401+-0.1343        ?
&gt;    tear-off-arguments-simple                          4.0258+-0.0663        
&gt; 3.9925+-0.0359        
&gt;    tear-off-arguments                                 5.4697+-0.1217     ?  
&gt; 5.4714+-0.1355        ?
&gt;    temporal-structure                                17.0435+-0.1432     ?  
&gt; 17.0510+-0.0782        ?
&gt;    to-int32-boolean                                  17.8025+-0.0191     ?  
&gt; 17.8228+-0.0356        ?
&gt;    try-catch-get-by-val-cloned-arguments             13.5372+-0.0931     !  
&gt; 14.6710+-0.5445        ! definitely 1.0837x slower
&gt;    try-catch-get-by-val-direct-arguments              2.9562+-0.0134     !  
&gt; 3.0598+-0.0896        ! definitely 1.0351x slower
&gt;    try-catch-get-by-val-scoped-arguments              6.0639+-0.0580     !  
&gt; 6.4113+-0.0431        ! definitely 1.0573x slower
&gt;    typed-array-get-set-by-val-profiling              39.2088+-0.3736     ?  
&gt; 39.4321+-0.4843        ?
&gt;    undefined-property-access                        478.5985+-6.0009        
&gt; 475.7620+-0.8805        
&gt;    undefined-test                                     4.0956+-0.0140     ?  
&gt; 4.1058+-0.0282        ?
&gt;    unprofiled-licm                                   17.5083+-0.1304        
&gt; 17.2962+-0.3002          might be 1.0123x faster
&gt;    v8-raytrace-with-empty-try-catch                  75.6069+-0.5258     !  
&gt; 81.1628+-0.7679        ! definitely 1.0735x slower
&gt;    v8-raytrace-with-try-catch                       108.2109+-0.4881     ?  
&gt; 109.2809+-0.5843        ?
&gt;    varargs-call                                      19.1720+-0.1382        
&gt; 19.1426+-0.1269        
&gt;    varargs-construct-inline                          33.4982+-0.1495     ?  
&gt; 33.4997+-0.2641        ?
&gt;    varargs-construct                                 28.3209+-0.5075        
&gt; 28.1606+-0.2136        
&gt;    varargs-inline                                    13.0551+-0.0453        
&gt; 13.0341+-0.0614        
&gt;    varargs-strict-mode                               14.6184+-0.2531        
&gt; 14.5505+-0.0515        
&gt;    varargs                                           14.3366+-0.0595     ?  
&gt; 14.3532+-0.0812        ?
&gt;    weird-inlining-const-prop                          3.0874+-0.1889        
&gt; 3.0166+-0.0291          might be 1.0235x faster
&gt; 
&gt;    &lt;geometric&gt;                                       11.9098+-0.0163     ?  
&gt; 11.9201+-0.0069        ? might be 1.0009x slower
&gt; 
&gt;                                                             og              
&gt; tryCatchFTL                                    
&gt; CompressionBench:
&gt;    huffman                                           77.7389+-0.2092        
&gt; 77.4119+-0.5537        
&gt;    arithmetic-simple                                459.2286+-2.4190        
&gt; 459.0173+-2.1644        
&gt;    arithmetic-precise                               372.5100+-2.4770        
&gt; 371.9389+-2.3667        
&gt;    arithmetic-complex-precise                       369.0174+-3.6257     ?  
&gt; 371.5642+-2.9929        ?
&gt;    arithmetic-precise-order-0                       473.1260+-2.6836     ?  
&gt; 475.1393+-2.4583        ?
&gt;    arithmetic-precise-order-1                       438.9898+-3.2065     ?  
&gt; 443.3207+-5.1113        ?
&gt;    arithmetic-precise-order-2                       524.1101+-1.7310     ?  
&gt; 528.2253+-4.8734        ?
&gt;    arithmetic-simple-order-1                        527.2271+-2.9088     ?  
&gt; 529.6829+-2.4231        ?
&gt;    arithmetic-simple-order-2                        603.3105+-1.3987        
&gt; 601.8619+-2.0701        
&gt;    lz-string                                        396.8121+-3.6034        
&gt; 392.1369+-4.0209          might be 1.0119x faster
&gt; 
&gt;    &lt;geometric&gt;                                      382.7134+-0.8489     ?  
&gt; 383.2058+-1.0862        ? might be 1.0013x slower
&gt; 
&gt;                                                             og              
&gt; tryCatchFTL                                    
&gt; Geomean of preferred means:
&gt;    &lt;scaled-result&gt;                                   51.8039+-0.0617     ?  
&gt; 51.9026+-0.0614        ? might be 1.0019x slower

Where&apos;s AsmBench?  That&apos;s a good sanity check.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1139469</commentid>
    <comment_count>11</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-11-04 15:51:20 -0800</bug_when>
    <thetext>here is ASM bench. It&apos;s neutral.
Benchmark report for AsmBench on Saams-Mac-Pro (MacPro6,1).

VMs tested:
&quot;og&quot; at /Volumes/Data/WK/os-a/OpenSource/WebKitBuild/Release/jsc (r191931)
&quot;tryCatchFTL&quot; at /Volumes/Data/WK/os-b/OpenSource/WebKitBuild/Release/jsc (r191931)
    export JSC_useFTLTryCatch=1

Collected 6 samples per benchmark/VM, with 6 VM invocations per benchmark. Emitted a call to gc()
between sample measurements. Used 1 benchmark iteration per VM invocation for warm-up. Used the
jsc-specific preciseTime() function to get microsecond-level timing. Reporting benchmark execution times
with 95% confidence intervals in milliseconds.

                                    og                   tryCatchFTL                                    

bigfib.cpp                  909.8264+-2.9855     ?    912.8022+-3.9850        ?
cray.c                      774.2484+-3.8192     ?    779.4747+-9.9393        ?
dry.c                       883.5072+-15.3538    ?    896.9960+-0.6456        ? might be 1.0153x slower
FloatMM.c                  1326.2950+-0.4510     ?   1326.4975+-0.6081        ?
gcc-loops.cpp              7473.3141+-3.0764         7472.1599+-2.6711        
n-body.c                   1806.7973+-1.0544         1806.0887+-1.4620        
Quicksort.c                 769.9672+-12.8966         768.2434+-13.4217       
stepanov_container.cpp     6762.3447+-13.1186        6755.4569+-20.7452       
Towers.c                    464.0003+-0.8146     ?    464.0826+-1.1481        ?

&lt;geometric&gt;                1441.7882+-4.8548     ?   1445.2672+-3.0119        ? might be 1.0024x slower</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1139470</commentid>
    <comment_count>12</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-11-04 15:51:44 -0800</bug_when>
    <thetext>I&apos;ll investigate the code load regression. Maybe it&apos;s the same thing that sun spider is telling us.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1140685</commentid>
    <comment_count>13</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-11-09 22:16:37 -0800</bug_when>
    <thetext>Performance looks better. I&apos;ve sped up the check to see if some code origin is inside a try
block and I think that&apos;s likely the cause for things that looked like compilation slow downs.
I&apos;ll land this patch tonight or tomorrow.

Benchmark report for SunSpider, LongSpider, V8Spider, Octane, Kraken, JSRegress, AsmBench, and CompressionBench on Saams-Mac-Pro (MacPro6,1).

VMs tested:
&quot;og&quot; at /Volumes/Data/WK/os-a/OpenSource/WebKitBuild/Release/jsc (r192196)
&quot;ftlTryCatch&quot; at /Volumes/Data/WK/os-b/OpenSource/WebKitBuild/Release/jsc (r192196)

Collected 8 samples per benchmark/VM, with 8 VM invocations per benchmark. Emitted a call to gc() between sample measurements.
Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific preciseTime() function to get microsecond-level
timing. Reporting benchmark execution times with 95% confidence intervals in milliseconds.

                                                            og                   ftlTryCatch                                    
SunSpider:
   3d-cube                                            8.4981+-0.3380     ?      8.5496+-0.4494        ?
   3d-morph                                           8.1915+-0.0222            8.1803+-0.0225        
   3d-raytrace                                        9.4692+-0.0564     ?      9.5887+-0.1972        ? might be 1.0126x slower
   access-binary-trees                                3.3643+-0.0305            3.3432+-0.0428        
   access-fannkuch                                    9.3833+-0.3482            9.2307+-0.0639          might be 1.0165x faster
   access-nbody                                       4.3631+-0.0154            4.3549+-0.0210        
   access-nsieve                                      5.0500+-0.0483     ?      5.0838+-0.0789        ?
   bitops-3bit-bits-in-byte                           1.8691+-0.0497     ?      1.8880+-0.0592        ? might be 1.0101x slower
   bitops-bits-in-byte                                5.0339+-0.0395     ?      5.0652+-0.0866        ?
   bitops-bitwise-and                                 3.2529+-0.1589            3.1945+-0.0309          might be 1.0183x faster
   bitops-nsieve-bits                                 4.5660+-0.0158     ?      4.5710+-0.0156        ?
   controlflow-recursive                              3.6506+-0.0676     ?      3.6615+-0.0354        ?
   crypto-aes                                         7.0855+-0.0405            7.0330+-0.0494        
   crypto-md5                                         4.0619+-0.0215     !      4.4467+-0.0481        ! definitely 1.0948x slower
   crypto-sha1                                        3.8334+-0.0431            3.7945+-0.0336          might be 1.0103x faster
   date-format-tofte                                 13.8677+-0.1749           13.8257+-0.1049        
   date-format-xparb                                  8.0154+-0.1203     ?      8.2043+-0.2516        ? might be 1.0236x slower
   math-cordic                                        4.5558+-0.1022            4.4944+-0.0209          might be 1.0136x faster
   math-partial-sums                                  8.3026+-0.0234     ^      8.2269+-0.0225        ^ definitely 1.0092x faster
   math-spectral-norm                                 3.0713+-0.0201     ?      3.0903+-0.0319        ?
   regexp-dna                                        10.1929+-0.0687     ?     10.4523+-0.3575        ? might be 1.0255x slower
   string-base64                                      6.8287+-0.0389            6.7626+-0.0546        
   string-fasta                                       9.1246+-0.0643     ?      9.2132+-0.0595        ?
   string-tagcloud                                   13.2585+-0.1176           13.1477+-0.1719        
   string-unpack-code                                29.9255+-0.6432           29.0290+-0.8258          might be 1.0309x faster
   string-validate-input                              6.8239+-0.0588     ?      6.9374+-0.1161        ? might be 1.0166x slower

   &lt;arithmetic&gt;                                       7.5246+-0.0261            7.5142+-0.0379          might be 1.0014x faster

                                                            og                   ftlTryCatch                                    
LongSpider:
   3d-cube                                         1295.0750+-5.0640         1294.7685+-8.2947        
   3d-morph                                        2249.8728+-1.6380     ?   2250.2562+-1.7628        ?
   3d-raytrace                                      989.8434+-3.9063     ?    989.9005+-3.9798        ?
   access-binary-trees                             1297.8524+-4.3057     ?   1298.7193+-4.9930        ?
   access-fannkuch                                  527.5297+-4.2924          525.8252+-9.9937        
   access-nbody                                     868.9314+-0.7719          868.3622+-0.5845        
   access-nsieve                                    611.8965+-4.4053     ?    617.0673+-3.3186        ?
   bitops-3bit-bits-in-byte                          54.8996+-0.2953     ?     55.3448+-0.5425        ?
   bitops-bits-in-byte                              146.3968+-1.2250     ?    147.4812+-0.9583        ?
   bitops-nsieve-bits                               634.6776+-2.5010     ?    634.8929+-2.6515        ?
   controlflow-recursive                            701.9906+-0.3520          701.8401+-0.5240        
   crypto-aes                                       914.4079+-6.7099          909.0817+-5.8829        
   crypto-md5                                       777.4681+-7.1980          773.0992+-3.6902        
   crypto-sha1                                     1050.2581+-4.6645         1045.7713+-2.3446        
   date-format-tofte                               1088.6526+-13.0293    ?   1088.7452+-14.4978       ?
   date-format-xparb                               1184.4429+-21.3143        1181.4425+-23.7742       
   hash-map                                         243.7809+-3.4281          242.5660+-2.0392        
   math-cordic                                      795.6278+-0.3448     ?    795.7533+-0.9344        ?
   math-partial-sums                                805.0616+-1.5709          802.9088+-1.8922        
   math-spectral-norm                               832.4614+-0.9510     ?    833.6912+-1.8184        ?
   string-base64                                    583.6586+-1.3522          583.3463+-1.4057        
   string-fasta                                     579.9218+-1.8203     !    591.4506+-1.6278        ! definitely 1.0199x slower
   string-tagcloud                                  288.8521+-1.6080          286.0590+-3.6082        

   &lt;geometric&gt;                                      647.7558+-0.5351     ?    647.9185+-1.4218        ? might be 1.0003x slower

                                                            og                   ftlTryCatch                                    
V8Spider:
   crypto                                            76.9450+-0.5342           76.4299+-0.2643        
   deltablue                                         95.5699+-2.6844           95.2594+-2.1895        
   earley-boyer                                      65.4193+-0.3580           65.3155+-0.5964        
   raytrace                                          44.6074+-0.4759           44.4297+-0.5202        
   regexp                                           106.7997+-0.5251          105.9537+-0.3444        
   richards                                          78.9201+-0.2870     ?     79.0007+-0.4201        ?
   splay                                             53.1720+-0.8982     ?     53.2796+-0.7278        ?

   &lt;geometric&gt;                                       71.5609+-0.2683           71.3541+-0.2593          might be 1.0029x faster

                                                            og                   ftlTryCatch                                    
Octane:
   encrypt                                           0.26636+-0.00230    ?     0.26831+-0.00400       ?
   decrypt                                           4.79901+-0.01566          4.79764+-0.01032       
   deltablue                                x2       0.22232+-0.00171          0.22145+-0.00123       
   earley                                            0.49281+-0.00113          0.49163+-0.00208       
   boyer                                             7.50000+-0.03723          7.49661+-0.01950       
   navier-stokes                            x2       7.45808+-0.00139    ?     7.46436+-0.00862       ?
   raytrace                                 x2       1.42425+-0.01254    ?     1.42478+-0.00918       ?
   richards                                 x2       0.15275+-0.00118          0.15226+-0.00082       
   splay                                    x2       0.50792+-0.00502    ?     0.51009+-0.00212       ?
   regexp                                   x2      39.76163+-0.09623         39.58335+-0.09921       
   pdfjs                                    x2      61.01531+-0.27408         60.78518+-0.17852       
   mandreel                                 x2      72.90392+-0.12917    ^    72.55345+-0.15781       ^ definitely 1.0048x faster
   gbemu                                    x2      62.40061+-3.00036    ?    62.65394+-5.33677       ?
   closure                                           1.08545+-0.00504    ?     1.08920+-0.00442       ?
   jquery                                           14.03493+-0.09878    ?    14.05310+-0.06087       ?
   box2d                                    x2      18.04630+-0.08728    ?    18.11127+-0.09488       ?
   zlib                                     x2     572.13880+-14.15864   ?   576.94055+-16.16401      ?
   typescript                               x2    1230.73663+-23.82416      1227.13876+-8.92983       

   &lt;geometric&gt;                                       9.03308+-0.03824    ?     9.03332+-0.04452       ? might be 1.0000x slower

                                                            og                   ftlTryCatch                                    
Kraken:
   ai-astar                                          241.668+-1.976            240.972+-2.133         
   audio-beat-detection                               79.699+-0.335      ?      79.817+-0.714         ?
   audio-dft                                         153.492+-0.439      ?     153.829+-0.300         ?
   audio-fft                                          59.408+-0.641             59.028+-0.561         
   audio-oscillator                                   96.129+-0.109      ?      96.238+-0.300         ?
   imaging-darkroom                                  101.531+-0.064            101.498+-0.017         
   imaging-desaturate                                 94.474+-0.366             94.053+-0.740         
   imaging-gaussian-blur                             162.236+-0.329            162.143+-0.384         
   json-parse-financial                               70.319+-1.154             68.989+-0.500           might be 1.0193x faster
   json-stringify-tinderbox                           41.931+-0.094      ?      42.024+-0.615         ?
   stanford-crypto-aes                                69.915+-1.096             69.887+-0.546         
   stanford-crypto-ccm                                63.201+-2.735      ?      63.685+-1.418         ?
   stanford-crypto-pbkdf2                            153.242+-0.969            152.388+-1.782         
   stanford-crypto-sha256-iterative                   61.027+-0.277             61.019+-0.321         

   &lt;arithmetic&gt;                                      103.448+-0.243            103.255+-0.309           might be 1.0019x faster

                                                            og                   ftlTryCatch                                    
JSRegress:
   abc-forward-loop-equal                            68.6479+-0.4358           68.3855+-0.2242        
   abc-postfix-backward-loop                         68.0349+-0.4465     ?     68.4200+-0.6350        ?
   abc-simple-backward-loop                          67.4612+-0.3767     ?     67.4798+-0.5162        ?
   abc-simple-forward-loop                           67.4218+-0.1129     ?     67.4717+-0.1941        ?
   abc-skippy-loop                                   46.5434+-0.2706           46.5200+-0.3904        
   abs-boolean                                        3.8878+-0.0443     ?      3.9691+-0.2435        ? might be 1.0209x slower
   adapt-to-double-divide                            23.6427+-0.1806     ?     23.8215+-0.2551        ?
   aliased-arguments-getbyval                         1.7535+-0.0259            1.7474+-0.0111        
   allocate-big-object                                3.2970+-0.0784     ?      3.3569+-0.0873        ? might be 1.0182x slower
   arguments-named-and-reflective                    16.2192+-0.2546           16.1519+-0.4170        
   arguments-out-of-bounds                           17.8940+-0.1591     ?     17.9528+-0.1993        ?
   arguments-strict-mode                             15.2461+-0.2909     ?     15.4096+-0.2676        ? might be 1.0107x slower
   arguments                                         13.4468+-0.1913           13.2722+-0.0999          might be 1.0132x faster
   arity-mismatch-inlining                            1.4572+-0.0258            1.4460+-0.0115        
   array-access-polymorphic-structure                11.0847+-0.2003     ?     11.3582+-0.9132        ? might be 1.0247x slower
   array-nonarray-polymorhpic-access                 43.5098+-0.3298           43.4700+-0.2732        
   array-prototype-every                            123.3109+-2.7186     ?    123.3951+-1.3106        ?
   array-prototype-forEach                          120.8754+-1.2687     ?    122.1719+-2.9598        ? might be 1.0107x slower
   array-prototype-map                              132.6558+-1.9751     ?    134.3283+-1.2995        ? might be 1.0126x slower
   array-prototype-reduce                           115.9856+-0.4974     ?    116.7597+-0.5070        ?
   array-prototype-reduceRight                      116.5284+-1.7294     ?    117.7384+-2.4637        ? might be 1.0104x slower
   array-prototype-some                             122.5771+-1.2801     ?    123.2189+-1.3286        ?
   array-splice-contiguous                           44.3923+-0.3101     ^     40.9171+-0.6896        ^ definitely 1.0849x faster
   array-with-double-add                              6.1462+-0.0237            6.1136+-0.0559        
   array-with-double-increment                        4.8239+-0.0248            4.8124+-0.0280        
   array-with-double-mul-add                          7.2834+-0.0375     ?      7.2893+-0.0588        ?
   array-with-double-sum                              4.7822+-0.0202     ?      4.7858+-0.0406        ?
   array-with-int32-add-sub                          10.1933+-0.3195           10.0708+-0.0235          might be 1.0122x faster
   array-with-int32-or-double-sum                     4.8599+-0.0147     ?      4.8678+-0.0187        ?
   ArrayBuffer-DataView-alloc-large-long-lived   
                                                     44.2783+-0.7615           44.0936+-0.1941        
   ArrayBuffer-DataView-alloc-long-lived             20.3133+-0.4532     ?     20.7979+-1.2232        ? might be 1.0239x slower
   ArrayBuffer-Int32Array-byteOffset                  5.5238+-0.0131     ?      5.5495+-0.1070        ?
   ArrayBuffer-Int8Array-alloc-large-long-lived   
                                                     44.8175+-0.4200     ?     45.4143+-0.3902        ? might be 1.0133x slower
   ArrayBuffer-Int8Array-alloc-long-lived-buffer   
                                                     31.4607+-0.0909     ?     32.3026+-1.0389        ? might be 1.0268x slower
   ArrayBuffer-Int8Array-alloc-long-lived            18.3311+-0.2703     ?     18.5620+-0.5942        ? might be 1.0126x slower
   ArrayBuffer-Int8Array-alloc                       15.5868+-0.0929     !     16.3544+-0.6513        ! definitely 1.0492x slower
   arrowfunction-call                                17.0258+-0.2764           16.7236+-0.0695          might be 1.0181x faster
   asmjs_bool_bug                                    12.0728+-0.1473           11.9774+-0.1583        
   assign-custom-setter-polymorphic                   4.4941+-0.0384            4.4782+-0.0314        
   assign-custom-setter                               6.5809+-0.0602     ?      6.7494+-0.3568        ? might be 1.0256x slower
   basic-set                                         11.8000+-0.1285     ?     11.8335+-0.1112        ?
   big-int-mul                                        5.7530+-0.3954     ?      5.8632+-0.4302        ? might be 1.0191x slower
   boolean-test                                       4.5345+-0.0174     ?      4.5932+-0.0688        ? might be 1.0129x slower
   branch-fold                                        5.3815+-0.0384     ?      5.3976+-0.1051        ?
   branch-on-string-as-boolean                       28.9403+-0.5358           28.7603+-0.5247        
   by-val-generic                                     3.5358+-0.0318     ?      3.5973+-0.0587        ? might be 1.0174x slower
   call-spread-apply                                 43.5923+-0.8065           42.6909+-0.3647          might be 1.0211x faster
   call-spread-call                                  35.4232+-0.6551           34.8853+-0.2449          might be 1.0154x faster
   captured-assignments                               0.8684+-0.0187            0.8534+-0.0111          might be 1.0176x faster
   cast-int-to-double                                 7.5681+-0.0243            7.5553+-0.0509        
   cell-argument                                      9.8773+-0.1493     ?      9.9372+-0.1607        ?
   cfg-simplify                                       4.0798+-0.0251     ?      4.0956+-0.0413        ?
   chain-getter-access                               12.9186+-0.1483     ?     13.0825+-0.3132        ? might be 1.0127x slower
   cmpeq-obj-to-obj-other                            14.6172+-0.4833           14.3825+-0.0543          might be 1.0163x faster
   constant-test                                      7.0488+-0.1384            7.0329+-0.0756        
   create-lots-of-functions                          14.3209+-0.2072           14.2917+-0.1686        
   cse-new-array-buffer                               3.3272+-0.0865            3.3199+-0.0454        
   cse-new-array                                      3.4209+-0.0343            3.3975+-0.0302        
   DataView-custom-properties                        53.3251+-1.5895           51.4781+-0.2773          might be 1.0359x faster
   delay-tear-off-arguments-strictmode               20.3141+-0.3402           19.9325+-0.2204          might be 1.0191x faster
   deltablue-varargs                                304.9130+-2.8165          302.1101+-12.4392       
   destructuring-arguments                          258.1306+-1.3515     ?    259.2330+-4.8181        ?
   destructuring-parameters-overridden-by-function   
                                                      0.8327+-0.0100     ?      0.8333+-0.0127        ?
   destructuring-swap                                 7.2911+-0.0321            7.2853+-0.0490        
   direct-arguments-getbyval                          1.7924+-0.0671            1.7724+-0.0210          might be 1.0113x faster
   div-boolean-double                                 7.3200+-0.0254            7.2889+-0.0095        
   div-boolean                                       11.0456+-0.0372           11.0266+-0.0244        
   double-get-by-val-out-of-bounds                    6.5846+-0.0375     ^      6.4862+-0.0574        ^ definitely 1.0152x faster
   double-pollution-getbyval                         12.2228+-0.1532           12.1615+-0.0199        
   double-pollution-putbyoffset                       5.7251+-0.0291     ?      5.7998+-0.0770        ? might be 1.0130x slower
   double-real-use                                   43.1645+-0.4532           43.1157+-0.4865        
   double-to-int32-typed-array-no-inline              3.3939+-0.0185            3.3886+-0.0298        
   double-to-int32-typed-array                        3.2063+-0.0309     ?      3.2115+-0.0375        ?
   double-to-uint32-typed-array-no-inline             3.5207+-0.0250     ?      3.5552+-0.0423        ?
   double-to-uint32-typed-array                       3.2027+-0.0160            3.1981+-0.0326        
   elidable-new-object-dag                           54.0302+-0.6511     ?     54.4548+-0.9588        ?
   elidable-new-object-roflcopter                    51.4409+-0.9758           51.1798+-1.7615        
   elidable-new-object-then-call                     50.9148+-0.9146           50.8526+-0.6858        
   elidable-new-object-tree                          60.2544+-0.4477     ?     60.3597+-0.9304        ?
   empty-string-plus-int                              7.7272+-0.0715     ?      7.7290+-0.0208        ?
   emscripten-cube2hash                              56.7263+-0.4273     ?     56.9870+-0.7980        ?
   exit-length-on-plain-object                       23.7288+-0.2047     ?     23.7366+-0.2225        ?
   external-arguments-getbyval                        2.0728+-0.1328            2.0010+-0.0887          might be 1.0359x faster
   external-arguments-putbyval                        3.5134+-0.0559            3.4708+-0.0360          might be 1.0123x faster
   fixed-typed-array-storage-var-index                1.9541+-0.0215            1.9346+-0.0139          might be 1.0101x faster
   fixed-typed-array-storage                          1.5332+-0.0086     ?      1.5704+-0.1111        ? might be 1.0243x slower
   Float32Array-matrix-mult                           7.1799+-0.0275            7.1703+-0.0340        
   Float32Array-to-Float64Array-set                  79.1064+-0.1130     ^     77.4350+-0.1387        ^ definitely 1.0216x faster
   Float64Array-alloc-long-lived                     91.9246+-0.5413     ?     92.4516+-1.3974        ?
   Float64Array-to-Int16Array-set                    96.1245+-0.6411           95.9178+-0.1577        
   fold-double-to-int                                20.4092+-0.5753           20.2585+-0.1476        
   fold-get-by-id-to-multi-get-by-offset-rare-int   
                                                     13.4241+-0.1728     ?     13.4655+-0.1747        ?
   fold-get-by-id-to-multi-get-by-offset             11.5534+-0.0501     ?     11.6177+-0.1444        ?
   fold-multi-get-by-offset-to-get-by-offset   
                                                      9.9893+-0.3097     ?      9.9980+-0.3185        ?
   fold-multi-get-by-offset-to-poly-get-by-offset   
                                                     10.7080+-0.0357           10.5794+-0.2513          might be 1.0122x faster
   fold-multi-put-by-offset-to-poly-put-by-offset   
                                                     12.9651+-0.0298     ?     13.0049+-0.1421        ?
   fold-multi-put-by-offset-to-put-by-offset   
                                                     12.1522+-0.2064     ?     12.1632+-0.2201        ?
   fold-multi-put-by-offset-to-replace-or-transition-put-by-offset   
                                                     17.4780+-0.0841           17.1332+-0.4775          might be 1.0201x faster
   fold-put-by-id-to-multi-put-by-offset             14.8513+-0.3354           14.6827+-0.4343          might be 1.0115x faster
   fold-put-by-val-with-string-to-multi-put-by-offset   
                                                     14.6523+-0.5304           14.5151+-0.3702        
   fold-put-by-val-with-symbol-to-multi-put-by-offset   
                                                     14.7121+-0.3595           14.6277+-0.4079        
   fold-put-structure                                 9.5219+-0.0932     ?      9.5583+-0.0754        ?
   for-of-iterate-array-entries                      17.4117+-0.5974           17.0608+-0.0921          might be 1.0206x faster
   for-of-iterate-array-keys                          5.7491+-0.0448     ?      5.7491+-0.0992        ?
   for-of-iterate-array-values                        5.3867+-0.1774     ?      5.4963+-0.2291        ? might be 1.0203x slower
   fround                                            26.3141+-0.3220           26.0214+-0.1657          might be 1.0113x faster
   ftl-library-inlining-dataview                    102.2464+-1.2467     ?    104.4132+-1.6726        ? might be 1.0212x slower
   ftl-library-inlining                             166.0524+-6.8950          160.4786+-7.0118          might be 1.0347x faster
   function-call                                     16.8612+-0.4604     ?     16.8889+-0.3230        ?
   function-dot-apply                                 3.3182+-0.0404            3.3043+-0.0349        
   function-test                                      4.1913+-0.0257     ?      4.1981+-0.0545        ?
   function-with-eval                               135.5319+-0.8219          135.3693+-0.5417        
   gcse-poly-get-less-obvious                        40.5550+-0.3706     ?     40.8477+-0.3487        ?
   gcse-poly-get                                     41.7665+-0.2807     ?     41.9327+-0.0342        ?
   gcse                                               5.7589+-0.0258     ?      5.7709+-0.0409        ?
   get-by-id-bimorphic-check-structure-elimination-simple   
                                                      3.8595+-0.0305     ?      3.9019+-0.0715        ? might be 1.0110x slower
   get-by-id-bimorphic-check-structure-elimination   
                                                      7.6118+-0.0206     ?      7.6434+-0.0254        ?
   get-by-id-chain-from-try-block                     3.6387+-0.0256     !      3.9825+-0.0152        ! definitely 1.0945x slower
   get-by-id-check-structure-elimination              6.5596+-0.0115            6.5445+-0.0173        
   get-by-id-proto-or-self                           28.8024+-1.9243     ?     29.1106+-2.3331        ? might be 1.0107x slower
   get-by-id-quadmorphic-check-structure-elimination-simple   
                                                      4.2823+-0.0222     ?      4.3004+-0.0125        ?
   get-by-id-self-or-proto                           28.2912+-2.2309     ?     28.5925+-2.0037        ? might be 1.0107x slower
   get-by-val-out-of-bounds                           6.3539+-0.0274     ?      6.3576+-0.1044        ?
   get-by-val-with-string-bimorphic-check-structure-elimination-simple   
                                                      3.8989+-0.0256     ?      4.1175+-0.2969        ? might be 1.0561x slower
   get-by-val-with-string-bimorphic-check-structure-elimination   
                                                      9.8220+-0.0260     ?      9.8566+-0.0222        ?
   get-by-val-with-string-chain-from-try-block   
                                                      3.7454+-0.0314     !      4.0640+-0.0174        ! definitely 1.0851x slower
   get-by-val-with-string-check-structure-elimination   
                                                      8.8920+-0.0336            8.8857+-0.0246        
   get-by-val-with-string-proto-or-self              29.8017+-1.8176           29.6752+-2.0641        
   get-by-val-with-string-quadmorphic-check-structure-elimination-simple   
                                                      5.1317+-0.0473            5.0025+-0.1080          might be 1.0258x faster
   get-by-val-with-string-self-or-proto              28.6436+-1.4561           28.6262+-1.3682        
   get-by-val-with-symbol-bimorphic-check-structure-elimination-simple   
                                                      4.6360+-0.1007            4.5844+-0.0400          might be 1.0113x faster
   get-by-val-with-symbol-bimorphic-check-structure-elimination   
                                                     19.0193+-0.1561           18.9594+-0.0710        
   get-by-val-with-symbol-chain-from-try-block   
                                                      3.7543+-0.0611     !      4.0748+-0.0263        ! definitely 1.0854x slower
   get-by-val-with-symbol-check-structure-elimination   
                                                     18.1030+-0.1484           18.0848+-0.1438        
   get-by-val-with-symbol-proto-or-self              29.5174+-2.1053           28.6266+-1.4266          might be 1.0311x faster
   get-by-val-with-symbol-quadmorphic-check-structure-elimination-simple   
                                                      6.1060+-0.0085     ?      6.1151+-0.0291        ?
   get-by-val-with-symbol-self-or-proto              28.8914+-1.8763           28.6772+-1.9660        
   get_callee_monomorphic                             3.3156+-0.0647     ?      3.3271+-0.0324        ?
   get_callee_polymorphic                             4.9327+-0.0579     ?      4.9952+-0.1655        ? might be 1.0127x slower
   getter-no-activation                               6.7681+-0.0275     ?      6.7911+-0.0251        ?
   getter-prototype                                  15.1134+-0.1463           15.0501+-0.1091        
   getter-richards-try-catch                       1870.1387+-69.9861        1864.3440+-62.4338       
   getter-richards                                  134.2158+-2.1738     ?    134.7987+-2.0508        ?
   getter                                             7.5230+-0.0252            7.5125+-0.0144        
   global-object-access-with-mutating-structure   
                                                      8.5840+-0.0718     ?      8.6278+-0.0972        ?
   global-var-const-infer-fire-from-opt               1.2727+-0.0169            1.2601+-0.0099          might be 1.0100x faster
   global-var-const-infer                             1.1393+-0.0115     ?      1.1439+-0.0435        ?
   hard-overflow-check-equal                         55.7414+-0.5813           55.5410+-0.5327        
   hard-overflow-check                               55.0785+-0.1224     ?     55.3795+-0.4965        ?
   HashMap-put-get-iterate-keys                      35.2813+-0.7416           35.0245+-0.2935        
   HashMap-put-get-iterate                           34.9133+-0.6077           34.8022+-0.5673        
   HashMap-string-put-get-iterate                    37.4821+-0.5637     ?     37.5777+-0.6590        ?
   hoist-make-rope                                   14.3650+-0.8142           14.1235+-0.5333          might be 1.0171x faster
   hoist-poly-check-structure-effectful-loop   
                                                      6.1369+-0.0343     ?      6.1399+-0.0177        ?
   hoist-poly-check-structure                         4.7804+-0.3442            4.6731+-0.0811          might be 1.0230x faster
   imul-double-only                                  11.6418+-0.7567           11.1224+-0.3677          might be 1.0467x faster
   imul-int-only                                     13.7286+-0.5239           13.2067+-1.0251          might be 1.0395x faster
   imul-mixed                                        11.0979+-0.6299     ?     11.2597+-0.2936        ? might be 1.0146x slower
   in-four-cases                                     32.8134+-0.4025           32.6750+-0.4599        
   in-one-case-false                                 16.1927+-0.1024           16.1294+-0.0560        
   in-one-case-true                                  16.1504+-0.0494     ?     16.3423+-0.5340        ? might be 1.0119x slower
   in-two-cases                                      17.3976+-0.1941           17.3130+-0.0340        
   indexed-properties-in-objects                      4.2146+-0.0383     ?      4.2178+-0.0131        ?
   infer-closure-const-then-mov-no-inline             5.6752+-0.0540     !      5.8690+-0.1253        ! definitely 1.0341x slower
   infer-closure-const-then-mov                      26.4984+-0.2540           26.3781+-0.3077        
   infer-closure-const-then-put-to-scope-no-inline   
                                                     19.1555+-0.0815           19.0784+-0.0229        
   infer-closure-const-then-put-to-scope             33.4886+-0.1321     ?     33.9130+-0.4879        ? might be 1.0127x slower
   infer-closure-const-then-reenter-no-inline   
                                                     83.2848+-0.5207     ?     83.4138+-0.7336        ?
   infer-closure-const-then-reenter                  33.6777+-0.9208     ?     33.8130+-0.3056        ?
   infer-constant-global-property                     5.1165+-0.0325            5.1116+-0.0392        
   infer-constant-property                            3.9057+-0.0146     ?      3.9081+-0.0122        ?
   infer-one-time-closure-ten-vars                   14.3982+-0.2095     ?     14.4559+-0.2140        ?
   infer-one-time-closure-two-vars                   13.8418+-0.3003     ?     13.9475+-0.2584        ?
   infer-one-time-closure                            13.7076+-0.1182     ?     13.7498+-0.2085        ?
   infer-one-time-deep-closure                       22.6681+-0.1515           22.6146+-0.0934        
   inline-arguments-access                            5.5244+-0.0478     ?      5.6437+-0.1755        ? might be 1.0216x slower
   inline-arguments-aliased-access                    5.6864+-0.1856     ?      5.7124+-0.0947        ?
   inline-arguments-local-escape                      5.5634+-0.0628            5.5350+-0.0576        
   inline-get-scoped-var                              6.6423+-0.0355            6.6045+-0.0455        
   inlined-put-by-id-transition                      14.1938+-0.3420           13.9316+-0.0843          might be 1.0188x faster
   inlined-put-by-val-with-string-transition   
                                                     70.0074+-2.2253           68.5771+-1.3127          might be 1.0209x faster
   inlined-put-by-val-with-symbol-transition   
                                                     69.0124+-0.9006     ?     69.5269+-2.5078        ?
   int-or-other-abs-then-get-by-val                   6.6487+-0.0332     ?      6.6537+-0.0295        ?
   int-or-other-abs-zero-then-get-by-val             24.5043+-0.1337     ?     24.9112+-0.4230        ? might be 1.0166x slower
   int-or-other-add-then-get-by-val                   6.5730+-0.0188     ?      6.5910+-0.0687        ?
   int-or-other-add                                   7.6464+-0.0223     ?      7.6485+-0.0358        ?
   int-or-other-div-then-get-by-val                   5.7783+-0.0129            5.7773+-0.0228        
   int-or-other-max-then-get-by-val                   5.9312+-0.0450            5.9265+-0.0182        
   int-or-other-min-then-get-by-val                   5.9487+-0.0609     ?      5.9548+-0.0650        ?
   int-or-other-mod-then-get-by-val                   5.4964+-0.0375            5.4768+-0.0344        
   int-or-other-mul-then-get-by-val                   5.6390+-0.0691            5.5814+-0.0054          might be 1.0103x faster
   int-or-other-neg-then-get-by-val                   6.4544+-0.0954            6.4026+-0.0323        
   int-or-other-neg-zero-then-get-by-val             24.2410+-0.0599     !     25.0129+-0.2402        ! definitely 1.0318x slower
   int-or-other-sub-then-get-by-val                   6.5179+-0.0161            6.5120+-0.0149        
   int-or-other-sub                                   5.0608+-0.0983     ?      5.1800+-0.1908        ? might be 1.0235x slower
   int-overflow-local                                 6.2792+-0.0386            6.2636+-0.0123        
   Int16Array-alloc-long-lived                       66.4665+-0.2307           66.0540+-0.2087        
   Int16Array-bubble-sort-with-byteLength            37.3459+-0.3587     ?     37.4466+-0.3034        ?
   Int16Array-bubble-sort                            36.1155+-0.1279     ?     37.3836+-1.9672        ? might be 1.0351x slower
   Int16Array-load-int-mul                            2.3021+-0.0108     ?      2.3124+-0.0061        ?
   Int16Array-to-Int32Array-set                      70.9501+-0.2458     ?     71.0643+-0.6816        ?
   Int32Array-alloc-large                            24.7376+-0.6315           24.6752+-0.9684        
   Int32Array-alloc-long-lived                       74.7989+-0.5668           74.4100+-0.3471        
   Int32Array-alloc                                   3.7001+-0.0545            3.6989+-0.0601        
   Int32Array-Int8Array-view-alloc                   10.0502+-0.4725            9.8254+-0.2423          might be 1.0229x faster
   int52-spill                                        7.5794+-0.1256     ?      7.6393+-0.1201        ?
   Int8Array-alloc-long-lived                        59.4588+-0.2531           59.2479+-0.2786        
   Int8Array-load-with-byteLength                     4.8062+-0.0260     ?      4.8218+-0.0350        ?
   Int8Array-load                                     4.8056+-0.0245     ?      4.8337+-0.0231        ?
   integer-divide                                    16.5186+-0.1049     ?     16.5897+-0.2297        ?
   integer-modulo                                     2.9445+-0.0163     ?      2.9608+-0.0306        ?
   is-boolean-fold-tricky                             5.9893+-0.0242            5.9767+-0.0337        
   is-boolean-fold                                    4.1237+-0.0295            4.1072+-0.0277        
   is-function-fold-tricky-internal-function   
                                                     16.6972+-0.1498           16.5627+-0.0172        
   is-function-fold-tricky                            6.1254+-0.0366     ?      6.2771+-0.3212        ? might be 1.0248x slower
   is-function-fold                                   4.1505+-0.0486            4.1465+-0.0362        
   is-number-fold-tricky                              5.9962+-0.0590            5.9914+-0.1165        
   is-number-fold                                     4.1047+-0.0301            4.0786+-0.0428        
   is-object-or-null-fold-functions                   4.2348+-0.0583     ?      4.3218+-0.1831        ? might be 1.0206x slower
   is-object-or-null-fold-less-tricky                 6.0994+-0.0285     ?      6.1040+-0.0576        ?
   is-object-or-null-fold-tricky                      8.2373+-0.0373     ?      8.2391+-0.0228        ?
   is-object-or-null-fold                             4.1617+-0.0370            4.1442+-0.0442        
   is-object-or-null-trickier-function                6.2416+-0.0334            6.2290+-0.0213        
   is-object-or-null-trickier-internal-function   
                                                     16.9395+-0.0560     ?     17.0083+-0.1841        ?
   is-object-or-null-tricky-function                  6.1932+-0.0408            6.1547+-0.0105        
   is-object-or-null-tricky-internal-function   
                                                     12.7987+-0.0391     ?     12.8287+-0.1420        ?
   is-string-fold-tricky                              5.9853+-0.0536            5.9618+-0.0225        
   is-string-fold                                     4.2124+-0.2802            4.1169+-0.0582          might be 1.0232x faster
   is-undefined-fold-tricky                           5.0199+-0.1584            4.9664+-0.0283          might be 1.0108x faster
   is-undefined-fold                                  4.0912+-0.0185     ?      4.1039+-0.0446        ?
   JSONP-negative-0                                   0.5252+-0.0449            0.5052+-0.0107          might be 1.0395x faster
   large-int-captured                                 6.1976+-0.0599     ?      6.2953+-0.1172        ? might be 1.0158x slower
   large-int-neg                                     22.9172+-0.4669           22.5513+-0.1776          might be 1.0162x faster
   large-int                                         20.6276+-0.3874           20.3119+-0.3381          might be 1.0155x faster
   load-varargs-elimination                          32.5995+-0.2996     ?     32.9308+-0.6288        ? might be 1.0102x slower
   logical-not-weird-types                            4.9291+-0.0232     ?      4.9536+-0.0415        ?
   logical-not                                        6.8466+-0.0449            6.8434+-0.0471        
   lots-of-fields                                    16.8601+-0.2185     ?     16.8761+-0.1879        ?
   make-indexed-storage                               4.3077+-0.2181     ?      4.3248+-0.2791        ?
   make-rope-cse                                      5.0444+-0.0586     ?      5.0462+-0.0530        ?
   marsaglia-larger-ints                             52.9128+-0.1717     ?     53.0232+-0.3269        ?
   marsaglia-osr-entry                               32.5551+-0.1743           32.4532+-0.1518        
   math-with-out-of-bounds-array-values              35.3060+-0.2474     ?     35.9518+-0.7310        ? might be 1.0183x slower
   max-boolean                                        3.5998+-0.0814     ?      3.6320+-0.0275        ?
   method-on-number                                  25.1010+-0.4190           24.8434+-0.1139          might be 1.0104x faster
   min-boolean                                        3.6135+-0.0322     ?      3.6691+-0.0251        ? might be 1.0154x slower
   minus-boolean-double                               4.5515+-0.0383     ?      4.5540+-0.0208        ?
   minus-boolean                                      3.4004+-0.0310     ?      3.4149+-0.0189        ?
   misc-strict-eq                                    50.3940+-0.7094           49.5806+-1.9255          might be 1.0164x faster
   mod-boolean-double                                15.3607+-0.0362     ?     15.5790+-0.4649        ? might be 1.0142x slower
   mod-boolean                                       11.0150+-0.0396           10.9890+-0.0210        
   mul-boolean-double                                 5.3095+-0.0375            5.2993+-0.0308        
   mul-boolean                                        4.1471+-0.0157            4.1462+-0.0153        
   neg-boolean                                        4.5807+-0.0332            4.5560+-0.0174        
   negative-zero-divide                               0.6781+-0.0230            0.6724+-0.0055        
   negative-zero-modulo                               0.6724+-0.0241            0.6481+-0.0174          might be 1.0375x faster
   negative-zero-negate                               0.6346+-0.0126     ?      0.6393+-0.0144        ?
   nested-function-parsing                           71.0327+-0.6498     ^     69.3320+-0.5226        ^ definitely 1.0245x faster
   new-array-buffer-dead                            136.7739+-2.6853          135.8597+-0.5147        
   new-array-buffer-push                              9.1641+-0.3122            9.0615+-0.1954          might be 1.0113x faster
   new-array-dead                                    25.8010+-0.6691     ?     25.9115+-0.6712        ?
   new-array-push                                     5.5897+-0.3182            5.4299+-0.3296          might be 1.0294x faster
   no-inline-constructor                             51.6239+-0.4986     ?     51.7477+-0.6987        ?
   number-test                                        4.5034+-0.0370            4.4937+-0.0193        
   object-closure-call                                7.5679+-0.0759            7.5538+-0.0189        
   object-get-own-property-symbols-on-large-array   
                                                      5.3756+-0.1009     ?      5.4712+-0.1056        ? might be 1.0178x slower
   object-test                                        4.1789+-0.0134     ?      4.1976+-0.0267        ?
   obvious-sink-pathology-taken                     157.4008+-1.2094          157.3849+-1.0780        
   obvious-sink-pathology                            50.7453+-0.5219     ?     50.7794+-0.2623        ?
   obviously-elidable-new-object                     45.4500+-0.3307           45.2374+-0.2762        
   plus-boolean-arith                                 3.6351+-0.0107            3.6311+-0.0139        
   plus-boolean-double                                4.5582+-0.0195     ?      4.5719+-0.0208        ?
   plus-boolean                                       3.4980+-0.0222            3.4713+-0.0244        
   poly-chain-access-different-prototypes-simple   
                                                      3.7990+-0.0324            3.7673+-0.0116        
   poly-chain-access-different-prototypes             3.8078+-0.0334            3.8050+-0.0265        
   poly-chain-access-simpler                          3.7893+-0.0220            3.7683+-0.0265        
   poly-chain-access                                  3.7632+-0.0146     ?      3.8610+-0.2134        ? might be 1.0260x slower
   poly-stricteq                                     91.5854+-0.0826     ?     91.6396+-0.1185        ?
   polymorphic-array-call                             2.0868+-0.0494            2.0607+-0.0497          might be 1.0126x faster
   polymorphic-get-by-id                              4.8297+-0.0154            4.8203+-0.0132        
   polymorphic-put-by-id                             52.0236+-0.6187           51.3921+-0.8107          might be 1.0123x faster
   polymorphic-put-by-val-with-string                52.1907+-0.2282     ?     52.3078+-0.4663        ?
   polymorphic-put-by-val-with-symbol                52.1076+-0.4977     ?     52.8072+-1.4808        ? might be 1.0134x slower
   polymorphic-structure                             19.3704+-0.0427     ?     19.3777+-0.1768        ?
   polyvariant-monomorphic-get-by-id                 11.9708+-0.0618     ?     11.9958+-0.1861        ?
   proto-getter-access                               13.0066+-0.3483           12.8970+-0.1686        
   prototype-access-with-mutating-prototype           8.2982+-0.2350     ?      8.3592+-0.2093        ?
   put-by-id-replace-and-transition                  12.3503+-0.2141           12.2558+-0.2325        
   put-by-id-slightly-polymorphic                     4.1145+-0.0298            4.0736+-0.0168          might be 1.0100x faster
   put-by-id                                         15.6458+-0.2494           15.6456+-0.3687        
   put-by-val-direct                                  0.6734+-0.0088     ?      0.6781+-0.0238        ?
   put-by-val-large-index-blank-indexing-type   
                                                      7.9946+-0.1090            7.8265+-0.1543          might be 1.0215x faster
   put-by-val-machine-int                             3.8170+-0.1590            3.7843+-0.0713        
   put-by-val-with-string-replace-and-transition   
                                                     17.4609+-0.1070     ?     17.5715+-0.0635        ?
   put-by-val-with-string-slightly-polymorphic   
                                                      5.4100+-0.0380            5.3891+-0.0149        
   put-by-val-with-string                            16.5839+-0.6078           16.5372+-0.5327        
   put-by-val-with-symbol-replace-and-transition   
                                                     19.0431+-0.3243           18.7678+-0.1287          might be 1.0147x faster
   put-by-val-with-symbol-slightly-polymorphic   
                                                      5.7996+-0.0146            5.7827+-0.0144        
   put-by-val-with-symbol                            16.6856+-0.3784           16.4890+-0.1980          might be 1.0119x faster
   rare-osr-exit-on-local                            21.6786+-0.1149           21.6671+-0.1223        
   raytrace-with-empty-try-catch                      9.6935+-0.0436     !      9.9341+-0.0798        ! definitely 1.0248x slower
   raytrace-with-try-catch                           17.7987+-0.5406     ?     18.0579+-0.1999        ? might be 1.0146x slower
   register-pressure-from-osr                        29.0639+-0.5171           28.8796+-0.0365        
   repeat-multi-get-by-offset                        33.7936+-0.1687           33.7242+-0.1668        
   richards-empty-try-catch                         122.4336+-0.8095     ^     90.4892+-0.6195        ^ definitely 1.3530x faster
   richards-try-catch                               399.7264+-1.2792     ^    375.1357+-0.8240        ^ definitely 1.0656x faster
   setter-prototype                                  12.2536+-0.1653           12.2076+-0.1057        
   setter                                             7.6783+-0.2618            7.5256+-0.0174          might be 1.0203x faster
   simple-activation-demo                            37.0419+-0.0572     ?     37.2278+-0.4748        ?
   simple-getter-access                              16.2344+-0.2092           16.2269+-0.1998        
   simple-poly-call-nested                           11.7894+-0.0425     ?     11.8098+-0.0178        ?
   simple-poly-call                                   2.0040+-0.0145            1.9996+-0.0128        
   sin-boolean                                       29.3145+-1.8669           27.6581+-1.4455          might be 1.0599x faster
   singleton-scope                                   94.7394+-0.1547     ?     94.9641+-0.4632        ?
   sink-function                                     15.0571+-0.2413     ?     15.1237+-0.1376        ?
   sink-huge-activation                              24.7854+-1.0357           23.8591+-1.0645          might be 1.0388x faster
   sinkable-new-object-dag                           86.3230+-0.9776           86.2346+-0.7046        
   sinkable-new-object-taken                         69.2958+-0.4143     ?     69.5146+-0.4381        ?
   sinkable-new-object                               50.9557+-0.6048           50.6478+-0.4427        
   slow-array-profile-convergence                     4.4060+-0.0812            4.3650+-0.1113        
   slow-convergence                                   4.1987+-0.0251            4.1734+-0.0147        
   slow-ternaries                                    26.5315+-1.8516           26.4625+-1.9151        
   sorting-benchmark                                 28.3883+-0.3145     ?     28.6322+-0.4623        ?
   sparse-conditional                                 1.9095+-0.0324            1.8959+-0.0150        
   splice-to-remove                                  21.5979+-0.1242     ?     21.6539+-0.2118        ?
   string-char-code-at                               23.2804+-0.2690           23.2059+-0.1542        
   string-concat-object                               3.0804+-0.0584     ?      3.1008+-0.1125        ?
   string-concat-pair-object                          2.9462+-0.0365     ?      3.0466+-0.2330        ? might be 1.0341x slower
   string-concat-pair-simple                         14.7628+-0.1582     ?     14.8768+-0.3005        ?
   string-concat-simple                              15.4043+-0.1056           15.2892+-0.0928        
   string-cons-repeat                                10.1652+-0.0786           10.1555+-0.1569        
   string-cons-tower                                 10.4726+-0.4072           10.2951+-0.1555          might be 1.0172x faster
   string-equality                                   28.1293+-0.0509     ?     28.3587+-0.5182        ?
   string-get-by-val-big-char                        10.3381+-0.4721           10.1259+-0.0364          might be 1.0210x faster
   string-get-by-val-out-of-bounds-insane             5.2511+-0.0852     !      5.5583+-0.1622        ! definitely 1.0585x slower
   string-get-by-val-out-of-bounds                    7.3152+-0.0184            7.3046+-0.0149        
   string-get-by-val                                  4.7300+-0.0281     !      4.8795+-0.0067        ! definitely 1.0316x slower
   string-hash                                        2.9864+-0.0184            2.9779+-0.0183        
   string-long-ident-equality                        23.3358+-0.1861           23.1939+-0.0619        
   string-out-of-bounds                              19.0833+-0.2352           19.0661+-0.1702        
   string-repeat-arith                               44.7087+-0.1152           44.5767+-0.3256        
   string-sub                                        62.7926+-0.4682     ^     60.1677+-0.6877        ^ definitely 1.0436x faster
   string-test                                        4.2957+-0.0342     ?      4.2993+-0.0283        ?
   string-var-equality                               51.8596+-0.0914     ?     52.0982+-0.4469        ?
   structure-hoist-over-transitions                   3.4660+-0.0334            3.4451+-0.0330        
   substring-concat-weird                            56.7899+-0.8706           56.7745+-0.5777        
   substring-concat                                  62.0999+-0.3912     ?     62.4218+-0.5862        ?
   substring                                         68.9284+-0.2005     ?     69.2074+-0.3038        ?
   switch-char-constant                               3.8890+-0.0469            3.8806+-0.0217        
   switch-char                                        8.5053+-0.0182     ?      8.5162+-0.0447        ?
   switch-constant                                   10.8789+-0.2570           10.8077+-0.1746        
   switch-string-basic-big-var                       28.4442+-0.3508           28.1883+-0.2185        
   switch-string-basic-big                           24.9869+-0.4139     ?     25.3825+-0.3706        ? might be 1.0158x slower
   switch-string-basic-var                           23.0173+-0.0573     ?     23.3120+-0.4290        ? might be 1.0128x slower
   switch-string-basic                               21.1713+-0.1870     ?     21.2091+-0.1865        ?
   switch-string-big-length-tower-var                29.1825+-0.0338     ?     29.2374+-0.0581        ?
   switch-string-length-tower-var                    22.5876+-0.2338     ?     22.5924+-0.2054        ?
   switch-string-length-tower                        19.3107+-0.4555           19.2202+-0.0822        
   switch-string-short                               19.0660+-0.0408     ?     19.0806+-0.0624        ?
   switch                                            15.7552+-0.1146           15.7283+-0.1383        
   tear-off-arguments-simple                          4.3555+-0.0641            4.3528+-0.0723        
   tear-off-arguments                                 5.8740+-0.0816     ?      5.9778+-0.1569        ? might be 1.0177x slower
   temporal-structure                                18.6786+-0.4146     ?     18.6893+-0.1988        ?
   to-int32-boolean                                  19.2125+-0.0196           19.2117+-0.0242        
   try-catch-get-by-val-cloned-arguments             14.9093+-0.1495     ^     14.5811+-0.0798        ^ definitely 1.0225x faster
   try-catch-get-by-val-direct-arguments              3.1863+-0.0401     ?      3.2602+-0.0345        ? might be 1.0232x slower
   try-catch-get-by-val-scoped-arguments              6.5813+-0.0891     !      6.9121+-0.0426        ! definitely 1.0503x slower
   typed-array-get-set-by-val-profiling              42.6086+-0.5064           42.4781+-0.4834        
   undefined-property-access                        514.3839+-0.7014     ?    514.5535+-0.5463        ?
   undefined-test                                     4.4510+-0.0324     ?      4.4643+-0.0607        ?
   unprofiled-licm                                   18.9864+-0.2788           18.7829+-0.2014          might be 1.0108x faster
   v8-raytrace-with-empty-try-catch                  82.0640+-0.5641     !     86.6988+-0.4571        ! definitely 1.0565x slower
   v8-raytrace-with-try-catch                       118.1038+-0.5443     ?    118.5107+-0.9642        ?
   varargs-call                                      20.3959+-0.0808     ?     20.5775+-0.3677        ?
   varargs-construct-inline                          35.9178+-0.3370     ?     36.0191+-0.2834        ?
   varargs-construct                                 30.2556+-0.0640     ?     30.2693+-0.1125        ?
   varargs-inline                                    13.9916+-0.0900     ?     14.1214+-0.0631        ?
   varargs-strict-mode                               15.6438+-0.0457           15.5703+-0.0873        
   varargs                                           15.4666+-0.0257     ?     15.5222+-0.1852        ?
   weird-inlining-const-prop                          3.3014+-0.0531            3.2827+-0.0749        

   &lt;geometric&gt;                                       12.8300+-0.0151           12.8209+-0.0080          might be 1.0007x faster

                                                            og                   ftlTryCatch                                    
AsmBench:
   bigfib.cpp                                       730.9815+-2.4785          729.1859+-3.3442        
   cray.c                                           620.8268+-2.5730     ?    623.0887+-2.6117        ?
   dry.c                                            714.8593+-6.0441          709.7355+-9.1338        
   FloatMM.c                                       1061.6207+-0.8239         1061.4532+-0.3197        
   gcc-loops.cpp                                   5982.9512+-4.2550         5980.1173+-3.4851        
   n-body.c                                        1446.6202+-1.1786     ?   1446.8936+-0.9711        ?
   Quicksort.c                                      621.8454+-0.7185     ^    611.8690+-7.3304        ^ definitely 1.0163x faster
   stepanov_container.cpp                          5393.9252+-15.7115    ?   5400.6274+-17.9596       ?
   Towers.c                                         375.9210+-0.5808          375.8098+-0.3801        

   &lt;geometric&gt;                                     1158.4793+-1.6571         1155.6720+-1.9524          might be 1.0024x faster

                                                            og                   ftlTryCatch                                    
CompressionBench:
   huffman                                           82.4093+-0.5053           82.2625+-0.4126        
   arithmetic-simple                                490.6205+-1.4659     ?    491.2704+-1.5450        ?
   arithmetic-precise                               399.4070+-2.3886     ?    401.2843+-3.2933        ?
   arithmetic-complex-precise                       398.0493+-2.4813     ?    399.4567+-1.2182        ?
   arithmetic-precise-order-0                       507.1405+-0.9587          506.0706+-0.4088        
   arithmetic-precise-order-1                       473.5144+-1.8129     ?    474.4021+-3.5032        ?
   arithmetic-precise-order-2                       566.5544+-3.8521          563.4081+-2.5039        
   arithmetic-simple-order-1                        569.0065+-2.5374          567.6103+-1.6439        
   arithmetic-simple-order-2                        650.5322+-2.3931     ?    650.6514+-2.1461        ?
   lz-string                                        432.4509+-13.6772         427.6992+-3.6884          might be 1.0111x faster

   &lt;geometric&gt;                                      411.6987+-0.9557          411.2540+-0.9576          might be 1.0011x faster

                                                            og                   ftlTryCatch                                    
Geomean of preferred means:
   &lt;scaled-result&gt;                                   81.7479+-0.1057           81.6447+-0.1039          might be 1.0013x faster</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1140700</commentid>
    <comment_count>14</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-11-09 23:49:23 -0800</bug_when>
    <thetext>landed in:
http://trac.webkit.org/changeset/192203</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>262908</attachid>
            <date>2015-10-12 11:24:06 -0700</date>
            <delta_ts>2015-10-30 16:45:52 -0700</delta_ts>
            <desc>WIP</desc>
            <filename>b-backup.diff</filename>
            <type>text/plain</type>
            <size>28598</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHR3JhcGguY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHR3JhcGguY3BwCShyZXZpc2lvbiAxOTA3
NDUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0dyYXBoLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMTQ1NSw2ICsxNDU1LDI4IEBAIE1ldGhvZE9mR2V0dGluZ0FWYWx1ZVByb2ZpbGUg
R3JhcGg6Om1ldGgKICAgICByZXR1cm4gTWV0aG9kT2ZHZXR0aW5nQVZhbHVlUHJvZmlsZSgpOwog
fQogCitib29sIEdyYXBoOjp3aWxsQ2F0Y2hFeGNlcHRpb25Jbk1hY2hpbmVGcmFtZShDb2RlT3Jp
Z2luIGNvZGVPcmlnaW4sIENvZGVPcmlnaW4mIG9wQ2F0Y2hPcmlnaW5PdXQsIEhhbmRsZXJJbmZv
KiYgY2F0Y2hIYW5kbGVyT3V0KQoreworICAgIHVuc2lnbmVkIGJ5dGVjb2RlSW5kZXhUb0NoZWNr
ID0gY29kZU9yaWdpbi5ieXRlY29kZUluZGV4OworICAgIHdoaWxlICgxKSB7CisgICAgICAgIElu
bGluZUNhbGxGcmFtZSogaW5saW5lQ2FsbEZyYW1lID0gY29kZU9yaWdpbi5pbmxpbmVDYWxsRnJh
bWU7CisgICAgICAgIENvZGVCbG9jayogY29kZUJsb2NrID0gYmFzZWxpbmVDb2RlQmxvY2tGb3Io
aW5saW5lQ2FsbEZyYW1lKTsKKyAgICAgICAgaWYgKEhhbmRsZXJJbmZvKiBoYW5kbGVyID0gY29k
ZUJsb2NrLT5oYW5kbGVyRm9yQnl0ZWNvZGVPZmZzZXQoYnl0ZWNvZGVJbmRleFRvQ2hlY2spKSB7
CisgICAgICAgICAgICBvcENhdGNoT3JpZ2luT3V0ID0gQ29kZU9yaWdpbihoYW5kbGVyLT50YXJn
ZXQsIGlubGluZUNhbGxGcmFtZSk7CisgICAgICAgICAgICBjYXRjaEhhbmRsZXJPdXQgPSBoYW5k
bGVyOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAo
IWlubGluZUNhbGxGcmFtZSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBi
eXRlY29kZUluZGV4VG9DaGVjayA9IGlubGluZUNhbGxGcmFtZS0+ZGlyZWN0Q2FsbGVyLmJ5dGVj
b2RlSW5kZXg7CisgICAgICAgIGNvZGVPcmlnaW4gPSBjb2RlT3JpZ2luLmlubGluZUNhbGxGcmFt
ZS0+ZGlyZWN0Q2FsbGVyOworICAgIH0KKworICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVE
KCk7Cit9CisKIH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpERkcKIAogI2VuZGlmIC8vIEVOQUJMRShE
RkdfSklUKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdHcmFwaC5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHR3JhcGguaAkocmV2aXNpb24g
MTkwNzQ1KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdHcmFwaC5oCSh3b3JraW5n
IGNvcHkpCkBAIC04MjAsNiArODIwLDggQEAgcHVibGljOgogCiAgICAgYm9vbCBoYXNEZWJ1Z2dl
ckVuYWJsZWQoKSBjb25zdCB7IHJldHVybiBtX2hhc0RlYnVnZ2VyRW5hYmxlZDsgfQogCisgICAg
Ym9vbCB3aWxsQ2F0Y2hFeGNlcHRpb25Jbk1hY2hpbmVGcmFtZShDb2RlT3JpZ2luLCBDb2RlT3Jp
Z2luJiBvcENhdGNoT3JpZ2luT3V0LCBIYW5kbGVySW5mbyomIGNhdGNoSGFuZGxlck91dCk7CisK
ICAgICBWTSYgbV92bTsKICAgICBQbGFuJiBtX3BsYW47CiAgICAgQ29kZUJsb2NrKiBtX2NvZGVC
bG9jazsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSklUQ29tcGlsZXIuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSklUQ29tcGlsZXIu
Y3BwCShyZXZpc2lvbiAxOTA3NDUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJ
VENvbXBpbGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTYxLDI4ICs1NjEsNiBAQCB2b2lkIEpJ
VENvbXBpbGVyOjphcHBlbmRFeGNlcHRpb25IYW5kbGluCiAgICAgbV9leGNlcHRpb25IYW5kbGVy
T1NSRXhpdENhbGxTaXRlcy5hcHBlbmQoRXhjZXB0aW9uSGFuZGxpbmdPU1JFeGl0SW5mbyB7IGV4
aXRJbmZvLCAqZXhjZXB0aW9uSGFuZGxlciwgY2FsbFNpdGUgfSk7CiB9CiAKLWJvb2wgSklUQ29t
cGlsZXI6OndpbGxDYXRjaEV4Y2VwdGlvbkluTWFjaGluZUZyYW1lKENvZGVPcmlnaW4gY29kZU9y
aWdpbiwgQ29kZU9yaWdpbiYgb3BDYXRjaE9yaWdpbk91dCwgSGFuZGxlckluZm8qJiBjYXRjaEhh
bmRsZXJPdXQpCi17Ci0gICAgdW5zaWduZWQgYnl0ZWNvZGVJbmRleFRvQ2hlY2sgPSBjb2RlT3Jp
Z2luLmJ5dGVjb2RlSW5kZXg7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgSW5saW5lQ2FsbEZy
YW1lKiBpbmxpbmVDYWxsRnJhbWUgPSBjb2RlT3JpZ2luLmlubGluZUNhbGxGcmFtZTsKLSAgICAg
ICAgQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBtX2dyYXBoLmJhc2VsaW5lQ29kZUJsb2NrRm9yKGlu
bGluZUNhbGxGcmFtZSk7Ci0gICAgICAgIGlmIChIYW5kbGVySW5mbyogaGFuZGxlciA9IGNvZGVC
bG9jay0+aGFuZGxlckZvckJ5dGVjb2RlT2Zmc2V0KGJ5dGVjb2RlSW5kZXhUb0NoZWNrKSkgewot
ICAgICAgICAgICAgb3BDYXRjaE9yaWdpbk91dCA9IENvZGVPcmlnaW4oaGFuZGxlci0+dGFyZ2V0
LCBpbmxpbmVDYWxsRnJhbWUpOwotICAgICAgICAgICAgY2F0Y2hIYW5kbGVyT3V0ID0gaGFuZGxl
cjsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFp
bmxpbmVDYWxsRnJhbWUpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgYnl0
ZWNvZGVJbmRleFRvQ2hlY2sgPSBpbmxpbmVDYWxsRnJhbWUtPmRpcmVjdENhbGxlci5ieXRlY29k
ZUluZGV4OwotICAgICAgICBjb2RlT3JpZ2luID0gY29kZU9yaWdpbi5pbmxpbmVDYWxsRnJhbWUt
PmRpcmVjdENhbGxlcjsKLSAgICB9Ci0KLSAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgp
OwotfQotCiB2b2lkIEpJVENvbXBpbGVyOjpleGNlcHRpb25DaGVjaygpCiB7CiAgICAgLy8gSXQn
cyBpbXBvcnRhbnQgdGhhdCB3ZSB1c2Ugb3JpZ2luLmZvckV4aXQgaGVyZS4gQ29uc2lkZXIgaWYg
d2UgaG9pc3Qgc3RyaW5nCkBAIC02MDcsNyArNTg1LDcgQEAgdm9pZCBKSVRDb21waWxlcjo6ZXhj
ZXB0aW9uQ2hlY2soKQogICAgIC8vIH0KICAgICBDb2RlT3JpZ2luIG9wQ2F0Y2hPcmlnaW47CiAg
ICAgSGFuZGxlckluZm8qIGV4Y2VwdGlvbkhhbmRsZXI7Ci0gICAgYm9vbCB3aWxsQ2F0Y2hFeGNl
cHRpb24gPSB3aWxsQ2F0Y2hFeGNlcHRpb25Jbk1hY2hpbmVGcmFtZShtX3NwZWN1bGF0aXZlLT5t
X2N1cnJlbnROb2RlLT5vcmlnaW4uZm9yRXhpdCwgb3BDYXRjaE9yaWdpbiwgZXhjZXB0aW9uSGFu
ZGxlcik7IAorICAgIGJvb2wgd2lsbENhdGNoRXhjZXB0aW9uID0gbV9ncmFwaC53aWxsQ2F0Y2hF
eGNlcHRpb25Jbk1hY2hpbmVGcmFtZShtX3NwZWN1bGF0aXZlLT5tX2N1cnJlbnROb2RlLT5vcmln
aW4uZm9yRXhpdCwgb3BDYXRjaE9yaWdpbiwgZXhjZXB0aW9uSGFuZGxlcik7IAogICAgIGlmICh3
aWxsQ2F0Y2hFeGNlcHRpb24pIHsKICAgICAgICAgdW5zaWduZWQgc3RyZWFtSW5kZXggPSBtX3Nw
ZWN1bGF0aXZlLT5tX291dE9mTGluZVN0cmVhbUluZGV4ICE9IFVJTlRfTUFYID8gbV9zcGVjdWxh
dGl2ZS0+bV9vdXRPZkxpbmVTdHJlYW1JbmRleCA6IG1fc3BlY3VsYXRpdmUtPm1fc3RyZWFtLT5z
aXplKCk7CiAgICAgICAgIE1hY3JvQXNzZW1ibGVyOjpKdW1wIGhhZEV4Y2VwdGlvbiA9IGVtaXRO
b25QYXRjaGFibGVFeGNlcHRpb25DaGVjaygpOwpAQCAtNjIxLDcgKzU5OSw3IEBAIENhbGxTaXRl
SW5kZXggSklUQ29tcGlsZXI6OnJlY29yZENhbGxTaXQKIHsKICAgICBDb2RlT3JpZ2luIG9wQ2F0
Y2hPcmlnaW47CiAgICAgSGFuZGxlckluZm8qIGV4Y2VwdGlvbkhhbmRsZXI7Ci0gICAgYm9vbCB3
aWxsQ2F0Y2hFeGNlcHRpb24gPSB3aWxsQ2F0Y2hFeGNlcHRpb25Jbk1hY2hpbmVGcmFtZShjYWxs
U2l0ZUNvZGVPcmlnaW4sIG9wQ2F0Y2hPcmlnaW4sIGV4Y2VwdGlvbkhhbmRsZXIpOworICAgIGJv
b2wgd2lsbENhdGNoRXhjZXB0aW9uID0gbV9ncmFwaC53aWxsQ2F0Y2hFeGNlcHRpb25Jbk1hY2hp
bmVGcmFtZShjYWxsU2l0ZUNvZGVPcmlnaW4sIG9wQ2F0Y2hPcmlnaW4sIGV4Y2VwdGlvbkhhbmRs
ZXIpOwogICAgIENhbGxTaXRlSW5kZXggY2FsbFNpdGUgPSBhZGRDYWxsU2l0ZShjYWxsU2l0ZUNv
ZGVPcmlnaW4pOwogICAgIGlmICh3aWxsQ2F0Y2hFeGNlcHRpb24pCiAgICAgICAgIGFwcGVuZEV4
Y2VwdGlvbkhhbmRsaW5nT1NSRXhpdChldmVudFN0cmVhbUluZGV4LCBvcENhdGNoT3JpZ2luLCBl
eGNlcHRpb25IYW5kbGVyLCBjYWxsU2l0ZSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR0pJVENvbXBpbGVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdKSVRDb21waWxlci5oCShyZXZpc2lvbiAxOTA3NDUpCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR0pJVENvbXBpbGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTI3OSw3ICsy
NzksNiBAQCBwcml2YXRlOgogICAgIHZvaWQgbGlua09TUkV4aXRzKCk7CiAgICAgdm9pZCBkaXNh
c3NlbWJsZShMaW5rQnVmZmVyJik7CiAKLSAgICBib29sIHdpbGxDYXRjaEV4Y2VwdGlvbkluTWFj
aGluZUZyYW1lKENvZGVPcmlnaW4sIENvZGVPcmlnaW4mIG9wQ2F0Y2hPcmlnaW5PdXQsIEhhbmRs
ZXJJbmZvKiYgY2F0Y2hIYW5kbGVyT3V0KTsKICAgICB2b2lkIGFwcGVuZEV4Y2VwdGlvbkhhbmRs
aW5nT1NSRXhpdCh1bnNpZ25lZCBldmVudFN0cmVhbUluZGV4LCBDb2RlT3JpZ2luLCBIYW5kbGVy
SW5mbyogZXhjZXB0aW9uSGFuZGxlciwgQ2FsbFNpdGVJbmRleCwgTWFjcm9Bc3NlbWJsZXI6Okp1
bXBMaXN0IGp1bXBzVG9GYWlsID0gTWFjcm9Bc3NlbWJsZXI6Okp1bXBMaXN0KCkpOwogCiAgICAg
Ly8gVGhlIGRhdGFmbG93IGdyYXBoIGN1cnJlbnRseSBiZWluZyBnZW5lcmF0ZWQuCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR09TUkV4aXQuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHT1NSRXhpdC5jcHAJKHJldmlzaW9uIDE5MDc0NSkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHT1NSRXhpdC5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTQzLDkgKzQzLDYgQEAgT1NSRXhpdDo6T1NSRXhpdChFeGl0S2luZCBraW5kLCBKU1Zh
bHVlUwogICAgICwgbV9wYXRjaGFibGVDb2RlT2Zmc2V0KDApCiAgICAgLCBtX3JlY292ZXJ5SW5k
ZXgocmVjb3ZlcnlJbmRleCkKICAgICAsIG1fc3RyZWFtSW5kZXgoc3RyZWFtSW5kZXgpCi0gICAg
LCBtX2V4Y2VwdGlvbkhhbmRsZXJDYWxsU2l0ZUluZGV4KHN0ZDo6bnVtZXJpY19saW1pdHM8dW5z
aWduZWQ+OjptYXgoKSkKLSAgICAsIG1fd2lsbEFycml2ZUF0T1NSRXhpdEZyb21HZW5lcmljVW53
aW5kKGZhbHNlKQotICAgICwgbV9pc0V4Y2VwdGlvbkhhbmRsZXIoZmFsc2UpCiB7CiAgICAgYm9v
bCBjYW5FeGl0ID0gaml0LT5tX29yaWdpbi5leGl0T0s7CiAgICAgaWYgKCFjYW5FeGl0ICYmIGpp
dC0+bV9jdXJyZW50Tm9kZSkgewpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdP
U1JFeGl0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdPU1JF
eGl0LmgJKHJldmlzaW9uIDE5MDc0NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
T1NSRXhpdC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMDAsMTEgKzEwMCw3IEBAIHN0cnVjdCBPU1JF
eGl0IDogcHVibGljIE9TUkV4aXRCYXNlIHsKICAgICB2b2lkIGNvcnJlY3RKdW1wKExpbmtCdWZm
ZXImKTsKIAogICAgIHVuc2lnbmVkIG1fc3RyZWFtSW5kZXg7Ci0gICAgQ2FsbFNpdGVJbmRleCBt
X2V4Y2VwdGlvbkhhbmRsZXJDYWxsU2l0ZUluZGV4OwogCi0gICAgYm9vbCBtX3dpbGxBcnJpdmVB
dE9TUkV4aXRGcm9tR2VuZXJpY1Vud2luZCA6IDE7Ci0gICAgYm9vbCBtX2lzRXhjZXB0aW9uSGFu
ZGxlciA6IDE7Ci0gICAgCiAgICAgdm9pZCBjb25zaWRlckFkZGluZ0FzRnJlcXVlbnRFeGl0U2l0
ZShDb2RlQmxvY2sqIHByb2ZpbGVkQ29kZUJsb2NrKQogICAgIHsKICAgICAgICAgT1NSRXhpdEJh
c2U6OmNvbnNpZGVyQWRkaW5nQXNGcmVxdWVudEV4aXRTaXRlKHByb2ZpbGVkQ29kZUJsb2NrLCBF
eGl0RnJvbURGRyk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR09TUkV4aXRC
YXNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdPU1JFeGl0
QmFzZS5oCShyZXZpc2lvbiAxOTA3NDUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RG
R09TUkV4aXRCYXNlLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ1LDYgKzQ1LDkgQEAgc3RydWN0IE9T
UkV4aXRCYXNlIHsKICAgICAgICAgLCBtX2NvdW50KDApCiAgICAgICAgICwgbV9jb2RlT3JpZ2lu
KG9yaWdpbikKICAgICAgICAgLCBtX2NvZGVPcmlnaW5Gb3JFeGl0UHJvZmlsZShvcmlnaW5Gb3JQ
cm9maWxlKQorICAgICAgICAsIG1fZXhjZXB0aW9uSGFuZGxlckNhbGxTaXRlSW5kZXgoc3RkOjpu
dW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpKQorICAgICAgICAsIG1fd2lsbEFycml2ZUF0
T1NSRXhpdEZyb21HZW5lcmljVW53aW5kKGZhbHNlKQorICAgICAgICAsIG1faXNFeGNlcHRpb25I
YW5kbGVyKGZhbHNlKQogICAgIHsKICAgICAgICAgQVNTRVJUKG1fY29kZU9yaWdpbi5pc1NldCgp
KTsKICAgICAgICAgQVNTRVJUKG1fY29kZU9yaWdpbkZvckV4aXRQcm9maWxlLmlzU2V0KCkpOwpA
QCAtNTUsNiArNTgsMTAgQEAgc3RydWN0IE9TUkV4aXRCYXNlIHsKICAgICAKICAgICBDb2RlT3Jp
Z2luIG1fY29kZU9yaWdpbjsKICAgICBDb2RlT3JpZ2luIG1fY29kZU9yaWdpbkZvckV4aXRQcm9m
aWxlOworICAgIENhbGxTaXRlSW5kZXggbV9leGNlcHRpb25IYW5kbGVyQ2FsbFNpdGVJbmRleDsK
KworICAgIGJvb2wgbV93aWxsQXJyaXZlQXRPU1JFeGl0RnJvbUdlbmVyaWNVbndpbmQgOiAxOwor
ICAgIGJvb2wgbV9pc0V4Y2VwdGlvbkhhbmRsZXIgOiAxOwogCiBwcm90ZWN0ZWQ6CiAgICAgdm9p
ZCBjb25zaWRlckFkZGluZ0FzRnJlcXVlbnRFeGl0U2l0ZShDb2RlQmxvY2sqIHByb2ZpbGVkQ29k
ZUJsb2NrLCBFeGl0aW5nSklUVHlwZSBqaXRUeXBlKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2RmZy9ERkdUaWVyVXBDaGVja0luamVjdGlvblBoYXNlLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1RpZXJVcENoZWNrSW5qZWN0aW9uUGhhc2UuY3Bw
CShyZXZpc2lvbiAxOTA3NDUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1RpZXJV
cENoZWNrSW5qZWN0aW9uUGhhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01Myw4ICs1Myw4IEBA
IHB1YmxpYzoKICAgICAgICAgaWYgKG1fZ3JhcGgubV9wcm9maWxlZEJsb2NrLT5tX2RpZEZhaWxG
VExDb21waWxhdGlvbikKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgICAgICBpZiAo
bV9ncmFwaC5tX2hhc0V4Y2VwdGlvbkhhbmRsZXJzKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICAvL2lmIChtX2dyYXBoLm1faGFzRXhjZXB0aW9uSGFuZGxlcnMpCisgICAgICAg
IC8vICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgCiAjaWYgRU5BQkxFKEZUTF9KSVQpCiAgICAg
ICAgIEZUTDo6Q2FwYWJpbGl0eUxldmVsIGxldmVsID0gRlRMOjpjYW5Db21waWxlKG1fZ3JhcGgp
OwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdWYWxpZGF0ZS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdWYWxpZGF0ZS5jcHAJKHJldmlz
aW9uIDE5MDc0NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHVmFsaWRhdGUuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0xOTAsNyArMTkwLDcgQEAgcHVibGljOgogICAgICAgICAgICAg
ICAgIFZBTElEQVRFKChub2RlKSwgbm9kZS0+b3JpZ2luLmlzU2V0KCkpOwogICAgICAgICAgICAg
ICAgIFZBTElEQVRFKChub2RlKSwgbm9kZS0+b3JpZ2luLnNlbWFudGljLmlzU2V0KCkgPT0gbm9k
ZS0+b3JpZ2luLmZvckV4aXQuaXNTZXQoKSk7CiAgICAgICAgICAgICAgICAgVkFMSURBVEUoKG5v
ZGUpLCAhKCFub2RlLT5vcmlnaW4uZm9yRXhpdC5pc1NldCgpICYmIG5vZGUtPm9yaWdpbi5leGl0
T0spKTsKLSAgICAgICAgICAgICAgICBWQUxJREFURSgobm9kZSksICEobWF5RXhpdChtX2dyYXBo
LCBub2RlKSA9PSBFeGl0cyAmJiAhbm9kZS0+b3JpZ2luLmV4aXRPSykpOworICAgICAgICAgICAg
ICAgIC8vVkFMSURBVEUoKG5vZGUpLCAhKG1heUV4aXQobV9ncmFwaCwgbm9kZSkgPT0gRXhpdHMg
JiYgIW5vZGUtPm9yaWdpbi5leGl0T0spKTsKIAogICAgICAgICAgICAgICAgIGlmIChpKSB7CiAg
ICAgICAgICAgICAgICAgICAgIE5vZGUqIHByZXZpb3VzTm9kZSA9IGJsb2NrLT5hdChpIC0gMSk7
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTENvbXBpbGUuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMQ29tcGlsZS5jcHAJKHJldmlzaW9u
IDE5MDc0NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMQ29tcGlsZS5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTM5MCw2ICszOTAsOCBAQCBzdGF0aWMgdm9pZCBmaXhGdW5jdGlvbkJh
c2VkT25TdGFja01hcHMoCiAgICAgICAgIHN0YXRlLmZpbmFsaXplci0+aGFuZGxlRXhjZXB0aW9u
c0xpbmtCdWZmZXIgPSBXVEY6Om1vdmUobGlua0J1ZmZlcik7CiAgICAgfQogCisgICAgY29kZUJs
b2NrLT5jbGVhckV4Y2VwdGlvbkhhbmRsZXJzKCk7CisKICAgICBFeGl0VGh1bmtHZW5lcmF0b3Ig
ZXhpdFRodW5rR2VuZXJhdG9yKHN0YXRlKTsKICAgICBleGl0VGh1bmtHZW5lcmF0b3IuZW1pdFRo
dW5rcygpOwogICAgIGlmIChleGl0VGh1bmtHZW5lcmF0b3IuZGlkVGhpbmdzKCkpIHsKQEAgLTQy
NCw2ICs0MjYsMTkgQEAgc3RhdGljIHZvaWQgZml4RnVuY3Rpb25CYXNlZE9uU3RhY2tNYXBzKAog
ICAgICAgICAgICAgICAgIGV4aXQubV92YWx1ZXNbal0gPSBleGl0Lm1fdmFsdWVzW2pdLndpdGhM
b2NhbHNPZmZzZXQobG9jYWxzT2Zmc2V0KTsKICAgICAgICAgICAgIGZvciAoRXhpdFRpbWVPYmpl
Y3RNYXRlcmlhbGl6YXRpb24qIG1hdGVyaWFsaXphdGlvbiA6IGV4aXQubV9tYXRlcmlhbGl6YXRp
b25zKQogICAgICAgICAgICAgICAgIG1hdGVyaWFsaXphdGlvbi0+YWNjb3VudEZvckxvY2Fsc09m
ZnNldChsb2NhbHNPZmZzZXQpOworCisgICAgICAgICAgICBpZiAoZXhpdC5tX3dpbGxBcnJpdmVB
dE9TUkV4aXRGcm9tR2VuZXJpY1Vud2luZCkgeworICAgICAgICAgICAgICAgIC8vSGFuZGxlcklu
Zm8gbmV3SGFuZGxlciA9IHN0YXRlLmdlbmVyaWNVbndpbmRFeGNlcHRpb25IYW5kbGVycy5maW5k
KGkpLT52YWx1ZTsKKyAgICAgICAgICAgICAgICBIYW5kbGVySW5mbyBuZXdIYW5kbGVyID0gZXhp
dC5tX2hhbmRsZXJGb3JHZW5lcmljVW53aW5kOworICAgICAgICAgICAgICAgIG5ld0hhbmRsZXIu
c3RhcnQgPSBleGl0Lm1fZXhjZXB0aW9uSGFuZGxlckNhbGxTaXRlSW5kZXguYml0cygpOworICAg
ICAgICAgICAgICAgIG5ld0hhbmRsZXIuZW5kID0gZXhpdC5tX2V4Y2VwdGlvbkhhbmRsZXJDYWxs
U2l0ZUluZGV4LmJpdHMoKSArIDE7CisgICAgICAgICAgICAgICAgbmV3SGFuZGxlci5uYXRpdmVD
b2RlID0gaW5mby5tX3RodW5rQWRkcmVzczsKKyAgICAgICAgICAgICAgICAvL2RhdGFMb2coIk5l
dyBGVEwgZXhjZXB0aW9uIGhhbmRsZXIgZm9yIE9TUiBleGl0OiAiLCBuZXdIYW5kbGVyLm5hdGl2
ZUNvZGUsICJcbiIpOworICAgICAgICAgICAgICAgIGNvZGVCbG9jay0+YXBwZW5kRXhjZXB0aW9u
SGFuZGxlcihuZXdIYW5kbGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9kYXRh
TG9nKCJOZXcgRlRMIE9TUiBleGl0OiAiLCBpbmZvLm1fdGh1bmtBZGRyZXNzLAorICAgICAgICAg
ICAgLy8gICAgImlzIGV4Y2VwdGlvbiBoYW5kbGVyOiAiLCAhIWV4aXQubV9pc0V4Y2VwdGlvbkhh
bmRsZXIsICIsIGlzIGdlbmVyaWMgdW53aW5kOiIsICEhZXhpdC5tX3dpbGxBcnJpdmVBdE9TUkV4
aXRGcm9tR2VuZXJpY1Vud2luZCwgIlxuIik7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIGlm
ICh2ZXJib3NlQ29tcGlsYXRpb25FbmFibGVkKCkpIHsKICAgICAgICAgICAgICAgICBEdW1wQ29u
dGV4dCBjb250ZXh0OwpAQCAtNjY2LDggKzY4MSwxMCBAQCBzdGF0aWMgdm9pZCBmaXhGdW5jdGlv
bkJhc2VkT25TdGFja01hcHMoCiAgICAgZm9yICh1bnNpZ25lZCBleGl0SW5kZXggPSAwOyBleGl0
SW5kZXggPCBqaXRDb2RlLT5vc3JFeGl0LnNpemUoKTsgKytleGl0SW5kZXgpIHsKICAgICAgICAg
T1NSRXhpdENvbXBpbGF0aW9uSW5mbyYgaW5mbyA9IHN0YXRlLmZpbmFsaXplci0+b3NyRXhpdFtl
eGl0SW5kZXhdOwogICAgICAgICBPU1JFeGl0JiBleGl0ID0gaml0Q29kZS0+b3NyRXhpdFtleGl0
SW5kZXhdOworICAgICAgICBpZiAoZXhpdC5tX3dpbGxBcnJpdmVBdE9TUkV4aXRGcm9tR2VuZXJp
Y1Vud2luZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCiAgICAgICAgIGl0ZXIgPSByZWNvcmRN
YXAuZmluZChleGl0Lm1fc3RhY2ttYXBJRCk7Ci0gICAgICAgIAogICAgICAgICBWZWN0b3I8Y29u
c3Qgdm9pZCo+IGNvZGVBZGRyZXNzZXM7CiAgICAgICAgIAogICAgICAgICBpZiAoaXRlciAhPSBy
ZWNvcmRNYXAuZW5kKCkpIHsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMRXhp
dFRodW5rR2VuZXJhdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZnRsL0ZUTEV4aXRUaHVua0dlbmVyYXRvci5jcHAJKHJldmlzaW9uIDE5MDc0NSkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMRXhpdFRodW5rR2VuZXJhdG9yLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNDksOCArNDksMTYgQEAgRXhpdFRodW5rR2VuZXJhdG9yOjp+RXhpdFRodW5rR2Vu
ZXJhdG9yKAogdm9pZCBFeGl0VGh1bmtHZW5lcmF0b3I6OmVtaXRUaHVuayh1bnNpZ25lZCBpbmRl
eCkKIHsKICAgICBPU1JFeGl0Q29tcGlsYXRpb25JbmZvJiBpbmZvID0gbV9zdGF0ZS5maW5hbGl6
ZXItPm9zckV4aXRbaW5kZXhdOworICAgIE9TUkV4aXQmIGV4aXQgPSBtX3N0YXRlLmppdENvZGUt
Pm9zckV4aXRbaW5kZXhdOwogICAgIAogICAgIGluZm8ubV90aHVua0xhYmVsID0gbGFiZWwoKTsK
KworICAgIGlmIChleGl0Lm1fd2lsbEFycml2ZUF0T1NSRXhpdEZyb21HZW5lcmljVW53aW5kKSB7
CisgICAgICAgIHJlc3RvcmVDYWxsZWVTYXZlc0Zyb21WTUNhbGxlZVNhdmVzQnVmZmVyKCk7Cisg
ICAgICAgIGxvYWRQdHIodm0oKS0+YWRkcmVzc09mQ2FsbEZyYW1lRm9yQ2F0Y2goKSwgZnJhbWVQ
b2ludGVyUmVnaXN0ZXIpOworICAgICAgICBhZGRQdHIoVHJ1c3RlZEltbTMyKC0gc3RhdGljX2Nh
c3Q8aW50NjRfdD4obV9zdGF0ZS5qaXRDb2RlLT5zdGFja21hcHMuc3RhY2tTaXplRm9yTG9jYWxz
KCkpKSwgCisgICAgICAgICAgICBmcmFtZVBvaW50ZXJSZWdpc3Rlciwgc3RhY2tQb2ludGVyUmVn
aXN0ZXIpOworICAgIH0KICAgICBwdXNoVG9TYXZlSW1tZWRpYXRlV2l0aG91dFRvdWNoaW5nUmVn
aXN0ZXJzKFRydXN0ZWRJbW0zMihpbmRleCkpOwogICAgIGluZm8ubV90aHVua0p1bXAgPSBwYXRj
aGFibGVKdW1wKCk7CiAgICAgCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTEpJ
VENvZGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMSklU
Q29kZS5jcHAJKHJldmlzaW9uIDE5MDc0NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwv
RlRMSklUQ29kZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE0NCwxMCArMTQ0LDE5IEBAIHZvaWQg
SklUQ29kZTo6dmFsaWRhdGVSZWZlcmVuY2VzKGNvbnN0IFQKICAgICAgICAgZXhpdC52YWxpZGF0
ZVJlZmVyZW5jZXModHJhY2tlZFJlZmVyZW5jZXMpOwogfQogCisvL3N0YXRpYyBSZWdpc3RlclNl
dCB1c2VkUmVnaXN0ZXJzRm9yKGNvbnN0IFN0YWNrTWFwczo6UmVjb3JkJiByZWNvcmQpCisvL3sK
Ky8vICAgIGlmIChPcHRpb25zOjphc3N1bWVBbGxSZWdzSW5GVExJQ0FyZUxpdmUoKSkKKy8vICAg
ICAgICByZXR1cm4gUmVnaXN0ZXJTZXQ6OmFsbFJlZ2lzdGVycygpOworLy8gICAgcmV0dXJuIFJl
Z2lzdGVyU2V0KHJlY29yZC51c2VkUmVnaXN0ZXJTZXQoKSwgUmVnaXN0ZXJTZXQ6OmNhbGxlZVNh
dmVSZWdpc3RlcnMoKSk7CisvL30KKwogUmVnaXN0ZXJTZXQgSklUQ29kZTo6bGl2ZVJlZ2lzdGVy
c1RvUHJlc2VydmVBdEV4Y2VwdGlvbkhhbmRsaW5nQ2FsbFNpdGUoQ29kZUJsb2NrKiwgQ2FsbFNp
dGVJbmRleCkKIHsKLSAgICAvLyBGSVhNRTogaW1wbGVtZW50IHRoaXMgd2hlbiBGVEwgaW1wbGVt
ZW50cyB0cnkvY2F0Y2guCi0gICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTE0OTQwOQorICAgIC8vU3RhY2tNYXBzOjpSZWNvcmRNYXAgcmVjb3JkTWFwID0gc3Rh
Y2ttYXBzLmNvbXB1dGVSZWNvcmRNYXAoKTsKKyAgICAvL2ZvciAoT1NSRXhpdCYgZXhpdCA6IG9z
ckV4aXQpIHsKKyAgICAvLyAKKyAgICAvL30KICAgICByZXR1cm4gUmVnaXN0ZXJTZXQoKTsKIH0K
IApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExMb3dlckRGR1RvTExWTS5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExMb3dlckRGR1RvTExW
TS5jcHAJKHJldmlzaW9uIDE5MDc0NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRM
TG93ZXJERkdUb0xMVk0uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMSw2ICszMSw3IEBACiAjaW5j
bHVkZSAiQ29kZUJsb2NrV2l0aEpJVFR5cGUuaCIKICNpbmNsdWRlICJERkdBYnN0cmFjdEludGVy
cHJldGVySW5saW5lcy5oIgogI2luY2x1ZGUgIkRGR0luUGxhY2VBYnN0cmFjdFN0YXRlLmgiCisj
aW5jbHVkZSAiREZHTWF5RXhpdC5oIgogI2luY2x1ZGUgIkRGR09TUkF2YWlsYWJpbGl0eUFuYWx5
c2lzUGhhc2UuaCIKICNpbmNsdWRlICJERkdPU1JFeGl0RnV6ei5oIgogI2luY2x1ZGUgIkRpcmVj
dEFyZ3VtZW50cy5oIgpAQCAtMjI2NiwxNCArMjI2NywyMiBAQCBwcml2YXRlOgogICAgICAgICBp
ZiAodmVyYm9zZUNvbXBpbGF0aW9uRW5hYmxlZCgpKQogICAgICAgICAgICAgZGF0YUxvZygiICAg
IEVtaXR0aW5nIFB1dEJ5SWQgcGF0Y2hwb2ludCB3aXRoIHN0YWNrbWFwICMiLCBzdGFja21hcElE
LCAiXG4iKTsKICAgICAgICAgCi0gICAgICAgIExWYWx1ZSBjYWxsID0gbV9vdXQuY2FsbCgKLSAg
ICAgICAgICAgIG1fb3V0LnBhdGNocG9pbnRWb2lkSW50cmluc2ljKCksCi0gICAgICAgICAgICBt
X291dC5jb25zdEludDY0KHN0YWNrbWFwSUQpLCBtX291dC5jb25zdEludDMyKHNpemVPZlB1dEJ5
SWQoKSksCi0gICAgICAgICAgICBjb25zdE51bGwobV9vdXQucmVmOCksIG1fb3V0LmNvbnN0SW50
MzIoMiksIGJhc2UsIHZhbHVlKTsKKyAgICAgICAgRXhpdEFyZ3VtZW50TGlzdCBhcmd1bWVudHM7
IC8vIEZJWE1FOiBkbyB0aGlzLgorICAgICAgICBhcmd1bWVudHMuYXBwZW5kKG1fb3V0LmNvbnN0
SW50NjQoc3RhY2ttYXBJRCkpOworICAgICAgICBhcmd1bWVudHMuYXBwZW5kKG1fb3V0LmNvbnN0
SW50MzIoc2l6ZU9mUHV0QnlJZCgpKSk7CisgICAgICAgIGFyZ3VtZW50cy5hcHBlbmQoY29uc3RO
dWxsKG1fb3V0LnJlZjgpKTsgCisgICAgICAgIGFyZ3VtZW50cy5hcHBlbmQobV9vdXQuY29uc3RJ
bnQzMigyKSk7IAorICAgICAgICBhcmd1bWVudHMuYXBwZW5kKGJhc2UpOyAKKyAgICAgICAgYXJn
dW1lbnRzLmFwcGVuZCh2YWx1ZSk7CisKKyAgICAgICAgQ2FsbFNpdGVJbmRleCBjYWxsU2l0ZSA9
IG1fZnRsU3RhdGUuaml0Q29kZS0+Y29tbW9uLmFkZENvZGVPcmlnaW4obV9ub2RlLT5vcmlnaW4u
c2VtYW50aWMpOworICAgICAgICBlbWl0T1NSRXhpdElmV2lsbENhdGNoRXhjZXB0aW9uKG1fb3V0
LmJvb2xlYW5GYWxzZSwgdHJ1ZSwgJmFyZ3VtZW50cyk7IC8vIEl0IGRvZXNuJ3QgbWF0dGVyIHdo
YXQgdGhlIGNvbmRpdGlvbiB3ZSBwYXNzIGl0IGlzLgorCisgICAgICAgIExWYWx1ZSBjYWxsID0g
bV9vdXQuY2FsbChtX291dC5wYXRjaHBvaW50Vm9pZEludHJpbnNpYygpLCBhcmd1bWVudHMpOwog
ICAgICAgICBzZXRJbnN0cnVjdGlvbkNhbGxpbmdDb252ZW50aW9uKGNhbGwsIExMVk1BbnlSZWdD
YWxsQ29udik7CiAgICAgICAgIAogICAgICAgICBtX2Z0bFN0YXRlLnB1dEJ5SWRzLmFwcGVuZChQ
dXRCeUlkRGVzY3JpcHRvcigKLSAgICAgICAgICAgIHN0YWNrbWFwSUQsIG1fZnRsU3RhdGUuaml0
Q29kZS0+Y29tbW9uLmFkZENvZGVPcmlnaW4obV9ub2RlLT5vcmlnaW4uc2VtYW50aWMpLCB1aWQs
CisgICAgICAgICAgICBzdGFja21hcElELCBjYWxsU2l0ZSwgdWlkLAogICAgICAgICAgICAgbV9n
cmFwaC5leGVjdXRhYmxlRm9yKG1fbm9kZS0+b3JpZ2luLnNlbWFudGljKS0+ZWNtYU1vZGUoKSwK
ICAgICAgICAgICAgIG1fbm9kZS0+b3AoKSA9PSBQdXRCeUlkRGlyZWN0ID8gRGlyZWN0IDogTm90
RGlyZWN0KSk7CiAgICAgfQpAQCAtNDM5OCw4ICs0NDA3LDkgQEAgcHJpdmF0ZToKICAgICAgICAg
dW5zaWduZWQgZnJhbWVTaXplID0gSlNTdGFjazo6Q2FsbEZyYW1lSGVhZGVyU2l6ZSArIG51bUFy
Z3M7CiAgICAgICAgIHVuc2lnbmVkIGFsaWduZWRGcmFtZVNpemUgPSBXVEY6OnJvdW5kVXBUb011
bHRpcGxlT2Yoc3RhY2tBbGlnbm1lbnRSZWdpc3RlcnMoKSwgZnJhbWVTaXplKTsKICAgICAgICAg
dW5zaWduZWQgcGFkZGluZyA9IGFsaWduZWRGcmFtZVNpemUgLSBmcmFtZVNpemU7Ci0KLSAgICAg
ICAgVmVjdG9yPExWYWx1ZT4gYXJndW1lbnRzOworICAgICAgICAvLyBEb2N1bWVudGF0aW9uIGFi
b3V0IHN0YWNrbWFwIGFuZCBwYXRjaHBvaW50IGludHJpbnNpY3M6CisgICAgICAgIC8vIGh0dHA6
Ly9sbHZtLm9yZy9kb2NzL1N0YWNrTWFwcy5odG1sCisgICAgICAgIEV4aXRBcmd1bWVudExpc3Qg
YXJndW1lbnRzOwogICAgICAgICBhcmd1bWVudHMuYXBwZW5kKG1fb3V0LmNvbnN0SW50NjQoc3Rh
Y2ttYXBJRCkpOwogICAgICAgICBhcmd1bWVudHMuYXBwZW5kKG1fb3V0LmNvbnN0SW50MzIoc2l6
ZU9mQ2FsbCgpKSk7CiAgICAgICAgIGFyZ3VtZW50cy5hcHBlbmQoY29uc3ROdWxsKG1fb3V0LnJl
ZjgpKTsKQEAgLTQ0MTMsNyArNDQyMywxMyBAQCBwcml2YXRlOgogICAgICAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgcGFkZGluZzsgKytpKQogICAgICAgICAgICAgYXJndW1lbnRzLmFwcGVu
ZChnZXRVbmRlZihtX291dC5pbnQ2NCkpOwogICAgICAgICAKLSAgICAgICAgY2FsbFByZWZsaWdo
dCgpOworICAgICAgICBDYWxsU2l0ZUluZGV4IGNhbGxTaXRlSW5kZXgoMCk7CisgICAgICAgIGNh
bGxQcmVmbGlnaHQoY2FsbFNpdGVJbmRleCk7CisKKyAgICAgICAgLy8gRklYTUU6IHRoaXMgaXMg
Y29uZnVzaW5nLCBidXQgd2UgbmVlZCB0byBkbyBwcmVmbGlnaHQgYmVmb3JlIGdldHRpbmcgT1NS
CisgICAgICAgIC8vIGV4aXQgYmVjYXVzZSB3ZSBuZWVkIGxhc3QgY2FsbCBzaXRlLiBMZXRzIHNp
bXBsaWZ5IHRoaXMgYW5kIG1ha2UgaXQgZXhwbGljaXQKKyAgICAgICAgLy8gb2Ygb3JkZXJpbmcg
ZGVwZW5kZW5jeSBieSBoYXZpbmcgQ2FsbFNpdGVJbmRleCBhcyBhIHBhcmFtZXRlci4KKyAgICAg
ICAgZW1pdE9TUkV4aXRJZldpbGxDYXRjaEV4Y2VwdGlvbihtX291dC5ib29sZWFuRmFsc2UsIHRy
dWUsICZhcmd1bWVudHMpOyAvLyBJdCBkb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBjb25kaXRpb24g
d2UgcGFzcyBpdCBpcy4KICAgICAgICAgCiAgICAgICAgIExWYWx1ZSBjYWxsID0gbV9vdXQuY2Fs
bChtX291dC5wYXRjaHBvaW50SW50NjRJbnRyaW5zaWMoKSwgYXJndW1lbnRzKTsKICAgICAgICAg
c2V0SW5zdHJ1Y3Rpb25DYWxsaW5nQ29udmVudGlvbihjYWxsLCBMTFZNV2ViS2l0SlNDYWxsQ29u
dik7CkBAIC00NDUwLDYgKzQ0NjYsMTAgQEAgcHJpdmF0ZToKICAgICAgICAgZXhpdEFyZ3VtZW50
cy5pbnNlcnQoMCwgbV9vdXQuY29uc3RJbnQzMih0YWlsQ2FsbC5lc3RpbWF0ZWRTaXplKCkpKTsK
ICAgICAgICAgZXhpdEFyZ3VtZW50cy5pbnNlcnQoMCwgbV9vdXQuY29uc3RJbnQ2NChzdGFja21h
cElEKSk7CiAKKyAgICAgICAgLy8gRklYTUU6IHdlIHNob3VsZCBwcm9iYWJseSBuZXZlciBoYXZl
IGEgdGFpbCBjYWxsIGluc2lkZSB0cnkvY2F0Y2guCisgICAgICAgIC8vIFZlcmlmeSB0aGlzIGlz
IHRydWUuIExldHMgYWxzbyBhc3NlcnQgYXMgbXVjaC4KKyAgICAgICAgLy9lbWl0T1NSRXhpdElm
V2lsbENhdGNoRXhjZXB0aW9uKG1fb3V0LmJvb2xlYW5GYWxzZSwgdHJ1ZSwgJmFyZ3VtZW50cyk7
IC8vIEl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGNvbmRpdGlvbiB3ZSBwYXNzIGl0IGlzLgor
CiAgICAgICAgIExWYWx1ZSBjYWxsID0KICAgICAgICAgICAgIG1fb3V0LmNhbGwobV9vdXQucGF0
Y2hwb2ludFZvaWRJbnRyaW5zaWMoKSwgZXhpdEFyZ3VtZW50cyk7CiAgICAgICAgIHNldEluc3Ry
dWN0aW9uQ2FsbGluZ0NvbnZlbnRpb24oY2FsbCwgTExWTUFueVJlZ0NhbGxDb252KTsKQEAgLTQ0
ODQsNyArNDUwNCw3IEBAIHByaXZhdGU6CiAgICAgICAgIAogICAgICAgICB1bnNpZ25lZCBzdGFj
a21hcElEID0gbV9zdGFja21hcElEcysrOwogICAgICAgICAKLSAgICAgICAgVmVjdG9yPExWYWx1
ZT4gYXJndW1lbnRzOworICAgICAgICBFeGl0QXJndW1lbnRMaXN0IGFyZ3VtZW50czsKICAgICAg
ICAgYXJndW1lbnRzLmFwcGVuZChtX291dC5jb25zdEludDY0KHN0YWNrbWFwSUQpKTsKICAgICAg
ICAgYXJndW1lbnRzLmFwcGVuZChtX291dC5jb25zdEludDMyKHNpemVPZklDRm9yKG1fbm9kZSkp
KTsKICAgICAgICAgYXJndW1lbnRzLmFwcGVuZChjb25zdE51bGwobV9vdXQucmVmOCkpOwpAQCAt
NDQ5NSw3ICs0NTE1LDEwIEBAIHByaXZhdGU6CiAgICAgICAgIEFTU0VSVCh0aGlzQXJnKTsKICAg
ICAgICAgYXJndW1lbnRzLmFwcGVuZCh0aGlzQXJnKTsKICAgICAgICAgCi0gICAgICAgIGNhbGxQ
cmVmbGlnaHQoKTsKKyAgICAgICAgQ2FsbFNpdGVJbmRleCBjYWxsU2l0ZUluZGV4KDApOworICAg
ICAgICBjYWxsUHJlZmxpZ2h0KGNhbGxTaXRlSW5kZXgpOworCisgICAgICAgIGVtaXRPU1JFeGl0
SWZXaWxsQ2F0Y2hFeGNlcHRpb24obV9vdXQuYm9vbGVhbkZhbHNlLCB0cnVlLCAmYXJndW1lbnRz
KTsgLy8gSXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgY29uZGl0aW9uIHdlIHBhc3MgaXQgaXMu
CiAgICAgICAgIAogICAgICAgICBMVmFsdWUgY2FsbCA9IG1fb3V0LmNhbGwobV9vdXQucGF0Y2hw
b2ludEludDY0SW50cmluc2ljKCksIGFyZ3VtZW50cyk7CiAgICAgICAgIHNldEluc3RydWN0aW9u
Q2FsbGluZ0NvbnZlbnRpb24oY2FsbCwgTExWTUNDYWxsQ29udik7CkBAIC02MDQyLDEzICs2MDY1
LDIwIEBAIHByaXZhdGU6CiAgICAgICAgIGlmIChPcHRpb25zOjp2ZXJib3NlQ29tcGlsYXRpb24o
KSkKICAgICAgICAgICAgIGRhdGFMb2coIiAgICBFbWl0dGluZyBHZXRCeUlkIHBhdGNocG9pbnQg
d2l0aCBzdGFja21hcCAjIiwgc3RhY2ttYXBJRCwgIlxuIik7CiAgICAgICAgIAotICAgICAgICBM
VmFsdWUgY2FsbCA9IG1fb3V0LmNhbGwoCi0gICAgICAgICAgICBtX291dC5wYXRjaHBvaW50SW50
NjRJbnRyaW5zaWMoKSwKLSAgICAgICAgICAgIG1fb3V0LmNvbnN0SW50NjQoc3RhY2ttYXBJRCks
IG1fb3V0LmNvbnN0SW50MzIoc2l6ZU9mR2V0QnlJZCgpKSwKLSAgICAgICAgICAgIGNvbnN0TnVs
bChtX291dC5yZWY4KSwgbV9vdXQuY29uc3RJbnQzMigxKSwgYmFzZSk7CisgICAgICAgIEV4aXRB
cmd1bWVudExpc3QgYXJndW1lbnRzOyAvLyBGSVhNRTogZG8gdGhpcy4KKyAgICAgICAgYXJndW1l
bnRzLmFwcGVuZChtX291dC5jb25zdEludDY0KHN0YWNrbWFwSUQpKTsgCisgICAgICAgIGFyZ3Vt
ZW50cy5hcHBlbmQobV9vdXQuY29uc3RJbnQzMihzaXplT2ZHZXRCeUlkKCkpKTsKKyAgICAgICAg
YXJndW1lbnRzLmFwcGVuZChjb25zdE51bGwobV9vdXQucmVmOCkpOworICAgICAgICBhcmd1bWVu
dHMuYXBwZW5kKG1fb3V0LmNvbnN0SW50MzIoMSkpOyAKKyAgICAgICAgYXJndW1lbnRzLmFwcGVu
ZChiYXNlKTsKKworICAgICAgICBDYWxsU2l0ZUluZGV4IGNhbGxTaXRlID0gbV9mdGxTdGF0ZS5q
aXRDb2RlLT5jb21tb24uYWRkQ29kZU9yaWdpbihtX25vZGUtPm9yaWdpbi5zZW1hbnRpYyk7Cisg
ICAgICAgIGVtaXRPU1JFeGl0SWZXaWxsQ2F0Y2hFeGNlcHRpb24obV9vdXQuYm9vbGVhbkZhbHNl
LCB0cnVlLCAmYXJndW1lbnRzKTsgLy8gSXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgY29uZGl0
aW9uIHdlIHBhc3MgaXQgaXMuCisKKyAgICAgICAgTFZhbHVlIGNhbGwgPSBtX291dC5jYWxsKG1f
b3V0LnBhdGNocG9pbnRJbnQ2NEludHJpbnNpYygpLCBhcmd1bWVudHMpOwogICAgICAgICBzZXRJ
bnN0cnVjdGlvbkNhbGxpbmdDb252ZW50aW9uKGNhbGwsIExMVk1BbnlSZWdDYWxsQ29udik7CiAg
ICAgICAgIAotICAgICAgICBtX2Z0bFN0YXRlLmdldEJ5SWRzLmFwcGVuZChHZXRCeUlkRGVzY3Jp
cHRvcihzdGFja21hcElELCBtX2Z0bFN0YXRlLmppdENvZGUtPmNvbW1vbi5hZGRDb2RlT3JpZ2lu
KG1fbm9kZS0+b3JpZ2luLnNlbWFudGljKSwgdWlkKSk7CisgICAgICAgIG1fZnRsU3RhdGUuZ2V0
QnlJZHMuYXBwZW5kKEdldEJ5SWREZXNjcmlwdG9yKHN0YWNrbWFwSUQsIGNhbGxTaXRlLCB1aWQp
KTsKICAgICAgICAgCiAgICAgICAgIHJldHVybiBjYWxsOwogICAgIH0KQEAgLTgzMDIsNyArODMz
Miw4IEBAIHByaXZhdGU6CiAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJncz4KICAgICBMVmFs
dWUgdm1DYWxsKExWYWx1ZSBmdW5jdGlvbiwgQXJncy4uLiBhcmdzKQogICAgIHsKLSAgICAgICAg
Y2FsbFByZWZsaWdodCgpOworICAgICAgICBDYWxsU2l0ZUluZGV4IHJlc3VsdElnbm9yZWQoMCk7
CisgICAgICAgIGNhbGxQcmVmbGlnaHQocmVzdWx0SWdub3JlZCk7CiAgICAgICAgIExWYWx1ZSBy
ZXN1bHQgPSBtX291dC5jYWxsKGZ1bmN0aW9uLCBhcmdzLi4uKTsKICAgICAgICAgY2FsbENoZWNr
KCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC04MzExLDI4ICs4MzQyLDMwIEBAIHByaXZh
dGU6CiAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJncz4KICAgICBMVmFsdWUgdm1DYWxsTm9F
eGNlcHRpb25zKExWYWx1ZSBmdW5jdGlvbiwgQXJncy4uLiBhcmdzKQogICAgIHsKLSAgICAgICAg
Y2FsbFByZWZsaWdodCgpOworICAgICAgICBDYWxsU2l0ZUluZGV4IHJlc3VsdElnbm9yZWQoMCk7
CisgICAgICAgIGNhbGxQcmVmbGlnaHQocmVzdWx0SWdub3JlZCk7CiAgICAgICAgIExWYWx1ZSBy
ZXN1bHQgPSBtX291dC5jYWxsKGZ1bmN0aW9uLCBhcmdzLi4uKTsKICAgICAgICAgcmV0dXJuIHJl
c3VsdDsKICAgICB9CiAKLSAgICB2b2lkIGNhbGxQcmVmbGlnaHQoQ29kZU9yaWdpbiBjb2RlT3Jp
Z2luKQorICAgIHZvaWQgY2FsbFByZWZsaWdodChDb2RlT3JpZ2luIGNvZGVPcmlnaW4sIENhbGxT
aXRlSW5kZXgmIGNhbGxTaXRlSW5kZXhPdXQpCiAgICAgeworICAgICAgICBDYWxsU2l0ZUluZGV4
IGNhbGxTaXRlSW5kZXggPSBtX2Z0bFN0YXRlLmppdENvZGUtPmNvbW1vbi5hZGRDb2RlT3JpZ2lu
KGNvZGVPcmlnaW4pOwogICAgICAgICBtX291dC5zdG9yZTMyKAotICAgICAgICAgICAgbV9vdXQu
Y29uc3RJbnQzMigKLSAgICAgICAgICAgICAgICBtX2Z0bFN0YXRlLmppdENvZGUtPmNvbW1vbi5h
ZGRDb2RlT3JpZ2luKGNvZGVPcmlnaW4pLmJpdHMoKSksCisgICAgICAgICAgICBtX291dC5jb25z
dEludDMyKGNhbGxTaXRlSW5kZXguYml0cygpKSwKICAgICAgICAgICAgIHRhZ0ZvcihKU1N0YWNr
OjpBcmd1bWVudENvdW50KSk7CisgICAgICAgIGNhbGxTaXRlSW5kZXhPdXQgPSBjYWxsU2l0ZUlu
ZGV4OwogICAgIH0KLSAgICB2b2lkIGNhbGxQcmVmbGlnaHQoKQorICAgIHZvaWQgY2FsbFByZWZs
aWdodChDYWxsU2l0ZUluZGV4JiBjYWxsU2l0ZUluZGV4T3V0KQogICAgIHsKICAgICAgICAgQ29k
ZU9yaWdpbiBjb2RlT3JpZ2luID0gbV9ub2RlLT5vcmlnaW4uc2VtYW50aWM7CiAKICAgICAgICAg
aWYgKG1fbm9kZS0+b3AoKSA9PSBUYWlsQ2FsbElubGluZWRDYWxsZXIKICAgICAgICAgICAgIHx8
IG1fbm9kZS0+b3AoKSA9PSBUYWlsQ2FsbFZhcmFyZ3NJbmxpbmVkQ2FsbGVyCiAgICAgICAgICAg
ICB8fCBtX25vZGUtPm9wKCkgPT0gVGFpbENhbGxGb3J3YXJkVmFyYXJnc0lubGluZWRDYWxsZXIp
Ci0gICAgICAgICAgICBjb2RlT3JpZ2luID0qY29kZU9yaWdpbi5pbmxpbmVDYWxsRnJhbWUtPmdl
dENhbGxlclNraXBwaW5nRGVhZEZyYW1lcygpOworICAgICAgICAgICAgY29kZU9yaWdpbiA9ICpj
b2RlT3JpZ2luLmlubGluZUNhbGxGcmFtZS0+Z2V0Q2FsbGVyU2tpcHBpbmdEZWFkRnJhbWVzKCk7
CiAKLSAgICAgICAgY2FsbFByZWZsaWdodChjb2RlT3JpZ2luKTsKKyAgICAgICAgY2FsbFByZWZs
aWdodChjb2RlT3JpZ2luLCBjYWxsU2l0ZUluZGV4T3V0KTsKICAgICB9CiAgICAgCiAgICAgdm9p
ZCBjYWxsQ2hlY2soKQpAQCAtODM0MCwxNSArODM3MywzNSBAQCBwcml2YXRlOgogICAgICAgICBp
ZiAoT3B0aW9uczo6ZW5hYmxlRXhjZXB0aW9uRnV6eigpKQogICAgICAgICAgICAgbV9vdXQuY2Fs
bChtX291dC5vcGVyYXRpb24ob3BlcmF0aW9uRXhjZXB0aW9uRnV6eiksIG1fY2FsbEZyYW1lKTsK
ICAgICAgICAgCi0gICAgICAgIExCYXNpY0Jsb2NrIGNvbnRpbnVhdGlvbiA9IEZUTF9ORVdfQkxP
Q0sobV9vdXQsICgiRXhjZXB0aW9uIGNoZWNrIGNvbnRpbnVhdGlvbiIpKTsKLSAgICAgICAgCiAg
ICAgICAgIExWYWx1ZSBleGNlcHRpb24gPSBtX291dC5sb2FkNjQobV9vdXQuYWJzb2x1dGUodm0o
KS5hZGRyZXNzT2ZFeGNlcHRpb24oKSkpOwotICAgICAgICAKKyAgICAgICAgTFZhbHVlIGhhZEV4
Y2VwdGlvbiA9IG1fb3V0Lm5vdFplcm82NChleGNlcHRpb24pOworCisgICAgICAgIGJvb2wgZW1p
dHRlZEV4Y2VwdGlvbkhhbmRsaW5nQ29kZUZvck9TUkV4aXQgPSBlbWl0T1NSRXhpdElmV2lsbENh
dGNoRXhjZXB0aW9uKGhhZEV4Y2VwdGlvbiwgZmFsc2UsIG51bGxwdHIpOworICAgICAgICBpZiAo
ZW1pdHRlZEV4Y2VwdGlvbkhhbmRsaW5nQ29kZUZvck9TUkV4aXQpIC8vIEl0IGFscmVhZHkgdG9v
ayBjYXJlIG9mIGV4Y2VwdGlvbiBoYW5kbGluZyBsb2dpYy4KKyAgICAgICAgICAgIHJldHVybjsK
KworICAgICAgICBMQmFzaWNCbG9jayBjb250aW51YXRpb24gPSBGVExfTkVXX0JMT0NLKG1fb3V0
LCAoIkV4Y2VwdGlvbiBjaGVjayBjb250aW51YXRpb24iKSk7CisKICAgICAgICAgbV9vdXQuYnJh
bmNoKAotICAgICAgICAgICAgbV9vdXQubm90WmVybzY0KGV4Y2VwdGlvbiksIHJhcmVseShtX2hh
bmRsZUV4Y2VwdGlvbnMpLCB1c3VhbGx5KGNvbnRpbnVhdGlvbikpOwotICAgICAgICAKKyAgICAg
ICAgICAgIGhhZEV4Y2VwdGlvbiwgcmFyZWx5KG1faGFuZGxlRXhjZXB0aW9ucyksIHVzdWFsbHko
Y29udGludWF0aW9uKSk7CisKICAgICAgICAgbV9vdXQuYXBwZW5kVG8oY29udGludWF0aW9uKTsK
ICAgICB9CisKKyAgICBib29sIGVtaXRPU1JFeGl0SWZXaWxsQ2F0Y2hFeGNlcHRpb24oTFZhbHVl
IGhhZEV4Y2VwdGlvbiwgYm9vbCB3aWxsQXJyaXZlQXRFeGNlcHRpb25IYW5kbGVyRnJvbUdlbmVy
aWNVbndpbmQsIEV4aXRBcmd1bWVudExpc3QqIGV4aXRBcmd1bWVudHMpCisgICAgeworICAgICAg
ICBDb2RlT3JpZ2luIG9wQ2F0Y2hPcmlnaW47CisgICAgICAgIEhhbmRsZXJJbmZvKiBleGNlcHRp
b25IYW5kbGVyOworICAgICAgICBib29sIHdpbGxDYXRjaEV4Y2VwdGlvbiA9IG1fZ3JhcGgud2ls
bENhdGNoRXhjZXB0aW9uSW5NYWNoaW5lRnJhbWUobV9vcmlnaW4uZm9yRXhpdCwgb3BDYXRjaE9y
aWdpbiwgZXhjZXB0aW9uSGFuZGxlcik7IAorICAgICAgICBpZiAoIXdpbGxDYXRjaEV4Y2VwdGlv
bikKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBDb2RlT3JpZ2luIG9sZEV4
aXQgPSBtX29yaWdpbi5mb3JFeGl0OworICAgICAgICBtX29yaWdpbi5mb3JFeGl0ID0gb3BDYXRj
aE9yaWdpbjsgLy8gRklYTUU6IHRoaXMgaXMgdWdseSwgbGV0cyBqdXN0IG1ha2UgaXQgYSBwYXJh
bWV0ZXIuCisgICAgICAgIGFwcGVuZE9TUkV4aXQoVW5jb3VudGFibGUsIG5vVmFsdWUoKSwgbnVs
bHB0ciwgaGFkRXhjZXB0aW9uLCB0cnVlLCB3aWxsQXJyaXZlQXRFeGNlcHRpb25IYW5kbGVyRnJv
bUdlbmVyaWNVbndpbmQsIGV4aXRBcmd1bWVudHMsIGV4Y2VwdGlvbkhhbmRsZXIpOworICAgICAg
ICBtX29yaWdpbi5mb3JFeGl0ID0gb2xkRXhpdDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
fQogICAgIAogICAgIExCYXNpY0Jsb2NrIGxvd0Jsb2NrKEJhc2ljQmxvY2sqIGJsb2NrKQogICAg
IHsKQEAgLTgzNTYsMTcgKzg0MDksMjYgQEAgcHJpdmF0ZToKICAgICB9CiAgICAgCiAgICAgdm9p
ZCBhcHBlbmRPU1JFeGl0KAotICAgICAgICBFeGl0S2luZCBraW5kLCBGb3JtYXR0ZWRWYWx1ZSBs
b3dWYWx1ZSwgTm9kZSogaGlnaFZhbHVlLCBMVmFsdWUgZmFpbENvbmRpdGlvbikKKyAgICAgICAg
RXhpdEtpbmQga2luZCwgRm9ybWF0dGVkVmFsdWUgbG93VmFsdWUsIE5vZGUqIGhpZ2hWYWx1ZSwg
TFZhbHVlIGZhaWxDb25kaXRpb24sIAorICAgICAgICBib29sIGlzRXhjZXB0aW9uSGFuZGxlciA9
IGZhbHNlLCBib29sIHdpbGxBcnJpdmVBdE9TUkV4aXRGcm9tR2VuZXJpY1Vud2luZCA9IGZhbHNl
LAorICAgICAgICBFeGl0QXJndW1lbnRMaXN0KiBsaXN0VG9CdWlsZElmT1NSRXhpdHRpbmdGcm9t
R2VuZXJpY1Vud2luZCA9IG51bGxwdHIsIEhhbmRsZXJJbmZvKiBleGNlcHRpb25IYW5kbGVyRm9y
R2VuZXJpY1Vud2luZCA9IG51bGxwdHIpCiAgICAgeworICAgICAgICBBU1NFUlQoISh3aWxsQXJy
aXZlQXRPU1JFeGl0RnJvbUdlbmVyaWNVbndpbmQgJiYgIWlzRXhjZXB0aW9uSGFuZGxlcikpOwor
CiAgICAgICAgIGlmICh2ZXJib3NlQ29tcGlsYXRpb25FbmFibGVkKCkpIHsKICAgICAgICAgICAg
IGRhdGFMb2coIiAgICBPU1IgZXhpdCAjIiwgbV9mdGxTdGF0ZS5qaXRDb2RlLT5vc3JFeGl0LnNp
emUoKSwgIiB3aXRoIGF2YWlsYWJpbGl0eTogIiwgYXZhaWxhYmlsaXR5TWFwKCksICJcbiIpOwog
ICAgICAgICAgICAgaWYgKCFtX2F2YWlsYWJsZVJlY292ZXJpZXMuaXNFbXB0eSgpKQogICAgICAg
ICAgICAgICAgIGRhdGFMb2coIiAgICAgICAgQXZhaWxhYmxlIHJlY292ZXJpZXM6ICIsIGxpc3RE
dW1wKG1fYXZhaWxhYmxlUmVjb3ZlcmllcyksICJcbiIpOwogICAgICAgICB9CiAKLSAgICAgICAg
REZHX0FTU0VSVChtX2dyYXBoLCBtX25vZGUsIG1fb3JpZ2luLmV4aXRPSyk7CisgICAgICAgIGJv
b2wgY2FuRXhpdCA9IG1fb3JpZ2luLmV4aXRPSzsKKyAgICAgICAgaWYgKCFjYW5FeGl0ICYmIG1f
bm9kZSkgeworICAgICAgICAgICAgREZHOjpFeGl0TW9kZSBleGl0TW9kZSA9IERGRzo6bWF5RXhp
dChtX2dyYXBoLCBtX25vZGUpOworICAgICAgICAgICAgY2FuRXhpdCA9IGV4aXRNb2RlID09IERG
Rzo6RXhpdE1vZGU6OkV4aXRzIHx8IGV4aXRNb2RlID09IERGRzo6RXhpdE1vZGU6OkV4aXRzRm9y
RXhjZXB0aW9uczsKKyAgICAgICAgfQorICAgICAgICBERkdfQVNTRVJUKG1fZ3JhcGgsIG1fbm9k
ZSwgY2FuRXhpdCk7CiAgICAgICAgIAotICAgICAgICBpZiAoZG9PU1JFeGl0RnV6emluZygpKSB7
CisgICAgICAgIGlmIChkb09TUkV4aXRGdXp6aW5nKCkgJiYgIWlzRXhjZXB0aW9uSGFuZGxlcikg
ewogICAgICAgICAgICAgTFZhbHVlIG51bWJlck9mRnV6ekNoZWNrcyA9IG1fb3V0LmFkZCgKICAg
ICAgICAgICAgICAgICBtX291dC5sb2FkMzIobV9vdXQuYWJzb2x1dGUoJmdfbnVtYmVyT2ZPU1JF
eGl0RnV6ekNoZWNrcykpLAogICAgICAgICAgICAgICAgIG1fb3V0LmludDMyT25lKTsKQEAgLTgz
ODUsNyArODQ0Nyw3IEBAIHByaXZhdGU6CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAg
ICAgICBpZiAoZmFpbENvbmRpdGlvbiA9PSBtX291dC5ib29sZWFuRmFsc2UpCisgICAgICAgIGlm
IChmYWlsQ29uZGl0aW9uID09IG1fb3V0LmJvb2xlYW5GYWxzZSAmJiAhd2lsbEFycml2ZUF0T1NS
RXhpdEZyb21HZW5lcmljVW53aW5kKQogICAgICAgICAgICAgcmV0dXJuOwogCiAgICAgICAgIEFT
U0VSVChtX2Z0bFN0YXRlLmppdENvZGUtPm9zckV4aXQuc2l6ZSgpID09IG1fZnRsU3RhdGUuZmlu
YWxpemVyLT5vc3JFeGl0LnNpemUoKSk7CkBAIC04Mzk4LDYgKzg0NjAsMjAgQEAgcHJpdmF0ZToK
ICAgICAgICAgbV9mdGxTdGF0ZS5maW5hbGl6ZXItPm9zckV4aXQuYXBwZW5kKE9TUkV4aXRDb21w
aWxhdGlvbkluZm8oKSk7CiAKICAgICAgICAgT1NSRXhpdCYgZXhpdCA9IG1fZnRsU3RhdGUuaml0
Q29kZS0+b3NyRXhpdC5sYXN0KCk7CisgICAgICAgIGV4aXQubV9pc0V4Y2VwdGlvbkhhbmRsZXIg
PSBpc0V4Y2VwdGlvbkhhbmRsZXI7CisgICAgICAgIGlmIChpc0V4Y2VwdGlvbkhhbmRsZXIpCisg
ICAgICAgICAgICBleGl0Lm1fZXhjZXB0aW9uSGFuZGxlckNhbGxTaXRlSW5kZXggPSBtX2Z0bFN0
YXRlLmppdENvZGUtPmNvbW1vbi5sYXN0Q2FsbFNpdGUoKTsKKworICAgICAgICBpZiAod2lsbEFy
cml2ZUF0T1NSRXhpdEZyb21HZW5lcmljVW53aW5kKSB7CisgICAgICAgICAgICBSRUxFQVNFX0FT
U0VSVChsaXN0VG9CdWlsZElmT1NSRXhpdHRpbmdGcm9tR2VuZXJpY1Vud2luZCk7CisgICAgICAg
ICAgICBSRUxFQVNFX0FTU0VSVChleGNlcHRpb25IYW5kbGVyRm9yR2VuZXJpY1Vud2luZCk7Cisg
ICAgICAgICAgICBleGl0Lm1fd2lsbEFycml2ZUF0T1NSRXhpdEZyb21HZW5lcmljVW53aW5kID0g
dHJ1ZTsKKyAgICAgICAgICAgIGV4aXQubV9oYW5kbGVyRm9yR2VuZXJpY1Vud2luZCA9ICpleGNl
cHRpb25IYW5kbGVyRm9yR2VuZXJpY1Vud2luZDsKKyAgICAgICAgICAgIGJ1aWxkRXhpdEFyZ3Vt
ZW50cyhleGl0LCAqbGlzdFRvQnVpbGRJZk9TUkV4aXR0aW5nRnJvbUdlbmVyaWNVbndpbmQsIGxv
d1ZhbHVlLCBleGl0Lm1fY29kZU9yaWdpbik7CisgICAgICAgICAgICBleGl0Lm1fc3RhY2ttYXBJ
RCA9IG1fc3RhY2ttYXBJRHMgLSAxOworICAgICAgICAgICAgLy9tX2Z0bFN0YXRlLmdlbmVyaWNV
bndpbmRFeGNlcHRpb25IYW5kbGVycy5hZGQobV9mdGxTdGF0ZS5qaXRDb2RlLT5vc3JFeGl0LnNp
emUoKSAtIDEsICpleGNlcHRpb25IYW5kbGVyRm9yR2VuZXJpY1Vud2luZCk7CisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIH0KIAogICAgICAgICBpZiAoZmFpbENvbmRpdGlvbiA9PSBtX291
dC5ib29sZWFuVHJ1ZSkgewogICAgICAgICAgICAgZW1pdE9TUkV4aXRDYWxsKGV4aXQsIGxvd1Zh
bHVlKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMT1NSRXhpdC5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMT1NSRXhpdC5oCShyZXZpc2lv
biAxOTA3NDUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTE9TUkV4aXQuaAkod29y
a2luZyBjb3B5KQpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgIkZUTEV4aXRUaW1lT2JqZWN0
TWF0ZXJpYWxpemF0aW9uLmgiCiAjaW5jbHVkZSAiRlRMRXhpdFZhbHVlLmgiCiAjaW5jbHVkZSAi
RlRMRm9ybWF0dGVkVmFsdWUuaCIKKyNpbmNsdWRlICJIYW5kbGVySW5mby5oIgogI2luY2x1ZGUg
Ik1ldGhvZE9mR2V0dGluZ0FWYWx1ZVByb2ZpbGUuaCIKICNpbmNsdWRlICJPcGVyYW5kcy5oIgog
I2luY2x1ZGUgIlZhbHVlUHJvZmlsZS5oIgpAQCAtMTU2LDYgKzE1Nyw3IEBAIHN0cnVjdCBPU1JF
eGl0IDogcHVibGljIERGRzo6T1NSRXhpdEJhc2UKICAgICBCYWc8RXhpdFRpbWVPYmplY3RNYXRl
cmlhbGl6YXRpb24+IG1fbWF0ZXJpYWxpemF0aW9uczsKICAgICAKICAgICB1aW50MzJfdCBtX3N0
YWNrbWFwSUQ7CisgICAgSGFuZGxlckluZm8gbV9oYW5kbGVyRm9yR2VuZXJpY1Vud2luZDsKICAg
ICAKICAgICBDb2RlTG9jYXRpb25KdW1wIGNvZGVMb2NhdGlvbkZvclJlcGF0Y2goQ29kZUJsb2Nr
KiBmdGxDb2RlQmxvY2spIGNvbnN0OwogICAgIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2Z0bC9GVExPU1JFeGl0Q29tcGlsZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9mdGwvRlRMT1NSRXhpdENvbXBpbGVyLmNwcAkocmV2aXNpb24gMTkwNzQ1KQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExPU1JFeGl0Q29tcGlsZXIuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC00NzIsNiArNDcyLDkgQEAgc3RhdGljIHZvaWQgY29tcGlsZVN0dWIoCiAgICAg
ICAgIH0KICAgICB9CiAKKyAgICBpZiAoZXhpdC5tX2lzRXhjZXB0aW9uSGFuZGxlcikKKyAgICAg
ICAgaml0LmNvcHlDYWxsZWVTYXZlc1RvVk1DYWxsZWVTYXZlc0J1ZmZlcigpOworCiAgICAgc2l6
ZV90IGJhc2VsaW5lVmlydHVhbFJlZ2lzdGVyc0ZvckNhbGxlZVNhdmVzID0gYmFzZWxpbmVDb2Rl
QmxvY2stPmNhbGxlZVNhdmVTcGFjZUFzVmlydHVhbFJlZ2lzdGVycygpOwogCiAgICAgLy8gTm93
IGdldCBzdGF0ZSBvdXQgb2YgdGhlIHNjcmF0Y2ggYnVmZmVyIGFuZCBwbGFjZSBpdCBiYWNrIGlu
dG8gdGhlIHN0YWNrLiBUaGUgdmFsdWVzIGFyZQpAQCAtNDg4LDcgKzQ5MSw3IEBAIHN0YXRpYyB2
b2lkIGNvbXBpbGVTdHViKAogICAgIAogICAgIGhhbmRsZUV4aXRDb3VudHMoaml0LCBleGl0KTsK
ICAgICByZWlmeUlubGluZWRDYWxsRnJhbWVzKGppdCwgZXhpdCk7Ci0gICAgYWRqdXN0QW5kSnVt
cFRvVGFyZ2V0KGppdCwgZXhpdCwgZmFsc2UpOworICAgIGFkanVzdEFuZEp1bXBUb1RhcmdldChq
aXQsIGV4aXQsIGV4aXQubV9pc0V4Y2VwdGlvbkhhbmRsZXIpOwogICAgIAogICAgIExpbmtCdWZm
ZXIgcGF0Y2hCdWZmZXIoKnZtLCBqaXQsIGNvZGVCbG9jayk7CiAgICAgZXhpdC5tX2NvZGUgPSBG
SU5BTElaRV9DT0RFX0lGKApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExTdGF0
ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMU3RhdGUuaAko
cmV2aXNpb24gMTkwNzQ1KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExTdGF0ZS5o
CSh3b3JraW5nIGNvcHkpCkBAIC04Niw2ICs4Niw3IEBAIHB1YmxpYzoKICAgICB2b2lkKiB1bndp
bmREYXRhU2VjdGlvbjsKICAgICBzaXplX3QgdW53aW5kRGF0YVNlY3Rpb25TaXplOwogICAgIFJl
ZlB0cjxEYXRhU2VjdGlvbj4gc3RhY2ttYXBzU2VjdGlvbjsKKyAgICAvL0hhc2hNYXA8dW5zaWdu
ZWQsIEhhbmRsZXJJbmZvLCBXVEY6OkludEhhc2g8dW5zaWduZWQ+LCBXVEY6OlVuc2lnbmVkV2l0
aFplcm9LZXlIYXNoVHJhaXRzPHVuc2lnbmVkPj4gZ2VuZXJpY1Vud2luZEV4Y2VwdGlvbkhhbmRs
ZXJzOwogICAgIAogICAgIHZvaWQgZHVtcFN0YXRlKGNvbnN0IGNoYXIqIHdoZW4pOwogICAgIHZv
aWQgZHVtcFN0YXRlKExNb2R1bGUsIGNvbnN0IGNoYXIqIHdoZW4pOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>264440</attachid>
            <date>2015-10-30 16:45:52 -0700</date>
            <delta_ts>2015-11-02 18:29:22 -0800</delta_ts>
            <desc>WIP</desc>
            <filename>c-backup.diff</filename>
            <type>text/plain</type>
            <size>85237</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvQWJzdHJhY3RNYWNyb0Fzc2Vt
Ymxlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvQWJz
dHJhY3RNYWNyb0Fzc2VtYmxlci5oCShyZXZpc2lvbiAxOTE0MTApCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYXNzZW1ibGVyL0Fic3RyYWN0TWFjcm9Bc3NlbWJsZXIuaAkod29ya2luZyBjb3B5
KQpAQCAtOTE2LDcgKzkxNiw3IEBAIHB1YmxpYzoKIAogICAgICAgICAvLyBDb252ZW5pZW5jZSBt
ZXRob2RzOgogICAgICAgICB2b2lkKiBncHIoUmVnaXN0ZXJJRCByZWdJRCkgeyByZXR1cm4gY3B1
LmdwcihyZWdJRCk7IH0KLSAgICAgICAgZG91YmxlIGZwcihGUFJlZ2lzdGVySUQgcmVnSUQpIHsg
cmV0dXJuIGNwdS5ncHIocmVnSUQpOyB9CisgICAgICAgIGRvdWJsZSBmcHIoRlBSZWdpc3RlcklE
IHJlZ0lEKSB7IHJldHVybiBjcHUuZnByKHJlZ0lEKTsgfQogICAgICAgICBjb25zdCBjaGFyKiBn
cHJOYW1lKFJlZ2lzdGVySUQgcmVnSUQpIHsgcmV0dXJuIGNwdS5ncHJOYW1lKHJlZ0lEKTsgfQog
ICAgICAgICBjb25zdCBjaGFyKiBmcHJOYW1lKEZQUmVnaXN0ZXJJRCByZWdJRCkgeyByZXR1cm4g
Y3B1LmZwck5hbWUocmVnSUQpOyB9CiAgICAgfTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9ieXRlY29kZS9Db2RlQmxvY2suY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9ieXRlY29kZS9Db2RlQmxvY2suY3BwCShyZXZpc2lvbiAxOTE0MTApCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
Njk5LDYgKzY5OSw3IEBAIHZvaWQgQ29kZUJsb2NrOjpkdW1wVmFsdWVQcm9maWxpbmcoUHJpbnQK
ICAgICBDb25jdXJyZW50SklUTG9ja2VyIGxvY2tlcihtX2xvY2spOwogICAgIAogICAgICsraXQ7
CisgICAgcmV0dXJuOwogICAgIENTdHJpbmcgZGVzY3JpcHRpb24gPSBpdC0+dS5wcm9maWxlLT5i
cmllZkRlc2NyaXB0aW9uKGxvY2tlcik7CiAgICAgaWYgKCFkZXNjcmlwdGlvbi5sZW5ndGgoKSkK
ICAgICAgICAgcmV0dXJuOwpAQCAtMjk0Niw3ICsyOTQ3LDcgQEAgSGFuZGxlckluZm8qIENvZGVC
bG9jazo6aGFuZGxlckZvckluZGV4KAogQ2FsbFNpdGVJbmRleCBDb2RlQmxvY2s6Om5ld0V4Y2Vw
dGlvbkhhbmRsaW5nQ2FsbFNpdGVJbmRleChDYWxsU2l0ZUluZGV4IG9yaWdpbmFsQ2FsbFNpdGUp
CiB7CiAjaWYgRU5BQkxFKERGR19KSVQpCi0gICAgUkVMRUFTRV9BU1NFUlQoaml0VHlwZSgpID09
IEpJVENvZGU6OkRGR0pJVCk7IC8vIEZJWE1FOiBXaGVuIGltcGxlbWVudGluZyBGVEwgdHJ5L2Nh
dGNoIHdlIHNob3VsZCBpbmNsdWRlIHRoYXQgSklUVHlwZSBoZXJlIGFzIHdlbGw6IGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDk0MDkKKyAgICBSRUxFQVNFX0FTU0VS
VChKSVRDb2RlOjppc09wdGltaXppbmdKSVQoaml0VHlwZSgpKSk7CiAgICAgUkVMRUFTRV9BU1NF
UlQoY2FuR2V0Q29kZU9yaWdpbihvcmlnaW5hbENhbGxTaXRlKSk7CiAgICAgQVNTRVJUKCEhaGFu
ZGxlckZvckluZGV4KG9yaWdpbmFsQ2FsbFNpdGUuYml0cygpKSk7CiAgICAgQ29kZU9yaWdpbiBv
cmlnaW5hbE9yaWdpbiA9IGNvZGVPcmlnaW4ob3JpZ2luYWxDYWxsU2l0ZSk7CkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvUG9seW1vcnBoaWNBY2Nlc3MuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9Qb2x5bW9ycGhpY0FjY2Vzcy5j
cHAJKHJldmlzaW9uIDE5MTQxMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9Q
b2x5bW9ycGhpY0FjY2Vzcy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEyMTYsNiArMTIxNiw4IEBA
IE1hY3JvQXNzZW1ibGVyQ29kZVB0ciBQb2x5bW9ycGhpY0FjY2VzczoKICAgICBpZiAodmVyYm9z
ZSkKICAgICAgICAgZGF0YUxvZygiR2VuZXJhdGluZyBjb2RlIGZvciBjYXNlczogIiwgbGlzdER1
bXAoY2FzZXMpLCAiXG4iKTsKICAgICAKKyAgICAvL2lmIChjb2RlQmxvY2stPmppdFR5cGUoKSA9
PSBKSVRDb2RlOjpGVExKSVQpCisgICAgLy8gICAgcmV0dXJuIE1hY3JvQXNzZW1ibGVyQ29kZVB0
cigpOwogICAgIEFjY2Vzc0dlbmVyYXRpb25TdGF0ZSBzdGF0ZTsKIAogICAgIHN0YXRlLmFjY2Vz
cyA9IHRoaXM7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0dyYXBoLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0dyYXBoLmNwcAkocmV2
aXNpb24gMTkxNDEwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdHcmFwaC5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTE0NTUsNiArMTQ1NSwyOCBAQCBNZXRob2RPZkdldHRpbmdBVmFs
dWVQcm9maWxlIEdyYXBoOjptZXRoCiAgICAgcmV0dXJuIE1ldGhvZE9mR2V0dGluZ0FWYWx1ZVBy
b2ZpbGUoKTsKIH0KIAorYm9vbCBHcmFwaDo6d2lsbENhdGNoRXhjZXB0aW9uSW5NYWNoaW5lRnJh
bWUoQ29kZU9yaWdpbiBjb2RlT3JpZ2luLCBDb2RlT3JpZ2luJiBvcENhdGNoT3JpZ2luT3V0LCBI
YW5kbGVySW5mbyomIGNhdGNoSGFuZGxlck91dCkKK3sKKyAgICB1bnNpZ25lZCBieXRlY29kZUlu
ZGV4VG9DaGVjayA9IGNvZGVPcmlnaW4uYnl0ZWNvZGVJbmRleDsKKyAgICB3aGlsZSAoMSkgewor
ICAgICAgICBJbmxpbmVDYWxsRnJhbWUqIGlubGluZUNhbGxGcmFtZSA9IGNvZGVPcmlnaW4uaW5s
aW5lQ2FsbEZyYW1lOworICAgICAgICBDb2RlQmxvY2sqIGNvZGVCbG9jayA9IGJhc2VsaW5lQ29k
ZUJsb2NrRm9yKGlubGluZUNhbGxGcmFtZSk7CisgICAgICAgIGlmIChIYW5kbGVySW5mbyogaGFu
ZGxlciA9IGNvZGVCbG9jay0+aGFuZGxlckZvckJ5dGVjb2RlT2Zmc2V0KGJ5dGVjb2RlSW5kZXhU
b0NoZWNrKSkgeworICAgICAgICAgICAgb3BDYXRjaE9yaWdpbk91dCA9IENvZGVPcmlnaW4oaGFu
ZGxlci0+dGFyZ2V0LCBpbmxpbmVDYWxsRnJhbWUpOworICAgICAgICAgICAgY2F0Y2hIYW5kbGVy
T3V0ID0gaGFuZGxlcjsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAg
ICAgICAgaWYgKCFpbmxpbmVDYWxsRnJhbWUpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICAgICAgYnl0ZWNvZGVJbmRleFRvQ2hlY2sgPSBpbmxpbmVDYWxsRnJhbWUtPmRpcmVjdENh
bGxlci5ieXRlY29kZUluZGV4OworICAgICAgICBjb2RlT3JpZ2luID0gY29kZU9yaWdpbi5pbmxp
bmVDYWxsRnJhbWUtPmRpcmVjdENhbGxlcjsKKyAgICB9CisKKyAgICBSRUxFQVNFX0FTU0VSVF9O
T1RfUkVBQ0hFRCgpOworfQorCiB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6REZHCiAKICNlbmRpZiAv
LyBFTkFCTEUoREZHX0pJVCkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHR3Jh
cGguaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0dyYXBoLmgJ
KHJldmlzaW9uIDE5MTQxMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHR3JhcGgu
aAkod29ya2luZyBjb3B5KQpAQCAtODIwLDYgKzgyMCw4IEBAIHB1YmxpYzoKIAogICAgIGJvb2wg
aGFzRGVidWdnZXJFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gbV9oYXNEZWJ1Z2dlckVuYWJsZWQ7
IH0KIAorICAgIGJvb2wgd2lsbENhdGNoRXhjZXB0aW9uSW5NYWNoaW5lRnJhbWUoQ29kZU9yaWdp
biwgQ29kZU9yaWdpbiYgb3BDYXRjaE9yaWdpbk91dCwgSGFuZGxlckluZm8qJiBjYXRjaEhhbmRs
ZXJPdXQpOworCiAgICAgVk0mIG1fdm07CiAgICAgUGxhbiYgbV9wbGFuOwogICAgIENvZGVCbG9j
ayogbV9jb2RlQmxvY2s7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENv
bXBpbGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJ
VENvbXBpbGVyLmNwcAkocmV2aXNpb24gMTkxNDEwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdKSVRDb21waWxlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU2MSwyOCArNTYxLDYg
QEAgdm9pZCBKSVRDb21waWxlcjo6YXBwZW5kRXhjZXB0aW9uSGFuZGxpbgogICAgIG1fZXhjZXB0
aW9uSGFuZGxlck9TUkV4aXRDYWxsU2l0ZXMuYXBwZW5kKEV4Y2VwdGlvbkhhbmRsaW5nT1NSRXhp
dEluZm8geyBleGl0SW5mbywgKmV4Y2VwdGlvbkhhbmRsZXIsIGNhbGxTaXRlIH0pOwogfQogCi1i
b29sIEpJVENvbXBpbGVyOjp3aWxsQ2F0Y2hFeGNlcHRpb25Jbk1hY2hpbmVGcmFtZShDb2RlT3Jp
Z2luIGNvZGVPcmlnaW4sIENvZGVPcmlnaW4mIG9wQ2F0Y2hPcmlnaW5PdXQsIEhhbmRsZXJJbmZv
KiYgY2F0Y2hIYW5kbGVyT3V0KQotewotICAgIHVuc2lnbmVkIGJ5dGVjb2RlSW5kZXhUb0NoZWNr
ID0gY29kZU9yaWdpbi5ieXRlY29kZUluZGV4OwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIElu
bGluZUNhbGxGcmFtZSogaW5saW5lQ2FsbEZyYW1lID0gY29kZU9yaWdpbi5pbmxpbmVDYWxsRnJh
bWU7Ci0gICAgICAgIENvZGVCbG9jayogY29kZUJsb2NrID0gbV9ncmFwaC5iYXNlbGluZUNvZGVC
bG9ja0ZvcihpbmxpbmVDYWxsRnJhbWUpOwotICAgICAgICBpZiAoSGFuZGxlckluZm8qIGhhbmRs
ZXIgPSBjb2RlQmxvY2stPmhhbmRsZXJGb3JCeXRlY29kZU9mZnNldChieXRlY29kZUluZGV4VG9D
aGVjaykpIHsKLSAgICAgICAgICAgIG9wQ2F0Y2hPcmlnaW5PdXQgPSBDb2RlT3JpZ2luKGhhbmRs
ZXItPnRhcmdldCwgaW5saW5lQ2FsbEZyYW1lKTsKLSAgICAgICAgICAgIGNhdGNoSGFuZGxlck91
dCA9IGhhbmRsZXI7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAg
ICAgIGlmICghaW5saW5lQ2FsbEZyYW1lKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0g
ICAgICAgIGJ5dGVjb2RlSW5kZXhUb0NoZWNrID0gaW5saW5lQ2FsbEZyYW1lLT5kaXJlY3RDYWxs
ZXIuYnl0ZWNvZGVJbmRleDsKLSAgICAgICAgY29kZU9yaWdpbiA9IGNvZGVPcmlnaW4uaW5saW5l
Q2FsbEZyYW1lLT5kaXJlY3RDYWxsZXI7Ci0gICAgfQotCi0gICAgUkVMRUFTRV9BU1NFUlRfTk9U
X1JFQUNIRUQoKTsKLX0KLQogdm9pZCBKSVRDb21waWxlcjo6ZXhjZXB0aW9uQ2hlY2soKQogewog
ICAgIC8vIEl0J3MgaW1wb3J0YW50IHRoYXQgd2UgdXNlIG9yaWdpbi5mb3JFeGl0IGhlcmUuIENv
bnNpZGVyIGlmIHdlIGhvaXN0IHN0cmluZwpAQCAtNjA3LDcgKzU4NSw3IEBAIHZvaWQgSklUQ29t
cGlsZXI6OmV4Y2VwdGlvbkNoZWNrKCkKICAgICAvLyB9CiAgICAgQ29kZU9yaWdpbiBvcENhdGNo
T3JpZ2luOwogICAgIEhhbmRsZXJJbmZvKiBleGNlcHRpb25IYW5kbGVyOwotICAgIGJvb2wgd2ls
bENhdGNoRXhjZXB0aW9uID0gd2lsbENhdGNoRXhjZXB0aW9uSW5NYWNoaW5lRnJhbWUobV9zcGVj
dWxhdGl2ZS0+bV9jdXJyZW50Tm9kZS0+b3JpZ2luLmZvckV4aXQsIG9wQ2F0Y2hPcmlnaW4sIGV4
Y2VwdGlvbkhhbmRsZXIpOyAKKyAgICBib29sIHdpbGxDYXRjaEV4Y2VwdGlvbiA9IG1fZ3JhcGgu
d2lsbENhdGNoRXhjZXB0aW9uSW5NYWNoaW5lRnJhbWUobV9zcGVjdWxhdGl2ZS0+bV9jdXJyZW50
Tm9kZS0+b3JpZ2luLmZvckV4aXQsIG9wQ2F0Y2hPcmlnaW4sIGV4Y2VwdGlvbkhhbmRsZXIpOyAK
ICAgICBpZiAod2lsbENhdGNoRXhjZXB0aW9uKSB7CiAgICAgICAgIHVuc2lnbmVkIHN0cmVhbUlu
ZGV4ID0gbV9zcGVjdWxhdGl2ZS0+bV9vdXRPZkxpbmVTdHJlYW1JbmRleCAhPSBVSU5UX01BWCA/
IG1fc3BlY3VsYXRpdmUtPm1fb3V0T2ZMaW5lU3RyZWFtSW5kZXggOiBtX3NwZWN1bGF0aXZlLT5t
X3N0cmVhbS0+c2l6ZSgpOwogICAgICAgICBNYWNyb0Fzc2VtYmxlcjo6SnVtcCBoYWRFeGNlcHRp
b24gPSBlbWl0Tm9uUGF0Y2hhYmxlRXhjZXB0aW9uQ2hlY2soKTsKQEAgLTYyMSw3ICs1OTksNyBA
QCBDYWxsU2l0ZUluZGV4IEpJVENvbXBpbGVyOjpyZWNvcmRDYWxsU2l0CiB7CiAgICAgQ29kZU9y
aWdpbiBvcENhdGNoT3JpZ2luOwogICAgIEhhbmRsZXJJbmZvKiBleGNlcHRpb25IYW5kbGVyOwot
ICAgIGJvb2wgd2lsbENhdGNoRXhjZXB0aW9uID0gd2lsbENhdGNoRXhjZXB0aW9uSW5NYWNoaW5l
RnJhbWUoY2FsbFNpdGVDb2RlT3JpZ2luLCBvcENhdGNoT3JpZ2luLCBleGNlcHRpb25IYW5kbGVy
KTsKKyAgICBib29sIHdpbGxDYXRjaEV4Y2VwdGlvbiA9IG1fZ3JhcGgud2lsbENhdGNoRXhjZXB0
aW9uSW5NYWNoaW5lRnJhbWUoY2FsbFNpdGVDb2RlT3JpZ2luLCBvcENhdGNoT3JpZ2luLCBleGNl
cHRpb25IYW5kbGVyKTsKICAgICBDYWxsU2l0ZUluZGV4IGNhbGxTaXRlID0gYWRkQ2FsbFNpdGUo
Y2FsbFNpdGVDb2RlT3JpZ2luKTsKICAgICBpZiAod2lsbENhdGNoRXhjZXB0aW9uKQogICAgICAg
ICBhcHBlbmRFeGNlcHRpb25IYW5kbGluZ09TUkV4aXQoZXZlbnRTdHJlYW1JbmRleCwgb3BDYXRj
aE9yaWdpbiwgZXhjZXB0aW9uSGFuZGxlciwgY2FsbFNpdGUpOwpJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL2RmZy9ERkdKSVRDb21waWxlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9kZmcvREZHSklUQ29tcGlsZXIuaAkocmV2aXNpb24gMTkxNDEwKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdKSVRDb21waWxlci5oCSh3b3JraW5nIGNvcHkpCkBA
IC0yNzksNyArMjc5LDYgQEAgcHJpdmF0ZToKICAgICB2b2lkIGxpbmtPU1JFeGl0cygpOwogICAg
IHZvaWQgZGlzYXNzZW1ibGUoTGlua0J1ZmZlciYpOwogCi0gICAgYm9vbCB3aWxsQ2F0Y2hFeGNl
cHRpb25Jbk1hY2hpbmVGcmFtZShDb2RlT3JpZ2luLCBDb2RlT3JpZ2luJiBvcENhdGNoT3JpZ2lu
T3V0LCBIYW5kbGVySW5mbyomIGNhdGNoSGFuZGxlck91dCk7CiAgICAgdm9pZCBhcHBlbmRFeGNl
cHRpb25IYW5kbGluZ09TUkV4aXQodW5zaWduZWQgZXZlbnRTdHJlYW1JbmRleCwgQ29kZU9yaWdp
biwgSGFuZGxlckluZm8qIGV4Y2VwdGlvbkhhbmRsZXIsIENhbGxTaXRlSW5kZXgsIE1hY3JvQXNz
ZW1ibGVyOjpKdW1wTGlzdCBqdW1wc1RvRmFpbCA9IE1hY3JvQXNzZW1ibGVyOjpKdW1wTGlzdCgp
KTsKIAogICAgIC8vIFRoZSBkYXRhZmxvdyBncmFwaCBjdXJyZW50bHkgYmVpbmcgZ2VuZXJhdGVk
LgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdOb2RlT3JpZ2luLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdOb2RlT3JpZ2luLmgJKHJldmlz
aW9uIDE5MTQxMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHTm9kZU9yaWdpbi5o
CSh3b3JraW5nIGNvcHkpCkBAIC02Myw2ICs2MywxOCBAQCBzdHJ1Y3QgTm9kZU9yaWdpbiB7CiAg
ICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisgICAgTm9kZU9yaWdpbiB3aXRoRm9yRXhp
dEFuZEV4aXRPSyhDb2RlT3JpZ2luIGZvckV4aXQsIGJvb2wgZXhpdE9LKSBjb25zdAorICAgIHsK
KyAgICAgICAgaWYgKCFpc1NldCgpKQorICAgICAgICAgICAgcmV0dXJuIE5vZGVPcmlnaW4oKTsK
KyAgICAgICAgCisgICAgICAgIE5vZGVPcmlnaW4gcmVzdWx0ID0gKnRoaXM7CisgICAgICAgIGlm
IChmb3JFeGl0LmlzU2V0KCkpCisgICAgICAgICAgICByZXN1bHQuZm9yRXhpdCA9IGZvckV4aXQ7
CisgICAgICAgIHJlc3VsdC5leGl0T0sgPSBleGl0T0s7CisgICAgICAgIHJldHVybiByZXN1bHQ7
CisgICAgfQorCiAgICAgTm9kZU9yaWdpbiB3aXRoRXhpdE9LKGJvb2wgdmFsdWUpIGNvbnN0CiAg
ICAgewogICAgICAgICBOb2RlT3JpZ2luIHJlc3VsdCA9ICp0aGlzOwpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2RmZy9ERkdPU1JFeGl0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvZGZnL0RGR09TUkV4aXQuY3BwCShyZXZpc2lvbiAxOTE0MTApCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR09TUkV4aXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00
Myw5ICs0Myw3IEBAIE9TUkV4aXQ6Ok9TUkV4aXQoRXhpdEtpbmQga2luZCwgSlNWYWx1ZVMKICAg
ICAsIG1fcGF0Y2hhYmxlQ29kZU9mZnNldCgwKQogICAgICwgbV9yZWNvdmVyeUluZGV4KHJlY292
ZXJ5SW5kZXgpCiAgICAgLCBtX3N0cmVhbUluZGV4KHN0cmVhbUluZGV4KQotICAgICwgbV9leGNl
cHRpb25IYW5kbGVyQ2FsbFNpdGVJbmRleChzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6
bWF4KCkpCiAgICAgLCBtX3dpbGxBcnJpdmVBdE9TUkV4aXRGcm9tR2VuZXJpY1Vud2luZChmYWxz
ZSkKLSAgICAsIG1faXNFeGNlcHRpb25IYW5kbGVyKGZhbHNlKQogewogICAgIGJvb2wgY2FuRXhp
dCA9IGppdC0+bV9vcmlnaW4uZXhpdE9LOwogICAgIGlmICghY2FuRXhpdCAmJiBqaXQtPm1fY3Vy
cmVudE5vZGUpIHsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHT1NSRXhpdC5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHT1NSRXhpdC5oCShy
ZXZpc2lvbiAxOTE0MTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR09TUkV4aXQu
aAkod29ya2luZyBjb3B5KQpAQCAtMTAwLDExICsxMDAsNyBAQCBzdHJ1Y3QgT1NSRXhpdCA6IHB1
YmxpYyBPU1JFeGl0QmFzZSB7CiAgICAgdm9pZCBjb3JyZWN0SnVtcChMaW5rQnVmZmVyJik7CiAK
ICAgICB1bnNpZ25lZCBtX3N0cmVhbUluZGV4OwotICAgIENhbGxTaXRlSW5kZXggbV9leGNlcHRp
b25IYW5kbGVyQ2FsbFNpdGVJbmRleDsKLQogICAgIGJvb2wgbV93aWxsQXJyaXZlQXRPU1JFeGl0
RnJvbUdlbmVyaWNVbndpbmQgOiAxOwotICAgIGJvb2wgbV9pc0V4Y2VwdGlvbkhhbmRsZXIgOiAx
OwotICAgIAogICAgIHZvaWQgY29uc2lkZXJBZGRpbmdBc0ZyZXF1ZW50RXhpdFNpdGUoQ29kZUJs
b2NrKiBwcm9maWxlZENvZGVCbG9jaykKICAgICB7CiAgICAgICAgIE9TUkV4aXRCYXNlOjpjb25z
aWRlckFkZGluZ0FzRnJlcXVlbnRFeGl0U2l0ZShwcm9maWxlZENvZGVCbG9jaywgRXhpdEZyb21E
RkcpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdPU1JFeGl0QmFzZS5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHT1NSRXhpdEJhc2UuaAko
cmV2aXNpb24gMTkxNDEwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdPU1JFeGl0
QmFzZS5oCSh3b3JraW5nIGNvcHkpCkBAIC00NSw2ICs0NSw4IEBAIHN0cnVjdCBPU1JFeGl0QmFz
ZSB7CiAgICAgICAgICwgbV9jb3VudCgwKQogICAgICAgICAsIG1fY29kZU9yaWdpbihvcmlnaW4p
CiAgICAgICAgICwgbV9jb2RlT3JpZ2luRm9yRXhpdFByb2ZpbGUob3JpZ2luRm9yUHJvZmlsZSkK
KyAgICAgICAgLCBtX2V4Y2VwdGlvbkhhbmRsZXJDYWxsU2l0ZUluZGV4KHN0ZDo6bnVtZXJpY19s
aW1pdHM8dW5zaWduZWQ+OjptYXgoKSkKKyAgICAgICAgLCBtX2lzRXhjZXB0aW9uSGFuZGxlcihm
YWxzZSkKICAgICB7CiAgICAgICAgIEFTU0VSVChtX2NvZGVPcmlnaW4uaXNTZXQoKSk7CiAgICAg
ICAgIEFTU0VSVChtX2NvZGVPcmlnaW5Gb3JFeGl0UHJvZmlsZS5pc1NldCgpKTsKQEAgLTU1LDYg
KzU3LDkgQEAgc3RydWN0IE9TUkV4aXRCYXNlIHsKICAgICAKICAgICBDb2RlT3JpZ2luIG1fY29k
ZU9yaWdpbjsKICAgICBDb2RlT3JpZ2luIG1fY29kZU9yaWdpbkZvckV4aXRQcm9maWxlOworICAg
IENhbGxTaXRlSW5kZXggbV9leGNlcHRpb25IYW5kbGVyQ2FsbFNpdGVJbmRleDsKKworICAgIGJv
b2wgbV9pc0V4Y2VwdGlvbkhhbmRsZXIgOiAxOwogCiBwcm90ZWN0ZWQ6CiAgICAgdm9pZCBjb25z
aWRlckFkZGluZ0FzRnJlcXVlbnRFeGl0U2l0ZShDb2RlQmxvY2sqIHByb2ZpbGVkQ29kZUJsb2Nr
LCBFeGl0aW5nSklUVHlwZSBqaXRUeXBlKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdPU1JFeGl0Q29tcGlsZXJDb21tb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9kZmcvREZHT1NSRXhpdENvbXBpbGVyQ29tbW9uLmNwcAkocmV2aXNpb24gMTkx
NDEwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdPU1JFeGl0Q29tcGlsZXJDb21t
b24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNDYsMTAgKzI0NiwxMCBAQCB2b2lkIHJlaWZ5SW5s
aW5lZENhbGxGcmFtZXMoQ0NhbGxIZWxwZXJzCiAgICAgLy8gRG9uJ3QgbmVlZCB0byBzZXQgdGhl
IHRvcGxldmVsIGNvZGUgb3JpZ2luIGlmIHdlIG9ubHkgZGlkIGlubGluZSB0YWlsIGNhbGxzCiAg
ICAgaWYgKGNvZGVPcmlnaW4pIHsKICNpZiBVU0UoSlNWQUxVRTY0KQotICAgIHVpbnQzMl90IGxv
Y2F0aW9uQml0cyA9IENhbGxTaXRlSW5kZXgoY29kZU9yaWdpbi0+Ynl0ZWNvZGVJbmRleCkuYml0
cygpOworICAgICAgICB1aW50MzJfdCBsb2NhdGlvbkJpdHMgPSBDYWxsU2l0ZUluZGV4KGNvZGVP
cmlnaW4tPmJ5dGVjb2RlSW5kZXgpLmJpdHMoKTsKICNlbHNlCi0gICAgSW5zdHJ1Y3Rpb24qIGlu
c3RydWN0aW9uID0gaml0LmJhc2VsaW5lQ29kZUJsb2NrKCktPmluc3RydWN0aW9ucygpLmJlZ2lu
KCkgKyBjb2RlT3JpZ2luLT5ieXRlY29kZUluZGV4OwotICAgIHVpbnQzMl90IGxvY2F0aW9uQml0
cyA9IENhbGxTaXRlSW5kZXgoaW5zdHJ1Y3Rpb24pLmJpdHMoKTsKKyAgICAgICAgSW5zdHJ1Y3Rp
b24qIGluc3RydWN0aW9uID0gaml0LmJhc2VsaW5lQ29kZUJsb2NrKCktPmluc3RydWN0aW9ucygp
LmJlZ2luKCkgKyBjb2RlT3JpZ2luLT5ieXRlY29kZUluZGV4OworICAgICAgICB1aW50MzJfdCBs
b2NhdGlvbkJpdHMgPSBDYWxsU2l0ZUluZGV4KGluc3RydWN0aW9uKS5iaXRzKCk7CiAjZW5kaWYK
ICAgICAgICAgaml0LnN0b3JlMzIoQXNzZW1ibHlIZWxwZXJzOjpUcnVzdGVkSW1tMzIobG9jYXRp
b25CaXRzKSwgQXNzZW1ibHlIZWxwZXJzOjp0YWdGb3IoKFZpcnR1YWxSZWdpc3RlcikoSlNTdGFj
azo6QXJndW1lbnRDb3VudCkpKTsKICAgICB9CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR1RpZXJVcENoZWNrSW5qZWN0aW9uUGhhc2UuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHVGllclVwQ2hlY2tJbmplY3Rpb25QaGFzZS5jcHAJKHJl
dmlzaW9uIDE5MTQxMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHVGllclVwQ2hl
Y2tJbmplY3Rpb25QaGFzZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTUzLDggKzUzLDggQEAgcHVi
bGljOgogICAgICAgICBpZiAobV9ncmFwaC5tX3Byb2ZpbGVkQmxvY2stPm1fZGlkRmFpbEZUTENv
bXBpbGF0aW9uKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgICAgIGlmIChtX2dy
YXBoLm1faGFzRXhjZXB0aW9uSGFuZGxlcnMpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIC8vaWYgKG1fZ3JhcGgubV9oYXNFeGNlcHRpb25IYW5kbGVycykKKyAgICAgICAgLy8g
ICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAKICNpZiBFTkFCTEUoRlRMX0pJVCkKICAgICAgICAg
RlRMOjpDYXBhYmlsaXR5TGV2ZWwgbGV2ZWwgPSBGVEw6OmNhbkNvbXBpbGUobV9ncmFwaCk7Cklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1ZhbGlkYXRlLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1ZhbGlkYXRlLmNwcAkocmV2aXNpb24g
MTkxNDEwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdWYWxpZGF0ZS5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTE5MCw3ICsxOTAsNyBAQCBwdWJsaWM6CiAgICAgICAgICAgICAgICAg
VkFMSURBVEUoKG5vZGUpLCBub2RlLT5vcmlnaW4uaXNTZXQoKSk7CiAgICAgICAgICAgICAgICAg
VkFMSURBVEUoKG5vZGUpLCBub2RlLT5vcmlnaW4uc2VtYW50aWMuaXNTZXQoKSA9PSBub2RlLT5v
cmlnaW4uZm9yRXhpdC5pc1NldCgpKTsKICAgICAgICAgICAgICAgICBWQUxJREFURSgobm9kZSks
ICEoIW5vZGUtPm9yaWdpbi5mb3JFeGl0LmlzU2V0KCkgJiYgbm9kZS0+b3JpZ2luLmV4aXRPSykp
OwotICAgICAgICAgICAgICAgIFZBTElEQVRFKChub2RlKSwgIShtYXlFeGl0KG1fZ3JhcGgsIG5v
ZGUpID09IEV4aXRzICYmICFub2RlLT5vcmlnaW4uZXhpdE9LKSk7CisgICAgICAgICAgICAgICAg
Ly9WQUxJREFURSgobm9kZSksICEobWF5RXhpdChtX2dyYXBoLCBub2RlKSA9PSBFeGl0cyAmJiAh
bm9kZS0+b3JpZ2luLmV4aXRPSykpOwogCiAgICAgICAgICAgICAgICAgaWYgKGkpIHsKICAgICAg
ICAgICAgICAgICAgICAgTm9kZSogcHJldmlvdXNOb2RlID0gYmxvY2stPmF0KGkgLSAxKTsKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMQ29tcGlsZS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExDb21waWxlLmNwcAkocmV2aXNpb24gMTkx
NDEwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExDb21waWxlLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMzAxLDcgKzMwMSw3IEBAIHN0YXRpYyBSZWdpc3RlclNldCB1c2VkUmVnaXN0
ZXJzRm9yKGNvbnMKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgQ2FsbFR5cGU+Ci12b2lkIGFkanVz
dENhbGxJQ3NGb3JTdGFja21hcHMoVmVjdG9yPENhbGxUeXBlPiYgY2FsbHMsIFN0YWNrTWFwczo6
UmVjb3JkTWFwJiByZWNvcmRNYXApCit2b2lkIGFkanVzdENhbGxJQ3NGb3JTdGFja21hcHMoVmVj
dG9yPENhbGxUeXBlPiYgY2FsbHMsIFN0YWNrTWFwczo6UmVjb3JkTWFwJiByZWNvcmRNYXAsIHN0
ZDo6ZnVuY3Rpb248Q2FsbFNpdGVJbmRleCAodWludDMyX3QgcmVjb3JkSW5kZXgsIENvZGVPcmln
aW4gb3JpZ2luKT4gZ2VuZXJhdGVDYWxsU2l0ZUluZGV4RnVuY3Rpb24sIHN0ZDo6ZnVuY3Rpb248
T1NSRXhpdCogKHVpbnQzMl90IHJlY29yZEluZGV4KT4gZ2V0Q29ycmVzcG9uZGluZ09TUkV4aXQp
CiB7CiAgICAgLy8gSGFuZGxpbmcgSlMgY2FsbHMgaXMgd2VpcmQ6IHdlIG5lZWQgdG8gZW5zdXJl
IHRoYXQgd2Ugc29ydCB0aGVtIGJ5IHRoZSBQQyBpbiBMTFZNCiAgICAgLy8gZ2VuZXJhdGVkIGNv
ZGUuIFRoYXQgaW1wbGllcyBmaXJzdCBwcnVuaW5nIHRoZSBvbmVzIHRoYXQgTExWTSBkaWRuJ3Qg
Z2VuZXJhdGUuCkBAIC0zMTksNiArMzE5LDkgQEAgdm9pZCBhZGp1c3RDYWxsSUNzRm9yU3RhY2tt
YXBzKFZlY3RvcjxDYQogICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgaXRlci0+dmFs
dWUuc2l6ZSgpOyArK2opIHsKICAgICAgICAgICAgIENhbGxUeXBlIGNvcHkgPSBjYWxsOwogICAg
ICAgICAgICAgY29weS5tX2luc3RydWN0aW9uT2Zmc2V0ID0gaXRlci0+dmFsdWVbal0ucmVjb3Jk
Lmluc3RydWN0aW9uT2Zmc2V0OworICAgICAgICAgICAgY29weS5zZXRDYWxsU2l0ZUluZGV4KGdl
bmVyYXRlQ2FsbFNpdGVJbmRleEZ1bmN0aW9uKGl0ZXItPnZhbHVlW2pdLmluZGV4LCBjb3B5LmNh
bGxTaXRlRGVzY3JpcHRpb25PcmlnaW4oKSkpOyAvLyBGSVhNRTogdGhpcyBpc24ndCBuZWNlc3Nh
cmlseSB0aGUgY29ycmVjdCBvcmlnaW4gaWYgdGhlIG9yaWdpbiBpcyBnb3QgZnJvbSB0aGUgb3Ny
IGV4aXQuCisgICAgICAgICAgICBjb3B5LnNldENvcnJlc3BvbmRpbmdHZW5lcmljVW53aW5kT1NS
RXhpdChnZXRDb3JyZXNwb25kaW5nT1NSRXhpdChpdGVyLT52YWx1ZVtqXS5pbmRleCkpOworCiAg
ICAgICAgICAgICBjYWxscy5hcHBlbmQoY29weSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMzMs
OSArMzM2LDMzIEBAIHN0YXRpYyB2b2lkIGZpeEZ1bmN0aW9uQmFzZWRPblN0YWNrTWFwcygKICAg
ICBHcmFwaCYgZ3JhcGggPSBzdGF0ZS5ncmFwaDsKICAgICBWTSYgdm0gPSBncmFwaC5tX3ZtOwog
ICAgIFN0YWNrTWFwcyYgc3RhY2ttYXBzID0gaml0Q29kZS0+c3RhY2ttYXBzOworCisgICAgLy8g
V2UgZmlsbCB0aGlzIHdoZW4gZ2VuZXJhdGluZyBPU1IgZXhpdHMgdGhhdCB3aWxsIGJlIGV4ZWN1
dGVkIHZpYSBnZW5lcmljVW53aW5kKCkuCisgICAgLy8gVGhhdCB3YXksIHdoZW4gd2UgYXNzaWdu
IGEgQ2FsbFNpdGVJbmRleCB0byB0aGUgQ2FsbC9HZXRCeUlkL1B1dEJ5SWQsIHdlIGFzc2lnbgor
ICAgIC8vIGl0IHRoZSBwcm9wZXIgQ2FsbFNpdGVJbmRleCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRo
ZSBPU1JFeGl0IGV4Y2VwdGlvbiBoYW5kbGVyLgorICAgIEhhc2hNYXA8dWludDMyX3QsIHNpemVf
dCwgV1RGOjpJbnRIYXNoPHVpbnQzMl90PiwgV1RGOjpVbnNpZ25lZFdpdGhaZXJvS2V5SGFzaFRy
YWl0czx1aW50MzJfdD4+IHJlY29yZEluZGV4VG9HZW5lcmljVW53aW5kT3JMYXp5U2xvd1BhdGhP
U1JFeGl0OworICAgIGF1dG8gZ2VuZXJhdGVPckdldEFscmVhZHlHZW5lcmF0ZWRDYWxsU2l0ZUlu
ZGV4ID0gWyZdICh1aW50MzJfdCByZWNvcmRJbmRleCwgQ29kZU9yaWdpbiBvcmlnaW4pIC0+IENh
bGxTaXRlSW5kZXggeworICAgICAgICBhdXRvIGZpbmRSZXN1bHQgPSByZWNvcmRJbmRleFRvR2Vu
ZXJpY1Vud2luZE9yTGF6eVNsb3dQYXRoT1NSRXhpdC5maW5kKHJlY29yZEluZGV4KTsKKyAgICAg
ICAgaWYgKGZpbmRSZXN1bHQgPT0gcmVjb3JkSW5kZXhUb0dlbmVyaWNVbndpbmRPckxhenlTbG93
UGF0aE9TUkV4aXQuZW5kKCkpCisgICAgICAgICAgICByZXR1cm4gc3RhdGUuaml0Q29kZS0+Y29t
bW9uLmFkZFVuaXF1ZUNhbGxTaXRlSW5kZXgob3JpZ2luKTsKKyAgICAgICAgc2l6ZV90IG9zckV4
aXRJbmRleCA9IGZpbmRSZXN1bHQtPnZhbHVlOworICAgICAgICByZXR1cm4gc3RhdGUuaml0Q29k
ZS0+b3NyRXhpdFtvc3JFeGl0SW5kZXhdLm1fZXhjZXB0aW9uSGFuZGxlckNhbGxTaXRlSW5kZXg7
CisgICAgfTsKKyAgICBhdXRvIGpzQ2FsbE9TUkV4aXRGb3JSZWNvcmRJbmRleCA9IFsmXSAodWlu
dDMyX3QgcmVjb3JkSW5kZXgpIC0+IE9TUkV4aXQqIHsKKyAgICAgICAgYXV0byBmaW5kUmVzdWx0
ID0gcmVjb3JkSW5kZXhUb0dlbmVyaWNVbndpbmRPckxhenlTbG93UGF0aE9TUkV4aXQuZmluZChy
ZWNvcmRJbmRleCk7CisgICAgICAgIGlmIChmaW5kUmVzdWx0ID09IHJlY29yZEluZGV4VG9HZW5l
cmljVW53aW5kT3JMYXp5U2xvd1BhdGhPU1JFeGl0LmVuZCgpKQorICAgICAgICAgICAgcmV0dXJu
IG51bGxwdHI7CisKKyAgICAgICAgc2l6ZV90IG9zckV4aXRJbmRleCA9IGZpbmRSZXN1bHQtPnZh
bHVlOworICAgICAgICBPU1JFeGl0JiBleGl0ID0gc3RhdGUuaml0Q29kZS0+b3NyRXhpdFtvc3JF
eGl0SW5kZXhdOworICAgICAgICBpZiAoIWV4aXQubV9kZXNjcmlwdG9yLm1faXNFeGNlcHRpb25G
cm9tSlNDYWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIHJldHVybiAm
ZXhpdDsKKyAgICB9OwogICAgIAogICAgIGludCBsb2NhbHNPZmZzZXQgPSBvZmZzZXRPZlN0YWNr
UmVnaW9uKHJlY29yZE1hcCwgc3RhdGUuY2FwdHVyZWRTdGFja21hcElEKSArIGdyYXBoLm1fbmV4
dE1hY2hpbmVMb2NhbDsKICAgICBpbnQgdmFyYXJnc1NwaWxsU2xvdHNPZmZzZXQgPSBvZmZzZXRP
ZlN0YWNrUmVnaW9uKHJlY29yZE1hcCwgc3RhdGUudmFyYXJnc1NwaWxsU2xvdHNTdGFja21hcElE
KTsKKyAgICBpbnQganNDYWxsVGhhdE1pZ2h0VGhyb3dTcGlsbE9mZnNldCA9IG9mZnNldE9mU3Rh
Y2tSZWdpb24ocmVjb3JkTWFwLCBzdGF0ZS5leGNlcHRpb25IYW5kbGluZ1NwaWxsU2xvdFN0YWNr
bWFwSUQpOwogICAgIAogICAgIGZvciAodW5zaWduZWQgaSA9IGdyYXBoLm1faW5saW5lVmFyaWFi
bGVEYXRhLnNpemUoKTsgaS0tOykgewogICAgICAgICBJbmxpbmVDYWxsRnJhbWUqIGlubGluZUNh
bGxGcmFtZSA9IGdyYXBoLm1faW5saW5lVmFyaWFibGVEYXRhW2ldLmlubGluZUNhbGxGcmFtZTsK
QEAgLTM5NywxNiArNDI0LDM0IEBAIHN0YXRpYyB2b2lkIGZpeEZ1bmN0aW9uQmFzZWRPblN0YWNr
TWFwcygKICAgICAgICAgICAgIC8vIEl0IHdhcyBvcHRpbWl6ZWQgb3V0LgogICAgICAgICAgICAg
Y29udGludWU7CiAgICAgICAgIH0KKyAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gZXhpdERlc2Ny
aXB0b3IubV92YWx1ZXMuc2l6ZSgpOyBqLS07KQorICAgICAgICAgICAgZXhpdERlc2NyaXB0b3Iu
bV92YWx1ZXNbal0gPSBleGl0RGVzY3JpcHRvci5tX3ZhbHVlc1tqXS53aXRoTG9jYWxzT2Zmc2V0
KGxvY2Fsc09mZnNldCk7CisgICAgICAgIGZvciAoRXhpdFRpbWVPYmplY3RNYXRlcmlhbGl6YXRp
b24qIG1hdGVyaWFsaXphdGlvbiA6IGV4aXREZXNjcmlwdG9yLm1fbWF0ZXJpYWxpemF0aW9ucykK
KyAgICAgICAgICAgIG1hdGVyaWFsaXphdGlvbi0+YWNjb3VudEZvckxvY2Fsc09mZnNldChsb2Nh
bHNPZmZzZXQpOwogCiAgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBpdGVyLT52YWx1
ZS5zaXplKCk7IGorKykgewotICAgICAgICAgICAgdWludDMyX3Qgc3RhY2ttYXBSZWNvcmRJbmRl
eCA9IGl0ZXItPnZhbHVlW2pdLmluZGV4OwotICAgICAgICAgICAgT1NSRXhpdCBleGl0KGV4aXRE
ZXNjcmlwdG9yLCBzdGFja21hcFJlY29yZEluZGV4KTsKLSAgICAgICAgICAgIHN0YXRlLmppdENv
ZGUtPm9zckV4aXQuYXBwZW5kKGV4aXQpOwotICAgICAgICAgICAgc3RhdGUuZmluYWxpemVyLT5v
c3JFeGl0LmFwcGVuZChPU1JFeGl0Q29tcGlsYXRpb25JbmZvKCkpOworICAgICAgICAgICAgewor
ICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0YWNrbWFwUmVjb3JkSW5kZXggPSBpdGVyLT52YWx1
ZVtqXS5pbmRleDsKKyAgICAgICAgICAgICAgICBPU1JFeGl0IGV4aXQoZXhpdERlc2NyaXB0b3Is
IHN0YWNrbWFwUmVjb3JkSW5kZXgpOworICAgICAgICAgICAgICAgIHN0YXRlLmppdENvZGUtPm9z
ckV4aXQuYXBwZW5kKGV4aXQpOworICAgICAgICAgICAgICAgIHN0YXRlLmZpbmFsaXplci0+b3Ny
RXhpdC5hcHBlbmQoT1NSRXhpdENvbXBpbGF0aW9uSW5mbygpKTsKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgT1NSRXhpdCYgZXhpdCA9IHN0YXRlLmppdENvZGUtPm9zckV4aXQubGFzdCgp
OworICAgICAgICAgICAgaWYgKGV4aXREZXNjcmlwdG9yLm1fd2lsbEFycml2ZUF0T1NSRXhpdEZy
b21HZW5lcmljVW53aW5kIHx8IGV4aXREZXNjcmlwdG9yLm1faXNFeGNlcHRpb25Gcm9tTGF6eVNs
b3dQYXRoKSB7CisgICAgICAgICAgICAgICAgQ2FsbFNpdGVJbmRleCBjYWxsU2l0ZUluZGV4ID0g
c3RhdGUuaml0Q29kZS0+Y29tbW9uLmFkZFVuaXF1ZUNhbGxTaXRlSW5kZXgoZXhpdC5tX2NvZGVP
cmlnaW5Gb3JFeGl0UHJvZmlsZSk7IC8vIFRoaXMgaXMgdGhlIHNlbWFudGljIG9yaWdpbiB3aGlj
aCBpcyB3aGF0IHdlIHdhbnQgd2hlbiB0YWxraW5nIGFib3V0IGNhbGwgc2l0ZSBsb2NhdGlvbiBv
biBhIGNhbGwgZnJhbWUuIEZJWE1FOiB3ZSBzaG91bGQgcHJvYmFibHkgaGF2ZSBhbiBleHBsaWNp
dCBmaWVsZCBmb3IgdGhpcy4KKyAgICAgICAgICAgICAgICBleGl0Lm1fZXhjZXB0aW9uSGFuZGxl
ckNhbGxTaXRlSW5kZXggPSBjYWxsU2l0ZUluZGV4OworICAgICAgICAgICAgICAgIHJlY29yZElu
ZGV4VG9HZW5lcmljVW53aW5kT3JMYXp5U2xvd1BhdGhPU1JFeGl0LmFkZChpdGVyLT52YWx1ZVtq
XS5pbmRleCwgc3RhdGUuaml0Q29kZS0+b3NyRXhpdC5zaXplKCkgLSAxKTsKKworICAgICAgICAg
ICAgICAgIGlmIChleGl0RGVzY3JpcHRvci5tX2lzRXhjZXB0aW9uRnJvbUpTQ2FsbCkgeworICAg
ICAgICAgICAgICAgICAgICBTdGFja01hcHM6OlJlY29yZCYgcmVjb3JkID0gaXRlci0+dmFsdWVb
al0ucmVjb3JkOworICAgICAgICAgICAgICAgICAgICBleGl0LmdhdGhlclJlZ2lzdGVyc1RvU3Bp
bGxGb3JDYWxsSWZFeGNlcHRpb24oc3RhY2ttYXBzLCByZWNvcmQpOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICBFeGl0VGh1bmtHZW5lcmF0
b3IgZXhpdFRodW5rR2VuZXJhdG9yKHN0YXRlKTsKLSAgICBleGl0VGh1bmtHZW5lcmF0b3IuZW1p
dFRodW5rcygpOworICAgIGV4aXRUaHVua0dlbmVyYXRvci5lbWl0VGh1bmtzKGpzQ2FsbFRoYXRN
aWdodFRocm93U3BpbGxPZmZzZXQpOwogICAgIGlmIChleGl0VGh1bmtHZW5lcmF0b3IuZGlkVGhp
bmdzKCkpIHsKICAgICAgICAgUkVMRUFTRV9BU1NFUlQoc3RhdGUuZmluYWxpemVyLT5vc3JFeGl0
LnNpemUoKSk7CiAgICAgICAgIApAQCAtNDE5LDIxICs0NjQsMjYgQEAgc3RhdGljIHZvaWQgZml4
RnVuY3Rpb25CYXNlZE9uU3RhY2tNYXBzKAogICAgICAgICAKICAgICAgICAgUkVMRUFTRV9BU1NF
UlQoc3RhdGUuZmluYWxpemVyLT5vc3JFeGl0LnNpemUoKSA9PSBzdGF0ZS5qaXRDb2RlLT5vc3JF
eGl0LnNpemUoKSk7CiAgICAgICAgIAorICAgICAgICBjb2RlQmxvY2stPmNsZWFyRXhjZXB0aW9u
SGFuZGxlcnMoKTsKKwogICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc3RhdGUuaml0
Q29kZS0+b3NyRXhpdC5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgT1NSRXhpdENvbXBpbGF0
aW9uSW5mbyYgaW5mbyA9IHN0YXRlLmZpbmFsaXplci0+b3NyRXhpdFtpXTsKLSAgICAgICAgICAg
IE9TUkV4aXQmIGV4aXQgPSBqaXRDb2RlLT5vc3JFeGl0W2ldOworICAgICAgICAgICAgT1NSRXhp
dCYgZXhpdCA9IHN0YXRlLmppdENvZGUtPm9zckV4aXRbaV07CiAgICAgICAgICAgICAKICAgICAg
ICAgICAgIGlmICh2ZXJib3NlQ29tcGlsYXRpb25FbmFibGVkKCkpCiAgICAgICAgICAgICAgICAg
ZGF0YUxvZygiSGFuZGxpbmcgT1NSIHN0YWNrbWFwICMiLCBleGl0Lm1fZGVzY3JpcHRvci5tX3N0
YWNrbWFwSUQsICIgZm9yICIsIGV4aXQubV9jb2RlT3JpZ2luLCAiXG4iKTsKIAogICAgICAgICAg
ICAgaW5mby5tX3RodW5rQWRkcmVzcyA9IGxpbmtCdWZmZXItPmxvY2F0aW9uT2YoaW5mby5tX3Ro
dW5rTGFiZWwpOwogICAgICAgICAgICAgZXhpdC5tX3BhdGNoYWJsZUNvZGVPZmZzZXQgPSBsaW5r
QnVmZmVyLT5vZmZzZXRPZihpbmZvLm1fdGh1bmtKdW1wKTsKLSAgICAgICAgICAgIAotICAgICAg
ICAgICAgZm9yICh1bnNpZ25lZCBqID0gZXhpdC5tX2Rlc2NyaXB0b3IubV92YWx1ZXMuc2l6ZSgp
OyBqLS07KQotICAgICAgICAgICAgICAgIGV4aXQubV9kZXNjcmlwdG9yLm1fdmFsdWVzW2pdID0g
ZXhpdC5tX2Rlc2NyaXB0b3IubV92YWx1ZXNbal0ud2l0aExvY2Fsc09mZnNldChsb2NhbHNPZmZz
ZXQpOwotICAgICAgICAgICAgZm9yIChFeGl0VGltZU9iamVjdE1hdGVyaWFsaXphdGlvbiogbWF0
ZXJpYWxpemF0aW9uIDogZXhpdC5tX2Rlc2NyaXB0b3IubV9tYXRlcmlhbGl6YXRpb25zKQotICAg
ICAgICAgICAgICAgIG1hdGVyaWFsaXphdGlvbi0+YWNjb3VudEZvckxvY2Fsc09mZnNldChsb2Nh
bHNPZmZzZXQpOwotICAgICAgICAgICAgCisKKyAgICAgICAgICAgIGlmIChleGl0Lm1fZGVzY3Jp
cHRvci5tX3dpbGxBcnJpdmVBdE9TUkV4aXRGcm9tR2VuZXJpY1Vud2luZCkgeworICAgICAgICAg
ICAgICAgIEhhbmRsZXJJbmZvIG5ld0hhbmRsZXIgPSBleGl0Lm1fZGVzY3JpcHRvci5tX2Jhc2Vs
aW5lRXhjZXB0aW9uSGFuZGxlcjsKKyAgICAgICAgICAgICAgICBuZXdIYW5kbGVyLnN0YXJ0ID0g
ZXhpdC5tX2V4Y2VwdGlvbkhhbmRsZXJDYWxsU2l0ZUluZGV4LmJpdHMoKTsKKyAgICAgICAgICAg
ICAgICBuZXdIYW5kbGVyLmVuZCA9IGV4aXQubV9leGNlcHRpb25IYW5kbGVyQ2FsbFNpdGVJbmRl
eC5iaXRzKCkgKyAxOworICAgICAgICAgICAgICAgIG5ld0hhbmRsZXIubmF0aXZlQ29kZSA9IGlu
Zm8ubV90aHVua0FkZHJlc3M7CisgICAgICAgICAgICAgICAgY29kZUJsb2NrLT5hcHBlbmRFeGNl
cHRpb25IYW5kbGVyKG5ld0hhbmRsZXIpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBp
ZiAodmVyYm9zZUNvbXBpbGF0aW9uRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICAgICAgRHVtcENv
bnRleHQgY29udGV4dDsKICAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgRXhpdCB2YWx1ZXM6
ICIsIGluQ29udGV4dChleGl0Lm1fZGVzY3JpcHRvci5tX3ZhbHVlcywgJmNvbnRleHQpLCAiXG4i
KTsKQEAgLTQ1NSw2ICs1MDUsMjEgQEAgc3RhdGljIHZvaWQgZml4RnVuY3Rpb25CYXNlZE9uU3Rh
Y2tNYXBzKAogICAgICAgICBDQ2FsbEhlbHBlcnMgc2xvd1BhdGhKSVQoJnZtLCBjb2RlQmxvY2sp
OwogICAgICAgICAKICAgICAgICAgQ0NhbGxIZWxwZXJzOjpKdW1wTGlzdCBleGNlcHRpb25UYXJn
ZXQ7CisKKyAgICAgICAgVmVjdG9yPHN0ZDo6cGFpcjxDQ2FsbEhlbHBlcnM6Okp1bXBMaXN0LCBD
b2RlTG9jYXRpb25MYWJlbD4+IGV4Y2VwdGlvbkp1bXBzVG9MaW5rOworICAgICAgICBhdXRvIGNv
bnNpZGVyTmV3RXhjZXB0aW9uSnVtcCA9IFsmXSAodWludDMyX3QgcmVjb3JkSW5kZXgsIGJvb2wm
IGFkZGVkTmV3RXhjZXB0aW9uSnVtcCkgeworICAgICAgICAgICAgYXV0byBmaW5kUmVzdWx0ID0g
cmVjb3JkSW5kZXhUb0dlbmVyaWNVbndpbmRPckxhenlTbG93UGF0aE9TUkV4aXQuZmluZChyZWNv
cmRJbmRleCk7CisgICAgICAgICAgICBhZGRlZE5ld0V4Y2VwdGlvbkp1bXAgPSBmYWxzZTsKKyAg
ICAgICAgICAgIGlmIChmaW5kUmVzdWx0ICE9IHJlY29yZEluZGV4VG9HZW5lcmljVW53aW5kT3JM
YXp5U2xvd1BhdGhPU1JFeGl0LmVuZCgpKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IG9zckV4
aXRJbmRleCA9IGZpbmRSZXN1bHQtPnZhbHVlOworICAgICAgICAgICAgICAgIFJFTEVBU0VfQVNT
RVJUKHN0YXRlLmppdENvZGUtPm9zckV4aXRbb3NyRXhpdEluZGV4XS5tX2Rlc2NyaXB0b3IubV93
aWxsQXJyaXZlQXRPU1JFeGl0RnJvbUdlbmVyaWNVbndpbmQpOworICAgICAgICAgICAgICAgIE9T
UkV4aXRDb21waWxhdGlvbkluZm8mIGluZm8gPSBzdGF0ZS5maW5hbGl6ZXItPm9zckV4aXRbb3Ny
RXhpdEluZGV4XTsKKyAgICAgICAgICAgICAgICBSRUxFQVNFX0FTU0VSVChpbmZvLm1fc2tpcEdl
bmVyaWNVbndpbmRUaHVua0xhYmVsLmlzU2V0KCkpOworICAgICAgICAgICAgICAgIGV4Y2VwdGlv
bkp1bXBzVG9MaW5rLmFwcGVuZCgKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIo
Q0NhbGxIZWxwZXJzOjpKdW1wTGlzdCgpLCBzdGF0ZS5maW5hbGl6ZXItPmV4aXRUaHVua3NMaW5r
QnVmZmVyLT5sb2NhdGlvbk9mKGluZm8ubV9za2lwR2VuZXJpY1Vud2luZFRodW5rTGFiZWwpKSk7
CisgICAgICAgICAgICAgICAgYWRkZWROZXdFeGNlcHRpb25KdW1wID0gdHJ1ZTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfTsKICAgICAgICAgCiAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IHN0
YXRlLmdldEJ5SWRzLnNpemUoKTsgaS0tOykgewogICAgICAgICAgICAgR2V0QnlJZERlc2NyaXB0
b3ImIGdldEJ5SWQgPSBzdGF0ZS5nZXRCeUlkc1tpXTsKQEAgLTQ3OCwxMyArNTQzLDE0IEBAIHN0
YXRpYyB2b2lkIGZpeEZ1bmN0aW9uQmFzZWRPblN0YWNrTWFwcygKICAgICAgICAgICAgICAgICBH
UFJSZWcgYmFzZSA9IHJlY29yZC5sb2NhdGlvbnNbMV0uZGlyZWN0R1BSKCk7CiAgICAgICAgICAg
ICAgICAgCiAgICAgICAgICAgICAgICAgSklUR2V0QnlJZEdlbmVyYXRvciBnZW4oCi0gICAgICAg
ICAgICAgICAgICAgIGNvZGVCbG9jaywgY29kZU9yaWdpbiwgc3RhdGUuaml0Q29kZS0+Y29tbW9u
LmFkZFVuaXF1ZUNhbGxTaXRlSW5kZXgoY29kZU9yaWdpbiksIHVzZWRSZWdpc3RlcnMsIEpTVmFs
dWVSZWdzKGJhc2UpLAorICAgICAgICAgICAgICAgICAgICBjb2RlQmxvY2ssIGNvZGVPcmlnaW4s
IGdlbmVyYXRlT3JHZXRBbHJlYWR5R2VuZXJhdGVkQ2FsbFNpdGVJbmRleChpdGVyLT52YWx1ZVtp
XS5pbmRleCwgY29kZU9yaWdpbiksIHVzZWRSZWdpc3RlcnMsIEpTVmFsdWVSZWdzKGJhc2UpLAog
ICAgICAgICAgICAgICAgICAgICBKU1ZhbHVlUmVncyhyZXN1bHQpKTsKICAgICAgICAgICAgICAg
ICAKKyAgICAgICAgICAgICAgICBib29sIGFkZGVkVW5pcXVlRXhjZXB0aW9uSnVtcDsKKyAgICAg
ICAgICAgICAgICBjb25zaWRlck5ld0V4Y2VwdGlvbkp1bXAoaXRlci0+dmFsdWVbaV0uaW5kZXgs
IGFkZGVkVW5pcXVlRXhjZXB0aW9uSnVtcCk7CiAgICAgICAgICAgICAgICAgTWFjcm9Bc3NlbWJs
ZXI6OkxhYmVsIGJlZ2luID0gc2xvd1BhdGhKSVQubGFiZWwoKTsKLQogICAgICAgICAgICAgICAg
IE1hY3JvQXNzZW1ibGVyOjpDYWxsIGNhbGwgPSBjYWxsT3BlcmF0aW9uKAotICAgICAgICAgICAg
ICAgICAgICBzdGF0ZSwgdXNlZFJlZ2lzdGVycywgc2xvd1BhdGhKSVQsIGNvZGVPcmlnaW4sICZl
eGNlcHRpb25UYXJnZXQsCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLCB1c2VkUmVnaXN0ZXJz
LCBzbG93UGF0aEpJVCwgY29kZU9yaWdpbiwgYWRkZWRVbmlxdWVFeGNlcHRpb25KdW1wID8gJmV4
Y2VwdGlvbkp1bXBzVG9MaW5rLmxhc3QoKS5maXJzdCA6ICZleGNlcHRpb25UYXJnZXQsCiAgICAg
ICAgICAgICAgICAgICAgIG9wZXJhdGlvbkdldEJ5SWRPcHRpbWl6ZSwgcmVzdWx0LCBDQ2FsbEhl
bHBlcnM6OlRydXN0ZWRJbW1QdHIoZ2VuLnN0dWJJbmZvKCkpLAogICAgICAgICAgICAgICAgICAg
ICBiYXNlLCBDQ2FsbEhlbHBlcnM6OlRydXN0ZWRJbW1QdHIoZ2V0QnlJZC51aWQoKSkpLmNhbGwo
KTsKIApAQCAtNTE3LDEzICs1ODMsMTYgQEAgc3RhdGljIHZvaWQgZml4RnVuY3Rpb25CYXNlZE9u
U3RhY2tNYXBzKAogICAgICAgICAgICAgICAgIEdQUlJlZyB2YWx1ZSA9IHJlY29yZC5sb2NhdGlv
bnNbMV0uZGlyZWN0R1BSKCk7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgSklU
UHV0QnlJZEdlbmVyYXRvciBnZW4oCi0gICAgICAgICAgICAgICAgICAgIGNvZGVCbG9jaywgY29k
ZU9yaWdpbiwgc3RhdGUuaml0Q29kZS0+Y29tbW9uLmFkZFVuaXF1ZUNhbGxTaXRlSW5kZXgoY29k
ZU9yaWdpbiksIHVzZWRSZWdpc3RlcnMsIEpTVmFsdWVSZWdzKGJhc2UpLAorICAgICAgICAgICAg
ICAgICAgICBjb2RlQmxvY2ssIGNvZGVPcmlnaW4sIGdlbmVyYXRlT3JHZXRBbHJlYWR5R2VuZXJh
dGVkQ2FsbFNpdGVJbmRleChpdGVyLT52YWx1ZVtpXS5pbmRleCwgY29kZU9yaWdpbiksIHVzZWRS
ZWdpc3RlcnMsIEpTVmFsdWVSZWdzKGJhc2UpLAogICAgICAgICAgICAgICAgICAgICBKU1ZhbHVl
UmVncyh2YWx1ZSksIEdQUkluZm86OnBhdGNocG9pbnRTY3JhdGNoUmVnaXN0ZXIsIHB1dEJ5SWQu
ZWNtYU1vZGUoKSwgcHV0QnlJZC5wdXRLaW5kKCkpOwogICAgICAgICAgICAgICAgIAorICAgICAg
ICAgICAgICAgIGJvb2wgYWRkZWRVbmlxdWVFeGNlcHRpb25KdW1wOworICAgICAgICAgICAgICAg
IGNvbnNpZGVyTmV3RXhjZXB0aW9uSnVtcChpdGVyLT52YWx1ZVtpXS5pbmRleCwgYWRkZWRVbmlx
dWVFeGNlcHRpb25KdW1wKTsKKwogICAgICAgICAgICAgICAgIE1hY3JvQXNzZW1ibGVyOjpMYWJl
bCBiZWdpbiA9IHNsb3dQYXRoSklULmxhYmVsKCk7Ci0gICAgICAgICAgICAgICAgCisKICAgICAg
ICAgICAgICAgICBNYWNyb0Fzc2VtYmxlcjo6Q2FsbCBjYWxsID0gY2FsbE9wZXJhdGlvbigKLSAg
ICAgICAgICAgICAgICAgICAgc3RhdGUsIHVzZWRSZWdpc3RlcnMsIHNsb3dQYXRoSklULCBjb2Rl
T3JpZ2luLCAmZXhjZXB0aW9uVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgdXNl
ZFJlZ2lzdGVycywgc2xvd1BhdGhKSVQsIGNvZGVPcmlnaW4sIGFkZGVkVW5pcXVlRXhjZXB0aW9u
SnVtcCA/ICZleGNlcHRpb25KdW1wc1RvTGluay5sYXN0KCkuZmlyc3QgOiAmZXhjZXB0aW9uVGFy
Z2V0LAogICAgICAgICAgICAgICAgICAgICBnZW4uc2xvd1BhdGhGdW5jdGlvbigpLCBJbnZhbGlk
R1BSUmVnLAogICAgICAgICAgICAgICAgICAgICBDQ2FsbEhlbHBlcnM6OlRydXN0ZWRJbW1QdHIo
Z2VuLnN0dWJJbmZvKCkpLCB2YWx1ZSwgYmFzZSwKICAgICAgICAgICAgICAgICAgICAgQ0NhbGxI
ZWxwZXJzOjpUcnVzdGVkSW1tUHRyKHB1dEJ5SWQudWlkKCkpKS5jYWxsKCk7CkBAIC01OTUsOSAr
NjY0LDE3IEBAIHN0YXRpYyB2b2lkIGZpeEZ1bmN0aW9uQmFzZWRPblN0YWNrTWFwcygKICAgICAg
ICAgICAgICAgICBjaGFyKiBzdGFydE9mSUMgPQogICAgICAgICAgICAgICAgICAgICBiaXR3aXNl
X2Nhc3Q8Y2hhcio+KGdlbmVyYXRlZEZ1bmN0aW9uKSArIHJlY29yZC5pbnN0cnVjdGlvbk9mZnNl
dDsKICAgICAgICAgICAgICAgICBDb2RlTG9jYXRpb25MYWJlbCBwYXRjaHBvaW50KChNYWNyb0Fz
c2VtYmxlckNvZGVQdHIoc3RhcnRPZklDKSkpOwotICAgICAgICAgICAgICAgIENvZGVMb2NhdGlv
bkxhYmVsIGV4Y2VwdGlvblRhcmdldCA9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLmZpbmFs
aXplci0+aGFuZGxlRXhjZXB0aW9uc0xpbmtCdWZmZXItPmVudHJ5cG9pbnQoKTsKKyAgICAgICAg
ICAgICAgICBDb2RlTG9jYXRpb25MYWJlbCBleGNlcHRpb25UYXJnZXQ7CisgICAgICAgICAgICAg
ICAgYXV0byBmaW5kUmVzdWx0ID0gcmVjb3JkSW5kZXhUb0dlbmVyaWNVbndpbmRPckxhenlTbG93
UGF0aE9TUkV4aXQuZmluZChpdGVyLT52YWx1ZVtpXS5pbmRleCk7CisgICAgICAgICAgICAgICAg
aWYgKGZpbmRSZXN1bHQgIT0gcmVjb3JkSW5kZXhUb0dlbmVyaWNVbndpbmRPckxhenlTbG93UGF0
aE9TUkV4aXQuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9zckV4aXRJbmRl
eCA9IGZpbmRSZXN1bHQtPnZhbHVlOworICAgICAgICAgICAgICAgICAgICBPU1JFeGl0Q29tcGls
YXRpb25JbmZvJiBpbmZvID0gc3RhdGUuZmluYWxpemVyLT5vc3JFeGl0W29zckV4aXRJbmRleF07
CisgICAgICAgICAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUKHN0YXRlLmppdENvZGUtPm9zckV4
aXRbb3NyRXhpdEluZGV4XS5tX2Rlc2NyaXB0b3IubV9pc0V4Y2VwdGlvbkZyb21MYXp5U2xvd1Bh
dGgpOworICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25UYXJnZXQgPSBzdGF0ZS5maW5hbGl6
ZXItPmV4aXRUaHVua3NMaW5rQnVmZmVyLT5sb2NhdGlvbk9mKGluZm8ubV90aHVua0xhYmVsKTsK
KyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uVGFy
Z2V0ID0gc3RhdGUuZmluYWxpemVyLT5oYW5kbGVFeGNlcHRpb25zTGlua0J1ZmZlci0+ZW50cnlw
b2ludCgpOwogCisgICAgICAgICAgICAgICAgLy8gRklYTUU6IG5lZWQgdG8gZG8gZXhjZXB0aW9u
IGhhbmRsaW5nIGZvciBsYXp5IHNsb3cgcGF0aHMuCiAgICAgICAgICAgICAgICAgc3RkOjp1bmlx
dWVfcHRyPExhenlTbG93UGF0aD4gbGF6eVNsb3dQYXRoID0gc3RkOjptYWtlX3VuaXF1ZTxMYXp5
U2xvd1BhdGg+KAogICAgICAgICAgICAgICAgICAgICBwYXRjaHBvaW50LCBleGNlcHRpb25UYXJn
ZXQsIHVzZWRSZWdpc3RlcnMsIHN0YXRlLmppdENvZGUtPmNvbW1vbi5hZGRVbmlxdWVDYWxsU2l0
ZUluZGV4KGNvZGVPcmlnaW4pLAogICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLm1fbGlu
a2VyLT5ydW4obG9jYXRpb25zKSk7CkBAIC02NDksMTUgKzcyNiwxNyBAQCBzdGF0aWMgdm9pZCBm
aXhGdW5jdGlvbkJhc2VkT25TdGFja01hcHMoCiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmZp
bmFsaXplci0+c2lkZUNvZGVMaW5rQnVmZmVyLT5sb2NhdGlvbk9mKHN0ZDo6Z2V0PDE+KHR1cGxl
KSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byYgcGFpciA6
IGV4Y2VwdGlvbkp1bXBzVG9MaW5rKQorICAgICAgICAgICAgc3RhdGUuZmluYWxpemVyLT5zaWRl
Q29kZUxpbmtCdWZmZXItPmxpbmsocGFpci5maXJzdCwgcGFpci5zZWNvbmQpOwogICAgIH0KICAg
ICAKLSAgICBhZGp1c3RDYWxsSUNzRm9yU3RhY2ttYXBzKHN0YXRlLmpzQ2FsbHMsIHJlY29yZE1h
cCk7CisgICAgYWRqdXN0Q2FsbElDc0ZvclN0YWNrbWFwcyhzdGF0ZS5qc0NhbGxzLCByZWNvcmRN
YXAsIGdlbmVyYXRlT3JHZXRBbHJlYWR5R2VuZXJhdGVkQ2FsbFNpdGVJbmRleCwganNDYWxsT1NS
RXhpdEZvclJlY29yZEluZGV4KTsKICAgICAKICAgICBmb3IgKHVuc2lnbmVkIGkgPSBzdGF0ZS5q
c0NhbGxzLnNpemUoKTsgaS0tOykgewogICAgICAgICBKU0NhbGwmIGNhbGwgPSBzdGF0ZS5qc0Nh
bGxzW2ldOwogCiAgICAgICAgIENDYWxsSGVscGVycyBmYXN0UGF0aEpJVCgmdm0sIGNvZGVCbG9j
ayk7Ci0gICAgICAgIGNhbGwuZW1pdChmYXN0UGF0aEpJVCwgc3RhdGUpOworICAgICAgICBjYWxs
LmVtaXQoZmFzdFBhdGhKSVQsIHN0YXRlLCBqc0NhbGxUaGF0TWlnaHRUaHJvd1NwaWxsT2Zmc2V0
KTsKIAogICAgICAgICBjaGFyKiBzdGFydE9mSUMgPSBiaXR3aXNlX2Nhc3Q8Y2hhcio+KGdlbmVy
YXRlZEZ1bmN0aW9uKSArIGNhbGwubV9pbnN0cnVjdGlvbk9mZnNldDsKIApAQCAtNjY2LDEzICs3
NDUsMTMgQEAgc3RhdGljIHZvaWQgZml4RnVuY3Rpb25CYXNlZE9uU3RhY2tNYXBzKAogICAgICAg
ICB9KTsKICAgICB9CiAgICAgCi0gICAgYWRqdXN0Q2FsbElDc0ZvclN0YWNrbWFwcyhzdGF0ZS5q
c0NhbGxWYXJhcmdzZXMsIHJlY29yZE1hcCk7CisgICAgYWRqdXN0Q2FsbElDc0ZvclN0YWNrbWFw
cyhzdGF0ZS5qc0NhbGxWYXJhcmdzZXMsIHJlY29yZE1hcCwgZ2VuZXJhdGVPckdldEFscmVhZHlH
ZW5lcmF0ZWRDYWxsU2l0ZUluZGV4LCBqc0NhbGxPU1JFeGl0Rm9yUmVjb3JkSW5kZXgpOwogICAg
IAogICAgIGZvciAodW5zaWduZWQgaSA9IHN0YXRlLmpzQ2FsbFZhcmFyZ3Nlcy5zaXplKCk7IGkt
LTspIHsKICAgICAgICAgSlNDYWxsVmFyYXJncyYgY2FsbCA9IHN0YXRlLmpzQ2FsbFZhcmFyZ3Nl
c1tpXTsKICAgICAgICAgCiAgICAgICAgIENDYWxsSGVscGVycyBmYXN0UGF0aEpJVCgmdm0sIGNv
ZGVCbG9jayk7Ci0gICAgICAgIGNhbGwuZW1pdChmYXN0UGF0aEpJVCwgc3RhdGUsIHZhcmFyZ3NT
cGlsbFNsb3RzT2Zmc2V0KTsKKyAgICAgICAgY2FsbC5lbWl0KGZhc3RQYXRoSklULCBzdGF0ZSwg
dmFyYXJnc1NwaWxsU2xvdHNPZmZzZXQsIGpzQ2FsbFRoYXRNaWdodFRocm93U3BpbGxPZmZzZXQp
OwogCiAgICAgICAgIGNoYXIqIHN0YXJ0T2ZJQyA9IGJpdHdpc2VfY2FzdDxjaGFyKj4oZ2VuZXJh
dGVkRnVuY3Rpb24pICsgY2FsbC5tX2luc3RydWN0aW9uT2Zmc2V0OwogICAgICAgICBzaXplX3Qg
c2l6ZU9mSUMgPSBzaXplT2ZJQ0ZvcihjYWxsLm5vZGUoKSk7CkBAIC02ODIsNyArNzYxLDggQEAg
c3RhdGljIHZvaWQgZml4RnVuY3Rpb25CYXNlZE9uU3RhY2tNYXBzKAogICAgICAgICB9KTsKICAg
ICB9CiAKLSAgICBhZGp1c3RDYWxsSUNzRm9yU3RhY2ttYXBzKHN0YXRlLmpzVGFpbENhbGxzLCBy
ZWNvcmRNYXApOworICAgIC8vIEZJWE1FOiB3ZSBkb24ndCByZWFsbHkgbmVlZCB0byBnZW5lcmF0
ZSBjYWxsc2l0ZWluZGljZXMgZm9yIHRhaWwgY2FsbHMuCisgICAgYWRqdXN0Q2FsbElDc0ZvclN0
YWNrbWFwcyhzdGF0ZS5qc1RhaWxDYWxscywgcmVjb3JkTWFwLCBnZW5lcmF0ZU9yR2V0QWxyZWFk
eUdlbmVyYXRlZENhbGxTaXRlSW5kZXgsIGpzQ2FsbE9TUkV4aXRGb3JSZWNvcmRJbmRleCk7CiAK
ICAgICBmb3IgKHVuc2lnbmVkIGkgPSBzdGF0ZS5qc1RhaWxDYWxscy5zaXplKCk7IGktLTspIHsK
ICAgICAgICAgSlNUYWlsQ2FsbCYgY2FsbCA9IHN0YXRlLmpzVGFpbENhbGxzW2ldOwpAQCAtNzMx
LDggKzgxMSwxMCBAQCBzdGF0aWMgdm9pZCBmaXhGdW5jdGlvbkJhc2VkT25TdGFja01hcHMoCiAg
ICAgZm9yICh1bnNpZ25lZCBleGl0SW5kZXggPSAwOyBleGl0SW5kZXggPCBqaXRDb2RlLT5vc3JF
eGl0LnNpemUoKTsgKytleGl0SW5kZXgpIHsKICAgICAgICAgT1NSRXhpdENvbXBpbGF0aW9uSW5m
byYgaW5mbyA9IHN0YXRlLmZpbmFsaXplci0+b3NyRXhpdFtleGl0SW5kZXhdOwogICAgICAgICBP
U1JFeGl0JiBleGl0ID0gaml0Q29kZS0+b3NyRXhpdFtleGl0SW5kZXhdOwotICAgICAgICAKICAg
ICAgICAgVmVjdG9yPGNvbnN0IHZvaWQqPiBjb2RlQWRkcmVzc2VzOworCisgICAgICAgIGlmIChl
eGl0Lm1fZGVzY3JpcHRvci5tX3dpbGxBcnJpdmVBdE9TUkV4aXRGcm9tR2VuZXJpY1Vud2luZCB8
fCBleGl0Lm1fZGVzY3JpcHRvci5tX2lzRXhjZXB0aW9uRnJvbUxhenlTbG93UGF0aCkgLy8gVGhp
cyBpcyByZWFjaGVkIGJ5IGEganVtcCBmcm9tIGdlbmVyaWNVbndpbmQgb3IgYSBqdW1wIGZyb20g
YSBsYXp5IHNsb3cgcGF0aC4KKyAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAKICAgICAg
ICAgU3RhY2tNYXBzOjpSZWNvcmQmIHJlY29yZCA9IGppdENvZGUtPnN0YWNrbWFwcy5yZWNvcmRz
W2V4aXQubV9zdGFja21hcFJlY29yZEluZGV4XTsKICAgICAgICAgCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvZnRsL0ZUTEV4aXRBcmd1bWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9mdGwvRlRMRXhpdEFyZ3VtZW50LmgJKHJldmlzaW9uIDE5MTQxMCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMRXhpdEFyZ3VtZW50LmgJKHdvcmtpbmcgY29w
eSkKQEAgLTc0LDcgKzc0LDcgQEAgcHVibGljOgogICAgIHsKICAgICAgICAgcmV0dXJuIEV4aXRB
cmd1bWVudChmb3JtYXQsIGFyZ3VtZW50KCkpOwogICAgIH0KLSAgICAKKwogICAgIEV4aXRBcmd1
bWVudFJlcHJlc2VudGF0aW9uIHJlcHJlc2VudGF0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9yZXBy
ZXNlbnRhdGlvbjsgfQogICAgIAogICAgIHZvaWQgZHVtcChQcmludFN0cmVhbSYpIGNvbnN0OwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExFeGl0VGh1bmtHZW5lcmF0b3IuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMRXhpdFRodW5rR2Vu
ZXJhdG9yLmNwcAkocmV2aXNpb24gMTkxNDEwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0
bC9GVExFeGl0VGh1bmtHZW5lcmF0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NiwyMSArNDYs
MzYgQEAgRXhpdFRodW5rR2VuZXJhdG9yOjp+RXhpdFRodW5rR2VuZXJhdG9yKAogewogfQogCi12
b2lkIEV4aXRUaHVua0dlbmVyYXRvcjo6ZW1pdFRodW5rKHVuc2lnbmVkIGluZGV4KQordm9pZCBF
eGl0VGh1bmtHZW5lcmF0b3I6OmVtaXRUaHVuayh1bnNpZ25lZCBpbmRleCwgaW50MzJfdCBvc3JF
eGl0RnJvbUdlbmVyaWNVbndpbmRTdGFja1NwaWxsU2xvdCkKIHsKICAgICBPU1JFeGl0Q29tcGls
YXRpb25JbmZvJiBpbmZvID0gbV9zdGF0ZS5maW5hbGl6ZXItPm9zckV4aXRbaW5kZXhdOworICAg
IE9TUkV4aXQmIGV4aXQgPSBtX3N0YXRlLmppdENvZGUtPm9zckV4aXRbaW5kZXhdOwogICAgIAog
ICAgIGluZm8ubV90aHVua0xhYmVsID0gbGFiZWwoKTsKKworICAgIGlmIChleGl0Lm1fZGVzY3Jp
cHRvci5tX3dpbGxBcnJpdmVBdE9TUkV4aXRGcm9tR2VuZXJpY1Vud2luZCkgeworICAgICAgICBy
ZXN0b3JlQ2FsbGVlU2F2ZXNGcm9tVk1DYWxsZWVTYXZlc0J1ZmZlcigpOworICAgICAgICAvL3By
b2JlKGJlZm9yZSk7CisgICAgICAgIGxvYWRQdHIodm0oKS0+YWRkcmVzc09mQ2FsbEZyYW1lRm9y
Q2F0Y2goKSwgZnJhbWVQb2ludGVyUmVnaXN0ZXIpOworICAgICAgICBhZGRQdHIoVHJ1c3RlZElt
bTMyKC0gc3RhdGljX2Nhc3Q8aW50NjRfdD4obV9zdGF0ZS5qaXRDb2RlLT5zdGFja21hcHMuc3Rh
Y2tTaXplRm9yTG9jYWxzKCkpKSwgCisgICAgICAgICAgICBmcmFtZVBvaW50ZXJSZWdpc3Rlciwg
c3RhY2tQb2ludGVyUmVnaXN0ZXIpOworCisgICAgICAgIGlmIChleGl0Lm1fZGVzY3JpcHRvci5t
X2lzRXhjZXB0aW9uRnJvbUpTQ2FsbCkKKyAgICAgICAgICAgIGV4aXQucmVjb3ZlclJlZ2lzdGVy
c0Zyb21TcGlsbFNsb3QoKnRoaXMsIG9zckV4aXRGcm9tR2VuZXJpY1Vud2luZFN0YWNrU3BpbGxT
bG90KTsKKworICAgICAgICBpbmZvLm1fc2tpcEdlbmVyaWNVbndpbmRUaHVua0xhYmVsID0gbGFi
ZWwoKTsKKyAgICB9CisKICAgICBwdXNoVG9TYXZlSW1tZWRpYXRlV2l0aG91dFRvdWNoaW5nUmVn
aXN0ZXJzKFRydXN0ZWRJbW0zMihpbmRleCkpOwogICAgIGluZm8ubV90aHVua0p1bXAgPSBwYXRj
aGFibGVKdW1wKCk7CiAgICAgCiAgICAgbV9kaWRUaGluZ3MgPSB0cnVlOwogfQogCi12b2lkIEV4
aXRUaHVua0dlbmVyYXRvcjo6ZW1pdFRodW5rcygpCit2b2lkIEV4aXRUaHVua0dlbmVyYXRvcjo6
ZW1pdFRodW5rcyhpbnQzMl90IG9zckV4aXRGcm9tR2VuZXJpY1Vud2luZFN0YWNrU3BpbGxTbG90
KQogewogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX3N0YXRlLmZpbmFsaXplci0+b3Ny
RXhpdC5zaXplKCk7ICsraSkKLSAgICAgICAgZW1pdFRodW5rKGkpOworICAgICAgICBlbWl0VGh1
bmsoaSwgb3NyRXhpdEZyb21HZW5lcmljVW53aW5kU3RhY2tTcGlsbFNsb3QpOwogfQogCiB9IH0g
Ly8gbmFtZXNwYWNlIEpTQzo6RlRMCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZU
TEV4aXRUaHVua0dlbmVyYXRvci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9mdGwvRlRMRXhpdFRodW5rR2VuZXJhdG9yLmgJKHJldmlzaW9uIDE5MTQxMCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMRXhpdFRodW5rR2VuZXJhdG9yLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTQwLDggKzQwLDggQEAgcHVibGljOgogICAgIEV4aXRUaHVua0dlbmVyYXRvcihTdGF0
ZSYgc3RhdGUpOwogICAgIH5FeGl0VGh1bmtHZW5lcmF0b3IoKTsKICAgICAKLSAgICB2b2lkIGVt
aXRUaHVuayh1bnNpZ25lZCBpbmRleCk7Ci0gICAgdm9pZCBlbWl0VGh1bmtzKCk7CisgICAgdm9p
ZCBlbWl0VGh1bmsodW5zaWduZWQgaW5kZXgsIGludDMyX3Qgb3NyRXhpdEZyb21HZW5lcmljVW53
aW5kU3RhY2tTcGlsbFNsb3QpOworICAgIHZvaWQgZW1pdFRodW5rcyhpbnQzMl90IG9zckV4aXRG
cm9tR2VuZXJpY1Vud2luZFN0YWNrU3BpbGxTbG90KTsKICAgICAKICAgICBib29sIGRpZFRoaW5n
cygpIGNvbnN0IHsgcmV0dXJuIG1fZGlkVGhpbmdzOyB9CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9mdGwvRlRMRXhpdFZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2Z0bC9GVExFeGl0VmFsdWUuaAkocmV2aXNpb24gMTkxNDEwKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2Z0bC9GVExFeGl0VmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAtMTU3LDYg
KzE1Nyw3IEBAIHB1YmxpYzoKICAgICBib29sIGlzQXJndW1lbnQoKSBjb25zdCB7IHJldHVybiBr
aW5kKCkgPT0gRXhpdFZhbHVlQXJndW1lbnQ7IH0KICAgICBib29sIGlzUmVjb3ZlcnkoKSBjb25z
dCB7IHJldHVybiBraW5kKCkgPT0gRXhpdFZhbHVlUmVjb3Zlcnk7IH0KICAgICBib29sIGlzT2Jq
ZWN0TWF0ZXJpYWxpemF0aW9uKCkgY29uc3QgeyByZXR1cm4ga2luZCgpID09IEV4aXRWYWx1ZU1h
dGVyaWFsaXplTmV3T2JqZWN0OyB9CisgICAgYm9vbCBoYXNJbmRleEluU3RhY2ttYXBMb2NhdGlv
bnMoKSBjb25zdCB7IHJldHVybiBpc0FyZ3VtZW50KCkgfHwgaXNSZWNvdmVyeSgpOyB9CiAgICAg
CiAgICAgRXhpdEFyZ3VtZW50IGV4aXRBcmd1bWVudCgpIGNvbnN0CiAgICAgewpAQCAtMTc1LDYg
KzE3NiwxOCBAQCBwdWJsaWM6CiAgICAgICAgIEFTU0VSVChpc1JlY292ZXJ5KCkpOwogICAgICAg
ICByZXR1cm4gdS5yZWNvdmVyeS5yaWdodEFyZ3VtZW50OwogICAgIH0KKworICAgIHZvaWQgYWRq
dXN0U3RhY2ttYXBMb2NhdGlvbnNJbmRleCh1bnNpZ25lZCBvZmZzZXQpCisgICAgeworICAgICAg
ICBBU1NFUlQoaGFzSW5kZXhJblN0YWNrbWFwTG9jYXRpb25zKCkpOworICAgICAgICBpZiAoaXNB
cmd1bWVudCgpKQorICAgICAgICAgICAgdS5hcmd1bWVudC5hcmd1bWVudCArPSBvZmZzZXQ7Cisg
ICAgICAgIGVsc2UgeworICAgICAgICAgICAgQVNTRVJUKGlzUmVjb3ZlcnkoKSk7CisgICAgICAg
ICAgICB1LnJlY292ZXJ5LnJpZ2h0QXJndW1lbnQgKz0gb2Zmc2V0OworICAgICAgICAgICAgdS5y
ZWNvdmVyeS5sZWZ0QXJndW1lbnQgKz0gb2Zmc2V0OworICAgICAgICB9CisgICAgfQogICAgIAog
ICAgIERhdGFGb3JtYXQgcmVjb3ZlcnlGb3JtYXQoKSBjb25zdAogICAgIHsKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMSklUQ29kZS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL2Z0bC9GVExKSVRDb2RlLmNwcAkocmV2aXNpb24gMTkxNDEwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExKSVRDb2RlLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMTQ0LDEwICsxNDQsMTYgQEAgdm9pZCBKSVRDb2RlOjp2YWxpZGF0ZVJlZmVyZW5jZXMoY29u
c3QgVAogICAgICAgICBleGl0Lm1fZGVzY3JpcHRvci52YWxpZGF0ZVJlZmVyZW5jZXModHJhY2tl
ZFJlZmVyZW5jZXMpOwogfQogCi1SZWdpc3RlclNldCBKSVRDb2RlOjpsaXZlUmVnaXN0ZXJzVG9Q
cmVzZXJ2ZUF0RXhjZXB0aW9uSGFuZGxpbmdDYWxsU2l0ZShDb2RlQmxvY2sqLCBDYWxsU2l0ZUlu
ZGV4KQorUmVnaXN0ZXJTZXQgSklUQ29kZTo6bGl2ZVJlZ2lzdGVyc1RvUHJlc2VydmVBdEV4Y2Vw
dGlvbkhhbmRsaW5nQ2FsbFNpdGUoQ29kZUJsb2NrKiwgQ2FsbFNpdGVJbmRleCBjYWxsU2l0ZUlu
ZGV4KQogewotICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQgdGhpcyB3aGVuIEZUTCBpbXBsZW1lbnRz
IHRyeS9jYXRjaC4KLSAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MTQ5NDA5CisgICAgZm9yIChPU1JFeGl0JiBleGl0IDogb3NyRXhpdCkgeworICAgICAgICBp
ZiAoZXhpdC5tX2V4Y2VwdGlvbkhhbmRsZXJDYWxsU2l0ZUluZGV4LmJpdHMoKSA9PSBjYWxsU2l0
ZUluZGV4LmJpdHMoKSkgeworICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQoZXhpdC5tX2lzRXhj
ZXB0aW9uSGFuZGxlcik7CisgICAgICAgICAgICAvLyBGSVhNRTogbWF5YmUgdXNlZFJlZ2lzdGVy
U2V0KCkgaXMgb3ZlcmtpbGwuCisgICAgICAgICAgICByZXR1cm4gc3RhY2ttYXBzLnJlY29yZHNb
ZXhpdC5tX3N0YWNrbWFwUmVjb3JkSW5kZXhdLnVzZWRSZWdpc3RlclNldCgpOworICAgICAgICAg
ICAgLy9yZXR1cm4gc3RhY2ttYXBzLnJlY29yZHNbZXhpdC5tX3N0YWNrbWFwUmVjb3JkSW5kZXhd
LmxpdmVPdXRzU2V0KCk7CisgICAgICAgIH0KKyAgICB9CiAgICAgcmV0dXJuIFJlZ2lzdGVyU2V0
KCk7CiB9CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMSlNDYWxsLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTEpTQ2FsbC5jcHAJKHJl
dmlzaW9uIDE5MTQxMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMSlNDYWxsLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNTAsOSArNTAsOSBAQCBKU0NhbGw6OkpTQ2FsbCh1bnNpZ25l
ZCBzdGFja21hcElELCBOb2RlCiAgICAgQVNTRVJUKG5vZGUtPm9wKCkgPT0gQ2FsbCB8fCBub2Rl
LT5vcCgpID09IENvbnN0cnVjdCB8fCBub2RlLT5vcCgpID09IFRhaWxDYWxsSW5saW5lZENhbGxl
cik7CiB9CiAKLXZvaWQgSlNDYWxsOjplbWl0KENDYWxsSGVscGVycyYgaml0LCBTdGF0ZSYgc3Rh
dGUpCit2b2lkIEpTQ2FsbDo6ZW1pdChDQ2FsbEhlbHBlcnMmIGppdCwgU3RhdGUmIHN0YXRlLCBp
bnQzMl90IG9zckV4aXRGcm9tR2VuZXJpY1Vud2luZFNwaWxsU2xvdHMpCiB7Ci0gICAgSlNDYWxs
QmFzZTo6ZW1pdChqaXQsIHN0YXRlKTsKKyAgICBKU0NhbGxCYXNlOjplbWl0KGppdCwgc3RhdGUs
IG9zckV4aXRGcm9tR2VuZXJpY1Vud2luZFNwaWxsU2xvdHMpOwogCiAgICAgaml0LmFkZFB0cihD
Q2FsbEhlbHBlcnM6OlRydXN0ZWRJbW0zMigtIHN0YXRpY19jYXN0PGludDY0X3Q+KHN0YXRlLmpp
dENvZGUtPnN0YWNrbWFwcy5zdGFja1NpemVGb3JMb2NhbHMoKSkpLCBDQ2FsbEhlbHBlcnM6OmZy
YW1lUG9pbnRlclJlZ2lzdGVyLCBDQ2FsbEhlbHBlcnM6OnN0YWNrUG9pbnRlclJlZ2lzdGVyKTsK
IH0KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMSlNDYWxsLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExKU0NhbGwuaAkocmV2aXNpb24gMTkx
NDEwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExKU0NhbGwuaAkod29ya2luZyBj
b3B5KQpAQCAtNDMsNyArNDMsNyBAQCBwdWJsaWM6CiAgICAgSlNDYWxsKCk7CiAgICAgSlNDYWxs
KHVuc2lnbmVkIHN0YWNrbWFwSUQsIERGRzo6Tm9kZSosIENvZGVPcmlnaW4gY2FsbFNpdGVEZXNj
cmlwdGlvbk9yaWdpbik7CiAKLSAgICB2b2lkIGVtaXQoQ0NhbGxIZWxwZXJzJiwgU3RhdGUmKTsK
KyAgICB2b2lkIGVtaXQoQ0NhbGxIZWxwZXJzJiwgU3RhdGUmLCBpbnQzMl90IG9zckV4aXRGcm9t
R2VuZXJpY1Vud2luZFNwaWxsU2xvdHMpOwogICAgIAogICAgIHVuc2lnbmVkIHN0YWNrbWFwSUQo
KSBjb25zdCB7IHJldHVybiBtX3N0YWNrbWFwSUQ7IH0KICAgICAKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9mdGwvRlRMSlNDYWxsQmFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2Z0bC9GVExKU0NhbGxCYXNlLmNwcAkocmV2aXNpb24gMTkxNDEwKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExKU0NhbGxCYXNlLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMzksNiArMzksNyBAQCB1c2luZyBuYW1lc3BhY2UgREZHOwogSlNDYWxsQmFzZTo6SlND
YWxsQmFzZSgpCiAgICAgOiBtX3R5cGUoQ2FsbExpbmtJbmZvOjpOb25lKQogICAgICwgbV9jYWxs
TGlua0luZm8obnVsbHB0cikKKyAgICAsIG1fY29ycmVzcG9uZGluZ0dlbmVyaWNVbndpbmRPU1JF
eGl0KG51bGxwdHIpCiB7CiB9CiAKQEAgLTUwLDEwICs1MSwxNCBAQCBKU0NhbGxCYXNlOjpKU0Nh
bGxCYXNlKENhbGxMaW5rSW5mbzo6Q2FsCiB7CiB9CiAKLXZvaWQgSlNDYWxsQmFzZTo6ZW1pdChD
Q2FsbEhlbHBlcnMmIGppdCwgU3RhdGUmIHN0YXRlKQordm9pZCBKU0NhbGxCYXNlOjplbWl0KEND
YWxsSGVscGVycyYgaml0LCBTdGF0ZSYgLypzdGF0ZSovLCBpbnQzMl90IG9zckV4aXRGcm9tR2Vu
ZXJpY1Vud2luZFN0YWNrU3BpbGxTbG90KQogewotICAgIENhbGxTaXRlSW5kZXggY2FsbFNpdGVJ
bmRleCA9IHN0YXRlLmppdENvZGUtPmNvbW1vbi5hZGRVbmlxdWVDYWxsU2l0ZUluZGV4KG1fY2Fs
bFNpdGVEZXNjcmlwdGlvbk9yaWdpbik7Ci0gICAgaml0LnN0b3JlMzIoQ0NhbGxIZWxwZXJzOjpU
cnVzdGVkSW1tMzIoY2FsbFNpdGVJbmRleC5iaXRzKCkpLCBDQ2FsbEhlbHBlcnM6OnRhZ0Zvcihz
dGF0aWNfY2FzdDxWaXJ0dWFsUmVnaXN0ZXI+KEpTU3RhY2s6OkFyZ3VtZW50Q291bnQpKSk7Cisg
ICAgUkVMRUFTRV9BU1NFUlQoISFtX2NhbGxTaXRlSW5kZXgpOworICAgIAorICAgIGlmIChtX2Nv
cnJlc3BvbmRpbmdHZW5lcmljVW53aW5kT1NSRXhpdCkKKyAgICAgICAgbV9jb3JyZXNwb25kaW5n
R2VuZXJpY1Vud2luZE9TUkV4aXQtPnNwaWxsUmVnaXN0ZXJzVG9TcGlsbFNsb3Qoaml0LCBvc3JF
eGl0RnJvbUdlbmVyaWNVbndpbmRTdGFja1NwaWxsU2xvdCk7CisKKyAgICBqaXQuc3RvcmUzMihD
Q2FsbEhlbHBlcnM6OlRydXN0ZWRJbW0zMihtX2NhbGxTaXRlSW5kZXguYml0cygpKSwgQ0NhbGxI
ZWxwZXJzOjp0YWdGb3Ioc3RhdGljX2Nhc3Q8VmlydHVhbFJlZ2lzdGVyPihKU1N0YWNrOjpBcmd1
bWVudENvdW50KSkpOwogCiAgICAgbV9jYWxsTGlua0luZm8gPSBqaXQuY29kZUJsb2NrKCktPmFk
ZENhbGxMaW5rSW5mbygpOwogICAgIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9G
VExKU0NhbGxCYXNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9G
VExKU0NhbGxCYXNlLmgJKHJldmlzaW9uIDE5MTQxMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9mdGwvRlRMSlNDYWxsQmFzZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMSw2ICszMSw3IEBACiAj
aW5jbHVkZSAiQ0NhbGxIZWxwZXJzLmgiCiAjaW5jbHVkZSAiQ2FsbExpbmtJbmZvLmgiCiAjaW5j
bHVkZSAiQ29kZU9yaWdpbi5oIgorI2luY2x1ZGUgIkZUTE9TUkV4aXQuaCIKIAogbmFtZXNwYWNl
IEpTQyB7CiAKQEAgLTQ5LDE3ICs1MCwyNSBAQCBwdWJsaWM6CiAgICAgSlNDYWxsQmFzZSgpOwog
ICAgIEpTQ2FsbEJhc2UoQ2FsbExpbmtJbmZvOjpDYWxsVHlwZSwgQ29kZU9yaWdpbiBzZW1hbnRp
YywgQ29kZU9yaWdpbiBjYWxsU2l0ZURlc2NyaXB0aW9uKTsKICAgICAKLSAgICB2b2lkIGVtaXQo
Q0NhbGxIZWxwZXJzJiwgU3RhdGUmKTsKKyAgICB2b2lkIGVtaXQoQ0NhbGxIZWxwZXJzJiwgU3Rh
dGUmLCBpbnQzMl90IG9zckV4aXRGcm9tR2VuZXJpY1Vud2luZFNwaWxsU2xvdHMpOwogICAgIHZv
aWQgbGluayhWTSYsIExpbmtCdWZmZXImKTsKKworICAgIHZvaWQgc2V0Q2FsbFNpdGVJbmRleChD
YWxsU2l0ZUluZGV4IGNhbGxTaXRlSW5kZXgpIHsgbV9jYWxsU2l0ZUluZGV4ID0gY2FsbFNpdGVJ
bmRleDsgfQorICAgIENvZGVPcmlnaW4gY2FsbFNpdGVEZXNjcmlwdGlvbk9yaWdpbigpIGNvbnN0
IHsgcmV0dXJuIG1fY2FsbFNpdGVEZXNjcmlwdGlvbk9yaWdpbjsgfQorCisgICAgdm9pZCBzZXRD
b3JyZXNwb25kaW5nR2VuZXJpY1Vud2luZE9TUkV4aXQoT1NSRXhpdCogZXhpdCkgeyBtX2NvcnJl
c3BvbmRpbmdHZW5lcmljVW53aW5kT1NSRXhpdCA9IGV4aXQ7IH0KICAgICAKIHByb3RlY3RlZDoK
ICAgICBDYWxsTGlua0luZm86OkNhbGxUeXBlIG1fdHlwZTsKICAgICBDb2RlT3JpZ2luIG1fc2Vt
YW50aWNlT3JpZ2luOwogICAgIENvZGVPcmlnaW4gbV9jYWxsU2l0ZURlc2NyaXB0aW9uT3JpZ2lu
OyAvLyBUaGVzZSB0d28gY29kZSBvcmlnaW5zIG1heSBiZSBkaWZmZXJlbnQgd2l0aCB0YWlsIGNh
bGxzIHVuZGVyIHNvbWUgY2lyY3Vtc3RhbmNlcyBvZiBpbmxpbmluZy4gU2VlIHJlbGV2YW50IGNv
bW1lbnQgaW4gTG93ZXJERkdUb0xMVk0uCisgICAgQ2FsbFNpdGVJbmRleCBtX2NhbGxTaXRlSW5k
ZXg7CiAgICAgQ0NhbGxIZWxwZXJzOjpEYXRhTGFiZWxQdHIgbV90YXJnZXRUb0NoZWNrOwogICAg
IENDYWxsSGVscGVyczo6Q2FsbCBtX2Zhc3RDYWxsOwogICAgIENDYWxsSGVscGVyczo6Q2FsbCBt
X3Nsb3dDYWxsOwogICAgIENhbGxMaW5rSW5mbyogbV9jYWxsTGlua0luZm87CitwdWJsaWM6Cisg
ICAgT1NSRXhpdCogbV9jb3JyZXNwb25kaW5nR2VuZXJpY1Vud2luZE9TUkV4aXQ7CiB9OwogCiB9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6RlRMCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRs
L0ZUTEpTQ2FsbFZhcmFyZ3MuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9mdGwvRlRMSlNDYWxsVmFyYXJncy5jcHAJKHJldmlzaW9uIDE5MTQxMCkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9mdGwvRlRMSlNDYWxsVmFyYXJncy5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTY5LDcgKzY5LDcgQEAgdW5zaWduZWQgSlNDYWxsVmFyYXJnczo6bnVtU3BpbGxTbG90c05lZQog
ICAgIHJldHVybiA0OwogfQogCi12b2lkIEpTQ2FsbFZhcmFyZ3M6OmVtaXQoQ0NhbGxIZWxwZXJz
JiBqaXQsIFN0YXRlJiBzdGF0ZSwgaW50MzJfdCBzcGlsbFNsb3RzT2Zmc2V0KQordm9pZCBKU0Nh
bGxWYXJhcmdzOjplbWl0KENDYWxsSGVscGVycyYgaml0LCBTdGF0ZSYgc3RhdGUsIGludDMyX3Qg
c3BpbGxTbG90c09mZnNldCwgaW50MzJfdCBvc3JFeGl0RnJvbUdlbmVyaWNVbndpbmRTcGlsbFNs
b3RzKQogewogICAgIC8vIFdlIGFyZSBwYXNzZWQgdGhyZWUgcGllY2VzIG9mIGluZm9ybWF0aW9u
OgogICAgIC8vIC0gVGhlIGNhbGxlZS4KQEAgLTIwNSw3ICsyMDUsOCBAQCB2b2lkIEpTQ2FsbFZh
cmFyZ3M6OmVtaXQoQ0NhbGxIZWxwZXJzJiBqCiAgICAgLy8gc3RhY2sgZnJhbWUgdG8gYWxyZWFk
eSBiZSBzZXQgdXAsIHdoaWNoIGl0IGlzLgogICAgIGppdC5zdG9yZTY0KEdQUkluZm86OnJlZ1Qw
LCBDQ2FsbEhlbHBlcnM6OmNhbGxlZUZyYW1lU2xvdChKU1N0YWNrOjpDYWxsZWUpKTsKIAotICAg
IG1fY2FsbEJhc2UuZW1pdChqaXQsIHN0YXRlKTsKKyAgICBtX2NhbGxCYXNlLmVtaXQoaml0LCBz
dGF0ZSwgb3NyRXhpdEZyb21HZW5lcmljVW53aW5kU3BpbGxTbG90cyk7CisKICAgICAKICAgICAv
LyBVbmRvIHRoZSBkYW1hZ2Ugd2UndmUgZG9uZS4KICAgICBpZiAoaXNBUk02NCgpKSB7CkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTEpTQ2FsbFZhcmFyZ3MuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTEpTQ2FsbFZhcmFyZ3MuaAkocmV2aXNp
b24gMTkxNDEwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExKU0NhbGxWYXJhcmdz
LmgJKHdvcmtpbmcgY29weSkKQEAgLTQ5LDcgKzQ5LDcgQEAgcHVibGljOgogICAgIAogICAgIHN0
YXRpYyB1bnNpZ25lZCBudW1TcGlsbFNsb3RzTmVlZGVkKCk7CiAgICAgCi0gICAgdm9pZCBlbWl0
KENDYWxsSGVscGVycyYsIFN0YXRlJiwgaW50MzJfdCBzcGlsbFNsb3RzT2Zmc2V0KTsKKyAgICB2
b2lkIGVtaXQoQ0NhbGxIZWxwZXJzJiwgU3RhdGUmLCBpbnQzMl90IHNwaWxsU2xvdHNPZmZzZXQs
IGludDMyX3Qgb3NyRXhpdEZyb21HZW5lcmljVW53aW5kU3BpbGxTbG90cyk7CiAgICAgdm9pZCBs
aW5rKFZNJiwgTGlua0J1ZmZlciYsIENvZGVMb2NhdGlvbkxhYmVsIGV4Y2VwdGlvbkhhbmRsZXIp
OwogICAgIAogICAgIHVuc2lnbmVkIHN0YWNrbWFwSUQoKSBjb25zdCB7IHJldHVybiBtX3N0YWNr
bWFwSUQ7IH0KQEAgLTU5LDYgKzU5LDEwIEBAIHB1YmxpYzoKICAgICAgICAgcmV0dXJuIG1faW5z
dHJ1Y3Rpb25PZmZzZXQgPCBvdGhlci5tX2luc3RydWN0aW9uT2Zmc2V0OwogICAgIH0KICAgICAK
KyAgICB2b2lkIHNldENhbGxTaXRlSW5kZXgoQ2FsbFNpdGVJbmRleCBjYWxsU2l0ZUluZGV4KSB7
IG1fY2FsbEJhc2Uuc2V0Q2FsbFNpdGVJbmRleChjYWxsU2l0ZUluZGV4KTsgfQorICAgIENvZGVP
cmlnaW4gY2FsbFNpdGVEZXNjcmlwdGlvbk9yaWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fY2FsbEJh
c2UuY2FsbFNpdGVEZXNjcmlwdGlvbk9yaWdpbigpOyB9CisgICAgdm9pZCBzZXRDb3JyZXNwb25k
aW5nR2VuZXJpY1Vud2luZE9TUkV4aXQoT1NSRXhpdCogZXhpdCkgeyBtX2NhbGxCYXNlLnNldENv
cnJlc3BvbmRpbmdHZW5lcmljVW53aW5kT1NSRXhpdChleGl0KTsgfQorICAgIAogcHJpdmF0ZToK
ICAgICB1bnNpZ25lZCBtX3N0YWNrbWFwSUQ7CiAgICAgREZHOjpOb2RlKiBtX25vZGU7CkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTExhenlTbG93UGF0aC5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExMYXp5U2xvd1BhdGguY3BwCShyZXZp
c2lvbiAxOTE0MTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTExhenlTbG93UGF0
aC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYwLDEyICs2MCwyMiBAQCB2b2lkIExhenlTbG93UGF0
aDo6Z2VuZXJhdGUoQ29kZUJsb2NrKiBjCiAgICAgcGFyYW1zLmV4Y2VwdGlvbkp1bXBzID0gbV9l
eGNlcHRpb25UYXJnZXQgPyAmZXhjZXB0aW9uSnVtcHMgOiBudWxscHRyOwogICAgIHBhcmFtcy5s
YXp5U2xvd1BhdGggPSB0aGlzOwogICAgIG1fZ2VuZXJhdG9yLT5ydW4oaml0LCBwYXJhbXMpOwor
ICAgIC8vYXV0byBza2lwRXhjZXB0aW9uID0gaml0Lmp1bXAoKTsKKyAgICAvL0NDYWxsSGVscGVy
czo6TGFiZWwgZXhjZXB0aW9uTGFiZWw7CisgICAgLy9pZiAobV9leGNlcHRpb25UYXJnZXQpIHsK
KyAgICAvLyAgICBleGNlcHRpb25MYWJlbCA9IGppdC5sYWJlbCgpOworICAgIC8vICAgIGppdC5h
Ym9ydFdpdGhSZWFzb24oQUhJc05vdE51bGwpOworICAgIC8vfQorCisgICAgLy9za2lwRXhjZXB0
aW9uLmxpbmsoJmppdCk7CiAKICAgICBMaW5rQnVmZmVyIGxpbmtCdWZmZXIodm0sIGppdCwgY29k
ZUJsb2NrLCBKSVRDb21waWxhdGlvbk11c3RTdWNjZWVkKTsKICAgICBsaW5rQnVmZmVyLmxpbmso
CiAgICAgICAgIHBhcmFtcy5kb25lSnVtcHMsIG1fcGF0Y2hwb2ludC5sYWJlbEF0T2Zmc2V0KE1h
Y3JvQXNzZW1ibGVyOjptYXhKdW1wUmVwbGFjZW1lbnRTaXplKCkpKTsKICAgICBpZiAobV9leGNl
cHRpb25UYXJnZXQpCiAgICAgICAgIGxpbmtCdWZmZXIubGluayhleGNlcHRpb25KdW1wcywgbV9l
eGNlcHRpb25UYXJnZXQpOworICAgIC8vaWYgKG1fZXhjZXB0aW9uVGFyZ2V0KQorICAgIC8vICAg
IGxpbmtCdWZmZXIubGluayhleGNlcHRpb25KdW1wcywgbGlua0J1ZmZlci5sb2NhdGlvbk9mKGV4
Y2VwdGlvbkxhYmVsKSk7CiAgICAgbV9zdHViID0gRklOQUxJWkVfQ09ERV9GT1IoY29kZUJsb2Nr
LCBsaW5rQnVmZmVyLCAoIkxhenkgc2xvdyBwYXRoIGNhbGwgc3R1YiIpKTsKIAogICAgIE1hY3Jv
QXNzZW1ibGVyOjpyZXBsYWNlV2l0aEp1bXAobV9wYXRjaHBvaW50LCBDb2RlTG9jYXRpb25MYWJl
bChtX3N0dWIuY29kZSgpKSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTExv
d2VyREZHVG9MTFZNLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRs
L0ZUTExvd2VyREZHVG9MTFZNLmNwcAkocmV2aXNpb24gMTkxNDEwKQorKysgU291cmNlL0phdmFT
Y3JpcHRDb3JlL2Z0bC9GVExMb3dlckRGR1RvTExWTS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMx
LDYgKzMxLDcgQEAKICNpbmNsdWRlICJDb2RlQmxvY2tXaXRoSklUVHlwZS5oIgogI2luY2x1ZGUg
IkRGR0Fic3RyYWN0SW50ZXJwcmV0ZXJJbmxpbmVzLmgiCiAjaW5jbHVkZSAiREZHSW5QbGFjZUFi
c3RyYWN0U3RhdGUuaCIKKyNpbmNsdWRlICJERkdNYXlFeGl0LmgiCiAjaW5jbHVkZSAiREZHT1NS
QXZhaWxhYmlsaXR5QW5hbHlzaXNQaGFzZS5oIgogI2luY2x1ZGUgIkRGR09TUkV4aXRGdXp6Lmgi
CiAjaW5jbHVkZSAiRGlyZWN0QXJndW1lbnRzLmgiCkBAIC0xNjksNyArMTcwLDcgQEAgcHVibGlj
OgogICAgICAgICAgICAgbV9vdXQuc3RhY2ttYXBJbnRyaW5zaWMoKSwgbV9vdXQuY29uc3RJbnQ2
NChtX2Z0bFN0YXRlLmNhcHR1cmVkU3RhY2ttYXBJRCksCiAgICAgICAgICAgICBtX291dC5pbnQz
Mlplcm8sIGNhcHR1cmVkQWxsb2NhKTsKICAgICAgICAgCi0gICAgICAgIC8vIElmIHdlIGhhdmUg
YW55IENhbGxWYXJhcmdzIHRoZW4gd2UgbmVlIHRvIGhhdmUgYSBzcGlsbCBzbG90IGZvciBpdC4K
KyAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbnkgQ2FsbFZhcmFyZ3MgdGhlbiB3ZSBuZWVkIHRvIGhh
dmUgYSBzcGlsbCBzbG90IGZvciBpdC4KICAgICAgICAgYm9vbCBoYXNWYXJhcmdzID0gZmFsc2U7
CiAgICAgICAgIGZvciAoQmFzaWNCbG9jayogYmxvY2sgOiBwcmVPcmRlcikgewogICAgICAgICAg
ICAgZm9yIChOb2RlKiBub2RlIDogKmJsb2NrKSB7CkBAIC0xOTcsNiArMTk4LDI0IEBAIHB1Ymxp
YzoKICAgICAgICAgICAgICAgICBtX291dC5zdGFja21hcEludHJpbnNpYygpLCBtX291dC5jb25z
dEludDY0KG1fZnRsU3RhdGUudmFyYXJnc1NwaWxsU2xvdHNTdGFja21hcElEKSwKICAgICAgICAg
ICAgICAgICBtX291dC5pbnQzMlplcm8sIHZhcmFyZ3NTcGlsbFNsb3RzKTsKICAgICAgICAgfQor
CisgICAgICAgIGlmIChtX2dyYXBoLm1faGFzRXhjZXB0aW9uSGFuZGxlcnMpIHsKKyAgICAgICAg
ICAgIC8vIEZJWE1FOiBsZXRzIGNvbWUgdXAgd2l0aCBhIG5vdC10ZXJyaWJsZSBudW1iZXIgaGVy
ZSBieSBzZWFyY2hpbmcgb3ZlciB0aGUgZ3JhcGgKKyAgICAgICAgICAgIC8vIGFuZCB0YWtpbmcg
dGhlIG1heCBvZiBsaXZlIHZhbHVlcyBhdCBvcF9jYXRjaCBwb2ludHMgZm9yIHRoZWlyIGNvcnJl
c3BvbmRpbmcKKyAgICAgICAgICAgIC8vIHRyeSBibG9jayBjYWxscy9nZXRieWlkcywgZXRjLgor
ICAgICAgICAgICAgUmVnaXN0ZXJTZXQgdm9sYXRpbGVSZWdpc3RlcnMgPSBSZWdpc3RlclNldDo6
YWxsUmVnaXN0ZXJzKCk7CisgICAgICAgICAgICB2b2xhdGlsZVJlZ2lzdGVycy5leGNsdWRlKFJl
Z2lzdGVyU2V0OjpzdGFja1JlZ2lzdGVycygpKTsKKyAgICAgICAgICAgIHZvbGF0aWxlUmVnaXN0
ZXJzLmV4Y2x1ZGUoUmVnaXN0ZXJTZXQ6OnJlc2VydmVkSGFyZHdhcmVSZWdpc3RlcnMoKSk7Cisg
ICAgICAgICAgICB2b2xhdGlsZVJlZ2lzdGVycy5leGNsdWRlKFJlZ2lzdGVyU2V0Ojp2bUNhbGxl
ZVNhdmVSZWdpc3RlcnMoKSk7CisgICAgICAgICAgICAvL3ZvbGF0aWxlUmVnaXN0ZXJzLmV4Y2x1
ZGUoUmVnaXN0ZXJTZXQ6OmxsaW50QmFzZWxpbmVDYWxsZWVTYXZlUmVnaXN0ZXJzKCkpOworCisg
ICAgICAgICAgICBMVmFsdWUgZXhjZXB0aW9uSGFuZGxpbmdWb2xhdGlsZVJlZ2lzdGVyc1NwaWxs
U2xvdHMgPSBtX291dC5hbGxvY2EoCisgICAgICAgICAgICAgICAgYXJyYXlUeXBlKG1fb3V0Lmlu
dDY0LCB2b2xhdGlsZVJlZ2lzdGVycy5udW1iZXJPZlNldFJlZ2lzdGVycygpKSk7CisgICAgICAg
ICAgICBtX2Z0bFN0YXRlLmV4Y2VwdGlvbkhhbmRsaW5nU3BpbGxTbG90U3RhY2ttYXBJRCA9IG1f
c3RhY2ttYXBJRHMrKzsKKyAgICAgICAgICAgIG1fb3V0LmNhbGwoCisgICAgICAgICAgICAgICAg
bV9vdXQuc3RhY2ttYXBJbnRyaW5zaWMoKSwgbV9vdXQuY29uc3RJbnQ2NChtX2Z0bFN0YXRlLmV4
Y2VwdGlvbkhhbmRsaW5nU3BpbGxTbG90U3RhY2ttYXBJRCksCisgICAgICAgICAgICAgICAgbV9v
dXQuaW50MzJaZXJvLCBleGNlcHRpb25IYW5kbGluZ1ZvbGF0aWxlUmVnaXN0ZXJzU3BpbGxTbG90
cyk7CisgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIC8vIFdlIHNob3VsZCBub3QgY3JlYXRl
IGFueSBhbGxvY2EncyBhZnRlciB0aGlzIHBvaW50LCBzaW5jZSB0aGV5IHdpbGwgY2Vhc2UgdG8K
ICAgICAgICAgLy8gYmUgbWVtMnJlZyBjYW5kaWRhdGVzLgpAQCAtMjI3MCwxMCArMjI4OSwxOCBA
QCBwcml2YXRlOgogICAgICAgICBpZiAodmVyYm9zZUNvbXBpbGF0aW9uRW5hYmxlZCgpKQogICAg
ICAgICAgICAgZGF0YUxvZygiICAgIEVtaXR0aW5nIFB1dEJ5SWQgcGF0Y2hwb2ludCB3aXRoIHN0
YWNrbWFwICMiLCBzdGFja21hcElELCAiXG4iKTsKICAgICAgICAgCi0gICAgICAgIExWYWx1ZSBj
YWxsID0gbV9vdXQuY2FsbCgKLSAgICAgICAgICAgIG1fb3V0LnBhdGNocG9pbnRWb2lkSW50cmlu
c2ljKCksCi0gICAgICAgICAgICBtX291dC5jb25zdEludDY0KHN0YWNrbWFwSUQpLCBtX291dC5j
b25zdEludDMyKHNpemVPZlB1dEJ5SWQoKSksCi0gICAgICAgICAgICBjb25zdE51bGwobV9vdXQu
cmVmOCksIG1fb3V0LmNvbnN0SW50MzIoMiksIGJhc2UsIHZhbHVlKTsKKyAgICAgICAgRXhpdEFy
Z3VtZW50TGlzdCBhcmd1bWVudHM7IC8vIEZJWE1FOiByZW5hbWUgdGhpcy4KKyAgICAgICAgYXJn
dW1lbnRzLmFwcGVuZChiYXNlKTsgCisgICAgICAgIGFyZ3VtZW50cy5hcHBlbmQodmFsdWUpOwor
CisgICAgICAgIGFwcGVuZE9TUkV4aXRBcmd1bWVudHNGb3JQYXRjaHBvaW50SWZXaWxsQ2F0Y2hF
eGNlcHRpb24oYXJndW1lbnRzLCBMTFZNQW55UmVnQ2FsbENvbnYsIDIpOyAvLyAyIGFyZ3VtZW50
cyBzaG93IHVwIGluIHRoZSBzdGFja21hcCByZWNvcmQ6IHRoZSBiYXNlIGFuZCB0aGUgdmFsdWUu
CisKKyAgICAgICAgYXJndW1lbnRzLmluc2VydCgwLCBtX291dC5jb25zdEludDMyKDIpKTsgCisg
ICAgICAgIGFyZ3VtZW50cy5pbnNlcnQoMCwgY29uc3ROdWxsKG1fb3V0LnJlZjgpKTsgCisgICAg
ICAgIGFyZ3VtZW50cy5pbnNlcnQoMCwgbV9vdXQuY29uc3RJbnQzMihzaXplT2ZQdXRCeUlkKCkp
KTsKKyAgICAgICAgYXJndW1lbnRzLmluc2VydCgwLCBtX291dC5jb25zdEludDY0KHN0YWNrbWFw
SUQpKTsKKworICAgICAgICBMVmFsdWUgY2FsbCA9IG1fb3V0LmNhbGwobV9vdXQucGF0Y2hwb2lu
dFZvaWRJbnRyaW5zaWMoKSwgYXJndW1lbnRzKTsKICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25DYWxs
aW5nQ29udmVudGlvbihjYWxsLCBMTFZNQW55UmVnQ2FsbENvbnYpOwogICAgICAgICAKICAgICAg
ICAgbV9mdGxTdGF0ZS5wdXRCeUlkcy5hcHBlbmQoUHV0QnlJZERlc2NyaXB0b3IoCkBAIC00NDQ2
LDEyICs0NDczLDkgQEAgcHJpdmF0ZToKICAgICAgICAgdW5zaWduZWQgZnJhbWVTaXplID0gSlNT
dGFjazo6Q2FsbEZyYW1lSGVhZGVyU2l6ZSArIG51bUFyZ3M7CiAgICAgICAgIHVuc2lnbmVkIGFs
aWduZWRGcmFtZVNpemUgPSBXVEY6OnJvdW5kVXBUb011bHRpcGxlT2Yoc3RhY2tBbGlnbm1lbnRS
ZWdpc3RlcnMoKSwgZnJhbWVTaXplKTsKICAgICAgICAgdW5zaWduZWQgcGFkZGluZyA9IGFsaWdu
ZWRGcmFtZVNpemUgLSBmcmFtZVNpemU7Ci0KLSAgICAgICAgVmVjdG9yPExWYWx1ZT4gYXJndW1l
bnRzOwotICAgICAgICBhcmd1bWVudHMuYXBwZW5kKG1fb3V0LmNvbnN0SW50NjQoc3RhY2ttYXBJ
RCkpOwotICAgICAgICBhcmd1bWVudHMuYXBwZW5kKG1fb3V0LmNvbnN0SW50MzIoc2l6ZU9mQ2Fs
bCgpKSk7Ci0gICAgICAgIGFyZ3VtZW50cy5hcHBlbmQoY29uc3ROdWxsKG1fb3V0LnJlZjgpKTsK
LSAgICAgICAgYXJndW1lbnRzLmFwcGVuZChtX291dC5jb25zdEludDMyKDEgKyBhbGlnbmVkRnJh
bWVTaXplIC0gSlNTdGFjazo6Q2FsbGVyRnJhbWVBbmRQQ1NpemUpKTsKKyAgICAgICAgLy8gRG9j
dW1lbnRhdGlvbiBhYm91dCBzdGFja21hcCBhbmQgcGF0Y2hwb2ludCBpbnRyaW5zaWNzOgorICAg
ICAgICAvLyBodHRwOi8vbGx2bS5vcmcvZG9jcy9TdGFja01hcHMuaHRtbAorICAgICAgICBFeGl0
QXJndW1lbnRMaXN0IGFyZ3VtZW50czsKICAgICAgICAgYXJndW1lbnRzLmFwcGVuZChqc0NhbGxl
ZSk7IC8vIGNhbGxlZSAtPiAlcmF4CiAgICAgICAgIGFyZ3VtZW50cy5hcHBlbmQoZ2V0VW5kZWYo
bV9vdXQuaW50NjQpKTsgLy8gY29kZSBibG9jawogICAgICAgICBhcmd1bWVudHMuYXBwZW5kKGpz
Q2FsbGVlKTsgLy8gY2FsbGVlIC0+IHN0YWNrCkBAIC00NDYwLDYgKzQ0ODQsMTMgQEAgcHJpdmF0
ZToKICAgICAgICAgICAgIGFyZ3VtZW50cy5hcHBlbmQobG93SlNWYWx1ZShtX2dyYXBoLnZhckFy
Z0NoaWxkKG1fbm9kZSwgMSArIGkpKSk7CiAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBwYWRkaW5nOyArK2kpCiAgICAgICAgICAgICBhcmd1bWVudHMuYXBwZW5kKGdldFVuZGVmKG1f
b3V0LmludDY0KSk7CisKKyAgICAgICAgYXBwZW5kT1NSRXhpdEFyZ3VtZW50c0ZvclBhdGNocG9p
bnRJZldpbGxDYXRjaEV4Y2VwdGlvbihhcmd1bWVudHMsIExMVk1XZWJLaXRKU0NhbGxDb252LCAw
KTsgLy8gTm8gY2FsbCBhcmd1bWVudHMgc2hvdyB1cCBpbiB0aGUgc3RhY2ttYXAgcmVjb3JkLgor
CisgICAgICAgIGFyZ3VtZW50cy5pbnNlcnQoMCwgbV9vdXQuY29uc3RJbnQzMigxICsgYWxpZ25l
ZEZyYW1lU2l6ZSAtIEpTU3RhY2s6OkNhbGxlckZyYW1lQW5kUENTaXplKSk7CisgICAgICAgIGFy
Z3VtZW50cy5pbnNlcnQoMCwgY29uc3ROdWxsKG1fb3V0LnJlZjgpKTsKKyAgICAgICAgYXJndW1l
bnRzLmluc2VydCgwLCBtX291dC5jb25zdEludDMyKHNpemVPZkNhbGwoKSkpOworICAgICAgICBh
cmd1bWVudHMuaW5zZXJ0KDAsIG1fb3V0LmNvbnN0SW50NjQoc3RhY2ttYXBJRCkpOwogICAgICAg
ICAKICAgICAgICAgTFZhbHVlIGNhbGwgPSBtX291dC5jYWxsKG1fb3V0LnBhdGNocG9pbnRJbnQ2
NEludHJpbnNpYygpLCBhcmd1bWVudHMpOwogICAgICAgICBzZXRJbnN0cnVjdGlvbkNhbGxpbmdD
b252ZW50aW9uKGNhbGwsIExMVk1XZWJLaXRKU0NhbGxDb252KTsKQEAgLTQ0OTYsNiArNDUyNywx
MCBAQCBwcml2YXRlOgogICAgICAgICBleGl0QXJndW1lbnRzLmluc2VydCgwLCBtX291dC5jb25z
dEludDMyKHRhaWxDYWxsLmVzdGltYXRlZFNpemUoKSkpOwogICAgICAgICBleGl0QXJndW1lbnRz
Lmluc2VydCgwLCBtX291dC5jb25zdEludDY0KHN0YWNrbWFwSUQpKTsKIAorICAgICAgICAvLyBG
SVhNRTogd2Ugc2hvdWxkIHByb2JhYmx5IG5ldmVyIGhhdmUgYSB0YWlsIGNhbGwgaW5zaWRlIHRy
eS9jYXRjaC4KKyAgICAgICAgLy8gVmVyaWZ5IHRoaXMgaXMgdHJ1ZS4gTGV0cyBhbHNvIGFzc2Vy
dCBhcyBtdWNoLgorICAgICAgICAvL2VtaXRPU1JFeGl0SWZXaWxsQ2F0Y2hFeGNlcHRpb24obV9v
dXQuYm9vbGVhbkZhbHNlLCB0cnVlLCAmYXJndW1lbnRzKTsgLy8gSXQgZG9lc24ndCBtYXR0ZXIg
d2hhdCB0aGUgY29uZGl0aW9uIHdlIHBhc3MgaXQgaXMuCisKICAgICAgICAgTFZhbHVlIGNhbGwg
PQogICAgICAgICAgICAgbV9vdXQuY2FsbChtX291dC5wYXRjaHBvaW50Vm9pZEludHJpbnNpYygp
LCBleGl0QXJndW1lbnRzKTsKICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25DYWxsaW5nQ29udmVudGlv
bihjYWxsLCBMTFZNQW55UmVnQ2FsbENvbnYpOwpAQCAtNDUzMCwxNiArNDU2NSwxOSBAQCBwcml2
YXRlOgogICAgICAgICAKICAgICAgICAgdW5zaWduZWQgc3RhY2ttYXBJRCA9IG1fc3RhY2ttYXBJ
RHMrKzsKICAgICAgICAgCi0gICAgICAgIFZlY3RvcjxMVmFsdWU+IGFyZ3VtZW50czsKLSAgICAg
ICAgYXJndW1lbnRzLmFwcGVuZChtX291dC5jb25zdEludDY0KHN0YWNrbWFwSUQpKTsKLSAgICAg
ICAgYXJndW1lbnRzLmFwcGVuZChtX291dC5jb25zdEludDMyKHNpemVPZklDRm9yKG1fbm9kZSkp
KTsKLSAgICAgICAgYXJndW1lbnRzLmFwcGVuZChjb25zdE51bGwobV9vdXQucmVmOCkpOwotICAg
ICAgICBhcmd1bWVudHMuYXBwZW5kKG1fb3V0LmNvbnN0SW50MzIoMiArICEhanNBcmd1bWVudHMp
KTsKKyAgICAgICAgRXhpdEFyZ3VtZW50TGlzdCBhcmd1bWVudHM7CiAgICAgICAgIGFyZ3VtZW50
cy5hcHBlbmQoanNDYWxsZWUpOwogICAgICAgICBpZiAoanNBcmd1bWVudHMpCiAgICAgICAgICAg
ICBhcmd1bWVudHMuYXBwZW5kKGpzQXJndW1lbnRzKTsKICAgICAgICAgQVNTRVJUKHRoaXNBcmcp
OwogICAgICAgICBhcmd1bWVudHMuYXBwZW5kKHRoaXNBcmcpOworCisgICAgICAgIGFwcGVuZE9T
UkV4aXRBcmd1bWVudHNGb3JQYXRjaHBvaW50SWZXaWxsQ2F0Y2hFeGNlcHRpb24oYXJndW1lbnRz
LCBMTFZNQ0NhbGxDb252LCAwKTsgLy8gTm8gY2FsbCBhcmd1bWVudHMgc2hvdyB1cCBpbiBzdGFj
a21hcCByZWNvcmQuCisKKyAgICAgICAgYXJndW1lbnRzLmluc2VydCgwLCBtX291dC5jb25zdElu
dDMyKDIgKyAhIWpzQXJndW1lbnRzKSk7CisgICAgICAgIGFyZ3VtZW50cy5pbnNlcnQoMCwgY29u
c3ROdWxsKG1fb3V0LnJlZjgpKTsKKyAgICAgICAgYXJndW1lbnRzLmluc2VydCgwLCBtX291dC5j
b25zdEludDMyKHNpemVPZklDRm9yKG1fbm9kZSkpKTsKKyAgICAgICAgYXJndW1lbnRzLmluc2Vy
dCgwLCBtX291dC5jb25zdEludDY0KHN0YWNrbWFwSUQpKTsKICAgICAgICAgCiAgICAgICAgIExW
YWx1ZSBjYWxsID0gbV9vdXQuY2FsbChtX291dC5wYXRjaHBvaW50SW50NjRJbnRyaW5zaWMoKSwg
YXJndW1lbnRzKTsKICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25DYWxsaW5nQ29udmVudGlvbihjYWxs
LCBMTFZNQ0NhbGxDb252KTsKQEAgLTYxMTMsMTAgKzYxNTEsMTcgQEAgcHJpdmF0ZToKICAgICAg
ICAgaWYgKE9wdGlvbnM6OnZlcmJvc2VDb21waWxhdGlvbigpKQogICAgICAgICAgICAgZGF0YUxv
ZygiICAgIEVtaXR0aW5nIEdldEJ5SWQgcGF0Y2hwb2ludCB3aXRoIHN0YWNrbWFwICMiLCBzdGFj
a21hcElELCAiXG4iKTsKICAgICAgICAgCi0gICAgICAgIExWYWx1ZSBjYWxsID0gbV9vdXQuY2Fs
bCgKLSAgICAgICAgICAgIG1fb3V0LnBhdGNocG9pbnRJbnQ2NEludHJpbnNpYygpLAotICAgICAg
ICAgICAgbV9vdXQuY29uc3RJbnQ2NChzdGFja21hcElEKSwgbV9vdXQuY29uc3RJbnQzMihzaXpl
T2ZHZXRCeUlkKCkpLAotICAgICAgICAgICAgY29uc3ROdWxsKG1fb3V0LnJlZjgpLCBtX291dC5j
b25zdEludDMyKDEpLCBiYXNlKTsKKyAgICAgICAgRXhpdEFyZ3VtZW50TGlzdCBhcmd1bWVudHM7
CisgICAgICAgIGFyZ3VtZW50cy5hcHBlbmQoYmFzZSk7CisKKyAgICAgICAgYXBwZW5kT1NSRXhp
dEFyZ3VtZW50c0ZvclBhdGNocG9pbnRJZldpbGxDYXRjaEV4Y2VwdGlvbihhcmd1bWVudHMsIExM
Vk1BbnlSZWdDYWxsQ29udiwgMik7IC8vIDIgYXJndW1lbnRzIHNob3cgdXAgaW4gdGhlIHN0YWNr
bWFwIHJlY29yZDogdGhlIHJlc3VsdCBhbmQgdGhlIGJhc2UuCisKKyAgICAgICAgYXJndW1lbnRz
Lmluc2VydCgwLCBtX291dC5jb25zdEludDMyKDEpKTsgCisgICAgICAgIGFyZ3VtZW50cy5pbnNl
cnQoMCwgY29uc3ROdWxsKG1fb3V0LnJlZjgpKTsKKyAgICAgICAgYXJndW1lbnRzLmluc2VydCgw
LCBtX291dC5jb25zdEludDMyKHNpemVPZkdldEJ5SWQoKSkpOworICAgICAgICBhcmd1bWVudHMu
aW5zZXJ0KDAsIG1fb3V0LmNvbnN0SW50NjQoc3RhY2ttYXBJRCkpOyAKKworICAgICAgICBMVmFs
dWUgY2FsbCA9IG1fb3V0LmNhbGwobV9vdXQucGF0Y2hwb2ludEludDY0SW50cmluc2ljKCksIGFy
Z3VtZW50cyk7CiAgICAgICAgIHNldEluc3RydWN0aW9uQ2FsbGluZ0NvbnZlbnRpb24oY2FsbCwg
TExWTUFueVJlZ0NhbGxDb252KTsKICAgICAgICAgCiAgICAgICAgIG1fZnRsU3RhdGUuZ2V0QnlJ
ZHMuYXBwZW5kKEdldEJ5SWREZXNjcmlwdG9yKHN0YWNrbWFwSUQsIG1fbm9kZS0+b3JpZ2luLnNl
bWFudGljLCB1aWQpKTsKQEAgLTc0NTAsMTIgKzc0OTUsMTUgQEAgcHJpdmF0ZToKICAgICB7CiAg
ICAgICAgIHVuc2lnbmVkIHN0YWNrbWFwSUQgPSBtX3N0YWNrbWFwSURzKys7CiAKLSAgICAgICAg
VmVjdG9yPExWYWx1ZT4gYXJndW1lbnRzOworICAgICAgICBFeGl0QXJndW1lbnRMaXN0IGFyZ3Vt
ZW50czsKICAgICAgICAgYXJndW1lbnRzLmFwcGVuZChtX291dC5jb25zdEludDY0KHN0YWNrbWFw
SUQpKTsKICAgICAgICAgYXJndW1lbnRzLmFwcGVuZChtX291dC5jb25zdEludDMyKE1hY3JvQXNz
ZW1ibGVyOjptYXhKdW1wUmVwbGFjZW1lbnRTaXplKCkpKTsKICAgICAgICAgYXJndW1lbnRzLmFw
cGVuZChjb25zdE51bGwobV9vdXQucmVmOCkpOwogICAgICAgICBhcmd1bWVudHMuYXBwZW5kKG1f
b3V0LmNvbnN0SW50MzIodXNlckFyZ3VtZW50cy5zaXplKCkpKTsKICAgICAgICAgYXJndW1lbnRz
LmFwcGVuZFZlY3Rvcih1c2VyQXJndW1lbnRzKTsKKworICAgICAgICBhcHBlbmRPU1JFeGl0QXJn
dW1lbnRzRm9yUGF0Y2hwb2ludElmV2lsbENhdGNoRXhjZXB0aW9uKGFyZ3VtZW50cywgTExWTUFu
eVJlZ0NhbGxDb252LCB1c2VyQXJndW1lbnRzLnNpemUoKSArIDEsIHRydWUpOyAvLyBBbGwgdGhl
IGFyZ3VtZW50cyBwbHVzIHRoZSByZXN1bHQgc2hvdyB1cCBpbiB0aGUgc3RhY2ttYXAgcmVjb3Jk
LgorCiAgICAgICAgIExWYWx1ZSBjYWxsID0gbV9vdXQuY2FsbChtX291dC5wYXRjaHBvaW50SW50
NjRJbnRyaW5zaWMoKSwgYXJndW1lbnRzKTsKICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25DYWxsaW5n
Q29udmVudGlvbihjYWxsLCBMTFZNQW55UmVnQ2FsbENvbnYpOwogICAgICAgICAKQEAgLTc0NzAs
NyArNzUxOCw3IEBAIHByaXZhdGU6CiAgICAgdm9pZCBzcGVjdWxhdGUoCiAgICAgICAgIEV4aXRL
aW5kIGtpbmQsIEZvcm1hdHRlZFZhbHVlIGxvd1ZhbHVlLCBOb2RlKiBoaWdoVmFsdWUsIExWYWx1
ZSBmYWlsQ29uZGl0aW9uKQogICAgIHsKLSAgICAgICAgYXBwZW5kT1NSRXhpdChraW5kLCBsb3dW
YWx1ZSwgaGlnaFZhbHVlLCBmYWlsQ29uZGl0aW9uKTsKKyAgICAgICAgYXBwZW5kT1NSRXhpdChr
aW5kLCBsb3dWYWx1ZSwgaGlnaFZhbHVlLCBmYWlsQ29uZGl0aW9uLCBtX29yaWdpbik7CiAgICAg
fQogICAgIAogICAgIHZvaWQgdGVybWluYXRlKEV4aXRLaW5kIGtpbmQpCkBAIC03NDk4LDcgKzc1
NDYsNyBAQCBwcml2YXRlOgogICAgICAgICBpZiAoIW1faW50ZXJwcmV0ZXIubmVlZHNUeXBlQ2hl
Y2soaGlnaFZhbHVlLCB0eXBlc1Bhc3NlZFRocm91Z2gpKQogICAgICAgICAgICAgcmV0dXJuOwog
ICAgICAgICBBU1NFUlQobWF5SGF2ZVR5cGVDaGVjayhoaWdoVmFsdWUudXNlS2luZCgpKSk7Ci0g
ICAgICAgIGFwcGVuZE9TUkV4aXQoQmFkVHlwZSwgbG93VmFsdWUsIGhpZ2hWYWx1ZS5ub2RlKCks
IGZhaWxDb25kaXRpb24pOworICAgICAgICBhcHBlbmRPU1JFeGl0KEJhZFR5cGUsIGxvd1ZhbHVl
LCBoaWdoVmFsdWUubm9kZSgpLCBmYWlsQ29uZGl0aW9uLCBtX29yaWdpbik7CiAgICAgICAgIG1f
aW50ZXJwcmV0ZXIuZmlsdGVyKGhpZ2hWYWx1ZSwgdHlwZXNQYXNzZWRUaHJvdWdoKTsKICAgICB9
CiAgICAgCkBAIC04NjU1LDkgKzg3MDMsOSBAQCBwcml2YXRlOgogCiAgICAgdm9pZCBjYWxsUHJl
ZmxpZ2h0KENvZGVPcmlnaW4gY29kZU9yaWdpbikKICAgICB7CisgICAgICAgIENhbGxTaXRlSW5k
ZXggY2FsbFNpdGVJbmRleCA9IG1fZnRsU3RhdGUuaml0Q29kZS0+Y29tbW9uLmFkZENvZGVPcmln
aW4oY29kZU9yaWdpbik7CiAgICAgICAgIG1fb3V0LnN0b3JlMzIoCi0gICAgICAgICAgICBtX291
dC5jb25zdEludDMyKAotICAgICAgICAgICAgICAgIG1fZnRsU3RhdGUuaml0Q29kZS0+Y29tbW9u
LmFkZENvZGVPcmlnaW4oY29kZU9yaWdpbikuYml0cygpKSwKKyAgICAgICAgICAgIG1fb3V0LmNv
bnN0SW50MzIoY2FsbFNpdGVJbmRleC5iaXRzKCkpLAogICAgICAgICAgICAgdGFnRm9yKEpTU3Rh
Y2s6OkFyZ3VtZW50Q291bnQpKTsKICAgICB9CiAKQEAgLTg2ODgsMjMgKzg3MzYsNzkgQEAgcHJp
dmF0ZToKICAgICAgICAgaWYgKE9wdGlvbnM6OnVzZUV4Y2VwdGlvbkZ1enooKSkKICAgICAgICAg
ICAgIG1fb3V0LmNhbGwobV9vdXQub3BlcmF0aW9uKG9wZXJhdGlvbkV4Y2VwdGlvbkZ1enopLCBt
X2NhbGxGcmFtZSk7CiAgICAgICAgIAotICAgICAgICBMQmFzaWNCbG9jayBjb250aW51YXRpb24g
PSBGVExfTkVXX0JMT0NLKG1fb3V0LCAoIkV4Y2VwdGlvbiBjaGVjayBjb250aW51YXRpb24iKSk7
Ci0gICAgICAgIAogICAgICAgICBMVmFsdWUgZXhjZXB0aW9uID0gbV9vdXQubG9hZDY0KG1fb3V0
LmFic29sdXRlKHZtKCkuYWRkcmVzc09mRXhjZXB0aW9uKCkpKTsKLSAgICAgICAgCisgICAgICAg
IExWYWx1ZSBoYWRFeGNlcHRpb24gPSBtX291dC5ub3RaZXJvNjQoZXhjZXB0aW9uKTsKKworICAg
ICAgICBib29sIGVtaXR0ZWRFeGNlcHRpb25IYW5kbGluZ0NvZGVGb3JPU1JFeGl0ID0gZW1pdEJy
YW5jaFRvT1NSRXhpdElmV2lsbENhdGNoRXhjZXB0aW9uKGhhZEV4Y2VwdGlvbik7CisgICAgICAg
IGlmIChlbWl0dGVkRXhjZXB0aW9uSGFuZGxpbmdDb2RlRm9yT1NSRXhpdCkgLy8gSXQgYWxyZWFk
eSB0b29rIGNhcmUgb2YgZXhjZXB0aW9uIGhhbmRsaW5nIGxvZ2ljLgorICAgICAgICAgICAgcmV0
dXJuOworCisgICAgICAgIExCYXNpY0Jsb2NrIGNvbnRpbnVhdGlvbiA9IEZUTF9ORVdfQkxPQ0so
bV9vdXQsICgiRXhjZXB0aW9uIGNoZWNrIGNvbnRpbnVhdGlvbiIpKTsKKwogICAgICAgICBtX291
dC5icmFuY2goCi0gICAgICAgICAgICBtX291dC5ub3RaZXJvNjQoZXhjZXB0aW9uKSwgcmFyZWx5
KG1faGFuZGxlRXhjZXB0aW9ucyksIHVzdWFsbHkoY29udGludWF0aW9uKSk7Ci0gICAgICAgIAor
ICAgICAgICAgICAgaGFkRXhjZXB0aW9uLCByYXJlbHkobV9oYW5kbGVFeGNlcHRpb25zKSwgdXN1
YWxseShjb250aW51YXRpb24pKTsKKwogICAgICAgICBtX291dC5hcHBlbmRUbyhjb250aW51YXRp
b24pOwogICAgIH0KKworICAgIHZvaWQgYXBwZW5kT1NSRXhpdEFyZ3VtZW50c0ZvclBhdGNocG9p
bnRJZldpbGxDYXRjaEV4Y2VwdGlvbihFeGl0QXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIExDYWxs
Q29udiBjYWxsaW5nQ29udmVudGlvbiwgdW5zaWduZWQgb2Zmc2V0T2ZFeGl0QXJndW1lbnRzLCBi
b29sIGlzTGF6eVNsb3dQYXRoID0gZmFsc2UpCisgICAgeworICAgICAgICBDb2RlT3JpZ2luIG9w
Q2F0Y2hPcmlnaW47CisgICAgICAgIEhhbmRsZXJJbmZvKiBleGNlcHRpb25IYW5kbGVyOworICAg
ICAgICBib29sIHdpbGxDYXRjaEV4Y2VwdGlvbiA9IG1fZ3JhcGgud2lsbENhdGNoRXhjZXB0aW9u
SW5NYWNoaW5lRnJhbWUobV9vcmlnaW4uZm9yRXhpdCwgb3BDYXRjaE9yaWdpbiwgZXhjZXB0aW9u
SGFuZGxlcik7CisgICAgICAgIGlmICghd2lsbENhdGNoRXhjZXB0aW9uKQorICAgICAgICAgICAg
cmV0dXJuOworCisgICAgICAgIGFwcGVuZE9TUkV4aXREZXNjcmlwdG9yKFVuY291bnRhYmxlLCBu
b1ZhbHVlKCksIG51bGxwdHIsIG1fb3JpZ2luLndpdGhGb3JFeGl0QW5kRXhpdE9LKG9wQ2F0Y2hP
cmlnaW4sIHRydWUpKTsKKyAgICAgICAgT1NSRXhpdERlc2NyaXB0b3ImIGV4aXREZXNjcmlwdG9y
ID0gbV9mdGxTdGF0ZS5qaXRDb2RlLT5vc3JFeGl0RGVzY3JpcHRvcnMubGFzdCgpOworICAgICAg
ICBleGl0RGVzY3JpcHRvci5tX2lzRXhjZXB0aW9uSGFuZGxlciA9IHRydWU7CisgICAgICAgIGV4
aXREZXNjcmlwdG9yLm1fd2lsbEFycml2ZUF0T1NSRXhpdEZyb21HZW5lcmljVW53aW5kID0gIWlz
TGF6eVNsb3dQYXRoOworICAgICAgICBleGl0RGVzY3JpcHRvci5tX2lzRXhjZXB0aW9uRnJvbUxh
enlTbG93UGF0aCA9IGlzTGF6eVNsb3dQYXRoOworICAgICAgICBleGl0RGVzY3JpcHRvci5tX2lz
RXhjZXB0aW9uRnJvbUpTQ2FsbCA9IGNhbGxpbmdDb252ZW50aW9uID09IExMVk1XZWJLaXRKU0Nh
bGxDb252IHx8IGNhbGxpbmdDb252ZW50aW9uID09IExMVk1DQ2FsbENvbnY7CisgICAgICAgIGV4
aXREZXNjcmlwdG9yLm1fYmFzZWxpbmVFeGNlcHRpb25IYW5kbGVyID0gKmV4Y2VwdGlvbkhhbmRs
ZXI7CisgICAgICAgIGV4aXREZXNjcmlwdG9yLm1fc3RhY2ttYXBJRCA9IG1fc3RhY2ttYXBJRHMg
LSAxOworCisgICAgICAgIEV4aXRBcmd1bWVudExpc3QgZnJlc2hMaXN0OworICAgICAgICBidWls
ZEV4aXRBcmd1bWVudHMoZXhpdERlc2NyaXB0b3IsIGZyZXNoTGlzdCwgbm9WYWx1ZSgpLCBleGl0
RGVzY3JpcHRvci5tX2NvZGVPcmlnaW4pOworICAgICAgICBhcmd1bWVudHMuYXBwZW5kVmVjdG9y
KGZyZXNoTGlzdCk7CisKKyAgICAgICAgaWYgKG9mZnNldE9mRXhpdEFyZ3VtZW50cykgeworICAg
ICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBleGl0RGVzY3JpcHRvci5tX3ZhbHVlcy5z
aXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChleGl0RGVzY3JpcHRvci5tX3ZhbHVl
c1tpXS5oYXNJbmRleEluU3RhY2ttYXBMb2NhdGlvbnMoKSkKKyAgICAgICAgICAgICAgICAgICAg
ZXhpdERlc2NyaXB0b3IubV92YWx1ZXNbaV0uYWRqdXN0U3RhY2ttYXBMb2NhdGlvbnNJbmRleChv
ZmZzZXRPZkV4aXRBcmd1bWVudHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQor
CisgICAgYm9vbCBlbWl0QnJhbmNoVG9PU1JFeGl0SWZXaWxsQ2F0Y2hFeGNlcHRpb24oTFZhbHVl
IGhhZEV4Y2VwdGlvbikKKyAgICB7CisgICAgICAgIENvZGVPcmlnaW4gb3BDYXRjaE9yaWdpbjsK
KyAgICAgICAgSGFuZGxlckluZm8qIGV4Y2VwdGlvbkhhbmRsZXI7CisgICAgICAgIGJvb2wgd2ls
bENhdGNoRXhjZXB0aW9uID0gbV9ncmFwaC53aWxsQ2F0Y2hFeGNlcHRpb25Jbk1hY2hpbmVGcmFt
ZShtX29yaWdpbi5mb3JFeGl0LCBvcENhdGNoT3JpZ2luLCBleGNlcHRpb25IYW5kbGVyKTsgCisg
ICAgICAgIGlmICghd2lsbENhdGNoRXhjZXB0aW9uKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgICAgIGFwcGVuZE9TUkV4aXQoVW5jb3VudGFibGUsIG5vVmFsdWUoKSwgbnVsbHB0
ciwgaGFkRXhjZXB0aW9uLCBtX29yaWdpbi53aXRoRm9yRXhpdEFuZEV4aXRPSyhvcENhdGNoT3Jp
Z2luLCB0cnVlKSwgdHJ1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KICAgICAKICAg
ICBMQmFzaWNCbG9jayBsb3dCbG9jayhCYXNpY0Jsb2NrKiBibG9jaykKICAgICB7CiAgICAgICAg
IHJldHVybiBtX2Jsb2Nrcy5nZXQoYmxvY2spOwogICAgIH0KKworICAgIHZvaWQgYXBwZW5kT1NS
RXhpdERlc2NyaXB0b3IoRXhpdEtpbmQga2luZCwgRm9ybWF0dGVkVmFsdWUgbG93VmFsdWUsIE5v
ZGUqIGhpZ2hWYWx1ZSwgTm9kZU9yaWdpbiBvcmlnaW4pCisgICAgeworICAgICAgICBtX2Z0bFN0
YXRlLmppdENvZGUtPm9zckV4aXREZXNjcmlwdG9ycy5hcHBlbmQoT1NSRXhpdERlc2NyaXB0b3Io
CisgICAgICAgICAgICBraW5kLCBsb3dWYWx1ZS5mb3JtYXQoKSwgbV9ncmFwaC5tZXRob2RPZkdl
dHRpbmdBVmFsdWVQcm9maWxlRm9yKGhpZ2hWYWx1ZSksCisgICAgICAgICAgICBvcmlnaW4uZm9y
RXhpdCwgb3JpZ2luLnNlbWFudGljLAorICAgICAgICAgICAgYXZhaWxhYmlsaXR5TWFwKCkubV9s
b2NhbHMubnVtYmVyT2ZBcmd1bWVudHMoKSwKKyAgICAgICAgICAgIGF2YWlsYWJpbGl0eU1hcCgp
Lm1fbG9jYWxzLm51bWJlck9mTG9jYWxzKCkpKTsKKyAgICB9CiAgICAgCiAgICAgdm9pZCBhcHBl
bmRPU1JFeGl0KAotICAgICAgICBFeGl0S2luZCBraW5kLCBGb3JtYXR0ZWRWYWx1ZSBsb3dWYWx1
ZSwgTm9kZSogaGlnaFZhbHVlLCBMVmFsdWUgZmFpbENvbmRpdGlvbikKKyAgICAgICAgRXhpdEtp
bmQga2luZCwgRm9ybWF0dGVkVmFsdWUgbG93VmFsdWUsIE5vZGUqIGhpZ2hWYWx1ZSwgTFZhbHVl
IGZhaWxDb25kaXRpb24sIAorICAgICAgICBOb2RlT3JpZ2luIG9yaWdpbiwgYm9vbCBpc0V4Y2Vw
dGlvbkhhbmRsZXIgPSBmYWxzZSkKICAgICB7CiAgICAgICAgIGlmICh2ZXJib3NlQ29tcGlsYXRp
b25FbmFibGVkKCkpIHsKICAgICAgICAgICAgIGRhdGFMb2coIiAgICBPU1IgZXhpdCAjIiwgbV9m
dGxTdGF0ZS5qaXRDb2RlLT5vc3JFeGl0RGVzY3JpcHRvcnMuc2l6ZSgpLCAiIHdpdGggYXZhaWxh
YmlsaXR5OiAiLCBhdmFpbGFiaWxpdHlNYXAoKSwgIlxuIik7CkBAIC04NzEyLDkgKzg4MTYsOSBA
QCBwcml2YXRlOgogICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICAgICAgQXZhaWxhYmxlIHJl
Y292ZXJpZXM6ICIsIGxpc3REdW1wKG1fYXZhaWxhYmxlUmVjb3ZlcmllcyksICJcbiIpOwogICAg
ICAgICB9CiAKLSAgICAgICAgREZHX0FTU0VSVChtX2dyYXBoLCBtX25vZGUsIG1fb3JpZ2luLmV4
aXRPSyk7CisgICAgICAgIERGR19BU1NFUlQobV9ncmFwaCwgbV9ub2RlLCBvcmlnaW4uZXhpdE9L
KTsKICAgICAgICAgCi0gICAgICAgIGlmIChkb09TUkV4aXRGdXp6aW5nKCkpIHsKKyAgICAgICAg
aWYgKGRvT1NSRXhpdEZ1enppbmcoKSAmJiAhaXNFeGNlcHRpb25IYW5kbGVyKSB7CiAgICAgICAg
ICAgICBMVmFsdWUgbnVtYmVyT2ZGdXp6Q2hlY2tzID0gbV9vdXQuYWRkKAogICAgICAgICAgICAg
ICAgIG1fb3V0LmxvYWQzMihtX291dC5hYnNvbHV0ZSgmZ19udW1iZXJPZk9TUkV4aXRGdXp6Q2hl
Y2tzKSksCiAgICAgICAgICAgICAgICAgbV9vdXQuaW50MzJPbmUpOwpAQCAtODczNiwxMyArODg0
MCw5IEBAIHByaXZhdGU6CiAgICAgICAgIGlmIChmYWlsQ29uZGl0aW9uID09IG1fb3V0LmJvb2xl
YW5GYWxzZSkKICAgICAgICAgICAgIHJldHVybjsKIAotICAgICAgICBtX2Z0bFN0YXRlLmppdENv
ZGUtPm9zckV4aXREZXNjcmlwdG9ycy5hcHBlbmQoT1NSRXhpdERlc2NyaXB0b3IoCi0gICAgICAg
ICAgICBraW5kLCBsb3dWYWx1ZS5mb3JtYXQoKSwgbV9ncmFwaC5tZXRob2RPZkdldHRpbmdBVmFs
dWVQcm9maWxlRm9yKGhpZ2hWYWx1ZSksCi0gICAgICAgICAgICBtX29yaWdpbi5mb3JFeGl0LCBt
X29yaWdpbi5zZW1hbnRpYywKLSAgICAgICAgICAgIGF2YWlsYWJpbGl0eU1hcCgpLm1fbG9jYWxz
Lm51bWJlck9mQXJndW1lbnRzKCksCi0gICAgICAgICAgICBhdmFpbGFiaWxpdHlNYXAoKS5tX2xv
Y2Fscy5udW1iZXJPZkxvY2FscygpKSk7Ci0KKyAgICAgICAgYXBwZW5kT1NSRXhpdERlc2NyaXB0
b3Ioa2luZCwgbG93VmFsdWUsIGhpZ2hWYWx1ZSwgb3JpZ2luKTsKICAgICAgICAgT1NSRXhpdERl
c2NyaXB0b3ImIGV4aXREZXNjcmlwdG9yID0gbV9mdGxTdGF0ZS5qaXRDb2RlLT5vc3JFeGl0RGVz
Y3JpcHRvcnMubGFzdCgpOworICAgICAgICBleGl0RGVzY3JpcHRvci5tX2lzRXhjZXB0aW9uSGFu
ZGxlciA9IGlzRXhjZXB0aW9uSGFuZGxlcjsKIAogICAgICAgICBpZiAoZmFpbENvbmRpdGlvbiA9
PSBtX291dC5ib29sZWFuVHJ1ZSkgewogICAgICAgICAgICAgZW1pdE9TUkV4aXRDYWxsKGV4aXRE
ZXNjcmlwdG9yLCBsb3dWYWx1ZSk7CkBAIC04ODg2LDYgKzg5ODYsNyBAQCBwcml2YXRlOgogICAg
IHsKICAgICAgICAgQVNTRVJUKG5vZGUtPnNob3VsZEdlbmVyYXRlKCkpOwogICAgICAgICBBU1NF
UlQobm9kZS0+aGFzUmVzdWx0KCkpOworICAgICAgICAvL2RhdGFMb2dGKCIgICAgZXhpdCB2YWx1
ZSBmb3Igbm9kZTogJXVcbiIsIG5vZGUtPmluZGV4KCkpOwogCiAgICAgICAgIGlmIChub2RlKSB7
CiAgICAgICAgICAgICBzd2l0Y2ggKG5vZGUtPm9wKCkpIHsKQEAgLTg5MTAsNyArOTAxMSw3IEBA
IHByaXZhdGU6CiAgICAgICAgICAgICBBdmFpbGFibGVSZWNvdmVyeSByZWNvdmVyeSA9IG1fYXZh
aWxhYmxlUmVjb3Zlcmllc1tpXTsKICAgICAgICAgICAgIGlmIChyZWNvdmVyeS5ub2RlKCkgIT0g
bm9kZSkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIAorICAgICAgICAg
ICAgLy9kYXRhTG9nRigiICAgIHBhcnQgb2YgbV9hdmFpbGFibGVSZWNvdmVyaWVzOiAlbHUsICVs
dVxuIiwgYXJndW1lbnRzLnNpemUoKSwgYXJndW1lbnRzLnNpemUoKSArIDEpOyAKICAgICAgICAg
ICAgIEV4aXRWYWx1ZSByZXN1bHQgPSBFeGl0VmFsdWU6OnJlY292ZXJ5KAogICAgICAgICAgICAg
ICAgIHJlY292ZXJ5Lm9wY29kZSgpLCBhcmd1bWVudHMuc2l6ZSgpLCBhcmd1bWVudHMuc2l6ZSgp
ICsgMSwKICAgICAgICAgICAgICAgICByZWNvdmVyeS5mb3JtYXQoKSk7CkBAIC04OTM4LDggKzkw
MzksMTAgQEAgcHJpdmF0ZToKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgdmFsdWUgPSBt
X2pzVmFsdWVWYWx1ZXMuZ2V0KG5vZGUpOwotICAgICAgICBpZiAoaXNWYWxpZCh2YWx1ZSkpCisg
ICAgICAgIGlmIChpc1ZhbGlkKHZhbHVlKSkgeworICAgICAgICAgICAgLy9kYXRhTG9nRigiICAg
IHBhcnQgb2YgbV9qc1ZhbHVlVmFsdWVzOiAlbHVcbiIsIGFyZ3VtZW50cy5zaXplKCkpOwogICAg
ICAgICAgICAgcmV0dXJuIGV4aXRBcmd1bWVudChhcmd1bWVudHMsIERhdGFGb3JtYXRKUywgdmFs
dWUudmFsdWUoKSk7CisgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIHZhbHVlID0gbV9kb3Vi
bGVWYWx1ZXMuZ2V0KG5vZGUpOwogICAgICAgICBpZiAoaXNWYWxpZCh2YWx1ZSkpCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTE9TUkV4aXQuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMT1NSRXhpdC5jcHAJKHJldmlzaW9uIDE5MTQxMCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMT1NSRXhpdC5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlICJGVExFeGl0QXJndW1lbnQuaCIKICNpbmNs
dWRlICJGVExFeGl0QXJndW1lbnRMaXN0LmgiCiAjaW5jbHVkZSAiRlRMSklUQ29kZS5oIgorI2lu
Y2x1ZGUgIkZUTExvY2F0aW9uLmgiCiAjaW5jbHVkZSAiSlNDSW5saW5lcy5oIgogCiBuYW1lc3Bh
Y2UgSlNDIHsgbmFtZXNwYWNlIEZUTCB7CkBAIC01Miw2ICs1MywxMCBAQCBPU1JFeGl0RGVzY3Jp
cHRvcjo6T1NSRXhpdERlc2NyaXB0b3IoCiAgICAgLCBtX3ZhbHVlUHJvZmlsZSh2YWx1ZVByb2Zp
bGUpCiAgICAgLCBtX3ZhbHVlcyhudW1iZXJPZkFyZ3VtZW50cywgbnVtYmVyT2ZMb2NhbHMpCiAg
ICAgLCBtX2lzSW52YWxpZGF0aW9uUG9pbnQoZmFsc2UpCisgICAgLCBtX2lzRXhjZXB0aW9uSGFu
ZGxlcihmYWxzZSkKKyAgICAsIG1fd2lsbEFycml2ZUF0T1NSRXhpdEZyb21HZW5lcmljVW53aW5k
KGZhbHNlKQorICAgICwgbV9pc0V4Y2VwdGlvbkZyb21KU0NhbGwoZmFsc2UpCisgICAgLCBtX2lz
RXhjZXB0aW9uRnJvbUxhenlTbG93UGF0aChmYWxzZSkKIHsKIH0KIApAQCAtNzAsNiArNzUsNyBA
QCBPU1JFeGl0OjpPU1JFeGl0KE9TUkV4aXREZXNjcmlwdG9yJiBkZXNjCiAgICAgLCBtX2Rlc2Ny
aXB0b3IoZGVzY3JpcHRvcikKICAgICAsIG1fc3RhY2ttYXBSZWNvcmRJbmRleChzdGFja21hcFJl
Y29yZEluZGV4KQogeworICAgIG1faXNFeGNlcHRpb25IYW5kbGVyID0gZGVzY3JpcHRvci5tX2lz
RXhjZXB0aW9uSGFuZGxlcjsKIH0KIAogQ29kZUxvY2F0aW9uSnVtcCBPU1JFeGl0Ojpjb2RlTG9j
YXRpb25Gb3JSZXBhdGNoKENvZGVCbG9jayogZnRsQ29kZUJsb2NrKSBjb25zdApAQCAtODAsNiAr
ODYsNzkgQEAgQ29kZUxvY2F0aW9uSnVtcCBPU1JFeGl0Ojpjb2RlTG9jYXRpb25GbwogICAgICAg
ICBtX3BhdGNoYWJsZUNvZGVPZmZzZXQpOwogfQogCit2b2lkIE9TUkV4aXQ6OmdhdGhlclJlZ2lz
dGVyc1RvU3BpbGxGb3JDYWxsSWZFeGNlcHRpb24oU3RhY2tNYXBzJiBzdGFja21hcHMsIFN0YWNr
TWFwczo6UmVjb3JkJiByZWNvcmQpCit7CisgICAgUkVMRUFTRV9BU1NFUlQobV9kZXNjcmlwdG9y
Lm1faXNFeGNlcHRpb25Gcm9tSlNDYWxsKTsKKworICAgIFJlZ2lzdGVyU2V0IHZvbGF0aWxlUmVn
aXN0ZXJzID0gUmVnaXN0ZXJTZXQ6OmFsbFJlZ2lzdGVycygpOworICAgIHZvbGF0aWxlUmVnaXN0
ZXJzLmV4Y2x1ZGUoUmVnaXN0ZXJTZXQ6OnN0YWNrUmVnaXN0ZXJzKCkpOworICAgIHZvbGF0aWxl
UmVnaXN0ZXJzLmV4Y2x1ZGUoUmVnaXN0ZXJTZXQ6OnJlc2VydmVkSGFyZHdhcmVSZWdpc3RlcnMo
KSk7CisgICAgdm9sYXRpbGVSZWdpc3RlcnMuZXhjbHVkZShSZWdpc3RlclNldDo6dm1DYWxsZWVT
YXZlUmVnaXN0ZXJzKCkpOworCisgICAgYXV0byBhZGROZWVkZWRSZWdpc3RlcnMgPSBbJl0gKGNv
bnN0IEV4aXRWYWx1ZSYgZXhpdFZhbHVlKSB7CisgICAgICAgIGF1dG8gaGFuZGxlTG9jYXRpb24g
PSBbJl0gKGNvbnN0IEZUTDo6TG9jYXRpb24mIGxvY2F0aW9uKSB7CisgICAgICAgICAgICBpZiAo
bG9jYXRpb24uaW52b2x2ZXNHUFIoKSAmJiB2b2xhdGlsZVJlZ2lzdGVycy5nZXQobG9jYXRpb24u
Z3ByKCkpKQorICAgICAgICAgICAgICAgIHRoaXMtPnJlZ2lzdGVyc1RvUHJlc2VydmVGb3JDYWxs
VGhhdE1pZ2h0VGhyb3cuc2V0KGxvY2F0aW9uLmdwcigpKTsKKyAgICAgICAgICAgIGVsc2UgaWYg
KGxvY2F0aW9uLmlzRlBSKCkgJiYgdm9sYXRpbGVSZWdpc3RlcnMuZ2V0KGxvY2F0aW9uLmZwcigp
KSkKKyAgICAgICAgICAgICAgICB0aGlzLT5yZWdpc3RlcnNUb1ByZXNlcnZlRm9yQ2FsbFRoYXRN
aWdodFRocm93LnNldChsb2NhdGlvbi5mcHIoKSk7CisgICAgICAgIH07CisKKyAgICAgICAgc3dp
dGNoIChleGl0VmFsdWUua2luZCgpKSB7CisgICAgICAgIGNhc2UgRXhpdFZhbHVlQXJndW1lbnQ6
CisgICAgICAgICAgICBoYW5kbGVMb2NhdGlvbihGVEw6OkxvY2F0aW9uOjpmb3JTdGFja21hcHMo
JnN0YWNrbWFwcywgcmVjb3JkLmxvY2F0aW9uc1tleGl0VmFsdWUuZXhpdEFyZ3VtZW50KCkuYXJn
dW1lbnQoKV0pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEV4aXRWYWx1ZVJl
Y292ZXJ5OgorICAgICAgICAgICAgaGFuZGxlTG9jYXRpb24oRlRMOjpMb2NhdGlvbjo6Zm9yU3Rh
Y2ttYXBzKCZzdGFja21hcHMsIHJlY29yZC5sb2NhdGlvbnNbZXhpdFZhbHVlLnJpZ2h0UmVjb3Zl
cnlBcmd1bWVudCgpXSkpOworICAgICAgICAgICAgaGFuZGxlTG9jYXRpb24oRlRMOjpMb2NhdGlv
bjo6Zm9yU3RhY2ttYXBzKCZzdGFja21hcHMsIHJlY29yZC5sb2NhdGlvbnNbZXhpdFZhbHVlLmxl
ZnRSZWNvdmVyeUFyZ3VtZW50KCldKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVm
YXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfTsKKyAgICBmb3IgKEV4
aXRUaW1lT2JqZWN0TWF0ZXJpYWxpemF0aW9uKiBtYXRlcmlhbGl6YXRpb24gOiBtX2Rlc2NyaXB0
b3IubV9tYXRlcmlhbGl6YXRpb25zKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgcHJvcGVydHlJ
bmRleCA9IG1hdGVyaWFsaXphdGlvbi0+cHJvcGVydGllcygpLnNpemUoKTsgcHJvcGVydHlJbmRl
eC0tOykKKyAgICAgICAgICAgIGFkZE5lZWRlZFJlZ2lzdGVycyhtYXRlcmlhbGl6YXRpb24tPnBy
b3BlcnRpZXMoKVtwcm9wZXJ0eUluZGV4XS52YWx1ZSgpKTsKKyAgICB9CisgICAgZm9yICh1bnNp
Z25lZCBpbmRleCA9IG1fZGVzY3JpcHRvci5tX3ZhbHVlcy5zaXplKCk7IGluZGV4LS07KQorICAg
ICAgICBhZGROZWVkZWRSZWdpc3RlcnMobV9kZXNjcmlwdG9yLm1fdmFsdWVzW2luZGV4XSk7Cit9
CisKK3ZvaWQgT1NSRXhpdDo6c3BpbGxSZWdpc3RlcnNUb1NwaWxsU2xvdChDQ2FsbEhlbHBlcnMm
IGppdCwgaW50MzJfdCBzdGFja1NwaWxsU2xvdCkKK3sKKyAgICBSRUxFQVNFX0FTU0VSVChtX2Rl
c2NyaXB0b3IubV9pc0V4Y2VwdGlvbkZyb21KU0NhbGwpOworICAgIHVuc2lnbmVkIGNvdW50ID0g
MDsKKyAgICBmb3IgKEdQUlJlZyByZWcgPSBNYWNyb0Fzc2VtYmxlcjo6Zmlyc3RSZWdpc3Rlcigp
OyByZWcgPD0gTWFjcm9Bc3NlbWJsZXI6Omxhc3RSZWdpc3RlcigpOyByZWcgPSBNYWNyb0Fzc2Vt
Ymxlcjo6bmV4dFJlZ2lzdGVyKHJlZykpIHsKKyAgICAgICAgaWYgKHJlZ2lzdGVyc1RvUHJlc2Vy
dmVGb3JDYWxsVGhhdE1pZ2h0VGhyb3cuZ2V0KHJlZykpIHsKKyAgICAgICAgICAgIGppdC5zdG9y
ZTY0KHJlZywgQ0NhbGxIZWxwZXJzOjphZGRyZXNzRm9yKHN0YWNrU3BpbGxTbG90ICsgY291bnQp
KTsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChGUFJS
ZWcgcmVnID0gTWFjcm9Bc3NlbWJsZXI6OmZpcnN0RlBSZWdpc3RlcigpOyByZWcgPD0gTWFjcm9B
c3NlbWJsZXI6Omxhc3RGUFJlZ2lzdGVyKCk7IHJlZyA9IE1hY3JvQXNzZW1ibGVyOjpuZXh0RlBS
ZWdpc3RlcihyZWcpKSB7CisgICAgICAgIGlmIChyZWdpc3RlcnNUb1ByZXNlcnZlRm9yQ2FsbFRo
YXRNaWdodFRocm93LmdldChyZWcpKSB7CisgICAgICAgICAgICBqaXQuc3RvcmVEb3VibGUocmVn
LCBDQ2FsbEhlbHBlcnM6OmFkZHJlc3NGb3Ioc3RhY2tTcGlsbFNsb3QgKyBjb3VudCkpOworICAg
ICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBPU1JFeGl0Ojpy
ZWNvdmVyUmVnaXN0ZXJzRnJvbVNwaWxsU2xvdChDQ2FsbEhlbHBlcnMmIGppdCwgaW50MzJfdCBz
dGFja1NwaWxsU2xvdCkKK3sKKyAgICBSRUxFQVNFX0FTU0VSVChtX2Rlc2NyaXB0b3IubV9pc0V4
Y2VwdGlvbkZyb21KU0NhbGwpOworICAgIHVuc2lnbmVkIGNvdW50ID0gMDsKKyAgICBmb3IgKEdQ
UlJlZyByZWcgPSBNYWNyb0Fzc2VtYmxlcjo6Zmlyc3RSZWdpc3RlcigpOyByZWcgPD0gTWFjcm9B
c3NlbWJsZXI6Omxhc3RSZWdpc3RlcigpOyByZWcgPSBNYWNyb0Fzc2VtYmxlcjo6bmV4dFJlZ2lz
dGVyKHJlZykpIHsKKyAgICAgICAgaWYgKHJlZ2lzdGVyc1RvUHJlc2VydmVGb3JDYWxsVGhhdE1p
Z2h0VGhyb3cuZ2V0KHJlZykpIHsKKyAgICAgICAgICAgIGppdC5sb2FkNjQoQ0NhbGxIZWxwZXJz
OjphZGRyZXNzRm9yKHN0YWNrU3BpbGxTbG90ICsgY291bnQpLCByZWcpOworICAgICAgICAgICAg
Y291bnQrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKEZQUlJlZyByZWcgPSBNYWNyb0Fz
c2VtYmxlcjo6Zmlyc3RGUFJlZ2lzdGVyKCk7IHJlZyA8PSBNYWNyb0Fzc2VtYmxlcjo6bGFzdEZQ
UmVnaXN0ZXIoKTsgcmVnID0gTWFjcm9Bc3NlbWJsZXI6Om5leHRGUFJlZ2lzdGVyKHJlZykpIHsK
KyAgICAgICAgaWYgKHJlZ2lzdGVyc1RvUHJlc2VydmVGb3JDYWxsVGhhdE1pZ2h0VGhyb3cuZ2V0
KHJlZykpIHsKKyAgICAgICAgICAgIGppdC5sb2FkRG91YmxlKENDYWxsSGVscGVyczo6YWRkcmVz
c0ZvcihzdGFja1NwaWxsU2xvdCArIGNvdW50KSwgcmVnKTsKKyAgICAgICAgICAgIGNvdW50Kys7
CisgICAgICAgIH0KKyAgICB9Cit9CisKIH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpGVEwKIAogI2Vu
ZGlmIC8vIEVOQUJMRShGVExfSklUKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9G
VExPU1JFeGl0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExP
U1JFeGl0LmgJKHJldmlzaW9uIDE5MTQxMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwv
RlRMT1NSRXhpdC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNiw4ICszNiwxMSBAQAogI2luY2x1ZGUg
IkZUTEV4aXRUaW1lT2JqZWN0TWF0ZXJpYWxpemF0aW9uLmgiCiAjaW5jbHVkZSAiRlRMRXhpdFZh
bHVlLmgiCiAjaW5jbHVkZSAiRlRMRm9ybWF0dGVkVmFsdWUuaCIKKyNpbmNsdWRlICJGVExTdGFj
a01hcHMuaCIKKyNpbmNsdWRlICJIYW5kbGVySW5mby5oIgogI2luY2x1ZGUgIk1ldGhvZE9mR2V0
dGluZ0FWYWx1ZVByb2ZpbGUuaCIKICNpbmNsdWRlICJPcGVyYW5kcy5oIgorI2luY2x1ZGUgIlJl
Zy5oIgogI2luY2x1ZGUgIlZhbHVlUHJvZmlsZS5oIgogI2luY2x1ZGUgIlZpcnR1YWxSZWdpc3Rl
ci5oIgogCkBAIC0xNTUsOSArMTU4LDE1IEBAIHN0cnVjdCBPU1JFeGl0RGVzY3JpcHRvciB7CiAg
ICAgQmFnPEV4aXRUaW1lT2JqZWN0TWF0ZXJpYWxpemF0aW9uPiBtX21hdGVyaWFsaXphdGlvbnM7
CiAgICAgCiAgICAgdWludDMyX3QgbV9zdGFja21hcElEOwotICAgIGJvb2wgbV9pc0ludmFsaWRh
dGlvblBvaW50OworICAgIEhhbmRsZXJJbmZvIG1fYmFzZWxpbmVFeGNlcHRpb25IYW5kbGVyOwor
ICAgIGJvb2wgbV9pc0ludmFsaWRhdGlvblBvaW50IDogMTsKKyAgICBib29sIG1faXNFeGNlcHRp
b25IYW5kbGVyIDogMTsKKyAgICBib29sIG1fd2lsbEFycml2ZUF0T1NSRXhpdEZyb21HZW5lcmlj
VW53aW5kIDogMTsKKyAgICBib29sIG1faXNFeGNlcHRpb25Gcm9tSlNDYWxsIDogMTsKKyAgICBi
b29sIG1faXNFeGNlcHRpb25Gcm9tTGF6eVNsb3dQYXRoIDogMTsKICAgICAKICAgICB2b2lkIHZh
bGlkYXRlUmVmZXJlbmNlcyhjb25zdCBUcmFja2VkUmVmZXJlbmNlcyYpOworICAgIAogfTsKIAog
c3RydWN0IE9TUkV4aXQgOiBwdWJsaWMgREZHOjpPU1JFeGl0QmFzZSB7CkBAIC0xNzAsMTEgKzE3
OSwxNyBAQCBzdHJ1Y3QgT1NSRXhpdCA6IHB1YmxpYyBERkc6Ok9TUkV4aXRCYXNlCiAgICAgLy8g
T2Zmc2V0IHdpdGhpbiBTdGFja21hcDo6cmVjb3JkcwogICAgIHVpbnQzMl90IG1fc3RhY2ttYXBS
ZWNvcmRJbmRleDsKIAorICAgIFJlZ2lzdGVyU2V0IHJlZ2lzdGVyc1RvUHJlc2VydmVGb3JDYWxs
VGhhdE1pZ2h0VGhyb3c7CisKICAgICBDb2RlTG9jYXRpb25KdW1wIGNvZGVMb2NhdGlvbkZvclJl
cGF0Y2goQ29kZUJsb2NrKiBmdGxDb2RlQmxvY2spIGNvbnN0OwogICAgIHZvaWQgY29uc2lkZXJB
ZGRpbmdBc0ZyZXF1ZW50RXhpdFNpdGUoQ29kZUJsb2NrKiBwcm9maWxlZENvZGVCbG9jaykKICAg
ICB7CiAgICAgICAgIE9TUkV4aXRCYXNlOjpjb25zaWRlckFkZGluZ0FzRnJlcXVlbnRFeGl0U2l0
ZShwcm9maWxlZENvZGVCbG9jaywgRXhpdEZyb21GVEwpOwogICAgIH0KKworICAgIHZvaWQgZ2F0
aGVyUmVnaXN0ZXJzVG9TcGlsbEZvckNhbGxJZkV4Y2VwdGlvbihTdGFja01hcHMmLCBTdGFja01h
cHM6OlJlY29yZCYpOworICAgIHZvaWQgc3BpbGxSZWdpc3RlcnNUb1NwaWxsU2xvdChDQ2FsbEhl
bHBlcnMmLCBpbnQzMl90IHN0YWNrU3BpbGxTbG90KTsKKyAgICB2b2lkIHJlY292ZXJSZWdpc3Rl
cnNGcm9tU3BpbGxTbG90KENDYWxsSGVscGVycyYgaml0LCBpbnQzMl90IHN0YWNrU3BpbGxTbG90
KTsKIH07CiAKIH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpGVEwKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9mdGwvRlRMT1NSRXhpdENvbXBpbGF0aW9uSW5mby5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMT1NSRXhpdENvbXBpbGF0aW9uSW5mby5oCShyZXZp
c2lvbiAxOTE0MTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTE9TUkV4aXRDb21w
aWxhdGlvbkluZm8uaAkod29ya2luZyBjb3B5KQpAQCAtMzksNiArMzksNyBAQCBzdHJ1Y3QgT1NS
RXhpdENvbXBpbGF0aW9uSW5mbyB7CiAgICAgfQogICAgIAogICAgIE1hY3JvQXNzZW1ibGVyOjpM
YWJlbCBtX3RodW5rTGFiZWw7CisgICAgTWFjcm9Bc3NlbWJsZXI6OkxhYmVsIG1fc2tpcEdlbmVy
aWNVbndpbmRUaHVua0xhYmVsOwogICAgIE1hY3JvQXNzZW1ibGVyOjpQYXRjaGFibGVKdW1wIG1f
dGh1bmtKdW1wOwogICAgIENvZGVMb2NhdGlvbkxhYmVsIG1fdGh1bmtBZGRyZXNzOwogfTsKSW5k
ZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMT1NSRXhpdENvbXBpbGVyLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTE9TUkV4aXRDb21waWxlci5j
cHAJKHJldmlzaW9uIDE5MTQxMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMT1NS
RXhpdENvbXBpbGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1
ZGUgIkRGR09TUkV4aXRQcmVwYXJhdGlvbi5oIgogI2luY2x1ZGUgIkZUTEV4aXRBcmd1bWVudEZv
ck9wZXJhbmQuaCIKICNpbmNsdWRlICJGVExKSVRDb2RlLmgiCisjaW5jbHVkZSAiRlRMTG9jYXRp
b24uaCIKICNpbmNsdWRlICJGVExPU1JFeGl0LmgiCiAjaW5jbHVkZSAiRlRMT3BlcmF0aW9ucy5o
IgogI2luY2x1ZGUgIkZUTFN0YXRlLmgiCkBAIC00MCw2ICs0MSw3IEBACiAjaW5jbHVkZSAiTWF4
RnJhbWVFeHRlbnRGb3JTbG93UGF0aENhbGwuaCIKICNpbmNsdWRlICJPcGVyYW5kc0lubGluZXMu
aCIKICNpbmNsdWRlICJKU0NJbmxpbmVzLmgiCisjaW5jbHVkZSAiUmVnLmgiCiAKIG5hbWVzcGFj
ZSBKU0MgeyBuYW1lc3BhY2UgRlRMIHsKIApAQCAtMTc4LDExICsxODAsMjMgQEAgc3RhdGljIHZv
aWQgY29tcGlsZVN0dWIoCiB7CiAgICAgU3RhY2tNYXBzOjpSZWNvcmQqIHJlY29yZCA9ICZqaXRD
b2RlLT5zdGFja21hcHMucmVjb3Jkc1tleGl0Lm1fc3RhY2ttYXBSZWNvcmRJbmRleF07CiAgICAg
UkVMRUFTRV9BU1NFUlQocmVjb3JkLT5wYXRjaHBvaW50SUQgPT0gZXhpdC5tX2Rlc2NyaXB0b3Iu
bV9zdGFja21hcElEKTsKKyAgICBpZiAoc2hvdWxkRHVtcERpc2Fzc2VtYmx5KCkgfHwgT3B0aW9u
czo6dmVyYm9zZU9TUigpIHx8IE9wdGlvbnM6OnZlcmJvc2VGVExPU1JFeGl0KCkpCisgICAgICAg
IGRhdGFMb2coIiAgICBzdGFja21hcCByZWNvcmQgPSAiLCAqcmVjb3JkLCAiXG4iKTsKICAgICAK
ICAgICAvLyBUaGlzIGNvZGUgcmVxdWlyZXMgZnJhbWVQb2ludGVyUmVnaXN0ZXIgaXMgdGhlIHNh
bWUgYXMgY2FsbEZyYW1lUmVnaXN0ZXIKICAgICBzdGF0aWNfYXNzZXJ0KE1hY3JvQXNzZW1ibGVy
OjpmcmFtZVBvaW50ZXJSZWdpc3RlciA9PSBHUFJJbmZvOjpjYWxsRnJhbWVSZWdpc3RlciwgIk1h
Y3JvQXNzZW1ibGVyOjpmcmFtZVBvaW50ZXJSZWdpc3RlciBhbmQgR1BSSW5mbzo6Y2FsbEZyYW1l
UmVnaXN0ZXIgbXVzdCBiZSB0aGUgc2FtZSIpOwogCiAgICAgQ0NhbGxIZWxwZXJzIGppdCh2bSwg
Y29kZUJsb2NrKTsKKworICAgIGJvb2wgaXNPU1JFeGl0SUNhcmVBYm91dCA9IGZhbHNlOworICAg
IGlmIChleGl0Lm1fY29kZU9yaWdpbi5pbmxpbmVDYWxsRnJhbWUKKyAgICAgICAgJiYgc3RyY21w
KGJhc2VsaW5lQ29kZUJsb2NrRm9ySW5saW5lQ2FsbEZyYW1lKGV4aXQubV9jb2RlT3JpZ2luLmlu
bGluZUNhbGxGcmFtZSktPmluZmVycmVkTmFtZSgpLmRhdGEoKSwgImFkZFRvIikgPT0gMAorICAg
ICAgICAmJiBzdHJjbXAoY29kZUJsb2NrLT5pbmZlcnJlZE5hbWUoKS5kYXRhKCksICJydW4iKSA9
PSAwKSB7CisgICAgICAgIC8vZGF0YUxvZygiXG5cblxuPT09PT09PT09PT09PT09PT09PT09PVxu
XG5cbiIpOworICAgICAgICAvL2RhdGFMb2dGKCJPU1JFeGl0OiAldVxuIiwgZXhpdC5tX2Rlc2Ny
aXB0b3IubV9zdGFja21hcElEKTsKKyAgICAgICAgLy9kYXRhTG9nKCJcblxuXG49PT09PT09PT09
PT09PT09PT09PT09XG5cblxuIik7CisgICAgICAgIGlzT1NSRXhpdElDYXJlQWJvdXQgPSB0cnVl
OworICAgIH0KICAgICAKICAgICAvLyBXZSBuZWVkIHNjcmF0Y2ggc3BhY2UgdG8gc2F2ZSBhbGwg
cmVnaXN0ZXJzLCB0byBidWlsZCB1cCB0aGUgSlMgc3RhY2ssIHRvIGRlYWwgd2l0aCB1bndpbmQK
ICAgICAvLyBmaXh1cCwgcG9pbnRlcnMgdG8gYWxsIG9mIHRoZSBvYmplY3RzIHdlIG1hdGVyaWFs
aXplLCBhbmQgdGhlIGVsZW1lbnRzIGluc2lkZSB0aG9zZSBvYmplY3RzCkBAIC0yMjEsNiArMjM1
LDggQEAgc3RhdGljIHZvaWQgY29tcGlsZVN0dWIoCiAgICAgLy8gV2UgZG9uJ3QgY2FyZSBhYm91
dCB0aGUgdmFsdWUgdGhleSBzYXZlZC4gQnV0LCB3ZSBkbyBhcHByZWNpYXRlIHRoZSBmYWN0IHRo
YXQgdGhleSBkaWQgaXQsIGJlY2F1c2Ugd2UgdXNlCiAgICAgLy8gdGhhdCBzbG90IGZvciBzYXZl
QWxsUmVnaXN0ZXJzKCkuCiAKKyAgICAvL2lmIChTdHJpbmcoY29kZUJsb2NrLT5pbmZlcnJlZE5h
bWUoKS5kYXRhKCkpID09IFN0cmluZygiZm9vIikgJiYgZXhpdC5tX2Rlc2NyaXB0b3IubV9zdGFj
a21hcElEID09IDEzKQorICAgIC8vICAgIGppdC5icmVha3BvaW50KCk7CiAgICAgc2F2ZUFsbFJl
Z2lzdGVycyhqaXQsIHJlZ2lzdGVyU2NyYXRjaCk7CiAgICAgCiAgICAgLy8gQnJpbmcgdGhlIHN0
YWNrIGJhY2sgaW50byBhIHNhbmUgZm9ybSBhbmQgYXNzZXJ0IHRoYXQgaXQncyBzYW5lLgpAQCAt
NDI2LDE1ICs0NDIsMjYgQEAgc3RhdGljIHZvaWQgY29tcGlsZVN0dWIoCiAKICAgICBSZWdpc3Rl
clNldCBhbGxGVExDYWxsZWVTYXZlcyA9IFJlZ2lzdGVyU2V0OjpmdGxDYWxsZWVTYXZlUmVnaXN0
ZXJzKCk7CiAgICAgUmVnaXN0ZXJBdE9mZnNldExpc3QqIGJhc2VsaW5lQ2FsbGVlU2F2ZXMgPSBi
YXNlbGluZUNvZGVCbG9jay0+Y2FsbGVlU2F2ZVJlZ2lzdGVycygpOworICAgIFJlZ2lzdGVyQXRP
ZmZzZXRMaXN0KiB2bUNhbGxlZVNhdmVzID0gdm0tPmdldEFsbENhbGxlZVNhdmVSZWdpc3Rlck9m
ZnNldHMoKTsKKyAgICBSZWdpc3RlclNldCBkb250Q29weVZNQ2FsbGVlU2F2ZXMgPSBSZWdpc3Rl
clNldDo6c3RhY2tSZWdpc3RlcnMoKTsKKyAgICBpZiAoZXhpdC5tX2lzRXhjZXB0aW9uSGFuZGxl
cikKKyAgICAgICAgaml0Lm1vdmUoQ0NhbGxIZWxwZXJzOjpUcnVzdGVkSW1tUHRyKHZtLT5jYWxs
ZWVTYXZlUmVnaXN0ZXJzQnVmZmVyKSwgR1BSSW5mbzo6cmVnVDEpOwogCiAgICAgZm9yIChSZWcg
cmVnID0gUmVnOjpmaXJzdCgpOyByZWcgPD0gUmVnOjpsYXN0KCk7IHJlZyA9IHJlZy5uZXh0KCkp
IHsKLSAgICAgICAgaWYgKCFhbGxGVExDYWxsZWVTYXZlcy5nZXQocmVnKSkKKyAgICAgICAgaWYg
KCFhbGxGVExDYWxsZWVTYXZlcy5nZXQocmVnKSkgeworICAgICAgICAgICAgaWYgKGV4aXQubV9p
c0V4Y2VwdGlvbkhhbmRsZXIpCisgICAgICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQoIXZtQ2Fs
bGVlU2F2ZXMtPmZpbmQocmVnKSk7CiAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQog
ICAgICAgICB1bnNpZ25lZCB1bndpbmRJbmRleCA9IGNvZGVCbG9jay0+Y2FsbGVlU2F2ZVJlZ2lz
dGVycygpLT5pbmRleE9mKHJlZyk7CiAgICAgICAgIFJlZ2lzdGVyQXRPZmZzZXQqIGJhc2VsaW5l
UmVnaXN0ZXJPZmZzZXQgPSBiYXNlbGluZUNhbGxlZVNhdmVzLT5maW5kKHJlZyk7CisgICAgICAg
IFJlZ2lzdGVyQXRPZmZzZXQqIHZtQ2FsbGVlU2F2ZSA9IG51bGxwdHI7IAorICAgICAgICBpZiAo
ZXhpdC5tX2lzRXhjZXB0aW9uSGFuZGxlcikKKyAgICAgICAgICAgIHZtQ2FsbGVlU2F2ZSA9IHZt
Q2FsbGVlU2F2ZXMtPmZpbmQocmVnKTsKIAogICAgICAgICBpZiAocmVnLmlzR1BSKCkpIHsKICAg
ICAgICAgICAgIEdQUlJlZyByZWdUb0xvYWQgPSBiYXNlbGluZVJlZ2lzdGVyT2Zmc2V0ID8gR1BS
SW5mbzo6cmVnVDAgOiByZWcuZ3ByKCk7CisgICAgICAgICAgICBSRUxFQVNFX0FTU0VSVChyZWdU
b0xvYWQgIT0gR1BSSW5mbzo6cmVnVDEpOwogCiAgICAgICAgICAgICBpZiAodW53aW5kSW5kZXgg
PT0gVUlOVF9NQVgpIHsKICAgICAgICAgICAgICAgICAvLyBUaGUgRlRMIGNvbXBpbGF0aW9uIGRp
ZG4ndCBwcmVzZXJ2ZSB0aGlzIHJlZ2lzdGVyLiBUaGlzIG1lYW5zIHRoYXQgaXQgYWxzbwpAQCAt
NDUyLDYgKzQ3OSw4IEBAIHN0YXRpYyB2b2lkIGNvbXBpbGVTdHViKAogCiAgICAgICAgICAgICBp
ZiAoYmFzZWxpbmVSZWdpc3Rlck9mZnNldCkKICAgICAgICAgICAgICAgICBqaXQuc3RvcmU2NChy
ZWdUb0xvYWQsIE1hY3JvQXNzZW1ibGVyOjpBZGRyZXNzKE1hY3JvQXNzZW1ibGVyOjpmcmFtZVBv
aW50ZXJSZWdpc3RlciwgYmFzZWxpbmVSZWdpc3Rlck9mZnNldC0+b2Zmc2V0KCkpKTsKKyAgICAg
ICAgICAgIGlmICh2bUNhbGxlZVNhdmUgJiYgIWRvbnRDb3B5Vk1DYWxsZWVTYXZlcy5nZXQodm1D
YWxsZWVTYXZlLT5yZWcoKSkpCisgICAgICAgICAgICAgICAgaml0LnN0b3JlNjQocmVnVG9Mb2Fk
LCBNYWNyb0Fzc2VtYmxlcjo6QWRkcmVzcyhHUFJJbmZvOjpyZWdUMSwgdm1DYWxsZWVTYXZlLT5v
ZmZzZXQoKSkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgRlBSUmVnIGZwUmVnVG9M
b2FkID0gYmFzZWxpbmVSZWdpc3Rlck9mZnNldCA/IEZQUkluZm86OmZwUmVnVDAgOiByZWcuZnBy
KCk7CiAKQEAgLTQ2Miw5ICs0OTEsMjAgQEAgc3RhdGljIHZvaWQgY29tcGlsZVN0dWIoCiAKICAg
ICAgICAgICAgIGlmIChiYXNlbGluZVJlZ2lzdGVyT2Zmc2V0KQogICAgICAgICAgICAgICAgIGpp
dC5zdG9yZURvdWJsZShmcFJlZ1RvTG9hZCwgTWFjcm9Bc3NlbWJsZXI6OkFkZHJlc3MoTWFjcm9B
c3NlbWJsZXI6OmZyYW1lUG9pbnRlclJlZ2lzdGVyLCBiYXNlbGluZVJlZ2lzdGVyT2Zmc2V0LT5v
ZmZzZXQoKSkpOworICAgICAgICAgICAgaWYgKHZtQ2FsbGVlU2F2ZSAmJiAhZG9udENvcHlWTUNh
bGxlZVNhdmVzLmdldCh2bUNhbGxlZVNhdmUtPnJlZygpKSkKKyAgICAgICAgICAgICAgICBqaXQu
c3RvcmVEb3VibGUoZnBSZWdUb0xvYWQsIE1hY3JvQXNzZW1ibGVyOjpBZGRyZXNzKEdQUkluZm86
OnJlZ1QxLCB2bUNhbGxlZVNhdmUtPm9mZnNldCgpKSk7CiAgICAgICAgIH0KICAgICB9CiAKKyAg
ICBpZiAoZXhpdC5tX2lzRXhjZXB0aW9uSGFuZGxlcikgeworICAgICAgICAvL2ppdC5jb3B5Q2Fs
bGVlU2F2ZXNUb1ZNQ2FsbGVlU2F2ZXNCdWZmZXIoKTsgLy8gd2hhdCB3ZSBkaWQgaW4gREZHLCB3
ZSdyZSBkb2luZyB0aGlzIGluIGxvb3AgYWJvdmUgbm93LgorICAgICAgICBSZWdpc3RlckF0T2Zm
c2V0KiB2bUNhbGxlZVNhdmUgPSBudWxscHRyOyAKKyAgICAgICAgdm1DYWxsZWVTYXZlID0gdm1D
YWxsZWVTYXZlcy0+ZmluZChHUFJJbmZvOjp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIpOworICAgICAg
ICBqaXQuc3RvcmU2NChHUFJJbmZvOjp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIsIE1hY3JvQXNzZW1i
bGVyOjpBZGRyZXNzKEdQUkluZm86OnJlZ1QxLCB2bUNhbGxlZVNhdmUtPm9mZnNldCgpKSk7Cisg
ICAgICAgIHZtQ2FsbGVlU2F2ZSA9IHZtQ2FsbGVlU2F2ZXMtPmZpbmQoR1BSSW5mbzo6dGFnTWFz
a1JlZ2lzdGVyKTsKKyAgICAgICAgaml0LnN0b3JlNjQoR1BSSW5mbzo6dGFnTWFza1JlZ2lzdGVy
LCBNYWNyb0Fzc2VtYmxlcjo6QWRkcmVzcyhHUFJJbmZvOjpyZWdUMSwgdm1DYWxsZWVTYXZlLT5v
ZmZzZXQoKSkpOworICAgIH0KKwogICAgIHNpemVfdCBiYXNlbGluZVZpcnR1YWxSZWdpc3RlcnNG
b3JDYWxsZWVTYXZlcyA9IGJhc2VsaW5lQ29kZUJsb2NrLT5jYWxsZWVTYXZlU3BhY2VBc1ZpcnR1
YWxSZWdpc3RlcnMoKTsKIAogICAgIC8vIE5vdyBnZXQgc3RhdGUgb3V0IG9mIHRoZSBzY3JhdGNo
IGJ1ZmZlciBhbmQgcGxhY2UgaXQgYmFjayBpbnRvIHRoZSBzdGFjay4gVGhlIHZhbHVlcyBhcmUK
QEAgLTQ4MSw3ICs1MjEsNyBAQCBzdGF0aWMgdm9pZCBjb21waWxlU3R1YigKICAgICAKICAgICBo
YW5kbGVFeGl0Q291bnRzKGppdCwgZXhpdCk7CiAgICAgcmVpZnlJbmxpbmVkQ2FsbEZyYW1lcyhq
aXQsIGV4aXQpOwotICAgIGFkanVzdEFuZEp1bXBUb1RhcmdldChqaXQsIGV4aXQsIGZhbHNlKTsK
KyAgICBhZGp1c3RBbmRKdW1wVG9UYXJnZXQoaml0LCBleGl0LCBleGl0Lm1faXNFeGNlcHRpb25I
YW5kbGVyKTsKICAgICAKICAgICBMaW5rQnVmZmVyIHBhdGNoQnVmZmVyKCp2bSwgaml0LCBjb2Rl
QmxvY2spOwogICAgIGV4aXQubV9jb2RlID0gRklOQUxJWkVfQ09ERV9JRigKQEAgLTUyMCw2ICs1
NjAsMTEgQEAgZXh0ZXJuICJDIiB2b2lkKiBjb21waWxlRlRMT1NSRXhpdChFeGVjUwogICAgICAg
ICBkYXRhTG9nKCIgICAgT3JpZ2luOiAiLCBleGl0Lm1fY29kZU9yaWdpbiwgIlxuIik7CiAgICAg
ICAgIGlmIChleGl0Lm1fY29kZU9yaWdpbkZvckV4aXRQcm9maWxlICE9IGV4aXQubV9jb2RlT3Jp
Z2luKQogICAgICAgICAgICAgZGF0YUxvZygiICAgIE9yaWdpbiBmb3IgZXhpdCBwcm9maWxlOiAi
LCBleGl0Lm1fY29kZU9yaWdpbkZvckV4aXRQcm9maWxlLCAiXG4iKTsKKyAgICAgICAgZGF0YUxv
ZygiICAgIEV4aXQgc3RhY2ttYXAgSUQ6ICIsIGV4aXQubV9kZXNjcmlwdG9yLm1fc3RhY2ttYXBJ
RCwgIlxuIik7CisgICAgICAgIGRhdGFMb2coIiAgICBDdXJyZW50IGNhbGwgc2l0ZSBpbmRleDog
IiwgZXhlYy0+Y2FsbFNpdGVJbmRleCgpLmJpdHMoKSwgIlxuIik7CisgICAgICAgIGRhdGFMb2co
IiAgICBFeGl0IGlzIGV4Y2VwdGlvbiBoYW5kbGVyOiAiLCBleGl0Lm1faXNFeGNlcHRpb25IYW5k
bGVyLAorICAgICAgICAgICAgIiB3aWxsIGFycml2ZSBhdCBleGl0IGZyb20gZ2VuZXJpY1Vud2lu
ZCgpOiAiLCBleGl0Lm1fZGVzY3JpcHRvci5tX3dpbGxBcnJpdmVBdE9TUkV4aXRGcm9tR2VuZXJp
Y1Vud2luZCwgCisgICAgICAgICAgICAiIHdpbGwgYXJyaXZlIGF0IGV4aXQgZnJvbSBsYXp5IHNs
b3cgcGF0aDogIiwgZXhpdC5tX2Rlc2NyaXB0b3IubV9pc0V4Y2VwdGlvbkZyb21MYXp5U2xvd1Bh
dGgsICJcbiIpOwogICAgICAgICBkYXRhTG9nKCIgICAgRXhpdCB2YWx1ZXM6ICIsIGV4aXQubV9k
ZXNjcmlwdG9yLm1fdmFsdWVzLCAiXG4iKTsKICAgICAgICAgaWYgKCFleGl0Lm1fZGVzY3JpcHRv
ci5tX21hdGVyaWFsaXphdGlvbnMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBkYXRhTG9nKCIg
ICAgTWF0ZXJpYWxpemF0aW9uczpcbiIpOwpAQCAtNTMxLDcgKzU3Niw3IEBAIGV4dGVybiAiQyIg
dm9pZCogY29tcGlsZUZUTE9TUkV4aXQoRXhlY1MKICAgICBwcmVwYXJlQ29kZU9yaWdpbkZvck9T
UkV4aXQoZXhlYywgZXhpdC5tX2NvZGVPcmlnaW4pOwogICAgIAogICAgIGNvbXBpbGVTdHViKGV4
aXRJRCwgaml0Q29kZSwgZXhpdCwgdm0sIGNvZGVCbG9jayk7Ci0gICAgCisKICAgICBNYWNyb0Fz
c2VtYmxlcjo6cmVwYXRjaEp1bXAoCiAgICAgICAgIGV4aXQuY29kZUxvY2F0aW9uRm9yUmVwYXRj
aChjb2RlQmxvY2spLCBDb2RlTG9jYXRpb25MYWJlbChleGl0Lm1fY29kZS5jb2RlKCkpKTsKICAg
ICAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMU3RhdGUuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMU3RhdGUuY3BwCShyZXZpc2lvbiAx
OTE0MTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTFN0YXRlLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtNDksNiArNDksNyBAQCBTdGF0ZTo6U3RhdGUoR3JhcGgmIGdyYXBoKQogICAg
ICwgaGFuZGxlRXhjZXB0aW9uU3RhY2ttYXBJRChVSU5UX01BWCkKICAgICAsIGNhcHR1cmVkU3Rh
Y2ttYXBJRChVSU5UX01BWCkKICAgICAsIHZhcmFyZ3NTcGlsbFNsb3RzU3RhY2ttYXBJRChVSU5U
X01BWCkKKyAgICAsIGV4Y2VwdGlvbkhhbmRsaW5nU3BpbGxTbG90U3RhY2ttYXBJRChVSU5UX01B
WCkKICAgICAsIHVud2luZERhdGFTZWN0aW9uKDApCiAgICAgLCB1bndpbmREYXRhU2VjdGlvblNp
emUoMCkKIHsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMU3RhdGUuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTFN0YXRlLmgJKHJldmlzaW9u
IDE5MTQxMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMU3RhdGUuaAkod29ya2lu
ZyBjb3B5KQpAQCAtNzUsNiArNzUsNyBAQCBwdWJsaWM6CiAgICAgdW5zaWduZWQgaGFuZGxlRXhj
ZXB0aW9uU3RhY2ttYXBJRDsKICAgICB1bnNpZ25lZCBjYXB0dXJlZFN0YWNrbWFwSUQ7CiAgICAg
dW5zaWduZWQgdmFyYXJnc1NwaWxsU2xvdHNTdGFja21hcElEOworICAgIHVuc2lnbmVkIGV4Y2Vw
dGlvbkhhbmRsaW5nU3BpbGxTbG90U3RhY2ttYXBJRDsKICAgICBTZWdtZW50ZWRWZWN0b3I8R2V0
QnlJZERlc2NyaXB0b3I+IGdldEJ5SWRzOwogICAgIFNlZ21lbnRlZFZlY3RvcjxQdXRCeUlkRGVz
Y3JpcHRvcj4gcHV0QnlJZHM7CiAgICAgU2VnbWVudGVkVmVjdG9yPENoZWNrSW5EZXNjcmlwdG9y
PiBjaGVja0luczsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9pbnRlcnByZXRlci9JbnRl
cnByZXRlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2ludGVycHJl
dGVyL0ludGVycHJldGVyLmNwcAkocmV2aXNpb24gMTkxNDEwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2ludGVycHJldGVyL0ludGVycHJldGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTk1
LDEwICs1OTUsMTAgQEAgQUxXQVlTX0lOTElORSBzdGF0aWMgSGFuZGxlckluZm8qIGZpbmRFeAog
CiAgICAgQ2FsbEZyYW1lKiBjYWxsRnJhbWUgPSB2aXNpdG9yLT5jYWxsRnJhbWUoKTsKICAgICB1
bnNpZ25lZCBleGNlcHRpb25IYW5kbGVySW5kZXg7Ci0gICAgaWYgKGNvZGVCbG9jay0+aml0VHlw
ZSgpICE9IEpJVENvZGU6OkRGR0pJVCkKLSAgICAgICAgZXhjZXB0aW9uSGFuZGxlckluZGV4ID0g
Y2FsbEZyYW1lLT5ieXRlY29kZU9mZnNldCgpOwotICAgIGVsc2UKKyAgICBpZiAoSklUQ29kZTo6
aXNPcHRpbWl6aW5nSklUKGNvZGVCbG9jay0+aml0VHlwZSgpKSkKICAgICAgICAgZXhjZXB0aW9u
SGFuZGxlckluZGV4ID0gY2FsbEZyYW1lLT5jYWxsU2l0ZUluZGV4KCkuYml0cygpOworICAgIGVs
c2UKKyAgICAgICAgZXhjZXB0aW9uSGFuZGxlckluZGV4ID0gY2FsbEZyYW1lLT5ieXRlY29kZU9m
ZnNldCgpOwogCiAgICAgcmV0dXJuIGNvZGVCbG9jay0+aGFuZGxlckZvckluZGV4KGV4Y2VwdGlv
bkhhbmRsZXJJbmRleCwgcmVxdWlyZWRIYW5kbGVyKTsKIH0KSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9qaXQvQXNzZW1ibHlIZWxwZXJzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2ppdC9Bc3NlbWJseUhlbHBlcnMuaAkocmV2aXNpb24gMTkxNDEwKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9Bc3NlbWJseUhlbHBlcnMuaAkod29ya2luZyBjb3B5KQpA
QCAtMjkwLDE1ICsyOTAsMjEgQEAgcHVibGljOgogICAgICAgICBSZWdpc3RlclNldCBkb250UmVz
dG9yZVJlZ2lzdGVycyA9IFJlZ2lzdGVyU2V0OjpzdGFja1JlZ2lzdGVycygpOwogICAgICAgICB1
bnNpZ25lZCByZWdpc3RlckNvdW50ID0gYWxsQ2FsbGVlU2F2ZXMtPnNpemUoKTsKICAgICAgICAg
CisgICAgICAgIC8vZGF0YUxvZygiUmVzdG9yaW5nOlxuIik7CiAgICAgICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCByZWdpc3RlckNvdW50OyBpKyspIHsKICAgICAgICAgICAgIFJlZ2lzdGVy
QXRPZmZzZXQgZW50cnkgPSBhbGxDYWxsZWVTYXZlcy0+YXQoaSk7CiAgICAgICAgICAgICBpZiAo
ZG9udFJlc3RvcmVSZWdpc3RlcnMuZ2V0KGVudHJ5LnJlZygpKSkKICAgICAgICAgICAgICAgICBj
b250aW51ZTsKLSAgICAgICAgICAgIGlmIChlbnRyeS5yZWcoKS5pc0dQUigpKQorICAgICAgICAg
ICAgaWYgKGVudHJ5LnJlZygpLmlzR1BSKCkpIHsKKyAgICAgICAgICAgICAgICAvL2RhdGFMb2co
Ilx0IiwgUmVnKGVudHJ5LnJlZygpLmdwcigpKSwgIlxuIik7CiAgICAgICAgICAgICAgICAgbG9h
ZFB0cihBZGRyZXNzKHRlbXAxLCBlbnRyeS5vZmZzZXQoKSksIGVudHJ5LnJlZygpLmdwcigpKTsK
LSAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAg
ICAgICAgICAgICAgIC8vZGF0YUxvZygiXHQiLCBSZWcoZW50cnkucmVnKCkuZnByKCkpLCAiXG4i
KTsKICAgICAgICAgICAgICAgICBsb2FkRG91YmxlKEFkZHJlc3ModGVtcDEsIGVudHJ5Lm9mZnNl
dCgpKSwgZW50cnkucmVnKCkuZnByKCkpOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAg
ICAgIC8vZGF0YUxvZygiXG5cbiIpOwogI2Vsc2UKICAgICAgICAgVU5VU0VEX1BBUkFNKHVzZWRS
ZWdpc3RlcnMpOwogI2VuZGlmCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3Ry
ZXNzL2Z0bC10cnktY2F0Y2gtZ2V0dGVyLXRocm93LmpzCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3MvZnRsLXRyeS1jYXRjaC1nZXR0ZXItdGhyb3cuanMJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNzL2Z0bC10
cnktY2F0Y2gtZ2V0dGVyLXRocm93LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjAgQEAK
K2Z1bmN0aW9uIHJhbmRvbSgpIHsgCisgICAgcmV0dXJuICJibGFoIjsKK30KK25vSW5saW5lKHJh
bmRvbSk7CisKK2Z1bmN0aW9uIGZvbyhvLCBhKSB7CisgICAgbGV0IHggPSBvLmc7CisgICAgbGV0
IHkgPSBvLnk7CisgICAgbGV0IGogPSByYW5kb20oKTsKKyAgICB0cnkgeworICAgICAgICBqID0g
by5mOworICAgIH0gY2F0Y2goZSkgeworICAgICAgICAvL3ByaW50KGopOworICAgICAgICBhc3Nl
cnQoaiA9PT0gImJsYWgiKTsKKyAgICAgICAgcmV0dXJuIHggKyB5ICsgMTsKKyAgICB9CisgICAg
Ly9hc3NlcnQoaiA9PT0gImdldCBmIik7CisgICAgcmV0dXJuIHggKyB5OworfQorCitmdW5jdGlv
biBhc3NlcnQoYikgeworICAgIGlmICghYikKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJiYWQg
dmFsdWUiKQorfQorbm9JbmxpbmUoYXNzZXJ0KTsKKworbm9JbmxpbmUoZm9vKTsKK3ZhciBmbGFn
ID0gZmFsc2U7CitmdW5jdGlvbiBmKGFyZzEsIGFyZzIsIGFyZzMpIHsKKyAgICBpZiAoZmxhZykK
KyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJibGFoIikKKyAgICByZXR1cm4gYXJnMTsKK30KK25v
SW5saW5lKGYpOworbGV0IG8xID0geworICAgIGc6IDIwLAorICAgIHk6IDQwLAorICAgIGY6ICJn
ZXQgZiIKK307CisKK2xldCBvMiA9IHsKKyAgICBnOiAiZyIsCisgICAgeTogInkiLAorICAgIGdl
dCBmKCkgeyAKKyAgICAgICAgaWYgKGZsYWcpIAorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9y
KCJibGFoIik7IAorICAgICAgICByZXR1cm4gImdldCBmIjsKKyAgICB9Cit9CisKK2ZvciAobGV0
IGkgPSAwOyBpIDwgMTAwMDAwOyBpKyspIHsKKyAgICBpZiAoaSAlIDIpIHsKKyAgICAgICAgYXNz
ZXJ0KGZvbyhvMSkgPT09IDYwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhc3NlcnQoZm9vKG8y
KSA9PT0gImd5Iik7CisgICAgfQorfQorZmxhZyA9IHRydWU7CisvL3ByaW50KGZvbyhvMikpOwor
YXNzZXJ0KGZvbyhvMikgPT09ICJneTEiKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90
ZXN0cy9zdHJlc3MvZnRsLXRyeS1jYXRjaC1vb20tZXJyb3IuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy9mdGwtdHJ5LWNhdGNoLW9vbS1lcnJvci5q
cwkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3MvZnRs
LXRyeS1jYXRjaC1vb20tZXJyb3IuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2NyBAQAor
ZnVuY3Rpb24gYXNzZXJ0KGIpIHsKKyAgICBpZiAoIWIpCisgICAgICAgIHRocm93IG5ldyBFcnJv
cigiQmFkIGFzc2VydGlvbiIpOworfQorCitmdW5jdGlvbiBhKCkgeyByZXR1cm4gImEiOyB9Citu
b0lubGluZShhKTsKK2Z1bmN0aW9uIGIoKSB7IHJldHVybiAiYiI7IH0KK25vSW5saW5lKGIpOwor
ZnVuY3Rpb24gYygpIHsgcmV0dXJuICJjIjsgfQorbm9JbmxpbmUoYyk7CitmdW5jdGlvbiBkKCkg
eyByZXR1cm4gImQiOyB9Citub0lubGluZShkKTsKK2Z1bmN0aW9uIGUoKSB7IHJldHVybiAiZSI7
IH0KK25vSW5saW5lKGUpOworZnVuY3Rpb24gZigpIHsgcmV0dXJuICJmIjsgfQorbm9JbmxpbmUo
Zik7CitmdW5jdGlvbiBnKCkgeyByZXR1cm4gImciOyB9Citub0lubGluZShnKTsKKworbGV0IGV4
cFN0cmluZyA9ICJhIjsKK2xldCBleHBvbmVudGlhbEJsb3d1cCA9IGZhbHNlOworbGV0IHNob3Vs
ZEJyZWFrID0gZmFsc2U7CitmdW5jdGlvbiBmb28oZnVuLCBsZWZ0LCByaWdodCkgeworICAgIGxl
dCB4ID0gZnVuKCk7CisgICAgbGV0IHIgPSBsZWZ0ICsgcmlnaHQ7CisKKyAgICB2YXIgX2EgPSBh
KCk7CisgICAgdmFyIF9iID0gYigpOworICAgIHZhciBfYyA9IGMoKTsKKyAgICB2YXIgX2QgPSBk
KCk7CisgICAgdmFyIF9lID0gZSgpOworICAgIHZhciBfZiA9IGYoKTsKKyAgICB2YXIgX2cgPSBn
KCk7CisgICAgdHJ5IHsKKyAgICAgICAgZXhwU3RyaW5nID0gZXhwU3RyaW5nICsgZXhwU3RyaW5n
OworICAgIH0gY2F0Y2goZSkgeworICAgICAgICBzaG91bGRCcmVhayA9IHRydWU7CisKKyAgICAg
ICAgYXNzZXJ0KF9iID09PSAiYiIpOworICAgICAgICBhc3NlcnQoX2MgPT09ICJjIik7CisgICAg
ICAgIGFzc2VydChfZCA9PT0gImQiKTsKKyAgICAgICAgYXNzZXJ0KF9lID09PSAiZSIpOworICAg
ICAgICBhc3NlcnQoX2YgPT09ICJmIik7CisgICAgICAgIGFzc2VydChfZyA9PT0gImciKTsKKyAg
ICB9CisgICAgcmV0dXJuIHggKyByOworfQorbm9JbmxpbmUoZm9vKTsKKworCisKK2Z1bmN0aW9u
IGJsYWgoKSB7IHJldHVybiAiYmxhaCI7IH0KK25vSW5saW5lKGJsYWgpOworCitmb3IgKGxldCBp
ID0gMDsgaSA8IDEwMDAwMDsgaSsrKSB7CisgICAgYXNzZXJ0KGZvbyhibGFoLCAiYiIsICJhIikg
PT09ICJibGFoYmEiKTsKKyAgICBpZiAoIWV4cG9uZW50aWFsQmxvd3VwKQorICAgICAgICBleHBT
dHJpbmcgPSAiYSI7Cit9CisKK2V4cG9uZW50aWFsQmxvd3VwID0gdHJ1ZTsKK3doaWxlICh0cnVl
KSB7CisgICAgYXNzZXJ0KGZvbyhibGFoLCAiYSIsICJiIikgPT09ICJibGFoYWIiKTsKKyAgICBp
ZiAoc2hvdWxkQnJlYWspCisgICAgICAgIGJyZWFrOworfQpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL3Rlc3RzL3N0cmVzcy9mdGwtdHJ5LWNhdGNoLXBhdGNocG9pbnQtd2l0aC12b2xhdGls
ZS1yZWdpc3RlcnMuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3Rz
L3N0cmVzcy9mdGwtdHJ5LWNhdGNoLXBhdGNocG9pbnQtd2l0aC12b2xhdGlsZS1yZWdpc3RlcnMu
anMJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNzL2Z0
bC10cnktY2F0Y2gtcGF0Y2hwb2ludC13aXRoLXZvbGF0aWxlLXJlZ2lzdGVycy5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDczIEBACitmdW5jdGlvbiBhc3NlcnQoYikgeworICAgIGlmICgh
YikKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJCYWQgdmFsdWUuIikKK30KK25vSW5saW5lKGFz
c2VydCk7CisKK3ZhciB2MSA9IDEwMDsKK3ZhciB2MiA9IDIwMDsKK3ZhciBmbGFnID0gZmFsc2U7
Cit2YXIgbzEgPSB7CisgICAgZ2V0IGYoKSB7CisgICAgICAgIGlmIChmbGFnKQorICAgICAgICAg
ICAgdGhyb3cgbmV3IEVycm9yKCJnb3RjaGEhIik7CisgICAgICAgIHJldHVybiB2MTsgICAgCisg
ICAgfQorfQorCitmdW5jdGlvbiBhKCkgeyByZXR1cm4gImEiOyB9Citub0lubGluZShhKTsKK2Z1
bmN0aW9uIGIoKSB7IHJldHVybiAiYiI7IH0KK25vSW5saW5lKGIpOworZnVuY3Rpb24gYygpIHsg
cmV0dXJuICJjIjsgfQorbm9JbmxpbmUoYyk7CitmdW5jdGlvbiBkKCkgeyByZXR1cm4gImQiOyB9
Citub0lubGluZShkKTsKK2Z1bmN0aW9uIGUoKSB7IHJldHVybiAiZSI7IH0KK25vSW5saW5lKGUp
OworZnVuY3Rpb24gZigpIHsgcmV0dXJuICJmIjsgfQorbm9JbmxpbmUoZik7CitmdW5jdGlvbiBn
KCkgeyByZXR1cm4gImciOyB9Citub0lubGluZShnKTsKKwordmFyIG8yID0geworICAgIGdldCBm
KCkgeworICAgICAgICBhc3NlcnQodHJ1ZSk7CisgICAgICAgIGFzc2VydCh0cnVlKTsKKyAgICAg
ICAgYXNzZXJ0KHRydWUpOworICAgICAgICBhc3NlcnQodHJ1ZSk7CisgICAgICAgIGFzc2VydCh0
cnVlKTsKKyAgICAgICAgYXNzZXJ0KHRydWUpOworICAgICAgICBhc3NlcnQodHJ1ZSk7CisgICAg
ICAgIHJldHVybiB2MjsKKyAgICB9Cit9CisKK2Z1bmN0aW9uIGZvbyhvKSB7CisgICAgdHJ5IHsK
KyAgICAgICAgdmFyIF9hID0gYSgpOworICAgICAgICB2YXIgX2IgPSBiKCk7CisgICAgICAgIHZh
ciBfYyA9IGMoKTsKKyAgICAgICAgdmFyIF9kID0gZCgpOworICAgICAgICB2YXIgX2UgPSBlKCk7
CisgICAgICAgIHZhciBfZiA9IGYoKTsKKyAgICAgICAgdmFyIF9nID0gZygpOworCisgICAgICAg
IG8gPSBvLmY7CisKKyAgICB9IGNhdGNoKGUpIHsKKyAgICAgICAgYXNzZXJ0KG8gPT09IG8xKTsK
KyAgICAgICAgYXNzZXJ0KF9iID09PSAiYiIpOworICAgICAgICBhc3NlcnQoX2MgPT09ICJjIik7
CisgICAgICAgIGFzc2VydChfZCA9PT0gImQiKTsKKyAgICAgICAgYXNzZXJ0KF9lID09PSAiZSIp
OworICAgICAgICBhc3NlcnQoX2YgPT09ICJmIik7CisgICAgICAgIGFzc2VydChfZyA9PT0gImci
KTsKKyAgICB9Cit9Citub0lubGluZShmb28pOworCitmb3IgKHZhciBpID0gMDsgaSA8IDEwMDAw
MDA7IGkrKykKKyAgICBmb28oaSAlIDIgPyBvMSA6IG8yKTsKK2ZsYWcgPSB0cnVlOworZm9vKG8x
KTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3MvZnRsLXRyeS1jYXRj
aC1zZXR0ZXItdGhyb3cuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3Rl
c3RzL3N0cmVzcy9mdGwtdHJ5LWNhdGNoLXNldHRlci10aHJvdy5qcwkocmV2aXNpb24gMCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3MvZnRsLXRyeS1jYXRjaC1zZXR0ZXIt
dGhyb3cuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NyBAQAorZnVuY3Rpb24gZm9vKG8s
IGEpIHsKKyAgICBsZXQgeCA9IG8uZzsKKyAgICBsZXQgeSA9IG8ueTsKKyAgICB0cnkgeworICAg
ICAgICBvLmYgPSAyMDsKKyAgICB9IGNhdGNoKGUpIHsKKyAgICAgICAgcmV0dXJuIHggKyB5ICsg
MTsKKyAgICB9CisgICAgcmV0dXJuIHggKyB5OworfQorCitmdW5jdGlvbiBhc3NlcnQoYikgewor
ICAgIGlmICghYikKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJiYWQgdmFsdWUiKQorfQorbm9J
bmxpbmUoYXNzZXJ0KTsKKworbm9JbmxpbmUoZm9vKTsKK3ZhciBmbGFnID0gZmFsc2U7CitmdW5j
dGlvbiBmKGFyZzEsIGFyZzIsIGFyZzMpIHsKKyAgICBpZiAoZmxhZykKKyAgICAgICAgdGhyb3cg
bmV3IEVycm9yKCJibGFoIikKKyAgICByZXR1cm4gYXJnMTsKK30KK25vSW5saW5lKGYpOworbGV0
IG8xID0geworICAgIGc6IDIwLAorICAgIHk6IDQwLAorICAgIGY6IG51bGwKK307CisKK2xldCBv
MiA9IHsKKyAgICBnOiAiZyIsCisgICAgeTogInkiLAorICAgIHNldCBmKHYpIHsgaWYgKGZsYWcp
IHRocm93IG5ldyBFcnJvcigiYmxhaCIpOyB9Cit9CisKK2ZvciAobGV0IGkgPSAwOyBpIDwgMTAw
MDAwOyBpKyspIHsKKyAgICBpZiAoaSAlIDIpIHsKKyAgICAgICAgYXNzZXJ0KGZvbyhvMSkgPT09
IDYwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhc3NlcnQoZm9vKG8yKSA9PT0gImd5Iik7Cisg
ICAgfQorfQorZmxhZyA9IHRydWU7CisvL3ByaW50KGZvbyhvMikpOworYXNzZXJ0KGZvbyhvMikg
PT09ICJneTEiKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3MvZnRs
LXRyeS1jYXRjaC12YXJhcmdzLWNhbGwtdGhyb3dzLmpzCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3MvZnRsLXRyeS1jYXRjaC12YXJhcmdzLWNhbGwtdGhy
b3dzLmpzCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVz
cy9mdGwtdHJ5LWNhdGNoLXZhcmFyZ3MtY2FsbC10aHJvd3MuanMJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSwzMiBAQAorZnVuY3Rpb24gZm9vKG8sIGEpIHsKKyAgICBsZXQgcmVzZXRGbGFnID0g
ZmFsc2U7CisgICAgaWYgKGZsYWcpIHsKKyAgICAgICAgcmVzZXRGbGFnID0gdHJ1ZTsKKyAgICAg
ICAgZmxhZyA9IGZhbHNlOworICAgIH0KKyAgICBsZXQgeCA9IG8oMTApOworICAgIGxldCB5ID0g
bygyMCk7CisgICAgaWYgKHJlc2V0RmxhZykKKyAgICAgICAgZmxhZyA9IHRydWU7CisgICAgdHJ5
IHsKKyAgICAgICAgby5hcHBseShudWxsLCBhKTsKKyAgICB9IGNhdGNoKGUpIHsKKyAgICAgICAg
aWYgKHggIT09IDEwKQorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJOb3QgMTAiKQorICAg
ICAgICByZXR1cm4geCArIHk7CisgICAgfQorfQorbm9JbmxpbmUoZm9vKTsKK3ZhciBmbGFnID0g
ZmFsc2U7CitmdW5jdGlvbiBmKGFyZzEsIGFyZzIsIGFyZzMpIHsKKyAgICBpZiAoZmxhZykKKyAg
ICAgICAgdGhyb3cgbmV3IEVycm9yKCJibGFoIikKKyAgICByZXR1cm4gYXJnMTsKK30KK25vSW5s
aW5lKGYpOworCitmb3IgKGxldCBpID0gMDsgaSA8IDEwMDAwMDsgaSsrKSB7CisgICAgZm9vKGYs
IFsxMCwgMjAsIDMwXSk7Cit9CitmbGFnID0gdHJ1ZTsKK2ZvbyhmLCBbMTAsIDIwLCAzMF0pOwpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy90cnktY2F0Y2gtc3R1Yi1y
b3V0aW5lLXJlcGxhY2VkLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90
ZXN0cy9zdHJlc3MvdHJ5LWNhdGNoLXN0dWItcm91dGluZS1yZXBsYWNlZC5qcwkocmV2aXNpb24g
MTkxNDEwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy90cnktY2F0Y2gt
c3R1Yi1yb3V0aW5lLXJlcGxhY2VkLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0yMSw4ICsyMSwxNSBA
QCBmdW5jdGlvbiBhbGxvY2F0ZSgpIHsKIGZ1bmN0aW9uIGhlbGxvKCkgeyByZXR1cm4gMjA7IH0K
IG5vSW5saW5lKGhlbGxvKTsKIAorbGV0IF9famF6ID0ge307CitmdW5jdGlvbiBqYXp6eSgpIHsK
KyAgICByZXR1cm4gX19qYXo7Cit9Citub0lubGluZShqYXp6eSk7CisKIGZ1bmN0aW9uIGZvbyhv
KSB7CiAgICAgbGV0IGJheiA9IGhlbGxvKCk7CisgICAgbGV0IGpheiA9IGphenp5KCk7CiAgICAg
bGV0IHY7CiAgICAgdHJ5IHsKICAgICAgICAgdiA9IG8uZjsKQEAgLTMwLDYgKzM3LDcgQEAgZnVu
Y3Rpb24gZm9vKG8pIHsKICAgICAgICAgdiA9IG8uZjsKICAgICB9IGNhdGNoKGUpIHsKICAgICAg
ICAgYXNzZXJ0KGJheiA9PT0gMjApOworICAgICAgICBhc3NlcnQoamF6ID09PSBfX2pheik7CiAg
ICAgICAgIGFzc2VydCh2ID09PSAyKTsgLy8gUmVhbGx5IGZsYWdDb3VudC4KICAgICB9CiAgICAg
cmV0dXJuIHY7CkluZGV4OiBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9yaWNo
YXJkcy10cnktY2F0Y2guanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvanMvcmVncmVzcy9z
Y3JpcHQtdGVzdHMvcmljaGFyZHMtdHJ5LWNhdGNoLmpzCShyZXZpc2lvbiAxOTE0MTApCisrKyBM
YXlvdXRUZXN0cy9qcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9yaWNoYXJkcy10cnktY2F0Y2guanMJ
KHdvcmtpbmcgY29weSkKQEAgLTIyMyw3ICsyMjMsNyBAQCBTY2hlZHVsZXIucHJvdG90eXBlLnNj
aGVkdWxlID0gZnVuY3Rpb24gCiAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VGNiID0gdGhp
cy5jdXJyZW50VGNiLmxpbms7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAg
IHRoaXMuY3VycmVudElkID0gdGhpcy5jdXJyZW50VGNiLmlkOwotICAgICAgICAgICAgICAgIHRo
aXMuY3VycmVudFRjYiA9IHRoaXMuY3VycmVudFRjYi5ydW4oKTsKKyAgICAgICAgICAgICAgICB0
aGlzLmN1cnJlbnRUY2IgPSB0aGlzLmN1cnJlbnRUY2IucnVuMigpOwogICAgICAgICAgICAgfQog
ICAgICAgICAgICAgcmFuZG9tRXhjZXB0aW9uKCk7CiAgICAgICAgIH0gY2F0Y2goZSkgeyB9CkBA
IC00MDAsNyArNDAwLDcgQEAgVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUubWFya0FzUnVubmFi
bAogLyoqCiAgKiBSdW5zIHRoaXMgdGFzaywgaWYgaXQgaXMgcmVhZHkgdG8gYmUgcnVuLCBhbmQg
cmV0dXJucyB0aGUgbmV4dCB0YXNrIHRvIHJ1bi4KICAqLwotVGFza0NvbnRyb2xCbG9jay5wcm90
b3R5cGUucnVuID0gZnVuY3Rpb24gKCkgeworVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUucnVu
MiA9IGZ1bmN0aW9uICgpIHsKICAgICB2YXIgcGFja2V0OwogICAgIHRyeSB7CiAgICAgICAgIGlm
ICh0aGlzLnN0YXRlID09IFNUQVRFX1NVU1BFTkRFRF9SVU5OQUJMRSkgewpAQCAtNjI3LDcgKzYy
Nyw3IEBAIEhhbmRsZXJUYXNrLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAocGEKICAgICAgICAg
ICAgICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZXIucXVldWUodik7CiAgICAgICAgICAgICB9CiAg
ICAgICAgIH0KLSAgICAgICAgcmFuZG9tRXhjZXB0aW9uKCk7CisgICAgICAgIC8vcmFuZG9tRXhj
ZXB0aW9uKCk7CiAgICAgfSBjYXRjaChlKSB7IH0KICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZXIu
c3VzcGVuZEN1cnJlbnQoKTsKIH07Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>264653</attachid>
            <date>2015-11-02 18:29:22 -0800</date>
            <delta_ts>2015-11-02 18:34:37 -0800</delta_ts>
            <desc>patch</desc>
            <filename>c-backup.diff</filename>
            <type>text/plain</type>
            <size>95103</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTkxOTMxKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIzNiBA
QAorMjAxNS0xMS0wMiAgU2FhbSBiYXJhdGkgIDxzYmFyYXRpQGFwcGxlLmNvbT4KKworICAgICAg
ICBJbXBsZW1lbnQgdHJ5L2NhdGNoIGluIHRoZSBGVEwKKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0OTQwOQorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoaXMgcGF0Y2ggaW1wbGVtZW50cyB0cnkvY2F0Y2gg
aW4gdGhlIEZUTCBpbiBhIHNpbWlsYXIKKyAgICAgICAgd2F5IHRvIGhvdyBpdCdzIGltcGxlbWVu
dGVkIGluIHRoZSBERkcuIFRoZSBtYWluIGlkZWEgaXMKKyAgICAgICAgdGhpczogYW55dGltZSBh
biBleGNlcHRpb24gaXMgdGhyb3duIGluIGEgdHJ5IGJsb2NrLCAKKyAgICAgICAgd2UgT1NSIGV4
aXQgaW50byB0aGUgYmFzZWxpbmUgSklUJ3MgY29ycmVzcG9uZGluZyBjYXRjaAorICAgICAgICBi
bG9jay4gV2UgY29tcGlsZSBPU1IgZXhpdHMgaW4gYSBmZXcgZm9ybXM6CisgICAgICAgIDEpIEV4
cGxpY2l0IGV4Y2VwdGlvbiBjaGVja3MgdGhhdCBjaGVjayBWTSdzIGV4Y2VwdGlvbgorICAgICAg
ICBwb2ludGVyLiBUaGlzIGlzIG1vZGVsZWQgZXhwbGljaXRseSBpbiBMTFZNIElSLgorICAgICAg
ICAyKSBPU1IgZXhpdHMgdGhhdCBhcmUgYXJyaXZlZCBhdCBmcm9tIGdlbmVyaWNVbndpbmQgCisg
ICAgICAgIGNhdXNlZCBieSBhbiBleGNlcHRpb24gYmVpbmcgdGhyb3duIGluIGEgSlMgY2FsbCAo
aW5jbHVkaW5nCisgICAgICAgIGdldHRlcnMgYW5kIHNldHRlcnMpLgorICAgICAgICAzKSBFeGNl
cHRpb24gZnJvbSBsYXp5IHNsb3cgcGF0aHMuCisgICAgICAgIDQpIEV4Y2VwdGlvbiBmcm9tIGZh
aWxlZCBJQyBDIENhbGwuCisKKyAgICAgICAgQWxsIHN0YWNrbWFwcyBhc3NvY2lhdGVkIHdpdGgg
dGhlIGFib3ZlIHR5cGVzIG9mIGV4aXRzIGFsbCAKKyAgICAgICAgdGFrZSBhcmd1bWVudHMgdGhh
dCBjb3JyZXNwb25kIHRvIHZhcmlhYmxlcyB0aGF0IGFyZSAKKyAgICAgICAgYnl0ZWNvZGUtbGl2
ZSBpbiB0aGUgY2F0Y2ggYmxvY2suCisKKyAgICAgICAgMSkgSXRlbSAxIGlzIHRoZSBzaW1wbGVz
dCBpbXBsZW1lbnRhdGlvbi4gV2hlbiBpbnNpZGUKKyAgICAgICAgYSB0cnkgYmxvY2ssIGV4Y2Vw
dGlvbiBjaGVja3Mgd2lsbCBlbWl0IGEgYnJhbmNoIHRvCisgICAgICAgIGFuIE9TUiBleGl0IHN0
YWNrbWFwIGludHJpbnNpYy4gVGhpcyBzdGFja21hcCBpbnRyaW5zaWMKKyAgICAgICAgdGFrZXMg
YXMgYXJndW1lbnRzIHRoZSBsaXZlIGNhdGNoIHZhcmlhYmxlcy4KKworICAgICAgICAyKSBBbGwg
Zm9ybXMgb2YgY2FsbHMgYW5kIEdldEJ5SWRzIGFuZCBQdXRCeUlkcyBhcmUgaW1wbGVtZW50ZWQK
KyAgICAgICAgYXMgcGF0Y2hwb2ludHMgaW4gTExWTS4gQXMgYSBwYXRjaHBvaW50LCB0aGV5IGhh
dmUgYSBzdGFja21hcCBJRC4KKyAgICAgICAgV2UgdXNlIHRoZSBzYW1lIHN0YWNrbWFwIElEIGZv
ciB0aGUgT1NSIGV4aXQuIFRoZSBPU1IgZXhpdCBhcmd1bWVudHMKKyAgICAgICAgYXJlIGFwcGVu
ZGVkIHRvIHRoZSBlbmQgb2YgdGhlIG5vcm1hbCBhcmd1bWVudHMgZm9yIHRoZSBwYXRjaHBvaW50
LiBUaGVzZQorICAgICAgICB0eXBlcyBvZiBPU1IgZXhpdHMgYXJlIG9ubHkgcmVhY2hlZCBpbmRp
cmVjdGx5IHZpYSBnZW5lcmljVW53aW5kLgorICAgICAgICBUaGVyZWZvcmUsIHRoZSBMTFZNIElS
IHdlIGdlbmVyYXRlIG5ldmVyIGhhcyBhIGRpcmVjdCBicmFuY2ggdG8gdGhlbS4KKyAgICAgICAg
VGhlc2UgYXJlIHRoZSBPU1IgZXhpdHMgd2Ugc3RvcmUgaW4gdGhlIENvZGVCbG9jaydzIGV4Y2Vw
dGlvbiBoYW5kbGluZworICAgICAgICB0YWJsZS4gVGhlIGV4Y2VwdGlvbiBoYW5kbGVycycgY29k
ZSBsb2NhdGlvbnMgcG9pbnQgdG8gdGhlIGJlZ2lubmluZworICAgICAgICBvZiB0aGUgY29ycmVz
cG9uZGluZyBPU1IgZXhpdC4gVGhlcmUgaXMgYW4gaW50ZXJlc3Rpbmcgc3RvcnkgaGVyZQorICAg
ICAgICBhYm91dCBob3cgd2UgcHJlc2VydmUgcmVnaXN0ZXJzLiBMTFZNIHBhdGNocG9pbnRzIGFz
c3VtZSBsYXRlIGNsb2JiZXIsCisgICAgICAgIGkuZSwgdGhleSBhc3N1bWUgd2UgdXNlIHRoZSBw
YXRjaHBvaW50IGFyZ3VtZW50cyBiZWZvcmUgd2UgY2xvYmJlciB0aGVtLgorICAgICAgICBUaGVy
ZWZvcmUsIGl0J3Mgc291bmQgZm9yIExMVk0gdG8gcGFzcyB1cyBhcmd1bWVudHMgaW4gdm9sYXRp
bGUgcmVnaXN0ZXJzLgorICAgICAgICBXZSBtdXN0IHRha2UgY2FyZSB0byBzdG9yZSB0aGUgYXJn
dW1lbnRzIGluIHZvbGF0aWxlIHJlZ2lzdGVycyB0byB0aGUKKyAgICAgICAgc3RhY2sgYmVmb3Jl
IG1ha2luZyBhIGNhbGwuIFdlIGVuc3VyZSB3ZSBoYXZlIHN0YWNrIHNwYWNlIGZvciB0aGVzZQor
ICAgICAgICBieSB1c2luZyBMTFZNJ3MgYWxsb2NhIGluc3RydWN0aW9uLiBUaGVuLCB3aGVuIG1h
a2luZyBhIGNhbGwgaW5zaWRlCisgICAgICAgIGEgdHJ5IGJsb2NrLCB3ZSBzcGlsbCB0aGUgbmVl
ZGVkIHJlZ2lzdGVycywgYW5kIGlmIHRoYXQgY2FsbCB0aHJvd3MsCisgICAgICAgIHdlIG1ha2Ug
c3VyZSB0aGUgT1NSIGV4aXQgZmlsbHMgdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0ZXJzLgorCisg
ICAgICAgIDMpIEV4Y2VwdGlvbnMgZnJvbSBsYXp5IHNsb3cgcGF0aHMgYXJlIHNpbWlsYXIgdG8g
KDIpIGV4Y2VwdCB0aGV5CisgICAgICAgIGRvbid0IGdvIHRocm91Z2ggZ2VuZXJpYyB1bndpbmQu
IFRoZXNlIE9TUiBFeGl0cyBhcmUgYXJyaXZlZCBhdCBmcm9tIGV4cGxpY2l0CisgICAgICAgIGV4
Y2VwdGlvbiBjaGVja3MgaW4gdGhlIGdlbmVyYXRlZCBsYXp5IHNsb3cgcGF0aC4gVGhlcmVmb3Jl
LCB0aGUgY2FsbGZyYW1lCisgICAgICAgIGlzIGludGFjdCB3aGVuIGFycml2aW5nIGF0IHRoZSBP
U1IgZXhpdC4gV2UgbWFrZSBzdXJlIHN1Y2ggbGF6eSBzbG93CisgICAgICAgIHBhdGhzIGV4Y2Vw
dGlvbiBjaGVjayBhcmUgbGlua2VkIHRvIHRoZSBPU1IgZXhpdCdzIGNvZGUgbG9jYXRpb24uCisK
KyAgICAgICAgNCkgVGhpcyBoYXMgYSByZWFsbHkgaW50ZXJlc3RpbmcgcmVnaXN0ZXIgcHJlc2Vy
dmF0aW9uIHN0b3J5LgorICAgICAgICBXZSBtYXkgaGF2ZSBhIEdldEJ5SWQgdGhhdCBoYXMgYW4g
SUMgbWlzcyBhbmQgdGhlcmVmb3JlIGdvZXMKKyAgICAgICAgdGhyb3VnaCB0aGUgRlRMJ3MgY2Fs
bE9wZXJhdGlvbiBtYWNoaW5lcnkuIExMVk0gbWF5IGFsc28KKyAgICAgICAgYXNrIGZvciB0aGUg
cmVzdWx0IHRvIGJlIHBsYWNlZCBpbiB0aGUgc2FtZSByZWdpc3RlciBhcyB0aGUKKyAgICAgICAg
YmFzZS4gVGhlcmVmb3JlLCBhZnRlciB0aGUgY2FsbCwgd2hlbiBzdG9yaW5nIHRvIHRoZSByZXN1
bHQsCisgICAgICAgIHdlIG92ZXJ3cml0ZSB0aGUgYmFzZS4gVGhpcyBjYW4ndCBmbHkgd2l0aCBl
eGNlcHRpb25zIGJlY2F1c2UKKyAgICAgICAgb3BlcmF0aW9uR2V0QnlJZE9wdGltaXplIG1heSB0
aHJvdyBhbiBleGNlcHRpb24gYW5kIHJldHVybiAidW5kZWZpbmVkIi4gV2hhdAorICAgICAgICB3
ZSByZWFsbHkgd2FudCBpcyB0aGUgb3JpZ2luYWwgYmFzZSB2YWx1ZSBmb3IgT1NSIGV4aXQgdmFs
dWUKKyAgICAgICAgcmVjb3ZlcnkuIEluIHRoaXMgY2FzZSwgd2UgdGFrZSBzcGVjaWFsIGNhcmUg
dG8gZmx1c2ggdGhlIGJhc2UgCisgICAgICAgIHZhbHVlIHRvIHRoZSBzdGFjayBiZWZvcmUgdGhl
IGNhbGxPcGVyYXRpb24gR2V0QnlJZCBzbG93IHBhdGguIAorICAgICAgICBMaWtlIGNhbGwgT1NS
IGV4aXRzLCB0aGVzZSB0eXBlcyBvZiBleGl0cyB3aWxsIHJlY292ZXIgdGhlIGJhc2UgCisgICAg
ICAgIHZhbHVlIGZyb20gdGhlIHN0YWNrIHdoZW4gbmVjZXNzYXJ5LgorCisgICAgICAgICogYnl0
ZWNvZGUvQ29kZUJsb2NrLmNwcDoKKyAgICAgICAgKEpTQzo6Q29kZUJsb2NrOjpuZXdFeGNlcHRp
b25IYW5kbGluZ0NhbGxTaXRlSW5kZXgpOgorICAgICAgICAqIGRmZy9ERkdHcmFwaC5jcHA6Cisg
ICAgICAgIChKU0M6OkRGRzo6R3JhcGg6Om1ldGhvZE9mR2V0dGluZ0FWYWx1ZVByb2ZpbGVGb3Ip
OgorICAgICAgICAoSlNDOjpERkc6OkdyYXBoOjp3aWxsQ2F0Y2hFeGNlcHRpb25Jbk1hY2hpbmVG
cmFtZSk6CisgICAgICAgICogZGZnL0RGR0dyYXBoLmg6CisgICAgICAgICogZGZnL0RGR0pJVENv
bXBpbGVyLmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpKSVRDb21waWxlcjo6YXBwZW5kRXhjZXB0
aW9uSGFuZGxpbmdPU1JFeGl0KToKKyAgICAgICAgKEpTQzo6REZHOjpKSVRDb21waWxlcjo6ZXhj
ZXB0aW9uQ2hlY2spOgorICAgICAgICAoSlNDOjpERkc6OkpJVENvbXBpbGVyOjpyZWNvcmRDYWxs
U2l0ZUFuZEdlbmVyYXRlRXhjZXB0aW9uSGFuZGxpbmdPU1JFeGl0SWZOZWVkZWQpOgorICAgICAg
ICAoSlNDOjpERkc6OkpJVENvbXBpbGVyOjp3aWxsQ2F0Y2hFeGNlcHRpb25Jbk1hY2hpbmVGcmFt
ZSk6IERlbGV0ZWQuCisgICAgICAgICogZGZnL0RGR0pJVENvbXBpbGVyLmg6CisgICAgICAgICog
ZGZnL0RGR05vZGVPcmlnaW4uaDoKKyAgICAgICAgKEpTQzo6REZHOjpOb2RlT3JpZ2luOjp3aXRo
U2VtYW50aWMpOgorICAgICAgICAoSlNDOjpERkc6Ok5vZGVPcmlnaW46OndpdGhGb3JFeGl0QW5k
RXhpdE9LKToKKyAgICAgICAgKEpTQzo6REZHOjpOb2RlT3JpZ2luOjp3aXRoRXhpdE9LKToKKyAg
ICAgICAgKiBkZmcvREZHT1NSRXhpdC5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6T1NSRXhpdDo6
T1NSRXhpdCk6CisgICAgICAgICogZGZnL0RGR09TUkV4aXQuaDoKKyAgICAgICAgKEpTQzo6REZH
OjpPU1JFeGl0Ojpjb25zaWRlckFkZGluZ0FzRnJlcXVlbnRFeGl0U2l0ZSk6CisgICAgICAgICog
ZGZnL0RGR09TUkV4aXRCYXNlLmg6CisgICAgICAgIChKU0M6OkRGRzo6T1NSRXhpdEJhc2U6Ok9T
UkV4aXRCYXNlKToKKyAgICAgICAgKEpTQzo6REZHOjpPU1JFeGl0QmFzZTo6Y29uc2lkZXJBZGRp
bmdBc0ZyZXF1ZW50RXhpdFNpdGUpOgorICAgICAgICAqIGRmZy9ERkdPU1JFeGl0Q29tcGlsZXJD
b21tb24uY3BwOgorICAgICAgICAoSlNDOjpERkc6OnJlaWZ5SW5saW5lZENhbGxGcmFtZXMpOgor
ICAgICAgICAqIGRmZy9ERkdUaWVyVXBDaGVja0luamVjdGlvblBoYXNlLmNwcDoKKyAgICAgICAg
KEpTQzo6REZHOjpUaWVyVXBDaGVja0luamVjdGlvblBoYXNlOjpydW4pOgorICAgICAgICAqIGZ0
bC9GVExDb21waWxlLmNwcDoKKyAgICAgICAgKEpTQzo6RlRMOjptbUFsbG9jYXRlRGF0YVNlY3Rp
b24pOgorICAgICAgICAqIGZ0bC9GVExFeGl0QXJndW1lbnQuaDoKKyAgICAgICAgKEpTQzo6RlRM
OjpFeGl0QXJndW1lbnQ6OndpdGhGb3JtYXQpOgorICAgICAgICAoSlNDOjpGVEw6OkV4aXRBcmd1
bWVudDo6cmVwcmVzZW50YXRpb24pOgorICAgICAgICAqIGZ0bC9GVExFeGl0VGh1bmtHZW5lcmF0
b3IuY3BwOgorICAgICAgICAoSlNDOjpGVEw6OkV4aXRUaHVua0dlbmVyYXRvcjo6fkV4aXRUaHVu
a0dlbmVyYXRvcik6CisgICAgICAgIChKU0M6OkZUTDo6RXhpdFRodW5rR2VuZXJhdG9yOjplbWl0
VGh1bmspOgorICAgICAgICAoSlNDOjpGVEw6OkV4aXRUaHVua0dlbmVyYXRvcjo6ZW1pdFRodW5r
cyk6CisgICAgICAgICogZnRsL0ZUTEV4aXRUaHVua0dlbmVyYXRvci5oOgorICAgICAgICAoSlND
OjpGVEw6OkV4aXRUaHVua0dlbmVyYXRvcjo6ZGlkVGhpbmdzKToKKyAgICAgICAgKiBmdGwvRlRM
RXhpdFZhbHVlLmg6CisgICAgICAgIChKU0M6OkZUTDo6RXhpdFZhbHVlOjppc0FyZ3VtZW50KToK
KyAgICAgICAgKEpTQzo6RlRMOjpFeGl0VmFsdWU6OmlzUmVjb3ZlcnkpOgorICAgICAgICAoSlND
OjpGVEw6OkV4aXRWYWx1ZTo6aXNPYmplY3RNYXRlcmlhbGl6YXRpb24pOgorICAgICAgICAoSlND
OjpGVEw6OkV4aXRWYWx1ZTo6aGFzSW5kZXhJblN0YWNrbWFwTG9jYXRpb25zKToKKyAgICAgICAg
KEpTQzo6RlRMOjpFeGl0VmFsdWU6OmV4aXRBcmd1bWVudCk6CisgICAgICAgIChKU0M6OkZUTDo6
RXhpdFZhbHVlOjpyaWdodFJlY292ZXJ5QXJndW1lbnQpOgorICAgICAgICAoSlNDOjpGVEw6OkV4
aXRWYWx1ZTo6YWRqdXN0U3RhY2ttYXBMb2NhdGlvbnNJbmRleEJ5T2Zmc2V0KToKKyAgICAgICAg
KEpTQzo6RlRMOjpFeGl0VmFsdWU6OnJlY292ZXJ5Rm9ybWF0KToKKyAgICAgICAgKiBmdGwvRlRM
SklUQ29kZS5jcHA6CisgICAgICAgIChKU0M6OkZUTDo6SklUQ29kZTo6dmFsaWRhdGVSZWZlcmVu
Y2VzKToKKyAgICAgICAgKEpTQzo6RlRMOjpKSVRDb2RlOjpsaXZlUmVnaXN0ZXJzVG9QcmVzZXJ2
ZUF0RXhjZXB0aW9uSGFuZGxpbmdDYWxsU2l0ZSk6CisgICAgICAgICogZnRsL0ZUTEpTQ2FsbC5j
cHA6CisgICAgICAgIChKU0M6OkZUTDo6SlNDYWxsOjpKU0NhbGwpOgorICAgICAgICAoSlNDOjpG
VEw6OkpTQ2FsbDo6ZW1pdCk6CisgICAgICAgICogZnRsL0ZUTEpTQ2FsbC5oOgorICAgICAgICAo
SlNDOjpGVEw6OkpTQ2FsbDo6c3RhY2ttYXBJRCk6CisgICAgICAgICogZnRsL0ZUTEpTQ2FsbEJh
c2UuY3BwOgorICAgICAgICAoSlNDOjpGVEw6OkpTQ2FsbEJhc2U6OkpTQ2FsbEJhc2UpOgorICAg
ICAgICAoSlNDOjpGVEw6OkpTQ2FsbEJhc2U6OmVtaXQpOgorICAgICAgICAqIGZ0bC9GVExKU0Nh
bGxCYXNlLmg6CisgICAgICAgIChKU0M6OkZUTDo6SlNDYWxsQmFzZTo6c2V0Q2FsbFNpdGVJbmRl
eCk6CisgICAgICAgIChKU0M6OkZUTDo6SlNDYWxsQmFzZTo6Y2FsbFNpdGVEZXNjcmlwdGlvbk9y
aWdpbik6CisgICAgICAgIChKU0M6OkZUTDo6SlNDYWxsQmFzZTo6c2V0Q29ycmVzcG9uZGluZ0dl
bmVyaWNVbndpbmRPU1JFeGl0KToKKyAgICAgICAgKiBmdGwvRlRMSlNDYWxsVmFyYXJncy5jcHA6
CisgICAgICAgIChKU0M6OkZUTDo6SlNDYWxsVmFyYXJnczo6bnVtU3BpbGxTbG90c05lZWRlZCk6
CisgICAgICAgIChKU0M6OkZUTDo6SlNDYWxsVmFyYXJnczo6ZW1pdCk6CisgICAgICAgICogZnRs
L0ZUTEpTQ2FsbFZhcmFyZ3MuaDoKKyAgICAgICAgKEpTQzo6RlRMOjpKU0NhbGxWYXJhcmdzOjpz
dGFja21hcElEKToKKyAgICAgICAgKEpTQzo6RlRMOjpKU0NhbGxWYXJhcmdzOjpvcGVyYXRvcjwp
OgorICAgICAgICAoSlNDOjpGVEw6OkpTQ2FsbFZhcmFyZ3M6OnNldENhbGxTaXRlSW5kZXgpOgor
ICAgICAgICAoSlNDOjpGVEw6OkpTQ2FsbFZhcmFyZ3M6OmNhbGxTaXRlRGVzY3JpcHRpb25Pcmln
aW4pOgorICAgICAgICAoSlNDOjpGVEw6OkpTQ2FsbFZhcmFyZ3M6OnNldENvcnJlc3BvbmRpbmdH
ZW5lcmljVW53aW5kT1NSRXhpdCk6CisgICAgICAgICogZnRsL0ZUTExvd2VyREZHVG9MTFZNLmNw
cDoKKyAgICAgICAgKEpTQzo6RlRMOjpERkc6Okxvd2VyREZHVG9MTFZNOjpsb3dlcik6CisgICAg
ICAgIChKU0M6OkZUTDo6REZHOjpMb3dlckRGR1RvTExWTTo6Y29tcGlsZVB1dEJ5SWQpOgorICAg
ICAgICAoSlNDOjpGVEw6OkRGRzo6TG93ZXJERkdUb0xMVk06OmNvbXBpbGVDYWxsT3JDb25zdHJ1
Y3QpOgorICAgICAgICAoSlNDOjpGVEw6OkRGRzo6TG93ZXJERkdUb0xMVk06OmNvbXBpbGVDYWxs
T3JDb25zdHJ1Y3RWYXJhcmdzKToKKyAgICAgICAgKEpTQzo6RlRMOjpERkc6Okxvd2VyREZHVG9M
TFZNOjpnZXRCeUlkKToKKyAgICAgICAgKEpTQzo6RlRMOjpERkc6Okxvd2VyREZHVG9MTFZNOjps
YXp5U2xvd1BhdGgpOgorICAgICAgICAoSlNDOjpGVEw6OkRGRzo6TG93ZXJERkdUb0xMVk06OnNw
ZWN1bGF0ZSk6CisgICAgICAgIChKU0M6OkZUTDo6REZHOjpMb3dlckRGR1RvTExWTTo6dGVybWlu
YXRlKToKKyAgICAgICAgKEpTQzo6RlRMOjpERkc6Okxvd2VyREZHVG9MTFZNOjphcHBlbmRUeXBl
Q2hlY2spOgorICAgICAgICAoSlNDOjpGVEw6OkRGRzo6TG93ZXJERkdUb0xMVk06OmNhbGxQcmVm
bGlnaHQpOgorICAgICAgICAoSlNDOjpGVEw6OkRGRzo6TG93ZXJERkdUb0xMVk06OmNhbGxDaGVj
ayk6CisgICAgICAgIChKU0M6OkZUTDo6REZHOjpMb3dlckRGR1RvTExWTTo6YXBwZW5kT1NSRXhp
dEFyZ3VtZW50c0ZvclBhdGNocG9pbnRJZldpbGxDYXRjaEV4Y2VwdGlvbik6CisgICAgICAgIChK
U0M6OkZUTDo6REZHOjpMb3dlckRGR1RvTExWTTo6ZW1pdEJyYW5jaFRvT1NSRXhpdElmV2lsbENh
dGNoRXhjZXB0aW9uKToKKyAgICAgICAgKEpTQzo6RlRMOjpERkc6Okxvd2VyREZHVG9MTFZNOjps
b3dCbG9jayk6CisgICAgICAgIChKU0M6OkZUTDo6REZHOjpMb3dlckRGR1RvTExWTTo6YXBwZW5k
T1NSRXhpdERlc2NyaXB0b3IpOgorICAgICAgICAoSlNDOjpGVEw6OkRGRzo6TG93ZXJERkdUb0xM
Vk06OmFwcGVuZE9TUkV4aXQpOgorICAgICAgICAoSlNDOjpGVEw6OkRGRzo6TG93ZXJERkdUb0xM
Vk06OmV4aXRWYWx1ZUZvck5vZGUpOgorICAgICAgICAqIGZ0bC9GVExPU1JFeGl0LmNwcDoKKyAg
ICAgICAgKEpTQzo6RlRMOjpPU1JFeGl0RGVzY3JpcHRvcjo6T1NSRXhpdERlc2NyaXB0b3IpOgor
ICAgICAgICAoSlNDOjpGVEw6Ok9TUkV4aXQ6Ok9TUkV4aXQpOgorICAgICAgICAoSlNDOjpGVEw6
Ok9TUkV4aXQ6OmNvZGVMb2NhdGlvbkZvclJlcGF0Y2gpOgorICAgICAgICAoSlNDOjpGVEw6Ok9T
UkV4aXQ6OmdhdGhlclJlZ2lzdGVyc1RvU3BpbGxGb3JDYWxsSWZFeGNlcHRpb24pOgorICAgICAg
ICAoSlNDOjpGVEw6Ok9TUkV4aXQ6OnNwaWxsUmVnaXN0ZXJzVG9TcGlsbFNsb3QpOgorICAgICAg
ICAoSlNDOjpGVEw6Ok9TUkV4aXQ6OnJlY292ZXJSZWdpc3RlcnNGcm9tU3BpbGxTbG90KToKKyAg
ICAgICAgKiBmdGwvRlRMT1NSRXhpdC5oOgorICAgICAgICAoSlNDOjpGVEw6Ok9TUkV4aXQ6OmNv
bnNpZGVyQWRkaW5nQXNGcmVxdWVudEV4aXRTaXRlKToKKyAgICAgICAgKiBmdGwvRlRMT1NSRXhp
dENvbXBpbGF0aW9uSW5mby5oOgorICAgICAgICAoSlNDOjpGVEw6Ok9TUkV4aXRDb21waWxhdGlv
bkluZm86Ok9TUkV4aXRDb21waWxhdGlvbkluZm8pOgorICAgICAgICAqIGZ0bC9GVExPU1JFeGl0
Q29tcGlsZXIuY3BwOgorICAgICAgICAoSlNDOjpGVEw6OmNvbXBpbGVTdHViKToKKyAgICAgICAg
KEpTQzo6RlRMOjpjb21waWxlRlRMT1NSRXhpdCk6CisgICAgICAgICogZnRsL0ZUTFN0YXRlLmNw
cDoKKyAgICAgICAgKEpTQzo6RlRMOjpTdGF0ZTo6U3RhdGUpOgorICAgICAgICAqIGZ0bC9GVExT
dGF0ZS5oOgorICAgICAgICAqIGludGVycHJldGVyL0ludGVycHJldGVyLmNwcDoKKyAgICAgICAg
KEpTQzo6ZmluZEV4Y2VwdGlvbkhhbmRsZXIpOgorICAgICAgICAqIGppdC9SZWdpc3RlclNldC5j
cHA6CisgICAgICAgIChKU0M6OlJlZ2lzdGVyU2V0OjpzcGVjaWFsUmVnaXN0ZXJzKToKKyAgICAg
ICAgKEpTQzo6UmVnaXN0ZXJTZXQ6OnZvbGF0aWxlUmVnaXN0ZXJzRm9ySlNDYWxsKToKKyAgICAg
ICAgKEpTQzo6UmVnaXN0ZXJTZXQ6OnN0dWJVbmF2YWlsYWJsZVJlZ2lzdGVycyk6CisgICAgICAg
ICogaml0L1JlZ2lzdGVyU2V0Lmg6CisgICAgICAgICogdGVzdHMvc3RyZXNzL2Z0bC10cnktY2F0
Y2gtZ2V0dGVyLWljLWZhaWwtdG8tY2FsbC1vcGVyYXRpb24tdGhyb3ctZXJyb3IuanM6IEFkZGVk
LgorICAgICAgICAoYXNzZXJ0KToKKyAgICAgICAgKGxldC5vVGhyb3cuZ2V0IGYpOgorICAgICAg
ICAobGV0Lm8yLmdldCBmKToKKyAgICAgICAgKGZvbyk6CisgICAgICAgIChmKToKKyAgICAgICAg
KiB0ZXN0cy9zdHJlc3MvZnRsLXRyeS1jYXRjaC1nZXR0ZXItdGhyb3cuanM6IEFkZGVkLgorICAg
ICAgICAocmFuZG9tKToKKyAgICAgICAgKGZvbyk6CisgICAgICAgIChhc3NlcnQpOgorICAgICAg
ICAoZik6CisgICAgICAgIChsZXQubzIuZ2V0IGYpOgorICAgICAgICAqIHRlc3RzL3N0cmVzcy9m
dGwtdHJ5LWNhdGNoLW9vbS1lcnJvci1sYXp5LXNsb3ctcGF0aC5qczogQWRkZWQuCisgICAgICAg
IChhc3NlcnQpOgorICAgICAgICAoYSk6CisgICAgICAgIChiKToKKyAgICAgICAgKGMpOgorICAg
ICAgICAoZCk6CisgICAgICAgIChlKToKKyAgICAgICAgKGYpOgorICAgICAgICAoZyk6CisgICAg
ICAgIChmb28pOgorICAgICAgICAoYmxhaCk6CisgICAgICAgICogdGVzdHMvc3RyZXNzL2Z0bC10
cnktY2F0Y2gtcGF0Y2hwb2ludC13aXRoLXZvbGF0aWxlLXJlZ2lzdGVycy5qczogQWRkZWQuCisg
ICAgICAgIChhc3NlcnQpOgorICAgICAgICAobzEuZ2V0IGYpOgorICAgICAgICAoYSk6CisgICAg
ICAgIChiKToKKyAgICAgICAgKGMpOgorICAgICAgICAoZCk6CisgICAgICAgIChlKToKKyAgICAg
ICAgKGYpOgorICAgICAgICAoZyk6CisgICAgICAgIChvMi5nZXQgZik6CisgICAgICAgIChmb28p
OgorICAgICAgICAqIHRlc3RzL3N0cmVzcy9mdGwtdHJ5LWNhdGNoLXNldHRlci10aHJvdy5qczog
QWRkZWQuCisgICAgICAgIChmb28pOgorICAgICAgICAoYXNzZXJ0KToKKyAgICAgICAgKGYpOgor
ICAgICAgICAobGV0Lm8yLnNldCBmKToKKyAgICAgICAgKiB0ZXN0cy9zdHJlc3MvZnRsLXRyeS1j
YXRjaC10YWlsLWNhbGwtaW5pbG5lZC1jYWxsZXIuanM6IEFkZGVkLgorICAgICAgICAodmFsdWUp
OgorICAgICAgICAoYXNzZXJ0KToKKyAgICAgICAgKHZhbGlkYXRlKToKKyAgICAgICAgKGJhcik6
CisgICAgICAgIChiYXopOgorICAgICAgICAoamF6KToKKyAgICAgICAgKiB0ZXN0cy9zdHJlc3Mv
ZnRsLXRyeS1jYXRjaC12YXJhcmdzLWNhbGwtdGhyb3dzLmpzOiBBZGRlZC4KKyAgICAgICAgKGZv
byk6CisgICAgICAgIChmKToKKyAgICAgICAgKiB0ZXN0cy9zdHJlc3MvdHJ5LWNhdGNoLXN0dWIt
cm91dGluZS1yZXBsYWNlZC5qczoKKyAgICAgICAgKGhlbGxvKToKKyAgICAgICAgKGZvbyk6CisK
IDIwMTUtMTEtMDIgIFNhYW0gYmFyYXRpICA8c2JhcmF0aUBhcHBsZS5jb20+CiAKICAgICAgICAg
V3JvbmcgdmFsdWUgcmVjb3ZlcnkgZm9yIERGRyB0cnkvY2F0Y2ggd2l0aCBhIGdldHRlciB0aGF0
IHRocm93cyBkdXJpbmcgYW4gSUMgbWlzcwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2J5
dGVjb2RlL0NvZGVCbG9jay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2J5dGVjb2RlL0NvZGVCbG9jay5jcHAJKHJldmlzaW9uIDE5MTkzMSkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9ieXRlY29kZS9Db2RlQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOTQ2
LDcgKzI5NDYsNyBAQCBIYW5kbGVySW5mbyogQ29kZUJsb2NrOjpoYW5kbGVyRm9ySW5kZXgoCiBD
YWxsU2l0ZUluZGV4IENvZGVCbG9jazo6bmV3RXhjZXB0aW9uSGFuZGxpbmdDYWxsU2l0ZUluZGV4
KENhbGxTaXRlSW5kZXggb3JpZ2luYWxDYWxsU2l0ZSkKIHsKICNpZiBFTkFCTEUoREZHX0pJVCkK
LSAgICBSRUxFQVNFX0FTU0VSVChqaXRUeXBlKCkgPT0gSklUQ29kZTo6REZHSklUKTsgLy8gRklY
TUU6IFdoZW4gaW1wbGVtZW50aW5nIEZUTCB0cnkvY2F0Y2ggd2Ugc2hvdWxkIGluY2x1ZGUgdGhh
dCBKSVRUeXBlIGhlcmUgYXMgd2VsbDogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTE0OTQwOQorICAgIFJFTEVBU0VfQVNTRVJUKEpJVENvZGU6OmlzT3B0aW1pemluZ0pJ
VChqaXRUeXBlKCkpKTsKICAgICBSRUxFQVNFX0FTU0VSVChjYW5HZXRDb2RlT3JpZ2luKG9yaWdp
bmFsQ2FsbFNpdGUpKTsKICAgICBBU1NFUlQoISFoYW5kbGVyRm9ySW5kZXgob3JpZ2luYWxDYWxs
U2l0ZS5iaXRzKCkpKTsKICAgICBDb2RlT3JpZ2luIG9yaWdpbmFsT3JpZ2luID0gY29kZU9yaWdp
bihvcmlnaW5hbENhbGxTaXRlKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
R3JhcGguY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHR3Jh
cGguY3BwCShyZXZpc2lvbiAxOTE5MzEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RG
R0dyYXBoLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTQ3OSw2ICsxNDc5LDI4IEBAIE1ldGhvZE9m
R2V0dGluZ0FWYWx1ZVByb2ZpbGUgR3JhcGg6Om1ldGgKICAgICByZXR1cm4gTWV0aG9kT2ZHZXR0
aW5nQVZhbHVlUHJvZmlsZSgpOwogfQogCitib29sIEdyYXBoOjp3aWxsQ2F0Y2hFeGNlcHRpb25J
bk1hY2hpbmVGcmFtZShDb2RlT3JpZ2luIGNvZGVPcmlnaW4sIENvZGVPcmlnaW4mIG9wQ2F0Y2hP
cmlnaW5PdXQsIEhhbmRsZXJJbmZvKiYgY2F0Y2hIYW5kbGVyT3V0KQoreworICAgIHVuc2lnbmVk
IGJ5dGVjb2RlSW5kZXhUb0NoZWNrID0gY29kZU9yaWdpbi5ieXRlY29kZUluZGV4OworICAgIHdo
aWxlICgxKSB7CisgICAgICAgIElubGluZUNhbGxGcmFtZSogaW5saW5lQ2FsbEZyYW1lID0gY29k
ZU9yaWdpbi5pbmxpbmVDYWxsRnJhbWU7CisgICAgICAgIENvZGVCbG9jayogY29kZUJsb2NrID0g
YmFzZWxpbmVDb2RlQmxvY2tGb3IoaW5saW5lQ2FsbEZyYW1lKTsKKyAgICAgICAgaWYgKEhhbmRs
ZXJJbmZvKiBoYW5kbGVyID0gY29kZUJsb2NrLT5oYW5kbGVyRm9yQnl0ZWNvZGVPZmZzZXQoYnl0
ZWNvZGVJbmRleFRvQ2hlY2spKSB7CisgICAgICAgICAgICBvcENhdGNoT3JpZ2luT3V0ID0gQ29k
ZU9yaWdpbihoYW5kbGVyLT50YXJnZXQsIGlubGluZUNhbGxGcmFtZSk7CisgICAgICAgICAgICBj
YXRjaEhhbmRsZXJPdXQgPSBoYW5kbGVyOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIH0KKworICAgICAgICBpZiAoIWlubGluZUNhbGxGcmFtZSkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgICAgICBieXRlY29kZUluZGV4VG9DaGVjayA9IGlubGluZUNhbGxGcmFt
ZS0+ZGlyZWN0Q2FsbGVyLmJ5dGVjb2RlSW5kZXg7CisgICAgICAgIGNvZGVPcmlnaW4gPSBjb2Rl
T3JpZ2luLmlubGluZUNhbGxGcmFtZS0+ZGlyZWN0Q2FsbGVyOworICAgIH0KKworICAgIFJFTEVB
U0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7Cit9CisKIH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpERkcK
IAogI2VuZGlmIC8vIEVOQUJMRShERkdfSklUKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdHcmFwaC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcv
REZHR3JhcGguaAkocmV2aXNpb24gMTkxOTMxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdHcmFwaC5oCSh3b3JraW5nIGNvcHkpCkBAIC04MjYsNiArODI2LDggQEAgcHVibGljOgog
ICAgIHZvaWQgZW5zdXJlUHJlUG9zdE51bWJlcmluZygpOwogICAgIHZvaWQgZW5zdXJlTmF0dXJh
bExvb3BzKCk7CiAKKyAgICBib29sIHdpbGxDYXRjaEV4Y2VwdGlvbkluTWFjaGluZUZyYW1lKENv
ZGVPcmlnaW4sIENvZGVPcmlnaW4mIG9wQ2F0Y2hPcmlnaW5PdXQsIEhhbmRsZXJJbmZvKiYgY2F0
Y2hIYW5kbGVyT3V0KTsKKwogICAgIFZNJiBtX3ZtOwogICAgIFBsYW4mIG1fcGxhbjsKICAgICBD
b2RlQmxvY2sqIG1fY29kZUJsb2NrOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdKSVRDb21waWxlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdKSVRDb21waWxlci5jcHAJKHJldmlzaW9uIDE5MTkzMSkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9kZmcvREZHSklUQ29tcGlsZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NjEsMjgg
KzU2MSw2IEBAIHZvaWQgSklUQ29tcGlsZXI6OmFwcGVuZEV4Y2VwdGlvbkhhbmRsaW4KICAgICBt
X2V4Y2VwdGlvbkhhbmRsZXJPU1JFeGl0Q2FsbFNpdGVzLmFwcGVuZChFeGNlcHRpb25IYW5kbGlu
Z09TUkV4aXRJbmZvIHsgZXhpdEluZm8sICpleGNlcHRpb25IYW5kbGVyLCBjYWxsU2l0ZSB9KTsK
IH0KIAotYm9vbCBKSVRDb21waWxlcjo6d2lsbENhdGNoRXhjZXB0aW9uSW5NYWNoaW5lRnJhbWUo
Q29kZU9yaWdpbiBjb2RlT3JpZ2luLCBDb2RlT3JpZ2luJiBvcENhdGNoT3JpZ2luT3V0LCBIYW5k
bGVySW5mbyomIGNhdGNoSGFuZGxlck91dCkKLXsKLSAgICB1bnNpZ25lZCBieXRlY29kZUluZGV4
VG9DaGVjayA9IGNvZGVPcmlnaW4uYnl0ZWNvZGVJbmRleDsKLSAgICB3aGlsZSAoMSkgewotICAg
ICAgICBJbmxpbmVDYWxsRnJhbWUqIGlubGluZUNhbGxGcmFtZSA9IGNvZGVPcmlnaW4uaW5saW5l
Q2FsbEZyYW1lOwotICAgICAgICBDb2RlQmxvY2sqIGNvZGVCbG9jayA9IG1fZ3JhcGguYmFzZWxp
bmVDb2RlQmxvY2tGb3IoaW5saW5lQ2FsbEZyYW1lKTsKLSAgICAgICAgaWYgKEhhbmRsZXJJbmZv
KiBoYW5kbGVyID0gY29kZUJsb2NrLT5oYW5kbGVyRm9yQnl0ZWNvZGVPZmZzZXQoYnl0ZWNvZGVJ
bmRleFRvQ2hlY2spKSB7Ci0gICAgICAgICAgICBvcENhdGNoT3JpZ2luT3V0ID0gQ29kZU9yaWdp
bihoYW5kbGVyLT50YXJnZXQsIGlubGluZUNhbGxGcmFtZSk7Ci0gICAgICAgICAgICBjYXRjaEhh
bmRsZXJPdXQgPSBoYW5kbGVyOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0K
LQotICAgICAgICBpZiAoIWlubGluZUNhbGxGcmFtZSkKLSAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgICAgICBieXRlY29kZUluZGV4VG9DaGVjayA9IGlubGluZUNhbGxGcmFtZS0+ZGly
ZWN0Q2FsbGVyLmJ5dGVjb2RlSW5kZXg7Ci0gICAgICAgIGNvZGVPcmlnaW4gPSBjb2RlT3JpZ2lu
LmlubGluZUNhbGxGcmFtZS0+ZGlyZWN0Q2FsbGVyOwotICAgIH0KLQotICAgIFJFTEVBU0VfQVNT
RVJUX05PVF9SRUFDSEVEKCk7Ci19Ci0KIHZvaWQgSklUQ29tcGlsZXI6OmV4Y2VwdGlvbkNoZWNr
KCkKIHsKICAgICAvLyBJdCdzIGltcG9ydGFudCB0aGF0IHdlIHVzZSBvcmlnaW4uZm9yRXhpdCBo
ZXJlLiBDb25zaWRlciBpZiB3ZSBob2lzdCBzdHJpbmcKQEAgLTYwNyw3ICs1ODUsNyBAQCB2b2lk
IEpJVENvbXBpbGVyOjpleGNlcHRpb25DaGVjaygpCiAgICAgLy8gfQogICAgIENvZGVPcmlnaW4g
b3BDYXRjaE9yaWdpbjsKICAgICBIYW5kbGVySW5mbyogZXhjZXB0aW9uSGFuZGxlcjsKLSAgICBi
b29sIHdpbGxDYXRjaEV4Y2VwdGlvbiA9IHdpbGxDYXRjaEV4Y2VwdGlvbkluTWFjaGluZUZyYW1l
KG1fc3BlY3VsYXRpdmUtPm1fY3VycmVudE5vZGUtPm9yaWdpbi5mb3JFeGl0LCBvcENhdGNoT3Jp
Z2luLCBleGNlcHRpb25IYW5kbGVyKTsgCisgICAgYm9vbCB3aWxsQ2F0Y2hFeGNlcHRpb24gPSBt
X2dyYXBoLndpbGxDYXRjaEV4Y2VwdGlvbkluTWFjaGluZUZyYW1lKG1fc3BlY3VsYXRpdmUtPm1f
Y3VycmVudE5vZGUtPm9yaWdpbi5mb3JFeGl0LCBvcENhdGNoT3JpZ2luLCBleGNlcHRpb25IYW5k
bGVyKTsgCiAgICAgaWYgKHdpbGxDYXRjaEV4Y2VwdGlvbikgewogICAgICAgICB1bnNpZ25lZCBz
dHJlYW1JbmRleCA9IG1fc3BlY3VsYXRpdmUtPm1fb3V0T2ZMaW5lU3RyZWFtSW5kZXggIT0gVUlO
VF9NQVggPyBtX3NwZWN1bGF0aXZlLT5tX291dE9mTGluZVN0cmVhbUluZGV4IDogbV9zcGVjdWxh
dGl2ZS0+bV9zdHJlYW0tPnNpemUoKTsKICAgICAgICAgTWFjcm9Bc3NlbWJsZXI6Okp1bXAgaGFk
RXhjZXB0aW9uID0gZW1pdE5vblBhdGNoYWJsZUV4Y2VwdGlvbkNoZWNrKCk7CkBAIC02MjEsNyAr
NTk5LDcgQEAgQ2FsbFNpdGVJbmRleCBKSVRDb21waWxlcjo6cmVjb3JkQ2FsbFNpdAogewogICAg
IENvZGVPcmlnaW4gb3BDYXRjaE9yaWdpbjsKICAgICBIYW5kbGVySW5mbyogZXhjZXB0aW9uSGFu
ZGxlcjsKLSAgICBib29sIHdpbGxDYXRjaEV4Y2VwdGlvbiA9IHdpbGxDYXRjaEV4Y2VwdGlvbklu
TWFjaGluZUZyYW1lKGNhbGxTaXRlQ29kZU9yaWdpbiwgb3BDYXRjaE9yaWdpbiwgZXhjZXB0aW9u
SGFuZGxlcik7CisgICAgYm9vbCB3aWxsQ2F0Y2hFeGNlcHRpb24gPSBtX2dyYXBoLndpbGxDYXRj
aEV4Y2VwdGlvbkluTWFjaGluZUZyYW1lKGNhbGxTaXRlQ29kZU9yaWdpbiwgb3BDYXRjaE9yaWdp
biwgZXhjZXB0aW9uSGFuZGxlcik7CiAgICAgQ2FsbFNpdGVJbmRleCBjYWxsU2l0ZSA9IGFkZENh
bGxTaXRlKGNhbGxTaXRlQ29kZU9yaWdpbik7CiAgICAgaWYgKHdpbGxDYXRjaEV4Y2VwdGlvbikK
ICAgICAgICAgYXBwZW5kRXhjZXB0aW9uSGFuZGxpbmdPU1JFeGl0KGV2ZW50U3RyZWFtSW5kZXgs
IG9wQ2F0Y2hPcmlnaW4sIGV4Y2VwdGlvbkhhbmRsZXIsIGNhbGxTaXRlKTsKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSklUQ29tcGlsZXIuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvbXBpbGVyLmgJKHJldmlzaW9uIDE5MTkzMSkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSklUQ29tcGlsZXIuaAkod29ya2luZyBj
b3B5KQpAQCAtMjc5LDcgKzI3OSw2IEBAIHByaXZhdGU6CiAgICAgdm9pZCBsaW5rT1NSRXhpdHMo
KTsKICAgICB2b2lkIGRpc2Fzc2VtYmxlKExpbmtCdWZmZXImKTsKIAotICAgIGJvb2wgd2lsbENh
dGNoRXhjZXB0aW9uSW5NYWNoaW5lRnJhbWUoQ29kZU9yaWdpbiwgQ29kZU9yaWdpbiYgb3BDYXRj
aE9yaWdpbk91dCwgSGFuZGxlckluZm8qJiBjYXRjaEhhbmRsZXJPdXQpOwogICAgIHZvaWQgYXBw
ZW5kRXhjZXB0aW9uSGFuZGxpbmdPU1JFeGl0KHVuc2lnbmVkIGV2ZW50U3RyZWFtSW5kZXgsIENv
ZGVPcmlnaW4sIEhhbmRsZXJJbmZvKiBleGNlcHRpb25IYW5kbGVyLCBDYWxsU2l0ZUluZGV4LCBN
YWNyb0Fzc2VtYmxlcjo6SnVtcExpc3QganVtcHNUb0ZhaWwgPSBNYWNyb0Fzc2VtYmxlcjo6SnVt
cExpc3QoKSk7CiAKICAgICAvLyBUaGUgZGF0YWZsb3cgZ3JhcGggY3VycmVudGx5IGJlaW5nIGdl
bmVyYXRlZC4KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHTm9kZU9yaWdpbi5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHTm9kZU9yaWdpbi5o
CShyZXZpc2lvbiAxOTE5MzEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR05vZGVP
cmlnaW4uaAkod29ya2luZyBjb3B5KQpAQCAtNjMsNiArNjMsMTggQEAgc3RydWN0IE5vZGVPcmln
aW4gewogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAorICAgIE5vZGVPcmlnaW4gd2l0
aEZvckV4aXRBbmRFeGl0T0soQ29kZU9yaWdpbiBmb3JFeGl0LCBib29sIGV4aXRPSykgY29uc3QK
KyAgICB7CisgICAgICAgIGlmICghaXNTZXQoKSkKKyAgICAgICAgICAgIHJldHVybiBOb2RlT3Jp
Z2luKCk7CisgICAgICAgIAorICAgICAgICBOb2RlT3JpZ2luIHJlc3VsdCA9ICp0aGlzOworICAg
ICAgICBpZiAoZm9yRXhpdC5pc1NldCgpKQorICAgICAgICAgICAgcmVzdWx0LmZvckV4aXQgPSBm
b3JFeGl0OworICAgICAgICByZXN1bHQuZXhpdE9LID0gZXhpdE9LOworICAgICAgICByZXR1cm4g
cmVzdWx0OworICAgIH0KKwogICAgIE5vZGVPcmlnaW4gd2l0aEV4aXRPSyhib29sIHZhbHVlKSBj
b25zdAogICAgIHsKICAgICAgICAgTm9kZU9yaWdpbiByZXN1bHQgPSAqdGhpczsKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHT1NSRXhpdC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdPU1JFeGl0LmNwcAkocmV2aXNpb24gMTkxOTMxKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdPU1JFeGl0LmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNDMsOSArNDMsNyBAQCBPU1JFeGl0OjpPU1JFeGl0KEV4aXRLaW5kIGtpbmQsIEpTVmFs
dWVTCiAgICAgLCBtX3BhdGNoYWJsZUNvZGVPZmZzZXQoMCkKICAgICAsIG1fcmVjb3ZlcnlJbmRl
eChyZWNvdmVyeUluZGV4KQogICAgICwgbV9zdHJlYW1JbmRleChzdHJlYW1JbmRleCkKLSAgICAs
IG1fZXhjZXB0aW9uSGFuZGxlckNhbGxTaXRlSW5kZXgoc3RkOjpudW1lcmljX2xpbWl0czx1bnNp
Z25lZD46Om1heCgpKQogICAgICwgbV93aWxsQXJyaXZlQXRPU1JFeGl0RnJvbUdlbmVyaWNVbndp
bmQoZmFsc2UpCi0gICAgLCBtX2lzRXhjZXB0aW9uSGFuZGxlcihmYWxzZSkKIHsKICAgICBib29s
IGNhbkV4aXQgPSBqaXQtPm1fb3JpZ2luLmV4aXRPSzsKICAgICBpZiAoIWNhbkV4aXQgJiYgaml0
LT5tX2N1cnJlbnROb2RlKSB7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR09T
UkV4aXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR09TUkV4
aXQuaAkocmV2aXNpb24gMTkxOTMxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdP
U1JFeGl0LmgJKHdvcmtpbmcgY29weSkKQEAgLTEwMCwxMSArMTAwLDcgQEAgc3RydWN0IE9TUkV4
aXQgOiBwdWJsaWMgT1NSRXhpdEJhc2UgewogICAgIHZvaWQgY29ycmVjdEp1bXAoTGlua0J1ZmZl
ciYpOwogCiAgICAgdW5zaWduZWQgbV9zdHJlYW1JbmRleDsKLSAgICBDYWxsU2l0ZUluZGV4IG1f
ZXhjZXB0aW9uSGFuZGxlckNhbGxTaXRlSW5kZXg7Ci0KICAgICBib29sIG1fd2lsbEFycml2ZUF0
T1NSRXhpdEZyb21HZW5lcmljVW53aW5kIDogMTsKLSAgICBib29sIG1faXNFeGNlcHRpb25IYW5k
bGVyIDogMTsKLSAgICAKICAgICB2b2lkIGNvbnNpZGVyQWRkaW5nQXNGcmVxdWVudEV4aXRTaXRl
KENvZGVCbG9jayogcHJvZmlsZWRDb2RlQmxvY2spCiAgICAgewogICAgICAgICBPU1JFeGl0QmFz
ZTo6Y29uc2lkZXJBZGRpbmdBc0ZyZXF1ZW50RXhpdFNpdGUocHJvZmlsZWRDb2RlQmxvY2ssIEV4
aXRGcm9tREZHKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHT1NSRXhpdEJh
c2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR09TUkV4aXRC
YXNlLmgJKHJldmlzaW9uIDE5MTkzMSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
T1NSRXhpdEJhc2UuaAkod29ya2luZyBjb3B5KQpAQCAtNDUsNiArNDUsOCBAQCBzdHJ1Y3QgT1NS
RXhpdEJhc2UgewogICAgICAgICAsIG1fY291bnQoMCkKICAgICAgICAgLCBtX2NvZGVPcmlnaW4o
b3JpZ2luKQogICAgICAgICAsIG1fY29kZU9yaWdpbkZvckV4aXRQcm9maWxlKG9yaWdpbkZvclBy
b2ZpbGUpCisgICAgICAgICwgbV9leGNlcHRpb25IYW5kbGVyQ2FsbFNpdGVJbmRleChzdGQ6Om51
bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCkpCisgICAgICAgICwgbV9pc0V4Y2VwdGlvbkhh
bmRsZXIoZmFsc2UpCiAgICAgewogICAgICAgICBBU1NFUlQobV9jb2RlT3JpZ2luLmlzU2V0KCkp
OwogICAgICAgICBBU1NFUlQobV9jb2RlT3JpZ2luRm9yRXhpdFByb2ZpbGUuaXNTZXQoKSk7CkBA
IC01NSw2ICs1Nyw5IEBAIHN0cnVjdCBPU1JFeGl0QmFzZSB7CiAgICAgCiAgICAgQ29kZU9yaWdp
biBtX2NvZGVPcmlnaW47CiAgICAgQ29kZU9yaWdpbiBtX2NvZGVPcmlnaW5Gb3JFeGl0UHJvZmls
ZTsKKyAgICBDYWxsU2l0ZUluZGV4IG1fZXhjZXB0aW9uSGFuZGxlckNhbGxTaXRlSW5kZXg7CisK
KyAgICBib29sIG1faXNFeGNlcHRpb25IYW5kbGVyIDogMTsKIAogcHJvdGVjdGVkOgogICAgIHZv
aWQgY29uc2lkZXJBZGRpbmdBc0ZyZXF1ZW50RXhpdFNpdGUoQ29kZUJsb2NrKiBwcm9maWxlZENv
ZGVCbG9jaywgRXhpdGluZ0pJVFR5cGUgaml0VHlwZSkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9kZmcvREZHT1NSRXhpdENvbXBpbGVyQ29tbW9uLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR09TUkV4aXRDb21waWxlckNvbW1vbi5jcHAJKHJldmlz
aW9uIDE5MTkzMSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHT1NSRXhpdENvbXBp
bGVyQ29tbW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQ2LDEwICsyNDYsMTAgQEAgdm9pZCBy
ZWlmeUlubGluZWRDYWxsRnJhbWVzKENDYWxsSGVscGVycwogICAgIC8vIERvbid0IG5lZWQgdG8g
c2V0IHRoZSB0b3BsZXZlbCBjb2RlIG9yaWdpbiBpZiB3ZSBvbmx5IGRpZCBpbmxpbmUgdGFpbCBj
YWxscwogICAgIGlmIChjb2RlT3JpZ2luKSB7CiAjaWYgVVNFKEpTVkFMVUU2NCkKLSAgICB1aW50
MzJfdCBsb2NhdGlvbkJpdHMgPSBDYWxsU2l0ZUluZGV4KGNvZGVPcmlnaW4tPmJ5dGVjb2RlSW5k
ZXgpLmJpdHMoKTsKKyAgICAgICAgdWludDMyX3QgbG9jYXRpb25CaXRzID0gQ2FsbFNpdGVJbmRl
eChjb2RlT3JpZ2luLT5ieXRlY29kZUluZGV4KS5iaXRzKCk7CiAjZWxzZQotICAgIEluc3RydWN0
aW9uKiBpbnN0cnVjdGlvbiA9IGppdC5iYXNlbGluZUNvZGVCbG9jaygpLT5pbnN0cnVjdGlvbnMo
KS5iZWdpbigpICsgY29kZU9yaWdpbi0+Ynl0ZWNvZGVJbmRleDsKLSAgICB1aW50MzJfdCBsb2Nh
dGlvbkJpdHMgPSBDYWxsU2l0ZUluZGV4KGluc3RydWN0aW9uKS5iaXRzKCk7CisgICAgICAgIElu
c3RydWN0aW9uKiBpbnN0cnVjdGlvbiA9IGppdC5iYXNlbGluZUNvZGVCbG9jaygpLT5pbnN0cnVj
dGlvbnMoKS5iZWdpbigpICsgY29kZU9yaWdpbi0+Ynl0ZWNvZGVJbmRleDsKKyAgICAgICAgdWlu
dDMyX3QgbG9jYXRpb25CaXRzID0gQ2FsbFNpdGVJbmRleChpbnN0cnVjdGlvbikuYml0cygpOwog
I2VuZGlmCiAgICAgICAgIGppdC5zdG9yZTMyKEFzc2VtYmx5SGVscGVyczo6VHJ1c3RlZEltbTMy
KGxvY2F0aW9uQml0cyksIEFzc2VtYmx5SGVscGVyczo6dGFnRm9yKChWaXJ0dWFsUmVnaXN0ZXIp
KEpTU3RhY2s6OkFyZ3VtZW50Q291bnQpKSk7CiAgICAgfQpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdUaWVyVXBDaGVja0luamVjdGlvblBoYXNlLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1RpZXJVcENoZWNrSW5qZWN0aW9uUGhhc2Uu
Y3BwCShyZXZpc2lvbiAxOTE5MzEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1Rp
ZXJVcENoZWNrSW5qZWN0aW9uUGhhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NCw5ICs1NCw2
IEBAIHB1YmxpYzoKICAgICAgICAgaWYgKG1fZ3JhcGgubV9wcm9maWxlZEJsb2NrLT5tX2RpZEZh
aWxGVExDb21waWxhdGlvbikKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgICAgICBp
ZiAobV9ncmFwaC5tX2hhc0V4Y2VwdGlvbkhhbmRsZXJzKQotICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgICAgICAKICNpZiBFTkFCTEUoRlRMX0pJVCkKICAgICAgICAgRlRMOjpDYXBhYmls
aXR5TGV2ZWwgbGV2ZWwgPSBGVEw6OmNhbkNvbXBpbGUobV9ncmFwaCk7CiAgICAgICAgIGlmIChs
ZXZlbCA9PSBGVEw6OkNhbm5vdENvbXBpbGUpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZnRsL0ZUTENvbXBpbGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9m
dGwvRlRMQ29tcGlsZS5jcHAJKHJldmlzaW9uIDE5MTkzMSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9mdGwvRlRMQ29tcGlsZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ2Niw3ICs0NjYsNyBA
QCBzdGF0aWMgUmVnaXN0ZXJTZXQgdXNlZFJlZ2lzdGVyc0Zvcihjb25zCiB9CiAKIHRlbXBsYXRl
PHR5cGVuYW1lIENhbGxUeXBlPgotdm9pZCBhZGp1c3RDYWxsSUNzRm9yU3RhY2ttYXBzKFZlY3Rv
cjxDYWxsVHlwZT4mIGNhbGxzLCBTdGFja01hcHM6OlJlY29yZE1hcCYgcmVjb3JkTWFwKQordm9p
ZCBhZGp1c3RDYWxsSUNzRm9yU3RhY2ttYXBzKFZlY3RvcjxDYWxsVHlwZT4mIGNhbGxzLCBTdGFj
a01hcHM6OlJlY29yZE1hcCYgcmVjb3JkTWFwLCBzdGQ6OmZ1bmN0aW9uPENhbGxTaXRlSW5kZXgg
KHVpbnQzMl90IHJlY29yZEluZGV4LCBDb2RlT3JpZ2luIG9yaWdpbik+IGdlbmVyYXRlQ2FsbFNp
dGVJbmRleEZ1bmN0aW9uLCBzdGQ6OmZ1bmN0aW9uPE9TUkV4aXQqICh1aW50MzJfdCByZWNvcmRJ
bmRleCk+IGdldENvcnJlc3BvbmRpbmdPU1JFeGl0KQogewogICAgIC8vIEhhbmRsaW5nIEpTIGNh
bGxzIGlzIHdlaXJkOiB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHdlIHNvcnQgdGhlbSBieSB0aGUg
UEMgaW4gTExWTQogICAgIC8vIGdlbmVyYXRlZCBjb2RlLiBUaGF0IGltcGxpZXMgZmlyc3QgcHJ1
bmluZyB0aGUgb25lcyB0aGF0IExMVk0gZGlkbid0IGdlbmVyYXRlLgpAQCAtNDg0LDYgKzQ4NCw5
IEBAIHZvaWQgYWRqdXN0Q2FsbElDc0ZvclN0YWNrbWFwcyhWZWN0b3I8Q2EKICAgICAgICAgZm9y
ICh1bnNpZ25lZCBqID0gMDsgaiA8IGl0ZXItPnZhbHVlLnNpemUoKTsgKytqKSB7CiAgICAgICAg
ICAgICBDYWxsVHlwZSBjb3B5ID0gY2FsbDsKICAgICAgICAgICAgIGNvcHkubV9pbnN0cnVjdGlv
bk9mZnNldCA9IGl0ZXItPnZhbHVlW2pdLnJlY29yZC5pbnN0cnVjdGlvbk9mZnNldDsKKyAgICAg
ICAgICAgIGNvcHkuc2V0Q2FsbFNpdGVJbmRleChnZW5lcmF0ZUNhbGxTaXRlSW5kZXhGdW5jdGlv
bihpdGVyLT52YWx1ZVtqXS5pbmRleCwgY29weS5jYWxsU2l0ZURlc2NyaXB0aW9uT3JpZ2luKCkp
KTsKKyAgICAgICAgICAgIGNvcHkuc2V0Q29ycmVzcG9uZGluZ0dlbmVyaWNVbndpbmRPU1JFeGl0
KGdldENvcnJlc3BvbmRpbmdPU1JFeGl0KGl0ZXItPnZhbHVlW2pdLmluZGV4KSk7CisKICAgICAg
ICAgICAgIGNhbGxzLmFwcGVuZChjb3B5KTsKICAgICAgICAgfQogICAgIH0KQEAgLTQ5OCw5ICs1
MDEsMzMgQEAgc3RhdGljIHZvaWQgZml4RnVuY3Rpb25CYXNlZE9uU3RhY2tNYXBzKAogICAgIEdy
YXBoJiBncmFwaCA9IHN0YXRlLmdyYXBoOwogICAgIFZNJiB2bSA9IGdyYXBoLm1fdm07CiAgICAg
U3RhY2tNYXBzJiBzdGFja21hcHMgPSBqaXRDb2RlLT5zdGFja21hcHM7CisKKyAgICAvLyBXZSBm
aWxsIHRoaXMgd2hlbiBnZW5lcmF0aW5nIE9TUiBleGl0cyB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQg
dmlhIGdlbmVyaWNVbndpbmQoKS4KKyAgICAvLyBUaGF0IHdheSwgd2hlbiB3ZSBhc3NpZ24gYSBD
YWxsU2l0ZUluZGV4IHRvIHRoZSBDYWxsL0dldEJ5SWQvUHV0QnlJZCwgd2UgYXNzaWduCisgICAg
Ly8gaXQgdGhlIHByb3BlciBDYWxsU2l0ZUluZGV4IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIE9T
UkV4aXQgZXhjZXB0aW9uIGhhbmRsZXIuCisgICAgSGFzaE1hcDx1aW50MzJfdCwgc2l6ZV90LCBX
VEY6OkludEhhc2g8dWludDMyX3Q+LCBXVEY6OlVuc2lnbmVkV2l0aFplcm9LZXlIYXNoVHJhaXRz
PHVpbnQzMl90Pj4gcmVjb3JkSW5kZXhUb0dlbmVyaWNVbndpbmRPckxhenlTbG93UGF0aE9TUkV4
aXQ7CisgICAgYXV0byBnZW5lcmF0ZU9yR2V0QWxyZWFkeUdlbmVyYXRlZENhbGxTaXRlSW5kZXgg
PSBbJl0gKHVpbnQzMl90IHJlY29yZEluZGV4LCBDb2RlT3JpZ2luIG9yaWdpbikgLT4gQ2FsbFNp
dGVJbmRleCB7CisgICAgICAgIGF1dG8gZmluZFJlc3VsdCA9IHJlY29yZEluZGV4VG9HZW5lcmlj
VW53aW5kT3JMYXp5U2xvd1BhdGhPU1JFeGl0LmZpbmQocmVjb3JkSW5kZXgpOworICAgICAgICBp
ZiAoZmluZFJlc3VsdCA9PSByZWNvcmRJbmRleFRvR2VuZXJpY1Vud2luZE9yTGF6eVNsb3dQYXRo
T1NSRXhpdC5lbmQoKSkKKyAgICAgICAgICAgIHJldHVybiBzdGF0ZS5qaXRDb2RlLT5jb21tb24u
YWRkVW5pcXVlQ2FsbFNpdGVJbmRleChvcmlnaW4pOworICAgICAgICBzaXplX3Qgb3NyRXhpdElu
ZGV4ID0gZmluZFJlc3VsdC0+dmFsdWU7CisgICAgICAgIHJldHVybiBzdGF0ZS5qaXRDb2RlLT5v
c3JFeGl0W29zckV4aXRJbmRleF0ubV9leGNlcHRpb25IYW5kbGVyQ2FsbFNpdGVJbmRleDsKKyAg
ICB9OworICAgIGF1dG8ganNDYWxsT1NSRXhpdEZvclJlY29yZEluZGV4ID0gWyZdICh1aW50MzJf
dCByZWNvcmRJbmRleCkgLT4gT1NSRXhpdCogeworICAgICAgICBhdXRvIGZpbmRSZXN1bHQgPSBy
ZWNvcmRJbmRleFRvR2VuZXJpY1Vud2luZE9yTGF6eVNsb3dQYXRoT1NSRXhpdC5maW5kKHJlY29y
ZEluZGV4KTsKKyAgICAgICAgaWYgKGZpbmRSZXN1bHQgPT0gcmVjb3JkSW5kZXhUb0dlbmVyaWNV
bndpbmRPckxhenlTbG93UGF0aE9TUkV4aXQuZW5kKCkpCisgICAgICAgICAgICByZXR1cm4gbnVs
bHB0cjsKKworICAgICAgICBzaXplX3Qgb3NyRXhpdEluZGV4ID0gZmluZFJlc3VsdC0+dmFsdWU7
CisgICAgICAgIE9TUkV4aXQmIGV4aXQgPSBzdGF0ZS5qaXRDb2RlLT5vc3JFeGl0W29zckV4aXRJ
bmRleF07CisgICAgICAgIGlmICghZXhpdC5tX2Rlc2NyaXB0b3IubV9pc0V4Y2VwdGlvbkZyb21K
U0NhbGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuICZleGl0
OworICAgIH07CiAgICAgCiAgICAgaW50IGxvY2Fsc09mZnNldCA9IG9mZnNldE9mU3RhY2tSZWdp
b24ocmVjb3JkTWFwLCBzdGF0ZS5jYXB0dXJlZFN0YWNrbWFwSUQpICsgZ3JhcGgubV9uZXh0TWFj
aGluZUxvY2FsOwogICAgIGludCB2YXJhcmdzU3BpbGxTbG90c09mZnNldCA9IG9mZnNldE9mU3Rh
Y2tSZWdpb24ocmVjb3JkTWFwLCBzdGF0ZS52YXJhcmdzU3BpbGxTbG90c1N0YWNrbWFwSUQpOwor
ICAgIGludCBqc0NhbGxUaGF0TWlnaHRUaHJvd1NwaWxsT2Zmc2V0ID0gb2Zmc2V0T2ZTdGFja1Jl
Z2lvbihyZWNvcmRNYXAsIHN0YXRlLmV4Y2VwdGlvbkhhbmRsaW5nU3BpbGxTbG90U3RhY2ttYXBJ
RCk7CiAgICAgCiAgICAgZm9yICh1bnNpZ25lZCBpID0gZ3JhcGgubV9pbmxpbmVWYXJpYWJsZURh
dGEuc2l6ZSgpOyBpLS07KSB7CiAgICAgICAgIElubGluZUNhbGxGcmFtZSogaW5saW5lQ2FsbEZy
YW1lID0gZ3JhcGgubV9pbmxpbmVWYXJpYWJsZURhdGFbaV0uaW5saW5lQ2FsbEZyYW1lOwpAQCAt
NTY5LDE0ICs1OTYsMzUgQEAgc3RhdGljIHZvaWQgZml4RnVuY3Rpb25CYXNlZE9uU3RhY2tNYXBz
KAogICAgICAgICAgICAgbWF0ZXJpYWxpemF0aW9uLT5hY2NvdW50Rm9yTG9jYWxzT2Zmc2V0KGxv
Y2Fsc09mZnNldCk7CiAKICAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IGl0ZXItPnZh
bHVlLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBzdGFja21hcFJlY29yZElu
ZGV4ID0gaXRlci0+dmFsdWVbal0uaW5kZXg7Ci0gICAgICAgICAgICBPU1JFeGl0IGV4aXQoZXhp
dERlc2NyaXB0b3IsIHN0YWNrbWFwUmVjb3JkSW5kZXgpOwotICAgICAgICAgICAgc3RhdGUuaml0
Q29kZS0+b3NyRXhpdC5hcHBlbmQoZXhpdCk7Ci0gICAgICAgICAgICBzdGF0ZS5maW5hbGl6ZXIt
Pm9zckV4aXQuYXBwZW5kKE9TUkV4aXRDb21waWxhdGlvbkluZm8oKSk7CisgICAgICAgICAgICB7
CisgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RhY2ttYXBSZWNvcmRJbmRleCA9IGl0ZXItPnZh
bHVlW2pdLmluZGV4OworICAgICAgICAgICAgICAgIE9TUkV4aXQgZXhpdChleGl0RGVzY3JpcHRv
ciwgc3RhY2ttYXBSZWNvcmRJbmRleCk7CisgICAgICAgICAgICAgICAgc3RhdGUuaml0Q29kZS0+
b3NyRXhpdC5hcHBlbmQoZXhpdCk7CisgICAgICAgICAgICAgICAgc3RhdGUuZmluYWxpemVyLT5v
c3JFeGl0LmFwcGVuZChPU1JFeGl0Q29tcGlsYXRpb25JbmZvKCkpOworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBPU1JFeGl0JiBleGl0ID0gc3RhdGUuaml0Q29kZS0+b3NyRXhpdC5sYXN0
KCk7CisgICAgICAgICAgICBpZiAoZXhpdERlc2NyaXB0b3IubV93aWxsQXJyaXZlQXRPU1JFeGl0
RnJvbUdlbmVyaWNVbndpbmQgfHwgZXhpdERlc2NyaXB0b3IubV9pc0V4Y2VwdGlvbkZyb21MYXp5
U2xvd1BhdGgpIHsKKyAgICAgICAgICAgICAgICBTdGFja01hcHM6OlJlY29yZCYgcmVjb3JkID0g
aXRlci0+dmFsdWVbal0ucmVjb3JkOworICAgICAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUKGV4
aXQubV9kZXNjcmlwdG9yLm1fc2VtYW50aWNDb2RlT3JpZ2luRm9yQ2FsbEZyYW1lSGVhZGVyLmlz
U2V0KCkpOworICAgICAgICAgICAgICAgIENhbGxTaXRlSW5kZXggY2FsbFNpdGVJbmRleCA9IHN0
YXRlLmppdENvZGUtPmNvbW1vbi5hZGRVbmlxdWVDYWxsU2l0ZUluZGV4KGV4aXQubV9kZXNjcmlw
dG9yLm1fc2VtYW50aWNDb2RlT3JpZ2luRm9yQ2FsbEZyYW1lSGVhZGVyKTsKKyAgICAgICAgICAg
ICAgICBleGl0Lm1fZXhjZXB0aW9uSGFuZGxlckNhbGxTaXRlSW5kZXggPSBjYWxsU2l0ZUluZGV4
OworICAgICAgICAgICAgICAgIHJlY29yZEluZGV4VG9HZW5lcmljVW53aW5kT3JMYXp5U2xvd1Bh
dGhPU1JFeGl0LmFkZChpdGVyLT52YWx1ZVtqXS5pbmRleCwgc3RhdGUuaml0Q29kZS0+b3NyRXhp
dC5zaXplKCkgLSAxKTsKKworICAgICAgICAgICAgICAgIGlmIChleGl0RGVzY3JpcHRvci5tX2lz
RXhjZXB0aW9uRnJvbUpTQ2FsbCkKKyAgICAgICAgICAgICAgICAgICAgZXhpdC5nYXRoZXJSZWdp
c3RlcnNUb1NwaWxsRm9yQ2FsbElmRXhjZXB0aW9uKHN0YWNrbWFwcywgcmVjb3JkKTsKKyAgICAg
ICAgICAgICAgICBpZiAoZXhpdERlc2NyaXB0b3IubV9pc0V4Y2VwdGlvbkZyb21HZXRCeUlkKSB7
CisgICAgICAgICAgICAgICAgICAgIEdQUlJlZyByZXN1bHQgPSByZWNvcmQubG9jYXRpb25zWzBd
LmRpcmVjdEdQUigpOworICAgICAgICAgICAgICAgICAgICBHUFJSZWcgYmFzZSA9IHJlY29yZC5s
b2NhdGlvbnNbMV0uZGlyZWN0R1BSKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaGFz
IGFuIGludGVyZXN0aW5nIHN0b3J5LCBzZWUgY29tbWVudCBiZWxvdyBkZXNjcmliaW5nIGl0Lgor
ICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IGJhc2UpCisgICAgICAgICAgICAgICAg
ICAgICAgICBleGl0LnJlZ2lzdGVyc1RvUHJlc2VydmVGb3JDYWxsVGhhdE1pZ2h0VGhyb3cuc2V0
KGJhc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAg
IH0KICAgICBFeGl0VGh1bmtHZW5lcmF0b3IgZXhpdFRodW5rR2VuZXJhdG9yKHN0YXRlKTsKLSAg
ICBleGl0VGh1bmtHZW5lcmF0b3IuZW1pdFRodW5rcygpOworICAgIGV4aXRUaHVua0dlbmVyYXRv
ci5lbWl0VGh1bmtzKGpzQ2FsbFRoYXRNaWdodFRocm93U3BpbGxPZmZzZXQpOwogICAgIGlmIChl
eGl0VGh1bmtHZW5lcmF0b3IuZGlkVGhpbmdzKCkpIHsKICAgICAgICAgUkVMRUFTRV9BU1NFUlQo
c3RhdGUuZmluYWxpemVyLT5vc3JFeGl0LnNpemUoKSk7CiAgICAgICAgIApAQCAtNTg5LDE2ICs2
MzcsMjYgQEAgc3RhdGljIHZvaWQgZml4RnVuY3Rpb25CYXNlZE9uU3RhY2tNYXBzKAogICAgICAg
ICAKICAgICAgICAgUkVMRUFTRV9BU1NFUlQoc3RhdGUuZmluYWxpemVyLT5vc3JFeGl0LnNpemUo
KSA9PSBzdGF0ZS5qaXRDb2RlLT5vc3JFeGl0LnNpemUoKSk7CiAgICAgICAgIAorICAgICAgICBj
b2RlQmxvY2stPmNsZWFyRXhjZXB0aW9uSGFuZGxlcnMoKTsKKwogICAgICAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgc3RhdGUuaml0Q29kZS0+b3NyRXhpdC5zaXplKCk7ICsraSkgewogICAg
ICAgICAgICAgT1NSRXhpdENvbXBpbGF0aW9uSW5mbyYgaW5mbyA9IHN0YXRlLmZpbmFsaXplci0+
b3NyRXhpdFtpXTsKLSAgICAgICAgICAgIE9TUkV4aXQmIGV4aXQgPSBqaXRDb2RlLT5vc3JFeGl0
W2ldOworICAgICAgICAgICAgT1NSRXhpdCYgZXhpdCA9IHN0YXRlLmppdENvZGUtPm9zckV4aXRb
aV07CiAgICAgICAgICAgICAKICAgICAgICAgICAgIGlmICh2ZXJib3NlQ29tcGlsYXRpb25FbmFi
bGVkKCkpCiAgICAgICAgICAgICAgICAgZGF0YUxvZygiSGFuZGxpbmcgT1NSIHN0YWNrbWFwICMi
LCBleGl0Lm1fZGVzY3JpcHRvci5tX3N0YWNrbWFwSUQsICIgZm9yICIsIGV4aXQubV9jb2RlT3Jp
Z2luLCAiXG4iKTsKIAogICAgICAgICAgICAgaW5mby5tX3RodW5rQWRkcmVzcyA9IGxpbmtCdWZm
ZXItPmxvY2F0aW9uT2YoaW5mby5tX3RodW5rTGFiZWwpOwogICAgICAgICAgICAgZXhpdC5tX3Bh
dGNoYWJsZUNvZGVPZmZzZXQgPSBsaW5rQnVmZmVyLT5vZmZzZXRPZihpbmZvLm1fdGh1bmtKdW1w
KTsKLSAgICAgICAgICAgIAorCisgICAgICAgICAgICBpZiAoZXhpdC5tX2Rlc2NyaXB0b3IubV93
aWxsQXJyaXZlQXRPU1JFeGl0RnJvbUdlbmVyaWNVbndpbmQpIHsKKyAgICAgICAgICAgICAgICBI
YW5kbGVySW5mbyBuZXdIYW5kbGVyID0gZXhpdC5tX2Rlc2NyaXB0b3IubV9iYXNlbGluZUV4Y2Vw
dGlvbkhhbmRsZXI7CisgICAgICAgICAgICAgICAgbmV3SGFuZGxlci5zdGFydCA9IGV4aXQubV9l
eGNlcHRpb25IYW5kbGVyQ2FsbFNpdGVJbmRleC5iaXRzKCk7CisgICAgICAgICAgICAgICAgbmV3
SGFuZGxlci5lbmQgPSBleGl0Lm1fZXhjZXB0aW9uSGFuZGxlckNhbGxTaXRlSW5kZXguYml0cygp
ICsgMTsKKyAgICAgICAgICAgICAgICBuZXdIYW5kbGVyLm5hdGl2ZUNvZGUgPSBpbmZvLm1fdGh1
bmtBZGRyZXNzOworICAgICAgICAgICAgICAgIGNvZGVCbG9jay0+YXBwZW5kRXhjZXB0aW9uSGFu
ZGxlcihuZXdIYW5kbGVyKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHZlcmJv
c2VDb21waWxhdGlvbkVuYWJsZWQoKSkgewogICAgICAgICAgICAgICAgIER1bXBDb250ZXh0IGNv
bnRleHQ7CiAgICAgICAgICAgICAgICAgZGF0YUxvZygiICAgIEV4aXQgdmFsdWVzOiAiLCBpbkNv
bnRleHQoZXhpdC5tX2Rlc2NyaXB0b3IubV92YWx1ZXMsICZjb250ZXh0KSwgIlxuIik7CkBAIC02
MjEsNiArNjc5LDIxIEBAIHN0YXRpYyB2b2lkIGZpeEZ1bmN0aW9uQmFzZWRPblN0YWNrTWFwcygK
ICAgICAgICAgQ0NhbGxIZWxwZXJzIHNsb3dQYXRoSklUKCZ2bSwgY29kZUJsb2NrKTsKICAgICAg
ICAgCiAgICAgICAgIENDYWxsSGVscGVyczo6SnVtcExpc3QgZXhjZXB0aW9uVGFyZ2V0OworCisg
ICAgICAgIFZlY3RvcjxzdGQ6OnBhaXI8Q0NhbGxIZWxwZXJzOjpKdW1wTGlzdCwgQ29kZUxvY2F0
aW9uTGFiZWw+PiBleGNlcHRpb25KdW1wc1RvTGluazsKKyAgICAgICAgYXV0byBhZGROZXdFeGNl
cHRpb25KdW1wSWZOZWNlc3NhcnkgPSBbJl0gKHVpbnQzMl90IHJlY29yZEluZGV4KSB7CisgICAg
ICAgICAgICBhdXRvIGZpbmRSZXN1bHQgPSByZWNvcmRJbmRleFRvR2VuZXJpY1Vud2luZE9yTGF6
eVNsb3dQYXRoT1NSRXhpdC5maW5kKHJlY29yZEluZGV4KTsKKyAgICAgICAgICAgIGlmIChmaW5k
UmVzdWx0ID09IHJlY29yZEluZGV4VG9HZW5lcmljVW53aW5kT3JMYXp5U2xvd1BhdGhPU1JFeGl0
LmVuZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgc2l6
ZV90IG9zckV4aXRJbmRleCA9IGZpbmRSZXN1bHQtPnZhbHVlOworICAgICAgICAgICAgUkVMRUFT
RV9BU1NFUlQoc3RhdGUuaml0Q29kZS0+b3NyRXhpdFtvc3JFeGl0SW5kZXhdLm1fZGVzY3JpcHRv
ci5tX3dpbGxBcnJpdmVBdE9TUkV4aXRGcm9tR2VuZXJpY1Vud2luZCk7CisgICAgICAgICAgICBP
U1JFeGl0Q29tcGlsYXRpb25JbmZvJiBpbmZvID0gc3RhdGUuZmluYWxpemVyLT5vc3JFeGl0W29z
ckV4aXRJbmRleF07CisgICAgICAgICAgICBSRUxFQVNFX0FTU0VSVChpbmZvLm1fZ2V0QW5kUHV0
QnlJZENhbGxPcGVyYXRpb25FeGNlcHRpb25PU1JFeGl0RW50cmFuY2UuaXNTZXQoKSk7CisgICAg
ICAgICAgICBleGNlcHRpb25KdW1wc1RvTGluay5hcHBlbmQoCisgICAgICAgICAgICAgICAgc3Rk
OjptYWtlX3BhaXIoQ0NhbGxIZWxwZXJzOjpKdW1wTGlzdCgpLCBzdGF0ZS5maW5hbGl6ZXItPmV4
aXRUaHVua3NMaW5rQnVmZmVyLT5sb2NhdGlvbk9mKGluZm8ubV9nZXRBbmRQdXRCeUlkQ2FsbE9w
ZXJhdGlvbkV4Y2VwdGlvbk9TUkV4aXRFbnRyYW5jZSkpKTsKKyAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICB9OwogICAgICAgICAKICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gc3Rh
dGUuZ2V0QnlJZHMuc2l6ZSgpOyBpLS07KSB7CiAgICAgICAgICAgICBHZXRCeUlkRGVzY3JpcHRv
ciYgZ2V0QnlJZCA9IHN0YXRlLmdldEJ5SWRzW2ldOwpAQCAtNjQ0LDEzICs3MTcsMzEgQEAgc3Rh
dGljIHZvaWQgZml4RnVuY3Rpb25CYXNlZE9uU3RhY2tNYXBzKAogICAgICAgICAgICAgICAgIEdQ
UlJlZyBiYXNlID0gcmVjb3JkLmxvY2F0aW9uc1sxXS5kaXJlY3RHUFIoKTsKICAgICAgICAgICAg
ICAgICAKICAgICAgICAgICAgICAgICBKSVRHZXRCeUlkR2VuZXJhdG9yIGdlbigKLSAgICAgICAg
ICAgICAgICAgICAgY29kZUJsb2NrLCBjb2RlT3JpZ2luLCBzdGF0ZS5qaXRDb2RlLT5jb21tb24u
YWRkVW5pcXVlQ2FsbFNpdGVJbmRleChjb2RlT3JpZ2luKSwgdXNlZFJlZ2lzdGVycywgSlNWYWx1
ZVJlZ3MoYmFzZSksCisgICAgICAgICAgICAgICAgICAgIGNvZGVCbG9jaywgY29kZU9yaWdpbiwg
Z2VuZXJhdGVPckdldEFscmVhZHlHZW5lcmF0ZWRDYWxsU2l0ZUluZGV4KGl0ZXItPnZhbHVlW2ld
LmluZGV4LCBjb2RlT3JpZ2luKSwgdXNlZFJlZ2lzdGVycywgSlNWYWx1ZVJlZ3MoYmFzZSksCiAg
ICAgICAgICAgICAgICAgICAgIEpTVmFsdWVSZWdzKHJlc3VsdCkpOwogICAgICAgICAgICAgICAg
IAorICAgICAgICAgICAgICAgIGJvb2wgYWRkZWRVbmlxdWVFeGNlcHRpb25KdW1wID0gYWRkTmV3
RXhjZXB0aW9uSnVtcElmTmVjZXNzYXJ5KGl0ZXItPnZhbHVlW2ldLmluZGV4KTsKICAgICAgICAg
ICAgICAgICBNYWNyb0Fzc2VtYmxlcjo6TGFiZWwgYmVnaW4gPSBzbG93UGF0aEpJVC5sYWJlbCgp
OwotCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBiYXNlKSB7CisgICAgICAgICAgICAg
ICAgICAgIC8vIFRoaXMgc2l0dWF0aW9uIGhhcyBhIHJlYWxseSBpbnRlcmVzdGluZyBzdG9yeS4g
V2UgbWF5IGhhdmUgYSBHZXRCeUlkIGluc2lkZQorICAgICAgICAgICAgICAgICAgICAvLyBhIHRy
eSBibG9jayB3aGVyZSBMTFZNIGFzc2lnbnMgdGhlIHJlc3VsdCBhbmQgdGhlIGJhc2UgdG8gdGhl
IHNhbWUgcmVnaXN0ZXIuCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBpbmxpbmUgY2FjaGUg
bWF5IG1pc3MgYW5kIHdlIG1heSBlbmQgdXAgYXQgdGhpcyBzbG93IHBhdGggY2FsbE9wZXJhdGlv
bi4gCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZW4sIHN1cHBvc2UgdGhlIGJhc2UgYW5kIHRo
ZSByZXN1bHQgYXJlIGJvdGggdGhlIHNhbWUgcmVnaXN0ZXIsIHNvIHRoZSByZXR1cm4KKyAgICAg
ICAgICAgICAgICAgICAgLy8gdmFsdWUgb2YgdGhlIEMgY2FsbCBnZXRzIHN0b3JlZCBpbnRvIHRo
ZSBvcmlnaW5hbCBiYXNlIHJlZ2lzdGVyLiBJZiB0aGUgb3BlcmF0aW9uR2V0QnlJZE9wdGltaXpl
CisgICAgICAgICAgICAgICAgICAgIC8vIHRocm93cywgaXQgd2lsbCByZXR1cm4gInVuZGVmaW5l
ZCIgYW5kIHdlIHdpbGwgYmUgc3R1Y2sgd2l0aCAidW5kZWZpbmVkIiBpbiB0aGUgYmFzZQorICAg
ICAgICAgICAgICAgICAgICAvLyByZWdpc3RlciB0aGF0IHdlIHdvdWxkIGxpa2UgdG8gZG8gdmFs
dWUgcmVjb3Zlcnkgb24uIFdlIGNvbWJhdCB0aGlzIHNpdHVhdGlvbiBmcm9tIGV2ZXIKKyAgICAg
ICAgICAgICAgICAgICAgLy8gdGFraW5nIHBsYWNlIGJ5IGVuc3VyaW5nIHdlIHNwaWxsIHRoZSBv
cmlnaW5hbCBiYXNlIHZhbHVlIGFuZCB0aGVuIHJlY292ZXIgaXQgZnJvbQorICAgICAgICAgICAg
ICAgICAgICAvLyB0aGUgc3BpbGwgc2xvdCBhcyB0aGUgZmlyc3Qgc3RlcCBpbiBPU1IgZXhpdC4K
KyAgICAgICAgICAgICAgICAgICAgYXV0byBmaW5kUmVzdWx0ID0gcmVjb3JkSW5kZXhUb0dlbmVy
aWNVbndpbmRPckxhenlTbG93UGF0aE9TUkV4aXQuZmluZChpdGVyLT52YWx1ZVtpXS5pbmRleCk7
CisgICAgICAgICAgICAgICAgICAgIGlmIChmaW5kUmVzdWx0ICE9IHJlY29yZEluZGV4VG9HZW5l
cmljVW53aW5kT3JMYXp5U2xvd1BhdGhPU1JFeGl0LmVuZCgpKSB7CisgICAgICAgICAgICAgICAg
ICAgICAgICBzaXplX3Qgb3NyRXhpdEluZGV4ID0gZmluZFJlc3VsdC0+dmFsdWU7CisgICAgICAg
ICAgICAgICAgICAgICAgICBPU1JFeGl0JiBleGl0ID0gc3RhdGUuaml0Q29kZS0+b3NyRXhpdFtv
c3JFeGl0SW5kZXhdOworICAgICAgICAgICAgICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQoZXhp
dC5tX2Rlc2NyaXB0b3IubV9pc0V4Y2VwdGlvbkZyb21HZXRCeUlkKTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGV4aXQuc3BpbGxSZWdpc3RlcnNUb1NwaWxsU2xvdChzbG93UGF0aEpJVCwganND
YWxsVGhhdE1pZ2h0VGhyb3dTcGlsbE9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgTWFjcm9Bc3NlbWJsZXI6OkNhbGwgY2Fs
bCA9IGNhbGxPcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlLCB1c2VkUmVnaXN0
ZXJzLCBzbG93UGF0aEpJVCwgY29kZU9yaWdpbiwgJmV4Y2VwdGlvblRhcmdldCwKKyAgICAgICAg
ICAgICAgICAgICAgc3RhdGUsIHVzZWRSZWdpc3RlcnMsIHNsb3dQYXRoSklULCBjb2RlT3JpZ2lu
LCBhZGRlZFVuaXF1ZUV4Y2VwdGlvbkp1bXAgPyAmZXhjZXB0aW9uSnVtcHNUb0xpbmsubGFzdCgp
LmZpcnN0IDogJmV4Y2VwdGlvblRhcmdldCwKICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9u
R2V0QnlJZE9wdGltaXplLCByZXN1bHQsIENDYWxsSGVscGVyczo6VHJ1c3RlZEltbVB0cihnZW4u
c3R1YkluZm8oKSksCiAgICAgICAgICAgICAgICAgICAgIGJhc2UsIENDYWxsSGVscGVyczo6VHJ1
c3RlZEltbVB0cihnZXRCeUlkLnVpZCgpKSkuY2FsbCgpOwogCkBAIC02ODMsMTMgKzc3NCwxNSBA
QCBzdGF0aWMgdm9pZCBmaXhGdW5jdGlvbkJhc2VkT25TdGFja01hcHMoCiAgICAgICAgICAgICAg
ICAgR1BSUmVnIHZhbHVlID0gcmVjb3JkLmxvY2F0aW9uc1sxXS5kaXJlY3RHUFIoKTsKICAgICAg
ICAgICAgICAgICAKICAgICAgICAgICAgICAgICBKSVRQdXRCeUlkR2VuZXJhdG9yIGdlbigKLSAg
ICAgICAgICAgICAgICAgICAgY29kZUJsb2NrLCBjb2RlT3JpZ2luLCBzdGF0ZS5qaXRDb2RlLT5j
b21tb24uYWRkVW5pcXVlQ2FsbFNpdGVJbmRleChjb2RlT3JpZ2luKSwgdXNlZFJlZ2lzdGVycywg
SlNWYWx1ZVJlZ3MoYmFzZSksCisgICAgICAgICAgICAgICAgICAgIGNvZGVCbG9jaywgY29kZU9y
aWdpbiwgZ2VuZXJhdGVPckdldEFscmVhZHlHZW5lcmF0ZWRDYWxsU2l0ZUluZGV4KGl0ZXItPnZh
bHVlW2ldLmluZGV4LCBjb2RlT3JpZ2luKSwgdXNlZFJlZ2lzdGVycywgSlNWYWx1ZVJlZ3MoYmFz
ZSksCiAgICAgICAgICAgICAgICAgICAgIEpTVmFsdWVSZWdzKHZhbHVlKSwgR1BSSW5mbzo6cGF0
Y2hwb2ludFNjcmF0Y2hSZWdpc3RlciwgcHV0QnlJZC5lY21hTW9kZSgpLCBwdXRCeUlkLnB1dEtp
bmQoKSk7CiAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYm9vbCBhZGRlZFVuaXF1
ZUV4Y2VwdGlvbkp1bXAgPSBhZGROZXdFeGNlcHRpb25KdW1wSWZOZWNlc3NhcnkoaXRlci0+dmFs
dWVbaV0uaW5kZXgpOworCiAgICAgICAgICAgICAgICAgTWFjcm9Bc3NlbWJsZXI6OkxhYmVsIGJl
Z2luID0gc2xvd1BhdGhKSVQubGFiZWwoKTsKLSAgICAgICAgICAgICAgICAKKwogICAgICAgICAg
ICAgICAgIE1hY3JvQXNzZW1ibGVyOjpDYWxsIGNhbGwgPSBjYWxsT3BlcmF0aW9uKAotICAgICAg
ICAgICAgICAgICAgICBzdGF0ZSwgdXNlZFJlZ2lzdGVycywgc2xvd1BhdGhKSVQsIGNvZGVPcmln
aW4sICZleGNlcHRpb25UYXJnZXQsCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLCB1c2VkUmVn
aXN0ZXJzLCBzbG93UGF0aEpJVCwgY29kZU9yaWdpbiwgYWRkZWRVbmlxdWVFeGNlcHRpb25KdW1w
ID8gJmV4Y2VwdGlvbkp1bXBzVG9MaW5rLmxhc3QoKS5maXJzdCA6ICZleGNlcHRpb25UYXJnZXQs
CiAgICAgICAgICAgICAgICAgICAgIGdlbi5zbG93UGF0aEZ1bmN0aW9uKCksIEludmFsaWRHUFJS
ZWcsCiAgICAgICAgICAgICAgICAgICAgIENDYWxsSGVscGVyczo6VHJ1c3RlZEltbVB0cihnZW4u
c3R1YkluZm8oKSksIHZhbHVlLCBiYXNlLAogICAgICAgICAgICAgICAgICAgICBDQ2FsbEhlbHBl
cnM6OlRydXN0ZWRJbW1QdHIocHV0QnlJZC51aWQoKSkpLmNhbGwoKTsKQEAgLTc4OSw4ICs4ODIs
MTUgQEAgc3RhdGljIHZvaWQgZml4RnVuY3Rpb25CYXNlZE9uU3RhY2tNYXBzKAogICAgICAgICAg
ICAgICAgIGNoYXIqIHN0YXJ0T2ZJQyA9CiAgICAgICAgICAgICAgICAgICAgIGJpdHdpc2VfY2Fz
dDxjaGFyKj4oZ2VuZXJhdGVkRnVuY3Rpb24pICsgcmVjb3JkLmluc3RydWN0aW9uT2Zmc2V0Owog
ICAgICAgICAgICAgICAgIENvZGVMb2NhdGlvbkxhYmVsIHBhdGNocG9pbnQoKE1hY3JvQXNzZW1i
bGVyQ29kZVB0cihzdGFydE9mSUMpKSk7Ci0gICAgICAgICAgICAgICAgQ29kZUxvY2F0aW9uTGFi
ZWwgZXhjZXB0aW9uVGFyZ2V0ID0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuZmluYWxpemVy
LT5oYW5kbGVFeGNlcHRpb25zTGlua0J1ZmZlci0+ZW50cnlwb2ludCgpOworICAgICAgICAgICAg
ICAgIENvZGVMb2NhdGlvbkxhYmVsIGV4Y2VwdGlvblRhcmdldDsKKyAgICAgICAgICAgICAgICBh
dXRvIGZpbmRSZXN1bHQgPSByZWNvcmRJbmRleFRvR2VuZXJpY1Vud2luZE9yTGF6eVNsb3dQYXRo
T1NSRXhpdC5maW5kKGl0ZXItPnZhbHVlW2ldLmluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAo
ZmluZFJlc3VsdCAhPSByZWNvcmRJbmRleFRvR2VuZXJpY1Vud2luZE9yTGF6eVNsb3dQYXRoT1NS
RXhpdC5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb3NyRXhpdEluZGV4ID0g
ZmluZFJlc3VsdC0+dmFsdWU7CisgICAgICAgICAgICAgICAgICAgIE9TUkV4aXRDb21waWxhdGlv
bkluZm8mIGluZm8gPSBzdGF0ZS5maW5hbGl6ZXItPm9zckV4aXRbb3NyRXhpdEluZGV4XTsKKyAg
ICAgICAgICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQoc3RhdGUuaml0Q29kZS0+b3NyRXhpdFtv
c3JFeGl0SW5kZXhdLm1fZGVzY3JpcHRvci5tX2lzRXhjZXB0aW9uRnJvbUxhenlTbG93UGF0aCk7
CisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvblRhcmdldCA9IHN0YXRlLmZpbmFsaXplci0+
ZXhpdFRodW5rc0xpbmtCdWZmZXItPmxvY2F0aW9uT2YoaW5mby5tX3RodW5rTGFiZWwpOworICAg
ICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25UYXJnZXQg
PSBzdGF0ZS5maW5hbGl6ZXItPmhhbmRsZUV4Y2VwdGlvbnNMaW5rQnVmZmVyLT5lbnRyeXBvaW50
KCk7CiAKICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TGF6eVNsb3dQYXRoPiBsYXp5
U2xvd1BhdGggPSBzdGQ6Om1ha2VfdW5pcXVlPExhenlTbG93UGF0aD4oCiAgICAgICAgICAgICAg
ICAgICAgIHBhdGNocG9pbnQsIGV4Y2VwdGlvblRhcmdldCwgdXNlZFJlZ2lzdGVycywgc3RhdGUu
aml0Q29kZS0+Y29tbW9uLmFkZFVuaXF1ZUNhbGxTaXRlSW5kZXgoY29kZU9yaWdpbiksCkBAIC04
NDcsMTUgKzk0NywxNyBAQCBzdGF0aWMgdm9pZCBmaXhGdW5jdGlvbkJhc2VkT25TdGFja01hcHMo
CiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmZpbmFsaXplci0+c2lkZUNvZGVMaW5rQnVmZmVy
LT5sb2NhdGlvbk9mKHN0ZDo6Z2V0PDE+KHR1cGxlKSkpOwogICAgICAgICAgICAgfQogICAgICAg
ICB9CisgICAgICAgIGZvciAoYXV0byYgcGFpciA6IGV4Y2VwdGlvbkp1bXBzVG9MaW5rKQorICAg
ICAgICAgICAgc3RhdGUuZmluYWxpemVyLT5zaWRlQ29kZUxpbmtCdWZmZXItPmxpbmsocGFpci5m
aXJzdCwgcGFpci5zZWNvbmQpOwogICAgIH0KICAgICAKLSAgICBhZGp1c3RDYWxsSUNzRm9yU3Rh
Y2ttYXBzKHN0YXRlLmpzQ2FsbHMsIHJlY29yZE1hcCk7CisgICAgYWRqdXN0Q2FsbElDc0ZvclN0
YWNrbWFwcyhzdGF0ZS5qc0NhbGxzLCByZWNvcmRNYXAsIGdlbmVyYXRlT3JHZXRBbHJlYWR5R2Vu
ZXJhdGVkQ2FsbFNpdGVJbmRleCwganNDYWxsT1NSRXhpdEZvclJlY29yZEluZGV4KTsKICAgICAK
ICAgICBmb3IgKHVuc2lnbmVkIGkgPSBzdGF0ZS5qc0NhbGxzLnNpemUoKTsgaS0tOykgewogICAg
ICAgICBKU0NhbGwmIGNhbGwgPSBzdGF0ZS5qc0NhbGxzW2ldOwogCiAgICAgICAgIENDYWxsSGVs
cGVycyBmYXN0UGF0aEpJVCgmdm0sIGNvZGVCbG9jayk7Ci0gICAgICAgIGNhbGwuZW1pdChmYXN0
UGF0aEpJVCwgc3RhdGUpOworICAgICAgICBjYWxsLmVtaXQoZmFzdFBhdGhKSVQsIHN0YXRlLCBq
c0NhbGxUaGF0TWlnaHRUaHJvd1NwaWxsT2Zmc2V0KTsKIAogICAgICAgICBjaGFyKiBzdGFydE9m
SUMgPSBiaXR3aXNlX2Nhc3Q8Y2hhcio+KGdlbmVyYXRlZEZ1bmN0aW9uKSArIGNhbGwubV9pbnN0
cnVjdGlvbk9mZnNldDsKIApAQCAtODY0LDEzICs5NjYsMTMgQEAgc3RhdGljIHZvaWQgZml4RnVu
Y3Rpb25CYXNlZE9uU3RhY2tNYXBzKAogICAgICAgICB9KTsKICAgICB9CiAgICAgCi0gICAgYWRq
dXN0Q2FsbElDc0ZvclN0YWNrbWFwcyhzdGF0ZS5qc0NhbGxWYXJhcmdzZXMsIHJlY29yZE1hcCk7
CisgICAgYWRqdXN0Q2FsbElDc0ZvclN0YWNrbWFwcyhzdGF0ZS5qc0NhbGxWYXJhcmdzZXMsIHJl
Y29yZE1hcCwgZ2VuZXJhdGVPckdldEFscmVhZHlHZW5lcmF0ZWRDYWxsU2l0ZUluZGV4LCBqc0Nh
bGxPU1JFeGl0Rm9yUmVjb3JkSW5kZXgpOwogICAgIAogICAgIGZvciAodW5zaWduZWQgaSA9IHN0
YXRlLmpzQ2FsbFZhcmFyZ3Nlcy5zaXplKCk7IGktLTspIHsKICAgICAgICAgSlNDYWxsVmFyYXJn
cyYgY2FsbCA9IHN0YXRlLmpzQ2FsbFZhcmFyZ3Nlc1tpXTsKICAgICAgICAgCiAgICAgICAgIEND
YWxsSGVscGVycyBmYXN0UGF0aEpJVCgmdm0sIGNvZGVCbG9jayk7Ci0gICAgICAgIGNhbGwuZW1p
dChmYXN0UGF0aEpJVCwgc3RhdGUsIHZhcmFyZ3NTcGlsbFNsb3RzT2Zmc2V0KTsKKyAgICAgICAg
Y2FsbC5lbWl0KGZhc3RQYXRoSklULCBzdGF0ZSwgdmFyYXJnc1NwaWxsU2xvdHNPZmZzZXQsIGpz
Q2FsbFRoYXRNaWdodFRocm93U3BpbGxPZmZzZXQpOwogCiAgICAgICAgIGNoYXIqIHN0YXJ0T2ZJ
QyA9IGJpdHdpc2VfY2FzdDxjaGFyKj4oZ2VuZXJhdGVkRnVuY3Rpb24pICsgY2FsbC5tX2luc3Ry
dWN0aW9uT2Zmc2V0OwogICAgICAgICBzaXplX3Qgc2l6ZU9mSUMgPSBzaXplT2ZJQ0ZvcihjYWxs
Lm5vZGUoKSk7CkBAIC04ODAsNyArOTgyLDggQEAgc3RhdGljIHZvaWQgZml4RnVuY3Rpb25CYXNl
ZE9uU3RhY2tNYXBzKAogICAgICAgICB9KTsKICAgICB9CiAKLSAgICBhZGp1c3RDYWxsSUNzRm9y
U3RhY2ttYXBzKHN0YXRlLmpzVGFpbENhbGxzLCByZWNvcmRNYXApOworICAgIC8vIEZJWE1FOiB3
ZSBkb24ndCByZWFsbHkgbmVlZCB0byBnZW5lcmF0ZSBjYWxsc2l0ZWluZGljZXMgZm9yIHRhaWwg
Y2FsbHMuCisgICAgYWRqdXN0Q2FsbElDc0ZvclN0YWNrbWFwcyhzdGF0ZS5qc1RhaWxDYWxscywg
cmVjb3JkTWFwLCBnZW5lcmF0ZU9yR2V0QWxyZWFkeUdlbmVyYXRlZENhbGxTaXRlSW5kZXgsIGpz
Q2FsbE9TUkV4aXRGb3JSZWNvcmRJbmRleCk7CiAKICAgICBmb3IgKHVuc2lnbmVkIGkgPSBzdGF0
ZS5qc1RhaWxDYWxscy5zaXplKCk7IGktLTspIHsKICAgICAgICAgSlNUYWlsQ2FsbCYgY2FsbCA9
IHN0YXRlLmpzVGFpbENhbGxzW2ldOwpAQCAtOTI5LDggKzEwMzIsMTAgQEAgc3RhdGljIHZvaWQg
Zml4RnVuY3Rpb25CYXNlZE9uU3RhY2tNYXBzKAogICAgIGZvciAodW5zaWduZWQgZXhpdEluZGV4
ID0gMDsgZXhpdEluZGV4IDwgaml0Q29kZS0+b3NyRXhpdC5zaXplKCk7ICsrZXhpdEluZGV4KSB7
CiAgICAgICAgIE9TUkV4aXRDb21waWxhdGlvbkluZm8mIGluZm8gPSBzdGF0ZS5maW5hbGl6ZXIt
Pm9zckV4aXRbZXhpdEluZGV4XTsKICAgICAgICAgT1NSRXhpdCYgZXhpdCA9IGppdENvZGUtPm9z
ckV4aXRbZXhpdEluZGV4XTsKLSAgICAgICAgCiAgICAgICAgIFZlY3Rvcjxjb25zdCB2b2lkKj4g
Y29kZUFkZHJlc3NlczsKKworICAgICAgICBpZiAoZXhpdC5tX2Rlc2NyaXB0b3IubV93aWxsQXJy
aXZlQXRPU1JFeGl0RnJvbUdlbmVyaWNVbndpbmQgfHwgZXhpdC5tX2Rlc2NyaXB0b3IubV9pc0V4
Y2VwdGlvbkZyb21MYXp5U2xvd1BhdGgpIC8vIFRoaXMgaXMgcmVhY2hlZCBieSBhIGp1bXAgZnJv
bSBnZW5lcmljVW53aW5kIG9yIGEganVtcCBmcm9tIGEgbGF6eSBzbG93IHBhdGguCisgICAgICAg
ICAgICBjb250aW51ZTsKICAgICAgICAgCiAgICAgICAgIFN0YWNrTWFwczo6UmVjb3JkJiByZWNv
cmQgPSBqaXRDb2RlLT5zdGFja21hcHMucmVjb3Jkc1tleGl0Lm1fc3RhY2ttYXBSZWNvcmRJbmRl
eF07CiAgICAgICAgIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExFeGl0QXJn
dW1lbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTEV4aXRB
cmd1bWVudC5oCShyZXZpc2lvbiAxOTE5MzEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRs
L0ZUTEV4aXRBcmd1bWVudC5oCSh3b3JraW5nIGNvcHkpCkBAIC03NCw3ICs3NCw3IEBAIHB1Ymxp
YzoKICAgICB7CiAgICAgICAgIHJldHVybiBFeGl0QXJndW1lbnQoZm9ybWF0LCBhcmd1bWVudCgp
KTsKICAgICB9Ci0gICAgCisKICAgICBFeGl0QXJndW1lbnRSZXByZXNlbnRhdGlvbiByZXByZXNl
bnRhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fcmVwcmVzZW50YXRpb247IH0KICAgICAKICAgICB2
b2lkIGR1bXAoUHJpbnRTdHJlYW0mKSBjb25zdDsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9mdGwvRlRMRXhpdFRodW5rR2VuZXJhdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvZnRsL0ZUTEV4aXRUaHVua0dlbmVyYXRvci5jcHAJKHJldmlzaW9uIDE5MTkz
MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMRXhpdFRodW5rR2VuZXJhdG9yLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNDYsMjEgKzQ2LDQxIEBAIEV4aXRUaHVua0dlbmVyYXRvcjo6
fkV4aXRUaHVua0dlbmVyYXRvcigKIHsKIH0KIAotdm9pZCBFeGl0VGh1bmtHZW5lcmF0b3I6OmVt
aXRUaHVuayh1bnNpZ25lZCBpbmRleCkKK3ZvaWQgRXhpdFRodW5rR2VuZXJhdG9yOjplbWl0VGh1
bmsodW5zaWduZWQgaW5kZXgsIGludDMyX3Qgb3NyRXhpdEZyb21HZW5lcmljVW53aW5kU3RhY2tT
cGlsbFNsb3QpCiB7CiAgICAgT1NSRXhpdENvbXBpbGF0aW9uSW5mbyYgaW5mbyA9IG1fc3RhdGUu
ZmluYWxpemVyLT5vc3JFeGl0W2luZGV4XTsKKyAgICBPU1JFeGl0JiBleGl0ID0gbV9zdGF0ZS5q
aXRDb2RlLT5vc3JFeGl0W2luZGV4XTsKICAgICAKICAgICBpbmZvLm1fdGh1bmtMYWJlbCA9IGxh
YmVsKCk7CisKKyAgICBpZiAoZXhpdC5tX2Rlc2NyaXB0b3IubV93aWxsQXJyaXZlQXRPU1JFeGl0
RnJvbUdlbmVyaWNVbndpbmQpIHsKKyAgICAgICAgcmVzdG9yZUNhbGxlZVNhdmVzRnJvbVZNQ2Fs
bGVlU2F2ZXNCdWZmZXIoKTsKKyAgICAgICAgbG9hZFB0cih2bSgpLT5hZGRyZXNzT2ZDYWxsRnJh
bWVGb3JDYXRjaCgpLCBmcmFtZVBvaW50ZXJSZWdpc3Rlcik7CisgICAgICAgIGFkZFB0cihUcnVz
dGVkSW1tMzIoLSBzdGF0aWNfY2FzdDxpbnQ2NF90PihtX3N0YXRlLmppdENvZGUtPnN0YWNrbWFw
cy5zdGFja1NpemVGb3JMb2NhbHMoKSkpLCAKKyAgICAgICAgICAgIGZyYW1lUG9pbnRlclJlZ2lz
dGVyLCBzdGFja1BvaW50ZXJSZWdpc3Rlcik7CisKKyAgICAgICAgaWYgKGV4aXQubV9kZXNjcmlw
dG9yLm1faXNFeGNlcHRpb25Gcm9tSlNDYWxsKQorICAgICAgICAgICAgZXhpdC5yZWNvdmVyUmVn
aXN0ZXJzRnJvbVNwaWxsU2xvdCgqdGhpcywgb3NyRXhpdEZyb21HZW5lcmljVW53aW5kU3RhY2tT
cGlsbFNsb3QpOworCisgICAgICAgIEp1bXAgc2tpcEdldEFuZFB1dEJ5SWRTbG93UGF0aEVudHJh
bmNlID0ganVtcCgpOworCisgICAgICAgIGluZm8ubV9nZXRBbmRQdXRCeUlkQ2FsbE9wZXJhdGlv
bkV4Y2VwdGlvbk9TUkV4aXRFbnRyYW5jZSA9IGxhYmVsKCk7CisgICAgICAgIGlmIChleGl0Lm1f
ZGVzY3JpcHRvci5tX2lzRXhjZXB0aW9uRnJvbUdldEJ5SWQpCisgICAgICAgICAgICBleGl0LnJl
Y292ZXJSZWdpc3RlcnNGcm9tU3BpbGxTbG90KCp0aGlzLCBvc3JFeGl0RnJvbUdlbmVyaWNVbndp
bmRTdGFja1NwaWxsU2xvdCk7CisgICAgICAgIAorICAgICAgICBza2lwR2V0QW5kUHV0QnlJZFNs
b3dQYXRoRW50cmFuY2UubGluayh0aGlzKTsKKyAgICB9CisKICAgICBwdXNoVG9TYXZlSW1tZWRp
YXRlV2l0aG91dFRvdWNoaW5nUmVnaXN0ZXJzKFRydXN0ZWRJbW0zMihpbmRleCkpOwogICAgIGlu
Zm8ubV90aHVua0p1bXAgPSBwYXRjaGFibGVKdW1wKCk7CiAgICAgCiAgICAgbV9kaWRUaGluZ3Mg
PSB0cnVlOwogfQogCi12b2lkIEV4aXRUaHVua0dlbmVyYXRvcjo6ZW1pdFRodW5rcygpCit2b2lk
IEV4aXRUaHVua0dlbmVyYXRvcjo6ZW1pdFRodW5rcyhpbnQzMl90IG9zckV4aXRGcm9tR2VuZXJp
Y1Vud2luZFN0YWNrU3BpbGxTbG90KQogewogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBt
X3N0YXRlLmZpbmFsaXplci0+b3NyRXhpdC5zaXplKCk7ICsraSkKLSAgICAgICAgZW1pdFRodW5r
KGkpOworICAgICAgICBlbWl0VGh1bmsoaSwgb3NyRXhpdEZyb21HZW5lcmljVW53aW5kU3RhY2tT
cGlsbFNsb3QpOwogfQogCiB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6RlRMCkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvZnRsL0ZUTEV4aXRUaHVua0dlbmVyYXRvci5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMRXhpdFRodW5rR2VuZXJhdG9yLmgJKHJldmlz
aW9uIDE5MTkzMSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMRXhpdFRodW5rR2Vu
ZXJhdG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTQwLDggKzQwLDggQEAgcHVibGljOgogICAgIEV4
aXRUaHVua0dlbmVyYXRvcihTdGF0ZSYgc3RhdGUpOwogICAgIH5FeGl0VGh1bmtHZW5lcmF0b3Io
KTsKICAgICAKLSAgICB2b2lkIGVtaXRUaHVuayh1bnNpZ25lZCBpbmRleCk7Ci0gICAgdm9pZCBl
bWl0VGh1bmtzKCk7CisgICAgdm9pZCBlbWl0VGh1bmsodW5zaWduZWQgaW5kZXgsIGludDMyX3Qg
b3NyRXhpdEZyb21HZW5lcmljVW53aW5kU3RhY2tTcGlsbFNsb3QpOworICAgIHZvaWQgZW1pdFRo
dW5rcyhpbnQzMl90IG9zckV4aXRGcm9tR2VuZXJpY1Vud2luZFN0YWNrU3BpbGxTbG90KTsKICAg
ICAKICAgICBib29sIGRpZFRoaW5ncygpIGNvbnN0IHsgcmV0dXJuIG1fZGlkVGhpbmdzOyB9CiAK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMRXhpdFZhbHVlLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExFeGl0VmFsdWUuaAkocmV2aXNpb24g
MTkxOTMxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExFeGl0VmFsdWUuaAkod29y
a2luZyBjb3B5KQpAQCAtMTU3LDYgKzE1Nyw3IEBAIHB1YmxpYzoKICAgICBib29sIGlzQXJndW1l
bnQoKSBjb25zdCB7IHJldHVybiBraW5kKCkgPT0gRXhpdFZhbHVlQXJndW1lbnQ7IH0KICAgICBi
b29sIGlzUmVjb3ZlcnkoKSBjb25zdCB7IHJldHVybiBraW5kKCkgPT0gRXhpdFZhbHVlUmVjb3Zl
cnk7IH0KICAgICBib29sIGlzT2JqZWN0TWF0ZXJpYWxpemF0aW9uKCkgY29uc3QgeyByZXR1cm4g
a2luZCgpID09IEV4aXRWYWx1ZU1hdGVyaWFsaXplTmV3T2JqZWN0OyB9CisgICAgYm9vbCBoYXNJ
bmRleEluU3RhY2ttYXBMb2NhdGlvbnMoKSBjb25zdCB7IHJldHVybiBpc0FyZ3VtZW50KCkgfHwg
aXNSZWNvdmVyeSgpOyB9CiAgICAgCiAgICAgRXhpdEFyZ3VtZW50IGV4aXRBcmd1bWVudCgpIGNv
bnN0CiAgICAgewpAQCAtMTc1LDYgKzE3NiwxOCBAQCBwdWJsaWM6CiAgICAgICAgIEFTU0VSVChp
c1JlY292ZXJ5KCkpOwogICAgICAgICByZXR1cm4gdS5yZWNvdmVyeS5yaWdodEFyZ3VtZW50Owog
ICAgIH0KKworICAgIHZvaWQgYWRqdXN0U3RhY2ttYXBMb2NhdGlvbnNJbmRleEJ5T2Zmc2V0KHVu
c2lnbmVkIG9mZnNldCkKKyAgICB7CisgICAgICAgIEFTU0VSVChoYXNJbmRleEluU3RhY2ttYXBM
b2NhdGlvbnMoKSk7CisgICAgICAgIGlmIChpc0FyZ3VtZW50KCkpCisgICAgICAgICAgICB1LmFy
Z3VtZW50LmFyZ3VtZW50ICs9IG9mZnNldDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBB
U1NFUlQoaXNSZWNvdmVyeSgpKTsKKyAgICAgICAgICAgIHUucmVjb3ZlcnkucmlnaHRBcmd1bWVu
dCArPSBvZmZzZXQ7CisgICAgICAgICAgICB1LnJlY292ZXJ5LmxlZnRBcmd1bWVudCArPSBvZmZz
ZXQ7CisgICAgICAgIH0KKyAgICB9CiAgICAgCiAgICAgRGF0YUZvcm1hdCByZWNvdmVyeUZvcm1h
dCgpIGNvbnN0CiAgICAgewpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExKSVRD
b2RlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTEpJVENv
ZGUuY3BwCShyZXZpc2lvbiAxOTE5MzEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZU
TEpJVENvZGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNDQsMTAgKzE0NCwxNCBAQCB2b2lkIEpJ
VENvZGU6OnZhbGlkYXRlUmVmZXJlbmNlcyhjb25zdCBUCiAgICAgICAgIGV4aXQubV9kZXNjcmlw
dG9yLnZhbGlkYXRlUmVmZXJlbmNlcyh0cmFja2VkUmVmZXJlbmNlcyk7CiB9CiAKLVJlZ2lzdGVy
U2V0IEpJVENvZGU6OmxpdmVSZWdpc3RlcnNUb1ByZXNlcnZlQXRFeGNlcHRpb25IYW5kbGluZ0Nh
bGxTaXRlKENvZGVCbG9jayosIENhbGxTaXRlSW5kZXgpCitSZWdpc3RlclNldCBKSVRDb2RlOjps
aXZlUmVnaXN0ZXJzVG9QcmVzZXJ2ZUF0RXhjZXB0aW9uSGFuZGxpbmdDYWxsU2l0ZShDb2RlQmxv
Y2sqLCBDYWxsU2l0ZUluZGV4IGNhbGxTaXRlSW5kZXgpCiB7Ci0gICAgLy8gRklYTUU6IGltcGxl
bWVudCB0aGlzIHdoZW4gRlRMIGltcGxlbWVudHMgdHJ5L2NhdGNoLgotICAgIC8vIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDk0MDkKKyAgICBmb3IgKE9TUkV4aXQm
IGV4aXQgOiBvc3JFeGl0KSB7CisgICAgICAgIGlmIChleGl0Lm1fZXhjZXB0aW9uSGFuZGxlckNh
bGxTaXRlSW5kZXguYml0cygpID09IGNhbGxTaXRlSW5kZXguYml0cygpKSB7CisgICAgICAgICAg
ICBSRUxFQVNFX0FTU0VSVChleGl0Lm1faXNFeGNlcHRpb25IYW5kbGVyKTsKKyAgICAgICAgICAg
IHJldHVybiBzdGFja21hcHMucmVjb3Jkc1tleGl0Lm1fc3RhY2ttYXBSZWNvcmRJbmRleF0udXNl
ZFJlZ2lzdGVyU2V0KCk7CisgICAgICAgIH0KKyAgICB9CiAgICAgcmV0dXJuIFJlZ2lzdGVyU2V0
KCk7CiB9CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMSlNDYWxsLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTEpTQ2FsbC5jcHAJKHJl
dmlzaW9uIDE5MTkzMSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMSlNDYWxsLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNTAsOSArNTAsOSBAQCBKU0NhbGw6OkpTQ2FsbCh1bnNpZ25l
ZCBzdGFja21hcElELCBOb2RlCiAgICAgQVNTRVJUKG5vZGUtPm9wKCkgPT0gQ2FsbCB8fCBub2Rl
LT5vcCgpID09IENvbnN0cnVjdCB8fCBub2RlLT5vcCgpID09IFRhaWxDYWxsSW5saW5lZENhbGxl
cik7CiB9CiAKLXZvaWQgSlNDYWxsOjplbWl0KENDYWxsSGVscGVycyYgaml0LCBTdGF0ZSYgc3Rh
dGUpCit2b2lkIEpTQ2FsbDo6ZW1pdChDQ2FsbEhlbHBlcnMmIGppdCwgU3RhdGUmIHN0YXRlLCBp
bnQzMl90IG9zckV4aXRGcm9tR2VuZXJpY1Vud2luZFNwaWxsU2xvdHMpCiB7Ci0gICAgSlNDYWxs
QmFzZTo6ZW1pdChqaXQsIHN0YXRlKTsKKyAgICBKU0NhbGxCYXNlOjplbWl0KGppdCwgc3RhdGUs
IG9zckV4aXRGcm9tR2VuZXJpY1Vud2luZFNwaWxsU2xvdHMpOwogCiAgICAgaml0LmFkZFB0cihD
Q2FsbEhlbHBlcnM6OlRydXN0ZWRJbW0zMigtIHN0YXRpY19jYXN0PGludDY0X3Q+KHN0YXRlLmpp
dENvZGUtPnN0YWNrbWFwcy5zdGFja1NpemVGb3JMb2NhbHMoKSkpLCBDQ2FsbEhlbHBlcnM6OmZy
YW1lUG9pbnRlclJlZ2lzdGVyLCBDQ2FsbEhlbHBlcnM6OnN0YWNrUG9pbnRlclJlZ2lzdGVyKTsK
IH0KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMSlNDYWxsLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExKU0NhbGwuaAkocmV2aXNpb24gMTkx
OTMxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExKU0NhbGwuaAkod29ya2luZyBj
b3B5KQpAQCAtNDMsNyArNDMsNyBAQCBwdWJsaWM6CiAgICAgSlNDYWxsKCk7CiAgICAgSlNDYWxs
KHVuc2lnbmVkIHN0YWNrbWFwSUQsIERGRzo6Tm9kZSosIENvZGVPcmlnaW4gY2FsbFNpdGVEZXNj
cmlwdGlvbk9yaWdpbik7CiAKLSAgICB2b2lkIGVtaXQoQ0NhbGxIZWxwZXJzJiwgU3RhdGUmKTsK
KyAgICB2b2lkIGVtaXQoQ0NhbGxIZWxwZXJzJiwgU3RhdGUmLCBpbnQzMl90IG9zckV4aXRGcm9t
R2VuZXJpY1Vud2luZFNwaWxsU2xvdHMpOwogICAgIAogICAgIHVuc2lnbmVkIHN0YWNrbWFwSUQo
KSBjb25zdCB7IHJldHVybiBtX3N0YWNrbWFwSUQ7IH0KICAgICAKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9mdGwvRlRMSlNDYWxsQmFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2Z0bC9GVExKU0NhbGxCYXNlLmNwcAkocmV2aXNpb24gMTkxOTMxKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExKU0NhbGxCYXNlLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMzksNiArMzksNyBAQCB1c2luZyBuYW1lc3BhY2UgREZHOwogSlNDYWxsQmFzZTo6SlND
YWxsQmFzZSgpCiAgICAgOiBtX3R5cGUoQ2FsbExpbmtJbmZvOjpOb25lKQogICAgICwgbV9jYWxs
TGlua0luZm8obnVsbHB0cikKKyAgICAsIG1fY29ycmVzcG9uZGluZ0dlbmVyaWNVbndpbmRPU1JF
eGl0KG51bGxwdHIpCiB7CiB9CiAKQEAgLTUwLDEwICs1MSwxNCBAQCBKU0NhbGxCYXNlOjpKU0Nh
bGxCYXNlKENhbGxMaW5rSW5mbzo6Q2FsCiB7CiB9CiAKLXZvaWQgSlNDYWxsQmFzZTo6ZW1pdChD
Q2FsbEhlbHBlcnMmIGppdCwgU3RhdGUmIHN0YXRlKQordm9pZCBKU0NhbGxCYXNlOjplbWl0KEND
YWxsSGVscGVycyYgaml0LCBTdGF0ZSYgLypzdGF0ZSovLCBpbnQzMl90IG9zckV4aXRGcm9tR2Vu
ZXJpY1Vud2luZFN0YWNrU3BpbGxTbG90KQogewotICAgIENhbGxTaXRlSW5kZXggY2FsbFNpdGVJ
bmRleCA9IHN0YXRlLmppdENvZGUtPmNvbW1vbi5hZGRVbmlxdWVDYWxsU2l0ZUluZGV4KG1fY2Fs
bFNpdGVEZXNjcmlwdGlvbk9yaWdpbik7Ci0gICAgaml0LnN0b3JlMzIoQ0NhbGxIZWxwZXJzOjpU
cnVzdGVkSW1tMzIoY2FsbFNpdGVJbmRleC5iaXRzKCkpLCBDQ2FsbEhlbHBlcnM6OnRhZ0Zvcihz
dGF0aWNfY2FzdDxWaXJ0dWFsUmVnaXN0ZXI+KEpTU3RhY2s6OkFyZ3VtZW50Q291bnQpKSk7Cisg
ICAgUkVMRUFTRV9BU1NFUlQoISFtX2NhbGxTaXRlSW5kZXgpOworICAgIAorICAgIGlmIChtX2Nv
cnJlc3BvbmRpbmdHZW5lcmljVW53aW5kT1NSRXhpdCkKKyAgICAgICAgbV9jb3JyZXNwb25kaW5n
R2VuZXJpY1Vud2luZE9TUkV4aXQtPnNwaWxsUmVnaXN0ZXJzVG9TcGlsbFNsb3Qoaml0LCBvc3JF
eGl0RnJvbUdlbmVyaWNVbndpbmRTdGFja1NwaWxsU2xvdCk7CisKKyAgICBqaXQuc3RvcmUzMihD
Q2FsbEhlbHBlcnM6OlRydXN0ZWRJbW0zMihtX2NhbGxTaXRlSW5kZXguYml0cygpKSwgQ0NhbGxI
ZWxwZXJzOjp0YWdGb3Ioc3RhdGljX2Nhc3Q8VmlydHVhbFJlZ2lzdGVyPihKU1N0YWNrOjpBcmd1
bWVudENvdW50KSkpOwogCiAgICAgbV9jYWxsTGlua0luZm8gPSBqaXQuY29kZUJsb2NrKCktPmFk
ZENhbGxMaW5rSW5mbygpOwogICAgIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9G
VExKU0NhbGxCYXNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9G
VExKU0NhbGxCYXNlLmgJKHJldmlzaW9uIDE5MTkzMSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9mdGwvRlRMSlNDYWxsQmFzZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMSw2ICszMSw3IEBACiAj
aW5jbHVkZSAiQ0NhbGxIZWxwZXJzLmgiCiAjaW5jbHVkZSAiQ2FsbExpbmtJbmZvLmgiCiAjaW5j
bHVkZSAiQ29kZU9yaWdpbi5oIgorI2luY2x1ZGUgIkZUTE9TUkV4aXQuaCIKIAogbmFtZXNwYWNl
IEpTQyB7CiAKQEAgLTQ5LDE3ICs1MCwyNSBAQCBwdWJsaWM6CiAgICAgSlNDYWxsQmFzZSgpOwog
ICAgIEpTQ2FsbEJhc2UoQ2FsbExpbmtJbmZvOjpDYWxsVHlwZSwgQ29kZU9yaWdpbiBzZW1hbnRp
YywgQ29kZU9yaWdpbiBjYWxsU2l0ZURlc2NyaXB0aW9uKTsKICAgICAKLSAgICB2b2lkIGVtaXQo
Q0NhbGxIZWxwZXJzJiwgU3RhdGUmKTsKKyAgICB2b2lkIGVtaXQoQ0NhbGxIZWxwZXJzJiwgU3Rh
dGUmLCBpbnQzMl90IG9zckV4aXRGcm9tR2VuZXJpY1Vud2luZFNwaWxsU2xvdHMpOwogICAgIHZv
aWQgbGluayhWTSYsIExpbmtCdWZmZXImKTsKKworICAgIHZvaWQgc2V0Q2FsbFNpdGVJbmRleChD
YWxsU2l0ZUluZGV4IGNhbGxTaXRlSW5kZXgpIHsgbV9jYWxsU2l0ZUluZGV4ID0gY2FsbFNpdGVJ
bmRleDsgfQorICAgIENvZGVPcmlnaW4gY2FsbFNpdGVEZXNjcmlwdGlvbk9yaWdpbigpIGNvbnN0
IHsgcmV0dXJuIG1fY2FsbFNpdGVEZXNjcmlwdGlvbk9yaWdpbjsgfQorCisgICAgdm9pZCBzZXRD
b3JyZXNwb25kaW5nR2VuZXJpY1Vud2luZE9TUkV4aXQoT1NSRXhpdCogZXhpdCkgeyBtX2NvcnJl
c3BvbmRpbmdHZW5lcmljVW53aW5kT1NSRXhpdCA9IGV4aXQ7IH0KICAgICAKIHByb3RlY3RlZDoK
ICAgICBDYWxsTGlua0luZm86OkNhbGxUeXBlIG1fdHlwZTsKICAgICBDb2RlT3JpZ2luIG1fc2Vt
YW50aWNlT3JpZ2luOwogICAgIENvZGVPcmlnaW4gbV9jYWxsU2l0ZURlc2NyaXB0aW9uT3JpZ2lu
OyAvLyBUaGVzZSB0d28gY29kZSBvcmlnaW5zIG1heSBiZSBkaWZmZXJlbnQgd2l0aCB0YWlsIGNh
bGxzIHVuZGVyIHNvbWUgY2lyY3Vtc3RhbmNlcyBvZiBpbmxpbmluZy4gU2VlIHJlbGV2YW50IGNv
bW1lbnQgaW4gTG93ZXJERkdUb0xMVk0uCisgICAgQ2FsbFNpdGVJbmRleCBtX2NhbGxTaXRlSW5k
ZXg7CiAgICAgQ0NhbGxIZWxwZXJzOjpEYXRhTGFiZWxQdHIgbV90YXJnZXRUb0NoZWNrOwogICAg
IENDYWxsSGVscGVyczo6Q2FsbCBtX2Zhc3RDYWxsOwogICAgIENDYWxsSGVscGVyczo6Q2FsbCBt
X3Nsb3dDYWxsOwogICAgIENhbGxMaW5rSW5mbyogbV9jYWxsTGlua0luZm87CitwdWJsaWM6Cisg
ICAgT1NSRXhpdCogbV9jb3JyZXNwb25kaW5nR2VuZXJpY1Vud2luZE9TUkV4aXQ7CiB9OwogCiB9
IH0gLy8gbmFtZXNwYWNlIEpTQzo6RlRMCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRs
L0ZUTEpTQ2FsbFZhcmFyZ3MuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9mdGwvRlRMSlNDYWxsVmFyYXJncy5jcHAJKHJldmlzaW9uIDE5MTkzMSkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9mdGwvRlRMSlNDYWxsVmFyYXJncy5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTY5LDcgKzY5LDcgQEAgdW5zaWduZWQgSlNDYWxsVmFyYXJnczo6bnVtU3BpbGxTbG90c05lZQog
ICAgIHJldHVybiA0OwogfQogCi12b2lkIEpTQ2FsbFZhcmFyZ3M6OmVtaXQoQ0NhbGxIZWxwZXJz
JiBqaXQsIFN0YXRlJiBzdGF0ZSwgaW50MzJfdCBzcGlsbFNsb3RzT2Zmc2V0KQordm9pZCBKU0Nh
bGxWYXJhcmdzOjplbWl0KENDYWxsSGVscGVycyYgaml0LCBTdGF0ZSYgc3RhdGUsIGludDMyX3Qg
c3BpbGxTbG90c09mZnNldCwgaW50MzJfdCBvc3JFeGl0RnJvbUdlbmVyaWNVbndpbmRTcGlsbFNs
b3RzKQogewogICAgIC8vIFdlIGFyZSBwYXNzZWQgdGhyZWUgcGllY2VzIG9mIGluZm9ybWF0aW9u
OgogICAgIC8vIC0gVGhlIGNhbGxlZS4KQEAgLTIwNSw3ICsyMDUsOCBAQCB2b2lkIEpTQ2FsbFZh
cmFyZ3M6OmVtaXQoQ0NhbGxIZWxwZXJzJiBqCiAgICAgLy8gc3RhY2sgZnJhbWUgdG8gYWxyZWFk
eSBiZSBzZXQgdXAsIHdoaWNoIGl0IGlzLgogICAgIGppdC5zdG9yZTY0KEdQUkluZm86OnJlZ1Qw
LCBDQ2FsbEhlbHBlcnM6OmNhbGxlZUZyYW1lU2xvdChKU1N0YWNrOjpDYWxsZWUpKTsKIAotICAg
IG1fY2FsbEJhc2UuZW1pdChqaXQsIHN0YXRlKTsKKyAgICBtX2NhbGxCYXNlLmVtaXQoaml0LCBz
dGF0ZSwgb3NyRXhpdEZyb21HZW5lcmljVW53aW5kU3BpbGxTbG90cyk7CisKICAgICAKICAgICAv
LyBVbmRvIHRoZSBkYW1hZ2Ugd2UndmUgZG9uZS4KICAgICBpZiAoaXNBUk02NCgpKSB7CkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTEpTQ2FsbFZhcmFyZ3MuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTEpTQ2FsbFZhcmFyZ3MuaAkocmV2aXNp
b24gMTkxOTMxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExKU0NhbGxWYXJhcmdz
LmgJKHdvcmtpbmcgY29weSkKQEAgLTQ5LDcgKzQ5LDcgQEAgcHVibGljOgogICAgIAogICAgIHN0
YXRpYyB1bnNpZ25lZCBudW1TcGlsbFNsb3RzTmVlZGVkKCk7CiAgICAgCi0gICAgdm9pZCBlbWl0
KENDYWxsSGVscGVycyYsIFN0YXRlJiwgaW50MzJfdCBzcGlsbFNsb3RzT2Zmc2V0KTsKKyAgICB2
b2lkIGVtaXQoQ0NhbGxIZWxwZXJzJiwgU3RhdGUmLCBpbnQzMl90IHNwaWxsU2xvdHNPZmZzZXQs
IGludDMyX3Qgb3NyRXhpdEZyb21HZW5lcmljVW53aW5kU3BpbGxTbG90cyk7CiAgICAgdm9pZCBs
aW5rKFZNJiwgTGlua0J1ZmZlciYsIENvZGVMb2NhdGlvbkxhYmVsIGV4Y2VwdGlvbkhhbmRsZXIp
OwogICAgIAogICAgIHVuc2lnbmVkIHN0YWNrbWFwSUQoKSBjb25zdCB7IHJldHVybiBtX3N0YWNr
bWFwSUQ7IH0KQEAgLTU5LDYgKzU5LDEwIEBAIHB1YmxpYzoKICAgICAgICAgcmV0dXJuIG1faW5z
dHJ1Y3Rpb25PZmZzZXQgPCBvdGhlci5tX2luc3RydWN0aW9uT2Zmc2V0OwogICAgIH0KICAgICAK
KyAgICB2b2lkIHNldENhbGxTaXRlSW5kZXgoQ2FsbFNpdGVJbmRleCBjYWxsU2l0ZUluZGV4KSB7
IG1fY2FsbEJhc2Uuc2V0Q2FsbFNpdGVJbmRleChjYWxsU2l0ZUluZGV4KTsgfQorICAgIENvZGVP
cmlnaW4gY2FsbFNpdGVEZXNjcmlwdGlvbk9yaWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fY2FsbEJh
c2UuY2FsbFNpdGVEZXNjcmlwdGlvbk9yaWdpbigpOyB9CisgICAgdm9pZCBzZXRDb3JyZXNwb25k
aW5nR2VuZXJpY1Vud2luZE9TUkV4aXQoT1NSRXhpdCogZXhpdCkgeyBtX2NhbGxCYXNlLnNldENv
cnJlc3BvbmRpbmdHZW5lcmljVW53aW5kT1NSRXhpdChleGl0KTsgfQorICAgIAogcHJpdmF0ZToK
ICAgICB1bnNpZ25lZCBtX3N0YWNrbWFwSUQ7CiAgICAgREZHOjpOb2RlKiBtX25vZGU7CkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTExvd2VyREZHVG9MTFZNLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTExvd2VyREZHVG9MTFZNLmNwcAko
cmV2aXNpb24gMTkxOTMxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExMb3dlckRG
R1RvTExWTS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE3MCw4ICsxNzAsOSBAQCBwdWJsaWM6CiAg
ICAgICAgICAgICBtX291dC5zdGFja21hcEludHJpbnNpYygpLCBtX291dC5jb25zdEludDY0KG1f
ZnRsU3RhdGUuY2FwdHVyZWRTdGFja21hcElEKSwKICAgICAgICAgICAgIG1fb3V0LmludDMyWmVy
bywgY2FwdHVyZWRBbGxvY2EpOwogICAgICAgICAKLSAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbnkg
Q2FsbFZhcmFyZ3MgdGhlbiB3ZSBuZWUgdG8gaGF2ZSBhIHNwaWxsIHNsb3QgZm9yIGl0LgorICAg
ICAgICAvLyBJZiB3ZSBoYXZlIGFueSBDYWxsVmFyYXJncyB0aGVuIHdlIG5lZWQgdG8gaGF2ZSBh
IHNwaWxsIHNsb3QgZm9yIGl0LgogICAgICAgICBib29sIGhhc1ZhcmFyZ3MgPSBmYWxzZTsKKyAg
ICAgICAgc2l6ZV90IG1heE51bWJlck9mQ2F0Y2hTcGlsbHMgPSAwOwogICAgICAgICBmb3IgKEJh
c2ljQmxvY2sqIGJsb2NrIDogcHJlT3JkZXIpIHsKICAgICAgICAgICAgIGZvciAoTm9kZSogbm9k
ZSA6ICpibG9jaykgewogICAgICAgICAgICAgICAgIHN3aXRjaCAobm9kZS0+b3AoKSkgewpAQCAt
MTg4LDYgKzE4OSw0MyBAQCBwdWJsaWM6CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAg
ICAgaWYgKG1fZ3JhcGgubV9oYXNFeGNlcHRpb25IYW5kbGVycykgeworICAgICAgICAgICAgICAg
ICAgICBzd2l0Y2ggKG5vZGUtPm9wKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDYWxs
OgorICAgICAgICAgICAgICAgICAgICBjYXNlIENhbGxWYXJhcmdzOgorICAgICAgICAgICAgICAg
ICAgICBjYXNlIENhbGxGb3J3YXJkVmFyYXJnczoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBD
b25zdHJ1Y3Q6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29uc3RydWN0VmFyYXJnczoKKyAg
ICAgICAgICAgICAgICAgICAgY2FzZSBDb25zdHJ1Y3RGb3J3YXJkVmFyYXJnczoKKyAgICAgICAg
ICAgICAgICAgICAgY2FzZSBUYWlsQ2FsbElubGluZWRDYWxsZXI6CisgICAgICAgICAgICAgICAg
ICAgIGNhc2UgVGFpbENhbGxWYXJhcmdzSW5saW5lZENhbGxlcjoKKyAgICAgICAgICAgICAgICAg
ICAgY2FzZSBUYWlsQ2FsbEZvcndhcmRWYXJhcmdzSW5saW5lZENhbGxlcjogeworICAgICAgICAg
ICAgICAgICAgICAgICAgQ29kZU9yaWdpbiBvcENhdGNoT3JpZ2luOworICAgICAgICAgICAgICAg
ICAgICAgICAgSGFuZGxlckluZm8qIGV4Y2VwdGlvbkhhbmRsZXI7CisgICAgICAgICAgICAgICAg
ICAgICAgICBib29sIHdpbGxDYXRjaEV4Y2VwdGlvbiA9IG1fZ3JhcGgud2lsbENhdGNoRXhjZXB0
aW9uSW5NYWNoaW5lRnJhbWUobm9kZS0+b3JpZ2luLmZvckV4aXQsIG9wQ2F0Y2hPcmlnaW4sIGV4
Y2VwdGlvbkhhbmRsZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbGxDYXRjaEV4
Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhOdW1iZXJPZkNhdGNoU3Bp
bGxzID0gc3RkOjptYXgobWF4TnVtYmVyT2ZDYXRjaFNwaWxscywgbV9ncmFwaC5sb2NhbHNMaXZl
SW5CeXRlY29kZShvcENhdGNoT3JpZ2luKS5iaXRDb3VudCgpKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAg
IGNhc2UgR2V0QnlJZDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBHZXRCeUlkRmx1c2g6IHsK
KyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1heSBoYXZlIHRvIGZsdXNoIG9uZSB0aGlu
ZyBmb3IgR2V0QnlJZHMgd2hlbiB0aGUgYmFzZSBhbmQgcmVzdWx0CisgICAgICAgICAgICAgICAg
ICAgICAgICAvLyBhcmUgYXNzaWduZWQgdGhlIHNhbWUgcmVnaXN0ZXIuIEZvciBhIG1vcmUgY29t
cHJlaGVuc2l2ZSBvdmVydmlldywgbG9vaworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQg
dGhlIGNvbW1lbnQgaW4gRlRMQ29tcGlsZS5jcHAKKyAgICAgICAgICAgICAgICAgICAgICAgIENv
ZGVPcmlnaW4gb3BDYXRjaE9yaWdpbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJJ
bmZvKiBleGNlcHRpb25IYW5kbGVyOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aWxs
Q2F0Y2hFeGNlcHRpb24gPSBtX2dyYXBoLndpbGxDYXRjaEV4Y2VwdGlvbkluTWFjaGluZUZyYW1l
KG5vZGUtPm9yaWdpbi5mb3JFeGl0LCBvcENhdGNoT3JpZ2luLCBleGNlcHRpb25IYW5kbGVyKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aWxsQ2F0Y2hFeGNlcHRpb24pIHsKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IG51bWJlck9mR2V0QnlJ
ZFNwaWxscyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TnVtYmVyT2ZDYXRj
aFNwaWxscyA9IHN0ZDo6bWF4KG1heE51bWJlck9mQ2F0Y2hTcGlsbHMsIG51bWJlck9mR2V0QnlJ
ZFNwaWxscyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBk
ZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAg
ICAgaWYgKGhhc1ZhcmFyZ3MpIHsKQEAgLTE5OCw2ICsyMzYsMTggQEAgcHVibGljOgogICAgICAg
ICAgICAgICAgIG1fb3V0LnN0YWNrbWFwSW50cmluc2ljKCksIG1fb3V0LmNvbnN0SW50NjQobV9m
dGxTdGF0ZS52YXJhcmdzU3BpbGxTbG90c1N0YWNrbWFwSUQpLAogICAgICAgICAgICAgICAgIG1f
b3V0LmludDMyWmVybywgdmFyYXJnc1NwaWxsU2xvdHMpOwogICAgICAgICB9CisKKyAgICAgICAg
aWYgKG1fZ3JhcGgubV9oYXNFeGNlcHRpb25IYW5kbGVycyAmJiBtYXhOdW1iZXJPZkNhdGNoU3Bp
bGxzKSB7CisgICAgICAgICAgICBSZWdpc3RlclNldCB2b2xhdGlsZVJlZ2lzdGVycyA9IFJlZ2lz
dGVyU2V0Ojp2b2xhdGlsZVJlZ2lzdGVyc0ZvckpTQ2FsbCgpOworICAgICAgICAgICAgbWF4TnVt
YmVyT2ZDYXRjaFNwaWxscyA9IHN0ZDo6bWluKHZvbGF0aWxlUmVnaXN0ZXJzLm51bWJlck9mU2V0
UmVnaXN0ZXJzKCksIG1heE51bWJlck9mQ2F0Y2hTcGlsbHMpOworCisgICAgICAgICAgICBMVmFs
dWUgZXhjZXB0aW9uSGFuZGxpbmdWb2xhdGlsZVJlZ2lzdGVyc1NwaWxsU2xvdHMgPSBtX291dC5h
bGxvY2EoCisgICAgICAgICAgICAgICAgYXJyYXlUeXBlKG1fb3V0LmludDY0LCBtYXhOdW1iZXJP
ZkNhdGNoU3BpbGxzKSk7CisgICAgICAgICAgICBtX2Z0bFN0YXRlLmV4Y2VwdGlvbkhhbmRsaW5n
U3BpbGxTbG90U3RhY2ttYXBJRCA9IG1fc3RhY2ttYXBJRHMrKzsKKyAgICAgICAgICAgIG1fb3V0
LmNhbGwoCisgICAgICAgICAgICAgICAgbV9vdXQuc3RhY2ttYXBJbnRyaW5zaWMoKSwgbV9vdXQu
Y29uc3RJbnQ2NChtX2Z0bFN0YXRlLmV4Y2VwdGlvbkhhbmRsaW5nU3BpbGxTbG90U3RhY2ttYXBJ
RCksCisgICAgICAgICAgICAgICAgbV9vdXQuaW50MzJaZXJvLCBleGNlcHRpb25IYW5kbGluZ1Zv
bGF0aWxlUmVnaXN0ZXJzU3BpbGxTbG90cyk7CisgICAgICAgIH0KICAgICAgICAgCiAgICAgICAg
IC8vIFdlIHNob3VsZCBub3QgY3JlYXRlIGFueSBhbGxvY2EncyBhZnRlciB0aGlzIHBvaW50LCBz
aW5jZSB0aGV5IHdpbGwgY2Vhc2UgdG8KICAgICAgICAgLy8gYmUgbWVtMnJlZyBjYW5kaWRhdGVz
LgpAQCAtMjMxMSwxMCArMjM2MSwxOCBAQCBwcml2YXRlOgogICAgICAgICBpZiAodmVyYm9zZUNv
bXBpbGF0aW9uRW5hYmxlZCgpKQogICAgICAgICAgICAgZGF0YUxvZygiICAgIEVtaXR0aW5nIFB1
dEJ5SWQgcGF0Y2hwb2ludCB3aXRoIHN0YWNrbWFwICMiLCBzdGFja21hcElELCAiXG4iKTsKICAg
ICAgICAgCi0gICAgICAgIExWYWx1ZSBjYWxsID0gbV9vdXQuY2FsbCgKLSAgICAgICAgICAgIG1f
b3V0LnBhdGNocG9pbnRWb2lkSW50cmluc2ljKCksCi0gICAgICAgICAgICBtX291dC5jb25zdElu
dDY0KHN0YWNrbWFwSUQpLCBtX291dC5jb25zdEludDMyKHNpemVPZlB1dEJ5SWQoKSksCi0gICAg
ICAgICAgICBjb25zdE51bGwobV9vdXQucmVmOCksIG1fb3V0LmNvbnN0SW50MzIoMiksIGJhc2Us
IHZhbHVlKTsKKyAgICAgICAgRXhpdEFyZ3VtZW50TGlzdCBhcmd1bWVudHM7IC8vIEZJWE1FOiBy
ZW5hbWUgdGhpcy4KKyAgICAgICAgYXJndW1lbnRzLmFwcGVuZChiYXNlKTsgCisgICAgICAgIGFy
Z3VtZW50cy5hcHBlbmQodmFsdWUpOworCisgICAgICAgIGFwcGVuZE9TUkV4aXRBcmd1bWVudHNG
b3JQYXRjaHBvaW50SWZXaWxsQ2F0Y2hFeGNlcHRpb24oYXJndW1lbnRzLCBMTFZNQW55UmVnQ2Fs
bENvbnYsIDIpOyAvLyAyIGFyZ3VtZW50cyBzaG93IHVwIGluIHRoZSBzdGFja21hcCBsb2NhdGlv
bnM6IHRoZSBiYXNlIGFuZCB0aGUgdmFsdWUuCisKKyAgICAgICAgYXJndW1lbnRzLmluc2VydCgw
LCBtX291dC5jb25zdEludDMyKDIpKTsgCisgICAgICAgIGFyZ3VtZW50cy5pbnNlcnQoMCwgY29u
c3ROdWxsKG1fb3V0LnJlZjgpKTsgCisgICAgICAgIGFyZ3VtZW50cy5pbnNlcnQoMCwgbV9vdXQu
Y29uc3RJbnQzMihzaXplT2ZQdXRCeUlkKCkpKTsKKyAgICAgICAgYXJndW1lbnRzLmluc2VydCgw
LCBtX291dC5jb25zdEludDY0KHN0YWNrbWFwSUQpKTsKKworICAgICAgICBMVmFsdWUgY2FsbCA9
IG1fb3V0LmNhbGwobV9vdXQucGF0Y2hwb2ludFZvaWRJbnRyaW5zaWMoKSwgYXJndW1lbnRzKTsK
ICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25DYWxsaW5nQ29udmVudGlvbihjYWxsLCBMTFZNQW55UmVn
Q2FsbENvbnYpOwogICAgICAgICAKICAgICAgICAgbV9mdGxTdGF0ZS5wdXRCeUlkcy5hcHBlbmQo
UHV0QnlJZERlc2NyaXB0b3IoCkBAIC00NTE5LDEyICs0NTc3LDkgQEAgcHJpdmF0ZToKICAgICAg
ICAgdW5zaWduZWQgZnJhbWVTaXplID0gSlNTdGFjazo6Q2FsbEZyYW1lSGVhZGVyU2l6ZSArIG51
bUFyZ3M7CiAgICAgICAgIHVuc2lnbmVkIGFsaWduZWRGcmFtZVNpemUgPSBXVEY6OnJvdW5kVXBU
b011bHRpcGxlT2Yoc3RhY2tBbGlnbm1lbnRSZWdpc3RlcnMoKSwgZnJhbWVTaXplKTsKICAgICAg
ICAgdW5zaWduZWQgcGFkZGluZyA9IGFsaWduZWRGcmFtZVNpemUgLSBmcmFtZVNpemU7Ci0KLSAg
ICAgICAgVmVjdG9yPExWYWx1ZT4gYXJndW1lbnRzOwotICAgICAgICBhcmd1bWVudHMuYXBwZW5k
KG1fb3V0LmNvbnN0SW50NjQoc3RhY2ttYXBJRCkpOwotICAgICAgICBhcmd1bWVudHMuYXBwZW5k
KG1fb3V0LmNvbnN0SW50MzIoc2l6ZU9mQ2FsbCgpKSk7Ci0gICAgICAgIGFyZ3VtZW50cy5hcHBl
bmQoY29uc3ROdWxsKG1fb3V0LnJlZjgpKTsKLSAgICAgICAgYXJndW1lbnRzLmFwcGVuZChtX291
dC5jb25zdEludDMyKDEgKyBhbGlnbmVkRnJhbWVTaXplIC0gSlNTdGFjazo6Q2FsbGVyRnJhbWVB
bmRQQ1NpemUpKTsKKyAgICAgICAgLy8gRG9jdW1lbnRhdGlvbiBhYm91dCBzdGFja21hcCBhbmQg
cGF0Y2hwb2ludCBpbnRyaW5zaWNzOgorICAgICAgICAvLyBodHRwOi8vbGx2bS5vcmcvZG9jcy9T
dGFja01hcHMuaHRtbAorICAgICAgICBFeGl0QXJndW1lbnRMaXN0IGFyZ3VtZW50czsKICAgICAg
ICAgYXJndW1lbnRzLmFwcGVuZChqc0NhbGxlZSk7IC8vIGNhbGxlZSAtPiAlcmF4CiAgICAgICAg
IGFyZ3VtZW50cy5hcHBlbmQoZ2V0VW5kZWYobV9vdXQuaW50NjQpKTsgLy8gY29kZSBibG9jawog
ICAgICAgICBhcmd1bWVudHMuYXBwZW5kKGpzQ2FsbGVlKTsgLy8gY2FsbGVlIC0+IHN0YWNrCkBA
IC00NTMzLDYgKzQ1ODgsMTMgQEAgcHJpdmF0ZToKICAgICAgICAgICAgIGFyZ3VtZW50cy5hcHBl
bmQobG93SlNWYWx1ZShtX2dyYXBoLnZhckFyZ0NoaWxkKG1fbm9kZSwgMSArIGkpKSk7CiAgICAg
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBwYWRkaW5nOyArK2kpCiAgICAgICAgICAgICBh
cmd1bWVudHMuYXBwZW5kKGdldFVuZGVmKG1fb3V0LmludDY0KSk7CisKKyAgICAgICAgYXBwZW5k
T1NSRXhpdEFyZ3VtZW50c0ZvclBhdGNocG9pbnRJZldpbGxDYXRjaEV4Y2VwdGlvbihhcmd1bWVu
dHMsIExMVk1XZWJLaXRKU0NhbGxDb252LCAwKTsgLy8gTm8gY2FsbCBhcmd1bWVudHMgc2hvdyB1
cCBpbiB0aGUgc3RhY2ttYXAgbG9jYXRpb25zLgorCisgICAgICAgIGFyZ3VtZW50cy5pbnNlcnQo
MCwgbV9vdXQuY29uc3RJbnQzMigxICsgYWxpZ25lZEZyYW1lU2l6ZSAtIEpTU3RhY2s6OkNhbGxl
ckZyYW1lQW5kUENTaXplKSk7CisgICAgICAgIGFyZ3VtZW50cy5pbnNlcnQoMCwgY29uc3ROdWxs
KG1fb3V0LnJlZjgpKTsKKyAgICAgICAgYXJndW1lbnRzLmluc2VydCgwLCBtX291dC5jb25zdElu
dDMyKHNpemVPZkNhbGwoKSkpOworICAgICAgICBhcmd1bWVudHMuaW5zZXJ0KDAsIG1fb3V0LmNv
bnN0SW50NjQoc3RhY2ttYXBJRCkpOwogICAgICAgICAKICAgICAgICAgTFZhbHVlIGNhbGwgPSBt
X291dC5jYWxsKG1fb3V0LnBhdGNocG9pbnRJbnQ2NEludHJpbnNpYygpLCBhcmd1bWVudHMpOwog
ICAgICAgICBzZXRJbnN0cnVjdGlvbkNhbGxpbmdDb252ZW50aW9uKGNhbGwsIExMVk1XZWJLaXRK
U0NhbGxDb252KTsKQEAgLTQ2MDMsMTYgKzQ2NjUsMTkgQEAgcHJpdmF0ZToKICAgICAgICAgCiAg
ICAgICAgIHVuc2lnbmVkIHN0YWNrbWFwSUQgPSBtX3N0YWNrbWFwSURzKys7CiAgICAgICAgIAot
ICAgICAgICBWZWN0b3I8TFZhbHVlPiBhcmd1bWVudHM7Ci0gICAgICAgIGFyZ3VtZW50cy5hcHBl
bmQobV9vdXQuY29uc3RJbnQ2NChzdGFja21hcElEKSk7Ci0gICAgICAgIGFyZ3VtZW50cy5hcHBl
bmQobV9vdXQuY29uc3RJbnQzMihzaXplT2ZJQ0ZvcihtX25vZGUpKSk7Ci0gICAgICAgIGFyZ3Vt
ZW50cy5hcHBlbmQoY29uc3ROdWxsKG1fb3V0LnJlZjgpKTsKLSAgICAgICAgYXJndW1lbnRzLmFw
cGVuZChtX291dC5jb25zdEludDMyKDIgKyAhIWpzQXJndW1lbnRzKSk7CisgICAgICAgIEV4aXRB
cmd1bWVudExpc3QgYXJndW1lbnRzOwogICAgICAgICBhcmd1bWVudHMuYXBwZW5kKGpzQ2FsbGVl
KTsKICAgICAgICAgaWYgKGpzQXJndW1lbnRzKQogICAgICAgICAgICAgYXJndW1lbnRzLmFwcGVu
ZChqc0FyZ3VtZW50cyk7CiAgICAgICAgIEFTU0VSVCh0aGlzQXJnKTsKICAgICAgICAgYXJndW1l
bnRzLmFwcGVuZCh0aGlzQXJnKTsKKworICAgICAgICBhcHBlbmRPU1JFeGl0QXJndW1lbnRzRm9y
UGF0Y2hwb2ludElmV2lsbENhdGNoRXhjZXB0aW9uKGFyZ3VtZW50cywgTExWTUNDYWxsQ29udiwg
MCk7IC8vIE5vIGNhbGwgYXJndW1lbnRzIHNob3cgdXAgaW4gc3RhY2ttYXAgbG9jYXRpb25zLgor
CisgICAgICAgIGFyZ3VtZW50cy5pbnNlcnQoMCwgbV9vdXQuY29uc3RJbnQzMigyICsgISFqc0Fy
Z3VtZW50cykpOworICAgICAgICBhcmd1bWVudHMuaW5zZXJ0KDAsIGNvbnN0TnVsbChtX291dC5y
ZWY4KSk7CisgICAgICAgIGFyZ3VtZW50cy5pbnNlcnQoMCwgbV9vdXQuY29uc3RJbnQzMihzaXpl
T2ZJQ0ZvcihtX25vZGUpKSk7CisgICAgICAgIGFyZ3VtZW50cy5pbnNlcnQoMCwgbV9vdXQuY29u
c3RJbnQ2NChzdGFja21hcElEKSk7CiAgICAgICAgIAogICAgICAgICBMVmFsdWUgY2FsbCA9IG1f
b3V0LmNhbGwobV9vdXQucGF0Y2hwb2ludEludDY0SW50cmluc2ljKCksIGFyZ3VtZW50cyk7CiAg
ICAgICAgIHNldEluc3RydWN0aW9uQ2FsbGluZ0NvbnZlbnRpb24oY2FsbCwgTExWTUNDYWxsQ29u
dik7CkBAIC02MTczLDEwICs2MjM4LDE3IEBAIHByaXZhdGU6CiAgICAgICAgIGlmIChPcHRpb25z
Ojp2ZXJib3NlQ29tcGlsYXRpb24oKSkKICAgICAgICAgICAgIGRhdGFMb2coIiAgICBFbWl0dGlu
ZyBHZXRCeUlkIHBhdGNocG9pbnQgd2l0aCBzdGFja21hcCAjIiwgc3RhY2ttYXBJRCwgIlxuIik7
CiAgICAgICAgIAotICAgICAgICBMVmFsdWUgY2FsbCA9IG1fb3V0LmNhbGwoCi0gICAgICAgICAg
ICBtX291dC5wYXRjaHBvaW50SW50NjRJbnRyaW5zaWMoKSwKLSAgICAgICAgICAgIG1fb3V0LmNv
bnN0SW50NjQoc3RhY2ttYXBJRCksIG1fb3V0LmNvbnN0SW50MzIoc2l6ZU9mR2V0QnlJZCgpKSwK
LSAgICAgICAgICAgIGNvbnN0TnVsbChtX291dC5yZWY4KSwgbV9vdXQuY29uc3RJbnQzMigxKSwg
YmFzZSk7CisgICAgICAgIEV4aXRBcmd1bWVudExpc3QgYXJndW1lbnRzOworICAgICAgICBhcmd1
bWVudHMuYXBwZW5kKGJhc2UpOworCisgICAgICAgIGFwcGVuZE9TUkV4aXRBcmd1bWVudHNGb3JQ
YXRjaHBvaW50SWZXaWxsQ2F0Y2hFeGNlcHRpb24oYXJndW1lbnRzLCBMTFZNQW55UmVnQ2FsbENv
bnYsIDIsIGZhbHNlLCB0cnVlKTsgLy8gMiBhcmd1bWVudHMgc2hvdyB1cCBpbiB0aGUgc3RhY2tt
YXAgbG9jYXRpb25zOiB0aGUgcmVzdWx0IGFuZCB0aGUgYmFzZS4KKworICAgICAgICBhcmd1bWVu
dHMuaW5zZXJ0KDAsIG1fb3V0LmNvbnN0SW50MzIoMSkpOyAKKyAgICAgICAgYXJndW1lbnRzLmlu
c2VydCgwLCBjb25zdE51bGwobV9vdXQucmVmOCkpOworICAgICAgICBhcmd1bWVudHMuaW5zZXJ0
KDAsIG1fb3V0LmNvbnN0SW50MzIoc2l6ZU9mR2V0QnlJZCgpKSk7CisgICAgICAgIGFyZ3VtZW50
cy5pbnNlcnQoMCwgbV9vdXQuY29uc3RJbnQ2NChzdGFja21hcElEKSk7IAorCisgICAgICAgIExW
YWx1ZSBjYWxsID0gbV9vdXQuY2FsbChtX291dC5wYXRjaHBvaW50SW50NjRJbnRyaW5zaWMoKSwg
YXJndW1lbnRzKTsKICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25DYWxsaW5nQ29udmVudGlvbihjYWxs
LCBMTFZNQW55UmVnQ2FsbENvbnYpOwogICAgICAgICAKICAgICAgICAgbV9mdGxTdGF0ZS5nZXRC
eUlkcy5hcHBlbmQoR2V0QnlJZERlc2NyaXB0b3Ioc3RhY2ttYXBJRCwgbV9ub2RlLT5vcmlnaW4u
c2VtYW50aWMsIHVpZCkpOwpAQCAtNzUxNywxMiArNzU4OSwxNSBAQCBwcml2YXRlOgogICAgIHsK
ICAgICAgICAgdW5zaWduZWQgc3RhY2ttYXBJRCA9IG1fc3RhY2ttYXBJRHMrKzsKIAotICAgICAg
ICBWZWN0b3I8TFZhbHVlPiBhcmd1bWVudHM7CisgICAgICAgIEV4aXRBcmd1bWVudExpc3QgYXJn
dW1lbnRzOwogICAgICAgICBhcmd1bWVudHMuYXBwZW5kKG1fb3V0LmNvbnN0SW50NjQoc3RhY2tt
YXBJRCkpOwogICAgICAgICBhcmd1bWVudHMuYXBwZW5kKG1fb3V0LmNvbnN0SW50MzIoTWFjcm9B
c3NlbWJsZXI6Om1heEp1bXBSZXBsYWNlbWVudFNpemUoKSkpOwogICAgICAgICBhcmd1bWVudHMu
YXBwZW5kKGNvbnN0TnVsbChtX291dC5yZWY4KSk7CiAgICAgICAgIGFyZ3VtZW50cy5hcHBlbmQo
bV9vdXQuY29uc3RJbnQzMih1c2VyQXJndW1lbnRzLnNpemUoKSkpOwogICAgICAgICBhcmd1bWVu
dHMuYXBwZW5kVmVjdG9yKHVzZXJBcmd1bWVudHMpOworCisgICAgICAgIGFwcGVuZE9TUkV4aXRB
cmd1bWVudHNGb3JQYXRjaHBvaW50SWZXaWxsQ2F0Y2hFeGNlcHRpb24oYXJndW1lbnRzLCBMTFZN
QW55UmVnQ2FsbENvbnYsIHVzZXJBcmd1bWVudHMuc2l6ZSgpICsgMSwgdHJ1ZSk7IC8vIEFsbCB0
aGUgYXJndW1lbnRzIHBsdXMgdGhlIHJlc3VsdCBzaG93IHVwIGluIHRoZSBzdGFja21hcCBsb2Nh
dGlvbnMuCisKICAgICAgICAgTFZhbHVlIGNhbGwgPSBtX291dC5jYWxsKG1fb3V0LnBhdGNocG9p
bnRJbnQ2NEludHJpbnNpYygpLCBhcmd1bWVudHMpOwogICAgICAgICBzZXRJbnN0cnVjdGlvbkNh
bGxpbmdDb252ZW50aW9uKGNhbGwsIExMVk1BbnlSZWdDYWxsQ29udik7CiAgICAgICAgIApAQCAt
NzUzNyw3ICs3NjEyLDcgQEAgcHJpdmF0ZToKICAgICB2b2lkIHNwZWN1bGF0ZSgKICAgICAgICAg
RXhpdEtpbmQga2luZCwgRm9ybWF0dGVkVmFsdWUgbG93VmFsdWUsIE5vZGUqIGhpZ2hWYWx1ZSwg
TFZhbHVlIGZhaWxDb25kaXRpb24pCiAgICAgewotICAgICAgICBhcHBlbmRPU1JFeGl0KGtpbmQs
IGxvd1ZhbHVlLCBoaWdoVmFsdWUsIGZhaWxDb25kaXRpb24pOworICAgICAgICBhcHBlbmRPU1JF
eGl0KGtpbmQsIGxvd1ZhbHVlLCBoaWdoVmFsdWUsIGZhaWxDb25kaXRpb24sIG1fb3JpZ2luKTsK
ICAgICB9CiAgICAgCiAgICAgdm9pZCB0ZXJtaW5hdGUoRXhpdEtpbmQga2luZCkKQEAgLTc1NjUs
NyArNzY0MCw3IEBAIHByaXZhdGU6CiAgICAgICAgIGlmICghbV9pbnRlcnByZXRlci5uZWVkc1R5
cGVDaGVjayhoaWdoVmFsdWUsIHR5cGVzUGFzc2VkVGhyb3VnaCkpCiAgICAgICAgICAgICByZXR1
cm47CiAgICAgICAgIEFTU0VSVChtYXlIYXZlVHlwZUNoZWNrKGhpZ2hWYWx1ZS51c2VLaW5kKCkp
KTsKLSAgICAgICAgYXBwZW5kT1NSRXhpdChCYWRUeXBlLCBsb3dWYWx1ZSwgaGlnaFZhbHVlLm5v
ZGUoKSwgZmFpbENvbmRpdGlvbik7CisgICAgICAgIGFwcGVuZE9TUkV4aXQoQmFkVHlwZSwgbG93
VmFsdWUsIGhpZ2hWYWx1ZS5ub2RlKCksIGZhaWxDb25kaXRpb24sIG1fb3JpZ2luKTsKICAgICAg
ICAgbV9pbnRlcnByZXRlci5maWx0ZXIoaGlnaFZhbHVlLCB0eXBlc1Bhc3NlZFRocm91Z2gpOwog
ICAgIH0KICAgICAKQEAgLTg3MjIsOSArODc5Nyw5IEBAIHByaXZhdGU6CiAKICAgICB2b2lkIGNh
bGxQcmVmbGlnaHQoQ29kZU9yaWdpbiBjb2RlT3JpZ2luKQogICAgIHsKKyAgICAgICAgQ2FsbFNp
dGVJbmRleCBjYWxsU2l0ZUluZGV4ID0gbV9mdGxTdGF0ZS5qaXRDb2RlLT5jb21tb24uYWRkQ29k
ZU9yaWdpbihjb2RlT3JpZ2luKTsKICAgICAgICAgbV9vdXQuc3RvcmUzMigKLSAgICAgICAgICAg
IG1fb3V0LmNvbnN0SW50MzIoCi0gICAgICAgICAgICAgICAgbV9mdGxTdGF0ZS5qaXRDb2RlLT5j
b21tb24uYWRkQ29kZU9yaWdpbihjb2RlT3JpZ2luKS5iaXRzKCkpLAorICAgICAgICAgICAgbV9v
dXQuY29uc3RJbnQzMihjYWxsU2l0ZUluZGV4LmJpdHMoKSksCiAgICAgICAgICAgICB0YWdGb3Io
SlNTdGFjazo6QXJndW1lbnRDb3VudCkpOwogICAgIH0KIApAQCAtODc1NSwyMyArODgzMCw4MSBA
QCBwcml2YXRlOgogICAgICAgICBpZiAoT3B0aW9uczo6dXNlRXhjZXB0aW9uRnV6eigpKQogICAg
ICAgICAgICAgbV9vdXQuY2FsbChtX291dC5vcGVyYXRpb24ob3BlcmF0aW9uRXhjZXB0aW9uRnV6
eiksIG1fY2FsbEZyYW1lKTsKICAgICAgICAgCi0gICAgICAgIExCYXNpY0Jsb2NrIGNvbnRpbnVh
dGlvbiA9IEZUTF9ORVdfQkxPQ0sobV9vdXQsICgiRXhjZXB0aW9uIGNoZWNrIGNvbnRpbnVhdGlv
biIpKTsKLSAgICAgICAgCiAgICAgICAgIExWYWx1ZSBleGNlcHRpb24gPSBtX291dC5sb2FkNjQo
bV9vdXQuYWJzb2x1dGUodm0oKS5hZGRyZXNzT2ZFeGNlcHRpb24oKSkpOwotICAgICAgICAKKyAg
ICAgICAgTFZhbHVlIGhhZEV4Y2VwdGlvbiA9IG1fb3V0Lm5vdFplcm82NChleGNlcHRpb24pOwor
CisgICAgICAgIGJvb2wgZW1pdHRlZEV4Y2VwdGlvbkhhbmRsaW5nQ29kZUZvck9TUkV4aXQgPSBl
bWl0QnJhbmNoVG9PU1JFeGl0SWZXaWxsQ2F0Y2hFeGNlcHRpb24oaGFkRXhjZXB0aW9uKTsKKyAg
ICAgICAgaWYgKGVtaXR0ZWRFeGNlcHRpb25IYW5kbGluZ0NvZGVGb3JPU1JFeGl0KSAvLyBJdCBh
bHJlYWR5IHRvb2sgY2FyZSBvZiBleGNlcHRpb24gaGFuZGxpbmcgbG9naWMuCisgICAgICAgICAg
ICByZXR1cm47CisKKyAgICAgICAgTEJhc2ljQmxvY2sgY29udGludWF0aW9uID0gRlRMX05FV19C
TE9DSyhtX291dCwgKCJFeGNlcHRpb24gY2hlY2sgY29udGludWF0aW9uIikpOworCiAgICAgICAg
IG1fb3V0LmJyYW5jaCgKLSAgICAgICAgICAgIG1fb3V0Lm5vdFplcm82NChleGNlcHRpb24pLCBy
YXJlbHkobV9oYW5kbGVFeGNlcHRpb25zKSwgdXN1YWxseShjb250aW51YXRpb24pKTsKLSAgICAg
ICAgCisgICAgICAgICAgICBoYWRFeGNlcHRpb24sIHJhcmVseShtX2hhbmRsZUV4Y2VwdGlvbnMp
LCB1c3VhbGx5KGNvbnRpbnVhdGlvbikpOworCiAgICAgICAgIG1fb3V0LmFwcGVuZFRvKGNvbnRp
bnVhdGlvbik7CiAgICAgfQorCisgICAgdm9pZCBhcHBlbmRPU1JFeGl0QXJndW1lbnRzRm9yUGF0
Y2hwb2ludElmV2lsbENhdGNoRXhjZXB0aW9uKEV4aXRBcmd1bWVudExpc3QmIGFyZ3VtZW50cywg
TENhbGxDb252IGNhbGxpbmdDb252ZW50aW9uLCB1bnNpZ25lZCBvZmZzZXRPZkV4aXRBcmd1bWVu
dHMsIGJvb2wgaXNMYXp5U2xvd1BhdGggPSBmYWxzZSwgYm9vbCBpc0dldEJ5ZElkID0gZmFsc2Up
CisgICAgeworICAgICAgICBDb2RlT3JpZ2luIG9wQ2F0Y2hPcmlnaW47CisgICAgICAgIEhhbmRs
ZXJJbmZvKiBleGNlcHRpb25IYW5kbGVyOworICAgICAgICBib29sIHdpbGxDYXRjaEV4Y2VwdGlv
biA9IG1fZ3JhcGgud2lsbENhdGNoRXhjZXB0aW9uSW5NYWNoaW5lRnJhbWUobV9vcmlnaW4uZm9y
RXhpdCwgb3BDYXRjaE9yaWdpbiwgZXhjZXB0aW9uSGFuZGxlcik7CisgICAgICAgIGlmICghd2ls
bENhdGNoRXhjZXB0aW9uKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGFwcGVuZE9T
UkV4aXREZXNjcmlwdG9yKFVuY291bnRhYmxlLCBub1ZhbHVlKCksIG51bGxwdHIsIG1fb3JpZ2lu
LndpdGhGb3JFeGl0QW5kRXhpdE9LKG9wQ2F0Y2hPcmlnaW4sIHRydWUpKTsKKyAgICAgICAgT1NS
RXhpdERlc2NyaXB0b3ImIGV4aXREZXNjcmlwdG9yID0gbV9mdGxTdGF0ZS5qaXRDb2RlLT5vc3JF
eGl0RGVzY3JpcHRvcnMubGFzdCgpOworICAgICAgICBleGl0RGVzY3JpcHRvci5tX3NlbWFudGlj
Q29kZU9yaWdpbkZvckNhbGxGcmFtZUhlYWRlciA9IGNvZGVPcmlnaW5EZXNjcmlwdGlvbk9mQ2Fs
bFNpdGUoKTsKKyAgICAgICAgZXhpdERlc2NyaXB0b3IubV9pc0V4Y2VwdGlvbkhhbmRsZXIgPSB0
cnVlOworICAgICAgICBleGl0RGVzY3JpcHRvci5tX3dpbGxBcnJpdmVBdE9TUkV4aXRGcm9tR2Vu
ZXJpY1Vud2luZCA9ICFpc0xhenlTbG93UGF0aDsKKyAgICAgICAgZXhpdERlc2NyaXB0b3IubV9p
c0V4Y2VwdGlvbkZyb21MYXp5U2xvd1BhdGggPSBpc0xhenlTbG93UGF0aDsKKyAgICAgICAgZXhp
dERlc2NyaXB0b3IubV9pc0V4Y2VwdGlvbkZyb21KU0NhbGwgPSBjYWxsaW5nQ29udmVudGlvbiA9
PSBMTFZNV2ViS2l0SlNDYWxsQ29udiB8fCBjYWxsaW5nQ29udmVudGlvbiA9PSBMTFZNQ0NhbGxD
b252OworICAgICAgICBleGl0RGVzY3JpcHRvci5tX2lzRXhjZXB0aW9uRnJvbUdldEJ5SWQgPSBp
c0dldEJ5ZElkOworICAgICAgICBleGl0RGVzY3JpcHRvci5tX2Jhc2VsaW5lRXhjZXB0aW9uSGFu
ZGxlciA9ICpleGNlcHRpb25IYW5kbGVyOworICAgICAgICBleGl0RGVzY3JpcHRvci5tX3N0YWNr
bWFwSUQgPSBtX3N0YWNrbWFwSURzIC0gMTsKKworICAgICAgICBFeGl0QXJndW1lbnRMaXN0IGZy
ZXNoTGlzdDsKKyAgICAgICAgYnVpbGRFeGl0QXJndW1lbnRzKGV4aXREZXNjcmlwdG9yLCBmcmVz
aExpc3QsIG5vVmFsdWUoKSwgZXhpdERlc2NyaXB0b3IubV9jb2RlT3JpZ2luKTsKKyAgICAgICAg
YXJndW1lbnRzLmFwcGVuZFZlY3RvcihmcmVzaExpc3QpOworCisgICAgICAgIGlmIChvZmZzZXRP
ZkV4aXRBcmd1bWVudHMpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXhp
dERlc2NyaXB0b3IubV92YWx1ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAo
ZXhpdERlc2NyaXB0b3IubV92YWx1ZXNbaV0uaGFzSW5kZXhJblN0YWNrbWFwTG9jYXRpb25zKCkp
CisgICAgICAgICAgICAgICAgICAgIGV4aXREZXNjcmlwdG9yLm1fdmFsdWVzW2ldLmFkanVzdFN0
YWNrbWFwTG9jYXRpb25zSW5kZXhCeU9mZnNldChvZmZzZXRPZkV4aXRBcmd1bWVudHMpOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBlbWl0QnJhbmNoVG9PU1JF
eGl0SWZXaWxsQ2F0Y2hFeGNlcHRpb24oTFZhbHVlIGhhZEV4Y2VwdGlvbikKKyAgICB7CisgICAg
ICAgIENvZGVPcmlnaW4gb3BDYXRjaE9yaWdpbjsKKyAgICAgICAgSGFuZGxlckluZm8qIGV4Y2Vw
dGlvbkhhbmRsZXI7CisgICAgICAgIGJvb2wgd2lsbENhdGNoRXhjZXB0aW9uID0gbV9ncmFwaC53
aWxsQ2F0Y2hFeGNlcHRpb25Jbk1hY2hpbmVGcmFtZShtX29yaWdpbi5mb3JFeGl0LCBvcENhdGNo
T3JpZ2luLCBleGNlcHRpb25IYW5kbGVyKTsgCisgICAgICAgIGlmICghd2lsbENhdGNoRXhjZXB0
aW9uKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGFwcGVuZE9TUkV4aXQo
VW5jb3VudGFibGUsIG5vVmFsdWUoKSwgbnVsbHB0ciwgaGFkRXhjZXB0aW9uLCBtX29yaWdpbi53
aXRoRm9yRXhpdEFuZEV4aXRPSyhvcENhdGNoT3JpZ2luLCB0cnVlKSwgdHJ1ZSk7CisgICAgICAg
IHJldHVybiB0cnVlOworICAgIH0KICAgICAKICAgICBMQmFzaWNCbG9jayBsb3dCbG9jayhCYXNp
Y0Jsb2NrKiBibG9jaykKICAgICB7CiAgICAgICAgIHJldHVybiBtX2Jsb2Nrcy5nZXQoYmxvY2sp
OwogICAgIH0KKworICAgIHZvaWQgYXBwZW5kT1NSRXhpdERlc2NyaXB0b3IoRXhpdEtpbmQga2lu
ZCwgRm9ybWF0dGVkVmFsdWUgbG93VmFsdWUsIE5vZGUqIGhpZ2hWYWx1ZSwgTm9kZU9yaWdpbiBv
cmlnaW4pCisgICAgeworICAgICAgICBtX2Z0bFN0YXRlLmppdENvZGUtPm9zckV4aXREZXNjcmlw
dG9ycy5hcHBlbmQoT1NSRXhpdERlc2NyaXB0b3IoCisgICAgICAgICAgICBraW5kLCBsb3dWYWx1
ZS5mb3JtYXQoKSwgbV9ncmFwaC5tZXRob2RPZkdldHRpbmdBVmFsdWVQcm9maWxlRm9yKGhpZ2hW
YWx1ZSksCisgICAgICAgICAgICBvcmlnaW4uZm9yRXhpdCwgb3JpZ2luLnNlbWFudGljLAorICAg
ICAgICAgICAgYXZhaWxhYmlsaXR5TWFwKCkubV9sb2NhbHMubnVtYmVyT2ZBcmd1bWVudHMoKSwK
KyAgICAgICAgICAgIGF2YWlsYWJpbGl0eU1hcCgpLm1fbG9jYWxzLm51bWJlck9mTG9jYWxzKCkp
KTsKKyAgICB9CiAgICAgCiAgICAgdm9pZCBhcHBlbmRPU1JFeGl0KAotICAgICAgICBFeGl0S2lu
ZCBraW5kLCBGb3JtYXR0ZWRWYWx1ZSBsb3dWYWx1ZSwgTm9kZSogaGlnaFZhbHVlLCBMVmFsdWUg
ZmFpbENvbmRpdGlvbikKKyAgICAgICAgRXhpdEtpbmQga2luZCwgRm9ybWF0dGVkVmFsdWUgbG93
VmFsdWUsIE5vZGUqIGhpZ2hWYWx1ZSwgTFZhbHVlIGZhaWxDb25kaXRpb24sIAorICAgICAgICBO
b2RlT3JpZ2luIG9yaWdpbiwgYm9vbCBpc0V4Y2VwdGlvbkhhbmRsZXIgPSBmYWxzZSkKICAgICB7
CiAgICAgICAgIGlmICh2ZXJib3NlQ29tcGlsYXRpb25FbmFibGVkKCkpIHsKICAgICAgICAgICAg
IGRhdGFMb2coIiAgICBPU1IgZXhpdCAjIiwgbV9mdGxTdGF0ZS5qaXRDb2RlLT5vc3JFeGl0RGVz
Y3JpcHRvcnMuc2l6ZSgpLCAiIHdpdGggYXZhaWxhYmlsaXR5OiAiLCBhdmFpbGFiaWxpdHlNYXAo
KSwgIlxuIik7CkBAIC04Nzc5LDkgKzg5MTIsOSBAQCBwcml2YXRlOgogICAgICAgICAgICAgICAg
IGRhdGFMb2coIiAgICAgICAgQXZhaWxhYmxlIHJlY292ZXJpZXM6ICIsIGxpc3REdW1wKG1fYXZh
aWxhYmxlUmVjb3ZlcmllcyksICJcbiIpOwogICAgICAgICB9CiAKLSAgICAgICAgREZHX0FTU0VS
VChtX2dyYXBoLCBtX25vZGUsIG1fb3JpZ2luLmV4aXRPSyk7CisgICAgICAgIERGR19BU1NFUlQo
bV9ncmFwaCwgbV9ub2RlLCBvcmlnaW4uZXhpdE9LKTsKICAgICAgICAgCi0gICAgICAgIGlmIChk
b09TUkV4aXRGdXp6aW5nKCkpIHsKKyAgICAgICAgaWYgKGRvT1NSRXhpdEZ1enppbmcoKSAmJiAh
aXNFeGNlcHRpb25IYW5kbGVyKSB7CiAgICAgICAgICAgICBMVmFsdWUgbnVtYmVyT2ZGdXp6Q2hl
Y2tzID0gbV9vdXQuYWRkKAogICAgICAgICAgICAgICAgIG1fb3V0LmxvYWQzMihtX291dC5hYnNv
bHV0ZSgmZ19udW1iZXJPZk9TUkV4aXRGdXp6Q2hlY2tzKSksCiAgICAgICAgICAgICAgICAgbV9v
dXQuaW50MzJPbmUpOwpAQCAtODgwMywxMyArODkzNiw5IEBAIHByaXZhdGU6CiAgICAgICAgIGlm
IChmYWlsQ29uZGl0aW9uID09IG1fb3V0LmJvb2xlYW5GYWxzZSkKICAgICAgICAgICAgIHJldHVy
bjsKIAotICAgICAgICBtX2Z0bFN0YXRlLmppdENvZGUtPm9zckV4aXREZXNjcmlwdG9ycy5hcHBl
bmQoT1NSRXhpdERlc2NyaXB0b3IoCi0gICAgICAgICAgICBraW5kLCBsb3dWYWx1ZS5mb3JtYXQo
KSwgbV9ncmFwaC5tZXRob2RPZkdldHRpbmdBVmFsdWVQcm9maWxlRm9yKGhpZ2hWYWx1ZSksCi0g
ICAgICAgICAgICBtX29yaWdpbi5mb3JFeGl0LCBtX29yaWdpbi5zZW1hbnRpYywKLSAgICAgICAg
ICAgIGF2YWlsYWJpbGl0eU1hcCgpLm1fbG9jYWxzLm51bWJlck9mQXJndW1lbnRzKCksCi0gICAg
ICAgICAgICBhdmFpbGFiaWxpdHlNYXAoKS5tX2xvY2Fscy5udW1iZXJPZkxvY2FscygpKSk7Ci0K
KyAgICAgICAgYXBwZW5kT1NSRXhpdERlc2NyaXB0b3Ioa2luZCwgbG93VmFsdWUsIGhpZ2hWYWx1
ZSwgb3JpZ2luKTsKICAgICAgICAgT1NSRXhpdERlc2NyaXB0b3ImIGV4aXREZXNjcmlwdG9yID0g
bV9mdGxTdGF0ZS5qaXRDb2RlLT5vc3JFeGl0RGVzY3JpcHRvcnMubGFzdCgpOworICAgICAgICBl
eGl0RGVzY3JpcHRvci5tX2lzRXhjZXB0aW9uSGFuZGxlciA9IGlzRXhjZXB0aW9uSGFuZGxlcjsK
IAogICAgICAgICBpZiAoZmFpbENvbmRpdGlvbiA9PSBtX291dC5ib29sZWFuVHJ1ZSkgewogICAg
ICAgICAgICAgZW1pdE9TUkV4aXRDYWxsKGV4aXREZXNjcmlwdG9yLCBsb3dWYWx1ZSk7CkBAIC04
OTc3LDcgKzkxMDYsNiBAQCBwcml2YXRlOgogICAgICAgICAgICAgQXZhaWxhYmxlUmVjb3Zlcnkg
cmVjb3ZlcnkgPSBtX2F2YWlsYWJsZVJlY292ZXJpZXNbaV07CiAgICAgICAgICAgICBpZiAocmVj
b3Zlcnkubm9kZSgpICE9IG5vZGUpCiAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAg
ICAgICAKICAgICAgICAgICAgIEV4aXRWYWx1ZSByZXN1bHQgPSBFeGl0VmFsdWU6OnJlY292ZXJ5
KAogICAgICAgICAgICAgICAgIHJlY292ZXJ5Lm9wY29kZSgpLCBhcmd1bWVudHMuc2l6ZSgpLCBh
cmd1bWVudHMuc2l6ZSgpICsgMSwKICAgICAgICAgICAgICAgICByZWNvdmVyeS5mb3JtYXQoKSk7
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTE9TUkV4aXQuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMT1NSRXhpdC5jcHAJKHJldmlzaW9u
IDE5MTkzMSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMT1NSRXhpdC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlICJGVExFeGl0QXJndW1lbnQu
aCIKICNpbmNsdWRlICJGVExFeGl0QXJndW1lbnRMaXN0LmgiCiAjaW5jbHVkZSAiRlRMSklUQ29k
ZS5oIgorI2luY2x1ZGUgIkZUTExvY2F0aW9uLmgiCiAjaW5jbHVkZSAiSlNDSW5saW5lcy5oIgog
CiBuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEZUTCB7CkBAIC01Miw2ICs1MywxMSBAQCBPU1JF
eGl0RGVzY3JpcHRvcjo6T1NSRXhpdERlc2NyaXB0b3IoCiAgICAgLCBtX3ZhbHVlUHJvZmlsZSh2
YWx1ZVByb2ZpbGUpCiAgICAgLCBtX3ZhbHVlcyhudW1iZXJPZkFyZ3VtZW50cywgbnVtYmVyT2ZM
b2NhbHMpCiAgICAgLCBtX2lzSW52YWxpZGF0aW9uUG9pbnQoZmFsc2UpCisgICAgLCBtX2lzRXhj
ZXB0aW9uSGFuZGxlcihmYWxzZSkKKyAgICAsIG1fd2lsbEFycml2ZUF0T1NSRXhpdEZyb21HZW5l
cmljVW53aW5kKGZhbHNlKQorICAgICwgbV9pc0V4Y2VwdGlvbkZyb21KU0NhbGwoZmFsc2UpCisg
ICAgLCBtX2lzRXhjZXB0aW9uRnJvbUdldEJ5SWQoZmFsc2UpCisgICAgLCBtX2lzRXhjZXB0aW9u
RnJvbUxhenlTbG93UGF0aChmYWxzZSkKIHsKIH0KIApAQCAtNzAsNiArNzYsNyBAQCBPU1JFeGl0
OjpPU1JFeGl0KE9TUkV4aXREZXNjcmlwdG9yJiBkZXNjCiAgICAgLCBtX2Rlc2NyaXB0b3IoZGVz
Y3JpcHRvcikKICAgICAsIG1fc3RhY2ttYXBSZWNvcmRJbmRleChzdGFja21hcFJlY29yZEluZGV4
KQogeworICAgIG1faXNFeGNlcHRpb25IYW5kbGVyID0gZGVzY3JpcHRvci5tX2lzRXhjZXB0aW9u
SGFuZGxlcjsKIH0KIAogQ29kZUxvY2F0aW9uSnVtcCBPU1JFeGl0Ojpjb2RlTG9jYXRpb25Gb3JS
ZXBhdGNoKENvZGVCbG9jayogZnRsQ29kZUJsb2NrKSBjb25zdApAQCAtODAsNiArODcsNzYgQEAg
Q29kZUxvY2F0aW9uSnVtcCBPU1JFeGl0Ojpjb2RlTG9jYXRpb25GbwogICAgICAgICBtX3BhdGNo
YWJsZUNvZGVPZmZzZXQpOwogfQogCit2b2lkIE9TUkV4aXQ6OmdhdGhlclJlZ2lzdGVyc1RvU3Bp
bGxGb3JDYWxsSWZFeGNlcHRpb24oU3RhY2tNYXBzJiBzdGFja21hcHMsIFN0YWNrTWFwczo6UmVj
b3JkJiByZWNvcmQpCit7CisgICAgUkVMRUFTRV9BU1NFUlQobV9kZXNjcmlwdG9yLm1faXNFeGNl
cHRpb25Gcm9tSlNDYWxsKTsKKworICAgIFJlZ2lzdGVyU2V0IHZvbGF0aWxlUmVnaXN0ZXJzID0g
UmVnaXN0ZXJTZXQ6OnZvbGF0aWxlUmVnaXN0ZXJzRm9ySlNDYWxsKCk7CisKKyAgICBhdXRvIGFk
ZE5lZWRlZFJlZ2lzdGVycyA9IFsmXSAoY29uc3QgRXhpdFZhbHVlJiBleGl0VmFsdWUpIHsKKyAg
ICAgICAgYXV0byBoYW5kbGVMb2NhdGlvbiA9IFsmXSAoY29uc3QgRlRMOjpMb2NhdGlvbiYgbG9j
YXRpb24pIHsKKyAgICAgICAgICAgIGlmIChsb2NhdGlvbi5pbnZvbHZlc0dQUigpICYmIHZvbGF0
aWxlUmVnaXN0ZXJzLmdldChsb2NhdGlvbi5ncHIoKSkpCisgICAgICAgICAgICAgICAgdGhpcy0+
cmVnaXN0ZXJzVG9QcmVzZXJ2ZUZvckNhbGxUaGF0TWlnaHRUaHJvdy5zZXQobG9jYXRpb24uZ3By
KCkpOworICAgICAgICAgICAgZWxzZSBpZiAobG9jYXRpb24uaXNGUFIoKSAmJiB2b2xhdGlsZVJl
Z2lzdGVycy5nZXQobG9jYXRpb24uZnByKCkpKQorICAgICAgICAgICAgICAgIHRoaXMtPnJlZ2lz
dGVyc1RvUHJlc2VydmVGb3JDYWxsVGhhdE1pZ2h0VGhyb3cuc2V0KGxvY2F0aW9uLmZwcigpKTsK
KyAgICAgICAgfTsKKworICAgICAgICBzd2l0Y2ggKGV4aXRWYWx1ZS5raW5kKCkpIHsKKyAgICAg
ICAgY2FzZSBFeGl0VmFsdWVBcmd1bWVudDoKKyAgICAgICAgICAgIGhhbmRsZUxvY2F0aW9uKEZU
TDo6TG9jYXRpb246OmZvclN0YWNrbWFwcygmc3RhY2ttYXBzLCByZWNvcmQubG9jYXRpb25zW2V4
aXRWYWx1ZS5leGl0QXJndW1lbnQoKS5hcmd1bWVudCgpXSkpOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIGNhc2UgRXhpdFZhbHVlUmVjb3Zlcnk6CisgICAgICAgICAgICBoYW5kbGVMb2Nh
dGlvbihGVEw6OkxvY2F0aW9uOjpmb3JTdGFja21hcHMoJnN0YWNrbWFwcywgcmVjb3JkLmxvY2F0
aW9uc1tleGl0VmFsdWUucmlnaHRSZWNvdmVyeUFyZ3VtZW50KCldKSk7CisgICAgICAgICAgICBo
YW5kbGVMb2NhdGlvbihGVEw6OkxvY2F0aW9uOjpmb3JTdGFja21hcHMoJnN0YWNrbWFwcywgcmVj
b3JkLmxvY2F0aW9uc1tleGl0VmFsdWUubGVmdFJlY292ZXJ5QXJndW1lbnQoKV0pKTsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIH0KKyAgICB9OworICAgIGZvciAoRXhpdFRpbWVPYmplY3RNYXRlcmlhbGl6YXRpb24qIG1h
dGVyaWFsaXphdGlvbiA6IG1fZGVzY3JpcHRvci5tX21hdGVyaWFsaXphdGlvbnMpIHsKKyAgICAg
ICAgZm9yICh1bnNpZ25lZCBwcm9wZXJ0eUluZGV4ID0gbWF0ZXJpYWxpemF0aW9uLT5wcm9wZXJ0
aWVzKCkuc2l6ZSgpOyBwcm9wZXJ0eUluZGV4LS07KQorICAgICAgICAgICAgYWRkTmVlZGVkUmVn
aXN0ZXJzKG1hdGVyaWFsaXphdGlvbi0+cHJvcGVydGllcygpW3Byb3BlcnR5SW5kZXhdLnZhbHVl
KCkpOworICAgIH0KKyAgICBmb3IgKHVuc2lnbmVkIGluZGV4ID0gbV9kZXNjcmlwdG9yLm1fdmFs
dWVzLnNpemUoKTsgaW5kZXgtLTspCisgICAgICAgIGFkZE5lZWRlZFJlZ2lzdGVycyhtX2Rlc2Ny
aXB0b3IubV92YWx1ZXNbaW5kZXhdKTsKK30KKwordm9pZCBPU1JFeGl0OjpzcGlsbFJlZ2lzdGVy
c1RvU3BpbGxTbG90KENDYWxsSGVscGVycyYgaml0LCBpbnQzMl90IHN0YWNrU3BpbGxTbG90KQor
eworICAgIFJFTEVBU0VfQVNTRVJUKG1fZGVzY3JpcHRvci5tX2lzRXhjZXB0aW9uRnJvbUpTQ2Fs
bCB8fCBtX2Rlc2NyaXB0b3IubV9pc0V4Y2VwdGlvbkZyb21HZXRCeUlkKTsKKyAgICB1bnNpZ25l
ZCBjb3VudCA9IDA7CisgICAgZm9yIChHUFJSZWcgcmVnID0gTWFjcm9Bc3NlbWJsZXI6OmZpcnN0
UmVnaXN0ZXIoKTsgcmVnIDw9IE1hY3JvQXNzZW1ibGVyOjpsYXN0UmVnaXN0ZXIoKTsgcmVnID0g
TWFjcm9Bc3NlbWJsZXI6Om5leHRSZWdpc3RlcihyZWcpKSB7CisgICAgICAgIGlmIChyZWdpc3Rl
cnNUb1ByZXNlcnZlRm9yQ2FsbFRoYXRNaWdodFRocm93LmdldChyZWcpKSB7CisgICAgICAgICAg
ICBqaXQuc3RvcmU2NChyZWcsIENDYWxsSGVscGVyczo6YWRkcmVzc0ZvcihzdGFja1NwaWxsU2xv
dCArIGNvdW50KSk7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICB9CisgICAgfQorICAg
IGZvciAoRlBSUmVnIHJlZyA9IE1hY3JvQXNzZW1ibGVyOjpmaXJzdEZQUmVnaXN0ZXIoKTsgcmVn
IDw9IE1hY3JvQXNzZW1ibGVyOjpsYXN0RlBSZWdpc3RlcigpOyByZWcgPSBNYWNyb0Fzc2VtYmxl
cjo6bmV4dEZQUmVnaXN0ZXIocmVnKSkgeworICAgICAgICBpZiAocmVnaXN0ZXJzVG9QcmVzZXJ2
ZUZvckNhbGxUaGF0TWlnaHRUaHJvdy5nZXQocmVnKSkgeworICAgICAgICAgICAgaml0LnN0b3Jl
RG91YmxlKHJlZywgQ0NhbGxIZWxwZXJzOjphZGRyZXNzRm9yKHN0YWNrU3BpbGxTbG90ICsgY291
bnQpKTsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQg
T1NSRXhpdDo6cmVjb3ZlclJlZ2lzdGVyc0Zyb21TcGlsbFNsb3QoQ0NhbGxIZWxwZXJzJiBqaXQs
IGludDMyX3Qgc3RhY2tTcGlsbFNsb3QpCit7CisgICAgUkVMRUFTRV9BU1NFUlQobV9kZXNjcmlw
dG9yLm1faXNFeGNlcHRpb25Gcm9tSlNDYWxsIHx8IG1fZGVzY3JpcHRvci5tX2lzRXhjZXB0aW9u
RnJvbUdldEJ5SWQpOworICAgIHVuc2lnbmVkIGNvdW50ID0gMDsKKyAgICBmb3IgKEdQUlJlZyBy
ZWcgPSBNYWNyb0Fzc2VtYmxlcjo6Zmlyc3RSZWdpc3RlcigpOyByZWcgPD0gTWFjcm9Bc3NlbWJs
ZXI6Omxhc3RSZWdpc3RlcigpOyByZWcgPSBNYWNyb0Fzc2VtYmxlcjo6bmV4dFJlZ2lzdGVyKHJl
ZykpIHsKKyAgICAgICAgaWYgKHJlZ2lzdGVyc1RvUHJlc2VydmVGb3JDYWxsVGhhdE1pZ2h0VGhy
b3cuZ2V0KHJlZykpIHsKKyAgICAgICAgICAgIGppdC5sb2FkNjQoQ0NhbGxIZWxwZXJzOjphZGRy
ZXNzRm9yKHN0YWNrU3BpbGxTbG90ICsgY291bnQpLCByZWcpOworICAgICAgICAgICAgY291bnQr
KzsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKEZQUlJlZyByZWcgPSBNYWNyb0Fzc2VtYmxl
cjo6Zmlyc3RGUFJlZ2lzdGVyKCk7IHJlZyA8PSBNYWNyb0Fzc2VtYmxlcjo6bGFzdEZQUmVnaXN0
ZXIoKTsgcmVnID0gTWFjcm9Bc3NlbWJsZXI6Om5leHRGUFJlZ2lzdGVyKHJlZykpIHsKKyAgICAg
ICAgaWYgKHJlZ2lzdGVyc1RvUHJlc2VydmVGb3JDYWxsVGhhdE1pZ2h0VGhyb3cuZ2V0KHJlZykp
IHsKKyAgICAgICAgICAgIGppdC5sb2FkRG91YmxlKENDYWxsSGVscGVyczo6YWRkcmVzc0Zvcihz
dGFja1NwaWxsU2xvdCArIGNvdW50KSwgcmVnKTsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAg
ICAgIH0KKyAgICB9Cit9CisKIH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpGVEwKIAogI2VuZGlmIC8v
IEVOQUJMRShGVExfSklUKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExPU1JF
eGl0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExPU1JFeGl0
LmgJKHJldmlzaW9uIDE5MTkzMSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMT1NS
RXhpdC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNiw4ICszNiwxMSBAQAogI2luY2x1ZGUgIkZUTEV4
aXRUaW1lT2JqZWN0TWF0ZXJpYWxpemF0aW9uLmgiCiAjaW5jbHVkZSAiRlRMRXhpdFZhbHVlLmgi
CiAjaW5jbHVkZSAiRlRMRm9ybWF0dGVkVmFsdWUuaCIKKyNpbmNsdWRlICJGVExTdGFja01hcHMu
aCIKKyNpbmNsdWRlICJIYW5kbGVySW5mby5oIgogI2luY2x1ZGUgIk1ldGhvZE9mR2V0dGluZ0FW
YWx1ZVByb2ZpbGUuaCIKICNpbmNsdWRlICJPcGVyYW5kcy5oIgorI2luY2x1ZGUgIlJlZy5oIgog
I2luY2x1ZGUgIlZhbHVlUHJvZmlsZS5oIgogI2luY2x1ZGUgIlZpcnR1YWxSZWdpc3Rlci5oIgog
CkBAIC0xNDIsNiArMTQ1LDcgQEAgc3RydWN0IE9TUkV4aXREZXNjcmlwdG9yIHsKICAgICBFeGl0
S2luZCBtX2tpbmQ7CiAgICAgQ29kZU9yaWdpbiBtX2NvZGVPcmlnaW47CiAgICAgQ29kZU9yaWdp
biBtX2NvZGVPcmlnaW5Gb3JFeGl0UHJvZmlsZTsKKyAgICBDb2RlT3JpZ2luIG1fc2VtYW50aWND
b2RlT3JpZ2luRm9yQ2FsbEZyYW1lSGVhZGVyOwogICAgIAogICAgIC8vIFRoZSBmaXJzdCBhcmd1
bWVudCB0byB0aGUgZXhpdCBjYWxsIG1heSBiZSBhIHZhbHVlIHdlIHdpc2ggdG8gcHJvZmlsZS4K
ICAgICAvLyBJZiB0aGF0J3MgdGhlIGNhc2UsIHRoZSBmb3JtYXQgd2lsbCBiZSBub3QgSW52YWxp
ZCBhbmQgd2UnbGwgaGF2ZSBhCkBAIC0xNTUsNyArMTU5LDEzIEBAIHN0cnVjdCBPU1JFeGl0RGVz
Y3JpcHRvciB7CiAgICAgQmFnPEV4aXRUaW1lT2JqZWN0TWF0ZXJpYWxpemF0aW9uPiBtX21hdGVy
aWFsaXphdGlvbnM7CiAgICAgCiAgICAgdWludDMyX3QgbV9zdGFja21hcElEOwotICAgIGJvb2wg
bV9pc0ludmFsaWRhdGlvblBvaW50OworICAgIEhhbmRsZXJJbmZvIG1fYmFzZWxpbmVFeGNlcHRp
b25IYW5kbGVyOworICAgIGJvb2wgbV9pc0ludmFsaWRhdGlvblBvaW50IDogMTsKKyAgICBib29s
IG1faXNFeGNlcHRpb25IYW5kbGVyIDogMTsKKyAgICBib29sIG1fd2lsbEFycml2ZUF0T1NSRXhp
dEZyb21HZW5lcmljVW53aW5kIDogMTsKKyAgICBib29sIG1faXNFeGNlcHRpb25Gcm9tSlNDYWxs
IDogMTsKKyAgICBib29sIG1faXNFeGNlcHRpb25Gcm9tR2V0QnlJZCA6IDE7CisgICAgYm9vbCBt
X2lzRXhjZXB0aW9uRnJvbUxhenlTbG93UGF0aCA6IDE7CiAgICAgCiAgICAgdm9pZCB2YWxpZGF0
ZVJlZmVyZW5jZXMoY29uc3QgVHJhY2tlZFJlZmVyZW5jZXMmKTsKIH07CkBAIC0xNzAsMTEgKzE4
MCwxNyBAQCBzdHJ1Y3QgT1NSRXhpdCA6IHB1YmxpYyBERkc6Ok9TUkV4aXRCYXNlCiAgICAgLy8g
T2Zmc2V0IHdpdGhpbiBTdGFja21hcDo6cmVjb3JkcwogICAgIHVpbnQzMl90IG1fc3RhY2ttYXBS
ZWNvcmRJbmRleDsKIAorICAgIFJlZ2lzdGVyU2V0IHJlZ2lzdGVyc1RvUHJlc2VydmVGb3JDYWxs
VGhhdE1pZ2h0VGhyb3c7CisKICAgICBDb2RlTG9jYXRpb25KdW1wIGNvZGVMb2NhdGlvbkZvclJl
cGF0Y2goQ29kZUJsb2NrKiBmdGxDb2RlQmxvY2spIGNvbnN0OwogICAgIHZvaWQgY29uc2lkZXJB
ZGRpbmdBc0ZyZXF1ZW50RXhpdFNpdGUoQ29kZUJsb2NrKiBwcm9maWxlZENvZGVCbG9jaykKICAg
ICB7CiAgICAgICAgIE9TUkV4aXRCYXNlOjpjb25zaWRlckFkZGluZ0FzRnJlcXVlbnRFeGl0U2l0
ZShwcm9maWxlZENvZGVCbG9jaywgRXhpdEZyb21GVEwpOwogICAgIH0KKworICAgIHZvaWQgZ2F0
aGVyUmVnaXN0ZXJzVG9TcGlsbEZvckNhbGxJZkV4Y2VwdGlvbihTdGFja01hcHMmLCBTdGFja01h
cHM6OlJlY29yZCYpOworICAgIHZvaWQgc3BpbGxSZWdpc3RlcnNUb1NwaWxsU2xvdChDQ2FsbEhl
bHBlcnMmLCBpbnQzMl90IHN0YWNrU3BpbGxTbG90KTsKKyAgICB2b2lkIHJlY292ZXJSZWdpc3Rl
cnNGcm9tU3BpbGxTbG90KENDYWxsSGVscGVycyYgaml0LCBpbnQzMl90IHN0YWNrU3BpbGxTbG90
KTsKIH07CiAKIH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpGVEwKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9mdGwvRlRMT1NSRXhpdENvbXBpbGF0aW9uSW5mby5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMT1NSRXhpdENvbXBpbGF0aW9uSW5mby5oCShyZXZp
c2lvbiAxOTE5MzEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTE9TUkV4aXRDb21w
aWxhdGlvbkluZm8uaAkod29ya2luZyBjb3B5KQpAQCAtMzksNiArMzksNyBAQCBzdHJ1Y3QgT1NS
RXhpdENvbXBpbGF0aW9uSW5mbyB7CiAgICAgfQogICAgIAogICAgIE1hY3JvQXNzZW1ibGVyOjpM
YWJlbCBtX3RodW5rTGFiZWw7CisgICAgTWFjcm9Bc3NlbWJsZXI6OkxhYmVsIG1fZ2V0QW5kUHV0
QnlJZENhbGxPcGVyYXRpb25FeGNlcHRpb25PU1JFeGl0RW50cmFuY2U7CiAgICAgTWFjcm9Bc3Nl
bWJsZXI6OlBhdGNoYWJsZUp1bXAgbV90aHVua0p1bXA7CiAgICAgQ29kZUxvY2F0aW9uTGFiZWwg
bV90aHVua0FkZHJlc3M7CiB9OwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExP
U1JFeGl0Q29tcGlsZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9m
dGwvRlRMT1NSRXhpdENvbXBpbGVyLmNwcAkocmV2aXNpb24gMTkxOTMxKQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2Z0bC9GVExPU1JFeGl0Q29tcGlsZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSAiREZHT1NSRXhpdFByZXBhcmF0aW9uLmgiCiAjaW5j
bHVkZSAiRlRMRXhpdEFyZ3VtZW50Rm9yT3BlcmFuZC5oIgogI2luY2x1ZGUgIkZUTEpJVENvZGUu
aCIKKyNpbmNsdWRlICJGVExMb2NhdGlvbi5oIgogI2luY2x1ZGUgIkZUTE9TUkV4aXQuaCIKICNp
bmNsdWRlICJGVExPcGVyYXRpb25zLmgiCiAjaW5jbHVkZSAiRlRMU3RhdGUuaCIKQEAgLTE3OCwx
MiArMTc5LDEyIEBAIHN0YXRpYyB2b2lkIGNvbXBpbGVTdHViKAogewogICAgIFN0YWNrTWFwczo6
UmVjb3JkKiByZWNvcmQgPSAmaml0Q29kZS0+c3RhY2ttYXBzLnJlY29yZHNbZXhpdC5tX3N0YWNr
bWFwUmVjb3JkSW5kZXhdOwogICAgIFJFTEVBU0VfQVNTRVJUKHJlY29yZC0+cGF0Y2hwb2ludElE
ID09IGV4aXQubV9kZXNjcmlwdG9yLm1fc3RhY2ttYXBJRCk7Ci0gICAgCisKICAgICAvLyBUaGlz
IGNvZGUgcmVxdWlyZXMgZnJhbWVQb2ludGVyUmVnaXN0ZXIgaXMgdGhlIHNhbWUgYXMgY2FsbEZy
YW1lUmVnaXN0ZXIKICAgICBzdGF0aWNfYXNzZXJ0KE1hY3JvQXNzZW1ibGVyOjpmcmFtZVBvaW50
ZXJSZWdpc3RlciA9PSBHUFJJbmZvOjpjYWxsRnJhbWVSZWdpc3RlciwgIk1hY3JvQXNzZW1ibGVy
OjpmcmFtZVBvaW50ZXJSZWdpc3RlciBhbmQgR1BSSW5mbzo6Y2FsbEZyYW1lUmVnaXN0ZXIgbXVz
dCBiZSB0aGUgc2FtZSIpOwogCiAgICAgQ0NhbGxIZWxwZXJzIGppdCh2bSwgY29kZUJsb2NrKTsK
LSAgICAKKwogICAgIC8vIFdlIG5lZWQgc2NyYXRjaCBzcGFjZSB0byBzYXZlIGFsbCByZWdpc3Rl
cnMsIHRvIGJ1aWxkIHVwIHRoZSBKUyBzdGFjaywgdG8gZGVhbCB3aXRoIHVud2luZAogICAgIC8v
IGZpeHVwLCBwb2ludGVycyB0byBhbGwgb2YgdGhlIG9iamVjdHMgd2UgbWF0ZXJpYWxpemUsIGFu
ZCB0aGUgZWxlbWVudHMgaW5zaWRlIHRob3NlIG9iamVjdHMKICAgICAvLyB0aGF0IHdlIG1hdGVy
aWFsaXplLgpAQCAtNDI2LDE1ICs0MjcsMjYgQEAgc3RhdGljIHZvaWQgY29tcGlsZVN0dWIoCiAK
ICAgICBSZWdpc3RlclNldCBhbGxGVExDYWxsZWVTYXZlcyA9IFJlZ2lzdGVyU2V0OjpmdGxDYWxs
ZWVTYXZlUmVnaXN0ZXJzKCk7CiAgICAgUmVnaXN0ZXJBdE9mZnNldExpc3QqIGJhc2VsaW5lQ2Fs
bGVlU2F2ZXMgPSBiYXNlbGluZUNvZGVCbG9jay0+Y2FsbGVlU2F2ZVJlZ2lzdGVycygpOworICAg
IFJlZ2lzdGVyQXRPZmZzZXRMaXN0KiB2bUNhbGxlZVNhdmVzID0gdm0tPmdldEFsbENhbGxlZVNh
dmVSZWdpc3Rlck9mZnNldHMoKTsKKyAgICBSZWdpc3RlclNldCBkb250Q29weVZNQ2FsbGVlU2F2
ZXMgPSBSZWdpc3RlclNldDo6c3RhY2tSZWdpc3RlcnMoKTsKKyAgICBpZiAoZXhpdC5tX2lzRXhj
ZXB0aW9uSGFuZGxlcikKKyAgICAgICAgaml0Lm1vdmUoQ0NhbGxIZWxwZXJzOjpUcnVzdGVkSW1t
UHRyKHZtLT5jYWxsZWVTYXZlUmVnaXN0ZXJzQnVmZmVyKSwgR1BSSW5mbzo6cmVnVDEpOwogCiAg
ICAgZm9yIChSZWcgcmVnID0gUmVnOjpmaXJzdCgpOyByZWcgPD0gUmVnOjpsYXN0KCk7IHJlZyA9
IHJlZy5uZXh0KCkpIHsKLSAgICAgICAgaWYgKCFhbGxGVExDYWxsZWVTYXZlcy5nZXQocmVnKSkK
KyAgICAgICAgaWYgKCFhbGxGVExDYWxsZWVTYXZlcy5nZXQocmVnKSkgeworICAgICAgICAgICAg
aWYgKGV4aXQubV9pc0V4Y2VwdGlvbkhhbmRsZXIpCisgICAgICAgICAgICAgICAgUkVMRUFTRV9B
U1NFUlQoIXZtQ2FsbGVlU2F2ZXMtPmZpbmQocmVnKSk7CiAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgfQogICAgICAgICB1bnNpZ25lZCB1bndpbmRJbmRleCA9IGNvZGVCbG9jay0+Y2Fs
bGVlU2F2ZVJlZ2lzdGVycygpLT5pbmRleE9mKHJlZyk7CiAgICAgICAgIFJlZ2lzdGVyQXRPZmZz
ZXQqIGJhc2VsaW5lUmVnaXN0ZXJPZmZzZXQgPSBiYXNlbGluZUNhbGxlZVNhdmVzLT5maW5kKHJl
Zyk7CisgICAgICAgIFJlZ2lzdGVyQXRPZmZzZXQqIHZtQ2FsbGVlU2F2ZSA9IG51bGxwdHI7IAor
ICAgICAgICBpZiAoZXhpdC5tX2lzRXhjZXB0aW9uSGFuZGxlcikKKyAgICAgICAgICAgIHZtQ2Fs
bGVlU2F2ZSA9IHZtQ2FsbGVlU2F2ZXMtPmZpbmQocmVnKTsKIAogICAgICAgICBpZiAocmVnLmlz
R1BSKCkpIHsKICAgICAgICAgICAgIEdQUlJlZyByZWdUb0xvYWQgPSBiYXNlbGluZVJlZ2lzdGVy
T2Zmc2V0ID8gR1BSSW5mbzo6cmVnVDAgOiByZWcuZ3ByKCk7CisgICAgICAgICAgICBSRUxFQVNF
X0FTU0VSVChyZWdUb0xvYWQgIT0gR1BSSW5mbzo6cmVnVDEpOwogCiAgICAgICAgICAgICBpZiAo
dW53aW5kSW5kZXggPT0gVUlOVF9NQVgpIHsKICAgICAgICAgICAgICAgICAvLyBUaGUgRlRMIGNv
bXBpbGF0aW9uIGRpZG4ndCBwcmVzZXJ2ZSB0aGlzIHJlZ2lzdGVyLiBUaGlzIG1lYW5zIHRoYXQg
aXQgYWxzbwpAQCAtNDUyLDYgKzQ2NCw4IEBAIHN0YXRpYyB2b2lkIGNvbXBpbGVTdHViKAogCiAg
ICAgICAgICAgICBpZiAoYmFzZWxpbmVSZWdpc3Rlck9mZnNldCkKICAgICAgICAgICAgICAgICBq
aXQuc3RvcmU2NChyZWdUb0xvYWQsIE1hY3JvQXNzZW1ibGVyOjpBZGRyZXNzKE1hY3JvQXNzZW1i
bGVyOjpmcmFtZVBvaW50ZXJSZWdpc3RlciwgYmFzZWxpbmVSZWdpc3Rlck9mZnNldC0+b2Zmc2V0
KCkpKTsKKyAgICAgICAgICAgIGlmICh2bUNhbGxlZVNhdmUgJiYgIWRvbnRDb3B5Vk1DYWxsZWVT
YXZlcy5nZXQodm1DYWxsZWVTYXZlLT5yZWcoKSkpCisgICAgICAgICAgICAgICAgaml0LnN0b3Jl
NjQocmVnVG9Mb2FkLCBNYWNyb0Fzc2VtYmxlcjo6QWRkcmVzcyhHUFJJbmZvOjpyZWdUMSwgdm1D
YWxsZWVTYXZlLT5vZmZzZXQoKSkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgRlBS
UmVnIGZwUmVnVG9Mb2FkID0gYmFzZWxpbmVSZWdpc3Rlck9mZnNldCA/IEZQUkluZm86OmZwUmVn
VDAgOiByZWcuZnByKCk7CiAKQEAgLTQ2Miw5ICs0NzYsMTkgQEAgc3RhdGljIHZvaWQgY29tcGls
ZVN0dWIoCiAKICAgICAgICAgICAgIGlmIChiYXNlbGluZVJlZ2lzdGVyT2Zmc2V0KQogICAgICAg
ICAgICAgICAgIGppdC5zdG9yZURvdWJsZShmcFJlZ1RvTG9hZCwgTWFjcm9Bc3NlbWJsZXI6OkFk
ZHJlc3MoTWFjcm9Bc3NlbWJsZXI6OmZyYW1lUG9pbnRlclJlZ2lzdGVyLCBiYXNlbGluZVJlZ2lz
dGVyT2Zmc2V0LT5vZmZzZXQoKSkpOworICAgICAgICAgICAgaWYgKHZtQ2FsbGVlU2F2ZSAmJiAh
ZG9udENvcHlWTUNhbGxlZVNhdmVzLmdldCh2bUNhbGxlZVNhdmUtPnJlZygpKSkKKyAgICAgICAg
ICAgICAgICBqaXQuc3RvcmVEb3VibGUoZnBSZWdUb0xvYWQsIE1hY3JvQXNzZW1ibGVyOjpBZGRy
ZXNzKEdQUkluZm86OnJlZ1QxLCB2bUNhbGxlZVNhdmUtPm9mZnNldCgpKSk7CiAgICAgICAgIH0K
ICAgICB9CiAKKyAgICBpZiAoZXhpdC5tX2lzRXhjZXB0aW9uSGFuZGxlcikgeworICAgICAgICBS
ZWdpc3RlckF0T2Zmc2V0KiB2bUNhbGxlZVNhdmUgPSBudWxscHRyOyAKKyAgICAgICAgdm1DYWxs
ZWVTYXZlID0gdm1DYWxsZWVTYXZlcy0+ZmluZChHUFJJbmZvOjp0YWdUeXBlTnVtYmVyUmVnaXN0
ZXIpOworICAgICAgICBqaXQuc3RvcmU2NChHUFJJbmZvOjp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIs
IE1hY3JvQXNzZW1ibGVyOjpBZGRyZXNzKEdQUkluZm86OnJlZ1QxLCB2bUNhbGxlZVNhdmUtPm9m
ZnNldCgpKSk7CisgICAgICAgIHZtQ2FsbGVlU2F2ZSA9IHZtQ2FsbGVlU2F2ZXMtPmZpbmQoR1BS
SW5mbzo6dGFnTWFza1JlZ2lzdGVyKTsKKyAgICAgICAgaml0LnN0b3JlNjQoR1BSSW5mbzo6dGFn
TWFza1JlZ2lzdGVyLCBNYWNyb0Fzc2VtYmxlcjo6QWRkcmVzcyhHUFJJbmZvOjpyZWdUMSwgdm1D
YWxsZWVTYXZlLT5vZmZzZXQoKSkpOworICAgIH0KKwogICAgIHNpemVfdCBiYXNlbGluZVZpcnR1
YWxSZWdpc3RlcnNGb3JDYWxsZWVTYXZlcyA9IGJhc2VsaW5lQ29kZUJsb2NrLT5jYWxsZWVTYXZl
U3BhY2VBc1ZpcnR1YWxSZWdpc3RlcnMoKTsKIAogICAgIC8vIE5vdyBnZXQgc3RhdGUgb3V0IG9m
IHRoZSBzY3JhdGNoIGJ1ZmZlciBhbmQgcGxhY2UgaXQgYmFjayBpbnRvIHRoZSBzdGFjay4gVGhl
IHZhbHVlcyBhcmUKQEAgLTQ4MSw3ICs1MDUsNyBAQCBzdGF0aWMgdm9pZCBjb21waWxlU3R1YigK
ICAgICAKICAgICBoYW5kbGVFeGl0Q291bnRzKGppdCwgZXhpdCk7CiAgICAgcmVpZnlJbmxpbmVk
Q2FsbEZyYW1lcyhqaXQsIGV4aXQpOwotICAgIGFkanVzdEFuZEp1bXBUb1RhcmdldChqaXQsIGV4
aXQsIGZhbHNlKTsKKyAgICBhZGp1c3RBbmRKdW1wVG9UYXJnZXQoaml0LCBleGl0LCBleGl0Lm1f
aXNFeGNlcHRpb25IYW5kbGVyKTsKICAgICAKICAgICBMaW5rQnVmZmVyIHBhdGNoQnVmZmVyKCp2
bSwgaml0LCBjb2RlQmxvY2spOwogICAgIGV4aXQubV9jb2RlID0gRklOQUxJWkVfQ09ERV9JRigK
QEAgLTUyMCw2ICs1NDQsMTEgQEAgZXh0ZXJuICJDIiB2b2lkKiBjb21waWxlRlRMT1NSRXhpdChF
eGVjUwogICAgICAgICBkYXRhTG9nKCIgICAgT3JpZ2luOiAiLCBleGl0Lm1fY29kZU9yaWdpbiwg
IlxuIik7CiAgICAgICAgIGlmIChleGl0Lm1fY29kZU9yaWdpbkZvckV4aXRQcm9maWxlICE9IGV4
aXQubV9jb2RlT3JpZ2luKQogICAgICAgICAgICAgZGF0YUxvZygiICAgIE9yaWdpbiBmb3IgZXhp
dCBwcm9maWxlOiAiLCBleGl0Lm1fY29kZU9yaWdpbkZvckV4aXRQcm9maWxlLCAiXG4iKTsKKyAg
ICAgICAgZGF0YUxvZygiICAgIEV4aXQgc3RhY2ttYXAgSUQ6ICIsIGV4aXQubV9kZXNjcmlwdG9y
Lm1fc3RhY2ttYXBJRCwgIlxuIik7CisgICAgICAgIGRhdGFMb2coIiAgICBDdXJyZW50IGNhbGwg
c2l0ZSBpbmRleDogIiwgZXhlYy0+Y2FsbFNpdGVJbmRleCgpLmJpdHMoKSwgIlxuIik7CisgICAg
ICAgIGRhdGFMb2coIiAgICBFeGl0IGlzIGV4Y2VwdGlvbiBoYW5kbGVyOiAiLCBleGl0Lm1faXNF
eGNlcHRpb25IYW5kbGVyLAorICAgICAgICAgICAgIiB3aWxsIGFycml2ZSBhdCBleGl0IGZyb20g
Z2VuZXJpY1Vud2luZCgpOiAiLCBleGl0Lm1fZGVzY3JpcHRvci5tX3dpbGxBcnJpdmVBdE9TUkV4
aXRGcm9tR2VuZXJpY1Vud2luZCwgCisgICAgICAgICAgICAiIHdpbGwgYXJyaXZlIGF0IGV4aXQg
ZnJvbSBsYXp5IHNsb3cgcGF0aDogIiwgZXhpdC5tX2Rlc2NyaXB0b3IubV9pc0V4Y2VwdGlvbkZy
b21MYXp5U2xvd1BhdGgsICJcbiIpOwogICAgICAgICBkYXRhTG9nKCIgICAgRXhpdCB2YWx1ZXM6
ICIsIGV4aXQubV9kZXNjcmlwdG9yLm1fdmFsdWVzLCAiXG4iKTsKICAgICAgICAgaWYgKCFleGl0
Lm1fZGVzY3JpcHRvci5tX21hdGVyaWFsaXphdGlvbnMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAg
ICBkYXRhTG9nKCIgICAgTWF0ZXJpYWxpemF0aW9uczpcbiIpOwpAQCAtNTMxLDcgKzU2MCw3IEBA
IGV4dGVybiAiQyIgdm9pZCogY29tcGlsZUZUTE9TUkV4aXQoRXhlY1MKICAgICBwcmVwYXJlQ29k
ZU9yaWdpbkZvck9TUkV4aXQoZXhlYywgZXhpdC5tX2NvZGVPcmlnaW4pOwogICAgIAogICAgIGNv
bXBpbGVTdHViKGV4aXRJRCwgaml0Q29kZSwgZXhpdCwgdm0sIGNvZGVCbG9jayk7Ci0gICAgCisK
ICAgICBNYWNyb0Fzc2VtYmxlcjo6cmVwYXRjaEp1bXAoCiAgICAgICAgIGV4aXQuY29kZUxvY2F0
aW9uRm9yUmVwYXRjaChjb2RlQmxvY2spLCBDb2RlTG9jYXRpb25MYWJlbChleGl0Lm1fY29kZS5j
b2RlKCkpKTsKICAgICAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMU3RhdGUu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMU3RhdGUuY3Bw
CShyZXZpc2lvbiAxOTE5MzEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTFN0YXRl
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDksNiArNDksNyBAQCBTdGF0ZTo6U3RhdGUoR3JhcGgm
IGdyYXBoKQogICAgICwgaGFuZGxlRXhjZXB0aW9uU3RhY2ttYXBJRChVSU5UX01BWCkKICAgICAs
IGNhcHR1cmVkU3RhY2ttYXBJRChVSU5UX01BWCkKICAgICAsIHZhcmFyZ3NTcGlsbFNsb3RzU3Rh
Y2ttYXBJRChVSU5UX01BWCkKKyAgICAsIGV4Y2VwdGlvbkhhbmRsaW5nU3BpbGxTbG90U3RhY2tt
YXBJRChVSU5UX01BWCkKICAgICAsIHVud2luZERhdGFTZWN0aW9uKDApCiAgICAgLCB1bndpbmRE
YXRhU2VjdGlvblNpemUoMCkKIHsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRM
U3RhdGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTFN0YXRl
LmgJKHJldmlzaW9uIDE5MTkzMSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMU3Rh
dGUuaAkod29ya2luZyBjb3B5KQpAQCAtNzUsNiArNzUsNyBAQCBwdWJsaWM6CiAgICAgdW5zaWdu
ZWQgaGFuZGxlRXhjZXB0aW9uU3RhY2ttYXBJRDsKICAgICB1bnNpZ25lZCBjYXB0dXJlZFN0YWNr
bWFwSUQ7CiAgICAgdW5zaWduZWQgdmFyYXJnc1NwaWxsU2xvdHNTdGFja21hcElEOworICAgIHVu
c2lnbmVkIGV4Y2VwdGlvbkhhbmRsaW5nU3BpbGxTbG90U3RhY2ttYXBJRDsKICAgICBTZWdtZW50
ZWRWZWN0b3I8R2V0QnlJZERlc2NyaXB0b3I+IGdldEJ5SWRzOwogICAgIFNlZ21lbnRlZFZlY3Rv
cjxQdXRCeUlkRGVzY3JpcHRvcj4gcHV0QnlJZHM7CiAgICAgU2VnbWVudGVkVmVjdG9yPENoZWNr
SW5EZXNjcmlwdG9yPiBjaGVja0luczsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9pbnRl
cnByZXRlci9JbnRlcnByZXRlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2ludGVycHJldGVyL0ludGVycHJldGVyLmNwcAkocmV2aXNpb24gMTkxOTMxKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2ludGVycHJldGVyL0ludGVycHJldGVyLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNTk1LDEwICs1OTUsMTAgQEAgQUxXQVlTX0lOTElORSBzdGF0aWMgSGFuZGxlcklu
Zm8qIGZpbmRFeAogCiAgICAgQ2FsbEZyYW1lKiBjYWxsRnJhbWUgPSB2aXNpdG9yLT5jYWxsRnJh
bWUoKTsKICAgICB1bnNpZ25lZCBleGNlcHRpb25IYW5kbGVySW5kZXg7Ci0gICAgaWYgKGNvZGVC
bG9jay0+aml0VHlwZSgpICE9IEpJVENvZGU6OkRGR0pJVCkKLSAgICAgICAgZXhjZXB0aW9uSGFu
ZGxlckluZGV4ID0gY2FsbEZyYW1lLT5ieXRlY29kZU9mZnNldCgpOwotICAgIGVsc2UKKyAgICBp
ZiAoSklUQ29kZTo6aXNPcHRpbWl6aW5nSklUKGNvZGVCbG9jay0+aml0VHlwZSgpKSkKICAgICAg
ICAgZXhjZXB0aW9uSGFuZGxlckluZGV4ID0gY2FsbEZyYW1lLT5jYWxsU2l0ZUluZGV4KCkuYml0
cygpOworICAgIGVsc2UKKyAgICAgICAgZXhjZXB0aW9uSGFuZGxlckluZGV4ID0gY2FsbEZyYW1l
LT5ieXRlY29kZU9mZnNldCgpOwogCiAgICAgcmV0dXJuIGNvZGVCbG9jay0+aGFuZGxlckZvcklu
ZGV4KGV4Y2VwdGlvbkhhbmRsZXJJbmRleCwgcmVxdWlyZWRIYW5kbGVyKTsKIH0KSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvUmVnaXN0ZXJTZXQuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvUmVnaXN0ZXJTZXQuY3BwCShyZXZpc2lvbiAxOTE5MzEp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L1JlZ2lzdGVyU2V0LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNjYsNiArNjYsMTUgQEAgUmVnaXN0ZXJTZXQgUmVnaXN0ZXJTZXQ6OnNwZWNpYWxS
ZWdpc3RlcgogICAgICAgICBzdGFja1JlZ2lzdGVycygpLCByZXNlcnZlZEhhcmR3YXJlUmVnaXN0
ZXJzKCksIHJ1bnRpbWVSZWdpc3RlcnMoKSk7CiB9CiAKK1JlZ2lzdGVyU2V0IFJlZ2lzdGVyU2V0
Ojp2b2xhdGlsZVJlZ2lzdGVyc0ZvckpTQ2FsbCgpCit7CisgICAgUmVnaXN0ZXJTZXQgdm9sYXRp
bGVSZWdpc3RlcnMgPSBhbGxSZWdpc3RlcnMoKTsKKyAgICB2b2xhdGlsZVJlZ2lzdGVycy5leGNs
dWRlKFJlZ2lzdGVyU2V0OjpzdGFja1JlZ2lzdGVycygpKTsKKyAgICB2b2xhdGlsZVJlZ2lzdGVy
cy5leGNsdWRlKFJlZ2lzdGVyU2V0OjpyZXNlcnZlZEhhcmR3YXJlUmVnaXN0ZXJzKCkpOworICAg
IHZvbGF0aWxlUmVnaXN0ZXJzLmV4Y2x1ZGUoUmVnaXN0ZXJTZXQ6OnZtQ2FsbGVlU2F2ZVJlZ2lz
dGVycygpKTsKKyAgICByZXR1cm4gdm9sYXRpbGVSZWdpc3RlcnM7Cit9CisKIFJlZ2lzdGVyU2V0
IFJlZ2lzdGVyU2V0OjpzdHViVW5hdmFpbGFibGVSZWdpc3RlcnMoKQogewogICAgIHJldHVybiBS
ZWdpc3RlclNldChzcGVjaWFsUmVnaXN0ZXJzKCksIHZtQ2FsbGVlU2F2ZVJlZ2lzdGVycygpKTsK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvUmVnaXN0ZXJTZXQuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L1JlZ2lzdGVyU2V0LmgJKHJldmlzaW9uIDE5
MTkzMSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvUmVnaXN0ZXJTZXQuaAkod29ya2lu
ZyBjb3B5KQpAQCAtNTcsNiArNTcsNyBAQCBwdWJsaWM6CiAjaWYgRU5BQkxFKFdFQkFTU0VNQkxZ
KQogICAgIHN0YXRpYyBSZWdpc3RlclNldCB3ZWJBc3NlbWJseUNhbGxlZVNhdmVSZWdpc3RlcnMo
KTsgLy8gUmVnaXN0ZXJzIHNhdmVkIGFuZCB1c2VkIGJ5IHRoZSBXZWJBc3NlbWJseSBKSVQuCiAj
ZW5kaWYKKyAgICBzdGF0aWMgUmVnaXN0ZXJTZXQgdm9sYXRpbGVSZWdpc3RlcnNGb3JKU0NhbGwo
KTsKICAgICBzdGF0aWMgUmVnaXN0ZXJTZXQgc3R1YlVuYXZhaWxhYmxlUmVnaXN0ZXJzKCk7IC8v
IFRoZSB1bmlvbiBvZiBjYWxsZWUgc2F2ZXMgYW5kIHNwZWNpYWwgcmVnaXN0ZXJzLgogICAgIHN0
YXRpYyBSZWdpc3RlclNldCBhbGxHUFJzKCk7CiAgICAgc3RhdGljIFJlZ2lzdGVyU2V0IGFsbEZQ
UnMoKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3MvZnRsLXRyeS1j
YXRjaC1nZXR0ZXItaWMtZmFpbC10by1jYWxsLW9wZXJhdGlvbi10aHJvdy1lcnJvci5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNzL2Z0bC10cnktY2F0
Y2gtZ2V0dGVyLWljLWZhaWwtdG8tY2FsbC1vcGVyYXRpb24tdGhyb3ctZXJyb3IuanMJKHJldmlz
aW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNzL2Z0bC10cnktY2F0
Y2gtZ2V0dGVyLWljLWZhaWwtdG8tY2FsbC1vcGVyYXRpb24tdGhyb3ctZXJyb3IuanMJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSw0OSBAQAorZnVuY3Rpb24gYXNzZXJ0KGIpIHsKKyAgICBpZiAo
IWIpCisgICAgICAgIHRocm93IG5ldyBFcnJvcigiYmFkIHZhbHVlIikKK30KK25vSW5saW5lKGFz
c2VydCk7CisKK2xldCBvVGhyb3cgPSB7CisgICAgeDogMjAsCisgICAgeTogNDAsCisgICAgejog
NTAsCisgICAgZ2V0IGYoKSB7IHRocm93IG5ldyBFcnJvcigiSGVsbG8gV29ybGQhIik7IH0KK307
CisKK2xldCBvMSA9IHsKKyAgICB4OiAyMCwKKyAgICBmOiA0MAorfTsKKworbGV0IG8yID0gewor
ICAgIHg6IDIwLAorICAgIHk6IDUwLAorICAgIGdldCBmKCkgeyByZXR1cm4gMjA7IH0KK307CisK
K2Z1bmN0aW9uIGZvbyhmKSB7CisgICAgbGV0IG8gPSBmKCk7CisgICAgdHJ5IHsKKyAgICAgICAg
byA9IG8uZjsKKyAgICB9IGNhdGNoKGUpIHsKKyAgICAgICAgYXNzZXJ0KG8gPT09IG9UaHJvdyk7
IC8vIE1ha2Ugc3VyZSB0aGlzIGlzIG5vdCB1bmRlZmluZWQgd2hlbiB3ZSBoYXZlIGFuIElDIG1p
c3MgYW5kIGFuIGV4Y2VwdGlvbiBhdCB0aGUgc2FtZSB0aW1lLgorICAgIH0KK30KK25vSW5saW5l
KGZvbyk7CisKK2xldCBpOworbGV0IGZsYWcgPSBmYWxzZTsKK2Z1bmN0aW9uIGYoKSB7CisgICAg
aWYgKGZsYWcpCisgICAgICAgIHJldHVybiBvVGhyb3c7CisgICAgaWYgKGkgJSAyKQorICAgICAg
ICByZXR1cm4gbzE7CisgICAgcmV0dXJuIG8yOworfQorbm9JbmxpbmUoZik7Citmb3IgKGkgPSAw
OyBpIDwgMTAwMDAwOyBpKyspIHsKKyAgICBmb28oZik7Cit9CitmbGFnID0gdHJ1ZTsKK2Zvbyhm
KTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3MvZnRsLXRyeS1jYXRj
aC1nZXR0ZXItdGhyb3cuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3Rl
c3RzL3N0cmVzcy9mdGwtdHJ5LWNhdGNoLWdldHRlci10aHJvdy5qcwkocmV2aXNpb24gMCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3MvZnRsLXRyeS1jYXRjaC1nZXR0ZXIt
dGhyb3cuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MCBAQAorZnVuY3Rpb24gcmFuZG9t
KCkgeyAKKyAgICByZXR1cm4gImJsYWgiOworfQorbm9JbmxpbmUocmFuZG9tKTsKKworZnVuY3Rp
b24gZm9vKG8sIGEpIHsKKyAgICBsZXQgeCA9IG8uZzsKKyAgICBsZXQgeSA9IG8ueTsKKyAgICBs
ZXQgaiA9IHJhbmRvbSgpOworICAgIHRyeSB7CisgICAgICAgIGogPSBvLmY7CisgICAgfSBjYXRj
aChlKSB7CisgICAgICAgIC8vcHJpbnQoaik7CisgICAgICAgIGFzc2VydChqID09PSAiYmxhaCIp
OworICAgICAgICByZXR1cm4geCArIHkgKyAxOworICAgIH0KKyAgICAvL2Fzc2VydChqID09PSAi
Z2V0IGYiKTsKKyAgICByZXR1cm4geCArIHk7Cit9CisKK2Z1bmN0aW9uIGFzc2VydChiKSB7Cisg
ICAgaWYgKCFiKQorICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImJhZCB2YWx1ZSIpCit9Citub0lu
bGluZShhc3NlcnQpOworCitub0lubGluZShmb28pOwordmFyIGZsYWcgPSBmYWxzZTsKK2Z1bmN0
aW9uIGYoYXJnMSwgYXJnMiwgYXJnMykgeworICAgIGlmIChmbGFnKQorICAgICAgICB0aHJvdyBu
ZXcgRXJyb3IoImJsYWgiKQorICAgIHJldHVybiBhcmcxOworfQorbm9JbmxpbmUoZik7CitsZXQg
bzEgPSB7CisgICAgZzogMjAsCisgICAgeTogNDAsCisgICAgZjogImdldCBmIgorfTsKKworbGV0
IG8yID0geworICAgIGc6ICJnIiwKKyAgICB5OiAieSIsCisgICAgZ2V0IGYoKSB7IAorICAgICAg
ICBpZiAoZmxhZykgCisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImJsYWgiKTsgCisgICAg
ICAgIHJldHVybiAiZ2V0IGYiOworICAgIH0KK30KKworZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAw
MDA7IGkrKykgeworICAgIGlmIChpICUgMikgeworICAgICAgICBhc3NlcnQoZm9vKG8xKSA9PT0g
NjApOworICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydChmb28obzIpID09PSAiZ3kiKTsKKyAg
ICB9Cit9CitmbGFnID0gdHJ1ZTsKKy8vcHJpbnQoZm9vKG8yKSk7Cithc3NlcnQoZm9vKG8yKSA9
PT0gImd5MSIpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy9mdGwt
dHJ5LWNhdGNoLW9vbS1lcnJvci1sYXp5LXNsb3ctcGF0aC5qcwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNzL2Z0bC10cnktY2F0Y2gtb29tLWVycm9yLWxh
enktc2xvdy1wYXRoLmpzCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3Rl
c3RzL3N0cmVzcy9mdGwtdHJ5LWNhdGNoLW9vbS1lcnJvci1sYXp5LXNsb3ctcGF0aC5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDY5IEBACitmb3JjZUdDU2xvd1BhdGhzKCk7IC8vIEZvcmNl
IE9PTSBlcnJvciBpbiBGVEwgTWFrZVJvcGUgdG8gaGFwcGVuIGluIGEgbGF6eSBzbG93IHBhdGgu
CisKK2Z1bmN0aW9uIGFzc2VydChiKSB7CisgICAgaWYgKCFiKQorICAgICAgICB0aHJvdyBuZXcg
RXJyb3IoIkJhZCBhc3NlcnRpb24iKTsKK30KKworZnVuY3Rpb24gYSgpIHsgcmV0dXJuICJhIjsg
fQorbm9JbmxpbmUoYSk7CitmdW5jdGlvbiBiKCkgeyByZXR1cm4gImIiOyB9Citub0lubGluZShi
KTsKK2Z1bmN0aW9uIGMoKSB7IHJldHVybiAiYyI7IH0KK25vSW5saW5lKGMpOworZnVuY3Rpb24g
ZCgpIHsgcmV0dXJuICJkIjsgfQorbm9JbmxpbmUoZCk7CitmdW5jdGlvbiBlKCkgeyByZXR1cm4g
ImUiOyB9Citub0lubGluZShlKTsKK2Z1bmN0aW9uIGYoKSB7IHJldHVybiAiZiI7IH0KK25vSW5s
aW5lKGYpOworZnVuY3Rpb24gZygpIHsgcmV0dXJuICJnIjsgfQorbm9JbmxpbmUoZyk7CisKK2xl
dCBleHBTdHJpbmcgPSAiYSI7CitsZXQgZXhwb25lbnRpYWxCbG93dXAgPSBmYWxzZTsKK2xldCBz
aG91bGRCcmVhayA9IGZhbHNlOworZnVuY3Rpb24gZm9vKGZ1biwgbGVmdCwgcmlnaHQpIHsKKyAg
ICBsZXQgeCA9IGZ1bigpOworICAgIGxldCByID0gbGVmdCArIHJpZ2h0OworCisgICAgdmFyIF9h
ID0gYSgpOworICAgIHZhciBfYiA9IGIoKTsKKyAgICB2YXIgX2MgPSBjKCk7CisgICAgdmFyIF9k
ID0gZCgpOworICAgIHZhciBfZSA9IGUoKTsKKyAgICB2YXIgX2YgPSBmKCk7CisgICAgdmFyIF9n
ID0gZygpOworICAgIHRyeSB7CisgICAgICAgIGV4cFN0cmluZyA9IGV4cFN0cmluZyArIGV4cFN0
cmluZzsKKyAgICB9IGNhdGNoKGUpIHsKKyAgICAgICAgc2hvdWxkQnJlYWsgPSB0cnVlOworCisg
ICAgICAgIGFzc2VydChfYiA9PT0gImIiKTsKKyAgICAgICAgYXNzZXJ0KF9jID09PSAiYyIpOwor
ICAgICAgICBhc3NlcnQoX2QgPT09ICJkIik7CisgICAgICAgIGFzc2VydChfZSA9PT0gImUiKTsK
KyAgICAgICAgYXNzZXJ0KF9mID09PSAiZiIpOworICAgICAgICBhc3NlcnQoX2cgPT09ICJnIik7
CisgICAgfQorICAgIHJldHVybiB4ICsgcjsKK30KK25vSW5saW5lKGZvbyk7CisKKworCitmdW5j
dGlvbiBibGFoKCkgeyByZXR1cm4gImJsYWgiOyB9Citub0lubGluZShibGFoKTsKKworZm9yIChs
ZXQgaSA9IDA7IGkgPCAxMDAwMDA7IGkrKykgeworICAgIGFzc2VydChmb28oYmxhaCwgImIiLCAi
YSIpID09PSAiYmxhaGJhIik7CisgICAgaWYgKCFleHBvbmVudGlhbEJsb3d1cCkKKyAgICAgICAg
ZXhwU3RyaW5nID0gImEiOworfQorCitleHBvbmVudGlhbEJsb3d1cCA9IHRydWU7Cit3aGlsZSAo
dHJ1ZSkgeworICAgIGFzc2VydChmb28oYmxhaCwgImEiLCAiYiIpID09PSAiYmxhaGFiIik7Cisg
ICAgaWYgKHNob3VsZEJyZWFrKQorICAgICAgICBicmVhazsKK30KSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS90ZXN0cy9zdHJlc3MvZnRsLXRyeS1jYXRjaC1wYXRjaHBvaW50LXdpdGgtdm9s
YXRpbGUtcmVnaXN0ZXJzLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90
ZXN0cy9zdHJlc3MvZnRsLXRyeS1jYXRjaC1wYXRjaHBvaW50LXdpdGgtdm9sYXRpbGUtcmVnaXN0
ZXJzLmpzCShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVz
cy9mdGwtdHJ5LWNhdGNoLXBhdGNocG9pbnQtd2l0aC12b2xhdGlsZS1yZWdpc3RlcnMuanMJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw3MyBAQAorZnVuY3Rpb24gYXNzZXJ0KGIpIHsKKyAgICBp
ZiAoIWIpCisgICAgICAgIHRocm93IG5ldyBFcnJvcigiQmFkIHZhbHVlLiIpCit9Citub0lubGlu
ZShhc3NlcnQpOworCit2YXIgdjEgPSAxMDA7Cit2YXIgdjIgPSAyMDA7Cit2YXIgZmxhZyA9IGZh
bHNlOwordmFyIG8xID0geworICAgIGdldCBmKCkgeworICAgICAgICBpZiAoZmxhZykKKyAgICAg
ICAgICAgIHRocm93IG5ldyBFcnJvcigiZ290Y2hhISIpOworICAgICAgICByZXR1cm4gdjE7ICAg
IAorICAgIH0KK30KKworZnVuY3Rpb24gYSgpIHsgcmV0dXJuICJhIjsgfQorbm9JbmxpbmUoYSk7
CitmdW5jdGlvbiBiKCkgeyByZXR1cm4gImIiOyB9Citub0lubGluZShiKTsKK2Z1bmN0aW9uIGMo
KSB7IHJldHVybiAiYyI7IH0KK25vSW5saW5lKGMpOworZnVuY3Rpb24gZCgpIHsgcmV0dXJuICJk
IjsgfQorbm9JbmxpbmUoZCk7CitmdW5jdGlvbiBlKCkgeyByZXR1cm4gImUiOyB9Citub0lubGlu
ZShlKTsKK2Z1bmN0aW9uIGYoKSB7IHJldHVybiAiZiI7IH0KK25vSW5saW5lKGYpOworZnVuY3Rp
b24gZygpIHsgcmV0dXJuICJnIjsgfQorbm9JbmxpbmUoZyk7CisKK3ZhciBvMiA9IHsKKyAgICBn
ZXQgZigpIHsKKyAgICAgICAgYXNzZXJ0KHRydWUpOworICAgICAgICBhc3NlcnQodHJ1ZSk7Cisg
ICAgICAgIGFzc2VydCh0cnVlKTsKKyAgICAgICAgYXNzZXJ0KHRydWUpOworICAgICAgICBhc3Nl
cnQodHJ1ZSk7CisgICAgICAgIGFzc2VydCh0cnVlKTsKKyAgICAgICAgYXNzZXJ0KHRydWUpOwor
ICAgICAgICByZXR1cm4gdjI7CisgICAgfQorfQorCitmdW5jdGlvbiBmb28obykgeworICAgIHRy
eSB7CisgICAgICAgIHZhciBfYSA9IGEoKTsKKyAgICAgICAgdmFyIF9iID0gYigpOworICAgICAg
ICB2YXIgX2MgPSBjKCk7CisgICAgICAgIHZhciBfZCA9IGQoKTsKKyAgICAgICAgdmFyIF9lID0g
ZSgpOworICAgICAgICB2YXIgX2YgPSBmKCk7CisgICAgICAgIHZhciBfZyA9IGcoKTsKKworICAg
ICAgICBvID0gby5mOworCisgICAgfSBjYXRjaChlKSB7CisgICAgICAgIGFzc2VydChvID09PSBv
MSk7CisgICAgICAgIGFzc2VydChfYiA9PT0gImIiKTsKKyAgICAgICAgYXNzZXJ0KF9jID09PSAi
YyIpOworICAgICAgICBhc3NlcnQoX2QgPT09ICJkIik7CisgICAgICAgIGFzc2VydChfZSA9PT0g
ImUiKTsKKyAgICAgICAgYXNzZXJ0KF9mID09PSAiZiIpOworICAgICAgICBhc3NlcnQoX2cgPT09
ICJnIik7CisgICAgfQorfQorbm9JbmxpbmUoZm9vKTsKKworZm9yICh2YXIgaSA9IDA7IGkgPCAx
MDAwMDAwOyBpKyspCisgICAgZm9vKGkgJSAyID8gbzEgOiBvMik7CitmbGFnID0gdHJ1ZTsKK2Zv
byhvMSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNzL2Z0bC10cnkt
Y2F0Y2gtc2V0dGVyLXRocm93LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS90ZXN0cy9zdHJlc3MvZnRsLXRyeS1jYXRjaC1zZXR0ZXItdGhyb3cuanMJKHJldmlzaW9uIDAp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNzL2Z0bC10cnktY2F0Y2gtc2V0
dGVyLXRocm93LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDcgQEAKK2Z1bmN0aW9uIGZv
byhvLCBhKSB7CisgICAgbGV0IHggPSBvLmc7CisgICAgbGV0IHkgPSBvLnk7CisgICAgdHJ5IHsK
KyAgICAgICAgby5mID0gMjA7CisgICAgfSBjYXRjaChlKSB7CisgICAgICAgIHJldHVybiB4ICsg
eSArIDE7CisgICAgfQorICAgIHJldHVybiB4ICsgeTsKK30KKworZnVuY3Rpb24gYXNzZXJ0KGIp
IHsKKyAgICBpZiAoIWIpCisgICAgICAgIHRocm93IG5ldyBFcnJvcigiYmFkIHZhbHVlIikKK30K
K25vSW5saW5lKGFzc2VydCk7CisKK25vSW5saW5lKGZvbyk7Cit2YXIgZmxhZyA9IGZhbHNlOwor
ZnVuY3Rpb24gZihhcmcxLCBhcmcyLCBhcmczKSB7CisgICAgaWYgKGZsYWcpCisgICAgICAgIHRo
cm93IG5ldyBFcnJvcigiYmxhaCIpCisgICAgcmV0dXJuIGFyZzE7Cit9Citub0lubGluZShmKTsK
K2xldCBvMSA9IHsKKyAgICBnOiAyMCwKKyAgICB5OiA0MCwKKyAgICBmOiBudWxsCit9OworCits
ZXQgbzIgPSB7CisgICAgZzogImciLAorICAgIHk6ICJ5IiwKKyAgICBzZXQgZih2KSB7IGlmIChm
bGFnKSB0aHJvdyBuZXcgRXJyb3IoImJsYWgiKTsgfQorfQorCitmb3IgKGxldCBpID0gMDsgaSA8
IDEwMDAwMDsgaSsrKSB7CisgICAgaWYgKGkgJSAyKSB7CisgICAgICAgIGFzc2VydChmb28obzEp
ID09PSA2MCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KGZvbyhvMikgPT09ICJneSIp
OworICAgIH0KK30KK2ZsYWcgPSB0cnVlOworLy9wcmludChmb28obzIpKTsKK2Fzc2VydChmb28o
bzIpID09PSAiZ3kxIik7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNz
L2Z0bC10cnktY2F0Y2gtdGFpbC1jYWxsLWluaWxuZWQtY2FsbGVyLmpzCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3MvZnRsLXRyeS1jYXRjaC10YWlsLWNh
bGwtaW5pbG5lZC1jYWxsZXIuanMJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvdGVzdHMvc3RyZXNzL2Z0bC10cnktY2F0Y2gtdGFpbC1jYWxsLWluaWxuZWQtY2FsbGVyLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjIgQEAKKy8vIFRoaXMgdGVzdCBlbnN1cmVzIHRo
ZSBUYWlsQ2FsbEluaWxuZWRDYWxsZXIgaGFzIHRoZSBjb3JyZWN0CisvLyBzdGFjayB0cmFjZSBp
biB0aGUgRlRMIGluc2lkZSBhIHRyeSBibG9jay4KKy8vIFRoaXMgY2FzZSBhcmlzZXMgd2hlbiB5
b3UgaGF2ZSBhIHNpdHVhdGlvbiBsaWtlIHRoaXM6CisvLyBmb28gbWFrZXMgYSBjYWxsIHRvIGJh
ciwgYmFyIGlzIGlubGluZWQgaW4gZm9vLiBiYXIgbWFrZXMgYSBjYWxsCisvLyB0byBiYXogYW5k
IGJheiBpcyBpbmxpbmVkIGluIGJhci4gQW5kIHRoZW4gYmF6IG1ha2VzIGEgdGFpbC1jYWxsIHRv
IGpheiwKKy8vIGFuZCBqYXogaXMgaW5saW5lZCBpbiBiYXouIFdlIHdhbnQgdGhlIGNhbGxmcmFt
ZSBmb3IgamF6IHRvIGFwcGVhciB0byAKKy8vIGhhdmUgY2FsbGVyIGJlIGJhci4gCisKKworInVz
ZSBzdHJpY3QiOworZnVuY3Rpb24gdmFsdWUoKSB7CisgICAgcmV0dXJuICJ2YWx1ZSI7Cit9Citu
b0lubGluZSh2YWx1ZSk7CisKK2Z1bmN0aW9uIGFzc2VydChiKSB7CisgICAgaWYgKCFiKQorICAg
ICAgICB0aHJvdyBuZXcgRXJyb3IoImJhZCB2YWx1ZSIpOworfQorbm9JbmxpbmUoYXNzZXJ0KTsK
KworZnVuY3Rpb24gdmFsaWRhdGUoc3RhY2spIHsKKyAgICBsZXQgYXJyID0gc3RhY2suc3BsaXQo
IlxuIik7CisgICAgYXNzZXJ0KGFyclswXS5pbmRleE9mKCJqYXoiKSAhPT0gLTEpOworICAgIGFz
c2VydChhcnJbMV0uaW5kZXhPZigiYmFyIikgIT09IC0xKTsKKyAgICBhc3NlcnQoYXJyWzJdLmlu
ZGV4T2YoImZvbyIpICE9PSAtMSk7CisgICAgLy9wcmludChhcnIpOworfQorCitmdW5jdGlvbiBm
b28oKSB7CisgICAgbGV0IHYgPSB2YWx1ZSgpOworICAgIHRyeSB7CisgICAgICAgIHJldHVybiBi
YXIoKSArIDE7CisgICAgfSBjYXRjaChlKSB7CisgICAgICAgIC8vcHJpbnQoZS5zdGFjayk7Cisg
ICAgICAgIGFzc2VydCh2ID09PSAidmFsdWUiKTsKKyAgICAgICAgdmFsaWRhdGUoZS5zdGFjayk7
CisgICAgfQorfQorbm9JbmxpbmUoZm9vKTsKKworZnVuY3Rpb24gYmFyKCkgeworICAgIHJldHVy
biBiYXooKSArIDE7Cit9CisKK2Z1bmN0aW9uIGJheigpIHsgCisgICAgcmV0dXJuIGpheigpOwor
fQorCitsZXQgZmxhZyA9IGZhbHNlOworZnVuY3Rpb24gamF6KCkgeyAKKyAgICBpZiAoZmxhZykK
KyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJsb2wiKTsKKyAgICByZXR1cm4gMjA7IAorfQorbm9J
bmxpbmUoamF6KTsKKworZm9yICh2YXIgaSA9IDA7IGkgPCA1MDAwMDsgaSsrKSB7CisgICAgZm9v
KCk7Cit9CitmbGFnID0gdHJ1ZTsKK2ZvbygpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L3Rlc3RzL3N0cmVzcy9mdGwtdHJ5LWNhdGNoLXZhcmFyZ3MtY2FsbC10aHJvd3MuanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy9mdGwtdHJ5LWNhdGNo
LXZhcmFyZ3MtY2FsbC10aHJvd3MuanMJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvdGVzdHMvc3RyZXNzL2Z0bC10cnktY2F0Y2gtdmFyYXJncy1jYWxsLXRocm93cy5qcwko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDMyIEBACitmdW5jdGlvbiBmb28obywgYSkgeworICAg
IGxldCByZXNldEZsYWcgPSBmYWxzZTsKKyAgICBpZiAoZmxhZykgeworICAgICAgICByZXNldEZs
YWcgPSB0cnVlOworICAgICAgICBmbGFnID0gZmFsc2U7CisgICAgfQorICAgIGxldCB4ID0gbygx
MCk7CisgICAgbGV0IHkgPSBvKDIwKTsKKyAgICBpZiAocmVzZXRGbGFnKQorICAgICAgICBmbGFn
ID0gdHJ1ZTsKKyAgICB0cnkgeworICAgICAgICBvLmFwcGx5KG51bGwsIGEpOworICAgIH0gY2F0
Y2goZSkgeworICAgICAgICBpZiAoeCAhPT0gMTApCisgICAgICAgICAgICB0aHJvdyBuZXcgRXJy
b3IoIk5vdCAxMCIpCisgICAgICAgIHJldHVybiB4ICsgeTsKKyAgICB9Cit9Citub0lubGluZShm
b28pOwordmFyIGZsYWcgPSBmYWxzZTsKK2Z1bmN0aW9uIGYoYXJnMSwgYXJnMiwgYXJnMykgewor
ICAgIGlmIChmbGFnKQorICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImJsYWgiKQorICAgIHJldHVy
biBhcmcxOworfQorbm9JbmxpbmUoZik7CisKK2ZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDAwOyBp
KyspIHsKKyAgICBmb28oZiwgWzEwLCAyMCwgMzBdKTsKK30KK2ZsYWcgPSB0cnVlOworZm9vKGYs
IFsxMCwgMjAsIDMwXSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNz
L3RyeS1jYXRjaC1zdHViLXJvdXRpbmUtcmVwbGFjZWQuanMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy90cnktY2F0Y2gtc3R1Yi1yb3V0aW5lLXJlcGxh
Y2VkLmpzCShyZXZpc2lvbiAxOTE5MzEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMv
c3RyZXNzL3RyeS1jYXRjaC1zdHViLXJvdXRpbmUtcmVwbGFjZWQuanMJKHdvcmtpbmcgY29weSkK
QEAgLTIxLDggKzIxLDE1IEBAIGZ1bmN0aW9uIGFsbG9jYXRlKCkgewogZnVuY3Rpb24gaGVsbG8o
KSB7IHJldHVybiAyMDsgfQogbm9JbmxpbmUoaGVsbG8pOwogCitsZXQgX19qYXogPSB7fTsKK2Z1
bmN0aW9uIGphenp5KCkgeworICAgIHJldHVybiBfX2phejsKK30KK25vSW5saW5lKGphenp5KTsK
KwogZnVuY3Rpb24gZm9vKG8pIHsKICAgICBsZXQgYmF6ID0gaGVsbG8oKTsKKyAgICBsZXQgamF6
ID0gamF6enkoKTsKICAgICBsZXQgdjsKICAgICB0cnkgewogICAgICAgICB2ID0gby5mOwpAQCAt
MzAsNiArMzcsNyBAQCBmdW5jdGlvbiBmb28obykgewogICAgICAgICB2ID0gby5mOwogICAgIH0g
Y2F0Y2goZSkgewogICAgICAgICBhc3NlcnQoYmF6ID09PSAyMCk7CisgICAgICAgIGFzc2VydChq
YXogPT09IF9famF6KTsKICAgICAgICAgYXNzZXJ0KHYgPT09IDIpOyAvLyBSZWFsbHkgZmxhZ0Nv
dW50LgogICAgIH0KICAgICByZXR1cm4gdjsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>264654</attachid>
            <date>2015-11-02 18:34:37 -0800</date>
            <delta_ts>2015-11-03 15:59:27 -0800</delta_ts>
            <desc>patch</desc>
            <filename>c-backup.diff</filename>
            <type>text/plain</type>
            <size>95430</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTkxOTMxKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIzNiBA
QAorMjAxNS0xMS0wMiAgU2FhbSBiYXJhdGkgIDxzYmFyYXRpQGFwcGxlLmNvbT4KKworICAgICAg
ICBJbXBsZW1lbnQgdHJ5L2NhdGNoIGluIHRoZSBGVEwKKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0OTQwOQorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoaXMgcGF0Y2ggaW1wbGVtZW50cyB0cnkvY2F0Y2gg
aW4gdGhlIEZUTCBpbiBhIHNpbWlsYXIKKyAgICAgICAgd2F5IHRvIGhvdyBpdCdzIGltcGxlbWVu
dGVkIGluIHRoZSBERkcuIFRoZSBtYWluIGlkZWEgaXMKKyAgICAgICAgdGhpczogYW55dGltZSBh
biBleGNlcHRpb24gaXMgdGhyb3duIGluIGEgdHJ5IGJsb2NrLCAKKyAgICAgICAgd2UgT1NSIGV4
aXQgaW50byB0aGUgYmFzZWxpbmUgSklUJ3MgY29ycmVzcG9uZGluZyBjYXRjaAorICAgICAgICBi
bG9jay4gV2UgY29tcGlsZSBPU1IgZXhpdHMgaW4gYSBmZXcgZm9ybXM6CisgICAgICAgIDEpIEV4
cGxpY2l0IGV4Y2VwdGlvbiBjaGVja3MgdGhhdCBjaGVjayBWTSdzIGV4Y2VwdGlvbgorICAgICAg
ICBwb2ludGVyLiBUaGlzIGlzIG1vZGVsZWQgZXhwbGljaXRseSBpbiBMTFZNIElSLgorICAgICAg
ICAyKSBPU1IgZXhpdHMgdGhhdCBhcmUgYXJyaXZlZCBhdCBmcm9tIGdlbmVyaWNVbndpbmQgCisg
ICAgICAgIGNhdXNlZCBieSBhbiBleGNlcHRpb24gYmVpbmcgdGhyb3duIGluIGEgSlMgY2FsbCAo
aW5jbHVkaW5nCisgICAgICAgIGdldHRlcnMgYW5kIHNldHRlcnMpLgorICAgICAgICAzKSBFeGNl
cHRpb24gZnJvbSBsYXp5IHNsb3cgcGF0aHMuCisgICAgICAgIDQpIEV4Y2VwdGlvbiBmcm9tIGZh
aWxlZCBJQyBDIENhbGwuCisKKyAgICAgICAgQWxsIHN0YWNrbWFwcyBhc3NvY2lhdGVkIHdpdGgg
dGhlIGFib3ZlIHR5cGVzIG9mIGV4aXRzIGFsbCAKKyAgICAgICAgdGFrZSBhcmd1bWVudHMgdGhh
dCBjb3JyZXNwb25kIHRvIHZhcmlhYmxlcyB0aGF0IGFyZSAKKyAgICAgICAgYnl0ZWNvZGUtbGl2
ZSBpbiB0aGUgY2F0Y2ggYmxvY2suCisKKyAgICAgICAgMSkgSXRlbSAxIGlzIHRoZSBzaW1wbGVz
dCBpbXBsZW1lbnRhdGlvbi4gV2hlbiBpbnNpZGUKKyAgICAgICAgYSB0cnkgYmxvY2ssIGV4Y2Vw
dGlvbiBjaGVja3Mgd2lsbCBlbWl0IGEgYnJhbmNoIHRvCisgICAgICAgIGFuIE9TUiBleGl0IHN0
YWNrbWFwIGludHJpbnNpYy4gVGhpcyBzdGFja21hcCBpbnRyaW5zaWMKKyAgICAgICAgdGFrZXMg
YXMgYXJndW1lbnRzIHRoZSBsaXZlIGNhdGNoIHZhcmlhYmxlcy4KKworICAgICAgICAyKSBBbGwg
Zm9ybXMgb2YgY2FsbHMgYW5kIEdldEJ5SWRzIGFuZCBQdXRCeUlkcyBhcmUgaW1wbGVtZW50ZWQK
KyAgICAgICAgYXMgcGF0Y2hwb2ludHMgaW4gTExWTS4gQXMgYSBwYXRjaHBvaW50LCB0aGV5IGhh
dmUgYSBzdGFja21hcCBJRC4KKyAgICAgICAgV2UgdXNlIHRoZSBzYW1lIHN0YWNrbWFwIElEIGZv
ciB0aGUgT1NSIGV4aXQuIFRoZSBPU1IgZXhpdCBhcmd1bWVudHMKKyAgICAgICAgYXJlIGFwcGVu
ZGVkIHRvIHRoZSBlbmQgb2YgdGhlIG5vcm1hbCBhcmd1bWVudHMgZm9yIHRoZSBwYXRjaHBvaW50
LiBUaGVzZQorICAgICAgICB0eXBlcyBvZiBPU1IgZXhpdHMgYXJlIG9ubHkgcmVhY2hlZCBpbmRp
cmVjdGx5IHZpYSBnZW5lcmljVW53aW5kLgorICAgICAgICBUaGVyZWZvcmUsIHRoZSBMTFZNIElS
IHdlIGdlbmVyYXRlIG5ldmVyIGhhcyBhIGRpcmVjdCBicmFuY2ggdG8gdGhlbS4KKyAgICAgICAg
VGhlc2UgYXJlIHRoZSBPU1IgZXhpdHMgd2Ugc3RvcmUgaW4gdGhlIENvZGVCbG9jaydzIGV4Y2Vw
dGlvbiBoYW5kbGluZworICAgICAgICB0YWJsZS4gVGhlIGV4Y2VwdGlvbiBoYW5kbGVycycgY29k
ZSBsb2NhdGlvbnMgcG9pbnQgdG8gdGhlIGJlZ2lubmluZworICAgICAgICBvZiB0aGUgY29ycmVz
cG9uZGluZyBPU1IgZXhpdC4gVGhlcmUgaXMgYW4gaW50ZXJlc3Rpbmcgc3RvcnkgaGVyZQorICAg
ICAgICBhYm91dCBob3cgd2UgcHJlc2VydmUgcmVnaXN0ZXJzLiBMTFZNIHBhdGNocG9pbnRzIGFz
c3VtZSBsYXRlIGNsb2JiZXIsCisgICAgICAgIGkuZSwgdGhleSBhc3N1bWUgd2UgdXNlIHRoZSBw
YXRjaHBvaW50IGFyZ3VtZW50cyBiZWZvcmUgd2UgY2xvYmJlciB0aGVtLgorICAgICAgICBUaGVy
ZWZvcmUsIGl0J3Mgc291bmQgZm9yIExMVk0gdG8gcGFzcyB1cyBhcmd1bWVudHMgaW4gdm9sYXRp
bGUgcmVnaXN0ZXJzLgorICAgICAgICBXZSBtdXN0IHRha2UgY2FyZSB0byBzdG9yZSB0aGUgYXJn
dW1lbnRzIGluIHZvbGF0aWxlIHJlZ2lzdGVycyB0byB0aGUKKyAgICAgICAgc3RhY2sgYmVmb3Jl
IG1ha2luZyBhIGNhbGwuIFdlIGVuc3VyZSB3ZSBoYXZlIHN0YWNrIHNwYWNlIGZvciB0aGVzZQor
ICAgICAgICBieSB1c2luZyBMTFZNJ3MgYWxsb2NhIGluc3RydWN0aW9uLiBUaGVuLCB3aGVuIG1h
a2luZyBhIGNhbGwgaW5zaWRlCisgICAgICAgIGEgdHJ5IGJsb2NrLCB3ZSBzcGlsbCB0aGUgbmVl
ZGVkIHJlZ2lzdGVycywgYW5kIGlmIHRoYXQgY2FsbCB0aHJvd3MsCisgICAgICAgIHdlIG1ha2Ug
c3VyZSB0aGUgT1NSIGV4aXQgZmlsbHMgdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0ZXJzLgorCisg
ICAgICAgIDMpIEV4Y2VwdGlvbnMgZnJvbSBsYXp5IHNsb3cgcGF0aHMgYXJlIHNpbWlsYXIgdG8g
KDIpIGV4Y2VwdCB0aGV5CisgICAgICAgIGRvbid0IGdvIHRocm91Z2ggZ2VuZXJpYyB1bndpbmQu
IFRoZXNlIE9TUiBFeGl0cyBhcmUgYXJyaXZlZCBhdCBmcm9tIGV4cGxpY2l0CisgICAgICAgIGV4
Y2VwdGlvbiBjaGVja3MgaW4gdGhlIGdlbmVyYXRlZCBsYXp5IHNsb3cgcGF0aC4gVGhlcmVmb3Jl
LCB0aGUgY2FsbGZyYW1lCisgICAgICAgIGlzIGludGFjdCB3aGVuIGFycml2aW5nIGF0IHRoZSBP
U1IgZXhpdC4gV2UgbWFrZSBzdXJlIHN1Y2ggbGF6eSBzbG93CisgICAgICAgIHBhdGhzIGV4Y2Vw
dGlvbiBjaGVjayBhcmUgbGlua2VkIHRvIHRoZSBPU1IgZXhpdCdzIGNvZGUgbG9jYXRpb24uCisK
KyAgICAgICAgNCkgVGhpcyBoYXMgYSByZWFsbHkgaW50ZXJlc3RpbmcgcmVnaXN0ZXIgcHJlc2Vy
dmF0aW9uIHN0b3J5LgorICAgICAgICBXZSBtYXkgaGF2ZSBhIEdldEJ5SWQgdGhhdCBoYXMgYW4g
SUMgbWlzcyBhbmQgdGhlcmVmb3JlIGdvZXMKKyAgICAgICAgdGhyb3VnaCB0aGUgRlRMJ3MgY2Fs
bE9wZXJhdGlvbiBtYWNoaW5lcnkuIExMVk0gbWF5IGFsc28KKyAgICAgICAgYXNrIGZvciB0aGUg
cmVzdWx0IHRvIGJlIHBsYWNlZCBpbiB0aGUgc2FtZSByZWdpc3RlciBhcyB0aGUKKyAgICAgICAg
YmFzZS4gVGhlcmVmb3JlLCBhZnRlciB0aGUgY2FsbCwgd2hlbiBzdG9yaW5nIHRvIHRoZSByZXN1
bHQsCisgICAgICAgIHdlIG92ZXJ3cml0ZSB0aGUgYmFzZS4gVGhpcyBjYW4ndCBmbHkgd2l0aCBl
eGNlcHRpb25zIGJlY2F1c2UKKyAgICAgICAgb3BlcmF0aW9uR2V0QnlJZE9wdGltaXplIG1heSB0
aHJvdyBhbiBleGNlcHRpb24gYW5kIHJldHVybiAidW5kZWZpbmVkIi4gV2hhdAorICAgICAgICB3
ZSByZWFsbHkgd2FudCBpcyB0aGUgb3JpZ2luYWwgYmFzZSB2YWx1ZSBmb3IgT1NSIGV4aXQgdmFs
dWUKKyAgICAgICAgcmVjb3ZlcnkuIEluIHRoaXMgY2FzZSwgd2UgdGFrZSBzcGVjaWFsIGNhcmUg
dG8gZmx1c2ggdGhlIGJhc2UgCisgICAgICAgIHZhbHVlIHRvIHRoZSBzdGFjayBiZWZvcmUgdGhl
IGNhbGxPcGVyYXRpb24gR2V0QnlJZCBzbG93IHBhdGguIAorICAgICAgICBMaWtlIGNhbGwgT1NS
IGV4aXRzLCB0aGVzZSB0eXBlcyBvZiBleGl0cyB3aWxsIHJlY292ZXIgdGhlIGJhc2UgCisgICAg
ICAgIHZhbHVlIGZyb20gdGhlIHN0YWNrIHdoZW4gbmVjZXNzYXJ5LgorCisgICAgICAgICogYnl0
ZWNvZGUvQ29kZUJsb2NrLmNwcDoKKyAgICAgICAgKEpTQzo6Q29kZUJsb2NrOjpuZXdFeGNlcHRp
b25IYW5kbGluZ0NhbGxTaXRlSW5kZXgpOgorICAgICAgICAqIGRmZy9ERkdHcmFwaC5jcHA6Cisg
ICAgICAgIChKU0M6OkRGRzo6R3JhcGg6Om1ldGhvZE9mR2V0dGluZ0FWYWx1ZVByb2ZpbGVGb3Ip
OgorICAgICAgICAoSlNDOjpERkc6OkdyYXBoOjp3aWxsQ2F0Y2hFeGNlcHRpb25Jbk1hY2hpbmVG
cmFtZSk6CisgICAgICAgICogZGZnL0RGR0dyYXBoLmg6CisgICAgICAgICogZGZnL0RGR0pJVENv
bXBpbGVyLmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpKSVRDb21waWxlcjo6YXBwZW5kRXhjZXB0
aW9uSGFuZGxpbmdPU1JFeGl0KToKKyAgICAgICAgKEpTQzo6REZHOjpKSVRDb21waWxlcjo6ZXhj
ZXB0aW9uQ2hlY2spOgorICAgICAgICAoSlNDOjpERkc6OkpJVENvbXBpbGVyOjpyZWNvcmRDYWxs
U2l0ZUFuZEdlbmVyYXRlRXhjZXB0aW9uSGFuZGxpbmdPU1JFeGl0SWZOZWVkZWQpOgorICAgICAg
ICAoSlNDOjpERkc6OkpJVENvbXBpbGVyOjp3aWxsQ2F0Y2hFeGNlcHRpb25Jbk1hY2hpbmVGcmFt
ZSk6IERlbGV0ZWQuCisgICAgICAgICogZGZnL0RGR0pJVENvbXBpbGVyLmg6CisgICAgICAgICog
ZGZnL0RGR05vZGVPcmlnaW4uaDoKKyAgICAgICAgKEpTQzo6REZHOjpOb2RlT3JpZ2luOjp3aXRo
U2VtYW50aWMpOgorICAgICAgICAoSlNDOjpERkc6Ok5vZGVPcmlnaW46OndpdGhGb3JFeGl0QW5k
RXhpdE9LKToKKyAgICAgICAgKEpTQzo6REZHOjpOb2RlT3JpZ2luOjp3aXRoRXhpdE9LKToKKyAg
ICAgICAgKiBkZmcvREZHT1NSRXhpdC5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6T1NSRXhpdDo6
T1NSRXhpdCk6CisgICAgICAgICogZGZnL0RGR09TUkV4aXQuaDoKKyAgICAgICAgKEpTQzo6REZH
OjpPU1JFeGl0Ojpjb25zaWRlckFkZGluZ0FzRnJlcXVlbnRFeGl0U2l0ZSk6CisgICAgICAgICog
ZGZnL0RGR09TUkV4aXRCYXNlLmg6CisgICAgICAgIChKU0M6OkRGRzo6T1NSRXhpdEJhc2U6Ok9T
UkV4aXRCYXNlKToKKyAgICAgICAgKEpTQzo6REZHOjpPU1JFeGl0QmFzZTo6Y29uc2lkZXJBZGRp
bmdBc0ZyZXF1ZW50RXhpdFNpdGUpOgorICAgICAgICAqIGRmZy9ERkdPU1JFeGl0Q29tcGlsZXJD
b21tb24uY3BwOgorICAgICAgICAoSlNDOjpERkc6OnJlaWZ5SW5saW5lZENhbGxGcmFtZXMpOgor
ICAgICAgICAqIGRmZy9ERkdUaWVyVXBDaGVja0luamVjdGlvblBoYXNlLmNwcDoKKyAgICAgICAg
KEpTQzo6REZHOjpUaWVyVXBDaGVja0luamVjdGlvblBoYXNlOjpydW4pOgorICAgICAgICAqIGZ0
bC9GVExDb21waWxlLmNwcDoKKyAgICAgICAgKEpTQzo6RlRMOjptbUFsbG9jYXRlRGF0YVNlY3Rp
b24pOgorICAgICAgICAqIGZ0bC9GVExFeGl0QXJndW1lbnQuaDoKKyAgICAgICAgKEpTQzo6RlRM
OjpFeGl0QXJndW1lbnQ6OndpdGhGb3JtYXQpOgorICAgICAgICAoSlNDOjpGVEw6OkV4aXRBcmd1
bWVudDo6cmVwcmVzZW50YXRpb24pOgorICAgICAgICAqIGZ0bC9GVExFeGl0VGh1bmtHZW5lcmF0
b3IuY3BwOgorICAgICAgICAoSlNDOjpGVEw6OkV4aXRUaHVua0dlbmVyYXRvcjo6fkV4aXRUaHVu
a0dlbmVyYXRvcik6CisgICAgICAgIChKU0M6OkZUTDo6RXhpdFRodW5rR2VuZXJhdG9yOjplbWl0
VGh1bmspOgorICAgICAgICAoSlNDOjpGVEw6OkV4aXRUaHVua0dlbmVyYXRvcjo6ZW1pdFRodW5r
cyk6CisgICAgICAgICogZnRsL0ZUTEV4aXRUaHVua0dlbmVyYXRvci5oOgorICAgICAgICAoSlND
OjpGVEw6OkV4aXRUaHVua0dlbmVyYXRvcjo6ZGlkVGhpbmdzKToKKyAgICAgICAgKiBmdGwvRlRM
RXhpdFZhbHVlLmg6CisgICAgICAgIChKU0M6OkZUTDo6RXhpdFZhbHVlOjppc0FyZ3VtZW50KToK
KyAgICAgICAgKEpTQzo6RlRMOjpFeGl0VmFsdWU6OmlzUmVjb3ZlcnkpOgorICAgICAgICAoSlND
OjpGVEw6OkV4aXRWYWx1ZTo6aXNPYmplY3RNYXRlcmlhbGl6YXRpb24pOgorICAgICAgICAoSlND
OjpGVEw6OkV4aXRWYWx1ZTo6aGFzSW5kZXhJblN0YWNrbWFwTG9jYXRpb25zKToKKyAgICAgICAg
KEpTQzo6RlRMOjpFeGl0VmFsdWU6OmV4aXRBcmd1bWVudCk6CisgICAgICAgIChKU0M6OkZUTDo6
RXhpdFZhbHVlOjpyaWdodFJlY292ZXJ5QXJndW1lbnQpOgorICAgICAgICAoSlNDOjpGVEw6OkV4
aXRWYWx1ZTo6YWRqdXN0U3RhY2ttYXBMb2NhdGlvbnNJbmRleEJ5T2Zmc2V0KToKKyAgICAgICAg
KEpTQzo6RlRMOjpFeGl0VmFsdWU6OnJlY292ZXJ5Rm9ybWF0KToKKyAgICAgICAgKiBmdGwvRlRM
SklUQ29kZS5jcHA6CisgICAgICAgIChKU0M6OkZUTDo6SklUQ29kZTo6dmFsaWRhdGVSZWZlcmVu
Y2VzKToKKyAgICAgICAgKEpTQzo6RlRMOjpKSVRDb2RlOjpsaXZlUmVnaXN0ZXJzVG9QcmVzZXJ2
ZUF0RXhjZXB0aW9uSGFuZGxpbmdDYWxsU2l0ZSk6CisgICAgICAgICogZnRsL0ZUTEpTQ2FsbC5j
cHA6CisgICAgICAgIChKU0M6OkZUTDo6SlNDYWxsOjpKU0NhbGwpOgorICAgICAgICAoSlNDOjpG
VEw6OkpTQ2FsbDo6ZW1pdCk6CisgICAgICAgICogZnRsL0ZUTEpTQ2FsbC5oOgorICAgICAgICAo
SlNDOjpGVEw6OkpTQ2FsbDo6c3RhY2ttYXBJRCk6CisgICAgICAgICogZnRsL0ZUTEpTQ2FsbEJh
c2UuY3BwOgorICAgICAgICAoSlNDOjpGVEw6OkpTQ2FsbEJhc2U6OkpTQ2FsbEJhc2UpOgorICAg
ICAgICAoSlNDOjpGVEw6OkpTQ2FsbEJhc2U6OmVtaXQpOgorICAgICAgICAqIGZ0bC9GVExKU0Nh
bGxCYXNlLmg6CisgICAgICAgIChKU0M6OkZUTDo6SlNDYWxsQmFzZTo6c2V0Q2FsbFNpdGVJbmRl
eCk6CisgICAgICAgIChKU0M6OkZUTDo6SlNDYWxsQmFzZTo6Y2FsbFNpdGVEZXNjcmlwdGlvbk9y
aWdpbik6CisgICAgICAgIChKU0M6OkZUTDo6SlNDYWxsQmFzZTo6c2V0Q29ycmVzcG9uZGluZ0dl
bmVyaWNVbndpbmRPU1JFeGl0KToKKyAgICAgICAgKiBmdGwvRlRMSlNDYWxsVmFyYXJncy5jcHA6
CisgICAgICAgIChKU0M6OkZUTDo6SlNDYWxsVmFyYXJnczo6bnVtU3BpbGxTbG90c05lZWRlZCk6
CisgICAgICAgIChKU0M6OkZUTDo6SlNDYWxsVmFyYXJnczo6ZW1pdCk6CisgICAgICAgICogZnRs
L0ZUTEpTQ2FsbFZhcmFyZ3MuaDoKKyAgICAgICAgKEpTQzo6RlRMOjpKU0NhbGxWYXJhcmdzOjpz
dGFja21hcElEKToKKyAgICAgICAgKEpTQzo6RlRMOjpKU0NhbGxWYXJhcmdzOjpvcGVyYXRvcjwp
OgorICAgICAgICAoSlNDOjpGVEw6OkpTQ2FsbFZhcmFyZ3M6OnNldENhbGxTaXRlSW5kZXgpOgor
ICAgICAgICAoSlNDOjpGVEw6OkpTQ2FsbFZhcmFyZ3M6OmNhbGxTaXRlRGVzY3JpcHRpb25Pcmln
aW4pOgorICAgICAgICAoSlNDOjpGVEw6OkpTQ2FsbFZhcmFyZ3M6OnNldENvcnJlc3BvbmRpbmdH
ZW5lcmljVW53aW5kT1NSRXhpdCk6CisgICAgICAgICogZnRsL0ZUTExvd2VyREZHVG9MTFZNLmNw
cDoKKyAgICAgICAgKEpTQzo6RlRMOjpERkc6Okxvd2VyREZHVG9MTFZNOjpsb3dlcik6CisgICAg
ICAgIChKU0M6OkZUTDo6REZHOjpMb3dlckRGR1RvTExWTTo6Y29tcGlsZVB1dEJ5SWQpOgorICAg
ICAgICAoSlNDOjpGVEw6OkRGRzo6TG93ZXJERkdUb0xMVk06OmNvbXBpbGVDYWxsT3JDb25zdHJ1
Y3QpOgorICAgICAgICAoSlNDOjpGVEw6OkRGRzo6TG93ZXJERkdUb0xMVk06OmNvbXBpbGVDYWxs
T3JDb25zdHJ1Y3RWYXJhcmdzKToKKyAgICAgICAgKEpTQzo6RlRMOjpERkc6Okxvd2VyREZHVG9M
TFZNOjpnZXRCeUlkKToKKyAgICAgICAgKEpTQzo6RlRMOjpERkc6Okxvd2VyREZHVG9MTFZNOjps
YXp5U2xvd1BhdGgpOgorICAgICAgICAoSlNDOjpGVEw6OkRGRzo6TG93ZXJERkdUb0xMVk06OnNw
ZWN1bGF0ZSk6CisgICAgICAgIChKU0M6OkZUTDo6REZHOjpMb3dlckRGR1RvTExWTTo6dGVybWlu
YXRlKToKKyAgICAgICAgKEpTQzo6RlRMOjpERkc6Okxvd2VyREZHVG9MTFZNOjphcHBlbmRUeXBl
Q2hlY2spOgorICAgICAgICAoSlNDOjpGVEw6OkRGRzo6TG93ZXJERkdUb0xMVk06OmNhbGxQcmVm
bGlnaHQpOgorICAgICAgICAoSlNDOjpGVEw6OkRGRzo6TG93ZXJERkdUb0xMVk06OmNhbGxDaGVj
ayk6CisgICAgICAgIChKU0M6OkZUTDo6REZHOjpMb3dlckRGR1RvTExWTTo6YXBwZW5kT1NSRXhp
dEFyZ3VtZW50c0ZvclBhdGNocG9pbnRJZldpbGxDYXRjaEV4Y2VwdGlvbik6CisgICAgICAgIChK
U0M6OkZUTDo6REZHOjpMb3dlckRGR1RvTExWTTo6ZW1pdEJyYW5jaFRvT1NSRXhpdElmV2lsbENh
dGNoRXhjZXB0aW9uKToKKyAgICAgICAgKEpTQzo6RlRMOjpERkc6Okxvd2VyREZHVG9MTFZNOjps
b3dCbG9jayk6CisgICAgICAgIChKU0M6OkZUTDo6REZHOjpMb3dlckRGR1RvTExWTTo6YXBwZW5k
T1NSRXhpdERlc2NyaXB0b3IpOgorICAgICAgICAoSlNDOjpGVEw6OkRGRzo6TG93ZXJERkdUb0xM
Vk06OmFwcGVuZE9TUkV4aXQpOgorICAgICAgICAoSlNDOjpGVEw6OkRGRzo6TG93ZXJERkdUb0xM
Vk06OmV4aXRWYWx1ZUZvck5vZGUpOgorICAgICAgICAqIGZ0bC9GVExPU1JFeGl0LmNwcDoKKyAg
ICAgICAgKEpTQzo6RlRMOjpPU1JFeGl0RGVzY3JpcHRvcjo6T1NSRXhpdERlc2NyaXB0b3IpOgor
ICAgICAgICAoSlNDOjpGVEw6Ok9TUkV4aXQ6Ok9TUkV4aXQpOgorICAgICAgICAoSlNDOjpGVEw6
Ok9TUkV4aXQ6OmNvZGVMb2NhdGlvbkZvclJlcGF0Y2gpOgorICAgICAgICAoSlNDOjpGVEw6Ok9T
UkV4aXQ6OmdhdGhlclJlZ2lzdGVyc1RvU3BpbGxGb3JDYWxsSWZFeGNlcHRpb24pOgorICAgICAg
ICAoSlNDOjpGVEw6Ok9TUkV4aXQ6OnNwaWxsUmVnaXN0ZXJzVG9TcGlsbFNsb3QpOgorICAgICAg
ICAoSlNDOjpGVEw6Ok9TUkV4aXQ6OnJlY292ZXJSZWdpc3RlcnNGcm9tU3BpbGxTbG90KToKKyAg
ICAgICAgKiBmdGwvRlRMT1NSRXhpdC5oOgorICAgICAgICAoSlNDOjpGVEw6Ok9TUkV4aXQ6OmNv
bnNpZGVyQWRkaW5nQXNGcmVxdWVudEV4aXRTaXRlKToKKyAgICAgICAgKiBmdGwvRlRMT1NSRXhp
dENvbXBpbGF0aW9uSW5mby5oOgorICAgICAgICAoSlNDOjpGVEw6Ok9TUkV4aXRDb21waWxhdGlv
bkluZm86Ok9TUkV4aXRDb21waWxhdGlvbkluZm8pOgorICAgICAgICAqIGZ0bC9GVExPU1JFeGl0
Q29tcGlsZXIuY3BwOgorICAgICAgICAoSlNDOjpGVEw6OmNvbXBpbGVTdHViKToKKyAgICAgICAg
KEpTQzo6RlRMOjpjb21waWxlRlRMT1NSRXhpdCk6CisgICAgICAgICogZnRsL0ZUTFN0YXRlLmNw
cDoKKyAgICAgICAgKEpTQzo6RlRMOjpTdGF0ZTo6U3RhdGUpOgorICAgICAgICAqIGZ0bC9GVExT
dGF0ZS5oOgorICAgICAgICAqIGludGVycHJldGVyL0ludGVycHJldGVyLmNwcDoKKyAgICAgICAg
KEpTQzo6ZmluZEV4Y2VwdGlvbkhhbmRsZXIpOgorICAgICAgICAqIGppdC9SZWdpc3RlclNldC5j
cHA6CisgICAgICAgIChKU0M6OlJlZ2lzdGVyU2V0OjpzcGVjaWFsUmVnaXN0ZXJzKToKKyAgICAg
ICAgKEpTQzo6UmVnaXN0ZXJTZXQ6OnZvbGF0aWxlUmVnaXN0ZXJzRm9ySlNDYWxsKToKKyAgICAg
ICAgKEpTQzo6UmVnaXN0ZXJTZXQ6OnN0dWJVbmF2YWlsYWJsZVJlZ2lzdGVycyk6CisgICAgICAg
ICogaml0L1JlZ2lzdGVyU2V0Lmg6CisgICAgICAgICogdGVzdHMvc3RyZXNzL2Z0bC10cnktY2F0
Y2gtZ2V0dGVyLWljLWZhaWwtdG8tY2FsbC1vcGVyYXRpb24tdGhyb3ctZXJyb3IuanM6IEFkZGVk
LgorICAgICAgICAoYXNzZXJ0KToKKyAgICAgICAgKGxldC5vVGhyb3cuZ2V0IGYpOgorICAgICAg
ICAobGV0Lm8yLmdldCBmKToKKyAgICAgICAgKGZvbyk6CisgICAgICAgIChmKToKKyAgICAgICAg
KiB0ZXN0cy9zdHJlc3MvZnRsLXRyeS1jYXRjaC1nZXR0ZXItdGhyb3cuanM6IEFkZGVkLgorICAg
ICAgICAocmFuZG9tKToKKyAgICAgICAgKGZvbyk6CisgICAgICAgIChhc3NlcnQpOgorICAgICAg
ICAoZik6CisgICAgICAgIChsZXQubzIuZ2V0IGYpOgorICAgICAgICAqIHRlc3RzL3N0cmVzcy9m
dGwtdHJ5LWNhdGNoLW9vbS1lcnJvci1sYXp5LXNsb3ctcGF0aC5qczogQWRkZWQuCisgICAgICAg
IChhc3NlcnQpOgorICAgICAgICAoYSk6CisgICAgICAgIChiKToKKyAgICAgICAgKGMpOgorICAg
ICAgICAoZCk6CisgICAgICAgIChlKToKKyAgICAgICAgKGYpOgorICAgICAgICAoZyk6CisgICAg
ICAgIChmb28pOgorICAgICAgICAoYmxhaCk6CisgICAgICAgICogdGVzdHMvc3RyZXNzL2Z0bC10
cnktY2F0Y2gtcGF0Y2hwb2ludC13aXRoLXZvbGF0aWxlLXJlZ2lzdGVycy5qczogQWRkZWQuCisg
ICAgICAgIChhc3NlcnQpOgorICAgICAgICAobzEuZ2V0IGYpOgorICAgICAgICAoYSk6CisgICAg
ICAgIChiKToKKyAgICAgICAgKGMpOgorICAgICAgICAoZCk6CisgICAgICAgIChlKToKKyAgICAg
ICAgKGYpOgorICAgICAgICAoZyk6CisgICAgICAgIChvMi5nZXQgZik6CisgICAgICAgIChmb28p
OgorICAgICAgICAqIHRlc3RzL3N0cmVzcy9mdGwtdHJ5LWNhdGNoLXNldHRlci10aHJvdy5qczog
QWRkZWQuCisgICAgICAgIChmb28pOgorICAgICAgICAoYXNzZXJ0KToKKyAgICAgICAgKGYpOgor
ICAgICAgICAobGV0Lm8yLnNldCBmKToKKyAgICAgICAgKiB0ZXN0cy9zdHJlc3MvZnRsLXRyeS1j
YXRjaC10YWlsLWNhbGwtaW5pbG5lZC1jYWxsZXIuanM6IEFkZGVkLgorICAgICAgICAodmFsdWUp
OgorICAgICAgICAoYXNzZXJ0KToKKyAgICAgICAgKHZhbGlkYXRlKToKKyAgICAgICAgKGJhcik6
CisgICAgICAgIChiYXopOgorICAgICAgICAoamF6KToKKyAgICAgICAgKiB0ZXN0cy9zdHJlc3Mv
ZnRsLXRyeS1jYXRjaC12YXJhcmdzLWNhbGwtdGhyb3dzLmpzOiBBZGRlZC4KKyAgICAgICAgKGZv
byk6CisgICAgICAgIChmKToKKyAgICAgICAgKiB0ZXN0cy9zdHJlc3MvdHJ5LWNhdGNoLXN0dWIt
cm91dGluZS1yZXBsYWNlZC5qczoKKyAgICAgICAgKGhlbGxvKToKKyAgICAgICAgKGZvbyk6CisK
IDIwMTUtMTEtMDIgIFNhYW0gYmFyYXRpICA8c2JhcmF0aUBhcHBsZS5jb20+CiAKICAgICAgICAg
V3JvbmcgdmFsdWUgcmVjb3ZlcnkgZm9yIERGRyB0cnkvY2F0Y2ggd2l0aCBhIGdldHRlciB0aGF0
IHRocm93cyBkdXJpbmcgYW4gSUMgbWlzcwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2J5
dGVjb2RlL0NvZGVCbG9jay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2J5dGVjb2RlL0NvZGVCbG9jay5jcHAJKHJldmlzaW9uIDE5MTkzMSkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9ieXRlY29kZS9Db2RlQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOTQ2
LDcgKzI5NDYsNyBAQCBIYW5kbGVySW5mbyogQ29kZUJsb2NrOjpoYW5kbGVyRm9ySW5kZXgoCiBD
YWxsU2l0ZUluZGV4IENvZGVCbG9jazo6bmV3RXhjZXB0aW9uSGFuZGxpbmdDYWxsU2l0ZUluZGV4
KENhbGxTaXRlSW5kZXggb3JpZ2luYWxDYWxsU2l0ZSkKIHsKICNpZiBFTkFCTEUoREZHX0pJVCkK
LSAgICBSRUxFQVNFX0FTU0VSVChqaXRUeXBlKCkgPT0gSklUQ29kZTo6REZHSklUKTsgLy8gRklY
TUU6IFdoZW4gaW1wbGVtZW50aW5nIEZUTCB0cnkvY2F0Y2ggd2Ugc2hvdWxkIGluY2x1ZGUgdGhh
dCBKSVRUeXBlIGhlcmUgYXMgd2VsbDogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTE0OTQwOQorICAgIFJFTEVBU0VfQVNTRVJUKEpJVENvZGU6OmlzT3B0aW1pemluZ0pJ
VChqaXRUeXBlKCkpKTsKICAgICBSRUxFQVNFX0FTU0VSVChjYW5HZXRDb2RlT3JpZ2luKG9yaWdp
bmFsQ2FsbFNpdGUpKTsKICAgICBBU1NFUlQoISFoYW5kbGVyRm9ySW5kZXgob3JpZ2luYWxDYWxs
U2l0ZS5iaXRzKCkpKTsKICAgICBDb2RlT3JpZ2luIG9yaWdpbmFsT3JpZ2luID0gY29kZU9yaWdp
bihvcmlnaW5hbENhbGxTaXRlKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
R3JhcGguY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHR3Jh
cGguY3BwCShyZXZpc2lvbiAxOTE5MzEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RG
R0dyYXBoLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTQ3OSw2ICsxNDc5LDI4IEBAIE1ldGhvZE9m
R2V0dGluZ0FWYWx1ZVByb2ZpbGUgR3JhcGg6Om1ldGgKICAgICByZXR1cm4gTWV0aG9kT2ZHZXR0
aW5nQVZhbHVlUHJvZmlsZSgpOwogfQogCitib29sIEdyYXBoOjp3aWxsQ2F0Y2hFeGNlcHRpb25J
bk1hY2hpbmVGcmFtZShDb2RlT3JpZ2luIGNvZGVPcmlnaW4sIENvZGVPcmlnaW4mIG9wQ2F0Y2hP
cmlnaW5PdXQsIEhhbmRsZXJJbmZvKiYgY2F0Y2hIYW5kbGVyT3V0KQoreworICAgIHVuc2lnbmVk
IGJ5dGVjb2RlSW5kZXhUb0NoZWNrID0gY29kZU9yaWdpbi5ieXRlY29kZUluZGV4OworICAgIHdo
aWxlICgxKSB7CisgICAgICAgIElubGluZUNhbGxGcmFtZSogaW5saW5lQ2FsbEZyYW1lID0gY29k
ZU9yaWdpbi5pbmxpbmVDYWxsRnJhbWU7CisgICAgICAgIENvZGVCbG9jayogY29kZUJsb2NrID0g
YmFzZWxpbmVDb2RlQmxvY2tGb3IoaW5saW5lQ2FsbEZyYW1lKTsKKyAgICAgICAgaWYgKEhhbmRs
ZXJJbmZvKiBoYW5kbGVyID0gY29kZUJsb2NrLT5oYW5kbGVyRm9yQnl0ZWNvZGVPZmZzZXQoYnl0
ZWNvZGVJbmRleFRvQ2hlY2spKSB7CisgICAgICAgICAgICBvcENhdGNoT3JpZ2luT3V0ID0gQ29k
ZU9yaWdpbihoYW5kbGVyLT50YXJnZXQsIGlubGluZUNhbGxGcmFtZSk7CisgICAgICAgICAgICBj
YXRjaEhhbmRsZXJPdXQgPSBoYW5kbGVyOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIH0KKworICAgICAgICBpZiAoIWlubGluZUNhbGxGcmFtZSkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgICAgICBieXRlY29kZUluZGV4VG9DaGVjayA9IGlubGluZUNhbGxGcmFt
ZS0+ZGlyZWN0Q2FsbGVyLmJ5dGVjb2RlSW5kZXg7CisgICAgICAgIGNvZGVPcmlnaW4gPSBjb2Rl
T3JpZ2luLmlubGluZUNhbGxGcmFtZS0+ZGlyZWN0Q2FsbGVyOworICAgIH0KKworICAgIFJFTEVB
U0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7Cit9CisKIH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpERkcK
IAogI2VuZGlmIC8vIEVOQUJMRShERkdfSklUKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L2RmZy9ERkdHcmFwaC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcv
REZHR3JhcGguaAkocmV2aXNpb24gMTkxOTMxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdHcmFwaC5oCSh3b3JraW5nIGNvcHkpCkBAIC04MjYsNiArODI2LDggQEAgcHVibGljOgog
ICAgIHZvaWQgZW5zdXJlUHJlUG9zdE51bWJlcmluZygpOwogICAgIHZvaWQgZW5zdXJlTmF0dXJh
bExvb3BzKCk7CiAKKyAgICBib29sIHdpbGxDYXRjaEV4Y2VwdGlvbkluTWFjaGluZUZyYW1lKENv
ZGVPcmlnaW4sIENvZGVPcmlnaW4mIG9wQ2F0Y2hPcmlnaW5PdXQsIEhhbmRsZXJJbmZvKiYgY2F0
Y2hIYW5kbGVyT3V0KTsKKwogICAgIFZNJiBtX3ZtOwogICAgIFBsYW4mIG1fcGxhbjsKICAgICBD
b2RlQmxvY2sqIG1fY29kZUJsb2NrOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdKSVRDb21waWxlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdKSVRDb21waWxlci5jcHAJKHJldmlzaW9uIDE5MTkzMSkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9kZmcvREZHSklUQ29tcGlsZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NjEsMjgg
KzU2MSw2IEBAIHZvaWQgSklUQ29tcGlsZXI6OmFwcGVuZEV4Y2VwdGlvbkhhbmRsaW4KICAgICBt
X2V4Y2VwdGlvbkhhbmRsZXJPU1JFeGl0Q2FsbFNpdGVzLmFwcGVuZChFeGNlcHRpb25IYW5kbGlu
Z09TUkV4aXRJbmZvIHsgZXhpdEluZm8sICpleGNlcHRpb25IYW5kbGVyLCBjYWxsU2l0ZSB9KTsK
IH0KIAotYm9vbCBKSVRDb21waWxlcjo6d2lsbENhdGNoRXhjZXB0aW9uSW5NYWNoaW5lRnJhbWUo
Q29kZU9yaWdpbiBjb2RlT3JpZ2luLCBDb2RlT3JpZ2luJiBvcENhdGNoT3JpZ2luT3V0LCBIYW5k
bGVySW5mbyomIGNhdGNoSGFuZGxlck91dCkKLXsKLSAgICB1bnNpZ25lZCBieXRlY29kZUluZGV4
VG9DaGVjayA9IGNvZGVPcmlnaW4uYnl0ZWNvZGVJbmRleDsKLSAgICB3aGlsZSAoMSkgewotICAg
ICAgICBJbmxpbmVDYWxsRnJhbWUqIGlubGluZUNhbGxGcmFtZSA9IGNvZGVPcmlnaW4uaW5saW5l
Q2FsbEZyYW1lOwotICAgICAgICBDb2RlQmxvY2sqIGNvZGVCbG9jayA9IG1fZ3JhcGguYmFzZWxp
bmVDb2RlQmxvY2tGb3IoaW5saW5lQ2FsbEZyYW1lKTsKLSAgICAgICAgaWYgKEhhbmRsZXJJbmZv
KiBoYW5kbGVyID0gY29kZUJsb2NrLT5oYW5kbGVyRm9yQnl0ZWNvZGVPZmZzZXQoYnl0ZWNvZGVJ
bmRleFRvQ2hlY2spKSB7Ci0gICAgICAgICAgICBvcENhdGNoT3JpZ2luT3V0ID0gQ29kZU9yaWdp
bihoYW5kbGVyLT50YXJnZXQsIGlubGluZUNhbGxGcmFtZSk7Ci0gICAgICAgICAgICBjYXRjaEhh
bmRsZXJPdXQgPSBoYW5kbGVyOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0K
LQotICAgICAgICBpZiAoIWlubGluZUNhbGxGcmFtZSkKLSAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgICAgICBieXRlY29kZUluZGV4VG9DaGVjayA9IGlubGluZUNhbGxGcmFtZS0+ZGly
ZWN0Q2FsbGVyLmJ5dGVjb2RlSW5kZXg7Ci0gICAgICAgIGNvZGVPcmlnaW4gPSBjb2RlT3JpZ2lu
LmlubGluZUNhbGxGcmFtZS0+ZGlyZWN0Q2FsbGVyOwotICAgIH0KLQotICAgIFJFTEVBU0VfQVNT
RVJUX05PVF9SRUFDSEVEKCk7Ci19Ci0KIHZvaWQgSklUQ29tcGlsZXI6OmV4Y2VwdGlvbkNoZWNr
KCkKIHsKICAgICAvLyBJdCdzIGltcG9ydGFudCB0aGF0IHdlIHVzZSBvcmlnaW4uZm9yRXhpdCBo
ZXJlLiBDb25zaWRlciBpZiB3ZSBob2lzdCBzdHJpbmcKQEAgLTYwNyw3ICs1ODUsNyBAQCB2b2lk
IEpJVENvbXBpbGVyOjpleGNlcHRpb25DaGVjaygpCiAgICAgLy8gfQogICAgIENvZGVPcmlnaW4g
b3BDYXRjaE9yaWdpbjsKICAgICBIYW5kbGVySW5mbyogZXhjZXB0aW9uSGFuZGxlcjsKLSAgICBi
b29sIHdpbGxDYXRjaEV4Y2VwdGlvbiA9IHdpbGxDYXRjaEV4Y2VwdGlvbkluTWFjaGluZUZyYW1l
KG1fc3BlY3VsYXRpdmUtPm1fY3VycmVudE5vZGUtPm9yaWdpbi5mb3JFeGl0LCBvcENhdGNoT3Jp
Z2luLCBleGNlcHRpb25IYW5kbGVyKTsgCisgICAgYm9vbCB3aWxsQ2F0Y2hFeGNlcHRpb24gPSBt
X2dyYXBoLndpbGxDYXRjaEV4Y2VwdGlvbkluTWFjaGluZUZyYW1lKG1fc3BlY3VsYXRpdmUtPm1f
Y3VycmVudE5vZGUtPm9yaWdpbi5mb3JFeGl0LCBvcENhdGNoT3JpZ2luLCBleGNlcHRpb25IYW5k
bGVyKTsgCiAgICAgaWYgKHdpbGxDYXRjaEV4Y2VwdGlvbikgewogICAgICAgICB1bnNpZ25lZCBz
dHJlYW1JbmRleCA9IG1fc3BlY3VsYXRpdmUtPm1fb3V0T2ZMaW5lU3RyZWFtSW5kZXggIT0gVUlO
VF9NQVggPyBtX3NwZWN1bGF0aXZlLT5tX291dE9mTGluZVN0cmVhbUluZGV4IDogbV9zcGVjdWxh
dGl2ZS0+bV9zdHJlYW0tPnNpemUoKTsKICAgICAgICAgTWFjcm9Bc3NlbWJsZXI6Okp1bXAgaGFk
RXhjZXB0aW9uID0gZW1pdE5vblBhdGNoYWJsZUV4Y2VwdGlvbkNoZWNrKCk7CkBAIC02MjEsNyAr
NTk5LDcgQEAgQ2FsbFNpdGVJbmRleCBKSVRDb21waWxlcjo6cmVjb3JkQ2FsbFNpdAogewogICAg
IENvZGVPcmlnaW4gb3BDYXRjaE9yaWdpbjsKICAgICBIYW5kbGVySW5mbyogZXhjZXB0aW9uSGFu
ZGxlcjsKLSAgICBib29sIHdpbGxDYXRjaEV4Y2VwdGlvbiA9IHdpbGxDYXRjaEV4Y2VwdGlvbklu
TWFjaGluZUZyYW1lKGNhbGxTaXRlQ29kZU9yaWdpbiwgb3BDYXRjaE9yaWdpbiwgZXhjZXB0aW9u
SGFuZGxlcik7CisgICAgYm9vbCB3aWxsQ2F0Y2hFeGNlcHRpb24gPSBtX2dyYXBoLndpbGxDYXRj
aEV4Y2VwdGlvbkluTWFjaGluZUZyYW1lKGNhbGxTaXRlQ29kZU9yaWdpbiwgb3BDYXRjaE9yaWdp
biwgZXhjZXB0aW9uSGFuZGxlcik7CiAgICAgQ2FsbFNpdGVJbmRleCBjYWxsU2l0ZSA9IGFkZENh
bGxTaXRlKGNhbGxTaXRlQ29kZU9yaWdpbik7CiAgICAgaWYgKHdpbGxDYXRjaEV4Y2VwdGlvbikK
ICAgICAgICAgYXBwZW5kRXhjZXB0aW9uSGFuZGxpbmdPU1JFeGl0KGV2ZW50U3RyZWFtSW5kZXgs
IG9wQ2F0Y2hPcmlnaW4sIGV4Y2VwdGlvbkhhbmRsZXIsIGNhbGxTaXRlKTsKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSklUQ29tcGlsZXIuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0pJVENvbXBpbGVyLmgJKHJldmlzaW9uIDE5MTkzMSkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHSklUQ29tcGlsZXIuaAkod29ya2luZyBj
b3B5KQpAQCAtMjc5LDcgKzI3OSw2IEBAIHByaXZhdGU6CiAgICAgdm9pZCBsaW5rT1NSRXhpdHMo
KTsKICAgICB2b2lkIGRpc2Fzc2VtYmxlKExpbmtCdWZmZXImKTsKIAotICAgIGJvb2wgd2lsbENh
dGNoRXhjZXB0aW9uSW5NYWNoaW5lRnJhbWUoQ29kZU9yaWdpbiwgQ29kZU9yaWdpbiYgb3BDYXRj
aE9yaWdpbk91dCwgSGFuZGxlckluZm8qJiBjYXRjaEhhbmRsZXJPdXQpOwogICAgIHZvaWQgYXBw
ZW5kRXhjZXB0aW9uSGFuZGxpbmdPU1JFeGl0KHVuc2lnbmVkIGV2ZW50U3RyZWFtSW5kZXgsIENv
ZGVPcmlnaW4sIEhhbmRsZXJJbmZvKiBleGNlcHRpb25IYW5kbGVyLCBDYWxsU2l0ZUluZGV4LCBN
YWNyb0Fzc2VtYmxlcjo6SnVtcExpc3QganVtcHNUb0ZhaWwgPSBNYWNyb0Fzc2VtYmxlcjo6SnVt
cExpc3QoKSk7CiAKICAgICAvLyBUaGUgZGF0YWZsb3cgZ3JhcGggY3VycmVudGx5IGJlaW5nIGdl
bmVyYXRlZC4KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHTm9kZU9yaWdpbi5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHTm9kZU9yaWdpbi5o
CShyZXZpc2lvbiAxOTE5MzEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR05vZGVP
cmlnaW4uaAkod29ya2luZyBjb3B5KQpAQCAtNjMsNiArNjMsMTggQEAgc3RydWN0IE5vZGVPcmln
aW4gewogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAorICAgIE5vZGVPcmlnaW4gd2l0
aEZvckV4aXRBbmRFeGl0T0soQ29kZU9yaWdpbiBmb3JFeGl0LCBib29sIGV4aXRPSykgY29uc3QK
KyAgICB7CisgICAgICAgIGlmICghaXNTZXQoKSkKKyAgICAgICAgICAgIHJldHVybiBOb2RlT3Jp
Z2luKCk7CisgICAgICAgIAorICAgICAgICBOb2RlT3JpZ2luIHJlc3VsdCA9ICp0aGlzOworICAg
ICAgICBpZiAoZm9yRXhpdC5pc1NldCgpKQorICAgICAgICAgICAgcmVzdWx0LmZvckV4aXQgPSBm
b3JFeGl0OworICAgICAgICByZXN1bHQuZXhpdE9LID0gZXhpdE9LOworICAgICAgICByZXR1cm4g
cmVzdWx0OworICAgIH0KKwogICAgIE5vZGVPcmlnaW4gd2l0aEV4aXRPSyhib29sIHZhbHVlKSBj
b25zdAogICAgIHsKICAgICAgICAgTm9kZU9yaWdpbiByZXN1bHQgPSAqdGhpczsKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHT1NSRXhpdC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdPU1JFeGl0LmNwcAkocmV2aXNpb24gMTkxOTMxKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdPU1JFeGl0LmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNDMsOSArNDMsNyBAQCBPU1JFeGl0OjpPU1JFeGl0KEV4aXRLaW5kIGtpbmQsIEpTVmFs
dWVTCiAgICAgLCBtX3BhdGNoYWJsZUNvZGVPZmZzZXQoMCkKICAgICAsIG1fcmVjb3ZlcnlJbmRl
eChyZWNvdmVyeUluZGV4KQogICAgICwgbV9zdHJlYW1JbmRleChzdHJlYW1JbmRleCkKLSAgICAs
IG1fZXhjZXB0aW9uSGFuZGxlckNhbGxTaXRlSW5kZXgoc3RkOjpudW1lcmljX2xpbWl0czx1bnNp
Z25lZD46Om1heCgpKQogICAgICwgbV93aWxsQXJyaXZlQXRPU1JFeGl0RnJvbUdlbmVyaWNVbndp
bmQoZmFsc2UpCi0gICAgLCBtX2lzRXhjZXB0aW9uSGFuZGxlcihmYWxzZSkKIHsKICAgICBib29s
IGNhbkV4aXQgPSBqaXQtPm1fb3JpZ2luLmV4aXRPSzsKICAgICBpZiAoIWNhbkV4aXQgJiYgaml0
LT5tX2N1cnJlbnROb2RlKSB7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR09T
UkV4aXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR09TUkV4
aXQuaAkocmV2aXNpb24gMTkxOTMxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdP
U1JFeGl0LmgJKHdvcmtpbmcgY29weSkKQEAgLTEwMCwxMSArMTAwLDcgQEAgc3RydWN0IE9TUkV4
aXQgOiBwdWJsaWMgT1NSRXhpdEJhc2UgewogICAgIHZvaWQgY29ycmVjdEp1bXAoTGlua0J1ZmZl
ciYpOwogCiAgICAgdW5zaWduZWQgbV9zdHJlYW1JbmRleDsKLSAgICBDYWxsU2l0ZUluZGV4IG1f
ZXhjZXB0aW9uSGFuZGxlckNhbGxTaXRlSW5kZXg7Ci0KICAgICBib29sIG1fd2lsbEFycml2ZUF0
T1NSRXhpdEZyb21HZW5lcmljVW53aW5kIDogMTsKLSAgICBib29sIG1faXNFeGNlcHRpb25IYW5k
bGVyIDogMTsKLSAgICAKICAgICB2b2lkIGNvbnNpZGVyQWRkaW5nQXNGcmVxdWVudEV4aXRTaXRl
KENvZGVCbG9jayogcHJvZmlsZWRDb2RlQmxvY2spCiAgICAgewogICAgICAgICBPU1JFeGl0QmFz
ZTo6Y29uc2lkZXJBZGRpbmdBc0ZyZXF1ZW50RXhpdFNpdGUocHJvZmlsZWRDb2RlQmxvY2ssIEV4
aXRGcm9tREZHKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHT1NSRXhpdEJh
c2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR09TUkV4aXRC
YXNlLmgJKHJldmlzaW9uIDE5MTkzMSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZH
T1NSRXhpdEJhc2UuaAkod29ya2luZyBjb3B5KQpAQCAtNDUsNiArNDUsOCBAQCBzdHJ1Y3QgT1NS
RXhpdEJhc2UgewogICAgICAgICAsIG1fY291bnQoMCkKICAgICAgICAgLCBtX2NvZGVPcmlnaW4o
b3JpZ2luKQogICAgICAgICAsIG1fY29kZU9yaWdpbkZvckV4aXRQcm9maWxlKG9yaWdpbkZvclBy
b2ZpbGUpCisgICAgICAgICwgbV9leGNlcHRpb25IYW5kbGVyQ2FsbFNpdGVJbmRleChzdGQ6Om51
bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCkpCisgICAgICAgICwgbV9pc0V4Y2VwdGlvbkhh
bmRsZXIoZmFsc2UpCiAgICAgewogICAgICAgICBBU1NFUlQobV9jb2RlT3JpZ2luLmlzU2V0KCkp
OwogICAgICAgICBBU1NFUlQobV9jb2RlT3JpZ2luRm9yRXhpdFByb2ZpbGUuaXNTZXQoKSk7CkBA
IC01NSw2ICs1Nyw5IEBAIHN0cnVjdCBPU1JFeGl0QmFzZSB7CiAgICAgCiAgICAgQ29kZU9yaWdp
biBtX2NvZGVPcmlnaW47CiAgICAgQ29kZU9yaWdpbiBtX2NvZGVPcmlnaW5Gb3JFeGl0UHJvZmls
ZTsKKyAgICBDYWxsU2l0ZUluZGV4IG1fZXhjZXB0aW9uSGFuZGxlckNhbGxTaXRlSW5kZXg7CisK
KyAgICBib29sIG1faXNFeGNlcHRpb25IYW5kbGVyIDogMTsKIAogcHJvdGVjdGVkOgogICAgIHZv
aWQgY29uc2lkZXJBZGRpbmdBc0ZyZXF1ZW50RXhpdFNpdGUoQ29kZUJsb2NrKiBwcm9maWxlZENv
ZGVCbG9jaywgRXhpdGluZ0pJVFR5cGUgaml0VHlwZSkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9kZmcvREZHT1NSRXhpdENvbXBpbGVyQ29tbW9uLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR09TUkV4aXRDb21waWxlckNvbW1vbi5jcHAJKHJldmlz
aW9uIDE5MTkzMSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHT1NSRXhpdENvbXBp
bGVyQ29tbW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQ2LDEwICsyNDYsMTAgQEAgdm9pZCBy
ZWlmeUlubGluZWRDYWxsRnJhbWVzKENDYWxsSGVscGVycwogICAgIC8vIERvbid0IG5lZWQgdG8g
c2V0IHRoZSB0b3BsZXZlbCBjb2RlIG9yaWdpbiBpZiB3ZSBvbmx5IGRpZCBpbmxpbmUgdGFpbCBj
YWxscwogICAgIGlmIChjb2RlT3JpZ2luKSB7CiAjaWYgVVNFKEpTVkFMVUU2NCkKLSAgICB1aW50
MzJfdCBsb2NhdGlvbkJpdHMgPSBDYWxsU2l0ZUluZGV4KGNvZGVPcmlnaW4tPmJ5dGVjb2RlSW5k
ZXgpLmJpdHMoKTsKKyAgICAgICAgdWludDMyX3QgbG9jYXRpb25CaXRzID0gQ2FsbFNpdGVJbmRl
eChjb2RlT3JpZ2luLT5ieXRlY29kZUluZGV4KS5iaXRzKCk7CiAjZWxzZQotICAgIEluc3RydWN0
aW9uKiBpbnN0cnVjdGlvbiA9IGppdC5iYXNlbGluZUNvZGVCbG9jaygpLT5pbnN0cnVjdGlvbnMo
KS5iZWdpbigpICsgY29kZU9yaWdpbi0+Ynl0ZWNvZGVJbmRleDsKLSAgICB1aW50MzJfdCBsb2Nh
dGlvbkJpdHMgPSBDYWxsU2l0ZUluZGV4KGluc3RydWN0aW9uKS5iaXRzKCk7CisgICAgICAgIElu
c3RydWN0aW9uKiBpbnN0cnVjdGlvbiA9IGppdC5iYXNlbGluZUNvZGVCbG9jaygpLT5pbnN0cnVj
dGlvbnMoKS5iZWdpbigpICsgY29kZU9yaWdpbi0+Ynl0ZWNvZGVJbmRleDsKKyAgICAgICAgdWlu
dDMyX3QgbG9jYXRpb25CaXRzID0gQ2FsbFNpdGVJbmRleChpbnN0cnVjdGlvbikuYml0cygpOwog
I2VuZGlmCiAgICAgICAgIGppdC5zdG9yZTMyKEFzc2VtYmx5SGVscGVyczo6VHJ1c3RlZEltbTMy
KGxvY2F0aW9uQml0cyksIEFzc2VtYmx5SGVscGVyczo6dGFnRm9yKChWaXJ0dWFsUmVnaXN0ZXIp
KEpTU3RhY2s6OkFyZ3VtZW50Q291bnQpKSk7CiAgICAgfQpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdUaWVyVXBDaGVja0luamVjdGlvblBoYXNlLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1RpZXJVcENoZWNrSW5qZWN0aW9uUGhhc2Uu
Y3BwCShyZXZpc2lvbiAxOTE5MzEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1Rp
ZXJVcENoZWNrSW5qZWN0aW9uUGhhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NCw5ICs1NCw2
IEBAIHB1YmxpYzoKICAgICAgICAgaWYgKG1fZ3JhcGgubV9wcm9maWxlZEJsb2NrLT5tX2RpZEZh
aWxGVExDb21waWxhdGlvbikKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgICAgICBp
ZiAobV9ncmFwaC5tX2hhc0V4Y2VwdGlvbkhhbmRsZXJzKQotICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgICAgICAKICNpZiBFTkFCTEUoRlRMX0pJVCkKICAgICAgICAgRlRMOjpDYXBhYmls
aXR5TGV2ZWwgbGV2ZWwgPSBGVEw6OmNhbkNvbXBpbGUobV9ncmFwaCk7CiAgICAgICAgIGlmIChs
ZXZlbCA9PSBGVEw6OkNhbm5vdENvbXBpbGUpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZnRsL0ZUTENvbXBpbGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9m
dGwvRlRMQ29tcGlsZS5jcHAJKHJldmlzaW9uIDE5MTkzMSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9mdGwvRlRMQ29tcGlsZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ2Niw3ICs0NjYsNyBA
QCBzdGF0aWMgUmVnaXN0ZXJTZXQgdXNlZFJlZ2lzdGVyc0Zvcihjb25zCiB9CiAKIHRlbXBsYXRl
PHR5cGVuYW1lIENhbGxUeXBlPgotdm9pZCBhZGp1c3RDYWxsSUNzRm9yU3RhY2ttYXBzKFZlY3Rv
cjxDYWxsVHlwZT4mIGNhbGxzLCBTdGFja01hcHM6OlJlY29yZE1hcCYgcmVjb3JkTWFwKQordm9p
ZCBhZGp1c3RDYWxsSUNzRm9yU3RhY2ttYXBzKFZlY3RvcjxDYWxsVHlwZT4mIGNhbGxzLCBTdGFj
a01hcHM6OlJlY29yZE1hcCYgcmVjb3JkTWFwLCBzdGQ6OmZ1bmN0aW9uPENhbGxTaXRlSW5kZXgg
KHVpbnQzMl90IHJlY29yZEluZGV4LCBDb2RlT3JpZ2luIG9yaWdpbik+IGdlbmVyYXRlQ2FsbFNp
dGVJbmRleEZ1bmN0aW9uLCBzdGQ6OmZ1bmN0aW9uPE9TUkV4aXQqICh1aW50MzJfdCByZWNvcmRJ
bmRleCk+IGdldENvcnJlc3BvbmRpbmdPU1JFeGl0KQogewogICAgIC8vIEhhbmRsaW5nIEpTIGNh
bGxzIGlzIHdlaXJkOiB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHdlIHNvcnQgdGhlbSBieSB0aGUg
UEMgaW4gTExWTQogICAgIC8vIGdlbmVyYXRlZCBjb2RlLiBUaGF0IGltcGxpZXMgZmlyc3QgcHJ1
bmluZyB0aGUgb25lcyB0aGF0IExMVk0gZGlkbid0IGdlbmVyYXRlLgpAQCAtNDg0LDYgKzQ4NCw5
IEBAIHZvaWQgYWRqdXN0Q2FsbElDc0ZvclN0YWNrbWFwcyhWZWN0b3I8Q2EKICAgICAgICAgZm9y
ICh1bnNpZ25lZCBqID0gMDsgaiA8IGl0ZXItPnZhbHVlLnNpemUoKTsgKytqKSB7CiAgICAgICAg
ICAgICBDYWxsVHlwZSBjb3B5ID0gY2FsbDsKICAgICAgICAgICAgIGNvcHkubV9pbnN0cnVjdGlv
bk9mZnNldCA9IGl0ZXItPnZhbHVlW2pdLnJlY29yZC5pbnN0cnVjdGlvbk9mZnNldDsKKyAgICAg
ICAgICAgIGNvcHkuc2V0Q2FsbFNpdGVJbmRleChnZW5lcmF0ZUNhbGxTaXRlSW5kZXhGdW5jdGlv
bihpdGVyLT52YWx1ZVtqXS5pbmRleCwgY29weS5jYWxsU2l0ZURlc2NyaXB0aW9uT3JpZ2luKCkp
KTsKKyAgICAgICAgICAgIGNvcHkuc2V0Q29ycmVzcG9uZGluZ0dlbmVyaWNVbndpbmRPU1JFeGl0
KGdldENvcnJlc3BvbmRpbmdPU1JFeGl0KGl0ZXItPnZhbHVlW2pdLmluZGV4KSk7CisKICAgICAg
ICAgICAgIGNhbGxzLmFwcGVuZChjb3B5KTsKICAgICAgICAgfQogICAgIH0KQEAgLTQ5OCw5ICs1
MDEsMzQgQEAgc3RhdGljIHZvaWQgZml4RnVuY3Rpb25CYXNlZE9uU3RhY2tNYXBzKAogICAgIEdy
YXBoJiBncmFwaCA9IHN0YXRlLmdyYXBoOwogICAgIFZNJiB2bSA9IGdyYXBoLm1fdm07CiAgICAg
U3RhY2tNYXBzJiBzdGFja21hcHMgPSBqaXRDb2RlLT5zdGFja21hcHM7CisKKyAgICAvLyBXZSBm
aWxsIHRoaXMgd2hlbiBnZW5lcmF0aW5nIE9TUiBleGl0cyB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQg
dmlhIGdlbmVyaWNVbndpbmQoKQorICAgIC8vIG9yIGxhenkgc2xvdyBwYXRoIGV4Y2VwdGlvbiBj
aGVja3MuCisgICAgLy8gVGhhdCB3YXksIHdoZW4gd2UgYXNzaWduIGEgQ2FsbFNpdGVJbmRleCB0
byB0aGUgQ2FsbC9HZXRCeUlkL1B1dEJ5SWQvTGF6eVNsb3dQYXRoLCB3ZSBhc3NpZ24KKyAgICAv
LyBpdCB0aGUgcHJvcGVyIENhbGxTaXRlSW5kZXggdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgT1NS
RXhpdCBleGNlcHRpb24gaGFuZGxlci4KKyAgICBIYXNoTWFwPHVpbnQzMl90LCBzaXplX3QsIFdU
Rjo6SW50SGFzaDx1aW50MzJfdD4sIFdURjo6VW5zaWduZWRXaXRoWmVyb0tleUhhc2hUcmFpdHM8
dWludDMyX3Q+PiByZWNvcmRJbmRleFRvR2VuZXJpY1Vud2luZE9yTGF6eVNsb3dQYXRoT1NSRXhp
dDsKKyAgICBhdXRvIGdlbmVyYXRlT3JHZXRBbHJlYWR5R2VuZXJhdGVkQ2FsbFNpdGVJbmRleCA9
IFsmXSAodWludDMyX3QgcmVjb3JkSW5kZXgsIENvZGVPcmlnaW4gb3JpZ2luKSAtPiBDYWxsU2l0
ZUluZGV4IHsKKyAgICAgICAgYXV0byBmaW5kUmVzdWx0ID0gcmVjb3JkSW5kZXhUb0dlbmVyaWNV
bndpbmRPckxhenlTbG93UGF0aE9TUkV4aXQuZmluZChyZWNvcmRJbmRleCk7CisgICAgICAgIGlm
IChmaW5kUmVzdWx0ID09IHJlY29yZEluZGV4VG9HZW5lcmljVW53aW5kT3JMYXp5U2xvd1BhdGhP
U1JFeGl0LmVuZCgpKQorICAgICAgICAgICAgcmV0dXJuIHN0YXRlLmppdENvZGUtPmNvbW1vbi5h
ZGRVbmlxdWVDYWxsU2l0ZUluZGV4KG9yaWdpbik7CisgICAgICAgIHNpemVfdCBvc3JFeGl0SW5k
ZXggPSBmaW5kUmVzdWx0LT52YWx1ZTsKKyAgICAgICAgcmV0dXJuIHN0YXRlLmppdENvZGUtPm9z
ckV4aXRbb3NyRXhpdEluZGV4XS5tX2V4Y2VwdGlvbkhhbmRsZXJDYWxsU2l0ZUluZGV4OworICAg
IH07CisgICAgYXV0byBqc0NhbGxPU1JFeGl0Rm9yUmVjb3JkSW5kZXggPSBbJl0gKHVpbnQzMl90
IHJlY29yZEluZGV4KSAtPiBPU1JFeGl0KiB7CisgICAgICAgIGF1dG8gZmluZFJlc3VsdCA9IHJl
Y29yZEluZGV4VG9HZW5lcmljVW53aW5kT3JMYXp5U2xvd1BhdGhPU1JFeGl0LmZpbmQocmVjb3Jk
SW5kZXgpOworICAgICAgICBpZiAoZmluZFJlc3VsdCA9PSByZWNvcmRJbmRleFRvR2VuZXJpY1Vu
d2luZE9yTGF6eVNsb3dQYXRoT1NSRXhpdC5lbmQoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxs
cHRyOworCisgICAgICAgIHNpemVfdCBvc3JFeGl0SW5kZXggPSBmaW5kUmVzdWx0LT52YWx1ZTsK
KyAgICAgICAgT1NSRXhpdCYgZXhpdCA9IHN0YXRlLmppdENvZGUtPm9zckV4aXRbb3NyRXhpdElu
ZGV4XTsKKyAgICAgICAgaWYgKCFleGl0Lm1fZGVzY3JpcHRvci5tX2lzRXhjZXB0aW9uRnJvbUpT
Q2FsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICByZXR1cm4gJmV4aXQ7
CisgICAgfTsKICAgICAKICAgICBpbnQgbG9jYWxzT2Zmc2V0ID0gb2Zmc2V0T2ZTdGFja1JlZ2lv
bihyZWNvcmRNYXAsIHN0YXRlLmNhcHR1cmVkU3RhY2ttYXBJRCkgKyBncmFwaC5tX25leHRNYWNo
aW5lTG9jYWw7CiAgICAgaW50IHZhcmFyZ3NTcGlsbFNsb3RzT2Zmc2V0ID0gb2Zmc2V0T2ZTdGFj
a1JlZ2lvbihyZWNvcmRNYXAsIHN0YXRlLnZhcmFyZ3NTcGlsbFNsb3RzU3RhY2ttYXBJRCk7Cisg
ICAgaW50IGpzQ2FsbFRoYXRNaWdodFRocm93U3BpbGxPZmZzZXQgPSBvZmZzZXRPZlN0YWNrUmVn
aW9uKHJlY29yZE1hcCwgc3RhdGUuZXhjZXB0aW9uSGFuZGxpbmdTcGlsbFNsb3RTdGFja21hcElE
KTsKICAgICAKICAgICBmb3IgKHVuc2lnbmVkIGkgPSBncmFwaC5tX2lubGluZVZhcmlhYmxlRGF0
YS5zaXplKCk7IGktLTspIHsKICAgICAgICAgSW5saW5lQ2FsbEZyYW1lKiBpbmxpbmVDYWxsRnJh
bWUgPSBncmFwaC5tX2lubGluZVZhcmlhYmxlRGF0YVtpXS5pbmxpbmVDYWxsRnJhbWU7CkBAIC01
NjksMTQgKzU5NywzNSBAQCBzdGF0aWMgdm9pZCBmaXhGdW5jdGlvbkJhc2VkT25TdGFja01hcHMo
CiAgICAgICAgICAgICBtYXRlcmlhbGl6YXRpb24tPmFjY291bnRGb3JMb2NhbHNPZmZzZXQobG9j
YWxzT2Zmc2V0KTsKIAogICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgaXRlci0+dmFs
dWUuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHN0YWNrbWFwUmVjb3JkSW5k
ZXggPSBpdGVyLT52YWx1ZVtqXS5pbmRleDsKLSAgICAgICAgICAgIE9TUkV4aXQgZXhpdChleGl0
RGVzY3JpcHRvciwgc3RhY2ttYXBSZWNvcmRJbmRleCk7Ci0gICAgICAgICAgICBzdGF0ZS5qaXRD
b2RlLT5vc3JFeGl0LmFwcGVuZChleGl0KTsKLSAgICAgICAgICAgIHN0YXRlLmZpbmFsaXplci0+
b3NyRXhpdC5hcHBlbmQoT1NSRXhpdENvbXBpbGF0aW9uSW5mbygpKTsKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgICAgICB1aW50MzJfdCBzdGFja21hcFJlY29yZEluZGV4ID0gaXRlci0+dmFs
dWVbal0uaW5kZXg7CisgICAgICAgICAgICAgICAgT1NSRXhpdCBleGl0KGV4aXREZXNjcmlwdG9y
LCBzdGFja21hcFJlY29yZEluZGV4KTsKKyAgICAgICAgICAgICAgICBzdGF0ZS5qaXRDb2RlLT5v
c3JFeGl0LmFwcGVuZChleGl0KTsKKyAgICAgICAgICAgICAgICBzdGF0ZS5maW5hbGl6ZXItPm9z
ckV4aXQuYXBwZW5kKE9TUkV4aXRDb21waWxhdGlvbkluZm8oKSk7CisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIE9TUkV4aXQmIGV4aXQgPSBzdGF0ZS5qaXRDb2RlLT5vc3JFeGl0Lmxhc3Qo
KTsKKyAgICAgICAgICAgIGlmIChleGl0RGVzY3JpcHRvci5tX3dpbGxBcnJpdmVBdE9TUkV4aXRG
cm9tR2VuZXJpY1Vud2luZCB8fCBleGl0RGVzY3JpcHRvci5tX2lzRXhjZXB0aW9uRnJvbUxhenlT
bG93UGF0aCkgeworICAgICAgICAgICAgICAgIFN0YWNrTWFwczo6UmVjb3JkJiByZWNvcmQgPSBp
dGVyLT52YWx1ZVtqXS5yZWNvcmQ7CisgICAgICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQoZXhp
dC5tX2Rlc2NyaXB0b3IubV9zZW1hbnRpY0NvZGVPcmlnaW5Gb3JDYWxsRnJhbWVIZWFkZXIuaXNT
ZXQoKSk7CisgICAgICAgICAgICAgICAgQ2FsbFNpdGVJbmRleCBjYWxsU2l0ZUluZGV4ID0gc3Rh
dGUuaml0Q29kZS0+Y29tbW9uLmFkZFVuaXF1ZUNhbGxTaXRlSW5kZXgoZXhpdC5tX2Rlc2NyaXB0
b3IubV9zZW1hbnRpY0NvZGVPcmlnaW5Gb3JDYWxsRnJhbWVIZWFkZXIpOworICAgICAgICAgICAg
ICAgIGV4aXQubV9leGNlcHRpb25IYW5kbGVyQ2FsbFNpdGVJbmRleCA9IGNhbGxTaXRlSW5kZXg7
CisgICAgICAgICAgICAgICAgcmVjb3JkSW5kZXhUb0dlbmVyaWNVbndpbmRPckxhenlTbG93UGF0
aE9TUkV4aXQuYWRkKGl0ZXItPnZhbHVlW2pdLmluZGV4LCBzdGF0ZS5qaXRDb2RlLT5vc3JFeGl0
LnNpemUoKSAtIDEpOworCisgICAgICAgICAgICAgICAgaWYgKGV4aXREZXNjcmlwdG9yLm1faXNF
eGNlcHRpb25Gcm9tSlNDYWxsKQorICAgICAgICAgICAgICAgICAgICBleGl0LmdhdGhlclJlZ2lz
dGVyc1RvU3BpbGxGb3JDYWxsSWZFeGNlcHRpb24oc3RhY2ttYXBzLCByZWNvcmQpOworICAgICAg
ICAgICAgICAgIGlmIChleGl0RGVzY3JpcHRvci5tX2lzRXhjZXB0aW9uRnJvbUdldEJ5SWQpIHsK
KyAgICAgICAgICAgICAgICAgICAgR1BSUmVnIHJlc3VsdCA9IHJlY29yZC5sb2NhdGlvbnNbMF0u
ZGlyZWN0R1BSKCk7CisgICAgICAgICAgICAgICAgICAgIEdQUlJlZyBiYXNlID0gcmVjb3JkLmxv
Y2F0aW9uc1sxXS5kaXJlY3RHUFIoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBoYXMg
YW4gaW50ZXJlc3Rpbmcgc3RvcnksIHNlZSBjb21tZW50IGJlbG93IGRlc2NyaWJpbmcgaXQuCisg
ICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gYmFzZSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGV4aXQucmVnaXN0ZXJzVG9QcmVzZXJ2ZUZvckNhbGxUaGF0TWlnaHRUaHJvdy5zZXQo
YmFzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAg
fQogICAgIEV4aXRUaHVua0dlbmVyYXRvciBleGl0VGh1bmtHZW5lcmF0b3Ioc3RhdGUpOwotICAg
IGV4aXRUaHVua0dlbmVyYXRvci5lbWl0VGh1bmtzKCk7CisgICAgZXhpdFRodW5rR2VuZXJhdG9y
LmVtaXRUaHVua3MoanNDYWxsVGhhdE1pZ2h0VGhyb3dTcGlsbE9mZnNldCk7CiAgICAgaWYgKGV4
aXRUaHVua0dlbmVyYXRvci5kaWRUaGluZ3MoKSkgewogICAgICAgICBSRUxFQVNFX0FTU0VSVChz
dGF0ZS5maW5hbGl6ZXItPm9zckV4aXQuc2l6ZSgpKTsKICAgICAgICAgCkBAIC01ODksMTYgKzYz
OCwyNiBAQCBzdGF0aWMgdm9pZCBmaXhGdW5jdGlvbkJhc2VkT25TdGFja01hcHMoCiAgICAgICAg
IAogICAgICAgICBSRUxFQVNFX0FTU0VSVChzdGF0ZS5maW5hbGl6ZXItPm9zckV4aXQuc2l6ZSgp
ID09IHN0YXRlLmppdENvZGUtPm9zckV4aXQuc2l6ZSgpKTsKICAgICAgICAgCisgICAgICAgIGNv
ZGVCbG9jay0+Y2xlYXJFeGNlcHRpb25IYW5kbGVycygpOworCiAgICAgICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBzdGF0ZS5qaXRDb2RlLT5vc3JFeGl0LnNpemUoKTsgKytpKSB7CiAgICAg
ICAgICAgICBPU1JFeGl0Q29tcGlsYXRpb25JbmZvJiBpbmZvID0gc3RhdGUuZmluYWxpemVyLT5v
c3JFeGl0W2ldOwotICAgICAgICAgICAgT1NSRXhpdCYgZXhpdCA9IGppdENvZGUtPm9zckV4aXRb
aV07CisgICAgICAgICAgICBPU1JFeGl0JiBleGl0ID0gc3RhdGUuaml0Q29kZS0+b3NyRXhpdFtp
XTsKICAgICAgICAgICAgIAogICAgICAgICAgICAgaWYgKHZlcmJvc2VDb21waWxhdGlvbkVuYWJs
ZWQoKSkKICAgICAgICAgICAgICAgICBkYXRhTG9nKCJIYW5kbGluZyBPU1Igc3RhY2ttYXAgIyIs
IGV4aXQubV9kZXNjcmlwdG9yLm1fc3RhY2ttYXBJRCwgIiBmb3IgIiwgZXhpdC5tX2NvZGVPcmln
aW4sICJcbiIpOwogCiAgICAgICAgICAgICBpbmZvLm1fdGh1bmtBZGRyZXNzID0gbGlua0J1ZmZl
ci0+bG9jYXRpb25PZihpbmZvLm1fdGh1bmtMYWJlbCk7CiAgICAgICAgICAgICBleGl0Lm1fcGF0
Y2hhYmxlQ29kZU9mZnNldCA9IGxpbmtCdWZmZXItPm9mZnNldE9mKGluZm8ubV90aHVua0p1bXAp
OwotICAgICAgICAgICAgCisKKyAgICAgICAgICAgIGlmIChleGl0Lm1fZGVzY3JpcHRvci5tX3dp
bGxBcnJpdmVBdE9TUkV4aXRGcm9tR2VuZXJpY1Vud2luZCkgeworICAgICAgICAgICAgICAgIEhh
bmRsZXJJbmZvIG5ld0hhbmRsZXIgPSBleGl0Lm1fZGVzY3JpcHRvci5tX2Jhc2VsaW5lRXhjZXB0
aW9uSGFuZGxlcjsKKyAgICAgICAgICAgICAgICBuZXdIYW5kbGVyLnN0YXJ0ID0gZXhpdC5tX2V4
Y2VwdGlvbkhhbmRsZXJDYWxsU2l0ZUluZGV4LmJpdHMoKTsKKyAgICAgICAgICAgICAgICBuZXdI
YW5kbGVyLmVuZCA9IGV4aXQubV9leGNlcHRpb25IYW5kbGVyQ2FsbFNpdGVJbmRleC5iaXRzKCkg
KyAxOworICAgICAgICAgICAgICAgIG5ld0hhbmRsZXIubmF0aXZlQ29kZSA9IGluZm8ubV90aHVu
a0FkZHJlc3M7CisgICAgICAgICAgICAgICAgY29kZUJsb2NrLT5hcHBlbmRFeGNlcHRpb25IYW5k
bGVyKG5ld0hhbmRsZXIpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAodmVyYm9z
ZUNvbXBpbGF0aW9uRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICAgICAgRHVtcENvbnRleHQgY29u
dGV4dDsKICAgICAgICAgICAgICAgICBkYXRhTG9nKCIgICAgRXhpdCB2YWx1ZXM6ICIsIGluQ29u
dGV4dChleGl0Lm1fZGVzY3JpcHRvci5tX3ZhbHVlcywgJmNvbnRleHQpLCAiXG4iKTsKQEAgLTYy
MSw2ICs2ODAsMjEgQEAgc3RhdGljIHZvaWQgZml4RnVuY3Rpb25CYXNlZE9uU3RhY2tNYXBzKAog
ICAgICAgICBDQ2FsbEhlbHBlcnMgc2xvd1BhdGhKSVQoJnZtLCBjb2RlQmxvY2spOwogICAgICAg
ICAKICAgICAgICAgQ0NhbGxIZWxwZXJzOjpKdW1wTGlzdCBleGNlcHRpb25UYXJnZXQ7CisKKyAg
ICAgICAgVmVjdG9yPHN0ZDo6cGFpcjxDQ2FsbEhlbHBlcnM6Okp1bXBMaXN0LCBDb2RlTG9jYXRp
b25MYWJlbD4+IGV4Y2VwdGlvbkp1bXBzVG9MaW5rOworICAgICAgICBhdXRvIGFkZE5ld0V4Y2Vw
dGlvbkp1bXBJZk5lY2Vzc2FyeSA9IFsmXSAodWludDMyX3QgcmVjb3JkSW5kZXgpIHsKKyAgICAg
ICAgICAgIGF1dG8gZmluZFJlc3VsdCA9IHJlY29yZEluZGV4VG9HZW5lcmljVW53aW5kT3JMYXp5
U2xvd1BhdGhPU1JFeGl0LmZpbmQocmVjb3JkSW5kZXgpOworICAgICAgICAgICAgaWYgKGZpbmRS
ZXN1bHQgPT0gcmVjb3JkSW5kZXhUb0dlbmVyaWNVbndpbmRPckxhenlTbG93UGF0aE9TUkV4aXQu
ZW5kKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBzaXpl
X3Qgb3NyRXhpdEluZGV4ID0gZmluZFJlc3VsdC0+dmFsdWU7CisgICAgICAgICAgICBSRUxFQVNF
X0FTU0VSVChzdGF0ZS5qaXRDb2RlLT5vc3JFeGl0W29zckV4aXRJbmRleF0ubV9kZXNjcmlwdG9y
Lm1fd2lsbEFycml2ZUF0T1NSRXhpdEZyb21HZW5lcmljVW53aW5kKTsKKyAgICAgICAgICAgIE9T
UkV4aXRDb21waWxhdGlvbkluZm8mIGluZm8gPSBzdGF0ZS5maW5hbGl6ZXItPm9zckV4aXRbb3Ny
RXhpdEluZGV4XTsKKyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUKGluZm8ubV9nZXRBbmRQdXRC
eUlkQ2FsbE9wZXJhdGlvbkV4Y2VwdGlvbk9TUkV4aXRFbnRyYW5jZS5pc1NldCgpKTsKKyAgICAg
ICAgICAgIGV4Y2VwdGlvbkp1bXBzVG9MaW5rLmFwcGVuZCgKKyAgICAgICAgICAgICAgICBzdGQ6
Om1ha2VfcGFpcihDQ2FsbEhlbHBlcnM6Okp1bXBMaXN0KCksIHN0YXRlLmZpbmFsaXplci0+ZXhp
dFRodW5rc0xpbmtCdWZmZXItPmxvY2F0aW9uT2YoaW5mby5tX2dldEFuZFB1dEJ5SWRDYWxsT3Bl
cmF0aW9uRXhjZXB0aW9uT1NSRXhpdEVudHJhbmNlKSkpOworICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIH07CiAgICAgICAgIAogICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSBzdGF0
ZS5nZXRCeUlkcy5zaXplKCk7IGktLTspIHsKICAgICAgICAgICAgIEdldEJ5SWREZXNjcmlwdG9y
JiBnZXRCeUlkID0gc3RhdGUuZ2V0QnlJZHNbaV07CkBAIC02NDQsMTMgKzcxOCwzMSBAQCBzdGF0
aWMgdm9pZCBmaXhGdW5jdGlvbkJhc2VkT25TdGFja01hcHMoCiAgICAgICAgICAgICAgICAgR1BS
UmVnIGJhc2UgPSByZWNvcmQubG9jYXRpb25zWzFdLmRpcmVjdEdQUigpOwogICAgICAgICAgICAg
ICAgIAogICAgICAgICAgICAgICAgIEpJVEdldEJ5SWRHZW5lcmF0b3IgZ2VuKAotICAgICAgICAg
ICAgICAgICAgICBjb2RlQmxvY2ssIGNvZGVPcmlnaW4sIHN0YXRlLmppdENvZGUtPmNvbW1vbi5h
ZGRVbmlxdWVDYWxsU2l0ZUluZGV4KGNvZGVPcmlnaW4pLCB1c2VkUmVnaXN0ZXJzLCBKU1ZhbHVl
UmVncyhiYXNlKSwKKyAgICAgICAgICAgICAgICAgICAgY29kZUJsb2NrLCBjb2RlT3JpZ2luLCBn
ZW5lcmF0ZU9yR2V0QWxyZWFkeUdlbmVyYXRlZENhbGxTaXRlSW5kZXgoaXRlci0+dmFsdWVbaV0u
aW5kZXgsIGNvZGVPcmlnaW4pLCB1c2VkUmVnaXN0ZXJzLCBKU1ZhbHVlUmVncyhiYXNlKSwKICAg
ICAgICAgICAgICAgICAgICAgSlNWYWx1ZVJlZ3MocmVzdWx0KSk7CiAgICAgICAgICAgICAgICAg
CisgICAgICAgICAgICAgICAgYm9vbCBhZGRlZFVuaXF1ZUV4Y2VwdGlvbkp1bXAgPSBhZGROZXdF
eGNlcHRpb25KdW1wSWZOZWNlc3NhcnkoaXRlci0+dmFsdWVbaV0uaW5kZXgpOwogICAgICAgICAg
ICAgICAgIE1hY3JvQXNzZW1ibGVyOjpMYWJlbCBiZWdpbiA9IHNsb3dQYXRoSklULmxhYmVsKCk7
Ci0KKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IGJhc2UpIHsKKyAgICAgICAgICAgICAg
ICAgICAgLy8gVGhpcyBzaXR1YXRpb24gaGFzIGEgcmVhbGx5IGludGVyZXN0aW5nIHN0b3J5LiBX
ZSBtYXkgaGF2ZSBhIEdldEJ5SWQgaW5zaWRlCisgICAgICAgICAgICAgICAgICAgIC8vIGEgdHJ5
IGJsb2NrIHdoZXJlIExMVk0gYXNzaWducyB0aGUgcmVzdWx0IGFuZCB0aGUgYmFzZSB0byB0aGUg
c2FtZSByZWdpc3Rlci4KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGlubGluZSBjYWNoZSBt
YXkgbWlzcyBhbmQgd2UgbWF5IGVuZCB1cCBhdCB0aGlzIHNsb3cgcGF0aCBjYWxsT3BlcmF0aW9u
LiAKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlbiwgc3VwcG9zZSB0aGUgYmFzZSBhbmQgdGhl
IHJlc3VsdCBhcmUgYm90aCB0aGUgc2FtZSByZWdpc3Rlciwgc28gdGhlIHJldHVybgorICAgICAg
ICAgICAgICAgICAgICAvLyB2YWx1ZSBvZiB0aGUgQyBjYWxsIGdldHMgc3RvcmVkIGludG8gdGhl
IG9yaWdpbmFsIGJhc2UgcmVnaXN0ZXIuIElmIHRoZSBvcGVyYXRpb25HZXRCeUlkT3B0aW1pemUK
KyAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3dzLCBpdCB3aWxsIHJldHVybiAidW5kZWZpbmVk
IiBhbmQgd2Ugd2lsbCBiZSBzdHVjayB3aXRoICJ1bmRlZmluZWQiIGluIHRoZSBiYXNlCisgICAg
ICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIHRoYXQgd2Ugd291bGQgbGlrZSB0byBkbyB2YWx1
ZSByZWNvdmVyeSBvbi4gV2UgY29tYmF0IHRoaXMgc2l0dWF0aW9uIGZyb20gZXZlcgorICAgICAg
ICAgICAgICAgICAgICAvLyB0YWtpbmcgcGxhY2UgYnkgZW5zdXJpbmcgd2Ugc3BpbGwgdGhlIG9y
aWdpbmFsIGJhc2UgdmFsdWUgYW5kIHRoZW4gcmVjb3ZlciBpdCBmcm9tCisgICAgICAgICAgICAg
ICAgICAgIC8vIHRoZSBzcGlsbCBzbG90IGFzIHRoZSBmaXJzdCBzdGVwIGluIE9TUiBleGl0Lgor
ICAgICAgICAgICAgICAgICAgICBhdXRvIGZpbmRSZXN1bHQgPSByZWNvcmRJbmRleFRvR2VuZXJp
Y1Vud2luZE9yTGF6eVNsb3dQYXRoT1NSRXhpdC5maW5kKGl0ZXItPnZhbHVlW2ldLmluZGV4KTsK
KyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRSZXN1bHQgIT0gcmVjb3JkSW5kZXhUb0dlbmVy
aWNVbndpbmRPckxhenlTbG93UGF0aE9TUkV4aXQuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHNpemVfdCBvc3JFeGl0SW5kZXggPSBmaW5kUmVzdWx0LT52YWx1ZTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIE9TUkV4aXQmIGV4aXQgPSBzdGF0ZS5qaXRDb2RlLT5vc3JFeGl0W29z
ckV4aXRJbmRleF07CisgICAgICAgICAgICAgICAgICAgICAgICBSRUxFQVNFX0FTU0VSVChleGl0
Lm1fZGVzY3JpcHRvci5tX2lzRXhjZXB0aW9uRnJvbUdldEJ5SWQpOworICAgICAgICAgICAgICAg
ICAgICAgICAgZXhpdC5zcGlsbFJlZ2lzdGVyc1RvU3BpbGxTbG90KHNsb3dQYXRoSklULCBqc0Nh
bGxUaGF0TWlnaHRUaHJvd1NwaWxsT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBNYWNyb0Fzc2VtYmxlcjo6Q2FsbCBjYWxs
ID0gY2FsbE9wZXJhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUsIHVzZWRSZWdpc3Rl
cnMsIHNsb3dQYXRoSklULCBjb2RlT3JpZ2luLCAmZXhjZXB0aW9uVGFyZ2V0LAorICAgICAgICAg
ICAgICAgICAgICBzdGF0ZSwgdXNlZFJlZ2lzdGVycywgc2xvd1BhdGhKSVQsIGNvZGVPcmlnaW4s
IGFkZGVkVW5pcXVlRXhjZXB0aW9uSnVtcCA/ICZleGNlcHRpb25KdW1wc1RvTGluay5sYXN0KCku
Zmlyc3QgOiAmZXhjZXB0aW9uVGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25H
ZXRCeUlkT3B0aW1pemUsIHJlc3VsdCwgQ0NhbGxIZWxwZXJzOjpUcnVzdGVkSW1tUHRyKGdlbi5z
dHViSW5mbygpKSwKICAgICAgICAgICAgICAgICAgICAgYmFzZSwgQ0NhbGxIZWxwZXJzOjpUcnVz
dGVkSW1tUHRyKGdldEJ5SWQudWlkKCkpKS5jYWxsKCk7CiAKQEAgLTY4MywxMyArNzc1LDE1IEBA
IHN0YXRpYyB2b2lkIGZpeEZ1bmN0aW9uQmFzZWRPblN0YWNrTWFwcygKICAgICAgICAgICAgICAg
ICBHUFJSZWcgdmFsdWUgPSByZWNvcmQubG9jYXRpb25zWzFdLmRpcmVjdEdQUigpOwogICAgICAg
ICAgICAgICAgIAogICAgICAgICAgICAgICAgIEpJVFB1dEJ5SWRHZW5lcmF0b3IgZ2VuKAotICAg
ICAgICAgICAgICAgICAgICBjb2RlQmxvY2ssIGNvZGVPcmlnaW4sIHN0YXRlLmppdENvZGUtPmNv
bW1vbi5hZGRVbmlxdWVDYWxsU2l0ZUluZGV4KGNvZGVPcmlnaW4pLCB1c2VkUmVnaXN0ZXJzLCBK
U1ZhbHVlUmVncyhiYXNlKSwKKyAgICAgICAgICAgICAgICAgICAgY29kZUJsb2NrLCBjb2RlT3Jp
Z2luLCBnZW5lcmF0ZU9yR2V0QWxyZWFkeUdlbmVyYXRlZENhbGxTaXRlSW5kZXgoaXRlci0+dmFs
dWVbaV0uaW5kZXgsIGNvZGVPcmlnaW4pLCB1c2VkUmVnaXN0ZXJzLCBKU1ZhbHVlUmVncyhiYXNl
KSwKICAgICAgICAgICAgICAgICAgICAgSlNWYWx1ZVJlZ3ModmFsdWUpLCBHUFJJbmZvOjpwYXRj
aHBvaW50U2NyYXRjaFJlZ2lzdGVyLCBwdXRCeUlkLmVjbWFNb2RlKCksIHB1dEJ5SWQucHV0S2lu
ZCgpKTsKICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBib29sIGFkZGVkVW5pcXVl
RXhjZXB0aW9uSnVtcCA9IGFkZE5ld0V4Y2VwdGlvbkp1bXBJZk5lY2Vzc2FyeShpdGVyLT52YWx1
ZVtpXS5pbmRleCk7CisKICAgICAgICAgICAgICAgICBNYWNyb0Fzc2VtYmxlcjo6TGFiZWwgYmVn
aW4gPSBzbG93UGF0aEpJVC5sYWJlbCgpOwotICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAg
ICAgICAgTWFjcm9Bc3NlbWJsZXI6OkNhbGwgY2FsbCA9IGNhbGxPcGVyYXRpb24oCi0gICAgICAg
ICAgICAgICAgICAgIHN0YXRlLCB1c2VkUmVnaXN0ZXJzLCBzbG93UGF0aEpJVCwgY29kZU9yaWdp
biwgJmV4Y2VwdGlvblRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUsIHVzZWRSZWdp
c3RlcnMsIHNsb3dQYXRoSklULCBjb2RlT3JpZ2luLCBhZGRlZFVuaXF1ZUV4Y2VwdGlvbkp1bXAg
PyAmZXhjZXB0aW9uSnVtcHNUb0xpbmsubGFzdCgpLmZpcnN0IDogJmV4Y2VwdGlvblRhcmdldCwK
ICAgICAgICAgICAgICAgICAgICAgZ2VuLnNsb3dQYXRoRnVuY3Rpb24oKSwgSW52YWxpZEdQUlJl
ZywKICAgICAgICAgICAgICAgICAgICAgQ0NhbGxIZWxwZXJzOjpUcnVzdGVkSW1tUHRyKGdlbi5z
dHViSW5mbygpKSwgdmFsdWUsIGJhc2UsCiAgICAgICAgICAgICAgICAgICAgIENDYWxsSGVscGVy
czo6VHJ1c3RlZEltbVB0cihwdXRCeUlkLnVpZCgpKSkuY2FsbCgpOwpAQCAtNzg5LDExICs4ODMs
MTggQEAgc3RhdGljIHZvaWQgZml4RnVuY3Rpb25CYXNlZE9uU3RhY2tNYXBzKAogICAgICAgICAg
ICAgICAgIGNoYXIqIHN0YXJ0T2ZJQyA9CiAgICAgICAgICAgICAgICAgICAgIGJpdHdpc2VfY2Fz
dDxjaGFyKj4oZ2VuZXJhdGVkRnVuY3Rpb24pICsgcmVjb3JkLmluc3RydWN0aW9uT2Zmc2V0Owog
ICAgICAgICAgICAgICAgIENvZGVMb2NhdGlvbkxhYmVsIHBhdGNocG9pbnQoKE1hY3JvQXNzZW1i
bGVyQ29kZVB0cihzdGFydE9mSUMpKSk7Ci0gICAgICAgICAgICAgICAgQ29kZUxvY2F0aW9uTGFi
ZWwgZXhjZXB0aW9uVGFyZ2V0ID0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuZmluYWxpemVy
LT5oYW5kbGVFeGNlcHRpb25zTGlua0J1ZmZlci0+ZW50cnlwb2ludCgpOworICAgICAgICAgICAg
ICAgIENvZGVMb2NhdGlvbkxhYmVsIGV4Y2VwdGlvblRhcmdldDsKKyAgICAgICAgICAgICAgICBh
dXRvIGZpbmRSZXN1bHQgPSByZWNvcmRJbmRleFRvR2VuZXJpY1Vud2luZE9yTGF6eVNsb3dQYXRo
T1NSRXhpdC5maW5kKGl0ZXItPnZhbHVlW2ldLmluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAo
ZmluZFJlc3VsdCAhPSByZWNvcmRJbmRleFRvR2VuZXJpY1Vud2luZE9yTGF6eVNsb3dQYXRoT1NS
RXhpdC5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb3NyRXhpdEluZGV4ID0g
ZmluZFJlc3VsdC0+dmFsdWU7CisgICAgICAgICAgICAgICAgICAgIE9TUkV4aXRDb21waWxhdGlv
bkluZm8mIGluZm8gPSBzdGF0ZS5maW5hbGl6ZXItPm9zckV4aXRbb3NyRXhpdEluZGV4XTsKKyAg
ICAgICAgICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQoc3RhdGUuaml0Q29kZS0+b3NyRXhpdFtv
c3JFeGl0SW5kZXhdLm1fZGVzY3JpcHRvci5tX2lzRXhjZXB0aW9uRnJvbUxhenlTbG93UGF0aCk7
CisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvblRhcmdldCA9IHN0YXRlLmZpbmFsaXplci0+
ZXhpdFRodW5rc0xpbmtCdWZmZXItPmxvY2F0aW9uT2YoaW5mby5tX3RodW5rTGFiZWwpOworICAg
ICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25UYXJnZXQg
PSBzdGF0ZS5maW5hbGl6ZXItPmhhbmRsZUV4Y2VwdGlvbnNMaW5rQnVmZmVyLT5lbnRyeXBvaW50
KCk7CiAKICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TGF6eVNsb3dQYXRoPiBsYXp5
U2xvd1BhdGggPSBzdGQ6Om1ha2VfdW5pcXVlPExhenlTbG93UGF0aD4oCi0gICAgICAgICAgICAg
ICAgICAgIHBhdGNocG9pbnQsIGV4Y2VwdGlvblRhcmdldCwgdXNlZFJlZ2lzdGVycywgc3RhdGUu
aml0Q29kZS0+Y29tbW9uLmFkZFVuaXF1ZUNhbGxTaXRlSW5kZXgoY29kZU9yaWdpbiksCisgICAg
ICAgICAgICAgICAgICAgIHBhdGNocG9pbnQsIGV4Y2VwdGlvblRhcmdldCwgdXNlZFJlZ2lzdGVy
cywgZ2VuZXJhdGVPckdldEFscmVhZHlHZW5lcmF0ZWRDYWxsU2l0ZUluZGV4KGl0ZXItPnZhbHVl
W2ldLmluZGV4LCBjb2RlT3JpZ2luKSwKICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5t
X2xpbmtlci0+cnVuKGxvY2F0aW9ucykpOwogCiAgICAgICAgICAgICAgICAgQ0NhbGxIZWxwZXJz
OjpMYWJlbCBiZWdpbiA9IHNsb3dQYXRoSklULmxhYmVsKCk7CkBAIC04NDcsMTUgKzk0OCwxNyBA
QCBzdGF0aWMgdm9pZCBmaXhGdW5jdGlvbkJhc2VkT25TdGFja01hcHMoCiAgICAgICAgICAgICAg
ICAgICAgIHN0YXRlLmZpbmFsaXplci0+c2lkZUNvZGVMaW5rQnVmZmVyLT5sb2NhdGlvbk9mKHN0
ZDo6Z2V0PDE+KHR1cGxlKSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGZv
ciAoYXV0byYgcGFpciA6IGV4Y2VwdGlvbkp1bXBzVG9MaW5rKQorICAgICAgICAgICAgc3RhdGUu
ZmluYWxpemVyLT5zaWRlQ29kZUxpbmtCdWZmZXItPmxpbmsocGFpci5maXJzdCwgcGFpci5zZWNv
bmQpOwogICAgIH0KICAgICAKLSAgICBhZGp1c3RDYWxsSUNzRm9yU3RhY2ttYXBzKHN0YXRlLmpz
Q2FsbHMsIHJlY29yZE1hcCk7CisgICAgYWRqdXN0Q2FsbElDc0ZvclN0YWNrbWFwcyhzdGF0ZS5q
c0NhbGxzLCByZWNvcmRNYXAsIGdlbmVyYXRlT3JHZXRBbHJlYWR5R2VuZXJhdGVkQ2FsbFNpdGVJ
bmRleCwganNDYWxsT1NSRXhpdEZvclJlY29yZEluZGV4KTsKICAgICAKICAgICBmb3IgKHVuc2ln
bmVkIGkgPSBzdGF0ZS5qc0NhbGxzLnNpemUoKTsgaS0tOykgewogICAgICAgICBKU0NhbGwmIGNh
bGwgPSBzdGF0ZS5qc0NhbGxzW2ldOwogCiAgICAgICAgIENDYWxsSGVscGVycyBmYXN0UGF0aEpJ
VCgmdm0sIGNvZGVCbG9jayk7Ci0gICAgICAgIGNhbGwuZW1pdChmYXN0UGF0aEpJVCwgc3RhdGUp
OworICAgICAgICBjYWxsLmVtaXQoZmFzdFBhdGhKSVQsIHN0YXRlLCBqc0NhbGxUaGF0TWlnaHRU
aHJvd1NwaWxsT2Zmc2V0KTsKIAogICAgICAgICBjaGFyKiBzdGFydE9mSUMgPSBiaXR3aXNlX2Nh
c3Q8Y2hhcio+KGdlbmVyYXRlZEZ1bmN0aW9uKSArIGNhbGwubV9pbnN0cnVjdGlvbk9mZnNldDsK
IApAQCAtODY0LDEzICs5NjcsMTMgQEAgc3RhdGljIHZvaWQgZml4RnVuY3Rpb25CYXNlZE9uU3Rh
Y2tNYXBzKAogICAgICAgICB9KTsKICAgICB9CiAgICAgCi0gICAgYWRqdXN0Q2FsbElDc0ZvclN0
YWNrbWFwcyhzdGF0ZS5qc0NhbGxWYXJhcmdzZXMsIHJlY29yZE1hcCk7CisgICAgYWRqdXN0Q2Fs
bElDc0ZvclN0YWNrbWFwcyhzdGF0ZS5qc0NhbGxWYXJhcmdzZXMsIHJlY29yZE1hcCwgZ2VuZXJh
dGVPckdldEFscmVhZHlHZW5lcmF0ZWRDYWxsU2l0ZUluZGV4LCBqc0NhbGxPU1JFeGl0Rm9yUmVj
b3JkSW5kZXgpOwogICAgIAogICAgIGZvciAodW5zaWduZWQgaSA9IHN0YXRlLmpzQ2FsbFZhcmFy
Z3Nlcy5zaXplKCk7IGktLTspIHsKICAgICAgICAgSlNDYWxsVmFyYXJncyYgY2FsbCA9IHN0YXRl
LmpzQ2FsbFZhcmFyZ3Nlc1tpXTsKICAgICAgICAgCiAgICAgICAgIENDYWxsSGVscGVycyBmYXN0
UGF0aEpJVCgmdm0sIGNvZGVCbG9jayk7Ci0gICAgICAgIGNhbGwuZW1pdChmYXN0UGF0aEpJVCwg
c3RhdGUsIHZhcmFyZ3NTcGlsbFNsb3RzT2Zmc2V0KTsKKyAgICAgICAgY2FsbC5lbWl0KGZhc3RQ
YXRoSklULCBzdGF0ZSwgdmFyYXJnc1NwaWxsU2xvdHNPZmZzZXQsIGpzQ2FsbFRoYXRNaWdodFRo
cm93U3BpbGxPZmZzZXQpOwogCiAgICAgICAgIGNoYXIqIHN0YXJ0T2ZJQyA9IGJpdHdpc2VfY2Fz
dDxjaGFyKj4oZ2VuZXJhdGVkRnVuY3Rpb24pICsgY2FsbC5tX2luc3RydWN0aW9uT2Zmc2V0Owog
ICAgICAgICBzaXplX3Qgc2l6ZU9mSUMgPSBzaXplT2ZJQ0ZvcihjYWxsLm5vZGUoKSk7CkBAIC04
ODAsNyArOTgzLDggQEAgc3RhdGljIHZvaWQgZml4RnVuY3Rpb25CYXNlZE9uU3RhY2tNYXBzKAog
ICAgICAgICB9KTsKICAgICB9CiAKLSAgICBhZGp1c3RDYWxsSUNzRm9yU3RhY2ttYXBzKHN0YXRl
LmpzVGFpbENhbGxzLCByZWNvcmRNYXApOworICAgIC8vIEZJWE1FOiB3ZSBkb24ndCByZWFsbHkg
bmVlZCB0byBnZW5lcmF0ZSBjYWxsc2l0ZWluZGljZXMgZm9yIHRhaWwgY2FsbHMuCisgICAgYWRq
dXN0Q2FsbElDc0ZvclN0YWNrbWFwcyhzdGF0ZS5qc1RhaWxDYWxscywgcmVjb3JkTWFwLCBnZW5l
cmF0ZU9yR2V0QWxyZWFkeUdlbmVyYXRlZENhbGxTaXRlSW5kZXgsIGpzQ2FsbE9TUkV4aXRGb3JS
ZWNvcmRJbmRleCk7CiAKICAgICBmb3IgKHVuc2lnbmVkIGkgPSBzdGF0ZS5qc1RhaWxDYWxscy5z
aXplKCk7IGktLTspIHsKICAgICAgICAgSlNUYWlsQ2FsbCYgY2FsbCA9IHN0YXRlLmpzVGFpbENh
bGxzW2ldOwpAQCAtOTI5LDggKzEwMzMsMTAgQEAgc3RhdGljIHZvaWQgZml4RnVuY3Rpb25CYXNl
ZE9uU3RhY2tNYXBzKAogICAgIGZvciAodW5zaWduZWQgZXhpdEluZGV4ID0gMDsgZXhpdEluZGV4
IDwgaml0Q29kZS0+b3NyRXhpdC5zaXplKCk7ICsrZXhpdEluZGV4KSB7CiAgICAgICAgIE9TUkV4
aXRDb21waWxhdGlvbkluZm8mIGluZm8gPSBzdGF0ZS5maW5hbGl6ZXItPm9zckV4aXRbZXhpdElu
ZGV4XTsKICAgICAgICAgT1NSRXhpdCYgZXhpdCA9IGppdENvZGUtPm9zckV4aXRbZXhpdEluZGV4
XTsKLSAgICAgICAgCiAgICAgICAgIFZlY3Rvcjxjb25zdCB2b2lkKj4gY29kZUFkZHJlc3NlczsK
KworICAgICAgICBpZiAoZXhpdC5tX2Rlc2NyaXB0b3IubV93aWxsQXJyaXZlQXRPU1JFeGl0RnJv
bUdlbmVyaWNVbndpbmQgfHwgZXhpdC5tX2Rlc2NyaXB0b3IubV9pc0V4Y2VwdGlvbkZyb21MYXp5
U2xvd1BhdGgpIC8vIFRoaXMgaXMgcmVhY2hlZCBieSBhIGp1bXAgZnJvbSBnZW5lcmljVW53aW5k
IG9yIGEganVtcCBmcm9tIGEgbGF6eSBzbG93IHBhdGguCisgICAgICAgICAgICBjb250aW51ZTsK
ICAgICAgICAgCiAgICAgICAgIFN0YWNrTWFwczo6UmVjb3JkJiByZWNvcmQgPSBqaXRDb2RlLT5z
dGFja21hcHMucmVjb3Jkc1tleGl0Lm1fc3RhY2ttYXBSZWNvcmRJbmRleF07CiAgICAgICAgIApJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExFeGl0QXJndW1lbnQuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTEV4aXRBcmd1bWVudC5oCShyZXZp
c2lvbiAxOTE5MzEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTEV4aXRBcmd1bWVu
dC5oCSh3b3JraW5nIGNvcHkpCkBAIC03NCw3ICs3NCw3IEBAIHB1YmxpYzoKICAgICB7CiAgICAg
ICAgIHJldHVybiBFeGl0QXJndW1lbnQoZm9ybWF0LCBhcmd1bWVudCgpKTsKICAgICB9Ci0gICAg
CisKICAgICBFeGl0QXJndW1lbnRSZXByZXNlbnRhdGlvbiByZXByZXNlbnRhdGlvbigpIGNvbnN0
IHsgcmV0dXJuIG1fcmVwcmVzZW50YXRpb247IH0KICAgICAKICAgICB2b2lkIGR1bXAoUHJpbnRT
dHJlYW0mKSBjb25zdDsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMRXhpdFRo
dW5rR2VuZXJhdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRs
L0ZUTEV4aXRUaHVua0dlbmVyYXRvci5jcHAJKHJldmlzaW9uIDE5MTkzMSkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9mdGwvRlRMRXhpdFRodW5rR2VuZXJhdG9yLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNDYsMjEgKzQ2LDQxIEBAIEV4aXRUaHVua0dlbmVyYXRvcjo6fkV4aXRUaHVua0dlbmVy
YXRvcigKIHsKIH0KIAotdm9pZCBFeGl0VGh1bmtHZW5lcmF0b3I6OmVtaXRUaHVuayh1bnNpZ25l
ZCBpbmRleCkKK3ZvaWQgRXhpdFRodW5rR2VuZXJhdG9yOjplbWl0VGh1bmsodW5zaWduZWQgaW5k
ZXgsIGludDMyX3Qgb3NyRXhpdEZyb21HZW5lcmljVW53aW5kU3RhY2tTcGlsbFNsb3QpCiB7CiAg
ICAgT1NSRXhpdENvbXBpbGF0aW9uSW5mbyYgaW5mbyA9IG1fc3RhdGUuZmluYWxpemVyLT5vc3JF
eGl0W2luZGV4XTsKKyAgICBPU1JFeGl0JiBleGl0ID0gbV9zdGF0ZS5qaXRDb2RlLT5vc3JFeGl0
W2luZGV4XTsKICAgICAKICAgICBpbmZvLm1fdGh1bmtMYWJlbCA9IGxhYmVsKCk7CisKKyAgICBp
ZiAoZXhpdC5tX2Rlc2NyaXB0b3IubV93aWxsQXJyaXZlQXRPU1JFeGl0RnJvbUdlbmVyaWNVbndp
bmQpIHsKKyAgICAgICAgcmVzdG9yZUNhbGxlZVNhdmVzRnJvbVZNQ2FsbGVlU2F2ZXNCdWZmZXIo
KTsKKyAgICAgICAgbG9hZFB0cih2bSgpLT5hZGRyZXNzT2ZDYWxsRnJhbWVGb3JDYXRjaCgpLCBm
cmFtZVBvaW50ZXJSZWdpc3Rlcik7CisgICAgICAgIGFkZFB0cihUcnVzdGVkSW1tMzIoLSBzdGF0
aWNfY2FzdDxpbnQ2NF90PihtX3N0YXRlLmppdENvZGUtPnN0YWNrbWFwcy5zdGFja1NpemVGb3JM
b2NhbHMoKSkpLCAKKyAgICAgICAgICAgIGZyYW1lUG9pbnRlclJlZ2lzdGVyLCBzdGFja1BvaW50
ZXJSZWdpc3Rlcik7CisKKyAgICAgICAgaWYgKGV4aXQubV9kZXNjcmlwdG9yLm1faXNFeGNlcHRp
b25Gcm9tSlNDYWxsKQorICAgICAgICAgICAgZXhpdC5yZWNvdmVyUmVnaXN0ZXJzRnJvbVNwaWxs
U2xvdCgqdGhpcywgb3NyRXhpdEZyb21HZW5lcmljVW53aW5kU3RhY2tTcGlsbFNsb3QpOworCisg
ICAgICAgIEp1bXAgc2tpcEdldEFuZFB1dEJ5SWRTbG93UGF0aEVudHJhbmNlID0ganVtcCgpOwor
CisgICAgICAgIGluZm8ubV9nZXRBbmRQdXRCeUlkQ2FsbE9wZXJhdGlvbkV4Y2VwdGlvbk9TUkV4
aXRFbnRyYW5jZSA9IGxhYmVsKCk7CisgICAgICAgIGlmIChleGl0Lm1fZGVzY3JpcHRvci5tX2lz
RXhjZXB0aW9uRnJvbUdldEJ5SWQpCisgICAgICAgICAgICBleGl0LnJlY292ZXJSZWdpc3RlcnNG
cm9tU3BpbGxTbG90KCp0aGlzLCBvc3JFeGl0RnJvbUdlbmVyaWNVbndpbmRTdGFja1NwaWxsU2xv
dCk7CisgICAgICAgIAorICAgICAgICBza2lwR2V0QW5kUHV0QnlJZFNsb3dQYXRoRW50cmFuY2Uu
bGluayh0aGlzKTsKKyAgICB9CisKICAgICBwdXNoVG9TYXZlSW1tZWRpYXRlV2l0aG91dFRvdWNo
aW5nUmVnaXN0ZXJzKFRydXN0ZWRJbW0zMihpbmRleCkpOwogICAgIGluZm8ubV90aHVua0p1bXAg
PSBwYXRjaGFibGVKdW1wKCk7CiAgICAgCiAgICAgbV9kaWRUaGluZ3MgPSB0cnVlOwogfQogCi12
b2lkIEV4aXRUaHVua0dlbmVyYXRvcjo6ZW1pdFRodW5rcygpCit2b2lkIEV4aXRUaHVua0dlbmVy
YXRvcjo6ZW1pdFRodW5rcyhpbnQzMl90IG9zckV4aXRGcm9tR2VuZXJpY1Vud2luZFN0YWNrU3Bp
bGxTbG90KQogewogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX3N0YXRlLmZpbmFsaXpl
ci0+b3NyRXhpdC5zaXplKCk7ICsraSkKLSAgICAgICAgZW1pdFRodW5rKGkpOworICAgICAgICBl
bWl0VGh1bmsoaSwgb3NyRXhpdEZyb21HZW5lcmljVW53aW5kU3RhY2tTcGlsbFNsb3QpOwogfQog
CiB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6RlRMCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZnRsL0ZUTEV4aXRUaHVua0dlbmVyYXRvci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9mdGwvRlRMRXhpdFRodW5rR2VuZXJhdG9yLmgJKHJldmlzaW9uIDE5MTkzMSkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMRXhpdFRodW5rR2VuZXJhdG9yLmgJKHdvcmtp
bmcgY29weSkKQEAgLTQwLDggKzQwLDggQEAgcHVibGljOgogICAgIEV4aXRUaHVua0dlbmVyYXRv
cihTdGF0ZSYgc3RhdGUpOwogICAgIH5FeGl0VGh1bmtHZW5lcmF0b3IoKTsKICAgICAKLSAgICB2
b2lkIGVtaXRUaHVuayh1bnNpZ25lZCBpbmRleCk7Ci0gICAgdm9pZCBlbWl0VGh1bmtzKCk7Cisg
ICAgdm9pZCBlbWl0VGh1bmsodW5zaWduZWQgaW5kZXgsIGludDMyX3Qgb3NyRXhpdEZyb21HZW5l
cmljVW53aW5kU3RhY2tTcGlsbFNsb3QpOworICAgIHZvaWQgZW1pdFRodW5rcyhpbnQzMl90IG9z
ckV4aXRGcm9tR2VuZXJpY1Vud2luZFN0YWNrU3BpbGxTbG90KTsKICAgICAKICAgICBib29sIGRp
ZFRoaW5ncygpIGNvbnN0IHsgcmV0dXJuIG1fZGlkVGhpbmdzOyB9CiAKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9mdGwvRlRMRXhpdFZhbHVlLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2Z0bC9GVExFeGl0VmFsdWUuaAkocmV2aXNpb24gMTkxOTMxKQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExFeGl0VmFsdWUuaAkod29ya2luZyBjb3B5KQpAQCAt
MTU3LDYgKzE1Nyw3IEBAIHB1YmxpYzoKICAgICBib29sIGlzQXJndW1lbnQoKSBjb25zdCB7IHJl
dHVybiBraW5kKCkgPT0gRXhpdFZhbHVlQXJndW1lbnQ7IH0KICAgICBib29sIGlzUmVjb3Zlcnko
KSBjb25zdCB7IHJldHVybiBraW5kKCkgPT0gRXhpdFZhbHVlUmVjb3Zlcnk7IH0KICAgICBib29s
IGlzT2JqZWN0TWF0ZXJpYWxpemF0aW9uKCkgY29uc3QgeyByZXR1cm4ga2luZCgpID09IEV4aXRW
YWx1ZU1hdGVyaWFsaXplTmV3T2JqZWN0OyB9CisgICAgYm9vbCBoYXNJbmRleEluU3RhY2ttYXBM
b2NhdGlvbnMoKSBjb25zdCB7IHJldHVybiBpc0FyZ3VtZW50KCkgfHwgaXNSZWNvdmVyeSgpOyB9
CiAgICAgCiAgICAgRXhpdEFyZ3VtZW50IGV4aXRBcmd1bWVudCgpIGNvbnN0CiAgICAgewpAQCAt
MTc1LDYgKzE3NiwxOCBAQCBwdWJsaWM6CiAgICAgICAgIEFTU0VSVChpc1JlY292ZXJ5KCkpOwog
ICAgICAgICByZXR1cm4gdS5yZWNvdmVyeS5yaWdodEFyZ3VtZW50OwogICAgIH0KKworICAgIHZv
aWQgYWRqdXN0U3RhY2ttYXBMb2NhdGlvbnNJbmRleEJ5T2Zmc2V0KHVuc2lnbmVkIG9mZnNldCkK
KyAgICB7CisgICAgICAgIEFTU0VSVChoYXNJbmRleEluU3RhY2ttYXBMb2NhdGlvbnMoKSk7Cisg
ICAgICAgIGlmIChpc0FyZ3VtZW50KCkpCisgICAgICAgICAgICB1LmFyZ3VtZW50LmFyZ3VtZW50
ICs9IG9mZnNldDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBBU1NFUlQoaXNSZWNvdmVy
eSgpKTsKKyAgICAgICAgICAgIHUucmVjb3ZlcnkucmlnaHRBcmd1bWVudCArPSBvZmZzZXQ7Cisg
ICAgICAgICAgICB1LnJlY292ZXJ5LmxlZnRBcmd1bWVudCArPSBvZmZzZXQ7CisgICAgICAgIH0K
KyAgICB9CiAgICAgCiAgICAgRGF0YUZvcm1hdCByZWNvdmVyeUZvcm1hdCgpIGNvbnN0CiAgICAg
ewpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExKSVRDb2RlLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTEpJVENvZGUuY3BwCShyZXZpc2lv
biAxOTE5MzEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTEpJVENvZGUuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0xNDQsMTAgKzE0NCwxNCBAQCB2b2lkIEpJVENvZGU6OnZhbGlkYXRl
UmVmZXJlbmNlcyhjb25zdCBUCiAgICAgICAgIGV4aXQubV9kZXNjcmlwdG9yLnZhbGlkYXRlUmVm
ZXJlbmNlcyh0cmFja2VkUmVmZXJlbmNlcyk7CiB9CiAKLVJlZ2lzdGVyU2V0IEpJVENvZGU6Omxp
dmVSZWdpc3RlcnNUb1ByZXNlcnZlQXRFeGNlcHRpb25IYW5kbGluZ0NhbGxTaXRlKENvZGVCbG9j
ayosIENhbGxTaXRlSW5kZXgpCitSZWdpc3RlclNldCBKSVRDb2RlOjpsaXZlUmVnaXN0ZXJzVG9Q
cmVzZXJ2ZUF0RXhjZXB0aW9uSGFuZGxpbmdDYWxsU2l0ZShDb2RlQmxvY2sqLCBDYWxsU2l0ZUlu
ZGV4IGNhbGxTaXRlSW5kZXgpCiB7Ci0gICAgLy8gRklYTUU6IGltcGxlbWVudCB0aGlzIHdoZW4g
RlRMIGltcGxlbWVudHMgdHJ5L2NhdGNoLgotICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0xNDk0MDkKKyAgICBmb3IgKE9TUkV4aXQmIGV4aXQgOiBvc3JFeGl0
KSB7CisgICAgICAgIGlmIChleGl0Lm1fZXhjZXB0aW9uSGFuZGxlckNhbGxTaXRlSW5kZXguYml0
cygpID09IGNhbGxTaXRlSW5kZXguYml0cygpKSB7CisgICAgICAgICAgICBSRUxFQVNFX0FTU0VS
VChleGl0Lm1faXNFeGNlcHRpb25IYW5kbGVyKTsKKyAgICAgICAgICAgIHJldHVybiBzdGFja21h
cHMucmVjb3Jkc1tleGl0Lm1fc3RhY2ttYXBSZWNvcmRJbmRleF0udXNlZFJlZ2lzdGVyU2V0KCk7
CisgICAgICAgIH0KKyAgICB9CiAgICAgcmV0dXJuIFJlZ2lzdGVyU2V0KCk7CiB9CiAKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMSlNDYWxsLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTEpTQ2FsbC5jcHAJKHJldmlzaW9uIDE5MTkzMSkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMSlNDYWxsLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNTAsOSArNTAsOSBAQCBKU0NhbGw6OkpTQ2FsbCh1bnNpZ25lZCBzdGFja21hcElELCBO
b2RlCiAgICAgQVNTRVJUKG5vZGUtPm9wKCkgPT0gQ2FsbCB8fCBub2RlLT5vcCgpID09IENvbnN0
cnVjdCB8fCBub2RlLT5vcCgpID09IFRhaWxDYWxsSW5saW5lZENhbGxlcik7CiB9CiAKLXZvaWQg
SlNDYWxsOjplbWl0KENDYWxsSGVscGVycyYgaml0LCBTdGF0ZSYgc3RhdGUpCit2b2lkIEpTQ2Fs
bDo6ZW1pdChDQ2FsbEhlbHBlcnMmIGppdCwgU3RhdGUmIHN0YXRlLCBpbnQzMl90IG9zckV4aXRG
cm9tR2VuZXJpY1Vud2luZFNwaWxsU2xvdHMpCiB7Ci0gICAgSlNDYWxsQmFzZTo6ZW1pdChqaXQs
IHN0YXRlKTsKKyAgICBKU0NhbGxCYXNlOjplbWl0KGppdCwgc3RhdGUsIG9zckV4aXRGcm9tR2Vu
ZXJpY1Vud2luZFNwaWxsU2xvdHMpOwogCiAgICAgaml0LmFkZFB0cihDQ2FsbEhlbHBlcnM6OlRy
dXN0ZWRJbW0zMigtIHN0YXRpY19jYXN0PGludDY0X3Q+KHN0YXRlLmppdENvZGUtPnN0YWNrbWFw
cy5zdGFja1NpemVGb3JMb2NhbHMoKSkpLCBDQ2FsbEhlbHBlcnM6OmZyYW1lUG9pbnRlclJlZ2lz
dGVyLCBDQ2FsbEhlbHBlcnM6OnN0YWNrUG9pbnRlclJlZ2lzdGVyKTsKIH0KSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMSlNDYWxsLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL2Z0bC9GVExKU0NhbGwuaAkocmV2aXNpb24gMTkxOTMxKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2Z0bC9GVExKU0NhbGwuaAkod29ya2luZyBjb3B5KQpAQCAtNDMsNyAr
NDMsNyBAQCBwdWJsaWM6CiAgICAgSlNDYWxsKCk7CiAgICAgSlNDYWxsKHVuc2lnbmVkIHN0YWNr
bWFwSUQsIERGRzo6Tm9kZSosIENvZGVPcmlnaW4gY2FsbFNpdGVEZXNjcmlwdGlvbk9yaWdpbik7
CiAKLSAgICB2b2lkIGVtaXQoQ0NhbGxIZWxwZXJzJiwgU3RhdGUmKTsKKyAgICB2b2lkIGVtaXQo
Q0NhbGxIZWxwZXJzJiwgU3RhdGUmLCBpbnQzMl90IG9zckV4aXRGcm9tR2VuZXJpY1Vud2luZFNw
aWxsU2xvdHMpOwogICAgIAogICAgIHVuc2lnbmVkIHN0YWNrbWFwSUQoKSBjb25zdCB7IHJldHVy
biBtX3N0YWNrbWFwSUQ7IH0KICAgICAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwv
RlRMSlNDYWxsQmFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0
bC9GVExKU0NhbGxCYXNlLmNwcAkocmV2aXNpb24gMTkxOTMxKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2Z0bC9GVExKU0NhbGxCYXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzksNiArMzks
NyBAQCB1c2luZyBuYW1lc3BhY2UgREZHOwogSlNDYWxsQmFzZTo6SlNDYWxsQmFzZSgpCiAgICAg
OiBtX3R5cGUoQ2FsbExpbmtJbmZvOjpOb25lKQogICAgICwgbV9jYWxsTGlua0luZm8obnVsbHB0
cikKKyAgICAsIG1fY29ycmVzcG9uZGluZ0dlbmVyaWNVbndpbmRPU1JFeGl0KG51bGxwdHIpCiB7
CiB9CiAKQEAgLTUwLDEwICs1MSwxNCBAQCBKU0NhbGxCYXNlOjpKU0NhbGxCYXNlKENhbGxMaW5r
SW5mbzo6Q2FsCiB7CiB9CiAKLXZvaWQgSlNDYWxsQmFzZTo6ZW1pdChDQ2FsbEhlbHBlcnMmIGpp
dCwgU3RhdGUmIHN0YXRlKQordm9pZCBKU0NhbGxCYXNlOjplbWl0KENDYWxsSGVscGVycyYgaml0
LCBTdGF0ZSYgLypzdGF0ZSovLCBpbnQzMl90IG9zckV4aXRGcm9tR2VuZXJpY1Vud2luZFN0YWNr
U3BpbGxTbG90KQogewotICAgIENhbGxTaXRlSW5kZXggY2FsbFNpdGVJbmRleCA9IHN0YXRlLmpp
dENvZGUtPmNvbW1vbi5hZGRVbmlxdWVDYWxsU2l0ZUluZGV4KG1fY2FsbFNpdGVEZXNjcmlwdGlv
bk9yaWdpbik7Ci0gICAgaml0LnN0b3JlMzIoQ0NhbGxIZWxwZXJzOjpUcnVzdGVkSW1tMzIoY2Fs
bFNpdGVJbmRleC5iaXRzKCkpLCBDQ2FsbEhlbHBlcnM6OnRhZ0ZvcihzdGF0aWNfY2FzdDxWaXJ0
dWFsUmVnaXN0ZXI+KEpTU3RhY2s6OkFyZ3VtZW50Q291bnQpKSk7CisgICAgUkVMRUFTRV9BU1NF
UlQoISFtX2NhbGxTaXRlSW5kZXgpOworICAgIAorICAgIGlmIChtX2NvcnJlc3BvbmRpbmdHZW5l
cmljVW53aW5kT1NSRXhpdCkKKyAgICAgICAgbV9jb3JyZXNwb25kaW5nR2VuZXJpY1Vud2luZE9T
UkV4aXQtPnNwaWxsUmVnaXN0ZXJzVG9TcGlsbFNsb3Qoaml0LCBvc3JFeGl0RnJvbUdlbmVyaWNV
bndpbmRTdGFja1NwaWxsU2xvdCk7CisKKyAgICBqaXQuc3RvcmUzMihDQ2FsbEhlbHBlcnM6OlRy
dXN0ZWRJbW0zMihtX2NhbGxTaXRlSW5kZXguYml0cygpKSwgQ0NhbGxIZWxwZXJzOjp0YWdGb3Io
c3RhdGljX2Nhc3Q8VmlydHVhbFJlZ2lzdGVyPihKU1N0YWNrOjpBcmd1bWVudENvdW50KSkpOwog
CiAgICAgbV9jYWxsTGlua0luZm8gPSBqaXQuY29kZUJsb2NrKCktPmFkZENhbGxMaW5rSW5mbygp
OwogICAgIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExKU0NhbGxCYXNlLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExKU0NhbGxCYXNlLmgJ
KHJldmlzaW9uIDE5MTkzMSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMSlNDYWxs
QmFzZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSAiQ0NhbGxI
ZWxwZXJzLmgiCiAjaW5jbHVkZSAiQ2FsbExpbmtJbmZvLmgiCiAjaW5jbHVkZSAiQ29kZU9yaWdp
bi5oIgorI2luY2x1ZGUgIkZUTE9TUkV4aXQuaCIKIAogbmFtZXNwYWNlIEpTQyB7CiAKQEAgLTQ5
LDE3ICs1MCwyNSBAQCBwdWJsaWM6CiAgICAgSlNDYWxsQmFzZSgpOwogICAgIEpTQ2FsbEJhc2Uo
Q2FsbExpbmtJbmZvOjpDYWxsVHlwZSwgQ29kZU9yaWdpbiBzZW1hbnRpYywgQ29kZU9yaWdpbiBj
YWxsU2l0ZURlc2NyaXB0aW9uKTsKICAgICAKLSAgICB2b2lkIGVtaXQoQ0NhbGxIZWxwZXJzJiwg
U3RhdGUmKTsKKyAgICB2b2lkIGVtaXQoQ0NhbGxIZWxwZXJzJiwgU3RhdGUmLCBpbnQzMl90IG9z
ckV4aXRGcm9tR2VuZXJpY1Vud2luZFNwaWxsU2xvdHMpOwogICAgIHZvaWQgbGluayhWTSYsIExp
bmtCdWZmZXImKTsKKworICAgIHZvaWQgc2V0Q2FsbFNpdGVJbmRleChDYWxsU2l0ZUluZGV4IGNh
bGxTaXRlSW5kZXgpIHsgbV9jYWxsU2l0ZUluZGV4ID0gY2FsbFNpdGVJbmRleDsgfQorICAgIENv
ZGVPcmlnaW4gY2FsbFNpdGVEZXNjcmlwdGlvbk9yaWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fY2Fs
bFNpdGVEZXNjcmlwdGlvbk9yaWdpbjsgfQorCisgICAgdm9pZCBzZXRDb3JyZXNwb25kaW5nR2Vu
ZXJpY1Vud2luZE9TUkV4aXQoT1NSRXhpdCogZXhpdCkgeyBtX2NvcnJlc3BvbmRpbmdHZW5lcmlj
VW53aW5kT1NSRXhpdCA9IGV4aXQ7IH0KICAgICAKIHByb3RlY3RlZDoKICAgICBDYWxsTGlua0lu
Zm86OkNhbGxUeXBlIG1fdHlwZTsKICAgICBDb2RlT3JpZ2luIG1fc2VtYW50aWNlT3JpZ2luOwog
ICAgIENvZGVPcmlnaW4gbV9jYWxsU2l0ZURlc2NyaXB0aW9uT3JpZ2luOyAvLyBUaGVzZSB0d28g
Y29kZSBvcmlnaW5zIG1heSBiZSBkaWZmZXJlbnQgd2l0aCB0YWlsIGNhbGxzIHVuZGVyIHNvbWUg
Y2lyY3Vtc3RhbmNlcyBvZiBpbmxpbmluZy4gU2VlIHJlbGV2YW50IGNvbW1lbnQgaW4gTG93ZXJE
RkdUb0xMVk0uCisgICAgQ2FsbFNpdGVJbmRleCBtX2NhbGxTaXRlSW5kZXg7CiAgICAgQ0NhbGxI
ZWxwZXJzOjpEYXRhTGFiZWxQdHIgbV90YXJnZXRUb0NoZWNrOwogICAgIENDYWxsSGVscGVyczo6
Q2FsbCBtX2Zhc3RDYWxsOwogICAgIENDYWxsSGVscGVyczo6Q2FsbCBtX3Nsb3dDYWxsOwogICAg
IENhbGxMaW5rSW5mbyogbV9jYWxsTGlua0luZm87CitwdWJsaWM6CisgICAgT1NSRXhpdCogbV9j
b3JyZXNwb25kaW5nR2VuZXJpY1Vud2luZE9TUkV4aXQ7CiB9OwogCiB9IH0gLy8gbmFtZXNwYWNl
IEpTQzo6RlRMCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTEpTQ2FsbFZhcmFy
Z3MuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMSlNDYWxs
VmFyYXJncy5jcHAJKHJldmlzaW9uIDE5MTkzMSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9m
dGwvRlRMSlNDYWxsVmFyYXJncy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTY5LDcgKzY5LDcgQEAg
dW5zaWduZWQgSlNDYWxsVmFyYXJnczo6bnVtU3BpbGxTbG90c05lZQogICAgIHJldHVybiA0Owog
fQogCi12b2lkIEpTQ2FsbFZhcmFyZ3M6OmVtaXQoQ0NhbGxIZWxwZXJzJiBqaXQsIFN0YXRlJiBz
dGF0ZSwgaW50MzJfdCBzcGlsbFNsb3RzT2Zmc2V0KQordm9pZCBKU0NhbGxWYXJhcmdzOjplbWl0
KENDYWxsSGVscGVycyYgaml0LCBTdGF0ZSYgc3RhdGUsIGludDMyX3Qgc3BpbGxTbG90c09mZnNl
dCwgaW50MzJfdCBvc3JFeGl0RnJvbUdlbmVyaWNVbndpbmRTcGlsbFNsb3RzKQogewogICAgIC8v
IFdlIGFyZSBwYXNzZWQgdGhyZWUgcGllY2VzIG9mIGluZm9ybWF0aW9uOgogICAgIC8vIC0gVGhl
IGNhbGxlZS4KQEAgLTIwNSw3ICsyMDUsOCBAQCB2b2lkIEpTQ2FsbFZhcmFyZ3M6OmVtaXQoQ0Nh
bGxIZWxwZXJzJiBqCiAgICAgLy8gc3RhY2sgZnJhbWUgdG8gYWxyZWFkeSBiZSBzZXQgdXAsIHdo
aWNoIGl0IGlzLgogICAgIGppdC5zdG9yZTY0KEdQUkluZm86OnJlZ1QwLCBDQ2FsbEhlbHBlcnM6
OmNhbGxlZUZyYW1lU2xvdChKU1N0YWNrOjpDYWxsZWUpKTsKIAotICAgIG1fY2FsbEJhc2UuZW1p
dChqaXQsIHN0YXRlKTsKKyAgICBtX2NhbGxCYXNlLmVtaXQoaml0LCBzdGF0ZSwgb3NyRXhpdEZy
b21HZW5lcmljVW53aW5kU3BpbGxTbG90cyk7CisKICAgICAKICAgICAvLyBVbmRvIHRoZSBkYW1h
Z2Ugd2UndmUgZG9uZS4KICAgICBpZiAoaXNBUk02NCgpKSB7CkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZnRsL0ZUTEpTQ2FsbFZhcmFyZ3MuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvZnRsL0ZUTEpTQ2FsbFZhcmFyZ3MuaAkocmV2aXNpb24gMTkxOTMxKQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExKU0NhbGxWYXJhcmdzLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTQ5LDcgKzQ5LDcgQEAgcHVibGljOgogICAgIAogICAgIHN0YXRpYyB1bnNpZ25lZCBu
dW1TcGlsbFNsb3RzTmVlZGVkKCk7CiAgICAgCi0gICAgdm9pZCBlbWl0KENDYWxsSGVscGVycyYs
IFN0YXRlJiwgaW50MzJfdCBzcGlsbFNsb3RzT2Zmc2V0KTsKKyAgICB2b2lkIGVtaXQoQ0NhbGxI
ZWxwZXJzJiwgU3RhdGUmLCBpbnQzMl90IHNwaWxsU2xvdHNPZmZzZXQsIGludDMyX3Qgb3NyRXhp
dEZyb21HZW5lcmljVW53aW5kU3BpbGxTbG90cyk7CiAgICAgdm9pZCBsaW5rKFZNJiwgTGlua0J1
ZmZlciYsIENvZGVMb2NhdGlvbkxhYmVsIGV4Y2VwdGlvbkhhbmRsZXIpOwogICAgIAogICAgIHVu
c2lnbmVkIHN0YWNrbWFwSUQoKSBjb25zdCB7IHJldHVybiBtX3N0YWNrbWFwSUQ7IH0KQEAgLTU5
LDYgKzU5LDEwIEBAIHB1YmxpYzoKICAgICAgICAgcmV0dXJuIG1faW5zdHJ1Y3Rpb25PZmZzZXQg
PCBvdGhlci5tX2luc3RydWN0aW9uT2Zmc2V0OwogICAgIH0KICAgICAKKyAgICB2b2lkIHNldENh
bGxTaXRlSW5kZXgoQ2FsbFNpdGVJbmRleCBjYWxsU2l0ZUluZGV4KSB7IG1fY2FsbEJhc2Uuc2V0
Q2FsbFNpdGVJbmRleChjYWxsU2l0ZUluZGV4KTsgfQorICAgIENvZGVPcmlnaW4gY2FsbFNpdGVE
ZXNjcmlwdGlvbk9yaWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fY2FsbEJhc2UuY2FsbFNpdGVEZXNj
cmlwdGlvbk9yaWdpbigpOyB9CisgICAgdm9pZCBzZXRDb3JyZXNwb25kaW5nR2VuZXJpY1Vud2lu
ZE9TUkV4aXQoT1NSRXhpdCogZXhpdCkgeyBtX2NhbGxCYXNlLnNldENvcnJlc3BvbmRpbmdHZW5l
cmljVW53aW5kT1NSRXhpdChleGl0KTsgfQorICAgIAogcHJpdmF0ZToKICAgICB1bnNpZ25lZCBt
X3N0YWNrbWFwSUQ7CiAgICAgREZHOjpOb2RlKiBtX25vZGU7CkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZnRsL0ZUTExvd2VyREZHVG9MTFZNLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvZnRsL0ZUTExvd2VyREZHVG9MTFZNLmNwcAkocmV2aXNpb24gMTkxOTMx
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExMb3dlckRGR1RvTExWTS5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTE3MCw4ICsxNzAsOSBAQCBwdWJsaWM6CiAgICAgICAgICAgICBtX291
dC5zdGFja21hcEludHJpbnNpYygpLCBtX291dC5jb25zdEludDY0KG1fZnRsU3RhdGUuY2FwdHVy
ZWRTdGFja21hcElEKSwKICAgICAgICAgICAgIG1fb3V0LmludDMyWmVybywgY2FwdHVyZWRBbGxv
Y2EpOwogICAgICAgICAKLSAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbnkgQ2FsbFZhcmFyZ3MgdGhl
biB3ZSBuZWUgdG8gaGF2ZSBhIHNwaWxsIHNsb3QgZm9yIGl0LgorICAgICAgICAvLyBJZiB3ZSBo
YXZlIGFueSBDYWxsVmFyYXJncyB0aGVuIHdlIG5lZWQgdG8gaGF2ZSBhIHNwaWxsIHNsb3QgZm9y
IGl0LgogICAgICAgICBib29sIGhhc1ZhcmFyZ3MgPSBmYWxzZTsKKyAgICAgICAgc2l6ZV90IG1h
eE51bWJlck9mQ2F0Y2hTcGlsbHMgPSAwOwogICAgICAgICBmb3IgKEJhc2ljQmxvY2sqIGJsb2Nr
IDogcHJlT3JkZXIpIHsKICAgICAgICAgICAgIGZvciAoTm9kZSogbm9kZSA6ICpibG9jaykgewog
ICAgICAgICAgICAgICAgIHN3aXRjaCAobm9kZS0+b3AoKSkgewpAQCAtMTg4LDYgKzE4OSw0MyBA
QCBwdWJsaWM6CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAg
YnJlYWs7CiAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1fZ3JhcGgu
bV9oYXNFeGNlcHRpb25IYW5kbGVycykgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG5v
ZGUtPm9wKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDYWxsOgorICAgICAgICAgICAg
ICAgICAgICBjYXNlIENhbGxWYXJhcmdzOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENhbGxG
b3J3YXJkVmFyYXJnczoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDb25zdHJ1Y3Q6CisgICAg
ICAgICAgICAgICAgICAgIGNhc2UgQ29uc3RydWN0VmFyYXJnczoKKyAgICAgICAgICAgICAgICAg
ICAgY2FzZSBDb25zdHJ1Y3RGb3J3YXJkVmFyYXJnczoKKyAgICAgICAgICAgICAgICAgICAgY2Fz
ZSBUYWlsQ2FsbElubGluZWRDYWxsZXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVGFpbENh
bGxWYXJhcmdzSW5saW5lZENhbGxlcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUYWlsQ2Fs
bEZvcndhcmRWYXJhcmdzSW5saW5lZENhbGxlcjogeworICAgICAgICAgICAgICAgICAgICAgICAg
Q29kZU9yaWdpbiBvcENhdGNoT3JpZ2luOworICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxl
ckluZm8qIGV4Y2VwdGlvbkhhbmRsZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdp
bGxDYXRjaEV4Y2VwdGlvbiA9IG1fZ3JhcGgud2lsbENhdGNoRXhjZXB0aW9uSW5NYWNoaW5lRnJh
bWUobm9kZS0+b3JpZ2luLmZvckV4aXQsIG9wQ2F0Y2hPcmlnaW4sIGV4Y2VwdGlvbkhhbmRsZXIp
OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbGxDYXRjaEV4Y2VwdGlvbikKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBtYXhOdW1iZXJPZkNhdGNoU3BpbGxzID0gc3RkOjptYXgo
bWF4TnVtYmVyT2ZDYXRjaFNwaWxscywgbV9ncmFwaC5sb2NhbHNMaXZlSW5CeXRlY29kZShvcENh
dGNoT3JpZ2luKS5iaXRDb3VudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgR2V0QnlJZDoK
KyAgICAgICAgICAgICAgICAgICAgY2FzZSBHZXRCeUlkRmx1c2g6IHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIC8vIFdlIG1heSBoYXZlIHRvIGZsdXNoIG9uZSB0aGluZyBmb3IgR2V0QnlJZHMg
d2hlbiB0aGUgYmFzZSBhbmQgcmVzdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmUg
YXNzaWduZWQgdGhlIHNhbWUgcmVnaXN0ZXIuIEZvciBhIG1vcmUgY29tcHJlaGVuc2l2ZSBvdmVy
dmlldywgbG9vaworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQgdGhlIGNvbW1lbnQgaW4g
RlRMQ29tcGlsZS5jcHAKKyAgICAgICAgICAgICAgICAgICAgICAgIENvZGVPcmlnaW4gb3BDYXRj
aE9yaWdpbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJJbmZvKiBleGNlcHRpb25I
YW5kbGVyOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aWxsQ2F0Y2hFeGNlcHRpb24g
PSBtX2dyYXBoLndpbGxDYXRjaEV4Y2VwdGlvbkluTWFjaGluZUZyYW1lKG5vZGUtPm9yaWdpbi5m
b3JFeGl0LCBvcENhdGNoT3JpZ2luLCBleGNlcHRpb25IYW5kbGVyKTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGlmICh3aWxsQ2F0Y2hFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IG51bWJlck9mR2V0QnlJZFNwaWxscyA9IDE7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TnVtYmVyT2ZDYXRjaFNwaWxscyA9IHN0ZDo6
bWF4KG1heE51bWJlck9mQ2F0Y2hTcGlsbHMsIG51bWJlck9mR2V0QnlJZFNwaWxscyk7CisgICAg
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKGhhc1ZhcmFy
Z3MpIHsKQEAgLTE5OCw2ICsyMzYsMTggQEAgcHVibGljOgogICAgICAgICAgICAgICAgIG1fb3V0
LnN0YWNrbWFwSW50cmluc2ljKCksIG1fb3V0LmNvbnN0SW50NjQobV9mdGxTdGF0ZS52YXJhcmdz
U3BpbGxTbG90c1N0YWNrbWFwSUQpLAogICAgICAgICAgICAgICAgIG1fb3V0LmludDMyWmVybywg
dmFyYXJnc1NwaWxsU2xvdHMpOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKG1fZ3JhcGgubV9o
YXNFeGNlcHRpb25IYW5kbGVycyAmJiBtYXhOdW1iZXJPZkNhdGNoU3BpbGxzKSB7CisgICAgICAg
ICAgICBSZWdpc3RlclNldCB2b2xhdGlsZVJlZ2lzdGVycyA9IFJlZ2lzdGVyU2V0Ojp2b2xhdGls
ZVJlZ2lzdGVyc0ZvckpTQ2FsbCgpOworICAgICAgICAgICAgbWF4TnVtYmVyT2ZDYXRjaFNwaWxs
cyA9IHN0ZDo6bWluKHZvbGF0aWxlUmVnaXN0ZXJzLm51bWJlck9mU2V0UmVnaXN0ZXJzKCksIG1h
eE51bWJlck9mQ2F0Y2hTcGlsbHMpOworCisgICAgICAgICAgICBMVmFsdWUgZXhjZXB0aW9uSGFu
ZGxpbmdWb2xhdGlsZVJlZ2lzdGVyc1NwaWxsU2xvdHMgPSBtX291dC5hbGxvY2EoCisgICAgICAg
ICAgICAgICAgYXJyYXlUeXBlKG1fb3V0LmludDY0LCBtYXhOdW1iZXJPZkNhdGNoU3BpbGxzKSk7
CisgICAgICAgICAgICBtX2Z0bFN0YXRlLmV4Y2VwdGlvbkhhbmRsaW5nU3BpbGxTbG90U3RhY2tt
YXBJRCA9IG1fc3RhY2ttYXBJRHMrKzsKKyAgICAgICAgICAgIG1fb3V0LmNhbGwoCisgICAgICAg
ICAgICAgICAgbV9vdXQuc3RhY2ttYXBJbnRyaW5zaWMoKSwgbV9vdXQuY29uc3RJbnQ2NChtX2Z0
bFN0YXRlLmV4Y2VwdGlvbkhhbmRsaW5nU3BpbGxTbG90U3RhY2ttYXBJRCksCisgICAgICAgICAg
ICAgICAgbV9vdXQuaW50MzJaZXJvLCBleGNlcHRpb25IYW5kbGluZ1ZvbGF0aWxlUmVnaXN0ZXJz
U3BpbGxTbG90cyk7CisgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIC8vIFdlIHNob3VsZCBu
b3QgY3JlYXRlIGFueSBhbGxvY2EncyBhZnRlciB0aGlzIHBvaW50LCBzaW5jZSB0aGV5IHdpbGwg
Y2Vhc2UgdG8KICAgICAgICAgLy8gYmUgbWVtMnJlZyBjYW5kaWRhdGVzLgpAQCAtMjMxMSwxMCAr
MjM2MSwxOCBAQCBwcml2YXRlOgogICAgICAgICBpZiAodmVyYm9zZUNvbXBpbGF0aW9uRW5hYmxl
ZCgpKQogICAgICAgICAgICAgZGF0YUxvZygiICAgIEVtaXR0aW5nIFB1dEJ5SWQgcGF0Y2hwb2lu
dCB3aXRoIHN0YWNrbWFwICMiLCBzdGFja21hcElELCAiXG4iKTsKICAgICAgICAgCi0gICAgICAg
IExWYWx1ZSBjYWxsID0gbV9vdXQuY2FsbCgKLSAgICAgICAgICAgIG1fb3V0LnBhdGNocG9pbnRW
b2lkSW50cmluc2ljKCksCi0gICAgICAgICAgICBtX291dC5jb25zdEludDY0KHN0YWNrbWFwSUQp
LCBtX291dC5jb25zdEludDMyKHNpemVPZlB1dEJ5SWQoKSksCi0gICAgICAgICAgICBjb25zdE51
bGwobV9vdXQucmVmOCksIG1fb3V0LmNvbnN0SW50MzIoMiksIGJhc2UsIHZhbHVlKTsKKyAgICAg
ICAgRXhpdEFyZ3VtZW50TGlzdCBhcmd1bWVudHM7IC8vIEZJWE1FOiByZW5hbWUgdGhpcy4KKyAg
ICAgICAgYXJndW1lbnRzLmFwcGVuZChiYXNlKTsgCisgICAgICAgIGFyZ3VtZW50cy5hcHBlbmQo
dmFsdWUpOworCisgICAgICAgIGFwcGVuZE9TUkV4aXRBcmd1bWVudHNGb3JQYXRjaHBvaW50SWZX
aWxsQ2F0Y2hFeGNlcHRpb24oYXJndW1lbnRzLCBMTFZNQW55UmVnQ2FsbENvbnYsIDIpOyAvLyAy
IGFyZ3VtZW50cyBzaG93IHVwIGluIHRoZSBzdGFja21hcCBsb2NhdGlvbnM6IHRoZSBiYXNlIGFu
ZCB0aGUgdmFsdWUuCisKKyAgICAgICAgYXJndW1lbnRzLmluc2VydCgwLCBtX291dC5jb25zdElu
dDMyKDIpKTsgCisgICAgICAgIGFyZ3VtZW50cy5pbnNlcnQoMCwgY29uc3ROdWxsKG1fb3V0LnJl
ZjgpKTsgCisgICAgICAgIGFyZ3VtZW50cy5pbnNlcnQoMCwgbV9vdXQuY29uc3RJbnQzMihzaXpl
T2ZQdXRCeUlkKCkpKTsKKyAgICAgICAgYXJndW1lbnRzLmluc2VydCgwLCBtX291dC5jb25zdElu
dDY0KHN0YWNrbWFwSUQpKTsKKworICAgICAgICBMVmFsdWUgY2FsbCA9IG1fb3V0LmNhbGwobV9v
dXQucGF0Y2hwb2ludFZvaWRJbnRyaW5zaWMoKSwgYXJndW1lbnRzKTsKICAgICAgICAgc2V0SW5z
dHJ1Y3Rpb25DYWxsaW5nQ29udmVudGlvbihjYWxsLCBMTFZNQW55UmVnQ2FsbENvbnYpOwogICAg
ICAgICAKICAgICAgICAgbV9mdGxTdGF0ZS5wdXRCeUlkcy5hcHBlbmQoUHV0QnlJZERlc2NyaXB0
b3IoCkBAIC00NTE5LDEyICs0NTc3LDkgQEAgcHJpdmF0ZToKICAgICAgICAgdW5zaWduZWQgZnJh
bWVTaXplID0gSlNTdGFjazo6Q2FsbEZyYW1lSGVhZGVyU2l6ZSArIG51bUFyZ3M7CiAgICAgICAg
IHVuc2lnbmVkIGFsaWduZWRGcmFtZVNpemUgPSBXVEY6OnJvdW5kVXBUb011bHRpcGxlT2Yoc3Rh
Y2tBbGlnbm1lbnRSZWdpc3RlcnMoKSwgZnJhbWVTaXplKTsKICAgICAgICAgdW5zaWduZWQgcGFk
ZGluZyA9IGFsaWduZWRGcmFtZVNpemUgLSBmcmFtZVNpemU7Ci0KLSAgICAgICAgVmVjdG9yPExW
YWx1ZT4gYXJndW1lbnRzOwotICAgICAgICBhcmd1bWVudHMuYXBwZW5kKG1fb3V0LmNvbnN0SW50
NjQoc3RhY2ttYXBJRCkpOwotICAgICAgICBhcmd1bWVudHMuYXBwZW5kKG1fb3V0LmNvbnN0SW50
MzIoc2l6ZU9mQ2FsbCgpKSk7Ci0gICAgICAgIGFyZ3VtZW50cy5hcHBlbmQoY29uc3ROdWxsKG1f
b3V0LnJlZjgpKTsKLSAgICAgICAgYXJndW1lbnRzLmFwcGVuZChtX291dC5jb25zdEludDMyKDEg
KyBhbGlnbmVkRnJhbWVTaXplIC0gSlNTdGFjazo6Q2FsbGVyRnJhbWVBbmRQQ1NpemUpKTsKKyAg
ICAgICAgLy8gRG9jdW1lbnRhdGlvbiBhYm91dCBzdGFja21hcCBhbmQgcGF0Y2hwb2ludCBpbnRy
aW5zaWNzOgorICAgICAgICAvLyBodHRwOi8vbGx2bS5vcmcvZG9jcy9TdGFja01hcHMuaHRtbAor
ICAgICAgICBFeGl0QXJndW1lbnRMaXN0IGFyZ3VtZW50czsKICAgICAgICAgYXJndW1lbnRzLmFw
cGVuZChqc0NhbGxlZSk7IC8vIGNhbGxlZSAtPiAlcmF4CiAgICAgICAgIGFyZ3VtZW50cy5hcHBl
bmQoZ2V0VW5kZWYobV9vdXQuaW50NjQpKTsgLy8gY29kZSBibG9jawogICAgICAgICBhcmd1bWVu
dHMuYXBwZW5kKGpzQ2FsbGVlKTsgLy8gY2FsbGVlIC0+IHN0YWNrCkBAIC00NTMzLDYgKzQ1ODgs
MTMgQEAgcHJpdmF0ZToKICAgICAgICAgICAgIGFyZ3VtZW50cy5hcHBlbmQobG93SlNWYWx1ZSht
X2dyYXBoLnZhckFyZ0NoaWxkKG1fbm9kZSwgMSArIGkpKSk7CiAgICAgICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBwYWRkaW5nOyArK2kpCiAgICAgICAgICAgICBhcmd1bWVudHMuYXBwZW5k
KGdldFVuZGVmKG1fb3V0LmludDY0KSk7CisKKyAgICAgICAgYXBwZW5kT1NSRXhpdEFyZ3VtZW50
c0ZvclBhdGNocG9pbnRJZldpbGxDYXRjaEV4Y2VwdGlvbihhcmd1bWVudHMsIExMVk1XZWJLaXRK
U0NhbGxDb252LCAwKTsgLy8gTm8gY2FsbCBhcmd1bWVudHMgc2hvdyB1cCBpbiB0aGUgc3RhY2tt
YXAgbG9jYXRpb25zLgorCisgICAgICAgIGFyZ3VtZW50cy5pbnNlcnQoMCwgbV9vdXQuY29uc3RJ
bnQzMigxICsgYWxpZ25lZEZyYW1lU2l6ZSAtIEpTU3RhY2s6OkNhbGxlckZyYW1lQW5kUENTaXpl
KSk7CisgICAgICAgIGFyZ3VtZW50cy5pbnNlcnQoMCwgY29uc3ROdWxsKG1fb3V0LnJlZjgpKTsK
KyAgICAgICAgYXJndW1lbnRzLmluc2VydCgwLCBtX291dC5jb25zdEludDMyKHNpemVPZkNhbGwo
KSkpOworICAgICAgICBhcmd1bWVudHMuaW5zZXJ0KDAsIG1fb3V0LmNvbnN0SW50NjQoc3RhY2tt
YXBJRCkpOwogICAgICAgICAKICAgICAgICAgTFZhbHVlIGNhbGwgPSBtX291dC5jYWxsKG1fb3V0
LnBhdGNocG9pbnRJbnQ2NEludHJpbnNpYygpLCBhcmd1bWVudHMpOwogICAgICAgICBzZXRJbnN0
cnVjdGlvbkNhbGxpbmdDb252ZW50aW9uKGNhbGwsIExMVk1XZWJLaXRKU0NhbGxDb252KTsKQEAg
LTQ2MDMsMTYgKzQ2NjUsMTkgQEAgcHJpdmF0ZToKICAgICAgICAgCiAgICAgICAgIHVuc2lnbmVk
IHN0YWNrbWFwSUQgPSBtX3N0YWNrbWFwSURzKys7CiAgICAgICAgIAotICAgICAgICBWZWN0b3I8
TFZhbHVlPiBhcmd1bWVudHM7Ci0gICAgICAgIGFyZ3VtZW50cy5hcHBlbmQobV9vdXQuY29uc3RJ
bnQ2NChzdGFja21hcElEKSk7Ci0gICAgICAgIGFyZ3VtZW50cy5hcHBlbmQobV9vdXQuY29uc3RJ
bnQzMihzaXplT2ZJQ0ZvcihtX25vZGUpKSk7Ci0gICAgICAgIGFyZ3VtZW50cy5hcHBlbmQoY29u
c3ROdWxsKG1fb3V0LnJlZjgpKTsKLSAgICAgICAgYXJndW1lbnRzLmFwcGVuZChtX291dC5jb25z
dEludDMyKDIgKyAhIWpzQXJndW1lbnRzKSk7CisgICAgICAgIEV4aXRBcmd1bWVudExpc3QgYXJn
dW1lbnRzOwogICAgICAgICBhcmd1bWVudHMuYXBwZW5kKGpzQ2FsbGVlKTsKICAgICAgICAgaWYg
KGpzQXJndW1lbnRzKQogICAgICAgICAgICAgYXJndW1lbnRzLmFwcGVuZChqc0FyZ3VtZW50cyk7
CiAgICAgICAgIEFTU0VSVCh0aGlzQXJnKTsKICAgICAgICAgYXJndW1lbnRzLmFwcGVuZCh0aGlz
QXJnKTsKKworICAgICAgICBhcHBlbmRPU1JFeGl0QXJndW1lbnRzRm9yUGF0Y2hwb2ludElmV2ls
bENhdGNoRXhjZXB0aW9uKGFyZ3VtZW50cywgTExWTUNDYWxsQ29udiwgMCk7IC8vIE5vIGNhbGwg
YXJndW1lbnRzIHNob3cgdXAgaW4gc3RhY2ttYXAgbG9jYXRpb25zLgorCisgICAgICAgIGFyZ3Vt
ZW50cy5pbnNlcnQoMCwgbV9vdXQuY29uc3RJbnQzMigyICsgISFqc0FyZ3VtZW50cykpOworICAg
ICAgICBhcmd1bWVudHMuaW5zZXJ0KDAsIGNvbnN0TnVsbChtX291dC5yZWY4KSk7CisgICAgICAg
IGFyZ3VtZW50cy5pbnNlcnQoMCwgbV9vdXQuY29uc3RJbnQzMihzaXplT2ZJQ0ZvcihtX25vZGUp
KSk7CisgICAgICAgIGFyZ3VtZW50cy5pbnNlcnQoMCwgbV9vdXQuY29uc3RJbnQ2NChzdGFja21h
cElEKSk7CiAgICAgICAgIAogICAgICAgICBMVmFsdWUgY2FsbCA9IG1fb3V0LmNhbGwobV9vdXQu
cGF0Y2hwb2ludEludDY0SW50cmluc2ljKCksIGFyZ3VtZW50cyk7CiAgICAgICAgIHNldEluc3Ry
dWN0aW9uQ2FsbGluZ0NvbnZlbnRpb24oY2FsbCwgTExWTUNDYWxsQ29udik7CkBAIC02MTczLDEw
ICs2MjM4LDE3IEBAIHByaXZhdGU6CiAgICAgICAgIGlmIChPcHRpb25zOjp2ZXJib3NlQ29tcGls
YXRpb24oKSkKICAgICAgICAgICAgIGRhdGFMb2coIiAgICBFbWl0dGluZyBHZXRCeUlkIHBhdGNo
cG9pbnQgd2l0aCBzdGFja21hcCAjIiwgc3RhY2ttYXBJRCwgIlxuIik7CiAgICAgICAgIAotICAg
ICAgICBMVmFsdWUgY2FsbCA9IG1fb3V0LmNhbGwoCi0gICAgICAgICAgICBtX291dC5wYXRjaHBv
aW50SW50NjRJbnRyaW5zaWMoKSwKLSAgICAgICAgICAgIG1fb3V0LmNvbnN0SW50NjQoc3RhY2tt
YXBJRCksIG1fb3V0LmNvbnN0SW50MzIoc2l6ZU9mR2V0QnlJZCgpKSwKLSAgICAgICAgICAgIGNv
bnN0TnVsbChtX291dC5yZWY4KSwgbV9vdXQuY29uc3RJbnQzMigxKSwgYmFzZSk7CisgICAgICAg
IEV4aXRBcmd1bWVudExpc3QgYXJndW1lbnRzOworICAgICAgICBhcmd1bWVudHMuYXBwZW5kKGJh
c2UpOworCisgICAgICAgIGFwcGVuZE9TUkV4aXRBcmd1bWVudHNGb3JQYXRjaHBvaW50SWZXaWxs
Q2F0Y2hFeGNlcHRpb24oYXJndW1lbnRzLCBMTFZNQW55UmVnQ2FsbENvbnYsIDIsIGZhbHNlLCB0
cnVlKTsgLy8gMiBhcmd1bWVudHMgc2hvdyB1cCBpbiB0aGUgc3RhY2ttYXAgbG9jYXRpb25zOiB0
aGUgcmVzdWx0IGFuZCB0aGUgYmFzZS4KKworICAgICAgICBhcmd1bWVudHMuaW5zZXJ0KDAsIG1f
b3V0LmNvbnN0SW50MzIoMSkpOyAKKyAgICAgICAgYXJndW1lbnRzLmluc2VydCgwLCBjb25zdE51
bGwobV9vdXQucmVmOCkpOworICAgICAgICBhcmd1bWVudHMuaW5zZXJ0KDAsIG1fb3V0LmNvbnN0
SW50MzIoc2l6ZU9mR2V0QnlJZCgpKSk7CisgICAgICAgIGFyZ3VtZW50cy5pbnNlcnQoMCwgbV9v
dXQuY29uc3RJbnQ2NChzdGFja21hcElEKSk7IAorCisgICAgICAgIExWYWx1ZSBjYWxsID0gbV9v
dXQuY2FsbChtX291dC5wYXRjaHBvaW50SW50NjRJbnRyaW5zaWMoKSwgYXJndW1lbnRzKTsKICAg
ICAgICAgc2V0SW5zdHJ1Y3Rpb25DYWxsaW5nQ29udmVudGlvbihjYWxsLCBMTFZNQW55UmVnQ2Fs
bENvbnYpOwogICAgICAgICAKICAgICAgICAgbV9mdGxTdGF0ZS5nZXRCeUlkcy5hcHBlbmQoR2V0
QnlJZERlc2NyaXB0b3Ioc3RhY2ttYXBJRCwgbV9ub2RlLT5vcmlnaW4uc2VtYW50aWMsIHVpZCkp
OwpAQCAtNzUxNywxMiArNzU4OSwxNSBAQCBwcml2YXRlOgogICAgIHsKICAgICAgICAgdW5zaWdu
ZWQgc3RhY2ttYXBJRCA9IG1fc3RhY2ttYXBJRHMrKzsKIAotICAgICAgICBWZWN0b3I8TFZhbHVl
PiBhcmd1bWVudHM7CisgICAgICAgIEV4aXRBcmd1bWVudExpc3QgYXJndW1lbnRzOwogICAgICAg
ICBhcmd1bWVudHMuYXBwZW5kKG1fb3V0LmNvbnN0SW50NjQoc3RhY2ttYXBJRCkpOwogICAgICAg
ICBhcmd1bWVudHMuYXBwZW5kKG1fb3V0LmNvbnN0SW50MzIoTWFjcm9Bc3NlbWJsZXI6Om1heEp1
bXBSZXBsYWNlbWVudFNpemUoKSkpOwogICAgICAgICBhcmd1bWVudHMuYXBwZW5kKGNvbnN0TnVs
bChtX291dC5yZWY4KSk7CiAgICAgICAgIGFyZ3VtZW50cy5hcHBlbmQobV9vdXQuY29uc3RJbnQz
Mih1c2VyQXJndW1lbnRzLnNpemUoKSkpOwogICAgICAgICBhcmd1bWVudHMuYXBwZW5kVmVjdG9y
KHVzZXJBcmd1bWVudHMpOworCisgICAgICAgIGFwcGVuZE9TUkV4aXRBcmd1bWVudHNGb3JQYXRj
aHBvaW50SWZXaWxsQ2F0Y2hFeGNlcHRpb24oYXJndW1lbnRzLCBMTFZNQW55UmVnQ2FsbENvbnYs
IHVzZXJBcmd1bWVudHMuc2l6ZSgpICsgMSwgdHJ1ZSk7IC8vIEFsbCB0aGUgYXJndW1lbnRzIHBs
dXMgdGhlIHJlc3VsdCBzaG93IHVwIGluIHRoZSBzdGFja21hcCBsb2NhdGlvbnMuCisKICAgICAg
ICAgTFZhbHVlIGNhbGwgPSBtX291dC5jYWxsKG1fb3V0LnBhdGNocG9pbnRJbnQ2NEludHJpbnNp
YygpLCBhcmd1bWVudHMpOwogICAgICAgICBzZXRJbnN0cnVjdGlvbkNhbGxpbmdDb252ZW50aW9u
KGNhbGwsIExMVk1BbnlSZWdDYWxsQ29udik7CiAgICAgICAgIApAQCAtNzUzNyw3ICs3NjEyLDcg
QEAgcHJpdmF0ZToKICAgICB2b2lkIHNwZWN1bGF0ZSgKICAgICAgICAgRXhpdEtpbmQga2luZCwg
Rm9ybWF0dGVkVmFsdWUgbG93VmFsdWUsIE5vZGUqIGhpZ2hWYWx1ZSwgTFZhbHVlIGZhaWxDb25k
aXRpb24pCiAgICAgewotICAgICAgICBhcHBlbmRPU1JFeGl0KGtpbmQsIGxvd1ZhbHVlLCBoaWdo
VmFsdWUsIGZhaWxDb25kaXRpb24pOworICAgICAgICBhcHBlbmRPU1JFeGl0KGtpbmQsIGxvd1Zh
bHVlLCBoaWdoVmFsdWUsIGZhaWxDb25kaXRpb24sIG1fb3JpZ2luKTsKICAgICB9CiAgICAgCiAg
ICAgdm9pZCB0ZXJtaW5hdGUoRXhpdEtpbmQga2luZCkKQEAgLTc1NjUsNyArNzY0MCw3IEBAIHBy
aXZhdGU6CiAgICAgICAgIGlmICghbV9pbnRlcnByZXRlci5uZWVkc1R5cGVDaGVjayhoaWdoVmFs
dWUsIHR5cGVzUGFzc2VkVGhyb3VnaCkpCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIEFT
U0VSVChtYXlIYXZlVHlwZUNoZWNrKGhpZ2hWYWx1ZS51c2VLaW5kKCkpKTsKLSAgICAgICAgYXBw
ZW5kT1NSRXhpdChCYWRUeXBlLCBsb3dWYWx1ZSwgaGlnaFZhbHVlLm5vZGUoKSwgZmFpbENvbmRp
dGlvbik7CisgICAgICAgIGFwcGVuZE9TUkV4aXQoQmFkVHlwZSwgbG93VmFsdWUsIGhpZ2hWYWx1
ZS5ub2RlKCksIGZhaWxDb25kaXRpb24sIG1fb3JpZ2luKTsKICAgICAgICAgbV9pbnRlcnByZXRl
ci5maWx0ZXIoaGlnaFZhbHVlLCB0eXBlc1Bhc3NlZFRocm91Z2gpOwogICAgIH0KICAgICAKQEAg
LTg3MjIsOSArODc5Nyw5IEBAIHByaXZhdGU6CiAKICAgICB2b2lkIGNhbGxQcmVmbGlnaHQoQ29k
ZU9yaWdpbiBjb2RlT3JpZ2luKQogICAgIHsKKyAgICAgICAgQ2FsbFNpdGVJbmRleCBjYWxsU2l0
ZUluZGV4ID0gbV9mdGxTdGF0ZS5qaXRDb2RlLT5jb21tb24uYWRkQ29kZU9yaWdpbihjb2RlT3Jp
Z2luKTsKICAgICAgICAgbV9vdXQuc3RvcmUzMigKLSAgICAgICAgICAgIG1fb3V0LmNvbnN0SW50
MzIoCi0gICAgICAgICAgICAgICAgbV9mdGxTdGF0ZS5qaXRDb2RlLT5jb21tb24uYWRkQ29kZU9y
aWdpbihjb2RlT3JpZ2luKS5iaXRzKCkpLAorICAgICAgICAgICAgbV9vdXQuY29uc3RJbnQzMihj
YWxsU2l0ZUluZGV4LmJpdHMoKSksCiAgICAgICAgICAgICB0YWdGb3IoSlNTdGFjazo6QXJndW1l
bnRDb3VudCkpOwogICAgIH0KIApAQCAtODc1NSwyMyArODgzMCw4MSBAQCBwcml2YXRlOgogICAg
ICAgICBpZiAoT3B0aW9uczo6dXNlRXhjZXB0aW9uRnV6eigpKQogICAgICAgICAgICAgbV9vdXQu
Y2FsbChtX291dC5vcGVyYXRpb24ob3BlcmF0aW9uRXhjZXB0aW9uRnV6eiksIG1fY2FsbEZyYW1l
KTsKICAgICAgICAgCi0gICAgICAgIExCYXNpY0Jsb2NrIGNvbnRpbnVhdGlvbiA9IEZUTF9ORVdf
QkxPQ0sobV9vdXQsICgiRXhjZXB0aW9uIGNoZWNrIGNvbnRpbnVhdGlvbiIpKTsKLSAgICAgICAg
CiAgICAgICAgIExWYWx1ZSBleGNlcHRpb24gPSBtX291dC5sb2FkNjQobV9vdXQuYWJzb2x1dGUo
dm0oKS5hZGRyZXNzT2ZFeGNlcHRpb24oKSkpOwotICAgICAgICAKKyAgICAgICAgTFZhbHVlIGhh
ZEV4Y2VwdGlvbiA9IG1fb3V0Lm5vdFplcm82NChleGNlcHRpb24pOworCisgICAgICAgIGJvb2wg
ZW1pdHRlZEV4Y2VwdGlvbkhhbmRsaW5nQ29kZUZvck9TUkV4aXQgPSBlbWl0QnJhbmNoVG9PU1JF
eGl0SWZXaWxsQ2F0Y2hFeGNlcHRpb24oaGFkRXhjZXB0aW9uKTsKKyAgICAgICAgaWYgKGVtaXR0
ZWRFeGNlcHRpb25IYW5kbGluZ0NvZGVGb3JPU1JFeGl0KSAvLyBJdCBhbHJlYWR5IHRvb2sgY2Fy
ZSBvZiBleGNlcHRpb24gaGFuZGxpbmcgbG9naWMuCisgICAgICAgICAgICByZXR1cm47CisKKyAg
ICAgICAgTEJhc2ljQmxvY2sgY29udGludWF0aW9uID0gRlRMX05FV19CTE9DSyhtX291dCwgKCJF
eGNlcHRpb24gY2hlY2sgY29udGludWF0aW9uIikpOworCiAgICAgICAgIG1fb3V0LmJyYW5jaCgK
LSAgICAgICAgICAgIG1fb3V0Lm5vdFplcm82NChleGNlcHRpb24pLCByYXJlbHkobV9oYW5kbGVF
eGNlcHRpb25zKSwgdXN1YWxseShjb250aW51YXRpb24pKTsKLSAgICAgICAgCisgICAgICAgICAg
ICBoYWRFeGNlcHRpb24sIHJhcmVseShtX2hhbmRsZUV4Y2VwdGlvbnMpLCB1c3VhbGx5KGNvbnRp
bnVhdGlvbikpOworCiAgICAgICAgIG1fb3V0LmFwcGVuZFRvKGNvbnRpbnVhdGlvbik7CiAgICAg
fQorCisgICAgdm9pZCBhcHBlbmRPU1JFeGl0QXJndW1lbnRzRm9yUGF0Y2hwb2ludElmV2lsbENh
dGNoRXhjZXB0aW9uKEV4aXRBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgTENhbGxDb252IGNhbGxp
bmdDb252ZW50aW9uLCB1bnNpZ25lZCBvZmZzZXRPZkV4aXRBcmd1bWVudHMsIGJvb2wgaXNMYXp5
U2xvd1BhdGggPSBmYWxzZSwgYm9vbCBpc0dldEJ5ZElkID0gZmFsc2UpCisgICAgeworICAgICAg
ICBDb2RlT3JpZ2luIG9wQ2F0Y2hPcmlnaW47CisgICAgICAgIEhhbmRsZXJJbmZvKiBleGNlcHRp
b25IYW5kbGVyOworICAgICAgICBib29sIHdpbGxDYXRjaEV4Y2VwdGlvbiA9IG1fZ3JhcGgud2ls
bENhdGNoRXhjZXB0aW9uSW5NYWNoaW5lRnJhbWUobV9vcmlnaW4uZm9yRXhpdCwgb3BDYXRjaE9y
aWdpbiwgZXhjZXB0aW9uSGFuZGxlcik7CisgICAgICAgIGlmICghd2lsbENhdGNoRXhjZXB0aW9u
KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGFwcGVuZE9TUkV4aXREZXNjcmlwdG9y
KFVuY291bnRhYmxlLCBub1ZhbHVlKCksIG51bGxwdHIsIG1fb3JpZ2luLndpdGhGb3JFeGl0QW5k
RXhpdE9LKG9wQ2F0Y2hPcmlnaW4sIHRydWUpKTsKKyAgICAgICAgT1NSRXhpdERlc2NyaXB0b3Im
IGV4aXREZXNjcmlwdG9yID0gbV9mdGxTdGF0ZS5qaXRDb2RlLT5vc3JFeGl0RGVzY3JpcHRvcnMu
bGFzdCgpOworICAgICAgICBleGl0RGVzY3JpcHRvci5tX3NlbWFudGljQ29kZU9yaWdpbkZvckNh
bGxGcmFtZUhlYWRlciA9IGNvZGVPcmlnaW5EZXNjcmlwdGlvbk9mQ2FsbFNpdGUoKTsKKyAgICAg
ICAgZXhpdERlc2NyaXB0b3IubV9pc0V4Y2VwdGlvbkhhbmRsZXIgPSB0cnVlOworICAgICAgICBl
eGl0RGVzY3JpcHRvci5tX3dpbGxBcnJpdmVBdE9TUkV4aXRGcm9tR2VuZXJpY1Vud2luZCA9ICFp
c0xhenlTbG93UGF0aDsKKyAgICAgICAgZXhpdERlc2NyaXB0b3IubV9pc0V4Y2VwdGlvbkZyb21M
YXp5U2xvd1BhdGggPSBpc0xhenlTbG93UGF0aDsKKyAgICAgICAgZXhpdERlc2NyaXB0b3IubV9p
c0V4Y2VwdGlvbkZyb21KU0NhbGwgPSBjYWxsaW5nQ29udmVudGlvbiA9PSBMTFZNV2ViS2l0SlND
YWxsQ29udiB8fCBjYWxsaW5nQ29udmVudGlvbiA9PSBMTFZNQ0NhbGxDb252OworICAgICAgICBl
eGl0RGVzY3JpcHRvci5tX2lzRXhjZXB0aW9uRnJvbUdldEJ5SWQgPSBpc0dldEJ5ZElkOworICAg
ICAgICBleGl0RGVzY3JpcHRvci5tX2Jhc2VsaW5lRXhjZXB0aW9uSGFuZGxlciA9ICpleGNlcHRp
b25IYW5kbGVyOworICAgICAgICBleGl0RGVzY3JpcHRvci5tX3N0YWNrbWFwSUQgPSBtX3N0YWNr
bWFwSURzIC0gMTsKKworICAgICAgICBFeGl0QXJndW1lbnRMaXN0IGZyZXNoTGlzdDsKKyAgICAg
ICAgYnVpbGRFeGl0QXJndW1lbnRzKGV4aXREZXNjcmlwdG9yLCBmcmVzaExpc3QsIG5vVmFsdWUo
KSwgZXhpdERlc2NyaXB0b3IubV9jb2RlT3JpZ2luKTsKKyAgICAgICAgYXJndW1lbnRzLmFwcGVu
ZFZlY3RvcihmcmVzaExpc3QpOworCisgICAgICAgIGlmIChvZmZzZXRPZkV4aXRBcmd1bWVudHMp
IHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXhpdERlc2NyaXB0b3IubV92
YWx1ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZXhpdERlc2NyaXB0b3Iu
bV92YWx1ZXNbaV0uaGFzSW5kZXhJblN0YWNrbWFwTG9jYXRpb25zKCkpCisgICAgICAgICAgICAg
ICAgICAgIGV4aXREZXNjcmlwdG9yLm1fdmFsdWVzW2ldLmFkanVzdFN0YWNrbWFwTG9jYXRpb25z
SW5kZXhCeU9mZnNldChvZmZzZXRPZkV4aXRBcmd1bWVudHMpOworICAgICAgICAgICAgfQorICAg
ICAgICB9CisgICAgfQorCisgICAgYm9vbCBlbWl0QnJhbmNoVG9PU1JFeGl0SWZXaWxsQ2F0Y2hF
eGNlcHRpb24oTFZhbHVlIGhhZEV4Y2VwdGlvbikKKyAgICB7CisgICAgICAgIENvZGVPcmlnaW4g
b3BDYXRjaE9yaWdpbjsKKyAgICAgICAgSGFuZGxlckluZm8qIGV4Y2VwdGlvbkhhbmRsZXI7Cisg
ICAgICAgIGJvb2wgd2lsbENhdGNoRXhjZXB0aW9uID0gbV9ncmFwaC53aWxsQ2F0Y2hFeGNlcHRp
b25Jbk1hY2hpbmVGcmFtZShtX29yaWdpbi5mb3JFeGl0LCBvcENhdGNoT3JpZ2luLCBleGNlcHRp
b25IYW5kbGVyKTsgCisgICAgICAgIGlmICghd2lsbENhdGNoRXhjZXB0aW9uKQorICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGFwcGVuZE9TUkV4aXQoVW5jb3VudGFibGUsIG5v
VmFsdWUoKSwgbnVsbHB0ciwgaGFkRXhjZXB0aW9uLCBtX29yaWdpbi53aXRoRm9yRXhpdEFuZEV4
aXRPSyhvcENhdGNoT3JpZ2luLCB0cnVlKSwgdHJ1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIH0KICAgICAKICAgICBMQmFzaWNCbG9jayBsb3dCbG9jayhCYXNpY0Jsb2NrKiBibG9jaykK
ICAgICB7CiAgICAgICAgIHJldHVybiBtX2Jsb2Nrcy5nZXQoYmxvY2spOwogICAgIH0KKworICAg
IHZvaWQgYXBwZW5kT1NSRXhpdERlc2NyaXB0b3IoRXhpdEtpbmQga2luZCwgRm9ybWF0dGVkVmFs
dWUgbG93VmFsdWUsIE5vZGUqIGhpZ2hWYWx1ZSwgTm9kZU9yaWdpbiBvcmlnaW4pCisgICAgewor
ICAgICAgICBtX2Z0bFN0YXRlLmppdENvZGUtPm9zckV4aXREZXNjcmlwdG9ycy5hcHBlbmQoT1NS
RXhpdERlc2NyaXB0b3IoCisgICAgICAgICAgICBraW5kLCBsb3dWYWx1ZS5mb3JtYXQoKSwgbV9n
cmFwaC5tZXRob2RPZkdldHRpbmdBVmFsdWVQcm9maWxlRm9yKGhpZ2hWYWx1ZSksCisgICAgICAg
ICAgICBvcmlnaW4uZm9yRXhpdCwgb3JpZ2luLnNlbWFudGljLAorICAgICAgICAgICAgYXZhaWxh
YmlsaXR5TWFwKCkubV9sb2NhbHMubnVtYmVyT2ZBcmd1bWVudHMoKSwKKyAgICAgICAgICAgIGF2
YWlsYWJpbGl0eU1hcCgpLm1fbG9jYWxzLm51bWJlck9mTG9jYWxzKCkpKTsKKyAgICB9CiAgICAg
CiAgICAgdm9pZCBhcHBlbmRPU1JFeGl0KAotICAgICAgICBFeGl0S2luZCBraW5kLCBGb3JtYXR0
ZWRWYWx1ZSBsb3dWYWx1ZSwgTm9kZSogaGlnaFZhbHVlLCBMVmFsdWUgZmFpbENvbmRpdGlvbikK
KyAgICAgICAgRXhpdEtpbmQga2luZCwgRm9ybWF0dGVkVmFsdWUgbG93VmFsdWUsIE5vZGUqIGhp
Z2hWYWx1ZSwgTFZhbHVlIGZhaWxDb25kaXRpb24sIAorICAgICAgICBOb2RlT3JpZ2luIG9yaWdp
biwgYm9vbCBpc0V4Y2VwdGlvbkhhbmRsZXIgPSBmYWxzZSkKICAgICB7CiAgICAgICAgIGlmICh2
ZXJib3NlQ29tcGlsYXRpb25FbmFibGVkKCkpIHsKICAgICAgICAgICAgIGRhdGFMb2coIiAgICBP
U1IgZXhpdCAjIiwgbV9mdGxTdGF0ZS5qaXRDb2RlLT5vc3JFeGl0RGVzY3JpcHRvcnMuc2l6ZSgp
LCAiIHdpdGggYXZhaWxhYmlsaXR5OiAiLCBhdmFpbGFiaWxpdHlNYXAoKSwgIlxuIik7CkBAIC04
Nzc5LDkgKzg5MTIsOSBAQCBwcml2YXRlOgogICAgICAgICAgICAgICAgIGRhdGFMb2coIiAgICAg
ICAgQXZhaWxhYmxlIHJlY292ZXJpZXM6ICIsIGxpc3REdW1wKG1fYXZhaWxhYmxlUmVjb3Zlcmll
cyksICJcbiIpOwogICAgICAgICB9CiAKLSAgICAgICAgREZHX0FTU0VSVChtX2dyYXBoLCBtX25v
ZGUsIG1fb3JpZ2luLmV4aXRPSyk7CisgICAgICAgIERGR19BU1NFUlQobV9ncmFwaCwgbV9ub2Rl
LCBvcmlnaW4uZXhpdE9LKTsKICAgICAgICAgCi0gICAgICAgIGlmIChkb09TUkV4aXRGdXp6aW5n
KCkpIHsKKyAgICAgICAgaWYgKGRvT1NSRXhpdEZ1enppbmcoKSAmJiAhaXNFeGNlcHRpb25IYW5k
bGVyKSB7CiAgICAgICAgICAgICBMVmFsdWUgbnVtYmVyT2ZGdXp6Q2hlY2tzID0gbV9vdXQuYWRk
KAogICAgICAgICAgICAgICAgIG1fb3V0LmxvYWQzMihtX291dC5hYnNvbHV0ZSgmZ19udW1iZXJP
Zk9TUkV4aXRGdXp6Q2hlY2tzKSksCiAgICAgICAgICAgICAgICAgbV9vdXQuaW50MzJPbmUpOwpA
QCAtODgwMywxMyArODkzNiw5IEBAIHByaXZhdGU6CiAgICAgICAgIGlmIChmYWlsQ29uZGl0aW9u
ID09IG1fb3V0LmJvb2xlYW5GYWxzZSkKICAgICAgICAgICAgIHJldHVybjsKIAotICAgICAgICBt
X2Z0bFN0YXRlLmppdENvZGUtPm9zckV4aXREZXNjcmlwdG9ycy5hcHBlbmQoT1NSRXhpdERlc2Ny
aXB0b3IoCi0gICAgICAgICAgICBraW5kLCBsb3dWYWx1ZS5mb3JtYXQoKSwgbV9ncmFwaC5tZXRo
b2RPZkdldHRpbmdBVmFsdWVQcm9maWxlRm9yKGhpZ2hWYWx1ZSksCi0gICAgICAgICAgICBtX29y
aWdpbi5mb3JFeGl0LCBtX29yaWdpbi5zZW1hbnRpYywKLSAgICAgICAgICAgIGF2YWlsYWJpbGl0
eU1hcCgpLm1fbG9jYWxzLm51bWJlck9mQXJndW1lbnRzKCksCi0gICAgICAgICAgICBhdmFpbGFi
aWxpdHlNYXAoKS5tX2xvY2Fscy5udW1iZXJPZkxvY2FscygpKSk7Ci0KKyAgICAgICAgYXBwZW5k
T1NSRXhpdERlc2NyaXB0b3Ioa2luZCwgbG93VmFsdWUsIGhpZ2hWYWx1ZSwgb3JpZ2luKTsKICAg
ICAgICAgT1NSRXhpdERlc2NyaXB0b3ImIGV4aXREZXNjcmlwdG9yID0gbV9mdGxTdGF0ZS5qaXRD
b2RlLT5vc3JFeGl0RGVzY3JpcHRvcnMubGFzdCgpOworICAgICAgICBleGl0RGVzY3JpcHRvci5t
X2lzRXhjZXB0aW9uSGFuZGxlciA9IGlzRXhjZXB0aW9uSGFuZGxlcjsKIAogICAgICAgICBpZiAo
ZmFpbENvbmRpdGlvbiA9PSBtX291dC5ib29sZWFuVHJ1ZSkgewogICAgICAgICAgICAgZW1pdE9T
UkV4aXRDYWxsKGV4aXREZXNjcmlwdG9yLCBsb3dWYWx1ZSk7CkBAIC04OTc3LDcgKzkxMDYsNiBA
QCBwcml2YXRlOgogICAgICAgICAgICAgQXZhaWxhYmxlUmVjb3ZlcnkgcmVjb3ZlcnkgPSBtX2F2
YWlsYWJsZVJlY292ZXJpZXNbaV07CiAgICAgICAgICAgICBpZiAocmVjb3Zlcnkubm9kZSgpICE9
IG5vZGUpCiAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAKICAgICAgICAg
ICAgIEV4aXRWYWx1ZSByZXN1bHQgPSBFeGl0VmFsdWU6OnJlY292ZXJ5KAogICAgICAgICAgICAg
ICAgIHJlY292ZXJ5Lm9wY29kZSgpLCBhcmd1bWVudHMuc2l6ZSgpLCBhcmd1bWVudHMuc2l6ZSgp
ICsgMSwKICAgICAgICAgICAgICAgICByZWNvdmVyeS5mb3JtYXQoKSk7CkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvZnRsL0ZUTE9TUkV4aXQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9mdGwvRlRMT1NSRXhpdC5jcHAJKHJldmlzaW9uIDE5MTkzMSkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMT1NSRXhpdC5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlICJGVExFeGl0QXJndW1lbnQuaCIKICNpbmNsdWRlICJG
VExFeGl0QXJndW1lbnRMaXN0LmgiCiAjaW5jbHVkZSAiRlRMSklUQ29kZS5oIgorI2luY2x1ZGUg
IkZUTExvY2F0aW9uLmgiCiAjaW5jbHVkZSAiSlNDSW5saW5lcy5oIgogCiBuYW1lc3BhY2UgSlND
IHsgbmFtZXNwYWNlIEZUTCB7CkBAIC01Miw2ICs1MywxMSBAQCBPU1JFeGl0RGVzY3JpcHRvcjo6
T1NSRXhpdERlc2NyaXB0b3IoCiAgICAgLCBtX3ZhbHVlUHJvZmlsZSh2YWx1ZVByb2ZpbGUpCiAg
ICAgLCBtX3ZhbHVlcyhudW1iZXJPZkFyZ3VtZW50cywgbnVtYmVyT2ZMb2NhbHMpCiAgICAgLCBt
X2lzSW52YWxpZGF0aW9uUG9pbnQoZmFsc2UpCisgICAgLCBtX2lzRXhjZXB0aW9uSGFuZGxlcihm
YWxzZSkKKyAgICAsIG1fd2lsbEFycml2ZUF0T1NSRXhpdEZyb21HZW5lcmljVW53aW5kKGZhbHNl
KQorICAgICwgbV9pc0V4Y2VwdGlvbkZyb21KU0NhbGwoZmFsc2UpCisgICAgLCBtX2lzRXhjZXB0
aW9uRnJvbUdldEJ5SWQoZmFsc2UpCisgICAgLCBtX2lzRXhjZXB0aW9uRnJvbUxhenlTbG93UGF0
aChmYWxzZSkKIHsKIH0KIApAQCAtNzAsNiArNzYsNyBAQCBPU1JFeGl0OjpPU1JFeGl0KE9TUkV4
aXREZXNjcmlwdG9yJiBkZXNjCiAgICAgLCBtX2Rlc2NyaXB0b3IoZGVzY3JpcHRvcikKICAgICAs
IG1fc3RhY2ttYXBSZWNvcmRJbmRleChzdGFja21hcFJlY29yZEluZGV4KQogeworICAgIG1faXNF
eGNlcHRpb25IYW5kbGVyID0gZGVzY3JpcHRvci5tX2lzRXhjZXB0aW9uSGFuZGxlcjsKIH0KIAog
Q29kZUxvY2F0aW9uSnVtcCBPU1JFeGl0Ojpjb2RlTG9jYXRpb25Gb3JSZXBhdGNoKENvZGVCbG9j
ayogZnRsQ29kZUJsb2NrKSBjb25zdApAQCAtODAsNiArODcsNzYgQEAgQ29kZUxvY2F0aW9uSnVt
cCBPU1JFeGl0Ojpjb2RlTG9jYXRpb25GbwogICAgICAgICBtX3BhdGNoYWJsZUNvZGVPZmZzZXQp
OwogfQogCit2b2lkIE9TUkV4aXQ6OmdhdGhlclJlZ2lzdGVyc1RvU3BpbGxGb3JDYWxsSWZFeGNl
cHRpb24oU3RhY2tNYXBzJiBzdGFja21hcHMsIFN0YWNrTWFwczo6UmVjb3JkJiByZWNvcmQpCit7
CisgICAgUkVMRUFTRV9BU1NFUlQobV9kZXNjcmlwdG9yLm1faXNFeGNlcHRpb25Gcm9tSlNDYWxs
KTsKKworICAgIFJlZ2lzdGVyU2V0IHZvbGF0aWxlUmVnaXN0ZXJzID0gUmVnaXN0ZXJTZXQ6OnZv
bGF0aWxlUmVnaXN0ZXJzRm9ySlNDYWxsKCk7CisKKyAgICBhdXRvIGFkZE5lZWRlZFJlZ2lzdGVy
cyA9IFsmXSAoY29uc3QgRXhpdFZhbHVlJiBleGl0VmFsdWUpIHsKKyAgICAgICAgYXV0byBoYW5k
bGVMb2NhdGlvbiA9IFsmXSAoY29uc3QgRlRMOjpMb2NhdGlvbiYgbG9jYXRpb24pIHsKKyAgICAg
ICAgICAgIGlmIChsb2NhdGlvbi5pbnZvbHZlc0dQUigpICYmIHZvbGF0aWxlUmVnaXN0ZXJzLmdl
dChsb2NhdGlvbi5ncHIoKSkpCisgICAgICAgICAgICAgICAgdGhpcy0+cmVnaXN0ZXJzVG9QcmVz
ZXJ2ZUZvckNhbGxUaGF0TWlnaHRUaHJvdy5zZXQobG9jYXRpb24uZ3ByKCkpOworICAgICAgICAg
ICAgZWxzZSBpZiAobG9jYXRpb24uaXNGUFIoKSAmJiB2b2xhdGlsZVJlZ2lzdGVycy5nZXQobG9j
YXRpb24uZnByKCkpKQorICAgICAgICAgICAgICAgIHRoaXMtPnJlZ2lzdGVyc1RvUHJlc2VydmVG
b3JDYWxsVGhhdE1pZ2h0VGhyb3cuc2V0KGxvY2F0aW9uLmZwcigpKTsKKyAgICAgICAgfTsKKwor
ICAgICAgICBzd2l0Y2ggKGV4aXRWYWx1ZS5raW5kKCkpIHsKKyAgICAgICAgY2FzZSBFeGl0VmFs
dWVBcmd1bWVudDoKKyAgICAgICAgICAgIGhhbmRsZUxvY2F0aW9uKEZUTDo6TG9jYXRpb246OmZv
clN0YWNrbWFwcygmc3RhY2ttYXBzLCByZWNvcmQubG9jYXRpb25zW2V4aXRWYWx1ZS5leGl0QXJn
dW1lbnQoKS5hcmd1bWVudCgpXSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ug
RXhpdFZhbHVlUmVjb3Zlcnk6CisgICAgICAgICAgICBoYW5kbGVMb2NhdGlvbihGVEw6OkxvY2F0
aW9uOjpmb3JTdGFja21hcHMoJnN0YWNrbWFwcywgcmVjb3JkLmxvY2F0aW9uc1tleGl0VmFsdWUu
cmlnaHRSZWNvdmVyeUFyZ3VtZW50KCldKSk7CisgICAgICAgICAgICBoYW5kbGVMb2NhdGlvbihG
VEw6OkxvY2F0aW9uOjpmb3JTdGFja21hcHMoJnN0YWNrbWFwcywgcmVjb3JkLmxvY2F0aW9uc1tl
eGl0VmFsdWUubGVmdFJlY292ZXJ5QXJndW1lbnQoKV0pKTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Owor
ICAgIGZvciAoRXhpdFRpbWVPYmplY3RNYXRlcmlhbGl6YXRpb24qIG1hdGVyaWFsaXphdGlvbiA6
IG1fZGVzY3JpcHRvci5tX21hdGVyaWFsaXphdGlvbnMpIHsKKyAgICAgICAgZm9yICh1bnNpZ25l
ZCBwcm9wZXJ0eUluZGV4ID0gbWF0ZXJpYWxpemF0aW9uLT5wcm9wZXJ0aWVzKCkuc2l6ZSgpOyBw
cm9wZXJ0eUluZGV4LS07KQorICAgICAgICAgICAgYWRkTmVlZGVkUmVnaXN0ZXJzKG1hdGVyaWFs
aXphdGlvbi0+cHJvcGVydGllcygpW3Byb3BlcnR5SW5kZXhdLnZhbHVlKCkpOworICAgIH0KKyAg
ICBmb3IgKHVuc2lnbmVkIGluZGV4ID0gbV9kZXNjcmlwdG9yLm1fdmFsdWVzLnNpemUoKTsgaW5k
ZXgtLTspCisgICAgICAgIGFkZE5lZWRlZFJlZ2lzdGVycyhtX2Rlc2NyaXB0b3IubV92YWx1ZXNb
aW5kZXhdKTsKK30KKwordm9pZCBPU1JFeGl0OjpzcGlsbFJlZ2lzdGVyc1RvU3BpbGxTbG90KEND
YWxsSGVscGVycyYgaml0LCBpbnQzMl90IHN0YWNrU3BpbGxTbG90KQoreworICAgIFJFTEVBU0Vf
QVNTRVJUKG1fZGVzY3JpcHRvci5tX2lzRXhjZXB0aW9uRnJvbUpTQ2FsbCB8fCBtX2Rlc2NyaXB0
b3IubV9pc0V4Y2VwdGlvbkZyb21HZXRCeUlkKTsKKyAgICB1bnNpZ25lZCBjb3VudCA9IDA7Cisg
ICAgZm9yIChHUFJSZWcgcmVnID0gTWFjcm9Bc3NlbWJsZXI6OmZpcnN0UmVnaXN0ZXIoKTsgcmVn
IDw9IE1hY3JvQXNzZW1ibGVyOjpsYXN0UmVnaXN0ZXIoKTsgcmVnID0gTWFjcm9Bc3NlbWJsZXI6
Om5leHRSZWdpc3RlcihyZWcpKSB7CisgICAgICAgIGlmIChyZWdpc3RlcnNUb1ByZXNlcnZlRm9y
Q2FsbFRoYXRNaWdodFRocm93LmdldChyZWcpKSB7CisgICAgICAgICAgICBqaXQuc3RvcmU2NChy
ZWcsIENDYWxsSGVscGVyczo6YWRkcmVzc0ZvcihzdGFja1NwaWxsU2xvdCArIGNvdW50KSk7Cisg
ICAgICAgICAgICBjb3VudCsrOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoRlBSUmVnIHJl
ZyA9IE1hY3JvQXNzZW1ibGVyOjpmaXJzdEZQUmVnaXN0ZXIoKTsgcmVnIDw9IE1hY3JvQXNzZW1i
bGVyOjpsYXN0RlBSZWdpc3RlcigpOyByZWcgPSBNYWNyb0Fzc2VtYmxlcjo6bmV4dEZQUmVnaXN0
ZXIocmVnKSkgeworICAgICAgICBpZiAocmVnaXN0ZXJzVG9QcmVzZXJ2ZUZvckNhbGxUaGF0TWln
aHRUaHJvdy5nZXQocmVnKSkgeworICAgICAgICAgICAgaml0LnN0b3JlRG91YmxlKHJlZywgQ0Nh
bGxIZWxwZXJzOjphZGRyZXNzRm9yKHN0YWNrU3BpbGxTbG90ICsgY291bnQpKTsKKyAgICAgICAg
ICAgIGNvdW50Kys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgT1NSRXhpdDo6cmVjb3Zl
clJlZ2lzdGVyc0Zyb21TcGlsbFNsb3QoQ0NhbGxIZWxwZXJzJiBqaXQsIGludDMyX3Qgc3RhY2tT
cGlsbFNsb3QpCit7CisgICAgUkVMRUFTRV9BU1NFUlQobV9kZXNjcmlwdG9yLm1faXNFeGNlcHRp
b25Gcm9tSlNDYWxsIHx8IG1fZGVzY3JpcHRvci5tX2lzRXhjZXB0aW9uRnJvbUdldEJ5SWQpOwor
ICAgIHVuc2lnbmVkIGNvdW50ID0gMDsKKyAgICBmb3IgKEdQUlJlZyByZWcgPSBNYWNyb0Fzc2Vt
Ymxlcjo6Zmlyc3RSZWdpc3RlcigpOyByZWcgPD0gTWFjcm9Bc3NlbWJsZXI6Omxhc3RSZWdpc3Rl
cigpOyByZWcgPSBNYWNyb0Fzc2VtYmxlcjo6bmV4dFJlZ2lzdGVyKHJlZykpIHsKKyAgICAgICAg
aWYgKHJlZ2lzdGVyc1RvUHJlc2VydmVGb3JDYWxsVGhhdE1pZ2h0VGhyb3cuZ2V0KHJlZykpIHsK
KyAgICAgICAgICAgIGppdC5sb2FkNjQoQ0NhbGxIZWxwZXJzOjphZGRyZXNzRm9yKHN0YWNrU3Bp
bGxTbG90ICsgY291bnQpLCByZWcpOworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfQor
ICAgIH0KKyAgICBmb3IgKEZQUlJlZyByZWcgPSBNYWNyb0Fzc2VtYmxlcjo6Zmlyc3RGUFJlZ2lz
dGVyKCk7IHJlZyA8PSBNYWNyb0Fzc2VtYmxlcjo6bGFzdEZQUmVnaXN0ZXIoKTsgcmVnID0gTWFj
cm9Bc3NlbWJsZXI6Om5leHRGUFJlZ2lzdGVyKHJlZykpIHsKKyAgICAgICAgaWYgKHJlZ2lzdGVy
c1RvUHJlc2VydmVGb3JDYWxsVGhhdE1pZ2h0VGhyb3cuZ2V0KHJlZykpIHsKKyAgICAgICAgICAg
IGppdC5sb2FkRG91YmxlKENDYWxsSGVscGVyczo6YWRkcmVzc0ZvcihzdGFja1NwaWxsU2xvdCAr
IGNvdW50KSwgcmVnKTsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIH0KKyAgICB9Cit9
CisKIH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpGVEwKIAogI2VuZGlmIC8vIEVOQUJMRShGVExfSklU
KQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExPU1JFeGl0LmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExPU1JFeGl0LmgJKHJldmlzaW9uIDE5
MTkzMSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMT1NSRXhpdC5oCSh3b3JraW5n
IGNvcHkpCkBAIC0zNiw4ICszNiwxMSBAQAogI2luY2x1ZGUgIkZUTEV4aXRUaW1lT2JqZWN0TWF0
ZXJpYWxpemF0aW9uLmgiCiAjaW5jbHVkZSAiRlRMRXhpdFZhbHVlLmgiCiAjaW5jbHVkZSAiRlRM
Rm9ybWF0dGVkVmFsdWUuaCIKKyNpbmNsdWRlICJGVExTdGFja01hcHMuaCIKKyNpbmNsdWRlICJI
YW5kbGVySW5mby5oIgogI2luY2x1ZGUgIk1ldGhvZE9mR2V0dGluZ0FWYWx1ZVByb2ZpbGUuaCIK
ICNpbmNsdWRlICJPcGVyYW5kcy5oIgorI2luY2x1ZGUgIlJlZy5oIgogI2luY2x1ZGUgIlZhbHVl
UHJvZmlsZS5oIgogI2luY2x1ZGUgIlZpcnR1YWxSZWdpc3Rlci5oIgogCkBAIC0xNDIsNiArMTQ1
LDcgQEAgc3RydWN0IE9TUkV4aXREZXNjcmlwdG9yIHsKICAgICBFeGl0S2luZCBtX2tpbmQ7CiAg
ICAgQ29kZU9yaWdpbiBtX2NvZGVPcmlnaW47CiAgICAgQ29kZU9yaWdpbiBtX2NvZGVPcmlnaW5G
b3JFeGl0UHJvZmlsZTsKKyAgICBDb2RlT3JpZ2luIG1fc2VtYW50aWNDb2RlT3JpZ2luRm9yQ2Fs
bEZyYW1lSGVhZGVyOwogICAgIAogICAgIC8vIFRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgZXhp
dCBjYWxsIG1heSBiZSBhIHZhbHVlIHdlIHdpc2ggdG8gcHJvZmlsZS4KICAgICAvLyBJZiB0aGF0
J3MgdGhlIGNhc2UsIHRoZSBmb3JtYXQgd2lsbCBiZSBub3QgSW52YWxpZCBhbmQgd2UnbGwgaGF2
ZSBhCkBAIC0xNTUsNyArMTU5LDEzIEBAIHN0cnVjdCBPU1JFeGl0RGVzY3JpcHRvciB7CiAgICAg
QmFnPEV4aXRUaW1lT2JqZWN0TWF0ZXJpYWxpemF0aW9uPiBtX21hdGVyaWFsaXphdGlvbnM7CiAg
ICAgCiAgICAgdWludDMyX3QgbV9zdGFja21hcElEOwotICAgIGJvb2wgbV9pc0ludmFsaWRhdGlv
blBvaW50OworICAgIEhhbmRsZXJJbmZvIG1fYmFzZWxpbmVFeGNlcHRpb25IYW5kbGVyOworICAg
IGJvb2wgbV9pc0ludmFsaWRhdGlvblBvaW50IDogMTsKKyAgICBib29sIG1faXNFeGNlcHRpb25I
YW5kbGVyIDogMTsKKyAgICBib29sIG1fd2lsbEFycml2ZUF0T1NSRXhpdEZyb21HZW5lcmljVW53
aW5kIDogMTsKKyAgICBib29sIG1faXNFeGNlcHRpb25Gcm9tSlNDYWxsIDogMTsKKyAgICBib29s
IG1faXNFeGNlcHRpb25Gcm9tR2V0QnlJZCA6IDE7CisgICAgYm9vbCBtX2lzRXhjZXB0aW9uRnJv
bUxhenlTbG93UGF0aCA6IDE7CiAgICAgCiAgICAgdm9pZCB2YWxpZGF0ZVJlZmVyZW5jZXMoY29u
c3QgVHJhY2tlZFJlZmVyZW5jZXMmKTsKIH07CkBAIC0xNzAsMTEgKzE4MCwxNyBAQCBzdHJ1Y3Qg
T1NSRXhpdCA6IHB1YmxpYyBERkc6Ok9TUkV4aXRCYXNlCiAgICAgLy8gT2Zmc2V0IHdpdGhpbiBT
dGFja21hcDo6cmVjb3JkcwogICAgIHVpbnQzMl90IG1fc3RhY2ttYXBSZWNvcmRJbmRleDsKIAor
ICAgIFJlZ2lzdGVyU2V0IHJlZ2lzdGVyc1RvUHJlc2VydmVGb3JDYWxsVGhhdE1pZ2h0VGhyb3c7
CisKICAgICBDb2RlTG9jYXRpb25KdW1wIGNvZGVMb2NhdGlvbkZvclJlcGF0Y2goQ29kZUJsb2Nr
KiBmdGxDb2RlQmxvY2spIGNvbnN0OwogICAgIHZvaWQgY29uc2lkZXJBZGRpbmdBc0ZyZXF1ZW50
RXhpdFNpdGUoQ29kZUJsb2NrKiBwcm9maWxlZENvZGVCbG9jaykKICAgICB7CiAgICAgICAgIE9T
UkV4aXRCYXNlOjpjb25zaWRlckFkZGluZ0FzRnJlcXVlbnRFeGl0U2l0ZShwcm9maWxlZENvZGVC
bG9jaywgRXhpdEZyb21GVEwpOwogICAgIH0KKworICAgIHZvaWQgZ2F0aGVyUmVnaXN0ZXJzVG9T
cGlsbEZvckNhbGxJZkV4Y2VwdGlvbihTdGFja01hcHMmLCBTdGFja01hcHM6OlJlY29yZCYpOwor
ICAgIHZvaWQgc3BpbGxSZWdpc3RlcnNUb1NwaWxsU2xvdChDQ2FsbEhlbHBlcnMmLCBpbnQzMl90
IHN0YWNrU3BpbGxTbG90KTsKKyAgICB2b2lkIHJlY292ZXJSZWdpc3RlcnNGcm9tU3BpbGxTbG90
KENDYWxsSGVscGVycyYgaml0LCBpbnQzMl90IHN0YWNrU3BpbGxTbG90KTsKIH07CiAKIH0gfSAv
LyBuYW1lc3BhY2UgSlNDOjpGVEwKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRM
T1NSRXhpdENvbXBpbGF0aW9uSW5mby5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9mdGwvRlRMT1NSRXhpdENvbXBpbGF0aW9uSW5mby5oCShyZXZpc2lvbiAxOTE5MzEpCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTE9TUkV4aXRDb21waWxhdGlvbkluZm8uaAko
d29ya2luZyBjb3B5KQpAQCAtMzksNiArMzksNyBAQCBzdHJ1Y3QgT1NSRXhpdENvbXBpbGF0aW9u
SW5mbyB7CiAgICAgfQogICAgIAogICAgIE1hY3JvQXNzZW1ibGVyOjpMYWJlbCBtX3RodW5rTGFi
ZWw7CisgICAgTWFjcm9Bc3NlbWJsZXI6OkxhYmVsIG1fZ2V0QW5kUHV0QnlJZENhbGxPcGVyYXRp
b25FeGNlcHRpb25PU1JFeGl0RW50cmFuY2U7CiAgICAgTWFjcm9Bc3NlbWJsZXI6OlBhdGNoYWJs
ZUp1bXAgbV90aHVua0p1bXA7CiAgICAgQ29kZUxvY2F0aW9uTGFiZWwgbV90aHVua0FkZHJlc3M7
CiB9OwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExPU1JFeGl0Q29tcGlsZXIu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMT1NSRXhpdENv
bXBpbGVyLmNwcAkocmV2aXNpb24gMTkxOTMxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0
bC9GVExPU1JFeGl0Q29tcGlsZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw2ICszMiw3IEBA
CiAjaW5jbHVkZSAiREZHT1NSRXhpdFByZXBhcmF0aW9uLmgiCiAjaW5jbHVkZSAiRlRMRXhpdEFy
Z3VtZW50Rm9yT3BlcmFuZC5oIgogI2luY2x1ZGUgIkZUTEpJVENvZGUuaCIKKyNpbmNsdWRlICJG
VExMb2NhdGlvbi5oIgogI2luY2x1ZGUgIkZUTE9TUkV4aXQuaCIKICNpbmNsdWRlICJGVExPcGVy
YXRpb25zLmgiCiAjaW5jbHVkZSAiRlRMU3RhdGUuaCIKQEAgLTE3OCwxMiArMTc5LDEyIEBAIHN0
YXRpYyB2b2lkIGNvbXBpbGVTdHViKAogewogICAgIFN0YWNrTWFwczo6UmVjb3JkKiByZWNvcmQg
PSAmaml0Q29kZS0+c3RhY2ttYXBzLnJlY29yZHNbZXhpdC5tX3N0YWNrbWFwUmVjb3JkSW5kZXhd
OwogICAgIFJFTEVBU0VfQVNTRVJUKHJlY29yZC0+cGF0Y2hwb2ludElEID09IGV4aXQubV9kZXNj
cmlwdG9yLm1fc3RhY2ttYXBJRCk7Ci0gICAgCisKICAgICAvLyBUaGlzIGNvZGUgcmVxdWlyZXMg
ZnJhbWVQb2ludGVyUmVnaXN0ZXIgaXMgdGhlIHNhbWUgYXMgY2FsbEZyYW1lUmVnaXN0ZXIKICAg
ICBzdGF0aWNfYXNzZXJ0KE1hY3JvQXNzZW1ibGVyOjpmcmFtZVBvaW50ZXJSZWdpc3RlciA9PSBH
UFJJbmZvOjpjYWxsRnJhbWVSZWdpc3RlciwgIk1hY3JvQXNzZW1ibGVyOjpmcmFtZVBvaW50ZXJS
ZWdpc3RlciBhbmQgR1BSSW5mbzo6Y2FsbEZyYW1lUmVnaXN0ZXIgbXVzdCBiZSB0aGUgc2FtZSIp
OwogCiAgICAgQ0NhbGxIZWxwZXJzIGppdCh2bSwgY29kZUJsb2NrKTsKLSAgICAKKwogICAgIC8v
IFdlIG5lZWQgc2NyYXRjaCBzcGFjZSB0byBzYXZlIGFsbCByZWdpc3RlcnMsIHRvIGJ1aWxkIHVw
IHRoZSBKUyBzdGFjaywgdG8gZGVhbCB3aXRoIHVud2luZAogICAgIC8vIGZpeHVwLCBwb2ludGVy
cyB0byBhbGwgb2YgdGhlIG9iamVjdHMgd2UgbWF0ZXJpYWxpemUsIGFuZCB0aGUgZWxlbWVudHMg
aW5zaWRlIHRob3NlIG9iamVjdHMKICAgICAvLyB0aGF0IHdlIG1hdGVyaWFsaXplLgpAQCAtNDI2
LDE1ICs0MjcsMjYgQEAgc3RhdGljIHZvaWQgY29tcGlsZVN0dWIoCiAKICAgICBSZWdpc3RlclNl
dCBhbGxGVExDYWxsZWVTYXZlcyA9IFJlZ2lzdGVyU2V0OjpmdGxDYWxsZWVTYXZlUmVnaXN0ZXJz
KCk7CiAgICAgUmVnaXN0ZXJBdE9mZnNldExpc3QqIGJhc2VsaW5lQ2FsbGVlU2F2ZXMgPSBiYXNl
bGluZUNvZGVCbG9jay0+Y2FsbGVlU2F2ZVJlZ2lzdGVycygpOworICAgIFJlZ2lzdGVyQXRPZmZz
ZXRMaXN0KiB2bUNhbGxlZVNhdmVzID0gdm0tPmdldEFsbENhbGxlZVNhdmVSZWdpc3Rlck9mZnNl
dHMoKTsKKyAgICBSZWdpc3RlclNldCBkb250Q29weVZNQ2FsbGVlU2F2ZXMgPSBSZWdpc3RlclNl
dDo6c3RhY2tSZWdpc3RlcnMoKTsKKyAgICBpZiAoZXhpdC5tX2lzRXhjZXB0aW9uSGFuZGxlcikK
KyAgICAgICAgaml0Lm1vdmUoQ0NhbGxIZWxwZXJzOjpUcnVzdGVkSW1tUHRyKHZtLT5jYWxsZWVT
YXZlUmVnaXN0ZXJzQnVmZmVyKSwgR1BSSW5mbzo6cmVnVDEpOwogCiAgICAgZm9yIChSZWcgcmVn
ID0gUmVnOjpmaXJzdCgpOyByZWcgPD0gUmVnOjpsYXN0KCk7IHJlZyA9IHJlZy5uZXh0KCkpIHsK
LSAgICAgICAgaWYgKCFhbGxGVExDYWxsZWVTYXZlcy5nZXQocmVnKSkKKyAgICAgICAgaWYgKCFh
bGxGVExDYWxsZWVTYXZlcy5nZXQocmVnKSkgeworICAgICAgICAgICAgaWYgKGV4aXQubV9pc0V4
Y2VwdGlvbkhhbmRsZXIpCisgICAgICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQoIXZtQ2FsbGVl
U2F2ZXMtPmZpbmQocmVnKSk7CiAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogICAg
ICAgICB1bnNpZ25lZCB1bndpbmRJbmRleCA9IGNvZGVCbG9jay0+Y2FsbGVlU2F2ZVJlZ2lzdGVy
cygpLT5pbmRleE9mKHJlZyk7CiAgICAgICAgIFJlZ2lzdGVyQXRPZmZzZXQqIGJhc2VsaW5lUmVn
aXN0ZXJPZmZzZXQgPSBiYXNlbGluZUNhbGxlZVNhdmVzLT5maW5kKHJlZyk7CisgICAgICAgIFJl
Z2lzdGVyQXRPZmZzZXQqIHZtQ2FsbGVlU2F2ZSA9IG51bGxwdHI7IAorICAgICAgICBpZiAoZXhp
dC5tX2lzRXhjZXB0aW9uSGFuZGxlcikKKyAgICAgICAgICAgIHZtQ2FsbGVlU2F2ZSA9IHZtQ2Fs
bGVlU2F2ZXMtPmZpbmQocmVnKTsKIAogICAgICAgICBpZiAocmVnLmlzR1BSKCkpIHsKICAgICAg
ICAgICAgIEdQUlJlZyByZWdUb0xvYWQgPSBiYXNlbGluZVJlZ2lzdGVyT2Zmc2V0ID8gR1BSSW5m
bzo6cmVnVDAgOiByZWcuZ3ByKCk7CisgICAgICAgICAgICBSRUxFQVNFX0FTU0VSVChyZWdUb0xv
YWQgIT0gR1BSSW5mbzo6cmVnVDEpOwogCiAgICAgICAgICAgICBpZiAodW53aW5kSW5kZXggPT0g
VUlOVF9NQVgpIHsKICAgICAgICAgICAgICAgICAvLyBUaGUgRlRMIGNvbXBpbGF0aW9uIGRpZG4n
dCBwcmVzZXJ2ZSB0aGlzIHJlZ2lzdGVyLiBUaGlzIG1lYW5zIHRoYXQgaXQgYWxzbwpAQCAtNDUy
LDYgKzQ2NCw4IEBAIHN0YXRpYyB2b2lkIGNvbXBpbGVTdHViKAogCiAgICAgICAgICAgICBpZiAo
YmFzZWxpbmVSZWdpc3Rlck9mZnNldCkKICAgICAgICAgICAgICAgICBqaXQuc3RvcmU2NChyZWdU
b0xvYWQsIE1hY3JvQXNzZW1ibGVyOjpBZGRyZXNzKE1hY3JvQXNzZW1ibGVyOjpmcmFtZVBvaW50
ZXJSZWdpc3RlciwgYmFzZWxpbmVSZWdpc3Rlck9mZnNldC0+b2Zmc2V0KCkpKTsKKyAgICAgICAg
ICAgIGlmICh2bUNhbGxlZVNhdmUgJiYgIWRvbnRDb3B5Vk1DYWxsZWVTYXZlcy5nZXQodm1DYWxs
ZWVTYXZlLT5yZWcoKSkpCisgICAgICAgICAgICAgICAgaml0LnN0b3JlNjQocmVnVG9Mb2FkLCBN
YWNyb0Fzc2VtYmxlcjo6QWRkcmVzcyhHUFJJbmZvOjpyZWdUMSwgdm1DYWxsZWVTYXZlLT5vZmZz
ZXQoKSkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgRlBSUmVnIGZwUmVnVG9Mb2Fk
ID0gYmFzZWxpbmVSZWdpc3Rlck9mZnNldCA/IEZQUkluZm86OmZwUmVnVDAgOiByZWcuZnByKCk7
CiAKQEAgLTQ2Miw5ICs0NzYsMTkgQEAgc3RhdGljIHZvaWQgY29tcGlsZVN0dWIoCiAKICAgICAg
ICAgICAgIGlmIChiYXNlbGluZVJlZ2lzdGVyT2Zmc2V0KQogICAgICAgICAgICAgICAgIGppdC5z
dG9yZURvdWJsZShmcFJlZ1RvTG9hZCwgTWFjcm9Bc3NlbWJsZXI6OkFkZHJlc3MoTWFjcm9Bc3Nl
bWJsZXI6OmZyYW1lUG9pbnRlclJlZ2lzdGVyLCBiYXNlbGluZVJlZ2lzdGVyT2Zmc2V0LT5vZmZz
ZXQoKSkpOworICAgICAgICAgICAgaWYgKHZtQ2FsbGVlU2F2ZSAmJiAhZG9udENvcHlWTUNhbGxl
ZVNhdmVzLmdldCh2bUNhbGxlZVNhdmUtPnJlZygpKSkKKyAgICAgICAgICAgICAgICBqaXQuc3Rv
cmVEb3VibGUoZnBSZWdUb0xvYWQsIE1hY3JvQXNzZW1ibGVyOjpBZGRyZXNzKEdQUkluZm86OnJl
Z1QxLCB2bUNhbGxlZVNhdmUtPm9mZnNldCgpKSk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBp
ZiAoZXhpdC5tX2lzRXhjZXB0aW9uSGFuZGxlcikgeworICAgICAgICBSZWdpc3RlckF0T2Zmc2V0
KiB2bUNhbGxlZVNhdmUgPSBudWxscHRyOyAKKyAgICAgICAgdm1DYWxsZWVTYXZlID0gdm1DYWxs
ZWVTYXZlcy0+ZmluZChHUFJJbmZvOjp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIpOworICAgICAgICBq
aXQuc3RvcmU2NChHUFJJbmZvOjp0YWdUeXBlTnVtYmVyUmVnaXN0ZXIsIE1hY3JvQXNzZW1ibGVy
OjpBZGRyZXNzKEdQUkluZm86OnJlZ1QxLCB2bUNhbGxlZVNhdmUtPm9mZnNldCgpKSk7CisgICAg
ICAgIHZtQ2FsbGVlU2F2ZSA9IHZtQ2FsbGVlU2F2ZXMtPmZpbmQoR1BSSW5mbzo6dGFnTWFza1Jl
Z2lzdGVyKTsKKyAgICAgICAgaml0LnN0b3JlNjQoR1BSSW5mbzo6dGFnTWFza1JlZ2lzdGVyLCBN
YWNyb0Fzc2VtYmxlcjo6QWRkcmVzcyhHUFJJbmZvOjpyZWdUMSwgdm1DYWxsZWVTYXZlLT5vZmZz
ZXQoKSkpOworICAgIH0KKwogICAgIHNpemVfdCBiYXNlbGluZVZpcnR1YWxSZWdpc3RlcnNGb3JD
YWxsZWVTYXZlcyA9IGJhc2VsaW5lQ29kZUJsb2NrLT5jYWxsZWVTYXZlU3BhY2VBc1ZpcnR1YWxS
ZWdpc3RlcnMoKTsKIAogICAgIC8vIE5vdyBnZXQgc3RhdGUgb3V0IG9mIHRoZSBzY3JhdGNoIGJ1
ZmZlciBhbmQgcGxhY2UgaXQgYmFjayBpbnRvIHRoZSBzdGFjay4gVGhlIHZhbHVlcyBhcmUKQEAg
LTQ4MSw3ICs1MDUsNyBAQCBzdGF0aWMgdm9pZCBjb21waWxlU3R1YigKICAgICAKICAgICBoYW5k
bGVFeGl0Q291bnRzKGppdCwgZXhpdCk7CiAgICAgcmVpZnlJbmxpbmVkQ2FsbEZyYW1lcyhqaXQs
IGV4aXQpOwotICAgIGFkanVzdEFuZEp1bXBUb1RhcmdldChqaXQsIGV4aXQsIGZhbHNlKTsKKyAg
ICBhZGp1c3RBbmRKdW1wVG9UYXJnZXQoaml0LCBleGl0LCBleGl0Lm1faXNFeGNlcHRpb25IYW5k
bGVyKTsKICAgICAKICAgICBMaW5rQnVmZmVyIHBhdGNoQnVmZmVyKCp2bSwgaml0LCBjb2RlQmxv
Y2spOwogICAgIGV4aXQubV9jb2RlID0gRklOQUxJWkVfQ09ERV9JRigKQEAgLTUyMCw2ICs1NDQs
MTEgQEAgZXh0ZXJuICJDIiB2b2lkKiBjb21waWxlRlRMT1NSRXhpdChFeGVjUwogICAgICAgICBk
YXRhTG9nKCIgICAgT3JpZ2luOiAiLCBleGl0Lm1fY29kZU9yaWdpbiwgIlxuIik7CiAgICAgICAg
IGlmIChleGl0Lm1fY29kZU9yaWdpbkZvckV4aXRQcm9maWxlICE9IGV4aXQubV9jb2RlT3JpZ2lu
KQogICAgICAgICAgICAgZGF0YUxvZygiICAgIE9yaWdpbiBmb3IgZXhpdCBwcm9maWxlOiAiLCBl
eGl0Lm1fY29kZU9yaWdpbkZvckV4aXRQcm9maWxlLCAiXG4iKTsKKyAgICAgICAgZGF0YUxvZygi
ICAgIEV4aXQgc3RhY2ttYXAgSUQ6ICIsIGV4aXQubV9kZXNjcmlwdG9yLm1fc3RhY2ttYXBJRCwg
IlxuIik7CisgICAgICAgIGRhdGFMb2coIiAgICBDdXJyZW50IGNhbGwgc2l0ZSBpbmRleDogIiwg
ZXhlYy0+Y2FsbFNpdGVJbmRleCgpLmJpdHMoKSwgIlxuIik7CisgICAgICAgIGRhdGFMb2coIiAg
ICBFeGl0IGlzIGV4Y2VwdGlvbiBoYW5kbGVyOiAiLCBleGl0Lm1faXNFeGNlcHRpb25IYW5kbGVy
LAorICAgICAgICAgICAgIiB3aWxsIGFycml2ZSBhdCBleGl0IGZyb20gZ2VuZXJpY1Vud2luZCgp
OiAiLCBleGl0Lm1fZGVzY3JpcHRvci5tX3dpbGxBcnJpdmVBdE9TUkV4aXRGcm9tR2VuZXJpY1Vu
d2luZCwgCisgICAgICAgICAgICAiIHdpbGwgYXJyaXZlIGF0IGV4aXQgZnJvbSBsYXp5IHNsb3cg
cGF0aDogIiwgZXhpdC5tX2Rlc2NyaXB0b3IubV9pc0V4Y2VwdGlvbkZyb21MYXp5U2xvd1BhdGgs
ICJcbiIpOwogICAgICAgICBkYXRhTG9nKCIgICAgRXhpdCB2YWx1ZXM6ICIsIGV4aXQubV9kZXNj
cmlwdG9yLm1fdmFsdWVzLCAiXG4iKTsKICAgICAgICAgaWYgKCFleGl0Lm1fZGVzY3JpcHRvci5t
X21hdGVyaWFsaXphdGlvbnMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBkYXRhTG9nKCIgICAg
TWF0ZXJpYWxpemF0aW9uczpcbiIpOwpAQCAtNTMxLDcgKzU2MCw3IEBAIGV4dGVybiAiQyIgdm9p
ZCogY29tcGlsZUZUTE9TUkV4aXQoRXhlY1MKICAgICBwcmVwYXJlQ29kZU9yaWdpbkZvck9TUkV4
aXQoZXhlYywgZXhpdC5tX2NvZGVPcmlnaW4pOwogICAgIAogICAgIGNvbXBpbGVTdHViKGV4aXRJ
RCwgaml0Q29kZSwgZXhpdCwgdm0sIGNvZGVCbG9jayk7Ci0gICAgCisKICAgICBNYWNyb0Fzc2Vt
Ymxlcjo6cmVwYXRjaEp1bXAoCiAgICAgICAgIGV4aXQuY29kZUxvY2F0aW9uRm9yUmVwYXRjaChj
b2RlQmxvY2spLCBDb2RlTG9jYXRpb25MYWJlbChleGl0Lm1fY29kZS5jb2RlKCkpKTsKICAgICAK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMU3RhdGUuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMU3RhdGUuY3BwCShyZXZpc2lvbiAxOTE5
MzEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTFN0YXRlLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNDksNiArNDksNyBAQCBTdGF0ZTo6U3RhdGUoR3JhcGgmIGdyYXBoKQogICAgICwg
aGFuZGxlRXhjZXB0aW9uU3RhY2ttYXBJRChVSU5UX01BWCkKICAgICAsIGNhcHR1cmVkU3RhY2tt
YXBJRChVSU5UX01BWCkKICAgICAsIHZhcmFyZ3NTcGlsbFNsb3RzU3RhY2ttYXBJRChVSU5UX01B
WCkKKyAgICAsIGV4Y2VwdGlvbkhhbmRsaW5nU3BpbGxTbG90U3RhY2ttYXBJRChVSU5UX01BWCkK
ICAgICAsIHVud2luZERhdGFTZWN0aW9uKDApCiAgICAgLCB1bndpbmREYXRhU2VjdGlvblNpemUo
MCkKIHsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMU3RhdGUuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTFN0YXRlLmgJKHJldmlzaW9uIDE5
MTkzMSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMU3RhdGUuaAkod29ya2luZyBj
b3B5KQpAQCAtNzUsNiArNzUsNyBAQCBwdWJsaWM6CiAgICAgdW5zaWduZWQgaGFuZGxlRXhjZXB0
aW9uU3RhY2ttYXBJRDsKICAgICB1bnNpZ25lZCBjYXB0dXJlZFN0YWNrbWFwSUQ7CiAgICAgdW5z
aWduZWQgdmFyYXJnc1NwaWxsU2xvdHNTdGFja21hcElEOworICAgIHVuc2lnbmVkIGV4Y2VwdGlv
bkhhbmRsaW5nU3BpbGxTbG90U3RhY2ttYXBJRDsKICAgICBTZWdtZW50ZWRWZWN0b3I8R2V0QnlJ
ZERlc2NyaXB0b3I+IGdldEJ5SWRzOwogICAgIFNlZ21lbnRlZFZlY3RvcjxQdXRCeUlkRGVzY3Jp
cHRvcj4gcHV0QnlJZHM7CiAgICAgU2VnbWVudGVkVmVjdG9yPENoZWNrSW5EZXNjcmlwdG9yPiBj
aGVja0luczsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9pbnRlcnByZXRlci9JbnRlcnBy
ZXRlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2ludGVycHJldGVy
L0ludGVycHJldGVyLmNwcAkocmV2aXNpb24gMTkxOTMxKQorKysgU291cmNlL0phdmFTY3JpcHRD
b3JlL2ludGVycHJldGVyL0ludGVycHJldGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTk1LDEw
ICs1OTUsMTAgQEAgQUxXQVlTX0lOTElORSBzdGF0aWMgSGFuZGxlckluZm8qIGZpbmRFeAogCiAg
ICAgQ2FsbEZyYW1lKiBjYWxsRnJhbWUgPSB2aXNpdG9yLT5jYWxsRnJhbWUoKTsKICAgICB1bnNp
Z25lZCBleGNlcHRpb25IYW5kbGVySW5kZXg7Ci0gICAgaWYgKGNvZGVCbG9jay0+aml0VHlwZSgp
ICE9IEpJVENvZGU6OkRGR0pJVCkKLSAgICAgICAgZXhjZXB0aW9uSGFuZGxlckluZGV4ID0gY2Fs
bEZyYW1lLT5ieXRlY29kZU9mZnNldCgpOwotICAgIGVsc2UKKyAgICBpZiAoSklUQ29kZTo6aXNP
cHRpbWl6aW5nSklUKGNvZGVCbG9jay0+aml0VHlwZSgpKSkKICAgICAgICAgZXhjZXB0aW9uSGFu
ZGxlckluZGV4ID0gY2FsbEZyYW1lLT5jYWxsU2l0ZUluZGV4KCkuYml0cygpOworICAgIGVsc2UK
KyAgICAgICAgZXhjZXB0aW9uSGFuZGxlckluZGV4ID0gY2FsbEZyYW1lLT5ieXRlY29kZU9mZnNl
dCgpOwogCiAgICAgcmV0dXJuIGNvZGVCbG9jay0+aGFuZGxlckZvckluZGV4KGV4Y2VwdGlvbkhh
bmRsZXJJbmRleCwgcmVxdWlyZWRIYW5kbGVyKTsKIH0KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9qaXQvUmVnaXN0ZXJTZXQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9qaXQvUmVnaXN0ZXJTZXQuY3BwCShyZXZpc2lvbiAxOTE5MzEpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvaml0L1JlZ2lzdGVyU2V0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjYsNiAr
NjYsMTUgQEAgUmVnaXN0ZXJTZXQgUmVnaXN0ZXJTZXQ6OnNwZWNpYWxSZWdpc3RlcgogICAgICAg
ICBzdGFja1JlZ2lzdGVycygpLCByZXNlcnZlZEhhcmR3YXJlUmVnaXN0ZXJzKCksIHJ1bnRpbWVS
ZWdpc3RlcnMoKSk7CiB9CiAKK1JlZ2lzdGVyU2V0IFJlZ2lzdGVyU2V0Ojp2b2xhdGlsZVJlZ2lz
dGVyc0ZvckpTQ2FsbCgpCit7CisgICAgUmVnaXN0ZXJTZXQgdm9sYXRpbGVSZWdpc3RlcnMgPSBh
bGxSZWdpc3RlcnMoKTsKKyAgICB2b2xhdGlsZVJlZ2lzdGVycy5leGNsdWRlKFJlZ2lzdGVyU2V0
OjpzdGFja1JlZ2lzdGVycygpKTsKKyAgICB2b2xhdGlsZVJlZ2lzdGVycy5leGNsdWRlKFJlZ2lz
dGVyU2V0OjpyZXNlcnZlZEhhcmR3YXJlUmVnaXN0ZXJzKCkpOworICAgIHZvbGF0aWxlUmVnaXN0
ZXJzLmV4Y2x1ZGUoUmVnaXN0ZXJTZXQ6OnZtQ2FsbGVlU2F2ZVJlZ2lzdGVycygpKTsKKyAgICBy
ZXR1cm4gdm9sYXRpbGVSZWdpc3RlcnM7Cit9CisKIFJlZ2lzdGVyU2V0IFJlZ2lzdGVyU2V0Ojpz
dHViVW5hdmFpbGFibGVSZWdpc3RlcnMoKQogewogICAgIHJldHVybiBSZWdpc3RlclNldChzcGVj
aWFsUmVnaXN0ZXJzKCksIHZtQ2FsbGVlU2F2ZVJlZ2lzdGVycygpKTsKSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9qaXQvUmVnaXN0ZXJTZXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvaml0L1JlZ2lzdGVyU2V0LmgJKHJldmlzaW9uIDE5MTkzMSkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9qaXQvUmVnaXN0ZXJTZXQuaAkod29ya2luZyBjb3B5KQpAQCAtNTcs
NiArNTcsNyBAQCBwdWJsaWM6CiAjaWYgRU5BQkxFKFdFQkFTU0VNQkxZKQogICAgIHN0YXRpYyBS
ZWdpc3RlclNldCB3ZWJBc3NlbWJseUNhbGxlZVNhdmVSZWdpc3RlcnMoKTsgLy8gUmVnaXN0ZXJz
IHNhdmVkIGFuZCB1c2VkIGJ5IHRoZSBXZWJBc3NlbWJseSBKSVQuCiAjZW5kaWYKKyAgICBzdGF0
aWMgUmVnaXN0ZXJTZXQgdm9sYXRpbGVSZWdpc3RlcnNGb3JKU0NhbGwoKTsKICAgICBzdGF0aWMg
UmVnaXN0ZXJTZXQgc3R1YlVuYXZhaWxhYmxlUmVnaXN0ZXJzKCk7IC8vIFRoZSB1bmlvbiBvZiBj
YWxsZWUgc2F2ZXMgYW5kIHNwZWNpYWwgcmVnaXN0ZXJzLgogICAgIHN0YXRpYyBSZWdpc3RlclNl
dCBhbGxHUFJzKCk7CiAgICAgc3RhdGljIFJlZ2lzdGVyU2V0IGFsbEZQUnMoKTsKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3MvZnRsLXRyeS1jYXRjaC1nZXR0ZXItaWMt
ZmFpbC10by1jYWxsLW9wZXJhdGlvbi10aHJvdy1lcnJvci5qcwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNzL2Z0bC10cnktY2F0Y2gtZ2V0dGVyLWljLWZh
aWwtdG8tY2FsbC1vcGVyYXRpb24tdGhyb3ctZXJyb3IuanMJKHJldmlzaW9uIDApCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNzL2Z0bC10cnktY2F0Y2gtZ2V0dGVyLWljLWZh
aWwtdG8tY2FsbC1vcGVyYXRpb24tdGhyb3ctZXJyb3IuanMJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSw0OSBAQAorZnVuY3Rpb24gYXNzZXJ0KGIpIHsKKyAgICBpZiAoIWIpCisgICAgICAgIHRo
cm93IG5ldyBFcnJvcigiYmFkIHZhbHVlIikKK30KK25vSW5saW5lKGFzc2VydCk7CisKK2xldCBv
VGhyb3cgPSB7CisgICAgeDogMjAsCisgICAgeTogNDAsCisgICAgejogNTAsCisgICAgZ2V0IGYo
KSB7IHRocm93IG5ldyBFcnJvcigiSGVsbG8gV29ybGQhIik7IH0KK307CisKK2xldCBvMSA9IHsK
KyAgICB4OiAyMCwKKyAgICBmOiA0MAorfTsKKworbGV0IG8yID0geworICAgIHg6IDIwLAorICAg
IHk6IDUwLAorICAgIGdldCBmKCkgeyByZXR1cm4gMjA7IH0KK307CisKK2Z1bmN0aW9uIGZvbyhm
KSB7CisgICAgbGV0IG8gPSBmKCk7CisgICAgdHJ5IHsKKyAgICAgICAgbyA9IG8uZjsKKyAgICB9
IGNhdGNoKGUpIHsKKyAgICAgICAgYXNzZXJ0KG8gPT09IG9UaHJvdyk7IC8vIE1ha2Ugc3VyZSB0
aGlzIGlzIG5vdCB1bmRlZmluZWQgd2hlbiB3ZSBoYXZlIGFuIElDIG1pc3MgYW5kIGFuIGV4Y2Vw
dGlvbiBhdCB0aGUgc2FtZSB0aW1lLgorICAgIH0KK30KK25vSW5saW5lKGZvbyk7CisKK2xldCBp
OworbGV0IGZsYWcgPSBmYWxzZTsKK2Z1bmN0aW9uIGYoKSB7CisgICAgaWYgKGZsYWcpCisgICAg
ICAgIHJldHVybiBvVGhyb3c7CisgICAgaWYgKGkgJSAyKQorICAgICAgICByZXR1cm4gbzE7Cisg
ICAgcmV0dXJuIG8yOworfQorbm9JbmxpbmUoZik7Citmb3IgKGkgPSAwOyBpIDwgMTAwMDAwOyBp
KyspIHsKKyAgICBmb28oZik7Cit9CitmbGFnID0gdHJ1ZTsKK2ZvbyhmKTsKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3MvZnRsLXRyeS1jYXRjaC1nZXR0ZXItdGhyb3cu
anMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy9mdGwt
dHJ5LWNhdGNoLWdldHRlci10aHJvdy5qcwkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS90ZXN0cy9zdHJlc3MvZnRsLXRyeS1jYXRjaC1nZXR0ZXItdGhyb3cuanMJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSw2MCBAQAorZnVuY3Rpb24gcmFuZG9tKCkgeyAKKyAgICByZXR1
cm4gImJsYWgiOworfQorbm9JbmxpbmUocmFuZG9tKTsKKworZnVuY3Rpb24gZm9vKG8sIGEpIHsK
KyAgICBsZXQgeCA9IG8uZzsKKyAgICBsZXQgeSA9IG8ueTsKKyAgICBsZXQgaiA9IHJhbmRvbSgp
OworICAgIHRyeSB7CisgICAgICAgIGogPSBvLmY7CisgICAgfSBjYXRjaChlKSB7CisgICAgICAg
IC8vcHJpbnQoaik7CisgICAgICAgIGFzc2VydChqID09PSAiYmxhaCIpOworICAgICAgICByZXR1
cm4geCArIHkgKyAxOworICAgIH0KKyAgICAvL2Fzc2VydChqID09PSAiZ2V0IGYiKTsKKyAgICBy
ZXR1cm4geCArIHk7Cit9CisKK2Z1bmN0aW9uIGFzc2VydChiKSB7CisgICAgaWYgKCFiKQorICAg
ICAgICB0aHJvdyBuZXcgRXJyb3IoImJhZCB2YWx1ZSIpCit9Citub0lubGluZShhc3NlcnQpOwor
Citub0lubGluZShmb28pOwordmFyIGZsYWcgPSBmYWxzZTsKK2Z1bmN0aW9uIGYoYXJnMSwgYXJn
MiwgYXJnMykgeworICAgIGlmIChmbGFnKQorICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImJsYWgi
KQorICAgIHJldHVybiBhcmcxOworfQorbm9JbmxpbmUoZik7CitsZXQgbzEgPSB7CisgICAgZzog
MjAsCisgICAgeTogNDAsCisgICAgZjogImdldCBmIgorfTsKKworbGV0IG8yID0geworICAgIGc6
ICJnIiwKKyAgICB5OiAieSIsCisgICAgZ2V0IGYoKSB7IAorICAgICAgICBpZiAoZmxhZykgCisg
ICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImJsYWgiKTsgCisgICAgICAgIHJldHVybiAiZ2V0
IGYiOworICAgIH0KK30KKworZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwMDA7IGkrKykgeworICAg
IGlmIChpICUgMikgeworICAgICAgICBhc3NlcnQoZm9vKG8xKSA9PT0gNjApOworICAgIH0gZWxz
ZSB7CisgICAgICAgIGFzc2VydChmb28obzIpID09PSAiZ3kiKTsKKyAgICB9Cit9CitmbGFnID0g
dHJ1ZTsKKy8vcHJpbnQoZm9vKG8yKSk7Cithc3NlcnQoZm9vKG8yKSA9PT0gImd5MSIpOwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy9mdGwtdHJ5LWNhdGNoLW9vbS1l
cnJvci1sYXp5LXNsb3ctcGF0aC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvdGVzdHMvc3RyZXNzL2Z0bC10cnktY2F0Y2gtb29tLWVycm9yLWxhenktc2xvdy1wYXRoLmpz
CShyZXZpc2lvbiAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy9mdGwt
dHJ5LWNhdGNoLW9vbS1lcnJvci1sYXp5LXNsb3ctcGF0aC5qcwkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDY5IEBACitmb3JjZUdDU2xvd1BhdGhzKCk7IC8vIEZvcmNlIE9PTSBlcnJvciBpbiBG
VEwgTWFrZVJvcGUgdG8gaGFwcGVuIGluIGEgbGF6eSBzbG93IHBhdGguCisKK2Z1bmN0aW9uIGFz
c2VydChiKSB7CisgICAgaWYgKCFiKQorICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkJhZCBhc3Nl
cnRpb24iKTsKK30KKworZnVuY3Rpb24gYSgpIHsgcmV0dXJuICJhIjsgfQorbm9JbmxpbmUoYSk7
CitmdW5jdGlvbiBiKCkgeyByZXR1cm4gImIiOyB9Citub0lubGluZShiKTsKK2Z1bmN0aW9uIGMo
KSB7IHJldHVybiAiYyI7IH0KK25vSW5saW5lKGMpOworZnVuY3Rpb24gZCgpIHsgcmV0dXJuICJk
IjsgfQorbm9JbmxpbmUoZCk7CitmdW5jdGlvbiBlKCkgeyByZXR1cm4gImUiOyB9Citub0lubGlu
ZShlKTsKK2Z1bmN0aW9uIGYoKSB7IHJldHVybiAiZiI7IH0KK25vSW5saW5lKGYpOworZnVuY3Rp
b24gZygpIHsgcmV0dXJuICJnIjsgfQorbm9JbmxpbmUoZyk7CisKK2xldCBleHBTdHJpbmcgPSAi
YSI7CitsZXQgZXhwb25lbnRpYWxCbG93dXAgPSBmYWxzZTsKK2xldCBzaG91bGRCcmVhayA9IGZh
bHNlOworZnVuY3Rpb24gZm9vKGZ1biwgbGVmdCwgcmlnaHQpIHsKKyAgICBsZXQgeCA9IGZ1bigp
OworICAgIGxldCByID0gbGVmdCArIHJpZ2h0OworCisgICAgdmFyIF9hID0gYSgpOworICAgIHZh
ciBfYiA9IGIoKTsKKyAgICB2YXIgX2MgPSBjKCk7CisgICAgdmFyIF9kID0gZCgpOworICAgIHZh
ciBfZSA9IGUoKTsKKyAgICB2YXIgX2YgPSBmKCk7CisgICAgdmFyIF9nID0gZygpOworICAgIHRy
eSB7CisgICAgICAgIGV4cFN0cmluZyA9IGV4cFN0cmluZyArIGV4cFN0cmluZzsKKyAgICB9IGNh
dGNoKGUpIHsKKyAgICAgICAgc2hvdWxkQnJlYWsgPSB0cnVlOworCisgICAgICAgIGFzc2VydChf
YiA9PT0gImIiKTsKKyAgICAgICAgYXNzZXJ0KF9jID09PSAiYyIpOworICAgICAgICBhc3NlcnQo
X2QgPT09ICJkIik7CisgICAgICAgIGFzc2VydChfZSA9PT0gImUiKTsKKyAgICAgICAgYXNzZXJ0
KF9mID09PSAiZiIpOworICAgICAgICBhc3NlcnQoX2cgPT09ICJnIik7CisgICAgfQorICAgIHJl
dHVybiB4ICsgcjsKK30KK25vSW5saW5lKGZvbyk7CisKKworCitmdW5jdGlvbiBibGFoKCkgeyBy
ZXR1cm4gImJsYWgiOyB9Citub0lubGluZShibGFoKTsKKworZm9yIChsZXQgaSA9IDA7IGkgPCAx
MDAwMDA7IGkrKykgeworICAgIGFzc2VydChmb28oYmxhaCwgImIiLCAiYSIpID09PSAiYmxhaGJh
Iik7CisgICAgaWYgKCFleHBvbmVudGlhbEJsb3d1cCkKKyAgICAgICAgZXhwU3RyaW5nID0gImEi
OworfQorCitleHBvbmVudGlhbEJsb3d1cCA9IHRydWU7Cit3aGlsZSAodHJ1ZSkgeworICAgIGFz
c2VydChmb28oYmxhaCwgImEiLCAiYiIpID09PSAiYmxhaGFiIik7CisgICAgaWYgKHNob3VsZEJy
ZWFrKQorICAgICAgICBicmVhazsKK30KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0
cy9zdHJlc3MvZnRsLXRyeS1jYXRjaC1wYXRjaHBvaW50LXdpdGgtdm9sYXRpbGUtcmVnaXN0ZXJz
LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3MvZnRs
LXRyeS1jYXRjaC1wYXRjaHBvaW50LXdpdGgtdm9sYXRpbGUtcmVnaXN0ZXJzLmpzCShyZXZpc2lv
biAwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy9mdGwtdHJ5LWNhdGNo
LXBhdGNocG9pbnQtd2l0aC12b2xhdGlsZS1yZWdpc3RlcnMuanMJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSw3MyBAQAorZnVuY3Rpb24gYXNzZXJ0KGIpIHsKKyAgICBpZiAoIWIpCisgICAgICAg
IHRocm93IG5ldyBFcnJvcigiQmFkIHZhbHVlLiIpCit9Citub0lubGluZShhc3NlcnQpOworCit2
YXIgdjEgPSAxMDA7Cit2YXIgdjIgPSAyMDA7Cit2YXIgZmxhZyA9IGZhbHNlOwordmFyIG8xID0g
eworICAgIGdldCBmKCkgeworICAgICAgICBpZiAoZmxhZykKKyAgICAgICAgICAgIHRocm93IG5l
dyBFcnJvcigiZ290Y2hhISIpOworICAgICAgICByZXR1cm4gdjE7ICAgIAorICAgIH0KK30KKwor
ZnVuY3Rpb24gYSgpIHsgcmV0dXJuICJhIjsgfQorbm9JbmxpbmUoYSk7CitmdW5jdGlvbiBiKCkg
eyByZXR1cm4gImIiOyB9Citub0lubGluZShiKTsKK2Z1bmN0aW9uIGMoKSB7IHJldHVybiAiYyI7
IH0KK25vSW5saW5lKGMpOworZnVuY3Rpb24gZCgpIHsgcmV0dXJuICJkIjsgfQorbm9JbmxpbmUo
ZCk7CitmdW5jdGlvbiBlKCkgeyByZXR1cm4gImUiOyB9Citub0lubGluZShlKTsKK2Z1bmN0aW9u
IGYoKSB7IHJldHVybiAiZiI7IH0KK25vSW5saW5lKGYpOworZnVuY3Rpb24gZygpIHsgcmV0dXJu
ICJnIjsgfQorbm9JbmxpbmUoZyk7CisKK3ZhciBvMiA9IHsKKyAgICBnZXQgZigpIHsKKyAgICAg
ICAgYXNzZXJ0KHRydWUpOworICAgICAgICBhc3NlcnQodHJ1ZSk7CisgICAgICAgIGFzc2VydCh0
cnVlKTsKKyAgICAgICAgYXNzZXJ0KHRydWUpOworICAgICAgICBhc3NlcnQodHJ1ZSk7CisgICAg
ICAgIGFzc2VydCh0cnVlKTsKKyAgICAgICAgYXNzZXJ0KHRydWUpOworICAgICAgICByZXR1cm4g
djI7CisgICAgfQorfQorCitmdW5jdGlvbiBmb28obykgeworICAgIHRyeSB7CisgICAgICAgIHZh
ciBfYSA9IGEoKTsKKyAgICAgICAgdmFyIF9iID0gYigpOworICAgICAgICB2YXIgX2MgPSBjKCk7
CisgICAgICAgIHZhciBfZCA9IGQoKTsKKyAgICAgICAgdmFyIF9lID0gZSgpOworICAgICAgICB2
YXIgX2YgPSBmKCk7CisgICAgICAgIHZhciBfZyA9IGcoKTsKKworICAgICAgICBvID0gby5mOwor
CisgICAgfSBjYXRjaChlKSB7CisgICAgICAgIGFzc2VydChvID09PSBvMSk7CisgICAgICAgIGFz
c2VydChfYiA9PT0gImIiKTsKKyAgICAgICAgYXNzZXJ0KF9jID09PSAiYyIpOworICAgICAgICBh
c3NlcnQoX2QgPT09ICJkIik7CisgICAgICAgIGFzc2VydChfZSA9PT0gImUiKTsKKyAgICAgICAg
YXNzZXJ0KF9mID09PSAiZiIpOworICAgICAgICBhc3NlcnQoX2cgPT09ICJnIik7CisgICAgfQor
fQorbm9JbmxpbmUoZm9vKTsKKworZm9yICh2YXIgaSA9IDA7IGkgPCAxMDAwMDAwOyBpKyspCisg
ICAgZm9vKGkgJSAyID8gbzEgOiBvMik7CitmbGFnID0gdHJ1ZTsKK2ZvbyhvMSk7CkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNzL2Z0bC10cnktY2F0Y2gtc2V0dGVyLXRo
cm93LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy9zdHJlc3Mv
ZnRsLXRyeS1jYXRjaC1zZXR0ZXItdGhyb3cuanMJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNzL2Z0bC10cnktY2F0Y2gtc2V0dGVyLXRocm93LmpzCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDcgQEAKK2Z1bmN0aW9uIGZvbyhvLCBhKSB7CisgICAg
bGV0IHggPSBvLmc7CisgICAgbGV0IHkgPSBvLnk7CisgICAgdHJ5IHsKKyAgICAgICAgby5mID0g
MjA7CisgICAgfSBjYXRjaChlKSB7CisgICAgICAgIHJldHVybiB4ICsgeSArIDE7CisgICAgfQor
ICAgIHJldHVybiB4ICsgeTsKK30KKworZnVuY3Rpb24gYXNzZXJ0KGIpIHsKKyAgICBpZiAoIWIp
CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiYmFkIHZhbHVlIikKK30KK25vSW5saW5lKGFzc2Vy
dCk7CisKK25vSW5saW5lKGZvbyk7Cit2YXIgZmxhZyA9IGZhbHNlOworZnVuY3Rpb24gZihhcmcx
LCBhcmcyLCBhcmczKSB7CisgICAgaWYgKGZsYWcpCisgICAgICAgIHRocm93IG5ldyBFcnJvcigi
YmxhaCIpCisgICAgcmV0dXJuIGFyZzE7Cit9Citub0lubGluZShmKTsKK2xldCBvMSA9IHsKKyAg
ICBnOiAyMCwKKyAgICB5OiA0MCwKKyAgICBmOiBudWxsCit9OworCitsZXQgbzIgPSB7CisgICAg
ZzogImciLAorICAgIHk6ICJ5IiwKKyAgICBzZXQgZih2KSB7IGlmIChmbGFnKSB0aHJvdyBuZXcg
RXJyb3IoImJsYWgiKTsgfQorfQorCitmb3IgKGxldCBpID0gMDsgaSA8IDEwMDAwMDsgaSsrKSB7
CisgICAgaWYgKGkgJSAyKSB7CisgICAgICAgIGFzc2VydChmb28obzEpID09PSA2MCk7CisgICAg
fSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KGZvbyhvMikgPT09ICJneSIpOworICAgIH0KK30KK2Zs
YWcgPSB0cnVlOworLy9wcmludChmb28obzIpKTsKK2Fzc2VydChmb28obzIpID09PSAiZ3kxIik7
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNzL2Z0bC10cnktY2F0Y2gt
dGFpbC1jYWxsLWluaWxuZWQtY2FsbGVyLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS90ZXN0cy9zdHJlc3MvZnRsLXRyeS1jYXRjaC10YWlsLWNhbGwtaW5pbG5lZC1jYWxs
ZXIuanMJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNz
L2Z0bC10cnktY2F0Y2gtdGFpbC1jYWxsLWluaWxuZWQtY2FsbGVyLmpzCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsNjIgQEAKKy8vIFRoaXMgdGVzdCBlbnN1cmVzIHRoZSBUYWlsQ2FsbEluaWxu
ZWRDYWxsZXIgaGFzIHRoZSBjb3JyZWN0CisvLyBzdGFjayB0cmFjZSBpbiB0aGUgRlRMIGluc2lk
ZSBhIHRyeSBibG9jay4KKy8vIFRoaXMgY2FzZSBhcmlzZXMgd2hlbiB5b3UgaGF2ZSBhIHNpdHVh
dGlvbiBsaWtlIHRoaXM6CisvLyBmb28gbWFrZXMgYSBjYWxsIHRvIGJhciwgYmFyIGlzIGlubGlu
ZWQgaW4gZm9vLiBiYXIgbWFrZXMgYSBjYWxsCisvLyB0byBiYXogYW5kIGJheiBpcyBpbmxpbmVk
IGluIGJhci4gQW5kIHRoZW4gYmF6IG1ha2VzIGEgdGFpbC1jYWxsIHRvIGpheiwKKy8vIGFuZCBq
YXogaXMgaW5saW5lZCBpbiBiYXouIFdlIHdhbnQgdGhlIGNhbGxmcmFtZSBmb3IgamF6IHRvIGFw
cGVhciB0byAKKy8vIGhhdmUgY2FsbGVyIGJlIGJhci4gCisKKworInVzZSBzdHJpY3QiOworZnVu
Y3Rpb24gdmFsdWUoKSB7CisgICAgcmV0dXJuICJ2YWx1ZSI7Cit9Citub0lubGluZSh2YWx1ZSk7
CisKK2Z1bmN0aW9uIGFzc2VydChiKSB7CisgICAgaWYgKCFiKQorICAgICAgICB0aHJvdyBuZXcg
RXJyb3IoImJhZCB2YWx1ZSIpOworfQorbm9JbmxpbmUoYXNzZXJ0KTsKKworZnVuY3Rpb24gdmFs
aWRhdGUoc3RhY2spIHsKKyAgICBsZXQgYXJyID0gc3RhY2suc3BsaXQoIlxuIik7CisgICAgYXNz
ZXJ0KGFyclswXS5pbmRleE9mKCJqYXoiKSAhPT0gLTEpOworICAgIGFzc2VydChhcnJbMV0uaW5k
ZXhPZigiYmFyIikgIT09IC0xKTsKKyAgICBhc3NlcnQoYXJyWzJdLmluZGV4T2YoImZvbyIpICE9
PSAtMSk7CisgICAgLy9wcmludChhcnIpOworfQorCitmdW5jdGlvbiBmb28oKSB7CisgICAgbGV0
IHYgPSB2YWx1ZSgpOworICAgIHRyeSB7CisgICAgICAgIHJldHVybiBiYXIoKSArIDE7CisgICAg
fSBjYXRjaChlKSB7CisgICAgICAgIC8vcHJpbnQoZS5zdGFjayk7CisgICAgICAgIGFzc2VydCh2
ID09PSAidmFsdWUiKTsKKyAgICAgICAgdmFsaWRhdGUoZS5zdGFjayk7CisgICAgfQorfQorbm9J
bmxpbmUoZm9vKTsKKworZnVuY3Rpb24gYmFyKCkgeworICAgIHJldHVybiBiYXooKSArIDE7Cit9
CisKK2Z1bmN0aW9uIGJheigpIHsgCisgICAgcmV0dXJuIGpheigpOworfQorCitsZXQgZmxhZyA9
IGZhbHNlOworZnVuY3Rpb24gamF6KCkgeyAKKyAgICBpZiAoZmxhZykKKyAgICAgICAgdGhyb3cg
bmV3IEVycm9yKCJsb2wiKTsKKyAgICByZXR1cm4gMjA7IAorfQorbm9JbmxpbmUoamF6KTsKKwor
Zm9yICh2YXIgaSA9IDA7IGkgPCA1MDAwMDsgaSsrKSB7CisgICAgZm9vKCk7Cit9CitmbGFnID0g
dHJ1ZTsKK2ZvbygpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy9m
dGwtdHJ5LWNhdGNoLXZhcmFyZ3MtY2FsbC10aHJvd3MuanMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL3Rlc3RzL3N0cmVzcy9mdGwtdHJ5LWNhdGNoLXZhcmFyZ3MtY2FsbC10
aHJvd3MuanMJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3Ry
ZXNzL2Z0bC10cnktY2F0Y2gtdmFyYXJncy1jYWxsLXRocm93cy5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDMyIEBACitmdW5jdGlvbiBmb28obywgYSkgeworICAgIGxldCByZXNldEZsYWcg
PSBmYWxzZTsKKyAgICBpZiAoZmxhZykgeworICAgICAgICByZXNldEZsYWcgPSB0cnVlOworICAg
ICAgICBmbGFnID0gZmFsc2U7CisgICAgfQorICAgIGxldCB4ID0gbygxMCk7CisgICAgbGV0IHkg
PSBvKDIwKTsKKyAgICBpZiAocmVzZXRGbGFnKQorICAgICAgICBmbGFnID0gdHJ1ZTsKKyAgICB0
cnkgeworICAgICAgICBvLmFwcGx5KG51bGwsIGEpOworICAgIH0gY2F0Y2goZSkgeworICAgICAg
ICBpZiAoeCAhPT0gMTApCisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vdCAxMCIpCisg
ICAgICAgIHJldHVybiB4ICsgeTsKKyAgICB9Cit9Citub0lubGluZShmb28pOwordmFyIGZsYWcg
PSBmYWxzZTsKK2Z1bmN0aW9uIGYoYXJnMSwgYXJnMiwgYXJnMykgeworICAgIGlmIChmbGFnKQor
ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImJsYWgiKQorICAgIHJldHVybiBhcmcxOworfQorbm9J
bmxpbmUoZik7CisKK2ZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDAwOyBpKyspIHsKKyAgICBmb28o
ZiwgWzEwLCAyMCwgMzBdKTsKK30KK2ZsYWcgPSB0cnVlOworZm9vKGYsIFsxMCwgMjAsIDMwXSk7
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNzL3RyeS1jYXRjaC1zdHVi
LXJvdXRpbmUtcmVwbGFjZWQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L3Rlc3RzL3N0cmVzcy90cnktY2F0Y2gtc3R1Yi1yb3V0aW5lLXJlcGxhY2VkLmpzCShyZXZpc2lv
biAxOTE5MzEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvc3RyZXNzL3RyeS1jYXRj
aC1zdHViLXJvdXRpbmUtcmVwbGFjZWQuanMJKHdvcmtpbmcgY29weSkKQEAgLTIxLDggKzIxLDE1
IEBAIGZ1bmN0aW9uIGFsbG9jYXRlKCkgewogZnVuY3Rpb24gaGVsbG8oKSB7IHJldHVybiAyMDsg
fQogbm9JbmxpbmUoaGVsbG8pOwogCitsZXQgX19qYXogPSB7fTsKK2Z1bmN0aW9uIGphenp5KCkg
eworICAgIHJldHVybiBfX2phejsKK30KK25vSW5saW5lKGphenp5KTsKKwogZnVuY3Rpb24gZm9v
KG8pIHsKICAgICBsZXQgYmF6ID0gaGVsbG8oKTsKKyAgICBsZXQgamF6ID0gamF6enkoKTsKICAg
ICBsZXQgdjsKICAgICB0cnkgewogICAgICAgICB2ID0gby5mOwpAQCAtMzAsNiArMzcsNyBAQCBm
dW5jdGlvbiBmb28obykgewogICAgICAgICB2ID0gby5mOwogICAgIH0gY2F0Y2goZSkgewogICAg
ICAgICBhc3NlcnQoYmF6ID09PSAyMCk7CisgICAgICAgIGFzc2VydChqYXogPT09IF9famF6KTsK
ICAgICAgICAgYXNzZXJ0KHYgPT09IDIpOyAvLyBSZWFsbHkgZmxhZ0NvdW50LgogICAgIH0KICAg
ICByZXR1cm4gdjsK
</data>
<flag name="review"
          id="289746"
          type_id="1"
          status="+"
          setter="fpizlo"
    />
          </attachment>
      

    </bug>

</bugzilla>