<?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>72367</bug_id>
          
          <creation_ts>2011-11-15 01:37:13 -0800</creation_ts>
          <short_desc>DFG should distinguish between constants in the constant pool and weak constants added as artifacts of code generation</short_desc>
          <delta_ts>2011-11-15 13:55:01 -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>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>72312</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Filip Pizlo">fpizlo</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>502733</commentid>
    <comment_count>0</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-11-15 01:37:13 -0800</bug_when>
    <thetext>Some constants come from the constant pool, which is derived directly from the source code.  These can be safely pinned by the code block.  Other constants are pure artifacts of code generation, such as structure references for heap access checks, and function constants for linked calls.  This latter set of constants should be referred to in a special way so that the GC knows that they are weak references.  Furthermore, the pseudo-constant support for CheckMethod should be eliminated and replaced with weak constants.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>502736</commentid>
    <comment_count>1</comment_count>
      <attachid>115124</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-11-15 01:44:56 -0800</bug_when>
    <thetext>Created attachment 115124
the patch

Running on bigmac...
376/376                                                          
Generating benchmark report at TipOfTree_WeakJSConst_SunSpiderV8Kraken_20111115_0124_benchReport.txt

Benchmark report for SunSpider, V8, and Kraken on bigmac.local (MacPro5,1).

VMs tested:
&quot;TipOfTree&quot; at /Volumes/Data/pizlo/quinary/OpenSource/WebKitBuild/Release/jsc (r100248)
&quot;WeakJSConst&quot; at /Volumes/Data/pizlo/OpenSource/WebKitBuild/Release/jsc (r100248)

Collected 12 samples per benchmark/VM, with 4 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.

                                            TipOfTree              WeakJSConst                                   
SunSpider:
   3d-cube                                7.4749+-0.0644          7.4299+-0.0192       
   3d-morph                               8.3845+-0.0461    ?     8.3906+-0.0284       ?
   3d-raytrace                            7.7442+-0.0700          7.6742+-0.0584       
   access-binary-trees                    1.6025+-0.0109    ?     1.6034+-0.0091       ?
   access-fannkuch                        7.5388+-0.0119    ?     7.5642+-0.0418       ?
   access-nbody                           4.2395+-0.0128    ^     4.1948+-0.0065       ^ definitely 1.0107x faster
   access-nsieve                          3.1577+-0.0480    ?     3.1684+-0.0500       ?
   bitops-3bit-bits-in-byte               1.2435+-0.0116          1.2418+-0.0119       
   bitops-bits-in-byte                    4.8996+-0.0090    ?     4.9031+-0.0096       ?
   bitops-bitwise-and                     3.2956+-0.0132          3.2876+-0.0039       
   bitops-nsieve-bits                     5.6474+-0.0347    ?     5.6776+-0.0355       ?
   controlflow-recursive                  2.2776+-0.0138    ?     2.2893+-0.0182       ?
   crypto-aes                             7.1383+-0.0307    ?     7.3632+-0.2517       ? might be 1.0315x slower
   crypto-md5                             2.5141+-0.0186    ?     2.5172+-0.0167       ?
   crypto-sha1                            2.2031+-0.0262          2.1913+-0.0143       
   date-format-tofte                     10.6322+-0.0729    ?    10.9712+-0.3371       ? might be 1.0319x slower
   date-format-xparb                     10.1367+-0.2002         10.0286+-0.1488         might be 1.0108x faster
   math-cordic                            7.1391+-0.0312          7.1318+-0.0148       
   math-partial-sums                     10.4731+-0.0346    ?    10.7321+-0.2996       ? might be 1.0247x slower
   math-spectral-norm                     2.6151+-0.0197          2.6026+-0.0024       
   regexp-dna                            13.3218+-0.1639         13.2719+-0.1412       
   string-base64                          4.0115+-0.0681          3.9744+-0.0308       
   string-fasta                           7.0860+-0.0260          7.0744+-0.0186       
   string-tagcloud                       13.2013+-0.0443    ?    13.2020+-0.0594       ?
   string-unpack-code                    22.6294+-0.0993    ?    22.7089+-0.2704       ?
   string-validate-input                  5.7298+-0.0414          5.7200+-0.0230       

   &lt;arithmetic&gt; *                         6.7822+-0.0247    ?     6.8044+-0.0282       ?
   &lt;geometric&gt;                            5.3983+-0.0200    ?     5.4067+-0.0192       ?
   &lt;harmonic&gt;                             4.2055+-0.0179    ?     4.2055+-0.0147       ?

                                            TipOfTree              WeakJSConst                                   
V8:
   crypto                                78.1498+-0.2724    ^    77.3261+-0.1327       ^ definitely 1.0107x faster
   deltablue                            173.6689+-0.8090    ^   168.7560+-0.5806       ^ definitely 1.0291x faster
   earley-boyer                         105.4148+-2.0278        104.7088+-1.1564       
   raytrace                              63.6958+-0.4413         63.3436+-0.4916       
   regexp                               124.1665+-0.3106        124.0606+-0.4326       
   richards                             140.4802+-1.0213    ^   137.4830+-0.6866       ^ definitely 1.0218x faster
   splay                                 90.1787+-0.8668    ?    91.1472+-0.7120       ? might be 1.0107x slower

   &lt;arithmetic&gt;                         110.8221+-0.3299    ^   109.5465+-0.1881       ^ definitely 1.0116x faster
   &lt;geometric&gt; *                        105.2702+-0.3705    ^   104.3266+-0.2047       ^ definitely 1.0090x faster
   &lt;harmonic&gt;                            99.9830+-0.3998    ^    99.2811+-0.2329       ^ definitely 1.0071x faster

                                            TipOfTree              WeakJSConst                                   
Kraken:
   ai-astar                             807.9812+-12.9122   !   827.6739+-0.3705       ! definitely 1.0244x slower
   audio-beat-detection                 206.9572+-0.5520    ^   205.2212+-0.7636       ^ definitely 1.0085x faster
   audio-dft                            262.6355+-2.1494    ?   263.0267+-2.3754       ?
   audio-fft                            134.7678+-0.4457    ^   133.4789+-0.8316       ^ definitely 1.0097x faster
   audio-oscillator                     290.3653+-1.2749    !   293.2817+-0.4361       ! definitely 1.0100x slower
   imaging-darkroom                     333.7685+-4.7964    ?   337.6759+-5.2766       ? might be 1.0117x slower
   imaging-desaturate                   240.9239+-0.1990        240.8862+-0.0772       
   imaging-gaussian-blur                620.7632+-0.1905    ^   620.3618+-0.1823       ^ definitely 1.0006x faster
   json-parse-financial                  73.1431+-0.5153    ^    71.4270+-0.0834       ^ definitely 1.0240x faster
   json-stringify-tinderbox              78.6364+-0.2496         78.4720+-0.1564       
   stanford-crypto-aes                  115.8029+-0.2686    !   119.1632+-1.5551       ! definitely 1.0290x slower
   stanford-crypto-ccm                  114.2002+-0.3795    ?   114.5494+-0.8313       ?
   stanford-crypto-pbkdf2               232.5823+-1.8490        230.6294+-1.1833       
   stanford-crypto-sha256-iterative      97.4059+-0.3245    ?    97.5911+-0.6459       ?

   &lt;arithmetic&gt; *                       257.8524+-1.0178    !   259.5313+-0.4196       ! definitely 1.0065x slower
   &lt;geometric&gt;                          198.5256+-0.3483    ?   198.9190+-0.3913       ?
   &lt;harmonic&gt;                           159.3606+-0.2079        159.1536+-0.3199       

                                            TipOfTree              WeakJSConst                                   
All benchmarks:
   &lt;arithmetic&gt;                          97.0644+-0.3347    ?    97.3868+-0.1179       ?
   &lt;geometric&gt;                           24.5881+-0.0648    ?    24.5908+-0.0486       ?
   &lt;harmonic&gt;                             7.4129+-0.0311          7.4123+-0.0253       

                                            TipOfTree              WeakJSConst                                   
Geomean of preferred means:
   &lt;scaled-result&gt;                       56.8869+-0.1522    ?    56.9013+-0.0887       ?

Sending VM builds to oldmac...
Running on oldmac...
376/376                                                          
Generating benchmark report at TipOfTree_WeakJSConst_SunSpiderV8Kraken_20111115_0127_benchReport.txt

Benchmark report for SunSpider, V8, and Kraken on oldmac.local (MacPro4,1).

VMs tested:
&quot;TipOfTree&quot; at /Volumes/Data/pizlo/quinary/OpenSource/WebKitBuild/Release/jsc (r100248)
&quot;WeakJSConst&quot; at /Volumes/Data/pizlo/OpenSource/WebKitBuild/Release/jsc (r100248)

Collected 12 samples per benchmark/VM, with 4 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.

                                            TipOfTree              WeakJSConst                                   
SunSpider:
   3d-cube                                8.9425+-0.0383    ?     8.9616+-0.0345       ?
   3d-morph                              10.2570+-0.1317    ?    10.2937+-0.1880       ?
   3d-raytrace                            9.2555+-0.1080          9.2050+-0.0553       
   access-binary-trees                    1.9135+-0.0095    ?     1.9174+-0.0079       ?
   access-fannkuch                        9.1043+-0.0106    ?     9.1074+-0.0059       ?
   access-nbody                           5.0819+-0.0142          5.0600+-0.0117       
   access-nsieve                          3.7666+-0.0575    ?     3.7699+-0.0527       ?
   bitops-3bit-bits-in-byte               1.4877+-0.0113          1.4803+-0.0027       
   bitops-bits-in-byte                    5.9165+-0.0190    ?     5.9399+-0.0100       ?
   bitops-bitwise-and                     3.9737+-0.0067          3.9719+-0.0046       
   bitops-nsieve-bits                     6.8549+-0.0430    ?     6.8720+-0.1110       ?
   controlflow-recursive                  2.7898+-0.0428          2.7436+-0.0167         might be 1.0168x faster
   crypto-aes                             8.5988+-0.0527    ?     8.6744+-0.0734       ?
   crypto-md5                             3.0130+-0.0175    ?     3.0381+-0.0485       ?
   crypto-sha1                            2.6243+-0.0170          2.6172+-0.0161       
   date-format-tofte                     13.1531+-0.1519         12.9377+-0.1004         might be 1.0166x faster
   date-format-xparb                     12.5332+-0.2095    ^    12.1236+-0.1408       ^ definitely 1.0338x faster
   math-cordic                            8.6686+-0.0594          8.6045+-0.0184       
   math-partial-sums                     12.6790+-0.1089         12.6032+-0.0355       
   math-spectral-norm                     3.1294+-0.0055    ?     3.1669+-0.0427       ? might be 1.0120x slower
   regexp-dna                            16.6257+-0.1365         16.4281+-0.1658         might be 1.0120x faster
   string-base64                          4.8965+-0.1119          4.8018+-0.0518         might be 1.0197x faster
   string-fasta                           8.5147+-0.0180    ?     8.5332+-0.0255       ?
   string-tagcloud                       16.2785+-0.2002         16.1218+-0.0840       
   string-unpack-code                    28.1218+-0.0674         27.9960+-0.0699       
   string-validate-input                  6.8594+-0.0535    ?     6.9221+-0.0654       ?

   &lt;arithmetic&gt; *                         8.2708+-0.0360          8.2266+-0.0344       
   &lt;geometric&gt;                            6.5372+-0.0279          6.5153+-0.0269       
   &lt;harmonic&gt;                             5.0648+-0.0211          5.0543+-0.0191       

                                            TipOfTree              WeakJSConst                                   
