<?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>46505</bug_id>
          
          <creation_ts>2010-09-24 13:30:30 -0700</creation_ts>
          <short_desc>Add AudioPannerNode files</short_desc>
          <delta_ts>2010-10-05 01:13:41 -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>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</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>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Chris Rogers">crogers</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>cmarrin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>dglazkov</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>jamesr</cc>
    
    <cc>jer.noble</cc>
    
    <cc>kbr</cc>
    
    <cc>simon.fraser</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>284654</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-24 13:30:30 -0700</bug_when>
    <thetext>Add AudioPannerNode files</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>284655</commentid>
    <comment_count>1</comment_count>
      <attachid>68738</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-24 13:31:39 -0700</bug_when>
    <thetext>Created attachment 68738
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>284657</commentid>
    <comment_count>2</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-09-24 13:33:15 -0700</bug_when>
    <thetext>This is the implementation for AudioPannerNode as described in the web audio API:
http://chromium.googlecode.com/svn/trunk/samples/audio/specification/specification.html#AudioPannerNode-section</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>288495</commentid>
    <comment_count>3</comment_count>
      <attachid>69522</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-10-01 14:42:43 -0700</bug_when>
    <thetext>Created attachment 69522
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>289231</commentid>
    <comment_count>4</comment_count>
      <attachid>69522</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-10-04 15:43:28 -0700</bug_when>
    <thetext>Comment on attachment 69522
Patch

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

This basically looks good to me. Please update the license text and take a look at the few highlighted issues. It&apos;s OK with me if you fix those upon landing the patch.

&gt; WebCore/webaudio/AudioPannerNode.cpp:47
&gt; +static void fixNANS(double &amp;x)

Naming convention: fixNANS -&gt; fixNANs

&gt; WebCore/webaudio/AudioPannerNode.cpp:95
&gt; +    AudioBus* destination = output(0)-&gt;bus();

Out of curiosity, why does AudioPannerNode::process not need the same sort of locking as AudioBasicProcessorNode::process? Is it because the number of channels of the input to AudioPannerNode can&apos;t change at run time?

&gt; WebCore/webaudio/AudioPannerNode.cpp:191
&gt; +    listenerFrontNorm.normalize();

Since listenerFront isn&apos;t used after this point you could just rename listenerFront to listenerFrontNorm and normalize it earlier.

&gt; WebCore/webaudio/AudioPannerNode.cpp:220
&gt; +    if (elevation &lt; -90.0)

Presumably this should be &quot;else if&quot;.

&gt; WebCore/webaudio/AudioPannerNode.cpp:284
&gt; +    m_distanceGain-&gt;setValue((float)distanceGain);

Avoid C-style casts.

&gt; WebCore/webaudio/AudioPannerNode.cpp:289
&gt; +    m_coneGain-&gt;setValue((float)coneGain);

Avoid C-style casts.

&gt; WebCore/webaudio/AudioPannerNode.h:80
&gt; +    void setPanningModel(unsigned model);

These should take and return unsigned short at a minimum. Ideally the above enum would be named and these return and take the enum name, but I&apos;m not sure that will compile given that the IDL uses unsigned short (try it).

&gt; WebCore/webaudio/AudioPannerNode.h:96
&gt; +    void setDistanceModel(unsigned model) { m_distanceEffect.setModel(static_cast&lt;DistanceEffect::ModelType&gt;(model), true); }

It looks like DistanceEffect hasn&apos;t landed yet but at a minimum these should return and take unsigned short, if not DistanceEffect::ModelType (not sure whether that will compile while still having the IDL return unsigned short).

&gt; WebCore/webaudio/AudioPannerNode.h:139
&gt; +    Vector3 m_velocity;

These should change to use FloatPoint3D, if not now then soon.

&gt; WebCore/webaudio/AudioPannerNode.idl:42
&gt; +        attribute long panningModel;

Shouldn&apos;t this be &quot;unsigned short&quot; to match the types of the Panning Model values above? The spec would also need to change.

&gt; WebCore/webaudio/AudioPannerNode.idl:50
&gt; +        attribute unsigned long distanceModel;

Presumably this should be &quot;unsigned short&quot; both here and in the spec to match panningModel, even though the distance model constants aren&apos;t defined yet.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>289269</commentid>
    <comment_count>5</comment_count>
      <attachid>69712</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-10-04 16:25:33 -0700</bug_when>
    <thetext>Created attachment 69712
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>289277</commentid>
    <comment_count>6</comment_count>
      <attachid>69522</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-10-04 16:31:22 -0700</bug_when>
    <thetext>Comment on attachment 69522
Patch

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

&gt;&gt; WebCore/webaudio/AudioPannerNode.cpp:47
&gt;&gt; +static void fixNANS(double &amp;x)
&gt; 
&gt; Naming convention: fixNANS -&gt; fixNANs

FIXED

&gt;&gt; WebCore/webaudio/AudioPannerNode.cpp:95
&gt;&gt; +    AudioBus* destination = output(0)-&gt;bus();
&gt; 
&gt; Out of curiosity, why does AudioPannerNode::process not need the same sort of locking as AudioBasicProcessorNode::process? Is it because the number of channels of the input to AudioPannerNode can&apos;t change at run time?

Actually the number of channels *can* change, but the panning algorithms do not require any complex re-initialization to handle the different cases since they can simply call different code paths.

&gt;&gt; WebCore/webaudio/AudioPannerNode.cpp:220
&gt;&gt; +    if (elevation &lt; -90.0)
&gt; 
&gt; Presumably this should be &quot;else if&quot;.

FIXED

&gt;&gt; WebCore/webaudio/AudioPannerNode.cpp:284
&gt;&gt; +    m_distanceGain-&gt;setValue((float)distanceGain);
&gt; 
&gt; Avoid C-style casts.

FIXED

&gt;&gt; WebCore/webaudio/AudioPannerNode.cpp:289
&gt;&gt; +    m_coneGain-&gt;setValue((float)coneGain);
&gt; 
&gt; Avoid C-style casts.

FIXED

&gt;&gt; WebCore/webaudio/AudioPannerNode.h:139
&gt;&gt; +    Vector3 m_velocity;
&gt; 
&gt; These should change to use FloatPoint3D, if not now then soon.

added a FIXME</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>289298</commentid>
    <comment_count>7</comment_count>
      <attachid>69712</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-10-04 16:47:44 -0700</bug_when>
    <thetext>Comment on attachment 69712
Patch

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

&gt; WebCore/webaudio/AudioPannerNode.h:96
&gt; +    void setDistanceModel(unsigned model) { m_distanceEffect.setModel(static_cast&lt;DistanceEffect::ModelType&gt;(model), true); }

Per earlier review please change the arguments and return values to unsigned short.

&gt; WebCore/webaudio/AudioPannerNode.idl:42
&gt; +        attribute unsigned long panningModel;

I gather from our offline discussion that the generated glue code doesn&apos;t work if these attributes are changed to &quot;unsigned short&quot;. It&apos;s worth filing a low-priority follow-up bug against the code generators (I&apos;m not sure which would be the best component; &quot;WebCore JavaScript&quot; is a guess) about that.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>289303</commentid>
    <comment_count>8</comment_count>
      <attachid>69721</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-10-04 16:51:37 -0700</bug_when>
    <thetext>Created attachment 69721
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>289304</commentid>
    <comment_count>9</comment_count>
      <attachid>69721</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-10-04 16:52:47 -0700</bug_when>
    <thetext>Comment on attachment 69721
Patch

Thanks for cleaning up that last nit. Looks good.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>289485</commentid>
    <comment_count>10</comment_count>
      <attachid>69721</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-10-05 01:13:35 -0700</bug_when>
    <thetext>Comment on attachment 69721
Patch

Clearing flags on attachment: 69721

Committed r69093: &lt;http://trac.webkit.org/changeset/69093&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>289486</commentid>
    <comment_count>11</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-10-05 01:13:41 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>68738</attachid>
            <date>2010-09-24 13:31:39 -0700</date>
            <delta_ts>2010-10-01 14:42:39 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-46505-20100924133138.patch</filename>
            <type>text/plain</type>
            <size>23173</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2ODI4NikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTQgQEAKKzIwMTAtMDktMjQgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgQXVkaW9QYW5uZXJOb2RlIGZpbGVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD00NjUwNQorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBzaW5jZSBhdWRp
byBBUEkgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKworICAgICAgICAqIHdlYmF1ZGlvL0F1ZGlv
UGFubmVyTm9kZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6Zml4TkFOUyk6CisgICAg
ICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OkF1ZGlvUGFubmVyTm9kZSk6CisgICAgICAg
IChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6On5BdWRpb1Bhbm5lck5vZGUpOgorICAgICAgICAo
V2ViQ29yZTo6QXVkaW9QYW5uZXJOb2RlOjpwdWxsSW5wdXRzKToKKyAgICAgICAgKFdlYkNvcmU6
OkF1ZGlvUGFubmVyTm9kZTo6cHJvY2Vzcyk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5l
ck5vZGU6OnJlc2V0KToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6aW5pdGlh
bGl6ZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OnVuaW5pdGlhbGl6ZSk6
CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6Omxpc3RlbmVyKToKKyAgICAgICAg
KFdlYkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6c2V0UGFubmluZ01vZGVsKToKKyAgICAgICAgKFdl
YkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6Z2V0QXppbXV0aEVsZXZhdGlvbik6CisgICAgICAgIChX
ZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OmRvcHBsZXJSYXRlKToKKyAgICAgICAgKFdlYkNvcmU6
OkF1ZGlvUGFubmVyTm9kZTo6ZGlzdGFuY2VDb25lR2Fpbik6CisgICAgICAgIChXZWJDb3JlOjpB
dWRpb1Bhbm5lck5vZGU6Om5vdGlmeUF1ZGlvU291cmNlc0Nvbm5lY3RlZFRvTm9kZSk6CisgICAg
ICAgICogd2ViYXVkaW8vQXVkaW9QYW5uZXJOb2RlLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29y
ZTo6QXVkaW9QYW5uZXJOb2RlOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9QYW5u
ZXJOb2RlOjpwYW5uaW5nTW9kZWwpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9QYW5uZXJOb2Rl
Ojpwb3NpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OnNldFBvc2l0
aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6b3JpZW50YXRpb24pOgor
ICAgICAgICAoV2ViQ29yZTo6QXVkaW9QYW5uZXJOb2RlOjpzZXRPcmllbnRhdGlvbik6CisgICAg
ICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OnZlbG9jaXR5KToKKyAgICAgICAgKFdlYkNv
cmU6OkF1ZGlvUGFubmVyTm9kZTo6c2V0VmVsb2NpdHkpOgorICAgICAgICAoV2ViQ29yZTo6QXVk
aW9QYW5uZXJOb2RlOjpkaXN0YW5jZU1vZGVsKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvUGFu
bmVyTm9kZTo6c2V0RGlzdGFuY2VNb2RlbCk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5l
ck5vZGU6OnJlZkRpc3RhbmNlKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6
c2V0UmVmRGlzdGFuY2UpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9QYW5uZXJOb2RlOjptYXhE
aXN0YW5jZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OnNldE1heERpc3Rh
bmNlKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6cm9sbG9mZkZhY3Rvcik6
CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OnNldFJvbGxvZmZGYWN0b3IpOgor
ICAgICAgICAoV2ViQ29yZTo6QXVkaW9QYW5uZXJOb2RlOjpjb25lSW5uZXJBbmdsZSk6CisgICAg
ICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OnNldENvbmVJbm5lckFuZ2xlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6Y29uZU91dGVyQW5nbGUpOgorICAgICAgICAo
V2ViQ29yZTo6QXVkaW9QYW5uZXJOb2RlOjpzZXRDb25lT3V0ZXJBbmdsZSk6CisgICAgICAgIChX
ZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OmNvbmVPdXRlckdhaW4pOgorICAgICAgICAoV2ViQ29y
ZTo6QXVkaW9QYW5uZXJOb2RlOjpzZXRDb25lT3V0ZXJHYWluKToKKyAgICAgICAgKFdlYkNvcmU6
OkF1ZGlvUGFubmVyTm9kZTo6ZGlzdGFuY2VHYWluKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlv
UGFubmVyTm9kZTo6Y29uZUdhaW4pOgorICAgICAgICAqIHdlYmF1ZGlvL0F1ZGlvUGFubmVyTm9k
ZS5pZGw6IEFkZGVkLgorCiAyMDEwLTA5LTI0ICBEYXZpZCBIeWF0dCAgPGh5YXR0QGFwcGxlLmNv
bT4KIAogICAgICAgICBSZXZpZXdlZCBieSBTYW0gV2VpbmlnLgpJbmRleDogV2ViQ29yZS93ZWJh
dWRpby9BdWRpb1Bhbm5lck5vZGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvd2ViYXVkaW8v
QXVkaW9QYW5uZXJOb2RlLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvd2ViYXVkaW8vQXVk
aW9QYW5uZXJOb2RlLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwzMjEgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJ
bmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBt
YXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAg
IGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz
c2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMg
Q09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRT
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAq
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUoV0VCX0FVRElPKQorCisjaW5jbHVkZSAiQXVkaW9Q
YW5uZXJOb2RlLmgiCisKKyNpbmNsdWRlICJBdWRpb0J1ZmZlclNvdXJjZU5vZGUuaCIKKyNpbmNs
dWRlICJBdWRpb0J1cy5oIgorI2luY2x1ZGUgIkF1ZGlvQ29udGV4dC5oIgorI2luY2x1ZGUgIkF1
ZGlvTm9kZUlucHV0LmgiCisjaW5jbHVkZSAiQXVkaW9Ob2RlT3V0cHV0LmgiCisjaW5jbHVkZSAi
SFJURlBhbm5lci5oIgorI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CisKK3VzaW5nIG5hbWVz
cGFjZSBzdGQ7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIHZvaWQgZml4TkFOUyhk
b3VibGUgJngpCit7CisgICAgaWYgKGlzbmFuKHgpIHx8IGlzaW5mKHgpKQorICAgICAgICB4ID0g
MC4wOworfQorCitBdWRpb1Bhbm5lck5vZGU6OkF1ZGlvUGFubmVyTm9kZShBdWRpb0NvbnRleHQq
IGNvbnRleHQsIGRvdWJsZSBzYW1wbGVSYXRlKQorICAgIDogQXVkaW9Ob2RlKGNvbnRleHQsIHNh
bXBsZVJhdGUpCisgICAgLCBtX3Bhbm5pbmdNb2RlbChQYW5uZXI6OlBhbm5pbmdNb2RlbEhSVEYp
CisgICAgLCBtX2xhc3RHYWluKC0xLjApCisgICAgLCBtX2Nvbm5lY3Rpb25Db3VudCgwKQorewor
ICAgIGFkZElucHV0KGFkb3B0UHRyKG5ldyBBdWRpb05vZGVJbnB1dCh0aGlzKSkpOworICAgIGFk
ZE91dHB1dChhZG9wdFB0cihuZXcgQXVkaW9Ob2RlT3V0cHV0KHRoaXMsIDIpKSk7CisgICAgCisg
ICAgbV9kaXN0YW5jZUdhaW4gPSBBdWRpb0dhaW46OmNyZWF0ZSgiZGlzdGFuY2VHYWluIiwgMS4w
LCAwLjAsIDEuMCk7CisgICAgbV9jb25lR2FpbiA9IEF1ZGlvR2Fpbjo6Y3JlYXRlKCJjb25lR2Fp
biIsIDEuMCwgMC4wLCAxLjApOworCisgICAgbV9wb3NpdGlvbiA9IFZlY3RvcjMoMCwgMCwgMCk7
CisgICAgbV9vcmllbnRhdGlvbiA9IFZlY3RvcjMoMSwgMCwgMCk7CisgICAgbV92ZWxvY2l0eSA9
IFZlY3RvcjMoMCwgMCwgMCk7CisgICAgCisgICAgc2V0VHlwZShOb2RlVHlwZVBhbm5lcik7CisK
KyAgICBpbml0aWFsaXplKCk7Cit9CisKK0F1ZGlvUGFubmVyTm9kZTo6fkF1ZGlvUGFubmVyTm9k
ZSgpCit7CisgICAgdW5pbml0aWFsaXplKCk7Cit9CisKK3ZvaWQgQXVkaW9QYW5uZXJOb2RlOjpw
dWxsSW5wdXRzKHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpCit7CisgICAgLy8gV2Ugb3ZlcnJpZGUg
cHVsbElucHV0cygpLCBzbyB3ZSBjYW4gZGV0ZWN0IG5ldyBBdWRpb1NvdXJjZU5vZGVzIHdoaWNo
IGhhdmUgY29ubmVjdGVkIHRvIHVzIHdoZW4gbmV3IGNvbm5lY3Rpb25zIGFyZSBtYWRlLgorICAg
IC8vIFRoZXNlIEF1ZGlvU291cmNlTm9kZXMgbmVlZCB0byBiZSBtYWRlIGF3YXJlIG9mIG91ciBl
eGlzdGVuY2UgaW4gb3JkZXIgdG8gaGFuZGxlIGRvcHBsZXIgc2hpZnQgcGl0Y2ggY2hhbmdlcy4K
KyAgICBpZiAobV9jb25uZWN0aW9uQ291bnQgIT0gY29udGV4dCgpLT5jb25uZWN0aW9uQ291bnQo
KSkgeworICAgICAgICBtX2Nvbm5lY3Rpb25Db3VudCA9IGNvbnRleHQoKS0+Y29ubmVjdGlvbkNv
dW50KCk7CisKKyAgICAgICAgLy8gUmVjdXJzaXZlbHkgZ28gdGhyb3VnaCBhbGwgbm9kZXMgY29u
bmVjdGVkIHRvIHVzLgorICAgICAgICBub3RpZnlBdWRpb1NvdXJjZXNDb25uZWN0ZWRUb05vZGUo
dGhpcyk7CisgICAgfQorICAgIAorICAgIEF1ZGlvTm9kZTo6cHVsbElucHV0cyhmcmFtZXNUb1By
b2Nlc3MpOworfQorCit2b2lkIEF1ZGlvUGFubmVyTm9kZTo6cHJvY2VzcyhzaXplX3QgZnJhbWVz
VG9Qcm9jZXNzKQoreworICAgIEF1ZGlvQnVzKiBkZXN0aW5hdGlvbiA9IG91dHB1dCgwKS0+YnVz
KCk7CisKKyAgICBpZiAoIWlzSW5pdGlhbGl6ZWQoKSB8fCAhaW5wdXQoMCktPmlzQ29ubmVjdGVk
KCkgfHwgIW1fcGFubmVyLmdldCgpKSB7CisgICAgICAgIGRlc3RpbmF0aW9uLT56ZXJvKCk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBdWRpb0J1cyogc291cmNlID0gaW5wdXQoMCkt
PmJ1cygpOworCisgICAgaWYgKCFzb3VyY2UpIHsKKyAgICAgICAgZGVzdGluYXRpb24tPnplcm8o
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEFwcGx5IHRoZSBwYW5uaW5nIGVm
ZmVjdC4KKyAgICBkb3VibGUgYXppbXV0aDsKKyAgICBkb3VibGUgZWxldmF0aW9uOworICAgIGdl
dEF6aW11dGhFbGV2YXRpb24oJmF6aW11dGgsICZlbGV2YXRpb24pOworICAgIG1fcGFubmVyLT5w
YW4oYXppbXV0aCwgZWxldmF0aW9uLCBzb3VyY2UsIGRlc3RpbmF0aW9uLCBmcmFtZXNUb1Byb2Nl
c3MpOworCisgICAgLy8gR2V0IHRoZSBkaXN0YW5jZSBhbmQgY29uZSBnYWluLgorICAgIGRvdWJs
ZSB0b3RhbEdhaW4gPSBkaXN0YW5jZUNvbmVHYWluKCk7CisKKyAgICAvLyBTbmFwIHRvIGRlc2ly
ZWQgZ2FpbiBhdCB0aGUgYmVnaW5uaW5nLgorICAgIGlmIChtX2xhc3RHYWluID09IC0xLjApCisg
ICAgICAgIG1fbGFzdEdhaW4gPSB0b3RhbEdhaW47CisgICAgICAgIAorICAgIC8vIEFwcGx5IGdh
aW4gaW4tcGxhY2Ugd2l0aCBkZS16aXBwZXJpbmcuCisgICAgZGVzdGluYXRpb24tPmNvcHlXaXRo
R2FpbkZyb20oKmRlc3RpbmF0aW9uLCAmbV9sYXN0R2FpbiwgdG90YWxHYWluKTsKK30KKwordm9p
ZCBBdWRpb1Bhbm5lck5vZGU6OnJlc2V0KCkKK3sKKyAgICBtX2xhc3RHYWluID0gLTEuMDsgLy8g
Zm9yY2UgdG8gc25hcCB0byBpbml0aWFsIGdhaW4KKyAgICBpZiAobV9wYW5uZXIuZ2V0KCkpCisg
ICAgICAgIG1fcGFubmVyLT5yZXNldCgpOworfQorCit2b2lkIEF1ZGlvUGFubmVyTm9kZTo6aW5p
dGlhbGl6ZSgpCit7CisgICAgaWYgKGlzSW5pdGlhbGl6ZWQoKSkKKyAgICAgICAgcmV0dXJuOwor
ICAgICAgICAKKyAgICBtX3Bhbm5lciA9IFBhbm5lcjo6Y3JlYXRlKG1fcGFubmluZ01vZGVsLCBz
YW1wbGVSYXRlKCkpOworCisgICAgbV9pc0luaXRpYWxpemVkID0gdHJ1ZTsKK30KKwordm9pZCBB
dWRpb1Bhbm5lck5vZGU6OnVuaW5pdGlhbGl6ZSgpCit7CisgICAgaWYgKCFpc0luaXRpYWxpemVk
KCkpCisgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgbV9wYW5uZXIuY2xlYXIoKTsKKyAg
ICBtX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKK30KKworQXVkaW9MaXN0ZW5lciogQXVkaW9QYW5u
ZXJOb2RlOjpsaXN0ZW5lcigpCit7CisgICAgcmV0dXJuIGNvbnRleHQoKS0+bGlzdGVuZXIoKTsK
K30KKwordm9pZCBBdWRpb1Bhbm5lck5vZGU6OnNldFBhbm5pbmdNb2RlbCh1bnNpZ25lZCBtb2Rl
bCkKK3sKKyAgICBpZiAoIW1fcGFubmVyLmdldCgpIHx8IG1vZGVsICE9IG1fcGFubmluZ01vZGVs
KSB7CisgICAgICAgIE93blB0cjxQYW5uZXI+IG5ld1Bhbm5lciA9IFBhbm5lcjo6Y3JlYXRlKG1v
ZGVsLCBzYW1wbGVSYXRlKCkpOworICAgICAgICBtX3Bhbm5lciA9IG5ld1Bhbm5lci5yZWxlYXNl
KCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUGFubmVyTm9kZTo6Z2V0QXppbXV0aEVsZXZhdGlv
bihkb3VibGUqIG91dEF6aW11dGgsIGRvdWJsZSogb3V0RWxldmF0aW9uKQoreworICAgIC8vIEZJ
WE1FOiB3ZSBzaG91bGQgY2FjaGUgYXppbXV0aCBhbmQgZWxldmF0aW9uIChpZiBwb3NzaWJsZSks
IHNvIHdlIG9ubHkgcmUtY2FsY3VsYXRlIGlmIGEgY2hhbmdlIGhhcyBiZWVuIG1hZGUuCisKKyAg
ICBkb3VibGUgYXppbXV0aCA9IDAuMDsKKworICAgIC8vIENhbGN1bGF0ZSB0aGUgc291cmNlLWxp
c3RlbmVyIHZlY3RvcgorICAgIFZlY3RvcjMgbGlzdGVuZXJQb3NpdGlvbiA9IGxpc3RlbmVyKCkt
PnBvc2l0aW9uKCk7CisgICAgVmVjdG9yMyBzb3VyY2VMaXN0ZW5lciA9IG1fcG9zaXRpb24gLSBs
aXN0ZW5lclBvc2l0aW9uOworCisgICAgaWYgKHNvdXJjZUxpc3RlbmVyLmlzWmVybygpKSB7Cisg
ICAgICAgIC8vIGRlZ2VuZXJhdGUgY2FzZSBpZiBzb3VyY2UgYW5kIGxpc3RlbmVyIGFyZSBhdCB0
aGUgc2FtZSBwb2ludAorICAgICAgICAqb3V0QXppbXV0aCA9IDAuMDsKKyAgICAgICAgKm91dEVs
ZXZhdGlvbiA9IDAuMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNvdXJjZUxpc3Rl
bmVyLm5vcm1hbGl6ZSgpOworCisgICAgLy8gQWxpZ24gYXhlcworICAgIFZlY3RvcjMgbGlzdGVu
ZXJGcm9udCA9IGxpc3RlbmVyKCktPm9yaWVudGF0aW9uKCk7CisgICAgVmVjdG9yMyBsaXN0ZW5l
clVwID0gbGlzdGVuZXIoKS0+dXBWZWN0b3IoKTsKKyAgICBWZWN0b3IzIGxpc3RlbmVyUmlnaHQg
PSBjcm9zcyhsaXN0ZW5lckZyb250LCBsaXN0ZW5lclVwKTsKKyAgICBsaXN0ZW5lclJpZ2h0Lm5v
cm1hbGl6ZSgpOworCisgICAgVmVjdG9yMyBsaXN0ZW5lckZyb250Tm9ybSA9IGxpc3RlbmVyRnJv
bnQ7CisgICAgbGlzdGVuZXJGcm9udE5vcm0ubm9ybWFsaXplKCk7CisKKyAgICBWZWN0b3IzIHVw
ID0gY3Jvc3MobGlzdGVuZXJSaWdodCwgbGlzdGVuZXJGcm9udE5vcm0pOworCisgICAgZG91Ymxl
IHVwUHJvamVjdGlvbiA9IGRvdChzb3VyY2VMaXN0ZW5lciwgdXApOworCisgICAgVmVjdG9yMyBw
cm9qZWN0ZWRTb3VyY2UgPSBzb3VyY2VMaXN0ZW5lciAtIHVwUHJvamVjdGlvbiAqIHVwOworICAg
IHByb2plY3RlZFNvdXJjZS5ub3JtYWxpemUoKTsKKworICAgIGF6aW11dGggPSAxODAuMCAqIGFj
b3MoZG90KHByb2plY3RlZFNvdXJjZSwgbGlzdGVuZXJSaWdodCkpIC8gTV9QSTsKKyAgICBmaXhO
QU5TKGF6aW11dGgpOyAvLyBhdm9pZCBpbGxlZ2FsIHZhbHVlcworCisgICAgLy8gU291cmNlICBp
biBmcm9udCBvciBiZWhpbmQgdGhlIGxpc3RlbmVyCisgICAgZG91YmxlIGZyb250QmFjayA9IGRv
dChwcm9qZWN0ZWRTb3VyY2UsIGxpc3RlbmVyRnJvbnROb3JtKTsKKyAgICBpZiAoZnJvbnRCYWNr
IDwgMC4wKQorICAgICAgICBhemltdXRoID0gMzYwLjAgLSBhemltdXRoOworCisgICAgLy8gTWFr
ZSBhemltdXRoIHJlbGF0aXZlIHRvICJmcm9udCIgYW5kIG5vdCAicmlnaHQiIGxpc3RlbmVyIHZl
Y3RvcgorICAgIGlmICgoYXppbXV0aCA+PSAwLjApICYmIChhemltdXRoIDw9IDI3MC4wKSkKKyAg
ICAgICAgYXppbXV0aCA9IDkwLjAgLSBhemltdXRoOworICAgIGVsc2UKKyAgICAgICAgYXppbXV0
aCA9IDQ1MC4wIC0gYXppbXV0aDsKKworICAgIC8vIEVsZXZhdGlvbgorICAgIGRvdWJsZSBlbGV2
YXRpb24gPSA5MC4wIC0gMTgwLjAgKiBhY29zKGRvdChzb3VyY2VMaXN0ZW5lciwgdXApKSAvIE1f
UEk7CisgICAgZml4TkFOUyhhemltdXRoKTsgLy8gYXZvaWQgaWxsZWdhbCB2YWx1ZXMKKworICAg
IGlmIChlbGV2YXRpb24gPiA5MC4wKQorICAgICAgICBlbGV2YXRpb24gPSAxODAuMCAtIGVsZXZh
dGlvbjsKKyAgICBpZiAoZWxldmF0aW9uIDwgLTkwLjApCisgICAgICAgIGVsZXZhdGlvbiA9IC0x
ODAuMCAtIGVsZXZhdGlvbjsKKworICAgIGlmIChvdXRBemltdXRoKQorICAgICAgICAqb3V0QXpp
bXV0aCA9IGF6aW11dGg7CisgICAgaWYgKG91dEVsZXZhdGlvbikKKyAgICAgICAgKm91dEVsZXZh
dGlvbiA9IGVsZXZhdGlvbjsKK30KKworZmxvYXQgQXVkaW9QYW5uZXJOb2RlOjpkb3BwbGVyUmF0
ZSgpCit7CisgICAgZG91YmxlIGRvcHBsZXJTaGlmdCA9IDEuMDsKKworICAgIC8vIEZJWE1FOiBv
cHRpbWl6ZSBmb3IgY2FzZSB3aGVuIG5laXRoZXIgc291cmNlIG5vciBsaXN0ZW5lciBoYXMgY2hh
bmdlZC4uLgorICAgIGRvdWJsZSBkb3BwbGVyRmFjdG9yID0gbGlzdGVuZXIoKS0+ZG9wcGxlckZh
Y3RvcigpOworCisgICAgaWYgKGRvcHBsZXJGYWN0b3IgPiAwLjApIHsKKyAgICAgICAgZG91Ymxl
IHNwZWVkT2ZTb3VuZCA9IGxpc3RlbmVyKCktPnNwZWVkT2ZTb3VuZCgpOworCisgICAgICAgIGNv
bnN0IFZlY3RvcjMgJnNvdXJjZVZlbG9jaXR5ID0gbV92ZWxvY2l0eTsKKyAgICAgICAgY29uc3Qg
VmVjdG9yMyAmbGlzdGVuZXJWZWxvY2l0eSA9IGxpc3RlbmVyKCktPnZlbG9jaXR5KCk7CisKKyAg
ICAgICAgLy8gRG9uJ3QgYm90aGVyIGlmIGJvdGggc291cmNlIGFuZCBsaXN0ZW5lciBoYXZlIG5v
IHZlbG9jaXR5CisgICAgICAgIGJvb2wgc291cmNlSGFzVmVsb2NpdHkgPSAhc291cmNlVmVsb2Np
dHkuaXNaZXJvKCk7CisgICAgICAgIGJvb2wgbGlzdGVuZXJIYXNWZWxvY2l0eSA9ICFsaXN0ZW5l
clZlbG9jaXR5LmlzWmVybygpOworCisgICAgICAgIGlmIChzb3VyY2VIYXNWZWxvY2l0eSB8fCBs
aXN0ZW5lckhhc1ZlbG9jaXR5KSB7CisgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHNvdXJj
ZSB0byBsaXN0ZW5lciB2ZWN0b3IKKyAgICAgICAgICAgIFZlY3RvcjMgbGlzdGVuZXJQb3NpdGlv
biA9IGxpc3RlbmVyKCktPnBvc2l0aW9uKCk7CisgICAgICAgICAgICBWZWN0b3IzIHNvdXJjZVRv
TGlzdGVuZXIgPSBtX3Bvc2l0aW9uIC0gbGlzdGVuZXJQb3NpdGlvbjsKKworICAgICAgICAgICAg
ZG91YmxlIHNvdXJjZUxpc3RlbmVyTWFnbml0dWRlID0gc291cmNlVG9MaXN0ZW5lci5hYnMoKTsK
KworICAgICAgICAgICAgZG91YmxlIGxpc3RlbmVyUHJvamVjdGlvbiA9IGRvdChzb3VyY2VUb0xp
c3RlbmVyLCBsaXN0ZW5lclZlbG9jaXR5KSAvIHNvdXJjZUxpc3RlbmVyTWFnbml0dWRlOworICAg
ICAgICAgICAgZG91YmxlIHNvdXJjZVByb2plY3Rpb24gPSBkb3Qoc291cmNlVG9MaXN0ZW5lciwg
c291cmNlVmVsb2NpdHkpIC8gc291cmNlTGlzdGVuZXJNYWduaXR1ZGU7CisKKyAgICAgICAgICAg
IGxpc3RlbmVyUHJvamVjdGlvbiA9IC1saXN0ZW5lclByb2plY3Rpb247CisgICAgICAgICAgICBz
b3VyY2VQcm9qZWN0aW9uID0gLXNvdXJjZVByb2plY3Rpb247CisKKyAgICAgICAgICAgIGRvdWJs
ZSBzY2FsZWRTcGVlZE9mU291bmQgPSBzcGVlZE9mU291bmQgLyBkb3BwbGVyRmFjdG9yOworICAg
ICAgICAgICAgbGlzdGVuZXJQcm9qZWN0aW9uID0gbWluKGxpc3RlbmVyUHJvamVjdGlvbiwgc2Nh
bGVkU3BlZWRPZlNvdW5kKTsKKyAgICAgICAgICAgIHNvdXJjZVByb2plY3Rpb24gPSBtaW4oc291
cmNlUHJvamVjdGlvbiwgc2NhbGVkU3BlZWRPZlNvdW5kKTsKKworICAgICAgICAgICAgZG9wcGxl
clNoaWZ0ID0gKChzcGVlZE9mU291bmQgLSBkb3BwbGVyRmFjdG9yICogbGlzdGVuZXJQcm9qZWN0
aW9uKSAvIChzcGVlZE9mU291bmQgLSBkb3BwbGVyRmFjdG9yICogc291cmNlUHJvamVjdGlvbikp
OworICAgICAgICAgICAgZml4TkFOUyhkb3BwbGVyU2hpZnQpOyAvLyBhdm9pZCBpbGxlZ2FsIHZh
bHVlcworCisgICAgICAgICAgICAvLyBMaW1pdCB0aGUgcGl0Y2ggc2hpZnRpbmcgdG8gNCBvY3Rh
dmVzIHVwIGFuZCAzIG9jdGF2ZXMgZG93bi4KKyAgICAgICAgICAgIGlmIChkb3BwbGVyU2hpZnQg
PiAxNi4wKQorICAgICAgICAgICAgICAgIGRvcHBsZXJTaGlmdCA9IDE2LjA7CisgICAgICAgICAg
ICBlbHNlIGlmIChkb3BwbGVyU2hpZnQgPCAwLjEyNSkKKyAgICAgICAgICAgICAgICBkb3BwbGVy
U2hpZnQgPSAwLjEyNTsgICAKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdGF0aWNf
Y2FzdDxmbG9hdD4oZG9wcGxlclNoaWZ0KTsKK30KKworZmxvYXQgQXVkaW9QYW5uZXJOb2RlOjpk
aXN0YW5jZUNvbmVHYWluKCkKK3sKKyAgICBWZWN0b3IzIGxpc3RlbmVyUG9zaXRpb24gPSBsaXN0
ZW5lcigpLT5wb3NpdGlvbigpOworCisgICAgZG91YmxlIGxpc3RlbmVyRGlzdGFuY2UgPSBkaXN0
YW5jZShtX3Bvc2l0aW9uLCBsaXN0ZW5lclBvc2l0aW9uKTsKKyAgICBkb3VibGUgZGlzdGFuY2VH
YWluID0gbV9kaXN0YW5jZUVmZmVjdC5nYWluKGxpc3RlbmVyRGlzdGFuY2UpOworICAgIAorICAg
IG1fZGlzdGFuY2VHYWluLT5zZXRWYWx1ZShkaXN0YW5jZUdhaW4pOworCisgICAgLy8gRklYTUU6
IGNvdWxkIG9wdGltaXplIGJ5IGNhY2hpbmcgY29uZUdhaW4KKyAgICBkb3VibGUgY29uZUdhaW4g
PSBtX2NvbmVFZmZlY3QuZ2FpbihtX3Bvc2l0aW9uLCBtX29yaWVudGF0aW9uLCBsaXN0ZW5lclBv
c2l0aW9uKTsKKyAgICAKKyAgICBtX2NvbmVHYWluLT5zZXRWYWx1ZShjb25lR2Fpbik7CisKKyAg
ICByZXR1cm4gZmxvYXQoZGlzdGFuY2VHYWluICogY29uZUdhaW4pOworfQorCit2b2lkIEF1ZGlv
UGFubmVyTm9kZTo6bm90aWZ5QXVkaW9Tb3VyY2VzQ29ubmVjdGVkVG9Ob2RlKEF1ZGlvTm9kZSog
bm9kZSkKK3sKKyAgICBBU1NFUlQobm9kZSk7CisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1
cm47CisgICAgICAgIAorICAgIC8vIEZpcnN0IGNoZWNrIGlmIHRoaXMgbm9kZSBpcyBhbiBBdWRp
b0J1ZmZlclNvdXJjZU5vZGUuICBJZiBzbywgbGV0IGl0IGtub3cgYWJvdXQgdXMgc28gdGhhdCBk
b3BwbGVyIHNoaWZ0IHBpdGNoIGNhbiBiZSB0YWtlbiBpbnRvIGFjY291bnQuCisgICAgaWYgKG5v
ZGUtPnR5cGUoKSA9PSBOb2RlVHlwZUF1ZGlvQnVmZmVyU291cmNlKSB7CisgICAgICAgIEF1ZGlv
QnVmZmVyU291cmNlTm9kZSogYnVmZmVyU291cmNlTm9kZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8QXVk
aW9CdWZmZXJTb3VyY2VOb2RlKj4obm9kZSk7CisgICAgICAgIGJ1ZmZlclNvdXJjZU5vZGUtPnNl
dFBhbm5lck5vZGUodGhpcyk7CisgICAgfSBlbHNlIHsgICAgCisgICAgICAgIC8vIEdvIHRocm91
Z2ggYWxsIGlucHV0cyB0byB0aGlzIG5vZGUuCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7
IGkgPCBub2RlLT5udW1iZXJPZklucHV0cygpOyArK2kpIHsKKyAgICAgICAgICAgIEF1ZGlvTm9k
ZUlucHV0KiBpbnB1dCA9IG5vZGUtPmlucHV0KGkpOworCisgICAgICAgICAgICAvLyBGb3IgZWFj
aCBpbnB1dCwgZ28gdGhyb3VnaCBhbGwgb2YgaXRzIGNvbm5lY3Rpb25zLCBsb29raW5nIGZvciBB
dWRpb0J1ZmZlclNvdXJjZU5vZGVzLgorICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsg
aiA8IGlucHV0LT5udW1iZXJPZkNvbm5lY3Rpb25zKCk7ICsraikgeworICAgICAgICAgICAgICAg
IEF1ZGlvTm9kZU91dHB1dCogY29ubmVjdGVkT3V0cHV0ID0gaW5wdXQtPm91dHB1dChqKTsKKyAg
ICAgICAgICAgICAgICBBdWRpb05vZGUqIGNvbm5lY3RlZE5vZGUgPSBjb25uZWN0ZWRPdXRwdXQt
Pm5vZGUoKTsKKyAgICAgICAgICAgICAgICBub3RpZnlBdWRpb1NvdXJjZXNDb25uZWN0ZWRUb05v
ZGUoY29ubmVjdGVkTm9kZSk7IC8vIHJlY3Vyc2UKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKFdF
Ql9BVURJTykKSW5kZXg6IFdlYkNvcmUvd2ViYXVkaW8vQXVkaW9QYW5uZXJOb2RlLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS93ZWJhdWRpby9BdWRpb1Bhbm5lck5vZGUuaAkocmV2aXNpb24gMCkK
KysrIFdlYkNvcmUvd2ViYXVkaW8vQXVkaW9QYW5uZXJOb2RlLmgJKHJldmlzaW9uIDApCkBAIC0w
LDAgKzEsMTUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFt
ZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICog
ICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHBy
b2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZp
YyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAq
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2lmbmRlZiBBdWRpb1Bhbm5lck5vZGVfaAorI2RlZmluZSBBdWRpb1Bh
bm5lck5vZGVfaAorCisjaW5jbHVkZSAiQXVkaW9CdXMuaCIKKyNpbmNsdWRlICJBdWRpb0dhaW4u
aCIKKyNpbmNsdWRlICJBdWRpb0xpc3RlbmVyLmgiCisjaW5jbHVkZSAiQXVkaW9Ob2RlLmgiCisj
aW5jbHVkZSAiQ29uZS5oIgorI2luY2x1ZGUgIkRpc3RhbmNlLmgiCisjaW5jbHVkZSAiUGFubmVy
LmgiCisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IzLmg+CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gQXVkaW9QYW5uZXJOb2RlIGlzIGFuIEF1ZGlvTm9k
ZSB3aXRoIG9uZSBpbnB1dCBhbmQgb25lIG91dHB1dC4KKy8vIEl0IHBvc2l0aW9ucyBhIHNvdW5k
IGluIDNEIHNwYWNlLCB3aXRoIHRoZSBleGFjdCBlZmZlY3QgZGVwZW5kZW50IG9uIHRoZSBwYW5u
aW5nIG1vZGVsLgorLy8gSXQgaGFzIGEgcG9zaXRpb24gYW5kIGFuIG9yaWVudGF0aW9uIGluIDNE
IHNwYWNlIHdoaWNoIGlzIHJlbGF0aXZlIHRvIHRoZSBwb3NpdGlvbiBhbmQgb3JpZW50YXRpb24g
b2YgdGhlIGNvbnRleHQncyBBdWRpb0xpc3RlbmVyLgorLy8gQSBkaXN0YW5jZSBlZmZlY3Qgd2ls
bCBhdHRlbnVhdGUgdGhlIGdhaW4gYXMgdGhlIHBvc2l0aW9uIG1vdmVzIGF3YXkgZnJvbSB0aGUg
bGlzdGVuZXIuCisvLyBBIGNvbmUgZWZmZWN0IHdpbGwgYXR0ZW51YXRlIHRoZSBnYWluIGFzIHRo
ZSBvcmllbnRhdGlvbiBtb3ZlcyBhd2F5IGZyb20gdGhlIGxpc3RlbmVyLgorLy8gQWxsIG9mIHRo
ZXNlIGVmZmVjdHMgZm9sbG93IHRoZSBPcGVuQUwgc3BlY2lmaWNhdGlvbiB2ZXJ5IGNsb3NlbHku
CisKK2NsYXNzIEF1ZGlvUGFubmVyTm9kZSA6IHB1YmxpYyBBdWRpb05vZGUgeworcHVibGljOgor
ICAgIGVudW0geworICAgICAgICBQQVNTVEhST1VHSCA9IDAsCisgICAgICAgIEVRVUFMUE9XRVIg
PSAxLAorICAgICAgICBIUlRGID0gMiwKKyAgICAgICAgU09VTkRGSUVMRCA9IDMsCisgICAgICAg
IE1BVFJJWE1JWCA9IDQKKyAgICB9OworCisgICAgc3RhdGljIFBhc3NSZWZQdHI8QXVkaW9QYW5u
ZXJOb2RlPiBjcmVhdGUoQXVkaW9Db250ZXh0KiBjb250ZXh0LCBkb3VibGUgc2FtcGxlUmF0ZSkK
KyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgQXVkaW9QYW5uZXJOb2RlKGNvbnRl
eHQsIHNhbXBsZVJhdGUpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5BdWRpb1Bhbm5lck5vZGUo
KTsKKworICAgIC8vIEF1ZGlvTm9kZQorICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzKHNpemVfdCBm
cmFtZXNUb1Byb2Nlc3MpOworICAgIHZpcnR1YWwgdm9pZCBwdWxsSW5wdXRzKHNpemVfdCBmcmFt
ZXNUb1Byb2Nlc3MpOworICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOworICAgIHZpcnR1YWwgdm9p
ZCBpbml0aWFsaXplKCk7CisgICAgdmlydHVhbCB2b2lkIHVuaW5pdGlhbGl6ZSgpOworCisgICAg
Ly8gTGlzdGVuZXIKKyAgICBBdWRpb0xpc3RlbmVyKiBsaXN0ZW5lcigpOworCisgICAgLy8gUGFu
bmluZyBtb2RlbAorICAgIHVuc2lnbmVkIHBhbm5pbmdNb2RlbCgpIGNvbnN0IHsgcmV0dXJuIG1f
cGFubmluZ01vZGVsOyB9CisgICAgdm9pZCBzZXRQYW5uaW5nTW9kZWwodW5zaWduZWQgbW9kZWwp
OworCisgICAgLy8gUG9zaXRpb24KKyAgICBWZWN0b3IzIHBvc2l0aW9uKCkgY29uc3QgeyByZXR1
cm4gbV9wb3NpdGlvbjsgfQorICAgIHZvaWQgc2V0UG9zaXRpb24oZmxvYXQgeCwgZmxvYXQgeSwg
ZmxvYXQgeikgeyBtX3Bvc2l0aW9uID0gVmVjdG9yMyh4LCB5LCB6KTsgfQorCisgICAgLy8gT3Jp
ZW50YXRpb24KKyAgICBWZWN0b3IzIG9yaWVudGF0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9wb3Np
dGlvbjsgfQorICAgIHZvaWQgc2V0T3JpZW50YXRpb24oZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQg
eikgeyBtX29yaWVudGF0aW9uID0gVmVjdG9yMyh4LCB5LCB6KTsgfQorCisgICAgLy8gVmVsb2Np
dHkKKyAgICBWZWN0b3IzIHZlbG9jaXR5KCkgY29uc3QgeyByZXR1cm4gbV92ZWxvY2l0eTsgfQor
ICAgIHZvaWQgc2V0VmVsb2NpdHkoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeyBtX3ZlbG9j
aXR5ID0gVmVjdG9yMyh4LCB5LCB6KTsgfQorCisgICAgLy8gRGlzdGFuY2UgcGFyYW1ldGVycwor
ICAgIHVuc2lnbmVkIGRpc3RhbmNlTW9kZWwoKSB7IHJldHVybiBtX2Rpc3RhbmNlRWZmZWN0Lm1v
ZGVsKCk7IH0KKyAgICB2b2lkIHNldERpc3RhbmNlTW9kZWwodW5zaWduZWQgbW9kZWwpIHsgbV9k
aXN0YW5jZUVmZmVjdC5zZXRNb2RlbChzdGF0aWNfY2FzdDxEaXN0YW5jZUVmZmVjdDo6TW9kZWxU
eXBlPihtb2RlbCksIHRydWUpOyB9CisgICAgCisgICAgZmxvYXQgcmVmRGlzdGFuY2UoKSB7IHJl
dHVybiBzdGF0aWNfY2FzdDxmbG9hdD4obV9kaXN0YW5jZUVmZmVjdC5yZWZEaXN0YW5jZSgpKTsg
fQorICAgIHZvaWQgc2V0UmVmRGlzdGFuY2UoZmxvYXQgcmVmRGlzdGFuY2UpIHsgbV9kaXN0YW5j
ZUVmZmVjdC5zZXRSZWZEaXN0YW5jZShyZWZEaXN0YW5jZSk7IH0KKworICAgIGZsb2F0IG1heERp
c3RhbmNlKCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1fZGlzdGFuY2VFZmZlY3QubWF4
RGlzdGFuY2UoKSk7IH0KKyAgICB2b2lkIHNldE1heERpc3RhbmNlKGZsb2F0IG1heERpc3RhbmNl
KSB7IG1fZGlzdGFuY2VFZmZlY3Quc2V0TWF4RGlzdGFuY2UobWF4RGlzdGFuY2UpOyB9CisKKyAg
ICBmbG9hdCByb2xsb2ZmRmFjdG9yKCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1fZGlz
dGFuY2VFZmZlY3Qucm9sbG9mZkZhY3RvcigpKTsgfQorICAgIHZvaWQgc2V0Um9sbG9mZkZhY3Rv
cihmbG9hdCByb2xsb2ZmRmFjdG9yKSB7IG1fZGlzdGFuY2VFZmZlY3Quc2V0Um9sbG9mZkZhY3Rv
cihyb2xsb2ZmRmFjdG9yKTsgfQorCisgICAgLy8gU291bmQgY29uZXMgLSBhbmdsZXMgaW4gZGVn
cmVlcworICAgIGZsb2F0IGNvbmVJbm5lckFuZ2xlKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nh
c3Q8ZmxvYXQ+KG1fY29uZUVmZmVjdC5pbm5lckFuZ2xlKCkpOyB9CisgICAgdm9pZCBzZXRDb25l
SW5uZXJBbmdsZShmbG9hdCBhbmdsZSkgeyBtX2NvbmVFZmZlY3Quc2V0SW5uZXJBbmdsZShhbmds
ZSk7IH0KKworICAgIGZsb2F0IGNvbmVPdXRlckFuZ2xlKCkgY29uc3QgeyByZXR1cm4gc3RhdGlj
X2Nhc3Q8ZmxvYXQ+KG1fY29uZUVmZmVjdC5vdXRlckFuZ2xlKCkpOyB9CisgICAgdm9pZCBzZXRD
b25lT3V0ZXJBbmdsZShmbG9hdCBhbmdsZSkgeyBtX2NvbmVFZmZlY3Quc2V0T3V0ZXJBbmdsZShh
bmdsZSk7IH0KKworICAgIGZsb2F0IGNvbmVPdXRlckdhaW4oKSBjb25zdCB7IHJldHVybiBzdGF0
aWNfY2FzdDxmbG9hdD4obV9jb25lRWZmZWN0Lm91dGVyR2FpbigpKTsgfQorICAgIHZvaWQgc2V0
Q29uZU91dGVyR2FpbihmbG9hdCBhbmdsZSkgeyBtX2NvbmVFZmZlY3Quc2V0T3V0ZXJHYWluKGFu
Z2xlKTsgfQorCisgICAgdm9pZCBnZXRBemltdXRoRWxldmF0aW9uKGRvdWJsZSogb3V0QXppbXV0
aCwgZG91YmxlKiBvdXRFbGV2YXRpb24pOworICAgIGZsb2F0IGRvcHBsZXJSYXRlKCk7CisKKyAg
ICAvLyBBY2Nlc3NvcnMgZm9yIGR5bmFtaWNhbGx5IGNhbGN1bGF0ZWQgZ2FpbiB2YWx1ZXMuCisg
ICAgQXVkaW9HYWluKiBkaXN0YW5jZUdhaW4oKSB7IHJldHVybiBtX2Rpc3RhbmNlR2Fpbi5nZXQo
KTsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBBdWRpb0dh
aW4qIGNvbmVHYWluKCkgeyByZXR1cm4gbV9jb25lR2Fpbi5nZXQoKTsgfSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAKKworcHJpdmF0ZToKKyAgICBBdWRpb1Bhbm5lck5v
ZGUoQXVkaW9Db250ZXh0KiwgZG91YmxlIHNhbXBsZVJhdGUpOworCisgICAgLy8gUmV0dXJucyB0
aGUgY29tYmluZWQgZGlzdGFuY2UgYW5kIGNvbmUgZ2FpbiBhdHRlbnVhdGlvbi4KKyAgICBmbG9h
dCBkaXN0YW5jZUNvbmVHYWluKCk7CisKKyAgICAvLyBOb3RpZmllcyBhbnkgQXVkaW9CdWZmZXJT
b3VyY2VOb2RlcyBjb25uZWN0ZWQgdG8gdXMgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkg
YWJvdXQgb3VyIGV4aXN0ZW5jZS4KKyAgICAvLyBUaGlzIGlzIGluIG9yZGVyIHRvIGhhbmRsZSB0
aGUgcGl0Y2ggY2hhbmdlIG5lY2Vzc2FyeSBmb3IgdGhlIGRvcHBsZXIgc2hpZnQuCisgICAgdm9p
ZCBub3RpZnlBdWRpb1NvdXJjZXNDb25uZWN0ZWRUb05vZGUoQXVkaW9Ob2RlKik7CisKKyAgICBP
d25QdHI8UGFubmVyPiBtX3Bhbm5lcjsKKyAgICB1bnNpZ25lZCBtX3Bhbm5pbmdNb2RlbDsKKwor
ICAgIFZlY3RvcjMgbV9wb3NpdGlvbjsKKyAgICBWZWN0b3IzIG1fb3JpZW50YXRpb247CisgICAg
VmVjdG9yMyBtX3ZlbG9jaXR5OworCisgICAgLy8gR2FpbgorICAgIFJlZlB0cjxBdWRpb0dhaW4+
IG1fZGlzdGFuY2VHYWluOworICAgIFJlZlB0cjxBdWRpb0dhaW4+IG1fY29uZUdhaW47CisgICAg
RGlzdGFuY2VFZmZlY3QgbV9kaXN0YW5jZUVmZmVjdDsKKyAgICBDb25lRWZmZWN0IG1fY29uZUVm
ZmVjdDsKKyAgICBkb3VibGUgbV9sYXN0R2FpbjsKKworICAgIHVuc2lnbmVkIG1fY29ubmVjdGlv
bkNvdW50OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gQXVkaW9Q
YW5uZXJOb2RlX2gKSW5kZXg6IFdlYkNvcmUvd2ViYXVkaW8vQXVkaW9QYW5uZXJOb2RlLmlkbAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvUGFubmVyTm9kZS5pZGwJKHJldmlz
aW9uIDApCisrKyBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvUGFubmVyTm9kZS5pZGwJKHJldmlzaW9u
IDApCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVy
IHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVz
IG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHBy
b21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExP
U1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKyAqLworCittb2R1bGUgYXVkaW8geworICAgIGludGVyZmFjZSBbCisg
ICAgICAgIENvbmRpdGlvbmFsPVdFQl9BVURJTywKKyAgICAgICAgR2VuZXJhdGVDb25zdHJ1Y3Rv
ciwKKyAgICAgICAgR2VuZXJhdGVUb0pTCisgICAgXSBBdWRpb1Bhbm5lck5vZGUgOiBBdWRpb05v
ZGUgeworICAgICAgICAvLyBQYW5uaW5nIG1vZGVsCisgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNo
b3J0IFBBU1NUSFJPVUdIID0gMDsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgRVFVQUxQ
T1dFUiA9IDE7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IEhSVEYgPSAyOworICAgICAg
ICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTT1VOREZJRUxEID0gMzsKKworICAgICAgICAvLyBEZWZh
dWx0IG1vZGVsIGZvciBzdGVyZW8gaXMgSFJURiAKKyAgICAgICAgYXR0cmlidXRlIGxvbmcgcGFu
bmluZ01vZGVsOworCisgICAgICAgIC8vIFVzZXMgYSAzRCBjYXJ0ZXNpYW4gY29vcmRpbmF0ZSBz
eXN0ZW0gCisgICAgICAgIHZvaWQgc2V0UG9zaXRpb24oaW4gZmxvYXQgeCwgaW4gZmxvYXQgeSwg
aW4gZmxvYXQgeik7CisgICAgICAgIHZvaWQgc2V0T3JpZW50YXRpb24oaW4gZmxvYXQgeCwgaW4g
ZmxvYXQgeSwgaW4gZmxvYXQgeik7CisgICAgICAgIHZvaWQgc2V0VmVsb2NpdHkoaW4gZmxvYXQg
eCwgaW4gZmxvYXQgeSwgaW4gZmxvYXQgeik7CisKKyAgICAgICAgLy8gRGlzdGFuY2UgbW9kZWwK
KyAgICAgICAgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgZGlzdGFuY2VNb2RlbDsKKyAgICAgICAg
YXR0cmlidXRlIGZsb2F0IHJlZkRpc3RhbmNlOworICAgICAgICBhdHRyaWJ1dGUgZmxvYXQgbWF4
RGlzdGFuY2U7CisgICAgICAgIGF0dHJpYnV0ZSBmbG9hdCByb2xsb2ZmRmFjdG9yOworCisgICAg
ICAgIC8vIERpcmVjdGlvbmFsIHNvdW5kIGNvbmUKKyAgICAgICAgYXR0cmlidXRlIGZsb2F0IGNv
bmVJbm5lckFuZ2xlOworICAgICAgICBhdHRyaWJ1dGUgZmxvYXQgY29uZU91dGVyQW5nbGU7Cisg
ICAgICAgIGF0dHJpYnV0ZSBmbG9hdCBjb25lT3V0ZXJHYWluOworCisgICAgICAgIC8vIER5bmFt
aWNhbGx5IGNhbGN1bGF0ZWQgdmFsdWUgICAgICAgICAgCisgICAgICAgIHJlYWRvbmx5IGF0dHJp
YnV0ZSBBdWRpb0dhaW4gY29uZUdhaW47CisgICAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBBdWRp
b0dhaW4gZGlzdGFuY2VHYWluOworICAgIH07Cit9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>69522</attachid>
            <date>2010-10-01 14:42:43 -0700</date>
            <delta_ts>2010-10-04 16:31:22 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-46505-20101001144242.patch</filename>
            <type>text/plain</type>
            <size>23196</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2ODkyNykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTQgQEAKKzIwMTAtMTAtMDEgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgQXVkaW9QYW5uZXJOb2RlIGZpbGVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD00NjUwNQorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBzaW5jZSBhdWRp
byBBUEkgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKworICAgICAgICAqIHdlYmF1ZGlvL0F1ZGlv
UGFubmVyTm9kZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6Zml4TkFOUyk6CisgICAg
ICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OkF1ZGlvUGFubmVyTm9kZSk6CisgICAgICAg
IChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6On5BdWRpb1Bhbm5lck5vZGUpOgorICAgICAgICAo
V2ViQ29yZTo6QXVkaW9QYW5uZXJOb2RlOjpwdWxsSW5wdXRzKToKKyAgICAgICAgKFdlYkNvcmU6
OkF1ZGlvUGFubmVyTm9kZTo6cHJvY2Vzcyk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5l
ck5vZGU6OnJlc2V0KToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6aW5pdGlh
bGl6ZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OnVuaW5pdGlhbGl6ZSk6
CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6Omxpc3RlbmVyKToKKyAgICAgICAg
KFdlYkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6c2V0UGFubmluZ01vZGVsKToKKyAgICAgICAgKFdl
YkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6Z2V0QXppbXV0aEVsZXZhdGlvbik6CisgICAgICAgIChX
ZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OmRvcHBsZXJSYXRlKToKKyAgICAgICAgKFdlYkNvcmU6
OkF1ZGlvUGFubmVyTm9kZTo6ZGlzdGFuY2VDb25lR2Fpbik6CisgICAgICAgIChXZWJDb3JlOjpB
dWRpb1Bhbm5lck5vZGU6Om5vdGlmeUF1ZGlvU291cmNlc0Nvbm5lY3RlZFRvTm9kZSk6CisgICAg
ICAgICogd2ViYXVkaW8vQXVkaW9QYW5uZXJOb2RlLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29y
ZTo6QXVkaW9QYW5uZXJOb2RlOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9QYW5u
ZXJOb2RlOjpwYW5uaW5nTW9kZWwpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9QYW5uZXJOb2Rl
Ojpwb3NpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OnNldFBvc2l0
aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6b3JpZW50YXRpb24pOgor
ICAgICAgICAoV2ViQ29yZTo6QXVkaW9QYW5uZXJOb2RlOjpzZXRPcmllbnRhdGlvbik6CisgICAg
ICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OnZlbG9jaXR5KToKKyAgICAgICAgKFdlYkNv
cmU6OkF1ZGlvUGFubmVyTm9kZTo6c2V0VmVsb2NpdHkpOgorICAgICAgICAoV2ViQ29yZTo6QXVk
aW9QYW5uZXJOb2RlOjpkaXN0YW5jZU1vZGVsKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvUGFu
bmVyTm9kZTo6c2V0RGlzdGFuY2VNb2RlbCk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5l
ck5vZGU6OnJlZkRpc3RhbmNlKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6
c2V0UmVmRGlzdGFuY2UpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9QYW5uZXJOb2RlOjptYXhE
aXN0YW5jZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OnNldE1heERpc3Rh
bmNlKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6cm9sbG9mZkZhY3Rvcik6
CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OnNldFJvbGxvZmZGYWN0b3IpOgor
ICAgICAgICAoV2ViQ29yZTo6QXVkaW9QYW5uZXJOb2RlOjpjb25lSW5uZXJBbmdsZSk6CisgICAg
ICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OnNldENvbmVJbm5lckFuZ2xlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6Y29uZU91dGVyQW5nbGUpOgorICAgICAgICAo
V2ViQ29yZTo6QXVkaW9QYW5uZXJOb2RlOjpzZXRDb25lT3V0ZXJBbmdsZSk6CisgICAgICAgIChX
ZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OmNvbmVPdXRlckdhaW4pOgorICAgICAgICAoV2ViQ29y
ZTo6QXVkaW9QYW5uZXJOb2RlOjpzZXRDb25lT3V0ZXJHYWluKToKKyAgICAgICAgKFdlYkNvcmU6
OkF1ZGlvUGFubmVyTm9kZTo6ZGlzdGFuY2VHYWluKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlv
UGFubmVyTm9kZTo6Y29uZUdhaW4pOgorICAgICAgICAqIHdlYmF1ZGlvL0F1ZGlvUGFubmVyTm9k
ZS5pZGw6IEFkZGVkLgorCiAyMDEwLTEwLTAxICBEYXZpZCBIeWF0dCAgPGh5YXR0QGFwcGxlLmNv
bT4KIAogICAgICAgICBSZXZpZXdlZCBieSBTYW0gV2VpbmlnLgpJbmRleDogV2ViQ29yZS93ZWJh
dWRpby9BdWRpb1Bhbm5lck5vZGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvd2ViYXVkaW8v
QXVkaW9QYW5uZXJOb2RlLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvd2ViYXVkaW8vQXVk
aW9QYW5uZXJOb2RlLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwzMjEgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJ
bmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBt
YXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAg
IGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz
c2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMg
Q09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRT
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAq
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUoV0VCX0FVRElPKQorCisjaW5jbHVkZSAiQXVkaW9Q
YW5uZXJOb2RlLmgiCisKKyNpbmNsdWRlICJBdWRpb0J1ZmZlclNvdXJjZU5vZGUuaCIKKyNpbmNs
dWRlICJBdWRpb0J1cy5oIgorI2luY2x1ZGUgIkF1ZGlvQ29udGV4dC5oIgorI2luY2x1ZGUgIkF1
ZGlvTm9kZUlucHV0LmgiCisjaW5jbHVkZSAiQXVkaW9Ob2RlT3V0cHV0LmgiCisjaW5jbHVkZSAi
SFJURlBhbm5lci5oIgorI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CisKK3VzaW5nIG5hbWVz
cGFjZSBzdGQ7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIHZvaWQgZml4TkFOUyhk
b3VibGUgJngpCit7CisgICAgaWYgKGlzbmFuKHgpIHx8IGlzaW5mKHgpKQorICAgICAgICB4ID0g
MC4wOworfQorCitBdWRpb1Bhbm5lck5vZGU6OkF1ZGlvUGFubmVyTm9kZShBdWRpb0NvbnRleHQq
IGNvbnRleHQsIGRvdWJsZSBzYW1wbGVSYXRlKQorICAgIDogQXVkaW9Ob2RlKGNvbnRleHQsIHNh
bXBsZVJhdGUpCisgICAgLCBtX3Bhbm5pbmdNb2RlbChQYW5uZXI6OlBhbm5pbmdNb2RlbEhSVEYp
CisgICAgLCBtX2xhc3RHYWluKC0xLjApCisgICAgLCBtX2Nvbm5lY3Rpb25Db3VudCgwKQorewor
ICAgIGFkZElucHV0KGFkb3B0UHRyKG5ldyBBdWRpb05vZGVJbnB1dCh0aGlzKSkpOworICAgIGFk
ZE91dHB1dChhZG9wdFB0cihuZXcgQXVkaW9Ob2RlT3V0cHV0KHRoaXMsIDIpKSk7CisgICAgCisg
ICAgbV9kaXN0YW5jZUdhaW4gPSBBdWRpb0dhaW46OmNyZWF0ZSgiZGlzdGFuY2VHYWluIiwgMS4w
LCAwLjAsIDEuMCk7CisgICAgbV9jb25lR2FpbiA9IEF1ZGlvR2Fpbjo6Y3JlYXRlKCJjb25lR2Fp
biIsIDEuMCwgMC4wLCAxLjApOworCisgICAgbV9wb3NpdGlvbiA9IFZlY3RvcjMoMCwgMCwgMCk7
CisgICAgbV9vcmllbnRhdGlvbiA9IFZlY3RvcjMoMSwgMCwgMCk7CisgICAgbV92ZWxvY2l0eSA9
IFZlY3RvcjMoMCwgMCwgMCk7CisgICAgCisgICAgc2V0VHlwZShOb2RlVHlwZVBhbm5lcik7CisK
KyAgICBpbml0aWFsaXplKCk7Cit9CisKK0F1ZGlvUGFubmVyTm9kZTo6fkF1ZGlvUGFubmVyTm9k
ZSgpCit7CisgICAgdW5pbml0aWFsaXplKCk7Cit9CisKK3ZvaWQgQXVkaW9QYW5uZXJOb2RlOjpw
dWxsSW5wdXRzKHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpCit7CisgICAgLy8gV2Ugb3ZlcnJpZGUg
cHVsbElucHV0cygpLCBzbyB3ZSBjYW4gZGV0ZWN0IG5ldyBBdWRpb1NvdXJjZU5vZGVzIHdoaWNo
IGhhdmUgY29ubmVjdGVkIHRvIHVzIHdoZW4gbmV3IGNvbm5lY3Rpb25zIGFyZSBtYWRlLgorICAg
IC8vIFRoZXNlIEF1ZGlvU291cmNlTm9kZXMgbmVlZCB0byBiZSBtYWRlIGF3YXJlIG9mIG91ciBl
eGlzdGVuY2UgaW4gb3JkZXIgdG8gaGFuZGxlIGRvcHBsZXIgc2hpZnQgcGl0Y2ggY2hhbmdlcy4K
KyAgICBpZiAobV9jb25uZWN0aW9uQ291bnQgIT0gY29udGV4dCgpLT5jb25uZWN0aW9uQ291bnQo
KSkgeworICAgICAgICBtX2Nvbm5lY3Rpb25Db3VudCA9IGNvbnRleHQoKS0+Y29ubmVjdGlvbkNv
dW50KCk7CisKKyAgICAgICAgLy8gUmVjdXJzaXZlbHkgZ28gdGhyb3VnaCBhbGwgbm9kZXMgY29u
bmVjdGVkIHRvIHVzLgorICAgICAgICBub3RpZnlBdWRpb1NvdXJjZXNDb25uZWN0ZWRUb05vZGUo
dGhpcyk7CisgICAgfQorICAgIAorICAgIEF1ZGlvTm9kZTo6cHVsbElucHV0cyhmcmFtZXNUb1By
b2Nlc3MpOworfQorCit2b2lkIEF1ZGlvUGFubmVyTm9kZTo6cHJvY2VzcyhzaXplX3QgZnJhbWVz
VG9Qcm9jZXNzKQoreworICAgIEF1ZGlvQnVzKiBkZXN0aW5hdGlvbiA9IG91dHB1dCgwKS0+YnVz
KCk7CisKKyAgICBpZiAoIWlzSW5pdGlhbGl6ZWQoKSB8fCAhaW5wdXQoMCktPmlzQ29ubmVjdGVk
KCkgfHwgIW1fcGFubmVyLmdldCgpKSB7CisgICAgICAgIGRlc3RpbmF0aW9uLT56ZXJvKCk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBdWRpb0J1cyogc291cmNlID0gaW5wdXQoMCkt
PmJ1cygpOworCisgICAgaWYgKCFzb3VyY2UpIHsKKyAgICAgICAgZGVzdGluYXRpb24tPnplcm8o
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEFwcGx5IHRoZSBwYW5uaW5nIGVm
ZmVjdC4KKyAgICBkb3VibGUgYXppbXV0aDsKKyAgICBkb3VibGUgZWxldmF0aW9uOworICAgIGdl
dEF6aW11dGhFbGV2YXRpb24oJmF6aW11dGgsICZlbGV2YXRpb24pOworICAgIG1fcGFubmVyLT5w
YW4oYXppbXV0aCwgZWxldmF0aW9uLCBzb3VyY2UsIGRlc3RpbmF0aW9uLCBmcmFtZXNUb1Byb2Nl
c3MpOworCisgICAgLy8gR2V0IHRoZSBkaXN0YW5jZSBhbmQgY29uZSBnYWluLgorICAgIGRvdWJs
ZSB0b3RhbEdhaW4gPSBkaXN0YW5jZUNvbmVHYWluKCk7CisKKyAgICAvLyBTbmFwIHRvIGRlc2ly
ZWQgZ2FpbiBhdCB0aGUgYmVnaW5uaW5nLgorICAgIGlmIChtX2xhc3RHYWluID09IC0xLjApCisg
ICAgICAgIG1fbGFzdEdhaW4gPSB0b3RhbEdhaW47CisgICAgICAgIAorICAgIC8vIEFwcGx5IGdh
aW4gaW4tcGxhY2Ugd2l0aCBkZS16aXBwZXJpbmcuCisgICAgZGVzdGluYXRpb24tPmNvcHlXaXRo
R2FpbkZyb20oKmRlc3RpbmF0aW9uLCAmbV9sYXN0R2FpbiwgdG90YWxHYWluKTsKK30KKwordm9p
ZCBBdWRpb1Bhbm5lck5vZGU6OnJlc2V0KCkKK3sKKyAgICBtX2xhc3RHYWluID0gLTEuMDsgLy8g
Zm9yY2UgdG8gc25hcCB0byBpbml0aWFsIGdhaW4KKyAgICBpZiAobV9wYW5uZXIuZ2V0KCkpCisg
ICAgICAgIG1fcGFubmVyLT5yZXNldCgpOworfQorCit2b2lkIEF1ZGlvUGFubmVyTm9kZTo6aW5p
dGlhbGl6ZSgpCit7CisgICAgaWYgKGlzSW5pdGlhbGl6ZWQoKSkKKyAgICAgICAgcmV0dXJuOwor
ICAgICAgICAKKyAgICBtX3Bhbm5lciA9IFBhbm5lcjo6Y3JlYXRlKG1fcGFubmluZ01vZGVsLCBz
YW1wbGVSYXRlKCkpOworCisgICAgQXVkaW9Ob2RlOjppbml0aWFsaXplKCk7Cit9CisKK3ZvaWQg
QXVkaW9QYW5uZXJOb2RlOjp1bmluaXRpYWxpemUoKQoreworICAgIGlmICghaXNJbml0aWFsaXpl
ZCgpKQorICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgIG1fcGFubmVyLmNsZWFyKCk7Cisg
ICAgQXVkaW9Ob2RlOjp1bmluaXRpYWxpemUoKTsKK30KKworQXVkaW9MaXN0ZW5lciogQXVkaW9Q
YW5uZXJOb2RlOjpsaXN0ZW5lcigpCit7CisgICAgcmV0dXJuIGNvbnRleHQoKS0+bGlzdGVuZXIo
KTsKK30KKwordm9pZCBBdWRpb1Bhbm5lck5vZGU6OnNldFBhbm5pbmdNb2RlbCh1bnNpZ25lZCBt
b2RlbCkKK3sKKyAgICBpZiAoIW1fcGFubmVyLmdldCgpIHx8IG1vZGVsICE9IG1fcGFubmluZ01v
ZGVsKSB7CisgICAgICAgIE93blB0cjxQYW5uZXI+IG5ld1Bhbm5lciA9IFBhbm5lcjo6Y3JlYXRl
KG1vZGVsLCBzYW1wbGVSYXRlKCkpOworICAgICAgICBtX3Bhbm5lciA9IG5ld1Bhbm5lci5yZWxl
YXNlKCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUGFubmVyTm9kZTo6Z2V0QXppbXV0aEVsZXZh
dGlvbihkb3VibGUqIG91dEF6aW11dGgsIGRvdWJsZSogb3V0RWxldmF0aW9uKQoreworICAgIC8v
IEZJWE1FOiB3ZSBzaG91bGQgY2FjaGUgYXppbXV0aCBhbmQgZWxldmF0aW9uIChpZiBwb3NzaWJs
ZSksIHNvIHdlIG9ubHkgcmUtY2FsY3VsYXRlIGlmIGEgY2hhbmdlIGhhcyBiZWVuIG1hZGUuCisK
KyAgICBkb3VibGUgYXppbXV0aCA9IDAuMDsKKworICAgIC8vIENhbGN1bGF0ZSB0aGUgc291cmNl
LWxpc3RlbmVyIHZlY3RvcgorICAgIFZlY3RvcjMgbGlzdGVuZXJQb3NpdGlvbiA9IGxpc3RlbmVy
KCktPnBvc2l0aW9uKCk7CisgICAgVmVjdG9yMyBzb3VyY2VMaXN0ZW5lciA9IG1fcG9zaXRpb24g
LSBsaXN0ZW5lclBvc2l0aW9uOworCisgICAgaWYgKHNvdXJjZUxpc3RlbmVyLmlzWmVybygpKSB7
CisgICAgICAgIC8vIGRlZ2VuZXJhdGUgY2FzZSBpZiBzb3VyY2UgYW5kIGxpc3RlbmVyIGFyZSBh
dCB0aGUgc2FtZSBwb2ludAorICAgICAgICAqb3V0QXppbXV0aCA9IDAuMDsKKyAgICAgICAgKm91
dEVsZXZhdGlvbiA9IDAuMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNvdXJjZUxp
c3RlbmVyLm5vcm1hbGl6ZSgpOworCisgICAgLy8gQWxpZ24gYXhlcworICAgIFZlY3RvcjMgbGlz
dGVuZXJGcm9udCA9IGxpc3RlbmVyKCktPm9yaWVudGF0aW9uKCk7CisgICAgVmVjdG9yMyBsaXN0
ZW5lclVwID0gbGlzdGVuZXIoKS0+dXBWZWN0b3IoKTsKKyAgICBWZWN0b3IzIGxpc3RlbmVyUmln
aHQgPSBjcm9zcyhsaXN0ZW5lckZyb250LCBsaXN0ZW5lclVwKTsKKyAgICBsaXN0ZW5lclJpZ2h0
Lm5vcm1hbGl6ZSgpOworCisgICAgVmVjdG9yMyBsaXN0ZW5lckZyb250Tm9ybSA9IGxpc3RlbmVy
RnJvbnQ7CisgICAgbGlzdGVuZXJGcm9udE5vcm0ubm9ybWFsaXplKCk7CisKKyAgICBWZWN0b3Iz
IHVwID0gY3Jvc3MobGlzdGVuZXJSaWdodCwgbGlzdGVuZXJGcm9udE5vcm0pOworCisgICAgZG91
YmxlIHVwUHJvamVjdGlvbiA9IGRvdChzb3VyY2VMaXN0ZW5lciwgdXApOworCisgICAgVmVjdG9y
MyBwcm9qZWN0ZWRTb3VyY2UgPSBzb3VyY2VMaXN0ZW5lciAtIHVwUHJvamVjdGlvbiAqIHVwOwor
ICAgIHByb2plY3RlZFNvdXJjZS5ub3JtYWxpemUoKTsKKworICAgIGF6aW11dGggPSAxODAuMCAq
IGFjb3MoZG90KHByb2plY3RlZFNvdXJjZSwgbGlzdGVuZXJSaWdodCkpIC8gTV9QSTsKKyAgICBm
aXhOQU5TKGF6aW11dGgpOyAvLyBhdm9pZCBpbGxlZ2FsIHZhbHVlcworCisgICAgLy8gU291cmNl
ICBpbiBmcm9udCBvciBiZWhpbmQgdGhlIGxpc3RlbmVyCisgICAgZG91YmxlIGZyb250QmFjayA9
IGRvdChwcm9qZWN0ZWRTb3VyY2UsIGxpc3RlbmVyRnJvbnROb3JtKTsKKyAgICBpZiAoZnJvbnRC
YWNrIDwgMC4wKQorICAgICAgICBhemltdXRoID0gMzYwLjAgLSBhemltdXRoOworCisgICAgLy8g
TWFrZSBhemltdXRoIHJlbGF0aXZlIHRvICJmcm9udCIgYW5kIG5vdCAicmlnaHQiIGxpc3RlbmVy
IHZlY3RvcgorICAgIGlmICgoYXppbXV0aCA+PSAwLjApICYmIChhemltdXRoIDw9IDI3MC4wKSkK
KyAgICAgICAgYXppbXV0aCA9IDkwLjAgLSBhemltdXRoOworICAgIGVsc2UKKyAgICAgICAgYXpp
bXV0aCA9IDQ1MC4wIC0gYXppbXV0aDsKKworICAgIC8vIEVsZXZhdGlvbgorICAgIGRvdWJsZSBl
bGV2YXRpb24gPSA5MC4wIC0gMTgwLjAgKiBhY29zKGRvdChzb3VyY2VMaXN0ZW5lciwgdXApKSAv
IE1fUEk7CisgICAgZml4TkFOUyhhemltdXRoKTsgLy8gYXZvaWQgaWxsZWdhbCB2YWx1ZXMKKwor
ICAgIGlmIChlbGV2YXRpb24gPiA5MC4wKQorICAgICAgICBlbGV2YXRpb24gPSAxODAuMCAtIGVs
ZXZhdGlvbjsKKyAgICBpZiAoZWxldmF0aW9uIDwgLTkwLjApCisgICAgICAgIGVsZXZhdGlvbiA9
IC0xODAuMCAtIGVsZXZhdGlvbjsKKworICAgIGlmIChvdXRBemltdXRoKQorICAgICAgICAqb3V0
QXppbXV0aCA9IGF6aW11dGg7CisgICAgaWYgKG91dEVsZXZhdGlvbikKKyAgICAgICAgKm91dEVs
ZXZhdGlvbiA9IGVsZXZhdGlvbjsKK30KKworZmxvYXQgQXVkaW9QYW5uZXJOb2RlOjpkb3BwbGVy
UmF0ZSgpCit7CisgICAgZG91YmxlIGRvcHBsZXJTaGlmdCA9IDEuMDsKKworICAgIC8vIEZJWE1F
OiBvcHRpbWl6ZSBmb3IgY2FzZSB3aGVuIG5laXRoZXIgc291cmNlIG5vciBsaXN0ZW5lciBoYXMg
Y2hhbmdlZC4uLgorICAgIGRvdWJsZSBkb3BwbGVyRmFjdG9yID0gbGlzdGVuZXIoKS0+ZG9wcGxl
ckZhY3RvcigpOworCisgICAgaWYgKGRvcHBsZXJGYWN0b3IgPiAwLjApIHsKKyAgICAgICAgZG91
YmxlIHNwZWVkT2ZTb3VuZCA9IGxpc3RlbmVyKCktPnNwZWVkT2ZTb3VuZCgpOworCisgICAgICAg
IGNvbnN0IFZlY3RvcjMgJnNvdXJjZVZlbG9jaXR5ID0gbV92ZWxvY2l0eTsKKyAgICAgICAgY29u
c3QgVmVjdG9yMyAmbGlzdGVuZXJWZWxvY2l0eSA9IGxpc3RlbmVyKCktPnZlbG9jaXR5KCk7CisK
KyAgICAgICAgLy8gRG9uJ3QgYm90aGVyIGlmIGJvdGggc291cmNlIGFuZCBsaXN0ZW5lciBoYXZl
IG5vIHZlbG9jaXR5CisgICAgICAgIGJvb2wgc291cmNlSGFzVmVsb2NpdHkgPSAhc291cmNlVmVs
b2NpdHkuaXNaZXJvKCk7CisgICAgICAgIGJvb2wgbGlzdGVuZXJIYXNWZWxvY2l0eSA9ICFsaXN0
ZW5lclZlbG9jaXR5LmlzWmVybygpOworCisgICAgICAgIGlmIChzb3VyY2VIYXNWZWxvY2l0eSB8
fCBsaXN0ZW5lckhhc1ZlbG9jaXR5KSB7CisgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHNv
dXJjZSB0byBsaXN0ZW5lciB2ZWN0b3IKKyAgICAgICAgICAgIFZlY3RvcjMgbGlzdGVuZXJQb3Np
dGlvbiA9IGxpc3RlbmVyKCktPnBvc2l0aW9uKCk7CisgICAgICAgICAgICBWZWN0b3IzIHNvdXJj
ZVRvTGlzdGVuZXIgPSBtX3Bvc2l0aW9uIC0gbGlzdGVuZXJQb3NpdGlvbjsKKworICAgICAgICAg
ICAgZG91YmxlIHNvdXJjZUxpc3RlbmVyTWFnbml0dWRlID0gc291cmNlVG9MaXN0ZW5lci5hYnMo
KTsKKworICAgICAgICAgICAgZG91YmxlIGxpc3RlbmVyUHJvamVjdGlvbiA9IGRvdChzb3VyY2VU
b0xpc3RlbmVyLCBsaXN0ZW5lclZlbG9jaXR5KSAvIHNvdXJjZUxpc3RlbmVyTWFnbml0dWRlOwor
ICAgICAgICAgICAgZG91YmxlIHNvdXJjZVByb2plY3Rpb24gPSBkb3Qoc291cmNlVG9MaXN0ZW5l
ciwgc291cmNlVmVsb2NpdHkpIC8gc291cmNlTGlzdGVuZXJNYWduaXR1ZGU7CisKKyAgICAgICAg
ICAgIGxpc3RlbmVyUHJvamVjdGlvbiA9IC1saXN0ZW5lclByb2plY3Rpb247CisgICAgICAgICAg
ICBzb3VyY2VQcm9qZWN0aW9uID0gLXNvdXJjZVByb2plY3Rpb247CisKKyAgICAgICAgICAgIGRv
dWJsZSBzY2FsZWRTcGVlZE9mU291bmQgPSBzcGVlZE9mU291bmQgLyBkb3BwbGVyRmFjdG9yOwor
ICAgICAgICAgICAgbGlzdGVuZXJQcm9qZWN0aW9uID0gbWluKGxpc3RlbmVyUHJvamVjdGlvbiwg
c2NhbGVkU3BlZWRPZlNvdW5kKTsKKyAgICAgICAgICAgIHNvdXJjZVByb2plY3Rpb24gPSBtaW4o
c291cmNlUHJvamVjdGlvbiwgc2NhbGVkU3BlZWRPZlNvdW5kKTsKKworICAgICAgICAgICAgZG9w
cGxlclNoaWZ0ID0gKChzcGVlZE9mU291bmQgLSBkb3BwbGVyRmFjdG9yICogbGlzdGVuZXJQcm9q
ZWN0aW9uKSAvIChzcGVlZE9mU291bmQgLSBkb3BwbGVyRmFjdG9yICogc291cmNlUHJvamVjdGlv
bikpOworICAgICAgICAgICAgZml4TkFOUyhkb3BwbGVyU2hpZnQpOyAvLyBhdm9pZCBpbGxlZ2Fs
IHZhbHVlcworCisgICAgICAgICAgICAvLyBMaW1pdCB0aGUgcGl0Y2ggc2hpZnRpbmcgdG8gNCBv
Y3RhdmVzIHVwIGFuZCAzIG9jdGF2ZXMgZG93bi4KKyAgICAgICAgICAgIGlmIChkb3BwbGVyU2hp
ZnQgPiAxNi4wKQorICAgICAgICAgICAgICAgIGRvcHBsZXJTaGlmdCA9IDE2LjA7CisgICAgICAg
ICAgICBlbHNlIGlmIChkb3BwbGVyU2hpZnQgPCAwLjEyNSkKKyAgICAgICAgICAgICAgICBkb3Bw
bGVyU2hpZnQgPSAwLjEyNTsgICAKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdGF0
aWNfY2FzdDxmbG9hdD4oZG9wcGxlclNoaWZ0KTsKK30KKworZmxvYXQgQXVkaW9QYW5uZXJOb2Rl
OjpkaXN0YW5jZUNvbmVHYWluKCkKK3sKKyAgICBWZWN0b3IzIGxpc3RlbmVyUG9zaXRpb24gPSBs
aXN0ZW5lcigpLT5wb3NpdGlvbigpOworCisgICAgZG91YmxlIGxpc3RlbmVyRGlzdGFuY2UgPSBk
aXN0YW5jZShtX3Bvc2l0aW9uLCBsaXN0ZW5lclBvc2l0aW9uKTsKKyAgICBkb3VibGUgZGlzdGFu
Y2VHYWluID0gbV9kaXN0YW5jZUVmZmVjdC5nYWluKGxpc3RlbmVyRGlzdGFuY2UpOworICAgIAor
ICAgIG1fZGlzdGFuY2VHYWluLT5zZXRWYWx1ZSgoZmxvYXQpZGlzdGFuY2VHYWluKTsKKworICAg
IC8vIEZJWE1FOiBjb3VsZCBvcHRpbWl6ZSBieSBjYWNoaW5nIGNvbmVHYWluCisgICAgZG91Ymxl
IGNvbmVHYWluID0gbV9jb25lRWZmZWN0LmdhaW4obV9wb3NpdGlvbiwgbV9vcmllbnRhdGlvbiwg
bGlzdGVuZXJQb3NpdGlvbik7CisgICAgCisgICAgbV9jb25lR2Fpbi0+c2V0VmFsdWUoKGZsb2F0
KWNvbmVHYWluKTsKKworICAgIHJldHVybiBmbG9hdChkaXN0YW5jZUdhaW4gKiBjb25lR2Fpbik7
Cit9CisKK3ZvaWQgQXVkaW9QYW5uZXJOb2RlOjpub3RpZnlBdWRpb1NvdXJjZXNDb25uZWN0ZWRU
b05vZGUoQXVkaW9Ob2RlKiBub2RlKQoreworICAgIEFTU0VSVChub2RlKTsKKyAgICBpZiAoIW5v
ZGUpCisgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhp
cyBub2RlIGlzIGFuIEF1ZGlvQnVmZmVyU291cmNlTm9kZS4gIElmIHNvLCBsZXQgaXQga25vdyBh
Ym91dCB1cyBzbyB0aGF0IGRvcHBsZXIgc2hpZnQgcGl0Y2ggY2FuIGJlIHRha2VuIGludG8gYWNj
b3VudC4KKyAgICBpZiAobm9kZS0+dHlwZSgpID09IE5vZGVUeXBlQXVkaW9CdWZmZXJTb3VyY2Up
IHsKKyAgICAgICAgQXVkaW9CdWZmZXJTb3VyY2VOb2RlKiBidWZmZXJTb3VyY2VOb2RlID0gcmVp
bnRlcnByZXRfY2FzdDxBdWRpb0J1ZmZlclNvdXJjZU5vZGUqPihub2RlKTsKKyAgICAgICAgYnVm
ZmVyU291cmNlTm9kZS0+c2V0UGFubmVyTm9kZSh0aGlzKTsKKyAgICB9IGVsc2UgeyAgICAKKyAg
ICAgICAgLy8gR28gdGhyb3VnaCBhbGwgaW5wdXRzIHRvIHRoaXMgbm9kZS4KKyAgICAgICAgZm9y
ICh1bnNpZ25lZCBpID0gMDsgaSA8IG5vZGUtPm51bWJlck9mSW5wdXRzKCk7ICsraSkgeworICAg
ICAgICAgICAgQXVkaW9Ob2RlSW5wdXQqIGlucHV0ID0gbm9kZS0+aW5wdXQoaSk7CisKKyAgICAg
ICAgICAgIC8vIEZvciBlYWNoIGlucHV0LCBnbyB0aHJvdWdoIGFsbCBvZiBpdHMgY29ubmVjdGlv
bnMsIGxvb2tpbmcgZm9yIEF1ZGlvQnVmZmVyU291cmNlTm9kZXMuCisgICAgICAgICAgICBmb3Ig
KHVuc2lnbmVkIGogPSAwOyBqIDwgaW5wdXQtPm51bWJlck9mQ29ubmVjdGlvbnMoKTsgKytqKSB7
CisgICAgICAgICAgICAgICAgQXVkaW9Ob2RlT3V0cHV0KiBjb25uZWN0ZWRPdXRwdXQgPSBpbnB1
dC0+b3V0cHV0KGopOworICAgICAgICAgICAgICAgIEF1ZGlvTm9kZSogY29ubmVjdGVkTm9kZSA9
IGNvbm5lY3RlZE91dHB1dC0+bm9kZSgpOworICAgICAgICAgICAgICAgIG5vdGlmeUF1ZGlvU291
cmNlc0Nvbm5lY3RlZFRvTm9kZShjb25uZWN0ZWROb2RlKTsgLy8gcmVjdXJzZQorICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNl
bmRpZiAvLyBFTkFCTEUoV0VCX0FVRElPKQpJbmRleDogV2ViQ29yZS93ZWJhdWRpby9BdWRpb1Bh
bm5lck5vZGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvUGFubmVyTm9k
ZS5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS93ZWJhdWRpby9BdWRpb1Bhbm5lck5vZGUuaAko
cmV2aXNpb24gMCkKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAg
R29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMu
ICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3Ig
dGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRv
cnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2Fy
ZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJ
UyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIEF1ZGlvUGFubmVyTm9kZV9o
CisjZGVmaW5lIEF1ZGlvUGFubmVyTm9kZV9oCisKKyNpbmNsdWRlICJBdWRpb0J1cy5oIgorI2lu
Y2x1ZGUgIkF1ZGlvR2Fpbi5oIgorI2luY2x1ZGUgIkF1ZGlvTGlzdGVuZXIuaCIKKyNpbmNsdWRl
ICJBdWRpb05vZGUuaCIKKyNpbmNsdWRlICJDb25lLmgiCisjaW5jbHVkZSAiRGlzdGFuY2UuaCIK
KyNpbmNsdWRlICJQYW5uZXIuaCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8
d3RmL1ZlY3RvcjMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBBdWRpb1Bhbm5lck5v
ZGUgaXMgYW4gQXVkaW9Ob2RlIHdpdGggb25lIGlucHV0IGFuZCBvbmUgb3V0cHV0LgorLy8gSXQg
cG9zaXRpb25zIGEgc291bmQgaW4gM0Qgc3BhY2UsIHdpdGggdGhlIGV4YWN0IGVmZmVjdCBkZXBl
bmRlbnQgb24gdGhlIHBhbm5pbmcgbW9kZWwuCisvLyBJdCBoYXMgYSBwb3NpdGlvbiBhbmQgYW4g
b3JpZW50YXRpb24gaW4gM0Qgc3BhY2Ugd2hpY2ggaXMgcmVsYXRpdmUgdG8gdGhlIHBvc2l0aW9u
IGFuZCBvcmllbnRhdGlvbiBvZiB0aGUgY29udGV4dCdzIEF1ZGlvTGlzdGVuZXIuCisvLyBBIGRp
c3RhbmNlIGVmZmVjdCB3aWxsIGF0dGVudWF0ZSB0aGUgZ2FpbiBhcyB0aGUgcG9zaXRpb24gbW92
ZXMgYXdheSBmcm9tIHRoZSBsaXN0ZW5lci4KKy8vIEEgY29uZSBlZmZlY3Qgd2lsbCBhdHRlbnVh
dGUgdGhlIGdhaW4gYXMgdGhlIG9yaWVudGF0aW9uIG1vdmVzIGF3YXkgZnJvbSB0aGUgbGlzdGVu
ZXIuCisvLyBBbGwgb2YgdGhlc2UgZWZmZWN0cyBmb2xsb3cgdGhlIE9wZW5BTCBzcGVjaWZpY2F0
aW9uIHZlcnkgY2xvc2VseS4KKworY2xhc3MgQXVkaW9QYW5uZXJOb2RlIDogcHVibGljIEF1ZGlv
Tm9kZSB7CitwdWJsaWM6CisgICAgZW51bSB7CisgICAgICAgIFBBU1NUSFJPVUdIID0gMCwKKyAg
ICAgICAgRVFVQUxQT1dFUiA9IDEsCisgICAgICAgIEhSVEYgPSAyLAorICAgICAgICBTT1VOREZJ
RUxEID0gMywKKyAgICAgICAgTUFUUklYTUlYID0gNAorICAgIH07CisKKyAgICBzdGF0aWMgUGFz
c1JlZlB0cjxBdWRpb1Bhbm5lck5vZGU+IGNyZWF0ZShBdWRpb0NvbnRleHQqIGNvbnRleHQsIGRv
dWJsZSBzYW1wbGVSYXRlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBBdWRp
b1Bhbm5lck5vZGUoY29udGV4dCwgc2FtcGxlUmF0ZSkpOworICAgIH0KKworICAgIHZpcnR1YWwg
fkF1ZGlvUGFubmVyTm9kZSgpOworCisgICAgLy8gQXVkaW9Ob2RlCisgICAgdmlydHVhbCB2b2lk
IHByb2Nlc3Moc2l6ZV90IGZyYW1lc1RvUHJvY2Vzcyk7CisgICAgdmlydHVhbCB2b2lkIHB1bGxJ
bnB1dHMoc2l6ZV90IGZyYW1lc1RvUHJvY2Vzcyk7CisgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7
CisgICAgdmlydHVhbCB2b2lkIGluaXRpYWxpemUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgdW5pbml0
aWFsaXplKCk7CisKKyAgICAvLyBMaXN0ZW5lcgorICAgIEF1ZGlvTGlzdGVuZXIqIGxpc3RlbmVy
KCk7CisKKyAgICAvLyBQYW5uaW5nIG1vZGVsCisgICAgdW5zaWduZWQgcGFubmluZ01vZGVsKCkg
Y29uc3QgeyByZXR1cm4gbV9wYW5uaW5nTW9kZWw7IH0KKyAgICB2b2lkIHNldFBhbm5pbmdNb2Rl
bCh1bnNpZ25lZCBtb2RlbCk7CisKKyAgICAvLyBQb3NpdGlvbgorICAgIFZlY3RvcjMgcG9zaXRp
b24oKSBjb25zdCB7IHJldHVybiBtX3Bvc2l0aW9uOyB9CisgICAgdm9pZCBzZXRQb3NpdGlvbihm
bG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7IG1fcG9zaXRpb24gPSBWZWN0b3IzKHgsIHksIHop
OyB9CisKKyAgICAvLyBPcmllbnRhdGlvbgorICAgIFZlY3RvcjMgb3JpZW50YXRpb24oKSBjb25z
dCB7IHJldHVybiBtX3Bvc2l0aW9uOyB9CisgICAgdm9pZCBzZXRPcmllbnRhdGlvbihmbG9hdCB4
LCBmbG9hdCB5LCBmbG9hdCB6KSB7IG1fb3JpZW50YXRpb24gPSBWZWN0b3IzKHgsIHksIHopOyB9
CisKKyAgICAvLyBWZWxvY2l0eQorICAgIFZlY3RvcjMgdmVsb2NpdHkoKSBjb25zdCB7IHJldHVy
biBtX3ZlbG9jaXR5OyB9CisgICAgdm9pZCBzZXRWZWxvY2l0eShmbG9hdCB4LCBmbG9hdCB5LCBm
bG9hdCB6KSB7IG1fdmVsb2NpdHkgPSBWZWN0b3IzKHgsIHksIHopOyB9CisKKyAgICAvLyBEaXN0
YW5jZSBwYXJhbWV0ZXJzCisgICAgdW5zaWduZWQgZGlzdGFuY2VNb2RlbCgpIHsgcmV0dXJuIG1f
ZGlzdGFuY2VFZmZlY3QubW9kZWwoKTsgfQorICAgIHZvaWQgc2V0RGlzdGFuY2VNb2RlbCh1bnNp
Z25lZCBtb2RlbCkgeyBtX2Rpc3RhbmNlRWZmZWN0LnNldE1vZGVsKHN0YXRpY19jYXN0PERpc3Rh
bmNlRWZmZWN0OjpNb2RlbFR5cGU+KG1vZGVsKSwgdHJ1ZSk7IH0KKyAgICAKKyAgICBmbG9hdCBy
ZWZEaXN0YW5jZSgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0PihtX2Rpc3RhbmNlRWZmZWN0
LnJlZkRpc3RhbmNlKCkpOyB9CisgICAgdm9pZCBzZXRSZWZEaXN0YW5jZShmbG9hdCByZWZEaXN0
YW5jZSkgeyBtX2Rpc3RhbmNlRWZmZWN0LnNldFJlZkRpc3RhbmNlKHJlZkRpc3RhbmNlKTsgfQor
CisgICAgZmxvYXQgbWF4RGlzdGFuY2UoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxmbG9hdD4obV9k
aXN0YW5jZUVmZmVjdC5tYXhEaXN0YW5jZSgpKTsgfQorICAgIHZvaWQgc2V0TWF4RGlzdGFuY2Uo
ZmxvYXQgbWF4RGlzdGFuY2UpIHsgbV9kaXN0YW5jZUVmZmVjdC5zZXRNYXhEaXN0YW5jZShtYXhE
aXN0YW5jZSk7IH0KKworICAgIGZsb2F0IHJvbGxvZmZGYWN0b3IoKSB7IHJldHVybiBzdGF0aWNf
Y2FzdDxmbG9hdD4obV9kaXN0YW5jZUVmZmVjdC5yb2xsb2ZmRmFjdG9yKCkpOyB9CisgICAgdm9p
ZCBzZXRSb2xsb2ZmRmFjdG9yKGZsb2F0IHJvbGxvZmZGYWN0b3IpIHsgbV9kaXN0YW5jZUVmZmVj
dC5zZXRSb2xsb2ZmRmFjdG9yKHJvbGxvZmZGYWN0b3IpOyB9CisKKyAgICAvLyBTb3VuZCBjb25l
cyAtIGFuZ2xlcyBpbiBkZWdyZWVzCisgICAgZmxvYXQgY29uZUlubmVyQW5nbGUoKSBjb25zdCB7
IHJldHVybiBzdGF0aWNfY2FzdDxmbG9hdD4obV9jb25lRWZmZWN0LmlubmVyQW5nbGUoKSk7IH0K
KyAgICB2b2lkIHNldENvbmVJbm5lckFuZ2xlKGZsb2F0IGFuZ2xlKSB7IG1fY29uZUVmZmVjdC5z
ZXRJbm5lckFuZ2xlKGFuZ2xlKTsgfQorCisgICAgZmxvYXQgY29uZU91dGVyQW5nbGUoKSBjb25z
dCB7IHJldHVybiBzdGF0aWNfY2FzdDxmbG9hdD4obV9jb25lRWZmZWN0Lm91dGVyQW5nbGUoKSk7
IH0KKyAgICB2b2lkIHNldENvbmVPdXRlckFuZ2xlKGZsb2F0IGFuZ2xlKSB7IG1fY29uZUVmZmVj
dC5zZXRPdXRlckFuZ2xlKGFuZ2xlKTsgfQorCisgICAgZmxvYXQgY29uZU91dGVyR2FpbigpIGNv
bnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0PihtX2NvbmVFZmZlY3Qub3V0ZXJHYWluKCkp
OyB9CisgICAgdm9pZCBzZXRDb25lT3V0ZXJHYWluKGZsb2F0IGFuZ2xlKSB7IG1fY29uZUVmZmVj
dC5zZXRPdXRlckdhaW4oYW5nbGUpOyB9CisKKyAgICB2b2lkIGdldEF6aW11dGhFbGV2YXRpb24o
ZG91YmxlKiBvdXRBemltdXRoLCBkb3VibGUqIG91dEVsZXZhdGlvbik7CisgICAgZmxvYXQgZG9w
cGxlclJhdGUoKTsKKworICAgIC8vIEFjY2Vzc29ycyBmb3IgZHluYW1pY2FsbHkgY2FsY3VsYXRl
ZCBnYWluIHZhbHVlcy4KKyAgICBBdWRpb0dhaW4qIGRpc3RhbmNlR2FpbigpIHsgcmV0dXJuIG1f
ZGlzdGFuY2VHYWluLmdldCgpOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIAorICAgIEF1ZGlvR2FpbiogY29uZUdhaW4oKSB7IHJldHVybiBtX2NvbmVHYWluLmdldCgp
OyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCitwcml2YXRlOgor
ICAgIEF1ZGlvUGFubmVyTm9kZShBdWRpb0NvbnRleHQqLCBkb3VibGUgc2FtcGxlUmF0ZSk7CisK
KyAgICAvLyBSZXR1cm5zIHRoZSBjb21iaW5lZCBkaXN0YW5jZSBhbmQgY29uZSBnYWluIGF0dGVu
dWF0aW9uLgorICAgIGZsb2F0IGRpc3RhbmNlQ29uZUdhaW4oKTsKKworICAgIC8vIE5vdGlmaWVz
IGFueSBBdWRpb0J1ZmZlclNvdXJjZU5vZGVzIGNvbm5lY3RlZCB0byB1cyBlaXRoZXIgZGlyZWN0
bHkgb3IgaW5kaXJlY3RseSBhYm91dCBvdXIgZXhpc3RlbmNlLgorICAgIC8vIFRoaXMgaXMgaW4g
b3JkZXIgdG8gaGFuZGxlIHRoZSBwaXRjaCBjaGFuZ2UgbmVjZXNzYXJ5IGZvciB0aGUgZG9wcGxl
ciBzaGlmdC4KKyAgICB2b2lkIG5vdGlmeUF1ZGlvU291cmNlc0Nvbm5lY3RlZFRvTm9kZShBdWRp
b05vZGUqKTsKKworICAgIE93blB0cjxQYW5uZXI+IG1fcGFubmVyOworICAgIHVuc2lnbmVkIG1f
cGFubmluZ01vZGVsOworCisgICAgVmVjdG9yMyBtX3Bvc2l0aW9uOworICAgIFZlY3RvcjMgbV9v
cmllbnRhdGlvbjsKKyAgICBWZWN0b3IzIG1fdmVsb2NpdHk7CisKKyAgICAvLyBHYWluCisgICAg
UmVmUHRyPEF1ZGlvR2Fpbj4gbV9kaXN0YW5jZUdhaW47CisgICAgUmVmUHRyPEF1ZGlvR2Fpbj4g
bV9jb25lR2FpbjsKKyAgICBEaXN0YW5jZUVmZmVjdCBtX2Rpc3RhbmNlRWZmZWN0OworICAgIENv
bmVFZmZlY3QgbV9jb25lRWZmZWN0OworICAgIGRvdWJsZSBtX2xhc3RHYWluOworCisgICAgdW5z
aWduZWQgbV9jb25uZWN0aW9uQ291bnQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisK
KyNlbmRpZiAvLyBBdWRpb1Bhbm5lck5vZGVfaApJbmRleDogV2ViQ29yZS93ZWJhdWRpby9BdWRp
b1Bhbm5lck5vZGUuaWRsCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvd2ViYXVkaW8vQXVkaW9QYW5u
ZXJOb2RlLmlkbAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvd2ViYXVkaW8vQXVkaW9QYW5uZXJO
b2RlLmlkbAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBs
ZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2Vk
IHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlz
IHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRP
UlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
CisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK21vZHVsZSBhdWRpbyB7Cisg
ICAgaW50ZXJmYWNlIFsKKyAgICAgICAgQ29uZGl0aW9uYWw9V0VCX0FVRElPLAorICAgICAgICBH
ZW5lcmF0ZUNvbnN0cnVjdG9yLAorICAgICAgICBHZW5lcmF0ZVRvSlMKKyAgICBdIEF1ZGlvUGFu
bmVyTm9kZSA6IEF1ZGlvTm9kZSB7CisgICAgICAgIC8vIFBhbm5pbmcgbW9kZWwKKyAgICAgICAg
Y29uc3QgdW5zaWduZWQgc2hvcnQgUEFTU1RIUk9VR0ggPSAwOworICAgICAgICBjb25zdCB1bnNp
Z25lZCBzaG9ydCBFUVVBTFBPV0VSID0gMTsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQg
SFJURiA9IDI7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNPVU5ERklFTEQgPSAzOwor
CisgICAgICAgIC8vIERlZmF1bHQgbW9kZWwgZm9yIHN0ZXJlbyBpcyBIUlRGIAorICAgICAgICBh
dHRyaWJ1dGUgbG9uZyBwYW5uaW5nTW9kZWw7CisKKyAgICAgICAgLy8gVXNlcyBhIDNEIGNhcnRl
c2lhbiBjb29yZGluYXRlIHN5c3RlbSAKKyAgICAgICAgdm9pZCBzZXRQb3NpdGlvbihpbiBmbG9h
dCB4LCBpbiBmbG9hdCB5LCBpbiBmbG9hdCB6KTsKKyAgICAgICAgdm9pZCBzZXRPcmllbnRhdGlv
bihpbiBmbG9hdCB4LCBpbiBmbG9hdCB5LCBpbiBmbG9hdCB6KTsKKyAgICAgICAgdm9pZCBzZXRW
ZWxvY2l0eShpbiBmbG9hdCB4LCBpbiBmbG9hdCB5LCBpbiBmbG9hdCB6KTsKKworICAgICAgICAv
LyBEaXN0YW5jZSBtb2RlbAorICAgICAgICBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBkaXN0YW5j
ZU1vZGVsOworICAgICAgICBhdHRyaWJ1dGUgZmxvYXQgcmVmRGlzdGFuY2U7CisgICAgICAgIGF0
dHJpYnV0ZSBmbG9hdCBtYXhEaXN0YW5jZTsKKyAgICAgICAgYXR0cmlidXRlIGZsb2F0IHJvbGxv
ZmZGYWN0b3I7CisKKyAgICAgICAgLy8gRGlyZWN0aW9uYWwgc291bmQgY29uZQorICAgICAgICBh
dHRyaWJ1dGUgZmxvYXQgY29uZUlubmVyQW5nbGU7CisgICAgICAgIGF0dHJpYnV0ZSBmbG9hdCBj
b25lT3V0ZXJBbmdsZTsKKyAgICAgICAgYXR0cmlidXRlIGZsb2F0IGNvbmVPdXRlckdhaW47CisK
KyAgICAgICAgLy8gRHluYW1pY2FsbHkgY2FsY3VsYXRlZCBnYWluIHZhbHVlcyAgICAgICAgICAK
KyAgICAgICAgcmVhZG9ubHkgYXR0cmlidXRlIEF1ZGlvR2FpbiBjb25lR2FpbjsKKyAgICAgICAg
cmVhZG9ubHkgYXR0cmlidXRlIEF1ZGlvR2FpbiBkaXN0YW5jZUdhaW47CisgICAgfTsKK30K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>69712</attachid>
            <date>2010-10-04 16:25:33 -0700</date>
            <delta_ts>2010-10-04 16:51:34 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-46505-20101004162531.patch</filename>
            <type>text/plain</type>
            <size>23306</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2OTA1MCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTQgQEAKKzIwMTAtMTAtMDQgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgQXVkaW9QYW5uZXJOb2RlIGZpbGVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD00NjUwNQorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBzaW5jZSBhdWRp
byBBUEkgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKworICAgICAgICAqIHdlYmF1ZGlvL0F1ZGlv
UGFubmVyTm9kZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6Zml4TkFOcyk6CisgICAg
ICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OkF1ZGlvUGFubmVyTm9kZSk6CisgICAgICAg
IChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6On5BdWRpb1Bhbm5lck5vZGUpOgorICAgICAgICAo
V2ViQ29yZTo6QXVkaW9QYW5uZXJOb2RlOjpwdWxsSW5wdXRzKToKKyAgICAgICAgKFdlYkNvcmU6
OkF1ZGlvUGFubmVyTm9kZTo6cHJvY2Vzcyk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5l
ck5vZGU6OnJlc2V0KToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6aW5pdGlh
bGl6ZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OnVuaW5pdGlhbGl6ZSk6
CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6Omxpc3RlbmVyKToKKyAgICAgICAg
KFdlYkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6c2V0UGFubmluZ01vZGVsKToKKyAgICAgICAgKFdl
YkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6Z2V0QXppbXV0aEVsZXZhdGlvbik6CisgICAgICAgIChX
ZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OmRvcHBsZXJSYXRlKToKKyAgICAgICAgKFdlYkNvcmU6
OkF1ZGlvUGFubmVyTm9kZTo6ZGlzdGFuY2VDb25lR2Fpbik6CisgICAgICAgIChXZWJDb3JlOjpB
dWRpb1Bhbm5lck5vZGU6Om5vdGlmeUF1ZGlvU291cmNlc0Nvbm5lY3RlZFRvTm9kZSk6CisgICAg
ICAgICogd2ViYXVkaW8vQXVkaW9QYW5uZXJOb2RlLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29y
ZTo6QXVkaW9QYW5uZXJOb2RlOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9QYW5u
ZXJOb2RlOjpwYW5uaW5nTW9kZWwpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9QYW5uZXJOb2Rl
Ojpwb3NpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OnNldFBvc2l0
aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6b3JpZW50YXRpb24pOgor
ICAgICAgICAoV2ViQ29yZTo6QXVkaW9QYW5uZXJOb2RlOjpzZXRPcmllbnRhdGlvbik6CisgICAg
ICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OnZlbG9jaXR5KToKKyAgICAgICAgKFdlYkNv
cmU6OkF1ZGlvUGFubmVyTm9kZTo6c2V0VmVsb2NpdHkpOgorICAgICAgICAoV2ViQ29yZTo6QXVk
aW9QYW5uZXJOb2RlOjpkaXN0YW5jZU1vZGVsKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvUGFu
bmVyTm9kZTo6c2V0RGlzdGFuY2VNb2RlbCk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5l
ck5vZGU6OnJlZkRpc3RhbmNlKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6
c2V0UmVmRGlzdGFuY2UpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9QYW5uZXJOb2RlOjptYXhE
aXN0YW5jZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OnNldE1heERpc3Rh
bmNlKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6cm9sbG9mZkZhY3Rvcik6
CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OnNldFJvbGxvZmZGYWN0b3IpOgor
ICAgICAgICAoV2ViQ29yZTo6QXVkaW9QYW5uZXJOb2RlOjpjb25lSW5uZXJBbmdsZSk6CisgICAg
ICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OnNldENvbmVJbm5lckFuZ2xlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6Y29uZU91dGVyQW5nbGUpOgorICAgICAgICAo
V2ViQ29yZTo6QXVkaW9QYW5uZXJOb2RlOjpzZXRDb25lT3V0ZXJBbmdsZSk6CisgICAgICAgIChX
ZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OmNvbmVPdXRlckdhaW4pOgorICAgICAgICAoV2ViQ29y
ZTo6QXVkaW9QYW5uZXJOb2RlOjpzZXRDb25lT3V0ZXJHYWluKToKKyAgICAgICAgKFdlYkNvcmU6
OkF1ZGlvUGFubmVyTm9kZTo6ZGlzdGFuY2VHYWluKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlv
UGFubmVyTm9kZTo6Y29uZUdhaW4pOgorICAgICAgICAqIHdlYmF1ZGlvL0F1ZGlvUGFubmVyTm9k
ZS5pZGw6IEFkZGVkLgorCiAyMDEwLTEwLTA0ICBBbGV4ZXkgUHJvc2t1cnlha292ICA8YXBAYXBw
bGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFkYW0gQmFydGguCkluZGV4OiBXZWJDb3Jl
L3dlYmF1ZGlvL0F1ZGlvUGFubmVyTm9kZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS93ZWJh
dWRpby9BdWRpb1Bhbm5lck5vZGUuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS93ZWJhdWRp
by9BdWRpb1Bhbm5lck5vZGUuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDMyMSBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0
ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0
b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisg
KiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBw
ZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5E
IElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisg
KiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBP
UiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKworI2lmIEVOQUJMRShXRUJfQVVESU8pCisKKyNpbmNsdWRlICJB
dWRpb1Bhbm5lck5vZGUuaCIKKworI2luY2x1ZGUgIkF1ZGlvQnVmZmVyU291cmNlTm9kZS5oIgor
I2luY2x1ZGUgIkF1ZGlvQnVzLmgiCisjaW5jbHVkZSAiQXVkaW9Db250ZXh0LmgiCisjaW5jbHVk
ZSAiQXVkaW9Ob2RlSW5wdXQuaCIKKyNpbmNsdWRlICJBdWRpb05vZGVPdXRwdXQuaCIKKyNpbmNs
dWRlICJIUlRGUGFubmVyLmgiCisjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KKwordXNpbmcg
bmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgdm9pZCBmaXhO
QU5zKGRvdWJsZSAmeCkKK3sKKyAgICBpZiAoaXNuYW4oeCkgfHwgaXNpbmYoeCkpCisgICAgICAg
IHggPSAwLjA7Cit9CisKK0F1ZGlvUGFubmVyTm9kZTo6QXVkaW9QYW5uZXJOb2RlKEF1ZGlvQ29u
dGV4dCogY29udGV4dCwgZG91YmxlIHNhbXBsZVJhdGUpCisgICAgOiBBdWRpb05vZGUoY29udGV4
dCwgc2FtcGxlUmF0ZSkKKyAgICAsIG1fcGFubmluZ01vZGVsKFBhbm5lcjo6UGFubmluZ01vZGVs
SFJURikKKyAgICAsIG1fbGFzdEdhaW4oLTEuMCkKKyAgICAsIG1fY29ubmVjdGlvbkNvdW50KDAp
Cit7CisgICAgYWRkSW5wdXQoYWRvcHRQdHIobmV3IEF1ZGlvTm9kZUlucHV0KHRoaXMpKSk7Cisg
ICAgYWRkT3V0cHV0KGFkb3B0UHRyKG5ldyBBdWRpb05vZGVPdXRwdXQodGhpcywgMikpKTsKKyAg
ICAKKyAgICBtX2Rpc3RhbmNlR2FpbiA9IEF1ZGlvR2Fpbjo6Y3JlYXRlKCJkaXN0YW5jZUdhaW4i
LCAxLjAsIDAuMCwgMS4wKTsKKyAgICBtX2NvbmVHYWluID0gQXVkaW9HYWluOjpjcmVhdGUoImNv
bmVHYWluIiwgMS4wLCAwLjAsIDEuMCk7CisKKyAgICBtX3Bvc2l0aW9uID0gVmVjdG9yMygwLCAw
LCAwKTsKKyAgICBtX29yaWVudGF0aW9uID0gVmVjdG9yMygxLCAwLCAwKTsKKyAgICBtX3ZlbG9j
aXR5ID0gVmVjdG9yMygwLCAwLCAwKTsKKyAgICAKKyAgICBzZXRUeXBlKE5vZGVUeXBlUGFubmVy
KTsKKworICAgIGluaXRpYWxpemUoKTsKK30KKworQXVkaW9QYW5uZXJOb2RlOjp+QXVkaW9QYW5u
ZXJOb2RlKCkKK3sKKyAgICB1bmluaXRpYWxpemUoKTsKK30KKwordm9pZCBBdWRpb1Bhbm5lck5v
ZGU6OnB1bGxJbnB1dHMoc2l6ZV90IGZyYW1lc1RvUHJvY2VzcykKK3sKKyAgICAvLyBXZSBvdmVy
cmlkZSBwdWxsSW5wdXRzKCksIHNvIHdlIGNhbiBkZXRlY3QgbmV3IEF1ZGlvU291cmNlTm9kZXMg
d2hpY2ggaGF2ZSBjb25uZWN0ZWQgdG8gdXMgd2hlbiBuZXcgY29ubmVjdGlvbnMgYXJlIG1hZGUu
CisgICAgLy8gVGhlc2UgQXVkaW9Tb3VyY2VOb2RlcyBuZWVkIHRvIGJlIG1hZGUgYXdhcmUgb2Yg
b3VyIGV4aXN0ZW5jZSBpbiBvcmRlciB0byBoYW5kbGUgZG9wcGxlciBzaGlmdCBwaXRjaCBjaGFu
Z2VzLgorICAgIGlmIChtX2Nvbm5lY3Rpb25Db3VudCAhPSBjb250ZXh0KCktPmNvbm5lY3Rpb25D
b3VudCgpKSB7CisgICAgICAgIG1fY29ubmVjdGlvbkNvdW50ID0gY29udGV4dCgpLT5jb25uZWN0
aW9uQ291bnQoKTsKKworICAgICAgICAvLyBSZWN1cnNpdmVseSBnbyB0aHJvdWdoIGFsbCBub2Rl
cyBjb25uZWN0ZWQgdG8gdXMuCisgICAgICAgIG5vdGlmeUF1ZGlvU291cmNlc0Nvbm5lY3RlZFRv
Tm9kZSh0aGlzKTsKKyAgICB9CisgICAgCisgICAgQXVkaW9Ob2RlOjpwdWxsSW5wdXRzKGZyYW1l
c1RvUHJvY2Vzcyk7Cit9CisKK3ZvaWQgQXVkaW9QYW5uZXJOb2RlOjpwcm9jZXNzKHNpemVfdCBm
cmFtZXNUb1Byb2Nlc3MpCit7CisgICAgQXVkaW9CdXMqIGRlc3RpbmF0aW9uID0gb3V0cHV0KDAp
LT5idXMoKTsKKworICAgIGlmICghaXNJbml0aWFsaXplZCgpIHx8ICFpbnB1dCgwKS0+aXNDb25u
ZWN0ZWQoKSB8fCAhbV9wYW5uZXIuZ2V0KCkpIHsKKyAgICAgICAgZGVzdGluYXRpb24tPnplcm8o
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEF1ZGlvQnVzKiBzb3VyY2UgPSBpbnB1
dCgwKS0+YnVzKCk7CisKKyAgICBpZiAoIXNvdXJjZSkgeworICAgICAgICBkZXN0aW5hdGlvbi0+
emVybygpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQXBwbHkgdGhlIHBhbm5p
bmcgZWZmZWN0LgorICAgIGRvdWJsZSBhemltdXRoOworICAgIGRvdWJsZSBlbGV2YXRpb247Cisg
ICAgZ2V0QXppbXV0aEVsZXZhdGlvbigmYXppbXV0aCwgJmVsZXZhdGlvbik7CisgICAgbV9wYW5u
ZXItPnBhbihhemltdXRoLCBlbGV2YXRpb24sIHNvdXJjZSwgZGVzdGluYXRpb24sIGZyYW1lc1Rv
UHJvY2Vzcyk7CisKKyAgICAvLyBHZXQgdGhlIGRpc3RhbmNlIGFuZCBjb25lIGdhaW4uCisgICAg
ZG91YmxlIHRvdGFsR2FpbiA9IGRpc3RhbmNlQ29uZUdhaW4oKTsKKworICAgIC8vIFNuYXAgdG8g
ZGVzaXJlZCBnYWluIGF0IHRoZSBiZWdpbm5pbmcuCisgICAgaWYgKG1fbGFzdEdhaW4gPT0gLTEu
MCkKKyAgICAgICAgbV9sYXN0R2FpbiA9IHRvdGFsR2FpbjsKKyAgICAgICAgCisgICAgLy8gQXBw
bHkgZ2FpbiBpbi1wbGFjZSB3aXRoIGRlLXppcHBlcmluZy4KKyAgICBkZXN0aW5hdGlvbi0+Y29w
eVdpdGhHYWluRnJvbSgqZGVzdGluYXRpb24sICZtX2xhc3RHYWluLCB0b3RhbEdhaW4pOworfQor
Cit2b2lkIEF1ZGlvUGFubmVyTm9kZTo6cmVzZXQoKQoreworICAgIG1fbGFzdEdhaW4gPSAtMS4w
OyAvLyBmb3JjZSB0byBzbmFwIHRvIGluaXRpYWwgZ2FpbgorICAgIGlmIChtX3Bhbm5lci5nZXQo
KSkKKyAgICAgICAgbV9wYW5uZXItPnJlc2V0KCk7Cit9CisKK3ZvaWQgQXVkaW9QYW5uZXJOb2Rl
Ojppbml0aWFsaXplKCkKK3sKKyAgICBpZiAoaXNJbml0aWFsaXplZCgpKQorICAgICAgICByZXR1
cm47CisgICAgICAgIAorICAgIG1fcGFubmVyID0gUGFubmVyOjpjcmVhdGUobV9wYW5uaW5nTW9k
ZWwsIHNhbXBsZVJhdGUoKSk7CisKKyAgICBBdWRpb05vZGU6OmluaXRpYWxpemUoKTsKK30KKwor
dm9pZCBBdWRpb1Bhbm5lck5vZGU6OnVuaW5pdGlhbGl6ZSgpCit7CisgICAgaWYgKCFpc0luaXRp
YWxpemVkKCkpCisgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgbV9wYW5uZXIuY2xlYXIo
KTsKKyAgICBBdWRpb05vZGU6OnVuaW5pdGlhbGl6ZSgpOworfQorCitBdWRpb0xpc3RlbmVyKiBB
dWRpb1Bhbm5lck5vZGU6Omxpc3RlbmVyKCkKK3sKKyAgICByZXR1cm4gY29udGV4dCgpLT5saXN0
ZW5lcigpOworfQorCit2b2lkIEF1ZGlvUGFubmVyTm9kZTo6c2V0UGFubmluZ01vZGVsKHVuc2ln
bmVkIHNob3J0IG1vZGVsKQoreworICAgIGlmICghbV9wYW5uZXIuZ2V0KCkgfHwgbW9kZWwgIT0g
bV9wYW5uaW5nTW9kZWwpIHsKKyAgICAgICAgT3duUHRyPFBhbm5lcj4gbmV3UGFubmVyID0gUGFu
bmVyOjpjcmVhdGUobW9kZWwsIHNhbXBsZVJhdGUoKSk7CisgICAgICAgIG1fcGFubmVyID0gbmV3
UGFubmVyLnJlbGVhc2UoKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9QYW5uZXJOb2RlOjpnZXRB
emltdXRoRWxldmF0aW9uKGRvdWJsZSogb3V0QXppbXV0aCwgZG91YmxlKiBvdXRFbGV2YXRpb24p
Cit7CisgICAgLy8gRklYTUU6IHdlIHNob3VsZCBjYWNoZSBhemltdXRoIGFuZCBlbGV2YXRpb24g
KGlmIHBvc3NpYmxlKSwgc28gd2Ugb25seSByZS1jYWxjdWxhdGUgaWYgYSBjaGFuZ2UgaGFzIGJl
ZW4gbWFkZS4KKworICAgIGRvdWJsZSBhemltdXRoID0gMC4wOworCisgICAgLy8gQ2FsY3VsYXRl
IHRoZSBzb3VyY2UtbGlzdGVuZXIgdmVjdG9yCisgICAgVmVjdG9yMyBsaXN0ZW5lclBvc2l0aW9u
ID0gbGlzdGVuZXIoKS0+cG9zaXRpb24oKTsKKyAgICBWZWN0b3IzIHNvdXJjZUxpc3RlbmVyID0g
bV9wb3NpdGlvbiAtIGxpc3RlbmVyUG9zaXRpb247CisKKyAgICBpZiAoc291cmNlTGlzdGVuZXIu
aXNaZXJvKCkpIHsKKyAgICAgICAgLy8gZGVnZW5lcmF0ZSBjYXNlIGlmIHNvdXJjZSBhbmQgbGlz
dGVuZXIgYXJlIGF0IHRoZSBzYW1lIHBvaW50CisgICAgICAgICpvdXRBemltdXRoID0gMC4wOwor
ICAgICAgICAqb3V0RWxldmF0aW9uID0gMC4wOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgc291cmNlTGlzdGVuZXIubm9ybWFsaXplKCk7CisKKyAgICAvLyBBbGlnbiBheGVzCisgICAg
VmVjdG9yMyBsaXN0ZW5lckZyb250ID0gbGlzdGVuZXIoKS0+b3JpZW50YXRpb24oKTsKKyAgICBW
ZWN0b3IzIGxpc3RlbmVyVXAgPSBsaXN0ZW5lcigpLT51cFZlY3RvcigpOworICAgIFZlY3RvcjMg
bGlzdGVuZXJSaWdodCA9IGNyb3NzKGxpc3RlbmVyRnJvbnQsIGxpc3RlbmVyVXApOworICAgIGxp
c3RlbmVyUmlnaHQubm9ybWFsaXplKCk7CisKKyAgICBWZWN0b3IzIGxpc3RlbmVyRnJvbnROb3Jt
ID0gbGlzdGVuZXJGcm9udDsKKyAgICBsaXN0ZW5lckZyb250Tm9ybS5ub3JtYWxpemUoKTsKKwor
ICAgIFZlY3RvcjMgdXAgPSBjcm9zcyhsaXN0ZW5lclJpZ2h0LCBsaXN0ZW5lckZyb250Tm9ybSk7
CisKKyAgICBkb3VibGUgdXBQcm9qZWN0aW9uID0gZG90KHNvdXJjZUxpc3RlbmVyLCB1cCk7CisK
KyAgICBWZWN0b3IzIHByb2plY3RlZFNvdXJjZSA9IHNvdXJjZUxpc3RlbmVyIC0gdXBQcm9qZWN0
aW9uICogdXA7CisgICAgcHJvamVjdGVkU291cmNlLm5vcm1hbGl6ZSgpOworCisgICAgYXppbXV0
aCA9IDE4MC4wICogYWNvcyhkb3QocHJvamVjdGVkU291cmNlLCBsaXN0ZW5lclJpZ2h0KSkgLyBN
X1BJOworICAgIGZpeE5BTnMoYXppbXV0aCk7IC8vIGF2b2lkIGlsbGVnYWwgdmFsdWVzCisKKyAg
ICAvLyBTb3VyY2UgIGluIGZyb250IG9yIGJlaGluZCB0aGUgbGlzdGVuZXIKKyAgICBkb3VibGUg
ZnJvbnRCYWNrID0gZG90KHByb2plY3RlZFNvdXJjZSwgbGlzdGVuZXJGcm9udE5vcm0pOworICAg
IGlmIChmcm9udEJhY2sgPCAwLjApCisgICAgICAgIGF6aW11dGggPSAzNjAuMCAtIGF6aW11dGg7
CisKKyAgICAvLyBNYWtlIGF6aW11dGggcmVsYXRpdmUgdG8gImZyb250IiBhbmQgbm90ICJyaWdo
dCIgbGlzdGVuZXIgdmVjdG9yCisgICAgaWYgKChhemltdXRoID49IDAuMCkgJiYgKGF6aW11dGgg
PD0gMjcwLjApKQorICAgICAgICBhemltdXRoID0gOTAuMCAtIGF6aW11dGg7CisgICAgZWxzZQor
ICAgICAgICBhemltdXRoID0gNDUwLjAgLSBhemltdXRoOworCisgICAgLy8gRWxldmF0aW9uCisg
ICAgZG91YmxlIGVsZXZhdGlvbiA9IDkwLjAgLSAxODAuMCAqIGFjb3MoZG90KHNvdXJjZUxpc3Rl
bmVyLCB1cCkpIC8gTV9QSTsKKyAgICBmaXhOQU5zKGF6aW11dGgpOyAvLyBhdm9pZCBpbGxlZ2Fs
IHZhbHVlcworCisgICAgaWYgKGVsZXZhdGlvbiA+IDkwLjApCisgICAgICAgIGVsZXZhdGlvbiA9
IDE4MC4wIC0gZWxldmF0aW9uOworICAgIGVsc2UgaWYgKGVsZXZhdGlvbiA8IC05MC4wKQorICAg
ICAgICBlbGV2YXRpb24gPSAtMTgwLjAgLSBlbGV2YXRpb247CisKKyAgICBpZiAob3V0QXppbXV0
aCkKKyAgICAgICAgKm91dEF6aW11dGggPSBhemltdXRoOworICAgIGlmIChvdXRFbGV2YXRpb24p
CisgICAgICAgICpvdXRFbGV2YXRpb24gPSBlbGV2YXRpb247Cit9CisKK2Zsb2F0IEF1ZGlvUGFu
bmVyTm9kZTo6ZG9wcGxlclJhdGUoKQoreworICAgIGRvdWJsZSBkb3BwbGVyU2hpZnQgPSAxLjA7
CisKKyAgICAvLyBGSVhNRTogb3B0aW1pemUgZm9yIGNhc2Ugd2hlbiBuZWl0aGVyIHNvdXJjZSBu
b3IgbGlzdGVuZXIgaGFzIGNoYW5nZWQuLi4KKyAgICBkb3VibGUgZG9wcGxlckZhY3RvciA9IGxp
c3RlbmVyKCktPmRvcHBsZXJGYWN0b3IoKTsKKworICAgIGlmIChkb3BwbGVyRmFjdG9yID4gMC4w
KSB7CisgICAgICAgIGRvdWJsZSBzcGVlZE9mU291bmQgPSBsaXN0ZW5lcigpLT5zcGVlZE9mU291
bmQoKTsKKworICAgICAgICBjb25zdCBWZWN0b3IzICZzb3VyY2VWZWxvY2l0eSA9IG1fdmVsb2Np
dHk7CisgICAgICAgIGNvbnN0IFZlY3RvcjMgJmxpc3RlbmVyVmVsb2NpdHkgPSBsaXN0ZW5lcigp
LT52ZWxvY2l0eSgpOworCisgICAgICAgIC8vIERvbid0IGJvdGhlciBpZiBib3RoIHNvdXJjZSBh
bmQgbGlzdGVuZXIgaGF2ZSBubyB2ZWxvY2l0eQorICAgICAgICBib29sIHNvdXJjZUhhc1ZlbG9j
aXR5ID0gIXNvdXJjZVZlbG9jaXR5LmlzWmVybygpOworICAgICAgICBib29sIGxpc3RlbmVySGFz
VmVsb2NpdHkgPSAhbGlzdGVuZXJWZWxvY2l0eS5pc1plcm8oKTsKKworICAgICAgICBpZiAoc291
cmNlSGFzVmVsb2NpdHkgfHwgbGlzdGVuZXJIYXNWZWxvY2l0eSkgeworICAgICAgICAgICAgLy8g
Q2FsY3VsYXRlIHRoZSBzb3VyY2UgdG8gbGlzdGVuZXIgdmVjdG9yCisgICAgICAgICAgICBWZWN0
b3IzIGxpc3RlbmVyUG9zaXRpb24gPSBsaXN0ZW5lcigpLT5wb3NpdGlvbigpOworICAgICAgICAg
ICAgVmVjdG9yMyBzb3VyY2VUb0xpc3RlbmVyID0gbV9wb3NpdGlvbiAtIGxpc3RlbmVyUG9zaXRp
b247CisKKyAgICAgICAgICAgIGRvdWJsZSBzb3VyY2VMaXN0ZW5lck1hZ25pdHVkZSA9IHNvdXJj
ZVRvTGlzdGVuZXIuYWJzKCk7CisKKyAgICAgICAgICAgIGRvdWJsZSBsaXN0ZW5lclByb2plY3Rp
b24gPSBkb3Qoc291cmNlVG9MaXN0ZW5lciwgbGlzdGVuZXJWZWxvY2l0eSkgLyBzb3VyY2VMaXN0
ZW5lck1hZ25pdHVkZTsKKyAgICAgICAgICAgIGRvdWJsZSBzb3VyY2VQcm9qZWN0aW9uID0gZG90
KHNvdXJjZVRvTGlzdGVuZXIsIHNvdXJjZVZlbG9jaXR5KSAvIHNvdXJjZUxpc3RlbmVyTWFnbml0
dWRlOworCisgICAgICAgICAgICBsaXN0ZW5lclByb2plY3Rpb24gPSAtbGlzdGVuZXJQcm9qZWN0
aW9uOworICAgICAgICAgICAgc291cmNlUHJvamVjdGlvbiA9IC1zb3VyY2VQcm9qZWN0aW9uOwor
CisgICAgICAgICAgICBkb3VibGUgc2NhbGVkU3BlZWRPZlNvdW5kID0gc3BlZWRPZlNvdW5kIC8g
ZG9wcGxlckZhY3RvcjsKKyAgICAgICAgICAgIGxpc3RlbmVyUHJvamVjdGlvbiA9IG1pbihsaXN0
ZW5lclByb2plY3Rpb24sIHNjYWxlZFNwZWVkT2ZTb3VuZCk7CisgICAgICAgICAgICBzb3VyY2VQ
cm9qZWN0aW9uID0gbWluKHNvdXJjZVByb2plY3Rpb24sIHNjYWxlZFNwZWVkT2ZTb3VuZCk7CisK
KyAgICAgICAgICAgIGRvcHBsZXJTaGlmdCA9ICgoc3BlZWRPZlNvdW5kIC0gZG9wcGxlckZhY3Rv
ciAqIGxpc3RlbmVyUHJvamVjdGlvbikgLyAoc3BlZWRPZlNvdW5kIC0gZG9wcGxlckZhY3RvciAq
IHNvdXJjZVByb2plY3Rpb24pKTsKKyAgICAgICAgICAgIGZpeE5BTnMoZG9wcGxlclNoaWZ0KTsg
Ly8gYXZvaWQgaWxsZWdhbCB2YWx1ZXMKKworICAgICAgICAgICAgLy8gTGltaXQgdGhlIHBpdGNo
IHNoaWZ0aW5nIHRvIDQgb2N0YXZlcyB1cCBhbmQgMyBvY3RhdmVzIGRvd24uCisgICAgICAgICAg
ICBpZiAoZG9wcGxlclNoaWZ0ID4gMTYuMCkKKyAgICAgICAgICAgICAgICBkb3BwbGVyU2hpZnQg
PSAxNi4wOworICAgICAgICAgICAgZWxzZSBpZiAoZG9wcGxlclNoaWZ0IDwgMC4xMjUpCisgICAg
ICAgICAgICAgICAgZG9wcGxlclNoaWZ0ID0gMC4xMjU7ICAgCisgICAgICAgIH0KKyAgICB9CisK
KyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGRvcHBsZXJTaGlmdCk7Cit9CisKK2Zsb2F0
IEF1ZGlvUGFubmVyTm9kZTo6ZGlzdGFuY2VDb25lR2FpbigpCit7CisgICAgVmVjdG9yMyBsaXN0
ZW5lclBvc2l0aW9uID0gbGlzdGVuZXIoKS0+cG9zaXRpb24oKTsKKworICAgIGRvdWJsZSBsaXN0
ZW5lckRpc3RhbmNlID0gZGlzdGFuY2UobV9wb3NpdGlvbiwgbGlzdGVuZXJQb3NpdGlvbik7Cisg
ICAgZG91YmxlIGRpc3RhbmNlR2FpbiA9IG1fZGlzdGFuY2VFZmZlY3QuZ2FpbihsaXN0ZW5lckRp
c3RhbmNlKTsKKyAgICAKKyAgICBtX2Rpc3RhbmNlR2Fpbi0+c2V0VmFsdWUoc3RhdGljX2Nhc3Q8
ZmxvYXQ+KGRpc3RhbmNlR2FpbikpOworCisgICAgLy8gRklYTUU6IGNvdWxkIG9wdGltaXplIGJ5
IGNhY2hpbmcgY29uZUdhaW4KKyAgICBkb3VibGUgY29uZUdhaW4gPSBtX2NvbmVFZmZlY3QuZ2Fp
bihtX3Bvc2l0aW9uLCBtX29yaWVudGF0aW9uLCBsaXN0ZW5lclBvc2l0aW9uKTsKKyAgICAKKyAg
ICBtX2NvbmVHYWluLT5zZXRWYWx1ZShzdGF0aWNfY2FzdDxmbG9hdD4oY29uZUdhaW4pKTsKKwor
ICAgIHJldHVybiBmbG9hdChkaXN0YW5jZUdhaW4gKiBjb25lR2Fpbik7Cit9CisKK3ZvaWQgQXVk
aW9QYW5uZXJOb2RlOjpub3RpZnlBdWRpb1NvdXJjZXNDb25uZWN0ZWRUb05vZGUoQXVkaW9Ob2Rl
KiBub2RlKQoreworICAgIEFTU0VSVChub2RlKTsKKyAgICBpZiAoIW5vZGUpCisgICAgICAgIHJl
dHVybjsKKyAgICAgICAgCisgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhpcyBub2RlIGlzIGFuIEF1
ZGlvQnVmZmVyU291cmNlTm9kZS4gIElmIHNvLCBsZXQgaXQga25vdyBhYm91dCB1cyBzbyB0aGF0
IGRvcHBsZXIgc2hpZnQgcGl0Y2ggY2FuIGJlIHRha2VuIGludG8gYWNjb3VudC4KKyAgICBpZiAo
bm9kZS0+dHlwZSgpID09IE5vZGVUeXBlQXVkaW9CdWZmZXJTb3VyY2UpIHsKKyAgICAgICAgQXVk
aW9CdWZmZXJTb3VyY2VOb2RlKiBidWZmZXJTb3VyY2VOb2RlID0gcmVpbnRlcnByZXRfY2FzdDxB
dWRpb0J1ZmZlclNvdXJjZU5vZGUqPihub2RlKTsKKyAgICAgICAgYnVmZmVyU291cmNlTm9kZS0+
c2V0UGFubmVyTm9kZSh0aGlzKTsKKyAgICB9IGVsc2UgeyAgICAKKyAgICAgICAgLy8gR28gdGhy
b3VnaCBhbGwgaW5wdXRzIHRvIHRoaXMgbm9kZS4KKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IG5vZGUtPm51bWJlck9mSW5wdXRzKCk7ICsraSkgeworICAgICAgICAgICAgQXVkaW9O
b2RlSW5wdXQqIGlucHV0ID0gbm9kZS0+aW5wdXQoaSk7CisKKyAgICAgICAgICAgIC8vIEZvciBl
YWNoIGlucHV0LCBnbyB0aHJvdWdoIGFsbCBvZiBpdHMgY29ubmVjdGlvbnMsIGxvb2tpbmcgZm9y
IEF1ZGlvQnVmZmVyU291cmNlTm9kZXMuCisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAw
OyBqIDwgaW5wdXQtPm51bWJlck9mQ29ubmVjdGlvbnMoKTsgKytqKSB7CisgICAgICAgICAgICAg
ICAgQXVkaW9Ob2RlT3V0cHV0KiBjb25uZWN0ZWRPdXRwdXQgPSBpbnB1dC0+b3V0cHV0KGopOwor
ICAgICAgICAgICAgICAgIEF1ZGlvTm9kZSogY29ubmVjdGVkTm9kZSA9IGNvbm5lY3RlZE91dHB1
dC0+bm9kZSgpOworICAgICAgICAgICAgICAgIG5vdGlmeUF1ZGlvU291cmNlc0Nvbm5lY3RlZFRv
Tm9kZShjb25uZWN0ZWROb2RlKTsgLy8gcmVjdXJzZQorICAgICAgICAgICAgfQorICAgICAgICB9
CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUo
V0VCX0FVRElPKQpJbmRleDogV2ViQ29yZS93ZWJhdWRpby9BdWRpb1Bhbm5lck5vZGUuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvUGFubmVyTm9kZS5oCShyZXZpc2lvbiAw
KQorKysgV2ViQ29yZS93ZWJhdWRpby9BdWRpb1Bhbm5lck5vZGUuaAkocmV2aXNpb24gMCkKQEAg
LTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBu
YW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisg
KiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUg
cHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNp
ZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQor
ICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICog
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaWZuZGVmIEF1ZGlvUGFubmVyTm9kZV9oCisjZGVmaW5lIEF1ZGlv
UGFubmVyTm9kZV9oCisKKyNpbmNsdWRlICJBdWRpb0J1cy5oIgorI2luY2x1ZGUgIkF1ZGlvR2Fp
bi5oIgorI2luY2x1ZGUgIkF1ZGlvTGlzdGVuZXIuaCIKKyNpbmNsdWRlICJBdWRpb05vZGUuaCIK
KyNpbmNsdWRlICJDb25lLmgiCisjaW5jbHVkZSAiRGlzdGFuY2UuaCIKKyNpbmNsdWRlICJQYW5u
ZXIuaCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3RvcjMuaD4K
KworbmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBBdWRpb1Bhbm5lck5vZGUgaXMgYW4gQXVkaW9O
b2RlIHdpdGggb25lIGlucHV0IGFuZCBvbmUgb3V0cHV0LgorLy8gSXQgcG9zaXRpb25zIGEgc291
bmQgaW4gM0Qgc3BhY2UsIHdpdGggdGhlIGV4YWN0IGVmZmVjdCBkZXBlbmRlbnQgb24gdGhlIHBh
bm5pbmcgbW9kZWwuCisvLyBJdCBoYXMgYSBwb3NpdGlvbiBhbmQgYW4gb3JpZW50YXRpb24gaW4g
M0Qgc3BhY2Ugd2hpY2ggaXMgcmVsYXRpdmUgdG8gdGhlIHBvc2l0aW9uIGFuZCBvcmllbnRhdGlv
biBvZiB0aGUgY29udGV4dCdzIEF1ZGlvTGlzdGVuZXIuCisvLyBBIGRpc3RhbmNlIGVmZmVjdCB3
aWxsIGF0dGVudWF0ZSB0aGUgZ2FpbiBhcyB0aGUgcG9zaXRpb24gbW92ZXMgYXdheSBmcm9tIHRo
ZSBsaXN0ZW5lci4KKy8vIEEgY29uZSBlZmZlY3Qgd2lsbCBhdHRlbnVhdGUgdGhlIGdhaW4gYXMg
dGhlIG9yaWVudGF0aW9uIG1vdmVzIGF3YXkgZnJvbSB0aGUgbGlzdGVuZXIuCisvLyBBbGwgb2Yg
dGhlc2UgZWZmZWN0cyBmb2xsb3cgdGhlIE9wZW5BTCBzcGVjaWZpY2F0aW9uIHZlcnkgY2xvc2Vs
eS4KKworY2xhc3MgQXVkaW9QYW5uZXJOb2RlIDogcHVibGljIEF1ZGlvTm9kZSB7CitwdWJsaWM6
CisgICAgZW51bSB7CisgICAgICAgIFBBU1NUSFJPVUdIID0gMCwKKyAgICAgICAgRVFVQUxQT1dF
UiA9IDEsCisgICAgICAgIEhSVEYgPSAyLAorICAgICAgICBTT1VOREZJRUxEID0gMywKKyAgICAg
ICAgTUFUUklYTUlYID0gNAorICAgIH07CisKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxBdWRpb1Bh
bm5lck5vZGU+IGNyZWF0ZShBdWRpb0NvbnRleHQqIGNvbnRleHQsIGRvdWJsZSBzYW1wbGVSYXRl
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBBdWRpb1Bhbm5lck5vZGUoY29u
dGV4dCwgc2FtcGxlUmF0ZSkpOworICAgIH0KKworICAgIHZpcnR1YWwgfkF1ZGlvUGFubmVyTm9k
ZSgpOworCisgICAgLy8gQXVkaW9Ob2RlCisgICAgdmlydHVhbCB2b2lkIHByb2Nlc3Moc2l6ZV90
IGZyYW1lc1RvUHJvY2Vzcyk7CisgICAgdmlydHVhbCB2b2lkIHB1bGxJbnB1dHMoc2l6ZV90IGZy
YW1lc1RvUHJvY2Vzcyk7CisgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CisgICAgdmlydHVhbCB2
b2lkIGluaXRpYWxpemUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgdW5pbml0aWFsaXplKCk7CisKKyAg
ICAvLyBMaXN0ZW5lcgorICAgIEF1ZGlvTGlzdGVuZXIqIGxpc3RlbmVyKCk7CisKKyAgICAvLyBQ
YW5uaW5nIG1vZGVsCisgICAgdW5zaWduZWQgc2hvcnQgcGFubmluZ01vZGVsKCkgY29uc3QgeyBy
ZXR1cm4gbV9wYW5uaW5nTW9kZWw7IH0KKyAgICB2b2lkIHNldFBhbm5pbmdNb2RlbCh1bnNpZ25l
ZCBzaG9ydCk7CisKKyAgICAvLyBQb3NpdGlvbgorICAgIFZlY3RvcjMgcG9zaXRpb24oKSBjb25z
dCB7IHJldHVybiBtX3Bvc2l0aW9uOyB9CisgICAgdm9pZCBzZXRQb3NpdGlvbihmbG9hdCB4LCBm
bG9hdCB5LCBmbG9hdCB6KSB7IG1fcG9zaXRpb24gPSBWZWN0b3IzKHgsIHksIHopOyB9CisKKyAg
ICAvLyBPcmllbnRhdGlvbgorICAgIFZlY3RvcjMgb3JpZW50YXRpb24oKSBjb25zdCB7IHJldHVy
biBtX3Bvc2l0aW9uOyB9CisgICAgdm9pZCBzZXRPcmllbnRhdGlvbihmbG9hdCB4LCBmbG9hdCB5
LCBmbG9hdCB6KSB7IG1fb3JpZW50YXRpb24gPSBWZWN0b3IzKHgsIHksIHopOyB9CisKKyAgICAv
LyBWZWxvY2l0eQorICAgIFZlY3RvcjMgdmVsb2NpdHkoKSBjb25zdCB7IHJldHVybiBtX3ZlbG9j
aXR5OyB9CisgICAgdm9pZCBzZXRWZWxvY2l0eShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7
IG1fdmVsb2NpdHkgPSBWZWN0b3IzKHgsIHksIHopOyB9CisKKyAgICAvLyBEaXN0YW5jZSBwYXJh
bWV0ZXJzCisgICAgdW5zaWduZWQgZGlzdGFuY2VNb2RlbCgpIHsgcmV0dXJuIG1fZGlzdGFuY2VF
ZmZlY3QubW9kZWwoKTsgfQorICAgIHZvaWQgc2V0RGlzdGFuY2VNb2RlbCh1bnNpZ25lZCBtb2Rl
bCkgeyBtX2Rpc3RhbmNlRWZmZWN0LnNldE1vZGVsKHN0YXRpY19jYXN0PERpc3RhbmNlRWZmZWN0
OjpNb2RlbFR5cGU+KG1vZGVsKSwgdHJ1ZSk7IH0KKyAgICAKKyAgICBmbG9hdCByZWZEaXN0YW5j
ZSgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0PihtX2Rpc3RhbmNlRWZmZWN0LnJlZkRpc3Rh
bmNlKCkpOyB9CisgICAgdm9pZCBzZXRSZWZEaXN0YW5jZShmbG9hdCByZWZEaXN0YW5jZSkgeyBt
X2Rpc3RhbmNlRWZmZWN0LnNldFJlZkRpc3RhbmNlKHJlZkRpc3RhbmNlKTsgfQorCisgICAgZmxv
YXQgbWF4RGlzdGFuY2UoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxmbG9hdD4obV9kaXN0YW5jZUVm
ZmVjdC5tYXhEaXN0YW5jZSgpKTsgfQorICAgIHZvaWQgc2V0TWF4RGlzdGFuY2UoZmxvYXQgbWF4
RGlzdGFuY2UpIHsgbV9kaXN0YW5jZUVmZmVjdC5zZXRNYXhEaXN0YW5jZShtYXhEaXN0YW5jZSk7
IH0KKworICAgIGZsb2F0IHJvbGxvZmZGYWN0b3IoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxmbG9h
dD4obV9kaXN0YW5jZUVmZmVjdC5yb2xsb2ZmRmFjdG9yKCkpOyB9CisgICAgdm9pZCBzZXRSb2xs
b2ZmRmFjdG9yKGZsb2F0IHJvbGxvZmZGYWN0b3IpIHsgbV9kaXN0YW5jZUVmZmVjdC5zZXRSb2xs
b2ZmRmFjdG9yKHJvbGxvZmZGYWN0b3IpOyB9CisKKyAgICAvLyBTb3VuZCBjb25lcyAtIGFuZ2xl
cyBpbiBkZWdyZWVzCisgICAgZmxvYXQgY29uZUlubmVyQW5nbGUoKSBjb25zdCB7IHJldHVybiBz
dGF0aWNfY2FzdDxmbG9hdD4obV9jb25lRWZmZWN0LmlubmVyQW5nbGUoKSk7IH0KKyAgICB2b2lk
IHNldENvbmVJbm5lckFuZ2xlKGZsb2F0IGFuZ2xlKSB7IG1fY29uZUVmZmVjdC5zZXRJbm5lckFu
Z2xlKGFuZ2xlKTsgfQorCisgICAgZmxvYXQgY29uZU91dGVyQW5nbGUoKSBjb25zdCB7IHJldHVy
biBzdGF0aWNfY2FzdDxmbG9hdD4obV9jb25lRWZmZWN0Lm91dGVyQW5nbGUoKSk7IH0KKyAgICB2
b2lkIHNldENvbmVPdXRlckFuZ2xlKGZsb2F0IGFuZ2xlKSB7IG1fY29uZUVmZmVjdC5zZXRPdXRl
ckFuZ2xlKGFuZ2xlKTsgfQorCisgICAgZmxvYXQgY29uZU91dGVyR2FpbigpIGNvbnN0IHsgcmV0
dXJuIHN0YXRpY19jYXN0PGZsb2F0PihtX2NvbmVFZmZlY3Qub3V0ZXJHYWluKCkpOyB9CisgICAg
dm9pZCBzZXRDb25lT3V0ZXJHYWluKGZsb2F0IGFuZ2xlKSB7IG1fY29uZUVmZmVjdC5zZXRPdXRl
ckdhaW4oYW5nbGUpOyB9CisKKyAgICB2b2lkIGdldEF6aW11dGhFbGV2YXRpb24oZG91YmxlKiBv
dXRBemltdXRoLCBkb3VibGUqIG91dEVsZXZhdGlvbik7CisgICAgZmxvYXQgZG9wcGxlclJhdGUo
KTsKKworICAgIC8vIEFjY2Vzc29ycyBmb3IgZHluYW1pY2FsbHkgY2FsY3VsYXRlZCBnYWluIHZh
bHVlcy4KKyAgICBBdWRpb0dhaW4qIGRpc3RhbmNlR2FpbigpIHsgcmV0dXJuIG1fZGlzdGFuY2VH
YWluLmdldCgpOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAg
IEF1ZGlvR2FpbiogY29uZUdhaW4oKSB7IHJldHVybiBtX2NvbmVHYWluLmdldCgpOyB9ICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCitwcml2YXRlOgorICAgIEF1ZGlv
UGFubmVyTm9kZShBdWRpb0NvbnRleHQqLCBkb3VibGUgc2FtcGxlUmF0ZSk7CisKKyAgICAvLyBS
ZXR1cm5zIHRoZSBjb21iaW5lZCBkaXN0YW5jZSBhbmQgY29uZSBnYWluIGF0dGVudWF0aW9uLgor
ICAgIGZsb2F0IGRpc3RhbmNlQ29uZUdhaW4oKTsKKworICAgIC8vIE5vdGlmaWVzIGFueSBBdWRp
b0J1ZmZlclNvdXJjZU5vZGVzIGNvbm5lY3RlZCB0byB1cyBlaXRoZXIgZGlyZWN0bHkgb3IgaW5k
aXJlY3RseSBhYm91dCBvdXIgZXhpc3RlbmNlLgorICAgIC8vIFRoaXMgaXMgaW4gb3JkZXIgdG8g
aGFuZGxlIHRoZSBwaXRjaCBjaGFuZ2UgbmVjZXNzYXJ5IGZvciB0aGUgZG9wcGxlciBzaGlmdC4K
KyAgICB2b2lkIG5vdGlmeUF1ZGlvU291cmNlc0Nvbm5lY3RlZFRvTm9kZShBdWRpb05vZGUqKTsK
KworICAgIE93blB0cjxQYW5uZXI+IG1fcGFubmVyOworICAgIHVuc2lnbmVkIG1fcGFubmluZ01v
ZGVsOworCisgICAgLy8gRklYTUU6IHVwZ3JhZGUgdG8gRmxvYXRQb2ludDNEIGZyb20gVmVjdG9y
My4KKyAgICBWZWN0b3IzIG1fcG9zaXRpb247CisgICAgVmVjdG9yMyBtX29yaWVudGF0aW9uOwor
ICAgIFZlY3RvcjMgbV92ZWxvY2l0eTsKKworICAgIC8vIEdhaW4KKyAgICBSZWZQdHI8QXVkaW9H
YWluPiBtX2Rpc3RhbmNlR2FpbjsKKyAgICBSZWZQdHI8QXVkaW9HYWluPiBtX2NvbmVHYWluOwor
ICAgIERpc3RhbmNlRWZmZWN0IG1fZGlzdGFuY2VFZmZlY3Q7CisgICAgQ29uZUVmZmVjdCBtX2Nv
bmVFZmZlY3Q7CisgICAgZG91YmxlIG1fbGFzdEdhaW47CisKKyAgICB1bnNpZ25lZCBtX2Nvbm5l
Y3Rpb25Db3VudDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEF1
ZGlvUGFubmVyTm9kZV9oCkluZGV4OiBXZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvUGFubmVyTm9kZS5p
ZGwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS93ZWJhdWRpby9BdWRpb1Bhbm5lck5vZGUuaWRsCShy
ZXZpc2lvbiAwKQorKysgV2ViQ29yZS93ZWJhdWRpby9BdWRpb1Bhbm5lck5vZGUuaWRsCShyZXZp
c2lvbiAwKQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVp
dGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBu
YW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBv
ciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0
aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Cisg
KiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbW9kdWxlIGF1ZGlvIHsKKyAgICBpbnRlcmZhY2Ug
WworICAgICAgICBDb25kaXRpb25hbD1XRUJfQVVESU8sCisgICAgICAgIEdlbmVyYXRlQ29uc3Ry
dWN0b3IsCisgICAgICAgIEdlbmVyYXRlVG9KUworICAgIF0gQXVkaW9QYW5uZXJOb2RlIDogQXVk
aW9Ob2RlIHsKKyAgICAgICAgLy8gUGFubmluZyBtb2RlbAorICAgICAgICBjb25zdCB1bnNpZ25l
ZCBzaG9ydCBQQVNTVEhST1VHSCA9IDA7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IEVR
VUFMUE9XRVIgPSAxOworICAgICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCBIUlRGID0gMjsKKyAg
ICAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU09VTkRGSUVMRCA9IDM7CisKKyAgICAgICAgLy8g
RGVmYXVsdCBtb2RlbCBmb3Igc3RlcmVvIGlzIEhSVEYgCisgICAgICAgIGF0dHJpYnV0ZSB1bnNp
Z25lZCBsb25nIHBhbm5pbmdNb2RlbDsKKworICAgICAgICAvLyBVc2VzIGEgM0QgY2FydGVzaWFu
IGNvb3JkaW5hdGUgc3lzdGVtIAorICAgICAgICB2b2lkIHNldFBvc2l0aW9uKGluIGZsb2F0IHgs
IGluIGZsb2F0IHksIGluIGZsb2F0IHopOworICAgICAgICB2b2lkIHNldE9yaWVudGF0aW9uKGlu
IGZsb2F0IHgsIGluIGZsb2F0IHksIGluIGZsb2F0IHopOworICAgICAgICB2b2lkIHNldFZlbG9j
aXR5KGluIGZsb2F0IHgsIGluIGZsb2F0IHksIGluIGZsb2F0IHopOworCisgICAgICAgIC8vIERp
c3RhbmNlIG1vZGVsCisgICAgICAgIGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGRpc3RhbmNlTW9k
ZWw7CisgICAgICAgIGF0dHJpYnV0ZSBmbG9hdCByZWZEaXN0YW5jZTsKKyAgICAgICAgYXR0cmli
dXRlIGZsb2F0IG1heERpc3RhbmNlOworICAgICAgICBhdHRyaWJ1dGUgZmxvYXQgcm9sbG9mZkZh
Y3RvcjsKKworICAgICAgICAvLyBEaXJlY3Rpb25hbCBzb3VuZCBjb25lCisgICAgICAgIGF0dHJp
YnV0ZSBmbG9hdCBjb25lSW5uZXJBbmdsZTsKKyAgICAgICAgYXR0cmlidXRlIGZsb2F0IGNvbmVP
dXRlckFuZ2xlOworICAgICAgICBhdHRyaWJ1dGUgZmxvYXQgY29uZU91dGVyR2FpbjsKKworICAg
ICAgICAvLyBEeW5hbWljYWxseSBjYWxjdWxhdGVkIGdhaW4gdmFsdWVzICAgICAgICAgIAorICAg
ICAgICByZWFkb25seSBhdHRyaWJ1dGUgQXVkaW9HYWluIGNvbmVHYWluOworICAgICAgICByZWFk
b25seSBhdHRyaWJ1dGUgQXVkaW9HYWluIGRpc3RhbmNlR2FpbjsKKyAgICB9OworfQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>69721</attachid>
            <date>2010-10-04 16:51:37 -0700</date>
            <delta_ts>2010-10-05 01:13:35 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-46505-20101004165136.patch</filename>
            <type>text/plain</type>
            <size>23443</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2OTA1MikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTQgQEAKKzIwMTAtMTAtMDQgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgQXVkaW9QYW5uZXJOb2RlIGZpbGVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD00NjUwNQorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBzaW5jZSBhdWRp
byBBUEkgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KKworICAgICAgICAqIHdlYmF1ZGlvL0F1ZGlv
UGFubmVyTm9kZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6Zml4TkFOcyk6CisgICAg
ICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OkF1ZGlvUGFubmVyTm9kZSk6CisgICAgICAg
IChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6On5BdWRpb1Bhbm5lck5vZGUpOgorICAgICAgICAo
V2ViQ29yZTo6QXVkaW9QYW5uZXJOb2RlOjpwdWxsSW5wdXRzKToKKyAgICAgICAgKFdlYkNvcmU6
OkF1ZGlvUGFubmVyTm9kZTo6cHJvY2Vzcyk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5l
ck5vZGU6OnJlc2V0KToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6aW5pdGlh
bGl6ZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OnVuaW5pdGlhbGl6ZSk6
CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6Omxpc3RlbmVyKToKKyAgICAgICAg
KFdlYkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6c2V0UGFubmluZ01vZGVsKToKKyAgICAgICAgKFdl
YkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6Z2V0QXppbXV0aEVsZXZhdGlvbik6CisgICAgICAgIChX
ZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OmRvcHBsZXJSYXRlKToKKyAgICAgICAgKFdlYkNvcmU6
OkF1ZGlvUGFubmVyTm9kZTo6ZGlzdGFuY2VDb25lR2Fpbik6CisgICAgICAgIChXZWJDb3JlOjpB
dWRpb1Bhbm5lck5vZGU6Om5vdGlmeUF1ZGlvU291cmNlc0Nvbm5lY3RlZFRvTm9kZSk6CisgICAg
ICAgICogd2ViYXVkaW8vQXVkaW9QYW5uZXJOb2RlLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29y
ZTo6QXVkaW9QYW5uZXJOb2RlOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9QYW5u
ZXJOb2RlOjpwYW5uaW5nTW9kZWwpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9QYW5uZXJOb2Rl
Ojpwb3NpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OnNldFBvc2l0
aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6b3JpZW50YXRpb24pOgor
ICAgICAgICAoV2ViQ29yZTo6QXVkaW9QYW5uZXJOb2RlOjpzZXRPcmllbnRhdGlvbik6CisgICAg
ICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OnZlbG9jaXR5KToKKyAgICAgICAgKFdlYkNv
cmU6OkF1ZGlvUGFubmVyTm9kZTo6c2V0VmVsb2NpdHkpOgorICAgICAgICAoV2ViQ29yZTo6QXVk
aW9QYW5uZXJOb2RlOjpkaXN0YW5jZU1vZGVsKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvUGFu
bmVyTm9kZTo6c2V0RGlzdGFuY2VNb2RlbCk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5l
ck5vZGU6OnJlZkRpc3RhbmNlKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6
c2V0UmVmRGlzdGFuY2UpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9QYW5uZXJOb2RlOjptYXhE
aXN0YW5jZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OnNldE1heERpc3Rh
bmNlKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6cm9sbG9mZkZhY3Rvcik6
CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OnNldFJvbGxvZmZGYWN0b3IpOgor
ICAgICAgICAoV2ViQ29yZTo6QXVkaW9QYW5uZXJOb2RlOjpjb25lSW5uZXJBbmdsZSk6CisgICAg
ICAgIChXZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OnNldENvbmVJbm5lckFuZ2xlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkF1ZGlvUGFubmVyTm9kZTo6Y29uZU91dGVyQW5nbGUpOgorICAgICAgICAo
V2ViQ29yZTo6QXVkaW9QYW5uZXJOb2RlOjpzZXRDb25lT3V0ZXJBbmdsZSk6CisgICAgICAgIChX
ZWJDb3JlOjpBdWRpb1Bhbm5lck5vZGU6OmNvbmVPdXRlckdhaW4pOgorICAgICAgICAoV2ViQ29y
ZTo6QXVkaW9QYW5uZXJOb2RlOjpzZXRDb25lT3V0ZXJHYWluKToKKyAgICAgICAgKFdlYkNvcmU6
OkF1ZGlvUGFubmVyTm9kZTo6ZGlzdGFuY2VHYWluKToKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlv
UGFubmVyTm9kZTo6Y29uZUdhaW4pOgorICAgICAgICAqIHdlYmF1ZGlvL0F1ZGlvUGFubmVyTm9k
ZS5pZGw6IEFkZGVkLgorCiAyMDEwLTEwLTA0ICBKZXJlbXkgT3Jsb3cgIDxqb3Jsb3dAY2hyb21p
dW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IE5hdGUgQ2hhcGluLgpJbmRleDogV2ViQ29y
ZS93ZWJhdWRpby9BdWRpb1Bhbm5lck5vZGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvd2Vi
YXVkaW8vQXVkaW9QYW5uZXJOb2RlLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvd2ViYXVk
aW8vQXVkaW9QYW5uZXJOb2RlLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwzMjEgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAg
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1
dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1
dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAor
ICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4g
cGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFO
RCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAor
ICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
T1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUoV0VCX0FVRElPKQorCisjaW5jbHVkZSAi
QXVkaW9QYW5uZXJOb2RlLmgiCisKKyNpbmNsdWRlICJBdWRpb0J1ZmZlclNvdXJjZU5vZGUuaCIK
KyNpbmNsdWRlICJBdWRpb0J1cy5oIgorI2luY2x1ZGUgIkF1ZGlvQ29udGV4dC5oIgorI2luY2x1
ZGUgIkF1ZGlvTm9kZUlucHV0LmgiCisjaW5jbHVkZSAiQXVkaW9Ob2RlT3V0cHV0LmgiCisjaW5j
bHVkZSAiSFJURlBhbm5lci5oIgorI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CisKK3VzaW5n
IG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIHZvaWQgZml4
TkFOcyhkb3VibGUgJngpCit7CisgICAgaWYgKGlzbmFuKHgpIHx8IGlzaW5mKHgpKQorICAgICAg
ICB4ID0gMC4wOworfQorCitBdWRpb1Bhbm5lck5vZGU6OkF1ZGlvUGFubmVyTm9kZShBdWRpb0Nv
bnRleHQqIGNvbnRleHQsIGRvdWJsZSBzYW1wbGVSYXRlKQorICAgIDogQXVkaW9Ob2RlKGNvbnRl
eHQsIHNhbXBsZVJhdGUpCisgICAgLCBtX3Bhbm5pbmdNb2RlbChQYW5uZXI6OlBhbm5pbmdNb2Rl
bEhSVEYpCisgICAgLCBtX2xhc3RHYWluKC0xLjApCisgICAgLCBtX2Nvbm5lY3Rpb25Db3VudCgw
KQoreworICAgIGFkZElucHV0KGFkb3B0UHRyKG5ldyBBdWRpb05vZGVJbnB1dCh0aGlzKSkpOwor
ICAgIGFkZE91dHB1dChhZG9wdFB0cihuZXcgQXVkaW9Ob2RlT3V0cHV0KHRoaXMsIDIpKSk7Cisg
ICAgCisgICAgbV9kaXN0YW5jZUdhaW4gPSBBdWRpb0dhaW46OmNyZWF0ZSgiZGlzdGFuY2VHYWlu
IiwgMS4wLCAwLjAsIDEuMCk7CisgICAgbV9jb25lR2FpbiA9IEF1ZGlvR2Fpbjo6Y3JlYXRlKCJj
b25lR2FpbiIsIDEuMCwgMC4wLCAxLjApOworCisgICAgbV9wb3NpdGlvbiA9IFZlY3RvcjMoMCwg
MCwgMCk7CisgICAgbV9vcmllbnRhdGlvbiA9IFZlY3RvcjMoMSwgMCwgMCk7CisgICAgbV92ZWxv
Y2l0eSA9IFZlY3RvcjMoMCwgMCwgMCk7CisgICAgCisgICAgc2V0VHlwZShOb2RlVHlwZVBhbm5l
cik7CisKKyAgICBpbml0aWFsaXplKCk7Cit9CisKK0F1ZGlvUGFubmVyTm9kZTo6fkF1ZGlvUGFu
bmVyTm9kZSgpCit7CisgICAgdW5pbml0aWFsaXplKCk7Cit9CisKK3ZvaWQgQXVkaW9QYW5uZXJO
b2RlOjpwdWxsSW5wdXRzKHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpCit7CisgICAgLy8gV2Ugb3Zl
cnJpZGUgcHVsbElucHV0cygpLCBzbyB3ZSBjYW4gZGV0ZWN0IG5ldyBBdWRpb1NvdXJjZU5vZGVz
IHdoaWNoIGhhdmUgY29ubmVjdGVkIHRvIHVzIHdoZW4gbmV3IGNvbm5lY3Rpb25zIGFyZSBtYWRl
LgorICAgIC8vIFRoZXNlIEF1ZGlvU291cmNlTm9kZXMgbmVlZCB0byBiZSBtYWRlIGF3YXJlIG9m
IG91ciBleGlzdGVuY2UgaW4gb3JkZXIgdG8gaGFuZGxlIGRvcHBsZXIgc2hpZnQgcGl0Y2ggY2hh
bmdlcy4KKyAgICBpZiAobV9jb25uZWN0aW9uQ291bnQgIT0gY29udGV4dCgpLT5jb25uZWN0aW9u
Q291bnQoKSkgeworICAgICAgICBtX2Nvbm5lY3Rpb25Db3VudCA9IGNvbnRleHQoKS0+Y29ubmVj
dGlvbkNvdW50KCk7CisKKyAgICAgICAgLy8gUmVjdXJzaXZlbHkgZ28gdGhyb3VnaCBhbGwgbm9k
ZXMgY29ubmVjdGVkIHRvIHVzLgorICAgICAgICBub3RpZnlBdWRpb1NvdXJjZXNDb25uZWN0ZWRU
b05vZGUodGhpcyk7CisgICAgfQorICAgIAorICAgIEF1ZGlvTm9kZTo6cHVsbElucHV0cyhmcmFt
ZXNUb1Byb2Nlc3MpOworfQorCit2b2lkIEF1ZGlvUGFubmVyTm9kZTo6cHJvY2VzcyhzaXplX3Qg
ZnJhbWVzVG9Qcm9jZXNzKQoreworICAgIEF1ZGlvQnVzKiBkZXN0aW5hdGlvbiA9IG91dHB1dCgw
KS0+YnVzKCk7CisKKyAgICBpZiAoIWlzSW5pdGlhbGl6ZWQoKSB8fCAhaW5wdXQoMCktPmlzQ29u
bmVjdGVkKCkgfHwgIW1fcGFubmVyLmdldCgpKSB7CisgICAgICAgIGRlc3RpbmF0aW9uLT56ZXJv
KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBdWRpb0J1cyogc291cmNlID0gaW5w
dXQoMCktPmJ1cygpOworCisgICAgaWYgKCFzb3VyY2UpIHsKKyAgICAgICAgZGVzdGluYXRpb24t
Pnplcm8oKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEFwcGx5IHRoZSBwYW5u
aW5nIGVmZmVjdC4KKyAgICBkb3VibGUgYXppbXV0aDsKKyAgICBkb3VibGUgZWxldmF0aW9uOwor
ICAgIGdldEF6aW11dGhFbGV2YXRpb24oJmF6aW11dGgsICZlbGV2YXRpb24pOworICAgIG1fcGFu
bmVyLT5wYW4oYXppbXV0aCwgZWxldmF0aW9uLCBzb3VyY2UsIGRlc3RpbmF0aW9uLCBmcmFtZXNU
b1Byb2Nlc3MpOworCisgICAgLy8gR2V0IHRoZSBkaXN0YW5jZSBhbmQgY29uZSBnYWluLgorICAg
IGRvdWJsZSB0b3RhbEdhaW4gPSBkaXN0YW5jZUNvbmVHYWluKCk7CisKKyAgICAvLyBTbmFwIHRv
IGRlc2lyZWQgZ2FpbiBhdCB0aGUgYmVnaW5uaW5nLgorICAgIGlmIChtX2xhc3RHYWluID09IC0x
LjApCisgICAgICAgIG1fbGFzdEdhaW4gPSB0b3RhbEdhaW47CisgICAgICAgIAorICAgIC8vIEFw
cGx5IGdhaW4gaW4tcGxhY2Ugd2l0aCBkZS16aXBwZXJpbmcuCisgICAgZGVzdGluYXRpb24tPmNv
cHlXaXRoR2FpbkZyb20oKmRlc3RpbmF0aW9uLCAmbV9sYXN0R2FpbiwgdG90YWxHYWluKTsKK30K
Kwordm9pZCBBdWRpb1Bhbm5lck5vZGU6OnJlc2V0KCkKK3sKKyAgICBtX2xhc3RHYWluID0gLTEu
MDsgLy8gZm9yY2UgdG8gc25hcCB0byBpbml0aWFsIGdhaW4KKyAgICBpZiAobV9wYW5uZXIuZ2V0
KCkpCisgICAgICAgIG1fcGFubmVyLT5yZXNldCgpOworfQorCit2b2lkIEF1ZGlvUGFubmVyTm9k
ZTo6aW5pdGlhbGl6ZSgpCit7CisgICAgaWYgKGlzSW5pdGlhbGl6ZWQoKSkKKyAgICAgICAgcmV0
dXJuOworICAgICAgICAKKyAgICBtX3Bhbm5lciA9IFBhbm5lcjo6Y3JlYXRlKG1fcGFubmluZ01v
ZGVsLCBzYW1wbGVSYXRlKCkpOworCisgICAgQXVkaW9Ob2RlOjppbml0aWFsaXplKCk7Cit9CisK
K3ZvaWQgQXVkaW9QYW5uZXJOb2RlOjp1bmluaXRpYWxpemUoKQoreworICAgIGlmICghaXNJbml0
aWFsaXplZCgpKQorICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgIG1fcGFubmVyLmNsZWFy
KCk7CisgICAgQXVkaW9Ob2RlOjp1bmluaXRpYWxpemUoKTsKK30KKworQXVkaW9MaXN0ZW5lciog
QXVkaW9QYW5uZXJOb2RlOjpsaXN0ZW5lcigpCit7CisgICAgcmV0dXJuIGNvbnRleHQoKS0+bGlz
dGVuZXIoKTsKK30KKwordm9pZCBBdWRpb1Bhbm5lck5vZGU6OnNldFBhbm5pbmdNb2RlbCh1bnNp
Z25lZCBzaG9ydCBtb2RlbCkKK3sKKyAgICBpZiAoIW1fcGFubmVyLmdldCgpIHx8IG1vZGVsICE9
IG1fcGFubmluZ01vZGVsKSB7CisgICAgICAgIE93blB0cjxQYW5uZXI+IG5ld1Bhbm5lciA9IFBh
bm5lcjo6Y3JlYXRlKG1vZGVsLCBzYW1wbGVSYXRlKCkpOworICAgICAgICBtX3Bhbm5lciA9IG5l
d1Bhbm5lci5yZWxlYXNlKCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUGFubmVyTm9kZTo6Z2V0
QXppbXV0aEVsZXZhdGlvbihkb3VibGUqIG91dEF6aW11dGgsIGRvdWJsZSogb3V0RWxldmF0aW9u
KQoreworICAgIC8vIEZJWE1FOiB3ZSBzaG91bGQgY2FjaGUgYXppbXV0aCBhbmQgZWxldmF0aW9u
IChpZiBwb3NzaWJsZSksIHNvIHdlIG9ubHkgcmUtY2FsY3VsYXRlIGlmIGEgY2hhbmdlIGhhcyBi
ZWVuIG1hZGUuCisKKyAgICBkb3VibGUgYXppbXV0aCA9IDAuMDsKKworICAgIC8vIENhbGN1bGF0
ZSB0aGUgc291cmNlLWxpc3RlbmVyIHZlY3RvcgorICAgIFZlY3RvcjMgbGlzdGVuZXJQb3NpdGlv
biA9IGxpc3RlbmVyKCktPnBvc2l0aW9uKCk7CisgICAgVmVjdG9yMyBzb3VyY2VMaXN0ZW5lciA9
IG1fcG9zaXRpb24gLSBsaXN0ZW5lclBvc2l0aW9uOworCisgICAgaWYgKHNvdXJjZUxpc3RlbmVy
LmlzWmVybygpKSB7CisgICAgICAgIC8vIGRlZ2VuZXJhdGUgY2FzZSBpZiBzb3VyY2UgYW5kIGxp
c3RlbmVyIGFyZSBhdCB0aGUgc2FtZSBwb2ludAorICAgICAgICAqb3V0QXppbXV0aCA9IDAuMDsK
KyAgICAgICAgKm91dEVsZXZhdGlvbiA9IDAuMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIHNvdXJjZUxpc3RlbmVyLm5vcm1hbGl6ZSgpOworCisgICAgLy8gQWxpZ24gYXhlcworICAg
IFZlY3RvcjMgbGlzdGVuZXJGcm9udCA9IGxpc3RlbmVyKCktPm9yaWVudGF0aW9uKCk7CisgICAg
VmVjdG9yMyBsaXN0ZW5lclVwID0gbGlzdGVuZXIoKS0+dXBWZWN0b3IoKTsKKyAgICBWZWN0b3Iz
IGxpc3RlbmVyUmlnaHQgPSBjcm9zcyhsaXN0ZW5lckZyb250LCBsaXN0ZW5lclVwKTsKKyAgICBs
aXN0ZW5lclJpZ2h0Lm5vcm1hbGl6ZSgpOworCisgICAgVmVjdG9yMyBsaXN0ZW5lckZyb250Tm9y
bSA9IGxpc3RlbmVyRnJvbnQ7CisgICAgbGlzdGVuZXJGcm9udE5vcm0ubm9ybWFsaXplKCk7CisK
KyAgICBWZWN0b3IzIHVwID0gY3Jvc3MobGlzdGVuZXJSaWdodCwgbGlzdGVuZXJGcm9udE5vcm0p
OworCisgICAgZG91YmxlIHVwUHJvamVjdGlvbiA9IGRvdChzb3VyY2VMaXN0ZW5lciwgdXApOwor
CisgICAgVmVjdG9yMyBwcm9qZWN0ZWRTb3VyY2UgPSBzb3VyY2VMaXN0ZW5lciAtIHVwUHJvamVj
dGlvbiAqIHVwOworICAgIHByb2plY3RlZFNvdXJjZS5ub3JtYWxpemUoKTsKKworICAgIGF6aW11
dGggPSAxODAuMCAqIGFjb3MoZG90KHByb2plY3RlZFNvdXJjZSwgbGlzdGVuZXJSaWdodCkpIC8g
TV9QSTsKKyAgICBmaXhOQU5zKGF6aW11dGgpOyAvLyBhdm9pZCBpbGxlZ2FsIHZhbHVlcworCisg
ICAgLy8gU291cmNlICBpbiBmcm9udCBvciBiZWhpbmQgdGhlIGxpc3RlbmVyCisgICAgZG91Ymxl
IGZyb250QmFjayA9IGRvdChwcm9qZWN0ZWRTb3VyY2UsIGxpc3RlbmVyRnJvbnROb3JtKTsKKyAg
ICBpZiAoZnJvbnRCYWNrIDwgMC4wKQorICAgICAgICBhemltdXRoID0gMzYwLjAgLSBhemltdXRo
OworCisgICAgLy8gTWFrZSBhemltdXRoIHJlbGF0aXZlIHRvICJmcm9udCIgYW5kIG5vdCAicmln
aHQiIGxpc3RlbmVyIHZlY3RvcgorICAgIGlmICgoYXppbXV0aCA+PSAwLjApICYmIChhemltdXRo
IDw9IDI3MC4wKSkKKyAgICAgICAgYXppbXV0aCA9IDkwLjAgLSBhemltdXRoOworICAgIGVsc2UK
KyAgICAgICAgYXppbXV0aCA9IDQ1MC4wIC0gYXppbXV0aDsKKworICAgIC8vIEVsZXZhdGlvbgor
ICAgIGRvdWJsZSBlbGV2YXRpb24gPSA5MC4wIC0gMTgwLjAgKiBhY29zKGRvdChzb3VyY2VMaXN0
ZW5lciwgdXApKSAvIE1fUEk7CisgICAgZml4TkFOcyhhemltdXRoKTsgLy8gYXZvaWQgaWxsZWdh
bCB2YWx1ZXMKKworICAgIGlmIChlbGV2YXRpb24gPiA5MC4wKQorICAgICAgICBlbGV2YXRpb24g
PSAxODAuMCAtIGVsZXZhdGlvbjsKKyAgICBlbHNlIGlmIChlbGV2YXRpb24gPCAtOTAuMCkKKyAg
ICAgICAgZWxldmF0aW9uID0gLTE4MC4wIC0gZWxldmF0aW9uOworCisgICAgaWYgKG91dEF6aW11
dGgpCisgICAgICAgICpvdXRBemltdXRoID0gYXppbXV0aDsKKyAgICBpZiAob3V0RWxldmF0aW9u
KQorICAgICAgICAqb3V0RWxldmF0aW9uID0gZWxldmF0aW9uOworfQorCitmbG9hdCBBdWRpb1Bh
bm5lck5vZGU6OmRvcHBsZXJSYXRlKCkKK3sKKyAgICBkb3VibGUgZG9wcGxlclNoaWZ0ID0gMS4w
OworCisgICAgLy8gRklYTUU6IG9wdGltaXplIGZvciBjYXNlIHdoZW4gbmVpdGhlciBzb3VyY2Ug
bm9yIGxpc3RlbmVyIGhhcyBjaGFuZ2VkLi4uCisgICAgZG91YmxlIGRvcHBsZXJGYWN0b3IgPSBs
aXN0ZW5lcigpLT5kb3BwbGVyRmFjdG9yKCk7CisKKyAgICBpZiAoZG9wcGxlckZhY3RvciA+IDAu
MCkgeworICAgICAgICBkb3VibGUgc3BlZWRPZlNvdW5kID0gbGlzdGVuZXIoKS0+c3BlZWRPZlNv
dW5kKCk7CisKKyAgICAgICAgY29uc3QgVmVjdG9yMyAmc291cmNlVmVsb2NpdHkgPSBtX3ZlbG9j
aXR5OworICAgICAgICBjb25zdCBWZWN0b3IzICZsaXN0ZW5lclZlbG9jaXR5ID0gbGlzdGVuZXIo
KS0+dmVsb2NpdHkoKTsKKworICAgICAgICAvLyBEb24ndCBib3RoZXIgaWYgYm90aCBzb3VyY2Ug
YW5kIGxpc3RlbmVyIGhhdmUgbm8gdmVsb2NpdHkKKyAgICAgICAgYm9vbCBzb3VyY2VIYXNWZWxv
Y2l0eSA9ICFzb3VyY2VWZWxvY2l0eS5pc1plcm8oKTsKKyAgICAgICAgYm9vbCBsaXN0ZW5lckhh
c1ZlbG9jaXR5ID0gIWxpc3RlbmVyVmVsb2NpdHkuaXNaZXJvKCk7CisKKyAgICAgICAgaWYgKHNv
dXJjZUhhc1ZlbG9jaXR5IHx8IGxpc3RlbmVySGFzVmVsb2NpdHkpIHsKKyAgICAgICAgICAgIC8v
IENhbGN1bGF0ZSB0aGUgc291cmNlIHRvIGxpc3RlbmVyIHZlY3RvcgorICAgICAgICAgICAgVmVj
dG9yMyBsaXN0ZW5lclBvc2l0aW9uID0gbGlzdGVuZXIoKS0+cG9zaXRpb24oKTsKKyAgICAgICAg
ICAgIFZlY3RvcjMgc291cmNlVG9MaXN0ZW5lciA9IG1fcG9zaXRpb24gLSBsaXN0ZW5lclBvc2l0
aW9uOworCisgICAgICAgICAgICBkb3VibGUgc291cmNlTGlzdGVuZXJNYWduaXR1ZGUgPSBzb3Vy
Y2VUb0xpc3RlbmVyLmFicygpOworCisgICAgICAgICAgICBkb3VibGUgbGlzdGVuZXJQcm9qZWN0
aW9uID0gZG90KHNvdXJjZVRvTGlzdGVuZXIsIGxpc3RlbmVyVmVsb2NpdHkpIC8gc291cmNlTGlz
dGVuZXJNYWduaXR1ZGU7CisgICAgICAgICAgICBkb3VibGUgc291cmNlUHJvamVjdGlvbiA9IGRv
dChzb3VyY2VUb0xpc3RlbmVyLCBzb3VyY2VWZWxvY2l0eSkgLyBzb3VyY2VMaXN0ZW5lck1hZ25p
dHVkZTsKKworICAgICAgICAgICAgbGlzdGVuZXJQcm9qZWN0aW9uID0gLWxpc3RlbmVyUHJvamVj
dGlvbjsKKyAgICAgICAgICAgIHNvdXJjZVByb2plY3Rpb24gPSAtc291cmNlUHJvamVjdGlvbjsK
KworICAgICAgICAgICAgZG91YmxlIHNjYWxlZFNwZWVkT2ZTb3VuZCA9IHNwZWVkT2ZTb3VuZCAv
IGRvcHBsZXJGYWN0b3I7CisgICAgICAgICAgICBsaXN0ZW5lclByb2plY3Rpb24gPSBtaW4obGlz
dGVuZXJQcm9qZWN0aW9uLCBzY2FsZWRTcGVlZE9mU291bmQpOworICAgICAgICAgICAgc291cmNl
UHJvamVjdGlvbiA9IG1pbihzb3VyY2VQcm9qZWN0aW9uLCBzY2FsZWRTcGVlZE9mU291bmQpOwor
CisgICAgICAgICAgICBkb3BwbGVyU2hpZnQgPSAoKHNwZWVkT2ZTb3VuZCAtIGRvcHBsZXJGYWN0
b3IgKiBsaXN0ZW5lclByb2plY3Rpb24pIC8gKHNwZWVkT2ZTb3VuZCAtIGRvcHBsZXJGYWN0b3Ig
KiBzb3VyY2VQcm9qZWN0aW9uKSk7CisgICAgICAgICAgICBmaXhOQU5zKGRvcHBsZXJTaGlmdCk7
IC8vIGF2b2lkIGlsbGVnYWwgdmFsdWVzCisKKyAgICAgICAgICAgIC8vIExpbWl0IHRoZSBwaXRj
aCBzaGlmdGluZyB0byA0IG9jdGF2ZXMgdXAgYW5kIDMgb2N0YXZlcyBkb3duLgorICAgICAgICAg
ICAgaWYgKGRvcHBsZXJTaGlmdCA+IDE2LjApCisgICAgICAgICAgICAgICAgZG9wcGxlclNoaWZ0
ID0gMTYuMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGRvcHBsZXJTaGlmdCA8IDAuMTI1KQorICAg
ICAgICAgICAgICAgIGRvcHBsZXJTaGlmdCA9IDAuMTI1OyAgIAorICAgICAgICB9CisgICAgfQor
CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0Pihkb3BwbGVyU2hpZnQpOworfQorCitmbG9h
dCBBdWRpb1Bhbm5lck5vZGU6OmRpc3RhbmNlQ29uZUdhaW4oKQoreworICAgIFZlY3RvcjMgbGlz
dGVuZXJQb3NpdGlvbiA9IGxpc3RlbmVyKCktPnBvc2l0aW9uKCk7CisKKyAgICBkb3VibGUgbGlz
dGVuZXJEaXN0YW5jZSA9IGRpc3RhbmNlKG1fcG9zaXRpb24sIGxpc3RlbmVyUG9zaXRpb24pOwor
ICAgIGRvdWJsZSBkaXN0YW5jZUdhaW4gPSBtX2Rpc3RhbmNlRWZmZWN0LmdhaW4obGlzdGVuZXJE
aXN0YW5jZSk7CisgICAgCisgICAgbV9kaXN0YW5jZUdhaW4tPnNldFZhbHVlKHN0YXRpY19jYXN0
PGZsb2F0PihkaXN0YW5jZUdhaW4pKTsKKworICAgIC8vIEZJWE1FOiBjb3VsZCBvcHRpbWl6ZSBi
eSBjYWNoaW5nIGNvbmVHYWluCisgICAgZG91YmxlIGNvbmVHYWluID0gbV9jb25lRWZmZWN0Lmdh
aW4obV9wb3NpdGlvbiwgbV9vcmllbnRhdGlvbiwgbGlzdGVuZXJQb3NpdGlvbik7CisgICAgCisg
ICAgbV9jb25lR2Fpbi0+c2V0VmFsdWUoc3RhdGljX2Nhc3Q8ZmxvYXQ+KGNvbmVHYWluKSk7CisK
KyAgICByZXR1cm4gZmxvYXQoZGlzdGFuY2VHYWluICogY29uZUdhaW4pOworfQorCit2b2lkIEF1
ZGlvUGFubmVyTm9kZTo6bm90aWZ5QXVkaW9Tb3VyY2VzQ29ubmVjdGVkVG9Ob2RlKEF1ZGlvTm9k
ZSogbm9kZSkKK3sKKyAgICBBU1NFUlQobm9kZSk7CisgICAgaWYgKCFub2RlKQorICAgICAgICBy
ZXR1cm47CisgICAgICAgIAorICAgIC8vIEZpcnN0IGNoZWNrIGlmIHRoaXMgbm9kZSBpcyBhbiBB
dWRpb0J1ZmZlclNvdXJjZU5vZGUuICBJZiBzbywgbGV0IGl0IGtub3cgYWJvdXQgdXMgc28gdGhh
dCBkb3BwbGVyIHNoaWZ0IHBpdGNoIGNhbiBiZSB0YWtlbiBpbnRvIGFjY291bnQuCisgICAgaWYg
KG5vZGUtPnR5cGUoKSA9PSBOb2RlVHlwZUF1ZGlvQnVmZmVyU291cmNlKSB7CisgICAgICAgIEF1
ZGlvQnVmZmVyU291cmNlTm9kZSogYnVmZmVyU291cmNlTm9kZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8
QXVkaW9CdWZmZXJTb3VyY2VOb2RlKj4obm9kZSk7CisgICAgICAgIGJ1ZmZlclNvdXJjZU5vZGUt
PnNldFBhbm5lck5vZGUodGhpcyk7CisgICAgfSBlbHNlIHsgICAgCisgICAgICAgIC8vIEdvIHRo
cm91Z2ggYWxsIGlucHV0cyB0byB0aGlzIG5vZGUuCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBub2RlLT5udW1iZXJPZklucHV0cygpOyArK2kpIHsKKyAgICAgICAgICAgIEF1ZGlv
Tm9kZUlucHV0KiBpbnB1dCA9IG5vZGUtPmlucHV0KGkpOworCisgICAgICAgICAgICAvLyBGb3Ig
ZWFjaCBpbnB1dCwgZ28gdGhyb3VnaCBhbGwgb2YgaXRzIGNvbm5lY3Rpb25zLCBsb29raW5nIGZv
ciBBdWRpb0J1ZmZlclNvdXJjZU5vZGVzLgorICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBqID0g
MDsgaiA8IGlucHV0LT5udW1iZXJPZkNvbm5lY3Rpb25zKCk7ICsraikgeworICAgICAgICAgICAg
ICAgIEF1ZGlvTm9kZU91dHB1dCogY29ubmVjdGVkT3V0cHV0ID0gaW5wdXQtPm91dHB1dChqKTsK
KyAgICAgICAgICAgICAgICBBdWRpb05vZGUqIGNvbm5lY3RlZE5vZGUgPSBjb25uZWN0ZWRPdXRw
dXQtPm5vZGUoKTsKKyAgICAgICAgICAgICAgICBub3RpZnlBdWRpb1NvdXJjZXNDb25uZWN0ZWRU
b05vZGUoY29ubmVjdGVkTm9kZSk7IC8vIHJlY3Vyc2UKKyAgICAgICAgICAgIH0KKyAgICAgICAg
fQorICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxF
KFdFQl9BVURJTykKSW5kZXg6IFdlYkNvcmUvd2ViYXVkaW8vQXVkaW9QYW5uZXJOb2RlLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS93ZWJhdWRpby9BdWRpb1Bhbm5lck5vZGUuaAkocmV2aXNpb24g
MCkKKysrIFdlYkNvcmUvd2ViYXVkaW8vQXVkaW9QYW5uZXJOb2RlLmgJKHJldmlzaW9uIDApCkBA
IC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUg
bmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgor
ICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3Rl
IHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVj
aWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkK
KyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAq
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBBdWRpb1Bhbm5lck5vZGVfaAorI2RlZmluZSBBdWRp
b1Bhbm5lck5vZGVfaAorCisjaW5jbHVkZSAiQXVkaW9CdXMuaCIKKyNpbmNsdWRlICJBdWRpb0dh
aW4uaCIKKyNpbmNsdWRlICJBdWRpb0xpc3RlbmVyLmgiCisjaW5jbHVkZSAiQXVkaW9Ob2RlLmgi
CisjaW5jbHVkZSAiQ29uZS5oIgorI2luY2x1ZGUgIkRpc3RhbmNlLmgiCisjaW5jbHVkZSAiUGFu
bmVyLmgiCisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IzLmg+
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gQXVkaW9QYW5uZXJOb2RlIGlzIGFuIEF1ZGlv
Tm9kZSB3aXRoIG9uZSBpbnB1dCBhbmQgb25lIG91dHB1dC4KKy8vIEl0IHBvc2l0aW9ucyBhIHNv
dW5kIGluIDNEIHNwYWNlLCB3aXRoIHRoZSBleGFjdCBlZmZlY3QgZGVwZW5kZW50IG9uIHRoZSBw
YW5uaW5nIG1vZGVsLgorLy8gSXQgaGFzIGEgcG9zaXRpb24gYW5kIGFuIG9yaWVudGF0aW9uIGlu
IDNEIHNwYWNlIHdoaWNoIGlzIHJlbGF0aXZlIHRvIHRoZSBwb3NpdGlvbiBhbmQgb3JpZW50YXRp
b24gb2YgdGhlIGNvbnRleHQncyBBdWRpb0xpc3RlbmVyLgorLy8gQSBkaXN0YW5jZSBlZmZlY3Qg
d2lsbCBhdHRlbnVhdGUgdGhlIGdhaW4gYXMgdGhlIHBvc2l0aW9uIG1vdmVzIGF3YXkgZnJvbSB0
aGUgbGlzdGVuZXIuCisvLyBBIGNvbmUgZWZmZWN0IHdpbGwgYXR0ZW51YXRlIHRoZSBnYWluIGFz
IHRoZSBvcmllbnRhdGlvbiBtb3ZlcyBhd2F5IGZyb20gdGhlIGxpc3RlbmVyLgorLy8gQWxsIG9m
IHRoZXNlIGVmZmVjdHMgZm9sbG93IHRoZSBPcGVuQUwgc3BlY2lmaWNhdGlvbiB2ZXJ5IGNsb3Nl
bHkuCisKK2NsYXNzIEF1ZGlvUGFubmVyTm9kZSA6IHB1YmxpYyBBdWRpb05vZGUgeworcHVibGlj
OgorICAgIGVudW0geworICAgICAgICBQQVNTVEhST1VHSCA9IDAsCisgICAgICAgIEVRVUFMUE9X
RVIgPSAxLAorICAgICAgICBIUlRGID0gMiwKKyAgICAgICAgU09VTkRGSUVMRCA9IDMsCisgICAg
ICAgIE1BVFJJWE1JWCA9IDQKKyAgICB9OworCisgICAgc3RhdGljIFBhc3NSZWZQdHI8QXVkaW9Q
YW5uZXJOb2RlPiBjcmVhdGUoQXVkaW9Db250ZXh0KiBjb250ZXh0LCBkb3VibGUgc2FtcGxlUmF0
ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgQXVkaW9QYW5uZXJOb2RlKGNv
bnRleHQsIHNhbXBsZVJhdGUpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5BdWRpb1Bhbm5lck5v
ZGUoKTsKKworICAgIC8vIEF1ZGlvTm9kZQorICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzKHNpemVf
dCBmcmFtZXNUb1Byb2Nlc3MpOworICAgIHZpcnR1YWwgdm9pZCBwdWxsSW5wdXRzKHNpemVfdCBm
cmFtZXNUb1Byb2Nlc3MpOworICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOworICAgIHZpcnR1YWwg
dm9pZCBpbml0aWFsaXplKCk7CisgICAgdmlydHVhbCB2b2lkIHVuaW5pdGlhbGl6ZSgpOworCisg
ICAgLy8gTGlzdGVuZXIKKyAgICBBdWRpb0xpc3RlbmVyKiBsaXN0ZW5lcigpOworCisgICAgLy8g
UGFubmluZyBtb2RlbAorICAgIHVuc2lnbmVkIHNob3J0IHBhbm5pbmdNb2RlbCgpIGNvbnN0IHsg
cmV0dXJuIG1fcGFubmluZ01vZGVsOyB9CisgICAgdm9pZCBzZXRQYW5uaW5nTW9kZWwodW5zaWdu
ZWQgc2hvcnQpOworCisgICAgLy8gUG9zaXRpb24KKyAgICBWZWN0b3IzIHBvc2l0aW9uKCkgY29u
c3QgeyByZXR1cm4gbV9wb3NpdGlvbjsgfQorICAgIHZvaWQgc2V0UG9zaXRpb24oZmxvYXQgeCwg
ZmxvYXQgeSwgZmxvYXQgeikgeyBtX3Bvc2l0aW9uID0gVmVjdG9yMyh4LCB5LCB6KTsgfQorCisg
ICAgLy8gT3JpZW50YXRpb24KKyAgICBWZWN0b3IzIG9yaWVudGF0aW9uKCkgY29uc3QgeyByZXR1
cm4gbV9wb3NpdGlvbjsgfQorICAgIHZvaWQgc2V0T3JpZW50YXRpb24oZmxvYXQgeCwgZmxvYXQg
eSwgZmxvYXQgeikgeyBtX29yaWVudGF0aW9uID0gVmVjdG9yMyh4LCB5LCB6KTsgfQorCisgICAg
Ly8gVmVsb2NpdHkKKyAgICBWZWN0b3IzIHZlbG9jaXR5KCkgY29uc3QgeyByZXR1cm4gbV92ZWxv
Y2l0eTsgfQorICAgIHZvaWQgc2V0VmVsb2NpdHkoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikg
eyBtX3ZlbG9jaXR5ID0gVmVjdG9yMyh4LCB5LCB6KTsgfQorCisgICAgLy8gRGlzdGFuY2UgcGFy
YW1ldGVycworICAgIHVuc2lnbmVkIHNob3J0IGRpc3RhbmNlTW9kZWwoKSB7IHJldHVybiBtX2Rp
c3RhbmNlRWZmZWN0Lm1vZGVsKCk7IH0KKyAgICB2b2lkIHNldERpc3RhbmNlTW9kZWwodW5zaWdu
ZWQgc2hvcnQgbW9kZWwpIHsgbV9kaXN0YW5jZUVmZmVjdC5zZXRNb2RlbChzdGF0aWNfY2FzdDxE
aXN0YW5jZUVmZmVjdDo6TW9kZWxUeXBlPihtb2RlbCksIHRydWUpOyB9CisgICAgCisgICAgZmxv
YXQgcmVmRGlzdGFuY2UoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxmbG9hdD4obV9kaXN0YW5jZUVm
ZmVjdC5yZWZEaXN0YW5jZSgpKTsgfQorICAgIHZvaWQgc2V0UmVmRGlzdGFuY2UoZmxvYXQgcmVm
RGlzdGFuY2UpIHsgbV9kaXN0YW5jZUVmZmVjdC5zZXRSZWZEaXN0YW5jZShyZWZEaXN0YW5jZSk7
IH0KKworICAgIGZsb2F0IG1heERpc3RhbmNlKCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+
KG1fZGlzdGFuY2VFZmZlY3QubWF4RGlzdGFuY2UoKSk7IH0KKyAgICB2b2lkIHNldE1heERpc3Rh
bmNlKGZsb2F0IG1heERpc3RhbmNlKSB7IG1fZGlzdGFuY2VFZmZlY3Quc2V0TWF4RGlzdGFuY2Uo
bWF4RGlzdGFuY2UpOyB9CisKKyAgICBmbG9hdCByb2xsb2ZmRmFjdG9yKCkgeyByZXR1cm4gc3Rh
dGljX2Nhc3Q8ZmxvYXQ+KG1fZGlzdGFuY2VFZmZlY3Qucm9sbG9mZkZhY3RvcigpKTsgfQorICAg
IHZvaWQgc2V0Um9sbG9mZkZhY3RvcihmbG9hdCByb2xsb2ZmRmFjdG9yKSB7IG1fZGlzdGFuY2VF
ZmZlY3Quc2V0Um9sbG9mZkZhY3Rvcihyb2xsb2ZmRmFjdG9yKTsgfQorCisgICAgLy8gU291bmQg
Y29uZXMgLSBhbmdsZXMgaW4gZGVncmVlcworICAgIGZsb2F0IGNvbmVJbm5lckFuZ2xlKCkgY29u
c3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1fY29uZUVmZmVjdC5pbm5lckFuZ2xlKCkp
OyB9CisgICAgdm9pZCBzZXRDb25lSW5uZXJBbmdsZShmbG9hdCBhbmdsZSkgeyBtX2NvbmVFZmZl
Y3Quc2V0SW5uZXJBbmdsZShhbmdsZSk7IH0KKworICAgIGZsb2F0IGNvbmVPdXRlckFuZ2xlKCkg
Y29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1fY29uZUVmZmVjdC5vdXRlckFuZ2xl
KCkpOyB9CisgICAgdm9pZCBzZXRDb25lT3V0ZXJBbmdsZShmbG9hdCBhbmdsZSkgeyBtX2NvbmVF
ZmZlY3Quc2V0T3V0ZXJBbmdsZShhbmdsZSk7IH0KKworICAgIGZsb2F0IGNvbmVPdXRlckdhaW4o
KSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxmbG9hdD4obV9jb25lRWZmZWN0Lm91dGVyR2Fp
bigpKTsgfQorICAgIHZvaWQgc2V0Q29uZU91dGVyR2FpbihmbG9hdCBhbmdsZSkgeyBtX2NvbmVF
ZmZlY3Quc2V0T3V0ZXJHYWluKGFuZ2xlKTsgfQorCisgICAgdm9pZCBnZXRBemltdXRoRWxldmF0
aW9uKGRvdWJsZSogb3V0QXppbXV0aCwgZG91YmxlKiBvdXRFbGV2YXRpb24pOworICAgIGZsb2F0
IGRvcHBsZXJSYXRlKCk7CisKKyAgICAvLyBBY2Nlc3NvcnMgZm9yIGR5bmFtaWNhbGx5IGNhbGN1
bGF0ZWQgZ2FpbiB2YWx1ZXMuCisgICAgQXVkaW9HYWluKiBkaXN0YW5jZUdhaW4oKSB7IHJldHVy
biBtX2Rpc3RhbmNlR2Fpbi5nZXQoKTsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAKKyAgICBBdWRpb0dhaW4qIGNvbmVHYWluKCkgeyByZXR1cm4gbV9jb25lR2Fpbi5n
ZXQoKTsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworcHJpdmF0
ZToKKyAgICBBdWRpb1Bhbm5lck5vZGUoQXVkaW9Db250ZXh0KiwgZG91YmxlIHNhbXBsZVJhdGUp
OworCisgICAgLy8gUmV0dXJucyB0aGUgY29tYmluZWQgZGlzdGFuY2UgYW5kIGNvbmUgZ2FpbiBh
dHRlbnVhdGlvbi4KKyAgICBmbG9hdCBkaXN0YW5jZUNvbmVHYWluKCk7CisKKyAgICAvLyBOb3Rp
ZmllcyBhbnkgQXVkaW9CdWZmZXJTb3VyY2VOb2RlcyBjb25uZWN0ZWQgdG8gdXMgZWl0aGVyIGRp
cmVjdGx5IG9yIGluZGlyZWN0bHkgYWJvdXQgb3VyIGV4aXN0ZW5jZS4KKyAgICAvLyBUaGlzIGlz
IGluIG9yZGVyIHRvIGhhbmRsZSB0aGUgcGl0Y2ggY2hhbmdlIG5lY2Vzc2FyeSBmb3IgdGhlIGRv
cHBsZXIgc2hpZnQuCisgICAgdm9pZCBub3RpZnlBdWRpb1NvdXJjZXNDb25uZWN0ZWRUb05vZGUo
QXVkaW9Ob2RlKik7CisKKyAgICBPd25QdHI8UGFubmVyPiBtX3Bhbm5lcjsKKyAgICB1bnNpZ25l
ZCBtX3Bhbm5pbmdNb2RlbDsKKworICAgIC8vIEZJWE1FOiB1cGdyYWRlIHRvIEZsb2F0UG9pbnQz
RCBmcm9tIFZlY3RvcjMuCisgICAgVmVjdG9yMyBtX3Bvc2l0aW9uOworICAgIFZlY3RvcjMgbV9v
cmllbnRhdGlvbjsKKyAgICBWZWN0b3IzIG1fdmVsb2NpdHk7CisKKyAgICAvLyBHYWluCisgICAg
UmVmUHRyPEF1ZGlvR2Fpbj4gbV9kaXN0YW5jZUdhaW47CisgICAgUmVmUHRyPEF1ZGlvR2Fpbj4g
bV9jb25lR2FpbjsKKyAgICBEaXN0YW5jZUVmZmVjdCBtX2Rpc3RhbmNlRWZmZWN0OworICAgIENv
bmVFZmZlY3QgbV9jb25lRWZmZWN0OworICAgIGRvdWJsZSBtX2xhc3RHYWluOworCisgICAgdW5z
aWduZWQgbV9jb25uZWN0aW9uQ291bnQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisK
KyNlbmRpZiAvLyBBdWRpb1Bhbm5lck5vZGVfaApJbmRleDogV2ViQ29yZS93ZWJhdWRpby9BdWRp
b1Bhbm5lck5vZGUuaWRsCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvd2ViYXVkaW8vQXVkaW9QYW5u
ZXJOb2RlLmlkbAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvd2ViYXVkaW8vQXVkaW9QYW5uZXJO
b2RlLmlkbAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBs
ZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2Vk
IHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlz
IHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRP
UlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
CisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK21vZHVsZSBhdWRpbyB7Cisg
ICAgaW50ZXJmYWNlIFsKKyAgICAgICAgQ29uZGl0aW9uYWw9V0VCX0FVRElPLAorICAgICAgICBH
ZW5lcmF0ZUNvbnN0cnVjdG9yLAorICAgICAgICBHZW5lcmF0ZVRvSlMKKyAgICBdIEF1ZGlvUGFu
bmVyTm9kZSA6IEF1ZGlvTm9kZSB7CisgICAgICAgIC8vIFBhbm5pbmcgbW9kZWwKKyAgICAgICAg
Y29uc3QgdW5zaWduZWQgc2hvcnQgUEFTU1RIUk9VR0ggPSAwOworICAgICAgICBjb25zdCB1bnNp
Z25lZCBzaG9ydCBFUVVBTFBPV0VSID0gMTsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQg
SFJURiA9IDI7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNPVU5ERklFTEQgPSAzOwor
CisgICAgICAgIC8vIERlZmF1bHQgbW9kZWwgZm9yIHN0ZXJlbyBpcyBIUlRGIAorICAgICAgICBh
dHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBwYW5uaW5nTW9kZWw7IC8vIEZJWE1FOiB1c2UgdW5zaWdu
ZWQgc2hvcnQgd2hlbiBnbHVlIGdlbmVyYXRpb24gc3VwcG9ydHMgaXQKKworICAgICAgICAvLyBV
c2VzIGEgM0QgY2FydGVzaWFuIGNvb3JkaW5hdGUgc3lzdGVtIAorICAgICAgICB2b2lkIHNldFBv
c2l0aW9uKGluIGZsb2F0IHgsIGluIGZsb2F0IHksIGluIGZsb2F0IHopOworICAgICAgICB2b2lk
IHNldE9yaWVudGF0aW9uKGluIGZsb2F0IHgsIGluIGZsb2F0IHksIGluIGZsb2F0IHopOworICAg
ICAgICB2b2lkIHNldFZlbG9jaXR5KGluIGZsb2F0IHgsIGluIGZsb2F0IHksIGluIGZsb2F0IHop
OworCisgICAgICAgIC8vIERpc3RhbmNlIG1vZGVsCisgICAgICAgIGF0dHJpYnV0ZSB1bnNpZ25l
ZCBsb25nIGRpc3RhbmNlTW9kZWw7IC8vIEZJWE1FOiB1c2UgdW5zaWduZWQgc2hvcnQgd2hlbiBn
bHVlIGdlbmVyYXRpb24gc3VwcG9ydHMgaXQKKyAgICAgICAgYXR0cmlidXRlIGZsb2F0IHJlZkRp
c3RhbmNlOworICAgICAgICBhdHRyaWJ1dGUgZmxvYXQgbWF4RGlzdGFuY2U7CisgICAgICAgIGF0
dHJpYnV0ZSBmbG9hdCByb2xsb2ZmRmFjdG9yOworCisgICAgICAgIC8vIERpcmVjdGlvbmFsIHNv
dW5kIGNvbmUKKyAgICAgICAgYXR0cmlidXRlIGZsb2F0IGNvbmVJbm5lckFuZ2xlOworICAgICAg
ICBhdHRyaWJ1dGUgZmxvYXQgY29uZU91dGVyQW5nbGU7CisgICAgICAgIGF0dHJpYnV0ZSBmbG9h
dCBjb25lT3V0ZXJHYWluOworCisgICAgICAgIC8vIER5bmFtaWNhbGx5IGNhbGN1bGF0ZWQgZ2Fp
biB2YWx1ZXMgICAgICAgICAgCisgICAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBBdWRpb0dhaW4g
Y29uZUdhaW47CisgICAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBBdWRpb0dhaW4gZGlzdGFuY2VH
YWluOworICAgIH07Cit9Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>