<?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>199215</bug_id>
          
          <creation_ts>2019-06-25 18:25:21 -0700</creation_ts>
          <short_desc>[WHLSL] Matrix memory layout should match HLSL by laying out columns linearly</short_desc>
          <delta_ts>2019-07-15 20:54:01 -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>WebGPU</component>
          <version>Other</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>InRadar</keywords>
          <priority>P1</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Justin Fan">justin_fan</reporter>
          <assigned_to name="Saam Barati">saam</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>mmaxfield</cc>
    
    <cc>saam</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1547924</commentid>
    <comment_count>0</comment_count>
    <who name="Justin Fan">justin_fan</who>
    <bug_when>2019-06-25 18:25:21 -0700</bug_when>
    <thetext>From MSL docs: 

&gt;// This sets the 4th element of the 3rd column to 3.0. 
&gt;m[2][3] = 3.0f;

This is opposite of HLSL, which is what WHLSL should be compatible with. I don&apos;t think we are taking this into account when compiling WHLSL.

From Microsoft docs:

&gt;A 4x4 matrix is accessed with the following indices:

&gt;[0][0], [0][1], [0][2], [0][3]
&gt;[1][0], [1][1], [1][2], [1][3]
&gt;[2][0], [2][1], [2][2], [2][3]
&gt;[3][0], [3][1], [3][2], [3][3]</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1547937</commentid>
    <comment_count>1</comment_count>
    <who name="Justin Fan">justin_fan</who>
    <bug_when>2019-06-25 18:49:48 -0700</bug_when>
    <thetext>Myles&apos; comments:

&gt; 1) make the WHLSL functions round-trip. So if you invoke a bunch of different constructors and then run a bunch of getters, you get the expected thing.
&gt; 2) make the memory layout match HLSL. If you upload 16 floats in a buffer and then tell the shader that the buffer contains a matrix, the getters should also return the expected thing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1549458</commentid>
    <comment_count>2</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2019-07-01 20:57:24 -0700</bug_when>
    <thetext>In Direct3D, if you put [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] in a buffer and tell the shader that the buffer is a matrix, and then ask the matrix for [0][1], the result is 5.

If you call float4x4(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16) and then you ask it for [0][1], the result is 2.

If you call float4x4(float4(1, 2, 3, 4), float4(5, 6, 7, 8), float4(9, 10, 11, 12), float4(13, 14, 15, 16)) and then you ask it for [0][1], the result is 2.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1549988</commentid>
    <comment_count>3</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2019-07-03 14:09:00 -0700</bug_when>
    <thetext>In Direct3D, if you put [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32] in a buffer, and tell the shader that it&apos;s two float4x4s next to each other, then you mul(buffer1[0], buffer1[1]) and put the result in another buffer and then read the buffer on the CPU side, the results are:

538
612
686
760
650
740
830
920
762
868
974
1080
874
996
1118
1240

