<?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>174604</bug_id>
          
          <creation_ts>2017-07-17 19:46:06 -0700</creation_ts>
          <short_desc>Cleanup: Remove AlternativeTextInfo and use Variant to represent alternative text info details</short_desc>
          <delta_ts>2021-03-29 13:54:53 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</component>
          <version>WebKit Local Build</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=223903</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>223902</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Daniel Bates">dbates</reporter>
          <assigned_to name="Daniel Bates">dbates</assigned_to>
          <cc>cdumez</cc>
    
    <cc>darin</cc>
    
    <cc>rniwa</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1329828</commentid>
    <comment_count>0</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2017-07-17 19:46:06 -0700</bug_when>
    <thetext>We can make use of WTF::Variant to simplify AlternativeTextInfo.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1329830</commentid>
    <comment_count>1</comment_count>
      <attachid>315752</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2017-07-17 19:47:32 -0700</bug_when>
    <thetext>Created attachment 315752
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1329833</commentid>
    <comment_count>2</comment_count>
      <attachid>315752</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2017-07-17 19:55:17 -0700</bug_when>
    <thetext>Comment on attachment 315752
Patch

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

&gt; Source/WebCore/editing/AlternativeTextController.h:115
&gt; +        Variant&lt;NoDetails, AutocorrectionReplacement, AlternativeDictationContext&gt; details;

What would you think about std::optional&lt;Variant&lt;AutocorrectionReplacement, AlternativeDictationContext&gt;&gt; ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1329839</commentid>
    <comment_count>3</comment_count>
      <attachid>315752</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2017-07-17 20:15:31 -0700</bug_when>
    <thetext>Comment on attachment 315752
Patch

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

I think Variant is a little wordy here, and all we are doing is saving a tiny bit of storage by sharing storage for the replacement string and the dictation context, at the cost of considerably more obfuscated code. I think maybe we should just use two separate data members for these and not bother with Variant.

&gt; Source/WebCore/editing/AlternativeTextController.cpp:291
&gt; +        if (!m_alternativeTextInfo.rangeWithAlternative || !WTF::holds_alternative&lt;AlternativeTextInfo::AutocorrectionReplacement&gt;(m_alternativeTextInfo.details))
&gt; +            break;

The old code used an unconditional static_cast, and the corresponding idiom is to just call WTF::get with no previous check. So there is no need to write out the wordy holds_alternative call. Except that I don’t understand why there is a chance that details could have been null. In the new code, I believe that would be a null string and so require no special case. But we should audit the code paths to make sure.

&gt; Source/WebCore/editing/AlternativeTextController.cpp:328
&gt; +        if (!m_alternativeTextInfo.rangeWithAlternative || !WTF::holds_alternative&lt;AlternativeTextInfo::AlternativeDictationContext&gt;(m_alternativeTextInfo.details))
&gt; +            return;

The old code used an unconditional static_cast, and the corresponding idiom is to just call WTF::get with no previous check. So there is no need to write out the wordy holds_alternative call. Except that I don’t understand why there is a chance that details could have been null. In the new code, I believe that would be a null string and so it would require the call to holds_alternative. But we should audit the code paths to make sure this is needed.

&gt; Source/WebCore/editing/AlternativeTextController.cpp:331
&gt; +        if (!dictationContext)
&gt;              return;

This is so strange. Why would we bother storing a dictation context of 0 in the first place? I do see that the old code checks for this value, though, so safer not to change it.

