<?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>30701</bug_id>
          
          <creation_ts>2009-10-22 18:07:56 -0700</creation_ts>
          <short_desc>Chromium needs a different implementation for DatabaseTracker (+ quota management) and SQLTransactionClient</short_desc>
          <delta_ts>2009-11-02 17:40:00 -0800</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>All</rep_platform>
          <op_sys>All</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="Dumitru Daniliuc">dumi</reporter>
          <assigned_to name="Dumitru Daniliuc">dumi</assigned_to>
          <cc>dglazkov</cc>
    
    <cc>fishd</cc>
    
    <cc>michaeln</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>157074</commentid>
    <comment_count>0</comment_count>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2009-10-22 18:07:56 -0700</bug_when>
    <thetext>We need to add Chromium specific implementations for DatabaseTracker (+ quota management) and SQLTransactionClient. WebCore&apos;s default implementation is not suitable because it&apos;s not modular enough for a multi-process application.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>157075</commentid>
    <comment_count>1</comment_count>
      <attachid>41708</attachid>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2009-10-22 18:14:54 -0700</bug_when>
    <thetext>Created attachment 41708
patch

These new files will be added to WebCore.gypi in a future 2-sided patch that will put all pieces together.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>158845</commentid>
    <comment_count>2</comment_count>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2009-10-29 00:05:17 -0700</bug_when>
    <thetext>This looks pretty good, some simple questions of the &quot;just checking&quot; nature.

12         * storage/chromium/DatabaseTrackerChromium.cpp: Added.
13         (WebCore::DatabaseTracker::tracker):
14         (WebCore::DatabaseTracker::DatabaseTracker):
15         (WebCore::DatabaseTracker::canEstablishDatabase):
16         (WebCore::DatabaseTracker::setDatabaseDetails):
17         (WebCore::DatabaseTracker::fullPathForDatabase):
18         (WebCore::DatabaseTracker::addOpenDatabase):
19         (WebCore::DatabaseTracker::removeOpenDatabase):
20         (WebCore::DatabaseTracker::getMaxSizeForDatabase):

In the ChangeLog, You don&apos;t need to list the modified methods for newly added files. Ditto for all of the added .cpp files.

 68 String DatabaseTracker::fullPathForDatabase(SecurityOrigin* origin, const String&amp; name, bool)
 69 {
 70     return origin-&gt;databaseIdentifier() + &quot;_&quot; + name + &quot;.db&quot;;
 71 }

nit: Should we lose the .db extension on these files? I don&apos;t think we&apos;re ready to retain storage of DBs in this system for all time quite yet, so not a real pressing issue. But what is the file layout *really*.

This code merely needs to return a string token that chrome can map to an actual file path in the file system in the browser process. What format should that string token take? I&apos;d vote for something easily crackable into its constituent components &lt;originIdentifier, name&gt;.

73 void DatabaseTracker::addOpenDatabase(Database* database)
74 {
75     DatabaseObserver::databaseOpened(database);
76 }
77 
78 void DatabaseTracker::removeOpenDatabase(Database* database)
79 {
80     DatabaseObserver::databaseClosed(database);
81 }

Can/should you make any assertions about which thread these are being called on?

Also, in order to implement &quot;purgeMemory()&quot; should chromium&apos;s tracker maintain a collection of open databases, or does that happen elsewhere?


45     void getDatabaseSizeAndSpaceAvailableToOrigin(
46         const String&amp; securityOrigin, const String&amp; databaseName,
47         unsigned long long* databaseSize, unsigned long long* spaceAvailable);
48     void updateDatabaseSizeAndSpaceAvailableToOrigin(
49         const String&amp; securityOrigin, const String&amp; databaseName,
50         unsigned long long databaseSize, unsigned long long spaceAvailable);

maybe securityOriginIdentifier or originIdentifier for clarity?


51 void SQLTransactionClient::didCommitTransaction(SQLTransaction* transaction)
52 {
53     ASSERT(currentThread() == transaction-&gt;database()-&gt;document()-&gt;databaseThread()-&gt;getThreadID());
54     if (!transaction-&gt;isReadOnly())
55         callOnMainThread(notifyDatabaseChanged, transaction-&gt;database());
56 }

Are we guaranteed that &apos;database&apos; is not finally released prior to the notifyDatabaseChanged running on the main thread?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>158930</commentid>
    <comment_count>3</comment_count>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2009-10-29 09:27:33 -0700</bug_when>
    <thetext>86     String originIdentifier = database-&gt;databaseThreadSecurityOrigin()-&gt;databaseIdentifier();

Just database-&gt;securityOrigin() since that method returns the appropriate copy now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>159020</commentid>
    <comment_count>4</comment_count>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2009-10-29 13:06:18 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; This looks pretty good, some simple questions of the &quot;just checking&quot; nature.
&gt; 
&gt; 12         * storage/chromium/DatabaseTrackerChromium.cpp: Added.
&gt; 13         (WebCore::DatabaseTracker::tracker):
&gt; 14         (WebCore::DatabaseTracker::DatabaseTracker):
&gt; 15         (WebCore::DatabaseTracker::canEstablishDatabase):
&gt; 16         (WebCore::DatabaseTracker::setDatabaseDetails):
&gt; 17         (WebCore::DatabaseTracker::fullPathForDatabase):
&gt; 18         (WebCore::DatabaseTracker::addOpenDatabase):
&gt; 19         (WebCore::DatabaseTracker::removeOpenDatabase):
&gt; 20         (WebCore::DatabaseTracker::getMaxSizeForDatabase):
&gt; 
&gt; In the ChangeLog, You don&apos;t need to list the modified methods for newly added
&gt; files. Ditto for all of the added .cpp files.

done.

&gt;  68 String DatabaseTracker::fullPathForDatabase(SecurityOrigin* origin, const
&gt; String&amp; name, bool)
&gt;  69 {
&gt;  70     return origin-&gt;databaseIdentifier() + &quot;_&quot; + name + &quot;.db&quot;;
&gt;  71 }
&gt; 
&gt; nit: Should we lose the .db extension on these files? I don&apos;t think we&apos;re ready
&gt; to retain storage of DBs in this system for all time quite yet, so not a real
&gt; pressing issue. But what is the file layout *really*.
&gt; 
&gt; This code merely needs to return a string token that chrome can map to an
&gt; actual file path in the file system in the browser process. What format should
&gt; that string token take? I&apos;d vote for something easily crackable into its
&gt; constituent components &lt;originIdentifier, name&gt;.

this is the file name passed to the VFS layer, so it needs to match the file name we derive from &lt;origin_identifier, database_name&gt; in database_tracker in the browser process when we populate our cache of database sizes. eventually, we should change our IPCs coming from the VFS layer to pass a pair &lt;origin_identifier, database_name&gt; and have a centralized place that converts that to a file name; but for now, i think it needs to stay the way it is.

&gt; 73 void DatabaseTracker::addOpenDatabase(Database* database)
&gt; 74 {
&gt; 75     DatabaseObserver::databaseOpened(database);
&gt; 76 }
&gt; 77 
&gt; 78 void DatabaseTracker::removeOpenDatabase(Database* database)
&gt; 79 {
&gt; 80     DatabaseObserver::databaseClosed(database);
&gt; 81 }
&gt; 
&gt; Can/should you make any assertions about which thread these are being called
&gt; on?

done.

&gt; Also, in order to implement &quot;purgeMemory()&quot; should chromium&apos;s tracker maintain
&gt; a collection of open databases, or does that happen elsewhere?

added that set here.

&gt; 45     void getDatabaseSizeAndSpaceAvailableToOrigin(
&gt; 46         const String&amp; securityOrigin, const String&amp; databaseName,
&gt; 47         unsigned long long* databaseSize, unsigned long long*
&gt; spaceAvailable);
&gt; 48     void updateDatabaseSizeAndSpaceAvailableToOrigin(
&gt; 49         const String&amp; securityOrigin, const String&amp; databaseName,
&gt; 50         unsigned long long databaseSize, unsigned long long spaceAvailable);
&gt; 
&gt; maybe securityOriginIdentifier or originIdentifier for clarity?

changed to originIdentifier;

&gt; 51 void SQLTransactionClient::didCommitTransaction(SQLTransaction* transaction)
&gt; 52 {
&gt; 53     ASSERT(currentThread() ==
&gt; transaction-&gt;database()-&gt;document()-&gt;databaseThread()-&gt;getThreadID());
&gt; 54     if (!transaction-&gt;isReadOnly())
&gt; 55         callOnMainThread(notifyDatabaseChanged, transaction-&gt;database());
&gt; 56 }
&gt; 
&gt; Are we guaranteed that &apos;database&apos; is not finally released prior to the
&gt; notifyDatabaseChanged running on the main thread?

Database is RefCounted, so it seems to me that passing it to callOnMainThread() should increment the ref count, and it should get released at the end of notifyDatabaseChanged(). but i&apos;m not sure...

&gt; 86     String originIdentifier =
&gt; database-&gt;databaseThreadSecurityOrigin()-&gt;databaseIdentifier();
&gt; 
&gt; Just database-&gt;securityOrigin() since that method returns the appropriate
&gt; copy now.

fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>159024</commentid>
    <comment_count>5</comment_count>
      <attachid>42130</attachid>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2009-10-29 13:10:20 -0700</bug_when>
    <thetext>Created attachment 42130
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>159056</commentid>
    <comment_count>6</comment_count>
      <attachid>42135</attachid>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2009-10-29 13:49:12 -0700</bug_when>
    <thetext>Created attachment 42135
patch

Same patch, only changed the file names returned by DatabaseTrackerChromium::fullPathForDatabase() from origin_identifier + &quot;_&quot; + db_name + &quot;.db&quot; to origin_identifier + &quot;/&quot; + db_name. We&apos;ll split that into origin_identifier and db_name in the browser process as we talked, and create the real file name there.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>159199</commentid>
    <comment_count>7</comment_count>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2009-10-29 19:42:23 -0700</bug_when>
    <thetext>41 namespace {
42 
43 static void notifyDatabaseChanged(void* context) {
44     WebCore::DatabaseObserver::databaseModified(static_cast&lt;WebCore::Database*&gt;(context));
45 }
46 
47 }

Since the method is static, the anon namespace isn&apos;t needed... or vice versa.

------------------------
51 void SQLTransactionClient::didCommitTransaction(SQLTransaction* transaction)
52 {
53     ASSERT(currentThread() == transaction-&gt;database()-&gt;document()-&gt;databaseThread()-&gt;getThreadID());
54     if (!transaction-&gt;isReadOnly())
55         callOnMainThread(notifyDatabaseChanged, transaction-&gt;database());
56 }

Unless you&apos;re certain the database can&apos;t get finally released between the time the task is scheduled and the time the task executes, probably should ref()/deref() accordingly.

------------------------
46 static wtf::HashSet&lt;Database*&gt; openDatabases;

This collection needs to be wrapped up using DEFINE_STATIC_LOCAL. Also, I don&apos;t think you need to prefix with the &apos;wtf&apos; namespace since HashSet.h contains using WTF::HashSet. (it looks like the namespace name is &apos;WTF&apos;, all caps, btw).

typedef HashSet&lt;Database*&gt; DatabaseSet;

static DatabaseSet&amp; openDatabases()
{
    DEFINE_STATIC_LOCAL(DatabasesSet, staticOpenDatabases, ());
    return staticOpenDatabases;
}</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>159410</commentid>
    <comment_count>8</comment_count>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2009-10-30 12:56:44 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; 41 namespace {
&gt; 42 
&gt; 43 static void notifyDatabaseChanged(void* context) {
&gt; 44    
&gt; WebCore::DatabaseObserver::databaseModified(static_cast&lt;WebCore::Database*&gt;(context));
&gt; 45 }
&gt; 46 
&gt; 47 }
&gt; 
&gt; Since the method is static, the anon namespace isn&apos;t needed... or vice versa.

removed the anonymous namespace.

&gt; ------------------------
&gt; 51 void SQLTransactionClient::didCommitTransaction(SQLTransaction* transaction)
&gt; 52 {
&gt; 53     ASSERT(currentThread() ==
&gt; transaction-&gt;database()-&gt;document()-&gt;databaseThread()-&gt;getThreadID());
&gt; 54     if (!transaction-&gt;isReadOnly())
&gt; 55         callOnMainThread(notifyDatabaseChanged, transaction-&gt;database());
&gt; 56 }
&gt; 
&gt; Unless you&apos;re certain the database can&apos;t get finally released between the time
&gt; the task is scheduled and the time the task executes, probably should
&gt; ref()/deref() accordingly.

ref()&apos;ing in didCommitTransaction() and deref()&apos;ing in notifyDatabaseChanged().

&gt; ------------------------
&gt; 46 static wtf::HashSet&lt;Database*&gt; openDatabases;
&gt; 
&gt; This collection needs to be wrapped up using DEFINE_STATIC_LOCAL. Also, I don&apos;t
&gt; think you need to prefix with the &apos;wtf&apos; namespace since HashSet.h contains
&gt; using WTF::HashSet. (it looks like the namespace name is &apos;WTF&apos;, all caps, btw).
&gt; 
&gt; typedef HashSet&lt;Database*&gt; DatabaseSet;
&gt; 
&gt; static DatabaseSet&amp; openDatabases()
&gt; {
&gt;     DEFINE_STATIC_LOCAL(DatabasesSet, staticOpenDatabases, ());
&gt;     return staticOpenDatabases;
&gt; }

done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>159412</commentid>
    <comment_count>9</comment_count>
      <attachid>42228</attachid>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2009-10-30 13:01:36 -0700</bug_when>
    <thetext>Created attachment 42228
patch

Addressed Michael&apos;s comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>159432</commentid>
    <comment_count>10</comment_count>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2009-10-30 13:54:37 -0700</bug_when>
    <thetext>As mentioned before... i don&apos;t think this will compile as is...

86     String originIdentifier =
database-&gt;databaseThreadSecurityOrigin()-&gt;databaseIdentifier();

Just database-&gt;securityOrigin() since that method returns the appropriate copy
now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>159443</commentid>
    <comment_count>11</comment_count>
      <attachid>42234</attachid>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2009-10-30 14:27:03 -0700</bug_when>
    <thetext>Created attachment 42234
patch

Oops, removed that line: originIdentifier is not used anywhere in that method anymore.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>159487</commentid>
    <comment_count>12</comment_count>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2009-10-30 15:35:28 -0700</bug_when>
    <thetext>I have one remaining question around string thread safety...

 59 void QuotaTracker::updateDatabaseSizeAndOriginSpace(
 60     const String&amp; originIdentifier, const String&amp; databaseName,
 61     unsigned long long databaseSize, unsigned long long spaceAvailable)
 62 {
 63     MutexLocker lockData(m_dataGuard);
 64     m_spaceAvailableToOrigins.set(originIdentifier, spaceAvailable);
 65     HashMap&lt;String, SizeMap&gt;::iterator it = m_databaseSizes.add(originIdentifier, SizeMap()).first;
 66     it-&gt;second.set(databaseName, databaseSize);
 67 }