V8:
   crypto                                94.9970+-0.5431    ^    93.4692+-0.3338       ^ definitely 1.0163x faster
   deltablue                            211.1545+-1.9324    ^   204.2170+-0.6939       ^ definitely 1.0340x faster
   earley-boyer                         126.3291+-1.4626        126.3195+-1.2244       
   raytrace                              75.6431+-0.4070         75.5980+-0.1789       
   regexp                               148.4928+-0.3598    ?   149.1518+-0.6791       ?
   richards                             170.8354+-1.4016    ^   166.2814+-1.0149       ^ definitely 1.0274x faster
   splay                                108.2884+-2.0837    ?   109.2343+-3.2458       ?

   &lt;arithmetic&gt;                         133.6772+-0.4452    ^   132.0387+-0.4015       ^ definitely 1.0124x faster
   &lt;geometric&gt; *                        126.7711+-0.4663    ^   125.6073+-0.4761       ^ definitely 1.0093x faster
   &lt;harmonic&gt;                           120.2082+-0.4698        119.3899+-0.5073       

                                            TipOfTree              WeakJSConst                                   
Kraken:
   ai-astar                             895.7836+-0.5789    ?   895.9724+-0.3912       ?
   audio-beat-detection                 252.2690+-0.6783    ^   248.8660+-0.4767       ^ definitely 1.0137x faster
   audio-dft                            316.4345+-3.9175        315.3966+-2.9579       
   audio-fft                            164.5795+-0.6091    ^   162.6430+-1.1441       ^ definitely 1.0119x faster
   audio-oscillator                     352.6447+-1.1985        351.2094+-1.3555       
   imaging-darkroom                     407.3634+-9.4839        402.3328+-5.4317         might be 1.0125x faster
   imaging-desaturate                   291.1928+-0.0429    ?   291.3071+-0.2392       ?
   imaging-gaussian-blur                750.8642+-0.2608        750.8458+-0.1683       
   json-parse-financial                  88.7181+-0.8579    ^    87.0559+-0.0599       ^ definitely 1.0191x faster
   json-stringify-tinderbox              95.3538+-0.4301         95.2726+-0.8561       
   stanford-crypto-aes                  141.5629+-1.1342        141.2541+-0.8239       
   stanford-crypto-ccm                  135.5763+-0.4886    !   137.1899+-0.9901       ! definitely 1.0119x slower
   stanford-crypto-pbkdf2               283.6872+-3.0294        278.6610+-2.4037         might be 1.0180x faster
   stanford-crypto-sha256-iterative     117.9124+-0.2105    ?   117.9779+-0.3163       ?

   &lt;arithmetic&gt; *                       306.7102+-0.8325        305.4275+-0.5782       
   &lt;geometric&gt;                          239.1825+-0.6048    ^   237.9623+-0.4812       ^ definitely 1.0051x faster
   &lt;harmonic&gt;                           192.8737+-0.4437    ^   191.8515+-0.3680       ^ definitely 1.0053x faster

                                            TipOfTree              WeakJSConst                                   
All benchmarks:
   &lt;arithmetic&gt;                         115.8452+-0.2534    ^   115.1946+-0.1865       ^ definitely 1.0056x faster
   &lt;geometric&gt;                           29.7055+-0.0825         29.5646+-0.0737       
   &lt;harmonic&gt;                             8.9280+-0.0366          8.9088+-0.0329       

                                            TipOfTree              WeakJSConst                                   
Geomean of preferred means:
   &lt;scaled-result&gt;                       68.5112+-0.1737    ^    68.0838+-0.1387       ^ definitely 1.0063x faster</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>502746</commentid>
    <comment_count>2</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-11-15 02:06:35 -0800</bug_when>
    <thetext>Performance from one other machine...



Benchmark report for SunSpider, V8, and Kraken on nitroflex.local (MacBookPro8,2).

VMs tested:
&quot;TipOfTree&quot; at /Volumes/Data/pizlo/quinary/OpenSource/WebKitBuild/Release/jsc (r100248)
&quot;WeakJSConst&quot; at /Volumes/Data/pizlo/OpenSource/WebKitBuild/Release/jsc (r100248)

Collected 12 samples per benchmark/VM, with 4 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.

                                            TipOfTree              WeakJSConst                                   
SunSpider:
   3d-cube                                6.9690+-0.1862          6.8899+-0.1703         might be 1.0115x faster
   3d-morph                               7.5911+-0.1116    ?     8.0039+-0.8044       ? might be 1.0544x slower
   3d-raytrace                            7.2039+-0.1805          7.0971+-0.1649         might be 1.0150x faster
   access-binary-trees                    1.5393+-0.0630          1.5069+-0.0386         might be 1.0216x faster
   access-fannkuch                        6.1566+-0.1158    ?     6.1892+-0.1367       ?
   access-nbody                           3.5211+-0.0853          3.4606+-0.0575         might be 1.0175x faster
   access-nsieve                          2.5639+-0.1050    ?     2.6152+-0.0919       ? might be 1.0200x slower
   bitops-3bit-bits-in-byte               1.2652+-0.0240    ?     1.2688+-0.0262       ?
   bitops-bits-in-byte                    2.3806+-0.0723    ?     2.3888+-0.0622       ?
   bitops-bitwise-and                     3.4731+-0.0593          3.4184+-0.0741         might be 1.0160x faster
   bitops-nsieve-bits                     5.2280+-0.0928    ?     5.3354+-0.0887       ? might be 1.0205x slower
   controlflow-recursive                  2.0994+-0.0654          2.0638+-0.0416         might be 1.0172x faster
   crypto-aes                             6.8391+-0.2195    ?     6.9613+-0.2245       ? might be 1.0179x slower
   crypto-md5                             2.4006+-0.0919          2.3620+-0.0525         might be 1.0163x faster
   crypto-sha1                            2.0546+-0.0506    ?     2.0591+-0.0574       ?
   date-format-tofte                      9.9640+-0.1418          9.9102+-0.1292       
   date-format-xparb                      9.7058+-0.2774          9.3958+-0.2312         might be 1.0330x faster
   math-cordic                            6.2552+-0.0733    ?     6.2652+-0.0978       ?
   math-partial-sums                      7.4376+-0.1587    ?     7.4660+-0.1481       ?
   math-spectral-norm                     2.3454+-0.0588    ?     2.3696+-0.0535       ? might be 1.0103x slower
   regexp-dna                            11.6714+-0.1873         11.4908+-0.2494         might be 1.0157x faster
   string-base64                          3.8272+-0.0690          3.7632+-0.0545         might be 1.0170x faster
   string-fasta                           6.2927+-0.1082          6.2699+-0.0873       
   string-tagcloud                       11.6750+-0.3077         11.5916+-0.2417       
   string-unpack-code                    19.7977+-0.2062    ?    20.0248+-0.2556       ? might be 1.0115x slower
   string-validate-input                  5.1825+-0.0683    !     5.4800+-0.1552       ! definitely 1.0574x slower

   &lt;arithmetic&gt; *                         5.9785+-0.0166    ?     5.9864+-0.0459       ?
   &lt;geometric&gt;                            4.7712+-0.0178    ?     4.7726+-0.0391       ?
   &lt;harmonic&gt;                             3.7762+-0.0325          3.7713+-0.0396       

                                            TipOfTree              WeakJSConst                                   
V8:
   crypto                                70.0168+-0.5636         69.9285+-0.7331       
   deltablue                            154.7862+-0.7264    ^   147.1490+-0.4319       ^ definitely 1.0519x faster
   earley-boyer                          84.8812+-0.8977    ?    85.2087+-0.7574       ?
   raytrace                              56.3155+-0.5422         56.1517+-0.4802       
   regexp                               103.6272+-0.6497    ?   103.6485+-0.5164       ?
   richards                             122.4161+-1.0821    ^   117.1848+-0.9286       ^ definitely 1.0446x faster
   splay                                 70.8845+-0.8013    ?    72.0424+-1.1337       ? might be 1.0163x slower

   &lt;arithmetic&gt;                          94.7039+-0.2980    ^    93.0448+-0.2858       ^ definitely 1.0178x faster
   &lt;geometric&gt; *                         89.6551+-0.3417    ^    88.6580+-0.3171       ^ definitely 1.0112x faster
   &lt;harmonic&gt;                            85.1384+-0.3823         84.6244+-0.3477       

                                            TipOfTree              WeakJSConst                                   
Kraken:
   ai-astar                             488.3918+-4.9309    ?   490.9525+-4.5239       ?
   audio-beat-detection                 185.6475+-0.5684    !   188.4291+-2.0541       ! definitely 1.0150x slower
   audio-dft                            263.5478+-4.2151        263.1814+-5.5742       
   audio-fft                            123.2022+-0.6668    ^   121.9842+-0.5167       ^ definitely 1.0100x faster
   audio-oscillator                     249.5455+-1.0532    ?   250.0184+-2.5857       ?
   imaging-darkroom                     295.9794+-3.5622    ?   297.4527+-4.3890       ?
   imaging-desaturate                   221.5647+-0.4850    ?   222.1165+-0.8970       ?
   imaging-gaussian-blur                547.5262+-2.6360        545.9149+-3.1049       
   json-parse-financial                  56.8624+-0.4049    !    57.6907+-0.3272       ! definitely 1.0146x slower
   json-stringify-tinderbox              66.7937+-0.3418    ?    66.9288+-0.2141       ?
   stanford-crypto-aes                   97.5175+-1.9351    ^    94.2016+-0.6394       ^ definitely 1.0352x faster
   stanford-crypto-ccm                   97.4379+-0.4193    ?    98.2483+-1.1594       ?
   stanford-crypto-pbkdf2               187.9402+-1.2941        186.8538+-1.5546       
   stanford-crypto-sha256-iterative      80.3322+-0.3642    ^    79.5220+-0.3426       ^ definitely 1.0102x faster

   &lt;arithmetic&gt; *                       211.5921+-0.4609    ?   211.6782+-0.4314       ?
   &lt;geometric&gt;                          168.0736+-0.2727        167.9442+-0.3710       
   &lt;harmonic&gt;                           134.7031+-0.3014        134.5551+-0.3801       

                                            TipOfTree              WeakJSConst                                   
All benchmarks:
   &lt;arithmetic&gt;                          80.4395+-0.1392         80.2225+-0.1521       
   &lt;geometric&gt;                           21.3370+-0.0543         21.2998+-0.1130       
   &lt;harmonic&gt;                             6.6465+-0.0559          6.6375+-0.0682       

                                            TipOfTree              WeakJSConst                                   
Geomean of preferred means:
   &lt;scaled-result&gt;                       48.4045+-0.0913         48.2519+-0.1704</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>503053</commentid>
    <comment_count>3</comment_count>
      <attachid>115124</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2011-11-15 10:54:54 -0800</bug_when>
    <thetext>Comment on attachment 115124
the patch

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

r=me