&gt; Source/WebCore/editing/AlternativeTextController.h:106
&gt; +    struct AlternativeTextInfo {

This use of a struct is quite peculiar. These should just all be separate data members. There is nothing that binds them together as far as I can tell. The code uses them each separately. Should be m_rangeWithAlternative, m_isActive, m_type, m_originalText, m_details.

&gt; Source/WebCore/editing/AlternativeTextController.h:109
&gt; +        using AutocorrectionReplacement = String;
&gt; +        using AlternativeDictationContext = uint64_t;
&gt; +        struct NoDetails { };

Since this is already inside the AlternativeTextController class, I would suggest putting these outside the struct so we can use them without saying AlternativeTextInfo all the time. Would make the code easier to read. And if you take out the struct as I suggest, then you will have to do that anyway.

&gt;&gt; Source/WebCore/editing/AlternativeTextController.h:115
&gt;&gt; +        Variant&lt;NoDetails, AutocorrectionReplacement, AlternativeDictationContext&gt; details;
&gt; 
&gt; What would you think about std::optional&lt;Variant&lt;AutocorrectionReplacement, AlternativeDictationContext&gt;&gt; ?

This is a significant improvement.

Even more elegant would be to combine the type with the data in a single variant by using a separate struct for each type, but that is likely result in uglier code since there are so many types that have no data.

Either way, we should consider removing NoDetails. Without it, I believe this would default to a null string since AutoCorrectionReplacement is the first type in the variant. To me that seems completely safe. If we really felt we needed this to be optional, std::optional might be better. Not really sure.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1329867</commentid>
    <comment_count>4</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2017-07-17 20:50:11 -0700</bug_when>
    <thetext>(In reply to Chris Dumez from comment #2)
&gt; Comment on attachment 315752 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=315752&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/editing/AlternativeTextController.h:115
&gt; &gt; +        Variant&lt;NoDetails, AutocorrectionReplacement, AlternativeDictationContext&gt; details;
&gt; 
&gt; What would you think about std::optional&lt;Variant&lt;AutocorrectionReplacement,
&gt; AlternativeDictationContext&gt;&gt; ?

It is sufficient to use Variant&lt;AutocorrectionReplacement, AlternativeDictationContext&gt; and let AutocorrectionReplacement be default value initialized.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1329871</commentid>
    <comment_count>5</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2017-07-17 20:54:26 -0700</bug_when>
    <thetext>(In reply to Darin Adler from comment #3)
&gt; &gt; Source/WebCore/editing/AlternativeTextController.cpp:291
&gt; &gt; +        if (!m_alternativeTextInfo.rangeWithAlternative || !WTF::holds_alternative&lt;AlternativeTextInfo::AutocorrectionReplacement&gt;(m_alternativeTextInfo.details))
&gt; &gt; +            break;
&gt; 
&gt; The old code used an unconditional static_cast, and the corresponding idiom
&gt; is to just call WTF::get with no previous check. So there is no need to
&gt; write out the wordy holds_alternative call.

Will fix.

&gt; Except that I don’t understand why there is a chance that details could have been null. In the new code, I
&gt; believe that would be a null string and so require no special case. But we
&gt; should audit the code paths to make sure.
&gt; 

Making use of the null string is sufficient.

&gt; &gt; Source/WebCore/editing/AlternativeTextController.cpp:328
&gt; &gt; +        if (!m_alternativeTextInfo.rangeWithAlternative || !WTF::holds_alternative&lt;AlternativeTextInfo::AlternativeDictationContext&gt;(m_alternativeTextInfo.details))
&gt; &gt; +            return;
&gt; 
&gt; The old code used an unconditional static_cast, and the corresponding idiom
&gt; is to just call WTF::get with no previous check. So there is no need to
&gt; write out the wordy holds_alternative call.

Will fix.

&gt; Except that I don’t understand why there is a chance that details could have been null. In the new code, I
&gt; believe that would be a null string and so it would require the call to
&gt; holds_alternative. But we should audit the code paths to make sure this is
&gt; needed.
&gt; 

Making use of the null string is sufficient.

&gt; &gt; Source/WebCore/editing/AlternativeTextController.cpp:331
&gt; &gt; +        if (!dictationContext)
&gt; &gt;              return;
&gt; 
&gt; This is so strange. Why would we bother storing a dictation context of 0 in
&gt; the first place? I do see that the old code checks for this value, though,
&gt; so safer not to change it.
&gt; 
&gt; &gt; Source/WebCore/editing/AlternativeTextController.h:106
&gt; &gt; +    struct AlternativeTextInfo {
&gt; 
&gt; This use of a struct is quite peculiar. These should just all be separate
&gt; data members. There is nothing that binds them together as far as I can
&gt; tell. The code uses them each separately. Should be m_rangeWithAlternative,
&gt; m_isActive, m_type, m_originalText, m_details.
&gt; 

Will change to separate members and remove struct AlternativeTextInfo.

&gt; &gt; Source/WebCore/editing/AlternativeTextController.h:109
&gt; &gt; +        using AutocorrectionReplacement = String;
&gt; &gt; +        using AlternativeDictationContext = uint64_t;
&gt; &gt; +        struct NoDetails { };
&gt; 
&gt; Since this is already inside the AlternativeTextController class, I would
&gt; suggest putting these outside the struct so we can use them without saying
&gt; AlternativeTextInfo all the time. Would make the code easier to read. And if
&gt; you take out the struct as I suggest, then you will have to do that anyway.
&gt; 

Will do.

&gt; &gt;&gt; Source/WebCore/editing/AlternativeTextController.h:115
&gt; &gt;&gt; +        Variant&lt;NoDetails, AutocorrectionReplacement, AlternativeDictationContext&gt; details;
&gt; [...]
&gt; we should consider removing NoDetails. Without it, I believe
&gt; this would default to a null string since AutoCorrectionReplacement is the
&gt; first type in the variant. To me that seems completely safe. If we really
&gt; felt we needed this to be optional, std::optional might be better. Not
&gt; really sure.

Will do.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1330005</commentid>
    <comment_count>6</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2017-07-18 09:32:05 -0700</bug_when>
    <thetext>Committed r219613: &lt;http://trac.webkit.org/changeset/219613&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1330015</commentid>
    <comment_count>7</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2017-07-18 09:52:09 -0700</bug_when>
    <thetext>Commit additional changes I inadvertently didn&apos;t save in &lt;http://trac.webkit.org/changeset/219614&gt;.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>315752</attachid>
            <date>2017-07-17 19:47:32 -0700</date>
            <delta_ts>2017-07-17 20:15:31 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-174604-20170717194731.patch</filename>
            <type>text/plain</type>
            <size>12022</size>
            <attacher name="Daniel Bates">dbates</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjE5NTk3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggM2U3ODY5MGQxOTFiMmZm
ODk2MDliOGM4NGM0OTE5YWY3MDI1ZDRkMC4uZTZlZjZlOThlMTQ3YzMzMmI3YjdjNTUxMzQ3NjJk
N2U1MjRhMGJmZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDM0IEBACiAyMDE3LTA3LTE3ICBEYW5p
ZWwgQmF0ZXMgIDxkYWJhdGVzQGFwcGxlLmNvbT4KIAorICAgICAgICBDbGVhbnVwOiBVc2UgVmFy
aWFudCB0byByZXByZXNlbnQgYWx0ZXJuYXRpdmUgdGV4dCBpbmZvIGRldGFpbHMKKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE3NDYwNAorCisgICAgICAg
IFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFVzZSBWYXJpYW50IHRvIHNp
bXBsaWZ5IHRoZSBtZW1iZXIgZGV0YWlscyBvZiB0aGUgQWx0ZXJuYXRpdmVUZXh0SW5mbyBkYXRh
IHN0cnVjdHVyZS4KKyAgICAgICAgQWxzbyBtYWtlIEFsdGVybmF0aXZlVGV4dEluZm8gYSBwcml2
YXRlIHN0cnVjdCBvZiBBbHRlcm5hdGl2ZVRleHRDb250cm9sbGVyIGFuZCBndWFyZAorICAgICAg
ICBpdCBiZWhpbmQgVVNFKEFVVE9DT1JSRUNUSU9OX1BBTkVMKSBhcyBpdCBpcyBhbiBpbXBsZW1l
bnRhdGlvbiBkZXRhaWwgb2YgdGhlIFVTRShBVVRPQ09SUkVDVElPTl9QQU5FTCkKKyAgICAgICAg
dmFyaWFudCBvZiBBbHRlcm5hdGl2ZVRleHRDb250cm9sbGVyLgorCisgICAgICAgIE5vdCBmdW5j
dGlvbmFsaXR5IGNoYW5nZWQuIFNvLCBubyBuZXcgdGVzdHMuCisKKyAgICAgICAgKiBlZGl0aW5n
L0FsdGVybmF0aXZlVGV4dENvbnRyb2xsZXIuY3BwOiBSZW1vdmUgaGVhZGVyIEV2ZW50LmggYXMg
aXQgaXMgdWx0aW1hdGVseSBpbmNsdWRlZCBieSBUZXh0RXZlbnQuaC4KKyAgICAgICAgKFdlYkNv
cmU6OkFsdGVybmF0aXZlVGV4dENvbnRyb2xsZXI6OnNob3cpOiBVcGRhdGUgY29kZSBhcyBuZWVk
ZWQuCisgICAgICAgIChXZWJDb3JlOjpBbHRlcm5hdGl2ZVRleHRDb250cm9sbGVyOjp0aW1lckZp
cmVkKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpBbHRlcm5hdGl2ZVRleHRDb250cm9sbGVy
OjphbHRlcm5hdGl2ZVRleHRDbGllbnQpOiBTdWJzdGl0dXRlIG51bGxwdHIgZm9yIDAuCisgICAg
ICAgIChXZWJDb3JlOjpBbHRlcm5hdGl2ZVRleHRDb250cm9sbGVyOjpyZXNwb25kVG9NYXJrZXJB
dEVuZE9mV29yZCk6IFVwZGF0ZSBjb2RlIGFzIG5lZWRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkF1
dG9jb3JyZWN0aW9uQWx0ZXJuYXRpdmVEZXRhaWxzOjpjcmVhdGUpOiBEZWxldGVkLgorICAgICAg
ICAoV2ViQ29yZTo6QXV0b2NvcnJlY3Rpb25BbHRlcm5hdGl2ZURldGFpbHM6OnJlcGxhY2VtZW50
U3RyaW5nKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkF1dG9jb3JyZWN0aW9uQWx0ZXJu
YXRpdmVEZXRhaWxzOjpBdXRvY29ycmVjdGlvbkFsdGVybmF0aXZlRGV0YWlscyk6IERlbGV0ZWQu
CisgICAgICAgIChXZWJDb3JlOjpEaWN0YXRpb25BbHRlcm5hdGl2ZURldGFpbHM6OmNyZWF0ZSk6
IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpEaWN0YXRpb25BbHRlcm5hdGl2ZURldGFpbHM6
OmRpY3RhdGlvbkNvbnRleHQpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6RGljdGF0aW9u
QWx0ZXJuYXRpdmVEZXRhaWxzOjpEaWN0YXRpb25BbHRlcm5hdGl2ZURldGFpbHMpOiBEZWxldGVk
LgorICAgICAgICAqIGVkaXRpbmcvQWx0ZXJuYXRpdmVUZXh0Q29udHJvbGxlci5oOiBSZW1vdmUg
aGVhZGVyIFJhbmdlLmggYW5kIGZvcndhcmQgZGVjbGFyZSBSYW5nZS4gSW5jbHVkZSBoZWFkZXIK
KyAgICAgICAgUG9zaXRpb24uaCBhbmQgd3RmL1ZhcmlhbnQuaC4gU29ydCBmb3J3YXJkIGRlY2xh
cmF0aW9ucy4KKyAgICAgICAgKFdlYkNvcmU6OkFsdGVybmF0aXZlVGV4dERldGFpbHM6On5BbHRl
cm5hdGl2ZVRleHREZXRhaWxzKTogRGVsZXRlZC4KKworMjAxNy0wNy0xNyAgRGFuaWVsIEJhdGVz
ICA8ZGFiYXRlc0BhcHBsZS5jb20+CisKICAgICAgICAgQ2xlYW51cDogVXNlIE9wdGlvblNldCB0
byByZXByZXNlbnQgbWFya2VyIHR5cGVzCiAgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0xNzQ1OTQKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvZWRp
dGluZy9BbHRlcm5hdGl2ZVRleHRDb250cm9sbGVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2VkaXRp
bmcvQWx0ZXJuYXRpdmVUZXh0Q29udHJvbGxlci5jcHAKaW5kZXggODIxZWI4NWIyOWExMDdjNDVk
MDE4ZTVmYmYwY2Y3MGY5ODhiMGRmOS4uZDU3NGE5NDI1MzhmOTIzOTAxZmEzY2FlMGM5MjhhYWM3
OGFmZjRjZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvZWRpdGluZy9BbHRlcm5hdGl2ZVRl
eHRDb250cm9sbGVyLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0FsdGVybmF0aXZl
VGV4dENvbnRyb2xsZXIuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykg
MjAwNi0yMDE2IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAo
QykgMjAwNi0yMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdo
dCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykK
ICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKQEAgLTMyLDcgKzMyLDYgQEAKICNpbmNsdWRlICJFZGl0aW5nLmgi
CiAjaW5jbHVkZSAiRWRpdG9yLmgiCiAjaW5jbHVkZSAiRWxlbWVudC5oIgotI2luY2x1ZGUgIkV2
ZW50LmgiCiAjaW5jbHVkZSAiRmxvYXRRdWFkLmgiCiAjaW5jbHVkZSAiRnJhbWUuaCIKICNpbmNs
dWRlICJGcmFtZVZpZXcuaCIKQEAgLTQ4LDM5ICs0Nyw2IEBACiAKIG5hbWVzcGFjZSBXZWJDb3Jl
IHsKIAotY2xhc3MgQXV0b2NvcnJlY3Rpb25BbHRlcm5hdGl2ZURldGFpbHMgOiBwdWJsaWMgQWx0
ZXJuYXRpdmVUZXh0RGV0YWlscyB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFJlZjxBdXRvY29ycmVj
dGlvbkFsdGVybmF0aXZlRGV0YWlscz4gY3JlYXRlKGNvbnN0IFN0cmluZyYgcmVwbGFjZW1lbnRT
dHJpbmcpCi0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBBdXRvY29ycmVjdGlv
bkFsdGVybmF0aXZlRGV0YWlscyhyZXBsYWNlbWVudFN0cmluZykpOwotICAgIH0KLSAgICAKLSAg
ICBjb25zdCBTdHJpbmcmIHJlcGxhY2VtZW50U3RyaW5nKCkgY29uc3QgeyByZXR1cm4gbV9yZXBs
YWNlbWVudFN0cmluZzsgfQotcHJpdmF0ZToKLSAgICBBdXRvY29ycmVjdGlvbkFsdGVybmF0aXZl
RGV0YWlscyhjb25zdCBTdHJpbmcmIHJlcGxhY2VtZW50U3RyaW5nKQotICAgIDogbV9yZXBsYWNl
bWVudFN0cmluZyhyZXBsYWNlbWVudFN0cmluZykKLSAgICB7IH0KLSAgICAKLSAgICBTdHJpbmcg
bV9yZXBsYWNlbWVudFN0cmluZzsKLX07Ci0KLWNsYXNzIERpY3RhdGlvbkFsdGVybmF0aXZlRGV0
YWlscyA6IHB1YmxpYyBBbHRlcm5hdGl2ZVRleHREZXRhaWxzIHsKLXB1YmxpYzoKLSAgICBzdGF0
aWMgUmVmPERpY3RhdGlvbkFsdGVybmF0aXZlRGV0YWlscz4gY3JlYXRlKHVpbnQ2NF90IGRpY3Rh
dGlvbkNvbnRleHQpCi0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBEaWN0YXRp
b25BbHRlcm5hdGl2ZURldGFpbHMoZGljdGF0aW9uQ29udGV4dCkpOwotICAgIH0KLQotICAgIHVp
bnQ2NF90IGRpY3RhdGlvbkNvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2RpY3RhdGlvbkNvbnRl
eHQ7IH0KLQotcHJpdmF0ZToKLSAgICBEaWN0YXRpb25BbHRlcm5hdGl2ZURldGFpbHModWludDY0
X3QgZGljdGF0aW9uQ29udGV4dCkKLSAgICA6IG1fZGljdGF0aW9uQ29udGV4dChkaWN0YXRpb25D
b250ZXh0KQotICAgIHsgfQotCi0gICAgdWludDY0X3QgbV9kaWN0YXRpb25Db250ZXh0OwotfTsK
LQogI2lmIFVTRShBVVRPQ09SUkVDVElPTl9QQU5FTCkKIAogc3RhdGljIGlubGluZSBPcHRpb25T
ZXQ8RG9jdW1lbnRNYXJrZXI6Ok1hcmtlclR5cGU+IG1hcmtlclR5cGVzRm9yQXV0b2NvcnJlY3Rp
b24oKQpAQCAtMTg2LDEwICsxNTIsMTAgQEAgdm9pZCBBbHRlcm5hdGl2ZVRleHRDb250cm9sbGVy
OjpzaG93KFJhbmdlJiByYW5nZVRvUmVwbGFjZSwgY29uc3QgU3RyaW5nJiByZXBsYWMKICAgICAg
ICAgcmV0dXJuOwogICAgIG1fYWx0ZXJuYXRpdmVUZXh0SW5mby5vcmlnaW5hbFRleHQgPSBwbGFp
blRleHQoJnJhbmdlVG9SZXBsYWNlKTsKICAgICBtX2FsdGVybmF0aXZlVGV4dEluZm8ucmFuZ2VX
aXRoQWx0ZXJuYXRpdmUgPSAmcmFuZ2VUb1JlcGxhY2U7Ci0gICAgbV9hbHRlcm5hdGl2ZVRleHRJ
bmZvLmRldGFpbHMgPSBBdXRvY29ycmVjdGlvbkFsdGVybmF0aXZlRGV0YWlsczo6Y3JlYXRlKHJl
cGxhY2VtZW50KTsKKyAgICBtX2FsdGVybmF0aXZlVGV4dEluZm8uZGV0YWlscyA9IHJlcGxhY2Vt
ZW50OwogICAgIG1fYWx0ZXJuYXRpdmVUZXh0SW5mby5pc0FjdGl2ZSA9IHRydWU7CiAgICAgaWYg
KEFsdGVybmF0aXZlVGV4dENsaWVudCogY2xpZW50ID0gYWx0ZXJuYXRpdmVUZXh0Q2xpZW50KCkp
Ci0gICAgICAgIGNsaWVudC0+c2hvd0NvcnJlY3Rpb25BbHRlcm5hdGl2ZShtX2FsdGVybmF0aXZl
VGV4dEluZm8udHlwZSwgYm91bmRpbmdCb3gsIG1fYWx0ZXJuYXRpdmVUZXh0SW5mby5vcmlnaW5h
bFRleHQsIHJlcGxhY2VtZW50LCBWZWN0b3I8U3RyaW5nPigpKTsKKyAgICAgICAgY2xpZW50LT5z
aG93Q29ycmVjdGlvbkFsdGVybmF0aXZlKG1fYWx0ZXJuYXRpdmVUZXh0SW5mby50eXBlLCBib3Vu
ZGluZ0JveCwgbV9hbHRlcm5hdGl2ZVRleHRJbmZvLm9yaWdpbmFsVGV4dCwgcmVwbGFjZW1lbnQs
IHsgfSk7CiB9CiAKIHZvaWQgQWx0ZXJuYXRpdmVUZXh0Q29udHJvbGxlcjo6aGFuZGxlQ2FuY2Vs
T3BlcmF0aW9uKCkKQEAgLTMyMSwxNSArMjg3LDE3IEBAIHZvaWQgQWx0ZXJuYXRpdmVUZXh0Q29u
dHJvbGxlcjo6dGltZXJGaXJlZCgpCiAgICAgfQogICAgICAgICBicmVhazsKICAgICBjYXNlIEFs
dGVybmF0aXZlVGV4dFR5cGVSZXZlcnNpb246IHsKLSAgICAgICAgYXV0byogZGV0YWlscyA9IHN0
YXRpY19jYXN0PGNvbnN0IEF1dG9jb3JyZWN0aW9uQWx0ZXJuYXRpdmVEZXRhaWxzKj4obV9hbHRl
cm5hdGl2ZVRleHRJbmZvLmRldGFpbHMuZ2V0KCkpOwotICAgICAgICBpZiAoIW1fYWx0ZXJuYXRp
dmVUZXh0SW5mby5yYW5nZVdpdGhBbHRlcm5hdGl2ZSB8fCAhZGV0YWlscyB8fCBkZXRhaWxzLT5y
ZXBsYWNlbWVudFN0cmluZygpLmlzRW1wdHkoKSkKKyAgICAgICAgaWYgKCFtX2FsdGVybmF0aXZl
VGV4dEluZm8ucmFuZ2VXaXRoQWx0ZXJuYXRpdmUgfHwgIVdURjo6aG9sZHNfYWx0ZXJuYXRpdmU8
QWx0ZXJuYXRpdmVUZXh0SW5mbzo6QXV0b2NvcnJlY3Rpb25SZXBsYWNlbWVudD4obV9hbHRlcm5h
dGl2ZVRleHRJbmZvLmRldGFpbHMpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIFN0cmlu
ZyByZXBsYWNlbWVudFN0cmluZyA9IFdURjo6Z2V0PEFsdGVybmF0aXZlVGV4dEluZm86OkF1dG9j
b3JyZWN0aW9uUmVwbGFjZW1lbnQ+KG1fYWx0ZXJuYXRpdmVUZXh0SW5mby5kZXRhaWxzKTsKKyAg
ICAgICAgaWYgKHJlcGxhY2VtZW50U3RyaW5nLmlzRW1wdHkoKSkKICAgICAgICAgICAgIGJyZWFr
OwogICAgICAgICBtX2FsdGVybmF0aXZlVGV4dEluZm8uaXNBY3RpdmUgPSB0cnVlOwogICAgICAg
ICBtX2FsdGVybmF0aXZlVGV4dEluZm8ub3JpZ2luYWxUZXh0ID0gcGxhaW5UZXh0KG1fYWx0ZXJu
YXRpdmVUZXh0SW5mby5yYW5nZVdpdGhBbHRlcm5hdGl2ZS5nZXQoKSk7CiAgICAgICAgIEZsb2F0
UmVjdCBib3VuZGluZ0JveCA9IHJvb3RWaWV3UmVjdEZvclJhbmdlKG1fYWx0ZXJuYXRpdmVUZXh0
SW5mby5yYW5nZVdpdGhBbHRlcm5hdGl2ZS5nZXQoKSk7CiAgICAgICAgIGlmICghYm91bmRpbmdC
b3guaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBpZiAoQWx0ZXJuYXRpdmVUZXh0Q2xpZW50KiBj
bGllbnQgPSBhbHRlcm5hdGl2ZVRleHRDbGllbnQoKSkKLSAgICAgICAgICAgICAgICBjbGllbnQt
PnNob3dDb3JyZWN0aW9uQWx0ZXJuYXRpdmUobV9hbHRlcm5hdGl2ZVRleHRJbmZvLnR5cGUsIGJv
dW5kaW5nQm94LCBtX2FsdGVybmF0aXZlVGV4dEluZm8ub3JpZ2luYWxUZXh0LCBkZXRhaWxzLT5y
ZXBsYWNlbWVudFN0cmluZygpLCBWZWN0b3I8U3RyaW5nPigpKTsKKyAgICAgICAgICAgICAgICBj
bGllbnQtPnNob3dDb3JyZWN0aW9uQWx0ZXJuYXRpdmUobV9hbHRlcm5hdGl2ZVRleHRJbmZvLnR5
cGUsIGJvdW5kaW5nQm94LCBtX2FsdGVybmF0aXZlVGV4dEluZm8ub3JpZ2luYWxUZXh0LCByZXBs
YWNlbWVudFN0cmluZywgeyB9KTsKICAgICAgICAgfQogICAgIH0KICAgICAgICAgYnJlYWs7CkBA
IC0zNTYsMTUgKzMyNCwxNiBAQCB2b2lkIEFsdGVybmF0aXZlVGV4dENvbnRyb2xsZXI6OnRpbWVy
RmlyZWQoKQogICAgIGNhc2UgQWx0ZXJuYXRpdmVUZXh0VHlwZURpY3RhdGlvbkFsdGVybmF0aXZl
czoKICAgICB7CiAjaWYgVVNFKERJQ1RBVElPTl9BTFRFUk5BVElWRVMpCi0gICAgICAgIGNvbnN0
IFJhbmdlKiByYW5nZVdpdGhBbHRlcm5hdGl2ZSA9IG1fYWx0ZXJuYXRpdmVUZXh0SW5mby5yYW5n
ZVdpdGhBbHRlcm5hdGl2ZS5nZXQoKTsKLSAgICAgICAgY29uc3QgRGljdGF0aW9uQWx0ZXJuYXRp
dmVEZXRhaWxzKiBkZXRhaWxzID0gc3RhdGljX2Nhc3Q8Y29uc3QgRGljdGF0aW9uQWx0ZXJuYXRp
dmVEZXRhaWxzKj4obV9hbHRlcm5hdGl2ZVRleHRJbmZvLmRldGFpbHMuZ2V0KCkpOwotICAgICAg
ICBpZiAoIXJhbmdlV2l0aEFsdGVybmF0aXZlIHx8ICFkZXRhaWxzIHx8ICFkZXRhaWxzLT5kaWN0
YXRpb25Db250ZXh0KCkpCisgICAgICAgIGlmICghbV9hbHRlcm5hdGl2ZVRleHRJbmZvLnJhbmdl
V2l0aEFsdGVybmF0aXZlIHx8ICFXVEY6OmhvbGRzX2FsdGVybmF0aXZlPEFsdGVybmF0aXZlVGV4
dEluZm86OkFsdGVybmF0aXZlRGljdGF0aW9uQ29udGV4dD4obV9hbHRlcm5hdGl2ZVRleHRJbmZv
LmRldGFpbHMpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB1aW50NjRfdCBkaWN0YXRp
b25Db250ZXh0ID0gV1RGOjpnZXQ8QWx0ZXJuYXRpdmVUZXh0SW5mbzo6QWx0ZXJuYXRpdmVEaWN0
YXRpb25Db250ZXh0PihtX2FsdGVybmF0aXZlVGV4dEluZm8uZGV0YWlscyk7CisgICAgICAgIGlm
ICghZGljdGF0aW9uQ29udGV4dCkKICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgRmxvYXRS
ZWN0IGJvdW5kaW5nQm94ID0gcm9vdFZpZXdSZWN0Rm9yUmFuZ2UocmFuZ2VXaXRoQWx0ZXJuYXRp
dmUpOworICAgICAgICBGbG9hdFJlY3QgYm91bmRpbmdCb3ggPSByb290Vmlld1JlY3RGb3JSYW5n
ZShtX2FsdGVybmF0aXZlVGV4dEluZm8ucmFuZ2VXaXRoQWx0ZXJuYXRpdmUuZ2V0KCkpOwogICAg
ICAgICBtX2FsdGVybmF0aXZlVGV4dEluZm8uaXNBY3RpdmUgPSB0cnVlOwogICAgICAgICBpZiAo
IWJvdW5kaW5nQm94LmlzRW1wdHkoKSkgewogICAgICAgICAgICAgaWYgKEFsdGVybmF0aXZlVGV4
dENsaWVudCogY2xpZW50ID0gYWx0ZXJuYXRpdmVUZXh0Q2xpZW50KCkpCi0gICAgICAgICAgICAg
ICAgY2xpZW50LT5zaG93RGljdGF0aW9uQWx0ZXJuYXRpdmVVSShib3VuZGluZ0JveCwgZGV0YWls
cy0+ZGljdGF0aW9uQ29udGV4dCgpKTsKKyAgICAgICAgICAgICAgICBjbGllbnQtPnNob3dEaWN0
YXRpb25BbHRlcm5hdGl2ZVVJKGJvdW5kaW5nQm94LCBkaWN0YXRpb25Db250ZXh0KTsKICAgICAg
ICAgfQogI2VuZGlmCiAgICAgfQpAQCAtNDgyLDcgKzQ1MSw3IEBAIHZvaWQgQWx0ZXJuYXRpdmVU
ZXh0Q29udHJvbGxlcjo6cmVzcG9uZFRvVW5hcHBsaWVkRWRpdGluZyhFZGl0Q29tbWFuZENvbXBv
c2l0aW9uCiAKIEFsdGVybmF0aXZlVGV4dENsaWVudCogQWx0ZXJuYXRpdmVUZXh0Q29udHJvbGxl
cjo6YWx0ZXJuYXRpdmVUZXh0Q2xpZW50KCkKIHsKLSAgICByZXR1cm4gbV9mcmFtZS5wYWdlKCkg
PyBtX2ZyYW1lLnBhZ2UoKS0+YWx0ZXJuYXRpdmVUZXh0Q2xpZW50KCkgOiAwOworICAgIHJldHVy
biBtX2ZyYW1lLnBhZ2UoKSA/IG1fZnJhbWUucGFnZSgpLT5hbHRlcm5hdGl2ZVRleHRDbGllbnQo
KSA6IG51bGxwdHI7CiB9CiAKIEVkaXRvckNsaWVudCogQWx0ZXJuYXRpdmVUZXh0Q29udHJvbGxl
cjo6ZWRpdG9yQ2xpZW50KCkKQEAgLTYxNCwxMiArNTgzLDEyIEBAIGJvb2wgQWx0ZXJuYXRpdmVU
ZXh0Q29udHJvbGxlcjo6cmVzcG9uZFRvTWFya2VyQXRFbmRPZldvcmQoY29uc3QgRG9jdW1lbnRN
YXJrZXImCiAgICAgc3dpdGNoIChtYXJrZXIudHlwZSgpKSB7CiAgICAgY2FzZSBEb2N1bWVudE1h
cmtlcjo6U3BlbGxpbmc6CiAgICAgICAgIG1fYWx0ZXJuYXRpdmVUZXh0SW5mby5yYW5nZVdpdGhB
bHRlcm5hdGl2ZSA9IHdvcmRSYW5nZTsKLSAgICAgICAgbV9hbHRlcm5hdGl2ZVRleHRJbmZvLmRl
dGFpbHMgPSBBdXRvY29ycmVjdGlvbkFsdGVybmF0aXZlRGV0YWlsczo6Y3JlYXRlKGVtcHR5U3Ry
aW5nKCkpOworICAgICAgICBtX2FsdGVybmF0aXZlVGV4dEluZm8uZGV0YWlscyA9IGVtcHR5U3Ry
aW5nKCk7CiAgICAgICAgIHN0YXJ0QWx0ZXJuYXRpdmVUZXh0VUlUaW1lcihBbHRlcm5hdGl2ZVRl
eHRUeXBlU3BlbGxpbmdTdWdnZXN0aW9ucyk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgRG9j
dW1lbnRNYXJrZXI6OlJlcGxhY2VtZW50OgogICAgICAgICBtX2FsdGVybmF0aXZlVGV4dEluZm8u
cmFuZ2VXaXRoQWx0ZXJuYXRpdmUgPSB3b3JkUmFuZ2U7Ci0gICAgICAgIG1fYWx0ZXJuYXRpdmVU
ZXh0SW5mby5kZXRhaWxzID0gQXV0b2NvcnJlY3Rpb25BbHRlcm5hdGl2ZURldGFpbHM6OmNyZWF0
ZShtYXJrZXIuZGVzY3JpcHRpb24oKSk7CisgICAgICAgIG1fYWx0ZXJuYXRpdmVUZXh0SW5mby5k
ZXRhaWxzID0gbWFya2VyLmRlc2NyaXB0aW9uKCk7CiAgICAgICAgIHN0YXJ0QWx0ZXJuYXRpdmVU
ZXh0VUlUaW1lcihBbHRlcm5hdGl2ZVRleHRUeXBlUmV2ZXJzaW9uKTsKICAgICAgICAgYnJlYWs7
CiAgICAgY2FzZSBEb2N1bWVudE1hcmtlcjo6RGljdGF0aW9uQWx0ZXJuYXRpdmVzOiB7CkBAIC02
MjksNyArNTk4LDcgQEAgYm9vbCBBbHRlcm5hdGl2ZVRleHRDb250cm9sbGVyOjpyZXNwb25kVG9N
YXJrZXJBdEVuZE9mV29yZChjb25zdCBEb2N1bWVudE1hcmtlciYKICAgICAgICAgaWYgKGN1cnJl
bnRXb3JkICE9IG1hcmtlckRhdGEub3JpZ2luYWxUZXh0KQogICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwogICAgICAgICBtX2FsdGVybmF0aXZlVGV4dEluZm8ucmFuZ2VXaXRoQWx0ZXJuYXRpdmUg
PSB3b3JkUmFuZ2U7Ci0gICAgICAgIG1fYWx0ZXJuYXRpdmVUZXh0SW5mby5kZXRhaWxzID0gRGlj
dGF0aW9uQWx0ZXJuYXRpdmVEZXRhaWxzOjpjcmVhdGUobWFya2VyRGF0YS5jb250ZXh0KTsKKyAg
ICAgICAgbV9hbHRlcm5hdGl2ZVRleHRJbmZvLmRldGFpbHMgPSBtYXJrZXJEYXRhLmNvbnRleHQ7
CiAgICAgICAgIHN0YXJ0QWx0ZXJuYXRpdmVUZXh0VUlUaW1lcihBbHRlcm5hdGl2ZVRleHRUeXBl
RGljdGF0aW9uQWx0ZXJuYXRpdmVzKTsKICAgICB9CiAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvZWRpdGluZy9BbHRlcm5hdGl2ZVRleHRDb250cm9sbGVyLmggYi9T
b3VyY2UvV2ViQ29yZS9lZGl0aW5nL0FsdGVybmF0aXZlVGV4dENvbnRyb2xsZXIuaAppbmRleCA0
M2RiZTY4NzEwMDlkOWVlYmFmZWIzYmY4MmFhNjM0OTM3MzlmZmI5Li4yZmEyNmRmMjdhMTA1NmZj
MzZmZmMxYmNlZTlmNjM0OWYzNmFmNGFkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9lZGl0
aW5nL0FsdGVybmF0aXZlVGV4dENvbnRyb2xsZXIuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9lZGl0
aW5nL0FsdGVybmF0aXZlVGV4dENvbnRyb2xsZXIuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBD
b3B5cmlnaHQgKEMpIDIwMTAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29w
eXJpZ2h0IChDKSAyMDEwLTIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoK
ICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yNywzNyArMjcsMjYgQEAKIAogI2luY2x1
ZGUgIkFsdGVybmF0aXZlVGV4dENsaWVudC5oIgogI2luY2x1ZGUgIkRvY3VtZW50TWFya2VyLmgi
Ci0jaW5jbHVkZSAiUmFuZ2UuaCIKKyNpbmNsdWRlICJQb3NpdGlvbi5oIgogI2luY2x1ZGUgIlRp
bWVyLmgiCiAjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CisjaW5jbHVkZSA8d3RmL1Zhcmlh
bnQuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBjbGFzcyBDb21wb3NpdGVFZGl0Q29tbWFu
ZDsKLWNsYXNzIEVkaXRvckNsaWVudDsKIGNsYXNzIEVkaXRDb21tYW5kOwogY2xhc3MgRWRpdENv
bW1hbmRDb21wb3NpdGlvbjsKK2NsYXNzIEVkaXRvckNsaWVudDsKIGNsYXNzIEV2ZW50OwogY2xh
c3MgRnJhbWU7CitjbGFzcyBSYW5nZTsKIGNsYXNzIFRleHRDaGVja2VyQ2xpZW50OwogY2xhc3Mg
VmlzaWJsZVNlbGVjdGlvbjsKIAogc3RydWN0IERpY3RhdGlvbkFsdGVybmF0aXZlOwogc3RydWN0
IFRleHRDaGVja2luZ1Jlc3VsdDsKIAotY2xhc3MgQWx0ZXJuYXRpdmVUZXh0RGV0YWlscyA6IHB1
YmxpYyBSZWZDb3VudGVkPEFsdGVybmF0aXZlVGV4dERldGFpbHM+IHsKLXB1YmxpYzoKLSAgICB2
aXJ0dWFsIH5BbHRlcm5hdGl2ZVRleHREZXRhaWxzKCkgeyB9Ci19OwotCi1zdHJ1Y3QgQWx0ZXJu
YXRpdmVUZXh0SW5mbyB7Ci0gICAgUmVmUHRyPFJhbmdlPiByYW5nZVdpdGhBbHRlcm5hdGl2ZTsK
LSAgICBib29sIGlzQWN0aXZlOwotICAgIEFsdGVybmF0aXZlVGV4dFR5cGUgdHlwZTsKLSAgICBT
dHJpbmcgb3JpZ2luYWxUZXh0OwotICAgIFJlZlB0cjxBbHRlcm5hdGl2ZVRleHREZXRhaWxzPiBk
ZXRhaWxzOwotfTsKLQogI2lmIFVTRShBVVRPQ09SUkVDVElPTl9QQU5FTCkKIC8vIFRoZXNlIGJh
Y2tzbGFzaGVzIGFyZSBmb3IgbWFraW5nIHN0eWxlIGNoZWNrZXIgaGFwcHkuCiAjZGVmaW5lIFVO
TEVTU19FTkFCTEVEKGZ1bmN0aW9uQm9keSkgXApAQCAtMTE0LDYgKzEwMywxOCBAQCBwdWJsaWM6
CiAKIHByaXZhdGU6CiAjaWYgVVNFKEFVVE9DT1JSRUNUSU9OX1BBTkVMKQorICAgIHN0cnVjdCBB
bHRlcm5hdGl2ZVRleHRJbmZvIHsKKyAgICAgICAgdXNpbmcgQXV0b2NvcnJlY3Rpb25SZXBsYWNl
bWVudCA9IFN0cmluZzsKKyAgICAgICAgdXNpbmcgQWx0ZXJuYXRpdmVEaWN0YXRpb25Db250ZXh0
ID0gdWludDY0X3Q7CisgICAgICAgIHN0cnVjdCBOb0RldGFpbHMgeyB9OworCisgICAgICAgIFJl
ZlB0cjxSYW5nZT4gcmFuZ2VXaXRoQWx0ZXJuYXRpdmU7CisgICAgICAgIGJvb2wgaXNBY3RpdmU7
CisgICAgICAgIEFsdGVybmF0aXZlVGV4dFR5cGUgdHlwZTsKKyAgICAgICAgU3RyaW5nIG9yaWdp
bmFsVGV4dDsKKyAgICAgICAgVmFyaWFudDxOb0RldGFpbHMsIEF1dG9jb3JyZWN0aW9uUmVwbGFj
ZW1lbnQsIEFsdGVybmF0aXZlRGljdGF0aW9uQ29udGV4dD4gZGV0YWlsczsKKyAgICB9OworCiAg
ICAgU3RyaW5nIGRpc21pc3NTb29uKFJlYXNvbkZvckRpc21pc3NpbmdBbHRlcm5hdGl2ZVRleHQp
OwogICAgIHZvaWQgYXBwbHlBbHRlcm5hdGl2ZVRleHRUb1JhbmdlKGNvbnN0IFJhbmdlJiwgY29u
c3QgU3RyaW5nJiBhbHRlcm5hdGl2ZSwgQWx0ZXJuYXRpdmVUZXh0VHlwZSwgT3B0aW9uU2V0PERv
Y3VtZW50TWFya2VyOjpNYXJrZXJUeXBlPik7CiAgICAgdm9pZCB0aW1lckZpcmVkKCk7Cg==
</data>
<flag name="review"
          id="336528"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>