... since these collections are used on accessed on multiple threads, what magic String incantations should we invoke on the string values being placed into these collections? Is crossThreadString() or threadsafeCopy() applicable to our situation here? Unless you know that answer to that question, please seek out advice from a webkit hacker on this point.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>159510</commentid>
    <comment_count>13</comment_count>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2009-10-30 16:22:52 -0700</bug_when>
    <thetext>(In reply to comment #12)
&gt; I have one remaining question around string thread safety...
&gt; 
&gt;  59 void QuotaTracker::updateDatabaseSizeAndOriginSpace(
&gt;  60     const String&amp; originIdentifier, const String&amp; databaseName,
&gt;  61     unsigned long long databaseSize, unsigned long long spaceAvailable)
&gt;  62 {
&gt;  63     MutexLocker lockData(m_dataGuard);
&gt;  64     m_spaceAvailableToOrigins.set(originIdentifier, spaceAvailable);
&gt;  65     HashMap&lt;String, SizeMap&gt;::iterator it =
&gt; m_databaseSizes.add(originIdentifier, SizeMap()).first;
&gt;  66     it-&gt;second.set(databaseName, databaseSize);
&gt;  67 }
&gt; 
&gt; ... since these collections are used on accessed on multiple threads, what
&gt; magic String incantations should we invoke on the string values being placed
&gt; into these collections? Is crossThreadString() or threadsafeCopy() applicable
&gt; to our situation here? Unless you know that answer to that question, please
&gt; seek out advice from a webkit hacker on this point.

Looks like this should be OK. Strings are added to this map (as keys) only on the main thread, and the map is destroyed when the process goes away on the main thread too, and I don&apos;t see any ref()s/deref()s in the HashMap implementation, so I think we should be safe here. Jeremy and Dimitri seem to agree.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>159524</commentid>
    <comment_count>14</comment_count>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2009-10-30 17:04:30 -0700</bug_when>
    <thetext>&gt; Looks like this should be OK. Strings are added to this map (as keys) only on
&gt; the main thread, and the map is destroyed when the process goes away on the
&gt; main thread too, and I don&apos;t see any ref()s/deref()s in the HashMap
&gt; implementation, so I think we should be safe here. Jeremy and Dimitri seem to
&gt; agree.

Great... fwiw... lgtm</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>159924</commentid>
    <comment_count>15</comment_count>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2009-11-02 14:21:08 -0800</bug_when>
    <thetext>Ping. Looking for a WebKit reviewer.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>159931</commentid>
    <comment_count>16</comment_count>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2009-11-02 14:52:10 -0800</bug_when>
    <thetext>46 typedef HashSet&lt;Database*&gt; DatabaseSet;
47 
48 static DatabaseSet&amp; openDatabases()
49 {
50     DEFINE_STATIC_LOCAL(DatabasesSet, staticOpenDatabases, ());
51     return staticOpenDatabases;
52 }

Since it looks like peter doesn&apos;t need this to get his job done, are you planning to remove this?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>159934</commentid>
    <comment_count>17</comment_count>
      <attachid>42345</attachid>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2009-11-02 15:19:31 -0800</bug_when>
    <thetext>Created attachment 42345
patch

(In reply to comment #16)
&gt; 46 typedef HashSet&lt;Database*&gt; DatabaseSet;
&gt; 47 
&gt; 48 static DatabaseSet&amp; openDatabases()
&gt; 49 {
&gt; 50     DEFINE_STATIC_LOCAL(DatabasesSet, staticOpenDatabases, ());
&gt; 51     return staticOpenDatabases;
&gt; 52 }
&gt; 
&gt; Since it looks like peter doesn&apos;t need this to get his job done, are you
&gt; planning to remove this?

done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>159938</commentid>
    <comment_count>18</comment_count>
      <attachid>42345</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-11-02 15:56:38 -0800</bug_when>
    <thetext>Comment on attachment 42345
patch

r=me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>159957</commentid>
    <comment_count>19</comment_count>
    <who name="Dumitru Daniliuc">dumi</who>
    <bug_when>2009-11-02 17:40:00 -0800</bug_when>
    <thetext>Landed as r50434.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>41708</attachid>
            <date>2009-10-22 18:14:54 -0700</date>
            <delta_ts>2009-10-29 13:10:20 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>16995</size>
            <attacher name="Dumitru Daniliuc">dumi</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0OTk2MSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzQgQEAKKzIwMDktMTAtMjIgIER1bWl0cnUgRGFuaWxpdWMgIDxkdW1pQGNocm9t
aXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBBZGRpbmcgQ2hyb21pdW0ncyBEYXRhYmFzZVRyYWNrZXIgYW5kIFNRTFRyYW5zYWN0aW9uQ2xp
ZW50CisgICAgICAgIGltcGxlbWVudGF0aW9uLgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMDcwMQorCisgICAgICAgICogc3RvcmFnZS9jaHJvbWl1
bTogQWRkZWQuCisgICAgICAgICogc3RvcmFnZS9jaHJvbWl1bS9EYXRhYmFzZU9ic2VydmVyLmg6
IEFkZGVkLgorICAgICAgICAqIHN0b3JhZ2UvY2hyb21pdW0vRGF0YWJhc2VUcmFja2VyQ2hyb21p
dW0uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6dHJhY2tl
cik6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OkRhdGFiYXNlVHJhY2tlcik6
CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OmNhbkVzdGFibGlzaERhdGFiYXNl
KToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6c2V0RGF0YWJhc2VEZXRhaWxz
KToKKyAgICAgICAgKFdlYkNvcmU6OkRhdGFiYXNlVHJhY2tlcjo6ZnVsbFBhdGhGb3JEYXRhYmFz
ZSk6CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OmFkZE9wZW5EYXRhYmFzZSk6
CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnJlbW92ZU9wZW5EYXRhYmFzZSk6
CisgICAgICAgIChXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OmdldE1heFNpemVGb3JEYXRhYmFz
ZSk6CisgICAgICAgICogc3RvcmFnZS9jaHJvbWl1bS9RdW90YVRyYWNrZXIuY3BwOiBBZGRlZC4K
KyAgICAgICAgKFdlYkNvcmU6OlF1b3RhVHJhY2tlcjo6aW5zdGFuY2UpOgorICAgICAgICAoV2Vi
Q29yZTo6UXVvdGFUcmFja2VyOjpnZXREYXRhYmFzZVNpemVBbmRTcGFjZUF2YWlsYWJsZVRvT3Jp
Z2luKToKKyAgICAgICAgKFdlYkNvcmU6OlF1b3RhVHJhY2tlcjo6dXBkYXRlRGF0YWJhc2VTaXpl
QW5kT3JpZ2luU3BhY2UpOgorICAgICAgICAqIHN0b3JhZ2UvY2hyb21pdW0vUXVvdGFUcmFja2Vy
Lmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UXVvdGFUcmFja2VyOjpRdW90YVRyYWNrZXIp
OgorICAgICAgICAqIHN0b3JhZ2UvY2hyb21pdW0vU1FMVHJhbnNhY3Rpb25DbGllbnRDaHJvbWl1
bS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6U1FMVHJhbnNhY3Rpb25DbGllbnQ6OmRp
ZENvbW1pdFRyYW5zYWN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlNRTFRyYW5zYWN0aW9uQ2xp
ZW50OjpkaWRFeGVjdXRlU3RhdGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlNRTFRyYW5zYWN0
aW9uQ2xpZW50OjpkaWRFeGNlZWRRdW90YSk6CisKIDIwMDktMTAtMjIgIEFsZXhleSBQcm9za3Vy
eWFrb3YgIDxhcEBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgVGltIEhhdGNoZXIu
CkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vRGF0YWJhc2VPYnNlcnZlci5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9jaHJvbWl1bS9EYXRhYmFzZU9ic2VydmVyLmgJKHJl
dmlzaW9uIDApCisrKyBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vRGF0YWJhc2VPYnNlcnZlci5o
CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5
IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAg
ICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAq
IE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAq
IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMg
ZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3Jp
dHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhF
IENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1J
VEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAq
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBEYXRhYmFzZU9ic2VydmVyX2gK
KyNkZWZpbmUgRGF0YWJhc2VPYnNlcnZlcl9oCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xh
c3MgRGF0YWJhc2U7CisKKy8vIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzIGlzIGlu
IHRoZSBXZWJLaXQgQVBJIChDaHJvbWl1bSBzb3VyY2UgdHJlZSkKKy8vIGluIHdlYmtpdC9hcGkv
c3JjL0RhdGFiYXNlT2JzZXJ2ZXIuY3BwLgorY2xhc3MgRGF0YWJhc2VPYnNlcnZlciB7CitwdWJs
aWM6CisgICAgc3RhdGljIHZvaWQgZGF0YWJhc2VPcGVuZWQoRGF0YWJhc2UqKTsKKyAgICBzdGF0
aWMgdm9pZCBkYXRhYmFzZU1vZGlmaWVkKERhdGFiYXNlKik7CisgICAgc3RhdGljIHZvaWQgZGF0
YWJhc2VDbG9zZWQoRGF0YWJhc2UqKTsKK307CisKK30KKworI2VuZGlmIC8vIERhdGFiYXNlT2Jz
ZXJ2ZXJfaApJbmRleDogV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL0RhdGFiYXNlVHJhY2tlckNo
cm9taXVtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vRGF0YWJh
c2VUcmFja2VyQ2hyb21pdW0uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9zdG9yYWdlL2No
cm9taXVtL0RhdGFiYXNlVHJhY2tlckNocm9taXVtLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCAr
MSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0Ogor
ICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisg
KiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdv
b2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVz
ZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBz
b2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQg
Q09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdI
VAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJEYXRhYmFzZVRyYWNrZXIuaCIK
KworI2luY2x1ZGUgIkNTdHJpbmcuaCIKKyNpbmNsdWRlICJEYXRhYmFzZS5oIgorI2luY2x1ZGUg
IkRhdGFiYXNlT2JzZXJ2ZXIuaCIKKyNpbmNsdWRlICJEYXRhYmFzZVRocmVhZC5oIgorI2luY2x1
ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiUXVvdGFUcmFja2VyLmgiCisjaW5jbHVkZSAiU2Vj
dXJpdHlPcmlnaW4uaCIKKyNpbmNsdWRlICJTUUxpdGVGaWxlU3lzdGVtLmgiCisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworRGF0YWJhc2VUcmFja2VyJiBEYXRhYmFzZVRyYWNrZXI6OnRyYWNrZXIo
KQoreworICAgIERFRklORV9TVEFUSUNfTE9DQUwoRGF0YWJhc2VUcmFja2VyLCB0cmFja2VyLCAo
KSk7CisgICAgcmV0dXJuIHRyYWNrZXI7Cit9CisKK0RhdGFiYXNlVHJhY2tlcjo6RGF0YWJhc2VU
cmFja2VyKCkKK3sKKyAgICBTUUxpdGVGaWxlU3lzdGVtOjpyZWdpc3RlclNRTGl0ZVZGUygpOwor
fQorCitib29sIERhdGFiYXNlVHJhY2tlcjo6Y2FuRXN0YWJsaXNoRGF0YWJhc2UoRG9jdW1lbnQq
LCBjb25zdCBTdHJpbmcmLCBjb25zdCBTdHJpbmcmLCB1bnNpZ25lZCBsb25nKQoreworICAgIC8v
IEluIENocm9taXVtLCBhIGRhdGFiYXNlIGNhbiBhbHdheXMgYmUgZXN0YWJsaXNoZWQgKGV2ZW4g
dGhvdWdoIHdlIG1pZ2h0IG5vdAorICAgIC8vIGJlIGFibGUgdG8gd3JpdGUgYW55dGhpbmcgdG8g
aXQgaWYgdGhlIHF1b3RhIGZvciB0aGlzIG9yaWdpbiB3YXMgZXhjZWVkZWQpCisgICAgcmV0dXJu
IHRydWU7Cit9CisKK3ZvaWQgRGF0YWJhc2VUcmFja2VyOjpzZXREYXRhYmFzZURldGFpbHMoU2Vj
dXJpdHlPcmlnaW4qLCBjb25zdCBTdHJpbmcmLCBjb25zdCBTdHJpbmcmLCB1bnNpZ25lZCBsb25n
KQoreworICAgIC8vIENocm9taXVtIHNldHMgdGhlIGRhdGFiYXNlIGRldGFpbHMgd2hlbiB0aGUg
ZGF0YWJhc2UgaXMgb3BlbmVkCit9CisKK1N0cmluZyBEYXRhYmFzZVRyYWNrZXI6OmZ1bGxQYXRo
Rm9yRGF0YWJhc2UoU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lLCBi
b29sKQoreworICAgIHJldHVybiBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpICsgIl8iICsg
bmFtZSArICIuZGIiOworfQorCit2b2lkIERhdGFiYXNlVHJhY2tlcjo6YWRkT3BlbkRhdGFiYXNl
KERhdGFiYXNlKiBkYXRhYmFzZSkKK3sKKyAgICBEYXRhYmFzZU9ic2VydmVyOjpkYXRhYmFzZU9w
ZW5lZChkYXRhYmFzZSk7Cit9CisKK3ZvaWQgRGF0YWJhc2VUcmFja2VyOjpyZW1vdmVPcGVuRGF0
YWJhc2UoRGF0YWJhc2UqIGRhdGFiYXNlKQoreworICAgIERhdGFiYXNlT2JzZXJ2ZXI6OmRhdGFi
YXNlQ2xvc2VkKGRhdGFiYXNlKTsKK30KKwordW5zaWduZWQgbG9uZyBsb25nIERhdGFiYXNlVHJh
Y2tlcjo6Z2V0TWF4U2l6ZUZvckRhdGFiYXNlKGNvbnN0IERhdGFiYXNlKiBkYXRhYmFzZSkgY29u
c3QKK3sKKyAgICBBU1NFUlQoY3VycmVudFRocmVhZCgpID09IGRhdGFiYXNlLT5kb2N1bWVudCgp
LT5kYXRhYmFzZVRocmVhZCgpLT5nZXRUaHJlYWRJRCgpKTsKKyAgICBTdHJpbmcgb3JpZ2luSWRl
bnRpZmllciA9IGRhdGFiYXNlLT5kYXRhYmFzZVRocmVhZFNlY3VyaXR5T3JpZ2luKCktPmRhdGFi
YXNlSWRlbnRpZmllcigpOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBzcGFjZUF2YWlsYWJsZSA9
IDA7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIGRhdGFiYXNlU2l6ZSA9IDA7CisgICAgUXVvdGFU
cmFja2VyOjppbnN0YW5jZSgpLmdldERhdGFiYXNlU2l6ZUFuZFNwYWNlQXZhaWxhYmxlVG9Pcmln
aW4oCisgICAgICAgIGRhdGFiYXNlLT5kYXRhYmFzZVRocmVhZFNlY3VyaXR5T3JpZ2luKCktPmRh
dGFiYXNlSWRlbnRpZmllcigpLAorICAgICAgICBkYXRhYmFzZS0+c3RyaW5nSWRlbnRpZmllcigp
LCAmZGF0YWJhc2VTaXplLCAmc3BhY2VBdmFpbGFibGUpOworICAgIHJldHVybiBkYXRhYmFzZVNp
emUgKyBzcGFjZUF2YWlsYWJsZTsKK30KKworfQpJbmRleDogV2ViQ29yZS9zdG9yYWdlL2Nocm9t
aXVtL1F1b3RhVHJhY2tlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL2Nocm9t
aXVtL1F1b3RhVHJhY2tlci5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3N0b3JhZ2UvY2hy
b21pdW0vUXVvdGFUcmFja2VyLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw2OSBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBk
aXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5v
ciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRo
b3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JT
CisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIg
T1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICog
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJRdW90YVRyYWNrZXIuaCIKKworI2luY2x1ZGUgIkNT
dHJpbmcuaCIKKyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworUXVvdGFUcmFja2VyJiBRdW90YVRyYWNrZXI6Omluc3RhbmNlKCkKK3sKKyAgICBE
RUZJTkVfU1RBVElDX0xPQ0FMKFF1b3RhVHJhY2tlciwgdHJhY2tlciwgKCkpOworICAgIHJldHVy
biB0cmFja2VyOworfQorCit2b2lkIFF1b3RhVHJhY2tlcjo6Z2V0RGF0YWJhc2VTaXplQW5kU3Bh
Y2VBdmFpbGFibGVUb09yaWdpbigKKyAgICBjb25zdCBTdHJpbmcmIHNlY3VyaXR5T3JpZ2luLCBj
b25zdCBTdHJpbmcmIGRhdGFiYXNlTmFtZSwKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcqIGRhdGFi
YXNlU2l6ZSwgdW5zaWduZWQgbG9uZyBsb25nKiBzcGFjZUF2YWlsYWJsZSkKK3sKKyAgICBNdXRl
eExvY2tlciBsb2NrRGF0YShtX2RhdGFHdWFyZCk7CisgICAgQVNTRVJUKG1fZGF0YWJhc2VTaXpl
cy5jb250YWlucyhzZWN1cml0eU9yaWdpbikpOworICAgIEhhc2hNYXA8U3RyaW5nLCBTaXplTWFw
Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2RhdGFiYXNlU2l6ZXMuZmluZChzZWN1cml0eU9yaWdp
bik7CisgICAgQVNTRVJUKGl0LT5zZWNvbmQuY29udGFpbnMoZGF0YWJhc2VOYW1lKSk7CisgICAg
KmRhdGFiYXNlU2l6ZSA9IGl0LT5zZWNvbmQuZ2V0KGRhdGFiYXNlTmFtZSk7CisKKyAgICBBU1NF
UlQobV9zcGFjZUF2YWlsYWJsZVRvT3JpZ2lucy5jb250YWlucyhzZWN1cml0eU9yaWdpbikpOwor
ICAgICpzcGFjZUF2YWlsYWJsZSA9IG1fc3BhY2VBdmFpbGFibGVUb09yaWdpbnMuZ2V0KHNlY3Vy
aXR5T3JpZ2luKTsKK30KKwordm9pZCBRdW90YVRyYWNrZXI6OnVwZGF0ZURhdGFiYXNlU2l6ZUFu
ZE9yaWdpblNwYWNlKAorICAgIGNvbnN0IFN0cmluZyYgc2VjdXJpdHlPcmlnaW4sIGNvbnN0IFN0
cmluZyYgZGF0YWJhc2VOYW1lLAorICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBkYXRhYmFzZVNpemUs
IHVuc2lnbmVkIGxvbmcgbG9uZyBzcGFjZUF2YWlsYWJsZSkKK3sKKyAgICBNdXRleExvY2tlciBs
b2NrRGF0YShtX2RhdGFHdWFyZCk7CisgICAgbV9zcGFjZUF2YWlsYWJsZVRvT3JpZ2lucy5zZXQo
c2VjdXJpdHlPcmlnaW4sIHNwYWNlQXZhaWxhYmxlKTsKKyAgICBIYXNoTWFwPFN0cmluZywgU2l6
ZU1hcD46Oml0ZXJhdG9yIGl0ID0gbV9kYXRhYmFzZVNpemVzLmFkZChzZWN1cml0eU9yaWdpbiwg
U2l6ZU1hcCgpKS5maXJzdDsKKyAgICBpdC0+c2Vjb25kLnNldChkYXRhYmFzZU5hbWUsIGRhdGFi
YXNlU2l6ZSk7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9jaHJvbWl1bS9RdW90YVRy
YWNrZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vUXVvdGFUcmFj
a2VyLmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vUXVvdGFUcmFj
a2VyLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICog
ICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0
cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlv
ciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAq
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFF1b3RhVHJhY2tlcl9o
CisjZGVmaW5lIFF1b3RhVHJhY2tlcl9oCisKKyNpbmNsdWRlICJDU3RyaW5nLmgiCisjaW5jbHVk
ZSAiU2VjdXJpdHlPcmlnaW4uaCIKKyNpbmNsdWRlICJTdHJpbmdIYXNoLmgiCisjaW5jbHVkZSA8
d3RmL0hhc2hNYXAuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBRdW90YVRyYWNr
ZXIgeworcHVibGljOgorICAgIHN0YXRpYyBRdW90YVRyYWNrZXImIGluc3RhbmNlKCk7CisKKyAg
ICB2b2lkIGdldERhdGFiYXNlU2l6ZUFuZFNwYWNlQXZhaWxhYmxlVG9PcmlnaW4oCisgICAgICAg
IGNvbnN0IFN0cmluZyYgc2VjdXJpdHlPcmlnaW4sIGNvbnN0IFN0cmluZyYgZGF0YWJhc2VOYW1l
LAorICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcqIGRhdGFiYXNlU2l6ZSwgdW5zaWduZWQgbG9u
ZyBsb25nKiBzcGFjZUF2YWlsYWJsZSk7CisgICAgdm9pZCB1cGRhdGVEYXRhYmFzZVNpemVBbmRT
cGFjZUF2YWlsYWJsZVRvT3JpZ2luKAorICAgICAgICBjb25zdCBTdHJpbmcmIHNlY3VyaXR5T3Jp
Z2luLCBjb25zdCBTdHJpbmcmIGRhdGFiYXNlTmFtZSwKKyAgICAgICAgdW5zaWduZWQgbG9uZyBs
b25nIGRhdGFiYXNlU2l6ZSwgdW5zaWduZWQgbG9uZyBsb25nIHNwYWNlQXZhaWxhYmxlKTsKKwor
cHJpdmF0ZToKKyAgICBRdW90YVRyYWNrZXIoKSB7IH0KKworICAgIHR5cGVkZWYgSGFzaE1hcDxT
dHJpbmcsIHVuc2lnbmVkIGxvbmcgbG9uZz4gU2l6ZU1hcDsKKyAgICBTaXplTWFwIG1fc3BhY2VB
dmFpbGFibGVUb09yaWdpbnM7CisgICAgSGFzaE1hcDxTdHJpbmcsIFNpemVNYXA+IG1fZGF0YWJh
c2VTaXplczsKKyAgICBNdXRleCBtX2RhdGFHdWFyZDsKK307CisKK30KKworI2VuZGlmIC8vIFF1
b3RhVHJhY2tlcl9oCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vU1FMVHJhbnNhY3Rp
b25DbGllbnRDaHJvbWl1bS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL2Nocm9t
aXVtL1NRTFRyYW5zYWN0aW9uQ2xpZW50Q2hyb21pdW0uY3BwCShyZXZpc2lvbiAwKQorKysgV2Vi
Q29yZS9zdG9yYWdlL2Nocm9taXVtL1NRTFRyYW5zYWN0aW9uQ2xpZW50Q2hyb21pdW0uY3BwCShy
ZXZpc2lvbiAwKQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUK
KyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5l
aXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNv
bnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVy
aXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl
biBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENP
UFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IlNRTFRyYW5zYWN0aW9uQ2xpZW50LmgiCisKKyNpbmNsdWRlICJEYXRhYmFzZS5oIgorI2luY2x1
ZGUgIkRhdGFiYXNlT2JzZXJ2ZXIuaCIKKyNpbmNsdWRlICJEYXRhYmFzZVRocmVhZC5oIgorI2lu
Y2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiU1FMVHJhbnNhY3Rpb24uaCIKKyNpbmNsdWRl
IDx3dGYvTWFpblRocmVhZC5oPgorCituYW1lc3BhY2UgeworCitzdGF0aWMgdm9pZCBub3RpZnlE
YXRhYmFzZUNoYW5nZWQodm9pZCogY29udGV4dCkgeworICAgIFdlYkNvcmU6OkRhdGFiYXNlT2Jz
ZXJ2ZXI6OmRhdGFiYXNlTW9kaWZpZWQoc3RhdGljX2Nhc3Q8V2ViQ29yZTo6RGF0YWJhc2UqPihj
b250ZXh0KSk7Cit9CisKK30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2b2lkIFNRTFRyYW5z
YWN0aW9uQ2xpZW50OjpkaWRDb21taXRUcmFuc2FjdGlvbihTUUxUcmFuc2FjdGlvbiogdHJhbnNh
Y3Rpb24pCit7CisgICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSB0cmFuc2FjdGlvbi0+ZGF0
YWJhc2UoKS0+ZG9jdW1lbnQoKS0+ZGF0YWJhc2VUaHJlYWQoKS0+Z2V0VGhyZWFkSUQoKSk7Cisg
ICAgaWYgKCF0cmFuc2FjdGlvbi0+aXNSZWFkT25seSgpKQorICAgICAgICBjYWxsT25NYWluVGhy
ZWFkKG5vdGlmeURhdGFiYXNlQ2hhbmdlZCwgdHJhbnNhY3Rpb24tPmRhdGFiYXNlKCkpOworfQor
Cit2b2lkIFNRTFRyYW5zYWN0aW9uQ2xpZW50OjpkaWRFeGVjdXRlU3RhdGVtZW50KFNRTFRyYW5z
YWN0aW9uKiB0cmFuc2FjdGlvbikKK3sKKyAgICAvLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0
ZXIgZXhlY3V0aW5nIGV2ZXJ5IHN0YXRlbWVudCB0aGF0IGNoYW5nZXMgdGhlIERCLgorICAgIC8v
IENocm9taXVtIGRvZXNuJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBhdCB0aGF0IHBvaW50LgorICAg
IEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gdHJhbnNhY3Rpb24tPmRhdGFiYXNlKCktPmRvY3Vt
ZW50KCktPmRhdGFiYXNlVGhyZWFkKCktPmdldFRocmVhZElEKCkpOworfQorCitib29sIFNRTFRy
YW5zYWN0aW9uQ2xpZW50OjpkaWRFeGNlZWRRdW90YShTUUxUcmFuc2FjdGlvbiopCit7CisgICAg
Ly8gQ2hyb21pdW0gZG9lcyBub3QgYWxsb3cgdXNlcnMgdG8gbWFudWFsbHkgY2hhbmdlIHRoZSBx
dW90YSBmb3IgYW4gb3JpZ2luIChmb3Igbm93LCBhdCBsZWFzdCkuCisgICAgLy8gRG9uJ3QgZG8g
YW55dGhpbmcuCisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICByZXR1cm4gZmFsc2U7
Cit9CisKK30K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>42130</attachid>
            <date>2009-10-29 13:10:20 -0700</date>
            <delta_ts>2009-10-29 13:49:12 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>16360</size>
            <attacher name="Dumitru Daniliuc">dumi</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MDI5NSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTkgQEAKKzIwMDktMTAtMjkgIER1bWl0cnUgRGFuaWxpdWMgIDxkdW1pQGNocm9t
aXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBBZGRpbmcgQ2hyb21pdW0ncyBEYXRhYmFzZVRyYWNrZXIgYW5kIFNRTFRyYW5zYWN0aW9uQ2xp
ZW50CisgICAgICAgIGltcGxlbWVudGF0aW9ucy4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzA3MDEKKworICAgICAgICAqIHN0b3JhZ2UvY2hyb21p
dW06IEFkZGVkLgorICAgICAgICAqIHN0b3JhZ2UvY2hyb21pdW0vRGF0YWJhc2VPYnNlcnZlci5o
OiBBZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL2Nocm9taXVtL0RhdGFiYXNlVHJhY2tlckNocm9t
aXVtLmNwcDogQWRkZWQuCisgICAgICAgICogc3RvcmFnZS9jaHJvbWl1bS9RdW90YVRyYWNrZXIu
Y3BwOiBBZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL2Nocm9taXVtL1F1b3RhVHJhY2tlci5oOiBB
ZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL2Nocm9taXVtL1NRTFRyYW5zYWN0aW9uQ2xpZW50Q2hy
b21pdW0uY3BwOiBBZGRlZC4KKwogMjAwOS0xMC0yOSAgR3VzdGF2byBOb3JvbmhhIFNpbHZhICA8
Z3VzdGF2by5ub3JvbmhhQGNvbGxhYm9yYS5jby51az4KIAogICAgICAgICBSZXZpZXdlZCBieSBY
YW4gTG9wZXouCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vRGF0YWJhc2VPYnNlcnZl
ci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9jaHJvbWl1bS9EYXRhYmFzZU9ic2Vy
dmVyLmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vRGF0YWJhc2VP
YnNlcnZlci5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4K
KyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBv
ZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUg
cHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIg
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
CisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBEYXRhYmFzZU9i
c2VydmVyX2gKKyNkZWZpbmUgRGF0YWJhc2VPYnNlcnZlcl9oCisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworY2xhc3MgRGF0YWJhc2U7CisKKy8vIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNs
YXNzIGlzIGluIHRoZSBXZWJLaXQgQVBJIChDaHJvbWl1bSBzb3VyY2UgdHJlZSkKKy8vIGluIHdl
YmtpdC9hcGkvc3JjL0RhdGFiYXNlT2JzZXJ2ZXIuY3BwLgorY2xhc3MgRGF0YWJhc2VPYnNlcnZl
ciB7CitwdWJsaWM6CisgICAgc3RhdGljIHZvaWQgZGF0YWJhc2VPcGVuZWQoRGF0YWJhc2UqKTsK
KyAgICBzdGF0aWMgdm9pZCBkYXRhYmFzZU1vZGlmaWVkKERhdGFiYXNlKik7CisgICAgc3RhdGlj
IHZvaWQgZGF0YWJhc2VDbG9zZWQoRGF0YWJhc2UqKTsKK307CisKK30KKworI2VuZGlmIC8vIERh
dGFiYXNlT2JzZXJ2ZXJfaApJbmRleDogV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL0RhdGFiYXNl
VHJhY2tlckNocm9taXVtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvY2hyb21p
dW0vRGF0YWJhc2VUcmFja2VyQ2hyb21pdW0uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9z
dG9yYWdlL2Nocm9taXVtL0RhdGFiYXNlVHJhY2tlckNocm9taXVtLmNwcAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUK
KyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJp
Z2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUg
bmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3Jz
IG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20K
KyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Np
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhP
TERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICog
QSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRI
RSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
CisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRGF0YWJhc2VU
cmFja2VyLmgiCisKKyNpbmNsdWRlICJDU3RyaW5nLmgiCisjaW5jbHVkZSAiRGF0YWJhc2UuaCIK
KyNpbmNsdWRlICJEYXRhYmFzZU9ic2VydmVyLmgiCisjaW5jbHVkZSAiRGF0YWJhc2VUaHJlYWQu
aCIKKyNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIlF1b3RhVHJhY2tlci5oIgorI2lu
Y2x1ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCisjaW5jbHVkZSAiU1FMaXRlRmlsZVN5c3RlbS5oIgor
I2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGlj
IHd0Zjo6SGFzaFNldDxEYXRhYmFzZSo+IG9wZW5EYXRhYmFzZXM7CisKK0RhdGFiYXNlVHJhY2tl
ciYgRGF0YWJhc2VUcmFja2VyOjp0cmFja2VyKCkKK3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FM
KERhdGFiYXNlVHJhY2tlciwgdHJhY2tlciwgKCkpOworICAgIHJldHVybiB0cmFja2VyOworfQor
CitEYXRhYmFzZVRyYWNrZXI6OkRhdGFiYXNlVHJhY2tlcigpCit7CisgICAgU1FMaXRlRmlsZVN5
c3RlbTo6cmVnaXN0ZXJTUUxpdGVWRlMoKTsKK30KKworYm9vbCBEYXRhYmFzZVRyYWNrZXI6OmNh
bkVzdGFibGlzaERhdGFiYXNlKERvY3VtZW50KiwgY29uc3QgU3RyaW5nJiwgY29uc3QgU3RyaW5n
JiwgdW5zaWduZWQgbG9uZykKK3sKKyAgICAvLyBJbiBDaHJvbWl1bSwgYSBkYXRhYmFzZSBjYW4g
YWx3YXlzIGJlIGVzdGFibGlzaGVkIChldmVuIHRob3VnaCB3ZSBtaWdodCBub3QKKyAgICAvLyBi
ZSBhYmxlIHRvIHdyaXRlIGFueXRoaW5nIHRvIGl0IGlmIHRoZSBxdW90YSBmb3IgdGhpcyBvcmln
aW4gd2FzIGV4Y2VlZGVkKQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIERhdGFiYXNlVHJh
Y2tlcjo6c2V0RGF0YWJhc2VEZXRhaWxzKFNlY3VyaXR5T3JpZ2luKiwgY29uc3QgU3RyaW5nJiwg
Y29uc3QgU3RyaW5nJiwgdW5zaWduZWQgbG9uZykKK3sKKyAgICAvLyBDaHJvbWl1bSBzZXRzIHRo
ZSBkYXRhYmFzZSBkZXRhaWxzIHdoZW4gdGhlIGRhdGFiYXNlIGlzIG9wZW5lZAorfQorCitTdHJp
bmcgRGF0YWJhc2VUcmFja2VyOjpmdWxsUGF0aEZvckRhdGFiYXNlKFNlY3VyaXR5T3JpZ2luKiBv
cmlnaW4sIGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCkKK3sKKyAgICByZXR1cm4gb3JpZ2luLT5k
YXRhYmFzZUlkZW50aWZpZXIoKSArICJfIiArIG5hbWUgKyAiLmRiIjsKK30KKwordm9pZCBEYXRh
YmFzZVRyYWNrZXI6OmFkZE9wZW5EYXRhYmFzZShEYXRhYmFzZSogZGF0YWJhc2UpCit7CisgICAg
QVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICBvcGVuRGF0YWJhc2VzLmFkZChkYXRhYmFzZSk7
CisgICAgRGF0YWJhc2VPYnNlcnZlcjo6ZGF0YWJhc2VPcGVuZWQoZGF0YWJhc2UpOworfQorCit2
b2lkIERhdGFiYXNlVHJhY2tlcjo6cmVtb3ZlT3BlbkRhdGFiYXNlKERhdGFiYXNlKiBkYXRhYmFz
ZSkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworICAgIG9wZW5EYXRhYmFzZXMucmVt
b3ZlKGRhdGFiYXNlKTsKKyAgICBEYXRhYmFzZU9ic2VydmVyOjpkYXRhYmFzZUNsb3NlZChkYXRh
YmFzZSk7Cit9CisKK3Vuc2lnbmVkIGxvbmcgbG9uZyBEYXRhYmFzZVRyYWNrZXI6OmdldE1heFNp
emVGb3JEYXRhYmFzZShjb25zdCBEYXRhYmFzZSogZGF0YWJhc2UpIGNvbnN0Cit7CisgICAgQVNT
RVJUKGN1cnJlbnRUaHJlYWQoKSA9PSBkYXRhYmFzZS0+ZG9jdW1lbnQoKS0+ZGF0YWJhc2VUaHJl
YWQoKS0+Z2V0VGhyZWFkSUQoKSk7CisgICAgU3RyaW5nIG9yaWdpbklkZW50aWZpZXIgPSBkYXRh
YmFzZS0+ZGF0YWJhc2VUaHJlYWRTZWN1cml0eU9yaWdpbigpLT5kYXRhYmFzZUlkZW50aWZpZXIo
KTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgc3BhY2VBdmFpbGFibGUgPSAwOworICAgIHVuc2ln
bmVkIGxvbmcgbG9uZyBkYXRhYmFzZVNpemUgPSAwOworICAgIFF1b3RhVHJhY2tlcjo6aW5zdGFu
Y2UoKS5nZXREYXRhYmFzZVNpemVBbmRTcGFjZUF2YWlsYWJsZVRvT3JpZ2luKAorICAgICAgICBk
YXRhYmFzZS0+c2VjdXJpdHlPcmlnaW4oKS0+ZGF0YWJhc2VJZGVudGlmaWVyKCksCisgICAgICAg
IGRhdGFiYXNlLT5zdHJpbmdJZGVudGlmaWVyKCksICZkYXRhYmFzZVNpemUsICZzcGFjZUF2YWls
YWJsZSk7CisgICAgcmV0dXJuIGRhdGFiYXNlU2l6ZSArIHNwYWNlQXZhaWxhYmxlOworfQorCit9
CkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vUXVvdGFUcmFja2VyLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vUXVvdGFUcmFja2VyLmNwcAkocmV2aXNp
b24gMCkKKysrIFdlYkNvcmUvc3RvcmFnZS9jaHJvbWl1bS9RdW90YVRyYWNrZXIuY3BwCShyZXZp
c2lvbiAwKQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAq
IGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRo
ZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRy
aWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZl
ZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBw
ZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlS
SUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlF1
b3RhVHJhY2tlci5oIgorCisjaW5jbHVkZSAiQ1N0cmluZy5oIgorI2luY2x1ZGUgPHd0Zi9TdGRM
aWJFeHRyYXMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitRdW90YVRyYWNrZXImIFF1b3Rh
VHJhY2tlcjo6aW5zdGFuY2UoKQoreworICAgIERFRklORV9TVEFUSUNfTE9DQUwoUXVvdGFUcmFj
a2VyLCB0cmFja2VyLCAoKSk7CisgICAgcmV0dXJuIHRyYWNrZXI7Cit9CisKK3ZvaWQgUXVvdGFU
cmFja2VyOjpnZXREYXRhYmFzZVNpemVBbmRTcGFjZUF2YWlsYWJsZVRvT3JpZ2luKAorICAgIGNv
bnN0IFN0cmluZyYgb3JpZ2luSWRlbnRpZmllciwgY29uc3QgU3RyaW5nJiBkYXRhYmFzZU5hbWUs
CisgICAgdW5zaWduZWQgbG9uZyBsb25nKiBkYXRhYmFzZVNpemUsIHVuc2lnbmVkIGxvbmcgbG9u
Zyogc3BhY2VBdmFpbGFibGUpCit7CisgICAgTXV0ZXhMb2NrZXIgbG9ja0RhdGEobV9kYXRhR3Vh
cmQpOworICAgIEFTU0VSVChtX2RhdGFiYXNlU2l6ZXMuY29udGFpbnMob3JpZ2luSWRlbnRpZmll
cikpOworICAgIEhhc2hNYXA8U3RyaW5nLCBTaXplTWFwPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBt
X2RhdGFiYXNlU2l6ZXMuZmluZChvcmlnaW5JZGVudGlmaWVyKTsKKyAgICBBU1NFUlQoaXQtPnNl
Y29uZC5jb250YWlucyhkYXRhYmFzZU5hbWUpKTsKKyAgICAqZGF0YWJhc2VTaXplID0gaXQtPnNl
Y29uZC5nZXQoZGF0YWJhc2VOYW1lKTsKKworICAgIEFTU0VSVChtX3NwYWNlQXZhaWxhYmxlVG9P
cmlnaW5zLmNvbnRhaW5zKG9yaWdpbklkZW50aWZpZXIpKTsKKyAgICAqc3BhY2VBdmFpbGFibGUg
PSBtX3NwYWNlQXZhaWxhYmxlVG9PcmlnaW5zLmdldChvcmlnaW5JZGVudGlmaWVyKTsKK30KKwor
dm9pZCBRdW90YVRyYWNrZXI6OnVwZGF0ZURhdGFiYXNlU2l6ZUFuZE9yaWdpblNwYWNlKAorICAg
IGNvbnN0IFN0cmluZyYgb3JpZ2luSWRlbnRpZmllciwgY29uc3QgU3RyaW5nJiBkYXRhYmFzZU5h
bWUsCisgICAgdW5zaWduZWQgbG9uZyBsb25nIGRhdGFiYXNlU2l6ZSwgdW5zaWduZWQgbG9uZyBs
b25nIHNwYWNlQXZhaWxhYmxlKQoreworICAgIE11dGV4TG9ja2VyIGxvY2tEYXRhKG1fZGF0YUd1
YXJkKTsKKyAgICBtX3NwYWNlQXZhaWxhYmxlVG9PcmlnaW5zLnNldChvcmlnaW5JZGVudGlmaWVy
LCBzcGFjZUF2YWlsYWJsZSk7CisgICAgSGFzaE1hcDxTdHJpbmcsIFNpemVNYXA+OjppdGVyYXRv
ciBpdCA9IG1fZGF0YWJhc2VTaXplcy5hZGQob3JpZ2luSWRlbnRpZmllciwgU2l6ZU1hcCgpKS5m
aXJzdDsKKyAgICBpdC0+c2Vjb25kLnNldChkYXRhYmFzZU5hbWUsIGRhdGFiYXNlU2l6ZSk7Cit9
CisKK30KSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9jaHJvbWl1bS9RdW90YVRyYWNrZXIuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vUXVvdGFUcmFja2VyLmgJKHJldmlz
aW9uIDApCisrKyBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vUXVvdGFUcmFja2VyLmgJKHJldmlz
aW9uIDApCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICog
Y29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhl
ciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJp
YnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVk
IGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBl
cm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJ
R0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFF1b3RhVHJhY2tlcl9oCisjZGVmaW5lIFF1
b3RhVHJhY2tlcl9oCisKKyNpbmNsdWRlICJDU3RyaW5nLmgiCisjaW5jbHVkZSAiU2VjdXJpdHlP
cmlnaW4uaCIKKyNpbmNsdWRlICJTdHJpbmdIYXNoLmgiCisjaW5jbHVkZSA8d3RmL0hhc2hNYXAu
aD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBRdW90YVRyYWNrZXIgeworcHVibGlj
OgorICAgIHN0YXRpYyBRdW90YVRyYWNrZXImIGluc3RhbmNlKCk7CisKKyAgICB2b2lkIGdldERh
dGFiYXNlU2l6ZUFuZFNwYWNlQXZhaWxhYmxlVG9PcmlnaW4oCisgICAgICAgIGNvbnN0IFN0cmlu
ZyYgb3JpZ2luSWRlbnRpZmllciwgY29uc3QgU3RyaW5nJiBkYXRhYmFzZU5hbWUsCisgICAgICAg
IHVuc2lnbmVkIGxvbmcgbG9uZyogZGF0YWJhc2VTaXplLCB1bnNpZ25lZCBsb25nIGxvbmcqIHNw
YWNlQXZhaWxhYmxlKTsKKyAgICB2b2lkIHVwZGF0ZURhdGFiYXNlU2l6ZUFuZFNwYWNlQXZhaWxh
YmxlVG9PcmlnaW4oCisgICAgICAgIGNvbnN0IFN0cmluZyYgb3JpZ2luSWRlbnRpZmllciwgY29u
c3QgU3RyaW5nJiBkYXRhYmFzZU5hbWUsCisgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBkYXRh
YmFzZVNpemUsIHVuc2lnbmVkIGxvbmcgbG9uZyBzcGFjZUF2YWlsYWJsZSk7CisKK3ByaXZhdGU6
CisgICAgUXVvdGFUcmFja2VyKCkgeyB9CisKKyAgICB0eXBlZGVmIEhhc2hNYXA8U3RyaW5nLCB1
bnNpZ25lZCBsb25nIGxvbmc+IFNpemVNYXA7CisgICAgU2l6ZU1hcCBtX3NwYWNlQXZhaWxhYmxl
VG9PcmlnaW5zOworICAgIEhhc2hNYXA8U3RyaW5nLCBTaXplTWFwPiBtX2RhdGFiYXNlU2l6ZXM7
CisgICAgTXV0ZXggbV9kYXRhR3VhcmQ7Cit9OworCit9CisKKyNlbmRpZiAvLyBRdW90YVRyYWNr
ZXJfaApJbmRleDogV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL1NRTFRyYW5zYWN0aW9uQ2xpZW50
Q2hyb21pdW0uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9jaHJvbWl1bS9TUUxU
cmFuc2FjdGlvbkNsaWVudENocm9taXVtLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvc3Rv
cmFnZS9jaHJvbWl1bS9TUUxUcmFuc2FjdGlvbkNsaWVudENocm9taXVtLmNwcAkocmV2aXNpb24g
MCkKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFy
ZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5
cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRo
ZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRv
cnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJv
bQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz
c2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQg
SE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisg
KiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
VEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTUUxUcmFu
c2FjdGlvbkNsaWVudC5oIgorCisjaW5jbHVkZSAiRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJEYXRh
YmFzZU9ic2VydmVyLmgiCisjaW5jbHVkZSAiRGF0YWJhc2VUaHJlYWQuaCIKKyNpbmNsdWRlICJE
b2N1bWVudC5oIgorI2luY2x1ZGUgIlNRTFRyYW5zYWN0aW9uLmgiCisjaW5jbHVkZSA8d3RmL01h
aW5UaHJlYWQuaD4KKworbmFtZXNwYWNlIHsKKworc3RhdGljIHZvaWQgbm90aWZ5RGF0YWJhc2VD
aGFuZ2VkKHZvaWQqIGNvbnRleHQpIHsKKyAgICBXZWJDb3JlOjpEYXRhYmFzZU9ic2VydmVyOjpk
YXRhYmFzZU1vZGlmaWVkKHN0YXRpY19jYXN0PFdlYkNvcmU6OkRhdGFiYXNlKj4oY29udGV4dCkp
OworfQorCit9CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9pZCBTUUxUcmFuc2FjdGlvbkNs
aWVudDo6ZGlkQ29tbWl0VHJhbnNhY3Rpb24oU1FMVHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uKQor
eworICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gdHJhbnNhY3Rpb24tPmRhdGFiYXNlKCkt
PmRvY3VtZW50KCktPmRhdGFiYXNlVGhyZWFkKCktPmdldFRocmVhZElEKCkpOworICAgIGlmICgh
dHJhbnNhY3Rpb24tPmlzUmVhZE9ubHkoKSkKKyAgICAgICAgY2FsbE9uTWFpblRocmVhZChub3Rp
ZnlEYXRhYmFzZUNoYW5nZWQsIHRyYW5zYWN0aW9uLT5kYXRhYmFzZSgpKTsKK30KKwordm9pZCBT
UUxUcmFuc2FjdGlvbkNsaWVudDo6ZGlkRXhlY3V0ZVN0YXRlbWVudChTUUxUcmFuc2FjdGlvbiog
dHJhbnNhY3Rpb24pCit7CisgICAgLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGV4ZWN1
dGluZyBldmVyeSBzdGF0ZW1lbnQgdGhhdCBjaGFuZ2VzIHRoZSBEQi4KKyAgICAvLyBDaHJvbWl1
bSBkb2Vzbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgYXQgdGhhdCBwb2ludC4KKyAgICBBU1NFUlQo
Y3VycmVudFRocmVhZCgpID09IHRyYW5zYWN0aW9uLT5kYXRhYmFzZSgpLT5kb2N1bWVudCgpLT5k
YXRhYmFzZVRocmVhZCgpLT5nZXRUaHJlYWRJRCgpKTsKK30KKworYm9vbCBTUUxUcmFuc2FjdGlv
bkNsaWVudDo6ZGlkRXhjZWVkUXVvdGEoU1FMVHJhbnNhY3Rpb24qKQoreworICAgIC8vIENocm9t
aXVtIGRvZXMgbm90IGFsbG93IHVzZXJzIHRvIG1hbnVhbGx5IGNoYW5nZSB0aGUgcXVvdGEgZm9y
IGFuIG9yaWdpbiAoZm9yIG5vdywgYXQgbGVhc3QpLgorICAgIC8vIERvbid0IGRvIGFueXRoaW5n
LgorICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>42135</attachid>
            <date>2009-10-29 13:49:12 -0700</date>
            <delta_ts>2009-10-30 13:01:36 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>16352</size>
            <attacher name="Dumitru Daniliuc">dumi</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MDI5NSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTkgQEAKKzIwMDktMTAtMjkgIER1bWl0cnUgRGFuaWxpdWMgIDxkdW1pQGNocm9t
aXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBBZGRpbmcgQ2hyb21pdW0ncyBEYXRhYmFzZVRyYWNrZXIgYW5kIFNRTFRyYW5zYWN0aW9uQ2xp
ZW50CisgICAgICAgIGltcGxlbWVudGF0aW9ucy4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzA3MDEKKworICAgICAgICAqIHN0b3JhZ2UvY2hyb21p
dW06IEFkZGVkLgorICAgICAgICAqIHN0b3JhZ2UvY2hyb21pdW0vRGF0YWJhc2VPYnNlcnZlci5o
OiBBZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL2Nocm9taXVtL0RhdGFiYXNlVHJhY2tlckNocm9t
aXVtLmNwcDogQWRkZWQuCisgICAgICAgICogc3RvcmFnZS9jaHJvbWl1bS9RdW90YVRyYWNrZXIu
Y3BwOiBBZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL2Nocm9taXVtL1F1b3RhVHJhY2tlci5oOiBB
ZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL2Nocm9taXVtL1NRTFRyYW5zYWN0aW9uQ2xpZW50Q2hy
b21pdW0uY3BwOiBBZGRlZC4KKwogMjAwOS0xMC0yOSAgR3VzdGF2byBOb3JvbmhhIFNpbHZhICA8
Z3VzdGF2by5ub3JvbmhhQGNvbGxhYm9yYS5jby51az4KIAogICAgICAgICBSZXZpZXdlZCBieSBY
YW4gTG9wZXouCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vRGF0YWJhc2VPYnNlcnZl
ci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9jaHJvbWl1bS9EYXRhYmFzZU9ic2Vy
dmVyLmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vRGF0YWJhc2VP
YnNlcnZlci5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4K
KyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBv
ZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUg
cHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIg
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
CisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBEYXRhYmFzZU9i
c2VydmVyX2gKKyNkZWZpbmUgRGF0YWJhc2VPYnNlcnZlcl9oCisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworY2xhc3MgRGF0YWJhc2U7CisKKy8vIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNs
YXNzIGlzIGluIHRoZSBXZWJLaXQgQVBJIChDaHJvbWl1bSBzb3VyY2UgdHJlZSkKKy8vIGluIHdl
YmtpdC9hcGkvc3JjL0RhdGFiYXNlT2JzZXJ2ZXIuY3BwLgorY2xhc3MgRGF0YWJhc2VPYnNlcnZl
ciB7CitwdWJsaWM6CisgICAgc3RhdGljIHZvaWQgZGF0YWJhc2VPcGVuZWQoRGF0YWJhc2UqKTsK
KyAgICBzdGF0aWMgdm9pZCBkYXRhYmFzZU1vZGlmaWVkKERhdGFiYXNlKik7CisgICAgc3RhdGlj
IHZvaWQgZGF0YWJhc2VDbG9zZWQoRGF0YWJhc2UqKTsKK307CisKK30KKworI2VuZGlmIC8vIERh
dGFiYXNlT2JzZXJ2ZXJfaApJbmRleDogV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL0RhdGFiYXNl
VHJhY2tlckNocm9taXVtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvY2hyb21p
dW0vRGF0YWJhc2VUcmFja2VyQ2hyb21pdW0uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9z
dG9yYWdlL2Nocm9taXVtL0RhdGFiYXNlVHJhY2tlckNocm9taXVtLmNwcAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUK
KyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJp
Z2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUg
bmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3Jz
IG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20K
KyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Np
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhP
TERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICog
QSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRI
RSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
CisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRGF0YWJhc2VU
cmFja2VyLmgiCisKKyNpbmNsdWRlICJDU3RyaW5nLmgiCisjaW5jbHVkZSAiRGF0YWJhc2UuaCIK
KyNpbmNsdWRlICJEYXRhYmFzZU9ic2VydmVyLmgiCisjaW5jbHVkZSAiRGF0YWJhc2VUaHJlYWQu
aCIKKyNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIlF1b3RhVHJhY2tlci5oIgorI2lu
Y2x1ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCisjaW5jbHVkZSAiU1FMaXRlRmlsZVN5c3RlbS5oIgor
I2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGlj
IHd0Zjo6SGFzaFNldDxEYXRhYmFzZSo+IG9wZW5EYXRhYmFzZXM7CisKK0RhdGFiYXNlVHJhY2tl
ciYgRGF0YWJhc2VUcmFja2VyOjp0cmFja2VyKCkKK3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FM
KERhdGFiYXNlVHJhY2tlciwgdHJhY2tlciwgKCkpOworICAgIHJldHVybiB0cmFja2VyOworfQor
CitEYXRhYmFzZVRyYWNrZXI6OkRhdGFiYXNlVHJhY2tlcigpCit7CisgICAgU1FMaXRlRmlsZVN5
c3RlbTo6cmVnaXN0ZXJTUUxpdGVWRlMoKTsKK30KKworYm9vbCBEYXRhYmFzZVRyYWNrZXI6OmNh
bkVzdGFibGlzaERhdGFiYXNlKERvY3VtZW50KiwgY29uc3QgU3RyaW5nJiwgY29uc3QgU3RyaW5n
JiwgdW5zaWduZWQgbG9uZykKK3sKKyAgICAvLyBJbiBDaHJvbWl1bSwgYSBkYXRhYmFzZSBjYW4g
YWx3YXlzIGJlIGVzdGFibGlzaGVkIChldmVuIHRob3VnaCB3ZSBtaWdodCBub3QKKyAgICAvLyBi
ZSBhYmxlIHRvIHdyaXRlIGFueXRoaW5nIHRvIGl0IGlmIHRoZSBxdW90YSBmb3IgdGhpcyBvcmln
aW4gd2FzIGV4Y2VlZGVkKQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIERhdGFiYXNlVHJh
Y2tlcjo6c2V0RGF0YWJhc2VEZXRhaWxzKFNlY3VyaXR5T3JpZ2luKiwgY29uc3QgU3RyaW5nJiwg
Y29uc3QgU3RyaW5nJiwgdW5zaWduZWQgbG9uZykKK3sKKyAgICAvLyBDaHJvbWl1bSBzZXRzIHRo
ZSBkYXRhYmFzZSBkZXRhaWxzIHdoZW4gdGhlIGRhdGFiYXNlIGlzIG9wZW5lZAorfQorCitTdHJp
bmcgRGF0YWJhc2VUcmFja2VyOjpmdWxsUGF0aEZvckRhdGFiYXNlKFNlY3VyaXR5T3JpZ2luKiBv
cmlnaW4sIGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCkKK3sKKyAgICByZXR1cm4gb3JpZ2luLT5k
YXRhYmFzZUlkZW50aWZpZXIoKSArICIvIiArIG5hbWU7Cit9CisKK3ZvaWQgRGF0YWJhc2VUcmFj
a2VyOjphZGRPcGVuRGF0YWJhc2UoRGF0YWJhc2UqIGRhdGFiYXNlKQoreworICAgIEFTU0VSVChp
c01haW5UaHJlYWQoKSk7CisgICAgb3BlbkRhdGFiYXNlcy5hZGQoZGF0YWJhc2UpOworICAgIERh
dGFiYXNlT2JzZXJ2ZXI6OmRhdGFiYXNlT3BlbmVkKGRhdGFiYXNlKTsKK30KKwordm9pZCBEYXRh
YmFzZVRyYWNrZXI6OnJlbW92ZU9wZW5EYXRhYmFzZShEYXRhYmFzZSogZGF0YWJhc2UpCit7Cisg
ICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICBvcGVuRGF0YWJhc2VzLnJlbW92ZShkYXRh
YmFzZSk7CisgICAgRGF0YWJhc2VPYnNlcnZlcjo6ZGF0YWJhc2VDbG9zZWQoZGF0YWJhc2UpOwor
fQorCit1bnNpZ25lZCBsb25nIGxvbmcgRGF0YWJhc2VUcmFja2VyOjpnZXRNYXhTaXplRm9yRGF0
YWJhc2UoY29uc3QgRGF0YWJhc2UqIGRhdGFiYXNlKSBjb25zdAoreworICAgIEFTU0VSVChjdXJy
ZW50VGhyZWFkKCkgPT0gZGF0YWJhc2UtPmRvY3VtZW50KCktPmRhdGFiYXNlVGhyZWFkKCktPmdl
dFRocmVhZElEKCkpOworICAgIFN0cmluZyBvcmlnaW5JZGVudGlmaWVyID0gZGF0YWJhc2UtPmRh
dGFiYXNlVGhyZWFkU2VjdXJpdHlPcmlnaW4oKS0+ZGF0YWJhc2VJZGVudGlmaWVyKCk7CisgICAg
dW5zaWduZWQgbG9uZyBsb25nIHNwYWNlQXZhaWxhYmxlID0gMDsKKyAgICB1bnNpZ25lZCBsb25n
IGxvbmcgZGF0YWJhc2VTaXplID0gMDsKKyAgICBRdW90YVRyYWNrZXI6Omluc3RhbmNlKCkuZ2V0
RGF0YWJhc2VTaXplQW5kU3BhY2VBdmFpbGFibGVUb09yaWdpbigKKyAgICAgICAgZGF0YWJhc2Ut
PnNlY3VyaXR5T3JpZ2luKCktPmRhdGFiYXNlSWRlbnRpZmllcigpLAorICAgICAgICBkYXRhYmFz
ZS0+c3RyaW5nSWRlbnRpZmllcigpLCAmZGF0YWJhc2VTaXplLCAmc3BhY2VBdmFpbGFibGUpOwor
ICAgIHJldHVybiBkYXRhYmFzZVNpemUgKyBzcGFjZUF2YWlsYWJsZTsKK30KKworfQpJbmRleDog
V2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL1F1b3RhVHJhY2tlci5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL1F1b3RhVHJhY2tlci5jcHAJKHJldmlzaW9uIDApCisr
KyBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vUXVvdGFUcmFja2VyLmNwcAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQor
ICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmln
aHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBu
YW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMg
bWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQor
ICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9M
REVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhF
IENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwK
KyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJRdW90YVRyYWNr
ZXIuaCIKKworI2luY2x1ZGUgIkNTdHJpbmcuaCIKKyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFz
Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUXVvdGFUcmFja2VyJiBRdW90YVRyYWNrZXI6
Omluc3RhbmNlKCkKK3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFF1b3RhVHJhY2tlciwgdHJh
Y2tlciwgKCkpOworICAgIHJldHVybiB0cmFja2VyOworfQorCit2b2lkIFF1b3RhVHJhY2tlcjo6
Z2V0RGF0YWJhc2VTaXplQW5kU3BhY2VBdmFpbGFibGVUb09yaWdpbigKKyAgICBjb25zdCBTdHJp
bmcmIG9yaWdpbklkZW50aWZpZXIsIGNvbnN0IFN0cmluZyYgZGF0YWJhc2VOYW1lLAorICAgIHVu
c2lnbmVkIGxvbmcgbG9uZyogZGF0YWJhc2VTaXplLCB1bnNpZ25lZCBsb25nIGxvbmcqIHNwYWNl
QXZhaWxhYmxlKQoreworICAgIE11dGV4TG9ja2VyIGxvY2tEYXRhKG1fZGF0YUd1YXJkKTsKKyAg
ICBBU1NFUlQobV9kYXRhYmFzZVNpemVzLmNvbnRhaW5zKG9yaWdpbklkZW50aWZpZXIpKTsKKyAg
ICBIYXNoTWFwPFN0cmluZywgU2l6ZU1hcD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9kYXRhYmFz
ZVNpemVzLmZpbmQob3JpZ2luSWRlbnRpZmllcik7CisgICAgQVNTRVJUKGl0LT5zZWNvbmQuY29u
dGFpbnMoZGF0YWJhc2VOYW1lKSk7CisgICAgKmRhdGFiYXNlU2l6ZSA9IGl0LT5zZWNvbmQuZ2V0
KGRhdGFiYXNlTmFtZSk7CisKKyAgICBBU1NFUlQobV9zcGFjZUF2YWlsYWJsZVRvT3JpZ2lucy5j
b250YWlucyhvcmlnaW5JZGVudGlmaWVyKSk7CisgICAgKnNwYWNlQXZhaWxhYmxlID0gbV9zcGFj
ZUF2YWlsYWJsZVRvT3JpZ2lucy5nZXQob3JpZ2luSWRlbnRpZmllcik7Cit9CisKK3ZvaWQgUXVv
dGFUcmFja2VyOjp1cGRhdGVEYXRhYmFzZVNpemVBbmRPcmlnaW5TcGFjZSgKKyAgICBjb25zdCBT
dHJpbmcmIG9yaWdpbklkZW50aWZpZXIsIGNvbnN0IFN0cmluZyYgZGF0YWJhc2VOYW1lLAorICAg
IHVuc2lnbmVkIGxvbmcgbG9uZyBkYXRhYmFzZVNpemUsIHVuc2lnbmVkIGxvbmcgbG9uZyBzcGFj
ZUF2YWlsYWJsZSkKK3sKKyAgICBNdXRleExvY2tlciBsb2NrRGF0YShtX2RhdGFHdWFyZCk7Cisg
ICAgbV9zcGFjZUF2YWlsYWJsZVRvT3JpZ2lucy5zZXQob3JpZ2luSWRlbnRpZmllciwgc3BhY2VB
dmFpbGFibGUpOworICAgIEhhc2hNYXA8U3RyaW5nLCBTaXplTWFwPjo6aXRlcmF0b3IgaXQgPSBt
X2RhdGFiYXNlU2l6ZXMuYWRkKG9yaWdpbklkZW50aWZpZXIsIFNpemVNYXAoKSkuZmlyc3Q7Cisg
ICAgaXQtPnNlY29uZC5zZXQoZGF0YWJhc2VOYW1lLCBkYXRhYmFzZVNpemUpOworfQorCit9Cklu
ZGV4OiBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vUXVvdGFUcmFja2VyLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL1F1b3RhVHJhY2tlci5oCShyZXZpc2lvbiAwKQor
KysgV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL1F1b3RhVHJhY2tlci5oCShyZXZpc2lvbiAwKQpA
QCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisg
KiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdo
dCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5h
bWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBt
YXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisg
KiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xE
RVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEg
UEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg
Q09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAor
ICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2lmbmRlZiBRdW90YVRyYWNrZXJfaAorI2RlZmluZSBRdW90YVRyYWNr
ZXJfaAorCisjaW5jbHVkZSAiQ1N0cmluZy5oIgorI2luY2x1ZGUgIlNlY3VyaXR5T3JpZ2luLmgi
CisjaW5jbHVkZSAiU3RyaW5nSGFzaC5oIgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUXVvdGFUcmFja2VyIHsKK3B1YmxpYzoKKyAgICBz
dGF0aWMgUXVvdGFUcmFja2VyJiBpbnN0YW5jZSgpOworCisgICAgdm9pZCBnZXREYXRhYmFzZVNp
emVBbmRTcGFjZUF2YWlsYWJsZVRvT3JpZ2luKAorICAgICAgICBjb25zdCBTdHJpbmcmIG9yaWdp
bklkZW50aWZpZXIsIGNvbnN0IFN0cmluZyYgZGF0YWJhc2VOYW1lLAorICAgICAgICB1bnNpZ25l
ZCBsb25nIGxvbmcqIGRhdGFiYXNlU2l6ZSwgdW5zaWduZWQgbG9uZyBsb25nKiBzcGFjZUF2YWls
YWJsZSk7CisgICAgdm9pZCB1cGRhdGVEYXRhYmFzZVNpemVBbmRTcGFjZUF2YWlsYWJsZVRvT3Jp
Z2luKAorICAgICAgICBjb25zdCBTdHJpbmcmIG9yaWdpbklkZW50aWZpZXIsIGNvbnN0IFN0cmlu
ZyYgZGF0YWJhc2VOYW1lLAorICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgZGF0YWJhc2VTaXpl
LCB1bnNpZ25lZCBsb25nIGxvbmcgc3BhY2VBdmFpbGFibGUpOworCitwcml2YXRlOgorICAgIFF1
b3RhVHJhY2tlcigpIHsgfQorCisgICAgdHlwZWRlZiBIYXNoTWFwPFN0cmluZywgdW5zaWduZWQg
bG9uZyBsb25nPiBTaXplTWFwOworICAgIFNpemVNYXAgbV9zcGFjZUF2YWlsYWJsZVRvT3JpZ2lu
czsKKyAgICBIYXNoTWFwPFN0cmluZywgU2l6ZU1hcD4gbV9kYXRhYmFzZVNpemVzOworICAgIE11
dGV4IG1fZGF0YUd1YXJkOworfTsKKworfQorCisjZW5kaWYgLy8gUXVvdGFUcmFja2VyX2gKSW5k
ZXg6IFdlYkNvcmUvc3RvcmFnZS9jaHJvbWl1bS9TUUxUcmFuc2FjdGlvbkNsaWVudENocm9taXVt
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vU1FMVHJhbnNhY3Rp
b25DbGllbnRDaHJvbWl1bS5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3N0b3JhZ2UvY2hy
b21pdW0vU1FMVHJhbnNhY3Rpb25DbGllbnRDaHJvbWl1bS5jcHAJKHJldmlzaW9uIDApCkBAIC0w
LDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1l
dDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
cgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBv
ZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBi
ZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRo
aXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMg
QU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZ
UklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU1FMVHJhbnNhY3Rpb25D
bGllbnQuaCIKKworI2luY2x1ZGUgIkRhdGFiYXNlLmgiCisjaW5jbHVkZSAiRGF0YWJhc2VPYnNl
cnZlci5oIgorI2luY2x1ZGUgIkRhdGFiYXNlVGhyZWFkLmgiCisjaW5jbHVkZSAiRG9jdW1lbnQu
aCIKKyNpbmNsdWRlICJTUUxUcmFuc2FjdGlvbi5oIgorI2luY2x1ZGUgPHd0Zi9NYWluVGhyZWFk
Lmg+CisKK25hbWVzcGFjZSB7CisKK3N0YXRpYyB2b2lkIG5vdGlmeURhdGFiYXNlQ2hhbmdlZCh2
b2lkKiBjb250ZXh0KSB7CisgICAgV2ViQ29yZTo6RGF0YWJhc2VPYnNlcnZlcjo6ZGF0YWJhc2VN
b2RpZmllZChzdGF0aWNfY2FzdDxXZWJDb3JlOjpEYXRhYmFzZSo+KGNvbnRleHQpKTsKK30KKwor
fQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3ZvaWQgU1FMVHJhbnNhY3Rpb25DbGllbnQ6OmRp
ZENvbW1pdFRyYW5zYWN0aW9uKFNRTFRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbikKK3sKKyAgICBB
U1NFUlQoY3VycmVudFRocmVhZCgpID09IHRyYW5zYWN0aW9uLT5kYXRhYmFzZSgpLT5kb2N1bWVu
dCgpLT5kYXRhYmFzZVRocmVhZCgpLT5nZXRUaHJlYWRJRCgpKTsKKyAgICBpZiAoIXRyYW5zYWN0
aW9uLT5pc1JlYWRPbmx5KCkpCisgICAgICAgIGNhbGxPbk1haW5UaHJlYWQobm90aWZ5RGF0YWJh
c2VDaGFuZ2VkLCB0cmFuc2FjdGlvbi0+ZGF0YWJhc2UoKSk7Cit9CisKK3ZvaWQgU1FMVHJhbnNh
Y3Rpb25DbGllbnQ6OmRpZEV4ZWN1dGVTdGF0ZW1lbnQoU1FMVHJhbnNhY3Rpb24qIHRyYW5zYWN0
aW9uKQoreworICAgIC8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBleGVjdXRpbmcgZXZl
cnkgc3RhdGVtZW50IHRoYXQgY2hhbmdlcyB0aGUgREIuCisgICAgLy8gQ2hyb21pdW0gZG9lc24n
dCBuZWVkIHRvIGRvIGFueXRoaW5nIGF0IHRoYXQgcG9pbnQuCisgICAgQVNTRVJUKGN1cnJlbnRU
aHJlYWQoKSA9PSB0cmFuc2FjdGlvbi0+ZGF0YWJhc2UoKS0+ZG9jdW1lbnQoKS0+ZGF0YWJhc2VU
aHJlYWQoKS0+Z2V0VGhyZWFkSUQoKSk7Cit9CisKK2Jvb2wgU1FMVHJhbnNhY3Rpb25DbGllbnQ6
OmRpZEV4Y2VlZFF1b3RhKFNRTFRyYW5zYWN0aW9uKikKK3sKKyAgICAvLyBDaHJvbWl1bSBkb2Vz
IG5vdCBhbGxvdyB1c2VycyB0byBtYW51YWxseSBjaGFuZ2UgdGhlIHF1b3RhIGZvciBhbiBvcmln
aW4gKGZvciBub3csIGF0IGxlYXN0KS4KKyAgICAvLyBEb24ndCBkbyBhbnl0aGluZy4KKyAgICBB
U1NFUlQoaXNNYWluVGhyZWFkKCkpOworICAgIHJldHVybiBmYWxzZTsKK30KKworfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>42228</attachid>
            <date>2009-10-30 13:01:36 -0700</date>
            <delta_ts>2009-10-30 14:27:03 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>16671</size>
            <attacher name="Dumitru Daniliuc">dumi</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MDI5NSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTkgQEAKKzIwMDktMTAtMjkgIER1bWl0cnUgRGFuaWxpdWMgIDxkdW1pQGNocm9t
aXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBBZGRpbmcgQ2hyb21pdW0ncyBEYXRhYmFzZVRyYWNrZXIgYW5kIFNRTFRyYW5zYWN0aW9uQ2xp
ZW50CisgICAgICAgIGltcGxlbWVudGF0aW9ucy4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzA3MDEKKworICAgICAgICAqIHN0b3JhZ2UvY2hyb21p
dW06IEFkZGVkLgorICAgICAgICAqIHN0b3JhZ2UvY2hyb21pdW0vRGF0YWJhc2VPYnNlcnZlci5o
OiBBZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL2Nocm9taXVtL0RhdGFiYXNlVHJhY2tlckNocm9t
aXVtLmNwcDogQWRkZWQuCisgICAgICAgICogc3RvcmFnZS9jaHJvbWl1bS9RdW90YVRyYWNrZXIu
Y3BwOiBBZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL2Nocm9taXVtL1F1b3RhVHJhY2tlci5oOiBB
ZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL2Nocm9taXVtL1NRTFRyYW5zYWN0aW9uQ2xpZW50Q2hy
b21pdW0uY3BwOiBBZGRlZC4KKwogMjAwOS0xMC0yOSAgR3VzdGF2byBOb3JvbmhhIFNpbHZhICA8
Z3VzdGF2by5ub3JvbmhhQGNvbGxhYm9yYS5jby51az4KIAogICAgICAgICBSZXZpZXdlZCBieSBY
YW4gTG9wZXouCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vRGF0YWJhc2VPYnNlcnZl
ci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9jaHJvbWl1bS9EYXRhYmFzZU9ic2Vy
dmVyLmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vRGF0YWJhc2VP
YnNlcnZlci5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4K
KyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBv
ZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUg
cHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIg
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
CisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBEYXRhYmFzZU9i
c2VydmVyX2gKKyNkZWZpbmUgRGF0YWJhc2VPYnNlcnZlcl9oCisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworY2xhc3MgRGF0YWJhc2U7CisKKy8vIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNs
YXNzIGlzIGluIHRoZSBXZWJLaXQgQVBJIChDaHJvbWl1bSBzb3VyY2UgdHJlZSkKKy8vIGluIHdl
YmtpdC9hcGkvc3JjL0RhdGFiYXNlT2JzZXJ2ZXIuY3BwLgorY2xhc3MgRGF0YWJhc2VPYnNlcnZl
ciB7CitwdWJsaWM6CisgICAgc3RhdGljIHZvaWQgZGF0YWJhc2VPcGVuZWQoRGF0YWJhc2UqKTsK
KyAgICBzdGF0aWMgdm9pZCBkYXRhYmFzZU1vZGlmaWVkKERhdGFiYXNlKik7CisgICAgc3RhdGlj
IHZvaWQgZGF0YWJhc2VDbG9zZWQoRGF0YWJhc2UqKTsKK307CisKK30KKworI2VuZGlmIC8vIERh
dGFiYXNlT2JzZXJ2ZXJfaApJbmRleDogV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL0RhdGFiYXNl
VHJhY2tlckNocm9taXVtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvY2hyb21p
dW0vRGF0YWJhc2VUcmFja2VyQ2hyb21pdW0uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9z
dG9yYWdlL2Nocm9taXVtL0RhdGFiYXNlVHJhY2tlckNocm9taXVtLmNwcAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUK
KyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJp
Z2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUg
bmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3Jz
IG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20K
KyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Np
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhP
TERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICog
QSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRI
RSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
CisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRGF0YWJhc2VU
cmFja2VyLmgiCisKKyNpbmNsdWRlICJDU3RyaW5nLmgiCisjaW5jbHVkZSAiRGF0YWJhc2UuaCIK
KyNpbmNsdWRlICJEYXRhYmFzZU9ic2VydmVyLmgiCisjaW5jbHVkZSAiRGF0YWJhc2VUaHJlYWQu
aCIKKyNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIlF1b3RhVHJhY2tlci5oIgorI2lu
Y2x1ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCisjaW5jbHVkZSAiU1FMaXRlRmlsZVN5c3RlbS5oIgor
I2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordHlwZWRl
ZiBIYXNoU2V0PERhdGFiYXNlKj4gRGF0YWJhc2VTZXQ7CisKK3N0YXRpYyBEYXRhYmFzZVNldCYg
b3BlbkRhdGFiYXNlcygpCit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChEYXRhYmFzZXNTZXQs
IHN0YXRpY09wZW5EYXRhYmFzZXMsICgpKTsKKyAgICByZXR1cm4gc3RhdGljT3BlbkRhdGFiYXNl
czsKK30KKworRGF0YWJhc2VUcmFja2VyJiBEYXRhYmFzZVRyYWNrZXI6OnRyYWNrZXIoKQorewor
ICAgIERFRklORV9TVEFUSUNfTE9DQUwoRGF0YWJhc2VUcmFja2VyLCB0cmFja2VyLCAoKSk7Cisg
ICAgcmV0dXJuIHRyYWNrZXI7Cit9CisKK0RhdGFiYXNlVHJhY2tlcjo6RGF0YWJhc2VUcmFja2Vy
KCkKK3sKKyAgICBTUUxpdGVGaWxlU3lzdGVtOjpyZWdpc3RlclNRTGl0ZVZGUygpOworfQorCiti
b29sIERhdGFiYXNlVHJhY2tlcjo6Y2FuRXN0YWJsaXNoRGF0YWJhc2UoRG9jdW1lbnQqLCBjb25z
dCBTdHJpbmcmLCBjb25zdCBTdHJpbmcmLCB1bnNpZ25lZCBsb25nKQoreworICAgIC8vIEluIENo
cm9taXVtLCBhIGRhdGFiYXNlIGNhbiBhbHdheXMgYmUgZXN0YWJsaXNoZWQgKGV2ZW4gdGhvdWdo
IHdlIG1pZ2h0IG5vdAorICAgIC8vIGJlIGFibGUgdG8gd3JpdGUgYW55dGhpbmcgdG8gaXQgaWYg
dGhlIHF1b3RhIGZvciB0aGlzIG9yaWdpbiB3YXMgZXhjZWVkZWQpCisgICAgcmV0dXJuIHRydWU7
Cit9CisKK3ZvaWQgRGF0YWJhc2VUcmFja2VyOjpzZXREYXRhYmFzZURldGFpbHMoU2VjdXJpdHlP
cmlnaW4qLCBjb25zdCBTdHJpbmcmLCBjb25zdCBTdHJpbmcmLCB1bnNpZ25lZCBsb25nKQorewor
ICAgIC8vIENocm9taXVtIHNldHMgdGhlIGRhdGFiYXNlIGRldGFpbHMgd2hlbiB0aGUgZGF0YWJh
c2UgaXMgb3BlbmVkCit9CisKK1N0cmluZyBEYXRhYmFzZVRyYWNrZXI6OmZ1bGxQYXRoRm9yRGF0
YWJhc2UoU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lLCBib29sKQor
eworICAgIHJldHVybiBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpICsgIi8iICsgbmFtZTsK
K30KKwordm9pZCBEYXRhYmFzZVRyYWNrZXI6OmFkZE9wZW5EYXRhYmFzZShEYXRhYmFzZSogZGF0
YWJhc2UpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICBvcGVuRGF0YWJhc2Vz
KCkuYWRkKGRhdGFiYXNlKTsKKyAgICBEYXRhYmFzZU9ic2VydmVyOjpkYXRhYmFzZU9wZW5lZChk
YXRhYmFzZSk7Cit9CisKK3ZvaWQgRGF0YWJhc2VUcmFja2VyOjpyZW1vdmVPcGVuRGF0YWJhc2Uo
RGF0YWJhc2UqIGRhdGFiYXNlKQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAg
b3BlbkRhdGFiYXNlcygpLnJlbW92ZShkYXRhYmFzZSk7CisgICAgRGF0YWJhc2VPYnNlcnZlcjo6
ZGF0YWJhc2VDbG9zZWQoZGF0YWJhc2UpOworfQorCit1bnNpZ25lZCBsb25nIGxvbmcgRGF0YWJh
c2VUcmFja2VyOjpnZXRNYXhTaXplRm9yRGF0YWJhc2UoY29uc3QgRGF0YWJhc2UqIGRhdGFiYXNl
KSBjb25zdAoreworICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gZGF0YWJhc2UtPmRvY3Vt
ZW50KCktPmRhdGFiYXNlVGhyZWFkKCktPmdldFRocmVhZElEKCkpOworICAgIFN0cmluZyBvcmln
aW5JZGVudGlmaWVyID0gZGF0YWJhc2UtPmRhdGFiYXNlVGhyZWFkU2VjdXJpdHlPcmlnaW4oKS0+
ZGF0YWJhc2VJZGVudGlmaWVyKCk7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIHNwYWNlQXZhaWxh
YmxlID0gMDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgZGF0YWJhc2VTaXplID0gMDsKKyAgICBR
dW90YVRyYWNrZXI6Omluc3RhbmNlKCkuZ2V0RGF0YWJhc2VTaXplQW5kU3BhY2VBdmFpbGFibGVU
b09yaWdpbigKKyAgICAgICAgZGF0YWJhc2UtPnNlY3VyaXR5T3JpZ2luKCktPmRhdGFiYXNlSWRl
bnRpZmllcigpLAorICAgICAgICBkYXRhYmFzZS0+c3RyaW5nSWRlbnRpZmllcigpLCAmZGF0YWJh
c2VTaXplLCAmc3BhY2VBdmFpbGFibGUpOworICAgIHJldHVybiBkYXRhYmFzZVNpemUgKyBzcGFj
ZUF2YWlsYWJsZTsKK30KKworfQpJbmRleDogV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL1F1b3Rh
VHJhY2tlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL1F1b3Rh
VHJhY2tlci5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vUXVv
dGFUcmFja2VyLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRp
b24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFt
ZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9t
b3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNp
ZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMg
SVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisg
KiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJRdW90YVRyYWNrZXIuaCIKKworI2luY2x1ZGUgIkNTdHJpbmcuaCIK
KyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
UXVvdGFUcmFja2VyJiBRdW90YVRyYWNrZXI6Omluc3RhbmNlKCkKK3sKKyAgICBERUZJTkVfU1RB
VElDX0xPQ0FMKFF1b3RhVHJhY2tlciwgdHJhY2tlciwgKCkpOworICAgIHJldHVybiB0cmFja2Vy
OworfQorCit2b2lkIFF1b3RhVHJhY2tlcjo6Z2V0RGF0YWJhc2VTaXplQW5kU3BhY2VBdmFpbGFi
bGVUb09yaWdpbigKKyAgICBjb25zdCBTdHJpbmcmIG9yaWdpbklkZW50aWZpZXIsIGNvbnN0IFN0
cmluZyYgZGF0YWJhc2VOYW1lLAorICAgIHVuc2lnbmVkIGxvbmcgbG9uZyogZGF0YWJhc2VTaXpl
LCB1bnNpZ25lZCBsb25nIGxvbmcqIHNwYWNlQXZhaWxhYmxlKQoreworICAgIE11dGV4TG9ja2Vy
IGxvY2tEYXRhKG1fZGF0YUd1YXJkKTsKKyAgICBBU1NFUlQobV9kYXRhYmFzZVNpemVzLmNvbnRh
aW5zKG9yaWdpbklkZW50aWZpZXIpKTsKKyAgICBIYXNoTWFwPFN0cmluZywgU2l6ZU1hcD46OmNv
bnN0X2l0ZXJhdG9yIGl0ID0gbV9kYXRhYmFzZVNpemVzLmZpbmQob3JpZ2luSWRlbnRpZmllcik7
CisgICAgQVNTRVJUKGl0LT5zZWNvbmQuY29udGFpbnMoZGF0YWJhc2VOYW1lKSk7CisgICAgKmRh
dGFiYXNlU2l6ZSA9IGl0LT5zZWNvbmQuZ2V0KGRhdGFiYXNlTmFtZSk7CisKKyAgICBBU1NFUlQo
bV9zcGFjZUF2YWlsYWJsZVRvT3JpZ2lucy5jb250YWlucyhvcmlnaW5JZGVudGlmaWVyKSk7Cisg
ICAgKnNwYWNlQXZhaWxhYmxlID0gbV9zcGFjZUF2YWlsYWJsZVRvT3JpZ2lucy5nZXQob3JpZ2lu
SWRlbnRpZmllcik7Cit9CisKK3ZvaWQgUXVvdGFUcmFja2VyOjp1cGRhdGVEYXRhYmFzZVNpemVB
bmRPcmlnaW5TcGFjZSgKKyAgICBjb25zdCBTdHJpbmcmIG9yaWdpbklkZW50aWZpZXIsIGNvbnN0
IFN0cmluZyYgZGF0YWJhc2VOYW1lLAorICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBkYXRhYmFzZVNp
emUsIHVuc2lnbmVkIGxvbmcgbG9uZyBzcGFjZUF2YWlsYWJsZSkKK3sKKyAgICBNdXRleExvY2tl
ciBsb2NrRGF0YShtX2RhdGFHdWFyZCk7CisgICAgbV9zcGFjZUF2YWlsYWJsZVRvT3JpZ2lucy5z
ZXQob3JpZ2luSWRlbnRpZmllciwgc3BhY2VBdmFpbGFibGUpOworICAgIEhhc2hNYXA8U3RyaW5n
LCBTaXplTWFwPjo6aXRlcmF0b3IgaXQgPSBtX2RhdGFiYXNlU2l6ZXMuYWRkKG9yaWdpbklkZW50
aWZpZXIsIFNpemVNYXAoKSkuZmlyc3Q7CisgICAgaXQtPnNlY29uZC5zZXQoZGF0YWJhc2VOYW1l
LCBkYXRhYmFzZVNpemUpOworfQorCit9CkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0v
UXVvdGFUcmFja2VyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL1F1
b3RhVHJhY2tlci5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL1F1
b3RhVHJhY2tlci5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlv
bi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1l
cyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21v
dGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lm
aWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJ
UyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAq
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBRdW90YVRy
YWNrZXJfaAorI2RlZmluZSBRdW90YVRyYWNrZXJfaAorCisjaW5jbHVkZSAiQ1N0cmluZy5oIgor
I2luY2x1ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCisjaW5jbHVkZSAiU3RyaW5nSGFzaC5oIgorI2lu
Y2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUXVv
dGFUcmFja2VyIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUXVvdGFUcmFja2VyJiBpbnN0YW5jZSgp
OworCisgICAgdm9pZCBnZXREYXRhYmFzZVNpemVBbmRTcGFjZUF2YWlsYWJsZVRvT3JpZ2luKAor
ICAgICAgICBjb25zdCBTdHJpbmcmIG9yaWdpbklkZW50aWZpZXIsIGNvbnN0IFN0cmluZyYgZGF0
YWJhc2VOYW1lLAorICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcqIGRhdGFiYXNlU2l6ZSwgdW5z
aWduZWQgbG9uZyBsb25nKiBzcGFjZUF2YWlsYWJsZSk7CisgICAgdm9pZCB1cGRhdGVEYXRhYmFz
ZVNpemVBbmRTcGFjZUF2YWlsYWJsZVRvT3JpZ2luKAorICAgICAgICBjb25zdCBTdHJpbmcmIG9y
aWdpbklkZW50aWZpZXIsIGNvbnN0IFN0cmluZyYgZGF0YWJhc2VOYW1lLAorICAgICAgICB1bnNp
Z25lZCBsb25nIGxvbmcgZGF0YWJhc2VTaXplLCB1bnNpZ25lZCBsb25nIGxvbmcgc3BhY2VBdmFp
bGFibGUpOworCitwcml2YXRlOgorICAgIFF1b3RhVHJhY2tlcigpIHsgfQorCisgICAgdHlwZWRl
ZiBIYXNoTWFwPFN0cmluZywgdW5zaWduZWQgbG9uZyBsb25nPiBTaXplTWFwOworICAgIFNpemVN
YXAgbV9zcGFjZUF2YWlsYWJsZVRvT3JpZ2luczsKKyAgICBIYXNoTWFwPFN0cmluZywgU2l6ZU1h
cD4gbV9kYXRhYmFzZVNpemVzOworICAgIE11dGV4IG1fZGF0YUd1YXJkOworfTsKKworfQorCisj
ZW5kaWYgLy8gUXVvdGFUcmFja2VyX2gKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9jaHJvbWl1bS9T
UUxUcmFuc2FjdGlvbkNsaWVudENocm9taXVtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0
b3JhZ2UvY2hyb21pdW0vU1FMVHJhbnNhY3Rpb25DbGllbnRDaHJvbWl1bS5jcHAJKHJldmlzaW9u
IDApCisrKyBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vU1FMVHJhbnNhY3Rpb25DbGllbnRDaHJv
bWl1bS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgor
ICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9m
IGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBw
cm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBw
cmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiU1FMVHJhbnNhY3Rpb25DbGllbnQuaCIKKworI2luY2x1ZGUgIkRhdGFiYXNl
LmgiCisjaW5jbHVkZSAiRGF0YWJhc2VPYnNlcnZlci5oIgorI2luY2x1ZGUgIkRhdGFiYXNlVGhy
ZWFkLmgiCisjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJTUUxUcmFuc2FjdGlvbi5o
IgorI2luY2x1ZGUgPHd0Zi9NYWluVGhyZWFkLmg+CisKK3N0YXRpYyB2b2lkIG5vdGlmeURhdGFi
YXNlQ2hhbmdlZCh2b2lkKiBjb250ZXh0KSB7CisgICAgV2ViQ29yZTo6RGF0YWJhc2UqIGRhdGFi
YXNlID0gc3RhdGljX2Nhc3Q8V2ViQ29yZTo6RGF0YWJhc2UqPihjb250ZXh0KTsKKyAgICBXZWJD
b3JlOjpEYXRhYmFzZU9ic2VydmVyOjpkYXRhYmFzZU1vZGlmaWVkKGRhdGFiYXNlKTsKKyAgICBk
YXRhYmFzZS0+ZGVyZWYoKTsgIC8vIHJlZigpJ2QgaW4gZGlkQ29tbWl0VHJhbnNhY3Rpb24oKQor
fQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3ZvaWQgU1FMVHJhbnNhY3Rpb25DbGllbnQ6OmRp
ZENvbW1pdFRyYW5zYWN0aW9uKFNRTFRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbikKK3sKKyAgICBB
U1NFUlQoY3VycmVudFRocmVhZCgpID09IHRyYW5zYWN0aW9uLT5kYXRhYmFzZSgpLT5kb2N1bWVu
dCgpLT5kYXRhYmFzZVRocmVhZCgpLT5nZXRUaHJlYWRJRCgpKTsKKyAgICBpZiAoIXRyYW5zYWN0
aW9uLT5pc1JlYWRPbmx5KCkpIHsKKyAgICAgICAgdHJhbnNhY3Rpb24tPmRhdGFiYXNlKCktPnJl
ZigpOyAgLy8gZGVyZWYoKSdkIGluIG5vdGlmeURhdGFiYXNlQ2hhbmdlZCgpCisgICAgICAgIGNh
bGxPbk1haW5UaHJlYWQobm90aWZ5RGF0YWJhc2VDaGFuZ2VkLCB0cmFuc2FjdGlvbi0+ZGF0YWJh
c2UoKSk7CisgICAgfQorfQorCit2b2lkIFNRTFRyYW5zYWN0aW9uQ2xpZW50OjpkaWRFeGVjdXRl
U3RhdGVtZW50KFNRTFRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbikKK3sKKyAgICAvLyBUaGlzIG1l
dGhvZCBpcyBjYWxsZWQgYWZ0ZXIgZXhlY3V0aW5nIGV2ZXJ5IHN0YXRlbWVudCB0aGF0IGNoYW5n
ZXMgdGhlIERCLgorICAgIC8vIENocm9taXVtIGRvZXNuJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBh
dCB0aGF0IHBvaW50LgorICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gdHJhbnNhY3Rpb24t
PmRhdGFiYXNlKCktPmRvY3VtZW50KCktPmRhdGFiYXNlVGhyZWFkKCktPmdldFRocmVhZElEKCkp
OworfQorCitib29sIFNRTFRyYW5zYWN0aW9uQ2xpZW50OjpkaWRFeGNlZWRRdW90YShTUUxUcmFu
c2FjdGlvbiopCit7CisgICAgLy8gQ2hyb21pdW0gZG9lcyBub3QgYWxsb3cgdXNlcnMgdG8gbWFu
dWFsbHkgY2hhbmdlIHRoZSBxdW90YSBmb3IgYW4gb3JpZ2luIChmb3Igbm93LCBhdCBsZWFzdCku
CisgICAgLy8gRG9uJ3QgZG8gYW55dGhpbmcuCisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsK
KyAgICByZXR1cm4gZmFsc2U7Cit9CisKK30K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>42234</attachid>
            <date>2009-10-30 14:27:03 -0700</date>
            <delta_ts>2009-11-02 15:19:31 -0800</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>16576</size>
            <attacher name="Dumitru Daniliuc">dumi</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MDI5NSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTkgQEAKKzIwMDktMTAtMjkgIER1bWl0cnUgRGFuaWxpdWMgIDxkdW1pQGNocm9t
aXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBBZGRpbmcgQ2hyb21pdW0ncyBEYXRhYmFzZVRyYWNrZXIgYW5kIFNRTFRyYW5zYWN0aW9uQ2xp
ZW50CisgICAgICAgIGltcGxlbWVudGF0aW9ucy4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzA3MDEKKworICAgICAgICAqIHN0b3JhZ2UvY2hyb21p
dW06IEFkZGVkLgorICAgICAgICAqIHN0b3JhZ2UvY2hyb21pdW0vRGF0YWJhc2VPYnNlcnZlci5o
OiBBZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL2Nocm9taXVtL0RhdGFiYXNlVHJhY2tlckNocm9t
aXVtLmNwcDogQWRkZWQuCisgICAgICAgICogc3RvcmFnZS9jaHJvbWl1bS9RdW90YVRyYWNrZXIu
Y3BwOiBBZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL2Nocm9taXVtL1F1b3RhVHJhY2tlci5oOiBB
ZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL2Nocm9taXVtL1NRTFRyYW5zYWN0aW9uQ2xpZW50Q2hy
b21pdW0uY3BwOiBBZGRlZC4KKwogMjAwOS0xMC0yOSAgR3VzdGF2byBOb3JvbmhhIFNpbHZhICA8
Z3VzdGF2by5ub3JvbmhhQGNvbGxhYm9yYS5jby51az4KIAogICAgICAgICBSZXZpZXdlZCBieSBY
YW4gTG9wZXouCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vRGF0YWJhc2VPYnNlcnZl
ci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9jaHJvbWl1bS9EYXRhYmFzZU9ic2Vy
dmVyLmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vRGF0YWJhc2VP
YnNlcnZlci5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4K
KyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBv
ZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUg
cHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIg
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
CisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBEYXRhYmFzZU9i
c2VydmVyX2gKKyNkZWZpbmUgRGF0YWJhc2VPYnNlcnZlcl9oCisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworY2xhc3MgRGF0YWJhc2U7CisKKy8vIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNs
YXNzIGlzIGluIHRoZSBXZWJLaXQgQVBJIChDaHJvbWl1bSBzb3VyY2UgdHJlZSkKKy8vIGluIHdl
YmtpdC9hcGkvc3JjL0RhdGFiYXNlT2JzZXJ2ZXIuY3BwLgorY2xhc3MgRGF0YWJhc2VPYnNlcnZl
ciB7CitwdWJsaWM6CisgICAgc3RhdGljIHZvaWQgZGF0YWJhc2VPcGVuZWQoRGF0YWJhc2UqKTsK
KyAgICBzdGF0aWMgdm9pZCBkYXRhYmFzZU1vZGlmaWVkKERhdGFiYXNlKik7CisgICAgc3RhdGlj
IHZvaWQgZGF0YWJhc2VDbG9zZWQoRGF0YWJhc2UqKTsKK307CisKK30KKworI2VuZGlmIC8vIERh
dGFiYXNlT2JzZXJ2ZXJfaApJbmRleDogV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL0RhdGFiYXNl
VHJhY2tlckNocm9taXVtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvY2hyb21p
dW0vRGF0YWJhc2VUcmFja2VyQ2hyb21pdW0uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9z
dG9yYWdlL2Nocm9taXVtL0RhdGFiYXNlVHJhY2tlckNocm9taXVtLmNwcAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUK
KyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJp
Z2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUg
bmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3Jz
IG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20K
KyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Np
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhP
TERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICog
QSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRI
RSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
CisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRGF0YWJhc2VU
cmFja2VyLmgiCisKKyNpbmNsdWRlICJDU3RyaW5nLmgiCisjaW5jbHVkZSAiRGF0YWJhc2UuaCIK
KyNpbmNsdWRlICJEYXRhYmFzZU9ic2VydmVyLmgiCisjaW5jbHVkZSAiRGF0YWJhc2VUaHJlYWQu
aCIKKyNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIlF1b3RhVHJhY2tlci5oIgorI2lu
Y2x1ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCisjaW5jbHVkZSAiU1FMaXRlRmlsZVN5c3RlbS5oIgor
I2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordHlwZWRl
ZiBIYXNoU2V0PERhdGFiYXNlKj4gRGF0YWJhc2VTZXQ7CisKK3N0YXRpYyBEYXRhYmFzZVNldCYg
b3BlbkRhdGFiYXNlcygpCit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChEYXRhYmFzZXNTZXQs
IHN0YXRpY09wZW5EYXRhYmFzZXMsICgpKTsKKyAgICByZXR1cm4gc3RhdGljT3BlbkRhdGFiYXNl
czsKK30KKworRGF0YWJhc2VUcmFja2VyJiBEYXRhYmFzZVRyYWNrZXI6OnRyYWNrZXIoKQorewor
ICAgIERFRklORV9TVEFUSUNfTE9DQUwoRGF0YWJhc2VUcmFja2VyLCB0cmFja2VyLCAoKSk7Cisg
ICAgcmV0dXJuIHRyYWNrZXI7Cit9CisKK0RhdGFiYXNlVHJhY2tlcjo6RGF0YWJhc2VUcmFja2Vy
KCkKK3sKKyAgICBTUUxpdGVGaWxlU3lzdGVtOjpyZWdpc3RlclNRTGl0ZVZGUygpOworfQorCiti
b29sIERhdGFiYXNlVHJhY2tlcjo6Y2FuRXN0YWJsaXNoRGF0YWJhc2UoRG9jdW1lbnQqLCBjb25z
dCBTdHJpbmcmLCBjb25zdCBTdHJpbmcmLCB1bnNpZ25lZCBsb25nKQoreworICAgIC8vIEluIENo
cm9taXVtLCBhIGRhdGFiYXNlIGNhbiBhbHdheXMgYmUgZXN0YWJsaXNoZWQgKGV2ZW4gdGhvdWdo
IHdlIG1pZ2h0IG5vdAorICAgIC8vIGJlIGFibGUgdG8gd3JpdGUgYW55dGhpbmcgdG8gaXQgaWYg
dGhlIHF1b3RhIGZvciB0aGlzIG9yaWdpbiB3YXMgZXhjZWVkZWQpCisgICAgcmV0dXJuIHRydWU7
Cit9CisKK3ZvaWQgRGF0YWJhc2VUcmFja2VyOjpzZXREYXRhYmFzZURldGFpbHMoU2VjdXJpdHlP
cmlnaW4qLCBjb25zdCBTdHJpbmcmLCBjb25zdCBTdHJpbmcmLCB1bnNpZ25lZCBsb25nKQorewor
ICAgIC8vIENocm9taXVtIHNldHMgdGhlIGRhdGFiYXNlIGRldGFpbHMgd2hlbiB0aGUgZGF0YWJh
c2UgaXMgb3BlbmVkCit9CisKK1N0cmluZyBEYXRhYmFzZVRyYWNrZXI6OmZ1bGxQYXRoRm9yRGF0
YWJhc2UoU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lLCBib29sKQor
eworICAgIHJldHVybiBvcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpICsgIi8iICsgbmFtZTsK
K30KKwordm9pZCBEYXRhYmFzZVRyYWNrZXI6OmFkZE9wZW5EYXRhYmFzZShEYXRhYmFzZSogZGF0
YWJhc2UpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICBvcGVuRGF0YWJhc2Vz
KCkuYWRkKGRhdGFiYXNlKTsKKyAgICBEYXRhYmFzZU9ic2VydmVyOjpkYXRhYmFzZU9wZW5lZChk
YXRhYmFzZSk7Cit9CisKK3ZvaWQgRGF0YWJhc2VUcmFja2VyOjpyZW1vdmVPcGVuRGF0YWJhc2Uo
RGF0YWJhc2UqIGRhdGFiYXNlKQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAg
b3BlbkRhdGFiYXNlcygpLnJlbW92ZShkYXRhYmFzZSk7CisgICAgRGF0YWJhc2VPYnNlcnZlcjo6
ZGF0YWJhc2VDbG9zZWQoZGF0YWJhc2UpOworfQorCit1bnNpZ25lZCBsb25nIGxvbmcgRGF0YWJh
c2VUcmFja2VyOjpnZXRNYXhTaXplRm9yRGF0YWJhc2UoY29uc3QgRGF0YWJhc2UqIGRhdGFiYXNl
KSBjb25zdAoreworICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkgPT0gZGF0YWJhc2UtPmRvY3Vt
ZW50KCktPmRhdGFiYXNlVGhyZWFkKCktPmdldFRocmVhZElEKCkpOworICAgIHVuc2lnbmVkIGxv
bmcgbG9uZyBzcGFjZUF2YWlsYWJsZSA9IDA7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIGRhdGFi
YXNlU2l6ZSA9IDA7CisgICAgUXVvdGFUcmFja2VyOjppbnN0YW5jZSgpLmdldERhdGFiYXNlU2l6
ZUFuZFNwYWNlQXZhaWxhYmxlVG9PcmlnaW4oCisgICAgICAgIGRhdGFiYXNlLT5zZWN1cml0eU9y
aWdpbigpLT5kYXRhYmFzZUlkZW50aWZpZXIoKSwKKyAgICAgICAgZGF0YWJhc2UtPnN0cmluZ0lk
ZW50aWZpZXIoKSwgJmRhdGFiYXNlU2l6ZSwgJnNwYWNlQXZhaWxhYmxlKTsKKyAgICByZXR1cm4g
ZGF0YWJhc2VTaXplICsgc3BhY2VBdmFpbGFibGU7Cit9CisKK30KSW5kZXg6IFdlYkNvcmUvc3Rv
cmFnZS9jaHJvbWl1bS9RdW90YVRyYWNrZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3Rv
cmFnZS9jaHJvbWl1bS9RdW90YVRyYWNrZXIuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9z
dG9yYWdlL2Nocm9taXVtL1F1b3RhVHJhY2tlci5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
NjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAq
CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICog
aW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29n
bGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2Vk
IHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29m
dHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENP
TlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQK
KyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUXVvdGFUcmFja2VyLmgiCisKKyNp
bmNsdWRlICJDU3RyaW5nLmgiCisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CisKK1F1b3RhVHJhY2tlciYgUXVvdGFUcmFja2VyOjppbnN0YW5jZSgp
Cit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChRdW90YVRyYWNrZXIsIHRyYWNrZXIsICgpKTsK
KyAgICByZXR1cm4gdHJhY2tlcjsKK30KKwordm9pZCBRdW90YVRyYWNrZXI6OmdldERhdGFiYXNl
U2l6ZUFuZFNwYWNlQXZhaWxhYmxlVG9PcmlnaW4oCisgICAgY29uc3QgU3RyaW5nJiBvcmlnaW5J
ZGVudGlmaWVyLCBjb25zdCBTdHJpbmcmIGRhdGFiYXNlTmFtZSwKKyAgICB1bnNpZ25lZCBsb25n
IGxvbmcqIGRhdGFiYXNlU2l6ZSwgdW5zaWduZWQgbG9uZyBsb25nKiBzcGFjZUF2YWlsYWJsZSkK
K3sKKyAgICBNdXRleExvY2tlciBsb2NrRGF0YShtX2RhdGFHdWFyZCk7CisgICAgQVNTRVJUKG1f
ZGF0YWJhc2VTaXplcy5jb250YWlucyhvcmlnaW5JZGVudGlmaWVyKSk7CisgICAgSGFzaE1hcDxT
dHJpbmcsIFNpemVNYXA+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fZGF0YWJhc2VTaXplcy5maW5k
KG9yaWdpbklkZW50aWZpZXIpOworICAgIEFTU0VSVChpdC0+c2Vjb25kLmNvbnRhaW5zKGRhdGFi
YXNlTmFtZSkpOworICAgICpkYXRhYmFzZVNpemUgPSBpdC0+c2Vjb25kLmdldChkYXRhYmFzZU5h
bWUpOworCisgICAgQVNTRVJUKG1fc3BhY2VBdmFpbGFibGVUb09yaWdpbnMuY29udGFpbnMob3Jp
Z2luSWRlbnRpZmllcikpOworICAgICpzcGFjZUF2YWlsYWJsZSA9IG1fc3BhY2VBdmFpbGFibGVU
b09yaWdpbnMuZ2V0KG9yaWdpbklkZW50aWZpZXIpOworfQorCit2b2lkIFF1b3RhVHJhY2tlcjo6
dXBkYXRlRGF0YWJhc2VTaXplQW5kT3JpZ2luU3BhY2UoCisgICAgY29uc3QgU3RyaW5nJiBvcmln
aW5JZGVudGlmaWVyLCBjb25zdCBTdHJpbmcmIGRhdGFiYXNlTmFtZSwKKyAgICB1bnNpZ25lZCBs
b25nIGxvbmcgZGF0YWJhc2VTaXplLCB1bnNpZ25lZCBsb25nIGxvbmcgc3BhY2VBdmFpbGFibGUp
Cit7CisgICAgTXV0ZXhMb2NrZXIgbG9ja0RhdGEobV9kYXRhR3VhcmQpOworICAgIG1fc3BhY2VB
dmFpbGFibGVUb09yaWdpbnMuc2V0KG9yaWdpbklkZW50aWZpZXIsIHNwYWNlQXZhaWxhYmxlKTsK
KyAgICBIYXNoTWFwPFN0cmluZywgU2l6ZU1hcD46Oml0ZXJhdG9yIGl0ID0gbV9kYXRhYmFzZVNp
emVzLmFkZChvcmlnaW5JZGVudGlmaWVyLCBTaXplTWFwKCkpLmZpcnN0OworICAgIGl0LT5zZWNv
bmQuc2V0KGRhdGFiYXNlTmFtZSwgZGF0YWJhc2VTaXplKTsKK30KKworfQpJbmRleDogV2ViQ29y
ZS9zdG9yYWdlL2Nocm9taXVtL1F1b3RhVHJhY2tlci5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
c3RvcmFnZS9jaHJvbWl1bS9RdW90YVRyYWNrZXIuaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUv
c3RvcmFnZS9jaHJvbWl1bS9RdW90YVRyYWNrZXIuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw2
MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoK
KyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBp
biB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2ds
ZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQg
dG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0
d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09O
VFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAor
ICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisKKyNpZm5kZWYgUXVvdGFUcmFja2VyX2gKKyNkZWZpbmUgUXVvdGFUcmFja2VyX2gKKworI2lu
Y2x1ZGUgIkNTdHJpbmcuaCIKKyNpbmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIgorI2luY2x1ZGUg
IlN0cmluZ0hhc2guaCIKKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKK2NsYXNzIFF1b3RhVHJhY2tlciB7CitwdWJsaWM6CisgICAgc3RhdGljIFF1b3Rh
VHJhY2tlciYgaW5zdGFuY2UoKTsKKworICAgIHZvaWQgZ2V0RGF0YWJhc2VTaXplQW5kU3BhY2VB
dmFpbGFibGVUb09yaWdpbigKKyAgICAgICAgY29uc3QgU3RyaW5nJiBvcmlnaW5JZGVudGlmaWVy
LCBjb25zdCBTdHJpbmcmIGRhdGFiYXNlTmFtZSwKKyAgICAgICAgdW5zaWduZWQgbG9uZyBsb25n
KiBkYXRhYmFzZVNpemUsIHVuc2lnbmVkIGxvbmcgbG9uZyogc3BhY2VBdmFpbGFibGUpOworICAg
IHZvaWQgdXBkYXRlRGF0YWJhc2VTaXplQW5kU3BhY2VBdmFpbGFibGVUb09yaWdpbigKKyAgICAg
ICAgY29uc3QgU3RyaW5nJiBvcmlnaW5JZGVudGlmaWVyLCBjb25zdCBTdHJpbmcmIGRhdGFiYXNl
TmFtZSwKKyAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGRhdGFiYXNlU2l6ZSwgdW5zaWduZWQg
bG9uZyBsb25nIHNwYWNlQXZhaWxhYmxlKTsKKworcHJpdmF0ZToKKyAgICBRdW90YVRyYWNrZXIo
KSB7IH0KKworICAgIHR5cGVkZWYgSGFzaE1hcDxTdHJpbmcsIHVuc2lnbmVkIGxvbmcgbG9uZz4g
U2l6ZU1hcDsKKyAgICBTaXplTWFwIG1fc3BhY2VBdmFpbGFibGVUb09yaWdpbnM7CisgICAgSGFz
aE1hcDxTdHJpbmcsIFNpemVNYXA+IG1fZGF0YWJhc2VTaXplczsKKyAgICBNdXRleCBtX2RhdGFH
dWFyZDsKK307CisKK30KKworI2VuZGlmIC8vIFF1b3RhVHJhY2tlcl9oCkluZGV4OiBXZWJDb3Jl
L3N0b3JhZ2UvY2hyb21pdW0vU1FMVHJhbnNhY3Rpb25DbGllbnRDaHJvbWl1bS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL1NRTFRyYW5zYWN0aW9uQ2xpZW50Q2hy
b21pdW0uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL1NRTFRy
YW5zYWN0aW9uQ2xpZW50Q2hyb21pdW0uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDczIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICog
ICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRo
ZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUK
KyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIElu
Yy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBl
bmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJl
IHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklC
VVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBP
V05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
CisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNRTFRyYW5zYWN0aW9uQ2xpZW50LmgiCisK
KyNpbmNsdWRlICJEYXRhYmFzZS5oIgorI2luY2x1ZGUgIkRhdGFiYXNlT2JzZXJ2ZXIuaCIKKyNp
bmNsdWRlICJEYXRhYmFzZVRocmVhZC5oIgorI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVk
ZSAiU1FMVHJhbnNhY3Rpb24uaCIKKyNpbmNsdWRlIDx3dGYvTWFpblRocmVhZC5oPgorCitzdGF0
aWMgdm9pZCBub3RpZnlEYXRhYmFzZUNoYW5nZWQodm9pZCogY29udGV4dCkgeworICAgIFdlYkNv
cmU6OkRhdGFiYXNlKiBkYXRhYmFzZSA9IHN0YXRpY19jYXN0PFdlYkNvcmU6OkRhdGFiYXNlKj4o
Y29udGV4dCk7CisgICAgV2ViQ29yZTo6RGF0YWJhc2VPYnNlcnZlcjo6ZGF0YWJhc2VNb2RpZmll
ZChkYXRhYmFzZSk7CisgICAgZGF0YWJhc2UtPmRlcmVmKCk7ICAvLyByZWYoKSdkIGluIGRpZENv
bW1pdFRyYW5zYWN0aW9uKCkKK30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2b2lkIFNRTFRy
YW5zYWN0aW9uQ2xpZW50OjpkaWRDb21taXRUcmFuc2FjdGlvbihTUUxUcmFuc2FjdGlvbiogdHJh
bnNhY3Rpb24pCit7CisgICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQoKSA9PSB0cmFuc2FjdGlvbi0+
ZGF0YWJhc2UoKS0+ZG9jdW1lbnQoKS0+ZGF0YWJhc2VUaHJlYWQoKS0+Z2V0VGhyZWFkSUQoKSk7
CisgICAgaWYgKCF0cmFuc2FjdGlvbi0+aXNSZWFkT25seSgpKSB7CisgICAgICAgIHRyYW5zYWN0
aW9uLT5kYXRhYmFzZSgpLT5yZWYoKTsgIC8vIGRlcmVmKCknZCBpbiBub3RpZnlEYXRhYmFzZUNo
YW5nZWQoKQorICAgICAgICBjYWxsT25NYWluVGhyZWFkKG5vdGlmeURhdGFiYXNlQ2hhbmdlZCwg
dHJhbnNhY3Rpb24tPmRhdGFiYXNlKCkpOworICAgIH0KK30KKwordm9pZCBTUUxUcmFuc2FjdGlv
bkNsaWVudDo6ZGlkRXhlY3V0ZVN0YXRlbWVudChTUUxUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24p
Cit7CisgICAgLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGV4ZWN1dGluZyBldmVyeSBz
dGF0ZW1lbnQgdGhhdCBjaGFuZ2VzIHRoZSBEQi4KKyAgICAvLyBDaHJvbWl1bSBkb2Vzbid0IG5l
ZWQgdG8gZG8gYW55dGhpbmcgYXQgdGhhdCBwb2ludC4KKyAgICBBU1NFUlQoY3VycmVudFRocmVh
ZCgpID09IHRyYW5zYWN0aW9uLT5kYXRhYmFzZSgpLT5kb2N1bWVudCgpLT5kYXRhYmFzZVRocmVh
ZCgpLT5nZXRUaHJlYWRJRCgpKTsKK30KKworYm9vbCBTUUxUcmFuc2FjdGlvbkNsaWVudDo6ZGlk
RXhjZWVkUXVvdGEoU1FMVHJhbnNhY3Rpb24qKQoreworICAgIC8vIENocm9taXVtIGRvZXMgbm90
IGFsbG93IHVzZXJzIHRvIG1hbnVhbGx5IGNoYW5nZSB0aGUgcXVvdGEgZm9yIGFuIG9yaWdpbiAo
Zm9yIG5vdywgYXQgbGVhc3QpLgorICAgIC8vIERvbid0IGRvIGFueXRoaW5nLgorICAgIEFTU0VS
VChpc01haW5UaHJlYWQoKSk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>42345</attachid>
            <date>2009-11-02 15:19:31 -0800</date>
            <delta_ts>2009-11-02 15:56:38 -0800</delta_ts>
            <desc>patch</desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>16309</size>
            <attacher name="Dumitru Daniliuc">dumi</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MDQzMSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTkgQEAKKzIwMDktMTAtMjkgIER1bWl0cnUgRGFuaWxpdWMgIDxkdW1pQGNocm9t
aXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBBZGRpbmcgQ2hyb21pdW0ncyBEYXRhYmFzZVRyYWNrZXIgYW5kIFNRTFRyYW5zYWN0aW9uQ2xp
ZW50CisgICAgICAgIGltcGxlbWVudGF0aW9ucy4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzA3MDEKKworICAgICAgICAqIHN0b3JhZ2UvY2hyb21p
dW06IEFkZGVkLgorICAgICAgICAqIHN0b3JhZ2UvY2hyb21pdW0vRGF0YWJhc2VPYnNlcnZlci5o
OiBBZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL2Nocm9taXVtL0RhdGFiYXNlVHJhY2tlckNocm9t
aXVtLmNwcDogQWRkZWQuCisgICAgICAgICogc3RvcmFnZS9jaHJvbWl1bS9RdW90YVRyYWNrZXIu
Y3BwOiBBZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL2Nocm9taXVtL1F1b3RhVHJhY2tlci5oOiBB
ZGRlZC4KKyAgICAgICAgKiBzdG9yYWdlL2Nocm9taXVtL1NRTFRyYW5zYWN0aW9uQ2xpZW50Q2hy
b21pdW0uY3BwOiBBZGRlZC4KKwogMjAwOS0xMS0wMiAgUGF0cmljayBNdWVsbGVyICA8UGF0cmlj
a19NdWVsbGVyQHVzLmlibS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgVGltb3RoeSBIYXRj
aGVyLgpJbmRleDogV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL0RhdGFiYXNlT2JzZXJ2ZXIuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vRGF0YWJhc2VPYnNlcnZlci5o
CShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL0RhdGFiYXNlT2JzZXJ2
ZXIuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAg
ICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRz
CisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1
Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9y
IHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICog
TElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
CisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgRGF0YWJhc2VPYnNlcnZl
cl9oCisjZGVmaW5lIERhdGFiYXNlT2JzZXJ2ZXJfaAorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K2NsYXNzIERhdGFiYXNlOworCisvLyBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjbGFzcyBp
cyBpbiB0aGUgV2ViS2l0IEFQSSAoQ2hyb21pdW0gc291cmNlIHRyZWUpCisvLyBpbiB3ZWJraXQv
YXBpL3NyYy9EYXRhYmFzZU9ic2VydmVyLmNwcC4KK2NsYXNzIERhdGFiYXNlT2JzZXJ2ZXIgewor
cHVibGljOgorICAgIHN0YXRpYyB2b2lkIGRhdGFiYXNlT3BlbmVkKERhdGFiYXNlKik7CisgICAg
c3RhdGljIHZvaWQgZGF0YWJhc2VNb2RpZmllZChEYXRhYmFzZSopOworICAgIHN0YXRpYyB2b2lk
IGRhdGFiYXNlQ2xvc2VkKERhdGFiYXNlKik7Cit9OworCit9CisKKyNlbmRpZiAvLyBEYXRhYmFz
ZU9ic2VydmVyX2gKSW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9jaHJvbWl1bS9EYXRhYmFzZVRyYWNr
ZXJDaHJvbWl1bS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL0Rh
dGFiYXNlVHJhY2tlckNocm9taXVtLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvc3RvcmFn
ZS9jaHJvbWl1bS9EYXRhYmFzZVRyYWNrZXJDaHJvbWl1bS5jcHAJKHJldmlzaW9uIDApCkBAIC0w
LDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1l
dDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
cgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBv
ZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBi
ZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRo
aXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMg
QU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZ
UklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRGF0YWJhc2VUcmFja2Vy
LmgiCisKKyNpbmNsdWRlICJDU3RyaW5nLmgiCisjaW5jbHVkZSAiRGF0YWJhc2UuaCIKKyNpbmNs
dWRlICJEYXRhYmFzZU9ic2VydmVyLmgiCisjaW5jbHVkZSAiRGF0YWJhc2VUaHJlYWQuaCIKKyNp
bmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIlF1b3RhVHJhY2tlci5oIgorI2luY2x1ZGUg
IlNlY3VyaXR5T3JpZ2luLmgiCisjaW5jbHVkZSAiU1FMaXRlRmlsZVN5c3RlbS5oIgorI2luY2x1
ZGUgPHd0Zi9IYXNoU2V0Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworRGF0YWJhc2VUcmFj
a2VyJiBEYXRhYmFzZVRyYWNrZXI6OnRyYWNrZXIoKQoreworICAgIERFRklORV9TVEFUSUNfTE9D
QUwoRGF0YWJhc2VUcmFja2VyLCB0cmFja2VyLCAoKSk7CisgICAgcmV0dXJuIHRyYWNrZXI7Cit9
CisKK0RhdGFiYXNlVHJhY2tlcjo6RGF0YWJhc2VUcmFja2VyKCkKK3sKKyAgICBTUUxpdGVGaWxl
U3lzdGVtOjpyZWdpc3RlclNRTGl0ZVZGUygpOworfQorCitib29sIERhdGFiYXNlVHJhY2tlcjo6
Y2FuRXN0YWJsaXNoRGF0YWJhc2UoRG9jdW1lbnQqLCBjb25zdCBTdHJpbmcmLCBjb25zdCBTdHJp
bmcmLCB1bnNpZ25lZCBsb25nKQoreworICAgIC8vIEluIENocm9taXVtLCBhIGRhdGFiYXNlIGNh
biBhbHdheXMgYmUgZXN0YWJsaXNoZWQgKGV2ZW4gdGhvdWdoIHdlIG1pZ2h0IG5vdAorICAgIC8v
IGJlIGFibGUgdG8gd3JpdGUgYW55dGhpbmcgdG8gaXQgaWYgdGhlIHF1b3RhIGZvciB0aGlzIG9y
aWdpbiB3YXMgZXhjZWVkZWQpCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRGF0YWJhc2VU
cmFja2VyOjpzZXREYXRhYmFzZURldGFpbHMoU2VjdXJpdHlPcmlnaW4qLCBjb25zdCBTdHJpbmcm
LCBjb25zdCBTdHJpbmcmLCB1bnNpZ25lZCBsb25nKQoreworICAgIC8vIENocm9taXVtIHNldHMg
dGhlIGRhdGFiYXNlIGRldGFpbHMgd2hlbiB0aGUgZGF0YWJhc2UgaXMgb3BlbmVkCit9CisKK1N0
cmluZyBEYXRhYmFzZVRyYWNrZXI6OmZ1bGxQYXRoRm9yRGF0YWJhc2UoU2VjdXJpdHlPcmlnaW4q
IG9yaWdpbiwgY29uc3QgU3RyaW5nJiBuYW1lLCBib29sKQoreworICAgIHJldHVybiBvcmlnaW4t
PmRhdGFiYXNlSWRlbnRpZmllcigpICsgIi8iICsgbmFtZTsKK30KKwordm9pZCBEYXRhYmFzZVRy
YWNrZXI6OmFkZE9wZW5EYXRhYmFzZShEYXRhYmFzZSogZGF0YWJhc2UpCit7CisgICAgQVNTRVJU
KGlzTWFpblRocmVhZCgpKTsKKyAgICBEYXRhYmFzZU9ic2VydmVyOjpkYXRhYmFzZU9wZW5lZChk
YXRhYmFzZSk7Cit9CisKK3ZvaWQgRGF0YWJhc2VUcmFja2VyOjpyZW1vdmVPcGVuRGF0YWJhc2Uo
RGF0YWJhc2UqIGRhdGFiYXNlKQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAg
RGF0YWJhc2VPYnNlcnZlcjo6ZGF0YWJhc2VDbG9zZWQoZGF0YWJhc2UpOworfQorCit1bnNpZ25l
ZCBsb25nIGxvbmcgRGF0YWJhc2VUcmFja2VyOjpnZXRNYXhTaXplRm9yRGF0YWJhc2UoY29uc3Qg
RGF0YWJhc2UqIGRhdGFiYXNlKSBjb25zdAoreworICAgIEFTU0VSVChjdXJyZW50VGhyZWFkKCkg
PT0gZGF0YWJhc2UtPmRvY3VtZW50KCktPmRhdGFiYXNlVGhyZWFkKCktPmdldFRocmVhZElEKCkp
OworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBzcGFjZUF2YWlsYWJsZSA9IDA7CisgICAgdW5zaWdu
ZWQgbG9uZyBsb25nIGRhdGFiYXNlU2l6ZSA9IDA7CisgICAgUXVvdGFUcmFja2VyOjppbnN0YW5j
ZSgpLmdldERhdGFiYXNlU2l6ZUFuZFNwYWNlQXZhaWxhYmxlVG9PcmlnaW4oCisgICAgICAgIGRh
dGFiYXNlLT5zZWN1cml0eU9yaWdpbigpLT5kYXRhYmFzZUlkZW50aWZpZXIoKSwKKyAgICAgICAg
ZGF0YWJhc2UtPnN0cmluZ0lkZW50aWZpZXIoKSwgJmRhdGFiYXNlU2l6ZSwgJnNwYWNlQXZhaWxh
YmxlKTsKKyAgICByZXR1cm4gZGF0YWJhc2VTaXplICsgc3BhY2VBdmFpbGFibGU7Cit9CisKK30K
SW5kZXg6IFdlYkNvcmUvc3RvcmFnZS9jaHJvbWl1bS9RdW90YVRyYWNrZXIuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9jaHJvbWl1bS9RdW90YVRyYWNrZXIuY3BwCShyZXZpc2lv
biAwKQorKysgV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL1F1b3RhVHJhY2tlci5jcHAJKHJldmlz
aW9uIDApCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICog
Y29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhl
ciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJp
YnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVk
IGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBl
cm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJ
R0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUXVv
dGFUcmFja2VyLmgiCisKKyNpbmNsdWRlICJDU3RyaW5nLmgiCisjaW5jbHVkZSA8d3RmL1N0ZExp
YkV4dHJhcy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1F1b3RhVHJhY2tlciYgUXVvdGFU
cmFja2VyOjppbnN0YW5jZSgpCit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChRdW90YVRyYWNr
ZXIsIHRyYWNrZXIsICgpKTsKKyAgICByZXR1cm4gdHJhY2tlcjsKK30KKwordm9pZCBRdW90YVRy
YWNrZXI6OmdldERhdGFiYXNlU2l6ZUFuZFNwYWNlQXZhaWxhYmxlVG9PcmlnaW4oCisgICAgY29u
c3QgU3RyaW5nJiBvcmlnaW5JZGVudGlmaWVyLCBjb25zdCBTdHJpbmcmIGRhdGFiYXNlTmFtZSwK
KyAgICB1bnNpZ25lZCBsb25nIGxvbmcqIGRhdGFiYXNlU2l6ZSwgdW5zaWduZWQgbG9uZyBsb25n
KiBzcGFjZUF2YWlsYWJsZSkKK3sKKyAgICBNdXRleExvY2tlciBsb2NrRGF0YShtX2RhdGFHdWFy
ZCk7CisgICAgQVNTRVJUKG1fZGF0YWJhc2VTaXplcy5jb250YWlucyhvcmlnaW5JZGVudGlmaWVy
KSk7CisgICAgSGFzaE1hcDxTdHJpbmcsIFNpemVNYXA+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1f
ZGF0YWJhc2VTaXplcy5maW5kKG9yaWdpbklkZW50aWZpZXIpOworICAgIEFTU0VSVChpdC0+c2Vj
b25kLmNvbnRhaW5zKGRhdGFiYXNlTmFtZSkpOworICAgICpkYXRhYmFzZVNpemUgPSBpdC0+c2Vj
b25kLmdldChkYXRhYmFzZU5hbWUpOworCisgICAgQVNTRVJUKG1fc3BhY2VBdmFpbGFibGVUb09y
aWdpbnMuY29udGFpbnMob3JpZ2luSWRlbnRpZmllcikpOworICAgICpzcGFjZUF2YWlsYWJsZSA9
IG1fc3BhY2VBdmFpbGFibGVUb09yaWdpbnMuZ2V0KG9yaWdpbklkZW50aWZpZXIpOworfQorCit2
b2lkIFF1b3RhVHJhY2tlcjo6dXBkYXRlRGF0YWJhc2VTaXplQW5kT3JpZ2luU3BhY2UoCisgICAg
Y29uc3QgU3RyaW5nJiBvcmlnaW5JZGVudGlmaWVyLCBjb25zdCBTdHJpbmcmIGRhdGFiYXNlTmFt
ZSwKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgZGF0YWJhc2VTaXplLCB1bnNpZ25lZCBsb25nIGxv
bmcgc3BhY2VBdmFpbGFibGUpCit7CisgICAgTXV0ZXhMb2NrZXIgbG9ja0RhdGEobV9kYXRhR3Vh
cmQpOworICAgIG1fc3BhY2VBdmFpbGFibGVUb09yaWdpbnMuc2V0KG9yaWdpbklkZW50aWZpZXIs
IHNwYWNlQXZhaWxhYmxlKTsKKyAgICBIYXNoTWFwPFN0cmluZywgU2l6ZU1hcD46Oml0ZXJhdG9y
IGl0ID0gbV9kYXRhYmFzZVNpemVzLmFkZChvcmlnaW5JZGVudGlmaWVyLCBTaXplTWFwKCkpLmZp
cnN0OworICAgIGl0LT5zZWNvbmQuc2V0KGRhdGFiYXNlTmFtZSwgZGF0YWJhc2VTaXplKTsKK30K
KworfQpJbmRleDogV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL1F1b3RhVHJhY2tlci5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvc3RvcmFnZS9jaHJvbWl1bS9RdW90YVRyYWNrZXIuaAkocmV2aXNp
b24gMCkKKysrIFdlYkNvcmUvc3RvcmFnZS9jaHJvbWl1bS9RdW90YVRyYWNrZXIuaAkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
IGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBj
b3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVy
IHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmli
dXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQg
ZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVy
bWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklH
SFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywg
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
CisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUXVvdGFUcmFja2VyX2gKKyNkZWZpbmUgUXVv
dGFUcmFja2VyX2gKKworI2luY2x1ZGUgIkNTdHJpbmcuaCIKKyNpbmNsdWRlICJTZWN1cml0eU9y
aWdpbi5oIgorI2luY2x1ZGUgIlN0cmluZ0hhc2guaCIKKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5o
PgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFF1b3RhVHJhY2tlciB7CitwdWJsaWM6
CisgICAgc3RhdGljIFF1b3RhVHJhY2tlciYgaW5zdGFuY2UoKTsKKworICAgIHZvaWQgZ2V0RGF0
YWJhc2VTaXplQW5kU3BhY2VBdmFpbGFibGVUb09yaWdpbigKKyAgICAgICAgY29uc3QgU3RyaW5n
JiBvcmlnaW5JZGVudGlmaWVyLCBjb25zdCBTdHJpbmcmIGRhdGFiYXNlTmFtZSwKKyAgICAgICAg
dW5zaWduZWQgbG9uZyBsb25nKiBkYXRhYmFzZVNpemUsIHVuc2lnbmVkIGxvbmcgbG9uZyogc3Bh
Y2VBdmFpbGFibGUpOworICAgIHZvaWQgdXBkYXRlRGF0YWJhc2VTaXplQW5kU3BhY2VBdmFpbGFi
bGVUb09yaWdpbigKKyAgICAgICAgY29uc3QgU3RyaW5nJiBvcmlnaW5JZGVudGlmaWVyLCBjb25z
dCBTdHJpbmcmIGRhdGFiYXNlTmFtZSwKKyAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGRhdGFi
YXNlU2l6ZSwgdW5zaWduZWQgbG9uZyBsb25nIHNwYWNlQXZhaWxhYmxlKTsKKworcHJpdmF0ZToK
KyAgICBRdW90YVRyYWNrZXIoKSB7IH0KKworICAgIHR5cGVkZWYgSGFzaE1hcDxTdHJpbmcsIHVu
c2lnbmVkIGxvbmcgbG9uZz4gU2l6ZU1hcDsKKyAgICBTaXplTWFwIG1fc3BhY2VBdmFpbGFibGVU
b09yaWdpbnM7CisgICAgSGFzaE1hcDxTdHJpbmcsIFNpemVNYXA+IG1fZGF0YWJhc2VTaXplczsK
KyAgICBNdXRleCBtX2RhdGFHdWFyZDsKK307CisKK30KKworI2VuZGlmIC8vIFF1b3RhVHJhY2tl
cl9oCkluZGV4OiBXZWJDb3JlL3N0b3JhZ2UvY2hyb21pdW0vU1FMVHJhbnNhY3Rpb25DbGllbnRD
aHJvbWl1bS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdG9yYWdlL2Nocm9taXVtL1NRTFRy
YW5zYWN0aW9uQ2xpZW50Q2hyb21pdW0uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9zdG9y
YWdlL2Nocm9taXVtL1NRTFRyYW5zYWN0aW9uQ2xpZW50Q2hyb21pdW0uY3BwCShyZXZpc2lvbiAw
KQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJl
CisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHly
aWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhl
IG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9y
cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9t
CisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI
T0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAq
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNRTFRyYW5z
YWN0aW9uQ2xpZW50LmgiCisKKyNpbmNsdWRlICJEYXRhYmFzZS5oIgorI2luY2x1ZGUgIkRhdGFi
YXNlT2JzZXJ2ZXIuaCIKKyNpbmNsdWRlICJEYXRhYmFzZVRocmVhZC5oIgorI2luY2x1ZGUgIkRv
Y3VtZW50LmgiCisjaW5jbHVkZSAiU1FMVHJhbnNhY3Rpb24uaCIKKyNpbmNsdWRlIDx3dGYvTWFp
blRocmVhZC5oPgorCitzdGF0aWMgdm9pZCBub3RpZnlEYXRhYmFzZUNoYW5nZWQodm9pZCogY29u
dGV4dCkgeworICAgIFdlYkNvcmU6OkRhdGFiYXNlKiBkYXRhYmFzZSA9IHN0YXRpY19jYXN0PFdl
YkNvcmU6OkRhdGFiYXNlKj4oY29udGV4dCk7CisgICAgV2ViQ29yZTo6RGF0YWJhc2VPYnNlcnZl
cjo6ZGF0YWJhc2VNb2RpZmllZChkYXRhYmFzZSk7CisgICAgZGF0YWJhc2UtPmRlcmVmKCk7ICAv
LyByZWYoKSdkIGluIGRpZENvbW1pdFRyYW5zYWN0aW9uKCkKK30KKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCit2b2lkIFNRTFRyYW5zYWN0aW9uQ2xpZW50OjpkaWRDb21taXRUcmFuc2FjdGlvbihT
UUxUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24pCit7CisgICAgQVNTRVJUKGN1cnJlbnRUaHJlYWQo
KSA9PSB0cmFuc2FjdGlvbi0+ZGF0YWJhc2UoKS0+ZG9jdW1lbnQoKS0+ZGF0YWJhc2VUaHJlYWQo
KS0+Z2V0VGhyZWFkSUQoKSk7CisgICAgaWYgKCF0cmFuc2FjdGlvbi0+aXNSZWFkT25seSgpKSB7
CisgICAgICAgIHRyYW5zYWN0aW9uLT5kYXRhYmFzZSgpLT5yZWYoKTsgIC8vIGRlcmVmKCknZCBp
biBub3RpZnlEYXRhYmFzZUNoYW5nZWQoKQorICAgICAgICBjYWxsT25NYWluVGhyZWFkKG5vdGlm
eURhdGFiYXNlQ2hhbmdlZCwgdHJhbnNhY3Rpb24tPmRhdGFiYXNlKCkpOworICAgIH0KK30KKwor
dm9pZCBTUUxUcmFuc2FjdGlvbkNsaWVudDo6ZGlkRXhlY3V0ZVN0YXRlbWVudChTUUxUcmFuc2Fj
dGlvbiogdHJhbnNhY3Rpb24pCit7CisgICAgLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVy
IGV4ZWN1dGluZyBldmVyeSBzdGF0ZW1lbnQgdGhhdCBjaGFuZ2VzIHRoZSBEQi4KKyAgICAvLyBD
aHJvbWl1bSBkb2Vzbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgYXQgdGhhdCBwb2ludC4KKyAgICBB
U1NFUlQoY3VycmVudFRocmVhZCgpID09IHRyYW5zYWN0aW9uLT5kYXRhYmFzZSgpLT5kb2N1bWVu
dCgpLT5kYXRhYmFzZVRocmVhZCgpLT5nZXRUaHJlYWRJRCgpKTsKK30KKworYm9vbCBTUUxUcmFu
c2FjdGlvbkNsaWVudDo6ZGlkRXhjZWVkUXVvdGEoU1FMVHJhbnNhY3Rpb24qKQoreworICAgIC8v
IENocm9taXVtIGRvZXMgbm90IGFsbG93IHVzZXJzIHRvIG1hbnVhbGx5IGNoYW5nZSB0aGUgcXVv
dGEgZm9yIGFuIG9yaWdpbiAoZm9yIG5vdywgYXQgbGVhc3QpLgorICAgIC8vIERvbid0IGRvIGFu
eXRoaW5nLgorICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgcmV0dXJuIGZhbHNlOwor
fQorCit9Cg==
</data>
<flag name="review"
          id="23864"
          type_id="1"
          status="+"
          setter="dglazkov"
    />
          </attachment>
      

    </bug>

</bugzilla>