Thus, the two matrices are
[1 5  9 13]   [17 21 25 29]
[2 6 10 14] * [18 22 26 30]
[3 7 11 15]   [19 23 27 31]
[4 8 12 16]   [20 24 28 32]</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1549990</commentid>
    <comment_count>4</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2019-07-03 14:10:15 -0700</bug_when>
    <thetext>(In reply to Myles C. Maxfield from comment #3)
&gt; In Direct3D, if you put [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
&gt; 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32] in a
&gt; buffer, and tell the shader that it&apos;s two float4x4s next to each other, then
&gt; you mul(buffer1[0], buffer1[1]) and put the result in another buffer and
&gt; then read the buffer on the CPU side, the results are:
&gt; 
&gt; 538
&gt; 612
&gt; 686
&gt; 760
&gt; 650
&gt; 740
&gt; 830
&gt; 920
&gt; 762
&gt; 868
&gt; 974
&gt; 1080
&gt; 874
&gt; 996
&gt; 1118
&gt; 1240
&gt; 
&gt; Thus, the two matrices are
&gt; [1 5  9 13]   [17 21 25 29]
&gt; [2 6 10 14] * [18 22 26 30]
&gt; [3 7 11 15]   [19 23 27 31]
&gt; [4 8 12 16]   [20 24 28 32]

and buffer1[0][0] is [1 5 9 13]</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1550144</commentid>
    <comment_count>5</comment_count>
    <who name="Justin Fan">justin_fan</who>
    <bug_when>2019-07-03 18:29:23 -0700</bug_when>
    <thetext>For Metal Shading Language:

There is no difference between supplying [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] as a buffer to a shader and telling it to treat it as a float4x4, or using the float4x4() constructor with those values. Result[0] is [1, 2, 3, 4].

If you put [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32] in a buffer, and tell the shader that it&apos;s two float4x4s next to each other, the results of buffer1[0] * buffer1[1] are:

538
612
686
760
650
740
830
920
762
868
974
1080
874
996
1118
1240

Thus, the two matrices are
[1 5  9 13]   [17 21 25 29]
[2 6 10 14] * [18 22 26 30]
[3 7 11 15]   [19 23 27 31]
[4 8 12 16]   [20 24 28 32]

and buffer1[0][0] is [1, 2, 3, 4].

This makes sense, as MSL docs imply matrices are built AND stored as Arrays Of Columns Vectors.

Thus the difference remains: HLSL (and thus WHLSL) indexes matrices as Arrays of Row Vectors.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1550150</commentid>
    <comment_count>6</comment_count>
    <who name="Justin Fan">justin_fan</who>
    <bug_when>2019-07-03 18:33:50 -0700</bug_when>
    <thetext>The difference is that HLSL&apos;s float4x4 constructor and indexing operators behave in row-major order, but in memory in both languages, the values are in column-major order.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1550160</commentid>
    <comment_count>7</comment_count>
    <who name="Justin Fan">justin_fan</who>
    <bug_when>2019-07-03 19:18:27 -0700</bug_when>
    <thetext>To make things even more fun, currently in WHLSL, if you put [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32] in a buffer, and tell the shader that it&apos;s two float4x4s next to each other, the results of mul(buffer1[0], buffer1[1]) are:

250
260
270
280
618
644
670
696
986
1028
1070
1112
1354
1412
1470
1528

Implying that the matrices are:
[1   2  3  4]   [17 18 19 20]
[5   6  7  8] * [21 22 23 24]
[9  10 11 12]   [25 26 27 28]
[13 14 15 16]   [29 30 31 32]</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1550162</commentid>
    <comment_count>8</comment_count>
    <who name="Justin Fan">justin_fan</who>
    <bug_when>2019-07-03 19:28:25 -0700</bug_when>
    <thetext>This means: this patch must ensure that WHLSL indexing behavior matches HLSL, if we are going with HLSL source-compatibility. The underlying memory layout should not need change.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1550163</commentid>
    <comment_count>9</comment_count>
    <who name="Justin Fan">justin_fan</who>
    <bug_when>2019-07-03 19:29:20 -0700</bug_when>
    <thetext>(In reply to Justin Fan from comment #8)
&gt; This means: this patch must ensure that WHLSL indexing behavior matches
&gt; HLSL, if we are going with HLSL source-compatibility. The underlying memory
&gt; layout should not need change.

e.g. in WHLSL, result[0][0] gives [1, 2, 3, 4] when it should return [1, 5, 9, 13].</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1552627</commentid>
    <comment_count>10</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2019-07-12 17:32:16 -0700</bug_when>
    <thetext>patch forthcoming</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1552653</commentid>
    <comment_count>11</comment_count>
      <attachid>374068</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2019-07-12 19:11:37 -0700</bug_when>
    <thetext>Created attachment 374068
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1552657</commentid>
    <comment_count>12</comment_count>
      <attachid>374068</attachid>
    <who name="Justin Fan">justin_fan</who>
    <bug_when>2019-07-12 19:19:24 -0700</bug_when>
    <thetext>Comment on attachment 374068
patch

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

&gt; LayoutTests/webgpu/whlsl-matrix-memory-layout.html:5
&gt; +&lt;script src=&quot;../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;

Any reason why you didn&apos;t use the WHLSL harness to write this test?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1552665</commentid>
    <comment_count>13</comment_count>
      <attachid>374068</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2019-07-12 20:04:02 -0700</bug_when>
    <thetext>Comment on attachment 374068
patch

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

&gt; Source/WebCore/ChangeLog:11
&gt; +        [0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15]

This is an odd way to structure this sentence. Why not say the memory is 1, 2, 3?

&gt; Source/WebCore/ChangeLog:20
&gt; +        contents of a matrix. So the matrix float4x3 will now be an array&lt;float, 12&gt;

Why not just consider the matrix to be a container, and make the accessors/mutators do the right thing?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1552680</commentid>
    <comment_count>14</comment_count>
      <attachid>374068</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2019-07-12 22:04:54 -0700</bug_when>
    <thetext>Comment on attachment 374068
patch

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

I’ll wait for Saam to answer the question about why we’re using arrays instead of matrixes as the container before finishing the review.

&gt; Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLNativeFunctionWriter.cpp:261
&gt; +    auto numberOfMatrixColumns = [&amp;] () -&gt; unsigned {

Can we share some code?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1552684</commentid>
    <comment_count>15</comment_count>
      <attachid>374068</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2019-07-12 22:23:45 -0700</bug_when>
    <thetext>Comment on attachment 374068
patch

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

&gt;&gt; Source/WebCore/ChangeLog:11
&gt;&gt; +        [0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15]
&gt; 
&gt; This is an odd way to structure this sentence. Why not say the memory is 1, 2, 3?

I’m confused what you’re suggesting. I’m just trying to show what the backing memory of the below matrix is. Im not sure why how other backing store of memory as an example is any clearer. Maybe you have something in mind?

&gt;&gt; Source/WebCore/ChangeLog:20
&gt;&gt; +        contents of a matrix. So the matrix float4x3 will now be an array&lt;float, 12&gt;
&gt; 
&gt; Why not just consider the matrix to be a container, and make the accessors/mutators do the right thing?

I’m confused what the alternative is. This patch is making it a container (specifically array) and we change the accessors to do the right thing

&gt;&gt; Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLNativeFunctionWriter.cpp:261
&gt;&gt; +    auto numberOfMatrixColumns = [&amp;] () -&gt; unsigned {
&gt; 
&gt; Can we share some code?

Yup. Can fix

&gt;&gt; LayoutTests/webgpu/whlsl-matrix-memory-layout.html:5
&gt;&gt; +&lt;script src=&quot;../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
&gt; 
&gt; Any reason why you didn&apos;t use the WHLSL harness to write this test?

The main reason was just to manually control the buffer explicitly in the test. But it could be written using the harness</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1552687</commentid>
    <comment_count>16</comment_count>
      <attachid>374068</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2019-07-12 22:49:32 -0700</bug_when>
    <thetext>Comment on attachment 374068
patch

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

&gt;&gt;&gt; Source/WebCore/ChangeLog:11
&gt;&gt;&gt; +        [0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15]
&gt;&gt; 
&gt;&gt; This is an odd way to structure this sentence. Why not say the memory is 1, 2, 3?
&gt; 
&gt; I’m confused what you’re suggesting. I’m just trying to show what the backing memory of the below matrix is. Im not sure why how other backing store of memory as an example is any clearer. Maybe you have something in mind?

This sentence is of the form “A [X] with the form [some complicated thing] should be the same as [this simple thing]”. I just mean that these sentences are usually of the form ”A [X] with the form [this simple thing] should be the same as [some complicated thing].”

&gt;&gt;&gt; Source/WebCore/ChangeLog:20
&gt;&gt;&gt; +        contents of a matrix. So the matrix float4x3 will now be an array&lt;float, 12&gt;
&gt;&gt; 
&gt;&gt; Why not just consider the matrix to be a container, and make the accessors/mutators do the right thing?
&gt; 
&gt; I’m confused what the alternative is. This patch is making it a container (specifically array) and we change the accessors to do the right thing

Oh, I meant: why are WHLSL matrices represented as MSL nested arrays instead of being represented by MSL matrices? That seem more natural.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1552688</commentid>
    <comment_count>17</comment_count>
      <attachid>374068</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2019-07-12 23:39:17 -0700</bug_when>
    <thetext>Comment on attachment 374068
patch

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

&gt;&gt;&gt;&gt; Source/WebCore/ChangeLog:11
&gt;&gt;&gt;&gt; +        [0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15]
&gt;&gt;&gt; 
&gt;&gt;&gt; This is an odd way to structure this sentence. Why not say the memory is 1, 2, 3?
&gt;&gt; 
&gt;&gt; I’m confused what you’re suggesting. I’m just trying to show what the backing memory of the below matrix is. Im not sure why how other backing store of memory as an example is any clearer. Maybe you have something in mind?
&gt; 
&gt; This sentence is of the form “A [X] with the form [some complicated thing] should be the same as [this simple thing]”. I just mean that these sentences are usually of the form ”A [X] with the form [this simple thing] should be the same as [some complicated thing].”

I can change it.

&gt;&gt;&gt;&gt; Source/WebCore/ChangeLog:20
&gt;&gt;&gt;&gt; +        contents of a matrix. So the matrix float4x3 will now be an array&lt;float, 12&gt;
&gt;&gt;&gt; 
&gt;&gt;&gt; Why not just consider the matrix to be a container, and make the accessors/mutators do the right thing?
&gt;&gt; 
&gt;&gt; I’m confused what the alternative is. This patch is making it a container (specifically array) and we change the accessors to do the right thing
&gt; 
&gt; Oh, I meant: why are WHLSL matrices represented as MSL nested arrays instead of being represented by MSL matrices? That seem more natural.

they’re not nested arrays. just a flat array.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1552723</commentid>
    <comment_count>18</comment_count>
      <attachid>374068</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2019-07-13 17:54:50 -0700</bug_when>
    <thetext>Comment on attachment 374068
patch

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

&gt;&gt;&gt;&gt;&gt; Source/WebCore/ChangeLog:20
&gt;&gt;&gt;&gt;&gt; +        contents of a matrix. So the matrix float4x3 will now be an array&lt;float, 12&gt;
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; Why not just consider the matrix to be a container, and make the accessors/mutators do the right thing?
&gt;&gt;&gt; 
&gt;&gt;&gt; I’m confused what the alternative is. This patch is making it a container (specifically array) and we change the accessors to do the right thing
&gt;&gt; 
&gt;&gt; Oh, I meant: why are WHLSL matrices represented as MSL nested arrays instead of being represented by MSL matrices? That seem more natural.
&gt; 
&gt; they’re not nested arrays. just a flat array.

Oh, sorry, my bad. I meant “why represent a WHLSL matrix as a MSL array instead of as an MSL matrix?”</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1552754</commentid>
    <comment_count>19</comment_count>
      <attachid>374068</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2019-07-14 13:30:49 -0700</bug_when>
    <thetext>Comment on attachment 374068
patch

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

&gt;&gt;&gt;&gt;&gt;&gt; Source/WebCore/ChangeLog:20
&gt;&gt;&gt;&gt;&gt;&gt; +        contents of a matrix. So the matrix float4x3 will now be an array&lt;float, 12&gt;
&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt; Why not just consider the matrix to be a container, and make the accessors/mutators do the right thing?
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; I’m confused what the alternative is. This patch is making it a container (specifically array) and we change the accessors to do the right thing
&gt;&gt;&gt; 
&gt;&gt;&gt; Oh, I meant: why are WHLSL matrices represented as MSL nested arrays instead of being represented by MSL matrices? That seem more natural.
&gt;&gt; 
&gt;&gt; they’re not nested arrays. just a flat array.
&gt; 
&gt; Oh, sorry, my bad. I meant “why represent a WHLSL matrix as a MSL array instead of as an MSL matrix?”

I think it’s less understandable to take a metal matrix and treat it as a bag of elements that needs to be accessed in a bizarre way. It’s simpler just to have our own bag of bytes and define our own way of indexing into it. It’s one level of weirdness instead of two.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1553016</commentid>
    <comment_count>20</comment_count>
      <attachid>374162</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2019-07-15 16:11:43 -0700</bug_when>
    <thetext>Created attachment 374162
patch for landing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1553103</commentid>
    <comment_count>21</comment_count>
      <attachid>374162</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2019-07-15 20:50:32 -0700</bug_when>
    <thetext>Comment on attachment 374162
patch for landing

Clearing flags on attachment: 374162

Committed r247468: &lt;https://trac.webkit.org/changeset/247468&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1553104</commentid>
    <comment_count>22</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2019-07-15 20:50:33 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1553105</commentid>
    <comment_count>23</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2019-07-15 20:54:01 -0700</bug_when>
    <thetext>&lt;rdar://problem/53136686&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>374068</attachid>
            <date>2019-07-12 19:11:37 -0700</date>
            <delta_ts>2019-07-15 16:11:43 -0700</delta_ts>
            <desc>patch</desc>
            <filename>a-backup.diff</filename>
            <type>text/plain</type>
            <size>16471</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI0NzQxMSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDM0IEBACisyMDE5LTA3LTEyICBTYWFtIEJh
cmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgorCisgICAgICAgIFtXSExTTF0gTWF0cml4IG1lbW9y
eSBsYXlvdXQgc2hvdWxkIG1hdGNoIEhMU0wgYnkgbGF5aW5nIG91dCBjb2x1bW5zIGxpbmVhcmx5
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xOTkyMTUK
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBUaGlzIHBh
dGNoIG1ha2VzIGl0IHNvIHRoYXQgd2UgbGF5IG91dCBtYXRyaWNlcyBpbiBtZW1vcnkgaW4gdGhl
IHNhbWUKKyAgICAgICAgd2F5IEhMU0wgZG9lcy4gVGhpcyBpcyBieSBsYXlpbmcgb3V0IGNvbHVt
bnMgbGluZWFybHkgaW4gbWVtb3J5LiBTbyBhIGZsb2F0NHg0CisgICAgICAgIGJhY2tlZCBieSB0
aGlzIG1lbW9yeToKKyAgICAgICAgWzAsIDQsIDgsIDEyLCAxLCA1LCA5LCAxMywgMiwgNiwgMTAs
IDE0LCAzLCA3LCAxMSwgMTVdCisgICAgICAgIAorICAgICAgICBzaG91bGQgYmUgdGhpcyBtYXRy
aXg6CisgICAgICAgIFtbIDAsICAxLCAgMiwgIDNdCisgICAgICAgICBbIDQsICA1LCAgNiwgIDdd
CisgICAgICAgICBbIDgsICA5LCAxMCwgMTFdCisgICAgICAgICBbMTIsIDEzLCAxNCwgMTVdXQor
ICAgICAgICAKKyAgICAgICAgVG8gaW1wbGVtZW50IHRoaXMsIHdlIHN3aXRjaCB0byB1c2luZyBh
biBhcnJheSB0byByZXByZXNlbnQgdGhlIG1lbW9yeQorICAgICAgICBjb250ZW50cyBvZiBhIG1h
dHJpeC4gU28gdGhlIG1hdHJpeCBmbG9hdDR4MyB3aWxsIG5vdyBiZSBhbiBhcnJheTxmbG9hdCwg
MTI+CisgICAgICAgIGluIG1ldGFsLiBUaGVuLCB3ZSBjaGFuZ2UgdGhlIGluZGV4ZWQgZ2V0dGVy
IGFuZCBzZXR0ZXIgbWV0aG9kcyBmb3IgbWF0cmljZXMKKyAgICAgICAgdG8gbG9hZCBhbmQgc3Rv
cmUgZnJvbSBhbmQgdG8gdGhlIGNvcnJlY3QgbWVtb3J5IGxvY2F0aW9ucy4gVGhlIG1lbW9yeSBs
YXlvdXQKKyAgICAgICAgb2YgbWF0cmljZXMgaXMgb2JzZXJ2YWJsZSB0byBXSExTTCB3aGVuIHVz
aW5nIGZsb2F0NHg0IGlzIGFuIGlucHV0L291dHB1dC4KKworICAgICAgICBUZXN0OiB3ZWJncHUv
d2hsc2wtbWF0cml4LW1lbW9yeS1sYXlvdXQuaHRtbAorCisgICAgICAgICogTW9kdWxlcy93ZWJn
cHUvV0hMU0wvTWV0YWwvV0hMU0xOYXRpdmVGdW5jdGlvbldyaXRlci5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpXSExTTDo6TWV0YWw6OndyaXRlTmF0aXZlRnVuY3Rpb24pOgorICAgICAgICAqIE1v
ZHVsZXMvd2ViZ3B1L1dITFNML01ldGFsL1dITFNMTmF0aXZlVHlwZVdyaXRlci5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpXSExTTDo6TWV0YWw6OndyaXRlTmF0aXZlVHlwZSk6CisKIDIwMTktMDct
MTIgIFRoaWJhdWx0IFNhdW5pZXIgIDx0c2F1bmllckBpZ2FsaWEuY29tPgogCiAgICAgICAgIFtH
U3RyZWFtZXJdIE1vY2sgR1N0cmVhbWVyIHJlYWx0aW1lIHNvdXJjZXMgc2hvdWxkIGtlZXAgYSBS
ZWYgb2YgdGhlaXIgbW9jayByZWFsdGltZSBtZWRpYSBzb3VyY2VzCkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9Nb2R1bGVzL3dlYmdwdS9XSExTTC9NZXRhbC9XSExTTE5hdGl2ZUZ1bmN0aW9uV3JpdGVy
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmdwdS9XSExTTC9N
ZXRhbC9XSExTTE5hdGl2ZUZ1bmN0aW9uV3JpdGVyLmNwcAkocmV2aXNpb24gMjQ3NDEwKQorKysg
U291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJncHUvV0hMU0wvTWV0YWwvV0hMU0xOYXRpdmVGdW5j
dGlvbldyaXRlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI1MCwxMiArMjUwLDIwIEBAIFN0cmlu
ZyB3cml0ZU5hdGl2ZUZ1bmN0aW9uKEFTVDo6TmF0aXZlRnUKICAgICAgICAgcmV0dXJuIHN0cmlu
Z0J1aWxkZXIudG9TdHJpbmcoKTsKICAgICB9CiAKLSAgICBhdXRvIG51bWJlck9mTWF0cml4Um93
cyA9IFsmXSB7CisgICAgYXV0byBudW1iZXJPZk1hdHJpeFJvd3MgPSBbJl0gKCkgLT4gdW5zaWdu
ZWQgewogICAgICAgICBhdXRvJiB0eXBlUmVmZXJlbmNlID0gZG93bmNhc3Q8QVNUOjpUeXBlUmVm
ZXJlbmNlPigqbmF0aXZlRnVuY3Rpb25EZWNsYXJhdGlvbi5wYXJhbWV0ZXJzKClbMF0tPnR5cGUo
KSk7CiAgICAgICAgIGF1dG8mIG1hdHJpeFR5cGUgPSBkb3duY2FzdDxBU1Q6Ok5hdGl2ZVR5cGVE
ZWNsYXJhdGlvbj4oZG93bmNhc3Q8QVNUOjpUeXBlUmVmZXJlbmNlPihkb3duY2FzdDxBU1Q6OlR5
cGVEZWZpbml0aW9uPih0eXBlUmVmZXJlbmNlLnJlc29sdmVkVHlwZSgpKS50eXBlKCkpLnJlc29s
dmVkVHlwZSgpKTsKICAgICAgICAgQVNTRVJUKG1hdHJpeFR5cGUubmFtZSgpID09ICJtYXRyaXgi
KTsKICAgICAgICAgQVNTRVJUKG1hdHJpeFR5cGUudHlwZUFyZ3VtZW50cygpLnNpemUoKSA9PSAz
KTsKLSAgICAgICAgcmV0dXJuIFN0cmluZzo6bnVtYmVyKFdURjo6Z2V0PEFTVDo6Q29uc3RhbnRF
eHByZXNzaW9uPihtYXRyaXhUeXBlLnR5cGVBcmd1bWVudHMoKVsxXSkuaW50ZWdlckxpdGVyYWwo
KS52YWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuIFdURjo6Z2V0PEFTVDo6Q29uc3RhbnRFeHByZXNz
aW9uPihtYXRyaXhUeXBlLnR5cGVBcmd1bWVudHMoKVsxXSkuaW50ZWdlckxpdGVyYWwoKS52YWx1
ZSgpOworICAgIH07CisKKyAgICBhdXRvIG51bWJlck9mTWF0cml4Q29sdW1ucyA9IFsmXSAoKSAt
PiB1bnNpZ25lZCB7CisgICAgICAgIGF1dG8mIHR5cGVSZWZlcmVuY2UgPSBkb3duY2FzdDxBU1Q6
OlR5cGVSZWZlcmVuY2U+KCpuYXRpdmVGdW5jdGlvbkRlY2xhcmF0aW9uLnBhcmFtZXRlcnMoKVsw
XS0+dHlwZSgpKTsKKyAgICAgICAgYXV0byYgbWF0cml4VHlwZSA9IGRvd25jYXN0PEFTVDo6TmF0
aXZlVHlwZURlY2xhcmF0aW9uPihkb3duY2FzdDxBU1Q6OlR5cGVSZWZlcmVuY2U+KGRvd25jYXN0
PEFTVDo6VHlwZURlZmluaXRpb24+KHR5cGVSZWZlcmVuY2UucmVzb2x2ZWRUeXBlKCkpLnR5cGUo
KSkucmVzb2x2ZWRUeXBlKCkpOworICAgICAgICBBU1NFUlQobWF0cml4VHlwZS5uYW1lKCkgPT0g
Im1hdHJpeCIpOworICAgICAgICBBU1NFUlQobWF0cml4VHlwZS50eXBlQXJndW1lbnRzKCkuc2l6
ZSgpID09IDMpOworICAgICAgICByZXR1cm4gV1RGOjpnZXQ8QVNUOjpDb25zdGFudEV4cHJlc3Np
b24+KG1hdHJpeFR5cGUudHlwZUFyZ3VtZW50cygpWzJdKS5pbnRlZ2VyTGl0ZXJhbCgpLnZhbHVl
KCk7CiAgICAgfTsKIAogICAgIGlmIChuYXRpdmVGdW5jdGlvbkRlY2xhcmF0aW9uLm5hbWUoKSA9
PSAib3BlcmF0b3JbXSIpIHsKQEAgLTI2Myw5ICsyNzEsMjAgQEAgU3RyaW5nIHdyaXRlTmF0aXZl
RnVuY3Rpb24oQVNUOjpOYXRpdmVGdQogICAgICAgICBhdXRvIG1ldGFsUGFyYW1ldGVyMU5hbWUg
PSB0eXBlTmFtZXIubWFuZ2xlZE5hbWVGb3JUeXBlKCpuYXRpdmVGdW5jdGlvbkRlY2xhcmF0aW9u
LnBhcmFtZXRlcnMoKVswXS0+dHlwZSgpKTsKICAgICAgICAgYXV0byBtZXRhbFBhcmFtZXRlcjJO
YW1lID0gdHlwZU5hbWVyLm1hbmdsZWROYW1lRm9yVHlwZSgqbmF0aXZlRnVuY3Rpb25EZWNsYXJh
dGlvbi5wYXJhbWV0ZXJzKClbMV0tPnR5cGUoKSk7CiAgICAgICAgIGF1dG8gbWV0YWxSZXR1cm5O
YW1lID0gdHlwZU5hbWVyLm1hbmdsZWROYW1lRm9yVHlwZShuYXRpdmVGdW5jdGlvbkRlY2xhcmF0
aW9uLnR5cGUoKSk7CisKKyAgICAgICAgdW5zaWduZWQgbnVtYmVyT2ZSb3dzID0gbnVtYmVyT2ZN
YXRyaXhSb3dzKCk7CisgICAgICAgIHVuc2lnbmVkIG51bWJlck9mQ29sdW1ucyA9IG51bWJlck9m
TWF0cml4Q29sdW1ucygpOworCiAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKG1ha2VTdHJp
bmcobWV0YWxSZXR1cm5OYW1lLCAnICcsIG91dHB1dEZ1bmN0aW9uTmFtZSwgJygnLCBtZXRhbFBh
cmFtZXRlcjFOYW1lLCAiIG0sICIsIG1ldGFsUGFyYW1ldGVyMk5hbWUsICIgaSkge1xuIikpOwot
ICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZChtYWtlU3RyaW5nKCIgICAgaWYgKGkgPCAiLCBu
dW1iZXJPZk1hdHJpeFJvd3MoKSwgIikgcmV0dXJuIG1baV07XG4iKSk7Ci0gICAgICAgIHN0cmlu
Z0J1aWxkZXIuYXBwZW5kKG1ha2VTdHJpbmcoIiAgICByZXR1cm4gIiwgbWV0YWxSZXR1cm5OYW1l
LCAiKDApO1xuIikpOworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZChtYWtlU3RyaW5nKCIg
ICAgaWYgKGkgPj0gIiwgbnVtYmVyT2ZSb3dzLCAiKSByZXR1cm4gIiwgbWV0YWxSZXR1cm5OYW1l
LCAiKDApO1xuIikpOworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZChtYWtlU3RyaW5nKCIg
ICAgIiwgbWV0YWxSZXR1cm5OYW1lLCAiIHJlc3VsdDtcbiIpKTsKKyAgICAgICAgc3RyaW5nQnVp
bGRlci5hcHBlbmQoIiAgICByZXN1bHRbMF0gPSBtW2ldO1xuIik7CisgICAgICAgIHN0cmluZ0J1
aWxkZXIuYXBwZW5kKG1ha2VTdHJpbmcoIiAgICByZXN1bHRbMV0gPSBtW2kgKyAiLCBudW1iZXJP
ZlJvd3MsICJdO1xuIikpOworICAgICAgICBpZiAobnVtYmVyT2ZDb2x1bW5zID49IDMpCisgICAg
ICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZChtYWtlU3RyaW5nKCIgICAgcmVzdWx0WzJdID0g
bVtpICsgIiwgbnVtYmVyT2ZSb3dzICogMiwgIl07XG4iKSk7CisgICAgICAgIGlmIChudW1iZXJP
ZkNvbHVtbnMgPj0gNCkKKyAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKG1ha2VTdHJp
bmcoIiAgICByZXN1bHRbM10gPSBtW2kgKyAiLCBudW1iZXJPZlJvd3MgKiAzLCAiXTtcbiIpKTsK
KyAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoIiAgICByZXR1cm4gcmVzdWx0O1xuIik7CiAg
ICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCJ9XG4iKTsKICAgICAgICAgcmV0dXJuIHN0cmlu
Z0J1aWxkZXIudG9TdHJpbmcoKTsKICAgICB9CkBAIC0yNzYsOSArMjk1LDE5IEBAIFN0cmluZyB3
cml0ZU5hdGl2ZUZ1bmN0aW9uKEFTVDo6TmF0aXZlRnUKICAgICAgICAgYXV0byBtZXRhbFBhcmFt
ZXRlcjJOYW1lID0gdHlwZU5hbWVyLm1hbmdsZWROYW1lRm9yVHlwZSgqbmF0aXZlRnVuY3Rpb25E
ZWNsYXJhdGlvbi5wYXJhbWV0ZXJzKClbMV0tPnR5cGUoKSk7CiAgICAgICAgIGF1dG8gbWV0YWxQ
YXJhbWV0ZXIzTmFtZSA9IHR5cGVOYW1lci5tYW5nbGVkTmFtZUZvclR5cGUoKm5hdGl2ZUZ1bmN0
aW9uRGVjbGFyYXRpb24ucGFyYW1ldGVycygpWzJdLT50eXBlKCkpOwogICAgICAgICBhdXRvIG1l
dGFsUmV0dXJuTmFtZSA9IHR5cGVOYW1lci5tYW5nbGVkTmFtZUZvclR5cGUobmF0aXZlRnVuY3Rp
b25EZWNsYXJhdGlvbi50eXBlKCkpOworCisgICAgICAgIHVuc2lnbmVkIG51bWJlck9mUm93cyA9
IG51bWJlck9mTWF0cml4Um93cygpOworICAgICAgICB1bnNpZ25lZCBudW1iZXJPZkNvbHVtbnMg
PSBudW1iZXJPZk1hdHJpeENvbHVtbnMoKTsKKwogICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVu
ZChtYWtlU3RyaW5nKG1ldGFsUmV0dXJuTmFtZSwgJyAnLCBvdXRwdXRGdW5jdGlvbk5hbWUsICco
JywgbWV0YWxQYXJhbWV0ZXIxTmFtZSwgIiBtLCAiLCBtZXRhbFBhcmFtZXRlcjJOYW1lLCAiIGks
ICIsIG1ldGFsUGFyYW1ldGVyM05hbWUsICIgdikge1xuIikpOwotICAgICAgICBzdHJpbmdCdWls
ZGVyLmFwcGVuZChtYWtlU3RyaW5nKCIgICAgaWYgKGkgPCAiLCBudW1iZXJPZk1hdHJpeFJvd3Mo
KSwgIikgbVtpXSA9IHY7XG4iKSk7Ci0gICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCIgICAg
cmV0dXJuIG07XG4iKTsKKyAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQobWFrZVN0cmluZygi
ICAgIGlmIChpID49ICIsIG51bWJlck9mUm93cywgIikgcmV0dXJuIG07XG4iKSk7CisgICAgICAg
IHN0cmluZ0J1aWxkZXIuYXBwZW5kKG1ha2VTdHJpbmcoIiAgICBtW2ldID0gdlswXTtcbiIpKTsK
KyAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQobWFrZVN0cmluZygiICAgIG1baSArICIsIG51
bWJlck9mUm93cywgIl0gPSB2WzFdO1xuIikpOworICAgICAgICBpZiAobnVtYmVyT2ZDb2x1bW5z
ID49IDMpCisgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZChtYWtlU3RyaW5nKCIgICAg
bVtpICsgIiwgbnVtYmVyT2ZSb3dzICogMiwgIl0gPSB2WzJdO1xuIikpOworICAgICAgICBpZiAo
bnVtYmVyT2ZDb2x1bW5zID49IDQpCisgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCht
YWtlU3RyaW5nKCIgICAgbVtpICsgIiwgbnVtYmVyT2ZSb3dzICogMywgIl0gPSB2WzNdO1xuIikp
OworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgiICAgIHJldHVybiBtOyIpOwogICAgICAg
ICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgifVxuIik7CiAgICAgICAgIHJldHVybiBzdHJpbmdCdWls
ZGVyLnRvU3RyaW5nKCk7CiAgICAgfQpJbmRleDogU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJn
cHUvV0hMU0wvTWV0YWwvV0hMU0xOYXRpdmVUeXBlV3JpdGVyLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmdwdS9XSExTTC9NZXRhbC9XSExTTE5hdGl2ZVR5cGVX
cml0ZXIuY3BwCShyZXZpc2lvbiAyNDc0MTApCisrKyBTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dl
YmdwdS9XSExTTC9NZXRhbC9XSExTTE5hdGl2ZVR5cGVXcml0ZXIuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0xMjIsMzUgKzEyMiwxOSBAQCBTdHJpbmcgd3JpdGVOYXRpdmVUeXBlKEFTVDo6TmF0aXZl
VHlwZURlCiAgICAgICAgICAgICBBU1NFUlQocGFyYW1ldGVyVHlwZS5uYW1lKCkgPT0gImZsb2F0
Iik7CiAgICAgICAgICAgICByZXR1cm4gImZsb2F0IjsKICAgICAgICAgfSkoKTsKKwogICAgICAg
ICBBU1NFUlQoV1RGOjpob2xkc19hbHRlcm5hdGl2ZTxBU1Q6OkNvbnN0YW50RXhwcmVzc2lvbj4o
bmF0aXZlVHlwZURlY2xhcmF0aW9uLnR5cGVBcmd1bWVudHMoKVsxXSkpOwogICAgICAgICBhdXRv
JiBjb25zdGFudEV4cHJlc3Npb24xID0gV1RGOjpnZXQ8QVNUOjpDb25zdGFudEV4cHJlc3Npb24+
KG5hdGl2ZVR5cGVEZWNsYXJhdGlvbi50eXBlQXJndW1lbnRzKClbMV0pOwogICAgICAgICBhdXRv
JiBpbnRlZ2VyTGl0ZXJhbDEgPSBjb25zdGFudEV4cHJlc3Npb24xLmludGVnZXJMaXRlcmFsKCk7
Ci0gICAgICAgIGF1dG8gbWlkZGxlID0gKFsmXSgpIC0+IFN0cmluZyB7Ci0gICAgICAgICAgICBz
d2l0Y2ggKGludGVnZXJMaXRlcmFsMS52YWx1ZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIDI6Ci0g
ICAgICAgICAgICAgICAgcmV0dXJuICIyIl9zdHI7Ci0gICAgICAgICAgICBjYXNlIDM6Ci0gICAg
ICAgICAgICAgICAgcmV0dXJuICIzIl9zdHI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAg
ICAgICAgICAgIEFTU0VSVChpbnRlZ2VyTGl0ZXJhbDEudmFsdWUoKSA9PSA0KTsKLSAgICAgICAg
ICAgICAgICByZXR1cm4gIjQiX3N0cjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSkoKTsKKyAg
ICAgICAgdW5zaWduZWQgcm93cyA9IGludGVnZXJMaXRlcmFsMS52YWx1ZSgpOworICAgICAgICBB
U1NFUlQocm93cyA9PSAyIHx8IHJvd3MgPT0gMyB8fCByb3dzID09IDQpOworCiAgICAgICAgIEFT
U0VSVChXVEY6OmhvbGRzX2FsdGVybmF0aXZlPEFTVDo6Q29uc3RhbnRFeHByZXNzaW9uPihuYXRp
dmVUeXBlRGVjbGFyYXRpb24udHlwZUFyZ3VtZW50cygpWzJdKSk7CiAgICAgICAgIGF1dG8mIGNv
bnN0YW50RXhwcmVzc2lvbjIgPSBXVEY6OmdldDxBU1Q6OkNvbnN0YW50RXhwcmVzc2lvbj4obmF0
aXZlVHlwZURlY2xhcmF0aW9uLnR5cGVBcmd1bWVudHMoKVsyXSk7CiAgICAgICAgIGF1dG8mIGlu
dGVnZXJMaXRlcmFsMiA9IGNvbnN0YW50RXhwcmVzc2lvbjIuaW50ZWdlckxpdGVyYWwoKTsKLSAg
ICAgICAgYXV0byBzdWZmaXggPSAoWyZdKCkgLT4gU3RyaW5nIHsKLSAgICAgICAgICAgIHN3aXRj
aCAoaW50ZWdlckxpdGVyYWwyLnZhbHVlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAg
ICAgICAgICAgICByZXR1cm4gIjIiX3N0cjsKLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAg
ICAgICAgICByZXR1cm4gIjMiX3N0cjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAg
ICAgICAgQVNTRVJUKGludGVnZXJMaXRlcmFsMi52YWx1ZSgpID09IDQpOwotICAgICAgICAgICAg
ICAgIHJldHVybiAiNCJfc3RyOwotICAgICAgICAgICAgfQotICAgICAgICB9KSgpOwotICAgICAg
ICByZXR1cm4gbWFrZVN0cmluZyhwcmVmaXgsIG1pZGRsZSwgJ3gnLCBzdWZmaXgpOworICAgICAg
ICB1bnNpZ25lZCBjb2x1bW5zID0gaW50ZWdlckxpdGVyYWwyLnZhbHVlKCk7CisgICAgICAgIEFT
U0VSVChjb2x1bW5zID09IDIgfHwgY29sdW1ucyA9PSAzIHx8IGNvbHVtbnMgPT0gNCk7CisgICAg
ICAgIHJldHVybiBtYWtlU3RyaW5nKCJhcnJheTwiLCBwcmVmaXgsICIsICIsIGNvbHVtbnMgKiBy
b3dzLCAiPiIpOwogICAgIH0KICAgICBBU1NFUlQobmF0aXZlVHlwZURlY2xhcmF0aW9uLnR5cGVB
cmd1bWVudHMoKS5zaXplKCkgPT0gMSk7CiAgICAgQVNTRVJUKFdURjo6aG9sZHNfYWx0ZXJuYXRp
dmU8VW5pcXVlUmVmPEFTVDo6VHlwZVJlZmVyZW5jZT4+KG5hdGl2ZVR5cGVEZWNsYXJhdGlvbi50
eXBlQXJndW1lbnRzKClbMF0pKTsKSW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDI0NzQxMCkKKysrIExheW91
dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE0IEBACisyMDE5LTA3
LTEyICBTYWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgorCisgICAgICAgIFtXSExTTF0g
TWF0cml4IG1lbW9yeSBsYXlvdXQgc2hvdWxkIG1hdGNoIEhMU0wgYnkgbGF5aW5nIG91dCBjb2x1
bW5zIGxpbmVhcmx5CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD0xOTkyMTUKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAg
ICAgICAqIHdlYmdwdS93aGxzbC1tYXRyaXgtbWVtb3J5LWxheW91dC1leHBlY3RlZC50eHQ6IEFk
ZGVkLgorICAgICAgICAqIHdlYmdwdS93aGxzbC1tYXRyaXgtbWVtb3J5LWxheW91dC5odG1sOiBB
ZGRlZC4KKyAgICAgICAgKiB3ZWJncHUvd2hsc2wtdGVzdC1oYXJuZXNzLXRlc3QuaHRtbDoKKwog
MjAxOS0wNy0xMiAgWW91ZW5uIEZhYmxldCAgPHlvdWVubkBhcHBsZS5jb20+CiAKICAgICAgICAg
U3RvcHBpbmcgYSBjbG9uZWQgTWVkaWFTdHJlYW0gdmlkZW8gdHJhY2sgc2hvdWxkIG5vdCBzdG9w
IGFueSBvdGhlciB2aWRlbyB0cmFjawpJbmRleDogTGF5b3V0VGVzdHMvd2ViZ3B1L3dobHNsLW1h
dHJpeC1tZW1vcnktbGF5b3V0LWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0
cy93ZWJncHUvd2hsc2wtbWF0cml4LW1lbW9yeS1sYXlvdXQtZXhwZWN0ZWQudHh0CShub25leGlz
dGVudCkKKysrIExheW91dFRlc3RzL3dlYmdwdS93aGxzbC1tYXRyaXgtbWVtb3J5LWxheW91dC1l
eHBlY3RlZC50eHQJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1IEBACitQQVNTIAorUEFTUyBz
dWNjZXNzZnVsbHlQYXJzZWQgaXMgdHJ1ZQorCitURVNUIENPTVBMRVRFCisKSW5kZXg6IExheW91
dFRlc3RzL3dlYmdwdS93aGxzbC1tYXRyaXgtbWVtb3J5LWxheW91dC5odG1sCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIExheW91dFRlc3RzL3dlYmdwdS93aGxzbC1tYXRyaXgtbWVtb3J5LWxheW91dC5odG1sCShu
b25leGlzdGVudCkKKysrIExheW91dFRlc3RzL3dlYmdwdS93aGxzbC1tYXRyaXgtbWVtb3J5LWxh
eW91dC5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTM5IEBACis8IURPQ1RZUEUgaHRt
bD4KKzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0IHNyYz0ianMvd2ViZ3B1LWZ1bmN0aW9ucy5qcyI+
PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3Nj
cmlwdD4KKzwvaGVhZD4KKzxib2R5PgorPHNjcmlwdD4KK2NvbnN0IHNoYWRlclNvdXJjZSA9IGAK
K1tudW10aHJlYWRzKDEsIDEsIDEpXQorY29tcHV0ZSB2b2lkIGNvbXB1dGVTaGFkZXIoZGV2aWNl
IGZsb2F0NHg0W10gYnVmZmVyIDogcmVnaXN0ZXIodTApLCBmbG9hdDMgdGhyZWFkSUQgOiBTVl9E
aXNwYXRjaFRocmVhZElEKSB7CisgICAgZmxvYXQ0eDQgcmVzdWx0OworICAgIHJlc3VsdFswXSA9
IGZsb2F0NCgxLCAyLCAzLCA0KTsKKyAgICByZXN1bHRbMV0gPSBmbG9hdDQoNSwgNiwgNywgOCk7
CisgICAgcmVzdWx0WzJdID0gZmxvYXQ0KDksIDEwLCAxMSwgMTIpOworICAgIHJlc3VsdFszXSA9
IGZsb2F0NCgxMywgMTQsIDE1LCAxNik7CisKKyAgICBmbG9hdDR4NCBtYXQgPSBidWZmZXJbMF07
CisKKyAgICBpZiAobWF0WzBdWzBdID09IDAKKyAgICAgICAgJiYgbWF0WzBdWzFdID09IDEKKyAg
ICAgICAgJiYgbWF0WzBdWzJdID09IDIKKyAgICAgICAgJiYgbWF0WzBdWzNdID09IDMKKworICAg
ICAgICAmJiBtYXRbMV1bMF0gPT0gNAorICAgICAgICAmJiBtYXRbMV1bMV0gPT0gNQorICAgICAg
ICAmJiBtYXRbMV1bMl0gPT0gNgorICAgICAgICAmJiBtYXRbMV1bM10gPT0gNworCisgICAgICAg
ICYmIG1hdFsyXVswXSA9PSA4CisgICAgICAgICYmIG1hdFsyXVsxXSA9PSA5CisgICAgICAgICYm
IG1hdFsyXVsyXSA9PSAxMAorICAgICAgICAmJiBtYXRbMl1bM10gPT0gMTEKKworICAgICAgICAm
JiBtYXRbM11bMF0gPT0gMTIKKyAgICAgICAgJiYgbWF0WzNdWzFdID09IDEzCisgICAgICAgICYm
IG1hdFszXVsyXSA9PSAxNAorICAgICAgICAmJiBtYXRbM11bM10gPT0gMTUpIHsKKyAgICAgICAg
YnVmZmVyWzBdID0gcmVzdWx0OworICAgIH0KK30KK2A7CisKK2FzeW5jIGZ1bmN0aW9uIHN0YXJ0
KGRldmljZSkgeworICAgIGNvbnN0IHNoYWRlck1vZHVsZSA9IGRldmljZS5jcmVhdGVTaGFkZXJN
b2R1bGUoe2NvZGU6IHNoYWRlclNvdXJjZSwgaXNXSExTTDogdHJ1ZX0pOworICAgIGNvbnN0IGNv
bXB1dGVTdGFnZSA9IHttb2R1bGU6IHNoYWRlck1vZHVsZSwgZW50cnlQb2ludDogImNvbXB1dGVT
aGFkZXIifTsKKworICAgIGNvbnN0IGJpbmRHcm91cExheW91dERlc2NyaXB0b3IgPSB7YmluZGlu
Z3M6IFt7YmluZGluZzogMCwgdmlzaWJpbGl0eTogNywgdHlwZTogInN0b3JhZ2UtYnVmZmVyIn1d
fTsKKyAgICBjb25zdCBiaW5kR3JvdXBMYXlvdXQgPSBkZXZpY2UuY3JlYXRlQmluZEdyb3VwTGF5
b3V0KGJpbmRHcm91cExheW91dERlc2NyaXB0b3IpOworICAgIGNvbnN0IHBpcGVsaW5lTGF5b3V0
RGVzY3JpcHRvciA9IHtiaW5kR3JvdXBMYXlvdXRzOiBbYmluZEdyb3VwTGF5b3V0XX07CisgICAg
Y29uc3QgcGlwZWxpbmVMYXlvdXQgPSBkZXZpY2UuY3JlYXRlUGlwZWxpbmVMYXlvdXQocGlwZWxp
bmVMYXlvdXREZXNjcmlwdG9yKTsKKworICAgIGNvbnN0IGNvbXB1dGVQaXBlbGluZURlc2NyaXB0
b3IgPSB7Y29tcHV0ZVN0YWdlLCBsYXlvdXQ6IHBpcGVsaW5lTGF5b3V0fTsKKyAgICBjb25zdCBj
b21wdXRlUGlwZWxpbmUgPSBkZXZpY2UuY3JlYXRlQ29tcHV0ZVBpcGVsaW5lKGNvbXB1dGVQaXBl
bGluZURlc2NyaXB0b3IpOworCisgICAgY29uc3Qgc2l6ZSA9IEZsb2F0MzJBcnJheS5CWVRFU19Q
RVJfRUxFTUVOVCAqIDE2OworCisgICAgY29uc3QgYnVmZmVyRGVzY3JpcHRvciA9IHtzaXplLCB1
c2FnZTogR1BVQnVmZmVyVXNhZ2UuTUFQX1dSSVRFIHwgR1BVQnVmZmVyVXNhZ2UuVFJBTlNGRVJf
U1JDfTsKKyAgICBjb25zdCBidWZmZXIgPSBkZXZpY2UuY3JlYXRlQnVmZmVyKGJ1ZmZlckRlc2Ny
aXB0b3IpOworICAgIGNvbnN0IGJ1ZmZlckFycmF5QnVmZmVyID0gYXdhaXQgYnVmZmVyLm1hcFdy
aXRlQXN5bmMoKTsKKyAgICBjb25zdCBidWZmZXJGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFy
cmF5KGJ1ZmZlckFycmF5QnVmZmVyKTsKKyAgICBidWZmZXJGbG9hdDMyQXJyYXlbMF0gPSAwOwor
ICAgIGJ1ZmZlckZsb2F0MzJBcnJheVsxXSA9IDQ7CisgICAgYnVmZmVyRmxvYXQzMkFycmF5WzJd
ID0gODsKKyAgICBidWZmZXJGbG9hdDMyQXJyYXlbM10gPSAxMjsKKyAgICBidWZmZXJGbG9hdDMy
QXJyYXlbNF0gPSAxOworICAgIGJ1ZmZlckZsb2F0MzJBcnJheVs1XSA9IDU7CisgICAgYnVmZmVy
RmxvYXQzMkFycmF5WzZdID0gOTsKKyAgICBidWZmZXJGbG9hdDMyQXJyYXlbN10gPSAxMzsKKyAg
ICBidWZmZXJGbG9hdDMyQXJyYXlbOF0gPSAyOworICAgIGJ1ZmZlckZsb2F0MzJBcnJheVs5XSA9
IDY7CisgICAgYnVmZmVyRmxvYXQzMkFycmF5WzEwXSA9IDEwOworICAgIGJ1ZmZlckZsb2F0MzJB
cnJheVsxMV0gPSAxNDsKKyAgICBidWZmZXJGbG9hdDMyQXJyYXlbMTJdID0gMzsKKyAgICBidWZm
ZXJGbG9hdDMyQXJyYXlbMTNdID0gNzsKKyAgICBidWZmZXJGbG9hdDMyQXJyYXlbMTRdID0gMTE7
CisgICAgYnVmZmVyRmxvYXQzMkFycmF5WzE1XSA9IDE1OworICAgIGJ1ZmZlci51bm1hcCgpOwor
CisgICAgY29uc3QgcmVzdWx0c0J1ZmZlckRlc2NyaXB0b3IgPSB7c2l6ZSwgdXNhZ2U6IEdQVUJ1
ZmZlclVzYWdlLlNUT1JBR0UgfCBHUFVCdWZmZXJVc2FnZS5UUkFOU0ZFUl9EU1QgfCBHUFVCdWZm
ZXJVc2FnZS5NQVBfUkVBRH07CisgICAgY29uc3QgcmVzdWx0c0J1ZmZlciA9IGRldmljZS5jcmVh
dGVCdWZmZXIocmVzdWx0c0J1ZmZlckRlc2NyaXB0b3IpOworCisgICAgY29uc3QgYnVmZmVyQmlu
ZGluZyA9IHtidWZmZXI6IHJlc3VsdHNCdWZmZXIsIHNpemV9OworICAgIGNvbnN0IGJpbmRHcm91
cEJpbmRpbmcgPSB7YmluZGluZzogMCwgcmVzb3VyY2U6IGJ1ZmZlckJpbmRpbmd9OworICAgIGNv
bnN0IGJpbmRHcm91cERlc2NyaXB0b3IgPSB7bGF5b3V0OiBiaW5kR3JvdXBMYXlvdXQsIGJpbmRp
bmdzOiBbYmluZEdyb3VwQmluZGluZ119OworICAgIGNvbnN0IGJpbmRHcm91cCA9IGRldmljZS5j
cmVhdGVCaW5kR3JvdXAoYmluZEdyb3VwRGVzY3JpcHRvcik7CisKKyAgICBjb25zdCBjb21tYW5k
RW5jb2RlciA9IGRldmljZS5jcmVhdGVDb21tYW5kRW5jb2RlcigpOyAvLyB7fQorICAgIGNvbW1h
bmRFbmNvZGVyLmNvcHlCdWZmZXJUb0J1ZmZlcihidWZmZXIsIDAsIHJlc3VsdHNCdWZmZXIsIDAs
IHNpemUpOworICAgIGNvbnN0IGNvbXB1dGVQYXNzRW5jb2RlciA9IGNvbW1hbmRFbmNvZGVyLmJl
Z2luQ29tcHV0ZVBhc3MoKTsKKyAgICBjb21wdXRlUGFzc0VuY29kZXIuc2V0UGlwZWxpbmUoY29t
cHV0ZVBpcGVsaW5lKTsKKyAgICBjb21wdXRlUGFzc0VuY29kZXIuc2V0QmluZEdyb3VwKDAsIGJp
bmRHcm91cCk7CisgICAgY29tcHV0ZVBhc3NFbmNvZGVyLmRpc3BhdGNoKDIsIDEsIDEpOworICAg
IGNvbXB1dGVQYXNzRW5jb2Rlci5lbmRQYXNzKCk7CisgICAgY29uc3QgY29tbWFuZEJ1ZmZlciA9
IGNvbW1hbmRFbmNvZGVyLmZpbmlzaCgpOworICAgIGRldmljZS5nZXRRdWV1ZSgpLnN1Ym1pdChb
Y29tbWFuZEJ1ZmZlcl0pOworCisgICAgY29uc3QgcmVzdWx0c0FycmF5QnVmZmVyID0gYXdhaXQg
cmVzdWx0c0J1ZmZlci5tYXBSZWFkQXN5bmMoKTsKKyAgICBjb25zdCByZXN1bHRzRmxvYXQzMkFy
cmF5ID0gbmV3IEZsb2F0MzJBcnJheShyZXN1bHRzQXJyYXlCdWZmZXIpOworICAgIGlmIChyZXN1
bHRzRmxvYXQzMkFycmF5WzBdID09PSAxCisgICAgICAgICYmIHJlc3VsdHNGbG9hdDMyQXJyYXlb
MV0gPT09IDUKKyAgICAgICAgJiYgcmVzdWx0c0Zsb2F0MzJBcnJheVsyXSA9PT0gOQorICAgICAg
ICAmJiByZXN1bHRzRmxvYXQzMkFycmF5WzNdID09PSAxMworCisgICAgICAgICYmIHJlc3VsdHNG
bG9hdDMyQXJyYXlbNF0gPT09IDIKKyAgICAgICAgJiYgcmVzdWx0c0Zsb2F0MzJBcnJheVs1XSA9
PT0gNgorICAgICAgICAmJiByZXN1bHRzRmxvYXQzMkFycmF5WzZdID09PSAxMAorICAgICAgICAm
JiByZXN1bHRzRmxvYXQzMkFycmF5WzddID09PSAxNAorCisgICAgICAgICYmIHJlc3VsdHNGbG9h
dDMyQXJyYXlbOF0gPT09IDMKKyAgICAgICAgJiYgcmVzdWx0c0Zsb2F0MzJBcnJheVs5XSA9PT0g
NworICAgICAgICAmJiByZXN1bHRzRmxvYXQzMkFycmF5WzEwXSA9PT0gMTEKKyAgICAgICAgJiYg
cmVzdWx0c0Zsb2F0MzJBcnJheVsxMV0gPT09IDE1CisKKyAgICAgICAgJiYgcmVzdWx0c0Zsb2F0
MzJBcnJheVsxMl0gPT09IDQKKyAgICAgICAgJiYgcmVzdWx0c0Zsb2F0MzJBcnJheVsxM10gPT09
IDgKKyAgICAgICAgJiYgcmVzdWx0c0Zsb2F0MzJBcnJheVsxNF0gPT09IDEyCisgICAgICAgICYm
IHJlc3VsdHNGbG9hdDMyQXJyYXlbMTVdID09PSAxNikKKyAgICAgICAgdGVzdFBhc3NlZCgiIik7
CisgICAgZWxzZQorICAgICAgICB0ZXN0RmFpbGVkKCIiKTsKKyAgICByZXN1bHRzQnVmZmVyLnVu
bWFwKCk7Cit9Cit3aW5kb3cuanNUZXN0SXNBc3luYyA9IHRydWU7CitnZXRCYXNpY0RldmljZSgp
LnRoZW4oZnVuY3Rpb24oZGV2aWNlKSB7CisgICAgc3RhcnQoZGV2aWNlKS50aGVuKGZ1bmN0aW9u
KCkgeworICAgICAgICBmaW5pc2hKU1Rlc3QoKTsKKyAgICB9LCBmdW5jdGlvbigpIHsKKyAgICAg
ICAgdGVzdEZhaWxlZCgiIik7CisgICAgICAgIGZpbmlzaEpTVGVzdCgpOworICAgIH0pOworfSwg
ZnVuY3Rpb24oKSB7CisgICAgdGVzdFBhc3NlZCgiIik7CisgICAgZmluaXNoSlNUZXN0KCk7Cit9
KTsKKzwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii4uL3Jlc291cmNlcy9qcy10ZXN0LXBvc3QuanMi
Pjwvc2NyaXB0PgorPC9ib2R5PgorPC9odG1sPgpJbmRleDogTGF5b3V0VGVzdHMvd2ViZ3B1L3do
bHNsLXRlc3QtaGFybmVzcy10ZXN0Lmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvd2Vi
Z3B1L3dobHNsLXRlc3QtaGFybmVzcy10ZXN0Lmh0bWwJKHJldmlzaW9uIDI0NzQxMCkKKysrIExh
eW91dFRlc3RzL3dlYmdwdS93aGxzbC10ZXN0LWhhcm5lc3MtdGVzdC5odG1sCSh3b3JraW5nIGNv
cHkpCkBAIC00Miw4ICs0Miw5IEBAIGNvbnN0IGFycmF5QXJnTWFrZXJzID0gewogICAgICJmbG9h
dDR4NCI6IG1ha2VGbG9hdDR4NAogfTsKIAotY29uc3QgZmxvYXQ0eDRleHBlY3RlZCA9IFswLCAx
LCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1XTsKLWNvbnN0
IGZsb2F0NGV4cGVjdGVkID0gZmxvYXQ0eDRleHBlY3RlZC5zbGljZSgwLCA0KTsKK2NvbnN0IGZs
b2F0NHg0ZXhwZWN0ZWQgPSBbMCwgNCwgOCwgMTIsIDEsIDUsIDksIDEzLCAyLCA2LCAxMCwgMTQs
IDMsIDcsIDExLCAxNV07Citjb25zdCBmbG9hdDR4NENvbHVtbkV4cGVjdGVkID0gWzAsIDEsIDIs
IDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTVdOworY29uc3QgZmxv
YXQ0ZXhwZWN0ZWQgPSBbMCwgMSwgMiwgM107CiAKIGxldCB3aGxzbFRlc3RzID0ge307CiAKQEAg
LTE3Miw3ICsxNzMsNyBAQCB3aGxzbFRlc3RzLmZsb2F0NHg0dGVzdHMgPSAoKSA9PiB7CiAgICAg
ICAgIGFyZ1tpXSA9IGk7CiAgICAgICAgIG11bHRpcGxlNHg0YXJncy5wdXNoKGFyZyk7CiAgICAg
fQotICAgIGNoZWNrQXJyYXlzKCJmbG9hdDR4NCIsICJyZXR1cm4gaW4wICsgaW4xICsgaW4yICsg
aW4zICsgaW40ICsgaW41ICsgaW42ICsgaW43ICsgaW44ICsgaW45ICsgaW4xMCArIGluMTEgKyBp
bjEyICsgaW4xMyArIGluMTQgKyBpbjE1OyIsIG11bHRpcGxlNHg0YXJncywgZmxvYXQ0eDRleHBl
Y3RlZCk7CisgICAgY2hlY2tBcnJheXMoImZsb2F0NHg0IiwgInJldHVybiBpbjAgKyBpbjEgKyBp
bjIgKyBpbjMgKyBpbjQgKyBpbjUgKyBpbjYgKyBpbjcgKyBpbjggKyBpbjkgKyBpbjEwICsgaW4x
MSArIGluMTIgKyBpbjEzICsgaW4xNCArIGluMTU7IiwgbXVsdGlwbGU0eDRhcmdzLCBmbG9hdDR4
NENvbHVtbkV4cGVjdGVkKTsKICAgICBjaGVja0FycmF5cygiZmxvYXQ0eDQiLCAicmV0dXJuIGlu
MFswXTsiLCBbW2Zsb2F0NHg0ZXhwZWN0ZWRdXSwgZmxvYXQ0eDRleHBlY3RlZCk7CiB9OwogCg==
</data>
<flag name="review"
          id="389872"
          type_id="1"
          status="+"
          setter="mmaxfield"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>374162</attachid>
            <date>2019-07-15 16:11:43 -0700</date>
            <delta_ts>2019-07-15 20:50:32 -0700</delta_ts>
            <desc>patch for landing</desc>
            <filename>a-backup.diff</filename>
            <type>text/plain</type>
            <size>16183</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI0NzQxMSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDM1IEBACisyMDE5LTA3LTEyICBTYWFtIEJh
cmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgorCisgICAgICAgIFtXSExTTF0gTWF0cml4IG1lbW9y
eSBsYXlvdXQgc2hvdWxkIG1hdGNoIEhMU0wgYnkgbGF5aW5nIG91dCBjb2x1bW5zIGxpbmVhcmx5
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xOTkyMTUK
KworICAgICAgICBSZXZpZXdlZCBieSBNeWxlcyBDLiBNYXhmaWVsZC4KKworICAgICAgICBUaGlz
IHBhdGNoIG1ha2VzIGl0IHNvIHRoYXQgd2UgbGF5IG91dCBtYXRyaWNlcyBpbiBtZW1vcnkgaW4g
dGhlIHNhbWUKKyAgICAgICAgd2F5IEhMU0wgZG9lcy4gVGhpcyBpcyBieSBsYXlpbmcgb3V0IGNv
bHVtbnMgbGluZWFybHkgaW4gbWVtb3J5LiBTbyBhIGZsb2F0NHg0CisgICAgICAgIGNvbXBvc2Vk
IGJ5IHRoaXMgc2VyaWVzIG9mIGZsb2F0cyBpbiBtZW1vcnk6CisgICAgICAgIFswLCAxLCAyLCAz
LCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1XQorICAgICAgICAKKyAg
ICAgICAgY29tcG9zZXMgdGhpcyBsb2dpY2FsIG1hdHJpeDoKKyAgICAgICAgW1sgMCwgIDQsICA4
LCAxMl0KKyAgICAgICAgIFsgMSwgIDUsICA5LCAxM10KKyAgICAgICAgIFsgMiwgIDYsIDEwLCAx
NF0KKyAgICAgICAgIFsgMywgIDcsIDExLCAxNV1dCisgICAgICAgIAorICAgICAgICBUbyBpbXBs
ZW1lbnQgdGhpcywgd2Ugc3dpdGNoIHRvIHVzaW5nIGFuIGFycmF5IHRvIHJlcHJlc2VudCB0aGUg
bWVtb3J5CisgICAgICAgIGNvbnRlbnRzIGxpbmVhciBtZW1vcnkgbGF5b3V0IG9mIGEgbWF0cml4
LiBTbyB0aGUgbWF0cml4IGZsb2F0NHgzIHdpbGwgbm93CisgICAgICAgIGJlIGFuIGFycmF5PGZs
b2F0LCAxMj4gaW4gbWV0YWwuIFRoZW4sIHdlIGNoYW5nZSB0aGUgaW5kZXhlZCBnZXR0ZXIgYW5k
CisgICAgICAgIHNldHRlciBtZXRob2RzIGZvciBtYXRyaWNlcyB0byBsb2FkIGFuZCBzdG9yZSBm
cm9tIGFuZCB0byB0aGUgY29ycmVjdAorICAgICAgICBtZW1vcnkgbG9jYXRpb25zLiBUaGUgbWVt
b3J5IGxheW91dCBvZiBtYXRyaWNlcyBpcyBvYnNlcnZhYmxlIHRvIFdITFNMCisgICAgICAgIHdo
ZW4gdXNpbmcgYSBtYXRyaXggYXMgYW4gaW5wdXQvb3V0cHV0IHRvIGEgc2hhZGVyLgorCisgICAg
ICAgIFRlc3Q6IHdlYmdwdS93aGxzbC1tYXRyaXgtbWVtb3J5LWxheW91dC5odG1sCisKKyAgICAg
ICAgKiBNb2R1bGVzL3dlYmdwdS9XSExTTC9NZXRhbC9XSExTTE5hdGl2ZUZ1bmN0aW9uV3JpdGVy
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OldITFNMOjpNZXRhbDo6d3JpdGVOYXRpdmVGdW5jdGlv
bik6CisgICAgICAgICogTW9kdWxlcy93ZWJncHUvV0hMU0wvTWV0YWwvV0hMU0xOYXRpdmVUeXBl
V3JpdGVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OldITFNMOjpNZXRhbDo6d3JpdGVOYXRpdmVU
eXBlKToKKwogMjAxOS0wNy0xMiAgVGhpYmF1bHQgU2F1bmllciAgPHRzYXVuaWVyQGlnYWxpYS5j
b20+CiAKICAgICAgICAgW0dTdHJlYW1lcl0gTW9jayBHU3RyZWFtZXIgcmVhbHRpbWUgc291cmNl
cyBzaG91bGQga2VlcCBhIFJlZiBvZiB0aGVpciBtb2NrIHJlYWx0aW1lIG1lZGlhIHNvdXJjZXMK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViZ3B1L1dITFNML01ldGFsL1dITFNMTmF0
aXZlRnVuY3Rpb25Xcml0ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL01vZHVs
ZXMvd2ViZ3B1L1dITFNML01ldGFsL1dITFNMTmF0aXZlRnVuY3Rpb25Xcml0ZXIuY3BwCShyZXZp
c2lvbiAyNDc0MTApCisrKyBTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmdwdS9XSExTTC9NZXRh
bC9XSExTTE5hdGl2ZUZ1bmN0aW9uV3JpdGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjUwLDEy
ICsyNTAsMTggQEAgU3RyaW5nIHdyaXRlTmF0aXZlRnVuY3Rpb24oQVNUOjpOYXRpdmVGdQogICAg
ICAgICByZXR1cm4gc3RyaW5nQnVpbGRlci50b1N0cmluZygpOwogICAgIH0KIAotICAgIGF1dG8g
bnVtYmVyT2ZNYXRyaXhSb3dzID0gWyZdIHsKKyAgICBhdXRvIG1hdHJpeERpbWVuc2lvbiA9IFsm
XSAodW5zaWduZWQgdHlwZUFyZ3VtZW50SW5kZXgpIC0+IHVuc2lnbmVkIHsKICAgICAgICAgYXV0
byYgdHlwZVJlZmVyZW5jZSA9IGRvd25jYXN0PEFTVDo6VHlwZVJlZmVyZW5jZT4oKm5hdGl2ZUZ1
bmN0aW9uRGVjbGFyYXRpb24ucGFyYW1ldGVycygpWzBdLT50eXBlKCkpOwogICAgICAgICBhdXRv
JiBtYXRyaXhUeXBlID0gZG93bmNhc3Q8QVNUOjpOYXRpdmVUeXBlRGVjbGFyYXRpb24+KGRvd25j
YXN0PEFTVDo6VHlwZVJlZmVyZW5jZT4oZG93bmNhc3Q8QVNUOjpUeXBlRGVmaW5pdGlvbj4odHlw
ZVJlZmVyZW5jZS5yZXNvbHZlZFR5cGUoKSkudHlwZSgpKS5yZXNvbHZlZFR5cGUoKSk7CiAgICAg
ICAgIEFTU0VSVChtYXRyaXhUeXBlLm5hbWUoKSA9PSAibWF0cml4Iik7CiAgICAgICAgIEFTU0VS
VChtYXRyaXhUeXBlLnR5cGVBcmd1bWVudHMoKS5zaXplKCkgPT0gMyk7Ci0gICAgICAgIHJldHVy
biBTdHJpbmc6Om51bWJlcihXVEY6OmdldDxBU1Q6OkNvbnN0YW50RXhwcmVzc2lvbj4obWF0cml4
VHlwZS50eXBlQXJndW1lbnRzKClbMV0pLmludGVnZXJMaXRlcmFsKCkudmFsdWUoKSk7CisgICAg
ICAgIHJldHVybiBXVEY6OmdldDxBU1Q6OkNvbnN0YW50RXhwcmVzc2lvbj4obWF0cml4VHlwZS50
eXBlQXJndW1lbnRzKClbdHlwZUFyZ3VtZW50SW5kZXhdKS5pbnRlZ2VyTGl0ZXJhbCgpLnZhbHVl
KCk7CisgICAgfTsKKyAgICBhdXRvIG51bWJlck9mTWF0cml4Um93cyA9IFsmXSB7CisgICAgICAg
IHJldHVybiBtYXRyaXhEaW1lbnNpb24oMSk7CisgICAgfTsKKyAgICBhdXRvIG51bWJlck9mTWF0
cml4Q29sdW1ucyA9IFsmXSB7CisgICAgICAgIHJldHVybiBtYXRyaXhEaW1lbnNpb24oMik7CiAg
ICAgfTsKIAogICAgIGlmIChuYXRpdmVGdW5jdGlvbkRlY2xhcmF0aW9uLm5hbWUoKSA9PSAib3Bl
cmF0b3JbXSIpIHsKQEAgLTI2Myw5ICsyNjksMjAgQEAgU3RyaW5nIHdyaXRlTmF0aXZlRnVuY3Rp
b24oQVNUOjpOYXRpdmVGdQogICAgICAgICBhdXRvIG1ldGFsUGFyYW1ldGVyMU5hbWUgPSB0eXBl
TmFtZXIubWFuZ2xlZE5hbWVGb3JUeXBlKCpuYXRpdmVGdW5jdGlvbkRlY2xhcmF0aW9uLnBhcmFt
ZXRlcnMoKVswXS0+dHlwZSgpKTsKICAgICAgICAgYXV0byBtZXRhbFBhcmFtZXRlcjJOYW1lID0g
dHlwZU5hbWVyLm1hbmdsZWROYW1lRm9yVHlwZSgqbmF0aXZlRnVuY3Rpb25EZWNsYXJhdGlvbi5w
YXJhbWV0ZXJzKClbMV0tPnR5cGUoKSk7CiAgICAgICAgIGF1dG8gbWV0YWxSZXR1cm5OYW1lID0g
dHlwZU5hbWVyLm1hbmdsZWROYW1lRm9yVHlwZShuYXRpdmVGdW5jdGlvbkRlY2xhcmF0aW9uLnR5
cGUoKSk7CisKKyAgICAgICAgdW5zaWduZWQgbnVtYmVyT2ZSb3dzID0gbnVtYmVyT2ZNYXRyaXhS
b3dzKCk7CisgICAgICAgIHVuc2lnbmVkIG51bWJlck9mQ29sdW1ucyA9IG51bWJlck9mTWF0cml4
Q29sdW1ucygpOworCiAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKG1ha2VTdHJpbmcobWV0
YWxSZXR1cm5OYW1lLCAnICcsIG91dHB1dEZ1bmN0aW9uTmFtZSwgJygnLCBtZXRhbFBhcmFtZXRl
cjFOYW1lLCAiIG0sICIsIG1ldGFsUGFyYW1ldGVyMk5hbWUsICIgaSkge1xuIikpOwotICAgICAg
ICBzdHJpbmdCdWlsZGVyLmFwcGVuZChtYWtlU3RyaW5nKCIgICAgaWYgKGkgPCAiLCBudW1iZXJP
Zk1hdHJpeFJvd3MoKSwgIikgcmV0dXJuIG1baV07XG4iKSk7Ci0gICAgICAgIHN0cmluZ0J1aWxk
ZXIuYXBwZW5kKG1ha2VTdHJpbmcoIiAgICByZXR1cm4gIiwgbWV0YWxSZXR1cm5OYW1lLCAiKDAp
O1xuIikpOworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZChtYWtlU3RyaW5nKCIgICAgaWYg
KGkgPj0gIiwgbnVtYmVyT2ZSb3dzLCAiKSByZXR1cm4gIiwgbWV0YWxSZXR1cm5OYW1lLCAiKDAp
O1xuIikpOworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZChtYWtlU3RyaW5nKCIgICAgIiwg
bWV0YWxSZXR1cm5OYW1lLCAiIHJlc3VsdDtcbiIpKTsKKyAgICAgICAgc3RyaW5nQnVpbGRlci5h
cHBlbmQoIiAgICByZXN1bHRbMF0gPSBtW2ldO1xuIik7CisgICAgICAgIHN0cmluZ0J1aWxkZXIu
YXBwZW5kKG1ha2VTdHJpbmcoIiAgICByZXN1bHRbMV0gPSBtW2kgKyAiLCBudW1iZXJPZlJvd3Ms
ICJdO1xuIikpOworICAgICAgICBpZiAobnVtYmVyT2ZDb2x1bW5zID49IDMpCisgICAgICAgICAg
ICBzdHJpbmdCdWlsZGVyLmFwcGVuZChtYWtlU3RyaW5nKCIgICAgcmVzdWx0WzJdID0gbVtpICsg
IiwgbnVtYmVyT2ZSb3dzICogMiwgIl07XG4iKSk7CisgICAgICAgIGlmIChudW1iZXJPZkNvbHVt
bnMgPj0gNCkKKyAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKG1ha2VTdHJpbmcoIiAg
ICByZXN1bHRbM10gPSBtW2kgKyAiLCBudW1iZXJPZlJvd3MgKiAzLCAiXTtcbiIpKTsKKyAgICAg
ICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoIiAgICByZXR1cm4gcmVzdWx0O1xuIik7CiAgICAgICAg
IHN0cmluZ0J1aWxkZXIuYXBwZW5kKCJ9XG4iKTsKICAgICAgICAgcmV0dXJuIHN0cmluZ0J1aWxk
ZXIudG9TdHJpbmcoKTsKICAgICB9CkBAIC0yNzYsOSArMjkzLDE5IEBAIFN0cmluZyB3cml0ZU5h
dGl2ZUZ1bmN0aW9uKEFTVDo6TmF0aXZlRnUKICAgICAgICAgYXV0byBtZXRhbFBhcmFtZXRlcjJO
YW1lID0gdHlwZU5hbWVyLm1hbmdsZWROYW1lRm9yVHlwZSgqbmF0aXZlRnVuY3Rpb25EZWNsYXJh
dGlvbi5wYXJhbWV0ZXJzKClbMV0tPnR5cGUoKSk7CiAgICAgICAgIGF1dG8gbWV0YWxQYXJhbWV0
ZXIzTmFtZSA9IHR5cGVOYW1lci5tYW5nbGVkTmFtZUZvclR5cGUoKm5hdGl2ZUZ1bmN0aW9uRGVj
bGFyYXRpb24ucGFyYW1ldGVycygpWzJdLT50eXBlKCkpOwogICAgICAgICBhdXRvIG1ldGFsUmV0
dXJuTmFtZSA9IHR5cGVOYW1lci5tYW5nbGVkTmFtZUZvclR5cGUobmF0aXZlRnVuY3Rpb25EZWNs
YXJhdGlvbi50eXBlKCkpOworCisgICAgICAgIHVuc2lnbmVkIG51bWJlck9mUm93cyA9IG51bWJl
ck9mTWF0cml4Um93cygpOworICAgICAgICB1bnNpZ25lZCBudW1iZXJPZkNvbHVtbnMgPSBudW1i
ZXJPZk1hdHJpeENvbHVtbnMoKTsKKwogICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZChtYWtl
U3RyaW5nKG1ldGFsUmV0dXJuTmFtZSwgJyAnLCBvdXRwdXRGdW5jdGlvbk5hbWUsICcoJywgbWV0
YWxQYXJhbWV0ZXIxTmFtZSwgIiBtLCAiLCBtZXRhbFBhcmFtZXRlcjJOYW1lLCAiIGksICIsIG1l
dGFsUGFyYW1ldGVyM05hbWUsICIgdikge1xuIikpOwotICAgICAgICBzdHJpbmdCdWlsZGVyLmFw
cGVuZChtYWtlU3RyaW5nKCIgICAgaWYgKGkgPCAiLCBudW1iZXJPZk1hdHJpeFJvd3MoKSwgIikg
bVtpXSA9IHY7XG4iKSk7Ci0gICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCIgICAgcmV0dXJu
IG07XG4iKTsKKyAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQobWFrZVN0cmluZygiICAgIGlm
IChpID49ICIsIG51bWJlck9mUm93cywgIikgcmV0dXJuIG07XG4iKSk7CisgICAgICAgIHN0cmlu
Z0J1aWxkZXIuYXBwZW5kKG1ha2VTdHJpbmcoIiAgICBtW2ldID0gdlswXTtcbiIpKTsKKyAgICAg
ICAgc3RyaW5nQnVpbGRlci5hcHBlbmQobWFrZVN0cmluZygiICAgIG1baSArICIsIG51bWJlck9m
Um93cywgIl0gPSB2WzFdO1xuIikpOworICAgICAgICBpZiAobnVtYmVyT2ZDb2x1bW5zID49IDMp
CisgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZChtYWtlU3RyaW5nKCIgICAgbVtpICsg
IiwgbnVtYmVyT2ZSb3dzICogMiwgIl0gPSB2WzJdO1xuIikpOworICAgICAgICBpZiAobnVtYmVy
T2ZDb2x1bW5zID49IDQpCisgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZChtYWtlU3Ry
aW5nKCIgICAgbVtpICsgIiwgbnVtYmVyT2ZSb3dzICogMywgIl0gPSB2WzNdO1xuIikpOworICAg
ICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgiICAgIHJldHVybiBtOyIpOwogICAgICAgICBzdHJp
bmdCdWlsZGVyLmFwcGVuZCgifVxuIik7CiAgICAgICAgIHJldHVybiBzdHJpbmdCdWlsZGVyLnRv
U3RyaW5nKCk7CiAgICAgfQpJbmRleDogU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJncHUvV0hM
U0wvTWV0YWwvV0hMU0xOYXRpdmVUeXBlV3JpdGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9Nb2R1bGVzL3dlYmdwdS9XSExTTC9NZXRhbC9XSExTTE5hdGl2ZVR5cGVXcml0ZXIu
Y3BwCShyZXZpc2lvbiAyNDc0MTApCisrKyBTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmdwdS9X
SExTTC9NZXRhbC9XSExTTE5hdGl2ZVR5cGVXcml0ZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0x
MjIsMzUgKzEyMiwxOSBAQCBTdHJpbmcgd3JpdGVOYXRpdmVUeXBlKEFTVDo6TmF0aXZlVHlwZURl
CiAgICAgICAgICAgICBBU1NFUlQocGFyYW1ldGVyVHlwZS5uYW1lKCkgPT0gImZsb2F0Iik7CiAg
ICAgICAgICAgICByZXR1cm4gImZsb2F0IjsKICAgICAgICAgfSkoKTsKKwogICAgICAgICBBU1NF
UlQoV1RGOjpob2xkc19hbHRlcm5hdGl2ZTxBU1Q6OkNvbnN0YW50RXhwcmVzc2lvbj4obmF0aXZl
VHlwZURlY2xhcmF0aW9uLnR5cGVBcmd1bWVudHMoKVsxXSkpOwogICAgICAgICBhdXRvJiBjb25z
dGFudEV4cHJlc3Npb24xID0gV1RGOjpnZXQ8QVNUOjpDb25zdGFudEV4cHJlc3Npb24+KG5hdGl2
ZVR5cGVEZWNsYXJhdGlvbi50eXBlQXJndW1lbnRzKClbMV0pOwogICAgICAgICBhdXRvJiBpbnRl
Z2VyTGl0ZXJhbDEgPSBjb25zdGFudEV4cHJlc3Npb24xLmludGVnZXJMaXRlcmFsKCk7Ci0gICAg
ICAgIGF1dG8gbWlkZGxlID0gKFsmXSgpIC0+IFN0cmluZyB7Ci0gICAgICAgICAgICBzd2l0Y2gg
KGludGVnZXJMaXRlcmFsMS52YWx1ZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAg
ICAgICAgICAgcmV0dXJuICIyIl9zdHI7Ci0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAg
ICAgICAgcmV0dXJuICIzIl9zdHI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAg
ICAgIEFTU0VSVChpbnRlZ2VyTGl0ZXJhbDEudmFsdWUoKSA9PSA0KTsKLSAgICAgICAgICAgICAg
ICByZXR1cm4gIjQiX3N0cjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSkoKTsKKyAgICAgICAg
dW5zaWduZWQgcm93cyA9IGludGVnZXJMaXRlcmFsMS52YWx1ZSgpOworICAgICAgICBBU1NFUlQo
cm93cyA9PSAyIHx8IHJvd3MgPT0gMyB8fCByb3dzID09IDQpOworCiAgICAgICAgIEFTU0VSVChX
VEY6OmhvbGRzX2FsdGVybmF0aXZlPEFTVDo6Q29uc3RhbnRFeHByZXNzaW9uPihuYXRpdmVUeXBl
RGVjbGFyYXRpb24udHlwZUFyZ3VtZW50cygpWzJdKSk7CiAgICAgICAgIGF1dG8mIGNvbnN0YW50
RXhwcmVzc2lvbjIgPSBXVEY6OmdldDxBU1Q6OkNvbnN0YW50RXhwcmVzc2lvbj4obmF0aXZlVHlw
ZURlY2xhcmF0aW9uLnR5cGVBcmd1bWVudHMoKVsyXSk7CiAgICAgICAgIGF1dG8mIGludGVnZXJM
aXRlcmFsMiA9IGNvbnN0YW50RXhwcmVzc2lvbjIuaW50ZWdlckxpdGVyYWwoKTsKLSAgICAgICAg
YXV0byBzdWZmaXggPSAoWyZdKCkgLT4gU3RyaW5nIHsKLSAgICAgICAgICAgIHN3aXRjaCAoaW50
ZWdlckxpdGVyYWwyLnZhbHVlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAg
ICAgICByZXR1cm4gIjIiX3N0cjsKLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAg
ICByZXR1cm4gIjMiX3N0cjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAg
QVNTRVJUKGludGVnZXJMaXRlcmFsMi52YWx1ZSgpID09IDQpOwotICAgICAgICAgICAgICAgIHJl
dHVybiAiNCJfc3RyOwotICAgICAgICAgICAgfQotICAgICAgICB9KSgpOwotICAgICAgICByZXR1
cm4gbWFrZVN0cmluZyhwcmVmaXgsIG1pZGRsZSwgJ3gnLCBzdWZmaXgpOworICAgICAgICB1bnNp
Z25lZCBjb2x1bW5zID0gaW50ZWdlckxpdGVyYWwyLnZhbHVlKCk7CisgICAgICAgIEFTU0VSVChj
b2x1bW5zID09IDIgfHwgY29sdW1ucyA9PSAzIHx8IGNvbHVtbnMgPT0gNCk7CisgICAgICAgIHJl
dHVybiBtYWtlU3RyaW5nKCJhcnJheTwiLCBwcmVmaXgsICIsICIsIGNvbHVtbnMgKiByb3dzLCAi
PiIpOwogICAgIH0KICAgICBBU1NFUlQobmF0aXZlVHlwZURlY2xhcmF0aW9uLnR5cGVBcmd1bWVu
dHMoKS5zaXplKCkgPT0gMSk7CiAgICAgQVNTRVJUKFdURjo6aG9sZHNfYWx0ZXJuYXRpdmU8VW5p
cXVlUmVmPEFTVDo6VHlwZVJlZmVyZW5jZT4+KG5hdGl2ZVR5cGVEZWNsYXJhdGlvbi50eXBlQXJn
dW1lbnRzKClbMF0pKTsKSW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDI0NzQxMCkKKysrIExheW91dFRlc3Rz
L0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE0IEBACisyMDE5LTA3LTEyICBT
YWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgorCisgICAgICAgIFtXSExTTF0gTWF0cml4
IG1lbW9yeSBsYXlvdXQgc2hvdWxkIG1hdGNoIEhMU0wgYnkgbGF5aW5nIG91dCBjb2x1bW5zIGxp
bmVhcmx5CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0x
OTkyMTUKKworICAgICAgICBSZXZpZXdlZCBieSBNeWxlcyBDLiBNYXhmaWVsZC4KKworICAgICAg
ICAqIHdlYmdwdS93aGxzbC1tYXRyaXgtbWVtb3J5LWxheW91dC1leHBlY3RlZC50eHQ6IEFkZGVk
LgorICAgICAgICAqIHdlYmdwdS93aGxzbC1tYXRyaXgtbWVtb3J5LWxheW91dC5odG1sOiBBZGRl
ZC4KKyAgICAgICAgKiB3ZWJncHUvd2hsc2wtdGVzdC1oYXJuZXNzLXRlc3QuaHRtbDoKKwogMjAx
OS0wNy0xMiAgWW91ZW5uIEZhYmxldCAgPHlvdWVubkBhcHBsZS5jb20+CiAKICAgICAgICAgU3Rv
cHBpbmcgYSBjbG9uZWQgTWVkaWFTdHJlYW0gdmlkZW8gdHJhY2sgc2hvdWxkIG5vdCBzdG9wIGFu
eSBvdGhlciB2aWRlbyB0cmFjawpJbmRleDogTGF5b3V0VGVzdHMvd2ViZ3B1L3dobHNsLW1hdHJp
eC1tZW1vcnktbGF5b3V0LWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy93
ZWJncHUvd2hsc2wtbWF0cml4LW1lbW9yeS1sYXlvdXQtZXhwZWN0ZWQudHh0CShub25leGlzdGVu
dCkKKysrIExheW91dFRlc3RzL3dlYmdwdS93aGxzbC1tYXRyaXgtbWVtb3J5LWxheW91dC1leHBl
Y3RlZC50eHQJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1IEBACitQQVNTIAorUEFTUyBzdWNj
ZXNzZnVsbHlQYXJzZWQgaXMgdHJ1ZQorCitURVNUIENPTVBMRVRFCisKSW5kZXg6IExheW91dFRl
c3RzL3dlYmdwdS93aGxzbC1tYXRyaXgtbWVtb3J5LWxheW91dC5odG1sCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IExheW91dFRlc3RzL3dlYmdwdS93aGxzbC1tYXRyaXgtbWVtb3J5LWxheW91dC5odG1sCShub25l
eGlzdGVudCkKKysrIExheW91dFRlc3RzL3dlYmdwdS93aGxzbC1tYXRyaXgtbWVtb3J5LWxheW91
dC5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTM5IEBACis8IURPQ1RZUEUgaHRtbD4K
KzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0IHNyYz0ianMvd2ViZ3B1LWZ1bmN0aW9ucy5qcyI+PC9z
Y3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3Njcmlw
dD4KKzwvaGVhZD4KKzxib2R5PgorPHNjcmlwdD4KK2NvbnN0IHNoYWRlclNvdXJjZSA9IGAKK1tu
dW10aHJlYWRzKDEsIDEsIDEpXQorY29tcHV0ZSB2b2lkIGNvbXB1dGVTaGFkZXIoZGV2aWNlIGZs
b2F0NHg0W10gYnVmZmVyIDogcmVnaXN0ZXIodTApLCBmbG9hdDMgdGhyZWFkSUQgOiBTVl9EaXNw
YXRjaFRocmVhZElEKSB7CisgICAgZmxvYXQ0eDQgcmVzdWx0OworICAgIHJlc3VsdFswXSA9IGZs
b2F0NCgxLCAyLCAzLCA0KTsKKyAgICByZXN1bHRbMV0gPSBmbG9hdDQoNSwgNiwgNywgOCk7Cisg
ICAgcmVzdWx0WzJdID0gZmxvYXQ0KDksIDEwLCAxMSwgMTIpOworICAgIHJlc3VsdFszXSA9IGZs
b2F0NCgxMywgMTQsIDE1LCAxNik7CisKKyAgICBmbG9hdDR4NCBtYXQgPSBidWZmZXJbMF07CisK
KyAgICBpZiAobWF0WzBdWzBdID09IDAKKyAgICAgICAgJiYgbWF0WzBdWzFdID09IDEKKyAgICAg
ICAgJiYgbWF0WzBdWzJdID09IDIKKyAgICAgICAgJiYgbWF0WzBdWzNdID09IDMKKworICAgICAg
ICAmJiBtYXRbMV1bMF0gPT0gNAorICAgICAgICAmJiBtYXRbMV1bMV0gPT0gNQorICAgICAgICAm
JiBtYXRbMV1bMl0gPT0gNgorICAgICAgICAmJiBtYXRbMV1bM10gPT0gNworCisgICAgICAgICYm
IG1hdFsyXVswXSA9PSA4CisgICAgICAgICYmIG1hdFsyXVsxXSA9PSA5CisgICAgICAgICYmIG1h
dFsyXVsyXSA9PSAxMAorICAgICAgICAmJiBtYXRbMl1bM10gPT0gMTEKKworICAgICAgICAmJiBt
YXRbM11bMF0gPT0gMTIKKyAgICAgICAgJiYgbWF0WzNdWzFdID09IDEzCisgICAgICAgICYmIG1h
dFszXVsyXSA9PSAxNAorICAgICAgICAmJiBtYXRbM11bM10gPT0gMTUpIHsKKyAgICAgICAgYnVm
ZmVyWzBdID0gcmVzdWx0OworICAgIH0KK30KK2A7CisKK2FzeW5jIGZ1bmN0aW9uIHN0YXJ0KGRl
dmljZSkgeworICAgIGNvbnN0IHNoYWRlck1vZHVsZSA9IGRldmljZS5jcmVhdGVTaGFkZXJNb2R1
bGUoe2NvZGU6IHNoYWRlclNvdXJjZSwgaXNXSExTTDogdHJ1ZX0pOworICAgIGNvbnN0IGNvbXB1
dGVTdGFnZSA9IHttb2R1bGU6IHNoYWRlck1vZHVsZSwgZW50cnlQb2ludDogImNvbXB1dGVTaGFk
ZXIifTsKKworICAgIGNvbnN0IGJpbmRHcm91cExheW91dERlc2NyaXB0b3IgPSB7YmluZGluZ3M6
IFt7YmluZGluZzogMCwgdmlzaWJpbGl0eTogNywgdHlwZTogInN0b3JhZ2UtYnVmZmVyIn1dfTsK
KyAgICBjb25zdCBiaW5kR3JvdXBMYXlvdXQgPSBkZXZpY2UuY3JlYXRlQmluZEdyb3VwTGF5b3V0
KGJpbmRHcm91cExheW91dERlc2NyaXB0b3IpOworICAgIGNvbnN0IHBpcGVsaW5lTGF5b3V0RGVz
Y3JpcHRvciA9IHtiaW5kR3JvdXBMYXlvdXRzOiBbYmluZEdyb3VwTGF5b3V0XX07CisgICAgY29u
c3QgcGlwZWxpbmVMYXlvdXQgPSBkZXZpY2UuY3JlYXRlUGlwZWxpbmVMYXlvdXQocGlwZWxpbmVM
YXlvdXREZXNjcmlwdG9yKTsKKworICAgIGNvbnN0IGNvbXB1dGVQaXBlbGluZURlc2NyaXB0b3Ig
PSB7Y29tcHV0ZVN0YWdlLCBsYXlvdXQ6IHBpcGVsaW5lTGF5b3V0fTsKKyAgICBjb25zdCBjb21w
dXRlUGlwZWxpbmUgPSBkZXZpY2UuY3JlYXRlQ29tcHV0ZVBpcGVsaW5lKGNvbXB1dGVQaXBlbGlu
ZURlc2NyaXB0b3IpOworCisgICAgY29uc3Qgc2l6ZSA9IEZsb2F0MzJBcnJheS5CWVRFU19QRVJf
RUxFTUVOVCAqIDE2OworCisgICAgY29uc3QgYnVmZmVyRGVzY3JpcHRvciA9IHtzaXplLCB1c2Fn
ZTogR1BVQnVmZmVyVXNhZ2UuTUFQX1dSSVRFIHwgR1BVQnVmZmVyVXNhZ2UuVFJBTlNGRVJfU1JD
fTsKKyAgICBjb25zdCBidWZmZXIgPSBkZXZpY2UuY3JlYXRlQnVmZmVyKGJ1ZmZlckRlc2NyaXB0
b3IpOworICAgIGNvbnN0IGJ1ZmZlckFycmF5QnVmZmVyID0gYXdhaXQgYnVmZmVyLm1hcFdyaXRl
QXN5bmMoKTsKKyAgICBjb25zdCBidWZmZXJGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5
KGJ1ZmZlckFycmF5QnVmZmVyKTsKKyAgICBidWZmZXJGbG9hdDMyQXJyYXlbMF0gPSAwOworICAg
IGJ1ZmZlckZsb2F0MzJBcnJheVsxXSA9IDQ7CisgICAgYnVmZmVyRmxvYXQzMkFycmF5WzJdID0g
ODsKKyAgICBidWZmZXJGbG9hdDMyQXJyYXlbM10gPSAxMjsKKyAgICBidWZmZXJGbG9hdDMyQXJy
YXlbNF0gPSAxOworICAgIGJ1ZmZlckZsb2F0MzJBcnJheVs1XSA9IDU7CisgICAgYnVmZmVyRmxv
YXQzMkFycmF5WzZdID0gOTsKKyAgICBidWZmZXJGbG9hdDMyQXJyYXlbN10gPSAxMzsKKyAgICBi
dWZmZXJGbG9hdDMyQXJyYXlbOF0gPSAyOworICAgIGJ1ZmZlckZsb2F0MzJBcnJheVs5XSA9IDY7
CisgICAgYnVmZmVyRmxvYXQzMkFycmF5WzEwXSA9IDEwOworICAgIGJ1ZmZlckZsb2F0MzJBcnJh
eVsxMV0gPSAxNDsKKyAgICBidWZmZXJGbG9hdDMyQXJyYXlbMTJdID0gMzsKKyAgICBidWZmZXJG
bG9hdDMyQXJyYXlbMTNdID0gNzsKKyAgICBidWZmZXJGbG9hdDMyQXJyYXlbMTRdID0gMTE7Cisg
ICAgYnVmZmVyRmxvYXQzMkFycmF5WzE1XSA9IDE1OworICAgIGJ1ZmZlci51bm1hcCgpOworCisg
ICAgY29uc3QgcmVzdWx0c0J1ZmZlckRlc2NyaXB0b3IgPSB7c2l6ZSwgdXNhZ2U6IEdQVUJ1ZmZl
clVzYWdlLlNUT1JBR0UgfCBHUFVCdWZmZXJVc2FnZS5UUkFOU0ZFUl9EU1QgfCBHUFVCdWZmZXJV
c2FnZS5NQVBfUkVBRH07CisgICAgY29uc3QgcmVzdWx0c0J1ZmZlciA9IGRldmljZS5jcmVhdGVC
dWZmZXIocmVzdWx0c0J1ZmZlckRlc2NyaXB0b3IpOworCisgICAgY29uc3QgYnVmZmVyQmluZGlu
ZyA9IHtidWZmZXI6IHJlc3VsdHNCdWZmZXIsIHNpemV9OworICAgIGNvbnN0IGJpbmRHcm91cEJp
bmRpbmcgPSB7YmluZGluZzogMCwgcmVzb3VyY2U6IGJ1ZmZlckJpbmRpbmd9OworICAgIGNvbnN0
IGJpbmRHcm91cERlc2NyaXB0b3IgPSB7bGF5b3V0OiBiaW5kR3JvdXBMYXlvdXQsIGJpbmRpbmdz
OiBbYmluZEdyb3VwQmluZGluZ119OworICAgIGNvbnN0IGJpbmRHcm91cCA9IGRldmljZS5jcmVh
dGVCaW5kR3JvdXAoYmluZEdyb3VwRGVzY3JpcHRvcik7CisKKyAgICBjb25zdCBjb21tYW5kRW5j
b2RlciA9IGRldmljZS5jcmVhdGVDb21tYW5kRW5jb2RlcigpOyAvLyB7fQorICAgIGNvbW1hbmRF
bmNvZGVyLmNvcHlCdWZmZXJUb0J1ZmZlcihidWZmZXIsIDAsIHJlc3VsdHNCdWZmZXIsIDAsIHNp
emUpOworICAgIGNvbnN0IGNvbXB1dGVQYXNzRW5jb2RlciA9IGNvbW1hbmRFbmNvZGVyLmJlZ2lu
Q29tcHV0ZVBhc3MoKTsKKyAgICBjb21wdXRlUGFzc0VuY29kZXIuc2V0UGlwZWxpbmUoY29tcHV0
ZVBpcGVsaW5lKTsKKyAgICBjb21wdXRlUGFzc0VuY29kZXIuc2V0QmluZEdyb3VwKDAsIGJpbmRH
cm91cCk7CisgICAgY29tcHV0ZVBhc3NFbmNvZGVyLmRpc3BhdGNoKDIsIDEsIDEpOworICAgIGNv
bXB1dGVQYXNzRW5jb2Rlci5lbmRQYXNzKCk7CisgICAgY29uc3QgY29tbWFuZEJ1ZmZlciA9IGNv
bW1hbmRFbmNvZGVyLmZpbmlzaCgpOworICAgIGRldmljZS5nZXRRdWV1ZSgpLnN1Ym1pdChbY29t
bWFuZEJ1ZmZlcl0pOworCisgICAgY29uc3QgcmVzdWx0c0FycmF5QnVmZmVyID0gYXdhaXQgcmVz
dWx0c0J1ZmZlci5tYXBSZWFkQXN5bmMoKTsKKyAgICBjb25zdCByZXN1bHRzRmxvYXQzMkFycmF5
ID0gbmV3IEZsb2F0MzJBcnJheShyZXN1bHRzQXJyYXlCdWZmZXIpOworICAgIGlmIChyZXN1bHRz
RmxvYXQzMkFycmF5WzBdID09PSAxCisgICAgICAgICYmIHJlc3VsdHNGbG9hdDMyQXJyYXlbMV0g
PT09IDUKKyAgICAgICAgJiYgcmVzdWx0c0Zsb2F0MzJBcnJheVsyXSA9PT0gOQorICAgICAgICAm
JiByZXN1bHRzRmxvYXQzMkFycmF5WzNdID09PSAxMworCisgICAgICAgICYmIHJlc3VsdHNGbG9h
dDMyQXJyYXlbNF0gPT09IDIKKyAgICAgICAgJiYgcmVzdWx0c0Zsb2F0MzJBcnJheVs1XSA9PT0g
NgorICAgICAgICAmJiByZXN1bHRzRmxvYXQzMkFycmF5WzZdID09PSAxMAorICAgICAgICAmJiBy
ZXN1bHRzRmxvYXQzMkFycmF5WzddID09PSAxNAorCisgICAgICAgICYmIHJlc3VsdHNGbG9hdDMy
QXJyYXlbOF0gPT09IDMKKyAgICAgICAgJiYgcmVzdWx0c0Zsb2F0MzJBcnJheVs5XSA9PT0gNwor
ICAgICAgICAmJiByZXN1bHRzRmxvYXQzMkFycmF5WzEwXSA9PT0gMTEKKyAgICAgICAgJiYgcmVz
dWx0c0Zsb2F0MzJBcnJheVsxMV0gPT09IDE1CisKKyAgICAgICAgJiYgcmVzdWx0c0Zsb2F0MzJB
cnJheVsxMl0gPT09IDQKKyAgICAgICAgJiYgcmVzdWx0c0Zsb2F0MzJBcnJheVsxM10gPT09IDgK
KyAgICAgICAgJiYgcmVzdWx0c0Zsb2F0MzJBcnJheVsxNF0gPT09IDEyCisgICAgICAgICYmIHJl
c3VsdHNGbG9hdDMyQXJyYXlbMTVdID09PSAxNikKKyAgICAgICAgdGVzdFBhc3NlZCgiIik7Cisg
ICAgZWxzZQorICAgICAgICB0ZXN0RmFpbGVkKCIiKTsKKyAgICByZXN1bHRzQnVmZmVyLnVubWFw
KCk7Cit9Cit3aW5kb3cuanNUZXN0SXNBc3luYyA9IHRydWU7CitnZXRCYXNpY0RldmljZSgpLnRo
ZW4oZnVuY3Rpb24oZGV2aWNlKSB7CisgICAgc3RhcnQoZGV2aWNlKS50aGVuKGZ1bmN0aW9uKCkg
eworICAgICAgICBmaW5pc2hKU1Rlc3QoKTsKKyAgICB9LCBmdW5jdGlvbigpIHsKKyAgICAgICAg
dGVzdEZhaWxlZCgiIik7CisgICAgICAgIGZpbmlzaEpTVGVzdCgpOworICAgIH0pOworfSwgZnVu
Y3Rpb24oKSB7CisgICAgdGVzdFBhc3NlZCgiIik7CisgICAgZmluaXNoSlNUZXN0KCk7Cit9KTsK
Kzwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii4uL3Jlc291cmNlcy9qcy10ZXN0LXBvc3QuanMiPjwv
c2NyaXB0PgorPC9ib2R5PgorPC9odG1sPgpJbmRleDogTGF5b3V0VGVzdHMvd2ViZ3B1L3dobHNs
LXRlc3QtaGFybmVzcy10ZXN0Lmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvd2ViZ3B1
L3dobHNsLXRlc3QtaGFybmVzcy10ZXN0Lmh0bWwJKHJldmlzaW9uIDI0NzQxMCkKKysrIExheW91
dFRlc3RzL3dlYmdwdS93aGxzbC10ZXN0LWhhcm5lc3MtdGVzdC5odG1sCSh3b3JraW5nIGNvcHkp
CkBAIC00Miw4ICs0Miw5IEBAIGNvbnN0IGFycmF5QXJnTWFrZXJzID0gewogICAgICJmbG9hdDR4
NCI6IG1ha2VGbG9hdDR4NAogfTsKIAotY29uc3QgZmxvYXQ0eDRleHBlY3RlZCA9IFswLCAxLCAy
LCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1XTsKLWNvbnN0IGZs
b2F0NGV4cGVjdGVkID0gZmxvYXQ0eDRleHBlY3RlZC5zbGljZSgwLCA0KTsKK2NvbnN0IGZsb2F0
NHg0ZXhwZWN0ZWQgPSBbMCwgNCwgOCwgMTIsIDEsIDUsIDksIDEzLCAyLCA2LCAxMCwgMTQsIDMs
IDcsIDExLCAxNV07Citjb25zdCBmbG9hdDR4NENvbHVtbkV4cGVjdGVkID0gWzAsIDEsIDIsIDMs
IDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTVdOworY29uc3QgZmxvYXQ0
ZXhwZWN0ZWQgPSBbMCwgMSwgMiwgM107CiAKIGxldCB3aGxzbFRlc3RzID0ge307CiAKQEAgLTE3
Miw3ICsxNzMsNyBAQCB3aGxzbFRlc3RzLmZsb2F0NHg0dGVzdHMgPSAoKSA9PiB7CiAgICAgICAg
IGFyZ1tpXSA9IGk7CiAgICAgICAgIG11bHRpcGxlNHg0YXJncy5wdXNoKGFyZyk7CiAgICAgfQot
ICAgIGNoZWNrQXJyYXlzKCJmbG9hdDR4NCIsICJyZXR1cm4gaW4wICsgaW4xICsgaW4yICsgaW4z
ICsgaW40ICsgaW41ICsgaW42ICsgaW43ICsgaW44ICsgaW45ICsgaW4xMCArIGluMTEgKyBpbjEy
ICsgaW4xMyArIGluMTQgKyBpbjE1OyIsIG11bHRpcGxlNHg0YXJncywgZmxvYXQ0eDRleHBlY3Rl
ZCk7CisgICAgY2hlY2tBcnJheXMoImZsb2F0NHg0IiwgInJldHVybiBpbjAgKyBpbjEgKyBpbjIg
KyBpbjMgKyBpbjQgKyBpbjUgKyBpbjYgKyBpbjcgKyBpbjggKyBpbjkgKyBpbjEwICsgaW4xMSAr
IGluMTIgKyBpbjEzICsgaW4xNCArIGluMTU7IiwgbXVsdGlwbGU0eDRhcmdzLCBmbG9hdDR4NENv
bHVtbkV4cGVjdGVkKTsKICAgICBjaGVja0FycmF5cygiZmxvYXQ0eDQiLCAicmV0dXJuIGluMFsw
XTsiLCBbW2Zsb2F0NHg0ZXhwZWN0ZWRdXSwgZmxvYXQ0eDRleHBlY3RlZCk7CiB9OwogCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>