&gt; Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp:540
&gt; +        HashMap&lt;JSCell*, NodeIndex&gt;::iterator iter = m_cellConstantNodes.find(cell);
&gt; +        if (iter != m_cellConstantNodes.end())
&gt; +            return iter-&gt;second;
&gt; +        
&gt; +        NodeIndex result = addToGraph(WeakJSConstant, OpInfo(cell));
&gt; +        m_cellConstantNodes.add(cell, result);
&gt; +        return result;

The idiom for &quot;add if not existing&quot; is:

pair&lt;iterator, bool&gt; result = table.add(DummyValue);
if (result.second)
    result.first-&gt;second = RealValue;

This saves a redundant hash lookup when first adding something to the table.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>503160</commentid>
    <comment_count>4</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-11-15 12:38:11 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 115124 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=115124&amp;action=review
&gt; 
&gt; r=me
&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp:540
&gt; &gt; +        HashMap&lt;JSCell*, NodeIndex&gt;::iterator iter = m_cellConstantNodes.find(cell);
&gt; &gt; +        if (iter != m_cellConstantNodes.end())
&gt; &gt; +            return iter-&gt;second;
&gt; &gt; +        
&gt; &gt; +        NodeIndex result = addToGraph(WeakJSConstant, OpInfo(cell));
&gt; &gt; +        m_cellConstantNodes.add(cell, result);
&gt; &gt; +        return result;
&gt; 
&gt; The idiom for &quot;add if not existing&quot; is:
&gt; 
&gt; pair&lt;iterator, bool&gt; result = table.add(DummyValue);
&gt; if (result.second)
&gt;     result.first-&gt;second = RealValue;
&gt; 
&gt; This saves a redundant hash lookup when first adding something to the table.

Ah, good point.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>503232</commentid>
    <comment_count>5</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-11-15 13:55:01 -0800</bug_when>
    <thetext>http://trac.webkit.org/changeset/100315</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>115124</attachid>
            <date>2011-11-15 01:44:56 -0800</date>
            <delta_ts>2011-11-15 10:54:54 -0800</delta_ts>
            <desc>the patch</desc>
            <filename>weakconst_patch_1.diff</filename>
            <type>text/plain</type>
            <size>24504</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTAwMjUyKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDUxIEBA
CisyMDExLTExLTE1ICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAg
REZHIHNob3VsZCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGNvbnN0YW50cyBpbiB0aGUgY29uc3RhbnQg
cG9vbCBhbmQgd2VhaworICAgICAgICBjb25zdGFudHMgYWRkZWQgYXMgYXJ0aWZhY3RzIG9mIGNv
ZGUgZ2VuZXJhdGlvbgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9NzIzNjcKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKyAgICAg
ICAgCisgICAgICAgIEFkZGVkIHRoZSBub3Rpb24gb2YgYSBXZWFrSlNDb25zdGFudCwgd2hpY2gg
aXMgbGlrZSBhIEpTQ29uc3RhbnQgZXhjZXB0IHRoYXQKKyAgICAgICAgaXQgY2FuIG9ubHkgcmVm
ZXIgdG8gSlNDZWxsKi4gQ3VycmVudGx5IGFsbCBXZWFrSlNDb25zdGFudHMgYXJlIGFsc28gYmFj
a2VkCisgICAgICAgIGJ5IGNvbnN0YW50cyBpbiB0aGUgY29uc3RhbnQgcG9vbCwgc2luY2Ugd2Vh
ayByZWZlcmVuY2VzIG9yaWdpbmF0ZWQgZnJvbQorICAgICAgICBtYWNoaW5lIGNvZGUgYXJlIG5v
dCB5ZXQgcHJvcGVybHkgaGFuZGxlZC4KKyAgICAgICAgCisgICAgICAgIFJlcGxhY2VkIENoZWNr
TWV0aG9kLCBhbmQgTWV0aG9kQ2hlY2tEYXRhLCB3aXRoIGEgY29tYmluYXRpb24gb2YgV2Vha0pT
Q29uc3RhbnQKKyAgICAgICAgYW5kIENoZWNrU3RydWN0dXJlLiBUaGlzIHJlc3VsdHMgaW4gaW1w
cm92ZWQgQ1NFLCBsZWFkaW5nIHRvIGEgMSUgd2luIG9uIFY4LgorCisgICAgICAgICogZGZnL0RG
R0Fic3RyYWN0U3RhdGUuY3BwOgorICAgICAgICAoSlNDOjpERkc6OkFic3RyYWN0U3RhdGU6OmV4
ZWN1dGUpOgorICAgICAgICAqIGRmZy9ERkdCeXRlQ29kZVBhcnNlci5jcHA6CisgICAgICAgIChK
U0M6OkRGRzo6Qnl0ZUNvZGVQYXJzZXI6OmNlbGxDb25zdGFudCk6CisgICAgICAgIChKU0M6OkRG
Rzo6Qnl0ZUNvZGVQYXJzZXI6OnByZXBhcmVUb1BhcnNlQmxvY2spOgorICAgICAgICAoSlNDOjpE
Rkc6OkJ5dGVDb2RlUGFyc2VyOjpwYXJzZUJsb2NrKToKKyAgICAgICAgKiBkZmcvREZHR3JhcGgu
Y3BwOgorICAgICAgICAoSlNDOjpERkc6OkdyYXBoOjpkdW1wKToKKyAgICAgICAgKiBkZmcvREZH
R3JhcGguaDoKKyAgICAgICAgKEpTQzo6REZHOjpHcmFwaDo6Z2V0SlNDb25zdGFudFByZWRpY3Rp
b24pOgorICAgICAgICAoSlNDOjpERkc6OkdyYXBoOjp2YWx1ZU9mSlNDb25zdGFudCk6CisgICAg
ICAgIChKU0M6OkRGRzo6R3JhcGg6OnZhbHVlT2ZJbnQzMkNvbnN0YW50KToKKyAgICAgICAgKEpT
Qzo6REZHOjpHcmFwaDo6dmFsdWVPZk51bWJlckNvbnN0YW50KToKKyAgICAgICAgKEpTQzo6REZH
OjpHcmFwaDo6dmFsdWVPZkJvb2xlYW5Db25zdGFudCk6CisgICAgICAgICogZGZnL0RGR05vZGUu
aDoKKyAgICAgICAgKEpTQzo6REZHOjpOb2RlOjppc1dlYWtDb25zdGFudCk6CisgICAgICAgIChK
U0M6OkRGRzo6Tm9kZTo6aGFzQ29uc3RhbnQpOgorICAgICAgICAoSlNDOjpERkc6Ok5vZGU6Ondl
YWtDb25zdGFudCk6CisgICAgICAgIChKU0M6OkRGRzo6Tm9kZTo6dmFsdWVPZkpTQ29uc3RhbnQp
OgorICAgICAgICAoSlNDOjpERkc6Ok5vZGU6OmlzSW50MzJDb25zdGFudCk6CisgICAgICAgIChK
U0M6OkRGRzo6Tm9kZTo6aXNEb3VibGVDb25zdGFudCk6CisgICAgICAgIChKU0M6OkRGRzo6Tm9k
ZTo6aXNOdW1iZXJDb25zdGFudCk6CisgICAgICAgIChKU0M6OkRGRzo6Tm9kZTo6aXNCb29sZWFu
Q29uc3RhbnQpOgorICAgICAgICAoSlNDOjpERkc6Ok5vZGU6Omhhc0lkZW50aWZpZXIpOgorICAg
ICAgICAqIGRmZy9ERkdQcm9wYWdhdG9yLmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpQcm9wYWdh
dG9yOjpwcm9wYWdhdGVOb2RlUHJlZGljdGlvbnMpOgorICAgICAgICAoSlNDOjpERkc6OlByb3Bh
Z2F0b3I6OnBlcmZvcm1Ob2RlQ1NFKToKKyAgICAgICAgKiBkZmcvREZHU3BlY3VsYXRpdmVKSVQz
Ml82NC5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6U3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGUpOgor
ICAgICAgICAqIGRmZy9ERkdTcGVjdWxhdGl2ZUpJVDY0LmNwcDoKKyAgICAgICAgKEpTQzo6REZH
OjpTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZSk6CisKIDIwMTEtMTEtMTQgIEZpbGlwIFBpemxvICA8
ZnBpemxvQGFwcGxlLmNvbT4KIAogICAgICAgICBERkc6OlNwZWN1bGF0aXZlSklUIGFuZCBERkc6
OkpJVENvZGVHZW5lcmF0b3Igc2hvdWxkIGJlIGNvbWJpbmVkCkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR0Fic3RyYWN0U3RhdGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9kZmcvREZHQWJzdHJhY3RTdGF0ZS5jcHAJKHJldmlzaW9uIDEwMDI0OCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQWJzdHJhY3RTdGF0ZS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTE2OCw3ICsxNjgsOCBAQCBib29sIEFic3RyYWN0U3RhdGU6OmV4ZWN1dGUo
Tm9kZUluZGV4IG5vCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAKICAgICBzd2l0Y2gg
KG5vZGUub3ApIHsKLSAgICBjYXNlIEpTQ29uc3RhbnQ6IHsKKyAgICBjYXNlIEpTQ29uc3RhbnQ6
CisgICAgY2FzZSBXZWFrSlNDb25zdGFudDogewogICAgICAgICBKU1ZhbHVlIHZhbHVlID0gbV9n
cmFwaC52YWx1ZU9mSlNDb25zdGFudChtX2NvZGVCbG9jaywgbm9kZUluZGV4KTsKICAgICAgICAg
aWYgKHZhbHVlLmlzQ2VsbCgpKQogICAgICAgICAgICAgbV9oYXZlU3RydWN0dXJlcyA9IHRydWU7
CkBAIC02MDEsMTMgKzYwMiw2IEBAIGJvb2wgQWJzdHJhY3RTdGF0ZTo6ZXhlY3V0ZShOb2RlSW5k
ZXggbm8KICAgICAgICAgZm9yTm9kZShub2RlLmNoaWxkMSgpKS5maWx0ZXIoUHJlZGljdENlbGwp
OwogICAgICAgICBicmVhazsKICAgICAgICAgICAgIAotICAgIGNhc2UgQ2hlY2tNZXRob2Q6Ci0g
ICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgYmUgYWJsZSB0byBwcm9wYWdhdGUgdGhlIHN0cnVj
dHVyZSBzZXRzIG9mIGNvbnN0YW50cyAoaS5lLiBwcm90b3R5cGVzKS4KLSAgICAgICAgZm9yTm9k
ZShub2RlLmNoaWxkMSgpKS5maWx0ZXIobV9ncmFwaC5tX21ldGhvZENoZWNrRGF0YVtub2RlLm1l
dGhvZENoZWNrRGF0YUluZGV4KCldLnN0cnVjdHVyZSk7Ci0gICAgICAgIGZvck5vZGUobm9kZUlu
ZGV4KS5zZXQoUHJlZGljdEZ1bmN0aW9uKTsKLSAgICAgICAgbV9oYXZlU3RydWN0dXJlcyA9IHRy
dWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgICAKICAgICBjYXNlIENoZWNrRnVuY3Rpb246CiAg
ICAgICAgIGZvck5vZGUobm9kZS5jaGlsZDEoKSkuZmlsdGVyKFByZWRpY3RGdW5jdGlvbik7CiAg
ICAgICAgIC8vIEZJWE1FOiBTaG91bGQgYmUgYWJsZSB0byBwcm9wYWdhdGUgdGhlIGZhY3QgdGhh
dCB3ZSBrbm93IHdoYXQgdGhlIGZ1bmN0aW9uIGlzLgpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2RmZy9ERkdCeXRlQ29kZVBhcnNlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL2RmZy9ERkdCeXRlQ29kZVBhcnNlci5jcHAJKHJldmlzaW9uIDEwMDI0OCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQnl0ZUNvZGVQYXJzZXIuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC01MzEsNyArNTMxLDEzIEBAIHByaXZhdGU6CiAgICAgCiAgICAgTm9kZUluZGV4
IGNlbGxDb25zdGFudChKU0NlbGwqIGNlbGwpCiAgICAgewotICAgICAgICByZXR1cm4gZ2V0SlND
b25zdGFudChnZXRDZWxsQ29uc3RhbnRJbmRleChjZWxsKSk7CisgICAgICAgIEhhc2hNYXA8SlND
ZWxsKiwgTm9kZUluZGV4Pjo6aXRlcmF0b3IgaXRlciA9IG1fY2VsbENvbnN0YW50Tm9kZXMuZmlu
ZChjZWxsKTsKKyAgICAgICAgaWYgKGl0ZXIgIT0gbV9jZWxsQ29uc3RhbnROb2Rlcy5lbmQoKSkK
KyAgICAgICAgICAgIHJldHVybiBpdGVyLT5zZWNvbmQ7CisgICAgICAgIAorICAgICAgICBOb2Rl
SW5kZXggcmVzdWx0ID0gYWRkVG9HcmFwaChXZWFrSlNDb25zdGFudCwgT3BJbmZvKGNlbGwpKTsK
KyAgICAgICAgbV9jZWxsQ29uc3RhbnROb2Rlcy5hZGQoY2VsbCwgcmVzdWx0KTsKKyAgICAgICAg
cmV0dXJuIHJlc3VsdDsKICAgICB9CiAgICAgCiAgICAgQ29kZU9yaWdpbiBjdXJyZW50Q29kZU9y
aWdpbigpCkBAIC03MzQsNiArNzQwLDcgQEAgcHJpdmF0ZToKICAgICB1bnNpZ25lZCBtX2NvbnN0
YW50TmFOOwogICAgIHVuc2lnbmVkIG1fY29uc3RhbnQxOwogICAgIEhhc2hNYXA8SlNDZWxsKiwg
dW5zaWduZWQ+IG1fY2VsbENvbnN0YW50czsKKyAgICBIYXNoTWFwPEpTQ2VsbCosIE5vZGVJbmRl
eD4gbV9jZWxsQ29uc3RhbnROb2RlczsKIAogICAgIC8vIEEgY29uc3RhbnQgaW4gdGhlIGNvbnN0
YW50IHBvb2wgbWF5IGJlIHJlcHJlc2VudGVkIGJ5IG1vcmUgdGhhbiBvbmUKICAgICAvLyBub2Rl
IGluIHRoZSBncmFwaCwgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIGJl
aW5nIHVzZWQuCkBAIC0xMjU1LDYgKzEyNjIsNyBAQCB2b2lkIEJ5dGVDb2RlUGFyc2VyOjpwcmVw
YXJlVG9QYXJzZUJsb2NrCiB7CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fY29uc3Rh
bnRzLnNpemUoKTsgKytpKQogICAgICAgICBtX2NvbnN0YW50c1tpXSA9IENvbnN0YW50UmVjb3Jk
KCk7CisgICAgbV9jZWxsQ29uc3RhbnROb2Rlcy5jbGVhcigpOwogfQogCiBib29sIEJ5dGVDb2Rl
UGFyc2VyOjpwYXJzZUJsb2NrKHVuc2lnbmVkIGxpbWl0KQpAQCAtMTY2OCwyMCArMTY3NiwxNiBA
QCBib29sIEJ5dGVDb2RlUGFyc2VyOjpwYXJzZUJsb2NrKHVuc2lnbmVkCiAgICAgICAgICAgICAg
ICAgLy8gSXQncyBtb25vbW9ycGhpYyBhcyBmYXIgYXMgd2UgY2FuIHRlbGwsIHNpbmNlIHRoZSBt
ZXRob2RfY2hlY2sgd2FzIGxpbmtlZAogICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGUgc2xvdyBw
YXRoIChpLmUuIHRoZSBub3JtYWwgZ2V0X2J5X2lkKSBuZXZlciBmaXJlZC4KIAotICAgICAgICAg
ICAgICAgIHBpbkNlbGwobWV0aG9kQ2FsbC5jYWNoZWRTdHJ1Y3R1cmUuZ2V0KCkpOwotICAgICAg
ICAgICAgICAgIHBpbkNlbGwobWV0aG9kQ2FsbC5jYWNoZWRQcm90b3R5cGVTdHJ1Y3R1cmUuZ2V0
KCkpOwotICAgICAgICAgICAgICAgIHBpbkNlbGwobWV0aG9kQ2FsbC5jYWNoZWRGdW5jdGlvbi5n
ZXQoKSk7Ci0gICAgICAgICAgICAgICAgcGluQ2VsbChtZXRob2RDYWxsLmNhY2hlZFByb3RvdHlw
ZS5nZXQoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBOb2RlSW5kZXggY2hlY2tN
ZXRob2QgPSBhZGRUb0dyYXBoKENoZWNrTWV0aG9kLCBPcEluZm8oaWRlbnRpZmllciksIE9wSW5m
byhtX2dyYXBoLm1fbWV0aG9kQ2hlY2tEYXRhLnNpemUoKSksIGJhc2UpOwotICAgICAgICAgICAg
ICAgIHNldChnZXRJbnN0cnVjdGlvblsxXS51Lm9wZXJhbmQsIGNoZWNrTWV0aG9kKTsKKyAgICAg
ICAgICAgICAgICBwaW5DZWxsKG1ldGhvZENhbGwuY2FjaGVkU3RydWN0dXJlLmdldCgpKTsgLy8g
Zmlyc3QgY2hlY2sKKyAgICAgICAgICAgICAgICBwaW5DZWxsKG1ldGhvZENhbGwuY2FjaGVkUHJv
dG90eXBlLmdldCgpKTsgLy8gc2Vjb25kIGNoZWNrCisgICAgICAgICAgICAgICAgcGluQ2VsbCht
ZXRob2RDYWxsLmNhY2hlZFByb3RvdHlwZVN0cnVjdHVyZS5nZXQoKSk7IC8vIHNlY29uZCBjaGVj
aworICAgICAgICAgICAgICAgIHBpbkNlbGwobWV0aG9kQ2FsbC5jYWNoZWRGdW5jdGlvbi5nZXQo
KSk7IC8vIHJlc3VsdAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGFkZFRvR3Jh
cGgoQ2hlY2tTdHJ1Y3R1cmUsIE9wSW5mbyhtX2dyYXBoLmFkZFN0cnVjdHVyZVNldChtZXRob2RD
YWxsLmNhY2hlZFN0cnVjdHVyZS5nZXQoKSkpLCBiYXNlKTsKKyAgICAgICAgICAgICAgICBpZiAo
bWV0aG9kQ2FsbC5jYWNoZWRQcm90b3R5cGUuZ2V0KCkgIT0gbV9pbmxpbmVTdGFja1RvcC0+bV9w
cm9maWxlZEJsb2NrLT5nbG9iYWxPYmplY3QoKS0+bWV0aG9kQ2FsbER1bW15KCkpCisgICAgICAg
ICAgICAgICAgICAgIGFkZFRvR3JhcGgoQ2hlY2tTdHJ1Y3R1cmUsIE9wSW5mbyhtX2dyYXBoLmFk
ZFN0cnVjdHVyZVNldChtZXRob2RDYWxsLmNhY2hlZFByb3RvdHlwZVN0cnVjdHVyZS5nZXQoKSkp
LCBjZWxsQ29uc3RhbnQobWV0aG9kQ2FsbC5jYWNoZWRQcm90b3R5cGUuZ2V0KCkpKTsKICAgICAg
ICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBNZXRob2RDaGVja0RhdGEgbWV0aG9kQ2hlY2tE
YXRhOwotICAgICAgICAgICAgICAgIG1ldGhvZENoZWNrRGF0YS5zdHJ1Y3R1cmUgPSBtZXRob2RD
YWxsLmNhY2hlZFN0cnVjdHVyZS5nZXQoKTsKLSAgICAgICAgICAgICAgICBtZXRob2RDaGVja0Rh
dGEucHJvdG90eXBlU3RydWN0dXJlID0gbWV0aG9kQ2FsbC5jYWNoZWRQcm90b3R5cGVTdHJ1Y3R1
cmUuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgbWV0aG9kQ2hlY2tEYXRhLmZ1bmN0aW9uID0gbWV0
aG9kQ2FsbC5jYWNoZWRGdW5jdGlvbi5nZXQoKTsKLSAgICAgICAgICAgICAgICBtZXRob2RDaGVj
a0RhdGEucHJvdG90eXBlID0gbWV0aG9kQ2FsbC5jYWNoZWRQcm90b3R5cGUuZ2V0KCk7Ci0gICAg
ICAgICAgICAgICAgbV9ncmFwaC5tX21ldGhvZENoZWNrRGF0YS5hcHBlbmQobWV0aG9kQ2hlY2tE
YXRhKTsKKyAgICAgICAgICAgICAgICBzZXQoZ2V0SW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kLCBj
ZWxsQ29uc3RhbnQobWV0aG9kQ2FsbC5jYWNoZWRGdW5jdGlvbi5nZXQoKSkpOwogICAgICAgICAg
ICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBOb2RlSW5kZXggZ2V0TWV0aG9kID0gYWRkVG9H
cmFwaChHZXRNZXRob2QsIE9wSW5mbyhpZGVudGlmaWVyKSwgT3BJbmZvKHByZWRpY3Rpb24pLCBi
YXNlKTsKICAgICAgICAgICAgICAgICBzZXQoZ2V0SW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kLCBn
ZXRNZXRob2QpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdHcmFwaC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdHcmFwaC5jcHAJKHJl
dmlzaW9uIDEwMDI0OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHR3JhcGguY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0yNDIsNiArMjQyLDEwIEBAIHZvaWQgR3JhcGg6OmR1bXAoTm9k
ZUluZGV4IG5vZGVJbmRleCwgQ28KICAgICAgICAgfQogICAgICAgICBoYXNQcmludGVkID0gdHJ1
ZTsKICAgICB9CisgICAgaWYgKG9wID09IFdlYWtKU0NvbnN0YW50KSB7CisgICAgICAgIHByaW50
ZigiJXMlcCIsIGhhc1ByaW50ZWQgPyAiLCAiIDogIiIsIG5vZGUud2Vha0NvbnN0YW50KCkpOwor
ICAgICAgICBoYXNQcmludGVkID0gdHJ1ZTsKKyAgICB9CiAgICAgaWYgIChub2RlLmlzQnJhbmNo
KCkgfHwgbm9kZS5pc0p1bXAoKSkgewogICAgICAgICBwcmludGYoIiVzVDojJXUiLCBoYXNQcmlu
dGVkID8gIiwgIiA6ICIiLCBub2RlLnRha2VuQmxvY2tJbmRleCgpKTsKICAgICAgICAgaGFzUHJp
bnRlZCA9IHRydWU7CkBAIC0yNjEsMzEgKzI2NSw2IEBAIHZvaWQgR3JhcGg6OmR1bXAoTm9kZUlu
ZGV4IG5vZGVJbmRleCwgQ28KICAgICAgICAgICAgIHByaW50ZigiICBwcmVkaWN0aW5nICVzIiwg
cHJlZGljdGlvblRvU3RyaW5nKGdldEdsb2JhbFZhclByZWRpY3Rpb24obm9kZS52YXJOdW1iZXIo
KSkpKTsKICAgICAgICAgZWxzZSBpZiAobm9kZS5oYXNIZWFwUHJlZGljdGlvbigpKQogICAgICAg
ICAgICAgcHJpbnRmKCIgIHByZWRpY3RpbmcgJXMiLCBwcmVkaWN0aW9uVG9TdHJpbmcobm9kZS5n
ZXRIZWFwUHJlZGljdGlvbigpKSk7Ci0gICAgICAgIGVsc2UgaWYgKG5vZGUuaGFzTWV0aG9kQ2hl
Y2tEYXRhKCkpIHsKLSAgICAgICAgICAgIE1ldGhvZENoZWNrRGF0YSYgbWV0aG9kQ2hlY2tEYXRh
ID0gbV9tZXRob2RDaGVja0RhdGFbbm9kZS5tZXRob2RDaGVja0RhdGFJbmRleCgpXTsKLSAgICAg
ICAgICAgIEpTQ2VsbCogZnVuY3Rpb25DZWxsID0gZ2V0SlNGdW5jdGlvbihtZXRob2RDaGVja0Rh
dGEuZnVuY3Rpb24pOwotICAgICAgICAgICAgRXhlY3V0YWJsZUJhc2UqIGV4ZWN1dGFibGUgPSAw
OwotICAgICAgICAgICAgQ29kZUJsb2NrKiBwcmltYXJ5Rm9yQ2FsbCA9IDA7Ci0gICAgICAgICAg
ICBDb2RlQmxvY2sqIHNlY29uZGFyeUZvckNhbGwgPSAwOwotICAgICAgICAgICAgQ29kZUJsb2Nr
KiBwcmltYXJ5Rm9yQ29uc3RydWN0ID0gMDsKLSAgICAgICAgICAgIENvZGVCbG9jayogc2Vjb25k
YXJ5Rm9yQ29uc3RydWN0ID0gMDsKLSAgICAgICAgICAgIGlmIChmdW5jdGlvbkNlbGwpIHsKLSAg
ICAgICAgICAgICAgICBKU0Z1bmN0aW9uKiBmdW5jdGlvbiA9IGFzRnVuY3Rpb24oZnVuY3Rpb25D
ZWxsKTsKLSAgICAgICAgICAgICAgICBleGVjdXRhYmxlID0gZnVuY3Rpb24tPmV4ZWN1dGFibGUo
KTsKLSAgICAgICAgICAgICAgICBpZiAoIWV4ZWN1dGFibGUtPmlzSG9zdEZ1bmN0aW9uKCkpIHsK
LSAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25FeGVjdXRhYmxlKiBmdW5jdGlvbkV4ZWN1dGFi
bGUgPSBzdGF0aWNfY2FzdDxGdW5jdGlvbkV4ZWN1dGFibGUqPihleGVjdXRhYmxlKTsKLSAgICAg
ICAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uRXhlY3V0YWJsZS0+aXNHZW5lcmF0ZWRGb3JDYWxs
KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlGb3JDYWxsID0gJmZ1bmN0aW9u
RXhlY3V0YWJsZS0+Z2VuZXJhdGVkQnl0ZWNvZGVGb3JDYWxsKCk7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBzZWNvbmRhcnlGb3JDYWxsID0gcHJpbWFyeUZvckNhbGwtPmFsdGVybmF0aXZlKCk7
Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9u
RXhlY3V0YWJsZS0+aXNHZW5lcmF0ZWRGb3JDb25zdHJ1Y3QoKSkgewotICAgICAgICAgICAgICAg
ICAgICAgICAgcHJpbWFyeUZvckNvbnN0cnVjdCA9ICZmdW5jdGlvbkV4ZWN1dGFibGUtPmdlbmVy
YXRlZEJ5dGVjb2RlRm9yQ29uc3RydWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWNv
bmRhcnlGb3JDb25zdHJ1Y3QgPSBwcmltYXJ5Rm9yQ29uc3RydWN0LT5hbHRlcm5hdGl2ZSgpOwot
ICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQot
ICAgICAgICAgICAgcHJpbnRmKCIgIHByZWRpY3RpbmcgZnVuY3Rpb24gJXAoJXAoJXAoJXApICVw
KCVwKSkpIiwgbWV0aG9kQ2hlY2tEYXRhLmZ1bmN0aW9uLCBleGVjdXRhYmxlLCBwcmltYXJ5Rm9y
Q2FsbCwgc2Vjb25kYXJ5Rm9yQ2FsbCwgcHJpbWFyeUZvckNvbnN0cnVjdCwgc2Vjb25kYXJ5Rm9y
Q29uc3RydWN0KTsKLSAgICAgICAgfQogICAgIH0KICAgICAKICAgICBwcmludGYoIlxuIik7Cklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0dyYXBoLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdHcmFwaC5oCShyZXZpc2lvbiAxMDAyNDgpCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0dyYXBoLmgJKHdvcmtpbmcgY29weSkKQEAg
LTQ1LDMzICs0NSw2IEBAIGNsYXNzIEV4ZWNTdGF0ZTsKIAogbmFtZXNwYWNlIERGRyB7CiAKLXN0
cnVjdCBNZXRob2RDaGVja0RhdGEgewotICAgIC8vIEl0IGlzIHNhZmUgdG8gcmVmZXIgdG8gdGhl
c2UgZGlyZWN0bHkgYmVjYXVzZSB0aGV5IGFyZSBzaGFkb3dlZCBieQotICAgIC8vIHRoZSBvbGQg
SklUJ3MgQ29kZUJsb2NrJ3MgTWV0aG9kQ2FsbExpbmtJbmZvLgotICAgIFN0cnVjdHVyZSogc3Ry
dWN0dXJlOwotICAgIFN0cnVjdHVyZSogcHJvdG90eXBlU3RydWN0dXJlOwotICAgIEpTT2JqZWN0
KiBmdW5jdGlvbjsKLSAgICBKU09iamVjdCogcHJvdG90eXBlOwotICAgIAotICAgIGJvb2wgb3Bl
cmF0b3I9PShjb25zdCBNZXRob2RDaGVja0RhdGEmIG90aGVyKSBjb25zdAotICAgIHsKLSAgICAg
ICAgaWYgKHN0cnVjdHVyZSAhPSBvdGhlci5zdHJ1Y3R1cmUpCi0gICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgICAgIGlmIChwcm90b3R5cGVTdHJ1Y3R1cmUgIT0gb3RoZXIucHJvdG90eXBl
U3RydWN0dXJlKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoZnVuY3Rp
b24gIT0gb3RoZXIuZnVuY3Rpb24pCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAg
IGlmIChwcm90b3R5cGUgIT0gb3RoZXIucHJvdG90eXBlKQotICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgYm9vbCBvcGVyYXRv
ciE9KGNvbnN0IE1ldGhvZENoZWNrRGF0YSYgb3RoZXIpIGNvbnN0Ci0gICAgewotICAgICAgICBy
ZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7Ci0gICAgfQotfTsKLQogc3RydWN0IFN0b3JhZ2VBY2Nl
c3NEYXRhIHsKICAgICBzaXplX3Qgb2Zmc2V0OwogICAgIHVuc2lnbmVkIGlkZW50aWZpZXJOdW1i
ZXI7CkBAIC0xMjksMTQgKzEwMiw5IEBAIHB1YmxpYzoKICAgICAgICAgcmV0dXJuIG1fcHJlZGlj
dGlvbnMuZ2V0R2xvYmFsVmFyUHJlZGljdGlvbih2YXJOdW1iZXIpOwogICAgIH0KICAgICAKLSAg
ICBQcmVkaWN0ZWRUeXBlIGdldE1ldGhvZENoZWNrUHJlZGljdGlvbihOb2RlJiBub2RlKQotICAg
IHsKLSAgICAgICAgcmV0dXJuIHByZWRpY3Rpb25Gcm9tQ2VsbChtX21ldGhvZENoZWNrRGF0YVtu
b2RlLm1ldGhvZENoZWNrRGF0YUluZGV4KCldLmZ1bmN0aW9uKTsKLSAgICB9Ci0gICAgCiAgICAg
UHJlZGljdGVkVHlwZSBnZXRKU0NvbnN0YW50UHJlZGljdGlvbihOb2RlJiBub2RlLCBDb2RlQmxv
Y2sqIGNvZGVCbG9jaykKICAgICB7Ci0gICAgICAgIHJldHVybiBwcmVkaWN0aW9uRnJvbVZhbHVl
KG5vZGUudmFsdWVPZkpTQ29uc3RhbnROb2RlKGNvZGVCbG9jaykpOworICAgICAgICByZXR1cm4g
cHJlZGljdGlvbkZyb21WYWx1ZShub2RlLnZhbHVlT2ZKU0NvbnN0YW50KGNvZGVCbG9jaykpOwog
ICAgIH0KICAgICAKICAgICAvLyBIZWxwZXIgbWV0aG9kcyB0byBjaGVjayBub2RlcyBmb3IgY29u
c3RhbnRzLgpAQCAtMTc1LDIxICsxNDMsMTkgQEAgcHVibGljOgogICAgIC8vIEhlbHBlciBtZXRo
b2RzIGdldCBjb25zdGFudCB2YWx1ZXMgZnJvbSBub2Rlcy4KICAgICBKU1ZhbHVlIHZhbHVlT2ZK
U0NvbnN0YW50KENvZGVCbG9jayogY29kZUJsb2NrLCBOb2RlSW5kZXggbm9kZUluZGV4KQogICAg
IHsKLSAgICAgICAgaWYgKGF0KG5vZGVJbmRleCkuaGFzTWV0aG9kQ2hlY2tEYXRhKCkpCi0gICAg
ICAgICAgICByZXR1cm4gSlNWYWx1ZShtX21ldGhvZENoZWNrRGF0YVthdChub2RlSW5kZXgpLm1l
dGhvZENoZWNrRGF0YUluZGV4KCldLmZ1bmN0aW9uKTsKLSAgICAgICAgcmV0dXJuIHZhbHVlT2ZK
U0NvbnN0YW50Tm9kZShjb2RlQmxvY2ssIG5vZGVJbmRleCk7CisgICAgICAgIHJldHVybiBhdChu
b2RlSW5kZXgpLnZhbHVlT2ZKU0NvbnN0YW50KGNvZGVCbG9jayk7CiAgICAgfQogICAgIGludDMy
X3QgdmFsdWVPZkludDMyQ29uc3RhbnQoQ29kZUJsb2NrKiBjb2RlQmxvY2ssIE5vZGVJbmRleCBu
b2RlSW5kZXgpCiAgICAgewotICAgICAgICByZXR1cm4gdmFsdWVPZkpTQ29uc3RhbnROb2RlKGNv
ZGVCbG9jaywgbm9kZUluZGV4KS5hc0ludDMyKCk7CisgICAgICAgIHJldHVybiB2YWx1ZU9mSlND
b25zdGFudChjb2RlQmxvY2ssIG5vZGVJbmRleCkuYXNJbnQzMigpOwogICAgIH0KICAgICBkb3Vi
bGUgdmFsdWVPZk51bWJlckNvbnN0YW50KENvZGVCbG9jayogY29kZUJsb2NrLCBOb2RlSW5kZXgg
bm9kZUluZGV4KQogICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlT2ZKU0NvbnN0YW50Tm9kZShj
b2RlQmxvY2ssIG5vZGVJbmRleCkuYXNOdW1iZXIoKTsKKyAgICAgICAgcmV0dXJuIHZhbHVlT2ZK
U0NvbnN0YW50KGNvZGVCbG9jaywgbm9kZUluZGV4KS5hc051bWJlcigpOwogICAgIH0KICAgICBi
b29sIHZhbHVlT2ZCb29sZWFuQ29uc3RhbnQoQ29kZUJsb2NrKiBjb2RlQmxvY2ssIE5vZGVJbmRl
eCBub2RlSW5kZXgpCiAgICAgewotICAgICAgICByZXR1cm4gdmFsdWVPZkpTQ29uc3RhbnROb2Rl
KGNvZGVCbG9jaywgbm9kZUluZGV4KS5hc0Jvb2xlYW4oKTsKKyAgICAgICAgcmV0dXJuIHZhbHVl
T2ZKU0NvbnN0YW50KGNvZGVCbG9jaywgbm9kZUluZGV4KS5hc0Jvb2xlYW4oKTsKICAgICB9CiAg
ICAgSlNGdW5jdGlvbiogdmFsdWVPZkZ1bmN0aW9uQ29uc3RhbnQoQ29kZUJsb2NrKiBjb2RlQmxv
Y2ssIE5vZGVJbmRleCBub2RlSW5kZXgpCiAgICAgewpAQCAtMjU2LDcgKzIyMiw2IEBAIHB1Ymxp
YzoKIAogICAgIFZlY3RvcjwgT3duUHRyPEJhc2ljQmxvY2s+ICwgOD4gbV9ibG9ja3M7CiAgICAg
VmVjdG9yPE5vZGVJbmRleCwgMTY+IG1fdmFyQXJnQ2hpbGRyZW47Ci0gICAgVmVjdG9yPE1ldGhv
ZENoZWNrRGF0YT4gbV9tZXRob2RDaGVja0RhdGE7CiAgICAgVmVjdG9yPFN0b3JhZ2VBY2Nlc3NE
YXRhPiBtX3N0b3JhZ2VBY2Nlc3NEYXRhOwogICAgIFZlY3RvcjxSZXNvbHZlR2xvYmFsRGF0YT4g
bV9yZXNvbHZlR2xvYmFsRGF0YTsKICAgICBWZWN0b3I8Tm9kZUluZGV4LCA4PiBtX2FyZ3VtZW50
czsKQEAgLTI2OCwxMSArMjMzLDYgQEAgcHVibGljOgogICAgIHVuc2lnbmVkIG1fcGFyYW1ldGVy
U2xvdHM7CiBwcml2YXRlOgogICAgIAotICAgIEpTVmFsdWUgdmFsdWVPZkpTQ29uc3RhbnROb2Rl
KENvZGVCbG9jayogY29kZUJsb2NrLCBOb2RlSW5kZXggbm9kZUluZGV4KQotICAgIHsKLSAgICAg
ICAgcmV0dXJuIGNvZGVCbG9jay0+Y29uc3RhbnRSZWdpc3RlcihGaXJzdENvbnN0YW50UmVnaXN0
ZXJJbmRleCArIGF0KG5vZGVJbmRleCkuY29uc3RhbnROdW1iZXIoKSkuZ2V0KCk7Ci0gICAgfQot
CiAgICAgLy8gV2hlbiBhIG5vZGUncyByZWZDb3VudCBnb2VzIGZyb20gMCB0byAxLCBpdCBtdXN0
IChsb2dpY2FsbHkpIHJlY3Vyc2l2ZWx5IHJlZiBhbGwgb2YgaXRzIGNoaWxkcmVuLCBhbmQgdmlj
ZSB2ZXJzYS4KICAgICB2b2lkIHJlZkNoaWxkcmVuKE5vZGVJbmRleCk7CiAKSW5kZXg6IFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHTm9kZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9kZmcvREZHTm9kZS5oCShyZXZpc2lvbiAxMDAyNDgpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvZGZnL0RGR05vZGUuaAkod29ya2luZyBjb3B5KQpAQCAtMTU3LDkgKzE1Nywx
MyBAQCBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIGFyaXRoTm9kZUZsYWdzCiAKIC8vIFRoaXMg
bWFjcm8gZGVmaW5lcyBhIHNldCBvZiBpbmZvcm1hdGlvbiBhYm91dCBhbGwga25vd24gbm9kZSB0
eXBlcywgdXNlZCB0byBwb3B1bGF0ZSBOb2RlSWQsIE5vZGVUeXBlIGJlbG93LgogI2RlZmluZSBG
T1JfRUFDSF9ERkdfT1AobWFjcm8pIFwKLSAgICAvKiBOb2RlcyBmb3IgY29uc3RhbnRzLiAqL1wK
KyAgICAvKiBBIGNvbnN0YW50IGluIHRoZSBDb2RlQmxvY2sncyBjb25zdGFudCBwb29sLiAqL1wK
ICAgICBtYWNybyhKU0NvbnN0YW50LCBOb2RlUmVzdWx0SlMpIFwKICAgICBcCisgICAgLyogQSBj
b25zdGFudCBub3QgaW4gdGhlIENvZGVCbG9jaydzIGNvbnN0YW50IHBvb2wuIFVzZXMgZ2V0IHBh
dGNoZWQgdG8ganVtcHMgdGhhdCBleGl0IHRoZSAqL1wKKyAgICAvKiBjb2RlIGJsb2NrLiAqL1wK
KyAgICBtYWNybyhXZWFrSlNDb25zdGFudCwgTm9kZVJlc3VsdEpTKSBcCisgICAgXAogICAgIC8q
IE5vZGVzIGZvciBoYW5kbGluZyBmdW5jdGlvbnMgKGJvdGggYXMgY2FsbCBhbmQgYXMgY29uc3Ry
dWN0KS4gKi9cCiAgICAgbWFjcm8oQ29udmVydFRoaXMsIE5vZGVSZXN1bHRKUykgXAogICAgIG1h
Y3JvKENyZWF0ZVRoaXMsIE5vZGVSZXN1bHRKUykgLyogTm90ZSB0aGlzIGlzIG5vdCBNdXN0R2Vu
ZXJhdGUgc2luY2Ugd2UncmUgcmV0dXJuaW5nIGl0IGFueXdheS4gKi8gXApAQCAtMjMwLDcgKzIz
NCw2IEBAIHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogYXJpdGhOb2RlRmxhZ3MKICAgICBtYWNy
byhHZXRTdHJpbmdMZW5ndGgsIE5vZGVSZXN1bHRJbnQzMikgXAogICAgIG1hY3JvKEdldEJ5dGVB
cnJheUxlbmd0aCwgTm9kZVJlc3VsdEludDMyKSBcCiAgICAgbWFjcm8oR2V0TWV0aG9kLCBOb2Rl
UmVzdWx0SlMgfCBOb2RlTXVzdEdlbmVyYXRlKSBcCi0gICAgbWFjcm8oQ2hlY2tNZXRob2QsIE5v
ZGVSZXN1bHRKUyB8IE5vZGVNdXN0R2VuZXJhdGUpIFwKICAgICBtYWNybyhHZXRTY29wZUNoYWlu
LCBOb2RlUmVzdWx0SlMpIFwKICAgICBtYWNybyhHZXRTY29wZWRWYXIsIE5vZGVSZXN1bHRKUyB8
IE5vZGVNdXN0R2VuZXJhdGUpIFwKICAgICBtYWNybyhQdXRTY29wZWRWYXIsIE5vZGVNdXN0R2Vu
ZXJhdGUgfCBOb2RlQ2xvYmJlcnNXb3JsZCkgXApAQCAtMzk3LDkgKzQwMCwxNCBAQCBzdHJ1Y3Qg
Tm9kZSB7CiAgICAgICAgIHJldHVybiBvcCA9PSBKU0NvbnN0YW50OwogICAgIH0KICAgICAKKyAg
ICBib29sIGlzV2Vha0NvbnN0YW50KCkKKyAgICB7CisgICAgICAgIHJldHVybiBvcCA9PSBXZWFr
SlNDb25zdGFudDsKKyAgICB9CisgICAgCiAgICAgYm9vbCBoYXNDb25zdGFudCgpCiAgICAgewot
ICAgICAgICByZXR1cm4gaXNDb25zdGFudCgpIHx8IGhhc01ldGhvZENoZWNrRGF0YSgpOworICAg
ICAgICByZXR1cm4gaXNDb25zdGFudCgpIHx8IGlzV2Vha0NvbnN0YW50KCk7CiAgICAgfQogCiAg
ICAgdW5zaWduZWQgY29uc3RhbnROdW1iZXIoKQpAQCAtNDA4LDIwICs0MTYsMjYgQEAgc3RydWN0
IE5vZGUgewogICAgICAgICByZXR1cm4gbV9vcEluZm87CiAgICAgfQogICAgIAotICAgIC8vIE5P
VEU6IHRoaXMgb25seSB3b3JrcyBmb3IgSlNDb25zdGFudCBub2Rlcy4KLSAgICBKU1ZhbHVlIHZh
bHVlT2ZKU0NvbnN0YW50Tm9kZShDb2RlQmxvY2sqIGNvZGVCbG9jaykKKyAgICBKU0NlbGwqIHdl
YWtDb25zdGFudCgpCisgICAgeworICAgICAgICByZXR1cm4gYml0d2lzZV9jYXN0PEpTQ2VsbCo+
KG1fb3BJbmZvKTsKKyAgICB9CisgICAgCisgICAgSlNWYWx1ZSB2YWx1ZU9mSlNDb25zdGFudChD
b2RlQmxvY2sqIGNvZGVCbG9jaykKICAgICB7CisgICAgICAgIGlmIChvcCA9PSBXZWFrSlNDb25z
dGFudCkKKyAgICAgICAgICAgIHJldHVybiBKU1ZhbHVlKHdlYWtDb25zdGFudCgpKTsKICAgICAg
ICAgcmV0dXJuIGNvZGVCbG9jay0+Y29uc3RhbnRSZWdpc3RlcihGaXJzdENvbnN0YW50UmVnaXN0
ZXJJbmRleCArIGNvbnN0YW50TnVtYmVyKCkpLmdldCgpOwogICAgIH0KIAogICAgIGJvb2wgaXNJ
bnQzMkNvbnN0YW50KENvZGVCbG9jayogY29kZUJsb2NrKQogICAgIHsKLSAgICAgICAgcmV0dXJu
IGlzQ29uc3RhbnQoKSAmJiB2YWx1ZU9mSlNDb25zdGFudE5vZGUoY29kZUJsb2NrKS5pc0ludDMy
KCk7CisgICAgICAgIHJldHVybiBpc0NvbnN0YW50KCkgJiYgdmFsdWVPZkpTQ29uc3RhbnQoY29k
ZUJsb2NrKS5pc0ludDMyKCk7CiAgICAgfQogICAgIAogICAgIGJvb2wgaXNEb3VibGVDb25zdGFu
dChDb2RlQmxvY2sqIGNvZGVCbG9jaykKICAgICB7Ci0gICAgICAgIGJvb2wgcmVzdWx0ID0gaXND
b25zdGFudCgpICYmIHZhbHVlT2ZKU0NvbnN0YW50Tm9kZShjb2RlQmxvY2spLmlzRG91YmxlKCk7
CisgICAgICAgIGJvb2wgcmVzdWx0ID0gaXNDb25zdGFudCgpICYmIHZhbHVlT2ZKU0NvbnN0YW50
KGNvZGVCbG9jaykuaXNEb3VibGUoKTsKICAgICAgICAgaWYgKHJlc3VsdCkKICAgICAgICAgICAg
IEFTU0VSVCghaXNJbnQzMkNvbnN0YW50KGNvZGVCbG9jaykpOwogICAgICAgICByZXR1cm4gcmVz
dWx0OwpAQCAtNDI5LDE0ICs0NDMsMTQgQEAgc3RydWN0IE5vZGUgewogICAgIAogICAgIGJvb2wg
aXNOdW1iZXJDb25zdGFudChDb2RlQmxvY2sqIGNvZGVCbG9jaykKICAgICB7Ci0gICAgICAgIGJv
b2wgcmVzdWx0ID0gaXNDb25zdGFudCgpICYmIHZhbHVlT2ZKU0NvbnN0YW50Tm9kZShjb2RlQmxv
Y2spLmlzTnVtYmVyKCk7CisgICAgICAgIGJvb2wgcmVzdWx0ID0gaXNDb25zdGFudCgpICYmIHZh
bHVlT2ZKU0NvbnN0YW50KGNvZGVCbG9jaykuaXNOdW1iZXIoKTsKICAgICAgICAgQVNTRVJUKHJl
c3VsdCA9PSAoaXNJbnQzMkNvbnN0YW50KGNvZGVCbG9jaykgfHwgaXNEb3VibGVDb25zdGFudChj
b2RlQmxvY2spKSk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogICAgIAogICAgIGJv
b2wgaXNCb29sZWFuQ29uc3RhbnQoQ29kZUJsb2NrKiBjb2RlQmxvY2spCiAgICAgewotICAgICAg
ICByZXR1cm4gaXNDb25zdGFudCgpICYmIHZhbHVlT2ZKU0NvbnN0YW50Tm9kZShjb2RlQmxvY2sp
LmlzQm9vbGVhbigpOworICAgICAgICByZXR1cm4gaXNDb25zdGFudCgpICYmIHZhbHVlT2ZKU0Nv
bnN0YW50KGNvZGVCbG9jaykuaXNCb29sZWFuKCk7CiAgICAgfQogICAgIAogICAgIGJvb2wgaGFz
VmFyaWFibGVBY2Nlc3NEYXRhKCkKQEAgLTQ3Nyw3ICs0OTEsNiBAQCBzdHJ1Y3QgTm9kZSB7CiAg
ICAgICAgIGNhc2UgUHV0QnlJZDoKICAgICAgICAgY2FzZSBQdXRCeUlkRGlyZWN0OgogICAgICAg
ICBjYXNlIEdldE1ldGhvZDoKLSAgICAgICAgY2FzZSBDaGVja01ldGhvZDoKICAgICAgICAgY2Fz
ZSBSZXNvbHZlOgogICAgICAgICBjYXNlIFJlc29sdmVCYXNlOgogICAgICAgICBjYXNlIFJlc29s
dmVCYXNlU3RyaWN0UHV0OgpAQCAtNzIzLDE3ICs3MzYsNiBAQCBzdHJ1Y3QgTm9kZSB7CiAgICAg
ICAgIHJldHVybiBtZXJnZVByZWRpY3Rpb24obV9vcEluZm8yLCBwcmVkaWN0aW9uKTsKICAgICB9
CiAgICAgCi0gICAgYm9vbCBoYXNNZXRob2RDaGVja0RhdGEoKQotICAgIHsKLSAgICAgICAgcmV0
dXJuIG9wID09IENoZWNrTWV0aG9kOwotICAgIH0KLSAgICAKLSAgICB1bnNpZ25lZCBtZXRob2RD
aGVja0RhdGFJbmRleCgpCi0gICAgewotICAgICAgICBBU1NFUlQoaGFzTWV0aG9kQ2hlY2tEYXRh
KCkpOwotICAgICAgICByZXR1cm4gbV9vcEluZm8yOwotICAgIH0KLQogICAgIGJvb2wgaGFzRnVu
Y3Rpb25DaGVja0RhdGEoKQogICAgIHsKICAgICAgICAgcmV0dXJuIG9wID09IENoZWNrRnVuY3Rp
b247CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1Byb3BhZ2F0b3IuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHUHJvcGFnYXRvci5jcHAJ
KHJldmlzaW9uIDEwMDI0OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHUHJvcGFn
YXRvci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMwMSw3ICszMDEsOCBAQCBwcml2YXRlOgogICAg
ICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKICAgICAgICAgCiAgICAgICAgIHN3aXRjaCAob3Ap
IHsKLSAgICAgICAgY2FzZSBKU0NvbnN0YW50OiB7CisgICAgICAgIGNhc2UgSlNDb25zdGFudDoK
KyAgICAgICAgY2FzZSBXZWFrSlNDb25zdGFudDogewogICAgICAgICAgICAgY2hhbmdlZCB8PSBz
ZXRQcmVkaWN0aW9uKHByZWRpY3Rpb25Gcm9tVmFsdWUobV9ncmFwaC52YWx1ZU9mSlNDb25zdGFu
dChtX2NvZGVCbG9jaywgbV9jb21waWxlSW5kZXgpKSk7CiAgICAgICAgICAgICBicmVhazsKICAg
ICAgICAgfQpAQCAtNDczLDExICs0NzQsNiBAQCBwcml2YXRlOgogICAgICAgICAgICAgYnJlYWs7
CiAgICAgICAgIH0KICAgICAgICAgICAgIAotICAgICAgICBjYXNlIENoZWNrTWV0aG9kOiB7Ci0g
ICAgICAgICAgICBjaGFuZ2VkIHw9IHNldFByZWRpY3Rpb24obV9ncmFwaC5nZXRNZXRob2RDaGVj
a1ByZWRpY3Rpb24obm9kZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQogICAg
ICAgICBjYXNlIENhbGw6CiAgICAgICAgIGNhc2UgQ29uc3RydWN0OiB7CiAgICAgICAgICAgICBp
ZiAobm9kZS5nZXRIZWFwUHJlZGljdGlvbigpKQpAQCAtMTA0MSw0NyArMTAzNyw2IEBAIHByaXZh
dGU6CiAgICAgICAgIHJldHVybiBOb05vZGU7CiAgICAgfQogCi0gICAgTm9kZUluZGV4IGdldE1l
dGhvZExvYWRFbGltaW5hdGlvbihjb25zdCBNZXRob2RDaGVja0RhdGEmIG1ldGhvZENoZWNrRGF0
YSwgdW5zaWduZWQgaWRlbnRpZmllck51bWJlciwgTm9kZUluZGV4IGNoaWxkMSkKLSAgICB7Ci0g
ICAgICAgIE5vZGVJbmRleCBzdGFydCA9IHN0YXJ0SW5kZXhGb3JDaGlsZHJlbihjaGlsZDEpOwot
ICAgICAgICBmb3IgKE5vZGVJbmRleCBpbmRleCA9IG1fY29tcGlsZUluZGV4OyBpbmRleC0tID4g
c3RhcnQ7KSB7Ci0gICAgICAgICAgICBOb2RlJiBub2RlID0gbV9ncmFwaFtpbmRleF07Ci0gICAg
ICAgICAgICBzd2l0Y2ggKG5vZGUub3ApIHsKLSAgICAgICAgICAgIGNhc2UgQ2hlY2tNZXRob2Q6
Ci0gICAgICAgICAgICAgICAgaWYgKG5vZGUuY2hpbGQxKCkgPT0gY2hpbGQxCi0gICAgICAgICAg
ICAgICAgICAgICYmIG5vZGUuaWRlbnRpZmllck51bWJlcigpID09IGlkZW50aWZpZXJOdW1iZXIK
LSAgICAgICAgICAgICAgICAgICAgJiYgbV9ncmFwaC5tX21ldGhvZENoZWNrRGF0YVtub2RlLm1l
dGhvZENoZWNrRGF0YUluZGV4KCldID09IG1ldGhvZENoZWNrRGF0YSkKLSAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAg
ICAgIAotICAgICAgICAgICAgY2FzZSBQdXRCeU9mZnNldDoKLSAgICAgICAgICAgICAgICAvLyBJ
ZiBhIHB1dCB3YXMgb3B0aW1pemVkIHRvIGJ5LW9mZnNldCB0aGVuIGl0J3Mgbm90IGNoYW5naW5n
IHRoZSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAK
LSAgICAgICAgICAgIGNhc2UgUHV0QnlWYWw6Ci0gICAgICAgICAgICBjYXNlIFB1dEJ5VmFsQWxp
YXM6Ci0gICAgICAgICAgICAgICAgaWYgKGJ5VmFsSGFzSW50QmFzZShub2RlKSkgewotICAgICAg
ICAgICAgICAgICAgICAvLyBJZiBQdXRCeVZhbCBzcGVjdWxhdGVzIHRoYXQgaXQncyBhY2Nlc3Np
bmcgYW4gYXJyYXkgd2l0aCBhbgotICAgICAgICAgICAgICAgICAgICAvLyBpbnRlZ2VyIGluZGV4
LCB0aGVuIGl0J3MgaW1wb3NzaWJsZSBmb3IgaXQgdG8gY2F1c2UgYSBzdHJ1Y3R1cmUKLSAgICAg
ICAgICAgICAgICAgICAgLy8gY2hhbmdlLgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5vTm9kZTsKLSAgICAgICAg
ICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgQXJyYXlQdXNoOgotICAgICAgICAgICAgY2FzZSBB
cnJheVBvcDoKLSAgICAgICAgICAgICAgICAvLyBQdXNoaW5nIGFuZCBwb3BwaW5nIGNhbm5vdCBk
ZXNwZWNpZnkgYSBmdW5jdGlvbi4KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAg
ICAgICAKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaWYgKGNsb2JiZXJz
V29ybGQoaW5kZXgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9Ob2RlOwotICAgICAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVy
biBOb05vZGU7Ci0gICAgfQotCiAgICAgYm9vbCBjaGVja0Z1bmN0aW9uRWxpbWluYXRpb24oSlNG
dW5jdGlvbiogZnVuY3Rpb24sIE5vZGVJbmRleCBjaGlsZDEpCiAgICAgewogICAgICAgICBOb2Rl
SW5kZXggc3RhcnQgPSBzdGFydEluZGV4Rm9yQ2hpbGRyZW4oY2hpbGQxKTsKQEAgLTEzOTIsMTAg
KzEzNDcsNiBAQCBwcml2YXRlOgogICAgICAgICAgICAgICAgIG5vZGUub3AgPSBQdXRCeVZhbEFs
aWFzOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAKLSAgICAgICAgY2FzZSBDaGVj
a01ldGhvZDoKLSAgICAgICAgICAgIHNldFJlcGxhY2VtZW50KGdldE1ldGhvZExvYWRFbGltaW5h
dGlvbihtX2dyYXBoLm1fbWV0aG9kQ2hlY2tEYXRhW25vZGUubWV0aG9kQ2hlY2tEYXRhSW5kZXgo
KV0sIG5vZGUuaWRlbnRpZmllck51bWJlcigpLCBub2RlLmNoaWxkMSgpKSk7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgIAogICAgICAgICBjYXNlIENoZWNrU3RydWN0dXJlOgogICAg
ICAgICAgICAgaWYgKGNoZWNrU3RydWN0dXJlTG9hZEVsaW1pbmF0aW9uKG5vZGUuc3RydWN0dXJl
U2V0KCksIG5vZGUuY2hpbGQxKCkpKQogICAgICAgICAgICAgICAgIGVsaW1pbmF0ZSgpOwpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdTcGVjdWxhdGl2ZUpJVDMyXzY0LmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR1NwZWN1bGF0aXZlSklU
MzJfNjQuY3BwCShyZXZpc2lvbiAxMDAyNDgpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZn
L0RGR1NwZWN1bGF0aXZlSklUMzJfNjQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMDY2LDYgKzIw
NjYsNyBAQCB2b2lkIFNwZWN1bGF0aXZlSklUOjpjb21waWxlKE5vZGUmIG5vZGUpCiAKICAgICBz
d2l0Y2ggKG9wKSB7CiAgICAgY2FzZSBKU0NvbnN0YW50OgorICAgIGNhc2UgV2Vha0pTQ29uc3Rh
bnQ6CiAgICAgICAgIGluaXRDb25zdGFudEluZm8obV9jb21waWxlSW5kZXgpOwogICAgICAgICBi
cmVhazsKIApAQCAtMzYzNywyNiArMzYzOCw2IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBp
bGUoTm9kZSYgbm9kZSkKICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgY2FzZSBDaGVja01l
dGhvZDogewotICAgICAgICBNZXRob2RDaGVja0RhdGEmIG1ldGhvZENoZWNrRGF0YSA9IG1faml0
LmdyYXBoKCkubV9tZXRob2RDaGVja0RhdGFbbm9kZS5tZXRob2RDaGVja0RhdGFJbmRleCgpXTsK
LSAgICAgICAgCi0gICAgICAgIFNwZWN1bGF0ZUNlbGxPcGVyYW5kIGJhc2UodGhpcywgbm9kZS5j
aGlsZDEoKSk7Ci0gICAgICAgIEdQUlRlbXBvcmFyeSBzY3JhdGNoKHRoaXMpOyAvLyB0aGlzIG5l
ZWRzIHRvIGJlIGEgc2VwYXJhdGUgcmVnaXN0ZXIsIHVuZm9ydHVuYXRlbHkuCi0gICAgICAgIEdQ
UlJlZyBiYXNlR1BSID0gYmFzZS5ncHIoKTsKLSAgICAgICAgR1BSUmVnIHNjcmF0Y2hHUFIgPSBz
Y3JhdGNoLmdwcigpOwotICAgICAgICAKLSAgICAgICAgaWYgKCFtX3N0YXRlLmZvck5vZGUobm9k
ZS5jaGlsZDEoKSkubV9zdHJ1Y3R1cmUuZG9lc05vdENvbnRhaW5BbnlPdGhlclRoYW4obWV0aG9k
Q2hlY2tEYXRhLnN0cnVjdHVyZSkpCi0gICAgICAgICAgICBzcGVjdWxhdGlvbkNoZWNrKEpTVmFs
dWVSZWdzKCksIE5vTm9kZSwgbV9qaXQuYnJhbmNoUHRyKEpJVENvbXBpbGVyOjpOb3RFcXVhbCwg
SklUQ29tcGlsZXI6OkFkZHJlc3MoYmFzZUdQUiwgSlNDZWxsOjpzdHJ1Y3R1cmVPZmZzZXQoKSks
IEpJVENvbXBpbGVyOjpUcnVzdGVkSW1tUHRyKG1ldGhvZENoZWNrRGF0YS5zdHJ1Y3R1cmUpKSk7
Ci0gICAgICAgIGlmIChtZXRob2RDaGVja0RhdGEucHJvdG90eXBlICE9IG1faml0Lmdsb2JhbE9i
amVjdEZvcihub2RlLmNvZGVPcmlnaW4pLT5tZXRob2RDYWxsRHVtbXkoKSkgewotICAgICAgICAg
ICAgbV9qaXQubW92ZShKSVRDb21waWxlcjo6VHJ1c3RlZEltbVB0cihtZXRob2RDaGVja0RhdGEu
cHJvdG90eXBlLT5zdHJ1Y3R1cmVBZGRyZXNzKCkpLCBzY3JhdGNoR1BSKTsKLSAgICAgICAgICAg
IHNwZWN1bGF0aW9uQ2hlY2soSlNWYWx1ZVJlZ3MoKSwgTm9Ob2RlLCBtX2ppdC5icmFuY2hQdHIo
SklUQ29tcGlsZXI6Ok5vdEVxdWFsLCBKSVRDb21waWxlcjo6QWRkcmVzcyhzY3JhdGNoR1BSKSwg
SklUQ29tcGlsZXI6OlRydXN0ZWRJbW1QdHIobWV0aG9kQ2hlY2tEYXRhLnByb3RvdHlwZVN0cnVj
dHVyZSkpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdXNlQ2hpbGRyZW4obm9kZSk7
Ci0gICAgICAgIGluaXRDb25zdGFudEluZm8obV9jb21waWxlSW5kZXgpOwotICAgICAgICBicmVh
azsKLSAgICB9Ci0KICAgICBjYXNlIFB1dEJ5SWQ6IHsKICAgICAgICAgU3BlY3VsYXRlQ2VsbE9w
ZXJhbmQgYmFzZSh0aGlzLCBub2RlLmNoaWxkMSgpKTsKICAgICAgICAgSlNWYWx1ZU9wZXJhbmQg
dmFsdWUodGhpcywgbm9kZS5jaGlsZDIoKSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR1NwZWN1bGF0aXZlSklUNjQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQ2NC5jcHAJKHJldmlzaW9uIDEwMDI0OCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQ2NC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTIwNjksNiArMjA2OSw3IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBp
bGUoTm9kZSYgbm9kZSkKIAogICAgIHN3aXRjaCAob3ApIHsKICAgICBjYXNlIEpTQ29uc3RhbnQ6
CisgICAgY2FzZSBXZWFrSlNDb25zdGFudDoKICAgICAgICAgaW5pdENvbnN0YW50SW5mbyhtX2Nv
bXBpbGVJbmRleCk7CiAgICAgICAgIGJyZWFrOwogCkBAIC0zNTQzLDI2ICszNTQ0LDYgQEAgdm9p
ZCBTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZShOb2RlJiBub2RlKQogICAgICAgICBicmVhazsKICAg
ICB9CiAKLSAgICBjYXNlIENoZWNrTWV0aG9kOiB7Ci0gICAgICAgIE1ldGhvZENoZWNrRGF0YSYg
bWV0aG9kQ2hlY2tEYXRhID0gbV9qaXQuZ3JhcGgoKS5tX21ldGhvZENoZWNrRGF0YVtub2RlLm1l
dGhvZENoZWNrRGF0YUluZGV4KCldOwotICAgICAgICAKLSAgICAgICAgU3BlY3VsYXRlQ2VsbE9w
ZXJhbmQgYmFzZSh0aGlzLCBub2RlLmNoaWxkMSgpKTsKLSAgICAgICAgR1BSVGVtcG9yYXJ5IHNj
cmF0Y2godGhpcyk7IC8vIHRoaXMgbmVlZHMgdG8gYmUgYSBzZXBhcmF0ZSByZWdpc3RlciwgdW5m
b3J0dW5hdGVseS4KLSAgICAgICAgR1BSUmVnIGJhc2VHUFIgPSBiYXNlLmdwcigpOwotICAgICAg
ICBHUFJSZWcgc2NyYXRjaEdQUiA9IHNjcmF0Y2guZ3ByKCk7Ci0gICAgICAgIAotICAgICAgICBp
ZiAoIW1fc3RhdGUuZm9yTm9kZShub2RlLmNoaWxkMSgpKS5tX3N0cnVjdHVyZS5kb2VzTm90Q29u
dGFpbkFueU90aGVyVGhhbihtZXRob2RDaGVja0RhdGEuc3RydWN0dXJlKSkKLSAgICAgICAgICAg
IHNwZWN1bGF0aW9uQ2hlY2soSlNWYWx1ZVJlZ3MoKSwgTm9Ob2RlLCBtX2ppdC5icmFuY2hQdHIo
SklUQ29tcGlsZXI6Ok5vdEVxdWFsLCBKSVRDb21waWxlcjo6QWRkcmVzcyhiYXNlR1BSLCBKU0Nl
bGw6OnN0cnVjdHVyZU9mZnNldCgpKSwgSklUQ29tcGlsZXI6OlRydXN0ZWRJbW1QdHIobWV0aG9k
Q2hlY2tEYXRhLnN0cnVjdHVyZSkpKTsKLSAgICAgICAgaWYgKG1ldGhvZENoZWNrRGF0YS5wcm90
b3R5cGUgIT0gbV9qaXQuZ2xvYmFsT2JqZWN0Rm9yKG5vZGUuY29kZU9yaWdpbiktPm1ldGhvZENh
bGxEdW1teSgpKSB7Ci0gICAgICAgICAgICBtX2ppdC5tb3ZlKEpJVENvbXBpbGVyOjpUcnVzdGVk
SW1tUHRyKG1ldGhvZENoZWNrRGF0YS5wcm90b3R5cGUtPnN0cnVjdHVyZUFkZHJlc3MoKSksIHNj
cmF0Y2hHUFIpOwotICAgICAgICAgICAgc3BlY3VsYXRpb25DaGVjayhKU1ZhbHVlUmVncygpLCBO
b05vZGUsIG1faml0LmJyYW5jaFB0cihKSVRDb21waWxlcjo6Tm90RXF1YWwsIEpJVENvbXBpbGVy
OjpBZGRyZXNzKHNjcmF0Y2hHUFIpLCBKSVRDb21waWxlcjo6VHJ1c3RlZEltbVB0cihtZXRob2RD
aGVja0RhdGEucHJvdG90eXBlU3RydWN0dXJlKSkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAg
ICAgICB1c2VDaGlsZHJlbihub2RlKTsKLSAgICAgICAgaW5pdENvbnN0YW50SW5mbyhtX2NvbXBp
bGVJbmRleCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQogICAgIGNhc2UgUHV0QnlJZDogewog
ICAgICAgICBTcGVjdWxhdGVDZWxsT3BlcmFuZCBiYXNlKHRoaXMsIG5vZGUuY2hpbGQxKCkpOwog
ICAgICAgICBKU1ZhbHVlT3BlcmFuZCB2YWx1ZSh0aGlzLCBub2RlLmNoaWxkMigpKTsK
</data>
<flag name="review"
          id="113956"
          type_id="1"
          status="+"
          setter="ggaren"
    />
          </attachment>
      

    </bug>

</bugzilla>