<?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>173230</bug_id>
          
          <creation_ts>2017-06-10 13:03:07 -0700</creation_ts>
          <short_desc>[WTF] Add RegisteredSymbolImpl</short_desc>
          <delta_ts>2017-06-11 07:39:58 -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>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Yusuke Suzuki">ysuzuki</reporter>
          <assigned_to name="Yusuke Suzuki">ysuzuki</assigned_to>
          <cc>benjamin</cc>
    
    <cc>buildbot</cc>
    
    <cc>cdumez</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>darin</cc>
    
    <cc>dbates</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>msaboff</cc>
    
    <cc>saam</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1317922</commentid>
    <comment_count>0</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2017-06-10 13:03:07 -0700</bug_when>
    <thetext>[WTF] Add RegisteredSymbolImpl</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1317923</commentid>
    <comment_count>1</comment_count>
      <attachid>312577</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2017-06-10 13:06:20 -0700</bug_when>
    <thetext>Created attachment 312577
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1317929</commentid>
    <comment_count>2</comment_count>
      <attachid>312577</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2017-06-10 14:53:54 -0700</bug_when>
    <thetext>Comment on attachment 312577
Patch

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

Nice.  r=me with some suggestions.

&gt; Source/WTF/ChangeLog:18
&gt; +        So many symbols are not registered in SymbolRegistry. However, now we always
&gt; +        allocate a pointer member to point SymbolRegistry = nullptr. Since SymbolImpl
&gt; +        is immutable, and it is not registered to SymbolRegistry after it is created,
&gt; +        this member is wasteful.
&gt; +
&gt; +        Instead, we add a new derived class RegisteredSymbolImpl. SymbolImpl has a
&gt; +        flag to indicate that it is registered to a SymbolRegistry. In SymbolRegistry,
&gt; +        we create a RegisteredSymbolImpl and set itself to this symbol. By doing so,
&gt; +
&gt; +        1. We do not set m_symbolRegistry after creating a Symbol. It is clean.
&gt; +        2. We reduce the size of SymbolImpl.

Some edits:

        Most symbols are not registered in SymbolRegistry. However, we currently always
        allocate a pointer member to point to a SymbolRegistry, and this pointer is always null.
        Since SymbolImpl is immutable, and it will never be registered with a SymbolRegistry
        after it is created. Hence, this member is wasteful.

        Instead, we add a new derived class RegisteredSymbolImpl, which will set a flag in
        SymbolImpl to indicate that it is registered with a SymbolRegistry. The only way to
        create a RegisteredSymbolImpl is via a factory method provided by the SymbolRegistry.
        The factory method will pass itself to the RegisteredSymbolImpl&apos;s constructor for
        initializing the RegisteredSymbolImpl&apos;s m_symbolRegistry field. By doing so,

        1. We do not need to set m_symbolRegistry after creating a Symbol. It is clean.
        2. We reduce the size of SymbolImpl.

&gt; Source/JavaScriptCore/runtime/SymbolConstructor.cpp:126
&gt; +    return JSValue::encode(jsString(exec, vm.symbolRegistry().keyForSymbol(static_cast&lt;RegisteredSymbolImpl&amp;&gt;(uid))));

Replace cast with *uid.asRegisteredSymbolImpl().  See below.

