<?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>39243</bug_id>
          
          <creation_ts>2010-05-17 14:58:51 -0700</creation_ts>
          <short_desc>Auto-generate Canvas overloads in JSC</short_desc>
          <delta_ts>2012-04-23 12:00:05 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore JavaScript</component>
          <version>528+ (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>61623</dependson>
    
    <dependson>61626</dependson>
    
    <dependson>61629</dependson>
    
    <dependson>61635</dependson>
    
    <dependson>61641</dependson>
    
    <dependson>61703</dependson>
    
    <dependson>61709</dependson>
    
    <dependson>61786</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Yaar Schnitman">yaar</reporter>
          <assigned_to name="Andreas Kling">kling</assigned_to>
          <cc>abarth</cc>
    
    <cc>darin</cc>
    
    <cc>kling</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>226909</commentid>
    <comment_count>0</comment_count>
    <who name="Yaar Schnitman">yaar</who>
    <bug_when>2010-05-17 14:58:51 -0700</bug_when>
    <thetext>Auto-generate Canvas overloads in JSC</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>226929</commentid>
    <comment_count>1</comment_count>
      <attachid>56277</attachid>
    <who name="Yaar Schnitman">yaar</who>
    <bug_when>2010-05-17 15:16:48 -0700</bug_when>
    <thetext>Created attachment 56277
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>226939</commentid>
    <comment_count>2</comment_count>
      <attachid>56277</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-05-17 15:29:19 -0700</bug_when>
    <thetext>Comment on attachment 56277
Patch

The code to check for overloads seems unnecessarily inefficient to me. I see expressions that repeat args.at(0) over and over again; this is inefficient since each instance will check the &quot;0&quot; against the number of arguments and the work to fetch the argument is also repeated. Also, in these expressions we have already checked the number of arguments explicitly so rechecking seems wrong. The generated code also checks isNull || isUndefined rather than using isUndefinedOrNull.

&gt; -    if (args.size() &lt;= 4)
&gt; -        context-&gt;strokeRect(args.at(0).toFloat(exec), args.at(1).toFloat(exec),
&gt; -                            args.at(2).toFloat(exec), args.at(3).toFloat(exec));
&gt; -    else
&gt; -        context-&gt;strokeRect(args.at(0).toFloat(exec), args.at(1).toFloat(exec),
&gt; -                            args.at(2).toFloat(exec), args.at(3).toFloat(exec), args.at(4).toFloat(exec));

This allows 1, 2, 3, and 6 parameters. But the auto-generated code work for exactly 4 and exactly 5 arguments. Is this a change we want?

We should do these conversions one function at a time. It&apos;s hard for me to review all of these in one batch to see which ones have changes in behavior. I want to know that each conversion has test cases and is behaving correctly for those test cases.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>226988</commentid>
    <comment_count>3</comment_count>
      <attachid>56290</attachid>
    <who name="Yaar Schnitman">yaar</who>
    <bug_when>2010-05-17 16:52:52 -0700</bug_when>
    <thetext>Created attachment 56290
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>227045</commentid>
    <comment_count>4</comment_count>
    <who name="Yaar Schnitman">yaar</who>
    <bug_when>2010-05-17 18:43:21 -0700</bug_when>
    <thetext>Thank for the review! I made some changes to the patch. See my comments below:

(In reply to comment #2)
&gt; (From update of attachment 56277 [details])
&gt; The code to check for overloads seems unnecessarily inefficient to me. I see expressions that repeat args.at(0) over and over again; this is inefficient since each instance will check the &quot;0&quot; against the number of arguments and the work to fetch the argument is also repeated. Also, in these expressions we have already checked the number of arguments explicitly so rechecking seems wrong. 

Valid points. Optimizing this is very hard, and will probably result in some cryptic code in the generator. I had the same discussion with Sam Weinig on a preceding patch that changed the generator, and he said he has thoughts of how to optimize this in the future.

In the latest patch, I extracted size() into a local, so that at least the 1st predicate in every test is efficient. Note that we only test the value of string and non-primitive types, and combined with a tight check of the args length, does not really cause so many lookups as it might seem.

&gt;The generated code also checks isNull || isUndefined rather than using isUndefinedOrNull.
Fixed.
&gt; 
&gt; &gt; -    if (args.size() &lt;= 4)
&gt; &gt; -        context-&gt;strokeRect(args.at(0).toFloat(exec), args.at(1).toFloat(exec),
&gt; &gt; -                            args.at(2).toFloat(exec), args.at(3).toFloat(exec));
&gt; &gt; -    else
&gt; &gt; -        context-&gt;strokeRect(args.at(0).toFloat(exec), args.at(1).toFloat(exec),
&gt; &gt; -                            args.at(2).toFloat(exec), args.at(3).toFloat(exec), args.at(4).toFloat(exec));
&gt; 
&gt; This allows 1, 2, 3, and 6 parameters. But the auto-generated code work for exactly 4 and exactly 5 arguments. Is this a change we want?
I think the custom code is not efficient at best and broken otherwise. In most cases, it postpones throwing an invalid arguments exception, silently fails or performs a no op (e.g. drawing a 0x0 rect). I think that just throwing an invalid args exception is better. I could not find anywhere in the specs saying what should happen, so I decided on consistency with the methods that already throw errors.
&gt; 
&gt; We should do these conversions one function at a time. It&apos;s hard for me to review all of these in one batch to see which ones have changes in behavior. I want to know that each conversion has test cases and is behaving correctly for those test cases.

All the canvas methods and their overloads are covered pretty tightly by fast/canvas/* and they all pass after this change. Many of the more interesting overloads (e.g. drawImage) have tests covering invalid / insufficient args. A few trivial ones (e.g. strokeRect(/*4 ints or 5 ints */), don&apos;t have any bad argument tests, but all tests pass for valid arguments. The new overload switching code use identical, auto-generated code, so the need for testing bad arguments for all methods is less important.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>228392</commentid>
    <comment_count>5</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-20 08:38:30 -0700</bug_when>
    <thetext>&gt; I think the custom code is not efficient at best and broken otherwise. In most cases, it postpones throwing an invalid arguments exception, silently fails or performs a no op (e.g. drawing a 0x0 rect). I think that just throwing an invalid args exception is better. I could not find anywhere in the specs saying what should happen, so I decided on consistency with the methods that already throw errors.

We&apos;re not consistent about how to handle exceptions in these cases.  IMHO, we should do the most JavaScript-like thing, which is throwing the exception as early as possible and re-throwing the same exception.  However, it might make sense to preserve the current behavior of each API, if possible, and then normalize them in the future.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>240188</commentid>
    <comment_count>6</comment_count>
      <attachid>56290</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-06-18 15:42:15 -0700</bug_when>
    <thetext>Comment on attachment 56290
Patch

WebCore/bindings/scripts/CodeGeneratorJS.pm:1163
 +          push(@implContent, &quot;        return ${functionName}$overload-&gt;{overloadIndex}(exec, 0, thisValue, args);\n&quot;);
I don&apos;t quite understand this change.

WebCore/bindings/scripts/test/JS/JSTestObj.cpp:896
 +          return jsTestObjPrototypeFunctionOverloadedMethod4(exec, 0, thisValue, args);
Shouldn&apos;t we be passing the second arg through from our caller?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>240191</commentid>
    <comment_count>7</comment_count>
      <attachid>56290</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-06-18 15:48:19 -0700</bug_when>
    <thetext>Comment on attachment 56290
Patch

In general, I think this is great.  However, Darin asked to review each change separately.  Can you break this up into a series of patches:

1) Rebaseline run-bindings-tests to pick up the PERFECT_HASH_SIZE change.  rs=me for landing that.
2) Update the code generator and show the changes in run-bindings-tests output.
3) One patch each for each API you&apos;re converting, along with a test that tries calling the API with each number of arguments and showing that the behavior either doesn&apos;t change or changes in a way that we want.

Discussion in other bugs has uncovered that WebIDL specs that you should throw exceptions if you get a number of arguments forbidden by the IDL.  It seems this is the behavior we want for new bindings.  Whether we want to adopt that behavior in old bindings is a question that we&apos;ll tackle on a case-by-case basis until we uncover a pattern to our decision making.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>244207</commentid>
    <comment_count>8</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2010-06-29 04:51:09 -0700</bug_when>
    <thetext>*** Bug 39962 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>411452</commentid>
    <comment_count>9</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2011-05-27 08:36:35 -0700</bug_when>
    <thetext>Taking and dep&apos;ing on some pending patches.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>607902</commentid>
    <comment_count>10</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2012-04-23 12:00:05 -0700</bug_when>
    <thetext>Oh woop, this is actually finished! Closing for great glory.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>56277</attachid>
            <date>2010-05-17 15:16:48 -0700</date>
            <delta_ts>2010-05-17 16:52:48 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-39243-20100517151647.patch</filename>
            <type>text/plain</type>
            <size>27900</size>
            <attacher name="Yaar Schnitman">yaar</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1OTYyNikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjQgQEAKKzIwMTAtMDUtMTcgIFlhYXIgU2Nobml0bWFuICA8eWFhckBjaHJvbWl1
bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
QXV0by1nZW5lcmF0ZSBDYW52YXMgb3ZlcmxvYWRzIGluIEpTQy4gU3VyZmFjZWQgbWlub3IgYnVn
cyBpbiB0aGUgb3ZlcmxvYWRlZCBhdXRvLWdlbmVyYXRpb24gY29kZS4KKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM5MjQzCisKKyAgICAgICAgQWxsIGxh
eW91dCB0ZXN0cyBwYXNzLgorCisgICAgICAgICogYmluZGluZ3MvanMvSlNDYW52YXNSZW5kZXJp
bmdDb250ZXh0MkRDdXN0b20uY3BwOiBSZW1vdmVkIGN1c3RvbSBjb2RlLgorICAgICAgICAqIGJp
bmRpbmdzL3NjcmlwdHMvQ29kZUdlbmVyYXRvckpTLnBtOiBGaXhlZCBzb21lIG1pbm9yIGJ1Z3Mu
CisgICAgICAgICogYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0pTL0pTVGVzdEludGVyZmFjZS5jcHA6
CisgICAgICAgIChXZWJDb3JlOjopOgorICAgICAgICAqIGJpbmRpbmdzL3NjcmlwdHMvdGVzdC9K
Uy9KU1Rlc3RPYmouY3BwOgorICAgICAgICAoV2ViQ29yZTo6KToKKyAgICAgICAgKFdlYkNvcmU6
OmpzVGVzdE9ialByb3RvdHlwZUZ1bmN0aW9uT3ZlcmxvYWRlZE1ldGhvZCk6CisgICAgICAgICog
aHRtbC9IVE1MQ2FudmFzRWxlbWVudC5pZGw6IFR1cm5lZCBvbiBuYXRpdmUgY29udmVyc2lvbiB0
aGF0J3MgbmVlZGVkIGluIGNhbnZhcyBtZXRob2RzLgorICAgICAgICAqIGh0bWwvSFRNTEltYWdl
RWxlbWVudC5pZGw6IFR1cm5lZCBvbiBuYXRpdmUgY29udmVyc2lvbiB0aGF0J3MgbmVlZGVkIGlu
IGNhbnZhcyBtZXRob2RzLgorICAgICAgICAqIGh0bWwvSFRNTFZpZGVvRWxlbWVudC5pZGw6IFR1
cm5lZCBvbiBuYXRpdmUgY29udmVyc2lvbiB0aGF0J3MgbmVlZGVkIGluIGNhbnZhcyBtZXRob2Rz
LgorICAgICAgICAqIGh0bWwvY2FudmFzL0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5pZGw6IFVu
Zm9ya2VkIFY4L0pTQyBkZWNsYXJhdGlvbiBzcGxpdC4KKwogMjAxMC0wNS0xNyAgUm9iZXJ0IEhv
Z2FuICA8cm9iZXJ0QHdlYmtpdC5vcmc+CiAKICAgICAgICAgUnViYmVyLXN0YW1wZWQgYnkgRXJp
YyBTZWlkZWwuCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL2pzL0pTQ2FudmFzUmVuZGVyaW5nQ29u
dGV4dDJEQ3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL2pzL0pTQ2Fu
dmFzUmVuZGVyaW5nQ29udGV4dDJEQ3VzdG9tLmNwcAkocmV2aXNpb24gNTk2MTgpCisrKyBXZWJD
b3JlL2JpbmRpbmdzL2pzL0pTQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEQ3VzdG9tLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtODksMzQ4ICs4OSw0IEBAIHZvaWQgSlNDYW52YXNSZW5kZXJpbmdDb250
ZXh0MkQ6OnNldEZpbGwKICAgICBjb250ZXh0LT5zZXRGaWxsU3R5bGUodG9IVE1MQ2FudmFzU3R5
bGUoZXhlYywgdmFsdWUpKTsKIH0KIAotSlNWYWx1ZSBKU0NhbnZhc1JlbmRlcmluZ0NvbnRleHQy
RDo6c2V0RmlsbENvbG9yKEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgQXJnTGlzdCYgYXJncykKLXsK
LSAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxDYW52
YXNSZW5kZXJpbmdDb250ZXh0MkQqPihpbXBsKCkpOwotCi0gICAgLy8gc3RyaW5nIGFyZyA9IG5h
bWVkIGNvbG9yCi0gICAgLy8gbnVtYmVyIGFyZyA9IGdyYXkgY29sb3IKLSAgICAvLyBzdHJpbmcg
YXJnLCBudW1iZXIgYXJnID0gbmFtZWQgY29sb3IsIGFscGhhCi0gICAgLy8gbnVtYmVyIGFyZywg
bnVtYmVyIGFyZyA9IGdyYXkgY29sb3IsIGFscGhhCi0gICAgLy8gNCBhcmdzID0gciwgZywgYiwg
YQotICAgIC8vIDUgYXJncyA9IGMsIG0sIHksIGssIGEKLSAgICBzd2l0Y2ggKGFyZ3Muc2l6ZSgp
KSB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGlmIChhcmdzLmF0KDApLmlzU3RyaW5n
KCkpCi0gICAgICAgICAgICAgICAgY29udGV4dC0+c2V0RmlsbENvbG9yKHVzdHJpbmdUb1N0cmlu
Zyhhc1N0cmluZyhhcmdzLmF0KDApKS0+dmFsdWUoZXhlYykpKTsKLSAgICAgICAgICAgIGVsc2UK
LSAgICAgICAgICAgICAgICBjb250ZXh0LT5zZXRGaWxsQ29sb3IoYXJncy5hdCgwKS50b0Zsb2F0
KGV4ZWMpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAg
ICBpZiAoYXJncy5hdCgwKS5pc1N0cmluZygpKQotICAgICAgICAgICAgICAgIGNvbnRleHQtPnNl
dEZpbGxDb2xvcih1c3RyaW5nVG9TdHJpbmcoYXNTdHJpbmcoYXJncy5hdCgwKSktPnZhbHVlKGV4
ZWMpKSwgYXJncy5hdCgxKS50b0Zsb2F0KGV4ZWMpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAg
ICAgICAgICAgICBjb250ZXh0LT5zZXRGaWxsQ29sb3IoYXJncy5hdCgwKS50b0Zsb2F0KGV4ZWMp
LCBhcmdzLmF0KDEpLnRvRmxvYXQoZXhlYykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IGNhc2UgNDoKLSAgICAgICAgICAgIGNvbnRleHQtPnNldEZpbGxDb2xvcihhcmdzLmF0KDApLnRv
RmxvYXQoZXhlYyksIGFyZ3MuYXQoMSkudG9GbG9hdChleGVjKSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBhcmdzLmF0KDIpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMykudG9G
bG9hdChleGVjKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1OgotICAgICAg
ICAgICAgY29udGV4dC0+c2V0RmlsbENvbG9yKGFyZ3MuYXQoMCkudG9GbG9hdChleGVjKSwgYXJn
cy5hdCgxKS50b0Zsb2F0KGV4ZWMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGFyZ3MuYXQoMikudG9GbG9hdChleGVjKSwgYXJncy5hdCgzKS50b0Zsb2F0KGV4ZWMpLCBhcmdz
LmF0KDQpLnRvRmxvYXQoZXhlYykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1
bHQ6Ci0gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBTeW50YXhFcnJvcik7Ci0g
ICAgfQotICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOwotfSAgICAKLQotSlNWYWx1ZSBKU0NhbnZh
c1JlbmRlcmluZ0NvbnRleHQyRDo6c2V0U3Ryb2tlQ29sb3IoRXhlY1N0YXRlKiBleGVjLCBjb25z
dCBBcmdMaXN0JiBhcmdzKQoteyAKLSAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNvbnRl
eHQgPSBzdGF0aWNfY2FzdDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqPihpbXBsKCkpOwotCi0g
ICAgLy8gc3RyaW5nIGFyZyA9IG5hbWVkIGNvbG9yCi0gICAgLy8gbnVtYmVyIGFyZyA9IGdyYXkg
Y29sb3IKLSAgICAvLyBzdHJpbmcgYXJnLCBudW1iZXIgYXJnID0gbmFtZWQgY29sb3IsIGFscGhh
Ci0gICAgLy8gbnVtYmVyIGFyZywgbnVtYmVyIGFyZyA9IGdyYXkgY29sb3IsIGFscGhhCi0gICAg
Ly8gNCBhcmdzID0gciwgZywgYiwgYQotICAgIC8vIDUgYXJncyA9IGMsIG0sIHksIGssIGEKLSAg
ICBzd2l0Y2ggKGFyZ3Muc2l6ZSgpKSB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGlm
IChhcmdzLmF0KDApLmlzU3RyaW5nKCkpCi0gICAgICAgICAgICAgICAgY29udGV4dC0+c2V0U3Ry
b2tlQ29sb3IodXN0cmluZ1RvU3RyaW5nKGFzU3RyaW5nKGFyZ3MuYXQoMCkpLT52YWx1ZShleGVj
KSkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNvbnRleHQtPnNldFN0cm9r
ZUNvbG9yKGFyZ3MuYXQoMCkudG9GbG9hdChleGVjKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgY2FzZSAyOgotICAgICAgICAgICAgaWYgKGFyZ3MuYXQoMCkuaXNTdHJpbmcoKSkKLSAg
ICAgICAgICAgICAgICBjb250ZXh0LT5zZXRTdHJva2VDb2xvcih1c3RyaW5nVG9TdHJpbmcoYXNT
dHJpbmcoYXJncy5hdCgwKSktPnZhbHVlKGV4ZWMpKSwgYXJncy5hdCgxKS50b0Zsb2F0KGV4ZWMp
KTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjb250ZXh0LT5zZXRTdHJva2VD
b2xvcihhcmdzLmF0KDApLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMSkudG9GbG9hdChleGVjKSk7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgY29udGV4
dC0+c2V0U3Ryb2tlQ29sb3IoYXJncy5hdCgwKS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDEpLnRv
RmxvYXQoZXhlYyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmF0
KDIpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMykudG9GbG9hdChleGVjKSk7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgY29udGV4dC0+c2V0U3Ryb2tl
Q29sb3IoYXJncy5hdCgwKS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDEpLnRvRmxvYXQoZXhlYyks
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmF0KDIpLnRvRmxvYXQo
ZXhlYyksIGFyZ3MuYXQoMykudG9GbG9hdChleGVjKSwgYXJncy5hdCg0KS50b0Zsb2F0KGV4ZWMp
KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0
dXJuIHRocm93RXJyb3IoZXhlYywgU3ludGF4RXJyb3IpOwotICAgIH0KLSAgICAKLSAgICByZXR1
cm4ganNVbmRlZmluZWQoKTsKLX0KLQotSlNWYWx1ZSBKU0NhbnZhc1JlbmRlcmluZ0NvbnRleHQy
RDo6c3Ryb2tlUmVjdChFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IEFyZ0xpc3QmIGFyZ3MpCi17IAot
ICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCogY29udGV4dCA9IHN0YXRpY19jYXN0PENhbnZh
c1JlbmRlcmluZ0NvbnRleHQyRCo+KGltcGwoKSk7Ci0gICAgCi0gICAgaWYgKGFyZ3Muc2l6ZSgp
IDw9IDQpCi0gICAgICAgIGNvbnRleHQtPnN0cm9rZVJlY3QoYXJncy5hdCgwKS50b0Zsb2F0KGV4
ZWMpLCBhcmdzLmF0KDEpLnRvRmxvYXQoZXhlYyksCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgYXJncy5hdCgyKS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDMpLnRvRmxvYXQoZXhlYykpOwot
ICAgIGVsc2UKLSAgICAgICAgY29udGV4dC0+c3Ryb2tlUmVjdChhcmdzLmF0KDApLnRvRmxvYXQo
ZXhlYyksIGFyZ3MuYXQoMSkudG9GbG9hdChleGVjKSwKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBhcmdzLmF0KDIpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMykudG9GbG9hdChleGVjKSwg
YXJncy5hdCg0KS50b0Zsb2F0KGV4ZWMpKTsKLQotICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOyAg
ICAKLX0KLQotSlNWYWx1ZSBKU0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDo6ZHJhd0ltYWdlKEV4
ZWNTdGF0ZSogZXhlYywgY29uc3QgQXJnTGlzdCYgYXJncykKLXsgCi0gICAgQ2FudmFzUmVuZGVy
aW5nQ29udGV4dDJEKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q2FudmFzUmVuZGVyaW5nQ29udGV4
dDJEKj4oaW1wbCgpKTsKLQotICAgIC8vIERyYXdJbWFnZSBoYXMgdGhyZWUgdmFyaWFudHM6Ci0g
ICAgLy8gICAgIGRyYXdJbWFnZShpbWcsIGR4LCBkeSkKLSAgICAvLyAgICAgZHJhd0ltYWdlKGlt
ZywgZHgsIGR5LCBkdywgZGgpCi0gICAgLy8gICAgIGRyYXdJbWFnZShpbWcsIHN4LCBzeSwgc3cs
IHNoLCBkeCwgZHksIGR3LCBkaCkKLSAgICAvLyBDb21wb3NpdGUgb3BlcmF0aW9uIGlzIHNwZWNp
ZmllZCB3aXRoIGdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbi4KLSAgICAvLyBUaGUgaW1nIHBhcmFt
ZXRlciBjYW4gYmUgYSA8aW1nPiBvciA8Y2FudmFzPiBlbGVtZW50LgotICAgIEpTVmFsdWUgdmFs
dWUgPSBhcmdzLmF0KDApOwotICAgIGlmICghdmFsdWUuaXNPYmplY3QoKSkKLSAgICAgICAgcmV0
dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVycm9yKTsKLSAgICBKU09iamVjdCogbyA9IGFzT2Jq
ZWN0KHZhbHVlKTsKLSAgICAKLSAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBpZiAoby0+
aW5oZXJpdHMoJkpTSFRNTEltYWdlRWxlbWVudDo6c19pbmZvKSkgewotICAgICAgICBIVE1MSW1h
Z2VFbGVtZW50KiBpbWdFbHQgPSBzdGF0aWNfY2FzdDxIVE1MSW1hZ2VFbGVtZW50Kj4oc3RhdGlj
X2Nhc3Q8SlNIVE1MRWxlbWVudCo+KG8pLT5pbXBsKCkpOwotICAgICAgICBzd2l0Y2ggKGFyZ3Mu
c2l6ZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgY29udGV4dC0+
ZHJhd0ltYWdlKGltZ0VsdCwgYXJncy5hdCgxKS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDIpLnRv
RmxvYXQoZXhlYyksIGVjKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNh
c2UgNToKLSAgICAgICAgICAgICAgICBjb250ZXh0LT5kcmF3SW1hZ2UoaW1nRWx0LCBhcmdzLmF0
KDEpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMikudG9GbG9hdChleGVjKSwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5hdCgzKS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0
KDQpLnRvRmxvYXQoZXhlYyksIGVjKTsKLSAgICAgICAgICAgICAgICBzZXRET01FeGNlcHRpb24o
ZXhlYywgZWMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA5Ogot
ICAgICAgICAgICAgICAgIGNvbnRleHQtPmRyYXdJbWFnZShpbWdFbHQsIEZsb2F0UmVjdChhcmdz
LmF0KDEpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMikudG9GbG9hdChleGVjKSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5hdCgzKS50b0Zsb2F0KGV4ZWMpLCBhcmdz
LmF0KDQpLnRvRmxvYXQoZXhlYykpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBGbG9hdFJlY3QoYXJncy5hdCg1KS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDYpLnRvRmxvYXQo
ZXhlYyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuYXQoNykudG9G
bG9hdChleGVjKSwgYXJncy5hdCg4KS50b0Zsb2F0KGV4ZWMpKSwgZWMpOwotICAgICAgICAgICAg
ICAgIHNldERPTUV4Y2VwdGlvbihleGVjLCBlYyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4
ZWMsIFN5bnRheEVycm9yKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoby0+aW5oZXJpdHMo
JkpTSFRNTENhbnZhc0VsZW1lbnQ6OnNfaW5mbykpIHsKLSAgICAgICAgSFRNTENhbnZhc0VsZW1l
bnQqIGNhbnZhcyA9IHN0YXRpY19jYXN0PEhUTUxDYW52YXNFbGVtZW50Kj4oc3RhdGljX2Nhc3Q8
SlNIVE1MRWxlbWVudCo+KG8pLT5pbXBsKCkpOwotICAgICAgICBzd2l0Y2ggKGFyZ3Muc2l6ZSgp
KSB7Ci0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgY29udGV4dC0+ZHJhd0lt
YWdlKGNhbnZhcywgYXJncy5hdCgxKS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDIpLnRvRmxvYXQo
ZXhlYyksIGVjKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNToK
LSAgICAgICAgICAgICAgICBjb250ZXh0LT5kcmF3SW1hZ2UoY2FudmFzLCBhcmdzLmF0KDEpLnRv
RmxvYXQoZXhlYyksIGFyZ3MuYXQoMikudG9GbG9hdChleGVjKSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYXJncy5hdCgzKS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDQpLnRv
RmxvYXQoZXhlYyksIGVjKTsKLSAgICAgICAgICAgICAgICBzZXRET01FeGNlcHRpb24oZXhlYywg
ZWMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA5OgotICAgICAg
ICAgICAgICAgIGNvbnRleHQtPmRyYXdJbWFnZShjYW52YXMsIEZsb2F0UmVjdChhcmdzLmF0KDEp
LnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMikudG9GbG9hdChleGVjKSwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYXJncy5hdCgzKS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDQp
LnRvRmxvYXQoZXhlYykpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG9h
dFJlY3QoYXJncy5hdCg1KS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDYpLnRvRmxvYXQoZXhlYyks
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuYXQoNykudG9GbG9hdChl
eGVjKSwgYXJncy5hdCg4KS50b0Zsb2F0KGV4ZWMpKSwgZWMpOwotICAgICAgICAgICAgICAgIHNl
dERPTUV4Y2VwdGlvbihleGVjLCBlYyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFN5
bnRheEVycm9yKTsKLSAgICAgICAgfQotI2lmIEVOQUJMRShWSURFTykKLSAgICB9IGVsc2UgaWYg
KG8tPmluaGVyaXRzKCZKU0hUTUxWaWRlb0VsZW1lbnQ6OnNfaW5mbykpIHsKLSAgICAgICAgICAg
IEhUTUxWaWRlb0VsZW1lbnQqIHZpZGVvID0gc3RhdGljX2Nhc3Q8SFRNTFZpZGVvRWxlbWVudCo+
KHN0YXRpY19jYXN0PEpTSFRNTEVsZW1lbnQqPihvKS0+aW1wbCgpKTsKLSAgICAgICAgICAgIHN3
aXRjaCAoYXJncy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAg
ICAgICAgICAgIGNvbnRleHQtPmRyYXdJbWFnZSh2aWRlbywgYXJncy5hdCgxKS50b0Zsb2F0KGV4
ZWMpLCBhcmdzLmF0KDIpLnRvRmxvYXQoZXhlYyksIGVjKTsKLSAgICAgICAgICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgICAgICBjb250
ZXh0LT5kcmF3SW1hZ2UodmlkZW8sIGFyZ3MuYXQoMSkudG9GbG9hdChleGVjKSwgYXJncy5hdCgy
KS50b0Zsb2F0KGV4ZWMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
YXJncy5hdCgzKS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDQpLnRvRmxvYXQoZXhlYyksIGVjKTsK
LSAgICAgICAgICAgICAgICAgICAgc2V0RE9NRXhjZXB0aW9uKGV4ZWMsIGVjKTsKLSAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAg
ICAgICAgICBjb250ZXh0LT5kcmF3SW1hZ2UodmlkZW8sIEZsb2F0UmVjdChhcmdzLmF0KDEpLnRv
RmxvYXQoZXhlYyksIGFyZ3MuYXQoMikudG9GbG9hdChleGVjKSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuYXQoMykudG9GbG9hdChleGVjKSwgYXJncy5hdCg0
KS50b0Zsb2F0KGV4ZWMpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IEZsb2F0UmVjdChhcmdzLmF0KDUpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoNikudG9GbG9hdChl
eGVjKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuYXQoNyku
dG9GbG9hdChleGVjKSwgYXJncy5hdCg4KS50b0Zsb2F0KGV4ZWMpKSwgZWMpOwotICAgICAgICAg
ICAgICAgICAgICBzZXRET01FeGNlcHRpb24oZXhlYywgZWMpOwotICAgICAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gdGhyb3dFcnJvcihleGVjLCBTeW50YXhFcnJvcik7Ci0gICAgICAgIH0KLSNlbmRpZgot
ICAgIH0gZWxzZSB7Ci0gICAgICAgIHNldERPTUV4Y2VwdGlvbihleGVjLCBUWVBFX01JU01BVENI
X0VSUik7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOyAgICAKLX0KLQot
SlNWYWx1ZSBKU0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDo6ZHJhd0ltYWdlRnJvbVJlY3QoRXhl
Y1N0YXRlKiBleGVjLCBjb25zdCBBcmdMaXN0JiBhcmdzKQoteyAKLSAgICBDYW52YXNSZW5kZXJp
bmdDb250ZXh0MkQqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxDYW52YXNSZW5kZXJpbmdDb250ZXh0
MkQqPihpbXBsKCkpOwotICAgIAotICAgIEpTVmFsdWUgdmFsdWUgPSBhcmdzLmF0KDApOwotICAg
IGlmICghdmFsdWUuaXNPYmplY3QoKSkKLSAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywg
VHlwZUVycm9yKTsKLSAgICBKU09iamVjdCogbyA9IGFzT2JqZWN0KHZhbHVlKTsKLSAgICAKLSAg
ICBpZiAoIW8tPmluaGVyaXRzKCZKU0hUTUxJbWFnZUVsZW1lbnQ6OnNfaW5mbykpCi0gICAgICAg
IHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFR5cGVFcnJvcik7Ci0gICAgY29udGV4dC0+ZHJhd0lt
YWdlRnJvbVJlY3Qoc3RhdGljX2Nhc3Q8SFRNTEltYWdlRWxlbWVudCo+KHN0YXRpY19jYXN0PEpT
SFRNTEVsZW1lbnQqPihvKS0+aW1wbCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBhcmdzLmF0KDEpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMikudG9GbG9hdChleGVjKSwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmF0KDMpLnRvRmxvYXQoZXhlYyksIGFy
Z3MuYXQoNCkudG9GbG9hdChleGVjKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBh
cmdzLmF0KDUpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoNikudG9GbG9hdChleGVjKSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmF0KDcpLnRvRmxvYXQoZXhlYyksIGFyZ3Mu
YXQoOCkudG9GbG9hdChleGVjKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c3Ry
aW5nVG9TdHJpbmcoYXJncy5hdCg5KS50b1N0cmluZyhleGVjKSkpOyAgICAKLSAgICByZXR1cm4g
anNVbmRlZmluZWQoKTsgICAgCi19Ci0KLUpTVmFsdWUgSlNDYW52YXNSZW5kZXJpbmdDb250ZXh0
MkQ6OnNldFNoYWRvdyhFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IEFyZ0xpc3QmIGFyZ3MpCi17IAot
ICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCogY29udGV4dCA9IHN0YXRpY19jYXN0PENhbnZh
c1JlbmRlcmluZ0NvbnRleHQyRCo+KGltcGwoKSk7Ci0KLSAgICBzd2l0Y2ggKGFyZ3Muc2l6ZSgp
KSB7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGNvbnRleHQtPnNldFNoYWRvdyhhcmdz
LmF0KDApLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMSkudG9GbG9hdChleGVjKSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmF0KDIpLnRvRmxvYXQoZXhlYykpOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGlmIChhcmdzLmF0KDMp
LmlzU3RyaW5nKCkpCi0gICAgICAgICAgICAgICAgY29udGV4dC0+c2V0U2hhZG93KGFyZ3MuYXQo
MCkudG9GbG9hdChleGVjKSwgYXJncy5hdCgxKS50b0Zsb2F0KGV4ZWMpLAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmF0KDIpLnRvRmxvYXQoZXhlYyksIHVzdHJpbmdU
b1N0cmluZyhhc1N0cmluZyhhcmdzLmF0KDMpKS0+dmFsdWUoZXhlYykpKTsKLSAgICAgICAgICAg
IGVsc2UKLSAgICAgICAgICAgICAgICBjb250ZXh0LT5zZXRTaGFkb3coYXJncy5hdCgwKS50b0Zs
b2F0KGV4ZWMpLCBhcmdzLmF0KDEpLnRvRmxvYXQoZXhlYyksCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGFyZ3MuYXQoMikudG9GbG9hdChleGVjKSwgYXJncy5hdCgzKS50b0Zs
b2F0KGV4ZWMpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU6Ci0gICAgICAg
ICAgICBpZiAoYXJncy5hdCgzKS5pc1N0cmluZygpKQotICAgICAgICAgICAgICAgIGNvbnRleHQt
PnNldFNoYWRvdyhhcmdzLmF0KDApLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMSkudG9GbG9hdChl
eGVjKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5hdCgyKS50b0Zs
b2F0KGV4ZWMpLCB1c3RyaW5nVG9TdHJpbmcoYXNTdHJpbmcoYXJncy5hdCgzKSktPnZhbHVlKGV4
ZWMpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5hdCg0KS50b0Zs
b2F0KGV4ZWMpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjb250ZXh0LT5z
ZXRTaGFkb3coYXJncy5hdCgwKS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDEpLnRvRmxvYXQoZXhl
YyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuYXQoMikudG9GbG9h
dChleGVjKSwgYXJncy5hdCgzKS50b0Zsb2F0KGV4ZWMpLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBhcmdzLmF0KDQpLnRvRmxvYXQoZXhlYykpOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgIGNvbnRleHQtPnNldFNoYWRvdyhhcmdz
LmF0KDApLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMSkudG9GbG9hdChleGVjKSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmF0KDIpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQo
MykudG9GbG9hdChleGVjKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmF0
KDQpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoNSkudG9GbG9hdChleGVjKSwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBhcmdzLmF0KDYpLnRvRmxvYXQoZXhlYykpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIGNvbnRleHQtPnNldFNoYWRv
dyhhcmdzLmF0KDApLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMSkudG9GbG9hdChleGVjKSwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmF0KDIpLnRvRmxvYXQoZXhlYyksIGFy
Z3MuYXQoMykudG9GbG9hdChleGVjKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBh
cmdzLmF0KDQpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoNSkudG9GbG9hdChleGVjKSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmF0KDYpLnRvRmxvYXQoZXhlYyksIGFyZ3Mu
YXQoNykudG9GbG9hdChleGVjKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVs
dDoKLSAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFN5bnRheEVycm9yKTsKLSAg
ICB9Ci0gICAgCi0gICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7ICAgIAotfQotCi1KU1ZhbHVlIEpT
Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEOjpjcmVhdGVQYXR0ZXJuKEV4ZWNTdGF0ZSogZXhlYywg
Y29uc3QgQXJnTGlzdCYgYXJncykKLXsgCi0gICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBj
b250ZXh0ID0gc3RhdGljX2Nhc3Q8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKj4oaW1wbCgpKTsK
LQotICAgIEpTVmFsdWUgdmFsdWUgPSBhcmdzLmF0KDApOwotICAgIGlmICghdmFsdWUuaXNPYmpl
Y3QoKSkKLSAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVycm9yKTsKLSAgICBK
U09iamVjdCogbyA9IGFzT2JqZWN0KHZhbHVlKTsKLQotICAgIGlmIChvLT5pbmhlcml0cygmSlNI
VE1MSW1hZ2VFbGVtZW50OjpzX2luZm8pKSB7Ci0gICAgICAgIEV4Y2VwdGlvbkNvZGUgZWM7Ci0g
ICAgICAgIEpTVmFsdWUgcGF0dGVybiA9IHRvSlMoZXhlYywKLSAgICAgICAgICAgIGNvbnRleHQt
PmNyZWF0ZVBhdHRlcm4oc3RhdGljX2Nhc3Q8SFRNTEltYWdlRWxlbWVudCo+KHN0YXRpY19jYXN0
PEpTSFRNTEVsZW1lbnQqPihvKS0+aW1wbCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdmFsdWVUb1N0cmluZ1dpdGhOdWxsQ2hlY2soZXhlYywgYXJncy5hdCgxKSksIGVj
KS5nZXQoKSk7Ci0gICAgICAgIHNldERPTUV4Y2VwdGlvbihleGVjLCBlYyk7Ci0gICAgICAgIHJl
dHVybiBwYXR0ZXJuOwotICAgIH0KLSAgICBpZiAoby0+aW5oZXJpdHMoJkpTSFRNTENhbnZhc0Vs
ZW1lbnQ6OnNfaW5mbykpIHsKLSAgICAgICAgRXhjZXB0aW9uQ29kZSBlYzsKLSAgICAgICAgSlNW
YWx1ZSBwYXR0ZXJuID0gdG9KUyhleGVjLAotICAgICAgICAgICAgY29udGV4dC0+Y3JlYXRlUGF0
dGVybihzdGF0aWNfY2FzdDxIVE1MQ2FudmFzRWxlbWVudCo+KHN0YXRpY19jYXN0PEpTSFRNTEVs
ZW1lbnQqPihvKS0+aW1wbCgpKSwKLSAgICAgICAgICAgICAgICB2YWx1ZVRvU3RyaW5nV2l0aE51
bGxDaGVjayhleGVjLCBhcmdzLmF0KDEpKSwgZWMpLmdldCgpKTsKLSAgICAgICAgc2V0RE9NRXhj
ZXB0aW9uKGV4ZWMsIGVjKTsKLSAgICAgICAgcmV0dXJuIHBhdHRlcm47Ci0gICAgfQotICAgIHNl
dERPTUV4Y2VwdGlvbihleGVjLCBUWVBFX01JU01BVENIX0VSUik7Ci0gICAgcmV0dXJuIGpzVW5k
ZWZpbmVkKCk7Ci19Ci0KLUpTVmFsdWUgSlNDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ6OmNyZWF0
ZUltYWdlRGF0YShFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IEFyZ0xpc3QmIGFyZ3MpCi17Ci0gICAg
Ly8gY3JlYXRlSW1hZ2VEYXRhIGhhcyB0d28gdmFyaWFudHMKLSAgICAvLyBjcmVhdGVJbWFnZURh
dGEoSW1hZ2VEYXRhKQotICAgIC8vIGNyZWF0ZUltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0KQotICAg
IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCogY29udGV4dCA9IHN0YXRpY19jYXN0PENhbnZhc1Jl
bmRlcmluZ0NvbnRleHQyRCo+KGltcGwoKSk7Ci0gICAgUmVmUHRyPEltYWdlRGF0YT4gaW1hZ2VE
YXRhID0gMDsKLQotICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgIGlmIChhcmdzLnNpemUo
KSA9PSAxKQotICAgICAgICBpbWFnZURhdGEgPSBjb250ZXh0LT5jcmVhdGVJbWFnZURhdGEodG9J
bWFnZURhdGEoYXJncy5hdCgwKSksIGVjKTsKLSAgICBlbHNlIGlmIChhcmdzLnNpemUoKSA9PSAy
KQotICAgICAgICBpbWFnZURhdGEgPSBjb250ZXh0LT5jcmVhdGVJbWFnZURhdGEoYXJncy5hdCgw
KS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDEpLnRvRmxvYXQoZXhlYyksIGVjKTsKLQotICAgIHNl
dERPTUV4Y2VwdGlvbihleGVjLCBlYyk7Ci0gICAgcmV0dXJuIHRvSlMoZXhlYywgZ2xvYmFsT2Jq
ZWN0KCksIFdURjo6Z2V0UHRyKGltYWdlRGF0YSkpOwotfQotCi1KU1ZhbHVlIEpTQ2FudmFzUmVu
ZGVyaW5nQ29udGV4dDJEOjpwdXRJbWFnZURhdGEoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBBcmdM
aXN0JiBhcmdzKQotewotICAgIC8vIHB1dEltYWdlRGF0YSBoYXMgdHdvIHZhcmlhbnRzCi0gICAg
Ly8gcHV0SW1hZ2VEYXRhKEltYWdlRGF0YSwgeCwgeSkKLSAgICAvLyBwdXRJbWFnZURhdGEoSW1h
Z2VEYXRhLCB4LCB5LCBkaXJ0eVgsIGRpcnR5WSwgZGlydHlXaWR0aCwgZGlydHlIZWlnaHQpCi0g
ICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q2FudmFz
UmVuZGVyaW5nQ29udGV4dDJEKj4oaW1wbCgpKTsKLQotICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAw
OwotICAgIGlmIChhcmdzLnNpemUoKSA+PSA3KQotICAgICAgICBjb250ZXh0LT5wdXRJbWFnZURh
dGEodG9JbWFnZURhdGEoYXJncy5hdCgwKSksIGFyZ3MuYXQoMSkudG9GbG9hdChleGVjKSwgYXJn
cy5hdCgyKS50b0Zsb2F0KGV4ZWMpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFy
Z3MuYXQoMykudG9GbG9hdChleGVjKSwgYXJncy5hdCg0KS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0
KDUpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoNikudG9GbG9hdChleGVjKSwgZWMpOwotICAgIGVs
c2UKLSAgICAgICAgY29udGV4dC0+cHV0SW1hZ2VEYXRhKHRvSW1hZ2VEYXRhKGFyZ3MuYXQoMCkp
LCBhcmdzLmF0KDEpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMikudG9GbG9hdChleGVjKSwgZWMp
OwotCi0gICAgc2V0RE9NRXhjZXB0aW9uKGV4ZWMsIGVjKTsKLSAgICByZXR1cm4ganNVbmRlZmlu
ZWQoKTsKLX0KLQotSlNWYWx1ZSBKU0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDo6ZmlsbFRleHQo
RXhlY1N0YXRlKiBleGVjLCBjb25zdCBBcmdMaXN0JiBhcmdzKQoteyAKLSAgICBDYW52YXNSZW5k
ZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxDYW52YXNSZW5kZXJpbmdDb250
ZXh0MkQqPihpbXBsKCkpOwotCi0gICAgLy8gc3RyaW5nIGFyZyA9IHRleHQgdG8gZHJhdwotICAg
IC8vIG51bWJlciBhcmcgPSB4Ci0gICAgLy8gbnVtYmVyIGFyZyA9IHkKLSAgICAvLyBvcHRpb25h
bCBudW1iZXIgYXJnID0gbWF4V2lkdGgKLSAgICBpZiAoYXJncy5zaXplKCkgPCAzIHx8IGFyZ3Mu
c2l6ZSgpID4gNCkKLSAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgU3ludGF4RXJyb3Ip
OwotICAgIAotICAgIGlmIChhcmdzLnNpemUoKSA9PSA0KQotICAgICAgICBjb250ZXh0LT5maWxs
VGV4dCh1c3RyaW5nVG9TdHJpbmcoYXJncy5hdCgwKS50b1N0cmluZyhleGVjKSksIGFyZ3MuYXQo
MSkudG9GbG9hdChleGVjKSwgYXJncy5hdCgyKS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDMpLnRv
RmxvYXQoZXhlYykpOwotICAgIGVsc2UKLSAgICAgICAgY29udGV4dC0+ZmlsbFRleHQodXN0cmlu
Z1RvU3RyaW5nKGFyZ3MuYXQoMCkudG9TdHJpbmcoZXhlYykpLCBhcmdzLmF0KDEpLnRvRmxvYXQo
ZXhlYyksIGFyZ3MuYXQoMikudG9GbG9hdChleGVjKSk7Ci0gICAgcmV0dXJuIGpzVW5kZWZpbmVk
KCk7Ci19Ci0KLUpTVmFsdWUgSlNDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ6OnN0cm9rZVRleHQo
RXhlY1N0YXRlKiBleGVjLCBjb25zdCBBcmdMaXN0JiBhcmdzKQoteyAKLSAgICBDYW52YXNSZW5k
ZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxDYW52YXNSZW5kZXJpbmdDb250
ZXh0MkQqPihpbXBsKCkpOwotCi0gICAgLy8gc3RyaW5nIGFyZyA9IHRleHQgdG8gZHJhdwotICAg
IC8vIG51bWJlciBhcmcgPSB4Ci0gICAgLy8gbnVtYmVyIGFyZyA9IHkKLSAgICAvLyBvcHRpb25h
bCBudW1iZXIgYXJnID0gbWF4V2lkdGgKLSAgICBpZiAoYXJncy5zaXplKCkgPCAzIHx8IGFyZ3Mu
c2l6ZSgpID4gNCkKLSAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgU3ludGF4RXJyb3Ip
OwotICAgIAotICAgIGlmIChhcmdzLnNpemUoKSA9PSA0KQotICAgICAgICBjb250ZXh0LT5zdHJv
a2VUZXh0KHVzdHJpbmdUb1N0cmluZyhhcmdzLmF0KDApLnRvU3RyaW5nKGV4ZWMpKSwgYXJncy5h
dCgxKS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDIpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMyku
dG9GbG9hdChleGVjKSk7Ci0gICAgZWxzZQotICAgICAgICBjb250ZXh0LT5zdHJva2VUZXh0KHVz
dHJpbmdUb1N0cmluZyhhcmdzLmF0KDApLnRvU3RyaW5nKGV4ZWMpKSwgYXJncy5hdCgxKS50b0Zs
b2F0KGV4ZWMpLCBhcmdzLmF0KDIpLnRvRmxvYXQoZXhlYykpOwotICAgIHJldHVybiBqc1VuZGVm
aW5lZCgpOwotfQotCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL2JpbmRp
bmdzL3NjcmlwdHMvQ29kZUdlbmVyYXRvckpTLnBtCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmlu
ZGluZ3Mvc2NyaXB0cy9Db2RlR2VuZXJhdG9ySlMucG0JKHJldmlzaW9uIDU5NjE4KQorKysgV2Vi
Q29yZS9iaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0b3JKUy5wbQkod29ya2luZyBjb3B5KQpA
QCAtMTExMyw3ICsxMTEzLDcgQEAgc3ViIEdlbmVyYXRlUGFyYW1ldGVyc0NoZWNrRXhwcmVzc2lv
bgogICAgICAgICAjIHRoZXNlIGFyZSBhY2NlcHRhYmxlIHZhbHVlcyBmb3IgYSBET01TdHJpbmcg
YXJndW1lbnQgKGFueSBPYmplY3QgY2FuCiAgICAgICAgICMgYmUgY29udmVydGVkIHRvIGEgc3Ry
aW5nIHZpYSAudG9TdHJpbmcpLgogICAgICAgICBwdXNoKEBhbmRFeHByZXNzaW9uLCAiKCR7dmFs
dWV9LmlzTnVsbCgpIHx8ICR7dmFsdWV9LmlzVW5kZWZpbmVkKCkgfHwgJHt2YWx1ZX0uaXNTdHJp
bmcoKSB8fCAke3ZhbHVlfS5pc09iamVjdCgpKSIpIGlmICRjb2RlR2VuZXJhdG9yLT5Jc1N0cmlu
Z1R5cGUoJHR5cGUpOwotICAgICAgICBwdXNoKEBhbmRFeHByZXNzaW9uLCAiKCR7dmFsdWV9Lmlz
TnVsbCgpIHx8IGFzT2JqZWN0KCR7dmFsdWV9KS0+aW5oZXJpdHMoSlMke3R5cGV9OjpzX2luZm8p
IikgdW5sZXNzIElzTmF0aXZlVHlwZSgkdHlwZSk7CisgICAgICAgIHB1c2goQGFuZEV4cHJlc3Np
b24sICIoJHt2YWx1ZX0uaXNOdWxsKCkgfHwgYXNPYmplY3QoJHt2YWx1ZX0pLT5pbmhlcml0cygm
SlMke3R5cGV9OjpzX2luZm8pKSIpIHVubGVzcyBJc05hdGl2ZVR5cGUoJHR5cGUpOwogCiAgICAg
ICAgICRwYXJhbWV0ZXJJbmRleCsrOwogICAgIH0KQEAgLTExNTksNyArMTE1OSw3IEBAIEVORAog
ICAgIGZvcmVhY2ggbXkgJG92ZXJsb2FkIChAeyRmdW5jdGlvbi0+e292ZXJsb2Fkc319KSB7CiAg
ICAgICAgIG15ICRwYXJhbWV0ZXJzQ2hlY2sgPSBHZW5lcmF0ZUZ1bmN0aW9uUGFyYW1ldGVyc0No
ZWNrKCRvdmVybG9hZCk7CiAgICAgICAgIHB1c2goQGltcGxDb250ZW50LCAiICAgIGlmICgkcGFy
YW1ldGVyc0NoZWNrKVxuIik7Ci0gICAgICAgIHB1c2goQGltcGxDb250ZW50LCAiICAgICAgICBy
ZXR1cm4gJHtmdW5jdGlvbk5hbWV9JG92ZXJsb2FkLT57b3ZlcmxvYWRJbmRleH0oZXhlYywgdGhp
c1ZhbHVlLCBhcmdzKTtcbiIpOworICAgICAgICBwdXNoKEBpbXBsQ29udGVudCwgIiAgICAgICAg
cmV0dXJuICR7ZnVuY3Rpb25OYW1lfSRvdmVybG9hZC0+e292ZXJsb2FkSW5kZXh9KGV4ZWMsIDAs
IHRoaXNWYWx1ZSwgYXJncyk7XG4iKTsKICAgICB9CiAgICAgcHVzaChAaW1wbENvbnRlbnQsIDw8
RU5EKTsKICAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBUeXBlRXJyb3IpOwpJbmRleDogV2Vi
Q29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvSlMvSlNUZXN0SW50ZXJmYWNlLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9KUy9KU1Rlc3RJbnRlcmZhY2Uu
Y3BwCShyZXZpc2lvbiA1OTYxOCkKKysrIFdlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0pT
L0pTVGVzdEludGVyZmFjZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ0LDEzICs0NCw3IEBAIHN0
YXRpYyBjb25zdCBIYXNoVGFibGVWYWx1ZSBKU1Rlc3RJbnRlcmYKIH07CiAKICN1bmRlZiBUSFVO
S19HRU5FUkFUT1IKLXN0YXRpYyBKU0NfQ09OU1RfSEFTSFRBQkxFIEhhc2hUYWJsZSBKU1Rlc3RJ
bnRlcmZhY2VUYWJsZSA9Ci0jaWYgRU5BQkxFKFBFUkZFQ1RfSEFTSF9TSVpFKQotICAgIHsgMCwg
SlNUZXN0SW50ZXJmYWNlVGFibGVWYWx1ZXMsIDAgfTsKLSNlbHNlCi0gICAgeyAyLCAxLCBKU1Rl
c3RJbnRlcmZhY2VUYWJsZVZhbHVlcywgMCB9OwotI2VuZGlmCi0KK3N0YXRpYyBKU0NfQ09OU1Rf
SEFTSFRBQkxFIEhhc2hUYWJsZSBKU1Rlc3RJbnRlcmZhY2VUYWJsZSA9IHsgMiwgMSwgSlNUZXN0
SW50ZXJmYWNlVGFibGVWYWx1ZXMsIDAgfTsKIC8qIEhhc2ggdGFibGUgZm9yIGNvbnN0cnVjdG9y
ICovCiAjaWYgRU5BQkxFKEpJVCkKICNkZWZpbmUgVEhVTktfR0VORVJBVE9SKGdlbmVyYXRvcikg
LCBnZW5lcmF0b3IKQEAgLTY0LDEzICs1OCw3IEBAIHN0YXRpYyBjb25zdCBIYXNoVGFibGVWYWx1
ZSBKU1Rlc3RJbnRlcmYKIH07CiAKICN1bmRlZiBUSFVOS19HRU5FUkFUT1IKLXN0YXRpYyBKU0Nf
Q09OU1RfSEFTSFRBQkxFIEhhc2hUYWJsZSBKU1Rlc3RJbnRlcmZhY2VDb25zdHJ1Y3RvclRhYmxl
ID0KLSNpZiBFTkFCTEUoUEVSRkVDVF9IQVNIX1NJWkUpCi0gICAgeyAwLCBKU1Rlc3RJbnRlcmZh
Y2VDb25zdHJ1Y3RvclRhYmxlVmFsdWVzLCAwIH07Ci0jZWxzZQotICAgIHsgMSwgMCwgSlNUZXN0
SW50ZXJmYWNlQ29uc3RydWN0b3JUYWJsZVZhbHVlcywgMCB9OwotI2VuZGlmCi0KK3N0YXRpYyBK
U0NfQ09OU1RfSEFTSFRBQkxFIEhhc2hUYWJsZSBKU1Rlc3RJbnRlcmZhY2VDb25zdHJ1Y3RvclRh
YmxlID0geyAxLCAwLCBKU1Rlc3RJbnRlcmZhY2VDb25zdHJ1Y3RvclRhYmxlVmFsdWVzLCAwIH07
CiBjbGFzcyBKU1Rlc3RJbnRlcmZhY2VDb25zdHJ1Y3RvciA6IHB1YmxpYyBET01Db25zdHJ1Y3Rv
ck9iamVjdCB7CiBwdWJsaWM6CiAgICAgSlNUZXN0SW50ZXJmYWNlQ29uc3RydWN0b3IoRXhlY1N0
YXRlKiBleGVjLCBKU0RPTUdsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0KQpAQCAtMTI5LDEzICsx
MTcsNyBAQCBzdGF0aWMgY29uc3QgSGFzaFRhYmxlVmFsdWUgSlNUZXN0SW50ZXJmCiB9OwogCiAj
dW5kZWYgVEhVTktfR0VORVJBVE9SCi1zdGF0aWMgSlNDX0NPTlNUX0hBU0hUQUJMRSBIYXNoVGFi
bGUgSlNUZXN0SW50ZXJmYWNlUHJvdG90eXBlVGFibGUgPQotI2lmIEVOQUJMRShQRVJGRUNUX0hB
U0hfU0laRSkKLSAgICB7IDAsIEpTVGVzdEludGVyZmFjZVByb3RvdHlwZVRhYmxlVmFsdWVzLCAw
IH07Ci0jZWxzZQotICAgIHsgMSwgMCwgSlNUZXN0SW50ZXJmYWNlUHJvdG90eXBlVGFibGVWYWx1
ZXMsIDAgfTsKLSNlbmRpZgotCitzdGF0aWMgSlNDX0NPTlNUX0hBU0hUQUJMRSBIYXNoVGFibGUg
SlNUZXN0SW50ZXJmYWNlUHJvdG90eXBlVGFibGUgPSB7IDEsIDAsIEpTVGVzdEludGVyZmFjZVBy
b3RvdHlwZVRhYmxlVmFsdWVzLCAwIH07CiBjb25zdCBDbGFzc0luZm8gSlNUZXN0SW50ZXJmYWNl
UHJvdG90eXBlOjpzX2luZm8gPSB7ICJUZXN0SW50ZXJmYWNlUHJvdG90eXBlIiwgMCwgJkpTVGVz
dEludGVyZmFjZVByb3RvdHlwZVRhYmxlLCAwIH07CiAKIEpTT2JqZWN0KiBKU1Rlc3RJbnRlcmZh
Y2VQcm90b3R5cGU6OnNlbGYoRXhlY1N0YXRlKiBleGVjLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFs
T2JqZWN0KQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvSlMvSlNUZXN0T2Jq
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9KUy9KU1Rl
c3RPYmouY3BwCShyZXZpc2lvbiA1OTYxOCkKKysrIFdlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90
ZXN0L0pTL0pTVGVzdE9iai5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTY2LDEzICs2Niw3IEBAIHN0
YXRpYyBjb25zdCBIYXNoVGFibGVWYWx1ZSBKU1Rlc3RPYmpUYWIKIH07CiAKICN1bmRlZiBUSFVO
S19HRU5FUkFUT1IKLXN0YXRpYyBKU0NfQ09OU1RfSEFTSFRBQkxFIEhhc2hUYWJsZSBKU1Rlc3RP
YmpUYWJsZSA9Ci0jaWYgRU5BQkxFKFBFUkZFQ1RfSEFTSF9TSVpFKQotICAgIHsgMTI3LCBKU1Rl
c3RPYmpUYWJsZVZhbHVlcywgMCB9OwotI2Vsc2UKLSAgICB7IDM0LCAzMSwgSlNUZXN0T2JqVGFi
bGVWYWx1ZXMsIDAgfTsKLSNlbmRpZgotCitzdGF0aWMgSlNDX0NPTlNUX0hBU0hUQUJMRSBIYXNo
VGFibGUgSlNUZXN0T2JqVGFibGUgPSB7IDM0LCAzMSwgSlNUZXN0T2JqVGFibGVWYWx1ZXMsIDAg
fTsKIC8qIEhhc2ggdGFibGUgZm9yIGNvbnN0cnVjdG9yICovCiAjaWYgRU5BQkxFKEpJVCkKICNk
ZWZpbmUgVEhVTktfR0VORVJBVE9SKGdlbmVyYXRvcikgLCBnZW5lcmF0b3IKQEAgLTg2LDEzICs4
MCw3IEBAIHN0YXRpYyBjb25zdCBIYXNoVGFibGVWYWx1ZSBKU1Rlc3RPYmpDb24KIH07CiAKICN1
bmRlZiBUSFVOS19HRU5FUkFUT1IKLXN0YXRpYyBKU0NfQ09OU1RfSEFTSFRBQkxFIEhhc2hUYWJs
ZSBKU1Rlc3RPYmpDb25zdHJ1Y3RvclRhYmxlID0KLSNpZiBFTkFCTEUoUEVSRkVDVF9IQVNIX1NJ
WkUpCi0gICAgeyAwLCBKU1Rlc3RPYmpDb25zdHJ1Y3RvclRhYmxlVmFsdWVzLCAwIH07Ci0jZWxz
ZQotICAgIHsgMSwgMCwgSlNUZXN0T2JqQ29uc3RydWN0b3JUYWJsZVZhbHVlcywgMCB9OwotI2Vu
ZGlmCi0KK3N0YXRpYyBKU0NfQ09OU1RfSEFTSFRBQkxFIEhhc2hUYWJsZSBKU1Rlc3RPYmpDb25z
dHJ1Y3RvclRhYmxlID0geyAxLCAwLCBKU1Rlc3RPYmpDb25zdHJ1Y3RvclRhYmxlVmFsdWVzLCAw
IH07CiBjbGFzcyBKU1Rlc3RPYmpDb25zdHJ1Y3RvciA6IHB1YmxpYyBET01Db25zdHJ1Y3Rvck9i
amVjdCB7CiBwdWJsaWM6CiAgICAgSlNUZXN0T2JqQ29uc3RydWN0b3IoRXhlY1N0YXRlKiBleGVj
LCBKU0RPTUdsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0KQpAQCAtMTY3LDEzICsxNTUsNyBAQCBz
dGF0aWMgY29uc3QgSGFzaFRhYmxlVmFsdWUgSlNUZXN0T2JqUHJvCiB9OwogCiAjdW5kZWYgVEhV
TktfR0VORVJBVE9SCi1zdGF0aWMgSlNDX0NPTlNUX0hBU0hUQUJMRSBIYXNoVGFibGUgSlNUZXN0
T2JqUHJvdG90eXBlVGFibGUgPQotI2lmIEVOQUJMRShQRVJGRUNUX0hBU0hfU0laRSkKLSAgICB7
IDgxOTEsIEpTVGVzdE9ialByb3RvdHlwZVRhYmxlVmFsdWVzLCAwIH07Ci0jZWxzZQotICAgIHsg
NjksIDYzLCBKU1Rlc3RPYmpQcm90b3R5cGVUYWJsZVZhbHVlcywgMCB9OwotI2VuZGlmCi0KK3N0
YXRpYyBKU0NfQ09OU1RfSEFTSFRBQkxFIEhhc2hUYWJsZSBKU1Rlc3RPYmpQcm90b3R5cGVUYWJs
ZSA9IHsgNjksIDYzLCBKU1Rlc3RPYmpQcm90b3R5cGVUYWJsZVZhbHVlcywgMCB9OwogY29uc3Qg
Q2xhc3NJbmZvIEpTVGVzdE9ialByb3RvdHlwZTo6c19pbmZvID0geyAiVGVzdE9ialByb3RvdHlw
ZSIsIDAsICZKU1Rlc3RPYmpQcm90b3R5cGVUYWJsZSwgMCB9OwogCiBKU09iamVjdCogSlNUZXN0
T2JqUHJvdG90eXBlOjpzZWxmKEV4ZWNTdGF0ZSogZXhlYywgSlNHbG9iYWxPYmplY3QqIGdsb2Jh
bE9iamVjdCkKQEAgLTkwMywxNCArODg1LDE0IEBAIEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBqc1Rl
c3RPYmpQcm90b3R5cGUKIAogSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGpzVGVzdE9ialByb3RvdHlw
ZUZ1bmN0aW9uT3ZlcmxvYWRlZE1ldGhvZChFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiwgSlNW
YWx1ZSB0aGlzVmFsdWUsIGNvbnN0IEFyZ0xpc3QmIGFyZ3MpCiB7Ci0gICAgaWYgKChhcmdzLnNp
emUoKSA9PSAyICYmIChhcmdzLmF0KDApLmlzTnVsbCgpIHx8IGFzT2JqZWN0KGFyZ3MuYXQoMCkp
LT5pbmhlcml0cyhKU1Rlc3RPYmo6OnNfaW5mbykgJiYgKGFyZ3MuYXQoMSkuaXNOdWxsKCkgfHwg
YXJncy5hdCgxKS5pc1VuZGVmaW5lZCgpIHx8IGFyZ3MuYXQoMSkuaXNTdHJpbmcoKSB8fCBhcmdz
LmF0KDEpLmlzT2JqZWN0KCkpKSkKLSAgICAgICAgcmV0dXJuIGpzVGVzdE9ialByb3RvdHlwZUZ1
bmN0aW9uT3ZlcmxvYWRlZE1ldGhvZDEoZXhlYywgdGhpc1ZhbHVlLCBhcmdzKTsKLSAgICBpZiAo
KGFyZ3Muc2l6ZSgpID09IDEgJiYgKGFyZ3MuYXQoMCkuaXNOdWxsKCkgfHwgYXNPYmplY3QoYXJn
cy5hdCgwKSktPmluaGVyaXRzKEpTVGVzdE9iajo6c19pbmZvKSkgfHwgKGFyZ3Muc2l6ZSgpID09
IDIgJiYgKGFyZ3MuYXQoMCkuaXNOdWxsKCkgfHwgYXNPYmplY3QoYXJncy5hdCgwKSktPmluaGVy
aXRzKEpTVGVzdE9iajo6c19pbmZvKSkpCi0gICAgICAgIHJldHVybiBqc1Rlc3RPYmpQcm90b3R5
cGVGdW5jdGlvbk92ZXJsb2FkZWRNZXRob2QyKGV4ZWMsIHRoaXNWYWx1ZSwgYXJncyk7CisgICAg
aWYgKChhcmdzLnNpemUoKSA9PSAyICYmIChhcmdzLmF0KDApLmlzTnVsbCgpIHx8IGFzT2JqZWN0
KGFyZ3MuYXQoMCkpLT5pbmhlcml0cygmSlNUZXN0T2JqOjpzX2luZm8pKSAmJiAoYXJncy5hdCgx
KS5pc051bGwoKSB8fCBhcmdzLmF0KDEpLmlzVW5kZWZpbmVkKCkgfHwgYXJncy5hdCgxKS5pc1N0
cmluZygpIHx8IGFyZ3MuYXQoMSkuaXNPYmplY3QoKSkpKQorICAgICAgICByZXR1cm4ganNUZXN0
T2JqUHJvdG90eXBlRnVuY3Rpb25PdmVybG9hZGVkTWV0aG9kMShleGVjLCAwLCB0aGlzVmFsdWUs
IGFyZ3MpOworICAgIGlmICgoYXJncy5zaXplKCkgPT0gMSAmJiAoYXJncy5hdCgwKS5pc051bGwo
KSB8fCBhc09iamVjdChhcmdzLmF0KDApKS0+aW5oZXJpdHMoJkpTVGVzdE9iajo6c19pbmZvKSkp
IHx8IChhcmdzLnNpemUoKSA9PSAyICYmIChhcmdzLmF0KDApLmlzTnVsbCgpIHx8IGFzT2JqZWN0
KGFyZ3MuYXQoMCkpLT5pbmhlcml0cygmSlNUZXN0T2JqOjpzX2luZm8pKSkpCisgICAgICAgIHJl
dHVybiBqc1Rlc3RPYmpQcm90b3R5cGVGdW5jdGlvbk92ZXJsb2FkZWRNZXRob2QyKGV4ZWMsIDAs
IHRoaXNWYWx1ZSwgYXJncyk7CiAgICAgaWYgKChhcmdzLnNpemUoKSA9PSAxICYmIChhcmdzLmF0
KDApLmlzTnVsbCgpIHx8IGFyZ3MuYXQoMCkuaXNVbmRlZmluZWQoKSB8fCBhcmdzLmF0KDApLmlz
U3RyaW5nKCkgfHwgYXJncy5hdCgwKS5pc09iamVjdCgpKSkpCi0gICAgICAgIHJldHVybiBqc1Rl
c3RPYmpQcm90b3R5cGVGdW5jdGlvbk92ZXJsb2FkZWRNZXRob2QzKGV4ZWMsIHRoaXNWYWx1ZSwg
YXJncyk7CisgICAgICAgIHJldHVybiBqc1Rlc3RPYmpQcm90b3R5cGVGdW5jdGlvbk92ZXJsb2Fk
ZWRNZXRob2QzKGV4ZWMsIDAsIHRoaXNWYWx1ZSwgYXJncyk7CiAgICAgaWYgKGFyZ3Muc2l6ZSgp
ID09IDEpCi0gICAgICAgIHJldHVybiBqc1Rlc3RPYmpQcm90b3R5cGVGdW5jdGlvbk92ZXJsb2Fk
ZWRNZXRob2Q0KGV4ZWMsIHRoaXNWYWx1ZSwgYXJncyk7CisgICAgICAgIHJldHVybiBqc1Rlc3RP
YmpQcm90b3R5cGVGdW5jdGlvbk92ZXJsb2FkZWRNZXRob2Q0KGV4ZWMsIDAsIHRoaXNWYWx1ZSwg
YXJncyk7CiAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVycm9yKTsKIH0KIApJbmRl
eDogV2ViQ29yZS9odG1sL0hUTUxDYW52YXNFbGVtZW50LmlkbAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL2h0bWwvSFRNTENhbnZhc0VsZW1lbnQuaWRsCShyZXZpc2lvbiA1OTYxOCkKKysrIFdlYkNv
cmUvaHRtbC9IVE1MQ2FudmFzRWxlbWVudC5pZGwJKHdvcmtpbmcgY29weSkKQEAgLTI2LDcgKzI2
LDggQEAKIG1vZHVsZSBodG1sIHsKIAogICAgIGludGVyZmFjZSBbCi0gICAgICAgIEN1c3RvbU1h
cmtGdW5jdGlvbgorICAgICAgICBDdXN0b21NYXJrRnVuY3Rpb24sCisgICAgICAgIEdlbmVyYXRl
TmF0aXZlQ29udmVydGVyCiAgICAgXSBIVE1MQ2FudmFzRWxlbWVudCA6IEhUTUxFbGVtZW50IHsK
IAogICAgICAgICBhdHRyaWJ1dGUgbG9uZyB3aWR0aDsKSW5kZXg6IFdlYkNvcmUvaHRtbC9IVE1M
SW1hZ2VFbGVtZW50LmlkbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2h0bWwvSFRNTEltYWdlRWxl
bWVudC5pZGwJKHJldmlzaW9uIDU5NjE4KQorKysgV2ViQ29yZS9odG1sL0hUTUxJbWFnZUVsZW1l
bnQuaWRsCSh3b3JraW5nIGNvcHkpCkBAIC0yMCw3ICsyMCw5IEBACiAKIG1vZHVsZSBodG1sIHsK
IAotICAgIGludGVyZmFjZSBIVE1MSW1hZ2VFbGVtZW50IDogSFRNTEVsZW1lbnQgeworICAgIGlu
dGVyZmFjZSBbCisgICAgICAgIEdlbmVyYXRlTmF0aXZlQ29udmVydGVyCisgICAgXSBIVE1MSW1h
Z2VFbGVtZW50IDogSFRNTEVsZW1lbnQgewogICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgW0Nv
bnZlcnROdWxsVG9OdWxsU3RyaW5nLCBSZWZsZWN0XSBET01TdHJpbmcgbmFtZTsKICAgICAgICAg
ICAgICAgICAgYXR0cmlidXRlIFtDb252ZXJ0TnVsbFRvTnVsbFN0cmluZywgUmVmbGVjdF0gRE9N
U3RyaW5nIGFsaWduOwogICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgW0NvbnZlcnROdWxsVG9O
dWxsU3RyaW5nLCBSZWZsZWN0XSBET01TdHJpbmcgYWx0OwpJbmRleDogV2ViQ29yZS9odG1sL0hU
TUxWaWRlb0VsZW1lbnQuaWRsCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaHRtbC9IVE1MVmlkZW9F
bGVtZW50LmlkbAkocmV2aXNpb24gNTk2MTgpCisrKyBXZWJDb3JlL2h0bWwvSFRNTFZpZGVvRWxl
bWVudC5pZGwJKHdvcmtpbmcgY29weSkKQEAgLTI0LDcgKzI0LDEwIEBACiAgKi8KIAogbW9kdWxl
IGh0bWwgewotICAgIGludGVyZmFjZSBbQ29uZGl0aW9uYWw9VklERU9dIEhUTUxWaWRlb0VsZW1l
bnQgOiBIVE1MTWVkaWFFbGVtZW50IHsKKyAgICBpbnRlcmZhY2UgWworICAgICAgICBDb25kaXRp
b25hbD1WSURFTywKKyAgICAgICAgR2VuZXJhdGVOYXRpdmVDb252ZXJ0ZXIKKyAgICBdIEhUTUxW
aWRlb0VsZW1lbnQgOiBIVE1MTWVkaWFFbGVtZW50IHsKICAgICAgICAgYXR0cmlidXRlIHVuc2ln
bmVkIGxvbmcgd2lkdGg7CiAgICAgICAgIGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGhlaWdodDsK
ICAgICAgICAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgdmlkZW9XaWR0aDsKSW5k
ZXg6IFdlYkNvcmUvaHRtbC9jYW52YXMvQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELmlkbAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL2h0bWwvY2FudmFzL0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5p
ZGwJKHJldmlzaW9uIDU5NjE4KQorKysgV2ViQ29yZS9odG1sL2NhbnZhcy9DYW52YXNSZW5kZXJp
bmdDb250ZXh0MkQuaWRsCSh3b3JraW5nIGNvcHkpCkBAIC05Nyw3ICs5Nyw2IEBAIG1vZHVsZSBo
dG1sIHsKIAogICAgICAgICB2b2lkIGNsZWFyU2hhZG93KCk7CiAKLSNpZiBkZWZpbmVkKFY4X0JJ
TkRJTkcpICYmIFY4X0JJTkRJTkcKICAgICAgICAgdm9pZCBmaWxsVGV4dChpbiBET01TdHJpbmcg
dGV4dCwgaW4gZmxvYXQgeCwgaW4gZmxvYXQgeSwgaW4gW09wdGlvbmFsXSBmbG9hdCBtYXhXaWR0
aCk7CiAgICAgICAgIHZvaWQgc3Ryb2tlVGV4dChpbiBET01TdHJpbmcgdGV4dCwgaW4gZmxvYXQg
eCwgaW4gZmxvYXQgeSwgaW4gW09wdGlvbmFsXSBmbG9hdCBtYXhXaWR0aCk7CiAKQEAgLTE1Miwy
MCArMTUxLDYgQEAgbW9kdWxlIGh0bWwgewogICAgICAgICAgICAgcmFpc2VzIChET01FeGNlcHRp
b24pOwogICAgICAgICBJbWFnZURhdGEgY3JlYXRlSW1hZ2VEYXRhKGluIGZsb2F0IHN3LCBpbiBm
bG9hdCBzaCkKICAgICAgICAgICAgIHJhaXNlcyAoRE9NRXhjZXB0aW9uKTsKLSNlbHNlCi0gICAg
ICAgIC8vIEZJWE1FOiBSZW1vdmUgJ2Vsc2UnIG9uY2UgSlNDIHN1cHBvcnRzIG92ZXJsb2FkcyB0
b28uCi0gICAgICAgIFtDdXN0b21dIHZvaWQgZmlsbFRleHQoLyogNCAqLyk7Ci0gICAgICAgIFtD
dXN0b21dIHZvaWQgc3Ryb2tlVGV4dCgvKiA0ICovKTsKLSAgICAgICAgW0N1c3RvbV0gdm9pZCBz
ZXRTdHJva2VDb2xvcigvKiAxICAqLyk7Ci0gICAgICAgIFtDdXN0b21dIHZvaWQgc2V0RmlsbENv
bG9yKC8qIDEgKi8pOwotICAgICAgICBbQ3VzdG9tXSB2b2lkIHN0cm9rZVJlY3QoLyogNCAqLyk7
Ci0gICAgICAgIFtDdXN0b21dIHZvaWQgZHJhd0ltYWdlKC8qIDMgKi8pOwotICAgICAgICBbQ3Vz
dG9tXSB2b2lkIGRyYXdJbWFnZUZyb21SZWN0KC8qIDEwICovKTsKLSAgICAgICAgW0N1c3RvbV0g
dm9pZCBzZXRTaGFkb3coLyogMyAqLyk7Ci0gICAgICAgIFtDdXN0b21dIHZvaWQgY3JlYXRlUGF0
dGVybigvKiAyICovKTsKLSAgICAgICAgW0N1c3RvbV0gdm9pZCBwdXRJbWFnZURhdGEoLyogaW4g
SW1hZ2VEYXRhIGltYWdlZGF0YSwgaW4gZmxvYXQgZHgsIGluIGZsb2F0IGR5IFssIGluIGZsb2F0
IGRpcnR5WCwgaW4gZmxvYXQgZGlydHlZLCBpbiBmbG9hdCBkaXJ0eVdpZHRoLCBpbiBmbG9hdCBk
aXJ0eUhlaWdodF0gKi8pOwotICAgICAgICBbQ3VzdG9tXSBJbWFnZURhdGEgY3JlYXRlSW1hZ2VE
YXRhKC8qIDMgKi8pOwotI2VuZGlmIC8vIGRlZmluZWQoVjhfQklORElORykKIAogICAgICAgICBh
dHRyaWJ1dGUgW0N1c3RvbV0gY3VzdG9tIHN0cm9rZVN0eWxlOwogICAgICAgICBhdHRyaWJ1dGUg
W0N1c3RvbV0gY3VzdG9tIGZpbGxTdHlsZTsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>56290</attachid>
            <date>2010-05-17 16:52:52 -0700</date>
            <delta_ts>2010-06-18 15:48:18 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-39243-20100517165251.patch</filename>
            <type>text/plain</type>
            <size>28895</size>
            <attacher name="Yaar Schnitman">yaar</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1OTYyNikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjQgQEAKKzIwMTAtMDUtMTcgIFlhYXIgU2Nobml0bWFuICA8eWFhckBjaHJvbWl1
bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
QXV0by1nZW5lcmF0ZSBDYW52YXMgb3ZlcmxvYWRzIGluIEpTQy4gU3VyZmFjZWQgbWlub3IgYnVn
cyBpbiB0aGUgb3ZlcmxvYWRlZCBhdXRvLWdlbmVyYXRpb24gY29kZS4KKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM5MjQzCisKKyAgICAgICAgQWxsIGxh
eW91dCB0ZXN0cyBwYXNzLgorCisgICAgICAgICogYmluZGluZ3MvanMvSlNDYW52YXNSZW5kZXJp
bmdDb250ZXh0MkRDdXN0b20uY3BwOiBSZW1vdmVkIGN1c3RvbSBjb2RlLgorICAgICAgICAqIGJp
bmRpbmdzL3NjcmlwdHMvQ29kZUdlbmVyYXRvckpTLnBtOiBGaXhlZCBzb21lIG1pbm9yIGJ1Z3Mu
CisgICAgICAgICogYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0pTL0pTVGVzdEludGVyZmFjZS5jcHA6
CisgICAgICAgIChXZWJDb3JlOjopOgorICAgICAgICAqIGJpbmRpbmdzL3NjcmlwdHMvdGVzdC9K
Uy9KU1Rlc3RPYmouY3BwOgorICAgICAgICAoV2ViQ29yZTo6KToKKyAgICAgICAgKFdlYkNvcmU6
OmpzVGVzdE9ialByb3RvdHlwZUZ1bmN0aW9uT3ZlcmxvYWRlZE1ldGhvZCk6CisgICAgICAgICog
aHRtbC9IVE1MQ2FudmFzRWxlbWVudC5pZGw6IFR1cm5lZCBvbiBuYXRpdmUgY29udmVyc2lvbiB0
aGF0J3MgbmVlZGVkIGluIGNhbnZhcyBtZXRob2RzLgorICAgICAgICAqIGh0bWwvSFRNTEltYWdl
RWxlbWVudC5pZGw6IFR1cm5lZCBvbiBuYXRpdmUgY29udmVyc2lvbiB0aGF0J3MgbmVlZGVkIGlu
IGNhbnZhcyBtZXRob2RzLgorICAgICAgICAqIGh0bWwvSFRNTFZpZGVvRWxlbWVudC5pZGw6IFR1
cm5lZCBvbiBuYXRpdmUgY29udmVyc2lvbiB0aGF0J3MgbmVlZGVkIGluIGNhbnZhcyBtZXRob2Rz
LgorICAgICAgICAqIGh0bWwvY2FudmFzL0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5pZGw6IFVu
Zm9ya2VkIFY4L0pTQyBkZWNsYXJhdGlvbiBzcGxpdC4KKwogMjAxMC0wNS0xNyAgUm9iZXJ0IEhv
Z2FuICA8cm9iZXJ0QHdlYmtpdC5vcmc+CiAKICAgICAgICAgUnViYmVyLXN0YW1wZWQgYnkgRXJp
YyBTZWlkZWwuCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL2pzL0pTQ2FudmFzUmVuZGVyaW5nQ29u
dGV4dDJEQ3VzdG9tLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL2pzL0pTQ2Fu
dmFzUmVuZGVyaW5nQ29udGV4dDJEQ3VzdG9tLmNwcAkocmV2aXNpb24gNTk2MTgpCisrKyBXZWJD
b3JlL2JpbmRpbmdzL2pzL0pTQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEQ3VzdG9tLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtODksMzQ4ICs4OSw0IEBAIHZvaWQgSlNDYW52YXNSZW5kZXJpbmdDb250
ZXh0MkQ6OnNldEZpbGwKICAgICBjb250ZXh0LT5zZXRGaWxsU3R5bGUodG9IVE1MQ2FudmFzU3R5
bGUoZXhlYywgdmFsdWUpKTsKIH0KIAotSlNWYWx1ZSBKU0NhbnZhc1JlbmRlcmluZ0NvbnRleHQy
RDo6c2V0RmlsbENvbG9yKEV4ZWNTdGF0ZSogZXhlYywgY29uc3QgQXJnTGlzdCYgYXJncykKLXsK
LSAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxDYW52
YXNSZW5kZXJpbmdDb250ZXh0MkQqPihpbXBsKCkpOwotCi0gICAgLy8gc3RyaW5nIGFyZyA9IG5h
bWVkIGNvbG9yCi0gICAgLy8gbnVtYmVyIGFyZyA9IGdyYXkgY29sb3IKLSAgICAvLyBzdHJpbmcg
YXJnLCBudW1iZXIgYXJnID0gbmFtZWQgY29sb3IsIGFscGhhCi0gICAgLy8gbnVtYmVyIGFyZywg
bnVtYmVyIGFyZyA9IGdyYXkgY29sb3IsIGFscGhhCi0gICAgLy8gNCBhcmdzID0gciwgZywgYiwg
YQotICAgIC8vIDUgYXJncyA9IGMsIG0sIHksIGssIGEKLSAgICBzd2l0Y2ggKGFyZ3Muc2l6ZSgp
KSB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGlmIChhcmdzLmF0KDApLmlzU3RyaW5n
KCkpCi0gICAgICAgICAgICAgICAgY29udGV4dC0+c2V0RmlsbENvbG9yKHVzdHJpbmdUb1N0cmlu
Zyhhc1N0cmluZyhhcmdzLmF0KDApKS0+dmFsdWUoZXhlYykpKTsKLSAgICAgICAgICAgIGVsc2UK
LSAgICAgICAgICAgICAgICBjb250ZXh0LT5zZXRGaWxsQ29sb3IoYXJncy5hdCgwKS50b0Zsb2F0
KGV4ZWMpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAg
ICBpZiAoYXJncy5hdCgwKS5pc1N0cmluZygpKQotICAgICAgICAgICAgICAgIGNvbnRleHQtPnNl
dEZpbGxDb2xvcih1c3RyaW5nVG9TdHJpbmcoYXNTdHJpbmcoYXJncy5hdCgwKSktPnZhbHVlKGV4
ZWMpKSwgYXJncy5hdCgxKS50b0Zsb2F0KGV4ZWMpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAg
ICAgICAgICAgICBjb250ZXh0LT5zZXRGaWxsQ29sb3IoYXJncy5hdCgwKS50b0Zsb2F0KGV4ZWMp
LCBhcmdzLmF0KDEpLnRvRmxvYXQoZXhlYykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IGNhc2UgNDoKLSAgICAgICAgICAgIGNvbnRleHQtPnNldEZpbGxDb2xvcihhcmdzLmF0KDApLnRv
RmxvYXQoZXhlYyksIGFyZ3MuYXQoMSkudG9GbG9hdChleGVjKSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBhcmdzLmF0KDIpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMykudG9G
bG9hdChleGVjKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1OgotICAgICAg
ICAgICAgY29udGV4dC0+c2V0RmlsbENvbG9yKGFyZ3MuYXQoMCkudG9GbG9hdChleGVjKSwgYXJn
cy5hdCgxKS50b0Zsb2F0KGV4ZWMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGFyZ3MuYXQoMikudG9GbG9hdChleGVjKSwgYXJncy5hdCgzKS50b0Zsb2F0KGV4ZWMpLCBhcmdz
LmF0KDQpLnRvRmxvYXQoZXhlYykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1
bHQ6Ci0gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBTeW50YXhFcnJvcik7Ci0g
ICAgfQotICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOwotfSAgICAKLQotSlNWYWx1ZSBKU0NhbnZh
c1JlbmRlcmluZ0NvbnRleHQyRDo6c2V0U3Ryb2tlQ29sb3IoRXhlY1N0YXRlKiBleGVjLCBjb25z
dCBBcmdMaXN0JiBhcmdzKQoteyAKLSAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNvbnRl
eHQgPSBzdGF0aWNfY2FzdDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqPihpbXBsKCkpOwotCi0g
ICAgLy8gc3RyaW5nIGFyZyA9IG5hbWVkIGNvbG9yCi0gICAgLy8gbnVtYmVyIGFyZyA9IGdyYXkg
Y29sb3IKLSAgICAvLyBzdHJpbmcgYXJnLCBudW1iZXIgYXJnID0gbmFtZWQgY29sb3IsIGFscGhh
Ci0gICAgLy8gbnVtYmVyIGFyZywgbnVtYmVyIGFyZyA9IGdyYXkgY29sb3IsIGFscGhhCi0gICAg
Ly8gNCBhcmdzID0gciwgZywgYiwgYQotICAgIC8vIDUgYXJncyA9IGMsIG0sIHksIGssIGEKLSAg
ICBzd2l0Y2ggKGFyZ3Muc2l6ZSgpKSB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGlm
IChhcmdzLmF0KDApLmlzU3RyaW5nKCkpCi0gICAgICAgICAgICAgICAgY29udGV4dC0+c2V0U3Ry
b2tlQ29sb3IodXN0cmluZ1RvU3RyaW5nKGFzU3RyaW5nKGFyZ3MuYXQoMCkpLT52YWx1ZShleGVj
KSkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNvbnRleHQtPnNldFN0cm9r
ZUNvbG9yKGFyZ3MuYXQoMCkudG9GbG9hdChleGVjKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgY2FzZSAyOgotICAgICAgICAgICAgaWYgKGFyZ3MuYXQoMCkuaXNTdHJpbmcoKSkKLSAg
ICAgICAgICAgICAgICBjb250ZXh0LT5zZXRTdHJva2VDb2xvcih1c3RyaW5nVG9TdHJpbmcoYXNT
dHJpbmcoYXJncy5hdCgwKSktPnZhbHVlKGV4ZWMpKSwgYXJncy5hdCgxKS50b0Zsb2F0KGV4ZWMp
KTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjb250ZXh0LT5zZXRTdHJva2VD
b2xvcihhcmdzLmF0KDApLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMSkudG9GbG9hdChleGVjKSk7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgY29udGV4
dC0+c2V0U3Ryb2tlQ29sb3IoYXJncy5hdCgwKS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDEpLnRv
RmxvYXQoZXhlYyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmF0
KDIpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMykudG9GbG9hdChleGVjKSk7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgY29udGV4dC0+c2V0U3Ryb2tl
Q29sb3IoYXJncy5hdCgwKS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDEpLnRvRmxvYXQoZXhlYyks
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmF0KDIpLnRvRmxvYXQo
ZXhlYyksIGFyZ3MuYXQoMykudG9GbG9hdChleGVjKSwgYXJncy5hdCg0KS50b0Zsb2F0KGV4ZWMp
KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0
dXJuIHRocm93RXJyb3IoZXhlYywgU3ludGF4RXJyb3IpOwotICAgIH0KLSAgICAKLSAgICByZXR1
cm4ganNVbmRlZmluZWQoKTsKLX0KLQotSlNWYWx1ZSBKU0NhbnZhc1JlbmRlcmluZ0NvbnRleHQy
RDo6c3Ryb2tlUmVjdChFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IEFyZ0xpc3QmIGFyZ3MpCi17IAot
ICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCogY29udGV4dCA9IHN0YXRpY19jYXN0PENhbnZh
c1JlbmRlcmluZ0NvbnRleHQyRCo+KGltcGwoKSk7Ci0gICAgCi0gICAgaWYgKGFyZ3Muc2l6ZSgp
IDw9IDQpCi0gICAgICAgIGNvbnRleHQtPnN0cm9rZVJlY3QoYXJncy5hdCgwKS50b0Zsb2F0KGV4
ZWMpLCBhcmdzLmF0KDEpLnRvRmxvYXQoZXhlYyksCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgYXJncy5hdCgyKS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDMpLnRvRmxvYXQoZXhlYykpOwot
ICAgIGVsc2UKLSAgICAgICAgY29udGV4dC0+c3Ryb2tlUmVjdChhcmdzLmF0KDApLnRvRmxvYXQo
ZXhlYyksIGFyZ3MuYXQoMSkudG9GbG9hdChleGVjKSwKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBhcmdzLmF0KDIpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMykudG9GbG9hdChleGVjKSwg
YXJncy5hdCg0KS50b0Zsb2F0KGV4ZWMpKTsKLQotICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOyAg
ICAKLX0KLQotSlNWYWx1ZSBKU0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDo6ZHJhd0ltYWdlKEV4
ZWNTdGF0ZSogZXhlYywgY29uc3QgQXJnTGlzdCYgYXJncykKLXsgCi0gICAgQ2FudmFzUmVuZGVy
aW5nQ29udGV4dDJEKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q2FudmFzUmVuZGVyaW5nQ29udGV4
dDJEKj4oaW1wbCgpKTsKLQotICAgIC8vIERyYXdJbWFnZSBoYXMgdGhyZWUgdmFyaWFudHM6Ci0g
ICAgLy8gICAgIGRyYXdJbWFnZShpbWcsIGR4LCBkeSkKLSAgICAvLyAgICAgZHJhd0ltYWdlKGlt
ZywgZHgsIGR5LCBkdywgZGgpCi0gICAgLy8gICAgIGRyYXdJbWFnZShpbWcsIHN4LCBzeSwgc3cs
IHNoLCBkeCwgZHksIGR3LCBkaCkKLSAgICAvLyBDb21wb3NpdGUgb3BlcmF0aW9uIGlzIHNwZWNp
ZmllZCB3aXRoIGdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbi4KLSAgICAvLyBUaGUgaW1nIHBhcmFt
ZXRlciBjYW4gYmUgYSA8aW1nPiBvciA8Y2FudmFzPiBlbGVtZW50LgotICAgIEpTVmFsdWUgdmFs
dWUgPSBhcmdzLmF0KDApOwotICAgIGlmICghdmFsdWUuaXNPYmplY3QoKSkKLSAgICAgICAgcmV0
dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVycm9yKTsKLSAgICBKU09iamVjdCogbyA9IGFzT2Jq
ZWN0KHZhbHVlKTsKLSAgICAKLSAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBpZiAoby0+
aW5oZXJpdHMoJkpTSFRNTEltYWdlRWxlbWVudDo6c19pbmZvKSkgewotICAgICAgICBIVE1MSW1h
Z2VFbGVtZW50KiBpbWdFbHQgPSBzdGF0aWNfY2FzdDxIVE1MSW1hZ2VFbGVtZW50Kj4oc3RhdGlj
X2Nhc3Q8SlNIVE1MRWxlbWVudCo+KG8pLT5pbXBsKCkpOwotICAgICAgICBzd2l0Y2ggKGFyZ3Mu
c2l6ZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgY29udGV4dC0+
ZHJhd0ltYWdlKGltZ0VsdCwgYXJncy5hdCgxKS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDIpLnRv
RmxvYXQoZXhlYyksIGVjKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNh
c2UgNToKLSAgICAgICAgICAgICAgICBjb250ZXh0LT5kcmF3SW1hZ2UoaW1nRWx0LCBhcmdzLmF0
KDEpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMikudG9GbG9hdChleGVjKSwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5hdCgzKS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0
KDQpLnRvRmxvYXQoZXhlYyksIGVjKTsKLSAgICAgICAgICAgICAgICBzZXRET01FeGNlcHRpb24o
ZXhlYywgZWMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA5Ogot
ICAgICAgICAgICAgICAgIGNvbnRleHQtPmRyYXdJbWFnZShpbWdFbHQsIEZsb2F0UmVjdChhcmdz
LmF0KDEpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMikudG9GbG9hdChleGVjKSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5hdCgzKS50b0Zsb2F0KGV4ZWMpLCBhcmdz
LmF0KDQpLnRvRmxvYXQoZXhlYykpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBGbG9hdFJlY3QoYXJncy5hdCg1KS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDYpLnRvRmxvYXQo
ZXhlYyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuYXQoNykudG9G
bG9hdChleGVjKSwgYXJncy5hdCg4KS50b0Zsb2F0KGV4ZWMpKSwgZWMpOwotICAgICAgICAgICAg
ICAgIHNldERPTUV4Y2VwdGlvbihleGVjLCBlYyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4
ZWMsIFN5bnRheEVycm9yKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoby0+aW5oZXJpdHMo
JkpTSFRNTENhbnZhc0VsZW1lbnQ6OnNfaW5mbykpIHsKLSAgICAgICAgSFRNTENhbnZhc0VsZW1l
bnQqIGNhbnZhcyA9IHN0YXRpY19jYXN0PEhUTUxDYW52YXNFbGVtZW50Kj4oc3RhdGljX2Nhc3Q8
SlNIVE1MRWxlbWVudCo+KG8pLT5pbXBsKCkpOwotICAgICAgICBzd2l0Y2ggKGFyZ3Muc2l6ZSgp
KSB7Ci0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgY29udGV4dC0+ZHJhd0lt
YWdlKGNhbnZhcywgYXJncy5hdCgxKS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDIpLnRvRmxvYXQo
ZXhlYyksIGVjKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNToK
LSAgICAgICAgICAgICAgICBjb250ZXh0LT5kcmF3SW1hZ2UoY2FudmFzLCBhcmdzLmF0KDEpLnRv
RmxvYXQoZXhlYyksIGFyZ3MuYXQoMikudG9GbG9hdChleGVjKSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYXJncy5hdCgzKS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDQpLnRv
RmxvYXQoZXhlYyksIGVjKTsKLSAgICAgICAgICAgICAgICBzZXRET01FeGNlcHRpb24oZXhlYywg
ZWMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA5OgotICAgICAg
ICAgICAgICAgIGNvbnRleHQtPmRyYXdJbWFnZShjYW52YXMsIEZsb2F0UmVjdChhcmdzLmF0KDEp
LnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMikudG9GbG9hdChleGVjKSwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYXJncy5hdCgzKS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDQp
LnRvRmxvYXQoZXhlYykpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG9h
dFJlY3QoYXJncy5hdCg1KS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDYpLnRvRmxvYXQoZXhlYyks
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuYXQoNykudG9GbG9hdChl
eGVjKSwgYXJncy5hdCg4KS50b0Zsb2F0KGV4ZWMpKSwgZWMpOwotICAgICAgICAgICAgICAgIHNl
dERPTUV4Y2VwdGlvbihleGVjLCBlYyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFN5
bnRheEVycm9yKTsKLSAgICAgICAgfQotI2lmIEVOQUJMRShWSURFTykKLSAgICB9IGVsc2UgaWYg
KG8tPmluaGVyaXRzKCZKU0hUTUxWaWRlb0VsZW1lbnQ6OnNfaW5mbykpIHsKLSAgICAgICAgICAg
IEhUTUxWaWRlb0VsZW1lbnQqIHZpZGVvID0gc3RhdGljX2Nhc3Q8SFRNTFZpZGVvRWxlbWVudCo+
KHN0YXRpY19jYXN0PEpTSFRNTEVsZW1lbnQqPihvKS0+aW1wbCgpKTsKLSAgICAgICAgICAgIHN3
aXRjaCAoYXJncy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAg
ICAgICAgICAgIGNvbnRleHQtPmRyYXdJbWFnZSh2aWRlbywgYXJncy5hdCgxKS50b0Zsb2F0KGV4
ZWMpLCBhcmdzLmF0KDIpLnRvRmxvYXQoZXhlYyksIGVjKTsKLSAgICAgICAgICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgICAgICBjb250
ZXh0LT5kcmF3SW1hZ2UodmlkZW8sIGFyZ3MuYXQoMSkudG9GbG9hdChleGVjKSwgYXJncy5hdCgy
KS50b0Zsb2F0KGV4ZWMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
YXJncy5hdCgzKS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDQpLnRvRmxvYXQoZXhlYyksIGVjKTsK
LSAgICAgICAgICAgICAgICAgICAgc2V0RE9NRXhjZXB0aW9uKGV4ZWMsIGVjKTsKLSAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAg
ICAgICAgICBjb250ZXh0LT5kcmF3SW1hZ2UodmlkZW8sIEZsb2F0UmVjdChhcmdzLmF0KDEpLnRv
RmxvYXQoZXhlYyksIGFyZ3MuYXQoMikudG9GbG9hdChleGVjKSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuYXQoMykudG9GbG9hdChleGVjKSwgYXJncy5hdCg0
KS50b0Zsb2F0KGV4ZWMpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IEZsb2F0UmVjdChhcmdzLmF0KDUpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoNikudG9GbG9hdChl
eGVjKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuYXQoNyku
dG9GbG9hdChleGVjKSwgYXJncy5hdCg4KS50b0Zsb2F0KGV4ZWMpKSwgZWMpOwotICAgICAgICAg
ICAgICAgICAgICBzZXRET01FeGNlcHRpb24oZXhlYywgZWMpOwotICAgICAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gdGhyb3dFcnJvcihleGVjLCBTeW50YXhFcnJvcik7Ci0gICAgICAgIH0KLSNlbmRpZgot
ICAgIH0gZWxzZSB7Ci0gICAgICAgIHNldERPTUV4Y2VwdGlvbihleGVjLCBUWVBFX01JU01BVENI
X0VSUik7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOyAgICAKLX0KLQot
SlNWYWx1ZSBKU0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDo6ZHJhd0ltYWdlRnJvbVJlY3QoRXhl
Y1N0YXRlKiBleGVjLCBjb25zdCBBcmdMaXN0JiBhcmdzKQoteyAKLSAgICBDYW52YXNSZW5kZXJp
bmdDb250ZXh0MkQqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxDYW52YXNSZW5kZXJpbmdDb250ZXh0
MkQqPihpbXBsKCkpOwotICAgIAotICAgIEpTVmFsdWUgdmFsdWUgPSBhcmdzLmF0KDApOwotICAg
IGlmICghdmFsdWUuaXNPYmplY3QoKSkKLSAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywg
VHlwZUVycm9yKTsKLSAgICBKU09iamVjdCogbyA9IGFzT2JqZWN0KHZhbHVlKTsKLSAgICAKLSAg
ICBpZiAoIW8tPmluaGVyaXRzKCZKU0hUTUxJbWFnZUVsZW1lbnQ6OnNfaW5mbykpCi0gICAgICAg
IHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFR5cGVFcnJvcik7Ci0gICAgY29udGV4dC0+ZHJhd0lt
YWdlRnJvbVJlY3Qoc3RhdGljX2Nhc3Q8SFRNTEltYWdlRWxlbWVudCo+KHN0YXRpY19jYXN0PEpT
SFRNTEVsZW1lbnQqPihvKS0+aW1wbCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBhcmdzLmF0KDEpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMikudG9GbG9hdChleGVjKSwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmF0KDMpLnRvRmxvYXQoZXhlYyksIGFy
Z3MuYXQoNCkudG9GbG9hdChleGVjKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBh
cmdzLmF0KDUpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoNikudG9GbG9hdChleGVjKSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmF0KDcpLnRvRmxvYXQoZXhlYyksIGFyZ3Mu
YXQoOCkudG9GbG9hdChleGVjKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c3Ry
aW5nVG9TdHJpbmcoYXJncy5hdCg5KS50b1N0cmluZyhleGVjKSkpOyAgICAKLSAgICByZXR1cm4g
anNVbmRlZmluZWQoKTsgICAgCi19Ci0KLUpTVmFsdWUgSlNDYW52YXNSZW5kZXJpbmdDb250ZXh0
MkQ6OnNldFNoYWRvdyhFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IEFyZ0xpc3QmIGFyZ3MpCi17IAot
ICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCogY29udGV4dCA9IHN0YXRpY19jYXN0PENhbnZh
c1JlbmRlcmluZ0NvbnRleHQyRCo+KGltcGwoKSk7Ci0KLSAgICBzd2l0Y2ggKGFyZ3Muc2l6ZSgp
KSB7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGNvbnRleHQtPnNldFNoYWRvdyhhcmdz
LmF0KDApLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMSkudG9GbG9hdChleGVjKSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmF0KDIpLnRvRmxvYXQoZXhlYykpOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGlmIChhcmdzLmF0KDMp
LmlzU3RyaW5nKCkpCi0gICAgICAgICAgICAgICAgY29udGV4dC0+c2V0U2hhZG93KGFyZ3MuYXQo
MCkudG9GbG9hdChleGVjKSwgYXJncy5hdCgxKS50b0Zsb2F0KGV4ZWMpLAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmF0KDIpLnRvRmxvYXQoZXhlYyksIHVzdHJpbmdU
b1N0cmluZyhhc1N0cmluZyhhcmdzLmF0KDMpKS0+dmFsdWUoZXhlYykpKTsKLSAgICAgICAgICAg
IGVsc2UKLSAgICAgICAgICAgICAgICBjb250ZXh0LT5zZXRTaGFkb3coYXJncy5hdCgwKS50b0Zs
b2F0KGV4ZWMpLCBhcmdzLmF0KDEpLnRvRmxvYXQoZXhlYyksCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGFyZ3MuYXQoMikudG9GbG9hdChleGVjKSwgYXJncy5hdCgzKS50b0Zs
b2F0KGV4ZWMpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU6Ci0gICAgICAg
ICAgICBpZiAoYXJncy5hdCgzKS5pc1N0cmluZygpKQotICAgICAgICAgICAgICAgIGNvbnRleHQt
PnNldFNoYWRvdyhhcmdzLmF0KDApLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMSkudG9GbG9hdChl
eGVjKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5hdCgyKS50b0Zs
b2F0KGV4ZWMpLCB1c3RyaW5nVG9TdHJpbmcoYXNTdHJpbmcoYXJncy5hdCgzKSktPnZhbHVlKGV4
ZWMpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5hdCg0KS50b0Zs
b2F0KGV4ZWMpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjb250ZXh0LT5z
ZXRTaGFkb3coYXJncy5hdCgwKS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDEpLnRvRmxvYXQoZXhl
YyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuYXQoMikudG9GbG9h
dChleGVjKSwgYXJncy5hdCgzKS50b0Zsb2F0KGV4ZWMpLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBhcmdzLmF0KDQpLnRvRmxvYXQoZXhlYykpOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgIGNvbnRleHQtPnNldFNoYWRvdyhhcmdz
LmF0KDApLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMSkudG9GbG9hdChleGVjKSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmF0KDIpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQo
MykudG9GbG9hdChleGVjKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmF0
KDQpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoNSkudG9GbG9hdChleGVjKSwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBhcmdzLmF0KDYpLnRvRmxvYXQoZXhlYykpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIGNvbnRleHQtPnNldFNoYWRv
dyhhcmdzLmF0KDApLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMSkudG9GbG9hdChleGVjKSwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmF0KDIpLnRvRmxvYXQoZXhlYyksIGFy
Z3MuYXQoMykudG9GbG9hdChleGVjKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBh
cmdzLmF0KDQpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoNSkudG9GbG9hdChleGVjKSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmF0KDYpLnRvRmxvYXQoZXhlYyksIGFyZ3Mu
YXQoNykudG9GbG9hdChleGVjKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVs
dDoKLSAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFN5bnRheEVycm9yKTsKLSAg
ICB9Ci0gICAgCi0gICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7ICAgIAotfQotCi1KU1ZhbHVlIEpT
Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEOjpjcmVhdGVQYXR0ZXJuKEV4ZWNTdGF0ZSogZXhlYywg
Y29uc3QgQXJnTGlzdCYgYXJncykKLXsgCi0gICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBj
b250ZXh0ID0gc3RhdGljX2Nhc3Q8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKj4oaW1wbCgpKTsK
LQotICAgIEpTVmFsdWUgdmFsdWUgPSBhcmdzLmF0KDApOwotICAgIGlmICghdmFsdWUuaXNPYmpl
Y3QoKSkKLSAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVycm9yKTsKLSAgICBK
U09iamVjdCogbyA9IGFzT2JqZWN0KHZhbHVlKTsKLQotICAgIGlmIChvLT5pbmhlcml0cygmSlNI
VE1MSW1hZ2VFbGVtZW50OjpzX2luZm8pKSB7Ci0gICAgICAgIEV4Y2VwdGlvbkNvZGUgZWM7Ci0g
ICAgICAgIEpTVmFsdWUgcGF0dGVybiA9IHRvSlMoZXhlYywKLSAgICAgICAgICAgIGNvbnRleHQt
PmNyZWF0ZVBhdHRlcm4oc3RhdGljX2Nhc3Q8SFRNTEltYWdlRWxlbWVudCo+KHN0YXRpY19jYXN0
PEpTSFRNTEVsZW1lbnQqPihvKS0+aW1wbCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdmFsdWVUb1N0cmluZ1dpdGhOdWxsQ2hlY2soZXhlYywgYXJncy5hdCgxKSksIGVj
KS5nZXQoKSk7Ci0gICAgICAgIHNldERPTUV4Y2VwdGlvbihleGVjLCBlYyk7Ci0gICAgICAgIHJl
dHVybiBwYXR0ZXJuOwotICAgIH0KLSAgICBpZiAoby0+aW5oZXJpdHMoJkpTSFRNTENhbnZhc0Vs
ZW1lbnQ6OnNfaW5mbykpIHsKLSAgICAgICAgRXhjZXB0aW9uQ29kZSBlYzsKLSAgICAgICAgSlNW
YWx1ZSBwYXR0ZXJuID0gdG9KUyhleGVjLAotICAgICAgICAgICAgY29udGV4dC0+Y3JlYXRlUGF0
dGVybihzdGF0aWNfY2FzdDxIVE1MQ2FudmFzRWxlbWVudCo+KHN0YXRpY19jYXN0PEpTSFRNTEVs
ZW1lbnQqPihvKS0+aW1wbCgpKSwKLSAgICAgICAgICAgICAgICB2YWx1ZVRvU3RyaW5nV2l0aE51
bGxDaGVjayhleGVjLCBhcmdzLmF0KDEpKSwgZWMpLmdldCgpKTsKLSAgICAgICAgc2V0RE9NRXhj
ZXB0aW9uKGV4ZWMsIGVjKTsKLSAgICAgICAgcmV0dXJuIHBhdHRlcm47Ci0gICAgfQotICAgIHNl
dERPTUV4Y2VwdGlvbihleGVjLCBUWVBFX01JU01BVENIX0VSUik7Ci0gICAgcmV0dXJuIGpzVW5k
ZWZpbmVkKCk7Ci19Ci0KLUpTVmFsdWUgSlNDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ6OmNyZWF0
ZUltYWdlRGF0YShFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IEFyZ0xpc3QmIGFyZ3MpCi17Ci0gICAg
Ly8gY3JlYXRlSW1hZ2VEYXRhIGhhcyB0d28gdmFyaWFudHMKLSAgICAvLyBjcmVhdGVJbWFnZURh
dGEoSW1hZ2VEYXRhKQotICAgIC8vIGNyZWF0ZUltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0KQotICAg
IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCogY29udGV4dCA9IHN0YXRpY19jYXN0PENhbnZhc1Jl
bmRlcmluZ0NvbnRleHQyRCo+KGltcGwoKSk7Ci0gICAgUmVmUHRyPEltYWdlRGF0YT4gaW1hZ2VE
YXRhID0gMDsKLQotICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgIGlmIChhcmdzLnNpemUo
KSA9PSAxKQotICAgICAgICBpbWFnZURhdGEgPSBjb250ZXh0LT5jcmVhdGVJbWFnZURhdGEodG9J
bWFnZURhdGEoYXJncy5hdCgwKSksIGVjKTsKLSAgICBlbHNlIGlmIChhcmdzLnNpemUoKSA9PSAy
KQotICAgICAgICBpbWFnZURhdGEgPSBjb250ZXh0LT5jcmVhdGVJbWFnZURhdGEoYXJncy5hdCgw
KS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDEpLnRvRmxvYXQoZXhlYyksIGVjKTsKLQotICAgIHNl
dERPTUV4Y2VwdGlvbihleGVjLCBlYyk7Ci0gICAgcmV0dXJuIHRvSlMoZXhlYywgZ2xvYmFsT2Jq
ZWN0KCksIFdURjo6Z2V0UHRyKGltYWdlRGF0YSkpOwotfQotCi1KU1ZhbHVlIEpTQ2FudmFzUmVu
ZGVyaW5nQ29udGV4dDJEOjpwdXRJbWFnZURhdGEoRXhlY1N0YXRlKiBleGVjLCBjb25zdCBBcmdM
aXN0JiBhcmdzKQotewotICAgIC8vIHB1dEltYWdlRGF0YSBoYXMgdHdvIHZhcmlhbnRzCi0gICAg
Ly8gcHV0SW1hZ2VEYXRhKEltYWdlRGF0YSwgeCwgeSkKLSAgICAvLyBwdXRJbWFnZURhdGEoSW1h
Z2VEYXRhLCB4LCB5LCBkaXJ0eVgsIGRpcnR5WSwgZGlydHlXaWR0aCwgZGlydHlIZWlnaHQpCi0g
ICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q2FudmFz
UmVuZGVyaW5nQ29udGV4dDJEKj4oaW1wbCgpKTsKLQotICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAw
OwotICAgIGlmIChhcmdzLnNpemUoKSA+PSA3KQotICAgICAgICBjb250ZXh0LT5wdXRJbWFnZURh
dGEodG9JbWFnZURhdGEoYXJncy5hdCgwKSksIGFyZ3MuYXQoMSkudG9GbG9hdChleGVjKSwgYXJn
cy5hdCgyKS50b0Zsb2F0KGV4ZWMpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFy
Z3MuYXQoMykudG9GbG9hdChleGVjKSwgYXJncy5hdCg0KS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0
KDUpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoNikudG9GbG9hdChleGVjKSwgZWMpOwotICAgIGVs
c2UKLSAgICAgICAgY29udGV4dC0+cHV0SW1hZ2VEYXRhKHRvSW1hZ2VEYXRhKGFyZ3MuYXQoMCkp
LCBhcmdzLmF0KDEpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMikudG9GbG9hdChleGVjKSwgZWMp
OwotCi0gICAgc2V0RE9NRXhjZXB0aW9uKGV4ZWMsIGVjKTsKLSAgICByZXR1cm4ganNVbmRlZmlu
ZWQoKTsKLX0KLQotSlNWYWx1ZSBKU0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDo6ZmlsbFRleHQo
RXhlY1N0YXRlKiBleGVjLCBjb25zdCBBcmdMaXN0JiBhcmdzKQoteyAKLSAgICBDYW52YXNSZW5k
ZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxDYW52YXNSZW5kZXJpbmdDb250
ZXh0MkQqPihpbXBsKCkpOwotCi0gICAgLy8gc3RyaW5nIGFyZyA9IHRleHQgdG8gZHJhdwotICAg
IC8vIG51bWJlciBhcmcgPSB4Ci0gICAgLy8gbnVtYmVyIGFyZyA9IHkKLSAgICAvLyBvcHRpb25h
bCBudW1iZXIgYXJnID0gbWF4V2lkdGgKLSAgICBpZiAoYXJncy5zaXplKCkgPCAzIHx8IGFyZ3Mu
c2l6ZSgpID4gNCkKLSAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgU3ludGF4RXJyb3Ip
OwotICAgIAotICAgIGlmIChhcmdzLnNpemUoKSA9PSA0KQotICAgICAgICBjb250ZXh0LT5maWxs
VGV4dCh1c3RyaW5nVG9TdHJpbmcoYXJncy5hdCgwKS50b1N0cmluZyhleGVjKSksIGFyZ3MuYXQo
MSkudG9GbG9hdChleGVjKSwgYXJncy5hdCgyKS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDMpLnRv
RmxvYXQoZXhlYykpOwotICAgIGVsc2UKLSAgICAgICAgY29udGV4dC0+ZmlsbFRleHQodXN0cmlu
Z1RvU3RyaW5nKGFyZ3MuYXQoMCkudG9TdHJpbmcoZXhlYykpLCBhcmdzLmF0KDEpLnRvRmxvYXQo
ZXhlYyksIGFyZ3MuYXQoMikudG9GbG9hdChleGVjKSk7Ci0gICAgcmV0dXJuIGpzVW5kZWZpbmVk
KCk7Ci19Ci0KLUpTVmFsdWUgSlNDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ6OnN0cm9rZVRleHQo
RXhlY1N0YXRlKiBleGVjLCBjb25zdCBBcmdMaXN0JiBhcmdzKQoteyAKLSAgICBDYW52YXNSZW5k
ZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxDYW52YXNSZW5kZXJpbmdDb250
ZXh0MkQqPihpbXBsKCkpOwotCi0gICAgLy8gc3RyaW5nIGFyZyA9IHRleHQgdG8gZHJhdwotICAg
IC8vIG51bWJlciBhcmcgPSB4Ci0gICAgLy8gbnVtYmVyIGFyZyA9IHkKLSAgICAvLyBvcHRpb25h
bCBudW1iZXIgYXJnID0gbWF4V2lkdGgKLSAgICBpZiAoYXJncy5zaXplKCkgPCAzIHx8IGFyZ3Mu
c2l6ZSgpID4gNCkKLSAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgU3ludGF4RXJyb3Ip
OwotICAgIAotICAgIGlmIChhcmdzLnNpemUoKSA9PSA0KQotICAgICAgICBjb250ZXh0LT5zdHJv
a2VUZXh0KHVzdHJpbmdUb1N0cmluZyhhcmdzLmF0KDApLnRvU3RyaW5nKGV4ZWMpKSwgYXJncy5h
dCgxKS50b0Zsb2F0KGV4ZWMpLCBhcmdzLmF0KDIpLnRvRmxvYXQoZXhlYyksIGFyZ3MuYXQoMyku
dG9GbG9hdChleGVjKSk7Ci0gICAgZWxzZQotICAgICAgICBjb250ZXh0LT5zdHJva2VUZXh0KHVz
dHJpbmdUb1N0cmluZyhhcmdzLmF0KDApLnRvU3RyaW5nKGV4ZWMpKSwgYXJncy5hdCgxKS50b0Zs
b2F0KGV4ZWMpLCBhcmdzLmF0KDIpLnRvRmxvYXQoZXhlYykpOwotICAgIHJldHVybiBqc1VuZGVm
aW5lZCgpOwotfQotCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL2JpbmRp
bmdzL3NjcmlwdHMvQ29kZUdlbmVyYXRvckpTLnBtCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmlu
ZGluZ3Mvc2NyaXB0cy9Db2RlR2VuZXJhdG9ySlMucG0JKHJldmlzaW9uIDU5NjE4KQorKysgV2Vi
Q29yZS9iaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0b3JKUy5wbQkod29ya2luZyBjb3B5KQpA
QCAtMTEwMSw3ICsxMTAxLDcgQEAgc3ViIEdlbmVyYXRlUGFyYW1ldGVyc0NoZWNrRXhwcmVzc2lv
bgogICAgIG15ICRmdW5jdGlvbiA9IHNoaWZ0OwogCiAgICAgbXkgQGFuZEV4cHJlc3Npb24gPSAo
KTsKLSAgICBwdXNoKEBhbmRFeHByZXNzaW9uLCAiYXJncy5zaXplKCkgPT0gJG51bVBhcmFtZXRl
cnMiKTsKKyAgICBwdXNoKEBhbmRFeHByZXNzaW9uLCAiYXJnc0NvdW50ID09ICRudW1QYXJhbWV0
ZXJzIik7CiAgICAgbXkgJHBhcmFtZXRlckluZGV4ID0gMDsKICAgICBmb3JlYWNoICRwYXJhbWV0
ZXIgKEB7JGZ1bmN0aW9uLT5wYXJhbWV0ZXJzfSkgewogICAgICAgICBsYXN0IGlmICRwYXJhbWV0
ZXJJbmRleCA+PSAkbnVtUGFyYW1ldGVyczsKQEAgLTExMTIsOCArMTExMiw4IEBAIHN1YiBHZW5l
cmF0ZVBhcmFtZXRlcnNDaGVja0V4cHJlc3Npb24KICAgICAgICAgIyBGb3IgRE9NU3RyaW5nLCBO
dWxsLCBVbmRlZmluZWQgYW5kIGFueSBPYmplY3QgYXJlIGFjY2VwdGVkIHRvbywgYXMKICAgICAg
ICAgIyB0aGVzZSBhcmUgYWNjZXB0YWJsZSB2YWx1ZXMgZm9yIGEgRE9NU3RyaW5nIGFyZ3VtZW50
IChhbnkgT2JqZWN0IGNhbgogICAgICAgICAjIGJlIGNvbnZlcnRlZCB0byBhIHN0cmluZyB2aWEg
LnRvU3RyaW5nKS4KLSAgICAgICAgcHVzaChAYW5kRXhwcmVzc2lvbiwgIigke3ZhbHVlfS5pc051
bGwoKSB8fCAke3ZhbHVlfS5pc1VuZGVmaW5lZCgpIHx8ICR7dmFsdWV9LmlzU3RyaW5nKCkgfHwg
JHt2YWx1ZX0uaXNPYmplY3QoKSkiKSBpZiAkY29kZUdlbmVyYXRvci0+SXNTdHJpbmdUeXBlKCR0
eXBlKTsKLSAgICAgICAgcHVzaChAYW5kRXhwcmVzc2lvbiwgIigke3ZhbHVlfS5pc051bGwoKSB8
fCBhc09iamVjdCgke3ZhbHVlfSktPmluaGVyaXRzKEpTJHt0eXBlfTo6c19pbmZvKSIpIHVubGVz
cyBJc05hdGl2ZVR5cGUoJHR5cGUpOworICAgICAgICBwdXNoKEBhbmRFeHByZXNzaW9uLCAiKCR7
dmFsdWV9LmlzVW5kZWZpbmVkT3JOdWxsKCkgfHwgJHt2YWx1ZX0uaXNTdHJpbmcoKSB8fCAke3Zh
bHVlfS5pc09iamVjdCgpKSIpIGlmICRjb2RlR2VuZXJhdG9yLT5Jc1N0cmluZ1R5cGUoJHR5cGUp
OworICAgICAgICBwdXNoKEBhbmRFeHByZXNzaW9uLCAiKCR7dmFsdWV9LmlzTnVsbCgpIHx8IGFz
T2JqZWN0KCR7dmFsdWV9KS0+aW5oZXJpdHMoJkpTJHt0eXBlfTo6c19pbmZvKSkiKSB1bmxlc3Mg
SXNOYXRpdmVUeXBlKCR0eXBlKTsKIAogICAgICAgICAkcGFyYW1ldGVySW5kZXgrKzsKICAgICB9
CkBAIC0xMTU1LDExICsxMTU1LDEyIEBAIHN1YiBHZW5lcmF0ZU92ZXJsb2FkZWRQcm90b3R5cGVG
dW5jdGlvbgogICAgIHB1c2goQGltcGxDb250ZW50LCAiSlNWYWx1ZSBKU0NfSE9TVF9DQUxMICR7
ZnVuY3Rpb25OYW1lfShFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiwgSlNWYWx1ZSB0aGlzVmFs
dWUsIGNvbnN0IEFyZ0xpc3QmIGFyZ3MpXG4iKTsKICAgICBwdXNoKEBpbXBsQ29udGVudCwgPDxF
TkQpOwogeworICAgIGludCBhcmdzQ291bnQgPSBhcmdzLnNpemUoKTsKIEVORAogICAgIGZvcmVh
Y2ggbXkgJG92ZXJsb2FkIChAeyRmdW5jdGlvbi0+e292ZXJsb2Fkc319KSB7CiAgICAgICAgIG15
ICRwYXJhbWV0ZXJzQ2hlY2sgPSBHZW5lcmF0ZUZ1bmN0aW9uUGFyYW1ldGVyc0NoZWNrKCRvdmVy
bG9hZCk7CiAgICAgICAgIHB1c2goQGltcGxDb250ZW50LCAiICAgIGlmICgkcGFyYW1ldGVyc0No
ZWNrKVxuIik7Ci0gICAgICAgIHB1c2goQGltcGxDb250ZW50LCAiICAgICAgICByZXR1cm4gJHtm
dW5jdGlvbk5hbWV9JG92ZXJsb2FkLT57b3ZlcmxvYWRJbmRleH0oZXhlYywgdGhpc1ZhbHVlLCBh
cmdzKTtcbiIpOworICAgICAgICBwdXNoKEBpbXBsQ29udGVudCwgIiAgICAgICAgcmV0dXJuICR7
ZnVuY3Rpb25OYW1lfSRvdmVybG9hZC0+e292ZXJsb2FkSW5kZXh9KGV4ZWMsIDAsIHRoaXNWYWx1
ZSwgYXJncyk7XG4iKTsKICAgICB9CiAgICAgcHVzaChAaW1wbENvbnRlbnQsIDw8RU5EKTsKICAg
ICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBUeXBlRXJyb3IpOwpJbmRleDogV2ViQ29yZS9iaW5k
aW5ncy9zY3JpcHRzL3Rlc3QvSlMvSlNUZXN0SW50ZXJmYWNlLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9KUy9KU1Rlc3RJbnRlcmZhY2UuY3BwCShyZXZp
c2lvbiA1OTYxOCkKKysrIFdlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0pTL0pTVGVzdElu
dGVyZmFjZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ0LDEzICs0NCw3IEBAIHN0YXRpYyBjb25z
dCBIYXNoVGFibGVWYWx1ZSBKU1Rlc3RJbnRlcmYKIH07CiAKICN1bmRlZiBUSFVOS19HRU5FUkFU
T1IKLXN0YXRpYyBKU0NfQ09OU1RfSEFTSFRBQkxFIEhhc2hUYWJsZSBKU1Rlc3RJbnRlcmZhY2VU
YWJsZSA9Ci0jaWYgRU5BQkxFKFBFUkZFQ1RfSEFTSF9TSVpFKQotICAgIHsgMCwgSlNUZXN0SW50
ZXJmYWNlVGFibGVWYWx1ZXMsIDAgfTsKLSNlbHNlCi0gICAgeyAyLCAxLCBKU1Rlc3RJbnRlcmZh
Y2VUYWJsZVZhbHVlcywgMCB9OwotI2VuZGlmCi0KK3N0YXRpYyBKU0NfQ09OU1RfSEFTSFRBQkxF
IEhhc2hUYWJsZSBKU1Rlc3RJbnRlcmZhY2VUYWJsZSA9IHsgMiwgMSwgSlNUZXN0SW50ZXJmYWNl
VGFibGVWYWx1ZXMsIDAgfTsKIC8qIEhhc2ggdGFibGUgZm9yIGNvbnN0cnVjdG9yICovCiAjaWYg
RU5BQkxFKEpJVCkKICNkZWZpbmUgVEhVTktfR0VORVJBVE9SKGdlbmVyYXRvcikgLCBnZW5lcmF0
b3IKQEAgLTY0LDEzICs1OCw3IEBAIHN0YXRpYyBjb25zdCBIYXNoVGFibGVWYWx1ZSBKU1Rlc3RJ
bnRlcmYKIH07CiAKICN1bmRlZiBUSFVOS19HRU5FUkFUT1IKLXN0YXRpYyBKU0NfQ09OU1RfSEFT
SFRBQkxFIEhhc2hUYWJsZSBKU1Rlc3RJbnRlcmZhY2VDb25zdHJ1Y3RvclRhYmxlID0KLSNpZiBF
TkFCTEUoUEVSRkVDVF9IQVNIX1NJWkUpCi0gICAgeyAwLCBKU1Rlc3RJbnRlcmZhY2VDb25zdHJ1
Y3RvclRhYmxlVmFsdWVzLCAwIH07Ci0jZWxzZQotICAgIHsgMSwgMCwgSlNUZXN0SW50ZXJmYWNl
Q29uc3RydWN0b3JUYWJsZVZhbHVlcywgMCB9OwotI2VuZGlmCi0KK3N0YXRpYyBKU0NfQ09OU1Rf
SEFTSFRBQkxFIEhhc2hUYWJsZSBKU1Rlc3RJbnRlcmZhY2VDb25zdHJ1Y3RvclRhYmxlID0geyAx
LCAwLCBKU1Rlc3RJbnRlcmZhY2VDb25zdHJ1Y3RvclRhYmxlVmFsdWVzLCAwIH07CiBjbGFzcyBK
U1Rlc3RJbnRlcmZhY2VDb25zdHJ1Y3RvciA6IHB1YmxpYyBET01Db25zdHJ1Y3Rvck9iamVjdCB7
CiBwdWJsaWM6CiAgICAgSlNUZXN0SW50ZXJmYWNlQ29uc3RydWN0b3IoRXhlY1N0YXRlKiBleGVj
LCBKU0RPTUdsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0KQpAQCAtMTI5LDEzICsxMTcsNyBAQCBz
dGF0aWMgY29uc3QgSGFzaFRhYmxlVmFsdWUgSlNUZXN0SW50ZXJmCiB9OwogCiAjdW5kZWYgVEhV
TktfR0VORVJBVE9SCi1zdGF0aWMgSlNDX0NPTlNUX0hBU0hUQUJMRSBIYXNoVGFibGUgSlNUZXN0
SW50ZXJmYWNlUHJvdG90eXBlVGFibGUgPQotI2lmIEVOQUJMRShQRVJGRUNUX0hBU0hfU0laRSkK
LSAgICB7IDAsIEpTVGVzdEludGVyZmFjZVByb3RvdHlwZVRhYmxlVmFsdWVzLCAwIH07Ci0jZWxz
ZQotICAgIHsgMSwgMCwgSlNUZXN0SW50ZXJmYWNlUHJvdG90eXBlVGFibGVWYWx1ZXMsIDAgfTsK
LSNlbmRpZgotCitzdGF0aWMgSlNDX0NPTlNUX0hBU0hUQUJMRSBIYXNoVGFibGUgSlNUZXN0SW50
ZXJmYWNlUHJvdG90eXBlVGFibGUgPSB7IDEsIDAsIEpTVGVzdEludGVyZmFjZVByb3RvdHlwZVRh
YmxlVmFsdWVzLCAwIH07CiBjb25zdCBDbGFzc0luZm8gSlNUZXN0SW50ZXJmYWNlUHJvdG90eXBl
OjpzX2luZm8gPSB7ICJUZXN0SW50ZXJmYWNlUHJvdG90eXBlIiwgMCwgJkpTVGVzdEludGVyZmFj
ZVByb3RvdHlwZVRhYmxlLCAwIH07CiAKIEpTT2JqZWN0KiBKU1Rlc3RJbnRlcmZhY2VQcm90b3R5
cGU6OnNlbGYoRXhlY1N0YXRlKiBleGVjLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0KQpJ
bmRleDogV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvSlMvSlNUZXN0T2JqLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9KUy9KU1Rlc3RPYmouY3Bw
CShyZXZpc2lvbiA1OTYxOCkKKysrIFdlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0pTL0pT
VGVzdE9iai5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTY2LDEzICs2Niw3IEBAIHN0YXRpYyBjb25z
dCBIYXNoVGFibGVWYWx1ZSBKU1Rlc3RPYmpUYWIKIH07CiAKICN1bmRlZiBUSFVOS19HRU5FUkFU
T1IKLXN0YXRpYyBKU0NfQ09OU1RfSEFTSFRBQkxFIEhhc2hUYWJsZSBKU1Rlc3RPYmpUYWJsZSA9
Ci0jaWYgRU5BQkxFKFBFUkZFQ1RfSEFTSF9TSVpFKQotICAgIHsgMTI3LCBKU1Rlc3RPYmpUYWJs
ZVZhbHVlcywgMCB9OwotI2Vsc2UKLSAgICB7IDM0LCAzMSwgSlNUZXN0T2JqVGFibGVWYWx1ZXMs
IDAgfTsKLSNlbmRpZgotCitzdGF0aWMgSlNDX0NPTlNUX0hBU0hUQUJMRSBIYXNoVGFibGUgSlNU
ZXN0T2JqVGFibGUgPSB7IDM0LCAzMSwgSlNUZXN0T2JqVGFibGVWYWx1ZXMsIDAgfTsKIC8qIEhh
c2ggdGFibGUgZm9yIGNvbnN0cnVjdG9yICovCiAjaWYgRU5BQkxFKEpJVCkKICNkZWZpbmUgVEhV
TktfR0VORVJBVE9SKGdlbmVyYXRvcikgLCBnZW5lcmF0b3IKQEAgLTg2LDEzICs4MCw3IEBAIHN0
YXRpYyBjb25zdCBIYXNoVGFibGVWYWx1ZSBKU1Rlc3RPYmpDb24KIH07CiAKICN1bmRlZiBUSFVO
S19HRU5FUkFUT1IKLXN0YXRpYyBKU0NfQ09OU1RfSEFTSFRBQkxFIEhhc2hUYWJsZSBKU1Rlc3RP
YmpDb25zdHJ1Y3RvclRhYmxlID0KLSNpZiBFTkFCTEUoUEVSRkVDVF9IQVNIX1NJWkUpCi0gICAg
eyAwLCBKU1Rlc3RPYmpDb25zdHJ1Y3RvclRhYmxlVmFsdWVzLCAwIH07Ci0jZWxzZQotICAgIHsg
MSwgMCwgSlNUZXN0T2JqQ29uc3RydWN0b3JUYWJsZVZhbHVlcywgMCB9OwotI2VuZGlmCi0KK3N0
YXRpYyBKU0NfQ09OU1RfSEFTSFRBQkxFIEhhc2hUYWJsZSBKU1Rlc3RPYmpDb25zdHJ1Y3RvclRh
YmxlID0geyAxLCAwLCBKU1Rlc3RPYmpDb25zdHJ1Y3RvclRhYmxlVmFsdWVzLCAwIH07CiBjbGFz
cyBKU1Rlc3RPYmpDb25zdHJ1Y3RvciA6IHB1YmxpYyBET01Db25zdHJ1Y3Rvck9iamVjdCB7CiBw
dWJsaWM6CiAgICAgSlNUZXN0T2JqQ29uc3RydWN0b3IoRXhlY1N0YXRlKiBleGVjLCBKU0RPTUds
b2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0KQpAQCAtMTY3LDEzICsxNTUsNyBAQCBzdGF0aWMgY29u
c3QgSGFzaFRhYmxlVmFsdWUgSlNUZXN0T2JqUHJvCiB9OwogCiAjdW5kZWYgVEhVTktfR0VORVJB
VE9SCi1zdGF0aWMgSlNDX0NPTlNUX0hBU0hUQUJMRSBIYXNoVGFibGUgSlNUZXN0T2JqUHJvdG90
eXBlVGFibGUgPQotI2lmIEVOQUJMRShQRVJGRUNUX0hBU0hfU0laRSkKLSAgICB7IDgxOTEsIEpT
VGVzdE9ialByb3RvdHlwZVRhYmxlVmFsdWVzLCAwIH07Ci0jZWxzZQotICAgIHsgNjksIDYzLCBK
U1Rlc3RPYmpQcm90b3R5cGVUYWJsZVZhbHVlcywgMCB9OwotI2VuZGlmCi0KK3N0YXRpYyBKU0Nf
Q09OU1RfSEFTSFRBQkxFIEhhc2hUYWJsZSBKU1Rlc3RPYmpQcm90b3R5cGVUYWJsZSA9IHsgNjks
IDYzLCBKU1Rlc3RPYmpQcm90b3R5cGVUYWJsZVZhbHVlcywgMCB9OwogY29uc3QgQ2xhc3NJbmZv
IEpTVGVzdE9ialByb3RvdHlwZTo6c19pbmZvID0geyAiVGVzdE9ialByb3RvdHlwZSIsIDAsICZK
U1Rlc3RPYmpQcm90b3R5cGVUYWJsZSwgMCB9OwogCiBKU09iamVjdCogSlNUZXN0T2JqUHJvdG90
eXBlOjpzZWxmKEV4ZWNTdGF0ZSogZXhlYywgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCkK
QEAgLTkwMywxNCArODg1LDE1IEBAIEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBqc1Rlc3RPYmpQcm90
b3R5cGUKIAogSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGpzVGVzdE9ialByb3RvdHlwZUZ1bmN0aW9u
T3ZlcmxvYWRlZE1ldGhvZChFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiwgSlNWYWx1ZSB0aGlz
VmFsdWUsIGNvbnN0IEFyZ0xpc3QmIGFyZ3MpCiB7Ci0gICAgaWYgKChhcmdzLnNpemUoKSA9PSAy
ICYmIChhcmdzLmF0KDApLmlzTnVsbCgpIHx8IGFzT2JqZWN0KGFyZ3MuYXQoMCkpLT5pbmhlcml0
cyhKU1Rlc3RPYmo6OnNfaW5mbykgJiYgKGFyZ3MuYXQoMSkuaXNOdWxsKCkgfHwgYXJncy5hdCgx
KS5pc1VuZGVmaW5lZCgpIHx8IGFyZ3MuYXQoMSkuaXNTdHJpbmcoKSB8fCBhcmdzLmF0KDEpLmlz
T2JqZWN0KCkpKSkKLSAgICAgICAgcmV0dXJuIGpzVGVzdE9ialByb3RvdHlwZUZ1bmN0aW9uT3Zl
cmxvYWRlZE1ldGhvZDEoZXhlYywgdGhpc1ZhbHVlLCBhcmdzKTsKLSAgICBpZiAoKGFyZ3Muc2l6
ZSgpID09IDEgJiYgKGFyZ3MuYXQoMCkuaXNOdWxsKCkgfHwgYXNPYmplY3QoYXJncy5hdCgwKSkt
PmluaGVyaXRzKEpTVGVzdE9iajo6c19pbmZvKSkgfHwgKGFyZ3Muc2l6ZSgpID09IDIgJiYgKGFy
Z3MuYXQoMCkuaXNOdWxsKCkgfHwgYXNPYmplY3QoYXJncy5hdCgwKSktPmluaGVyaXRzKEpTVGVz
dE9iajo6c19pbmZvKSkpCi0gICAgICAgIHJldHVybiBqc1Rlc3RPYmpQcm90b3R5cGVGdW5jdGlv
bk92ZXJsb2FkZWRNZXRob2QyKGV4ZWMsIHRoaXNWYWx1ZSwgYXJncyk7Ci0gICAgaWYgKChhcmdz
LnNpemUoKSA9PSAxICYmIChhcmdzLmF0KDApLmlzTnVsbCgpIHx8IGFyZ3MuYXQoMCkuaXNVbmRl
ZmluZWQoKSB8fCBhcmdzLmF0KDApLmlzU3RyaW5nKCkgfHwgYXJncy5hdCgwKS5pc09iamVjdCgp
KSkpCi0gICAgICAgIHJldHVybiBqc1Rlc3RPYmpQcm90b3R5cGVGdW5jdGlvbk92ZXJsb2FkZWRN
ZXRob2QzKGV4ZWMsIHRoaXNWYWx1ZSwgYXJncyk7Ci0gICAgaWYgKGFyZ3Muc2l6ZSgpID09IDEp
Ci0gICAgICAgIHJldHVybiBqc1Rlc3RPYmpQcm90b3R5cGVGdW5jdGlvbk92ZXJsb2FkZWRNZXRo
b2Q0KGV4ZWMsIHRoaXNWYWx1ZSwgYXJncyk7CisgICAgaW50IGFyZ3NDb3VudCA9IGFyZ3Muc2l6
ZSgpOworICAgIGlmICgoYXJnc0NvdW50ID09IDIgJiYgKGFyZ3MuYXQoMCkuaXNOdWxsKCkgfHwg
YXNPYmplY3QoYXJncy5hdCgwKSktPmluaGVyaXRzKCZKU1Rlc3RPYmo6OnNfaW5mbykpICYmIChh
cmdzLmF0KDEpLmlzVW5kZWZpbmVkT3JOdWxsKCkgfHwgYXJncy5hdCgxKS5pc1N0cmluZygpIHx8
IGFyZ3MuYXQoMSkuaXNPYmplY3QoKSkpKQorICAgICAgICByZXR1cm4ganNUZXN0T2JqUHJvdG90
eXBlRnVuY3Rpb25PdmVybG9hZGVkTWV0aG9kMShleGVjLCAwLCB0aGlzVmFsdWUsIGFyZ3MpOwor
ICAgIGlmICgoYXJnc0NvdW50ID09IDEgJiYgKGFyZ3MuYXQoMCkuaXNOdWxsKCkgfHwgYXNPYmpl
Y3QoYXJncy5hdCgwKSktPmluaGVyaXRzKCZKU1Rlc3RPYmo6OnNfaW5mbykpKSB8fCAoYXJnc0Nv
dW50ID09IDIgJiYgKGFyZ3MuYXQoMCkuaXNOdWxsKCkgfHwgYXNPYmplY3QoYXJncy5hdCgwKSkt
PmluaGVyaXRzKCZKU1Rlc3RPYmo6OnNfaW5mbykpKSkKKyAgICAgICAgcmV0dXJuIGpzVGVzdE9i
alByb3RvdHlwZUZ1bmN0aW9uT3ZlcmxvYWRlZE1ldGhvZDIoZXhlYywgMCwgdGhpc1ZhbHVlLCBh
cmdzKTsKKyAgICBpZiAoKGFyZ3NDb3VudCA9PSAxICYmIChhcmdzLmF0KDApLmlzVW5kZWZpbmVk
T3JOdWxsKCkgfHwgYXJncy5hdCgwKS5pc1N0cmluZygpIHx8IGFyZ3MuYXQoMCkuaXNPYmplY3Qo
KSkpKQorICAgICAgICByZXR1cm4ganNUZXN0T2JqUHJvdG90eXBlRnVuY3Rpb25PdmVybG9hZGVk
TWV0aG9kMyhleGVjLCAwLCB0aGlzVmFsdWUsIGFyZ3MpOworICAgIGlmIChhcmdzQ291bnQgPT0g
MSkKKyAgICAgICAgcmV0dXJuIGpzVGVzdE9ialByb3RvdHlwZUZ1bmN0aW9uT3ZlcmxvYWRlZE1l
dGhvZDQoZXhlYywgMCwgdGhpc1ZhbHVlLCBhcmdzKTsKICAgICByZXR1cm4gdGhyb3dFcnJvcihl
eGVjLCBUeXBlRXJyb3IpOwogfQogCkluZGV4OiBXZWJDb3JlL2h0bWwvSFRNTENhbnZhc0VsZW1l
bnQuaWRsCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaHRtbC9IVE1MQ2FudmFzRWxlbWVudC5pZGwJ
KHJldmlzaW9uIDU5NjE4KQorKysgV2ViQ29yZS9odG1sL0hUTUxDYW52YXNFbGVtZW50LmlkbAko
d29ya2luZyBjb3B5KQpAQCAtMjYsNyArMjYsOCBAQAogbW9kdWxlIGh0bWwgewogCiAgICAgaW50
ZXJmYWNlIFsKLSAgICAgICAgQ3VzdG9tTWFya0Z1bmN0aW9uCisgICAgICAgIEN1c3RvbU1hcmtG
dW5jdGlvbiwKKyAgICAgICAgR2VuZXJhdGVOYXRpdmVDb252ZXJ0ZXIKICAgICBdIEhUTUxDYW52
YXNFbGVtZW50IDogSFRNTEVsZW1lbnQgewogCiAgICAgICAgIGF0dHJpYnV0ZSBsb25nIHdpZHRo
OwpJbmRleDogV2ViQ29yZS9odG1sL0hUTUxJbWFnZUVsZW1lbnQuaWRsCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvaHRtbC9IVE1MSW1hZ2VFbGVtZW50LmlkbAkocmV2aXNpb24gNTk2MTgpCisrKyBX
ZWJDb3JlL2h0bWwvSFRNTEltYWdlRWxlbWVudC5pZGwJKHdvcmtpbmcgY29weSkKQEAgLTIwLDcg
KzIwLDkgQEAKIAogbW9kdWxlIGh0bWwgewogCi0gICAgaW50ZXJmYWNlIEhUTUxJbWFnZUVsZW1l
bnQgOiBIVE1MRWxlbWVudCB7CisgICAgaW50ZXJmYWNlIFsKKyAgICAgICAgR2VuZXJhdGVOYXRp
dmVDb252ZXJ0ZXIKKyAgICBdIEhUTUxJbWFnZUVsZW1lbnQgOiBIVE1MRWxlbWVudCB7CiAgICAg
ICAgICAgICAgICAgIGF0dHJpYnV0ZSBbQ29udmVydE51bGxUb051bGxTdHJpbmcsIFJlZmxlY3Rd
IERPTVN0cmluZyBuYW1lOwogICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgW0NvbnZlcnROdWxs
VG9OdWxsU3RyaW5nLCBSZWZsZWN0XSBET01TdHJpbmcgYWxpZ247CiAgICAgICAgICAgICAgICAg
IGF0dHJpYnV0ZSBbQ29udmVydE51bGxUb051bGxTdHJpbmcsIFJlZmxlY3RdIERPTVN0cmluZyBh
bHQ7CkluZGV4OiBXZWJDb3JlL2h0bWwvSFRNTFZpZGVvRWxlbWVudC5pZGwKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9odG1sL0hUTUxWaWRlb0VsZW1lbnQuaWRsCShyZXZpc2lvbiA1OTYxOCkKKysr
IFdlYkNvcmUvaHRtbC9IVE1MVmlkZW9FbGVtZW50LmlkbAkod29ya2luZyBjb3B5KQpAQCAtMjQs
NyArMjQsMTAgQEAKICAqLwogCiBtb2R1bGUgaHRtbCB7Ci0gICAgaW50ZXJmYWNlIFtDb25kaXRp
b25hbD1WSURFT10gSFRNTFZpZGVvRWxlbWVudCA6IEhUTUxNZWRpYUVsZW1lbnQgeworICAgIGlu
dGVyZmFjZSBbCisgICAgICAgIENvbmRpdGlvbmFsPVZJREVPLAorICAgICAgICBHZW5lcmF0ZU5h
dGl2ZUNvbnZlcnRlcgorICAgIF0gSFRNTFZpZGVvRWxlbWVudCA6IEhUTUxNZWRpYUVsZW1lbnQg
ewogICAgICAgICBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyB3aWR0aDsKICAgICAgICAgYXR0cmli
dXRlIHVuc2lnbmVkIGxvbmcgaGVpZ2h0OwogICAgICAgICByZWFkb25seSBhdHRyaWJ1dGUgdW5z
aWduZWQgbG9uZyB2aWRlb1dpZHRoOwpJbmRleDogV2ViQ29yZS9odG1sL2NhbnZhcy9DYW52YXNS
ZW5kZXJpbmdDb250ZXh0MkQuaWRsCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaHRtbC9jYW52YXMv
Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJELmlkbAkocmV2aXNpb24gNTk2MTgpCisrKyBXZWJDb3Jl
L2h0bWwvY2FudmFzL0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5pZGwJKHdvcmtpbmcgY29weSkK
QEAgLTk3LDcgKzk3LDYgQEAgbW9kdWxlIGh0bWwgewogCiAgICAgICAgIHZvaWQgY2xlYXJTaGFk
b3coKTsKIAotI2lmIGRlZmluZWQoVjhfQklORElORykgJiYgVjhfQklORElORwogICAgICAgICB2
b2lkIGZpbGxUZXh0KGluIERPTVN0cmluZyB0ZXh0LCBpbiBmbG9hdCB4LCBpbiBmbG9hdCB5LCBp
biBbT3B0aW9uYWxdIGZsb2F0IG1heFdpZHRoKTsKICAgICAgICAgdm9pZCBzdHJva2VUZXh0KGlu
IERPTVN0cmluZyB0ZXh0LCBpbiBmbG9hdCB4LCBpbiBmbG9hdCB5LCBpbiBbT3B0aW9uYWxdIGZs
b2F0IG1heFdpZHRoKTsKIApAQCAtMTUyLDIwICsxNTEsNiBAQCBtb2R1bGUgaHRtbCB7CiAgICAg
ICAgICAgICByYWlzZXMgKERPTUV4Y2VwdGlvbik7CiAgICAgICAgIEltYWdlRGF0YSBjcmVhdGVJ
bWFnZURhdGEoaW4gZmxvYXQgc3csIGluIGZsb2F0IHNoKQogICAgICAgICAgICAgcmFpc2VzIChE
T01FeGNlcHRpb24pOwotI2Vsc2UKLSAgICAgICAgLy8gRklYTUU6IFJlbW92ZSAnZWxzZScgb25j
ZSBKU0Mgc3VwcG9ydHMgb3ZlcmxvYWRzIHRvby4KLSAgICAgICAgW0N1c3RvbV0gdm9pZCBmaWxs
VGV4dCgvKiA0ICovKTsKLSAgICAgICAgW0N1c3RvbV0gdm9pZCBzdHJva2VUZXh0KC8qIDQgKi8p
OwotICAgICAgICBbQ3VzdG9tXSB2b2lkIHNldFN0cm9rZUNvbG9yKC8qIDEgICovKTsKLSAgICAg
ICAgW0N1c3RvbV0gdm9pZCBzZXRGaWxsQ29sb3IoLyogMSAqLyk7Ci0gICAgICAgIFtDdXN0b21d
IHZvaWQgc3Ryb2tlUmVjdCgvKiA0ICovKTsKLSAgICAgICAgW0N1c3RvbV0gdm9pZCBkcmF3SW1h
Z2UoLyogMyAqLyk7Ci0gICAgICAgIFtDdXN0b21dIHZvaWQgZHJhd0ltYWdlRnJvbVJlY3QoLyog
MTAgKi8pOwotICAgICAgICBbQ3VzdG9tXSB2b2lkIHNldFNoYWRvdygvKiAzICovKTsKLSAgICAg
ICAgW0N1c3RvbV0gdm9pZCBjcmVhdGVQYXR0ZXJuKC8qIDIgKi8pOwotICAgICAgICBbQ3VzdG9t
XSB2b2lkIHB1dEltYWdlRGF0YSgvKiBpbiBJbWFnZURhdGEgaW1hZ2VkYXRhLCBpbiBmbG9hdCBk
eCwgaW4gZmxvYXQgZHkgWywgaW4gZmxvYXQgZGlydHlYLCBpbiBmbG9hdCBkaXJ0eVksIGluIGZs
b2F0IGRpcnR5V2lkdGgsIGluIGZsb2F0IGRpcnR5SGVpZ2h0XSAqLyk7Ci0gICAgICAgIFtDdXN0
b21dIEltYWdlRGF0YSBjcmVhdGVJbWFnZURhdGEoLyogMyAqLyk7Ci0jZW5kaWYgLy8gZGVmaW5l
ZChWOF9CSU5ESU5HKQogCiAgICAgICAgIGF0dHJpYnV0ZSBbQ3VzdG9tXSBjdXN0b20gc3Ryb2tl
U3R5bGU7CiAgICAgICAgIGF0dHJpYnV0ZSBbQ3VzdG9tXSBjdXN0b20gZmlsbFN0eWxlOwo=
</data>
<flag name="review"
          id="40695"
          type_id="1"
          status="-"
          setter="abarth"
    />
          </attachment>
      

    </bug>

</bugzilla>