<?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>62780</bug_id>
          
          <creation_ts>2011-06-15 22:54:20 -0700</creation_ts>
          <short_desc>Migrate SQLite backing store to LevelDB backing store for Indexeddb.</short_desc>
          <delta_ts>2011-06-28 12:19:51 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>62382</dependson>
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Greg Simon">gregsimon</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>dglazkov</cc>
    
    <cc>dgrogan</cc>
    
    <cc>hans</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>421785</commentid>
    <comment_count>0</comment_count>
    <who name="Greg Simon">gregsimon</who>
    <bug_when>2011-06-15 22:54:20 -0700</bug_when>
    <thetext>Migrate SQLite backing store to LevelDB backing store for Indexeddb.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>421787</commentid>
    <comment_count>1</comment_count>
      <attachid>97405</attachid>
    <who name="Greg Simon">gregsimon</who>
    <bug_when>2011-06-15 22:56:16 -0700</bug_when>
    <thetext>Created attachment 97405
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>421924</commentid>
    <comment_count>2</comment_count>
      <attachid>97405</attachid>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-06-16 06:20:40 -0700</bug_when>
    <thetext>Comment on attachment 97405
Patch

It&apos;s great to see this uploaded!

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

&gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:82
&gt;  

Some of this patch overlaps with the patch in Bug 62382. Let&apos;s get that one landed first.

&gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:131
&gt; +    String toUniqueIdentifier = securityOrigin-&gt;databaseIdentifier() + &quot;@&quot; + name + String::format(&quot;@%d&quot;, LevelDBBackingStore);

We have code for creating these identifiers in a couple of places now. May be worth moving it out to a function or something.

&gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:161
&gt; +        return false;

Are we migrating the whole origin or just one database?

I think we should do the whole origin. That way we also don&apos;t need to involve an IDBDatabaseBackendImpl, we can just dig out all the database names from the IDBBackingStore.

In fact, I&apos;d love to see methods like this..

IDBFactoryBackendImpl::migrate(SecurityOrigin, dataDir, ...) - this guy opens and/or creates backingstores in the right places

static migrateBackingStore(IDBBackingStore* from, IDBBackingStore *to) - this guy migrates an entire backing store from another (calling out to helper functions below)
static migrateDatabase (IDBBackingStore* from, IDBBackingStore *to, String databaseName) - this migrates a single database
(maybe a migrateObjectStore function too)

&gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:196
&gt; +            RefPtr&lt;IDBBackingStore::Cursor&gt; cursor = fromBackingStore-&gt;openObjectStoreCursor(fromDatabaseBackend-&gt;id(), fromObjStoreIds[i], 0, IDBCursor::NEXT);

I would have used the ForEachObjectStoreRecord() method, but I&apos;m not sure that matters.

&gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:219
&gt; +                if (!toBackingStore-&gt;createIndex(toDatabaseId, assignedObjectStoreId, name, keyPath, idxUnique[j], indexId))

createIndex doesn&apos;t populate the index (sorry, the name isn&apos;t that clear), so we&apos;ll need to do that too, and the layout test should test for it.
Maybe we can use openIndexKeyCursor(), or we can add a function similar to forEachObjectStoreRecord()

&gt; Source/WebCore/storage/IDBSQLiteBackingStore.cpp:1006
&gt; +    return false;

If we just want to check for file existence, we should simplify this to return fileExists(path) :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>422008</commentid>
    <comment_count>3</comment_count>
    <who name="Greg Simon">gregsimon</who>
    <bug_when>2011-06-16 09:55:18 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 97405 [details])
&gt; It&apos;s great to see this uploaded!
&gt; 
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=97405&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:82
&gt; &gt;  
&gt; 
&gt; Some of this patch overlaps with the patch in Bug 62382. Let&apos;s get that one landed first.
&gt; 
&gt; &gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:131
&gt; &gt; +    String toUniqueIdentifier = securityOrigin-&gt;databaseIdentifier() + &quot;@&quot; + name + String::format(&quot;@%d&quot;, LevelDBBackingStore);
&gt; 
&gt; We have code for creating these identifiers in a couple of places now. May be worth moving it out to a function or something.
Yes -- I&apos;ll consolidate.

&gt; &gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:161
&gt; &gt; +        return false;
&gt; 
&gt; Are we migrating the whole origin or just one database?

Just single database on-demand (see comment below).

&gt; I think we should do the whole origin. That way we also don&apos;t need to involve an IDBDatabaseBackendImpl, we can just dig out all the database names from the IDBBackingStore.
&gt; 
&gt; In fact, I&apos;d love to see methods like this..
&gt; 
&gt; IDBFactoryBackendImpl::migrate(SecurityOrigin, dataDir, ...) - this guy opens and/or creates backingstores in the right places
&gt; 
&gt; static migrateBackingStore(IDBBackingStore* from, IDBBackingStore *to) - this guy migrates an entire backing store from another (calling out to helper functions below)
&gt; static migrateDatabase (IDBBackingStore* from, IDBBackingStore *to, String databaseName) - this migrates a single database
&gt; (maybe a migrateObjectStore function too)

This is an attempt to make the code as small as possible so it is an on-demand migration. I considered making it more generic but it seems the Indexeddb code suffers from this too much already and it is unlikely we&apos;ll be migrating again.



&gt; &gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:196
&gt; &gt; +            RefPtr&lt;IDBBackingStore::Cursor&gt; cursor = fromBackingStore-&gt;openObjectStoreCursor(fromDatabaseBackend-&gt;id(), fromObjStoreIds[i], 0, IDBCursor::NEXT);
&gt; 
&gt; I would have used the ForEachObjectStoreRecord() method, but I&apos;m not sure that matters.

I tried this first but the code was more verbose than the attached patch.


&gt; &gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:219
&gt; &gt; +                if (!toBackingStore-&gt;createIndex(toDatabaseId, assignedObjectStoreId, name, keyPath, idxUnique[j], indexId))
&gt; 
&gt; createIndex doesn&apos;t populate the index (sorry, the name isn&apos;t that clear), so we&apos;ll need to do that too, and the layout test should test for it.
&gt; Maybe we can use openIndexKeyCursor(), or we can add a function similar to forEachObjectStoreRecord()

Hmm... ok I&apos;ll dig into this then.

&gt; &gt; Source/WebCore/storage/IDBSQLiteBackingStore.cpp:1006
&gt; &gt; +    return false;
&gt; 
&gt; If we just want to check for file existence, we should simplify this to return fileExists(path) :)
Yes! -- I&apos;ll change.




.. also, missing from this patch is SQLite deletion but I want to do that separately. When this patch lands migration won&apos;t automatically start happening yet until the DefaultBackingStore is changed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>422395</commentid>
    <comment_count>4</comment_count>
      <attachid>97405</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-06-16 21:04:33 -0700</bug_when>
    <thetext>Comment on attachment 97405
Patch

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

&gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:127
&gt;  bool IDBFactoryBackendImpl::migrate(const String&amp; name, SecurityOrigin* securityOrigin, const String&amp; dataDir, int64_t maximumSize)

Seems like we could have broken this gigantic function into smaller (static/inline) helpers to help readability.

&gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:183
&gt; +        if (!toObjStoreNames.contains(fromObjStoreNames[i])) {

Early continue?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>424001</commentid>
    <comment_count>5</comment_count>
      <attachid>97872</attachid>
    <who name="Greg Simon">gregsimon</who>
    <bug_when>2011-06-20 15:40:35 -0700</bug_when>
    <thetext>Created attachment 97872
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>424008</commentid>
    <comment_count>6</comment_count>
    <who name="Greg Simon">gregsimon</who>
    <bug_when>2011-06-20 15:42:41 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; (From update of attachment 97405 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=97405&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:127
&gt; &gt;  bool IDBFactoryBackendImpl::migrate(const String&amp; name, SecurityOrigin* securityOrigin, const String&amp; dataDir, int64_t maximumSize)
&gt; 
&gt; Seems like we could have broken this gigantic function into smaller (static/inline) helpers to help readability.

Correct -- I broke up the migration code itself into a static function.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:183
&gt; &gt; +        if (!toObjStoreNames.contains(fromObjStoreNames[i])) {
&gt; 
&gt; Early continue?
It is correct as written -- we are limiting our &quot;merge&quot; migration objectstores as a whole. If the object store exists at the target we move onto the next one.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>424374</commentid>
    <comment_count>7</comment_count>
      <attachid>97872</attachid>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-06-21 03:49:03 -0700</bug_when>
    <thetext>Comment on attachment 97872
Patch

Hi Greg,

Thanks again for working on this. It&apos;s a tricky area.

My main worry is that the patch confuses backing stores and databases, and fileIdentifiers and uniqueIdentifiers. See comments inline, and ping me if there&apos;s anything I can clarify.


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

&gt; LayoutTests/storage/indexeddb/migrate-basics.html:154
&gt; +    shouldBeTrue(&quot;(window.store.index(&apos;ExampleIndex&apos;) != undefined)&quot;);

we also need to check that the index actually contains anything

&gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:95
&gt; +    IDBBackingStoreMap::iterator it2 = m_backingStoreMap.find(uniqueIdentifier);

This is a regression of what I fixed in Bug 62382. It is important that m_backingStoreMap is keyed *per origin* (fileIdentifier) rather than per database (uniqueIdentifier).

The m_backingStoreMap&apos;s purpose is to cache open backing stores, so that we only keep a single connection to each backing store. If a LevelDB database is opened more than once simultaneously, it will cause corruption.

This comment applies throughout the patch.

&gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:104
&gt; +            // LayoutTests: SQLite backing store may not exist on disk but may exist in cache.

Nice catch; I hadn&apos;t thought of this.

&gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:117
&gt; +            backingStore = IDBSQLiteBackingStore::open(securityOrigin.get(), dataDir, maximumSize, uniqueIdentifier, this);

Again, this seems to undo the patch from Bug 62382. Is this deliberate, or a merge thing?

&gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:120
&gt; +            backingStore = IDBLevelDBBackingStore::open(securityOrigin.get(), dataDir, maximumSize, uniqueIdentifier, this);

Ditto.

&gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:148
&gt; +        if (!toObjStoreNames.contains(fromObjStoreNames[i])) {

I think what Eric meant by his &quot;early continue&quot; comment is that you could turn this into

if (toObjStoreNames.contains(fromObjStoreNames[i]))
    continue;

// do migration here...

I.e. the functionality is the same, it&apos;s just a style thing, reducing the nesting of blocks.

&gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:159
&gt; +                keyPath = true;

Maybe &quot;bool hasKeyPath = !fromKeyPaths[i].isEmpty();&quot; is simpler. Also, I&apos;m not sure what this is used for, see comment below.

&gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:181
&gt; +                ASSERT(keyPath);

If I understand correctly, this asserts that the object store has a key path. I don&apos;t see why that would hold? It&apos;s prefectly ok for an object store not to have a key path, and have indexes.

&gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:184
&gt; +                    break;

maybe return false?

&gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:208
&gt; +    toDatabaseExistedBefore = IDBLevelDBBackingStore::backingStoreExists(securityOrigin, dataDir);

this seems to check that the &quot;to origin&quot; exists, which isn&apos;t the same as that the &quot;to database&quot; exists in that origin.

&gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:232
&gt; +    // Open &quot;To&quot; database. First find out if it already exists -- this will determine if

the &quot;First find out if it already exists&quot; comment doesn&apos;t seem to apply here.. you&apos;re just opening the backing store?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>424432</commentid>
    <comment_count>8</comment_count>
    <who name="Greg Simon">gregsimon</who>
    <bug_when>2011-06-21 06:52:58 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; (From update of attachment 97872 [details])
&gt; Hi Greg,
&gt; 
&gt; Thanks again for working on this. It&apos;s a tricky area.
&gt; 
&gt; My main worry is that the patch confuses backing stores and databases, and fileIdentifiers and uniqueIdentifiers. See comments inline, and ping me if there&apos;s anything I can clarify.

The separation of backing store and backends was present before this patch. I believe this is the correct way to do it because the two are related to each other (the backend has a pointer to the backingstore, which are both going to be different depending on leveldb or sqlite. Ideally there would not be a different between backing store and backend. 

&gt; 
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=97872&amp;action=review
&gt; 
&gt; &gt; LayoutTests/storage/indexeddb/migrate-basics.html:154
&gt; &gt; +    shouldBeTrue(&quot;(window.store.index(&apos;ExampleIndex&apos;) != undefined)&quot;);
&gt; 
&gt; we also need to check that the index actually contains anything
&gt; 
&gt; &gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:95
&gt; &gt; +    IDBBackingStoreMap::iterator it2 = m_backingStoreMap.find(uniqueIdentifier);
&gt; 
&gt; This is a regression of what I fixed in Bug 62382. It is important that m_backingStoreMap is keyed *per origin* (fileIdentifier) rather than per database (uniqueIdentifier).
&gt; 
&gt; The m_backingStoreMap&apos;s purpose is to cache open backing stores, so that we only keep a single connection to each backing store. If a LevelDB database is opened more than once simultaneously, it will cause corruption.

The backend keeps a pointer to a backing store so they are related even though they are separate C++ objects. This is an important fact in the migration code which is why I keep them together.

&gt; 
&gt; This comment applies throughout the patch.
&gt; 
&gt; &gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:104
&gt; &gt; +            // LayoutTests: SQLite backing store may not exist on disk but may exist in cache.
&gt; 
&gt; Nice catch; I hadn&apos;t thought of this.
&gt; 
&gt; &gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:117
&gt; &gt; +            backingStore = IDBSQLiteBackingStore::open(securityOrigin.get(), dataDir, maximumSize, uniqueIdentifier, this);
&gt; 
&gt; Again, this seems to undo the patch from Bug 62382. Is this deliberate, or a merge thing?
&gt; 
&gt; &gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:120
&gt; &gt; +            backingStore = IDBLevelDBBackingStore::open(securityOrigin.get(), dataDir, maximumSize, uniqueIdentifier, this);
&gt; 
&gt; Ditto.
&gt; 
&gt; &gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:148
&gt; &gt; +        if (!toObjStoreNames.contains(fromObjStoreNames[i])) {
&gt; 
&gt; I think what Eric meant by his &quot;early continue&quot; comment is that you could turn this into
&gt; 
&gt; if (toObjStoreNames.contains(fromObjStoreNames[i]))
&gt;     continue;

Ah yes I missed that.

&gt; 
&gt; // do migration here...
&gt; 
&gt; I.e. the functionality is the same, it&apos;s just a style thing, reducing the nesting of blocks.
&gt; 
&gt; &gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:159
&gt; &gt; +                keyPath = true;
&gt; 
&gt; Maybe &quot;bool hasKeyPath = !fromKeyPaths[i].isEmpty();&quot; is simpler. Also, I&apos;m not sure what this is used for, see comment below.
&gt; 
&gt; &gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:181
&gt; &gt; +                ASSERT(keyPath);
&gt; 
&gt; If I understand correctly, this asserts that the object store has a key path. I don&apos;t see why that would hold? It&apos;s prefectly ok for an object store not to have a key path, and have indexes.

I guess am misunderstanding the spec then because it mentions indexes using a keypath. I can remove the assertion.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:184
&gt; &gt; +                    break;
&gt; 
&gt; maybe return false?
&gt; 
&gt; &gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:208
&gt; &gt; +    toDatabaseExistedBefore = IDBLevelDBBackingStore::backingStoreExists(securityOrigin, dataDir);
&gt; 
&gt; this seems to check that the &quot;to origin&quot; exists, which isn&apos;t the same as that the &quot;to database&quot; exists in that origin.

Hmm. Yes, right -- the name needs to be in there too.

The purpose of this extra check is because if you call extractMetaData on an emptydatabase it seems to corrupt the store and you can&apos;t populate it anymore. OTOH, calling setDatabaseMetaData more than once increments the databaseId each time. THis was not a problem until we decided we would do partial/merge migrations. I suspect we should *not* do merge/partial migrations, which was the logic captured in patch 61000.
 
&gt; &gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:232
&gt; &gt; +    // Open &quot;To&quot; database. First find out if it already exists -- this will determine if
&gt; 
&gt; the &quot;First find out if it already exists&quot; comment doesn&apos;t seem to apply here.. you&apos;re just opening the backing store?

See above comment about extractMetaData.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>424450</commentid>
    <comment_count>9</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-06-21 07:52:49 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; &gt; &gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:95
&gt; &gt; &gt; +    IDBBackingStoreMap::iterator it2 = m_backingStoreMap.find(uniqueIdentifier);
&gt; &gt; 
&gt; &gt; This is a regression of what I fixed in Bug 62382. It is important that m_backingStoreMap is keyed *per origin* (fileIdentifier) rather than per database (uniqueIdentifier).
&gt; &gt; 
&gt; &gt; The m_backingStoreMap&apos;s purpose is to cache open backing stores, so that we only keep a single connection to each backing store. If a LevelDB database is opened more than once simultaneously, it will cause corruption.
&gt; 
&gt; The backend keeps a pointer to a backing store so they are related even though they are separate C++ objects. This is an important fact in the migration code which is why I keep them together.

Yes, they are related, but it&apos;s not a 1-1 relationship, it&apos;s more like 1-n since there can be n databases for each backing store.

I see that it&apos;s important to keep backing stores with LevelDB vs SQLite apart, which we can do by making the store type part of the fileIdentifier.

It&apos;s essential that we keep track of which backing stores are open, and make sure we don&apos;t open the same one twice. That&apos;s what m_backingStoreMap, keyed with fileIdentifier, does.



&gt; &gt; &gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:159
&gt; &gt; &gt; +                keyPath = true;
&gt; &gt; 
&gt; &gt; Maybe &quot;bool hasKeyPath = !fromKeyPaths[i].isEmpty();&quot; is simpler. Also, I&apos;m not sure what this is used for, see comment below.
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:181
&gt; &gt; &gt; +                ASSERT(keyPath);
&gt; &gt; 
&gt; &gt; If I understand correctly, this asserts that the object store has a key path. I don&apos;t see why that would hold? It&apos;s prefectly ok for an object store not to have a key path, and have indexes.
&gt; 
&gt; I guess am misunderstanding the spec then because it mentions indexes using a key ath. I can remove the assertion.

An index always has a key path. An object store may or may not have one. The assert seems to check for an object store key path.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>424824</commentid>
    <comment_count>10</comment_count>
      <attachid>98073</attachid>
    <who name="Greg Simon">gregsimon</who>
    <bug_when>2011-06-21 16:01:23 -0700</bug_when>
    <thetext>Created attachment 98073
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>428015</commentid>
    <comment_count>11</comment_count>
      <attachid>98073</attachid>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-06-27 09:54:44 -0700</bug_when>
    <thetext>Comment on attachment 98073
Patch

This looks great, I only have nits left :)


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

&gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:49
&gt; +    return securityOrigin-&gt;databaseIdentifier() + &quot;@&quot; + name + String::format(&quot;@%d&quot;, type);

i think computeUniqueIdentifier could re-use computeFileIdentifier... something like

return computeFileIdentifier(...) + &quot;@&quot; + name

&gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:148
&gt; +    // Migrate objectStores. Check to see if the object store already exists in the target

period.

&gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:158
&gt; +        int64_t assignedObjectStoreId=-1;

space around &apos;=&apos; operator

&gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:167
&gt; +            keyPath = true;

I don&apos;t see keyPath actually being used anywhere.. probably a leftover from earlier version of the patch?

&gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:176
&gt; +                    break;

return false?

&gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:191
&gt; +                break;

return false?

&gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:193
&gt; +            IDBObjectStoreBackendImpl::populateIndex(*toBackingStore, toDatabaseId, assignedObjectStoreId, indexId, fromKeyPaths[i]);

populateIndex returns a bool on failure, so let&apos;s check it

&gt; Source/WebCore/storage/IDBFactoryBackendImpl.cpp:252
&gt; +    int64_t toDatabaseId=-1;

space around &apos;=&apos;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>428096</commentid>
    <comment_count>12</comment_count>
      <attachid>98749</attachid>
    <who name="Greg Simon">gregsimon</who>
    <bug_when>2011-06-27 10:58:16 -0700</bug_when>
    <thetext>Created attachment 98749
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>428138</commentid>
    <comment_count>13</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-06-27 11:34:16 -0700</bug_when>
    <thetext>(In reply to comment #12)
&gt; Created an attachment (id=98749) [details]
&gt; Patch

LGTM</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>428962</commentid>
    <comment_count>14</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-06-28 10:41:48 -0700</bug_when>
    <thetext>Dimitri: I think Greg intended to ping you about this. Can you take a look?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>429068</commentid>
    <comment_count>15</comment_count>
      <attachid>98749</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-06-28 12:19:46 -0700</bug_when>
    <thetext>Comment on attachment 98749
Patch

Clearing flags on attachment: 98749

Committed r89948: &lt;http://trac.webkit.org/changeset/89948&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>429069</commentid>
    <comment_count>16</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-06-28 12:19:51 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>97405</attachid>
            <date>2011-06-15 22:56:16 -0700</date>
            <delta_ts>2011-06-20 15:40:31 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-62780-20110615225615.patch</filename>
            <type>text/plain</type>
            <size>11591</size>
            <attacher name="Greg Simon">gregsimon</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogODkwMDYKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5n
ZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxvZwppbmRleCA5MGNmNDQ2ZWJhM2JjYTJkMDFlZjZh
YmFlOGNjYTA3MmQ4M2Y0YjFiLi40MTM4NzFiNTI3YTk1NzQyZGM5MTYwM2FhZmE2MDhlZTFhOWJh
NTJhIDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKKysrIGIvTGF5b3V0VGVzdHMv
Q2hhbmdlTG9nCkBAIC0xLDMgKzEsMTIgQEAKKzIwMTEtMDYtMTUgIEdyZWcgU2ltb24gIDxncmVn
c2ltb25AY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgIFVwZGF0ZSB0ZXN0IGV4cGVjdGF0aW9ucyBiZWNhdXNlIG1pZ3JhdGlvbiBj
b2RlIGlzIG5vdyBwcmVzZW50Li4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTYyNzgwCisKKyAgICAgICAgKiBzdG9yYWdlL2luZGV4ZWRkYi9taWdyYXRl
LWJhc2ljcy1leHBlY3RlZC50eHQ6CisKIDIwMTEtMDYtMDggIEtlaXNoaSBIYXR0b3JpICA8a2Vp
c2hpQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgS2VudCBUYW11cmEuCmRpZmYg
LS1naXQgYS9MYXlvdXRUZXN0cy9zdG9yYWdlL2luZGV4ZWRkYi9taWdyYXRlLWJhc2ljcy1leHBl
Y3RlZC50eHQgYi9MYXlvdXRUZXN0cy9zdG9yYWdlL2luZGV4ZWRkYi9taWdyYXRlLWJhc2ljcy1l
eHBlY3RlZC50eHQKaW5kZXggMmM5MjEwMTE2MzMwNTllNTJmNDBkOTZmZDhiZjFiNmQ1N2Q5OTU3
ZS4uOGY1MWU1ZTVkNTY5ZjM3OTk0YzMzNTU0NDAwMGE0MDRhNDczZDc5ZSAxMDA2NDQKLS0tIGEv
TGF5b3V0VGVzdHMvc3RvcmFnZS9pbmRleGVkZGIvbWlncmF0ZS1iYXNpY3MtZXhwZWN0ZWQudHh0
CisrKyBiL0xheW91dFRlc3RzL3N0b3JhZ2UvaW5kZXhlZGRiL21pZ3JhdGUtYmFzaWNzLWV4cGVj
dGVkLnR4dApAQCAtMjcsOSArMjcsMjIgQEAgZGIgPSBldmVudC50YXJnZXQucmVzdWx0CiB0cmFu
cyA9IGRiLnRyYW5zYWN0aW9uKFtdLCB3ZWJraXRJREJUcmFuc2FjdGlvbi5SRUFEX1dSSVRFLCAw
KQogbGV2ZWxkYkNoZWNrUGxhaW5PbGRTdG9yZSgpOgogc3RvcmUgPSB0cmFucy5vYmplY3RTdG9y
ZSgnTWlncmF0aW9uUGxhaW5PbGRTdG9yZScpCi1GQUlMIHN0b3JlID0gdHJhbnMub2JqZWN0U3Rv
cmUoJ01pZ3JhdGlvblBsYWluT2xkU3RvcmUnKSB0aHJldyBleGNlcHRpb24gRXJyb3I6IE5PVF9G
T1VORF9FUlI6IERPTSBJREJEYXRhYmFzZSBFeGNlcHRpb24gMwogcmVxdWVzdCA9IHN0b3JlLm9w
ZW5DdXJzb3Ioa2V5UmFuZ2UpCi1GQUlMIHJlcXVlc3QgPSBzdG9yZS5vcGVuQ3Vyc29yKGtleVJh
bmdlKSB0aHJldyBleGNlcHRpb24gVHlwZUVycm9yOiBDYW5ub3QgY2FsbCBtZXRob2QgJ29wZW5D
dXJzb3InIG9mIHVuZGVmaW5lZAorbGV2ZWxkYkNoZWNrUGxhaW5PbGRTdG9yZUN1cnNvck5leHQo
KToKK1BBU1MgY3Vyc29yLnZhbHVlLm5hbWUgPT0gJ0dlb3JnZScgaXMgdHJ1ZQorbGV2ZWxkYkNo
ZWNrUGxhaW5PbGRTdG9yZUN1cnNvck5leHQoKToKK2xldmVsZGJDaGVja1N0b3JlV2l0aEtleVBh
dGgoKToKK3N0b3JlID0gdHJhbnMub2JqZWN0U3RvcmUoJ01pZ3JhdGlvblN0b3JlV2l0aEtleVBh
dGgnKQorbGV2ZWxkYkNoZWNrU3RvcmVXaXRoS2V5UGF0aEN1cnNvck5leHQoKToKK1BBU1MgY3Vy
c29yLnZhbHVlLm5hbWUgPT0gJ1Rob21hcycgaXMgdHJ1ZQorUEFTUyBjdXJzb3IudmFsdWUuaWQg
PT0gJzMnIGlzIHRydWUKK2xldmVsZGJDaGVja1N0b3JlV2l0aEtleVBhdGhDdXJzb3JOZXh0KCk6
CitsZXZlbGRiQ2hlY2tTdG9yZVdpdGhBdXRvSW5jcmVtZW50KCk6CitzdG9yZSA9IHRyYW5zLm9i
amVjdFN0b3JlKCdNaWdyYXRpb25TdG9yZVdpdGhBdXRvSW5jcmVtZW50JykKK2xldmVsZGJDaGVj
a1N0b3JlV2l0aEF1dG9JbmNyZW1lbnRDdXJzb3JOZXh0KCk6CitQQVNTIGN1cnNvci52YWx1ZS5u
YW1lID09ICdMaW5jb2xuJyBpcyB0cnVlCitQQVNTIGN1cnNvci52YWx1ZS5udW1iZXIgPT0gJzcw
MTInIGlzIHRydWUKK2xldmVsZGJDaGVja1N0b3JlV2l0aEF1dG9JbmNyZW1lbnRDdXJzb3JOZXh0
KCk6CiBQQVNTIHN1Y2Nlc3NmdWxseVBhcnNlZCBpcyB0cnVlCiAKIFRFU1QgQ09NUExFVEUKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwppbmRleCA5N2ZhNjY3ZWU5ZTQyMmIzMjk5MTg0ZTRiNWU5ODM3NWI5ZWMxMWNlLi5kYzky
MmQ3ZmM0ZjkwOTJiNjA1YWRmMzA4MWY0ZTA4ZTZmYzJjM2QxIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMg
KzEsMTYgQEAKKzIwMTEtMDYtMTUgIEdyZWcgU2ltb24gIDxncmVnc2ltb25AY2hyb21pdW0ub3Jn
PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIE1pZ3Jh
dGUgU1FMaXRlIGJhY2tpbmcgc3RvcmUgdG8gTGV2ZWxEQiBiYWNraW5nIHN0b3JlIGZvciBJbmRl
eGVkZGIuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02
Mjc4MAorCisgICAgICAgICogc3RvcmFnZS9JREJGYWN0b3J5QmFja2VuZEltcGwuY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6SURCRmFjdG9yeUJhY2tlbmRJbXBsOjpvcGVuKToKKyAgICAgICAgKFdl
YkNvcmU6OklEQkZhY3RvcnlCYWNrZW5kSW1wbDo6bWlncmF0ZSk6CisgICAgICAgICogc3RvcmFn
ZS9JREJTUUxpdGVCYWNraW5nU3RvcmUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6SURCU1FMaXRl
QmFja2luZ1N0b3JlOjpiYWNraW5nU3RvcmVFeGlzdHMpOgorCiAyMDExLTA2LTA4ICBLZWlzaGkg
SGF0dG9yaSAgPGtlaXNoaUB3ZWJraXQub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEtlbnQg
VGFtdXJhLgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJGYWN0b3J5QmFj
a2VuZEltcGwuY3BwIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJGYWN0b3J5QmFja2VuZElt
cGwuY3BwCmluZGV4IGRkOWE4OTk3NjJkMzQ0M2M0YzQ1NTZiOTI1ZDY3YWE5M2E4MzBjZTguLjY4
N2MxNmUwMmI5MWZiN2M5ODk2MjU2Yzk5OWIzN2YwYjI1M2RhZDAgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL3N0b3JhZ2UvSURCRmFjdG9yeUJhY2tlbmRJbXBsLmNwcAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9zdG9yYWdlL0lEQkZhY3RvcnlCYWNrZW5kSW1wbC5jcHAKQEAgLTM1LDYgKzM1LDcg
QEAKICNpbmNsdWRlICJJREJMZXZlbERCQmFja2luZ1N0b3JlLmgiCiAjaW5jbHVkZSAiSURCU1FM
aXRlQmFja2luZ1N0b3JlLmgiCiAjaW5jbHVkZSAiSURCVHJhbnNhY3Rpb25Db29yZGluYXRvci5o
IgorI2luY2x1ZGUgIkxldmVsREJUcmFuc2FjdGlvbi5oIgogI2luY2x1ZGUgIlNlY3VyaXR5T3Jp
Z2luLmgiCiAjaW5jbHVkZSA8d3RmL1RocmVhZGluZy5oPgogI2luY2x1ZGUgPHd0Zi9VbnVzZWRQ
YXJhbS5oPgpAQCAtODEsOSArODIsMTAgQEAgdm9pZCBJREJGYWN0b3J5QmFja2VuZEltcGw6Om9w
ZW4oY29uc3QgU3RyaW5nJiBuYW1lLCBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4gY2EKIAogICAg
IC8vIEZJWE1FOiBFdmVyeXRoaW5nIGZyb20gbm93IG9uIHNob3VsZCBiZSBkb25lIG9uIGFub3Ro
ZXIgdGhyZWFkLgogCisgICAgLy8gR2V0IHRoZSBiYWNraW5nIHN0b3JlIGZvciByZXF1ZXN0ZWQg
dHlwZS4KICAgICBSZWZQdHI8SURCQmFja2luZ1N0b3JlPiBiYWNraW5nU3RvcmU7CiAgICAgSURC
QmFja2luZ1N0b3JlTWFwOjppdGVyYXRvciBpdDIgPSBtX2JhY2tpbmdTdG9yZU1hcC5maW5kKHVu
aXF1ZUlkZW50aWZpZXIpOwotICAgIGlmIChpdDIgIT0gbV9iYWNraW5nU3RvcmVNYXAuZW5kKCkg
JiYgKGJhY2tpbmdTdG9yZVR5cGUgPT0gaXQyLT5zZWNvbmQtPmJhY2tpbmdTdG9yZVR5cGUoKSkp
CisgICAgaWYgKGl0MiAhPSBtX2JhY2tpbmdTdG9yZU1hcC5lbmQoKSkKICAgICAgICAgYmFja2lu
Z1N0b3JlID0gaXQyLT5zZWNvbmQ7CiAgICAgZWxzZSB7CiAjaWYgRU5BQkxFKExFVkVMREIpCkBA
IC05MSwxMyArOTMsMTcgQEAgdm9pZCBJREJGYWN0b3J5QmFja2VuZEltcGw6Om9wZW4oY29uc3Qg
U3RyaW5nJiBuYW1lLCBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4gY2EKICAgICAgICAgYm9vbCBo
YXNTUUxCYWNraW5nU3RvcmUgPSBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmJhY2tpbmdTdG9yZUV4
aXN0cyhzZWN1cml0eU9yaWdpbi5nZXQoKSwgZGF0YURpcik7CiAgICAgICAgIGJvb2wgaGFzTGV2
ZWxEQkJhY2tpbmdTdG9yZSA9IElEQkxldmVsREJCYWNraW5nU3RvcmU6OmJhY2tpbmdTdG9yZUV4
aXN0cyhzZWN1cml0eU9yaWdpbi5nZXQoKSwgZGF0YURpcik7CiAKLSAgICAgICAgaWYgKGhhc1NR
TEJhY2tpbmdTdG9yZSAmJiBoYXNMZXZlbERCQmFja2luZ1N0b3JlKQotICAgICAgICAgICAgYmFj
a2luZ1N0b3JlVHlwZSA9IExldmVsREJCYWNraW5nU3RvcmU7CisgICAgICAgIC8vIExheW91dFRl
c3RzOiBTUUxpdGUgYmFja2luZyBzdG9yZSBtYXkgbm90IGV4aXN0IG9uIGRpc2sgYnV0IG1heSBl
eGlzdCBpbiBjYWNoZS4KKyAgICAgICAgU3RyaW5nIGNhY2hlZFNxbGl0ZUJhY2tpbmdTdG9yZUlk
ZW50aWZpZXIgPSBzZWN1cml0eU9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkgKyAiQCIgKyBu
YW1lICsgU3RyaW5nOjpmb3JtYXQoIkAlZCIsIChpbnQpU1FMaXRlQmFja2luZ1N0b3JlKTsKKyAg
ICAgICAgaWYgKCFoYXNTUUxCYWNraW5nU3RvcmUgJiYgKG1fYmFja2luZ1N0b3JlTWFwLmVuZCgp
ICE9IG1fYmFja2luZ1N0b3JlTWFwLmZpbmQoY2FjaGVkU3FsaXRlQmFja2luZ1N0b3JlSWRlbnRp
ZmllcikpKQorICAgICAgICAgICAgaGFzU1FMQmFja2luZ1N0b3JlID0gdHJ1ZTsKIAotICAgICAg
ICAvLyBNaWdyYXRpb246IGlmIHRoZSBkYXRhYmFzZSBleGlzdHMgYW5kIGlzIFNRTGl0ZSB3ZSB3
YW50IHRvIG1pZ3JhdGUgaXQgdG8gTGV2ZWxEQi4KLSAgICAgICAgaWYgKGhhc1NRTEJhY2tpbmdT
dG9yZSAmJiAhaGFzTGV2ZWxEQkJhY2tpbmdTdG9yZSkgewotICAgICAgICAgICAgaWYgKG1pZ3Jh
dGUobmFtZSwgc2VjdXJpdHlPcmlnaW4uZ2V0KCksIGRhdGFEaXIsIG1heGltdW1TaXplKSkKKyAg
ICAgICAgLy8gTWlncmF0aW9uOiBpZiBTUUxpdGUgZGF0YWJhc2UgZXhpc3RzIGFuZCB0aGUgcmVx
dWVzdGVkIHR5cGUgaXMgTGV2ZWxEQiwgbWlncmF0ZSBpdCB0byBMZXZlbERCLgorICAgICAgICBp
ZiAoYmFja2luZ1N0b3JlVHlwZSA9PSBMZXZlbERCQmFja2luZ1N0b3JlICYmIGhhc1NRTEJhY2tp
bmdTdG9yZSAmJiAhaGFzTGV2ZWxEQkJhY2tpbmdTdG9yZSkgeworICAgICAgICAgICAgaWYgKG1p
Z3JhdGUobmFtZSwgc2VjdXJpdHlPcmlnaW4uZ2V0KCksIGRhdGFEaXIsIG1heGltdW1TaXplKSkg
eworICAgICAgICAgICAgICAgIHVuaXF1ZUlkZW50aWZpZXIgPSBzZWN1cml0eU9yaWdpbi0+ZGF0
YWJhc2VJZGVudGlmaWVyKCkgKyAiQCIgKyBuYW1lICsgU3RyaW5nOjpmb3JtYXQoIkAlZCIsIChp
bnQpTGV2ZWxEQkJhY2tpbmdTdG9yZSk7CiAgICAgICAgICAgICAgICAgYmFja2luZ1N0b3JlVHlw
ZSA9IExldmVsREJCYWNraW5nU3RvcmU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICNlbmRp
ZgogCkBAIC0xMjAsNiArMTI2LDEwNyBAQCB2b2lkIElEQkZhY3RvcnlCYWNrZW5kSW1wbDo6b3Bl
bihjb25zdCBTdHJpbmcmIG5hbWUsIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBjYQogCiBib29s
IElEQkZhY3RvcnlCYWNrZW5kSW1wbDo6bWlncmF0ZShjb25zdCBTdHJpbmcmIG5hbWUsIFNlY3Vy
aXR5T3JpZ2luKiBzZWN1cml0eU9yaWdpbiwgY29uc3QgU3RyaW5nJiBkYXRhRGlyLCBpbnQ2NF90
IG1heGltdW1TaXplKQogeworI2lmIEVOQUJMRShMRVZFTERCKQorICAgIFN0cmluZyBmcm9tVW5p
cXVlSWRlbnRpZmllciA9IHNlY3VyaXR5T3JpZ2luLT5kYXRhYmFzZUlkZW50aWZpZXIoKSArICJA
IiArIG5hbWUgKyBTdHJpbmc6OmZvcm1hdCgiQCVkIiwgU1FMaXRlQmFja2luZ1N0b3JlKTsKKyAg
ICBTdHJpbmcgdG9VbmlxdWVJZGVudGlmaWVyID0gc2VjdXJpdHlPcmlnaW4tPmRhdGFiYXNlSWRl
bnRpZmllcigpICsgIkAiICsgbmFtZSArIFN0cmluZzo6Zm9ybWF0KCJAJWQiLCBMZXZlbERCQmFj
a2luZ1N0b3JlKTsKKyAgICBSZWZQdHI8SURCVHJhbnNhY3Rpb25Db29yZGluYXRvcj4gdHJhbnNh
Y3Rpb25Db29yZGluYXRvciA9IElEQlRyYW5zYWN0aW9uQ29vcmRpbmF0b3I6OmNyZWF0ZSgpOwor
ICAgIFJlZlB0cjxJREJCYWNraW5nU3RvcmU+IGZyb21CYWNraW5nU3RvcmU7CisgICAgUmVmUHRy
PElEQkRhdGFiYXNlQmFja2VuZEltcGw+IGZyb21EYXRhYmFzZUJhY2tlbmQ7CisKKyAgICAvLyBP
cGVuICJGcm9tIiBiYWNraW5nIHN0b3JlIGFuZCBiYWNrZW5kLiBXaGVuIHJ1bm5pbmcgTGF5b3V0
VGVzdHMsIHRoZQorICAgIC8vICJmcm9tIiBkYXRhYmFzZSBtYXkgYmUgY2FjaGVkIGluIHRoaXMg
Y2xhc3MgaW5zdGFuY2UsIHNvIGxvb2sgZm9yIGl0IHRoZXJlIGZpcnN0LgorICAgIElEQkJhY2tp
bmdTdG9yZU1hcDo6aXRlcmF0b3IgaXQgPSBtX2JhY2tpbmdTdG9yZU1hcC5maW5kKGZyb21Vbmlx
dWVJZGVudGlmaWVyKTsKKyAgICBpZiAoaXQgIT0gbV9iYWNraW5nU3RvcmVNYXAuZW5kKCkpCisg
ICAgICAgIGZyb21CYWNraW5nU3RvcmUgPSBpdC0+c2Vjb25kOworICAgIGVsc2UKKyAgICAgICAg
ZnJvbUJhY2tpbmdTdG9yZSA9IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6b3BlbihzZWN1cml0eU9y
aWdpbiwgZGF0YURpciwgbWF4aW11bVNpemUsIGZyb21VbmlxdWVJZGVudGlmaWVyLCB0aGlzKTsK
KworICAgIGlmICghZnJvbUJhY2tpbmdTdG9yZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgSURCRGF0YWJhc2VCYWNrZW5kTWFwOjppdGVyYXRvciBpdDIgPSBtX2RhdGFiYXNlQmFja2Vu
ZE1hcC5maW5kKGZyb21VbmlxdWVJZGVudGlmaWVyKTsKKyAgICBpZiAoaXQyICE9IG1fZGF0YWJh
c2VCYWNrZW5kTWFwLmVuZCgpKQorICAgICAgICBmcm9tRGF0YWJhc2VCYWNrZW5kID0gaXQyLT5z
ZWNvbmQ7CisgICAgZWxzZSB7CisgICAgICAgIGZyb21EYXRhYmFzZUJhY2tlbmQgPSBJREJEYXRh
YmFzZUJhY2tlbmRJbXBsOjpjcmVhdGUobmFtZSwgZnJvbUJhY2tpbmdTdG9yZS5nZXQoKSwgdHJh
bnNhY3Rpb25Db29yZGluYXRvci5nZXQoKSwgdGhpcywgZnJvbVVuaXF1ZUlkZW50aWZpZXIpOwor
ICAgICAgICBtX2RhdGFiYXNlQmFja2VuZE1hcC5zZXQoZnJvbVVuaXF1ZUlkZW50aWZpZXIsIGZy
b21EYXRhYmFzZUJhY2tlbmQuZ2V0KCkpOworICAgIH0KKworICAgIGlmICghZnJvbURhdGFiYXNl
QmFja2VuZCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gT3BlbiAiVG8iIGRhdGFi
YXNlLgorICAgIFJlZlB0cjxJREJCYWNraW5nU3RvcmU+IHRvQmFja2luZ1N0b3JlID0gSURCTGV2
ZWxEQkJhY2tpbmdTdG9yZTo6b3BlbihzZWN1cml0eU9yaWdpbiwgZGF0YURpciwgbWF4aW11bVNp
emUsIHRvVW5pcXVlSWRlbnRpZmllciwgdGhpcyk7CisgICAgaWYgKCF0b0JhY2tpbmdTdG9yZSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisKKyAgICBWZWN0b3I8aW50NjRfdD4gZnJvbU9ialN0
b3JlSWRzLCB0b09ialN0b3JlSWRzOworICAgIFZlY3RvcjxTdHJpbmc+IGZyb21PYmpTdG9yZU5h
bWVzLCB0b09ialN0b3JlTmFtZXM7CisgICAgVmVjdG9yPFN0cmluZz4gZnJvbUtleVBhdGhzLCB0
b0tleVBhdGhzOworICAgIFZlY3Rvcjxib29sPiBmcm9tQXV0b0luY3JlbWVudCwgdG9BdXRvSW5j
cmVtZW50OworICAgIFN0cmluZyB0b0RhdGFiYXNlTmFtZSA9IGZyb21EYXRhYmFzZUJhY2tlbmQt
Pm5hbWUoKTsKKyAgICBTdHJpbmcgdG9EYXRhYmFzZVZlcnNpb24gPSBmcm9tRGF0YWJhc2VCYWNr
ZW5kLT52ZXJzaW9uKCk7CisgICAgaW50NjRfdCB0b0RhdGFiYXNlSWQ9LTE7CisKKworICAgIC8v
IEdlbmVyYXRlIG1ldGEtZGF0YSBmb3IgdGhlIG5ldyBkYXRhYmFzZS4KKyAgICBpZiAoIXRvQmFj
a2luZ1N0b3JlLT5zZXRJREJEYXRhYmFzZU1ldGFEYXRhKHRvRGF0YWJhc2VOYW1lLCB0b0RhdGFi
YXNlVmVyc2lvbiwgdG9EYXRhYmFzZUlkLCB0cnVlKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgLy8gTWlncmF0ZSBvYmplY3RTdG9yZXMuIENoZWNrIHRvIHNlZSBpZiB0aGUgb2JqZWN0
IHN0b3JlIGFscmVhZHkgZXhpc3RzIGluIHRoZSB0YXJnZXQKKyAgICBmcm9tQmFja2luZ1N0b3Jl
LT5nZXRPYmplY3RTdG9yZXMoZnJvbURhdGFiYXNlQmFja2VuZC0+aWQoKSwgZnJvbU9ialN0b3Jl
SWRzLCBmcm9tT2JqU3RvcmVOYW1lcywgZnJvbUtleVBhdGhzLCBmcm9tQXV0b0luY3JlbWVudCk7
CisKKyAgICB0b0JhY2tpbmdTdG9yZS0+Z2V0T2JqZWN0U3RvcmVzKHRvRGF0YWJhc2VJZCwgdG9P
YmpTdG9yZUlkcywgdG9PYmpTdG9yZU5hbWVzLCB0b0tleVBhdGhzLCB0b0F1dG9JbmNyZW1lbnQp
OworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZyb21PYmpTdG9yZUlkcy5zaXplKCk7
IGkrKykgeworICAgICAgICBpZiAoIXRvT2JqU3RvcmVOYW1lcy5jb250YWlucyhmcm9tT2JqU3Rv
cmVOYW1lc1tpXSkpIHsKKyAgICAgICAgICAgIGJvb2wga2V5UGF0aCA9IGZhbHNlOworICAgICAg
ICAgICAgaW50NjRfdCBhc3NpZ25lZE9iamVjdFN0b3JlSWQ9LTE7CisKKyAgICAgICAgICAgIFJl
ZlB0cjxJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uPiB0cmFucyA9IHRvQmFja2luZ1N0b3Jl
LT5jcmVhdGVUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgdHJhbnMtPmJlZ2luKCk7CisKKyAg
ICAgICAgICAgIGlmICghdG9CYWNraW5nU3RvcmUtPmNyZWF0ZU9iamVjdFN0b3JlKHRvRGF0YWJh
c2VJZCwgZnJvbU9ialN0b3JlTmFtZXNbaV0sIGZyb21LZXlQYXRoc1tpXSwgZnJvbUF1dG9JbmNy
ZW1lbnRbaV0sIGFzc2lnbmVkT2JqZWN0U3RvcmVJZCkpCisgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgICAgICAgICBpZiAoIWZyb21LZXlQYXRoc1tpXS5pc0VtcHR5KCkpCisg
ICAgICAgICAgICAgICAga2V5UGF0aCA9IHRydWU7CisKKyAgICAgICAgICAgIFJlZlB0cjxJREJC
YWNraW5nU3RvcmU6OkN1cnNvcj4gY3Vyc29yID0gZnJvbUJhY2tpbmdTdG9yZS0+b3Blbk9iamVj
dFN0b3JlQ3Vyc29yKGZyb21EYXRhYmFzZUJhY2tlbmQtPmlkKCksIGZyb21PYmpTdG9yZUlkc1tp
XSwgMCwgSURCQ3Vyc29yOjpORVhUKTsKKyAgICAgICAgICAgIGlmIChjdXJzb3IpIHsKKyAgICAg
ICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIFJlZlB0cjxJREJLZXk+IGtleSA9
IGN1cnNvci0+a2V5KCk7CisgICAgICAgICAgICAgICAgICAgIFJlZlB0cjxJREJCYWNraW5nU3Rv
cmU6Ok9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcj4gcmVjb3JkSWRlbnRpZmllciA9IHRvQmFj
a2luZ1N0b3JlLT5jcmVhdGVJbnZhbGlkUmVjb3JkSWRlbnRpZmllcigpOworCisgICAgICAgICAg
ICAgICAgICAgIGlmICghdG9CYWNraW5nU3RvcmUtPnB1dE9iamVjdFN0b3JlUmVjb3JkKHRvRGF0
YWJhc2VJZCwgYXNzaWduZWRPYmplY3RTdG9yZUlkLCAqKGtleS5nZXQoKSksIGN1cnNvci0+dmFs
dWUoKSwgcmVjb3JkSWRlbnRpZmllci5nZXQoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBi
cmVhazsKKworICAgICAgICAgICAgICAgIH0gd2hpbGUgKGN1cnNvci0+Y29udGludWVGdW5jdGlv
bigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTWlncmF0ZSBpbmRleGVzIChw
ZXIgb2JqZWN0c3RvcmUpLgorICAgICAgICAgICAgVmVjdG9yPGludDY0X3Q+IGlkeElkczsKKyAg
ICAgICAgICAgIFZlY3RvcjxTdHJpbmc+IGlkeE5hbWVzOworICAgICAgICAgICAgVmVjdG9yPFN0
cmluZz4gaWR4S2V5UGF0aHM7CisgICAgICAgICAgICBWZWN0b3I8Ym9vbD4gaWR4VW5pcXVlOwor
ICAgICAgICAgICAgZnJvbUJhY2tpbmdTdG9yZS0+Z2V0SW5kZXhlcyhmcm9tRGF0YWJhc2VCYWNr
ZW5kLT5pZCgpLCBmcm9tT2JqU3RvcmVJZHNbaV0sIGlkeElkcywgaWR4TmFtZXMsIGlkeEtleVBh
dGhzLCBpZHhVbmlxdWUpOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IGlk
eElkcy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIGludDY0X3QgaW5kZXhJZCA9IC0x
OworICAgICAgICAgICAgICAgIFN0cmluZyBrZXlQYXRoID0gaWR4S2V5UGF0aHNbal07CisgICAg
ICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpZHhOYW1lc1tqXTsKKworICAgICAgICAgICAgICAg
IGlmICghdG9CYWNraW5nU3RvcmUtPmNyZWF0ZUluZGV4KHRvRGF0YWJhc2VJZCwgYXNzaWduZWRP
YmplY3RTdG9yZUlkLCBuYW1lLCBrZXlQYXRoLCBpZHhVbmlxdWVbal0sIGluZGV4SWQpKQorICAg
ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJh
bnMtPmNvbW1pdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisKKyNl
bmRpZiAvLyBFTkFCTEUoTEVWRUxEQikKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCU1FMaXRlQmFja2luZ1N0b3JlLmNwcCBiL1Nv
dXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCU1FMaXRlQmFja2luZ1N0b3JlLmNwcAppbmRleCAyYzQ4
ZjBlYWFjYjg1NjBhNDYzNDk1YmE4NGYxYTFmZWVmNTQwM2E1Li4wNDhmNWVlMzYwNzFlODUxOWUy
Y2UzZTE2MGMyMDBjNjE2OGUxZWVlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdl
L0lEQlNRTGl0ZUJhY2tpbmdTdG9yZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9J
REJTUUxpdGVCYWNraW5nU3RvcmUuY3BwCkBAIC05OTMsMTYgKzk5MywxNyBAQCBQYXNzUmVmUHRy
PElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJTUUxpdGVCYWNraW5nU3RvcmU6Om9wZW5JbmRl
eEN1cnNvcihpbnQ2NAogCiBib29sIElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6YmFja2luZ1N0b3Jl
RXhpc3RzKFNlY3VyaXR5T3JpZ2luKiBzZWN1cml0eU9yaWdpbiwgY29uc3QgU3RyaW5nJiBwYXRo
QmFzZSkKIHsKKyAgICBpZiAocGF0aEJhc2UuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKICAgICBTdHJpbmcgcGF0aCA9IHBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChwYXRoQmFz
ZSwgc2VjdXJpdHlPcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpICsgIi5pbmRleGVkZGIiKTsK
ICAgICBpZiAoIWZpbGVFeGlzdHMocGF0aCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAg
IFNRTGl0ZURhdGFiYXNlIGRiOwotICAgIGlmICghZGIub3BlbihwYXRoKSkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgIGlmIChmaWxlRXhpc3RzKHBhdGgpKQorICAgICAgICByZXR1cm4gdHJ1
ZTsKIAotICAgIGRiLmNsb3NlKCk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNl
OwogfQogCiBuYW1lc3BhY2Ugewo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>97872</attachid>
            <date>2011-06-20 15:40:35 -0700</date>
            <delta_ts>2011-06-21 16:01:18 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-62780-20110620154034.patch</filename>
            <type>text/plain</type>
            <size>16704</size>
            <attacher name="Greg Simon">gregsimon</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogODkyOTcKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5n
ZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxvZwppbmRleCAwMDk3NDA1ZGQxNDhjMmZjMDc0ZDhk
M2I1ZWVkYzViZGMxMTAxMWY4Li5iNTkyM2U5YzlkYWJmZTE1MmZkNWQ0OGM3OTE2MTI3YmY5YTY3
YmFmIDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKKysrIGIvTGF5b3V0VGVzdHMv
Q2hhbmdlTG9nCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTEtMDYtMjAgIEdyZWcgU2ltb24gIDxncmVn
c2ltb25AY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgIFVwZGF0ZSBtaWdyYXRpb24gbGF5b3V0IHRlc3QgZXhwZWN0YXRpb25zIHRv
IG1lYXN1cmUgYWN0dWFsIG1pZ3JhdGlvbiBzdWNjZXNzLgorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjI3ODAKKworICAgICAgICAqIHN0b3JhZ2UvaW5k
ZXhlZGRiL21pZ3JhdGUtYmFzaWNzLWV4cGVjdGVkLnR4dDoKKyAgICAgICAgKiBzdG9yYWdlL2lu
ZGV4ZWRkYi9taWdyYXRlLWJhc2ljcy5odG1sOgorCiAyMDExLTA2LTIwICBNYXJ0aW4gUm9iaW5z
b24gIDxtcm9iaW5zb25AaWdhbGlhLmNvbT4KIAogICAgICAgICBSZWJhc2VsaW5lIHNvbWUgdGVz
dHMgZm9yIEdUSysgYWZ0ZXIgcjg5MjU3LgpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvc3RvcmFn
ZS9pbmRleGVkZGIvbWlncmF0ZS1iYXNpY3MtZXhwZWN0ZWQudHh0IGIvTGF5b3V0VGVzdHMvc3Rv
cmFnZS9pbmRleGVkZGIvbWlncmF0ZS1iYXNpY3MtZXhwZWN0ZWQudHh0CmluZGV4IDJjOTIxMDEx
NjMzMDU5ZTUyZjQwZDk2ZmQ4YmYxYjZkNTdkOTk1N2UuLjgyM2FmYmVmZTAzYTdhMGNlYjUxYzgy
MzhlN2EwN2E5NDQzZTBmZGMgMTAwNjQ0Ci0tLSBhL0xheW91dFRlc3RzL3N0b3JhZ2UvaW5kZXhl
ZGRiL21pZ3JhdGUtYmFzaWNzLWV4cGVjdGVkLnR4dAorKysgYi9MYXlvdXRUZXN0cy9zdG9yYWdl
L2luZGV4ZWRkYi9taWdyYXRlLWJhc2ljcy1leHBlY3RlZC50eHQKQEAgLTI3LDkgKzI3LDIzIEBA
IGRiID0gZXZlbnQudGFyZ2V0LnJlc3VsdAogdHJhbnMgPSBkYi50cmFuc2FjdGlvbihbXSwgd2Vi
a2l0SURCVHJhbnNhY3Rpb24uUkVBRF9XUklURSwgMCkKIGxldmVsZGJDaGVja1BsYWluT2xkU3Rv
cmUoKToKIHN0b3JlID0gdHJhbnMub2JqZWN0U3RvcmUoJ01pZ3JhdGlvblBsYWluT2xkU3RvcmUn
KQotRkFJTCBzdG9yZSA9IHRyYW5zLm9iamVjdFN0b3JlKCdNaWdyYXRpb25QbGFpbk9sZFN0b3Jl
JykgdGhyZXcgZXhjZXB0aW9uIEVycm9yOiBOT1RfRk9VTkRfRVJSOiBET00gSURCRGF0YWJhc2Ug
RXhjZXB0aW9uIDMKIHJlcXVlc3QgPSBzdG9yZS5vcGVuQ3Vyc29yKGtleVJhbmdlKQotRkFJTCBy
ZXF1ZXN0ID0gc3RvcmUub3BlbkN1cnNvcihrZXlSYW5nZSkgdGhyZXcgZXhjZXB0aW9uIFR5cGVF
cnJvcjogQ2Fubm90IGNhbGwgbWV0aG9kICdvcGVuQ3Vyc29yJyBvZiB1bmRlZmluZWQKK2xldmVs
ZGJDaGVja1BsYWluT2xkU3RvcmVDdXJzb3JOZXh0KCk6CitQQVNTIGN1cnNvci52YWx1ZS5uYW1l
ID09ICdHZW9yZ2UnIGlzIHRydWUKK2xldmVsZGJDaGVja1BsYWluT2xkU3RvcmVDdXJzb3JOZXh0
KCk6CitsZXZlbGRiQ2hlY2tTdG9yZVdpdGhLZXlQYXRoKCk6CitzdG9yZSA9IHRyYW5zLm9iamVj
dFN0b3JlKCdNaWdyYXRpb25TdG9yZVdpdGhLZXlQYXRoJykKK2xldmVsZGJDaGVja1N0b3JlV2l0
aEtleVBhdGhDdXJzb3JOZXh0KCk6CitQQVNTICh3aW5kb3cuc3RvcmUuaW5kZXgoJ0V4YW1wbGVJ
bmRleCcpICE9IHVuZGVmaW5lZCkgaXMgdHJ1ZQorUEFTUyBjdXJzb3IudmFsdWUubmFtZSA9PSAn
VGhvbWFzJyBpcyB0cnVlCitQQVNTIGN1cnNvci52YWx1ZS5pZCA9PSAnMycgaXMgdHJ1ZQorbGV2
ZWxkYkNoZWNrU3RvcmVXaXRoS2V5UGF0aEN1cnNvck5leHQoKToKK2xldmVsZGJDaGVja1N0b3Jl
V2l0aEF1dG9JbmNyZW1lbnQoKToKK3N0b3JlID0gdHJhbnMub2JqZWN0U3RvcmUoJ01pZ3JhdGlv
blN0b3JlV2l0aEF1dG9JbmNyZW1lbnQnKQorbGV2ZWxkYkNoZWNrU3RvcmVXaXRoQXV0b0luY3Jl
bWVudEN1cnNvck5leHQoKToKK1BBU1MgY3Vyc29yLnZhbHVlLm5hbWUgPT0gJ0xpbmNvbG4nIGlz
IHRydWUKK1BBU1MgY3Vyc29yLnZhbHVlLm51bWJlciA9PSAnNzAxMicgaXMgdHJ1ZQorbGV2ZWxk
YkNoZWNrU3RvcmVXaXRoQXV0b0luY3JlbWVudEN1cnNvck5leHQoKToKIFBBU1Mgc3VjY2Vzc2Z1
bGx5UGFyc2VkIGlzIHRydWUKIAogVEVTVCBDT01QTEVURQpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVz
dHMvc3RvcmFnZS9pbmRleGVkZGIvbWlncmF0ZS1iYXNpY3MuaHRtbCBiL0xheW91dFRlc3RzL3N0
b3JhZ2UvaW5kZXhlZGRiL21pZ3JhdGUtYmFzaWNzLmh0bWwKaW5kZXggNGFlYjBhMzExNThmM2Q0
ZWMxZTQ2NjIzZDAxODQ1MDJjOThlMDg4Yy4uMTc2NzJiNDY2NDAxNjIzNWYxZjBlOTA2NGI1YzRi
ZmJjNjFlYTVjYSAxMDA2NDQKLS0tIGEvTGF5b3V0VGVzdHMvc3RvcmFnZS9pbmRleGVkZGIvbWln
cmF0ZS1iYXNpY3MuaHRtbAorKysgYi9MYXlvdXRUZXN0cy9zdG9yYWdlL2luZGV4ZWRkYi9taWdy
YXRlLWJhc2ljcy5odG1sCkBAIC0xNTEsNiArMTUxLDcgQEAgZnVuY3Rpb24gbGV2ZWxkYkNoZWNr
U3RvcmVXaXRoS2V5UGF0aEN1cnNvck5leHQoKQogICAgICAgICByZXR1cm47CiAgICAgfQogCisg
ICAgc2hvdWxkQmVUcnVlKCIod2luZG93LnN0b3JlLmluZGV4KCdFeGFtcGxlSW5kZXgnKSAhPSB1
bmRlZmluZWQpIik7CiAgICAgc2hvdWxkQmVUcnVlKCJjdXJzb3IudmFsdWUubmFtZSA9PSAnVGhv
bWFzJyIpOwogICAgIHNob3VsZEJlVHJ1ZSgiY3Vyc29yLnZhbHVlLmlkID09ICczJyIpOwogICAg
IGN1cnNvci5jb250aW51ZSgpOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9n
IGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCmluZGV4IGYzMTZlMWEyZWMxYWJiNjQzOWY2YTA2
MWY1NjY2YjZjYzU2OWZmZTMuLjBjNjFjN2Q5MDUyMTQ4YTYxMzAyNjFiNDM2NGY5YTZmOTMxNDA0
OGUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyMSBAQAorMjAxMS0wNi0yMCAgR3JlZyBTaW1vbiAg
PGdyZWdzaW1vbkBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgTWlncmF0ZSBTUUxpdGUgYmFja2luZyBzdG9yZSB0byBMZXZlbERC
IGJhY2tpbmcgc3RvcmUgZm9yIEluZGV4ZWRkYi4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTYyNzgwCisKKyAgICAgICAgKiBzdG9yYWdlL0lEQkZhY3Rv
cnlCYWNrZW5kSW1wbC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpjb21wdXRlVW5pcXVlSWRlbnRp
Zmllcik6CisgICAgICAgIChXZWJDb3JlOjpJREJGYWN0b3J5QmFja2VuZEltcGw6Om9wZW4pOgor
ICAgICAgICAoV2ViQ29yZTo6bWlncmF0ZU9iamVjdFN0b3Jlcyk6CisgICAgICAgIChXZWJDb3Jl
OjpJREJGYWN0b3J5QmFja2VuZEltcGw6Om1pZ3JhdGVGcm9tU1FMaXRlVG9MZXZlbERCKToKKyAg
ICAgICAgKiBzdG9yYWdlL0lEQk9iamVjdFN0b3JlQmFja2VuZEltcGwuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6SURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6cG9wdWxhdGVJbmRleCk6CisgICAg
ICAgICogc3RvcmFnZS9JREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsLmg6CisgICAgICAgICogc3Rv
cmFnZS9JREJTUUxpdGVCYWNraW5nU3RvcmUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6SURCU1FM
aXRlQmFja2luZ1N0b3JlOjpiYWNraW5nU3RvcmVFeGlzdHMpOgorCiAyMDExLTA2LTIwICBKZXIg
Tm9ibGUgIDxqZXIubm9ibGVAYXBwbGUuY29tPgogCiAgICAgICAgIFVucmV2aWV3ZWQgYnVpbGQg
Zml4OyBGaXggTGVvcGFyZCBXZWJDb3JlIGJ1aWxkLgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvc3RvcmFnZS9JREJGYWN0b3J5QmFja2VuZEltcGwuY3BwIGIvU291cmNlL1dlYkNvcmUvc3Rv
cmFnZS9JREJGYWN0b3J5QmFja2VuZEltcGwuY3BwCmluZGV4IDAyYzUwNTg3YzI1YjlhZjI5ZTQ1
MjYzM2ZhZjEzMmE5MzkwYjNiM2EuLjEwMzcxYzM3M2FlNDkxNzRhYjYyNGM5YWY3YmFjZGM4ODhk
MTliMjggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCRmFjdG9yeUJhY2tl
bmRJbXBsLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkZhY3RvcnlCYWNrZW5k
SW1wbC5jcHAKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlICJJREJEYXRhYmFzZUJhY2tlbmRJ
bXBsLmgiCiAjaW5jbHVkZSAiSURCRGF0YWJhc2VFeGNlcHRpb24uaCIKICNpbmNsdWRlICJJREJM
ZXZlbERCQmFja2luZ1N0b3JlLmgiCisjaW5jbHVkZSAiSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1w
bC5oIgogI2luY2x1ZGUgIklEQlNRTGl0ZUJhY2tpbmdTdG9yZS5oIgogI2luY2x1ZGUgIklEQlRy
YW5zYWN0aW9uQ29vcmRpbmF0b3IuaCIKICNpbmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIgpAQCAt
NDMsNiArNDQsMTEgQEAKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCitzdGF0aWMgU3RyaW5nIGNv
bXB1dGVVbmlxdWVJZGVudGlmaWVyKGNvbnN0IFN0cmluZyYgbmFtZSwgU2VjdXJpdHlPcmlnaW4q
IHNlY3VyaXR5T3JpZ2luLCBJREJGYWN0b3J5QmFja2VuZEludGVyZmFjZTo6QmFja2luZ1N0b3Jl
VHlwZSB0eXBlKQoreworICAgIHJldHVybiBzZWN1cml0eU9yaWdpbi0+ZGF0YWJhc2VJZGVudGlm
aWVyKCkgKyAiQCIgKyBuYW1lICsgU3RyaW5nOjpmb3JtYXQoIkAlZCIsIHR5cGUpOworfQorCiBJ
REJGYWN0b3J5QmFja2VuZEltcGw6OklEQkZhY3RvcnlCYWNrZW5kSW1wbCgpCiAgICAgOiBtX3Ry
YW5zYWN0aW9uQ29vcmRpbmF0b3IoSURCVHJhbnNhY3Rpb25Db29yZGluYXRvcjo6Y3JlYXRlKCkp
CiB7CkBAIC03NSw5ICs4MSw4IEBAIHZvaWQgSURCRmFjdG9yeUJhY2tlbmRJbXBsOjpvcGVuKGNv
bnN0IFN0cmluZyYgbmFtZSwgUGFzc1JlZlB0cjxJREJDYWxsYmFja3M+IGNhCiAgICAgaWYgKGJh
Y2tpbmdTdG9yZVR5cGUgPT0gRGVmYXVsdEJhY2tpbmdTdG9yZSkKICAgICAgICAgYmFja2luZ1N0
b3JlVHlwZSA9IFNRTGl0ZUJhY2tpbmdTdG9yZTsgLy8gRklYTUU6IERlZmF1bHRCYWNraW5nU3Rv
cmUgaXMgY29uZnVzaW5nOyBnZXQgcmlkIG9mIGl0LgogCi0gICAgY29uc3QgU3RyaW5nIGZpbGVJ
ZGVudGlmaWVyID0gc2VjdXJpdHlPcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpICsgU3RyaW5n
Ojpmb3JtYXQoIkAlZCIsIHN0YXRpY19jYXN0PGludD4oYmFja2luZ1N0b3JlVHlwZSkpOwotICAg
IGNvbnN0IFN0cmluZyB1bmlxdWVJZGVudGlmaWVyID0gZmlsZUlkZW50aWZpZXIgKyAiQCIgKyBu
YW1lOwotCisgICAgU3RyaW5nIHVuaXF1ZUlkZW50aWZpZXIgPSBjb21wdXRlVW5pcXVlSWRlbnRp
ZmllcihuYW1lLCBzZWN1cml0eU9yaWdpbi5nZXQoKSwgYmFja2luZ1N0b3JlVHlwZSk7CisgICAg
CiAgICAgSURCRGF0YWJhc2VCYWNrZW5kTWFwOjppdGVyYXRvciBpdCA9IG1fZGF0YWJhc2VCYWNr
ZW5kTWFwLmZpbmQodW5pcXVlSWRlbnRpZmllcik7CiAgICAgaWYgKGl0ICE9IG1fZGF0YWJhc2VC
YWNrZW5kTWFwLmVuZCgpKSB7CiAgICAgICAgIGNhbGxiYWNrcy0+b25TdWNjZXNzKGl0LT5zZWNv
bmQpOwpAQCAtODcsMTQgKzkyLDE5IEBAIHZvaWQgSURCRmFjdG9yeUJhY2tlbmRJbXBsOjpvcGVu
KGNvbnN0IFN0cmluZyYgbmFtZSwgUGFzc1JlZlB0cjxJREJDYWxsYmFja3M+IGNhCiAgICAgLy8g
RklYTUU6IEV2ZXJ5dGhpbmcgZnJvbSBub3cgb24gc2hvdWxkIGJlIGRvbmUgb24gYW5vdGhlciB0
aHJlYWQuCiAKICAgICBSZWZQdHI8SURCQmFja2luZ1N0b3JlPiBiYWNraW5nU3RvcmU7Ci0gICAg
SURCQmFja2luZ1N0b3JlTWFwOjppdGVyYXRvciBpdDIgPSBtX2JhY2tpbmdTdG9yZU1hcC5maW5k
KGZpbGVJZGVudGlmaWVyKTsKKyAgICBJREJCYWNraW5nU3RvcmVNYXA6Oml0ZXJhdG9yIGl0MiA9
IG1fYmFja2luZ1N0b3JlTWFwLmZpbmQodW5pcXVlSWRlbnRpZmllcik7CiAgICAgaWYgKGl0MiAh
PSBtX2JhY2tpbmdTdG9yZU1hcC5lbmQoKSAmJiAoYmFja2luZ1N0b3JlVHlwZSA9PSBpdDItPnNl
Y29uZC0+YmFja2luZ1N0b3JlVHlwZSgpKSkKICAgICAgICAgYmFja2luZ1N0b3JlID0gaXQyLT5z
ZWNvbmQ7CiAgICAgZWxzZSB7CiAKICNpZiBFTkFCTEUoTEVWRUxEQikKICAgICAgICAgaWYgKGJh
Y2tpbmdTdG9yZVR5cGUgPT0gTGV2ZWxEQkJhY2tpbmdTdG9yZSkgewotICAgICAgICAgICAgY29u
c3QgYm9vbCBoYXNTUUxCYWNraW5nU3RvcmUgPSBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmJhY2tp
bmdTdG9yZUV4aXN0cyhzZWN1cml0eU9yaWdpbi5nZXQoKSwgZGF0YURpcik7CisgICAgICAgICAg
ICBib29sIGhhc1NRTEJhY2tpbmdTdG9yZSA9IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6YmFja2lu
Z1N0b3JlRXhpc3RzKHNlY3VyaXR5T3JpZ2luLmdldCgpLCBkYXRhRGlyKTsKKworICAgICAgICAg
ICAgLy8gTGF5b3V0VGVzdHM6IFNRTGl0ZSBiYWNraW5nIHN0b3JlIG1heSBub3QgZXhpc3Qgb24g
ZGlzayBidXQgbWF5IGV4aXN0IGluIGNhY2hlLgorICAgICAgICAgICAgU3RyaW5nIGNhY2hlZFNx
bGl0ZUJhY2tpbmdTdG9yZUlkZW50aWZpZXIgPSBjb21wdXRlVW5pcXVlSWRlbnRpZmllcihuYW1l
LCBzZWN1cml0eU9yaWdpbi5nZXQoKSwgU1FMaXRlQmFja2luZ1N0b3JlKTsKKyAgICAgICAgICAg
IGlmICghaGFzU1FMQmFja2luZ1N0b3JlICYmIChtX2JhY2tpbmdTdG9yZU1hcC5lbmQoKSAhPSBt
X2JhY2tpbmdTdG9yZU1hcC5maW5kKGNhY2hlZFNxbGl0ZUJhY2tpbmdTdG9yZUlkZW50aWZpZXIp
KSkKKyAgICAgICAgICAgICAgICBoYXNTUUxCYWNraW5nU3RvcmUgPSB0cnVlOwogCiAgICAgICAg
ICAgICBpZiAoaGFzU1FMQmFja2luZ1N0b3JlKSB7CiAgICAgICAgICAgICAgICAgYm9vbCBtaWdy
YXRpb25TdWNjZWVkZWQgPSBtaWdyYXRlRnJvbVNRTGl0ZVRvTGV2ZWxEQihuYW1lLCBzZWN1cml0
eU9yaWdpbi5nZXQoKSwgZGF0YURpciwgbWF4aW11bVNpemUpOwpAQCAtMTA0LDEwICsxMTQsMTAg
QEAgdm9pZCBJREJGYWN0b3J5QmFja2VuZEltcGw6Om9wZW4oY29uc3QgU3RyaW5nJiBuYW1lLCBQ
YXNzUmVmUHRyPElEQkNhbGxiYWNrcz4gY2EKICNlbmRpZgogCiAgICAgICAgIGlmIChiYWNraW5n
U3RvcmVUeXBlID09IFNRTGl0ZUJhY2tpbmdTdG9yZSkKLSAgICAgICAgICAgIGJhY2tpbmdTdG9y
ZSA9IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6b3BlbihzZWN1cml0eU9yaWdpbi5nZXQoKSwgZGF0
YURpciwgbWF4aW11bVNpemUsIGZpbGVJZGVudGlmaWVyLCB0aGlzKTsKKyAgICAgICAgICAgIGJh
Y2tpbmdTdG9yZSA9IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6b3BlbihzZWN1cml0eU9yaWdpbi5n
ZXQoKSwgZGF0YURpciwgbWF4aW11bVNpemUsIHVuaXF1ZUlkZW50aWZpZXIsIHRoaXMpOwogI2lm
IEVOQUJMRShMRVZFTERCKQogICAgICAgICBlbHNlIGlmIChiYWNraW5nU3RvcmVUeXBlID09IExl
dmVsREJCYWNraW5nU3RvcmUpCi0gICAgICAgICAgICBiYWNraW5nU3RvcmUgPSBJREJMZXZlbERC
QmFja2luZ1N0b3JlOjpvcGVuKHNlY3VyaXR5T3JpZ2luLmdldCgpLCBkYXRhRGlyLCBtYXhpbXVt
U2l6ZSwgZmlsZUlkZW50aWZpZXIsIHRoaXMpOworICAgICAgICAgICAgYmFja2luZ1N0b3JlID0g
SURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6b3BlbihzZWN1cml0eU9yaWdpbi5nZXQoKSwgZGF0YURp
ciwgbWF4aW11bVNpemUsIHVuaXF1ZUlkZW50aWZpZXIsIHRoaXMpOwogI2VuZGlmCiAgICAgICAg
IGlmICghYmFja2luZ1N0b3JlKSB7CiAgICAgICAgICAgICBjYWxsYmFja3MtPm9uRXJyb3IoSURC
RGF0YWJhc2VFcnJvcjo6Y3JlYXRlKElEQkRhdGFiYXNlRXhjZXB0aW9uOjpVTktOT1dOX0VSUiwg
IkludGVybmFsIGVycm9yLiIpKTsKQEAgLTEyMCw5ICsxMzAsMTMwIEBAIHZvaWQgSURCRmFjdG9y
eUJhY2tlbmRJbXBsOjpvcGVuKGNvbnN0IFN0cmluZyYgbmFtZSwgUGFzc1JlZlB0cjxJREJDYWxs
YmFja3M+IGNhCiAgICAgbV9kYXRhYmFzZUJhY2tlbmRNYXAuc2V0KHVuaXF1ZUlkZW50aWZpZXIs
IGRhdGFiYXNlQmFja2VuZC5nZXQoKSk7CiB9CiAKKyNpZiBFTkFCTEUoTEVWRUxEQikKKworc3Rh
dGljIGJvb2wgbWlncmF0ZU9iamVjdFN0b3JlcyhQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4g
ZnJvbUJhY2tpbmdTdG9yZSwgaW50NjRfdCBmcm9tRGF0YWJhc2VJZCwgUGFzc1JlZlB0cjxJREJC
YWNraW5nU3RvcmU+IHRvQmFja2luZ1N0b3JlLCBpbnQ2NF90IHRvRGF0YWJhc2VJZCkKK3sKKyAg
ICBWZWN0b3I8aW50NjRfdD4gZnJvbU9ialN0b3JlSWRzLCB0b09ialN0b3JlSWRzOworICAgIFZl
Y3RvcjxTdHJpbmc+IGZyb21PYmpTdG9yZU5hbWVzLCB0b09ialN0b3JlTmFtZXM7CisgICAgVmVj
dG9yPFN0cmluZz4gZnJvbUtleVBhdGhzLCB0b0tleVBhdGhzOworICAgIFZlY3Rvcjxib29sPiBm
cm9tQXV0b0luY3JlbWVudCwgdG9BdXRvSW5jcmVtZW50OworCisgICAgLy8gTWlncmF0ZSBvYmpl
Y3RTdG9yZXMuIENoZWNrIHRvIHNlZSBpZiB0aGUgb2JqZWN0IHN0b3JlIGFscmVhZHkgZXhpc3Rz
IGluIHRoZSB0YXJnZXQKKyAgICBmcm9tQmFja2luZ1N0b3JlLT5nZXRPYmplY3RTdG9yZXMoZnJv
bURhdGFiYXNlSWQsIGZyb21PYmpTdG9yZUlkcywgZnJvbU9ialN0b3JlTmFtZXMsIGZyb21LZXlQ
YXRocywgZnJvbUF1dG9JbmNyZW1lbnQpOworCisgICAgdG9CYWNraW5nU3RvcmUtPmdldE9iamVj
dFN0b3Jlcyh0b0RhdGFiYXNlSWQsIHRvT2JqU3RvcmVJZHMsIHRvT2JqU3RvcmVOYW1lcywgdG9L
ZXlQYXRocywgdG9BdXRvSW5jcmVtZW50KTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBmcm9tT2JqU3RvcmVJZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKCF0b09ialN0b3Jl
TmFtZXMuY29udGFpbnMoZnJvbU9ialN0b3JlTmFtZXNbaV0pKSB7CisgICAgICAgICAgICBib29s
IGtleVBhdGggPSBmYWxzZTsKKyAgICAgICAgICAgIGludDY0X3QgYXNzaWduZWRPYmplY3RTdG9y
ZUlkPS0xOworCisgICAgICAgICAgICBSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlv
bj4gdHJhbnMgPSB0b0JhY2tpbmdTdG9yZS0+Y3JlYXRlVHJhbnNhY3Rpb24oKTsKKyAgICAgICAg
ICAgIHRyYW5zLT5iZWdpbigpOworCisgICAgICAgICAgICBpZiAoIXRvQmFja2luZ1N0b3JlLT5j
cmVhdGVPYmplY3RTdG9yZSh0b0RhdGFiYXNlSWQsIGZyb21PYmpTdG9yZU5hbWVzW2ldLCBmcm9t
S2V5UGF0aHNbaV0sIGZyb21BdXRvSW5jcmVtZW50W2ldLCBhc3NpZ25lZE9iamVjdFN0b3JlSWQp
KQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgaWYgKCFmcm9t
S2V5UGF0aHNbaV0uaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIGtleVBhdGggPSB0cnVlOwor
CisgICAgICAgICAgICBSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IGN1cnNvciA9IGZy
b21CYWNraW5nU3RvcmUtPm9wZW5PYmplY3RTdG9yZUN1cnNvcihmcm9tRGF0YWJhc2VJZCwgZnJv
bU9ialN0b3JlSWRzW2ldLCAwLCBJREJDdXJzb3I6Ok5FWFQpOworICAgICAgICAgICAgaWYgKGN1
cnNvcikgeworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgUmVmUHRy
PElEQktleT4ga2V5ID0gY3Vyc29yLT5rZXkoKTsKKyAgICAgICAgICAgICAgICAgICAgUmVmUHRy
PElEQkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRJZGVudGlmaWVyPiByZWNvcmRJZGVu
dGlmaWVyID0gdG9CYWNraW5nU3RvcmUtPmNyZWF0ZUludmFsaWRSZWNvcmRJZGVudGlmaWVyKCk7
CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF0b0JhY2tpbmdTdG9yZS0+cHV0T2JqZWN0U3Rv
cmVSZWNvcmQodG9EYXRhYmFzZUlkLCBhc3NpZ25lZE9iamVjdFN0b3JlSWQsICooa2V5LmdldCgp
KSwgY3Vyc29yLT52YWx1ZSgpLCByZWNvcmRJZGVudGlmaWVyLmdldCgpKSkKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfSB3aGlsZSAoY3Vyc29yLT5j
b250aW51ZUZ1bmN0aW9uKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBQb3B1
bGF0ZSBhbnkvYWxsIGluZGV4ZXMgZm9yIHRoaXMgb2JqZWN0c3RvcmUuCisgICAgICAgICAgICBW
ZWN0b3I8aW50NjRfdD4gaWR4SWRzOworICAgICAgICAgICAgVmVjdG9yPFN0cmluZz4gaWR4TmFt
ZXM7CisgICAgICAgICAgICBWZWN0b3I8U3RyaW5nPiBpZHhLZXlQYXRoczsKKyAgICAgICAgICAg
IFZlY3Rvcjxib29sPiBpZHhVbmlxdWU7CisgICAgICAgICAgICBmcm9tQmFja2luZ1N0b3JlLT5n
ZXRJbmRleGVzKGZyb21EYXRhYmFzZUlkLCBmcm9tT2JqU3RvcmVJZHNbaV0sIGlkeElkcywgaWR4
TmFtZXMsIGlkeEtleVBhdGhzLCBpZHhVbmlxdWUpOworICAgICAgICAgICAgZm9yICh1bnNpZ25l
ZCBqID0gMDsgaiA8IGlkeElkcy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIGludDY0
X3QgaW5kZXhJZCA9IC0xOworICAgICAgICAgICAgICAgIEFTU0VSVChrZXlQYXRoKTsKKworICAg
ICAgICAgICAgICAgIGlmICghdG9CYWNraW5nU3RvcmUtPmNyZWF0ZUluZGV4KHRvRGF0YWJhc2VJ
ZCwgYXNzaWduZWRPYmplY3RTdG9yZUlkLCBpZHhOYW1lc1tqXSwgaWR4S2V5UGF0aHNbal0sIGlk
eFVuaXF1ZVtqXSwgaW5kZXhJZCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAg
ICAgICAgICAgICAgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6cG9wdWxhdGVJbmRleCgqdG9C
YWNraW5nU3RvcmUsIHRvRGF0YWJhc2VJZCwgYXNzaWduZWRPYmplY3RTdG9yZUlkLCBpbmRleElk
LCBmcm9tS2V5UGF0aHNbaV0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmFucy0+
Y29tbWl0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKyNlbmRp
ZiAvLyAjaWYgRU5BQkxFKExFVkVMREIpCisKIGJvb2wgSURCRmFjdG9yeUJhY2tlbmRJbXBsOjpt
aWdyYXRlRnJvbVNRTGl0ZVRvTGV2ZWxEQihjb25zdCBTdHJpbmcmIG5hbWUsIFNlY3VyaXR5T3Jp
Z2luKiBzZWN1cml0eU9yaWdpbiwgY29uc3QgU3RyaW5nJiBkYXRhRGlyLCBpbnQ2NF90IG1heGlt
dW1TaXplKQogewotICAgIHJldHVybiBmYWxzZTsgLy8gRklYTUU6IFRvIGJlIGltcGxlbWVudGVk
LgorI2lmIEVOQUJMRShMRVZFTERCKQorICAgIFN0cmluZyBmcm9tVW5pcXVlSWRlbnRpZmllciA9
IGNvbXB1dGVVbmlxdWVJZGVudGlmaWVyKG5hbWUsIHNlY3VyaXR5T3JpZ2luLCBTUUxpdGVCYWNr
aW5nU3RvcmUpOworICAgIFN0cmluZyB0b1VuaXF1ZUlkZW50aWZpZXIgPSBjb21wdXRlVW5pcXVl
SWRlbnRpZmllcihuYW1lLCBzZWN1cml0eU9yaWdpbiwgTGV2ZWxEQkJhY2tpbmdTdG9yZSk7Cisg
ICAgUmVmUHRyPElEQlRyYW5zYWN0aW9uQ29vcmRpbmF0b3I+IHRyYW5zYWN0aW9uQ29vcmRpbmF0
b3IgPSBJREJUcmFuc2FjdGlvbkNvb3JkaW5hdG9yOjpjcmVhdGUoKTsKKyAgICBib29sIHRvRGF0
YWJhc2VFeGlzdGVkQmVmb3JlID0gZmFsc2U7CisgICAgUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4g
ZnJvbUJhY2tpbmdTdG9yZTsKKyAgICBSZWZQdHI8SURCRGF0YWJhc2VCYWNrZW5kSW1wbD4gZnJv
bURhdGFiYXNlQmFja2VuZDsKKyAgICBSZWZQdHI8SURCQmFja2luZ1N0b3JlPiB0b0JhY2tpbmdT
dG9yZTsKKworICAgIHRvRGF0YWJhc2VFeGlzdGVkQmVmb3JlID0gSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZTo6YmFja2luZ1N0b3JlRXhpc3RzKHNlY3VyaXR5T3JpZ2luLCBkYXRhRGlyKTsKKworICAg
IC8vIE9wZW4gIkZyb20iIGJhY2tpbmcgc3RvcmUgYW5kIGJhY2tlbmQuIFdoZW4gcnVubmluZyBM
YXlvdXRUZXN0cywgdGhlCisgICAgLy8gImZyb20iIGRhdGFiYXNlIG1heSBiZSBjYWNoZWQgaW4g
dGhpcyBjbGFzcyBpbnN0YW5jZSwgc28gbG9vayBmb3IgaXQgdGhlcmUgZmlyc3QuCisgICAgSURC
QmFja2luZ1N0b3JlTWFwOjppdGVyYXRvciBpdCA9IG1fYmFja2luZ1N0b3JlTWFwLmZpbmQoZnJv
bVVuaXF1ZUlkZW50aWZpZXIpOworICAgIGlmIChpdCAhPSBtX2JhY2tpbmdTdG9yZU1hcC5lbmQo
KSkKKyAgICAgICAgZnJvbUJhY2tpbmdTdG9yZSA9IGl0LT5zZWNvbmQ7CisgICAgZWxzZQorICAg
ICAgICBmcm9tQmFja2luZ1N0b3JlID0gSURCU1FMaXRlQmFja2luZ1N0b3JlOjpvcGVuKHNlY3Vy
aXR5T3JpZ2luLCBkYXRhRGlyLCBtYXhpbXVtU2l6ZSwgZnJvbVVuaXF1ZUlkZW50aWZpZXIsIHRo
aXMpOworCisgICAgaWYgKCFmcm9tQmFja2luZ1N0b3JlKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICBJREJEYXRhYmFzZUJhY2tlbmRNYXA6Oml0ZXJhdG9yIGl0MiA9IG1fZGF0YWJhc2VC
YWNrZW5kTWFwLmZpbmQoZnJvbVVuaXF1ZUlkZW50aWZpZXIpOworICAgIGlmIChpdDIgIT0gbV9k
YXRhYmFzZUJhY2tlbmRNYXAuZW5kKCkpCisgICAgICAgIGZyb21EYXRhYmFzZUJhY2tlbmQgPSBp
dDItPnNlY29uZDsKKyAgICBlbHNlIHsKKyAgICAgICAgZnJvbURhdGFiYXNlQmFja2VuZCA9IElE
QkRhdGFiYXNlQmFja2VuZEltcGw6OmNyZWF0ZShuYW1lLCBmcm9tQmFja2luZ1N0b3JlLmdldCgp
LCB0cmFuc2FjdGlvbkNvb3JkaW5hdG9yLmdldCgpLCB0aGlzLCBmcm9tVW5pcXVlSWRlbnRpZmll
cik7CisgICAgICAgIG1fZGF0YWJhc2VCYWNrZW5kTWFwLnNldChmcm9tVW5pcXVlSWRlbnRpZmll
ciwgZnJvbURhdGFiYXNlQmFja2VuZC5nZXQoKSk7CisgICAgfQorCisgICAgaWYgKCFmcm9tRGF0
YWJhc2VCYWNrZW5kKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBPcGVuICJUbyIg
ZGF0YWJhc2UuIEZpcnN0IGZpbmQgb3V0IGlmIGl0IGFscmVhZHkgZXhpc3RzIC0tIHRoaXMgd2ls
bCBkZXRlcm1pbmUgaWYKKyAgICAvLyBpdCBpcyBzYWZlIHRvIGNhbGwgSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZTo6ZXh0cmFjdElEQkRhdGFiYXNlTWV0YURhdGEuCisgICAgdG9CYWNraW5nU3RvcmUg
PSBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuKHNlY3VyaXR5T3JpZ2luLCBkYXRhRGlyLCBt
YXhpbXVtU2l6ZSwgdG9VbmlxdWVJZGVudGlmaWVyLCB0aGlzKTsKKyAgICBpZiAoIXRvQmFja2lu
Z1N0b3JlKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKworICAgIFN0cmluZyB0b0RhdGFiYXNl
TmFtZSA9IGZyb21EYXRhYmFzZUJhY2tlbmQtPm5hbWUoKTsKKyAgICBTdHJpbmcgdG9EYXRhYmFz
ZVZlcnNpb24gPSBmcm9tRGF0YWJhc2VCYWNrZW5kLT52ZXJzaW9uKCk7CisgICAgaW50NjRfdCB0
b0RhdGFiYXNlSWQ9LTE7CisKKyAgICAvLyBJcyBkYiBhbHJlYWR5IGhlcmU/CisgICAgaWYgKHRv
RGF0YWJhc2VFeGlzdGVkQmVmb3JlKSB7CisgICAgICAgIGlmICghdG9CYWNraW5nU3RvcmUtPmV4
dHJhY3RJREJEYXRhYmFzZU1ldGFEYXRhKHRvRGF0YWJhc2VOYW1lLCB0b0RhdGFiYXNlVmVyc2lv
biwgdG9EYXRhYmFzZUlkKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2Ug
eworICAgICAgICAvLyBHZW5lcmF0ZSBtZXRhLWRhdGEgZm9yIHRoZSBuZXcgZGF0YWJhc2UuCisg
ICAgICAgIGlmICghdG9CYWNraW5nU3RvcmUtPnNldElEQkRhdGFiYXNlTWV0YURhdGEodG9EYXRh
YmFzZU5hbWUsIHRvRGF0YWJhc2VWZXJzaW9uLCB0b0RhdGFiYXNlSWQsIHRydWUpKQorICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBtaWdyYXRlT2JqZWN0U3Rv
cmVzKGZyb21CYWNraW5nU3RvcmUsIGZyb21EYXRhYmFzZUJhY2tlbmQtPmlkKCksIHRvQmFja2lu
Z1N0b3JlLCB0b0RhdGFiYXNlSWQpOworCisjZW5kaWYgLy8gRU5BQkxFKExFVkVMREIpCisgICAg
cmV0dXJuIGZhbHNlOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQk9iamVjdFN0b3JlQmFja2VuZEltcGwuY3BwIGIvU291
cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsLmNwcAppbmRleCBh
M2NmMDcxZmU1NWI5ZDRjNzg3OTMyNmJlMDI4MmNmOGI0OWZiNzE0Li5lMDA2NjFjZGZmMDU4OTcy
MThlY2UyZmVhOTBmY2UxNDQwNGYyYmNmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9zdG9y
YWdlL0lEQk9iamVjdFN0b3JlQmFja2VuZEltcGwuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3N0
b3JhZ2UvSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbC5jcHAKQEAgLTM3NSw3ICszNzUsNyBAQCBw
cml2YXRlOgogfTsKIH0KIAotc3RhdGljIGJvb2wgcG9wdWxhdGVJbmRleChJREJCYWNraW5nU3Rv
cmUmIGJhY2tpbmdTdG9yZSwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgU3RyaW5nJiBpbmRleEtleVBhdGgpCitib29sIElE
Qk9iamVjdFN0b3JlQmFja2VuZEltcGw6OnBvcHVsYXRlSW5kZXgoSURCQmFja2luZ1N0b3JlJiBi
YWNraW5nU3RvcmUsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBp
bnQ2NF90IGluZGV4SWQsIGNvbnN0IFN0cmluZyYgaW5kZXhLZXlQYXRoKQogewogICAgIFBvcHVs
YXRlSW5kZXhDYWxsYmFjayBjYWxsYmFjayhiYWNraW5nU3RvcmUsIGluZGV4S2V5UGF0aCwgZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCk7CiAgICAgaWYgKCFiYWNraW5nU3RvcmUu
Zm9yRWFjaE9iamVjdFN0b3JlUmVjb3JkKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGNhbGxi
YWNrKSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCT2JqZWN0U3RvcmVC
YWNrZW5kSW1wbC5oIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJPYmplY3RTdG9yZUJhY2tl
bmRJbXBsLmgKaW5kZXggNmJmOTVjZDFmMWU3YTVmODk3Y2NjNWFlMzU4NWM0MDI0YmVkMDEzYS4u
YjEyNjZiZDYxMWFhYjEyNzU1ZGU4M2E5ZjBiZDQyMWI3NWU5MGZhNSAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsLmgKKysrIGIvU291
cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsLmgKQEAgLTc2LDYg
Kzc2LDggQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBkZWxldGVJbmRleChjb25zdCBTdHJp
bmcmIG5hbWUsIElEQlRyYW5zYWN0aW9uQmFja2VuZEludGVyZmFjZSosIEV4Y2VwdGlvbkNvZGUm
KTsKIAogICAgIHZpcnR1YWwgdm9pZCBvcGVuQ3Vyc29yKFBhc3NSZWZQdHI8SURCS2V5UmFuZ2U+
IHJhbmdlLCB1bnNpZ25lZCBzaG9ydCBkaXJlY3Rpb24sIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tz
PiwgSURCVHJhbnNhY3Rpb25CYWNrZW5kSW50ZXJmYWNlKiwgRXhjZXB0aW9uQ29kZSYpOworICAg
IAorICAgIHN0YXRpYyBib29sIHBvcHVsYXRlSW5kZXgoSURCQmFja2luZ1N0b3JlJiwgaW50NjRf
dCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29u
c3QgU3RyaW5nJiBpbmRleEtleVBhdGgpOwogCiBwcml2YXRlOgogICAgIElEQk9iamVjdFN0b3Jl
QmFja2VuZEltcGwoSURCQmFja2luZ1N0b3JlKiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90
IGlkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCwgYm9vbCBhdXRv
SW5jcmVtZW50KTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCU1FMaXRl
QmFja2luZ1N0b3JlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCU1FMaXRlQmFja2lu
Z1N0b3JlLmNwcAppbmRleCAyYzQ4ZjBlYWFjYjg1NjBhNDYzNDk1YmE4NGYxYTFmZWVmNTQwM2E1
Li5iYzgwNDQ5YWExNGRhMjdiYjRjOGNmMDQ3ZGJiYzMzYjFkNDQyOTViIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQlNRTGl0ZUJhY2tpbmdTdG9yZS5jcHAKKysrIGIvU291
cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJTUUxpdGVCYWNraW5nU3RvcmUuY3BwCkBAIC05OTQsMTUg
Kzk5NCw3IEBAIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQlNRTGl0ZUJh
Y2tpbmdTdG9yZTo6b3BlbkluZGV4Q3Vyc29yKGludDY0CiBib29sIElEQlNRTGl0ZUJhY2tpbmdT
dG9yZTo6YmFja2luZ1N0b3JlRXhpc3RzKFNlY3VyaXR5T3JpZ2luKiBzZWN1cml0eU9yaWdpbiwg
Y29uc3QgU3RyaW5nJiBwYXRoQmFzZSkKIHsKICAgICBTdHJpbmcgcGF0aCA9IHBhdGhCeUFwcGVu
ZGluZ0NvbXBvbmVudChwYXRoQmFzZSwgc2VjdXJpdHlPcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmll
cigpICsgIi5pbmRleGVkZGIiKTsKLSAgICBpZiAoIWZpbGVFeGlzdHMocGF0aCkpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIFNRTGl0ZURhdGFiYXNlIGRiOwotICAgIGlmICghZGIub3Bl
bihwYXRoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgZGIuY2xvc2UoKTsKLSAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmlsZUV4aXN0cyhwYXRoKTsKIH0KIAogbmFtZXNwYWNl
IHsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>98073</attachid>
            <date>2011-06-21 16:01:23 -0700</date>
            <delta_ts>2011-06-27 10:58:11 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-62780-20110621160122.patch</filename>
            <type>text/plain</type>
            <size>19681</size>
            <attacher name="Greg Simon">gregsimon</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogODkyOTcKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5n
ZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxvZwppbmRleCAwMDk3NDA1ZGQxNDhjMmZjMDc0ZDhk
M2I1ZWVkYzViZGMxMTAxMWY4Li5iNTkyM2U5YzlkYWJmZTE1MmZkNWQ0OGM3OTE2MTI3YmY5YTY3
YmFmIDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKKysrIGIvTGF5b3V0VGVzdHMv
Q2hhbmdlTG9nCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTEtMDYtMjAgIEdyZWcgU2ltb24gIDxncmVn
c2ltb25AY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgIFVwZGF0ZSBtaWdyYXRpb24gbGF5b3V0IHRlc3QgZXhwZWN0YXRpb25zIHRv
IG1lYXN1cmUgYWN0dWFsIG1pZ3JhdGlvbiBzdWNjZXNzLgorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjI3ODAKKworICAgICAgICAqIHN0b3JhZ2UvaW5k
ZXhlZGRiL21pZ3JhdGUtYmFzaWNzLWV4cGVjdGVkLnR4dDoKKyAgICAgICAgKiBzdG9yYWdlL2lu
ZGV4ZWRkYi9taWdyYXRlLWJhc2ljcy5odG1sOgorCiAyMDExLTA2LTIwICBNYXJ0aW4gUm9iaW5z
b24gIDxtcm9iaW5zb25AaWdhbGlhLmNvbT4KIAogICAgICAgICBSZWJhc2VsaW5lIHNvbWUgdGVz
dHMgZm9yIEdUSysgYWZ0ZXIgcjg5MjU3LgpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvc3RvcmFn
ZS9pbmRleGVkZGIvbWlncmF0ZS1iYXNpY3MtZXhwZWN0ZWQudHh0IGIvTGF5b3V0VGVzdHMvc3Rv
cmFnZS9pbmRleGVkZGIvbWlncmF0ZS1iYXNpY3MtZXhwZWN0ZWQudHh0CmluZGV4IDJjOTIxMDEx
NjMzMDU5ZTUyZjQwZDk2ZmQ4YmYxYjZkNTdkOTk1N2UuLjU3ZWZkYTU1MDczZmNhNmIyNTJkODEw
ZThhYjFhMTVmNGNkMDkyY2QgMTAwNjQ0Ci0tLSBhL0xheW91dFRlc3RzL3N0b3JhZ2UvaW5kZXhl
ZGRiL21pZ3JhdGUtYmFzaWNzLWV4cGVjdGVkLnR4dAorKysgYi9MYXlvdXRUZXN0cy9zdG9yYWdl
L2luZGV4ZWRkYi9taWdyYXRlLWJhc2ljcy1leHBlY3RlZC50eHQKQEAgLTI3LDkgKzI3LDI0IEBA
IGRiID0gZXZlbnQudGFyZ2V0LnJlc3VsdAogdHJhbnMgPSBkYi50cmFuc2FjdGlvbihbXSwgd2Vi
a2l0SURCVHJhbnNhY3Rpb24uUkVBRF9XUklURSwgMCkKIGxldmVsZGJDaGVja1BsYWluT2xkU3Rv
cmUoKToKIHN0b3JlID0gdHJhbnMub2JqZWN0U3RvcmUoJ01pZ3JhdGlvblBsYWluT2xkU3RvcmUn
KQotRkFJTCBzdG9yZSA9IHRyYW5zLm9iamVjdFN0b3JlKCdNaWdyYXRpb25QbGFpbk9sZFN0b3Jl
JykgdGhyZXcgZXhjZXB0aW9uIEVycm9yOiBOT1RfRk9VTkRfRVJSOiBET00gSURCRGF0YWJhc2Ug
RXhjZXB0aW9uIDMKIHJlcXVlc3QgPSBzdG9yZS5vcGVuQ3Vyc29yKGtleVJhbmdlKQotRkFJTCBy
ZXF1ZXN0ID0gc3RvcmUub3BlbkN1cnNvcihrZXlSYW5nZSkgdGhyZXcgZXhjZXB0aW9uIFR5cGVF
cnJvcjogQ2Fubm90IGNhbGwgbWV0aG9kICdvcGVuQ3Vyc29yJyBvZiB1bmRlZmluZWQKK2xldmVs
ZGJDaGVja1BsYWluT2xkU3RvcmVDdXJzb3JOZXh0KCk6CitQQVNTIGN1cnNvci52YWx1ZS5uYW1l
ID09ICdHZW9yZ2UnIGlzIHRydWUKK2xldmVsZGJDaGVja1BsYWluT2xkU3RvcmVDdXJzb3JOZXh0
KCk6CitsZXZlbGRiQ2hlY2tTdG9yZVdpdGhLZXlQYXRoKCk6CitzdG9yZSA9IHRyYW5zLm9iamVj
dFN0b3JlKCdNaWdyYXRpb25TdG9yZVdpdGhLZXlQYXRoJykKK2xldmVsZGJDaGVja1N0b3JlV2l0
aEtleVBhdGhDdXJzb3JOZXh0KCk6CitQQVNTICgod2luZG93LmluZGV4ID0gd2luZG93LnN0b3Jl
LmluZGV4KCdFeGFtcGxlSW5kZXgnKSkgIT0gdW5kZWZpbmVkKSBpcyB0cnVlCitQQVNTICh3aW5k
b3cua2V5SW5kZXhDdXJzb3Iua2V5ID09IDMpIGlzIHRydWUKK1BBU1MgY3Vyc29yLnZhbHVlLm5h
bWUgPT0gJ1Rob21hcycgaXMgdHJ1ZQorUEFTUyBjdXJzb3IudmFsdWUuaWQgPT0gJzMnIGlzIHRy
dWUKK2xldmVsZGJDaGVja1N0b3JlV2l0aEtleVBhdGhDdXJzb3JOZXh0KCk6CitsZXZlbGRiQ2hl
Y2tTdG9yZVdpdGhBdXRvSW5jcmVtZW50KCk6CitzdG9yZSA9IHRyYW5zLm9iamVjdFN0b3JlKCdN
aWdyYXRpb25TdG9yZVdpdGhBdXRvSW5jcmVtZW50JykKK2xldmVsZGJDaGVja1N0b3JlV2l0aEF1
dG9JbmNyZW1lbnRDdXJzb3JOZXh0KCk6CitQQVNTIGN1cnNvci52YWx1ZS5uYW1lID09ICdMaW5j
b2xuJyBpcyB0cnVlCitQQVNTIGN1cnNvci52YWx1ZS5udW1iZXIgPT0gJzcwMTInIGlzIHRydWUK
K2xldmVsZGJDaGVja1N0b3JlV2l0aEF1dG9JbmNyZW1lbnRDdXJzb3JOZXh0KCk6CiBQQVNTIHN1
Y2Nlc3NmdWxseVBhcnNlZCBpcyB0cnVlCiAKIFRFU1QgQ09NUExFVEUKZGlmZiAtLWdpdCBhL0xh
eW91dFRlc3RzL3N0b3JhZ2UvaW5kZXhlZGRiL21pZ3JhdGUtYmFzaWNzLmh0bWwgYi9MYXlvdXRU
ZXN0cy9zdG9yYWdlL2luZGV4ZWRkYi9taWdyYXRlLWJhc2ljcy5odG1sCmluZGV4IDRhZWIwYTMx
MTU4ZjNkNGVjMWU0NjYyM2QwMTg0NTAyYzk4ZTA4OGMuLjA3NmUwNjI1N2RhMjhjNjNjMjE5NzI3
NmIxZDk5NGJkZTk3YWMyM2EgMTAwNjQ0Ci0tLSBhL0xheW91dFRlc3RzL3N0b3JhZ2UvaW5kZXhl
ZGRiL21pZ3JhdGUtYmFzaWNzLmh0bWwKKysrIGIvTGF5b3V0VGVzdHMvc3RvcmFnZS9pbmRleGVk
ZGIvbWlncmF0ZS1iYXNpY3MuaHRtbApAQCAtNDUsNyArNDUsNiBAQCBmdW5jdGlvbiBzcWxpdGVT
ZXRWZXJzaW9uU3VjY2VzcygpCiAgICAgd2luZG93LnRyYW5zID0gZXZhbEFuZExvZygidHJhbnMg
PSBkYi50cmFuc2FjdGlvbihbXSwgd2Via2l0SURCVHJhbnNhY3Rpb24uUkVBRF9XUklURSkiKTsK
ICAgICB3aW5kb3cuaW5kZXggPSBldmFsQW5kTG9nKCJpbmRleCA9IHN0b3JlLmNyZWF0ZUluZGV4
KCdFeGFtcGxlSW5kZXgnLCdpZCcsIGZhbHNlKSIpOwogCi0KICAgICBzcWxpdGVUZXN0QWRkUmVj
b3JkczEoKTsKIH0KIApAQCAtMTUxLDYgKzE1MCwxNiBAQCBmdW5jdGlvbiBsZXZlbGRiQ2hlY2tT
dG9yZVdpdGhLZXlQYXRoQ3Vyc29yTmV4dCgpCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAg
ICBzaG91bGRCZVRydWUoIigod2luZG93LmluZGV4ID0gd2luZG93LnN0b3JlLmluZGV4KCdFeGFt
cGxlSW5kZXgnKSkgIT0gdW5kZWZpbmVkKSIpOworICAgIG9wZW5LZXlDdXJzb3IgPSB3aW5kb3cu
aW5kZXgub3BlbktleUN1cnNvcigpOworICAgIG9wZW5LZXlDdXJzb3Iub25zdWNjZXNzID0gbGV2
ZWxkYkNoZWNrU3RvcmVXaXRoS2V5UGF0aEN1cnNvck5leHQyOworICAgIG9wZW5LZXlDdXJzb3Iu
b25lcnJvciA9IHVuZXhwZWN0ZWRFcnJvckNhbGxiYWNrOworfQorCitmdW5jdGlvbiBsZXZlbGRi
Q2hlY2tTdG9yZVdpdGhLZXlQYXRoQ3Vyc29yTmV4dDIoKQoreworICAgIHdpbmRvdy5rZXlJbmRl
eEN1cnNvciA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7CisgICAgc2hvdWxkQmVUcnVlKCIod2luZG93
LmtleUluZGV4Q3Vyc29yLmtleSA9PSAzKSIpOwogICAgIHNob3VsZEJlVHJ1ZSgiY3Vyc29yLnZh
bHVlLm5hbWUgPT0gJ1Rob21hcyciKTsKICAgICBzaG91bGRCZVRydWUoImN1cnNvci52YWx1ZS5p
ZCA9PSAnMyciKTsKICAgICBjdXJzb3IuY29udGludWUoKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCBmMzE2ZTFh
MmVjMWFiYjY0MzlmNmEwNjFmNTY2NmI2Y2M1NjlmZmUzLi4wYzYxYzdkOTA1MjE0OGE2MTMwMjYx
YjQzNjRmOWE2ZjkzMTQwNDhlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cK
KysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjEgQEAKKzIwMTEtMDYt
MjAgIEdyZWcgU2ltb24gIDxncmVnc2ltb25AY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmll
d2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIE1pZ3JhdGUgU1FMaXRlIGJhY2tpbmcg
c3RvcmUgdG8gTGV2ZWxEQiBiYWNraW5nIHN0b3JlIGZvciBJbmRleGVkZGIuCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02Mjc4MAorCisgICAgICAgICog
c3RvcmFnZS9JREJGYWN0b3J5QmFja2VuZEltcGwuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Y29t
cHV0ZVVuaXF1ZUlkZW50aWZpZXIpOgorICAgICAgICAoV2ViQ29yZTo6SURCRmFjdG9yeUJhY2tl
bmRJbXBsOjpvcGVuKToKKyAgICAgICAgKFdlYkNvcmU6Om1pZ3JhdGVPYmplY3RTdG9yZXMpOgor
ICAgICAgICAoV2ViQ29yZTo6SURCRmFjdG9yeUJhY2tlbmRJbXBsOjptaWdyYXRlRnJvbVNRTGl0
ZVRvTGV2ZWxEQik6CisgICAgICAgICogc3RvcmFnZS9JREJPYmplY3RTdG9yZUJhY2tlbmRJbXBs
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OklEQk9iamVjdFN0b3JlQmFja2VuZEltcGw6OnBvcHVs
YXRlSW5kZXgpOgorICAgICAgICAqIHN0b3JhZ2UvSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbC5o
OgorICAgICAgICAqIHN0b3JhZ2UvSURCU1FMaXRlQmFja2luZ1N0b3JlLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OklEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6YmFja2luZ1N0b3JlRXhpc3RzKToKKwog
MjAxMS0wNi0yMCAgSmVyIE5vYmxlICA8amVyLm5vYmxlQGFwcGxlLmNvbT4KIAogICAgICAgICBV
bnJldmlld2VkIGJ1aWxkIGZpeDsgRml4IExlb3BhcmQgV2ViQ29yZSBidWlsZC4KZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCRmFjdG9yeUJhY2tlbmRJbXBsLmNwcCBiL1Nv
dXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCRmFjdG9yeUJhY2tlbmRJbXBsLmNwcAppbmRleCAwMmM1
MDU4N2MyNWI5YWYyOWU0NTI2MzNmYWYxMzJhOTM5MGIzYjNhLi41YjgyNjVhYmFiZGY4NjY1ODY1
ZGQ0OTE0YWQ1MGUyNmUzZWNlOWE4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdl
L0lEQkZhY3RvcnlCYWNrZW5kSW1wbC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9J
REJGYWN0b3J5QmFja2VuZEltcGwuY3BwCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSAiSURC
RGF0YWJhc2VCYWNrZW5kSW1wbC5oIgogI2luY2x1ZGUgIklEQkRhdGFiYXNlRXhjZXB0aW9uLmgi
CiAjaW5jbHVkZSAiSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5oIgorI2luY2x1ZGUgIklEQk9iamVj
dFN0b3JlQmFja2VuZEltcGwuaCIKICNpbmNsdWRlICJJREJTUUxpdGVCYWNraW5nU3RvcmUuaCIK
ICNpbmNsdWRlICJJREJUcmFuc2FjdGlvbkNvb3JkaW5hdG9yLmgiCiAjaW5jbHVkZSAiU2VjdXJp
dHlPcmlnaW4uaCIKQEAgLTQzLDYgKzQ0LDE2IEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAor
c3RhdGljIFN0cmluZyBjb21wdXRlVW5pcXVlSWRlbnRpZmllcihjb25zdCBTdHJpbmcmIG5hbWUs
IFNlY3VyaXR5T3JpZ2luKiBzZWN1cml0eU9yaWdpbiwgSURCRmFjdG9yeUJhY2tlbmRJbnRlcmZh
Y2U6OkJhY2tpbmdTdG9yZVR5cGUgdHlwZSkKK3sKKyAgICByZXR1cm4gc2VjdXJpdHlPcmlnaW4t
PmRhdGFiYXNlSWRlbnRpZmllcigpICsgIkAiICsgbmFtZSArIFN0cmluZzo6Zm9ybWF0KCJAJWQi
LCB0eXBlKTsKK30KKworc3RhdGljIFN0cmluZyBjb21wdXRlRmlsZUlkZW50aWZpZXIoU2VjdXJp
dHlPcmlnaW4qIHNlY3VyaXR5T3JpZ2luLCBJREJGYWN0b3J5QmFja2VuZEludGVyZmFjZTo6QmFj
a2luZ1N0b3JlVHlwZSB0eXBlKQoreworICAgIHJldHVybiBzZWN1cml0eU9yaWdpbi0+ZGF0YWJh
c2VJZGVudGlmaWVyKCkgKyBTdHJpbmc6OmZvcm1hdCgiQCVkIiwgdHlwZSk7Cit9CisKIElEQkZh
Y3RvcnlCYWNrZW5kSW1wbDo6SURCRmFjdG9yeUJhY2tlbmRJbXBsKCkKICAgICA6IG1fdHJhbnNh
Y3Rpb25Db29yZGluYXRvcihJREJUcmFuc2FjdGlvbkNvb3JkaW5hdG9yOjpjcmVhdGUoKSkKIHsK
QEAgLTc1LDkgKzg2LDkgQEAgdm9pZCBJREJGYWN0b3J5QmFja2VuZEltcGw6Om9wZW4oY29uc3Qg
U3RyaW5nJiBuYW1lLCBQYXNzUmVmUHRyPElEQkNhbGxiYWNrcz4gY2EKICAgICBpZiAoYmFja2lu
Z1N0b3JlVHlwZSA9PSBEZWZhdWx0QmFja2luZ1N0b3JlKQogICAgICAgICBiYWNraW5nU3RvcmVU
eXBlID0gU1FMaXRlQmFja2luZ1N0b3JlOyAvLyBGSVhNRTogRGVmYXVsdEJhY2tpbmdTdG9yZSBp
cyBjb25mdXNpbmc7IGdldCByaWQgb2YgaXQuCiAKLSAgICBjb25zdCBTdHJpbmcgZmlsZUlkZW50
aWZpZXIgPSBzZWN1cml0eU9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkgKyBTdHJpbmc6OmZv
cm1hdCgiQCVkIiwgc3RhdGljX2Nhc3Q8aW50PihiYWNraW5nU3RvcmVUeXBlKSk7Ci0gICAgY29u
c3QgU3RyaW5nIHVuaXF1ZUlkZW50aWZpZXIgPSBmaWxlSWRlbnRpZmllciArICJAIiArIG5hbWU7
Ci0KKyAgICBjb25zdCBTdHJpbmcgZmlsZUlkZW50aWZpZXIgPSBjb21wdXRlRmlsZUlkZW50aWZp
ZXIoc2VjdXJpdHlPcmlnaW4uZ2V0KCksIGJhY2tpbmdTdG9yZVR5cGUpOworICAgIGNvbnN0IFN0
cmluZyB1bmlxdWVJZGVudGlmaWVyID0gY29tcHV0ZVVuaXF1ZUlkZW50aWZpZXIobmFtZSwgc2Vj
dXJpdHlPcmlnaW4uZ2V0KCksIGJhY2tpbmdTdG9yZVR5cGUpOworICAgIAogICAgIElEQkRhdGFi
YXNlQmFja2VuZE1hcDo6aXRlcmF0b3IgaXQgPSBtX2RhdGFiYXNlQmFja2VuZE1hcC5maW5kKHVu
aXF1ZUlkZW50aWZpZXIpOwogICAgIGlmIChpdCAhPSBtX2RhdGFiYXNlQmFja2VuZE1hcC5lbmQo
KSkgewogICAgICAgICBjYWxsYmFja3MtPm9uU3VjY2VzcyhpdC0+c2Vjb25kKTsKQEAgLTk0LDcg
KzEwNSwxMiBAQCB2b2lkIElEQkZhY3RvcnlCYWNrZW5kSW1wbDo6b3Blbihjb25zdCBTdHJpbmcm
IG5hbWUsIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBjYQogCiAjaWYgRU5BQkxFKExFVkVMREIp
CiAgICAgICAgIGlmIChiYWNraW5nU3RvcmVUeXBlID09IExldmVsREJCYWNraW5nU3RvcmUpIHsK
LSAgICAgICAgICAgIGNvbnN0IGJvb2wgaGFzU1FMQmFja2luZ1N0b3JlID0gSURCU1FMaXRlQmFj
a2luZ1N0b3JlOjpiYWNraW5nU3RvcmVFeGlzdHMoc2VjdXJpdHlPcmlnaW4uZ2V0KCksIGRhdGFE
aXIpOworICAgICAgICAgICAgYm9vbCBoYXNTUUxCYWNraW5nU3RvcmUgPSBJREJTUUxpdGVCYWNr
aW5nU3RvcmU6OmJhY2tpbmdTdG9yZUV4aXN0cyhzZWN1cml0eU9yaWdpbi5nZXQoKSwgbmFtZSwg
ZGF0YURpcik7CisKKyAgICAgICAgICAgIC8vIExheW91dFRlc3RzOiBTUUxpdGUgYmFja2luZyBz
dG9yZSBtYXkgbm90IGV4aXN0IG9uIGRpc2sgYnV0IG1heSBleGlzdCBpbiBjYWNoZS4KKyAgICAg
ICAgICAgIFN0cmluZyBjYWNoZWRTcWxpdGVCYWNraW5nU3RvcmVJZGVudGlmaWVyID0gY29tcHV0
ZUZpbGVJZGVudGlmaWVyKHNlY3VyaXR5T3JpZ2luLmdldCgpLCBTUUxpdGVCYWNraW5nU3RvcmUp
OworICAgICAgICAgICAgaWYgKCFoYXNTUUxCYWNraW5nU3RvcmUgJiYgKG1fYmFja2luZ1N0b3Jl
TWFwLmVuZCgpICE9IG1fYmFja2luZ1N0b3JlTWFwLmZpbmQoY2FjaGVkU3FsaXRlQmFja2luZ1N0
b3JlSWRlbnRpZmllcikpKQorICAgICAgICAgICAgICAgIGhhc1NRTEJhY2tpbmdTdG9yZSA9IHRy
dWU7CiAKICAgICAgICAgICAgIGlmIChoYXNTUUxCYWNraW5nU3RvcmUpIHsKICAgICAgICAgICAg
ICAgICBib29sIG1pZ3JhdGlvblN1Y2NlZWRlZCA9IG1pZ3JhdGVGcm9tU1FMaXRlVG9MZXZlbERC
KG5hbWUsIHNlY3VyaXR5T3JpZ2luLmdldCgpLCBkYXRhRGlyLCBtYXhpbXVtU2l6ZSk7CkBAIC0x
MjAsOSArMTM2LDEzMCBAQCB2b2lkIElEQkZhY3RvcnlCYWNrZW5kSW1wbDo6b3Blbihjb25zdCBT
dHJpbmcmIG5hbWUsIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBjYQogICAgIG1fZGF0YWJhc2VC
YWNrZW5kTWFwLnNldCh1bmlxdWVJZGVudGlmaWVyLCBkYXRhYmFzZUJhY2tlbmQuZ2V0KCkpOwog
fQogCisjaWYgRU5BQkxFKExFVkVMREIpCisKK3N0YXRpYyBib29sIG1pZ3JhdGVPYmplY3RTdG9y
ZXMoUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU+IGZyb21CYWNraW5nU3RvcmUsIGludDY0X3Qg
ZnJvbURhdGFiYXNlSWQsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlPiB0b0JhY2tpbmdTdG9y
ZSwgaW50NjRfdCB0b0RhdGFiYXNlSWQpCit7CisgICAgVmVjdG9yPGludDY0X3Q+IGZyb21PYmpT
dG9yZUlkcywgdG9PYmpTdG9yZUlkczsKKyAgICBWZWN0b3I8U3RyaW5nPiBmcm9tT2JqU3RvcmVO
YW1lcywgdG9PYmpTdG9yZU5hbWVzOworICAgIFZlY3RvcjxTdHJpbmc+IGZyb21LZXlQYXRocywg
dG9LZXlQYXRoczsKKyAgICBWZWN0b3I8Ym9vbD4gZnJvbUF1dG9JbmNyZW1lbnQsIHRvQXV0b0lu
Y3JlbWVudDsKKworICAgIC8vIE1pZ3JhdGUgb2JqZWN0U3RvcmVzLiBDaGVjayB0byBzZWUgaWYg
dGhlIG9iamVjdCBzdG9yZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgdGFyZ2V0CisgICAgZnJvbUJh
Y2tpbmdTdG9yZS0+Z2V0T2JqZWN0U3RvcmVzKGZyb21EYXRhYmFzZUlkLCBmcm9tT2JqU3RvcmVJ
ZHMsIGZyb21PYmpTdG9yZU5hbWVzLCBmcm9tS2V5UGF0aHMsIGZyb21BdXRvSW5jcmVtZW50KTsK
KworICAgIHRvQmFja2luZ1N0b3JlLT5nZXRPYmplY3RTdG9yZXModG9EYXRhYmFzZUlkLCB0b09i
alN0b3JlSWRzLCB0b09ialN0b3JlTmFtZXMsIHRvS2V5UGF0aHMsIHRvQXV0b0luY3JlbWVudCk7
CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZnJvbU9ialN0b3JlSWRzLnNpemUoKTsg
aSsrKSB7CisgICAgICAgIGlmICh0b09ialN0b3JlTmFtZXMuY29udGFpbnMoZnJvbU9ialN0b3Jl
TmFtZXNbaV0pKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgYm9vbCBrZXlQYXRo
ID0gZmFsc2U7CisgICAgICAgIGludDY0X3QgYXNzaWduZWRPYmplY3RTdG9yZUlkPS0xOworCisg
ICAgICAgIFJlZlB0cjxJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uPiB0cmFucyA9IHRvQmFj
a2luZ1N0b3JlLT5jcmVhdGVUcmFuc2FjdGlvbigpOworICAgICAgICB0cmFucy0+YmVnaW4oKTsK
KworICAgICAgICBpZiAoIXRvQmFja2luZ1N0b3JlLT5jcmVhdGVPYmplY3RTdG9yZSh0b0RhdGFi
YXNlSWQsIGZyb21PYmpTdG9yZU5hbWVzW2ldLCBmcm9tS2V5UGF0aHNbaV0sIGZyb21BdXRvSW5j
cmVtZW50W2ldLCBhc3NpZ25lZE9iamVjdFN0b3JlSWQpKQorICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgICAgIGlmICghZnJvbUtleVBhdGhzW2ldLmlzRW1wdHkoKSkKKyAgICAgICAg
ICAgIGtleVBhdGggPSB0cnVlOworCisgICAgICAgIFJlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1
cnNvcj4gY3Vyc29yID0gZnJvbUJhY2tpbmdTdG9yZS0+b3Blbk9iamVjdFN0b3JlQ3Vyc29yKGZy
b21EYXRhYmFzZUlkLCBmcm9tT2JqU3RvcmVJZHNbaV0sIDAsIElEQkN1cnNvcjo6TkVYVCk7Cisg
ICAgICAgIGlmIChjdXJzb3IpIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBS
ZWZQdHI8SURCS2V5PiBrZXkgPSBjdXJzb3ItPmtleSgpOworICAgICAgICAgICAgICAgIFJlZlB0
cjxJREJCYWNraW5nU3RvcmU6Ok9iamVjdFN0b3JlUmVjb3JkSWRlbnRpZmllcj4gcmVjb3JkSWRl
bnRpZmllciA9IHRvQmFja2luZ1N0b3JlLT5jcmVhdGVJbnZhbGlkUmVjb3JkSWRlbnRpZmllcigp
OworCisgICAgICAgICAgICAgICAgaWYgKCF0b0JhY2tpbmdTdG9yZS0+cHV0T2JqZWN0U3RvcmVS
ZWNvcmQodG9EYXRhYmFzZUlkLCBhc3NpZ25lZE9iamVjdFN0b3JlSWQsICooa2V5LmdldCgpKSwg
Y3Vyc29yLT52YWx1ZSgpLCByZWNvcmRJZGVudGlmaWVyLmdldCgpKSkKKyAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0gd2hpbGUgKGN1cnNvci0+Y29udGludWVGdW5j
dGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBvcHVsYXRlIGFueS9hbGwgaW5kZXhl
cyBmb3IgdGhpcyBvYmplY3RzdG9yZS4KKyAgICAgICAgVmVjdG9yPGludDY0X3Q+IGlkeElkczsK
KyAgICAgICAgVmVjdG9yPFN0cmluZz4gaWR4TmFtZXM7CisgICAgICAgIFZlY3RvcjxTdHJpbmc+
IGlkeEtleVBhdGhzOworICAgICAgICBWZWN0b3I8Ym9vbD4gaWR4VW5pcXVlOworICAgICAgICBm
cm9tQmFja2luZ1N0b3JlLT5nZXRJbmRleGVzKGZyb21EYXRhYmFzZUlkLCBmcm9tT2JqU3RvcmVJ
ZHNbaV0sIGlkeElkcywgaWR4TmFtZXMsIGlkeEtleVBhdGhzLCBpZHhVbmlxdWUpOworICAgICAg
ICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgaWR4SWRzLnNpemUoKTsgaisrKSB7CisgICAgICAg
ICAgICBpbnQ2NF90IGluZGV4SWQgPSAtMTsKKworICAgICAgICAgICAgaWYgKCF0b0JhY2tpbmdT
dG9yZS0+Y3JlYXRlSW5kZXgodG9EYXRhYmFzZUlkLCBhc3NpZ25lZE9iamVjdFN0b3JlSWQsIGlk
eE5hbWVzW2pdLCBpZHhLZXlQYXRoc1tqXSwgaWR4VW5pcXVlW2pdLCBpbmRleElkKSkKKyAgICAg
ICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1w
bDo6cG9wdWxhdGVJbmRleCgqdG9CYWNraW5nU3RvcmUsIHRvRGF0YWJhc2VJZCwgYXNzaWduZWRP
YmplY3RTdG9yZUlkLCBpbmRleElkLCBmcm9tS2V5UGF0aHNbaV0pOworICAgICAgICB9CisKKyAg
ICAgICAgdHJhbnMtPmNvbW1pdCgpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorI2Vu
ZGlmIC8vICNpZiBFTkFCTEUoTEVWRUxEQikKKwogYm9vbCBJREJGYWN0b3J5QmFja2VuZEltcGw6
Om1pZ3JhdGVGcm9tU1FMaXRlVG9MZXZlbERCKGNvbnN0IFN0cmluZyYgbmFtZSwgU2VjdXJpdHlP
cmlnaW4qIHNlY3VyaXR5T3JpZ2luLCBjb25zdCBTdHJpbmcmIGRhdGFEaXIsIGludDY0X3QgbWF4
aW11bVNpemUpCiB7Ci0gICAgcmV0dXJuIGZhbHNlOyAvLyBGSVhNRTogVG8gYmUgaW1wbGVtZW50
ZWQuCisjaWYgRU5BQkxFKExFVkVMREIpCisgICAgU3RyaW5nIGZyb21VbmlxdWVJZGVudGlmaWVy
ID0gY29tcHV0ZVVuaXF1ZUlkZW50aWZpZXIobmFtZSwgc2VjdXJpdHlPcmlnaW4sIFNRTGl0ZUJh
Y2tpbmdTdG9yZSk7CisgICAgU3RyaW5nIGZyb21GaWxlSWRlbnRpZmllciA9IGNvbXB1dGVGaWxl
SWRlbnRpZmllcihzZWN1cml0eU9yaWdpbiwgU1FMaXRlQmFja2luZ1N0b3JlKTsKKyAgICBTdHJp
bmcgdG9VbmlxdWVJZGVudGlmaWVyID0gY29tcHV0ZVVuaXF1ZUlkZW50aWZpZXIobmFtZSwgc2Vj
dXJpdHlPcmlnaW4sIExldmVsREJCYWNraW5nU3RvcmUpOworICAgIFN0cmluZyB0b0ZpbGVJZGVu
dGlmaWVyID0gY29tcHV0ZUZpbGVJZGVudGlmaWVyKHNlY3VyaXR5T3JpZ2luLCBMZXZlbERCQmFj
a2luZ1N0b3JlKTsKKyAgICBSZWZQdHI8SURCVHJhbnNhY3Rpb25Db29yZGluYXRvcj4gdHJhbnNh
Y3Rpb25Db29yZGluYXRvciA9IElEQlRyYW5zYWN0aW9uQ29vcmRpbmF0b3I6OmNyZWF0ZSgpOwor
ICAgIFJlZlB0cjxJREJCYWNraW5nU3RvcmU+IGZyb21CYWNraW5nU3RvcmU7CisgICAgUmVmUHRy
PElEQkRhdGFiYXNlQmFja2VuZEltcGw+IGZyb21EYXRhYmFzZUJhY2tlbmQ7CisgICAgUmVmUHRy
PElEQkJhY2tpbmdTdG9yZT4gdG9CYWNraW5nU3RvcmU7CisKKworICAgIC8vIE9wZW4gIkZyb20i
IGJhY2tpbmcgc3RvcmUgYW5kIGJhY2tlbmQuIFdoZW4gcnVubmluZyBMYXlvdXRUZXN0cywgdGhl
CisgICAgLy8gImZyb20iIGRhdGFiYXNlIG1heSBiZSBjYWNoZWQgaW4gdGhpcyBjbGFzcyBpbnN0
YW5jZSwgc28gbG9vayBmb3IgaXQgdGhlcmUgZmlyc3QuCisgICAgSURCQmFja2luZ1N0b3JlTWFw
OjppdGVyYXRvciBpdCA9IG1fYmFja2luZ1N0b3JlTWFwLmZpbmQoZnJvbUZpbGVJZGVudGlmaWVy
KTsKKyAgICBpZiAoaXQgIT0gbV9iYWNraW5nU3RvcmVNYXAuZW5kKCkpCisgICAgICAgIGZyb21C
YWNraW5nU3RvcmUgPSBpdC0+c2Vjb25kOworICAgIGVsc2UKKyAgICAgICAgZnJvbUJhY2tpbmdT
dG9yZSA9IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6b3BlbihzZWN1cml0eU9yaWdpbiwgZGF0YURp
ciwgbWF4aW11bVNpemUsIGZyb21GaWxlSWRlbnRpZmllciwgdGhpcyk7CisKKyAgICBpZiAoIWZy
b21CYWNraW5nU3RvcmUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIElEQkRhdGFiYXNl
QmFja2VuZE1hcDo6aXRlcmF0b3IgaXQyID0gbV9kYXRhYmFzZUJhY2tlbmRNYXAuZmluZChmcm9t
VW5pcXVlSWRlbnRpZmllcik7CisgICAgaWYgKGl0MiAhPSBtX2RhdGFiYXNlQmFja2VuZE1hcC5l
bmQoKSkKKyAgICAgICAgZnJvbURhdGFiYXNlQmFja2VuZCA9IGl0Mi0+c2Vjb25kOworICAgIGVs
c2UgeworICAgICAgICBmcm9tRGF0YWJhc2VCYWNrZW5kID0gSURCRGF0YWJhc2VCYWNrZW5kSW1w
bDo6Y3JlYXRlKG5hbWUsIGZyb21CYWNraW5nU3RvcmUuZ2V0KCksIHRyYW5zYWN0aW9uQ29vcmRp
bmF0b3IuZ2V0KCksIHRoaXMsIGZyb21VbmlxdWVJZGVudGlmaWVyKTsKKyAgICAgICAgbV9kYXRh
YmFzZUJhY2tlbmRNYXAuc2V0KGZyb21VbmlxdWVJZGVudGlmaWVyLCBmcm9tRGF0YWJhc2VCYWNr
ZW5kLmdldCgpKTsKKyAgICB9CisKKyAgICBpZiAoIWZyb21EYXRhYmFzZUJhY2tlbmQpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIE9wZW4gIlRvIiBkYXRhYmFzZS4gRmlyc3QgZmlu
ZCBvdXQgaWYgaXQgYWxyZWFkeSBleGlzdHMgLS0gdGhpcyB3aWxsIGRldGVybWluZSBpZgorICAg
IC8vIGl0IGlzIHNhZmUgdG8gY2FsbCBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpleHRyYWN0SURC
RGF0YWJhc2VNZXRhRGF0YS4KKyAgICBpdCA9IG1fYmFja2luZ1N0b3JlTWFwLmZpbmQodG9GaWxl
SWRlbnRpZmllcik7CisgICAgaWYgKGl0ICE9IG1fYmFja2luZ1N0b3JlTWFwLmVuZCgpKQorICAg
ICAgICB0b0JhY2tpbmdTdG9yZSA9IGl0LT5zZWNvbmQ7CisgICAgZWxzZQorICAgICAgICB0b0Jh
Y2tpbmdTdG9yZSA9IElEQkxldmVsREJCYWNraW5nU3RvcmU6Om9wZW4oc2VjdXJpdHlPcmlnaW4s
IGRhdGFEaXIsIG1heGltdW1TaXplLCB0b0ZpbGVJZGVudGlmaWVyLCB0aGlzKTsKKworICAgIGlm
ICghdG9CYWNraW5nU3RvcmUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworCisgICAgU3RyaW5n
IHRvRGF0YWJhc2VOYW1lID0gZnJvbURhdGFiYXNlQmFja2VuZC0+bmFtZSgpOworICAgIFN0cmlu
ZyB0b0RhdGFiYXNlVmVyc2lvbiA9IGZyb21EYXRhYmFzZUJhY2tlbmQtPnZlcnNpb24oKTsKKyAg
ICBpbnQ2NF90IHRvRGF0YWJhc2VJZD0tMTsKKworICAgIGlmICghdG9CYWNraW5nU3RvcmUtPmV4
dHJhY3RJREJEYXRhYmFzZU1ldGFEYXRhKHRvRGF0YWJhc2VOYW1lLCB0b0RhdGFiYXNlVmVyc2lv
biwgdG9EYXRhYmFzZUlkKSkgeworICAgICAgICBpZiAoIXRvQmFja2luZ1N0b3JlLT5zZXRJREJE
YXRhYmFzZU1ldGFEYXRhKHRvRGF0YWJhc2VOYW1lLCB0b0RhdGFiYXNlVmVyc2lvbiwgdG9EYXRh
YmFzZUlkLCB0cnVlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBy
ZXR1cm4gbWlncmF0ZU9iamVjdFN0b3Jlcyhmcm9tQmFja2luZ1N0b3JlLCBmcm9tRGF0YWJhc2VC
YWNrZW5kLT5pZCgpLCB0b0JhY2tpbmdTdG9yZSwgdG9EYXRhYmFzZUlkKTsKKworI2VuZGlmIC8v
IEVOQUJMRShMRVZFTERCKQorICAgIHJldHVybiBmYWxzZTsKIH0KIAogfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJMZXZlbERCQmFj
a2luZ1N0b3JlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZS5jcHAKaW5kZXggZmRiMjUxMTExMzc0YTI5MzEzY2JmNWY2ZWI2N2VlYzUyMGE5ZjNiYy4u
YjhmNzlhYTQwNTQ0M2E1MzU1MTJjMTI1NDhkYjk4ZjFlMWQ1N2IyYSAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmNwcAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9zdG9yYWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUuY3BwCkBAIC0xMzA0LDcg
KzEzMDQsNyBAQCB2b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpyb2xs
YmFjaygpCiAgICAgbV9iYWNraW5nU3RvcmUtPm1fY3VycmVudFRyYW5zYWN0aW9uLmNsZWFyKCk7
CiB9CiAKLWJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6YmFja2luZ1N0b3JlRXhpc3RzKFNl
Y3VyaXR5T3JpZ2luKiBzZWN1cml0eU9yaWdpbiwgY29uc3QgU3RyaW5nJiBwYXRoQmFzZUFyZykK
K2Jvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6YmFja2luZ1N0b3JlRXhpc3RzKFNlY3VyaXR5
T3JpZ2luKiBzZWN1cml0eU9yaWdpbiwgY29uc3QgU3RyaW5nJiwgY29uc3QgU3RyaW5nJiBwYXRo
QmFzZUFyZykKIHsKICAgICBTdHJpbmcgcGF0aEJhc2UgPSBwYXRoQmFzZUFyZzsKIApAQCAtMTMx
NCwxMSArMTMxNCw4IEBAIGJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6YmFja2luZ1N0b3Jl
RXhpc3RzKFNlY3VyaXR5T3JpZ2luKiBzZWN1cml0eU9yaWdpbiwKICAgICAvLyBGSVhNRTogV2Ug
c2hvdWxkIGV2ZW50dWFsbHkgdXNlIHRoZSBzYW1lIExldmVsREIgZGF0YWJhc2UgZm9yIGFsbCBv
cmlnaW5zLgogICAgIFN0cmluZyBwYXRoID0gcGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KHBhdGhC
YXNlLCBzZWN1cml0eU9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkgKyAiLmluZGV4ZWRkYi5s
ZXZlbGRiIik7CiAKLSAgICAvLyBGSVhNRTogSXQgd291bGQgYmUgbW9yZSB0aG9yb3VnaCB0byBv
cGVuIHRoZSBkYXRhYmFzZSBoZXJlIGJ1dCBhbHNvIG1vcmUgZXhwZW5zaXZlLgotICAgIGlmIChm
aWxlRXhpc3RzKHBhdGgrIi9DVVJSRU5UIikpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAg
cmV0dXJuIGZhbHNlOworICAgIC8vIEZJWE1FOiB0aGlzIGlzIGNoZWNraW5nIGZvciBwcmVzZW5j
ZSBvZiB0aGUgZG9tYWluLCBub3QgdGhlIGRhdGFiYXNlIGl0c2VsZgorICAgIHJldHVybiBmaWxl
RXhpc3RzKHBhdGgrIi9DVVJSRU5UIik7CiB9CiAKIC8vIEZJWE1FOiBkZWxldGVEYXRhYmFzZSBz
aG91bGQgYmUgcGFydCBvZiBJREJCYWNraW5nU3RvcmUuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9zdG9yYWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUuaCBiL1NvdXJjZS9XZWJDb3JlL3N0
b3JhZ2UvSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5oCmluZGV4IGRmMGFlZGQwMTI3NzIwZTJkMmM5
MDk3MDRlZjU1ZThmMjk2MzNhODIuLjAxM2U2NDU0ZDJhMTUzMGY5YmQ3YTg1NTUxMWRjNGE5OGU4
ODUxYzMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZS5oCkBAIC03Niw3ICs3Niw3IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8
VHJhbnNhY3Rpb24+IGNyZWF0ZVRyYW5zYWN0aW9uKCk7CiAgICAgdmlydHVhbCBJREJGYWN0b3J5
QmFja2VuZEludGVyZmFjZTo6QmFja2luZ1N0b3JlVHlwZSBiYWNraW5nU3RvcmVUeXBlKCkgY29u
c3QgeyByZXR1cm4gSURCRmFjdG9yeUJhY2tlbmRJbnRlcmZhY2U6OkxldmVsREJCYWNraW5nU3Rv
cmU7IH0KIAotICAgIHN0YXRpYyBib29sIGJhY2tpbmdTdG9yZUV4aXN0cyhTZWN1cml0eU9yaWdp
biosIGNvbnN0IFN0cmluZyYgcGF0aEJhc2UpOworICAgIHN0YXRpYyBib29sIGJhY2tpbmdTdG9y
ZUV4aXN0cyhTZWN1cml0eU9yaWdpbiosIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5n
JiBwYXRoQmFzZSk7CiAKIHByaXZhdGU6CiAgICAgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZShTdHJp
bmcgaWRlbnRpZmllciwgSURCRmFjdG9yeUJhY2tlbmRJbXBsKiwgUGFzc093blB0cjxMZXZlbERC
RGF0YWJhc2U+KTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCT2JqZWN0
U3RvcmVCYWNrZW5kSW1wbC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQk9iamVjdFN0
b3JlQmFja2VuZEltcGwuY3BwCmluZGV4IGEzY2YwNzFmZTU1YjlkNGM3ODc5MzI2YmUwMjgyY2Y4
YjQ5ZmI3MTQuLmUwMDY2MWNkZmYwNTg5NzIxOGVjZTJmZWE5MGZjZTE0NDA0ZjJiY2YgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbC5j
cHAKKysrIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJPYmplY3RTdG9yZUJhY2tlbmRJbXBs
LmNwcApAQCAtMzc1LDcgKzM3NSw3IEBAIHByaXZhdGU6CiB9OwogfQogCi1zdGF0aWMgYm9vbCBw
b3B1bGF0ZUluZGV4KElEQkJhY2tpbmdTdG9yZSYgYmFja2luZ1N0b3JlLCBpbnQ2NF90IGRhdGFi
YXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBTdHJp
bmcmIGluZGV4S2V5UGF0aCkKK2Jvb2wgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6cG9wdWxh
dGVJbmRleChJREJCYWNraW5nU3RvcmUmIGJhY2tpbmdTdG9yZSwgaW50NjRfdCBkYXRhYmFzZUlk
LCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgU3RyaW5nJiBp
bmRleEtleVBhdGgpCiB7CiAgICAgUG9wdWxhdGVJbmRleENhbGxiYWNrIGNhbGxiYWNrKGJhY2tp
bmdTdG9yZSwgaW5kZXhLZXlQYXRoLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElk
KTsKICAgICBpZiAoIWJhY2tpbmdTdG9yZS5mb3JFYWNoT2JqZWN0U3RvcmVSZWNvcmQoZGF0YWJh
c2VJZCwgb2JqZWN0U3RvcmVJZCwgY2FsbGJhY2spKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvc3RvcmFnZS9JREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsLmggYi9Tb3VyY2UvV2ViQ29yZS9z
dG9yYWdlL0lEQk9iamVjdFN0b3JlQmFja2VuZEltcGwuaAppbmRleCA2YmY5NWNkMWYxZTdhNWY4
OTdjY2M1YWUzNTg1YzQwMjRiZWQwMTNhLi5iMTI2NmJkNjExYWFiMTI3NTVkZTgzYTlmMGJkNDIx
Yjc1ZTkwZmE1IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQk9iamVjdFN0
b3JlQmFja2VuZEltcGwuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQk9iamVjdFN0
b3JlQmFja2VuZEltcGwuaApAQCAtNzYsNiArNzYsOCBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB2
b2lkIGRlbGV0ZUluZGV4KGNvbnN0IFN0cmluZyYgbmFtZSwgSURCVHJhbnNhY3Rpb25CYWNrZW5k
SW50ZXJmYWNlKiwgRXhjZXB0aW9uQ29kZSYpOwogCiAgICAgdmlydHVhbCB2b2lkIG9wZW5DdXJz
b3IoUGFzc1JlZlB0cjxJREJLZXlSYW5nZT4gcmFuZ2UsIHVuc2lnbmVkIHNob3J0IGRpcmVjdGlv
biwgUGFzc1JlZlB0cjxJREJDYWxsYmFja3M+LCBJREJUcmFuc2FjdGlvbkJhY2tlbmRJbnRlcmZh
Y2UqLCBFeGNlcHRpb25Db2RlJik7CisgICAgCisgICAgc3RhdGljIGJvb2wgcG9wdWxhdGVJbmRl
eChJREJCYWNraW5nU3RvcmUmLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBTdHJpbmcmIGluZGV4S2V5UGF0aCk7CiAKIHBy
aXZhdGU6CiAgICAgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbChJREJCYWNraW5nU3RvcmUqLCBp
bnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3QgaWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3Qg
U3RyaW5nJiBrZXlQYXRoLCBib29sIGF1dG9JbmNyZW1lbnQpOwpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvc3RvcmFnZS9JREJTUUxpdGVCYWNraW5nU3RvcmUuY3BwIGIvU291cmNlL1dlYkNv
cmUvc3RvcmFnZS9JREJTUUxpdGVCYWNraW5nU3RvcmUuY3BwCmluZGV4IDJjNDhmMGVhYWNiODU2
MGE0NjM0OTViYTg0ZjFhMWZlZWY1NDAzYTUuLmJjYzlkOTM4ZjZmNDVhMmJhNTdkYTk5MzdiYTA3
MzhmZTllMGFmYTggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCU1FMaXRl
QmFja2luZ1N0b3JlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQlNRTGl0ZUJh
Y2tpbmdTdG9yZS5jcHAKQEAgLTk5MSwxOCArOTkxLDE5IEBAIFBhc3NSZWZQdHI8SURCQmFja2lu
Z1N0b3JlOjpDdXJzb3I+IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6b3BlbkluZGV4Q3Vyc29yKGlu
dDY0CiAgICAgcmV0dXJuIGN1cnNvci5yZWxlYXNlKCk7CiB9CiAKLWJvb2wgSURCU1FMaXRlQmFj
a2luZ1N0b3JlOjpiYWNraW5nU3RvcmVFeGlzdHMoU2VjdXJpdHlPcmlnaW4qIHNlY3VyaXR5T3Jp
Z2luLCBjb25zdCBTdHJpbmcmIHBhdGhCYXNlKQorYm9vbCBJREJTUUxpdGVCYWNraW5nU3RvcmU6
OmJhY2tpbmdTdG9yZUV4aXN0cyhTZWN1cml0eU9yaWdpbiogc2VjdXJpdHlPcmlnaW4sIGNvbnN0
IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBwYXRoQmFzZSkKIHsKICAgICBTdHJpbmcgcGF0
aCA9IHBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChwYXRoQmFzZSwgc2VjdXJpdHlPcmlnaW4tPmRh
dGFiYXNlSWRlbnRpZmllcigpICsgIi5pbmRleGVkZGIiKTsKLSAgICBpZiAoIWZpbGVFeGlzdHMo
cGF0aCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQogICAgIFNRTGl0ZURhdGFiYXNlIGRiOwog
ICAgIGlmICghZGIub3BlbihwYXRoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgZGIu
Y2xvc2UoKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICBTUUxpdGVTdGF0ZW1lbnQgZGF0YWJhc2VR
dWVyeShkYiwgIlNFTEVDVCBpZCwgdmVyc2lvbiBGUk9NIERhdGFiYXNlcyBXSEVSRSBuYW1lID0g
PyIpOworICAgIGlmIChkYXRhYmFzZVF1ZXJ5LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZGF0YWJhc2VRdWVyeS5iaW5kVGV4dCgxLCBuYW1l
KTsKKyAgICByZXR1cm4gKGRhdGFiYXNlUXVlcnkuc3RlcCgpID09IFNRTFJlc3VsdFJvdyk7CiB9
CiAKIG5hbWVzcGFjZSB7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQlNR
TGl0ZUJhY2tpbmdTdG9yZS5oIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJTUUxpdGVCYWNr
aW5nU3RvcmUuaAppbmRleCAyMjhlMjY3ZDNjMGM1YjM2OGY0ZjdhZTJmNzY5YjgzZDI4Mzg3OTBi
Li42NTc4ZjRjMGQ3NjA5Y2ZmMWQwNmZkMWFhMWEzZmM4MjdiNzY1YjQwIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQlNRTGl0ZUJhY2tpbmdTdG9yZS5oCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL3N0b3JhZ2UvSURCU1FMaXRlQmFja2luZ1N0b3JlLmgKQEAgLTcxLDcgKzcxLDcg
QEAgcHVibGljOgogICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxUcmFuc2FjdGlvbj4gY3JlYXRlVHJh
bnNhY3Rpb24oKTsKICAgICB2aXJ0dWFsIElEQkZhY3RvcnlCYWNrZW5kSW50ZXJmYWNlOjpCYWNr
aW5nU3RvcmVUeXBlIGJhY2tpbmdTdG9yZVR5cGUoKSBjb25zdCB7IHJldHVybiBJREJGYWN0b3J5
QmFja2VuZEludGVyZmFjZTo6U1FMaXRlQmFja2luZ1N0b3JlOyB9CiAKLSAgICBzdGF0aWMgYm9v
bCBiYWNraW5nU3RvcmVFeGlzdHMoU2VjdXJpdHlPcmlnaW4qLCBjb25zdCBTdHJpbmcmIHBhdGhC
YXNlKTsKKyAgICBzdGF0aWMgYm9vbCBiYWNraW5nU3RvcmVFeGlzdHMoU2VjdXJpdHlPcmlnaW4q
LCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgcGF0aEJhc2UpOwogCiBwcml2YXRl
OgogICAgIElEQlNRTGl0ZUJhY2tpbmdTdG9yZShTdHJpbmcgaWRlbnRpZmllciwgSURCRmFjdG9y
eUJhY2tlbmRJbXBsKik7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>98749</attachid>
            <date>2011-06-27 10:58:16 -0700</date>
            <delta_ts>2011-06-28 12:19:46 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-62780-20110627105815.patch</filename>
            <type>text/plain</type>
            <size>19796</size>
            <attacher name="Greg Simon">gregsimon</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogODk4MzMKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5n
ZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxvZwppbmRleCAxOWU5YThmZDRlNThhZWRhNzExZDI1
YzYzODE5NmJiYWIyNDZhODE3Li41NTg4ZjlkZmU4ODBhMzgxNWIxNGUyYzRhMTQ2ZGE3OGNjNWNm
MDk0IDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKKysrIGIvTGF5b3V0VGVzdHMv
Q2hhbmdlTG9nCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTEtMDYtMjcgIEdyZWcgU2ltb24gIDxncmVn
c2ltb25AY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgIFVwZGF0ZSBtaWdyYXRpb24gTGF5b3V0VGVzdCB0byBpbmNsdWRlIGluZGV4
ZXMgYW5kIHN1Y2Nlc3NmdWwgbWlncmF0aW9uLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjI3ODAKKworICAgICAgICAqIHN0b3JhZ2UvaW5kZXhlZGRi
L21pZ3JhdGUtYmFzaWNzLWV4cGVjdGVkLnR4dDoKKyAgICAgICAgKiBzdG9yYWdlL2luZGV4ZWRk
Yi9taWdyYXRlLWJhc2ljcy5odG1sOgorCiAyMDExLTA2LTI3ICBEaXJrIFNjaHVsemUgIDxrcml0
QHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgTmlrb2xhcyBaaW1tZXJtYW5uLgpk
aWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvc3RvcmFnZS9pbmRleGVkZGIvbWlncmF0ZS1iYXNpY3Mt
ZXhwZWN0ZWQudHh0IGIvTGF5b3V0VGVzdHMvc3RvcmFnZS9pbmRleGVkZGIvbWlncmF0ZS1iYXNp
Y3MtZXhwZWN0ZWQudHh0CmluZGV4IDJjOTIxMDExNjMzMDU5ZTUyZjQwZDk2ZmQ4YmYxYjZkNTdk
OTk1N2UuLjU3ZWZkYTU1MDczZmNhNmIyNTJkODEwZThhYjFhMTVmNGNkMDkyY2QgMTAwNjQ0Ci0t
LSBhL0xheW91dFRlc3RzL3N0b3JhZ2UvaW5kZXhlZGRiL21pZ3JhdGUtYmFzaWNzLWV4cGVjdGVk
LnR4dAorKysgYi9MYXlvdXRUZXN0cy9zdG9yYWdlL2luZGV4ZWRkYi9taWdyYXRlLWJhc2ljcy1l
eHBlY3RlZC50eHQKQEAgLTI3LDkgKzI3LDI0IEBAIGRiID0gZXZlbnQudGFyZ2V0LnJlc3VsdAog
dHJhbnMgPSBkYi50cmFuc2FjdGlvbihbXSwgd2Via2l0SURCVHJhbnNhY3Rpb24uUkVBRF9XUklU
RSwgMCkKIGxldmVsZGJDaGVja1BsYWluT2xkU3RvcmUoKToKIHN0b3JlID0gdHJhbnMub2JqZWN0
U3RvcmUoJ01pZ3JhdGlvblBsYWluT2xkU3RvcmUnKQotRkFJTCBzdG9yZSA9IHRyYW5zLm9iamVj
dFN0b3JlKCdNaWdyYXRpb25QbGFpbk9sZFN0b3JlJykgdGhyZXcgZXhjZXB0aW9uIEVycm9yOiBO
T1RfRk9VTkRfRVJSOiBET00gSURCRGF0YWJhc2UgRXhjZXB0aW9uIDMKIHJlcXVlc3QgPSBzdG9y
ZS5vcGVuQ3Vyc29yKGtleVJhbmdlKQotRkFJTCByZXF1ZXN0ID0gc3RvcmUub3BlbkN1cnNvcihr
ZXlSYW5nZSkgdGhyZXcgZXhjZXB0aW9uIFR5cGVFcnJvcjogQ2Fubm90IGNhbGwgbWV0aG9kICdv
cGVuQ3Vyc29yJyBvZiB1bmRlZmluZWQKK2xldmVsZGJDaGVja1BsYWluT2xkU3RvcmVDdXJzb3JO
ZXh0KCk6CitQQVNTIGN1cnNvci52YWx1ZS5uYW1lID09ICdHZW9yZ2UnIGlzIHRydWUKK2xldmVs
ZGJDaGVja1BsYWluT2xkU3RvcmVDdXJzb3JOZXh0KCk6CitsZXZlbGRiQ2hlY2tTdG9yZVdpdGhL
ZXlQYXRoKCk6CitzdG9yZSA9IHRyYW5zLm9iamVjdFN0b3JlKCdNaWdyYXRpb25TdG9yZVdpdGhL
ZXlQYXRoJykKK2xldmVsZGJDaGVja1N0b3JlV2l0aEtleVBhdGhDdXJzb3JOZXh0KCk6CitQQVNT
ICgod2luZG93LmluZGV4ID0gd2luZG93LnN0b3JlLmluZGV4KCdFeGFtcGxlSW5kZXgnKSkgIT0g
dW5kZWZpbmVkKSBpcyB0cnVlCitQQVNTICh3aW5kb3cua2V5SW5kZXhDdXJzb3Iua2V5ID09IDMp
IGlzIHRydWUKK1BBU1MgY3Vyc29yLnZhbHVlLm5hbWUgPT0gJ1Rob21hcycgaXMgdHJ1ZQorUEFT
UyBjdXJzb3IudmFsdWUuaWQgPT0gJzMnIGlzIHRydWUKK2xldmVsZGJDaGVja1N0b3JlV2l0aEtl
eVBhdGhDdXJzb3JOZXh0KCk6CitsZXZlbGRiQ2hlY2tTdG9yZVdpdGhBdXRvSW5jcmVtZW50KCk6
CitzdG9yZSA9IHRyYW5zLm9iamVjdFN0b3JlKCdNaWdyYXRpb25TdG9yZVdpdGhBdXRvSW5jcmVt
ZW50JykKK2xldmVsZGJDaGVja1N0b3JlV2l0aEF1dG9JbmNyZW1lbnRDdXJzb3JOZXh0KCk6CitQ
QVNTIGN1cnNvci52YWx1ZS5uYW1lID09ICdMaW5jb2xuJyBpcyB0cnVlCitQQVNTIGN1cnNvci52
YWx1ZS5udW1iZXIgPT0gJzcwMTInIGlzIHRydWUKK2xldmVsZGJDaGVja1N0b3JlV2l0aEF1dG9J
bmNyZW1lbnRDdXJzb3JOZXh0KCk6CiBQQVNTIHN1Y2Nlc3NmdWxseVBhcnNlZCBpcyB0cnVlCiAK
IFRFU1QgQ09NUExFVEUKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL3N0b3JhZ2UvaW5kZXhlZGRi
L21pZ3JhdGUtYmFzaWNzLmh0bWwgYi9MYXlvdXRUZXN0cy9zdG9yYWdlL2luZGV4ZWRkYi9taWdy
YXRlLWJhc2ljcy5odG1sCmluZGV4IDRhZWIwYTMxMTU4ZjNkNGVjMWU0NjYyM2QwMTg0NTAyYzk4
ZTA4OGMuLjA3NmUwNjI1N2RhMjhjNjNjMjE5NzI3NmIxZDk5NGJkZTk3YWMyM2EgMTAwNjQ0Ci0t
LSBhL0xheW91dFRlc3RzL3N0b3JhZ2UvaW5kZXhlZGRiL21pZ3JhdGUtYmFzaWNzLmh0bWwKKysr
IGIvTGF5b3V0VGVzdHMvc3RvcmFnZS9pbmRleGVkZGIvbWlncmF0ZS1iYXNpY3MuaHRtbApAQCAt
NDUsNyArNDUsNiBAQCBmdW5jdGlvbiBzcWxpdGVTZXRWZXJzaW9uU3VjY2VzcygpCiAgICAgd2lu
ZG93LnRyYW5zID0gZXZhbEFuZExvZygidHJhbnMgPSBkYi50cmFuc2FjdGlvbihbXSwgd2Via2l0
SURCVHJhbnNhY3Rpb24uUkVBRF9XUklURSkiKTsKICAgICB3aW5kb3cuaW5kZXggPSBldmFsQW5k
TG9nKCJpbmRleCA9IHN0b3JlLmNyZWF0ZUluZGV4KCdFeGFtcGxlSW5kZXgnLCdpZCcsIGZhbHNl
KSIpOwogCi0KICAgICBzcWxpdGVUZXN0QWRkUmVjb3JkczEoKTsKIH0KIApAQCAtMTUxLDYgKzE1
MCwxNiBAQCBmdW5jdGlvbiBsZXZlbGRiQ2hlY2tTdG9yZVdpdGhLZXlQYXRoQ3Vyc29yTmV4dCgp
CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICBzaG91bGRCZVRydWUoIigod2luZG93Lmlu
ZGV4ID0gd2luZG93LnN0b3JlLmluZGV4KCdFeGFtcGxlSW5kZXgnKSkgIT0gdW5kZWZpbmVkKSIp
OworICAgIG9wZW5LZXlDdXJzb3IgPSB3aW5kb3cuaW5kZXgub3BlbktleUN1cnNvcigpOworICAg
IG9wZW5LZXlDdXJzb3Iub25zdWNjZXNzID0gbGV2ZWxkYkNoZWNrU3RvcmVXaXRoS2V5UGF0aEN1
cnNvck5leHQyOworICAgIG9wZW5LZXlDdXJzb3Iub25lcnJvciA9IHVuZXhwZWN0ZWRFcnJvckNh
bGxiYWNrOworfQorCitmdW5jdGlvbiBsZXZlbGRiQ2hlY2tTdG9yZVdpdGhLZXlQYXRoQ3Vyc29y
TmV4dDIoKQoreworICAgIHdpbmRvdy5rZXlJbmRleEN1cnNvciA9IGV2ZW50LnRhcmdldC5yZXN1
bHQ7CisgICAgc2hvdWxkQmVUcnVlKCIod2luZG93LmtleUluZGV4Q3Vyc29yLmtleSA9PSAzKSIp
OwogICAgIHNob3VsZEJlVHJ1ZSgiY3Vyc29yLnZhbHVlLm5hbWUgPT0gJ1Rob21hcyciKTsKICAg
ICBzaG91bGRCZVRydWUoImN1cnNvci52YWx1ZS5pZCA9PSAnMyciKTsKICAgICBjdXJzb3IuY29u
dGludWUoKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9X
ZWJDb3JlL0NoYW5nZUxvZwppbmRleCAwN2YyNGQ1ZTg5MzkzMmQ1YTQ1MjEzMTU4OGFmNDk3ODk0
ZDAxYWMyLi42ZjNlNjg1NTRhZDMyOGUzZWU1NzEzODIzZThkNGY2YzAwMDcxZTlhIDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCkBAIC0xLDMgKzEsMjYgQEAKKzIwMTEtMDYtMjcgIEdyZWcgU2ltb24gIDxncmVnc2ltb25A
Y2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIE1pZ3JhdGUgU1FMaXRlIGJhY2tpbmcgc3RvcmUgdG8gTGV2ZWxEQiBiYWNraW5nIHN0
b3JlIGZvciBJbmRleGVkZGIuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD02Mjc4MAorCisgICAgICAgICogc3RvcmFnZS9JREJGYWN0b3J5QmFja2VuZElt
cGwuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Y29tcHV0ZUZpbGVJZGVudGlmaWVyKToKKyAgICAg
ICAgKFdlYkNvcmU6OmNvbXB1dGVVbmlxdWVJZGVudGlmaWVyKToKKyAgICAgICAgKFdlYkNvcmU6
OklEQkZhY3RvcnlCYWNrZW5kSW1wbDo6b3Blbik6CisgICAgICAgIChXZWJDb3JlOjptaWdyYXRl
T2JqZWN0U3RvcmVzKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkZhY3RvcnlCYWNrZW5kSW1wbDo6
bWlncmF0ZUZyb21TUUxpdGVUb0xldmVsREIpOgorICAgICAgICAqIHN0b3JhZ2UvSURCTGV2ZWxE
QkJhY2tpbmdTdG9yZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQmFja2luZ1N0
b3JlOjpiYWNraW5nU3RvcmVFeGlzdHMpOgorICAgICAgICAqIHN0b3JhZ2UvSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZS5oOgorICAgICAgICAqIHN0b3JhZ2UvSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1w
bC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsOjpwb3B1
bGF0ZUluZGV4KToKKyAgICAgICAgKiBzdG9yYWdlL0lEQk9iamVjdFN0b3JlQmFja2VuZEltcGwu
aDoKKyAgICAgICAgKiBzdG9yYWdlL0lEQlNRTGl0ZUJhY2tpbmdTdG9yZS5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpJREJTUUxpdGVCYWNraW5nU3RvcmU6OmJhY2tpbmdTdG9yZUV4aXN0cyk6Cisg
ICAgICAgICogc3RvcmFnZS9JREJTUUxpdGVCYWNraW5nU3RvcmUuaDoKKwogMjAxMS0wNi0yNyAg
RGlyayBTY2h1bHplICA8a3JpdEB3ZWJraXQub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IE5p
a29sYXMgWmltbWVybWFubi4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURC
RmFjdG9yeUJhY2tlbmRJbXBsLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCRmFjdG9y
eUJhY2tlbmRJbXBsLmNwcAppbmRleCAwMmM1MDU4N2MyNWI5YWYyOWU0NTI2MzNmYWYxMzJhOTM5
MGIzYjNhLi5jNzlmNTM3YjdkZDI1MzEwYjdkOGVkMGVmODU2NDMzMmQ0ZWFiMDEwIDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkZhY3RvcnlCYWNrZW5kSW1wbC5jcHAKKysr
IGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJGYWN0b3J5QmFja2VuZEltcGwuY3BwCkBAIC0z
Myw2ICszMyw3IEBACiAjaW5jbHVkZSAiSURCRGF0YWJhc2VCYWNrZW5kSW1wbC5oIgogI2luY2x1
ZGUgIklEQkRhdGFiYXNlRXhjZXB0aW9uLmgiCiAjaW5jbHVkZSAiSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZS5oIgorI2luY2x1ZGUgIklEQk9iamVjdFN0b3JlQmFja2VuZEltcGwuaCIKICNpbmNsdWRl
ICJJREJTUUxpdGVCYWNraW5nU3RvcmUuaCIKICNpbmNsdWRlICJJREJUcmFuc2FjdGlvbkNvb3Jk
aW5hdG9yLmgiCiAjaW5jbHVkZSAiU2VjdXJpdHlPcmlnaW4uaCIKQEAgLTQzLDYgKzQ0LDE2IEBA
CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorc3RhdGljIFN0cmluZyBjb21wdXRlRmlsZUlkZW50
aWZpZXIoU2VjdXJpdHlPcmlnaW4qIHNlY3VyaXR5T3JpZ2luLCBJREJGYWN0b3J5QmFja2VuZElu
dGVyZmFjZTo6QmFja2luZ1N0b3JlVHlwZSB0eXBlKQoreworICAgIHJldHVybiBzZWN1cml0eU9y
aWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkgKyBTdHJpbmc6OmZvcm1hdCgiQCVkIiwgdHlwZSk7
Cit9CisKK3N0YXRpYyBTdHJpbmcgY29tcHV0ZVVuaXF1ZUlkZW50aWZpZXIoY29uc3QgU3RyaW5n
JiBuYW1lLCBTZWN1cml0eU9yaWdpbiogc2VjdXJpdHlPcmlnaW4sIElEQkZhY3RvcnlCYWNrZW5k
SW50ZXJmYWNlOjpCYWNraW5nU3RvcmVUeXBlIHR5cGUpCit7CisgICAgcmV0dXJuIGNvbXB1dGVG
aWxlSWRlbnRpZmllcihzZWN1cml0eU9yaWdpbiwgdHlwZSkgKyBuYW1lOworfQorCiBJREJGYWN0
b3J5QmFja2VuZEltcGw6OklEQkZhY3RvcnlCYWNrZW5kSW1wbCgpCiAgICAgOiBtX3RyYW5zYWN0
aW9uQ29vcmRpbmF0b3IoSURCVHJhbnNhY3Rpb25Db29yZGluYXRvcjo6Y3JlYXRlKCkpCiB7CkBA
IC03NSw4ICs4Niw4IEBAIHZvaWQgSURCRmFjdG9yeUJhY2tlbmRJbXBsOjpvcGVuKGNvbnN0IFN0
cmluZyYgbmFtZSwgUGFzc1JlZlB0cjxJREJDYWxsYmFja3M+IGNhCiAgICAgaWYgKGJhY2tpbmdT
dG9yZVR5cGUgPT0gRGVmYXVsdEJhY2tpbmdTdG9yZSkKICAgICAgICAgYmFja2luZ1N0b3JlVHlw
ZSA9IFNRTGl0ZUJhY2tpbmdTdG9yZTsgLy8gRklYTUU6IERlZmF1bHRCYWNraW5nU3RvcmUgaXMg
Y29uZnVzaW5nOyBnZXQgcmlkIG9mIGl0LgogCi0gICAgY29uc3QgU3RyaW5nIGZpbGVJZGVudGlm
aWVyID0gc2VjdXJpdHlPcmlnaW4tPmRhdGFiYXNlSWRlbnRpZmllcigpICsgU3RyaW5nOjpmb3Jt
YXQoIkAlZCIsIHN0YXRpY19jYXN0PGludD4oYmFja2luZ1N0b3JlVHlwZSkpOwotICAgIGNvbnN0
IFN0cmluZyB1bmlxdWVJZGVudGlmaWVyID0gZmlsZUlkZW50aWZpZXIgKyAiQCIgKyBuYW1lOwor
ICAgIGNvbnN0IFN0cmluZyBmaWxlSWRlbnRpZmllciA9IGNvbXB1dGVGaWxlSWRlbnRpZmllcihz
ZWN1cml0eU9yaWdpbi5nZXQoKSwgYmFja2luZ1N0b3JlVHlwZSk7CisgICAgY29uc3QgU3RyaW5n
IHVuaXF1ZUlkZW50aWZpZXIgPSBjb21wdXRlVW5pcXVlSWRlbnRpZmllcihuYW1lLCBzZWN1cml0
eU9yaWdpbi5nZXQoKSwgYmFja2luZ1N0b3JlVHlwZSk7CiAKICAgICBJREJEYXRhYmFzZUJhY2tl
bmRNYXA6Oml0ZXJhdG9yIGl0ID0gbV9kYXRhYmFzZUJhY2tlbmRNYXAuZmluZCh1bmlxdWVJZGVu
dGlmaWVyKTsKICAgICBpZiAoaXQgIT0gbV9kYXRhYmFzZUJhY2tlbmRNYXAuZW5kKCkpIHsKQEAg
LTk0LDcgKzEwNSwxMiBAQCB2b2lkIElEQkZhY3RvcnlCYWNrZW5kSW1wbDo6b3Blbihjb25zdCBT
dHJpbmcmIG5hbWUsIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBjYQogCiAjaWYgRU5BQkxFKExF
VkVMREIpCiAgICAgICAgIGlmIChiYWNraW5nU3RvcmVUeXBlID09IExldmVsREJCYWNraW5nU3Rv
cmUpIHsKLSAgICAgICAgICAgIGNvbnN0IGJvb2wgaGFzU1FMQmFja2luZ1N0b3JlID0gSURCU1FM
aXRlQmFja2luZ1N0b3JlOjpiYWNraW5nU3RvcmVFeGlzdHMoc2VjdXJpdHlPcmlnaW4uZ2V0KCks
IGRhdGFEaXIpOworICAgICAgICAgICAgYm9vbCBoYXNTUUxCYWNraW5nU3RvcmUgPSBJREJTUUxp
dGVCYWNraW5nU3RvcmU6OmJhY2tpbmdTdG9yZUV4aXN0cyhzZWN1cml0eU9yaWdpbi5nZXQoKSwg
bmFtZSwgZGF0YURpcik7CisKKyAgICAgICAgICAgIC8vIExheW91dFRlc3RzOiBTUUxpdGUgYmFj
a2luZyBzdG9yZSBtYXkgbm90IGV4aXN0IG9uIGRpc2sgYnV0IG1heSBleGlzdCBpbiBjYWNoZS4K
KyAgICAgICAgICAgIFN0cmluZyBjYWNoZWRTcWxpdGVCYWNraW5nU3RvcmVJZGVudGlmaWVyID0g
Y29tcHV0ZUZpbGVJZGVudGlmaWVyKHNlY3VyaXR5T3JpZ2luLmdldCgpLCBTUUxpdGVCYWNraW5n
U3RvcmUpOworICAgICAgICAgICAgaWYgKCFoYXNTUUxCYWNraW5nU3RvcmUgJiYgKG1fYmFja2lu
Z1N0b3JlTWFwLmVuZCgpICE9IG1fYmFja2luZ1N0b3JlTWFwLmZpbmQoY2FjaGVkU3FsaXRlQmFj
a2luZ1N0b3JlSWRlbnRpZmllcikpKQorICAgICAgICAgICAgICAgIGhhc1NRTEJhY2tpbmdTdG9y
ZSA9IHRydWU7CiAKICAgICAgICAgICAgIGlmIChoYXNTUUxCYWNraW5nU3RvcmUpIHsKICAgICAg
ICAgICAgICAgICBib29sIG1pZ3JhdGlvblN1Y2NlZWRlZCA9IG1pZ3JhdGVGcm9tU1FMaXRlVG9M
ZXZlbERCKG5hbWUsIHNlY3VyaXR5T3JpZ2luLmdldCgpLCBkYXRhRGlyLCBtYXhpbXVtU2l6ZSk7
CkBAIC0xMjAsOSArMTM2LDEyNyBAQCB2b2lkIElEQkZhY3RvcnlCYWNrZW5kSW1wbDo6b3Blbihj
b25zdCBTdHJpbmcmIG5hbWUsIFBhc3NSZWZQdHI8SURCQ2FsbGJhY2tzPiBjYQogICAgIG1fZGF0
YWJhc2VCYWNrZW5kTWFwLnNldCh1bmlxdWVJZGVudGlmaWVyLCBkYXRhYmFzZUJhY2tlbmQuZ2V0
KCkpOwogfQogCisjaWYgRU5BQkxFKExFVkVMREIpCisKK3N0YXRpYyBib29sIG1pZ3JhdGVPYmpl
Y3RTdG9yZXMoUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU+IGZyb21CYWNraW5nU3RvcmUsIGlu
dDY0X3QgZnJvbURhdGFiYXNlSWQsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlPiB0b0JhY2tp
bmdTdG9yZSwgaW50NjRfdCB0b0RhdGFiYXNlSWQpCit7CisgICAgVmVjdG9yPGludDY0X3Q+IGZy
b21PYmpTdG9yZUlkcywgdG9PYmpTdG9yZUlkczsKKyAgICBWZWN0b3I8U3RyaW5nPiBmcm9tT2Jq
U3RvcmVOYW1lcywgdG9PYmpTdG9yZU5hbWVzOworICAgIFZlY3RvcjxTdHJpbmc+IGZyb21LZXlQ
YXRocywgdG9LZXlQYXRoczsKKyAgICBWZWN0b3I8Ym9vbD4gZnJvbUF1dG9JbmNyZW1lbnQsIHRv
QXV0b0luY3JlbWVudDsKKworICAgIC8vIE1pZ3JhdGUgb2JqZWN0U3RvcmVzLiBDaGVjayB0byBz
ZWUgaWYgdGhlIG9iamVjdCBzdG9yZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgdGFyZ2V0LgorICAg
IGZyb21CYWNraW5nU3RvcmUtPmdldE9iamVjdFN0b3Jlcyhmcm9tRGF0YWJhc2VJZCwgZnJvbU9i
alN0b3JlSWRzLCBmcm9tT2JqU3RvcmVOYW1lcywgZnJvbUtleVBhdGhzLCBmcm9tQXV0b0luY3Jl
bWVudCk7CisKKyAgICB0b0JhY2tpbmdTdG9yZS0+Z2V0T2JqZWN0U3RvcmVzKHRvRGF0YWJhc2VJ
ZCwgdG9PYmpTdG9yZUlkcywgdG9PYmpTdG9yZU5hbWVzLCB0b0tleVBhdGhzLCB0b0F1dG9JbmNy
ZW1lbnQpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZyb21PYmpTdG9yZUlkcy5z
aXplKCk7IGkrKykgeworICAgICAgICBpZiAodG9PYmpTdG9yZU5hbWVzLmNvbnRhaW5zKGZyb21P
YmpTdG9yZU5hbWVzW2ldKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGludDY0
X3QgYXNzaWduZWRPYmplY3RTdG9yZUlkID0gLTE7CisKKyAgICAgICAgUmVmUHRyPElEQkJhY2tp
bmdTdG9yZTo6VHJhbnNhY3Rpb24+IHRyYW5zID0gdG9CYWNraW5nU3RvcmUtPmNyZWF0ZVRyYW5z
YWN0aW9uKCk7CisgICAgICAgIHRyYW5zLT5iZWdpbigpOworCisgICAgICAgIGlmICghdG9CYWNr
aW5nU3RvcmUtPmNyZWF0ZU9iamVjdFN0b3JlKHRvRGF0YWJhc2VJZCwgZnJvbU9ialN0b3JlTmFt
ZXNbaV0sIGZyb21LZXlQYXRoc1tpXSwgZnJvbUF1dG9JbmNyZW1lbnRbaV0sIGFzc2lnbmVkT2Jq
ZWN0U3RvcmVJZCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgUmVmUHRy
PElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBjdXJzb3IgPSBmcm9tQmFja2luZ1N0b3JlLT5vcGVu
T2JqZWN0U3RvcmVDdXJzb3IoZnJvbURhdGFiYXNlSWQsIGZyb21PYmpTdG9yZUlkc1tpXSwgMCwg
SURCQ3Vyc29yOjpORVhUKTsKKyAgICAgICAgaWYgKGN1cnNvcikgeworICAgICAgICAgICAgZG8g
eworICAgICAgICAgICAgICAgIFJlZlB0cjxJREJLZXk+IGtleSA9IGN1cnNvci0+a2V5KCk7Cisg
ICAgICAgICAgICAgICAgUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6T2JqZWN0U3RvcmVSZWNvcmRJ
ZGVudGlmaWVyPiByZWNvcmRJZGVudGlmaWVyID0gdG9CYWNraW5nU3RvcmUtPmNyZWF0ZUludmFs
aWRSZWNvcmRJZGVudGlmaWVyKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIXRvQmFja2luZ1N0
b3JlLT5wdXRPYmplY3RTdG9yZVJlY29yZCh0b0RhdGFiYXNlSWQsIGFzc2lnbmVkT2JqZWN0U3Rv
cmVJZCwgKihrZXkuZ2V0KCkpLCBjdXJzb3ItPnZhbHVlKCksIHJlY29yZElkZW50aWZpZXIuZ2V0
KCkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIH0g
d2hpbGUgKGN1cnNvci0+Y29udGludWVGdW5jdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAg
IC8vIFBvcHVsYXRlIGFueS9hbGwgaW5kZXhlcyBmb3IgdGhpcyBvYmplY3RzdG9yZS4KKyAgICAg
ICAgVmVjdG9yPGludDY0X3Q+IGlkeElkczsKKyAgICAgICAgVmVjdG9yPFN0cmluZz4gaWR4TmFt
ZXM7CisgICAgICAgIFZlY3RvcjxTdHJpbmc+IGlkeEtleVBhdGhzOworICAgICAgICBWZWN0b3I8
Ym9vbD4gaWR4VW5pcXVlOworICAgICAgICBmcm9tQmFja2luZ1N0b3JlLT5nZXRJbmRleGVzKGZy
b21EYXRhYmFzZUlkLCBmcm9tT2JqU3RvcmVJZHNbaV0sIGlkeElkcywgaWR4TmFtZXMsIGlkeEtl
eVBhdGhzLCBpZHhVbmlxdWUpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgaWR4
SWRzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICBpbnQ2NF90IGluZGV4SWQgPSAtMTsKKwor
ICAgICAgICAgICAgaWYgKCF0b0JhY2tpbmdTdG9yZS0+Y3JlYXRlSW5kZXgodG9EYXRhYmFzZUlk
LCBhc3NpZ25lZE9iamVjdFN0b3JlSWQsIGlkeE5hbWVzW2pdLCBpZHhLZXlQYXRoc1tqXSwgaWR4
VW5pcXVlW2pdLCBpbmRleElkKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICAgICAgICAgIGlmICghSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbDo6cG9wdWxhdGVJbmRleCgq
dG9CYWNraW5nU3RvcmUsIHRvRGF0YWJhc2VJZCwgYXNzaWduZWRPYmplY3RTdG9yZUlkLCBpbmRl
eElkLCBmcm9tS2V5UGF0aHNbaV0pKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgfQorCisgICAgICAgIHRyYW5zLT5jb21taXQoKTsKKyAgICB9CisKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKyNlbmRpZiAvLyAjaWYgRU5BQkxFKExFVkVMREIpCisKIGJvb2wgSURCRmFjdG9y
eUJhY2tlbmRJbXBsOjptaWdyYXRlRnJvbVNRTGl0ZVRvTGV2ZWxEQihjb25zdCBTdHJpbmcmIG5h
bWUsIFNlY3VyaXR5T3JpZ2luKiBzZWN1cml0eU9yaWdpbiwgY29uc3QgU3RyaW5nJiBkYXRhRGly
LCBpbnQ2NF90IG1heGltdW1TaXplKQogewotICAgIHJldHVybiBmYWxzZTsgLy8gRklYTUU6IFRv
IGJlIGltcGxlbWVudGVkLgorI2lmIEVOQUJMRShMRVZFTERCKQorICAgIFN0cmluZyBmcm9tVW5p
cXVlSWRlbnRpZmllciA9IGNvbXB1dGVVbmlxdWVJZGVudGlmaWVyKG5hbWUsIHNlY3VyaXR5T3Jp
Z2luLCBTUUxpdGVCYWNraW5nU3RvcmUpOworICAgIFN0cmluZyBmcm9tRmlsZUlkZW50aWZpZXIg
PSBjb21wdXRlRmlsZUlkZW50aWZpZXIoc2VjdXJpdHlPcmlnaW4sIFNRTGl0ZUJhY2tpbmdTdG9y
ZSk7CisgICAgU3RyaW5nIHRvVW5pcXVlSWRlbnRpZmllciA9IGNvbXB1dGVVbmlxdWVJZGVudGlm
aWVyKG5hbWUsIHNlY3VyaXR5T3JpZ2luLCBMZXZlbERCQmFja2luZ1N0b3JlKTsKKyAgICBTdHJp
bmcgdG9GaWxlSWRlbnRpZmllciA9IGNvbXB1dGVGaWxlSWRlbnRpZmllcihzZWN1cml0eU9yaWdp
biwgTGV2ZWxEQkJhY2tpbmdTdG9yZSk7CisgICAgUmVmUHRyPElEQlRyYW5zYWN0aW9uQ29vcmRp
bmF0b3I+IHRyYW5zYWN0aW9uQ29vcmRpbmF0b3IgPSBJREJUcmFuc2FjdGlvbkNvb3JkaW5hdG9y
OjpjcmVhdGUoKTsKKyAgICBSZWZQdHI8SURCQmFja2luZ1N0b3JlPiBmcm9tQmFja2luZ1N0b3Jl
OworICAgIFJlZlB0cjxJREJEYXRhYmFzZUJhY2tlbmRJbXBsPiBmcm9tRGF0YWJhc2VCYWNrZW5k
OworICAgIFJlZlB0cjxJREJCYWNraW5nU3RvcmU+IHRvQmFja2luZ1N0b3JlOworCisKKyAgICAv
LyBPcGVuICJGcm9tIiBiYWNraW5nIHN0b3JlIGFuZCBiYWNrZW5kLiBXaGVuIHJ1bm5pbmcgTGF5
b3V0VGVzdHMsIHRoZQorICAgIC8vICJmcm9tIiBkYXRhYmFzZSBtYXkgYmUgY2FjaGVkIGluIHRo
aXMgY2xhc3MgaW5zdGFuY2UsIHNvIGxvb2sgZm9yIGl0IHRoZXJlIGZpcnN0LgorICAgIElEQkJh
Y2tpbmdTdG9yZU1hcDo6aXRlcmF0b3IgaXQgPSBtX2JhY2tpbmdTdG9yZU1hcC5maW5kKGZyb21G
aWxlSWRlbnRpZmllcik7CisgICAgaWYgKGl0ICE9IG1fYmFja2luZ1N0b3JlTWFwLmVuZCgpKQor
ICAgICAgICBmcm9tQmFja2luZ1N0b3JlID0gaXQtPnNlY29uZDsKKyAgICBlbHNlCisgICAgICAg
IGZyb21CYWNraW5nU3RvcmUgPSBJREJTUUxpdGVCYWNraW5nU3RvcmU6Om9wZW4oc2VjdXJpdHlP
cmlnaW4sIGRhdGFEaXIsIG1heGltdW1TaXplLCBmcm9tRmlsZUlkZW50aWZpZXIsIHRoaXMpOwor
CisgICAgaWYgKCFmcm9tQmFja2luZ1N0b3JlKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBJREJEYXRhYmFzZUJhY2tlbmRNYXA6Oml0ZXJhdG9yIGl0MiA9IG1fZGF0YWJhc2VCYWNrZW5k
TWFwLmZpbmQoZnJvbVVuaXF1ZUlkZW50aWZpZXIpOworICAgIGlmIChpdDIgIT0gbV9kYXRhYmFz
ZUJhY2tlbmRNYXAuZW5kKCkpCisgICAgICAgIGZyb21EYXRhYmFzZUJhY2tlbmQgPSBpdDItPnNl
Y29uZDsKKyAgICBlbHNlIHsKKyAgICAgICAgZnJvbURhdGFiYXNlQmFja2VuZCA9IElEQkRhdGFi
YXNlQmFja2VuZEltcGw6OmNyZWF0ZShuYW1lLCBmcm9tQmFja2luZ1N0b3JlLmdldCgpLCB0cmFu
c2FjdGlvbkNvb3JkaW5hdG9yLmdldCgpLCB0aGlzLCBmcm9tVW5pcXVlSWRlbnRpZmllcik7Cisg
ICAgICAgIG1fZGF0YWJhc2VCYWNrZW5kTWFwLnNldChmcm9tVW5pcXVlSWRlbnRpZmllciwgZnJv
bURhdGFiYXNlQmFja2VuZC5nZXQoKSk7CisgICAgfQorCisgICAgaWYgKCFmcm9tRGF0YWJhc2VC
YWNrZW5kKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBPcGVuICJUbyIgZGF0YWJh
c2UuIEZpcnN0IGZpbmQgb3V0IGlmIGl0IGFscmVhZHkgZXhpc3RzIC0tIHRoaXMgd2lsbCBkZXRl
cm1pbmUgaWYKKyAgICAvLyBpdCBpcyBzYWZlIHRvIGNhbGwgSURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZTo6ZXh0cmFjdElEQkRhdGFiYXNlTWV0YURhdGEuCisgICAgaXQgPSBtX2JhY2tpbmdTdG9yZU1h
cC5maW5kKHRvRmlsZUlkZW50aWZpZXIpOworICAgIGlmIChpdCAhPSBtX2JhY2tpbmdTdG9yZU1h
cC5lbmQoKSkKKyAgICAgICAgdG9CYWNraW5nU3RvcmUgPSBpdC0+c2Vjb25kOworICAgIGVsc2UK
KyAgICAgICAgdG9CYWNraW5nU3RvcmUgPSBJREJMZXZlbERCQmFja2luZ1N0b3JlOjpvcGVuKHNl
Y3VyaXR5T3JpZ2luLCBkYXRhRGlyLCBtYXhpbXVtU2l6ZSwgdG9GaWxlSWRlbnRpZmllciwgdGhp
cyk7CisKKyAgICBpZiAoIXRvQmFja2luZ1N0b3JlKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KworICAgIFN0cmluZyB0b0RhdGFiYXNlTmFtZSA9IGZyb21EYXRhYmFzZUJhY2tlbmQtPm5hbWUo
KTsKKyAgICBTdHJpbmcgdG9EYXRhYmFzZVZlcnNpb24gPSBmcm9tRGF0YWJhc2VCYWNrZW5kLT52
ZXJzaW9uKCk7CisgICAgaW50NjRfdCB0b0RhdGFiYXNlSWQgPSAtMTsKKworICAgIGlmICghdG9C
YWNraW5nU3RvcmUtPmV4dHJhY3RJREJEYXRhYmFzZU1ldGFEYXRhKHRvRGF0YWJhc2VOYW1lLCB0
b0RhdGFiYXNlVmVyc2lvbiwgdG9EYXRhYmFzZUlkKSkgeworICAgICAgICBpZiAoIXRvQmFja2lu
Z1N0b3JlLT5zZXRJREJEYXRhYmFzZU1ldGFEYXRhKHRvRGF0YWJhc2VOYW1lLCB0b0RhdGFiYXNl
VmVyc2lvbiwgdG9EYXRhYmFzZUlkLCB0cnVlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICB9CisKKyAgICByZXR1cm4gbWlncmF0ZU9iamVjdFN0b3Jlcyhmcm9tQmFja2luZ1N0b3Jl
LCBmcm9tRGF0YWJhc2VCYWNrZW5kLT5pZCgpLCB0b0JhY2tpbmdTdG9yZSwgdG9EYXRhYmFzZUlk
KTsKKworI2VuZGlmIC8vIEVOQUJMRShMRVZFTERCKQorICAgIHJldHVybiBmYWxzZTsKIH0KIAog
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvc3RvcmFn
ZS9JREJMZXZlbERCQmFja2luZ1N0b3JlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURC
TGV2ZWxEQkJhY2tpbmdTdG9yZS5jcHAKaW5kZXggMjZiOTk2NWMzYzYzM2Y0OWQxZTM1OTM1YWY4
YjcyMjhmOTYwNjQ5ZC4uZTIwYWYxZWEzNWQyMGE5MmFjN2RjM2JkNzgzNTk5Mzk4NjRjMTIxMCAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJMZXZlbERCQmFja2luZ1N0b3Jl
LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUu
Y3BwCkBAIC0xMzA0LDcgKzEzMDQsNyBAQCB2b2lkIElEQkxldmVsREJCYWNraW5nU3RvcmU6OlRy
YW5zYWN0aW9uOjpyb2xsYmFjaygpCiAgICAgbV9iYWNraW5nU3RvcmUtPm1fY3VycmVudFRyYW5z
YWN0aW9uLmNsZWFyKCk7CiB9CiAKLWJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6YmFja2lu
Z1N0b3JlRXhpc3RzKFNlY3VyaXR5T3JpZ2luKiBzZWN1cml0eU9yaWdpbiwgY29uc3QgU3RyaW5n
JiBwYXRoQmFzZUFyZykKK2Jvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZTo6YmFja2luZ1N0b3Jl
RXhpc3RzKFNlY3VyaXR5T3JpZ2luKiBzZWN1cml0eU9yaWdpbiwgY29uc3QgU3RyaW5nJiwgY29u
c3QgU3RyaW5nJiBwYXRoQmFzZUFyZykKIHsKICAgICBTdHJpbmcgcGF0aEJhc2UgPSBwYXRoQmFz
ZUFyZzsKIApAQCAtMTMxNCwxMSArMTMxNCw4IEBAIGJvb2wgSURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZTo6YmFja2luZ1N0b3JlRXhpc3RzKFNlY3VyaXR5T3JpZ2luKiBzZWN1cml0eU9yaWdpbiwKICAg
ICAvLyBGSVhNRTogV2Ugc2hvdWxkIGV2ZW50dWFsbHkgdXNlIHRoZSBzYW1lIExldmVsREIgZGF0
YWJhc2UgZm9yIGFsbCBvcmlnaW5zLgogICAgIFN0cmluZyBwYXRoID0gcGF0aEJ5QXBwZW5kaW5n
Q29tcG9uZW50KHBhdGhCYXNlLCBzZWN1cml0eU9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkg
KyAiLmluZGV4ZWRkYi5sZXZlbGRiIik7CiAKLSAgICAvLyBGSVhNRTogSXQgd291bGQgYmUgbW9y
ZSB0aG9yb3VnaCB0byBvcGVuIHRoZSBkYXRhYmFzZSBoZXJlIGJ1dCBhbHNvIG1vcmUgZXhwZW5z
aXZlLgotICAgIGlmIChmaWxlRXhpc3RzKHBhdGgrIi9DVVJSRU5UIikpCi0gICAgICAgIHJldHVy
biB0cnVlOwotCi0gICAgcmV0dXJuIGZhbHNlOworICAgIC8vIEZJWE1FOiB0aGlzIGlzIGNoZWNr
aW5nIGZvciBwcmVzZW5jZSBvZiB0aGUgZG9tYWluLCBub3QgdGhlIGRhdGFiYXNlIGl0c2VsZgor
ICAgIHJldHVybiBmaWxlRXhpc3RzKHBhdGgrIi9DVVJSRU5UIik7CiB9CiAKIC8vIEZJWE1FOiBk
ZWxldGVEYXRhYmFzZSBzaG91bGQgYmUgcGFydCBvZiBJREJCYWNraW5nU3RvcmUuCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkxldmVsREJCYWNraW5nU3RvcmUuaCBiL1Nv
dXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5oCmluZGV4IDMxOGM0
MjY5YmUyN2EyNzhiZjliMzczZTI0NGE0YjNiMWY3NDcyMzQuLmQyOGE5MGM0YTYyMDZhNjU1ZTQ3
ZGIyNzUxMzEzYTY1NzQ2NmNiODEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2Uv
SURCTGV2ZWxEQkJhY2tpbmdTdG9yZS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURC
TGV2ZWxEQkJhY2tpbmdTdG9yZS5oCkBAIC03Niw3ICs3Niw3IEBAIHB1YmxpYzoKICAgICB2aXJ0
dWFsIFBhc3NSZWZQdHI8VHJhbnNhY3Rpb24+IGNyZWF0ZVRyYW5zYWN0aW9uKCk7CiAgICAgdmly
dHVhbCBJREJGYWN0b3J5QmFja2VuZEludGVyZmFjZTo6QmFja2luZ1N0b3JlVHlwZSBiYWNraW5n
U3RvcmVUeXBlKCkgY29uc3QgeyByZXR1cm4gSURCRmFjdG9yeUJhY2tlbmRJbnRlcmZhY2U6Okxl
dmVsREJCYWNraW5nU3RvcmU7IH0KIAotICAgIHN0YXRpYyBib29sIGJhY2tpbmdTdG9yZUV4aXN0
cyhTZWN1cml0eU9yaWdpbiosIGNvbnN0IFN0cmluZyYgcGF0aEJhc2UpOworICAgIHN0YXRpYyBi
b29sIGJhY2tpbmdTdG9yZUV4aXN0cyhTZWN1cml0eU9yaWdpbiosIGNvbnN0IFN0cmluZyYgbmFt
ZSwgY29uc3QgU3RyaW5nJiBwYXRoQmFzZSk7CiAKIHByaXZhdGU6CiAgICAgSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZShjb25zdCBTdHJpbmcmIGlkZW50aWZpZXIsIElEQkZhY3RvcnlCYWNrZW5kSW1w
bCosIFBhc3NPd25QdHI8TGV2ZWxEQkRhdGFiYXNlPik7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9zdG9yYWdlL0lEQk9iamVjdFN0b3JlQmFja2VuZEltcGwuY3BwIGIvU291cmNlL1dlYkNv
cmUvc3RvcmFnZS9JREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsLmNwcAppbmRleCBhM2NmMDcxZmU1
NWI5ZDRjNzg3OTMyNmJlMDI4MmNmOGI0OWZiNzE0Li5lMDA2NjFjZGZmMDU4OTcyMThlY2UyZmVh
OTBmY2UxNDQwNGYyYmNmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQk9i
amVjdFN0b3JlQmFja2VuZEltcGwuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURC
T2JqZWN0U3RvcmVCYWNrZW5kSW1wbC5jcHAKQEAgLTM3NSw3ICszNzUsNyBAQCBwcml2YXRlOgog
fTsKIH0KIAotc3RhdGljIGJvb2wgcG9wdWxhdGVJbmRleChJREJCYWNraW5nU3RvcmUmIGJhY2tp
bmdTdG9yZSwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0
X3QgaW5kZXhJZCwgY29uc3QgU3RyaW5nJiBpbmRleEtleVBhdGgpCitib29sIElEQk9iamVjdFN0
b3JlQmFja2VuZEltcGw6OnBvcHVsYXRlSW5kZXgoSURCQmFja2luZ1N0b3JlJiBiYWNraW5nU3Rv
cmUsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGlu
ZGV4SWQsIGNvbnN0IFN0cmluZyYgaW5kZXhLZXlQYXRoKQogewogICAgIFBvcHVsYXRlSW5kZXhD
YWxsYmFjayBjYWxsYmFjayhiYWNraW5nU3RvcmUsIGluZGV4S2V5UGF0aCwgZGF0YWJhc2VJZCwg
b2JqZWN0U3RvcmVJZCwgaW5kZXhJZCk7CiAgICAgaWYgKCFiYWNraW5nU3RvcmUuZm9yRWFjaE9i
amVjdFN0b3JlUmVjb3JkKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGNhbGxiYWNrKSkKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1w
bC5oIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsLmgK
aW5kZXggNmJmOTVjZDFmMWU3YTVmODk3Y2NjNWFlMzU4NWM0MDI0YmVkMDEzYS4uNTdkOTMxMzFl
MzY2ZjEyZWJlMjJhMWZlNDA0MzM2YTZkMmIyYzdmNSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNv
cmUvc3RvcmFnZS9JREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsLmgKKysrIGIvU291cmNlL1dlYkNv
cmUvc3RvcmFnZS9JREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsLmgKQEAgLTc3LDYgKzc3LDggQEAg
cHVibGljOgogCiAgICAgdmlydHVhbCB2b2lkIG9wZW5DdXJzb3IoUGFzc1JlZlB0cjxJREJLZXlS
YW5nZT4gcmFuZ2UsIHVuc2lnbmVkIHNob3J0IGRpcmVjdGlvbiwgUGFzc1JlZlB0cjxJREJDYWxs
YmFja3M+LCBJREJUcmFuc2FjdGlvbkJhY2tlbmRJbnRlcmZhY2UqLCBFeGNlcHRpb25Db2RlJik7
CiAKKyAgICBzdGF0aWMgYm9vbCBwb3B1bGF0ZUluZGV4KElEQkJhY2tpbmdTdG9yZSYsIGludDY0
X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNv
bnN0IFN0cmluZyYgaW5kZXhLZXlQYXRoKTsKKwogcHJpdmF0ZToKICAgICBJREJPYmplY3RTdG9y
ZUJhY2tlbmRJbXBsKElEQkJhY2tpbmdTdG9yZSosIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRf
dCBpZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIGtleVBhdGgsIGJvb2wgYXV0
b0luY3JlbWVudCk7CiAgICAgSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbChJREJCYWNraW5nU3Rv
cmUqLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5n
JiBrZXlQYXRoLCBib29sIGF1dG9JbmNyZW1lbnQpOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvc3RvcmFnZS9JREJTUUxpdGVCYWNraW5nU3RvcmUuY3BwIGIvU291cmNlL1dlYkNvcmUvc3Rv
cmFnZS9JREJTUUxpdGVCYWNraW5nU3RvcmUuY3BwCmluZGV4IGEzYzdiZTljNGU4NDE0NDk4MWEw
OTk4OGVjZjY3NTIxOGJmN2QyMTIuLjEzMzYwY2U4YWExMTczNWJjZjk0NjI4Yjc2ZjJmYzJiOWEx
NTlkNDUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCU1FMaXRlQmFja2lu
Z1N0b3JlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQlNRTGl0ZUJhY2tpbmdT
dG9yZS5jcHAKQEAgLTk5MSwxOCArOTkxLDE5IEBAIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3Jl
OjpDdXJzb3I+IElEQlNRTGl0ZUJhY2tpbmdTdG9yZTo6b3BlbkluZGV4Q3Vyc29yKGludDY0CiAg
ICAgcmV0dXJuIGN1cnNvci5yZWxlYXNlKCk7CiB9CiAKLWJvb2wgSURCU1FMaXRlQmFja2luZ1N0
b3JlOjpiYWNraW5nU3RvcmVFeGlzdHMoU2VjdXJpdHlPcmlnaW4qIHNlY3VyaXR5T3JpZ2luLCBj
b25zdCBTdHJpbmcmIHBhdGhCYXNlKQorYm9vbCBJREJTUUxpdGVCYWNraW5nU3RvcmU6OmJhY2tp
bmdTdG9yZUV4aXN0cyhTZWN1cml0eU9yaWdpbiogc2VjdXJpdHlPcmlnaW4sIGNvbnN0IFN0cmlu
ZyYgbmFtZSwgY29uc3QgU3RyaW5nJiBwYXRoQmFzZSkKIHsKICAgICBTdHJpbmcgcGF0aCA9IHBh
dGhCeUFwcGVuZGluZ0NvbXBvbmVudChwYXRoQmFzZSwgc2VjdXJpdHlPcmlnaW4tPmRhdGFiYXNl
SWRlbnRpZmllcigpICsgIi5pbmRleGVkZGIiKTsKLSAgICBpZiAoIWZpbGVFeGlzdHMocGF0aCkp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQogICAgIFNRTGl0ZURhdGFiYXNlIGRiOwogICAgIGlm
ICghZGIub3BlbihwYXRoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgZGIuY2xvc2Uo
KTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICBTUUxpdGVTdGF0ZW1lbnQgZGF0YWJhc2VRdWVyeShk
YiwgIlNFTEVDVCBpZCwgdmVyc2lvbiBGUk9NIERhdGFiYXNlcyBXSEVSRSBuYW1lID0gPyIpOwor
ICAgIGlmIChkYXRhYmFzZVF1ZXJ5LnByZXBhcmUoKSAhPSBTUUxSZXN1bHRPaykKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgZGF0YWJhc2VRdWVyeS5iaW5kVGV4dCgxLCBuYW1lKTsKKyAg
ICByZXR1cm4gKGRhdGFiYXNlUXVlcnkuc3RlcCgpID09IFNRTFJlc3VsdFJvdyk7CiB9CiAKIG5h
bWVzcGFjZSB7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQlNRTGl0ZUJh
Y2tpbmdTdG9yZS5oIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJTUUxpdGVCYWNraW5nU3Rv
cmUuaAppbmRleCA1M2M5Mjc5MWZkMmY2ZDM0MzBiZWNjZjM4ODY1OWYyZmExMWI4MDNmLi5lNDc2
ZTZkMDFmMTg4YTU0ZTdkODQxN2Y3YmE2ZWQ3ZTI4Yzc1MDUzIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9zdG9yYWdlL0lEQlNRTGl0ZUJhY2tpbmdTdG9yZS5oCisrKyBiL1NvdXJjZS9XZWJD
b3JlL3N0b3JhZ2UvSURCU1FMaXRlQmFja2luZ1N0b3JlLmgKQEAgLTcxLDcgKzcxLDcgQEAgcHVi
bGljOgogICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxUcmFuc2FjdGlvbj4gY3JlYXRlVHJhbnNhY3Rp
b24oKTsKICAgICB2aXJ0dWFsIElEQkZhY3RvcnlCYWNrZW5kSW50ZXJmYWNlOjpCYWNraW5nU3Rv
cmVUeXBlIGJhY2tpbmdTdG9yZVR5cGUoKSBjb25zdCB7IHJldHVybiBJREJGYWN0b3J5QmFja2Vu
ZEludGVyZmFjZTo6U1FMaXRlQmFja2luZ1N0b3JlOyB9CiAKLSAgICBzdGF0aWMgYm9vbCBiYWNr
aW5nU3RvcmVFeGlzdHMoU2VjdXJpdHlPcmlnaW4qLCBjb25zdCBTdHJpbmcmIHBhdGhCYXNlKTsK
KyAgICBzdGF0aWMgYm9vbCBiYWNraW5nU3RvcmVFeGlzdHMoU2VjdXJpdHlPcmlnaW4qLCBjb25z
dCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgcGF0aEJhc2UpOwogCiBwcml2YXRlOgogICAg
IElEQlNRTGl0ZUJhY2tpbmdTdG9yZShjb25zdCBTdHJpbmcmIGlkZW50aWZpZXIsIElEQkZhY3Rv
cnlCYWNrZW5kSW1wbCopOwo=
</data>

          </attachment>
      

    </bug>

</bugzilla>