&gt; Source/WTF/wtf/text/StringImpl.cpp:117
&gt; -    if (isAtomic() &amp;&amp; length() &amp;&amp; !isSymbol())
&gt; +    if (isAtomic() &amp;&amp; length())
&gt;          AtomicStringImpl::remove(static_cast&lt;AtomicStringImpl*&gt;(this));
&gt;  
&gt;      if (isSymbol()) {

From grepping the code, I see that this was always the case i.e. symbols are never atomic strings.  Can you just add an ASSERT(isSymbol()) in this if statement just in case anyone breaks this?

You can even rewrite this as:
    if (isAtomic()) {
        ASSERT(!isSymbol());
        if (length())
            AtomicStringImpl::remove(static_cast&lt;AtomicStringImpl*&gt;(this));
    } else if (isSymbol()) {

... because we shouldn&apos;t have to do the isSymbol() check if isAtomic().

&gt; Source/WTF/wtf/text/StringImpl.cpp:121
&gt; +            symbolRegistry-&gt;remove(static_cast&lt;RegisteredSymbolImpl&amp;&gt;(symbol));

Replace cast with *symbol.asRegisteredSymbolImpl().  See below.

&gt; Source/WTF/wtf/text/SymbolImpl.cpp:51
&gt; -        return adoptRef(*new SymbolImpl(rep.m_data8, rep.length(), *ownerRep));
&gt; -    return adoptRef(*new SymbolImpl(rep.m_data16, rep.length(), *ownerRep));
&gt; +        return adoptRef(*new SymbolImpl(rep.m_data8, rep.length(), *ownerRep, 0));
&gt; +    return adoptRef(*new SymbolImpl(rep.m_data16, rep.length(), *ownerRep, 0));

I think using a default argument for flags (see below) is better than passing 0 here.  You can revert this change.

&gt; Source/WTF/wtf/text/SymbolImpl.h:37
&gt; +    static constexpr const unsigned s_flagIsNullSymbol = 0b01u;
&gt; +    static constexpr const unsigned s_flagIsRegistered = 0b10u;

I suggest defining a type for the flags to better document where it&apos;s used e.g.:
    typedef unsigned Flags;
    static constexpr const Flags s_flagDefault = 0;
    static constexpr const Flags s_flagIsNullSymbol = 0b01u;
    static constexpr const Flags s_flagIsRegistered = 0b10u;

&gt; Source/WTF/wtf/text/SymbolImpl.h:43
&gt; +    SymbolRegistry* symbolRegistry() const;

I suggest adding a method after this:

    RegisteredSymbolImpl* asRegisteredSymbolImpl()
    {
        ASSERT(isRegistered());
        return static_cast&lt;RegisteredSymbolImpl*&gt;(this);
    }

This way, you can do away with all the casts, and each time we cast, it asserts to make sure that it is safe to do so.

&gt; Source/WTF/wtf/text/SymbolImpl.h:61
&gt; +    SymbolImpl(const LChar* characters, unsigned length, Ref&lt;StringImpl&gt;&amp;&amp; base, unsigned flags)

I suggest changing this to:
    SymbolImpl(const LChar* characters, unsigned length, Ref&lt;StringImpl&gt;&amp;&amp; base, Flags flags = s_flagDefault)

&gt; Source/WTF/wtf/text/SymbolImpl.h:70
&gt; +    SymbolImpl(const UChar* characters, unsigned length, Ref&lt;StringImpl&gt;&amp;&amp; base, unsigned flags)

I suggest changing this to:
    SymbolImpl(const UChar* characters, unsigned length, Ref&lt;StringImpl&gt;&amp;&amp; base, Flags flags = s_flagDefault)

&gt; Source/WTF/wtf/text/SymbolImpl.h:92
&gt;      unsigned m_flags { 0 };

Change to:
    Flags m_flags { s_flagDefault };

&gt; Source/WTF/wtf/text/SymbolRegistry.cpp:34
&gt; +        static_cast&lt;RegisteredSymbolImpl&amp;&gt;(*key.impl()).clearSymbolRegistry();

Replace with:
    key.impl().asRegisteredSymbolImpl()-&gt;clearSymbolRegistry();

&gt; Source/WTF/wtf/text/SymbolRegistry.cpp:41
&gt; +        return *static_cast&lt;RegisteredSymbolImpl*&gt;(addResult.iterator-&gt;impl());

Replace with:
    return *addResult.iterator-&gt;impl()-&gt;asRegisteredSymbolImpl();</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1317930</commentid>
    <comment_count>3</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2017-06-10 14:58:33 -0700</bug_when>
    <thetext>(In reply to Mark Lam from comment #2)
&gt; Some edits:
&gt; 
&gt;         Most symbols are not registered in SymbolRegistry. However, we
&gt; currently always
&gt;         allocate a pointer member to point to a SymbolRegistry, and this
&gt; pointer is always null.
&gt;         Since SymbolImpl is immutable, and it will never be registered with
&gt; a SymbolRegistry
&gt;         after it is created. Hence, this member is wasteful.
&gt; 
&gt;         Instead, we add a new derived class RegisteredSymbolImpl, which will
&gt; set a flag in
&gt;         SymbolImpl to indicate that it is registered with a SymbolRegistry.
&gt; The only way to
&gt;         create a RegisteredSymbolImpl is via a factory method provided by
&gt; the SymbolRegistry.
&gt;         The factory method will pass itself to the RegisteredSymbolImpl&apos;s
&gt; constructor for
&gt;         initializing the RegisteredSymbolImpl&apos;s m_symbolRegistry field. By
&gt; doing so,
&gt; 
&gt;         1. We do not need to set m_symbolRegistry after creating a Symbol.
&gt; It is clean.
&gt;         2. We reduce the size of SymbolImpl.
&gt; 

Argg ... my edit needs some editing:

        Most symbols are not registered in SymbolRegistry. However, we currently always
        allocate a pointer member to point to a SymbolRegistry, and this pointer is always null.
        SymbolImpl is immutable, and it will never be registered with a SymbolRegistry
        after it is created. Hence, this member is wasteful.

        Instead, we add a new derived class RegisteredSymbolImpl, which will set a flag in
        SymbolImpl to indicate that it is registered with a SymbolRegistry. The only way to
        create a RegisteredSymbolImpl is via a factory method provided by the SymbolRegistry.
        The factory method will pass the SymbolRegistry this pointer to the RegisteredSymbolImpl&apos;s
        constructor for initializing the RegisteredSymbolImpl&apos;s m_symbolRegistry field.
        By doing so,

        1. We do not need to set m_symbolRegistry after creating a Symbol. It is clean.
        2. We reduce the size of SymbolImpls that do not need to be registered.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1317977</commentid>
    <comment_count>4</comment_count>
      <attachid>312577</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2017-06-11 01:19:32 -0700</bug_when>
    <thetext>Comment on attachment 312577
Patch

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

Thank you.

&gt;&gt; Source/JavaScriptCore/runtime/SymbolConstructor.cpp:126
&gt;&gt; +    return JSValue::encode(jsString(exec, vm.symbolRegistry().keyForSymbol(static_cast&lt;RegisteredSymbolImpl&amp;&gt;(uid))));
&gt; 
&gt; Replace cast with *uid.asRegisteredSymbolImpl().  See below.

Fixed.

&gt;&gt; Source/WTF/wtf/text/StringImpl.cpp:117
&gt;&gt;      if (isSymbol()) {
&gt; 
&gt; From grepping the code, I see that this was always the case i.e. symbols are never atomic strings.  Can you just add an ASSERT(isSymbol()) in this if statement just in case anyone breaks this?
&gt; 
&gt; You can even rewrite this as:
&gt;     if (isAtomic()) {
&gt;         ASSERT(!isSymbol());
&gt;         if (length())
&gt;             AtomicStringImpl::remove(static_cast&lt;AtomicStringImpl*&gt;(this));
&gt;     } else if (isSymbol()) {
&gt; 
&gt; ... because we shouldn&apos;t have to do the isSymbol() check if isAtomic().

Yup. Changed.

&gt;&gt; Source/WTF/wtf/text/StringImpl.cpp:121
&gt;&gt; +            symbolRegistry-&gt;remove(static_cast&lt;RegisteredSymbolImpl&amp;&gt;(symbol));
&gt; 
&gt; Replace cast with *symbol.asRegisteredSymbolImpl().  See below.

Changed.

&gt;&gt; Source/WTF/wtf/text/SymbolImpl.cpp:51
&gt;&gt; +    return adoptRef(*new SymbolImpl(rep.m_data16, rep.length(), *ownerRep, 0));
&gt; 
&gt; I think using a default argument for flags (see below) is better than passing 0 here.  You can revert this change.

OK, dropped.

&gt;&gt; Source/WTF/wtf/text/SymbolImpl.h:37
&gt;&gt; +    static constexpr const unsigned s_flagIsRegistered = 0b10u;
&gt; 
&gt; I suggest defining a type for the flags to better document where it&apos;s used e.g.:
&gt;     typedef unsigned Flags;
&gt;     static constexpr const Flags s_flagDefault = 0;
&gt;     static constexpr const Flags s_flagIsNullSymbol = 0b01u;
&gt;     static constexpr const Flags s_flagIsRegistered = 0b10u;

Sounds fine. Fixed.

&gt;&gt; Source/WTF/wtf/text/SymbolImpl.h:43
&gt;&gt; +    SymbolRegistry* symbolRegistry() const;
&gt; 
&gt; I suggest adding a method after this:
&gt; 
&gt;     RegisteredSymbolImpl* asRegisteredSymbolImpl()
&gt;     {
&gt;         ASSERT(isRegistered());
&gt;         return static_cast&lt;RegisteredSymbolImpl*&gt;(this);
&gt;     }
&gt; 
&gt; This way, you can do away with all the casts, and each time we cast, it asserts to make sure that it is safe to do so.

Sounds nice.

&gt;&gt; Source/WTF/wtf/text/SymbolImpl.h:61
&gt;&gt; +    SymbolImpl(const LChar* characters, unsigned length, Ref&lt;StringImpl&gt;&amp;&amp; base, unsigned flags)
&gt; 
&gt; I suggest changing this to:
&gt;     SymbolImpl(const LChar* characters, unsigned length, Ref&lt;StringImpl&gt;&amp;&amp; base, Flags flags = s_flagDefault)

Changed.

&gt;&gt; Source/WTF/wtf/text/SymbolImpl.h:70
&gt;&gt; +    SymbolImpl(const UChar* characters, unsigned length, Ref&lt;StringImpl&gt;&amp;&amp; base, unsigned flags)
&gt; 
&gt; I suggest changing this to:
&gt;     SymbolImpl(const UChar* characters, unsigned length, Ref&lt;StringImpl&gt;&amp;&amp; base, Flags flags = s_flagDefault)

Changed.

&gt;&gt; Source/WTF/wtf/text/SymbolImpl.h:92
&gt;&gt;      unsigned m_flags { 0 };
&gt; 
&gt; Change to:
&gt;     Flags m_flags { s_flagDefault };

Fixed.

&gt;&gt; Source/WTF/wtf/text/SymbolRegistry.cpp:34
&gt;&gt; +        static_cast&lt;RegisteredSymbolImpl&amp;&gt;(*key.impl()).clearSymbolRegistry();
&gt; 
&gt; Replace with:
&gt;     key.impl().asRegisteredSymbolImpl()-&gt;clearSymbolRegistry();

Fixed. But since key.impl() is StringImpl*, we need static_cast&lt;SymbolImpl*&gt;() anyway.

&gt;&gt; Source/WTF/wtf/text/SymbolRegistry.cpp:41
&gt;&gt; +        return *static_cast&lt;RegisteredSymbolImpl*&gt;(addResult.iterator-&gt;impl());
&gt; 
&gt; Replace with:
&gt;     return *addResult.iterator-&gt;impl()-&gt;asRegisteredSymbolImpl();

Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1317981</commentid>
    <comment_count>5</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2017-06-11 01:33:46 -0700</bug_when>
    <thetext>Committed r218066: &lt;http://trac.webkit.org/changeset/218066&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1317989</commentid>
    <comment_count>6</comment_count>
      <attachid>312577</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2017-06-11 07:26:40 -0700</bug_when>
    <thetext>Comment on attachment 312577
Patch

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

&gt;&gt;&gt; Source/WTF/wtf/text/SymbolRegistry.cpp:34
&gt;&gt;&gt; +        static_cast&lt;RegisteredSymbolImpl&amp;&gt;(*key.impl()).clearSymbolRegistry();
&gt;&gt; 
&gt;&gt; Replace with:
&gt;&gt;     key.impl().asRegisteredSymbolImpl()-&gt;clearSymbolRegistry();
&gt; 
&gt; Fixed. But since key.impl() is StringImpl*, we need static_cast&lt;SymbolImpl*&gt;() anyway.

Sorry for my mistake, but you can still avoid the cast like so:
     key.impl()-&gt;asRegisteredSymbolImpl()-&gt;clearSymbolRegistry();</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1317990</commentid>
    <comment_count>7</comment_count>
      <attachid>312577</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2017-06-11 07:39:58 -0700</bug_when>
    <thetext>Comment on attachment 312577
Patch

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

&gt;&gt;&gt;&gt; Source/WTF/wtf/text/SymbolRegistry.cpp:34
&gt;&gt;&gt;&gt; +        static_cast&lt;RegisteredSymbolImpl&amp;&gt;(*key.impl()).clearSymbolRegistry();
&gt;&gt;&gt; 
&gt;&gt;&gt; Replace with:
&gt;&gt;&gt;     key.impl().asRegisteredSymbolImpl()-&gt;clearSymbolRegistry();
&gt;&gt; 
&gt;&gt; Fixed. But since key.impl() is StringImpl*, we need static_cast&lt;SymbolImpl*&gt;() anyway.
&gt; 
&gt; Sorry for my mistake, but you can still avoid the cast like so:
&gt;      key.impl()-&gt;asRegisteredSymbolImpl()-&gt;clearSymbolRegistry();

Oh, nevermind.  I see what you meant: key.impl() returns a StringImpl*, not a SymbolImpl*.  Hence, sadly, we needed a cast anyway.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>312577</attachid>
            <date>2017-06-10 13:06:20 -0700</date>
            <delta_ts>2017-06-10 14:53:54 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-173230-20170611050619.patch</filename>
            <type>text/plain</type>
            <size>13367</size>
            <attacher name="Yusuke Suzuki">ysuzuki</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjE4MDUzCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCA1
ZWRmNzE0Y2U4MWFiMDQ0NjkyYmE1ZTNkNmEyYWQ3MWEwNzkwZjEwLi5kNzEyODA2NWE1ZGQxOGMz
M2U4Y2MzYmZhMmYyNDAxMjJhNzY1NWNkIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
NSArMSwxNSBAQAogMjAxNy0wNi0xMCAgWXVzdWtlIFN1enVraSAgPHV0YXRhbmUudGVhQGdtYWls
LmNvbT4KIAorICAgICAgICBbV1RGXSBBZGQgUmVnaXN0ZXJlZFN5bWJvbEltcGwKKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE3MzIzMAorCisgICAgICAg
IFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogcnVudGltZS9TeW1ib2xD
b25zdHJ1Y3Rvci5jcHA6CisgICAgICAgIChKU0M6OnN5bWJvbENvbnN0cnVjdG9yS2V5Rm9yKToK
KworMjAxNy0wNi0xMCAgWXVzdWtlIFN1enVraSAgPHV0YXRhbmUudGVhQGdtYWlsLmNvbT4KKwog
ICAgICAgICBbSlNDXSBVcGRhdGUgUmVnRXhwLnByb3RvdHlwZS5bQEBzZWFyY2hdXSBpbXBsZW1l
bnRhdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGxhdGVzdCBzcGVjCiAgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzMyMjcKIApkaWZmIC0tZ2l0IGEvU291cmNl
L1dURi9DaGFuZ2VMb2cgYi9Tb3VyY2UvV1RGL0NoYW5nZUxvZwppbmRleCBkZDAxN2Q0NjIzYjMw
NTY1N2FlMjZjZmMyMjViN2E5YTIwOWQzMmRlLi5hODNlYmFjODkwOGQ3M2RjMDMwYjlmNGJjMzE5
NzY2YWNmNGE2ODIzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV1RGL0NoYW5nZUxvZworKysgYi9Tb3Vy
Y2UvV1RGL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQzIEBACisyMDE3LTA2LTEwICBZdXN1a2UgU3V6
dWtpICA8dXRhdGFuZS50ZWFAZ21haWwuY29tPgorCisgICAgICAgIFtXVEZdIEFkZCBSZWdpc3Rl
cmVkU3ltYm9sSW1wbAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTczMjMwCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgU28gbWFueSBzeW1ib2xzIGFyZSBub3QgcmVnaXN0ZXJlZCBpbiBTeW1ib2xSZWdpc3Ry
eS4gSG93ZXZlciwgbm93IHdlIGFsd2F5cworICAgICAgICBhbGxvY2F0ZSBhIHBvaW50ZXIgbWVt
YmVyIHRvIHBvaW50IFN5bWJvbFJlZ2lzdHJ5ID0gbnVsbHB0ci4gU2luY2UgU3ltYm9sSW1wbAor
ICAgICAgICBpcyBpbW11dGFibGUsIGFuZCBpdCBpcyBub3QgcmVnaXN0ZXJlZCB0byBTeW1ib2xS
ZWdpc3RyeSBhZnRlciBpdCBpcyBjcmVhdGVkLAorICAgICAgICB0aGlzIG1lbWJlciBpcyB3YXN0
ZWZ1bC4KKworICAgICAgICBJbnN0ZWFkLCB3ZSBhZGQgYSBuZXcgZGVyaXZlZCBjbGFzcyBSZWdp
c3RlcmVkU3ltYm9sSW1wbC4gU3ltYm9sSW1wbCBoYXMgYQorICAgICAgICBmbGFnIHRvIGluZGlj
YXRlIHRoYXQgaXQgaXMgcmVnaXN0ZXJlZCB0byBhIFN5bWJvbFJlZ2lzdHJ5LiBJbiBTeW1ib2xS
ZWdpc3RyeSwKKyAgICAgICAgd2UgY3JlYXRlIGEgUmVnaXN0ZXJlZFN5bWJvbEltcGwgYW5kIHNl
dCBpdHNlbGYgdG8gdGhpcyBzeW1ib2wuIEJ5IGRvaW5nIHNvLAorCisgICAgICAgIDEuIFdlIGRv
IG5vdCBzZXQgbV9zeW1ib2xSZWdpc3RyeSBhZnRlciBjcmVhdGluZyBhIFN5bWJvbC4gSXQgaXMg
Y2xlYW4uCisgICAgICAgIDIuIFdlIHJlZHVjZSB0aGUgc2l6ZSBvZiBTeW1ib2xJbXBsLgorCisg
ICAgICAgICogd3RmL3RleHQvU3RyaW5nSW1wbC5jcHA6CisgICAgICAgIChXVEY6OlN0cmluZ0lt
cGw6On5TdHJpbmdJbXBsKToKKyAgICAgICAgKiB3dGYvdGV4dC9TdHJpbmdJbXBsLmg6CisgICAg
ICAgICogd3RmL3RleHQvU3ltYm9sSW1wbC5jcHA6CisgICAgICAgIChXVEY6OlN5bWJvbEltcGw6
OmNyZWF0ZSk6CisgICAgICAgIChXVEY6OlJlZ2lzdGVyZWRTeW1ib2xJbXBsOjpjcmVhdGUpOgor
ICAgICAgICAqIHd0Zi90ZXh0L1N5bWJvbEltcGwuaDoKKyAgICAgICAgKFdURjo6U3ltYm9sSW1w
bDo6aGFzaEZvclN5bWJvbCk6CisgICAgICAgIChXVEY6OlN5bWJvbEltcGw6OmlzUmVnaXN0ZXJl
ZCk6CisgICAgICAgIChXVEY6OlN5bWJvbEltcGw6OlN5bWJvbEltcGwpOgorICAgICAgICAoV1RG
OjpSZWdpc3RlcmVkU3ltYm9sSW1wbDo6c3ltYm9sUmVnaXN0cnkpOgorICAgICAgICAoV1RGOjpS
ZWdpc3RlcmVkU3ltYm9sSW1wbDo6Y2xlYXJTeW1ib2xSZWdpc3RyeSk6CisgICAgICAgIChXVEY6
OlJlZ2lzdGVyZWRTeW1ib2xJbXBsOjpSZWdpc3RlcmVkU3ltYm9sSW1wbCk6CisgICAgICAgIChX
VEY6OlN5bWJvbEltcGw6OnN5bWJvbFJlZ2lzdHJ5KToKKyAgICAgICAgKiB3dGYvdGV4dC9TeW1i
b2xSZWdpc3RyeS5jcHA6CisgICAgICAgIChXVEY6OlN5bWJvbFJlZ2lzdHJ5Ojp+U3ltYm9sUmVn
aXN0cnkpOgorICAgICAgICAoV1RGOjpTeW1ib2xSZWdpc3RyeTo6c3ltYm9sRm9yS2V5KToKKyAg
ICAgICAgKFdURjo6U3ltYm9sUmVnaXN0cnk6OmtleUZvclN5bWJvbCk6CisgICAgICAgIChXVEY6
OlN5bWJvbFJlZ2lzdHJ5OjpyZW1vdmUpOgorICAgICAgICAqIHd0Zi90ZXh0L1N5bWJvbFJlZ2lz
dHJ5Lmg6CisKIDIwMTctMDYtMDkgIENocmlzIER1bWV6ICA8Y2R1bWV6QGFwcGxlLmNvbT4KIAog
ICAgICAgICBVcGRhdGUgVGhyZWFkOjpjcmVhdGUoKSB0byB0YWtlIGluIGEgV1RGOjpGdW5jdGlv
biBpbnN0ZWFkIG9mIGEgc3RkOjpmdW5jdGlvbgpkaWZmIC0tZ2l0IGEvU291cmNlL0phdmFTY3Jp
cHRDb3JlL3J1bnRpbWUvU3ltYm9sQ29uc3RydWN0b3IuY3BwIGIvU291cmNlL0phdmFTY3JpcHRD
b3JlL3J1bnRpbWUvU3ltYm9sQ29uc3RydWN0b3IuY3BwCmluZGV4IDhmNTc4NzE4N2RmN2MwOTQ3
ODE3MTZkZDExZmU1NjIwYjUwZDgyNGUuLmJiMTkzMTBhN2FmNGU4MjJkYTVlZmI3ZTc0YjgwNGRm
MzA4NmE4NWEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1N5bWJv
bENvbnN0cnVjdG9yLmNwcAorKysgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9TeW1i
b2xDb25zdHJ1Y3Rvci5jcHAKQEAgLTEyMyw3ICsxMjMsNyBAQCBFbmNvZGVkSlNWYWx1ZSBKU0Nf
SE9TVF9DQUxMIHN5bWJvbENvbnN0cnVjdG9yS2V5Rm9yKEV4ZWNTdGF0ZSogZXhlYykKICAgICAg
ICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKIAogICAgIEFTU0VSVCh1
aWQuc3ltYm9sUmVnaXN0cnkoKSA9PSAmdm0uc3ltYm9sUmVnaXN0cnkoKSk7Ci0gICAgcmV0dXJu
IEpTVmFsdWU6OmVuY29kZShqc1N0cmluZyhleGVjLCB2bS5zeW1ib2xSZWdpc3RyeSgpLmtleUZv
clN5bWJvbCh1aWQpKSk7CisgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1N0cmluZyhleGVj
LCB2bS5zeW1ib2xSZWdpc3RyeSgpLmtleUZvclN5bWJvbChzdGF0aWNfY2FzdDxSZWdpc3RlcmVk
U3ltYm9sSW1wbCY+KHVpZCkpKSk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIEpTQwpkaWZmIC0tZ2l0
IGEvU291cmNlL1dURi93dGYvdGV4dC9TdHJpbmdJbXBsLmNwcCBiL1NvdXJjZS9XVEYvd3RmL3Rl
eHQvU3RyaW5nSW1wbC5jcHAKaW5kZXggZWU2NmRhZjI1YzkyMWM4NjM5N2U4NjY4NGIzMjZjZTg4
MzEyYWRhMC4uNjVjZDg5NWMwOGExMjk3N2NlMDEzZTBiZTYzYjVlYWUyMDA2YjU4MCAxMDA2NDQK
LS0tIGEvU291cmNlL1dURi93dGYvdGV4dC9TdHJpbmdJbXBsLmNwcAorKysgYi9Tb3VyY2UvV1RG
L3d0Zi90ZXh0L1N0cmluZ0ltcGwuY3BwCkBAIC0xMTEsMTQgKzExMSwxNCBAQCBTdHJpbmdJbXBs
Ojp+U3RyaW5nSW1wbCgpCiAKICAgICBTVFJJTkdfU1RBVFNfUkVNT1ZFX1NUUklORygqdGhpcyk7
CiAKLSAgICBpZiAoaXNBdG9taWMoKSAmJiBsZW5ndGgoKSAmJiAhaXNTeW1ib2woKSkKKyAgICBp
ZiAoaXNBdG9taWMoKSAmJiBsZW5ndGgoKSkKICAgICAgICAgQXRvbWljU3RyaW5nSW1wbDo6cmVt
b3ZlKHN0YXRpY19jYXN0PEF0b21pY1N0cmluZ0ltcGwqPih0aGlzKSk7CiAKICAgICBpZiAoaXNT
eW1ib2woKSkgewogICAgICAgICBhdXRvJiBzeW1ib2wgPSBzdGF0aWNfY2FzdDxTeW1ib2xJbXBs
Jj4oKnRoaXMpOwogICAgICAgICBhdXRvKiBzeW1ib2xSZWdpc3RyeSA9IHN5bWJvbC5zeW1ib2xS
ZWdpc3RyeSgpOwogICAgICAgICBpZiAoc3ltYm9sUmVnaXN0cnkpCi0gICAgICAgICAgICBzeW1i
b2xSZWdpc3RyeS0+cmVtb3ZlKHN5bWJvbCk7CisgICAgICAgICAgICBzeW1ib2xSZWdpc3RyeS0+
cmVtb3ZlKHN0YXRpY19jYXN0PFJlZ2lzdGVyZWRTeW1ib2xJbXBsJj4oc3ltYm9sKSk7CiAgICAg
fQogCiAgICAgQnVmZmVyT3duZXJzaGlwIG93bmVyc2hpcCA9IGJ1ZmZlck93bmVyc2hpcCgpOwpk
aWZmIC0tZ2l0IGEvU291cmNlL1dURi93dGYvdGV4dC9TdHJpbmdJbXBsLmggYi9Tb3VyY2UvV1RG
L3d0Zi90ZXh0L1N0cmluZ0ltcGwuaAppbmRleCA1YmVjMjRhZmU0OGM3ZDYzMTA5NmQ3YmU3MDFh
ODI1YzU0MDdiZDdmLi4xZDFhMjU0M2FmZTYzM2ZlYmU2MTBkZjk5YjExNmEzMzY3YmVhNjA1IDEw
MDY0NAotLS0gYS9Tb3VyY2UvV1RGL3d0Zi90ZXh0L1N0cmluZ0ltcGwuaAorKysgYi9Tb3VyY2Uv
V1RGL3d0Zi90ZXh0L1N0cmluZ0ltcGwuaApAQCAtMTg5LDYgKzE4OSw3IEBAIGNsYXNzIFN0cmlu
Z0ltcGwgOiBwcml2YXRlIFN0cmluZ0ltcGxTaGFwZSB7CiAgICAgZnJpZW5kIGNsYXNzIEpTQzo6
TExJbnQ6OkRhdGE7CiAgICAgZnJpZW5kIGNsYXNzIEpTQzo6TExJbnRPZmZzZXRzRXh0cmFjdG9y
OwogICAgIGZyaWVuZCBjbGFzcyBTeW1ib2xJbXBsOworICAgIGZyaWVuZCBjbGFzcyBSZWdpc3Rl
cmVkU3ltYm9sSW1wbDsKICAgICAKIHByaXZhdGU6CiAgICAgZW51bSBCdWZmZXJPd25lcnNoaXAg
ewpkaWZmIC0tZ2l0IGEvU291cmNlL1dURi93dGYvdGV4dC9TeW1ib2xJbXBsLmNwcCBiL1NvdXJj
ZS9XVEYvd3RmL3RleHQvU3ltYm9sSW1wbC5jcHAKaW5kZXggMThlYmVhOWUwMGYzMmU0MTVhOTUy
MGJkMWQwODYzOTYyM2FjMTU3ZS4uMzM0OTY0ZGIyYjA5NjMxMjc3MzU0YTlkYTdhN2UwYjcyZDY2
YTYwZiAxMDA2NDQKLS0tIGEvU291cmNlL1dURi93dGYvdGV4dC9TeW1ib2xJbXBsLmNwcAorKysg
Yi9Tb3VyY2UvV1RGL3d0Zi90ZXh0L1N5bWJvbEltcGwuY3BwCkBAIC00Nyw4ICs0Nyw4IEBAIFJl
ZjxTeW1ib2xJbXBsPiBTeW1ib2xJbXBsOjpjcmVhdGUoU3RyaW5nSW1wbCYgcmVwKQogICAgIGF1
dG8qIG93bmVyUmVwID0gKHJlcC5idWZmZXJPd25lcnNoaXAoKSA9PSBCdWZmZXJTdWJzdHJpbmcp
ID8gcmVwLnN1YnN0cmluZ0J1ZmZlcigpIDogJnJlcDsKICAgICBBU1NFUlQob3duZXJSZXAtPmJ1
ZmZlck93bmVyc2hpcCgpICE9IEJ1ZmZlclN1YnN0cmluZyk7CiAgICAgaWYgKHJlcC5pczhCaXQo
KSkKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgU3ltYm9sSW1wbChyZXAubV9kYXRhOCwg
cmVwLmxlbmd0aCgpLCAqb3duZXJSZXApKTsKLSAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBTeW1i
b2xJbXBsKHJlcC5tX2RhdGExNiwgcmVwLmxlbmd0aCgpLCAqb3duZXJSZXApKTsKKyAgICAgICAg
cmV0dXJuIGFkb3B0UmVmKCpuZXcgU3ltYm9sSW1wbChyZXAubV9kYXRhOCwgcmVwLmxlbmd0aCgp
LCAqb3duZXJSZXAsIDApKTsKKyAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBTeW1ib2xJbXBsKHJl
cC5tX2RhdGExNiwgcmVwLmxlbmd0aCgpLCAqb3duZXJSZXAsIDApKTsKIH0KIAogUmVmPFN5bWJv
bEltcGw+IFN5bWJvbEltcGw6OmNyZWF0ZU51bGxTeW1ib2woKQpAQCAtNTYsNCArNTYsMTMgQEAg
UmVmPFN5bWJvbEltcGw+IFN5bWJvbEltcGw6OmNyZWF0ZU51bGxTeW1ib2woKQogICAgIHJldHVy
biBhZG9wdFJlZigqbmV3IFN5bWJvbEltcGwpOwogfQogCitSZWY8UmVnaXN0ZXJlZFN5bWJvbElt
cGw+IFJlZ2lzdGVyZWRTeW1ib2xJbXBsOjpjcmVhdGUoU3RyaW5nSW1wbCYgcmVwLCBTeW1ib2xS
ZWdpc3RyeSYgc3ltYm9sUmVnaXN0cnkpCit7CisgICAgYXV0byogb3duZXJSZXAgPSAocmVwLmJ1
ZmZlck93bmVyc2hpcCgpID09IEJ1ZmZlclN1YnN0cmluZykgPyByZXAuc3Vic3RyaW5nQnVmZmVy
KCkgOiAmcmVwOworICAgIEFTU0VSVChvd25lclJlcC0+YnVmZmVyT3duZXJzaGlwKCkgIT0gQnVm
ZmVyU3Vic3RyaW5nKTsKKyAgICBpZiAocmVwLmlzOEJpdCgpKQorICAgICAgICByZXR1cm4gYWRv
cHRSZWYoKm5ldyBSZWdpc3RlcmVkU3ltYm9sSW1wbChyZXAubV9kYXRhOCwgcmVwLmxlbmd0aCgp
LCAqb3duZXJSZXAsIHN5bWJvbFJlZ2lzdHJ5KSk7CisgICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcg
UmVnaXN0ZXJlZFN5bWJvbEltcGwocmVwLm1fZGF0YTE2LCByZXAubGVuZ3RoKCksICpvd25lclJl
cCwgc3ltYm9sUmVnaXN0cnkpKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgV1RGCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV1RGL3d0Zi90ZXh0L1N5bWJvbEltcGwuaCBiL1NvdXJjZS9XVEYvd3RmL3RleHQv
U3ltYm9sSW1wbC5oCmluZGV4IDI5M2RhMGE1OWNiM2VkZTNkMjg3MGQxNWNjMzUwY2NmZTA0OWEy
ZGMuLmZiMTY2YjJkMjdmZjM3ODc5ZTM0ODE4MmRlYjE2ZmI1NWFmYmVjODUgMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9XVEYvd3RmL3RleHQvU3ltYm9sSW1wbC5oCisrKyBiL1NvdXJjZS9XVEYvd3RmL3Rl
eHQvU3ltYm9sSW1wbC5oCkBAIC0zMiwxNCArMzIsMTUgQEAgbmFtZXNwYWNlIFdURiB7CiAvLyBT
eW1ib2xJbXBsIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBzeW1ib2wgc3RyaW5nIGltcGwuCiAv
LyBJdCBpcyB1bmlxdWVkIHN0cmluZyBpbXBsLCBidXQgaXMgbm90IHJlZ2lzdGVyZWQgaW4gQXRv
bWljIFN0cmluZyB0YWJsZXMsIHNvIGl0J3Mgbm90IGF0b21pYy4KIGNsYXNzIFN5bWJvbEltcGwg
OiBwdWJsaWMgVW5pcXVlZFN0cmluZ0ltcGwgewotcHJpdmF0ZToKLSAgICBzdGF0aWMgY29uc3Rl
eHByIGNvbnN0IHVuc2lnbmVkIHNfZmxhZ0lzTnVsbFN5bWJvbCA9IDF1OwotCiBwdWJsaWM6Cisg
ICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCB1bnNpZ25lZCBzX2ZsYWdJc051bGxTeW1ib2wgPSAw
YjAxdTsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IHVuc2lnbmVkIHNfZmxhZ0lzUmVnaXN0
ZXJlZCA9IDBiMTB1OworCiAgICAgdW5zaWduZWQgaGFzaEZvclN5bWJvbCgpIGNvbnN0IHsgcmV0
dXJuIG1faGFzaEZvclN5bWJvbDsgfQotICAgIFN5bWJvbFJlZ2lzdHJ5KiBjb25zdCYgc3ltYm9s
UmVnaXN0cnkoKSBjb25zdCB7IHJldHVybiBtX3N5bWJvbFJlZ2lzdHJ5OyB9Ci0gICAgU3ltYm9s
UmVnaXN0cnkqJiBzeW1ib2xSZWdpc3RyeSgpIHsgcmV0dXJuIG1fc3ltYm9sUmVnaXN0cnk7IH0K
ICAgICBib29sIGlzTnVsbFN5bWJvbCgpIGNvbnN0IHsgcmV0dXJuIG1fZmxhZ3MgJiBzX2ZsYWdJ
c051bGxTeW1ib2w7IH0KKyAgICBib29sIGlzUmVnaXN0ZXJlZCgpIGNvbnN0IHsgcmV0dXJuIG1f
ZmxhZ3MgJiBzX2ZsYWdJc1JlZ2lzdGVyZWQ7IH0KKworICAgIFN5bWJvbFJlZ2lzdHJ5KiBzeW1i
b2xSZWdpc3RyeSgpIGNvbnN0OwogCiAgICAgV1RGX0VYUE9SVF9TVFJJTkdfQVBJIHN0YXRpYyBS
ZWY8U3ltYm9sSW1wbD4gY3JlYXRlTnVsbFN5bWJvbCgpOwogICAgIFdURl9FWFBPUlRfU1RSSU5H
X0FQSSBzdGF0aWMgUmVmPFN5bWJvbEltcGw+IGNyZWF0ZShTdHJpbmdJbXBsJiByZXApOwpAQCAt
NTIsMjMgKzUzLDI1IEBAIGNsYXNzIFN5bWJvbEltcGwgOiBwdWJsaWMgVW5pcXVlZFN0cmluZ0lt
cGwgewogICAgICAgICByZXR1cm4gY3JlYXRlU3Vic3RyaW5nU2hhcmluZ0ltcGwoKnRoaXMsIDAs
IGxlbmd0aCgpKTsKICAgICB9CiAKLXByaXZhdGU6Citwcm90ZWN0ZWQ6CiAgICAgV1RGX0VYUE9S
VF9QUklWQVRFIHN0YXRpYyB1bnNpZ25lZCBuZXh0SGFzaEZvclN5bWJvbCgpOwogCiAgICAgZnJp
ZW5kIGNsYXNzIFN0cmluZ0ltcGw7CiAKLSAgICBTeW1ib2xJbXBsKGNvbnN0IExDaGFyKiBjaGFy
YWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgsIFJlZjxTdHJpbmdJbXBsPiYmIGJhc2UpCisgICAgU3lt
Ym9sSW1wbChjb25zdCBMQ2hhciogY2hhcmFjdGVycywgdW5zaWduZWQgbGVuZ3RoLCBSZWY8U3Ry
aW5nSW1wbD4mJiBiYXNlLCB1bnNpZ25lZCBmbGFncykKICAgICAgICAgOiBVbmlxdWVkU3RyaW5n
SW1wbChDcmVhdGVTeW1ib2wsIGNoYXJhY3RlcnMsIGxlbmd0aCkKICAgICAgICAgLCBtX293bmVy
KCZiYXNlLmxlYWtSZWYoKSkKICAgICAgICAgLCBtX2hhc2hGb3JTeW1ib2wobmV4dEhhc2hGb3JT
eW1ib2woKSkKKyAgICAgICAgLCBtX2ZsYWdzKGZsYWdzKQogICAgIHsKICAgICAgICAgQVNTRVJU
KFN0cmluZ0ltcGw6OnRhaWxPZmZzZXQ8U3RyaW5nSW1wbCo+KCkgPT0gT0JKRUNUX09GRlNFVE9G
KFN5bWJvbEltcGwsIG1fb3duZXIpKTsKICAgICB9CiAKLSAgICBTeW1ib2xJbXBsKGNvbnN0IFVD
aGFyKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgsIFJlZjxTdHJpbmdJbXBsPiYmIGJhc2Up
CisgICAgU3ltYm9sSW1wbChjb25zdCBVQ2hhciogY2hhcmFjdGVycywgdW5zaWduZWQgbGVuZ3Ro
LCBSZWY8U3RyaW5nSW1wbD4mJiBiYXNlLCB1bnNpZ25lZCBmbGFncykKICAgICAgICAgOiBVbmlx
dWVkU3RyaW5nSW1wbChDcmVhdGVTeW1ib2wsIGNoYXJhY3RlcnMsIGxlbmd0aCkKICAgICAgICAg
LCBtX293bmVyKCZiYXNlLmxlYWtSZWYoKSkKICAgICAgICAgLCBtX2hhc2hGb3JTeW1ib2wobmV4
dEhhc2hGb3JTeW1ib2woKSkKKyAgICAgICAgLCBtX2ZsYWdzKGZsYWdzKQogICAgIHsKICAgICAg
ICAgQVNTRVJUKFN0cmluZ0ltcGw6OnRhaWxPZmZzZXQ8U3RyaW5nSW1wbCo+KCkgPT0gT0JKRUNU
X09GRlNFVE9GKFN5bWJvbEltcGwsIG1fb3duZXIpKTsKICAgICB9CkBAIC04NSwxMSArODgsMzYg
QEAgY2xhc3MgU3ltYm9sSW1wbCA6IHB1YmxpYyBVbmlxdWVkU3RyaW5nSW1wbCB7CiAgICAgLy8g
VGhlIHBvaW50ZXIgdG8gdGhlIG93bmVyIHN0cmluZyBzaG91bGQgYmUgaW1tZWRpYXRlbHkgZm9s
bG93aW5nIGFmdGVyIHRoZSBTdHJpbmdJbXBsIGxheW91dCwKICAgICAvLyBzaW5jZSB3ZSB3b3Vs
ZCBsaWtlIHRvIGFsaWduIHRoZSBsYXlvdXQgb2YgU3ltYm9sSW1wbCB0byB0aGUgb25lIG9mIEJ1
ZmZlclN1YnN0cmluZyBTdHJpbmdJbXBsLgogICAgIFN0cmluZ0ltcGwqIG1fb3duZXI7Ci0gICAg
U3ltYm9sUmVnaXN0cnkqIG1fc3ltYm9sUmVnaXN0cnkgeyBudWxscHRyIH07CiAgICAgdW5zaWdu
ZWQgbV9oYXNoRm9yU3ltYm9sOwogICAgIHVuc2lnbmVkIG1fZmxhZ3MgeyAwIH07CiB9OwogCitj
bGFzcyBSZWdpc3RlcmVkU3ltYm9sSW1wbCA6IHB1YmxpYyBTeW1ib2xJbXBsIHsKK3ByaXZhdGU6
CisgICAgZnJpZW5kIGNsYXNzIFN0cmluZ0ltcGw7CisgICAgZnJpZW5kIGNsYXNzIFN5bWJvbElt
cGw7CisgICAgZnJpZW5kIGNsYXNzIFN5bWJvbFJlZ2lzdHJ5OworCisgICAgU3ltYm9sUmVnaXN0
cnkqIHN5bWJvbFJlZ2lzdHJ5KCkgY29uc3QgeyByZXR1cm4gbV9zeW1ib2xSZWdpc3RyeTsgfQor
ICAgIHZvaWQgY2xlYXJTeW1ib2xSZWdpc3RyeSgpIHsgbV9zeW1ib2xSZWdpc3RyeSA9IG51bGxw
dHI7IH0KKworICAgIHN0YXRpYyBSZWY8UmVnaXN0ZXJlZFN5bWJvbEltcGw+IGNyZWF0ZShTdHJp
bmdJbXBsJiByZXAsIFN5bWJvbFJlZ2lzdHJ5Jik7CisKKyAgICBSZWdpc3RlcmVkU3ltYm9sSW1w
bChjb25zdCBMQ2hhciogY2hhcmFjdGVycywgdW5zaWduZWQgbGVuZ3RoLCBSZWY8U3RyaW5nSW1w
bD4mJiBiYXNlLCBTeW1ib2xSZWdpc3RyeSYgcmVnaXN0cnkpCisgICAgICAgIDogU3ltYm9sSW1w
bChjaGFyYWN0ZXJzLCBsZW5ndGgsIFdURk1vdmUoYmFzZSksIHNfZmxhZ0lzUmVnaXN0ZXJlZCkK
KyAgICAgICAgLCBtX3N5bWJvbFJlZ2lzdHJ5KCZyZWdpc3RyeSkKKyAgICB7CisgICAgfQorCisg
ICAgUmVnaXN0ZXJlZFN5bWJvbEltcGwoY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVk
IGxlbmd0aCwgUmVmPFN0cmluZ0ltcGw+JiYgYmFzZSwgU3ltYm9sUmVnaXN0cnkmIHJlZ2lzdHJ5
KQorICAgICAgICA6IFN5bWJvbEltcGwoY2hhcmFjdGVycywgbGVuZ3RoLCBXVEZNb3ZlKGJhc2Up
LCBzX2ZsYWdJc1JlZ2lzdGVyZWQpCisgICAgICAgICwgbV9zeW1ib2xSZWdpc3RyeSgmcmVnaXN0
cnkpCisgICAgeworICAgIH0KKworICAgIFN5bWJvbFJlZ2lzdHJ5KiBtX3N5bWJvbFJlZ2lzdHJ5
OworfTsKKwogaW5saW5lIHVuc2lnbmVkIFN0cmluZ0ltcGw6OnN5bWJvbEF3YXJlSGFzaCgpIGNv
bnN0CiB7CiAgICAgaWYgKGlzU3ltYm9sKCkpCkBAIC0xMDQsNiArMTMyLDEzIEBAIGlubGluZSB1
bnNpZ25lZCBTdHJpbmdJbXBsOjpleGlzdGluZ1N5bWJvbEF3YXJlSGFzaCgpIGNvbnN0CiAgICAg
cmV0dXJuIGV4aXN0aW5nSGFzaCgpOwogfQogCitpbmxpbmUgU3ltYm9sUmVnaXN0cnkqIFN5bWJv
bEltcGw6OnN5bWJvbFJlZ2lzdHJ5KCkgY29uc3QKK3sKKyAgICBpZiAoaXNSZWdpc3RlcmVkKCkp
CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBSZWdpc3RlcmVkU3ltYm9sSW1wbCo+
KHRoaXMpLT5zeW1ib2xSZWdpc3RyeSgpOworICAgIHJldHVybiBudWxscHRyOworfQorCiAjaWYg
IUFTU0VSVF9ESVNBQkxFRAogLy8gU3ltYm9sSW1wbHMgY3JlYXRlZCBmcm9tIFN0YXRpY1N0cmlu
Z0ltcGwgd2lsbCBBU1NFUlQKIC8vIGluIHRoZSBnZW5lcmljIFZhbHVlQ2hlY2s8VD46OmNoZWNr
Q29uc2lzdGVuY3kKQEAgLTEyNCwzICsxNTksNCBAQCBWYWx1ZUNoZWNrPGNvbnN0IFN5bWJvbElt
cGwqPiB7CiB9IC8vIG5hbWVzcGFjZSBXVEYKIAogdXNpbmcgV1RGOjpTeW1ib2xJbXBsOwordXNp
bmcgV1RGOjpSZWdpc3RlcmVkU3ltYm9sSW1wbDsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XVEYvd3Rm
L3RleHQvU3ltYm9sUmVnaXN0cnkuY3BwIGIvU291cmNlL1dURi93dGYvdGV4dC9TeW1ib2xSZWdp
c3RyeS5jcHAKaW5kZXggMjY0YmM1Y2E0NWVhNjc2ODNjN2MxMTJjOWQzM2FiOTIwMDU3Yzg0NC4u
MmY3YTM2MzViMWQzYWRhZGZlNDJlYjAzNGY1ZDkzNDVkNWIzMzc1MiAxMDA2NDQKLS0tIGEvU291
cmNlL1dURi93dGYvdGV4dC9TeW1ib2xSZWdpc3RyeS5jcHAKKysrIGIvU291cmNlL1dURi93dGYv
dGV4dC9TeW1ib2xSZWdpc3RyeS5jcHAKQEAgLTMxLDI4ICszMSwyNyBAQCBuYW1lc3BhY2UgV1RG
IHsKIFN5bWJvbFJlZ2lzdHJ5Ojp+U3ltYm9sUmVnaXN0cnkoKQogewogICAgIGZvciAoYXV0byYg
a2V5IDogbV90YWJsZSkKLSAgICAgICAgc3RhdGljX2Nhc3Q8U3ltYm9sSW1wbCY+KCprZXkuaW1w
bCgpKS5zeW1ib2xSZWdpc3RyeSgpID0gbnVsbHB0cjsKKyAgICAgICAgc3RhdGljX2Nhc3Q8UmVn
aXN0ZXJlZFN5bWJvbEltcGwmPigqa2V5LmltcGwoKSkuY2xlYXJTeW1ib2xSZWdpc3RyeSgpOwog
fQogCi1SZWY8U3ltYm9sSW1wbD4gU3ltYm9sUmVnaXN0cnk6OnN5bWJvbEZvcktleShjb25zdCBT
dHJpbmcmIHJlcCkKK1JlZjxSZWdpc3RlcmVkU3ltYm9sSW1wbD4gU3ltYm9sUmVnaXN0cnk6OnN5
bWJvbEZvcktleShjb25zdCBTdHJpbmcmIHJlcCkKIHsKICAgICBhdXRvIGFkZFJlc3VsdCA9IG1f
dGFibGUuYWRkKFN5bWJvbFJlZ2lzdHJ5S2V5KHJlcC5pbXBsKCkpKTsKICAgICBpZiAoIWFkZFJl
c3VsdC5pc05ld0VudHJ5KQotICAgICAgICByZXR1cm4gKnN0YXRpY19jYXN0PFN5bWJvbEltcGwq
PihhZGRSZXN1bHQuaXRlcmF0b3ItPmltcGwoKSk7CisgICAgICAgIHJldHVybiAqc3RhdGljX2Nh
c3Q8UmVnaXN0ZXJlZFN5bWJvbEltcGwqPihhZGRSZXN1bHQuaXRlcmF0b3ItPmltcGwoKSk7CiAK
LSAgICBhdXRvIHN5bWJvbCA9IFN5bWJvbEltcGw6OmNyZWF0ZSgqcmVwLmltcGwoKSk7Ci0gICAg
c3ltYm9sLT5zeW1ib2xSZWdpc3RyeSgpID0gdGhpczsKKyAgICBhdXRvIHN5bWJvbCA9IFJlZ2lz
dGVyZWRTeW1ib2xJbXBsOjpjcmVhdGUoKnJlcC5pbXBsKCksICp0aGlzKTsKICAgICAqYWRkUmVz
dWx0Lml0ZXJhdG9yID0gU3ltYm9sUmVnaXN0cnlLZXkoJnN5bWJvbC5nZXQoKSk7CiAgICAgcmV0
dXJuIHN5bWJvbDsKIH0KIAotU3RyaW5nIFN5bWJvbFJlZ2lzdHJ5OjprZXlGb3JTeW1ib2woU3lt
Ym9sSW1wbCYgdWlkKQorU3RyaW5nIFN5bWJvbFJlZ2lzdHJ5OjprZXlGb3JTeW1ib2woUmVnaXN0
ZXJlZFN5bWJvbEltcGwmIHVpZCkKIHsKICAgICBBU1NFUlQodWlkLnN5bWJvbFJlZ2lzdHJ5KCkg
PT0gdGhpcyk7CiAgICAgcmV0dXJuIHVpZC5leHRyYWN0Rm9sZGVkU3RyaW5nKCk7CiB9CiAKLXZv
aWQgU3ltYm9sUmVnaXN0cnk6OnJlbW92ZShTeW1ib2xJbXBsJiB1aWQpCit2b2lkIFN5bWJvbFJl
Z2lzdHJ5OjpyZW1vdmUoUmVnaXN0ZXJlZFN5bWJvbEltcGwmIHVpZCkKIHsKICAgICBBU1NFUlQo
dWlkLnN5bWJvbFJlZ2lzdHJ5KCkgPT0gdGhpcyk7CiAgICAgYXV0byBpdGVyYXRvciA9IG1fdGFi
bGUuZmluZChTeW1ib2xSZWdpc3RyeUtleSgmdWlkKSk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV1RG
L3d0Zi90ZXh0L1N5bWJvbFJlZ2lzdHJ5LmggYi9Tb3VyY2UvV1RGL3d0Zi90ZXh0L1N5bWJvbFJl
Z2lzdHJ5LmgKaW5kZXggMDZkMjc2ODM0MDdlOWFjYzIzZmUyODYwYzVjMTc3OTk4MDdhNDQ5NC4u
M2Q0ZjQzMjU4ZmZmZWQwZTFlZTQxYjAxZjQ1M2MzYWViMzdmMTVmOCAxMDA2NDQKLS0tIGEvU291
cmNlL1dURi93dGYvdGV4dC9TeW1ib2xSZWdpc3RyeS5oCisrKyBiL1NvdXJjZS9XVEYvd3RmL3Rl
eHQvU3ltYm9sUmVnaXN0cnkuaApAQCAtODIsMTAgKzgyLDEwIEBAIGNsYXNzIFN5bWJvbFJlZ2lz
dHJ5IHsKICAgICBTeW1ib2xSZWdpc3RyeSgpID0gZGVmYXVsdDsKICAgICBXVEZfRVhQT1JUX1BS
SVZBVEUgflN5bWJvbFJlZ2lzdHJ5KCk7CiAKLSAgICBXVEZfRVhQT1JUX1BSSVZBVEUgUmVmPFN5
bWJvbEltcGw+IHN5bWJvbEZvcktleShjb25zdCBTdHJpbmcmKTsKLSAgICBXVEZfRVhQT1JUX1BS
SVZBVEUgU3RyaW5nIGtleUZvclN5bWJvbChTeW1ib2xJbXBsJik7CisgICAgV1RGX0VYUE9SVF9Q
UklWQVRFIFJlZjxSZWdpc3RlcmVkU3ltYm9sSW1wbD4gc3ltYm9sRm9yS2V5KGNvbnN0IFN0cmlu
ZyYpOworICAgIFdURl9FWFBPUlRfUFJJVkFURSBTdHJpbmcga2V5Rm9yU3ltYm9sKFJlZ2lzdGVy
ZWRTeW1ib2xJbXBsJik7CiAKLSAgICB2b2lkIHJlbW92ZShTeW1ib2xJbXBsJik7CisgICAgdm9p
ZCByZW1vdmUoUmVnaXN0ZXJlZFN5bWJvbEltcGwmKTsKIAogcHJpdmF0ZToKICAgICBIYXNoU2V0
PFN5bWJvbFJlZ2lzdHJ5S2V5PiBtX3RhYmxlOwo=
</data>
<flag name="review"
          id="333506"
          type_id="1"
          status="+"
          setter="mark.lam"
    />
          </attachment>
      

    </bug>

</bugzilla>